diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..3dce414 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,9 @@ +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true \ No newline at end of file diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..a6f34fe --- /dev/null +++ b/.eslintignore @@ -0,0 +1,4 @@ +node_modules +dist +out +.gitignore diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..d1e1ab6 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,3 @@ +module.exports = { + extends: ['eslint:recommended', '@electron-toolkit', '@electron-toolkit/eslint-config-prettier'] +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..219c027 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +node_modules +dist +build +data +out +.vscode +*.log* diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..9c6b791 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,6 @@ +out +dist +pnpm-lock.yaml +LICENSE.md +tsconfig.json +tsconfig.*.json diff --git a/.prettierrc.yaml b/.prettierrc.yaml new file mode 100644 index 0000000..35893b3 --- /dev/null +++ b/.prettierrc.yaml @@ -0,0 +1,4 @@ +singleQuote: true +semi: false +printWidth: 100 +trailingComma: none diff --git a/README.md b/README.md new file mode 100644 index 0000000..2cb1bb8 --- /dev/null +++ b/README.md @@ -0,0 +1,34 @@ +# pacsnode + +A minimal Electron application + +## Recommended IDE Setup + +- [VSCode](https://code.visualstudio.com/) + [ESLint](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint) + [Prettier](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode) + +## Project Setup + +### Install + +```bash +$ npm install +``` + +### Development + +```bash +$ npm run dev +``` + +### Build + +```bash +# For windows +$ npm run build:win + +# For macOS +$ npm run build:mac + +# For Linux +$ npm run build:linux +``` diff --git a/electron-builder.yml b/electron-builder.yml new file mode 100644 index 0000000..c9716aa --- /dev/null +++ b/electron-builder.yml @@ -0,0 +1,39 @@ +appId: com.electron.app +productName: pacsnode +directories: + buildResources: build +files: + - '!**/.vscode/*' + - '!{.eslintignore,.eslintrc.js,.prettierignore,.prettierrc.yaml,dev-app-update.yml,CHANGELOG.md,README.md}' +asarUnpack: + - resources/** +win: + executableName: pacsnode +nsis: + artifactName: ${name}-${version}-setup.${ext} + shortcutName: ${productName} + uninstallDisplayName: ${productName} + createDesktopShortcut: always +mac: + entitlementsInherit: build/entitlements.mac.plist + extendInfo: + - NSCameraUsageDescription: Application requests access to the device's camera. + - NSMicrophoneUsageDescription: Application requests access to the device's microphone. + - NSDocumentsFolderUsageDescription: Application requests access to the user's Documents folder. + - NSDownloadsFolderUsageDescription: Application requests access to the user's Downloads folder. + notarize: false +dmg: + artifactName: ${name}-${version}.${ext} +linux: + target: + - AppImage + - snap + - deb + maintainer: electronjs.org + category: Utility +appImage: + artifactName: ${name}-${version}.${ext} +npmRebuild: false +publish: + provider: generic + url: https://example.com/auto-updates diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..8c1bb1a --- /dev/null +++ b/package-lock.json @@ -0,0 +1,10115 @@ +{ + "name": "pacsnode", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "pacsnode", + "version": "1.0.0", + "hasInstallScript": true, + "dependencies": { + "@electron-toolkit/preload": "^2.0.0", + "@electron-toolkit/utils": "^2.0.0", + "@fastify/autoload": "^5.8.0", + "@fastify/cors": "^8.4.1", + "@fastify/helmet": "^11.1.1", + "@fastify/sensible": "^5.5.0", + "@fastify/static": "^6.12.0", + "@iwharris/dicom-data-dictionary": "^1.26.0", + "dicom-data-dictionary": "^0.3.1", + "dicom-dimse-native": "^2.4.2", + "dicom-parser": "^1.8.21", + "electron-log": "^5.0.1", + "electron-server": "^0.2.0", + "fastify": "^4.25.1", + "fs-walk": "^0.0.2", + "shelljs": "^0.8.5" + }, + "devDependencies": { + "@electron-toolkit/eslint-config": "^1.0.1", + "@electron-toolkit/eslint-config-prettier": "^1.0.1", + "electron": "^25.6.0", + "electron-builder": "^24.6.3", + "eslint": "^8.47.0", + "prettier": "^3.0.2" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@develar/schema-utils": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/@develar/schema-utils/-/schema-utils-2.6.5.tgz", + "integrity": "sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==", + "dev": true, + "dependencies": { + "ajv": "^6.12.0", + "ajv-keywords": "^3.4.1" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/@electron-toolkit/eslint-config": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@electron-toolkit/eslint-config/-/eslint-config-1.0.2.tgz", + "integrity": "sha512-GJVuMsxBHfVARfmUoSTCHT0e/QfWlVbXcGk3tgoku0ad6tLjydbv2LpvKi02+Sy2WiEz9L9SkGSw090ukT/F0A==", + "dev": true, + "peerDependencies": { + "eslint": ">= 8.0.0" + } + }, + "node_modules/@electron-toolkit/eslint-config-prettier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@electron-toolkit/eslint-config-prettier/-/eslint-config-prettier-1.0.1.tgz", + "integrity": "sha512-JERUehgy64/J369nr4AVmCskYAX8DQg8eWkQAHk56Qfh6JGnoiZVsv4nDJLBOdG7M7HKrHiqDgaAEXPOCMiijg==", + "dev": true, + "dependencies": { + "eslint-config-prettier": "^8.8.0", + "eslint-plugin-prettier": "^5.0.0" + }, + "peerDependencies": { + "eslint": ">= 8.0.0", + "prettier": ">= 3.0.0" + } + }, + "node_modules/@electron-toolkit/preload": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@electron-toolkit/preload/-/preload-2.0.0.tgz", + "integrity": "sha512-zpZDzbqJTZQC5d4LRs2EKruKWnqah+T75s+niBYFemYLtiW5TTZcWi3Q8UxHqnwTudDMuWJb233aaS2yjx3Xiw==", + "peerDependencies": { + "electron": ">=13.0.0" + } + }, + "node_modules/@electron-toolkit/utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@electron-toolkit/utils/-/utils-2.0.1.tgz", + "integrity": "sha512-3nnjd3D1NIjxdzNrvR5fkJ3kbJNbRkpHppv0/pSbMX6I0DaBzpPXeSfDYuJJKzZrAc3CmGcJa0MU4+AjEOlT4g==", + "peerDependencies": { + "electron": ">=13.0.0" + } + }, + "node_modules/@electron/asar": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.8.tgz", + "integrity": "sha512-cmskk5M06ewHMZAplSiF4AlME3IrnnZhKnWbtwKVLRkdJkKyUVjMLhDIiPIx/+6zQWVlKX/LtmK9xDme7540Sg==", + "dev": true, + "dependencies": { + "commander": "^5.0.0", + "glob": "^7.1.6", + "minimatch": "^3.0.4" + }, + "bin": { + "asar": "bin/asar.js" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/@electron/asar/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@electron/asar/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@electron/get": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.3.tgz", + "integrity": "sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==", + "dependencies": { + "debug": "^4.1.1", + "env-paths": "^2.2.0", + "fs-extra": "^8.1.0", + "got": "^11.8.5", + "progress": "^2.0.3", + "semver": "^6.2.0", + "sumchecker": "^3.0.1" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "global-agent": "^3.0.0" + } + }, + "node_modules/@electron/notarize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.1.0.tgz", + "integrity": "sha512-Q02xem1D0sg4v437xHgmBLxI2iz/fc0D4K7fiVWHa/AnW8o7D751xyKNXgziA6HrTOme9ul1JfWN5ark8WH1xA==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "fs-extra": "^9.0.1", + "promise-retry": "^2.0.1" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/notarize/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@electron/notarize/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/notarize/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/osx-sign": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.0.5.tgz", + "integrity": "sha512-k9ZzUQtamSoweGQDV2jILiRIHUu7lYlJ3c6IEmjv1hC17rclE+eb9U+f6UFlOOETo0JzY1HNlXy4YOlCvl+Lww==", + "dev": true, + "dependencies": { + "compare-version": "^0.1.2", + "debug": "^4.3.4", + "fs-extra": "^10.0.0", + "isbinaryfile": "^4.0.8", + "minimist": "^1.2.6", + "plist": "^3.0.5" + }, + "bin": { + "electron-osx-flat": "bin/electron-osx-flat.js", + "electron-osx-sign": "bin/electron-osx-sign.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@electron/osx-sign/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@electron/osx-sign/node_modules/isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "dev": true, + "engines": { + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/@electron/osx-sign/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/osx-sign/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/universal": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.4.1.tgz", + "integrity": "sha512-lE/U3UNw1YHuowNbTmKNs9UlS3En3cPgwM5MI+agIgr/B1hSze9NdOP0qn7boZaI9Lph8IDv3/24g9IxnJP7aQ==", + "dev": true, + "dependencies": { + "@electron/asar": "^3.2.1", + "@malept/cross-spawn-promise": "^1.1.0", + "debug": "^4.3.1", + "dir-compare": "^3.0.0", + "fs-extra": "^9.0.1", + "minimatch": "^3.0.4", + "plist": "^3.0.4" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/@electron/universal/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@electron/universal/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@electron/universal/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/universal/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@electron/universal/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", + "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@fastify/accept-negotiator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@fastify/accept-negotiator/-/accept-negotiator-1.1.0.tgz", + "integrity": "sha512-OIHZrb2ImZ7XG85HXOONLcJWGosv7sIvM2ifAPQVhg9Lv7qdmMBNVaai4QTdyuaqbKM5eO6sLSQOYI7wEQeCJQ==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@fastify/ajv-compiler": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@fastify/ajv-compiler/-/ajv-compiler-3.5.0.tgz", + "integrity": "sha512-ebbEtlI7dxXF5ziNdr05mOY8NnDiPB1XvAlLHctRt/Rc+C3LCOVW5imUVX+mhvUhnNzmPBHewUkOFgGlCxgdAA==", + "dependencies": { + "ajv": "^8.11.0", + "ajv-formats": "^2.1.1", + "fast-uri": "^2.0.0" + } + }, + "node_modules/@fastify/ajv-compiler/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@fastify/ajv-compiler/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/@fastify/autoload": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@fastify/autoload/-/autoload-5.8.0.tgz", + "integrity": "sha512-bF86vl+1Kk91S41WIL9NrKhcugGQg/cQ959aTaombkCjA+9YAbgVCKKu2lRqtMsosDZ0CNRfVnaLYoHQIDUI2A==" + }, + "node_modules/@fastify/cors": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@fastify/cors/-/cors-8.5.0.tgz", + "integrity": "sha512-/oZ1QSb02XjP0IK1U0IXktEsw/dUBTxJOW7IpIeO8c/tNalw/KjoNSJv1Sf6eqoBPO+TDGkifq6ynFK3v68HFQ==", + "dependencies": { + "fastify-plugin": "^4.0.0", + "mnemonist": "0.39.6" + } + }, + "node_modules/@fastify/deepmerge": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@fastify/deepmerge/-/deepmerge-1.3.0.tgz", + "integrity": "sha512-J8TOSBq3SoZbDhM9+R/u77hP93gz/rajSA+K2kGyijPpORPWUXHUpTaleoj+92As0S9uPRP7Oi8IqMf0u+ro6A==" + }, + "node_modules/@fastify/error": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@fastify/error/-/error-3.4.1.tgz", + "integrity": "sha512-wWSvph+29GR783IhmvdwWnN4bUxTD01Vm5Xad4i7i1VuAOItLvbPAb69sb0IQ2N57yprvhNIwAP5B6xfKTmjmQ==" + }, + "node_modules/@fastify/fast-json-stringify-compiler": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-4.3.0.tgz", + "integrity": "sha512-aZAXGYo6m22Fk1zZzEUKBvut/CIIQe/BapEORnxiD5Qr0kPHqqI69NtEMCme74h+at72sPhbkb4ZrLd1W3KRLA==", + "dependencies": { + "fast-json-stringify": "^5.7.0" + } + }, + "node_modules/@fastify/helmet": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/@fastify/helmet/-/helmet-11.1.1.tgz", + "integrity": "sha512-pjJxjk6SLEimITWadtYIXt6wBMfFC1I6OQyH/jYVCqSAn36sgAIFjeNiibHtifjCd+e25442pObis3Rjtame6A==", + "dependencies": { + "fastify-plugin": "^4.2.1", + "helmet": "^7.0.0" + } + }, + "node_modules/@fastify/send": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@fastify/send/-/send-2.1.0.tgz", + "integrity": "sha512-yNYiY6sDkexoJR0D8IDy3aRP3+L4wdqCpvx5WP+VtEU58sn7USmKynBzDQex5X42Zzvw2gNzzYgP90UfWShLFA==", + "dependencies": { + "@lukeed/ms": "^2.0.1", + "escape-html": "~1.0.3", + "fast-decode-uri-component": "^1.0.1", + "http-errors": "2.0.0", + "mime": "^3.0.0" + } + }, + "node_modules/@fastify/send/node_modules/mime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@fastify/sensible": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@fastify/sensible/-/sensible-5.5.0.tgz", + "integrity": "sha512-D0zpl+nocsRXLceSbc4gasQaO3ZNQR4dy9Uu8Ym0mh8VUdrjpZ4g8Ca9O3pGXbBVOnPIGHUJNTV7Yf9dg/OYdg==", + "dependencies": { + "@lukeed/ms": "^2.0.1", + "fast-deep-equal": "^3.1.1", + "fastify-plugin": "^4.0.0", + "forwarded": "^0.2.0", + "http-errors": "^2.0.0", + "type-is": "^1.6.18", + "vary": "^1.1.2" + } + }, + "node_modules/@fastify/static": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@fastify/static/-/static-6.12.0.tgz", + "integrity": "sha512-KK1B84E6QD/FcQWxDI2aiUCwHxMJBI1KeCUzm1BwYpPY1b742+jeKruGHP2uOluuM6OkBPI8CIANrXcCRtC2oQ==", + "dependencies": { + "@fastify/accept-negotiator": "^1.0.0", + "@fastify/send": "^2.0.0", + "content-disposition": "^0.5.3", + "fastify-plugin": "^4.0.0", + "glob": "^8.0.1", + "p-limit": "^3.1.0" + } + }, + "node_modules/@fastify/static/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", + "dev": true + }, + "node_modules/@iwharris/dicom-data-dictionary": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@iwharris/dicom-data-dictionary/-/dicom-data-dictionary-1.26.0.tgz", + "integrity": "sha512-+IGx8Wv7xUu6i4eHc7NGUNYSYFjAGoezZyfX8Qy++TxxdcqI/hVVclP/+rJwOEdwgClINEsiPX4sC72UimCkTw==" + }, + "node_modules/@lukeed/ms": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@lukeed/ms/-/ms-2.0.2.tgz", + "integrity": "sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@malept/cross-spawn-promise": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz", + "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/malept" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" + } + ], + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@malept/flatpak-bundler": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz", + "integrity": "sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "fs-extra": "^9.0.0", + "lodash": "^4.17.15", + "tmp-promise": "^3.0.2" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@malept/flatpak-bundler/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@malept/flatpak-bundler/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@malept/flatpak-bundler/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgr/utils": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz", + "integrity": "sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "fast-glob": "^3.3.0", + "is-glob": "^4.0.3", + "open": "^9.1.0", + "picocolors": "^1.0.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dev": true, + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/fs-extra": { + "version": "9.0.13", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", + "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==" + }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", + "dev": true + }, + "node_modules/@types/node": { + "version": "18.19.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.3.tgz", + "integrity": "sha512-k5fggr14DwAytoA/t8rPrIz++lXK7/DqckthCmoZOKNsEbJkId4Z//BqgApXBUGrGddrigYa1oqheo/7YmW4rg==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/plist": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/plist/-/plist-3.0.5.tgz", + "integrity": "sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==", + "dev": true, + "optional": true, + "dependencies": { + "@types/node": "*", + "xmlbuilder": ">=11.0.1" + } + }, + "node_modules/@types/responselike": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", + "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/verror": { + "version": "1.10.9", + "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.9.tgz", + "integrity": "sha512-MLx9Z+9lGzwEuW16ubGeNkpBDE84RpB/NyGgg6z2BTpWzKkGU451cAY3UkUzZEp72RHF585oJ3V8JVNqIplcAQ==", + "dev": true, + "optional": true + }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.10", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", + "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/7zip-bin": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.2.0.tgz", + "integrity": "sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==", + "dev": true + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/abstract-logging": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", + "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==" + }, + "node_modules/acorn": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/app-builder-bin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-4.0.0.tgz", + "integrity": "sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA==", + "dev": true + }, + "node_modules/app-builder-lib": { + "version": "24.9.1", + "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-24.9.1.tgz", + "integrity": "sha512-Q1nYxZcio4r+W72cnIRVYofEAyjBd3mG47o+zms8HlD51zWtA/YxJb01Jei5F+jkWhge/PTQK+uldsPh6d0/4g==", + "dev": true, + "dependencies": { + "@develar/schema-utils": "~2.6.5", + "@electron/notarize": "2.1.0", + "@electron/osx-sign": "1.0.5", + "@electron/universal": "1.4.1", + "@malept/flatpak-bundler": "^0.4.0", + "@types/fs-extra": "9.0.13", + "7zip-bin": "~5.2.0", + "async-exit-hook": "^2.0.1", + "bluebird-lst": "^1.0.9", + "builder-util": "24.8.1", + "builder-util-runtime": "9.2.3", + "chromium-pickle-js": "^0.2.0", + "debug": "^4.3.4", + "ejs": "^3.1.8", + "electron-publish": "24.8.1", + "form-data": "^4.0.0", + "fs-extra": "^10.1.0", + "hosted-git-info": "^4.1.0", + "is-ci": "^3.0.0", + "isbinaryfile": "^5.0.0", + "js-yaml": "^4.1.0", + "lazy-val": "^1.0.5", + "minimatch": "^5.1.1", + "read-config-file": "6.3.2", + "sanitize-filename": "^1.6.3", + "semver": "^7.3.8", + "tar": "^6.1.12", + "temp-file": "^3.4.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/app-builder-lib/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/app-builder-lib/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/app-builder-lib/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/app-builder-lib/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + }, + "node_modules/archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==" + }, + "node_modules/are-we-there-yet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/are-we-there-yet/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" + }, + "node_modules/async-exit-hook": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", + "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/avvio": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/avvio/-/avvio-8.2.1.tgz", + "integrity": "sha512-TAlMYvOuwGyLK3PfBb5WKBXZmXz2fVCgv23d6zZFdle/q3gPjmxBaeuC0pY0Dzs5PWMSgfqqEZkrye19GlDTgw==", + "dependencies": { + "archy": "^1.0.0", + "debug": "^4.0.0", + "fastq": "^1.6.1" + } + }, + "node_modules/axios": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", + "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/big-integer": { + "version": "1.6.52", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", + "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "node_modules/bluebird-lst": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.9.tgz", + "integrity": "sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==", + "dev": true, + "dependencies": { + "bluebird": "^3.5.5" + } + }, + "node_modules/boolean": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", + "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", + "optional": true + }, + "node_modules/bplist-parser": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", + "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", + "dev": true, + "dependencies": { + "big-integer": "^1.6.44" + }, + "engines": { + "node": ">= 5.10.0" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.1.tgz", + "integrity": "sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg==", + "dev": true, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/builder-util": { + "version": "24.8.1", + "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-24.8.1.tgz", + "integrity": "sha512-ibmQ4BnnqCnJTNrdmdNlnhF48kfqhNzSeqFMXHLIl+o9/yhn6QfOaVrloZ9YUu3m0k3rexvlT5wcki6LWpjTZw==", + "dev": true, + "dependencies": { + "@types/debug": "^4.1.6", + "7zip-bin": "~5.2.0", + "app-builder-bin": "4.0.0", + "bluebird-lst": "^1.0.9", + "builder-util-runtime": "9.2.3", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.3", + "debug": "^4.3.4", + "fs-extra": "^10.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-ci": "^3.0.0", + "js-yaml": "^4.1.0", + "source-map-support": "^0.5.19", + "stat-mode": "^1.0.0", + "temp-file": "^3.4.0" + } + }, + "node_modules/builder-util-runtime": { + "version": "9.2.3", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.3.tgz", + "integrity": "sha512-FGhkqXdFFZ5dNC4C+yuQB9ak311rpGAw+/ASz8ZdxwODCv1GGMWgLDeofRkdi0F3VCHQEWy/aXcJQozx2nOPiw==", + "dev": true, + "dependencies": { + "debug": "^4.3.4", + "sax": "^1.2.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/builder-util/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/builder-util/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/builder-util/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/bundle-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", + "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", + "dev": true, + "dependencies": { + "run-applescript": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/cacheable-request": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/chromium-pickle-js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", + "integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==", + "dev": true + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "optional": true, + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cmake-js": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/cmake-js/-/cmake-js-7.2.1.tgz", + "integrity": "sha512-AdPSz9cSIJWdKvm0aJgVu3X8i0U3mNTswJkSHzZISqmYVjZk7Td4oDFg0mCBA383wO+9pG5Ix7pEP1CZH9x2BA==", + "dependencies": { + "axios": "^1.3.2", + "debug": "^4", + "fs-extra": "^10.1.0", + "lodash.isplainobject": "^4.0.6", + "memory-stream": "^1.0.0", + "node-api-headers": "^0.0.2", + "npmlog": "^6.0.2", + "rc": "^1.2.7", + "semver": "^7.3.8", + "tar": "^6.1.11", + "url-join": "^4.0.1", + "which": "^2.0.2", + "yargs": "^17.6.0" + }, + "bin": { + "cmake-js": "bin/cmake-js" + }, + "engines": { + "node": ">= 14.15.0" + } + }, + "node_modules/cmake-js/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cmake-js/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/cmake-js/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cmake-js/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/compare-version": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", + "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/config-file-ts": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/config-file-ts/-/config-file-ts-0.2.4.tgz", + "integrity": "sha512-cKSW0BfrSaAUnxpgvpXPLaaW/umg4bqg4k3GO1JqlRfpx+d5W0GDXznCMkWotJQek5Mmz1MJVChQnz3IVaeMZQ==", + "dev": true, + "dependencies": { + "glob": "^7.1.6", + "typescript": "^4.0.2" + } + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true, + "optional": true + }, + "node_modules/crc": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", + "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", + "dev": true, + "optional": true, + "dependencies": { + "buffer": "^5.1.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/default-browser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", + "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", + "dev": true, + "dependencies": { + "bundle-name": "^3.0.0", + "default-browser-id": "^3.0.0", + "execa": "^7.1.1", + "titleize": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", + "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", + "dev": true, + "dependencies": { + "bplist-parser": "^0.2.0", + "untildify": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "engines": { + "node": ">=10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "optional": true, + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "optional": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/detect-libc": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", + "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "optional": true + }, + "node_modules/dicom-data-dictionary": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/dicom-data-dictionary/-/dicom-data-dictionary-0.3.1.tgz", + "integrity": "sha512-AUmCtSYSgzfpVlyCjhVd7Da26aj151nSYjEO9b00dB8wkpfflfe6uCxfrveLjXIET2WrkoGM5CzA3Tb2p8cg+A==" + }, + "node_modules/dicom-dimse-native": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/dicom-dimse-native/-/dicom-dimse-native-2.4.2.tgz", + "integrity": "sha512-MiSRGiamxQKotdrvdGPKHmgPtE2KfAByP8iirmJbfjZGbS/LzO931I3pV4+cSOc1Aytj3bMhYFZ6L9LKHoP+DA==", + "hasInstallScript": true, + "dependencies": { + "bindings": "^1.5.0", + "cmake-js": "^7.1.1", + "node-addon-api": "^4.3.0", + "prebuild-install": "^7.1.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/dicom-dimse-native/node_modules/node-addon-api": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", + "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==" + }, + "node_modules/dicom-parser": { + "version": "1.8.21", + "resolved": "https://registry.npmjs.org/dicom-parser/-/dicom-parser-1.8.21.tgz", + "integrity": "sha512-lYCweHQDsC8UFpXErPlg86Px2A8bay0HiUY+wzoG3xv5GzgqVHU3lziwSc/Gzn7VV7y2KeP072SzCviuOoU02w==" + }, + "node_modules/dir-compare": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-3.3.0.tgz", + "integrity": "sha512-J7/et3WlGUCxjdnD3HAAzQ6nsnc0WL6DD7WcwJb7c39iH1+AWfg+9OqzJNaI6PkBwBvm1mhZNL9iY/nRiZXlPg==", + "dev": true, + "dependencies": { + "buffer-equal": "^1.0.0", + "minimatch": "^3.0.4" + } + }, + "node_modules/dir-compare/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/dir-compare/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/dmg-builder": { + "version": "24.9.1", + "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-24.9.1.tgz", + "integrity": "sha512-huC+O6hvHd24Ubj3cy2GMiGLe2xGFKN3klqVMLAdcbB6SWMd1yPSdZvV8W1O01ICzCCRlZDHiv4VrNUgnPUfbQ==", + "dev": true, + "dependencies": { + "app-builder-lib": "24.9.1", + "builder-util": "24.8.1", + "builder-util-runtime": "9.2.3", + "fs-extra": "^10.1.0", + "iconv-lite": "^0.6.2", + "js-yaml": "^4.1.0" + }, + "optionalDependencies": { + "dmg-license": "^1.0.11" + } + }, + "node_modules/dmg-builder/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/dmg-builder/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/dmg-builder/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/dmg-license": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/dmg-license/-/dmg-license-1.0.11.tgz", + "integrity": "sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==", + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "@types/plist": "^3.0.1", + "@types/verror": "^1.10.3", + "ajv": "^6.10.0", + "crc": "^3.8.0", + "iconv-corefoundation": "^1.1.7", + "plist": "^3.0.4", + "smart-buffer": "^4.0.2", + "verror": "^1.10.0" + }, + "bin": { + "dmg-license": "bin/dmg-license.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dotenv": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-9.0.2.tgz", + "integrity": "sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", + "dev": true + }, + "node_modules/ejs": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", + "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", + "dev": true, + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron": { + "version": "25.9.8", + "resolved": "https://registry.npmjs.org/electron/-/electron-25.9.8.tgz", + "integrity": "sha512-PGgp6PH46QVENHuAHc2NT1Su8Q1qov7qIl2jI5tsDpTibwV2zD8539AeWBQySeBU4dhbj9onIl7+1bXQ0wefBg==", + "hasInstallScript": true, + "dependencies": { + "@electron/get": "^2.0.0", + "@types/node": "^18.11.18", + "extract-zip": "^2.0.1" + }, + "bin": { + "electron": "cli.js" + }, + "engines": { + "node": ">= 12.20.55" + } + }, + "node_modules/electron-builder": { + "version": "24.9.1", + "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-24.9.1.tgz", + "integrity": "sha512-v7BuakDuY6sKMUYM8mfQGrwyjBpZ/ObaqnenU0H+igEL10nc6ht049rsCw2HghRBdEwJxGIBuzs3jbEhNaMDmg==", + "dev": true, + "dependencies": { + "app-builder-lib": "24.9.1", + "builder-util": "24.8.1", + "builder-util-runtime": "9.2.3", + "chalk": "^4.1.2", + "dmg-builder": "24.9.1", + "fs-extra": "^10.1.0", + "is-ci": "^3.0.0", + "lazy-val": "^1.0.5", + "read-config-file": "6.3.2", + "simple-update-notifier": "2.0.0", + "yargs": "^17.6.2" + }, + "bin": { + "electron-builder": "cli.js", + "install-app-deps": "install-app-deps.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/electron-builder/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/electron-builder/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/electron-builder/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/electron-log": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/electron-log/-/electron-log-5.0.1.tgz", + "integrity": "sha512-x4wnwHg00h/onWQgjmvcdLV7Mrd9TZjxNs8LmXVpqvANDf4FsSs5wLlzOykWLcaFzR3+5hdVEQ8ctmrUxgHlPA==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/electron-publish": { + "version": "24.8.1", + "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-24.8.1.tgz", + "integrity": "sha512-IFNXkdxMVzUdweoLJNXSupXkqnvgbrn3J4vognuOY06LaS/m0xvfFYIf+o1CM8if6DuWYWoQFKPcWZt/FUjZPw==", + "dev": true, + "dependencies": { + "@types/fs-extra": "^9.0.11", + "builder-util": "24.8.1", + "builder-util-runtime": "9.2.3", + "chalk": "^4.1.2", + "fs-extra": "^10.1.0", + "lazy-val": "^1.0.5", + "mime": "^2.5.2" + } + }, + "node_modules/electron-publish/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/electron-publish/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/electron-publish/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/electron-server": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/electron-server/-/electron-server-0.2.0.tgz", + "integrity": "sha512-MwOWWeA8Is+L3PpSpngAPzXWMsDCOsGbF0blp6FjFQftxKtqi1ohu+K1pkfeLLlNRUR3eie+9C0g5I6UoWegGQ==" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true + }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "optional": true + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "devOptional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", + "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.56.0", + "@humanwhocodes/config-array": "^0.11.13", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", + "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.1.tgz", + "integrity": "sha512-WQpV3mSmIobb77s4qiCZu3dBrZZ0rj8ckSfBtRrgNK9Wnh2s3eiaxNTWloz1LJ1WtvqZES/PAI7PLvsrGt/CEA==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.5" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": "*", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", + "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/extsprintf": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz", + "integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "optional": true + }, + "node_modules/fast-content-type-parse": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-1.1.0.tgz", + "integrity": "sha512-fBHHqSTFLVnR61C+gltJuE5GkVQMV0S2nqUO8TJ+5Z3qAKG8vAx4FKai1s5jq/inV1+sREynIWSuQ6HgoSXpDQ==" + }, + "node_modules/fast-decode-uri-component": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", + "integrity": "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-json-stringify": { + "version": "5.9.1", + "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-5.9.1.tgz", + "integrity": "sha512-NMrf+uU9UJnTzfxaumMDXK1NWqtPCfGoM9DYIE+ESlaTQqjlANFBy0VAbsm6FB88Mx0nceyi18zTo5kIEUlzxg==", + "dependencies": { + "@fastify/deepmerge": "^1.0.0", + "ajv": "^8.10.0", + "ajv-formats": "^2.1.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^2.1.0", + "json-schema-ref-resolver": "^1.0.1", + "rfdc": "^1.2.0" + } + }, + "node_modules/fast-json-stringify/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/fast-json-stringify/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fast-querystring": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.2.tgz", + "integrity": "sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==", + "dependencies": { + "fast-decode-uri-component": "^1.0.1" + } + }, + "node_modules/fast-redact": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.3.0.tgz", + "integrity": "sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/fast-uri": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-2.3.0.tgz", + "integrity": "sha512-eel5UKGn369gGEWOqBShmFJWfq/xSJvsgDzgLYC845GneayWvXBf0lJCBn5qTABfewy1ZDPoaR5OZCP+kssfuw==" + }, + "node_modules/fastify": { + "version": "4.25.1", + "resolved": "https://registry.npmjs.org/fastify/-/fastify-4.25.1.tgz", + "integrity": "sha512-D8d0rv61TwqoAS7lom2tvIlgVMlx88lLsiwXyWNjA7CU/LC/mx/Gp2WAlC0S/ABq19U+y/aRvYFG5xLUu2aMrg==", + "dependencies": { + "@fastify/ajv-compiler": "^3.5.0", + "@fastify/error": "^3.4.0", + "@fastify/fast-json-stringify-compiler": "^4.3.0", + "abstract-logging": "^2.0.1", + "avvio": "^8.2.1", + "fast-content-type-parse": "^1.1.0", + "fast-json-stringify": "^5.8.0", + "find-my-way": "^7.7.0", + "light-my-request": "^5.11.0", + "pino": "^8.17.0", + "process-warning": "^3.0.0", + "proxy-addr": "^2.0.7", + "rfdc": "^1.3.0", + "secure-json-parse": "^2.7.0", + "semver": "^7.5.4", + "toad-cache": "^3.3.0" + } + }, + "node_modules/fastify-plugin": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-4.5.1.tgz", + "integrity": "sha512-stRHYGeuqpEZTL1Ef0Ovr2ltazUT9g844X5z/zEBFLG8RYlpDiOCIG+ATvYEp+/zmc7sN29mcIMp8gvYplYPIQ==" + }, + "node_modules/fastify/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fastq": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", + "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-my-way": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-7.7.0.tgz", + "integrity": "sha512-+SrHpvQ52Q6W9f3wJoJBbAQULJuNEEQwBvlvYwACDhBTLOTMiQ0HYWh4+vC3OivGP2ENcTI1oKlFA2OepJNjhQ==", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-querystring": "^1.0.0", + "safe-regex2": "^2.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs-walk": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/fs-walk/-/fs-walk-0.0.2.tgz", + "integrity": "sha512-JURMv21QJsEOt3Rnyq/8N5ujhtG/b/4lWANzZclr9HkTM5qfUycOChQJByQ8xHH4oP66o+8n5/8fis6SVlus7A==", + "dependencies": { + "async": "*" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "optional": true, + "dependencies": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/global-agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", + "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "es6-error": "^4.1.1", + "matcher": "^3.0.0", + "roarr": "^2.15.3", + "semver": "^7.3.2", + "serialize-error": "^7.0.1" + }, + "engines": { + "node": ">=10.0" + } + }, + "node_modules/global-agent/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "optional": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "optional": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "optional": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "optional": true, + "dependencies": { + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "optional": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "optional": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/helmet": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/helmet/-/helmet-7.1.0.tgz", + "integrity": "sha512-g+HZqgfbpXdCkme/Cd/mZkV0aV3BZZZSugecH03kl38m/Kmdx8jKjBikpDj2cr+Iynv4KpYEviojNdTJActJAg==", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "dev": true, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/iconv-corefoundation": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz", + "integrity": "sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==", + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "cli-truncate": "^2.1.0", + "node-addon-api": "^1.6.3" + }, + "engines": { + "node": "^8.11.2 || >=10" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "dev": true, + "dependencies": { + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-wsl/node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isbinaryfile": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.0.tgz", + "integrity": "sha512-UDdnyGvMajJUWCkib7Cei/dvyJrrvo4FIrsvSFWdPpXSUorzXrDJ0S+X5Q4ZlasfPjca4yqCNNsjbCeiy8FFeg==", + "dev": true, + "engines": { + "node": ">= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/jake": { + "version": "10.8.7", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", + "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", + "dev": true, + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jake/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/jake/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + }, + "node_modules/json-schema-ref-resolver": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-schema-ref-resolver/-/json-schema-ref-resolver-1.0.1.tgz", + "integrity": "sha512-EJAj1pgHc1hxF6vo2Z3s69fMjO1INq6eGHXZ8Z6wCQeldCuwxGK9Sxf4/cScGn3FZubCVUehfWtcDM/PLteCQw==", + "dependencies": { + "fast-deep-equal": "^3.1.3" + } + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "optional": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/lazy-val": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.5.tgz", + "integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==", + "dev": true + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/light-my-request": { + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-5.11.0.tgz", + "integrity": "sha512-qkFCeloXCOMpmEdZ/MV91P8AT4fjwFXWaAFz3lUeStM8RcoM1ks4J/F8r1b3r6y/H4u3ACEJ1T+Gv5bopj7oDA==", + "dependencies": { + "cookie": "^0.5.0", + "process-warning": "^2.0.0", + "set-cookie-parser": "^2.4.1" + } + }, + "node_modules/light-my-request/node_modules/process-warning": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-2.3.2.tgz", + "integrity": "sha512-n9wh8tvBe5sFmsqlg+XQhaQLumwpqoAUruLwjCopgTmUBjJ/fjtBsJzKleCaIGBOMXYEhp1YfKl4d7rJ5ZKJGA==" + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/matcher": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", + "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", + "optional": true, + "dependencies": { + "escape-string-regexp": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memory-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/memory-stream/-/memory-stream-1.0.0.tgz", + "integrity": "sha512-Wm13VcsPIMdG96dzILfij09PvuS3APtcKNh7M28FsCA/w6+1mjR7hhPmfFNoilX9xU7wTdhsH5lJAm6XNzdtww==", + "dependencies": { + "readable-stream": "^3.4.0" + } + }, + "node_modules/memory-stream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + }, + "node_modules/mnemonist": { + "version": "0.39.6", + "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.39.6.tgz", + "integrity": "sha512-A/0v5Z59y63US00cRSLiloEIw3t5G+MiKz4BhX21FI+YBJXBOGW0ohFxTxO08dsOYlzxo87T7vGfZKYp2bcAWA==", + "dependencies": { + "obliterator": "^2.0.1" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/node-abi": { + "version": "3.52.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.52.0.tgz", + "integrity": "sha512-JJ98b02z16ILv7859irtXn4oUaFWADtvkzy2c0IAatNVX2Mc9Yoh8z6hZInn3QwvMEYhHuQloYi+TTQy67SIdQ==", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-abi/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-addon-api": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz", + "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==", + "dev": true, + "optional": true + }, + "node_modules/node-api-headers": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/node-api-headers/-/node-api-headers-0.0.2.tgz", + "integrity": "sha512-YsjmaKGPDkmhoNKIpkChtCsPVaRE0a274IdERKnuc/E8K1UJdBZ4/mvI006OijlQZHCfpRNOH3dfHQs92se8gg==" + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", + "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "optional": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/obliterator": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz", + "integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==" + }, + "node_modules/on-exit-leak-free": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", + "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", + "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", + "dev": true, + "dependencies": { + "default-browser": "^4.0.0", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pino": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/pino/-/pino-8.17.1.tgz", + "integrity": "sha512-YoN7/NJgnsJ+fkADZqjhRt96iepWBndQHeClmSBH0sQWCb8zGD74t00SK4eOtKFi/f8TUmQnfmgglEhd2kI1RQ==", + "dependencies": { + "atomic-sleep": "^1.0.0", + "fast-redact": "^3.1.1", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "v1.1.0", + "pino-std-serializers": "^6.0.0", + "process-warning": "^2.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^3.7.0", + "thread-stream": "^2.0.0" + }, + "bin": { + "pino": "bin.js" + } + }, + "node_modules/pino-abstract-transport": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.1.0.tgz", + "integrity": "sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA==", + "dependencies": { + "readable-stream": "^4.0.0", + "split2": "^4.0.0" + } + }, + "node_modules/pino-std-serializers": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.2.2.tgz", + "integrity": "sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==" + }, + "node_modules/pino/node_modules/process-warning": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-2.3.2.tgz", + "integrity": "sha512-n9wh8tvBe5sFmsqlg+XQhaQLumwpqoAUruLwjCopgTmUBjJ/fjtBsJzKleCaIGBOMXYEhp1YfKl4d7rJ5ZKJGA==" + }, + "node_modules/plist": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", + "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", + "dev": true, + "dependencies": { + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + }, + "engines": { + "node": ">=10.4.0" + } + }, + "node_modules/prebuild-install": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", + "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.1.tgz", + "integrity": "sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-3.0.0.tgz", + "integrity": "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==" + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-config-file": { + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-6.3.2.tgz", + "integrity": "sha512-M80lpCjnE6Wt6zb98DoW8WHR09nzMSpu8XHtPkiTHrJ5Az9CybfeQhTJ8D7saeBHpGhLPIVyA8lcL6ZmdKwY6Q==", + "dev": true, + "dependencies": { + "config-file-ts": "^0.2.4", + "dotenv": "^9.0.2", + "dotenv-expand": "^5.1.0", + "js-yaml": "^4.1.0", + "json5": "^2.2.0", + "lazy-val": "^1.0.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/readable-stream": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.1.tgz", + "integrity": "sha512-uQjbf34vmf/asGnOHQEw07Q4llgMACQZTWWa4MmICS0IKJoHbLwKCy71H3eR99Dw5iYejc6W+pqZZEeqRtUFAw==", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/readable-stream/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/real-require": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", + "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ret": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.2.2.tgz", + "integrity": "sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/roarr": { + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", + "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "detect-node": "^2.0.4", + "globalthis": "^1.0.1", + "json-stringify-safe": "^5.0.1", + "semver-compare": "^1.0.0", + "sprintf-js": "^1.1.2" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/run-applescript": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", + "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", + "dev": true, + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-applescript/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/run-applescript/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-applescript/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/run-applescript/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-applescript/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/run-applescript/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/run-applescript/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-applescript/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-regex2": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-2.0.0.tgz", + "integrity": "sha512-PaUSFsUaNNuKwkBijoAPHAK6/eM6VirvyPWlZ7BAQy4D+hCvh4B6lIG+nPdhbFfIbP+gTGBcrdsOaUs0F+ZBOQ==", + "dependencies": { + "ret": "~0.2.0" + } + }, + "node_modules/safe-stable-stringify": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", + "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", + "engines": { + "node": ">=10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/sanitize-filename": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", + "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", + "dev": true, + "dependencies": { + "truncate-utf8-bytes": "^1.0.0" + } + }, + "node_modules/sax": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", + "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==", + "dev": true + }, + "node_modules/secure-json-parse": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", + "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "optional": true + }, + "node_modules/serialize-error": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", + "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", + "optional": true, + "dependencies": { + "type-fest": "^0.13.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/serialize-error/node_modules/type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, + "node_modules/set-cookie-parser": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz", + "integrity": "sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/simple-update-notifier/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "optional": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "optional": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/sonic-boom": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.7.0.tgz", + "integrity": "sha512-IudtNvSqA/ObjN97tfgNmOKyDOs4dNcg4cUUsHDebqsgb8wGBBwb31LIgShNO8fye0dFI52X1+tFoKKI6Rq1Gg==", + "dependencies": { + "atomic-sleep": "^1.0.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "optional": true + }, + "node_modules/stat-mode": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz", + "integrity": "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/sumchecker": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", + "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", + "dependencies": { + "debug": "^4.1.0" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/synckit": { + "version": "0.8.6", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.6.tgz", + "integrity": "sha512-laHF2savN6sMeHCjLRkheIU4wo3Zg9Ln5YOjOo7sZ5dVQW8yF5pPE5SIw1dsPhq3TRp1jisKRCdPhfs/1WMqDA==", + "dev": true, + "dependencies": { + "@pkgr/utils": "^2.4.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/tar": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", + "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-fs/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-stream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/temp-file": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.4.0.tgz", + "integrity": "sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==", + "dev": true, + "dependencies": { + "async-exit-hook": "^2.0.1", + "fs-extra": "^10.0.0" + } + }, + "node_modules/temp-file/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/temp-file/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/temp-file/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/thread-stream": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-2.4.1.tgz", + "integrity": "sha512-d/Ex2iWd1whipbT681JmTINKw0ZwOUBZm7+Gjs64DHuX34mmw8vJL2bFAaNacaW72zYiTJxSHi5abUuOi5nsfg==", + "dependencies": { + "real-require": "^0.2.0" + } + }, + "node_modules/titleize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", + "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, + "node_modules/tmp-promise": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", + "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", + "dev": true, + "dependencies": { + "tmp": "^0.2.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toad-cache": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/toad-cache/-/toad-cache-3.4.1.tgz", + "integrity": "sha512-T0m3MxP3wcqW0LaV3dF1mHBU294sgYSm4FOpa5eEJaYO7PqJZBOjZEQI1y4YaKNnih1FXCEYTWDS9osCoTUefg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/truncate-utf8-bytes": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", + "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", + "dev": true, + "dependencies": { + "utf8-byte-length": "^1.0.1" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==" + }, + "node_modules/utf8-byte-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", + "integrity": "sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==", + "dev": true + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/verror": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz", + "integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==", + "dev": true, + "optional": true, + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/xmlbuilder": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", + "dev": true, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + }, + "dependencies": { + "@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true + }, + "@develar/schema-utils": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/@develar/schema-utils/-/schema-utils-2.6.5.tgz", + "integrity": "sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==", + "dev": true, + "requires": { + "ajv": "^6.12.0", + "ajv-keywords": "^3.4.1" + } + }, + "@electron-toolkit/eslint-config": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@electron-toolkit/eslint-config/-/eslint-config-1.0.2.tgz", + "integrity": "sha512-GJVuMsxBHfVARfmUoSTCHT0e/QfWlVbXcGk3tgoku0ad6tLjydbv2LpvKi02+Sy2WiEz9L9SkGSw090ukT/F0A==", + "dev": true, + "requires": {} + }, + "@electron-toolkit/eslint-config-prettier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@electron-toolkit/eslint-config-prettier/-/eslint-config-prettier-1.0.1.tgz", + "integrity": "sha512-JERUehgy64/J369nr4AVmCskYAX8DQg8eWkQAHk56Qfh6JGnoiZVsv4nDJLBOdG7M7HKrHiqDgaAEXPOCMiijg==", + "dev": true, + "requires": { + "eslint-config-prettier": "^8.8.0", + "eslint-plugin-prettier": "^5.0.0" + } + }, + "@electron-toolkit/preload": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@electron-toolkit/preload/-/preload-2.0.0.tgz", + "integrity": "sha512-zpZDzbqJTZQC5d4LRs2EKruKWnqah+T75s+niBYFemYLtiW5TTZcWi3Q8UxHqnwTudDMuWJb233aaS2yjx3Xiw==", + "requires": {} + }, + "@electron-toolkit/utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@electron-toolkit/utils/-/utils-2.0.1.tgz", + "integrity": "sha512-3nnjd3D1NIjxdzNrvR5fkJ3kbJNbRkpHppv0/pSbMX6I0DaBzpPXeSfDYuJJKzZrAc3CmGcJa0MU4+AjEOlT4g==", + "requires": {} + }, + "@electron/asar": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.8.tgz", + "integrity": "sha512-cmskk5M06ewHMZAplSiF4AlME3IrnnZhKnWbtwKVLRkdJkKyUVjMLhDIiPIx/+6zQWVlKX/LtmK9xDme7540Sg==", + "dev": true, + "requires": { + "commander": "^5.0.0", + "glob": "^7.1.6", + "minimatch": "^3.0.4" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "@electron/get": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.3.tgz", + "integrity": "sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==", + "requires": { + "debug": "^4.1.1", + "env-paths": "^2.2.0", + "fs-extra": "^8.1.0", + "global-agent": "^3.0.0", + "got": "^11.8.5", + "progress": "^2.0.3", + "semver": "^6.2.0", + "sumchecker": "^3.0.1" + } + }, + "@electron/notarize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.1.0.tgz", + "integrity": "sha512-Q02xem1D0sg4v437xHgmBLxI2iz/fc0D4K7fiVWHa/AnW8o7D751xyKNXgziA6HrTOme9ul1JfWN5ark8WH1xA==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "fs-extra": "^9.0.1", + "promise-retry": "^2.0.1" + }, + "dependencies": { + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true + } + } + }, + "@electron/osx-sign": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.0.5.tgz", + "integrity": "sha512-k9ZzUQtamSoweGQDV2jILiRIHUu7lYlJ3c6IEmjv1hC17rclE+eb9U+f6UFlOOETo0JzY1HNlXy4YOlCvl+Lww==", + "dev": true, + "requires": { + "compare-version": "^0.1.2", + "debug": "^4.3.4", + "fs-extra": "^10.0.0", + "isbinaryfile": "^4.0.8", + "minimist": "^1.2.6", + "plist": "^3.0.5" + }, + "dependencies": { + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "dev": true + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true + } + } + }, + "@electron/universal": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.4.1.tgz", + "integrity": "sha512-lE/U3UNw1YHuowNbTmKNs9UlS3En3cPgwM5MI+agIgr/B1hSze9NdOP0qn7boZaI9Lph8IDv3/24g9IxnJP7aQ==", + "dev": true, + "requires": { + "@electron/asar": "^3.2.1", + "@malept/cross-spawn-promise": "^1.1.0", + "debug": "^4.3.1", + "dir-compare": "^3.0.0", + "fs-extra": "^9.0.1", + "minimatch": "^3.0.4", + "plist": "^3.0.4" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true + } + } + }, + "@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^3.3.0" + } + }, + "@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true + }, + "@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "@eslint/js": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", + "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", + "dev": true + }, + "@fastify/accept-negotiator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@fastify/accept-negotiator/-/accept-negotiator-1.1.0.tgz", + "integrity": "sha512-OIHZrb2ImZ7XG85HXOONLcJWGosv7sIvM2ifAPQVhg9Lv7qdmMBNVaai4QTdyuaqbKM5eO6sLSQOYI7wEQeCJQ==" + }, + "@fastify/ajv-compiler": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@fastify/ajv-compiler/-/ajv-compiler-3.5.0.tgz", + "integrity": "sha512-ebbEtlI7dxXF5ziNdr05mOY8NnDiPB1XvAlLHctRt/Rc+C3LCOVW5imUVX+mhvUhnNzmPBHewUkOFgGlCxgdAA==", + "requires": { + "ajv": "^8.11.0", + "ajv-formats": "^2.1.1", + "fast-uri": "^2.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + } + } + }, + "@fastify/autoload": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@fastify/autoload/-/autoload-5.8.0.tgz", + "integrity": "sha512-bF86vl+1Kk91S41WIL9NrKhcugGQg/cQ959aTaombkCjA+9YAbgVCKKu2lRqtMsosDZ0CNRfVnaLYoHQIDUI2A==" + }, + "@fastify/cors": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@fastify/cors/-/cors-8.5.0.tgz", + "integrity": "sha512-/oZ1QSb02XjP0IK1U0IXktEsw/dUBTxJOW7IpIeO8c/tNalw/KjoNSJv1Sf6eqoBPO+TDGkifq6ynFK3v68HFQ==", + "requires": { + "fastify-plugin": "^4.0.0", + "mnemonist": "0.39.6" + } + }, + "@fastify/deepmerge": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@fastify/deepmerge/-/deepmerge-1.3.0.tgz", + "integrity": "sha512-J8TOSBq3SoZbDhM9+R/u77hP93gz/rajSA+K2kGyijPpORPWUXHUpTaleoj+92As0S9uPRP7Oi8IqMf0u+ro6A==" + }, + "@fastify/error": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@fastify/error/-/error-3.4.1.tgz", + "integrity": "sha512-wWSvph+29GR783IhmvdwWnN4bUxTD01Vm5Xad4i7i1VuAOItLvbPAb69sb0IQ2N57yprvhNIwAP5B6xfKTmjmQ==" + }, + "@fastify/fast-json-stringify-compiler": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-4.3.0.tgz", + "integrity": "sha512-aZAXGYo6m22Fk1zZzEUKBvut/CIIQe/BapEORnxiD5Qr0kPHqqI69NtEMCme74h+at72sPhbkb4ZrLd1W3KRLA==", + "requires": { + "fast-json-stringify": "^5.7.0" + } + }, + "@fastify/helmet": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/@fastify/helmet/-/helmet-11.1.1.tgz", + "integrity": "sha512-pjJxjk6SLEimITWadtYIXt6wBMfFC1I6OQyH/jYVCqSAn36sgAIFjeNiibHtifjCd+e25442pObis3Rjtame6A==", + "requires": { + "fastify-plugin": "^4.2.1", + "helmet": "^7.0.0" + } + }, + "@fastify/send": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@fastify/send/-/send-2.1.0.tgz", + "integrity": "sha512-yNYiY6sDkexoJR0D8IDy3aRP3+L4wdqCpvx5WP+VtEU58sn7USmKynBzDQex5X42Zzvw2gNzzYgP90UfWShLFA==", + "requires": { + "@lukeed/ms": "^2.0.1", + "escape-html": "~1.0.3", + "fast-decode-uri-component": "^1.0.1", + "http-errors": "2.0.0", + "mime": "^3.0.0" + }, + "dependencies": { + "mime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==" + } + } + }, + "@fastify/sensible": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@fastify/sensible/-/sensible-5.5.0.tgz", + "integrity": "sha512-D0zpl+nocsRXLceSbc4gasQaO3ZNQR4dy9Uu8Ym0mh8VUdrjpZ4g8Ca9O3pGXbBVOnPIGHUJNTV7Yf9dg/OYdg==", + "requires": { + "@lukeed/ms": "^2.0.1", + "fast-deep-equal": "^3.1.1", + "fastify-plugin": "^4.0.0", + "forwarded": "^0.2.0", + "http-errors": "^2.0.0", + "type-is": "^1.6.18", + "vary": "^1.1.2" + } + }, + "@fastify/static": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@fastify/static/-/static-6.12.0.tgz", + "integrity": "sha512-KK1B84E6QD/FcQWxDI2aiUCwHxMJBI1KeCUzm1BwYpPY1b742+jeKruGHP2uOluuM6OkBPI8CIANrXcCRtC2oQ==", + "requires": { + "@fastify/accept-negotiator": "^1.0.0", + "@fastify/send": "^2.0.0", + "content-disposition": "^0.5.3", + "fastify-plugin": "^4.0.0", + "glob": "^8.0.1", + "p-limit": "^3.1.0" + }, + "dependencies": { + "glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + } + } + }, + "@humanwhocodes/config-array": { + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^2.0.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true + }, + "@humanwhocodes/object-schema": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", + "dev": true + }, + "@iwharris/dicom-data-dictionary": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@iwharris/dicom-data-dictionary/-/dicom-data-dictionary-1.26.0.tgz", + "integrity": "sha512-+IGx8Wv7xUu6i4eHc7NGUNYSYFjAGoezZyfX8Qy++TxxdcqI/hVVclP/+rJwOEdwgClINEsiPX4sC72UimCkTw==" + }, + "@lukeed/ms": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@lukeed/ms/-/ms-2.0.2.tgz", + "integrity": "sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA==" + }, + "@malept/cross-spawn-promise": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz", + "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.1" + } + }, + "@malept/flatpak-bundler": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz", + "integrity": "sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "fs-extra": "^9.0.0", + "lodash": "^4.17.15", + "tmp-promise": "^3.0.2" + }, + "dependencies": { + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true + } + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@pkgr/utils": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz", + "integrity": "sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "fast-glob": "^3.3.0", + "is-glob": "^4.0.3", + "open": "^9.1.0", + "picocolors": "^1.0.0", + "tslib": "^2.6.0" + } + }, + "@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==" + }, + "@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "requires": { + "defer-to-connect": "^2.0.0" + } + }, + "@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true + }, + "@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "requires": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, + "@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dev": true, + "requires": { + "@types/ms": "*" + } + }, + "@types/fs-extra": { + "version": "9.0.13", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", + "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/http-cache-semantics": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==" + }, + "@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "requires": { + "@types/node": "*" + } + }, + "@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", + "dev": true + }, + "@types/node": { + "version": "18.19.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.3.tgz", + "integrity": "sha512-k5fggr14DwAytoA/t8rPrIz++lXK7/DqckthCmoZOKNsEbJkId4Z//BqgApXBUGrGddrigYa1oqheo/7YmW4rg==", + "requires": { + "undici-types": "~5.26.4" + } + }, + "@types/plist": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/plist/-/plist-3.0.5.tgz", + "integrity": "sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==", + "dev": true, + "optional": true, + "requires": { + "@types/node": "*", + "xmlbuilder": ">=11.0.1" + } + }, + "@types/responselike": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", + "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", + "requires": { + "@types/node": "*" + } + }, + "@types/verror": { + "version": "1.10.9", + "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.9.tgz", + "integrity": "sha512-MLx9Z+9lGzwEuW16ubGeNkpBDE84RpB/NyGgg6z2BTpWzKkGU451cAY3UkUzZEp72RHF585oJ3V8JVNqIplcAQ==", + "dev": true, + "optional": true + }, + "@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "optional": true, + "requires": { + "@types/node": "*" + } + }, + "@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "@xmldom/xmldom": { + "version": "0.8.10", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", + "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", + "dev": true + }, + "7zip-bin": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.2.0.tgz", + "integrity": "sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==", + "dev": true + }, + "abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "requires": { + "event-target-shim": "^5.0.0" + } + }, + "abstract-logging": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", + "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==" + }, + "acorn": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "requires": { + "debug": "4" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "requires": { + "ajv": "^8.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + } + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "app-builder-bin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-4.0.0.tgz", + "integrity": "sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA==", + "dev": true + }, + "app-builder-lib": { + "version": "24.9.1", + "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-24.9.1.tgz", + "integrity": "sha512-Q1nYxZcio4r+W72cnIRVYofEAyjBd3mG47o+zms8HlD51zWtA/YxJb01Jei5F+jkWhge/PTQK+uldsPh6d0/4g==", + "dev": true, + "requires": { + "@develar/schema-utils": "~2.6.5", + "@electron/notarize": "2.1.0", + "@electron/osx-sign": "1.0.5", + "@electron/universal": "1.4.1", + "@malept/flatpak-bundler": "^0.4.0", + "@types/fs-extra": "9.0.13", + "7zip-bin": "~5.2.0", + "async-exit-hook": "^2.0.1", + "bluebird-lst": "^1.0.9", + "builder-util": "24.8.1", + "builder-util-runtime": "9.2.3", + "chromium-pickle-js": "^0.2.0", + "debug": "^4.3.4", + "ejs": "^3.1.8", + "electron-publish": "24.8.1", + "form-data": "^4.0.0", + "fs-extra": "^10.1.0", + "hosted-git-info": "^4.1.0", + "is-ci": "^3.0.0", + "isbinaryfile": "^5.0.0", + "js-yaml": "^4.1.0", + "lazy-val": "^1.0.5", + "minimatch": "^5.1.1", + "read-config-file": "6.3.2", + "sanitize-filename": "^1.6.3", + "semver": "^7.3.8", + "tar": "^6.1.12", + "temp-file": "^3.4.0" + }, + "dependencies": { + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true + } + } + }, + "aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==" + }, + "are-we-there-yet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "optional": true + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "optional": true + }, + "async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" + }, + "async-exit-hook": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", + "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true + }, + "atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==" + }, + "avvio": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/avvio/-/avvio-8.2.1.tgz", + "integrity": "sha512-TAlMYvOuwGyLK3PfBb5WKBXZmXz2fVCgv23d6zZFdle/q3gPjmxBaeuC0pY0Dzs5PWMSgfqqEZkrye19GlDTgw==", + "requires": { + "archy": "^1.0.0", + "debug": "^4.0.0", + "fastq": "^1.6.1" + } + }, + "axios": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", + "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", + "requires": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "big-integer": { + "version": "1.6.52", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", + "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", + "dev": true + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "bluebird-lst": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.9.tgz", + "integrity": "sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==", + "dev": true, + "requires": { + "bluebird": "^3.5.5" + } + }, + "boolean": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", + "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", + "optional": true + }, + "bplist-parser": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", + "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", + "dev": true, + "requires": { + "big-integer": "^1.6.44" + } + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==" + }, + "buffer-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.1.tgz", + "integrity": "sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg==", + "dev": true + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "builder-util": { + "version": "24.8.1", + "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-24.8.1.tgz", + "integrity": "sha512-ibmQ4BnnqCnJTNrdmdNlnhF48kfqhNzSeqFMXHLIl+o9/yhn6QfOaVrloZ9YUu3m0k3rexvlT5wcki6LWpjTZw==", + "dev": true, + "requires": { + "@types/debug": "^4.1.6", + "7zip-bin": "~5.2.0", + "app-builder-bin": "4.0.0", + "bluebird-lst": "^1.0.9", + "builder-util-runtime": "9.2.3", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.3", + "debug": "^4.3.4", + "fs-extra": "^10.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-ci": "^3.0.0", + "js-yaml": "^4.1.0", + "source-map-support": "^0.5.19", + "stat-mode": "^1.0.0", + "temp-file": "^3.4.0" + }, + "dependencies": { + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true + } + } + }, + "builder-util-runtime": { + "version": "9.2.3", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.3.tgz", + "integrity": "sha512-FGhkqXdFFZ5dNC4C+yuQB9ak311rpGAw+/ASz8ZdxwODCv1GGMWgLDeofRkdi0F3VCHQEWy/aXcJQozx2nOPiw==", + "dev": true, + "requires": { + "debug": "^4.3.4", + "sax": "^1.2.4" + } + }, + "bundle-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", + "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", + "dev": true, + "requires": { + "run-applescript": "^5.0.0" + } + }, + "cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==" + }, + "cacheable-request": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" + }, + "chromium-pickle-js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", + "integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==", + "dev": true + }, + "ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true + }, + "cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "optional": true, + "requires": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + } + }, + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + }, + "clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "requires": { + "mimic-response": "^1.0.0" + } + }, + "cmake-js": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/cmake-js/-/cmake-js-7.2.1.tgz", + "integrity": "sha512-AdPSz9cSIJWdKvm0aJgVu3X8i0U3mNTswJkSHzZISqmYVjZk7Td4oDFg0mCBA383wO+9pG5Ix7pEP1CZH9x2BA==", + "requires": { + "axios": "^1.3.2", + "debug": "^4", + "fs-extra": "^10.1.0", + "lodash.isplainobject": "^4.0.6", + "memory-stream": "^1.0.0", + "node-api-headers": "^0.0.2", + "npmlog": "^6.0.2", + "rc": "^1.2.7", + "semver": "^7.3.8", + "tar": "^6.1.11", + "url-join": "^4.0.1", + "which": "^2.0.2", + "yargs": "^17.6.0" + }, + "dependencies": { + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==" + } + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true + }, + "compare-version": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", + "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "config-file-ts": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/config-file-ts/-/config-file-ts-0.2.4.tgz", + "integrity": "sha512-cKSW0BfrSaAUnxpgvpXPLaaW/umg4bqg4k3GO1JqlRfpx+d5W0GDXznCMkWotJQek5Mmz1MJVChQnz3IVaeMZQ==", + "dev": true, + "requires": { + "glob": "^7.1.6", + "typescript": "^4.0.2" + } + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + }, + "content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "requires": { + "safe-buffer": "5.2.1" + } + }, + "cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true, + "optional": true + }, + "crc": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", + "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", + "dev": true, + "optional": true, + "requires": { + "buffer": "^5.1.0" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "requires": { + "mimic-response": "^3.1.0" + }, + "dependencies": { + "mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==" + } + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "default-browser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", + "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", + "dev": true, + "requires": { + "bundle-name": "^3.0.0", + "default-browser-id": "^3.0.0", + "execa": "^7.1.1", + "titleize": "^3.0.0" + } + }, + "default-browser-id": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", + "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", + "dev": true, + "requires": { + "bplist-parser": "^0.2.0", + "untildify": "^4.0.0" + } + }, + "defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==" + }, + "define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "optional": true, + "requires": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + } + }, + "define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true + }, + "define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "optional": true, + "requires": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "detect-libc": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", + "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==" + }, + "detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "optional": true + }, + "dicom-data-dictionary": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/dicom-data-dictionary/-/dicom-data-dictionary-0.3.1.tgz", + "integrity": "sha512-AUmCtSYSgzfpVlyCjhVd7Da26aj151nSYjEO9b00dB8wkpfflfe6uCxfrveLjXIET2WrkoGM5CzA3Tb2p8cg+A==" + }, + "dicom-dimse-native": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/dicom-dimse-native/-/dicom-dimse-native-2.4.2.tgz", + "integrity": "sha512-MiSRGiamxQKotdrvdGPKHmgPtE2KfAByP8iirmJbfjZGbS/LzO931I3pV4+cSOc1Aytj3bMhYFZ6L9LKHoP+DA==", + "requires": { + "bindings": "^1.5.0", + "cmake-js": "^7.1.1", + "node-addon-api": "^4.3.0", + "prebuild-install": "^7.1.1" + }, + "dependencies": { + "node-addon-api": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", + "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==" + } + } + }, + "dicom-parser": { + "version": "1.8.21", + "resolved": "https://registry.npmjs.org/dicom-parser/-/dicom-parser-1.8.21.tgz", + "integrity": "sha512-lYCweHQDsC8UFpXErPlg86Px2A8bay0HiUY+wzoG3xv5GzgqVHU3lziwSc/Gzn7VV7y2KeP072SzCviuOoU02w==" + }, + "dir-compare": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-3.3.0.tgz", + "integrity": "sha512-J7/et3WlGUCxjdnD3HAAzQ6nsnc0WL6DD7WcwJb7c39iH1+AWfg+9OqzJNaI6PkBwBvm1mhZNL9iY/nRiZXlPg==", + "dev": true, + "requires": { + "buffer-equal": "^1.0.0", + "minimatch": "^3.0.4" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "dmg-builder": { + "version": "24.9.1", + "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-24.9.1.tgz", + "integrity": "sha512-huC+O6hvHd24Ubj3cy2GMiGLe2xGFKN3klqVMLAdcbB6SWMd1yPSdZvV8W1O01ICzCCRlZDHiv4VrNUgnPUfbQ==", + "dev": true, + "requires": { + "app-builder-lib": "24.9.1", + "builder-util": "24.8.1", + "builder-util-runtime": "9.2.3", + "dmg-license": "^1.0.11", + "fs-extra": "^10.1.0", + "iconv-lite": "^0.6.2", + "js-yaml": "^4.1.0" + }, + "dependencies": { + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true + } + } + }, + "dmg-license": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/dmg-license/-/dmg-license-1.0.11.tgz", + "integrity": "sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==", + "dev": true, + "optional": true, + "requires": { + "@types/plist": "^3.0.1", + "@types/verror": "^1.10.3", + "ajv": "^6.10.0", + "crc": "^3.8.0", + "iconv-corefoundation": "^1.1.7", + "plist": "^3.0.4", + "smart-buffer": "^4.0.2", + "verror": "^1.10.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dotenv": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-9.0.2.tgz", + "integrity": "sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg==", + "dev": true + }, + "dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", + "dev": true + }, + "ejs": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", + "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", + "dev": true, + "requires": { + "jake": "^10.8.5" + } + }, + "electron": { + "version": "25.9.8", + "resolved": "https://registry.npmjs.org/electron/-/electron-25.9.8.tgz", + "integrity": "sha512-PGgp6PH46QVENHuAHc2NT1Su8Q1qov7qIl2jI5tsDpTibwV2zD8539AeWBQySeBU4dhbj9onIl7+1bXQ0wefBg==", + "requires": { + "@electron/get": "^2.0.0", + "@types/node": "^18.11.18", + "extract-zip": "^2.0.1" + } + }, + "electron-builder": { + "version": "24.9.1", + "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-24.9.1.tgz", + "integrity": "sha512-v7BuakDuY6sKMUYM8mfQGrwyjBpZ/ObaqnenU0H+igEL10nc6ht049rsCw2HghRBdEwJxGIBuzs3jbEhNaMDmg==", + "dev": true, + "requires": { + "app-builder-lib": "24.9.1", + "builder-util": "24.8.1", + "builder-util-runtime": "9.2.3", + "chalk": "^4.1.2", + "dmg-builder": "24.9.1", + "fs-extra": "^10.1.0", + "is-ci": "^3.0.0", + "lazy-val": "^1.0.5", + "read-config-file": "6.3.2", + "simple-update-notifier": "2.0.0", + "yargs": "^17.6.2" + }, + "dependencies": { + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true + } + } + }, + "electron-log": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/electron-log/-/electron-log-5.0.1.tgz", + "integrity": "sha512-x4wnwHg00h/onWQgjmvcdLV7Mrd9TZjxNs8LmXVpqvANDf4FsSs5wLlzOykWLcaFzR3+5hdVEQ8ctmrUxgHlPA==" + }, + "electron-publish": { + "version": "24.8.1", + "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-24.8.1.tgz", + "integrity": "sha512-IFNXkdxMVzUdweoLJNXSupXkqnvgbrn3J4vognuOY06LaS/m0xvfFYIf+o1CM8if6DuWYWoQFKPcWZt/FUjZPw==", + "dev": true, + "requires": { + "@types/fs-extra": "^9.0.11", + "builder-util": "24.8.1", + "builder-util-runtime": "9.2.3", + "chalk": "^4.1.2", + "fs-extra": "^10.1.0", + "lazy-val": "^1.0.5", + "mime": "^2.5.2" + }, + "dependencies": { + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true + } + } + }, + "electron-server": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/electron-server/-/electron-server-0.2.0.tgz", + "integrity": "sha512-MwOWWeA8Is+L3PpSpngAPzXWMsDCOsGbF0blp6FjFQftxKtqi1ohu+K1pkfeLLlNRUR3eie+9C0g5I6UoWegGQ==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==" + }, + "err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true + }, + "es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "optional": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "devOptional": true + }, + "eslint": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", + "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.56.0", + "@humanwhocodes/config-array": "^0.11.13", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "eslint-config-prettier": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", + "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==", + "dev": true, + "requires": {} + }, + "eslint-plugin-prettier": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.1.tgz", + "integrity": "sha512-WQpV3mSmIobb77s4qiCZu3dBrZZ0rj8ckSfBtRrgNK9Wnh2s3eiaxNTWloz1LJ1WtvqZES/PAI7PLvsrGt/CEA==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.5" + } + }, + "eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true + }, + "espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "requires": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + } + }, + "esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" + }, + "execa": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", + "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "dependencies": { + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + } + } + }, + "expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==" + }, + "extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "requires": { + "@types/yauzl": "^2.9.1", + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + } + }, + "extsprintf": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz", + "integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==", + "dev": true, + "optional": true + }, + "fast-content-type-parse": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-1.1.0.tgz", + "integrity": "sha512-fBHHqSTFLVnR61C+gltJuE5GkVQMV0S2nqUO8TJ+5Z3qAKG8vAx4FKai1s5jq/inV1+sREynIWSuQ6HgoSXpDQ==" + }, + "fast-decode-uri-component": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", + "integrity": "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==" + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true + }, + "fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-json-stringify": { + "version": "5.9.1", + "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-5.9.1.tgz", + "integrity": "sha512-NMrf+uU9UJnTzfxaumMDXK1NWqtPCfGoM9DYIE+ESlaTQqjlANFBy0VAbsm6FB88Mx0nceyi18zTo5kIEUlzxg==", + "requires": { + "@fastify/deepmerge": "^1.0.0", + "ajv": "^8.10.0", + "ajv-formats": "^2.1.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^2.1.0", + "json-schema-ref-resolver": "^1.0.1", + "rfdc": "^1.2.0" + }, + "dependencies": { + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + } + } + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "fast-querystring": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.2.tgz", + "integrity": "sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==", + "requires": { + "fast-decode-uri-component": "^1.0.1" + } + }, + "fast-redact": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.3.0.tgz", + "integrity": "sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==" + }, + "fast-uri": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-2.3.0.tgz", + "integrity": "sha512-eel5UKGn369gGEWOqBShmFJWfq/xSJvsgDzgLYC845GneayWvXBf0lJCBn5qTABfewy1ZDPoaR5OZCP+kssfuw==" + }, + "fastify": { + "version": "4.25.1", + "resolved": "https://registry.npmjs.org/fastify/-/fastify-4.25.1.tgz", + "integrity": "sha512-D8d0rv61TwqoAS7lom2tvIlgVMlx88lLsiwXyWNjA7CU/LC/mx/Gp2WAlC0S/ABq19U+y/aRvYFG5xLUu2aMrg==", + "requires": { + "@fastify/ajv-compiler": "^3.5.0", + "@fastify/error": "^3.4.0", + "@fastify/fast-json-stringify-compiler": "^4.3.0", + "abstract-logging": "^2.0.1", + "avvio": "^8.2.1", + "fast-content-type-parse": "^1.1.0", + "fast-json-stringify": "^5.8.0", + "find-my-way": "^7.7.0", + "light-my-request": "^5.11.0", + "pino": "^8.17.0", + "process-warning": "^3.0.0", + "proxy-addr": "^2.0.7", + "rfdc": "^1.3.0", + "secure-json-parse": "^2.7.0", + "semver": "^7.5.4", + "toad-cache": "^3.3.0" + }, + "dependencies": { + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "fastify-plugin": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-4.5.1.tgz", + "integrity": "sha512-stRHYGeuqpEZTL1Ef0Ovr2ltazUT9g844X5z/zEBFLG8RYlpDiOCIG+ATvYEp+/zmc7sN29mcIMp8gvYplYPIQ==" + }, + "fastq": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", + "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", + "requires": { + "reusify": "^1.0.4" + } + }, + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "requires": { + "pend": "~1.2.0" + } + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + }, + "filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "requires": { + "minimatch": "^5.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-my-way": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-7.7.0.tgz", + "integrity": "sha512-+SrHpvQ52Q6W9f3wJoJBbAQULJuNEEQwBvlvYwACDhBTLOTMiQ0HYWh4+vC3OivGP2ENcTI1oKlFA2OepJNjhQ==", + "requires": { + "fast-deep-equal": "^3.1.3", + "fast-querystring": "^1.0.0", + "safe-regex2": "^2.0.0" + } + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "requires": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "dev": true + }, + "follow-redirects": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==" + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "fs-walk": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/fs-walk/-/fs-walk-0.0.2.tgz", + "integrity": "sha512-JURMv21QJsEOt3Rnyq/8N5ujhtG/b/4lWANzZclr9HkTM5qfUycOChQJByQ8xHH4oP66o+8n5/8fis6SVlus7A==", + "requires": { + "async": "*" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" + }, + "gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "requires": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "get-intrinsic": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "optional": true, + "requires": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + } + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "requires": { + "pump": "^3.0.0" + } + }, + "github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "global-agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", + "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", + "optional": true, + "requires": { + "boolean": "^3.0.1", + "es6-error": "^4.1.1", + "matcher": "^3.0.0", + "roarr": "^2.15.3", + "semver": "^7.3.2", + "serialize-error": "^7.0.1" + }, + "dependencies": { + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "optional": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "optional": true, + "requires": { + "define-properties": "^1.1.3" + } + }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "optional": true, + "requires": { + "get-intrinsic": "^1.1.3" + } + }, + "got": { + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "requires": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + } + }, + "graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "has-property-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "optional": true, + "requires": { + "get-intrinsic": "^1.2.2" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "optional": true + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "optional": true + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + }, + "hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "requires": { + "function-bind": "^1.1.2" + } + }, + "helmet": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/helmet/-/helmet-7.1.0.tgz", + "integrity": "sha512-g+HZqgfbpXdCkme/Cd/mZkV0aV3BZZZSugecH03kl38m/Kmdx8jKjBikpDj2cr+Iynv4KpYEviojNdTJActJAg==" + }, + "hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" + }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "requires": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + } + }, + "http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "requires": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + } + }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "dev": true + }, + "iconv-corefoundation": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz", + "integrity": "sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==", + "dev": true, + "optional": true, + "requires": { + "cli-truncate": "^2.1.0", + "node-addon-api": "^1.6.3" + } + }, + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "ignore": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, + "is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "dev": true, + "requires": { + "ci-info": "^3.2.0" + } + }, + "is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "requires": { + "hasown": "^2.0.0" + } + }, + "is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "requires": { + "is-docker": "^3.0.0" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, + "is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + }, + "dependencies": { + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true + } + } + }, + "isbinaryfile": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.0.tgz", + "integrity": "sha512-UDdnyGvMajJUWCkib7Cei/dvyJrrvo4FIrsvSFWdPpXSUorzXrDJ0S+X5Q4ZlasfPjca4yqCNNsjbCeiy8FFeg==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "jake": { + "version": "10.8.7", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", + "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", + "dev": true, + "requires": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + }, + "json-schema-ref-resolver": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-schema-ref-resolver/-/json-schema-ref-resolver-1.0.1.tgz", + "integrity": "sha512-EJAj1pgHc1hxF6vo2Z3s69fMjO1INq6eGHXZ8Z6wCQeldCuwxGK9Sxf4/cScGn3FZubCVUehfWtcDM/PLteCQw==", + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "optional": true + }, + "json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "requires": { + "json-buffer": "3.0.1" + } + }, + "lazy-val": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.5.tgz", + "integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==", + "dev": true + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "light-my-request": { + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-5.11.0.tgz", + "integrity": "sha512-qkFCeloXCOMpmEdZ/MV91P8AT4fjwFXWaAFz3lUeStM8RcoM1ks4J/F8r1b3r6y/H4u3ACEJ1T+Gv5bopj7oDA==", + "requires": { + "cookie": "^0.5.0", + "process-warning": "^2.0.0", + "set-cookie-parser": "^2.4.1" + }, + "dependencies": { + "process-warning": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-2.3.2.tgz", + "integrity": "sha512-n9wh8tvBe5sFmsqlg+XQhaQLumwpqoAUruLwjCopgTmUBjJ/fjtBsJzKleCaIGBOMXYEhp1YfKl4d7rJ5ZKJGA==" + } + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "matcher": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", + "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", + "optional": true, + "requires": { + "escape-string-regexp": "^4.0.0" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" + }, + "memory-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/memory-stream/-/memory-stream-1.0.0.tgz", + "integrity": "sha512-Wm13VcsPIMdG96dzILfij09PvuS3APtcKNh7M28FsCA/w6+1mjR7hhPmfFNoilX9xU7wTdhsH5lJAm6XNzdtww==", + "requires": { + "readable-stream": "^3.4.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true + }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" + }, + "minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==" + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + }, + "mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + }, + "mnemonist": { + "version": "0.39.6", + "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.39.6.tgz", + "integrity": "sha512-A/0v5Z59y63US00cRSLiloEIw3t5G+MiKz4BhX21FI+YBJXBOGW0ohFxTxO08dsOYlzxo87T7vGfZKYp2bcAWA==", + "requires": { + "obliterator": "^2.0.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node-abi": { + "version": "3.52.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.52.0.tgz", + "integrity": "sha512-JJ98b02z16ILv7859irtXn4oUaFWADtvkzy2c0IAatNVX2Mc9Yoh8z6hZInn3QwvMEYhHuQloYi+TTQy67SIdQ==", + "requires": { + "semver": "^7.3.5" + }, + "dependencies": { + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "node-addon-api": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz", + "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==", + "dev": true, + "optional": true + }, + "node-api-headers": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/node-api-headers/-/node-api-headers-0.0.2.tgz", + "integrity": "sha512-YsjmaKGPDkmhoNKIpkChtCsPVaRE0a274IdERKnuc/E8K1UJdBZ4/mvI006OijlQZHCfpRNOH3dfHQs92se8gg==" + }, + "normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==" + }, + "npm-run-path": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", + "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", + "dev": true, + "requires": { + "path-key": "^4.0.0" + }, + "dependencies": { + "path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true + } + } + }, + "npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "requires": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "optional": true + }, + "obliterator": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz", + "integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==" + }, + "on-exit-leak-free": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", + "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "requires": { + "mimic-fn": "^4.0.0" + } + }, + "open": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", + "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", + "dev": true, + "requires": { + "default-browser": "^4.0.0", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^2.2.0" + } + }, + "optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "requires": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + } + }, + "p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==" + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "pino": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/pino/-/pino-8.17.1.tgz", + "integrity": "sha512-YoN7/NJgnsJ+fkADZqjhRt96iepWBndQHeClmSBH0sQWCb8zGD74t00SK4eOtKFi/f8TUmQnfmgglEhd2kI1RQ==", + "requires": { + "atomic-sleep": "^1.0.0", + "fast-redact": "^3.1.1", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "v1.1.0", + "pino-std-serializers": "^6.0.0", + "process-warning": "^2.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^3.7.0", + "thread-stream": "^2.0.0" + }, + "dependencies": { + "process-warning": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-2.3.2.tgz", + "integrity": "sha512-n9wh8tvBe5sFmsqlg+XQhaQLumwpqoAUruLwjCopgTmUBjJ/fjtBsJzKleCaIGBOMXYEhp1YfKl4d7rJ5ZKJGA==" + } + } + }, + "pino-abstract-transport": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.1.0.tgz", + "integrity": "sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA==", + "requires": { + "readable-stream": "^4.0.0", + "split2": "^4.0.0" + } + }, + "pino-std-serializers": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.2.2.tgz", + "integrity": "sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==" + }, + "plist": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", + "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", + "dev": true, + "requires": { + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + } + }, + "prebuild-install": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", + "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", + "requires": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + } + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "prettier": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.1.tgz", + "integrity": "sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==", + "dev": true + }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==" + }, + "process-warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-3.0.0.tgz", + "integrity": "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==" + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" + }, + "promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "requires": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + } + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==" + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" + }, + "quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==" + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==" + } + } + }, + "read-config-file": { + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-6.3.2.tgz", + "integrity": "sha512-M80lpCjnE6Wt6zb98DoW8WHR09nzMSpu8XHtPkiTHrJ5Az9CybfeQhTJ8D7saeBHpGhLPIVyA8lcL6ZmdKwY6Q==", + "dev": true, + "requires": { + "config-file-ts": "^0.2.4", + "dotenv": "^9.0.2", + "dotenv-expand": "^5.1.0", + "js-yaml": "^4.1.0", + "json5": "^2.2.0", + "lazy-val": "^1.0.4" + } + }, + "readable-stream": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.1.tgz", + "integrity": "sha512-uQjbf34vmf/asGnOHQEw07Q4llgMACQZTWWa4MmICS0IKJoHbLwKCy71H3eR99Dw5iYejc6W+pqZZEeqRtUFAw==", + "requires": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "dependencies": { + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + } + } + }, + "real-require": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", + "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==" + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" + }, + "resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "requires": { + "lowercase-keys": "^2.0.0" + } + }, + "ret": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.2.2.tgz", + "integrity": "sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==" + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + }, + "rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "roarr": { + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", + "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", + "optional": true, + "requires": { + "boolean": "^3.0.1", + "detect-node": "^2.0.4", + "globalthis": "^1.0.1", + "json-stringify-safe": "^5.0.1", + "semver-compare": "^1.0.0", + "sprintf-js": "^1.1.2" + } + }, + "run-applescript": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", + "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", + "dev": true, + "requires": { + "execa": "^5.0.0" + }, + "dependencies": { + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + } + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "safe-regex2": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-2.0.0.tgz", + "integrity": "sha512-PaUSFsUaNNuKwkBijoAPHAK6/eM6VirvyPWlZ7BAQy4D+hCvh4B6lIG+nPdhbFfIbP+gTGBcrdsOaUs0F+ZBOQ==", + "requires": { + "ret": "~0.2.0" + } + }, + "safe-stable-stringify": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", + "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sanitize-filename": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", + "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", + "dev": true, + "requires": { + "truncate-utf8-bytes": "^1.0.0" + } + }, + "sax": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", + "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==", + "dev": true + }, + "secure-json-parse": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", + "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==" + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "optional": true + }, + "serialize-error": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", + "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", + "optional": true, + "requires": { + "type-fest": "^0.13.1" + }, + "dependencies": { + "type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "optional": true + } + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, + "set-cookie-parser": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz", + "integrity": "sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==" + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" + }, + "simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "requires": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "requires": { + "semver": "^7.5.3" + }, + "dependencies": { + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "optional": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, + "smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "optional": true + }, + "sonic-boom": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.7.0.tgz", + "integrity": "sha512-IudtNvSqA/ObjN97tfgNmOKyDOs4dNcg4cUUsHDebqsgb8wGBBwb31LIgShNO8fye0dFI52X1+tFoKKI6Rq1Gg==", + "requires": { + "atomic-sleep": "^1.0.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==" + }, + "sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "optional": true + }, + "stat-mode": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz", + "integrity": "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==", + "dev": true + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "sumchecker": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", + "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", + "requires": { + "debug": "^4.1.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "synckit": { + "version": "0.8.6", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.6.tgz", + "integrity": "sha512-laHF2savN6sMeHCjLRkheIU4wo3Zg9Ln5YOjOo7sZ5dVQW8yF5pPE5SIw1dsPhq3TRp1jisKRCdPhfs/1WMqDA==", + "dev": true, + "requires": { + "@pkgr/utils": "^2.4.2", + "tslib": "^2.6.2" + } + }, + "tar": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", + "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + } + }, + "tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "requires": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + }, + "dependencies": { + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + } + } + }, + "tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "temp-file": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.4.0.tgz", + "integrity": "sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==", + "dev": true, + "requires": { + "async-exit-hook": "^2.0.1", + "fs-extra": "^10.0.0" + }, + "dependencies": { + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "thread-stream": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-2.4.1.tgz", + "integrity": "sha512-d/Ex2iWd1whipbT681JmTINKw0ZwOUBZm7+Gjs64DHuX34mmw8vJL2bFAaNacaW72zYiTJxSHi5abUuOi5nsfg==", + "requires": { + "real-require": "^0.2.0" + } + }, + "titleize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", + "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", + "dev": true + }, + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "requires": { + "rimraf": "^3.0.0" + } + }, + "tmp-promise": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", + "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", + "dev": true, + "requires": { + "tmp": "^0.2.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "toad-cache": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/toad-cache/-/toad-cache-3.4.1.tgz", + "integrity": "sha512-T0m3MxP3wcqW0LaV3dF1mHBU294sgYSm4FOpa5eEJaYO7PqJZBOjZEQI1y4YaKNnih1FXCEYTWDS9osCoTUefg==" + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + }, + "truncate-utf8-bytes": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", + "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", + "dev": true, + "requires": { + "utf8-byte-length": "^1.0.1" + } + }, + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true + }, + "undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + }, + "untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "requires": { + "punycode": "^2.1.0" + } + }, + "url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==" + }, + "utf8-byte-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", + "integrity": "sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" + }, + "verror": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz", + "integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + }, + "wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "requires": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "xmlbuilder": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", + "dev": true + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "requires": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + } + }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==" + }, + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..87f7ee8 --- /dev/null +++ b/package.json @@ -0,0 +1,43 @@ +{ + "name": "pacsnode", + "version": "1.0.0", + "description": "A minimal Electron application", + "main": "./src/main.js", + "author": "example.com", + "homepage": "https://www.electronjs.org", + "scripts": { + "format": "prettier --write .", + "lint": "eslint --ext .js .", + "dev": "electron .", + "postinstall": "electron-builder install-app-deps", + "build:win": "electron-builder --win --config", + "build:mac": "electron-builder --mac --config", + "build:linux": "electron-builder --linux --config" + }, + "dependencies": { + "@electron-toolkit/preload": "^2.0.0", + "@electron-toolkit/utils": "^2.0.0", + "@fastify/autoload": "^5.8.0", + "@fastify/cors": "^8.4.1", + "@fastify/helmet": "^11.1.1", + "@fastify/sensible": "^5.5.0", + "@fastify/static": "^6.12.0", + "@iwharris/dicom-data-dictionary": "^1.26.0", + "dicom-data-dictionary": "^0.3.1", + "dicom-dimse-native": "^2.4.2", + "dicom-parser": "^1.8.21", + "electron-log": "^5.0.1", + "electron-server": "^0.2.0", + "fastify": "^4.25.1", + "fs-walk": "^0.0.2", + "shelljs": "^0.8.5" + }, + "devDependencies": { + "@electron-toolkit/eslint-config": "^1.0.1", + "@electron-toolkit/eslint-config-prettier": "^1.0.1", + "electron": "^25.6.0", + "electron-builder": "^24.6.3", + "eslint": "^8.47.0", + "prettier": "^3.0.2" + } +} diff --git a/resources/12.bundle.81eef81badc8d1242199.js b/resources/12.bundle.81eef81badc8d1242199.js new file mode 100644 index 0000000..8a6d9b7 --- /dev/null +++ b/resources/12.bundle.81eef81badc8d1242199.js @@ -0,0 +1,2 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[12],{85012:(e,n,s)=>{s.r(n),s.d(n,{default:()=>u});var t=s(43001);const a=JSON.parse('{"u2":"@ohif/extension-dicom-video"}').u2,r=`${a}.sopClassHandlerModule.dicom-video`;var i=s(71771);const _={VIDEO_MICROSCOPIC_IMAGE_STORAGE:"1.2.840.10008.5.1.4.1.1.77.1.2.1",VIDEO_PHOTOGRAPHIC_IMAGE_STORAGE:"1.2.840.10008.5.1.4.1.1.77.1.4.1",VIDEO_ENDOSCOPIC_IMAGE_STORAGE:"1.2.840.10008.5.1.4.1.1.77.1.1.1",SECONDARY_CAPTURE_IMAGE_STORAGE:"1.2.840.10008.5.1.4.1.1.7",MULTIFRAME_TRUE_COLOR_SECONDARY_CAPTURE_IMAGE_STORAGE:"1.2.840.10008.5.1.4.1.1.7.4"},I=Object.values(_),E=[_.SECONDARY_CAPTURE_IMAGE_STORAGE,_.MULTIFRAME_TRUE_COLOR_SECONDARY_CAPTURE_IMAGE_STORAGE],O=Object.values({MPEG4_AVC_264_HIGH_PROFILE:"1.2.840.10008.1.2.4.102",MPEG4_AVC_264_BD_COMPATIBLE_HIGH_PROFILE:"1.2.840.10008.1.2.4.103",MPEG4_AVC_264_HIGH_PROFILE_FOR_2D_VIDEO:"1.2.840.10008.1.2.4.104",MPEG4_AVC_264_HIGH_PROFILE_FOR_3D_VIDEO:"1.2.840.10008.1.2.4.105",MPEG4_AVC_264_STEREO_HIGH_PROFILE:"1.2.840.10008.1.2.4.106",HEVC_265_MAIN_PROFILE:"1.2.840.10008.1.2.4.107",HEVC_265_MAIN_10_PROFILE:"1.2.840.10008.1.2.4.108"});function l(){return l=Object.assign?Object.assign.bind():function(e){for(var n=1;ns.e(686).then(s.bind(s,39686)))),o=e=>t.createElement(t.Suspense,{fallback:t.createElement("div",null,"Loading...")},t.createElement(c,e));const u={id:a,getViewportModule(e){let{servicesManager:n,extensionManager:s}=e;return[{name:"dicom-video",component:e=>t.createElement(o,l({servicesManager:n,extensionManager:s},e))}]},getSopClassHandlerModule:function(e){let{servicesManager:n,extensionManager:s}=e;return[{name:"dicom-video",sopClassUids:I,getDisplaySetsFromSeries:e=>((e,n,s)=>{const t=s.getActiveDataSource()[0];return e.filter((e=>{const n=e.AvailableTransferSyntaxUID||e.TransferSyntaxUID||e["00083002"];return!!O.includes(n)||e.SOPClassUID===_.VIDEO_PHOTOGRAPHIC_IMAGE_STORAGE||E.includes(e.SOPClassUID)&&e.NumberOfFrames>=90})).map((e=>{const{Modality:n,SOPInstanceUID:s,SeriesDescription:a="VIDEO"}=e,{SeriesNumber:_,SeriesDate:E,SeriesInstanceUID:O,StudyInstanceUID:l,NumberOfFrames:c}=e;return{Modality:n,displaySetInstanceUID:i.utils.guid(),SeriesDescription:a,SeriesNumber:_,SeriesDate:E,SOPInstanceUID:s,SeriesInstanceUID:O,StudyInstanceUID:l,SOPClassHandlerId:r,referencedImages:null,measurements:null,videoUrl:t.retrieve.directURL({instance:e,singlepart:"video",tag:"PixelData"}),instances:[e],thumbnailSrc:t.retrieve.directURL({instance:e,defaultPath:"/thumbnail",defaultType:"image/jpeg",tag:"Absent"}),isDerivedDisplaySet:!0,isLoaded:!1,sopClassUids:I,numImageFrames:c,instance:e}}))})(e,0,s)}]}}}}]); +//# sourceMappingURL=12.bundle.81eef81badc8d1242199.js.map \ No newline at end of file diff --git a/resources/12.bundle.81eef81badc8d1242199.js.map b/resources/12.bundle.81eef81badc8d1242199.js.map new file mode 100644 index 0000000..41c4818 --- /dev/null +++ b/resources/12.bundle.81eef81badc8d1242199.js.map @@ -0,0 +1 @@ +{"version":3,"file":"12.bundle.81eef81badc8d1242199.js","mappings":"sIAEMA,E,mDAAKC,GACLC,EAAqB,GAAEF,sC,eCA7B,MAAMG,EAAiB,CACrBC,gCAAiC,mCACjCC,iCAAkC,mCAClCC,+BAAgC,mCAEhCC,gCAAiC,4BACjCC,sDAAuD,+BAGnDC,EAAeC,OAAOC,OAAOR,GAC7BS,EAA+B,CACnCT,EAAeI,gCACfJ,EAAeK,uDAaXK,EAA8BH,OAAOC,OAVT,CAChCG,2BAA4B,0BAC5BC,yCAA0C,0BAC1CC,wCAAyC,0BACzCC,wCAAyC,0BACzCC,kCAAmC,0BACnCC,sBAAuB,0BACvBC,yBAA0B,4B,oOCrB5B,MAAMC,EAAYC,EAAAA,MAAW,IACpB,iCAGHC,EAA+BC,GAEjCF,EAAAA,cAACA,EAAAA,SAAc,CAACG,SAAUH,EAAAA,cAAA,WAAK,eAC7BA,EAAAA,cAACD,EAAcG,IA6DrB,QArD4B,CAI1BxB,GAAE,EAQF0B,iBAAAA,CAAiBC,GAAwC,IAAvC,gBAAEC,EAAe,iBAAEC,GAAkBF,EAWrD,MAAO,CAAC,CAAEG,KAAM,cAAeC,UAVcP,GAEzCF,EAAAA,cAACC,EAA4BS,EAAA,CAC3BJ,gBAAiBA,EACjBC,iBAAkBA,GACdL,KAMZ,EAcAS,yBDiCa,SAAiCN,GAAwC,IAAvC,gBAAEC,EAAe,iBAAEC,GAAkBF,EAKpF,MAAO,CACL,CACEG,KAAM,cACNrB,eACAyB,yBAR6BC,GA7DDC,EAACD,EAAWP,EAAiBC,KAC7D,MAAMQ,EAAaR,EAAiBS,sBAAsB,GAC1D,OAAOH,EACJI,QAAOC,IACN,MAAMC,EACJD,EAASE,4BAA8BF,EAASG,mBAAqBH,EAAS,YAEhF,QAAI3B,EAA4B+B,SAASH,IAIrCD,EAASK,cAAgB1C,EAAeE,kCAO1CO,EAA6BgC,SAASJ,EAASK,cAAgBL,EAASM,gBAAkB,EAAE,IAG/FC,KAAIC,IACH,MAAM,SAAEC,EAAQ,eAAEC,EAAc,kBAAEC,EAAoB,SAAYH,GAC5D,aAAEI,EAAY,WAAEC,EAAU,kBAAEC,EAAiB,iBAAEC,EAAgB,eAAET,GACrEE,EAgCF,MA/BmB,CAEjBC,WACAO,sBAAuBC,EAAAA,MAAMC,OAC7BP,oBACAC,eACAC,aACAH,iBACAI,oBACAC,mBACArD,kBAAiB,EACjByD,iBAAkB,KAClBC,aAAc,KACdC,SAAUxB,EAAWyB,SAASC,UAAU,CACtCf,WACAgB,WAAY,QACZC,IAAK,cAEP9B,UAAW,CAACa,GACZkB,aAAc7B,EAAWyB,SAASC,UAAU,CAC1Cf,WACAmB,YAAa,aACbC,YAAa,aACbH,IAAK,WAEPI,qBAAqB,EACrBC,UAAU,EACV7D,eACA8D,eAAgBzB,EAChBE,WAEe,GACjB,EAKKZ,CAA0BD,EAAWP,EAAiBC,IAUjE,E","sources":["webpack:///../../../extensions/dicom-video/src/id.js","webpack:///../../../extensions/dicom-video/src/getSopClassHandlerModule.js","webpack:///../../../extensions/dicom-video/src/index.tsx"],"sourcesContent":["import packageJson from '../package.json';\r\n\r\nconst id = packageJson.name;\r\nconst SOPClassHandlerId = `${id}.sopClassHandlerModule.dicom-video`;\r\n\r\nexport { SOPClassHandlerId, id };\r\n","import { SOPClassHandlerId } from './id';\r\nimport { utils } from '@ohif/core';\r\n\r\nconst SOP_CLASS_UIDS = {\r\n VIDEO_MICROSCOPIC_IMAGE_STORAGE: '1.2.840.10008.5.1.4.1.1.77.1.2.1',\r\n VIDEO_PHOTOGRAPHIC_IMAGE_STORAGE: '1.2.840.10008.5.1.4.1.1.77.1.4.1',\r\n VIDEO_ENDOSCOPIC_IMAGE_STORAGE: '1.2.840.10008.5.1.4.1.1.77.1.1.1',\r\n /** Need to use fallback, could be video or image */\r\n SECONDARY_CAPTURE_IMAGE_STORAGE: '1.2.840.10008.5.1.4.1.1.7',\r\n MULTIFRAME_TRUE_COLOR_SECONDARY_CAPTURE_IMAGE_STORAGE: '1.2.840.10008.5.1.4.1.1.7.4',\r\n};\r\n\r\nconst sopClassUids = Object.values(SOP_CLASS_UIDS);\r\nconst secondaryCaptureSopClassUids = [\r\n SOP_CLASS_UIDS.SECONDARY_CAPTURE_IMAGE_STORAGE,\r\n SOP_CLASS_UIDS.MULTIFRAME_TRUE_COLOR_SECONDARY_CAPTURE_IMAGE_STORAGE,\r\n];\r\n\r\nconst SupportedTransferSyntaxes = {\r\n MPEG4_AVC_264_HIGH_PROFILE: '1.2.840.10008.1.2.4.102',\r\n MPEG4_AVC_264_BD_COMPATIBLE_HIGH_PROFILE: '1.2.840.10008.1.2.4.103',\r\n MPEG4_AVC_264_HIGH_PROFILE_FOR_2D_VIDEO: '1.2.840.10008.1.2.4.104',\r\n MPEG4_AVC_264_HIGH_PROFILE_FOR_3D_VIDEO: '1.2.840.10008.1.2.4.105',\r\n MPEG4_AVC_264_STEREO_HIGH_PROFILE: '1.2.840.10008.1.2.4.106',\r\n HEVC_265_MAIN_PROFILE: '1.2.840.10008.1.2.4.107',\r\n HEVC_265_MAIN_10_PROFILE: '1.2.840.10008.1.2.4.108',\r\n};\r\n\r\nconst supportedTransferSyntaxUIDs = Object.values(SupportedTransferSyntaxes);\r\n\r\nconst _getDisplaySetsFromSeries = (instances, servicesManager, extensionManager) => {\r\n const dataSource = extensionManager.getActiveDataSource()[0];\r\n return instances\r\n .filter(metadata => {\r\n const tsuid =\r\n metadata.AvailableTransferSyntaxUID || metadata.TransferSyntaxUID || metadata['00083002'];\r\n\r\n if (supportedTransferSyntaxUIDs.includes(tsuid)) {\r\n return true;\r\n }\r\n\r\n if (metadata.SOPClassUID === SOP_CLASS_UIDS.VIDEO_PHOTOGRAPHIC_IMAGE_STORAGE) {\r\n return true;\r\n }\r\n\r\n // Assume that an instance with one of the secondary capture SOPClassUIDs and\r\n // with at least 90 frames (i.e. typically 3 seconds of video) is indeed a video.\r\n return (\r\n secondaryCaptureSopClassUids.includes(metadata.SOPClassUID) && metadata.NumberOfFrames >= 90\r\n );\r\n })\r\n .map(instance => {\r\n const { Modality, SOPInstanceUID, SeriesDescription = 'VIDEO' } = instance;\r\n const { SeriesNumber, SeriesDate, SeriesInstanceUID, StudyInstanceUID, NumberOfFrames } =\r\n instance;\r\n const displaySet = {\r\n //plugin: id,\r\n Modality,\r\n displaySetInstanceUID: utils.guid(),\r\n SeriesDescription,\r\n SeriesNumber,\r\n SeriesDate,\r\n SOPInstanceUID,\r\n SeriesInstanceUID,\r\n StudyInstanceUID,\r\n SOPClassHandlerId,\r\n referencedImages: null,\r\n measurements: null,\r\n videoUrl: dataSource.retrieve.directURL({\r\n instance,\r\n singlepart: 'video',\r\n tag: 'PixelData',\r\n }),\r\n instances: [instance],\r\n thumbnailSrc: dataSource.retrieve.directURL({\r\n instance,\r\n defaultPath: '/thumbnail',\r\n defaultType: 'image/jpeg',\r\n tag: 'Absent',\r\n }),\r\n isDerivedDisplaySet: true,\r\n isLoaded: false,\r\n sopClassUids,\r\n numImageFrames: NumberOfFrames,\r\n instance,\r\n };\r\n return displaySet;\r\n });\r\n};\r\n\r\nexport default function getSopClassHandlerModule({ servicesManager, extensionManager }) {\r\n const getDisplaySetsFromSeries = instances => {\r\n return _getDisplaySetsFromSeries(instances, servicesManager, extensionManager);\r\n };\r\n\r\n return [\r\n {\r\n name: 'dicom-video',\r\n sopClassUids,\r\n getDisplaySetsFromSeries,\r\n },\r\n ];\r\n}\r\n","import React from 'react';\r\nimport getSopClassHandlerModule from './getSopClassHandlerModule';\r\nimport { id } from './id';\r\n\r\nconst Component = React.lazy(() => {\r\n return import(/* webpackPrefetch: true */ './viewports/OHIFCornerstoneVideoViewport');\r\n});\r\n\r\nconst OHIFCornerstoneVideoViewport = props => {\r\n return (\r\n Loading...}>\r\n \r\n \r\n );\r\n};\r\n\r\n/**\r\n *\r\n */\r\nconst dicomVideoExtension = {\r\n /**\r\n * Only required property. Should be a unique value across all extensions.\r\n */\r\n id,\r\n\r\n /**\r\n *\r\n *\r\n * @param {object} [configuration={}]\r\n * @param {object|array} [configuration.csToolsConfig] - Passed directly to `initCornerstoneTools`\r\n */\r\n getViewportModule({ servicesManager, extensionManager }) {\r\n const ExtendedOHIFCornerstoneVideoViewport = props => {\r\n return (\r\n \r\n );\r\n };\r\n\r\n return [{ name: 'dicom-video', component: ExtendedOHIFCornerstoneVideoViewport }];\r\n },\r\n // getCommandsModule({ servicesManager }) {\r\n // return {\r\n // definitions: {\r\n // setToolActive: {\r\n // commandFn: ({ toolName, element }) => {\r\n // },\r\n // storeContexts: [],\r\n // options: {},\r\n // },\r\n // },\r\n // defaultContext: 'ACTIVE_VIEWPORT::VIDEO',\r\n // };\r\n // },\r\n getSopClassHandlerModule,\r\n};\r\n\r\nfunction _getToolAlias(toolName) {\r\n let toolAlias = toolName;\r\n\r\n switch (toolName) {\r\n case 'EllipticalRoi':\r\n toolAlias = 'SREllipticalRoi';\r\n break;\r\n }\r\n\r\n return toolAlias;\r\n}\r\n\r\nexport default dicomVideoExtension;\r\n"],"names":["id","packageJson","SOPClassHandlerId","SOP_CLASS_UIDS","VIDEO_MICROSCOPIC_IMAGE_STORAGE","VIDEO_PHOTOGRAPHIC_IMAGE_STORAGE","VIDEO_ENDOSCOPIC_IMAGE_STORAGE","SECONDARY_CAPTURE_IMAGE_STORAGE","MULTIFRAME_TRUE_COLOR_SECONDARY_CAPTURE_IMAGE_STORAGE","sopClassUids","Object","values","secondaryCaptureSopClassUids","supportedTransferSyntaxUIDs","MPEG4_AVC_264_HIGH_PROFILE","MPEG4_AVC_264_BD_COMPATIBLE_HIGH_PROFILE","MPEG4_AVC_264_HIGH_PROFILE_FOR_2D_VIDEO","MPEG4_AVC_264_HIGH_PROFILE_FOR_3D_VIDEO","MPEG4_AVC_264_STEREO_HIGH_PROFILE","HEVC_265_MAIN_PROFILE","HEVC_265_MAIN_10_PROFILE","Component","React","OHIFCornerstoneVideoViewport","props","fallback","getViewportModule","_ref","servicesManager","extensionManager","name","component","_extends","getSopClassHandlerModule","getDisplaySetsFromSeries","instances","_getDisplaySetsFromSeries","dataSource","getActiveDataSource","filter","metadata","tsuid","AvailableTransferSyntaxUID","TransferSyntaxUID","includes","SOPClassUID","NumberOfFrames","map","instance","Modality","SOPInstanceUID","SeriesDescription","SeriesNumber","SeriesDate","SeriesInstanceUID","StudyInstanceUID","displaySetInstanceUID","utils","guid","referencedImages","measurements","videoUrl","retrieve","directURL","singlepart","tag","thumbnailSrc","defaultPath","defaultType","isDerivedDisplaySet","isLoaded","numImageFrames"],"sourceRoot":""} \ No newline at end of file diff --git a/resources/125.bundle.629517ff1af1a958ddc9.js b/resources/125.bundle.629517ff1af1a958ddc9.js new file mode 100644 index 0000000..88726c2 --- /dev/null +++ b/resources/125.bundle.629517ff1af1a958ddc9.js @@ -0,0 +1,2 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[125],{39125:(e,t,l)=>{l.r(t),l.d(t,{default:()=>i});var a=l(43001),s=l(3827),n=l.n(s);function r(e){let{displaySets:t}=e;const[l,s]=(0,a.useState)(null);if(t&&t.length>1)throw new Error("OHIFCornerstonePdfViewport: only one display set is supported for dicom pdf right now");const{pdfUrl:n}=t[0];return(0,a.useEffect)((()=>{(async()=>{s(await n)})()}),[n]),a.createElement("div",{className:"bg-primary-black h-full w-full text-white"},a.createElement("object",{data:l,type:"application/pdf",className:"h-full w-full"},a.createElement("div",null,"No online PDF viewer installed")))}r.propTypes={displaySets:n().arrayOf(n().object).isRequired};const i=r}}]); +//# sourceMappingURL=125.bundle.629517ff1af1a958ddc9.js.map \ No newline at end of file diff --git a/resources/125.bundle.629517ff1af1a958ddc9.js.map b/resources/125.bundle.629517ff1af1a958ddc9.js.map new file mode 100644 index 0000000..acef7a1 --- /dev/null +++ b/resources/125.bundle.629517ff1af1a958ddc9.js.map @@ -0,0 +1 @@ +{"version":3,"file":"125.bundle.629517ff1af1a958ddc9.js","mappings":"oJAGA,SAASA,EAA0BC,GAAkB,IAAjB,YAAEC,GAAaD,EACjD,MAAOE,EAAKC,IAAUC,EAAAA,EAAAA,UAAS,MAE/B,GAAIH,GAAeA,EAAYI,OAAS,EACtC,MAAM,IAAIC,MACR,yFAIJ,MAAM,OAAEC,GAAWN,EAAY,GAU/B,OARAO,EAAAA,EAAAA,YAAU,KACKC,WACXN,QAAaI,EAAO,EAGtBG,EAAM,GACL,CAACH,IAGFI,EAAAA,cAAA,OAAKC,UAAU,6CACbD,EAAAA,cAAA,UACEE,KAAMX,EACNY,KAAK,kBACLF,UAAU,iBAEVD,EAAAA,cAAA,WAAK,mCAIb,CAEAZ,EAA2BgB,UAAY,CACrCd,YAAae,IAAAA,QAAkBA,IAAAA,QAAkBC,YAGnD,S","sources":["webpack:///../../../extensions/dicom-pdf/src/viewports/OHIFCornerstonePdfViewport.tsx"],"sourcesContent":["import React, { useEffect, useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nfunction OHIFCornerstonePdfViewport({ displaySets }) {\r\n const [url, setUrl] = useState(null);\r\n\r\n if (displaySets && displaySets.length > 1) {\r\n throw new Error(\r\n 'OHIFCornerstonePdfViewport: only one display set is supported for dicom pdf right now'\r\n );\r\n }\r\n\r\n const { pdfUrl } = displaySets[0];\r\n\r\n useEffect(() => {\r\n const load = async () => {\r\n setUrl(await pdfUrl);\r\n };\r\n\r\n load();\r\n }, [pdfUrl]);\r\n\r\n return (\r\n
\r\n \r\n
No online PDF viewer installed
\r\n \r\n
\r\n );\r\n}\r\n\r\nOHIFCornerstonePdfViewport.propTypes = {\r\n displaySets: PropTypes.arrayOf(PropTypes.object).isRequired,\r\n};\r\n\r\nexport default OHIFCornerstonePdfViewport;\r\n"],"names":["OHIFCornerstonePdfViewport","_ref","displaySets","url","setUrl","useState","length","Error","pdfUrl","useEffect","async","load","React","className","data","type","propTypes","PropTypes","isRequired"],"sourceRoot":""} \ No newline at end of file diff --git a/resources/181.bundle.720bf11ebdae9515747b.js b/resources/181.bundle.720bf11ebdae9515747b.js new file mode 100644 index 0000000..e5217d1 --- /dev/null +++ b/resources/181.bundle.720bf11ebdae9515747b.js @@ -0,0 +1,2 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[181],{86181:(e,t,n)=>{n.r(t),n.d(t,{default:()=>j});var r=n(43001),i=n(7023),o=n(3827),a=n.n(o),s=n(14957),l=n(3743),c=n(71771),m=n(71783),u=n(73704);function p(e){let{viewportData:t,viewportId:n,element:i,imageSliceData:o,setImageSliceData:a,scrollbarHeight:c,servicesManager:u}=e;const{cineService:p,cornerstoneViewportService:d}=u.services;return(0,r.useEffect)((()=>{if(!t)return;const e=d.getCornerstoneViewport(n);if(e)if(t.viewportType!==l.Enums.ViewportType.STACK){if(t.viewportType===l.Enums.ViewportType.ORTHOGRAPHIC){const t=l.utilities.getImageSliceDataForVolumeViewport(e);if(!t)return;const{imageIndex:n,numberOfSlices:r}=t;a({imageIndex:n,numberOfSlices:r})}}else{const n=e.getCurrentImageIdIndex();a({imageIndex:n,numberOfSlices:t.data.imageIds.length})}}),[n,t]),(0,r.useEffect)((()=>{if(t?.viewportType!==l.Enums.ViewportType.STACK)return;const e=e=>{const{newImageIdIndex:n}=e.detail;a({imageIndex:n,numberOfSlices:t.data.imageIds.length})};return i.addEventListener(l.Enums.Events.STACK_VIEWPORT_SCROLL,e),()=>{i.removeEventListener(l.Enums.Events.STACK_VIEWPORT_SCROLL,e)}}),[t,i]),(0,r.useEffect)((()=>{if(t?.viewportType!==l.Enums.ViewportType.ORTHOGRAPHIC)return;const e=e=>{const{imageIndex:t,numberOfSlices:n}=e.detail;a({imageIndex:t,numberOfSlices:n})};return i.addEventListener(l.Enums.Events.VOLUME_NEW_IMAGE,e),()=>{i.removeEventListener(l.Enums.Events.VOLUME_NEW_IMAGE,e)}}),[t,i]),r.createElement(m.Ln,{onChange:e=>((e,t)=>{const n=d.getCornerstoneViewport(t),{isCineEnabled:r}=p.getState();r&&(p.stopClip(i),p.setCine({id:t,isPlaying:!1})),s.utilities.jumpToSlice(n.element,{imageIndex:e,debounceLoading:!0})})(e,n),max:o.numberOfSlices?o.numberOfSlices-1:0,height:c,value:o.imageIndex})}p.propTypes={viewportData:a().object,viewportId:a().string.isRequired,element:a().instanceOf(Element),scrollbarHeight:a().string,imageSliceData:a().object.isRequired,setImageSliceData:a().func.isRequired,servicesManager:a().object.isRequired};const d=p;var v=n(45451),f=n(71271),E=n.n(f);function g(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;if(null!==e)return parseFloat(e).toFixed(t)}function I(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"MMM D, YYYY";return E()(e,"YYYYMMDD").format(t)}function w(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"HH:mm:ss";return E()(e,"HH:mm:ss").format(t)}function S(e){if(!e)return"";const t=e.split("^").filter((e=>!!e)).join(", ").trim();return","===t||""===t?"":t}const b=1e-4;function y(e){let{voi:t,customization:n}=e;const{windowWidth:i,windowCenter:o}=t;return"number"!=typeof o||"number"!=typeof i?null:r.createElement("div",{className:"overlay-item flex flex-row",style:{color:n&&n.color||void 0}},r.createElement("span",{className:"mr-1 shrink-0"},"W:"),r.createElement("span",{className:"ml-1 mr-2 shrink-0 font-light"},i.toFixed(0)),r.createElement("span",{className:"mr-1 shrink-0"},"L:"),r.createElement("span",{className:"ml-1 shrink-0 font-light"},o.toFixed(0)))}function T(e){let{scale:t,customization:n}=e;return r.createElement("div",{className:"overlay-item flex flex-row",style:{color:n&&n.color||void 0}},r.createElement("span",{className:"mr-1 shrink-0"},"Zoom:"),r.createElement("span",{className:"font-light"},t.toFixed(2),"x"))}function h(e){let{instanceNumber:t,imageSliceData:n,customization:i}=e;const{imageIndex:o,numberOfSlices:a}=n;return r.createElement("div",{className:"overlay-item flex flex-row",style:{color:i&&i.color||void 0}},r.createElement("span",{className:"mr-1 shrink-0"},"I:"),r.createElement("span",{className:"font-light"},null!=t?`${t} (${o+1}/${a})`:`${o+1}/${a}`))}function O(e){let{element:t,viewportData:n,imageSliceData:i,viewportId:o,servicesManager:a}=e;const{toolbarService:s,cornerstoneViewportService:c,customizationService:u}=a.services,[p,d]=(0,r.useState)({windowCenter:null,windowWidth:null}),[v,f]=(0,r.useState)(1),[E,b]=(0,r.useState)([]),{imageIndex:O}=i,D=u.getModeCustomization("cornerstoneOverlayTopLeft"),M=u.getModeCustomization("cornerstoneOverlayTopRight"),V=u.getModeCustomization("cornerstoneOverlayBottomLeft"),R=u.getModeCustomization("cornerstoneOverlayBottomRight"),N=(0,r.useMemo)((()=>null!=n?function(e,t){let n=null;if(e.viewportType===l.Enums.ViewportType.STACK)n=e.data.imageIds[t];else if(e.viewportType===l.Enums.ViewportType.ORTHOGRAPHIC){const r=e.data;if(r&&1==r.length){n=r[0].imageIds[t]}}return n&&l.metaData.get("instance",n)||{}}(n,O):null),[n,O]),L=(0,r.useMemo)((()=>null!=n?function(e,t,n,r){let i;if(e.viewportType===l.Enums.ViewportType.STACK){if(i=function(e,t){const n=e.data.imageIds,r=n[t];if(!r)return;const i=l.metaData.get("generalImageModule",r)||{},{instanceNumber:o}=i;if(n.length<=1)return;return parseInt(o)}(e,n),!i&&0!==i)return null}else e.viewportType===l.Enums.ViewportType.ORTHOGRAPHIC&&(i=C(e,n,t));return i}(n,o,O):null),[n,o,O,c]);(0,r.useEffect)((()=>{b(s.getActiveTools())}),[]),(0,r.useEffect)((()=>{const e=e=>{const{range:t}=e.detail;if(!t)return;const{lower:n,upper:r}=t,{windowWidth:i,windowCenter:o}=l.utilities.windowLevel.toWindowLevel(n,r);d({windowCenter:o,windowWidth:i})};return t.addEventListener(l.Enums.Events.VOI_MODIFIED,e),()=>{t.removeEventListener(l.Enums.Events.VOI_MODIFIED,e)}}),[o,n,p,t]),(0,r.useEffect)((()=>{const e=e=>{const{previousCamera:n,camera:r}=e.detail;if(n.parallelScale!==r.parallelScale||n.scale!==r.scale){const e=c.getCornerstoneViewport(o);if(!e)return;const n=e.getImageData();if(!n)return;if(r.scale)return void f(r.scale);const{spacing:i}=n,a=t.clientHeight*i[0]*.5/r.parallelScale;f(a)}};return t.addEventListener(l.Enums.Events.CAMERA_MODIFIED,e),()=>{t.removeEventListener(l.Enums.Events.CAMERA_MODIFIED,e)}}),[o,n,c,t]),(0,r.useEffect)((()=>{const{unsubscribe:e}=s.subscribe(s.EVENTS.TOOL_BAR_STATE_MODIFIED,(()=>{b(s.getActiveTools())}));return()=>{e()}}),[s]);const A=(0,r.useCallback)((e=>{const s={element:t,viewportData:n,imageSliceData:i,viewportId:o,servicesManager:a,customization:e,formatters:{formatPN:S,formatDate:I,formatTime:w,formatNumberPrecision:g},instance:N,voi:p,scale:v,instanceNumber:L};if("ohif.overlayItem.windowLevel"===e.customizationType)return r.createElement(y,s);if("ohif.overlayItem.zoomLevel"===e.customizationType)return r.createElement(T,s);if("ohif.overlayItem.instanceNumber"===e.customizationType)return r.createElement(h,s);{const t=u.transform(e);if("function"==typeof t.content)return t.content(s)}}),[t,n,i,o,a,u,N,p,v,L]),P=(0,r.useCallback)((()=>{const e=D?.items||[{id:"WindowLevel",customizationType:"ohif.overlayItem.windowLevel"}];return r.createElement(r.Fragment,null,e.map(((e,t)=>r.createElement("div",{key:`topLeftOverlayItem_${t}`},A(e)))))}),[D,A]),_=(0,r.useCallback)((()=>{const e=M?.items||[{id:"InstanceNmber",customizationType:"ohif.overlayItem.instanceNumber"}];return r.createElement(r.Fragment,null,e.map(((e,t)=>r.createElement("div",{key:`topRightOverlayItem_${t}`},A(e)))))}),[M,A]),x=(0,r.useCallback)((()=>{const e=V?.items||[];return r.createElement(r.Fragment,null,e.map(((e,t)=>r.createElement("div",{key:`bottomLeftOverlayItem_${t}`},A(e)))))}),[V,A]),k=(0,r.useCallback)((()=>{const e=R?.items||[];return r.createElement(r.Fragment,null,e.map(((e,t)=>r.createElement("div",{key:`bottomRightOverlayItem_${t}`},A(e)))))}),[R,A]);return r.createElement(m.No,{topLeft:P(),topRight:_(),bottomLeft:x(),bottomRight:k()})}function C(e,t,n){const r=e.volumes;if(!r||r.length>1)return;const i=r[0],{direction:o,imageIds:a}=i,s=n.getCornerstoneViewport(t);if(!s)return;const c=s.getCamera(),{viewPlaneNormal:m}=c,u=o.slice(6,9),p=v.R3.cross(v.R3.create(),m,u);if(v.R3.length(p){const e=e=>{const{rotation:t,previousCamera:n,camera:r}=e.detail;void 0!==t&&m(t),void 0!==r.flipHorizontal&&n.flipHorizontal!==r.flipHorizontal&&p(r.flipHorizontal),void 0!==r.flipVertical&&n.flipVertical!==r.flipVertical&&f(r.flipVertical)};return t.addEventListener(l.Enums.Events.CAMERA_MODIFIED,e),()=>{t.removeEventListener(l.Enums.Events.CAMERA_MODIFIED,e)}}),[]);const g=(0,r.useMemo)((()=>{if(!n)return"";let e,a;if("stack"===n.viewportType){const t=i.imageIndex,r=n.data.imageIds?.[t];if(!r)return!1;({rowCosines:e,columnCosines:a}=l.metaData.get("imagePlaneModule",r)||{})}else{if(!t||!(0,l.getEnabledElement)(t))return"";const{viewport:n}=(0,l.getEnabledElement)(t),{viewUp:r,viewPlaneNormal:i}=n.getCamera(),o=v.R3.create();v.R3.cross(o,r,i),a=[-r[0],-r[1],-r[2]],e=o}if(!e||!a||void 0===c)return"";const m=function(e,t,n,r,i){const o=R(e),a=R(t),s=N(o),l={top:N(a),left:s,right:o,bottom:a};r&&(l.top=N(l.top),l.bottom=N(l.bottom));i&&(l.left=N(l.left),l.right=N(l.right));if(90===n||-270===n)return{top:l.left,left:N(l.top),right:N(l.bottom),bottom:l.right};if(-90===n||270===n)return{top:N(l.left),left:l.top,bottom:l.left,right:l.bottom};if(180===n||-180===n)return{top:N(l.top),left:N(l.left),bottom:N(l.bottom),right:N(l.right)};return l}(e,a,c,d,u),p=E.getViewportInfo(o);if(!p)return console.log("ViewportOrientationMarkers::No viewport"),null;const f=p.getViewportOptions().background,g=!!f&&l.utilities.isEqual(f,[1,1,1]);return s.map(((e,t)=>r.createElement("div",{className:V()(`${e}-mid orientation-marker`,g?"text-[#726F7E]":"text-[#ccc]"),key:`${e}-mid orientation-marker`},r.createElement("div",{className:"orientation-marker-value"},m[e]))))}),[n,i,c,d,u,s,t]);return r.createElement("div",{className:"ViewportOrientationMarkers noselect"},g)}L.propTypes={percentComplete:a().number,error:a().object},L.defaultProps={percentComplete:0,error:null};const A=L;function P(e){let{viewportData:t,element:n}=e;const[i,o]=(0,r.useState)(!1),[a,s]=(0,r.useState)(!1),c=(0,r.useRef)(null),m=(0,r.useRef)(null),u=e=>{clearTimeout(c.current),c.current=setTimeout((()=>{o(!0)}),50)},p=e=>{clearTimeout(c.current),o(!1)},d=e=>{clearTimeout(c.current),m.current===e.detail.imageId&&(s(e.detail.error),m.current=null)};return(0,r.useEffect)((()=>(n.addEventListener(l.Enums.Events.STACK_VIEWPORT_SCROLL,u),n.addEventListener(l.Enums.Events.IMAGE_LOAD_ERROR,d),n.addEventListener(l.Enums.Events.STACK_NEW_IMAGE,p),()=>{n.removeEventListener(l.Enums.Events.STACK_VIEWPORT_SCROLL,u),n.removeEventListener(l.Enums.Events.STACK_NEW_IMAGE,p),n.removeEventListener(l.Enums.Events.IMAGE_LOAD_ERROR,d)})),[n,t]),a?r.createElement(r.Fragment,null,r.createElement("div",{className:"absolute top-0 left-0 h-full w-full bg-black opacity-50"},r.createElement("div",{className:"transparent flex h-full w-full items-center justify-center"},r.createElement("p",{className:"text-primary-light text-xl font-light"},r.createElement("h4",null,"Error Loading Image"),r.createElement("p",null,"An error has occurred."),r.createElement("p",null,a))))):i?r.createElement("div",{className:"pointer-events-none absolute top-0 left-0 h-full w-full bg-black opacity-50"},r.createElement("div",{className:"transparent flex h-full w-full items-center justify-center"},r.createElement("p",{className:"text-primary-light text-xl font-light"},"Loading..."))):null}P.propTypes={percentComplete:a().number,error:a().object,element:a().object},P.defaultProps={percentComplete:0,error:null};const _=P;const x=function(e){const{viewportId:t,element:n,scrollbarHeight:i,servicesManager:o}=e,{cornerstoneViewportService:a}=o.services,[s,l]=(0,r.useState)({imageIndex:0,numberOfSlices:0}),[c,m]=(0,r.useState)(null);if((0,r.useEffect)((()=>{const{unsubscribe:e}=a.subscribe(a.EVENTS.VIEWPORT_DATA_CHANGED,(e=>{e.viewportId===t&&m(e.viewportData)}));return()=>{e()}}),[t]),!n)return null;if(c){const e=a.getViewportInfo(t);if(e?.viewportOptions?.customViewportProps?.hideOverlays)return null}return r.createElement("div",{className:"noselect"},r.createElement(d,{viewportId:t,viewportData:c,element:n,imageSliceData:s,setImageSliceData:l,scrollbarHeight:i,servicesManager:o}),r.createElement(D,{imageSliceData:s,viewportData:c,viewportId:t,servicesManager:o,element:n}),r.createElement(_,{viewportData:c,element:n}),r.createElement(A,{imageSliceData:s,element:n,viewportData:c,servicesManager:o,viewportId:t}))};var k=n(87172);const H=function(e){let{enabledVPElement:t,viewportId:n,servicesManager:i}=e;const{toolbarService:o,customizationService:a}=i.services,[{isCineEnabled:s,cines:c},u]=(0,m.vQ)(),[{activeViewportId:p}]=(0,m.O_)(),{component:d=m.H6}=a.get("cinePlayer")??{},v=()=>{if(!c||!c[n]||!t)return;const e=c[n],r=e.isPlaying||!1,i=e.frameRate||24,o=Math.max(i,1);r?u.playClip(t,{framesPerSecond:o}):u.stopClip(t)};(0,r.useEffect)((()=>(l.eventTarget.addEventListener(l.Enums.Events.STACK_VIEWPORT_NEW_STACK,v),()=>{u.setCine({id:n,isPlaying:!1}),l.eventTarget.removeEventListener(l.Enums.Events.STACK_VIEWPORT_NEW_STACK,v)})),[t]),(0,r.useEffect)((()=>{if(c&&c[n]&&t)return v(),()=>{t&&c?.[n]?.isPlaying&&u.stopClip(t)}}),[c,n,u,t,v]);const f=c[n],E=f&&f.isPlaying||!1;return s&&r.createElement(d,{className:"absolute left-1/2 bottom-3 -translate-x-1/2",isPlaying:E,onClose:()=>{o.recordInteraction({groupId:"MoreTools",interactionType:"toggle",commands:[{commandName:"toggleCine",commandOptions:{},toolName:"cine",context:"CORNERSTONE"}]})},onPlayPauseChange:e=>u.setCine({id:p,isPlaying:e}),onFrameRateChange:e=>u.setCine({id:p,frameRate:e})})};let F;function G(e,t){if(t.needsRerendering)return!1;if(e.displaySets.length!==t.displaySets.length)return!1;if(e.viewportOptions.orientation!==t.viewportOptions.orientation)return!1;if(e.viewportOptions.toolGroupId!==t.viewportOptions.toolGroupId)return!1;if(e.viewportOptions.viewportType!==t.viewportOptions.viewportType)return!1;if(t.viewportOptions.needsRerendering)return!1;const n=e.displaySets,r=t.displaySets;if(n.length!==r.length)return!1;for(let e=0;ee.displaySetInstanceUID===t.displaySetInstanceUID));if(!i)return!1;if(i.images?.length!==t.images?.length)return!1;if(i.images?.length)for(let e=0;e{const{displaySets:t,dataSource:n,viewportOptions:o,displaySetOptions:a,servicesManager:p,commandsManager:d,onElementEnabled:v,onElementDisabled:f,isJumpToMeasurementDisabled:E,initialImageIndex:g}=e,I=o.viewportId,[w,S]=(0,r.useState)("100px"),[b,y]=(0,r.useState)(null),T=(0,r.useRef)(),{measurementService:h,displaySetService:O,toolbarService:C,toolGroupService:D,syncGroupService:M,cornerstoneViewportService:V,cornerstoneCacheService:R,viewportGridService:N,stateSyncService:L}=p.services,[A]=(0,m.en)(),P=(0,r.useCallback)((()=>{const e=T.current.clientHeight-20+"px";S(e)}),[T]),_=(0,r.useCallback)((()=>{T.current&&(V.resize(),P())}),[T]),k=(0,r.useCallback)((e=>{const t=e.getRenderingEngineId(),n=e.getSyncGroups();D.removeViewportFromToolGroup(I,t),M.removeViewportFromSyncGroup(I,t,n)}),[I]),G=(0,r.useCallback)((e=>{if(e.detail.element!==T.current)return;const{viewportId:t,element:n}=e.detail,r=V.getViewportInfo(t);(0,u.Yc)(t,n),y(n);const i=r.getRenderingEngineId(),o=r.getToolGroupId(),a=r.getSyncGroups();D.addViewportToToolGroup(t,i,o),M.addViewportToSyncGroup(t,i,a),v&&v(e)}),[I,v,D]);return(0,r.useEffect)((()=>(V.enableViewport(I,T.current),l.eventTarget.addEventListener(l.Enums.Events.ELEMENT_ENABLED,G),P(),()=>{const e=V.getViewportInfo(I);e&&(k(e),V.storePresentation({viewportId:I}),f&&f(e),l.eventTarget.removeEventListener(l.Enums.Events.ELEMENT_ENABLED,G))})),[]),(0,r.useEffect)((()=>{const{unsubscribe:e}=O.subscribe(O.EVENTS.DISPLAY_SET_SERIES_METADATA_INVALIDATED,(async e=>{let{displaySetInstanceUID:t,invalidateData:r}=e;if(!r)return;const i=V.getViewportInfo(I);if(i.hasDisplaySet(t)){const e=i.getViewportData(),r=await R.invalidateViewportData(e,t,n,O),o=!0;V.updateViewport(I,r,o)}}));return()=>{e()}}),[I]),(0,r.useEffect)((()=>{o.viewportType||(o.viewportType="stack");(async()=>{const e=await R.createViewportData(t,o,n,g),{lutPresentationStore:r,positionPresentationStore:i}=L.getState(),{presentationIds:l}=o,c={positionPresentation:i[l?.positionPresentationId],lutPresentation:r[l?.lutPresentationId]};let m;F?.viewportId===I&&(m=F.measurement,c.positionPresentation=null,F=null),o.needsRerendering&&(o.needsRerendering=!1),V.setViewportData(I,e,o,a,c),m&&s.annotation.selection.setAnnotationSelected(m.uid)})()}),[o,t,n]),(0,r.useEffect)((()=>{if(E)return;const e=function(e,t,n,r,i,o,a){const{unsubscribe:s}=e.subscribe(c.MeasurementService.EVENTS.JUMP_TO_MEASUREMENT_VIEWPORT,(i=>{F=i;const{viewportId:s,measurement:l,isConsumed:c}=i;l&&!c&&(void 0===F.cornerstoneViewport&&(F.cornerstoneViewport=a.getViewportIdToJump(s,l.displaySetInstanceUID,{referencedImageId:l.referencedImageId})),F.cornerstoneViewport===r&&W(l,n,r,e,t,o,a))}));return s}(h,O,T,I,0,N,V);return function(e,t,n,r,i,o,a){if(!F)return;if(F.isConsumed)return void(F=null);const s=i.map((e=>e.displaySetInstanceUID));if(!s?.length)return;const{measurement:l}=F;l&&n&&s.includes(l?.displaySetInstanceUID)&&W(l,n,r,e,t,o,a)}(h,O,T,I,t,N,V),()=>{e()}}),[t,T,I]),r.createElement(r.Fragment,null,r.createElement("div",{className:"viewport-wrapper"},r.createElement(i.ZP,{refreshMode:"debounce",refreshRate:50,onResize:_,targetRef:T.current}),r.createElement("div",{className:"cornerstone-viewport-element",style:{height:"100%",width:"100%"},onContextMenu:e=>e.preventDefault(),onMouseDown:e=>e.preventDefault(),ref:T}),r.createElement(x,{viewportId:I,toolBarService:C,element:T.current,scrollbarHeight:w,servicesManager:p}),r.createElement(H,{enabledVPElement:b,viewportId:I,servicesManager:p})),r.createElement("div",{className:"absolute w-full"},A.viewportId===I&&r.createElement(m.P_,{id:"viewport-notification",message:A.message,type:A.type,actions:A.actions,onSubmit:A.onSubmit,onOutsideClick:A.onOutsideClick})))}),G);function W(e,t,n,r,i,o,a){const c=t.current,{displaySetInstanceUID:m,SOPInstanceUID:u,frameNumber:p}=e;if(!u)return void console.warn("cannot jump in a non-acquisition plane measurements yet");const d=i.getDisplaySetByUID(m);o.setActiveViewportId(n);const v=(0,l.getEnabledElement)(c);if(v){const t=v.viewport;let n=0,r=!0;if(t instanceof l.StackViewport){n=t.getImageIds().findIndex((e=>{const{SOPInstanceUID:t,frameNumber:n}=(0,k.Z)(e);return t===u&&(!p||p===n)}))}else{const{viewPlaneNormal:i}=e.metadata;n=d.images.findIndex((e=>e.SOPInstanceUID===u));const{viewPlaneNormal:o}=t.getCamera();i&&!l.utilities.isEqual(i.map(Math.abs),o.map(Math.abs))&&(r=!1)}if(!r||-1===n)return;s.utilities.jumpToSlice(c,{imageIndex:n}),s.annotation.selection.setAnnotationSelected(e.uid),F?.consume?.(),F=null}}z.displayName="OHIFCornerstoneViewport",z.defaultProps={isJumpToMeasurementDisabled:!1},z.propTypes={displaySets:a().array.isRequired,dataSource:a().object.isRequired,viewportOptions:a().object,displaySetOptions:a().arrayOf(a().any),servicesManager:a().object.isRequired,onElementEnabled:a().func,isJumpToMeasurementDisabled:a().bool,initialImageIdOrIndex:a().oneOfType([a().string,a().number])};const j=z}}]); +//# sourceMappingURL=181.bundle.720bf11ebdae9515747b.js.map \ No newline at end of file diff --git a/resources/181.bundle.720bf11ebdae9515747b.js.map b/resources/181.bundle.720bf11ebdae9515747b.js.map new file mode 100644 index 0000000..d69c7bc --- /dev/null +++ b/resources/181.bundle.720bf11ebdae9515747b.js.map @@ -0,0 +1 @@ +{"version":3,"file":"181.bundle.720bf11ebdae9515747b.js","mappings":"oNAOA,SAASA,EAAyBC,GAQ/B,IARgC,aACjCC,EAAY,WACZC,EAAU,QACVC,EAAO,eACPC,EAAc,kBACdC,EAAiB,gBACjBC,EAAe,gBACfC,GACDP,EACC,MAAM,YAAEQ,EAAW,2BAAEC,GAAgCF,EAAmCG,SA8FxF,OA3EAC,EAAAA,EAAAA,YAAU,KACR,IAAKV,EACH,OAGF,MAAMW,EAAWH,EAA2BI,uBAAuBX,GAEnE,GAAKU,EAIL,GAAIX,EAAaa,eAAiBC,EAAAA,MAAAA,aAAmBC,OAWrD,GAAIf,EAAaa,eAAiBC,EAAAA,MAAAA,aAAmBE,aAAc,CACjE,MAAMC,EAAYC,EAAAA,UAAAA,mCAChBP,GAGF,IAAKM,EACH,OAGF,MAAM,WAAEE,EAAU,eAAEC,GAAmBH,EACvCb,EAAkB,CAAEe,aAAYC,kBAClC,MAtBA,CACE,MAAMD,EAAaR,EAASU,yBAE5BjB,EAAkB,CAChBe,WAAYA,EACZC,eAAgBpB,EAAasB,KAAKC,SAASC,QAI/C,CAaA,GACC,CAACvB,EAAYD,KAEhBU,EAAAA,EAAAA,YAAU,KACR,GAAIV,GAAca,eAAiBC,EAAAA,MAAAA,aAAmBC,MACpD,OAGF,MAAMU,EAAmBC,IACvB,MAAM,gBAAEC,GAAoBD,EAAME,OAElCxB,EAAkB,CAChBe,WAAYQ,EACZP,eAAgBpB,EAAasB,KAAKC,SAASC,QAC3C,EAKJ,OAFAtB,EAAQ2B,iBAAiBf,EAAAA,MAAAA,OAAagB,sBAAuBL,GAEtD,KACLvB,EAAQ6B,oBAAoBjB,EAAAA,MAAAA,OAAagB,sBAAuBL,EAAiB,CAClF,GACA,CAACzB,EAAcE,KAElBQ,EAAAA,EAAAA,YAAU,KACR,GAAIV,GAAca,eAAiBC,EAAAA,MAAAA,aAAmBE,aACpD,OAGF,MAAMgB,EAAoBN,IACxB,MAAM,WAAEP,EAAU,eAAEC,GAAmBM,EAAME,OAE7CxB,EAAkB,CAAEe,aAAYC,kBAAiB,EAKnD,OAFAlB,EAAQ2B,iBAAiBf,EAAAA,MAAAA,OAAamB,iBAAkBD,GAEjD,KACL9B,EAAQ6B,oBAAoBjB,EAAAA,MAAAA,OAAamB,iBAAkBD,EAAkB,CAC9E,GACA,CAAChC,EAAcE,IAGhBgC,EAAAA,cAACC,EAAAA,GAAc,CACbC,SAAUC,GA9FiBC,EAACnB,EAAYlB,KAC1C,MAAMU,EAAWH,EAA2BI,uBAAuBX,IAE7D,cAAEsC,GAAkBhC,EAAYiC,WAElCD,IAEFhC,EAAYkC,SAASvC,GACrBK,EAAYmC,QAAQ,CAAEC,GAAI1C,EAAY2C,WAAW,KAGnDC,EAAAA,UAAAA,YAAyBlC,EAAST,QAAS,CACzCiB,aACA2B,iBAAiB,GACjB,EAgFiBR,CAAuBD,EAAKpC,GAC7C8C,IAAK5C,EAAeiB,eAAiBjB,EAAeiB,eAAiB,EAAI,EACzE4B,OAAQ3C,EACR4C,MAAO9C,EAAegB,YAG5B,CAEArB,EAA0BoD,UAAY,CACpClD,aAAcmD,IAAAA,OACdlD,WAAYkD,IAAAA,OAAiBC,WAC7BlD,QAASiD,IAAAA,WAAqBE,SAC9BhD,gBAAiB8C,IAAAA,OACjBhD,eAAgBgD,IAAAA,OAAiBC,WACjChD,kBAAmB+C,IAAAA,KAAeC,WAClC9C,gBAAiB6C,IAAAA,OAAiBC,YAGpC,U,mCC9GO,SAASE,EAAsBC,GAAuB,IAAfC,EAASC,UAAAjC,OAAA,QAAAkC,IAAAD,UAAA,GAAAA,UAAA,GAAG,EACxD,GAAe,OAAXF,EACF,OAAOI,WAAWJ,GAAQK,QAAQJ,EAEtC,CASO,SAASK,EAAgBC,GAAiC,IAA3BC,EAASN,UAAAjC,OAAA,QAAAkC,IAAAD,UAAA,GAAAA,UAAA,GAAG,cAChD,OAAOO,IAAOF,EAAM,YAAYG,OAAOF,EACzC,CAeO,SAASG,EAAgBC,GAA8B,IAAxBJ,EAASN,UAAAjC,OAAA,QAAAkC,IAAAD,UAAA,GAAAA,UAAA,GAAG,WAChD,OAAOO,IAAOG,EAAM,YAAYF,OAAOF,EACzC,CAQO,SAASK,EAASC,GACvB,IAAKA,EACH,MAAO,GAGT,MAAMC,EAAUD,EACbE,MAAM,KACNC,QAAOC,KAAOA,IACdC,KAAK,MACLC,OACH,MAAmB,MAAZL,GAA+B,KAAZA,EAAiB,GAAKA,CAClD,CC3DA,MAAMM,EAAU,KA4BhB,SAASC,EAAc9E,GAA2C,IAA1C,IAAE+E,EAAG,cAAEC,GAAiChF,EAC9D,MAAM,YAAEiF,EAAW,aAAEC,GAAiBH,EACtC,MAA4B,iBAAjBG,GAAoD,iBAAhBD,EACtC,KAIP9C,EAAAA,cAAA,OACEgD,UAAU,6BACVC,MAAO,CAAEC,MAAQL,GAAiBA,EAAcK,YAAU1B,IAE1DxB,EAAAA,cAAA,QAAMgD,UAAU,iBAAgB,MAChChD,EAAAA,cAAA,QAAMgD,UAAU,iCAAiCF,EAAYpB,QAAQ,IACrE1B,EAAAA,cAAA,QAAMgD,UAAU,iBAAgB,MAChChD,EAAAA,cAAA,QAAMgD,UAAU,4BAA4BD,EAAarB,QAAQ,IAGvE,CAKA,SAASyB,EAAeC,GAA6C,IAA5C,MAAEC,EAAK,cAAER,GAAiCO,EACjE,OACEpD,EAAAA,cAAA,OACEgD,UAAU,6BACVC,MAAO,CAAEC,MAAQL,GAAiBA,EAAcK,YAAU1B,IAE1DxB,EAAAA,cAAA,QAAMgD,UAAU,iBAAgB,SAChChD,EAAAA,cAAA,QAAMgD,UAAU,cAAcK,EAAM3B,QAAQ,GAAG,KAGrD,CAKA,SAAS4B,EAAyBC,GAIb,IAJc,eACjCC,EAAc,eACdvF,EAAc,cACd4E,GACiBU,EACjB,MAAM,WAAEtE,EAAU,eAAEC,GAAmBjB,EAEvC,OACE+B,EAAAA,cAAA,OACEgD,UAAU,6BACVC,MAAO,CAAEC,MAAQL,GAAiBA,EAAcK,YAAU1B,IAE1DxB,EAAAA,cAAA,QAAMgD,UAAU,iBAAgB,MAChChD,EAAAA,cAAA,QAAMgD,UAAU,cACbQ,QACI,GAAEA,MAAmBvE,EAAa,KAAKC,KACvC,GAAED,EAAa,KAAKC,KAIjC,CAKA,SAASuE,EAA2BC,GAMjC,IANkC,QACnC1F,EAAO,aACPF,EAAY,eACZG,EAAc,WACdF,EAAU,gBACVK,GACDsF,EACC,MAAM,eAAEC,EAAc,2BAAErF,EAA0B,qBAAEsF,GAClDxF,EAAgBG,UACXqE,EAAKiB,IAAUC,EAAAA,EAAAA,UAAS,CAAEf,aAAc,KAAMD,YAAa,QAC3DO,EAAOU,IAAYD,EAAAA,EAAAA,UAAS,IAC5BE,EAAaC,IAAkBH,EAAAA,EAAAA,UAAS,KACzC,WAAE7E,GAAehB,EAEjBiG,EAAuBN,EAAqBO,qBAChD,6BAEIC,EAAwBR,EAAqBO,qBACjD,8BAEIE,EAA0BT,EAAqBO,qBACnD,gCAEIG,EAA2BV,EAAqBO,qBACpD,iCAGII,GAAWC,EAAAA,EAAAA,UAAQ,IACH,MAAhB1G,EA0NR,SAA8BA,EAAcmB,GAC1C,IAAIwF,EAAU,KACd,GAAI3G,EAAaa,eAAiBC,EAAAA,MAAAA,aAAmBC,MACnD4F,EAAU3G,EAAasB,KAAKC,SAASJ,QAChC,GAAInB,EAAaa,eAAiBC,EAAAA,MAAAA,aAAmBE,aAAc,CACxE,MAAM4F,EAAU5G,EAAasB,KAC7B,GAAIsF,GAA6B,GAAlBA,EAAQpF,OAAa,CAElCmF,EADeC,EAAQ,GACNrF,SAASJ,EAC5B,CACF,CACA,OAAOwF,GAAUE,EAAAA,SAAAA,IAAa,WAAYF,IAAiB,CAAC,CAC9D,CArOaG,CAAqB9G,EAAcmB,GAEnC,MAER,CAACnB,EAAcmB,IAEZuE,GAAiBgB,EAAAA,EAAAA,UAAQ,IACT,MAAhB1G,EAgOR,SAA4BA,EAAcC,EAAYkB,EAAYX,GAChE,IAAIkF,EAEJ,GAAI1F,EAAaa,eAAiBC,EAAAA,MAAAA,aAAmBC,OAGnD,GAFA2E,EAgBJ,SAAqC1F,EAAcmB,GACjD,MAAMI,EAAWvB,EAAasB,KAAKC,SAC7BoF,EAAUpF,EAASJ,GAEzB,IAAKwF,EACH,OAGF,MAAMI,EAAqBF,EAAAA,SAAAA,IAAa,qBAAsBF,IAAY,CAAC,GACrE,eAAEjB,GAAmBqB,EAI3B,GAFkBxF,EAASC,QAEV,EACf,OAGF,OAAOwF,SAAStB,EAClB,CAlCqBuB,CAA4BjH,EAAcmB,IAEtDuE,GAAqC,IAAnBA,EACrB,OAAO,UAEA1F,EAAaa,eAAiBC,EAAAA,MAAAA,aAAmBE,eAC1D0E,EAAiBwB,EACflH,EACAmB,EACAlB,IAIJ,OAAOyF,CACT,CAjPayB,CAAmBnH,EAAcC,EAAYkB,GAE/C,MACN,CAACnB,EAAcC,EAAYkB,EAAYX,KAK1CE,EAAAA,EAAAA,YAAU,KACRyF,EAAeN,EAAeuB,iBAAiB,GAC9C,KAKH1G,EAAAA,EAAAA,YAAU,KACR,MAAM2G,EAAYC,IAChB,MAAM,MAAEC,GAAUD,EAAY1F,OAE9B,IAAK2F,EACH,OAGF,MAAM,MAAEC,EAAK,MAAEC,GAAUF,GACnB,YAAEvC,EAAW,aAAEC,GAAiB/D,EAAAA,UAAAA,YAAAA,cAAoCsG,EAAOC,GAEjF1B,EAAO,CAAEd,eAAcD,eAAc,EAKvC,OAFA9E,EAAQ2B,iBAAiBf,EAAAA,MAAAA,OAAa4G,aAAcL,GAE7C,KACLnH,EAAQ6B,oBAAoBjB,EAAAA,MAAAA,OAAa4G,aAAcL,EAAU,CAClE,GACA,CAACpH,EAAYD,EAAc8E,EAAK5E,KAKnCQ,EAAAA,EAAAA,YAAU,KACR,MAAMiH,EAAcL,IAClB,MAAM,eAAEM,EAAc,OAAEC,GAAWP,EAAY1F,OAE/C,GACEgG,EAAeE,gBAAkBD,EAAOC,eACxCF,EAAerC,QAAUsC,EAAOtC,MAChC,CACA,MAAM5E,EAAWH,EAA2BI,uBAAuBX,GAEnE,IAAKU,EACH,OAGF,MAAMoH,EAAYpH,EAASqH,eAE3B,IAAKD,EACH,OAGF,GAAIF,EAAOtC,MAET,YADAU,EAAS4B,EAAOtC,OAIlB,MAAM,QAAE0C,GAAYF,EAEdxC,EAASrF,EAAQgI,aAAeD,EAAQ,GAAK,GAAOJ,EAAOC,cACjE7B,EAASV,EACX,GAKF,OAFArF,EAAQ2B,iBAAiBf,EAAAA,MAAAA,OAAaqH,gBAAiBR,GAEhD,KACLzH,EAAQ6B,oBAAoBjB,EAAAA,MAAAA,OAAaqH,gBAAiBR,EAAY,CACvE,GACA,CAAC1H,EAAYD,EAAcQ,EAA4BN,KAM1DQ,EAAAA,EAAAA,YAAU,KACR,MAAM,YAAE0H,GAAgBvC,EAAewC,UACrCxC,EAAeyC,OAAOC,yBACtB,KACEpC,EAAeN,EAAeuB,iBAAiB,IAInD,MAAO,KACLgB,GAAa,CACd,GACA,CAACvC,IAEJ,MAAM2C,GAAqBC,EAAAA,EAAAA,cACzBC,IACE,MAAMC,EAAqC,CACzCzI,UACAF,eACAG,iBACAF,aACAK,kBACAyE,cAAe2D,EACfE,WAAY,CACVxE,SAAUA,EACVyE,WAAYhF,EACZiF,WAAY5E,EACZZ,sBAAuBA,GAEzBmD,WAEA3B,MACAS,QACAG,kBAGF,GAA+B,iCAA3BgD,EAAKK,kBACP,OAAO7G,EAAAA,cAAC2C,EAAmB8D,GACtB,GAA+B,+BAA3BD,EAAKK,kBACd,OAAO7G,EAAAA,cAACmD,EAAoBsD,GACvB,GAA+B,oCAA3BD,EAAKK,kBACd,OAAO7G,EAAAA,cAACsD,EAA8BmD,GACjC,CACL,MAAMK,EAAalD,EAAqBmD,UAAUP,GAElD,GAAkC,mBAAvBM,EAAWE,QACpB,OAAOF,EAAWE,QAAQP,EAE9B,IAEF,CACEzI,EACAF,EACAG,EACAF,EACAK,EACAwF,EACAW,EACA3B,EACAS,EACAG,IAIEyD,GAAoBV,EAAAA,EAAAA,cAAY,KACpC,MAAMW,EAAQhD,GAAsBgD,OAAS,CAC3C,CACEzG,GAAI,cACJoG,kBAAmB,iCAGvB,OACE7G,EAAAA,cAAAA,EAAAA,SAAA,KACGkH,EAAMC,KAAI,CAACX,EAAMY,IAChBpH,EAAAA,cAAA,OAAKqH,IAAM,sBAAqBD,KAAMd,EAAmBE,MAE1D,GAEJ,CAACtC,EAAsBoC,IAEpBgB,GAAqBf,EAAAA,EAAAA,cAAY,KACrC,MAAMW,EAAQ9C,GAAuB8C,OAAS,CAC5C,CACEzG,GAAI,gBACJoG,kBAAmB,oCAGvB,OACE7G,EAAAA,cAAAA,EAAAA,SAAA,KACGkH,EAAMC,KAAI,CAACX,EAAMY,IAChBpH,EAAAA,cAAA,OAAKqH,IAAM,uBAAsBD,KAAMd,EAAmBE,MAE3D,GAEJ,CAACpC,EAAuBkC,IAErBiB,GAAuBhB,EAAAA,EAAAA,cAAY,KACvC,MAAMW,EAAQ7C,GAAyB6C,OAAS,GAChD,OACElH,EAAAA,cAAAA,EAAAA,SAAA,KACGkH,EAAMC,KAAI,CAACX,EAAMY,IAChBpH,EAAAA,cAAA,OAAKqH,IAAM,yBAAwBD,KAAMd,EAAmBE,MAE7D,GAEJ,CAACnC,EAAyBiC,IAEvBkB,GAAwBjB,EAAAA,EAAAA,cAAY,KACxC,MAAMW,EAAQ5C,GAA0B4C,OAAS,GACjD,OACElH,EAAAA,cAAAA,EAAAA,SAAA,KACGkH,EAAMC,KAAI,CAACX,EAAMY,IAChBpH,EAAAA,cAAA,OAAKqH,IAAM,0BAAyBD,KAAMd,EAAmBE,MAE9D,GAEJ,CAAClC,EAA0BgC,IAE9B,OACEtG,EAAAA,cAACyH,EAAAA,GAAe,CACdC,QAAST,IACTU,SAAUL,IACVM,WAAYL,IACZM,YAAaL,KAGnB,CA2DA,SAASxC,EAA6BlH,EAAcC,EAAYO,GAC9D,MAAMoG,EAAU5G,EAAa4G,QAG7B,IAAKA,GAAWA,EAAQpF,OAAS,EAC/B,OAGF,MAAMwI,EAASpD,EAAQ,IACjB,UAAEqD,EAAS,SAAE1I,GAAayI,EAE1BE,EAAsB1J,EAA2BI,uBAAuBX,GAE9E,IAAKiK,EACH,OAGF,MAAMrC,EAASqC,EAAoBC,aAC7B,gBAAEC,GAAoBvC,EAGtBwC,EAAiBJ,EAAUK,MAAM,EAAG,GAGpCC,EAAQC,EAAAA,GAAAA,MAAWA,EAAAA,GAAAA,SAAeJ,EAAiBC,GAGzD,GAF2BG,EAAAA,GAAAA,OAAYD,GAAS3F,EAExB,CACtB,MAAM+B,EAAUpF,EAASJ,YAEzB,IAAKwF,EACH,MAAO,CAAC,EAGV,MAAM,eAAEjB,GAAmBmB,EAAAA,SAAAA,IAAa,qBAAsBF,IAAY,CAAC,EAC3E,OAAOK,SAAStB,EAClB,CACF,CAEAC,EAA4BzC,UAAY,CACtClD,aAAcmD,IAAAA,OACdhC,WAAYgC,IAAAA,OACZlD,WAAYkD,IAAAA,QAGd,U,wBCnbA,MAAM,wBAAEsH,EAAuB,2BAAEC,GAA+BxJ,EAAAA,UAAAA,YAEhE,SAASyJ,EAA0B5K,GAOhC,IAPiC,QAClCG,EAAO,aACPF,EAAY,eACZG,EAAc,WACdF,EAAU,gBACVK,EAAe,mBACfsK,EAAqB,CAAC,MAAO,SAC9B7K,EAEC,MAAO8K,EAAUC,IAAe9E,EAAAA,EAAAA,UAAS,IAClC+E,EAAgBC,IAAqBhF,EAAAA,EAAAA,WAAS,IAC9CiF,EAAcC,IAAmBlF,EAAAA,EAAAA,WAAS,IAC3C,2BAAExF,GAA+BF,EAAgBG,UAEvDC,EAAAA,EAAAA,YAAU,KACR,MAAMyK,EAA0B9I,IAC9B,MAAM,SAAEwI,EAAQ,eAAEjD,EAAc,OAAEC,GAAWxF,EAAIT,YAEhC8B,IAAbmH,GACFC,EAAYD,QAIcnH,IAA1BmE,EAAOkD,gBACPnD,EAAemD,iBAAmBlD,EAAOkD,gBAEzCC,EAAkBnD,EAAOkD,qBAIDrH,IAAxBmE,EAAOoD,cACPrD,EAAeqD,eAAiBpD,EAAOoD,cAEvCC,EAAgBrD,EAAOoD,aACzB,EAKF,OAFA/K,EAAQ2B,iBAAiBf,EAAAA,MAAAA,OAAaqH,gBAAiBgD,GAEhD,KACLjL,EAAQ6B,oBAAoBjB,EAAAA,MAAAA,OAAaqH,gBAAiBgD,EAAuB,CAClF,GACA,IAEH,MAAMC,GAAU1E,EAAAA,EAAAA,UAAQ,KACtB,IAAK1G,EACH,MAAO,GAGT,IAAIqL,EAAYC,EAChB,GAAkC,UAA9BtL,EAAaa,aAA0B,CACzC,MAAMM,EAAahB,EAAegB,WAC5BwF,EAAU3G,EAAasB,KAAKC,WAAWJ,GAG7C,IAAKwF,EACH,OAAO,IAGN0E,aAAYC,iBAAkBzE,EAAAA,SAAAA,IAAa,mBAAoBF,IAAY,CAAC,EACjF,KAAO,CACL,IAAKzG,KAAYqL,EAAAA,EAAAA,mBAAkBrL,GACjC,MAAO,GAGT,MAAM,SAAES,IAAa4K,EAAAA,EAAAA,mBAAkBrL,IACjC,OAAEsL,EAAM,gBAAEpB,GAAoBzJ,EAASwJ,YAEvCsB,EAAYjB,EAAAA,GAAAA,SAClBA,EAAAA,GAAAA,MAAWiB,EAAWD,EAAQpB,GAE9BkB,EAAgB,EAAEE,EAAO,IAAKA,EAAO,IAAKA,EAAO,IACjDH,EAAaI,CACf,CAEA,IAAKJ,IAAeC,QAA8B5H,IAAbmH,EACnC,MAAO,GAGT,MAAMO,EAgEV,SAAgCC,EAAYC,EAAeT,EAAUI,EAAcF,GACjF,MAAMW,EAAYjB,EAAwBY,GACpCM,EAAelB,EAAwBa,GACvCM,EAAoBlB,EAA2BgB,GAG/CN,EAAU,CACdS,IAH2BnB,EAA2BiB,GAItDG,KAAMF,EACNG,MAAOL,EACPM,OAAQL,GAKNV,IACFG,EAAQS,IAAMnB,EAA2BU,EAAQS,KACjDT,EAAQY,OAAStB,EAA2BU,EAAQY,SAGlDjB,IACFK,EAAQU,KAAOpB,EAA2BU,EAAQU,MAClDV,EAAQW,MAAQrB,EAA2BU,EAAQW,QAKrD,GAAiB,KAAblB,IAAiC,MAAdA,EACrB,MAAO,CACLgB,IAAKT,EAAQU,KACbA,KAAMpB,EAA2BU,EAAQS,KACzCE,MAAOrB,EAA2BU,EAAQY,QAC1CA,OAAQZ,EAAQW,OAEb,IAAkB,KAAdlB,GAAiC,MAAbA,EAC7B,MAAO,CACLgB,IAAKnB,EAA2BU,EAAQU,MACxCA,KAAMV,EAAQS,IACdG,OAAQZ,EAAQU,KAChBC,MAAOX,EAAQY,QAEZ,GAAiB,MAAbnB,IAAkC,MAAdA,EAC7B,MAAO,CACLgB,IAAKnB,EAA2BU,EAAQS,KACxCC,KAAMpB,EAA2BU,EAAQU,MACzCE,OAAQtB,EAA2BU,EAAQY,QAC3CD,MAAOrB,EAA2BU,EAAQW,QAI9C,OAAOX,CACT,CAnHoBa,CACdZ,EACAC,EACAT,EACAI,EACAF,GAGImB,EAAe1L,EAA2B2L,gBAAgBlM,GAEhE,IAAKiM,EAEH,OADAE,QAAQC,IAAI,2CACL,KAET,MAAMC,EAAkBJ,EAAaK,qBAAqBC,WAIpDC,IAAUH,GAAkBI,EAAAA,UAAAA,QAAgBJ,EAAiB,CAAC,EAAG,EAAG,IAE1E,OAAO1B,EAAmBvB,KAAI,CAACsD,EAAGC,IAChC1K,EAAAA,cAAA,OACEgD,UAAW2H,IACR,GAAEF,2BACHF,EAAU,iBAAmB,eAE/BlD,IAAM,GAAEoD,4BAERzK,EAAAA,cAAA,OAAKgD,UAAU,4BAA4BkG,EAAQuB,MAErD,GACD,CACD3M,EACAG,EACA0K,EACAI,EACAF,EACAH,EACA1K,IAGF,OAAOgC,EAAAA,cAAA,OAAKgD,UAAU,uCAAuCkG,EAC/D,CAEAT,EAA2BzH,UAAY,CACrC4J,gBAAiB3J,IAAAA,OACjB4J,MAAO5J,IAAAA,QAGTwH,EAA2BqC,aAAe,CACxCF,gBAAiB,EACjBC,MAAO,MAkET,UCjNA,SAASE,EAAkClN,GAA4B,IAA3B,aAAEC,EAAY,QAAEE,GAASH,EACnE,MAAOmN,EAASC,IAAcnH,EAAAA,EAAAA,WAAS,IAChC+G,EAAOK,IAAYpH,EAAAA,EAAAA,WAAS,GAE7BqH,GAAmBC,EAAAA,EAAAA,QAAO,MAC1BC,GAAoBD,EAAAA,EAAAA,QAAO,MAE3BE,EAAkBnL,IACtBoL,aAAaJ,EAAiBK,SAE9BL,EAAiBK,QAAUC,YAAW,KACpCR,GAAW,EAAK,GACf,GAAG,EAGFS,EAAwBvL,IAC5BoL,aAAaJ,EAAiBK,SAE9BP,GAAW,EAAM,EAGbU,EAAgBxL,IACpBoL,aAAaJ,EAAiBK,SAE1BH,EAAkBG,UAAYrL,EAAIT,OAAO+E,UAC3CyG,EAAS/K,EAAIT,OAAOmL,OACpBQ,EAAkBG,QAAU,KAC9B,EAiBF,OAdAhN,EAAAA,EAAAA,YAAU,KACRR,EAAQ2B,iBAAiBf,EAAAA,MAAAA,OAAagB,sBAAuB0L,GAC7DtN,EAAQ2B,iBAAiBf,EAAAA,MAAAA,OAAagN,iBAAkBD,GACxD3N,EAAQ2B,iBAAiBf,EAAAA,MAAAA,OAAaiN,gBAAiBH,GAEhD,KACL1N,EAAQ6B,oBAAoBjB,EAAAA,MAAAA,OAAagB,sBAAuB0L,GAEhEtN,EAAQ6B,oBAAoBjB,EAAAA,MAAAA,OAAaiN,gBAAiBH,GAE1D1N,EAAQ6B,oBAAoBjB,EAAAA,MAAAA,OAAagN,iBAAkBD,EAAc,IAE1E,CAAC3N,EAASF,IAET+M,EAEA7K,EAAAA,cAAAA,EAAAA,SAAA,KACEA,EAAAA,cAAA,OAAKgD,UAAU,2DACbhD,EAAAA,cAAA,OAAKgD,UAAU,8DACbhD,EAAAA,cAAA,KAAGgD,UAAU,yCACXhD,EAAAA,cAAA,UAAI,uBACJA,EAAAA,cAAA,SAAG,0BACHA,EAAAA,cAAA,SAAI6K,OAQZG,EAIAhL,EAAAA,cAAA,OAAKgD,UAAU,+EACbhD,EAAAA,cAAA,OAAKgD,UAAU,8DACbhD,EAAAA,cAAA,KAAGgD,UAAU,yCAAwC,gBAMtD,IACT,CAEA+H,EAAmC/J,UAAY,CAC7C4J,gBAAiB3J,IAAAA,OACjB4J,MAAO5J,IAAAA,OACPjD,QAASiD,IAAAA,QAGX8J,EAAmCD,aAAe,CAChDF,gBAAiB,EACjBC,MAAO,MAGT,UCTA,QA1EA,SAA6BiB,GAC3B,MAAM,WAAE/N,EAAU,QAAEC,EAAO,gBAAEG,EAAe,gBAAEC,GAAoB0N,GAC5D,2BAAExN,GAA+BF,EAAgBG,UAChDN,EAAgBC,IAAqB4F,EAAAA,EAAAA,UAAS,CACnD7E,WAAY,EACZC,eAAgB,KAEXpB,EAAciO,IAAmBjI,EAAAA,EAAAA,UAAS,MAmBjD,IAjBAtF,EAAAA,EAAAA,YAAU,KACR,MAAM,YAAE0H,GAAgB5H,EAA2B6H,UACjD7H,EAA2B8H,OAAO4F,uBAClCF,IACMA,EAAM/N,aAAeA,GAIzBgO,EAAgBD,EAAMhO,aAAa,IAIvC,MAAO,KACLoI,GAAa,CACd,GACA,CAACnI,KAECC,EACH,OAAO,KAGT,GAAIF,EAAc,CAChB,MAAMmO,EAAe3N,EAA2B2L,gBAAgBlM,GAEhE,GAAIkO,GAAcC,iBAAiBC,qBAAqBC,aACtD,OAAO,IAEX,CAEA,OACEpM,EAAAA,cAAA,OAAKgD,UAAU,YACbhD,EAAAA,cAACqM,EAAsB,CACrBtO,WAAYA,EACZD,aAAcA,EACdE,QAASA,EACTC,eAAgBA,EAChBC,kBAAmBA,EACnBC,gBAAiBA,EACjBC,gBAAiBA,IAGnB4B,EAAAA,cAACyD,EAA2B,CAC1BxF,eAAgBA,EAChBH,aAAcA,EACdC,WAAYA,EACZK,gBAAiBA,EACjBJ,QAASA,IAGXgC,EAAAA,cAAC+K,EAAkC,CACjCjN,aAAcA,EACdE,QAASA,IAGXgC,EAAAA,cAACyI,EAA0B,CACzBxK,eAAgBA,EAChBD,QAASA,EACTF,aAAcA,EACdM,gBAAiBA,EACjBL,WAAYA,IAIpB,E,eCiBA,MC9FA,EDEA,SAA0BF,GAAoD,IAAnD,iBAAEyO,EAAgB,WAAEvO,EAAU,gBAAEK,GAAiBP,EAC1E,MAAM,eAAE8F,EAAc,qBAAEC,GAAyBxF,EAAgBG,WAC1D,cAAE8B,EAAa,MAAEkM,GAASlO,IAAemO,EAAAA,EAAAA,QACzC,iBAAEC,KAAsBC,EAAAA,EAAAA,OAEvBC,UAAWC,EAAsBC,EAAAA,IACvCjJ,EAAqBkJ,IAAI,eAAiB,CAAC,EAiBvCC,EAAcA,KAClB,IAAKR,IAAUA,EAAMxO,KAAgBuO,EACnC,OAGF,MAAMU,EAAOT,EAAMxO,GACb2C,EAAYsM,EAAKtM,YAAa,EAC9BuM,EAAYD,EAAKC,WAAa,GAE9BC,EAAiBC,KAAKtM,IAAIoM,EAAW,GAEvCvM,EACFrC,EAAY+O,SAASd,EAAkB,CACrCe,gBAAiBH,IAGnB7O,EAAYkC,SAAS+L,EACvB,GAGF9N,EAAAA,EAAAA,YAAU,KACR8O,EAAAA,YAAY3N,iBAAiBf,EAAAA,MAAAA,OAAa2O,yBAA0BR,GAE7D,KACL1O,EAAYmC,QAAQ,CAAEC,GAAI1C,EAAY2C,WAAW,IACjD4M,EAAAA,YAAYzN,oBAAoBjB,EAAAA,MAAAA,OAAa2O,yBAA0BR,EAAY,IAEpF,CAACT,KAEJ9N,EAAAA,EAAAA,YAAU,KACR,GAAK+N,GAAUA,EAAMxO,IAAgBuO,EAMrC,OAFAS,IAEO,KACDT,GAAoBC,IAAQxO,IAAa2C,WAC3CrC,EAAYkC,SAAS+L,EACvB,CACD,GACA,CAACC,EAAOxO,EAAYM,EAAaiO,EAAkBS,IAEtD,MAAMC,EAAOT,EAAMxO,GACb2C,EAAasM,GAAQA,EAAKtM,YAAc,EAE9C,OACEL,GACEL,EAAAA,cAAC4M,EAAmB,CAClB5J,UAAU,8CACVtC,UAAWA,EACX8M,QAlEkBC,KACtB9J,EAAe+J,kBAAkB,CAC/BC,QAAS,YACTC,gBAAiB,SACjBC,SAAU,CACR,CACEC,YAAa,aACbC,eAAgB,CAAC,EACjBC,SAAU,OACVC,QAAS,iBAGb,EAuDEC,kBAAmBxN,GACjBrC,EAAYmC,QAAQ,CAClBC,GAAIgM,EACJ/L,cAGJyN,kBAAmBlB,GACjB5O,EAAYmC,QAAQ,CAClBC,GAAIgM,EACJQ,eAMZ,EEhEA,IAAImB,EAEJ,SAASC,EAASC,EAAWC,GAC3B,GAAIA,EAAUC,iBACZ,OAAO,EAGT,GAAIF,EAAUG,YAAYnP,SAAWiP,EAAUE,YAAYnP,OACzD,OAAO,EAGT,GAAIgP,EAAUpC,gBAAgBwC,cAAgBH,EAAUrC,gBAAgBwC,YACtE,OAAO,EAGT,GAAIJ,EAAUpC,gBAAgByC,cAAgBJ,EAAUrC,gBAAgByC,YACtE,OAAO,EAGT,GAAIL,EAAUpC,gBAAgBvN,eAAiB4P,EAAUrC,gBAAgBvN,aACvE,OAAO,EAGT,GAAI4P,EAAUrC,gBAAgBsC,iBAC5B,OAAO,EAGT,MAAMI,EAAkBN,EAAUG,YAC5BI,EAAkBN,EAAUE,YAElC,GAAIG,EAAgBtP,SAAWuP,EAAgBvP,OAC7C,OAAO,EAGT,IAAK,IAAI8H,EAAI,EAAGA,EAAIwH,EAAgBtP,OAAQ8H,IAAK,CAC/C,MAAM0H,EAAiBF,EAAgBxH,GAEjC2H,EAAkBF,EAAgBG,MACtCC,GACEA,EAAeC,wBAA0BJ,EAAeI,wBAG5D,IAAKH,EACH,OAAO,EAIT,GAAIA,EAAgBI,QAAQ7P,SAAWwP,EAAeK,QAAQ7P,OAC5D,OAAO,EAIT,GAAIyP,EAAgBI,QAAQ7P,OAC1B,IAAK,IAAI8P,EAAI,EAAGA,EAAIL,EAAgBI,OAAO7P,OAAQ8P,IACjD,GAAIL,EAAgBI,OAAOC,GAAG3K,UAAYqK,EAAeK,OAAOC,GAAG3K,QACjE,OAAO,CAIf,CAEA,OAAO,CACT,CAIA,MAAM4K,EAA0BrP,EAAAA,MAAW8L,IACzC,MAAM,YACJ2C,EAAW,WACXa,EAAU,gBACVpD,EAAe,kBACfqD,EAAiB,gBACjBnR,EAAe,gBACfoR,EAAe,iBACfC,EAAgB,kBAChBC,EAAiB,4BACjBC,EAA2B,kBAI3BC,GACE9D,EAEE/N,EAAamO,EAAgBnO,YAC5BI,EAAiB0R,IAAsB/L,EAAAA,EAAAA,UAAS,UAChDwI,EAAkBwD,IAAuBhM,EAAAA,EAAAA,UAAS,MACnDiM,GAAa3E,EAAAA,EAAAA,WAEb,mBACJ4E,EAAkB,kBAClBC,EAAiB,eACjBtM,EAAc,iBACduM,EAAgB,iBAChBC,EAAgB,2BAChB7R,EAA0B,wBAC1B8R,EAAuB,oBACvBC,EAAmB,iBACnBC,GACElS,EAAgBG,UAEbgS,IAAuBC,EAAAA,EAAAA,MAExBC,GAA0BlK,EAAAA,EAAAA,cAAY,KAC1C,MAAMpI,EAAqB4R,EAAWvE,QAAQxF,aAAe,GAApC,KACzB6J,EAAmB1R,EAAgB,GAClC,CAAC4R,IAGEW,GAAWnK,EAAAA,EAAAA,cAAY,KACvBwJ,EAAWvE,UACblN,EAA2BqS,SAC3BF,IACF,GACC,CAACV,IAEEa,GAAkBrK,EAAAA,EAAAA,cACtB0F,IACE,MAAM4E,EAAoB5E,EAAa6E,uBACjCC,EAAa9E,EAAa+E,gBAEhCd,EAAiBe,4BAA4BlT,EAAY8S,GAEzDV,EAAiBe,4BAA4BnT,EAAY8S,EAAmBE,EAAW,GAEzF,CAAChT,IAGGoT,GAAwB5K,EAAAA,EAAAA,cAC5BpG,IAEE,GAAIA,EAAIT,OAAO1B,UAAY+R,EAAWvE,QACpC,OAGF,MAAM,WAAEzN,EAAU,QAAEC,GAAYmC,EAAIT,OAC9BuM,EAAe3N,EAA2B2L,gBAAgBlM,IAChEqT,EAAAA,EAAAA,IAAkBrT,EAAYC,GAC9B8R,EAAoB9R,GAEpB,MAAM6S,EAAoB5E,EAAa6E,uBACjCnC,EAAc1C,EAAaoF,iBAC3BN,EAAa9E,EAAa+E,gBAEhCd,EAAiBoB,uBAAuBvT,EAAY8S,EAAmBlC,GAEvEwB,EAAiBoB,uBAAuBxT,EAAY8S,EAAmBE,GAEnEtB,GACFA,EAAiBtP,EACnB,GAEF,CAACpC,EAAY0R,EAAkBS,IAqKjC,OAjKA1R,EAAAA,EAAAA,YAAU,KACRF,EAA2BkT,eAAezT,EAAYgS,EAAWvE,SAEjE8B,EAAAA,YAAY3N,iBAAiBf,EAAAA,MAAAA,OAAa6S,gBAAiBN,GAE3DV,IAEO,KACL,MAAMxE,EAAe3N,EAA2B2L,gBAAgBlM,GAE3DkO,IAIL2E,EAAgB3E,GAChB3N,EAA2BoT,kBAAkB,CAAE3T,eAE3C2R,GACFA,EAAkBzD,GAGpBqB,EAAAA,YAAYzN,oBAAoBjB,EAAAA,MAAAA,OAAa6S,gBAAiBN,GAAsB,IAErF,KAUH3S,EAAAA,EAAAA,YAAU,KACR,MAAM,YAAE0H,GAAgB+J,EAAkB9J,UACxC8J,EAAkB7J,OAAOuL,yCACzBC,UAGsD,IAFpD1C,sBAAuB2C,EAAgC,eACvDC,GAC+CjU,EAC/C,IAAKiU,EACH,OAGF,MAAM7F,EAAe3N,EAA2B2L,gBAAgBlM,GAEhE,GAAIkO,EAAa8F,cAAcF,GAAmC,CAChE,MAAM/T,EAAemO,EAAa+F,kBAC5BC,QAAwB7B,EAAwB8B,uBACpDpU,EACA+T,EACAvC,EACAW,GAGIkC,GAAa,EACnB7T,EAA2B8T,eAAerU,EAAYkU,EAAiBE,EACzE,KAGJ,MAAO,KACLjM,GAAa,CACd,GACA,CAACnI,KAEJS,EAAAA,EAAAA,YAAU,KAEH0N,EAAgBvN,eACnBuN,EAAgBvN,aArOR,SAwOeiT,WACvB,MAAM9T,QAAqBsS,EAAwBiC,mBACjD5D,EACAvC,EACAoD,EACAM,IAMI,qBAAE0C,EAAoB,0BAAEC,GAA8BjC,EAAiBhQ,YACvE,gBAAEkS,GAAoBtG,EACtBuG,EAAgB,CACpBC,qBAAsBH,EAA0BC,GAAiBG,wBACjEC,gBAAiBN,EAAqBE,GAAiBK,oBAEzD,IAAIC,EACA1E,GAA6BrQ,aAAeA,IAC9C+U,EAAc1E,EAA4B0E,YAE1CL,EAAcC,qBAAuB,KACrCtE,EAA8B,MAS5BlC,EAAgBsC,mBAClBtC,EAAgBsC,kBAAmB,GAGrClQ,EAA2ByN,gBACzBhO,EACAD,EACAoO,EACAqD,EACAkD,GAEEK,GACFC,EAAAA,WAAAA,UAAAA,sBAAqDD,EAAYE,IACnE,EAGFC,EAAkB,GACjB,CAAC/G,EAAiBuC,EAAaa,KAYlC9Q,EAAAA,EAAAA,YAAU,KACR,GAAImR,EACF,OAGF,MAAMuD,EAsEV,SACElD,EACAC,EACAF,EACAhS,EACA0Q,EACA4B,EACA/R,GAEA,MAAM,YAAE4H,GAAgB8J,EAAmB7J,UACzCgN,EAAAA,mBAAmB/M,OAAOgN,8BAC1BtH,IACEsC,EAA8BtC,EAC9B,MAAQ/N,WAAYsV,EAAM,YAAEP,EAAW,WAAEQ,GAAexH,EACnDgH,IAAeQ,SAGoC9R,IAApD4M,EAA4BpG,sBAE9BoG,EAA4BpG,oBAC1B1J,EAA2BiV,oBACzBF,EACAP,EAAY5D,sBACZ,CAAEsE,kBAAmBV,EAAYU,qBAGnCpF,EAA4BpG,sBAAwBjK,GAGxD0V,EACEX,EACA/C,EACAhS,EACAiS,EACAC,EACAI,EACA/R,GACD,IAIL,OAAO4H,CACT,CAhHmDwN,CAC7C1D,EACAC,EACAF,EACAhS,EACA0Q,EACA4B,EACA/R,GAaF,OA+FJ,SACE0R,EACAC,EACAF,EACAhS,EACA0Q,EACA4B,EACA/R,GAEA,IAAK8P,EACH,OAEF,GAAIA,EAA4BkF,WAE9B,YADAlF,EAA8B,MAGhC,MAAMuF,EAAelF,EAAYtH,KAAIyM,GAAcA,EAAW1E,wBAC9D,IAAKyE,GAAcrU,OACjB,OAIF,MAAM,YAAEwT,GAAgB1E,EACpB0E,GAAe/C,GACb4D,EAAaE,SAASf,GAAa5D,wBACrCuE,EACEX,EACA/C,EACAhS,EACAiS,EACAC,EACAI,EACA/R,EAIR,CA7IIwV,CACE9D,EACAC,EACAF,EACAhS,EACA0Q,EACA4B,EACA/R,GAGK,KACL4U,GAAwC,CACzC,GACA,CAACzE,EAAasB,EAAYhS,IAG3BiC,EAAAA,cAACA,EAAAA,SAAc,KACbA,EAAAA,cAAA,OAAKgD,UAAU,oBACbhD,EAAAA,cAAC+T,EAAAA,GAAmB,CAClBC,YAAY,WACZC,YAAa,GACbvD,SAAUA,EACVwD,UAAWnE,EAAWvE,UAExBxL,EAAAA,cAAA,OACEgD,UAAU,+BACVC,MAAO,CAAEnC,OAAQ,OAAQqT,MAAO,QAChCC,cAAeC,GAAKA,EAAEC,iBACtBC,YAAaF,GAAKA,EAAEC,iBACpBE,IAAKzE,IAEP/P,EAAAA,cAACyU,EAAmB,CAClB1W,WAAYA,EACZ2W,eAAgB/Q,EAChB3F,QAAS+R,EAAWvE,QACpBrN,gBAAiBA,EACjBC,gBAAiBA,IAEnB4B,EAAAA,cAAC6M,EAAU,CACTP,iBAAkBA,EAClBvO,WAAYA,EACZK,gBAAiBA,KAGrB4B,EAAAA,cAAA,OAAKgD,UAAU,mBACZuN,EAAoBxS,aAAeA,GAClCiC,EAAAA,cAAC2U,EAAAA,GAAY,CACXlU,GAAG,wBACHmU,QAASrE,EAAoBqE,QAC7BC,KAAMtE,EAAoBsE,KAC1BC,QAASvE,EAAoBuE,QAC7BC,SAAUxE,EAAoBwE,SAC9BC,eAAgBzE,EAAoByE,kBAI3B,GAElB3G,GAqFH,SAASoF,EACPX,EACAmC,EACAlX,EACAiS,EACAC,EACAI,EACA/R,GAEA,MAAM4W,EAAgBD,EAAiBzJ,SACjC,sBAAE0D,EAAqB,eAAEiG,EAAc,YAAEC,GAAgBtC,EAE/D,IAAKqC,EAEH,YADAjL,QAAQmL,KAAK,2DAIf,MAAMC,EAAuBrF,EAAkBsF,mBAAmBrG,GAMlEmB,EAAoBmF,oBAAoBzX,GAExC,MAAM0X,GAAiBpM,EAAAA,EAAAA,mBAAkB6L,GAEzC,GAAIO,EAAgB,CAElB,MAAMhX,EAAWgX,EAAehX,SAEhC,IAAIiX,EAAe,EACfC,GAA+B,EAEnC,GAAIlX,aAAoBmX,EAAAA,cAAe,CAErCF,EADiBjX,EAASoX,cACFC,WAAUrR,IAChC,MAAQ0Q,eAAgBY,EAAiBX,YAAaY,IACpDC,EAAAA,EAAAA,GAAyBxR,GAC3B,OAAOsR,IAAoBZ,KAAoBC,GAAeA,IAAgBY,EAAa,GAE/F,KAAO,CAGL,MAAQ9N,gBAAiBgO,GAAyBpD,EAAYqD,SAC9DT,EAAeJ,EAAqBnG,OAAO2G,WACzC1O,GAAKA,EAAE+N,iBAAmBA,IAG5B,MAAQjN,gBAAiBkO,GAAsB3X,EAASwJ,YAItDiO,IACC1L,EAAAA,UAAAA,QAAgB0L,EAAqB/O,IAAIgG,KAAKkJ,KAAMD,EAAkBjP,IAAIgG,KAAKkJ,QAEhFV,GAA+B,EAEnC,CAEA,IAAKA,IAAkD,IAAlBD,EACnC,OAGF3C,EAAAA,UAAAA,YAAgCmC,EAAe,CAC7CjW,WAAYyW,IAGd3C,EAAAA,WAAAA,UAAAA,sBAAqDD,EAAYE,KAEjE5E,GAA6BkI,YAC7BlI,EAA8B,IAChC,CACF,CAGAiB,EAAwBkH,YAAc,0BAEtClH,EAAwBvE,aAAe,CACrC6E,6BAA6B,GAG/BN,EAAwBrO,UAAY,CAClCyN,YAAaxN,IAAAA,MAAgBC,WAC7BoO,WAAYrO,IAAAA,OAAiBC,WAC7BgL,gBAAiBjL,IAAAA,OACjBsO,kBAAmBtO,IAAAA,QAAkBA,IAAAA,KACrC7C,gBAAiB6C,IAAAA,OAAiBC,WAClCuO,iBAAkBxO,IAAAA,KAClB0O,4BAA6B1O,IAAAA,KAI7BuV,sBAAuBvV,IAAAA,UAAoB,CAACA,IAAAA,OAAkBA,IAAAA,UAGhE,S","sources":["webpack:///../../../extensions/cornerstone/src/Viewport/Overlays/ViewportImageScrollbar.tsx","webpack:///../../../extensions/cornerstone/src/Viewport/Overlays/utils.ts","webpack:///../../../extensions/cornerstone/src/Viewport/Overlays/CustomizableViewportOverlay.tsx","webpack:///../../../extensions/cornerstone/src/Viewport/Overlays/ViewportOrientationMarkers.tsx","webpack:///../../../extensions/cornerstone/src/Viewport/Overlays/ViewportImageSliceLoadingIndicator.tsx","webpack:///../../../extensions/cornerstone/src/Viewport/Overlays/CornerstoneOverlays.tsx","webpack:///../../../extensions/cornerstone/src/components/CinePlayer/CinePlayer.tsx","webpack:///../../../extensions/cornerstone/src/components/CinePlayer/index.ts","webpack:///../../../extensions/cornerstone/src/Viewport/OHIFCornerstoneViewport.tsx"],"sourcesContent":["import React, { useEffect } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Enums, Types, utilities } from '@cornerstonejs/core';\r\nimport { utilities as csToolsUtils } from '@cornerstonejs/tools';\r\nimport { ImageScrollbar } from '@ohif/ui';\r\nimport { ServicesManger } from '@ohif/core';\r\n\r\nfunction CornerstoneImageScrollbar({\r\n viewportData,\r\n viewportId,\r\n element,\r\n imageSliceData,\r\n setImageSliceData,\r\n scrollbarHeight,\r\n servicesManager,\r\n}) {\r\n const { cineService, cornerstoneViewportService } = (servicesManager as ServicesManger).services;\r\n\r\n const onImageScrollbarChange = (imageIndex, viewportId) => {\r\n const viewport = cornerstoneViewportService.getCornerstoneViewport(viewportId);\r\n\r\n const { isCineEnabled } = cineService.getState();\r\n\r\n if (isCineEnabled) {\r\n // on image scrollbar change, stop the CINE if it is playing\r\n cineService.stopClip(element);\r\n cineService.setCine({ id: viewportId, isPlaying: false });\r\n }\r\n\r\n csToolsUtils.jumpToSlice(viewport.element, {\r\n imageIndex,\r\n debounceLoading: true,\r\n });\r\n };\r\n\r\n useEffect(() => {\r\n if (!viewportData) {\r\n return;\r\n }\r\n\r\n const viewport = cornerstoneViewportService.getCornerstoneViewport(viewportId);\r\n\r\n if (!viewport) {\r\n return;\r\n }\r\n\r\n if (viewportData.viewportType === Enums.ViewportType.STACK) {\r\n const imageIndex = viewport.getCurrentImageIdIndex();\r\n\r\n setImageSliceData({\r\n imageIndex: imageIndex,\r\n numberOfSlices: viewportData.data.imageIds.length,\r\n });\r\n\r\n return;\r\n }\r\n\r\n if (viewportData.viewportType === Enums.ViewportType.ORTHOGRAPHIC) {\r\n const sliceData = utilities.getImageSliceDataForVolumeViewport(\r\n viewport as Types.IVolumeViewport\r\n );\r\n\r\n if (!sliceData) {\r\n return;\r\n }\r\n\r\n const { imageIndex, numberOfSlices } = sliceData;\r\n setImageSliceData({ imageIndex, numberOfSlices });\r\n }\r\n }, [viewportId, viewportData]);\r\n\r\n useEffect(() => {\r\n if (viewportData?.viewportType !== Enums.ViewportType.STACK) {\r\n return;\r\n }\r\n\r\n const updateStackIndex = event => {\r\n const { newImageIdIndex } = event.detail;\r\n // find the index of imageId in the imageIds\r\n setImageSliceData({\r\n imageIndex: newImageIdIndex,\r\n numberOfSlices: viewportData.data.imageIds.length,\r\n });\r\n };\r\n\r\n element.addEventListener(Enums.Events.STACK_VIEWPORT_SCROLL, updateStackIndex);\r\n\r\n return () => {\r\n element.removeEventListener(Enums.Events.STACK_VIEWPORT_SCROLL, updateStackIndex);\r\n };\r\n }, [viewportData, element]);\r\n\r\n useEffect(() => {\r\n if (viewportData?.viewportType !== Enums.ViewportType.ORTHOGRAPHIC) {\r\n return;\r\n }\r\n\r\n const updateVolumeIndex = event => {\r\n const { imageIndex, numberOfSlices } = event.detail;\r\n // find the index of imageId in the imageIds\r\n setImageSliceData({ imageIndex, numberOfSlices });\r\n };\r\n\r\n element.addEventListener(Enums.Events.VOLUME_NEW_IMAGE, updateVolumeIndex);\r\n\r\n return () => {\r\n element.removeEventListener(Enums.Events.VOLUME_NEW_IMAGE, updateVolumeIndex);\r\n };\r\n }, [viewportData, element]);\r\n\r\n return (\r\n onImageScrollbarChange(evt, viewportId)}\r\n max={imageSliceData.numberOfSlices ? imageSliceData.numberOfSlices - 1 : 0}\r\n height={scrollbarHeight}\r\n value={imageSliceData.imageIndex}\r\n />\r\n );\r\n}\r\n\r\nCornerstoneImageScrollbar.propTypes = {\r\n viewportData: PropTypes.object,\r\n viewportId: PropTypes.string.isRequired,\r\n element: PropTypes.instanceOf(Element),\r\n scrollbarHeight: PropTypes.string,\r\n imageSliceData: PropTypes.object.isRequired,\r\n setImageSliceData: PropTypes.func.isRequired,\r\n servicesManager: PropTypes.object.isRequired,\r\n};\r\n\r\nexport default CornerstoneImageScrollbar;\r\n","import moment from 'moment';\r\nimport { metaData } from '@cornerstonejs/core';\r\n\r\n/**\r\n * Checks if value is valid.\r\n *\r\n * @param {number} value\r\n * @returns {boolean} is valid.\r\n */\r\nexport function isValidNumber(value) {\r\n return typeof value === 'number' && !isNaN(value);\r\n}\r\n\r\n/**\r\n * Formats number precision.\r\n *\r\n * @param {number} number\r\n * @param {number} precision\r\n * @returns {number} formatted number.\r\n */\r\nexport function formatNumberPrecision(number, precision = 0) {\r\n if (number !== null) {\r\n return parseFloat(number).toFixed(precision);\r\n }\r\n}\r\n\r\n/**\r\n * Formats DICOM date.\r\n *\r\n * @param {string} date\r\n * @param {string} strFormat\r\n * @returns {string} formatted date.\r\n */\r\nexport function formatDICOMDate(date, strFormat = 'MMM D, YYYY') {\r\n return moment(date, 'YYYYMMDD').format(strFormat);\r\n}\r\n\r\n/**\r\n * DICOM Time is stored as HHmmss.SSS, where:\r\n * HH 24 hour time:\r\n * m mm 0..59 Minutes\r\n * s ss 0..59 Seconds\r\n * S SS SSS 0..999 Fractional seconds\r\n *\r\n * Goal: '24:12:12'\r\n *\r\n * @param {*} time\r\n * @param {string} strFormat\r\n * @returns {string} formatted name.\r\n */\r\nexport function formatDICOMTime(time, strFormat = 'HH:mm:ss') {\r\n return moment(time, 'HH:mm:ss').format(strFormat);\r\n}\r\n\r\n/**\r\n * Formats a patient name for display purposes\r\n *\r\n * @param {string} name\r\n * @returns {string} formatted name.\r\n */\r\nexport function formatPN(name) {\r\n if (!name) {\r\n return '';\r\n }\r\n\r\n const cleaned = name\r\n .split('^')\r\n .filter(s => !!s)\r\n .join(', ')\r\n .trim();\r\n return cleaned === ',' || cleaned === '' ? '' : cleaned;\r\n}\r\n\r\n/**\r\n * Gets compression type\r\n *\r\n * @param {number} imageId\r\n * @returns {string} compression type.\r\n */\r\nexport function getCompression(imageId) {\r\n const generalImageModule = metaData.get('generalImageModule', imageId) || {};\r\n const { lossyImageCompression, lossyImageCompressionRatio, lossyImageCompressionMethod } =\r\n generalImageModule;\r\n\r\n if (lossyImageCompression === '01' && lossyImageCompressionRatio !== '') {\r\n const compressionMethod = lossyImageCompressionMethod || 'Lossy: ';\r\n const compressionRatio = formatNumberPrecision(lossyImageCompressionRatio, 2);\r\n return compressionMethod + compressionRatio + ' : 1';\r\n }\r\n\r\n return 'Lossless / Uncompressed';\r\n}\r\n","import React, { useCallback, useEffect, useMemo, useState } from 'react';\r\nimport { vec3 } from 'gl-matrix';\r\nimport PropTypes from 'prop-types';\r\nimport { metaData, Enums, utilities } from '@cornerstonejs/core';\r\nimport { ViewportOverlay } from '@ohif/ui';\r\nimport { formatPN, formatDICOMDate, formatDICOMTime, formatNumberPrecision } from './utils';\r\nimport { InstanceMetadata } from 'platform/core/src/types';\r\nimport { ServicesManager } from '@ohif/core';\r\nimport { ImageSliceData } from '@cornerstonejs/core/dist/esm/types';\r\n\r\nimport './CustomizableViewportOverlay.css';\r\n\r\nconst EPSILON = 1e-4;\r\n\r\ninterface OverlayItemProps {\r\n element: any;\r\n viewportData: any;\r\n imageSliceData: ImageSliceData;\r\n servicesManager: ServicesManager;\r\n instance: InstanceMetadata;\r\n customization: any;\r\n formatters: {\r\n formatPN: (val) => string;\r\n formatDate: (val) => string;\r\n formatTime: (val) => string;\r\n formatNumberPrecision: (val, number) => string;\r\n };\r\n\r\n // calculated values\r\n voi: {\r\n windowWidth: number;\r\n windowCenter: number;\r\n };\r\n instanceNumber?: number;\r\n scale?: number;\r\n}\r\n\r\n/**\r\n * Window Level / Center Overlay item\r\n */\r\nfunction VOIOverlayItem({ voi, customization }: OverlayItemProps) {\r\n const { windowWidth, windowCenter } = voi;\r\n if (typeof windowCenter !== 'number' || typeof windowWidth !== 'number') {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n W:\r\n {windowWidth.toFixed(0)}\r\n L:\r\n {windowCenter.toFixed(0)}\r\n \r\n );\r\n}\r\n\r\n/**\r\n * Zoom Level Overlay item\r\n */\r\nfunction ZoomOverlayItem({ scale, customization }: OverlayItemProps) {\r\n return (\r\n \r\n Zoom:\r\n {scale.toFixed(2)}x\r\n \r\n );\r\n}\r\n\r\n/**\r\n * Instance Number Overlay Item\r\n */\r\nfunction InstanceNumberOverlayItem({\r\n instanceNumber,\r\n imageSliceData,\r\n customization,\r\n}: OverlayItemProps) {\r\n const { imageIndex, numberOfSlices } = imageSliceData;\r\n\r\n return (\r\n \r\n I:\r\n \r\n {instanceNumber !== undefined && instanceNumber !== null\r\n ? `${instanceNumber} (${imageIndex + 1}/${numberOfSlices})`\r\n : `${imageIndex + 1}/${numberOfSlices}`}\r\n \r\n \r\n );\r\n}\r\n\r\n/**\r\n * Customizable Viewport Overlay\r\n */\r\nfunction CustomizableViewportOverlay({\r\n element,\r\n viewportData,\r\n imageSliceData,\r\n viewportId,\r\n servicesManager,\r\n}) {\r\n const { toolbarService, cornerstoneViewportService, customizationService } =\r\n servicesManager.services;\r\n const [voi, setVOI] = useState({ windowCenter: null, windowWidth: null });\r\n const [scale, setScale] = useState(1);\r\n const [activeTools, setActiveTools] = useState([]);\r\n const { imageIndex } = imageSliceData;\r\n\r\n const topLeftCustomization = customizationService.getModeCustomization(\r\n 'cornerstoneOverlayTopLeft'\r\n );\r\n const topRightCustomization = customizationService.getModeCustomization(\r\n 'cornerstoneOverlayTopRight'\r\n );\r\n const bottomLeftCustomization = customizationService.getModeCustomization(\r\n 'cornerstoneOverlayBottomLeft'\r\n );\r\n const bottomRightCustomization = customizationService.getModeCustomization(\r\n 'cornerstoneOverlayBottomRight'\r\n );\r\n\r\n const instance = useMemo(() => {\r\n if (viewportData != null) {\r\n return _getViewportInstance(viewportData, imageIndex);\r\n } else {\r\n return null;\r\n }\r\n }, [viewportData, imageIndex]);\r\n\r\n const instanceNumber = useMemo(() => {\r\n if (viewportData != null) {\r\n return _getInstanceNumber(viewportData, viewportId, imageIndex, cornerstoneViewportService);\r\n }\r\n return null;\r\n }, [viewportData, viewportId, imageIndex, cornerstoneViewportService]);\r\n\r\n /**\r\n * Initial toolbar state\r\n */\r\n useEffect(() => {\r\n setActiveTools(toolbarService.getActiveTools());\r\n }, []);\r\n\r\n /**\r\n * Updating the VOI when the viewport changes its voi\r\n */\r\n useEffect(() => {\r\n const updateVOI = eventDetail => {\r\n const { range } = eventDetail.detail;\r\n\r\n if (!range) {\r\n return;\r\n }\r\n\r\n const { lower, upper } = range;\r\n const { windowWidth, windowCenter } = utilities.windowLevel.toWindowLevel(lower, upper);\r\n\r\n setVOI({ windowCenter, windowWidth });\r\n };\r\n\r\n element.addEventListener(Enums.Events.VOI_MODIFIED, updateVOI);\r\n\r\n return () => {\r\n element.removeEventListener(Enums.Events.VOI_MODIFIED, updateVOI);\r\n };\r\n }, [viewportId, viewportData, voi, element]);\r\n\r\n /**\r\n * Updating the scale when the viewport changes its zoom\r\n */\r\n useEffect(() => {\r\n const updateScale = eventDetail => {\r\n const { previousCamera, camera } = eventDetail.detail;\r\n\r\n if (\r\n previousCamera.parallelScale !== camera.parallelScale ||\r\n previousCamera.scale !== camera.scale\r\n ) {\r\n const viewport = cornerstoneViewportService.getCornerstoneViewport(viewportId);\r\n\r\n if (!viewport) {\r\n return;\r\n }\r\n\r\n const imageData = viewport.getImageData();\r\n\r\n if (!imageData) {\r\n return;\r\n }\r\n\r\n if (camera.scale) {\r\n setScale(camera.scale);\r\n return;\r\n }\r\n\r\n const { spacing } = imageData;\r\n // convert parallel scale to scale\r\n const scale = (element.clientHeight * spacing[0] * 0.5) / camera.parallelScale;\r\n setScale(scale);\r\n }\r\n };\r\n\r\n element.addEventListener(Enums.Events.CAMERA_MODIFIED, updateScale);\r\n\r\n return () => {\r\n element.removeEventListener(Enums.Events.CAMERA_MODIFIED, updateScale);\r\n };\r\n }, [viewportId, viewportData, cornerstoneViewportService, element]);\r\n\r\n /**\r\n * Updating the active tools when the toolbar changes\r\n */\r\n // Todo: this should act on the toolGroups instead of the toolbar state\r\n useEffect(() => {\r\n const { unsubscribe } = toolbarService.subscribe(\r\n toolbarService.EVENTS.TOOL_BAR_STATE_MODIFIED,\r\n () => {\r\n setActiveTools(toolbarService.getActiveTools());\r\n }\r\n );\r\n\r\n return () => {\r\n unsubscribe();\r\n };\r\n }, [toolbarService]);\r\n\r\n const _renderOverlayItem = useCallback(\r\n item => {\r\n const overlayItemProps: OverlayItemProps = {\r\n element,\r\n viewportData,\r\n imageSliceData,\r\n viewportId,\r\n servicesManager,\r\n customization: item,\r\n formatters: {\r\n formatPN: formatPN,\r\n formatDate: formatDICOMDate,\r\n formatTime: formatDICOMTime,\r\n formatNumberPrecision: formatNumberPrecision,\r\n },\r\n instance,\r\n // calculated\r\n voi,\r\n scale,\r\n instanceNumber,\r\n };\r\n\r\n if (item.customizationType === 'ohif.overlayItem.windowLevel') {\r\n return ;\r\n } else if (item.customizationType === 'ohif.overlayItem.zoomLevel') {\r\n return ;\r\n } else if (item.customizationType === 'ohif.overlayItem.instanceNumber') {\r\n return ;\r\n } else {\r\n const renderItem = customizationService.transform(item);\r\n\r\n if (typeof renderItem.content === 'function') {\r\n return renderItem.content(overlayItemProps);\r\n }\r\n }\r\n },\r\n [\r\n element,\r\n viewportData,\r\n imageSliceData,\r\n viewportId,\r\n servicesManager,\r\n customizationService,\r\n instance,\r\n voi,\r\n scale,\r\n instanceNumber,\r\n ]\r\n );\r\n\r\n const getTopLeftContent = useCallback(() => {\r\n const items = topLeftCustomization?.items || [\r\n {\r\n id: 'WindowLevel',\r\n customizationType: 'ohif.overlayItem.windowLevel',\r\n },\r\n ];\r\n return (\r\n <>\r\n {items.map((item, i) => (\r\n
{_renderOverlayItem(item)}
\r\n ))}\r\n \r\n );\r\n }, [topLeftCustomization, _renderOverlayItem]);\r\n\r\n const getTopRightContent = useCallback(() => {\r\n const items = topRightCustomization?.items || [\r\n {\r\n id: 'InstanceNmber',\r\n customizationType: 'ohif.overlayItem.instanceNumber',\r\n },\r\n ];\r\n return (\r\n <>\r\n {items.map((item, i) => (\r\n
{_renderOverlayItem(item)}
\r\n ))}\r\n \r\n );\r\n }, [topRightCustomization, _renderOverlayItem]);\r\n\r\n const getBottomLeftContent = useCallback(() => {\r\n const items = bottomLeftCustomization?.items || [];\r\n return (\r\n <>\r\n {items.map((item, i) => (\r\n
{_renderOverlayItem(item)}
\r\n ))}\r\n \r\n );\r\n }, [bottomLeftCustomization, _renderOverlayItem]);\r\n\r\n const getBottomRightContent = useCallback(() => {\r\n const items = bottomRightCustomization?.items || [];\r\n return (\r\n <>\r\n {items.map((item, i) => (\r\n
{_renderOverlayItem(item)}
\r\n ))}\r\n \r\n );\r\n }, [bottomRightCustomization, _renderOverlayItem]);\r\n\r\n return (\r\n \r\n );\r\n}\r\n\r\nfunction _getViewportInstance(viewportData, imageIndex) {\r\n let imageId = null;\r\n if (viewportData.viewportType === Enums.ViewportType.STACK) {\r\n imageId = viewportData.data.imageIds[imageIndex];\r\n } else if (viewportData.viewportType === Enums.ViewportType.ORTHOGRAPHIC) {\r\n const volumes = viewportData.data;\r\n if (volumes && volumes.length == 1) {\r\n const volume = volumes[0];\r\n imageId = volume.imageIds[imageIndex];\r\n }\r\n }\r\n return imageId ? metaData.get('instance', imageId) || {} : {};\r\n}\r\n\r\nfunction _getInstanceNumber(viewportData, viewportId, imageIndex, cornerstoneViewportService) {\r\n let instanceNumber;\r\n\r\n if (viewportData.viewportType === Enums.ViewportType.STACK) {\r\n instanceNumber = _getInstanceNumberFromStack(viewportData, imageIndex);\r\n\r\n if (!instanceNumber && instanceNumber !== 0) {\r\n return null;\r\n }\r\n } else if (viewportData.viewportType === Enums.ViewportType.ORTHOGRAPHIC) {\r\n instanceNumber = _getInstanceNumberFromVolume(\r\n viewportData,\r\n imageIndex,\r\n viewportId,\r\n cornerstoneViewportService\r\n );\r\n }\r\n return instanceNumber;\r\n}\r\n\r\nfunction _getInstanceNumberFromStack(viewportData, imageIndex) {\r\n const imageIds = viewportData.data.imageIds;\r\n const imageId = imageIds[imageIndex];\r\n\r\n if (!imageId) {\r\n return;\r\n }\r\n\r\n const generalImageModule = metaData.get('generalImageModule', imageId) || {};\r\n const { instanceNumber } = generalImageModule;\r\n\r\n const stackSize = imageIds.length;\r\n\r\n if (stackSize <= 1) {\r\n return;\r\n }\r\n\r\n return parseInt(instanceNumber);\r\n}\r\n\r\n// Since volume viewports can be in any view direction, they can render\r\n// a reconstructed image which don't have imageIds; therefore, no instance and instanceNumber\r\n// Here we check if viewport is in the acquisition direction and if so, we get the instanceNumber\r\nfunction _getInstanceNumberFromVolume(viewportData, viewportId, cornerstoneViewportService) {\r\n const volumes = viewportData.volumes;\r\n\r\n // Todo: support fusion of acquisition plane which has instanceNumber\r\n if (!volumes || volumes.length > 1) {\r\n return;\r\n }\r\n\r\n const volume = volumes[0];\r\n const { direction, imageIds } = volume;\r\n\r\n const cornerstoneViewport = cornerstoneViewportService.getCornerstoneViewport(viewportId);\r\n\r\n if (!cornerstoneViewport) {\r\n return;\r\n }\r\n\r\n const camera = cornerstoneViewport.getCamera();\r\n const { viewPlaneNormal } = camera;\r\n // checking if camera is looking at the acquisition plane (defined by the direction on the volume)\r\n\r\n const scanAxisNormal = direction.slice(6, 9);\r\n\r\n // check if viewPlaneNormal is parallel to scanAxisNormal\r\n const cross = vec3.cross(vec3.create(), viewPlaneNormal, scanAxisNormal);\r\n const isAcquisitionPlane = vec3.length(cross) < EPSILON;\r\n\r\n if (isAcquisitionPlane) {\r\n const imageId = imageIds[imageIndex];\r\n\r\n if (!imageId) {\r\n return {};\r\n }\r\n\r\n const { instanceNumber } = metaData.get('generalImageModule', imageId) || {};\r\n return parseInt(instanceNumber);\r\n }\r\n}\r\n\r\nCustomizableViewportOverlay.propTypes = {\r\n viewportData: PropTypes.object,\r\n imageIndex: PropTypes.number,\r\n viewportId: PropTypes.string,\r\n};\r\n\r\nexport default CustomizableViewportOverlay;\r\n","import React, { useEffect, useState, useMemo } from 'react';\r\nimport classNames from 'classnames';\r\nimport {\r\n metaData,\r\n Enums,\r\n Types,\r\n getEnabledElement,\r\n utilities as csUtils,\r\n} from '@cornerstonejs/core';\r\nimport { utilities } from '@cornerstonejs/tools';\r\nimport PropTypes from 'prop-types';\r\nimport { vec3 } from 'gl-matrix';\r\n\r\nimport './ViewportOrientationMarkers.css';\r\n\r\nconst { getOrientationStringLPS, invertOrientationStringLPS } = utilities.orientation;\r\n\r\nfunction ViewportOrientationMarkers({\r\n element,\r\n viewportData,\r\n imageSliceData,\r\n viewportId,\r\n servicesManager,\r\n orientationMarkers = ['top', 'left'],\r\n}) {\r\n // Rotation is in degrees\r\n const [rotation, setRotation] = useState(0);\r\n const [flipHorizontal, setFlipHorizontal] = useState(false);\r\n const [flipVertical, setFlipVertical] = useState(false);\r\n const { cornerstoneViewportService } = servicesManager.services;\r\n\r\n useEffect(() => {\r\n const cameraModifiedListener = (evt: Types.EventTypes.CameraModifiedEvent) => {\r\n const { rotation, previousCamera, camera } = evt.detail;\r\n\r\n if (rotation !== undefined) {\r\n setRotation(rotation);\r\n }\r\n\r\n if (\r\n camera.flipHorizontal !== undefined &&\r\n previousCamera.flipHorizontal !== camera.flipHorizontal\r\n ) {\r\n setFlipHorizontal(camera.flipHorizontal);\r\n }\r\n\r\n if (\r\n camera.flipVertical !== undefined &&\r\n previousCamera.flipVertical !== camera.flipVertical\r\n ) {\r\n setFlipVertical(camera.flipVertical);\r\n }\r\n };\r\n\r\n element.addEventListener(Enums.Events.CAMERA_MODIFIED, cameraModifiedListener);\r\n\r\n return () => {\r\n element.removeEventListener(Enums.Events.CAMERA_MODIFIED, cameraModifiedListener);\r\n };\r\n }, []);\r\n\r\n const markers = useMemo(() => {\r\n if (!viewportData) {\r\n return '';\r\n }\r\n\r\n let rowCosines, columnCosines;\r\n if (viewportData.viewportType === 'stack') {\r\n const imageIndex = imageSliceData.imageIndex;\r\n const imageId = viewportData.data.imageIds?.[imageIndex];\r\n\r\n // Workaround for below TODO stub\r\n if (!imageId) {\r\n return false;\r\n }\r\n\r\n ({ rowCosines, columnCosines } = metaData.get('imagePlaneModule', imageId) || {});\r\n } else {\r\n if (!element || !getEnabledElement(element)) {\r\n return '';\r\n }\r\n\r\n const { viewport } = getEnabledElement(element);\r\n const { viewUp, viewPlaneNormal } = viewport.getCamera();\r\n\r\n const viewRight = vec3.create();\r\n vec3.cross(viewRight, viewUp, viewPlaneNormal);\r\n\r\n columnCosines = [-viewUp[0], -viewUp[1], -viewUp[2]];\r\n rowCosines = viewRight;\r\n }\r\n\r\n if (!rowCosines || !columnCosines || rotation === undefined) {\r\n return '';\r\n }\r\n\r\n const markers = _getOrientationMarkers(\r\n rowCosines,\r\n columnCosines,\r\n rotation,\r\n flipVertical,\r\n flipHorizontal\r\n );\r\n\r\n const ohifViewport = cornerstoneViewportService.getViewportInfo(viewportId);\r\n\r\n if (!ohifViewport) {\r\n console.log('ViewportOrientationMarkers::No viewport');\r\n return null;\r\n }\r\n const backgroundColor = ohifViewport.getViewportOptions().background;\r\n\r\n // Todo: probably this can be done in a better way in which we identify bright\r\n // background\r\n const isLight = backgroundColor ? csUtils.isEqual(backgroundColor, [1, 1, 1]) : false;\r\n\r\n return orientationMarkers.map((m, index) => (\r\n \r\n
{markers[m]}
\r\n \r\n ));\r\n }, [\r\n viewportData,\r\n imageSliceData,\r\n rotation,\r\n flipVertical,\r\n flipHorizontal,\r\n orientationMarkers,\r\n element,\r\n ]);\r\n\r\n return
{markers}
;\r\n}\r\n\r\nViewportOrientationMarkers.propTypes = {\r\n percentComplete: PropTypes.number,\r\n error: PropTypes.object,\r\n};\r\n\r\nViewportOrientationMarkers.defaultProps = {\r\n percentComplete: 0,\r\n error: null,\r\n};\r\n\r\n/**\r\n *\r\n * Computes the orientation labels on a Cornerstone-enabled Viewport element\r\n * when the viewport settings change (e.g. when a horizontal flip or a rotation occurs)\r\n *\r\n * @param {*} rowCosines\r\n * @param {*} columnCosines\r\n * @param {*} rotation in degrees\r\n * @returns\r\n */\r\nfunction _getOrientationMarkers(rowCosines, columnCosines, rotation, flipVertical, flipHorizontal) {\r\n const rowString = getOrientationStringLPS(rowCosines);\r\n const columnString = getOrientationStringLPS(columnCosines);\r\n const oppositeRowString = invertOrientationStringLPS(rowString);\r\n const oppositeColumnString = invertOrientationStringLPS(columnString);\r\n\r\n const markers = {\r\n top: oppositeColumnString,\r\n left: oppositeRowString,\r\n right: rowString,\r\n bottom: columnString,\r\n };\r\n\r\n // If any vertical or horizontal flips are applied, change the orientation strings ahead of\r\n // the rotation applications\r\n if (flipVertical) {\r\n markers.top = invertOrientationStringLPS(markers.top);\r\n markers.bottom = invertOrientationStringLPS(markers.bottom);\r\n }\r\n\r\n if (flipHorizontal) {\r\n markers.left = invertOrientationStringLPS(markers.left);\r\n markers.right = invertOrientationStringLPS(markers.right);\r\n }\r\n\r\n // Swap the labels accordingly if the viewport has been rotated\r\n // This could be done in a more complex way for intermediate rotation values (e.g. 45 degrees)\r\n if (rotation === 90 || rotation === -270) {\r\n return {\r\n top: markers.left,\r\n left: invertOrientationStringLPS(markers.top),\r\n right: invertOrientationStringLPS(markers.bottom),\r\n bottom: markers.right, // left\r\n };\r\n } else if (rotation === -90 || rotation === 270) {\r\n return {\r\n top: invertOrientationStringLPS(markers.left),\r\n left: markers.top,\r\n bottom: markers.left,\r\n right: markers.bottom,\r\n };\r\n } else if (rotation === 180 || rotation === -180) {\r\n return {\r\n top: invertOrientationStringLPS(markers.top),\r\n left: invertOrientationStringLPS(markers.left),\r\n bottom: invertOrientationStringLPS(markers.bottom),\r\n right: invertOrientationStringLPS(markers.right),\r\n };\r\n }\r\n\r\n return markers;\r\n}\r\n\r\nexport default ViewportOrientationMarkers;\r\n","import React, { useEffect, useState, useRef } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Enums } from '@cornerstonejs/core';\r\n\r\nfunction ViewportImageSliceLoadingIndicator({ viewportData, element }) {\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState(false);\r\n\r\n const loadIndicatorRef = useRef(null);\r\n const imageIdToBeLoaded = useRef(null);\r\n\r\n const setLoadingState = evt => {\r\n clearTimeout(loadIndicatorRef.current);\r\n\r\n loadIndicatorRef.current = setTimeout(() => {\r\n setLoading(true);\r\n }, 50);\r\n };\r\n\r\n const setFinishLoadingState = evt => {\r\n clearTimeout(loadIndicatorRef.current);\r\n\r\n setLoading(false);\r\n };\r\n\r\n const setErrorState = evt => {\r\n clearTimeout(loadIndicatorRef.current);\r\n\r\n if (imageIdToBeLoaded.current === evt.detail.imageId) {\r\n setError(evt.detail.error);\r\n imageIdToBeLoaded.current = null;\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n element.addEventListener(Enums.Events.STACK_VIEWPORT_SCROLL, setLoadingState);\r\n element.addEventListener(Enums.Events.IMAGE_LOAD_ERROR, setErrorState);\r\n element.addEventListener(Enums.Events.STACK_NEW_IMAGE, setFinishLoadingState);\r\n\r\n return () => {\r\n element.removeEventListener(Enums.Events.STACK_VIEWPORT_SCROLL, setLoadingState);\r\n\r\n element.removeEventListener(Enums.Events.STACK_NEW_IMAGE, setFinishLoadingState);\r\n\r\n element.removeEventListener(Enums.Events.IMAGE_LOAD_ERROR, setErrorState);\r\n };\r\n }, [element, viewportData]);\r\n\r\n if (error) {\r\n return (\r\n <>\r\n
\r\n
\r\n

\r\n

Error Loading Image

\r\n

An error has occurred.

\r\n

{error}

\r\n

\r\n
\r\n
\r\n \r\n );\r\n }\r\n\r\n if (loading) {\r\n return (\r\n // IMPORTANT: we need to use the pointer-events-none class to prevent the loading indicator from\r\n // interacting with the mouse, since scrolling should propagate to the viewport underneath\r\n
\r\n
\r\n

Loading...

\r\n
\r\n
\r\n );\r\n }\r\n\r\n return null;\r\n}\r\n\r\nViewportImageSliceLoadingIndicator.propTypes = {\r\n percentComplete: PropTypes.number,\r\n error: PropTypes.object,\r\n element: PropTypes.object,\r\n};\r\n\r\nViewportImageSliceLoadingIndicator.defaultProps = {\r\n percentComplete: 0,\r\n error: null,\r\n};\r\n\r\nexport default ViewportImageSliceLoadingIndicator;\r\n","import React, { useEffect, useState } from 'react';\r\n\r\nimport ViewportImageScrollbar from './ViewportImageScrollbar';\r\nimport CustomizableViewportOverlay from './CustomizableViewportOverlay';\r\nimport ViewportOrientationMarkers from './ViewportOrientationMarkers';\r\nimport ViewportImageSliceLoadingIndicator from './ViewportImageSliceLoadingIndicator';\r\n\r\nfunction CornerstoneOverlays(props) {\r\n const { viewportId, element, scrollbarHeight, servicesManager } = props;\r\n const { cornerstoneViewportService } = servicesManager.services;\r\n const [imageSliceData, setImageSliceData] = useState({\r\n imageIndex: 0,\r\n numberOfSlices: 0,\r\n });\r\n const [viewportData, setViewportData] = useState(null);\r\n\r\n useEffect(() => {\r\n const { unsubscribe } = cornerstoneViewportService.subscribe(\r\n cornerstoneViewportService.EVENTS.VIEWPORT_DATA_CHANGED,\r\n props => {\r\n if (props.viewportId !== viewportId) {\r\n return;\r\n }\r\n\r\n setViewportData(props.viewportData);\r\n }\r\n );\r\n\r\n return () => {\r\n unsubscribe();\r\n };\r\n }, [viewportId]);\r\n\r\n if (!element) {\r\n return null;\r\n }\r\n\r\n if (viewportData) {\r\n const viewportInfo = cornerstoneViewportService.getViewportInfo(viewportId);\r\n\r\n if (viewportInfo?.viewportOptions?.customViewportProps?.hideOverlays) {\r\n return null;\r\n }\r\n }\r\n\r\n return (\r\n
\r\n \r\n\r\n \r\n\r\n \r\n\r\n \r\n
\r\n );\r\n}\r\n\r\nexport default CornerstoneOverlays;\r\n","import React, { useEffect } from 'react';\r\nimport { CinePlayer, useCine, useViewportGrid } from '@ohif/ui';\r\nimport { Enums, eventTarget } from '@cornerstonejs/core';\r\n\r\nfunction WrappedCinePlayer({ enabledVPElement, viewportId, servicesManager }) {\r\n const { toolbarService, customizationService } = servicesManager.services;\r\n const [{ isCineEnabled, cines }, cineService] = useCine();\r\n const [{ activeViewportId }] = useViewportGrid();\r\n\r\n const { component: CinePlayerComponent = CinePlayer } =\r\n customizationService.get('cinePlayer') ?? {};\r\n\r\n const handleCineClose = () => {\r\n toolbarService.recordInteraction({\r\n groupId: 'MoreTools',\r\n interactionType: 'toggle',\r\n commands: [\r\n {\r\n commandName: 'toggleCine',\r\n commandOptions: {},\r\n toolName: 'cine',\r\n context: 'CORNERSTONE',\r\n },\r\n ],\r\n });\r\n };\r\n\r\n const cineHandler = () => {\r\n if (!cines || !cines[viewportId] || !enabledVPElement) {\r\n return;\r\n }\r\n\r\n const cine = cines[viewportId];\r\n const isPlaying = cine.isPlaying || false;\r\n const frameRate = cine.frameRate || 24;\r\n\r\n const validFrameRate = Math.max(frameRate, 1);\r\n\r\n if (isPlaying) {\r\n cineService.playClip(enabledVPElement, {\r\n framesPerSecond: validFrameRate,\r\n });\r\n } else {\r\n cineService.stopClip(enabledVPElement);\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n eventTarget.addEventListener(Enums.Events.STACK_VIEWPORT_NEW_STACK, cineHandler);\r\n\r\n return () => {\r\n cineService.setCine({ id: viewportId, isPlaying: false });\r\n eventTarget.removeEventListener(Enums.Events.STACK_VIEWPORT_NEW_STACK, cineHandler);\r\n };\r\n }, [enabledVPElement]);\r\n\r\n useEffect(() => {\r\n if (!cines || !cines[viewportId] || !enabledVPElement) {\r\n return;\r\n }\r\n\r\n cineHandler();\r\n\r\n return () => {\r\n if (enabledVPElement && cines?.[viewportId]?.isPlaying) {\r\n cineService.stopClip(enabledVPElement);\r\n }\r\n };\r\n }, [cines, viewportId, cineService, enabledVPElement, cineHandler]);\r\n\r\n const cine = cines[viewportId];\r\n const isPlaying = (cine && cine.isPlaying) || false;\r\n\r\n return (\r\n isCineEnabled && (\r\n \r\n cineService.setCine({\r\n id: activeViewportId,\r\n isPlaying,\r\n })\r\n }\r\n onFrameRateChange={frameRate =>\r\n cineService.setCine({\r\n id: activeViewportId,\r\n frameRate,\r\n })\r\n }\r\n />\r\n )\r\n );\r\n}\r\n\r\nexport default WrappedCinePlayer;\r\n","import CinePlayer from './CinePlayer';\r\n\r\nexport default CinePlayer;\r\n","import React, { useEffect, useRef, useCallback, useState } from 'react';\r\nimport ReactResizeDetector from 'react-resize-detector';\r\nimport PropTypes from 'prop-types';\r\nimport * as cs3DTools from '@cornerstonejs/tools';\r\nimport {\r\n Enums,\r\n eventTarget,\r\n getEnabledElement,\r\n StackViewport,\r\n utilities as csUtils,\r\n} from '@cornerstonejs/core';\r\nimport { MeasurementService } from '@ohif/core';\r\nimport { Notification, useViewportDialog } from '@ohif/ui';\r\nimport { IStackViewport, IVolumeViewport } from '@cornerstonejs/core/dist/esm/types';\r\n\r\nimport { setEnabledElement } from '../state';\r\n\r\nimport './OHIFCornerstoneViewport.css';\r\nimport CornerstoneOverlays from './Overlays/CornerstoneOverlays';\r\nimport getSOPInstanceAttributes from '../utils/measurementServiceMappings/utils/getSOPInstanceAttributes';\r\nimport CornerstoneServices from '../types/CornerstoneServices';\r\nimport CinePlayer from '../components/CinePlayer';\r\nimport { Types } from '@ohif/core';\r\n\r\nconst STACK = 'stack';\r\n\r\n/**\r\n * Caches the jump to measurement operation, so that if display set is shown,\r\n * it can jump to the measurement.\r\n */\r\nlet cacheJumpToMeasurementEvent;\r\n\r\nfunction areEqual(prevProps, nextProps) {\r\n if (nextProps.needsRerendering) {\r\n return false;\r\n }\r\n\r\n if (prevProps.displaySets.length !== nextProps.displaySets.length) {\r\n return false;\r\n }\r\n\r\n if (prevProps.viewportOptions.orientation !== nextProps.viewportOptions.orientation) {\r\n return false;\r\n }\r\n\r\n if (prevProps.viewportOptions.toolGroupId !== nextProps.viewportOptions.toolGroupId) {\r\n return false;\r\n }\r\n\r\n if (prevProps.viewportOptions.viewportType !== nextProps.viewportOptions.viewportType) {\r\n return false;\r\n }\r\n\r\n if (nextProps.viewportOptions.needsRerendering) {\r\n return false;\r\n }\r\n\r\n const prevDisplaySets = prevProps.displaySets;\r\n const nextDisplaySets = nextProps.displaySets;\r\n\r\n if (prevDisplaySets.length !== nextDisplaySets.length) {\r\n return false;\r\n }\r\n\r\n for (let i = 0; i < prevDisplaySets.length; i++) {\r\n const prevDisplaySet = prevDisplaySets[i];\r\n\r\n const foundDisplaySet = nextDisplaySets.find(\r\n nextDisplaySet =>\r\n nextDisplaySet.displaySetInstanceUID === prevDisplaySet.displaySetInstanceUID\r\n );\r\n\r\n if (!foundDisplaySet) {\r\n return false;\r\n }\r\n\r\n // check they contain the same image\r\n if (foundDisplaySet.images?.length !== prevDisplaySet.images?.length) {\r\n return false;\r\n }\r\n\r\n // check if their imageIds are the same\r\n if (foundDisplaySet.images?.length) {\r\n for (let j = 0; j < foundDisplaySet.images.length; j++) {\r\n if (foundDisplaySet.images[j].imageId !== prevDisplaySet.images[j].imageId) {\r\n return false;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\n// Todo: This should be done with expose of internal API similar to react-vtkjs-viewport\r\n// Then we don't need to worry about the re-renders if the props change.\r\nconst OHIFCornerstoneViewport = React.memo(props => {\r\n const {\r\n displaySets,\r\n dataSource,\r\n viewportOptions,\r\n displaySetOptions,\r\n servicesManager,\r\n commandsManager,\r\n onElementEnabled,\r\n onElementDisabled,\r\n isJumpToMeasurementDisabled,\r\n // Note: you SHOULD NOT use the initialImageIdOrIndex for manipulation\r\n // of the imageData in the OHIFCornerstoneViewport. This prop is used\r\n // to set the initial state of the viewport's first image to render\r\n initialImageIndex,\r\n } = props;\r\n\r\n const viewportId = viewportOptions.viewportId;\r\n const [scrollbarHeight, setScrollbarHeight] = useState('100px');\r\n const [enabledVPElement, setEnabledVPElement] = useState(null);\r\n const elementRef = useRef();\r\n\r\n const {\r\n measurementService,\r\n displaySetService,\r\n toolbarService,\r\n toolGroupService,\r\n syncGroupService,\r\n cornerstoneViewportService,\r\n cornerstoneCacheService,\r\n viewportGridService,\r\n stateSyncService,\r\n } = servicesManager.services as CornerstoneServices;\r\n\r\n const [viewportDialogState] = useViewportDialog();\r\n // useCallback for scroll bar height calculation\r\n const setImageScrollBarHeight = useCallback(() => {\r\n const scrollbarHeight = `${elementRef.current.clientHeight - 20}px`;\r\n setScrollbarHeight(scrollbarHeight);\r\n }, [elementRef]);\r\n\r\n // useCallback for onResize\r\n const onResize = useCallback(() => {\r\n if (elementRef.current) {\r\n cornerstoneViewportService.resize();\r\n setImageScrollBarHeight();\r\n }\r\n }, [elementRef]);\r\n\r\n const cleanUpServices = useCallback(\r\n viewportInfo => {\r\n const renderingEngineId = viewportInfo.getRenderingEngineId();\r\n const syncGroups = viewportInfo.getSyncGroups();\r\n\r\n toolGroupService.removeViewportFromToolGroup(viewportId, renderingEngineId);\r\n\r\n syncGroupService.removeViewportFromSyncGroup(viewportId, renderingEngineId, syncGroups);\r\n },\r\n [viewportId]\r\n );\r\n\r\n const elementEnabledHandler = useCallback(\r\n evt => {\r\n // check this is this element reference and return early if doesn't match\r\n if (evt.detail.element !== elementRef.current) {\r\n return;\r\n }\r\n\r\n const { viewportId, element } = evt.detail;\r\n const viewportInfo = cornerstoneViewportService.getViewportInfo(viewportId);\r\n setEnabledElement(viewportId, element);\r\n setEnabledVPElement(element);\r\n\r\n const renderingEngineId = viewportInfo.getRenderingEngineId();\r\n const toolGroupId = viewportInfo.getToolGroupId();\r\n const syncGroups = viewportInfo.getSyncGroups();\r\n\r\n toolGroupService.addViewportToToolGroup(viewportId, renderingEngineId, toolGroupId);\r\n\r\n syncGroupService.addViewportToSyncGroup(viewportId, renderingEngineId, syncGroups);\r\n\r\n if (onElementEnabled) {\r\n onElementEnabled(evt);\r\n }\r\n },\r\n [viewportId, onElementEnabled, toolGroupService]\r\n );\r\n\r\n // disable the element upon unmounting\r\n useEffect(() => {\r\n cornerstoneViewportService.enableViewport(viewportId, elementRef.current);\r\n\r\n eventTarget.addEventListener(Enums.Events.ELEMENT_ENABLED, elementEnabledHandler);\r\n\r\n setImageScrollBarHeight();\r\n\r\n return () => {\r\n const viewportInfo = cornerstoneViewportService.getViewportInfo(viewportId);\r\n\r\n if (!viewportInfo) {\r\n return;\r\n }\r\n\r\n cleanUpServices(viewportInfo);\r\n cornerstoneViewportService.storePresentation({ viewportId });\r\n\r\n if (onElementDisabled) {\r\n onElementDisabled(viewportInfo);\r\n }\r\n\r\n eventTarget.removeEventListener(Enums.Events.ELEMENT_ENABLED, elementEnabledHandler);\r\n };\r\n }, []);\r\n\r\n // subscribe to displaySet metadata invalidation (updates)\r\n // Currently, if the metadata changes we need to re-render the display set\r\n // for it to take effect in the viewport. As we deal with scaling in the loading,\r\n // we need to remove the old volume from the cache, and let the\r\n // viewport to re-add it which will use the new metadata. Otherwise, the\r\n // viewport will use the cached volume and the new metadata will not be used.\r\n // Note: this approach does not actually end of sending network requests\r\n // and it uses the network cache\r\n useEffect(() => {\r\n const { unsubscribe } = displaySetService.subscribe(\r\n displaySetService.EVENTS.DISPLAY_SET_SERIES_METADATA_INVALIDATED,\r\n async ({\r\n displaySetInstanceUID: invalidatedDisplaySetInstanceUID,\r\n invalidateData,\r\n }: Types.DisplaySetSeriesMetadataInvalidatedEvent) => {\r\n if (!invalidateData) {\r\n return;\r\n }\r\n\r\n const viewportInfo = cornerstoneViewportService.getViewportInfo(viewportId);\r\n\r\n if (viewportInfo.hasDisplaySet(invalidatedDisplaySetInstanceUID)) {\r\n const viewportData = viewportInfo.getViewportData();\r\n const newViewportData = await cornerstoneCacheService.invalidateViewportData(\r\n viewportData,\r\n invalidatedDisplaySetInstanceUID,\r\n dataSource,\r\n displaySetService\r\n );\r\n\r\n const keepCamera = true;\r\n cornerstoneViewportService.updateViewport(viewportId, newViewportData, keepCamera);\r\n }\r\n }\r\n );\r\n return () => {\r\n unsubscribe();\r\n };\r\n }, [viewportId]);\r\n\r\n useEffect(() => {\r\n // handle the default viewportType to be stack\r\n if (!viewportOptions.viewportType) {\r\n viewportOptions.viewportType = STACK;\r\n }\r\n\r\n const loadViewportData = async () => {\r\n const viewportData = await cornerstoneCacheService.createViewportData(\r\n displaySets,\r\n viewportOptions,\r\n dataSource,\r\n initialImageIndex\r\n );\r\n\r\n // The presentation state will have been stored previously by closing\r\n // a viewport. Otherwise, this viewport will be unchanged and the\r\n // presentation information will be directly carried over.\r\n const { lutPresentationStore, positionPresentationStore } = stateSyncService.getState();\r\n const { presentationIds } = viewportOptions;\r\n const presentations = {\r\n positionPresentation: positionPresentationStore[presentationIds?.positionPresentationId],\r\n lutPresentation: lutPresentationStore[presentationIds?.lutPresentationId],\r\n };\r\n let measurement;\r\n if (cacheJumpToMeasurementEvent?.viewportId === viewportId) {\r\n measurement = cacheJumpToMeasurementEvent.measurement;\r\n // Delete the position presentation so that viewport navigates direct\r\n presentations.positionPresentation = null;\r\n cacheJumpToMeasurementEvent = null;\r\n }\r\n\r\n // Note: This is a hack to get the grid to re-render the OHIFCornerstoneViewport component\r\n // Used for segmentation hydration right now, since the logic to decide whether\r\n // a viewport needs to render a segmentation lives inside the CornerstoneViewportService\r\n // so we need to re-render (force update via change of the needsRerendering) so that React\r\n // does the diffing and decides we should render this again (although the id and element has not changed)\r\n // so that the CornerstoneViewportService can decide whether to render the segmentation or not. Not that we reached here we can turn it off.\r\n if (viewportOptions.needsRerendering) {\r\n viewportOptions.needsRerendering = false;\r\n }\r\n\r\n cornerstoneViewportService.setViewportData(\r\n viewportId,\r\n viewportData,\r\n viewportOptions,\r\n displaySetOptions,\r\n presentations\r\n );\r\n if (measurement) {\r\n cs3DTools.annotation.selection.setAnnotationSelected(measurement.uid);\r\n }\r\n };\r\n\r\n loadViewportData();\r\n }, [viewportOptions, displaySets, dataSource]);\r\n\r\n /**\r\n * There are two scenarios for jump to click\r\n * 1. Current viewports contain the displaySet that the annotation was drawn on\r\n * 2. Current viewports don't contain the displaySet that the annotation was drawn on\r\n * and we need to change the viewports displaySet for jumping.\r\n * Since measurement_jump happens via events and listeners, the former case is handled\r\n * by the measurement_jump direct callback, but the latter case is handled first by\r\n * the viewportGrid to set the correct displaySet on the viewport, AND THEN we check\r\n * the cache for jumping to see if there is any jump queued, then we jump to the correct slice.\r\n */\r\n useEffect(() => {\r\n if (isJumpToMeasurementDisabled) {\r\n return;\r\n }\r\n\r\n const unsubscribeFromJumpToMeasurementEvents = _subscribeToJumpToMeasurementEvents(\r\n measurementService,\r\n displaySetService,\r\n elementRef,\r\n viewportId,\r\n displaySets,\r\n viewportGridService,\r\n cornerstoneViewportService\r\n );\r\n\r\n _checkForCachedJumpToMeasurementEvents(\r\n measurementService,\r\n displaySetService,\r\n elementRef,\r\n viewportId,\r\n displaySets,\r\n viewportGridService,\r\n cornerstoneViewportService\r\n );\r\n\r\n return () => {\r\n unsubscribeFromJumpToMeasurementEvents();\r\n };\r\n }, [displaySets, elementRef, viewportId]);\r\n\r\n return (\r\n \r\n
\r\n \r\n e.preventDefault()}\r\n onMouseDown={e => e.preventDefault()}\r\n ref={elementRef}\r\n >
\r\n \r\n \r\n \r\n
\r\n {viewportDialogState.viewportId === viewportId && (\r\n \r\n )}\r\n
\r\n
\r\n );\r\n}, areEqual);\r\n\r\nfunction _subscribeToJumpToMeasurementEvents(\r\n measurementService,\r\n displaySetService,\r\n elementRef,\r\n viewportId,\r\n displaySets,\r\n viewportGridService,\r\n cornerstoneViewportService\r\n) {\r\n const { unsubscribe } = measurementService.subscribe(\r\n MeasurementService.EVENTS.JUMP_TO_MEASUREMENT_VIEWPORT,\r\n props => {\r\n cacheJumpToMeasurementEvent = props;\r\n const { viewportId: jumpId, measurement, isConsumed } = props;\r\n if (!measurement || isConsumed) {\r\n return;\r\n }\r\n if (cacheJumpToMeasurementEvent.cornerstoneViewport === undefined) {\r\n // Decide on which viewport should handle this\r\n cacheJumpToMeasurementEvent.cornerstoneViewport =\r\n cornerstoneViewportService.getViewportIdToJump(\r\n jumpId,\r\n measurement.displaySetInstanceUID,\r\n { referencedImageId: measurement.referencedImageId }\r\n );\r\n }\r\n if (cacheJumpToMeasurementEvent.cornerstoneViewport !== viewportId) {\r\n return;\r\n }\r\n _jumpToMeasurement(\r\n measurement,\r\n elementRef,\r\n viewportId,\r\n measurementService,\r\n displaySetService,\r\n viewportGridService,\r\n cornerstoneViewportService\r\n );\r\n }\r\n );\r\n\r\n return unsubscribe;\r\n}\r\n\r\n// Check if there is a queued jumpToMeasurement event\r\nfunction _checkForCachedJumpToMeasurementEvents(\r\n measurementService,\r\n displaySetService,\r\n elementRef,\r\n viewportId,\r\n displaySets,\r\n viewportGridService,\r\n cornerstoneViewportService\r\n) {\r\n if (!cacheJumpToMeasurementEvent) {\r\n return;\r\n }\r\n if (cacheJumpToMeasurementEvent.isConsumed) {\r\n cacheJumpToMeasurementEvent = null;\r\n return;\r\n }\r\n const displaysUIDs = displaySets.map(displaySet => displaySet.displaySetInstanceUID);\r\n if (!displaysUIDs?.length) {\r\n return;\r\n }\r\n\r\n // Jump to measurement if the measurement exists\r\n const { measurement } = cacheJumpToMeasurementEvent;\r\n if (measurement && elementRef) {\r\n if (displaysUIDs.includes(measurement?.displaySetInstanceUID)) {\r\n _jumpToMeasurement(\r\n measurement,\r\n elementRef,\r\n viewportId,\r\n measurementService,\r\n displaySetService,\r\n viewportGridService,\r\n cornerstoneViewportService\r\n );\r\n }\r\n }\r\n}\r\n\r\nfunction _jumpToMeasurement(\r\n measurement,\r\n targetElementRef,\r\n viewportId,\r\n measurementService,\r\n displaySetService,\r\n viewportGridService,\r\n cornerstoneViewportService\r\n) {\r\n const targetElement = targetElementRef.current;\r\n const { displaySetInstanceUID, SOPInstanceUID, frameNumber } = measurement;\r\n\r\n if (!SOPInstanceUID) {\r\n console.warn('cannot jump in a non-acquisition plane measurements yet');\r\n return;\r\n }\r\n\r\n const referencedDisplaySet = displaySetService.getDisplaySetByUID(displaySetInstanceUID);\r\n\r\n // Todo: setCornerstoneMeasurementActive should be handled by the toolGroupManager\r\n // to set it properly\r\n // setCornerstoneMeasurementActive(measurement);\r\n\r\n viewportGridService.setActiveViewportId(viewportId);\r\n\r\n const enabledElement = getEnabledElement(targetElement);\r\n\r\n if (enabledElement) {\r\n // See how the jumpToSlice() of Cornerstone3D deals with imageIdx param.\r\n const viewport = enabledElement.viewport as IStackViewport | IVolumeViewport;\r\n\r\n let imageIdIndex = 0;\r\n let viewportCameraDirectionMatch = true;\r\n\r\n if (viewport instanceof StackViewport) {\r\n const imageIds = viewport.getImageIds();\r\n imageIdIndex = imageIds.findIndex(imageId => {\r\n const { SOPInstanceUID: aSOPInstanceUID, frameNumber: aFrameNumber } =\r\n getSOPInstanceAttributes(imageId);\r\n return aSOPInstanceUID === SOPInstanceUID && (!frameNumber || frameNumber === aFrameNumber);\r\n });\r\n } else {\r\n // for volume viewport we can't rely on the imageIdIndex since it can be\r\n // a reconstructed view that doesn't match the original slice numbers etc.\r\n const { viewPlaneNormal: measurementViewPlane } = measurement.metadata;\r\n imageIdIndex = referencedDisplaySet.images.findIndex(\r\n i => i.SOPInstanceUID === SOPInstanceUID\r\n );\r\n\r\n const { viewPlaneNormal: viewportViewPlane } = viewport.getCamera();\r\n\r\n // should compare abs for both planes since the direction can be flipped\r\n if (\r\n measurementViewPlane &&\r\n !csUtils.isEqual(measurementViewPlane.map(Math.abs), viewportViewPlane.map(Math.abs))\r\n ) {\r\n viewportCameraDirectionMatch = false;\r\n }\r\n }\r\n\r\n if (!viewportCameraDirectionMatch || imageIdIndex === -1) {\r\n return;\r\n }\r\n\r\n cs3DTools.utilities.jumpToSlice(targetElement, {\r\n imageIndex: imageIdIndex,\r\n });\r\n\r\n cs3DTools.annotation.selection.setAnnotationSelected(measurement.uid);\r\n // Jump to measurement consumed, remove.\r\n cacheJumpToMeasurementEvent?.consume?.();\r\n cacheJumpToMeasurementEvent = null;\r\n }\r\n}\r\n\r\n// Component displayName\r\nOHIFCornerstoneViewport.displayName = 'OHIFCornerstoneViewport';\r\n\r\nOHIFCornerstoneViewport.defaultProps = {\r\n isJumpToMeasurementDisabled: false,\r\n};\r\n\r\nOHIFCornerstoneViewport.propTypes = {\r\n displaySets: PropTypes.array.isRequired,\r\n dataSource: PropTypes.object.isRequired,\r\n viewportOptions: PropTypes.object,\r\n displaySetOptions: PropTypes.arrayOf(PropTypes.any),\r\n servicesManager: PropTypes.object.isRequired,\r\n onElementEnabled: PropTypes.func,\r\n isJumpToMeasurementDisabled: PropTypes.bool,\r\n // Note: you SHOULD NOT use the initialImageIdOrIndex for manipulation\r\n // of the imageData in the OHIFCornerstoneViewport. This prop is used\r\n // to set the initial state of the viewport's first image to render\r\n initialImageIdOrIndex: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\r\n};\r\n\r\nexport default OHIFCornerstoneViewport;\r\n"],"names":["CornerstoneImageScrollbar","_ref","viewportData","viewportId","element","imageSliceData","setImageSliceData","scrollbarHeight","servicesManager","cineService","cornerstoneViewportService","services","useEffect","viewport","getCornerstoneViewport","viewportType","Enums","STACK","ORTHOGRAPHIC","sliceData","utilities","imageIndex","numberOfSlices","getCurrentImageIdIndex","data","imageIds","length","updateStackIndex","event","newImageIdIndex","detail","addEventListener","STACK_VIEWPORT_SCROLL","removeEventListener","updateVolumeIndex","VOLUME_NEW_IMAGE","React","ImageScrollbar","onChange","evt","onImageScrollbarChange","isCineEnabled","getState","stopClip","setCine","id","isPlaying","csToolsUtils","debounceLoading","max","height","value","propTypes","PropTypes","isRequired","Element","formatNumberPrecision","number","precision","arguments","undefined","parseFloat","toFixed","formatDICOMDate","date","strFormat","moment","format","formatDICOMTime","time","formatPN","name","cleaned","split","filter","s","join","trim","EPSILON","VOIOverlayItem","voi","customization","windowWidth","windowCenter","className","style","color","ZoomOverlayItem","_ref2","scale","InstanceNumberOverlayItem","_ref3","instanceNumber","CustomizableViewportOverlay","_ref4","toolbarService","customizationService","setVOI","useState","setScale","activeTools","setActiveTools","topLeftCustomization","getModeCustomization","topRightCustomization","bottomLeftCustomization","bottomRightCustomization","instance","useMemo","imageId","volumes","metaData","_getViewportInstance","generalImageModule","parseInt","_getInstanceNumberFromStack","_getInstanceNumberFromVolume","_getInstanceNumber","getActiveTools","updateVOI","eventDetail","range","lower","upper","VOI_MODIFIED","updateScale","previousCamera","camera","parallelScale","imageData","getImageData","spacing","clientHeight","CAMERA_MODIFIED","unsubscribe","subscribe","EVENTS","TOOL_BAR_STATE_MODIFIED","_renderOverlayItem","useCallback","item","overlayItemProps","formatters","formatDate","formatTime","customizationType","renderItem","transform","content","getTopLeftContent","items","map","i","key","getTopRightContent","getBottomLeftContent","getBottomRightContent","ViewportOverlay","topLeft","topRight","bottomLeft","bottomRight","volume","direction","cornerstoneViewport","getCamera","viewPlaneNormal","scanAxisNormal","slice","cross","vec3","getOrientationStringLPS","invertOrientationStringLPS","ViewportOrientationMarkers","orientationMarkers","rotation","setRotation","flipHorizontal","setFlipHorizontal","flipVertical","setFlipVertical","cameraModifiedListener","markers","rowCosines","columnCosines","getEnabledElement","viewUp","viewRight","rowString","columnString","oppositeRowString","top","left","right","bottom","_getOrientationMarkers","ohifViewport","getViewportInfo","console","log","backgroundColor","getViewportOptions","background","isLight","csUtils","m","index","classNames","percentComplete","error","defaultProps","ViewportImageSliceLoadingIndicator","loading","setLoading","setError","loadIndicatorRef","useRef","imageIdToBeLoaded","setLoadingState","clearTimeout","current","setTimeout","setFinishLoadingState","setErrorState","IMAGE_LOAD_ERROR","STACK_NEW_IMAGE","props","setViewportData","VIEWPORT_DATA_CHANGED","viewportInfo","viewportOptions","customViewportProps","hideOverlays","ViewportImageScrollbar","enabledVPElement","cines","useCine","activeViewportId","useViewportGrid","component","CinePlayerComponent","CinePlayer","get","cineHandler","cine","frameRate","validFrameRate","Math","playClip","framesPerSecond","eventTarget","STACK_VIEWPORT_NEW_STACK","onClose","handleCineClose","recordInteraction","groupId","interactionType","commands","commandName","commandOptions","toolName","context","onPlayPauseChange","onFrameRateChange","cacheJumpToMeasurementEvent","areEqual","prevProps","nextProps","needsRerendering","displaySets","orientation","toolGroupId","prevDisplaySets","nextDisplaySets","prevDisplaySet","foundDisplaySet","find","nextDisplaySet","displaySetInstanceUID","images","j","OHIFCornerstoneViewport","dataSource","displaySetOptions","commandsManager","onElementEnabled","onElementDisabled","isJumpToMeasurementDisabled","initialImageIndex","setScrollbarHeight","setEnabledVPElement","elementRef","measurementService","displaySetService","toolGroupService","syncGroupService","cornerstoneCacheService","viewportGridService","stateSyncService","viewportDialogState","useViewportDialog","setImageScrollBarHeight","onResize","resize","cleanUpServices","renderingEngineId","getRenderingEngineId","syncGroups","getSyncGroups","removeViewportFromToolGroup","removeViewportFromSyncGroup","elementEnabledHandler","setEnabledElement","getToolGroupId","addViewportToToolGroup","addViewportToSyncGroup","enableViewport","ELEMENT_ENABLED","storePresentation","DISPLAY_SET_SERIES_METADATA_INVALIDATED","async","invalidatedDisplaySetInstanceUID","invalidateData","hasDisplaySet","getViewportData","newViewportData","invalidateViewportData","keepCamera","updateViewport","createViewportData","lutPresentationStore","positionPresentationStore","presentationIds","presentations","positionPresentation","positionPresentationId","lutPresentation","lutPresentationId","measurement","cs3DTools","uid","loadViewportData","unsubscribeFromJumpToMeasurementEvents","MeasurementService","JUMP_TO_MEASUREMENT_VIEWPORT","jumpId","isConsumed","getViewportIdToJump","referencedImageId","_jumpToMeasurement","_subscribeToJumpToMeasurementEvents","displaysUIDs","displaySet","includes","_checkForCachedJumpToMeasurementEvents","ReactResizeDetector","refreshMode","refreshRate","targetRef","width","onContextMenu","e","preventDefault","onMouseDown","ref","CornerstoneOverlays","toolBarService","Notification","message","type","actions","onSubmit","onOutsideClick","targetElementRef","targetElement","SOPInstanceUID","frameNumber","warn","referencedDisplaySet","getDisplaySetByUID","setActiveViewportId","enabledElement","imageIdIndex","viewportCameraDirectionMatch","StackViewport","getImageIds","findIndex","aSOPInstanceUID","aFrameNumber","getSOPInstanceAttributes","measurementViewPlane","metadata","viewportViewPlane","abs","consume","displayName","initialImageIdOrIndex"],"sourceRoot":""} \ No newline at end of file diff --git a/resources/181.css b/resources/181.css new file mode 100644 index 0000000..cbd4283 --- /dev/null +++ b/resources/181.css @@ -0,0 +1,5 @@ +.viewport-wrapper{height:100%;position:relative;width:100%}.cornerstone-viewport-element{background-color:#000;height:100%;outline:0!important;overflow:hidden;position:relative;width:100%} +.viewport-overlay{max-width:40%}.viewport-overlay span{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.viewport-overlay.left-viewport{text-align:left}.viewport-overlay.right-viewport-scrollbar{text-align:right}.viewport-overlay.right-viewport-scrollbar .flex.flex-row{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end} +.ViewportOrientationMarkers{--marker-width:100px;--marker-height:100px;--scrollbar-width:20px;font-size:15px;line-height:18px;pointer-events:none}.ViewportOrientationMarkers .orientation-marker{position:absolute}.ViewportOrientationMarkers .top-mid{left:50%;top:.6rem}.ViewportOrientationMarkers .left-mid{left:5px;top:47%}.ViewportOrientationMarkers .right-mid{left:calc(100% - var(--marker-width) - var(--scrollbar-width));top:47%}.ViewportOrientationMarkers .bottom-mid{left:47%;top:calc(100% - var(--marker-height) - .6rem)}.ViewportOrientationMarkers .right-mid .orientation-marker-value{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;min-width:var(--marker-width)}.ViewportOrientationMarkers .bottom-mid .orientation-marker-value{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;min-height:var(--marker-height)} + +/*# sourceMappingURL=181.css.map*/ \ No newline at end of file diff --git a/resources/181.css.map b/resources/181.css.map new file mode 100644 index 0000000..fb60bef --- /dev/null +++ b/resources/181.css.map @@ -0,0 +1 @@ +{"version":3,"file":"181.css","mappings":"AAAA,kBAEE,WAAY,CACZ,iBAAkB,CAFlB,UAGF,CAEA,8BAIE,qBAAuB,CAFvB,WAAY,CAKZ,mBAAqB,CAIrB,eAAgB,CARhB,iBAAkB,CAFlB,UAWF,C;ACbA,kBACE,aACF,CACA,uBACE,cAAe,CACf,eAAgB,CAChB,sBAAuB,CACvB,kBACF,CAEA,gCACE,eACF,CAEA,2CACE,gBACF,CACA,0DACE,oBAAyB,CAAzB,iBAAyB,CAAzB,wBACF,C;ACxBA,4BACE,oBAAqB,CACrB,qBAAsB,CACtB,sBAAuB,CAEvB,cAAe,CACf,gBAAiB,CAFjB,mBAGF,CACA,gDACE,iBACF,CACA,qCAEE,QAAS,CADT,SAEF,CACA,sCAEE,QAAS,CADT,OAEF,CACA,uCAEE,8DAA+D,CAD/D,OAEF,CACA,wCAEE,QAAS,CADT,6CAEF,CACA,iEACE,mBAAa,CAAb,mBAAa,CAAb,YAAa,CACb,oBAAyB,CAAzB,iBAAyB,CAAzB,wBAAyB,CACzB,6BACF,CACA,kEACE,mBAAa,CAAb,mBAAa,CAAb,YAAa,CAGb,2BAA8B,CAA9B,6BAA8B,CAA9B,iCAA8B,CAA9B,6BAA8B,CAF9B,sBAA2B,CAA3B,mBAA2B,CAA3B,0BAA2B,CAC3B,+BAEF,C","sources":["webpack:///../../../extensions/cornerstone/src/Viewport/OHIFCornerstoneViewport.css","webpack:///../../../extensions/cornerstone/src/Viewport/Overlays/CustomizableViewportOverlay.css","webpack:///../../../extensions/cornerstone/src/Viewport/Overlays/ViewportOrientationMarkers.css"],"sourcesContent":[".viewport-wrapper {\r\n width: 100%;\r\n height: 100%; /* MUST have `height` to prevent resize infinite loop */\r\n position: relative;\r\n}\r\n\r\n.cornerstone-viewport-element {\r\n width: 100%;\r\n height: 100%;\r\n position: relative;\r\n background-color: black;\r\n\r\n /* Prevent the blue outline in Chrome when a viewport is selected */\r\n outline: 0 !important;\r\n\r\n /* Prevents the entire page from getting larger\r\n when the magnify tool is near the sides/corners of the page */\r\n overflow: hidden;\r\n}\r\n","/*\r\ncustom overlay panels: top-left, top-right, bottom-left and bottom-right\r\nIf any text to be displayed on the overlay is too long to hold on a single\r\nline, it will be truncated with ellipsis in the end.\r\n*/\r\n.viewport-overlay {\r\n max-width: 40%;\r\n}\r\n.viewport-overlay span {\r\n max-width: 100%;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n.viewport-overlay.left-viewport {\r\n text-align: left;\r\n}\r\n\r\n.viewport-overlay.right-viewport-scrollbar {\r\n text-align: right;\r\n}\r\n.viewport-overlay.right-viewport-scrollbar .flex.flex-row {\r\n justify-content: flex-end;\r\n}\r\n",".ViewportOrientationMarkers {\r\n --marker-width: 100px;\r\n --marker-height: 100px;\r\n --scrollbar-width: 20px;\r\n pointer-events: none;\r\n font-size: 15px;\r\n line-height: 18px;\r\n}\r\n.ViewportOrientationMarkers .orientation-marker {\r\n position: absolute;\r\n}\r\n.ViewportOrientationMarkers .top-mid {\r\n top: 0.6rem;\r\n left: 50%;\r\n}\r\n.ViewportOrientationMarkers .left-mid {\r\n top: 47%;\r\n left: 5px;\r\n}\r\n.ViewportOrientationMarkers .right-mid {\r\n top: 47%;\r\n left: calc(100% - var(--marker-width) - var(--scrollbar-width));\r\n}\r\n.ViewportOrientationMarkers .bottom-mid {\r\n top: calc(100% - var(--marker-height) - 0.6rem);\r\n left: 47%;\r\n}\r\n.ViewportOrientationMarkers .right-mid .orientation-marker-value {\r\n display: flex;\r\n justify-content: flex-end;\r\n min-width: var(--marker-width);\r\n}\r\n.ViewportOrientationMarkers .bottom-mid .orientation-marker-value {\r\n display: flex;\r\n justify-content: flex-start;\r\n min-height: var(--marker-height);\r\n flex-direction: column-reverse;\r\n}\r\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/resources/19.bundle.97cd1d5f412be83022cf.js b/resources/19.bundle.97cd1d5f412be83022cf.js new file mode 100644 index 0000000..d9992a8 --- /dev/null +++ b/resources/19.bundle.97cd1d5f412be83022cf.js @@ -0,0 +1,2 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[19,579],{41832:(e,t,n)=>{n.d(t,{Z:()=>V,I:()=>x});var s=n(43001),r=n(3827),a=n.n(r),i=n(261),o=n(44530),c=n(71783);const d=-1,u=0,l=1,S=2,p=3,y=4,I=5,m={id:"measurementTracking",initial:"idle",context:{activeViewportId:null,trackedStudy:"",trackedSeries:[],ignoredSeries:[],prevTrackedStudy:"",prevTrackedSeries:[],prevIgnoredSeries:[],ignoredSRSeriesForHydration:[],isDirty:!1},states:{off:{type:"final"},idle:{entry:"clearContext",on:{TRACK_SERIES:"promptBeginTracking",SET_TRACKED_SERIES:[{target:"tracking",actions:["setTrackedStudyAndMultipleSeries","setIsDirtyToClean"]}],PROMPT_HYDRATE_SR:{target:"promptHydrateStructuredReport",cond:"hasNotIgnoredSRSeriesForHydration"},RESTORE_PROMPT_HYDRATE_SR:"promptHydrateStructuredReport",HYDRATE_SR:"hydrateStructuredReport",UPDATE_ACTIVE_VIEWPORT_ID:{actions:(0,i.f0)({activeViewportId:(e,t)=>t.activeViewportId})}}},promptBeginTracking:{invoke:{src:"promptBeginTracking",onDone:[{target:"tracking",actions:["setTrackedStudyAndSeries","setIsDirty"],cond:"shouldSetStudyAndSeries"},{target:"off",cond:"shouldKillMachine"},{target:"idle"}],onError:{target:"idle"}}},tracking:{on:{TRACK_SERIES:[{target:"promptTrackNewStudy",cond:"isNewStudy"},{target:"promptTrackNewSeries",cond:"isNewSeries"}],UNTRACK_SERIES:[{target:"tracking",actions:["removeTrackedSeries","setIsDirty"],cond:"hasRemainingTrackedSeries"},{target:"idle"}],SET_TRACKED_SERIES:[{target:"tracking",actions:["setTrackedStudyAndMultipleSeries"]}],SAVE_REPORT:"promptSaveReport",SET_DIRTY:[{target:"tracking",actions:["setIsDirty"],cond:"shouldSetDirty"},{target:"tracking"}]}},promptTrackNewSeries:{invoke:{src:"promptTrackNewSeries",onDone:[{target:"tracking",actions:["addTrackedSeries","setIsDirty"],cond:"shouldAddSeries"},{target:"tracking",actions:["discardPreviouslyTrackedMeasurements","setTrackedStudyAndSeries","setIsDirty"],cond:"shouldSetStudyAndSeries"},{target:"promptSaveReport",cond:"shouldPromptSaveReport"},{target:"tracking"}],onError:{target:"idle"}}},promptTrackNewStudy:{invoke:{src:"promptTrackNewStudy",onDone:[{target:"tracking",actions:["discardPreviouslyTrackedMeasurements","setTrackedStudyAndSeries","setIsDirty"],cond:"shouldSetStudyAndSeries"},{target:"tracking",actions:["ignoreSeries"],cond:"shouldAddIgnoredSeries"},{target:"promptSaveReport",cond:"shouldPromptSaveReport"},{target:"tracking"}],onError:{target:"idle"}}},promptSaveReport:{invoke:{src:"promptSaveReport",onDone:[{target:"idle",actions:["clearAllMeasurements","showStructuredReportDisplaySetInActiveViewport"],cond:"shouldSaveAndContinueWithSameReport"},{target:"tracking",actions:["discardPreviouslyTrackedMeasurements","setTrackedStudyAndSeries"],cond:"shouldSaveAndStartNewReport"},{target:"tracking"}],onError:{target:"idle"}}},promptHydrateStructuredReport:{invoke:{src:"promptHydrateStructuredReport",onDone:[{target:"tracking",actions:["setTrackedStudyAndMultipleSeries","jumpToFirstMeasurementInActiveViewport","setIsDirtyToClean"],cond:"shouldHydrateStructuredReport"},{target:"idle",actions:["ignoreHydrationForSRSeries"],cond:"shouldIgnoreHydrationForSR"}],onError:{target:"idle"}}},hydrateStructuredReport:{invoke:{src:"hydrateStructuredReport",onDone:[{target:"tracking",actions:["setTrackedStudyAndMultipleSeries","jumpToFirstMeasurementInActiveViewport","setIsDirtyToClean"]}],onError:{target:"idle"}}}},strict:!0},g={services:{promptBeginTracking:(e,t)=>{},promptTrackNewStudy:(e,t)=>{},promptTrackNewSeries:(e,t)=>{}},actions:{discardPreviouslyTrackedMeasurements:(e,t)=>{console.log("discardPreviouslyTrackedMeasurements: not implemented")},clearAllMeasurements:(e,t)=>{console.log("clearAllMeasurements: not implemented")},jumpToFirstMeasurementInActiveViewport:(e,t)=>{console.warn("jumpToFirstMeasurementInActiveViewport: not implemented")},showStructuredReportDisplaySetInActiveViewport:(e,t)=>{console.warn("showStructuredReportDisplaySetInActiveViewport: not implemented")},clearContext:(0,i.f0)({trackedStudy:"",trackedSeries:[],ignoredSeries:[],prevTrackedStudy:"",prevTrackedSeries:[],prevIgnoredSeries:[]}),setTrackedStudyAndSeries:(0,i.f0)(((e,t)=>({prevTrackedStudy:e.trackedStudy,prevTrackedSeries:e.trackedSeries.slice(),prevIgnoredSeries:e.ignoredSeries.slice(),trackedStudy:t.data.StudyInstanceUID,trackedSeries:[t.data.SeriesInstanceUID],ignoredSeries:[]}))),setTrackedStudyAndMultipleSeries:(0,i.f0)(((e,t)=>{const n=t.StudyInstanceUID||t.data.StudyInstanceUID,s=t.SeriesInstanceUIDs||t.data.SeriesInstanceUIDs;return{prevTrackedStudy:e.trackedStudy,prevTrackedSeries:e.trackedSeries.slice(),prevIgnoredSeries:e.ignoredSeries.slice(),trackedStudy:n,trackedSeries:[...e.trackedSeries,...s],ignoredSeries:[]}})),setIsDirtyToClean:(0,i.f0)(((e,t)=>({isDirty:!1}))),setIsDirty:(0,i.f0)(((e,t)=>({isDirty:!0}))),ignoreSeries:(0,i.f0)(((e,t)=>({prevIgnoredSeries:[...e.ignoredSeries],ignoredSeries:[...e.ignoredSeries,t.data.SeriesInstanceUID]}))),ignoreHydrationForSRSeries:(0,i.f0)(((e,t)=>({ignoredSRSeriesForHydration:[...e.ignoredSRSeriesForHydration,t.data.srSeriesInstanceUID]}))),addTrackedSeries:(0,i.f0)(((e,t)=>({prevTrackedSeries:[...e.trackedSeries],trackedSeries:[...e.trackedSeries,t.data.SeriesInstanceUID]}))),removeTrackedSeries:(0,i.f0)(((e,t)=>({prevTrackedSeries:e.trackedSeries.slice().filter((e=>e!==t.SeriesInstanceUID)),trackedSeries:e.trackedSeries.slice().filter((e=>e!==t.SeriesInstanceUID))})))},guards:{shouldSetDirty:(e,t)=>void 0===t.SeriesInstanceUID||e.trackedSeries.includes(t.SeriesInstanceUID),shouldKillMachine:(e,t)=>t.data&&t.data.userResponse===d,shouldAddSeries:(e,t)=>t.data&&t.data.userResponse===S,shouldSetStudyAndSeries:(e,t)=>t.data&&t.data.userResponse===p,shouldAddIgnoredSeries:(e,t)=>t.data&&t.data.userResponse===y,shouldPromptSaveReport:(e,t)=>t.data&&t.data.userResponse===l,shouldIgnoreHydrationForSR:(e,t)=>t.data&&t.data.userResponse===u,shouldSaveAndContinueWithSameReport:(e,t)=>t.data&&t.data.userResponse===l&&!0===t.data.isBackupSave,shouldSaveAndStartNewReport:(e,t)=>t.data&&t.data.userResponse===l&&!1===t.data.isBackupSave,shouldHydrateStructuredReport:(e,t)=>t.data&&t.data.userResponse===I,hasRemainingTrackedSeries:(e,t)=>e.trackedSeries.length>1||!e.trackedSeries.includes(t.SeriesInstanceUID),hasNotIgnoredSRSeriesForHydration:(e,t)=>!e.ignoredSRSeriesForHydration.includes(t.SeriesInstanceUID),isNewStudy:(e,t)=>!e.ignoredSeries.includes(t.SeriesInstanceUID)&&e.trackedStudy!==t.StudyInstanceUID,isNewSeries:(e,t)=>!e.ignoredSeries.includes(t.SeriesInstanceUID)&&!e.trackedSeries.includes(t.SeriesInstanceUID)}},D={NO_NEVER:-1,CANCEL:0,CREATE_REPORT:1,ADD_SERIES:2,SET_STUDY_AND_SERIES:3};const E=function(e,t,n){let{servicesManager:s,extensionManager:r}=e;const{uiViewportDialogService:a}=s.services,{viewportId:i,StudyInstanceUID:o,SeriesInstanceUID:d}=n;return new Promise((async function(e,t){let n=await function(e,t){return new Promise((function(n,s){const r="Track measurements for this series?",a=[{id:"prompt-begin-tracking-cancel",type:c.LZ.dt.secondary,text:"No",value:D.CANCEL},{id:"prompt-begin-tracking-no-do-not-ask-again",type:c.LZ.dt.secondary,text:"No, do not ask again",value:D.NO_NEVER},{id:"prompt-begin-tracking-yes",type:c.LZ.dt.primary,text:"Yes",value:D.SET_STUDY_AND_SERIES}],i=t=>{e.hide(),n(t)};e.show({viewportId:t,id:"measurement-tracking-prompt-begin-tracking",type:"info",message:r,actions:a,onSubmit:i,onOutsideClick:()=>{e.hide(),n(D.CANCEL)}})}))}(a,i);e({userResponse:n,StudyInstanceUID:o,SeriesInstanceUID:d,viewportId:i})}))},v={NO_NEVER:-1,CANCEL:0,CREATE_REPORT:1,ADD_SERIES:2,SET_STUDY_AND_SERIES:3,NO_NOT_FOR_SERIES:4};const R=function(e,t,n){let{servicesManager:s,extensionManager:r}=e;const{UIViewportDialogService:a}=s.services,{viewportId:i,StudyInstanceUID:o,SeriesInstanceUID:d}=n;return new Promise((async function(e,n){let s=await function(e,t){return new Promise((function(n,s){const r="Do you want to add this measurement to the existing report?",a=[{type:c.LZ.dt.secondary,text:"Cancel",value:v.CANCEL},{type:c.LZ.dt.primary,text:"Create new report",value:v.CREATE_REPORT},{type:c.LZ.dt.primary,text:"Add to existing report",value:v.ADD_SERIES}],i=t=>{e.hide(),n(t)};e.show({viewportId:t,type:"info",message:r,actions:a,onSubmit:i,onOutsideClick:()=>{e.hide(),n(v.CANCEL)}})}))}(a,i);s===v.CREATE_REPORT&&(s=t.isDirty?await function(e,t){return new Promise((function(n,s){const r="You have existing tracked measurements. What would you like to do with your existing tracked measurements?",a=[{type:"cancel",text:"Cancel",value:v.CANCEL},{type:"secondary",text:"Save",value:v.CREATE_REPORT},{type:"primary",text:"Discard",value:v.SET_STUDY_AND_SERIES}],i=t=>{e.hide(),n(t)};e.show({viewportId:t,type:"warning",message:r,actions:a,onSubmit:i,onOutsideClick:()=>{e.hide(),n(v.CANCEL)}})}))}(a,i):v.SET_STUDY_AND_SERIES),e({userResponse:s,StudyInstanceUID:o,SeriesInstanceUID:d,viewportId:i,isBackupSave:!1})}))},f={NO_NEVER:-1,CANCEL:0,CREATE_REPORT:1,ADD_SERIES:2,SET_STUDY_AND_SERIES:3,NO_NOT_FOR_SERIES:4};const T=function(e,t,n){let{servicesManager:s,extensionManager:r}=e;const{UIViewportDialogService:a}=s.services,{viewportId:i,StudyInstanceUID:o,SeriesInstanceUID:c}=n;return new Promise((async function(e,n){let s=await function(e,t){return new Promise((function(n,s){const r="Track measurements for this series?",a=[{type:"cancel",text:"No",value:f.CANCEL},{type:"secondary",text:"No, do not ask again for this series",value:f.NO_NOT_FOR_SERIES},{type:"primary",text:"Yes",value:f.SET_STUDY_AND_SERIES}],i=t=>{e.hide(),n(t)};e.show({viewportId:t,type:"info",message:r,actions:a,onSubmit:i,onOutsideClick:()=>{e.hide(),n(f.CANCEL)}})}))}(a,i);s===f.SET_STUDY_AND_SERIES&&(s=t.isDirty?await function(e,t){return new Promise((function(n,s){const r="Measurements cannot span across multiple studies. Do you want to save your tracked measurements?",a=[{type:"cancel",text:"Cancel",value:f.CANCEL},{type:"secondary",text:"No, discard previously tracked series & measurements",value:f.SET_STUDY_AND_SERIES},{type:"primary",text:"Yes",value:f.CREATE_REPORT}],i=t=>{e.hide(),n(t)};e.show({viewportId:t,type:"warning",message:r,actions:a,onSubmit:i,onOutsideClick:()=>{e.hide(),n(f.CANCEL)}})}))}(a,i):f.SET_STUDY_AND_SERIES),e({userResponse:s,StudyInstanceUID:o,SeriesInstanceUID:c,viewportId:i,isBackupSave:!1})}))};var k=n(56342);const h=4700;const w={NO_NEVER:-1,CANCEL:0,CREATE_REPORT:1,ADD_SERIES:2,SET_STUDY_AND_SERIES:3,NO_NOT_FOR_SERIES:4};const U=function(e,t,n){let{servicesManager:s,commandsManager:r,extensionManager:a}=e;const{uiDialogService:i,measurementService:o,displaySetService:c}=s.services,d=void 0===n.viewportId?n.data.viewportId:n.viewportId,u=void 0===n.isBackupSave?n.data.isBackupSave:n.isBackupSave,l=n?.data?.StudyInstanceUID,S=n?.data?.SeriesInstanceUID,{trackedStudy:p,trackedSeries:y}=t;let I;return new Promise((async function(e,t){const n=await(0,k.createReportDialogPrompt)(i,{extensionManager:a});if(n.action===w.CREATE_REPORT){const e=a.getDataSources()[0],t=o.getMeasurements().filter((e=>p===e.referenceStudyUID&&y.includes(e.referenceSeriesUID))),i=void 0===n.value||""===n.value?"Research Derived Series":n.value,d=function(e){const t=e.getActiveDisplaySets().filter((e=>"SR"===e.Modality)).map((e=>e.SeriesNumber));return Math.max(...t,h)+1}(c),u=async()=>r.runCommand("storeMeasurements",{measurementData:t,dataSource:e,additionalFindingTypes:["ArrowAnnotate"],options:{SeriesDescription:i,SeriesNumber:d}},"CORNERSTONE_STRUCTURED_REPORT");I=await(0,k.createReportAsync)({servicesManager:s,getReport:u})}else n.action;e({userResponse:n.action,createdDisplaySetInstanceUIDs:I,StudyInstanceUID:l,SeriesInstanceUID:S,viewportId:d,isBackupSave:u})}))};var M=n(42170);const A={NO_NEVER:-1,CANCEL:0,CREATE_REPORT:1,ADD_SERIES:2,SET_STUDY_AND_SERIES:3,NO_NOT_FOR_SERIES:4,HYDRATE_REPORT:5};const C=function(e,t,n){let{servicesManager:s,extensionManager:r,appConfig:a}=e;const{uiViewportDialogService:i,displaySetService:o}=s.services,{viewportId:d,displaySetInstanceUID:u}=n,l=o.getDisplaySetByUID(u);return new Promise((async function(e,t){const o=await function(e,t){return new Promise((function(n,s){const r="Do you want to continue tracking measurements for this study?",a=[{type:c.LZ.dt.secondary,text:"No",value:A.CANCEL},{type:c.LZ.dt.primary,text:"Yes",value:A.HYDRATE_REPORT}],i=t=>{e.hide(),n(t)};e.show({viewportId:t,type:"info",message:r,actions:a,onSubmit:i,onOutsideClick:()=>{e.hide(),n(A.CANCEL)}})}))}(i,d);let S,p;if(o===A.HYDRATE_REPORT){console.warn("!! HYDRATING STRUCTURED REPORT");const e=(0,M.hydrateStructuredReport)({servicesManager:s,extensionManager:r,appConfig:a},u);S=e.StudyInstanceUID,p=e.SeriesInstanceUIDs}e({userResponse:o,displaySetInstanceUID:n.displaySetInstanceUID,srSeriesInstanceUID:l.SeriesInstanceUID,viewportId:d,StudyInstanceUID:S,SeriesInstanceUIDs:p})}))};const b=function(e,t,n){let{servicesManager:s,extensionManager:r}=e;const{displaySetService:a}=s.services,{viewportId:i,displaySetInstanceUID:o}=n,c=a.getDisplaySetByUID(o);return new Promise(((e,t)=>{const a=(0,M.hydrateStructuredReport)({servicesManager:s,extensionManager:r},o),d=a.StudyInstanceUID,u=a.SeriesInstanceUIDs;e({displaySetInstanceUID:n.displaySetInstanceUID,srSeriesInstanceUID:c.SeriesInstanceUID,viewportId:i,StudyInstanceUID:d,SeriesInstanceUIDs:u})}))};var N=n(62657);const _=s.createContext();_.displayName="TrackedMeasurementsContext";const x=()=>(0,s.useContext)(_),P="@ohif/extension-cornerstone-dicom-sr.sopClassHandlerModule.dicom-sr";function O(e,t){let{servicesManager:n,commandsManager:r,extensionManager:a}=e,{children:d}=t;const[u]=(0,N.M)(),[l,S]=(0,c.O_)(),{activeViewportId:p,viewports:y}=l,{measurementService:I,displaySetService:D}=n.services,v=Object.assign({},g);v.actions=Object.assign({},v.actions,{jumpToFirstMeasurementInActiveViewport:(e,t)=>{const{trackedStudy:n,trackedSeries:s,activeViewportId:r}=e,a=I.getMeasurements().filter((e=>n===e.referenceStudyUID&&s.includes(e.referenceSeriesUID)));console.log("jumping to measurement reset viewport",r,a[0]);const i=a[0].displaySetInstanceUID,o=D.getDisplaySetByUID(i).images,c=o[0].imageId.startsWith("volumeId"),d=a[0].data;let u=0;!c&&d&&(u=o.findIndex((e=>{const t=Object.keys(d)[0].substring(8);return e.imageId===t})),-1===u&&(console.warn("Could not find image index for tracked measurement, using 0"),u=0)),S.setDisplaySetsForViewport({viewportId:r,displaySetInstanceUIDs:[i],viewportOptions:{initialImageOptions:{index:u}}})},showStructuredReportDisplaySetInActiveViewport:(e,t)=>{if(t.data.createdDisplaySetInstanceUIDs.length>0){const e=t.data.createdDisplaySetInstanceUIDs[0];S.setDisplaySetsForViewport({viewportId:t.data.viewportId,displaySetInstanceUIDs:[e]})}},discardPreviouslyTrackedMeasurements:(e,t)=>{const n=I.getMeasurements().filter((t=>e.prevTrackedSeries.includes(t.referenceSeriesUID))).map((e=>e.id));for(let e=0;e{const n=I.getMeasurements().map((e=>e.uid));for(let e=0;e{h("UPDATE_ACTIVE_VIEWPORT_ID",{activeViewportId:p})}),[p,h]),(0,s.useEffect)((()=>{if(y.size>0){const e=y.get(p);if(!e||!e?.displaySetInstanceUIDs?.length)return;const{displaySetService:t}=n.services,s=t.getDisplaySetByUID(e.displaySetInstanceUIDs[0]);if(!s)return;s.SOPClassHandlerId===P&&!s.isLoaded&&s.load&&s.load(),s.SOPClassHandlerId===P&&!0===s.isRehydratable&&(console.log("sending event...",k),h("PROMPT_HYDRATE_SR",{displaySetInstanceUID:s.displaySetInstanceUID,SeriesInstanceUID:s.SeriesInstanceUID,viewportId:p}))}}),[p,h,n.services,y]),s.createElement(_.Provider,{value:[k,h]},d)}O.propTypes={children:a().oneOf([a().func,a().node]),servicesManager:a().object.isRequired,commandsManager:a().object.isRequired,extensionManager:a().object.isRequired,appConfig:a().object};const V=function(e){let{servicesManager:t,extensionManager:n,commandsManager:s}=e;const r=O.bind(null,{servicesManager:t,extensionManager:n,commandsManager:s});return[{name:"TrackedMeasurementsContext",context:_,provider:r}]}},28030:(e,t,n)=>{n.r(t),n.d(t,{default:()=>P});var s=n(41832),r=n(43001),a=n(3827),i=n.n(a),o=n(62474),c=n(69190),d=n(71771),u=n(71783);const{formatDate:l}=d.utils;function S(e){let{servicesManager:t,getImageSrc:n,getStudiesForPatientByMRN:a,requestDisplaySetCreationForStudy:i,dataSource:d}=e;const{displaySetService:S,uiDialogService:p,hangingProtocolService:I,uiNotificationService:m}=t.services,g=(0,o.s0)(),{t:D}=(0,c.$G)("Common"),{StudyInstanceUIDs:E}=(0,u.zG)(),[{activeViewportId:v,viewports:R},f]=(0,u.O_)(),[T,k]=(0,s.I)(),[h,w]=(0,r.useState)("primary"),[U,M]=(0,r.useState)([...E]),[A,C]=(0,r.useState)([]),[b,N]=(0,r.useState)([]),[_,x]=(0,r.useState)({}),[P,O]=(0,r.useState)(null),V=R.get(v)?.displaySetInstanceUIDs,{trackedSeries:L}=T.context;(0,r.useEffect)((()=>{E.forEach((e=>async function(e){const t=await d.query.studies.search({studyInstanceUid:e});if(!t?.length)throw g("/notfoundstudy","_self"),new Error("Invalid study URL");let n=t;try{n=await a(t)}catch(e){console.warn(e)}const s=n.map((e=>({AccessionNumber:e.accession,StudyDate:e.date,StudyDescription:e.description,NumInstances:e.instances,ModalitiesInStudy:e.modalities,PatientID:e.mrn,PatientName:e.patientName,StudyInstanceUID:e.studyInstanceUid,StudyTime:e.time}))).map((e=>({studyInstanceUid:e.StudyInstanceUID,date:l(e.StudyDate)||D("NoStudyDate"),description:e.StudyDescription,modalities:e.ModalitiesInStudy,numInstances:e.NumInstances})));C((e=>{const t=[...e];for(const n of s)e.find((e=>e.studyInstanceUid===n.studyInstanceUid))||t.push(n);return t}))}(e)))}),[E,a]),(0,r.useEffect)((()=>{const e=S.activeDisplaySets;e.length&&e.forEach((async e=>{const t={},s=S.getDisplaySetByUID(e.displaySetInstanceUID),r=d.getImageIdsForDisplaySet(s),a=r[Math.floor(r.length/2)];a&&!s?.unsupported&&(t[e.displaySetInstanceUID]=await n(a),x((e=>({...e,...t}))))}))}),[S,d,n]),(0,r.useEffect)((()=>{const e=S.activeDisplaySets;if(!e.length)return;const t=y(e,_,L,R,f,d,S,p,m);N(t)}),[S.activeDisplaySets,L,R,d,_]),(0,r.useEffect)((()=>{const e=S.subscribe(S.EVENTS.DISPLAY_SETS_ADDED,(e=>{const{displaySetsAdded:t,options:s}=e;t.forEach((async e=>{const t=e.displaySetInstanceUID,r={},a=S.getDisplaySetByUID(t);if(a?.unsupported)return;s.madeInClient&&O(t);const i=d.getImageIdsForDisplaySet(a),o=i[Math.floor(i.length/2)];o&&(r[t]=await n(o),x((e=>({...e,...r}))))}))}));return()=>{e.unsubscribe()}}),[S,d,n,_,L,R]),(0,r.useEffect)((()=>{const e=S.subscribe(S.EVENTS.DISPLAY_SETS_CHANGED,(e=>{const t=y(e,_,L,R,f,d,S,p,m);N(t)})),t=S.subscribe(S.EVENTS.DISPLAY_SET_SERIES_METADATA_INVALIDATED,(()=>{const e=y(S.getActiveDisplaySets(),_,L,R,f,d,S,p,m);N(e)}));return()=>{e.unsubscribe(),t.unsubscribe()}}),[_,L,R,d,S]);const F=function(e,t,n,s){const r=[],a=[],i=[];t.forEach((t=>{const o=n.filter((e=>e.StudyInstanceUID===t.studyInstanceUid)),c=s.getDisplaySetSortFunction();o.sort(c);const d=Object.assign({},t,{displaySets:o});e.includes(t.studyInstanceUid)?(r.push(d),i.push(d)):(a.push(d),i.push(d))}));const o=(e,t)=>{const n=Date.parse(e);return Date.parse(t)-n},c=[{name:"primary",label:"Primary",studies:r.sort(((e,t)=>o(e.date,t.date)))},{name:"recent",label:"Recent",studies:a.sort(((e,t)=>o(e.date,t.date)))},{name:"all",label:"All",studies:i.sort(((e,t)=>o(e.date,t.date)))}];return c}(E,A,b,I);return(0,r.useEffect)((()=>{if(P){const e=P,t=document.getElementById(`thumbnail-${e}`);t&&"function"==typeof t.scrollIntoView&&(t.scrollIntoView({behavior:"smooth"}),O(null))}}),[P,U,h]),(0,r.useEffect)((()=>{if(!P)return;const e=function(e,t){for(let n=0;nt!==e))]:[...U,e];if(M(n),!t){i(S,e,!0)}},onClickTab:e=>{w(e)},onClickUntrack:e=>{const t=S.getDisplaySetByUID(e);k("UNTRACK_SERIES",{SeriesInstanceUID:t.SeriesInstanceUID})},onClickThumbnail:()=>{},onDoubleClickThumbnail:e=>{let t=[];const n=v;try{t=I.getViewportsRequireUpdate(n,e)}catch(e){console.warn(e),m.show({title:"Thumbnail Double Click",message:"The selected display sets could not be added to the viewport due to a mismatch in the Hanging Protocol rules.",type:"info",duration:3e3})}f.setDisplaySetsForViewports(t)},activeDisplaySetInstanceUIDs:V})}S.propTypes={servicesManager:i().object.isRequired,dataSource:i().shape({getImageIdsForDisplaySet:i().func.isRequired}).isRequired,getImageSrc:i().func.isRequired,getStudiesForPatientByMRN:i().func.isRequired,requestDisplaySetCreationForStudy:i().func.isRequired};const p=S;function y(e,t,n,s,a,i,o,c,d){const S=[],p=[];return e.filter((e=>!e.excludeFromThumbnailBrowser)).forEach((e=>{const y=t[e.displaySetInstanceUID],m=function(e){if(I.includes(e.Modality)||e?.unsupported)return"thumbnailNoImage";return"thumbnailTracked"}(e),g=a.getNumViewportPanes(),D=[];1!==g&&s.forEach((t=>{t?.displaySetInstanceUIDs?.includes(e.displaySetInstanceUID)&&D.push(t.viewportLabel)}));const E="thumbnailTracked"===m?S:p,{displaySetInstanceUID:v}=e,R={displaySetInstanceUID:v,description:e.SeriesDescription,seriesNumber:e.SeriesNumber,modality:e.Modality,seriesDate:l(e.SeriesDate),numInstances:e.numImageFrames,countIcon:e.countIcon,messages:e.messages,StudyInstanceUID:e.StudyInstanceUID,componentType:m,imageSrc:y,dragData:{type:"displayset",displaySetInstanceUID:v},isTracked:n.includes(e.SeriesInstanceUID),isHydratedForDerivedDisplaySet:e.isHydrated,viewportIdentificator:D};"thumbnailNoImage"===m&&(i.reject&&i.reject.series?(R.canReject=!e?.unsupported,R.onReject=()=>{c.create({id:"ds-reject-sr",centralize:!0,isDraggable:!1,showOverlay:!0,content:u.Vq,contentProps:{title:"Delete Report",body:()=>r.createElement("div",{className:"bg-primary-dark p-4 text-white"},r.createElement("p",null,"Are you sure you want to delete this report?"),r.createElement("p",{className:"mt-2"},"This action cannot be undone.")),actions:[{id:"cancel",text:"Cancel",type:u.LZ.dt.secondary},{id:"yes",text:"Yes",type:u.LZ.dt.primary,classes:["reject-yes-button"]}],onClose:()=>c.dismiss({id:"ds-reject-sr"}),onShow:()=>{document.querySelector(".reject-yes-button").focus()},onSubmit:async t=>{let{action:n}=t;switch(n.id){case"yes":try{await i.reject.series(e.StudyInstanceUID,e.SeriesInstanceUID),o.deleteDisplaySet(v),c.dismiss({id:"ds-reject-sr"}),d.show({title:"Delete Report",message:"Report deleted successfully",type:"success"})}catch(e){c.dismiss({id:"ds-reject-sr"}),d.show({title:"Delete Report",message:"Failed to delete report",type:"error"})}break;case"cancel":c.dismiss({id:"ds-reject-sr"})}}}})}):R.canReject=!1),E.push(R)})),[...S,...p]}const I=["SR","SEG","SM","RTSTRUCT","RTPLAN","RTDOSE","DOC","OT"];const m=function(e,t){return new Promise(((n,s)=>{const r=document.createElement("canvas");e.utilities.loadImageToCanvas({canvas:r,imageId:t}).then((e=>{n(r.toDataURL())})).catch(s)}))};const g=function(e,t,n,s){t.activeDisplaySets.some((e=>e.StudyInstanceUID===n))||e.retrieve.series.metadata({StudyInstanceUID:n,madeInClient:s})};function D(e){let{commandsManager:t,extensionManager:n,servicesManager:s}=e;const a=n.getActiveDataSource()[0],i=function(e){const t=e.getModuleEntry("@ohif/extension-default.utilityModule.common"),{getStudiesForPatientByMRN:n}=t.exports;return n}(n),o=i.bind(null,a),c=function(e){const t=e.getModuleEntry("@ohif/extension-cornerstone.utilityModule.common");try{const{cornerstone:e}=t.exports.getCornerstoneLibraries();return m.bind(null,e)}catch(e){throw new Error("Required command not found")}}(n),d=g.bind(null,a);return r.createElement(p,{servicesManager:s,dataSource:a,getImageSrc:c,getStudiesForPatientByMRN:o,requestDisplaySetCreationForStudy:d})}D.propTypes={commandsManager:i().object.isRequired,extensionManager:i().object.isRequired,servicesManager:i().object.isRequired};const E=D;var v=n(10800);function R(e){let{onExportClick:t,onCreateReportClick:n,disabled:s}=e;const{t:a}=(0,c.$G)("MeasurementTable");return r.createElement(r.Fragment,null,r.createElement(u.zx,{onClick:t,disabled:s,type:u.LZ.dt.secondary,size:u.LZ.dp.small},a("Export")),r.createElement(u.zx,{className:"ml-2",onClick:n,type:u.LZ.dt.secondary,size:u.LZ.dp.small,disabled:s},a("Create Report")))}R.propTypes={onExportClick:i().func,onCreateReportClick:i().func,disabled:i().bool},R.defaultProps={onExportClick:()=>alert("Export"),onCreateReportClick:()=>alert("Create Report"),disabled:!1};const f=R;var T=n(8324),k=n.n(T);const{downloadCSVReport:h}=d.utils,{formatDate:w}=d.utils,U={key:void 0,date:"",modality:"",description:""};function M(e){let{servicesManager:t,extensionManager:n}=e;const[a]=(0,u.O_)(),[i,o]=(0,r.useState)(Date.now().toString()),c=(0,v.N)(i,200),{measurementService:l,uiDialogService:S,displaySetService:p}=t.services,[y,I]=(0,s.I)(),{trackedStudy:m,trackedSeries:g}=y.context,[D,E]=(0,r.useState)(U),[R,T]=(0,r.useState)([]),M=(0,r.useRef)(null);(0,r.useEffect)((()=>{const e=l.getMeasurements().filter((e=>m===e.referenceStudyUID&&g.includes(e.referenceSeriesUID))).map((e=>function(e,t,n){const{referenceStudyUID:s,referenceSeriesUID:r,SOPInstanceUID:a}=e,i=(d.DicomMetadataStore.getInstance(s,r,a),n.getDisplaySetsForSeries(r));if(!i[0]||!i[0].images)throw new Error('The tracked measurements panel should only be tracking "stack" displaySets.');const{displayText:o,uid:c,label:u,type:l,selected:S,findingSites:p,finding:y}=e,I=p?.[0],m=u||y?.text||I?.text||"(empty)";let g=o||[];if(p){const e=[];p.forEach((t=>{t?.text!==m&&e.push(t.text)})),g=[...e,...g]}y&&y?.text!==m&&(g=[y.text,...g]);return{uid:c,label:m,baseLabel:u,measurementType:l,displayText:g,baseDisplayText:o,isActive:S,finding:y,findingSites:p}}(e,l.VALUE_TYPES,p)));T(e)}),[l,m,g,c]);const A=async()=>{if(y.matches("tracking")){const e=m,t=d.DicomMetadataStore.getStudy(e),n=t.series[0].instances[0],{StudyDate:s,StudyDescription:r}=n,a=new Set;t.series.forEach((e=>{g.includes(e.SeriesInstanceUID)&&a.add(e.instances[0].Modality)}));const i=Array.from(a).join("/");D.key!==e&&E({key:e,date:s,modality:i,description:r})}else""!==m&&void 0!==m||E(U)};(0,r.useEffect)((()=>{A()}),[D.key,y,m,A]),(0,r.useEffect)((()=>{const e=l.EVENTS.MEASUREMENT_ADDED,t=l.EVENTS.RAW_MEASUREMENT_ADDED,n=l.EVENTS.MEASUREMENT_UPDATED,s=l.EVENTS.MEASUREMENT_REMOVED,r=l.EVENTS.MEASUREMENTS_CLEARED,a=[];return[e,t,n,s,r].forEach((t=>{a.push(l.subscribe(t,(()=>{o(Date.now().toString()),t===e&&k()((()=>{M.current.scrollTop=M.current.scrollHeight}),300)()})).unsubscribe)})),()=>{a.forEach((e=>{e()}))}}),[l,I]);const C=e=>{let{uid:t,isActive:n}=e;l.jumpToMeasurement(a.activeViewportId,t),N({uid:t,isActive:n})},b=e=>{let{uid:t,isActive:n}=e;const s=l.getMeasurement(t);C({uid:t,isActive:n});const a=e=>{let{action:n,value:r}=e;if("save"===n.id)l.update(t,{...s,...r},!0);S.dismiss({id:"enter-annotation"})};S.create({id:"enter-annotation",centralize:!0,isDraggable:!1,showOverlay:!0,content:u.Vq,contentProps:{title:"Annotation",noCloseButton:!0,value:{label:s.label||""},body:e=>{let{value:t,setValue:n}=e;return r.createElement(u.II,{label:"Enter your annotation",labelClassName:"text-white grow text-[14px] leading-[1.2]",autoFocus:!0,id:"annotation",className:"border-primary-main bg-black",type:"text",value:t.label,onChange:e=>{e.persist(),n((t=>({...t,label:e.target.value})))},onKeyPress:e=>{"Enter"===e.key&&a({value:t,action:{id:"save"}})}})},actions:[{id:"cancel",text:"Cancel",type:u.LZ.dt.secondary},{id:"save",text:"Save",type:u.LZ.dt.primary}],onSubmit:a}})},N=e=>{let{uid:t,isActive:n}=e;if(!n){const e=[...R],n=e.find((e=>e.uid===t));e.forEach((e=>e.isActive=e.uid===t)),n.isActive=!0,T(e)}},_=R.filter((e=>e.measurementType!==l.VALUE_TYPES.POINT)),x=R.filter((e=>e.measurementType===l.VALUE_TYPES.POINT));return r.createElement(r.Fragment,null,r.createElement("div",{className:"invisible-scrollbar overflow-y-auto overflow-x-hidden",ref:M,"data-cy":"trackedMeasurements-panel"},D.key&&r.createElement(u.YL,{date:w(D.date),modality:D.modality,description:D.description}),r.createElement(u.wt,{title:"Measurements",data:_,servicesManager:t,onClick:C,onEdit:b}),0!==x.length&&r.createElement(u.wt,{title:"Additional Findings",data:x,servicesManager:t,onClick:C,onEdit:b})),r.createElement("div",{className:"flex justify-center p-4"},r.createElement(f,{onExportClick:async function(){const e=l.getMeasurements().filter((e=>m===e.referenceStudyUID&&g.includes(e.referenceSeriesUID)));h(e,l)},onCreateReportClick:()=>{I("SAVE_REPORT",{viewportId:a.activeViewportId,isBackupSave:!0})},disabled:0===x.length&&0===_.length})))}M.propTypes={servicesManager:i().shape({services:i().shape({measurementService:i().shape({getMeasurements:i().func.isRequired,VALUE_TYPES:i().object.isRequired}).isRequired}).isRequired}).isRequired};const A=M;const C=function(e){let{commandsManager:t,extensionManager:n,servicesManager:s}=e;return[{name:"seriesList",iconName:"tab-studies",iconLabel:"Studies",label:"Studies",component:E.bind(null,{commandsManager:t,extensionManager:n,servicesManager:s})},{name:"trackedMeasurements",iconName:"tab-linear",iconLabel:"Measure",label:"Measurements",component:A.bind(null,{commandsManager:t,extensionManager:n,servicesManager:s})}]};function b(){return b=Object.assign?Object.assign.bind():function(e){for(var t=1;tn.e(822).then(n.bind(n,86822)))),_=e=>r.createElement(r.Suspense,{fallback:r.createElement("div",null,"Loading...")},r.createElement(N,e));const x=function(e){let{servicesManager:t,commandsManager:n,extensionManager:s}=e;return[{name:"cornerstone-tracked",component:e=>r.createElement(_,b({servicesManager:t,commandsManager:n,extensionManager:s},e))}]},P={id:JSON.parse('{"u2":"@ohif/extension-measurement-tracking"}').u2,getContextModule:s.Z,getPanelModule:C,getViewportModule:x}}}]); +//# sourceMappingURL=19.bundle.97cd1d5f412be83022cf.js.map \ No newline at end of file diff --git a/resources/19.bundle.97cd1d5f412be83022cf.js.map b/resources/19.bundle.97cd1d5f412be83022cf.js.map new file mode 100644 index 0000000..14c4758 --- /dev/null +++ b/resources/19.bundle.97cd1d5f412be83022cf.js.map @@ -0,0 +1 @@ +{"version":3,"file":"19.bundle.97cd1d5f412be83022cf.js","mappings":"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","sources":["webpack:///../../../extensions/measurement-tracking/src/contexts/TrackedMeasurementsContext/measurementTrackingMachine.js","webpack:///../../../extensions/measurement-tracking/src/contexts/TrackedMeasurementsContext/promptBeginTracking.js","webpack:///../../../extensions/measurement-tracking/src/contexts/TrackedMeasurementsContext/promptTrackNewSeries.js","webpack:///../../../extensions/measurement-tracking/src/contexts/TrackedMeasurementsContext/promptTrackNewStudy.js","webpack:///../../../extensions/measurement-tracking/src/_shared/getNextSRSeriesNumber.js","webpack:///../../../extensions/measurement-tracking/src/_shared/PROMPT_RESPONSES.js","webpack:///../../../extensions/measurement-tracking/src/contexts/TrackedMeasurementsContext/promptSaveReport.js","webpack:///../../../extensions/measurement-tracking/src/contexts/TrackedMeasurementsContext/promptHydrateStructuredReport.js","webpack:///../../../extensions/measurement-tracking/src/contexts/TrackedMeasurementsContext/hydrateStructuredReport.tsx","webpack:///../../../extensions/measurement-tracking/src/contexts/TrackedMeasurementsContext/TrackedMeasurementsContext.tsx","webpack:///../../../extensions/measurement-tracking/src/getContextModule.tsx","webpack:///../../../extensions/measurement-tracking/src/panels/PanelStudyBrowserTracking/PanelStudyBrowserTracking.tsx","webpack:///../../../extensions/measurement-tracking/src/panels/PanelStudyBrowserTracking/getImageSrcFromImageId.js","webpack:///../../../extensions/measurement-tracking/src/panels/PanelStudyBrowserTracking/requestDisplaySetCreationForStudy.js","webpack:///../../../extensions/measurement-tracking/src/panels/PanelStudyBrowserTracking/index.tsx","webpack:///../../../extensions/measurement-tracking/src/panels/PanelMeasurementTableTracking/ActionButtons.tsx","webpack:///../../../extensions/measurement-tracking/src/panels/PanelMeasurementTableTracking/index.tsx","webpack:///../../../extensions/measurement-tracking/src/getPanelModule.tsx","webpack:///../../../extensions/measurement-tracking/src/getViewportModule.tsx","webpack:///../../../extensions/measurement-tracking/src/index.tsx","webpack:///../../../extensions/measurement-tracking/src/id.js"],"sourcesContent":["import { hydrateStructuredReport } from '@ohif/extension-cornerstone-dicom-sr';\r\nimport { assign } from 'xstate';\r\n\r\nconst RESPONSE = {\r\n NO_NEVER: -1,\r\n CANCEL: 0,\r\n CREATE_REPORT: 1,\r\n ADD_SERIES: 2,\r\n SET_STUDY_AND_SERIES: 3,\r\n NO_NOT_FOR_SERIES: 4,\r\n HYDRATE_REPORT: 5,\r\n};\r\n\r\nconst machineConfiguration = {\r\n id: 'measurementTracking',\r\n initial: 'idle',\r\n context: {\r\n activeViewportId: null,\r\n trackedStudy: '',\r\n trackedSeries: [],\r\n ignoredSeries: [],\r\n //\r\n prevTrackedStudy: '',\r\n prevTrackedSeries: [],\r\n prevIgnoredSeries: [],\r\n //\r\n ignoredSRSeriesForHydration: [],\r\n isDirty: false,\r\n },\r\n states: {\r\n off: {\r\n type: 'final',\r\n },\r\n idle: {\r\n entry: 'clearContext',\r\n on: {\r\n TRACK_SERIES: 'promptBeginTracking',\r\n // Unused? We may only do PROMPT_HYDRATE_SR now?\r\n SET_TRACKED_SERIES: [\r\n {\r\n target: 'tracking',\r\n actions: ['setTrackedStudyAndMultipleSeries', 'setIsDirtyToClean'],\r\n },\r\n ],\r\n PROMPT_HYDRATE_SR: {\r\n target: 'promptHydrateStructuredReport',\r\n cond: 'hasNotIgnoredSRSeriesForHydration',\r\n },\r\n RESTORE_PROMPT_HYDRATE_SR: 'promptHydrateStructuredReport',\r\n HYDRATE_SR: 'hydrateStructuredReport',\r\n UPDATE_ACTIVE_VIEWPORT_ID: {\r\n actions: assign({\r\n activeViewportId: (_, event) => event.activeViewportId,\r\n }),\r\n },\r\n },\r\n },\r\n promptBeginTracking: {\r\n invoke: {\r\n src: 'promptBeginTracking',\r\n onDone: [\r\n {\r\n target: 'tracking',\r\n actions: ['setTrackedStudyAndSeries', 'setIsDirty'],\r\n cond: 'shouldSetStudyAndSeries',\r\n },\r\n {\r\n target: 'off',\r\n cond: 'shouldKillMachine',\r\n },\r\n {\r\n target: 'idle',\r\n },\r\n ],\r\n onError: {\r\n target: 'idle',\r\n },\r\n },\r\n },\r\n tracking: {\r\n on: {\r\n TRACK_SERIES: [\r\n {\r\n target: 'promptTrackNewStudy',\r\n cond: 'isNewStudy',\r\n },\r\n {\r\n target: 'promptTrackNewSeries',\r\n cond: 'isNewSeries',\r\n },\r\n ],\r\n UNTRACK_SERIES: [\r\n {\r\n target: 'tracking',\r\n actions: ['removeTrackedSeries', 'setIsDirty'],\r\n cond: 'hasRemainingTrackedSeries',\r\n },\r\n {\r\n target: 'idle',\r\n },\r\n ],\r\n SET_TRACKED_SERIES: [\r\n {\r\n target: 'tracking',\r\n actions: ['setTrackedStudyAndMultipleSeries'],\r\n },\r\n ],\r\n SAVE_REPORT: 'promptSaveReport',\r\n SET_DIRTY: [\r\n {\r\n target: 'tracking',\r\n actions: ['setIsDirty'],\r\n cond: 'shouldSetDirty',\r\n },\r\n {\r\n target: 'tracking',\r\n },\r\n ],\r\n },\r\n },\r\n promptTrackNewSeries: {\r\n invoke: {\r\n src: 'promptTrackNewSeries',\r\n onDone: [\r\n {\r\n target: 'tracking',\r\n actions: ['addTrackedSeries', 'setIsDirty'],\r\n cond: 'shouldAddSeries',\r\n },\r\n {\r\n target: 'tracking',\r\n actions: [\r\n 'discardPreviouslyTrackedMeasurements',\r\n 'setTrackedStudyAndSeries',\r\n 'setIsDirty',\r\n ],\r\n cond: 'shouldSetStudyAndSeries',\r\n },\r\n {\r\n target: 'promptSaveReport',\r\n cond: 'shouldPromptSaveReport',\r\n },\r\n {\r\n target: 'tracking',\r\n },\r\n ],\r\n onError: {\r\n target: 'idle',\r\n },\r\n },\r\n },\r\n promptTrackNewStudy: {\r\n invoke: {\r\n src: 'promptTrackNewStudy',\r\n onDone: [\r\n {\r\n target: 'tracking',\r\n actions: [\r\n 'discardPreviouslyTrackedMeasurements',\r\n 'setTrackedStudyAndSeries',\r\n 'setIsDirty',\r\n ],\r\n cond: 'shouldSetStudyAndSeries',\r\n },\r\n {\r\n target: 'tracking',\r\n actions: ['ignoreSeries'],\r\n cond: 'shouldAddIgnoredSeries',\r\n },\r\n {\r\n target: 'promptSaveReport',\r\n cond: 'shouldPromptSaveReport',\r\n },\r\n {\r\n target: 'tracking',\r\n },\r\n ],\r\n onError: {\r\n target: 'idle',\r\n },\r\n },\r\n },\r\n promptSaveReport: {\r\n invoke: {\r\n src: 'promptSaveReport',\r\n onDone: [\r\n // \"clicked the save button\"\r\n // - should clear all measurements\r\n // - show DICOM SR\r\n {\r\n target: 'idle',\r\n actions: ['clearAllMeasurements', 'showStructuredReportDisplaySetInActiveViewport'],\r\n cond: 'shouldSaveAndContinueWithSameReport',\r\n },\r\n // \"starting a new report\"\r\n // - remove \"just saved\" measurements\r\n // - start tracking a new study + report\r\n {\r\n target: 'tracking',\r\n actions: ['discardPreviouslyTrackedMeasurements', 'setTrackedStudyAndSeries'],\r\n cond: 'shouldSaveAndStartNewReport',\r\n },\r\n // Cancel, back to tracking\r\n {\r\n target: 'tracking',\r\n },\r\n ],\r\n onError: {\r\n target: 'idle',\r\n },\r\n },\r\n },\r\n promptHydrateStructuredReport: {\r\n invoke: {\r\n src: 'promptHydrateStructuredReport',\r\n onDone: [\r\n {\r\n target: 'tracking',\r\n actions: [\r\n 'setTrackedStudyAndMultipleSeries',\r\n 'jumpToFirstMeasurementInActiveViewport',\r\n 'setIsDirtyToClean',\r\n ],\r\n cond: 'shouldHydrateStructuredReport',\r\n },\r\n {\r\n target: 'idle',\r\n actions: ['ignoreHydrationForSRSeries'],\r\n cond: 'shouldIgnoreHydrationForSR',\r\n },\r\n ],\r\n onError: {\r\n target: 'idle',\r\n },\r\n },\r\n },\r\n hydrateStructuredReport: {\r\n invoke: {\r\n src: 'hydrateStructuredReport',\r\n onDone: [\r\n {\r\n target: 'tracking',\r\n actions: [\r\n 'setTrackedStudyAndMultipleSeries',\r\n 'jumpToFirstMeasurementInActiveViewport',\r\n 'setIsDirtyToClean',\r\n ],\r\n },\r\n ],\r\n onError: {\r\n target: 'idle',\r\n },\r\n },\r\n },\r\n },\r\n strict: true,\r\n};\r\n\r\nconst defaultOptions = {\r\n services: {\r\n promptBeginTracking: (ctx, evt) => {\r\n // return { userResponse, StudyInstanceUID, SeriesInstanceUID }\r\n },\r\n promptTrackNewStudy: (ctx, evt) => {\r\n // return { userResponse, StudyInstanceUID, SeriesInstanceUID }\r\n },\r\n promptTrackNewSeries: (ctx, evt) => {\r\n // return { userResponse, StudyInstanceUID, SeriesInstanceUID }\r\n },\r\n },\r\n actions: {\r\n discardPreviouslyTrackedMeasurements: (ctx, evt) => {\r\n console.log('discardPreviouslyTrackedMeasurements: not implemented');\r\n },\r\n clearAllMeasurements: (ctx, evt) => {\r\n console.log('clearAllMeasurements: not implemented');\r\n },\r\n jumpToFirstMeasurementInActiveViewport: (ctx, evt) => {\r\n console.warn('jumpToFirstMeasurementInActiveViewport: not implemented');\r\n },\r\n showStructuredReportDisplaySetInActiveViewport: (ctx, evt) => {\r\n console.warn('showStructuredReportDisplaySetInActiveViewport: not implemented');\r\n },\r\n clearContext: assign({\r\n trackedStudy: '',\r\n trackedSeries: [],\r\n ignoredSeries: [],\r\n prevTrackedStudy: '',\r\n prevTrackedSeries: [],\r\n prevIgnoredSeries: [],\r\n }),\r\n // Promise resolves w/ `evt.data.*`\r\n setTrackedStudyAndSeries: assign((ctx, evt) => ({\r\n prevTrackedStudy: ctx.trackedStudy,\r\n prevTrackedSeries: ctx.trackedSeries.slice(),\r\n prevIgnoredSeries: ctx.ignoredSeries.slice(),\r\n //\r\n trackedStudy: evt.data.StudyInstanceUID,\r\n trackedSeries: [evt.data.SeriesInstanceUID],\r\n ignoredSeries: [],\r\n })),\r\n setTrackedStudyAndMultipleSeries: assign((ctx, evt) => {\r\n const studyInstanceUID = evt.StudyInstanceUID || evt.data.StudyInstanceUID;\r\n const seriesInstanceUIDs = evt.SeriesInstanceUIDs || evt.data.SeriesInstanceUIDs;\r\n\r\n return {\r\n prevTrackedStudy: ctx.trackedStudy,\r\n prevTrackedSeries: ctx.trackedSeries.slice(),\r\n prevIgnoredSeries: ctx.ignoredSeries.slice(),\r\n //\r\n trackedStudy: studyInstanceUID,\r\n trackedSeries: [...ctx.trackedSeries, ...seriesInstanceUIDs],\r\n ignoredSeries: [],\r\n };\r\n }),\r\n setIsDirtyToClean: assign((ctx, evt) => ({\r\n isDirty: false,\r\n })),\r\n setIsDirty: assign((ctx, evt) => ({\r\n isDirty: true,\r\n })),\r\n ignoreSeries: assign((ctx, evt) => ({\r\n prevIgnoredSeries: [...ctx.ignoredSeries],\r\n ignoredSeries: [...ctx.ignoredSeries, evt.data.SeriesInstanceUID],\r\n })),\r\n ignoreHydrationForSRSeries: assign((ctx, evt) => ({\r\n ignoredSRSeriesForHydration: [\r\n ...ctx.ignoredSRSeriesForHydration,\r\n evt.data.srSeriesInstanceUID,\r\n ],\r\n })),\r\n addTrackedSeries: assign((ctx, evt) => ({\r\n prevTrackedSeries: [...ctx.trackedSeries],\r\n trackedSeries: [...ctx.trackedSeries, evt.data.SeriesInstanceUID],\r\n })),\r\n removeTrackedSeries: assign((ctx, evt) => ({\r\n prevTrackedSeries: ctx.trackedSeries.slice().filter(ser => ser !== evt.SeriesInstanceUID),\r\n trackedSeries: ctx.trackedSeries.slice().filter(ser => ser !== evt.SeriesInstanceUID),\r\n })),\r\n },\r\n guards: {\r\n // We set dirty any time we performan an action that:\r\n // - Tracks a new study\r\n // - Tracks a new series\r\n // - Adds a measurement to an already tracked study/series\r\n //\r\n // We set clean any time we restore from an SR\r\n //\r\n // This guard/condition is specific to \"new measurements\"\r\n // to make sure we only track dirty when the new measurement is specific\r\n // to a series we're already tracking\r\n //\r\n // tl;dr\r\n // Any report change, that is not a hydration of an existing report, should\r\n // result in a \"dirty\" report\r\n //\r\n // Where dirty means there would be \"loss of data\" if we blew away measurements\r\n // without creating a new SR.\r\n shouldSetDirty: (ctx, evt) => {\r\n return (\r\n // When would this happen?\r\n evt.SeriesInstanceUID === undefined || ctx.trackedSeries.includes(evt.SeriesInstanceUID)\r\n );\r\n },\r\n shouldKillMachine: (ctx, evt) => evt.data && evt.data.userResponse === RESPONSE.NO_NEVER,\r\n shouldAddSeries: (ctx, evt) => evt.data && evt.data.userResponse === RESPONSE.ADD_SERIES,\r\n shouldSetStudyAndSeries: (ctx, evt) =>\r\n evt.data && evt.data.userResponse === RESPONSE.SET_STUDY_AND_SERIES,\r\n shouldAddIgnoredSeries: (ctx, evt) =>\r\n evt.data && evt.data.userResponse === RESPONSE.NO_NOT_FOR_SERIES,\r\n shouldPromptSaveReport: (ctx, evt) =>\r\n evt.data && evt.data.userResponse === RESPONSE.CREATE_REPORT,\r\n shouldIgnoreHydrationForSR: (ctx, evt) => evt.data && evt.data.userResponse === RESPONSE.CANCEL,\r\n shouldSaveAndContinueWithSameReport: (ctx, evt) =>\r\n evt.data &&\r\n evt.data.userResponse === RESPONSE.CREATE_REPORT &&\r\n evt.data.isBackupSave === true,\r\n shouldSaveAndStartNewReport: (ctx, evt) =>\r\n evt.data &&\r\n evt.data.userResponse === RESPONSE.CREATE_REPORT &&\r\n evt.data.isBackupSave === false,\r\n shouldHydrateStructuredReport: (ctx, evt) =>\r\n evt.data && evt.data.userResponse === RESPONSE.HYDRATE_REPORT,\r\n // Has more than 1, or SeriesInstanceUID is not in list\r\n // --> Post removal would have non-empty trackedSeries array\r\n hasRemainingTrackedSeries: (ctx, evt) =>\r\n ctx.trackedSeries.length > 1 || !ctx.trackedSeries.includes(evt.SeriesInstanceUID),\r\n hasNotIgnoredSRSeriesForHydration: (ctx, evt) => {\r\n return !ctx.ignoredSRSeriesForHydration.includes(evt.SeriesInstanceUID);\r\n },\r\n isNewStudy: (ctx, evt) =>\r\n !ctx.ignoredSeries.includes(evt.SeriesInstanceUID) &&\r\n ctx.trackedStudy !== evt.StudyInstanceUID,\r\n isNewSeries: (ctx, evt) =>\r\n !ctx.ignoredSeries.includes(evt.SeriesInstanceUID) &&\r\n !ctx.trackedSeries.includes(evt.SeriesInstanceUID),\r\n },\r\n};\r\n\r\nexport { defaultOptions, machineConfiguration };\r\n","import { ButtonEnums } from '@ohif/ui';\r\n\r\nconst RESPONSE = {\r\n NO_NEVER: -1,\r\n CANCEL: 0,\r\n CREATE_REPORT: 1,\r\n ADD_SERIES: 2,\r\n SET_STUDY_AND_SERIES: 3,\r\n};\r\n\r\nfunction promptBeginTracking({ servicesManager, extensionManager }, ctx, evt) {\r\n const { uiViewportDialogService } = servicesManager.services;\r\n const { viewportId, StudyInstanceUID, SeriesInstanceUID } = evt;\r\n\r\n return new Promise(async function (resolve, reject) {\r\n let promptResult = await _askTrackMeasurements(uiViewportDialogService, viewportId);\r\n\r\n resolve({\r\n userResponse: promptResult,\r\n StudyInstanceUID,\r\n SeriesInstanceUID,\r\n viewportId,\r\n });\r\n });\r\n}\r\n\r\nfunction _askTrackMeasurements(uiViewportDialogService, viewportId) {\r\n return new Promise(function (resolve, reject) {\r\n const message = 'Track measurements for this series?';\r\n const actions = [\r\n {\r\n id: 'prompt-begin-tracking-cancel',\r\n type: ButtonEnums.type.secondary,\r\n text: 'No',\r\n value: RESPONSE.CANCEL,\r\n },\r\n {\r\n id: 'prompt-begin-tracking-no-do-not-ask-again',\r\n type: ButtonEnums.type.secondary,\r\n text: 'No, do not ask again',\r\n value: RESPONSE.NO_NEVER,\r\n },\r\n {\r\n id: 'prompt-begin-tracking-yes',\r\n type: ButtonEnums.type.primary,\r\n text: 'Yes',\r\n value: RESPONSE.SET_STUDY_AND_SERIES,\r\n },\r\n ];\r\n const onSubmit = result => {\r\n uiViewportDialogService.hide();\r\n resolve(result);\r\n };\r\n\r\n uiViewportDialogService.show({\r\n viewportId,\r\n id: 'measurement-tracking-prompt-begin-tracking',\r\n type: 'info',\r\n message,\r\n actions,\r\n onSubmit,\r\n onOutsideClick: () => {\r\n uiViewportDialogService.hide();\r\n resolve(RESPONSE.CANCEL);\r\n },\r\n });\r\n });\r\n}\r\n\r\nexport default promptBeginTracking;\r\n","import { ButtonEnums } from '@ohif/ui';\r\n\r\nconst RESPONSE = {\r\n NO_NEVER: -1,\r\n CANCEL: 0,\r\n CREATE_REPORT: 1,\r\n ADD_SERIES: 2,\r\n SET_STUDY_AND_SERIES: 3,\r\n NO_NOT_FOR_SERIES: 4,\r\n};\r\n\r\nfunction promptTrackNewSeries({ servicesManager, extensionManager }, ctx, evt) {\r\n const { UIViewportDialogService } = servicesManager.services;\r\n const { viewportId, StudyInstanceUID, SeriesInstanceUID } = evt;\r\n\r\n return new Promise(async function (resolve, reject) {\r\n let promptResult = await _askShouldAddMeasurements(UIViewportDialogService, viewportId);\r\n\r\n if (promptResult === RESPONSE.CREATE_REPORT) {\r\n promptResult = ctx.isDirty\r\n ? await _askSaveDiscardOrCancel(UIViewportDialogService, viewportId)\r\n : RESPONSE.SET_STUDY_AND_SERIES;\r\n }\r\n\r\n resolve({\r\n userResponse: promptResult,\r\n StudyInstanceUID,\r\n SeriesInstanceUID,\r\n viewportId,\r\n isBackupSave: false,\r\n });\r\n });\r\n}\r\n\r\nfunction _askShouldAddMeasurements(uiViewportDialogService, viewportId) {\r\n return new Promise(function (resolve, reject) {\r\n const message = 'Do you want to add this measurement to the existing report?';\r\n const actions = [\r\n {\r\n type: ButtonEnums.type.secondary,\r\n text: 'Cancel',\r\n value: RESPONSE.CANCEL,\r\n },\r\n {\r\n type: ButtonEnums.type.primary,\r\n text: 'Create new report',\r\n value: RESPONSE.CREATE_REPORT,\r\n },\r\n {\r\n type: ButtonEnums.type.primary,\r\n text: 'Add to existing report',\r\n value: RESPONSE.ADD_SERIES,\r\n },\r\n ];\r\n const onSubmit = result => {\r\n uiViewportDialogService.hide();\r\n resolve(result);\r\n };\r\n\r\n uiViewportDialogService.show({\r\n viewportId,\r\n type: 'info',\r\n message,\r\n actions,\r\n onSubmit,\r\n onOutsideClick: () => {\r\n uiViewportDialogService.hide();\r\n resolve(RESPONSE.CANCEL);\r\n },\r\n });\r\n });\r\n}\r\n\r\nfunction _askSaveDiscardOrCancel(UIViewportDialogService, viewportId) {\r\n return new Promise(function (resolve, reject) {\r\n const message =\r\n 'You have existing tracked measurements. What would you like to do with your existing tracked measurements?';\r\n const actions = [\r\n { type: 'cancel', text: 'Cancel', value: RESPONSE.CANCEL },\r\n {\r\n type: 'secondary',\r\n text: 'Save',\r\n value: RESPONSE.CREATE_REPORT,\r\n },\r\n {\r\n type: 'primary',\r\n text: 'Discard',\r\n value: RESPONSE.SET_STUDY_AND_SERIES,\r\n },\r\n ];\r\n const onSubmit = result => {\r\n UIViewportDialogService.hide();\r\n resolve(result);\r\n };\r\n\r\n UIViewportDialogService.show({\r\n viewportId,\r\n type: 'warning',\r\n message,\r\n actions,\r\n onSubmit,\r\n onOutsideClick: () => {\r\n UIViewportDialogService.hide();\r\n resolve(RESPONSE.CANCEL);\r\n },\r\n });\r\n });\r\n}\r\n\r\nexport default promptTrackNewSeries;\r\n","const RESPONSE = {\r\n NO_NEVER: -1,\r\n CANCEL: 0,\r\n CREATE_REPORT: 1,\r\n ADD_SERIES: 2,\r\n SET_STUDY_AND_SERIES: 3,\r\n NO_NOT_FOR_SERIES: 4,\r\n};\r\n\r\nfunction promptTrackNewStudy({ servicesManager, extensionManager }, ctx, evt) {\r\n const { UIViewportDialogService } = servicesManager.services;\r\n const { viewportId, StudyInstanceUID, SeriesInstanceUID } = evt;\r\n\r\n return new Promise(async function (resolve, reject) {\r\n let promptResult = await _askTrackMeasurements(UIViewportDialogService, viewportId);\r\n\r\n if (promptResult === RESPONSE.SET_STUDY_AND_SERIES) {\r\n promptResult = ctx.isDirty\r\n ? await _askSaveDiscardOrCancel(UIViewportDialogService, viewportId)\r\n : RESPONSE.SET_STUDY_AND_SERIES;\r\n }\r\n\r\n resolve({\r\n userResponse: promptResult,\r\n StudyInstanceUID,\r\n SeriesInstanceUID,\r\n viewportId,\r\n isBackupSave: false,\r\n });\r\n });\r\n}\r\n\r\nfunction _askTrackMeasurements(UIViewportDialogService, viewportId) {\r\n return new Promise(function (resolve, reject) {\r\n const message = 'Track measurements for this series?';\r\n const actions = [\r\n { type: 'cancel', text: 'No', value: RESPONSE.CANCEL },\r\n {\r\n type: 'secondary',\r\n text: 'No, do not ask again for this series',\r\n value: RESPONSE.NO_NOT_FOR_SERIES,\r\n },\r\n {\r\n type: 'primary',\r\n text: 'Yes',\r\n value: RESPONSE.SET_STUDY_AND_SERIES,\r\n },\r\n ];\r\n const onSubmit = result => {\r\n UIViewportDialogService.hide();\r\n resolve(result);\r\n };\r\n\r\n UIViewportDialogService.show({\r\n viewportId,\r\n type: 'info',\r\n message,\r\n actions,\r\n onSubmit,\r\n onOutsideClick: () => {\r\n UIViewportDialogService.hide();\r\n resolve(RESPONSE.CANCEL);\r\n },\r\n });\r\n });\r\n}\r\n\r\nfunction _askSaveDiscardOrCancel(UIViewportDialogService, viewportId) {\r\n return new Promise(function (resolve, reject) {\r\n const message =\r\n 'Measurements cannot span across multiple studies. Do you want to save your tracked measurements?';\r\n const actions = [\r\n { type: 'cancel', text: 'Cancel', value: RESPONSE.CANCEL },\r\n {\r\n type: 'secondary',\r\n text: 'No, discard previously tracked series & measurements',\r\n value: RESPONSE.SET_STUDY_AND_SERIES,\r\n },\r\n {\r\n type: 'primary',\r\n text: 'Yes',\r\n value: RESPONSE.CREATE_REPORT,\r\n },\r\n ];\r\n const onSubmit = result => {\r\n UIViewportDialogService.hide();\r\n resolve(result);\r\n };\r\n\r\n UIViewportDialogService.show({\r\n viewportId,\r\n type: 'warning',\r\n message,\r\n actions,\r\n onSubmit,\r\n onOutsideClick: () => {\r\n UIViewportDialogService.hide();\r\n resolve(RESPONSE.CANCEL);\r\n },\r\n });\r\n });\r\n}\r\n\r\nexport default promptTrackNewStudy;\r\n","const MIN_SR_SERIES_NUMBER = 4700;\r\n\r\nexport default function getNextSRSeriesNumber(displaySetService) {\r\n const activeDisplaySets = displaySetService.getActiveDisplaySets();\r\n const srDisplaySets = activeDisplaySets.filter(ds => ds.Modality === 'SR');\r\n const srSeriesNumbers = srDisplaySets.map(ds => ds.SeriesNumber);\r\n const maxSeriesNumber = Math.max(...srSeriesNumbers, MIN_SR_SERIES_NUMBER);\r\n\r\n return maxSeriesNumber + 1;\r\n}\r\n","const RESPONSE = {\r\n NO_NEVER: -1,\r\n CANCEL: 0,\r\n CREATE_REPORT: 1,\r\n ADD_SERIES: 2,\r\n SET_STUDY_AND_SERIES: 3,\r\n NO_NOT_FOR_SERIES: 4,\r\n};\r\n\r\nexport default RESPONSE;\r\n","import { createReportAsync, createReportDialogPrompt } from '@ohif/extension-default';\r\nimport getNextSRSeriesNumber from '../../_shared/getNextSRSeriesNumber';\r\nimport RESPONSE from '../../_shared/PROMPT_RESPONSES';\r\n\r\nfunction promptSaveReport({ servicesManager, commandsManager, extensionManager }, ctx, evt) {\r\n const { uiDialogService, measurementService, displaySetService } = servicesManager.services;\r\n const viewportId = evt.viewportId === undefined ? evt.data.viewportId : evt.viewportId;\r\n const isBackupSave = evt.isBackupSave === undefined ? evt.data.isBackupSave : evt.isBackupSave;\r\n const StudyInstanceUID = evt?.data?.StudyInstanceUID;\r\n const SeriesInstanceUID = evt?.data?.SeriesInstanceUID;\r\n\r\n const { trackedStudy, trackedSeries } = ctx;\r\n let displaySetInstanceUIDs;\r\n\r\n return new Promise(async function (resolve, reject) {\r\n // TODO: Fallback if (uiDialogService) {\r\n const promptResult = await createReportDialogPrompt(uiDialogService, {\r\n extensionManager,\r\n });\r\n\r\n if (promptResult.action === RESPONSE.CREATE_REPORT) {\r\n const dataSources = extensionManager.getDataSources();\r\n const dataSource = dataSources[0];\r\n const measurements = measurementService.getMeasurements();\r\n const trackedMeasurements = measurements.filter(\r\n m => trackedStudy === m.referenceStudyUID && trackedSeries.includes(m.referenceSeriesUID)\r\n );\r\n\r\n const SeriesDescription =\r\n // isUndefinedOrEmpty\r\n promptResult.value === undefined || promptResult.value === ''\r\n ? 'Research Derived Series' // default\r\n : promptResult.value; // provided value\r\n\r\n const SeriesNumber = getNextSRSeriesNumber(displaySetService);\r\n\r\n const getReport = async () => {\r\n return commandsManager.runCommand(\r\n 'storeMeasurements',\r\n {\r\n measurementData: trackedMeasurements,\r\n dataSource,\r\n additionalFindingTypes: ['ArrowAnnotate'],\r\n options: {\r\n SeriesDescription,\r\n SeriesNumber,\r\n },\r\n },\r\n 'CORNERSTONE_STRUCTURED_REPORT'\r\n );\r\n };\r\n displaySetInstanceUIDs = await createReportAsync({\r\n servicesManager,\r\n getReport,\r\n });\r\n } else if (promptResult.action === RESPONSE.CANCEL) {\r\n // Do nothing\r\n }\r\n\r\n resolve({\r\n userResponse: promptResult.action,\r\n createdDisplaySetInstanceUIDs: displaySetInstanceUIDs,\r\n StudyInstanceUID,\r\n SeriesInstanceUID,\r\n viewportId,\r\n isBackupSave,\r\n });\r\n });\r\n}\r\n\r\nexport default promptSaveReport;\r\n","import { hydrateStructuredReport } from '@ohif/extension-cornerstone-dicom-sr';\r\nimport { ButtonEnums } from '@ohif/ui';\r\n\r\nconst RESPONSE = {\r\n NO_NEVER: -1,\r\n CANCEL: 0,\r\n CREATE_REPORT: 1,\r\n ADD_SERIES: 2,\r\n SET_STUDY_AND_SERIES: 3,\r\n NO_NOT_FOR_SERIES: 4,\r\n HYDRATE_REPORT: 5,\r\n};\r\n\r\nfunction promptHydrateStructuredReport({ servicesManager, extensionManager, appConfig }, ctx, evt) {\r\n const { uiViewportDialogService, displaySetService } = servicesManager.services;\r\n const { viewportId, displaySetInstanceUID } = evt;\r\n const srDisplaySet = displaySetService.getDisplaySetByUID(displaySetInstanceUID);\r\n\r\n return new Promise(async function (resolve, reject) {\r\n const promptResult = await _askTrackMeasurements(uiViewportDialogService, viewportId);\r\n\r\n // Need to do action here... So we can set state...\r\n let StudyInstanceUID, SeriesInstanceUIDs;\r\n\r\n if (promptResult === RESPONSE.HYDRATE_REPORT) {\r\n console.warn('!! HYDRATING STRUCTURED REPORT');\r\n const hydrationResult = hydrateStructuredReport(\r\n { servicesManager, extensionManager, appConfig },\r\n displaySetInstanceUID\r\n );\r\n\r\n StudyInstanceUID = hydrationResult.StudyInstanceUID;\r\n SeriesInstanceUIDs = hydrationResult.SeriesInstanceUIDs;\r\n }\r\n\r\n resolve({\r\n userResponse: promptResult,\r\n displaySetInstanceUID: evt.displaySetInstanceUID,\r\n srSeriesInstanceUID: srDisplaySet.SeriesInstanceUID,\r\n viewportId,\r\n StudyInstanceUID,\r\n SeriesInstanceUIDs,\r\n });\r\n });\r\n}\r\n\r\nfunction _askTrackMeasurements(uiViewportDialogService, viewportId) {\r\n return new Promise(function (resolve, reject) {\r\n const message = 'Do you want to continue tracking measurements for this study?';\r\n const actions = [\r\n {\r\n type: ButtonEnums.type.secondary,\r\n text: 'No',\r\n value: RESPONSE.CANCEL,\r\n },\r\n {\r\n type: ButtonEnums.type.primary,\r\n text: 'Yes',\r\n value: RESPONSE.HYDRATE_REPORT,\r\n },\r\n ];\r\n const onSubmit = result => {\r\n uiViewportDialogService.hide();\r\n resolve(result);\r\n };\r\n\r\n uiViewportDialogService.show({\r\n viewportId,\r\n type: 'info',\r\n message,\r\n actions,\r\n onSubmit,\r\n onOutsideClick: () => {\r\n uiViewportDialogService.hide();\r\n resolve(RESPONSE.CANCEL);\r\n },\r\n });\r\n });\r\n}\r\n\r\nexport default promptHydrateStructuredReport;\r\n","import { hydrateStructuredReport as baseHydrateStructuredReport } from '@ohif/extension-cornerstone-dicom-sr';\r\n\r\nfunction hydrateStructuredReport({ servicesManager, extensionManager }, ctx, evt) {\r\n const { displaySetService } = servicesManager.services;\r\n const { viewportId, displaySetInstanceUID } = evt;\r\n const srDisplaySet = displaySetService.getDisplaySetByUID(displaySetInstanceUID);\r\n\r\n return new Promise((resolve, reject) => {\r\n const hydrationResult = baseHydrateStructuredReport(\r\n { servicesManager, extensionManager },\r\n displaySetInstanceUID\r\n );\r\n\r\n const StudyInstanceUID = hydrationResult.StudyInstanceUID;\r\n const SeriesInstanceUIDs = hydrationResult.SeriesInstanceUIDs;\r\n\r\n resolve({\r\n displaySetInstanceUID: evt.displaySetInstanceUID,\r\n srSeriesInstanceUID: srDisplaySet.SeriesInstanceUID,\r\n viewportId,\r\n StudyInstanceUID,\r\n SeriesInstanceUIDs,\r\n });\r\n });\r\n}\r\n\r\nexport default hydrateStructuredReport;\r\n","import React, { useContext, useEffect } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { Machine } from 'xstate';\r\nimport { useMachine } from '@xstate/react';\r\nimport { useViewportGrid } from '@ohif/ui';\r\nimport { machineConfiguration, defaultOptions } from './measurementTrackingMachine';\r\nimport promptBeginTracking from './promptBeginTracking';\r\nimport promptTrackNewSeries from './promptTrackNewSeries';\r\nimport promptTrackNewStudy from './promptTrackNewStudy';\r\nimport promptSaveReport from './promptSaveReport';\r\nimport promptHydrateStructuredReport from './promptHydrateStructuredReport';\r\nimport hydrateStructuredReport from './hydrateStructuredReport';\r\nimport { useAppConfig } from '@state';\r\n\r\nconst TrackedMeasurementsContext = React.createContext();\r\nTrackedMeasurementsContext.displayName = 'TrackedMeasurementsContext';\r\nconst useTrackedMeasurements = () => useContext(TrackedMeasurementsContext);\r\n\r\nconst SR_SOPCLASSHANDLERID = '@ohif/extension-cornerstone-dicom-sr.sopClassHandlerModule.dicom-sr';\r\n\r\n/**\r\n *\r\n * @param {*} param0\r\n */\r\nfunction TrackedMeasurementsContextProvider(\r\n { servicesManager, commandsManager, extensionManager }, // Bound by consumer\r\n { children } // Component props\r\n) {\r\n const [appConfig] = useAppConfig();\r\n\r\n const [viewportGrid, viewportGridService] = useViewportGrid();\r\n const { activeViewportId, viewports } = viewportGrid;\r\n const { measurementService, displaySetService } = servicesManager.services;\r\n\r\n const machineOptions = Object.assign({}, defaultOptions);\r\n machineOptions.actions = Object.assign({}, machineOptions.actions, {\r\n jumpToFirstMeasurementInActiveViewport: (ctx, evt) => {\r\n const { trackedStudy, trackedSeries, activeViewportId } = ctx;\r\n const measurements = measurementService.getMeasurements();\r\n const trackedMeasurements = measurements.filter(\r\n m => trackedStudy === m.referenceStudyUID && trackedSeries.includes(m.referenceSeriesUID)\r\n );\r\n\r\n console.log(\r\n 'jumping to measurement reset viewport',\r\n activeViewportId,\r\n trackedMeasurements[0]\r\n );\r\n\r\n const referencedDisplaySetUID = trackedMeasurements[0].displaySetInstanceUID;\r\n const referencedDisplaySet = displaySetService.getDisplaySetByUID(referencedDisplaySetUID);\r\n\r\n const referencedImages = referencedDisplaySet.images;\r\n const isVolumeIdReferenced = referencedImages[0].imageId.startsWith('volumeId');\r\n\r\n const measurementData = trackedMeasurements[0].data;\r\n\r\n let imageIndex = 0;\r\n if (!isVolumeIdReferenced && measurementData) {\r\n // if it is imageId referenced find the index of the imageId, we don't have\r\n // support for volumeId referenced images yet\r\n imageIndex = referencedImages.findIndex(image => {\r\n const imageIdToUse = Object.keys(measurementData)[0].substring(8);\r\n return image.imageId === imageIdToUse;\r\n });\r\n\r\n if (imageIndex === -1) {\r\n console.warn('Could not find image index for tracked measurement, using 0');\r\n imageIndex = 0;\r\n }\r\n }\r\n\r\n viewportGridService.setDisplaySetsForViewport({\r\n viewportId: activeViewportId,\r\n displaySetInstanceUIDs: [referencedDisplaySetUID],\r\n viewportOptions: {\r\n initialImageOptions: {\r\n index: imageIndex,\r\n },\r\n },\r\n });\r\n },\r\n showStructuredReportDisplaySetInActiveViewport: (ctx, evt) => {\r\n if (evt.data.createdDisplaySetInstanceUIDs.length > 0) {\r\n const StructuredReportDisplaySetInstanceUID = evt.data.createdDisplaySetInstanceUIDs[0];\r\n\r\n viewportGridService.setDisplaySetsForViewport({\r\n viewportId: evt.data.viewportId,\r\n displaySetInstanceUIDs: [StructuredReportDisplaySetInstanceUID],\r\n });\r\n }\r\n },\r\n discardPreviouslyTrackedMeasurements: (ctx, evt) => {\r\n const measurements = measurementService.getMeasurements();\r\n const filteredMeasurements = measurements.filter(ms =>\r\n ctx.prevTrackedSeries.includes(ms.referenceSeriesUID)\r\n );\r\n const measurementIds = filteredMeasurements.map(fm => fm.id);\r\n\r\n for (let i = 0; i < measurementIds.length; i++) {\r\n measurementService.remove(measurementIds[i]);\r\n }\r\n },\r\n clearAllMeasurements: (ctx, evt) => {\r\n const measurements = measurementService.getMeasurements();\r\n const measurementIds = measurements.map(fm => fm.uid);\r\n\r\n for (let i = 0; i < measurementIds.length; i++) {\r\n measurementService.remove(measurementIds[i]);\r\n }\r\n },\r\n });\r\n machineOptions.services = Object.assign({}, machineOptions.services, {\r\n promptBeginTracking: promptBeginTracking.bind(null, {\r\n servicesManager,\r\n extensionManager,\r\n appConfig,\r\n }),\r\n promptTrackNewSeries: promptTrackNewSeries.bind(null, {\r\n servicesManager,\r\n extensionManager,\r\n appConfig,\r\n }),\r\n promptTrackNewStudy: promptTrackNewStudy.bind(null, {\r\n servicesManager,\r\n extensionManager,\r\n appConfig,\r\n }),\r\n promptSaveReport: promptSaveReport.bind(null, {\r\n servicesManager,\r\n commandsManager,\r\n extensionManager,\r\n appConfig,\r\n }),\r\n promptHydrateStructuredReport: promptHydrateStructuredReport.bind(null, {\r\n servicesManager,\r\n extensionManager,\r\n appConfig,\r\n }),\r\n hydrateStructuredReport: hydrateStructuredReport.bind(null, {\r\n servicesManager,\r\n extensionManager,\r\n appConfig,\r\n }),\r\n });\r\n\r\n // TODO: IMPROVE\r\n // - Add measurement_updated to cornerstone; debounced? (ext side, or consumption?)\r\n // - Friendlier transition/api in front of measurementTracking machine?\r\n // - Blocked: viewport overlay shouldn't clip when resized\r\n // TODO: PRIORITY\r\n // - Fix \"ellipses\" series description dynamic truncate length\r\n // - Fix viewport border resize\r\n // - created/destroyed hooks for extensions (cornerstone measurement subscriptions in it's `init`)\r\n\r\n const measurementTrackingMachine = Machine(machineConfiguration, machineOptions);\r\n\r\n const [trackedMeasurements, sendTrackedMeasurementsEvent] = useMachine(\r\n measurementTrackingMachine\r\n );\r\n\r\n useEffect(() => {\r\n // Update the state machine with the active viewport ID\r\n sendTrackedMeasurementsEvent('UPDATE_ACTIVE_VIEWPORT_ID', {\r\n activeViewportId,\r\n });\r\n }, [activeViewportId, sendTrackedMeasurementsEvent]);\r\n\r\n // ~~ Listen for changes to ViewportGrid for potential SRs hung in panes when idle\r\n useEffect(() => {\r\n if (viewports.size > 0) {\r\n const activeViewport = viewports.get(activeViewportId);\r\n\r\n if (!activeViewport || !activeViewport?.displaySetInstanceUIDs?.length) {\r\n return;\r\n }\r\n\r\n // Todo: Getting the first displaySetInstanceUID is wrong, but we don't have\r\n // tracking fusion viewports yet. This should change when we do.\r\n const { displaySetService } = servicesManager.services;\r\n const displaySet = displaySetService.getDisplaySetByUID(\r\n activeViewport.displaySetInstanceUIDs[0]\r\n );\r\n\r\n if (!displaySet) {\r\n return;\r\n }\r\n\r\n // If this is an SR produced by our SR SOPClassHandler,\r\n // and it hasn't been loaded yet, do that now so we\r\n // can check if it can be rehydrated or not.\r\n //\r\n // Note: This happens:\r\n // - If the viewport is not currently an OHIFCornerstoneSRViewport\r\n // - If the displaySet has never been hung\r\n //\r\n // Otherwise, the displaySet will be loaded by the useEffect handler\r\n // listening to displaySet changes inside OHIFCornerstoneSRViewport.\r\n // The issue here is that this handler in TrackedMeasurementsContext\r\n // ends up occurring before the Viewport is created, so the displaySet\r\n // is not loaded yet, and isRehydratable is undefined unless we call load().\r\n if (\r\n displaySet.SOPClassHandlerId === SR_SOPCLASSHANDLERID &&\r\n !displaySet.isLoaded &&\r\n displaySet.load\r\n ) {\r\n displaySet.load();\r\n }\r\n\r\n // Magic string\r\n // load function added by our sopClassHandler module\r\n if (\r\n displaySet.SOPClassHandlerId === SR_SOPCLASSHANDLERID &&\r\n displaySet.isRehydratable === true\r\n ) {\r\n console.log('sending event...', trackedMeasurements);\r\n sendTrackedMeasurementsEvent('PROMPT_HYDRATE_SR', {\r\n displaySetInstanceUID: displaySet.displaySetInstanceUID,\r\n SeriesInstanceUID: displaySet.SeriesInstanceUID,\r\n viewportId: activeViewportId,\r\n });\r\n }\r\n }\r\n }, [activeViewportId, sendTrackedMeasurementsEvent, servicesManager.services, viewports]);\r\n\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n}\r\n\r\nTrackedMeasurementsContextProvider.propTypes = {\r\n children: PropTypes.oneOf([PropTypes.func, PropTypes.node]),\r\n servicesManager: PropTypes.object.isRequired,\r\n commandsManager: PropTypes.object.isRequired,\r\n extensionManager: PropTypes.object.isRequired,\r\n appConfig: PropTypes.object,\r\n};\r\n\r\nexport { TrackedMeasurementsContext, TrackedMeasurementsContextProvider, useTrackedMeasurements };\r\n","import {\r\n TrackedMeasurementsContext,\r\n TrackedMeasurementsContextProvider,\r\n useTrackedMeasurements,\r\n} from './contexts';\r\n\r\nfunction getContextModule({ servicesManager, extensionManager, commandsManager }) {\r\n const BoundTrackedMeasurementsContextProvider = TrackedMeasurementsContextProvider.bind(null, {\r\n servicesManager,\r\n extensionManager,\r\n commandsManager,\r\n });\r\n\r\n return [\r\n {\r\n name: 'TrackedMeasurementsContext',\r\n context: TrackedMeasurementsContext,\r\n provider: BoundTrackedMeasurementsContextProvider,\r\n },\r\n ];\r\n}\r\n\r\nexport { useTrackedMeasurements };\r\nexport default getContextModule;\r\n","import React, { useState, useEffect } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport PropTypes from 'prop-types';\r\nimport { utils } from '@ohif/core';\r\nimport { StudyBrowser, useImageViewer, useViewportGrid, Dialog, ButtonEnums } from '@ohif/ui';\r\nimport { useTrackedMeasurements } from '../../getContextModule';\r\n\r\nconst { formatDate } = utils;\r\n\r\n/**\r\n *\r\n * @param {*} param0\r\n */\r\nfunction PanelStudyBrowserTracking({\r\n servicesManager,\r\n getImageSrc,\r\n getStudiesForPatientByMRN,\r\n requestDisplaySetCreationForStudy,\r\n dataSource,\r\n}) {\r\n const { displaySetService, uiDialogService, hangingProtocolService, uiNotificationService } =\r\n servicesManager.services;\r\n const navigate = useNavigate();\r\n\r\n const { t } = useTranslation('Common');\r\n\r\n // Normally you nest the components so the tree isn't so deep, and the data\r\n // doesn't have to have such an intense shape. This works well enough for now.\r\n // Tabs --> Studies --> DisplaySets --> Thumbnails\r\n const { StudyInstanceUIDs } = useImageViewer();\r\n const [{ activeViewportId, viewports }, viewportGridService] = useViewportGrid();\r\n const [trackedMeasurements, sendTrackedMeasurementsEvent] = useTrackedMeasurements();\r\n const [activeTabName, setActiveTabName] = useState('primary');\r\n const [expandedStudyInstanceUIDs, setExpandedStudyInstanceUIDs] = useState([\r\n ...StudyInstanceUIDs,\r\n ]);\r\n const [studyDisplayList, setStudyDisplayList] = useState([]);\r\n const [displaySets, setDisplaySets] = useState([]);\r\n const [thumbnailImageSrcMap, setThumbnailImageSrcMap] = useState({});\r\n const [jumpToDisplaySet, setJumpToDisplaySet] = useState(null);\r\n\r\n const onDoubleClickThumbnailHandler = displaySetInstanceUID => {\r\n let updatedViewports = [];\r\n const viewportId = activeViewportId;\r\n try {\r\n updatedViewports = hangingProtocolService.getViewportsRequireUpdate(\r\n viewportId,\r\n displaySetInstanceUID\r\n );\r\n } catch (error) {\r\n console.warn(error);\r\n uiNotificationService.show({\r\n title: 'Thumbnail Double Click',\r\n message:\r\n 'The selected display sets could not be added to the viewport due to a mismatch in the Hanging Protocol rules.',\r\n type: 'info',\r\n duration: 3000,\r\n });\r\n }\r\n\r\n viewportGridService.setDisplaySetsForViewports(updatedViewports);\r\n };\r\n\r\n const activeViewportDisplaySetInstanceUIDs =\r\n viewports.get(activeViewportId)?.displaySetInstanceUIDs;\r\n\r\n const { trackedSeries } = trackedMeasurements.context;\r\n\r\n // ~~ studyDisplayList\r\n useEffect(() => {\r\n // Fetch all studies for the patient in each primary study\r\n async function fetchStudiesForPatient(StudyInstanceUID) {\r\n // current study qido\r\n const qidoForStudyUID = await dataSource.query.studies.search({\r\n studyInstanceUid: StudyInstanceUID,\r\n });\r\n\r\n if (!qidoForStudyUID?.length) {\r\n navigate('/notfoundstudy', '_self');\r\n throw new Error('Invalid study URL');\r\n }\r\n\r\n let qidoStudiesForPatient = qidoForStudyUID;\r\n\r\n // try to fetch the prior studies based on the patientID if the\r\n // server can respond.\r\n try {\r\n qidoStudiesForPatient = await getStudiesForPatientByMRN(qidoForStudyUID);\r\n } catch (error) {\r\n console.warn(error);\r\n }\r\n\r\n const mappedStudies = _mapDataSourceStudies(qidoStudiesForPatient);\r\n const actuallyMappedStudies = mappedStudies.map(qidoStudy => {\r\n return {\r\n studyInstanceUid: qidoStudy.StudyInstanceUID,\r\n date: formatDate(qidoStudy.StudyDate) || t('NoStudyDate'),\r\n description: qidoStudy.StudyDescription,\r\n modalities: qidoStudy.ModalitiesInStudy,\r\n numInstances: qidoStudy.NumInstances,\r\n };\r\n });\r\n\r\n setStudyDisplayList(prevArray => {\r\n const ret = [...prevArray];\r\n for (const study of actuallyMappedStudies) {\r\n if (!prevArray.find(it => it.studyInstanceUid === study.studyInstanceUid)) {\r\n ret.push(study);\r\n }\r\n }\r\n return ret;\r\n });\r\n }\r\n\r\n StudyInstanceUIDs.forEach(sid => fetchStudiesForPatient(sid));\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [StudyInstanceUIDs, getStudiesForPatientByMRN]);\r\n\r\n // ~~ Initial Thumbnails\r\n useEffect(() => {\r\n const currentDisplaySets = displaySetService.activeDisplaySets;\r\n\r\n if (!currentDisplaySets.length) {\r\n return;\r\n }\r\n\r\n currentDisplaySets.forEach(async dSet => {\r\n const newImageSrcEntry = {};\r\n const displaySet = displaySetService.getDisplaySetByUID(dSet.displaySetInstanceUID);\r\n const imageIds = dataSource.getImageIdsForDisplaySet(displaySet);\r\n const imageId = imageIds[Math.floor(imageIds.length / 2)];\r\n\r\n // TODO: Is it okay that imageIds are not returned here for SR displaySets?\r\n if (!imageId || displaySet?.unsupported) {\r\n return;\r\n }\r\n // When the image arrives, render it and store the result in the thumbnailImgSrcMap\r\n newImageSrcEntry[dSet.displaySetInstanceUID] = await getImageSrc(imageId);\r\n\r\n setThumbnailImageSrcMap(prevState => {\r\n return { ...prevState, ...newImageSrcEntry };\r\n });\r\n });\r\n }, [displaySetService, dataSource, getImageSrc]);\r\n\r\n // ~~ displaySets\r\n useEffect(() => {\r\n const currentDisplaySets = displaySetService.activeDisplaySets;\r\n\r\n if (!currentDisplaySets.length) {\r\n return;\r\n }\r\n\r\n const mappedDisplaySets = _mapDisplaySets(\r\n currentDisplaySets,\r\n thumbnailImageSrcMap,\r\n trackedSeries,\r\n viewports,\r\n viewportGridService,\r\n dataSource,\r\n displaySetService,\r\n uiDialogService,\r\n uiNotificationService\r\n );\r\n\r\n setDisplaySets(mappedDisplaySets);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [\r\n displaySetService.activeDisplaySets,\r\n trackedSeries,\r\n viewports,\r\n dataSource,\r\n thumbnailImageSrcMap,\r\n ]);\r\n\r\n // ~~ subscriptions --> displaySets\r\n useEffect(() => {\r\n // DISPLAY_SETS_ADDED returns an array of DisplaySets that were added\r\n const SubscriptionDisplaySetsAdded = displaySetService.subscribe(\r\n displaySetService.EVENTS.DISPLAY_SETS_ADDED,\r\n data => {\r\n const { displaySetsAdded, options } = data;\r\n displaySetsAdded.forEach(async dSet => {\r\n const displaySetInstanceUID = dSet.displaySetInstanceUID;\r\n\r\n const newImageSrcEntry = {};\r\n const displaySet = displaySetService.getDisplaySetByUID(displaySetInstanceUID);\r\n if (displaySet?.unsupported) {\r\n return;\r\n }\r\n\r\n if (options.madeInClient) {\r\n setJumpToDisplaySet(displaySetInstanceUID);\r\n }\r\n\r\n const imageIds = dataSource.getImageIdsForDisplaySet(displaySet);\r\n const imageId = imageIds[Math.floor(imageIds.length / 2)];\r\n\r\n // TODO: Is it okay that imageIds are not returned here for SR displaysets?\r\n if (!imageId) {\r\n return;\r\n }\r\n\r\n // When the image arrives, render it and store the result in the thumbnailImgSrcMap\r\n newImageSrcEntry[displaySetInstanceUID] = await getImageSrc(imageId);\r\n setThumbnailImageSrcMap(prevState => {\r\n return { ...prevState, ...newImageSrcEntry };\r\n });\r\n });\r\n }\r\n );\r\n\r\n return () => {\r\n SubscriptionDisplaySetsAdded.unsubscribe();\r\n };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [displaySetService, dataSource, getImageSrc, thumbnailImageSrcMap, trackedSeries, viewports]);\r\n\r\n useEffect(() => {\r\n // TODO: Will this always hold _all_ the displaySets we care about?\r\n // DISPLAY_SETS_CHANGED returns `DisplaySerService.activeDisplaySets`\r\n const SubscriptionDisplaySetsChanged = displaySetService.subscribe(\r\n displaySetService.EVENTS.DISPLAY_SETS_CHANGED,\r\n changedDisplaySets => {\r\n const mappedDisplaySets = _mapDisplaySets(\r\n changedDisplaySets,\r\n thumbnailImageSrcMap,\r\n trackedSeries,\r\n viewports,\r\n viewportGridService,\r\n dataSource,\r\n displaySetService,\r\n uiDialogService,\r\n uiNotificationService\r\n );\r\n\r\n setDisplaySets(mappedDisplaySets);\r\n }\r\n );\r\n\r\n const SubscriptionDisplaySetMetaDataInvalidated = displaySetService.subscribe(\r\n displaySetService.EVENTS.DISPLAY_SET_SERIES_METADATA_INVALIDATED,\r\n () => {\r\n const mappedDisplaySets = _mapDisplaySets(\r\n displaySetService.getActiveDisplaySets(),\r\n thumbnailImageSrcMap,\r\n trackedSeries,\r\n viewports,\r\n viewportGridService,\r\n dataSource,\r\n displaySetService,\r\n uiDialogService,\r\n uiNotificationService\r\n );\r\n\r\n setDisplaySets(mappedDisplaySets);\r\n }\r\n );\r\n\r\n return () => {\r\n SubscriptionDisplaySetsChanged.unsubscribe();\r\n SubscriptionDisplaySetMetaDataInvalidated.unsubscribe();\r\n };\r\n }, [thumbnailImageSrcMap, trackedSeries, viewports, dataSource, displaySetService]);\r\n\r\n const tabs = _createStudyBrowserTabs(\r\n StudyInstanceUIDs,\r\n studyDisplayList,\r\n displaySets,\r\n hangingProtocolService\r\n );\r\n\r\n // TODO: Should not fire this on \"close\"\r\n function _handleStudyClick(StudyInstanceUID) {\r\n const shouldCollapseStudy = expandedStudyInstanceUIDs.includes(StudyInstanceUID);\r\n const updatedExpandedStudyInstanceUIDs = shouldCollapseStudy\r\n ? [...expandedStudyInstanceUIDs.filter(stdyUid => stdyUid !== StudyInstanceUID)]\r\n : [...expandedStudyInstanceUIDs, StudyInstanceUID];\r\n\r\n setExpandedStudyInstanceUIDs(updatedExpandedStudyInstanceUIDs);\r\n\r\n if (!shouldCollapseStudy) {\r\n const madeInClient = true;\r\n requestDisplaySetCreationForStudy(displaySetService, StudyInstanceUID, madeInClient);\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n if (jumpToDisplaySet) {\r\n // Get element by displaySetInstanceUID\r\n const displaySetInstanceUID = jumpToDisplaySet;\r\n const element = document.getElementById(`thumbnail-${displaySetInstanceUID}`);\r\n\r\n if (element && typeof element.scrollIntoView === 'function') {\r\n // TODO: Any way to support IE here?\r\n element.scrollIntoView({ behavior: 'smooth' });\r\n\r\n setJumpToDisplaySet(null);\r\n }\r\n }\r\n }, [jumpToDisplaySet, expandedStudyInstanceUIDs, activeTabName]);\r\n\r\n useEffect(() => {\r\n if (!jumpToDisplaySet) {\r\n return;\r\n }\r\n\r\n const displaySetInstanceUID = jumpToDisplaySet;\r\n // Set the activeTabName and expand the study\r\n const thumbnailLocation = _findTabAndStudyOfDisplaySet(displaySetInstanceUID, tabs);\r\n if (!thumbnailLocation) {\r\n console.warn('jumpToThumbnail: displaySet thumbnail not found.');\r\n\r\n return;\r\n }\r\n const { tabName, StudyInstanceUID } = thumbnailLocation;\r\n setActiveTabName(tabName);\r\n const studyExpanded = expandedStudyInstanceUIDs.includes(StudyInstanceUID);\r\n if (!studyExpanded) {\r\n const updatedExpandedStudyInstanceUIDs = [...expandedStudyInstanceUIDs, StudyInstanceUID];\r\n setExpandedStudyInstanceUIDs(updatedExpandedStudyInstanceUIDs);\r\n }\r\n }, [expandedStudyInstanceUIDs, jumpToDisplaySet, tabs]);\r\n\r\n return (\r\n {\r\n setActiveTabName(clickedTabName);\r\n }}\r\n onClickUntrack={displaySetInstanceUID => {\r\n const displaySet = displaySetService.getDisplaySetByUID(displaySetInstanceUID);\r\n // TODO: shift this somewhere else where we're centralizing this logic?\r\n // Potentially a helper from displaySetInstanceUID to this\r\n sendTrackedMeasurementsEvent('UNTRACK_SERIES', {\r\n SeriesInstanceUID: displaySet.SeriesInstanceUID,\r\n });\r\n }}\r\n onClickThumbnail={() => {}}\r\n onDoubleClickThumbnail={onDoubleClickThumbnailHandler}\r\n activeDisplaySetInstanceUIDs={activeViewportDisplaySetInstanceUIDs}\r\n />\r\n );\r\n}\r\n\r\nPanelStudyBrowserTracking.propTypes = {\r\n servicesManager: PropTypes.object.isRequired,\r\n dataSource: PropTypes.shape({\r\n getImageIdsForDisplaySet: PropTypes.func.isRequired,\r\n }).isRequired,\r\n getImageSrc: PropTypes.func.isRequired,\r\n getStudiesForPatientByMRN: PropTypes.func.isRequired,\r\n requestDisplaySetCreationForStudy: PropTypes.func.isRequired,\r\n};\r\n\r\nexport default PanelStudyBrowserTracking;\r\n\r\n/**\r\n * Maps from the DataSource's format to a naturalized object\r\n *\r\n * @param {*} studies\r\n */\r\nfunction _mapDataSourceStudies(studies) {\r\n return studies.map(study => {\r\n // TODO: Why does the data source return in this format?\r\n return {\r\n AccessionNumber: study.accession,\r\n StudyDate: study.date,\r\n StudyDescription: study.description,\r\n NumInstances: study.instances,\r\n ModalitiesInStudy: study.modalities,\r\n PatientID: study.mrn,\r\n PatientName: study.patientName,\r\n StudyInstanceUID: study.studyInstanceUid,\r\n StudyTime: study.time,\r\n };\r\n });\r\n}\r\n\r\nfunction _mapDisplaySets(\r\n displaySets,\r\n thumbnailImageSrcMap,\r\n trackedSeriesInstanceUIDs,\r\n viewports, // TODO: make array of `displaySetInstanceUIDs`?\r\n viewportGridService,\r\n dataSource,\r\n displaySetService,\r\n uiDialogService,\r\n uiNotificationService\r\n) {\r\n const thumbnailDisplaySets = [];\r\n const thumbnailNoImageDisplaySets = [];\r\n displaySets\r\n .filter(ds => !ds.excludeFromThumbnailBrowser)\r\n .forEach(ds => {\r\n const imageSrc = thumbnailImageSrcMap[ds.displaySetInstanceUID];\r\n const componentType = _getComponentType(ds);\r\n const numPanes = viewportGridService.getNumViewportPanes();\r\n const viewportIdentificator = [];\r\n\r\n if (numPanes !== 1) {\r\n viewports.forEach(viewportData => {\r\n if (viewportData?.displaySetInstanceUIDs?.includes(ds.displaySetInstanceUID)) {\r\n viewportIdentificator.push(viewportData.viewportLabel);\r\n }\r\n });\r\n }\r\n\r\n const array =\r\n componentType === 'thumbnailTracked' ? thumbnailDisplaySets : thumbnailNoImageDisplaySets;\r\n\r\n const { displaySetInstanceUID } = ds;\r\n\r\n const thumbnailProps = {\r\n displaySetInstanceUID,\r\n description: ds.SeriesDescription,\r\n seriesNumber: ds.SeriesNumber,\r\n modality: ds.Modality,\r\n seriesDate: formatDate(ds.SeriesDate),\r\n numInstances: ds.numImageFrames,\r\n countIcon: ds.countIcon,\r\n messages: ds.messages,\r\n StudyInstanceUID: ds.StudyInstanceUID,\r\n componentType,\r\n imageSrc,\r\n dragData: {\r\n type: 'displayset',\r\n displaySetInstanceUID,\r\n // .. Any other data to pass\r\n },\r\n isTracked: trackedSeriesInstanceUIDs.includes(ds.SeriesInstanceUID),\r\n isHydratedForDerivedDisplaySet: ds.isHydrated,\r\n viewportIdentificator,\r\n };\r\n\r\n if (componentType === 'thumbnailNoImage') {\r\n if (dataSource.reject && dataSource.reject.series) {\r\n thumbnailProps.canReject = !ds?.unsupported;\r\n thumbnailProps.onReject = () => {\r\n uiDialogService.create({\r\n id: 'ds-reject-sr',\r\n centralize: true,\r\n isDraggable: false,\r\n showOverlay: true,\r\n content: Dialog,\r\n contentProps: {\r\n title: 'Delete Report',\r\n body: () => (\r\n
\r\n

Are you sure you want to delete this report?

\r\n

This action cannot be undone.

\r\n
\r\n ),\r\n actions: [\r\n {\r\n id: 'cancel',\r\n text: 'Cancel',\r\n type: ButtonEnums.type.secondary,\r\n },\r\n {\r\n id: 'yes',\r\n text: 'Yes',\r\n type: ButtonEnums.type.primary,\r\n classes: ['reject-yes-button'],\r\n },\r\n ],\r\n onClose: () => uiDialogService.dismiss({ id: 'ds-reject-sr' }),\r\n onShow: () => {\r\n const yesButton = document.querySelector('.reject-yes-button');\r\n\r\n yesButton.focus();\r\n },\r\n onSubmit: async ({ action }) => {\r\n switch (action.id) {\r\n case 'yes':\r\n try {\r\n await dataSource.reject.series(ds.StudyInstanceUID, ds.SeriesInstanceUID);\r\n displaySetService.deleteDisplaySet(displaySetInstanceUID);\r\n uiDialogService.dismiss({ id: 'ds-reject-sr' });\r\n uiNotificationService.show({\r\n title: 'Delete Report',\r\n message: 'Report deleted successfully',\r\n type: 'success',\r\n });\r\n } catch (error) {\r\n uiDialogService.dismiss({ id: 'ds-reject-sr' });\r\n uiNotificationService.show({\r\n title: 'Delete Report',\r\n message: 'Failed to delete report',\r\n type: 'error',\r\n });\r\n }\r\n break;\r\n case 'cancel':\r\n uiDialogService.dismiss({ id: 'ds-reject-sr' });\r\n break;\r\n }\r\n },\r\n },\r\n });\r\n };\r\n } else {\r\n thumbnailProps.canReject = false;\r\n }\r\n }\r\n\r\n array.push(thumbnailProps);\r\n });\r\n\r\n return [...thumbnailDisplaySets, ...thumbnailNoImageDisplaySets];\r\n}\r\n\r\nconst thumbnailNoImageModalities = ['SR', 'SEG', 'SM', 'RTSTRUCT', 'RTPLAN', 'RTDOSE', 'DOC', 'OT'];\r\n\r\nfunction _getComponentType(ds) {\r\n if (thumbnailNoImageModalities.includes(ds.Modality) || ds?.unsupported) {\r\n return 'thumbnailNoImage';\r\n }\r\n\r\n return 'thumbnailTracked';\r\n}\r\n\r\n/**\r\n *\r\n * @param {string[]} primaryStudyInstanceUIDs\r\n * @param {object[]} studyDisplayList\r\n * @param {string} studyDisplayList.studyInstanceUid\r\n * @param {string} studyDisplayList.date\r\n * @param {string} studyDisplayList.description\r\n * @param {string} studyDisplayList.modalities\r\n * @param {number} studyDisplayList.numInstances\r\n * @param {object[]} displaySets\r\n * @returns tabs - The prop object expected by the StudyBrowser component\r\n */\r\nfunction _createStudyBrowserTabs(\r\n primaryStudyInstanceUIDs,\r\n studyDisplayList,\r\n displaySets,\r\n hangingProtocolService\r\n) {\r\n const primaryStudies = [];\r\n const recentStudies = [];\r\n const allStudies = [];\r\n\r\n // Iterate over each study...\r\n studyDisplayList.forEach(study => {\r\n // Find it's display sets\r\n const displaySetsForStudy = displaySets.filter(\r\n ds => ds.StudyInstanceUID === study.studyInstanceUid\r\n );\r\n\r\n // Sort them\r\n const dsSortFn = hangingProtocolService.getDisplaySetSortFunction();\r\n displaySetsForStudy.sort(dsSortFn);\r\n\r\n /* Sort by series number, then by series date\r\n displaySetsForStudy.sort((a, b) => {\r\n if (a.seriesNumber !== b.seriesNumber) {\r\n return a.seriesNumber - b.seriesNumber;\r\n }\r\n\r\n const seriesDateA = Date.parse(a.seriesDate);\r\n const seriesDateB = Date.parse(b.seriesDate);\r\n\r\n return seriesDateA - seriesDateB;\r\n });\r\n */\r\n\r\n // Map the study to it's tab/view representation\r\n const tabStudy = Object.assign({}, study, {\r\n displaySets: displaySetsForStudy,\r\n });\r\n\r\n // Add the \"tab study\" to the 'primary', 'recent', and/or 'all' tab group(s)\r\n if (primaryStudyInstanceUIDs.includes(study.studyInstanceUid)) {\r\n primaryStudies.push(tabStudy);\r\n allStudies.push(tabStudy);\r\n } else {\r\n // TODO: Filter allStudies to dates within one year of current date\r\n recentStudies.push(tabStudy);\r\n allStudies.push(tabStudy);\r\n }\r\n });\r\n\r\n // Newest first\r\n const _byDate = (a, b) => {\r\n const dateA = Date.parse(a);\r\n const dateB = Date.parse(b);\r\n\r\n return dateB - dateA;\r\n };\r\n\r\n const tabs = [\r\n {\r\n name: 'primary',\r\n label: 'Primary',\r\n studies: primaryStudies.sort((studyA, studyB) => _byDate(studyA.date, studyB.date)),\r\n },\r\n {\r\n name: 'recent',\r\n label: 'Recent',\r\n studies: recentStudies.sort((studyA, studyB) => _byDate(studyA.date, studyB.date)),\r\n },\r\n {\r\n name: 'all',\r\n label: 'All',\r\n studies: allStudies.sort((studyA, studyB) => _byDate(studyA.date, studyB.date)),\r\n },\r\n ];\r\n\r\n return tabs;\r\n}\r\n\r\nfunction _findTabAndStudyOfDisplaySet(displaySetInstanceUID, tabs) {\r\n for (let t = 0; t < tabs.length; t++) {\r\n const { studies } = tabs[t];\r\n\r\n for (let s = 0; s < studies.length; s++) {\r\n const { displaySets } = studies[s];\r\n\r\n for (let d = 0; d < displaySets.length; d++) {\r\n const displaySet = displaySets[d];\r\n\r\n if (displaySet.displaySetInstanceUID === displaySetInstanceUID) {\r\n return {\r\n tabName: tabs[t].name,\r\n StudyInstanceUID: studies[s].studyInstanceUid,\r\n };\r\n }\r\n }\r\n }\r\n }\r\n}\r\n","/**\r\n * @param {*} cornerstone\r\n * @param {*} imageId\r\n */\r\nfunction getImageSrcFromImageId(cornerstone, imageId) {\r\n return new Promise((resolve, reject) => {\r\n const canvas = document.createElement('canvas');\r\n cornerstone.utilities\r\n .loadImageToCanvas({ canvas, imageId })\r\n .then(imageId => {\r\n resolve(canvas.toDataURL());\r\n })\r\n .catch(reject);\r\n });\r\n}\r\n\r\nexport default getImageSrcFromImageId;\r\n","function requestDisplaySetCreationForStudy(\r\n dataSource,\r\n displaySetService,\r\n StudyInstanceUID,\r\n madeInClient\r\n) {\r\n if (\r\n displaySetService.activeDisplaySets.some(\r\n displaySet => displaySet.StudyInstanceUID === StudyInstanceUID\r\n )\r\n ) {\r\n return;\r\n }\r\n\r\n dataSource.retrieve.series.metadata({ StudyInstanceUID, madeInClient });\r\n}\r\n\r\nexport default requestDisplaySetCreationForStudy;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\n//\r\nimport PanelStudyBrowserTracking from './PanelStudyBrowserTracking';\r\nimport getImageSrcFromImageId from './getImageSrcFromImageId';\r\nimport requestDisplaySetCreationForStudy from './requestDisplaySetCreationForStudy';\r\n\r\nfunction _getStudyForPatientUtility(extensionManager) {\r\n const utilityModule = extensionManager.getModuleEntry(\r\n '@ohif/extension-default.utilityModule.common'\r\n );\r\n\r\n const { getStudiesForPatientByMRN } = utilityModule.exports;\r\n return getStudiesForPatientByMRN;\r\n}\r\n\r\n/**\r\n * Wraps the PanelStudyBrowser and provides features afforded by managers/services\r\n *\r\n * @param {object} params\r\n * @param {object} commandsManager\r\n * @param {object} extensionManager\r\n */\r\nfunction WrappedPanelStudyBrowserTracking({ commandsManager, extensionManager, servicesManager }) {\r\n const dataSource = extensionManager.getActiveDataSource()[0];\r\n\r\n const getStudiesForPatientByMRN = _getStudyForPatientUtility(extensionManager);\r\n const _getStudiesForPatientByMRN = getStudiesForPatientByMRN.bind(null, dataSource);\r\n const _getImageSrcFromImageId = _createGetImageSrcFromImageIdFn(extensionManager);\r\n const _requestDisplaySetCreationForStudy = requestDisplaySetCreationForStudy.bind(\r\n null,\r\n dataSource\r\n );\r\n\r\n return (\r\n \r\n );\r\n}\r\n\r\n/**\r\n * Grabs cornerstone library reference using a dependent command from\r\n * the @ohif/extension-cornerstone extension. Then creates a helper function\r\n * that can take an imageId and return an image src.\r\n *\r\n * @param {func} getCommand - CommandManager's getCommand method\r\n * @returns {func} getImageSrcFromImageId - A utility function powered by\r\n * cornerstone\r\n */\r\nfunction _createGetImageSrcFromImageIdFn(extensionManager) {\r\n const utilities = extensionManager.getModuleEntry(\r\n '@ohif/extension-cornerstone.utilityModule.common'\r\n );\r\n\r\n try {\r\n const { cornerstone } = utilities.exports.getCornerstoneLibraries();\r\n return getImageSrcFromImageId.bind(null, cornerstone);\r\n } catch (ex) {\r\n throw new Error('Required command not found');\r\n }\r\n}\r\n\r\nWrappedPanelStudyBrowserTracking.propTypes = {\r\n commandsManager: PropTypes.object.isRequired,\r\n extensionManager: PropTypes.object.isRequired,\r\n servicesManager: PropTypes.object.isRequired,\r\n};\r\n\r\nexport default WrappedPanelStudyBrowserTracking;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nimport { Button, ButtonEnums } from '@ohif/ui';\r\n\r\nfunction ActionButtons({ onExportClick, onCreateReportClick, disabled }) {\r\n const { t } = useTranslation('MeasurementTable');\r\n\r\n return (\r\n \r\n \r\n {t('Export')}\r\n \r\n \r\n {t('Create Report')}\r\n \r\n \r\n );\r\n}\r\n\r\nActionButtons.propTypes = {\r\n onExportClick: PropTypes.func,\r\n onCreateReportClick: PropTypes.func,\r\n disabled: PropTypes.bool,\r\n};\r\n\r\nActionButtons.defaultProps = {\r\n onExportClick: () => alert('Export'),\r\n onCreateReportClick: () => alert('Create Report'),\r\n disabled: false,\r\n};\r\n\r\nexport default ActionButtons;\r\n","import React, { useEffect, useState, useRef } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport {\r\n StudySummary,\r\n MeasurementTable,\r\n Dialog,\r\n Input,\r\n useViewportGrid,\r\n ButtonEnums,\r\n} from '@ohif/ui';\r\nimport { DicomMetadataStore, utils } from '@ohif/core';\r\nimport { useDebounce } from '@hooks';\r\nimport ActionButtons from './ActionButtons';\r\nimport { useTrackedMeasurements } from '../../getContextModule';\r\nimport debounce from 'lodash.debounce';\r\n\r\nconst { downloadCSVReport } = utils;\r\nconst { formatDate } = utils;\r\n\r\nconst DISPLAY_STUDY_SUMMARY_INITIAL_VALUE = {\r\n key: undefined, //\r\n date: '', // '07-Sep-2010',\r\n modality: '', // 'CT',\r\n description: '', // 'CHEST/ABD/PELVIS W CONTRAST',\r\n};\r\n\r\nfunction PanelMeasurementTableTracking({ servicesManager, extensionManager }) {\r\n const [viewportGrid] = useViewportGrid();\r\n const [measurementChangeTimestamp, setMeasurementsUpdated] = useState(Date.now().toString());\r\n const debouncedMeasurementChangeTimestamp = useDebounce(measurementChangeTimestamp, 200);\r\n const { measurementService, uiDialogService, displaySetService } = servicesManager.services;\r\n const [trackedMeasurements, sendTrackedMeasurementsEvent] = useTrackedMeasurements();\r\n const { trackedStudy, trackedSeries } = trackedMeasurements.context;\r\n const [displayStudySummary, setDisplayStudySummary] = useState(\r\n DISPLAY_STUDY_SUMMARY_INITIAL_VALUE\r\n );\r\n const [displayMeasurements, setDisplayMeasurements] = useState([]);\r\n const measurementsPanelRef = useRef(null);\r\n\r\n useEffect(() => {\r\n const measurements = measurementService.getMeasurements();\r\n const filteredMeasurements = measurements.filter(\r\n m => trackedStudy === m.referenceStudyUID && trackedSeries.includes(m.referenceSeriesUID)\r\n );\r\n\r\n const mappedMeasurements = filteredMeasurements.map(m =>\r\n _mapMeasurementToDisplay(m, measurementService.VALUE_TYPES, displaySetService)\r\n );\r\n setDisplayMeasurements(mappedMeasurements);\r\n // eslint-ignore-next-line\r\n }, [measurementService, trackedStudy, trackedSeries, debouncedMeasurementChangeTimestamp]);\r\n\r\n const updateDisplayStudySummary = async () => {\r\n if (trackedMeasurements.matches('tracking')) {\r\n const StudyInstanceUID = trackedStudy;\r\n const studyMeta = DicomMetadataStore.getStudy(StudyInstanceUID);\r\n const instanceMeta = studyMeta.series[0].instances[0];\r\n const { StudyDate, StudyDescription } = instanceMeta;\r\n\r\n const modalities = new Set();\r\n studyMeta.series.forEach(series => {\r\n if (trackedSeries.includes(series.SeriesInstanceUID)) {\r\n modalities.add(series.instances[0].Modality);\r\n }\r\n });\r\n const modality = Array.from(modalities).join('/');\r\n\r\n if (displayStudySummary.key !== StudyInstanceUID) {\r\n setDisplayStudySummary({\r\n key: StudyInstanceUID,\r\n date: StudyDate, // TODO: Format: '07-Sep-2010'\r\n modality,\r\n description: StudyDescription,\r\n });\r\n }\r\n } else if (trackedStudy === '' || trackedStudy === undefined) {\r\n setDisplayStudySummary(DISPLAY_STUDY_SUMMARY_INITIAL_VALUE);\r\n }\r\n };\r\n\r\n // ~~ DisplayStudySummary\r\n useEffect(() => {\r\n updateDisplayStudySummary();\r\n }, [displayStudySummary.key, trackedMeasurements, trackedStudy, updateDisplayStudySummary]);\r\n\r\n // TODO: Better way to consolidated, debounce, check on change?\r\n // Are we exposing the right API for measurementService?\r\n // This watches for ALL measurementService changes. It updates a timestamp,\r\n // which is debounced. After a brief period of inactivity, this triggers\r\n // a re-render where we grab up-to-date measurements\r\n useEffect(() => {\r\n const added = measurementService.EVENTS.MEASUREMENT_ADDED;\r\n const addedRaw = measurementService.EVENTS.RAW_MEASUREMENT_ADDED;\r\n const updated = measurementService.EVENTS.MEASUREMENT_UPDATED;\r\n const removed = measurementService.EVENTS.MEASUREMENT_REMOVED;\r\n const cleared = measurementService.EVENTS.MEASUREMENTS_CLEARED;\r\n const subscriptions = [];\r\n\r\n [added, addedRaw, updated, removed, cleared].forEach(evt => {\r\n subscriptions.push(\r\n measurementService.subscribe(evt, () => {\r\n setMeasurementsUpdated(Date.now().toString());\r\n if (evt === added) {\r\n debounce(() => {\r\n measurementsPanelRef.current.scrollTop = measurementsPanelRef.current.scrollHeight;\r\n }, 300)();\r\n }\r\n }).unsubscribe\r\n );\r\n });\r\n\r\n return () => {\r\n subscriptions.forEach(unsub => {\r\n unsub();\r\n });\r\n };\r\n }, [measurementService, sendTrackedMeasurementsEvent]);\r\n\r\n async function exportReport() {\r\n const measurements = measurementService.getMeasurements();\r\n const trackedMeasurements = measurements.filter(\r\n m => trackedStudy === m.referenceStudyUID && trackedSeries.includes(m.referenceSeriesUID)\r\n );\r\n\r\n downloadCSVReport(trackedMeasurements, measurementService);\r\n }\r\n\r\n const jumpToImage = ({ uid, isActive }) => {\r\n measurementService.jumpToMeasurement(viewportGrid.activeViewportId, uid);\r\n\r\n onMeasurementItemClickHandler({ uid, isActive });\r\n };\r\n\r\n const onMeasurementItemEditHandler = ({ uid, isActive }) => {\r\n const measurement = measurementService.getMeasurement(uid);\r\n jumpToImage({ uid, isActive });\r\n\r\n const onSubmitHandler = ({ action, value }) => {\r\n switch (action.id) {\r\n case 'save': {\r\n measurementService.update(\r\n uid,\r\n {\r\n ...measurement,\r\n ...value,\r\n },\r\n true\r\n );\r\n }\r\n }\r\n uiDialogService.dismiss({ id: 'enter-annotation' });\r\n };\r\n\r\n uiDialogService.create({\r\n id: 'enter-annotation',\r\n centralize: true,\r\n isDraggable: false,\r\n showOverlay: true,\r\n content: Dialog,\r\n contentProps: {\r\n title: 'Annotation',\r\n noCloseButton: true,\r\n value: { label: measurement.label || '' },\r\n body: ({ value, setValue }) => {\r\n const onChangeHandler = event => {\r\n event.persist();\r\n setValue(value => ({ ...value, label: event.target.value }));\r\n };\r\n\r\n const onKeyPressHandler = event => {\r\n if (event.key === 'Enter') {\r\n onSubmitHandler({ value, action: { id: 'save' } });\r\n }\r\n };\r\n return (\r\n \r\n );\r\n },\r\n actions: [\r\n { id: 'cancel', text: 'Cancel', type: ButtonEnums.type.secondary },\r\n { id: 'save', text: 'Save', type: ButtonEnums.type.primary },\r\n ],\r\n onSubmit: onSubmitHandler,\r\n },\r\n });\r\n };\r\n\r\n const onMeasurementItemClickHandler = ({ uid, isActive }) => {\r\n if (!isActive) {\r\n const measurements = [...displayMeasurements];\r\n const measurement = measurements.find(m => m.uid === uid);\r\n\r\n measurements.forEach(m => (m.isActive = m.uid !== uid ? false : true));\r\n measurement.isActive = true;\r\n setDisplayMeasurements(measurements);\r\n }\r\n };\r\n\r\n const displayMeasurementsWithoutFindings = displayMeasurements.filter(\r\n dm => dm.measurementType !== measurementService.VALUE_TYPES.POINT\r\n );\r\n const additionalFindings = displayMeasurements.filter(\r\n dm => dm.measurementType === measurementService.VALUE_TYPES.POINT\r\n );\r\n\r\n return (\r\n <>\r\n \r\n {displayStudySummary.key && (\r\n \r\n )}\r\n \r\n {additionalFindings.length !== 0 && (\r\n \r\n )}\r\n \r\n
\r\n {\r\n sendTrackedMeasurementsEvent('SAVE_REPORT', {\r\n viewportId: viewportGrid.activeViewportId,\r\n isBackupSave: true,\r\n });\r\n }}\r\n disabled={\r\n additionalFindings.length === 0 && displayMeasurementsWithoutFindings.length === 0\r\n }\r\n />\r\n
\r\n \r\n );\r\n}\r\n\r\nPanelMeasurementTableTracking.propTypes = {\r\n servicesManager: PropTypes.shape({\r\n services: PropTypes.shape({\r\n measurementService: PropTypes.shape({\r\n getMeasurements: PropTypes.func.isRequired,\r\n VALUE_TYPES: PropTypes.object.isRequired,\r\n }).isRequired,\r\n }).isRequired,\r\n }).isRequired,\r\n};\r\n\r\n// TODO: This could be a measurementService mapper\r\nfunction _mapMeasurementToDisplay(measurement, types, displaySetService) {\r\n const { referenceStudyUID, referenceSeriesUID, SOPInstanceUID } = measurement;\r\n\r\n // TODO: We don't deal with multiframe well yet, would need to update\r\n // This in OHIF-312 when we add FrameIndex to measurements.\r\n\r\n const instance = DicomMetadataStore.getInstance(\r\n referenceStudyUID,\r\n referenceSeriesUID,\r\n SOPInstanceUID\r\n );\r\n\r\n const displaySets = displaySetService.getDisplaySetsForSeries(referenceSeriesUID);\r\n\r\n if (!displaySets[0] || !displaySets[0].images) {\r\n throw new Error('The tracked measurements panel should only be tracking \"stack\" displaySets.');\r\n }\r\n\r\n const {\r\n displayText: baseDisplayText,\r\n uid,\r\n label: baseLabel,\r\n type,\r\n selected,\r\n findingSites,\r\n finding,\r\n } = measurement;\r\n\r\n const firstSite = findingSites?.[0];\r\n const label = baseLabel || finding?.text || firstSite?.text || '(empty)';\r\n let displayText = baseDisplayText || [];\r\n if (findingSites) {\r\n const siteText = [];\r\n findingSites.forEach(site => {\r\n if (site?.text !== label) {\r\n siteText.push(site.text);\r\n }\r\n });\r\n displayText = [...siteText, ...displayText];\r\n }\r\n if (finding && finding?.text !== label) {\r\n displayText = [finding.text, ...displayText];\r\n }\r\n\r\n return {\r\n uid,\r\n label,\r\n baseLabel,\r\n measurementType: type,\r\n displayText,\r\n baseDisplayText,\r\n isActive: selected,\r\n finding,\r\n findingSites,\r\n };\r\n}\r\n\r\nexport default PanelMeasurementTableTracking;\r\n","import { Types } from '@ohif/core';\r\nimport { PanelMeasurementTableTracking, PanelStudyBrowserTracking } from './panels';\r\n\r\n// TODO:\r\n// - No loading UI exists yet\r\n// - cancel promises when component is destroyed\r\n// - show errors in UI for thumbnails if promise fails\r\nfunction getPanelModule({ commandsManager, extensionManager, servicesManager }): Types.Panel[] {\r\n return [\r\n {\r\n name: 'seriesList',\r\n iconName: 'tab-studies',\r\n iconLabel: 'Studies',\r\n label: 'Studies',\r\n component: PanelStudyBrowserTracking.bind(null, {\r\n commandsManager,\r\n extensionManager,\r\n servicesManager,\r\n }),\r\n },\r\n\r\n {\r\n name: 'trackedMeasurements',\r\n iconName: 'tab-linear',\r\n iconLabel: 'Measure',\r\n label: 'Measurements',\r\n component: PanelMeasurementTableTracking.bind(null, {\r\n commandsManager,\r\n extensionManager,\r\n servicesManager,\r\n }),\r\n },\r\n ];\r\n}\r\n\r\nexport default getPanelModule;\r\n","import React from 'react';\r\n\r\nconst Component = React.lazy(() => {\r\n return import(/* webpackPrefetch: true */ './viewports/TrackedCornerstoneViewport');\r\n});\r\n\r\nconst OHIFCornerstoneViewport = props => {\r\n return (\r\n Loading...}>\r\n \r\n \r\n );\r\n};\r\n\r\nfunction getViewportModule({ servicesManager, commandsManager, extensionManager }) {\r\n const ExtendedOHIFCornerstoneTrackingViewport = props => {\r\n return (\r\n \r\n );\r\n };\r\n\r\n return [\r\n {\r\n name: 'cornerstone-tracked',\r\n component: ExtendedOHIFCornerstoneTrackingViewport,\r\n },\r\n ];\r\n}\r\n\r\nexport default getViewportModule;\r\n","import getContextModule from './getContextModule';\r\nimport getPanelModule from './getPanelModule';\r\nimport getViewportModule from './getViewportModule';\r\nimport { id } from './id.js';\r\n\r\nconst measurementTrackingExtension = {\r\n /**\r\n * Only required property. Should be a unique value across all extensions.\r\n */\r\n id,\r\n\r\n getContextModule,\r\n getPanelModule,\r\n getViewportModule,\r\n};\r\n\r\nexport default measurementTrackingExtension;\r\n","import packageJson from '../package.json';\r\n\r\nconst id = packageJson.name;\r\n\r\nexport { id };\r\n"],"names":["RESPONSE","machineConfiguration","id","initial","context","activeViewportId","trackedStudy","trackedSeries","ignoredSeries","prevTrackedStudy","prevTrackedSeries","prevIgnoredSeries","ignoredSRSeriesForHydration","isDirty","states","off","type","idle","entry","on","TRACK_SERIES","SET_TRACKED_SERIES","target","actions","PROMPT_HYDRATE_SR","cond","RESTORE_PROMPT_HYDRATE_SR","HYDRATE_SR","UPDATE_ACTIVE_VIEWPORT_ID","assign","_","event","promptBeginTracking","invoke","src","onDone","onError","tracking","UNTRACK_SERIES","SAVE_REPORT","SET_DIRTY","promptTrackNewSeries","promptTrackNewStudy","promptSaveReport","promptHydrateStructuredReport","hydrateStructuredReport","strict","defaultOptions","services","ctx","evt","discardPreviouslyTrackedMeasurements","console","log","clearAllMeasurements","jumpToFirstMeasurementInActiveViewport","warn","showStructuredReportDisplaySetInActiveViewport","clearContext","setTrackedStudyAndSeries","slice","data","StudyInstanceUID","SeriesInstanceUID","setTrackedStudyAndMultipleSeries","studyInstanceUID","seriesInstanceUIDs","SeriesInstanceUIDs","setIsDirtyToClean","setIsDirty","ignoreSeries","ignoreHydrationForSRSeries","srSeriesInstanceUID","addTrackedSeries","removeTrackedSeries","filter","ser","guards","shouldSetDirty","undefined","includes","shouldKillMachine","userResponse","shouldAddSeries","shouldSetStudyAndSeries","shouldAddIgnoredSeries","shouldPromptSaveReport","shouldIgnoreHydrationForSR","shouldSaveAndContinueWithSameReport","isBackupSave","shouldSaveAndStartNewReport","shouldHydrateStructuredReport","hasRemainingTrackedSeries","length","hasNotIgnoredSRSeriesForHydration","isNewStudy","isNewSeries","NO_NEVER","CANCEL","CREATE_REPORT","ADD_SERIES","SET_STUDY_AND_SERIES","_ref","servicesManager","extensionManager","uiViewportDialogService","viewportId","Promise","async","resolve","reject","promptResult","message","ButtonEnums","secondary","text","value","primary","onSubmit","result","hide","show","onOutsideClick","_askTrackMeasurements","NO_NOT_FOR_SERIES","UIViewportDialogService","_askShouldAddMeasurements","_askSaveDiscardOrCancel","MIN_SR_SERIES_NUMBER","commandsManager","uiDialogService","measurementService","displaySetService","displaySetInstanceUIDs","createReportDialogPrompt","action","dataSource","getDataSources","trackedMeasurements","getMeasurements","m","referenceStudyUID","referenceSeriesUID","SeriesDescription","SeriesNumber","srSeriesNumbers","getActiveDisplaySets","ds","Modality","map","Math","max","getNextSRSeriesNumber","getReport","runCommand","measurementData","additionalFindingTypes","options","createReportAsync","createdDisplaySetInstanceUIDs","HYDRATE_REPORT","appConfig","displaySetInstanceUID","srDisplaySet","getDisplaySetByUID","hydrationResult","baseHydrateStructuredReport","TrackedMeasurementsContext","React","displayName","useTrackedMeasurements","useContext","SR_SOPCLASSHANDLERID","TrackedMeasurementsContextProvider","_ref2","children","useAppConfig","viewportGrid","viewportGridService","useViewportGrid","viewports","machineOptions","Object","referencedDisplaySetUID","referencedImages","images","isVolumeIdReferenced","imageId","startsWith","imageIndex","findIndex","image","imageIdToUse","keys","substring","setDisplaySetsForViewport","viewportOptions","initialImageOptions","index","StructuredReportDisplaySetInstanceUID","measurementIds","ms","fm","i","remove","uid","bind","measurementTrackingMachine","Machine","sendTrackedMeasurementsEvent","useMachine","useEffect","size","activeViewport","get","displaySet","SOPClassHandlerId","isLoaded","load","isRehydratable","Provider","propTypes","PropTypes","isRequired","BoundTrackedMeasurementsContextProvider","name","provider","formatDate","utils","PanelStudyBrowserTracking","getImageSrc","getStudiesForPatientByMRN","requestDisplaySetCreationForStudy","hangingProtocolService","uiNotificationService","navigate","useNavigate","t","useTranslation","StudyInstanceUIDs","useImageViewer","activeTabName","setActiveTabName","useState","expandedStudyInstanceUIDs","setExpandedStudyInstanceUIDs","studyDisplayList","setStudyDisplayList","displaySets","setDisplaySets","thumbnailImageSrcMap","setThumbnailImageSrcMap","jumpToDisplaySet","setJumpToDisplaySet","activeViewportDisplaySetInstanceUIDs","forEach","sid","qidoForStudyUID","query","studies","search","studyInstanceUid","Error","qidoStudiesForPatient","error","actuallyMappedStudies","study","AccessionNumber","accession","StudyDate","date","StudyDescription","description","NumInstances","instances","ModalitiesInStudy","modalities","PatientID","mrn","PatientName","patientName","StudyTime","time","qidoStudy","numInstances","prevArray","ret","find","it","push","fetchStudiesForPatient","currentDisplaySets","activeDisplaySets","newImageSrcEntry","dSet","imageIds","getImageIdsForDisplaySet","floor","unsupported","prevState","mappedDisplaySets","_mapDisplaySets","SubscriptionDisplaySetsAdded","subscribe","EVENTS","DISPLAY_SETS_ADDED","displaySetsAdded","madeInClient","unsubscribe","SubscriptionDisplaySetsChanged","DISPLAY_SETS_CHANGED","changedDisplaySets","SubscriptionDisplaySetMetaDataInvalidated","DISPLAY_SET_SERIES_METADATA_INVALIDATED","tabs","primaryStudyInstanceUIDs","primaryStudies","recentStudies","allStudies","displaySetsForStudy","dsSortFn","getDisplaySetSortFunction","sort","tabStudy","_byDate","a","b","dateA","Date","parse","label","studyA","studyB","_createStudyBrowserTabs","element","document","getElementById","scrollIntoView","behavior","thumbnailLocation","s","d","tabName","_findTabAndStudyOfDisplaySet","updatedExpandedStudyInstanceUIDs","StudyBrowser","onClickStudy","shouldCollapseStudy","stdyUid","onClickTab","clickedTabName","onClickUntrack","onClickThumbnail","onDoubleClickThumbnail","updatedViewports","getViewportsRequireUpdate","title","duration","setDisplaySetsForViewports","activeDisplaySetInstanceUIDs","trackedSeriesInstanceUIDs","thumbnailDisplaySets","thumbnailNoImageDisplaySets","excludeFromThumbnailBrowser","imageSrc","componentType","thumbnailNoImageModalities","_getComponentType","numPanes","getNumViewportPanes","viewportIdentificator","viewportData","viewportLabel","array","thumbnailProps","seriesNumber","modality","seriesDate","SeriesDate","numImageFrames","countIcon","messages","dragData","isTracked","isHydratedForDerivedDisplaySet","isHydrated","series","canReject","onReject","create","centralize","isDraggable","showOverlay","content","Dialog","contentProps","body","className","classes","onClose","dismiss","onShow","querySelector","focus","deleteDisplaySet","cornerstone","canvas","createElement","utilities","loadImageToCanvas","then","toDataURL","catch","some","retrieve","metadata","WrappedPanelStudyBrowserTracking","getActiveDataSource","utilityModule","getModuleEntry","exports","_getStudyForPatientUtility","_getStudiesForPatientByMRN","_getImageSrcFromImageId","getCornerstoneLibraries","getImageSrcFromImageId","ex","_createGetImageSrcFromImageIdFn","_requestDisplaySetCreationForStudy","ActionButtons","onExportClick","onCreateReportClick","disabled","Button","onClick","small","defaultProps","alert","downloadCSVReport","DISPLAY_STUDY_SUMMARY_INITIAL_VALUE","key","PanelMeasurementTableTracking","measurementChangeTimestamp","setMeasurementsUpdated","now","toString","debouncedMeasurementChangeTimestamp","useDebounce","displayStudySummary","setDisplayStudySummary","displayMeasurements","setDisplayMeasurements","measurementsPanelRef","useRef","mappedMeasurements","measurement","types","SOPInstanceUID","DicomMetadataStore","getInstance","getDisplaySetsForSeries","displayText","baseDisplayText","baseLabel","selected","findingSites","finding","firstSite","siteText","site","measurementType","isActive","_mapMeasurementToDisplay","VALUE_TYPES","updateDisplayStudySummary","matches","studyMeta","getStudy","instanceMeta","Set","add","Array","from","join","added","MEASUREMENT_ADDED","addedRaw","RAW_MEASUREMENT_ADDED","updated","MEASUREMENT_UPDATED","removed","MEASUREMENT_REMOVED","cleared","MEASUREMENTS_CLEARED","subscriptions","debounce","current","scrollTop","scrollHeight","unsub","jumpToImage","jumpToMeasurement","onMeasurementItemClickHandler","onMeasurementItemEditHandler","_ref3","getMeasurement","onSubmitHandler","_ref4","update","noCloseButton","_ref5","setValue","Input","labelClassName","autoFocus","onChange","persist","onKeyPress","_ref6","measurements","displayMeasurementsWithoutFindings","dm","POINT","additionalFindings","ref","StudySummary","MeasurementTable","onEdit","iconName","iconLabel","component","Component","OHIFCornerstoneViewport","props","fallback","_extends","packageJson","getContextModule","getPanelModule","getViewportModule"],"sourceRoot":""} \ No newline at end of file diff --git a/resources/19.css b/resources/19.css new file mode 100644 index 0000000..1db5fe3 --- /dev/null +++ b/resources/19.css @@ -0,0 +1,3 @@ +.dicom-tag-browser-table{margin-left:auto;margin-right:auto}.dicom-tag-browser-table-wrapper{overflow-x:scroll}.dicom-tag-browser-table tr{border-top:1px solid #ddd;color:#fff;padding-left:10px;padding-right:10px;white-space:nowrap}.stick{overflow:clip;position:sticky}.dicom-tag-browser-content{overflow:hidden;padding-bottom:50px;width:100%}.dicom-tag-browser-instance-range .range{height:20px}.dicom-tag-browser-instance-range{padding:20px 0}.dicom-tag-browser-table td.dicom-tag-browser-table-center{text-align:center}.dicom-tag-browser-table th{color:"#20A5D6";padding-left:10px;padding-right:10px;text-align:center}.dicom-tag-browser-table th.dicom-tag-browser-table-left{text-align:left} + +/*# sourceMappingURL=19.css.map*/ \ No newline at end of file diff --git a/resources/19.css.map b/resources/19.css.map new file mode 100644 index 0000000..0d7c436 --- /dev/null +++ b/resources/19.css.map @@ -0,0 +1 @@ +{"version":3,"file":"19.css","mappings":"AAAA,yBAEE,gBAAiB,CADjB,iBAEF,CAEA,iCAGE,iBACF,CAEA,4BAIE,yBAA0B,CAD1B,UAAc,CAFd,iBAAkB,CAClB,kBAAmB,CAGnB,kBACF,CAEA,OAEE,aAAc,CADd,eAEF,CAEA,2BACE,eAAgB,CAEhB,mBAAoB,CADpB,UAGF,CAEA,yCACE,WACF,CAEA,kCACE,cACF,CAEA,2DACE,iBACF,CAEA,4BAIE,eAAgB,CAHhB,iBAAkB,CAClB,kBAAmB,CACnB,iBAEF,CAEA,yDACE,eACF,C","sources":["webpack:///../../../extensions/default/src/DicomTagBrowser/DicomTagBrowser.css"],"sourcesContent":[".dicom-tag-browser-table {\r\n margin-right: auto;\r\n margin-left: auto;\r\n}\r\n\r\n.dicom-tag-browser-table-wrapper {\r\n /* height: 500px;*/\r\n /*overflow-y: scroll;*/\r\n overflow-x: scroll;\r\n}\r\n\r\n.dicom-tag-browser-table tr {\r\n padding-left: 10px;\r\n padding-right: 10px;\r\n color: #ffffff;\r\n border-top: 1px solid #ddd;\r\n white-space: nowrap;\r\n}\r\n\r\n.stick {\r\n position: sticky;\r\n overflow: clip;\r\n}\r\n\r\n.dicom-tag-browser-content {\r\n overflow: hidden;\r\n width: 100%;\r\n padding-bottom: 50px;\r\n /*height: 500px;*/\r\n}\r\n\r\n.dicom-tag-browser-instance-range .range {\r\n height: 20px;\r\n}\r\n\r\n.dicom-tag-browser-instance-range {\r\n padding: 20px 0 20px 0;\r\n}\r\n\r\n.dicom-tag-browser-table td.dicom-tag-browser-table-center {\r\n text-align: center;\r\n}\r\n\r\n.dicom-tag-browser-table th {\r\n padding-left: 10px;\r\n padding-right: 10px;\r\n text-align: center;\r\n color: '#20A5D6';\r\n}\r\n\r\n.dicom-tag-browser-table th.dicom-tag-browser-table-left {\r\n text-align: left;\r\n}\r\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/resources/202.bundle.358aa5cd5419f9459a04.js b/resources/202.bundle.358aa5cd5419f9459a04.js new file mode 100644 index 0000000..77a9785 --- /dev/null +++ b/resources/202.bundle.358aa5cd5419f9459a04.js @@ -0,0 +1,3 @@ +/*! For license information please see 202.bundle.358aa5cd5419f9459a04.js.LICENSE.txt */ +(self.webpackChunk=self.webpackChunk||[]).push([[202],{91202:(e,t,n)=>{"use strict";n.d(t,{Y:()=>qe,adaptersRT:()=>Jn,adaptersSEG:()=>Xn,adaptersSR:()=>Wn,helpers:()=>x});var r=n(67540),a=n(58955),i=n(87513),o=n.n(i),u=n(11677),s=n.n(u),c=n(45451);function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function d(e){for(var t=1;t=0;--a){var i=this.tryEntries[a],o=i.completion;if("root"===i.tryLoc)return r("end");if(i.tryLoc<=this.prev){var u=n.call(i,"catchLoc"),s=n.call(i,"finallyLoc");if(u&&s){if(this.prev=0;--r){var a=this.tryEntries[r];if(a.tryLoc<=this.prev&&n.call(a,"finallyLoc")&&this.prev=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),R(n),d}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var r=n.completion;if("throw"===r.type){var a=r.arg;R(n)}return a}}throw new Error("illegal catch attempt")},delegateYield:function(e,t,n){return this.delegate={iterator:x(e),resultName:t,nextLoc:n},"next"===this.method&&(this.arg=void 0),d}},e}function p(e,t,n,r,a,i,o){try{var u=e[i](o),s=u.value}catch(e){return void n(e)}u.done?t(s):Promise.resolve(s).then(r,a)}function g(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function h(e,t){for(var n=0;ne.length)&&(t=e.length);for(var n=0,r=new Array(t);n=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,o=!0,u=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return o=e.done,e},e:function(e){u=!0,i=e},f:function(){try{o||null==n.return||n.return()}finally{if(u)throw i}}}}function O(e){var t=function(e,t){if("object"!=typeof e||null===e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,t||"default");if("object"!=typeof r)return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:String(t)}var C=function(e){return Array.isArray(e)?e:[e]},R=function(e){return function(t){return t.ConceptNameCodeSequence.CodeMeaning===e}},b=r.aT.datasetToDict;var x=Object.freeze({__proto__:null,codeMeaningEquals:R,downloadDICOMData:function(e,t){var n;if(e instanceof ArrayBuffer)n=new Blob([e],{type:"application/dicom"});else{if(!e._meta)throw new Error("Dataset must have a _meta property");var r=a.lW.from(b(e).write());n=new Blob([r],{type:"application/dicom"})}var i=document.createElement("a");i.href=window.URL.createObjectURL(n),i.download=t,i.click()},graphicTypeEquals:function(e){return function(t){return t&&t.GraphicType===e}},toArray:C}),w=r.hC.TID1500,M=r.hC.addAccessors,E=r.U7.StructuredReport,P=r.oq.Normalizer,A=w.TID1500MeasurementReport,N=w.TID1501MeasurementGroup,q=r.aT.DicomMetaDictionary,_={CodingSchemeDesignator:"DCM",CodeValue:"121071"},U={CodingSchemeDesignator:"SCT",CodeValue:"363698007"},V={CodingSchemeDesignator:"SRT",CodeValue:"G-C0E3"},k=function(e,t,n){var r=e.ConceptNameCodeSequence;if(r){var a=r.CodingSchemeDesignator,i=r.CodeValue;return a==t.CodingSchemeDesignator&&i==t.CodeValue||n&&a==n.CodingSchemeDesignator&&i==n.CodeValue}};var G=function(){function e(){g(this,e)}return m(e,null,[{key:"getSetupMeasurementData",value:function(e){var t=e.ContentSequence,n=C(t),r=n.find((function(e){return k(e,_)})),a=n.filter((function(e){return k(e,U,V)}))||[],i=n.find((function(e){return"NUM"===e.ValueType})),o=C(i.ContentSequence).find((function(e){return"SCOORD"===e.ValueType})),u=o.ContentSequence.ReferencedSOPSequence,s=u.ReferencedSOPInstanceUID,c=u.ReferencedFrameNumber,l={sopInstanceUid:s,frameIndex:c||1,complete:!0,finding:r?M(r.ConceptCodeSequence):void 0,findingSites:a.map((function(e){return M(e.ConceptCodeSequence)}))};l.finding&&(l.description=l.finding.CodeMeaning);var d=l.findingSites&&l.findingSites[0];return d&&(l.location=d[0]&&d[0].CodeMeaning||d.CodeMeaning),{defaultState:l,findingGroup:r,findingSiteGroups:a,NUMGroup:i,SCOORDGroup:o,ReferencedSOPSequence:u,ReferencedSOPInstanceUID:s,ReferencedFrameNumber:c}}},{key:"generateReport",value:function(e,t,n){var r=[],a=Object.keys(e)[0];if(!a)throw new Error("No measurements provided.");var i=t.get("generalSeriesModule",a),o=i.studyInstanceUID,u=i.seriesInstanceUID;Object.keys(e).forEach((function(n){var a=t.get("sopCommonModule",n),i=t.get("frameNumber",n),o=e[n],u=Object.keys(o),s={ReferencedSOPClassUID:a.sopClassUID,ReferencedSOPInstanceUID:a.sopInstanceUID};P.isMultiframeSOPClassUID(a.sopClassUID)&&(s.ReferencedFrameNumber=i);var c=[];u.forEach((function(e){var t=function(e,t,n){var r=t[e],a=G.CORNERSTONE_TOOL_CLASSES_BY_TOOL_TYPE[e];if(r&&r.data&&r.data.length&&a){var i=r.data.map((function(e){return function(e,t,n,r){var a=r.getTID300RepresentationArguments(e);return a.ReferencedSOPSequence=n,new r.TID300Representation(a)}(e,0,n,a)}));return new N(i)}}(e,o,s);t&&c.push(t)})),r=r.concat(c)}));var s=new A({TID1501MeasurementGroups:r},n),c=new Uint8Array(2);c[1]=1;var l={StudyInstanceUID:o,SeriesInstanceUID:u},d={FileMetaInformationVersion:{Value:[c.buffer],vr:"OB"},TransferSyntaxUID:{Value:["1.2.840.10008.1.2.1"],vr:"UI"},ImplementationClassUID:{Value:[q.uid()],vr:"UI"},ImplementationVersionName:{Value:["dcmjs"],vr:"SH"}};l._meta=d,l._vrMap={PixelData:"OW"};var f=new E([l]),p=s.contentItem(l);return f.dataset=Object.assign(f.dataset,p),f.dataset._meta=d,f}},{key:"generateToolState",value:function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if("1500"!==t.ContentTemplateSequence.TemplateIdentifier)throw new Error("This package can currently only interpret DICOM SR TID 1500");var r=C(t.ContentSequence).find(R("Imaging Measurements")),a=C(r.ContentSequence).filter(R("Measurement Group")),i={},o=e.CORNERSTONE_TOOL_CLASSES_BY_UTILITY_TYPE,u=[];return Object.keys(o).forEach((function(e){u.push(o[e]),i[e]=[]})),a.forEach((function(e){var r=C(e.ContentSequence).find((function(e){return"Tracking Identifier"===e.ConceptNameCodeSequence.CodeMeaning})).TextValue,a=n.getToolClass?n.getToolClass(e,t,u):u.find((function(e){return e.isValidCornerstoneTrackingIdentifier(r)}));if(a){var o=a.getMeasurementData(e);console.log("=== ".concat(a.toolType," ===")),console.log(o),i[a.toolType].push(o)}})),i}},{key:"registerTool",value:function(t){e.CORNERSTONE_TOOL_CLASSES_BY_UTILITY_TYPE[t.utilityToolType]=t,e.CORNERSTONE_TOOL_CLASSES_BY_TOOL_TYPE[t.toolType]=t,e.MEASUREMENT_BY_TOOLTYPE[t.toolType]=t.utilityToolType}}]),e}();G.MEASUREMENT_BY_TOOLTYPE={},G.CORNERSTONE_TOOL_CLASSES_BY_UTILITY_TYPE={},G.CORNERSTONE_TOOL_CLASSES_BY_TOOL_TYPE={};var L="cornerstoneTools@^4.0.0",F=r.hC.TID300.Length,j="Length",B=function(){function e(){g(this,e)}return m(e,null,[{key:"getMeasurementData",value:function(t){var n=G.getSetupMeasurementData(t),r=n.defaultState,a=n.NUMGroup,i=n.SCOORDGroup,o=d(d({},r),{},{length:a.MeasuredValueSequence.NumericValue,toolType:e.toolType,handles:{start:{},end:{},textBox:{hasMoved:!1,movesIndependently:!1,drawnIndependently:!0,allowedOutsideImage:!0,hasBoundingBox:!0}}}),u=S(i.GraphicData,4);return o.handles.start.x=u[0],o.handles.start.y=u[1],o.handles.end.x=u[2],o.handles.end.y=u[3],o}},{key:"getTID300RepresentationArguments",value:function(e){var t=e.handles,n=e.finding,r=e.findingSites;return{point1:t.start,point2:t.end,distance:e.length,trackingIdentifierTextValue:"cornerstoneTools@^4.0.0:Length",finding:n,findingSites:r||[]}}}]),e}();B.toolType=j,B.utilityToolType=j,B.TID300Representation=F,B.isValidCornerstoneTrackingIdentifier=function(e){if(!e.includes(":"))return!1;var t=S(e.split(":"),2),n=t[0],r=t[1];return n===L&&r===j},G.registerTool(B);var Y=r.hC.TID300.Polyline,z=function(){function e(){g(this,e)}return m(e,null,[{key:"getMeasurementData",value:function(t){for(var n=G.getSetupMeasurementData(t),r=n.defaultState,a=n.SCOORDGroup,i=n.NUMGroup,o=d(d({},r),{},{toolType:e.toolType,handles:{points:[],textBox:{active:!1,hasMoved:!1,movesIndependently:!1,drawnIndependently:!0,allowedOutsideImage:!0,hasBoundingBox:!0}},cachedStats:{area:i?i.MeasuredValueSequence.NumericValue:0},color:void 0,invalidated:!0}),u=a.GraphicData,s=0;sl?(d.push({x:f.x-c,y:f.y}),d.push({x:f.x+c,y:f.y}),d.push({x:f.x,y:f.y-l}),d.push({x:f.x,y:f.y+l})):(d.push({x:f.x,y:f.y-l}),d.push({x:f.x,y:f.y+l}),d.push({x:f.x-c,y:f.y}),d.push({x:f.x+c,y:f.y}));return{area:s,points:d,trackingIdentifierTextValue:"cornerstoneTools@^4.0.0:EllipticalRoi",finding:a,findingSites:i||[]}}}]),e}();Q.toolType=K,Q.utilityToolType=K,Q.TID300Representation=J,Q.isValidCornerstoneTrackingIdentifier=function(e){if(!e.includes(":"))return!1;var t=S(e.split(":"),2),n=t[0],r=t[1];return n===L&&r===K},G.registerTool(Q);var $=r.hC.TID300.Circle,Z="CircleRoi",ee=function(){function e(){g(this,e)}return m(e,null,[{key:"getMeasurementData",value:function(t){var n=G.getSetupMeasurementData(t),r=n.defaultState,a=n.NUMGroup,i=n.SCOORDGroup.GraphicData,o={x:i[0],y:i[1]},u={x:i[2],y:i[3]};return d(d({},r),{},{toolType:e.toolType,active:!1,cachedStats:{area:a?a.MeasuredValueSequence.NumericValue:0,radius:0,perimeter:0},handles:{end:d(d({},u),{},{highlight:!1,active:!1}),initialRotation:0,start:d(d({},o),{},{highlight:!1,active:!1}),textBox:{hasMoved:!1,movesIndependently:!1,drawnIndependently:!0,allowedOutsideImage:!0,hasBoundingBox:!0}},invalidated:!0,visible:!0})}},{key:"getTID300RepresentationArguments",value:function(e){var t=e.cachedStats,n=void 0===t?{}:t,r=e.handles,a=e.finding,i=e.findingSites,o=r.start,u=r.end,s=n.area,c=n.radius,l=2*Math.PI*c,d=[];d.push(o),d.push(u);return{area:s,perimeter:l,radius:c,points:d,trackingIdentifierTextValue:"cornerstoneTools@^4.0.0:CircleRoi",finding:a,findingSites:i||[]}}}]),e}();ee.toolType=Z,ee.utilityToolType=Z,ee.TID300Representation=$,ee.isValidCornerstoneTrackingIdentifier=function(e){if(!e.includes(":"))return!1;var t=S(e.split(":"),2),n=t[0],r=t[1];return n===L&&r===Z},G.registerTool(ee);var te=r.hC.TID300.Point,ne="ArrowAnnotate",re="CORNERSTONEFREETEXT",ae=function(){function e(){g(this,e)}return m(e,null,[{key:"getMeasurementData",value:function(t){var n=G.getSetupMeasurementData(t),r=n.defaultState,a=n.SCOORDGroup,i=n.findingGroup.ConceptCodeSequence.CodeMeaning,o=a.GraphicData;return d(d({},r),{},{toolType:e.toolType,active:!1,handles:{start:{x:o[0],y:o[1],highlight:!0,active:!1},end:{x:4==o.length?o[2]:o[0]+20,y:4==o.length?o[3]:o[1]+20,highlight:!0,active:!1},textBox:{hasMoved:!1,movesIndependently:!1,drawnIndependently:!0,allowedOutsideImage:!0,hasBoundingBox:!0}},invalidated:!0,text:i,visible:!0})}},{key:"getTID300RepresentationArguments",value:function(e){var t=[e.handles.start,e.handles.end],n=e.finding,r={points:t,trackingIdentifierTextValue:"cornerstoneTools@^4.0.0:ArrowAnnotate",findingSites:e.findingSites||[]};return n&&n.CodeValue===re||(n={CodeValue:re,CodingSchemeDesignator:"CST4",CodeMeaning:e.text}),r.finding=n,r}}]),e}();ae.toolType=ne,ae.utilityToolType=ne,ae.TID300Representation=te,ae.isValidCornerstoneTrackingIdentifier=function(e){if(!e.includes(":"))return!1;var t=S(e.split(":"),2),n=t[0],r=t[1];return n===L&&r===ne},G.registerTool(ae);var ie=r.hC.TID300.CobbAngle,oe="CobbAngle",ue=function(){function e(){g(this,e)}return m(e,null,[{key:"getMeasurementData",value:function(t){var n=G.getSetupMeasurementData(t),r=n.defaultState,a=n.NUMGroup,i=n.SCOORDGroup,o=d(d({},r),{},{rAngle:a.MeasuredValueSequence.NumericValue,toolType:e.toolType,handles:{start:{},end:{},start2:{highlight:!0,drawnIndependently:!0},end2:{highlight:!0,drawnIndependently:!0},textBox:{hasMoved:!1,movesIndependently:!1,drawnIndependently:!0,allowedOutsideImage:!0,hasBoundingBox:!0}}}),u=S(i.GraphicData,8);return o.handles.start.x=u[0],o.handles.start.y=u[1],o.handles.end.x=u[2],o.handles.end.y=u[3],o.handles.start2.x=u[4],o.handles.start2.y=u[5],o.handles.end2.x=u[6],o.handles.end2.y=u[7],o}},{key:"getTID300RepresentationArguments",value:function(e){var t=e.handles,n=e.finding,r=e.findingSites;return{point1:t.start,point2:t.end,point3:t.start2,point4:t.end2,rAngle:e.rAngle,trackingIdentifierTextValue:"cornerstoneTools@^4.0.0:CobbAngle",finding:n,findingSites:r||[]}}}]),e}();ue.toolType=oe,ue.utilityToolType=oe,ue.TID300Representation=ie,ue.isValidCornerstoneTrackingIdentifier=function(e){if(!e.includes(":"))return!1;var t=S(e.split(":"),2),n=t[0],r=t[1];return n===L&&r===oe},G.registerTool(ue);var se=r.hC.TID300.Angle,ce="Angle",le=function(){function e(){g(this,e)}return m(e,null,[{key:"getMeasurementData",value:function(t){var n=G.getSetupMeasurementData(t),r=n.defaultState,a=n.NUMGroup,i=n.SCOORDGroup,o=d(d({},r),{},{rAngle:a.MeasuredValueSequence.NumericValue,toolType:e.toolType,handles:{start:{},middle:{},end:{},textBox:{hasMoved:!1,movesIndependently:!1,drawnIndependently:!0,allowedOutsideImage:!0,hasBoundingBox:!0}}}),u=S(i.GraphicData,8);return o.handles.start.x=u[0],o.handles.start.y=u[1],o.handles.middle.x=u[2],o.handles.middle.y=u[3],o.handles.middle.x=u[4],o.handles.middle.y=u[5],o.handles.end.x=u[6],o.handles.end.y=u[7],o}},{key:"getTID300RepresentationArguments",value:function(e){var t=e.handles,n=e.finding,r=e.findingSites;return{point1:t.start,point2:t.middle,point3:t.middle,point4:t.end,rAngle:e.rAngle,trackingIdentifierTextValue:"cornerstoneTools@^4.0.0:Angle",finding:n,findingSites:r||[]}}}]),e}();le.toolType=ce,le.utilityToolType=ce,le.TID300Representation=se,le.isValidCornerstoneTrackingIdentifier=function(e){if(!e.includes(":"))return!1;var t=S(e.split(":"),2),n=t[0],r=t[1];return n===L&&r===ce},G.registerTool(le);var de=r.hC.TID300.Polyline,fe=function(){function e(){g(this,e)}return m(e,null,[{key:"getMeasurementData",value:function(t){var n=G.getSetupMeasurementData(t),r=n.defaultState,a=n.SCOORDGroup,i=n.NUMGroup,o=d(d({},r),{},{toolType:e.toolType,handles:{start:{},end:{},textBox:{active:!1,hasMoved:!1,movesIndependently:!1,drawnIndependently:!0,allowedOutsideImage:!0,hasBoundingBox:!0},initialRotation:0},cachedStats:{area:i?i.MeasuredValueSequence.NumericValue:0},color:void 0,invalidated:!0}),u=S(a.GraphicData,6);return o.handles.start.x=u[0],o.handles.start.y=u[1],u[2],u[3],o.handles.end.x=u[4],o.handles.end.y=u[5],o}},{key:"getTID300RepresentationArguments",value:function(e){var t=e.finding,n=e.findingSites,r=e.cachedStats,a=void 0===r?{}:r,i=e.handles,o=i.start,u=i.end;return{points:[o,{x:o.x,y:u.y},u,{x:u.x,y:o.y}],area:a.area,perimeter:a.perimeter,trackingIdentifierTextValue:"cornerstoneTools@^4.0.0:RectangleRoi",finding:t,findingSites:n||[]}}}]),e}();fe.toolType="RectangleRoi",fe.utilityToolType="RectangleRoi",fe.TID300Representation=de,fe.isValidCornerstoneTrackingIdentifier=function(e){if(!e.includes(":"))return!1;var t=S(e.split(":"),2),n=t[0],r=t[1];return n===L&&r===fe.toolType},G.registerTool(fe);var pe=r.hC.orientation,ge=pe.rotateDirectionCosinesInPlane,he=pe.flipImageOrientationPatient,me=pe.flipMatrix2D,ve=pe.rotateMatrix902D,Se=r.hC.datasetToBlob,ye=r.hC.BitArray,Ie=r.hC.DicomMessage,Te=r.hC.DicomMetaDictionary,De=r.oq.Normalizer,Oe=r.U7.Segmentation,Ce={generateSegmentation:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{includeSliceSpacing:!0},r=t.toolState,a=t.segments,i=e[0],o={x:i.columns,y:i.rows,z:e.length};if(o.xy=o.x*o.y,!be(s,a))throw new Error("No segments to export!");for(var u=i.imageId.includes("?frame"),s=function(e,t,n){var r=[];if(t){var a=e[0].data.byteArray.buffer,i=Ie.readFile(a),o=Te.naturalizeDataset(i.dict);o._meta=Te.namifyDataset(i.meta),r.push(o)}else for(var u=0;u2&&void 0!==arguments[2]?arguments[2]:{},r=Object.assign({},Je,n),a=Array.isArray(t)?t:[t],i=0,o=[],u=function(){for(var e=a[s],t=e.labelmaps2D,n=e.metadata,r=[],u=1;u1))return!0}else console.warn("Individual SEG frames are out of plane with respect to the first SEG frame, this is not yet supported, skipping this frame.")}}catch(e){O.e(e)}finally{O.f()}return!1}function tt(e,t,n,r,a,i,u,c,l,d,f,p){for(var g=a.SharedFunctionalGroupsSequence,h=a.PerFrameFunctionalGroupsSequence,m=a.Rows,v=a.Columns,S=g.PlaneOrientationSequence?g.PlaneOrientationSequence.ImageOrientationPatient:void 0,y=v*m,I=y*i.length*d.BYTES_PER_ELEMENT,T=1,D=0,O=n[D].slice(0),C=s()(t[D]),R=a.SegmentSequence.length,b=1;b<=R;++b){for(var x=function(f){var g=h[f],R=nt(a,f);if(void 0===R)throw new Error("Could not retrieve the segment index. Aborting segmentation loading.");if(R!==b)return w=f,"continue";var x=S||g.PlaneOrientationSequence.ImageOrientationPatient,M=lt(r,f*y,y),E=ut(o()(M,[m,v]),x,u,l);if(!E)throw new Error("Individual SEG frames are out of plane with respect to the first SEG frame. This is not yet supported. Aborting segmentation loading.");var P=Ze(a,f,i,c,l,p);if(!P)return console.warn("Image not present in stack, can't import frame : "+f+"."),w=f,"continue";var A=c.get("instance",P);if(m!==A.Rows||v!==A.Columns)throw new Error("Individual SEG frames have different geometry dimensions (Rows and Columns) respect to the source image reference frame. This is not yet supported. Aborting segmentation loading. ");for(var N=i.findIndex((function(e){return e===P})),q=y*N*d.BYTES_PER_ELEMENT,_=new d(O,q,y),U=E.data,V=!1,k=0,G=E.data.length;k=T&&(n[D]=new ArrayBuffer(I),t[D]=[],T++),O=n[D].slice(0),C=s()(t[D]),f=0;break}_[k]=R,V=!0}V&&(C[N]||(C[N]=[]),C[N].push(R),e[N]||(e[N]=[]),e[N].push(R)),w=f},w=0,M=h.length;wr)throw new Error("Offset and length out of bounds");var a=0,i=t;for(;i>=e[a].length;)i-=e[a].length,a++;var o=a,u=i+n;for(;u>e[o].length;)u-=e[o].length,o++;return{start:{chunkIndex:a,offset:i},end:{chunkIndex:o,offset:u}}}(e,t,n);if(r.start.chunkIndex===r.end.chunkIndex)return new Uint8Array(e[r.start.chunkIndex].buffer,r.start.offset,n);for(var a=new Uint8Array(n),i=0,o=r.start.chunkIndex;o<=r.end.chunkIndex;o++){var u=o===r.start.chunkIndex?r.start.offset:0,s=o===r.end.chunkIndex?r.end.offset:e[o].length;a.set(new Uint8Array(e[o].buffer,u,s-u),i),i+=s-u}return a}function dt(e,t){for(var n=0,r=0,a=0,i=0,o=0,u=Object.entries(e);o2&&void 0!==arguments[2]?arguments[2]:{},r=e[0].imageId.includes("?frame");return Ke(function(e,t,n){var r=[];if(t){var a=e[0].data.byteArray.buffer,i=je.readFile(a),o=Be.naturalizeDataset(i.dict);o._meta=Be.namifyDataset(i.meta),r.push(o)}else for(var u=0;u2&&void 0!==arguments[2]?arguments[2]:{includeSliceSpacing:!0},r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:4;if(4===r)return ft.generateSegmentation(e,t,n);if(3===r)return Ce.generateSegmentation(e,t,n);console.warn("No generateSegmentation adapater for cornerstone version ".concat(r,", exiting."))},generateToolState:function(e,t,n){var r=arguments.length>3&&void 0!==arguments[3]&&arguments[3],a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:.001,i=arguments.length>5&&void 0!==arguments[5]?arguments[5]:4;if(4===i)return ft.generateToolState(e,t,n,r,a);if(3===i)return Ce.generateToolState(e,t,n);console.warn("No generateToolState adapater for cornerstone version ".concat(i,", exiting."))},fillSegmentation:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{includeSliceSpacing:!0},r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:4;if(4===r)return ft.fillSegmentation(e,t,n);console.warn("No generateSegmentation adapater for cornerstone version ".concat(r,", exiting."))}}},ht=function(){return ht=Object.assign||function(e){for(var t,n=1,r=arguments.length;n1||Dt.isMultiframeSOPClassUID(d))&&(v.ReferencedFrameNumber=g);var S=[];m.forEach((function(e){var t=Et(e,h,v,r);t&&S.push(t)})),i=i.concat(S)}));var c=new Ot({TID1501MeasurementGroups:i},a),l=new Tt(u,a),d=c.contentItem(u,ht(ht({},a),{sopInstanceUIDsToSeriesInstanceUIDMap:o}));return l.dataset=Object.assign(l.dataset,d),l.dataset._meta=s,l},e.generateToolState=function(t,n,r,a,i){if("1500"!==t.ContentTemplateSequence.TemplateIdentifier)throw new Error("This package can currently only interpret DICOM SR TID 1500");var o=C(t.ContentSequence).find(R("Imaging Measurements")),u=C(o.ContentSequence).filter(R("Measurement Group")),s={},c=e.CORNERSTONE_TOOL_CLASSES_BY_UTILITY_TYPE,l=[];return Object.keys(c).forEach((function(e){l.push(c[e]),s[e]=[]})),u.forEach((function(e){var o;try{var u=C(e.ContentSequence).find((function(e){return"Tracking Identifier"===e.ConceptNameCodeSequence.CodeMeaning})).TextValue,c=(null===(o=null==i?void 0:i.getToolClass)||void 0===o?void 0:o.call(i,e,t,l))||l.find((function(e){return e.isValidCornerstoneTrackingIdentifier(u)}));if(c){var d=c.getMeasurementData(e,n,r,a);console.log("=== ".concat(c.toolType," ===")),console.log(d),s[c.toolType].push(d)}}catch(t){console.warn("Unable to generate tool state for",e,t)}})),s},e.registerTool=function(t){e.CORNERSTONE_TOOL_CLASSES_BY_UTILITY_TYPE[t.utilityToolType]=t,e.CORNERSTONE_TOOL_CLASSES_BY_TOOL_TYPE[t.toolType]=t,e.MEASUREMENT_BY_TOOLTYPE[t.toolType]=t.utilityToolType},e.CORNERSTONE_3D_TAG=vt,e.MEASUREMENT_BY_TOOLTYPE={},e.CORNERSTONE_TOOL_CLASSES_BY_UTILITY_TYPE={},e.CORNERSTONE_TOOL_CLASSES_BY_TOOL_TYPE={},e.generateDerivationSourceDataset=function(t){var n=e.generateDatasetMeta();return ht(ht({},t),{_meta:n,_vrMap:{PixelData:"OW"}})},e}(),At=r.hC.TID300.Point,Nt="ArrowAnnotate",qt="".concat(vt,":").concat(Nt),_t=St.codeValues,Ut=St.CodingSchemeDesignator,Vt=function(){function e(){g(this,e)}return m(e,null,[{key:"getMeasurementData",value:function(t,n,r,a){for(var i=Pt.getSetupMeasurementData(t,n,a,e.toolType),o=i.defaultState,u=i.SCOORDGroup,s=i.ReferencedFrameNumber,c=o.annotation.metadata.referencedImageId,l=o.annotation.metadata.label,d=u.GraphicData,f=[],p=0;pMath.sqrt(Math.pow(v[0][0]-v[1][0],2)+Math.pow(v[0][1]-v[1][1],2)+Math.pow(v[0][2]-v[1][2],2))?(l=m,d=v):(l=v,d=m);var S=t(c,l[0]),y=t(c,l[1]),I=t(c,d[0]),T=t(c,d[1]);return{longAxis:{point1:{x:S[0],y:S[1]},point2:{x:y[0],y:y[1]}},shortAxis:{point1:{x:I[0],y:I[1]},point2:{x:T[0],y:T[1]}},longAxisLength:p,shortAxisLength:g,trackingIdentifierTextValue:Lt,finding:r,findingSites:a||[]}},e.toolType=Gt,e.utilityToolType=Gt,e.TID300Representation=kt,e.isValidCornerstoneTrackingIdentifier=function(e){if(!e.includes(":"))return!1;var t=e.split(":"),n=t[0],r=t[1];return n===vt&&r===Gt},e}();Pt.registerTool(Ft);var jt=r.hC.TID300.CobbAngle,Bt="Angle",Yt="".concat(vt,":").concat(Bt),zt=function(){function e(){}return e.getMeasurementData=function(t,n,r,a){for(var i,o=Pt.getSetupMeasurementData(t,n,a,e.toolType),u=o.defaultState,s=o.NUMGroup,c=o.SCOORDGroup,l=o.ReferencedFrameNumber,d=u.annotation.metadata.referencedImageId,f=c.GraphicData,p=[],g=0;gMath.abs(a[0]-i[0])?(h.push({x:n[0],y:n[1]}),h.push({x:r[0],y:r[1]}),h.push({x:a[0],y:a[1]}),h.push({x:i[0],y:i[1]})):(h.push({x:a[0],y:a[1]}),h.push({x:i[0],y:i[1]}),h.push({x:n[0],y:n[1]}),h.push({x:r[0],y:r[1]})),{area:(d["imageId:".concat(g)]||{}).area,points:h,trackingIdentifierTextValue:this.trackingIdentifierTextValue,finding:u,findingSites:s||[]}},e.trackingIdentifierTextValue="".concat(vt,":").concat(tn),e.toolType=tn,e.utilityToolType=tn,e.TID300Representation=en,e.isValidCornerstoneTrackingIdentifier=Kt,e}();Pt.registerTool(rn);var an=r.hC.TID300.Polyline,on="RectangleROI",un="".concat(vt,":").concat(on),sn=function(){function e(){}return e.getMeasurementData=function(t,n,r,a){for(var i,o=Pt.getSetupMeasurementData(t,n,a,e.toolType),u=o.defaultState,s=o.NUMGroup,c=o.SCOORDGroup,l=o.ReferencedFrameNumber,d=u.annotation.metadata.referencedImageId,f=c.GraphicData,p=[],g=0;g=0||(g=d.length,d.push(p)),xn(u,f,g)}var h=[];return u.forEach((function(e){e.a!=e.b&&h.push(e)})),{points:d,lines:h}}function Mn(e,t,n){var r=-1;if(t.forEach((function(t,n){r>=0||t.a==e.b&&(r=n)})),r>=0){var a=t[r];return t.splice(r,1),n.push(a.b),n[0]==a.b?{remainingLines:t,contourPoints:n,type:"CLOSED_PLANAR"}:Mn(a,t,n)}return{remainingLines:t,contourPoints:n,type:"OPEN_PLANAR"}}function En(e){if(0==e.length)return[];var t=[],n=e.shift();t.push(n.a),t.push(n.b);var r=Mn(n,e,t);if(0==r.remainingLines.length)return[{type:r.type,contourPoints:r.contourPoints}];var a=En(r.remainingLines);return a.push({type:r.type,contourPoints:r.contourPoints}),a}function Pn(e){var t=e.segmentations,n=e.cornerstoneCache,r=e.cornerstoneToolsEnums,a=e.vtkUtils,i=r.SegmentationRepresentations.Labelmap,o=t.representationData,u=t.segments,s=o[i].volumeId,c=n.getVolume(s);if(c){var l=c.dimensions[2],d=n.getVolume(c.referencedVolumeId);if(d){for(var f=c.imageData.getPointData().getScalars().getData(),p=c.dimensions[0]*c.dimensions[1],g=0;g1&&void 0!==arguments[1]?arguments[1]:3;switch(t){case 1:return Math.abs(e);case 2:return Math.sqrt(e[0]*e[0]+e[1]*e[1]);case 3:return Math.sqrt(e[0]*e[0]+e[1]*e[1]+e[2]*e[2]);default:for(var n=0,r=0;r{"use strict";e.exports=function(e){for(var t=new Array(e),n=0;n{e.exports=function(e){return null!=e&&null!=e.constructor&&"function"==typeof e.constructor.isBuffer&&e.constructor.isBuffer(e)}},87513:(e,t,n)=>{var r=n(27318),a=n(8516),i="undefined"!=typeof Float64Array;function o(e,t){return e[0]-t[0]}function u(){var e,t=this.stride,n=new Array(t.length);for(e=0;eMath.abs(this.stride[1]))?[1,0]:[0,1]}})"):3===t&&i.push("var s0=Math.abs(this.stride[0]),s1=Math.abs(this.stride[1]),s2=Math.abs(this.stride[2]);if(s0>s1){if(s1>s2){return [2,1,0];}else if(s0>s2){return [1,2,0];}else{return [1,0,2];}}else if(s0>s2){return [2,0,1];}else if(s2>s1){return [0,1,2];}else{return [0,2,1];}}})")):i.push("ORDER})")),i.push("proto.set=function "+n+"_set("+s.join(",")+",v){"),a?i.push("return this.data.set("+l+",v)}"):i.push("return this.data["+l+"]=v}"),i.push("proto.get=function "+n+"_get("+s.join(",")+"){"),a?i.push("return this.data.get("+l+")}"):i.push("return this.data["+l+"]}"),i.push("proto.index=function "+n+"_index(",s.join(),"){return "+l+"}"),i.push("proto.hi=function "+n+"_hi("+s.join(",")+"){return new "+n+"(this.data,"+o.map((function(e){return["(typeof i",e,"!=='number'||i",e,"<0)?this.shape[",e,"]:i",e,"|0"].join("")})).join(",")+","+o.map((function(e){return"this.stride["+e+"]"})).join(",")+",this.offset)}");var p=o.map((function(e){return"a"+e+"=this.shape["+e+"]"})),g=o.map((function(e){return"c"+e+"=this.stride["+e+"]"}));i.push("proto.lo=function "+n+"_lo("+s.join(",")+"){var b=this.offset,d=0,"+p.join(",")+","+g.join(","));for(var h=0;h=0){d=i"+h+"|0;b+=c"+h+"*d;a"+h+"-=d}");i.push("return new "+n+"(this.data,"+o.map((function(e){return"a"+e})).join(",")+","+o.map((function(e){return"c"+e})).join(",")+",b)}"),i.push("proto.step=function "+n+"_step("+s.join(",")+"){var "+o.map((function(e){return"a"+e+"=this.shape["+e+"]"})).join(",")+","+o.map((function(e){return"b"+e+"=this.stride["+e+"]"})).join(",")+",c=this.offset,d=0,ceil=Math.ceil");for(h=0;h=0){c=(c+this.stride["+h+"]*i"+h+")|0}else{a.push(this.shape["+h+"]);b.push(this.stride["+h+"])}");return i.push("var ctor=CTOR_LIST[a.length+1];return ctor(this.data,a,b,c)}"),i.push("return function construct_"+n+"(data,shape,stride,offset){return new "+n+"(data,"+o.map((function(e){return"shape["+e+"]"})).join(",")+","+o.map((function(e){return"stride["+e+"]"})).join(",")+",offset)}"),new Function("CTOR_LIST","ORDER",i.join("\n"))(c[e],u)}var c={float32:[],float64:[],int8:[],int16:[],int32:[],uint8:[],uint16:[],uint32:[],array:[],uint8_clamped:[],bigint64:[],biguint64:[],buffer:[],generic:[]};e.exports=function(e,t,n,r){if(void 0===e)return(0,c.array[0])([]);"number"==typeof e&&(e=[e]),void 0===t&&(t=[e.length]);var o=t.length;if(void 0===n){n=new Array(o);for(var u=o-1,l=1;u>=0;--u)n[u]=l,l*=t[u]}if(void 0===r){r=0;for(u=0;u + * @license MIT + */ diff --git a/resources/202.bundle.358aa5cd5419f9459a04.js.map b/resources/202.bundle.358aa5cd5419f9459a04.js.map new file mode 100644 index 0000000..66bb724 --- /dev/null +++ b/resources/202.bundle.358aa5cd5419f9459a04.js.map @@ -0,0 +1 @@ +{"version":3,"file":"202.bundle.358aa5cd5419f9459a04.js","mappings":"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","sources":["webpack:///../../../node_modules/@cornerstonejs/adapters/src/adapters/helpers/toArray.ts","webpack:///../../../node_modules/@cornerstonejs/adapters/src/adapters/helpers/codeMeaningEquals.ts","webpack:///../../../node_modules/@cornerstonejs/adapters/src/adapters/helpers/downloadDICOMData.ts","webpack:///../../../node_modules/@cornerstonejs/adapters/src/adapters/helpers/graphicTypeEquals.ts","webpack:///../../../node_modules/@cornerstonejs/adapters/src/adapters/Cornerstone/MeasurementReport.js","webpack:///../../../node_modules/@cornerstonejs/adapters/src/adapters/Cornerstone/cornerstone4Tag.js","webpack:///../../../node_modules/@cornerstonejs/adapters/src/adapters/Cornerstone/Length.js","webpack:///../../../node_modules/@cornerstonejs/adapters/src/adapters/Cornerstone/FreehandRoi.js","webpack:///../../../node_modules/@cornerstonejs/adapters/src/adapters/Cornerstone/Bidirectional.js","webpack:///../../../node_modules/@cornerstonejs/adapters/src/adapters/Cornerstone/EllipticalRoi.js","webpack:///../../../node_modules/@cornerstonejs/adapters/src/adapters/Cornerstone/CircleRoi.js","webpack:///../../../node_modules/@cornerstonejs/adapters/src/adapters/Cornerstone/ArrowAnnotate.js","webpack:///../../../node_modules/@cornerstonejs/adapters/src/adapters/Cornerstone/CobbAngle.js","webpack:///../../../node_modules/@cornerstonejs/adapters/src/adapters/Cornerstone/Angle.js","webpack:///../../../node_modules/@cornerstonejs/adapters/src/adapters/Cornerstone/RectangleRoi.js","webpack:///../../../node_modules/@cornerstonejs/adapters/src/adapters/Cornerstone/Segmentation_3X.js","webpack:///../../../node_modules/@cornerstonejs/adapters/src/adapters/enums/Events.ts","webpack:///../../../node_modules/@cornerstonejs/adapters/src/adapters/Cornerstone/Segmentation_4X.js","webpack:///../../../node_modules/@cornerstonejs/adapters/src/adapters/Cornerstone/index.ts","webpack:///../../../node_modules/@cornerstonejs/adapters/src/adapters/Cornerstone/Segmentation.js","webpack:///../../../node_modules/node_modules/tslib/tslib.es6.js","webpack:///../../../node_modules/@cornerstonejs/adapters/src/adapters/Cornerstone3D/cornerstone3DTag.js","webpack:///../../../node_modules/@cornerstonejs/adapters/src/adapters/Cornerstone3D/CodingScheme.js","webpack:///../../../node_modules/@cornerstonejs/adapters/src/adapters/Cornerstone3D/MeasurementReport.ts","webpack:///../../../node_modules/@cornerstonejs/adapters/src/adapters/Cornerstone3D/ArrowAnnotate.js","webpack:///../../../node_modules/@cornerstonejs/adapters/src/adapters/Cornerstone3D/Bidirectional.ts","webpack:///../../../node_modules/@cornerstonejs/adapters/src/adapters/Cornerstone3D/Angle.ts","webpack:///../../../node_modules/@cornerstonejs/adapters/src/adapters/Cornerstone3D/CobbAngle.ts","webpack:///../../../node_modules/@cornerstonejs/adapters/src/adapters/Cornerstone3D/isValidCornerstoneTrackingIdentifier.ts","webpack:///../../../node_modules/@cornerstonejs/adapters/src/adapters/Cornerstone3D/CircleROI.ts","webpack:///../../../node_modules/@cornerstonejs/adapters/src/adapters/Cornerstone3D/EllipticalROI.ts","webpack:///../../../node_modules/@cornerstonejs/adapters/src/adapters/Cornerstone3D/RectangleROI.ts","webpack:///../../../node_modules/@cornerstonejs/adapters/src/adapters/Cornerstone3D/Length.js","webpack:///../../../node_modules/@cornerstonejs/adapters/src/adapters/Cornerstone3D/PlanarFreehandROI.ts","webpack:///../../../node_modules/@cornerstonejs/adapters/src/adapters/Cornerstone3D/Probe.js","webpack:///../../../node_modules/@cornerstonejs/adapters/src/adapters/Cornerstone3D/Segmentation/generateSegmentation.ts","webpack:///../../../node_modules/@cornerstonejs/adapters/src/adapters/Cornerstone3D/Segmentation/generateToolState.ts","webpack:///../../../node_modules/@cornerstonejs/adapters/src/adapters/Cornerstone3D/Segmentation/generateLabelMaps2DFrom3D.ts","webpack:///../../../node_modules/@cornerstonejs/adapters/src/adapters/Cornerstone3D/RTStruct/utilities/mergePoints.js","webpack:///../../../node_modules/@cornerstonejs/adapters/src/adapters/Cornerstone3D/RTStruct/utilities/contourFinder.js","webpack:///../../../node_modules/@cornerstonejs/adapters/src/adapters/Cornerstone3D/RTStruct/utilities/generateContourSetsFromLabelmap.js","webpack:///../../../node_modules/@cornerstonejs/adapters/src/adapters/Cornerstone3D/RTStruct/utilities/RectangleROIStartEndThreshold.js","webpack:///../../../node_modules/@cornerstonejs/adapters/src/adapters/Cornerstone3D/RTStruct/utilities/AnnotationToPointData.js","webpack:///../../../node_modules/@cornerstonejs/adapters/src/adapters/Cornerstone3D/RTStruct/utilities/getReferencedFrameOfReferenceSequence.js","webpack:///../../../node_modules/@cornerstonejs/adapters/src/adapters/Cornerstone3D/RTStruct/utilities/getReferencedSeriesSequence.js","webpack:///../../../node_modules/@cornerstonejs/adapters/src/adapters/Cornerstone3D/RTStruct/utilities/getStructureSetModule.js","webpack:///../../../node_modules/@cornerstonejs/adapters/src/adapters/Cornerstone3D/RTStruct/RTSS.ts","webpack:///../../../node_modules/@cornerstonejs/adapters/src/adapters/Cornerstone3D/RTStruct/utilities/getPatientModule.js","webpack:///../../../node_modules/@cornerstonejs/adapters/src/adapters/Cornerstone3D/RTStruct/utilities/getRTSeriesModule.js","webpack:///../../../node_modules/@cornerstonejs/adapters/src/adapters/Cornerstone3D/RTStruct/utilities/getRTROIObservationsSequence.js","webpack:///../../../node_modules/@cornerstonejs/adapters/src/adapters/Cornerstone3D/index.ts","webpack:///../../../node_modules/@cornerstonejs/adapters/src/adapters/VTKjs/Segmentation.js","webpack:///../../../node_modules/@cornerstonejs/adapters/src/adapters/index.ts","webpack:///../../../node_modules/@cornerstonejs/adapters/src/adapters/VTKjs/index.ts","webpack:///../../../node_modules/iota-array/iota.js","webpack:///../../../node_modules/is-buffer/index.js","webpack:///../../../node_modules/ndarray/ndarray.js"],"sourcesContent":["const toArray = x => (Array.isArray(x) ? x : [x]);\n\nexport { toArray };\n","/**\n * Returns a function that checks if a given content item's ConceptNameCodeSequence.CodeMeaning\n * matches the provided codeMeaningName.\n * @param codeMeaningName - The CodeMeaning to match against.\n * @returns A function that takes a content item and returns a boolean indicating whether the\n * content item's CodeMeaning matches the provided codeMeaningName.\n */\nconst codeMeaningEquals = (codeMeaningName: string) => {\n return (contentItem: any) => {\n return (\n contentItem.ConceptNameCodeSequence.CodeMeaning === codeMeaningName\n );\n };\n};\n\nexport { codeMeaningEquals };\n","import { data } from \"dcmjs\";\nimport { Buffer } from \"buffer\";\nconst { datasetToDict } = data;\n\ninterface DicomDataset {\n _meta?: any;\n // other properties\n}\n\n/**\n * Trigger file download from an array buffer\n * @param bufferOrDataset - ArrayBuffer or DicomDataset\n * @param filename - name of the file to download\n */\nexport function downloadDICOMData(\n bufferOrDataset: ArrayBuffer | DicomDataset,\n filename: string\n) {\n let blob;\n if (bufferOrDataset instanceof ArrayBuffer) {\n blob = new Blob([bufferOrDataset], { type: \"application/dicom\" });\n } else {\n if (!bufferOrDataset._meta) {\n throw new Error(\"Dataset must have a _meta property\");\n }\n\n const buffer = Buffer.from(datasetToDict(bufferOrDataset).write());\n blob = new Blob([buffer], { type: \"application/dicom\" });\n }\n\n const link = document.createElement(\"a\");\n link.href = window.URL.createObjectURL(blob);\n link.download = filename;\n link.click();\n}\n","/**\n * Checks if a given content item's GraphicType property matches a specified value.\n * @param {string} graphicType - The value to compare the content item's GraphicType property to.\n * @returns {function} A function that takes a content item and returns a boolean indicating whether its GraphicType property matches the specified value.\n */\nconst graphicTypeEquals = graphicType => {\n return contentItem => {\n return contentItem && contentItem.GraphicType === graphicType;\n };\n};\n\nexport { graphicTypeEquals };\n","import { normalizers, data, utilities, derivations } from \"dcmjs\";\n\nimport { toArray, codeMeaningEquals } from \"../helpers\";\n\nconst { TID1500, addAccessors } = utilities;\n\nconst { StructuredReport } = derivations;\n\nconst { Normalizer } = normalizers;\n\nconst { TID1500MeasurementReport, TID1501MeasurementGroup } = TID1500;\n\nconst { DicomMetaDictionary } = data;\n\nconst FINDING = { CodingSchemeDesignator: \"DCM\", CodeValue: \"121071\" };\nconst FINDING_SITE = { CodingSchemeDesignator: \"SCT\", CodeValue: \"363698007\" };\nconst FINDING_SITE_OLD = { CodingSchemeDesignator: \"SRT\", CodeValue: \"G-C0E3\" };\n\nconst codeValueMatch = (group, code, oldCode) => {\n const { ConceptNameCodeSequence } = group;\n if (!ConceptNameCodeSequence) return;\n const { CodingSchemeDesignator, CodeValue } = ConceptNameCodeSequence;\n return (\n (CodingSchemeDesignator == code.CodingSchemeDesignator &&\n CodeValue == code.CodeValue) ||\n (oldCode &&\n CodingSchemeDesignator == oldCode.CodingSchemeDesignator &&\n CodeValue == oldCode.CodeValue)\n );\n};\n\nfunction getTID300ContentItem(\n tool,\n toolType,\n ReferencedSOPSequence,\n toolClass\n) {\n const args = toolClass.getTID300RepresentationArguments(tool);\n args.ReferencedSOPSequence = ReferencedSOPSequence;\n\n const TID300Measurement = new toolClass.TID300Representation(args);\n\n return TID300Measurement;\n}\n\nfunction getMeasurementGroup(toolType, toolData, ReferencedSOPSequence) {\n const toolTypeData = toolData[toolType];\n const toolClass =\n MeasurementReport.CORNERSTONE_TOOL_CLASSES_BY_TOOL_TYPE[toolType];\n if (\n !toolTypeData ||\n !toolTypeData.data ||\n !toolTypeData.data.length ||\n !toolClass\n ) {\n return;\n }\n\n // Loop through the array of tool instances\n // for this tool\n const Measurements = toolTypeData.data.map(tool => {\n return getTID300ContentItem(\n tool,\n toolType,\n ReferencedSOPSequence,\n toolClass\n );\n });\n\n return new TID1501MeasurementGroup(Measurements);\n}\n\nexport default class MeasurementReport {\n static getSetupMeasurementData(MeasurementGroup) {\n const { ContentSequence } = MeasurementGroup;\n\n const contentSequenceArr = toArray(ContentSequence);\n const findingGroup = contentSequenceArr.find(group =>\n codeValueMatch(group, FINDING)\n );\n const findingSiteGroups =\n contentSequenceArr.filter(group =>\n codeValueMatch(group, FINDING_SITE, FINDING_SITE_OLD)\n ) || [];\n const NUMGroup = contentSequenceArr.find(\n group => group.ValueType === \"NUM\"\n );\n const SCOORDGroup = toArray(NUMGroup.ContentSequence).find(\n group => group.ValueType === \"SCOORD\"\n );\n const { ReferencedSOPSequence } = SCOORDGroup.ContentSequence;\n const { ReferencedSOPInstanceUID, ReferencedFrameNumber } =\n ReferencedSOPSequence;\n\n const defaultState = {\n sopInstanceUid: ReferencedSOPInstanceUID,\n frameIndex: ReferencedFrameNumber || 1,\n complete: true,\n finding: findingGroup\n ? addAccessors(findingGroup.ConceptCodeSequence)\n : undefined,\n findingSites: findingSiteGroups.map(fsg => {\n return addAccessors(fsg.ConceptCodeSequence);\n })\n };\n if (defaultState.finding) {\n defaultState.description = defaultState.finding.CodeMeaning;\n }\n const findingSite =\n defaultState.findingSites && defaultState.findingSites[0];\n if (findingSite) {\n defaultState.location =\n (findingSite[0] && findingSite[0].CodeMeaning) ||\n findingSite.CodeMeaning;\n }\n return {\n defaultState,\n findingGroup,\n findingSiteGroups,\n NUMGroup,\n SCOORDGroup,\n ReferencedSOPSequence,\n ReferencedSOPInstanceUID,\n ReferencedFrameNumber\n };\n }\n\n static generateReport(toolState, metadataProvider, options) {\n // ToolState for array of imageIDs to a Report\n // Assume Cornerstone metadata provider has access to Study / Series / Sop Instance UID\n\n let allMeasurementGroups = [];\n const firstImageId = Object.keys(toolState)[0];\n if (!firstImageId) {\n throw new Error(\"No measurements provided.\");\n }\n\n /* Patient ID\n Warning - Missing attribute or value that would be needed to build DICOMDIR - Patient ID\n Warning - Missing attribute or value that would be needed to build DICOMDIR - Study Date\n Warning - Missing attribute or value that would be needed to build DICOMDIR - Study Time\n Warning - Missing attribute or value that would be needed to build DICOMDIR - Study ID\n */\n const generalSeriesModule = metadataProvider.get(\n \"generalSeriesModule\",\n firstImageId\n );\n\n //const sopCommonModule = metadataProvider.get('sopCommonModule', firstImageId);\n\n // NOTE: We are getting the Series and Study UIDs from the first imageId of the toolState\n // which means that if the toolState is for multiple series, the report will have the incorrect\n // SeriesInstanceUIDs\n const { studyInstanceUID, seriesInstanceUID } = generalSeriesModule;\n\n // Loop through each image in the toolData\n Object.keys(toolState).forEach(imageId => {\n const sopCommonModule = metadataProvider.get(\n \"sopCommonModule\",\n imageId\n );\n const frameNumber = metadataProvider.get(\"frameNumber\", imageId);\n const toolData = toolState[imageId];\n const toolTypes = Object.keys(toolData);\n\n const ReferencedSOPSequence = {\n ReferencedSOPClassUID: sopCommonModule.sopClassUID,\n ReferencedSOPInstanceUID: sopCommonModule.sopInstanceUID\n };\n\n if (\n Normalizer.isMultiframeSOPClassUID(sopCommonModule.sopClassUID)\n ) {\n ReferencedSOPSequence.ReferencedFrameNumber = frameNumber;\n }\n\n // Loop through each tool type for the image\n const measurementGroups = [];\n\n toolTypes.forEach(toolType => {\n const group = getMeasurementGroup(\n toolType,\n toolData,\n ReferencedSOPSequence\n );\n if (group) {\n measurementGroups.push(group);\n }\n });\n\n allMeasurementGroups =\n allMeasurementGroups.concat(measurementGroups);\n });\n\n const MeasurementReport = new TID1500MeasurementReport(\n { TID1501MeasurementGroups: allMeasurementGroups },\n options\n );\n\n // TODO: what is the correct metaheader\n // http://dicom.nema.org/medical/Dicom/current/output/chtml/part10/chapter_7.html\n // TODO: move meta creation to happen in derivations.js\n const fileMetaInformationVersionArray = new Uint8Array(2);\n fileMetaInformationVersionArray[1] = 1;\n\n const derivationSourceDataset = {\n StudyInstanceUID: studyInstanceUID,\n SeriesInstanceUID: seriesInstanceUID\n //SOPInstanceUID: sopInstanceUID, // TODO: Necessary?\n //SOPClassUID: sopClassUID,\n };\n\n const _meta = {\n FileMetaInformationVersion: {\n Value: [fileMetaInformationVersionArray.buffer],\n vr: \"OB\"\n },\n //MediaStorageSOPClassUID\n //MediaStorageSOPInstanceUID: sopCommonModule.sopInstanceUID,\n TransferSyntaxUID: {\n Value: [\"1.2.840.10008.1.2.1\"],\n vr: \"UI\"\n },\n ImplementationClassUID: {\n Value: [DicomMetaDictionary.uid()], // TODO: could be git hash or other valid id\n vr: \"UI\"\n },\n ImplementationVersionName: {\n Value: [\"dcmjs\"],\n vr: \"SH\"\n }\n };\n\n const _vrMap = {\n PixelData: \"OW\"\n };\n\n derivationSourceDataset._meta = _meta;\n derivationSourceDataset._vrMap = _vrMap;\n\n const report = new StructuredReport([derivationSourceDataset]);\n\n const contentItem = MeasurementReport.contentItem(\n derivationSourceDataset\n );\n\n // Merge the derived dataset with the content from the Measurement Report\n report.dataset = Object.assign(report.dataset, contentItem);\n report.dataset._meta = _meta;\n\n return report;\n }\n\n /**\n * Generate Cornerstone tool state from dataset\n * @param {object} dataset dataset\n * @param {object} hooks\n * @param {function} hooks.getToolClass Function to map dataset to a tool class\n * @returns\n */\n static generateToolState(dataset, hooks = {}) {\n // For now, bail out if the dataset is not a TID1500 SR with length measurements\n if (dataset.ContentTemplateSequence.TemplateIdentifier !== \"1500\") {\n throw new Error(\n \"This package can currently only interpret DICOM SR TID 1500\"\n );\n }\n\n const REPORT = \"Imaging Measurements\";\n const GROUP = \"Measurement Group\";\n const TRACKING_IDENTIFIER = \"Tracking Identifier\";\n\n // Identify the Imaging Measurements\n const imagingMeasurementContent = toArray(dataset.ContentSequence).find(\n codeMeaningEquals(REPORT)\n );\n\n // Retrieve the Measurements themselves\n const measurementGroups = toArray(\n imagingMeasurementContent.ContentSequence\n ).filter(codeMeaningEquals(GROUP));\n\n // For each of the supported measurement types, compute the measurement data\n const measurementData = {};\n\n const cornerstoneToolClasses =\n MeasurementReport.CORNERSTONE_TOOL_CLASSES_BY_UTILITY_TYPE;\n\n const registeredToolClasses = [];\n\n Object.keys(cornerstoneToolClasses).forEach(key => {\n registeredToolClasses.push(cornerstoneToolClasses[key]);\n measurementData[key] = [];\n });\n\n measurementGroups.forEach(measurementGroup => {\n const measurementGroupContentSequence = toArray(\n measurementGroup.ContentSequence\n );\n\n const TrackingIdentifierGroup =\n measurementGroupContentSequence.find(\n contentItem =>\n contentItem.ConceptNameCodeSequence.CodeMeaning ===\n TRACKING_IDENTIFIER\n );\n\n const TrackingIdentifierValue = TrackingIdentifierGroup.TextValue;\n\n const toolClass = hooks.getToolClass\n ? hooks.getToolClass(\n measurementGroup,\n dataset,\n registeredToolClasses\n )\n : registeredToolClasses.find(tc =>\n tc.isValidCornerstoneTrackingIdentifier(\n TrackingIdentifierValue\n )\n );\n\n if (toolClass) {\n const measurement =\n toolClass.getMeasurementData(measurementGroup);\n\n console.log(`=== ${toolClass.toolType} ===`);\n console.log(measurement);\n\n measurementData[toolClass.toolType].push(measurement);\n }\n });\n\n // NOTE: There is no way of knowing the cornerstone imageIds as that could be anything.\n // That is up to the consumer to derive from the SOPInstanceUIDs.\n return measurementData;\n }\n\n static registerTool(toolClass) {\n MeasurementReport.CORNERSTONE_TOOL_CLASSES_BY_UTILITY_TYPE[\n toolClass.utilityToolType\n ] = toolClass;\n MeasurementReport.CORNERSTONE_TOOL_CLASSES_BY_TOOL_TYPE[\n toolClass.toolType\n ] = toolClass;\n MeasurementReport.MEASUREMENT_BY_TOOLTYPE[toolClass.toolType] =\n toolClass.utilityToolType;\n }\n}\n\nMeasurementReport.MEASUREMENT_BY_TOOLTYPE = {};\nMeasurementReport.CORNERSTONE_TOOL_CLASSES_BY_UTILITY_TYPE = {};\nMeasurementReport.CORNERSTONE_TOOL_CLASSES_BY_TOOL_TYPE = {};\n","export default \"cornerstoneTools@^4.0.0\";\n","import { utilities } from \"dcmjs\";\nimport MeasurementReport from \"./MeasurementReport\";\nimport CORNERSTONE_4_TAG from \"./cornerstone4Tag\";\n\nconst { Length: TID300Length } = utilities.TID300;\n\nconst LENGTH = \"Length\";\n\nclass Length {\n // TODO: this function is required for all Cornerstone Tool Adapters, since it is called by MeasurementReport.\n static getMeasurementData(MeasurementGroup) {\n const { defaultState, NUMGroup, SCOORDGroup } =\n MeasurementReport.getSetupMeasurementData(MeasurementGroup);\n\n const state = {\n ...defaultState,\n length: NUMGroup.MeasuredValueSequence.NumericValue,\n toolType: Length.toolType,\n handles: {\n start: {},\n end: {},\n textBox: {\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n }\n }\n };\n\n [\n state.handles.start.x,\n state.handles.start.y,\n state.handles.end.x,\n state.handles.end.y\n ] = SCOORDGroup.GraphicData;\n\n return state;\n }\n\n static getTID300RepresentationArguments(tool) {\n const { handles, finding, findingSites } = tool;\n const point1 = handles.start;\n const point2 = handles.end;\n const distance = tool.length;\n\n const trackingIdentifierTextValue = \"cornerstoneTools@^4.0.0:Length\";\n\n return {\n point1,\n point2,\n distance,\n trackingIdentifierTextValue,\n finding,\n findingSites: findingSites || []\n };\n }\n}\n\nLength.toolType = LENGTH;\nLength.utilityToolType = LENGTH;\nLength.TID300Representation = TID300Length;\nLength.isValidCornerstoneTrackingIdentifier = TrackingIdentifier => {\n if (!TrackingIdentifier.includes(\":\")) {\n return false;\n }\n\n const [cornerstone4Tag, toolType] = TrackingIdentifier.split(\":\");\n\n if (cornerstone4Tag !== CORNERSTONE_4_TAG) {\n return false;\n }\n\n return toolType === LENGTH;\n};\n\nMeasurementReport.registerTool(Length);\n\nexport default Length;\n","import { utilities } from \"dcmjs\";\n\nimport MeasurementReport from \"./MeasurementReport\";\nimport CORNERSTONE_4_TAG from \"./cornerstone4Tag\";\n\nconst { Polyline: TID300Polyline } = utilities.TID300;\n\nclass FreehandRoi {\n static getMeasurementData(MeasurementGroup) {\n const { defaultState, SCOORDGroup, NUMGroup } =\n MeasurementReport.getSetupMeasurementData(MeasurementGroup);\n\n const state = {\n ...defaultState,\n toolType: FreehandRoi.toolType,\n handles: {\n points: [],\n textBox: {\n active: false,\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n }\n },\n cachedStats: {\n area: NUMGroup ? NUMGroup.MeasuredValueSequence.NumericValue : 0\n },\n color: undefined,\n invalidated: true\n };\n const { GraphicData } = SCOORDGroup;\n for (let i = 0; i < GraphicData.length; i += 2) {\n state.handles.points.push({\n x: GraphicData[i],\n y: GraphicData[i + 1]\n });\n }\n\n return state;\n }\n\n static getTID300RepresentationArguments(tool) {\n const { handles, finding, findingSites, cachedStats = {} } = tool;\n const { points } = handles;\n const { area = 0, perimeter = 0 } = cachedStats;\n\n const trackingIdentifierTextValue =\n \"cornerstoneTools@^4.0.0:FreehandRoi\";\n\n return {\n points,\n area,\n perimeter,\n trackingIdentifierTextValue,\n finding,\n findingSites: findingSites || []\n };\n }\n}\n\nFreehandRoi.toolType = \"FreehandRoi\";\nFreehandRoi.utilityToolType = \"FreehandRoi\";\nFreehandRoi.TID300Representation = TID300Polyline;\nFreehandRoi.isValidCornerstoneTrackingIdentifier = TrackingIdentifier => {\n if (!TrackingIdentifier.includes(\":\")) {\n return false;\n }\n\n const [cornerstone4Tag, toolType] = TrackingIdentifier.split(\":\");\n\n if (cornerstone4Tag !== CORNERSTONE_4_TAG) {\n return false;\n }\n\n return toolType === FreehandRoi.toolType;\n};\n\nMeasurementReport.registerTool(FreehandRoi);\n\nexport default FreehandRoi;\n","import { utilities } from \"dcmjs\";\nimport MeasurementReport from \"./MeasurementReport\";\nimport CORNERSTONE_4_TAG from \"./cornerstone4Tag\";\nimport { toArray } from \"../helpers\";\n\nconst { Bidirectional: TID300Bidirectional } = utilities.TID300;\n\nconst BIDIRECTIONAL = \"Bidirectional\";\nconst LONG_AXIS = \"Long Axis\";\nconst SHORT_AXIS = \"Short Axis\";\nconst FINDING = \"121071\";\nconst FINDING_SITE = \"G-C0E3\";\n\nclass Bidirectional {\n // TODO: this function is required for all Cornerstone Tool Adapters, since it is called by MeasurementReport.\n static getMeasurementData(MeasurementGroup) {\n const { ContentSequence } = MeasurementGroup;\n\n const findingGroup = toArray(ContentSequence).find(\n group => group.ConceptNameCodeSequence.CodeValue === FINDING\n );\n\n const findingSiteGroups = toArray(ContentSequence).filter(\n group => group.ConceptNameCodeSequence.CodeValue === FINDING_SITE\n );\n\n const longAxisNUMGroup = toArray(ContentSequence).find(\n group => group.ConceptNameCodeSequence.CodeMeaning === LONG_AXIS\n );\n\n const longAxisSCOORDGroup = toArray(\n longAxisNUMGroup.ContentSequence\n ).find(group => group.ValueType === \"SCOORD\");\n\n const shortAxisNUMGroup = toArray(ContentSequence).find(\n group => group.ConceptNameCodeSequence.CodeMeaning === SHORT_AXIS\n );\n\n const shortAxisSCOORDGroup = toArray(\n shortAxisNUMGroup.ContentSequence\n ).find(group => group.ValueType === \"SCOORD\");\n\n const { ReferencedSOPSequence } = longAxisSCOORDGroup.ContentSequence;\n const { ReferencedSOPInstanceUID, ReferencedFrameNumber } =\n ReferencedSOPSequence;\n\n // Long axis\n\n const longestDiameter = String(\n longAxisNUMGroup.MeasuredValueSequence.NumericValue\n );\n\n const shortestDiameter = String(\n shortAxisNUMGroup.MeasuredValueSequence.NumericValue\n );\n\n const bottomRight = {\n x: Math.max(\n longAxisSCOORDGroup.GraphicData[0],\n longAxisSCOORDGroup.GraphicData[2],\n shortAxisSCOORDGroup.GraphicData[0],\n shortAxisSCOORDGroup.GraphicData[2]\n ),\n y: Math.max(\n longAxisSCOORDGroup.GraphicData[1],\n longAxisSCOORDGroup.GraphicData[3],\n shortAxisSCOORDGroup.GraphicData[1],\n shortAxisSCOORDGroup.GraphicData[3]\n )\n };\n\n const state = {\n sopInstanceUid: ReferencedSOPInstanceUID,\n frameIndex: ReferencedFrameNumber || 1,\n toolType: Bidirectional.toolType,\n active: false,\n handles: {\n start: {\n x: longAxisSCOORDGroup.GraphicData[0],\n y: longAxisSCOORDGroup.GraphicData[1],\n drawnIndependently: false,\n allowedOutsideImage: false,\n active: false,\n highlight: false,\n index: 0\n },\n end: {\n x: longAxisSCOORDGroup.GraphicData[2],\n y: longAxisSCOORDGroup.GraphicData[3],\n drawnIndependently: false,\n allowedOutsideImage: false,\n active: false,\n highlight: false,\n index: 1\n },\n perpendicularStart: {\n x: shortAxisSCOORDGroup.GraphicData[0],\n y: shortAxisSCOORDGroup.GraphicData[1],\n drawnIndependently: false,\n allowedOutsideImage: false,\n active: false,\n highlight: false,\n index: 2\n },\n perpendicularEnd: {\n x: shortAxisSCOORDGroup.GraphicData[2],\n y: shortAxisSCOORDGroup.GraphicData[3],\n drawnIndependently: false,\n allowedOutsideImage: false,\n active: false,\n highlight: false,\n index: 3\n },\n textBox: {\n highlight: false,\n hasMoved: true,\n active: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true,\n x: bottomRight.x + 10,\n y: bottomRight.y + 10\n }\n },\n invalidated: false,\n isCreating: false,\n longestDiameter,\n shortestDiameter,\n toolName: \"Bidirectional\",\n visible: true,\n finding: findingGroup\n ? findingGroup.ConceptCodeSequence\n : undefined,\n findingSites: findingSiteGroups.map(fsg => fsg.ConceptCodeSequence)\n };\n\n return state;\n }\n\n static getTID300RepresentationArguments(tool) {\n const { start, end, perpendicularStart, perpendicularEnd } =\n tool.handles;\n const { shortestDiameter, longestDiameter, finding, findingSites } =\n tool;\n\n const trackingIdentifierTextValue =\n \"cornerstoneTools@^4.0.0:Bidirectional\";\n\n return {\n longAxis: {\n point1: start,\n point2: end\n },\n shortAxis: {\n point1: perpendicularStart,\n point2: perpendicularEnd\n },\n longAxisLength: longestDiameter,\n shortAxisLength: shortestDiameter,\n trackingIdentifierTextValue,\n finding: finding,\n findingSites: findingSites || []\n };\n }\n}\n\nBidirectional.toolType = BIDIRECTIONAL;\nBidirectional.utilityToolType = BIDIRECTIONAL;\nBidirectional.TID300Representation = TID300Bidirectional;\nBidirectional.isValidCornerstoneTrackingIdentifier = TrackingIdentifier => {\n if (!TrackingIdentifier.includes(\":\")) {\n return false;\n }\n\n const [cornerstone4Tag, toolType] = TrackingIdentifier.split(\":\");\n\n if (cornerstone4Tag !== CORNERSTONE_4_TAG) {\n return false;\n }\n\n return toolType === BIDIRECTIONAL;\n};\n\nMeasurementReport.registerTool(Bidirectional);\n\nexport default Bidirectional;\n","import { utilities } from \"dcmjs\";\nimport MeasurementReport from \"./MeasurementReport\";\nimport CORNERSTONE_4_TAG from \"./cornerstone4Tag\";\n\nconst { Ellipse: TID300Ellipse } = utilities.TID300;\n\nconst ELLIPTICALROI = \"EllipticalRoi\";\n\nclass EllipticalRoi {\n // TODO: this function is required for all Cornerstone Tool Adapters, since it is called by MeasurementReport.\n static getMeasurementData(MeasurementGroup) {\n const { defaultState, NUMGroup, SCOORDGroup } =\n MeasurementReport.getSetupMeasurementData(MeasurementGroup);\n\n const { GraphicData } = SCOORDGroup;\n\n const majorAxis = [\n { x: GraphicData[0], y: GraphicData[1] },\n { x: GraphicData[2], y: GraphicData[3] }\n ];\n const minorAxis = [\n { x: GraphicData[4], y: GraphicData[5] },\n { x: GraphicData[6], y: GraphicData[7] }\n ];\n\n // Calculate two opposite corners of box defined by two axes.\n\n const minorAxisLength = Math.sqrt(\n Math.pow(minorAxis[0].x - minorAxis[1].x, 2) +\n Math.pow(minorAxis[0].y - minorAxis[1].y, 2)\n );\n\n const minorAxisDirection = {\n x: (minorAxis[1].x - minorAxis[0].x) / minorAxisLength,\n y: (minorAxis[1].y - minorAxis[0].y) / minorAxisLength\n };\n\n const halfMinorAxisLength = minorAxisLength / 2;\n\n // First end point of major axis + half minor axis vector\n const corner1 = {\n x: majorAxis[0].x + minorAxisDirection.x * halfMinorAxisLength,\n y: majorAxis[0].y + minorAxisDirection.y * halfMinorAxisLength\n };\n\n // Second end point of major axis - half of minor axis vector\n const corner2 = {\n x: majorAxis[1].x - minorAxisDirection.x * halfMinorAxisLength,\n y: majorAxis[1].y - minorAxisDirection.y * halfMinorAxisLength\n };\n const state = {\n ...defaultState,\n toolType: EllipticalRoi.toolType,\n active: false,\n cachedStats: {\n area: NUMGroup ? NUMGroup.MeasuredValueSequence.NumericValue : 0\n },\n handles: {\n end: {\n x: corner1.x,\n y: corner1.y,\n highlight: false,\n active: false\n },\n initialRotation: 0,\n start: {\n x: corner2.x,\n y: corner2.y,\n highlight: false,\n active: false\n },\n textBox: {\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n }\n },\n invalidated: true,\n visible: true\n };\n\n return state;\n }\n\n static getTID300RepresentationArguments(tool) {\n const { cachedStats = {}, handles, finding, findingSites } = tool;\n const { start, end } = handles;\n const { area } = cachedStats;\n\n const halfXLength = Math.abs(start.x - end.x) / 2;\n const halfYLength = Math.abs(start.y - end.y) / 2;\n\n const points = [];\n\n const center = { x: (start.x + end.x) / 2, y: (start.y + end.y) / 2 };\n\n if (halfXLength > halfYLength) {\n // X-axis major\n // Major axis\n points.push({ x: center.x - halfXLength, y: center.y });\n points.push({ x: center.x + halfXLength, y: center.y });\n // Minor axis\n points.push({ x: center.x, y: center.y - halfYLength });\n points.push({ x: center.x, y: center.y + halfYLength });\n } else {\n // Y-axis major\n // Major axis\n points.push({ x: center.x, y: center.y - halfYLength });\n points.push({ x: center.x, y: center.y + halfYLength });\n // Minor axis\n points.push({ x: center.x - halfXLength, y: center.y });\n points.push({ x: center.x + halfXLength, y: center.y });\n }\n\n const trackingIdentifierTextValue =\n \"cornerstoneTools@^4.0.0:EllipticalRoi\";\n\n return {\n area,\n points,\n trackingIdentifierTextValue,\n finding,\n findingSites: findingSites || []\n };\n }\n}\n\nEllipticalRoi.toolType = ELLIPTICALROI;\nEllipticalRoi.utilityToolType = ELLIPTICALROI;\nEllipticalRoi.TID300Representation = TID300Ellipse;\nEllipticalRoi.isValidCornerstoneTrackingIdentifier = TrackingIdentifier => {\n if (!TrackingIdentifier.includes(\":\")) {\n return false;\n }\n\n const [cornerstone4Tag, toolType] = TrackingIdentifier.split(\":\");\n\n if (cornerstone4Tag !== CORNERSTONE_4_TAG) {\n return false;\n }\n\n return toolType === ELLIPTICALROI;\n};\n\nMeasurementReport.registerTool(EllipticalRoi);\n\nexport default EllipticalRoi;\n","import { utilities } from \"dcmjs\";\nimport MeasurementReport from \"./MeasurementReport\";\nimport CORNERSTONE_4_TAG from \"./cornerstone4Tag\";\n\nconst { Circle: TID300Circle } = utilities.TID300;\n\nconst CIRCLEROI = \"CircleRoi\";\n\nclass CircleRoi {\n /** Gets the measurement data for cornerstone, given DICOM SR measurement data. */\n static getMeasurementData(MeasurementGroup) {\n const { defaultState, NUMGroup, SCOORDGroup } =\n MeasurementReport.getSetupMeasurementData(MeasurementGroup);\n\n const { GraphicData } = SCOORDGroup;\n\n const center = { x: GraphicData[0], y: GraphicData[1] };\n const end = { x: GraphicData[2], y: GraphicData[3] };\n\n const state = {\n ...defaultState,\n toolType: CircleRoi.toolType,\n active: false,\n cachedStats: {\n area: NUMGroup\n ? NUMGroup.MeasuredValueSequence.NumericValue\n : 0,\n // Dummy values to be updated by cornerstone\n radius: 0,\n perimeter: 0\n },\n handles: {\n end: {\n ...end,\n highlight: false,\n active: false\n },\n initialRotation: 0,\n start: {\n ...center,\n highlight: false,\n active: false\n },\n textBox: {\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n }\n },\n invalidated: true,\n visible: true\n };\n\n return state;\n }\n\n /**\n * Gets the TID 300 representation of a circle, given the cornerstone representation.\n *\n * @param {Object} tool\n * @returns\n */\n static getTID300RepresentationArguments(tool) {\n const { cachedStats = {}, handles, finding, findingSites } = tool;\n const { start: center, end } = handles;\n const { area, radius } = cachedStats;\n\n const perimeter = 2 * Math.PI * radius;\n const points = [];\n\n points.push(center);\n points.push(end);\n\n const trackingIdentifierTextValue = \"cornerstoneTools@^4.0.0:CircleRoi\";\n\n return {\n area,\n perimeter,\n radius,\n points,\n trackingIdentifierTextValue,\n finding,\n findingSites: findingSites || []\n };\n }\n}\n\nCircleRoi.toolType = CIRCLEROI;\nCircleRoi.utilityToolType = CIRCLEROI;\nCircleRoi.TID300Representation = TID300Circle;\nCircleRoi.isValidCornerstoneTrackingIdentifier = TrackingIdentifier => {\n if (!TrackingIdentifier.includes(\":\")) {\n return false;\n }\n\n const [cornerstone4Tag, toolType] = TrackingIdentifier.split(\":\");\n\n if (cornerstone4Tag !== CORNERSTONE_4_TAG) {\n return false;\n }\n\n return toolType === CIRCLEROI;\n};\n\nMeasurementReport.registerTool(CircleRoi);\n\nexport default CircleRoi;\n","import { utilities } from \"dcmjs\";\n\nimport MeasurementReport from \"./MeasurementReport\";\nimport CORNERSTONE_4_TAG from \"./cornerstone4Tag\";\n\nconst { Point: TID300Point } = utilities.TID300;\n\nconst ARROW_ANNOTATE = \"ArrowAnnotate\";\nconst CORNERSTONEFREETEXT = \"CORNERSTONEFREETEXT\";\n\nclass ArrowAnnotate {\n static getMeasurementData(MeasurementGroup) {\n const { defaultState, SCOORDGroup, findingGroup } =\n MeasurementReport.getSetupMeasurementData(MeasurementGroup);\n\n const text = findingGroup.ConceptCodeSequence.CodeMeaning;\n\n const { GraphicData } = SCOORDGroup;\n\n const state = {\n ...defaultState,\n toolType: ArrowAnnotate.toolType,\n active: false,\n handles: {\n start: {\n x: GraphicData[0],\n y: GraphicData[1],\n highlight: true,\n active: false\n },\n // Use a generic offset if the stored data doesn't have the endpoint, otherwise\n // use the actual endpoint.\n end: {\n x:\n GraphicData.length == 4\n ? GraphicData[2]\n : GraphicData[0] + 20,\n y:\n GraphicData.length == 4\n ? GraphicData[3]\n : GraphicData[1] + 20,\n highlight: true,\n active: false\n },\n textBox: {\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n }\n },\n invalidated: true,\n text,\n visible: true\n };\n\n return state;\n }\n\n static getTID300RepresentationArguments(tool) {\n const points = [tool.handles.start, tool.handles.end];\n\n let { finding, findingSites } = tool;\n\n const TID300RepresentationArguments = {\n points,\n trackingIdentifierTextValue: `cornerstoneTools@^4.0.0:ArrowAnnotate`,\n findingSites: findingSites || []\n };\n\n // If freetext finding isn't present, add it from the tool text.\n if (!finding || finding.CodeValue !== CORNERSTONEFREETEXT) {\n finding = {\n CodeValue: CORNERSTONEFREETEXT,\n CodingSchemeDesignator: \"CST4\",\n CodeMeaning: tool.text\n };\n }\n\n TID300RepresentationArguments.finding = finding;\n\n return TID300RepresentationArguments;\n }\n}\n\nArrowAnnotate.toolType = ARROW_ANNOTATE;\nArrowAnnotate.utilityToolType = ARROW_ANNOTATE;\nArrowAnnotate.TID300Representation = TID300Point;\nArrowAnnotate.isValidCornerstoneTrackingIdentifier = TrackingIdentifier => {\n if (!TrackingIdentifier.includes(\":\")) {\n return false;\n }\n\n const [cornerstone4Tag, toolType] = TrackingIdentifier.split(\":\");\n\n if (cornerstone4Tag !== CORNERSTONE_4_TAG) {\n return false;\n }\n\n return toolType === ARROW_ANNOTATE;\n};\n\nMeasurementReport.registerTool(ArrowAnnotate);\n\nexport default ArrowAnnotate;\n","import { utilities } from \"dcmjs\";\nimport MeasurementReport from \"./MeasurementReport\";\nimport CORNERSTONE_4_TAG from \"./cornerstone4Tag\";\n\nconst { CobbAngle: TID300CobbAngle } = utilities.TID300;\n\nconst COBB_ANGLE = \"CobbAngle\";\n\nclass CobbAngle {\n // TODO: this function is required for all Cornerstone Tool Adapters, since it is called by MeasurementReport.\n static getMeasurementData(MeasurementGroup) {\n const { defaultState, NUMGroup, SCOORDGroup } =\n MeasurementReport.getSetupMeasurementData(MeasurementGroup);\n\n const state = {\n ...defaultState,\n rAngle: NUMGroup.MeasuredValueSequence.NumericValue,\n toolType: CobbAngle.toolType,\n handles: {\n start: {},\n end: {},\n start2: {\n highlight: true,\n drawnIndependently: true\n },\n end2: {\n highlight: true,\n drawnIndependently: true\n },\n textBox: {\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n }\n }\n };\n\n [\n state.handles.start.x,\n state.handles.start.y,\n state.handles.end.x,\n state.handles.end.y,\n state.handles.start2.x,\n state.handles.start2.y,\n state.handles.end2.x,\n state.handles.end2.y\n ] = SCOORDGroup.GraphicData;\n\n return state;\n }\n\n static getTID300RepresentationArguments(tool) {\n const { handles, finding, findingSites } = tool;\n const point1 = handles.start;\n const point2 = handles.end;\n const point3 = handles.start2;\n const point4 = handles.end2;\n const rAngle = tool.rAngle;\n\n const trackingIdentifierTextValue = \"cornerstoneTools@^4.0.0:CobbAngle\";\n\n return {\n point1,\n point2,\n point3,\n point4,\n rAngle,\n trackingIdentifierTextValue,\n finding,\n findingSites: findingSites || []\n };\n }\n}\n\nCobbAngle.toolType = COBB_ANGLE;\nCobbAngle.utilityToolType = COBB_ANGLE;\nCobbAngle.TID300Representation = TID300CobbAngle;\nCobbAngle.isValidCornerstoneTrackingIdentifier = TrackingIdentifier => {\n if (!TrackingIdentifier.includes(\":\")) {\n return false;\n }\n\n const [cornerstone4Tag, toolType] = TrackingIdentifier.split(\":\");\n\n if (cornerstone4Tag !== CORNERSTONE_4_TAG) {\n return false;\n }\n\n return toolType === COBB_ANGLE;\n};\n\nMeasurementReport.registerTool(CobbAngle);\n\nexport default CobbAngle;\n","import { utilities } from \"dcmjs\";\n\nimport MeasurementReport from \"./MeasurementReport\";\nimport CORNERSTONE_4_TAG from \"./cornerstone4Tag\";\n\nconst { Angle: TID300Angle } = utilities.TID300;\n\nconst ANGLE = \"Angle\";\n\nclass Angle {\n /**\n * Generate TID300 measurement data for a plane angle measurement - use a Angle, but label it as Angle\n */\n static getMeasurementData(MeasurementGroup) {\n const { defaultState, NUMGroup, SCOORDGroup } =\n MeasurementReport.getSetupMeasurementData(MeasurementGroup);\n\n const state = {\n ...defaultState,\n rAngle: NUMGroup.MeasuredValueSequence.NumericValue,\n toolType: Angle.toolType,\n handles: {\n start: {},\n middle: {},\n end: {},\n textBox: {\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n }\n }\n };\n\n [\n state.handles.start.x,\n state.handles.start.y,\n state.handles.middle.x,\n state.handles.middle.y,\n state.handles.middle.x,\n state.handles.middle.y,\n state.handles.end.x,\n state.handles.end.y\n ] = SCOORDGroup.GraphicData;\n\n return state;\n }\n\n static getTID300RepresentationArguments(tool) {\n const { handles, finding, findingSites } = tool;\n const point1 = handles.start;\n const point2 = handles.middle;\n const point3 = handles.middle;\n const point4 = handles.end;\n const rAngle = tool.rAngle;\n\n const trackingIdentifierTextValue = \"cornerstoneTools@^4.0.0:Angle\";\n\n return {\n point1,\n point2,\n point3,\n point4,\n rAngle,\n trackingIdentifierTextValue,\n finding,\n findingSites: findingSites || []\n };\n }\n}\n\nAngle.toolType = ANGLE;\nAngle.utilityToolType = ANGLE;\nAngle.TID300Representation = TID300Angle;\nAngle.isValidCornerstoneTrackingIdentifier = TrackingIdentifier => {\n if (!TrackingIdentifier.includes(\":\")) {\n return false;\n }\n\n const [cornerstone4Tag, toolType] = TrackingIdentifier.split(\":\");\n\n if (cornerstone4Tag !== CORNERSTONE_4_TAG) {\n return false;\n }\n\n return toolType === ANGLE;\n};\n\nMeasurementReport.registerTool(Angle);\n\nexport default Angle;\n","import { utilities } from \"dcmjs\";\nimport MeasurementReport from \"./MeasurementReport\";\nimport CORNERSTONE_4_TAG from \"./cornerstone4Tag\";\n\nconst { Polyline: TID300Polyline } = utilities.TID300;\n\nclass RectangleRoi {\n static getMeasurementData(MeasurementGroup) {\n const { defaultState, SCOORDGroup, NUMGroup } =\n MeasurementReport.getSetupMeasurementData(MeasurementGroup);\n\n const state = {\n ...defaultState,\n toolType: RectangleRoi.toolType,\n handles: {\n start: {},\n end: {},\n textBox: {\n active: false,\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n },\n initialRotation: 0\n },\n cachedStats: {\n area: NUMGroup ? NUMGroup.MeasuredValueSequence.NumericValue : 0\n },\n color: undefined,\n invalidated: true\n };\n const intermediate = {};\n\n [\n state.handles.start.x,\n state.handles.start.y,\n intermediate.x,\n intermediate.y,\n state.handles.end.x,\n state.handles.end.y\n ] = SCOORDGroup.GraphicData;\n\n return state;\n }\n\n static getTID300RepresentationArguments(tool) {\n const { finding, findingSites, cachedStats = {}, handles } = tool;\n const { start, end } = handles;\n const points = [\n start,\n { x: start.x, y: end.y },\n end,\n { x: end.x, y: start.y }\n ];\n const { area, perimeter } = cachedStats;\n\n const trackingIdentifierTextValue =\n \"cornerstoneTools@^4.0.0:RectangleRoi\";\n\n return {\n points,\n area,\n perimeter,\n trackingIdentifierTextValue,\n finding,\n findingSites: findingSites || []\n };\n }\n}\n\nRectangleRoi.toolType = \"RectangleRoi\";\nRectangleRoi.utilityToolType = \"RectangleRoi\";\nRectangleRoi.TID300Representation = TID300Polyline;\nRectangleRoi.isValidCornerstoneTrackingIdentifier = TrackingIdentifier => {\n if (!TrackingIdentifier.includes(\":\")) {\n return false;\n }\n\n const [cornerstone4Tag, toolType] = TrackingIdentifier.split(\":\");\n\n if (cornerstone4Tag !== CORNERSTONE_4_TAG) {\n return false;\n }\n\n return toolType === RectangleRoi.toolType;\n};\n\nMeasurementReport.registerTool(RectangleRoi);\n\nexport default RectangleRoi;\n","import { log, utilities, normalizers, derivations } from \"dcmjs\";\nimport ndarray from \"ndarray\";\n\nconst {\n rotateDirectionCosinesInPlane,\n flipImageOrientationPatient: flipIOP,\n flipMatrix2D,\n rotateMatrix902D\n} = utilities.orientation;\n\nconst { datasetToBlob, BitArray, DicomMessage, DicomMetaDictionary } =\n utilities;\n\nconst { Normalizer } = normalizers;\nconst { Segmentation: SegmentationDerivation } = derivations;\n\nconst Segmentation = {\n generateSegmentation,\n generateToolState\n};\n\nexport default Segmentation;\n\n/**\n *\n * @typedef {Object} BrushData\n * @property {Object} toolState - The cornerstoneTools global toolState.\n * @property {Object[]} segments - The cornerstoneTools segment metadata that corresponds to the\n * seriesInstanceUid.\n */\n\n/**\n * generateSegmentation - Generates cornerstoneTools brush data, given a stack of\n * imageIds, images and the cornerstoneTools brushData.\n *\n * @param {object[]} images An array of the cornerstone image objects.\n * @param {BrushData} brushData and object containing the brushData.\n * @returns {type} description\n */\nfunction generateSegmentation(\n images,\n brushData,\n options = { includeSliceSpacing: true }\n) {\n const { toolState, segments } = brushData;\n\n // Calculate the dimensions of the data cube.\n const image0 = images[0];\n\n const dims = {\n x: image0.columns,\n y: image0.rows,\n z: images.length\n };\n\n dims.xy = dims.x * dims.y;\n\n const numSegments = _getSegCount(seg, segments);\n\n if (!numSegments) {\n throw new Error(\"No segments to export!\");\n }\n\n const isMultiframe = image0.imageId.includes(\"?frame\");\n const seg = _createSegFromImages(images, isMultiframe, options);\n\n const { referencedFramesPerSegment, segmentIndicies } =\n _getNumberOfFramesPerSegment(toolState, images, segments);\n\n let NumberOfFrames = 0;\n\n for (let i = 0; i < referencedFramesPerSegment.length; i++) {\n NumberOfFrames += referencedFramesPerSegment[i].length;\n }\n\n seg.setNumberOfFrames(NumberOfFrames);\n\n for (let i = 0; i < segmentIndicies.length; i++) {\n const segmentIndex = segmentIndicies[i];\n const referencedFrameIndicies = referencedFramesPerSegment[i];\n\n // Frame numbers start from 1.\n const referencedFrameNumbers = referencedFrameIndicies.map(element => {\n return element + 1;\n });\n\n const segment = segments[segmentIndex];\n\n seg.addSegment(\n segment,\n _extractCornerstoneToolsPixelData(\n segmentIndex,\n referencedFrameIndicies,\n toolState,\n images,\n dims\n ),\n referencedFrameNumbers\n );\n }\n\n seg.bitPackPixelData();\n\n const segBlob = datasetToBlob(seg.dataset);\n\n return segBlob;\n}\n\nfunction _extractCornerstoneToolsPixelData(\n segmentIndex,\n referencedFrames,\n toolState,\n images,\n dims\n) {\n const pixelData = new Uint8Array(dims.xy * referencedFrames.length);\n\n let pixelDataIndex = 0;\n\n for (let i = 0; i < referencedFrames.length; i++) {\n const frame = referencedFrames[i];\n\n const imageId = images[frame].imageId;\n const imageIdSpecificToolState = toolState[imageId];\n\n const brushPixelData =\n imageIdSpecificToolState.brush.data[segmentIndex].pixelData;\n\n for (let p = 0; p < brushPixelData.length; p++) {\n pixelData[pixelDataIndex] = brushPixelData[p];\n pixelDataIndex++;\n }\n }\n\n return pixelData;\n}\n\nfunction _getNumberOfFramesPerSegment(toolState, images, segments) {\n const segmentIndicies = [];\n const referencedFramesPerSegment = [];\n\n for (let i = 0; i < segments.length; i++) {\n if (segments[i]) {\n segmentIndicies.push(i);\n referencedFramesPerSegment.push([]);\n }\n }\n\n for (let z = 0; z < images.length; z++) {\n const imageId = images[z].imageId;\n const imageIdSpecificToolState = toolState[imageId];\n\n for (let i = 0; i < segmentIndicies.length; i++) {\n const segIdx = segmentIndicies[i];\n\n if (\n imageIdSpecificToolState &&\n imageIdSpecificToolState.brush &&\n imageIdSpecificToolState.brush.data &&\n imageIdSpecificToolState.brush.data[segIdx] &&\n imageIdSpecificToolState.brush.data[segIdx].pixelData\n ) {\n referencedFramesPerSegment[i].push(z);\n }\n }\n }\n\n return {\n referencedFramesPerSegment,\n segmentIndicies\n };\n}\n\nfunction _getSegCount(seg, segments) {\n let numSegments = 0;\n\n for (let i = 0; i < segments.length; i++) {\n if (segments[i]) {\n numSegments++;\n }\n }\n\n return numSegments;\n}\n\n/**\n * _createSegFromImages - description\n *\n * @param {Object[]} images An array of the cornerstone image objects.\n * @param {Boolean} isMultiframe Whether the images are multiframe.\n * @returns {Object} The Seg derived dataSet.\n */\nfunction _createSegFromImages(images, isMultiframe, options) {\n const datasets = [];\n\n if (isMultiframe) {\n const image = images[0];\n const arrayBuffer = image.data.byteArray.buffer;\n\n const dicomData = DicomMessage.readFile(arrayBuffer);\n const dataset = DicomMetaDictionary.naturalizeDataset(dicomData.dict);\n\n dataset._meta = DicomMetaDictionary.namifyDataset(dicomData.meta);\n\n datasets.push(dataset);\n } else {\n for (let i = 0; i < images.length; i++) {\n const image = images[i];\n const arrayBuffer = image.data.byteArray.buffer;\n const dicomData = DicomMessage.readFile(arrayBuffer);\n const dataset = DicomMetaDictionary.naturalizeDataset(\n dicomData.dict\n );\n\n dataset._meta = DicomMetaDictionary.namifyDataset(dicomData.meta);\n datasets.push(dataset);\n }\n }\n\n const multiframe = Normalizer.normalizeToDataset(datasets);\n\n return new SegmentationDerivation([multiframe], options);\n}\n\n/**\n * generateToolState - Given a set of cornrstoneTools imageIds and a Segmentation buffer,\n * derive cornerstoneTools toolState and brush metadata.\n *\n * @param {string[]} imageIds An array of the imageIds.\n * @param {ArrayBuffer} arrayBuffer The SEG arrayBuffer.\n * @param {*} metadataProvider\n * @returns {Object} The toolState and an object from which the\n * segment metadata can be derived.\n */\nfunction generateToolState(imageIds, arrayBuffer, metadataProvider) {\n const dicomData = DicomMessage.readFile(arrayBuffer);\n const dataset = DicomMetaDictionary.naturalizeDataset(dicomData.dict);\n dataset._meta = DicomMetaDictionary.namifyDataset(dicomData.meta);\n const multiframe = Normalizer.normalizeToDataset([dataset]);\n\n const imagePlaneModule = metadataProvider.get(\n \"imagePlaneModule\",\n imageIds[0]\n );\n\n if (!imagePlaneModule) {\n console.warn(\"Insufficient metadata, imagePlaneModule missing.\");\n }\n\n const ImageOrientationPatient = Array.isArray(imagePlaneModule.rowCosines)\n ? [...imagePlaneModule.rowCosines, ...imagePlaneModule.columnCosines]\n : [\n imagePlaneModule.rowCosines.x,\n imagePlaneModule.rowCosines.y,\n imagePlaneModule.rowCosines.z,\n imagePlaneModule.columnCosines.x,\n imagePlaneModule.columnCosines.y,\n imagePlaneModule.columnCosines.z\n ];\n\n // Get IOP from ref series, compute supported orientations:\n const validOrientations = getValidOrientations(ImageOrientationPatient);\n\n const SharedFunctionalGroupsSequence =\n multiframe.SharedFunctionalGroupsSequence;\n\n const sharedImageOrientationPatient =\n SharedFunctionalGroupsSequence.PlaneOrientationSequence\n ? SharedFunctionalGroupsSequence.PlaneOrientationSequence\n .ImageOrientationPatient\n : undefined;\n\n const sliceLength = multiframe.Columns * multiframe.Rows;\n const segMetadata = getSegmentMetadata(multiframe);\n const pixelData = unpackPixelData(multiframe);\n\n const PerFrameFunctionalGroupsSequence =\n multiframe.PerFrameFunctionalGroupsSequence;\n\n const toolState = {};\n\n let inPlane = true;\n\n for (let i = 0; i < PerFrameFunctionalGroupsSequence.length; i++) {\n const PerFrameFunctionalGroups = PerFrameFunctionalGroupsSequence[i];\n\n const ImageOrientationPatientI =\n sharedImageOrientationPatient ||\n PerFrameFunctionalGroups.PlaneOrientationSequence\n .ImageOrientationPatient;\n\n const pixelDataI2D = ndarray(\n new Uint8Array(pixelData.buffer, i * sliceLength, sliceLength),\n [multiframe.Rows, multiframe.Columns]\n );\n\n const alignedPixelDataI = alignPixelDataWithSourceData(\n pixelDataI2D,\n ImageOrientationPatientI,\n validOrientations\n );\n\n if (!alignedPixelDataI) {\n console.warn(\n \"This segmentation object is not in-plane with the source data. Bailing out of IO. It'd be better to render this with vtkjs. \"\n );\n inPlane = false;\n break;\n }\n\n const segmentIndex =\n PerFrameFunctionalGroups.SegmentIdentificationSequence\n .ReferencedSegmentNumber - 1;\n\n let SourceImageSequence;\n if (\n SharedFunctionalGroupsSequence.DerivationImageSequence &&\n SharedFunctionalGroupsSequence.DerivationImageSequence\n .SourceImageSequence\n ) {\n SourceImageSequence =\n SharedFunctionalGroupsSequence.DerivationImageSequence\n .SourceImageSequence[i];\n } else {\n SourceImageSequence =\n PerFrameFunctionalGroups.DerivationImageSequence\n .SourceImageSequence;\n }\n\n const imageId = getImageIdOfSourceImage(\n SourceImageSequence,\n imageIds,\n metadataProvider\n );\n\n addImageIdSpecificBrushToolState(\n toolState,\n imageId,\n segmentIndex,\n alignedPixelDataI\n );\n }\n\n if (!inPlane) {\n return;\n }\n\n return { toolState, segMetadata };\n}\n\n/**\n * unpackPixelData - Unpacks bitpacked pixelData if the Segmentation is BINARY.\n *\n * @param {Object} multiframe The multiframe dataset.\n * @return {Uint8Array} The unpacked pixelData.\n */\nfunction unpackPixelData(multiframe) {\n const segType = multiframe.SegmentationType;\n\n if (segType === \"BINARY\") {\n return BitArray.unpack(multiframe.PixelData);\n }\n\n const pixelData = new Uint8Array(multiframe.PixelData);\n\n const max = multiframe.MaximumFractionalValue;\n const onlyMaxAndZero =\n pixelData.find(element => element !== 0 && element !== max) ===\n undefined;\n\n if (!onlyMaxAndZero) {\n log.warn(\n \"This is a fractional segmentation, which is not currently supported.\"\n );\n return;\n }\n\n log.warn(\n \"This segmentation object is actually binary... processing as such.\"\n );\n\n return pixelData;\n}\n\n/**\n * addImageIdSpecificBrushToolState - Adds brush pixel data to cornerstoneTools\n * formatted toolState object.\n *\n * @param {Object} toolState The toolState object to modify\n * @param {String} imageId The imageId of the toolState to add the data.\n * @param {Number} segmentIndex The index of the segment data being added.\n * @param {Ndarray} pixelData2D The pixelData in Ndarry 2D format.\n */\nfunction addImageIdSpecificBrushToolState(\n toolState,\n imageId,\n segmentIndex,\n pixelData2D\n) {\n if (!toolState[imageId]) {\n toolState[imageId] = {};\n toolState[imageId].brush = {};\n toolState[imageId].brush.data = [];\n } else if (!toolState[imageId].brush) {\n toolState[imageId].brush = {};\n toolState[imageId].brush.data = [];\n } else if (!toolState[imageId].brush.data) {\n toolState[imageId].brush.data = [];\n }\n\n toolState[imageId].brush.data[segmentIndex] = {};\n\n const brushDataI = toolState[imageId].brush.data[segmentIndex];\n\n brushDataI.pixelData = new Uint8Array(pixelData2D.data.length);\n\n const cToolsPixelData = brushDataI.pixelData;\n\n for (let p = 0; p < cToolsPixelData.length; p++) {\n if (pixelData2D.data[p]) {\n cToolsPixelData[p] = 1;\n } else {\n cToolsPixelData[p] = 0;\n }\n }\n}\n\n/**\n * getImageIdOfSourceImage - Returns the Cornerstone imageId of the source image.\n *\n * @param {Object} SourceImageSequence Sequence describing the source image.\n * @param {String[]} imageIds A list of imageIds.\n * @param {Object} metadataProvider A Cornerstone metadataProvider to query\n * metadata from imageIds.\n * @return {String} The corresponding imageId.\n */\nfunction getImageIdOfSourceImage(\n SourceImageSequence,\n imageIds,\n metadataProvider\n) {\n const { ReferencedSOPInstanceUID, ReferencedFrameNumber } =\n SourceImageSequence;\n\n return ReferencedFrameNumber\n ? getImageIdOfReferencedFrame(\n ReferencedSOPInstanceUID,\n ReferencedFrameNumber,\n imageIds,\n metadataProvider\n )\n : getImageIdOfReferencedSingleFramedSOPInstance(\n ReferencedSOPInstanceUID,\n imageIds,\n metadataProvider\n );\n}\n\n/**\n * getImageIdOfReferencedSingleFramedSOPInstance - Returns the imageId\n * corresponding to the specified sopInstanceUid for single-frame images.\n *\n * @param {String} sopInstanceUid The sopInstanceUid of the desired image.\n * @param {String[]} imageIds The list of imageIds.\n * @param {Object} metadataProvider The metadataProvider to obtain sopInstanceUids\n * from the cornerstone imageIds.\n * @return {String} The imageId that corresponds to the sopInstanceUid.\n */\nfunction getImageIdOfReferencedSingleFramedSOPInstance(\n sopInstanceUid,\n imageIds,\n metadataProvider\n) {\n return imageIds.find(imageId => {\n const sopCommonModule = metadataProvider.get(\n \"sopCommonModule\",\n imageId\n );\n if (!sopCommonModule) {\n return;\n }\n\n return sopCommonModule.sopInstanceUID === sopInstanceUid;\n });\n}\n\n/**\n * getImageIdOfReferencedFrame - Returns the imageId corresponding to the\n * specified sopInstanceUid and frameNumber for multi-frame images.\n *\n * @param {String} sopInstanceUid The sopInstanceUid of the desired image.\n * @param {Number} frameNumber The frame number.\n * @param {String} imageIds The list of imageIds.\n * @param {Object} metadataProvider The metadataProvider to obtain sopInstanceUids\n * from the cornerstone imageIds.\n * @return {String} The imageId that corresponds to the sopInstanceUid.\n */\nfunction getImageIdOfReferencedFrame(\n sopInstanceUid,\n frameNumber,\n imageIds,\n metadataProvider\n) {\n const imageId = imageIds.find(imageId => {\n const sopCommonModule = metadataProvider.get(\n \"sopCommonModule\",\n imageId\n );\n if (!sopCommonModule) {\n return;\n }\n\n const imageIdFrameNumber = Number(imageId.split(\"frame=\")[1]);\n\n return (\n //frameNumber is zero indexed for cornerstoneDICOMImageLoader image Ids.\n sopCommonModule.sopInstanceUID === sopInstanceUid &&\n imageIdFrameNumber === frameNumber - 1\n );\n });\n\n return imageId;\n}\n\n/**\n * getValidOrientations - returns an array of valid orientations.\n *\n * @param iop - The row (0..2) an column (3..5) direction cosines.\n * @return An array of valid orientations.\n */\nfunction getValidOrientations(iop) {\n const orientations = [];\n\n // [0, 1, 2]: 0, 0hf, 0vf\n // [3, 4, 5]: 90, 90hf, 90vf\n // [6, 7]: 180, 270\n\n orientations[0] = iop;\n orientations[1] = flipIOP.h(iop);\n orientations[2] = flipIOP.v(iop);\n\n const iop90 = rotateDirectionCosinesInPlane(iop, Math.PI / 2);\n\n orientations[3] = iop90;\n orientations[4] = flipIOP.h(iop90);\n orientations[5] = flipIOP.v(iop90);\n\n orientations[6] = rotateDirectionCosinesInPlane(iop, Math.PI);\n orientations[7] = rotateDirectionCosinesInPlane(iop, 1.5 * Math.PI);\n\n return orientations;\n}\n\n/**\n * alignPixelDataWithSourceData -\n *\n * @param pixelData2D - The data to align.\n * @param iop - The orientation of the image slice.\n * @param orientations - An array of valid imageOrientationPatient values.\n * @return The aligned pixelData.\n */\nfunction alignPixelDataWithSourceData(pixelData2D, iop, orientations) {\n if (compareIOP(iop, orientations[0])) {\n //Same orientation.\n return pixelData2D;\n } else if (compareIOP(iop, orientations[1])) {\n //Flipped vertically.\n return flipMatrix2D.v(pixelData2D);\n } else if (compareIOP(iop, orientations[2])) {\n //Flipped horizontally.\n return flipMatrix2D.h(pixelData2D);\n } else if (compareIOP(iop, orientations[3])) {\n //Rotated 90 degrees.\n return rotateMatrix902D(pixelData2D);\n } else if (compareIOP(iop, orientations[4])) {\n //Rotated 90 degrees and fliped horizontally.\n return flipMatrix2D.h(rotateMatrix902D(pixelData2D));\n } else if (compareIOP(iop, orientations[5])) {\n //Rotated 90 degrees and fliped vertically.\n return flipMatrix2D.v(rotateMatrix902D(pixelData2D));\n } else if (compareIOP(iop, orientations[6])) {\n //Rotated 180 degrees. // TODO -> Do this more effeciently, there is a 1:1 mapping like 90 degree rotation.\n return rotateMatrix902D(rotateMatrix902D(pixelData2D));\n } else if (compareIOP(iop, orientations[7])) {\n //Rotated 270 degrees. // TODO -> Do this more effeciently, there is a 1:1 mapping like 90 degree rotation.\n return rotateMatrix902D(\n rotateMatrix902D(rotateMatrix902D(pixelData2D))\n );\n }\n}\n\nconst dx = 1e-5;\n\n/**\n * compareIOP - Returns true if iop1 and iop2 are equal\n * within a tollerance, dx.\n *\n * @param iop1 - An ImageOrientationPatient array.\n * @param iop2 - An ImageOrientationPatient array.\n * @return True if iop1 and iop2 are equal.\n */\nfunction compareIOP(iop1, iop2) {\n return (\n Math.abs(iop1[0] - iop2[0]) < dx &&\n Math.abs(iop1[1] - iop2[1]) < dx &&\n Math.abs(iop1[2] - iop2[2]) < dx &&\n Math.abs(iop1[3] - iop2[3]) < dx &&\n Math.abs(iop1[4] - iop2[4]) < dx &&\n Math.abs(iop1[5] - iop2[5]) < dx\n );\n}\n\nfunction getSegmentMetadata(multiframe) {\n const data = [];\n\n const segmentSequence = multiframe.SegmentSequence;\n\n if (Array.isArray(segmentSequence)) {\n for (let segIdx = 0; segIdx < segmentSequence.length; segIdx++) {\n data.push(segmentSequence[segIdx]);\n }\n } else {\n // Only one segment, will be stored as an object.\n data.push(segmentSequence);\n }\n\n return {\n seriesInstanceUid:\n multiframe.ReferencedSeriesSequence.SeriesInstanceUID,\n data\n };\n}\n","/**\n * Cornerstone adapters events\n */\nenum Events {\n /**\n * Cornerstone segmentation load progress event\n */\n SEGMENTATION_LOAD_PROGRESS = \"CORNERSTONE_ADAPTER_SEGMENTATION_LOAD_PROGRESS\"\n}\n\nexport default Events;\n","import {\n log,\n data as dcmjsData,\n utilities,\n normalizers,\n derivations\n} from \"dcmjs\";\nimport ndarray from \"ndarray\";\nimport cloneDeep from \"lodash.clonedeep\";\n\nimport { Events } from \"../enums\";\n\nconst {\n rotateDirectionCosinesInPlane,\n flipImageOrientationPatient: flipIOP,\n flipMatrix2D,\n rotateMatrix902D,\n nearlyEqual\n} = utilities.orientation;\n\nconst { BitArray, DicomMessage, DicomMetaDictionary } = dcmjsData;\n\nconst { Normalizer } = normalizers;\nconst { Segmentation: SegmentationDerivation } = derivations;\n\nconst { encode, decode } = utilities.compression;\n\n/**\n *\n * @typedef {Object} BrushData\n * @property {Object} toolState - The cornerstoneTools global toolState.\n * @property {Object[]} segments - The cornerstoneTools segment metadata that corresponds to the\n * seriesInstanceUid.\n */\nconst generateSegmentationDefaultOptions = {\n includeSliceSpacing: true,\n rleEncode: false\n};\n\n/**\n * generateSegmentation - Generates cornerstoneTools brush data, given a stack of\n * imageIds, images and the cornerstoneTools brushData.\n *\n * @param {object[]} images An array of cornerstone images that contain the source\n * data under `image.data.byteArray.buffer`.\n * @param {Object|Object[]} inputLabelmaps3D The cornerstone `Labelmap3D` object, or an array of objects.\n * @param {Object} userOptions Options to pass to the segmentation derivation and `fillSegmentation`.\n * @returns {Blob}\n */\nfunction generateSegmentation(images, inputLabelmaps3D, userOptions = {}) {\n const isMultiframe = images[0].imageId.includes(\"?frame\");\n const segmentation = _createSegFromImages(\n images,\n isMultiframe,\n userOptions\n );\n\n return fillSegmentation(segmentation, inputLabelmaps3D, userOptions);\n}\n\n/**\n * Fills a given segmentation object with data from the input labelmaps3D\n *\n * @param segmentation - The segmentation object to be filled.\n * @param inputLabelmaps3D - An array of 3D labelmaps, or a single 3D labelmap.\n * @param userOptions - Optional configuration settings. Will override the default options.\n *\n * @returns {object} The filled segmentation object.\n */\nfunction fillSegmentation(segmentation, inputLabelmaps3D, userOptions = {}) {\n const options = Object.assign(\n {},\n generateSegmentationDefaultOptions,\n userOptions\n );\n\n // Use another variable so we don't redefine labelmaps3D.\n const labelmaps3D = Array.isArray(inputLabelmaps3D)\n ? inputLabelmaps3D\n : [inputLabelmaps3D];\n\n let numberOfFrames = 0;\n const referencedFramesPerLabelmap = [];\n\n for (\n let labelmapIndex = 0;\n labelmapIndex < labelmaps3D.length;\n labelmapIndex++\n ) {\n const labelmap3D = labelmaps3D[labelmapIndex];\n const { labelmaps2D, metadata } = labelmap3D;\n\n const referencedFramesPerSegment = [];\n\n for (let i = 1; i < metadata.length; i++) {\n if (metadata[i]) {\n referencedFramesPerSegment[i] = [];\n }\n }\n\n for (let i = 0; i < labelmaps2D.length; i++) {\n const labelmap2D = labelmaps2D[i];\n\n if (labelmaps2D[i]) {\n const { segmentsOnLabelmap } = labelmap2D;\n\n segmentsOnLabelmap.forEach(segmentIndex => {\n if (segmentIndex !== 0) {\n referencedFramesPerSegment[segmentIndex].push(i);\n numberOfFrames++;\n }\n });\n }\n }\n\n referencedFramesPerLabelmap[labelmapIndex] = referencedFramesPerSegment;\n }\n\n segmentation.setNumberOfFrames(numberOfFrames);\n\n for (\n let labelmapIndex = 0;\n labelmapIndex < labelmaps3D.length;\n labelmapIndex++\n ) {\n const referencedFramesPerSegment =\n referencedFramesPerLabelmap[labelmapIndex];\n\n const labelmap3D = labelmaps3D[labelmapIndex];\n const { metadata } = labelmap3D;\n\n for (\n let segmentIndex = 1;\n segmentIndex < referencedFramesPerSegment.length;\n segmentIndex++\n ) {\n const referencedFrameIndicies =\n referencedFramesPerSegment[segmentIndex];\n\n if (referencedFrameIndicies) {\n // Frame numbers start from 1.\n const referencedFrameNumbers = referencedFrameIndicies.map(\n element => {\n return element + 1;\n }\n );\n const segmentMetadata = metadata[segmentIndex];\n const labelmaps = _getLabelmapsFromReferencedFrameIndicies(\n labelmap3D,\n referencedFrameIndicies\n );\n\n segmentation.addSegmentFromLabelmap(\n segmentMetadata,\n labelmaps,\n segmentIndex,\n referencedFrameNumbers\n );\n }\n }\n }\n if (options.rleEncode) {\n const rleEncodedFrames = encode(\n segmentation.dataset.PixelData,\n numberOfFrames,\n segmentation.dataset.Rows,\n segmentation.dataset.Columns\n );\n\n // Must use fractional now to RLE encode, as the DICOM standard only allows BitStored && BitsAllocated\n // to be 1 for BINARY. This is not ideal and there should be a better format for compression in this manner\n // added to the standard.\n segmentation.assignToDataset({\n BitsAllocated: \"8\",\n BitsStored: \"8\",\n HighBit: \"7\",\n SegmentationType: \"FRACTIONAL\",\n SegmentationFractionalType: \"PROBABILITY\",\n MaximumFractionalValue: \"255\"\n });\n\n segmentation.dataset._meta.TransferSyntaxUID = {\n Value: [\"1.2.840.10008.1.2.5\"],\n vr: \"UI\"\n };\n segmentation.dataset._vrMap.PixelData = \"OB\";\n segmentation.dataset.PixelData = rleEncodedFrames;\n } else {\n // If no rleEncoding, at least bitpack the data.\n segmentation.bitPackPixelData();\n }\n\n return segmentation;\n}\n\nfunction _getLabelmapsFromReferencedFrameIndicies(\n labelmap3D,\n referencedFrameIndicies\n) {\n const { labelmaps2D } = labelmap3D;\n\n const labelmaps = [];\n\n for (let i = 0; i < referencedFrameIndicies.length; i++) {\n const frame = referencedFrameIndicies[i];\n\n labelmaps.push(labelmaps2D[frame].pixelData);\n }\n\n return labelmaps;\n}\n\n/**\n * _createSegFromImages - description\n *\n * @param {Object[]} images An array of the cornerstone image objects.\n * @param {Boolean} isMultiframe Whether the images are multiframe.\n * @returns {Object} The Seg derived dataSet.\n */\nfunction _createSegFromImages(images, isMultiframe, options) {\n const datasets = [];\n\n if (isMultiframe) {\n const image = images[0];\n const arrayBuffer = image.data.byteArray.buffer;\n\n const dicomData = DicomMessage.readFile(arrayBuffer);\n const dataset = DicomMetaDictionary.naturalizeDataset(dicomData.dict);\n\n dataset._meta = DicomMetaDictionary.namifyDataset(dicomData.meta);\n\n datasets.push(dataset);\n } else {\n for (let i = 0; i < images.length; i++) {\n const image = images[i];\n const arrayBuffer = image.data.byteArray.buffer;\n const dicomData = DicomMessage.readFile(arrayBuffer);\n const dataset = DicomMetaDictionary.naturalizeDataset(\n dicomData.dict\n );\n\n dataset._meta = DicomMetaDictionary.namifyDataset(dicomData.meta);\n datasets.push(dataset);\n }\n }\n\n const multiframe = Normalizer.normalizeToDataset(datasets);\n\n return new SegmentationDerivation([multiframe], options);\n}\n\n/**\n * generateToolState - Given a set of cornrstoneTools imageIds and a Segmentation buffer,\n * derive cornerstoneTools toolState and brush metadata.\n *\n * @param {string[]} imageIds - An array of the imageIds.\n * @param {ArrayBuffer} arrayBuffer - The SEG arrayBuffer.\n * @param {*} metadataProvider.\n * @param {obj} options - Options object.\n *\n * @return {[]ArrayBuffer}a list of array buffer for each labelMap\n * @return {Object} an object from which the segment metadata can be derived\n * @return {[][][]} 2D list containing the track of segments per frame\n * @return {[][][]} 3D list containing the track of segments per frame for each labelMap\n * (available only for the overlapping case).\n */\nasync function generateToolState(\n imageIds,\n arrayBuffer,\n metadataProvider,\n options\n) {\n const {\n skipOverlapping = false,\n tolerance = 1e-3,\n TypedArrayConstructor = Uint8Array,\n maxBytesPerChunk = 199000000,\n eventTarget,\n triggerEvent\n } = options;\n const dicomData = DicomMessage.readFile(arrayBuffer);\n const dataset = DicomMetaDictionary.naturalizeDataset(dicomData.dict);\n dataset._meta = DicomMetaDictionary.namifyDataset(dicomData.meta);\n const multiframe = Normalizer.normalizeToDataset([dataset]);\n\n const imagePlaneModule = metadataProvider.get(\n \"imagePlaneModule\",\n imageIds[0]\n );\n\n const generalSeriesModule = metadataProvider.get(\n \"generalSeriesModule\",\n imageIds[0]\n );\n\n const SeriesInstanceUID = generalSeriesModule.seriesInstanceUID;\n\n if (!imagePlaneModule) {\n console.warn(\"Insufficient metadata, imagePlaneModule missing.\");\n }\n\n const ImageOrientationPatient = Array.isArray(imagePlaneModule.rowCosines)\n ? [...imagePlaneModule.rowCosines, ...imagePlaneModule.columnCosines]\n : [\n imagePlaneModule.rowCosines.x,\n imagePlaneModule.rowCosines.y,\n imagePlaneModule.rowCosines.z,\n imagePlaneModule.columnCosines.x,\n imagePlaneModule.columnCosines.y,\n imagePlaneModule.columnCosines.z\n ];\n\n // Get IOP from ref series, compute supported orientations:\n const validOrientations = getValidOrientations(ImageOrientationPatient);\n\n const sliceLength = multiframe.Columns * multiframe.Rows;\n const segMetadata = getSegmentMetadata(multiframe, SeriesInstanceUID);\n\n const TransferSyntaxUID = multiframe._meta.TransferSyntaxUID.Value[0];\n\n let pixelData;\n let pixelDataChunks;\n\n if (TransferSyntaxUID === \"1.2.840.10008.1.2.5\") {\n const rleEncodedFrames = Array.isArray(multiframe.PixelData)\n ? multiframe.PixelData\n : [multiframe.PixelData];\n\n pixelData = decode(\n rleEncodedFrames,\n multiframe.Rows,\n multiframe.Columns\n );\n\n if (multiframe.BitsStored === 1) {\n console.warn(\"No implementation for rle + bitbacking.\");\n\n return;\n }\n\n // Todo: need to test this with rle data\n pixelDataChunks = [pixelData];\n } else {\n pixelDataChunks = unpackPixelData(multiframe, { maxBytesPerChunk });\n\n if (!pixelDataChunks) {\n throw new Error(\"Fractional segmentations are not yet supported\");\n }\n }\n\n const orientation = checkOrientation(\n multiframe,\n validOrientations,\n [imagePlaneModule.rows, imagePlaneModule.columns, imageIds.length],\n tolerance\n );\n\n // Pre-compute the sop UID to imageId index map so that in the for loop\n // we don't have to call metadataProvider.get() for each imageId over\n // and over again.\n const sopUIDImageIdIndexMap = imageIds.reduce((acc, imageId) => {\n const { sopInstanceUid } = metadataProvider.get(\n \"generalImageModule\",\n imageId\n );\n acc[sopInstanceUid] = imageId;\n return acc;\n }, {});\n\n let overlapping = false;\n if (!skipOverlapping) {\n overlapping = checkSEGsOverlapping(\n pixelDataChunks,\n multiframe,\n imageIds,\n validOrientations,\n metadataProvider,\n tolerance,\n TypedArrayConstructor,\n sopUIDImageIdIndexMap\n );\n }\n\n let insertFunction;\n\n switch (orientation) {\n case \"Planar\":\n if (overlapping) {\n insertFunction = insertOverlappingPixelDataPlanar;\n } else {\n insertFunction = insertPixelDataPlanar;\n }\n break;\n case \"Perpendicular\":\n //insertFunction = insertPixelDataPerpendicular;\n throw new Error(\n \"Segmentations orthogonal to the acquisition plane of the source data are not yet supported.\"\n );\n case \"Oblique\":\n throw new Error(\n \"Segmentations oblique to the acquisition plane of the source data are not yet supported.\"\n );\n }\n\n /* if SEGs are overlapping:\n 1) the labelmapBuffer will contain M volumes which have non-overlapping segments;\n 2) segmentsOnFrame will have M * numberOfFrames values to track in which labelMap are the segments;\n 3) insertFunction will return the number of LabelMaps\n 4) generateToolState return is an array*/\n\n const segmentsOnFrameArray = [];\n segmentsOnFrameArray[0] = [];\n const segmentsOnFrame = [];\n\n const arrayBufferLength =\n sliceLength * imageIds.length * TypedArrayConstructor.BYTES_PER_ELEMENT;\n const labelmapBufferArray = [];\n labelmapBufferArray[0] = new ArrayBuffer(arrayBufferLength);\n\n // Precompute the indices and metadata so that we don't have to call\n // a function for each imageId in the for loop.\n const imageIdMaps = imageIds.reduce(\n (acc, curr, index) => {\n acc.indices[curr] = index;\n acc.metadata[curr] = metadataProvider.get(\"instance\", curr);\n return acc;\n },\n { indices: {}, metadata: {} }\n );\n\n // This is the centroid calculation for each segment Index, the data structure\n // is a Map with key = segmentIndex and value = {imageIdIndex: centroid, ...}\n // later on we will use this data structure to calculate the centroid of the\n // segment in the labelmapBuffer\n const segmentsPixelIndices = new Map();\n\n await insertFunction(\n segmentsOnFrame,\n segmentsOnFrameArray,\n labelmapBufferArray,\n pixelDataChunks,\n multiframe,\n imageIds,\n validOrientations,\n metadataProvider,\n tolerance,\n TypedArrayConstructor,\n segmentsPixelIndices,\n sopUIDImageIdIndexMap,\n imageIdMaps,\n eventTarget,\n triggerEvent\n );\n\n // calculate the centroid of each segment\n const centroidXYZ = new Map();\n\n segmentsPixelIndices.forEach((imageIdIndexBufferIndex, segmentIndex) => {\n const { xAcc, yAcc, zAcc, count } = calculateCentroid(\n imageIdIndexBufferIndex,\n multiframe\n );\n\n centroidXYZ.set(segmentIndex, {\n x: Math.floor(xAcc / count),\n y: Math.floor(yAcc / count),\n z: Math.floor(zAcc / count)\n });\n });\n\n return {\n labelmapBufferArray,\n segMetadata,\n segmentsOnFrame,\n segmentsOnFrameArray,\n centroids: centroidXYZ\n };\n}\n\n// function insertPixelDataPerpendicular(\n// segmentsOnFrame,\n// labelmapBuffer,\n// pixelData,\n// multiframe,\n// imageIds,\n// validOrientations,\n// metadataProvider\n// ) {\n// const {\n// SharedFunctionalGroupsSequence,\n// PerFrameFunctionalGroupsSequence,\n// Rows,\n// Columns\n// } = multiframe;\n\n// const firstImagePlaneModule = metadataProvider.get(\n// \"imagePlaneModule\",\n// imageIds[0]\n// );\n\n// const lastImagePlaneModule = metadataProvider.get(\n// \"imagePlaneModule\",\n// imageIds[imageIds.length - 1]\n// );\n\n// console.log(firstImagePlaneModule);\n// console.log(lastImagePlaneModule);\n\n// const corners = [\n// ...getCorners(firstImagePlaneModule),\n// ...getCorners(lastImagePlaneModule)\n// ];\n\n// console.log(`corners:`);\n// console.log(corners);\n\n// const indexToWorld = mat4.create();\n\n// const ippFirstFrame = firstImagePlaneModule.imagePositionPatient;\n// const rowCosines = Array.isArray(firstImagePlaneModule.rowCosines)\n// ? [...firstImagePlaneModule.rowCosines]\n// : [\n// firstImagePlaneModule.rowCosines.x,\n// firstImagePlaneModule.rowCosines.y,\n// firstImagePlaneModule.rowCosines.z\n// ];\n\n// const columnCosines = Array.isArray(firstImagePlaneModule.columnCosines)\n// ? [...firstImagePlaneModule.columnCosines]\n// : [\n// firstImagePlaneModule.columnCosines.x,\n// firstImagePlaneModule.columnCosines.y,\n// firstImagePlaneModule.columnCosines.z\n// ];\n\n// const { pixelSpacing } = firstImagePlaneModule;\n\n// mat4.set(\n// indexToWorld,\n// // Column 1\n// 0,\n// 0,\n// 0,\n// ippFirstFrame[0],\n// // Column 2\n// 0,\n// 0,\n// 0,\n// ippFirstFrame[1],\n// // Column 3\n// 0,\n// 0,\n// 0,\n// ippFirstFrame[2],\n// // Column 4\n// 0,\n// 0,\n// 0,\n// 1\n// );\n\n// // TODO -> Get origin and (x,y,z) increments to build a translation matrix:\n// // TODO -> Equation C.7.6.2.1-1\n\n// // | cx*di rx* Xx 0 | |x|\n// // | cy*di ry Xy 0 | |y|\n// // | cz*di rz Xz 0 | |z|\n// // | tx ty tz 1 | |1|\n\n// // const [\n// // 0, 0 , 0 , 0,\n// // 0, 0 , 0 , 0,\n// // 0, 0 , 0 , 0,\n// // ipp[0], ipp[1] , ipp[2] , 1,\n// // ]\n\n// // Each frame:\n\n// // Find which corner the first voxel lines up with (one of 8 corners.)\n\n// // Find how i,j,k orient with respect to source volume.\n// // Go through each frame, find location in source to start, and whether to increment +/ix,+/-y,+/-z\n// // through each voxel.\n\n// // [1,0,0,0,1,0]\n\n// // const [\n\n// // ]\n\n// // Invert transformation matrix to get worldToIndex\n\n// // Apply world to index on each point to fill up the matrix.\n\n// // const sharedImageOrientationPatient = SharedFunctionalGroupsSequence.PlaneOrientationSequence\n// // ? SharedFunctionalGroupsSequence.PlaneOrientationSequence\n// // .ImageOrientationPatient\n// // : undefined;\n// // const sliceLength = Columns * Rows;\n// }\n\n// function getCorners(imagePlaneModule) {\n// // console.log(imagePlaneModule);\n\n// const {\n// rows,\n// columns,\n// rowCosines,\n// columnCosines,\n// imagePositionPatient: ipp,\n// rowPixelSpacing,\n// columnPixelSpacing\n// } = imagePlaneModule;\n\n// const rowLength = columns * columnPixelSpacing;\n// const columnLength = rows * rowPixelSpacing;\n\n// const entireRowVector = [\n// rowLength * columnCosines[0],\n// rowLength * columnCosines[1],\n// rowLength * columnCosines[2]\n// ];\n\n// const entireColumnVector = [\n// columnLength * rowCosines[0],\n// columnLength * rowCosines[1],\n// columnLength * rowCosines[2]\n// ];\n\n// const topLeft = [ipp[0], ipp[1], ipp[2]];\n// const topRight = [\n// topLeft[0] + entireRowVector[0],\n// topLeft[1] + entireRowVector[1],\n// topLeft[2] + entireRowVector[2]\n// ];\n// const bottomLeft = [\n// topLeft[0] + entireColumnVector[0],\n// topLeft[1] + entireColumnVector[1],\n// topLeft[2] + entireColumnVector[2]\n// ];\n\n// const bottomRight = [\n// bottomLeft[0] + entireRowVector[0],\n// bottomLeft[1] + entireRowVector[1],\n// bottomLeft[2] + entireRowVector[2]\n// ];\n\n// return [topLeft, topRight, bottomLeft, bottomRight];\n// }\n\n/**\n * Find the reference frame of the segmentation frame in the source data.\n *\n * @param {Object} multiframe dicom metadata\n * @param {Int} frameSegment frame dicom index\n * @param {String[]} imageIds A list of imageIds.\n * @param {Object} sopUIDImageIdIndexMap A map of SOPInstanceUID to imageId\n * @param {Float} tolerance The tolerance parameter\n *\n * @returns {String} Returns the imageId\n */\nfunction findReferenceSourceImageId(\n multiframe,\n frameSegment,\n imageIds,\n metadataProvider,\n tolerance,\n sopUIDImageIdIndexMap\n) {\n let imageId = undefined;\n\n if (!multiframe) {\n return imageId;\n }\n\n const {\n FrameOfReferenceUID,\n PerFrameFunctionalGroupsSequence,\n SourceImageSequence,\n ReferencedSeriesSequence\n } = multiframe;\n\n if (\n !PerFrameFunctionalGroupsSequence ||\n PerFrameFunctionalGroupsSequence.length === 0\n ) {\n return imageId;\n }\n\n const PerFrameFunctionalGroup =\n PerFrameFunctionalGroupsSequence[frameSegment];\n\n if (!PerFrameFunctionalGroup) {\n return imageId;\n }\n\n let frameSourceImageSequence = undefined;\n if (SourceImageSequence && SourceImageSequence.length !== 0) {\n frameSourceImageSequence = SourceImageSequence[frameSegment];\n } else if (PerFrameFunctionalGroup.DerivationImageSequence) {\n let DerivationImageSequence =\n PerFrameFunctionalGroup.DerivationImageSequence;\n if (Array.isArray(DerivationImageSequence)) {\n if (DerivationImageSequence.length !== 0) {\n DerivationImageSequence = DerivationImageSequence[0];\n } else {\n DerivationImageSequence = undefined;\n }\n }\n\n if (DerivationImageSequence) {\n frameSourceImageSequence =\n DerivationImageSequence.SourceImageSequence;\n if (Array.isArray(frameSourceImageSequence)) {\n if (frameSourceImageSequence.length !== 0) {\n frameSourceImageSequence = frameSourceImageSequence[0];\n } else {\n frameSourceImageSequence = undefined;\n }\n }\n }\n }\n\n if (frameSourceImageSequence) {\n imageId = getImageIdOfSourceImageBySourceImageSequence(\n frameSourceImageSequence,\n sopUIDImageIdIndexMap\n );\n }\n\n if (imageId === undefined && ReferencedSeriesSequence) {\n const referencedSeriesSequence = Array.isArray(ReferencedSeriesSequence)\n ? ReferencedSeriesSequence[0]\n : ReferencedSeriesSequence;\n const ReferencedSeriesInstanceUID =\n referencedSeriesSequence.SeriesInstanceUID;\n\n imageId = getImageIdOfSourceImagebyGeometry(\n ReferencedSeriesInstanceUID,\n FrameOfReferenceUID,\n PerFrameFunctionalGroup,\n imageIds,\n metadataProvider,\n tolerance\n );\n }\n\n return imageId;\n}\n\n/**\n * Checks if there is any overlapping segmentations.\n * @returns {boolean} Returns a flag if segmentations overlapping\n */\n\nfunction checkSEGsOverlapping(\n pixelData,\n multiframe,\n imageIds,\n validOrientations,\n metadataProvider,\n tolerance,\n TypedArrayConstructor,\n sopUIDImageIdIndexMap\n) {\n const {\n SharedFunctionalGroupsSequence,\n PerFrameFunctionalGroupsSequence,\n SegmentSequence,\n Rows,\n Columns\n } = multiframe;\n\n let numberOfSegs = SegmentSequence.length;\n if (numberOfSegs < 2) {\n return false;\n }\n\n const sharedImageOrientationPatient =\n SharedFunctionalGroupsSequence.PlaneOrientationSequence\n ? SharedFunctionalGroupsSequence.PlaneOrientationSequence\n .ImageOrientationPatient\n : undefined;\n const sliceLength = Columns * Rows;\n const groupsLen = PerFrameFunctionalGroupsSequence.length;\n\n /** sort groupsLen to have all the segments for each frame in an array\n * frame 2 : 1, 2\n * frame 4 : 1, 3\n * frame 5 : 4\n */\n\n let frameSegmentsMapping = new Map();\n for (let frameSegment = 0; frameSegment < groupsLen; ++frameSegment) {\n const segmentIndex = getSegmentIndex(multiframe, frameSegment);\n if (segmentIndex === undefined) {\n console.warn(\n \"Could not retrieve the segment index for frame segment \" +\n frameSegment +\n \", skipping this frame.\"\n );\n continue;\n }\n\n const imageId = findReferenceSourceImageId(\n multiframe,\n frameSegment,\n imageIds,\n metadataProvider,\n tolerance,\n sopUIDImageIdIndexMap\n );\n\n if (!imageId) {\n console.warn(\n \"Image not present in stack, can't import frame : \" +\n frameSegment +\n \".\"\n );\n continue;\n }\n\n const imageIdIndex = imageIds.findIndex(element => element === imageId);\n\n if (frameSegmentsMapping.has(imageIdIndex)) {\n let segmentArray = frameSegmentsMapping.get(imageIdIndex);\n if (!segmentArray.includes(frameSegment)) {\n segmentArray.push(frameSegment);\n frameSegmentsMapping.set(imageIdIndex, segmentArray);\n }\n } else {\n frameSegmentsMapping.set(imageIdIndex, [frameSegment]);\n }\n }\n\n for (let [, role] of frameSegmentsMapping.entries()) {\n let temp2DArray = new TypedArrayConstructor(sliceLength).fill(0);\n\n for (let i = 0; i < role.length; ++i) {\n const frameSegment = role[i];\n\n const PerFrameFunctionalGroups =\n PerFrameFunctionalGroupsSequence[frameSegment];\n\n const ImageOrientationPatientI =\n sharedImageOrientationPatient ||\n PerFrameFunctionalGroups.PlaneOrientationSequence\n .ImageOrientationPatient;\n\n const view = readFromUnpackedChunks(\n pixelData,\n frameSegment * sliceLength,\n sliceLength\n );\n\n const pixelDataI2D = ndarray(view, [Rows, Columns]);\n\n const alignedPixelDataI = alignPixelDataWithSourceData(\n pixelDataI2D,\n ImageOrientationPatientI,\n validOrientations,\n tolerance\n );\n\n if (!alignedPixelDataI) {\n console.warn(\n \"Individual SEG frames are out of plane with respect to the first SEG frame, this is not yet supported, skipping this frame.\"\n );\n continue;\n }\n\n const data = alignedPixelDataI.data;\n for (let j = 0, len = data.length; j < len; ++j) {\n if (data[j] !== 0) {\n temp2DArray[j]++;\n if (temp2DArray[j] > 1) {\n return true;\n }\n }\n }\n }\n }\n\n return false;\n}\n\nfunction insertOverlappingPixelDataPlanar(\n segmentsOnFrame,\n segmentsOnFrameArray,\n labelmapBufferArray,\n pixelData,\n multiframe,\n imageIds,\n validOrientations,\n metadataProvider,\n tolerance,\n TypedArrayConstructor,\n segmentsPixelIndices,\n sopUIDImageIdIndexMap\n) {\n const {\n SharedFunctionalGroupsSequence,\n PerFrameFunctionalGroupsSequence,\n Rows,\n Columns\n } = multiframe;\n\n const sharedImageOrientationPatient =\n SharedFunctionalGroupsSequence.PlaneOrientationSequence\n ? SharedFunctionalGroupsSequence.PlaneOrientationSequence\n .ImageOrientationPatient\n : undefined;\n const sliceLength = Columns * Rows;\n const arrayBufferLength =\n sliceLength * imageIds.length * TypedArrayConstructor.BYTES_PER_ELEMENT;\n // indicate the number of labelMaps\n let M = 1;\n\n // indicate the current labelMap array index;\n let m = 0;\n\n // temp array for checking overlaps\n let tempBuffer = labelmapBufferArray[m].slice(0);\n\n // temp list for checking overlaps\n let tempSegmentsOnFrame = cloneDeep(segmentsOnFrameArray[m]);\n\n /** split overlapping SEGs algorithm for each segment:\n * A) copy the labelmapBuffer in the array with index 0\n * B) add the segment pixel per pixel on the copied buffer from (A)\n * C) if no overlap, copy the results back on the orignal array from (A)\n * D) if overlap, repeat increasing the index m up to M (if out of memory, add new buffer in the array and M++);\n */\n\n let numberOfSegs = multiframe.SegmentSequence.length;\n for (\n let segmentIndexToProcess = 1;\n segmentIndexToProcess <= numberOfSegs;\n ++segmentIndexToProcess\n ) {\n for (\n let i = 0, groupsLen = PerFrameFunctionalGroupsSequence.length;\n i < groupsLen;\n ++i\n ) {\n const PerFrameFunctionalGroups =\n PerFrameFunctionalGroupsSequence[i];\n\n const segmentIndex = getSegmentIndex(multiframe, i);\n if (segmentIndex === undefined) {\n throw new Error(\n \"Could not retrieve the segment index. Aborting segmentation loading.\"\n );\n }\n\n if (segmentIndex !== segmentIndexToProcess) {\n continue;\n }\n\n const ImageOrientationPatientI =\n sharedImageOrientationPatient ||\n PerFrameFunctionalGroups.PlaneOrientationSequence\n .ImageOrientationPatient;\n\n // Since we moved to the chunks approach, we need to read the data\n // and handle scenarios where the portion of data is in one chunk\n // and the other portion is in another chunk\n const view = readFromUnpackedChunks(\n pixelData,\n i * sliceLength,\n sliceLength\n );\n\n const pixelDataI2D = ndarray(view, [Rows, Columns]);\n\n const alignedPixelDataI = alignPixelDataWithSourceData(\n pixelDataI2D,\n ImageOrientationPatientI,\n validOrientations,\n tolerance\n );\n\n if (!alignedPixelDataI) {\n throw new Error(\n \"Individual SEG frames are out of plane with respect to the first SEG frame. \" +\n \"This is not yet supported. Aborting segmentation loading.\"\n );\n }\n\n const imageId = findReferenceSourceImageId(\n multiframe,\n i,\n imageIds,\n metadataProvider,\n tolerance,\n sopUIDImageIdIndexMap\n );\n\n if (!imageId) {\n console.warn(\n \"Image not present in stack, can't import frame : \" +\n i +\n \".\"\n );\n continue;\n }\n\n const sourceImageMetadata = metadataProvider.get(\n \"instance\",\n imageId\n );\n if (\n Rows !== sourceImageMetadata.Rows ||\n Columns !== sourceImageMetadata.Columns\n ) {\n throw new Error(\n \"Individual SEG frames have different geometry dimensions (Rows and Columns) \" +\n \"respect to the source image reference frame. This is not yet supported. \" +\n \"Aborting segmentation loading. \"\n );\n }\n\n const imageIdIndex = imageIds.findIndex(\n element => element === imageId\n );\n const byteOffset =\n sliceLength *\n imageIdIndex *\n TypedArrayConstructor.BYTES_PER_ELEMENT;\n\n const labelmap2DView = new TypedArrayConstructor(\n tempBuffer,\n byteOffset,\n sliceLength\n );\n\n const data = alignedPixelDataI.data;\n\n let segmentOnFrame = false;\n for (let j = 0, len = alignedPixelDataI.data.length; j < len; ++j) {\n if (data[j]) {\n if (labelmap2DView[j] !== 0) {\n m++;\n if (m >= M) {\n labelmapBufferArray[m] = new ArrayBuffer(\n arrayBufferLength\n );\n segmentsOnFrameArray[m] = [];\n M++;\n }\n tempBuffer = labelmapBufferArray[m].slice(0);\n tempSegmentsOnFrame = cloneDeep(\n segmentsOnFrameArray[m]\n );\n\n i = 0;\n break;\n } else {\n labelmap2DView[j] = segmentIndex;\n segmentOnFrame = true;\n }\n }\n }\n\n if (segmentOnFrame) {\n if (!tempSegmentsOnFrame[imageIdIndex]) {\n tempSegmentsOnFrame[imageIdIndex] = [];\n }\n\n tempSegmentsOnFrame[imageIdIndex].push(segmentIndex);\n\n if (!segmentsOnFrame[imageIdIndex]) {\n segmentsOnFrame[imageIdIndex] = [];\n }\n\n segmentsOnFrame[imageIdIndex].push(segmentIndex);\n }\n }\n\n labelmapBufferArray[m] = tempBuffer.slice(0);\n segmentsOnFrameArray[m] = cloneDeep(tempSegmentsOnFrame);\n\n // reset temp variables/buffers for new segment\n m = 0;\n tempBuffer = labelmapBufferArray[m].slice(0);\n tempSegmentsOnFrame = cloneDeep(segmentsOnFrameArray[m]);\n }\n}\n\nconst getSegmentIndex = (multiframe, frame) => {\n const { PerFrameFunctionalGroupsSequence, SharedFunctionalGroupsSequence } =\n multiframe;\n const PerFrameFunctionalGroups = PerFrameFunctionalGroupsSequence[frame];\n return PerFrameFunctionalGroups &&\n PerFrameFunctionalGroups.SegmentIdentificationSequence\n ? PerFrameFunctionalGroups.SegmentIdentificationSequence\n .ReferencedSegmentNumber\n : SharedFunctionalGroupsSequence.SegmentIdentificationSequence\n ? SharedFunctionalGroupsSequence.SegmentIdentificationSequence\n .ReferencedSegmentNumber\n : undefined;\n};\n\nfunction insertPixelDataPlanar(\n segmentsOnFrame,\n segmentsOnFrameArray,\n labelmapBufferArray,\n pixelData,\n multiframe,\n imageIds,\n validOrientations,\n metadataProvider,\n tolerance,\n TypedArrayConstructor,\n segmentsPixelIndices,\n sopUIDImageIdIndexMap,\n imageIdMaps,\n eventTarget,\n triggerEvent\n) {\n const {\n SharedFunctionalGroupsSequence,\n PerFrameFunctionalGroupsSequence,\n Rows,\n Columns\n } = multiframe;\n\n const sharedImageOrientationPatient =\n SharedFunctionalGroupsSequence.PlaneOrientationSequence\n ? SharedFunctionalGroupsSequence.PlaneOrientationSequence\n .ImageOrientationPatient\n : undefined;\n const sliceLength = Columns * Rows;\n\n let i = 0;\n const groupsLen = PerFrameFunctionalGroupsSequence.length;\n const chunkSize = Math.ceil(groupsLen / 10); // 10% of total length\n\n const shouldTriggerEvent = triggerEvent && eventTarget;\n\n // Below, we chunk the processing of the frames to avoid blocking the main thread\n // if the segmentation is large. We also use a promise to allow the caller to\n // wait for the processing to finish.\n return new Promise(resolve => {\n function processInChunks() {\n // process one chunk\n for (let end = Math.min(i + chunkSize, groupsLen); i < end; ++i) {\n const PerFrameFunctionalGroups =\n PerFrameFunctionalGroupsSequence[i];\n\n const ImageOrientationPatientI =\n sharedImageOrientationPatient ||\n PerFrameFunctionalGroups.PlaneOrientationSequence\n .ImageOrientationPatient;\n\n const view = readFromUnpackedChunks(\n pixelData,\n i * sliceLength,\n sliceLength\n );\n\n const pixelDataI2D = ndarray(view, [Rows, Columns]);\n\n const alignedPixelDataI = alignPixelDataWithSourceData(\n pixelDataI2D,\n ImageOrientationPatientI,\n validOrientations,\n tolerance\n );\n\n if (!alignedPixelDataI) {\n throw new Error(\n \"Individual SEG frames are out of plane with respect to the first SEG frame. \" +\n \"This is not yet supported. Aborting segmentation loading.\"\n );\n }\n\n const segmentIndex = getSegmentIndex(multiframe, i);\n\n if (segmentIndex === undefined) {\n throw new Error(\n \"Could not retrieve the segment index. Aborting segmentation loading.\"\n );\n }\n\n if (!segmentsPixelIndices.has(segmentIndex)) {\n segmentsPixelIndices.set(segmentIndex, {});\n }\n\n const imageId = findReferenceSourceImageId(\n multiframe,\n i,\n imageIds,\n metadataProvider,\n tolerance,\n sopUIDImageIdIndexMap\n );\n\n if (!imageId) {\n console.warn(\n \"Image not present in stack, can't import frame : \" +\n i +\n \".\"\n );\n continue;\n }\n\n const sourceImageMetadata = imageIdMaps.metadata[imageId];\n if (\n Rows !== sourceImageMetadata.Rows ||\n Columns !== sourceImageMetadata.Columns\n ) {\n throw new Error(\n \"Individual SEG frames have different geometry dimensions (Rows and Columns) \" +\n \"respect to the source image reference frame. This is not yet supported. \" +\n \"Aborting segmentation loading. \"\n );\n }\n\n const imageIdIndex = imageIdMaps.indices[imageId];\n\n const byteOffset =\n sliceLength *\n imageIdIndex *\n TypedArrayConstructor.BYTES_PER_ELEMENT;\n\n const labelmap2DView = new TypedArrayConstructor(\n labelmapBufferArray[0],\n byteOffset,\n sliceLength\n );\n\n const data = alignedPixelDataI.data;\n\n const indexCache = [];\n for (\n let j = 0, len = alignedPixelDataI.data.length;\n j < len;\n ++j\n ) {\n if (data[j]) {\n for (let x = j; x < len; ++x) {\n if (data[x]) {\n labelmap2DView[x] = segmentIndex;\n indexCache.push(x);\n }\n }\n\n if (!segmentsOnFrame[imageIdIndex]) {\n segmentsOnFrame[imageIdIndex] = [];\n }\n\n segmentsOnFrame[imageIdIndex].push(segmentIndex);\n\n break;\n }\n }\n\n const segmentIndexObject =\n segmentsPixelIndices.get(segmentIndex);\n segmentIndexObject[imageIdIndex] = indexCache;\n segmentsPixelIndices.set(segmentIndex, segmentIndexObject);\n }\n\n // trigger an event after each chunk\n if (shouldTriggerEvent) {\n const percentComplete = Math.round((i / groupsLen) * 100);\n triggerEvent(eventTarget, Events.SEGMENTATION_LOAD_PROGRESS, {\n percentComplete\n });\n }\n\n // schedule next chunk\n if (i < groupsLen) {\n setTimeout(processInChunks, 0);\n } else {\n // resolve the Promise when all chunks have been processed\n resolve();\n }\n }\n\n processInChunks();\n });\n}\n\nfunction checkOrientation(\n multiframe,\n validOrientations,\n sourceDataDimensions,\n tolerance\n) {\n const { SharedFunctionalGroupsSequence, PerFrameFunctionalGroupsSequence } =\n multiframe;\n\n const sharedImageOrientationPatient =\n SharedFunctionalGroupsSequence.PlaneOrientationSequence\n ? SharedFunctionalGroupsSequence.PlaneOrientationSequence\n .ImageOrientationPatient\n : undefined;\n\n // Check if in plane.\n const PerFrameFunctionalGroups = PerFrameFunctionalGroupsSequence[0];\n\n const iop =\n sharedImageOrientationPatient ||\n PerFrameFunctionalGroups.PlaneOrientationSequence\n .ImageOrientationPatient;\n\n const inPlane = validOrientations.some(operation =>\n compareArrays(iop, operation, tolerance)\n );\n\n if (inPlane) {\n return \"Planar\";\n }\n\n if (\n checkIfPerpendicular(iop, validOrientations[0], tolerance) &&\n sourceDataDimensions.includes(multiframe.Rows) &&\n sourceDataDimensions.includes(multiframe.Columns)\n ) {\n // Perpendicular and fits on same grid.\n return \"Perpendicular\";\n }\n\n return \"Oblique\";\n}\n\n/**\n * checkIfPerpendicular - Returns true if iop1 and iop2 are perpendicular\n * within a tolerance.\n *\n * @param {Number[6]} iop1 An ImageOrientationPatient array.\n * @param {Number[6]} iop2 An ImageOrientationPatient array.\n * @param {Number} tolerance.\n * @return {Boolean} True if iop1 and iop2 are equal.\n */\nfunction checkIfPerpendicular(iop1, iop2, tolerance) {\n const absDotColumnCosines = Math.abs(\n iop1[0] * iop2[0] + iop1[1] * iop2[1] + iop1[2] * iop2[2]\n );\n const absDotRowCosines = Math.abs(\n iop1[3] * iop2[3] + iop1[4] * iop2[4] + iop1[5] * iop2[5]\n );\n\n return (\n (absDotColumnCosines < tolerance ||\n Math.abs(absDotColumnCosines - 1) < tolerance) &&\n (absDotRowCosines < tolerance ||\n Math.abs(absDotRowCosines - 1) < tolerance)\n );\n}\n\n/**\n * unpackPixelData - Unpacks bit packed pixelData if the Segmentation is BINARY.\n *\n * @param {Object} multiframe The multiframe dataset.\n * @param {Object} options Options for the unpacking.\n * @return {Uint8Array} The unpacked pixelData.\n */\nfunction unpackPixelData(multiframe, options) {\n const segType = multiframe.SegmentationType;\n\n let data;\n if (Array.isArray(multiframe.PixelData)) {\n data = multiframe.PixelData[0];\n } else {\n data = multiframe.PixelData;\n }\n\n if (data === undefined) {\n log.error(\"This segmentation pixeldata is undefined.\");\n }\n\n if (segType === \"BINARY\") {\n // For extreme big data, we can't unpack the data at once and we need to\n // chunk it and unpack each chunk separately.\n // MAX 2GB is the limit right now to allocate a buffer\n return getUnpackedChunks(data, options.maxBytesPerChunk);\n }\n\n const pixelData = new Uint8Array(data);\n\n const max = multiframe.MaximumFractionalValue;\n const onlyMaxAndZero =\n pixelData.find(element => element !== 0 && element !== max) ===\n undefined;\n\n if (!onlyMaxAndZero) {\n // This is a fractional segmentation, which is not currently supported.\n return;\n }\n\n log.warn(\n \"This segmentation object is actually binary... processing as such.\"\n );\n\n return pixelData;\n}\n\nfunction getUnpackedChunks(data, maxBytesPerChunk) {\n var bitArray = new Uint8Array(data);\n var chunks = [];\n\n var maxBitsPerChunk = maxBytesPerChunk * 8;\n var numberOfChunks = Math.ceil((bitArray.length * 8) / maxBitsPerChunk);\n\n for (var i = 0; i < numberOfChunks; i++) {\n var startBit = i * maxBitsPerChunk;\n var endBit = Math.min(startBit + maxBitsPerChunk, bitArray.length * 8);\n\n var startByte = Math.floor(startBit / 8);\n var endByte = Math.ceil(endBit / 8);\n\n var chunk = bitArray.slice(startByte, endByte);\n var unpackedChunk = BitArray.unpack(chunk);\n\n chunks.push(unpackedChunk);\n }\n\n return chunks;\n}\n\n/**\n * getImageIdOfSourceImageBySourceImageSequence - Returns the Cornerstone imageId of the source image.\n *\n * @param {Object} SourceImageSequence Sequence describing the source image.\n * @param {String[]} imageIds A list of imageIds.\n * @param {Object} sopUIDImageIdIndexMap A map of SOPInstanceUIDs to imageIds.\n * @return {String} The corresponding imageId.\n */\nfunction getImageIdOfSourceImageBySourceImageSequence(\n SourceImageSequence,\n sopUIDImageIdIndexMap\n) {\n const { ReferencedSOPInstanceUID, ReferencedFrameNumber } =\n SourceImageSequence;\n\n return ReferencedFrameNumber\n ? getImageIdOfReferencedFrame(\n ReferencedSOPInstanceUID,\n ReferencedFrameNumber,\n sopUIDImageIdIndexMap\n )\n : sopUIDImageIdIndexMap[ReferencedSOPInstanceUID];\n}\n\n/**\n * getImageIdOfSourceImagebyGeometry - Returns the Cornerstone imageId of the source image.\n *\n * @param {String} ReferencedSeriesInstanceUID Referenced series of the source image.\n * @param {String} FrameOfReferenceUID Frame of reference.\n * @param {Object} PerFrameFunctionalGroup Sequence describing segmentation reference attributes per frame.\n * @param {String[]} imageIds A list of imageIds.\n * @param {Object} sopUIDImageIdIndexMap A map of SOPInstanceUIDs to imageIds.\n * @param {Float} tolerance The tolerance parameter\n *\n * @return {String} The corresponding imageId.\n */\nfunction getImageIdOfSourceImagebyGeometry(\n ReferencedSeriesInstanceUID,\n FrameOfReferenceUID,\n PerFrameFunctionalGroup,\n imageIds,\n metadataProvider,\n tolerance\n) {\n if (\n ReferencedSeriesInstanceUID === undefined ||\n PerFrameFunctionalGroup.PlanePositionSequence === undefined ||\n PerFrameFunctionalGroup.PlanePositionSequence[0] === undefined ||\n PerFrameFunctionalGroup.PlanePositionSequence[0]\n .ImagePositionPatient === undefined\n ) {\n return undefined;\n }\n\n for (\n let imageIdsIndexc = 0;\n imageIdsIndexc < imageIds.length;\n ++imageIdsIndexc\n ) {\n const sourceImageMetadata = metadataProvider.get(\n \"instance\",\n imageIds[imageIdsIndexc]\n );\n\n if (\n sourceImageMetadata === undefined ||\n sourceImageMetadata.ImagePositionPatient === undefined ||\n sourceImageMetadata.FrameOfReferenceUID !== FrameOfReferenceUID ||\n sourceImageMetadata.SeriesInstanceUID !==\n ReferencedSeriesInstanceUID\n ) {\n continue;\n }\n\n if (\n compareArrays(\n PerFrameFunctionalGroup.PlanePositionSequence[0]\n .ImagePositionPatient,\n sourceImageMetadata.ImagePositionPatient,\n tolerance\n )\n ) {\n return imageIds[imageIdsIndexc];\n }\n }\n}\n\n/**\n * getImageIdOfReferencedFrame - Returns the imageId corresponding to the\n * specified sopInstanceUid and frameNumber for multi-frame images.\n *\n * @param {String} sopInstanceUid The sopInstanceUid of the desired image.\n * @param {Number} frameNumber The frame number.\n * @param {String} imageIds The list of imageIds.\n * @param {Object} sopUIDImageIdIndexMap A map of SOPInstanceUIDs to imageIds.\n * @return {String} The imageId that corresponds to the sopInstanceUid.\n */\nfunction getImageIdOfReferencedFrame(\n sopInstanceUid,\n frameNumber,\n sopUIDImageIdIndexMap\n) {\n const imageId = sopUIDImageIdIndexMap[sopInstanceUid];\n\n if (!imageId) {\n return;\n }\n\n const imageIdFrameNumber = Number(imageId.split(\"frame=\")[1]);\n\n return imageIdFrameNumber === frameNumber - 1 ? imageId : undefined;\n}\n\n/**\n * getValidOrientations - returns an array of valid orientations.\n *\n * @param {Number[6]} iop The row (0..2) an column (3..5) direction cosines.\n * @return {Number[8][6]} An array of valid orientations.\n */\nfunction getValidOrientations(iop) {\n const orientations = [];\n\n // [0, 1, 2]: 0, 0hf, 0vf\n // [3, 4, 5]: 90, 90hf, 90vf\n // [6, 7]: 180, 270\n\n orientations[0] = iop;\n orientations[1] = flipIOP.h(iop);\n orientations[2] = flipIOP.v(iop);\n\n const iop90 = rotateDirectionCosinesInPlane(iop, Math.PI / 2);\n\n orientations[3] = iop90;\n orientations[4] = flipIOP.h(iop90);\n orientations[5] = flipIOP.v(iop90);\n\n orientations[6] = rotateDirectionCosinesInPlane(iop, Math.PI);\n orientations[7] = rotateDirectionCosinesInPlane(iop, 1.5 * Math.PI);\n\n return orientations;\n}\n\n/**\n * alignPixelDataWithSourceData -\n *\n * @param {Ndarray} pixelData2D - The data to align.\n * @param {Number[6]} iop - The orientation of the image slice.\n * @param {Number[8][6]} orientations - An array of valid imageOrientationPatient values.\n * @param {Number} tolerance.\n * @return {Ndarray} The aligned pixelData.\n */\nfunction alignPixelDataWithSourceData(\n pixelData2D,\n iop,\n orientations,\n tolerance\n) {\n if (compareArrays(iop, orientations[0], tolerance)) {\n return pixelData2D;\n } else if (compareArrays(iop, orientations[1], tolerance)) {\n // Flipped vertically.\n\n // Undo Flip\n return flipMatrix2D.v(pixelData2D);\n } else if (compareArrays(iop, orientations[2], tolerance)) {\n // Flipped horizontally.\n\n // Unfo flip\n return flipMatrix2D.h(pixelData2D);\n } else if (compareArrays(iop, orientations[3], tolerance)) {\n //Rotated 90 degrees\n\n // Rotate back\n return rotateMatrix902D(pixelData2D);\n } else if (compareArrays(iop, orientations[4], tolerance)) {\n //Rotated 90 degrees and fliped horizontally.\n\n // Undo flip and rotate back.\n return rotateMatrix902D(flipMatrix2D.h(pixelData2D));\n } else if (compareArrays(iop, orientations[5], tolerance)) {\n // Rotated 90 degrees and fliped vertically\n\n // Unfo flip and rotate back.\n return rotateMatrix902D(flipMatrix2D.v(pixelData2D));\n } else if (compareArrays(iop, orientations[6], tolerance)) {\n // Rotated 180 degrees. // TODO -> Do this more effeciently, there is a 1:1 mapping like 90 degree rotation.\n\n return rotateMatrix902D(rotateMatrix902D(pixelData2D));\n } else if (compareArrays(iop, orientations[7], tolerance)) {\n // Rotated 270 degrees\n\n // Rotate back.\n return rotateMatrix902D(\n rotateMatrix902D(rotateMatrix902D(pixelData2D))\n );\n }\n}\n\n/**\n * compareArrays - Returns true if array1 and array2 are equal\n * within a tolerance.\n *\n * @param {Number[]} array1 - An array.\n * @param {Number[]} array2 - An array.\n * @param {Number} tolerance.\n * @return {Boolean} True if array1 and array2 are equal.\n */\nfunction compareArrays(array1, array2, tolerance) {\n if (array1.length != array2.length) {\n return false;\n }\n\n for (let i = 0; i < array1.length; ++i) {\n if (!nearlyEqual(array1[i], array2[i], tolerance)) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction getSegmentMetadata(multiframe, seriesInstanceUid) {\n const segmentSequence = multiframe.SegmentSequence;\n let data = [];\n\n if (Array.isArray(segmentSequence)) {\n data = [undefined, ...segmentSequence];\n } else {\n // Only one segment, will be stored as an object.\n data = [undefined, segmentSequence];\n }\n\n return {\n seriesInstanceUid,\n data\n };\n}\n\n/**\n * Reads a range of bytes from an array of ArrayBuffer chunks and\n * aggregate them into a new Uint8Array.\n *\n * @param {ArrayBuffer[]} chunks - An array of ArrayBuffer chunks.\n * @param {number} offset - The offset of the first byte to read.\n * @param {number} length - The number of bytes to read.\n * @returns {Uint8Array} A new Uint8Array containing the requested bytes.\n */\nfunction readFromUnpackedChunks(chunks, offset, length) {\n const mapping = getUnpackedOffsetAndLength(chunks, offset, length);\n\n // If all the data is in one chunk, we can just slice that chunk\n if (mapping.start.chunkIndex === mapping.end.chunkIndex) {\n return new Uint8Array(\n chunks[mapping.start.chunkIndex].buffer,\n mapping.start.offset,\n length\n );\n } else {\n // If the data spans multiple chunks, we need to create a new Uint8Array and copy the data from each chunk\n let result = new Uint8Array(length);\n let resultOffset = 0;\n\n for (\n let i = mapping.start.chunkIndex;\n i <= mapping.end.chunkIndex;\n i++\n ) {\n let start =\n i === mapping.start.chunkIndex ? mapping.start.offset : 0;\n let end =\n i === mapping.end.chunkIndex\n ? mapping.end.offset\n : chunks[i].length;\n\n result.set(\n new Uint8Array(chunks[i].buffer, start, end - start),\n resultOffset\n );\n resultOffset += end - start;\n }\n\n return result;\n }\n}\n\nfunction getUnpackedOffsetAndLength(chunks, offset, length) {\n var totalBytes = chunks.reduce((total, chunk) => total + chunk.length, 0);\n\n if (offset < 0 || offset + length > totalBytes) {\n throw new Error(\"Offset and length out of bounds\");\n }\n\n var startChunkIndex = 0;\n var startOffsetInChunk = offset;\n\n while (startOffsetInChunk >= chunks[startChunkIndex].length) {\n startOffsetInChunk -= chunks[startChunkIndex].length;\n startChunkIndex++;\n }\n\n var endChunkIndex = startChunkIndex;\n var endOffsetInChunk = startOffsetInChunk + length;\n\n while (endOffsetInChunk > chunks[endChunkIndex].length) {\n endOffsetInChunk -= chunks[endChunkIndex].length;\n endChunkIndex++;\n }\n\n return {\n start: { chunkIndex: startChunkIndex, offset: startOffsetInChunk },\n end: { chunkIndex: endChunkIndex, offset: endOffsetInChunk }\n };\n}\n\nfunction calculateCentroid(imageIdIndexBufferIndex, multiframe) {\n let xAcc = 0;\n let yAcc = 0;\n let zAcc = 0;\n let count = 0;\n\n for (const [imageIdIndex, bufferIndices] of Object.entries(\n imageIdIndexBufferIndex\n )) {\n const z = Number(imageIdIndex);\n\n if (!bufferIndices || bufferIndices.length === 0) {\n continue;\n }\n\n for (const bufferIndex of bufferIndices) {\n const y = Math.floor(bufferIndex / multiframe.Rows);\n const x = bufferIndex % multiframe.Rows;\n\n xAcc += x;\n yAcc += y;\n zAcc += z;\n\n count++;\n }\n }\n\n return { xAcc, yAcc, zAcc, count };\n}\n\nconst Segmentation = {\n generateSegmentation,\n generateToolState,\n fillSegmentation\n};\n\nexport default Segmentation;\nexport { fillSegmentation, generateSegmentation, generateToolState };\n","import MeasurementReport from \"./MeasurementReport\";\nimport Length from \"./Length\";\nimport FreehandRoi from \"./FreehandRoi\";\nimport Bidirectional from \"./Bidirectional\";\nimport EllipticalRoi from \"./EllipticalRoi\";\nimport CircleRoi from \"./CircleRoi\";\nimport ArrowAnnotate from \"./ArrowAnnotate\";\nimport CobbAngle from \"./CobbAngle\";\nimport Angle from \"./Angle\";\nimport RectangleRoi from \"./RectangleRoi\";\n// Segmentation\nimport Segmentation from \"./Segmentation\";\n\nconst CornerstoneSR = {\n Length,\n FreehandRoi,\n Bidirectional,\n EllipticalRoi,\n CircleRoi,\n ArrowAnnotate,\n MeasurementReport,\n CobbAngle,\n Angle,\n RectangleRoi\n};\n\nconst CornerstoneSEG = {\n Segmentation\n};\n\nexport { CornerstoneSR, CornerstoneSEG };\n","import Segmentation_3X from \"./Segmentation_3X\";\nimport Segmentation_4X from \"./Segmentation_4X\";\n\nconst Segmentation = {\n generateSegmentation,\n generateToolState,\n fillSegmentation\n};\n\nexport default Segmentation;\n\n/**\n * generateSegmentation - Generates a DICOM Segmentation object given cornerstoneTools data.\n *\n * @param {object[]} images An array of the cornerstone image objects.\n * @param {Object|Object[]} labelmaps3DorBrushData For 4.X: The cornerstone `Labelmap3D` object, or an array of objects.\n * For 3.X: the BrushData.\n * @param {number} cornerstoneToolsVersion The cornerstoneTools major version to map against.\n * @returns {Object}\n */\nfunction generateSegmentation(\n images,\n labelmaps3DorBrushData,\n options = { includeSliceSpacing: true },\n cornerstoneToolsVersion = 4\n) {\n if (cornerstoneToolsVersion === 4) {\n return Segmentation_4X.generateSegmentation(\n images,\n labelmaps3DorBrushData,\n options\n );\n }\n\n if (cornerstoneToolsVersion === 3) {\n return Segmentation_3X.generateSegmentation(\n images,\n labelmaps3DorBrushData,\n options\n );\n }\n\n console.warn(\n `No generateSegmentation adapater for cornerstone version ${cornerstoneToolsVersion}, exiting.`\n );\n}\n\n/**\n * generateToolState - Given a set of cornrstoneTools imageIds and a Segmentation buffer,\n * derive cornerstoneTools toolState and brush metadata.\n *\n * @param {string[]} imageIds An array of the imageIds.\n * @param {ArrayBuffer} arrayBuffer The SEG arrayBuffer.\n * @param {*} metadataProvider\n * @param {bool} skipOverlapping - skip checks for overlapping segs, default value false.\n * @param {number} tolerance - default value 1.e-3.\n * @param {number} cornerstoneToolsVersion - default value 4.\n *\n * @returns {Object} The toolState and an object from which the\n * segment metadata can be derived.\n */\nfunction generateToolState(\n imageIds,\n arrayBuffer,\n metadataProvider,\n skipOverlapping = false,\n tolerance = 1e-3,\n cornerstoneToolsVersion = 4\n) {\n if (cornerstoneToolsVersion === 4) {\n return Segmentation_4X.generateToolState(\n imageIds,\n arrayBuffer,\n metadataProvider,\n skipOverlapping,\n tolerance\n );\n }\n\n if (cornerstoneToolsVersion === 3) {\n return Segmentation_3X.generateToolState(\n imageIds,\n arrayBuffer,\n metadataProvider\n );\n }\n\n console.warn(\n `No generateToolState adapater for cornerstone version ${cornerstoneToolsVersion}, exiting.`\n );\n}\n\n/**\n * fillSegmentation - Fills a derived segmentation dataset with cornerstoneTools `LabelMap3D` data.\n *\n * @param {object[]} segmentation An empty segmentation derived dataset.\n * @param {Object|Object[]} inputLabelmaps3D The cornerstone `Labelmap3D` object, or an array of objects.\n * @param {Object} userOptions Options object to override default options.\n * @returns {Blob} description\n */\nfunction fillSegmentation(\n segmentation,\n inputLabelmaps3D,\n options = { includeSliceSpacing: true },\n cornerstoneToolsVersion = 4\n) {\n if (cornerstoneToolsVersion === 4) {\n return Segmentation_4X.fillSegmentation(\n segmentation,\n inputLabelmaps3D,\n options\n );\n }\n\n console.warn(\n `No generateSegmentation adapater for cornerstone version ${cornerstoneToolsVersion}, exiting.`\n );\n}\n","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.push(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.push(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n","export default \"Cornerstone3DTools@^0.1.0\";\n","// This is a custom coding scheme defined to store some annotations from Cornerstone.\n// Note: CodeMeaning is VR type LO, which means we only actually support 64 characters\n// here this is fine for most labels, but may be problematic at some point.\nconst CORNERSTONEFREETEXT = \"CORNERSTONEFREETEXT\";\n\n// Cornerstone specified coding scheme for storing findings\nconst CodingSchemeDesignator = \"CORNERSTONEJS\";\n\nconst CodingScheme = {\n CodingSchemeDesignator,\n codeValues: {\n CORNERSTONEFREETEXT\n }\n};\n\nexport default CodingScheme;\n","import { normalizers, data, utilities, derivations } from \"dcmjs\";\n\nimport CORNERSTONE_3D_TAG from \"./cornerstone3DTag\";\nimport { toArray, codeMeaningEquals } from \"../helpers\";\nimport Cornerstone3DCodingScheme from \"./CodingScheme\";\n\nconst { TID1500, addAccessors } = utilities;\n\nconst { StructuredReport } = derivations;\n\nconst { Normalizer } = normalizers;\n\nconst { TID1500MeasurementReport, TID1501MeasurementGroup } = TID1500;\n\nconst { DicomMetaDictionary } = data;\n\nconst FINDING = { CodingSchemeDesignator: \"DCM\", CodeValue: \"121071\" };\nconst FINDING_SITE = { CodingSchemeDesignator: \"SCT\", CodeValue: \"363698007\" };\nconst FINDING_SITE_OLD = { CodingSchemeDesignator: \"SRT\", CodeValue: \"G-C0E3\" };\n\nconst codeValueMatch = (group, code, oldCode?) => {\n const { ConceptNameCodeSequence } = group;\n if (!ConceptNameCodeSequence) return;\n const { CodingSchemeDesignator, CodeValue } = ConceptNameCodeSequence;\n return (\n (CodingSchemeDesignator == code.CodingSchemeDesignator &&\n CodeValue == code.CodeValue) ||\n (oldCode &&\n CodingSchemeDesignator == oldCode.CodingSchemeDesignator &&\n CodeValue == oldCode.CodeValue)\n );\n};\n\nfunction getTID300ContentItem(\n tool,\n toolType,\n ReferencedSOPSequence,\n toolClass,\n worldToImageCoords\n) {\n const args = toolClass.getTID300RepresentationArguments(\n tool,\n worldToImageCoords\n );\n args.ReferencedSOPSequence = ReferencedSOPSequence;\n\n const TID300Measurement = new toolClass.TID300Representation(args);\n\n return TID300Measurement;\n}\n\nfunction getMeasurementGroup(\n toolType,\n toolData,\n ReferencedSOPSequence,\n worldToImageCoords\n) {\n const toolTypeData = toolData[toolType];\n const toolClass =\n MeasurementReport.CORNERSTONE_TOOL_CLASSES_BY_TOOL_TYPE[toolType];\n if (\n !toolTypeData ||\n !toolTypeData.data ||\n !toolTypeData.data.length ||\n !toolClass\n ) {\n return;\n }\n\n // Loop through the array of tool instances\n // for this tool\n const Measurements = toolTypeData.data.map(tool => {\n return getTID300ContentItem(\n tool,\n toolType,\n ReferencedSOPSequence,\n toolClass,\n worldToImageCoords\n );\n });\n\n return new TID1501MeasurementGroup(Measurements);\n}\n\nexport default class MeasurementReport {\n public static CORNERSTONE_3D_TAG = CORNERSTONE_3D_TAG;\n public static MEASUREMENT_BY_TOOLTYPE = {};\n public static CORNERSTONE_TOOL_CLASSES_BY_UTILITY_TYPE = {};\n public static CORNERSTONE_TOOL_CLASSES_BY_TOOL_TYPE = {};\n\n static getCornerstoneLabelFromDefaultState(defaultState) {\n const { findingSites = [], finding } = defaultState;\n\n const cornersoneFreeTextCodingValue =\n Cornerstone3DCodingScheme.codeValues.CORNERSTONEFREETEXT;\n\n const freeTextLabel = findingSites.find(\n fs => fs.CodeValue === cornersoneFreeTextCodingValue\n );\n\n if (freeTextLabel) {\n return freeTextLabel.CodeMeaning;\n }\n\n if (finding && finding.CodeValue === cornersoneFreeTextCodingValue) {\n return finding.CodeMeaning;\n }\n }\n\n static generateDatasetMeta() {\n // TODO: what is the correct metaheader\n // http://dicom.nema.org/medical/Dicom/current/output/chtml/part10/chapter_7.html\n // TODO: move meta creation to happen in derivations.js\n const fileMetaInformationVersionArray = new Uint8Array(2);\n fileMetaInformationVersionArray[1] = 1;\n\n const _meta = {\n FileMetaInformationVersion: {\n Value: [fileMetaInformationVersionArray.buffer],\n vr: \"OB\"\n },\n //MediaStorageSOPClassUID\n //MediaStorageSOPInstanceUID: sopCommonModule.sopInstanceUID,\n TransferSyntaxUID: {\n Value: [\"1.2.840.10008.1.2.1\"],\n vr: \"UI\"\n },\n ImplementationClassUID: {\n Value: [DicomMetaDictionary.uid()], // TODO: could be git hash or other valid id\n vr: \"UI\"\n },\n ImplementationVersionName: {\n Value: [\"dcmjs\"],\n vr: \"SH\"\n }\n };\n\n return _meta;\n }\n\n static generateDerivationSourceDataset = instance => {\n const _vrMap = {\n PixelData: \"OW\"\n };\n\n const _meta = MeasurementReport.generateDatasetMeta();\n\n const derivationSourceDataset = {\n ...instance,\n _meta: _meta,\n _vrMap: _vrMap\n };\n\n return derivationSourceDataset;\n };\n\n static getSetupMeasurementData(\n MeasurementGroup,\n sopInstanceUIDToImageIdMap,\n metadata,\n toolType\n ) {\n const { ContentSequence } = MeasurementGroup;\n\n const contentSequenceArr = toArray(ContentSequence);\n const findingGroup = contentSequenceArr.find(group =>\n codeValueMatch(group, FINDING)\n );\n const findingSiteGroups =\n contentSequenceArr.filter(group =>\n codeValueMatch(group, FINDING_SITE, FINDING_SITE_OLD)\n ) || [];\n const NUMGroup = contentSequenceArr.find(\n group => group.ValueType === \"NUM\"\n );\n const SCOORDGroup = toArray(NUMGroup.ContentSequence).find(\n group => group.ValueType === \"SCOORD\"\n );\n const { ReferencedSOPSequence } = SCOORDGroup.ContentSequence;\n const { ReferencedSOPInstanceUID, ReferencedFrameNumber } =\n ReferencedSOPSequence;\n\n const referencedImageId =\n sopInstanceUIDToImageIdMap[ReferencedSOPInstanceUID];\n const imagePlaneModule = metadata.get(\n \"imagePlaneModule\",\n referencedImageId\n );\n\n const finding = findingGroup\n ? addAccessors(findingGroup.ConceptCodeSequence)\n : undefined;\n const findingSites = findingSiteGroups.map(fsg => {\n return addAccessors(fsg.ConceptCodeSequence);\n });\n\n const defaultState = {\n description: undefined,\n sopInstanceUid: ReferencedSOPInstanceUID,\n annotation: {\n annotationUID: DicomMetaDictionary.uid(),\n metadata: {\n toolName: toolType,\n referencedImageId,\n FrameOfReferenceUID: imagePlaneModule.frameOfReferenceUID,\n label: \"\"\n },\n data: undefined\n },\n finding,\n findingSites\n };\n if (defaultState.finding) {\n defaultState.description = defaultState.finding.CodeMeaning;\n }\n\n defaultState.annotation.metadata.label =\n MeasurementReport.getCornerstoneLabelFromDefaultState(defaultState);\n\n return {\n defaultState,\n NUMGroup,\n SCOORDGroup,\n ReferencedSOPSequence,\n ReferencedSOPInstanceUID,\n ReferencedFrameNumber\n };\n }\n\n static generateReport(\n toolState,\n metadataProvider,\n worldToImageCoords,\n options\n ) {\n // ToolState for array of imageIDs to a Report\n // Assume Cornerstone metadata provider has access to Study / Series / Sop Instance UID\n let allMeasurementGroups = [];\n\n /* Patient ID\n Warning - Missing attribute or value that would be needed to build DICOMDIR - Patient ID\n Warning - Missing attribute or value that would be needed to build DICOMDIR - Study Date\n Warning - Missing attribute or value that would be needed to build DICOMDIR - Study Time\n Warning - Missing attribute or value that would be needed to build DICOMDIR - Study ID\n */\n\n const sopInstanceUIDsToSeriesInstanceUIDMap = {};\n const derivationSourceDatasets = [];\n\n const _meta = MeasurementReport.generateDatasetMeta();\n\n // Loop through each image in the toolData\n Object.keys(toolState).forEach(imageId => {\n const sopCommonModule = metadataProvider.get(\n \"sopCommonModule\",\n imageId\n );\n const instance = metadataProvider.get(\"instance\", imageId);\n\n const { sopInstanceUID, sopClassUID } = sopCommonModule;\n const { SeriesInstanceUID: seriesInstanceUID } = instance;\n\n sopInstanceUIDsToSeriesInstanceUIDMap[sopInstanceUID] =\n seriesInstanceUID;\n\n if (\n !derivationSourceDatasets.find(\n dsd => dsd.SeriesInstanceUID === seriesInstanceUID\n )\n ) {\n // Entry not present for series, create one.\n const derivationSourceDataset =\n MeasurementReport.generateDerivationSourceDataset(instance);\n\n derivationSourceDatasets.push(derivationSourceDataset);\n }\n\n const frameNumber = metadataProvider.get(\"frameNumber\", imageId);\n const toolData = toolState[imageId];\n const toolTypes = Object.keys(toolData);\n\n const ReferencedSOPSequence = {\n ReferencedSOPClassUID: sopClassUID,\n ReferencedSOPInstanceUID: sopInstanceUID,\n ReferencedFrameNumber: undefined\n };\n\n if (\n (instance &&\n instance.NumberOfFrames &&\n instance.NumberOfFrames > 1) ||\n Normalizer.isMultiframeSOPClassUID(sopClassUID)\n ) {\n ReferencedSOPSequence.ReferencedFrameNumber = frameNumber;\n }\n\n // Loop through each tool type for the image\n const measurementGroups = [];\n\n toolTypes.forEach(toolType => {\n const group = getMeasurementGroup(\n toolType,\n toolData,\n ReferencedSOPSequence,\n worldToImageCoords\n );\n if (group) {\n measurementGroups.push(group);\n }\n });\n\n allMeasurementGroups =\n allMeasurementGroups.concat(measurementGroups);\n });\n\n const tid1500MeasurementReport = new TID1500MeasurementReport(\n { TID1501MeasurementGroups: allMeasurementGroups },\n options\n );\n\n const report = new StructuredReport(derivationSourceDatasets, options);\n\n const contentItem = tid1500MeasurementReport.contentItem(\n derivationSourceDatasets,\n { ...options, sopInstanceUIDsToSeriesInstanceUIDMap }\n );\n\n // Merge the derived dataset with the content from the Measurement Report\n report.dataset = Object.assign(report.dataset, contentItem);\n report.dataset._meta = _meta;\n\n return report;\n }\n\n /**\n * Generate Cornerstone tool state from dataset\n */\n static generateToolState(\n dataset,\n sopInstanceUIDToImageIdMap,\n imageToWorldCoords,\n metadata,\n hooks\n ) {\n // For now, bail out if the dataset is not a TID1500 SR with length measurements\n if (dataset.ContentTemplateSequence.TemplateIdentifier !== \"1500\") {\n throw new Error(\n \"This package can currently only interpret DICOM SR TID 1500\"\n );\n }\n\n const REPORT = \"Imaging Measurements\";\n const GROUP = \"Measurement Group\";\n const TRACKING_IDENTIFIER = \"Tracking Identifier\";\n\n // Identify the Imaging Measurements\n const imagingMeasurementContent = toArray(dataset.ContentSequence).find(\n codeMeaningEquals(REPORT)\n );\n\n // Retrieve the Measurements themselves\n const measurementGroups = toArray(\n imagingMeasurementContent.ContentSequence\n ).filter(codeMeaningEquals(GROUP));\n\n // For each of the supported measurement types, compute the measurement data\n const measurementData = {};\n\n const cornerstoneToolClasses =\n MeasurementReport.CORNERSTONE_TOOL_CLASSES_BY_UTILITY_TYPE;\n\n const registeredToolClasses = [];\n\n Object.keys(cornerstoneToolClasses).forEach(key => {\n registeredToolClasses.push(cornerstoneToolClasses[key]);\n measurementData[key] = [];\n });\n\n measurementGroups.forEach(measurementGroup => {\n try {\n const measurementGroupContentSequence = toArray(\n measurementGroup.ContentSequence\n );\n\n const TrackingIdentifierGroup =\n measurementGroupContentSequence.find(\n contentItem =>\n contentItem.ConceptNameCodeSequence.CodeMeaning ===\n TRACKING_IDENTIFIER\n );\n\n const TrackingIdentifierValue =\n TrackingIdentifierGroup.TextValue;\n\n const toolClass =\n hooks?.getToolClass?.(\n measurementGroup,\n dataset,\n registeredToolClasses\n ) ||\n registeredToolClasses.find(tc =>\n tc.isValidCornerstoneTrackingIdentifier(\n TrackingIdentifierValue\n )\n );\n\n if (toolClass) {\n const measurement = toolClass.getMeasurementData(\n measurementGroup,\n sopInstanceUIDToImageIdMap,\n imageToWorldCoords,\n metadata\n );\n\n console.log(`=== ${toolClass.toolType} ===`);\n console.log(measurement);\n\n measurementData[toolClass.toolType].push(measurement);\n }\n } catch (e) {\n console.warn(\n \"Unable to generate tool state for\",\n measurementGroup,\n e\n );\n }\n });\n\n // NOTE: There is no way of knowing the cornerstone imageIds as that could be anything.\n // That is up to the consumer to derive from the SOPInstanceUIDs.\n return measurementData;\n }\n\n /**\n * Register a new tool type.\n * @param toolClass to perform I/O to DICOM for this tool\n */\n public static registerTool(toolClass) {\n MeasurementReport.CORNERSTONE_TOOL_CLASSES_BY_UTILITY_TYPE[\n toolClass.utilityToolType\n ] = toolClass;\n MeasurementReport.CORNERSTONE_TOOL_CLASSES_BY_TOOL_TYPE[\n toolClass.toolType\n ] = toolClass;\n MeasurementReport.MEASUREMENT_BY_TOOLTYPE[toolClass.toolType] =\n toolClass.utilityToolType;\n }\n}\n","import MeasurementReport from \"./MeasurementReport\";\nimport { utilities } from \"dcmjs\";\nimport CORNERSTONE_3D_TAG from \"./cornerstone3DTag\";\nimport CodingScheme from \"./CodingScheme\";\n\nconst { Point: TID300Point } = utilities.TID300;\n\nconst ARROW_ANNOTATE = \"ArrowAnnotate\";\nconst trackingIdentifierTextValue = `${CORNERSTONE_3D_TAG}:${ARROW_ANNOTATE}`;\n\nconst { codeValues, CodingSchemeDesignator } = CodingScheme;\n\nclass ArrowAnnotate {\n static getMeasurementData(\n MeasurementGroup,\n sopInstanceUIDToImageIdMap,\n imageToWorldCoords,\n metadata\n ) {\n const { defaultState, SCOORDGroup, ReferencedFrameNumber } =\n MeasurementReport.getSetupMeasurementData(\n MeasurementGroup,\n sopInstanceUIDToImageIdMap,\n metadata,\n ArrowAnnotate.toolType\n );\n\n const referencedImageId =\n defaultState.annotation.metadata.referencedImageId;\n\n const text = defaultState.annotation.metadata.label;\n\n const { GraphicData } = SCOORDGroup;\n\n const worldCoords = [];\n for (let i = 0; i < GraphicData.length; i += 2) {\n const point = imageToWorldCoords(referencedImageId, [\n GraphicData[i],\n GraphicData[i + 1]\n ]);\n worldCoords.push(point);\n }\n\n // Since the arrowAnnotate measurement is just a point, to generate the tool state\n // we derive the second point based on the image size relative to the first point.\n if (worldCoords.length === 1) {\n const imagePixelModule = metadata.get(\n \"imagePixelModule\",\n referencedImageId\n );\n\n let xOffset = 10;\n let yOffset = 10;\n\n if (imagePixelModule) {\n const { columns, rows } = imagePixelModule;\n xOffset = columns / 10;\n yOffset = rows / 10;\n }\n\n const secondPoint = imageToWorldCoords(referencedImageId, [\n GraphicData[0] + xOffset,\n GraphicData[1] + yOffset\n ]);\n\n worldCoords.push(secondPoint);\n }\n\n const state = defaultState;\n\n state.annotation.data = {\n text,\n handles: {\n arrowFirst: true,\n points: [worldCoords[0], worldCoords[1]],\n activeHandleIndex: 0,\n textBox: {\n hasMoved: false\n }\n },\n frameNumber: ReferencedFrameNumber\n };\n\n return state;\n }\n\n static getTID300RepresentationArguments(tool, worldToImageCoords) {\n const { data, metadata } = tool;\n let { finding, findingSites } = tool;\n const { referencedImageId } = metadata;\n\n if (!referencedImageId) {\n throw new Error(\n \"ArrowAnnotate.getTID300RepresentationArguments: referencedImageId is not defined\"\n );\n }\n\n const { points, arrowFirst } = data.handles;\n\n let point;\n\n if (arrowFirst) {\n point = points[0];\n } else {\n point = points[1];\n }\n\n const pointImage = worldToImageCoords(referencedImageId, point);\n\n const TID300RepresentationArguments = {\n points: [\n {\n x: pointImage[0],\n y: pointImage[1]\n }\n ],\n trackingIdentifierTextValue,\n findingSites: findingSites || []\n };\n\n // If freetext finding isn't present, add it from the tool text.\n if (!finding || finding.CodeValue !== codeValues.CORNERSTONEFREETEXT) {\n finding = {\n CodeValue: codeValues.CORNERSTONEFREETEXT,\n CodingSchemeDesignator,\n CodeMeaning: data.text\n };\n }\n\n TID300RepresentationArguments.finding = finding;\n\n return TID300RepresentationArguments;\n }\n}\n\nArrowAnnotate.toolType = ARROW_ANNOTATE;\nArrowAnnotate.utilityToolType = ARROW_ANNOTATE;\nArrowAnnotate.TID300Representation = TID300Point;\nArrowAnnotate.isValidCornerstoneTrackingIdentifier = TrackingIdentifier => {\n if (!TrackingIdentifier.includes(\":\")) {\n return false;\n }\n\n const [cornerstone3DTag, toolType] = TrackingIdentifier.split(\":\");\n\n if (cornerstone3DTag !== CORNERSTONE_3D_TAG) {\n return false;\n }\n\n return toolType === ARROW_ANNOTATE;\n};\n\nMeasurementReport.registerTool(ArrowAnnotate);\n\nexport default ArrowAnnotate;\n","import { utilities } from \"dcmjs\";\nimport CORNERSTONE_3D_TAG from \"./cornerstone3DTag\";\nimport MeasurementReport from \"./MeasurementReport\";\nimport { toArray } from \"../helpers\";\n\nconst { Bidirectional: TID300Bidirectional } = utilities.TID300;\n\nconst BIDIRECTIONAL = \"Bidirectional\";\nconst LONG_AXIS = \"Long Axis\";\nconst SHORT_AXIS = \"Short Axis\";\nconst trackingIdentifierTextValue = `${CORNERSTONE_3D_TAG}:${BIDIRECTIONAL}`;\n\nclass Bidirectional {\n public static toolType = BIDIRECTIONAL;\n public static utilityToolType = BIDIRECTIONAL;\n public static TID300Representation = TID300Bidirectional;\n public static isValidCornerstoneTrackingIdentifier = TrackingIdentifier => {\n if (!TrackingIdentifier.includes(\":\")) {\n return false;\n }\n\n const [cornerstone3DTag, toolType] = TrackingIdentifier.split(\":\");\n\n if (cornerstone3DTag !== CORNERSTONE_3D_TAG) {\n return false;\n }\n\n return toolType === BIDIRECTIONAL;\n };\n\n public static getMeasurementData(\n MeasurementGroup,\n sopInstanceUIDToImageIdMap,\n imageToWorldCoords,\n metadata\n ) {\n const { defaultState, ReferencedFrameNumber } =\n MeasurementReport.getSetupMeasurementData(\n MeasurementGroup,\n sopInstanceUIDToImageIdMap,\n metadata,\n Bidirectional.toolType\n );\n\n const referencedImageId =\n defaultState.annotation.metadata.referencedImageId;\n const { ContentSequence } = MeasurementGroup;\n\n const longAxisNUMGroup = toArray(ContentSequence).find(\n group => group.ConceptNameCodeSequence.CodeMeaning === LONG_AXIS\n );\n\n const longAxisSCOORDGroup = toArray(\n longAxisNUMGroup.ContentSequence\n ).find(group => group.ValueType === \"SCOORD\");\n\n const shortAxisNUMGroup = toArray(ContentSequence).find(\n group => group.ConceptNameCodeSequence.CodeMeaning === SHORT_AXIS\n );\n\n const shortAxisSCOORDGroup = toArray(\n shortAxisNUMGroup.ContentSequence\n ).find(group => group.ValueType === \"SCOORD\");\n\n const worldCoords = [];\n\n [longAxisSCOORDGroup, shortAxisSCOORDGroup].forEach(group => {\n const { GraphicData } = group;\n for (let i = 0; i < GraphicData.length; i += 2) {\n const point = imageToWorldCoords(referencedImageId, [\n GraphicData[i],\n GraphicData[i + 1]\n ]);\n worldCoords.push(point);\n }\n });\n\n const state = defaultState;\n\n state.annotation.data = {\n handles: {\n points: [\n worldCoords[0],\n worldCoords[1],\n worldCoords[2],\n worldCoords[3]\n ],\n activeHandleIndex: 0,\n textBox: {\n hasMoved: false\n }\n },\n cachedStats: {\n [`imageId:${referencedImageId}`]: {\n length: longAxisNUMGroup.MeasuredValueSequence.NumericValue,\n width: shortAxisNUMGroup.MeasuredValueSequence.NumericValue\n }\n },\n frameNumber: ReferencedFrameNumber\n };\n\n return state;\n }\n\n static getTID300RepresentationArguments(tool, worldToImageCoords) {\n const { data, finding, findingSites, metadata } = tool;\n const { cachedStats = {}, handles } = data;\n\n const { referencedImageId } = metadata;\n\n if (!referencedImageId) {\n throw new Error(\n \"Bidirectional.getTID300RepresentationArguments: referencedImageId is not defined\"\n );\n }\n\n const { length, width } =\n cachedStats[`imageId:${referencedImageId}`] || {};\n const { points } = handles;\n\n // Find the length and width point pairs by comparing the distances of the points at 0,1 to points at 2,3\n const firstPointPairs = [points[0], points[1]];\n const secondPointPairs = [points[2], points[3]];\n\n const firstPointPairsDistance = Math.sqrt(\n Math.pow(firstPointPairs[0][0] - firstPointPairs[1][0], 2) +\n Math.pow(firstPointPairs[0][1] - firstPointPairs[1][1], 2) +\n Math.pow(firstPointPairs[0][2] - firstPointPairs[1][2], 2)\n );\n\n const secondPointPairsDistance = Math.sqrt(\n Math.pow(secondPointPairs[0][0] - secondPointPairs[1][0], 2) +\n Math.pow(secondPointPairs[0][1] - secondPointPairs[1][1], 2) +\n Math.pow(secondPointPairs[0][2] - secondPointPairs[1][2], 2)\n );\n\n let shortAxisPoints;\n let longAxisPoints;\n if (firstPointPairsDistance > secondPointPairsDistance) {\n shortAxisPoints = firstPointPairs;\n longAxisPoints = secondPointPairs;\n } else {\n shortAxisPoints = secondPointPairs;\n longAxisPoints = firstPointPairs;\n }\n\n const longAxisStartImage = worldToImageCoords(\n referencedImageId,\n shortAxisPoints[0]\n );\n const longAxisEndImage = worldToImageCoords(\n referencedImageId,\n shortAxisPoints[1]\n );\n const shortAxisStartImage = worldToImageCoords(\n referencedImageId,\n longAxisPoints[0]\n );\n const shortAxisEndImage = worldToImageCoords(\n referencedImageId,\n longAxisPoints[1]\n );\n\n return {\n longAxis: {\n point1: {\n x: longAxisStartImage[0],\n y: longAxisStartImage[1]\n },\n point2: {\n x: longAxisEndImage[0],\n y: longAxisEndImage[1]\n }\n },\n shortAxis: {\n point1: {\n x: shortAxisStartImage[0],\n y: shortAxisStartImage[1]\n },\n point2: {\n x: shortAxisEndImage[0],\n y: shortAxisEndImage[1]\n }\n },\n longAxisLength: length,\n shortAxisLength: width,\n trackingIdentifierTextValue,\n finding: finding,\n findingSites: findingSites || []\n };\n }\n}\n\nMeasurementReport.registerTool(Bidirectional);\n\nexport default Bidirectional;\n","import { utilities } from \"dcmjs\";\nimport CORNERSTONE_3D_TAG from \"./cornerstone3DTag\";\nimport MeasurementReport from \"./MeasurementReport\";\n\nconst { CobbAngle: TID300CobbAngle } = utilities.TID300;\n\nconst MEASUREMENT_TYPE = \"Angle\";\nconst trackingIdentifierTextValue = `${CORNERSTONE_3D_TAG}:${MEASUREMENT_TYPE}`;\n\nclass Angle {\n public static toolType = MEASUREMENT_TYPE;\n public static utilityToolType = MEASUREMENT_TYPE;\n public static TID300Representation = TID300CobbAngle;\n public static isValidCornerstoneTrackingIdentifier = TrackingIdentifier => {\n if (!TrackingIdentifier.includes(\":\")) {\n return false;\n }\n\n const [cornerstone3DTag, toolType] = TrackingIdentifier.split(\":\");\n\n if (cornerstone3DTag !== CORNERSTONE_3D_TAG) {\n return false;\n }\n\n return toolType === MEASUREMENT_TYPE;\n };\n\n // TODO: this function is required for all Cornerstone Tool Adapters, since it is called by MeasurementReport.\n public static getMeasurementData(\n MeasurementGroup,\n sopInstanceUIDToImageIdMap,\n imageToWorldCoords,\n metadata\n ) {\n const { defaultState, NUMGroup, SCOORDGroup, ReferencedFrameNumber } =\n MeasurementReport.getSetupMeasurementData(\n MeasurementGroup,\n sopInstanceUIDToImageIdMap,\n metadata,\n Angle.toolType\n );\n\n const referencedImageId =\n defaultState.annotation.metadata.referencedImageId;\n\n const { GraphicData } = SCOORDGroup;\n const worldCoords = [];\n for (let i = 0; i < GraphicData.length; i += 2) {\n const point = imageToWorldCoords(referencedImageId, [\n GraphicData[i],\n GraphicData[i + 1]\n ]);\n worldCoords.push(point);\n }\n\n const state = defaultState;\n\n state.annotation.data = {\n handles: {\n points: [worldCoords[0], worldCoords[1], worldCoords[3]],\n activeHandleIndex: 0,\n textBox: {\n hasMoved: false\n }\n },\n cachedStats: {\n [`imageId:${referencedImageId}`]: {\n angle: NUMGroup\n ? NUMGroup.MeasuredValueSequence.NumericValue\n : null\n }\n },\n frameNumber: ReferencedFrameNumber\n };\n\n return state;\n }\n\n public static getTID300RepresentationArguments(tool, worldToImageCoords) {\n const { data, finding, findingSites, metadata } = tool;\n const { cachedStats = {}, handles } = data;\n\n const { referencedImageId } = metadata;\n\n if (!referencedImageId) {\n throw new Error(\n \"Angle.getTID300RepresentationArguments: referencedImageId is not defined\"\n );\n }\n\n const start1 = worldToImageCoords(referencedImageId, handles.points[0]);\n const middle = worldToImageCoords(referencedImageId, handles.points[1]);\n\n const end = worldToImageCoords(referencedImageId, handles.points[2]);\n\n const point1 = { x: start1[0], y: start1[1] };\n const point2 = { x: middle[0], y: middle[1] };\n const point3 = point2;\n const point4 = { x: end[0], y: end[1] };\n\n const { angle } = cachedStats[`imageId:${referencedImageId}`] || {};\n\n // Represented as a cobb angle\n return {\n point1,\n point2,\n point3,\n point4,\n rAngle: angle,\n trackingIdentifierTextValue,\n finding,\n findingSites: findingSites || []\n };\n }\n}\n\nMeasurementReport.registerTool(Angle);\n\nexport default Angle;\n","import { utilities } from \"dcmjs\";\nimport CORNERSTONE_3D_TAG from \"./cornerstone3DTag\";\nimport MeasurementReport from \"./MeasurementReport\";\n\nconst { CobbAngle: TID300CobbAngle } = utilities.TID300;\n\nconst MEASUREMENT_TYPE = \"CobbAngle\";\nconst trackingIdentifierTextValue = `${CORNERSTONE_3D_TAG}:${MEASUREMENT_TYPE}`;\n\nclass CobbAngle {\n public static toolType = MEASUREMENT_TYPE;\n public static utilityToolType = MEASUREMENT_TYPE;\n public static TID300Representation = TID300CobbAngle;\n public static isValidCornerstoneTrackingIdentifier = TrackingIdentifier => {\n if (!TrackingIdentifier.includes(\":\")) {\n return false;\n }\n\n const [cornerstone3DTag, toolType] = TrackingIdentifier.split(\":\");\n\n if (cornerstone3DTag !== CORNERSTONE_3D_TAG) {\n return false;\n }\n\n return toolType === MEASUREMENT_TYPE;\n };\n\n // TODO: this function is required for all Cornerstone Tool Adapters, since it is called by MeasurementReport.\n public static getMeasurementData(\n MeasurementGroup,\n sopInstanceUIDToImageIdMap,\n imageToWorldCoords,\n metadata\n ) {\n const { defaultState, NUMGroup, SCOORDGroup, ReferencedFrameNumber } =\n MeasurementReport.getSetupMeasurementData(\n MeasurementGroup,\n sopInstanceUIDToImageIdMap,\n metadata,\n CobbAngle.toolType\n );\n\n const referencedImageId =\n defaultState.annotation.metadata.referencedImageId;\n\n const { GraphicData } = SCOORDGroup;\n const worldCoords = [];\n for (let i = 0; i < GraphicData.length; i += 2) {\n const point = imageToWorldCoords(referencedImageId, [\n GraphicData[i],\n GraphicData[i + 1]\n ]);\n worldCoords.push(point);\n }\n\n const state = defaultState;\n\n state.annotation.data = {\n handles: {\n points: [\n worldCoords[0],\n worldCoords[1],\n worldCoords[2],\n worldCoords[3]\n ],\n activeHandleIndex: 0,\n textBox: {\n hasMoved: false\n }\n },\n cachedStats: {\n [`imageId:${referencedImageId}`]: {\n angle: NUMGroup\n ? NUMGroup.MeasuredValueSequence.NumericValue\n : null\n }\n },\n frameNumber: ReferencedFrameNumber\n };\n\n return state;\n }\n\n public static getTID300RepresentationArguments(tool, worldToImageCoords) {\n const { data, finding, findingSites, metadata } = tool;\n const { cachedStats = {}, handles } = data;\n\n const { referencedImageId } = metadata;\n\n if (!referencedImageId) {\n throw new Error(\n \"CobbAngle.getTID300RepresentationArguments: referencedImageId is not defined\"\n );\n }\n\n const start1 = worldToImageCoords(referencedImageId, handles.points[0]);\n const end1 = worldToImageCoords(referencedImageId, handles.points[1]);\n\n const start2 = worldToImageCoords(referencedImageId, handles.points[2]);\n const end2 = worldToImageCoords(referencedImageId, handles.points[3]);\n\n const point1 = { x: start1[0], y: start1[1] };\n const point2 = { x: end1[0], y: end1[1] };\n const point3 = { x: start2[0], y: start2[1] };\n const point4 = { x: end2[0], y: end2[1] };\n\n const { angle } = cachedStats[`imageId:${referencedImageId}`] || {};\n\n return {\n point1,\n point2,\n point3,\n point4,\n rAngle: angle,\n trackingIdentifierTextValue,\n finding,\n findingSites: findingSites || []\n };\n }\n}\n\nMeasurementReport.registerTool(CobbAngle);\n\nexport default CobbAngle;\n","import CORNERSTONE_3D_TAG from \"./cornerstone3DTag\";\n\nexport default function isValidCornerstoneTrackingIdentifier(\n trackingIdentifier: string\n): boolean {\n if (!trackingIdentifier.includes(\":\")) {\n return false;\n }\n\n const [cornerstone3DTag, toolType] = trackingIdentifier.split(\":\");\n\n if (cornerstone3DTag !== CORNERSTONE_3D_TAG) {\n return false;\n }\n\n // The following is needed since the new cornerstone3D has changed\n // case names such as EllipticalRoi to EllipticalROI\n return toolType.toLowerCase() === this.toolType.toLowerCase();\n}\n","import { utilities } from \"dcmjs\";\nimport MeasurementReport from \"./MeasurementReport\";\nimport CORNERSTONE_3D_TAG from \"./cornerstone3DTag\";\nimport isValidCornerstoneTrackingIdentifier from \"./isValidCornerstoneTrackingIdentifier\";\n\nconst { Circle: TID300Circle } = utilities.TID300;\n\nconst CIRCLEROI = \"CircleROI\";\n\nclass CircleROI {\n static trackingIdentifierTextValue = `${CORNERSTONE_3D_TAG}:${CIRCLEROI}`;\n static toolType = CIRCLEROI;\n static utilityToolType = CIRCLEROI;\n static TID300Representation = TID300Circle;\n static isValidCornerstoneTrackingIdentifier =\n isValidCornerstoneTrackingIdentifier;\n\n /** Gets the measurement data for cornerstone, given DICOM SR measurement data. */\n static getMeasurementData(\n MeasurementGroup,\n sopInstanceUIDToImageIdMap,\n imageToWorldCoords,\n metadata\n ) {\n const { defaultState, NUMGroup, SCOORDGroup, ReferencedFrameNumber } =\n MeasurementReport.getSetupMeasurementData(\n MeasurementGroup,\n sopInstanceUIDToImageIdMap,\n metadata,\n CircleROI.toolType\n );\n\n const referencedImageId =\n defaultState.annotation.metadata.referencedImageId;\n\n const { GraphicData } = SCOORDGroup;\n\n // GraphicData is ordered as [centerX, centerY, endX, endY]\n const pointsWorld = [];\n for (let i = 0; i < GraphicData.length; i += 2) {\n const worldPos = imageToWorldCoords(referencedImageId, [\n GraphicData[i],\n GraphicData[i + 1]\n ]);\n\n pointsWorld.push(worldPos);\n }\n\n const state = defaultState;\n\n state.annotation.data = {\n handles: {\n points: [...pointsWorld],\n activeHandleIndex: 0,\n textBox: {\n hasMoved: false\n }\n },\n cachedStats: {\n [`imageId:${referencedImageId}`]: {\n area: NUMGroup\n ? NUMGroup.MeasuredValueSequence.NumericValue\n : 0,\n // Dummy values to be updated by cornerstone\n radius: 0,\n perimeter: 0\n }\n },\n frameNumber: ReferencedFrameNumber\n };\n\n return state;\n }\n\n /**\n * Gets the TID 300 representation of a circle, given the cornerstone representation.\n *\n * @param {Object} tool\n * @returns\n */\n static getTID300RepresentationArguments(tool, worldToImageCoords) {\n const { data, finding, findingSites, metadata } = tool;\n const { cachedStats = {}, handles } = data;\n\n const { referencedImageId } = metadata;\n\n if (!referencedImageId) {\n throw new Error(\n \"CircleROI.getTID300RepresentationArguments: referencedImageId is not defined\"\n );\n }\n\n const center = worldToImageCoords(referencedImageId, handles.points[0]);\n const end = worldToImageCoords(referencedImageId, handles.points[1]);\n\n const points = [];\n points.push({ x: center[0], y: center[1] });\n points.push({ x: end[0], y: end[1] });\n\n const { area, radius } =\n cachedStats[`imageId:${referencedImageId}`] || {};\n const perimeter = 2 * Math.PI * radius;\n\n return {\n area,\n perimeter,\n radius,\n points,\n trackingIdentifierTextValue: this.trackingIdentifierTextValue,\n finding,\n findingSites: findingSites || []\n };\n }\n}\n\nMeasurementReport.registerTool(CircleROI);\n\nexport default CircleROI;\n","import { vec3 } from \"gl-matrix\";\nimport { utilities } from \"dcmjs\";\nimport CORNERSTONE_3D_TAG from \"./cornerstone3DTag\";\nimport MeasurementReport from \"./MeasurementReport\";\nimport isValidCornerstoneTrackingIdentifier from \"./isValidCornerstoneTrackingIdentifier\";\n\ntype Point3 = [number, number, number];\n\nconst { Ellipse: TID300Ellipse } = utilities.TID300;\n\nconst ELLIPTICALROI = \"EllipticalROI\";\nconst EPSILON = 1e-4;\n\nclass EllipticalROI {\n static trackingIdentifierTextValue = `${CORNERSTONE_3D_TAG}:${ELLIPTICALROI}`;\n static toolType = ELLIPTICALROI;\n static utilityToolType = ELLIPTICALROI;\n static TID300Representation = TID300Ellipse;\n static isValidCornerstoneTrackingIdentifier =\n isValidCornerstoneTrackingIdentifier;\n\n static getMeasurementData(\n MeasurementGroup,\n sopInstanceUIDToImageIdMap,\n imageToWorldCoords,\n metadata\n ) {\n const { defaultState, NUMGroup, SCOORDGroup, ReferencedFrameNumber } =\n MeasurementReport.getSetupMeasurementData(\n MeasurementGroup,\n sopInstanceUIDToImageIdMap,\n metadata,\n EllipticalROI.toolType\n );\n\n const referencedImageId =\n defaultState.annotation.metadata.referencedImageId;\n\n const { GraphicData } = SCOORDGroup;\n\n // GraphicData is ordered as [majorAxisStartX, majorAxisStartY, majorAxisEndX, majorAxisEndY, minorAxisStartX, minorAxisStartY, minorAxisEndX, minorAxisEndY]\n // But Cornerstone3D points are ordered as top, bottom, left, right for the\n // ellipse so we need to identify if the majorAxis is horizontal or vertical\n // in the image plane and then choose the correct points to use for the ellipse.\n const pointsWorld: Point3[] = [];\n for (let i = 0; i < GraphicData.length; i += 2) {\n const worldPos = imageToWorldCoords(referencedImageId, [\n GraphicData[i],\n GraphicData[i + 1]\n ]);\n\n pointsWorld.push(worldPos);\n }\n\n const majorAxisStart = vec3.fromValues(...pointsWorld[0]);\n const majorAxisEnd = vec3.fromValues(...pointsWorld[1]);\n const minorAxisStart = vec3.fromValues(...pointsWorld[2]);\n const minorAxisEnd = vec3.fromValues(...pointsWorld[3]);\n\n const majorAxisVec = vec3.create();\n vec3.sub(majorAxisVec, majorAxisEnd, majorAxisStart);\n\n // normalize majorAxisVec to avoid scaling issues\n vec3.normalize(majorAxisVec, majorAxisVec);\n\n const minorAxisVec = vec3.create();\n vec3.sub(minorAxisVec, minorAxisEnd, minorAxisStart);\n vec3.normalize(minorAxisVec, minorAxisVec);\n\n const imagePlaneModule = metadata.get(\n \"imagePlaneModule\",\n referencedImageId\n );\n\n if (!imagePlaneModule) {\n throw new Error(\"imageId does not have imagePlaneModule metadata\");\n }\n\n const { columnCosines } = imagePlaneModule;\n\n // find which axis is parallel to the columnCosines\n const columnCosinesVec = vec3.fromValues(\n columnCosines[0],\n columnCosines[1],\n columnCosines[2]\n );\n const projectedMajorAxisOnColVec = vec3.dot(\n columnCosinesVec,\n majorAxisVec\n );\n\n const projectedMinorAxisOnColVec = vec3.dot(\n columnCosinesVec,\n minorAxisVec\n );\n\n const absoluteOfMajorDotProduct = Math.abs(projectedMajorAxisOnColVec);\n const absoluteOfMinorDotProduct = Math.abs(projectedMinorAxisOnColVec);\n\n let ellipsePoints = [];\n if (Math.abs(absoluteOfMajorDotProduct - 1) < EPSILON) {\n ellipsePoints = [\n pointsWorld[0],\n pointsWorld[1],\n pointsWorld[2],\n pointsWorld[3]\n ];\n } else if (Math.abs(absoluteOfMinorDotProduct - 1) < EPSILON) {\n ellipsePoints = [\n pointsWorld[2],\n pointsWorld[3],\n pointsWorld[0],\n pointsWorld[1]\n ];\n } else {\n console.warn(\"OBLIQUE ELLIPSE NOT YET SUPPORTED\");\n }\n\n const state = defaultState;\n\n state.annotation.data = {\n handles: {\n points: [...ellipsePoints],\n activeHandleIndex: 0,\n textBox: {\n hasMoved: false\n }\n },\n cachedStats: {\n [`imageId:${referencedImageId}`]: {\n area: NUMGroup\n ? NUMGroup.MeasuredValueSequence.NumericValue\n : 0\n }\n },\n frameNumber: ReferencedFrameNumber\n };\n\n return state;\n }\n\n static getTID300RepresentationArguments(tool, worldToImageCoords) {\n const { data, finding, findingSites, metadata } = tool;\n const { cachedStats = {}, handles } = data;\n const rotation = data.initialRotation || 0;\n const { referencedImageId } = metadata;\n\n if (!referencedImageId) {\n throw new Error(\n \"EllipticalROI.getTID300RepresentationArguments: referencedImageId is not defined\"\n );\n }\n let top, bottom, left, right;\n // this way when it's restored we can assume the initial rotation is 0.\n if (rotation == 90 || rotation == 270) {\n bottom = worldToImageCoords(referencedImageId, handles.points[2]);\n top = worldToImageCoords(referencedImageId, handles.points[3]);\n left = worldToImageCoords(referencedImageId, handles.points[0]);\n right = worldToImageCoords(referencedImageId, handles.points[1]);\n } else {\n top = worldToImageCoords(referencedImageId, handles.points[0]);\n bottom = worldToImageCoords(referencedImageId, handles.points[1]);\n left = worldToImageCoords(referencedImageId, handles.points[2]);\n right = worldToImageCoords(referencedImageId, handles.points[3]);\n }\n\n // find the major axis and minor axis\n const topBottomLength = Math.abs(top[1] - bottom[1]);\n const leftRightLength = Math.abs(left[0] - right[0]);\n\n const points = [];\n if (topBottomLength > leftRightLength) {\n // major axis is bottom to top\n points.push({ x: top[0], y: top[1] });\n points.push({ x: bottom[0], y: bottom[1] });\n\n // minor axis is left to right\n points.push({ x: left[0], y: left[1] });\n points.push({ x: right[0], y: right[1] });\n } else {\n // major axis is left to right\n points.push({ x: left[0], y: left[1] });\n points.push({ x: right[0], y: right[1] });\n\n // minor axis is bottom to top\n points.push({ x: top[0], y: top[1] });\n points.push({ x: bottom[0], y: bottom[1] });\n }\n\n const { area } = cachedStats[`imageId:${referencedImageId}`] || {};\n\n return {\n area,\n points,\n trackingIdentifierTextValue: this.trackingIdentifierTextValue,\n finding,\n findingSites: findingSites || []\n };\n }\n}\n\nMeasurementReport.registerTool(EllipticalROI);\n\nexport default EllipticalROI;\n","import { utilities } from \"dcmjs\";\nimport CORNERSTONE_3D_TAG from \"./cornerstone3DTag\";\nimport MeasurementReport from \"./MeasurementReport\";\n\nconst { Polyline: TID300Polyline } = utilities.TID300;\n\nconst TOOLTYPE = \"RectangleROI\";\nconst trackingIdentifierTextValue = `${CORNERSTONE_3D_TAG}:${TOOLTYPE}`;\n\nclass RectangleROI {\n public static toolType = TOOLTYPE;\n public static utilityToolType = TOOLTYPE;\n public static TID300Representation = TID300Polyline;\n\n public static isValidCornerstoneTrackingIdentifier = TrackingIdentifier => {\n if (!TrackingIdentifier.includes(\":\")) {\n return false;\n }\n\n const [cornerstone3DTag, toolType] = TrackingIdentifier.split(\":\");\n\n if (cornerstone3DTag !== CORNERSTONE_3D_TAG) {\n return false;\n }\n\n return toolType === TOOLTYPE;\n };\n\n public static getMeasurementData(\n MeasurementGroup,\n sopInstanceUIDToImageIdMap,\n imageToWorldCoords,\n metadata\n ) {\n const { defaultState, NUMGroup, SCOORDGroup, ReferencedFrameNumber } =\n MeasurementReport.getSetupMeasurementData(\n MeasurementGroup,\n sopInstanceUIDToImageIdMap,\n metadata,\n RectangleROI.toolType\n );\n\n const referencedImageId =\n defaultState.annotation.metadata.referencedImageId;\n\n const { GraphicData } = SCOORDGroup;\n const worldCoords = [];\n for (let i = 0; i < GraphicData.length; i += 2) {\n const point = imageToWorldCoords(referencedImageId, [\n GraphicData[i],\n GraphicData[i + 1]\n ]);\n worldCoords.push(point);\n }\n\n const state = defaultState;\n\n state.annotation.data = {\n handles: {\n points: [\n worldCoords[0],\n worldCoords[1],\n worldCoords[3],\n worldCoords[2]\n ],\n activeHandleIndex: 0,\n textBox: {\n hasMoved: false\n }\n },\n cachedStats: {\n [`imageId:${referencedImageId}`]: {\n area: NUMGroup\n ? NUMGroup.MeasuredValueSequence.NumericValue\n : null\n }\n },\n frameNumber: ReferencedFrameNumber\n };\n\n return state;\n }\n\n static getTID300RepresentationArguments(tool, worldToImageCoords) {\n const { data, finding, findingSites, metadata } = tool;\n const { cachedStats = {}, handles } = data;\n\n const { referencedImageId } = metadata;\n\n if (!referencedImageId) {\n throw new Error(\n \"CobbAngle.getTID300RepresentationArguments: referencedImageId is not defined\"\n );\n }\n\n const corners = handles.points.map(point =>\n worldToImageCoords(referencedImageId, point)\n );\n\n const { area, perimeter } = cachedStats;\n\n return {\n points: [\n corners[0],\n corners[1],\n corners[3],\n corners[2],\n corners[0]\n ],\n area,\n perimeter,\n trackingIdentifierTextValue,\n finding,\n findingSites: findingSites || []\n };\n }\n}\n\nMeasurementReport.registerTool(RectangleROI);\n\nexport default RectangleROI;\n","import { utilities } from \"dcmjs\";\nimport CORNERSTONE_3D_TAG from \"./cornerstone3DTag\";\nimport MeasurementReport from \"./MeasurementReport\";\n\nconst { Length: TID300Length } = utilities.TID300;\n\nconst LENGTH = \"Length\";\nconst trackingIdentifierTextValue = `${CORNERSTONE_3D_TAG}:${LENGTH}`;\n\nclass Length {\n // TODO: this function is required for all Cornerstone Tool Adapters, since it is called by MeasurementReport.\n static getMeasurementData(\n MeasurementGroup,\n sopInstanceUIDToImageIdMap,\n imageToWorldCoords,\n metadata\n ) {\n const { defaultState, NUMGroup, SCOORDGroup, ReferencedFrameNumber } =\n MeasurementReport.getSetupMeasurementData(\n MeasurementGroup,\n sopInstanceUIDToImageIdMap,\n metadata,\n Length.toolType\n );\n\n const referencedImageId =\n defaultState.annotation.metadata.referencedImageId;\n\n const { GraphicData } = SCOORDGroup;\n const worldCoords = [];\n for (let i = 0; i < GraphicData.length; i += 2) {\n const point = imageToWorldCoords(referencedImageId, [\n GraphicData[i],\n GraphicData[i + 1]\n ]);\n worldCoords.push(point);\n }\n\n const state = defaultState;\n\n state.annotation.data = {\n handles: {\n points: [worldCoords[0], worldCoords[1]],\n activeHandleIndex: 0,\n textBox: {\n hasMoved: false\n }\n },\n cachedStats: {\n [`imageId:${referencedImageId}`]: {\n length: NUMGroup\n ? NUMGroup.MeasuredValueSequence.NumericValue\n : 0\n }\n },\n frameNumber: ReferencedFrameNumber\n };\n\n return state;\n }\n\n static getTID300RepresentationArguments(tool, worldToImageCoords) {\n const { data, finding, findingSites, metadata } = tool;\n const { cachedStats = {}, handles } = data;\n\n const { referencedImageId } = metadata;\n\n if (!referencedImageId) {\n throw new Error(\n \"Length.getTID300RepresentationArguments: referencedImageId is not defined\"\n );\n }\n\n const start = worldToImageCoords(referencedImageId, handles.points[0]);\n const end = worldToImageCoords(referencedImageId, handles.points[1]);\n\n const point1 = { x: start[0], y: start[1] };\n const point2 = { x: end[0], y: end[1] };\n\n const { length: distance } =\n cachedStats[`imageId:${referencedImageId}`] || {};\n\n return {\n point1,\n point2,\n distance,\n trackingIdentifierTextValue,\n finding,\n findingSites: findingSites || []\n };\n }\n}\n\nLength.toolType = LENGTH;\nLength.utilityToolType = LENGTH;\nLength.TID300Representation = TID300Length;\nLength.isValidCornerstoneTrackingIdentifier = TrackingIdentifier => {\n if (!TrackingIdentifier.includes(\":\")) {\n return false;\n }\n\n const [cornerstone3DTag, toolType] = TrackingIdentifier.split(\":\");\n\n if (cornerstone3DTag !== CORNERSTONE_3D_TAG) {\n return false;\n }\n\n return toolType === LENGTH;\n};\n\nMeasurementReport.registerTool(Length);\n\nexport default Length;\n","import MeasurementReport from \"./MeasurementReport\";\nimport { utilities } from \"dcmjs\";\nimport CORNERSTONE_3D_TAG from \"./cornerstone3DTag\";\nimport { vec3 } from \"gl-matrix\";\n\nconst { Polyline: TID300Polyline } = utilities.TID300;\n\nconst PLANARFREEHANDROI = \"PlanarFreehandROI\";\nconst trackingIdentifierTextValue = `${CORNERSTONE_3D_TAG}:${PLANARFREEHANDROI}`;\nconst closedContourThreshold = 1e-5;\n\nclass PlanarFreehandROI {\n public static toolType = PLANARFREEHANDROI;\n public static utilityToolType = PLANARFREEHANDROI;\n public static TID300Representation = TID300Polyline;\n public static isValidCornerstoneTrackingIdentifier = TrackingIdentifier => {\n if (!TrackingIdentifier.includes(\":\")) {\n return false;\n }\n\n const [cornerstone3DTag, toolType] = TrackingIdentifier.split(\":\");\n\n if (cornerstone3DTag !== CORNERSTONE_3D_TAG) {\n return false;\n }\n\n return toolType === PLANARFREEHANDROI;\n };\n\n static getMeasurementData(\n MeasurementGroup,\n sopInstanceUIDToImageIdMap,\n imageToWorldCoords,\n metadata\n ) {\n const { defaultState, SCOORDGroup, ReferencedFrameNumber } =\n MeasurementReport.getSetupMeasurementData(\n MeasurementGroup,\n sopInstanceUIDToImageIdMap,\n metadata,\n PlanarFreehandROI.toolType\n );\n\n const referencedImageId =\n defaultState.annotation.metadata.referencedImageId;\n const { GraphicData } = SCOORDGroup;\n\n const worldCoords = [];\n\n for (let i = 0; i < GraphicData.length; i += 2) {\n const point = imageToWorldCoords(referencedImageId, [\n GraphicData[i],\n GraphicData[i + 1]\n ]);\n\n worldCoords.push(point);\n }\n\n const distanceBetweenFirstAndLastPoint = vec3.distance(\n worldCoords[worldCoords.length - 1],\n worldCoords[0]\n );\n\n let isOpenContour = true;\n\n // If the contour is closed, this should have been encoded as exactly the same point, so check for a very small difference.\n if (distanceBetweenFirstAndLastPoint < closedContourThreshold) {\n worldCoords.pop(); // Remove the last element which is duplicated.\n\n isOpenContour = false;\n }\n\n const points = [];\n\n if (isOpenContour) {\n points.push(worldCoords[0], worldCoords[worldCoords.length - 1]);\n }\n\n const state = defaultState;\n\n state.annotation.data = {\n polyline: worldCoords,\n isOpenContour,\n handles: {\n points,\n activeHandleIndex: null,\n textBox: {\n hasMoved: false\n }\n },\n frameNumber: ReferencedFrameNumber\n };\n\n return state;\n }\n\n static getTID300RepresentationArguments(tool, worldToImageCoords) {\n const { data, finding, findingSites, metadata } = tool;\n const { isOpenContour, polyline } = data;\n\n const { referencedImageId } = metadata;\n\n if (!referencedImageId) {\n throw new Error(\n \"PlanarFreehandROI.getTID300RepresentationArguments: referencedImageId is not defined\"\n );\n }\n\n const points = polyline.map(worldPos =>\n worldToImageCoords(referencedImageId, worldPos)\n );\n\n if (!isOpenContour) {\n // Need to repeat the first point at the end of to have an explicitly closed contour.\n const firstPoint = points[0];\n\n // Explicitly expand to avoid ciruclar references.\n points.push([firstPoint[0], firstPoint[1]]);\n }\n\n const area = 0; // TODO -> The tool doesn't have these stats yet.\n const perimeter = 0;\n\n return {\n points,\n area,\n perimeter,\n trackingIdentifierTextValue,\n finding,\n findingSites: findingSites || []\n };\n }\n}\n\nMeasurementReport.registerTool(PlanarFreehandROI);\n\nexport default PlanarFreehandROI;\n","import { utilities } from \"dcmjs\";\nimport CORNERSTONE_3D_TAG from \"./cornerstone3DTag\";\nimport MeasurementReport from \"./MeasurementReport\";\n\nconst { Point: TID300Point } = utilities.TID300;\n\nconst PROBE = \"Probe\";\nconst trackingIdentifierTextValue = `${CORNERSTONE_3D_TAG}:${PROBE}`;\n\nclass Probe {\n static getMeasurementData(\n MeasurementGroup,\n sopInstanceUIDToImageIdMap,\n imageToWorldCoords,\n metadata\n ) {\n const { defaultState, SCOORDGroup, ReferencedFrameNumber } =\n MeasurementReport.getSetupMeasurementData(\n MeasurementGroup,\n sopInstanceUIDToImageIdMap,\n metadata,\n Probe.toolType\n );\n\n const referencedImageId =\n defaultState.annotation.metadata.referencedImageId;\n\n const { GraphicData } = SCOORDGroup;\n\n const worldCoords = [];\n for (let i = 0; i < GraphicData.length; i += 2) {\n const point = imageToWorldCoords(referencedImageId, [\n GraphicData[i],\n GraphicData[i + 1]\n ]);\n worldCoords.push(point);\n }\n\n const state = defaultState;\n\n state.annotation.data = {\n handles: {\n points: worldCoords,\n activeHandleIndex: null,\n textBox: {\n hasMoved: false\n }\n },\n frameNumber: ReferencedFrameNumber\n };\n\n return state;\n }\n\n static getTID300RepresentationArguments(tool, worldToImageCoords) {\n const { data, metadata } = tool;\n let { finding, findingSites } = tool;\n const { referencedImageId } = metadata;\n\n if (!referencedImageId) {\n throw new Error(\n \"Probe.getTID300RepresentationArguments: referencedImageId is not defined\"\n );\n }\n\n const { points } = data.handles;\n\n const pointsImage = points.map(point => {\n const pointImage = worldToImageCoords(referencedImageId, point);\n return {\n x: pointImage[0],\n y: pointImage[1]\n };\n });\n\n const TID300RepresentationArguments = {\n points: pointsImage,\n trackingIdentifierTextValue,\n findingSites: findingSites || [],\n finding\n };\n\n return TID300RepresentationArguments;\n }\n}\n\nProbe.toolType = PROBE;\nProbe.utilityToolType = PROBE;\nProbe.TID300Representation = TID300Point;\nProbe.isValidCornerstoneTrackingIdentifier = TrackingIdentifier => {\n if (!TrackingIdentifier.includes(\":\")) {\n return false;\n }\n\n const [cornerstone3DTag, toolType] = TrackingIdentifier.split(\":\");\n\n if (cornerstone3DTag !== CORNERSTONE_3D_TAG) {\n return false;\n }\n\n return toolType === PROBE;\n};\n\nMeasurementReport.registerTool(Probe);\n\nexport default Probe;\n","import { normalizers, derivations } from \"dcmjs\";\nimport { fillSegmentation } from \"../../Cornerstone/Segmentation_4X\";\n\nconst { Normalizer } = normalizers;\nconst { Segmentation: SegmentationDerivation } = derivations;\n\n/**\n * generateSegmentation - Generates a DICOM Segmentation object given cornerstoneTools data.\n *\n * @param images - An array of the cornerstone image objects, which includes imageId and metadata\n * @param labelmaps - An array of the 3D Volumes that contain the segmentation data.\n */\nfunction generateSegmentation(images, labelmaps, metadata, options = {}) {\n const segmentation = _createMultiframeSegmentationFromReferencedImages(\n images,\n metadata,\n options\n );\n return fillSegmentation(segmentation, labelmaps, options);\n}\n\n/**\n * _createMultiframeSegmentationFromReferencedImages - description\n *\n * @param images - An array of the cornerstone image objects related to the reference\n * series that the segmentation is derived from. You can use methods such as\n * volume.getCornerstoneImages() to get this array.\n *\n * @param options - the options object for the SegmentationDerivation.\n * @returns The Seg derived dataSet.\n */\nfunction _createMultiframeSegmentationFromReferencedImages(\n images,\n metadata,\n options\n) {\n const datasets = images.map(image => {\n // add the sopClassUID to the dataset\n const instance = metadata.get(\"instance\", image.imageId);\n return {\n ...image,\n ...instance,\n // Todo: move to dcmjs tag style\n SOPClassUID: instance.SopClassUID || instance.SOPClassUID,\n SOPInstanceUID: instance.SopInstanceUID || instance.SOPInstanceUID,\n PixelData: image.getPixelData(),\n _vrMap: {\n PixelData: \"OW\"\n },\n _meta: {}\n };\n });\n\n const multiframe = Normalizer.normalizeToDataset(datasets);\n\n return new SegmentationDerivation([multiframe], options);\n}\n\nexport { generateSegmentation };\n","import { CornerstoneSEG } from \"../../Cornerstone\";\n\nconst { Segmentation } = CornerstoneSEG;\nconst { generateToolState: generateToolStateCornerstoneLegacy } = Segmentation;\n\n/**\n * generateToolState - Given a set of cornerstoneTools imageIds and a Segmentation buffer,\n * derive cornerstoneTools toolState and brush metadata.\n *\n * @param imageIds - An array of the imageIds.\n * @param arrayBuffer - The SEG arrayBuffer.\n * @param skipOverlapping - skip checks for overlapping segs, default value false.\n * @param tolerance - default value 1.e-3.\n *\n * @returns a list of array buffer for each labelMap\n * an object from which the segment metadata can be derived\n * list containing the track of segments per frame\n * list containing the track of segments per frame for each labelMap (available only for the overlapping case).\n */\nfunction generateToolState(\n imageIds,\n arrayBuffer,\n metadataProvider,\n skipOverlapping = false,\n tolerance = 1e-3\n) {\n return generateToolStateCornerstoneLegacy(\n imageIds,\n arrayBuffer,\n metadataProvider,\n skipOverlapping,\n tolerance\n );\n}\n\nexport { generateToolState };\n","/**\n * Generates 2D label maps from a 3D label map.\n * @param labelmap3D - The 3D label map object to generate 2D label maps from. It is derived\n * from the volume labelmap.\n * @returns The label map object containing the 2D label maps and segments on label maps.\n */\nfunction generateLabelMaps2DFrom3D(labelmap3D): {\n scalarData: number[];\n dimensions: number[];\n segmentsOnLabelmap: number[];\n labelmaps2D: {\n segmentsOnLabelmap: number[];\n pixelData: number[];\n rows: number;\n columns: number;\n }[];\n} {\n // 1. we need to generate labelmaps2D from labelmaps3D, a labelmap2D is for each\n // slice\n const { scalarData, dimensions } = labelmap3D;\n\n // scalarData is a flat array of all the pixels in the volume.\n const labelmaps2D = [];\n const segmentsOnLabelmap3D = new Set();\n\n // X-Y are the row and column dimensions, Z is the number of slices.\n for (let z = 0; z < dimensions[2]; z++) {\n const pixelData = scalarData.slice(\n z * dimensions[0] * dimensions[1],\n (z + 1) * dimensions[0] * dimensions[1]\n );\n\n const segmentsOnLabelmap = [];\n\n for (let i = 0; i < pixelData.length; i++) {\n const segment = pixelData[i];\n if (!segmentsOnLabelmap.includes(segment) && segment !== 0) {\n segmentsOnLabelmap.push(segment);\n }\n }\n\n const labelmap2D = {\n segmentsOnLabelmap,\n pixelData,\n rows: dimensions[1],\n columns: dimensions[0]\n };\n\n if (segmentsOnLabelmap.length === 0) {\n continue;\n }\n\n segmentsOnLabelmap.forEach(segmentIndex => {\n segmentsOnLabelmap3D.add(segmentIndex);\n });\n\n labelmaps2D[dimensions[2] - 1 - z] = labelmap2D;\n }\n\n // remove segment 0 from segmentsOnLabelmap3D\n labelmap3D.segmentsOnLabelmap = Array.from(segmentsOnLabelmap3D);\n\n labelmap3D.labelmaps2D = labelmaps2D;\n\n return labelmap3D;\n}\n\nexport { generateLabelMaps2DFrom3D };\n","/**\n * Checks if point is within array\n * @param {*} array\n * @param {*} pt\n * @returns\n */\nfunction ptInArray(array, pt) {\n let index = -1;\n for (let i = 0; i < array.length; i++) {\n if (isSamePoint(pt, array[i])) {\n index = i;\n }\n }\n return index;\n}\n\n/**\n * Checks if point A and point B contain same values\n * @param {*} ptA\n * @param {*} ptB\n * @returns\n */\nfunction isSamePoint(ptA, ptB) {\n if (ptA[0] == ptB[0] && ptA[1] == ptB[1] && ptA[2] == ptB[2]) {\n return true;\n } else {\n return false;\n }\n}\n\n/**\n * Goes through linesArray and replaces all references of old index with new index\n * @param {*} linesArray\n * @param {*} oldIndex\n * @param {*} newIndex\n */\nfunction replacePointIndexReferences(linesArray, oldIndex, newIndex) {\n for (let i = 0; i < linesArray.length; i++) {\n const line = linesArray[i];\n if (line.a == oldIndex) {\n line.a = newIndex;\n } else if (line.b == oldIndex) {\n line.b = newIndex;\n }\n }\n}\n\n/**\n * Iterate through polyData from vtkjs and merge any points that are the same\n * then update merged point references within lines array\n * @param {*} polyData\n * @param {*} bypass\n * @returns\n */\nexport function removeDuplicatePoints(polyData, bypass) {\n const points = polyData.getPoints();\n const lines = polyData.getLines();\n\n const pointsArray = [];\n for (let i = 0; i < points.getNumberOfPoints(); i++) {\n const pt = points.getPoint(i).slice();\n pointsArray.push(pt);\n }\n const linesArray = [];\n for (let i = 0; i < lines.getNumberOfCells(); i++) {\n const cell = lines.getCell(i * 3).slice();\n //console.log(JSON.stringify(cell));\n const a = cell[0];\n const b = cell[1];\n const line = {\n a,\n b\n };\n linesArray.push(line);\n }\n\n if (bypass) {\n return { points: pointsArray, lines: linesArray };\n }\n\n // Iterate through points and replace any duplicates\n const newPoints = [];\n for (let i = 0; i < pointsArray.length; i++) {\n const pt = pointsArray[i];\n let index = ptInArray(newPoints, pt);\n\n if (index >= 0) {\n // Duplicate Point -> replace references in lines\n replacePointIndexReferences(linesArray, i, index);\n } else {\n index = newPoints.length;\n newPoints.push(pt);\n replacePointIndexReferences(linesArray, i, index);\n }\n }\n\n // Final pass through lines, remove any that refer to exact same point\n const newLines = [];\n linesArray.forEach(line => {\n if (line.a != line.b) {\n newLines.push(line);\n }\n });\n\n return { points: newPoints, lines: newLines };\n}\n\nexport default { removeDuplicatePoints };\n","function findNextLink(line, lines, contourPoints) {\n let index = -1;\n lines.forEach((cell, i) => {\n if (index >= 0) {\n return;\n }\n\n if (cell.a == line.b) {\n index = i;\n }\n });\n\n if (index >= 0) {\n const nextLine = lines[index];\n lines.splice(index, 1);\n\n contourPoints.push(nextLine.b);\n\n if (contourPoints[0] == nextLine.b) {\n return {\n remainingLines: lines,\n contourPoints,\n type: \"CLOSED_PLANAR\"\n //type: 'CLOSEDPLANAR_XOR',\n };\n }\n\n return findNextLink(nextLine, lines, contourPoints);\n }\n\n return {\n remainingLines: lines,\n contourPoints,\n type: \"OPEN_PLANAR\"\n };\n}\n\n/**\n *\n * @param {*} lines\n */\nexport function findContours(lines) {\n if (lines.length == 0) {\n return [];\n }\n\n let contourPoints = [];\n\n const firstCell = lines.shift();\n contourPoints.push(firstCell.a);\n contourPoints.push(firstCell.b);\n const result = findNextLink(firstCell, lines, contourPoints);\n\n if (result.remainingLines.length == 0) {\n return [\n {\n type: result.type,\n contourPoints: result.contourPoints\n }\n ];\n } else {\n const extraContours = findContours(result.remainingLines);\n extraContours.push({\n type: result.type,\n contourPoints: result.contourPoints\n });\n return extraContours;\n }\n}\n\nexport function findContoursFromReducedSet(lines, points) {\n return findContours(lines, points);\n}\n\nexport default {\n findContours,\n findContoursFromReducedSet\n};\n","import { removeDuplicatePoints } from \"./mergePoints\";\nimport { findContoursFromReducedSet } from \"./contourFinder\";\n\nfunction generateContourSetsFromLabelmap({\n segmentations,\n cornerstoneCache,\n cornerstoneToolsEnums,\n vtkUtils\n}) {\n const LABELMAP = cornerstoneToolsEnums.SegmentationRepresentations.Labelmap;\n\n const { representationData, segments } = segmentations;\n const { volumeId: segVolumeId } = representationData[LABELMAP];\n\n // Get segmentation volume\n const vol = cornerstoneCache.getVolume(segVolumeId);\n if (!vol) {\n console.warn(`No volume found for ${segVolumeId}`);\n return;\n }\n\n const numSlices = vol.dimensions[2];\n\n // Get image volume segmentation references\n const imageVol = cornerstoneCache.getVolume(vol.referencedVolumeId);\n if (!imageVol) {\n console.warn(`No volume found for ${vol.referencedVolumeId}`);\n return;\n }\n\n // NOTE: Workaround for marching squares not finding closed contours at\n // boundary of image volume, clear pixels along x-y border of volume\n const segData = vol.imageData.getPointData().getScalars().getData();\n const pixelsPerSlice = vol.dimensions[0] * vol.dimensions[1];\n\n for (let z = 0; z < numSlices; z++) {\n for (let y = 0; y < vol.dimensions[1]; y++) {\n for (let x = 0; x < vol.dimensions[0]; x++) {\n const index = x + y * vol.dimensions[0] + z * pixelsPerSlice;\n\n if (\n x === 0 ||\n y === 0 ||\n x === vol.dimensions[0] - 1 ||\n y === vol.dimensions[1] - 1\n ) {\n segData[index] = 0;\n }\n }\n }\n }\n\n // end workaround\n //\n //\n const ContourSets = [];\n\n // Iterate through all segments in current segmentation set\n const numSegments = segments.length;\n for (let segIndex = 0; segIndex < numSegments; segIndex++) {\n const segment = segments[segIndex];\n\n // Skip empty segments\n if (!segment) {\n continue;\n }\n\n const contourSequence = [];\n for (let sliceIndex = 0; sliceIndex < numSlices; sliceIndex++) {\n // Check if the slice is empty before running marching cube\n if (\n isSliceEmptyForSegment(\n sliceIndex,\n segData,\n pixelsPerSlice,\n segIndex\n )\n ) {\n continue;\n }\n\n try {\n const scalars = vtkUtils.vtkDataArray.newInstance({\n name: \"Scalars\",\n values: Array.from(segData),\n numberOfComponents: 1\n });\n\n // Modify segData for this specific segment directly\n let segmentIndexFound = false;\n for (let i = 0; i < segData.length; i++) {\n const value = segData[i];\n if (value === segIndex) {\n segmentIndexFound = true;\n scalars.setValue(i, 1);\n } else {\n scalars.setValue(i, 0);\n }\n }\n\n if (!segmentIndexFound) {\n continue;\n }\n\n const mSquares = vtkUtils.vtkImageMarchingSquares.newInstance({\n slice: sliceIndex\n });\n\n // filter out the scalar data so that only it has background and\n // the current segment index\n const imageDataCopy = vtkUtils.vtkImageData.newInstance();\n\n imageDataCopy.shallowCopy(vol.imageData);\n imageDataCopy.getPointData().setScalars(scalars);\n\n // Connect pipeline\n mSquares.setInputData(imageDataCopy);\n const cValues = [];\n cValues[0] = 1;\n mSquares.setContourValues(cValues);\n mSquares.setMergePoints(false);\n\n // Perform marching squares\n const msOutput = mSquares.getOutputData();\n\n // Clean up output from marching squares\n const reducedSet = removeDuplicatePoints(msOutput);\n if (reducedSet.points?.length) {\n const contours = findContoursFromReducedSet(\n reducedSet.lines,\n reducedSet.points\n );\n\n contourSequence.push({\n referencedImageId: imageVol.imageIds[sliceIndex],\n contours,\n polyData: reducedSet\n });\n }\n } catch (e) {\n console.warn(sliceIndex);\n console.warn(e);\n }\n }\n\n const metadata = {\n referencedImageId: imageVol.imageIds[0], // just use 0\n FrameOfReferenceUID: imageVol.metadata.FrameOfReferenceUID\n };\n\n const ContourSet = {\n label: segment.label,\n color: segment.color,\n metadata,\n sliceContours: contourSequence\n };\n\n ContourSets.push(ContourSet);\n }\n\n return ContourSets;\n}\n\nfunction isSliceEmptyForSegment(sliceIndex, segData, pixelsPerSlice, segIndex) {\n const startIdx = sliceIndex * pixelsPerSlice;\n const endIdx = startIdx + pixelsPerSlice;\n\n for (let i = startIdx; i < endIdx; i++) {\n if (segData[i] === segIndex) {\n return false;\n }\n }\n\n return true;\n}\n\nexport { generateContourSetsFromLabelmap };\n","// comment\nclass RectangleROIStartEndThreshold {\n constructor() {\n // empty\n }\n\n static getContourSequence(toolData, metadataProvider) {\n const { data } = toolData;\n const { projectionPoints, projectionPointsImageIds } = data.cachedStats;\n\n return projectionPoints.map((point, index) => {\n const ContourData = getPointData(point);\n const ContourImageSequence = getContourImageSequence(\n projectionPointsImageIds[index],\n metadataProvider\n );\n\n return {\n NumberOfContourPoints: ContourData.length / 3,\n ContourImageSequence,\n ContourGeometricType: \"CLOSED_PLANAR\",\n ContourData\n };\n });\n }\n}\n\nRectangleROIStartEndThreshold.toolName = \"RectangleROIStartEndThreshold\";\n\nfunction getPointData(points) {\n // Since this is a closed contour, the order of the points is important.\n // re-order the points to be in the correct order clockwise\n // Spread to make sure Float32Arrays are converted to arrays\n const orderedPoints = [\n ...points[0],\n ...points[1],\n ...points[3],\n ...points[2]\n ];\n const pointsArray = orderedPoints.flat();\n\n // reduce the precision of the points to 2 decimal places\n const pointsArrayWithPrecision = pointsArray.map(point => {\n return point.toFixed(2);\n });\n\n return pointsArrayWithPrecision;\n}\n\nfunction getContourImageSequence(imageId, metadataProvider) {\n const sopCommon = metadataProvider.get(\"sopCommonModule\", imageId);\n\n return {\n ReferencedSOPClassUID: sopCommon.sopClassUID,\n ReferencedSOPInstanceUID: sopCommon.sopInstanceUID\n };\n}\nexport default RectangleROIStartEndThreshold;\n","import RectangleROIStartEndThreshold from \"./RectangleROIStartEndThreshold\";\n\nfunction validateAnnotation(annotation) {\n if (!annotation?.data) {\n throw new Error(\"Tool data is empty\");\n }\n\n if (!annotation.metadata || annotation.metadata.referenceImageId) {\n throw new Error(\"Tool data is not associated with any imageId\");\n }\n}\n\nclass AnnotationToPointData {\n constructor() {\n // empty\n }\n\n static convert(annotation, index, metadataProvider) {\n validateAnnotation(annotation);\n\n const { toolName } = annotation.metadata;\n const toolClass = AnnotationToPointData.TOOL_NAMES[toolName];\n\n if (!toolClass) {\n throw new Error(\n `Unknown tool type: ${toolName}, cannot convert to RTSSReport`\n );\n }\n\n // Each toolData should become a list of contours, ContourSequence\n // contains a list of contours with their pointData, their geometry\n // type and their length.\n const ContourSequence = toolClass.getContourSequence(\n annotation,\n metadataProvider\n );\n\n // Todo: random rgb color for now, options should be passed in\n const color = [\n Math.floor(Math.random() * 255),\n Math.floor(Math.random() * 255),\n Math.floor(Math.random() * 255)\n ];\n\n return {\n ReferencedROINumber: index + 1,\n ROIDisplayColor: color,\n ContourSequence\n };\n }\n\n static register(toolClass) {\n AnnotationToPointData.TOOL_NAMES[toolClass.toolName] = toolClass;\n }\n}\n\nAnnotationToPointData.TOOL_NAMES = {};\nAnnotationToPointData.register(RectangleROIStartEndThreshold);\n\nexport default AnnotationToPointData;\n","export default function getReferencedFrameOfReferenceSequence(\n metadata,\n metadataProvider,\n dataset\n) {\n const { referencedImageId: imageId, FrameOfReferenceUID } = metadata;\n const instance = metadataProvider.get(\"instance\", imageId);\n const { SeriesInstanceUID } = instance;\n\n const { ReferencedSeriesSequence } = dataset;\n\n return [\n {\n FrameOfReferenceUID,\n RTReferencedStudySequence: [\n {\n ReferencedSOPClassUID: dataset.SOPClassUID,\n ReferencedSOPInstanceUID: dataset.SOPInstanceUID,\n RTReferencedSeriesSequence: [\n {\n SeriesInstanceUID,\n ContourImageSequence: [\n ...ReferencedSeriesSequence[0]\n .ReferencedInstanceSequence\n ]\n }\n ]\n }\n ]\n }\n ];\n}\n","export default function getReferencedSeriesSequence(\n metadata,\n _index,\n metadataProvider,\n DicomMetadataStore\n) {\n // grab imageId from toolData\n const { referencedImageId: imageId } = metadata;\n const instance = metadataProvider.get(\"instance\", imageId);\n const { SeriesInstanceUID, StudyInstanceUID } = instance;\n\n const ReferencedSeriesSequence = [];\n if (SeriesInstanceUID) {\n const series = DicomMetadataStore.getSeries(\n StudyInstanceUID,\n SeriesInstanceUID\n );\n\n const ReferencedSeries = {\n SeriesInstanceUID,\n ReferencedInstanceSequence: []\n };\n\n series.instances.forEach(instance => {\n const { SOPInstanceUID, SOPClassUID } = instance;\n ReferencedSeries.ReferencedInstanceSequence.push({\n ReferencedSOPClassUID: SOPClassUID,\n ReferencedSOPInstanceUID: SOPInstanceUID\n });\n });\n\n ReferencedSeriesSequence.push(ReferencedSeries);\n }\n\n return ReferencedSeriesSequence;\n}\n","export default function getStructureSetModule(contour, index) {\n const { FrameOfReferenceUID } = contour.metadata;\n\n return {\n ROINumber: index + 1,\n ROIName: contour.name || `Todo: name ${index + 1}`,\n ROIDescription: `Todo: description ${index + 1}`,\n ROIGenerationAlgorithm: \"Todo: algorithm\",\n ReferencedFrameOfReferenceUID: FrameOfReferenceUID\n };\n}\n","import {\n generateContourSetsFromLabelmap,\n AnnotationToPointData\n} from \"./utilities\";\nimport dcmjs from \"dcmjs\";\nimport {\n getPatientModule,\n getReferencedFrameOfReferenceSequence,\n getReferencedSeriesSequence,\n getRTROIObservationsSequence,\n getRTSeriesModule,\n getStructureSetModule\n} from \"./utilities\";\n\nconst { DicomMetaDictionary } = dcmjs.data;\n\n/**\n * Convert handles to RTSS report containing the dcmjs dicom dataset.\n *\n * Note: current WIP and using segmentation to contour conversion,\n * routine that is not fully tested\n *\n * @param segmentations - Cornerstone tool segmentations data\n * @param metadataProvider - Metadata provider\n * @param DicomMetadataStore - metadata store instance\n * @param cs - cornerstone instance\n * @param csTools - cornerstone tool instance\n * @returns Report object containing the dataset\n */\nfunction generateRTSSFromSegmentations(\n segmentations,\n metadataProvider,\n DicomMetadataStore,\n cornerstoneCache,\n cornerstoneToolsEnums,\n vtkUtils\n) {\n // Convert segmentations to ROIContours\n const roiContours = [];\n\n const contourSets = generateContourSetsFromLabelmap({\n segmentations,\n cornerstoneCache,\n cornerstoneToolsEnums,\n vtkUtils\n });\n\n contourSets.forEach((contourSet, segIndex) => {\n // Check contour set isn't undefined\n if (contourSet) {\n const contourSequence = [];\n contourSet.sliceContours.forEach(sliceContour => {\n /**\n * addContour - Adds a new ROI with related contours to ROIContourSequence\n *\n * @param newContour - cornerstoneTools `ROIContour` object\n *\n * newContour = {\n * name: string,\n * description: string,\n * contourSequence: array[contour]\n * color: array[number],\n * metadata: {\n * referencedImageId: string,\n * FrameOfReferenceUID: string\n * }\n * }\n *\n * contour = {\n * ContourImageSequence: array[\n * { ReferencedSOPClassUID: string, ReferencedSOPInstanceUID: string}\n * ]\n * ContourGeometricType: string,\n * NumberOfContourPoints: number,\n * ContourData: array[number]\n * }\n */\n // Note: change needed if support non-planar contour representation is needed\n const sopCommon = metadataProvider.get(\n \"sopCommonModule\",\n sliceContour.referencedImageId\n );\n const ReferencedSOPClassUID = sopCommon.sopClassUID;\n const ReferencedSOPInstanceUID = sopCommon.sopInstanceUID;\n const ContourImageSequence = [\n { ReferencedSOPClassUID, ReferencedSOPInstanceUID } // NOTE: replace in dcmjs?\n ];\n\n const sliceContourPolyData = sliceContour.polyData;\n\n sliceContour.contours.forEach((contour, index) => {\n const ContourGeometricType = contour.type;\n const NumberOfContourPoints = contour.contourPoints.length;\n const ContourData = [];\n\n contour.contourPoints.forEach(point => {\n const pointData = sliceContourPolyData.points[point];\n pointData[0] = +pointData[0].toFixed(2);\n pointData[1] = +pointData[1].toFixed(2);\n pointData[2] = +pointData[2].toFixed(2);\n ContourData.push(pointData[0]);\n ContourData.push(pointData[1]);\n ContourData.push(pointData[2]);\n });\n\n contourSequence.push({\n ContourImageSequence,\n ContourGeometricType,\n NumberOfContourPoints,\n ContourNumber: index + 1,\n ContourData\n });\n });\n });\n\n const segLabel = contourSet.label || `Segment ${segIndex + 1}`;\n\n const ROIContour = {\n name: segLabel,\n description: segLabel,\n contourSequence,\n color: contourSet.color,\n metadata: contourSet.metadata\n };\n\n roiContours.push(ROIContour);\n }\n });\n\n const rtMetadata = {\n name: segmentations.label,\n label: segmentations.label\n };\n\n let dataset = _initializeDataset(\n rtMetadata,\n roiContours[0].metadata,\n metadataProvider\n );\n\n roiContours.forEach((contour, index) => {\n const roiContour = {\n ROIDisplayColor: contour.color || [255, 0, 0],\n ContourSequence: contour.contourSequence,\n ReferencedROINumber: index + 1\n };\n\n dataset.StructureSetROISequence.push(\n getStructureSetModule(contour, index, metadataProvider)\n );\n\n dataset.ROIContourSequence.push(roiContour);\n\n // ReferencedSeriesSequence\n dataset.ReferencedSeriesSequence = getReferencedSeriesSequence(\n contour.metadata,\n index,\n metadataProvider,\n DicomMetadataStore\n );\n\n // ReferencedFrameOfReferenceSequence\n dataset.ReferencedFrameOfReferenceSequence =\n getReferencedFrameOfReferenceSequence(\n contour.metadata,\n metadataProvider,\n dataset\n );\n });\n\n const fileMetaInformationVersionArray = new Uint8Array(2);\n fileMetaInformationVersionArray[1] = 1;\n\n const _meta = {\n FileMetaInformationVersion: {\n Value: [fileMetaInformationVersionArray.buffer],\n vr: \"OB\"\n },\n TransferSyntaxUID: {\n Value: [\"1.2.840.10008.1.2.1\"],\n vr: \"UI\"\n },\n ImplementationClassUID: {\n Value: [DicomMetaDictionary.uid()], // TODO: could be git hash or other valid id\n vr: \"UI\"\n },\n ImplementationVersionName: {\n Value: [\"dcmjs\"],\n vr: \"SH\"\n }\n };\n\n dataset._meta = _meta;\n\n return dataset;\n}\n\n/**\n * Convert handles to RTSSReport report object containing the dcmjs dicom dataset.\n *\n * Note: The tool data needs to be formatted in a specific way, and currently\n * it is limited to the RectangleROIStartEndTool in the Cornerstone.\n *\n * @param annotations Array of Cornerstone tool annotation data\n * @param metadataProvider Metadata provider\n * @param options report generation options\n * @returns Report object containing the dataset\n */\nfunction generateRTSSFromAnnotations(\n annotations,\n metadataProvider,\n DicomMetadataStore,\n options\n) {\n const rtMetadata = {\n name: \"RTSS from Annotations\",\n label: \"RTSS from Annotations\"\n };\n let dataset = _initializeDataset(\n rtMetadata,\n annotations[0].metadata,\n metadataProvider\n );\n\n annotations.forEach((annotation, index) => {\n const ContourSequence = AnnotationToPointData.convert(\n annotation,\n index,\n metadataProvider,\n options\n );\n\n dataset.StructureSetROISequence.push(\n getStructureSetModule(annotation, index, metadataProvider)\n );\n\n dataset.ROIContourSequence.push(ContourSequence);\n dataset.RTROIObservationsSequence.push(\n getRTROIObservationsSequence(annotation, index)\n );\n\n // ReferencedSeriesSequence\n // Todo: handle more than one series\n dataset.ReferencedSeriesSequence = getReferencedSeriesSequence(\n annotation.metadata,\n index,\n metadataProvider,\n DicomMetadataStore\n );\n\n // ReferencedFrameOfReferenceSequence\n dataset.ReferencedFrameOfReferenceSequence =\n getReferencedFrameOfReferenceSequence(\n annotation.metadata,\n metadataProvider,\n dataset\n );\n });\n\n const fileMetaInformationVersionArray = new Uint8Array(2);\n fileMetaInformationVersionArray[1] = 1;\n\n const _meta = {\n FileMetaInformationVersion: {\n Value: [fileMetaInformationVersionArray.buffer],\n vr: \"OB\"\n },\n TransferSyntaxUID: {\n Value: [\"1.2.840.10008.1.2.1\"],\n vr: \"UI\"\n },\n ImplementationClassUID: {\n Value: [DicomMetaDictionary.uid()], // TODO: could be git hash or other valid id\n vr: \"UI\"\n },\n ImplementationVersionName: {\n Value: [\"dcmjs\"],\n vr: \"SH\"\n }\n };\n\n dataset._meta = _meta;\n\n return dataset;\n}\n\n// /**\n// * Generate Cornerstone tool state from dataset\n// * @param {object} dataset dataset\n// * @param {object} hooks\n// * @param {function} hooks.getToolClass Function to map dataset to a tool class\n// * @returns\n// */\n// //static generateToolState(_dataset, _hooks = {}) {\n// function generateToolState() {\n// // Todo\n// console.warn(\"RTSS.generateToolState not implemented\");\n// }\n\nfunction _initializeDataset(rtMetadata, imgMetadata, metadataProvider) {\n const rtSOPInstanceUID = DicomMetaDictionary.uid();\n\n // get the first annotation data\n const { referencedImageId: imageId, FrameOfReferenceUID } = imgMetadata;\n\n const { studyInstanceUID } = metadataProvider.get(\n \"generalSeriesModule\",\n imageId\n );\n\n const patientModule = getPatientModule(imageId, metadataProvider);\n const rtSeriesModule = getRTSeriesModule(DicomMetaDictionary);\n\n return {\n StructureSetROISequence: [],\n ROIContourSequence: [],\n RTROIObservationsSequence: [],\n ReferencedSeriesSequence: [],\n ReferencedFrameOfReferenceSequence: [],\n ...patientModule,\n ...rtSeriesModule,\n StudyInstanceUID: studyInstanceUID,\n SOPClassUID: \"1.2.840.10008.5.1.4.1.1.481.3\", // RT Structure Set Storage\n SOPInstanceUID: rtSOPInstanceUID,\n Manufacturer: \"dcmjs\",\n Modality: \"RTSTRUCT\",\n FrameOfReferenceUID,\n PositionReferenceIndicator: \"\",\n StructureSetLabel: rtMetadata.label || \"\",\n StructureSetName: rtMetadata.name || \"\",\n ReferringPhysicianName: \"\",\n OperatorsName: \"\",\n StructureSetDate: DicomMetaDictionary.date(),\n StructureSetTime: DicomMetaDictionary.time()\n };\n}\n\nexport { generateRTSSFromSegmentations, generateRTSSFromAnnotations };\n","export default function getPatientModule(imageId, metadataProvider) {\n const generalSeriesModule = metadataProvider.get(\n \"generalSeriesModule\",\n imageId\n );\n const generalStudyModule = metadataProvider.get(\n \"generalStudyModule\",\n imageId\n );\n const patientStudyModule = metadataProvider.get(\n \"patientStudyModule\",\n imageId\n );\n const patientModule = metadataProvider.get(\"patientModule\", imageId);\n const patientDemographicModule = metadataProvider.get(\n \"patientDemographicModule\",\n imageId\n );\n\n return {\n Modality: generalSeriesModule.modality,\n PatientID: patientModule.patientId,\n PatientName: patientModule.patientName,\n PatientBirthDate: \"\",\n PatientAge: patientStudyModule.patientAge,\n PatientSex: patientDemographicModule.patientSex,\n PatientWeight: patientStudyModule.patientWeight,\n StudyDate: generalStudyModule.studyDate,\n StudyTime: generalStudyModule.studyTime,\n StudyID: \"ToDo\",\n AccessionNumber: generalStudyModule.accessionNumber\n };\n}\n","export default function getRTSeriesModule(DicomMetaDictionary) {\n return {\n SeriesInstanceUID: DicomMetaDictionary.uid(), // generate a new series instance uid\n SeriesNumber: \"99\" // Todo:: what should be the series number?\n };\n}\n","export default function getRTROIObservationsSequence(toolData, index) {\n return {\n ObservationNumber: index + 1,\n ReferencedROINumber: index + 1,\n RTROIInterpretedType: \"Todo: type\",\n ROIInterpreter: \"Todo: interpreter\"\n };\n}\n","import MeasurementReport from \"./MeasurementReport\";\nimport CodeScheme from \"./CodingScheme\";\nimport CORNERSTONE_3D_TAG from \"./cornerstone3DTag\";\n\nimport ArrowAnnotate from \"./ArrowAnnotate\";\nimport Bidirectional from \"./Bidirectional\";\nimport Angle from \"./Angle\";\nimport CobbAngle from \"./CobbAngle\";\nimport CircleROI from \"./CircleROI\";\nimport EllipticalROI from \"./EllipticalROI\";\nimport RectangleROI from \"./RectangleROI\";\nimport Length from \"./Length\";\nimport PlanarFreehandROI from \"./PlanarFreehandROI\";\nimport Probe from \"./Probe\";\n\nimport * as Segmentation from \"./Segmentation\";\nimport * as RTSS from \"./RTStruct\";\n\nconst Cornerstone3DSR = {\n Bidirectional,\n CobbAngle,\n Angle,\n Length,\n CircleROI,\n EllipticalROI,\n RectangleROI,\n ArrowAnnotate,\n Probe,\n PlanarFreehandROI,\n MeasurementReport,\n CodeScheme,\n CORNERSTONE_3D_TAG\n};\n\nconst Cornerstone3DSEG = {\n Segmentation\n};\n\nconst Cornerstone3DRT = {\n RTSS\n};\n\nexport { Cornerstone3DSR, Cornerstone3DSEG, Cornerstone3DRT };\n","import { data } from \"dcmjs\";\n\nconst { Colors, BitArray } = data;\n\n// TODO: Is there a better name for this? RGBAInt?\n// Should we move it to Colors.js\nfunction dicomlab2RGBA(cielab) {\n const rgba = Colors.dicomlab2RGB(cielab).map(x => Math.round(x * 255));\n rgba.push(255);\n\n return rgba;\n}\n\n// TODO: Copied these functions in from VTK Math so we don't need a dependency.\n// I guess we should put them somewhere\n// https://github.com/Kitware/vtk-js/blob/master/Sources/Common/Core/Math/index.js\nfunction cross(x, y, out) {\n const Zx = x[1] * y[2] - x[2] * y[1];\n const Zy = x[2] * y[0] - x[0] * y[2];\n const Zz = x[0] * y[1] - x[1] * y[0];\n out[0] = Zx;\n out[1] = Zy;\n out[2] = Zz;\n}\n\nfunction norm(x, n = 3) {\n switch (n) {\n case 1:\n return Math.abs(x);\n case 2:\n return Math.sqrt(x[0] * x[0] + x[1] * x[1]);\n case 3:\n return Math.sqrt(x[0] * x[0] + x[1] * x[1] + x[2] * x[2]);\n default: {\n let sum = 0;\n for (let i = 0; i < n; i++) {\n sum += x[i] * x[i];\n }\n return Math.sqrt(sum);\n }\n }\n}\n\nfunction normalize(x) {\n const den = norm(x);\n if (den !== 0.0) {\n x[0] /= den;\n x[1] /= den;\n x[2] /= den;\n }\n return den;\n}\n\nfunction subtract(a, b, out) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n}\n\n// TODO: This is a useful utility on its own. We should move it somewhere?\n// dcmjs.adapters.vtk.Multiframe? dcmjs.utils?\nfunction geometryFromFunctionalGroups(dataset, PerFrameFunctionalGroups) {\n const geometry = {};\n const pixelMeasures =\n dataset.SharedFunctionalGroupsSequence.PixelMeasuresSequence;\n const planeOrientation =\n dataset.SharedFunctionalGroupsSequence.PlaneOrientationSequence;\n\n // Find the origin of the volume from the PerFrameFunctionalGroups' ImagePositionPatient values\n //\n // TODO: assumes sorted frames. This should read the ImagePositionPatient from each frame and\n // sort them to obtain the first and last position along the acquisition axis.\n const firstFunctionalGroup = PerFrameFunctionalGroups[0];\n const lastFunctionalGroup =\n PerFrameFunctionalGroups[PerFrameFunctionalGroups.length - 1];\n const firstPosition =\n firstFunctionalGroup.PlanePositionSequence.ImagePositionPatient.map(\n Number\n );\n const lastPosition =\n lastFunctionalGroup.PlanePositionSequence.ImagePositionPatient.map(\n Number\n );\n\n geometry.origin = firstPosition;\n\n // NB: DICOM PixelSpacing is defined as Row then Column,\n // unlike ImageOrientationPatient\n geometry.spacing = [\n pixelMeasures.PixelSpacing[1],\n pixelMeasures.PixelSpacing[0],\n pixelMeasures.SpacingBetweenSlices\n ].map(Number);\n\n geometry.dimensions = [\n dataset.Columns,\n dataset.Rows,\n PerFrameFunctionalGroups.length\n ].map(Number);\n\n const orientation = planeOrientation.ImageOrientationPatient.map(Number);\n const columnStepToPatient = orientation.slice(0, 3);\n const rowStepToPatient = orientation.slice(3, 6);\n\n geometry.planeNormal = [];\n\n cross(columnStepToPatient, rowStepToPatient, geometry.planeNormal);\n\n geometry.sliceStep = [];\n subtract(lastPosition, firstPosition, geometry.sliceStep);\n normalize(geometry.sliceStep);\n geometry.direction = columnStepToPatient\n .concat(rowStepToPatient)\n .concat(geometry.sliceStep);\n\n return geometry;\n}\n\nexport default class Segmentation {\n constructor() {}\n\n /**\n * Produces an array of Segments from an input DICOM Segmentation dataset\n *\n * Segments are returned with Geometry values that can be used to create\n * VTK Image Data objects.\n *\n * @example Example usage to create VTK Volume actors from each segment:\n *\n * const actors = [];\n * const segments = generateToolState(dataset);\n * segments.forEach(segment => {\n * // now make actors using the segment information\n * const scalarArray = vtk.Common.Core.vtkDataArray.newInstance({\n * name: \"Scalars\",\n * numberOfComponents: 1,\n * values: segment.pixelData,\n * });\n *\n * const imageData = vtk.Common.DataModel.vtkImageData.newInstance();\n * imageData.getPointData().setScalars(scalarArray);\n * imageData.setDimensions(geometry.dimensions);\n * imageData.setSpacing(geometry.spacing);\n * imageData.setOrigin(geometry.origin);\n * imageData.setDirection(geometry.direction);\n *\n * const mapper = vtk.Rendering.Core.vtkVolumeMapper.newInstance();\n * mapper.setInputData(imageData);\n * mapper.setSampleDistance(2.);\n *\n * const actor = vtk.Rendering.Core.vtkVolume.newInstance();\n * actor.setMapper(mapper);\n *\n * actors.push(actor);\n * });\n *\n * @param dataset\n * @return {{}}\n */\n static generateSegments(dataset) {\n if (dataset.SegmentSequence.constructor.name !== \"Array\") {\n dataset.SegmentSequence = [dataset.SegmentSequence];\n }\n\n dataset.SegmentSequence.forEach(segment => {\n // TODO: other interesting fields could be extracted from the segment\n // TODO: Read SegmentsOverlay field\n // http://dicom.nema.org/medical/dicom/current/output/chtml/part03/sect_C.8.20.2.html\n\n // TODO: Looks like vtkColor only wants RGB in 0-1 values.\n // Why was this example converting to RGBA with 0-255 values?\n const color = dicomlab2RGBA(segment.RecommendedDisplayCIELabValue);\n\n segments[segment.SegmentNumber] = {\n color,\n functionalGroups: [],\n offset: null,\n size: null,\n pixelData: null\n };\n });\n\n // make a list of functional groups per segment\n dataset.PerFrameFunctionalGroupsSequence.forEach(functionalGroup => {\n const segmentNumber =\n functionalGroup.SegmentIdentificationSequence\n .ReferencedSegmentNumber;\n\n segments[segmentNumber].functionalGroups.push(functionalGroup);\n });\n\n // determine per-segment index into the pixel data\n // TODO: only handles one-bit-per pixel\n const frameSize = Math.ceil((dataset.Rows * dataset.Columns) / 8);\n let nextOffset = 0;\n\n Object.keys(segments).forEach(segmentNumber => {\n const segment = segments[segmentNumber];\n\n segment.numberOfFrames = segment.functionalGroups.length;\n segment.size = segment.numberOfFrames * frameSize;\n segment.offset = nextOffset;\n\n nextOffset = segment.offset + segment.size;\n\n const packedSegment = dataset.PixelData.slice(\n segment.offset,\n nextOffset\n );\n\n segment.pixelData = BitArray.unpack(packedSegment);\n\n const geometry = geometryFromFunctionalGroups(\n dataset,\n segment.functionalGroups\n );\n\n segment.geometry = geometry;\n });\n\n return segments;\n }\n}\n","import { CornerstoneSR, CornerstoneSEG } from \"./Cornerstone\";\nimport {\n Cornerstone3DSR,\n Cornerstone3DSEG,\n Cornerstone3DRT\n} from \"./Cornerstone3D\";\nimport { VTKjsSEG } from \"./VTKjs\";\nimport * as Enums from \"./enums\";\nimport * as helpers from \"./helpers\";\n\nconst adaptersSR = {\n Cornerstone: CornerstoneSR,\n Cornerstone3D: Cornerstone3DSR\n};\n\nconst adaptersSEG = {\n Cornerstone: CornerstoneSEG,\n Cornerstone3D: Cornerstone3DSEG,\n VTKjs: VTKjsSEG\n};\n\nconst adaptersRT = {\n Cornerstone3D: Cornerstone3DRT\n};\n\nexport { adaptersSR, adaptersSEG, adaptersRT, Enums, helpers };\n","import Segmentation from \"./Segmentation\";\n\nconst VTKjsSEG = {\n Segmentation\n};\n\nexport { VTKjsSEG };\n","\"use strict\"\n\nfunction iota(n) {\n var result = new Array(n)\n for(var i=0; i\n * @license MIT\n */\n\nmodule.exports = function isBuffer (obj) {\n return obj != null && obj.constructor != null &&\n typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj)\n}\n","var iota = require(\"iota-array\")\nvar isBuffer = require(\"is-buffer\")\n\nvar hasTypedArrays = ((typeof Float64Array) !== \"undefined\")\n\nfunction compare1st(a, b) {\n return a[0] - b[0]\n}\n\nfunction order() {\n var stride = this.stride\n var terms = new Array(stride.length)\n var i\n for(i=0; iMath.abs(this.stride[1]))?[1,0]:[0,1]}})\")\n } else if(dimension === 3) {\n code.push(\n\"var s0=Math.abs(this.stride[0]),s1=Math.abs(this.stride[1]),s2=Math.abs(this.stride[2]);\\\nif(s0>s1){\\\nif(s1>s2){\\\nreturn [2,1,0];\\\n}else if(s0>s2){\\\nreturn [1,2,0];\\\n}else{\\\nreturn [1,0,2];\\\n}\\\n}else if(s0>s2){\\\nreturn [2,0,1];\\\n}else if(s2>s1){\\\nreturn [0,1,2];\\\n}else{\\\nreturn [0,2,1];\\\n}}})\")\n }\n } else {\n code.push(\"ORDER})\")\n }\n }\n\n //view.set(i0, ..., v):\n code.push(\n\"proto.set=function \"+className+\"_set(\"+args.join(\",\")+\",v){\")\n if(useGetters) {\n code.push(\"return this.data.set(\"+index_str+\",v)}\")\n } else {\n code.push(\"return this.data[\"+index_str+\"]=v}\")\n }\n\n //view.get(i0, ...):\n code.push(\"proto.get=function \"+className+\"_get(\"+args.join(\",\")+\"){\")\n if(useGetters) {\n code.push(\"return this.data.get(\"+index_str+\")}\")\n } else {\n code.push(\"return this.data[\"+index_str+\"]}\")\n }\n\n //view.index:\n code.push(\n \"proto.index=function \"+className+\"_index(\", args.join(), \"){return \"+index_str+\"}\")\n\n //view.hi():\n code.push(\"proto.hi=function \"+className+\"_hi(\"+args.join(\",\")+\"){return new \"+className+\"(this.data,\"+\n indices.map(function(i) {\n return [\"(typeof i\",i,\"!=='number'||i\",i,\"<0)?this.shape[\", i, \"]:i\", i,\"|0\"].join(\"\")\n }).join(\",\")+\",\"+\n indices.map(function(i) {\n return \"this.stride[\"+i + \"]\"\n }).join(\",\")+\",this.offset)}\")\n\n //view.lo():\n var a_vars = indices.map(function(i) { return \"a\"+i+\"=this.shape[\"+i+\"]\" })\n var c_vars = indices.map(function(i) { return \"c\"+i+\"=this.stride[\"+i+\"]\" })\n code.push(\"proto.lo=function \"+className+\"_lo(\"+args.join(\",\")+\"){var b=this.offset,d=0,\"+a_vars.join(\",\")+\",\"+c_vars.join(\",\"))\n for(var i=0; i=0){\\\nd=i\"+i+\"|0;\\\nb+=c\"+i+\"*d;\\\na\"+i+\"-=d}\")\n }\n code.push(\"return new \"+className+\"(this.data,\"+\n indices.map(function(i) {\n return \"a\"+i\n }).join(\",\")+\",\"+\n indices.map(function(i) {\n return \"c\"+i\n }).join(\",\")+\",b)}\")\n\n //view.step():\n code.push(\"proto.step=function \"+className+\"_step(\"+args.join(\",\")+\"){var \"+\n indices.map(function(i) {\n return \"a\"+i+\"=this.shape[\"+i+\"]\"\n }).join(\",\")+\",\"+\n indices.map(function(i) {\n return \"b\"+i+\"=this.stride[\"+i+\"]\"\n }).join(\",\")+\",c=this.offset,d=0,ceil=Math.ceil\")\n for(var i=0; i=0){c=(c+this.stride[\"+i+\"]*i\"+i+\")|0}else{a.push(this.shape[\"+i+\"]);b.push(this.stride[\"+i+\"])}\")\n }\n code.push(\"var ctor=CTOR_LIST[a.length+1];return ctor(this.data,a,b,c)}\")\n\n //Add return statement\n code.push(\"return function construct_\"+className+\"(data,shape,stride,offset){return new \"+className+\"(data,\"+\n indices.map(function(i) {\n return \"shape[\"+i+\"]\"\n }).join(\",\")+\",\"+\n indices.map(function(i) {\n return \"stride[\"+i+\"]\"\n }).join(\",\")+\",offset)}\")\n\n //Compile procedure\n var procedure = new Function(\"CTOR_LIST\", \"ORDER\", code.join(\"\\n\"))\n return procedure(CACHED_CONSTRUCTORS[dtype], order)\n}\n\nfunction arrayDType(data) {\n if(isBuffer(data)) {\n return \"buffer\"\n }\n if(hasTypedArrays) {\n switch(Object.prototype.toString.call(data)) {\n case \"[object Float64Array]\":\n return \"float64\"\n case \"[object Float32Array]\":\n return \"float32\"\n case \"[object Int8Array]\":\n return \"int8\"\n case \"[object Int16Array]\":\n return \"int16\"\n case \"[object Int32Array]\":\n return \"int32\"\n case \"[object Uint8Array]\":\n return \"uint8\"\n case \"[object Uint16Array]\":\n return \"uint16\"\n case \"[object Uint32Array]\":\n return \"uint32\"\n case \"[object Uint8ClampedArray]\":\n return \"uint8_clamped\"\n case \"[object BigInt64Array]\":\n return \"bigint64\"\n case \"[object BigUint64Array]\":\n return \"biguint64\"\n }\n }\n if(Array.isArray(data)) {\n return \"array\"\n }\n return \"generic\"\n}\n\nvar CACHED_CONSTRUCTORS = {\n \"float32\":[],\n \"float64\":[],\n \"int8\":[],\n \"int16\":[],\n \"int32\":[],\n \"uint8\":[],\n \"uint16\":[],\n \"uint32\":[],\n \"array\":[],\n \"uint8_clamped\":[],\n \"bigint64\": [],\n \"biguint64\": [],\n \"buffer\":[],\n \"generic\":[]\n}\n\n;(function() {\n for(var id in CACHED_CONSTRUCTORS) {\n CACHED_CONSTRUCTORS[id].push(compileConstructor(id, -1))\n }\n});\n\nfunction wrappedNDArrayCtor(data, shape, stride, offset) {\n if(data === undefined) {\n var ctor = CACHED_CONSTRUCTORS.array[0]\n return ctor([])\n } else if(typeof data === \"number\") {\n data = [data]\n }\n if(shape === undefined) {\n shape = [ data.length ]\n }\n var d = shape.length\n if(stride === undefined) {\n stride = new Array(d)\n for(var i=d-1, sz=1; i>=0; --i) {\n stride[i] = sz\n sz *= shape[i]\n }\n }\n if(offset === undefined) {\n offset = 0\n for(var i=0; i0&&o();break;case"number":t.im=0,t.re=e;break;default:o()}return isNaN(t.re)||isNaN(t.im),t}(e,r);this.re=t.re,this.im=t.im}u.prototype={re:0,im:0,sign:function(){var e=this.abs();return new u(this.re/e,this.im/e)},add:function(e,r){var t=new u(e,r);return this.isInfinite()&&t.isInfinite()?u.NAN:this.isInfinite()||t.isInfinite()?u.INFINITY:new u(this.re+t.re,this.im+t.im)},sub:function(e,r){var t=new u(e,r);return this.isInfinite()&&t.isInfinite()?u.NAN:this.isInfinite()||t.isInfinite()?u.INFINITY:new u(this.re-t.re,this.im-t.im)},mul:function(e,r){var t=new u(e,r);return this.isInfinite()&&t.isZero()||this.isZero()&&t.isInfinite()?u.NAN:this.isInfinite()||t.isInfinite()?u.INFINITY:0===t.im&&0===this.im?new u(this.re*t.re,0):new u(this.re*t.re-this.im*t.im,this.re*t.im+this.im*t.re)},div:function(e,r){var t=new u(e,r);if(this.isZero()&&t.isZero()||this.isInfinite()&&t.isInfinite())return u.NAN;if(this.isInfinite()||t.isZero())return u.INFINITY;if(this.isZero()||t.isInfinite())return u.ZERO;e=this.re,r=this.im;var n,i,a=t.re,o=t.im;return 0===o?new u(e/a,r/a):Math.abs(a)0)return new u(Math.pow(e,t.re),0);if(0===e)switch((t.re%4+4)%4){case 0:return new u(Math.pow(r,t.re),0);case 1:return new u(0,Math.pow(r,t.re));case 2:return new u(-Math.pow(r,t.re),0);case 3:return new u(0,-Math.pow(r,t.re))}}if(0===e&&0===r&&t.re>0&&t.im>=0)return u.ZERO;var n=Math.atan2(r,e),i=s(e,r);return e=Math.exp(t.re*i-t.im*n),r=t.im*i+t.re*n,new u(e*Math.cos(r),e*Math.sin(r))},sqrt:function(){var e,r,t=this.re,n=this.im,i=this.abs();if(t>=0){if(0===n)return new u(Math.sqrt(t),0);e=.5*Math.sqrt(2*(i+t))}else e=Math.abs(n)/Math.sqrt(2*(i-t));return r=t<=0?.5*Math.sqrt(2*(i-t)):Math.abs(n)/Math.sqrt(2*(i+t)),new u(e,n<0?-r:r)},exp:function(){var e=Math.exp(this.re);return this.im,new u(e*Math.cos(this.im),e*Math.sin(this.im))},expm1:function(){var e=this.re,r=this.im;return new u(Math.expm1(e)*Math.cos(r)+function(e){var r=Math.PI/4;if(-r>e||e>r)return Math.cos(e)-1;var t=e*e;return t*(t*(t*(t*(t*(t*(t*(t/20922789888e3-1/87178291200)+1/479001600)-1/3628800)+1/40320)-1/720)+1/24)-.5)}(r),Math.exp(e)*Math.sin(r))},log:function(){var e=this.re,r=this.im;return new u(s(e,r),Math.atan2(r,e))},abs:function(){return e=this.re,r=this.im,t=Math.abs(e),n=Math.abs(r),t<3e3&&n<3e3?Math.sqrt(t*t+n*n):(t1&&0===r,n=1-e,i=1+e,a=n*n+r*r,o=0!==a?new u((i*n-r*r)/a,(r*n+i*r)/a):new u(-1!==e?e/0:0,0!==r?r/0:0),c=o.re;return o.re=s(o.re,o.im)/2,o.im=Math.atan2(o.im,c)/2,t&&(o.im=-o.im),o},acoth:function(){var e=this.re,r=this.im;if(0===e&&0===r)return new u(0,Math.PI/2);var t=e*e+r*r;return 0!==t?new u(e/t,-r/t).atanh():new u(0!==e?e/0:0,0!==r?-r/0:0).atanh()},acsch:function(){var e=this.re,r=this.im;if(0===r)return new u(0!==e?Math.log(e+Math.sqrt(e*e+1)):1/0,0);var t=e*e+r*r;return 0!==t?new u(e/t,-r/t).asinh():new u(0!==e?e/0:0,0!==r?-r/0:0).asinh()},asech:function(){var e=this.re,r=this.im;if(this.isZero())return u.INFINITY;var t=e*e+r*r;return 0!==t?new u(e/t,-r/t).acosh():new u(0!==e?e/0:0,0!==r?-r/0:0).acosh()},inverse:function(){if(this.isZero())return u.INFINITY;if(this.isInfinite())return u.ZERO;var e=this.re,r=this.im,t=e*e+r*r;return new u(e/t,-r/t)},conjugate:function(){return new u(this.re,-this.im)},neg:function(){return new u(-this.re,-this.im)},ceil:function(e){return e=Math.pow(10,e||0),new u(Math.ceil(this.re*e)/e,Math.ceil(this.im*e)/e)},floor:function(e){return e=Math.pow(10,e||0),new u(Math.floor(this.re*e)/e,Math.floor(this.im*e)/e)},round:function(e){return e=Math.pow(10,e||0),new u(Math.round(this.re*e)/e,Math.round(this.im*e)/e)},equals:function(e,r){var t=new u(e,r);return Math.abs(t.re-this.re)<=u.EPSILON&&Math.abs(t.im-this.im)<=u.EPSILON},clone:function(){return new u(this.re,this.im)},toString:function(){var e=this.re,r=this.im,t="";return this.isNaN()?"NaN":this.isInfinite()?"Infinity":(Math.abs(e){"use strict";var r=Object.assign||function(e){for(var r=1;r1&&void 0!==arguments[1]?arguments[1]:{},o=a.preserveFormatting,s=void 0!==o&&o,u=a.escapeMapFn,c=void 0===u?i:u,l=String(e),f="",p=c(r({},t),s?r({},n):{}),m=Object.keys(p),d=function(){var e=!1;m.forEach((function(r,t){e||l.length>=r.length&&l.slice(0,r.length)===r&&(f+=p[m[t]],l=l.slice(r.length,l.length),e=!0)})),e||(f+=l.slice(0,1),l=l.slice(1,l.length))};l;)d();return f}},1638:function(e,r){var t;!function(n){"use strict";var i={s:1,n:0,d:1};function a(e,r){if(isNaN(e=parseInt(e,10)))throw l.InvalidParameter;return e*r}function o(e,r){if(0===r)throw l.DivisionByZero;var t=Object.create(l.prototype);t.s=e<0?-1:1;var n=c(e=e<0?-e:e,r);return t.n=e/n,t.d=r/n,t}function s(e){for(var r={},t=e,n=2,i=4;i<=t;){for(;t%n==0;)t/=n,r[n]=(r[n]||0)+1;i+=1+2*n++}return t!==e?t>1&&(r[t]=(r[t]||0)+1):r[e]=(r[e]||0)+1,r}var u=function(e,r){var t,n=0,o=1,s=1,u=0,c=0,f=0,p=1,m=1,d=0,h=1,g=1,y=1,v=1e7;if(null==e);else if(void 0!==r){if(s=(n=e)*(o=r),n%1!=0||o%1!=0)throw l.NonIntegerParameter}else switch(typeof e){case"object":if("d"in e&&"n"in e)n=e.n,o=e.d,"s"in e&&(n*=e.s);else{if(!(0 in e))throw l.InvalidParameter;n=e[0],1 in e&&(o=e[1])}s=n*o;break;case"number":if(e<0&&(s=e,e=-e),e%1==0)n=e;else if(e>0){for(e>=1&&(e/=m=Math.pow(10,Math.floor(1+Math.log(e)/Math.LN10)));h<=v&&y<=v;){if(e===(t=(d+g)/(h+y))){h+y<=v?(n=d+g,o=h+y):y>h?(n=g,o=y):(n=d,o=h);break}e>t?(d+=g,h+=y):(g+=d,y+=h),h>v?(n=g,o=y):(n=d,o=h)}n*=m}else(isNaN(e)||isNaN(r))&&(o=n=NaN);break;case"string":if(null===(h=e.match(/\d+|./g)))throw l.InvalidParameter;if("-"===h[d]?(s=-1,d++):"+"===h[d]&&d++,h.length===d+1?c=a(h[d++],s):"."===h[d+1]||"."===h[d]?("."!==h[d]&&(u=a(h[d++],s)),(++d+1===h.length||"("===h[d+1]&&")"===h[d+3]||"'"===h[d+1]&&"'"===h[d+3])&&(c=a(h[d],s),p=Math.pow(10,h[d].length),d++),("("===h[d]&&")"===h[d+2]||"'"===h[d]&&"'"===h[d+2])&&(f=a(h[d+1],s),m=Math.pow(10,h[d+1].length)-1,d+=3)):"/"===h[d+1]||":"===h[d+1]?(c=a(h[d],s),p=a(h[d+2],1),d+=3):"/"===h[d+3]&&" "===h[d+1]&&(u=a(h[d],s),c=a(h[d+2],s),p=a(h[d+4],1),d+=5),h.length<=d){s=n=f+(o=p*m)*u+m*c;break}default:throw l.InvalidParameter}if(0===o)throw l.DivisionByZero;i.s=s<0?-1:1,i.n=Math.abs(n),i.d=Math.abs(o)};function c(e,r){if(!e)return r;if(!r)return e;for(;;){if(!(e%=r))return r;if(!(r%=e))return e}}function l(e,r){if(u(e,r),!(this instanceof l))return o(i.s*i.n,i.d);e=c(i.d,i.n),this.s=i.s,this.n=i.n/e,this.d=i.d/e}l.DivisionByZero=new Error("Division by Zero"),l.InvalidParameter=new Error("Invalid argument"),l.NonIntegerParameter=new Error("Parameters must be integer"),l.prototype={s:1,n:0,d:1,abs:function(){return o(this.n,this.d)},neg:function(){return o(-this.s*this.n,this.d)},add:function(e,r){return u(e,r),o(this.s*this.n*i.d+i.s*this.d*i.n,this.d*i.d)},sub:function(e,r){return u(e,r),o(this.s*this.n*i.d-i.s*this.d*i.n,this.d*i.d)},mul:function(e,r){return u(e,r),o(this.s*i.s*this.n*i.n,this.d*i.d)},div:function(e,r){return u(e,r),o(this.s*i.s*this.n*i.d,this.d*i.n)},clone:function(){return o(this.s*this.n,this.d)},mod:function(e,r){if(isNaN(this.n)||isNaN(this.d))return new l(NaN);if(void 0===e)return o(this.s*this.n%this.d,1);if(u(e,r),0===i.n&&0===this.d)throw l.DivisionByZero;return o(this.s*(i.d*this.n)%(i.n*this.d),i.d*this.d)},gcd:function(e,r){return u(e,r),o(c(i.n,this.n)*c(i.d,this.d),i.d*this.d)},lcm:function(e,r){return u(e,r),0===i.n&&0===this.n?o(0,1):o(i.n*this.n,c(i.n,this.n)*c(i.d,this.d))},ceil:function(e){return e=Math.pow(10,e||0),isNaN(this.n)||isNaN(this.d)?new l(NaN):o(Math.ceil(e*this.s*this.n/this.d),e)},floor:function(e){return e=Math.pow(10,e||0),isNaN(this.n)||isNaN(this.d)?new l(NaN):o(Math.floor(e*this.s*this.n/this.d),e)},round:function(e){return e=Math.pow(10,e||0),isNaN(this.n)||isNaN(this.d)?new l(NaN):o(Math.round(e*this.s*this.n/this.d),e)},inverse:function(){return o(this.s*this.d,this.n)},pow:function(e,r){if(u(e,r),1===i.d)return i.s<0?o(Math.pow(this.s*this.d,i.n),Math.pow(this.n,i.n)):o(Math.pow(this.s*this.n,i.n),Math.pow(this.d,i.n));if(this.s<0)return null;var t=s(this.n),n=s(this.d),a=1,c=1;for(var l in t)if("1"!==l){if("0"===l){a=0;break}if(t[l]*=i.n,t[l]%i.d!=0)return null;t[l]/=i.d,a*=Math.pow(l,t[l])}for(var l in n)if("1"!==l){if(n[l]*=i.n,n[l]%i.d!=0)return null;n[l]/=i.d,c*=Math.pow(l,n[l])}return i.s<0?o(c,a):o(a,c)},equals:function(e,r){return u(e,r),this.s*this.n*i.d==i.s*i.n*this.d},compare:function(e,r){u(e,r);var t=this.s*this.n*i.d-i.s*i.n*this.d;return(0=0;a--)i=i.inverse().add(t[a]);if(i.sub(r).abs().valueOf()0&&(t+=r,t+=" ",n%=i),t+=n,t+="/",t+=i),t},toLatex:function(e){var r,t="",n=this.n,i=this.d;return this.s<0&&(t+="-"),1===i?t+=n:(e&&(r=Math.floor(n/i))>0&&(t+=r,n%=i),t+="\\frac{",t+=n,t+="}{",t+=i,t+="}"),t},toContinued:function(){var e,r=this.n,t=this.d,n=[];if(isNaN(r)||isNaN(t))return n;do{n.push(Math.floor(r/t)),e=r%t,r=t,t=e}while(1!==r);return n},toString:function(e){var r=this.n,t=this.d;if(isNaN(r)||isNaN(t))return"NaN";e=e||15;var n=function(e,r){for(;r%2==0;r/=2);for(;r%5==0;r/=5);if(1===r)return 0;for(var t=10%r,n=1;1!==t;n++)if(t=10*t%r,n>2e3)return 0;return n}(0,t),i=function(e,r,t){for(var n=1,i=function(e,r,t){for(var n=1;r>0;e=e*e%t,r>>=1)1&r&&(n=n*e%t);return n}(10,t,r),a=0;a<300;a++){if(n===i)return a;n=10*n%r,i=10*i%r}return 0}(0,t,n),a=this.s<0?"-":"";if(a+=r/t|0,r%=t,(r*=10)&&(a+="."),n){for(var o=i;o--;)a+=r/t|0,r%=t,r*=10;a+="(";for(o=n;o--;)a+=r/t|0,r%=t,r*=10;a+=")"}else for(o=e;r&&o--;)a+=r/t|0,r%=t,r*=10;return a}},void 0===(t=function(){return l}.apply(r,[]))||(e.exports=t)}()},74681:e=>{e.exports=function e(r,t){"use strict";var n,i,a=/(^([+\-]?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)?)?$|^0x[0-9a-f]+$|\d+)/gi,o=/(^[ ]*|[ ]*$)/g,s=/(^([\w ]+,?[\w ]+)?[\w ]+,?[\w ]+\d+:\d+(:\d+)?[\w ]?|^\d{1,4}[\/\-]\d{1,4}[\/\-]\d{1,4}|^\w+, \w+ \d+, \d{4})/,u=/^0x[0-9a-f]+$/i,c=/^0/,l=function(r){return e.insensitive&&(""+r).toLowerCase()||""+r},f=l(r).replace(o,"")||"",p=l(t).replace(o,"")||"",m=f.replace(a,"\0$1\0").replace(/\0$/,"").replace(/^\0/,"").split("\0"),d=p.replace(a,"\0$1\0").replace(/\0$/,"").replace(/^\0/,"").split("\0"),h=parseInt(f.match(u),16)||1!==m.length&&f.match(s)&&Date.parse(f),g=parseInt(p.match(u),16)||h&&p.match(s)&&Date.parse(p)||null;if(g){if(hg)return 1}for(var y=0,v=Math.max(m.length,d.length);yi)return 1}return 0}},89757:e=>{function r(){}r.prototype={on:function(e,r,t){var n=this.e||(this.e={});return(n[e]||(n[e]=[])).push({fn:r,ctx:t}),this},once:function(e,r,t){var n=this;function i(){n.off(e,i),r.apply(t,arguments)}return i._=r,this.on(e,i,t)},emit:function(e){for(var r=[].slice.call(arguments,1),t=((this.e||(this.e={}))[e]||[]).slice(),n=0,i=t.length;n{"use strict";t.d(r,{JBn:()=>vw,JpY:()=>Ab});var n=t(76805),i={epsilon:1e-12,matrix:"Matrix",number:"number",precision:64,predictable:!1,randomSeed:null};function a(e){return"number"==typeof e}function o(e){return!(!e||"object"!=typeof e||"function"!=typeof e.constructor)&&(!0===e.isBigNumber&&"object"==typeof e.constructor.prototype&&!0===e.constructor.prototype.isBigNumber||"function"==typeof e.constructor.isDecimal&&!0===e.constructor.isDecimal(e))}function s(e){return e&&"object"==typeof e&&!0===Object.getPrototypeOf(e).isComplex||!1}function u(e){return e&&"object"==typeof e&&!0===Object.getPrototypeOf(e).isFraction||!1}function c(e){return e&&!0===e.constructor.prototype.isUnit||!1}function l(e){return"string"==typeof e}var f=Array.isArray;function p(e){return e&&!0===e.constructor.prototype.isMatrix||!1}function m(e){return Array.isArray(e)||p(e)}function d(e){return e&&e.isDenseMatrix&&!0===e.constructor.prototype.isMatrix||!1}function h(e){return e&&e.isSparseMatrix&&!0===e.constructor.prototype.isMatrix||!1}function g(e){return e&&!0===e.constructor.prototype.isRange||!1}function y(e){return e&&!0===e.constructor.prototype.isIndex||!1}function v(e){return"boolean"==typeof e}function x(e){return e&&!0===e.constructor.prototype.isResultSet||!1}function b(e){return e&&!0===e.constructor.prototype.isHelp||!1}function w(e){return"function"==typeof e}function N(e){return e instanceof Date}function D(e){return e instanceof RegExp}function E(e){return!(!e||"object"!=typeof e||e.constructor!==Object||s(e)||u(e))}function A(e){return null===e}function C(e){return void 0===e}function S(e){return e&&!0===e.isAccessorNode&&!0===e.constructor.prototype.isNode||!1}function M(e){return e&&!0===e.isArrayNode&&!0===e.constructor.prototype.isNode||!1}function F(e){return e&&!0===e.isAssignmentNode&&!0===e.constructor.prototype.isNode||!1}function B(e){return e&&!0===e.isBlockNode&&!0===e.constructor.prototype.isNode||!1}function T(e){return e&&!0===e.isConditionalNode&&!0===e.constructor.prototype.isNode||!1}function O(e){return e&&!0===e.isConstantNode&&!0===e.constructor.prototype.isNode||!1}function _(e){return O(e)||P(e)&&1===e.args.length&&O(e.args[0])&&"-+~".includes(e.op)}function z(e){return e&&!0===e.isFunctionAssignmentNode&&!0===e.constructor.prototype.isNode||!1}function q(e){return e&&!0===e.isFunctionNode&&!0===e.constructor.prototype.isNode||!1}function I(e){return e&&!0===e.isIndexNode&&!0===e.constructor.prototype.isNode||!1}function k(e){return e&&!0===e.isNode&&!0===e.constructor.prototype.isNode||!1}function R(e){return e&&!0===e.isObjectNode&&!0===e.constructor.prototype.isNode||!1}function P(e){return e&&!0===e.isOperatorNode&&!0===e.constructor.prototype.isNode||!1}function U(e){return e&&!0===e.isParenthesisNode&&!0===e.constructor.prototype.isNode||!1}function j(e){return e&&!0===e.isRangeNode&&!0===e.constructor.prototype.isNode||!1}function L(e){return e&&!0===e.isRelationalNode&&!0===e.constructor.prototype.isNode||!1}function H(e){return e&&!0===e.isSymbolNode&&!0===e.constructor.prototype.isNode||!1}function $(e){return e&&!0===e.constructor.prototype.isChain||!1}function Z(e){var r=typeof e;return"object"===r?null===e?"null":o(e)?"BigNumber":e.constructor&&e.constructor.name?e.constructor.name:"Object":r}function G(e){var r=typeof e;if("number"===r||"string"===r||"boolean"===r||null==e)return e;if("function"==typeof e.clone)return e.clone();if(Array.isArray(e))return e.map((function(e){return G(e)}));if(e instanceof Date)return new Date(e.valueOf());if(o(e))return e;if(e instanceof RegExp)throw new TypeError("Cannot clone "+e);return function(e,r){var t={};for(var n in e)Y(e,n)&&(t[n]=r(e[n]));return t}(e,G)}function V(e,r){for(var t in r)Y(r,t)&&(e[t]=r[t]);return e}function W(e,r){var t,n,i;if(Array.isArray(e)){if(!Array.isArray(r))return!1;if(e.length!==r.length)return!1;for(n=0,i=e.length;n=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var a,o=!0,s=!1;return{s:function(){t=t.call(e)},n:function(){var e=t.next();return o=e.done,e},e:function(e){s=!0,a=e},f:function(){try{o||null==t.return||t.return()}finally{if(s)throw a}}}}function ee(e,r){(null==r||r>e.length)&&(r=e.length);for(var t=0,n=new Array(r);t1&&void 0!==arguments[1]?arguments[1]:"any",i=r?u(r).index:n.length,a=[],o=0;o1&&void 0!==arguments[1]?arguments[1]:",";return e.map((function(e){return e.name})).join(r)}function h(e){var r=0===e.indexOf("..."),t=(r?e.length>3?e.slice(3):"any":e).split("|").map((function(e){return u(e.trim())})),n=!1,i=r?"...":"";return{types:t.map((function(e){return n=e.isAny||n,i+=e.name+"|",{name:e.name,typeIndex:e.index,test:e.test,isAny:e.isAny,conversion:null,conversionIndex:-1}})),name:i.slice(0,-1),hasAny:n,hasConversion:!1,restParam:r}}function g(e){var r=function(e){if(0===e.length)return[];var r=e.map(u);e.length>1&&r.sort((function(e,r){return e.index-r.index}));var t=r[0].conversionsTo;if(1===e.length)return t;t=t.concat([]);for(var n=new Set(e),i=1;i0,restParam:e.restParam}}function y(e){return e.typeSet||(e.typeSet=new Set,e.types.forEach((function(r){return e.typeSet.add(r.name)}))),e.typeSet}function v(e){var r=[];if("string"!=typeof e)throw new TypeError("Signatures must be strings");var t=e.trim();if(""===t)return r;for(var n=t.split(","),i=0;i=i+1}}return 0===e.length?function(e){return 0===e.length}:1===e.length?(t=b(e[0]),function(e){return t(e[0])&&1===e.length}):2===e.length?(t=b(e[0]),n=b(e[1]),function(e){return t(e[0])&&n(e[1])&&2===e.length}):(r=e.map(b),function(e){for(var t=0;t0){var t=f(r[a]);return(n=new TypeError("Unexpected type of argument in function "+o+" (expected: "+i.join(" or ")+", actual: "+t.join(" | ")+", index: "+a+")")).data={category:"wrongType",fn:o,index:a,actual:t,expected:i},{v:n}}}else s=e};for(a=0;ap)return(n=new TypeError("Too many arguments in function "+o+" (expected: "+p+", actual: "+r.length+")")).data={category:"tooManyArgs",fn:o,index:r.length,expectedLength:p},n;for(var m=[],d=0;d0)return 1;var n=M(e)-M(r);return n<0?-1:n>0?1:0}function B(e,r){var t=e.params,n=r.params,i=P(t),a=P(n),o=x(t),s=x(n);if(o&&i.hasAny){if(!s||!a.hasAny)return 1}else if(s&&a.hasAny)return-1;var u,c,l=0,f=0,p=K(t);try{for(p.s();!(c=p.n()).done;)(u=c.value).hasAny&&++l,u.hasConversion&&++f}catch(e){p.e(e)}finally{p.f()}var m,d=0,h=0,g=K(n);try{for(g.s();!(m=g.n()).done;)(u=m.value).hasAny&&++d,u.hasConversion&&++h}catch(e){g.e(e)}finally{g.f()}if(l!==d)return l-d;if(o&&i.hasConversion){if(!s||!a.hasConversion)return 1}else if(s&&a.hasConversion)return-1;if(f!==h)return f-h;if(o){if(!s)return 1}else if(s)return-1;var y=(t.length-n.length)*(o?-1:1);if(0!==y)return y;for(var v,b=[],w=0,N=0;N=c:p?c>=l:c===l}(r,e))throw new TypeError('Conflicting signatures "'+d(r)+'" and "'+d(e)+'".')})),n.push(e);var s=i.length;i.push(r[t]);var u,c=void 0,l=K(_(e.map(g)));try{for(l.s();!(u=l.n()).done;){var f=d(c=u.value);o.push({params:c,name:f,fn:s}),c.every((function(e){return!e.hasConversion}))&&(a[f]=s)}}catch(e){l.e(e)}finally{l.f()}};for(t in r)u();o.sort(B);var c,l=q(i,a,me);for(c in a)Object.prototype.hasOwnProperty.call(a,c)&&(a[c]=l[a[c]]);for(var f=[],p=new Map,m=0,h=o;m0?1:e<0?-1:0},ce=Math.log2||function(e){return Math.log(e)/Math.LN2},le=Math.log10||function(e){return Math.log(e)/Math.LN10},fe=Math.log1p||function(e){return Math.log(e+1)},pe=Math.cbrt||function(e){if(0===e)return e;var r,t=e<0;return t&&(e=-e),r=isFinite(e)?(e/((r=Math.exp(Math.log(e)/3))*r)+2*r)/3:e,t?-r:r},me=Math.expm1||function(e){return e>=2e-4||e<=-2e-4?Math.exp(e)-1:e+e*e/2+e*e*e/6};function de(e,r,t){var n={2:"0b",8:"0o",16:"0x"}[r],i="";if(t){if(t<1)throw new Error("size must be in greater than 0");if(!se(t))throw new Error("size must be an integer");if(e>2**(t-1)-1||e<-(2**(t-1)))throw new Error("Value must be in range [-2^".concat(t-1,", 2^").concat(t-1,"-1]"));if(!se(e))throw new Error("Value must be an integer");e<0&&(e+=2**t),i="i".concat(t)}var a="";return e<0&&(e=-e,a="-"),"".concat(a).concat(n).concat(e.toString(r)).concat(i)}function he(e,r){if("function"==typeof r)return r(e);if(e===1/0)return"Infinity";if(e===-1/0)return"-Infinity";if(isNaN(e))return"NaN";var t,n,i="auto";if(r&&(r.notation&&(i=r.notation),a(r)?t=r:a(r.precision)&&(t=r.precision),r.wordSize&&"number"!=typeof(n=r.wordSize)))throw new Error('Option "wordSize" must be a number');switch(i){case"fixed":return ye(e,t);case"exponential":return ve(e,t);case"engineering":return function(e,r){if(isNaN(e)||!isFinite(e))return String(e);var t=ge(e),n=xe(t,r),i=n.exponent,o=n.coefficients,s=i%3==0?i:i<0?i-3-i%3:i-i%3;if(a(r))for(;r>o.length||i-s+1>o.length;)o.push(0);else for(var u=Math.abs(i-s)-(o.length-1),c=0;c0;)f++,l--;var p=o.slice(f).join(""),m=a(r)&&p.length||p.match(/[1-9]/)?"."+p:"",d=o.slice(0,f).join("")+m+"e"+(i>=0?"+":"")+s.toString();return n.sign+d}(e,t);case"bin":return de(e,2,n);case"oct":return de(e,8,n);case"hex":return de(e,16,n);case"auto":return function(e,r,t){if(isNaN(e)||!isFinite(e))return String(e);var n=t&&void 0!==t.lowerExp?t.lowerExp:-3,i=t&&void 0!==t.upperExp?t.upperExp:5,a=ge(e),o=r?xe(a,r):a;if(o.exponent=i)return ve(e,r);var s=o.coefficients,u=o.exponent;s.length0?u:0;return c<(s=be(-u).concat(s)).length-1&&s.splice(c+1,0,"."),o.sign+s.join("")}(e,t,r&&r).replace(/((\.\d*?)(0+))($|e)/,(function(){var e=arguments[2],r=arguments[4];return"."!==e?e+r:r}));default:throw new Error('Unknown notation "'+i+'". Choose "auto", "exponential", "fixed", "bin", "oct", or "hex.')}}function ge(e){var r=String(e).toLowerCase().match(/^(-?)(\d+\.?\d*)(e([+-]?\d+))?$/);if(!r)throw new SyntaxError("Invalid number "+e);var t=r[1],n=r[2],i=parseFloat(r[4]||"0"),a=n.indexOf(".");i+=-1!==a?a-1:n.length-1;var o=n.replace(".","").replace(/^0*/,(function(e){return i-=e.length,""})).replace(/0*$/,"").split("").map((function(e){return parseInt(e)}));return 0===o.length&&(o.push(0),i++),{sign:t,coefficients:o,exponent:i}}function ye(e,r){if(isNaN(e)||!isFinite(e))return String(e);var t=ge(e),n="number"==typeof r?xe(t,t.exponent+1+r):t,i=n.coefficients,a=n.exponent+1,o=a+(r||0);return i.length0?"."+i.join(""):"")+"e"+(a>=0?"+":"")+a}function xe(e,r){for(var t={sign:e.sign,coefficients:e.coefficients,exponent:e.exponent},n=t.coefficients;r<=0;)n.unshift(0),t.exponent++,r++;if(n.length>r&&n.splice(r,n.length-r)[0]>=5){var i=r-1;for(n[i]++;10===n[i];)n.pop(),0===i&&(n.unshift(0),t.exponent++,i++),n[--i]++}return t}function be(e){for(var r=[],t=0;t=0?"+":"")+n.toString()}(e,t);case"bin":return Fe(e,2,n);case"oct":return Fe(e,8,n);case"hex":return Fe(e,16,n);case"auto":var a=r&&void 0!==r.lowerExp?r.lowerExp:-3,o=r&&void 0!==r.upperExp?r.upperExp:5;if(e.isZero())return"0";var s=e.toSignificantDigits(t),u=s.e;return(u>=a&&u'"'+t+'": '+_e(e[t],r))).join(", ")+"}"}return String(e)}(e,r);return r&&"object"==typeof r&&"truncate"in r&&t.length>r.truncate?t.substring(0,r.truncate-3)+"...":t}function ze(e){for(var r=String(e),t="",n=0;n/g,">")}function Ie(e,r){if(Array.isArray(e)){for(var t="[",n=e.length,i=0;ir?1:-1}function Re(e,r,t){if(!(this instanceof Re))throw new SyntaxError("Constructor must be called with the new operator");this.actual=e,this.expected=r,this.relation=t,this.message="Dimension mismatch ("+(Array.isArray(e)?"["+e.join(", ")+"]":e)+" "+(this.relation||"!=")+" "+(Array.isArray(r)?"["+r.join(", ")+"]":r)+")",this.stack=(new Error).stack}function Pe(e,r,t){if(!(this instanceof Pe))throw new SyntaxError("Constructor must be called with the new operator");this.index=e,arguments.length<3?(this.min=0,this.max=r):(this.min=r,this.max=t),void 0!==this.min&&this.index=this.max?this.message="Index out of range ("+this.index+" > "+(this.max-1)+")":this.message="Index out of range ("+this.index+")",this.stack=(new Error).stack}function Ue(e){for(var r=[];Array.isArray(e);)r.push(e.length),e=e[0];return r}function je(e,r,t){var n,i=e.length;if(i!==r[t])throw new Re(i,r[t]);if(t")}function Le(e,r){if(0===r.length){if(Array.isArray(e))throw new Re(e.length,0)}else je(e,r,0)}function He(e,r){if(!a(e)||!se(e))throw new TypeError("Index must be an integer (value: "+e+")");if(e<0||"number"==typeof r&&e>=r)throw new Pe(e,r)}function $e(e,r,t){if(!Array.isArray(e)||!Array.isArray(r))throw new TypeError("Array expected");if(0===r.length)throw new Error("Resizing to scalar is not supported");return r.forEach((function(e){if(!a(e)||!se(e)||e<0)throw new TypeError("Invalid size, must contain positive integers (size: "+_e(r)+")")})),Ze(e,r,0,void 0!==t?t:0),e}function Ze(e,r,t,n){var i,a,o=e.length,s=r[t],u=Math.min(o,s);if(e.length=s,t=0){if(!(r%t==0))throw new Error("Could not replace wildcard, since "+r+" is no multiple of "+-t);n[i]=-r/t}return n}function We(e){return e.reduce(((e,r)=>e*r),1)}function Ye(e,r){for(var t=r||Ue(e);Array.isArray(e)&&1===e.length;)e=e[0],t.shift();for(var n=t.length;1===t[n-1];)n--;return nr.test(e)))}function ir(e,r){return Array.prototype.join.call(e,r)}function ar(e){if(!Array.isArray(e))throw new TypeError("Array input expected");if(0===e.length)return e;var r=[],t=0;r[0]={value:e[0],identifier:0};for(var n=1;n!function(e){return e&&"?"===e[0]}(e))).every((e=>void 0!==t[e]));if(!n){var i=r.filter((e=>void 0===t[e]));throw new Error('Cannot create function "'.concat(e,'", ')+"some dependencies are missing: ".concat(i.map((e=>'"'.concat(e,'"'))).join(", "),"."))}}(e,r,n),t(i)}return i.isFactory=!0,i.fn=e,i.dependencies=r.slice().sort(),n&&(i.meta=n),i}function cr(e){return e&&"?"===e[0]?e.slice(1):e}function lr(e,r){if(dr(e)&&pr(e,r))return e[r];if("function"==typeof e[r]&&mr(e,r))throw new Error('Cannot access method "'+r+'" as a property');throw new Error('No access to property "'+r+'"')}function fr(e,r,t){if(dr(e)&&pr(e,r))return e[r]=t,t;throw new Error('No access to property "'+r+'"')}function pr(e,r){return!(!e||"object"!=typeof e)&&(!!Y(hr,r)||!(r in Object.prototype)&&!(r in Function.prototype))}function mr(e,r){return null!=e&&"function"==typeof e[r]&&(!(Y(e,r)&&Object.getPrototypeOf&&r in Object.getPrototypeOf(e))&&(!!Y(gr,r)||!(r in Object.prototype)&&!(r in Function.prototype)))}function dr(e){return"object"==typeof e&&e&&e.constructor===Object}Re.prototype=new RangeError,Re.prototype.constructor=RangeError,Re.prototype.name="DimensionError",Re.prototype.isDimensionError=!0,Pe.prototype=new RangeError,Pe.prototype.constructor=RangeError,Pe.prototype.name="IndexError",Pe.prototype.isIndexError=!0;var hr={length:!0,name:!0},gr={toString:!0,valueOf:!0,toLocaleString:!0};class yr{constructor(e){this.wrappedObject=e}keys(){return Object.keys(this.wrappedObject)}get(e){return lr(this.wrappedObject,e)}set(e,r){return fr(this.wrappedObject,e,r),this}has(e){return r=this.wrappedObject,e in r;var r}}function vr(){return new Map}function xr(e){if(!e)return vr();if(br(e))return e;if(E(e))return new yr(e);throw new Error("createMap can create maps from objects or Maps")}function br(e){return!!e&&(e instanceof Map||e instanceof yr||"function"==typeof e.set&&"function"==typeof e.get&&"function"==typeof e.keys&&"function"==typeof e.has)}function wr(e){for(var r=arguments.length,t=new Array(r>1?r-1:0),n=1;nl&&/^(?:[A-Za-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u0870-\u0887\u0889-\u088E\u08A0-\u08C9\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C5D\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u1711\u171F-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4C\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BF\u31F0-\u31FF\u3400-\u4DBF\u4E00-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA7CA\uA7D0\uA7D1\uA7D3\uA7D5-\uA7D9\uA7F2-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF40\uDF42-\uDF49\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDD70-\uDD7A\uDD7C-\uDD8A\uDD8C-\uDD92\uDD94\uDD95\uDD97-\uDDA1\uDDA3-\uDDB1\uDDB3-\uDDB9\uDDBB\uDDBC\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67\uDF80-\uDF85\uDF87-\uDFB0\uDFB2-\uDFBA]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDD00-\uDD23\uDE80-\uDEA9\uDEB0\uDEB1\uDF00-\uDF1C\uDF27\uDF30-\uDF45\uDF70-\uDF81\uDFB0-\uDFC4\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC71\uDC72\uDC75\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD44\uDD47\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE3F\uDE40\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC5F-\uDC61\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDEB8\uDF00-\uDF1A\uDF40-\uDF46]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCDF\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD2F\uDD3F\uDD41\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEB0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDEE0-\uDEF2\uDF02\uDF04-\uDF10\uDF12-\uDF33\uDFB0]|\uD808[\uDC00-\uDF99]|\uD809[\uDC80-\uDD43]|\uD80B[\uDF90-\uDFF0]|[\uD80C\uD81C-\uD820\uD822\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879\uD880-\uD883\uD885-\uD887][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2F\uDC41-\uDC46]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE70-\uDEBE\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE7F\uDF00-\uDF4A\uDF50\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3]|\uD821[\uDC00-\uDFF7]|\uD823[\uDC00-\uDCD5\uDD00-\uDD08]|\uD82B[\uDFF0-\uDFF3\uDFF5-\uDFFB\uDFFD\uDFFE]|\uD82C[\uDC00-\uDD22\uDD32\uDD50-\uDD52\uDD55\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD837[\uDF00-\uDF1E\uDF25-\uDF2A]|\uD838[\uDC30-\uDC6D\uDD00-\uDD2C\uDD37-\uDD3D\uDD4E\uDE90-\uDEAD\uDEC0-\uDEEB]|\uD839[\uDCD0-\uDCEB\uDFE0-\uDFE6\uDFE8-\uDFEB\uDFED\uDFEE\uDFF0-\uDFFE]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43\uDD4B]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDEDF\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF39\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A\uDF50-\uDFFF]|\uD888[\uDC00-\uDFAF])(?:[0-9A-Za-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u0870-\u0887\u0889-\u088E\u08A0-\u08C9\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C5D\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u1711\u171F-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4C\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BF\u31F0-\u31FF\u3400-\u4DBF\u4E00-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA7CA\uA7D0\uA7D1\uA7D3\uA7D5-\uA7D9\uA7F2-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF40\uDF42-\uDF49\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDD70-\uDD7A\uDD7C-\uDD8A\uDD8C-\uDD92\uDD94\uDD95\uDD97-\uDDA1\uDDA3-\uDDB1\uDDB3-\uDDB9\uDDBB\uDDBC\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67\uDF80-\uDF85\uDF87-\uDFB0\uDFB2-\uDFBA]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDD00-\uDD23\uDE80-\uDEA9\uDEB0\uDEB1\uDF00-\uDF1C\uDF27\uDF30-\uDF45\uDF70-\uDF81\uDFB0-\uDFC4\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC71\uDC72\uDC75\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD44\uDD47\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE3F\uDE40\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC5F-\uDC61\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDEB8\uDF00-\uDF1A\uDF40-\uDF46]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCDF\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD2F\uDD3F\uDD41\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEB0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDEE0-\uDEF2\uDF02\uDF04-\uDF10\uDF12-\uDF33\uDFB0]|\uD808[\uDC00-\uDF99]|\uD809[\uDC80-\uDD43]|\uD80B[\uDF90-\uDFF0]|[\uD80C\uD81C-\uD820\uD822\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879\uD880-\uD883\uD885-\uD887][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2F\uDC41-\uDC46]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE70-\uDEBE\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE7F\uDF00-\uDF4A\uDF50\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3]|\uD821[\uDC00-\uDFF7]|\uD823[\uDC00-\uDCD5\uDD00-\uDD08]|\uD82B[\uDFF0-\uDFF3\uDFF5-\uDFFB\uDFFD\uDFFE]|\uD82C[\uDC00-\uDD22\uDD32\uDD50-\uDD52\uDD55\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD837[\uDF00-\uDF1E\uDF25-\uDF2A]|\uD838[\uDC30-\uDC6D\uDD00-\uDD2C\uDD37-\uDD3D\uDD4E\uDE90-\uDEAD\uDEC0-\uDEEB]|\uD839[\uDCD0-\uDCEB\uDFE0-\uDFE6\uDFE8-\uDFEB\uDFED\uDFEE\uDFF0-\uDFFE]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43\uDD4B]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDEDF\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF39\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A\uDF50-\uDFFF]|\uD888[\uDC00-\uDFAF])*$/.test(e)},{name:"string",test:l},{name:"Chain",test:$},{name:"Array",test:f},{name:"Matrix",test:p},{name:"DenseMatrix",test:d},{name:"SparseMatrix",test:h},{name:"Range",test:g},{name:"Index",test:y},{name:"boolean",test:v},{name:"ResultSet",test:x},{name:"Help",test:b},{name:"function",test:w},{name:"Date",test:N},{name:"RegExp",test:D},{name:"null",test:A},{name:"undefined",test:C},{name:"AccessorNode",test:S},{name:"ArrayNode",test:M},{name:"AssignmentNode",test:F},{name:"BlockNode",test:B},{name:"ConditionalNode",test:T},{name:"ConstantNode",test:O},{name:"FunctionNode",test:q},{name:"FunctionAssignmentNode",test:z},{name:"IndexNode",test:I},{name:"Node",test:k},{name:"ObjectNode",test:R},{name:"OperatorNode",test:P},{name:"ParenthesisNode",test:U},{name:"RangeNode",test:j},{name:"RelationalNode",test:L},{name:"SymbolNode",test:H},{name:"Map",test:br},{name:"Object",test:E}]),_.addConversions([{from:"number",to:"BigNumber",convert:function(e){if(r||Er(e),e.toExponential().replace(/e.*$/,"").replace(/^0\.?0*|\./,"").length>15)throw new TypeError("Cannot implicitly convert a number with >15 significant digits to BigNumber (value: "+e+"). Use function bignumber(x) to convert to BigNumber.");return new r(e)}},{from:"number",to:"Complex",convert:function(e){return t||Ar(e),new t(e,0)}},{from:"BigNumber",to:"Complex",convert:function(e){return t||Ar(e),new t(e.toNumber(),0)}},{from:"Fraction",to:"BigNumber",convert:function(e){throw new TypeError("Cannot implicitly convert a Fraction to BigNumber or vice versa. Use function bignumber(x) to convert to BigNumber or fraction(x) to convert to Fraction.")}},{from:"Fraction",to:"Complex",convert:function(e){return t||Ar(e),new t(e.valueOf(),0)}},{from:"number",to:"Fraction",convert:function(e){i||Cr(e);var r=new i(e);if(r.valueOf()!==e)throw new TypeError("Cannot implicitly convert a number to a Fraction when there will be a loss of precision (value: "+e+"). Use function fraction(x) to convert to Fraction.");return r}},{from:"string",to:"number",convert:function(e){var r=Number(e);if(isNaN(r))throw new Error('Cannot convert "'+e+'" to a number');return r}},{from:"string",to:"BigNumber",convert:function(e){r||Er(e);try{return new r(e)}catch(r){throw new Error('Cannot convert "'+e+'" to BigNumber')}}},{from:"string",to:"Fraction",convert:function(e){i||Cr(e);try{return new i(e)}catch(r){throw new Error('Cannot convert "'+e+'" to Fraction')}}},{from:"string",to:"Complex",convert:function(e){t||Ar(e);try{return new t(e)}catch(r){throw new Error('Cannot convert "'+e+'" to Complex')}}},{from:"boolean",to:"number",convert:function(e){return+e}},{from:"boolean",to:"BigNumber",convert:function(e){return r||Er(e),new r(+e)}},{from:"boolean",to:"Fraction",convert:function(e){return i||Cr(e),new i(+e)}},{from:"boolean",to:"string",convert:function(e){return String(e)}},{from:"Array",to:"Matrix",convert:function(e){return n||function(){throw new Error("Cannot convert array into a Matrix: no class 'DenseMatrix' provided")}(),new n(e)}},{from:"Matrix",to:"Array",convert:function(e){return e.valueOf()}}]),_.onMismatch=(e,r,t)=>{var n=_.createError(e,r,t);if(["wrongType","mismatch"].includes(n.data.category)&&1===r.length&&m(r[0])&&t.some((e=>!e.params.includes(",")))){var i=new TypeError("Function '".concat(e,"' doesn't apply to matrices. To call it ")+"elementwise on a matrix 'M', try 'map(M, ".concat(e,")'."));throw i.data=n.data,i}throw n},_.onMismatch=(e,r,t)=>{var n=_.createError(e,r,t);if(["wrongType","mismatch"].includes(n.data.category)&&1===r.length&&m(r[0])&&t.some((e=>!e.params.includes(",")))){var i=new TypeError("Function '".concat(e,"' doesn't apply to matrices. To call it ")+"elementwise on a matrix 'M', try 'map(M, ".concat(e,")'."));throw i.data=n.data,i}throw n},_}));function Er(e){throw new Error("Cannot convert value ".concat(e," into a BigNumber: no class 'BigNumber' provided"))}function Ar(e){throw new Error("Cannot convert value ".concat(e," into a Complex number: no class 'Complex' provided"))}function Cr(e){throw new Error("Cannot convert value ".concat(e," into a Fraction, no class 'Fraction' provided."))}var Sr,Mr,Fr=ur("ResultSet",[],(()=>{function e(r){if(!(this instanceof e))throw new SyntaxError("Constructor must be called with the new operator");this.entries=r||[]}return e.prototype.type="ResultSet",e.prototype.isResultSet=!0,e.prototype.valueOf=function(){return this.entries},e.prototype.toString=function(){return"["+this.entries.join(", ")+"]"},e.prototype.toJSON=function(){return{mathjs:"ResultSet",entries:this.entries}},e.fromJSON=function(r){return new e(r.entries)},e}),{isClass:!0}),Br=9e15,Tr=1e9,Or="0123456789abcdef",_r="2.3025850929940456840179914546843642076011014886287729760333279009675726096773524802359972050895982983419677840422862486334095254650828067566662873690987816894829072083255546808437998948262331985283935053089653777326288461633662222876982198867465436674744042432743651550489343149393914796194044002221051017141748003688084012647080685567743216228355220114804663715659121373450747856947683463616792101806445070648000277502684916746550586856935673420670581136429224554405758925724208241314695689016758940256776311356919292033376587141660230105703089634572075440370847469940168269282808481184289314848524948644871927809676271275775397027668605952496716674183485704422507197965004714951050492214776567636938662976979522110718264549734772662425709429322582798502585509785265383207606726317164309505995087807523710333101197857547331541421808427543863591778117054309827482385045648019095610299291824318237525357709750539565187697510374970888692180205189339507238539205144634197265287286965110862571492198849978748873771345686209167058",zr="3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632789",qr={precision:20,rounding:4,modulo:1,toExpNeg:-7,toExpPos:21,minE:-Br,maxE:Br,crypto:!1},Ir=!0,kr="[DecimalError] ",Rr=kr+"Invalid argument: ",Pr=kr+"Precision limit exceeded",Ur=kr+"crypto unavailable",jr="[object Decimal]",Lr=Math.floor,Hr=Math.pow,$r=/^0b([01]+(\.[01]*)?|\.[01]+)(p[+-]?\d+)?$/i,Zr=/^0x([0-9a-f]+(\.[0-9a-f]*)?|\.[0-9a-f]+)(p[+-]?\d+)?$/i,Gr=/^0o([0-7]+(\.[0-7]*)?|\.[0-7]+)(p[+-]?\d+)?$/i,Vr=/^(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?$/i,Wr=1e7,Yr=7,Jr=_r.length-1,Xr=zr.length-1,Qr={toStringTag:jr};function Kr(e){var r,t,n,i=e.length-1,a="",o=e[0];if(i>0){for(a+=o,r=1;rt)throw Error(Rr+e)}function rt(e,r,t,n){var i,a,o,s;for(a=e[0];a>=10;a/=10)--r;return--r<0?(r+=Yr,i=0):(i=Math.ceil((r+1)/Yr),r%=Yr),a=Hr(10,Yr-r),s=e[i]%a|0,null==n?r<3?(0==r?s=s/100|0:1==r&&(s=s/10|0),o=t<4&&99999==s||t>3&&49999==s||5e4==s||0==s):o=(t<4&&s+1==a||t>3&&s+1==a/2)&&(e[i+1]/a/100|0)==Hr(10,r-2)-1||(s==a/2||0==s)&&0==(e[i+1]/a/100|0):r<4?(0==r?s=s/1e3|0:1==r?s=s/100|0:2==r&&(s=s/10|0),o=(n||t<4)&&9999==s||!n&&t>3&&4999==s):o=((n||t<4)&&s+1==a||!n&&t>3&&s+1==a/2)&&(e[i+1]/a/1e3|0)==Hr(10,r-3)-1,o}function tt(e,r,t){for(var n,i,a=[0],o=0,s=e.length;ot-1&&(void 0===a[n+1]&&(a[n+1]=0),a[n+1]+=a[n]/t|0,a[n]%=t)}return a.reverse()}Qr.absoluteValue=Qr.abs=function(){var e=new this.constructor(this);return e.s<0&&(e.s=1),it(e)},Qr.ceil=function(){return it(new this.constructor(this),this.e+1,2)},Qr.clampedTo=Qr.clamp=function(e,r){var t=this,n=t.constructor;if(e=new n(e),r=new n(r),!e.s||!r.s)return new n(NaN);if(e.gt(r))throw Error(Rr+r);return t.cmp(e)<0?e:t.cmp(r)>0?r:new n(t)},Qr.comparedTo=Qr.cmp=function(e){var r,t,n,i,a=this,o=a.d,s=(e=new a.constructor(e)).d,u=a.s,c=e.s;if(!o||!s)return u&&c?u!==c?u:o===s?0:!o^u<0?1:-1:NaN;if(!o[0]||!s[0])return o[0]?u:s[0]?-c:0;if(u!==c)return u;if(a.e!==e.e)return a.e>e.e^u<0?1:-1;for(r=0,t=(n=o.length)<(i=s.length)?n:i;rs[r]^u<0?1:-1;return n===i?0:n>i^u<0?1:-1},Qr.cosine=Qr.cos=function(){var e,r,t=this,n=t.constructor;return t.d?t.d[0]?(e=n.precision,r=n.rounding,n.precision=e+Math.max(t.e,t.sd())+Yr,n.rounding=1,t=function(e,r){var t,n,i;if(r.isZero())return r;n=r.d.length,n<32?i=(1/bt(4,t=Math.ceil(n/3))).toString():(t=16,i="2.3283064365386962890625e-10");e.precision+=t,r=xt(e,1,r.times(i),new e(1));for(var a=t;a--;){var o=r.times(r);r=o.times(o).minus(o).times(8).plus(1)}return e.precision-=t,r}(n,wt(n,t)),n.precision=e,n.rounding=r,it(2==Mr||3==Mr?t.neg():t,e,r,!0)):new n(1):new n(NaN)},Qr.cubeRoot=Qr.cbrt=function(){var e,r,t,n,i,a,o,s,u,c,l=this,f=l.constructor;if(!l.isFinite()||l.isZero())return new f(l);for(Ir=!1,(a=l.s*Hr(l.s*l,1/3))&&Math.abs(a)!=1/0?n=new f(a.toString()):(t=Kr(l.d),(a=((e=l.e)-t.length+1)%3)&&(t+=1==a||-2==a?"0":"00"),a=Hr(t,1/3),e=Lr((e+1)/3)-(e%3==(e<0?-1:2)),(n=new f(t=a==1/0?"5e"+e:(t=a.toExponential()).slice(0,t.indexOf("e")+1)+e)).s=l.s),o=(e=f.precision)+3;;)if(c=(u=(s=n).times(s).times(s)).plus(l),n=nt(c.plus(l).times(s),c.plus(u),o+2,1),Kr(s.d).slice(0,o)===(t=Kr(n.d)).slice(0,o)){if("9999"!=(t=t.slice(o-3,o+1))&&(i||"4999"!=t)){+t&&(+t.slice(1)||"5"!=t.charAt(0))||(it(n,e+1,1),r=!n.times(n).times(n).eq(l));break}if(!i&&(it(s,e+1,0),s.times(s).times(s).eq(l))){n=s;break}o+=4,i=1}return Ir=!0,it(n,e,f.rounding,r)},Qr.decimalPlaces=Qr.dp=function(){var e,r=this.d,t=NaN;if(r){if(t=((e=r.length-1)-Lr(this.e/Yr))*Yr,e=r[e])for(;e%10==0;e/=10)t--;t<0&&(t=0)}return t},Qr.dividedBy=Qr.div=function(e){return nt(this,new this.constructor(e))},Qr.dividedToIntegerBy=Qr.divToInt=function(e){var r=this.constructor;return it(nt(this,new r(e),0,1,1),r.precision,r.rounding)},Qr.equals=Qr.eq=function(e){return 0===this.cmp(e)},Qr.floor=function(){return it(new this.constructor(this),this.e+1,3)},Qr.greaterThan=Qr.gt=function(e){return this.cmp(e)>0},Qr.greaterThanOrEqualTo=Qr.gte=function(e){var r=this.cmp(e);return 1==r||0===r},Qr.hyperbolicCosine=Qr.cosh=function(){var e,r,t,n,i,a=this,o=a.constructor,s=new o(1);if(!a.isFinite())return new o(a.s?1/0:NaN);if(a.isZero())return s;t=o.precision,n=o.rounding,o.precision=t+Math.max(a.e,a.sd())+4,o.rounding=1,(i=a.d.length)<32?r=(1/bt(4,e=Math.ceil(i/3))).toString():(e=16,r="2.3283064365386962890625e-10"),a=xt(o,1,a.times(r),new o(1),!0);for(var u,c=e,l=new o(8);c--;)u=a.times(a),a=s.minus(u.times(l.minus(u.times(l))));return it(a,o.precision=t,o.rounding=n,!0)},Qr.hyperbolicSine=Qr.sinh=function(){var e,r,t,n,i=this,a=i.constructor;if(!i.isFinite()||i.isZero())return new a(i);if(r=a.precision,t=a.rounding,a.precision=r+Math.max(i.e,i.sd())+4,a.rounding=1,(n=i.d.length)<3)i=xt(a,2,i,i,!0);else{e=(e=1.4*Math.sqrt(n))>16?16:0|e,i=xt(a,2,i=i.times(1/bt(5,e)),i,!0);for(var o,s=new a(5),u=new a(16),c=new a(20);e--;)o=i.times(i),i=i.times(s.plus(o.times(u.times(o).plus(c))))}return a.precision=r,a.rounding=t,it(i,r,t,!0)},Qr.hyperbolicTangent=Qr.tanh=function(){var e,r,t=this,n=t.constructor;return t.isFinite()?t.isZero()?new n(t):(e=n.precision,r=n.rounding,n.precision=e+7,n.rounding=1,nt(t.sinh(),t.cosh(),n.precision=e,n.rounding=r)):new n(t.s)},Qr.inverseCosine=Qr.acos=function(){var e,r=this,t=r.constructor,n=r.abs().cmp(1),i=t.precision,a=t.rounding;return-1!==n?0===n?r.isNeg()?ut(t,i,a):new t(0):new t(NaN):r.isZero()?ut(t,i+4,a).times(.5):(t.precision=i+6,t.rounding=1,r=r.asin(),e=ut(t,i+4,a).times(.5),t.precision=i,t.rounding=a,e.minus(r))},Qr.inverseHyperbolicCosine=Qr.acosh=function(){var e,r,t=this,n=t.constructor;return t.lte(1)?new n(t.eq(1)?0:NaN):t.isFinite()?(e=n.precision,r=n.rounding,n.precision=e+Math.max(Math.abs(t.e),t.sd())+4,n.rounding=1,Ir=!1,t=t.times(t).minus(1).sqrt().plus(t),Ir=!0,n.precision=e,n.rounding=r,t.ln()):new n(t)},Qr.inverseHyperbolicSine=Qr.asinh=function(){var e,r,t=this,n=t.constructor;return!t.isFinite()||t.isZero()?new n(t):(e=n.precision,r=n.rounding,n.precision=e+2*Math.max(Math.abs(t.e),t.sd())+6,n.rounding=1,Ir=!1,t=t.times(t).plus(1).sqrt().plus(t),Ir=!0,n.precision=e,n.rounding=r,t.ln())},Qr.inverseHyperbolicTangent=Qr.atanh=function(){var e,r,t,n,i=this,a=i.constructor;return i.isFinite()?i.e>=0?new a(i.abs().eq(1)?i.s/0:i.isZero()?i:NaN):(e=a.precision,r=a.rounding,n=i.sd(),Math.max(n,e)<2*-i.e-1?it(new a(i),e,r,!0):(a.precision=t=n-i.e,i=nt(i.plus(1),new a(1).minus(i),t+e,1),a.precision=e+4,a.rounding=1,i=i.ln(),a.precision=e,a.rounding=r,i.times(.5))):new a(NaN)},Qr.inverseSine=Qr.asin=function(){var e,r,t,n,i=this,a=i.constructor;return i.isZero()?new a(i):(r=i.abs().cmp(1),t=a.precision,n=a.rounding,-1!==r?0===r?((e=ut(a,t+4,n).times(.5)).s=i.s,e):new a(NaN):(a.precision=t+6,a.rounding=1,i=i.div(new a(1).minus(i.times(i)).sqrt().plus(1)).atan(),a.precision=t,a.rounding=n,i.times(2)))},Qr.inverseTangent=Qr.atan=function(){var e,r,t,n,i,a,o,s,u,c=this,l=c.constructor,f=l.precision,p=l.rounding;if(c.isFinite()){if(c.isZero())return new l(c);if(c.abs().eq(1)&&f+4<=Xr)return(o=ut(l,f+4,p).times(.25)).s=c.s,o}else{if(!c.s)return new l(NaN);if(f+4<=Xr)return(o=ut(l,f+4,p).times(.5)).s=c.s,o}for(l.precision=s=f+10,l.rounding=1,e=t=Math.min(28,s/Yr+2|0);e;--e)c=c.div(c.times(c).plus(1).sqrt().plus(1));for(Ir=!1,r=Math.ceil(s/Yr),n=1,u=c.times(c),o=new l(c),i=c;-1!==e;)if(i=i.times(u),a=o.minus(i.div(n+=2)),i=i.times(u),void 0!==(o=a.plus(i.div(n+=2))).d[r])for(e=r;o.d[e]===a.d[e]&&e--;);return t&&(o=o.times(2<this.d.length-2},Qr.isNaN=function(){return!this.s},Qr.isNegative=Qr.isNeg=function(){return this.s<0},Qr.isPositive=Qr.isPos=function(){return this.s>0},Qr.isZero=function(){return!!this.d&&0===this.d[0]},Qr.lessThan=Qr.lt=function(e){return this.cmp(e)<0},Qr.lessThanOrEqualTo=Qr.lte=function(e){return this.cmp(e)<1},Qr.logarithm=Qr.log=function(e){var r,t,n,i,a,o,s,u,c=this,l=c.constructor,f=l.precision,p=l.rounding;if(null==e)e=new l(10),r=!0;else{if(t=(e=new l(e)).d,e.s<0||!t||!t[0]||e.eq(1))return new l(NaN);r=e.eq(10)}if(t=c.d,c.s<0||!t||!t[0]||c.eq(1))return new l(t&&!t[0]?-1/0:1!=c.s?NaN:t?0:1/0);if(r)if(t.length>1)a=!0;else{for(i=t[0];i%10==0;)i/=10;a=1!==i}if(Ir=!1,o=ht(c,s=f+5),n=r?st(l,s+10):ht(e,s),rt((u=nt(o,n,s,1)).d,i=f,p))do{if(o=ht(c,s+=10),n=r?st(l,s+10):ht(e,s),u=nt(o,n,s,1),!a){+Kr(u.d).slice(i+1,i+15)+1==1e14&&(u=it(u,f+1,0));break}}while(rt(u.d,i+=10,p));return Ir=!0,it(u,f,p)},Qr.minus=Qr.sub=function(e){var r,t,n,i,a,o,s,u,c,l,f,p,m=this,d=m.constructor;if(e=new d(e),!m.d||!e.d)return m.s&&e.s?m.d?e.s=-e.s:e=new d(e.d||m.s!==e.s?m:NaN):e=new d(NaN),e;if(m.s!=e.s)return e.s=-e.s,m.plus(e);if(c=m.d,p=e.d,s=d.precision,u=d.rounding,!c[0]||!p[0]){if(p[0])e.s=-e.s;else{if(!c[0])return new d(3===u?-0:0);e=new d(m)}return Ir?it(e,s,u):e}if(t=Lr(e.e/Yr),l=Lr(m.e/Yr),c=c.slice(),a=l-t){for((f=a<0)?(r=c,a=-a,o=p.length):(r=p,t=l,o=c.length),a>(n=Math.max(Math.ceil(s/Yr),o)+2)&&(a=n,r.length=1),r.reverse(),n=a;n--;)r.push(0);r.reverse()}else{for((f=(n=c.length)<(o=p.length))&&(o=n),n=0;n0;--n)c[o++]=0;for(n=p.length;n>a;){if(c[--n](o=(a=Math.ceil(s/Yr))>o?a+1:o+1)&&(i=o,t.length=1),t.reverse();i--;)t.push(0);t.reverse()}for((o=c.length)-(i=l.length)<0&&(i=o,t=l,l=c,c=t),r=0;i;)r=(c[--i]=c[i]+l[i]+r)/Wr|0,c[i]%=Wr;for(r&&(c.unshift(r),++n),o=c.length;0==c[--o];)c.pop();return e.d=c,e.e=ot(c,n),Ir?it(e,s,u):e},Qr.precision=Qr.sd=function(e){var r,t=this;if(void 0!==e&&e!==!!e&&1!==e&&0!==e)throw Error(Rr+e);return t.d?(r=ct(t.d),e&&t.e+1>r&&(r=t.e+1)):r=NaN,r},Qr.round=function(){var e=this,r=e.constructor;return it(new r(e),e.e+1,r.rounding)},Qr.sine=Qr.sin=function(){var e,r,t=this,n=t.constructor;return t.isFinite()?t.isZero()?new n(t):(e=n.precision,r=n.rounding,n.precision=e+Math.max(t.e,t.sd())+Yr,n.rounding=1,t=function(e,r){var t,n=r.d.length;if(n<3)return r.isZero()?r:xt(e,2,r,r);t=(t=1.4*Math.sqrt(n))>16?16:0|t,r=r.times(1/bt(5,t)),r=xt(e,2,r,r);for(var i,a=new e(5),o=new e(16),s=new e(20);t--;)i=r.times(r),r=r.times(a.plus(i.times(o.times(i).minus(s))));return r}(n,wt(n,t)),n.precision=e,n.rounding=r,it(Mr>2?t.neg():t,e,r,!0)):new n(NaN)},Qr.squareRoot=Qr.sqrt=function(){var e,r,t,n,i,a,o=this,s=o.d,u=o.e,c=o.s,l=o.constructor;if(1!==c||!s||!s[0])return new l(!c||c<0&&(!s||s[0])?NaN:s?o:1/0);for(Ir=!1,0==(c=Math.sqrt(+o))||c==1/0?(((r=Kr(s)).length+u)%2==0&&(r+="0"),c=Math.sqrt(r),u=Lr((u+1)/2)-(u<0||u%2),n=new l(r=c==1/0?"5e"+u:(r=c.toExponential()).slice(0,r.indexOf("e")+1)+u)):n=new l(c.toString()),t=(u=l.precision)+3;;)if(n=(a=n).plus(nt(o,a,t+2,1)).times(.5),Kr(a.d).slice(0,t)===(r=Kr(n.d)).slice(0,t)){if("9999"!=(r=r.slice(t-3,t+1))&&(i||"4999"!=r)){+r&&(+r.slice(1)||"5"!=r.charAt(0))||(it(n,u+1,1),e=!n.times(n).eq(o));break}if(!i&&(it(a,u+1,0),a.times(a).eq(o))){n=a;break}t+=4,i=1}return Ir=!0,it(n,u,l.rounding,e)},Qr.tangent=Qr.tan=function(){var e,r,t=this,n=t.constructor;return t.isFinite()?t.isZero()?new n(t):(e=n.precision,r=n.rounding,n.precision=e+10,n.rounding=1,(t=t.sin()).s=1,t=nt(t,new n(1).minus(t.times(t)).sqrt(),e+10,0),n.precision=e,n.rounding=r,it(2==Mr||4==Mr?t.neg():t,e,r,!0)):new n(NaN)},Qr.times=Qr.mul=function(e){var r,t,n,i,a,o,s,u,c,l=this,f=l.constructor,p=l.d,m=(e=new f(e)).d;if(e.s*=l.s,!(p&&p[0]&&m&&m[0]))return new f(!e.s||p&&!p[0]&&!m||m&&!m[0]&&!p?NaN:p&&m?0*e.s:e.s/0);for(t=Lr(l.e/Yr)+Lr(e.e/Yr),(u=p.length)<(c=m.length)&&(a=p,p=m,m=a,o=u,u=c,c=o),a=[],n=o=u+c;n--;)a.push(0);for(n=c;--n>=0;){for(r=0,i=u+n;i>n;)s=a[i]+m[n]*p[i-n-1]+r,a[i--]=s%Wr|0,r=s/Wr|0;a[i]=(a[i]+r)%Wr|0}for(;!a[--o];)a.pop();return r?++t:a.shift(),e.d=a,e.e=ot(a,t),Ir?it(e,f.precision,f.rounding):e},Qr.toBinary=function(e,r){return Nt(this,2,e,r)},Qr.toDecimalPlaces=Qr.toDP=function(e,r){var t=this,n=t.constructor;return t=new n(t),void 0===e?t:(et(e,0,Tr),void 0===r?r=n.rounding:et(r,0,8),it(t,e+t.e+1,r))},Qr.toExponential=function(e,r){var t,n=this,i=n.constructor;return void 0===e?t=at(n,!0):(et(e,0,Tr),void 0===r?r=i.rounding:et(r,0,8),t=at(n=it(new i(n),e+1,r),!0,e+1)),n.isNeg()&&!n.isZero()?"-"+t:t},Qr.toFixed=function(e,r){var t,n,i=this,a=i.constructor;return void 0===e?t=at(i):(et(e,0,Tr),void 0===r?r=a.rounding:et(r,0,8),t=at(n=it(new a(i),e+i.e+1,r),!1,e+n.e+1)),i.isNeg()&&!i.isZero()?"-"+t:t},Qr.toFraction=function(e){var r,t,n,i,a,o,s,u,c,l,f,p,m=this,d=m.d,h=m.constructor;if(!d)return new h(m);if(c=t=new h(1),n=u=new h(0),o=(a=(r=new h(n)).e=ct(d)-m.e-1)%Yr,r.d[0]=Hr(10,o<0?Yr+o:o),null==e)e=a>0?r:c;else{if(!(s=new h(e)).isInt()||s.lt(c))throw Error(Rr+s);e=s.gt(r)?a>0?r:c:s}for(Ir=!1,s=new h(Kr(d)),l=h.precision,h.precision=a=d.length*Yr*2;f=nt(s,r,0,1,1),1!=(i=t.plus(f.times(n))).cmp(e);)t=n,n=i,i=c,c=u.plus(f.times(i)),u=i,i=r,r=s.minus(f.times(i)),s=i;return i=nt(e.minus(t),n,0,1,1),u=u.plus(i.times(c)),t=t.plus(i.times(n)),u.s=c.s=m.s,p=nt(c,n,a,1).minus(m).abs().cmp(nt(u,t,a,1).minus(m).abs())<1?[c,n]:[u,t],h.precision=l,Ir=!0,p},Qr.toHexadecimal=Qr.toHex=function(e,r){return Nt(this,16,e,r)},Qr.toNearest=function(e,r){var t=this,n=t.constructor;if(t=new n(t),null==e){if(!t.d)return t;e=new n(1),r=n.rounding}else{if(e=new n(e),void 0===r?r=n.rounding:et(r,0,8),!t.d)return e.s?t:e;if(!e.d)return e.s&&(e.s=t.s),e}return e.d[0]?(Ir=!1,t=nt(t,e,0,r,1).times(e),Ir=!0,it(t)):(e.s=t.s,t=e),t},Qr.toNumber=function(){return+this},Qr.toOctal=function(e,r){return Nt(this,8,e,r)},Qr.toPower=Qr.pow=function(e){var r,t,n,i,a,o,s=this,u=s.constructor,c=+(e=new u(e));if(!(s.d&&e.d&&s.d[0]&&e.d[0]))return new u(Hr(+s,c));if((s=new u(s)).eq(1))return s;if(n=u.precision,a=u.rounding,e.eq(1))return it(s,n,a);if((r=Lr(e.e/Yr))>=e.d.length-1&&(t=c<0?-c:c)<=9007199254740991)return i=ft(u,s,t,n),e.s<0?new u(1).div(i):it(i,n,a);if((o=s.s)<0){if(ru.maxE+1||r0?o/0:0):(Ir=!1,u.rounding=s.s=1,t=Math.min(12,(r+"").length),(i=dt(e.times(ht(s,n+t)),n)).d&&rt((i=it(i,n+5,1)).d,n,a)&&(r=n+10,+Kr((i=it(dt(e.times(ht(s,r+t)),r),r+5,1)).d).slice(n+1,n+15)+1==1e14&&(i=it(i,n+1,0))),i.s=o,Ir=!0,u.rounding=a,it(i,n,a))},Qr.toPrecision=function(e,r){var t,n=this,i=n.constructor;return void 0===e?t=at(n,n.e<=i.toExpNeg||n.e>=i.toExpPos):(et(e,1,Tr),void 0===r?r=i.rounding:et(r,0,8),t=at(n=it(new i(n),e,r),e<=n.e||n.e<=i.toExpNeg,e)),n.isNeg()&&!n.isZero()?"-"+t:t},Qr.toSignificantDigits=Qr.toSD=function(e,r){var t=this.constructor;return void 0===e?(e=t.precision,r=t.rounding):(et(e,1,Tr),void 0===r?r=t.rounding:et(r,0,8)),it(new t(this),e,r)},Qr.toString=function(){var e=this,r=e.constructor,t=at(e,e.e<=r.toExpNeg||e.e>=r.toExpPos);return e.isNeg()&&!e.isZero()?"-"+t:t},Qr.truncated=Qr.trunc=function(){return it(new this.constructor(this),this.e+1,1)},Qr.valueOf=Qr.toJSON=function(){var e=this,r=e.constructor,t=at(e,e.e<=r.toExpNeg||e.e>=r.toExpPos);return e.isNeg()?"-"+t:t};var nt=function(){function e(e,r,t){var n,i=0,a=e.length;for(e=e.slice();a--;)n=e[a]*r+i,e[a]=n%t|0,i=n/t|0;return i&&e.unshift(i),e}function r(e,r,t,n){var i,a;if(t!=n)a=t>n?1:-1;else for(i=a=0;ir[i]?1:-1;break}return a}function t(e,r,t,n){for(var i=0;t--;)e[t]-=i,i=e[t]1;)e.shift()}return function(n,i,a,o,s,u){var c,l,f,p,m,d,h,g,y,v,x,b,w,N,D,E,A,C,S,M,F=n.constructor,B=n.s==i.s?1:-1,T=n.d,O=i.d;if(!(T&&T[0]&&O&&O[0]))return new F(n.s&&i.s&&(T?!O||T[0]!=O[0]:O)?T&&0==T[0]||!O?0*B:B/0:NaN);for(u?(m=1,l=n.e-i.e):(u=Wr,m=Yr,l=Lr(n.e/m)-Lr(i.e/m)),S=O.length,A=T.length,v=(y=new F(B)).d=[],f=0;O[f]==(T[f]||0);f++);if(O[f]>(T[f]||0)&&l--,null==a?(N=a=F.precision,o=F.rounding):N=s?a+(n.e-i.e)+1:a,N<0)v.push(1),d=!0;else{if(N=N/m+2|0,f=0,1==S){for(p=0,O=O[0],N++;(f1&&(O=e(O,p,u),T=e(T,p,u),S=O.length,A=T.length),E=S,b=(x=T.slice(0,S)).length;b=u/2&&++C;do{p=0,(c=r(O,x,S,b))<0?(w=x[0],S!=b&&(w=w*u+(x[1]||0)),(p=w/C|0)>1?(p>=u&&(p=u-1),1==(c=r(h=e(O,p,u),x,g=h.length,b=x.length))&&(p--,t(h,S=10;p/=10)f++;y.e=f+l*m-1,it(y,s?a+y.e+1:a,o,d)}return y}}();function it(e,r,t,n){var i,a,o,s,u,c,l,f,p,m=e.constructor;e:if(null!=r){if(!(f=e.d))return e;for(i=1,s=f[0];s>=10;s/=10)i++;if((a=r-i)<0)a+=Yr,o=r,u=(l=f[p=0])/Hr(10,i-o-1)%10|0;else if((p=Math.ceil((a+1)/Yr))>=(s=f.length)){if(!n)break e;for(;s++<=p;)f.push(0);l=u=0,i=1,o=(a%=Yr)-Yr+1}else{for(l=s=f[p],i=1;s>=10;s/=10)i++;u=(o=(a%=Yr)-Yr+i)<0?0:l/Hr(10,i-o-1)%10|0}if(n=n||r<0||void 0!==f[p+1]||(o<0?l:l%Hr(10,i-o-1)),c=t<4?(u||n)&&(0==t||t==(e.s<0?3:2)):u>5||5==u&&(4==t||n||6==t&&(a>0?o>0?l/Hr(10,i-o):0:f[p-1])%10&1||t==(e.s<0?8:7)),r<1||!f[0])return f.length=0,c?(r-=e.e+1,f[0]=Hr(10,(Yr-r%Yr)%Yr),e.e=-r||0):f[0]=e.e=0,e;if(0==a?(f.length=p,s=1,p--):(f.length=p+1,s=Hr(10,Yr-a),f[p]=o>0?(l/Hr(10,i-o)%Hr(10,o)|0)*s:0),c)for(;;){if(0==p){for(a=1,o=f[0];o>=10;o/=10)a++;for(o=f[0]+=s,s=1;o>=10;o/=10)s++;a!=s&&(e.e++,f[0]==Wr&&(f[0]=1));break}if(f[p]+=s,f[p]!=Wr)break;f[p--]=0,s=1}for(a=f.length;0===f[--a];)f.pop()}return Ir&&(e.e>m.maxE?(e.d=null,e.e=NaN):e.e0?a=a.charAt(0)+"."+a.slice(1)+lt(n):o>1&&(a=a.charAt(0)+"."+a.slice(1)),a=a+(e.e<0?"e":"e+")+e.e):i<0?(a="0."+lt(-i-1)+a,t&&(n=t-o)>0&&(a+=lt(n))):i>=o?(a+=lt(i+1-o),t&&(n=t-i-1)>0&&(a=a+"."+lt(n))):((n=i+1)0&&(i+1===o&&(a+="."),a+=lt(n))),a}function ot(e,r){var t=e[0];for(r*=Yr;t>=10;t/=10)r++;return r}function st(e,r,t){if(r>Jr)throw Ir=!0,t&&(e.precision=t),Error(Pr);return it(new e(_r),r,1,!0)}function ut(e,r,t){if(r>Xr)throw Error(Pr);return it(new e(zr),r,t,!0)}function ct(e){var r=e.length-1,t=r*Yr+1;if(r=e[r]){for(;r%10==0;r/=10)t--;for(r=e[0];r>=10;r/=10)t++}return t}function lt(e){for(var r="";e--;)r+="0";return r}function ft(e,r,t,n){var i,a=new e(1),o=Math.ceil(n/Yr+4);for(Ir=!1;;){if(t%2&&Dt((a=a.times(r)).d,o)&&(i=!0),0===(t=Lr(t/2))){t=a.d.length-1,i&&0===a.d[t]&&++a.d[t];break}Dt((r=r.times(r)).d,o)}return Ir=!0,a}function pt(e){return 1&e.d[e.d.length-1]}function mt(e,r,t){for(var n,i=new e(r[0]),a=0;++a17)return new p(e.d?e.d[0]?e.s<0?0:1/0:1:e.s?e.s<0?0:e:NaN);for(null==r?(Ir=!1,u=d):u=r,s=new p(.03125);e.e>-2;)e=e.times(s),f+=5;for(u+=n=Math.log(Hr(2,f))/Math.LN10*2+5|0,t=a=o=new p(1),p.precision=u;;){if(a=it(a.times(e),u,1),t=t.times(++l),Kr((s=o.plus(nt(a,t,u,1))).d).slice(0,u)===Kr(o.d).slice(0,u)){for(i=f;i--;)o=it(o.times(o),u,1);if(null!=r)return p.precision=d,o;if(!(c<3&&rt(o.d,u-n,m,c)))return it(o,p.precision=d,m,Ir=!0);p.precision=u+=10,t=a=s=new p(1),l=0,c++}o=s}}function ht(e,r){var t,n,i,a,o,s,u,c,l,f,p,m=1,d=e,h=d.d,g=d.constructor,y=g.rounding,v=g.precision;if(d.s<0||!h||!h[0]||!d.e&&1==h[0]&&1==h.length)return new g(h&&!h[0]?-1/0:1!=d.s?NaN:h?0:d);if(null==r?(Ir=!1,l=v):l=r,g.precision=l+=10,n=(t=Kr(h)).charAt(0),!(Math.abs(a=d.e)<15e14))return c=st(g,l+2,v).times(a+""),d=ht(new g(n+"."+t.slice(1)),l-10).plus(c),g.precision=v,null==r?it(d,v,y,Ir=!0):d;for(;n<7&&1!=n||1==n&&t.charAt(1)>3;)n=(t=Kr((d=d.times(e)).d)).charAt(0),m++;for(a=d.e,n>1?(d=new g("0."+t),a++):d=new g(n+"."+t.slice(1)),f=d,u=o=d=nt(d.minus(1),d.plus(1),l,1),p=it(d.times(d),l,1),i=3;;){if(o=it(o.times(p),l,1),Kr((c=u.plus(nt(o,new g(i),l,1))).d).slice(0,l)===Kr(u.d).slice(0,l)){if(u=u.times(2),0!==a&&(u=u.plus(st(g,l+2,v).times(a+""))),u=nt(u,new g(m),l,1),null!=r)return g.precision=v,u;if(!rt(u.d,l-10,y,s))return it(u,g.precision=v,y,Ir=!0);g.precision=l+=10,c=o=d=nt(f.minus(1),f.plus(1),l,1),p=it(d.times(d),l,1),i=s=1}u=c,i+=2}}function gt(e){return String(e.s*e.s/0)}function yt(e,r){var t,n,i;for((t=r.indexOf("."))>-1&&(r=r.replace(".","")),(n=r.search(/e/i))>0?(t<0&&(t=n),t+=+r.slice(n+1),r=r.substring(0,n)):t<0&&(t=r.length),n=0;48===r.charCodeAt(n);n++);for(i=r.length;48===r.charCodeAt(i-1);--i);if(r=r.slice(n,i)){if(i-=n,e.e=t=t-n-1,e.d=[],n=(t+1)%Yr,t<0&&(n+=Yr),ne.constructor.maxE?(e.d=null,e.e=NaN):e.e-1){if(r=r.replace(/(\d)_(?=\d)/g,"$1"),Vr.test(r))return yt(e,r)}else if("Infinity"===r||"NaN"===r)return+r||(e.s=NaN),e.e=NaN,e.d=null,e;if(Zr.test(r))t=16,r=r.toLowerCase();else if($r.test(r))t=2;else{if(!Gr.test(r))throw Error(Rr+r);t=8}for((a=r.search(/p/i))>0?(u=+r.slice(a+1),r=r.substring(2,a)):r=r.slice(2),o=(a=r.indexOf("."))>=0,n=e.constructor,o&&(a=(s=(r=r.replace(".","")).length)-a,i=ft(n,new n(t),a,2*a)),a=l=(c=tt(r,t,Wr)).length-1;0===c[a];--a)c.pop();return a<0?new n(0*e.s):(e.e=ot(c,l),e.d=c,Ir=!1,o&&(e=nt(e,i,4*s)),u&&(e=e.times(Math.abs(u)<54?Hr(2,u):fn.pow(2,u))),Ir=!0,e)}function xt(e,r,t,n,i){var a,o,s,u,c=e.precision,l=Math.ceil(c/Yr);for(Ir=!1,u=t.times(t),s=new e(n);;){if(o=nt(s.times(u),new e(r++*r++),c,1),s=i?n.plus(o):n.minus(o),n=nt(o.times(u),new e(r++*r++),c,1),void 0!==(o=s.plus(n)).d[l]){for(a=l;o.d[a]===s.d[a]&&a--;);if(-1==a)break}a=s,s=n,n=o,o=a}return Ir=!0,o.d.length=l+1,o}function bt(e,r){for(var t=e;--r;)t*=e;return t}function wt(e,r){var t,n=r.s<0,i=ut(e,e.precision,1),a=i.times(.5);if((r=r.abs()).lte(a))return Mr=n?4:1,r;if((t=r.divToInt(i)).isZero())Mr=n?3:2;else{if((r=r.minus(t.times(i))).lte(a))return Mr=pt(t)?n?2:3:n?4:1,r;Mr=pt(t)?n?1:4:n?3:2}return r.minus(i).abs()}function Nt(e,r,t,n){var i,a,o,s,u,c,l,f,p,m=e.constructor,d=void 0!==t;if(d?(et(t,1,Tr),void 0===n?n=m.rounding:et(n,0,8)):(t=m.precision,n=m.rounding),e.isFinite()){for(d?(i=2,16==r?t=4*t-3:8==r&&(t=3*t-2)):i=r,(o=(l=at(e)).indexOf("."))>=0&&(l=l.replace(".",""),(p=new m(1)).e=l.length-o,p.d=tt(at(p),10,i),p.e=p.d.length),a=u=(f=tt(l,10,i)).length;0==f[--u];)f.pop();if(f[0]){if(o<0?a--:((e=new m(e)).d=f,e.e=a,f=(e=nt(e,p,t,n,0,i)).d,a=e.e,c=Sr),o=f[t],s=i/2,c=c||void 0!==f[t+1],c=n<4?(void 0!==o||c)&&(0===n||n===(e.s<0?3:2)):o>s||o===s&&(4===n||c||6===n&&1&f[t-1]||n===(e.s<0?8:7)),f.length=t,c)for(;++f[--t]>i-1;)f[t]=0,t||(++a,f.unshift(1));for(u=f.length;!f[u-1];--u);for(o=0,l="";o1)if(16==r||8==r){for(o=16==r?4:3,--u;u%o;u++)l+="0";for(u=(f=tt(l,i,r)).length;!f[u-1];--u);for(o=1,l="1.";ou)for(a-=u;a--;)l+="0";else ar)return e.length=r,!0}function Et(e){return new this(e).abs()}function At(e){return new this(e).acos()}function Ct(e){return new this(e).acosh()}function St(e,r){return new this(e).plus(r)}function Mt(e){return new this(e).asin()}function Ft(e){return new this(e).asinh()}function Bt(e){return new this(e).atan()}function Tt(e){return new this(e).atanh()}function Ot(e,r){e=new this(e),r=new this(r);var t,n=this.precision,i=this.rounding,a=n+4;return e.s&&r.s?e.d||r.d?!r.d||e.isZero()?(t=r.s<0?ut(this,n,i):new this(0)).s=e.s:!e.d||r.isZero()?(t=ut(this,a,1).times(.5)).s=e.s:r.s<0?(this.precision=a,this.rounding=1,t=this.atan(nt(e,r,a,1)),r=ut(this,a,1),this.precision=n,this.rounding=i,t=e.s<0?t.minus(r):t.plus(r)):t=this.atan(nt(e,r,a,1)):(t=ut(this,a,1).times(r.s>0?.25:.75)).s=e.s:t=new this(NaN),t}function _t(e){return new this(e).cbrt()}function zt(e){return it(e=new this(e),e.e+1,2)}function qt(e,r,t){return new this(e).clamp(r,t)}function It(e){if(!e||"object"!=typeof e)throw Error(kr+"Object expected");var r,t,n,i=!0===e.defaults,a=["precision",1,Tr,"rounding",0,8,"toExpNeg",-Br,0,"toExpPos",0,Br,"maxE",0,Br,"minE",-Br,0,"modulo",0,9];for(r=0;r=a[r+1]&&n<=a[r+2]))throw Error(Rr+t+": "+n);this[t]=n}if(t="crypto",i&&(this[t]=qr[t]),void 0!==(n=e[t])){if(!0!==n&&!1!==n&&0!==n&&1!==n)throw Error(Rr+t+": "+n);if(n){if("undefined"==typeof crypto||!crypto||!crypto.getRandomValues&&!crypto.randomBytes)throw Error(Ur);this[t]=!0}else this[t]=!1}return this}function kt(e){return new this(e).cos()}function Rt(e){return new this(e).cosh()}function Pt(e,r){return new this(e).div(r)}function Ut(e){return new this(e).exp()}function jt(e){return it(e=new this(e),e.e+1,3)}function Lt(){var e,r,t=new this(0);for(Ir=!1,e=0;e=429e7?r[a]=crypto.getRandomValues(new Uint32Array(1))[0]:s[a++]=i%1e7;else{if(!crypto.randomBytes)throw Error(Ur);for(r=crypto.randomBytes(n*=4);a=214e7?crypto.randomBytes(4).copy(r,a):(s.push(i%1e7),a+=4);a=n/4}else for(;a=10;i/=10)n++;na.maxE?(i.e=NaN,i.d=null):e.e=10;t/=10)r++;return void(Ir?r>a.maxE?(i.e=NaN,i.d=null):r{var{on:r,config:t}=e,n=pn.clone({precision:t.precision,modulo:pn.EUCLID});return n.prototype=Object.create(n.prototype),n.prototype.type="BigNumber",n.prototype.isBigNumber=!0,n.prototype.toJSON=function(){return{mathjs:"BigNumber",value:this.toString()}},n.fromJSON=function(e){return new n(e.value)},r&&r("config",(function(e,r){e.precision!==r.precision&&n.config({precision:e.precision})})),n}),{isClass:!0}),dn=t(45730),hn=ur("Complex",[],(()=>(Object.defineProperty(dn,"name",{value:"Complex"}),dn.prototype.constructor=dn,dn.prototype.type="Complex",dn.prototype.isComplex=!0,dn.prototype.toJSON=function(){return{mathjs:"Complex",re:this.re,im:this.im}},dn.prototype.toPolar=function(){return{r:this.abs(),phi:this.arg()}},dn.prototype.format=function(e){var r=this.im,t=this.re,n=he(this.re,e),i=he(this.im,e),o=a(e)?e:e?e.precision:null;if(null!==o){var s=Math.pow(10,-o);Math.abs(t/r)r.re?1:e.rer.im?1:e.im(Object.defineProperty(gn,"name",{value:"Fraction"}),gn.prototype.constructor=gn,gn.prototype.type="Fraction",gn.prototype.isFraction=!0,gn.prototype.toJSON=function(){return{mathjs:"Fraction",n:this.s*this.n,d:this.d}},gn.fromJSON=function(e){return new gn(e)},gn)),{isClass:!0}),vn=ur("Range",[],(()=>{function e(r,t,n){if(!(this instanceof e))throw new SyntaxError("Constructor must be called with the new operator");var i=null!=r,a=null!=t,s=null!=n;if(i)if(o(r))r=r.toNumber();else if("number"!=typeof r)throw new TypeError("Parameter start must be a number");if(a)if(o(t))t=t.toNumber();else if("number"!=typeof t)throw new TypeError("Parameter end must be a number");if(s)if(o(n))n=n.toNumber();else if("number"!=typeof n)throw new TypeError("Parameter step must be a number");this.start=i?parseFloat(r):0,this.end=a?parseFloat(t):0,this.step=s?parseFloat(n):1}return e.prototype.type="Range",e.prototype.isRange=!0,e.parse=function(r){if("string"!=typeof r)return null;var t=r.split(":").map((function(e){return parseFloat(e)}));if(t.some((function(e){return isNaN(e)})))return null;switch(t.length){case 2:return new e(t[0],t[1]);case 3:return new e(t[0],t[2],t[1]);default:return null}},e.prototype.clone=function(){return new e(this.start,this.end,this.step)},e.prototype.size=function(){var e=0,r=this.start,t=this.step,n=this.end-r;return ue(t)===ue(n)?e=Math.ceil(n/t):0===n&&(e=0),isNaN(e)&&(e=0),[e]},e.prototype.min=function(){var e=this.size()[0];return e>0?this.step>0?this.start:this.start+(e-1)*this.step:void 0},e.prototype.max=function(){var e=this.size()[0];return e>0?this.step>0?this.start+(e-1)*this.step:this.start:void 0},e.prototype.forEach=function(e){var r=this.start,t=this.step,n=this.end,i=0;if(t>0)for(;rn;)e(r,[i],this),r+=t,i++},e.prototype.map=function(e){var r=[];return this.forEach((function(t,n,i){r[n[0]]=e(t,n,i)})),r},e.prototype.toArray=function(){var e=[];return this.forEach((function(r,t){e[t[0]]=r})),e},e.prototype.valueOf=function(){return this.toArray()},e.prototype.format=function(e){var r=he(this.start,e);return 1!==this.step&&(r+=":"+he(this.step,e)),r+=":"+he(this.end,e)},e.prototype.toString=function(){return this.format()},e.prototype.toJSON=function(){return{mathjs:"Range",start:this.start,end:this.end,step:this.step}},e.fromJSON=function(r){return new e(r.start,r.end,r.step)},e}),{isClass:!0}),xn=ur("Matrix",[],(()=>{function e(){if(!(this instanceof e))throw new SyntaxError("Constructor must be called with the new operator")}return e.prototype.type="Matrix",e.prototype.isMatrix=!0,e.prototype.storage=function(){throw new Error("Cannot invoke storage on a Matrix interface")},e.prototype.datatype=function(){throw new Error("Cannot invoke datatype on a Matrix interface")},e.prototype.create=function(e,r){throw new Error("Cannot invoke create on a Matrix interface")},e.prototype.subset=function(e,r,t){throw new Error("Cannot invoke subset on a Matrix interface")},e.prototype.get=function(e){throw new Error("Cannot invoke get on a Matrix interface")},e.prototype.set=function(e,r,t){throw new Error("Cannot invoke set on a Matrix interface")},e.prototype.resize=function(e,r){throw new Error("Cannot invoke resize on a Matrix interface")},e.prototype.reshape=function(e,r){throw new Error("Cannot invoke reshape on a Matrix interface")},e.prototype.clone=function(){throw new Error("Cannot invoke clone on a Matrix interface")},e.prototype.size=function(){throw new Error("Cannot invoke size on a Matrix interface")},e.prototype.map=function(e,r){throw new Error("Cannot invoke map on a Matrix interface")},e.prototype.forEach=function(e){throw new Error("Cannot invoke forEach on a Matrix interface")},e.prototype[Symbol.iterator]=function(){throw new Error("Cannot iterate a Matrix interface")},e.prototype.toArray=function(){throw new Error("Cannot invoke toArray on a Matrix interface")},e.prototype.valueOf=function(){throw new Error("Cannot invoke valueOf on a Matrix interface")},e.prototype.format=function(e){throw new Error("Cannot invoke format on a Matrix interface")},e.prototype.toString=function(){throw new Error("Cannot invoke toString on a Matrix interface")},e}),{isClass:!0});function bn(e){var r=0,t=1,n=Object.create(null),i=Object.create(null),a=0,o=function(e){var o=i[e];if(o&&(delete n[o],delete i[e],--r,t===o)){if(!r)return a=0,void(t=1);for(;!hasOwnProperty.call(n,++t);)continue}};return e=Math.abs(e),{hit:function(s){var u=i[s],c=++a;if(n[c]=s,i[s]=c,!u){if(++r<=e)return;return s=n[t],o(s),s}if(delete n[u],t===u)for(;!hasOwnProperty.call(n,++t);)continue},delete:o,clear:function(){r=a=0,t=1,n=Object.create(null),i=Object.create(null)}}}function wn(e){var{hasher:r,limit:t}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return t=null==t?Number.POSITIVE_INFINITY:t,r=null==r?JSON.stringify:r,function n(){"object"!=typeof n.cache&&(n.cache={values:new Map,lru:bn(t||Number.POSITIVE_INFINITY)});for(var i=[],a=0;a{var{Matrix:r}=e;function t(e,r){if(!(this instanceof t))throw new SyntaxError("Constructor must be called with the new operator");if(r&&!l(r))throw new Error("Invalid datatype: "+r);if(p(e))"DenseMatrix"===e.type?(this._data=G(e._data),this._size=G(e._size),this._datatype=r||e._datatype):(this._data=e.toArray(),this._size=e.size(),this._datatype=r||e._datatype);else if(e&&f(e.data)&&f(e.size))this._data=e.data,this._size=e.size,Le(this._data,this._size),this._datatype=r||e.datatype;else if(f(e))this._data=c(e),this._size=Ue(this._data),Le(this._data,this._size),this._datatype=r;else{if(e)throw new TypeError("Unsupported type of data ("+Z(e)+")");this._data=[],this._size=[0],this._datatype=r}}function n(e,r,t,i){var a=i===t-1,o=r.dimension(i);return a?o.map((function(r){return He(r,e.length),e[r]})).valueOf():o.map((function(a){return He(a,e.length),n(e[a],r,t,i+1)})).valueOf()}function i(e,r,t,n,a){var o=a===n-1,s=r.dimension(a);o?s.forEach((function(r,n){He(r),e[r]=t[n[0]]})):s.forEach((function(o,s){He(o),i(e[o],r,t[s[0]],n,a+1)}))}function s(e,r,t){if(0===r.length){for(var n=e._data;f(n);)n=n[0];return n}return e._size=r.slice(0),e._data=$e(e._data,e._size,t),e}function u(e,r,t){for(var n=e._size.slice(0),i=!1;n.lengthn[a]&&(n[a]=r[a],i=!0);i&&s(e,n,t)}function c(e){for(var r=0,t=e.length;r");var f=r.max().map((function(e){return e+1}));u(e,f,n);var m=o.length,d=0;i(e._data,r,t,m,d)}return e}(this,e,r,a);default:throw new SyntaxError("Wrong number of arguments")}},t.prototype.get=function(e){if(!f(e))throw new TypeError("Array expected");if(e.length!==this._size.length)throw new Re(e.length,this._size.length);for(var r=0;rArray.isArray(e)&&1===e.length?e[0]:e));return s(t?this.clone():this,n,r)},t.prototype.reshape=function(e,r){var t=r?this.clone():this;t._data=Ge(t._data,e);var n=t._size.reduce(((e,r)=>e*r));return t._size=Ve(e,n),t},t.prototype.clone=function(){return new t({data:G(this._data),size:G(this._size),datatype:this._datatype})},t.prototype.size=function(){return this._size.slice(0)},t.prototype.map=function(e){var r=this,n=Nn(e),i=function t(i,a){return f(i)?i.map((function(e,r){return t(e,a.concat(r))})):1===n?e(i):2===n?e(i,a):e(i,a,r)}(this._data,[]);return new t(i,void 0!==this._datatype?sr(i,Z):void 0)},t.prototype.forEach=function(e){var r=this;!function t(n,i){f(n)?n.forEach((function(e,r){t(e,i.concat(r))})):e(n,i,r)}(this._data,[])},t.prototype[Symbol.iterator]=function*(){yield*function*e(r,t){if(f(r))for(var n=0;n[e[n]]));r.push(new t(a,e._datatype))},o=0;o0?e:0,n=e<0?-e:0,i=this._size[0],s=this._size[1],u=Math.min(i-n,s-r),c=[],l=0;l0?n:0,c=n<0?-n:0,l=e[0],m=e[1],d=Math.min(l-c,m-u);if(f(r)){if(r.length!==d)throw new Error("Invalid value array length");s=function(e){return r[e]}}else if(p(r)){var h=r.size();if(1!==h.length||h[0]!==d)throw new Error("Invalid matrix length");s=function(e){return r.get([e])}}else s=function(){return r};i||(i=o(s(0))?s(0).mul(0):0);var g=[];if(e.length>0){g=$e(g,e,i);for(var y=0;y{var{typed:r}=e;return r(En,{any:G})}));function Cn(e){var r,t,n=e.length,i=e[0].length,a=[];for(t=0;t=n.length)throw new Pe(r,n.length);return p(e)?e.create(Tn(e.valueOf(),r,t)):Tn(e,r,t)}function Tn(e,r,t){var n,i,a,o;if(r<=0){if(Array.isArray(e[0])){for(o=Cn(e),i=[],n=0;n{var{typed:r}=e;return r(_n,{number:se,BigNumber:function(e){return e.isInt()},Fraction:function(e){return 1===e.d&&isFinite(e.n)},"Array | Matrix":r.referToSelf((e=>r=>Fn(r,e)))})})),qn="number",In="number, number";function kn(e){return Math.abs(e)}function Rn(e,r){return e+r}function Pn(e,r){return e*r}function Un(e){return-e}function jn(e){return e}function Ln(e){return pe(e)}function Hn(e){return e*e*e}function $n(e){return Math.exp(e)}function Zn(e){return me(e)}function Gn(e,r){if(!se(e)||!se(r))throw new Error("Parameters in function gcd must be integer numbers");for(var t;0!==r;)t=e%r,e=r,r=t;return e<0?-e:e}function Vn(e,r){if(!se(e)||!se(r))throw new Error("Parameters in function lcm must be integer numbers");if(0===e||0===r)return 0;for(var t,n=e*r;0!==r;)r=e%(t=r),e=t;return Math.abs(n/e)}function Wn(e){return le(e)}function Yn(e){return ce(e)}function Jn(e,r){if(r>0)return e-r*Math.floor(e/r);if(0===r)return e;throw new Error("Cannot calculate mod for a negative divisor")}function Xn(e){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:2,t=r<0;if(t&&(r=-r),0===r)throw new Error("Root must be non-zero");if(e<0&&Math.abs(r)%2!=1)throw new Error("Root must be odd when a is negative.");if(0===e)return t?1/0:0;if(!isFinite(e))return t?0:e;var n=Math.pow(Math.abs(e),1/r);return n=e<0?-n:n,t?1/n:n}function Qn(e){return ue(e)}function Kn(e){return e*e}function ei(e,r){var t,n,i,a=0,o=1,s=1,u=0;if(!se(e)||!se(r))throw new Error("Parameters in function xgcd must be integer numbers");for(;r;)i=e-(n=Math.floor(e/r))*r,t=a,a=o-n*a,o=t,t=s,s=u-n*s,u=t,e=r,r=i;return e<0?[-e,-o,-u]:[e,e?o:0,u]}function ri(e,r){return e*e<1&&r===1/0||e*e>1&&r===-1/0?0:Math.pow(e,r)}function ti(e){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;if(!se(r)||r<0||r>15)throw new Error("Number of decimals in function round must be an integer from 0 to 15 inclusive");return parseFloat(ye(e,r))}kn.signature=qn,Rn.signature=In,Pn.signature=In,Un.signature=qn,jn.signature=qn,Ln.signature=qn,Hn.signature=qn,$n.signature=qn,Zn.signature=qn,Gn.signature=In,Vn.signature=In,Wn.signature=qn,Yn.signature=qn,Jn.signature=In,Qn.signature=qn,Kn.signature=qn,ei.signature=In,ri.signature=In;var ni="number, number";function ii(e,r){if(!se(e)||!se(r))throw new Error("Integers expected in function bitAnd");return e&r}function ai(e){if(!se(e))throw new Error("Integer expected in function bitNot");return~e}function oi(e,r){if(!se(e)||!se(r))throw new Error("Integers expected in function bitOr");return e|r}function si(e,r){if(!se(e)||!se(r))throw new Error("Integers expected in function bitXor");return e^r}function ui(e,r){if(!se(e)||!se(r))throw new Error("Integers expected in function leftShift");return e<>r}function li(e,r){if(!se(e)||!se(r))throw new Error("Integers expected in function rightLogShift");return e>>>r}function fi(e,r){if(r>1;return fi(e,t)*fi(t+1,r)}function pi(e,r){if(!se(e)||e<0)throw new TypeError("Positive integer value expected in function combinations");if(!se(r)||r<0)throw new TypeError("Positive integer value expected in function combinations");if(r>e)throw new TypeError("k must be less than or equal to n");for(var t=e-r,n=1,i=2,a=r171?1/0:fi(1,e-1);if(e<.5)return Math.PI/(Math.sin(Math.PI*e)*wi(1-e));if(e>=171.35)return 1/0;if(e>85){var t=e*e,n=t*e,i=n*e,a=i*e;return Math.sqrt(2*Math.PI/e)*Math.pow(e/Math.E,e)*(1+1/(12*e)+1/(288*t)-139/(51840*n)-571/(2488320*i)+163879/(209018880*a)+5246819/(75246796800*a*e))}--e,r=Di[0];for(var o=1;o=1;n--)t+=Ai[n]/(e+n);return Ei+(e+.5)*Math.log(r)-r+Math.log(t)}Ci.signature="number";var Si="number";function Mi(e){return De(e)}function Fi(e){return Math.atan(1/e)}function Bi(e){return isFinite(e)?(Math.log((e+1)/e)+Math.log(e/(e-1)))/2:0}function Ti(e){return Math.asin(1/e)}function Oi(e){var r=1/e;return Math.log(r+Math.sqrt(r*r+1))}function _i(e){return Math.acos(1/e)}function zi(e){var r=1/e,t=Math.sqrt(r*r-1);return Math.log(t+r)}function qi(e){return Ee(e)}function Ii(e){return Ae(e)}function ki(e){return 1/Math.tan(e)}function Ri(e){var r=Math.exp(2*e);return(r+1)/(r-1)}function Pi(e){return 1/Math.sin(e)}function Ui(e){return 0===e?Number.POSITIVE_INFINITY:Math.abs(2/(Math.exp(e)-Math.exp(-e)))*ue(e)}function ji(e){return 1/Math.cos(e)}function Li(e){return 2/(Math.exp(e)+Math.exp(-e))}function Hi(e){return Se(e)}Mi.signature=Si,Fi.signature=Si,Bi.signature=Si,Ti.signature=Si,Oi.signature=Si,_i.signature=Si,zi.signature=Si,qi.signature=Si,Ii.signature=Si,ki.signature=Si,Ri.signature=Si,Pi.signature=Si,Ui.signature=Si,ji.signature=Si,Li.signature=Si,Hi.signature=Si;var $i="number";function Zi(e){return e<0}function Gi(e){return e>0}function Vi(e){return 0===e}function Wi(e){return Number.isNaN(e)}Zi.signature=$i,Gi.signature=$i,Vi.signature=$i,Wi.signature=$i;var Yi="isNegative",Ji=ur(Yi,["typed"],(e=>{var{typed:r}=e;return r(Yi,{number:Zi,BigNumber:function(e){return e.isNeg()&&!e.isZero()&&!e.isNaN()},Fraction:function(e){return e.s<0},Unit:r.referToSelf((e=>t=>r.find(e,t.valueType())(t.value))),"Array | Matrix":r.referToSelf((e=>r=>Fn(r,e)))})})),Xi="isNumeric",Qi=ur(Xi,["typed"],(e=>{var{typed:r}=e;return r(Xi,{"number | BigNumber | Fraction | boolean":()=>!0,"Complex | Unit | string | null | undefined | Node":()=>!1,"Array | Matrix":r.referToSelf((e=>r=>Fn(r,e)))})})),Ki="hasNumericValue",ea=ur(Ki,["typed","isNumeric"],(e=>{var{typed:r,isNumeric:t}=e;return r(Ki,{boolean:()=>!0,string:function(e){return e.trim().length>0&&!isNaN(Number(e))},any:function(e){return t(e)}})})),ra="isPositive",ta=ur(ra,["typed"],(e=>{var{typed:r}=e;return r(ra,{number:Gi,BigNumber:function(e){return!e.isNeg()&&!e.isZero()&&!e.isNaN()},Fraction:function(e){return e.s>0&&e.n>0},Unit:r.referToSelf((e=>t=>r.find(e,t.valueType())(t.value))),"Array | Matrix":r.referToSelf((e=>r=>Fn(r,e)))})})),na="isZero",ia=ur(na,["typed"],(e=>{var{typed:r}=e;return r(na,{number:Vi,BigNumber:function(e){return e.isZero()},Complex:function(e){return 0===e.re&&0===e.im},Fraction:function(e){return 1===e.d&&0===e.n},Unit:r.referToSelf((e=>t=>r.find(e,t.valueType())(t.value))),"Array | Matrix":r.referToSelf((e=>r=>Fn(r,e)))})})),aa="isNaN",oa=ur(aa,["typed"],(e=>{var{typed:r}=e;return r(aa,{number:Wi,BigNumber:function(e){return e.isNaN()},Fraction:function(e){return!1},Complex:function(e){return e.isNaN()},Unit:function(e){return Number.isNaN(e.value)},"Array | Matrix":function(e){return Fn(e,Number.isNaN)}})})),sa="typeOf",ua=ur(sa,["typed"],(e=>{var{typed:r}=e;return r(sa,{any:Z})}));function ca(e,r,t){if(null==t)return e.eq(r);if(e.eq(r))return!0;if(e.isNaN()||r.isNaN())return!1;if(e.isFinite()&&r.isFinite()){var n=e.minus(r).abs();if(n.isZero())return!0;var i=e.constructor.max(e.abs(),r.abs());return n.lte(i.times(t))}return!1}var la=ur("compareUnits",["typed"],(e=>{var{typed:r}=e;return{"Unit, Unit":r.referToSelf((e=>(t,n)=>{if(!t.equalBase(n))throw new Error("Cannot compare units with different base");return r.find(e,[t.valueType(),n.valueType()])(t.value,n.value)}))}})),fa="equalScalar",pa=ur(fa,["typed","config"],(e=>{var{typed:r,config:t}=e,n=la({typed:r});return r(fa,{"boolean, boolean":function(e,r){return e===r},"number, number":function(e,r){return Ne(e,r,t.epsilon)},"BigNumber, BigNumber":function(e,r){return e.eq(r)||ca(e,r,t.epsilon)},"Fraction, Fraction":function(e,r){return e.equals(r)},"Complex, Complex":function(e,r){return function(e,r,t){return Ne(e.re,r.re,t)&&Ne(e.im,r.im,t)}(e,r,t.epsilon)}},n)})),ma=(ur(fa,["typed","config"],(e=>{var{typed:r,config:t}=e;return r(fa,{"number, number":function(e,r){return Ne(e,r,t.epsilon)}})})),ur("SparseMatrix",["typed","equalScalar","Matrix"],(e=>{var{typed:r,equalScalar:t,Matrix:n}=e;function i(e,r){if(!(this instanceof i))throw new SyntaxError("Constructor must be called with the new operator");if(r&&!l(r))throw new Error("Invalid datatype: "+r);if(p(e))!function(e,r,t){"SparseMatrix"===r.type?(e._values=r._values?G(r._values):void 0,e._index=G(r._index),e._ptr=G(r._ptr),e._size=G(r._size),e._datatype=t||r._datatype):s(e,r.valueOf(),t||r._datatype)}(this,e,r);else if(e&&f(e.index)&&f(e.ptr)&&f(e.size))this._values=e.values,this._index=e.index,this._ptr=e.ptr,this._size=e.size,this._datatype=r||e.datatype;else if(f(e))s(this,e,r);else{if(e)throw new TypeError("Unsupported type of data ("+Z(e)+")");this._values=[],this._index=[],this._ptr=[0],this._size=[0,0],this._datatype=r}}function s(e,n,i){e._values=[],e._index=[],e._ptr=[],e._datatype=i;var a=n.length,o=0,s=t,u=0;if(l(i)&&(s=r.find(t,[i,i])||t,u=r.convert(0,i)),a>0){var c=0;do{e._ptr.push(e._index.length);for(var p=0;ph){for(f=h;fd){if(m){var g=0;for(f=0;fn-1&&(e._values.splice(p,1),e._index.splice(p,1),v++)}e._ptr[f]=e._values.length}return e._size[0]=n,e._size[1]=i,e}function h(e,r,t,n,i){var a,o,s=n[0],u=n[1],c=[];for(a=0;a");if(1===a.length){r.dimension(0).forEach((function(r,i){He(r),e.set([r,0],t[i[0]],n)}))}else{var c=r.dimension(0),l=r.dimension(1);c.forEach((function(r,i){He(r),l.forEach((function(a,o){He(a),e.set([r,a],t[i[0]][o[0]],n)}))}))}}return e}(this,e,r,t);default:throw new SyntaxError("Wrong number of arguments")}},i.prototype.get=function(e){if(!f(e))throw new TypeError("Array expected");if(e.length!==this._size.length)throw new Re(e.length,this._size.length);if(!this._values)throw new Error("Cannot invoke get on a Pattern only matrix");var r=e[0],t=e[1];He(r,this._size[0]),He(t,this._size[1]);var n=u(r,this._ptr[t],this._ptr[t+1],this._index);return ns-1||o>p-1)&&(d(this,Math.max(a+1,s),Math.max(o+1,p),i),s=this._size[0],p=this._size[1]),He(a,s),He(o,p);var g=u(a,this._ptr[o],this._ptr[o+1],this._index);return gArray.isArray(e)&&1===e.length?e[0]:e));if(2!==n.length)throw new Error("Only two dimensions matrix are supported");return n.forEach((function(e){if(!a(e)||!se(e)||e<0)throw new TypeError("Invalid size, must contain positive integers (size: "+_e(n)+")")})),d(t?this.clone():this,n[0],n[1],r)},i.prototype.reshape=function(e,r){if(!f(e))throw new TypeError("Array expected");if(2!==e.length)throw new Error("Sparse matrices can only be reshaped in two dimensions");e.forEach((function(r){if(!a(r)||!se(r)||r<=-2||0===r)throw new TypeError("Invalid size, must contain positive integers or -1 (size: "+_e(e)+")")}));var t=this._size[0]*this._size[1];if(t!==(e=Ve(e,t))[0]*e[1])throw new Error("Reshaping sparse matrix will result in the wrong number of elements");var n=r?this.clone():this;if(this._size[0]===e[0]&&this._size[1]===e[1])return n;for(var i=[],o=0;o=n&&w<=a&&g(e._values[b],w-n,y-o)}else{for(var N={},D=v;D "+(this._values?_e(this._values[u],e):"X")}return i},i.prototype.toString=function(){return _e(this.toArray())},i.prototype.toJSON=function(){return{mathjs:"SparseMatrix",values:this._values,index:this._index,ptr:this._ptr,size:this._size,datatype:this._datatype}},i.prototype.diagonal=function(e){if(e){if(o(e)&&(e=e.toNumber()),!a(e)||!se(e))throw new TypeError("The parameter k must be an integer number")}else e=0;var r=e>0?e:0,t=e<0?-e:0,n=this._size[0],s=this._size[1],u=Math.min(n-t,s-r),c=[],l=[],f=[];f[0]=0;for(var p=r;p0?s:0,y=s<0?-s:0,v=e[0],x=e[1],b=Math.min(v-y,x-g);if(f(n)){if(n.length!==b)throw new Error("Invalid value array length");h=function(e){return n[e]}}else if(p(n)){var w=n.size();if(1!==w.length||w[0]!==b)throw new Error("Invalid matrix length");h=function(e){return n.get([e])}}else h=function(){return n};for(var N=[],D=[],E=[],A=0;A=0&&C=c||i[f]!==r)){var m=n?n[l]:void 0;i.splice(f,0,r),n&&n.splice(f,0,m),i.splice(f<=l?l+1:l,1),n&&n.splice(f<=l?l+1:l,1)}else if(f=c||i[l]!==e)){var d=n?n[f]:void 0;i.splice(l,0,e),n&&n.splice(l,0,d),i.splice(l<=f?f+1:f,1),n&&n.splice(l<=f?f+1:f,1)}}},i}),{isClass:!0}));var da=ur("number",["typed"],(e=>{var{typed:r}=e,t=r("number",{"":function(){return 0},number:function(e){return e},string:function(e){if("NaN"===e)return NaN;var r,t,n=(t=(r=e).match(/(0[box])([0-9a-fA-F]*)\.([0-9a-fA-F]*)/))?{input:r,radix:{"0b":2,"0o":8,"0x":16}[t[1]],integerPart:t[2],fractionalPart:t[3]}:null;if(n)return function(e){for(var r=parseInt(e.integerPart,e.radix),t=0,n=0;n2**i-1)throw new SyntaxError('String "'.concat(e,'" is out of range'));o>=2**(i-1)&&(o-=2**i)}return o},BigNumber:function(e){return e.toNumber()},Fraction:function(e){return e.valueOf()},Unit:r.referToSelf((e=>r=>{var t=r.clone();return t.value=e(r.value),t})),null:function(e){return 0},"Unit, string | Unit":function(e,r){return e.toNumber(r)},"Array | Matrix":r.referToSelf((e=>r=>Fn(r,e)))});return t.fromJSON=function(e){return parseFloat(e.value)},t})),ha="string",ga=ur(ha,["typed"],(e=>{var{typed:r}=e;return r(ha,{"":function(){return""},number:he,null:function(e){return"null"},boolean:function(e){return e+""},string:function(e){return e},"Array | Matrix":r.referToSelf((e=>r=>Fn(r,e))),any:function(e){return String(e)}})})),ya="boolean",va=ur(ya,["typed"],(e=>{var{typed:r}=e;return r(ya,{"":function(){return!1},boolean:function(e){return e},number:function(e){return!!e},null:function(e){return!1},BigNumber:function(e){return!e.isZero()},string:function(e){var r=e.toLowerCase();if("true"===r)return!0;if("false"===r)return!1;var t=Number(e);if(""!==e&&!isNaN(t))return!!t;throw new Error('Cannot convert "'+e+'" to a boolean')},"Array | Matrix":r.referToSelf((e=>r=>Fn(r,e)))})})),xa=ur("bignumber",["typed","BigNumber"],(e=>{var{typed:r,BigNumber:t}=e;return r("bignumber",{"":function(){return new t(0)},number:function(e){return new t(e+"")},string:function(e){var r=e.match(/(0[box][0-9a-fA-F]*)i([0-9]*)/);if(r){var n=r[2],i=t(r[1]),a=new t(2).pow(Number(n));if(i.gt(a.sub(1)))throw new SyntaxError('String "'.concat(e,'" is out of range'));var o=new t(2).pow(Number(n)-1);return i.gte(o)?i.sub(a):i}return new t(e)},BigNumber:function(e){return e},Unit:r.referToSelf((e=>r=>{var t=r.clone();return t.value=e(r.value),t})),Fraction:function(e){return new t(e.n).div(e.d).times(e.s)},null:function(e){return new t(0)},"Array | Matrix":r.referToSelf((e=>r=>Fn(r,e)))})})),ba=ur("complex",["typed","Complex"],(e=>{var{typed:r,Complex:t}=e;return r("complex",{"":function(){return t.ZERO},number:function(e){return new t(e,0)},"number, number":function(e,r){return new t(e,r)},"BigNumber, BigNumber":function(e,r){return new t(e.toNumber(),r.toNumber())},Fraction:function(e){return new t(e.valueOf(),0)},Complex:function(e){return e.clone()},string:function(e){return t(e)},null:function(e){return t(0)},Object:function(e){if("re"in e&&"im"in e)return new t(e.re,e.im);if("r"in e&&"phi"in e||"abs"in e&&"arg"in e)return new t(e);throw new Error("Expected object with properties (re and im) or (r and phi) or (abs and arg)")},"Array | Matrix":r.referToSelf((e=>r=>Fn(r,e)))})})),wa=ur("fraction",["typed","Fraction"],(e=>{var{typed:r,Fraction:t}=e;return r("fraction",{number:function(e){if(!isFinite(e)||isNaN(e))throw new Error(e+" cannot be represented as a fraction");return new t(e)},string:function(e){return new t(e)},"number, number":function(e,r){return new t(e,r)},null:function(e){return new t(0)},BigNumber:function(e){return new t(e.toString())},Fraction:function(e){return e},Unit:r.referToSelf((e=>r=>{var t=r.clone();return t.value=e(r.value),t})),Object:function(e){return new t(e)},"Array | Matrix":r.referToSelf((e=>r=>Fn(r,e)))})})),Na="matrix",Da=ur(Na,["typed","Matrix","DenseMatrix","SparseMatrix"],(e=>{var{typed:r,Matrix:t,DenseMatrix:n,SparseMatrix:i}=e;return r(Na,{"":function(){return a([])},string:function(e){return a([],e)},"string, string":function(e,r){return a([],e,r)},Array:function(e){return a(e)},Matrix:function(e){return a(e,e.storage())},"Array | Matrix, string":a,"Array | Matrix, string, string":a});function a(e,r,t){if("dense"===r||"default"===r||void 0===r)return new n(e,t);if("sparse"===r)return new i(e,t);throw new TypeError("Unknown matrix type "+JSON.stringify(r)+".")}})),Ea="matrixFromFunction",Aa=ur(Ea,["typed","matrix","isZero"],(e=>{var{typed:r,matrix:t,isZero:n}=e;return r(Ea,{"Array | Matrix, function, string, string":function(e,r,t,n){return i(e,r,t,n)},"Array | Matrix, function, string":function(e,r,t){return i(e,r,t)},"Matrix, function":function(e,r){return i(e,r,"dense")},"Array, function":function(e,r){return i(e,r,"dense").toArray()},"Array | Matrix, string, function":function(e,r,t){return i(e,t,r)},"Array | Matrix, string, string, function":function(e,r,t,n){return i(e,n,r,t)}});function i(e,r,i,a){var o;return(o=void 0!==a?t(i,a):t(i)).resize(e),o.forEach((function(e,t){var i=r(t);n(i)||o.set(t,i)})),o}})),Ca="matrixFromRows",Sa=ur(Ca,["typed","matrix","flatten","size"],(e=>{var{typed:r,matrix:t,flatten:n,size:i}=e;return r(Ca,{"...Array":function(e){return a(e)},"...Matrix":function(e){return t(a(e.map((e=>e.toArray()))))}});function a(e){if(0===e.length)throw new TypeError("At least one row is needed to construct a matrix.");var r=o(e[0]),t=[];for(var i of e){var a=o(i);if(a!==r)throw new TypeError("The vectors had different length: "+(0|r)+" ≠ "+(0|a));t.push(n(i))}return t}function o(e){var r=i(e);if(1===r.length)return r[0];if(2===r.length){if(1===r[0])return r[1];if(1===r[1])return r[0];throw new TypeError("At least one of the arguments is not a vector.")}throw new TypeError("Only one- or two-dimensional vectors are supported.")}})),Ma="matrixFromColumns",Fa=ur(Ma,["typed","matrix","flatten","size"],(e=>{var{typed:r,matrix:t,flatten:n,size:i}=e;return r(Ma,{"...Array":function(e){return a(e)},"...Matrix":function(e){return t(a(e.map((e=>e.toArray()))))}});function a(e){if(0===e.length)throw new TypeError("At least one column is needed to construct a matrix.");for(var r=o(e[0]),t=[],i=0;i{var{typed:r}=e;return r(Ba,{"Unit, Array":function(e,r){return e.splitUnit(r)}})})),Oa="unaryMinus",_a=ur(Oa,["typed"],(e=>{var{typed:r}=e;return r(Oa,{number:Un,"Complex | BigNumber | Fraction":e=>e.neg(),Unit:r.referToSelf((e=>t=>{var n=t.clone();return n.value=r.find(e,n.valueType())(t.value),n})),"Array | Matrix":r.referToSelf((e=>r=>Fn(r,e,!0)))})})),za="unaryPlus",qa=ur(za,["typed","config","BigNumber"],(e=>{var{typed:r,config:t,BigNumber:n}=e;return r(za,{number:jn,Complex:function(e){return e},BigNumber:function(e){return e},Fraction:function(e){return e},Unit:function(e){return e.clone()},"Array | Matrix":r.referToSelf((e=>r=>Fn(r,e,!0))),"boolean | string":function(e){return"BigNumber"===t.number?new n(+e):+e}})})),Ia=ur("abs",["typed"],(e=>{var{typed:r}=e;return r("abs",{number:kn,"Complex | BigNumber | Fraction | Unit":e=>e.abs(),"Array | Matrix":r.referToSelf((e=>r=>Fn(r,e,!0)))})})),ka="apply",Ra=ur(ka,["typed","isInteger"],(e=>{var{typed:r,isInteger:t}=e;return r(ka,{"Array | Matrix, number | BigNumber, function":function(e,r,n){if(!t(r))throw new TypeError("Integer number expected for dimension");var i=Array.isArray(e)?Ue(e):e.size();if(r<0||r>=i.length)throw new Pe(r,i.length);return p(e)?e.create(Pa(e.valueOf(),r,n)):Pa(e,r,n)}})}));function Pa(e,r,t){var n,i,a;if(r<=0){if(Array.isArray(e[0])){for(a=function(e){var r,t,n=e.length,i=e[0].length,a=[];for(t=0;t{var{typed:r}=e;return r(Ua,{"number, number":Rn,"Complex, Complex":function(e,r){return e.add(r)},"BigNumber, BigNumber":function(e,r){return e.plus(r)},"Fraction, Fraction":function(e,r){return e.add(r)},"Unit, Unit":r.referToSelf((e=>(t,n)=>{if(null===t.value||void 0===t.value)throw new Error("Parameter x contains a unit with undefined value");if(null===n.value||void 0===n.value)throw new Error("Parameter y contains a unit with undefined value");if(!t.equalBase(n))throw new Error("Units do not match");var i=t.clone();return i.value=r.find(e,[i.valueType(),n.valueType()])(i.value,n.value),i.fixPrefix=!1,i}))})})),La="cbrt",Ha=ur(La,["config","typed","isNegative","unaryMinus","matrix","Complex","BigNumber","Fraction"],(e=>{var{config:r,typed:t,isNegative:n,unaryMinus:i,matrix:a,Complex:c,BigNumber:l,Fraction:f}=e;return t(La,{number:Ln,Complex:p,"Complex, boolean":p,BigNumber:function(e){return e.cbrt()},Unit:function(e){if(e.value&&s(e.value)){var r=e.clone();return r.value=1,(r=r.pow(1/3)).value=p(e.value),r}var t,a=n(e.value);a&&(e.value=i(e.value)),t=o(e.value)?new l(1).div(3):u(e.value)?new f(1,3):1/3;var c=e.pow(t);return a&&(c.value=i(c.value)),c}});function p(e,t){var n=e.arg()/3,i=e.abs(),o=new c(Ln(i),0).mul(new c(0,n).exp());if(t){var s=[o,new c(Ln(i),0).mul(new c(0,n+2*Math.PI/3).exp()),new c(Ln(i),0).mul(new c(0,n-2*Math.PI/3).exp())];return"Array"===r.matrix?s:a(s)}return o}})),$a=ur("matAlgo11xS0s",["typed","equalScalar"],(e=>{var{typed:r,equalScalar:t}=e;return function(e,n,i,a){var o=e._values,s=e._index,u=e._ptr,c=e._size,l=e._datatype;if(!o)throw new Error("Cannot perform operation on Pattern Sparse Matrix and Scalar value");var f,p=c[0],m=c[1],d=t,h=0,g=i;"string"==typeof l&&(f=l,d=r.find(t,[f,f]),h=r.convert(0,f),n=r.convert(n,f),g=r.find(i,[f,f]));for(var y=[],v=[],x=[],b=0;b{var{typed:r,DenseMatrix:t}=e;return function(e,n,i,a){var o=e._values,s=e._index,u=e._ptr,c=e._size,l=e._datatype;if(!o)throw new Error("Cannot perform operation on Pattern Sparse Matrix and Scalar value");var f,p=c[0],m=c[1],d=i;"string"==typeof l&&(f=l,n=r.convert(n,f),d=r.find(i,[f,f]));for(var h=[],g=[],y=[],v=0;v{var{typed:r}=e;return function(e,n,i,a){var o,s=e._data,u=e._size,c=e._datatype,l=i;"string"==typeof c&&(o=c,n=r.convert(n,o),l=r.find(i,[o,o]));var f=u.length>0?t(l,0,u,u[0],s,n,a):[];return e.createDenseMatrix({data:f,size:G(u),datatype:o})};function t(e,r,n,i,a,o,s){var u=[];if(r===n.length-1)for(var c=0;c{var{typed:r,config:t,round:n}=e;return r(Va,{number:function(e){return Ne(e,n(e),t.epsilon)?n(e):Math.ceil(e)},"number, number":function(e,r){if(Ne(e,n(e,r),t.epsilon))return n(e,r);var[i,a]="".concat(e,"e").split("e"),o=Math.ceil(Number("".concat(i,"e").concat(Number(a)+r)));return[i,a]="".concat(o,"e").split("e"),Number("".concat(i,"e").concat(Number(a)-r))}})})),Ja=ur(Va,Wa,(e=>{var{typed:r,config:t,round:n,matrix:i,equalScalar:a,zeros:o,DenseMatrix:s}=e,u=$a({typed:r,equalScalar:a}),c=Za({typed:r,DenseMatrix:s}),l=Ga({typed:r}),f=Ya({typed:r,config:t,round:n});return r("ceil",{number:f.signatures.number,"number,number":f.signatures["number,number"],Complex:function(e){return e.ceil()},"Complex, number":function(e,r){return e.ceil(r)},"Complex, BigNumber":function(e,r){return e.ceil(r.toNumber())},BigNumber:function(e){return ca(e,n(e),t.epsilon)?n(e):e.ceil()},"BigNumber, BigNumber":function(e,r){return ca(e,n(e,r),t.epsilon)?n(e,r):e.toDecimalPlaces(r.toNumber(),pn.ROUND_CEIL)},Fraction:function(e){return e.ceil()},"Fraction, number":function(e,r){return e.ceil(r)},"Fraction, BigNumber":function(e,r){return e.ceil(r.toNumber())},"Array | Matrix":r.referToSelf((e=>r=>Fn(r,e,!0))),"Array, number | BigNumber":r.referToSelf((e=>(r,t)=>Fn(r,(r=>e(r,t)),!0))),"SparseMatrix, number | BigNumber":r.referToSelf((e=>(r,t)=>u(r,t,e,!1))),"DenseMatrix, number | BigNumber":r.referToSelf((e=>(r,t)=>l(r,t,e,!1))),"number | Complex | Fraction | BigNumber, Array":r.referToSelf((e=>(r,t)=>l(i(t),r,e,!0).valueOf())),"number | Complex | Fraction | BigNumber, Matrix":r.referToSelf((e=>(r,t)=>a(r,0)?o(t.size(),t.storage()):"dense"===t.storage()?l(t,r,e,!0):c(t,r,e,!0)))})})),Xa="cube",Qa=ur(Xa,["typed"],(e=>{var{typed:r}=e;return r(Xa,{number:Hn,Complex:function(e){return e.mul(e).mul(e)},BigNumber:function(e){return e.times(e).times(e)},Fraction:function(e){return e.pow(3)},Unit:function(e){return e.pow(3)}})})),Ka=ur("exp",["typed"],(e=>{var{typed:r}=e;return r("exp",{number:$n,Complex:function(e){return e.exp()},BigNumber:function(e){return e.exp()}})})),eo="expm1",ro=ur(eo,["typed","Complex"],(e=>{var{typed:r,Complex:t}=e;return r(eo,{number:Zn,Complex:function(e){var r=Math.exp(e.re);return new t(r*Math.cos(e.im)-1,r*Math.sin(e.im))},BigNumber:function(e){return e.exp().minus(1)}})})),to="fix",no=["typed","Complex","matrix","ceil","floor","equalScalar","zeros","DenseMatrix"],io=ur(to,["typed","ceil","floor"],(e=>{var{typed:r,ceil:t,floor:n}=e;return r(to,{number:function(e){return e>0?n(e):t(e)},"number, number":function(e,r){return e>0?n(e,r):t(e,r)}})})),ao=ur(to,no,(e=>{var{typed:r,Complex:t,matrix:n,ceil:i,floor:a,equalScalar:o,zeros:s,DenseMatrix:u}=e,c=Za({typed:r,DenseMatrix:u}),l=Ga({typed:r}),f=io({typed:r,ceil:i,floor:a});return r("fix",{number:f.signatures.number,"number, number | BigNumber":f.signatures["number,number"],Complex:function(e){return new t(e.re>0?Math.floor(e.re):Math.ceil(e.re),e.im>0?Math.floor(e.im):Math.ceil(e.im))},"Complex, number":function(e,r){return new t(e.re>0?a(e.re,r):i(e.re,r),e.im>0?a(e.im,r):i(e.im,r))},"Complex, BigNumber":function(e,r){var n=r.toNumber();return new t(e.re>0?a(e.re,n):i(e.re,n),e.im>0?a(e.im,n):i(e.im,n))},BigNumber:function(e){return e.isNegative()?i(e):a(e)},"BigNumber, number | BigNumber":function(e,r){return e.isNegative()?i(e,r):a(e,r)},Fraction:function(e){return e.s<0?e.ceil():e.floor()},"Fraction, number | BigNumber":function(e,r){return e.s<0?i(e,r):a(e,r)},"Array | Matrix":r.referToSelf((e=>r=>Fn(r,e,!0))),"Array | Matrix, number | BigNumber":r.referToSelf((e=>(r,t)=>Fn(r,(r=>e(r,t)),!0))),"number | Complex | Fraction | BigNumber, Array":r.referToSelf((e=>(r,t)=>l(n(t),r,e,!0).valueOf())),"number | Complex | Fraction | BigNumber, Matrix":r.referToSelf((e=>(r,t)=>o(r,0)?s(t.size(),t.storage()):"dense"===t.storage()?l(t,r,e,!0):c(t,r,e,!0)))})})),oo="floor",so=["typed","config","round","matrix","equalScalar","zeros","DenseMatrix"],uo=ur(oo,["typed","config","round"],(e=>{var{typed:r,config:t,round:n}=e;return r(oo,{number:function(e){return Ne(e,n(e),t.epsilon)?n(e):Math.floor(e)},"number, number":function(e,r){if(Ne(e,n(e,r),t.epsilon))return n(e,r);var[i,a]="".concat(e,"e").split("e"),o=Math.floor(Number("".concat(i,"e").concat(Number(a)+r)));return[i,a]="".concat(o,"e").split("e"),Number("".concat(i,"e").concat(Number(a)-r))}})})),co=ur(oo,so,(e=>{var{typed:r,config:t,round:n,matrix:i,equalScalar:a,zeros:o,DenseMatrix:s}=e,u=$a({typed:r,equalScalar:a}),c=Za({typed:r,DenseMatrix:s}),l=Ga({typed:r}),f=uo({typed:r,config:t,round:n});return r("floor",{number:f.signatures.number,"number,number":f.signatures["number,number"],Complex:function(e){return e.floor()},"Complex, number":function(e,r){return e.floor(r)},"Complex, BigNumber":function(e,r){return e.floor(r.toNumber())},BigNumber:function(e){return ca(e,n(e),t.epsilon)?n(e):e.floor()},"BigNumber, BigNumber":function(e,r){return ca(e,n(e,r),t.epsilon)?n(e,r):e.toDecimalPlaces(r.toNumber(),pn.ROUND_FLOOR)},Fraction:function(e){return e.floor()},"Fraction, number":function(e,r){return e.floor(r)},"Fraction, BigNumber":function(e,r){return e.floor(r.toNumber())},"Array | Matrix":r.referToSelf((e=>r=>Fn(r,e,!0))),"Array, number | BigNumber":r.referToSelf((e=>(r,t)=>Fn(r,(r=>e(r,t)),!0))),"SparseMatrix, number | BigNumber":r.referToSelf((e=>(r,t)=>u(r,t,e,!1))),"DenseMatrix, number | BigNumber":r.referToSelf((e=>(r,t)=>l(r,t,e,!1))),"number | Complex | Fraction | BigNumber, Array":r.referToSelf((e=>(r,t)=>l(i(t),r,e,!0).valueOf())),"number | Complex | Fraction | BigNumber, Matrix":r.referToSelf((e=>(r,t)=>a(r,0)?o(t.size(),t.storage()):"dense"===t.storage()?l(t,r,e,!0):c(t,r,e,!0)))})})),lo=ur("matAlgo01xDSid",["typed"],(e=>{var{typed:r}=e;return function(e,t,n,i){var a=e._data,o=e._size,s=e._datatype,u=t._values,c=t._index,l=t._ptr,f=t._size,p=t._datatype;if(o.length!==f.length)throw new Re(o.length,f.length);if(o[0]!==f[0]||o[1]!==f[1])throw new RangeError("Dimension mismatch. Matrix A ("+o+") must match Matrix B ("+f+")");if(!u)throw new Error("Cannot perform operation on Dense Matrix and Pattern Sparse Matrix");var m,d,h=o[0],g=o[1],y="string"==typeof s&&s===p?s:void 0,v=y?r.find(n,[y,y]):n,x=[];for(m=0;m{var{typed:r,equalScalar:t}=e;return function(e,n,i){var a=e._values,o=e._index,s=e._ptr,u=e._size,c=e._datatype,l=n._values,f=n._index,p=n._ptr,m=n._size,d=n._datatype;if(u.length!==m.length)throw new Re(u.length,m.length);if(u[0]!==m[0]||u[1]!==m[1])throw new RangeError("Dimension mismatch. Matrix A ("+u+") must match Matrix B ("+m+")");var h,g=u[0],y=u[1],v=t,x=0,b=i;"string"==typeof c&&c===d&&(h=c,v=r.find(t,[h,h]),x=r.convert(0,h),b=r.find(i,[h,h]));var w,N,D,E,A,C=a&&l?[]:void 0,S=[],M=[],F=a&&l?[]:void 0,B=a&&l?[]:void 0,T=[],O=[];for(N=0;N{var{typed:r,DenseMatrix:t}=e;return function(e,n,i,a){var o=e._values,s=e._index,u=e._ptr,c=e._size,l=e._datatype;if(!o)throw new Error("Cannot perform operation on Pattern Sparse Matrix and Scalar value");var f,p=c[0],m=c[1],d=i;"string"==typeof l&&(f=l,n=r.convert(n,f),d=r.find(i,[f,f]));for(var h=[],g=[],y=[],v=0;v{var{typed:r}=e;return function(e,n,i){var a,o=e._data,s=e._size,u=e._datatype,c=n._data,l=n._size,f=n._datatype,p=[];if(s.length!==l.length)throw new Re(s.length,l.length);for(var m=0;m0?t(d,0,p,p[0],o,c):[];return e.createDenseMatrix({data:h,size:p,datatype:a})};function t(e,r,n,i,a,o){var s=[];if(r===n.length-1)for(var u=0;u{var{concat:r}=e;return function(e,r){var a=Math.max(e._size.length,r._size.length);if(e._size.length===r._size.length&&e._size.every(((e,t)=>e===r._size[t])))return[e,r];for(var o=t(e._size,a,0),s=t(r._size,a,0),u=[],c=0;c1)throw new Error("shape missmatch: missmatch is found in arg with shape (".concat(e,") not possible to broadcast dimension ").concat(t," with size ").concat(e[t]," to size ").concat(r[t]))}})),go=ur("matrixAlgorithmSuite",["typed","matrix","concat"],(e=>{var{typed:r,matrix:t,concat:n}=e,i=mo({typed:r}),a=Ga({typed:r}),o=ho({concat:n});return function(e){var n,s=e.elop,u=e.SD||e.DS;s?(n={"DenseMatrix, DenseMatrix":(e,r)=>i(...o(e,r),s),"Array, Array":(e,r)=>i(...o(t(e),t(r)),s).valueOf(),"Array, DenseMatrix":(e,r)=>i(...o(t(e),r),s),"DenseMatrix, Array":(e,r)=>i(...o(e,t(r)),s)},e.SS&&(n["SparseMatrix, SparseMatrix"]=(r,t)=>e.SS(...o(r,t),s,!1)),e.DS&&(n["DenseMatrix, SparseMatrix"]=(r,t)=>e.DS(...o(r,t),s,!1),n["Array, SparseMatrix"]=(r,n)=>e.DS(...o(t(r),n),s,!1)),u&&(n["SparseMatrix, DenseMatrix"]=(e,r)=>u(...o(r,e),s,!0),n["SparseMatrix, Array"]=(e,r)=>u(...o(t(r),e),s,!0))):(n={"DenseMatrix, DenseMatrix":r.referToSelf((e=>(r,t)=>i(...o(r,t),e))),"Array, Array":r.referToSelf((e=>(r,n)=>i(...o(t(r),t(n)),e).valueOf())),"Array, DenseMatrix":r.referToSelf((e=>(r,n)=>i(...o(t(r),n),e))),"DenseMatrix, Array":r.referToSelf((e=>(r,n)=>i(...o(r,t(n)),e)))},e.SS&&(n["SparseMatrix, SparseMatrix"]=r.referToSelf((r=>(t,n)=>e.SS(...o(t,n),r,!1)))),e.DS&&(n["DenseMatrix, SparseMatrix"]=r.referToSelf((r=>(t,n)=>e.DS(...o(t,n),r,!1))),n["Array, SparseMatrix"]=r.referToSelf((r=>(n,i)=>e.DS(...o(t(n),i),r,!1)))),u&&(n["SparseMatrix, DenseMatrix"]=r.referToSelf((e=>(r,t)=>u(...o(t,r),e,!0))),n["SparseMatrix, Array"]=r.referToSelf((e=>(r,n)=>u(...o(t(n),r),e,!0)))));var c=e.scalar||"any";(e.Ds||e.Ss)&&(s?(n["DenseMatrix,"+c]=(e,r)=>a(e,r,s,!1),n[c+", DenseMatrix"]=(e,r)=>a(r,e,s,!0),n["Array,"+c]=(e,r)=>a(t(e),r,s,!1).valueOf(),n[c+", Array"]=(e,r)=>a(t(r),e,s,!0).valueOf()):(n["DenseMatrix,"+c]=r.referToSelf((e=>(r,t)=>a(r,t,e,!1))),n[c+", DenseMatrix"]=r.referToSelf((e=>(r,t)=>a(t,r,e,!0))),n["Array,"+c]=r.referToSelf((e=>(r,n)=>a(t(r),n,e,!1).valueOf())),n[c+", Array"]=r.referToSelf((e=>(r,n)=>a(t(n),r,e,!0).valueOf()))));var l=void 0!==e.sS?e.sS:e.Ss;return s?(e.Ss&&(n["SparseMatrix,"+c]=(r,t)=>e.Ss(r,t,s,!1)),l&&(n[c+", SparseMatrix"]=(e,r)=>l(r,e,s,!0))):(e.Ss&&(n["SparseMatrix,"+c]=r.referToSelf((r=>(t,n)=>e.Ss(t,n,r,!1)))),l&&(n[c+", SparseMatrix"]=r.referToSelf((e=>(r,t)=>l(t,r,e,!0))))),s&&s.signatures&&V(n,s.signatures),n}}));function yo(e,r,t,n){if(!(this instanceof yo))throw new SyntaxError("Constructor must be called with the new operator");this.fn=e,this.count=r,this.min=t,this.max=n,this.message="Wrong number of arguments in function "+e+" ("+r+" provided, "+t+(null!=n?"-"+n:"")+" expected)",this.stack=(new Error).stack}yo.prototype=new Error,yo.prototype.constructor=Error,yo.prototype.name="ArgumentsError",yo.prototype.isArgumentsError=!0;var vo=["typed","matrix","equalScalar","BigNumber","DenseMatrix","concat"],xo="number | BigNumber | Fraction | Matrix | Array",bo="".concat(xo,", ").concat(xo,", ...").concat(xo);function wo(e){return!e.some((e=>Array.isArray(e)))}var No=ur("gcd",vo,(e=>{var{typed:r,matrix:t,equalScalar:n,BigNumber:i,DenseMatrix:a,concat:o}=e,s=lo({typed:r}),u=fo({typed:r,equalScalar:n}),c=po({typed:r,DenseMatrix:a});return r("gcd",{"number, number":Gn,"BigNumber, BigNumber":function(e,r){if(!e.isInt()||!r.isInt())throw new Error("Parameters in function gcd must be integer numbers");var t=new i(0);for(;!r.isZero();){var n=e.mod(r);e=r,r=n}return e.lt(t)?e.neg():e},"Fraction, Fraction":(e,r)=>e.gcd(r)},go({typed:r,matrix:t,concat:o})({SS:u,DS:s,Ss:c}),{[bo]:r.referToSelf((e=>(r,t,n)=>{for(var i=e(r,t),a=0;ar=>{if(1===r.length&&Array.isArray(r[0])&&wo(r[0]))return e(...r[0]);if(wo(r))return e(...r);throw new yo("gcd() supports only 1d matrices!")})),Matrix:r.referToSelf((e=>r=>e(r.toArray())))})})),Do=ur("matAlgo02xDS0",["typed","equalScalar"],(e=>{var{typed:r,equalScalar:t}=e;return function(e,n,i,a){var o=e._data,s=e._size,u=e._datatype,c=n._values,l=n._index,f=n._ptr,p=n._size,m=n._datatype;if(s.length!==p.length)throw new Re(s.length,p.length);if(s[0]!==p[0]||s[1]!==p[1])throw new RangeError("Dimension mismatch. Matrix A ("+s+") must match Matrix B ("+p+")");if(!c)throw new Error("Cannot perform operation on Dense Matrix and Pattern Sparse Matrix");var d,h=s[0],g=s[1],y=t,v=0,x=i;"string"==typeof u&&u===m&&(d=u,y=r.find(t,[d,d]),v=r.convert(0,d),x=r.find(i,[d,d]));for(var b=[],w=[],N=[],D=0;D{var{typed:r,equalScalar:t}=e;return function(e,n,i){var a=e._values,o=e._size,s=e._datatype,u=n._values,c=n._size,l=n._datatype;if(o.length!==c.length)throw new Re(o.length,c.length);if(o[0]!==c[0]||o[1]!==c[1])throw new RangeError("Dimension mismatch. Matrix A ("+o+") must match Matrix B ("+c+")");var f,p=o[0],m=o[1],d=t,h=0,g=i;"string"==typeof s&&s===l&&(f=s,d=r.find(t,[f,f]),h=r.convert(0,f),g=r.find(i,[f,f]));for(var y=a&&u?[]:void 0,v=[],x=[],b=y?[]:void 0,w=[],N=[],D=0;D{var{typed:r,matrix:t,equalScalar:n,concat:i}=e,a=Do({typed:r,equalScalar:n}),o=Eo({typed:r,equalScalar:n}),s=$a({typed:r,equalScalar:n}),u=go({typed:r,matrix:t,concat:i}),c="number | BigNumber | Fraction | Matrix | Array",l={};return l["".concat(c,", ").concat(c,", ...").concat(c)]=r.referToSelf((e=>(r,t,n)=>{for(var i=e(r,t),a=0;ae.lcm(r)},u({SS:o,DS:a,Ss:s}),l)})),Co="log10",So=ur(Co,["typed","config","Complex"],(e=>{var{typed:r,config:t,Complex:n}=e;return r(Co,{number:function(e){return e>=0||t.predictable?Wn(e):new n(e,0).log().div(Math.LN10)},Complex:function(e){return new n(e).log().div(Math.LN10)},BigNumber:function(e){return!e.isNegative()||t.predictable?e.log():new n(e.toNumber(),0).log().div(Math.LN10)},"Array | Matrix":r.referToSelf((e=>r=>Fn(r,e)))})})),Mo="log2",Fo=ur(Mo,["typed","config","Complex"],(e=>{var{typed:r,config:t,Complex:n}=e;return r(Mo,{number:function(e){return e>=0||t.predictable?Yn(e):i(new n(e,0))},Complex:i,BigNumber:function(e){return!e.isNegative()||t.predictable?e.log(2):i(new n(e.toNumber(),0))},"Array | Matrix":r.referToSelf((e=>r=>Fn(r,e)))});function i(e){var r=Math.sqrt(e.re*e.re+e.im*e.im);return new n(Math.log2?Math.log2(r):Math.log(r)/Math.LN2,Math.atan2(e.im,e.re)/Math.LN2)}})),Bo=ur("matAlgo03xDSf",["typed"],(e=>{var{typed:r}=e;return function(e,t,n,i){var a=e._data,o=e._size,s=e._datatype,u=t._values,c=t._index,l=t._ptr,f=t._size,p=t._datatype;if(o.length!==f.length)throw new Re(o.length,f.length);if(o[0]!==f[0]||o[1]!==f[1])throw new RangeError("Dimension mismatch. Matrix A ("+o+") must match Matrix B ("+f+")");if(!u)throw new Error("Cannot perform operation on Dense Matrix and Pattern Sparse Matrix");var m,d=o[0],h=o[1],g=0,y=n;"string"==typeof s&&s===p&&(m=s,g=r.convert(0,m),y=r.find(n,[m,m]));for(var v=[],x=0;x{var{typed:r,equalScalar:t}=e;return function(e,n,i){var a=e._values,o=e._index,s=e._ptr,u=e._size,c=e._datatype,l=n._values,f=n._index,p=n._ptr,m=n._size,d=n._datatype;if(u.length!==m.length)throw new Re(u.length,m.length);if(u[0]!==m[0]||u[1]!==m[1])throw new RangeError("Dimension mismatch. Matrix A ("+u+") must match Matrix B ("+m+")");var h,g=u[0],y=u[1],v=t,x=0,b=i;"string"==typeof c&&c===d&&(h=c,v=r.find(t,[h,h]),x=r.convert(0,h),b=r.find(i,[h,h]));var w,N,D,E,A=a&&l?[]:void 0,C=[],S=[],M=A?[]:void 0,F=A?[]:void 0,B=[],T=[];for(N=0;N{var{typed:r,matrix:t,equalScalar:n,DenseMatrix:i,concat:a}=e,o=Do({typed:r,equalScalar:n}),s=Bo({typed:r}),u=To({typed:r,equalScalar:n}),c=$a({typed:r,equalScalar:n}),l=Za({typed:r,DenseMatrix:i});return r("mod",{"number, number":Jn,"BigNumber, BigNumber":function(e,r){if(r.isNeg())throw new Error("Cannot calculate mod for a negative divisor");return r.isZero()?e:e.mod(r)},"Fraction, Fraction":function(e,r){if(r.compare(0)<0)throw new Error("Cannot calculate mod for a negative divisor");return e.compare(0)>=0?e.mod(r):e.mod(r).add(r).mod(r)}},go({typed:r,matrix:t,concat:a})({SS:u,DS:s,SD:o,Ss:c,sS:l}))})),_o=ur("multiplyScalar",["typed"],(e=>{var{typed:r}=e;return r("multiplyScalar",{"number, number":Pn,"Complex, Complex":function(e,r){return e.mul(r)},"BigNumber, BigNumber":function(e,r){return e.times(r)},"Fraction, Fraction":function(e,r){return e.mul(r)},"number | Fraction | BigNumber | Complex, Unit":(e,r)=>r.multiply(e),"Unit, number | Fraction | BigNumber | Complex | Unit":(e,r)=>e.multiply(r)})})),zo="multiply",qo=ur(zo,["typed","matrix","addScalar","multiplyScalar","equalScalar","dot"],(e=>{var{typed:r,matrix:t,addScalar:n,multiplyScalar:i,equalScalar:a,dot:o}=e,s=$a({typed:r,equalScalar:a}),u=Ga({typed:r});function c(e,r){switch(e.length){case 1:switch(r.length){case 1:if(e[0]!==r[0])throw new RangeError("Dimension mismatch in multiplication. Vectors must have the same length");break;case 2:if(e[0]!==r[0])throw new RangeError("Dimension mismatch in multiplication. Vector length ("+e[0]+") must match Matrix rows ("+r[0]+")");break;default:throw new Error("Can only multiply a 1 or 2 dimensional matrix (Matrix B has "+r.length+" dimensions)")}break;case 2:switch(r.length){case 1:if(e[1]!==r[0])throw new RangeError("Dimension mismatch in multiplication. Matrix columns ("+e[1]+") must match Vector length ("+r[0]+")");break;case 2:if(e[1]!==r[0])throw new RangeError("Dimension mismatch in multiplication. Matrix A columns ("+e[1]+") must match Matrix B rows ("+r[0]+")");break;default:throw new Error("Can only multiply a 1 or 2 dimensional matrix (Matrix B has "+r.length+" dimensions)")}break;default:throw new Error("Can only multiply a 1 or 2 dimensional matrix (Matrix A has "+e.length+" dimensions)")}}function l(e,t){if("dense"!==t.storage())throw new Error("Support for SparseMatrix not implemented");return function(e,t){var a,o=e._data,s=e._size,u=e._datatype,c=t._data,l=t._size,f=t._datatype,p=s[0],m=l[1],d=n,h=i;u&&f&&u===f&&"string"==typeof u&&(a=u,d=r.find(n,[a,a]),h=r.find(i,[a,a]));for(var g=[],y=0;yC)for(var M=0,F=0;F(r,n)=>{c(Ue(r),Ue(n));var i=e(t(r),t(n));return p(i)?i.valueOf():i})),"Matrix, Matrix":function(e,r){var t=e.size(),n=r.size();return c(t,n),1===t.length?1===n.length?function(e,r,t){if(0===t)throw new Error("Cannot multiply two empty vectors");return o(e,r)}(e,r,t[0]):l(e,r):1===n.length?f(e,r):m(e,r)},"Matrix, Array":r.referTo("Matrix,Matrix",(e=>(r,n)=>e(r,t(n)))),"Array, Matrix":r.referToSelf((e=>(r,n)=>e(t(r,n.storage()),n))),"SparseMatrix, any":function(e,r){return s(e,r,i,!1)},"DenseMatrix, any":function(e,r){return u(e,r,i,!1)},"any, SparseMatrix":function(e,r){return s(r,e,i,!0)},"any, DenseMatrix":function(e,r){return u(r,e,i,!0)},"Array, any":function(e,r){return u(t(e),r,i,!1).valueOf()},"any, Array":function(e,r){return u(t(r),e,i,!0).valueOf()},"any, any":i,"any, any, ...any":r.referToSelf((e=>(r,t,n)=>{for(var i=e(r,t),a=0;a{var{typed:r,matrix:t,equalScalar:n,BigNumber:i,concat:a}=e,o=lo({typed:r}),s=Do({typed:r,equalScalar:n}),u=Eo({typed:r,equalScalar:n}),c=$a({typed:r,equalScalar:n}),l=go({typed:r,matrix:t,concat:a});function f(){throw new Error("Complex number not supported in function nthRoot. Use nthRoots instead.")}return r(Io,{number:Xn,"number, number":Xn,BigNumber:e=>p(e,new i(2)),"BigNumber, BigNumber":p,Complex:f,"Complex, number":f,Array:r.referTo("DenseMatrix,number",(e=>r=>e(t(r),2).valueOf())),DenseMatrix:r.referTo("DenseMatrix,number",(e=>r=>e(r,2))),SparseMatrix:r.referTo("SparseMatrix,number",(e=>r=>e(r,2))),"SparseMatrix, SparseMatrix":r.referToSelf((e=>(r,t)=>{if(1===t.density())return u(r,t,e);throw new Error("Root must be non-zero")})),"DenseMatrix, SparseMatrix":r.referToSelf((e=>(r,t)=>{if(1===t.density())return o(r,t,e,!1);throw new Error("Root must be non-zero")})),"Array, SparseMatrix":r.referTo("DenseMatrix,SparseMatrix",(e=>(r,n)=>e(t(r),n))),"number | BigNumber, SparseMatrix":r.referToSelf((e=>(r,t)=>{if(1===t.density())return c(t,r,e,!0);throw new Error("Root must be non-zero")}))},l({scalar:"number | BigNumber",SD:s,Ss:c,sS:!1}));function p(e,r){var t=i.precision,n=i.clone({precision:t+2}),a=new i(0),o=new n(1),s=r.isNegative();if(s&&(r=r.neg()),r.isZero())throw new Error("Root must be non-zero");if(e.isNegative()&&!r.abs().mod(2).equals(1))throw new Error("Root must be odd when a is negative.");if(e.isZero())return s?new n(1/0):0;if(!e.isFinite())return s?a:e;var u=e.abs().pow(o.div(r));return u=e.isNeg()?u.neg():u,new i((s?o.div(u):u).toPrecision(t))}})),Ro="sign",Po=ur(Ro,["typed","BigNumber","Fraction","complex"],(e=>{var{typed:r,BigNumber:t,complex:n,Fraction:i}=e;return r(Ro,{number:Qn,Complex:function(e){return 0===e.im?n(Qn(e.re)):e.sign()},BigNumber:function(e){return new t(e.cmp(0))},Fraction:function(e){return new i(e.s,1)},"Array | Matrix":r.referToSelf((e=>r=>Fn(r,e,!0))),Unit:r.referToSelf((e=>t=>{if(!t._isDerived()&&0!==t.units[0].unit.offset)throw new TypeError("sign is ambiguous for units with offset");return r.find(e,t.valueType())(t.value)}))})})),Uo=ur("sqrt",["config","typed","Complex"],(e=>{var{config:r,typed:t,Complex:n}=e;return t("sqrt",{number:i,Complex:function(e){return e.sqrt()},BigNumber:function(e){return!e.isNegative()||r.predictable?e.sqrt():i(e.toNumber())},Unit:function(e){return e.pow(.5)}});function i(e){return isNaN(e)?NaN:e>=0||r.predictable?Math.sqrt(e):new n(e,0).sqrt()}})),jo="square",Lo=ur(jo,["typed"],(e=>{var{typed:r}=e;return r(jo,{number:Kn,Complex:function(e){return e.mul(e)},BigNumber:function(e){return e.times(e)},Fraction:function(e){return e.mul(e)},Unit:function(e){return e.pow(2)}})})),Ho="subtract",$o=ur(Ho,["typed","matrix","equalScalar","addScalar","unaryMinus","DenseMatrix","concat"],(e=>{var{typed:r,matrix:t,equalScalar:n,addScalar:i,unaryMinus:a,DenseMatrix:o,concat:s}=e,u=lo({typed:r}),c=Bo({typed:r}),l=To({typed:r,equalScalar:n}),f=po({typed:r,DenseMatrix:o}),p=Za({typed:r,DenseMatrix:o}),m=go({typed:r,matrix:t,concat:s});return r(Ho,{"number, number":(e,r)=>e-r,"Complex, Complex":(e,r)=>e.sub(r),"BigNumber, BigNumber":(e,r)=>e.minus(r),"Fraction, Fraction":(e,r)=>e.sub(r),"Unit, Unit":r.referToSelf((e=>(t,n)=>{if(null===t.value)throw new Error("Parameter x contains a unit with undefined value");if(null===n.value)throw new Error("Parameter y contains a unit with undefined value");if(!t.equalBase(n))throw new Error("Units do not match");var i=t.clone();return i.value=r.find(e,[i.valueType(),n.valueType()])(i.value,n.value),i.fixPrefix=!1,i}))},m({SS:l,DS:u,SD:c,Ss:p,sS:f}))})),Zo="xgcd",Go=ur(Zo,["typed","config","matrix","BigNumber"],(e=>{var{typed:r,config:t,matrix:n,BigNumber:i}=e;return r(Zo,{"number, number":function(e,r){var i=ei(e,r);return"Array"===t.matrix?i:n(i)},"BigNumber, BigNumber":function(e,r){var a,o,s,u,c=new i(0),l=new i(1),f=c,p=l,m=l,d=c;if(!e.isInt()||!r.isInt())throw new Error("Parameters in function xgcd must be integer numbers");for(;!r.isZero();)o=e.div(r).floor(),s=e.mod(r),a=f,f=p.minus(o.times(f)),p=a,a=m,m=d.minus(o.times(m)),d=a,e=r,r=s;u=e.lt(c)?[e.neg(),p.neg(),d.neg()]:[e,e.isZero()?0:p,d];return"Array"===t.matrix?u:n(u)}})})),Vo="invmod",Wo=ur(Vo,["typed","config","BigNumber","xgcd","equal","smaller","mod","add","isInteger"],(e=>{var{typed:r,config:t,BigNumber:n,xgcd:i,equal:a,smaller:o,mod:s,add:u,isInteger:c}=e;return r(Vo,{"number, number":l,"BigNumber, BigNumber":l});function l(e,r){if(!c(e)||!c(r))throw new Error("Parameters in function invmod must be integer numbers");if(e=s(e,r),a(r,0))throw new Error("Divisor must be non zero");var t=i(e,r);t=t.valueOf();var[l,f]=t;return a(l,n(1))?(f=s(f,r),o(f,n(0))&&(f=u(f,r)),f):NaN}})),Yo=ur("matAlgo09xS0Sf",["typed","equalScalar"],(e=>{var{typed:r,equalScalar:t}=e;return function(e,n,i){var a=e._values,o=e._index,s=e._ptr,u=e._size,c=e._datatype,l=n._values,f=n._index,p=n._ptr,m=n._size,d=n._datatype;if(u.length!==m.length)throw new Re(u.length,m.length);if(u[0]!==m[0]||u[1]!==m[1])throw new RangeError("Dimension mismatch. Matrix A ("+u+") must match Matrix B ("+m+")");var h,g=u[0],y=u[1],v=t,x=0,b=i;"string"==typeof c&&c===d&&(h=c,v=r.find(t,[h,h]),x=r.convert(0,h),b=r.find(i,[h,h]));var w,N,D,E,A,C=a&&l?[]:void 0,S=[],M=[],F=C?[]:void 0,B=[];for(N=0;N{var{typed:r,matrix:t,equalScalar:n,multiplyScalar:i,concat:a}=e,o=Do({typed:r,equalScalar:n}),s=Yo({typed:r,equalScalar:n}),u=$a({typed:r,equalScalar:n}),c=go({typed:r,matrix:t,concat:a});return r(Jo,c({elop:i,SS:s,DS:o,Ss:u}))}));function Qo(e,r){if(e.isFinite()&&!e.isInteger()||r.isFinite()&&!r.isInteger())throw new Error("Integers expected in function bitAnd");var t=e.constructor;if(e.isNaN()||r.isNaN())return new t(NaN);if(e.isZero()||r.eq(-1)||e.eq(r))return e;if(r.isZero()||e.eq(-1))return r;if(!e.isFinite()||!r.isFinite()){if(!e.isFinite()&&!r.isFinite())return e.isNegative()===r.isNegative()?e:new t(0);if(!e.isFinite())return r.isNegative()?e:e.isNegative()?new t(0):r;if(!r.isFinite())return e.isNegative()?r:r.isNegative()?new t(0):e}return rs(e,r,(function(e,r){return e&r}))}function Ko(e){if(e.isFinite()&&!e.isInteger())throw new Error("Integer expected in function bitNot");var r=e.constructor,t=r.precision;r.config({precision:1e9});var n=e.plus(new r(1));return n.s=-n.s||null,r.config({precision:t}),n}function es(e,r){if(e.isFinite()&&!e.isInteger()||r.isFinite()&&!r.isInteger())throw new Error("Integers expected in function bitOr");var t=e.constructor;if(e.isNaN()||r.isNaN())return new t(NaN);var n=new t(-1);return e.isZero()||r.eq(n)||e.eq(r)?r:r.isZero()||e.eq(n)?e:e.isFinite()&&r.isFinite()?rs(e,r,(function(e,r){return e|r})):!e.isFinite()&&!e.isNegative()&&r.isNegative()||e.isNegative()&&!r.isNegative()&&!r.isFinite()?n:e.isNegative()&&r.isNegative()?e.isFinite()?e:r:e.isFinite()?r:e}function rs(e,r,t){var n,i,a,o,s,u=e.constructor,c=+(e.s<0),l=+(r.s<0);if(c){n=ts(Ko(e));for(var f=0;f0;)t(a[--m],o[--d])===h&&(g=g.plus(y)),y=y.times(v);for(;d>0;)t(s,o[--d])===h&&(g=g.plus(y)),y=y.times(v);return u.config({precision:x}),0===h&&(g.s=-g.s),g}function ts(e){for(var r=e.d,t=r[0]+"",n=1;n0)if(++s>c)for(s-=c;s--;)u+="0";else s1&&(null!==l[m+1]&&void 0!==l[m+1]||(l[m+1]=0),l[m+1]+=l[m]>>1,l[m]&=1)}return l.reverse()}function ns(e,r){if(e.isFinite()&&!e.isInteger()||r.isFinite()&&!r.isInteger())throw new Error("Integers expected in function bitXor");var t=e.constructor;if(e.isNaN()||r.isNaN())return new t(NaN);if(e.isZero())return r;if(r.isZero())return e;if(e.eq(r))return new t(0);var n=new t(-1);return e.eq(n)?Ko(r):r.eq(n)?Ko(e):e.isFinite()&&r.isFinite()?rs(e,r,(function(e,r){return e^r})):e.isFinite()||r.isFinite()?new t(e.isNegative()===r.isNegative()?1/0:-1/0):n}function is(e,r){if(e.isFinite()&&!e.isInteger()||r.isFinite()&&!r.isInteger())throw new Error("Integers expected in function leftShift");var t=e.constructor;return e.isNaN()||r.isNaN()||r.isNegative()&&!r.isZero()?new t(NaN):e.isZero()||r.isZero()?e:e.isFinite()||r.isFinite()?r.lt(55)?e.times(Math.pow(2,r.toNumber())+""):e.times(new t(2).pow(r)):new t(NaN)}function as(e,r){if(e.isFinite()&&!e.isInteger()||r.isFinite()&&!r.isInteger())throw new Error("Integers expected in function rightArithShift");var t=e.constructor;return e.isNaN()||r.isNaN()||r.isNegative()&&!r.isZero()?new t(NaN):e.isZero()||r.isZero()?e:r.isFinite()?r.lt(55)?e.div(Math.pow(2,r.toNumber())+"").floor():e.div(new t(2).pow(r)).floor():e.isNegative()?new t(-1):e.isFinite()?new t(0):new t(NaN)}var os="bitAnd",ss=ur(os,["typed","matrix","equalScalar","concat"],(e=>{var{typed:r,matrix:t,equalScalar:n,concat:i}=e,a=Do({typed:r,equalScalar:n}),o=Eo({typed:r,equalScalar:n}),s=$a({typed:r,equalScalar:n}),u=go({typed:r,matrix:t,concat:i});return r(os,{"number, number":ii,"BigNumber, BigNumber":Qo},u({SS:o,DS:a,Ss:s}))})),us="bitNot",cs=ur(us,["typed"],(e=>{var{typed:r}=e;return r(us,{number:ai,BigNumber:Ko,"Array | Matrix":r.referToSelf((e=>r=>Fn(r,e)))})})),ls="bitOr",fs=ur(ls,["typed","matrix","equalScalar","DenseMatrix","concat"],(e=>{var{typed:r,matrix:t,equalScalar:n,DenseMatrix:i,concat:a}=e,o=lo({typed:r}),s=fo({typed:r,equalScalar:n}),u=po({typed:r,DenseMatrix:i}),c=go({typed:r,matrix:t,concat:a});return r(ls,{"number, number":oi,"BigNumber, BigNumber":es},c({SS:s,DS:o,Ss:u}))})),ps=ur("matAlgo07xSSf",["typed","DenseMatrix"],(e=>{var{typed:r,DenseMatrix:t}=e;return function(e,i,a){var o=e._size,s=e._datatype,u=i._size,c=i._datatype;if(o.length!==u.length)throw new Re(o.length,u.length);if(o[0]!==u[0]||o[1]!==u[1])throw new RangeError("Dimension mismatch. Matrix A ("+o+") must match Matrix B ("+u+")");var l,f,p,m=o[0],d=o[1],h=0,g=a;"string"==typeof s&&s===c&&(l=s,h=r.convert(0,l),g=r.find(a,[l,l]));var y=[];for(f=0;f{var{typed:r,matrix:t,DenseMatrix:n,concat:i}=e,a=Bo({typed:r}),o=ps({typed:r,DenseMatrix:n}),s=Za({typed:r,DenseMatrix:n}),u=go({typed:r,matrix:t,concat:i});return r(ms,{"number, number":si,"BigNumber, BigNumber":ns},u({SS:o,DS:a,Ss:s}))})),hs=ur("arg",["typed"],(e=>{var{typed:r}=e;return r("arg",{number:function(e){return Math.atan2(0,e)},BigNumber:function(e){return e.constructor.atan2(0,e)},Complex:function(e){return e.arg()},"Array | Matrix":r.referToSelf((e=>r=>Fn(r,e)))})})),gs="conj",ys=ur(gs,["typed"],(e=>{var{typed:r}=e;return r(gs,{"number | BigNumber | Fraction":e=>e,Complex:e=>e.conjugate(),"Array | Matrix":r.referToSelf((e=>r=>Fn(r,e)))})})),vs=ur("im",["typed"],(e=>{var{typed:r}=e;return r("im",{number:()=>0,"BigNumber | Fraction":e=>e.mul(0),Complex:e=>e.im,"Array | Matrix":r.referToSelf((e=>r=>Fn(r,e)))})})),xs=ur("re",["typed"],(e=>{var{typed:r}=e;return r("re",{"number | BigNumber | Fraction":e=>e,Complex:e=>e.re,"Array | Matrix":r.referToSelf((e=>r=>Fn(r,e)))})})),bs=ur("not",["typed"],(e=>{var{typed:r}=e;return r("not",{"null | undefined":()=>!0,number:yi,Complex:function(e){return 0===e.re&&0===e.im},BigNumber:function(e){return e.isZero()||e.isNaN()},Unit:r.referToSelf((e=>t=>r.find(e,t.valueType())(t.value))),"Array | Matrix":r.referToSelf((e=>r=>Fn(r,e)))})})),ws=ur("or",["typed","matrix","equalScalar","DenseMatrix","concat"],(e=>{var{typed:r,matrix:t,equalScalar:n,DenseMatrix:i,concat:a}=e,o=Bo({typed:r}),s=To({typed:r,equalScalar:n}),u=Za({typed:r,DenseMatrix:i}),c=go({typed:r,matrix:t,concat:a});return r("or",{"number, number":vi,"Complex, Complex":function(e,r){return 0!==e.re||0!==e.im||0!==r.re||0!==r.im},"BigNumber, BigNumber":function(e,r){return!e.isZero()&&!e.isNaN()||!r.isZero()&&!r.isNaN()},"Unit, Unit":r.referToSelf((e=>(r,t)=>e(r.value||0,t.value||0)))},c({SS:s,DS:o,Ss:u}))})),Ns=ur("xor",["typed","matrix","DenseMatrix","concat"],(e=>{var{typed:r,matrix:t,DenseMatrix:n,concat:i}=e,a=Bo({typed:r}),o=ps({typed:r,DenseMatrix:n}),s=Za({typed:r,DenseMatrix:n}),u=go({typed:r,matrix:t,concat:i});return r("xor",{"number, number":xi,"Complex, Complex":function(e,r){return(0!==e.re||0!==e.im)!=(0!==r.re||0!==r.im)},"BigNumber, BigNumber":function(e,r){return(!e.isZero()&&!e.isNaN())!=(!r.isZero()&&!r.isNaN())},"Unit, Unit":r.referToSelf((e=>(r,t)=>e(r.value||0,t.value||0)))},u({SS:o,DS:a,Ss:s}))})),Ds="concat",Es=ur(Ds,["typed","matrix","isInteger"],(e=>{var{typed:r,matrix:t,isInteger:n}=e;return r(Ds,{"...Array | Matrix | number | BigNumber":function(e){var r,i,s=e.length,u=-1,c=!1,l=[];for(r=0;r0&&u>i)throw new Pe(u,i+1)}else{var m=G(f).valueOf(),d=Ue(m);if(l[r]=m,i=u,u=d.length-1,r>0&&u!==i)throw new Re(i+1,u+1)}}if(0===l.length)throw new SyntaxError("At least one matrix expected");for(var h=l.shift();l.length;)h=As(h,l.shift(),u,0);return c?t(h):h},"...string":function(e){return e.join("")}})}));function As(e,r,t,n){if(n{var{typed:r,Index:t,matrix:n,range:i}=e;return r(Cs,{"Matrix, number":a,"Array, number":function(e,r){return a(n(G(e)),r).valueOf()}});function a(e,r){if(2!==e.size().length)throw new Error("Only two dimensional matrix is supported");He(r,e.size()[1]);var a=i(0,e.size()[0]),o=new t(a,r),s=e.subset(o);return p(s)?s:n([[s]])}})),Ms="count",Fs=ur(Ms,["typed","size","prod"],(e=>{var{typed:r,size:t,prod:n}=e;return r(Ms,{string:function(e){return e.length},"Matrix | Array":function(e){return n(t(e))}})})),Bs="cross",Ts=ur(Bs,["typed","matrix","subtract","multiply"],(e=>{var{typed:r,matrix:t,subtract:n,multiply:i}=e;return r(Bs,{"Matrix, Matrix":function(e,r){return t(a(e.toArray(),r.toArray()))},"Matrix, Array":function(e,r){return t(a(e.toArray(),r))},"Array, Matrix":function(e,r){return t(a(e,r.toArray()))},"Array, Array":a});function a(e,r){var t=Math.max(Ue(e).length,Ue(r).length);e=Ye(e),r=Ye(r);var a=Ue(e),o=Ue(r);if(1!==a.length||1!==o.length||3!==a[0]||3!==o[0])throw new RangeError("Vectors with length 3 expected (Size A = ["+a.join(", ")+"], B = ["+o.join(", ")+"])");var s=[n(i(e[1],r[2]),i(e[2],r[1])),n(i(e[2],r[0]),i(e[0],r[2])),n(i(e[0],r[1]),i(e[1],r[0]))];return t>1?[s]:s}})),Os="diag",_s=ur(Os,["typed","matrix","DenseMatrix","SparseMatrix"],(e=>{var{typed:r,matrix:t,DenseMatrix:n,SparseMatrix:i}=e;return r(Os,{Array:function(e){return a(e,0,Ue(e),null)},"Array, number":function(e,r){return a(e,r,Ue(e),null)},"Array, BigNumber":function(e,r){return a(e,r.toNumber(),Ue(e),null)},"Array, string":function(e,r){return a(e,0,Ue(e),r)},"Array, number, string":function(e,r,t){return a(e,r,Ue(e),t)},"Array, BigNumber, string":function(e,r,t){return a(e,r.toNumber(),Ue(e),t)},Matrix:function(e){return a(e,0,e.size(),e.storage())},"Matrix, number":function(e,r){return a(e,r,e.size(),e.storage())},"Matrix, BigNumber":function(e,r){return a(e,r.toNumber(),e.size(),e.storage())},"Matrix, string":function(e,r){return a(e,0,e.size(),r)},"Matrix, number, string":function(e,r,t){return a(e,r,e.size(),t)},"Matrix, BigNumber, string":function(e,r,t){return a(e,r.toNumber(),e.size(),t)}});function a(e,r,a,o){if(!se(r))throw new TypeError("Second parameter in function diag must be an integer");var s=r>0?r:0,u=r<0?-r:0;switch(a.length){case 1:return function(e,r,t,a,o,s){var u=[a+o,a+s];if(t&&"sparse"!==t&&"dense"!==t)throw new TypeError("Unknown matrix type ".concat(t,'"'));var c="sparse"===t?i.diagonal(u,e,r):n.diagonal(u,e,r);return null!==t?c:c.valueOf()}(e,r,o,a[0],u,s);case 2:return function(e,r,n,i,a,o){if(p(e)){var s=e.diagonal(r);return null!==n?n!==s.storage()?t(s,n):s:s.valueOf()}for(var u=Math.min(i[0]-a,i[1]-o),c=[],l=0;l=2&&u.push("index: ".concat(Z(t))),o.length>=3&&u.push("array: ".concat(Z(n))),new TypeError("Function ".concat(i," cannot apply callback arguments ")+"".concat(e.name,"(").concat(u.join(", "),") at index ").concat(JSON.stringify(t)))}throw new TypeError("Function ".concat(i," cannot apply callback arguments ")+"to function ".concat(e.name,": ").concat(a.message))}}}var qs=ur("filter",["typed"],(e=>{var{typed:r}=e;return r("filter",{"Array, function":Is,"Matrix, function":function(e,r){return e.create(Is(e.toArray(),r))},"Array, RegExp":nr,"Matrix, RegExp":function(e,r){return e.create(nr(e.toArray(),r))}})}));function Is(e,r){return tr(e,(function(e,t,n){return zs(r,e,[t],n,"filter")}))}var ks="flatten",Rs=ur(ks,["typed","matrix"],(e=>{var{typed:r,matrix:t}=e;return r(ks,{Array:function(e){return Ke(e)},Matrix:function(e){var r=Ke(e.toArray());return t(r)}})})),Ps="forEach",Us=ur(Ps,["typed"],(e=>{var{typed:r}=e;return r(Ps,{"Array, function":js,"Matrix, function":function(e,r){e.forEach(r)}})}));function js(e,r){!function t(n,i){if(!Array.isArray(n))return zs(r,n,i,e,"forEach");rr(n,(function(e,r){t(e,i.concat(r))}))}(e,[])}var Ls="getMatrixDataType",Hs=ur(Ls,["typed"],(e=>{var{typed:r}=e;return r(Ls,{Array:function(e){return sr(e,Z)},Matrix:function(e){return e.getDataType()}})})),$s="identity",Zs=ur($s,["typed","config","matrix","BigNumber","DenseMatrix","SparseMatrix"],(e=>{var{typed:r,config:t,matrix:n,BigNumber:i,DenseMatrix:a,SparseMatrix:s}=e;return r($s,{"":function(){return"Matrix"===t.matrix?n([]):[]},string:function(e){return n(e)},"number | BigNumber":function(e){return c(e,e,"Matrix"===t.matrix?"dense":void 0)},"number | BigNumber, string":function(e,r){return c(e,e,r)},"number | BigNumber, number | BigNumber":function(e,r){return c(e,r,"Matrix"===t.matrix?"dense":void 0)},"number | BigNumber, number | BigNumber, string":function(e,r,t){return c(e,r,t)},Array:function(e){return u(e)},"Array, string":function(e,r){return u(e,r)},Matrix:function(e){return u(e.valueOf(),e.storage())},"Matrix, string":function(e,r){return u(e.valueOf(),r)}});function u(e,r){switch(e.length){case 0:return r?n(r):[];case 1:return c(e[0],e[0],r);case 2:return c(e[0],e[1],r);default:throw new Error("Vector containing two values expected")}}function c(e,r,t){var n=o(e)||o(r)?i:null;if(o(e)&&(e=e.toNumber()),o(r)&&(r=r.toNumber()),!se(e)||e<1)throw new Error("Parameters in function identity must be positive integers");if(!se(r)||r<1)throw new Error("Parameters in function identity must be positive integers");var u=n?new i(1):1,c=n?new n(0):0,l=[e,r];if(t){if("sparse"===t)return s.diagonal(l,u,0,c);if("dense"===t)return a.diagonal(l,u,0,c);throw new TypeError('Unknown matrix type "'.concat(t,'"'))}for(var f=$e([],l,c),p=e{var{typed:r,matrix:t,multiplyScalar:n}=e;return r(Gs,{"Matrix, Matrix":function(e,r){return t(i(e.toArray(),r.toArray()))},"Matrix, Array":function(e,r){return t(i(e.toArray(),r))},"Array, Matrix":function(e,r){return t(i(e,r.toArray()))},"Array, Array":i});function i(e,r){if(1===Ue(e).length&&(e=[e]),1===Ue(r).length&&(r=[r]),Ue(e).length>2||Ue(r).length>2)throw new RangeError("Vectors with dimensions greater then 2 are not supported expected (Size x = "+JSON.stringify(e.length)+", y = "+JSON.stringify(r.length)+")");var t=[],i=[];return e.map((function(e){return r.map((function(r){return i=[],t.push(i),e.map((function(e){return r.map((function(r){return i.push(n(e,r))}))}))}))}))&&t}})),Ws=ur("map",["typed"],(e=>{var{typed:r}=e;return r("map",{"Array, function":Ys,"Matrix, function":function(e,r){return e.map(r)}})}));function Ys(e,r){return function t(n,i){return Array.isArray(n)?n.map((function(e,r){return t(e,i.concat(r))})):zs(r,n,i,e,"map")}(e,[])}var Js="diff",Xs=ur(Js,["typed","matrix","subtract","number"],(e=>{var{typed:r,matrix:t,subtract:n,number:i}=e;return r(Js,{"Array | Matrix":function(e){return p(e)?t(o(e.toArray())):o(e)},"Array | Matrix, number":function(e,r){if(!se(r))throw new RangeError("Dimension must be a whole number");return p(e)?t(a(e.toArray(),r)):a(e,r)},"Array, BigNumber":r.referTo("Array,number",(e=>(r,t)=>e(r,i(t)))),"Matrix, BigNumber":r.referTo("Matrix,number",(e=>(r,t)=>e(r,i(t))))});function a(e,r){if(p(e)&&(e=e.toArray()),!Array.isArray(e))throw RangeError("Array/Matrix does not have that many dimensions");if(r>0){var t=[];return e.forEach((e=>{t.push(a(e,r-1))})),t}if(0===r)return o(e);throw RangeError("Cannot have negative dimension")}function o(e){for(var r=[],t=e.length,n=1;n{var{typed:r,config:t,matrix:n,BigNumber:i}=e;return r("ones",{"":function(){return"Array"===t.matrix?a([]):a([],"default")},"...number | BigNumber | string":function(e){if("string"==typeof e[e.length-1]){var r=e.pop();return a(e,r)}return"Array"===t.matrix?a(e):a(e,"default")},Array:a,Matrix:function(e){var r=e.storage();return a(e.valueOf(),r)},"Array | Matrix, string":function(e,r){return a(e.valueOf(),r)}});function a(e,r){var t=function(e){var r=!1;return e.forEach((function(e,t,n){o(e)&&(r=!0,n[t]=e.toNumber())})),r}(e),a=t?new i(1):1;if(function(e){e.forEach((function(e){if("number"!=typeof e||!se(e)||e<0)throw new Error("Parameters in function ones must be positive integers")}))}(e),r){var s=n(r);return e.length>0?s.resize(e,a):s}var u=[];return e.length>0?$e(u,e,a):u}}));function Ks(){throw new Error('No "bignumber" implementation available')}function eu(){throw new Error('No "fraction" implementation available')}function ru(){throw new Error('No "matrix" implementation available')}var tu="range",nu=ur(tu,["typed","config","?matrix","?bignumber","smaller","smallerEq","larger","largerEq","add","isPositive"],(e=>{var{typed:r,config:t,matrix:n,bignumber:i,smaller:a,smallerEq:o,larger:s,largerEq:u,add:c,isPositive:l}=e;return r(tu,{string:p,"string, boolean":p,"number, number":function(e,r){return f(m(e,r,1,!1))},"number, number, number":function(e,r,t){return f(m(e,r,t,!1))},"number, number, boolean":function(e,r,t){return f(m(e,r,1,t))},"number, number, number, boolean":function(e,r,t,n){return f(m(e,r,t,n))},"BigNumber, BigNumber":function(e,r){return f(m(e,r,new(0,e.constructor)(1),!1))},"BigNumber, BigNumber, BigNumber":function(e,r,t){return f(m(e,r,t,!1))},"BigNumber, BigNumber, boolean":function(e,r,t){return f(m(e,r,new(0,e.constructor)(1),t))},"BigNumber, BigNumber, BigNumber, boolean":function(e,r,t,n){return f(m(e,r,t,n))},"Unit, Unit, Unit":function(e,r,t){return f(m(e,r,t,!1))},"Unit, Unit, Unit, boolean":function(e,r,t,n){return f(m(e,r,t,n))}});function f(e){return"Matrix"===t.matrix?n?n(e):ru():e}function p(e,r){var n=function(e){var r=e.split(":"),t=r.map((function(e){return Number(e)}));if(t.some((function(e){return isNaN(e)})))return null;switch(t.length){case 2:return{start:t[0],end:t[1],step:1};case 3:return{start:t[0],end:t[2],step:t[1]};default:return null}}(e);if(!n)throw new SyntaxError('String "'+e+'" is no valid range');return"BigNumber"===t.number?(void 0===i&&Ks(),f(m(i(n.start),i(n.end),i(n.step)))):f(m(n.start,n.end,n.step,r))}function m(e,r,t,n){for(var i=[],f=l(t)?n?o:a:n?u:s,p=e;f(p,r);)i.push(p),p=c(p,t);return i}})),iu="reshape",au=ur(iu,["typed","isInteger","matrix"],(e=>{var{typed:r,isInteger:t}=e;return r(iu,{"Matrix, Array":function(e,r){return e.reshape(r,!0)},"Array, Array":function(e,r){return r.forEach((function(e){if(!t(e))throw new TypeError("Invalid size for dimension: "+e)})),Ge(e,r)}})})),ou=ur("resize",["config","matrix"],(e=>{var{config:r,matrix:t}=e;return function(e,n,i){if(2!==arguments.length&&3!==arguments.length)throw new yo("resize",arguments.length,2,3);if(p(n)&&(n=n.valueOf()),o(n[0])&&(n=n.map((function(e){return o(e)?e.toNumber():e}))),p(e))return e.resize(n,i,!0);if("string"==typeof e)return function(e,r,t){if(void 0!==t){if("string"!=typeof t||1!==t.length)throw new TypeError("Single character expected as defaultValue")}else t=" ";if(1!==r.length)throw new Re(r.length,1);var n=r[0];if("number"!=typeof n||!se(n))throw new TypeError("Invalid size, must contain positive integers (size: "+_e(r)+")");if(e.length>n)return e.substring(0,n);if(e.length{var{typed:r,multiply:t,rotationMatrix:n}=e;return r(su,{"Array , number | BigNumber | Complex | Unit":function(e,r){return i(e,2),t(n(r),e).toArray()},"Matrix , number | BigNumber | Complex | Unit":function(e,r){return i(e,2),t(n(r),e)},"Array, number | BigNumber | Complex | Unit, Array | Matrix":function(e,r,a){return i(e,3),t(n(r,a),e)},"Matrix, number | BigNumber | Complex | Unit, Array | Matrix":function(e,r,a){return i(e,3),t(n(r,a),e)}});function i(e,r){var t=Array.isArray(e)?Ue(e):e.size();if(t.length>2)throw new RangeError("Vector must be of dimensions 1x".concat(r));if(2===t.length&&1!==t[1])throw new RangeError("Vector must be of dimensions 1x".concat(r));if(t[0]!==r)throw new RangeError("Vector must be of dimensions 1x".concat(r))}})),cu="rotationMatrix",lu=ur(cu,["typed","config","multiplyScalar","addScalar","unaryMinus","norm","matrix","BigNumber","DenseMatrix","SparseMatrix","cos","sin"],(e=>{var{typed:r,config:t,multiplyScalar:n,addScalar:i,unaryMinus:a,norm:s,BigNumber:u,matrix:c,DenseMatrix:l,SparseMatrix:f,cos:p,sin:m}=e;return r(cu,{"":function(){return"Matrix"===t.matrix?c([]):[]},string:function(e){return c(e)},"number | BigNumber | Complex | Unit":function(e){return d(e,"Matrix"===t.matrix?"dense":void 0)},"number | BigNumber | Complex | Unit, string":function(e,r){return d(e,r)},"number | BigNumber | Complex | Unit, Array":function(e,r){var t=c(r);return h(t),v(e,t,void 0)},"number | BigNumber | Complex | Unit, Matrix":function(e,r){h(r);var n=r.storage()||("Matrix"===t.matrix?"dense":void 0);return v(e,r,n)},"number | BigNumber | Complex | Unit, Array, string":function(e,r,t){var n=c(r);return h(n),v(e,n,t)},"number | BigNumber | Complex | Unit, Matrix, string":function(e,r,t){return h(r),v(e,r,t)}});function d(e,r){var t=o(e)?new u(-1):-1,i=p(e),a=m(e);return y([[i,n(t,a)],[a,i]],r)}function h(e){var r=e.size();if(r.length<1||3!==r[0])throw new RangeError("Vector must be of dimensions 1x3")}function g(e){return e.reduce(((e,r)=>n(e,r)))}function y(e,r){if(r){if("sparse"===r)return new f(e);if("dense"===r)return new l(e);throw new TypeError('Unknown matrix type "'.concat(r,'"'))}return e}function v(e,r,t){var n=s(r);if(0===n)throw new RangeError("Rotation around zero vector");var c=o(e)?u:null,l=c?new c(1):1,f=c?new c(-1):-1,d=c?new c(r.get([0])/n):r.get([0])/n,h=c?new c(r.get([1])/n):r.get([1])/n,v=c?new c(r.get([2])/n):r.get([2])/n,x=p(e),b=i(l,a(x)),w=m(e);return y([[i(x,g([d,d,b])),i(g([d,h,b]),g([f,v,w])),i(g([d,v,b]),g([h,w]))],[i(g([d,h,b]),g([v,w])),i(x,g([h,h,b])),i(g([h,v,b]),g([f,d,w]))],[i(g([d,v,b]),g([f,h,w])),i(g([h,v,b]),g([d,w])),i(x,g([v,v,b]))]],t)}})),fu=ur("row",["typed","Index","matrix","range"],(e=>{var{typed:r,Index:t,matrix:n,range:i}=e;return r("row",{"Matrix, number":a,"Array, number":function(e,r){return a(n(G(e)),r).valueOf()}});function a(e,r){if(2!==e.size().length)throw new Error("Only two dimensional matrix is supported");He(r,e.size()[0]);var a=i(0,e.size()[1]),o=new t(r,a),s=e.subset(o);return p(s)?s:n([[s]])}})),pu="size",mu=ur(pu,["typed","config","?matrix"],(e=>{var{typed:r,config:t,matrix:n}=e;return r(pu,{Matrix:function(e){return e.create(e.size())},Array:Ue,string:function(e){return"Array"===t.matrix?[e.length]:n([e.length])},"number | Complex | BigNumber | Unit | boolean | null":function(e){return"Array"===t.matrix?[]:n?n([]):ru()}})})),du="squeeze",hu=ur(du,["typed","matrix"],(e=>{var{typed:r,matrix:t}=e;return r(du,{Array:function(e){return Ye(G(e))},Matrix:function(e){var r=Ye(e.toArray());return Array.isArray(r)?t(r):r},any:function(e){return G(e)}})})),gu="subset",yu=ur(gu,["typed","matrix"],(e=>{var{typed:r,matrix:t}=e;return r(gu,{"Array, Index":function(e,r){var n=t(e).subset(r);return r.isScalar()?n:n.valueOf()},"Matrix, Index":function(e,r){return e.subset(r)},"Object, Index":bu,"string, Index":vu,"Array, Index, any":function(e,r,n){return t(G(e)).subset(r,n,void 0).valueOf()},"Array, Index, any, any":function(e,r,n,i){return t(G(e)).subset(r,n,i).valueOf()},"Matrix, Index, any":function(e,r,t){return e.clone().subset(r,t)},"Matrix, Index, any, any":function(e,r,t,n){return e.clone().subset(r,t,n)},"string, Index, string":xu,"string, Index, string, string":xu,"Object, Index, any":wu})}));function vu(e,r){if(!y(r))throw new TypeError("Index expected");if(1!==r.size().length)throw new Re(r.size().length,1);var t=e.length;He(r.min()[0],t),He(r.max()[0],t);var n=r.dimension(0),i="";return n.forEach((function(r){i+=e.charAt(r)})),i}function xu(e,r,t,n){if(!r||!0!==r.isIndex)throw new TypeError("Index expected");if(1!==r.size().length)throw new Re(r.size().length,1);if(void 0!==n){if("string"!=typeof n||1!==n.length)throw new TypeError("Single character expected as defaultValue")}else n=" ";var i=r.dimension(0);if(i.size()[0]!==t.length)throw new Re(i.size()[0],t.length);var a=e.length;He(r.min()[0]),He(r.max()[0]);for(var o=[],s=0;sa)for(var u=a-1,c=o.length;u{var{typed:r,matrix:t}=e;return r(Nu,{Array:e=>n(t(e)).valueOf(),Matrix:n,any:G});function n(e){var r,t=e.size();switch(t.length){case 1:r=e.clone();break;case 2:var n=t[0],i=t[1];if(0===i)throw new RangeError("Cannot transpose a 2D matrix with no columns (size: "+_e(t)+")");switch(e.storage()){case"dense":r=function(e,r,t){for(var n,i=e._data,a=[],o=0;o{var{typed:r,transpose:t,conj:n}=e;return r(Eu,{any:function(e){return n(t(e))}})})),Cu="zeros",Su=ur(Cu,["typed","config","matrix","BigNumber"],(e=>{var{typed:r,config:t,matrix:n,BigNumber:i}=e;return r(Cu,{"":function(){return"Array"===t.matrix?a([]):a([],"default")},"...number | BigNumber | string":function(e){if("string"==typeof e[e.length-1]){var r=e.pop();return a(e,r)}return"Array"===t.matrix?a(e):a(e,"default")},Array:a,Matrix:function(e){var r=e.storage();return a(e.valueOf(),r)},"Array | Matrix, string":function(e,r){return a(e.valueOf(),r)}});function a(e,r){var t=function(e){var r=!1;return e.forEach((function(e,t,n){o(e)&&(r=!0,n[t]=e.toNumber())})),r}(e),a=t?new i(0):0;if(function(e){e.forEach((function(e){if("number"!=typeof e||!se(e)||e<0)throw new Error("Parameters in function zeros must be positive integers")}))}(e),r){var s=n(r);return e.length>0?s.resize(e,a):s}var u=[];return e.length>0?$e(u,e,a):u}})),Mu=ur("fft",["typed","matrix","addScalar","multiplyScalar","divideScalar","exp","tau","i","dotDivide","conj","pow","ceil","log2"],(e=>{var{typed:r,matrix:t,addScalar:n,multiplyScalar:i,divideScalar:a,exp:o,tau:s,i:u,dotDivide:c,conj:l,pow:f,ceil:p,log2:m}=e;return r("fft",{Array:d,Matrix:function(e){return e.create(d(e.toArray()))}});function d(e){var r=Ue(e);return 1===r.length?g(e,r[0]):h(e.map((e=>d(e,r.slice(1)))),0)}function h(e,r){var t=Ue(e);if(0!==r)return new Array(t[0]).fill(0).map(((t,n)=>h(e[n],r-1)));if(1===t.length)return g(e);function n(e){var r=Ue(e);return new Array(r[1]).fill(0).map(((t,n)=>new Array(r[0]).fill(0).map(((r,t)=>e[t][n]))))}return n(h(n(e),1))}function g(e){var r=e.length;if(1===r)return[e[0]];if(r%2==0){for(var t=[...g(e.filter(((e,r)=>r%2==0))),...g(e.filter(((e,r)=>r%2==1)))],h=0;hi(e[a],n[r-1+a]))),...new Array(y-r).fill(0)],x=[...new Array(r+r-1).fill(0).map(((e,r)=>a(1,n[r]))),...new Array(y-(r+r-1)).fill(0)],b=g(v),w=g(x),N=new Array(y).fill(0).map(((e,r)=>i(b[r],w[r]))),D=c(l(d(l(N))),y),E=[],A=r-1;A{var{typed:r,fft:t,dotDivide:n,conj:i}=e;return r(Fu,{"Array | Matrix":function(e){var r=p(e)?e.size():Ue(e);return n(i(t(i(e))),r.reduce(((e,r)=>e*r),1))}})})),Tu=t(87765);function Ou(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,n)}return t}var _u=ur("solveODE",["typed","add","subtract","multiply","divide","max","map","abs","isPositive","isNegative","larger","smaller","matrix","bignumber","unaryMinus"],(e=>{var{typed:r,add:t,subtract:n,multiply:i,divide:s,max:u,map:l,abs:f,isPositive:p,isNegative:m,larger:d,smaller:h,matrix:g,bignumber:y,unaryMinus:v}=e;function x(e){return function(r,a,g,x){if(!(2===a.length&&(a.every(D)||a.every(c))))throw new Error('"tspan" must be an Array of two numeric values or two units [tStart, tEnd]');var b=a[0],w=a[1],N=d(w,b),E=x.firstStep;if(void 0!==E&&!p(E))throw new Error('"firstStep" must be positive');var A=x.maxStep;if(void 0!==A&&!p(A))throw new Error('"maxStep" must be positive');var C=x.minStep;if(C&&m(C))throw new Error('"minStep" must be positive or zero');var S=[b,w,E,C,A].filter((e=>void 0!==e));if(!S.every(D)&&!S.every(c))throw new Error('Inconsistent type of "t" dependant variables');for(var M=x.tol?x.tol:1e-4,F=x.minDelta?x.minDelta:.2,B=x.maxDelta?x.maxDelta:5,T=x.maxIter?x.maxIter:1e4,O=[b,w,...g,A,C].some(o),[_,z,q,I]=O?[y(e.a),y(e.c),y(e.b),y(e.bp)]:[e.a,e.c,e.b,e.bp],k=E?N?E:v(E):s(n(w,b),1),R=[b],P=[g],U=n(q,I),j=0,L=0,H=function(e){return e?h:d}(N),$=function(e){var r=e?d:h;return function(e,i,a){var o=t(e,a);return r(o,i)?n(i,e):a}}(N);H(R[j],w);){var Z=[];k=$(R[j],w,k),Z.push(r(R[j],P[j]));for(var G=1;Gc(e)?e.value:e))));V1/4&&(R.push(t(R[j],k)),P.push(t(P[j],i(k,q,Z))),j++);var W=.84*(M/V)**.2;if(h(W,F)?W=F:d(W,B)&&(W=B),W=O?y(W):W,k=i(k,W),A&&d(f(k),A)?k=N?A:v(A):C&&h(f(k),C)&&(k=N?C:v(C)),++L>T)throw new Error("Maximum number of iterations reached, try changing options")}return{t:R,y:P}}}function b(e,r,t,n){return x({a:[[],[.5],[0,3/4],[2/9,1/3,4/9]],c:[null,.5,3/4,1],b:[2/9,1/3,4/9,0],bp:[7/24,1/4,1/3,1/8]})(e,r,t,n)}function w(e,r,t,n){return x({a:[[],[.2],[3/40,9/40],[44/45,-56/15,32/9],[19372/6561,-25360/2187,64448/6561,-212/729],[9017/3168,-355/33,46732/5247,49/176,-5103/18656],[35/384,0,500/1113,125/192,-2187/6784,11/84]],c:[null,.2,.3,.8,8/9,1,1],b:[35/384,0,500/1113,125/192,-2187/6784,11/84,0],bp:[5179/57600,0,7571/16695,393/640,-92097/339200,187/2100,1/40]})(e,r,t,n)}function N(e,r,t,n){var i=n.method?n.method:"RK45",a={RK23:b,RK45:w};if(i.toUpperCase()in a){var o=function(e){for(var r=1;r'"'.concat(e,'"'))),u="".concat(s.slice(0,-1).join(", ")," and ").concat(s.slice(-1));throw new Error('Unavailable method "'.concat(i,'". Available methods are ').concat(u))}function D(e){return o(e)||a(e)}function E(e,r,t,n){var i=N(e,r.toArray(),t.toArray(),n);return{t:g(i.t),y:g(i.y)}}return r("solveODE",{"function, Array, Array, Object":N,"function, Matrix, Matrix, Object":E,"function, Array, Array":(e,r,t)=>N(e,r,t,{}),"function, Matrix, Matrix":(e,r,t)=>E(e,r,t,{}),"function, Array, number | BigNumber | Unit":(e,r,t)=>{var n=N(e,r,[t],{});return{t:n.t,y:n.y.map((e=>e[0]))}},"function, Matrix, number | BigNumber | Unit":(e,r,t)=>{var n=N(e,r.toArray(),[t],{});return{t:g(n.t),y:g(n.y.map((e=>e[0])))}},"function, Array, number | BigNumber | Unit, Object":(e,r,t,n)=>{var i=N(e,r,[t],n);return{t:i.t,y:i.y.map((e=>e[0]))}},"function, Matrix, number | BigNumber | Unit, Object":(e,r,t,n)=>{var i=N(e,r.toArray(),[t],n);return{t:g(i.t),y:g(i.y.map((e=>e[0])))}}})})),zu=ur("erf",["typed"],(e=>{var{typed:r}=e;return r("name",{number:function(e){var r=Math.abs(e);return r>=Pu?ue(e):r<=qu?ue(e)*function(e){var r,t=e*e,n=ku[0][4]*t,i=t;for(r=0;r<3;r+=1)n=(n+ku[0][r])*t,i=(i+Ru[0][r])*t;return e*(n+ku[0][3])/(i+Ru[0][3])}(r):r<=4?ue(e)*(1-function(e){var r,t=ku[1][8]*e,n=e;for(r=0;r<7;r+=1)t=(t+ku[1][r])*e,n=(n+Ru[1][r])*e;var i=(t+ku[1][7])/(n+Ru[1][7]),a=parseInt(16*e)/16,o=(e-a)*(e+a);return Math.exp(-a*a)*Math.exp(-o)*i}(r)):ue(e)*(1-function(e){var r,t=1/(e*e),n=ku[2][5]*t,i=t;for(r=0;r<4;r+=1)n=(n+ku[2][r])*t,i=(i+Ru[2][r])*t;var a=t*(n+ku[2][4])/(i+Ru[2][4]);a=(Iu-a)/e,t=parseInt(16*e)/16;var o=(e-t)*(e+t);return Math.exp(-t*t)*Math.exp(-o)*a}(r))},"Array | Matrix":r.referToSelf((e=>r=>Fn(r,e)))})})),qu=.46875,Iu=.5641895835477563,ku=[[3.1611237438705655,113.86415415105016,377.485237685302,3209.3775891384694,.18577770618460315],[.5641884969886701,8.883149794388377,66.11919063714163,298.6351381974001,881.952221241769,1712.0476126340707,2051.0783778260716,1230.3393547979972,2.1531153547440383e-8],[.30532663496123236,.36034489994980445,.12578172611122926,.016083785148742275,.0006587491615298378,.016315387137302097]],Ru=[[23.601290952344122,244.02463793444417,1282.6165260773723,2844.236833439171],[15.744926110709835,117.6939508913125,537.1811018620099,1621.3895745666903,3290.7992357334597,4362.619090143247,3439.3676741437216,1230.3393548037495],[2.568520192289822,1.8729528499234604,.5279051029514285,.06051834131244132,.0023352049762686918]],Pu=Math.pow(2,53),Uu="mode",ju=ur(Uu,["typed","isNaN","isNumeric"],(e=>{var{typed:r,isNaN:t,isNumeric:n}=e;return r(Uu,{"Array | Matrix":i,"...":function(e){return i(e)}});function i(e){if(0===(e=Ke(e.valueOf())).length)throw new Error("Cannot calculate mode of an empty array");for(var r={},i=[],a=0,o=0;oa&&(a=r[s],i=[s])}return i}}));function Lu(e,r,t){var n;return-1!==String(e).indexOf("Unexpected type")?(n=arguments.length>2?" (type: "+Z(t)+", value: "+JSON.stringify(t)+")":" (type: "+e.data.actual+")",new TypeError("Cannot calculate "+r+", unexpected type of argument"+n)):-1!==String(e).indexOf("complex numbers")?(n=arguments.length>2?" (type: "+Z(t)+", value: "+JSON.stringify(t)+")":"",new TypeError("Cannot calculate "+r+", no ordering relation is defined for complex numbers"+n)):e}var Hu="prod",$u=ur(Hu,["typed","config","multiplyScalar","numeric"],(e=>{var{typed:r,config:t,multiplyScalar:n,numeric:i}=e;return r(Hu,{"Array | Matrix":a,"Array | Matrix, number | BigNumber":function(e,r){throw new Error("prod(A, dim) is not yet supported")},"...":function(e){return a(e)}});function a(e){var r;if(Mn(e,(function(e){try{r=void 0===r?e:n(r,e)}catch(r){throw Lu(r,"prod",e)}})),"string"==typeof r&&(r=i(r,t.number)),void 0===r)throw new Error("Cannot calculate prod of an empty array");return r}})),Zu="format",Gu=ur(Zu,["typed"],(e=>{var{typed:r}=e;return r(Zu,{any:_e,"any, Object | function | number":_e})})),Vu=ur("bin",["typed","format"],(e=>{var{typed:r,format:t}=e;return r("bin",{"number | BigNumber":function(e){return t(e,{notation:"bin"})},"number | BigNumber, number":function(e,r){return t(e,{notation:"bin",wordSize:r})}})})),Wu=ur("oct",["typed","format"],(e=>{var{typed:r,format:t}=e;return r("oct",{"number | BigNumber":function(e){return t(e,{notation:"oct"})},"number | BigNumber, number":function(e,r){return t(e,{notation:"oct",wordSize:r})}})})),Yu=ur("hex",["typed","format"],(e=>{var{typed:r,format:t}=e;return r("hex",{"number | BigNumber":function(e){return t(e,{notation:"hex"})},"number | BigNumber, number":function(e,r){return t(e,{notation:"hex",wordSize:r})}})})),Ju="print",Xu=ur(Ju,["typed"],(e=>{var{typed:r}=e;return r(Ju,{"string, Object | Array":Qu,"string, Object | Array, number | Object":Qu})}));function Qu(e,r,t){return e.replace(/\$([\w.]+)/g,(function(e,n){for(var i=n.split("."),a=r[i.shift()];i.length&&void 0!==a;){var o=i.shift();a=o?a[o]:a+"."}return void 0!==a?l(a)?a:_e(a,t):e}))}var Ku=ur("to",["typed","matrix","concat"],(e=>{var{typed:r,matrix:t,concat:n}=e;return r("to",{"Unit, Unit | string":(e,r)=>e.to(r)},go({typed:r,matrix:t,concat:n})({Ds:!0}))})),ec="isPrime",rc=ur(ec,["typed"],(e=>{var{typed:r}=e;return r(ec,{number:function(e){if(0*e!=0)return!1;if(e<=3)return e>1;if(e%2==0||e%3==0)return!1;for(var r=5;r*r<=e;r+=6)if(e%r==0||e%(r+2)==0)return!1;return!0},BigNumber:function(e){if(0*e.toNumber()!=0)return!1;if(e.lte(3))return e.gt(1);if(e.mod(2).eq(0)||e.mod(3).eq(0))return!1;if(e.lt(Math.pow(2,32))){for(var r=e.toNumber(),t=5;t*t<=r;t+=6)if(r%t==0||r%(t+2)==0)return!1;return!0}function n(e,r,t){for(var n=1;!r.eq(0);)r.mod(2).eq(0)?(r=r.div(2),e=e.mul(e).mod(t)):(r=r.sub(1),n=e.mul(n).mod(t));return n}for(var i=e.constructor.clone({precision:2*e.toFixed(0).length}),a=0,o=(e=new i(e)).sub(1);o.mod(2).eq(0);)o=o.div(2),a+=1;var s=null;if(e.lt("3317044064679887385961981"))s=[2,3,5,7,11,13,17,19,23,29,31,37,41].filter((r=>rr=>Fn(r,e)))})})),tc=ur("numeric",["number","?bignumber","?fraction"],(e=>{var{number:r,bignumber:t,fraction:n}=e,i={string:!0,number:!0,BigNumber:!0,Fraction:!0},a={number:e=>r(e),BigNumber:t?e=>t(e):Ks,Fraction:n?e=>n(e):eu};return function(e){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"number";if(void 0!==(arguments.length>2?arguments[2]:void 0))throw new SyntaxError("numeric() takes one or two arguments");var t=Z(e);if(!(t in i))throw new TypeError("Cannot convert "+e+' of type "'+t+'"; valid input types are '+Object.keys(i).join(", "));if(!(r in a))throw new TypeError("Cannot convert "+e+' to type "'+r+'"; valid output types are '+Object.keys(a).join(", "));return r===t?e:a[r](e)}})),nc="divideScalar",ic=ur(nc,["typed","numeric"],(e=>{var{typed:r,numeric:t}=e;return r(nc,{"number, number":function(e,r){return e/r},"Complex, Complex":function(e,r){return e.div(r)},"BigNumber, BigNumber":function(e,r){return e.div(r)},"Fraction, Fraction":function(e,r){return e.div(r)},"Unit, number | Complex | Fraction | BigNumber | Unit":(e,r)=>e.divide(r),"number | Fraction | Complex | BigNumber, Unit":(e,r)=>r.divideInto(e)})})),ac=ur("pow",["typed","config","identity","multiply","matrix","inv","fraction","number","Complex"],(e=>{var{typed:r,config:t,identity:n,multiply:i,matrix:a,inv:o,number:s,fraction:u,Complex:c}=e;return r("pow",{"number, number":l,"Complex, Complex":function(e,r){return e.pow(r)},"BigNumber, BigNumber":function(e,r){return r.isInteger()||e>=0||t.predictable?e.pow(r):new c(e.toNumber(),0).pow(r.toNumber(),0)},"Fraction, Fraction":function(e,r){var n=e.pow(r);if(null!=n)return n;if(t.predictable)throw new Error("Result of pow is non-rational and cannot be expressed as a fraction");return l(e.valueOf(),r.valueOf())},"Array, number":f,"Array, BigNumber":function(e,r){return f(e,r.toNumber())},"Matrix, number":p,"Matrix, BigNumber":function(e,r){return p(e,r.toNumber())},"Unit, number | BigNumber":function(e,r){return e.pow(r)}});function l(e,r){if(t.predictable&&!se(r)&&e<0)try{var n=u(r),i=s(n);if((r===i||Math.abs((r-i)/r)<1e-14)&&n.d%2==1)return(n.n%2==0?1:-1)*Math.pow(-e,r)}catch(e){}return t.predictable&&(e<-1&&r===1/0||e>-1&&e<0&&r===-1/0)?NaN:se(r)||e>=0||t.predictable?ri(e,r):e*e<1&&r===1/0||e*e>1&&r===-1/0?0:new c(e,0).pow(r,0)}function f(e,r){if(!se(r))throw new TypeError("For A^b, b must be an integer (value is "+r+")");var t=Ue(e);if(2!==t.length)throw new Error("For A^b, A must be 2 dimensional (A has "+t.length+" dimensions)");if(t[0]!==t[1])throw new Error("For A^b, A must be square (size is "+t[0]+"x"+t[1]+")");if(r<0)try{return f(o(e),-r)}catch(e){if("Cannot calculate inverse, determinant is zero"===e.message)throw new TypeError("For A^b, when A is not invertible, b must be a positive integer (value is "+r+")");throw e}for(var a=n(t[0]).valueOf(),s=e;r>=1;)1==(1&r)&&(a=i(s,a)),r>>=1,s=i(s,s);return a}function p(e,r){return a(f(e.valueOf(),r))}})),oc="Number of decimals in function round must be an integer",sc="round",uc=ur(sc,["typed","matrix","equalScalar","zeros","BigNumber","DenseMatrix"],(e=>{var{typed:r,matrix:t,equalScalar:n,zeros:i,BigNumber:a,DenseMatrix:o}=e,s=$a({typed:r,equalScalar:n}),u=Za({typed:r,DenseMatrix:o}),c=Ga({typed:r});return r(sc,{number:ti,"number, number":ti,"number, BigNumber":function(e,r){if(!r.isInteger())throw new TypeError(oc);return new a(e).toDecimalPlaces(r.toNumber())},Complex:function(e){return e.round()},"Complex, number":function(e,r){if(r%1)throw new TypeError(oc);return e.round(r)},"Complex, BigNumber":function(e,r){if(!r.isInteger())throw new TypeError(oc);var t=r.toNumber();return e.round(t)},BigNumber:function(e){return e.toDecimalPlaces(0)},"BigNumber, BigNumber":function(e,r){if(!r.isInteger())throw new TypeError(oc);return e.toDecimalPlaces(r.toNumber())},Fraction:function(e){return e.round()},"Fraction, number":function(e,r){if(r%1)throw new TypeError(oc);return e.round(r)},"Fraction, BigNumber":function(e,r){if(!r.isInteger())throw new TypeError(oc);return e.round(r.toNumber())},"Array | Matrix":r.referToSelf((e=>r=>Fn(r,e,!0))),"SparseMatrix, number | BigNumber":r.referToSelf((e=>(r,t)=>s(r,t,e,!1))),"DenseMatrix, number | BigNumber":r.referToSelf((e=>(r,t)=>c(r,t,e,!1))),"Array, number | BigNumber":r.referToSelf((e=>(r,n)=>c(t(r),n,e,!1).valueOf())),"number | Complex | BigNumber | Fraction, SparseMatrix":r.referToSelf((e=>(r,t)=>n(r,0)?i(t.size(),t.storage()):u(t,r,e,!0))),"number | Complex | BigNumber | Fraction, DenseMatrix":r.referToSelf((e=>(r,t)=>n(r,0)?i(t.size(),t.storage()):c(t,r,e,!0))),"number | Complex | BigNumber | Fraction, Array":r.referToSelf((e=>(r,n)=>c(t(n),r,e,!0).valueOf()))})})),cc=ur("log",["config","typed","divideScalar","Complex"],(e=>{var{typed:r,config:t,divideScalar:n,Complex:i}=e;return r("log",{number:function(e){return e>=0||t.predictable?function(e,r){return r?Math.log(e)/Math.log(r):Math.log(e)}(e):new i(e,0).log()},Complex:function(e){return e.log()},BigNumber:function(e){return!e.isNegative()||t.predictable?e.ln():new i(e.toNumber(),0).log()},"any, any":r.referToSelf((e=>(r,t)=>n(e(r),e(t))))})})),lc="log1p",fc=ur(lc,["typed","config","divideScalar","log","Complex"],(e=>{var{typed:r,config:t,divideScalar:n,log:i,Complex:a}=e;return r(lc,{number:function(e){return e>=-1||t.predictable?fe(e):o(new a(e,0))},Complex:o,BigNumber:function(e){var r=e.plus(1);return!r.isNegative()||t.predictable?r.ln():o(new a(e.toNumber(),0))},"Array | Matrix":r.referToSelf((e=>r=>Fn(r,e))),"any, any":r.referToSelf((e=>(r,t)=>n(e(r),i(t))))});function o(e){var r=e.re+1;return new a(Math.log(Math.sqrt(r*r+e.im*e.im)),Math.atan2(e.im,r))}})),pc="nthRoots",mc=ur(pc,["config","typed","divideScalar","Complex"],(e=>{var{typed:r,config:t,divideScalar:n,Complex:i}=e,a=[function(e){return new i(e,0)},function(e){return new i(0,e)},function(e){return new i(-e,0)},function(e){return new i(0,-e)}];function o(e,r){if(r<0)throw new Error("Root must be greater than zero");if(0===r)throw new Error("Root must be non-zero");if(r%1!=0)throw new Error("Root must be an integer");if(0===e||0===e.abs())return[new i(0,0)];var t,n="number"==typeof e;(n||0===e.re||0===e.im)&&(t=n?2*+(e<0):0===e.im?2*+(e.re<0):2*+(e.im<0)+1);for(var o=e.arg(),s=e.abs(),u=[],c=Math.pow(s,1/r),l=0;l{var{typed:r,equalScalar:t,matrix:n,pow:i,DenseMatrix:a,concat:o}=e,s=Bo({typed:r}),u=ps({typed:r,DenseMatrix:a}),c=$a({typed:r,equalScalar:t}),l=Za({typed:r,DenseMatrix:a}),f=go({typed:r,matrix:n,concat:o}),p={};for(var m in i.signatures)Object.prototype.hasOwnProperty.call(i.signatures,m)&&(m.includes("Matrix")||m.includes("Array")||(p[m]=i.signatures[m]));var d=r(p);return r(dc,f({elop:d,SS:u,DS:s,Ss:c,sS:l}))})),gc="dotDivide",yc=ur(gc,["typed","matrix","equalScalar","divideScalar","DenseMatrix","concat"],(e=>{var{typed:r,matrix:t,equalScalar:n,divideScalar:i,DenseMatrix:a,concat:o}=e,s=Do({typed:r,equalScalar:n}),u=Bo({typed:r}),c=ps({typed:r,DenseMatrix:a}),l=$a({typed:r,equalScalar:n}),f=Za({typed:r,DenseMatrix:a}),p=go({typed:r,matrix:t,concat:o});return r(gc,p({elop:i,SS:c,DS:u,SD:s,Ss:l,sS:f}))}));function vc(e){var{DenseMatrix:r}=e;return function(e,t,n){var i=e.size();if(2!==i.length)throw new RangeError("Matrix must be two dimensional (size: "+_e(i)+")");var a=i[0];if(a!==i[1])throw new RangeError("Matrix must be square (size: "+_e(i)+")");var o=[];if(p(t)){var s=t.size(),u=t._data;if(1===s.length){if(s[0]!==a)throw new RangeError("Dimension mismatch. Matrix columns must match vector length.");for(var c=0;c{var{typed:r,matrix:t,divideScalar:n,multiplyScalar:i,subtract:a,equalScalar:o,DenseMatrix:s}=e,u=vc({DenseMatrix:s});return r(xc,{"SparseMatrix, Array | Matrix":function(e,r){return function(e,r){for(var t=(r=u(e,r,!0))._data,c=e._size[0],l=e._size[1],f=e._values,p=e._index,m=e._ptr,d=[],h=0;hh&&(v.push(f[N]),x.push(D))}if(o(y,0))throw new Error("Linear system cannot be solved since matrix is singular");for(var E=n(g,y),A=0,C=x.length;A{var{typed:r,matrix:t,divideScalar:n,multiplyScalar:i,subtract:a,equalScalar:o,DenseMatrix:s}=e,u=vc({DenseMatrix:s});return r(wc,{"SparseMatrix, Array | Matrix":function(e,r){return function(e,r){for(var t=(r=u(e,r,!0))._data,c=e._size[0],l=e._size[1],f=e._values,p=e._index,m=e._ptr,d=[],h=l-1;h>=0;h--){var g=t[h][0]||0;if(o(g,0))d[h]=[0];else{for(var y=0,v=[],x=[],b=m[h],w=m[h+1]-1;w>=b;w--){var N=p[w];N===h?y=f[w]:N=0;m--){var d=t[m][0]||0,h=void 0;if(o(d,0))h=0;else{var g=p[m][m];if(o(g,0))throw new Error("Linear system cannot be solved since matrix is singular");h=n(d,g);for(var y=m-1;y>=0;y--)t[y]=[a(t[y][0]||0,i(h,p[y][m]))]}f[m]=[h]}return new s({data:f,size:[c,1]})}})),Dc="lsolveAll",Ec=ur(Dc,["typed","matrix","divideScalar","multiplyScalar","subtract","equalScalar","DenseMatrix"],(e=>{var{typed:r,matrix:t,divideScalar:n,multiplyScalar:i,subtract:a,equalScalar:o,DenseMatrix:s}=e,u=vc({DenseMatrix:s});return r(Dc,{"SparseMatrix, Array | Matrix":function(e,r){return function(e,r){for(var t=[u(e,r,!0)._data.map((e=>e[0]))],c=e._size[0],l=e._size[1],f=e._values,p=e._index,m=e._ptr,d=0;dd&&(v.push(f[D]),x.push(E))}if(o(N,0))if(o(y[d],0)){if(0===g){var A=[...y];A[d]=1;for(var C=0,S=x.length;Cnew s({data:e.map((e=>[e])),size:[c,1]})))}(e,r)},"DenseMatrix, Array | Matrix":function(e,r){return c(e,r)},"Array, Array | Matrix":function(e,r){return c(t(e),r).map((e=>e.valueOf()))}});function c(e,r){for(var t=[u(e,r,!0)._data.map((e=>e[0]))],c=e._data,l=e._size[0],f=e._size[1],p=0;pnew s({data:e.map((e=>[e])),size:[l,1]})))}})),Ac="usolveAll",Cc=ur(Ac,["typed","matrix","divideScalar","multiplyScalar","subtract","equalScalar","DenseMatrix"],(e=>{var{typed:r,matrix:t,divideScalar:n,multiplyScalar:i,subtract:a,equalScalar:o,DenseMatrix:s}=e,u=vc({DenseMatrix:s});return r(Ac,{"SparseMatrix, Array | Matrix":function(e,r){return function(e,r){for(var t=[u(e,r,!0)._data.map((e=>e[0]))],c=e._size[0],l=e._size[1],f=e._values,p=e._index,m=e._ptr,d=l-1;d>=0;d--)for(var h=t.length,g=0;g=b;N--){var D=p[N];D===d?w=f[N]:Dnew s({data:e.map((e=>[e])),size:[c,1]})))}(e,r)},"DenseMatrix, Array | Matrix":function(e,r){return c(e,r)},"Array, Array | Matrix":function(e,r){return c(t(e),r).map((e=>e.valueOf()))}});function c(e,r){for(var t=[u(e,r,!0)._data.map((e=>e[0]))],c=e._data,l=e._size[0],f=e._size[1]-1;f>=0;f--)for(var p=t.length,m=0;m=0;g--)h[g]=a(h[g],c[g][f]);t.push(h)}}else{if(0===m)return[];t.splice(m,1),m-=1,p-=1}else{d[f]=n(d[f],c[f][f]);for(var y=f-1;y>=0;y--)d[y]=a(d[y],i(d[f],c[y][f]))}}return t.map((e=>new s({data:e.map((e=>[e])),size:[l,1]})))}})),Sc=ur("matAlgo08xS0Sid",["typed","equalScalar"],(e=>{var{typed:r,equalScalar:t}=e;return function(e,n,i){var a=e._values,o=e._index,s=e._ptr,u=e._size,c=e._datatype,l=n._values,f=n._index,p=n._ptr,m=n._size,d=n._datatype;if(u.length!==m.length)throw new Re(u.length,m.length);if(u[0]!==m[0]||u[1]!==m[1])throw new RangeError("Dimension mismatch. Matrix A ("+u+") must match Matrix B ("+m+")");if(!a||!l)throw new Error("Cannot perform operation on Pattern Sparse Matrices");var h,g=u[0],y=u[1],v=t,x=0,b=i;"string"==typeof c&&c===d&&(h=c,v=r.find(t,[h,h]),x=r.convert(0,h),b=r.find(i,[h,h]));for(var w,N,D,E,A=[],C=[],S=[],M=[],F=[],B=0;B{var{typed:r,matrix:t}=e;return{"Array, number":r.referTo("DenseMatrix, number",(e=>(r,n)=>e(t(r),n).valueOf())),"Array, BigNumber":r.referTo("DenseMatrix, BigNumber",(e=>(r,n)=>e(t(r),n).valueOf())),"number, Array":r.referTo("number, DenseMatrix",(e=>(r,n)=>e(r,t(n)).valueOf())),"BigNumber, Array":r.referTo("BigNumber, DenseMatrix",(e=>(r,n)=>e(r,t(n)).valueOf()))}})),Fc="leftShift",Bc=ur(Fc,["typed","matrix","equalScalar","zeros","DenseMatrix","concat"],(e=>{var{typed:r,matrix:t,equalScalar:n,zeros:i,DenseMatrix:a,concat:o}=e,s=lo({typed:r}),u=Do({typed:r,equalScalar:n}),c=Sc({typed:r,equalScalar:n}),l=po({typed:r,DenseMatrix:a}),f=$a({typed:r,equalScalar:n}),p=Ga({typed:r}),m=go({typed:r,matrix:t,concat:o}),d=Mc({typed:r,matrix:t});return r(Fc,{"number, number":ui,"BigNumber, BigNumber":is,"SparseMatrix, number | BigNumber":r.referToSelf((e=>(r,t)=>n(t,0)?r.clone():f(r,t,e,!1))),"DenseMatrix, number | BigNumber":r.referToSelf((e=>(r,t)=>n(t,0)?r.clone():p(r,t,e,!1))),"number | BigNumber, SparseMatrix":r.referToSelf((e=>(r,t)=>n(r,0)?i(t.size(),t.storage()):l(t,r,e,!0))),"number | BigNumber, DenseMatrix":r.referToSelf((e=>(r,t)=>n(r,0)?i(t.size(),t.storage()):p(t,r,e,!0)))},d,m({SS:c,DS:s,SD:u}))})),Tc="rightArithShift",Oc=ur(Tc,["typed","matrix","equalScalar","zeros","DenseMatrix","concat"],(e=>{var{typed:r,matrix:t,equalScalar:n,zeros:i,DenseMatrix:a,concat:o}=e,s=lo({typed:r}),u=Do({typed:r,equalScalar:n}),c=Sc({typed:r,equalScalar:n}),l=po({typed:r,DenseMatrix:a}),f=$a({typed:r,equalScalar:n}),p=Ga({typed:r}),m=go({typed:r,matrix:t,concat:o}),d=Mc({typed:r,matrix:t});return r(Tc,{"number, number":ci,"BigNumber, BigNumber":as,"SparseMatrix, number | BigNumber":r.referToSelf((e=>(r,t)=>n(t,0)?r.clone():f(r,t,e,!1))),"DenseMatrix, number | BigNumber":r.referToSelf((e=>(r,t)=>n(t,0)?r.clone():p(r,t,e,!1))),"number | BigNumber, SparseMatrix":r.referToSelf((e=>(r,t)=>n(r,0)?i(t.size(),t.storage()):l(t,r,e,!0))),"number | BigNumber, DenseMatrix":r.referToSelf((e=>(r,t)=>n(r,0)?i(t.size(),t.storage()):p(t,r,e,!0)))},d,m({SS:c,DS:s,SD:u}))})),_c="rightLogShift",zc=ur(_c,["typed","matrix","equalScalar","zeros","DenseMatrix","concat"],(e=>{var{typed:r,matrix:t,equalScalar:n,zeros:i,DenseMatrix:a,concat:o}=e,s=lo({typed:r}),u=Do({typed:r,equalScalar:n}),c=Sc({typed:r,equalScalar:n}),l=po({typed:r,DenseMatrix:a}),f=$a({typed:r,equalScalar:n}),p=Ga({typed:r}),m=go({typed:r,matrix:t,concat:o}),d=Mc({typed:r,matrix:t});return r(_c,{"number, number":li,"SparseMatrix, number | BigNumber":r.referToSelf((e=>(r,t)=>n(t,0)?r.clone():f(r,t,e,!1))),"DenseMatrix, number | BigNumber":r.referToSelf((e=>(r,t)=>n(t,0)?r.clone():p(r,t,e,!1))),"number | BigNumber, SparseMatrix":r.referToSelf((e=>(r,t)=>n(r,0)?i(t.size(),t.storage()):l(t,r,e,!0))),"number | BigNumber, DenseMatrix":r.referToSelf((e=>(r,t)=>n(r,0)?i(t.size(),t.storage()):p(t,r,e,!0)))},d,m({SS:c,DS:s,SD:u}))})),qc=ur("and",["typed","matrix","equalScalar","zeros","not","concat"],(e=>{var{typed:r,matrix:t,equalScalar:n,zeros:i,not:a,concat:o}=e,s=Do({typed:r,equalScalar:n}),u=Eo({typed:r,equalScalar:n}),c=$a({typed:r,equalScalar:n}),l=Ga({typed:r}),f=go({typed:r,matrix:t,concat:o});return r("and",{"number, number":bi,"Complex, Complex":function(e,r){return!(0===e.re&&0===e.im||0===r.re&&0===r.im)},"BigNumber, BigNumber":function(e,r){return!(e.isZero()||r.isZero()||e.isNaN()||r.isNaN())},"Unit, Unit":r.referToSelf((e=>(r,t)=>e(r.value||0,t.value||0))),"SparseMatrix, any":r.referToSelf((e=>(r,t)=>a(t)?i(r.size(),r.storage()):c(r,t,e,!1))),"DenseMatrix, any":r.referToSelf((e=>(r,t)=>a(t)?i(r.size(),r.storage()):l(r,t,e,!1))),"any, SparseMatrix":r.referToSelf((e=>(r,t)=>a(r)?i(r.size(),r.storage()):c(t,r,e,!0))),"any, DenseMatrix":r.referToSelf((e=>(r,t)=>a(r)?i(r.size(),r.storage()):l(t,r,e,!0))),"Array, any":r.referToSelf((e=>(r,n)=>e(t(r),n).valueOf())),"any, Array":r.referToSelf((e=>(r,n)=>e(r,t(n)).valueOf()))},f({SS:u,DS:s}))})),Ic="compare",kc=ur(Ic,["typed","config","matrix","equalScalar","BigNumber","Fraction","DenseMatrix","concat"],(e=>{var{typed:r,config:t,equalScalar:n,matrix:i,BigNumber:a,Fraction:o,DenseMatrix:s,concat:u}=e,c=Bo({typed:r}),l=To({typed:r,equalScalar:n}),f=Za({typed:r,DenseMatrix:s}),p=go({typed:r,matrix:i,concat:u}),m=la({typed:r});return r(Ic,Rc({typed:r,config:t}),{"boolean, boolean":function(e,r){return e===r?0:e>r?1:-1},"BigNumber, BigNumber":function(e,r){return ca(e,r,t.epsilon)?new a(0):new a(e.cmp(r))},"Fraction, Fraction":function(e,r){return new o(e.compare(r))},"Complex, Complex":function(){throw new TypeError("No ordering relation is defined for complex numbers")}},m,p({SS:l,DS:c,Ss:f}))})),Rc=ur(Ic,["typed","config"],(e=>{var{typed:r,config:t}=e;return r(Ic,{"number, number":function(e,r){return Ne(e,r,t.epsilon)?0:e>r?1:-1}})})),Pc=t(74681),Uc="compareNatural",jc=ur(Uc,["typed","compare"],(e=>{var{typed:r,compare:t}=e,n=t.signatures["boolean,boolean"];return r(Uc,{"any, any":function e(r,o){var s,u=Z(r),c=Z(o);if(!("number"!==u&&"BigNumber"!==u&&"Fraction"!==u||"number"!==c&&"BigNumber"!==c&&"Fraction"!==c))return"0"!==(s=t(r,o)).toString()?s>0?1:-1:Pc(u,c);var l=["Array","DenseMatrix","SparseMatrix"];if(l.includes(u)||l.includes(c))return 0!==(s=i(e,r,o))?s:Pc(u,c);if(u!==c)return Pc(u,c);if("Complex"===u)return function(e,r){if(e.re>r.re)return 1;if(e.rer.im)return 1;if(e.imt.length?1:r.length{var{typed:r,matrix:t,concat:n}=e,i=go({typed:r,matrix:t,concat:n});return r(Lc,ke,i({elop:ke,Ds:!0}))})),Zc="equal",Gc=ur(Zc,["typed","matrix","equalScalar","DenseMatrix","concat"],(e=>{var{typed:r,matrix:t,equalScalar:n,DenseMatrix:i,concat:a}=e,o=Bo({typed:r}),s=ps({typed:r,DenseMatrix:i}),u=Za({typed:r,DenseMatrix:i}),c=go({typed:r,matrix:t,concat:a});return r(Zc,Vc({typed:r,equalScalar:n}),c({elop:n,SS:s,DS:o,Ss:u}))})),Vc=ur(Zc,["typed","equalScalar"],(e=>{var{typed:r,equalScalar:t}=e;return r(Zc,{"any, any":function(e,r){return null===e?null===r:null===r?null===e:void 0===e?void 0===r:void 0===r?void 0===e:t(e,r)}})})),Wc="equalText",Yc=ur(Wc,["typed","compareText","isZero"],(e=>{var{typed:r,compareText:t,isZero:n}=e;return r(Wc,{"any, any":function(e,r){return n(t(e,r))}})})),Jc="smaller",Xc=ur(Jc,["typed","config","matrix","DenseMatrix","concat"],(e=>{var{typed:r,config:t,matrix:n,DenseMatrix:i,concat:a}=e,o=Bo({typed:r}),s=ps({typed:r,DenseMatrix:i}),u=Za({typed:r,DenseMatrix:i}),c=go({typed:r,matrix:n,concat:a}),l=la({typed:r});return r(Jc,Qc({typed:r,config:t}),{"boolean, boolean":(e,r)=>e-1===e.compare(r),"Complex, Complex":function(e,r){throw new TypeError("No ordering relation is defined for complex numbers")}},l,c({SS:s,DS:o,Ss:u}))})),Qc=ur(Jc,["typed","config"],(e=>{var{typed:r,config:t}=e;return r(Jc,{"number, number":function(e,r){return e{var{typed:r,config:t,matrix:n,DenseMatrix:i,concat:a}=e,o=Bo({typed:r}),s=ps({typed:r,DenseMatrix:i}),u=Za({typed:r,DenseMatrix:i}),c=go({typed:r,matrix:n,concat:a}),l=la({typed:r});return r(Kc,rl({typed:r,config:t}),{"boolean, boolean":(e,r)=>e<=r,"BigNumber, BigNumber":function(e,r){return e.lte(r)||ca(e,r,t.epsilon)},"Fraction, Fraction":(e,r)=>1!==e.compare(r),"Complex, Complex":function(){throw new TypeError("No ordering relation is defined for complex numbers")}},l,c({SS:s,DS:o,Ss:u}))})),rl=ur(Kc,["typed","config"],(e=>{var{typed:r,config:t}=e;return r(Kc,{"number, number":function(e,r){return e<=r||Ne(e,r,t.epsilon)}})})),tl="larger",nl=ur(tl,["typed","config","matrix","DenseMatrix","concat"],(e=>{var{typed:r,config:t,matrix:n,DenseMatrix:i,concat:a}=e,o=Bo({typed:r}),s=ps({typed:r,DenseMatrix:i}),u=Za({typed:r,DenseMatrix:i}),c=go({typed:r,matrix:n,concat:a}),l=la({typed:r});return r(tl,il({typed:r,config:t}),{"boolean, boolean":(e,r)=>e>r,"BigNumber, BigNumber":function(e,r){return e.gt(r)&&!ca(e,r,t.epsilon)},"Fraction, Fraction":(e,r)=>1===e.compare(r),"Complex, Complex":function(){throw new TypeError("No ordering relation is defined for complex numbers")}},l,c({SS:s,DS:o,Ss:u}))})),il=ur(tl,["typed","config"],(e=>{var{typed:r,config:t}=e;return r(tl,{"number, number":function(e,r){return e>r&&!Ne(e,r,t.epsilon)}})})),al="largerEq",ol=ur(al,["typed","config","matrix","DenseMatrix","concat"],(e=>{var{typed:r,config:t,matrix:n,DenseMatrix:i,concat:a}=e,o=Bo({typed:r}),s=ps({typed:r,DenseMatrix:i}),u=Za({typed:r,DenseMatrix:i}),c=go({typed:r,matrix:n,concat:a}),l=la({typed:r});return r(al,sl({typed:r,config:t}),{"boolean, boolean":(e,r)=>e>=r,"BigNumber, BigNumber":function(e,r){return e.gte(r)||ca(e,r,t.epsilon)},"Fraction, Fraction":(e,r)=>-1!==e.compare(r),"Complex, Complex":function(){throw new TypeError("No ordering relation is defined for complex numbers")}},l,c({SS:s,DS:o,Ss:u}))})),sl=ur(al,["typed","config"],(e=>{var{typed:r,config:t}=e;return r(al,{"number, number":function(e,r){return e>=r||Ne(e,r,t.epsilon)}})})),ul="deepEqual",cl=ur(ul,["typed","equal"],(e=>{var{typed:r,equal:t}=e;return r(ul,{"any, any":function(e,r){return n(e.valueOf(),r.valueOf())}});function n(e,r){if(Array.isArray(e)){if(Array.isArray(r)){var i=e.length;if(i!==r.length)return!1;for(var a=0;a{var{typed:r,config:t,equalScalar:n,matrix:i,DenseMatrix:a,concat:o}=e,s=Bo({typed:r}),u=ps({typed:r,DenseMatrix:a}),c=Za({typed:r,DenseMatrix:a}),l=go({typed:r,matrix:i,concat:o});return r(ll,pl({typed:r,equalScalar:n}),l({elop:function(e,r){return!n(e,r)},SS:u,DS:s,Ss:c}))})),pl=ur(ll,["typed","equalScalar"],(e=>{var{typed:r,equalScalar:t}=e;return r(ll,{"any, any":function(e,r){return null===e?null!==r:null===r?null!==e:void 0===e?void 0!==r:void 0===r?void 0!==e:!t(e,r)}})})),ml="partitionSelect",dl=ur(ml,["typed","isNumeric","isNaN","compare"],(e=>{var{typed:r,isNumeric:t,isNaN:n,compare:i}=e,a=i,o=(e,r)=>-i(e,r);return r(ml,{"Array | Matrix, number":function(e,r){return s(e,r,a)},"Array | Matrix, number, string":function(e,r,t){if("asc"===t)return s(e,r,a);if("desc"===t)return s(e,r,o);throw new Error('Compare string must be "asc" or "desc"')},"Array | Matrix, number, function":s});function s(e,r,t){if(!se(r)||r<0)throw new Error("k must be a non-negative integer");if(p(e)){if(e.size().length>1)throw new Error("Only one dimensional matrices supported");return u(e.valueOf(),r,t)}if(Array.isArray(e))return u(e,r,t)}function u(e,r,i){if(r>=e.length)throw new Error("k out of bounds");for(var a=0;a=0){var f=e[c];e[c]=e[u],e[u]=f,--c}else++u;i(e[u],l)>0&&--u,r<=u?s=u:o=u+1}return e[r]}})),hl="sort",gl=ur(hl,["typed","matrix","compare","compareNatural"],(e=>{var{typed:r,matrix:t,compare:n,compareNatural:i}=e,a=n,o=(e,r)=>-n(e,r);return r(hl,{Array:function(e){return u(e),e.sort(a)},Matrix:function(e){return c(e),t(e.toArray().sort(a),e.storage())},"Array, function":function(e,r){return u(e),e.sort(r)},"Matrix, function":function(e,r){return c(e),t(e.toArray().sort(r),e.storage())},"Array, string":function(e,r){return u(e),e.sort(s(r))},"Matrix, string":function(e,r){return c(e),t(e.toArray().sort(s(r)),e.storage())}});function s(e){if("asc"===e)return a;if("desc"===e)return o;if("natural"===e)return i;throw new Error('String "asc", "desc", or "natural" expected')}function u(e){if(1!==Ue(e).length)throw new Error("One dimensional array expected")}function c(e){if(1!==e.size().length)throw new Error("One dimensional matrix expected")}})),yl=ur("max",["typed","config","numeric","larger"],(e=>{var{typed:r,config:t,numeric:n,larger:i}=e;return r("max",{"Array | Matrix":o,"Array | Matrix, number | BigNumber":function(e,r){return Bn(e,r.valueOf(),a)},"...":function(e){if(Sn(e))throw new TypeError("Scalar values expected in function max");return o(e)}});function a(e,r){try{return i(e,r)?e:r}catch(e){throw Lu(e,"max",r)}}function o(e){var r;if(Mn(e,(function(e){try{isNaN(e)&&"number"==typeof e?r=NaN:(void 0===r||i(e,r))&&(r=e)}catch(r){throw Lu(r,"max",e)}})),void 0===r)throw new Error("Cannot calculate max of an empty array");return"string"==typeof r&&(r=n(r,t.number)),r}})),vl=ur("min",["typed","config","numeric","smaller"],(e=>{var{typed:r,config:t,numeric:n,smaller:i}=e;return r("min",{"Array | Matrix":o,"Array | Matrix, number | BigNumber":function(e,r){return Bn(e,r.valueOf(),a)},"...":function(e){if(Sn(e))throw new TypeError("Scalar values expected in function min");return o(e)}});function a(e,r){try{return i(e,r)?e:r}catch(e){throw Lu(e,"min",r)}}function o(e){var r;if(Mn(e,(function(e){try{isNaN(e)&&"number"==typeof e?r=NaN:(void 0===r||i(e,r))&&(r=e)}catch(r){throw Lu(r,"min",e)}})),void 0===r)throw new Error("Cannot calculate min of an empty array");return"string"==typeof r&&(r=n(r,t.number)),r}})),xl=ur("ImmutableDenseMatrix",["smaller","DenseMatrix"],(e=>{var{smaller:r,DenseMatrix:t}=e;function n(e,r){if(!(this instanceof n))throw new SyntaxError("Constructor must be called with the new operator");if(r&&!l(r))throw new Error("Invalid datatype: "+r);if(p(e)||f(e)){var i=new t(e,r);this._data=i._data,this._size=i._size,this._datatype=i._datatype,this._min=null,this._max=null}else if(e&&f(e.data)&&f(e.size))this._data=e.data,this._size=e.size,this._datatype=e.datatype,this._min=void 0!==e.min?e.min:null,this._max=void 0!==e.max?e.max:null;else{if(e)throw new TypeError("Unsupported type of data ("+Z(e)+")");this._data=[],this._size=[0],this._datatype=r,this._min=null,this._max=null}}return n.prototype=new t,n.prototype.type="ImmutableDenseMatrix",n.prototype.isImmutableDenseMatrix=!0,n.prototype.subset=function(e){switch(arguments.length){case 1:var r=t.prototype.subset.call(this,e);return p(r)?new n({data:r._data,size:r._size,datatype:r._datatype}):r;case 2:case 3:throw new Error("Cannot invoke set subset on an Immutable Matrix instance");default:throw new SyntaxError("Wrong number of arguments")}},n.prototype.set=function(){throw new Error("Cannot invoke set on an Immutable Matrix instance")},n.prototype.resize=function(){throw new Error("Cannot invoke resize on an Immutable Matrix instance")},n.prototype.reshape=function(){throw new Error("Cannot invoke reshape on an Immutable Matrix instance")},n.prototype.clone=function(){return new n({data:G(this._data),size:G(this._size),datatype:this._datatype})},n.prototype.toJSON=function(){return{mathjs:"ImmutableDenseMatrix",data:this._data,size:this._size,datatype:this._datatype}},n.fromJSON=function(e){return new n(e)},n.prototype.swapRows=function(){throw new Error("Cannot invoke swapRows on an Immutable Matrix instance")},n.prototype.min=function(){if(null===this._min){var e=null;this.forEach((function(t){(null===e||r(t,e))&&(e=t)})),this._min=null!==e?e:void 0}return this._min},n.prototype.max=function(){if(null===this._max){var e=null;this.forEach((function(t){(null===e||r(e,t))&&(e=t)})),this._max=null!==e?e:void 0}return this._max},n}),{isClass:!0}),bl=ur("Index",["ImmutableDenseMatrix"],(e=>{var{ImmutableDenseMatrix:r}=e;function t(e){if(!(this instanceof t))throw new SyntaxError("Constructor must be called with the new operator");this._dimensions=[],this._isScalar=!0;for(var r=0,i=arguments.length;r{var{smaller:r,larger:t}=e,n=1/Math.log((1+Math.sqrt(5))/2);function i(){if(!(this instanceof i))throw new SyntaxError("Constructor must be called with the new operator");this._minimum=null,this._size=0}function a(e,r,t){r.left.right=r.right,r.right.left=r.left,t.degree--,t.child===r&&(t.child=r.right),0===t.degree&&(t.child=null),r.left=e,r.right=e.right,e.right=r,r.right.left=r,r.parent=null,r.mark=!1}function o(e,r){var t=r.parent;t&&(r.mark?(a(e,r,t),o(t)):r.mark=!0)}i.prototype.type="FibonacciHeap",i.prototype.isFibonacciHeap=!0,i.prototype.insert=function(e,t){var n={key:e,value:t,degree:0};if(this._minimum){var i=this._minimum;n.left=i,n.right=i.right,i.right=n,n.right.left=n,r(e,i.key)&&(this._minimum=n)}else n.left=n,n.right=n,this._minimum=n;return this._size++,n},i.prototype.size=function(){return this._size},i.prototype.clear=function(){this._minimum=null,this._size=0},i.prototype.isEmpty=function(){return 0===this._size},i.prototype.extractMinimum=function(){var e=this._minimum;if(null===e)return e;for(var i=this._minimum,a=e.degree,o=e.child;a>0;){var u=o.right;o.left.right=o.right,o.right.left=o.left,o.left=i,o.right=i.right,i.right=o,o.right.left=o,o.parent=null,o=u,a--}return e.left.right=e.right,e.right.left=e.left,i=e===e.right?null:function(e,i){var a,o=Math.floor(Math.log(i)*n)+1,u=new Array(o),c=0,l=e;if(l)for(c++,l=l.right;l!==e;)c++,l=l.right;for(;c>0;){for(var f=l.degree,p=l.right;a=u[f];){if(t(l.key,a.key)){var m=a;a=l,l=m}s(a,l),u[f]=null,f++}u[f]=l,l=p,c--}e=null;for(var d=0;d{var{addScalar:r,equalScalar:t,FibonacciHeap:n}=e;function i(){if(!(this instanceof i))throw new SyntaxError("Constructor must be called with the new operator");this._values=[],this._heap=new n}return i.prototype.type="Spa",i.prototype.isSpa=!0,i.prototype.set=function(e,r){if(this._values[e])this._values[e].value=r;else{var t=this._heap.insert(e,r);this._values[e]=t}},i.prototype.get=function(e){var r=this._values[e];return r?r.value:0},i.prototype.accumulate=function(e,t){var n=this._values[e];n?n.value=r(n.value,t):(n=this._heap.insert(e,t),this._values[e]=n)},i.prototype.forEach=function(e,r,n){var i=this._heap,a=this._values,o=[],s=i.extractMinimum();for(s&&o.push(s);s&&s.key<=r;)s.key>=e&&(t(s.value,0)||n(s.key,s.value,this)),(s=i.extractMinimum())&&o.push(s);for(var u=0;u{var r,t,i,{on:a,config:o,addScalar:u,subtract:l,multiplyScalar:f,divideScalar:p,pow:m,abs:d,fix:h,round:g,equal:y,isNumeric:v,format:x,number:b,Complex:w,BigNumber:N,Fraction:D}=e,E=b;function A(e,r){if(!(this instanceof A))throw new Error("Constructor must be called with the new operator");if(null!=e&&!v(e)&&!s(e))throw new TypeError("First parameter in Unit constructor must be number, BigNumber, Fraction, Complex, or undefined");if(this.fixPrefix=!1,this.skipAutomaticSimplification=!0,void 0===r)this.units=[],this.dimensions=I.map((e=>0));else if("string"==typeof r){var t=A.parse(r);this.units=t.units,this.dimensions=t.dimensions}else{if(!c(r)||null!==r.value)throw new TypeError("Second parameter in Unit constructor must be a string or valueless Unit");this.fixPrefix=r.fixPrefix,this.skipAutomaticSimplification=r.skipAutomaticSimplification,this.dimensions=r.dimensions.slice(0),this.units=r.units.map((e=>(0,n.Z)({},e)))}this.value=this._normalize(e)}function C(){for(;" "===i||"\t"===i;)M()}function S(e){return e>="0"&&e<="9"}function M(){t++,i=r.charAt(t)}function F(e){t=e,i=r.charAt(t)}function B(){var e="",r=t;if("+"===i?M():"-"===i&&(e+=i,M()),!function(e){return e>="0"&&e<="9"||"."===e}(i))return F(r),null;if("."===i){if(e+=i,M(),!S(i))return F(r),null}else{for(;S(i);)e+=i,M();"."===i&&(e+=i,M())}for(;S(i);)e+=i,M();if("E"===i||"e"===i){var n="",a=t;if(n+=i,M(),"+"!==i&&"-"!==i||(n+=i,M()),!S(i))return F(a),e;for(e+=n;S(i);)e+=i,M()}return e}function T(){for(var e="";S(i)||A.isValidAlpha(i);)e+=i,M();var r=e.charAt(0);return A.isValidAlpha(r)?e:null}function O(e){return i===e?(M(),e):null}Object.defineProperty(A,"name",{value:"Unit"}),A.prototype.constructor=A,A.prototype.type="Unit",A.prototype.isUnit=!0,A.parse=function(e,n){if(n=n||{},t=-1,i="","string"!=typeof(r=e))throw new TypeError("Invalid argument in Unit.parse, string expected");var a=new A;a.units=[];var s=1,u=!1;M(),C();var c=B(),l=null;if(c){if("BigNumber"===o.number)l=new N(c);else if("Fraction"===o.number)try{l=new D(c)}catch(e){l=parseFloat(c)}else l=parseFloat(c);C(),O("*")?(s=1,u=!0):O("/")&&(s=-1,u=!0)}for(var f=[],p=1;;){for(C();"("===i;)f.push(s),p*=s,s=1,M(),C();var m=void 0;if(!i)break;var d=i;if(null===(m=T()))throw new SyntaxError('Unexpected "'+d+'" in "'+r+'" at index '+t.toString());var h=_(m);if(null===h)throw new SyntaxError('Unit "'+m+'" not found.');var g=s*p;if(C(),O("^")){C();var y=B();if(null===y)throw new SyntaxError('In "'+e+'", "^" must be followed by a floating-point number');g*=y}a.units.push({unit:h.unit,prefix:h.prefix,power:g});for(var v=0;v1||Math.abs(this.units[0].power-1)>1e-15)},A.prototype._normalize=function(e){if(null==e||0===this.units.length)return e;for(var r=e,t=A._getNumberConverter(Z(e)),n=0;n{if(Y(U,e)){var r=U[e];return{unit:r,prefix:r.prefixes[""]}}for(var t in U)if(Y(U,t)&&Oe(e,t)){var n=U[t],i=e.length-t.length,a=e.substring(0,i),o=Y(n.prefixes,a)?n.prefixes[a]:void 0;if(void 0!==o)return{unit:n,prefix:o}}return null}),{hasher:e=>e[0],limit:100});function z(e){return e.equalBase(k.NONE)&&null!==e.value&&!o.predictable?e.value:e}A.isValuelessUnit=function(e){return null!==_(e)},A.prototype.hasBase=function(e){if("string"==typeof e&&(e=k[e]),!e)return!1;for(var r=0;r1e-12)return!1;return!0},A.prototype.equalBase=function(e){for(var r=0;r1e-12)return!1;return!0},A.prototype.equals=function(e){return this.equalBase(e)&&y(this.value,e.value)},A.prototype.multiply=function(e){for(var r=this.clone(),t=c(e)?e:new A(e),n=0;n1e-12&&(Y($,s)?n.push({unit:$[s].unit,prefix:$[s].prefix,power:t.dimensions[o]||0}):a=!0)}n.length1e-12){if(!Y(H.si,n))throw new Error("Cannot express custom unit "+n+" in SI units");r.push({unit:H.si[n].unit,prefix:H.si[n].prefix,power:e.dimensions[t]||0})}}return e.units=r,e.fixPrefix=!0,e.skipAutomaticSimplification=!0,e},A.prototype.formatUnits=function(){for(var e="",r="",t=0,n=0,i=0;i0?(t++,e+=" "+this.units[i].prefix.name+this.units[i].unit.name,Math.abs(this.units[i].power-1)>1e-15&&(e+="^"+this.units[i].power)):this.units[i].power<0&&n++;if(n>0)for(var a=0;a0?(r+=" "+this.units[a].prefix.name+this.units[a].unit.name,Math.abs(this.units[a].power+1)>1e-15&&(r+="^"+-this.units[a].power)):(r+=" "+this.units[a].prefix.name+this.units[a].unit.name,r+="^"+this.units[a].power));e=e.substr(1),r=r.substr(1),t>1&&n>0&&(e="("+e+")"),n>1&&t>0&&(r="("+r+")");var o=e;return t>0&&n>0&&(o+=" / "),o+=r},A.prototype.format=function(e){var r=this.skipAutomaticSimplification||null===this.value?this.clone():this.simplify(),t=!1;for(var n in void 0!==r.value&&null!==r.value&&s(r.value)&&(t=Math.abs(r.value.re)<1e-14),r.units)Y(r.units,n)&&r.units[n].unit&&("VA"===r.units[n].unit.name&&t?r.units[n].unit=U.VAR:"VAR"!==r.units[n].unit.name||t||(r.units[n].unit=U.VA));1!==r.units.length||r.fixPrefix||Math.abs(r.units[0].power-Math.round(r.units[0].power))<1e-14&&(r.units[0].prefix=r._bestPrefix());var i=r._denormalize(r.value),a=null!==r.value?x(i,e||{}):"",o=r.formatUnits();return r.value&&s(r.value)&&(a="("+a+")"),o.length>0&&a.length>0&&(a+=" "),a+=o},A.prototype._bestPrefix=function(){if(1!==this.units.length)throw new Error("Can only compute the best prefix for single units with integer powers, like kg, s^2, N^-1, and so forth!");if(Math.abs(this.units[0].power-Math.round(this.units[0].power))>=1e-14)throw new Error("Can only compute the best prefix for single units with integer powers, like kg, s^2, N^-1, and so forth!");var e=null!==this.value?d(this.value):0,r=d(this.units[0].unit.value),t=this.units[0].prefix;if(0===e)return t;var n=this.units[0].power,i=Math.log(e/Math.pow(t.value*r,n))/Math.LN10-1.2;if(i>-2.200001&&i<1.800001)return t;i=Math.abs(i);var a=this.units[0].unit.prefixes;for(var o in a)if(Y(a,o)){var s=a[o];if(s.scientific){var u=Math.abs(Math.log(e/Math.pow(s.value*r,n))/Math.LN10-1.2);(u0))},U={meter:{name:"meter",base:k.LENGTH,prefixes:q.LONG,value:1,offset:0},inch:{name:"inch",base:k.LENGTH,prefixes:q.NONE,value:.0254,offset:0},foot:{name:"foot",base:k.LENGTH,prefixes:q.NONE,value:.3048,offset:0},yard:{name:"yard",base:k.LENGTH,prefixes:q.NONE,value:.9144,offset:0},mile:{name:"mile",base:k.LENGTH,prefixes:q.NONE,value:1609.344,offset:0},link:{name:"link",base:k.LENGTH,prefixes:q.NONE,value:.201168,offset:0},rod:{name:"rod",base:k.LENGTH,prefixes:q.NONE,value:5.0292,offset:0},chain:{name:"chain",base:k.LENGTH,prefixes:q.NONE,value:20.1168,offset:0},angstrom:{name:"angstrom",base:k.LENGTH,prefixes:q.NONE,value:1e-10,offset:0},m:{name:"m",base:k.LENGTH,prefixes:q.SHORT,value:1,offset:0},in:{name:"in",base:k.LENGTH,prefixes:q.NONE,value:.0254,offset:0},ft:{name:"ft",base:k.LENGTH,prefixes:q.NONE,value:.3048,offset:0},yd:{name:"yd",base:k.LENGTH,prefixes:q.NONE,value:.9144,offset:0},mi:{name:"mi",base:k.LENGTH,prefixes:q.NONE,value:1609.344,offset:0},li:{name:"li",base:k.LENGTH,prefixes:q.NONE,value:.201168,offset:0},rd:{name:"rd",base:k.LENGTH,prefixes:q.NONE,value:5.02921,offset:0},ch:{name:"ch",base:k.LENGTH,prefixes:q.NONE,value:20.1168,offset:0},mil:{name:"mil",base:k.LENGTH,prefixes:q.NONE,value:254e-7,offset:0},m2:{name:"m2",base:k.SURFACE,prefixes:q.SQUARED,value:1,offset:0},sqin:{name:"sqin",base:k.SURFACE,prefixes:q.NONE,value:64516e-8,offset:0},sqft:{name:"sqft",base:k.SURFACE,prefixes:q.NONE,value:.09290304,offset:0},sqyd:{name:"sqyd",base:k.SURFACE,prefixes:q.NONE,value:.83612736,offset:0},sqmi:{name:"sqmi",base:k.SURFACE,prefixes:q.NONE,value:2589988.110336,offset:0},sqrd:{name:"sqrd",base:k.SURFACE,prefixes:q.NONE,value:25.29295,offset:0},sqch:{name:"sqch",base:k.SURFACE,prefixes:q.NONE,value:404.6873,offset:0},sqmil:{name:"sqmil",base:k.SURFACE,prefixes:q.NONE,value:6.4516e-10,offset:0},acre:{name:"acre",base:k.SURFACE,prefixes:q.NONE,value:4046.86,offset:0},hectare:{name:"hectare",base:k.SURFACE,prefixes:q.NONE,value:1e4,offset:0},m3:{name:"m3",base:k.VOLUME,prefixes:q.CUBIC,value:1,offset:0},L:{name:"L",base:k.VOLUME,prefixes:q.SHORT,value:.001,offset:0},l:{name:"l",base:k.VOLUME,prefixes:q.SHORT,value:.001,offset:0},litre:{name:"litre",base:k.VOLUME,prefixes:q.LONG,value:.001,offset:0},cuin:{name:"cuin",base:k.VOLUME,prefixes:q.NONE,value:16387064e-12,offset:0},cuft:{name:"cuft",base:k.VOLUME,prefixes:q.NONE,value:.028316846592,offset:0},cuyd:{name:"cuyd",base:k.VOLUME,prefixes:q.NONE,value:.764554857984,offset:0},teaspoon:{name:"teaspoon",base:k.VOLUME,prefixes:q.NONE,value:5e-6,offset:0},tablespoon:{name:"tablespoon",base:k.VOLUME,prefixes:q.NONE,value:15e-6,offset:0},drop:{name:"drop",base:k.VOLUME,prefixes:q.NONE,value:5e-8,offset:0},gtt:{name:"gtt",base:k.VOLUME,prefixes:q.NONE,value:5e-8,offset:0},minim:{name:"minim",base:k.VOLUME,prefixes:q.NONE,value:6.161152e-8,offset:0},fluiddram:{name:"fluiddram",base:k.VOLUME,prefixes:q.NONE,value:36966911e-13,offset:0},fluidounce:{name:"fluidounce",base:k.VOLUME,prefixes:q.NONE,value:2957353e-11,offset:0},gill:{name:"gill",base:k.VOLUME,prefixes:q.NONE,value:.0001182941,offset:0},cc:{name:"cc",base:k.VOLUME,prefixes:q.NONE,value:1e-6,offset:0},cup:{name:"cup",base:k.VOLUME,prefixes:q.NONE,value:.0002365882,offset:0},pint:{name:"pint",base:k.VOLUME,prefixes:q.NONE,value:.0004731765,offset:0},quart:{name:"quart",base:k.VOLUME,prefixes:q.NONE,value:.0009463529,offset:0},gallon:{name:"gallon",base:k.VOLUME,prefixes:q.NONE,value:.003785412,offset:0},beerbarrel:{name:"beerbarrel",base:k.VOLUME,prefixes:q.NONE,value:.1173478,offset:0},oilbarrel:{name:"oilbarrel",base:k.VOLUME,prefixes:q.NONE,value:.1589873,offset:0},hogshead:{name:"hogshead",base:k.VOLUME,prefixes:q.NONE,value:.238481,offset:0},fldr:{name:"fldr",base:k.VOLUME,prefixes:q.NONE,value:36966911e-13,offset:0},floz:{name:"floz",base:k.VOLUME,prefixes:q.NONE,value:2957353e-11,offset:0},gi:{name:"gi",base:k.VOLUME,prefixes:q.NONE,value:.0001182941,offset:0},cp:{name:"cp",base:k.VOLUME,prefixes:q.NONE,value:.0002365882,offset:0},pt:{name:"pt",base:k.VOLUME,prefixes:q.NONE,value:.0004731765,offset:0},qt:{name:"qt",base:k.VOLUME,prefixes:q.NONE,value:.0009463529,offset:0},gal:{name:"gal",base:k.VOLUME,prefixes:q.NONE,value:.003785412,offset:0},bbl:{name:"bbl",base:k.VOLUME,prefixes:q.NONE,value:.1173478,offset:0},obl:{name:"obl",base:k.VOLUME,prefixes:q.NONE,value:.1589873,offset:0},g:{name:"g",base:k.MASS,prefixes:q.SHORT,value:.001,offset:0},gram:{name:"gram",base:k.MASS,prefixes:q.LONG,value:.001,offset:0},ton:{name:"ton",base:k.MASS,prefixes:q.SHORT,value:907.18474,offset:0},t:{name:"t",base:k.MASS,prefixes:q.SHORT,value:1e3,offset:0},tonne:{name:"tonne",base:k.MASS,prefixes:q.LONG,value:1e3,offset:0},grain:{name:"grain",base:k.MASS,prefixes:q.NONE,value:6479891e-11,offset:0},dram:{name:"dram",base:k.MASS,prefixes:q.NONE,value:.0017718451953125,offset:0},ounce:{name:"ounce",base:k.MASS,prefixes:q.NONE,value:.028349523125,offset:0},poundmass:{name:"poundmass",base:k.MASS,prefixes:q.NONE,value:.45359237,offset:0},hundredweight:{name:"hundredweight",base:k.MASS,prefixes:q.NONE,value:45.359237,offset:0},stick:{name:"stick",base:k.MASS,prefixes:q.NONE,value:.115,offset:0},stone:{name:"stone",base:k.MASS,prefixes:q.NONE,value:6.35029318,offset:0},gr:{name:"gr",base:k.MASS,prefixes:q.NONE,value:6479891e-11,offset:0},dr:{name:"dr",base:k.MASS,prefixes:q.NONE,value:.0017718451953125,offset:0},oz:{name:"oz",base:k.MASS,prefixes:q.NONE,value:.028349523125,offset:0},lbm:{name:"lbm",base:k.MASS,prefixes:q.NONE,value:.45359237,offset:0},cwt:{name:"cwt",base:k.MASS,prefixes:q.NONE,value:45.359237,offset:0},s:{name:"s",base:k.TIME,prefixes:q.SHORT,value:1,offset:0},min:{name:"min",base:k.TIME,prefixes:q.NONE,value:60,offset:0},h:{name:"h",base:k.TIME,prefixes:q.NONE,value:3600,offset:0},second:{name:"second",base:k.TIME,prefixes:q.LONG,value:1,offset:0},sec:{name:"sec",base:k.TIME,prefixes:q.LONG,value:1,offset:0},minute:{name:"minute",base:k.TIME,prefixes:q.NONE,value:60,offset:0},hour:{name:"hour",base:k.TIME,prefixes:q.NONE,value:3600,offset:0},day:{name:"day",base:k.TIME,prefixes:q.NONE,value:86400,offset:0},week:{name:"week",base:k.TIME,prefixes:q.NONE,value:604800,offset:0},month:{name:"month",base:k.TIME,prefixes:q.NONE,value:2629800,offset:0},year:{name:"year",base:k.TIME,prefixes:q.NONE,value:31557600,offset:0},decade:{name:"decade",base:k.TIME,prefixes:q.NONE,value:315576e3,offset:0},century:{name:"century",base:k.TIME,prefixes:q.NONE,value:315576e4,offset:0},millennium:{name:"millennium",base:k.TIME,prefixes:q.NONE,value:315576e5,offset:0},hertz:{name:"Hertz",base:k.FREQUENCY,prefixes:q.LONG,value:1,offset:0,reciprocal:!0},Hz:{name:"Hz",base:k.FREQUENCY,prefixes:q.SHORT,value:1,offset:0,reciprocal:!0},rad:{name:"rad",base:k.ANGLE,prefixes:q.SHORT,value:1,offset:0},radian:{name:"radian",base:k.ANGLE,prefixes:q.LONG,value:1,offset:0},deg:{name:"deg",base:k.ANGLE,prefixes:q.SHORT,value:null,offset:0},degree:{name:"degree",base:k.ANGLE,prefixes:q.LONG,value:null,offset:0},grad:{name:"grad",base:k.ANGLE,prefixes:q.SHORT,value:null,offset:0},gradian:{name:"gradian",base:k.ANGLE,prefixes:q.LONG,value:null,offset:0},cycle:{name:"cycle",base:k.ANGLE,prefixes:q.NONE,value:null,offset:0},arcsec:{name:"arcsec",base:k.ANGLE,prefixes:q.NONE,value:null,offset:0},arcmin:{name:"arcmin",base:k.ANGLE,prefixes:q.NONE,value:null,offset:0},A:{name:"A",base:k.CURRENT,prefixes:q.SHORT,value:1,offset:0},ampere:{name:"ampere",base:k.CURRENT,prefixes:q.LONG,value:1,offset:0},K:{name:"K",base:k.TEMPERATURE,prefixes:q.SHORT,value:1,offset:0},degC:{name:"degC",base:k.TEMPERATURE,prefixes:q.SHORT,value:1,offset:273.15},degF:{name:"degF",base:k.TEMPERATURE,prefixes:q.SHORT,value:new D(5,9),offset:459.67},degR:{name:"degR",base:k.TEMPERATURE,prefixes:q.SHORT,value:new D(5,9),offset:0},kelvin:{name:"kelvin",base:k.TEMPERATURE,prefixes:q.LONG,value:1,offset:0},celsius:{name:"celsius",base:k.TEMPERATURE,prefixes:q.LONG,value:1,offset:273.15},fahrenheit:{name:"fahrenheit",base:k.TEMPERATURE,prefixes:q.LONG,value:new D(5,9),offset:459.67},rankine:{name:"rankine",base:k.TEMPERATURE,prefixes:q.LONG,value:new D(5,9),offset:0},mol:{name:"mol",base:k.AMOUNT_OF_SUBSTANCE,prefixes:q.SHORT,value:1,offset:0},mole:{name:"mole",base:k.AMOUNT_OF_SUBSTANCE,prefixes:q.LONG,value:1,offset:0},cd:{name:"cd",base:k.LUMINOUS_INTENSITY,prefixes:q.SHORT,value:1,offset:0},candela:{name:"candela",base:k.LUMINOUS_INTENSITY,prefixes:q.LONG,value:1,offset:0},N:{name:"N",base:k.FORCE,prefixes:q.SHORT,value:1,offset:0},newton:{name:"newton",base:k.FORCE,prefixes:q.LONG,value:1,offset:0},dyn:{name:"dyn",base:k.FORCE,prefixes:q.SHORT,value:1e-5,offset:0},dyne:{name:"dyne",base:k.FORCE,prefixes:q.LONG,value:1e-5,offset:0},lbf:{name:"lbf",base:k.FORCE,prefixes:q.NONE,value:4.4482216152605,offset:0},poundforce:{name:"poundforce",base:k.FORCE,prefixes:q.NONE,value:4.4482216152605,offset:0},kip:{name:"kip",base:k.FORCE,prefixes:q.LONG,value:4448.2216,offset:0},kilogramforce:{name:"kilogramforce",base:k.FORCE,prefixes:q.NONE,value:9.80665,offset:0},J:{name:"J",base:k.ENERGY,prefixes:q.SHORT,value:1,offset:0},joule:{name:"joule",base:k.ENERGY,prefixes:q.SHORT,value:1,offset:0},erg:{name:"erg",base:k.ENERGY,prefixes:q.NONE,value:1e-7,offset:0},Wh:{name:"Wh",base:k.ENERGY,prefixes:q.SHORT,value:3600,offset:0},BTU:{name:"BTU",base:k.ENERGY,prefixes:q.BTU,value:1055.05585262,offset:0},eV:{name:"eV",base:k.ENERGY,prefixes:q.SHORT,value:1602176565e-28,offset:0},electronvolt:{name:"electronvolt",base:k.ENERGY,prefixes:q.LONG,value:1602176565e-28,offset:0},W:{name:"W",base:k.POWER,prefixes:q.SHORT,value:1,offset:0},watt:{name:"watt",base:k.POWER,prefixes:q.LONG,value:1,offset:0},hp:{name:"hp",base:k.POWER,prefixes:q.NONE,value:745.6998715386,offset:0},VAR:{name:"VAR",base:k.POWER,prefixes:q.SHORT,value:w.I,offset:0},VA:{name:"VA",base:k.POWER,prefixes:q.SHORT,value:1,offset:0},Pa:{name:"Pa",base:k.PRESSURE,prefixes:q.SHORT,value:1,offset:0},psi:{name:"psi",base:k.PRESSURE,prefixes:q.NONE,value:6894.75729276459,offset:0},atm:{name:"atm",base:k.PRESSURE,prefixes:q.NONE,value:101325,offset:0},bar:{name:"bar",base:k.PRESSURE,prefixes:q.SHORTLONG,value:1e5,offset:0},torr:{name:"torr",base:k.PRESSURE,prefixes:q.NONE,value:133.322,offset:0},mmHg:{name:"mmHg",base:k.PRESSURE,prefixes:q.NONE,value:133.322,offset:0},mmH2O:{name:"mmH2O",base:k.PRESSURE,prefixes:q.NONE,value:9.80665,offset:0},cmH2O:{name:"cmH2O",base:k.PRESSURE,prefixes:q.NONE,value:98.0665,offset:0},coulomb:{name:"coulomb",base:k.ELECTRIC_CHARGE,prefixes:q.LONG,value:1,offset:0},C:{name:"C",base:k.ELECTRIC_CHARGE,prefixes:q.SHORT,value:1,offset:0},farad:{name:"farad",base:k.ELECTRIC_CAPACITANCE,prefixes:q.LONG,value:1,offset:0},F:{name:"F",base:k.ELECTRIC_CAPACITANCE,prefixes:q.SHORT,value:1,offset:0},volt:{name:"volt",base:k.ELECTRIC_POTENTIAL,prefixes:q.LONG,value:1,offset:0},V:{name:"V",base:k.ELECTRIC_POTENTIAL,prefixes:q.SHORT,value:1,offset:0},ohm:{name:"ohm",base:k.ELECTRIC_RESISTANCE,prefixes:q.SHORTLONG,value:1,offset:0},henry:{name:"henry",base:k.ELECTRIC_INDUCTANCE,prefixes:q.LONG,value:1,offset:0},H:{name:"H",base:k.ELECTRIC_INDUCTANCE,prefixes:q.SHORT,value:1,offset:0},siemens:{name:"siemens",base:k.ELECTRIC_CONDUCTANCE,prefixes:q.LONG,value:1,offset:0},S:{name:"S",base:k.ELECTRIC_CONDUCTANCE,prefixes:q.SHORT,value:1,offset:0},weber:{name:"weber",base:k.MAGNETIC_FLUX,prefixes:q.LONG,value:1,offset:0},Wb:{name:"Wb",base:k.MAGNETIC_FLUX,prefixes:q.SHORT,value:1,offset:0},tesla:{name:"tesla",base:k.MAGNETIC_FLUX_DENSITY,prefixes:q.LONG,value:1,offset:0},T:{name:"T",base:k.MAGNETIC_FLUX_DENSITY,prefixes:q.SHORT,value:1,offset:0},b:{name:"b",base:k.BIT,prefixes:q.BINARY_SHORT,value:1,offset:0},bits:{name:"bits",base:k.BIT,prefixes:q.BINARY_LONG,value:1,offset:0},B:{name:"B",base:k.BIT,prefixes:q.BINARY_SHORT,value:8,offset:0},bytes:{name:"bytes",base:k.BIT,prefixes:q.BINARY_LONG,value:8,offset:0}},j={meters:"meter",inches:"inch",feet:"foot",yards:"yard",miles:"mile",links:"link",rods:"rod",chains:"chain",angstroms:"angstrom",lt:"l",litres:"litre",liter:"litre",liters:"litre",teaspoons:"teaspoon",tablespoons:"tablespoon",minims:"minim",fluiddrams:"fluiddram",fluidounces:"fluidounce",gills:"gill",cups:"cup",pints:"pint",quarts:"quart",gallons:"gallon",beerbarrels:"beerbarrel",oilbarrels:"oilbarrel",hogsheads:"hogshead",gtts:"gtt",grams:"gram",tons:"ton",tonnes:"tonne",grains:"grain",drams:"dram",ounces:"ounce",poundmasses:"poundmass",hundredweights:"hundredweight",sticks:"stick",lb:"lbm",lbs:"lbm",kips:"kip",kgf:"kilogramforce",acres:"acre",hectares:"hectare",sqfeet:"sqft",sqyard:"sqyd",sqmile:"sqmi",sqmiles:"sqmi",mmhg:"mmHg",mmh2o:"mmH2O",cmh2o:"cmH2O",seconds:"second",secs:"second",minutes:"minute",mins:"minute",hours:"hour",hr:"hour",hrs:"hour",days:"day",weeks:"week",months:"month",years:"year",decades:"decade",centuries:"century",millennia:"millennium",hertz:"hertz",radians:"radian",degrees:"degree",gradians:"gradian",cycles:"cycle",arcsecond:"arcsec",arcseconds:"arcsec",arcminute:"arcmin",arcminutes:"arcmin",BTUs:"BTU",watts:"watt",joules:"joule",amperes:"ampere",amps:"ampere",amp:"ampere",coulombs:"coulomb",volts:"volt",ohms:"ohm",farads:"farad",webers:"weber",teslas:"tesla",electronvolts:"electronvolt",moles:"mole",bit:"bits",byte:"bytes"};function L(e){if("BigNumber"===e.number){var r=Al(N);U.rad.value=new N(1),U.deg.value=r.div(180),U.grad.value=r.div(200),U.cycle.value=r.times(2),U.arcsec.value=r.div(648e3),U.arcmin.value=r.div(10800)}else U.rad.value=1,U.deg.value=Math.PI/180,U.grad.value=Math.PI/200,U.cycle.value=2*Math.PI,U.arcsec.value=Math.PI/648e3,U.arcmin.value=Math.PI/10800;U.radian.value=U.rad.value,U.degree.value=U.deg.value,U.gradian.value=U.grad.value}L(o),a&&a("config",(function(e,r){e.number!==r.number&&L(e)}));var H={si:{NONE:{unit:P,prefix:q.NONE[""]},LENGTH:{unit:U.m,prefix:q.SHORT[""]},MASS:{unit:U.g,prefix:q.SHORT.k},TIME:{unit:U.s,prefix:q.SHORT[""]},CURRENT:{unit:U.A,prefix:q.SHORT[""]},TEMPERATURE:{unit:U.K,prefix:q.SHORT[""]},LUMINOUS_INTENSITY:{unit:U.cd,prefix:q.SHORT[""]},AMOUNT_OF_SUBSTANCE:{unit:U.mol,prefix:q.SHORT[""]},ANGLE:{unit:U.rad,prefix:q.SHORT[""]},BIT:{unit:U.bits,prefix:q.SHORT[""]},FORCE:{unit:U.N,prefix:q.SHORT[""]},ENERGY:{unit:U.J,prefix:q.SHORT[""]},POWER:{unit:U.W,prefix:q.SHORT[""]},PRESSURE:{unit:U.Pa,prefix:q.SHORT[""]},ELECTRIC_CHARGE:{unit:U.C,prefix:q.SHORT[""]},ELECTRIC_CAPACITANCE:{unit:U.F,prefix:q.SHORT[""]},ELECTRIC_POTENTIAL:{unit:U.V,prefix:q.SHORT[""]},ELECTRIC_RESISTANCE:{unit:U.ohm,prefix:q.SHORT[""]},ELECTRIC_INDUCTANCE:{unit:U.H,prefix:q.SHORT[""]},ELECTRIC_CONDUCTANCE:{unit:U.S,prefix:q.SHORT[""]},MAGNETIC_FLUX:{unit:U.Wb,prefix:q.SHORT[""]},MAGNETIC_FLUX_DENSITY:{unit:U.T,prefix:q.SHORT[""]},FREQUENCY:{unit:U.Hz,prefix:q.SHORT[""]}}};H.cgs=JSON.parse(JSON.stringify(H.si)),H.cgs.LENGTH={unit:U.m,prefix:q.SHORT.c},H.cgs.MASS={unit:U.g,prefix:q.SHORT[""]},H.cgs.FORCE={unit:U.dyn,prefix:q.SHORT[""]},H.cgs.ENERGY={unit:U.erg,prefix:q.NONE[""]},H.us=JSON.parse(JSON.stringify(H.si)),H.us.LENGTH={unit:U.ft,prefix:q.NONE[""]},H.us.MASS={unit:U.lbm,prefix:q.NONE[""]},H.us.TEMPERATURE={unit:U.degF,prefix:q.NONE[""]},H.us.FORCE={unit:U.lbf,prefix:q.NONE[""]},H.us.ENERGY={unit:U.BTU,prefix:q.BTU[""]},H.us.POWER={unit:U.hp,prefix:q.NONE[""]},H.us.PRESSURE={unit:U.psi,prefix:q.NONE[""]},H.auto=JSON.parse(JSON.stringify(H.si));var $=H.auto;for(var V in A.setUnitSystem=function(e){if(!Y(H,e))throw new Error("Unit system "+e+" does not exist. Choices are: "+Object.keys(H).join(", "));$=H[e]},A.getUnitSystem=function(){for(var e in H)if(Y(H,e)&&H[e]===$)return e},A.typeConverters={BigNumber:function(e){return null!=e&&e.isFraction?new N(e.n).div(e.d).times(e.s):new N(e+"")},Fraction:function(e){return new D(e)},Complex:function(e){return e},number:function(e){return null!=e&&e.isFraction?b(e):e}},A.prototype._numberConverter=function(){var e=A.typeConverters[this.valueType()];if(e)return e;throw new TypeError('Unsupported Unit value type "'+this.valueType()+'"')},A._getNumberConverter=function(e){if(!A.typeConverters[e])throw new TypeError('Unsupported type "'+e+'"');return A.typeConverters[e]},U)if(Y(U,V)){var W=U[V];W.dimensions=W.base.dimensions}for(var J in j)if(Y(j,J)){var X=U[j[J]],Q={};for(var K in X)Y(X,K)&&(Q[K]=X[K]);Q.name=J,U[J]=Q}return A.isValidAlpha=function(e){return/^[a-zA-Z]$/.test(e)},A.createUnit=function(e,r){if("object"!=typeof e)throw new TypeError("createUnit expects first parameter to be of type 'Object'");if(r&&r.override)for(var t in e)if(Y(e,t)&&A.deleteUnit(t),e[t].aliases)for(var n=0;n0&&!A.isValidAlpha(i)&&!S(i))throw new Error('Invalid unit name (only alphanumeric characters are allowed): "'+e+'"')}}(e);var t,n,a,o=null,s=[],u=0;if(r&&"Unit"===r.type)o=r.clone();else if("string"==typeof r)""!==r&&(t=r);else{if("object"!=typeof r)throw new TypeError('Cannot create unit "'+e+'" from "'+r.toString()+'": expecting "string" or "Unit" or "Object"');t=r.definition,n=r.prefixes,u=r.offset,a=r.baseName,r.aliases&&(s=r.aliases.valueOf())}if(s)for(var c=0;c1e-12){m=!1;break}if(m){f=!0,l.base=k[p];break}}if(!f){a=a||e+"_STUFF";var h={dimensions:o.dimensions.slice(0)};h.key=a,k[a]=h,$[a]={unit:l,prefix:q.NONE[""]},l.base=k[a]}}else{if(a=a||e+"_STUFF",I.indexOf(a)>=0)throw new Error('Cannot create new base unit "'+e+'": a base unit with that name already exists (and cannot be overridden)');for(var g in I.push(a),k)Y(k,g)&&(k[g].dimensions[I.length-1]=0);for(var y={dimensions:[]},v=0;v{var{typed:r,Unit:t}=e;return r(Tl,{Unit:function(e){return e.clone()},string:function(e){return t.isValuelessUnit(e)?new t(null,e):t.parse(e,{allowNoUnits:!0})},"number | BigNumber | Fraction | Complex, string | Unit":function(e,r){return new t(e,r)},"number | BigNumber | Fraction":function(e){return new t(e)},"Array | Matrix":r.referToSelf((e=>r=>Fn(r,e)))})})),_l="sparse",zl=ur(_l,["typed","SparseMatrix"],(e=>{var{typed:r,SparseMatrix:t}=e;return r(_l,{"":function(){return new t([])},string:function(e){return new t([],e)},"Array | Matrix":function(e){return new t(e)},"Array | Matrix, string":function(e,r){return new t(e,r)}})})),ql="createUnit",Il=ur(ql,["typed","Unit"],(e=>{var{typed:r,Unit:t}=e;return r(ql,{"Object, Object":function(e,r){return t.createUnit(e,r)},Object:function(e){return t.createUnit(e,{})},"string, Unit | string | Object, Object":function(e,r,n){var i={};return i[e]=r,t.createUnit(i,n)},"string, Unit | string | Object":function(e,r){var n={};return n[e]=r,t.createUnit(n,{})},string:function(e){var r={};return r[e]={},t.createUnit(r,{})}})})),kl="acos",Rl=ur(kl,["typed","config","Complex"],(e=>{var{typed:r,config:t,Complex:n}=e;return r(kl,{number:function(e){return e>=-1&&e<=1||t.predictable?Math.acos(e):new n(e,0).acos()},Complex:function(e){return e.acos()},BigNumber:function(e){return e.acos()}})})),Pl="acosh",Ul=ur(Pl,["typed","config","Complex"],(e=>{var{typed:r,config:t,Complex:n}=e;return r(Pl,{number:function(e){return e>=1||t.predictable?Mi(e):e<=-1?new n(Math.log(Math.sqrt(e*e-1)-e),Math.PI):new n(e,0).acosh()},Complex:function(e){return e.acosh()},BigNumber:function(e){return e.acosh()}})})),jl="acot",Ll=ur(jl,["typed","BigNumber"],(e=>{var{typed:r,BigNumber:t}=e;return r(jl,{number:Fi,Complex:function(e){return e.acot()},BigNumber:function(e){return new t(1).div(e).atan()}})})),Hl="acoth",$l=ur(Hl,["typed","config","Complex","BigNumber"],(e=>{var{typed:r,config:t,Complex:n,BigNumber:i}=e;return r(Hl,{number:function(e){return e>=1||e<=-1||t.predictable?Bi(e):new n(e,0).acoth()},Complex:function(e){return e.acoth()},BigNumber:function(e){return new i(1).div(e).atanh()}})})),Zl="acsc",Gl=ur(Zl,["typed","config","Complex","BigNumber"],(e=>{var{typed:r,config:t,Complex:n,BigNumber:i}=e;return r(Zl,{number:function(e){return e<=-1||e>=1||t.predictable?Ti(e):new n(e,0).acsc()},Complex:function(e){return e.acsc()},BigNumber:function(e){return new i(1).div(e).asin()}})})),Vl="acsch",Wl=ur(Vl,["typed","BigNumber"],(e=>{var{typed:r,BigNumber:t}=e;return r(Vl,{number:Oi,Complex:function(e){return e.acsch()},BigNumber:function(e){return new t(1).div(e).asinh()}})})),Yl="asec",Jl=ur(Yl,["typed","config","Complex","BigNumber"],(e=>{var{typed:r,config:t,Complex:n,BigNumber:i}=e;return r(Yl,{number:function(e){return e<=-1||e>=1||t.predictable?_i(e):new n(e,0).asec()},Complex:function(e){return e.asec()},BigNumber:function(e){return new i(1).div(e).acos()}})})),Xl="asech",Ql=ur(Xl,["typed","config","Complex","BigNumber"],(e=>{var{typed:r,config:t,Complex:n,BigNumber:i}=e;return r(Xl,{number:function(e){if(e<=1&&e>=-1||t.predictable){var r=1/e;if(r>0||t.predictable)return zi(e);var i=Math.sqrt(r*r-1);return new n(Math.log(i-r),Math.PI)}return new n(e,0).asech()},Complex:function(e){return e.asech()},BigNumber:function(e){return new i(1).div(e).acosh()}})})),Kl="asin",ef=ur(Kl,["typed","config","Complex"],(e=>{var{typed:r,config:t,Complex:n}=e;return r(Kl,{number:function(e){return e>=-1&&e<=1||t.predictable?Math.asin(e):new n(e,0).asin()},Complex:function(e){return e.asin()},BigNumber:function(e){return e.asin()}})})),rf=ur("asinh",["typed"],(e=>{var{typed:r}=e;return r("asinh",{number:qi,Complex:function(e){return e.asinh()},BigNumber:function(e){return e.asinh()}})})),tf=ur("atan",["typed"],(e=>{var{typed:r}=e;return r("atan",{number:function(e){return Math.atan(e)},Complex:function(e){return e.atan()},BigNumber:function(e){return e.atan()}})})),nf="atan2",af=ur(nf,["typed","matrix","equalScalar","BigNumber","DenseMatrix","concat"],(e=>{var{typed:r,matrix:t,equalScalar:n,BigNumber:i,DenseMatrix:a,concat:o}=e,s=Do({typed:r,equalScalar:n}),u=Bo({typed:r}),c=Yo({typed:r,equalScalar:n}),l=$a({typed:r,equalScalar:n}),f=Za({typed:r,DenseMatrix:a}),p=go({typed:r,matrix:t,concat:o});return r(nf,{"number, number":Math.atan2,"BigNumber, BigNumber":(e,r)=>i.atan2(e,r)},p({scalar:"number | BigNumber",SS:c,DS:u,SD:s,Ss:l,sS:f}))})),of="atanh",sf=ur(of,["typed","config","Complex"],(e=>{var{typed:r,config:t,Complex:n}=e;return r(of,{number:function(e){return e<=1&&e>=-1||t.predictable?Ii(e):new n(e,0).atanh()},Complex:function(e){return e.atanh()},BigNumber:function(e){return e.atanh()}})})),uf=ur("trigUnit",["typed"],(e=>{var{typed:r}=e;return{Unit:r.referToSelf((e=>t=>{if(!t.hasBase(t.constructor.BASE_UNITS.ANGLE))throw new TypeError("Unit in function cot is no angle");return r.find(e,t.valueType())(t.value)}))}})),cf=ur("cos",["typed"],(e=>{var{typed:r}=e,t=uf({typed:r});return r("cos",{number:Math.cos,"Complex | BigNumber":e=>e.cos()},t)})),lf="cosh",ff=ur(lf,["typed"],(e=>{var{typed:r}=e;return r(lf,{number:Ce,"Complex | BigNumber":e=>e.cosh()})})),pf=ur("cot",["typed","BigNumber"],(e=>{var{typed:r,BigNumber:t}=e;return r("cot",{number:ki,Complex:e=>e.cot(),BigNumber:e=>new t(1).div(e.tan())},uf({typed:r}))})),mf="coth",df=ur(mf,["typed","BigNumber"],(e=>{var{typed:r,BigNumber:t}=e;return r(mf,{number:Ri,Complex:e=>e.coth(),BigNumber:e=>new t(1).div(e.tanh())})})),hf=ur("csc",["typed","BigNumber"],(e=>{var{typed:r,BigNumber:t}=e;return r("csc",{number:Pi,Complex:e=>e.csc(),BigNumber:e=>new t(1).div(e.sin())},uf({typed:r}))})),gf="csch",yf=ur(gf,["typed","BigNumber"],(e=>{var{typed:r,BigNumber:t}=e;return r(gf,{number:Ui,Complex:e=>e.csch(),BigNumber:e=>new t(1).div(e.sinh())})})),vf=ur("sec",["typed","BigNumber"],(e=>{var{typed:r,BigNumber:t}=e;return r("sec",{number:ji,Complex:e=>e.sec(),BigNumber:e=>new t(1).div(e.cos())},uf({typed:r}))})),xf="sech",bf=ur(xf,["typed","BigNumber"],(e=>{var{typed:r,BigNumber:t}=e;return r(xf,{number:Li,Complex:e=>e.sech(),BigNumber:e=>new t(1).div(e.cosh())})})),wf=ur("sin",["typed"],(e=>{var{typed:r}=e,t=uf({typed:r});return r("sin",{number:Math.sin,"Complex | BigNumber":e=>e.sin()},t)})),Nf="sinh",Df=ur(Nf,["typed"],(e=>{var{typed:r}=e;return r(Nf,{number:Hi,"Complex | BigNumber":e=>e.sinh()})})),Ef=ur("tan",["typed"],(e=>{var{typed:r}=e,t=uf({typed:r});return r("tan",{number:Math.tan,"Complex | BigNumber":e=>e.tan()},t)})),Af=ur("tanh",["typed"],(e=>{var{typed:r}=e;return r("tanh",{number:Me,"Complex | BigNumber":e=>e.tanh()})})),Cf="setCartesian",Sf=ur(Cf,["typed","size","subset","compareNatural","Index","DenseMatrix"],(e=>{var{typed:r,size:t,subset:n,compareNatural:i,Index:a,DenseMatrix:o}=e;return r(Cf,{"Array | Matrix, Array | Matrix":function(e,r){var s=[];if(0!==n(t(e),new a(0))&&0!==n(t(r),new a(0))){var u=Ke(Array.isArray(e)?e:e.toArray()).sort(i),c=Ke(Array.isArray(r)?r:r.toArray()).sort(i);s=[];for(var l=0;l{var{typed:r,size:t,subset:n,compareNatural:i,Index:a,DenseMatrix:o}=e;return r(Mf,{"Array | Matrix, Array | Matrix":function(e,r){var s;if(0===n(t(e),new a(0)))s=[];else{if(0===n(t(r),new a(0)))return Ke(e.toArray());var u,c=ar(Ke(Array.isArray(e)?e:e.toArray()).sort(i)),l=ar(Ke(Array.isArray(r)?r:r.toArray()).sort(i));s=[];for(var f=0;f{var{typed:r,size:t,subset:n,compareNatural:i,Index:a,DenseMatrix:o}=e;return r(Bf,{"Array | Matrix":function(e){var r;if(0===n(t(e),new a(0)))r=[];else{var s=Ke(Array.isArray(e)?e:e.toArray()).sort(i);(r=[]).push(s[0]);for(var u=1;u{var{typed:r,size:t,subset:n,compareNatural:i,Index:a,DenseMatrix:o}=e;return r(Of,{"Array | Matrix, Array | Matrix":function(e,r){var s;if(0===n(t(e),new a(0))||0===n(t(r),new a(0)))s=[];else{var u=ar(Ke(Array.isArray(e)?e:e.toArray()).sort(i)),c=ar(Ke(Array.isArray(r)?r:r.toArray()).sort(i));s=[];for(var l=0;l{var{typed:r,size:t,subset:n,compareNatural:i,Index:a}=e;return r(zf,{"Array | Matrix, Array | Matrix":function(e,r){if(0===n(t(e),new a(0)))return!0;if(0===n(t(r),new a(0)))return!1;for(var o,s=ar(Ke(Array.isArray(e)?e:e.toArray()).sort(i)),u=ar(Ke(Array.isArray(r)?r:r.toArray()).sort(i)),c=0;c{var{typed:r,size:t,subset:n,compareNatural:i,Index:a}=e;return r(If,{"number | BigNumber | Fraction | Complex, Array | Matrix":function(e,r){if(0===n(t(r),new a(0)))return 0;for(var o=Ke(Array.isArray(r)?r:r.toArray()),s=0,u=0;u{var{typed:r,size:t,subset:n,compareNatural:i,Index:a}=e;return r(Rf,{"Array | Matrix":function(e){if(0===n(t(e),new a(0)))return[];for(var r=Ke(Array.isArray(e)?e:e.toArray()).sort(i),s=[],u=0;u.toString(2).length<=r.length;)s.push(o(r,u.toString(2).split("").reverse())),u++;return function(e){for(var r=[],t=e.length-1;t>0;t--)for(var n=0;ne[n+1].length&&(r=e[n],e[n]=e[n+1],e[n+1]=r);return e}(s)}});function o(e,r){for(var t=[],n=0;n{var{typed:r,compareNatural:t}=e;return r(Uf,{"Array | Matrix":function(e){return Array.isArray(e)?Ke(e).length:Ke(e.toArray()).length},"Array | Matrix, boolean":function(e,r){if(!1===r||0===e.length)return Array.isArray(e)?Ke(e).length:Ke(e.toArray()).length;for(var n=Ke(Array.isArray(e)?e:e.toArray()).sort(t),i=1,a=1;a{var{typed:r,size:t,concat:n,subset:i,setDifference:a,Index:o}=e;return r(Lf,{"Array | Matrix, Array | Matrix":function(e,r){if(0===i(t(e),new o(0)))return Ke(r);if(0===i(t(r),new o(0)))return Ke(e);var s=Ke(e),u=Ke(r);return n(a(s,u),a(u,s))}})})),$f="setUnion",Zf=ur($f,["typed","size","concat","subset","setIntersect","setSymDifference","Index"],(e=>{var{typed:r,size:t,concat:n,subset:i,setIntersect:a,setSymDifference:o,Index:s}=e;return r($f,{"Array | Matrix, Array | Matrix":function(e,r){if(0===i(t(e),new s(0)))return Ke(r);if(0===i(t(r),new s(0)))return Ke(e);var u=Ke(e),c=Ke(r);return n(o(u,c),a(u,c))}})})),Gf=ur("add",["typed","matrix","addScalar","equalScalar","DenseMatrix","SparseMatrix","concat"],(e=>{var{typed:r,matrix:t,addScalar:n,equalScalar:i,DenseMatrix:a,SparseMatrix:o,concat:s}=e,u=lo({typed:r}),c=fo({typed:r,equalScalar:i}),l=po({typed:r,DenseMatrix:a}),f=go({typed:r,matrix:t,concat:s});return r("add",{"any, any":n,"any, any, ...any":r.referToSelf((e=>(r,t,n)=>{for(var i=e(r,t),a=0;a{var{typed:r,abs:t,addScalar:n,divideScalar:i,multiplyScalar:a,sqrt:o,smaller:u,isPositive:c}=e;return r(Vf,{"... number | BigNumber":l,Array:l,Matrix:e=>l(Ke(e.toArray()))});function l(e){for(var r=0,l=0,f=0;f{var{typed:r,abs:t,add:n,pow:i,conj:a,sqrt:o,multiply:s,equalScalar:u,larger:c,smaller:l,matrix:f,ctranspose:p,eigs:m}=e;return r(Yf,{number:Math.abs,Complex:function(e){return e.abs()},BigNumber:function(e){return e.abs()},boolean:function(e){return Math.abs(e)},Array:function(e){return g(f(e),2)},Matrix:function(e){return g(e,2)},"Array, number | BigNumber | string":function(e,r){return g(f(e),r)},"Matrix, number | BigNumber | string":function(e,r){return g(e,r)}});function d(e,r){if(r===Number.POSITIVE_INFINITY||"inf"===r)return function(e){var r=0;return e.forEach((function(e){var n=t(e);c(n,r)&&(r=n)}),!0),r}(e);if(r===Number.NEGATIVE_INFINITY||"-inf"===r)return function(e){var r;return e.forEach((function(e){var n=t(e);r&&!l(n,r)||(r=n)}),!0),r||0}(e);if("fro"===r)return g(e,2);if("number"==typeof r&&!isNaN(r)){if(!u(r,0)){var a=0;return e.forEach((function(e){a=n(i(t(e),r),a)}),!0),i(a,1/r)}return Number.POSITIVE_INFINITY}throw new Error("Unsupported parameter value")}function h(e,r){if(1===r)return function(e){var r=[],i=0;return e.forEach((function(e,a){var o=a[1],s=n(r[o]||0,t(e));c(s,i)&&(i=s),r[o]=s}),!0),i}(e);if(r===Number.POSITIVE_INFINITY||"inf"===r)return function(e){var r=[],i=0;return e.forEach((function(e,a){var o=a[0],s=n(r[o]||0,t(e));c(s,i)&&(i=s),r[o]=s}),!0),i}(e);if("fro"===r)return function(e){var r=0;return e.forEach((function(e,t){r=n(r,s(e,a(e)))})),t(o(r))}(e);if(2===r)return function(e){var r=e.size();if(r[0]!==r[1])throw new RangeError("Invalid matrix dimensions");var n=p(e),i=s(n,e),a=m(i).values.toArray(),u=a[a.length-1];return t(o(u))}(e);throw new Error("Unsupported parameter value "+r)}function g(e,r){var t=e.size();if(1===t.length)return d(e,r);if(2===t.length){if(t[0]&&t[1])return h(e,r);throw new RangeError("Invalid matrix dimensions")}}})),Xf=ur("dot",["typed","addScalar","multiplyScalar","conj","size"],(e=>{var{typed:r,addScalar:t,multiplyScalar:n,conj:i,size:a}=e;return r("dot",{"Array | DenseMatrix, Array | DenseMatrix":function(e,a){var u=o(e,a),c=p(e)?e._data:e,l=p(e)?e._datatype:void 0,f=p(a)?a._data:a,m=p(a)?a._datatype:void 0,d=2===s(e).length,h=2===s(a).length,g=t,y=n;if(l&&m&&l===m&&"string"==typeof l){var v=l;g=r.find(t,[v,v]),y=r.find(n,[v,v])}if(!d&&!h){for(var x=y(i(c[0]),f[0]),b=1;bh?m++:d===h&&(c=l(c,f(a[p],u[m])),p++,m++)}return c}});function o(e,r){var t,n,i=s(e),a=s(r);if(1===i.length)t=i[0];else{if(2!==i.length||1!==i[1])throw new RangeError("Expected a column vector, instead got a matrix of size ("+i.join(", ")+")");t=i[0]}if(1===a.length)n=a[0];else{if(2!==a.length||1!==a[1])throw new RangeError("Expected a column vector, instead got a matrix of size ("+a.join(", ")+")");n=a[0]}if(t!==n)throw new RangeError("Vectors must have equal length ("+t+" != "+n+")");if(0===t)throw new RangeError("Cannot calculate the dot product of empty vectors");return t}function s(e){return p(e)?e.size():a(e)}})),Qf=ur("trace",["typed","matrix","add"],(e=>{var{typed:r,matrix:t,add:n}=e;return r("trace",{Array:function(e){return i(t(e))},SparseMatrix:function(e){var r=e._values,t=e._index,i=e._ptr,a=e._size,o=a[0],s=a[1];if(o===s){var u=0;if(r.length>0)for(var c=0;cc)break}return u}throw new RangeError("Matrix must be square (size: "+_e(a)+")")},DenseMatrix:i,any:G});function i(e){var r=e._size,t=e._data;switch(r.length){case 1:if(1===r[0])return G(t[0]);throw new RangeError("Matrix must be square (size: "+_e(r)+")");case 2:var i=r[0];if(i===r[1]){for(var a=0,o=0;o{var{typed:r,Index:t}=e;return r(Kf,{"...number | string | BigNumber | Range | Array | Matrix":function(e){var r=e.map((function(e){return o(e)?e.toNumber():Array.isArray(e)||p(e)?e.map((function(e){return o(e)?e.toNumber():e})):e})),n=new t;return t.apply(n,r),n}})})),rp=new Set(["end"]),tp=ur("Node",["mathWithTransform"],(e=>{var{mathWithTransform:r}=e;return class{get type(){return"Node"}get isNode(){return!0}evaluate(e){return this.compile().evaluate(e)}compile(){var e=this._compile(r,{}),t={};return{evaluate:function(r){var n=xr(r);return function(e){for(var r of[...rp])if(e.has(r))throw new Error('Scope contains an illegal symbol, "'+r+'" is a reserved keyword')}(n),e(n,t,null)}}}_compile(e,r){throw new Error("Method _compile must be implemented by type "+this.type)}forEach(e){throw new Error("Cannot run forEach on a Node interface")}map(e){throw new Error("Cannot run map on a Node interface")}_ifNode(e){if(!k(e))throw new TypeError("Callback function must return a Node");return e}traverse(e){e(this,null,null),function e(r,t){r.forEach((function(r,n,i){t(r,n,i),e(r,t)}))}(this,e)}transform(e){return function r(t,n,i){var a=e(t,n,i);return a!==t?a:t.map(r)}(this,null,null)}filter(e){var r=[];return this.traverse((function(t,n,i){e(t,n,i)&&r.push(t)})),r}clone(){throw new Error("Cannot clone a Node interface")}cloneDeep(){return this.map((function(e){return e.cloneDeep()}))}equals(e){return!!e&&(this.type===e.type&&W(this,e))}toString(e){var r=this._getCustomString(e);return void 0!==r?r:this._toString(e)}toJSON(){throw new Error("Cannot serialize object: toJSON not implemented by "+this.type)}toHTML(e){var r=this._getCustomString(e);return void 0!==r?r:this.toHTML(e)}_toString(){throw new Error("_toString not implemented for "+this.type)}toTex(e){var r=this._getCustomString(e);return void 0!==r?r:this._toTex(e)}_toTex(e){throw new Error("_toTex not implemented for "+this.type)}_getCustomString(e){if(e&&"object"==typeof e)switch(typeof e.handler){case"object":case"undefined":return;case"function":return e.handler(this,e);default:throw new TypeError("Object or function expected as callback")}}getIdentifier(){return this.type}getContent(){return this}}}),{isClass:!0,isNode:!0});function np(e){return e&&e.isIndexError?new Pe(e.index+1,e.min+1,void 0!==e.max?e.max+1:void 0):e}function ip(e){var{subset:r}=e;return function(e,t){try{if(Array.isArray(e))return r(e,t);if(e&&"function"==typeof e.subset)return e.subset(t);if("string"==typeof e)return r(e,t);if("object"==typeof e){if(!t.isObjectProperty())throw new TypeError("Cannot apply a numeric index as object property");return lr(e,t.getObjectProperty())}throw new TypeError("Cannot apply index: unsupported type of object")}catch(e){throw np(e)}}}var ap="AccessorNode",op=ur(ap,["subset","Node"],(e=>{var{subset:r,Node:t}=e,n=ip({subset:r});function i(e){return!(S(e)||M(e)||O(e)||q(e)||R(e)||U(e)||H(e))}class a extends t{constructor(e,r){if(super(),!k(e))throw new TypeError('Node expected for parameter "object"');if(!I(r))throw new TypeError('IndexNode expected for parameter "index"');this.object=e,this.index=r}get name(){return this.index?this.index.isObjectProperty()?this.index.getObjectProperty():"":this.object.name||""}get type(){return ap}get isAccessorNode(){return!0}_compile(e,r){var t=this.object._compile(e,r),i=this.index._compile(e,r);if(this.index.isObjectProperty()){var a=this.index.getObjectProperty();return function(e,r,n){return lr(t(e,r,n),a)}}return function(e,r,a){var o=t(e,r,a),s=i(e,r,o);return n(o,s)}}forEach(e){e(this.object,"object",this),e(this.index,"index",this)}map(e){return new a(this._ifNode(e(this.object,"object",this)),this._ifNode(e(this.index,"index",this)))}clone(){return new a(this.object,this.index)}_toString(e){var r=this.object.toString(e);return i(this.object)&&(r="("+r+")"),r+this.index.toString(e)}toHTML(e){var r=this.object.toHTML(e);return i(this.object)&&(r='('+r+')'),r+this.index.toHTML(e)}_toTex(e){var r=this.object.toTex(e);return i(this.object)&&(r="\\left(' + object + '\\right)"),r+this.index.toTex(e)}toJSON(){return{mathjs:ap,object:this.object,index:this.index}}static fromJSON(e){return new a(e.object,e.index)}}return(0,Tu.Z)(a,"name",ap),a}),{isClass:!0,isNode:!0}),sp="ArrayNode",up=ur(sp,["Node"],(e=>{var{Node:r}=e;class t extends r{constructor(e){if(super(),this.items=e||[],!Array.isArray(this.items)||!this.items.every(k))throw new TypeError("Array containing Nodes expected")}get type(){return sp}get isArrayNode(){return!0}_compile(e,r){var t=er(this.items,(function(t){return t._compile(e,r)}));if("Array"!==e.config.matrix){var n=e.matrix;return function(e,r,i){return n(er(t,(function(t){return t(e,r,i)})))}}return function(e,r,n){return er(t,(function(t){return t(e,r,n)}))}}forEach(e){for(var r=0;r['+this.items.map((function(r){return r.toHTML(e)})).join(',')+']'}_toTex(e){return function r(t,n){var i=t.some(M)&&!t.every(M),a=n||i,o=a?"&":"\\\\",s=t.map((function(t){return t.items?r(t.items,!n):t.toTex(e)})).join(o);return i||!a||a&&!n?"\\begin{bmatrix}"+s+"\\end{bmatrix}":s}(this.items,!1)}}return(0,Tu.Z)(t,"name",sp),t}),{isClass:!0,isNode:!0});var cp=[{AssignmentNode:{},FunctionAssignmentNode:{}},{ConditionalNode:{latexLeftParens:!1,latexRightParens:!1,latexParens:!1}},{"OperatorNode:or":{op:"or",associativity:"left",associativeWith:[]}},{"OperatorNode:xor":{op:"xor",associativity:"left",associativeWith:[]}},{"OperatorNode:and":{op:"and",associativity:"left",associativeWith:[]}},{"OperatorNode:bitOr":{op:"|",associativity:"left",associativeWith:[]}},{"OperatorNode:bitXor":{op:"^|",associativity:"left",associativeWith:[]}},{"OperatorNode:bitAnd":{op:"&",associativity:"left",associativeWith:[]}},{"OperatorNode:equal":{op:"==",associativity:"left",associativeWith:[]},"OperatorNode:unequal":{op:"!=",associativity:"left",associativeWith:[]},"OperatorNode:smaller":{op:"<",associativity:"left",associativeWith:[]},"OperatorNode:larger":{op:">",associativity:"left",associativeWith:[]},"OperatorNode:smallerEq":{op:"<=",associativity:"left",associativeWith:[]},"OperatorNode:largerEq":{op:">=",associativity:"left",associativeWith:[]},RelationalNode:{associativity:"left",associativeWith:[]}},{"OperatorNode:leftShift":{op:"<<",associativity:"left",associativeWith:[]},"OperatorNode:rightArithShift":{op:">>",associativity:"left",associativeWith:[]},"OperatorNode:rightLogShift":{op:">>>",associativity:"left",associativeWith:[]}},{"OperatorNode:to":{op:"to",associativity:"left",associativeWith:[]}},{RangeNode:{}},{"OperatorNode:add":{op:"+",associativity:"left",associativeWith:["OperatorNode:add","OperatorNode:subtract"]},"OperatorNode:subtract":{op:"-",associativity:"left",associativeWith:[]}},{"OperatorNode:multiply":{op:"*",associativity:"left",associativeWith:["OperatorNode:multiply","OperatorNode:divide","Operator:dotMultiply","Operator:dotDivide"]},"OperatorNode:divide":{op:"/",associativity:"left",associativeWith:[],latexLeftParens:!1,latexRightParens:!1,latexParens:!1},"OperatorNode:dotMultiply":{op:".*",associativity:"left",associativeWith:["OperatorNode:multiply","OperatorNode:divide","OperatorNode:dotMultiply","OperatorNode:doDivide"]},"OperatorNode:dotDivide":{op:"./",associativity:"left",associativeWith:[]},"OperatorNode:mod":{op:"mod",associativity:"left",associativeWith:[]}},{"OperatorNode:multiply":{associativity:"left",associativeWith:["OperatorNode:multiply","OperatorNode:divide","Operator:dotMultiply","Operator:dotDivide"]}},{"OperatorNode:unaryPlus":{op:"+",associativity:"right"},"OperatorNode:unaryMinus":{op:"-",associativity:"right"},"OperatorNode:bitNot":{op:"~",associativity:"right"},"OperatorNode:not":{op:"not",associativity:"right"}},{"OperatorNode:pow":{op:"^",associativity:"right",associativeWith:[],latexRightParens:!1},"OperatorNode:dotPow":{op:".^",associativity:"right",associativeWith:[]}},{"OperatorNode:factorial":{op:"!",associativity:"left"}},{"OperatorNode:ctranspose":{op:"'",associativity:"left"}}];function lp(e,r){if(!r||"auto"!==r)return e;for(var t=e;U(t);)t=t.content;return t}function fp(e,r,t,n){var i=e;"keep"!==r&&(i=e.getContent());for(var a=i.getIdentifier(),o=null,s=0;s{var{subset:r,matrix:t,Node:n}=e,i=ip({subset:r}),a=function(e){var{subset:r,matrix:t}=e;return function(e,n,i){try{if(Array.isArray(e))return t(e).subset(n,i).valueOf();if(e&&"function"==typeof e.subset)return e.subset(n,i);if("string"==typeof e)return r(e,n,i);if("object"==typeof e){if(!n.isObjectProperty())throw TypeError("Cannot apply a numeric index as object property");return fr(e,n.getObjectProperty(),i),e}throw new TypeError("Cannot apply index: unsupported type of object")}catch(e){throw np(e)}}}({subset:r,matrix:t});function o(e,r,t){r||(r="keep");var n=fp(e,r,t),i=fp(e.value,r,t);return"all"===r||null!==i&&i<=n}class s extends n{constructor(e,r,t){if(super(),this.object=e,this.index=t?r:null,this.value=t||r,!H(e)&&!S(e))throw new TypeError('SymbolNode or AccessorNode expected as "object"');if(H(e)&&"end"===e.name)throw new Error('Cannot assign to symbol "end"');if(this.index&&!I(this.index))throw new TypeError('IndexNode expected as "index"');if(!k(this.value))throw new TypeError('Node expected as "value"')}get name(){return this.index?this.index.isObjectProperty()?this.index.getObjectProperty():"":this.object.name||""}get type(){return dp}get isAssignmentNode(){return!0}_compile(e,r){var t=this.object._compile(e,r),n=this.index?this.index._compile(e,r):null,o=this.value._compile(e,r),s=this.object.name;if(this.index){if(this.index.isObjectProperty()){var u=this.index.getObjectProperty();return function(e,r,n){var i=t(e,r,n),a=o(e,r,n);return fr(i,u,a),a}}if(H(this.object))return function(e,r,i){var u=t(e,r,i),c=o(e,r,i),l=n(e,r,u);return e.set(s,a(u,l,c)),c};var c=this.object.object._compile(e,r);if(this.object.index.isObjectProperty()){var l=this.object.index.getObjectProperty();return function(e,r,t){var i=c(e,r,t),s=lr(i,l),u=n(e,r,s),f=o(e,r,t);return fr(i,l,a(s,u,f)),f}}var f=this.object.index._compile(e,r);return function(e,r,t){var s=c(e,r,t),u=f(e,r,s),l=i(s,u),p=n(e,r,l),m=o(e,r,t);return a(s,u,a(l,p,m)),m}}if(!H(this.object))throw new TypeError("SymbolNode expected as object");return function(e,r,t){var n=o(e,r,t);return e.set(s,n),n}}forEach(e){e(this.object,"object",this),this.index&&e(this.index,"index",this),e(this.value,"value",this)}map(e){var r=this._ifNode(e(this.object,"object",this)),t=this.index?this._ifNode(e(this.index,"index",this)):null,n=this._ifNode(e(this.value,"value",this));return new s(r,t,n)}clone(){return new s(this.object,this.index,this.value)}_toString(e){var r=this.object.toString(e),t=this.index?this.index.toString(e):"",n=this.value.toString(e);return o(this,e&&e.parenthesis,e&&e.implicit)&&(n="("+n+")"),r+t+" = "+n}toJSON(){return{mathjs:dp,object:this.object,index:this.index,value:this.value}}static fromJSON(e){return new s(e.object,e.index,e.value)}toHTML(e){var r=this.object.toHTML(e),t=this.index?this.index.toHTML(e):"",n=this.value.toHTML(e);return o(this,e&&e.parenthesis,e&&e.implicit)&&(n='('+n+')'),r+t+'='+n}_toTex(e){var r=this.object.toTex(e),t=this.index?this.index.toTex(e):"",n=this.value.toTex(e);return o(this,e&&e.parenthesis,e&&e.implicit)&&(n="\\left(".concat(n,"\\right)")),r+t+":="+n}}return(0,Tu.Z)(s,"name",dp),s}),{isClass:!0,isNode:!0}),gp="BlockNode",yp=ur(gp,["ResultSet","Node"],(e=>{var{ResultSet:r,Node:t}=e;class n extends t{constructor(e){if(super(),!Array.isArray(e))throw new Error("Array expected");this.blocks=e.map((function(e){var r=e&&e.node,t=!e||void 0===e.visible||e.visible;if(!k(r))throw new TypeError('Property "node" must be a Node');if("boolean"!=typeof t)throw new TypeError('Property "visible" must be a boolean');return{node:r,visible:t}}))}get type(){return gp}get isBlockNode(){return!0}_compile(e,t){var n=er(this.blocks,(function(r){return{evaluate:r.node._compile(e,t),visible:r.visible}}));return function(e,t,i){var a=[];return rr(n,(function(r){var n=r.evaluate(e,t,i);r.visible&&a.push(n)})),new r(a)}}forEach(e){for(var r=0;r;')})).join('
')}_toTex(e){return this.blocks.map((function(r){return r.node.toTex(e)+(r.visible?"":";")})).join("\\;\\;\n")}}return(0,Tu.Z)(n,"name",gp),n}),{isClass:!0,isNode:!0}),vp="ConditionalNode",xp=ur(vp,["Node"],(e=>{var{Node:r}=e;class t extends r{constructor(e,r,t){if(super(),!k(e))throw new TypeError("Parameter condition must be a Node");if(!k(r))throw new TypeError("Parameter trueExpr must be a Node");if(!k(t))throw new TypeError("Parameter falseExpr must be a Node");this.condition=e,this.trueExpr=r,this.falseExpr=t}get type(){return vp}get isConditionalNode(){return!0}_compile(e,r){var t=this.condition._compile(e,r),n=this.trueExpr._compile(e,r),i=this.falseExpr._compile(e,r);return function(e,r,a){return function(e){if("number"==typeof e||"boolean"==typeof e||"string"==typeof e)return!!e;if(e){if(o(e))return!e.isZero();if(s(e))return!(!e.re&&!e.im);if(c(e))return!!e.value}if(null==e)return!1;throw new TypeError('Unsupported type of condition "'+Z(e)+'"')}(t(e,r,a))?n(e,r,a):i(e,r,a)}}forEach(e){e(this.condition,"condition",this),e(this.trueExpr,"trueExpr",this),e(this.falseExpr,"falseExpr",this)}map(e){return new t(this._ifNode(e(this.condition,"condition",this)),this._ifNode(e(this.trueExpr,"trueExpr",this)),this._ifNode(e(this.falseExpr,"falseExpr",this)))}clone(){return new t(this.condition,this.trueExpr,this.falseExpr)}_toString(e){var r=e&&e.parenthesis?e.parenthesis:"keep",t=fp(this,r,e&&e.implicit),n=this.condition.toString(e),i=fp(this.condition,r,e&&e.implicit);("all"===r||"OperatorNode"===this.condition.type||null!==i&&i<=t)&&(n="("+n+")");var a=this.trueExpr.toString(e),o=fp(this.trueExpr,r,e&&e.implicit);("all"===r||"OperatorNode"===this.trueExpr.type||null!==o&&o<=t)&&(a="("+a+")");var s=this.falseExpr.toString(e),u=fp(this.falseExpr,r,e&&e.implicit);return("all"===r||"OperatorNode"===this.falseExpr.type||null!==u&&u<=t)&&(s="("+s+")"),n+" ? "+a+" : "+s}toJSON(){return{mathjs:vp,condition:this.condition,trueExpr:this.trueExpr,falseExpr:this.falseExpr}}static fromJSON(e){return new t(e.condition,e.trueExpr,e.falseExpr)}toHTML(e){var r=e&&e.parenthesis?e.parenthesis:"keep",t=fp(this,r,e&&e.implicit),n=this.condition.toHTML(e),i=fp(this.condition,r,e&&e.implicit);("all"===r||"OperatorNode"===this.condition.type||null!==i&&i<=t)&&(n='('+n+')');var a=this.trueExpr.toHTML(e),o=fp(this.trueExpr,r,e&&e.implicit);("all"===r||"OperatorNode"===this.trueExpr.type||null!==o&&o<=t)&&(a='('+a+')');var s=this.falseExpr.toHTML(e),u=fp(this.falseExpr,r,e&&e.implicit);return("all"===r||"OperatorNode"===this.falseExpr.type||null!==u&&u<=t)&&(s='('+s+')'),n+'?'+a+':'+s}_toTex(e){return"\\begin{cases} {"+this.trueExpr.toTex(e)+"}, &\\quad{\\text{if }\\;"+this.condition.toTex(e)+"}\\\\{"+this.falseExpr.toTex(e)+"}, &\\quad{\\text{otherwise}}\\end{cases}"}}return(0,Tu.Z)(t,"name",vp),t}),{isClass:!0,isNode:!0}),bp=t(93907),wp={Alpha:"A",alpha:"\\alpha",Beta:"B",beta:"\\beta",Gamma:"\\Gamma",gamma:"\\gamma",Delta:"\\Delta",delta:"\\delta",Epsilon:"E",epsilon:"\\epsilon",varepsilon:"\\varepsilon",Zeta:"Z",zeta:"\\zeta",Eta:"H",eta:"\\eta",Theta:"\\Theta",theta:"\\theta",vartheta:"\\vartheta",Iota:"I",iota:"\\iota",Kappa:"K",kappa:"\\kappa",varkappa:"\\varkappa",Lambda:"\\Lambda",lambda:"\\lambda",Mu:"M",mu:"\\mu",Nu:"N",nu:"\\nu",Xi:"\\Xi",xi:"\\xi",Omicron:"O",omicron:"o",Pi:"\\Pi",pi:"\\pi",varpi:"\\varpi",Rho:"P",rho:"\\rho",varrho:"\\varrho",Sigma:"\\Sigma",sigma:"\\sigma",varsigma:"\\varsigma",Tau:"T",tau:"\\tau",Upsilon:"\\Upsilon",upsilon:"\\upsilon",Phi:"\\Phi",phi:"\\phi",varphi:"\\varphi",Chi:"X",chi:"\\chi",Psi:"\\Psi",psi:"\\psi",Omega:"\\Omega",omega:"\\omega",true:"\\mathrm{True}",false:"\\mathrm{False}",i:"i",inf:"\\infty",Inf:"\\infty",infinity:"\\infty",Infinity:"\\infty",oo:"\\infty",lim:"\\lim",undefined:"\\mathbf{?}"},Np={transpose:"^\\top",ctranspose:"^H",factorial:"!",pow:"^",dotPow:".^\\wedge",unaryPlus:"+",unaryMinus:"-",bitNot:"\\~",not:"\\neg",multiply:"\\cdot",divide:"\\frac",dotMultiply:".\\cdot",dotDivide:".:",mod:"\\mod",add:"+",subtract:"-",to:"\\rightarrow",leftShift:"<<",rightArithShift:">>",rightLogShift:">>>",equal:"=",unequal:"\\neq",smaller:"<",larger:">",smallerEq:"\\leq",largerEq:"\\geq",bitAnd:"\\&",bitXor:"\\underline{|}",bitOr:"|",and:"\\wedge",xor:"\\veebar",or:"\\vee"},Dp={abs:{1:"\\left|${args[0]}\\right|"},add:{2:"\\left(${args[0]}".concat(Np.add,"${args[1]}\\right)")},cbrt:{1:"\\sqrt[3]{${args[0]}}"},ceil:{1:"\\left\\lceil${args[0]}\\right\\rceil"},cube:{1:"\\left(${args[0]}\\right)^3"},divide:{2:"\\frac{${args[0]}}{${args[1]}}"},dotDivide:{2:"\\left(${args[0]}".concat(Np.dotDivide,"${args[1]}\\right)")},dotMultiply:{2:"\\left(${args[0]}".concat(Np.dotMultiply,"${args[1]}\\right)")},dotPow:{2:"\\left(${args[0]}".concat(Np.dotPow,"${args[1]}\\right)")},exp:{1:"\\exp\\left(${args[0]}\\right)"},expm1:"\\left(e".concat(Np.pow,"{${args[0]}}-1\\right)"),fix:{1:"\\mathrm{${name}}\\left(${args[0]}\\right)"},floor:{1:"\\left\\lfloor${args[0]}\\right\\rfloor"},gcd:"\\gcd\\left(${args}\\right)",hypot:"\\hypot\\left(${args}\\right)",log:{1:"\\ln\\left(${args[0]}\\right)",2:"\\log_{${args[1]}}\\left(${args[0]}\\right)"},log10:{1:"\\log_{10}\\left(${args[0]}\\right)"},log1p:{1:"\\ln\\left(${args[0]}+1\\right)",2:"\\log_{${args[1]}}\\left(${args[0]}+1\\right)"},log2:"\\log_{2}\\left(${args[0]}\\right)",mod:{2:"\\left(${args[0]}".concat(Np.mod,"${args[1]}\\right)")},multiply:{2:"\\left(${args[0]}".concat(Np.multiply,"${args[1]}\\right)")},norm:{1:"\\left\\|${args[0]}\\right\\|",2:void 0},nthRoot:{2:"\\sqrt[${args[1]}]{${args[0]}}"},nthRoots:{2:"\\{y : $y^{args[1]} = {${args[0]}}\\}"},pow:{2:"\\left(${args[0]}\\right)".concat(Np.pow,"{${args[1]}}")},round:{1:"\\left\\lfloor${args[0]}\\right\\rceil",2:void 0},sign:{1:"\\mathrm{${name}}\\left(${args[0]}\\right)"},sqrt:{1:"\\sqrt{${args[0]}}"},square:{1:"\\left(${args[0]}\\right)^2"},subtract:{2:"\\left(${args[0]}".concat(Np.subtract,"${args[1]}\\right)")},unaryMinus:{1:"".concat(Np.unaryMinus,"\\left(${args[0]}\\right)")},unaryPlus:{1:"".concat(Np.unaryPlus,"\\left(${args[0]}\\right)")},bitAnd:{2:"\\left(${args[0]}".concat(Np.bitAnd,"${args[1]}\\right)")},bitNot:{1:Np.bitNot+"\\left(${args[0]}\\right)"},bitOr:{2:"\\left(${args[0]}".concat(Np.bitOr,"${args[1]}\\right)")},bitXor:{2:"\\left(${args[0]}".concat(Np.bitXor,"${args[1]}\\right)")},leftShift:{2:"\\left(${args[0]}".concat(Np.leftShift,"${args[1]}\\right)")},rightArithShift:{2:"\\left(${args[0]}".concat(Np.rightArithShift,"${args[1]}\\right)")},rightLogShift:{2:"\\left(${args[0]}".concat(Np.rightLogShift,"${args[1]}\\right)")},bellNumbers:{1:"\\mathrm{B}_{${args[0]}}"},catalan:{1:"\\mathrm{C}_{${args[0]}}"},stirlingS2:{2:"\\mathrm{S}\\left(${args}\\right)"},arg:{1:"\\arg\\left(${args[0]}\\right)"},conj:{1:"\\left(${args[0]}\\right)^*"},im:{1:"\\Im\\left\\lbrace${args[0]}\\right\\rbrace"},re:{1:"\\Re\\left\\lbrace${args[0]}\\right\\rbrace"},and:{2:"\\left(${args[0]}".concat(Np.and,"${args[1]}\\right)")},not:{1:Np.not+"\\left(${args[0]}\\right)"},or:{2:"\\left(${args[0]}".concat(Np.or,"${args[1]}\\right)")},xor:{2:"\\left(${args[0]}".concat(Np.xor,"${args[1]}\\right)")},cross:{2:"\\left(${args[0]}\\right)\\times\\left(${args[1]}\\right)"},ctranspose:{1:"\\left(${args[0]}\\right)".concat(Np.ctranspose)},det:{1:"\\det\\left(${args[0]}\\right)"},dot:{2:"\\left(${args[0]}\\cdot${args[1]}\\right)"},expm:{1:"\\exp\\left(${args[0]}\\right)"},inv:{1:"\\left(${args[0]}\\right)^{-1}"},pinv:{1:"\\left(${args[0]}\\right)^{+}"},sqrtm:{1:"{${args[0]}}".concat(Np.pow,"{\\frac{1}{2}}")},trace:{1:"\\mathrm{tr}\\left(${args[0]}\\right)"},transpose:{1:"\\left(${args[0]}\\right)".concat(Np.transpose)},combinations:{2:"\\binom{${args[0]}}{${args[1]}}"},combinationsWithRep:{2:"\\left(\\!\\!{\\binom{${args[0]}}{${args[1]}}}\\!\\!\\right)"},factorial:{1:"\\left(${args[0]}\\right)".concat(Np.factorial)},gamma:{1:"\\Gamma\\left(${args[0]}\\right)"},lgamma:{1:"\\ln\\Gamma\\left(${args[0]}\\right)"},equal:{2:"\\left(${args[0]}".concat(Np.equal,"${args[1]}\\right)")},larger:{2:"\\left(${args[0]}".concat(Np.larger,"${args[1]}\\right)")},largerEq:{2:"\\left(${args[0]}".concat(Np.largerEq,"${args[1]}\\right)")},smaller:{2:"\\left(${args[0]}".concat(Np.smaller,"${args[1]}\\right)")},smallerEq:{2:"\\left(${args[0]}".concat(Np.smallerEq,"${args[1]}\\right)")},unequal:{2:"\\left(${args[0]}".concat(Np.unequal,"${args[1]}\\right)")},erf:{1:"erf\\left(${args[0]}\\right)"},max:"\\max\\left(${args}\\right)",min:"\\min\\left(${args}\\right)",variance:"\\mathrm{Var}\\left(${args}\\right)",acos:{1:"\\cos^{-1}\\left(${args[0]}\\right)"},acosh:{1:"\\cosh^{-1}\\left(${args[0]}\\right)"},acot:{1:"\\cot^{-1}\\left(${args[0]}\\right)"},acoth:{1:"\\coth^{-1}\\left(${args[0]}\\right)"},acsc:{1:"\\csc^{-1}\\left(${args[0]}\\right)"},acsch:{1:"\\mathrm{csch}^{-1}\\left(${args[0]}\\right)"},asec:{1:"\\sec^{-1}\\left(${args[0]}\\right)"},asech:{1:"\\mathrm{sech}^{-1}\\left(${args[0]}\\right)"},asin:{1:"\\sin^{-1}\\left(${args[0]}\\right)"},asinh:{1:"\\sinh^{-1}\\left(${args[0]}\\right)"},atan:{1:"\\tan^{-1}\\left(${args[0]}\\right)"},atan2:{2:"\\mathrm{atan2}\\left(${args}\\right)"},atanh:{1:"\\tanh^{-1}\\left(${args[0]}\\right)"},cos:{1:"\\cos\\left(${args[0]}\\right)"},cosh:{1:"\\cosh\\left(${args[0]}\\right)"},cot:{1:"\\cot\\left(${args[0]}\\right)"},coth:{1:"\\coth\\left(${args[0]}\\right)"},csc:{1:"\\csc\\left(${args[0]}\\right)"},csch:{1:"\\mathrm{csch}\\left(${args[0]}\\right)"},sec:{1:"\\sec\\left(${args[0]}\\right)"},sech:{1:"\\mathrm{sech}\\left(${args[0]}\\right)"},sin:{1:"\\sin\\left(${args[0]}\\right)"},sinh:{1:"\\sinh\\left(${args[0]}\\right)"},tan:{1:"\\tan\\left(${args[0]}\\right)"},tanh:{1:"\\tanh\\left(${args[0]}\\right)"},to:{2:"\\left(${args[0]}".concat(Np.to,"${args[1]}\\right)")},numeric:function(e,r){return e.args[0].toTex()},number:{0:"0",1:"\\left(${args[0]}\\right)",2:"\\left(\\left(${args[0]}\\right)${args[1]}\\right)"},string:{0:'\\mathtt{""}',1:"\\mathrm{string}\\left(${args[0]}\\right)"},bignumber:{0:"0",1:"\\left(${args[0]}\\right)"},complex:{0:"0",1:"\\left(${args[0]}\\right)",2:"\\left(\\left(${args[0]}\\right)+".concat(wp.i,"\\cdot\\left(${args[1]}\\right)\\right)")},matrix:{0:"\\begin{bmatrix}\\end{bmatrix}",1:"\\left(${args[0]}\\right)",2:"\\left(${args[0]}\\right)"},sparse:{0:"\\begin{bsparse}\\end{bsparse}",1:"\\left(${args[0]}\\right)"},unit:{1:"\\left(${args[0]}\\right)",2:"\\left(\\left(${args[0]}\\right)${args[1]}\\right)"}},Ep={deg:"^\\circ"};function Ap(e){return bp(e,{preserveFormatting:!0})}function Cp(e,r){return(r=void 0!==r&&r)?Y(Ep,e)?Ep[e]:"\\mathrm{"+Ap(e)+"}":Y(wp,e)?wp[e]:Ap(e)}var Sp="ConstantNode",Mp=ur(Sp,["Node"],(e=>{var{Node:r}=e;class t extends r{constructor(e){super(),this.value=e}get type(){return Sp}get isConstantNode(){return!0}_compile(e,r){var t=this.value;return function(){return t}}forEach(e){}map(e){return this.clone()}clone(){return new t(this.value)}_toString(e){return _e(this.value,e)}toHTML(e){var r=this._toString(e);switch(Z(this.value)){case"number":case"BigNumber":case"Fraction":return''+r+"";case"string":return''+r+"";case"boolean":return''+r+"";case"null":return''+r+"";case"undefined":return''+r+"";default:return''+r+""}}toJSON(){return{mathjs:Sp,value:this.value}}static fromJSON(e){return new t(e.value)}_toTex(e){var r=this._toString(e);switch(Z(this.value)){case"string":return"\\mathtt{"+Ap(r)+"}";case"number":case"BigNumber":if(!isFinite(this.value))return this.value.valueOf()<0?"-\\infty":"\\infty";var t=r.toLowerCase().indexOf("e");return-1!==t?r.substring(0,t)+"\\cdot10^{"+r.substring(t+1)+"}":r;case"Fraction":return this.value.toLatex();default:return r}}}return(0,Tu.Z)(t,"name",Sp),t}),{isClass:!0,isNode:!0}),Fp="FunctionAssignmentNode",Bp=ur(Fp,["typed","Node"],(e=>{var{typed:r,Node:t}=e;function n(e,r,t){var n=fp(e,r,t),i=fp(e.expr,r,t);return"all"===r||null!==i&&i<=n}class i extends t{constructor(e,r,t){if(super(),"string"!=typeof e)throw new TypeError('String expected for parameter "name"');if(!Array.isArray(r))throw new TypeError('Array containing strings or objects expected for parameter "params"');if(!k(t))throw new TypeError('Node expected for parameter "expr"');if(rp.has(e))throw new Error('Illegal function name, "'+e+'" is a reserved keyword');var n=new Set;for(var i of r){var a="string"==typeof i?i:i.name;if(n.has(a))throw new Error('Duplicate parameter name "'.concat(a,'"'));n.add(a)}this.name=e,this.params=r.map((function(e){return e&&e.name||e})),this.types=r.map((function(e){return e&&e.type||"any"})),this.expr=t}get type(){return Fp}get isFunctionAssignmentNode(){return!0}_compile(e,t){var n=Object.create(t);rr(this.params,(function(e){n[e]=!0}));var i=this.expr._compile(e,n),a=this.name,o=this.params,s=ir(this.types,","),u=a+"("+ir(this.params,", ")+")";return function(e,t,n){var c={};c[s]=function(){for(var r=Object.create(t),a=0;a'+qe(this.params[i])+"");var a=this.expr.toHTML(e);return n(this,r,e&&e.implicit)&&(a='('+a+')'),''+qe(this.name)+'('+t.join(',')+')='+a}_toTex(e){var r=e&&e.parenthesis?e.parenthesis:"keep",t=this.expr.toTex(e);return n(this,r,e&&e.implicit)&&(t="\\left(".concat(t,"\\right)")),"\\mathrm{"+this.name+"}\\left("+this.params.map(Cp).join(",")+"\\right):="+t}}return(0,Tu.Z)(i,"name",Fp),i}),{isClass:!0,isNode:!0}),Tp="IndexNode",Op=ur(Tp,["Node","size"],(e=>{var{Node:r,size:t}=e;class n extends r{constructor(e,r){if(super(),this.dimensions=e,this.dotNotation=r||!1,!Array.isArray(e)||!e.every(k))throw new TypeError('Array containing Nodes expected for parameter "dimensions"');if(this.dotNotation&&!this.isObjectProperty())throw new Error("dotNotation only applicable for object properties")}get type(){return Tp}get isIndexNode(){return!0}_compile(e,r){var n=er(this.dimensions,(function(n,i){if(n.filter((e=>e.isSymbolNode&&"end"===e.name)).length>0){var a=Object.create(r);a.end=!0;var o=n._compile(e,a);return function(e,r,n){if(!p(n)&&!f(n)&&!l(n))throw new TypeError('Cannot resolve "end": context must be a Matrix, Array, or string but is '+Z(n));var a=t(n).valueOf(),s=Object.create(r);return s.end=a[i],o(e,s,n)}}return n._compile(e,r)})),i=lr(e,"index");return function(e,r,t){var a=er(n,(function(n){return n(e,r,t)}));return i(...a)}}forEach(e){for(var r=0;r.'+qe(this.getObjectProperty())+"":'['+r.join(',')+']'}_toTex(e){var r=this.dimensions.map((function(r){return r.toTex(e)}));return this.dotNotation?"."+this.getObjectProperty():"_{"+r.join(",")+"}"}}return(0,Tu.Z)(n,"name",Tp),n}),{isClass:!0,isNode:!0}),_p="ObjectNode",zp=ur(_p,["Node"],(e=>{var{Node:r}=e;class t extends r{constructor(e){if(super(),this.properties=e||{},e&&("object"!=typeof e||!Object.keys(e).every((function(r){return k(e[r])}))))throw new TypeError("Object containing Nodes expected")}get type(){return _p}get isObjectNode(){return!0}_compile(e,r){var t={};for(var n in this.properties)if(Y(this.properties,n)){var i=ze(n),a=JSON.parse(i),o=lr(this.properties,n);t[a]=o._compile(e,r)}return function(e,r,n){var i={};for(var a in t)Y(t,a)&&(i[a]=t[a](e,r,n));return i}}forEach(e){for(var r in this.properties)Y(this.properties,r)&&e(this.properties[r],"properties["+ze(r)+"]",this)}map(e){var r={};for(var n in this.properties)Y(this.properties,n)&&(r[n]=this._ifNode(e(this.properties[n],"properties["+ze(n)+"]",this)));return new t(r)}clone(){var e={};for(var r in this.properties)Y(this.properties,r)&&(e[r]=this.properties[r]);return new t(e)}_toString(e){var r=[];for(var t in this.properties)Y(this.properties,t)&&r.push(ze(t)+": "+this.properties[t].toString(e));return"{"+r.join(", ")+"}"}toJSON(){return{mathjs:_p,properties:this.properties}}static fromJSON(e){return new t(e.properties)}toHTML(e){var r=[];for(var t in this.properties)Y(this.properties,t)&&r.push(''+qe(t)+':'+this.properties[t].toHTML(e));return'{'+r.join(',')+'}'}_toTex(e){var r=[];for(var t in this.properties)Y(this.properties,t)&&r.push("\\mathbf{"+t+":} & "+this.properties[t].toTex(e)+"\\\\");return"\\left\\{\\begin{array}{ll}"+r.join("\n")+"\\end{array}\\right\\}"}}return(0,Tu.Z)(t,"name",_p),t}),{isClass:!0,isNode:!0}),qp="OperatorNode",Ip=ur(qp,["Node"],(e=>{var{Node:r}=e;function t(e,r){var n=e;if("auto"===r)for(;U(n);)n=n.content;return!!O(n)||!!P(n)&&t(n.args[0],r)}function n(e,r,n,i,a){var o,s=fp(e,r,n),u=pp(e,r);if("all"===r||i.length>2&&"OperatorNode:add"!==e.getIdentifier()&&"OperatorNode:multiply"!==e.getIdentifier())return i.map((function(e){switch(e.getContent().type){case"ArrayNode":case"ConstantNode":case"SymbolNode":case"ParenthesisNode":return!1;default:return!0}}));switch(i.length){case 0:o=[];break;case 1:var c=fp(i[0],r,n,e);if(a&&null!==c){var l,f;if("keep"===r?(l=i[0].getIdentifier(),f=e.getIdentifier()):(l=i[0].getContent().getIdentifier(),f=e.getContent().getIdentifier()),!1===cp[s][f].latexLeftParens){o=[!1];break}if(!1===cp[c][l].latexParens){o=[!1];break}}if(null===c){o=[!1];break}if(c<=s){o=[!0];break}o=[!1];break;case 2:var p,m,d=fp(i[0],r,n,e),h=mp(e,i[0],r);p=null!==d&&(d===s&&"right"===u&&!h||d=2&&"OperatorNode:multiply"===e.getIdentifier()&&e.implicit&&"all"!==r&&"hide"===n)for(var w=1;w2&&("OperatorNode:add"===this.getIdentifier()||"OperatorNode:multiply"===this.getIdentifier())){var f=i.map((function(r,t){return r=r.toString(e),a[t]&&(r="("+r+")"),r}));return this.implicit&&"OperatorNode:multiply"===this.getIdentifier()&&"hide"===t?f.join(" "):f.join(" "+this.op+" ")}return this.fn+"("+this.args.join(", ")+")"}toJSON(){return{mathjs:qp,op:this.op,fn:this.fn,args:this.args,implicit:this.implicit,isPercentage:this.isPercentage}}static fromJSON(e){return new i(e.op,e.fn,e.args,e.implicit,e.isPercentage)}toHTML(e){var r=e&&e.parenthesis?e.parenthesis:"keep",t=e&&e.implicit?e.implicit:"hide",i=this.args,a=n(this,r,t,i,!1);if(1===i.length){var o=pp(this,r),s=i[0].toHTML(e);return a[0]&&(s='('+s+')'),"right"===o?''+qe(this.op)+""+s:s+''+qe(this.op)+""}if(2===i.length){var u=i[0].toHTML(e),c=i[1].toHTML(e);return a[0]&&(u='('+u+')'),a[1]&&(c='('+c+')'),this.implicit&&"OperatorNode:multiply"===this.getIdentifier()&&"hide"===t?u+''+c:u+''+qe(this.op)+""+c}var l=i.map((function(r,t){return r=r.toHTML(e),a[t]&&(r='('+r+')'),r}));return i.length>2&&("OperatorNode:add"===this.getIdentifier()||"OperatorNode:multiply"===this.getIdentifier())?this.implicit&&"OperatorNode:multiply"===this.getIdentifier()&&"hide"===t?l.join(''):l.join(''+qe(this.op)+""):''+qe(this.fn)+'('+l.join(',')+')'}_toTex(e){var r=e&&e.parenthesis?e.parenthesis:"keep",t=e&&e.implicit?e.implicit:"hide",i=this.args,a=n(this,r,t,i,!0),o=Np[this.fn];if(o=void 0===o?this.op:o,1===i.length){var s=pp(this,r),u=i[0].toTex(e);return a[0]&&(u="\\left(".concat(u,"\\right)")),"right"===s?o+u:u+o}if(2===i.length){var c=i[0],l=c.toTex(e);a[0]&&(l="\\left(".concat(l,"\\right)"));var f,p=i[1].toTex(e);switch(a[1]&&(p="\\left(".concat(p,"\\right)")),f="keep"===r?c.getIdentifier():c.getContent().getIdentifier(),this.getIdentifier()){case"OperatorNode:divide":return o+"{"+l+"}{"+p+"}";case"OperatorNode:pow":switch(l="{"+l+"}",p="{"+p+"}",f){case"ConditionalNode":case"OperatorNode:divide":l="\\left(".concat(l,"\\right)")}break;case"OperatorNode:multiply":if(this.implicit&&"hide"===t)return l+"~"+p}return l+o+p}if(i.length>2&&("OperatorNode:add"===this.getIdentifier()||"OperatorNode:multiply"===this.getIdentifier())){var m=i.map((function(r,t){return r=r.toTex(e),a[t]&&(r="\\left(".concat(r,"\\right)")),r}));return"OperatorNode:multiply"===this.getIdentifier()&&this.implicit&&"hide"===t?m.join("~"):m.join(o)}return"\\mathrm{"+this.fn+"}\\left("+i.map((function(r){return r.toTex(e)})).join(",")+"\\right)"}getIdentifier(){return this.type+":"+this.fn}}return(0,Tu.Z)(i,"name",qp),i}),{isClass:!0,isNode:!0}),kp="ParenthesisNode",Rp=ur(kp,["Node"],(e=>{var{Node:r}=e;class t extends r{constructor(e){if(super(),!k(e))throw new TypeError('Node expected for parameter "content"');this.content=e}get type(){return kp}get isParenthesisNode(){return!0}_compile(e,r){return this.content._compile(e,r)}getContent(){return this.content.getContent()}forEach(e){e(this.content,"content",this)}map(e){var r=e(this.content,"content",this);return new t(r)}clone(){return new t(this.content)}_toString(e){return!e||e&&!e.parenthesis||e&&"keep"===e.parenthesis?"("+this.content.toString(e)+")":this.content.toString(e)}toJSON(){return{mathjs:kp,content:this.content}}static fromJSON(e){return new t(e.content)}toHTML(e){return!e||e&&!e.parenthesis||e&&"keep"===e.parenthesis?'('+this.content.toHTML(e)+')':this.content.toHTML(e)}_toTex(e){return!e||e&&!e.parenthesis||e&&"keep"===e.parenthesis?"\\left(".concat(this.content.toTex(e),"\\right)"):this.content.toTex(e)}}return(0,Tu.Z)(t,"name",kp),t}),{isClass:!0,isNode:!0}),Pp="RangeNode",Up=ur(Pp,["Node"],(e=>{var{Node:r}=e;function t(e,r,t){var n=fp(e,r,t),i={},a=fp(e.start,r,t);if(i.start=null!==a&&a<=n||"all"===r,e.step){var o=fp(e.step,r,t);i.step=null!==o&&o<=n||"all"===r}var s=fp(e.end,r,t);return i.end=null!==s&&s<=n||"all"===r,i}class n extends r{constructor(e,r,t){if(super(),!k(e))throw new TypeError("Node expected");if(!k(r))throw new TypeError("Node expected");if(t&&!k(t))throw new TypeError("Node expected");if(arguments.length>3)throw new Error("Too many arguments");this.start=e,this.end=r,this.step=t||null}get type(){return Pp}get isRangeNode(){return!0}needsEnd(){return this.filter((function(e){return H(e)&&"end"===e.name})).length>0}_compile(e,r){var t=e.range,n=this.start._compile(e,r),i=this.end._compile(e,r);if(this.step){var a=this.step._compile(e,r);return function(e,r,o){return t(n(e,r,o),i(e,r,o),a(e,r,o))}}return function(e,r,a){return t(n(e,r,a),i(e,r,a))}}forEach(e){e(this.start,"start",this),e(this.end,"end",this),this.step&&e(this.step,"step",this)}map(e){return new n(this._ifNode(e(this.start,"start",this)),this._ifNode(e(this.end,"end",this)),this.step&&this._ifNode(e(this.step,"step",this)))}clone(){return new n(this.start,this.end,this.step&&this.step)}_toString(e){var r,n=t(this,e&&e.parenthesis?e.parenthesis:"keep",e&&e.implicit),i=this.start.toString(e);if(n.start&&(i="("+i+")"),r=i,this.step){var a=this.step.toString(e);n.step&&(a="("+a+")"),r+=":"+a}var o=this.end.toString(e);return n.end&&(o="("+o+")"),r+=":"+o}toJSON(){return{mathjs:Pp,start:this.start,end:this.end,step:this.step}}static fromJSON(e){return new n(e.start,e.end,e.step)}toHTML(e){var r,n=t(this,e&&e.parenthesis?e.parenthesis:"keep",e&&e.implicit),i=this.start.toHTML(e);if(n.start&&(i='('+i+')'),r=i,this.step){var a=this.step.toHTML(e);n.step&&(a='('+a+')'),r+=':'+a}var o=this.end.toHTML(e);return n.end&&(o='('+o+')'),r+=':'+o}_toTex(e){var r=t(this,e&&e.parenthesis?e.parenthesis:"keep",e&&e.implicit),n=this.start.toTex(e);if(r.start&&(n="\\left(".concat(n,"\\right)")),this.step){var i=this.step.toTex(e);r.step&&(i="\\left(".concat(i,"\\right)")),n+=":"+i}var a=this.end.toTex(e);return r.end&&(a="\\left(".concat(a,"\\right)")),n+=":"+a}}return(0,Tu.Z)(n,"name",Pp),n}),{isClass:!0,isNode:!0}),jp="RelationalNode",Lp=ur(jp,["Node"],(e=>{var{Node:r}=e,t={equal:"==",unequal:"!=",smaller:"<",larger:">",smallerEq:"<=",largerEq:">="};class n extends r{constructor(e,r){if(super(),!Array.isArray(e))throw new TypeError("Parameter conditionals must be an array");if(!Array.isArray(r))throw new TypeError("Parameter params must be an array");if(e.length!==r.length-1)throw new TypeError("Parameter params must contain exactly one more element than parameter conditionals");this.conditionals=e,this.params=r}get type(){return jp}get isRelationalNode(){return!0}_compile(e,r){var t=this,n=this.params.map((t=>t._compile(e,r)));return function(r,i,a){for(var o,s=n[0](r,i,a),u=0;ue(r,"params["+t+"]",this)),this)}map(e){return new n(this.conditionals.slice(),this.params.map(((r,t)=>this._ifNode(e(r,"params["+t+"]",this))),this))}clone(){return new n(this.conditionals,this.params)}_toString(e){for(var r=e&&e.parenthesis?e.parenthesis:"keep",n=fp(this,r,e&&e.implicit),i=this.params.map((function(t,i){var a=fp(t,r,e&&e.implicit);return"all"===r||null!==a&&a<=n?"("+t.toString(e)+")":t.toString(e)})),a=i[0],o=0;o('+t.toHTML(e)+')':t.toHTML(e)})),a=i[0],o=0;o'+qe(t[this.conditionals[o]])+""+i[o+1];return a}_toTex(e){for(var r=e&&e.parenthesis?e.parenthesis:"keep",t=fp(this,r,e&&e.implicit),n=this.params.map((function(n,i){var a=fp(n,r,e&&e.implicit);return"all"===r||null!==a&&a<=t?"\\left("+n.toTex(e)+"\right)":n.toTex(e)})),i=n[0],a=0;a{var{math:r,Unit:t,Node:n}=e;function i(e){return!!t&&t.isValuelessUnit(e)}class a extends n{constructor(e){if(super(),"string"!=typeof e)throw new TypeError('String expected for parameter "name"');this.name=e}get type(){return"SymbolNode"}get isSymbolNode(){return!0}_compile(e,r){var n=this.name;if(!0===r[n])return function(e,r,t){return lr(r,n)};if(n in e)return function(r,t,i){return r.has(n)?r.get(n):lr(e,n)};var o=i(n);return function(e,r,i){return e.has(n)?e.get(n):o?new t(null,n):a.onUndefinedSymbol(n)}}forEach(e){}map(e){return this.clone()}static onUndefinedSymbol(e){throw new Error("Undefined symbol "+e)}clone(){return new a(this.name)}_toString(e){return this.name}toHTML(e){var r=qe(this.name);return"true"===r||"false"===r?''+r+"":"i"===r?''+r+"":"Infinity"===r?''+r+"":"NaN"===r?''+r+"":"null"===r?''+r+"":"undefined"===r?''+r+"":''+r+""}toJSON(){return{mathjs:"SymbolNode",name:this.name}}static fromJSON(e){return new a(e.name)}_toTex(e){var t=!1;void 0===r[this.name]&&i(this.name)&&(t=!0);var n=Cp(this.name,t);return"\\"===n[0]?n:" "+n}}return a}),{isClass:!0,isNode:!0});function $p(e){for(var r=arguments.length,t=new Array(r>1?r-1:0),n=1;n{var{math:r,Node:t,SymbolNode:n}=e,i=e=>_e(e,{truncate:78});function a(e,r,t){for(var n,i="",a=/\$(?:\{([a-z_][a-z_0-9]*)(?:\[([0-9]+)\])?\}|\$)/gi,o=0;null!==(n=a.exec(e));)if(i+=e.substring(o,n.index),o=n.index,"$$"===n[0])i+="$",o++;else{o+=n[0].length;var s=r[n[1]];if(!s)throw new ReferenceError("Template: Property "+n[1]+" does not exist.");if(void 0===n[2])switch(typeof s){case"string":i+=s;break;case"object":if(k(s))i+=s.toTex(t);else{if(!Array.isArray(s))throw new TypeError("Template: "+n[1]+" has to be a Node, String or array of Nodes");i+=s.map((function(e,r){if(k(e))return e.toTex(t);throw new TypeError("Template: "+n[1]+"["+r+"] is not a Node.")})).join(",")}break;default:throw new TypeError("Template: "+n[1]+" has to be a Node, String or array of Nodes")}else{if(!k(s[n[2]]&&s[n[2]]))throw new TypeError("Template: "+n[1]+"["+n[2]+"] is not a Node.");i+=s[n[2]].toTex(t)}}return i+=e.slice(o)}class o extends t{constructor(e,r){if(super(),"string"==typeof e&&(e=new n(e)),!k(e))throw new TypeError('Node expected as parameter "fn"');if(!Array.isArray(r)||!r.every(k))throw new TypeError('Array containing Nodes expected for parameter "args"');this.fn=e,this.args=r||[]}get name(){return this.fn.name||""}get type(){return Zp}get isFunctionNode(){return!0}_compile(e,r){var t=this.args.map((t=>t._compile(e,r)));if(!H(this.fn)){if(S(this.fn)&&I(this.fn.index)&&this.fn.index.isObjectProperty()){var n=this.fn.object._compile(e,r),a=this.fn.index.getObjectProperty(),s=this.args;return function(r,i,o){var u=n(r,i,o),c=function(e,r){if(!mr(e,r))throw new Error('No access to method "'+r+'"');return e[r]}(u,a);if(null!=c&&c.rawArgs)return c(s,e,$p(r,i),r);var l=t.map((e=>e(r,i,o)));return c.apply(u,l)}}var u=this.fn.toString(),c=this.fn._compile(e,r),l=this.args;return function(r,n,a){var o=c(r,n,a);if("function"!=typeof o)throw new TypeError("Expression '".concat(u,"' did not evaluate to a function; value is:")+"\n ".concat(i(o)));if(o.rawArgs)return o(l,e,$p(r,n),r);var s=t.map((e=>e(r,n,a)));return o.apply(o,s)}}var f=this.fn.name;if(r[f]){var p=this.args;return function(r,n,a){var o=lr(n,f);if("function"!=typeof o)throw new TypeError("Argument '".concat(f,"' was not a function; received: ").concat(i(o)));if(o.rawArgs)return o(p,e,$p(r,n),r);var s=t.map((e=>e(r,n,a)));return o.apply(o,s)}}var m=f in e?lr(e,f):void 0,d="function"==typeof m&&!0===m.rawArgs,h=r=>{var t;if(r.has(f))t=r.get(f);else{if(!(f in e))return o.onUndefinedFunction(f);t=lr(e,f)}if("function"==typeof t)return t;throw new TypeError("'".concat(f,"' is not a function; its value is:\n ").concat(i(t)))};if(d){var g=this.args;return function(r,t,n){return h(r)(g,e,$p(r,t),r)}}switch(t.length){case 0:return function(e,r,t){return h(e)()};case 1:return function(e,r,n){return h(e)((0,t[0])(e,r,n))};case 2:return function(e,r,n){var i=h(e),a=t[0],o=t[1];return i(a(e,r,n),o(e,r,n))};default:return function(e,r,n){return h(e)(...t.map((t=>t(e,r,n))))}}}forEach(e){e(this.fn,"fn",this);for(var r=0;r'+qe(this.fn)+'('+r.join(',')+')'}toTex(e){var r;return e&&"object"==typeof e.handler&&Y(e.handler,this.name)&&(r=e.handler[this.name](this,e)),void 0!==r?r:super.toTex(e)}_toTex(e){var t,n,i=this.args.map((function(r){return r.toTex(e)}));switch(Dp[this.name]&&(t=Dp[this.name]),!r[this.name]||"function"!=typeof r[this.name].toTex&&"object"!=typeof r[this.name].toTex&&"string"!=typeof r[this.name].toTex||(t=r[this.name].toTex),typeof t){case"function":n=t(this,e);break;case"string":n=a(t,this,e);break;case"object":switch(typeof t[i.length]){case"function":n=t[i.length](this,e);break;case"string":n=a(t[i.length],this,e)}}return void 0!==n?n:a("\\mathrm{${name}}\\left(${args}\\right)",this,e)}getIdentifier(){return this.type+":"+this.name}}return(0,Tu.Z)(o,"name",Zp),(0,Tu.Z)(o,"onUndefinedFunction",(function(e){throw new Error("Undefined function "+e)})),(0,Tu.Z)(o,"fromJSON",(function(e){return new o(e.fn,e.args)})),o}),{isClass:!0,isNode:!0}),Vp="parse",Wp=ur(Vp,["typed","numeric","config","AccessorNode","ArrayNode","AssignmentNode","BlockNode","ConditionalNode","ConstantNode","FunctionAssignmentNode","FunctionNode","IndexNode","ObjectNode","OperatorNode","ParenthesisNode","RangeNode","RelationalNode","SymbolNode"],(e=>{var{typed:r,numeric:t,config:i,AccessorNode:a,ArrayNode:o,AssignmentNode:s,BlockNode:u,ConditionalNode:c,ConstantNode:l,FunctionAssignmentNode:f,FunctionNode:p,IndexNode:m,ObjectNode:d,OperatorNode:h,ParenthesisNode:g,RangeNode:y,RelationalNode:v,SymbolNode:x}=e,b=r(Vp,{string:function(e){return j(e,{})},"Array | Matrix":function(e){return w(e,{})},"string, Object":function(e,r){return j(e,void 0!==r.nodes?r.nodes:{})},"Array | Matrix, Object":w});function w(e){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},t=void 0!==r.nodes?r.nodes:{};return Fn(e,(function(e){if("string"!=typeof e)throw new TypeError("String expected");return j(e,t)}))}var N={NULL:0,DELIMITER:1,NUMBER:2,SYMBOL:3,UNKNOWN:4},D={",":!0,"(":!0,")":!0,"[":!0,"]":!0,"{":!0,"}":!0,'"':!0,"'":!0,";":!0,"+":!0,"-":!0,"*":!0,".*":!0,"/":!0,"./":!0,"%":!0,"^":!0,".^":!0,"~":!0,"!":!0,"&":!0,"|":!0,"^|":!0,"=":!0,":":!0,"?":!0,"==":!0,"!=":!0,"<":!0,">":!0,"<=":!0,">=":!0,"<<":!0,">>":!0,">>>":!0},E={mod:!0,to:!0,in:!0,and:!0,xor:!0,or:!0,not:!0},A={true:!0,false:!1,null:null,undefined:void 0},C=["NaN","Infinity"];function M(e,r){return e.expression.substr(e.index,r)}function F(e){return M(e,1)}function B(e){e.index++}function T(e){return e.expression.charAt(e.index-1)}function z(e){return e.expression.charAt(e.index+1)}function I(e){for(e.tokenType=N.NULL,e.token="",e.comment="";;){if("#"===F(e))for(;"\n"!==F(e)&&""!==F(e);)e.comment+=F(e),B(e);if(!b.isWhitespace(F(e),e.nestingLevel))break;B(e)}if(""!==F(e)){if("\n"===F(e)&&!e.nestingLevel)return e.tokenType=N.DELIMITER,e.token=F(e),void B(e);var r=F(e),t=M(e,2),n=M(e,3);if(3===n.length&&D[n])return e.tokenType=N.DELIMITER,e.token=n,B(e),B(e),void B(e);if(2===t.length&&D[t])return e.tokenType=N.DELIMITER,e.token=t,B(e),void B(e);if(D[r])return e.tokenType=N.DELIMITER,e.token=r,void B(e);if(b.isDigitDot(r)){e.tokenType=N.NUMBER;var i=M(e,2);if("0b"===i||"0o"===i||"0x"===i){for(e.token+=F(e),B(e),e.token+=F(e),B(e);b.isHexDigit(F(e));)e.token+=F(e),B(e);if("."===F(e))for(e.token+=".",B(e);b.isHexDigit(F(e));)e.token+=F(e),B(e);else if("i"===F(e))for(e.token+="i",B(e);b.isDigit(F(e));)e.token+=F(e),B(e);return}if("."===F(e)){if(e.token+=F(e),B(e),!b.isDigit(F(e)))return void(e.tokenType=N.DELIMITER)}else{for(;b.isDigit(F(e));)e.token+=F(e),B(e);b.isDecimalMark(F(e),z(e))&&(e.token+=F(e),B(e))}for(;b.isDigit(F(e));)e.token+=F(e),B(e);if("E"===F(e)||"e"===F(e))if(b.isDigit(z(e))||"-"===z(e)||"+"===z(e)){if(e.token+=F(e),B(e),"+"!==F(e)&&"-"!==F(e)||(e.token+=F(e),B(e)),!b.isDigit(F(e)))throw fe(e,'Digit expected, got "'+F(e)+'"');for(;b.isDigit(F(e));)e.token+=F(e),B(e);if(b.isDecimalMark(F(e),z(e)))throw fe(e,'Digit expected, got "'+F(e)+'"')}else if("."===z(e))throw B(e),fe(e,'Digit expected, got "'+F(e)+'"')}else{if(!b.isAlpha(F(e),T(e),z(e))){for(e.tokenType=N.UNKNOWN;""!==F(e);)e.token+=F(e),B(e);throw fe(e,'Syntax error in part "'+e.token+'"')}for(;b.isAlpha(F(e),T(e),z(e))||b.isDigit(F(e));)e.token+=F(e),B(e);Y(E,e.token)?e.tokenType=N.DELIMITER:e.tokenType=N.SYMBOL}}else e.tokenType=N.DELIMITER}function k(e){do{I(e)}while("\n"===e.token)}function R(e){e.nestingLevel++}function U(e){e.nestingLevel--}function j(e,r){var t={extraNodes:{},expression:"",comment:"",index:0,token:"",tokenType:N.NULL,nestingLevel:0,conditionalLevel:null};(0,n.Z)(t,{expression:e,extraNodes:r}),I(t);var i=function(e){var r,t,n=[];""!==e.token&&"\n"!==e.token&&";"!==e.token&&(r=L(e),e.comment&&(r.comment=e.comment));for(;"\n"===e.token||";"===e.token;)0===n.length&&r&&(t=";"!==e.token,n.push({node:r,visible:t})),I(e),"\n"!==e.token&&";"!==e.token&&""!==e.token&&(r=L(e),e.comment&&(r.comment=e.comment),t=";"!==e.token,n.push({node:r,visible:t}));return n.length>0?new u(n):(r||(r=new l(void 0),e.comment&&(r.comment=e.comment)),r)}(t);if(""!==t.token)throw t.tokenType===N.DELIMITER?pe(t,"Unexpected operator "+t.token):fe(t,'Unexpected part "'+t.token+'"');return i}function L(e){var r,t,n,i,a=function(e){var r=function(e){var r=$(e);for(;"or"===e.token;)k(e),r=new h("or","or",[r,$(e)]);return r}(e);for(;"?"===e.token;){var t=e.conditionalLevel;e.conditionalLevel=e.nestingLevel,k(e);var n=r,i=L(e);if(":"!==e.token)throw fe(e,"False part of conditional expression expected");e.conditionalLevel=null,k(e);var a=L(e);r=new c(n,i,a),e.conditionalLevel=t}return r}(e);if("="===e.token){if(H(a))return r=a.name,k(e),n=L(e),new s(new x(r),n);if(S(a))return k(e),n=L(e),new s(a.object,a.index,n);if(q(a)&&H(a.fn)&&(i=!0,t=[],r=a.name,a.args.forEach((function(e,r){H(e)?t[r]=e.name:i=!1})),i))return k(e),n=L(e),new f(r,t,n);throw fe(e,"Invalid left hand side of assignment operator =")}return a}function $(e){for(var r=Z(e);"xor"===e.token;)k(e),r=new h("xor","xor",[r,Z(e)]);return r}function Z(e){for(var r=G(e);"and"===e.token;)k(e),r=new h("and","and",[r,G(e)]);return r}function G(e){for(var r=V(e);"|"===e.token;)k(e),r=new h("|","bitOr",[r,V(e)]);return r}function V(e){for(var r=W(e);"^|"===e.token;)k(e),r=new h("^|","bitXor",[r,W(e)]);return r}function W(e){for(var r=J(e);"&"===e.token;)k(e),r=new h("&","bitAnd",[r,J(e)]);return r}function J(e){for(var r=[X(e)],t=[],n={"==":"equal","!=":"unequal","<":"smaller",">":"larger","<=":"smallerEq",">=":"largerEq"};Y(n,e.token);){var i={name:e.token,fn:n[e.token]};t.push(i),k(e),r.push(X(e))}return 1===r.length?r[0]:2===r.length?new h(t[0].name,t[0].fn,r):new v(t.map((e=>e.fn)),r)}function X(e){var r,t,n,i;r=Q(e);for(var a={"<<":"leftShift",">>":"rightArithShift",">>>":"rightLogShift"};Y(a,e.token);)n=a[t=e.token],k(e),i=[r,Q(e)],r=new h(t,n,i);return r}function Q(e){var r,t,n,i;r=K(e);for(var a={to:"to",in:"to"};Y(a,e.token);)n=a[t=e.token],k(e),"in"===t&&""===e.token?r=new h("*","multiply",[r,new x("in")],!0):(i=[r,K(e)],r=new h(t,n,i));return r}function K(e){var r,t=[];if(r=":"===e.token?new l(1):ee(e),":"===e.token&&e.conditionalLevel!==e.nestingLevel){for(t.push(r);":"===e.token&&t.length<3;)k(e),")"===e.token||"]"===e.token||","===e.token||""===e.token?t.push(new x("end")):t.push(ee(e));r=3===t.length?new y(t[0],t[2],t[1]):new y(t[0],t[1])}return r}function ee(e){var r,t,n,i;r=re(e);for(var a={"+":"add","-":"subtract"};Y(a,e.token);){n=a[t=e.token],k(e);var o=re(e);i=o.isPercentage?[r,new h("*","multiply",[r,o])]:[r,o],r=new h(t,n,i)}return r}function re(e){var r,t,n,i;t=r=te(e);for(var a={"*":"multiply",".*":"dotMultiply","/":"divide","./":"dotDivide"};Y(a,e.token);)i=a[n=e.token],k(e),t=te(e),r=new h(n,i,[r,t]);return r}function te(e){var r,t;for(t=r=ne(e);e.tokenType===N.SYMBOL||"in"===e.token&&O(r)||!(e.tokenType!==N.NUMBER||O(t)||P(t)&&"!"!==t.op)||"("===e.token;)t=ne(e),r=new h("*","multiply",[r,t],!0);return r}function ne(e){for(var r=ie(e),t=r,i=[];"/"===e.token&&_(t);){if(i.push((0,n.Z)({},e)),k(e),e.tokenType!==N.NUMBER){(0,n.Z)(e,i.pop());break}if(i.push((0,n.Z)({},e)),k(e),e.tokenType!==N.SYMBOL&&"("!==e.token){i.pop(),(0,n.Z)(e,i.pop());break}(0,n.Z)(e,i.pop()),i.pop(),t=ie(e),r=new h("/","divide",[r,t])}return r}function ie(e){var r,t,n,i;r=ae(e);for(var a={"%":"mod",mod:"mod"};Y(a,e.token);)n=a[t=e.token],k(e),"%"===t&&e.tokenType===N.DELIMITER&&"("!==e.token?r=new h("/","divide",[r,new l(100)],!1,!0):(i=[r,ae(e)],r=new h(t,n,i));return r}function ae(e){var r,n,a,s={"-":"unaryMinus","+":"unaryPlus","~":"bitNot",not:"not"};return Y(s,e.token)?(a=s[e.token],r=e.token,k(e),n=[ae(e)],new h(r,a,n)):function(e){var r,n,a,s;r=function(e){var r,n,a;r=function(e){var r=[];if(e.tokenType===N.SYMBOL&&Y(e.extraNodes,e.token)){var n=e.extraNodes[e.token];if(I(e),"("===e.token){if(r=[],R(e),I(e),")"!==e.token)for(r.push(L(e));","===e.token;)I(e),r.push(L(e));if(")"!==e.token)throw fe(e,"Parenthesis ) expected");U(e),I(e)}return new n(r)}return function(e){var r;if(e.tokenType===N.SYMBOL||e.tokenType===N.DELIMITER&&e.token in E)return r=e.token,I(e),oe(e,Y(A,r)?new l(A[r]):-1!==C.indexOf(r)?new l(t(r,"number")):new x(r));return function(e){var r;if('"'===e.token)return r=se(e),oe(e,new l(r));return function(e){var r;if("'"===e.token)return r=ue(e),oe(e,new l(r));return function(e){var r,n,a,s;if("["===e.token){if(R(e),I(e),"]"!==e.token){var u=ce(e);if(";"===e.token){for(a=1,n=[u];";"===e.token;)I(e),n[a]=ce(e),a++;if("]"!==e.token)throw fe(e,"End of matrix ] expected");U(e),I(e),s=n[0].items.length;for(var c=1;c0},b.isDecimalMark=function(e,r){return"."===e&&"/"!==r&&"*"!==r&&"^"!==r},b.isDigitDot=function(e){return e>="0"&&e<="9"||"."===e},b.isDigit=function(e){return e>="0"&&e<="9"},b.isHexDigit=function(e){return e>="0"&&e<="9"||e>="a"&&e<="f"||e>="A"&&e<="F"},r.addConversion({from:"string",to:"Node",convert:b}),b})),Yp="compile",Jp=ur(Yp,["typed","parse"],(e=>{var{typed:r,parse:t}=e;return r(Yp,{string:function(e){return t(e).compile()},"Array | Matrix":function(e){return Fn(e,(function(e){return t(e).compile()}))}})})),Xp="evaluate",Qp=ur(Xp,["typed","parse"],(e=>{var{typed:r,parse:t}=e;return r(Xp,{string:function(e){var r=vr();return t(e).compile().evaluate(r)},"string, Map | Object":function(e,r){return t(e).compile().evaluate(r)},"Array | Matrix":function(e){var r=vr();return Fn(e,(function(e){return t(e).compile().evaluate(r)}))},"Array | Matrix, Map | Object":function(e,r){return Fn(e,(function(e){return t(e).compile().evaluate(r)}))}})})),Kp=ur("Parser",["evaluate"],(e=>{var{evaluate:r}=e;function t(){if(!(this instanceof t))throw new SyntaxError("Constructor must be called with the new operator");Object.defineProperty(this,"scope",{value:vr(),writable:!1})}return t.prototype.type="Parser",t.prototype.isParser=!0,t.prototype.evaluate=function(e){return r(e,this.scope)},t.prototype.get=function(e){if(this.scope.has(e))return this.scope.get(e)},t.prototype.getAll=function(){return function(e){if(e instanceof yr)return e.wrappedObject;var r={};for(var t of e.keys())fr(r,t,e.get(t));return r}(this.scope)},t.prototype.getAllAsMap=function(){return this.scope},t.prototype.set=function(e,r){return this.scope.set(e,r),r},t.prototype.remove=function(e){this.scope.delete(e)},t.prototype.clear=function(){this.scope.clear()},t}),{isClass:!0}),em="parser",rm=ur(em,["typed","Parser"],(e=>{var{typed:r,Parser:t}=e;return r(em,{"":function(){return new t}})})),tm=ur("lup",["typed","matrix","abs","addScalar","divideScalar","multiplyScalar","subtract","larger","equalScalar","unaryMinus","DenseMatrix","SparseMatrix","Spa"],(e=>{var{typed:r,matrix:t,abs:n,addScalar:i,divideScalar:a,multiplyScalar:o,subtract:s,larger:u,equalScalar:c,unaryMinus:l,DenseMatrix:f,SparseMatrix:p,Spa:m}=e;return r("lup",{DenseMatrix:function(e){return d(e)},SparseMatrix:function(e){return h(e)},Array:function(e){var r=d(t(e));return{L:r.L.valueOf(),U:r.U.valueOf(),p:r.p}}});function d(e){var r,t,l,p=e._size[0],m=e._size[1],d=Math.min(p,m),h=G(e._data),g=[],y=[p,d],v=[],x=[d,m],b=[];for(r=0;r0)for(r=0;r0&&e.forEach(0,t-1,(function(r,t){p._forEachRow(r,v,x,b,(function(n,i){n>r&&e.accumulate(n,l(o(i,t)))}))}));var M,F,B,T,O=t,_=e.get(t),z=n(_);e.forEach(t+1,s-1,(function(e,r){var t=n(r);u(t,z)&&(O=e,z=t,_=r)})),t!==O&&(p._swapRows(t,O,w[1],v,x,b),p._swapRows(t,O,A[1],N,D,E),e.swap(t,O),F=O,B=S[M=t],T=S[F],C[B]=F,C[T]=M,S[M]=T,S[F]=B),e.forEach(0,s-1,(function(e,r){e<=t?(N.push(r),D.push(e)):(r=a(r,_),c(r,0)||(v.push(r),x.push(e)))}))};for(t=0;t{var{typed:r,matrix:t,zeros:i,identity:a,isZero:o,equal:s,sign:u,sqrt:c,conj:l,unaryMinus:f,addScalar:p,divideScalar:m,multiplyScalar:d,subtract:h,complex:g}=e;return(0,n.Z)(r("qr",{DenseMatrix:function(e){return v(e)},SparseMatrix:function(e){return function(e){throw new Error("qr not implemented for sparse matrices yet")}()},Array:function(e){var r=v(t(e));return{Q:r.Q.valueOf(),R:r.R.valueOf()}}}),{_denseQRimpl:y});function y(e){var r,t,n,g=e._size[0],y=e._size[1],v=a([g],"dense"),x=v._data,b=e.clone(),w=b._data,N=i([g],"");for(n=0;n0)for(var n="Complex"===t[0][0].type?g(0):0,i=0;i=0;){var u=t[o+s],c=t[n+u];-1===c?(s--,a[r++]=u):(t[n+u]=t[i+c],t[o+ ++s]=c)}return r}function am(e){return-e-2}var om=ur("csAmd",["add","multiply","transpose"],(e=>{var{add:r,multiply:t,transpose:n}=e;return function(e,o){if(!o||e<=0||e>3)return null;var s=o._size,u=s[0],c=s[1],l=0,f=Math.max(16,10*Math.sqrt(c)),p=function(e,i,a,o,s){var u=n(i);if(1===e&&o===a)return r(i,u);if(2===e){for(var c=u._index,l=u._ptr,f=0,p=0;ps))for(var d=l[p+1];mo)t[s+p]=0,t[i+p]=-1,f++,r[p]=am(e),t[s+e]++;else{var d=t[u+m];-1!==d&&(c[d]=p),t[l+p]=t[u+m],t[u+m]=p}}return f}(c,B,_,R,k,P,f,z,I,j,q),$=0;HZ?(v=h,x=W,b=_[0+h]-Z):(x=B[v=F[W++]],b=_[0+v]),y=1;y<=b;y++)(w=_[z+(m=F[x++])])<=0||(V+=w,_[z+m]=-w,F[J++]=m,-1!==_[q+m]&&(j[_[q+m]]=j[m]),-1!==j[m]?_[q+j[m]]=_[q+m]:_[I+_[R+m]]=_[q+m]);v!==h&&(B[v]=am(h),_[P+v]=0)}for(0!==Z&&(T=J),_[R+h]=V,B[h]=Y,_[0+h]=J-Y,_[k+h]=-2,L=i(L,l,_,P,c),N=Y;N=L?_[P+v]-=w:0!==_[P+v]&&(_[P+v]=_[R+v]+X)}for(N=Y;N0?(M+=Q,F[C++]=v,S+=v):(B[v]=am(h),_[P+v]=0)}_[k+m]=C-E+1;var K=C,ee=E+_[0+m];for(W=A+1;W=0))for(m=_[U+(S=j[m])],_[U+S]=-1;-1!==m&&-1!==_[q+m];m=_[q+m],L++){for(b=_[0+m],D=_[k+m],W=B[m]+1;W<=B[m]+b-1;W++)_[P+F[W]]=L;var te=m;for(d=_[q+m];-1!==d;){var ne=_[0+d]===b&&_[k+d]===D;for(W=B[d]+1;ne&&W<=B[d]+b-1;W++)_[P+F[W]]!==L&&(ne=0);ne?(B[d]=am(m),_[z+m]+=_[z+d],_[z+d]=0,_[k+d]=-1,d=_[q+d],_[q+te]=d):(te=d,d=_[q+d])}}for(W=Y,N=Y;N=0;d--)_[z+d]>0||(_[q+d]=_[I+B[d]],_[I+B[d]]=d);for(v=c;v>=0;v--)_[z+v]<=0||-1!==B[v]&&(_[q+v]=_[I+B[v]],_[I+B[v]]=v);for(h=0,m=0;m<=c;m++)-1===B[m]&&(h=im(m,h,_,I,q,O,P));return O.splice(O.length-1,1),O};function i(e,r,t,n,i){if(e<2||e+r<0){for(var a=0;a{var{transpose:r}=e;return function(e,t,n,i){if(!e||!t||!n)return null;var a,o,s,u,c,l,f,p=e._size,m=p[0],d=p[1],h=4*d+(i?d+m+1:0),g=[],y=d,v=2*d,x=3*d,b=4*d,w=5*d+1;for(s=0;s=1&&N[o]++,2===C.jleaf&&N[C.q]--}-1!==t[o]&&(g[0+o]=t[o])}for(o=0;o{var{add:r,multiply:t,transpose:n}=e,i=om({add:r,multiply:t,transpose:n}),a=um({transpose:n});return function(e,r,t){var n,o=r._ptr,s=r._size[1],u={};if(u.q=i(e,r),e&&!u.q)return null;if(t){var c=e?function(e,r,t,n){for(var i=e._values,a=e._index,o=e._ptr,s=e._size,u=e._datatype,c=s[0],l=s[1],f=n&&e._values?[]:null,p=[],m=[],d=0,h=0;h=0;t--)-1!==e[t]&&(a[o+t]=a[0+e[t]],a[0+e[t]]=t);for(t=0;t=0;u--)for(l=t[u],f=t[u+1],c=l;c=0;s--)m[s]=-1,-1!==(u=d[s])&&(0==h[x+u]++&&(h[v+u]=s),h[g+s]=h[y+u],h[y+u]=s);for(r.lnz=0,r.m2=a,u=0;u=0;){e=n[f];var p=i?i[e]:e;lm(c,e)||(fm(c,e),n[l+f]=p<0?0:pm(c[p]));var m=1;for(o=n[l+f],s=p<0?0:pm(c[p+1]);o{var{divideScalar:r,multiply:t,subtract:n}=e;return function(e,i,a,o,s,u,c){var l,f,p,m,d=e._values,h=e._index,g=e._ptr,y=e._size[1],v=i._values,x=i._index,b=i._ptr,w=function(e,r,t,n,i){var a,o,s,u=e._ptr,c=e._size,l=r._index,f=r._ptr,p=c[1],m=p;for(o=f[t],s=f[t+1],a=o;a{var{abs:r,divideScalar:t,multiply:n,subtract:i,larger:a,largerEq:o,SparseMatrix:s}=e,u=dm({divideScalar:t,multiply:n,subtract:i});return function(e,i,c){if(!e)return null;var l,f=e._size[1],p=100,m=100;i&&(l=i.q,p=i.lnz||p,m=i.unz||m);var d,h,g=[],y=[],v=[],x=new s({values:g,index:y,ptr:v,size:[f,f]}),b=[],w=[],N=[],D=new s({values:b,index:w,ptr:N,size:[f,f]}),E=[],A=[],C=[];for(d=0;d{var{typed:r,abs:t,add:n,multiply:i,transpose:a,divideScalar:o,subtract:s,larger:u,largerEq:c,SparseMatrix:l}=e,f=cm({add:n,multiply:i,transpose:a}),p=hm({abs:t,divideScalar:o,multiply:i,subtract:s,larger:u,largerEq:c,SparseMatrix:l});return r("slu",{"SparseMatrix, number, number":function(e,r,t){if(!se(r)||r<0||r>3)throw new Error("Symbolic Ordering and Analysis order must be an integer number in the interval [0, 3]");if(t<0||t>1)throw new Error("Partial pivoting threshold must be a number from 0 to 1");var n=f(r,e,!1),i=p(e,n,t);return{L:i.L,U:i.U,p:i.pinv,q:n.q,toString:function(){return"L: "+this.L.toString()+"\nU: "+this.U.toString()+"\np: "+this.p.toString()+(this.q?"\nq: "+this.q.toString():"")+"\n"}}}})}));function ym(e,r){var t,n=r.length,i=[];if(e)for(t=0;t{var{typed:r,matrix:t,lup:n,slu:i,usolve:a,lsolve:o,DenseMatrix:s}=e,u=vc({DenseMatrix:s});return r(vm,{"Array, Array | Matrix":function(e,r){e=t(e);var i=n(e);return l(i.L,i.U,i.p,null,r).valueOf()},"DenseMatrix, Array | Matrix":function(e,r){var t=n(e);return l(t.L,t.U,t.p,null,r)},"SparseMatrix, Array | Matrix":function(e,r){var t=n(e);return l(t.L,t.U,t.p,null,r)},"SparseMatrix, Array | Matrix, number, number":function(e,r,t,n){var a=i(e,t,n);return l(a.L,a.U,a.p,a.q,r)},"Object, Array | Matrix":function(e,r){return l(e.L,e.U,e.p,e.q,r)}});function c(e){if(p(e))return e;if(f(e))return t(e);throw new TypeError("Invalid Matrix LU decomposition")}function l(e,r,t,n,i){e=c(e),r=c(r),t&&((i=u(e,i,!0))._data=ym(t,i._data));var s=o(e,i),l=a(r,s);return n&&(l._data=ym(n,l._data)),l}})),wm="polynomialRoot",Nm=["typed","isZero","equalScalar","add","subtract","multiply","divide","sqrt","unaryMinus","cbrt","typeOf","im","re"],Dm=ur(wm,Nm,(e=>{var{typed:r,isZero:t,equalScalar:n,add:i,subtract:a,multiply:o,divide:s,sqrt:u,unaryMinus:c,cbrt:l,typeOf:f,im:p,re:m}=e;return r(wm,{"number|Complex, ...number|Complex":(e,r)=>{for(var d=[e,...r];d.length>0&&t(d[d.length-1]);)d.pop();if(d.length<2)throw new RangeError("Polynomial [".concat(e,", ").concat(r,"] must have a non-zero non-constant coefficient"));switch(d.length){case 2:return[c(s(d[0],d[1]))];case 3:var[h,g,y]=d,v=o(2,y),x=o(g,g),b=o(4,y,h);if(n(x,b))return[s(c(g),v)];var w=u(a(x,b));return[s(a(w,g),v),s(a(c(w),g),v)];case 4:var[N,D,E,A]=d,C=c(o(3,A)),S=o(E,E),M=o(3,A,D),F=i(o(2,E,E,E),o(27,A,A,N)),B=o(9,A,E,D);if(n(S,M)&&n(F,B))return[s(E,C)];var T,O=a(S,M),_=a(F,B),z=i(o(18,A,E,D,N),o(E,E,D,D)),q=i(o(4,E,E,E,N),o(4,A,D,D,D),o(27,A,A,N,N));if(n(z,q))return[s(a(o(4,A,E,D),i(o(9,A,A,N),o(E,E,E))),o(A,O)),s(a(o(9,A,N),o(E,D)),o(2,O))];T=n(S,M)?_:s(i(_,u(a(o(_,_),o(4,O,O,O)))),2);return l(T,!0).toArray().map((e=>s(i(E,e,s(O,e)),C))).map((e=>"Complex"===f(e)&&n(m(e),m(e)+p(e))?m(e):e));default:throw new RangeError("only implemented for cubic or lower-order polynomials, not ".concat(d))}}})})),Em=["parse"],Am=ur("Help",Em,(e=>{var{parse:r}=e;function t(e){if(!(this instanceof t))throw new SyntaxError("Constructor must be called with the new operator");if(!e)throw new Error('Argument "doc" missing');this.doc=e}return t.prototype.type="Help",t.prototype.isHelp=!0,t.prototype.toString=function(){var e=this.doc||{},t="\n";if(e.name&&(t+="Name: "+e.name+"\n\n"),e.category&&(t+="Category: "+e.category+"\n\n"),e.description&&(t+="Description:\n "+e.description+"\n\n"),e.syntax&&(t+="Syntax:\n "+e.syntax.join("\n ")+"\n\n"),e.examples){t+="Examples:\n";for(var n={},i=0;i"mathjs"!==e)).forEach((t=>{r[t]=e[t]})),new t(r)},t.prototype.valueOf=t.prototype.toString,t}),{isClass:!0}),Cm=["?on","math","typed"],Sm=ur("Chain",Cm,(e=>{var{on:r,math:t,typed:n}=e;function i(e){if(!(this instanceof i))throw new SyntaxError("Constructor must be called with the new operator");$(e)?this.value=e.value:this.value=e}function a(e,r){var t,n,a,s,u;t=i.prototype,n=e,a=function(){var e=r();if("function"==typeof e)return o(e)},u=!0,Object.defineProperty(t,n,{get:function(){return u&&(s=a(),u=!1),s},set:function(e){s=e,u=!1},configurable:!0,enumerable:!0})}function o(e){return function(){if(0===arguments.length)return new i(e(this.value));for(var r=[this.value],t=0;te[r]))};for(var n in e)t(n)}var u,c};var s={expression:!0,docs:!0,type:!0,classes:!0,json:!0,error:!0,isChain:!0};return i.createProxy(t),r&&r("import",(function(e,r,t){t||a(e,r)})),i}),{isClass:!0}),Mm={name:"e",category:"Constants",syntax:["e"],description:"Euler's number, the base of the natural logarithm. Approximately equal to 2.71828",examples:["e","e ^ 2","exp(2)","log(e)"],seealso:["exp"]},Fm={name:"pi",category:"Constants",syntax:["pi"],description:"The number pi is a mathematical constant that is the ratio of a circle's circumference to its diameter, and is approximately equal to 3.14159",examples:["pi","sin(pi/2)"],seealso:["tau"]},Bm={bignumber:{name:"bignumber",category:"Construction",syntax:["bignumber(x)"],description:"Create a big number from a number or string.",examples:["0.1 + 0.2","bignumber(0.1) + bignumber(0.2)",'bignumber("7.2")','bignumber("7.2e500")',"bignumber([0.1, 0.2, 0.3])"],seealso:["boolean","complex","fraction","index","matrix","string","unit"]},boolean:{name:"boolean",category:"Construction",syntax:["x","boolean(x)"],description:"Convert a string or number into a boolean.",examples:["boolean(0)","boolean(1)","boolean(3)",'boolean("true")','boolean("false")',"boolean([1, 0, 1, 1])"],seealso:["bignumber","complex","index","matrix","number","string","unit"]},complex:{name:"complex",category:"Construction",syntax:["complex()","complex(re, im)","complex(string)"],description:"Create a complex number.",examples:["complex()","complex(2, 3)",'complex("7 - 2i")'],seealso:["bignumber","boolean","index","matrix","number","string","unit"]},createUnit:{name:"createUnit",category:"Construction",syntax:["createUnit(definitions)","createUnit(name, definition)"],description:"Create a user-defined unit and register it with the Unit type.",examples:['createUnit("foo")','createUnit("knot", {definition: "0.514444444 m/s", aliases: ["knots", "kt", "kts"]})','createUnit("mph", "1 mile/hour")'],seealso:["unit","splitUnit"]},fraction:{name:"fraction",category:"Construction",syntax:["fraction(num)","fraction(matrix)","fraction(num,den)","fraction({n: num, d: den})"],description:"Create a fraction from a number or from integer numerator and denominator.",examples:["fraction(0.125)","fraction(1, 3) + fraction(2, 5)","fraction({n: 333, d: 53})","fraction([sqrt(9), sqrt(10), sqrt(11)])"],seealso:["bignumber","boolean","complex","index","matrix","string","unit"]},index:{name:"index",category:"Construction",syntax:["[start]","[start:end]","[start:step:end]","[start1, start 2, ...]","[start1:end1, start2:end2, ...]","[start1:step1:end1, start2:step2:end2, ...]"],description:"Create an index to get or replace a subset of a matrix",examples:["[1, 2, 3]","A = [1, 2, 3; 4, 5, 6]","A[1, :]","A[1, 2] = 50","A[1:2, 1:2] = ones(2, 2)"],seealso:["bignumber","boolean","complex","matrix,","number","range","string","unit"]},matrix:{name:"matrix",category:"Construction",syntax:["[]","[a1, b1, ...; a2, b2, ...]","matrix()",'matrix("dense")',"matrix([...])"],description:"Create a matrix.",examples:["[]","[1, 2, 3]","[1, 2, 3; 4, 5, 6]","matrix()","matrix([3, 4])",'matrix([3, 4; 5, 6], "sparse")','matrix([3, 4; 5, 6], "sparse", "number")'],seealso:["bignumber","boolean","complex","index","number","string","unit","sparse"]},number:{name:"number",category:"Construction",syntax:["x","number(x)","number(unit, valuelessUnit)"],description:"Create a number or convert a string or boolean into a number.",examples:["2","2e3","4.05","number(2)",'number("7.2")',"number(true)","number([true, false, true, true])",'number(unit("52cm"), "m")'],seealso:["bignumber","boolean","complex","fraction","index","matrix","string","unit"]},sparse:{name:"sparse",category:"Construction",syntax:["sparse()","sparse([a1, b1, ...; a1, b2, ...])",'sparse([a1, b1, ...; a1, b2, ...], "number")'],description:"Create a sparse matrix.",examples:["sparse()","sparse([3, 4; 5, 6])",'sparse([3, 0; 5, 0], "number")'],seealso:["bignumber","boolean","complex","index","number","string","unit","matrix"]},splitUnit:{name:"splitUnit",category:"Construction",syntax:["splitUnit(unit: Unit, parts: Unit[])"],description:"Split a unit in an array of units whose sum is equal to the original unit.",examples:['splitUnit(1 m, ["feet", "inch"])'],seealso:["unit","createUnit"]},string:{name:"string",category:"Construction",syntax:['"text"',"string(x)"],description:"Create a string or convert a value to a string",examples:['"Hello World!"',"string(4.2)","string(3 + 2i)"],seealso:["bignumber","boolean","complex","index","matrix","number","unit"]},unit:{name:"unit",category:"Construction",syntax:["value unit","unit(value, unit)","unit(string)"],description:"Create a unit.",examples:["5.5 mm","3 inch",'unit(7.1, "kilogram")','unit("23 deg")'],seealso:["bignumber","boolean","complex","index","matrix","number","string"]},e:Mm,E:Mm,false:{name:"false",category:"Constants",syntax:["false"],description:"Boolean value false",examples:["false"],seealso:["true"]},i:{name:"i",category:"Constants",syntax:["i"],description:"Imaginary unit, defined as i*i=-1. A complex number is described as a + b*i, where a is the real part, and b is the imaginary part.",examples:["i","i * i","sqrt(-1)"],seealso:[]},Infinity:{name:"Infinity",category:"Constants",syntax:["Infinity"],description:"Infinity, a number which is larger than the maximum number that can be handled by a floating point number.",examples:["Infinity","1 / 0"],seealso:[]},LN2:{name:"LN2",category:"Constants",syntax:["LN2"],description:"Returns the natural logarithm of 2, approximately equal to 0.693",examples:["LN2","log(2)"],seealso:[]},LN10:{name:"LN10",category:"Constants",syntax:["LN10"],description:"Returns the natural logarithm of 10, approximately equal to 2.302",examples:["LN10","log(10)"],seealso:[]},LOG2E:{name:"LOG2E",category:"Constants",syntax:["LOG2E"],description:"Returns the base-2 logarithm of E, approximately equal to 1.442",examples:["LOG2E","log(e, 2)"],seealso:[]},LOG10E:{name:"LOG10E",category:"Constants",syntax:["LOG10E"],description:"Returns the base-10 logarithm of E, approximately equal to 0.434",examples:["LOG10E","log(e, 10)"],seealso:[]},NaN:{name:"NaN",category:"Constants",syntax:["NaN"],description:"Not a number",examples:["NaN","0 / 0"],seealso:[]},null:{name:"null",category:"Constants",syntax:["null"],description:"Value null",examples:["null"],seealso:["true","false"]},pi:Fm,PI:Fm,phi:{name:"phi",category:"Constants",syntax:["phi"],description:"Phi is the golden ratio. Two quantities are in the golden ratio if their ratio is the same as the ratio of their sum to the larger of the two quantities. Phi is defined as `(1 + sqrt(5)) / 2` and is approximately 1.618034...",examples:["phi"],seealso:[]},SQRT1_2:{name:"SQRT1_2",category:"Constants",syntax:["SQRT1_2"],description:"Returns the square root of 1/2, approximately equal to 0.707",examples:["SQRT1_2","sqrt(1/2)"],seealso:[]},SQRT2:{name:"SQRT2",category:"Constants",syntax:["SQRT2"],description:"Returns the square root of 2, approximately equal to 1.414",examples:["SQRT2","sqrt(2)"],seealso:[]},tau:{name:"tau",category:"Constants",syntax:["tau"],description:"Tau is the ratio constant of a circle's circumference to radius, equal to 2 * pi, approximately 6.2832.",examples:["tau","2 * pi"],seealso:["pi"]},true:{name:"true",category:"Constants",syntax:["true"],description:"Boolean value true",examples:["true"],seealso:["false"]},version:{name:"version",category:"Constants",syntax:["version"],description:"A string with the version number of math.js",examples:["version"],seealso:[]},speedOfLight:{description:"Speed of light in vacuum",examples:["speedOfLight"]},gravitationConstant:{description:"Newtonian constant of gravitation",examples:["gravitationConstant"]},planckConstant:{description:"Planck constant",examples:["planckConstant"]},reducedPlanckConstant:{description:"Reduced Planck constant",examples:["reducedPlanckConstant"]},magneticConstant:{description:"Magnetic constant (vacuum permeability)",examples:["magneticConstant"]},electricConstant:{description:"Electric constant (vacuum permeability)",examples:["electricConstant"]},vacuumImpedance:{description:"Characteristic impedance of vacuum",examples:["vacuumImpedance"]},coulomb:{description:"Coulomb's constant",examples:["coulomb"]},elementaryCharge:{description:"Elementary charge",examples:["elementaryCharge"]},bohrMagneton:{description:"Borh magneton",examples:["bohrMagneton"]},conductanceQuantum:{description:"Conductance quantum",examples:["conductanceQuantum"]},inverseConductanceQuantum:{description:"Inverse conductance quantum",examples:["inverseConductanceQuantum"]},magneticFluxQuantum:{description:"Magnetic flux quantum",examples:["magneticFluxQuantum"]},nuclearMagneton:{description:"Nuclear magneton",examples:["nuclearMagneton"]},klitzing:{description:"Von Klitzing constant",examples:["klitzing"]},bohrRadius:{description:"Borh radius",examples:["bohrRadius"]},classicalElectronRadius:{description:"Classical electron radius",examples:["classicalElectronRadius"]},electronMass:{description:"Electron mass",examples:["electronMass"]},fermiCoupling:{description:"Fermi coupling constant",examples:["fermiCoupling"]},fineStructure:{description:"Fine-structure constant",examples:["fineStructure"]},hartreeEnergy:{description:"Hartree energy",examples:["hartreeEnergy"]},protonMass:{description:"Proton mass",examples:["protonMass"]},deuteronMass:{description:"Deuteron Mass",examples:["deuteronMass"]},neutronMass:{description:"Neutron mass",examples:["neutronMass"]},quantumOfCirculation:{description:"Quantum of circulation",examples:["quantumOfCirculation"]},rydberg:{description:"Rydberg constant",examples:["rydberg"]},thomsonCrossSection:{description:"Thomson cross section",examples:["thomsonCrossSection"]},weakMixingAngle:{description:"Weak mixing angle",examples:["weakMixingAngle"]},efimovFactor:{description:"Efimov factor",examples:["efimovFactor"]},atomicMass:{description:"Atomic mass constant",examples:["atomicMass"]},avogadro:{description:"Avogadro's number",examples:["avogadro"]},boltzmann:{description:"Boltzmann constant",examples:["boltzmann"]},faraday:{description:"Faraday constant",examples:["faraday"]},firstRadiation:{description:"First radiation constant",examples:["firstRadiation"]},loschmidt:{description:"Loschmidt constant at T=273.15 K and p=101.325 kPa",examples:["loschmidt"]},gasConstant:{description:"Gas constant",examples:["gasConstant"]},molarPlanckConstant:{description:"Molar Planck constant",examples:["molarPlanckConstant"]},molarVolume:{description:"Molar volume of an ideal gas at T=273.15 K and p=101.325 kPa",examples:["molarVolume"]},sackurTetrode:{description:"Sackur-Tetrode constant at T=1 K and p=101.325 kPa",examples:["sackurTetrode"]},secondRadiation:{description:"Second radiation constant",examples:["secondRadiation"]},stefanBoltzmann:{description:"Stefan-Boltzmann constant",examples:["stefanBoltzmann"]},wienDisplacement:{description:"Wien displacement law constant",examples:["wienDisplacement"]},molarMass:{description:"Molar mass constant",examples:["molarMass"]},molarMassC12:{description:"Molar mass constant of carbon-12",examples:["molarMassC12"]},gravity:{description:"Standard acceleration of gravity (standard acceleration of free-fall on Earth)",examples:["gravity"]},planckLength:{description:"Planck length",examples:["planckLength"]},planckMass:{description:"Planck mass",examples:["planckMass"]},planckTime:{description:"Planck time",examples:["planckTime"]},planckCharge:{description:"Planck charge",examples:["planckCharge"]},planckTemperature:{description:"Planck temperature",examples:["planckTemperature"]},derivative:{name:"derivative",category:"Algebra",syntax:["derivative(expr, variable)","derivative(expr, variable, {simplify: boolean})"],description:"Takes the derivative of an expression expressed in parser Nodes. The derivative will be taken over the supplied variable in the second parameter. If there are multiple variables in the expression, it will return a partial derivative.",examples:['derivative("2x^3", "x")','derivative("2x^3", "x", {simplify: false})','derivative("2x^2 + 3x + 4", "x")','derivative("sin(2x)", "x")','f = parse("x^2 + x")','x = parse("x")',"df = derivative(f, x)","df.evaluate({x: 3})"],seealso:["simplify","parse","evaluate"]},lsolve:{name:"lsolve",category:"Algebra",syntax:["x=lsolve(L, b)"],description:"Finds one solution of the linear system L * x = b where L is an [n x n] lower triangular matrix and b is a [n] column vector.",examples:["a = [-2, 3; 2, 1]","b = [11, 9]","x = lsolve(a, b)"],seealso:["lsolveAll","lup","lusolve","usolve","matrix","sparse"]},lsolveAll:{name:"lsolveAll",category:"Algebra",syntax:["x=lsolveAll(L, b)"],description:"Finds all solutions of the linear system L * x = b where L is an [n x n] lower triangular matrix and b is a [n] column vector.",examples:["a = [-2, 3; 2, 1]","b = [11, 9]","x = lsolve(a, b)"],seealso:["lsolve","lup","lusolve","usolve","matrix","sparse"]},lup:{name:"lup",category:"Algebra",syntax:["lup(m)"],description:"Calculate the Matrix LU decomposition with partial pivoting. Matrix A is decomposed in three matrices (L, U, P) where P * A = L * U",examples:["lup([[2, 1], [1, 4]])","lup(matrix([[2, 1], [1, 4]]))","lup(sparse([[2, 1], [1, 4]]))"],seealso:["lusolve","lsolve","usolve","matrix","sparse","slu","qr"]},lusolve:{name:"lusolve",category:"Algebra",syntax:["x=lusolve(A, b)","x=lusolve(lu, b)"],description:"Solves the linear system A * x = b where A is an [n x n] matrix and b is a [n] column vector.",examples:["a = [-2, 3; 2, 1]","b = [11, 9]","x = lusolve(a, b)"],seealso:["lup","slu","lsolve","usolve","matrix","sparse"]},leafCount:{name:"leafCount",category:"Algebra",syntax:["leafCount(expr)"],description:"Computes the number of leaves in the parse tree of the given expression",examples:['leafCount("e^(i*pi)-1")','leafCount(parse("{a: 22/7, b: 10^(1/2)}"))'],seealso:["simplify"]},polynomialRoot:{name:"polynomialRoot",category:"Algebra",syntax:["x=polynomialRoot(-6, 3)","x=polynomialRoot(4, -4, 1)","x=polynomialRoot(-8, 12, -6, 1)"],description:"Finds the roots of a univariate polynomial given by its coefficients starting from constant, linear, and so on, increasing in degree.",examples:["a = polynomialRoot(-6, 11, -6, 1)"],seealso:["cbrt","sqrt"]},resolve:{name:"resolve",category:"Algebra",syntax:["resolve(node, scope)"],description:"Recursively substitute variables in an expression tree.",examples:['resolve(parse("1 + x"), { x: 7 })','resolve(parse("size(text)"), { text: "Hello World" })','resolve(parse("x + y"), { x: parse("3z") })','resolve(parse("3x"), { x: parse("y+z"), z: parse("w^y") })'],seealso:["simplify","evaluate"],mayThrow:["ReferenceError"]},simplify:{name:"simplify",category:"Algebra",syntax:["simplify(expr)","simplify(expr, rules)"],description:"Simplify an expression tree.",examples:['simplify("3 + 2 / 4")','simplify("2x + x")','f = parse("x * (x + 2 + x)")',"simplified = simplify(f)","simplified.evaluate({x: 2})"],seealso:["simplifyCore","derivative","evaluate","parse","rationalize","resolve"]},simplifyConstant:{name:"simplifyConstant",category:"Algebra",syntax:["simplifyConstant(expr)","simplifyConstant(expr, options)"],description:"Replace constant subexpressions of node with their values.",examples:['simplifyConstant("(3-3)*x")','simplifyConstant(parse("z-cos(tau/8)"))'],seealso:["simplify","simplifyCore","evaluate"]},simplifyCore:{name:"simplifyCore",category:"Algebra",syntax:["simplifyCore(node)"],description:"Perform simple one-pass simplifications on an expression tree.",examples:['simplifyCore(parse("0*x"))','simplifyCore(parse("(x+0)*2"))'],seealso:["simplify","simplifyConstant","evaluate"]},symbolicEqual:{name:"symbolicEqual",category:"Algebra",syntax:["symbolicEqual(expr1, expr2)","symbolicEqual(expr1, expr2, options)"],description:"Returns true if the difference of the expressions simplifies to 0",examples:['symbolicEqual("x*y","y*x")','symbolicEqual("abs(x^2)", "x^2")','symbolicEqual("abs(x)", "x", {context: {abs: {trivial: true}}})'],seealso:["simplify","evaluate"]},rationalize:{name:"rationalize",category:"Algebra",syntax:["rationalize(expr)","rationalize(expr, scope)","rationalize(expr, scope, detailed)"],description:"Transform a rationalizable expression in a rational fraction. If rational fraction is one variable polynomial then converts the numerator and denominator in canonical form, with decreasing exponents, returning the coefficients of numerator.",examples:['rationalize("2x/y - y/(x+1)")','rationalize("2x/y - y/(x+1)", true)'],seealso:["simplify"]},slu:{name:"slu",category:"Algebra",syntax:["slu(A, order, threshold)"],description:"Calculate the Matrix LU decomposition with full pivoting. Matrix A is decomposed in two matrices (L, U) and two permutation vectors (pinv, q) where P * A * Q = L * U",examples:["slu(sparse([4.5, 0, 3.2, 0; 3.1, 2.9, 0, 0.9; 0, 1.7, 3, 0; 3.5, 0.4, 0, 1]), 1, 0.001)"],seealso:["lusolve","lsolve","usolve","matrix","sparse","lup","qr"]},usolve:{name:"usolve",category:"Algebra",syntax:["x=usolve(U, b)"],description:"Finds one solution of the linear system U * x = b where U is an [n x n] upper triangular matrix and b is a [n] column vector.",examples:["x=usolve(sparse([1, 1, 1, 1; 0, 1, 1, 1; 0, 0, 1, 1; 0, 0, 0, 1]), [1; 2; 3; 4])"],seealso:["usolveAll","lup","lusolve","lsolve","matrix","sparse"]},usolveAll:{name:"usolveAll",category:"Algebra",syntax:["x=usolve(U, b)"],description:"Finds all solutions of the linear system U * x = b where U is an [n x n] upper triangular matrix and b is a [n] column vector.",examples:["x=usolve(sparse([1, 1, 1, 1; 0, 1, 1, 1; 0, 0, 1, 1; 0, 0, 0, 1]), [1; 2; 3; 4])"],seealso:["usolve","lup","lusolve","lsolve","matrix","sparse"]},qr:{name:"qr",category:"Algebra",syntax:["qr(A)"],description:"Calculates the Matrix QR decomposition. Matrix `A` is decomposed in two matrices (`Q`, `R`) where `Q` is an orthogonal matrix and `R` is an upper triangular matrix.",examples:["qr([[1, -1, 4], [1, 4, -2], [1, 4, 2], [1, -1, 0]])"],seealso:["lup","slu","matrix"]},abs:{name:"abs",category:"Arithmetic",syntax:["abs(x)"],description:"Compute the absolute value.",examples:["abs(3.5)","abs(-4.2)"],seealso:["sign"]},add:{name:"add",category:"Operators",syntax:["x + y","add(x, y)"],description:"Add two values.",examples:["a = 2.1 + 3.6","a - 3.6","3 + 2i","3 cm + 2 inch",'"2.3" + "4"'],seealso:["subtract"]},cbrt:{name:"cbrt",category:"Arithmetic",syntax:["cbrt(x)","cbrt(x, allRoots)"],description:"Compute the cubic root value. If x = y * y * y, then y is the cubic root of x. When `x` is a number or complex number, an optional second argument `allRoots` can be provided to return all three cubic roots. If not provided, the principal root is returned",examples:["cbrt(64)","cube(4)","cbrt(-8)","cbrt(2 + 3i)","cbrt(8i)","cbrt(8i, true)","cbrt(27 m^3)"],seealso:["square","sqrt","cube","multiply"]},ceil:{name:"ceil",category:"Arithmetic",syntax:["ceil(x)"],description:"Round a value towards plus infinity. If x is complex, both real and imaginary part are rounded towards plus infinity.",examples:["ceil(3.2)","ceil(3.8)","ceil(-4.2)"],seealso:["floor","fix","round"]},cube:{name:"cube",category:"Arithmetic",syntax:["cube(x)"],description:"Compute the cube of a value. The cube of x is x * x * x.",examples:["cube(2)","2^3","2 * 2 * 2"],seealso:["multiply","square","pow"]},divide:{name:"divide",category:"Operators",syntax:["x / y","divide(x, y)"],description:"Divide two values.",examples:["a = 2 / 3","a * 3","4.5 / 2","3 + 4 / 2","(3 + 4) / 2","18 km / 4.5"],seealso:["multiply"]},dotDivide:{name:"dotDivide",category:"Operators",syntax:["x ./ y","dotDivide(x, y)"],description:"Divide two values element wise.",examples:["a = [1, 2, 3; 4, 5, 6]","b = [2, 1, 1; 3, 2, 5]","a ./ b"],seealso:["multiply","dotMultiply","divide"]},dotMultiply:{name:"dotMultiply",category:"Operators",syntax:["x .* y","dotMultiply(x, y)"],description:"Multiply two values element wise.",examples:["a = [1, 2, 3; 4, 5, 6]","b = [2, 1, 1; 3, 2, 5]","a .* b"],seealso:["multiply","divide","dotDivide"]},dotPow:{name:"dotPow",category:"Operators",syntax:["x .^ y","dotPow(x, y)"],description:"Calculates the power of x to y element wise.",examples:["a = [1, 2, 3; 4, 5, 6]","a .^ 2"],seealso:["pow"]},exp:{name:"exp",category:"Arithmetic",syntax:["exp(x)"],description:"Calculate the exponent of a value.",examples:["exp(1.3)","e ^ 1.3","log(exp(1.3))","x = 2.4","(exp(i*x) == cos(x) + i*sin(x)) # Euler's formula"],seealso:["expm","expm1","pow","log"]},expm:{name:"expm",category:"Arithmetic",syntax:["exp(x)"],description:"Compute the matrix exponential, expm(A) = e^A. The matrix must be square. Not to be confused with exp(a), which performs element-wise exponentiation.",examples:["expm([[0,2],[0,0]])"],seealso:["exp"]},expm1:{name:"expm1",category:"Arithmetic",syntax:["expm1(x)"],description:"Calculate the value of subtracting 1 from the exponential value.",examples:["expm1(2)","pow(e, 2) - 1","log(expm1(2) + 1)"],seealso:["exp","pow","log"]},fix:{name:"fix",category:"Arithmetic",syntax:["fix(x)"],description:"Round a value towards zero. If x is complex, both real and imaginary part are rounded towards zero.",examples:["fix(3.2)","fix(3.8)","fix(-4.2)","fix(-4.8)"],seealso:["ceil","floor","round"]},floor:{name:"floor",category:"Arithmetic",syntax:["floor(x)"],description:"Round a value towards minus infinity.If x is complex, both real and imaginary part are rounded towards minus infinity.",examples:["floor(3.2)","floor(3.8)","floor(-4.2)"],seealso:["ceil","fix","round"]},gcd:{name:"gcd",category:"Arithmetic",syntax:["gcd(a, b)","gcd(a, b, c, ...)"],description:"Compute the greatest common divisor.",examples:["gcd(8, 12)","gcd(-4, 6)","gcd(25, 15, -10)"],seealso:["lcm","xgcd"]},hypot:{name:"hypot",category:"Arithmetic",syntax:["hypot(a, b, c, ...)","hypot([a, b, c, ...])"],description:"Calculate the hypotenusa of a list with values. ",examples:["hypot(3, 4)","sqrt(3^2 + 4^2)","hypot(-2)","hypot([3, 4, 5])"],seealso:["abs","norm"]},lcm:{name:"lcm",category:"Arithmetic",syntax:["lcm(x, y)"],description:"Compute the least common multiple.",examples:["lcm(4, 6)","lcm(6, 21)","lcm(6, 21, 5)"],seealso:["gcd"]},log:{name:"log",category:"Arithmetic",syntax:["log(x)","log(x, base)"],description:"Compute the logarithm of a value. If no base is provided, the natural logarithm of x is calculated. If base if provided, the logarithm is calculated for the specified base. log(x, base) is defined as log(x) / log(base).",examples:["log(3.5)","a = log(2.4)","exp(a)","10 ^ 4","log(10000, 10)","log(10000) / log(10)","b = log(1024, 2)","2 ^ b"],seealso:["exp","log1p","log2","log10"]},log2:{name:"log2",category:"Arithmetic",syntax:["log2(x)"],description:"Calculate the 2-base of a value. This is the same as calculating `log(x, 2)`.",examples:["log2(0.03125)","log2(16)","log2(16) / log2(2)","pow(2, 4)"],seealso:["exp","log1p","log","log10"]},log1p:{name:"log1p",category:"Arithmetic",syntax:["log1p(x)","log1p(x, base)"],description:"Calculate the logarithm of a `value+1`",examples:["log1p(2.5)","exp(log1p(1.4))","pow(10, 4)","log1p(9999, 10)","log1p(9999) / log(10)"],seealso:["exp","log","log2","log10"]},log10:{name:"log10",category:"Arithmetic",syntax:["log10(x)"],description:"Compute the 10-base logarithm of a value.",examples:["log10(0.00001)","log10(10000)","10 ^ 4","log(10000) / log(10)","log(10000, 10)"],seealso:["exp","log"]},mod:{name:"mod",category:"Operators",syntax:["x % y","x mod y","mod(x, y)"],description:"Calculates the modulus, the remainder of an integer division.",examples:["7 % 3","11 % 2","10 mod 4","isOdd(x) = x % 2","isOdd(2)","isOdd(3)"],seealso:["divide"]},multiply:{name:"multiply",category:"Operators",syntax:["x * y","multiply(x, y)"],description:"multiply two values.",examples:["a = 2.1 * 3.4","a / 3.4","2 * 3 + 4","2 * (3 + 4)","3 * 2.1 km"],seealso:["divide"]},norm:{name:"norm",category:"Arithmetic",syntax:["norm(x)","norm(x, p)"],description:"Calculate the norm of a number, vector or matrix.",examples:["abs(-3.5)","norm(-3.5)","norm(3 - 4i)","norm([1, 2, -3], Infinity)","norm([1, 2, -3], -Infinity)","norm([3, 4], 2)","norm([[1, 2], [3, 4]], 1)",'norm([[1, 2], [3, 4]], "inf")','norm([[1, 2], [3, 4]], "fro")']},nthRoot:{name:"nthRoot",category:"Arithmetic",syntax:["nthRoot(a)","nthRoot(a, root)"],description:'Calculate the nth root of a value. The principal nth root of a positive real number A, is the positive real solution of the equation "x^root = A".',examples:["4 ^ 3","nthRoot(64, 3)","nthRoot(9, 2)","sqrt(9)"],seealso:["nthRoots","pow","sqrt"]},nthRoots:{name:"nthRoots",category:"Arithmetic",syntax:["nthRoots(A)","nthRoots(A, root)"],description:'Calculate the nth roots of a value. An nth root of a positive real number A, is a positive real solution of the equation "x^root = A". This function returns an array of complex values.',examples:["nthRoots(1)","nthRoots(1, 3)"],seealso:["sqrt","pow","nthRoot"]},pow:{name:"pow",category:"Operators",syntax:["x ^ y","pow(x, y)"],description:"Calculates the power of x to y, x^y.",examples:["2^3","2*2*2","1 + e ^ (pi * i)","pow([[1, 2], [4, 3]], 2)","pow([[1, 2], [4, 3]], -1)"],seealso:["multiply","nthRoot","nthRoots","sqrt"]},round:{name:"round",category:"Arithmetic",syntax:["round(x)","round(x, n)"],description:"round a value towards the nearest integer.If x is complex, both real and imaginary part are rounded towards the nearest integer. When n is specified, the value is rounded to n decimals.",examples:["round(3.2)","round(3.8)","round(-4.2)","round(-4.8)","round(pi, 3)","round(123.45678, 2)"],seealso:["ceil","floor","fix"]},sign:{name:"sign",category:"Arithmetic",syntax:["sign(x)"],description:"Compute the sign of a value. The sign of a value x is 1 when x>1, -1 when x<0, and 0 when x=0.",examples:["sign(3.5)","sign(-4.2)","sign(0)"],seealso:["abs"]},sqrt:{name:"sqrt",category:"Arithmetic",syntax:["sqrt(x)"],description:"Compute the square root value. If x = y * y, then y is the square root of x.",examples:["sqrt(25)","5 * 5","sqrt(-1)"],seealso:["square","sqrtm","multiply","nthRoot","nthRoots","pow"]},sqrtm:{name:"sqrtm",category:"Arithmetic",syntax:["sqrtm(x)"],description:"Calculate the principal square root of a square matrix. The principal square root matrix `X` of another matrix `A` is such that `X * X = A`.",examples:["sqrtm([[33, 24], [48, 57]])"],seealso:["sqrt","abs","square","multiply"]},square:{name:"square",category:"Arithmetic",syntax:["square(x)"],description:"Compute the square of a value. The square of x is x * x.",examples:["square(3)","sqrt(9)","3^2","3 * 3"],seealso:["multiply","pow","sqrt","cube"]},subtract:{name:"subtract",category:"Operators",syntax:["x - y","subtract(x, y)"],description:"subtract two values.",examples:["a = 5.3 - 2","a + 2","2/3 - 1/6","2 * 3 - 3","2.1 km - 500m"],seealso:["add"]},unaryMinus:{name:"unaryMinus",category:"Operators",syntax:["-x","unaryMinus(x)"],description:"Inverse the sign of a value. Converts booleans and strings to numbers.",examples:["-4.5","-(-5.6)",'-"22"'],seealso:["add","subtract","unaryPlus"]},unaryPlus:{name:"unaryPlus",category:"Operators",syntax:["+x","unaryPlus(x)"],description:"Converts booleans and strings to numbers.",examples:["+true",'+"2"'],seealso:["add","subtract","unaryMinus"]},xgcd:{name:"xgcd",category:"Arithmetic",syntax:["xgcd(a, b)"],description:"Calculate the extended greatest common divisor for two values. The result is an array [d, x, y] with 3 entries, where d is the greatest common divisor, and d = x * a + y * b.",examples:["xgcd(8, 12)","gcd(8, 12)","xgcd(36163, 21199)"],seealso:["gcd","lcm"]},invmod:{name:"invmod",category:"Arithmetic",syntax:["invmod(a, b)"],description:"Calculate the (modular) multiplicative inverse of a modulo b. Solution to the equation ax ≣ 1 (mod b)",examples:["invmod(8, 12)","invmod(7, 13)","invmod(15151, 15122)"],seealso:["gcd","xgcd"]},bitAnd:{name:"bitAnd",category:"Bitwise",syntax:["x & y","bitAnd(x, y)"],description:"Bitwise AND operation. Performs the logical AND operation on each pair of the corresponding bits of the two given values by multiplying them. If both bits in the compared position are 1, the bit in the resulting binary representation is 1, otherwise, the result is 0",examples:["5 & 3","bitAnd(53, 131)","[1, 12, 31] & 42"],seealso:["bitNot","bitOr","bitXor","leftShift","rightArithShift","rightLogShift"]},bitNot:{name:"bitNot",category:"Bitwise",syntax:["~x","bitNot(x)"],description:"Bitwise NOT operation. Performs a logical negation on each bit of the given value. Bits that are 0 become 1, and those that are 1 become 0.",examples:["~1","~2","bitNot([2, -3, 4])"],seealso:["bitAnd","bitOr","bitXor","leftShift","rightArithShift","rightLogShift"]},bitOr:{name:"bitOr",category:"Bitwise",syntax:["x | y","bitOr(x, y)"],description:"Bitwise OR operation. Performs the logical inclusive OR operation on each pair of corresponding bits of the two given values. The result in each position is 1 if the first bit is 1 or the second bit is 1 or both bits are 1, otherwise, the result is 0.",examples:["5 | 3","bitOr([1, 2, 3], 4)"],seealso:["bitAnd","bitNot","bitXor","leftShift","rightArithShift","rightLogShift"]},bitXor:{name:"bitXor",category:"Bitwise",syntax:["bitXor(x, y)"],description:"Bitwise XOR operation, exclusive OR. Performs the logical exclusive OR operation on each pair of corresponding bits of the two given values. The result in each position is 1 if only the first bit is 1 or only the second bit is 1, but will be 0 if both are 0 or both are 1.",examples:["bitOr(1, 2)","bitXor([2, 3, 4], 4)"],seealso:["bitAnd","bitNot","bitOr","leftShift","rightArithShift","rightLogShift"]},leftShift:{name:"leftShift",category:"Bitwise",syntax:["x << y","leftShift(x, y)"],description:"Bitwise left logical shift of a value x by y number of bits.",examples:["4 << 1","8 >> 1"],seealso:["bitAnd","bitNot","bitOr","bitXor","rightArithShift","rightLogShift"]},rightArithShift:{name:"rightArithShift",category:"Bitwise",syntax:["x >> y","rightArithShift(x, y)"],description:"Bitwise right arithmetic shift of a value x by y number of bits.",examples:["8 >> 1","4 << 1","-12 >> 2"],seealso:["bitAnd","bitNot","bitOr","bitXor","leftShift","rightLogShift"]},rightLogShift:{name:"rightLogShift",category:"Bitwise",syntax:["x >>> y","rightLogShift(x, y)"],description:"Bitwise right logical shift of a value x by y number of bits.",examples:["8 >>> 1","4 << 1","-12 >>> 2"],seealso:["bitAnd","bitNot","bitOr","bitXor","leftShift","rightArithShift"]},bellNumbers:{name:"bellNumbers",category:"Combinatorics",syntax:["bellNumbers(n)"],description:"The Bell Numbers count the number of partitions of a set. A partition is a pairwise disjoint subset of S whose union is S. `bellNumbers` only takes integer arguments. The following condition must be enforced: n >= 0.",examples:["bellNumbers(3)","bellNumbers(8)"],seealso:["stirlingS2"]},catalan:{name:"catalan",category:"Combinatorics",syntax:["catalan(n)"],description:"The Catalan Numbers enumerate combinatorial structures of many different types. catalan only takes integer arguments. The following condition must be enforced: n >= 0.",examples:["catalan(3)","catalan(8)"],seealso:["bellNumbers"]},composition:{name:"composition",category:"Combinatorics",syntax:["composition(n, k)"],description:"The composition counts of n into k parts. composition only takes integer arguments. The following condition must be enforced: k <= n.",examples:["composition(5, 3)"],seealso:["combinations"]},stirlingS2:{name:"stirlingS2",category:"Combinatorics",syntax:["stirlingS2(n, k)"],description:"he Stirling numbers of the second kind, counts the number of ways to partition a set of n labelled objects into k nonempty unlabelled subsets. `stirlingS2` only takes integer arguments. The following condition must be enforced: k <= n. If n = k or k = 1, then s(n,k) = 1.",examples:["stirlingS2(5, 3)"],seealso:["bellNumbers"]},config:{name:"config",category:"Core",syntax:["config()","config(options)"],description:"Get configuration or change configuration.",examples:["config()","1/3 + 1/4",'config({number: "Fraction"})',"1/3 + 1/4"],seealso:[]},import:{name:"import",category:"Core",syntax:["import(functions)","import(functions, options)"],description:"Import functions or constants from an object.",examples:["import({myFn: f(x)=x^2, myConstant: 32 })","myFn(2)","myConstant"],seealso:[]},typed:{name:"typed",category:"Core",syntax:["typed(signatures)","typed(name, signatures)"],description:"Create a typed function.",examples:['double = typed({ "number": f(x)=x+x, "string": f(x)=concat(x,x) })',"double(2)",'double("hello")'],seealso:[]},arg:{name:"arg",category:"Complex",syntax:["arg(x)"],description:"Compute the argument of a complex value. If x = a+bi, the argument is computed as atan2(b, a).",examples:["arg(2 + 2i)","atan2(3, 2)","arg(2 + 3i)"],seealso:["re","im","conj","abs"]},conj:{name:"conj",category:"Complex",syntax:["conj(x)"],description:"Compute the complex conjugate of a complex value. If x = a+bi, the complex conjugate is a-bi.",examples:["conj(2 + 3i)","conj(2 - 3i)","conj(-5.2i)"],seealso:["re","im","abs","arg"]},re:{name:"re",category:"Complex",syntax:["re(x)"],description:"Get the real part of a complex number.",examples:["re(2 + 3i)","im(2 + 3i)","re(-5.2i)","re(2.4)"],seealso:["im","conj","abs","arg"]},im:{name:"im",category:"Complex",syntax:["im(x)"],description:"Get the imaginary part of a complex number.",examples:["im(2 + 3i)","re(2 + 3i)","im(-5.2i)","im(2.4)"],seealso:["re","conj","abs","arg"]},evaluate:{name:"evaluate",category:"Expression",syntax:["evaluate(expression)","evaluate(expression, scope)","evaluate([expr1, expr2, expr3, ...])","evaluate([expr1, expr2, expr3, ...], scope)"],description:"Evaluate an expression or an array with expressions.",examples:['evaluate("2 + 3")','evaluate("sqrt(16)")','evaluate("2 inch to cm")','evaluate("sin(x * pi)", { "x": 1/2 })','evaluate(["width=2", "height=4","width*height"])'],seealso:[]},help:{name:"help",category:"Expression",syntax:["help(object)","help(string)"],description:"Display documentation on a function or data type.",examples:["help(sqrt)",'help("complex")'],seealso:[]},distance:{name:"distance",category:"Geometry",syntax:["distance([x1, y1], [x2, y2])","distance([[x1, y1], [x2, y2]])"],description:"Calculates the Euclidean distance between two points.",examples:["distance([0,0], [4,4])","distance([[0,0], [4,4]])"],seealso:[]},intersect:{name:"intersect",category:"Geometry",syntax:["intersect(expr1, expr2, expr3, expr4)","intersect(expr1, expr2, expr3)"],description:"Computes the intersection point of lines and/or planes.",examples:["intersect([0, 0], [10, 10], [10, 0], [0, 10])","intersect([1, 0, 1], [4, -2, 2], [1, 1, 1, 6])"],seealso:[]},and:{name:"and",category:"Logical",syntax:["x and y","and(x, y)"],description:"Logical and. Test whether two values are both defined with a nonzero/nonempty value.",examples:["true and false","true and true","2 and 4"],seealso:["not","or","xor"]},not:{name:"not",category:"Logical",syntax:["not x","not(x)"],description:"Logical not. Flips the boolean value of given argument.",examples:["not true","not false","not 2","not 0"],seealso:["and","or","xor"]},or:{name:"or",category:"Logical",syntax:["x or y","or(x, y)"],description:"Logical or. Test if at least one value is defined with a nonzero/nonempty value.",examples:["true or false","false or false","0 or 4"],seealso:["not","and","xor"]},xor:{name:"xor",category:"Logical",syntax:["x xor y","xor(x, y)"],description:"Logical exclusive or, xor. Test whether one and only one value is defined with a nonzero/nonempty value.",examples:["true xor false","false xor false","true xor true","0 xor 4"],seealso:["not","and","or"]},concat:{name:"concat",category:"Matrix",syntax:["concat(A, B, C, ...)","concat(A, B, C, ..., dim)"],description:"Concatenate matrices. By default, the matrices are concatenated by the last dimension. The dimension on which to concatenate can be provided as last argument.",examples:["A = [1, 2; 5, 6]","B = [3, 4; 7, 8]","concat(A, B)","concat(A, B, 1)","concat(A, B, 2)"],seealso:["det","diag","identity","inv","ones","range","size","squeeze","subset","trace","transpose","zeros"]},count:{name:"count",category:"Matrix",syntax:["count(x)"],description:"Count the number of elements of a matrix, array or string.",examples:["a = [1, 2; 3, 4; 5, 6]","count(a)","size(a)",'count("hello world")'],seealso:["size"]},cross:{name:"cross",category:"Matrix",syntax:["cross(A, B)"],description:"Calculate the cross product for two vectors in three dimensional space.",examples:["cross([1, 1, 0], [0, 1, 1])","cross([3, -3, 1], [4, 9, 2])","cross([2, 3, 4], [5, 6, 7])"],seealso:["multiply","dot"]},column:{name:"column",category:"Matrix",syntax:["column(x, index)"],description:"Return a column from a matrix or array.",examples:["A = [[1, 2], [3, 4]]","column(A, 1)","column(A, 2)"],seealso:["row","matrixFromColumns"]},ctranspose:{name:"ctranspose",category:"Matrix",syntax:["x'","ctranspose(x)"],description:"Complex Conjugate and Transpose a matrix",examples:["a = [1, 2, 3; 4, 5, 6]","a'","ctranspose(a)"],seealso:["concat","det","diag","identity","inv","ones","range","size","squeeze","subset","trace","zeros"]},det:{name:"det",category:"Matrix",syntax:["det(x)"],description:"Calculate the determinant of a matrix",examples:["det([1, 2; 3, 4])","det([-2, 2, 3; -1, 1, 3; 2, 0, -1])"],seealso:["concat","diag","identity","inv","ones","range","size","squeeze","subset","trace","transpose","zeros"]},diag:{name:"diag",category:"Matrix",syntax:["diag(x)","diag(x, k)"],description:"Create a diagonal matrix or retrieve the diagonal of a matrix. When x is a vector, a matrix with the vector values on the diagonal will be returned. When x is a matrix, a vector with the diagonal values of the matrix is returned. When k is provided, the k-th diagonal will be filled in or retrieved, if k is positive, the values are placed on the super diagonal. When k is negative, the values are placed on the sub diagonal.",examples:["diag(1:3)","diag(1:3, 1)","a = [1, 2, 3; 4, 5, 6; 7, 8, 9]","diag(a)"],seealso:["concat","det","identity","inv","ones","range","size","squeeze","subset","trace","transpose","zeros"]},diff:{name:"diff",category:"Matrix",syntax:["diff(arr)","diff(arr, dim)"],description:["Create a new matrix or array with the difference of the passed matrix or array.","Dim parameter is optional and used to indicant the dimension of the array/matrix to apply the difference","If no dimension parameter is passed it is assumed as dimension 0","Dimension is zero-based in javascript and one-based in the parser","Arrays must be 'rectangular' meaning arrays like [1, 2]","If something is passed as a matrix it will be returned as a matrix but other than that all matrices are converted to arrays"],examples:["A = [1, 2, 4, 7, 0]","diff(A)","diff(A, 1)","B = [[1, 2], [3, 4]]","diff(B)","diff(B, 1)","diff(B, 2)","diff(B, bignumber(2))","diff([[1, 2], matrix([3, 4])], 2)"],seealso:["subtract","partitionSelect"]},dot:{name:"dot",category:"Matrix",syntax:["dot(A, B)","A * B"],description:"Calculate the dot product of two vectors. The dot product of A = [a1, a2, a3, ..., an] and B = [b1, b2, b3, ..., bn] is defined as dot(A, B) = a1 * b1 + a2 * b2 + a3 * b3 + ... + an * bn",examples:["dot([2, 4, 1], [2, 2, 3])","[2, 4, 1] * [2, 2, 3]"],seealso:["multiply","cross"]},getMatrixDataType:{name:"getMatrixDataType",category:"Matrix",syntax:["getMatrixDataType(x)"],description:'Find the data type of all elements in a matrix or array, for example "number" if all items are a number and "Complex" if all values are complex numbers. If a matrix contains more than one data type, it will return "mixed".',examples:["getMatrixDataType([1, 2, 3])","getMatrixDataType([[5 cm], [2 inch]])",'getMatrixDataType([1, "text"])',"getMatrixDataType([1, bignumber(4)])"],seealso:["matrix","sparse","typeOf"]},identity:{name:"identity",category:"Matrix",syntax:["identity(n)","identity(m, n)","identity([m, n])"],description:"Returns the identity matrix with size m-by-n. The matrix has ones on the diagonal and zeros elsewhere.",examples:["identity(3)","identity(3, 5)","a = [1, 2, 3; 4, 5, 6]","identity(size(a))"],seealso:["concat","det","diag","inv","ones","range","size","squeeze","subset","trace","transpose","zeros"]},filter:{name:"filter",category:"Matrix",syntax:["filter(x, test)"],description:"Filter items in a matrix.",examples:["isPositive(x) = x > 0","filter([6, -2, -1, 4, 3], isPositive)","filter([6, -2, 0, 1, 0], x != 0)"],seealso:["sort","map","forEach"]},flatten:{name:"flatten",category:"Matrix",syntax:["flatten(x)"],description:"Flatten a multi dimensional matrix into a single dimensional matrix.",examples:["a = [1, 2, 3; 4, 5, 6]","size(a)","b = flatten(a)","size(b)"],seealso:["concat","resize","size","squeeze"]},forEach:{name:"forEach",category:"Matrix",syntax:["forEach(x, callback)"],description:"Iterates over all elements of a matrix/array, and executes the given callback function.",examples:["numberOfPets = {}","addPet(n) = numberOfPets[n] = (numberOfPets[n] ? numberOfPets[n]:0 ) + 1;",'forEach(["Dog","Cat","Cat"], addPet)',"numberOfPets"],seealso:["map","sort","filter"]},inv:{name:"inv",category:"Matrix",syntax:["inv(x)"],description:"Calculate the inverse of a matrix",examples:["inv([1, 2; 3, 4])","inv(4)","1 / 4"],seealso:["concat","det","diag","identity","ones","range","size","squeeze","subset","trace","transpose","zeros"]},pinv:{name:"pinv",category:"Matrix",syntax:["pinv(x)"],description:"Calculate the Moore–Penrose inverse of a matrix",examples:["pinv([1, 2; 3, 4])","pinv([[1, 0], [0, 1], [0, 1]])","pinv(4)"],seealso:["inv"]},eigs:{name:"eigs",category:"Matrix",syntax:["eigs(x)"],description:"Calculate the eigenvalues and eigenvectors of a real symmetric matrix",examples:["eigs([[5, 2.3], [2.3, 1]])"],seealso:["inv"]},kron:{name:"kron",category:"Matrix",syntax:["kron(x, y)"],description:"Calculates the kronecker product of 2 matrices or vectors.",examples:["kron([[1, 0], [0, 1]], [[1, 2], [3, 4]])","kron([1,1], [2,3,4])"],seealso:["multiply","dot","cross"]},matrixFromFunction:{name:"matrixFromFunction",category:"Matrix",syntax:["matrixFromFunction(size, fn)","matrixFromFunction(size, fn, format)","matrixFromFunction(size, fn, format, datatype)","matrixFromFunction(size, format, fn)","matrixFromFunction(size, format, datatype, fn)"],description:"Create a matrix by evaluating a generating function at each index.",examples:["f(I) = I[1] - I[2]","matrixFromFunction([3,3], f)","g(I) = I[1] - I[2] == 1 ? 4 : 0",'matrixFromFunction([100, 100], "sparse", g)',"matrixFromFunction([5], random)"],seealso:["matrix","matrixFromRows","matrixFromColumns","zeros"]},matrixFromRows:{name:"matrixFromRows",category:"Matrix",syntax:["matrixFromRows(...arr)","matrixFromRows(row1, row2)","matrixFromRows(row1, row2, row3)"],description:"Create a dense matrix from vectors as individual rows.",examples:["matrixFromRows([1, 2, 3], [[4],[5],[6]])"],seealso:["matrix","matrixFromColumns","matrixFromFunction","zeros"]},matrixFromColumns:{name:"matrixFromColumns",category:"Matrix",syntax:["matrixFromColumns(...arr)","matrixFromColumns(row1, row2)","matrixFromColumns(row1, row2, row3)"],description:"Create a dense matrix from vectors as individual columns.",examples:["matrixFromColumns([1, 2, 3], [[4],[5],[6]])"],seealso:["matrix","matrixFromRows","matrixFromFunction","zeros"]},map:{name:"map",category:"Matrix",syntax:["map(x, callback)"],description:"Create a new matrix or array with the results of the callback function executed on each entry of the matrix/array.",examples:["map([1, 2, 3], square)"],seealso:["filter","forEach"]},ones:{name:"ones",category:"Matrix",syntax:["ones(m)","ones(m, n)","ones(m, n, p, ...)","ones([m])","ones([m, n])","ones([m, n, p, ...])"],description:"Create a matrix containing ones.",examples:["ones(3)","ones(3, 5)","ones([2,3]) * 4.5","a = [1, 2, 3; 4, 5, 6]","ones(size(a))"],seealso:["concat","det","diag","identity","inv","range","size","squeeze","subset","trace","transpose","zeros"]},partitionSelect:{name:"partitionSelect",category:"Matrix",syntax:["partitionSelect(x, k)","partitionSelect(x, k, compare)"],description:"Partition-based selection of an array or 1D matrix. Will find the kth smallest value, and mutates the input array. Uses Quickselect.",examples:["partitionSelect([5, 10, 1], 2)",'partitionSelect(["C", "B", "A", "D"], 1, compareText)',"arr = [5, 2, 1]","partitionSelect(arr, 0) # returns 1, arr is now: [1, 2, 5]","arr","partitionSelect(arr, 1, 'desc') # returns 2, arr is now: [5, 2, 1]","arr"],seealso:["sort"]},range:{name:"range",category:"Type",syntax:["start:end","start:step:end","range(start, end)","range(start, end, step)","range(string)"],description:"Create a range. Lower bound of the range is included, upper bound is excluded.",examples:["1:5","3:-1:-3","range(3, 7)","range(0, 12, 2)",'range("4:10")',"range(1m, 1m, 3m)","a = [1, 2, 3, 4; 5, 6, 7, 8]","a[1:2, 1:2]"],seealso:["concat","det","diag","identity","inv","ones","size","squeeze","subset","trace","transpose","zeros"]},resize:{name:"resize",category:"Matrix",syntax:["resize(x, size)","resize(x, size, defaultValue)"],description:"Resize a matrix.",examples:["resize([1,2,3,4,5], [3])","resize([1,2,3], [5])","resize([1,2,3], [5], -1)","resize(2, [2, 3])",'resize("hello", [8], "!")'],seealso:["size","subset","squeeze","reshape"]},reshape:{name:"reshape",category:"Matrix",syntax:["reshape(x, sizes)"],description:"Reshape a multi dimensional array to fit the specified dimensions.",examples:["reshape([1, 2, 3, 4, 5, 6], [2, 3])","reshape([[1, 2], [3, 4]], [1, 4])","reshape([[1, 2], [3, 4]], [4])","reshape([1, 2, 3, 4], [-1, 2])"],seealso:["size","squeeze","resize"]},rotate:{name:"rotate",category:"Matrix",syntax:["rotate(w, theta)","rotate(w, theta, v)"],description:"Returns a 2-D rotation matrix (2x2) for a given angle (in radians). Returns a 2-D rotation matrix (3x3) of a given angle (in radians) around given axis.",examples:["rotate([1, 0], pi / 2)",'rotate(matrix([1, 0]), unit("35deg"))','rotate([1, 0, 0], unit("90deg"), [0, 0, 1])','rotate(matrix([1, 0, 0]), unit("90deg"), matrix([0, 0, 1]))'],seealso:["matrix","rotationMatrix"]},rotationMatrix:{name:"rotationMatrix",category:"Matrix",syntax:["rotationMatrix(theta)","rotationMatrix(theta, v)","rotationMatrix(theta, v, format)"],description:"Returns a 2-D rotation matrix (2x2) for a given angle (in radians). Returns a 2-D rotation matrix (3x3) of a given angle (in radians) around given axis.",examples:["rotationMatrix(pi / 2)",'rotationMatrix(unit("45deg"), [0, 0, 1])','rotationMatrix(1, matrix([0, 0, 1]), "sparse")'],seealso:["cos","sin"]},row:{name:"row",category:"Matrix",syntax:["row(x, index)"],description:"Return a row from a matrix or array.",examples:["A = [[1, 2], [3, 4]]","row(A, 1)","row(A, 2)"],seealso:["column","matrixFromRows"]},size:{name:"size",category:"Matrix",syntax:["size(x)"],description:"Calculate the size of a matrix.",examples:["size(2.3)",'size("hello world")',"a = [1, 2; 3, 4; 5, 6]","size(a)","size(1:6)"],seealso:["concat","count","det","diag","identity","inv","ones","range","squeeze","subset","trace","transpose","zeros"]},sort:{name:"sort",category:"Matrix",syntax:["sort(x)","sort(x, compare)"],description:'Sort the items in a matrix. Compare can be a string "asc", "desc", "natural", or a custom sort function.',examples:["sort([5, 10, 1])",'sort(["C", "B", "A", "D"], "natural")',"sortByLength(a, b) = size(a)[1] - size(b)[1]",'sort(["Langdon", "Tom", "Sara"], sortByLength)','sort(["10", "1", "2"], "natural")'],seealso:["map","filter","forEach"]},squeeze:{name:"squeeze",category:"Matrix",syntax:["squeeze(x)"],description:"Remove inner and outer singleton dimensions from a matrix.",examples:["a = zeros(3,2,1)","size(squeeze(a))","b = zeros(1,1,3)","size(squeeze(b))"],seealso:["concat","det","diag","identity","inv","ones","range","size","subset","trace","transpose","zeros"]},subset:{name:"subset",category:"Matrix",syntax:["value(index)","value(index) = replacement","subset(value, [index])","subset(value, [index], replacement)"],description:"Get or set a subset of the entries of a matrix or characters of a string. Indexes are one-based. There should be one index specification for each dimension of the target. Each specification can be a single index, a list of indices, or a range in colon notation `l:u`. In a range, both the lower bound l and upper bound u are included; and if a bound is omitted it defaults to the most extreme valid value. The cartesian product of the indices specified in each dimension determines the target of the operation.",examples:["d = [1, 2; 3, 4]","e = []","e[1, 1:2] = [5, 6]","e[2, :] = [7, 8]","f = d * e","f[2, 1]","f[:, 1]","f[[1,2], [1,3]] = [9, 10; 11, 12]","f"],seealso:["concat","det","diag","identity","inv","ones","range","size","squeeze","trace","transpose","zeros"]},trace:{name:"trace",category:"Matrix",syntax:["trace(A)"],description:"Calculate the trace of a matrix: the sum of the elements on the main diagonal of a square matrix.",examples:["A = [1, 2, 3; -1, 2, 3; 2, 0, 3]","trace(A)"],seealso:["concat","det","diag","identity","inv","ones","range","size","squeeze","subset","transpose","zeros"]},transpose:{name:"transpose",category:"Matrix",syntax:["x'","transpose(x)"],description:"Transpose a matrix",examples:["a = [1, 2, 3; 4, 5, 6]","a'","transpose(a)"],seealso:["concat","det","diag","identity","inv","ones","range","size","squeeze","subset","trace","zeros"]},zeros:{name:"zeros",category:"Matrix",syntax:["zeros(m)","zeros(m, n)","zeros(m, n, p, ...)","zeros([m])","zeros([m, n])","zeros([m, n, p, ...])"],description:"Create a matrix containing zeros.",examples:["zeros(3)","zeros(3, 5)","a = [1, 2, 3; 4, 5, 6]","zeros(size(a))"],seealso:["concat","det","diag","identity","inv","ones","range","size","squeeze","subset","trace","transpose"]},fft:{name:"fft",category:"Matrix",syntax:["fft(x)"],description:"Calculate N-dimensional fourier transform",examples:["fft([[1, 0], [1, 0]])"],seealso:["ifft"]},ifft:{name:"ifft",category:"Matrix",syntax:["ifft(x)"],description:"Calculate N-dimensional inverse fourier transform",examples:["ifft([[2, 2], [0, 0]])"],seealso:["fft"]},sylvester:{name:"sylvester",category:"Algebra",syntax:["sylvester(A,B,C)"],description:"Solves the real-valued Sylvester equation AX+XB=C for X",examples:["sylvester([[-1, -2], [1, 1]], [[-2, 1], [-1, 2]], [[-3, 2], [3, 0]])","A = [[-1, -2], [1, 1]]; B = [[2, -1], [1, -2]]; C = [[-3, 2], [3, 0]]","sylvester(A, B, C)"],seealso:["schur","lyap"]},schur:{name:"schur",category:"Algebra",syntax:["schur(A)"],description:"Performs a real Schur decomposition of the real matrix A = UTU'",examples:["schur([[1, 0], [-4, 3]])","A = [[1, 0], [-4, 3]]","schur(A)"],seealso:["lyap","sylvester"]},lyap:{name:"lyap",category:"Algebra",syntax:["lyap(A,Q)"],description:"Solves the Continuous-time Lyapunov equation AP+PA'+Q=0 for P",examples:["lyap([[-2, 0], [1, -4]], [[3, 1], [1, 3]])","A = [[-2, 0], [1, -4]]","Q = [[3, 1], [1, 3]]","lyap(A,Q)"],seealso:["schur","sylvester"]},solveODE:{name:"solveODE",category:"Numeric",syntax:["solveODE(func, tspan, y0)","solveODE(func, tspan, y0, options)"],description:"Numerical Integration of Ordinary Differential Equations.",examples:["f(t,y) = y","tspan = [0, 4]","solveODE(f, tspan, 1)","solveODE(f, tspan, [1, 2])",'solveODE(f, tspan, 1, { method:"RK23", maxStep:0.1 })'],seealso:["derivative","simplifyCore"]},combinations:{name:"combinations",category:"Probability",syntax:["combinations(n, k)"],description:"Compute the number of combinations of n items taken k at a time",examples:["combinations(7, 5)"],seealso:["combinationsWithRep","permutations","factorial"]},combinationsWithRep:{name:"combinationsWithRep",category:"Probability",syntax:["combinationsWithRep(n, k)"],description:"Compute the number of combinations of n items taken k at a time with replacements.",examples:["combinationsWithRep(7, 5)"],seealso:["combinations","permutations","factorial"]},factorial:{name:"factorial",category:"Probability",syntax:["n!","factorial(n)"],description:"Compute the factorial of a value",examples:["5!","5 * 4 * 3 * 2 * 1","3!"],seealso:["combinations","combinationsWithRep","permutations","gamma"]},gamma:{name:"gamma",category:"Probability",syntax:["gamma(n)"],description:"Compute the gamma function. For small values, the Lanczos approximation is used, and for large values the extended Stirling approximation.",examples:["gamma(4)","3!","gamma(1/2)","sqrt(pi)"],seealso:["factorial"]},kldivergence:{name:"kldivergence",category:"Probability",syntax:["kldivergence(x, y)"],description:"Calculate the Kullback-Leibler (KL) divergence between two distributions.",examples:["kldivergence([0.7,0.5,0.4], [0.2,0.9,0.5])"],seealso:[]},lgamma:{name:"lgamma",category:"Probability",syntax:["lgamma(n)"],description:"Logarithm of the gamma function for real, positive numbers and complex numbers, using Lanczos approximation for numbers and Stirling series for complex numbers.",examples:["lgamma(4)","lgamma(1/2)","lgamma(i)","lgamma(complex(1.1, 2))"],seealso:["gamma"]},multinomial:{name:"multinomial",category:"Probability",syntax:["multinomial(A)"],description:"Multinomial Coefficients compute the number of ways of picking a1, a2, ..., ai unordered outcomes from `n` possibilities. multinomial takes one array of integers as an argument. The following condition must be enforced: every ai > 0.",examples:["multinomial([1, 2, 1])"],seealso:["combinations","factorial"]},permutations:{name:"permutations",category:"Probability",syntax:["permutations(n)","permutations(n, k)"],description:"Compute the number of permutations of n items taken k at a time",examples:["permutations(5)","permutations(5, 3)"],seealso:["combinations","combinationsWithRep","factorial"]},pickRandom:{name:"pickRandom",category:"Probability",syntax:["pickRandom(array)","pickRandom(array, number)","pickRandom(array, weights)","pickRandom(array, number, weights)","pickRandom(array, weights, number)"],description:"Pick a random entry from a given array.",examples:["pickRandom(0:10)","pickRandom([1, 3, 1, 6])","pickRandom([1, 3, 1, 6], 2)","pickRandom([1, 3, 1, 6], [2, 3, 2, 1])","pickRandom([1, 3, 1, 6], 2, [2, 3, 2, 1])","pickRandom([1, 3, 1, 6], [2, 3, 2, 1], 2)"],seealso:["random","randomInt"]},random:{name:"random",category:"Probability",syntax:["random()","random(max)","random(min, max)","random(size)","random(size, max)","random(size, min, max)"],description:"Return a random number.",examples:["random()","random(10, 20)","random([2, 3])"],seealso:["pickRandom","randomInt"]},randomInt:{name:"randomInt",category:"Probability",syntax:["randomInt(max)","randomInt(min, max)","randomInt(size)","randomInt(size, max)","randomInt(size, min, max)"],description:"Return a random integer number",examples:["randomInt(10, 20)","randomInt([2, 3], 10)"],seealso:["pickRandom","random"]},compare:{name:"compare",category:"Relational",syntax:["compare(x, y)"],description:"Compare two values. Returns 1 when x > y, -1 when x < y, and 0 when x == y.",examples:["compare(2, 3)","compare(3, 2)","compare(2, 2)","compare(5cm, 40mm)","compare(2, [1, 2, 3])"],seealso:["equal","unequal","smaller","smallerEq","largerEq","compareNatural","compareText"]},compareNatural:{name:"compareNatural",category:"Relational",syntax:["compareNatural(x, y)"],description:"Compare two values of any type in a deterministic, natural way. Returns 1 when x > y, -1 when x < y, and 0 when x == y.",examples:["compareNatural(2, 3)","compareNatural(3, 2)","compareNatural(2, 2)","compareNatural(5cm, 40mm)",'compareNatural("2", "10")',"compareNatural(2 + 3i, 2 + 4i)","compareNatural([1, 2, 4], [1, 2, 3])","compareNatural([1, 5], [1, 2, 3])","compareNatural([1, 2], [1, 2])","compareNatural({a: 2}, {a: 4})"],seealso:["equal","unequal","smaller","smallerEq","largerEq","compare","compareText"]},compareText:{name:"compareText",category:"Relational",syntax:["compareText(x, y)"],description:"Compare two strings lexically. Comparison is case sensitive. Returns 1 when x > y, -1 when x < y, and 0 when x == y.",examples:['compareText("B", "A")','compareText("A", "B")','compareText("A", "A")','compareText("2", "10")','compare("2", "10")',"compare(2, 10)",'compareNatural("2", "10")','compareText("B", ["A", "B", "C"])'],seealso:["compare","compareNatural"]},deepEqual:{name:"deepEqual",category:"Relational",syntax:["deepEqual(x, y)"],description:"Check equality of two matrices element wise. Returns true if the size of both matrices is equal and when and each of the elements are equal.",examples:["deepEqual([1,3,4], [1,3,4])","deepEqual([1,3,4], [1,3])"],seealso:["equal","unequal","smaller","larger","smallerEq","largerEq","compare"]},equal:{name:"equal",category:"Relational",syntax:["x == y","equal(x, y)"],description:"Check equality of two values. Returns true if the values are equal, and false if not.",examples:["2+2 == 3","2+2 == 4","a = 3.2","b = 6-2.8","a == b","50cm == 0.5m"],seealso:["unequal","smaller","larger","smallerEq","largerEq","compare","deepEqual","equalText"]},equalText:{name:"equalText",category:"Relational",syntax:["equalText(x, y)"],description:"Check equality of two strings. Comparison is case sensitive. Returns true if the values are equal, and false if not.",examples:['equalText("Hello", "Hello")','equalText("a", "A")','equal("2e3", "2000")','equalText("2e3", "2000")','equalText("B", ["A", "B", "C"])'],seealso:["compare","compareNatural","compareText","equal"]},larger:{name:"larger",category:"Relational",syntax:["x > y","larger(x, y)"],description:"Check if value x is larger than y. Returns true if x is larger than y, and false if not.",examples:["2 > 3","5 > 2*2","a = 3.3","b = 6-2.8","(a > b)","(b < a)","5 cm > 2 inch"],seealso:["equal","unequal","smaller","smallerEq","largerEq","compare"]},largerEq:{name:"largerEq",category:"Relational",syntax:["x >= y","largerEq(x, y)"],description:"Check if value x is larger or equal to y. Returns true if x is larger or equal to y, and false if not.",examples:["2 >= 1+1","2 > 1+1","a = 3.2","b = 6-2.8","(a >= b)"],seealso:["equal","unequal","smallerEq","smaller","compare"]},smaller:{name:"smaller",category:"Relational",syntax:["x < y","smaller(x, y)"],description:"Check if value x is smaller than value y. Returns true if x is smaller than y, and false if not.",examples:["2 < 3","5 < 2*2","a = 3.3","b = 6-2.8","(a < b)","5 cm < 2 inch"],seealso:["equal","unequal","larger","smallerEq","largerEq","compare"]},smallerEq:{name:"smallerEq",category:"Relational",syntax:["x <= y","smallerEq(x, y)"],description:"Check if value x is smaller or equal to value y. Returns true if x is smaller than y, and false if not.",examples:["2 <= 1+1","2 < 1+1","a = 3.2","b = 6-2.8","(a <= b)"],seealso:["equal","unequal","larger","smaller","largerEq","compare"]},unequal:{name:"unequal",category:"Relational",syntax:["x != y","unequal(x, y)"],description:"Check unequality of two values. Returns true if the values are unequal, and false if they are equal.",examples:["2+2 != 3","2+2 != 4","a = 3.2","b = 6-2.8","a != b","50cm != 0.5m","5 cm != 2 inch"],seealso:["equal","smaller","larger","smallerEq","largerEq","compare","deepEqual"]},setCartesian:{name:"setCartesian",category:"Set",syntax:["setCartesian(set1, set2)"],description:"Create the cartesian product of two (multi)sets. Multi-dimension arrays will be converted to single-dimension arrays and the values will be sorted in ascending order before the operation.",examples:["setCartesian([1, 2], [3, 4])"],seealso:["setUnion","setIntersect","setDifference","setPowerset"]},setDifference:{name:"setDifference",category:"Set",syntax:["setDifference(set1, set2)"],description:"Create the difference of two (multi)sets: every element of set1, that is not the element of set2. Multi-dimension arrays will be converted to single-dimension arrays before the operation.",examples:["setDifference([1, 2, 3, 4], [3, 4, 5, 6])","setDifference([[1, 2], [3, 4]], [[3, 4], [5, 6]])"],seealso:["setUnion","setIntersect","setSymDifference"]},setDistinct:{name:"setDistinct",category:"Set",syntax:["setDistinct(set)"],description:"Collect the distinct elements of a multiset. A multi-dimension array will be converted to a single-dimension array before the operation.",examples:["setDistinct([1, 1, 1, 2, 2, 3])"],seealso:["setMultiplicity"]},setIntersect:{name:"setIntersect",category:"Set",syntax:["setIntersect(set1, set2)"],description:"Create the intersection of two (multi)sets. Multi-dimension arrays will be converted to single-dimension arrays before the operation.",examples:["setIntersect([1, 2, 3, 4], [3, 4, 5, 6])","setIntersect([[1, 2], [3, 4]], [[3, 4], [5, 6]])"],seealso:["setUnion","setDifference"]},setIsSubset:{name:"setIsSubset",category:"Set",syntax:["setIsSubset(set1, set2)"],description:"Check whether a (multi)set is a subset of another (multi)set: every element of set1 is the element of set2. Multi-dimension arrays will be converted to single-dimension arrays before the operation.",examples:["setIsSubset([1, 2], [3, 4, 5, 6])","setIsSubset([3, 4], [3, 4, 5, 6])"],seealso:["setUnion","setIntersect","setDifference"]},setMultiplicity:{name:"setMultiplicity",category:"Set",syntax:["setMultiplicity(element, set)"],description:"Count the multiplicity of an element in a multiset. A multi-dimension array will be converted to a single-dimension array before the operation.",examples:["setMultiplicity(1, [1, 2, 2, 4])","setMultiplicity(2, [1, 2, 2, 4])"],seealso:["setDistinct","setSize"]},setPowerset:{name:"setPowerset",category:"Set",syntax:["setPowerset(set)"],description:"Create the powerset of a (multi)set: the powerset contains very possible subsets of a (multi)set. A multi-dimension array will be converted to a single-dimension array before the operation.",examples:["setPowerset([1, 2, 3])"],seealso:["setCartesian"]},setSize:{name:"setSize",category:"Set",syntax:["setSize(set)","setSize(set, unique)"],description:'Count the number of elements of a (multi)set. When the second parameter "unique" is true, count only the unique values. A multi-dimension array will be converted to a single-dimension array before the operation.',examples:["setSize([1, 2, 2, 4])","setSize([1, 2, 2, 4], true)"],seealso:["setUnion","setIntersect","setDifference"]},setSymDifference:{name:"setSymDifference",category:"Set",syntax:["setSymDifference(set1, set2)"],description:"Create the symmetric difference of two (multi)sets. Multi-dimension arrays will be converted to single-dimension arrays before the operation.",examples:["setSymDifference([1, 2, 3, 4], [3, 4, 5, 6])","setSymDifference([[1, 2], [3, 4]], [[3, 4], [5, 6]])"],seealso:["setUnion","setIntersect","setDifference"]},setUnion:{name:"setUnion",category:"Set",syntax:["setUnion(set1, set2)"],description:"Create the union of two (multi)sets. Multi-dimension arrays will be converted to single-dimension arrays before the operation.",examples:["setUnion([1, 2, 3, 4], [3, 4, 5, 6])","setUnion([[1, 2], [3, 4]], [[3, 4], [5, 6]])"],seealso:["setIntersect","setDifference"]},zpk2tf:{name:"zpk2tf",category:"Signal",syntax:["zpk2tf(z, p, k)"],description:"Compute the transfer function of a zero-pole-gain model.",examples:["zpk2tf([1, 2], [-1, -2], 1)","zpk2tf([1, 2], [-1, -2])","zpk2tf([1 - 3i, 2 + 2i], [-1, -2])"],seealso:[]},freqz:{name:"freqz",category:"Signal",syntax:["freqz(b, a)","freqz(b, a, w)"],description:"Calculates the frequency response of a filter given its numerator and denominator coefficients.",examples:["freqz([1, 2], [1, 2, 3])","freqz([1, 2], [1, 2, 3], [0, 1])","freqz([1, 2], [1, 2, 3], 512)"],seealso:[]},erf:{name:"erf",category:"Special",syntax:["erf(x)"],description:"Compute the erf function of a value using a rational Chebyshev approximations for different intervals of x",examples:["erf(0.2)","erf(-0.5)","erf(4)"],seealso:[]},cumsum:{name:"cumsum",category:"Statistics",syntax:["cumsum(a, b, c, ...)","cumsum(A)"],description:"Compute the cumulative sum of all values.",examples:["cumsum(2, 3, 4, 1)","cumsum([2, 3, 4, 1])","cumsum([1, 2; 3, 4])","cumsum([1, 2; 3, 4], 1)","cumsum([1, 2; 3, 4], 2)"],seealso:["max","mean","median","min","prod","std","sum","variance"]},mad:{name:"mad",category:"Statistics",syntax:["mad(a, b, c, ...)","mad(A)"],description:"Compute the median absolute deviation of a matrix or a list with values. The median absolute deviation is defined as the median of the absolute deviations from the median.",examples:["mad(10, 20, 30)","mad([1, 2, 3])"],seealso:["mean","median","std","abs"]},max:{name:"max",category:"Statistics",syntax:["max(a, b, c, ...)","max(A)","max(A, dimension)"],description:"Compute the maximum value of a list of values.",examples:["max(2, 3, 4, 1)","max([2, 3, 4, 1])","max([2, 5; 4, 3])","max([2, 5; 4, 3], 1)","max([2, 5; 4, 3], 2)","max(2.7, 7.1, -4.5, 2.0, 4.1)","min(2.7, 7.1, -4.5, 2.0, 4.1)"],seealso:["mean","median","min","prod","std","sum","variance"]},mean:{name:"mean",category:"Statistics",syntax:["mean(a, b, c, ...)","mean(A)","mean(A, dimension)"],description:"Compute the arithmetic mean of a list of values.",examples:["mean(2, 3, 4, 1)","mean([2, 3, 4, 1])","mean([2, 5; 4, 3])","mean([2, 5; 4, 3], 1)","mean([2, 5; 4, 3], 2)","mean([1.0, 2.7, 3.2, 4.0])"],seealso:["max","median","min","prod","std","sum","variance"]},median:{name:"median",category:"Statistics",syntax:["median(a, b, c, ...)","median(A)"],description:"Compute the median of all values. The values are sorted and the middle value is returned. In case of an even number of values, the average of the two middle values is returned.",examples:["median(5, 2, 7)","median([3, -1, 5, 7])"],seealso:["max","mean","min","prod","std","sum","variance","quantileSeq"]},min:{name:"min",category:"Statistics",syntax:["min(a, b, c, ...)","min(A)","min(A, dimension)"],description:"Compute the minimum value of a list of values.",examples:["min(2, 3, 4, 1)","min([2, 3, 4, 1])","min([2, 5; 4, 3])","min([2, 5; 4, 3], 1)","min([2, 5; 4, 3], 2)","min(2.7, 7.1, -4.5, 2.0, 4.1)","max(2.7, 7.1, -4.5, 2.0, 4.1)"],seealso:["max","mean","median","prod","std","sum","variance"]},mode:{name:"mode",category:"Statistics",syntax:["mode(a, b, c, ...)","mode(A)","mode(A, a, b, B, c, ...)"],description:"Computes the mode of all values as an array. In case mode being more than one, multiple values are returned in an array.",examples:["mode(2, 1, 4, 3, 1)","mode([1, 2.7, 3.2, 4, 2.7])","mode(1, 4, 6, 1, 6)"],seealso:["max","mean","min","median","prod","std","sum","variance"]},prod:{name:"prod",category:"Statistics",syntax:["prod(a, b, c, ...)","prod(A)"],description:"Compute the product of all values.",examples:["prod(2, 3, 4)","prod([2, 3, 4])","prod([2, 5; 4, 3])"],seealso:["max","mean","min","median","min","std","sum","variance"]},quantileSeq:{name:"quantileSeq",category:"Statistics",syntax:["quantileSeq(A, prob[, sorted])","quantileSeq(A, [prob1, prob2, ...][, sorted])","quantileSeq(A, N[, sorted])"],description:"Compute the prob order quantile of a matrix or a list with values. The sequence is sorted and the middle value is returned. Supported types of sequence values are: Number, BigNumber, Unit Supported types of probablity are: Number, BigNumber. \n\nIn case of a (multi dimensional) array or matrix, the prob order quantile of all elements will be calculated.",examples:["quantileSeq([3, -1, 5, 7], 0.5)","quantileSeq([3, -1, 5, 7], [1/3, 2/3])","quantileSeq([3, -1, 5, 7], 2)","quantileSeq([-1, 3, 5, 7], 0.5, true)"],seealso:["mean","median","min","max","prod","std","sum","variance"]},std:{name:"std",category:"Statistics",syntax:["std(a, b, c, ...)","std(A)","std(A, dimension)","std(A, normalization)","std(A, dimension, normalization)"],description:'Compute the standard deviation of all values, defined as std(A) = sqrt(variance(A)). Optional parameter normalization can be "unbiased" (default), "uncorrected", or "biased".',examples:["std(2, 4, 6)","std([2, 4, 6, 8])",'std([2, 4, 6, 8], "uncorrected")','std([2, 4, 6, 8], "biased")',"std([1, 2, 3; 4, 5, 6])"],seealso:["max","mean","min","median","prod","sum","variance"]},sum:{name:"sum",category:"Statistics",syntax:["sum(a, b, c, ...)","sum(A)","sum(A, dimension)"],description:"Compute the sum of all values.",examples:["sum(2, 3, 4, 1)","sum([2, 3, 4, 1])","sum([2, 5; 4, 3])"],seealso:["max","mean","median","min","prod","std","sum","variance"]},variance:{name:"variance",category:"Statistics",syntax:["variance(a, b, c, ...)","variance(A)","variance(A, dimension)","variance(A, normalization)","variance(A, dimension, normalization)"],description:'Compute the variance of all values. Optional parameter normalization can be "unbiased" (default), "uncorrected", or "biased".',examples:["variance(2, 4, 6)","variance([2, 4, 6, 8])",'variance([2, 4, 6, 8], "uncorrected")','variance([2, 4, 6, 8], "biased")',"variance([1, 2, 3; 4, 5, 6])"],seealso:["max","mean","min","median","min","prod","std","sum"]},acos:{name:"acos",category:"Trigonometry",syntax:["acos(x)"],description:"Compute the inverse cosine of a value in radians.",examples:["acos(0.5)","acos(cos(2.3))"],seealso:["cos","atan","asin"]},acosh:{name:"acosh",category:"Trigonometry",syntax:["acosh(x)"],description:"Calculate the hyperbolic arccos of a value, defined as `acosh(x) = ln(sqrt(x^2 - 1) + x)`.",examples:["acosh(1.5)"],seealso:["cosh","asinh","atanh"]},acot:{name:"acot",category:"Trigonometry",syntax:["acot(x)"],description:"Calculate the inverse cotangent of a value.",examples:["acot(0.5)","acot(cot(0.5))","acot(2)"],seealso:["cot","atan"]},acoth:{name:"acoth",category:"Trigonometry",syntax:["acoth(x)"],description:"Calculate the hyperbolic arccotangent of a value, defined as `acoth(x) = (ln((x+1)/x) + ln(x/(x-1))) / 2`.",examples:["acoth(2)","acoth(0.5)"],seealso:["acsch","asech"]},acsc:{name:"acsc",category:"Trigonometry",syntax:["acsc(x)"],description:"Calculate the inverse cotangent of a value.",examples:["acsc(2)","acsc(csc(0.5))","acsc(0.5)"],seealso:["csc","asin","asec"]},acsch:{name:"acsch",category:"Trigonometry",syntax:["acsch(x)"],description:"Calculate the hyperbolic arccosecant of a value, defined as `acsch(x) = ln(1/x + sqrt(1/x^2 + 1))`.",examples:["acsch(0.5)"],seealso:["asech","acoth"]},asec:{name:"asec",category:"Trigonometry",syntax:["asec(x)"],description:"Calculate the inverse secant of a value.",examples:["asec(0.5)","asec(sec(0.5))","asec(2)"],seealso:["acos","acot","acsc"]},asech:{name:"asech",category:"Trigonometry",syntax:["asech(x)"],description:"Calculate the inverse secant of a value.",examples:["asech(0.5)"],seealso:["acsch","acoth"]},asin:{name:"asin",category:"Trigonometry",syntax:["asin(x)"],description:"Compute the inverse sine of a value in radians.",examples:["asin(0.5)","asin(sin(0.5))"],seealso:["sin","acos","atan"]},asinh:{name:"asinh",category:"Trigonometry",syntax:["asinh(x)"],description:"Calculate the hyperbolic arcsine of a value, defined as `asinh(x) = ln(x + sqrt(x^2 + 1))`.",examples:["asinh(0.5)"],seealso:["acosh","atanh"]},atan:{name:"atan",category:"Trigonometry",syntax:["atan(x)"],description:"Compute the inverse tangent of a value in radians.",examples:["atan(0.5)","atan(tan(0.5))"],seealso:["tan","acos","asin"]},atanh:{name:"atanh",category:"Trigonometry",syntax:["atanh(x)"],description:"Calculate the hyperbolic arctangent of a value, defined as `atanh(x) = ln((1 + x)/(1 - x)) / 2`.",examples:["atanh(0.5)"],seealso:["acosh","asinh"]},atan2:{name:"atan2",category:"Trigonometry",syntax:["atan2(y, x)"],description:"Computes the principal value of the arc tangent of y/x in radians.",examples:["atan2(2, 2) / pi","angle = 60 deg in rad","x = cos(angle)","y = sin(angle)","atan2(y, x)"],seealso:["sin","cos","tan"]},cos:{name:"cos",category:"Trigonometry",syntax:["cos(x)"],description:"Compute the cosine of x in radians.",examples:["cos(2)","cos(pi / 4) ^ 2","cos(180 deg)","cos(60 deg)","sin(0.2)^2 + cos(0.2)^2"],seealso:["acos","sin","tan"]},cosh:{name:"cosh",category:"Trigonometry",syntax:["cosh(x)"],description:"Compute the hyperbolic cosine of x in radians.",examples:["cosh(0.5)"],seealso:["sinh","tanh","coth"]},cot:{name:"cot",category:"Trigonometry",syntax:["cot(x)"],description:"Compute the cotangent of x in radians. Defined as 1/tan(x)",examples:["cot(2)","1 / tan(2)"],seealso:["sec","csc","tan"]},coth:{name:"coth",category:"Trigonometry",syntax:["coth(x)"],description:"Compute the hyperbolic cotangent of x in radians.",examples:["coth(2)","1 / tanh(2)"],seealso:["sech","csch","tanh"]},csc:{name:"csc",category:"Trigonometry",syntax:["csc(x)"],description:"Compute the cosecant of x in radians. Defined as 1/sin(x)",examples:["csc(2)","1 / sin(2)"],seealso:["sec","cot","sin"]},csch:{name:"csch",category:"Trigonometry",syntax:["csch(x)"],description:"Compute the hyperbolic cosecant of x in radians. Defined as 1/sinh(x)",examples:["csch(2)","1 / sinh(2)"],seealso:["sech","coth","sinh"]},sec:{name:"sec",category:"Trigonometry",syntax:["sec(x)"],description:"Compute the secant of x in radians. Defined as 1/cos(x)",examples:["sec(2)","1 / cos(2)"],seealso:["cot","csc","cos"]},sech:{name:"sech",category:"Trigonometry",syntax:["sech(x)"],description:"Compute the hyperbolic secant of x in radians. Defined as 1/cosh(x)",examples:["sech(2)","1 / cosh(2)"],seealso:["coth","csch","cosh"]},sin:{name:"sin",category:"Trigonometry",syntax:["sin(x)"],description:"Compute the sine of x in radians.",examples:["sin(2)","sin(pi / 4) ^ 2","sin(90 deg)","sin(30 deg)","sin(0.2)^2 + cos(0.2)^2"],seealso:["asin","cos","tan"]},sinh:{name:"sinh",category:"Trigonometry",syntax:["sinh(x)"],description:"Compute the hyperbolic sine of x in radians.",examples:["sinh(0.5)"],seealso:["cosh","tanh"]},tan:{name:"tan",category:"Trigonometry",syntax:["tan(x)"],description:"Compute the tangent of x in radians.",examples:["tan(0.5)","sin(0.5) / cos(0.5)","tan(pi / 4)","tan(45 deg)"],seealso:["atan","sin","cos"]},tanh:{name:"tanh",category:"Trigonometry",syntax:["tanh(x)"],description:"Compute the hyperbolic tangent of x in radians.",examples:["tanh(0.5)","sinh(0.5) / cosh(0.5)"],seealso:["sinh","cosh"]},to:{name:"to",category:"Units",syntax:["x to unit","to(x, unit)"],description:"Change the unit of a value.",examples:["5 inch to cm","3.2kg to g","16 bytes in bits"],seealso:[]},clone:{name:"clone",category:"Utils",syntax:["clone(x)"],description:"Clone a variable. Creates a copy of primitive variables,and a deep copy of matrices",examples:["clone(3.5)","clone(2 - 4i)","clone(45 deg)","clone([1, 2; 3, 4])",'clone("hello world")'],seealso:[]},format:{name:"format",category:"Utils",syntax:["format(value)","format(value, precision)"],description:"Format a value of any type as string.",examples:["format(2.3)","format(3 - 4i)","format([])","format(pi, 3)"],seealso:["print"]},bin:{name:"bin",category:"Utils",syntax:["bin(value)"],description:"Format a number as binary",examples:["bin(2)"],seealso:["oct","hex"]},oct:{name:"oct",category:"Utils",syntax:["oct(value)"],description:"Format a number as octal",examples:["oct(56)"],seealso:["bin","hex"]},hex:{name:"hex",category:"Utils",syntax:["hex(value)"],description:"Format a number as hexadecimal",examples:["hex(240)"],seealso:["bin","oct"]},isNaN:{name:"isNaN",category:"Utils",syntax:["isNaN(x)"],description:"Test whether a value is NaN (not a number)",examples:["isNaN(2)","isNaN(0 / 0)","isNaN(NaN)","isNaN(Infinity)"],seealso:["isNegative","isNumeric","isPositive","isZero"]},isInteger:{name:"isInteger",category:"Utils",syntax:["isInteger(x)"],description:"Test whether a value is an integer number.",examples:["isInteger(2)","isInteger(3.5)","isInteger([3, 0.5, -2])"],seealso:["isNegative","isNumeric","isPositive","isZero"]},isNegative:{name:"isNegative",category:"Utils",syntax:["isNegative(x)"],description:"Test whether a value is negative: smaller than zero.",examples:["isNegative(2)","isNegative(0)","isNegative(-4)","isNegative([3, 0.5, -2])"],seealso:["isInteger","isNumeric","isPositive","isZero"]},isNumeric:{name:"isNumeric",category:"Utils",syntax:["isNumeric(x)"],description:"Test whether a value is a numeric value. Returns true when the input is a number, BigNumber, Fraction, or boolean.",examples:["isNumeric(2)",'isNumeric("2")','hasNumericValue("2")',"isNumeric(0)","isNumeric(bignumber(500))","isNumeric(fraction(0.125))","isNumeric(2 + 3i)",'isNumeric([2.3, "foo", false])'],seealso:["isInteger","isZero","isNegative","isPositive","isNaN","hasNumericValue"]},hasNumericValue:{name:"hasNumericValue",category:"Utils",syntax:["hasNumericValue(x)"],description:"Test whether a value is an numeric value. In case of a string, true is returned if the string contains a numeric value.",examples:["hasNumericValue(2)",'hasNumericValue("2")','isNumeric("2")',"hasNumericValue(0)","hasNumericValue(bignumber(500))","hasNumericValue(fraction(0.125))","hasNumericValue(2 + 3i)",'hasNumericValue([2.3, "foo", false])'],seealso:["isInteger","isZero","isNegative","isPositive","isNaN","isNumeric"]},isPositive:{name:"isPositive",category:"Utils",syntax:["isPositive(x)"],description:"Test whether a value is positive: larger than zero.",examples:["isPositive(2)","isPositive(0)","isPositive(-4)","isPositive([3, 0.5, -2])"],seealso:["isInteger","isNumeric","isNegative","isZero"]},isPrime:{name:"isPrime",category:"Utils",syntax:["isPrime(x)"],description:"Test whether a value is prime: has no divisors other than itself and one.",examples:["isPrime(3)","isPrime(-2)","isPrime([2, 17, 100])"],seealso:["isInteger","isNumeric","isNegative","isZero"]},isZero:{name:"isZero",category:"Utils",syntax:["isZero(x)"],description:"Test whether a value is zero.",examples:["isZero(2)","isZero(0)","isZero(-4)","isZero([3, 0, -2, 0])"],seealso:["isInteger","isNumeric","isNegative","isPositive"]},print:{name:"print",category:"Utils",syntax:["print(template, values)","print(template, values, precision)"],description:"Interpolate values into a string template.",examples:['print("Lucy is $age years old", {age: 5})','print("The value of pi is $pi", {pi: pi}, 3)','print("Hello, $user.name!", {user: {name: "John"}})','print("Values: $0, $1, $2", [6, 9, 4])'],seealso:["format"]},typeOf:{name:"typeOf",category:"Utils",syntax:["typeOf(x)"],description:"Get the type of a variable.",examples:["typeOf(3.5)","typeOf(2 - 4i)","typeOf(45 deg)",'typeOf("hello world")'],seealso:["getMatrixDataType"]},numeric:{name:"numeric",category:"Utils",syntax:["numeric(x)"],description:"Convert a numeric input to a specific numeric type: number, BigNumber, or Fraction.",examples:['numeric("4")','numeric("4", "number")','numeric("4", "BigNumber")','numeric("4", "Fraction")','numeric(4, "Fraction")','numeric(fraction(2, 5), "number")'],seealso:["number","fraction","bignumber","string","format"]}},Tm="help",Om=ur(Tm,["typed","mathWithTransform","Help"],(e=>{var{typed:r,mathWithTransform:t,Help:n}=e;return r(Tm,{any:function(e){var r,i=e;if("string"!=typeof e)for(r in t)if(Y(t,r)&&e===t[r]){i=r;break}var a=lr(Bm,i);if(!a){var o="function"==typeof i?i.name:i;throw new Error('No documentation found on "'+o+'"')}return new n(a)}})})),_m="chain",zm=ur(_m,["typed","Chain"],(e=>{var{typed:r,Chain:t}=e;return r(_m,{"":function(){return new t},any:function(e){return new t(e)}})})),qm=ur("det",["typed","matrix","subtract","multiply","divideScalar","isZero","unaryMinus"],(e=>{var{typed:r,matrix:t,subtract:n,multiply:i,divideScalar:a,isZero:o,unaryMinus:s}=e;return r("det",{any:function(e){return G(e)},"Array | Matrix":function(e){var r;switch((r=p(e)?e.size():Array.isArray(e)?(e=t(e)).size():[]).length){case 0:return G(e);case 1:if(1===r[0])return G(e.valueOf()[0]);if(0===r[0])return 1;throw new RangeError("Matrix must be square (size: "+_e(r)+")");case 2:var u=r[0],c=r[1];if(u===c)return function(e,r,t){if(1===r)return G(e[0][0]);if(2===r)return n(i(e[0][0],e[1][1]),i(e[1][0],e[0][1]));for(var u=!1,c=new Array(r).fill(0).map(((e,r)=>r)),l=0;l{var{typed:r,matrix:t,divideScalar:n,addScalar:i,multiply:a,unaryMinus:o,det:s,identity:u,abs:c}=e;return r("inv",{"Array | Matrix":function(e){var r=p(e)?e.size():Ue(e);switch(r.length){case 1:if(1===r[0])return p(e)?t([n(1,e.valueOf()[0])]):[n(1,e[0])];throw new RangeError("Matrix must be square (size: "+_e(r)+")");case 2:var i=r[0],a=r[1];if(i===a)return p(e)?t(l(e.valueOf(),i,a),e.storage()):l(e,i,a);throw new RangeError("Matrix must be square (size: "+_e(r)+")");default:throw new RangeError("Matrix must be two dimensional (size: "+_e(r)+")")}},any:function(e){return n(1,e)}});function l(e,r,t){var l,f,p,m,d;if(1===r){if(0===(m=e[0][0]))throw Error("Cannot calculate inverse, determinant is zero");return[[n(1,m)]]}if(2===r){var h=s(e);if(0===h)throw Error("Cannot calculate inverse, determinant is zero");return[[n(e[1][1],h),n(o(e[0][1]),h)],[n(o(e[1][0]),h),n(e[0][0],h)]]}var g=e.concat();for(l=0;lx&&(x=c(g[l][v]),b=l),l++;if(0===x)throw Error("Cannot calculate inverse, determinant is zero");(l=b)!==v&&(d=g[v],g[v]=g[l],g[l]=d,d=y[v],y[v]=y[l],y[l]=d);var w=g[v],N=y[v];for(l=0;l{var{typed:r,matrix:t,inv:n,deepEqual:i,equal:a,dotDivide:o,dot:s,ctranspose:u,divideScalar:c,multiply:l,add:f,Complex:m}=e;return r(km,{"Array | Matrix":function(e){var r=p(e)?e.size():Ue(e);switch(r.length){case 1:return g(e)?u(e):1===r[0]?n(e):o(u(e),s(e,e));case 2:if(g(e))return u(e);var i=r[0],a=r[1];if(i===a)try{return n(e)}catch(e){if(!(e instanceof Error&&e.message.match(/Cannot calculate inverse, determinant is zero/)))throw e}return p(e)?t(d(e.valueOf(),i,a),e.storage()):d(e,i,a);default:throw new RangeError("Matrix must be two dimensional (size: "+_e(r)+")")}},any:function(e){return a(e,0)?G(e):c(1,e)}});function d(e,r,t){var{C:i,F:a}=function(e,r,t){var n=function(e,r,t){for(var n=G(e),i=0,a=0;ae.filter(((e,t)=>t!h(s(n[r],n[r]))));return{C:i,F:a}}(e,r,t),c=l(n(l(u(i),i)),u(i)),p=l(u(a),n(l(a,u(a))));return l(p,c)}function h(e){return a(f(e,m(1,1)),f(0,m(1,1)))}function g(e){return i(f(e,m(1,1)),f(l(e,0),m(1,1)))}}));function Pm(e){var{addScalar:r,subtract:t,flatten:n,multiply:i,multiplyScalar:a,divideScalar:o,sqrt:s,abs:u,bignumber:c,diag:l,inv:f,qr:p,usolve:m,usolveAll:d,equal:h,complex:g,larger:y,smaller:v,matrixFromColumns:x,dot:b}=e;function w(e,n,i,o){var u=r(e,o),c=t(a(e,o),a(n,i)),l=a(u,.5),f=a(s(t(a(u,u),a(4,c))),.5);return[r(l,f),t(l,f)]}function N(e,r,n,i,a,o,s,l){var f="BigNumber"===l,p="Complex"===l,m=f?c(0):p?g(0):0,d=f?c(1):p?g(1):1;if(v(u(n),s))return[[d,m],[m,d]];if(y(u(t(a,o)),s))return[[t(a,i),t(o,i)],[n,n]];var h=t(e,a),x=t(r,a),b=t(n,a),w=t(i,a);return v(u(x),s)?[[h,d],[b,m]]:[[x,m],[w,d]]}function D(e,r){for(var t=0;t=5)return null;for(s=0;;){var u=m(e,a);if(v(M(S(a,[u])),n))break;if(++s>=10)return null;a=F(u)}return a}function C(e,r,t){var n="BigNumber"===t,i="Complex"===t,a=Array(e).fill(0).map((e=>2*Math.random()-1));return n&&(a=a.map((e=>c(e)))),i&&(a=a.map((e=>g(e)))),F(a=S(a,r),t)}function S(e,r){for(var n of r)e=t(e,i(o(b(n,e),b(n,n)),n));return e}function M(e){return u(s(b(e,e)))}function F(e,r){var t="Complex"===r,n="BigNumber"===r?c(1):t?g(1):1;return i(o(n,M(e)),e)}return function(e,s,m,b,C){void 0===C&&(C=!0);var S=function(e,t,n,i,s){var f,p="BigNumber"===i,m="Complex"===i,d=p?c(0):0,x=p?c(1):m?g(1):1,b=p?c(1):1,w=p?c(10):2,N=a(w,w);s&&(f=Array(t).fill(x));var D=!1;for(;!D;){D=!0;for(var E=0;E1&&(A=l(Array(x-1).fill(d)))),x-=1,h.pop();for(var O=0;O2&&(A=l(Array(x-2).fill(d)))),x-=2,h.pop(),h.pop();for(var z=0;z+t(u(e),u(r)))),C>100){var q=Error("The eigenvalues failed to converge. Only found these eigenvalues: "+y.join(", "));throw q.values=y,q.vectors=[],q}var I=s?i(E,function(e,r){for(var t=[],n=0;ni(m,e))),M.push(...c.map((e=>n(e))))},z=0;z2&&void 0!==arguments[2]?arguments[2]:r.epsilon,a=arguments.length>3?arguments[3]:void 0;if("number"===a)return function(e,r){for(var t,n=e.length,i=Math.abs(r/n),a=new Array(n),o=0;o=Math.abs(i);){var u=s[0][0],c=s[0][1];e=v(e,t=m(e[u][u],e[c][c],e[u][c]),u,c),a=h(a,t,u,c),s=x(e)}for(var l=N(n,0),f=0;f=i(a);){var c=u[0][0],l=u[0][1];e=y(e,t=d(e[c][c],e[l][l],e[c][l]),c,l),o=g(o,t,c,l),u=b(e)}for(var f=N(n,0),p=0;p{var{config:r,typed:t,matrix:n,addScalar:i,subtract:c,equal:l,abs:f,atan:p,cos:m,sin:d,multiplyScalar:h,divideScalar:g,inv:y,bignumber:v,multiply:x,add:b,larger:w,column:N,flatten:D,number:E,complex:A,sqrt:C,diag:S,qr:M,usolve:F,usolveAll:B,im:T,re:O,smaller:_,matrixFromColumns:z,dot:q}=e,I=Um({config:r,addScalar:i,subtract:c,column:N,flatten:D,equal:l,abs:f,atan:p,cos:m,sin:d,multiplyScalar:h,inv:y,bignumber:v,complex:A,multiply:x,add:b}),k=Pm({config:r,addScalar:i,subtract:c,multiply:x,multiplyScalar:h,flatten:D,divideScalar:g,sqrt:C,abs:f,bignumber:v,diag:S,qr:M,inv:y,usolve:F,usolveAll:B,equal:l,complex:A,larger:w,smaller:_,matrixFromColumns:z,dot:q});return t("eigs",{Array:function(e){return R(n(e))},"Array, number|BigNumber":function(e,r){return R(n(e),r)},Matrix:function(e){var{values:r,vectors:t}=R(e);return{values:n(r),vectors:n(t)}},"Matrix, number|BigNumber":function(e,r){var{values:t,vectors:i}=R(e,r);return{values:n(t),vectors:n(i)}}});function R(e,t){void 0===t&&(t=r.epsilon);var n=e.size();if(2!==n.length||n[0]!==n[1])throw new RangeError("Matrix must be square (size: "+_e(n)+")");var i=e.toArray(),a=n[0];if(function(e,r,t){for(var n=0;n{var{typed:r,abs:t,add:n,identity:i,inv:a,multiply:o}=e;return r(Lm,{Matrix:function(e){var r=e.size();if(2!==r.length||r[0]!==r[1])throw new RangeError("Matrix must be square (size: "+_e(r)+")");for(var u=r[0],c=function(e){for(var r=e.size()[0],n=0,i=0;i1&&(v=o(v,m),x=-x),d=n(d,o(y=y*(f-b+1)/((2*f-b+1)*b),v)),g=n(g,o(y*x,v));for(var w=o(a(g),d),N=0;N{var{typed:r,abs:t,add:n,multiply:i,map:a,sqrt:o,subtract:s,inv:u,size:c,max:l,identity:f}=e,m=1e-6;function d(e){var r,a=0,o=e,p=f(c(e));do{var d=o;if(o=i(.5,n(d,u(p))),p=i(.5,n(p,u(d))),(r=l(t(s(o,d))))>m&&++a>1e3)throw new Error("computing square root of matrix: iterative method could not converge")}while(r>m);return o}return r($m,{"Array | Matrix":function(e){var r=p(e)?e.size():Ue(e);switch(r.length){case 1:if(1===r[0])return a(e,o);throw new RangeError("Matrix must be square (size: "+_e(r)+")");case 2:if(r[0]===r[1])return d(e);throw new RangeError("Matrix must be square (size: "+_e(r)+")");default:throw new RangeError("Matrix must be at most two dimensional (size: "+_e(r)+")")}}})})),Gm="sylvester",Vm=ur(Gm,["typed","schur","matrixFromColumns","matrix","multiply","range","concat","transpose","index","subset","add","subtract","identity","lusolve","abs"],(e=>{var{typed:r,schur:t,matrixFromColumns:n,matrix:i,multiply:a,range:o,concat:s,transpose:u,index:c,subset:l,add:f,subtract:p,identity:m,lusolve:d,abs:h}=e;return r(Gm,{"Matrix, Matrix, Matrix":g,"Array, Matrix, Matrix":function(e,r,t){return g(i(e),r,t)},"Array, Array, Matrix":function(e,r,t){return g(i(e),i(r),t)},"Array, Matrix, Array":function(e,r,t){return g(i(e),r,i(t))},"Matrix, Array, Matrix":function(e,r,t){return g(e,i(r),t)},"Matrix, Array, Array":function(e,r,t){return g(e,i(r),i(t))},"Matrix, Matrix, Array":function(e,r,t){return g(e,r,i(t))},"Array, Array, Array":function(e,r,t){return g(i(e),i(r),i(t)).toArray()}});function g(e,r,g){for(var y=r.size()[0],v=e.size()[0],x=t(e),b=x.T,w=x.U,N=t(a(-1,r)),D=N.T,E=N.U,A=a(a(u(w),g),E),C=o(0,v),S=[],M=(e,r)=>s(e,r,1),F=(e,r)=>s(e,r,0),B=0;B1e-5){for(var T=F(l(A,c(C,B)),l(A,c(C,B+1))),O=0;O{var{typed:r,matrix:t,identity:n,multiply:i,qr:a,norm:o,subtract:s}=e;return r(Wm,{Array:function(e){var r=u(t(e));return{U:r.U.valueOf(),T:r.T.valueOf()}},Matrix:function(e){return u(e)}});function u(e){var r,t=e.size()[0],u=e,c=n(t),l=0;do{r=u;var f=a(u),p=f.Q,m=f.R;if(u=i(m,p),c=i(c,p),l++>100)break}while(o(s(u,r))>1e-4);return{U:c,T:u}}})),Jm="lyap",Xm=ur(Jm,["typed","matrix","sylvester","multiply","transpose"],(e=>{var{typed:r,matrix:t,sylvester:n,multiply:i,transpose:a}=e;return r(Jm,{"Matrix, Matrix":function(e,r){return n(e,a(e),i(-1,r))},"Array, Matrix":function(e,r){return n(t(e),a(t(e)),i(-1,r))},"Matrix, Array":function(e,r){return n(e,a(t(e)),t(i(-1,r)))},"Array, Array":function(e,r){return n(t(e),a(t(e)),t(i(-1,r))).toArray()}})})),Qm=ur("divide",["typed","matrix","multiply","equalScalar","divideScalar","inv"],(e=>{var{typed:r,matrix:t,multiply:n,equalScalar:i,divideScalar:a,inv:o}=e,s=$a({typed:r,equalScalar:i}),u=Ga({typed:r});return r("divide",V({"Array | Matrix, Array | Matrix":function(e,r){return n(e,o(r))},"DenseMatrix, any":function(e,r){return u(e,r,a,!1)},"SparseMatrix, any":function(e,r){return s(e,r,a,!1)},"Array, any":function(e,r){return u(t(e),r,a,!1).valueOf()},"any, Array | Matrix":function(e,r){return n(e,o(r))}},a.signatures))})),Km="distance",ed=ur(Km,["typed","addScalar","subtract","divideScalar","multiplyScalar","deepEqual","sqrt","abs"],(e=>{var{typed:r,addScalar:t,subtract:n,multiplyScalar:i,divideScalar:a,deepEqual:s,sqrt:u,abs:c}=e;return r(Km,{"Array, Array, Array":function(e,r,t){if(2===e.length&&2===r.length&&2===t.length){if(!f(e))throw new TypeError("Array with 2 numbers or BigNumbers expected for first argument");if(!f(r))throw new TypeError("Array with 2 numbers or BigNumbers expected for second argument");if(!f(t))throw new TypeError("Array with 2 numbers or BigNumbers expected for third argument");if(s(r,t))throw new TypeError("LinePoint1 should not be same with LinePoint2");var a=n(t[1],r[1]),o=n(r[0],t[0]),u=n(i(t[0],r[1]),i(r[0],t[1]));return g(e[0],e[1],a,o,u)}throw new TypeError("Invalid Arguments: Try again")},"Object, Object, Object":function(e,r,t){if(2===Object.keys(e).length&&2===Object.keys(r).length&&2===Object.keys(t).length){if(!f(e))throw new TypeError("Values of pointX and pointY should be numbers or BigNumbers");if(!f(r))throw new TypeError("Values of lineOnePtX and lineOnePtY should be numbers or BigNumbers");if(!f(t))throw new TypeError("Values of lineTwoPtX and lineTwoPtY should be numbers or BigNumbers");if(s(h(r),h(t)))throw new TypeError("LinePoint1 should not be same with LinePoint2");if("pointX"in e&&"pointY"in e&&"lineOnePtX"in r&&"lineOnePtY"in r&&"lineTwoPtX"in t&&"lineTwoPtY"in t){var a=n(t.lineTwoPtY,r.lineOnePtY),o=n(r.lineOnePtX,t.lineTwoPtX),u=n(i(t.lineTwoPtX,r.lineOnePtY),i(r.lineOnePtX,t.lineTwoPtY));return g(e.pointX,e.pointY,a,o,u)}throw new TypeError("Key names do not match")}throw new TypeError("Invalid Arguments: Try again")},"Array, Array":function(e,r){if(2===e.length&&3===r.length){if(!f(e))throw new TypeError("Array with 2 numbers or BigNumbers expected for first argument");if(!p(r))throw new TypeError("Array with 3 numbers or BigNumbers expected for second argument");return g(e[0],e[1],r[0],r[1],r[2])}if(3===e.length&&6===r.length){if(!p(e))throw new TypeError("Array with 3 numbers or BigNumbers expected for first argument");if(!d(r))throw new TypeError("Array with 6 numbers or BigNumbers expected for second argument");return y(e[0],e[1],e[2],r[0],r[1],r[2],r[3],r[4],r[5])}if(e.length===r.length&&e.length>0){if(!m(e))throw new TypeError("All values of an array should be numbers or BigNumbers");if(!m(r))throw new TypeError("All values of an array should be numbers or BigNumbers");return v(e,r)}throw new TypeError("Invalid Arguments: Try again")},"Object, Object":function(e,r){if(2===Object.keys(e).length&&3===Object.keys(r).length){if(!f(e))throw new TypeError("Values of pointX and pointY should be numbers or BigNumbers");if(!p(r))throw new TypeError("Values of xCoeffLine, yCoeffLine and constant should be numbers or BigNumbers");if("pointX"in e&&"pointY"in e&&"xCoeffLine"in r&&"yCoeffLine"in r&&"constant"in r)return g(e.pointX,e.pointY,r.xCoeffLine,r.yCoeffLine,r.constant);throw new TypeError("Key names do not match")}if(3===Object.keys(e).length&&6===Object.keys(r).length){if(!p(e))throw new TypeError("Values of pointX, pointY and pointZ should be numbers or BigNumbers");if(!d(r))throw new TypeError("Values of x0, y0, z0, a, b and c should be numbers or BigNumbers");if("pointX"in e&&"pointY"in e&&"x0"in r&&"y0"in r&&"z0"in r&&"a"in r&&"b"in r&&"c"in r)return y(e.pointX,e.pointY,e.pointZ,r.x0,r.y0,r.z0,r.a,r.b,r.c);throw new TypeError("Key names do not match")}if(2===Object.keys(e).length&&2===Object.keys(r).length){if(!f(e))throw new TypeError("Values of pointOneX and pointOneY should be numbers or BigNumbers");if(!f(r))throw new TypeError("Values of pointTwoX and pointTwoY should be numbers or BigNumbers");if("pointOneX"in e&&"pointOneY"in e&&"pointTwoX"in r&&"pointTwoY"in r)return v([e.pointOneX,e.pointOneY],[r.pointTwoX,r.pointTwoY]);throw new TypeError("Key names do not match")}if(3===Object.keys(e).length&&3===Object.keys(r).length){if(!p(e))throw new TypeError("Values of pointOneX, pointOneY and pointOneZ should be numbers or BigNumbers");if(!p(r))throw new TypeError("Values of pointTwoX, pointTwoY and pointTwoZ should be numbers or BigNumbers");if("pointOneX"in e&&"pointOneY"in e&&"pointOneZ"in e&&"pointTwoX"in r&&"pointTwoY"in r&&"pointTwoZ"in r)return v([e.pointOneX,e.pointOneY,e.pointOneZ],[r.pointTwoX,r.pointTwoY,r.pointTwoZ]);throw new TypeError("Key names do not match")}throw new TypeError("Invalid Arguments: Try again")},Array:function(e){if(!function(e){if(2===e[0].length&&l(e[0][0])&&l(e[0][1])){if(e.some((e=>2!==e.length||!l(e[0])||!l(e[1]))))return!1}else{if(!(3===e[0].length&&l(e[0][0])&&l(e[0][1])&&l(e[0][2])))return!1;if(e.some((e=>3!==e.length||!l(e[0])||!l(e[1])||!l(e[2]))))return!1}return!0}(e))throw new TypeError("Incorrect array format entered for pairwise distance calculation");return function(e){for(var r=[],t=[],n=[],i=0;i{var{typed:r,config:t,abs:n,add:i,addScalar:a,matrix:o,multiply:s,multiplyScalar:u,divideScalar:c,subtract:l,smaller:f,equalScalar:p,flatten:m,isZero:d,isNumeric:h}=e;return r("intersect",{"Array, Array, Array":g,"Array, Array, Array, Array":y,"Matrix, Matrix, Matrix":function(e,r,t){var n=g(e.valueOf(),r.valueOf(),t.valueOf());return null===n?null:o(n)},"Matrix, Matrix, Matrix, Matrix":function(e,r,t,n){var i=y(e.valueOf(),r.valueOf(),t.valueOf(),n.valueOf());return null===i?null:o(i)}});function g(e,r,t){if(e=v(e),r=v(r),t=v(t),!b(e))throw new TypeError("Array with 3 numbers or BigNumbers expected for first argument");if(!b(r))throw new TypeError("Array with 3 numbers or BigNumbers expected for second argument");if(!function(e){return 4===e.length&&h(e[0])&&h(e[1])&&h(e[2])&&h(e[3])}(t))throw new TypeError("Array with 4 numbers expected as third argument");return function(e,r,t,n,i,o,s,f,p,m){var d=u(e,s),h=u(n,s),g=u(r,f),y=u(i,f),v=u(t,p),x=u(o,p),b=l(l(l(m,d),g),v),w=l(l(l(a(a(h,y),x),d),g),v),N=c(b,w),D=a(e,u(N,l(n,e))),E=a(r,u(N,l(i,r))),A=a(t,u(N,l(o,t)));return[D,E,A]}(e[0],e[1],e[2],r[0],r[1],r[2],t[0],t[1],t[2],t[3])}function y(e,r,o,m){if(e=v(e),r=v(r),o=v(o),m=v(m),2===e.length){if(!x(e))throw new TypeError("Array with 2 numbers or BigNumbers expected for first argument");if(!x(r))throw new TypeError("Array with 2 numbers or BigNumbers expected for second argument");if(!x(o))throw new TypeError("Array with 2 numbers or BigNumbers expected for third argument");if(!x(m))throw new TypeError("Array with 2 numbers or BigNumbers expected for fourth argument");return function(e,r,o,p){var m=e,h=o,g=l(m,r),y=l(h,p),v=l(u(g[0],y[1]),u(y[0],g[1]));if(d(v))return null;if(f(n(v),t.epsilon))return null;var x=u(y[0],m[1]),b=u(y[1],m[0]),w=u(y[0],h[1]),N=u(y[1],h[0]),D=c(a(l(l(x,b),w),N),v);return i(s(g,D),m)}(e,r,o,m)}if(3===e.length){if(!b(e))throw new TypeError("Array with 3 numbers or BigNumbers expected for first argument");if(!b(r))throw new TypeError("Array with 3 numbers or BigNumbers expected for second argument");if(!b(o))throw new TypeError("Array with 3 numbers or BigNumbers expected for third argument");if(!b(m))throw new TypeError("Array with 3 numbers or BigNumbers expected for fourth argument");return function(e,r,t,n,i,o,s,f,m,h,g,y){var v=w(e,s,h,s,r,f,g,f,t,m,y,m),x=w(h,s,n,e,g,f,i,r,y,m,o,t),b=w(e,s,n,e,r,f,i,r,t,m,o,t),N=w(h,s,h,s,g,f,g,f,y,m,y,m),D=w(n,e,n,e,i,r,i,r,o,t,o,t),E=l(u(v,x),u(b,N)),A=l(u(D,N),u(x,x));if(d(A))return null;var C=c(E,A),S=c(a(v,u(C,x)),N),M=a(e,u(C,l(n,e))),F=a(r,u(C,l(i,r))),B=a(t,u(C,l(o,t))),T=a(s,u(S,l(h,s))),O=a(f,u(S,l(g,f))),_=a(m,u(S,l(y,m)));return p(M,T)&&p(F,O)&&p(B,_)?[M,F,B]:null}(e[0],e[1],e[2],r[0],r[1],r[2],o[0],o[1],o[2],m[0],m[1],m[2])}throw new TypeError("Arrays with two or thee dimensional points expected")}function v(e){return 1===e.length?e[0]:e.length>1&&Array.isArray(e[0])&&e.every((e=>Array.isArray(e)&&1===e.length))?m(e):e}function x(e){return 2===e.length&&h(e[0])&&h(e[1])}function b(e){return 3===e.length&&h(e[0])&&h(e[1])&&h(e[2])}function w(e,r,t,n,i,o,s,c,f,p,m,d){var h=u(l(e,r),l(t,n)),g=u(l(i,o),l(s,c)),y=u(l(f,p),l(m,d));return a(a(h,g),y)}})),td=ur("sum",["typed","config","add","numeric"],(e=>{var{typed:r,config:t,add:n,numeric:i}=e;return r("sum",{"Array | Matrix":a,"Array | Matrix, number | BigNumber":function(e,r){try{return Bn(e,r,n)}catch(e){throw Lu(e,"sum")}},"...":function(e){if(Sn(e))throw new TypeError("Scalar values expected in function sum");return a(e)}});function a(e){var r;return Mn(e,(function(e){try{r=void 0===r?e:n(r,e)}catch(r){throw Lu(r,"sum",e)}})),void 0===r&&(r=i(0,t.number)),"string"==typeof r&&(r=i(r,t.number)),r}})),nd="cumsum",id=ur(nd,["typed","add","unaryPlus"],(e=>{var{typed:r,add:t,unaryPlus:n}=e;return r(nd,{Array:i,Matrix:function(e){return e.create(i(e.valueOf()))},"Array, number | BigNumber":o,"Matrix, number | BigNumber":function(e,r){return e.create(o(e.valueOf(),r))},"...":function(e){if(Sn(e))throw new TypeError("All values expected to be scalar in function cumsum");return i(e)}});function i(e){try{return a(e)}catch(e){throw Lu(e,nd)}}function a(e){if(0===e.length)return[];for(var r=[n(e[0])],i=1;i=t.length)throw new Pe(r,t.length);try{return s(e,r)}catch(e){throw Lu(e,nd)}}function s(e,r){var t,n,i;if(r<=0){var o=e[0][0];if(Array.isArray(o)){for(i=Cn(e),n=[],t=0;t{var{typed:r,add:t,divide:n}=e;return r(ad,{"Array | Matrix":i,"Array | Matrix, number | BigNumber":function(e,r){try{var i=Bn(e,r,t),a=Array.isArray(e)?Ue(e):e.size();return n(i,a[r])}catch(e){throw Lu(e,"mean")}},"...":function(e){if(Sn(e))throw new TypeError("Scalar values expected in function mean");return i(e)}});function i(e){var r,i=0;if(Mn(e,(function(e){try{r=void 0===r?e:t(r,e),i++}catch(r){throw Lu(r,"mean",e)}})),0===i)throw new Error("Cannot calculate the mean of an empty array");return n(r,i)}})),sd="median",ud=ur(sd,["typed","add","divide","compare","partitionSelect"],(e=>{var{typed:r,add:t,divide:n,compare:i,partitionSelect:a}=e;function o(e){try{var r=(e=Ke(e.valueOf())).length;if(0===r)throw new Error("Cannot calculate median of an empty array");if(r%2==0){for(var t=r/2-1,n=a(e,t+1),o=e[t],c=0;c0&&(o=e[c]);return u(o,n)}var l=a(e,(r-1)/2);return s(l)}catch(e){throw Lu(e,"median")}}var s=r({"number | BigNumber | Complex | Unit":function(e){return e}}),u=r({"number | BigNumber | Complex | Unit, number | BigNumber | Complex | Unit":function(e,r){return n(t(e,r),2)}});return r(sd,{"Array | Matrix":o,"Array | Matrix, number | BigNumber":function(e,r){throw new Error("median(A, dim) is not yet supported")},"...":function(e){if(Sn(e))throw new TypeError("Scalar values expected in function median");return o(e)}})})),cd=ur("mad",["typed","abs","map","median","subtract"],(e=>{var{typed:r,abs:t,map:n,median:i,subtract:a}=e;return r("mad",{"Array | Matrix":o,"...":function(e){return o(e)}});function o(e){if(0===(e=Ke(e.valueOf())).length)throw new Error("Cannot calculate median absolute deviation (mad) of an empty array");try{var r=i(e);return i(n(e,(function(e){return t(a(e,r))})))}catch(e){throw e instanceof TypeError&&-1!==e.message.indexOf("median")?new TypeError(e.message.replace("median","mad")):Lu(e,"mad")}}})),ld="unbiased",fd="variance",pd=ur(fd,["typed","add","subtract","multiply","divide","apply","isNaN"],(e=>{var{typed:r,add:t,subtract:n,multiply:i,divide:a,apply:s,isNaN:u}=e;return r(fd,{"Array | Matrix":function(e){return c(e,ld)},"Array | Matrix, string":c,"Array | Matrix, number | BigNumber":function(e,r){return l(e,r,ld)},"Array | Matrix, number | BigNumber, string":l,"...":function(e){return c(e,ld)}});function c(e,r){var s,c=0;if(0===e.length)throw new SyntaxError("Function variance requires one or more parameters (0 provided)");if(Mn(e,(function(e){try{s=void 0===s?e:t(s,e),c++}catch(r){throw Lu(r,"variance",e)}})),0===c)throw new Error("Cannot calculate variance of an empty array");var l=a(s,c);if(s=void 0,Mn(e,(function(e){var r=n(e,l);s=void 0===s?i(r,r):t(s,i(r,r))})),u(s))return s;switch(r){case"uncorrected":return a(s,c);case"biased":return a(s,c+1);case"unbiased":var f=o(s)?s.mul(0):0;return 1===c?f:a(s,c-1);default:throw new Error('Unknown normalization "'+r+'". Choose "unbiased" (default), "uncorrected", or "biased".')}}function l(e,r,t){try{if(0===e.length)throw new SyntaxError("Function variance requires one or more parameters (0 provided)");return s(e,r,(e=>c(e,t)))}catch(e){throw Lu(e,"variance")}}})),md=ur("quantileSeq",["typed","add","multiply","partitionSelect","compare"],(e=>{var{typed:r,add:t,multiply:n,partitionSelect:i,compare:s}=e;function u(e,r,o){var u=Ke(e),l=u.length;if(0===l)throw new Error("Cannot calculate quantile of an empty sequence");if(a(r)){var f=r*(l-1),p=f%1;if(0===p){var m=o?u[f]:i(u,f);return c(m),m}var d,h,g=Math.floor(f);if(o)d=u[g],h=u[g+1];else{h=i(u,g+1),d=u[g];for(var y=0;y0&&(d=u[y])}return c(d),c(h),t(n(d,1-p),n(h,p))}var v=r.times(l-1);if(v.isInteger()){v=v.toNumber();var x=o?u[v]:i(u,v);return c(x),x}var b,w,N=v.floor(),D=v.minus(N),E=N.toNumber();if(o)b=u[E],w=u[E+1];else{w=i(u,E+1),b=u[E];for(var A=0;A0&&(b=u[A])}c(b),c(w);var C=new D.constructor(1);return t(n(b,C.minus(D)),n(w,D))}var c=r({"number | BigNumber | Unit":function(e){return e}});return function(e,r,t){var n,i,s;if(arguments.length<2||arguments.length>3)throw new SyntaxError("Function quantileSeq requires two or three parameters");if(m(e)){if("boolean"==typeof(t=t||!1)){if(i=e.valueOf(),a(r)){if(r<0)throw new Error("N/prob must be non-negative");if(r<=1)return u(i,r,t);if(r>1){if(!se(r))throw new Error("N must be a positive integer");var c=r+1;n=new Array(r);for(var l=0;l4294967295)throw new Error("N must be less than or equal to 2^32-1, as that is the maximum length of an Array");var d=new f(p+1);n=new Array(p);for(var h=0;h1)throw new Error("Probability must be between 0 and 1, inclusive")}else{if(!o(v))throw new TypeError("Unexpected type of argument in function quantileSeq");if(s=new v.constructor(1),v.isNegative()||v.gt(s))throw new Error("Probability must be between 0 and 1, inclusive")}n[y]=u(i,v,t)}return n}throw new TypeError("Unexpected type of argument in function quantileSeq")}throw new TypeError("Unexpected type of argument in function quantileSeq")}throw new TypeError("Unexpected type of argument in function quantileSeq")}})),dd=ur("std",["typed","map","sqrt","variance"],(e=>{var{typed:r,map:t,sqrt:n,variance:i}=e;return r("std",{"Array | Matrix":a,"Array | Matrix, string":a,"Array | Matrix, number | BigNumber":a,"Array | Matrix, number | BigNumber, string":a,"...":function(e){return a(e)}});function a(e,r){if(0===e.length)throw new SyntaxError("Function std requires one or more parameters (0 provided)");try{var a=i.apply(null,arguments);return m(a)?t(a,n):n(a)}catch(e){throw e instanceof TypeError&&-1!==e.message.indexOf(" variance")?new TypeError(e.message.replace(" variance"," std")):e}}})),hd="combinations",gd=ur(hd,["typed"],(e=>{var{typed:r}=e;return r(hd,{"number, number":pi,"BigNumber, BigNumber":function(e,r){var t,n,i=e.constructor,a=e.minus(r),o=new i(1);if(!yd(e)||!yd(r))throw new TypeError("Positive integer value expected in function combinations");if(r.gt(e))throw new TypeError("k must be less than n in function combinations");if(t=o,r.lt(a))for(n=o;n.lte(a);n=n.plus(o))t=t.times(r.plus(n)).dividedBy(n);else for(n=o;n.lte(r);n=n.plus(o))t=t.times(a.plus(n)).dividedBy(n);return t}})}));function yd(e){return e.isInteger()&&e.gte(0)}var vd="combinationsWithRep",xd=ur(vd,["typed"],(e=>{var{typed:r}=e;return r(vd,{"number, number":function(e,r){if(!se(e)||e<0)throw new TypeError("Positive integer value expected in function combinationsWithRep");if(!se(r)||r<0)throw new TypeError("Positive integer value expected in function combinationsWithRep");if(e<1)throw new TypeError("k must be less than or equal to n + k - 1");return r{var{typed:r,config:t,multiplyScalar:n,pow:i,BigNumber:a,Complex:o}=e;return r(wd,{number:wi,Complex:function e(r){if(0===r.im)return wi(r.re);if(r.re<.5){var t=new o(1-r.re,-r.im),n=new o(Math.PI*r.re,Math.PI*r.im);return new o(Math.PI).div(n.sin()).div(e(t))}r=new o(r.re-1,r.im);for(var i=new o(Di[0],0),a=1;a2;)u+=i-=2,o=o.times(u);return new a(o.toPrecision(a.precision))}})),Dd="lgamma",Ed=ur(Dd,["Complex","typed"],(e=>{var{Complex:r,typed:t}=e,n=7,i=[-.029550653594771242,.00641025641025641,-.0019175269175269176,.0008417508417508417,-.0005952380952380953,.0007936507936507937,-.002777777777777778,.08333333333333333];return t(Dd,{number:Ci,Complex:function e(t){if(t.isNaN())return new r(NaN,NaN);if(0===t.im)return new r(Ci(t.re),0);if(t.re>=n||Math.abs(t.im)>=7)return a(t);if(t.re<=.1){var i=(c=6.283185307179586,l=t.im,((c>0||!(c<0)&&1/c==1/0)^(l>0||!(l<0)&&1/l==1/0)?-c:c)*Math.floor(.5*t.re+.25)),s=t.mul(Math.PI).sin().log(),u=e(new r(1-t.re,-t.im));return new r(1.1447298858494002,i).sub(s).sub(u)}return t.im>=0?o(t):o(t.conjugate()).conjugate();var c,l},BigNumber:function(){throw new Error("mathjs doesn't yet provide an implementation of the algorithm lgamma for BigNumber")}});function a(e){for(var t=e.sub(.5).mul(e.log()).sub(e).add(Ei),n=new r(1,0).div(e),a=n.div(e),o=i[0],s=i[1],u=2*a.re,c=a.re*a.re+a.im*a.im,l=2;l<8;l++){var f=s;s=-c*o+i[l],o=u*o+f}var p=n.mul(a.mul(o).add(s));return t.add(p)}function o(e){var t=0,i=0,o=e;for(e=e.add(1);e.re<=n;){var s=(o=o.mul(e)).im<0?1:0;0!==s&&0===i&&t++,i=s,e=e.add(1)}return a(e).sub(o.log()).sub(new r(0,2*t*Math.PI*1))}})),Ad="factorial",Cd=ur(Ad,["typed","gamma"],(e=>{var{typed:r,gamma:t}=e;return r(Ad,{number:function(e){if(e<0)throw new Error("Value must be non-negative");return t(e+1)},BigNumber:function(e){if(e.isNegative())throw new Error("Value must be non-negative");return t(e.plus(1))},"Array | Matrix":r.referToSelf((e=>r=>Fn(r,e)))})})),Sd="kldivergence",Md=ur(Sd,["typed","matrix","divide","sum","multiply","map","dotDivide","log","isNumeric"],(e=>{var{typed:r,matrix:t,divide:n,sum:i,multiply:a,map:o,dotDivide:s,log:u,isNumeric:c}=e;return r(Sd,{"Array, Array":function(e,r){return l(t(e),t(r))},"Matrix, Array":function(e,r){return l(e,t(r))},"Array, Matrix":function(e,r){return l(t(e),r)},"Matrix, Matrix":function(e,r){return l(e,r)}});function l(e,r){var t=r.size().length,l=e.size().length;if(t>1)throw new Error("first object must be one dimensional");if(l>1)throw new Error("second object must be one dimensional");if(t!==l)throw new Error("Length of two vectors must be equal");if(0===i(e))throw new Error("Sum of elements in first object must be non zero");if(0===i(r))throw new Error("Sum of elements in second object must be non zero");var f=n(e,i(e)),p=n(r,i(r)),m=i(a(f,o(s(f,p),(e=>u(e)))));return c(m)?m:Number.NaN}})),Fd="multinomial",Bd=ur(Fd,["typed","add","divide","multiply","factorial","isInteger","isPositive"],(e=>{var{typed:r,add:t,divide:n,multiply:i,factorial:a,isInteger:o,isPositive:s}=e;return r(Fd,{"Array | Matrix":function(e){var r=0,u=1;return Mn(e,(function(e){if(!o(e)||!s(e))throw new TypeError("Positive integer value expected in function multinomial");r=t(r,e),u=i(u,a(e))})),n(a(r),u)}})})),Td="permutations",Od=ur(Td,["typed","factorial"],(e=>{var{typed:r,factorial:t}=e;return r(Td,{"number | BigNumber":t,"number, number":function(e,r){if(!se(e)||e<0)throw new TypeError("Positive integer value expected in function permutations");if(!se(r)||r<0)throw new TypeError("Positive integer value expected in function permutations");if(r>e)throw new TypeError("second argument k must be less than or equal to first argument n");return fi(e-r+1,e)},"BigNumber, BigNumber":function(e,r){var t,n;if(!_d(e)||!_d(r))throw new TypeError("Positive integer value expected in function permutations");if(r.gt(e))throw new TypeError("second argument k must be less than or equal to first argument n");for(t=e.mul(0).add(1),n=e.minus(r).plus(1);n.lte(e);n=n.plus(1))t=t.times(n);return t}})}));function _d(e){return e.isInteger()&&e.gte(0)}var zd=t(53775),qd=zd(Date.now());function Id(e){var r,t;return r=null===(t=e)?qd:zd(String(t)),function(){return r()}}var kd="pickRandom",Rd=ur(kd,["typed","config","?on"],(e=>{var{typed:r,config:t,on:n}=e,i=Id(t.randomSeed);return n&&n("config",(function(e,r){e.randomSeed!==r.randomSeed&&(i=Id(e.randomSeed))})),r(kd,{"Array | Matrix":function(e){return o(e,{})},"Array | Matrix, Object":function(e,r){return o(e,r)},"Array | Matrix, number":function(e,r){return o(e,{number:r})},"Array | Matrix, Array | Matrix":function(e,r){return o(e,{weights:r})},"Array | Matrix, Array | Matrix, number":function(e,r,t){return o(e,{number:t,weights:r})},"Array | Matrix, number, Array | Matrix":function(e,r,t){return o(e,{number:r,weights:t})}});function o(e,r){var{number:t,weights:n,elementWise:o=!0}=r,s=void 0===t;s&&(t=1);var u=p(e)?e.create:p(n)?n.create:null;e=e.valueOf(),n&&(n=n.valueOf()),!0===o&&(e=Ke(e),n=Ke(n));var c=0;if(void 0!==n){if(n.length!==e.length)throw new Error("Weights must have the same length as possibles");for(var l=0,f=n.length;l1)for(var n=0,i=e.shift();n{var{typed:r,config:t,on:n}=e,i=Id(t.randomSeed);return n&&n("config",(function(e,r){e.randomSeed!==r.randomSeed&&(i=Id(e.randomSeed))})),r(Ud,{"":()=>o(0,1),number:e=>o(0,e),"number, number":(e,r)=>o(e,r),"Array | Matrix":e=>a(e,0,1),"Array | Matrix, number":(e,r)=>a(e,0,r),"Array | Matrix, number, number":(e,r,t)=>a(e,r,t)});function a(e,r,t){var n=Pd(e.valueOf(),(()=>o(r,t)));return p(e)?e.create(n):n}function o(e,r){return e+i()*(r-e)}})),Ld="randomInt",Hd=ur(Ld,["typed","config","?on"],(e=>{var{typed:r,config:t,on:n}=e,i=Id(t.randomSeed);return n&&n("config",(function(e,r){e.randomSeed!==r.randomSeed&&(i=Id(e.randomSeed))})),r(Ld,{"":()=>o(0,1),number:e=>o(0,e),"number, number":(e,r)=>o(e,r),"Array | Matrix":e=>a(e,0,1),"Array | Matrix, number":(e,r)=>a(e,0,r),"Array | Matrix, number, number":(e,r,t)=>a(e,r,t)});function a(e,r,t){var n=Pd(e.valueOf(),(()=>o(r,t)));return p(e)?e.create(n):n}function o(e,r){return Math.floor(e+i()*(r-e))}})),$d="stirlingS2",Zd=ur($d,["typed","addScalar","subtract","multiplyScalar","divideScalar","pow","factorial","combinations","isNegative","isInteger","number","?bignumber","larger"],(e=>{var{typed:r,addScalar:t,subtract:n,multiplyScalar:i,divideScalar:o,pow:s,factorial:u,combinations:c,isNegative:l,isInteger:f,number:p,bignumber:m,larger:d}=e,h=[],g=[];return r($d,{"number | BigNumber, number | BigNumber":function(e,r){if(!f(e)||l(e)||!f(r)||l(r))throw new TypeError("Non-negative integer value expected in function stirlingS2");if(d(r,e))throw new TypeError("k must be less than or equal to n in function stirlingS2");var n=!(a(e)&&a(r)),o=n?g:h,s=n?m:p,u=p(e),c=p(r);if(o[u]&&o[u].length>c)return o[u][c];for(var y=0;y<=u;++y)if(o[y]||(o[y]=[s(0===y?1:0)]),0!==y)for(var v=o[y],x=o[y-1],b=v.length;b<=y&&b<=c;++b)v[b]=b===y?1:t(i(s(b),x[b]),x[b-1]);return o[u][c]}})})),Gd="bellNumbers",Vd=ur(Gd,["typed","addScalar","isNegative","isInteger","stirlingS2"],(e=>{var{typed:r,addScalar:t,isNegative:n,isInteger:i,stirlingS2:a}=e;return r(Gd,{"number | BigNumber":function(e){if(!i(e)||n(e))throw new TypeError("Non-negative integer value expected in function bellNumbers");for(var r=0,o=0;o<=e;o++)r=t(r,a(e,o));return r}})})),Wd="catalan",Yd=ur(Wd,["typed","addScalar","divideScalar","multiplyScalar","combinations","isNegative","isInteger"],(e=>{var{typed:r,addScalar:t,divideScalar:n,multiplyScalar:i,combinations:a,isNegative:o,isInteger:s}=e;return r(Wd,{"number | BigNumber":function(e){if(!s(e)||o(e))throw new TypeError("Non-negative integer value expected in function catalan");return n(a(i(e,2),e),t(e,1))}})})),Jd="composition",Xd=ur(Jd,["typed","addScalar","combinations","isNegative","isPositive","isInteger","larger"],(e=>{var{typed:r,addScalar:t,combinations:n,isPositive:i,isNegative:a,isInteger:o,larger:s}=e;return r(Jd,{"number | BigNumber, number | BigNumber":function(e,r){if(!(o(e)&&i(e)&&o(r)&&i(r)))throw new TypeError("Positive integer value expected in function composition");if(s(r,e))throw new TypeError("k must be less than or equal to n in function composition");return n(t(e,-1),t(r,-1))}})})),Qd="leafCount",Kd=ur(Qd,["parse","typed"],(e=>{var{parse:r,typed:t}=e;function n(e){var r=0;return e.forEach((e=>{r+=n(e)})),r||1}return t(Qd,{Node:function(e){return n(e)}})}));function eh(e){return O(e)||P(e)&&e.isUnary()&&O(e.args[0])}function rh(e){return!!O(e)||(!(!q(e)&&!P(e)||!e.args.every(rh))||!(!U(e)||!rh(e.content)))}function th(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,n)}return t}function nh(e){for(var r=1;r{var{FunctionNode:r,OperatorNode:t,SymbolNode:n}=e,i=!0,a=!1,o="defaultF",s={add:{trivial:i,total:i,commutative:i,associative:i},unaryPlus:{trivial:i,total:i,commutative:i,associative:i},subtract:{trivial:a,total:i,commutative:a,associative:a},multiply:{trivial:i,total:i,commutative:i,associative:i},divide:{trivial:a,total:i,commutative:a,associative:a},paren:{trivial:i,total:i,commutative:i,associative:a},defaultF:{trivial:a,total:i,commutative:a,associative:a}};function u(e,r){var t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:s,n=o;if("string"==typeof e?n=e:P(e)?n=e.fn.toString():q(e)?n=e.name:U(e)&&(n="paren"),Y(t,n)){var i=t[n];if(Y(i,r))return i[r];if(Y(s,n))return s[n][r]}if(Y(t,o)){var a=t[o];return Y(a,r)?a[r]:s[o][r]}if(Y(s,n)){var u=s[n];if(Y(u,r))return u[r]}return s[o][r]}function c(e){return u(e,"associative",arguments.length>1&&void 0!==arguments[1]?arguments[1]:s)}function l(e,r){var t,n=[];return c(e,r)?(t=e.op,function e(r){for(var i=0;i1&&void 0!==arguments[1]?arguments[1]:s)},isAssociative:c,mergeContext:function(e,r){var t=nh({},e);for(var n in r)Y(e,n)?t[n]=nh(nh({},r[n]),e[n]):t[n]=r[n];return t},flatten:function e(r,t){if(!r.args||0===r.args.length)return r;r.args=l(r,t);for(var n=0;n2&&c(r,t)){for(var o=r.args.pop();r.args.length>0;)o=n([r.args.pop(),o]);r.args=o.args}}},unflattenl:function e(r,t){if(r.args&&0!==r.args.length){for(var n=f(r),i=r.args.length,a=0;a2&&c(r,t)){for(var o=r.args.shift();r.args.length>0;)o=n([o,r.args.shift()]);r.args=o.args}}},defaultContext:s,realContext:{divide:{total:a},log:{total:a}},positiveContext:{subtract:{total:a},abs:{trivial:i},log:{total:i}}}})),ah=ur("simplify",["config","typed","parse","add","subtract","multiply","divide","pow","isZero","equal","resolve","simplifyConstant","simplifyCore","?fraction","?bignumber","mathWithTransform","matrix","AccessorNode","ArrayNode","ConstantNode","FunctionNode","IndexNode","ObjectNode","OperatorNode","ParenthesisNode","SymbolNode"],(e=>{var{config:r,typed:t,parse:n,add:i,subtract:a,multiply:o,divide:s,pow:u,isZero:c,equal:l,resolve:f,simplifyConstant:p,simplifyCore:m,fraction:d,bignumber:h,mathWithTransform:g,matrix:y,AccessorNode:v,ArrayNode:x,ConstantNode:b,FunctionNode:w,IndexNode:N,ObjectNode:D,OperatorNode:E,ParenthesisNode:A,SymbolNode:C}=e,{hasProperty:S,isCommutative:M,isAssociative:F,mergeContext:B,flatten:T,unflattenr:_,unflattenl:z,createMakeNodeFunction:q,defaultContext:I,realContext:k,positiveContext:R}=ih({FunctionNode:w,OperatorNode:E,SymbolNode:C});t.addConversion({from:"Object",to:"Map",convert:xr});var P=t("simplify",{Node:V,"Node, Map":(e,r)=>V(e,!1,r),"Node, Map, Object":(e,r,t)=>V(e,!1,r,t),"Node, Array":V,"Node, Array, Map":V,"Node, Array, Map, Object":V});function j(e){return e.transform((function(e,r,t){return U(e)?j(e.content):e}))}t.removeConversion({from:"Object",to:"Map",convert:xr}),P.defaultContext=I,P.realContext=k,P.positiveContext=R;var L={true:!0,false:!0,e:!0,i:!0,Infinity:!0,LN2:!0,LN10:!0,LOG2E:!0,LOG10E:!0,NaN:!0,phi:!0,pi:!0,SQRT1_2:!0,SQRT2:!0,tau:!0};function $(e,r){var t={};if(e.s){var i=e.s.split("->");if(2!==i.length)throw SyntaxError("Could not parse rule: "+e.s);t.l=i[0],t.r=i[1]}else t.l=e.l,t.r=e.r;for(var a of(t.l=j(n(t.l)),t.r=j(n(t.r)),["imposeContext","repeat","assuming"]))a in e&&(t[a]=e[a]);if(e.evaluate&&(t.evaluate=n(e.evaluate)),F(t.l,r)){var o,s=!M(t.l,r);s&&(o=G());var u=q(t.l),c=G();t.expanded={},t.expanded.l=u([t.l,c]),T(t.expanded.l,r),_(t.expanded.l,r),t.expanded.r=u([t.r,c]),s&&(t.expandedNC1={},t.expandedNC1.l=u([o,t.l]),t.expandedNC1.r=u([o,t.r]),t.expandedNC2={},t.expandedNC2.l=u([o,t.expanded.l]),t.expandedNC2.r=u([o,t.expanded.r]))}return t}P.rules=[m,{l:"log(e)",r:"1"},{s:"n-n1 -> n+-n1",assuming:{subtract:{total:!0}}},{s:"n-n -> 0",assuming:{subtract:{total:!1}}},{s:"-(cl*v) -> v * (-cl)",assuming:{multiply:{commutative:!0},subtract:{total:!0}}},{s:"-(cl*v) -> (-cl) * v",assuming:{multiply:{commutative:!1},subtract:{total:!0}}},{s:"-(v*cl) -> v * (-cl)",assuming:{multiply:{commutative:!1},subtract:{total:!0}}},{l:"-(n1/n2)",r:"-n1/n2"},{l:"-v",r:"v * (-1)"},{l:"(n1 + n2)*(-1)",r:"n1*(-1) + n2*(-1)",repeat:!0},{l:"n/n1^n2",r:"n*n1^-n2"},{l:"n/n1",r:"n*n1^-1"},{s:"(n1*n2)^n3 -> n1^n3 * n2^n3",assuming:{multiply:{commutative:!0}}},{s:"(n1*n2)^(-1) -> n2^(-1) * n1^(-1)",assuming:{multiply:{commutative:!1}}},{s:"(n ^ n1) ^ n2 -> n ^ (n1 * n2)",assuming:{divide:{total:!0}}},{l:" vd * ( vd * n1 + n2)",r:"vd^2 * n1 + vd * n2"},{s:" vd * (vd^n4 * n1 + n2) -> vd^(1+n4) * n1 + vd * n2",assuming:{divide:{total:!0}}},{s:"vd^n3 * ( vd * n1 + n2) -> vd^(n3+1) * n1 + vd^n3 * n2",assuming:{divide:{total:!0}}},{s:"vd^n3 * (vd^n4 * n1 + n2) -> vd^(n3+n4) * n1 + vd^n3 * n2",assuming:{divide:{total:!0}}},{l:"n*n",r:"n^2"},{s:"n * n^n1 -> n^(n1+1)",assuming:{divide:{total:!0}}},{s:"n^n1 * n^n2 -> n^(n1+n2)",assuming:{divide:{total:!0}}},p,{s:"n+n -> 2*n",assuming:{add:{total:!0}}},{l:"n+-n",r:"0"},{l:"vd*n + vd",r:"vd*(n+1)"},{l:"n3*n1 + n3*n2",r:"n3*(n1+n2)"},{l:"n3^(-n4)*n1 + n3 * n2",r:"n3^(-n4)*(n1 + n3^(n4+1) *n2)"},{l:"n3^(-n4)*n1 + n3^n5 * n2",r:"n3^(-n4)*(n1 + n3^(n4+n5)*n2)"},{s:"n*vd + vd -> (n+1)*vd",assuming:{multiply:{commutative:!1}}},{s:"vd + n*vd -> (1+n)*vd",assuming:{multiply:{commutative:!1}}},{s:"n1*n3 + n2*n3 -> (n1+n2)*n3",assuming:{multiply:{commutative:!1}}},{s:"n^n1 * n -> n^(n1+1)",assuming:{divide:{total:!0},multiply:{commutative:!1}}},{s:"n1*n3^(-n4) + n2 * n3 -> (n1 + n2*n3^(n4 + 1))*n3^(-n4)",assuming:{multiply:{commutative:!1}}},{s:"n1*n3^(-n4) + n2 * n3^n5 -> (n1 + n2*n3^(n4 + n5))*n3^(-n4)",assuming:{multiply:{commutative:!1}}},{l:"n*cd + cd",r:"(n+1)*cd"},{s:"cd*n + cd -> cd*(n+1)",assuming:{multiply:{commutative:!1}}},{s:"cd + cd*n -> cd*(1+n)",assuming:{multiply:{commutative:!1}}},p,{s:"(-n)*n1 -> -(n*n1)",assuming:{subtract:{total:!0}}},{s:"n1*(-n) -> -(n1*n)",assuming:{subtract:{total:!0},multiply:{commutative:!1}}},{s:"ce+ve -> ve+ce",assuming:{add:{commutative:!0}},imposeContext:{add:{commutative:!1}}},{s:"vd*cd -> cd*vd",assuming:{multiply:{commutative:!0}},imposeContext:{multiply:{commutative:!1}}},{l:"n+-n1",r:"n-n1"},{l:"n+-(n1)",r:"n-(n1)"},{s:"n*(n1^-1) -> n/n1",assuming:{multiply:{commutative:!0}}},{s:"n*n1^-n2 -> n/n1^n2",assuming:{multiply:{commutative:!0}}},{s:"n^-1 -> 1/n",assuming:{multiply:{commutative:!0}}},{l:"n^1",r:"n"},{s:"n*(n1/n2) -> (n*n1)/n2",assuming:{multiply:{associative:!0}}},{s:"n-(n1+n2) -> n-n1-n2",assuming:{addition:{associative:!0,commutative:!0}}},{l:"1*n",r:"n",imposeContext:{multiply:{commutative:!0}}},{s:"n1/(n2/n3) -> (n1*n3)/n2",assuming:{multiply:{associative:!0}}},{l:"n1/(-n2)",r:"-n1/n2"}];var Z=0;function G(){return new C("_p"+Z++)}function V(e,r){var t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:vr(),n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},i=n.consoleDebug;r=function(e,r){for(var t=[],n=0;n ").concat(r[c].r.toString()))),i){var p=a.toString({parenthesis:"all"});p!==u&&(console.log("Applying",l,"produced",p),u=p)}z(a,n.context)}s=a.toString({parenthesis:"all"})}return a}function W(e,r,t){var n=e;if(e)for(var i=0;i=2&&2===e.args.length){for(var a=function(e,r){var t,n,i=[],a=q(e);if(M(e,r))for(var o=0;o1&&(u=a(e.args.slice(0,s))),t=1===(n=e.args.slice(s)).length?n[0]:a(n),i.push(a([u,t]))}return i}(r,t),o=[],s=0;s2)throw Error("Unexpected non-binary associative function: "+e.toString());return[]}for(var c=[],f=0;f2)throw new Error("permuting >2 commutative non-associative rule arguments not yet implemented");var m=K(e.args[0],r.args[1],t);if(0===m.length)return[];var d=K(e.args[1],r.args[0],t);if(0===d.length)return[];c=[m,d]}i=function(e){if(0===e.length)return e;for(var r=e.reduce(Q),t=[],n={},i=0;i="a"&&e.name[1]<="z"?e.name.substring(0,2):e.name[0]){case"n":case"_p":i[0].placeholders[e.name]=r;break;case"c":case"cl":if(!O(r))return[];i[0].placeholders[e.name]=r;break;case"v":if(O(r))return[];i[0].placeholders[e.name]=r;break;case"vl":if(!H(r))return[];i[0].placeholders[e.name]=r;break;case"cd":if(!eh(r))return[];i[0].placeholders[e.name]=r;break;case"vd":if(eh(r))return[];i[0].placeholders[e.name]=r;break;case"ce":if(!rh(r))return[];i[0].placeholders[e.name]=r;break;case"ve":if(rh(r))return[];i[0].placeholders[e.name]=r;break;default:throw new Error("Invalid symbol in rule: "+e.name)}}else{if(!(e instanceof b))return[];if(!l(e.value,r.value))return[]}return i}function ee(e,r){if(e instanceof b&&r instanceof b){if(!l(e.value,r.value))return!1}else if(e instanceof C&&r instanceof C){if(e.name!==r.name)return!1}else{if(!(e instanceof E&&r instanceof E||e instanceof w&&r instanceof w))return!1;if(e instanceof E){if(e.op!==r.op||e.fn!==r.fn)return!1}else if(e instanceof w&&e.name!==r.name)return!1;if(e.args.length!==r.args.length)return!1;for(var t=0;t{var{typed:r,config:t,mathWithTransform:n,matrix:i,fraction:a,bignumber:o,AccessorNode:s,ArrayNode:c,ConstantNode:l,FunctionNode:f,IndexNode:m,ObjectNode:d,OperatorNode:h,SymbolNode:g}=e,{isCommutative:y,isAssociative:v,allChildren:x,createMakeNodeFunction:b}=ih({FunctionNode:f,OperatorNode:h,SymbolNode:g}),w=r("simplifyConstant",{Node:e=>A(T(e,{})),"Node, Object":function(e,r){return A(T(e,r))}});function N(e){return u(e)?e.valueOf():e instanceof Array?e.map(N):p(e)?i(N(e.valueOf())):e}function D(e,r,t){try{return n[e].apply(null,r)}catch(i){return r=r.map(N),S(n[e].apply(null,r),t)}}var E=r({Fraction:function(e){var r,t=e.s*e.n;r=t<0?new h("-","unaryMinus",[new l(-t)]):new l(t);if(1===e.d)return r;return new h("/","divide",[r,new l(e.d)])},number:function(e){return e<0?F(new l(-e)):new l(e)},BigNumber:function(e){return e<0?F(new l(-e)):new l(e)},Complex:function(e){throw new Error("Cannot convert Complex number to Node")},string:function(e){return new l(e)},Matrix:function(e){return new c(e.valueOf().map((e=>E(e))))}});function A(e){return k(e)?e:E(e)}function C(e,r){if(r&&!1!==r.exactFractions&&isFinite(e)&&a){var t=a(e),n=r&&"number"==typeof r.fractionsLimit?r.fractionsLimit:1/0;if(t.valueOf()===e&&t.n{if(!k(i)){var a=r.pop();if(k(a))return[a,i];try{return r.push(D(e,[a,i],n)),r}catch(e){r.push(a)}}r.push(A(r.pop()));var o=1===r.length?r[0]:t(r);return[t([o,A(i)])]}),[i]);return 1===a.length?a[0]:t([a[0],E(a[1])])}function T(e,r){switch(e.type){case"SymbolNode":return e;case"ConstantNode":switch(typeof e.value){case"number":return S(e.value,r);case"string":return e.value;default:if(!isNaN(e.value))return S(e.value,r)}return e;case"FunctionNode":if(n[e.name]&&n[e.name].rawArgs)return e;if(-1===["add","multiply"].indexOf(e.name)){var t=e.args.map((e=>T(e,r)));if(!t.some(k))try{return D(e.name,t,r)}catch(e){}if("size"===e.name&&1===t.length&&M(t[0])){for(var a=[],o=t[0];M(o);)a.push(o.items.length),o=o.items[0];return i(a)}return new f(e.name,t.map(A))}case"OperatorNode":var u,h,g=e.fn.toString(),N=b(e);if(P(e)&&e.isUnary())h=k((u=[T(e.args[0],r)])[0])?N(u):D(g,u,r);else if(v(e,r.context))if(u=(u=x(e,r.context)).map((e=>T(e,r))),y(g,r.context)){for(var E=[],C=[],F=0;F1?(h=B(g,E,N,r),C.unshift(h),h=B(g,C,N,r)):h=B(g,u,N,r)}else h=B(g,u,N,r);else u=e.args.map((e=>T(e,r))),h=B(g,u,N,r);return h;case"ParenthesisNode":return T(e.content,r);case"AccessorNode":return function(e,r,t){if(!I(r))return new s(A(e),A(r));if(M(e)||p(e)){for(var n=Array.from(r.dimensions);n.length>0;)if(O(n[0])&&"string"!=typeof n[0].value){var a=S(n.shift().value,t);M(e)?e=e.items[a-1]:(e=e.valueOf()[a-1])instanceof Array&&(e=i(e))}else{if(!(n.length>1&&O(n[1])&&"string"!=typeof n[1].value))break;var o=S(n[1].value,t),u=[],f=M(e)?e.items:e.valueOf();for(var d of f)if(M(d))u.push(d.items[o-1]);else{if(!p(e))break;u.push(d[o-1])}if(u.length!==f.length)break;e=M(e)?new c(u):i(u),n.splice(1,1)}return n.length===r.dimensions.length?new s(A(e),r):n.length>0?(r=new m(n),new s(A(e),r)):e}if(R(e)&&1===r.dimensions.length&&O(r.dimensions[0])){var h=r.dimensions[0].value;return h in e.properties?e.properties[h]:new l}return new s(A(e),r)}(T(e.object,r),T(e.index,r),r);case"ArrayNode":var _=e.items.map((e=>T(e,r)));return _.some(k)?new c(_.map(A)):i(_);case"IndexNode":return new m(e.dimensions.map((e=>w(e,r))));case"ObjectNode":var z={};for(var q in e.properties)z[q]=w(e.properties[q],r);return new d(z);default:throw new Error("Unimplemented node type in simplifyConstant: ".concat(e.type))}}return w})),sh="simplifyCore",uh=ur(sh,["typed","parse","equal","isZero","add","subtract","multiply","divide","pow","AccessorNode","ArrayNode","ConstantNode","FunctionNode","IndexNode","ObjectNode","OperatorNode","ParenthesisNode","SymbolNode"],(e=>{var{typed:r,parse:t,equal:n,isZero:i,add:a,subtract:o,multiply:s,divide:u,pow:c,AccessorNode:l,ArrayNode:f,ConstantNode:p,FunctionNode:m,IndexNode:d,ObjectNode:h,OperatorNode:g,ParenthesisNode:y,SymbolNode:v}=e,x=new p(0),b=new p(1),w=new p(!0),N=new p(!1);function D(e){return P(e)&&["and","not","or"].includes(e.op)}var{hasProperty:E,isCommutative:A}=ih({FunctionNode:m,OperatorNode:g,SymbolNode:v});function C(e){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},t=r?r.context:void 0;if(E(e,"trivial",t)){if(q(e)&&1===e.args.length)return C(e.args[0],r);var a=!1,o=0;if(e.forEach((e=>{1===++o&&(a=C(e,r))})),1===o)return a}var s=e;if(q(s)){var u=function(e){var r="OperatorNode:"+e;for(var t of cp)if(r in t)return t[r].op;return null}(s.name);if(!u)return new m(C(s.fn),s.args.map((e=>C(e,r))));if(s.args.length>2&&E(s,"associative",t))for(;s.args.length>2;){var c=s.args.pop(),p=s.args.pop();s.args.push(new g(u,s.name,[c,p]))}s=new g(u,s.name,s.args)}if(P(s)&&s.isUnary()){var y=C(s.args[0],r);if("~"===s.op&&P(y)&&y.isUnary()&&"~"===y.op)return y.args[0];if("not"===s.op&&P(y)&&y.isUnary()&&"not"===y.op&&D(y.args[0]))return y.args[0];var v=!0;if("-"===s.op&&P(y)&&(y.isBinary()&&"subtract"===y.fn&&(s=new g("-","subtract",[y.args[1],y.args[0]]),v=!1),y.isUnary()&&"-"===y.op))return y.args[0];if(v)return new g(s.op,s.fn,[y])}if(P(s)&&s.isBinary()){var F=C(s.args[0],r),B=C(s.args[1],r);if("+"===s.op){if(O(F)&&i(F.value))return B;if(O(B)&&i(B.value))return F;P(B)&&B.isUnary()&&"-"===B.op&&(B=B.args[0],s=new g("-","subtract",[F,B]))}if("-"===s.op)return P(B)&&B.isUnary()&&"-"===B.op?C(new g("+","add",[F,B.args[0]]),r):O(F)&&i(F.value)?C(new g("-","unaryMinus",[B])):O(B)&&i(B.value)?F:new g(s.op,s.fn,[F,B]);if("*"===s.op){if(O(F)){if(i(F.value))return x;if(n(F.value,1))return B}if(O(B)){if(i(B.value))return x;if(n(B.value,1))return F;if(A(s,t))return new g(s.op,s.fn,[B,F],s.implicit)}return new g(s.op,s.fn,[F,B],s.implicit)}if("/"===s.op)return O(F)&&i(F.value)?x:O(B)&&n(B.value,1)?F:new g(s.op,s.fn,[F,B]);if("^"===s.op&&O(B)){if(i(B.value))return b;if(n(B.value,1))return F}if("and"===s.op){if(O(F)){if(!F.value)return N;if(D(B))return B}if(O(B)){if(!B.value)return N;if(D(F))return F}}if("or"===s.op){if(O(F)){if(F.value)return w;if(D(B))return B}if(O(B)){if(B.value)return w;if(D(F))return F}}return new g(s.op,s.fn,[F,B])}if(P(s))return new g(s.op,s.fn,s.args.map((e=>C(e,r))));if(M(s))return new f(s.items.map((e=>C(e,r))));if(S(s))return new l(C(s.object,r),C(s.index,r));if(I(s))return new d(s.dimensions.map((e=>C(e,r))));if(R(s)){var T={};for(var _ in s.properties)T[_]=C(s.properties[_],r);return new h(T)}return s}return r(sh,{Node:C,"Node,Object":C})})),ch=ur("resolve",["typed","parse","ConstantNode","FunctionNode","OperatorNode","ParenthesisNode"],(e=>{var{typed:r,parse:t,ConstantNode:n,FunctionNode:i,OperatorNode:a,ParenthesisNode:o}=e;function s(e,r){var u=arguments.length>2&&void 0!==arguments[2]?arguments[2]:new Set;if(!r)return e;if(H(e)){if(u.has(e.name)){var c=Array.from(u).join(", ");throw new ReferenceError("recursive loop of variable definitions among {".concat(c,"}"))}var l=r.get(e.name);if(k(l)){var f=new Set(u);return f.add(e.name),s(l,r,f)}return"number"==typeof l?t(String(l)):void 0!==l?new n(l):e}if(P(e)){var p=e.args.map((function(e){return s(e,r,u)}));return new a(e.op,e.fn,p,e.implicit)}if(U(e))return new o(s(e.content,r,u));if(q(e)){var m=e.args.map((function(e){return s(e,r,u)}));return new i(e.name,m)}return e.map((e=>s(e,r,u)))}return r("resolve",{Node:s,"Node, Map | null | undefined":s,"Node, Object":(e,r)=>s(e,xr(r)),"Array | Matrix":r.referToSelf((e=>r=>r.map((r=>e(r))))),"Array | Matrix, null | undefined":r.referToSelf((e=>r=>r.map((r=>e(r))))),"Array, Object":r.referTo("Array,Map",(e=>(r,t)=>e(r,xr(t)))),"Matrix, Object":r.referTo("Matrix,Map",(e=>(r,t)=>e(r,xr(t)))),"Array | Matrix, Map":r.referToSelf((e=>(r,t)=>r.map((r=>e(r,t)))))})})),lh="symbolicEqual",fh=ur(lh,["parse","simplify","typed","OperatorNode"],(e=>{var{parse:r,simplify:t,typed:n,OperatorNode:i}=e;function a(e,r){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},a=new i("-","subtract",[e,r]),o=t(a,{},n);return O(o)&&!o.value}return n(lh,{"Node, Node":a,"Node, Node, Object":a})})),ph="derivative",mh=ur(ph,["typed","config","parse","simplify","equal","isZero","numeric","ConstantNode","FunctionNode","OperatorNode","ParenthesisNode","SymbolNode"],(e=>{var{typed:r,config:t,parse:n,simplify:i,equal:a,isZero:o,numeric:s,ConstantNode:u,FunctionNode:c,OperatorNode:l,ParenthesisNode:f,SymbolNode:p}=e;function m(e,r){var t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{simplify:!0},n={};g(n,e,r.name);var a=y(e,n);return t.simplify?i(a):a}r.addConversion({from:"identifier",to:"SymbolNode",convert:n});var d=r(ph,{"Node, SymbolNode":m,"Node, SymbolNode, Object":m});r.removeConversion({from:"identifier",to:"SymbolNode",convert:n}),d._simplify=!0,d.toTex=function(e){return h.apply(null,e.args)};var h=r("_derivTex",{"Node, SymbolNode":function(e,r){return O(e)&&"string"===Z(e.value)?h(n(e.value).toString(),r.toString(),1):h(e.toTex(),r.toString(),1)},"Node, ConstantNode":function(e,r){if("string"===Z(r.value))return h(e,n(r.value));throw new Error("The second parameter to 'derivative' is a non-string constant")},"Node, SymbolNode, ConstantNode":function(e,r,t){return h(e.toString(),r.name,t.value)},"string, string, number":function(e,r,t){return(1===t?"{d\\over d"+r+"}":"{d^{"+t+"}\\over d"+r+"^{"+t+"}}")+"\\left[".concat(e,"\\right]")}}),g=r("constTag",{"Object, ConstantNode, string":function(e,r){return e[r]=!0,!0},"Object, SymbolNode, string":function(e,r,t){return r.name!==t&&(e[r]=!0,!0)},"Object, ParenthesisNode, string":function(e,r,t){return g(e,r.content,t)},"Object, FunctionAssignmentNode, string":function(e,r,t){return-1===r.params.indexOf(t)?(e[r]=!0,!0):g(e,r.expr,t)},"Object, FunctionNode | OperatorNode, string":function(e,r,t){if(r.args.length>0){for(var n=g(e,r.args[0],t),i=1;i0){var n=e.args.filter((function(e){return void 0===r[e]})),i=1===n.length?n[0]:new l("*","multiply",n),s=t.concat(y(i,r));return new l("*","multiply",s)}return new l("+","add",e.args.map((function(t){return new l("*","multiply",e.args.map((function(e){return e===t?y(e,r):e.clone()})))})))}if("/"===e.op&&e.isBinary()){var u=e.args[0],f=e.args[1];return void 0!==r[f]?new l("/","divide",[y(u,r),f]):void 0!==r[u]?new l("*","multiply",[new l("-","unaryMinus",[u]),new l("/","divide",[y(f,r),new l("^","pow",[f.clone(),v(2)])])]):new l("/","divide",[new l("-","subtract",[new l("*","multiply",[y(u,r),f.clone()]),new l("*","multiply",[u.clone(),y(f,r)])]),new l("^","pow",[f.clone(),v(2)])])}if("^"===e.op&&e.isBinary()){var p=e.args[0],m=e.args[1];if(void 0!==r[p])return O(p)&&(o(p.value)||a(p.value,1))?v(0):new l("*","multiply",[e,new l("*","multiply",[new c("log",[p.clone()]),y(m.clone(),r)])]);if(void 0!==r[m]){if(O(m)){if(o(m.value))return v(0);if(a(m.value,1))return y(p,r)}var d=new l("^","pow",[p.clone(),new l("-","subtract",[m,v(1)])]);return new l("*","multiply",[m.clone(),new l("*","multiply",[y(p,r),d])])}return new l("*","multiply",[new l("^","pow",[p.clone(),m.clone()]),new l("+","add",[new l("*","multiply",[y(p,r),new l("/","divide",[m.clone(),p.clone()])]),new l("*","multiply",[y(m,r),new c("log",[p.clone()])])])])}throw new Error('Operator "'+e.op+'" is not supported by derivative, or a wrong number of arguments is passed')}});function v(e,r){return new u(s(e,r||t.number))}return d})),dh="rationalize",hh=ur(dh,["config","typed","equal","isZero","add","subtract","multiply","divide","pow","parse","simplifyConstant","simplifyCore","simplify","?bignumber","?fraction","mathWithTransform","matrix","AccessorNode","ArrayNode","ConstantNode","FunctionNode","IndexNode","ObjectNode","OperatorNode","SymbolNode","ParenthesisNode"],(e=>{var{config:r,typed:t,equal:n,isZero:i,add:a,subtract:o,multiply:s,divide:u,pow:c,parse:l,simplifyConstant:f,simplifyCore:p,simplify:m,fraction:d,bignumber:h,mathWithTransform:g,matrix:y,AccessorNode:v,ArrayNode:x,ConstantNode:b,FunctionNode:w,IndexNode:N,ObjectNode:D,OperatorNode:E,SymbolNode:A,ParenthesisNode:C}=e;function S(e){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},t=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n=function(){var e=[p,{l:"n+n",r:"2*n"},{l:"n+-n",r:"0"},f,{l:"n*(n1^-1)",r:"n/n1"},{l:"n*n1^-n2",r:"n/n1^n2"},{l:"n1^-1",r:"1/n1"},{l:"n*(n1/n2)",r:"(n*n1)/n2"},{l:"1*n",r:"n"}],r=[{l:"(-n1)/(-n2)",r:"n1/n2"},{l:"(-n1)*(-n2)",r:"n1*n2"},{l:"n1--n2",r:"n1+n2"},{l:"n1-n2",r:"n1+(-n2)"},{l:"(n1+n2)*n3",r:"(n1*n3 + n2*n3)"},{l:"n1*(n2+n3)",r:"(n1*n2+n1*n3)"},{l:"c1*n + c2*n",r:"(c1+c2)*n"},{l:"c1*n + n",r:"(c1+1)*n"},{l:"c1*n - c2*n",r:"(c1-c2)*n"},{l:"c1*n - n",r:"(c1-1)*n"},{l:"v/c",r:"(1/c)*v"},{l:"v/-c",r:"-(1/c)*v"},{l:"-v*-c",r:"c*v"},{l:"-v*c",r:"-c*v"},{l:"v*-c",r:"-c*v"},{l:"v*c",r:"c*v"},{l:"-(-n1*n2)",r:"(n1*n2)"},{l:"-(n1*n2)",r:"(-n1*n2)"},{l:"-(-n1+n2)",r:"(n1-n2)"},{l:"-(n1+n2)",r:"(-n1-n2)"},{l:"(n1^n2)^n3",r:"(n1^(n2*n3))"},{l:"-(-n1/n2)",r:"(n1/n2)"},{l:"-(n1/n2)",r:"(-n1/n2)"}],t=[{l:"(n1/n2 + n3/n4)",r:"((n1*n4 + n3*n2)/(n2*n4))"},{l:"(n1/n2 + n3)",r:"((n1 + n3*n2)/n2)"},{l:"(n1 + n2/n3)",r:"((n1*n3 + n2)/n3)"}],n=[{l:"(n1/(n2/n3))",r:"((n1*n3)/n2)"},{l:"(n1/n2/n3)",r:"(n1/(n2*n3))"}],i={};return i.firstRules=e.concat(r,n),i.distrDivRules=t,i.sucDivRules=n,i.firstRulesAgain=e.concat(r),i.finalRules=[p,{l:"n*-n",r:"-n^2"},{l:"n*n",r:"n^2"},f,{l:"n*-n^n1",r:"-n^(n1+1)"},{l:"n*n^n1",r:"n^(n1+1)"},{l:"n^n1*-n^n2",r:"-n^(n1+n2)"},{l:"n^n1*n^n2",r:"n^(n1+n2)"},{l:"n^n1*-n",r:"-n^(n1+1)"},{l:"n^n1*n",r:"n^(n1+1)"},{l:"n^n1/-n",r:"-n^(n1-1)"},{l:"n^n1/n",r:"n^(n1-1)"},{l:"n/-n^n1",r:"-n^(1-n1)"},{l:"n/n^n1",r:"n^(1-n1)"},{l:"n^n1/-n^n2",r:"n^(n1-n2)"},{l:"n^n1/n^n2",r:"n^(n1-n2)"},{l:"n1+(-n2*n3)",r:"n1-n2*n3"},{l:"v*(-c)",r:"-c*v"},{l:"n1+-n2",r:"n1-n2"},{l:"v*c",r:"c*v"},{l:"(n1^n2)^n3",r:"(n1^(n2*n3))"}],i}(),i=function(e,r,t,n){var i=[],a=m(e,n,r,{exactFractions:!1}),o="+-*"+((t=!!t)?"/":"");u(a);var s={};return s.expression=a,s.variables=i,s;function u(e){var r=e.type;if("FunctionNode"===r)throw new Error("There is an unsolved function call");if("OperatorNode"===r)if("^"===e.op){if("ConstantNode"!==e.args[1].type||!se(parseFloat(e.args[1].value)))throw new Error("There is a non-integer exponent");u(e.args[0])}else{if(-1===o.indexOf(e.op))throw new Error("Operator "+e.op+" invalid in polynomial expression");for(var t=0;t=1){var u,c;e=M(e);var l,d=!0,h=!1;for(e=m(e,n.firstRules,{},o);c=d?n.distrDivRules:n.sucDivRules,d=!d,(l=(e=m(e,c,{},s)).toString())!==u;)h=!0,u=l;h&&(e=m(e,n.firstRulesAgain,{},o)),e=m(e,n.finalRules,{},o)}var g=[],y={};return"OperatorNode"===e.type&&e.isBinary()&&"/"===e.op?(1===a&&(e.args[0]=F(e.args[0],g),e.args[1]=F(e.args[1])),t&&(y.numerator=e.args[0],y.denominator=e.args[1])):(1===a&&(e=F(e,g)),t&&(y.numerator=e,y.denominator=null)),t?(y.coefficients=g,y.variables=i.variables,y.expression=e,y):e}return t(dh,{Node:S,"Node, boolean":(e,r)=>S(e,{},r),"Node, Object":S,"Node, Object, boolean":S});function M(e,r,t){var n=e.type,i=arguments.length>1;if("OperatorNode"===n&&e.isBinary()){var a,o=!1;if("^"===e.op&&("ParenthesisNode"!==e.args[0].type&&"OperatorNode"!==e.args[0].type||"ConstantNode"!==e.args[1].type||(o=(a=parseFloat(e.args[1].value))>=2&&se(a))),o){if(a>2){var s=e.args[0],u=new E("^","pow",[e.args[0].cloneDeep(),new b(a-1)]);e=new E("*","multiply",[s,u])}else e=new E("*","multiply",[e.args[0],e.args[0].cloneDeep()]);i&&("content"===t?r.content=e:r.args[t]=e)}}if("ParenthesisNode"===n)M(e.content,e,"content");else if("ConstantNode"!==n&&"SymbolNode"!==n)for(var c=0;cn&&(r[c]=0),r[c]+=o.cte*("+"===o.oper?1:-1),void(n=Math.max(c,n))}o.cte=c,""===o.fire&&(r[0]+=o.cte*("+"===o.oper?1:-1))}}(e,null,t);for(var a,o=!0,s=n=r.length-1;s>=0;s--)if(0!==r[s]){var u=new b(o?r[s]:Math.abs(r[s])),c=r[s]<0?"-":"+";if(s>0){var l=new A(i);if(s>1){var f=new b(s);l=new E("^","pow",[l,f])}u=-1===r[s]&&o?new E("-","unaryMinus",[l]):1===Math.abs(r[s])?l:new E("*","multiply",[u,l])}a=o?u:"+"===c?new E("+","add",[a,u]):new E("-","subtract",[a,u]),o=!1}return o?new b(0):a}})),gh="zpk2tf",yh=ur(gh,["typed","add","multiply","Complex","number"],(e=>{var{typed:r,add:t,multiply:n,Complex:i,number:a}=e;return r(gh,{"Array,Array,number":function(e,r,t){return o(e,r,t)},"Array,Array":function(e,r){return o(e,r,1)},"Matrix,Matrix,number":function(e,r,t){return o(e.valueOf(),r.valueOf(),t)},"Matrix,Matrix":function(e,r){return o(e.valueOf(),r.valueOf(),1)}});function o(e,r,t){e.some((e=>"BigNumber"===e.type))&&(e=e.map((e=>a(e)))),r.some((e=>"BigNumber"===e.type))&&(r=r.map((e=>a(e))));for(var o=[i(1,0)],u=[i(1,0)],c=0;c=0&&o-s{var{typed:r,add:t,multiply:n,Complex:i,divide:a,matrix:o}=e;return r(vh,{"Array, Array":function(e,r){return s(e,r,u(512))},"Array, Array, Array":function(e,r,t){return s(e,r,t)},"Array, Array, number":function(e,r,t){if(t<0)throw new Error("w must be a positive number");return s(e,r,u(t))},"Matrix, Matrix":function(e,r){var t=u(512),{w:n,h:i}=s(e.valueOf(),r.valueOf(),t);return{w:o(n),h:o(i)}},"Matrix, Matrix, Matrix":function(e,r,t){var{h:n}=s(e.valueOf(),r.valueOf(),t.valueOf());return{h:o(n),w:o(t)}},"Matrix, Matrix, number":function(e,r,t){if(t<0)throw new Error("w must be a positive number");var n=u(t),{h:i}=s(e.valueOf(),r.valueOf(),n);return{h:o(i),w:o(n)}}});function s(e,r,o){for(var s=[],u=[],c=0;c{var{classes:r}=e;return function(e,t){var n=r[t&&t.mathjs];return n&&"function"==typeof n.fromJSON?n.fromJSON(t):t}})),wh=ur("replacer",[],(()=>function(e,r){return"number"!=typeof r||isFinite(r)&&!isNaN(r)?r:{mathjs:"number",value:String(r)}})),Nh=ur("true",[],(()=>!0)),Dh=ur("false",[],(()=>!1)),Eh=ur("null",[],(()=>null)),Ah=Ph("Infinity",["config","?BigNumber"],(e=>{var{config:r,BigNumber:t}=e;return"BigNumber"===r.number?new t(1/0):1/0})),Ch=Ph("NaN",["config","?BigNumber"],(e=>{var{config:r,BigNumber:t}=e;return"BigNumber"===r.number?new t(NaN):NaN})),Sh=Ph("pi",["config","?BigNumber"],(e=>{var{config:r,BigNumber:t}=e;return"BigNumber"===r.number?Al(t):mi})),Mh=Ph("tau",["config","?BigNumber"],(e=>{var{config:r,BigNumber:t}=e;return"BigNumber"===r.number?Cl(t):di})),Fh=Ph("e",["config","?BigNumber"],(e=>{var{config:r,BigNumber:t}=e;return"BigNumber"===r.number?Dl(t):hi})),Bh=Ph("phi",["config","?BigNumber"],(e=>{var{config:r,BigNumber:t}=e;return"BigNumber"===r.number?El(t):1.618033988749895})),Th=Ph("LN2",["config","?BigNumber"],(e=>{var{config:r,BigNumber:t}=e;return"BigNumber"===r.number?new t(2).ln():Math.LN2})),Oh=Ph("LN10",["config","?BigNumber"],(e=>{var{config:r,BigNumber:t}=e;return"BigNumber"===r.number?new t(10).ln():Math.LN10})),_h=Ph("LOG2E",["config","?BigNumber"],(e=>{var{config:r,BigNumber:t}=e;return"BigNumber"===r.number?new t(1).div(new t(2).ln()):Math.LOG2E})),zh=Ph("LOG10E",["config","?BigNumber"],(e=>{var{config:r,BigNumber:t}=e;return"BigNumber"===r.number?new t(1).div(new t(10).ln()):Math.LOG10E})),qh=Ph("SQRT1_2",["config","?BigNumber"],(e=>{var{config:r,BigNumber:t}=e;return"BigNumber"===r.number?new t("0.5").sqrt():Math.SQRT1_2})),Ih=Ph("SQRT2",["config","?BigNumber"],(e=>{var{config:r,BigNumber:t}=e;return"BigNumber"===r.number?new t(2).sqrt():Math.SQRT2})),kh=Ph("i",["Complex"],(e=>{var{Complex:r}=e;return r.I})),Rh=ur("version",[],(()=>"11.9.1"));function Ph(e,r,t){return ur(e,r,t,{recreateOnConfigChange:!0})}var Uh=Ig("speedOfLight","299792458","m s^-1"),jh=Ig("gravitationConstant","6.67430e-11","m^3 kg^-1 s^-2"),Lh=Ig("planckConstant","6.62607015e-34","J s"),Hh=Ig("reducedPlanckConstant","1.0545718176461565e-34","J s"),$h=Ig("magneticConstant","1.25663706212e-6","N A^-2"),Zh=Ig("electricConstant","8.8541878128e-12","F m^-1"),Gh=Ig("vacuumImpedance","376.730313667","ohm"),Vh=Ig("coulomb","8.987551792261171e9","N m^2 C^-2"),Wh=Ig("elementaryCharge","1.602176634e-19","C"),Yh=Ig("bohrMagneton","9.2740100783e-24","J T^-1"),Jh=Ig("conductanceQuantum","7.748091729863649e-5","S"),Xh=Ig("inverseConductanceQuantum","12906.403729652257","ohm"),Qh=Ig("magneticFluxQuantum","2.0678338484619295e-15","Wb"),Kh=Ig("nuclearMagneton","5.0507837461e-27","J T^-1"),eg=Ig("klitzing","25812.807459304513","ohm"),rg=Ig("bohrRadius","5.29177210903e-11","m"),tg=Ig("classicalElectronRadius","2.8179403262e-15","m"),ng=Ig("electronMass","9.1093837015e-31","kg"),ig=Ig("fermiCoupling","1.1663787e-5","GeV^-2"),ag=kg("fineStructure",.0072973525693),og=Ig("hartreeEnergy","4.3597447222071e-18","J"),sg=Ig("protonMass","1.67262192369e-27","kg"),ug=Ig("deuteronMass","3.3435830926e-27","kg"),cg=Ig("neutronMass","1.6749271613e-27","kg"),lg=Ig("quantumOfCirculation","3.6369475516e-4","m^2 s^-1"),fg=Ig("rydberg","10973731.568160","m^-1"),pg=Ig("thomsonCrossSection","6.6524587321e-29","m^2"),mg=kg("weakMixingAngle",.2229),dg=kg("efimovFactor",22.7),hg=Ig("atomicMass","1.66053906660e-27","kg"),gg=Ig("avogadro","6.02214076e23","mol^-1"),yg=Ig("boltzmann","1.380649e-23","J K^-1"),vg=Ig("faraday","96485.33212331001","C mol^-1"),xg=Ig("firstRadiation","3.7417718521927573e-16","W m^2"),bg=Ig("loschmidt","2.686780111798444e25","m^-3"),wg=Ig("gasConstant","8.31446261815324","J K^-1 mol^-1"),Ng=Ig("molarPlanckConstant","3.990312712893431e-10","J s mol^-1"),Dg=Ig("molarVolume","0.022413969545014137","m^3 mol^-1"),Eg=kg("sackurTetrode",-1.16487052358),Ag=Ig("secondRadiation","0.014387768775039337","m K"),Cg=Ig("stefanBoltzmann","5.67037441918443e-8","W m^-2 K^-4"),Sg=Ig("wienDisplacement","2.897771955e-3","m K"),Mg=Ig("molarMass","0.99999999965e-3","kg mol^-1"),Fg=Ig("molarMassC12","11.9999999958e-3","kg mol^-1"),Bg=Ig("gravity","9.80665","m s^-2"),Tg=Ig("planckLength","1.616255e-35","m"),Og=Ig("planckMass","2.176435e-8","kg"),_g=Ig("planckTime","5.391245e-44","s"),zg=Ig("planckCharge","1.87554603778e-18","C"),qg=Ig("planckTemperature","1.416785e+32","K");function Ig(e,r,t){return ur(e,["config","Unit","BigNumber"],(e=>{var{config:n,Unit:i,BigNumber:a}=e,o=new i("BigNumber"===n.number?new a(r):parseFloat(r),t);return o.fixPrefix=!0,o}))}function kg(e,r){return ur(e,["config","BigNumber"],(e=>{var{config:t,BigNumber:n}=e;return"BigNumber"===t.number?new n(r):r}))}var Rg=ur("apply",["typed","isInteger"],(e=>{var{typed:r,isInteger:t}=e,n=Ra({typed:r,isInteger:t});return r("apply",{"...any":function(e){var r=e[1];a(r)?e[1]=r-1:o(r)&&(e[1]=r.minus(1));try{return n.apply(null,e)}catch(e){throw np(e)}}})}),{isTransformFunction:!0}),Pg=ur("column",["typed","Index","matrix","range"],(e=>{var{typed:r,Index:t,matrix:n,range:i}=e,o=Ss({typed:r,Index:t,matrix:n,range:i});return r("column",{"...any":function(e){var r=e.length-1,t=e[r];a(t)&&(e[r]=t-1);try{return o.apply(null,e)}catch(e){throw np(e)}}})}),{isTransformFunction:!0});function Ug(e,r,t){var n=e.filter((function(e){return H(e)&&!(e.name in r)&&!t.has(e.name)}))[0];if(!n)throw new Error('No undefined variable found in inline expression "'+e+'"');var i=n.name,a=$p(t),o=e.compile();return function(e){return a.set(i,e),o.evaluate(a)}}var jg=ur("filter",["typed"],(e=>{var{typed:r}=e;function t(e,r,t){var i,a;return e[0]&&(i=e[0].compile().evaluate(t)),e[1]&&(a=H(e[1])||z(e[1])?e[1].compile().evaluate(t):Ug(e[1],r,t)),n(i,a)}t.rawArgs=!0;var n=r("filter",{"Array, function":Lg,"Matrix, function":function(e,r){return e.create(Lg(e.toArray(),r))},"Array, RegExp":nr,"Matrix, RegExp":function(e,r){return e.create(nr(e.toArray(),r))}});return t}),{isTransformFunction:!0});function Lg(e,r){return tr(e,(function(e,t,n){return zs(r,e,[t+1],n,"filter")}))}var Hg=ur("forEach",["typed"],(e=>{var{typed:r}=e;function t(e,r,t){var i,a;return e[0]&&(i=e[0].compile().evaluate(t)),e[1]&&(a=H(e[1])||z(e[1])?e[1].compile().evaluate(t):Ug(e[1],r,t)),n(i,a)}t.rawArgs=!0;var n=r("forEach",{"Array | Matrix, function":function(e,r){!function t(n,i){if(!Array.isArray(n))return zs(r,n,i,e,"forEach");rr(n,(function(e,r){t(e,i.concat(r+1))}))}(e.valueOf(),[])}});return t}),{isTransformFunction:!0}),$g=ur("index",["Index"],(e=>{var{Index:r}=e;return function(){for(var e=[],t=0,n=arguments.length;t0?0:2;else if(i&&!0===i.isSet)i=i.map((function(e){return e-1}));else if(f(i)||p(i))i=i.map((function(e){return e-1}));else if(a(i))i--;else if(o(i))i=i.toNumber()-1;else if("string"!=typeof i)throw new TypeError("Dimension must be an Array, Matrix, number, string, or Range");e[t]=i}var s=new r;return r.apply(s,e),s}}),{isTransformFunction:!0}),Zg=ur("map",["typed"],(e=>{var{typed:r}=e;function t(e,r,t){var i,a;return e[0]&&(i=e[0].compile().evaluate(t)),e[1]&&(a=H(e[1])||z(e[1])?e[1].compile().evaluate(t):Ug(e[1],r,t)),n(i,a)}t.rawArgs=!0;var n=r("map",{"Array, function":function(e,r){return Gg(e,r,e)},"Matrix, function":function(e,r){return e.create(Gg(e.valueOf(),r,e))}});return t}),{isTransformFunction:!0});function Gg(e,r,t){return function e(n,i){return Array.isArray(n)?er(n,(function(r,t){return e(r,i.concat(t+1))})):zs(r,n,i,t,"map")}(e,[])}function Vg(e){if(2===e.length&&m(e[0])){var r=(e=e.slice())[1];a(r)?e[1]=r-1:o(r)&&(e[1]=r.minus(1))}return e}var Wg=["typed","config","numeric","larger"],Yg=ur("max",Wg,(e=>{var{typed:r,config:t,numeric:n,larger:i}=e,a=yl({typed:r,config:t,numeric:n,larger:i});return r("max",{"...any":function(e){e=Vg(e);try{return a.apply(null,e)}catch(e){throw np(e)}}})}),{isTransformFunction:!0}),Jg=["typed","add","divide"],Xg=ur("mean",Jg,(e=>{var{typed:r,add:t,divide:n}=e,i=od({typed:r,add:t,divide:n});return r("mean",{"...any":function(e){e=Vg(e);try{return i.apply(null,e)}catch(e){throw np(e)}}})}),{isTransformFunction:!0}),Qg=["typed","config","numeric","smaller"],Kg=ur("min",Qg,(e=>{var{typed:r,config:t,numeric:n,smaller:i}=e,a=vl({typed:r,config:t,numeric:n,smaller:i});return r("min",{"...any":function(e){e=Vg(e);try{return a.apply(null,e)}catch(e){throw np(e)}}})}),{isTransformFunction:!0}),ey=["typed","config","?matrix","?bignumber","smaller","smallerEq","larger","largerEq","add","isPositive"],ry=ur("range",ey,(e=>{var{typed:r,config:t,matrix:n,bignumber:i,smaller:a,smallerEq:o,larger:s,largerEq:u,add:c,isPositive:l}=e,f=nu({typed:r,config:t,matrix:n,bignumber:i,smaller:a,smallerEq:o,larger:s,largerEq:u,add:c,isPositive:l});return r("range",{"...any":function(e){return"boolean"!=typeof e[e.length-1]&&e.push(!0),f.apply(null,e)}})}),{isTransformFunction:!0}),ty=["typed","Index","matrix","range"],ny=ur("row",ty,(e=>{var{typed:r,Index:t,matrix:n,range:i}=e,o=fu({typed:r,Index:t,matrix:n,range:i});return r("row",{"...any":function(e){var r=e.length-1,t=e[r];a(t)&&(e[r]=t-1);try{return o.apply(null,e)}catch(e){throw np(e)}}})}),{isTransformFunction:!0}),iy=["typed","matrix"],ay=ur("subset",iy,(e=>{var{typed:r,matrix:t}=e,n=yu({typed:r,matrix:t});return r("subset",{"...any":function(e){try{return n.apply(null,e)}catch(e){throw np(e)}}})}),{isTransformFunction:!0}),oy=["typed","matrix","isInteger"],sy=ur("concat",oy,(e=>{var{typed:r,matrix:t,isInteger:n}=e,i=Es({typed:r,matrix:t,isInteger:n});return r("concat",{"...any":function(e){var r=e.length-1,t=e[r];a(t)?e[r]=t-1:o(t)&&(e[r]=t.minus(1));try{return i.apply(null,e)}catch(e){throw np(e)}}})}),{isTransformFunction:!0}),uy="diff",cy=["typed","matrix","subtract","number","bignumber"],ly=ur(uy,cy,(e=>{var{typed:r,matrix:t,subtract:n,number:i,bignumber:a}=e,o=Xs({typed:r,matrix:t,subtract:n,number:i,bignumber:a});return r(uy,{"...any":function(e){e=Vg(e);try{return o.apply(null,e)}catch(e){throw np(e)}}})}),{isTransformFunction:!0}),fy=["typed","map","sqrt","variance"],py=ur("std",fy,(e=>{var{typed:r,map:t,sqrt:n,variance:i}=e,a=dd({typed:r,map:t,sqrt:n,variance:i});return r("std",{"...any":function(e){e=Vg(e);try{return a.apply(null,e)}catch(e){throw np(e)}}})}),{isTransformFunction:!0}),my=["typed","config","add","numeric"],dy=ur("sum",my,(e=>{var{typed:r,config:t,add:n,numeric:i}=e,a=td({typed:r,config:t,add:n,numeric:i});return r("sum",{"...any":function(e){e=Vg(e);try{return a.apply(null,e)}catch(e){throw np(e)}}})}),{isTransformFunction:!0}),hy="cumsum",gy=["typed","add","unaryPlus"],yy=ur(hy,gy,(e=>{var{typed:r,add:t,unaryPlus:n}=e,i=id({typed:r,add:t,unaryPlus:n});return r(hy,{"...any":function(e){if(2===e.length&&m(e[0])){var r=e[1];a(r)?e[1]=r-1:o(r)&&(e[1]=r.minus(1))}try{return i.apply(null,e)}catch(e){throw np(e)}}})}),{isTransformFunction:!0}),vy="variance",xy=["typed","add","subtract","multiply","divide","apply","isNaN"],by=ur(vy,xy,(e=>{var{typed:r,add:t,subtract:n,multiply:i,divide:a,apply:o,isNaN:s}=e,u=pd({typed:r,add:t,subtract:n,multiply:i,divide:a,apply:o,isNaN:s});return r(vy,{"...any":function(e){e=Vg(e);try{return u.apply(null,e)}catch(e){throw np(e)}}})}),{isTransformFunction:!0}),wy=mn({config:Q}),Ny=hn({}),Dy=Fh({BigNumber:wy,config:Q}),Ey=Dh({}),Ay=ag({BigNumber:wy,config:Q}),Cy=yn({}),Sy=kh({Complex:Ny}),My=Ah({BigNumber:wy,config:Q}),Fy=Oh({BigNumber:wy,config:Q}),By=zh({BigNumber:wy,config:Q}),Ty=xn({}),Oy=Ch({BigNumber:wy,config:Q}),_y=Eh({}),zy=Bh({BigNumber:wy,config:Q}),qy=vn({}),Iy=Fr({}),ky=qh({BigNumber:wy,config:Q}),Ry=Eg({BigNumber:wy,config:Q}),Py=Mh({BigNumber:wy,config:Q}),Uy=Nh({}),jy=Rh({}),Ly=Dn({Matrix:Ty}),Hy=dg({BigNumber:wy,config:Q}),$y=Th({BigNumber:wy,config:Q}),Zy=Sh({BigNumber:wy,config:Q}),Gy=wh({}),Vy=Ih({BigNumber:wy,config:Q}),Wy=Dr({BigNumber:wy,Complex:Ny,DenseMatrix:Ly,Fraction:Cy}),Yy=qa({BigNumber:wy,config:Q,typed:Wy}),Jy=mg({BigNumber:wy,config:Q}),Xy=Ia({typed:Wy}),Qy=Rl({Complex:Ny,config:Q,typed:Wy}),Ky=Ll({BigNumber:wy,typed:Wy}),ev=Gl({BigNumber:wy,Complex:Ny,config:Q,typed:Wy}),rv=ja({typed:Wy}),tv=hs({typed:Wy}),nv=Ql({BigNumber:wy,Complex:Ny,config:Q,typed:Wy}),iv=rf({typed:Wy}),av=tf({typed:Wy}),ov=sf({Complex:Ny,config:Q,typed:Wy}),sv=xa({BigNumber:wy,typed:Wy}),uv=cs({typed:Wy}),cv=va({typed:Wy}),lv=An({typed:Wy}),fv=gd({typed:Wy}),pv=ba({Complex:Ny,typed:Wy}),mv=ys({typed:Wy}),dv=ff({typed:Wy}),hv=df({BigNumber:wy,typed:Wy}),gv=hf({BigNumber:wy,typed:Wy}),yv=Qa({typed:Wy}),vv=pa({config:Q,typed:Wy}),xv=zu({typed:Wy}),bv=Ka({typed:Wy}),wv=ro({Complex:Ny,typed:Wy}),Nv=qs({typed:Wy}),Dv=Us({typed:Wy}),Ev=Gu({typed:Wy}),Av=Hs({typed:Wy}),Cv=Yu({format:Ev,typed:Wy}),Sv=vs({typed:Wy}),Mv=zn({typed:Wy}),Fv=Ji({typed:Wy}),Bv=ta({typed:Wy}),Tv=ia({typed:Wy}),Ov=_h({BigNumber:wy,config:Q}),_v=Ed({Complex:Ny,typed:Wy}),zv=So({Complex:Ny,config:Q,typed:Wy}),qv=Fo({Complex:Ny,config:Q,typed:Wy}),Iv=Ws({typed:Wy}),kv=_o({typed:Wy}),Rv=bs({typed:Wy}),Pv=da({typed:Wy}),Uv=Wu({format:Ev,typed:Wy}),jv=Rd({config:Q,typed:Wy}),Lv=Xu({typed:Wy}),Hv=jd({config:Q,typed:Wy}),$v=xs({typed:Wy}),Zv=vf({BigNumber:wy,typed:Wy}),Gv=Po({BigNumber:wy,Fraction:Cy,complex:pv,typed:Wy}),Vv=wf({typed:Wy}),Wv=ma({Matrix:Ty,equalScalar:vv,typed:Wy}),Yv=Ta({typed:Wy}),Jv=Lo({typed:Wy}),Xv=ga({typed:Wy}),Qv=Ef({typed:Wy}),Kv=ua({typed:Wy}),ex=Ul({Complex:Ny,config:Q,typed:Wy}),rx=Wl({BigNumber:wy,typed:Wy}),tx=Ra({isInteger:Mv,typed:Wy}),nx=Jl({BigNumber:wy,Complex:Ny,config:Q,typed:Wy}),ix=Vu({format:Ev,typed:Wy}),ax=xd({typed:Wy}),ox=cf({typed:Wy}),sx=yf({BigNumber:wy,typed:Wy}),ux=oa({typed:Wy}),cx=rc({typed:Wy}),lx=Hd({config:Q,typed:Wy}),fx=bf({BigNumber:wy,typed:Wy}),px=Df({typed:Wy}),mx=zl({SparseMatrix:Wv,typed:Wy}),dx=Uo({Complex:Ny,config:Q,typed:Wy}),hx=Af({typed:Wy}),gx=_a({typed:Wy}),yx=$l({BigNumber:wy,Complex:Ny,config:Q,typed:Wy}),vx=pf({BigNumber:wy,typed:Wy}),xx=wa({Fraction:Cy,typed:Wy}),bx=Qi({typed:Wy}),wx=Da({DenseMatrix:Ly,Matrix:Ty,SparseMatrix:Wv,typed:Wy}),Nx=Aa({isZero:Tv,matrix:wx,typed:Wy}),Dx=ju({isNaN:ux,isNumeric:bx,typed:Wy}),Ex=tc({bignumber:sv,fraction:xx,number:Pv}),Ax=$u({config:Q,multiplyScalar:kv,numeric:Ex,typed:Wy}),Cx=au({isInteger:Mv,matrix:wx,typed:Wy}),Sx=mu({matrix:wx,config:Q,typed:Wy}),Mx=hu({matrix:wx,typed:Wy}),Fx=yu({matrix:wx,typed:Wy}),Bx=Du({matrix:wx,typed:Wy}),Tx=Go({BigNumber:wy,config:Q,matrix:wx,typed:Wy}),Ox=Su({BigNumber:wy,config:Q,matrix:wx,typed:Wy}),_x=ef({Complex:Ny,config:Q,typed:Wy}),zx=Ha({BigNumber:wy,Complex:Ny,Fraction:Cy,config:Q,isNegative:Fv,matrix:wx,typed:Wy,unaryMinus:gx}),qx=Es({isInteger:Mv,matrix:wx,typed:Wy}),Ix=Fs({prod:Ax,size:Sx,typed:Wy}),kx=Au({conj:mv,transpose:Bx,typed:Wy}),Rx=_s({DenseMatrix:Ly,SparseMatrix:Wv,matrix:wx,typed:Wy}),Px=ic({numeric:Ex,typed:Wy}),Ux=yc({DenseMatrix:Ly,concat:qx,divideScalar:Px,equalScalar:vv,matrix:wx,typed:Wy}),jx=Gc({DenseMatrix:Ly,concat:qx,equalScalar:vv,matrix:wx,typed:Wy}),Lx=Rs({matrix:wx,typed:Wy}),Hx=No({BigNumber:wy,DenseMatrix:Ly,concat:qx,equalScalar:vv,matrix:wx,typed:Wy}),$x=ea({isNumeric:bx,typed:Wy}),Zx=Zs({BigNumber:wy,DenseMatrix:Ly,SparseMatrix:Wv,config:Q,matrix:wx,typed:Wy}),Gx=Vs({matrix:wx,multiplyScalar:kv,typed:Wy}),Vx=ol({DenseMatrix:Ly,concat:qx,config:Q,matrix:wx,typed:Wy}),Wx=Bc({DenseMatrix:Ly,concat:qx,equalScalar:vv,matrix:wx,typed:Wy,zeros:Ox}),Yx=Fa({flatten:Lx,matrix:wx,size:Sx,typed:Wy}),Jx=Oo({DenseMatrix:Ly,concat:qx,equalScalar:vv,matrix:wx,typed:Wy}),Xx=ko({BigNumber:wy,concat:qx,equalScalar:vv,matrix:wx,typed:Wy}),Qx=Qs({BigNumber:wy,config:Q,matrix:wx,typed:Wy}),Kx=ou({config:Q,matrix:wx}),eb=Oc({DenseMatrix:Ly,concat:qx,equalScalar:vv,matrix:wx,typed:Wy,zeros:Ox}),rb=uc({BigNumber:wy,DenseMatrix:Ly,equalScalar:vv,matrix:wx,typed:Wy,zeros:Ox}),tb=Xc({DenseMatrix:Ly,concat:qx,config:Q,matrix:wx,typed:Wy}),nb=Ku({concat:qx,matrix:wx,typed:Wy}),ib=fl({DenseMatrix:Ly,concat:qx,config:Q,equalScalar:vv,matrix:wx,typed:Wy}),ab=Ns({DenseMatrix:Ly,concat:qx,matrix:wx,typed:Wy}),ob=Gf({DenseMatrix:Ly,SparseMatrix:Wv,addScalar:rv,concat:qx,equalScalar:vv,matrix:wx,typed:Wy}),sb=ss({concat:qx,equalScalar:vv,matrix:wx,typed:Wy}),ub=ds({DenseMatrix:Ly,concat:qx,matrix:wx,typed:Wy}),cb=Yd({addScalar:rv,combinations:fv,divideScalar:Px,isInteger:Mv,isNegative:Fv,multiplyScalar:kv,typed:Wy}),lb=kc({BigNumber:wy,DenseMatrix:Ly,Fraction:Cy,concat:qx,config:Q,equalScalar:vv,matrix:wx,typed:Wy}),fb=$c({concat:qx,matrix:wx,typed:Wy}),pb=id({add:ob,typed:Wy,unaryPlus:Yy}),mb=cl({equal:jx,typed:Wy}),db=Xf({addScalar:rv,conj:mv,multiplyScalar:kv,size:Sx,typed:Wy}),hb=Yc({compareText:fb,isZero:Tv,typed:Wy}),gb=co({DenseMatrix:Ly,config:Q,equalScalar:vv,matrix:wx,round:rb,typed:Wy,zeros:Ox}),yb=Wf({abs:Xy,addScalar:rv,divideScalar:Px,isPositive:Bv,multiplyScalar:kv,smaller:tb,sqrt:dx,typed:Wy}),vb=xl({DenseMatrix:Ly,smaller:tb}),xb=bl({ImmutableDenseMatrix:vb}),bb=Wo({BigNumber:wy,add:ob,config:Q,equal:jx,isInteger:Mv,mod:Jx,smaller:tb,typed:Wy,xgcd:Tx}),wb=nl({DenseMatrix:Ly,concat:qx,config:Q,matrix:wx,typed:Wy}),Nb=cc({Complex:Ny,config:Q,divideScalar:Px,typed:Wy}),Db=Sa({flatten:Lx,matrix:wx,size:Sx,typed:Wy}),Eb=vl({config:Q,numeric:Ex,smaller:tb,typed:Wy}),Ab=qo({addScalar:rv,dot:db,equalScalar:vv,matrix:wx,multiplyScalar:kv,typed:Wy}),Cb=mc({Complex:Ny,config:Q,divideScalar:Px,typed:Wy}),Sb=ws({DenseMatrix:Ly,concat:qx,equalScalar:vv,matrix:wx,typed:Wy}),Mb=dl({compare:lb,isNaN:ux,isNumeric:bx,typed:Wy}),Fb=md({add:ob,compare:lb,multiply:Ab,partitionSelect:Mb,typed:Wy}),Bb=zc({DenseMatrix:Ly,concat:qx,equalScalar:vv,matrix:wx,typed:Wy,zeros:Ox}),Tb=el({DenseMatrix:Ly,concat:qx,config:Q,matrix:wx,typed:Wy}),Ob=$o({DenseMatrix:Ly,addScalar:rv,concat:qx,equalScalar:vv,matrix:wx,typed:Wy,unaryMinus:gx}),_b=Qf({add:ob,matrix:wx,typed:Wy}),zb=Nc({DenseMatrix:Ly,divideScalar:Px,equalScalar:vv,matrix:wx,multiplyScalar:kv,subtract:Ob,typed:Wy}),qb=yh({Complex:Ny,add:ob,multiply:Ab,number:Pv,typed:Wy}),Ib=qc({concat:qx,equalScalar:vv,matrix:wx,not:Rv,typed:Wy,zeros:Ox}),kb=fs({DenseMatrix:Ly,concat:qx,equalScalar:vv,matrix:wx,typed:Wy}),Rb=Ja({DenseMatrix:Ly,config:Q,equalScalar:vv,matrix:wx,round:rb,typed:Wy,zeros:Ox}),Pb=jc({compare:lb,typed:Wy}),Ub=Xd({addScalar:rv,combinations:fv,isInteger:Mv,isNegative:Fv,isPositive:Bv,larger:wb,typed:Wy}),jb=Ts({matrix:wx,multiply:Ab,subtract:Ob,typed:Wy}),Lb=qm({divideScalar:Px,isZero:Tv,matrix:wx,multiply:Ab,subtract:Ob,typed:Wy,unaryMinus:gx}),Hb=Xs({matrix:wx,number:Pv,subtract:Ob,typed:Wy}),$b=ed({abs:Xy,addScalar:rv,deepEqual:mb,divideScalar:Px,multiplyScalar:kv,sqrt:dx,subtract:Ob,typed:Wy}),Zb=Xo({concat:qx,equalScalar:vv,matrix:wx,multiplyScalar:kv,typed:Wy}),Gb=wl({larger:wb,smaller:tb}),Vb=ao({Complex:Ny,DenseMatrix:Ly,ceil:Rb,equalScalar:vv,floor:gb,matrix:wx,typed:Wy,zeros:Ox}),Wb=ep({Index:xb,typed:Wy}),Yb=rd({abs:Xy,add:ob,addScalar:rv,config:Q,divideScalar:Px,equalScalar:vv,flatten:Lx,isNumeric:bx,isZero:Tv,matrix:wx,multiply:Ab,multiplyScalar:kv,smaller:tb,subtract:Ob,typed:Wy}),Jb=Ao({concat:qx,equalScalar:vv,matrix:wx,typed:Wy}),Xb=fc({Complex:Ny,config:Q,divideScalar:Px,log:Nb,typed:Wy}),Qb=bc({DenseMatrix:Ly,divideScalar:Px,equalScalar:vv,matrix:wx,multiplyScalar:kv,subtract:Ob,typed:Wy}),Kb=yl({config:Q,larger:wb,numeric:Ex,typed:Wy}),ew=nm({addScalar:rv,complex:pv,conj:mv,divideScalar:Px,equal:jx,identity:Zx,isZero:Tv,matrix:wx,multiplyScalar:kv,sign:Gv,sqrt:dx,subtract:Ob,typed:Wy,unaryMinus:gx,zeros:Ox}),rw=nu({bignumber:sv,matrix:wx,add:ob,config:Q,isPositive:Bv,larger:wb,largerEq:Vx,smaller:tb,smallerEq:Tb,typed:Wy}),tw=fu({Index:xb,matrix:wx,range:rw,typed:Wy}),nw=Sf({DenseMatrix:Ly,Index:xb,compareNatural:Pb,size:Sx,subset:Fx,typed:Wy}),iw=Tf({DenseMatrix:Ly,Index:xb,compareNatural:Pb,size:Sx,subset:Fx,typed:Wy}),aw=qf({Index:xb,compareNatural:Pb,size:Sx,subset:Fx,typed:Wy}),ow=Pf({Index:xb,compareNatural:Pb,size:Sx,subset:Fx,typed:Wy}),sw=gm({SparseMatrix:Wv,abs:Xy,add:ob,divideScalar:Px,larger:wb,largerEq:Vx,multiply:Ab,subtract:Ob,transpose:Bx,typed:Wy}),uw=gl({compare:lb,compareNatural:Pb,matrix:wx,typed:Wy}),cw=td({add:ob,config:Q,numeric:Ex,typed:Wy}),lw=Cc({DenseMatrix:Ly,divideScalar:Px,equalScalar:vv,matrix:wx,multiplyScalar:kv,subtract:Ob,typed:Wy}),fw=af({BigNumber:wy,DenseMatrix:Ly,concat:qx,equalScalar:vv,matrix:wx,typed:Wy}),pw=Ss({Index:xb,matrix:wx,range:rw,typed:Wy}),mw=Ec({DenseMatrix:Ly,divideScalar:Px,equalScalar:vv,matrix:wx,multiplyScalar:kv,subtract:Ob,typed:Wy}),dw=Ff({DenseMatrix:Ly,Index:xb,compareNatural:Pb,size:Sx,subset:Fx,typed:Wy}),hw=kf({Index:xb,compareNatural:Pb,size:Sx,subset:Fx,typed:Wy}),gw=Hf({Index:xb,concat:qx,setDifference:dw,size:Sx,subset:Fx,typed:Wy}),yw=Nl({FibonacciHeap:Gb,addScalar:rv,equalScalar:vv}),vw=Im({abs:Xy,addScalar:rv,det:Lb,divideScalar:Px,identity:Zx,matrix:wx,multiply:Ab,typed:Wy,unaryMinus:gx}),xw=tm({DenseMatrix:Ly,Spa:yw,SparseMatrix:Wv,abs:Xy,addScalar:rv,divideScalar:Px,equalScalar:vv,larger:wb,matrix:wx,multiplyScalar:kv,subtract:Ob,typed:Wy,unaryMinus:gx}),bw=Rm({Complex:Ny,add:ob,ctranspose:kx,deepEqual:mb,divideScalar:Px,dot:db,dotDivide:Ux,equal:jx,inv:vw,matrix:wx,multiply:Ab,typed:Wy}),ww=ac({Complex:Ny,config:Q,fraction:xx,identity:Zx,inv:vw,matrix:wx,multiply:Ab,number:Pv,typed:Wy}),Nw=_f({DenseMatrix:Ly,Index:xb,compareNatural:Pb,size:Sx,subset:Fx,typed:Wy}),Dw=Zf({Index:xb,concat:qx,setIntersect:Nw,setSymDifference:gw,size:Sx,subset:Fx,typed:Wy}),Ew=Zm({abs:Xy,add:ob,identity:Zx,inv:vw,map:Iv,max:Kb,multiply:Ab,size:Sx,sqrt:dx,subtract:Ob,typed:Wy}),Aw=Bl({BigNumber:wy,Complex:Ny,Fraction:Cy,abs:Xy,addScalar:rv,config:Q,divideScalar:Px,equal:jx,fix:Vb,format:Ev,isNumeric:bx,multiplyScalar:kv,number:Pv,pow:ww,round:rb,subtract:Ob}),Cw=Gh({BigNumber:wy,Unit:Aw,config:Q}),Sw=Sg({BigNumber:wy,Unit:Aw,config:Q}),Mw=hg({BigNumber:wy,Unit:Aw,config:Q}),Fw=Yh({BigNumber:wy,Unit:Aw,config:Q}),Bw=yg({BigNumber:wy,Unit:Aw,config:Q}),Tw=Jh({BigNumber:wy,Unit:Aw,config:Q}),Ow=Il({Unit:Aw,typed:Wy}),_w=ug({BigNumber:wy,Unit:Aw,config:Q}),zw=hc({DenseMatrix:Ly,concat:qx,equalScalar:vv,matrix:wx,pow:ww,typed:Wy}),qw=Zh({BigNumber:wy,Unit:Aw,config:Q}),Iw=Wh({BigNumber:wy,Unit:Aw,config:Q}),kw=Hm({abs:Xy,add:ob,identity:Zx,inv:vw,multiply:Ab,typed:Wy}),Rw=vg({BigNumber:wy,Unit:Aw,config:Q}),Pw=Mu({addScalar:rv,ceil:Rb,conj:mv,divideScalar:Px,dotDivide:Ux,exp:bv,i:Sy,log2:qv,matrix:wx,multiplyScalar:kv,pow:ww,tau:Py,typed:Wy}),Uw=Nd({BigNumber:wy,Complex:Ny,config:Q,multiplyScalar:kv,pow:ww,typed:Wy}),jw=jh({BigNumber:wy,Unit:Aw,config:Q}),Lw=og({BigNumber:wy,Unit:Aw,config:Q}),Hw=Bu({conj:mv,dotDivide:Ux,fft:Pw,typed:Wy}),$w=eg({BigNumber:wy,Unit:Aw,config:Q}),Zw=bg({BigNumber:wy,Unit:Aw,config:Q}),Gw=$h({BigNumber:wy,Unit:Aw,config:Q}),Vw=Mg({BigNumber:wy,Unit:Aw,config:Q}),Ww=Ng({BigNumber:wy,Unit:Aw,config:Q}),Yw=cg({BigNumber:wy,Unit:Aw,config:Q}),Jw=Kh({BigNumber:wy,Unit:Aw,config:Q}),Xw=zg({BigNumber:wy,Unit:Aw,config:Q}),Qw=Tg({BigNumber:wy,Unit:Aw,config:Q}),Kw=qg({BigNumber:wy,Unit:Aw,config:Q}),eN=sg({BigNumber:wy,Unit:Aw,config:Q}),rN=Hh({BigNumber:wy,Unit:Aw,config:Q}),tN=fg({BigNumber:wy,Unit:Aw,config:Q}),nN=Ag({BigNumber:wy,Unit:Aw,config:Q}),iN=Uh({BigNumber:wy,Unit:Aw,config:Q}),aN=Cg({BigNumber:wy,Unit:Aw,config:Q}),oN=pg({BigNumber:wy,Unit:Aw,config:Q}),sN=gg({BigNumber:wy,Unit:Aw,config:Q}),uN=rg({BigNumber:wy,Unit:Aw,config:Q}),cN=Vh({BigNumber:wy,Unit:Aw,config:Q}),lN=Qm({divideScalar:Px,equalScalar:vv,inv:vw,matrix:wx,multiply:Ab,typed:Wy}),fN=ng({BigNumber:wy,Unit:Aw,config:Q}),pN=Cd({gamma:Uw,typed:Wy}),mN=xg({BigNumber:wy,Unit:Aw,config:Q}),dN=Bg({BigNumber:wy,Unit:Aw,config:Q}),hN=Xh({BigNumber:wy,Unit:Aw,config:Q}),gN=bm({DenseMatrix:Ly,lsolve:Qb,lup:xw,matrix:wx,slu:sw,typed:Wy,usolve:zb}),yN=Qh({BigNumber:wy,Unit:Aw,config:Q}),vN=Fg({BigNumber:wy,Unit:Aw,config:Q}),xN=Bd({add:ob,divide:lN,factorial:pN,isInteger:Mv,isPositive:Bv,multiply:Ab,typed:Wy}),bN=Od({factorial:pN,typed:Wy}),wN=Og({BigNumber:wy,Unit:Aw,config:Q}),NN=Dm({add:ob,cbrt:zx,divide:lN,equalScalar:vv,im:Sv,isZero:Tv,multiply:Ab,re:$v,sqrt:dx,subtract:Ob,typeOf:Kv,typed:Wy,unaryMinus:gx}),DN=jf({compareNatural:Pb,typed:Wy}),EN=_u({abs:Xy,add:ob,bignumber:sv,divide:lN,isNegative:Fv,isPositive:Bv,larger:wb,map:Iv,matrix:wx,max:Kb,multiply:Ab,smaller:tb,subtract:Ob,typed:Wy,unaryMinus:gx}),AN=Zd({bignumber:sv,addScalar:rv,combinations:fv,divideScalar:Px,factorial:pN,isInteger:Mv,isNegative:Fv,larger:wb,multiplyScalar:kv,number:Pv,pow:ww,subtract:Ob,typed:Wy}),CN=Ol({Unit:Aw,typed:Wy}),SN=Vd({addScalar:rv,isInteger:Mv,isNegative:Fv,stirlingS2:AN,typed:Wy}),MN=jm({abs:Xy,add:ob,addScalar:rv,atan:av,bignumber:sv,column:pw,complex:pv,config:Q,cos:ox,diag:Rx,divideScalar:Px,dot:db,equal:jx,flatten:Lx,im:Sv,inv:vw,larger:wb,matrix:wx,matrixFromColumns:Yx,multiply:Ab,multiplyScalar:kv,number:Pv,qr:ew,re:$v,sin:Vv,smaller:tb,sqrt:dx,subtract:Ob,typed:Wy,usolve:zb,usolveAll:lw}),FN=ig({BigNumber:wy,Unit:Aw,config:Q}),BN=wg({BigNumber:wy,Unit:Aw,config:Q}),TN=od({add:ob,divide:lN,typed:Wy}),ON=Dg({BigNumber:wy,Unit:Aw,config:Q}),_N=Lh({BigNumber:wy,Unit:Aw,config:Q}),zN=lg({BigNumber:wy,Unit:Aw,config:Q}),qN=pd({add:ob,apply:tx,divide:lN,isNaN:ux,multiply:Ab,subtract:Ob,typed:Wy}),IN=tg({BigNumber:wy,Unit:Aw,config:Q}),kN=ud({add:ob,compare:lb,divide:lN,partitionSelect:Mb,typed:Wy}),RN=Md({divide:lN,dotDivide:Ux,isNumeric:bx,log:Nb,map:Iv,matrix:wx,multiply:Ab,sum:cw,typed:Wy}),PN=cd({abs:Xy,map:Iv,median:kN,subtract:Ob,typed:Wy}),UN=dd({map:Iv,sqrt:dx,typed:Wy,variance:qN}),jN=xh({Complex:Ny,add:ob,divide:lN,matrix:wx,multiply:Ab,typed:Wy}),LN=Jf({abs:Xy,add:ob,conj:mv,ctranspose:kx,eigs:MN,equalScalar:vv,larger:wb,matrix:wx,multiply:Ab,pow:ww,smaller:tb,sqrt:dx,typed:Wy}),HN=lu({BigNumber:wy,DenseMatrix:Ly,SparseMatrix:Wv,addScalar:rv,config:Q,cos:ox,matrix:wx,multiplyScalar:kv,norm:LN,sin:Vv,typed:Wy,unaryMinus:gx}),$N=_g({BigNumber:wy,Unit:Aw,config:Q}),ZN=Ym({identity:Zx,matrix:wx,multiply:Ab,norm:LN,qr:ew,subtract:Ob,typed:Wy}),GN=uu({multiply:Ab,rotationMatrix:HN,typed:Wy}),VN=Vm({abs:Xy,add:ob,concat:qx,identity:Zx,index:Wb,lusolve:gN,matrix:wx,matrixFromColumns:Yx,multiply:Ab,range:rw,schur:ZN,subset:Fx,subtract:Ob,transpose:Bx,typed:Wy}),WN=Xm({matrix:wx,multiply:Ab,sylvester:VN,transpose:Bx,typed:Wy}),YN={},JN={},XN={},QN=tp({mathWithTransform:JN}),KN=zp({Node:QN}),eD=Ip({Node:QN}),rD=Rp({Node:QN}),tD=Lp({Node:QN}),nD=up({Node:QN}),iD=yp({Node:QN,ResultSet:Iy}),aD=xp({Node:QN}),oD=Mp({Node:QN}),sD=Up({Node:QN}),uD=bh({classes:XN}),cD=Sm({math:YN,typed:Wy}),lD=Bp({Node:QN,typed:Wy}),fD=zm({Chain:cD,typed:Wy}),pD=op({Node:QN,subset:Fx}),mD=Op({Node:QN,size:Sx}),dD=hp({matrix:wx,Node:QN,subset:Fx}),hD=Hp({Unit:Aw,Node:QN,math:YN}),gD=Gp({Node:QN,SymbolNode:hD,math:YN}),yD=Wp({AccessorNode:pD,ArrayNode:nD,AssignmentNode:dD,BlockNode:iD,ConditionalNode:aD,ConstantNode:oD,FunctionAssignmentNode:lD,FunctionNode:gD,IndexNode:mD,ObjectNode:KN,OperatorNode:eD,ParenthesisNode:rD,RangeNode:sD,RelationalNode:tD,SymbolNode:hD,config:Q,numeric:Ex,typed:Wy}),vD=ch({ConstantNode:oD,FunctionNode:gD,OperatorNode:eD,ParenthesisNode:rD,parse:yD,typed:Wy}),xD=oh({bignumber:sv,fraction:xx,AccessorNode:pD,ArrayNode:nD,ConstantNode:oD,FunctionNode:gD,IndexNode:mD,ObjectNode:KN,OperatorNode:eD,SymbolNode:hD,config:Q,mathWithTransform:JN,matrix:wx,typed:Wy}),bD=Jp({parse:yD,typed:Wy}),wD=Am({parse:yD}),ND=Kd({parse:yD,typed:Wy}),DD=uh({AccessorNode:pD,ArrayNode:nD,ConstantNode:oD,FunctionNode:gD,IndexNode:mD,ObjectNode:KN,OperatorNode:eD,ParenthesisNode:rD,SymbolNode:hD,add:ob,divide:lN,equal:jx,isZero:Tv,multiply:Ab,parse:yD,pow:ww,subtract:Ob,typed:Wy}),ED=Qp({parse:yD,typed:Wy}),AD=Om({Help:wD,mathWithTransform:JN,typed:Wy}),CD=Kp({evaluate:ED}),SD=ah({bignumber:sv,fraction:xx,AccessorNode:pD,ArrayNode:nD,ConstantNode:oD,FunctionNode:gD,IndexNode:mD,ObjectNode:KN,OperatorNode:eD,ParenthesisNode:rD,SymbolNode:hD,add:ob,config:Q,divide:lN,equal:jx,isZero:Tv,mathWithTransform:JN,matrix:wx,multiply:Ab,parse:yD,pow:ww,resolve:vD,simplifyConstant:xD,simplifyCore:DD,subtract:Ob,typed:Wy}),MD=fh({OperatorNode:eD,parse:yD,simplify:SD,typed:Wy}),FD=mh({ConstantNode:oD,FunctionNode:gD,OperatorNode:eD,ParenthesisNode:rD,SymbolNode:hD,config:Q,equal:jx,isZero:Tv,numeric:Ex,parse:yD,simplify:SD,typed:Wy}),BD=rm({Parser:CD,typed:Wy}),TD=hh({bignumber:sv,fraction:xx,AccessorNode:pD,ArrayNode:nD,ConstantNode:oD,FunctionNode:gD,IndexNode:mD,ObjectNode:KN,OperatorNode:eD,ParenthesisNode:rD,SymbolNode:hD,add:ob,config:Q,divide:lN,equal:jx,isZero:Tv,mathWithTransform:JN,matrix:wx,multiply:Ab,parse:yD,pow:ww,simplify:SD,simplifyConstant:xD,simplifyCore:DD,subtract:Ob,typed:Wy});(0,n.Z)(YN,{e:Dy,false:Ey,fineStructure:Ay,i:Sy,Infinity:My,LN10:Fy,LOG10E:By,NaN:Oy,null:_y,phi:zy,SQRT1_2:ky,sackurTetrode:Ry,tau:Py,true:Uy,E:Dy,version:jy,efimovFactor:Hy,LN2:$y,pi:Zy,replacer:Gy,reviver:uD,SQRT2:Vy,typed:Wy,unaryPlus:Yy,PI:Zy,weakMixingAngle:Jy,abs:Xy,acos:Qy,acot:Ky,acsc:ev,addScalar:rv,arg:tv,asech:nv,asinh:iv,atan:av,atanh:ov,bignumber:sv,bitNot:uv,boolean:cv,clone:lv,combinations:fv,complex:pv,conj:mv,cosh:dv,coth:hv,csc:gv,cube:yv,equalScalar:vv,erf:xv,exp:bv,expm1:wv,filter:Nv,forEach:Dv,format:Ev,getMatrixDataType:Av,hex:Cv,im:Sv,isInteger:Mv,isNegative:Fv,isPositive:Bv,isZero:Tv,LOG2E:Ov,lgamma:_v,log10:zv,log2:qv,map:Iv,multiplyScalar:kv,not:Rv,number:Pv,oct:Uv,pickRandom:jv,print:Lv,random:Hv,re:$v,sec:Zv,sign:Gv,sin:Vv,splitUnit:Yv,square:Jv,string:Xv,tan:Qv,typeOf:Kv,acosh:ex,acsch:rx,apply:tx,asec:nx,bin:ix,chain:fD,combinationsWithRep:ax,cos:ox,csch:sx,isNaN:ux,isPrime:cx,randomInt:lx,sech:fx,sinh:px,sparse:mx,sqrt:dx,tanh:hx,unaryMinus:gx,acoth:yx,cot:vx,fraction:xx,isNumeric:bx,matrix:wx,matrixFromFunction:Nx,mode:Dx,numeric:Ex,prod:Ax,reshape:Cx,size:Sx,squeeze:Mx,subset:Fx,transpose:Bx,xgcd:Tx,zeros:Ox,asin:_x,cbrt:zx,concat:qx,count:Ix,ctranspose:kx,diag:Rx,divideScalar:Px,dotDivide:Ux,equal:jx,flatten:Lx,gcd:Hx,hasNumericValue:$x,identity:Zx,kron:Gx,largerEq:Vx,leftShift:Wx,matrixFromColumns:Yx,mod:Jx,nthRoot:Xx,ones:Qx,resize:Kx,rightArithShift:eb,round:rb,smaller:tb,to:nb,unequal:ib,xor:ab,add:ob,bitAnd:sb,bitXor:ub,catalan:cb,compare:lb,compareText:fb,cumsum:pb,deepEqual:mb,dot:db,equalText:hb,floor:gb,hypot:yb,invmod:bb,larger:wb,log:Nb,matrixFromRows:Db,min:Eb,multiply:Ab,nthRoots:Cb,or:Sb,partitionSelect:Mb,quantileSeq:Fb,rightLogShift:Bb,smallerEq:Tb,subtract:Ob,trace:_b,usolve:zb,zpk2tf:qb,and:Ib,bitOr:kb,ceil:Rb,compareNatural:Pb,composition:Ub,cross:jb,det:Lb,diff:Hb,distance:$b,dotMultiply:Zb,fix:Vb,index:Wb,intersect:Yb,lcm:Jb,log1p:Xb,lsolve:Qb,max:Kb,qr:ew,range:rw,row:tw,setCartesian:nw,setDistinct:iw,setIsSubset:aw,setPowerset:ow,slu:sw,sort:uw,sum:cw,usolveAll:lw,atan2:fw,column:pw,lsolveAll:mw,setDifference:dw,setMultiplicity:hw,setSymDifference:gw,inv:vw,lup:xw,pinv:bw,pow:ww,setIntersect:Nw,setUnion:Dw,sqrtm:Ew,vacuumImpedance:Cw,wienDisplacement:Sw,atomicMass:Mw,bohrMagneton:Fw,boltzmann:Bw,conductanceQuantum:Tw,createUnit:Ow,deuteronMass:_w,dotPow:zw,electricConstant:qw,elementaryCharge:Iw,expm:kw,faraday:Rw,fft:Pw,gamma:Uw,gravitationConstant:jw,hartreeEnergy:Lw,ifft:Hw,klitzing:$w,loschmidt:Zw,magneticConstant:Gw,molarMass:Vw,molarPlanckConstant:Ww,neutronMass:Yw,nuclearMagneton:Jw,planckCharge:Xw,planckLength:Qw,planckTemperature:Kw,protonMass:eN,reducedPlanckConstant:rN,rydberg:tN,secondRadiation:nN,speedOfLight:iN,stefanBoltzmann:aN,thomsonCrossSection:oN,avogadro:sN,bohrRadius:uN,coulomb:cN,divide:lN,electronMass:fN,factorial:pN,firstRadiation:mN,gravity:dN,inverseConductanceQuantum:hN,lusolve:gN,magneticFluxQuantum:yN,molarMassC12:vN,multinomial:xN,parse:yD,permutations:bN,planckMass:wN,polynomialRoot:NN,resolve:vD,setSize:DN,simplifyConstant:xD,solveODE:EN,stirlingS2:AN,unit:CN,bellNumbers:SN,compile:bD,eigs:MN,fermiCoupling:FN,gasConstant:BN,leafCount:ND,mean:TN,molarVolume:ON,planckConstant:_N,quantumOfCirculation:zN,simplifyCore:DD,variance:qN,classicalElectronRadius:IN,evaluate:ED,help:AD,median:kN,simplify:SD,symbolicEqual:MD,derivative:FD,kldivergence:RN,mad:PN,parser:BD,rationalize:TD,std:UN,freqz:jN,norm:LN,rotationMatrix:HN,planckTime:$N,schur:ZN,rotate:GN,sylvester:VN,lyap:WN,config:Q}),(0,n.Z)(JN,YN,{filter:jg({typed:Wy}),forEach:Hg({typed:Wy}),map:Zg({typed:Wy}),apply:Rg({isInteger:Mv,typed:Wy}),subset:ay({matrix:wx,typed:Wy}),concat:sy({isInteger:Mv,matrix:wx,typed:Wy}),max:Yg({config:Q,larger:wb,numeric:Ex,typed:Wy}),sum:dy({add:ob,config:Q,numeric:Ex,typed:Wy}),min:Kg({config:Q,numeric:Ex,smaller:tb,typed:Wy}),cumsum:yy({add:ob,typed:Wy,unaryPlus:Yy}),diff:ly({bignumber:sv,matrix:wx,number:Pv,subtract:Ob,typed:Wy}),index:$g({Index:xb}),range:ry({bignumber:sv,matrix:wx,add:ob,config:Q,isPositive:Bv,larger:wb,largerEq:Vx,smaller:tb,smallerEq:Tb,typed:Wy}),row:ny({Index:xb,matrix:wx,range:rw,typed:Wy}),column:Pg({Index:xb,matrix:wx,range:rw,typed:Wy}),mean:Xg({add:ob,divide:lN,typed:Wy}),variance:by({add:ob,apply:tx,divide:lN,isNaN:ux,multiply:Ab,subtract:Ob,typed:Wy}),std:py({map:Iv,sqrt:dx,typed:Wy,variance:qN})}),(0,n.Z)(XN,{BigNumber:wy,Complex:Ny,Fraction:Cy,Matrix:Ty,Node:QN,ObjectNode:KN,OperatorNode:eD,ParenthesisNode:rD,Range:qy,RelationalNode:tD,ResultSet:Iy,ArrayNode:nD,BlockNode:iD,ConditionalNode:aD,ConstantNode:oD,DenseMatrix:Ly,RangeNode:sD,Chain:cD,FunctionAssignmentNode:lD,SparseMatrix:Wv,AccessorNode:pD,IndexNode:mD,AssignmentNode:dD,ImmutableDenseMatrix:vb,Index:xb,FibonacciHeap:Gb,Spa:yw,Unit:Aw,SymbolNode:hD,FunctionNode:gD,Help:wD,Parser:CD}),cD.createProxy(YN);t(89757)}}]); +//# sourceMappingURL=220.bundle.d0b0df6e3678c751fa3c.js.map \ No newline at end of file diff --git a/resources/220.bundle.d0b0df6e3678c751fa3c.js.LICENSE.txt b/resources/220.bundle.d0b0df6e3678c751fa3c.js.LICENSE.txt new file mode 100644 index 0000000..4741ec3 --- /dev/null +++ b/resources/220.bundle.d0b0df6e3678c751fa3c.js.LICENSE.txt @@ -0,0 +1,14 @@ +/** + * @license Complex.js v2.1.1 12/05/2020 + * + * Copyright (c) 2020, Robert Eisele (robert@xarg.org) + * Dual licensed under the MIT or GPL Version 2 licenses. + **/ + +/** + * @license Fraction.js v4.2.0 05/03/2022 + * https://www.xarg.org/2014/03/rational-numbers-in-javascript/ + * + * Copyright (c) 2021, Robert Eisele (robert@xarg.org) + * Dual licensed under the MIT or GPL Version 2 licenses. + **/ diff --git a/resources/220.bundle.d0b0df6e3678c751fa3c.js.map b/resources/220.bundle.d0b0df6e3678c751fa3c.js.map new file mode 100644 index 0000000..2f083df --- /dev/null +++ b/resources/220.bundle.d0b0df6e3678c751fa3c.js.map @@ -0,0 +1 @@ +{"version":3,"file":"220.bundle.d0b0df6e3678c751fa3c.js","mappings":"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AC1F,IAAI,UACFmiB,EAAS,QACT5mB,EAAO,YACPmtB,EAAW,SACXtnB,GACEpB,EAIAiM,EAAQuc,KAwUZ,OAnUAvc,EAAMoB,QACNpB,EAAMS,SAAS,CAAC,CACd1H,KAAM,SACNsF,KAAM,GACL,CACDtF,KAAM,UACNsF,KAAM,GACL,CACDtF,KAAM,YACNsF,KAAM,GACL,CACDtF,KAAM,WACNsF,KAAM,GACL,CACDtF,KAAM,OACNsF,KAAM,GAMR,CACEtF,KAAM,aACNsF,KAAMpJ,GAAK,GAAY,upfAAupfoJ,KAAKpJ,IAClrf,CACD8D,KAAM,SACNsF,KAAM,GACL,CACDtF,KAAM,QACNsF,KAAM,GACL,CACDtF,KAAM,QACNsF,KAAM,GACL,CACDtF,KAAM,SACNsF,KAAM,GACL,CACDtF,KAAM,cACNsF,KAAM,GACL,CACDtF,KAAM,eACNsF,KAAM,GACL,CACDtF,KAAM,QACNsF,KAAM,GACL,CACDtF,KAAM,QACNsF,KAAM,GACL,CACDtF,KAAM,UACNsF,KAAM,GACL,CACDtF,KAAM,YACNsF,KAAM,GACL,CACDtF,KAAM,OACNsF,KAAM,GACL,CACDtF,KAAM,WACNsF,KAAM,GACL,CACDtF,KAAM,OACNsF,KAAM,GACL,CACDtF,KAAM,SACNsF,KAAM,GACL,CACDtF,KAAM,OACNsF,KAAM,GACL,CACDtF,KAAM,YACNsF,KAAM,GACL,CACDtF,KAAM,eACNsF,KAAM,GACL,CACDtF,KAAM,YACNsF,KAAM,GACL,CACDtF,KAAM,iBACNsF,KAAM,GACL,CACDtF,KAAM,YACNsF,KAAM,GACL,CACDtF,KAAM,kBACNsF,KAAM,GACL,CACDtF,KAAM,eACNsF,KAAM,GACL,CACDtF,KAAM,eACNsF,KAAM,GACL,CACDtF,KAAM,yBACNsF,KAAM,GACL,CACDtF,KAAM,YACNsF,KAAM,GACL,CACDtF,KAAM,OACNsF,KAAM,GACL,CACDtF,KAAM,aACNsF,KAAM,GACL,CACDtF,KAAM,eACNsF,KAAM,GACL,CACDtF,KAAM,kBACNsF,KAAM,GACL,CACDtF,KAAM,YACNsF,KAAM,GAC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CpElkB,QAAO,GACPte,UACAkZ,QACAjT,WAES,GAAqBqkC,GAAU,CACxC5nB,eACAvb,UACAs2B,eACAz9B,UACAiG,WAESswE,GAAyBzpC,GAAc,CAChD3wB,aACAhV,UACAs2B,eACAz9B,UACAiG,WAES+sF,GAAsBt+C,GAAW,CAC1Cv4B,aACA1Y,OAAM,EACNzD,UACAiG,WAESqsB,GAAwBujB,GAAa,CAC9CpyC,OAAM,EACNzD,YAES61E,GAAiC1xB,GAAsB,CAChEzhC,eACAvb,UACAs2B,eACAz9B,UACAiG,SACAuU,MAAK,KAEI,GAAuBkmC,GAAY,CAC5CvkC,aACAuG,eACA+a,eACAz9B,UACAiG,SACAuU,MAAK,KAEI2zB,GAAyBwX,GAAc,CAChDjjC,eACAvb,UACA1D,OAAM,EACNzD,UACAiG,WAES4Q,GAAoBmoC,GAAS,CACtC73C,UACAnH,UACAiG,WAES8vE,GAAyB1vB,GAAc,CAChD3jC,eACAvb,UACA1D,OAAM,EACNg6B,eACAz9B,UACAiG,WAESkwE,GAAqBnlC,GAAU,CACxCtuB,eACAvb,UACAnH,UACAiG,WAES,GAAqBgjE,GAAU,CACxCvmD,eACAgb,gBACAkN,aACAzjC,UACAs2B,eACAz9B,UACAiG,WAES+vE,GAAwB/lC,GAAa,CAC9C9oC,UACAs2B,eACAz9B,UACAiG,WAES,GAAwBsqC,GAAa,CAC9C7tB,eACAvb,UACAnH,UACAiG,WAES0wE,GAAyBy1B,GAAc,CAChDxhE,aACAusC,gBACAp+B,gBACAtgC,UAAS,GACT8R,cACAsgB,kBACA5kC,WAESonB,GAAyBk3B,GAAc,CAChDpoC,aACAuG,eACAtnB,YACA+L,UACA1D,OAAM,EACNg6B,eACAz9B,UACAiG,WAES,GAA6Bs/C,GAAkB,CACxDp+C,UACAnH,UACAiG,WAESuuF,GAAwBkR,GAAa,CAC9C56F,IAAG,GACH7E,SACAwvE,eAESoe,GAA2B1tC,GAAgB,CACpDjY,SACAjoC,WAESwU,GAAqBqwD,GAAU,CACxClgC,aACA+N,QACA9N,kBACA3xB,QACAjT,WAES6tF,GAA2BpuC,GAAgB,CACpDtoC,YAAW,GACXhB,UACAnW,WAES,GAAuB0/B,GAAY,CAC5CjjB,eACAjf,OAAM,EACNg6B,eACAz9B,UACArH,MAAK,GACLsN,SACAuU,MAAK,KAEI,GAAuB0uD,GAAY,CAC5Cv0E,IAAG,GACHi2C,aACAmO,gBACAvuB,cACAqgB,kBACAsD,WACAh3C,KAAI,GACJ8O,WAES0hD,GAAsCD,GAAgC,CAC/EhlC,eACAyrB,aAESqD,GAAuBqW,GAAiB,CACjDF,0BAESvZ,GAAwBJ,GAAa,CAC9C7xB,aACArR,IAAG,GACHrH,OAAM,EACNyqC,SACAz1B,UAAS,GACT4S,IAAG,GACH8iB,WACAloC,SACAgoC,UAESmH,GAAwB2Q,GAAa,CAC9CrjC,eACAvb,UACA1D,OAAM,EACNzD,UACAiG,WAES,GAAqB26C,GAAU,CACxCrrD,WACAkO,OAAM,EACNs1C,gBACA9yC,WAES6sF,GAAgC3wD,GAAqB,CAC9D7jB,QAAO,GACPte,UACAkZ,QACAjT,WAES,GAAqBshD,GAAU,CACxC9jD,OAAM,EACN66C,WACAnQ,WACAloC,WAESykC,GAA0BC,GAAe,CAClDC,aACAnwB,OACAgjB,eACAz9B,UACA6qC,kBACA5kC,WAESuwE,GAA0Bv1B,GAAe,CAClD1rD,WACAkO,OAAM,EACNs1C,gBACA9yC,WAESmwE,GAAoBrlC,GAAS,CACtCruB,eACAvb,UACAs2B,eACAz9B,UACAiG,WAESgtF,GAAiC1sC,GAAsB,CAChEl5B,WACA/2B,MAAK,GACLqmC,aACA12B,WAES2uF,GAA6BoS,GAAkB,CACxDl8F,IAAG,GACHuiB,WACAqd,YACAuoD,mBACAhtF,WAES6vE,GAA+B1xB,GAAoB,CAC5D1hC,eACAvb,UACAs2B,eACAz9B,UACAiG,SACAuU,MAAK,KAEI26B,GAA2B0Q,GAAgB,CACpDnjC,eACAvb,UACA1D,OAAM,EACNzD,UACAiG,WAESunB,GAA0BsgB,GAAe,CAClDprB,eACAkoB,aACAzjC,UACAs2B,eACAz9B,UACAiG,SACAm9B,gBAES8zC,GAAuBvL,GAAY,CAC5C7gE,IAAG,GACH9K,UACAiG,WAESylF,GAAwBhpC,GAAa,CAC9ChgC,eACAq2B,gBACAtb,eACAz9B,UACA6qC,kBACArd,YACAvnB,WAESquF,GAAwBimB,GAAa,CAC9ChlH,WACAuV,IAAG,GACH4/B,YACAzqC,UACAgG,WAESiwE,GAAqB7xB,GAAU,CACxCl9C,UACAs2B,eACAz9B,UACAskD,OACAr+C,SACAuU,MAAK,KAEIy7D,GAAuB9lC,GAAY,CAC5CztB,eACAvb,UACAs2B,eACAz9B,UACAiG,WAES,GAAsB4+B,GAAW,CAC1CniB,eACAjf,OAAM,EACNg6B,eACAz9B,UACArH,MAAK,GACLsN,SACAuU,MAAK,KAEI2qC,GAAgCV,GAAqB,CAC9Dp3B,WACApnB,WAESosF,GAA6Bga,GAAkB,CACxDzhE,aACAusC,gBACA1+D,UAAS,GACT8R,cACAC,cACA4qB,UACAnvC,WAES4wE,GAAuBjlC,GAAY,CAC5C5xC,UACA0qC,YACAld,YACAvnB,WAES6wE,GAAqB0e,GAAU,CACxCz8C,gBACA38B,UACApc,UACA0qC,YACAld,YACAvnB,SACAm9B,gBAEShoB,GAAsB04B,GAAW,CAC1C9zC,UACAC,UACAutB,YACAvnB,WAESusF,GAA0BsN,GAAe,CAClDnrG,IAAG,GACHi2C,aACAipD,aACA96C,gBACAlO,kBACA1zC,KAAI,GACJq2B,YACAvnB,WAES0vE,GAA6BpnC,GAAkB,CACxDpnC,UACAs2B,eACAz9B,UACA6qC,kBACA5kC,WAESuiD,GAA+BF,GAAyB,CACjElT,UACAjH,aAESuc,GAAqBnlB,GAAU,CACxChwC,WACAmtB,eACAjqB,KAAI,GACJglC,eACA/kC,MAAK,GACLsH,UACAiG,SACAuU,MAAK,KAEI1f,GAAuB+wE,GAAY,CAC5Cr6B,SACAvrC,WAESwsF,GAA2ByP,GAAgB,CACpDvtG,IAAG,GACHmW,IAAG,GACH8/B,aACAnnC,OAAM,EACNs1C,gBACAtb,eACAnf,QAAO,GACPqe,aACAvgB,UACApc,UACA0qC,YACAG,kBACAsD,WACA3gB,YACAvnB,WAES2jC,GAAqBL,GAAU,CACxCpiC,UACAs2B,eACAz9B,UACAiG,WAES,GAAuB66C,GAAY,CAC5CvrD,WACAkO,OAAM,EACNs1C,gBACA1jD,IAAG,GACH4Q,WAES0lF,GAAwB7pC,GAAa,CAC9Cp/B,eACAq2B,gBACAtb,eACAz9B,UACA6qC,kBACArd,YACAvnB,WAES,GAAqBmhD,GAAU,CACxC3jD,OAAM,EACN2xC,UACAkJ,WACAr4C,WAESqjF,GAAoBhE,GAAS,CACtC16C,aACA2C,QAAO,GACPoL,QACAI,gBACA7K,SACA+R,YACA7jC,UACApc,UACA6qC,kBACAnyB,KAAI,GACJvhB,KAAI,GACJq2B,YACAvnB,SACAm9B,cACA5oB,MAAK,KAEIyZ,GAAuBghB,GAAY,CAC5CC,aACAl1C,UACA8K,IAAG,GACHrH,OAAM,EACN+mB,cACA4qB,UACAC,YACAlH,WACAgH,aACAlvC,WAESqvB,GAAqB+hB,GAAU,CACxC7F,SACAxxC,UACAi0B,SACAhuB,WAES8tF,GAA8BpsB,GAAmB,CAC1DjlD,eACA8uB,SACA2T,kBACAjsC,QACAkZ,UACAnsB,WAES+tF,GAA6B9rB,GAAkB,CACxDxlD,eACA8uB,SACA2T,kBACAjsC,QACAkZ,UACAnsB,WAESguF,GAA6B7rB,GAAkB,CACxD52B,SACA2T,kBACAjsC,QACAkZ,UACAnsB,WAESkuF,GAA6B7rB,GAAkB,CACxD92B,SACA2T,kBACAjsC,QACAkZ,UACAnsB,WAESwlF,GAAqBP,GAAU,CACxCxtD,gBACA/oC,IAAG,GACHmW,IAAG,GACHiuC,gBACA3D,UACAC,YACA3K,YACAld,YACAkrB,aACAzyC,WAESuE,GAAsBq8C,GAAW,CAC1Cx5B,WACA83B,kBACAnlD,UACAiG,WAES,GAAqBu/F,GAAU,CACxC16F,IAAG,GACHrH,OAAM,EACN66C,WACAr4C,WAESmsF,GAA2B1uC,GAAgB,CACpDhhC,eACAq2B,gBACAtb,eACAz9B,UACA6qC,kBACArd,YACAvnB,WAES,GAAuBqgE,GAAY,CAC5CnqD,aACAuG,eACAvb,UACAs2B,eACAz9B,UACAiG,WAESyrC,GAAwBH,GAAa,CAC9CC,SACAxxC,UACAi0B,SACAhuB,WAES2rF,GAA2B9uC,GAAgB,CACpDpgC,eACAq2B,gBACAtb,eACAz9B,UACA6qC,kBACArd,YACAvnB,WAES4iE,GAA+Bb,GAAoB,CAC5DtlD,eACA8uB,SACA2T,kBACAjsC,QACAkZ,UACAnsB,WAESiuF,GAAiC7rB,GAAsB,CAChE72B,SACA2T,kBACAjsC,QACAkZ,UACAnsB,WAES+iE,GAAkCJ,GAAuB,CAClEp3B,SACArqC,UACA0hE,iBACA3vD,QACAkZ,UACAnsB,WAES2jD,GAAqBD,GAAe,CAC7CnB,iBACA5d,aACAnN,iBAES9E,GAAqBo9D,GAAU,CACxCphG,IAAG,GACHi2C,aACAksC,OACA/9B,gBACAkH,YACAjgD,UACA0qC,YACAzkC,SACAm9B,gBAESooD,GAAqBxH,GAAU,CACxCthE,eACAknC,OACAlsB,gBACA/oC,IAAG,GACHi2C,aACAmO,gBACAtb,eACA2X,UACAp1C,UACA6qC,kBACArd,YACAvnB,SACAm9B,gBAES4zC,GAAsBuf,GAAW,CAC1ChhG,WACAuV,IAAG,GACHw+D,cACAuqB,aACA96C,gBACAt+B,OACAu+B,aACA9K,SACAvV,OACA34B,UACA0qC,YACAzkC,WAES,GAAqB+5C,GAAU,CACxCzqD,WACAkO,OAAM,EACNkZ,SAAQ,GACRsjC,YACAtnB,OACA34B,UACA0qC,YACAzqC,UACAgG,WAES8iE,GAA8BZ,GAAmB,CAC1DzlD,eACA8uB,SACA2T,kBACAjsC,QACAkZ,UACAnsB,WAESouF,GAA0BvrB,GAAe,CAClDt3B,SACArqC,UACA4hE,gBACAC,oBACA9vD,QACAkZ,UACAnsB,WAESgxE,GAAuBmnB,GAAY,CAC5CzpG,IAAG,GACHmW,IAAG,GACHm1C,YACAtnB,OACA51B,IAAG,GACHjE,IAAG,GACH4rC,YACAxxB,QACA/hB,KAAI,GACJq2B,YACAvnB,WAESs2B,GAAsBkuB,GAAgB,CAC/CtuC,aACA5mB,WACA6F,YACAzG,IAAG,GACHi2C,aACAnnC,OAAM,EACNs1C,gBACA7K,SACAwc,OACArxC,OAAM,GACNsjB,aACAkO,kBACA5qC,UACArJ,IAAG,GACH+B,MAAK,GACL60B,cAESwhE,GAAiCyuB,GAAsB,CAChEthG,aACAogB,QACA94B,OAAM,IAEGytF,GAAkC2uB,GAAuB,CAClE1jG,aACAogB,QACA94B,OAAM,IAEG6sF,GAA4B2uB,GAAiB,CACtD9iG,aACAogB,QACA94B,OAAM,IAEGyrF,GAA8B0uB,GAAmB,CAC1DzhG,aACAogB,QACA94B,OAAM,IAEG+sF,GAA2B2uB,GAAgB,CACpDhjG,aACAogB,QACA94B,OAAM,IAEG0rF,GAAoC0uB,GAAyB,CACtE1hG,aACAogB,QACA94B,OAAM,IAEGmgE,GAA4BuB,GAAiB,CACtD5oC,QACAt2B,WAES8pF,GAA8B2uB,GAAmB,CAC1DviG,aACAogB,QACA94B,OAAM,IAEG+xE,GAAwBj0B,GAAa,CAC9C7+B,eACAvb,UACAs2B,eACAz9B,UACApJ,IAAG,GACHqP,WAES8oF,GAAkCyuB,GAAuB,CAClErhG,aACAogB,QACA94B,OAAM,IAEGwrF,GAAkC0uB,GAAuB,CAClExhG,aACAogB,QACA94B,OAAM,IAEGszE,GAAsBumB,GAAW,CAC1C3oG,IAAG,GACHmW,IAAG,GACHm1C,YACAtnB,OACA+R,YACAzkC,WAESwqF,GAAyB2uB,GAAc,CAChDjjG,aACAogB,QACA94B,OAAM,IAEGs2C,GAAqBjB,GAAU,CACxClO,aACAnyC,KAAI,GACJkgD,QACAI,gBACAC,aACApkD,IAAG,GACHwB,KACAuiB,KAAI,GACJ3Y,UACA6qC,kBACAj0C,IAAG,GACHqjC,IAAG,GACHh0B,WAESusE,GAAuBg2B,GAAY,CAC5CrsF,aACA5mB,WACAkO,OAAM,EACNonC,kBACAj0C,IAAG,GACHqP,WAES0oF,GAAqCyuB,GAA0B,CACxEjhG,aACAogB,QACA94B,OAAM,IAEGosF,GAA+B2uB,GAAoB,CAC5DriG,aACAogB,QACA94B,OAAM,IAEG0vF,GAAsBr5C,GAAW,CAC1CnB,QACAK,aACAe,OACA9zC,WAESspF,GAA0B0uB,GAAe,CAClD9hG,aACAogB,QACA94B,OAAM,IAEGktF,GAA2B2uB,GAAgB,CACpDnjG,aACAogB,QACA94B,OAAM,IAEGqrF,GAAkCyuB,GAAuB,CAClEphG,aACAogB,QACA94B,OAAM,IAEG0tF,GAA2B2uB,GAAgB,CACpD3jG,aACAogB,QACA94B,OAAM,IAEGotF,GAAqC2uB,GAA0B,CACxErjG,aACAogB,QACA94B,OAAM,IAEGusF,GAA6B2uB,GAAkB,CACxDxiG,aACAogB,QACA94B,OAAM,IAEG6rF,GAAiC0uB,GAAsB,CAChE7hG,aACAogB,QACA94B,OAAM,IAEGguF,GAA8B2uB,GAAmB,CAC1DjkG,aACAogB,QACA94B,OAAM,IAEG6tF,GAA8B2uB,GAAmB,CAC1D9jG,aACAogB,QACA94B,OAAM,IAEGiuF,GAAmC2uB,GAAwB,CACpElkG,aACAogB,QACA94B,OAAM,IAEGqsF,GAA4B2uB,GAAiB,CACtDtiG,aACAogB,QACA94B,OAAM,IAEGorF,GAAuCyuB,GAA4B,CAC5EnhG,aACAogB,QACA94B,OAAM,IAEGysF,GAAyB2uB,GAAc,CAChD1iG,aACAogB,QACA94B,OAAM,IAEGutF,GAAiC2uB,GAAsB,CAChExjG,aACAogB,QACA94B,OAAM,IAEGirF,GAA8BwuB,GAAmB,CAC1D/gG,aACAogB,QACA94B,OAAM,IAEGwtF,GAAiC2uB,GAAsB,CAChEzjG,aACAogB,QACA94B,OAAM,IAEG0sF,GAAqC2uB,GAA0B,CACxE3iG,aACAogB,QACA94B,OAAM,IAEG8sF,GAA0B2uB,GAAe,CAClD/iG,aACAogB,QACA94B,OAAM,IAEG+rF,GAA4B0uB,GAAiB,CACtD/hG,aACAogB,QACA94B,OAAM,IAEGo5D,GAAyB6gD,GAAc,CAChDvhG,aACAogB,QACA94B,OAAM,IAEG,GAAwBo8F,GAAa,CAC9C9mD,gBACAtb,eACA9E,OACA34B,UACA0qC,YACAzkC,WAESypF,GAA8B0uB,GAAmB,CAC1DjiG,aACAogB,QACA94B,OAAM,IAEG8xE,GAA2Bs0B,GAAgB,CACpDr3B,SACAvsE,WAESyqF,GAAgC2uB,GAAqB,CAC9DljG,aACAogB,QACA94B,OAAM,IAEG4tF,GAAyB2uB,GAAc,CAChD7jG,aACAogB,QACA94B,OAAM,IAEG2rF,GAA2C0uB,GAAgC,CACpF3hG,aACAogB,QACA94B,OAAM,IAEGouF,GAAyBtG,GAAc,CAChD7oE,eACAipE,UACAH,OACAxrF,UACAyrF,OACAxlF,SACAylF,YAES2D,GAAqC0uB,GAA0B,CACxE5hG,aACAogB,QACA94B,OAAM,IAEG2tF,GAA8B2uB,GAAmB,CAC1D5jG,aACAogB,QACA94B,OAAM,IAEGgwF,GAA6B2W,GAAkB,CACxDt/F,IAAG,GACHod,OAAM,GACNqtD,aACA98D,UAAS,GACT+R,cACAkgB,YACAzkC,WAESytF,GAA8B4W,GAAmB,CAC1D/0B,aACAtvE,WAESsrF,GAA4B2uB,GAAiB,CACtD/jG,aACAogB,QACA94B,OAAM,IAEGsuF,GAAgCjG,GAAqB,CAC9DhhF,IAAG,GACHgO,KAAI,GACJoP,OAAM,GACNuV,eACAxmC,MACAmlB,UACAsuB,YACA1zC,MACAG,KAAI,GACJq2B,YACA5qB,OAAM,GACNqD,SACAm9B,gBAESgxD,GAAyB1rB,GAAc,CAChDvjB,kBACAl/C,WAESstF,GAA0B/4C,GAAe,CAClD7lD,IAAG,GACHmW,IAAG,GACHoqC,aACAhtB,OAAM,GACNqC,cACAC,cACA4qB,UACAryC,IAAG,GACH/C,UACAlB,IAAG,GACH4rC,YACAyD,WACA3gB,YACAvnB,SACAm9B,gBAESwzC,GAA4Bi1B,GAAiB,CACtD32D,aACAtK,aACAusC,gBACAp+B,gBACAw8B,aACA98D,UAAS,GACT8R,cACA6qB,UACAvK,kBACA5qC,UACArJ,IAAG,GACH42B,YACAvnB,WAESo7B,GAAsB4jC,GAAmB,CAClD1oC,QACAt2B,WAESywE,GAA6By1B,GAAkB,CACxDvhE,aACAnyB,UAAS,GACT8R,cACAqsD,cACA3wE,WAESsjE,GAAsBizB,GAAW,CAC1C7nG,IAAG,GACHmW,IAAG,GACH8/B,aACA/yC,KAAI,GACJq9C,aACAxD,UACAnE,QAAO,GACP9pC,OAAM,EACN5N,IAAG,GACH68F,QACA35C,gBACAt+B,OACAyzB,SACA5vB,QAAO,GACPrnB,MACA0hC,OACAyc,UACAp1C,UACA+yF,qBACAroD,YACAG,kBACA5qC,UACAqpF,MACAtyF,MACAlB,IAAG,GACHq4C,WACAh3C,KAAI,GACJq2B,YACAvnB,SACAylF,UACA0G,eAESzC,GAA+B0uB,GAAoB,CAC5DliG,aACAogB,QACA94B,OAAM,IAEGmtF,GAA6B2uB,GAAkB,CACxDpjG,aACAogB,QACA94B,OAAM,IAEGixF,GAAsBuR,GAAW,CAC1Cn7F,IAAG,GACHod,OAAM,GACNjiB,WAES6qF,GAA6B2uB,GAAkB,CACxDtjG,aACAogB,QACA94B,OAAM,IAEGmrF,GAAgCyuB,GAAqB,CAC9DlhG,aACAogB,QACA94B,OAAM,IAEGwsF,GAAsC2uB,GAA2B,CAC1EziG,aACAogB,QACA94B,OAAM,IAEG8zE,GAA0BqvB,GAAe,CAClD97F,IAAG,GACHtL,SACA0oB,OAAM,GACN5xB,MAAK,GACLo0C,YACAld,YACAvnB,WAESwpF,GAAyC0uB,GAA8B,CAChFhiG,aACAogB,QACA94B,OAAM,IAEGkxF,GAAwBwR,GAAa,CAC9Cr7F,IAAG,GACHuiB,WACAnF,OAAM,GACN+qE,mBACAhtF,WAESutF,GAA8BsW,GAAmB,CAC1D5hF,OAAM,GACN8wB,aACArc,aACAtnC,IAAG,GACH0N,IAAG,GACH/C,UACA0qC,YACA1b,IAAG,GACH/oB,WAESwuF,GAAqB+R,GAAU,CACxC7xG,IAAG,GACHoO,IAAG,GACH4xF,UACAnnE,YACAvnB,WAES4uF,GAAqBqT,GAAU,CACxCnlG,IAAG,GACH5L,KAAI,GACJ8O,SACAsxE,cAESgd,GAAuBomB,GAAY,CAC5CplH,WACAuV,IAAG,GACHod,OAAM,GACNloB,UACA0qC,YACAzkC,WAESswC,GAAsB8yB,GAAW,CAC1C10E,IAAG,GACHmW,IAAG,GACH6tC,QACA2wB,cACAC,QACA9rC,eACA2X,UACAp1C,UACA0qC,YACA9zC,IAAG,GACHu3C,WACAh3C,KAAI,GACJ8O,WAESgwC,GAA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","sources":["webpack:///../../../node_modules/complex.js/complex.js","webpack:///../../../node_modules/escape-latex/dist/index.js","webpack:///../../../node_modules/fraction.js/fraction.js","webpack:///../../../node_modules/javascript-natural-sort/naturalSort.js","webpack:///../../../node_modules/tiny-emitter/index.js","webpack:///../../../node_modules/mathjs/lib/esm/core/config.js","webpack:///../../../node_modules/mathjs/lib/esm/utils/is.js","webpack:///../../../node_modules/mathjs/lib/esm/utils/object.js","webpack:///../../../node_modules/mathjs/lib/esm/core/function/config.js","webpack:///../../../node_modules/mathjs/lib/esm/entry/configReadonly.js","webpack:///../../../node_modules/typed-function/lib/esm/typed-function.mjs","webpack:///../../../node_modules/mathjs/lib/esm/utils/number.js","webpack:///../../../node_modules/mathjs/lib/esm/utils/bignumber/formatter.js","webpack:///../../../node_modules/mathjs/lib/esm/utils/string.js","webpack:///../../../node_modules/mathjs/lib/esm/error/DimensionError.js","webpack:///../../../node_modules/mathjs/lib/esm/error/IndexError.js","webpack:///../../../node_modules/mathjs/lib/esm/utils/array.js","webpack:///../../../node_modules/mathjs/lib/esm/utils/factory.js","webpack:///../../../node_modules/mathjs/lib/esm/utils/customs.js","webpack:///../../../node_modules/mathjs/lib/esm/utils/map.js","webpack:///../../../node_modules/mathjs/lib/esm/core/function/typed.js","webpack:///../../../node_modules/mathjs/lib/esm/type/resultset/ResultSet.js","webpack:///../../../node_modules/decimal.js/decimal.mjs","webpack:///../../../node_modules/mathjs/lib/esm/type/bignumber/BigNumber.js","webpack:///../../../node_modules/mathjs/lib/esm/type/complex/Complex.js","webpack:///../../../node_modules/mathjs/lib/esm/type/fraction/Fraction.js","webpack:///../../../node_modules/mathjs/lib/esm/type/matrix/Range.js","webpack:///../../../node_modules/mathjs/lib/esm/type/matrix/Matrix.js","webpack:///../../../node_modules/mathjs/lib/esm/utils/lruQueue.js","webpack:///../../../node_modules/mathjs/lib/esm/utils/function.js","webpack:///../../../node_modules/mathjs/lib/esm/type/matrix/DenseMatrix.js","webpack:///../../../node_modules/mathjs/lib/esm/function/utils/clone.js","webpack:///../../../node_modules/mathjs/lib/esm/utils/switch.js","webpack:///../../../node_modules/mathjs/lib/esm/utils/collection.js","webpack:///../../../node_modules/mathjs/lib/esm/function/utils/isInteger.js","webpack:///../../../node_modules/mathjs/lib/esm/plain/number/arithmetic.js","webpack:///../../../node_modules/mathjs/lib/esm/plain/number/bitwise.js","webpack:///../../../node_modules/mathjs/lib/esm/utils/product.js","webpack:///../../../node_modules/mathjs/lib/esm/plain/number/combinations.js","webpack:///../../../node_modules/mathjs/lib/esm/plain/number/constants.js","webpack:///../../../node_modules/mathjs/lib/esm/plain/number/logical.js","webpack:///../../../node_modules/mathjs/lib/esm/plain/number/probability.js","webpack:///../../../node_modules/mathjs/lib/esm/plain/number/trigonometry.js","webpack:///../../../node_modules/mathjs/lib/esm/plain/number/utils.js","webpack:///../../../node_modules/mathjs/lib/esm/function/utils/isNegative.js","webpack:///../../../node_modules/mathjs/lib/esm/function/utils/isNumeric.js","webpack:///../../../node_modules/mathjs/lib/esm/function/utils/hasNumericValue.js","webpack:///../../../node_modules/mathjs/lib/esm/function/utils/isPositive.js","webpack:///../../../node_modules/mathjs/lib/esm/function/utils/isZero.js","webpack:///../../../node_modules/mathjs/lib/esm/function/utils/isNaN.js","webpack:///../../../node_modules/mathjs/lib/esm/function/utils/typeOf.js","webpack:///../../../node_modules/mathjs/lib/esm/utils/bignumber/nearlyEqual.js","webpack:///../../../node_modules/mathjs/lib/esm/function/relational/compareUnits.js","webpack:///../../../node_modules/mathjs/lib/esm/function/relational/equalScalar.js","webpack:///../../../node_modules/mathjs/lib/esm/utils/complex.js","webpack:///../../../node_modules/mathjs/lib/esm/type/matrix/SparseMatrix.js","webpack:///../../../node_modules/mathjs/lib/esm/type/number.js","webpack:///../../../node_modules/mathjs/lib/esm/type/string.js","webpack:///../../../node_modules/mathjs/lib/esm/type/boolean.js","webpack:///../../../node_modules/mathjs/lib/esm/type/bignumber/function/bignumber.js","webpack:///../../../node_modules/mathjs/lib/esm/type/complex/function/complex.js","webpack:///../../../node_modules/mathjs/lib/esm/type/fraction/function/fraction.js","webpack:///../../../node_modules/mathjs/lib/esm/type/matrix/function/matrix.js","webpack:///../../../node_modules/mathjs/lib/esm/function/matrix/matrixFromFunction.js","webpack:///../../../node_modules/mathjs/lib/esm/function/matrix/matrixFromRows.js","webpack:///../../../node_modules/mathjs/lib/esm/function/matrix/matrixFromColumns.js","webpack:///../../../node_modules/mathjs/lib/esm/type/unit/function/splitUnit.js","webpack:///../../../node_modules/mathjs/lib/esm/function/arithmetic/unaryMinus.js","webpack:///../../../node_modules/mathjs/lib/esm/function/arithmetic/unaryPlus.js","webpack:///../../../node_modules/mathjs/lib/esm/function/arithmetic/abs.js","webpack:///../../../node_modules/mathjs/lib/esm/function/matrix/apply.js","webpack:///../../../node_modules/mathjs/lib/esm/function/arithmetic/addScalar.js","webpack:///../../../node_modules/mathjs/lib/esm/function/arithmetic/cbrt.js","webpack:///../../../node_modules/mathjs/lib/esm/type/matrix/utils/matAlgo11xS0s.js","webpack:///../../../node_modules/mathjs/lib/esm/type/matrix/utils/matAlgo12xSfs.js","webpack:///../../../node_modules/mathjs/lib/esm/type/matrix/utils/matAlgo14xDs.js","webpack:///../../../node_modules/mathjs/lib/esm/function/arithmetic/ceil.js","webpack:///../../../node_modules/mathjs/lib/esm/function/arithmetic/cube.js","webpack:///../../../node_modules/mathjs/lib/esm/function/arithmetic/exp.js","webpack:///../../../node_modules/mathjs/lib/esm/function/arithmetic/expm1.js","webpack:///../../../node_modules/mathjs/lib/esm/function/arithmetic/fix.js","webpack:///../../../node_modules/mathjs/lib/esm/function/arithmetic/floor.js","webpack:///../../../node_modules/mathjs/lib/esm/type/matrix/utils/matAlgo01xDSid.js","webpack:///../../../node_modules/mathjs/lib/esm/type/matrix/utils/matAlgo04xSidSid.js","webpack:///../../../node_modules/mathjs/lib/esm/type/matrix/utils/matAlgo10xSids.js","webpack:///../../../node_modules/mathjs/lib/esm/type/matrix/utils/matAlgo13xDD.js","webpack:///../../../node_modules/mathjs/lib/esm/type/matrix/utils/broadcast.js","webpack:///../../../node_modules/mathjs/lib/esm/type/matrix/utils/matrixAlgorithmSuite.js","webpack:///../../../node_modules/mathjs/lib/esm/error/ArgumentsError.js","webpack:///../../../node_modules/mathjs/lib/esm/function/arithmetic/gcd.js","webpack:///../../../node_modules/mathjs/lib/esm/type/matrix/utils/matAlgo02xDS0.js","webpack:///../../../node_modules/mathjs/lib/esm/type/matrix/utils/matAlgo06xS0S0.js","webpack:///../../../node_modules/mathjs/lib/esm/function/arithmetic/lcm.js","webpack:///../../../node_modules/mathjs/lib/esm/function/arithmetic/log10.js","webpack:///../../../node_modules/mathjs/lib/esm/function/arithmetic/log2.js","webpack:///../../../node_modules/mathjs/lib/esm/type/matrix/utils/matAlgo03xDSf.js","webpack:///../../../node_modules/mathjs/lib/esm/type/matrix/utils/matAlgo05xSfSf.js","webpack:///../../../node_modules/mathjs/lib/esm/function/arithmetic/mod.js","webpack:///../../../node_modules/mathjs/lib/esm/function/arithmetic/multiplyScalar.js","webpack:///../../../node_modules/mathjs/lib/esm/function/arithmetic/multiply.js","webpack:///../../../node_modules/mathjs/lib/esm/function/arithmetic/nthRoot.js","webpack:///../../../node_modules/mathjs/lib/esm/function/arithmetic/sign.js","webpack:///../../../node_modules/mathjs/lib/esm/function/arithmetic/sqrt.js","webpack:///../../../node_modules/mathjs/lib/esm/function/arithmetic/square.js","webpack:///../../../node_modules/mathjs/lib/esm/function/arithmetic/subtract.js","webpack:///../../../node_modules/mathjs/lib/esm/function/arithmetic/xgcd.js","webpack:///../../../node_modules/mathjs/lib/esm/function/arithmetic/invmod.js","webpack:///../../../node_modules/mathjs/lib/esm/type/matrix/utils/matAlgo09xS0Sf.js","webpack:///../../../node_modules/mathjs/lib/esm/function/arithmetic/dotMultiply.js","webpack:///../../../node_modules/mathjs/lib/esm/utils/bignumber/bitwise.js","webpack:///../../../node_modules/mathjs/lib/esm/function/bitwise/bitAnd.js","webpack:///../../../node_modules/mathjs/lib/esm/function/bitwise/bitNot.js","webpack:///../../../node_modules/mathjs/lib/esm/function/bitwise/bitOr.js","webpack:///../../../node_modules/mathjs/lib/esm/type/matrix/utils/matAlgo07xSSf.js","webpack:///../../../node_modules/mathjs/lib/esm/function/bitwise/bitXor.js","webpack:///../../../node_modules/mathjs/lib/esm/function/complex/arg.js","webpack:///../../../node_modules/mathjs/lib/esm/function/complex/conj.js","webpack:///../../../node_modules/mathjs/lib/esm/function/complex/im.js","webpack:///../../../node_modules/mathjs/lib/esm/function/complex/re.js","webpack:///../../../node_modules/mathjs/lib/esm/function/logical/not.js","webpack:///../../../node_modules/mathjs/lib/esm/function/logical/or.js","webpack:///../../../node_modules/mathjs/lib/esm/function/logical/xor.js","webpack:///../../../node_modules/mathjs/lib/esm/function/matrix/concat.js","webpack:///../../../node_modules/mathjs/lib/esm/function/matrix/column.js","webpack:///../../../node_modules/mathjs/lib/esm/function/matrix/count.js","webpack:///../../../node_modules/mathjs/lib/esm/function/matrix/cross.js","webpack:///../../../node_modules/mathjs/lib/esm/function/matrix/diag.js","webpack:///../../../node_modules/mathjs/lib/esm/utils/applyCallback.js","webpack:///../../../node_modules/mathjs/lib/esm/function/matrix/filter.js","webpack:///../../../node_modules/mathjs/lib/esm/function/matrix/flatten.js","webpack:///../../../node_modules/mathjs/lib/esm/function/matrix/forEach.js","webpack:///../../../node_modules/mathjs/lib/esm/function/matrix/getMatrixDataType.js","webpack:///../../../node_modules/mathjs/lib/esm/function/matrix/identity.js","webpack:///../../../node_modules/mathjs/lib/esm/function/matrix/kron.js","webpack:///../../../node_modules/mathjs/lib/esm/function/matrix/map.js","webpack:///../../../node_modules/mathjs/lib/esm/function/matrix/diff.js","webpack:///../../../node_modules/mathjs/lib/esm/function/matrix/ones.js","webpack:///../../../node_modules/mathjs/lib/esm/utils/noop.js","webpack:///../../../node_modules/mathjs/lib/esm/function/matrix/range.js","webpack:///../../../node_modules/mathjs/lib/esm/function/matrix/reshape.js","webpack:///../../../node_modules/mathjs/lib/esm/function/matrix/resize.js","webpack:///../../../node_modules/mathjs/lib/esm/function/matrix/rotate.js","webpack:///../../../node_modules/mathjs/lib/esm/function/matrix/rotationMatrix.js","webpack:///../../../node_modules/mathjs/lib/esm/function/matrix/row.js","webpack:///../../../node_modules/mathjs/lib/esm/function/matrix/size.js","webpack:///../../../node_modules/mathjs/lib/esm/function/matrix/squeeze.js","webpack:///../../../node_modules/mathjs/lib/esm/function/matrix/subset.js","webpack:///../../../node_modules/mathjs/lib/esm/function/matrix/transpose.js","webpack:///../../../node_modules/mathjs/lib/esm/function/matrix/ctranspose.js","webpack:///../../../node_modules/mathjs/lib/esm/function/matrix/zeros.js","webpack:///../../../node_modules/mathjs/lib/esm/function/matrix/fft.js","webpack:///../../../node_modules/mathjs/lib/esm/function/matrix/ifft.js","webpack:///../../../node_modules/mathjs/lib/esm/function/numeric/solveODE.js","webpack:///../../../node_modules/mathjs/lib/esm/function/special/erf.js","webpack:///../../../node_modules/mathjs/lib/esm/function/statistics/mode.js","webpack:///../../../node_modules/mathjs/lib/esm/function/statistics/utils/improveErrorMessage.js","webpack:///../../../node_modules/mathjs/lib/esm/function/statistics/prod.js","webpack:///../../../node_modules/mathjs/lib/esm/function/string/format.js","webpack:///../../../node_modules/mathjs/lib/esm/function/string/bin.js","webpack:///../../../node_modules/mathjs/lib/esm/function/string/oct.js","webpack:///../../../node_modules/mathjs/lib/esm/function/string/hex.js","webpack:///../../../node_modules/mathjs/lib/esm/function/string/print.js","webpack:///../../../node_modules/mathjs/lib/esm/function/unit/to.js","webpack:///../../../node_modules/mathjs/lib/esm/function/utils/isPrime.js","webpack:///../../../node_modules/mathjs/lib/esm/function/utils/numeric.js","webpack:///../../../node_modules/mathjs/lib/esm/function/arithmetic/divideScalar.js","webpack:///../../../node_modules/mathjs/lib/esm/function/arithmetic/pow.js","webpack:///../../../node_modules/mathjs/lib/esm/function/arithmetic/round.js","webpack:///../../../node_modules/mathjs/lib/esm/function/arithmetic/log.js","webpack:///../../../node_modules/mathjs/lib/esm/function/arithmetic/log1p.js","webpack:///../../../node_modules/mathjs/lib/esm/function/arithmetic/nthRoots.js","webpack:///../../../node_modules/mathjs/lib/esm/function/arithmetic/dotPow.js","webpack:///../../../node_modules/mathjs/lib/esm/function/arithmetic/dotDivide.js","webpack:///../../../node_modules/mathjs/lib/esm/function/algebra/solver/utils/solveValidation.js","webpack:///../../../node_modules/mathjs/lib/esm/function/algebra/solver/lsolve.js","webpack:///../../../node_modules/mathjs/lib/esm/function/algebra/solver/usolve.js","webpack:///../../../node_modules/mathjs/lib/esm/function/algebra/solver/lsolveAll.js","webpack:///../../../node_modules/mathjs/lib/esm/function/algebra/solver/usolveAll.js","webpack:///../../../node_modules/mathjs/lib/esm/type/matrix/utils/matAlgo08xS0Sid.js","webpack:///../../../node_modules/mathjs/lib/esm/function/bitwise/useMatrixForArrayScalar.js","webpack:///../../../node_modules/mathjs/lib/esm/function/bitwise/leftShift.js","webpack:///../../../node_modules/mathjs/lib/esm/function/bitwise/rightArithShift.js","webpack:///../../../node_modules/mathjs/lib/esm/function/bitwise/rightLogShift.js","webpack:///../../../node_modules/mathjs/lib/esm/function/logical/and.js","webpack:///../../../node_modules/mathjs/lib/esm/function/relational/compare.js","webpack:///../../../node_modules/mathjs/lib/esm/function/relational/compareNatural.js","webpack:///../../../node_modules/mathjs/lib/esm/function/relational/compareText.js","webpack:///../../../node_modules/mathjs/lib/esm/function/relational/equal.js","webpack:///../../../node_modules/mathjs/lib/esm/function/relational/equalText.js","webpack:///../../../node_modules/mathjs/lib/esm/function/relational/smaller.js","webpack:///../../../node_modules/mathjs/lib/esm/function/relational/smallerEq.js","webpack:///../../../node_modules/mathjs/lib/esm/function/relational/larger.js","webpack:///../../../node_modules/mathjs/lib/esm/function/relational/largerEq.js","webpack:///../../../node_modules/mathjs/lib/esm/function/relational/deepEqual.js","webpack:///../../../node_modules/mathjs/lib/esm/function/relational/unequal.js","webpack:///../../../node_modules/mathjs/lib/esm/function/matrix/partitionSelect.js","webpack:///../../../node_modules/mathjs/lib/esm/function/matrix/sort.js","webpack:///../../../node_modules/mathjs/lib/esm/function/statistics/max.js","webpack:///../../../node_modules/mathjs/lib/esm/function/statistics/min.js","webpack:///../../../node_modules/mathjs/lib/esm/type/matrix/ImmutableDenseMatrix.js","webpack:///../../../node_modules/mathjs/lib/esm/type/matrix/MatrixIndex.js","webpack:///../../../node_modules/mathjs/lib/esm/type/matrix/FibonacciHeap.js","webpack:///../../../node_modules/mathjs/lib/esm/type/matrix/Spa.js","webpack:///../../../node_modules/mathjs/lib/esm/utils/bignumber/constants.js","webpack:///../../../node_modules/mathjs/lib/esm/type/unit/Unit.js","webpack:///../../../node_modules/mathjs/lib/esm/type/unit/function/unit.js","webpack:///../../../node_modules/mathjs/lib/esm/type/matrix/function/sparse.js","webpack:///../../../node_modules/mathjs/lib/esm/type/unit/function/createUnit.js","webpack:///../../../node_modules/mathjs/lib/esm/function/trigonometry/acos.js","webpack:///../../../node_modules/mathjs/lib/esm/function/trigonometry/acosh.js","webpack:///../../../node_modules/mathjs/lib/esm/function/trigonometry/acot.js","webpack:///../../../node_modules/mathjs/lib/esm/function/trigonometry/acoth.js","webpack:///../../../node_modules/mathjs/lib/esm/function/trigonometry/acsc.js","webpack:///../../../node_modules/mathjs/lib/esm/function/trigonometry/acsch.js","webpack:///../../../node_modules/mathjs/lib/esm/function/trigonometry/asec.js","webpack:///../../../node_modules/mathjs/lib/esm/function/trigonometry/asech.js","webpack:///../../../node_modules/mathjs/lib/esm/function/trigonometry/asin.js","webpack:///../../../node_modules/mathjs/lib/esm/function/trigonometry/asinh.js","webpack:///../../../node_modules/mathjs/lib/esm/function/trigonometry/atan.js","webpack:///../../../node_modules/mathjs/lib/esm/function/trigonometry/atan2.js","webpack:///../../../node_modules/mathjs/lib/esm/function/trigonometry/atanh.js","webpack:///../../../node_modules/mathjs/lib/esm/function/trigonometry/trigUnit.js","webpack:///../../../node_modules/mathjs/lib/esm/function/trigonometry/cos.js","webpack:///../../../node_modules/mathjs/lib/esm/function/trigonometry/cosh.js","webpack:///../../../node_modules/mathjs/lib/esm/function/trigonometry/cot.js","webpack:///../../../node_modules/mathjs/lib/esm/function/trigonometry/coth.js","webpack:///../../../node_modules/mathjs/lib/esm/function/trigonometry/csc.js","webpack:///../../../node_modules/mathjs/lib/esm/function/trigonometry/csch.js","webpack:///../../../node_modules/mathjs/lib/esm/function/trigonometry/sec.js","webpack:///../../../node_modules/mathjs/lib/esm/function/trigonometry/sech.js","webpack:///../../../node_modules/mathjs/lib/esm/function/trigonometry/sin.js","webpack:///../../../node_modules/mathjs/lib/esm/function/trigonometry/sinh.js","webpack:///../../../node_modules/mathjs/lib/esm/function/trigonometry/tan.js","webpack:///../../../node_modules/mathjs/lib/esm/function/trigonometry/tanh.js","webpack:///../../../node_modules/mathjs/lib/esm/function/set/setCartesian.js","webpack:///../../../node_modules/mathjs/lib/esm/function/set/setDifference.js","webpack:///../../../node_modules/mathjs/lib/esm/function/set/setDistinct.js","webpack:///../../../node_modules/mathjs/lib/esm/function/set/setIntersect.js","webpack:///../../../node_modules/mathjs/lib/esm/function/set/setIsSubset.js","webpack:///../../../node_modules/mathjs/lib/esm/function/set/setMultiplicity.js","webpack:///../../../node_modules/mathjs/lib/esm/function/set/setPowerset.js","webpack:///../../../node_modules/mathjs/lib/esm/function/set/setSize.js","webpack:///../../../node_modules/mathjs/lib/esm/function/set/setSymDifference.js","webpack:///../../../node_modules/mathjs/lib/esm/function/set/setUnion.js","webpack:///../../../node_modules/mathjs/lib/esm/function/arithmetic/add.js","webpack:///../../../node_modules/mathjs/lib/esm/function/arithmetic/hypot.js","webpack:///../../../node_modules/mathjs/lib/esm/function/arithmetic/norm.js","webpack:///../../../node_modules/mathjs/lib/esm/function/matrix/dot.js","webpack:///../../../node_modules/mathjs/lib/esm/function/matrix/trace.js","webpack:///../../../node_modules/mathjs/lib/esm/type/matrix/function/index.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/keywords.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/node/Node.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/transform/utils/errorTransform.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/node/utils/access.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/node/AccessorNode.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/node/ArrayNode.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/operators.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/node/AssignmentNode.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/node/utils/assign.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/node/BlockNode.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/node/ConditionalNode.js","webpack:///../../../node_modules/mathjs/lib/esm/utils/latex.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/node/ConstantNode.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/node/FunctionAssignmentNode.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/node/IndexNode.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/node/ObjectNode.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/node/OperatorNode.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/node/ParenthesisNode.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/node/RangeNode.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/node/RelationalNode.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/node/SymbolNode.js","webpack:///../../../node_modules/mathjs/lib/esm/utils/scope.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/node/FunctionNode.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/parse.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/function/compile.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/function/evaluate.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/Parser.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/function/parser.js","webpack:///../../../node_modules/mathjs/lib/esm/function/algebra/decomposition/lup.js","webpack:///../../../node_modules/mathjs/lib/esm/function/algebra/decomposition/qr.js","webpack:///../../../node_modules/mathjs/lib/esm/function/algebra/sparse/csTdfs.js","webpack:///../../../node_modules/mathjs/lib/esm/function/algebra/sparse/csFlip.js","webpack:///../../../node_modules/mathjs/lib/esm/function/algebra/sparse/csAmd.js","webpack:///../../../node_modules/mathjs/lib/esm/function/algebra/sparse/csFkeep.js","webpack:///../../../node_modules/mathjs/lib/esm/function/algebra/sparse/csLeaf.js","webpack:///../../../node_modules/mathjs/lib/esm/function/algebra/sparse/csCounts.js","webpack:///../../../node_modules/mathjs/lib/esm/function/algebra/sparse/csSqr.js","webpack:///../../../node_modules/mathjs/lib/esm/function/algebra/sparse/csPermute.js","webpack:///../../../node_modules/mathjs/lib/esm/function/algebra/sparse/csEtree.js","webpack:///../../../node_modules/mathjs/lib/esm/function/algebra/sparse/csPost.js","webpack:///../../../node_modules/mathjs/lib/esm/function/algebra/sparse/csMarked.js","webpack:///../../../node_modules/mathjs/lib/esm/function/algebra/sparse/csMark.js","webpack:///../../../node_modules/mathjs/lib/esm/function/algebra/sparse/csUnflip.js","webpack:///../../../node_modules/mathjs/lib/esm/function/algebra/sparse/csDfs.js","webpack:///../../../node_modules/mathjs/lib/esm/function/algebra/sparse/csSpsolve.js","webpack:///../../../node_modules/mathjs/lib/esm/function/algebra/sparse/csReach.js","webpack:///../../../node_modules/mathjs/lib/esm/function/algebra/sparse/csLu.js","webpack:///../../../node_modules/mathjs/lib/esm/function/algebra/decomposition/slu.js","webpack:///../../../node_modules/mathjs/lib/esm/function/algebra/sparse/csIpvec.js","webpack:///../../../node_modules/mathjs/lib/esm/function/algebra/solver/lusolve.js","webpack:///../../../node_modules/mathjs/lib/esm/function/algebra/polynomialRoot.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/Help.js","webpack:///../../../node_modules/mathjs/lib/esm/type/chain/Chain.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/constants/e.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/constants/pi.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/embeddedDocs.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/construction/bignumber.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/construction/boolean.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/construction/complex.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/construction/createUnit.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/construction/fraction.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/construction/index.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/construction/matrix.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/construction/number.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/construction/sparse.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/construction/splitUnit.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/construction/string.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/construction/unit.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/constants/false.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/constants/i.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/constants/Infinity.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/constants/LN2.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/constants/LN10.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/constants/LOG2E.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/constants/LOG10E.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/constants/NaN.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/constants/null.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/constants/phi.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/constants/SQRT1_2.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/constants/SQRT2.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/constants/tau.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/constants/true.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/constants/version.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/algebra/derivative.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/algebra/lsolve.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/algebra/lsolveAll.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/algebra/lup.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/algebra/lusolve.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/algebra/leafCount.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/algebra/polynomialRoot.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/algebra/resolve.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/algebra/simplify.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/algebra/simplifyConstant.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/algebra/simplifyCore.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/algebra/symbolicEqual.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/algebra/rationalize.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/algebra/slu.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/algebra/usolve.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/algebra/usolveAll.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/algebra/qr.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/arithmetic/abs.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/arithmetic/add.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/arithmetic/cbrt.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/arithmetic/ceil.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/arithmetic/cube.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/arithmetic/divide.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/arithmetic/dotDivide.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/arithmetic/dotMultiply.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/arithmetic/dotPow.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/arithmetic/exp.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/arithmetic/expm.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/arithmetic/expm1.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/arithmetic/fix.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/arithmetic/floor.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/arithmetic/gcd.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/arithmetic/hypot.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/arithmetic/lcm.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/arithmetic/log.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/arithmetic/log2.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/arithmetic/log1p.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/arithmetic/log10.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/arithmetic/mod.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/arithmetic/multiply.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/arithmetic/norm.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/arithmetic/nthRoot.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/arithmetic/nthRoots.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/arithmetic/pow.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/arithmetic/round.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/arithmetic/sign.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/arithmetic/sqrt.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/arithmetic/sqrtm.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/arithmetic/square.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/arithmetic/subtract.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/arithmetic/unaryMinus.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/arithmetic/unaryPlus.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/arithmetic/xgcd.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/arithmetic/invmod.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/bitwise/bitAnd.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/bitwise/bitNot.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/bitwise/bitOr.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/bitwise/bitXor.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/bitwise/leftShift.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/bitwise/rightArithShift.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/bitwise/rightLogShift.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/combinatorics/bellNumbers.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/combinatorics/catalan.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/combinatorics/composition.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/combinatorics/stirlingS2.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/core/config.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/core/import.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/core/typed.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/complex/arg.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/complex/conj.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/complex/re.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/complex/im.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/expression/evaluate.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/expression/help.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/geometry/distance.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/geometry/intersect.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/logical/and.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/logical/not.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/logical/or.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/logical/xor.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/matrix/concat.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/matrix/count.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/matrix/cross.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/matrix/column.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/matrix/ctranspose.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/matrix/det.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/matrix/diag.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/matrix/diff.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/matrix/dot.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/matrix/getMatrixDataType.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/matrix/identity.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/matrix/filter.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/matrix/flatten.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/matrix/forEach.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/matrix/inv.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/matrix/pinv.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/matrix/eigs.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/matrix/kron.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/matrix/matrixFromFunction.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/matrix/matrixFromRows.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/matrix/matrixFromColumns.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/matrix/map.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/matrix/ones.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/matrix/partitionSelect.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/matrix/range.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/matrix/resize.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/matrix/reshape.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/matrix/rotate.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/matrix/rotationMatrix.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/matrix/row.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/matrix/size.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/matrix/sort.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/matrix/squeeze.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/matrix/subset.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/matrix/trace.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/matrix/transpose.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/matrix/zeros.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/matrix/fft.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/matrix/ifft.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/algebra/sylvester.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/algebra/schur.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/algebra/lyap.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/numeric/solveODE.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/probability/combinations.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/probability/combinationsWithRep.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/probability/factorial.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/probability/gamma.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/probability/kldivergence.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/probability/lgamma.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/probability/multinomial.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/probability/permutations.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/probability/pickRandom.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/probability/random.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/probability/randomInt.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/relational/compare.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/relational/compareNatural.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/relational/compareText.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/relational/deepEqual.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/relational/equal.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/relational/equalText.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/relational/larger.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/relational/largerEq.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/relational/smaller.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/relational/smallerEq.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/relational/unequal.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/set/setCartesian.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/set/setDifference.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/set/setDistinct.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/set/setIntersect.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/set/setIsSubset.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/set/setMultiplicity.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/set/setPowerset.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/set/setSize.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/set/setSymDifference.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/set/setUnion.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/signal/zpk2tf.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/signal/freqz.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/special/erf.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/statistics/cumsum.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/statistics/mad.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/statistics/max.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/statistics/mean.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/statistics/median.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/statistics/min.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/statistics/mode.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/statistics/prod.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/statistics/quantileSeq.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/statistics/std.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/statistics/sum.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/statistics/variance.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/trigonometry/acos.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/trigonometry/acosh.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/trigonometry/acot.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/trigonometry/acoth.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/trigonometry/acsc.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/trigonometry/acsch.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/trigonometry/asec.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/trigonometry/asech.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/trigonometry/asin.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/trigonometry/asinh.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/trigonometry/atan.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/trigonometry/atanh.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/trigonometry/atan2.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/trigonometry/cos.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/trigonometry/cosh.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/trigonometry/cot.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/trigonometry/coth.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/trigonometry/csc.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/trigonometry/csch.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/trigonometry/sec.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/trigonometry/sech.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/trigonometry/sin.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/trigonometry/sinh.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/trigonometry/tan.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/trigonometry/tanh.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/units/to.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/utils/clone.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/utils/format.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/utils/bin.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/utils/oct.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/utils/hex.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/utils/isNaN.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/utils/isInteger.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/utils/isNegative.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/utils/isNumeric.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/utils/hasNumericValue.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/utils/isPositive.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/utils/isPrime.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/utils/isZero.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/utils/print.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/utils/typeOf.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/embeddedDocs/function/utils/numeric.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/function/help.js","webpack:///../../../node_modules/mathjs/lib/esm/type/chain/function/chain.js","webpack:///../../../node_modules/mathjs/lib/esm/function/matrix/det.js","webpack:///../../../node_modules/mathjs/lib/esm/function/matrix/inv.js","webpack:///../../../node_modules/mathjs/lib/esm/function/matrix/pinv.js","webpack:///../../../node_modules/mathjs/lib/esm/function/matrix/eigs/complexEigs.js","webpack:///../../../node_modules/mathjs/lib/esm/function/matrix/eigs/realSymetric.js","webpack:///../../../node_modules/mathjs/lib/esm/function/matrix/eigs.js","webpack:///../../../node_modules/mathjs/lib/esm/function/matrix/expm.js","webpack:///../../../node_modules/mathjs/lib/esm/function/matrix/sqrtm.js","webpack:///../../../node_modules/mathjs/lib/esm/function/algebra/sylvester.js","webpack:///../../../node_modules/mathjs/lib/esm/function/algebra/decomposition/schur.js","webpack:///../../../node_modules/mathjs/lib/esm/function/algebra/lyap.js","webpack:///../../../node_modules/mathjs/lib/esm/function/arithmetic/divide.js","webpack:///../../../node_modules/mathjs/lib/esm/function/geometry/distance.js","webpack:///../../../node_modules/mathjs/lib/esm/function/geometry/intersect.js","webpack:///../../../node_modules/mathjs/lib/esm/function/statistics/sum.js","webpack:///../../../node_modules/mathjs/lib/esm/function/statistics/cumsum.js","webpack:///../../../node_modules/mathjs/lib/esm/function/statistics/mean.js","webpack:///../../../node_modules/mathjs/lib/esm/function/statistics/median.js","webpack:///../../../node_modules/mathjs/lib/esm/function/statistics/mad.js","webpack:///../../../node_modules/mathjs/lib/esm/function/statistics/variance.js","webpack:///../../../node_modules/mathjs/lib/esm/function/statistics/quantileSeq.js","webpack:///../../../node_modules/mathjs/lib/esm/function/statistics/std.js","webpack:///../../../node_modules/mathjs/lib/esm/function/probability/combinations.js","webpack:///../../../node_modules/mathjs/lib/esm/function/probability/combinationsWithRep.js","webpack:///../../../node_modules/mathjs/lib/esm/function/probability/gamma.js","webpack:///../../../node_modules/mathjs/lib/esm/function/probability/lgamma.js","webpack:///../../../node_modules/mathjs/lib/esm/function/probability/factorial.js","webpack:///../../../node_modules/mathjs/lib/esm/function/probability/kldivergence.js","webpack:///../../../node_modules/mathjs/lib/esm/function/probability/multinomial.js","webpack:///../../../node_modules/mathjs/lib/esm/function/probability/permutations.js","webpack:///../../../node_modules/mathjs/lib/esm/function/probability/util/seededRNG.js","webpack:///../../../node_modules/mathjs/lib/esm/function/probability/pickRandom.js","webpack:///../../../node_modules/mathjs/lib/esm/function/probability/util/randomMatrix.js","webpack:///../../../node_modules/mathjs/lib/esm/function/probability/random.js","webpack:///../../../node_modules/mathjs/lib/esm/function/probability/randomInt.js","webpack:///../../../node_modules/mathjs/lib/esm/function/combinatorics/stirlingS2.js","webpack:///../../../node_modules/mathjs/lib/esm/function/combinatorics/bellNumbers.js","webpack:///../../../node_modules/mathjs/lib/esm/function/combinatorics/catalan.js","webpack:///../../../node_modules/mathjs/lib/esm/function/combinatorics/composition.js","webpack:///../../../node_modules/mathjs/lib/esm/function/algebra/leafCount.js","webpack:///../../../node_modules/mathjs/lib/esm/function/algebra/simplify/wildcards.js","webpack:///../../../node_modules/mathjs/lib/esm/function/algebra/simplify/util.js","webpack:///../../../node_modules/mathjs/lib/esm/function/algebra/simplify.js","webpack:///../../../node_modules/mathjs/lib/esm/function/algebra/simplifyConstant.js","webpack:///../../../node_modules/mathjs/lib/esm/function/algebra/simplifyCore.js","webpack:///../../../node_modules/mathjs/lib/esm/function/algebra/resolve.js","webpack:///../../../node_modules/mathjs/lib/esm/function/algebra/symbolicEqual.js","webpack:///../../../node_modules/mathjs/lib/esm/function/algebra/derivative.js","webpack:///../../../node_modules/mathjs/lib/esm/function/algebra/rationalize.js","webpack:///../../../node_modules/mathjs/lib/esm/function/signal/zpk2tf.js","webpack:///../../../node_modules/mathjs/lib/esm/function/signal/freqz.js","webpack:///../../../node_modules/mathjs/lib/esm/json/reviver.js","webpack:///../../../node_modules/mathjs/lib/esm/json/replacer.js","webpack:///../../../node_modules/mathjs/lib/esm/constants.js","webpack:///../../../node_modules/mathjs/lib/esm/version.js","webpack:///../../../node_modules/mathjs/lib/esm/type/unit/physicalConstants.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/transform/apply.transform.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/transform/column.transform.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/transform/utils/compileInlineExpression.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/transform/filter.transform.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/transform/forEach.transform.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/transform/index.transform.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/transform/map.transform.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/transform/utils/lastDimToZeroBase.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/transform/max.transform.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/transform/mean.transform.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/transform/min.transform.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/transform/range.transform.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/transform/row.transform.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/transform/subset.transform.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/transform/concat.transform.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/transform/diff.transform.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/transform/std.transform.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/transform/sum.transform.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/transform/cumsum.transform.js","webpack:///../../../node_modules/mathjs/lib/esm/expression/transform/variance.transform.js","webpack:///../../../node_modules/mathjs/lib/esm/entry/pureFunctionsAny.generated.js","webpack:///../../../node_modules/mathjs/lib/esm/entry/impureFunctionsAny.generated.js"],"sourcesContent":["/**\n * @license Complex.js v2.1.1 12/05/2020\n *\n * Copyright (c) 2020, Robert Eisele (robert@xarg.org)\n * Dual licensed under the MIT or GPL Version 2 licenses.\n **/\n\n/**\n *\n * This class allows the manipulation of complex numbers.\n * You can pass a complex number in different formats. Either as object, double, string or two integer parameters.\n *\n * Object form\n * { re: , im: }\n * { arg: , abs: }\n * { phi: , r: }\n *\n * Array / Vector form\n * [ real, imaginary ]\n *\n * Double form\n * 99.3 - Single double value\n *\n * String form\n * '23.1337' - Simple real number\n * '15+3i' - a simple complex number\n * '3-i' - a simple complex number\n *\n * Example:\n *\n * var c = new Complex('99.3+8i');\n * c.mul({r: 3, i: 9}).div(4.9).sub(3, 2);\n *\n */\n\n(function(root) {\n\n 'use strict';\n\n var cosh = Math.cosh || function(x) {\n return Math.abs(x) < 1e-9 ? 1 - x : (Math.exp(x) + Math.exp(-x)) * 0.5;\n };\n\n var sinh = Math.sinh || function(x) {\n return Math.abs(x) < 1e-9 ? x : (Math.exp(x) - Math.exp(-x)) * 0.5;\n };\n\n /**\n * Calculates cos(x) - 1 using Taylor series if x is small (-¼π ≤ x ≤ ¼π).\n *\n * @param {number} x\n * @returns {number} cos(x) - 1\n */\n var cosm1 = function(x) {\n\n var b = Math.PI / 4;\n if (-b > x || x > b) {\n return Math.cos(x) - 1.0;\n }\n\n /* Calculate horner form of polynomial of taylor series in Q\n var fac = 1, alt = 1, pol = {};\n for (var i = 0; i <= 16; i++) {\n fac*= i || 1;\n if (i % 2 == 0) {\n pol[i] = new Fraction(1, alt * fac);\n alt = -alt;\n }\n }\n console.log(new Polynomial(pol).toHorner()); // (((((((1/20922789888000x^2-1/87178291200)x^2+1/479001600)x^2-1/3628800)x^2+1/40320)x^2-1/720)x^2+1/24)x^2-1/2)x^2+1\n */\n\n var xx = x * x;\n return xx * (\n xx * (\n xx * (\n xx * (\n xx * (\n xx * (\n xx * (\n xx / 20922789888000\n - 1 / 87178291200)\n + 1 / 479001600)\n - 1 / 3628800)\n + 1 / 40320)\n - 1 / 720)\n + 1 / 24)\n - 1 / 2);\n };\n\n var hypot = function(x, y) {\n\n var a = Math.abs(x);\n var b = Math.abs(y);\n\n if (a < 3000 && b < 3000) {\n return Math.sqrt(a * a + b * b);\n }\n\n if (a < b) {\n a = b;\n b = x / y;\n } else {\n b = y / x;\n }\n return a * Math.sqrt(1 + b * b);\n };\n\n var parser_exit = function() {\n throw SyntaxError('Invalid Param');\n };\n\n /**\n * Calculates log(sqrt(a^2+b^2)) in a way to avoid overflows\n *\n * @param {number} a\n * @param {number} b\n * @returns {number}\n */\n function logHypot(a, b) {\n\n var _a = Math.abs(a);\n var _b = Math.abs(b);\n\n if (a === 0) {\n return Math.log(_b);\n }\n\n if (b === 0) {\n return Math.log(_a);\n }\n\n if (_a < 3000 && _b < 3000) {\n return Math.log(a * a + b * b) * 0.5;\n }\n\n /* I got 4 ideas to compute this property without overflow:\n *\n * Testing 1000000 times with random samples for a,b ∈ [1, 1000000000] against a big decimal library to get an error estimate\n *\n * 1. Only eliminate the square root: (OVERALL ERROR: 3.9122483030951116e-11)\n\n Math.log(a * a + b * b) / 2\n\n *\n *\n * 2. Try to use the non-overflowing pythagoras: (OVERALL ERROR: 8.889760039210159e-10)\n\n var fn = function(a, b) {\n a = Math.abs(a);\n b = Math.abs(b);\n var t = Math.min(a, b);\n a = Math.max(a, b);\n t = t / a;\n\n return Math.log(a) + Math.log(1 + t * t) / 2;\n };\n\n * 3. Abuse the identity cos(atan(y/x) = x / sqrt(x^2+y^2): (OVERALL ERROR: 3.4780178737037204e-10)\n\n Math.log(a / Math.cos(Math.atan2(b, a)))\n\n * 4. Use 3. and apply log rules: (OVERALL ERROR: 1.2014087502620896e-9)\n\n Math.log(a) - Math.log(Math.cos(Math.atan2(b, a)))\n\n */\n\n a = a / 2;\n b = b / 2;\n\n return 0.5 * Math.log(a * a + b * b) + Math.LN2;\n }\n\n var parse = function(a, b) {\n\n var z = { 're': 0, 'im': 0 };\n\n if (a === undefined || a === null) {\n z['re'] =\n z['im'] = 0;\n } else if (b !== undefined) {\n z['re'] = a;\n z['im'] = b;\n } else\n switch (typeof a) {\n\n case 'object':\n\n if ('im' in a && 're' in a) {\n z['re'] = a['re'];\n z['im'] = a['im'];\n } else if ('abs' in a && 'arg' in a) {\n if (!Number.isFinite(a['abs']) && Number.isFinite(a['arg'])) {\n return Complex['INFINITY'];\n }\n z['re'] = a['abs'] * Math.cos(a['arg']);\n z['im'] = a['abs'] * Math.sin(a['arg']);\n } else if ('r' in a && 'phi' in a) {\n if (!Number.isFinite(a['r']) && Number.isFinite(a['phi'])) {\n return Complex['INFINITY'];\n }\n z['re'] = a['r'] * Math.cos(a['phi']);\n z['im'] = a['r'] * Math.sin(a['phi']);\n } else if (a.length === 2) { // Quick array check\n z['re'] = a[0];\n z['im'] = a[1];\n } else {\n parser_exit();\n }\n break;\n\n case 'string':\n\n z['im'] = /* void */\n z['re'] = 0;\n\n var tokens = a.match(/\\d+\\.?\\d*e[+-]?\\d+|\\d+\\.?\\d*|\\.\\d+|./g);\n var plus = 1;\n var minus = 0;\n\n if (tokens === null) {\n parser_exit();\n }\n\n for (var i = 0; i < tokens.length; i++) {\n\n var c = tokens[i];\n\n if (c === ' ' || c === '\\t' || c === '\\n') {\n /* void */\n } else if (c === '+') {\n plus++;\n } else if (c === '-') {\n minus++;\n } else if (c === 'i' || c === 'I') {\n\n if (plus + minus === 0) {\n parser_exit();\n }\n\n if (tokens[i + 1] !== ' ' && !isNaN(tokens[i + 1])) {\n z['im'] += parseFloat((minus % 2 ? '-' : '') + tokens[i + 1]);\n i++;\n } else {\n z['im'] += parseFloat((minus % 2 ? '-' : '') + '1');\n }\n plus = minus = 0;\n\n } else {\n\n if (plus + minus === 0 || isNaN(c)) {\n parser_exit();\n }\n\n if (tokens[i + 1] === 'i' || tokens[i + 1] === 'I') {\n z['im'] += parseFloat((minus % 2 ? '-' : '') + c);\n i++;\n } else {\n z['re'] += parseFloat((minus % 2 ? '-' : '') + c);\n }\n plus = minus = 0;\n }\n }\n\n // Still something on the stack\n if (plus + minus > 0) {\n parser_exit();\n }\n break;\n\n case 'number':\n z['im'] = 0;\n z['re'] = a;\n break;\n\n default:\n parser_exit();\n }\n\n if (isNaN(z['re']) || isNaN(z['im'])) {\n // If a calculation is NaN, we treat it as NaN and don't throw\n //parser_exit();\n }\n\n return z;\n };\n\n /**\n * @constructor\n * @returns {Complex}\n */\n function Complex(a, b) {\n\n if (!(this instanceof Complex)) {\n return new Complex(a, b);\n }\n\n var z = parse(a, b);\n\n this['re'] = z['re'];\n this['im'] = z['im'];\n }\n\n Complex.prototype = {\n\n 're': 0,\n 'im': 0,\n\n /**\n * Calculates the sign of a complex number, which is a normalized complex\n *\n * @returns {Complex}\n */\n 'sign': function() {\n\n var abs = this['abs']();\n\n return new Complex(\n this['re'] / abs,\n this['im'] / abs);\n },\n\n /**\n * Adds two complex numbers\n *\n * @returns {Complex}\n */\n 'add': function(a, b) {\n\n var z = new Complex(a, b);\n\n // Infinity + Infinity = NaN\n if (this['isInfinite']() && z['isInfinite']()) {\n return Complex['NAN'];\n }\n\n // Infinity + z = Infinity { where z != Infinity }\n if (this['isInfinite']() || z['isInfinite']()) {\n return Complex['INFINITY'];\n }\n\n return new Complex(\n this['re'] + z['re'],\n this['im'] + z['im']);\n },\n\n /**\n * Subtracts two complex numbers\n *\n * @returns {Complex}\n */\n 'sub': function(a, b) {\n\n var z = new Complex(a, b);\n\n // Infinity - Infinity = NaN\n if (this['isInfinite']() && z['isInfinite']()) {\n return Complex['NAN'];\n }\n\n // Infinity - z = Infinity { where z != Infinity }\n if (this['isInfinite']() || z['isInfinite']()) {\n return Complex['INFINITY'];\n }\n\n return new Complex(\n this['re'] - z['re'],\n this['im'] - z['im']);\n },\n\n /**\n * Multiplies two complex numbers\n *\n * @returns {Complex}\n */\n 'mul': function(a, b) {\n\n var z = new Complex(a, b);\n\n // Infinity * 0 = NaN\n if ((this['isInfinite']() && z['isZero']()) || (this['isZero']() && z['isInfinite']())) {\n return Complex['NAN'];\n }\n\n // Infinity * z = Infinity { where z != 0 }\n if (this['isInfinite']() || z['isInfinite']()) {\n return Complex['INFINITY'];\n }\n\n // Short circuit for real values\n if (z['im'] === 0 && this['im'] === 0) {\n return new Complex(this['re'] * z['re'], 0);\n }\n\n return new Complex(\n this['re'] * z['re'] - this['im'] * z['im'],\n this['re'] * z['im'] + this['im'] * z['re']);\n },\n\n /**\n * Divides two complex numbers\n *\n * @returns {Complex}\n */\n 'div': function(a, b) {\n\n var z = new Complex(a, b);\n\n // 0 / 0 = NaN and Infinity / Infinity = NaN\n if ((this['isZero']() && z['isZero']()) || (this['isInfinite']() && z['isInfinite']())) {\n return Complex['NAN'];\n }\n\n // Infinity / 0 = Infinity\n if (this['isInfinite']() || z['isZero']()) {\n return Complex['INFINITY'];\n }\n\n // 0 / Infinity = 0\n if (this['isZero']() || z['isInfinite']()) {\n return Complex['ZERO'];\n }\n\n a = this['re'];\n b = this['im'];\n\n var c = z['re'];\n var d = z['im'];\n var t, x;\n\n if (0 === d) {\n // Divisor is real\n return new Complex(a / c, b / c);\n }\n\n if (Math.abs(c) < Math.abs(d)) {\n\n x = c / d;\n t = c * x + d;\n\n return new Complex(\n (a * x + b) / t,\n (b * x - a) / t);\n\n } else {\n\n x = d / c;\n t = d * x + c;\n\n return new Complex(\n (a + b * x) / t,\n (b - a * x) / t);\n }\n },\n\n /**\n * Calculate the power of two complex numbers\n *\n * @returns {Complex}\n */\n 'pow': function(a, b) {\n\n var z = new Complex(a, b);\n\n a = this['re'];\n b = this['im'];\n\n if (z['isZero']()) {\n return Complex['ONE'];\n }\n\n // If the exponent is real\n if (z['im'] === 0) {\n\n if (b === 0 && a > 0) {\n\n return new Complex(Math.pow(a, z['re']), 0);\n\n } else if (a === 0) { // If base is fully imaginary\n\n switch ((z['re'] % 4 + 4) % 4) {\n case 0:\n return new Complex(Math.pow(b, z['re']), 0);\n case 1:\n return new Complex(0, Math.pow(b, z['re']));\n case 2:\n return new Complex(-Math.pow(b, z['re']), 0);\n case 3:\n return new Complex(0, -Math.pow(b, z['re']));\n }\n }\n }\n\n /* I couldn't find a good formula, so here is a derivation and optimization\n *\n * z_1^z_2 = (a + bi)^(c + di)\n * = exp((c + di) * log(a + bi)\n * = pow(a^2 + b^2, (c + di) / 2) * exp(i(c + di)atan2(b, a))\n * =>...\n * Re = (pow(a^2 + b^2, c / 2) * exp(-d * atan2(b, a))) * cos(d * log(a^2 + b^2) / 2 + c * atan2(b, a))\n * Im = (pow(a^2 + b^2, c / 2) * exp(-d * atan2(b, a))) * sin(d * log(a^2 + b^2) / 2 + c * atan2(b, a))\n *\n * =>...\n * Re = exp(c * log(sqrt(a^2 + b^2)) - d * atan2(b, a)) * cos(d * log(sqrt(a^2 + b^2)) + c * atan2(b, a))\n * Im = exp(c * log(sqrt(a^2 + b^2)) - d * atan2(b, a)) * sin(d * log(sqrt(a^2 + b^2)) + c * atan2(b, a))\n *\n * =>\n * Re = exp(c * logsq2 - d * arg(z_1)) * cos(d * logsq2 + c * arg(z_1))\n * Im = exp(c * logsq2 - d * arg(z_1)) * sin(d * logsq2 + c * arg(z_1))\n *\n */\n\n if (a === 0 && b === 0 && z['re'] > 0 && z['im'] >= 0) {\n return Complex['ZERO'];\n }\n\n var arg = Math.atan2(b, a);\n var loh = logHypot(a, b);\n\n a = Math.exp(z['re'] * loh - z['im'] * arg);\n b = z['im'] * loh + z['re'] * arg;\n return new Complex(\n a * Math.cos(b),\n a * Math.sin(b));\n },\n\n /**\n * Calculate the complex square root\n *\n * @returns {Complex}\n */\n 'sqrt': function() {\n\n var a = this['re'];\n var b = this['im'];\n var r = this['abs']();\n\n var re, im;\n\n if (a >= 0) {\n\n if (b === 0) {\n return new Complex(Math.sqrt(a), 0);\n }\n\n re = 0.5 * Math.sqrt(2.0 * (r + a));\n } else {\n re = Math.abs(b) / Math.sqrt(2 * (r - a));\n }\n\n if (a <= 0) {\n im = 0.5 * Math.sqrt(2.0 * (r - a));\n } else {\n im = Math.abs(b) / Math.sqrt(2 * (r + a));\n }\n\n return new Complex(re, b < 0 ? -im : im);\n },\n\n /**\n * Calculate the complex exponent\n *\n * @returns {Complex}\n */\n 'exp': function() {\n\n var tmp = Math.exp(this['re']);\n\n if (this['im'] === 0) {\n //return new Complex(tmp, 0);\n }\n return new Complex(\n tmp * Math.cos(this['im']),\n tmp * Math.sin(this['im']));\n },\n\n /**\n * Calculate the complex exponent and subtracts one.\n *\n * This may be more accurate than `Complex(x).exp().sub(1)` if\n * `x` is small.\n *\n * @returns {Complex}\n */\n 'expm1': function() {\n\n /**\n * exp(a + i*b) - 1\n = exp(a) * (cos(b) + j*sin(b)) - 1\n = expm1(a)*cos(b) + cosm1(b) + j*exp(a)*sin(b)\n */\n\n var a = this['re'];\n var b = this['im'];\n\n return new Complex(\n Math.expm1(a) * Math.cos(b) + cosm1(b),\n Math.exp(a) * Math.sin(b));\n },\n\n /**\n * Calculate the natural log\n *\n * @returns {Complex}\n */\n 'log': function() {\n\n var a = this['re'];\n var b = this['im'];\n\n if (b === 0 && a > 0) {\n //return new Complex(Math.log(a), 0);\n }\n\n return new Complex(\n logHypot(a, b),\n Math.atan2(b, a));\n },\n\n /**\n * Calculate the magnitude of the complex number\n *\n * @returns {number}\n */\n 'abs': function() {\n\n return hypot(this['re'], this['im']);\n },\n\n /**\n * Calculate the angle of the complex number\n *\n * @returns {number}\n */\n 'arg': function() {\n\n return Math.atan2(this['im'], this['re']);\n },\n\n /**\n * Calculate the sine of the complex number\n *\n * @returns {Complex}\n */\n 'sin': function() {\n\n // sin(z) = ( e^iz - e^-iz ) / 2i \n // = sin(a)cosh(b) + i cos(a)sinh(b)\n\n var a = this['re'];\n var b = this['im'];\n\n return new Complex(\n Math.sin(a) * cosh(b),\n Math.cos(a) * sinh(b));\n },\n\n /**\n * Calculate the cosine\n *\n * @returns {Complex}\n */\n 'cos': function() {\n\n // cos(z) = ( e^iz + e^-iz ) / 2 \n // = cos(a)cosh(b) - i sin(a)sinh(b)\n\n var a = this['re'];\n var b = this['im'];\n\n return new Complex(\n Math.cos(a) * cosh(b),\n -Math.sin(a) * sinh(b));\n },\n\n /**\n * Calculate the tangent\n *\n * @returns {Complex}\n */\n 'tan': function() {\n\n // tan(z) = sin(z) / cos(z) \n // = ( e^iz - e^-iz ) / ( i( e^iz + e^-iz ) )\n // = ( e^2iz - 1 ) / i( e^2iz + 1 )\n // = ( sin(2a) + i sinh(2b) ) / ( cos(2a) + cosh(2b) )\n\n var a = 2 * this['re'];\n var b = 2 * this['im'];\n var d = Math.cos(a) + cosh(b);\n\n return new Complex(\n Math.sin(a) / d,\n sinh(b) / d);\n },\n\n /**\n * Calculate the cotangent\n *\n * @returns {Complex}\n */\n 'cot': function() {\n\n // cot(c) = i(e^(ci) + e^(-ci)) / (e^(ci) - e^(-ci))\n\n var a = 2 * this['re'];\n var b = 2 * this['im'];\n var d = Math.cos(a) - cosh(b);\n\n return new Complex(\n -Math.sin(a) / d,\n sinh(b) / d);\n },\n\n /**\n * Calculate the secant\n *\n * @returns {Complex}\n */\n 'sec': function() {\n\n // sec(c) = 2 / (e^(ci) + e^(-ci))\n\n var a = this['re'];\n var b = this['im'];\n var d = 0.5 * cosh(2 * b) + 0.5 * Math.cos(2 * a);\n\n return new Complex(\n Math.cos(a) * cosh(b) / d,\n Math.sin(a) * sinh(b) / d);\n },\n\n /**\n * Calculate the cosecans\n *\n * @returns {Complex}\n */\n 'csc': function() {\n\n // csc(c) = 2i / (e^(ci) - e^(-ci))\n\n var a = this['re'];\n var b = this['im'];\n var d = 0.5 * cosh(2 * b) - 0.5 * Math.cos(2 * a);\n\n return new Complex(\n Math.sin(a) * cosh(b) / d,\n -Math.cos(a) * sinh(b) / d);\n },\n\n /**\n * Calculate the complex arcus sinus\n *\n * @returns {Complex}\n */\n 'asin': function() {\n\n // asin(c) = -i * log(ci + sqrt(1 - c^2))\n\n var a = this['re'];\n var b = this['im'];\n\n var t1 = new Complex(\n b * b - a * a + 1,\n -2 * a * b)['sqrt']();\n\n var t2 = new Complex(\n t1['re'] - b,\n t1['im'] + a)['log']();\n\n return new Complex(t2['im'], -t2['re']);\n },\n\n /**\n * Calculate the complex arcus cosinus\n *\n * @returns {Complex}\n */\n 'acos': function() {\n\n // acos(c) = i * log(c - i * sqrt(1 - c^2))\n\n var a = this['re'];\n var b = this['im'];\n\n var t1 = new Complex(\n b * b - a * a + 1,\n -2 * a * b)['sqrt']();\n\n var t2 = new Complex(\n t1['re'] - b,\n t1['im'] + a)['log']();\n\n return new Complex(Math.PI / 2 - t2['im'], t2['re']);\n },\n\n /**\n * Calculate the complex arcus tangent\n *\n * @returns {Complex}\n */\n 'atan': function() {\n\n // atan(c) = i / 2 log((i + x) / (i - x))\n\n var a = this['re'];\n var b = this['im'];\n\n if (a === 0) {\n\n if (b === 1) {\n return new Complex(0, Infinity);\n }\n\n if (b === -1) {\n return new Complex(0, -Infinity);\n }\n }\n\n var d = a * a + (1.0 - b) * (1.0 - b);\n\n var t1 = new Complex(\n (1 - b * b - a * a) / d,\n -2 * a / d).log();\n\n return new Complex(-0.5 * t1['im'], 0.5 * t1['re']);\n },\n\n /**\n * Calculate the complex arcus cotangent\n *\n * @returns {Complex}\n */\n 'acot': function() {\n\n // acot(c) = i / 2 log((c - i) / (c + i))\n\n var a = this['re'];\n var b = this['im'];\n\n if (b === 0) {\n return new Complex(Math.atan2(1, a), 0);\n }\n\n var d = a * a + b * b;\n return (d !== 0)\n ? new Complex(\n a / d,\n -b / d).atan()\n : new Complex(\n (a !== 0) ? a / 0 : 0,\n (b !== 0) ? -b / 0 : 0).atan();\n },\n\n /**\n * Calculate the complex arcus secant\n *\n * @returns {Complex}\n */\n 'asec': function() {\n\n // asec(c) = -i * log(1 / c + sqrt(1 - i / c^2))\n\n var a = this['re'];\n var b = this['im'];\n\n if (a === 0 && b === 0) {\n return new Complex(0, Infinity);\n }\n\n var d = a * a + b * b;\n return (d !== 0)\n ? new Complex(\n a / d,\n -b / d).acos()\n : new Complex(\n (a !== 0) ? a / 0 : 0,\n (b !== 0) ? -b / 0 : 0).acos();\n },\n\n /**\n * Calculate the complex arcus cosecans\n *\n * @returns {Complex}\n */\n 'acsc': function() {\n\n // acsc(c) = -i * log(i / c + sqrt(1 - 1 / c^2))\n\n var a = this['re'];\n var b = this['im'];\n\n if (a === 0 && b === 0) {\n return new Complex(Math.PI / 2, Infinity);\n }\n\n var d = a * a + b * b;\n return (d !== 0)\n ? new Complex(\n a / d,\n -b / d).asin()\n : new Complex(\n (a !== 0) ? a / 0 : 0,\n (b !== 0) ? -b / 0 : 0).asin();\n },\n\n /**\n * Calculate the complex sinh\n *\n * @returns {Complex}\n */\n 'sinh': function() {\n\n // sinh(c) = (e^c - e^-c) / 2\n\n var a = this['re'];\n var b = this['im'];\n\n return new Complex(\n sinh(a) * Math.cos(b),\n cosh(a) * Math.sin(b));\n },\n\n /**\n * Calculate the complex cosh\n *\n * @returns {Complex}\n */\n 'cosh': function() {\n\n // cosh(c) = (e^c + e^-c) / 2\n\n var a = this['re'];\n var b = this['im'];\n\n return new Complex(\n cosh(a) * Math.cos(b),\n sinh(a) * Math.sin(b));\n },\n\n /**\n * Calculate the complex tanh\n *\n * @returns {Complex}\n */\n 'tanh': function() {\n\n // tanh(c) = (e^c - e^-c) / (e^c + e^-c)\n\n var a = 2 * this['re'];\n var b = 2 * this['im'];\n var d = cosh(a) + Math.cos(b);\n\n return new Complex(\n sinh(a) / d,\n Math.sin(b) / d);\n },\n\n /**\n * Calculate the complex coth\n *\n * @returns {Complex}\n */\n 'coth': function() {\n\n // coth(c) = (e^c + e^-c) / (e^c - e^-c)\n\n var a = 2 * this['re'];\n var b = 2 * this['im'];\n var d = cosh(a) - Math.cos(b);\n\n return new Complex(\n sinh(a) / d,\n -Math.sin(b) / d);\n },\n\n /**\n * Calculate the complex coth\n *\n * @returns {Complex}\n */\n 'csch': function() {\n\n // csch(c) = 2 / (e^c - e^-c)\n\n var a = this['re'];\n var b = this['im'];\n var d = Math.cos(2 * b) - cosh(2 * a);\n\n return new Complex(\n -2 * sinh(a) * Math.cos(b) / d,\n 2 * cosh(a) * Math.sin(b) / d);\n },\n\n /**\n * Calculate the complex sech\n *\n * @returns {Complex}\n */\n 'sech': function() {\n\n // sech(c) = 2 / (e^c + e^-c)\n\n var a = this['re'];\n var b = this['im'];\n var d = Math.cos(2 * b) + cosh(2 * a);\n\n return new Complex(\n 2 * cosh(a) * Math.cos(b) / d,\n -2 * sinh(a) * Math.sin(b) / d);\n },\n\n /**\n * Calculate the complex asinh\n *\n * @returns {Complex}\n */\n 'asinh': function() {\n\n // asinh(c) = log(c + sqrt(c^2 + 1))\n\n var tmp = this['im'];\n this['im'] = -this['re'];\n this['re'] = tmp;\n var res = this['asin']();\n\n this['re'] = -this['im'];\n this['im'] = tmp;\n tmp = res['re'];\n\n res['re'] = -res['im'];\n res['im'] = tmp;\n return res;\n },\n\n /**\n * Calculate the complex acosh\n *\n * @returns {Complex}\n */\n 'acosh': function() {\n\n // acosh(c) = log(c + sqrt(c^2 - 1))\n\n var res = this['acos']();\n if (res['im'] <= 0) {\n var tmp = res['re'];\n res['re'] = -res['im'];\n res['im'] = tmp;\n } else {\n var tmp = res['im'];\n res['im'] = -res['re'];\n res['re'] = tmp;\n }\n return res;\n },\n\n /**\n * Calculate the complex atanh\n *\n * @returns {Complex}\n */\n 'atanh': function() {\n\n // atanh(c) = log((1+c) / (1-c)) / 2\n\n var a = this['re'];\n var b = this['im'];\n\n var noIM = a > 1 && b === 0;\n var oneMinus = 1 - a;\n var onePlus = 1 + a;\n var d = oneMinus * oneMinus + b * b;\n\n var x = (d !== 0)\n ? new Complex(\n (onePlus * oneMinus - b * b) / d,\n (b * oneMinus + onePlus * b) / d)\n : new Complex(\n (a !== -1) ? (a / 0) : 0,\n (b !== 0) ? (b / 0) : 0);\n\n var temp = x['re'];\n x['re'] = logHypot(x['re'], x['im']) / 2;\n x['im'] = Math.atan2(x['im'], temp) / 2;\n if (noIM) {\n x['im'] = -x['im'];\n }\n return x;\n },\n\n /**\n * Calculate the complex acoth\n *\n * @returns {Complex}\n */\n 'acoth': function() {\n\n // acoth(c) = log((c+1) / (c-1)) / 2\n\n var a = this['re'];\n var b = this['im'];\n\n if (a === 0 && b === 0) {\n return new Complex(0, Math.PI / 2);\n }\n\n var d = a * a + b * b;\n return (d !== 0)\n ? new Complex(\n a / d,\n -b / d).atanh()\n : new Complex(\n (a !== 0) ? a / 0 : 0,\n (b !== 0) ? -b / 0 : 0).atanh();\n },\n\n /**\n * Calculate the complex acsch\n *\n * @returns {Complex}\n */\n 'acsch': function() {\n\n // acsch(c) = log((1+sqrt(1+c^2))/c)\n\n var a = this['re'];\n var b = this['im'];\n\n if (b === 0) {\n\n return new Complex(\n (a !== 0)\n ? Math.log(a + Math.sqrt(a * a + 1))\n : Infinity, 0);\n }\n\n var d = a * a + b * b;\n return (d !== 0)\n ? new Complex(\n a / d,\n -b / d).asinh()\n : new Complex(\n (a !== 0) ? a / 0 : 0,\n (b !== 0) ? -b / 0 : 0).asinh();\n },\n\n /**\n * Calculate the complex asech\n *\n * @returns {Complex}\n */\n 'asech': function() {\n\n // asech(c) = log((1+sqrt(1-c^2))/c)\n\n var a = this['re'];\n var b = this['im'];\n\n if (this['isZero']()) {\n return Complex['INFINITY'];\n }\n\n var d = a * a + b * b;\n return (d !== 0)\n ? new Complex(\n a / d,\n -b / d).acosh()\n : new Complex(\n (a !== 0) ? a / 0 : 0,\n (b !== 0) ? -b / 0 : 0).acosh();\n },\n\n /**\n * Calculate the complex inverse 1/z\n *\n * @returns {Complex}\n */\n 'inverse': function() {\n\n // 1 / 0 = Infinity and 1 / Infinity = 0\n if (this['isZero']()) {\n return Complex['INFINITY'];\n }\n\n if (this['isInfinite']()) {\n return Complex['ZERO'];\n }\n\n var a = this['re'];\n var b = this['im'];\n\n var d = a * a + b * b;\n\n return new Complex(a / d, -b / d);\n },\n\n /**\n * Returns the complex conjugate\n *\n * @returns {Complex}\n */\n 'conjugate': function() {\n\n return new Complex(this['re'], -this['im']);\n },\n\n /**\n * Gets the negated complex number\n *\n * @returns {Complex}\n */\n 'neg': function() {\n\n return new Complex(-this['re'], -this['im']);\n },\n\n /**\n * Ceils the actual complex number\n *\n * @returns {Complex}\n */\n 'ceil': function(places) {\n\n places = Math.pow(10, places || 0);\n\n return new Complex(\n Math.ceil(this['re'] * places) / places,\n Math.ceil(this['im'] * places) / places);\n },\n\n /**\n * Floors the actual complex number\n *\n * @returns {Complex}\n */\n 'floor': function(places) {\n\n places = Math.pow(10, places || 0);\n\n return new Complex(\n Math.floor(this['re'] * places) / places,\n Math.floor(this['im'] * places) / places);\n },\n\n /**\n * Ceils the actual complex number\n *\n * @returns {Complex}\n */\n 'round': function(places) {\n\n places = Math.pow(10, places || 0);\n\n return new Complex(\n Math.round(this['re'] * places) / places,\n Math.round(this['im'] * places) / places);\n },\n\n /**\n * Compares two complex numbers\n *\n * **Note:** new Complex(Infinity).equals(Infinity) === false\n *\n * @returns {boolean}\n */\n 'equals': function(a, b) {\n\n var z = new Complex(a, b);\n\n return Math.abs(z['re'] - this['re']) <= Complex['EPSILON'] &&\n Math.abs(z['im'] - this['im']) <= Complex['EPSILON'];\n },\n\n /**\n * Clones the actual object\n *\n * @returns {Complex}\n */\n 'clone': function() {\n\n return new Complex(this['re'], this['im']);\n },\n\n /**\n * Gets a string of the actual complex number\n *\n * @returns {string}\n */\n 'toString': function() {\n\n var a = this['re'];\n var b = this['im'];\n var ret = \"\";\n\n if (this['isNaN']()) {\n return 'NaN';\n }\n\n if (this['isInfinite']()) {\n return 'Infinity';\n }\n\n if (Math.abs(a) < Complex['EPSILON']) {\n a = 0;\n }\n\n if (Math.abs(b) < Complex['EPSILON']) {\n b = 0;\n }\n\n // If is real number\n if (b === 0) {\n return ret + a;\n }\n\n if (a !== 0) {\n ret += a;\n ret += \" \";\n if (b < 0) {\n b = -b;\n ret += \"-\";\n } else {\n ret += \"+\";\n }\n ret += \" \";\n } else if (b < 0) {\n b = -b;\n ret += \"-\";\n }\n\n if (1 !== b) { // b is the absolute imaginary part\n ret += b;\n }\n return ret + \"i\";\n },\n\n /**\n * Returns the actual number as a vector\n *\n * @returns {Array}\n */\n 'toVector': function() {\n\n return [this['re'], this['im']];\n },\n\n /**\n * Returns the actual real value of the current object\n *\n * @returns {number|null}\n */\n 'valueOf': function() {\n\n if (this['im'] === 0) {\n return this['re'];\n }\n return null;\n },\n\n /**\n * Determines whether a complex number is not on the Riemann sphere.\n *\n * @returns {boolean}\n */\n 'isNaN': function() {\n return isNaN(this['re']) || isNaN(this['im']);\n },\n\n /**\n * Determines whether or not a complex number is at the zero pole of the\n * Riemann sphere.\n *\n * @returns {boolean}\n */\n 'isZero': function() {\n return this['im'] === 0 && this['re'] === 0;\n },\n\n /**\n * Determines whether a complex number is not at the infinity pole of the\n * Riemann sphere.\n *\n * @returns {boolean}\n */\n 'isFinite': function() {\n return isFinite(this['re']) && isFinite(this['im']);\n },\n\n /**\n * Determines whether or not a complex number is at the infinity pole of the\n * Riemann sphere.\n *\n * @returns {boolean}\n */\n 'isInfinite': function() {\n return !(this['isNaN']() || this['isFinite']());\n }\n };\n\n Complex['ZERO'] = new Complex(0, 0);\n Complex['ONE'] = new Complex(1, 0);\n Complex['I'] = new Complex(0, 1);\n Complex['PI'] = new Complex(Math.PI, 0);\n Complex['E'] = new Complex(Math.E, 0);\n Complex['INFINITY'] = new Complex(Infinity, Infinity);\n Complex['NAN'] = new Complex(NaN, NaN);\n Complex['EPSILON'] = 1e-15;\n\n if (typeof define === 'function' && define['amd']) {\n define([], function() {\n return Complex;\n });\n } else if (typeof exports === 'object') {\n Object.defineProperty(Complex, \"__esModule\", { 'value': true });\n Complex['default'] = Complex;\n Complex['Complex'] = Complex;\n module['exports'] = Complex;\n } else {\n root['Complex'] = Complex;\n }\n\n})(this);\n","\"use strict\";\n\n// Map the characters to escape to their escaped values. The list is derived\n// from http://www.cespedes.org/blog/85/how-to-escape-latex-special-characters\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar defaultEscapes = {\n \"{\": \"\\\\{\",\n \"}\": \"\\\\}\",\n \"\\\\\": \"\\\\textbackslash{}\",\n \"#\": \"\\\\#\",\n $: \"\\\\$\",\n \"%\": \"\\\\%\",\n \"&\": \"\\\\&\",\n \"^\": \"\\\\textasciicircum{}\",\n _: \"\\\\_\",\n \"~\": \"\\\\textasciitilde{}\"\n};\nvar formatEscapes = {\n \"\\u2013\": \"\\\\--\",\n \"\\u2014\": \"\\\\---\",\n \" \": \"~\",\n \"\\t\": \"\\\\qquad{}\",\n \"\\r\\n\": \"\\\\newline{}\",\n \"\\n\": \"\\\\newline{}\"\n};\n\nvar defaultEscapeMapFn = function defaultEscapeMapFn(defaultEscapes, formatEscapes) {\n return _extends({}, defaultEscapes, formatEscapes);\n};\n\n/**\n * Escape a string to be used in LaTeX documents.\n * @param {string} str the string to be escaped.\n * @param {boolean} params.preserveFormatting whether formatting escapes should\n * be performed (default: false).\n * @param {function} params.escapeMapFn the function to modify the escape maps.\n * @return {string} the escaped string, ready to be used in LaTeX.\n */\nmodule.exports = function (str) {\n var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n _ref$preserveFormatti = _ref.preserveFormatting,\n preserveFormatting = _ref$preserveFormatti === undefined ? false : _ref$preserveFormatti,\n _ref$escapeMapFn = _ref.escapeMapFn,\n escapeMapFn = _ref$escapeMapFn === undefined ? defaultEscapeMapFn : _ref$escapeMapFn;\n\n var runningStr = String(str);\n var result = \"\";\n\n var escapes = escapeMapFn(_extends({}, defaultEscapes), preserveFormatting ? _extends({}, formatEscapes) : {});\n var escapeKeys = Object.keys(escapes); // as it is reused later on\n\n // Algorithm: Go through the string character by character, if it matches\n // with one of the special characters then we'll replace it with the escaped\n // version.\n\n var _loop = function _loop() {\n var specialCharFound = false;\n escapeKeys.forEach(function (key, index) {\n if (specialCharFound) {\n return;\n }\n if (runningStr.length >= key.length && runningStr.slice(0, key.length) === key) {\n result += escapes[escapeKeys[index]];\n runningStr = runningStr.slice(key.length, runningStr.length);\n specialCharFound = true;\n }\n });\n if (!specialCharFound) {\n result += runningStr.slice(0, 1);\n runningStr = runningStr.slice(1, runningStr.length);\n }\n };\n\n while (runningStr) {\n _loop();\n }\n return result;\n};","/**\n * @license Fraction.js v4.2.0 05/03/2022\n * https://www.xarg.org/2014/03/rational-numbers-in-javascript/\n *\n * Copyright (c) 2021, Robert Eisele (robert@xarg.org)\n * Dual licensed under the MIT or GPL Version 2 licenses.\n **/\n\n\n/**\n *\n * This class offers the possibility to calculate fractions.\n * You can pass a fraction in different formats. Either as array, as double, as string or as an integer.\n *\n * Array/Object form\n * [ 0 => , 1 => ]\n * [ n => , d => ]\n *\n * Integer form\n * - Single integer value\n *\n * Double form\n * - Single double value\n *\n * String form\n * 123.456 - a simple double\n * 123/456 - a string fraction\n * 123.'456' - a double with repeating decimal places\n * 123.(456) - synonym\n * 123.45'6' - a double with repeating last place\n * 123.45(6) - synonym\n *\n * Example:\n *\n * var f = new Fraction(\"9.4'31'\");\n * f.mul([-4, 3]).div(4.9);\n *\n */\n\n(function(root) {\n\n \"use strict\";\n\n // Maximum search depth for cyclic rational numbers. 2000 should be more than enough.\n // Example: 1/7 = 0.(142857) has 6 repeating decimal places.\n // If MAX_CYCLE_LEN gets reduced, long cycles will not be detected and toString() only gets the first 10 digits\n var MAX_CYCLE_LEN = 2000;\n\n // Parsed data to avoid calling \"new\" all the time\n var P = {\n \"s\": 1,\n \"n\": 0,\n \"d\": 1\n };\n\n function assign(n, s) {\n\n if (isNaN(n = parseInt(n, 10))) {\n throw Fraction['InvalidParameter'];\n }\n return n * s;\n }\n\n // Creates a new Fraction internally without the need of the bulky constructor\n function newFraction(n, d) {\n\n if (d === 0) {\n throw Fraction['DivisionByZero'];\n }\n\n var f = Object.create(Fraction.prototype);\n f[\"s\"] = n < 0 ? -1 : 1;\n\n n = n < 0 ? -n : n;\n\n var a = gcd(n, d);\n\n f[\"n\"] = n / a;\n f[\"d\"] = d / a;\n return f;\n }\n\n function factorize(num) {\n\n var factors = {};\n\n var n = num;\n var i = 2;\n var s = 4;\n\n while (s <= n) {\n\n while (n % i === 0) {\n n/= i;\n factors[i] = (factors[i] || 0) + 1;\n }\n s+= 1 + 2 * i++;\n }\n\n if (n !== num) {\n if (n > 1)\n factors[n] = (factors[n] || 0) + 1;\n } else {\n factors[num] = (factors[num] || 0) + 1;\n }\n return factors;\n }\n\n var parse = function(p1, p2) {\n\n var n = 0, d = 1, s = 1;\n var v = 0, w = 0, x = 0, y = 1, z = 1;\n\n var A = 0, B = 1;\n var C = 1, D = 1;\n\n var N = 10000000;\n var M;\n\n if (p1 === undefined || p1 === null) {\n /* void */\n } else if (p2 !== undefined) {\n n = p1;\n d = p2;\n s = n * d;\n\n if (n % 1 !== 0 || d % 1 !== 0) {\n throw Fraction['NonIntegerParameter'];\n }\n\n } else\n switch (typeof p1) {\n\n case \"object\":\n {\n if (\"d\" in p1 && \"n\" in p1) {\n n = p1[\"n\"];\n d = p1[\"d\"];\n if (\"s\" in p1)\n n*= p1[\"s\"];\n } else if (0 in p1) {\n n = p1[0];\n if (1 in p1)\n d = p1[1];\n } else {\n throw Fraction['InvalidParameter'];\n }\n s = n * d;\n break;\n }\n case \"number\":\n {\n if (p1 < 0) {\n s = p1;\n p1 = -p1;\n }\n\n if (p1 % 1 === 0) {\n n = p1;\n } else if (p1 > 0) { // check for != 0, scale would become NaN (log(0)), which converges really slow\n\n if (p1 >= 1) {\n z = Math.pow(10, Math.floor(1 + Math.log(p1) / Math.LN10));\n p1/= z;\n }\n\n // Using Farey Sequences\n // http://www.johndcook.com/blog/2010/10/20/best-rational-approximation/\n\n while (B <= N && D <= N) {\n M = (A + C) / (B + D);\n\n if (p1 === M) {\n if (B + D <= N) {\n n = A + C;\n d = B + D;\n } else if (D > B) {\n n = C;\n d = D;\n } else {\n n = A;\n d = B;\n }\n break;\n\n } else {\n\n if (p1 > M) {\n A+= C;\n B+= D;\n } else {\n C+= A;\n D+= B;\n }\n\n if (B > N) {\n n = C;\n d = D;\n } else {\n n = A;\n d = B;\n }\n }\n }\n n*= z;\n } else if (isNaN(p1) || isNaN(p2)) {\n d = n = NaN;\n }\n break;\n }\n case \"string\":\n {\n B = p1.match(/\\d+|./g);\n\n if (B === null)\n throw Fraction['InvalidParameter'];\n\n if (B[A] === '-') {// Check for minus sign at the beginning\n s = -1;\n A++;\n } else if (B[A] === '+') {// Check for plus sign at the beginning\n A++;\n }\n\n if (B.length === A + 1) { // Check if it's just a simple number \"1234\"\n w = assign(B[A++], s);\n } else if (B[A + 1] === '.' || B[A] === '.') { // Check if it's a decimal number\n\n if (B[A] !== '.') { // Handle 0.5 and .5\n v = assign(B[A++], s);\n }\n A++;\n\n // Check for decimal places\n if (A + 1 === B.length || B[A + 1] === '(' && B[A + 3] === ')' || B[A + 1] === \"'\" && B[A + 3] === \"'\") {\n w = assign(B[A], s);\n y = Math.pow(10, B[A].length);\n A++;\n }\n\n // Check for repeating places\n if (B[A] === '(' && B[A + 2] === ')' || B[A] === \"'\" && B[A + 2] === \"'\") {\n x = assign(B[A + 1], s);\n z = Math.pow(10, B[A + 1].length) - 1;\n A+= 3;\n }\n\n } else if (B[A + 1] === '/' || B[A + 1] === ':') { // Check for a simple fraction \"123/456\" or \"123:456\"\n w = assign(B[A], s);\n y = assign(B[A + 2], 1);\n A+= 3;\n } else if (B[A + 3] === '/' && B[A + 1] === ' ') { // Check for a complex fraction \"123 1/2\"\n v = assign(B[A], s);\n w = assign(B[A + 2], s);\n y = assign(B[A + 4], 1);\n A+= 5;\n }\n\n if (B.length <= A) { // Check for more tokens on the stack\n d = y * z;\n s = /* void */\n n = x + d * v + z * w;\n break;\n }\n\n /* Fall through on error */\n }\n default:\n throw Fraction['InvalidParameter'];\n }\n\n if (d === 0) {\n throw Fraction['DivisionByZero'];\n }\n\n P[\"s\"] = s < 0 ? -1 : 1;\n P[\"n\"] = Math.abs(n);\n P[\"d\"] = Math.abs(d);\n };\n\n function modpow(b, e, m) {\n\n var r = 1;\n for (; e > 0; b = (b * b) % m, e >>= 1) {\n\n if (e & 1) {\n r = (r * b) % m;\n }\n }\n return r;\n }\n\n\n function cycleLen(n, d) {\n\n for (; d % 2 === 0;\n d/= 2) {\n }\n\n for (; d % 5 === 0;\n d/= 5) {\n }\n\n if (d === 1) // Catch non-cyclic numbers\n return 0;\n\n // If we would like to compute really large numbers quicker, we could make use of Fermat's little theorem:\n // 10^(d-1) % d == 1\n // However, we don't need such large numbers and MAX_CYCLE_LEN should be the capstone,\n // as we want to translate the numbers to strings.\n\n var rem = 10 % d;\n var t = 1;\n\n for (; rem !== 1; t++) {\n rem = rem * 10 % d;\n\n if (t > MAX_CYCLE_LEN)\n return 0; // Returning 0 here means that we don't print it as a cyclic number. It's likely that the answer is `d-1`\n }\n return t;\n }\n\n\n function cycleStart(n, d, len) {\n\n var rem1 = 1;\n var rem2 = modpow(10, len, d);\n\n for (var t = 0; t < 300; t++) { // s < ~log10(Number.MAX_VALUE)\n // Solve 10^s == 10^(s+t) (mod d)\n\n if (rem1 === rem2)\n return t;\n\n rem1 = rem1 * 10 % d;\n rem2 = rem2 * 10 % d;\n }\n return 0;\n }\n\n function gcd(a, b) {\n\n if (!a)\n return b;\n if (!b)\n return a;\n\n while (1) {\n a%= b;\n if (!a)\n return b;\n b%= a;\n if (!b)\n return a;\n }\n };\n\n /**\n * Module constructor\n *\n * @constructor\n * @param {number|Fraction=} a\n * @param {number=} b\n */\n function Fraction(a, b) {\n\n parse(a, b);\n\n if (this instanceof Fraction) {\n a = gcd(P[\"d\"], P[\"n\"]); // Abuse variable a\n this[\"s\"] = P[\"s\"];\n this[\"n\"] = P[\"n\"] / a;\n this[\"d\"] = P[\"d\"] / a;\n } else {\n return newFraction(P['s'] * P['n'], P['d']);\n }\n }\n\n Fraction['DivisionByZero'] = new Error(\"Division by Zero\");\n Fraction['InvalidParameter'] = new Error(\"Invalid argument\");\n Fraction['NonIntegerParameter'] = new Error(\"Parameters must be integer\");\n\n Fraction.prototype = {\n\n \"s\": 1,\n \"n\": 0,\n \"d\": 1,\n\n /**\n * Calculates the absolute value\n *\n * Ex: new Fraction(-4).abs() => 4\n **/\n \"abs\": function() {\n\n return newFraction(this[\"n\"], this[\"d\"]);\n },\n\n /**\n * Inverts the sign of the current fraction\n *\n * Ex: new Fraction(-4).neg() => 4\n **/\n \"neg\": function() {\n\n return newFraction(-this[\"s\"] * this[\"n\"], this[\"d\"]);\n },\n\n /**\n * Adds two rational numbers\n *\n * Ex: new Fraction({n: 2, d: 3}).add(\"14.9\") => 467 / 30\n **/\n \"add\": function(a, b) {\n\n parse(a, b);\n return newFraction(\n this[\"s\"] * this[\"n\"] * P[\"d\"] + P[\"s\"] * this[\"d\"] * P[\"n\"],\n this[\"d\"] * P[\"d\"]\n );\n },\n\n /**\n * Subtracts two rational numbers\n *\n * Ex: new Fraction({n: 2, d: 3}).add(\"14.9\") => -427 / 30\n **/\n \"sub\": function(a, b) {\n\n parse(a, b);\n return newFraction(\n this[\"s\"] * this[\"n\"] * P[\"d\"] - P[\"s\"] * this[\"d\"] * P[\"n\"],\n this[\"d\"] * P[\"d\"]\n );\n },\n\n /**\n * Multiplies two rational numbers\n *\n * Ex: new Fraction(\"-17.(345)\").mul(3) => 5776 / 111\n **/\n \"mul\": function(a, b) {\n\n parse(a, b);\n return newFraction(\n this[\"s\"] * P[\"s\"] * this[\"n\"] * P[\"n\"],\n this[\"d\"] * P[\"d\"]\n );\n },\n\n /**\n * Divides two rational numbers\n *\n * Ex: new Fraction(\"-17.(345)\").inverse().div(3)\n **/\n \"div\": function(a, b) {\n\n parse(a, b);\n return newFraction(\n this[\"s\"] * P[\"s\"] * this[\"n\"] * P[\"d\"],\n this[\"d\"] * P[\"n\"]\n );\n },\n\n /**\n * Clones the actual object\n *\n * Ex: new Fraction(\"-17.(345)\").clone()\n **/\n \"clone\": function() {\n return newFraction(this['s'] * this['n'], this['d']);\n },\n\n /**\n * Calculates the modulo of two rational numbers - a more precise fmod\n *\n * Ex: new Fraction('4.(3)').mod([7, 8]) => (13/3) % (7/8) = (5/6)\n **/\n \"mod\": function(a, b) {\n\n if (isNaN(this['n']) || isNaN(this['d'])) {\n return new Fraction(NaN);\n }\n\n if (a === undefined) {\n return newFraction(this[\"s\"] * this[\"n\"] % this[\"d\"], 1);\n }\n\n parse(a, b);\n if (0 === P[\"n\"] && 0 === this[\"d\"]) {\n throw Fraction['DivisionByZero'];\n }\n\n /*\n * First silly attempt, kinda slow\n *\n return that[\"sub\"]({\n \"n\": num[\"n\"] * Math.floor((this.n / this.d) / (num.n / num.d)),\n \"d\": num[\"d\"],\n \"s\": this[\"s\"]\n });*/\n\n /*\n * New attempt: a1 / b1 = a2 / b2 * q + r\n * => b2 * a1 = a2 * b1 * q + b1 * b2 * r\n * => (b2 * a1 % a2 * b1) / (b1 * b2)\n */\n return newFraction(\n this[\"s\"] * (P[\"d\"] * this[\"n\"]) % (P[\"n\"] * this[\"d\"]),\n P[\"d\"] * this[\"d\"]\n );\n },\n\n /**\n * Calculates the fractional gcd of two rational numbers\n *\n * Ex: new Fraction(5,8).gcd(3,7) => 1/56\n */\n \"gcd\": function(a, b) {\n\n parse(a, b);\n\n // gcd(a / b, c / d) = gcd(a, c) / lcm(b, d)\n\n return newFraction(gcd(P[\"n\"], this[\"n\"]) * gcd(P[\"d\"], this[\"d\"]), P[\"d\"] * this[\"d\"]);\n },\n\n /**\n * Calculates the fractional lcm of two rational numbers\n *\n * Ex: new Fraction(5,8).lcm(3,7) => 15\n */\n \"lcm\": function(a, b) {\n\n parse(a, b);\n\n // lcm(a / b, c / d) = lcm(a, c) / gcd(b, d)\n\n if (P[\"n\"] === 0 && this[\"n\"] === 0) {\n return newFraction(0, 1);\n }\n return newFraction(P[\"n\"] * this[\"n\"], gcd(P[\"n\"], this[\"n\"]) * gcd(P[\"d\"], this[\"d\"]));\n },\n\n /**\n * Calculates the ceil of a rational number\n *\n * Ex: new Fraction('4.(3)').ceil() => (5 / 1)\n **/\n \"ceil\": function(places) {\n\n places = Math.pow(10, places || 0);\n\n if (isNaN(this[\"n\"]) || isNaN(this[\"d\"])) {\n return new Fraction(NaN);\n }\n return newFraction(Math.ceil(places * this[\"s\"] * this[\"n\"] / this[\"d\"]), places);\n },\n\n /**\n * Calculates the floor of a rational number\n *\n * Ex: new Fraction('4.(3)').floor() => (4 / 1)\n **/\n \"floor\": function(places) {\n\n places = Math.pow(10, places || 0);\n\n if (isNaN(this[\"n\"]) || isNaN(this[\"d\"])) {\n return new Fraction(NaN);\n }\n return newFraction(Math.floor(places * this[\"s\"] * this[\"n\"] / this[\"d\"]), places);\n },\n\n /**\n * Rounds a rational numbers\n *\n * Ex: new Fraction('4.(3)').round() => (4 / 1)\n **/\n \"round\": function(places) {\n\n places = Math.pow(10, places || 0);\n\n if (isNaN(this[\"n\"]) || isNaN(this[\"d\"])) {\n return new Fraction(NaN);\n }\n return newFraction(Math.round(places * this[\"s\"] * this[\"n\"] / this[\"d\"]), places);\n },\n\n /**\n * Gets the inverse of the fraction, means numerator and denominator are exchanged\n *\n * Ex: new Fraction([-3, 4]).inverse() => -4 / 3\n **/\n \"inverse\": function() {\n\n return newFraction(this[\"s\"] * this[\"d\"], this[\"n\"]);\n },\n\n /**\n * Calculates the fraction to some rational exponent, if possible\n *\n * Ex: new Fraction(-1,2).pow(-3) => -8\n */\n \"pow\": function(a, b) {\n\n parse(a, b);\n\n // Trivial case when exp is an integer\n\n if (P['d'] === 1) {\n\n if (P['s'] < 0) {\n return newFraction(Math.pow(this['s'] * this[\"d\"], P['n']), Math.pow(this[\"n\"], P['n']));\n } else {\n return newFraction(Math.pow(this['s'] * this[\"n\"], P['n']), Math.pow(this[\"d\"], P['n']));\n }\n }\n\n // Negative roots become complex\n // (-a/b)^(c/d) = x\n // <=> (-1)^(c/d) * (a/b)^(c/d) = x\n // <=> (cos(pi) + i*sin(pi))^(c/d) * (a/b)^(c/d) = x # rotate 1 by 180°\n // <=> (cos(c*pi/d) + i*sin(c*pi/d)) * (a/b)^(c/d) = x # DeMoivre's formula in Q ( https://proofwiki.org/wiki/De_Moivre%27s_Formula/Rational_Index )\n // From which follows that only for c=0 the root is non-complex. c/d is a reduced fraction, so that sin(c/dpi)=0 occurs for d=1, which is handled by our trivial case.\n if (this['s'] < 0) return null;\n\n // Now prime factor n and d\n var N = factorize(this['n']);\n var D = factorize(this['d']);\n\n // Exponentiate and take root for n and d individually\n var n = 1;\n var d = 1;\n for (var k in N) {\n if (k === '1') continue;\n if (k === '0') {\n n = 0;\n break;\n }\n N[k]*= P['n'];\n\n if (N[k] % P['d'] === 0) {\n N[k]/= P['d'];\n } else return null;\n n*= Math.pow(k, N[k]);\n }\n\n for (var k in D) {\n if (k === '1') continue;\n D[k]*= P['n'];\n\n if (D[k] % P['d'] === 0) {\n D[k]/= P['d'];\n } else return null;\n d*= Math.pow(k, D[k]);\n }\n\n if (P['s'] < 0) {\n return newFraction(d, n);\n }\n return newFraction(n, d);\n },\n\n /**\n * Check if two rational numbers are the same\n *\n * Ex: new Fraction(19.6).equals([98, 5]);\n **/\n \"equals\": function(a, b) {\n\n parse(a, b);\n return this[\"s\"] * this[\"n\"] * P[\"d\"] === P[\"s\"] * P[\"n\"] * this[\"d\"]; // Same as compare() === 0\n },\n\n /**\n * Check if two rational numbers are the same\n *\n * Ex: new Fraction(19.6).equals([98, 5]);\n **/\n \"compare\": function(a, b) {\n\n parse(a, b);\n var t = (this[\"s\"] * this[\"n\"] * P[\"d\"] - P[\"s\"] * P[\"n\"] * this[\"d\"]);\n return (0 < t) - (t < 0);\n },\n\n \"simplify\": function(eps) {\n\n if (isNaN(this['n']) || isNaN(this['d'])) {\n return this;\n }\n\n eps = eps || 0.001;\n\n var thisABS = this['abs']();\n var cont = thisABS['toContinued']();\n\n for (var i = 1; i < cont.length; i++) {\n\n var s = newFraction(cont[i - 1], 1);\n for (var k = i - 2; k >= 0; k--) {\n s = s['inverse']()['add'](cont[k]);\n }\n\n if (s['sub'](thisABS)['abs']().valueOf() < eps) {\n return s['mul'](this['s']);\n }\n }\n return this;\n },\n\n /**\n * Check if two rational numbers are divisible\n *\n * Ex: new Fraction(19.6).divisible(1.5);\n */\n \"divisible\": function(a, b) {\n\n parse(a, b);\n return !(!(P[\"n\"] * this[\"d\"]) || ((this[\"n\"] * P[\"d\"]) % (P[\"n\"] * this[\"d\"])));\n },\n\n /**\n * Returns a decimal representation of the fraction\n *\n * Ex: new Fraction(\"100.'91823'\").valueOf() => 100.91823918239183\n **/\n 'valueOf': function() {\n\n return this[\"s\"] * this[\"n\"] / this[\"d\"];\n },\n\n /**\n * Returns a string-fraction representation of a Fraction object\n *\n * Ex: new Fraction(\"1.'3'\").toFraction(true) => \"4 1/3\"\n **/\n 'toFraction': function(excludeWhole) {\n\n var whole, str = \"\";\n var n = this[\"n\"];\n var d = this[\"d\"];\n if (this[\"s\"] < 0) {\n str+= '-';\n }\n\n if (d === 1) {\n str+= n;\n } else {\n\n if (excludeWhole && (whole = Math.floor(n / d)) > 0) {\n str+= whole;\n str+= \" \";\n n%= d;\n }\n\n str+= n;\n str+= '/';\n str+= d;\n }\n return str;\n },\n\n /**\n * Returns a latex representation of a Fraction object\n *\n * Ex: new Fraction(\"1.'3'\").toLatex() => \"\\frac{4}{3}\"\n **/\n 'toLatex': function(excludeWhole) {\n\n var whole, str = \"\";\n var n = this[\"n\"];\n var d = this[\"d\"];\n if (this[\"s\"] < 0) {\n str+= '-';\n }\n\n if (d === 1) {\n str+= n;\n } else {\n\n if (excludeWhole && (whole = Math.floor(n / d)) > 0) {\n str+= whole;\n n%= d;\n }\n\n str+= \"\\\\frac{\";\n str+= n;\n str+= '}{';\n str+= d;\n str+= '}';\n }\n return str;\n },\n\n /**\n * Returns an array of continued fraction elements\n *\n * Ex: new Fraction(\"7/8\").toContinued() => [0,1,7]\n */\n 'toContinued': function() {\n\n var t;\n var a = this['n'];\n var b = this['d'];\n var res = [];\n\n if (isNaN(a) || isNaN(b)) {\n return res;\n }\n\n do {\n res.push(Math.floor(a / b));\n t = a % b;\n a = b;\n b = t;\n } while (a !== 1);\n\n return res;\n },\n\n /**\n * Creates a string representation of a fraction with all digits\n *\n * Ex: new Fraction(\"100.'91823'\").toString() => \"100.(91823)\"\n **/\n 'toString': function(dec) {\n\n var N = this[\"n\"];\n var D = this[\"d\"];\n\n if (isNaN(N) || isNaN(D)) {\n return \"NaN\";\n }\n\n dec = dec || 15; // 15 = decimal places when no repetation\n\n var cycLen = cycleLen(N, D); // Cycle length\n var cycOff = cycleStart(N, D, cycLen); // Cycle start\n\n var str = this['s'] < 0 ? \"-\" : \"\";\n\n str+= N / D | 0;\n\n N%= D;\n N*= 10;\n\n if (N)\n str+= \".\";\n\n if (cycLen) {\n\n for (var i = cycOff; i--;) {\n str+= N / D | 0;\n N%= D;\n N*= 10;\n }\n str+= \"(\";\n for (var i = cycLen; i--;) {\n str+= N / D | 0;\n N%= D;\n N*= 10;\n }\n str+= \")\";\n } else {\n for (var i = dec; N && i--;) {\n str+= N / D | 0;\n N%= D;\n N*= 10;\n }\n }\n return str;\n }\n };\n\n if (typeof define === \"function\" && define[\"amd\"]) {\n define([], function() {\n return Fraction;\n });\n } else if (typeof exports === \"object\") {\n Object.defineProperty(Fraction, \"__esModule\", { 'value': true });\n Fraction['default'] = Fraction;\n Fraction['Fraction'] = Fraction;\n module['exports'] = Fraction;\n } else {\n root['Fraction'] = Fraction;\n }\n\n})(this);\n","/*\r\n * Natural Sort algorithm for Javascript - Version 0.7 - Released under MIT license\r\n * Author: Jim Palmer (based on chunking idea from Dave Koelle)\r\n */\r\n/*jshint unused:false */\r\nmodule.exports = function naturalSort (a, b) {\r\n\t\"use strict\";\r\n\tvar re = /(^([+\\-]?(?:0|[1-9]\\d*)(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?)?$|^0x[0-9a-f]+$|\\d+)/gi,\r\n\t\tsre = /(^[ ]*|[ ]*$)/g,\r\n\t\tdre = /(^([\\w ]+,?[\\w ]+)?[\\w ]+,?[\\w ]+\\d+:\\d+(:\\d+)?[\\w ]?|^\\d{1,4}[\\/\\-]\\d{1,4}[\\/\\-]\\d{1,4}|^\\w+, \\w+ \\d+, \\d{4})/,\r\n\t\thre = /^0x[0-9a-f]+$/i,\r\n\t\tore = /^0/,\r\n\t\ti = function(s) { return naturalSort.insensitive && ('' + s).toLowerCase() || '' + s; },\r\n\t\t// convert all to strings strip whitespace\r\n\t\tx = i(a).replace(sre, '') || '',\r\n\t\ty = i(b).replace(sre, '') || '',\r\n\t\t// chunk/tokenize\r\n\t\txN = x.replace(re, '\\0$1\\0').replace(/\\0$/,'').replace(/^\\0/,'').split('\\0'),\r\n\t\tyN = y.replace(re, '\\0$1\\0').replace(/\\0$/,'').replace(/^\\0/,'').split('\\0'),\r\n\t\t// numeric, hex or date detection\r\n\t\txD = parseInt(x.match(hre), 16) || (xN.length !== 1 && x.match(dre) && Date.parse(x)),\r\n\t\tyD = parseInt(y.match(hre), 16) || xD && y.match(dre) && Date.parse(y) || null,\r\n\t\toFxNcL, oFyNcL;\r\n\t// first try and sort Hex codes or Dates\r\n\tif (yD) {\r\n\t\tif ( xD < yD ) { return -1; }\r\n\t\telse if ( xD > yD ) { return 1; }\r\n\t}\r\n\t// natural sorting through split numeric strings and default strings\r\n\tfor(var cLoc=0, numS=Math.max(xN.length, yN.length); cLoc < numS; cLoc++) {\r\n\t\t// find floats not starting with '0', string or 0 if not defined (Clint Priest)\r\n\t\toFxNcL = !(xN[cLoc] || '').match(ore) && parseFloat(xN[cLoc]) || xN[cLoc] || 0;\r\n\t\toFyNcL = !(yN[cLoc] || '').match(ore) && parseFloat(yN[cLoc]) || yN[cLoc] || 0;\r\n\t\t// handle numeric vs string comparison - number < string - (Kyle Adams)\r\n\t\tif (isNaN(oFxNcL) !== isNaN(oFyNcL)) { return (isNaN(oFxNcL)) ? 1 : -1; }\r\n\t\t// rely on string comparison if different types - i.e. '02' < 2 != '02' < '2'\r\n\t\telse if (typeof oFxNcL !== typeof oFyNcL) {\r\n\t\t\toFxNcL += '';\r\n\t\t\toFyNcL += '';\r\n\t\t}\r\n\t\tif (oFxNcL < oFyNcL) { return -1; }\r\n\t\tif (oFxNcL > oFyNcL) { return 1; }\r\n\t}\r\n\treturn 0;\r\n};\r\n","function E () {\n // Keep this empty so it's easier to inherit from\n // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)\n}\n\nE.prototype = {\n on: function (name, callback, ctx) {\n var e = this.e || (this.e = {});\n\n (e[name] || (e[name] = [])).push({\n fn: callback,\n ctx: ctx\n });\n\n return this;\n },\n\n once: function (name, callback, ctx) {\n var self = this;\n function listener () {\n self.off(name, listener);\n callback.apply(ctx, arguments);\n };\n\n listener._ = callback\n return this.on(name, listener, ctx);\n },\n\n emit: function (name) {\n var data = [].slice.call(arguments, 1);\n var evtArr = ((this.e || (this.e = {}))[name] || []).slice();\n var i = 0;\n var len = evtArr.length;\n\n for (i; i < len; i++) {\n evtArr[i].fn.apply(evtArr[i].ctx, data);\n }\n\n return this;\n },\n\n off: function (name, callback) {\n var e = this.e || (this.e = {});\n var evts = e[name];\n var liveEvents = [];\n\n if (evts && callback) {\n for (var i = 0, len = evts.length; i < len; i++) {\n if (evts[i].fn !== callback && evts[i].fn._ !== callback)\n liveEvents.push(evts[i]);\n }\n }\n\n // Remove event from queue to prevent memory leak\n // Suggested by https://github.com/lazd\n // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910\n\n (liveEvents.length)\n ? e[name] = liveEvents\n : delete e[name];\n\n return this;\n }\n};\n\nmodule.exports = E;\nmodule.exports.TinyEmitter = E;\n","export var DEFAULT_CONFIG = {\n // minimum relative difference between two compared values,\n // used by all comparison functions\n epsilon: 1e-12,\n // type of default matrix output. Choose 'matrix' (default) or 'array'\n matrix: 'Matrix',\n // type of default number output. Choose 'number' (default) 'BigNumber', or 'Fraction\n number: 'number',\n // number of significant digits in BigNumbers\n precision: 64,\n // predictable output type of functions. When true, output type depends only\n // on the input types. When false (default), output type can vary depending\n // on input values. For example `math.sqrt(-4)` returns `complex('2i')` when\n // predictable is false, and returns `NaN` when true.\n predictable: false,\n // random seed for seeded pseudo random number generation\n // null = randomly seed\n randomSeed: null\n};","// type checks for all known types\n//\n// note that:\n//\n// - check by duck-typing on a property like `isUnit`, instead of checking instanceof.\n// instanceof cannot be used because that would not allow to pass data from\n// one instance of math.js to another since each has it's own instance of Unit.\n// - check the `isUnit` property via the constructor, so there will be no\n// matches for \"fake\" instances like plain objects with a property `isUnit`.\n// That is important for security reasons.\n// - It must not be possible to override the type checks used internally,\n// for security reasons, so these functions are not exposed in the expression\n// parser.\n\nexport function isNumber(x) {\n return typeof x === 'number';\n}\nexport function isBigNumber(x) {\n if (!x || typeof x !== 'object' || typeof x.constructor !== 'function') {\n return false;\n }\n if (x.isBigNumber === true && typeof x.constructor.prototype === 'object' && x.constructor.prototype.isBigNumber === true) {\n return true;\n }\n if (typeof x.constructor.isDecimal === 'function' && x.constructor.isDecimal(x) === true) {\n return true;\n }\n return false;\n}\nexport function isComplex(x) {\n return x && typeof x === 'object' && Object.getPrototypeOf(x).isComplex === true || false;\n}\nexport function isFraction(x) {\n return x && typeof x === 'object' && Object.getPrototypeOf(x).isFraction === true || false;\n}\nexport function isUnit(x) {\n return x && x.constructor.prototype.isUnit === true || false;\n}\nexport function isString(x) {\n return typeof x === 'string';\n}\nexport var isArray = Array.isArray;\nexport function isMatrix(x) {\n return x && x.constructor.prototype.isMatrix === true || false;\n}\n\n/**\n * Test whether a value is a collection: an Array or Matrix\n * @param {*} x\n * @returns {boolean} isCollection\n */\nexport function isCollection(x) {\n return Array.isArray(x) || isMatrix(x);\n}\nexport function isDenseMatrix(x) {\n return x && x.isDenseMatrix && x.constructor.prototype.isMatrix === true || false;\n}\nexport function isSparseMatrix(x) {\n return x && x.isSparseMatrix && x.constructor.prototype.isMatrix === true || false;\n}\nexport function isRange(x) {\n return x && x.constructor.prototype.isRange === true || false;\n}\nexport function isIndex(x) {\n return x && x.constructor.prototype.isIndex === true || false;\n}\nexport function isBoolean(x) {\n return typeof x === 'boolean';\n}\nexport function isResultSet(x) {\n return x && x.constructor.prototype.isResultSet === true || false;\n}\nexport function isHelp(x) {\n return x && x.constructor.prototype.isHelp === true || false;\n}\nexport function isFunction(x) {\n return typeof x === 'function';\n}\nexport function isDate(x) {\n return x instanceof Date;\n}\nexport function isRegExp(x) {\n return x instanceof RegExp;\n}\nexport function isObject(x) {\n return !!(x && typeof x === 'object' && x.constructor === Object && !isComplex(x) && !isFraction(x));\n}\nexport function isNull(x) {\n return x === null;\n}\nexport function isUndefined(x) {\n return x === undefined;\n}\nexport function isAccessorNode(x) {\n return x && x.isAccessorNode === true && x.constructor.prototype.isNode === true || false;\n}\nexport function isArrayNode(x) {\n return x && x.isArrayNode === true && x.constructor.prototype.isNode === true || false;\n}\nexport function isAssignmentNode(x) {\n return x && x.isAssignmentNode === true && x.constructor.prototype.isNode === true || false;\n}\nexport function isBlockNode(x) {\n return x && x.isBlockNode === true && x.constructor.prototype.isNode === true || false;\n}\nexport function isConditionalNode(x) {\n return x && x.isConditionalNode === true && x.constructor.prototype.isNode === true || false;\n}\nexport function isConstantNode(x) {\n return x && x.isConstantNode === true && x.constructor.prototype.isNode === true || false;\n}\n\n/* Very specialized: returns true for those nodes which in the numerator of\n a fraction means that the division in that fraction has precedence over implicit\n multiplication, e.g. -2/3 x parses as (-2/3) x and 3/4 x parses as (3/4) x but\n 6!/8 x parses as 6! / (8x). It is located here because it is shared between\n parse.js and OperatorNode.js (for parsing and printing, respectively).\n\n This should *not* be exported from mathjs, unlike most of the tests here.\n Its name does not start with 'is' to prevent utils/snapshot.js from thinking\n it should be exported.\n*/\nexport function rule2Node(node) {\n return isConstantNode(node) || isOperatorNode(node) && node.args.length === 1 && isConstantNode(node.args[0]) && '-+~'.includes(node.op);\n}\nexport function isFunctionAssignmentNode(x) {\n return x && x.isFunctionAssignmentNode === true && x.constructor.prototype.isNode === true || false;\n}\nexport function isFunctionNode(x) {\n return x && x.isFunctionNode === true && x.constructor.prototype.isNode === true || false;\n}\nexport function isIndexNode(x) {\n return x && x.isIndexNode === true && x.constructor.prototype.isNode === true || false;\n}\nexport function isNode(x) {\n return x && x.isNode === true && x.constructor.prototype.isNode === true || false;\n}\nexport function isObjectNode(x) {\n return x && x.isObjectNode === true && x.constructor.prototype.isNode === true || false;\n}\nexport function isOperatorNode(x) {\n return x && x.isOperatorNode === true && x.constructor.prototype.isNode === true || false;\n}\nexport function isParenthesisNode(x) {\n return x && x.isParenthesisNode === true && x.constructor.prototype.isNode === true || false;\n}\nexport function isRangeNode(x) {\n return x && x.isRangeNode === true && x.constructor.prototype.isNode === true || false;\n}\nexport function isRelationalNode(x) {\n return x && x.isRelationalNode === true && x.constructor.prototype.isNode === true || false;\n}\nexport function isSymbolNode(x) {\n return x && x.isSymbolNode === true && x.constructor.prototype.isNode === true || false;\n}\nexport function isChain(x) {\n return x && x.constructor.prototype.isChain === true || false;\n}\nexport function typeOf(x) {\n var t = typeof x;\n if (t === 'object') {\n if (x === null) return 'null';\n if (isBigNumber(x)) return 'BigNumber'; // Special: weird mashup with Decimal\n if (x.constructor && x.constructor.name) return x.constructor.name;\n return 'Object'; // just in case\n }\n\n return t; // can be 'string', 'number', 'boolean', 'function', 'bigint', ...\n}","import { isBigNumber } from './is.js';\n\n/**\n * Clone an object\n *\n * clone(x)\n *\n * Can clone any primitive type, array, and object.\n * If x has a function clone, this function will be invoked to clone the object.\n *\n * @param {*} x\n * @return {*} clone\n */\nexport function clone(x) {\n var type = typeof x;\n\n // immutable primitive types\n if (type === 'number' || type === 'string' || type === 'boolean' || x === null || x === undefined) {\n return x;\n }\n\n // use clone function of the object when available\n if (typeof x.clone === 'function') {\n return x.clone();\n }\n\n // array\n if (Array.isArray(x)) {\n return x.map(function (value) {\n return clone(value);\n });\n }\n if (x instanceof Date) return new Date(x.valueOf());\n if (isBigNumber(x)) return x; // bignumbers are immutable\n if (x instanceof RegExp) throw new TypeError('Cannot clone ' + x); // TODO: clone a RegExp\n\n // object\n return mapObject(x, clone);\n}\n\n/**\n * Apply map to all properties of an object\n * @param {Object} object\n * @param {function} callback\n * @return {Object} Returns a copy of the object with mapped properties\n */\nexport function mapObject(object, callback) {\n var clone = {};\n for (var key in object) {\n if (hasOwnProperty(object, key)) {\n clone[key] = callback(object[key]);\n }\n }\n return clone;\n}\n\n/**\n * Extend object a with the properties of object b\n * @param {Object} a\n * @param {Object} b\n * @return {Object} a\n */\nexport function extend(a, b) {\n for (var prop in b) {\n if (hasOwnProperty(b, prop)) {\n a[prop] = b[prop];\n }\n }\n return a;\n}\n\n/**\n * Deep extend an object a with the properties of object b\n * @param {Object} a\n * @param {Object} b\n * @returns {Object}\n */\nexport function deepExtend(a, b) {\n // TODO: add support for Arrays to deepExtend\n if (Array.isArray(b)) {\n throw new TypeError('Arrays are not supported by deepExtend');\n }\n for (var prop in b) {\n // We check against prop not being in Object.prototype or Function.prototype\n // to prevent polluting for example Object.__proto__.\n if (hasOwnProperty(b, prop) && !(prop in Object.prototype) && !(prop in Function.prototype)) {\n if (b[prop] && b[prop].constructor === Object) {\n if (a[prop] === undefined) {\n a[prop] = {};\n }\n if (a[prop] && a[prop].constructor === Object) {\n deepExtend(a[prop], b[prop]);\n } else {\n a[prop] = b[prop];\n }\n } else if (Array.isArray(b[prop])) {\n throw new TypeError('Arrays are not supported by deepExtend');\n } else {\n a[prop] = b[prop];\n }\n }\n }\n return a;\n}\n\n/**\n * Deep test equality of all fields in two pairs of arrays or objects.\n * Compares values and functions strictly (ie. 2 is not the same as '2').\n * @param {Array | Object} a\n * @param {Array | Object} b\n * @returns {boolean}\n */\nexport function deepStrictEqual(a, b) {\n var prop, i, len;\n if (Array.isArray(a)) {\n if (!Array.isArray(b)) {\n return false;\n }\n if (a.length !== b.length) {\n return false;\n }\n for (i = 0, len = a.length; i < len; i++) {\n if (!deepStrictEqual(a[i], b[i])) {\n return false;\n }\n }\n return true;\n } else if (typeof a === 'function') {\n return a === b;\n } else if (a instanceof Object) {\n if (Array.isArray(b) || !(b instanceof Object)) {\n return false;\n }\n for (prop in a) {\n // noinspection JSUnfilteredForInLoop\n if (!(prop in b) || !deepStrictEqual(a[prop], b[prop])) {\n return false;\n }\n }\n for (prop in b) {\n // noinspection JSUnfilteredForInLoop\n if (!(prop in a)) {\n return false;\n }\n }\n return true;\n } else {\n return a === b;\n }\n}\n\n/**\n * Recursively flatten a nested object.\n * @param {Object} nestedObject\n * @return {Object} Returns the flattened object\n */\nexport function deepFlatten(nestedObject) {\n var flattenedObject = {};\n _deepFlatten(nestedObject, flattenedObject);\n return flattenedObject;\n}\n\n// helper function used by deepFlatten\nfunction _deepFlatten(nestedObject, flattenedObject) {\n for (var prop in nestedObject) {\n if (hasOwnProperty(nestedObject, prop)) {\n var value = nestedObject[prop];\n if (typeof value === 'object' && value !== null) {\n _deepFlatten(value, flattenedObject);\n } else {\n flattenedObject[prop] = value;\n }\n }\n }\n}\n\n/**\n * Test whether the current JavaScript engine supports Object.defineProperty\n * @returns {boolean} returns true if supported\n */\nexport function canDefineProperty() {\n // test needed for broken IE8 implementation\n try {\n if (Object.defineProperty) {\n Object.defineProperty({}, 'x', {\n get: function get() {\n return null;\n }\n });\n return true;\n }\n } catch (e) {}\n return false;\n}\n\n/**\n * Attach a lazy loading property to a constant.\n * The given function `fn` is called once when the property is first requested.\n *\n * @param {Object} object Object where to add the property\n * @param {string} prop Property name\n * @param {Function} valueResolver Function returning the property value. Called\n * without arguments.\n */\nexport function lazy(object, prop, valueResolver) {\n var _uninitialized = true;\n var _value;\n Object.defineProperty(object, prop, {\n get: function get() {\n if (_uninitialized) {\n _value = valueResolver();\n _uninitialized = false;\n }\n return _value;\n },\n set: function set(value) {\n _value = value;\n _uninitialized = false;\n },\n configurable: true,\n enumerable: true\n });\n}\n\n/**\n * Traverse a path into an object.\n * When a namespace is missing, it will be created\n * @param {Object} object\n * @param {string | string[]} path A dot separated string like 'name.space'\n * @return {Object} Returns the object at the end of the path\n */\nexport function traverse(object, path) {\n if (path && typeof path === 'string') {\n return traverse(object, path.split('.'));\n }\n var obj = object;\n if (path) {\n for (var i = 0; i < path.length; i++) {\n var key = path[i];\n if (!(key in obj)) {\n obj[key] = {};\n }\n obj = obj[key];\n }\n }\n return obj;\n}\n\n/**\n * A safe hasOwnProperty\n * @param {Object} object\n * @param {string} property\n */\nexport function hasOwnProperty(object, property) {\n return object && Object.hasOwnProperty.call(object, property);\n}\n\n/**\n * Test whether an object is a factory. a factory has fields:\n *\n * - factory: function (type: Object, config: Object, load: function, typed: function [, math: Object]) (required)\n * - name: string (optional)\n * - path: string A dot separated path (optional)\n * - math: boolean If true (false by default), the math namespace is passed\n * as fifth argument of the factory function\n *\n * @param {*} object\n * @returns {boolean}\n */\nexport function isLegacyFactory(object) {\n return object && typeof object.factory === 'function';\n}\n\n/**\n * Get a nested property from an object\n * @param {Object} object\n * @param {string | string[]} path\n * @returns {Object}\n */\nexport function get(object, path) {\n if (typeof path === 'string') {\n if (isPath(path)) {\n return get(object, path.split('.'));\n } else {\n return object[path];\n }\n }\n var child = object;\n for (var i = 0; i < path.length; i++) {\n var key = path[i];\n child = child ? child[key] : undefined;\n }\n return child;\n}\n\n/**\n * Set a nested property in an object\n * Mutates the object itself\n * If the path doesn't exist, it will be created\n * @param {Object} object\n * @param {string | string[]} path\n * @param {*} value\n * @returns {Object}\n */\nexport function set(object, path, value) {\n if (typeof path === 'string') {\n if (isPath(path)) {\n return set(object, path.split('.'), value);\n } else {\n object[path] = value;\n return object;\n }\n }\n var child = object;\n for (var i = 0; i < path.length - 1; i++) {\n var key = path[i];\n if (child[key] === undefined) {\n child[key] = {};\n }\n child = child[key];\n }\n if (path.length > 0) {\n var lastKey = path[path.length - 1];\n child[lastKey] = value;\n }\n return object;\n}\n\n/**\n * Create an object composed of the picked object properties\n * @param {Object} object\n * @param {string[]} properties\n * @param {function} [transform] Optional value to transform a value when picking it\n * @return {Object}\n */\nexport function pick(object, properties, transform) {\n var copy = {};\n for (var i = 0; i < properties.length; i++) {\n var key = properties[i];\n var value = get(object, key);\n if (value !== undefined) {\n set(copy, key, transform ? transform(value, key) : value);\n }\n }\n return copy;\n}\n\n/**\n * Shallow version of pick, creating an object composed of the picked object properties\n * but not for nested properties\n * @param {Object} object\n * @param {string[]} properties\n * @return {Object}\n */\nexport function pickShallow(object, properties) {\n var copy = {};\n for (var i = 0; i < properties.length; i++) {\n var key = properties[i];\n var value = object[key];\n if (value !== undefined) {\n copy[key] = value;\n }\n }\n return copy;\n}\nexport function values(object) {\n return Object.keys(object).map(key => object[key]);\n}\n\n// helper function to test whether a string contains a path like 'user.name'\nfunction isPath(str) {\n return str.indexOf('.') !== -1;\n}","import { clone, mapObject, deepExtend } from '../../utils/object.js';\nimport { DEFAULT_CONFIG } from '../config.js';\nexport var MATRIX_OPTIONS = ['Matrix', 'Array']; // valid values for option matrix\nexport var NUMBER_OPTIONS = ['number', 'BigNumber', 'Fraction']; // valid values for option number\n\nexport function configFactory(config, emit) {\n /**\n * Set configuration options for math.js, and get current options.\n * Will emit a 'config' event, with arguments (curr, prev, changes).\n *\n * This function is only available on a mathjs instance created using `create`.\n *\n * Syntax:\n *\n * math.config(config: Object): Object\n *\n * Examples:\n *\n *\n * import { create, all } from 'mathjs'\n *\n * // create a mathjs instance\n * const math = create(all)\n *\n * math.config().number // outputs 'number'\n * math.evaluate('0.4') // outputs number 0.4\n * math.config({number: 'Fraction'})\n * math.evaluate('0.4') // outputs Fraction 2/5\n *\n * @param {Object} [options] Available options:\n * {number} epsilon\n * Minimum relative difference between two\n * compared values, used by all comparison functions.\n * {string} matrix\n * A string 'Matrix' (default) or 'Array'.\n * {string} number\n * A string 'number' (default), 'BigNumber', or 'Fraction'\n * {number} precision\n * The number of significant digits for BigNumbers.\n * Not applicable for Numbers.\n * {string} parenthesis\n * How to display parentheses in LaTeX and string\n * output.\n * {string} randomSeed\n * Random seed for seeded pseudo random number generator.\n * Set to null to randomly seed.\n * @return {Object} Returns the current configuration\n */\n function _config(options) {\n if (options) {\n var prev = mapObject(config, clone);\n\n // validate some of the options\n validateOption(options, 'matrix', MATRIX_OPTIONS);\n validateOption(options, 'number', NUMBER_OPTIONS);\n\n // merge options\n deepExtend(config, options);\n var curr = mapObject(config, clone);\n var changes = mapObject(options, clone);\n\n // emit 'config' event\n emit('config', curr, prev, changes);\n return curr;\n } else {\n return mapObject(config, clone);\n }\n }\n\n // attach the valid options to the function so they can be extended\n _config.MATRIX_OPTIONS = MATRIX_OPTIONS;\n _config.NUMBER_OPTIONS = NUMBER_OPTIONS;\n\n // attach the config properties as readonly properties to the config function\n Object.keys(DEFAULT_CONFIG).forEach(key => {\n Object.defineProperty(_config, key, {\n get: () => config[key],\n enumerable: true,\n configurable: true\n });\n });\n return _config;\n}\n\n/**\n * Test whether an Array contains a specific item.\n * @param {Array.} array\n * @param {string} item\n * @return {boolean}\n */\nfunction contains(array, item) {\n return array.indexOf(item) !== -1;\n}\n\n/**\n * Validate an option\n * @param {Object} options Object with options\n * @param {string} name Name of the option to validate\n * @param {Array.} values Array with valid values for this option\n */\nfunction validateOption(options, name, values) {\n if (options[name] !== undefined && !contains(values, options[name])) {\n // unknown value\n console.warn('Warning: Unknown value \"' + options[name] + '\" for configuration option \"' + name + '\". ' + 'Available options: ' + values.map(value => JSON.stringify(value)).join(', ') + '.');\n }\n}","import _extends from \"@babel/runtime/helpers/extends\";\nimport { DEFAULT_CONFIG } from '../core/config.js';\nimport { MATRIX_OPTIONS, NUMBER_OPTIONS } from '../core/function/config.js';\n\n// create a read-only version of config\nexport var config = /* #__PURE__ */function config(options) {\n if (options) {\n throw new Error('The global config is readonly. \\n' + 'Please create a mathjs instance if you want to change the default configuration. \\n' + 'Example:\\n' + '\\n' + ' import { create, all } from \\'mathjs\\';\\n' + ' const mathjs = create(all);\\n' + ' mathjs.config({ number: \\'BigNumber\\' });\\n');\n }\n return Object.freeze(DEFAULT_CONFIG);\n};\n_extends(config, DEFAULT_CONFIG, {\n MATRIX_OPTIONS,\n NUMBER_OPTIONS\n});","function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\nfunction ok() {\n return true;\n}\n\nfunction notOk() {\n return false;\n}\n\nfunction undef() {\n return undefined;\n}\n\nvar NOT_TYPED_FUNCTION = 'Argument is not a typed-function.';\n/**\n * @typedef {{\n * params: Param[],\n * fn: function,\n * test: function,\n * implementation: function\n * }} Signature\n *\n * @typedef {{\n * types: Type[],\n * hasAny: boolean,\n * hasConversion: boolean,\n * restParam: boolean\n * }} Param\n *\n * @typedef {{\n * name: string,\n * typeIndex: number,\n * test: function,\n * isAny: boolean,\n * conversion?: ConversionDef,\n * conversionIndex: number,\n * }} Type\n *\n * @typedef {{\n * from: string,\n * to: string,\n * convert: function (*) : *\n * }} ConversionDef\n *\n * @typedef {{\n * name: string,\n * test: function(*) : boolean,\n * isAny?: boolean\n * }} TypeDef\n */\n\n/**\n * @returns {() => function}\n */\n\nfunction create() {\n // data type tests\n\n /**\n * Returns true if the argument is a non-null \"plain\" object\n */\n function isPlainObject(x) {\n return _typeof(x) === 'object' && x !== null && x.constructor === Object;\n }\n\n var _types = [{\n name: 'number',\n test: function test(x) {\n return typeof x === 'number';\n }\n }, {\n name: 'string',\n test: function test(x) {\n return typeof x === 'string';\n }\n }, {\n name: 'boolean',\n test: function test(x) {\n return typeof x === 'boolean';\n }\n }, {\n name: 'Function',\n test: function test(x) {\n return typeof x === 'function';\n }\n }, {\n name: 'Array',\n test: Array.isArray\n }, {\n name: 'Date',\n test: function test(x) {\n return x instanceof Date;\n }\n }, {\n name: 'RegExp',\n test: function test(x) {\n return x instanceof RegExp;\n }\n }, {\n name: 'Object',\n test: isPlainObject\n }, {\n name: 'null',\n test: function test(x) {\n return x === null;\n }\n }, {\n name: 'undefined',\n test: function test(x) {\n return x === undefined;\n }\n }];\n var anyType = {\n name: 'any',\n test: ok,\n isAny: true\n }; // Data structures to track the types. As these are local variables in\n // create(), each typed universe will get its own copy, but the variables\n // will only be accessible through the (closures of the) functions supplied\n // as properties of the typed object, not directly.\n // These will be initialized in clear() below\n\n var typeMap; // primary store of all types\n\n var typeList; // Array of just type names, for the sake of ordering\n // And similar data structures for the type conversions:\n\n var nConversions = 0; // the actual conversions are stored on a property of the destination types\n // This is a temporary object, will be replaced with a function at the end\n\n var typed = {\n createCount: 0\n };\n /**\n * Takes a type name and returns the corresponding official type object\n * for that type.\n *\n * @param {string} typeName\n * @returns {TypeDef} type\n */\n\n function findType(typeName) {\n var type = typeMap.get(typeName);\n\n if (type) {\n return type;\n } // Remainder is error handling\n\n\n var message = 'Unknown type \"' + typeName + '\"';\n var name = typeName.toLowerCase();\n var otherName;\n\n var _iterator = _createForOfIteratorHelper(typeList),\n _step;\n\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n otherName = _step.value;\n\n if (otherName.toLowerCase() === name) {\n message += '. Did you mean \"' + otherName + '\" ?';\n break;\n }\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n\n throw new TypeError(message);\n }\n /**\n * Adds an array `types` of type definitions to this typed instance.\n * Each type definition should be an object with properties:\n * 'name' - a string giving the name of the type; 'test' - function\n * returning a boolean that tests membership in the type; and optionally\n * 'isAny' - true only for the 'any' type.\n *\n * The second optional argument, `before`, gives the name of a type that\n * these types should be added before. The new types are added in the\n * order specified.\n * @param {TypeDef[]} types\n * @param {string | boolean} [beforeSpec='any'] before\n */\n\n\n function addTypes(types) {\n var beforeSpec = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'any';\n var beforeIndex = beforeSpec ? findType(beforeSpec).index : typeList.length;\n var newTypes = [];\n\n for (var i = 0; i < types.length; ++i) {\n if (!types[i] || typeof types[i].name !== 'string' || typeof types[i].test !== 'function') {\n throw new TypeError('Object with properties {name: string, test: function} expected');\n }\n\n var typeName = types[i].name;\n\n if (typeMap.has(typeName)) {\n throw new TypeError('Duplicate type name \"' + typeName + '\"');\n }\n\n newTypes.push(typeName);\n typeMap.set(typeName, {\n name: typeName,\n test: types[i].test,\n isAny: types[i].isAny,\n index: beforeIndex + i,\n conversionsTo: [] // Newly added type can't have any conversions to it\n\n });\n } // update the typeList\n\n\n var affectedTypes = typeList.slice(beforeIndex);\n typeList = typeList.slice(0, beforeIndex).concat(newTypes).concat(affectedTypes); // Fix the indices\n\n for (var _i = beforeIndex + newTypes.length; _i < typeList.length; ++_i) {\n typeMap.get(typeList[_i]).index = _i;\n }\n }\n /**\n * Removes all types and conversions from this typed instance.\n * May cause previously constructed typed-functions to throw\n * strange errors when they are called with types that do not\n * match any of their signatures.\n */\n\n\n function clear() {\n typeMap = new Map();\n typeList = [];\n nConversions = 0;\n addTypes([anyType], false);\n } // initialize the types to the default list\n\n\n clear();\n addTypes(_types);\n /**\n * Removes all conversions, leaving the types alone.\n */\n\n function clearConversions() {\n var typeName;\n\n var _iterator2 = _createForOfIteratorHelper(typeList),\n _step2;\n\n try {\n for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n typeName = _step2.value;\n typeMap.get(typeName).conversionsTo = [];\n }\n } catch (err) {\n _iterator2.e(err);\n } finally {\n _iterator2.f();\n }\n\n nConversions = 0;\n }\n /**\n * Find the type names that match a value.\n * @param {*} value\n * @return {string[]} Array of names of types for which\n * the type test matches the value.\n */\n\n\n function findTypeNames(value) {\n var matches = typeList.filter(function (name) {\n var type = typeMap.get(name);\n return !type.isAny && type.test(value);\n });\n\n if (matches.length) {\n return matches;\n }\n\n return ['any'];\n }\n /**\n * Check if an entity is a typed function created by any instance\n * @param {any} entity\n * @returns {boolean}\n */\n\n\n function isTypedFunction(entity) {\n return entity && typeof entity === 'function' && '_typedFunctionData' in entity;\n }\n /**\n * Find a specific signature from a (composed) typed function, for example:\n *\n * typed.findSignature(fn, ['number', 'string'])\n * typed.findSignature(fn, 'number, string')\n * typed.findSignature(fn, 'number,string', {exact: true})\n *\n * This function findSignature will by default return the best match to\n * the given signature, possibly employing type conversions.\n *\n * The (optional) third argument is a plain object giving options\n * controlling the signature search. Currently the only implemented\n * option is `exact`: if specified as true (default is false), only\n * exact matches will be returned (i.e. signatures for which `fn` was\n * directly defined). Note that a (possibly different) type matching\n * `any`, or one or more instances of TYPE matching `...TYPE` are\n * considered exact matches in this regard, as no conversions are used.\n *\n * This function returns a \"signature\" object, as does `typed.resolve()`,\n * which is a plain object with four keys: `params` (the array of parameters\n * for this signature), `fn` (the originally supplied function for this\n * signature), `test` (a generated function that determines if an argument\n * list matches this signature, and `implementation` (the function to call\n * on a matching argument list, that performs conversions if necessary and\n * then calls the originally supplied function).\n *\n * @param {Function} fn A typed-function\n * @param {string | string[]} signature\n * Signature to be found, can be an array or a comma separated string.\n * @param {object} options Controls the signature search as documented\n * @return {{ params: Param[], fn: function, test: function, implementation: function }}\n * Returns the matching signature, or throws an error when no signature\n * is found.\n */\n\n\n function findSignature(fn, signature, options) {\n if (!isTypedFunction(fn)) {\n throw new TypeError(NOT_TYPED_FUNCTION);\n } // Canonicalize input\n\n\n var exact = options && options.exact;\n var stringSignature = Array.isArray(signature) ? signature.join(',') : signature;\n var params = parseSignature(stringSignature);\n var canonicalSignature = stringifyParams(params); // First hope we get lucky and exactly match a signature\n\n if (!exact || canonicalSignature in fn.signatures) {\n // OK, we can check the internal signatures\n var match = fn._typedFunctionData.signatureMap.get(canonicalSignature);\n\n if (match) {\n return match;\n }\n } // Oh well, we did not; so we have to go back and check the parameters\n // one by one, in order to catch things like `any` and rest params.\n // Note here we can assume there is at least one parameter, because\n // the empty signature would have matched successfully above.\n\n\n var nParams = params.length;\n var remainingSignatures;\n\n if (exact) {\n remainingSignatures = [];\n var name;\n\n for (name in fn.signatures) {\n remainingSignatures.push(fn._typedFunctionData.signatureMap.get(name));\n }\n } else {\n remainingSignatures = fn._typedFunctionData.signatures;\n }\n\n for (var i = 0; i < nParams; ++i) {\n var want = params[i];\n var filteredSignatures = [];\n var possibility = void 0;\n\n var _iterator3 = _createForOfIteratorHelper(remainingSignatures),\n _step3;\n\n try {\n for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {\n possibility = _step3.value;\n var have = getParamAtIndex(possibility.params, i);\n\n if (!have || want.restParam && !have.restParam) {\n continue;\n }\n\n if (!have.hasAny) {\n var _ret = function () {\n // have to check all of the wanted types are available\n var haveTypes = paramTypeSet(have);\n\n if (want.types.some(function (wtype) {\n return !haveTypes.has(wtype.name);\n })) {\n return \"continue\";\n }\n }();\n\n if (_ret === \"continue\") continue;\n } // OK, this looks good\n\n\n filteredSignatures.push(possibility);\n }\n } catch (err) {\n _iterator3.e(err);\n } finally {\n _iterator3.f();\n }\n\n remainingSignatures = filteredSignatures;\n if (remainingSignatures.length === 0) break;\n } // Return the first remaining signature that was totally matched:\n\n\n var candidate;\n\n var _iterator4 = _createForOfIteratorHelper(remainingSignatures),\n _step4;\n\n try {\n for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {\n candidate = _step4.value;\n\n if (candidate.params.length <= nParams) {\n return candidate;\n }\n }\n } catch (err) {\n _iterator4.e(err);\n } finally {\n _iterator4.f();\n }\n\n throw new TypeError('Signature not found (signature: ' + (fn.name || 'unnamed') + '(' + stringifyParams(params, ', ') + '))');\n }\n /**\n * Find the proper function to call for a specific signature from\n * a (composed) typed function, for example:\n *\n * typed.find(fn, ['number', 'string'])\n * typed.find(fn, 'number, string')\n * typed.find(fn, 'number,string', {exact: true})\n *\n * This function find will by default return the best match to\n * the given signature, possibly employing type conversions (and returning\n * a function that will perform those conversions as needed). The\n * (optional) third argument is a plain object giving options contolling\n * the signature search. Currently only the option `exact` is implemented,\n * which defaults to \"false\". If `exact` is specified as true, then only\n * exact matches will be returned (i.e. signatures for which `fn` was\n * directly defined). Uses of `any` and `...TYPE` are considered exact if\n * no conversions are necessary to apply the corresponding function.\n *\n * @param {Function} fn A typed-function\n * @param {string | string[]} signature\n * Signature to be found, can be an array or a comma separated string.\n * @param {object} options Controls the signature match as documented\n * @return {function}\n * Returns the function to call for the given signature, or throws an\n * error if no match is found.\n */\n\n\n function find(fn, signature, options) {\n return findSignature(fn, signature, options).implementation;\n }\n /**\n * Convert a given value to another data type, specified by type name.\n *\n * @param {*} value\n * @param {string} typeName\n */\n\n\n function convert(value, typeName) {\n // check conversion is needed\n var type = findType(typeName);\n\n if (type.test(value)) {\n return value;\n }\n\n var conversions = type.conversionsTo;\n\n if (conversions.length === 0) {\n throw new Error('There are no conversions to ' + typeName + ' defined.');\n }\n\n for (var i = 0; i < conversions.length; i++) {\n var fromType = findType(conversions[i].from);\n\n if (fromType.test(value)) {\n return conversions[i].convert(value);\n }\n }\n\n throw new Error('Cannot convert ' + value + ' to ' + typeName);\n }\n /**\n * Stringify parameters in a normalized way\n * @param {Param[]} params\n * @param {string} [','] separator\n * @return {string}\n */\n\n\n function stringifyParams(params) {\n var separator = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ',';\n return params.map(function (p) {\n return p.name;\n }).join(separator);\n }\n /**\n * Parse a parameter, like \"...number | boolean\"\n * @param {string} param\n * @return {Param} param\n */\n\n\n function parseParam(param) {\n var restParam = param.indexOf('...') === 0;\n var types = !restParam ? param : param.length > 3 ? param.slice(3) : 'any';\n var typeDefs = types.split('|').map(function (s) {\n return findType(s.trim());\n });\n var hasAny = false;\n var paramName = restParam ? '...' : '';\n var exactTypes = typeDefs.map(function (type) {\n hasAny = type.isAny || hasAny;\n paramName += type.name + '|';\n return {\n name: type.name,\n typeIndex: type.index,\n test: type.test,\n isAny: type.isAny,\n conversion: null,\n conversionIndex: -1\n };\n });\n return {\n types: exactTypes,\n name: paramName.slice(0, -1),\n // remove trailing '|' from above\n hasAny: hasAny,\n hasConversion: false,\n restParam: restParam\n };\n }\n /**\n * Expands a parsed parameter with the types available from currently\n * defined conversions.\n * @param {Param} param\n * @return {Param} param\n */\n\n\n function expandParam(param) {\n var typeNames = param.types.map(function (t) {\n return t.name;\n });\n var matchingConversions = availableConversions(typeNames);\n var hasAny = param.hasAny;\n var newName = param.name;\n var convertibleTypes = matchingConversions.map(function (conversion) {\n var type = findType(conversion.from);\n hasAny = type.isAny || hasAny;\n newName += '|' + conversion.from;\n return {\n name: conversion.from,\n typeIndex: type.index,\n test: type.test,\n isAny: type.isAny,\n conversion: conversion,\n conversionIndex: conversion.index\n };\n });\n return {\n types: param.types.concat(convertibleTypes),\n name: newName,\n hasAny: hasAny,\n hasConversion: convertibleTypes.length > 0,\n restParam: param.restParam\n };\n }\n /**\n * Return the set of type names in a parameter.\n * Caches the result for efficiency\n *\n * @param {Param} param\n * @return {Set} typenames\n */\n\n\n function paramTypeSet(param) {\n if (!param.typeSet) {\n param.typeSet = new Set();\n param.types.forEach(function (type) {\n return param.typeSet.add(type.name);\n });\n }\n\n return param.typeSet;\n }\n /**\n * Parse a signature with comma separated parameters,\n * like \"number | boolean, ...string\"\n *\n * @param {string} signature\n * @return {Param[]} params\n */\n\n\n function parseSignature(rawSignature) {\n var params = [];\n\n if (typeof rawSignature !== 'string') {\n throw new TypeError('Signatures must be strings');\n }\n\n var signature = rawSignature.trim();\n\n if (signature === '') {\n return params;\n }\n\n var rawParams = signature.split(',');\n\n for (var i = 0; i < rawParams.length; ++i) {\n var parsedParam = parseParam(rawParams[i].trim());\n\n if (parsedParam.restParam && i !== rawParams.length - 1) {\n throw new SyntaxError('Unexpected rest parameter \"' + rawParams[i] + '\": ' + 'only allowed for the last parameter');\n } // if invalid, short-circuit (all the types may have been filtered)\n\n\n if (parsedParam.types.length === 0) {\n return null;\n }\n\n params.push(parsedParam);\n }\n\n return params;\n }\n /**\n * Test whether a set of params contains a restParam\n * @param {Param[]} params\n * @return {boolean} Returns true when the last parameter is a restParam\n */\n\n\n function hasRestParam(params) {\n var param = last(params);\n return param ? param.restParam : false;\n }\n /**\n * Create a type test for a single parameter, which can have one or multiple\n * types.\n * @param {Param} param\n * @return {function(x: *) : boolean} Returns a test function\n */\n\n\n function compileTest(param) {\n if (!param || param.types.length === 0) {\n // nothing to do\n return ok;\n } else if (param.types.length === 1) {\n return findType(param.types[0].name).test;\n } else if (param.types.length === 2) {\n var test0 = findType(param.types[0].name).test;\n var test1 = findType(param.types[1].name).test;\n return function or(x) {\n return test0(x) || test1(x);\n };\n } else {\n // param.types.length > 2\n var tests = param.types.map(function (type) {\n return findType(type.name).test;\n });\n return function or(x) {\n for (var i = 0; i < tests.length; i++) {\n if (tests[i](x)) {\n return true;\n }\n }\n\n return false;\n };\n }\n }\n /**\n * Create a test for all parameters of a signature\n * @param {Param[]} params\n * @return {function(args: Array<*>) : boolean}\n */\n\n\n function compileTests(params) {\n var tests, test0, test1;\n\n if (hasRestParam(params)) {\n // variable arguments like '...number'\n tests = initial(params).map(compileTest);\n var varIndex = tests.length;\n var lastTest = compileTest(last(params));\n\n var testRestParam = function testRestParam(args) {\n for (var i = varIndex; i < args.length; i++) {\n if (!lastTest(args[i])) {\n return false;\n }\n }\n\n return true;\n };\n\n return function testArgs(args) {\n for (var i = 0; i < tests.length; i++) {\n if (!tests[i](args[i])) {\n return false;\n }\n }\n\n return testRestParam(args) && args.length >= varIndex + 1;\n };\n } else {\n // no variable arguments\n if (params.length === 0) {\n return function testArgs(args) {\n return args.length === 0;\n };\n } else if (params.length === 1) {\n test0 = compileTest(params[0]);\n return function testArgs(args) {\n return test0(args[0]) && args.length === 1;\n };\n } else if (params.length === 2) {\n test0 = compileTest(params[0]);\n test1 = compileTest(params[1]);\n return function testArgs(args) {\n return test0(args[0]) && test1(args[1]) && args.length === 2;\n };\n } else {\n // arguments.length > 2\n tests = params.map(compileTest);\n return function testArgs(args) {\n for (var i = 0; i < tests.length; i++) {\n if (!tests[i](args[i])) {\n return false;\n }\n }\n\n return args.length === tests.length;\n };\n }\n }\n }\n /**\n * Find the parameter at a specific index of a Params list.\n * Handles rest parameters.\n * @param {Param[]} params\n * @param {number} index\n * @return {Param | null} Returns the matching parameter when found,\n * null otherwise.\n */\n\n\n function getParamAtIndex(params, index) {\n return index < params.length ? params[index] : hasRestParam(params) ? last(params) : null;\n }\n /**\n * Get all type names of a parameter\n * @param {Params[]} params\n * @param {number} index\n * @return {string[]} Returns an array with type names\n */\n\n\n function getTypeSetAtIndex(params, index) {\n var param = getParamAtIndex(params, index);\n\n if (!param) {\n return new Set();\n }\n\n return paramTypeSet(param);\n }\n /**\n * Test whether a type is an exact type or conversion\n * @param {Type} type\n * @return {boolean} Returns true when\n */\n\n\n function isExactType(type) {\n return type.conversion === null || type.conversion === undefined;\n }\n /**\n * Helper function for creating error messages: create an array with\n * all available types on a specific argument index.\n * @param {Signature[]} signatures\n * @param {number} index\n * @return {string[]} Returns an array with available types\n */\n\n\n function mergeExpectedParams(signatures, index) {\n var typeSet = new Set();\n signatures.forEach(function (signature) {\n var paramSet = getTypeSetAtIndex(signature.params, index);\n var name;\n\n var _iterator5 = _createForOfIteratorHelper(paramSet),\n _step5;\n\n try {\n for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {\n name = _step5.value;\n typeSet.add(name);\n }\n } catch (err) {\n _iterator5.e(err);\n } finally {\n _iterator5.f();\n }\n });\n return typeSet.has('any') ? ['any'] : Array.from(typeSet);\n }\n /**\n * Create\n * @param {string} name The name of the function\n * @param {array.<*>} args The actual arguments passed to the function\n * @param {Signature[]} signatures A list with available signatures\n * @return {TypeError} Returns a type error with additional data\n * attached to it in the property `data`\n */\n\n\n function createError(name, args, signatures) {\n var err, expected;\n\n var _name = name || 'unnamed'; // test for wrong type at some index\n\n\n var matchingSignatures = signatures;\n var index;\n\n var _loop = function _loop() {\n var nextMatchingDefs = [];\n matchingSignatures.forEach(function (signature) {\n var param = getParamAtIndex(signature.params, index);\n var test = compileTest(param);\n\n if ((index < signature.params.length || hasRestParam(signature.params)) && test(args[index])) {\n nextMatchingDefs.push(signature);\n }\n });\n\n if (nextMatchingDefs.length === 0) {\n // no matching signatures anymore, throw error \"wrong type\"\n expected = mergeExpectedParams(matchingSignatures, index);\n\n if (expected.length > 0) {\n var actualTypes = findTypeNames(args[index]);\n err = new TypeError('Unexpected type of argument in function ' + _name + ' (expected: ' + expected.join(' or ') + ', actual: ' + actualTypes.join(' | ') + ', index: ' + index + ')');\n err.data = {\n category: 'wrongType',\n fn: _name,\n index: index,\n actual: actualTypes,\n expected: expected\n };\n return {\n v: err\n };\n }\n } else {\n matchingSignatures = nextMatchingDefs;\n }\n };\n\n for (index = 0; index < args.length; index++) {\n var _ret2 = _loop();\n\n if (_typeof(_ret2) === \"object\") return _ret2.v;\n } // test for too few arguments\n\n\n var lengths = matchingSignatures.map(function (signature) {\n return hasRestParam(signature.params) ? Infinity : signature.params.length;\n });\n\n if (args.length < Math.min.apply(null, lengths)) {\n expected = mergeExpectedParams(matchingSignatures, index);\n err = new TypeError('Too few arguments in function ' + _name + ' (expected: ' + expected.join(' or ') + ', index: ' + args.length + ')');\n err.data = {\n category: 'tooFewArgs',\n fn: _name,\n index: args.length,\n expected: expected\n };\n return err;\n } // test for too many arguments\n\n\n var maxLength = Math.max.apply(null, lengths);\n\n if (args.length > maxLength) {\n err = new TypeError('Too many arguments in function ' + _name + ' (expected: ' + maxLength + ', actual: ' + args.length + ')');\n err.data = {\n category: 'tooManyArgs',\n fn: _name,\n index: args.length,\n expectedLength: maxLength\n };\n return err;\n } // Generic error\n\n\n var argTypes = [];\n\n for (var i = 0; i < args.length; ++i) {\n argTypes.push(findTypeNames(args[i]).join('|'));\n }\n\n err = new TypeError('Arguments of type \"' + argTypes.join(', ') + '\" do not match any of the defined signatures of function ' + _name + '.');\n err.data = {\n category: 'mismatch',\n actual: argTypes\n };\n return err;\n }\n /**\n * Find the lowest index of all exact types of a parameter (no conversions)\n * @param {Param} param\n * @return {number} Returns the index of the lowest type in typed.types\n */\n\n\n function getLowestTypeIndex(param) {\n var min = typeList.length + 1;\n\n for (var i = 0; i < param.types.length; i++) {\n if (isExactType(param.types[i])) {\n min = Math.min(min, param.types[i].typeIndex);\n }\n }\n\n return min;\n }\n /**\n * Find the lowest index of the conversion of all types of the parameter\n * having a conversion\n * @param {Param} param\n * @return {number} Returns the lowest index of the conversions of this type\n */\n\n\n function getLowestConversionIndex(param) {\n var min = nConversions + 1;\n\n for (var i = 0; i < param.types.length; i++) {\n if (!isExactType(param.types[i])) {\n min = Math.min(min, param.types[i].conversionIndex);\n }\n }\n\n return min;\n }\n /**\n * Compare two params\n * @param {Param} param1\n * @param {Param} param2\n * @return {number} returns -1 when param1 must get a lower\n * index than param2, 1 when the opposite,\n * or zero when both are equal\n */\n\n\n function compareParams(param1, param2) {\n // We compare a number of metrics on a param in turn:\n // 1) 'any' parameters are the least preferred\n if (param1.hasAny) {\n if (!param2.hasAny) {\n return 1;\n }\n } else if (param2.hasAny) {\n return -1;\n } // 2) Prefer non-rest to rest parameters\n\n\n if (param1.restParam) {\n if (!param2.restParam) {\n return 1;\n }\n } else if (param2.restParam) {\n return -1;\n } // 3) Prefer exact type match to conversions\n\n\n if (param1.hasConversion) {\n if (!param2.hasConversion) {\n return 1;\n }\n } else if (param2.hasConversion) {\n return -1;\n } // 4) Prefer lower type index:\n\n\n var typeDiff = getLowestTypeIndex(param1) - getLowestTypeIndex(param2);\n\n if (typeDiff < 0) {\n return -1;\n }\n\n if (typeDiff > 0) {\n return 1;\n } // 5) Prefer lower conversion index\n\n\n var convDiff = getLowestConversionIndex(param1) - getLowestConversionIndex(param2);\n\n if (convDiff < 0) {\n return -1;\n }\n\n if (convDiff > 0) {\n return 1;\n } // Don't have a basis for preference\n\n\n return 0;\n }\n /**\n * Compare two signatures\n * @param {Signature} signature1\n * @param {Signature} signature2\n * @return {number} returns a negative number when param1 must get a lower\n * index than param2, a positive number when the opposite,\n * or zero when both are equal\n */\n\n\n function compareSignatures(signature1, signature2) {\n var pars1 = signature1.params;\n var pars2 = signature2.params;\n var last1 = last(pars1);\n var last2 = last(pars2);\n var hasRest1 = hasRestParam(pars1);\n var hasRest2 = hasRestParam(pars2); // We compare a number of metrics on signatures in turn:\n // 1) An \"any rest param\" is least preferred\n\n if (hasRest1 && last1.hasAny) {\n if (!hasRest2 || !last2.hasAny) {\n return 1;\n }\n } else if (hasRest2 && last2.hasAny) {\n return -1;\n } // 2) Minimize the number of 'any' parameters\n\n\n var any1 = 0;\n var conv1 = 0;\n var par;\n\n var _iterator6 = _createForOfIteratorHelper(pars1),\n _step6;\n\n try {\n for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {\n par = _step6.value;\n if (par.hasAny) ++any1;\n if (par.hasConversion) ++conv1;\n }\n } catch (err) {\n _iterator6.e(err);\n } finally {\n _iterator6.f();\n }\n\n var any2 = 0;\n var conv2 = 0;\n\n var _iterator7 = _createForOfIteratorHelper(pars2),\n _step7;\n\n try {\n for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) {\n par = _step7.value;\n if (par.hasAny) ++any2;\n if (par.hasConversion) ++conv2;\n }\n } catch (err) {\n _iterator7.e(err);\n } finally {\n _iterator7.f();\n }\n\n if (any1 !== any2) {\n return any1 - any2;\n } // 3) A conversion rest param is less preferred\n\n\n if (hasRest1 && last1.hasConversion) {\n if (!hasRest2 || !last2.hasConversion) {\n return 1;\n }\n } else if (hasRest2 && last2.hasConversion) {\n return -1;\n } // 4) Minimize the number of conversions\n\n\n if (conv1 !== conv2) {\n return conv1 - conv2;\n } // 5) Prefer no rest param\n\n\n if (hasRest1) {\n if (!hasRest2) {\n return 1;\n }\n } else if (hasRest2) {\n return -1;\n } // 6) Prefer shorter with rest param, longer without\n\n\n var lengthCriterion = (pars1.length - pars2.length) * (hasRest1 ? -1 : 1);\n\n if (lengthCriterion !== 0) {\n return lengthCriterion;\n } // Signatures are identical in each of the above metrics.\n // In particular, they are the same length.\n // We can therefore compare the parameters one by one.\n // First we count which signature has more preferred parameters.\n\n\n var comparisons = [];\n var tc = 0;\n\n for (var i = 0; i < pars1.length; ++i) {\n var thisComparison = compareParams(pars1[i], pars2[i]);\n comparisons.push(thisComparison);\n tc += thisComparison;\n }\n\n if (tc !== 0) {\n return tc;\n } // They have the same number of preferred parameters, so go by the\n // earliest parameter in which we have a preference.\n // In other words, dispatch is driven somewhat more by earlier\n // parameters than later ones.\n\n\n var c;\n\n for (var _i2 = 0, _comparisons = comparisons; _i2 < _comparisons.length; _i2++) {\n c = _comparisons[_i2];\n\n if (c !== 0) {\n return c;\n }\n } // It's a tossup:\n\n\n return 0;\n }\n /**\n * Produce a list of all conversions from distinct types to one of\n * the given types.\n *\n * @param {string[]} typeNames\n * @return {ConversionDef[]} Returns the conversions that are available\n * resulting in any given type (if any)\n */\n\n\n function availableConversions(typeNames) {\n if (typeNames.length === 0) {\n return [];\n }\n\n var types = typeNames.map(findType);\n\n if (typeNames.length > 1) {\n types.sort(function (t1, t2) {\n return t1.index - t2.index;\n });\n }\n\n var matches = types[0].conversionsTo;\n\n if (typeNames.length === 1) {\n return matches;\n }\n\n matches = matches.concat([]); // shallow copy the matches\n // Since the types are now in index order, we just want the first\n // occurrence of any from type:\n\n var knownTypes = new Set(typeNames);\n\n for (var i = 1; i < types.length; ++i) {\n var newMatch = void 0;\n\n var _iterator8 = _createForOfIteratorHelper(types[i].conversionsTo),\n _step8;\n\n try {\n for (_iterator8.s(); !(_step8 = _iterator8.n()).done;) {\n newMatch = _step8.value;\n\n if (!knownTypes.has(newMatch.from)) {\n matches.push(newMatch);\n knownTypes.add(newMatch.from);\n }\n }\n } catch (err) {\n _iterator8.e(err);\n } finally {\n _iterator8.f();\n }\n }\n\n return matches;\n }\n /**\n * Preprocess arguments before calling the original function:\n * - if needed convert the parameters\n * - in case of rest parameters, move the rest parameters into an Array\n * @param {Param[]} params\n * @param {function} fn\n * @return {function} Returns a wrapped function\n */\n\n\n function compileArgsPreprocessing(params, fn) {\n var fnConvert = fn; // TODO: can we make this wrapper function smarter/simpler?\n\n if (params.some(function (p) {\n return p.hasConversion;\n })) {\n var restParam = hasRestParam(params);\n var compiledConversions = params.map(compileArgConversion);\n\n fnConvert = function convertArgs() {\n var args = [];\n var last = restParam ? arguments.length - 1 : arguments.length;\n\n for (var i = 0; i < last; i++) {\n args[i] = compiledConversions[i](arguments[i]);\n }\n\n if (restParam) {\n args[last] = arguments[last].map(compiledConversions[last]);\n }\n\n return fn.apply(this, args);\n };\n }\n\n var fnPreprocess = fnConvert;\n\n if (hasRestParam(params)) {\n var offset = params.length - 1;\n\n fnPreprocess = function preprocessRestParams() {\n return fnConvert.apply(this, slice(arguments, 0, offset).concat([slice(arguments, offset)]));\n };\n }\n\n return fnPreprocess;\n }\n /**\n * Compile conversion for a parameter to the right type\n * @param {Param} param\n * @return {function} Returns the wrapped function that will convert arguments\n *\n */\n\n\n function compileArgConversion(param) {\n var test0, test1, conversion0, conversion1;\n var tests = [];\n var conversions = [];\n param.types.forEach(function (type) {\n if (type.conversion) {\n tests.push(findType(type.conversion.from).test);\n conversions.push(type.conversion.convert);\n }\n }); // create optimized conversion functions depending on the number of conversions\n\n switch (conversions.length) {\n case 0:\n return function convertArg(arg) {\n return arg;\n };\n\n case 1:\n test0 = tests[0];\n conversion0 = conversions[0];\n return function convertArg(arg) {\n if (test0(arg)) {\n return conversion0(arg);\n }\n\n return arg;\n };\n\n case 2:\n test0 = tests[0];\n test1 = tests[1];\n conversion0 = conversions[0];\n conversion1 = conversions[1];\n return function convertArg(arg) {\n if (test0(arg)) {\n return conversion0(arg);\n }\n\n if (test1(arg)) {\n return conversion1(arg);\n }\n\n return arg;\n };\n\n default:\n return function convertArg(arg) {\n for (var i = 0; i < conversions.length; i++) {\n if (tests[i](arg)) {\n return conversions[i](arg);\n }\n }\n\n return arg;\n };\n }\n }\n /**\n * Split params with union types in to separate params.\n *\n * For example:\n *\n * splitParams([['Array', 'Object'], ['string', 'RegExp'])\n * // returns:\n * // [\n * // ['Array', 'string'],\n * // ['Array', 'RegExp'],\n * // ['Object', 'string'],\n * // ['Object', 'RegExp']\n * // ]\n *\n * @param {Param[]} params\n * @return {Param[]}\n */\n\n\n function splitParams(params) {\n function _splitParams(params, index, paramsSoFar) {\n if (index < params.length) {\n var param = params[index];\n var resultingParams = [];\n\n if (param.restParam) {\n // split the types of a rest parameter in two:\n // one with only exact types, and one with exact types and conversions\n var exactTypes = param.types.filter(isExactType);\n\n if (exactTypes.length < param.types.length) {\n resultingParams.push({\n types: exactTypes,\n name: '...' + exactTypes.map(function (t) {\n return t.name;\n }).join('|'),\n hasAny: exactTypes.some(function (t) {\n return t.isAny;\n }),\n hasConversion: false,\n restParam: true\n });\n }\n\n resultingParams.push(param);\n } else {\n // split all the types of a regular parameter into one type per param\n resultingParams = param.types.map(function (type) {\n return {\n types: [type],\n name: type.name,\n hasAny: type.isAny,\n hasConversion: type.conversion,\n restParam: false\n };\n });\n } // recurse over the groups with types\n\n\n return flatMap(resultingParams, function (nextParam) {\n return _splitParams(params, index + 1, paramsSoFar.concat([nextParam]));\n });\n } else {\n // we've reached the end of the parameters.\n return [paramsSoFar];\n }\n }\n\n return _splitParams(params, 0, []);\n }\n /**\n * Test whether two param lists represent conflicting signatures\n * @param {Param[]} params1\n * @param {Param[]} params2\n * @return {boolean} Returns true when the signatures conflict, false otherwise.\n */\n\n\n function conflicting(params1, params2) {\n var ii = Math.max(params1.length, params2.length);\n\n for (var i = 0; i < ii; i++) {\n var typeSet1 = getTypeSetAtIndex(params1, i);\n var typeSet2 = getTypeSetAtIndex(params2, i);\n var overlap = false;\n var name = void 0;\n\n var _iterator9 = _createForOfIteratorHelper(typeSet2),\n _step9;\n\n try {\n for (_iterator9.s(); !(_step9 = _iterator9.n()).done;) {\n name = _step9.value;\n\n if (typeSet1.has(name)) {\n overlap = true;\n break;\n }\n }\n } catch (err) {\n _iterator9.e(err);\n } finally {\n _iterator9.f();\n }\n\n if (!overlap) {\n return false;\n }\n }\n\n var len1 = params1.length;\n var len2 = params2.length;\n var restParam1 = hasRestParam(params1);\n var restParam2 = hasRestParam(params2);\n return restParam1 ? restParam2 ? len1 === len2 : len2 >= len1 : restParam2 ? len1 >= len2 : len1 === len2;\n }\n /**\n * Helper function for `resolveReferences` that returns a copy of\n * functionList wihe any prior resolutions cleared out, in case we are\n * recycling signatures from a prior typed function construction.\n *\n * @param {Array.} functionList\n * @return {Array.}\n */\n\n\n function clearResolutions(functionList) {\n return functionList.map(function (fn) {\n if (isReferToSelf(fn)) {\n return referToSelf(fn.referToSelf.callback);\n }\n\n if (isReferTo(fn)) {\n return makeReferTo(fn.referTo.references, fn.referTo.callback);\n }\n\n return fn;\n });\n }\n /**\n * Take a list of references, a list of functions functionList, and a\n * signatureMap indexing signatures into functionList, and return\n * the list of resolutions, or a false-y value if they don't all\n * resolve in a valid way (yet).\n *\n * @param {string[]} references\n * @param {Array} signatureMap\n * @return {function[] | false} resolutions\n */\n\n\n function collectResolutions(references, functionList, signatureMap) {\n var resolvedReferences = [];\n var reference;\n\n var _iterator10 = _createForOfIteratorHelper(references),\n _step10;\n\n try {\n for (_iterator10.s(); !(_step10 = _iterator10.n()).done;) {\n reference = _step10.value;\n var resolution = signatureMap[reference];\n\n if (typeof resolution !== 'number') {\n throw new TypeError('No definition for referenced signature \"' + reference + '\"');\n }\n\n resolution = functionList[resolution];\n\n if (typeof resolution !== 'function') {\n return false;\n }\n\n resolvedReferences.push(resolution);\n }\n } catch (err) {\n _iterator10.e(err);\n } finally {\n _iterator10.f();\n }\n\n return resolvedReferences;\n }\n /**\n * Resolve any references in the functionList for the typed function\n * itself. The signatureMap tells which index in the functionList a\n * given signature should be mapped to (for use in resolving typed.referTo)\n * and self provides the destions of a typed.referToSelf.\n *\n * @param {Array} functionList\n * @param {Object.} signatureMap\n * @param {function} self The typed-function itself\n * @return {Array} The list of resolved functions\n */\n\n\n function resolveReferences(functionList, signatureMap, self) {\n var resolvedFunctions = clearResolutions(functionList);\n var isResolved = new Array(resolvedFunctions.length).fill(false);\n var leftUnresolved = true;\n\n while (leftUnresolved) {\n leftUnresolved = false;\n var nothingResolved = true;\n\n for (var i = 0; i < resolvedFunctions.length; ++i) {\n if (isResolved[i]) continue;\n var fn = resolvedFunctions[i];\n\n if (isReferToSelf(fn)) {\n resolvedFunctions[i] = fn.referToSelf.callback(self); // Preserve reference in case signature is reused someday:\n\n resolvedFunctions[i].referToSelf = fn.referToSelf;\n isResolved[i] = true;\n nothingResolved = false;\n } else if (isReferTo(fn)) {\n var resolvedReferences = collectResolutions(fn.referTo.references, resolvedFunctions, signatureMap);\n\n if (resolvedReferences) {\n resolvedFunctions[i] = fn.referTo.callback.apply(this, resolvedReferences); // Preserve reference in case signature is reused someday:\n\n resolvedFunctions[i].referTo = fn.referTo;\n isResolved[i] = true;\n nothingResolved = false;\n } else {\n leftUnresolved = true;\n }\n }\n }\n\n if (nothingResolved && leftUnresolved) {\n throw new SyntaxError('Circular reference detected in resolving typed.referTo');\n }\n }\n\n return resolvedFunctions;\n }\n /**\n * Validate whether any of the function bodies contains a self-reference\n * usage like `this(...)` or `this.signatures`. This self-referencing is\n * deprecated since typed-function v3. It has been replaced with\n * the functions typed.referTo and typed.referToSelf.\n * @param {Object.} signaturesMap\n */\n\n\n function validateDeprecatedThis(signaturesMap) {\n // TODO: remove this deprecation warning logic some day (it's introduced in v3)\n // match occurrences like 'this(' and 'this.signatures'\n var deprecatedThisRegex = /\\bthis(\\(|\\.signatures\\b)/;\n Object.keys(signaturesMap).forEach(function (signature) {\n var fn = signaturesMap[signature];\n\n if (deprecatedThisRegex.test(fn.toString())) {\n throw new SyntaxError('Using `this` to self-reference a function ' + 'is deprecated since typed-function@3. ' + 'Use typed.referTo and typed.referToSelf instead.');\n }\n });\n }\n /**\n * Create a typed function\n * @param {String} name The name for the typed function\n * @param {Object.} rawSignaturesMap\n * An object with one or\n * multiple signatures as key, and the\n * function corresponding to the\n * signature as value.\n * @return {function} Returns the created typed function.\n */\n\n\n function createTypedFunction(name, rawSignaturesMap) {\n typed.createCount++;\n\n if (Object.keys(rawSignaturesMap).length === 0) {\n throw new SyntaxError('No signatures provided');\n }\n\n if (typed.warnAgainstDeprecatedThis) {\n validateDeprecatedThis(rawSignaturesMap);\n } // Main processing loop for signatures\n\n\n var parsedParams = [];\n var originalFunctions = [];\n var signaturesMap = {};\n var preliminarySignatures = []; // may have duplicates from conversions\n\n var signature;\n\n var _loop2 = function _loop2() {\n // A) Protect against polluted Object prototype:\n if (!Object.prototype.hasOwnProperty.call(rawSignaturesMap, signature)) {\n return \"continue\";\n } // B) Parse the signature\n\n\n var params = parseSignature(signature);\n if (!params) return \"continue\"; // C) Check for conflicts\n\n parsedParams.forEach(function (pp) {\n if (conflicting(pp, params)) {\n throw new TypeError('Conflicting signatures \"' + stringifyParams(pp) + '\" and \"' + stringifyParams(params) + '\".');\n }\n });\n parsedParams.push(params); // D) Store the provided function and add conversions\n\n var functionIndex = originalFunctions.length;\n originalFunctions.push(rawSignaturesMap[signature]);\n var conversionParams = params.map(expandParam); // E) Split the signatures and collect them up\n\n var sp = void 0;\n\n var _iterator11 = _createForOfIteratorHelper(splitParams(conversionParams)),\n _step11;\n\n try {\n for (_iterator11.s(); !(_step11 = _iterator11.n()).done;) {\n sp = _step11.value;\n var spName = stringifyParams(sp);\n preliminarySignatures.push({\n params: sp,\n name: spName,\n fn: functionIndex\n });\n\n if (sp.every(function (p) {\n return !p.hasConversion;\n })) {\n signaturesMap[spName] = functionIndex;\n }\n }\n } catch (err) {\n _iterator11.e(err);\n } finally {\n _iterator11.f();\n }\n };\n\n for (signature in rawSignaturesMap) {\n var _ret3 = _loop2();\n\n if (_ret3 === \"continue\") continue;\n }\n\n preliminarySignatures.sort(compareSignatures); // Note the forward reference to theTypedFn\n\n var resolvedFunctions = resolveReferences(originalFunctions, signaturesMap, theTypedFn); // Fill in the proper function for each signature\n\n var s;\n\n for (s in signaturesMap) {\n if (Object.prototype.hasOwnProperty.call(signaturesMap, s)) {\n signaturesMap[s] = resolvedFunctions[signaturesMap[s]];\n }\n }\n\n var signatures = [];\n var internalSignatureMap = new Map(); // benchmarks faster than object\n\n for (var _i3 = 0, _preliminarySignature = preliminarySignatures; _i3 < _preliminarySignature.length; _i3++) {\n s = _preliminarySignature[_i3];\n\n // Note it's only safe to eliminate duplicates like this\n // _after_ the signature sorting step above; otherwise we might\n // remove the wrong one.\n if (!internalSignatureMap.has(s.name)) {\n s.fn = resolvedFunctions[s.fn];\n signatures.push(s);\n internalSignatureMap.set(s.name, s);\n }\n } // we create a highly optimized checks for the first couple of signatures with max 2 arguments\n\n\n var ok0 = signatures[0] && signatures[0].params.length <= 2 && !hasRestParam(signatures[0].params);\n var ok1 = signatures[1] && signatures[1].params.length <= 2 && !hasRestParam(signatures[1].params);\n var ok2 = signatures[2] && signatures[2].params.length <= 2 && !hasRestParam(signatures[2].params);\n var ok3 = signatures[3] && signatures[3].params.length <= 2 && !hasRestParam(signatures[3].params);\n var ok4 = signatures[4] && signatures[4].params.length <= 2 && !hasRestParam(signatures[4].params);\n var ok5 = signatures[5] && signatures[5].params.length <= 2 && !hasRestParam(signatures[5].params);\n var allOk = ok0 && ok1 && ok2 && ok3 && ok4 && ok5; // compile the tests\n\n for (var i = 0; i < signatures.length; ++i) {\n signatures[i].test = compileTests(signatures[i].params);\n }\n\n var test00 = ok0 ? compileTest(signatures[0].params[0]) : notOk;\n var test10 = ok1 ? compileTest(signatures[1].params[0]) : notOk;\n var test20 = ok2 ? compileTest(signatures[2].params[0]) : notOk;\n var test30 = ok3 ? compileTest(signatures[3].params[0]) : notOk;\n var test40 = ok4 ? compileTest(signatures[4].params[0]) : notOk;\n var test50 = ok5 ? compileTest(signatures[5].params[0]) : notOk;\n var test01 = ok0 ? compileTest(signatures[0].params[1]) : notOk;\n var test11 = ok1 ? compileTest(signatures[1].params[1]) : notOk;\n var test21 = ok2 ? compileTest(signatures[2].params[1]) : notOk;\n var test31 = ok3 ? compileTest(signatures[3].params[1]) : notOk;\n var test41 = ok4 ? compileTest(signatures[4].params[1]) : notOk;\n var test51 = ok5 ? compileTest(signatures[5].params[1]) : notOk; // compile the functions\n\n for (var _i4 = 0; _i4 < signatures.length; ++_i4) {\n signatures[_i4].implementation = compileArgsPreprocessing(signatures[_i4].params, signatures[_i4].fn);\n }\n\n var fn0 = ok0 ? signatures[0].implementation : undef;\n var fn1 = ok1 ? signatures[1].implementation : undef;\n var fn2 = ok2 ? signatures[2].implementation : undef;\n var fn3 = ok3 ? signatures[3].implementation : undef;\n var fn4 = ok4 ? signatures[4].implementation : undef;\n var fn5 = ok5 ? signatures[5].implementation : undef;\n var len0 = ok0 ? signatures[0].params.length : -1;\n var len1 = ok1 ? signatures[1].params.length : -1;\n var len2 = ok2 ? signatures[2].params.length : -1;\n var len3 = ok3 ? signatures[3].params.length : -1;\n var len4 = ok4 ? signatures[4].params.length : -1;\n var len5 = ok5 ? signatures[5].params.length : -1; // simple and generic, but also slow\n\n var iStart = allOk ? 6 : 0;\n var iEnd = signatures.length; // de-reference ahead for execution speed:\n\n var tests = signatures.map(function (s) {\n return s.test;\n });\n var fns = signatures.map(function (s) {\n return s.implementation;\n });\n\n var generic = function generic() {\n 'use strict';\n\n for (var _i5 = iStart; _i5 < iEnd; _i5++) {\n if (tests[_i5](arguments)) {\n return fns[_i5].apply(this, arguments);\n }\n }\n\n return typed.onMismatch(name, arguments, signatures);\n }; // create the typed function\n // fast, specialized version. Falls back to the slower, generic one if needed\n\n\n function theTypedFn(arg0, arg1) {\n 'use strict';\n\n if (arguments.length === len0 && test00(arg0) && test01(arg1)) {\n return fn0.apply(this, arguments);\n }\n\n if (arguments.length === len1 && test10(arg0) && test11(arg1)) {\n return fn1.apply(this, arguments);\n }\n\n if (arguments.length === len2 && test20(arg0) && test21(arg1)) {\n return fn2.apply(this, arguments);\n }\n\n if (arguments.length === len3 && test30(arg0) && test31(arg1)) {\n return fn3.apply(this, arguments);\n }\n\n if (arguments.length === len4 && test40(arg0) && test41(arg1)) {\n return fn4.apply(this, arguments);\n }\n\n if (arguments.length === len5 && test50(arg0) && test51(arg1)) {\n return fn5.apply(this, arguments);\n }\n\n return generic.apply(this, arguments);\n } // attach name the typed function\n\n\n try {\n Object.defineProperty(theTypedFn, 'name', {\n value: name\n });\n } catch (err) {// old browsers do not support Object.defineProperty and some don't support setting the name property\n // the function name is not essential for the functioning, it's mostly useful for debugging,\n // so it's fine to have unnamed functions.\n } // attach signatures to the function.\n // This property is close to the original collection of signatures\n // used to create the typed-function, just with unions split:\n\n\n theTypedFn.signatures = signaturesMap; // Store internal data for functions like resolve, find, etc.\n // Also serves as the flag that this is a typed-function\n\n theTypedFn._typedFunctionData = {\n signatures: signatures,\n signatureMap: internalSignatureMap\n };\n return theTypedFn;\n }\n /**\n * Action to take on mismatch\n * @param {string} name Name of function that was attempted to be called\n * @param {Array} args Actual arguments to the call\n * @param {Array} signatures Known signatures of the named typed-function\n */\n\n\n function _onMismatch(name, args, signatures) {\n throw createError(name, args, signatures);\n }\n /**\n * Return all but the last items of an array or function Arguments\n * @param {Array | Arguments} arr\n * @return {Array}\n */\n\n\n function initial(arr) {\n return slice(arr, 0, arr.length - 1);\n }\n /**\n * return the last item of an array or function Arguments\n * @param {Array | Arguments} arr\n * @return {*}\n */\n\n\n function last(arr) {\n return arr[arr.length - 1];\n }\n /**\n * Slice an array or function Arguments\n * @param {Array | Arguments | IArguments} arr\n * @param {number} start\n * @param {number} [end]\n * @return {Array}\n */\n\n\n function slice(arr, start, end) {\n return Array.prototype.slice.call(arr, start, end);\n }\n /**\n * Return the first item from an array for which test(arr[i]) returns true\n * @param {Array} arr\n * @param {function} test\n * @return {* | undefined} Returns the first matching item\n * or undefined when there is no match\n */\n\n\n function findInArray(arr, test) {\n for (var i = 0; i < arr.length; i++) {\n if (test(arr[i])) {\n return arr[i];\n }\n }\n\n return undefined;\n }\n /**\n * Flat map the result invoking a callback for every item in an array.\n * https://gist.github.com/samgiles/762ee337dff48623e729\n * @param {Array} arr\n * @param {function} callback\n * @return {Array}\n */\n\n\n function flatMap(arr, callback) {\n return Array.prototype.concat.apply([], arr.map(callback));\n }\n /**\n * Create a reference callback to one or multiple signatures\n *\n * Syntax:\n *\n * typed.referTo(signature1, signature2, ..., function callback(fn1, fn2, ...) {\n * // ...\n * })\n *\n * @returns {{referTo: {references: string[], callback}}}\n */\n\n\n function referTo() {\n var references = initial(arguments).map(function (s) {\n return stringifyParams(parseSignature(s));\n });\n var callback = last(arguments);\n\n if (typeof callback !== 'function') {\n throw new TypeError('Callback function expected as last argument');\n }\n\n return makeReferTo(references, callback);\n }\n\n function makeReferTo(references, callback) {\n return {\n referTo: {\n references: references,\n callback: callback\n }\n };\n }\n /**\n * Create a reference callback to the typed-function itself\n *\n * @param {(self: function) => function} callback\n * @returns {{referToSelf: { callback: function }}}\n */\n\n\n function referToSelf(callback) {\n if (typeof callback !== 'function') {\n throw new TypeError('Callback function expected as first argument');\n }\n\n return {\n referToSelf: {\n callback: callback\n }\n };\n }\n /**\n * Test whether something is a referTo object, holding a list with reference\n * signatures and a callback.\n *\n * @param {Object | function} objectOrFn\n * @returns {boolean}\n */\n\n\n function isReferTo(objectOrFn) {\n return objectOrFn && _typeof(objectOrFn.referTo) === 'object' && Array.isArray(objectOrFn.referTo.references) && typeof objectOrFn.referTo.callback === 'function';\n }\n /**\n * Test whether something is a referToSelf object, holding a callback where\n * to pass `self`.\n *\n * @param {Object | function} objectOrFn\n * @returns {boolean}\n */\n\n\n function isReferToSelf(objectOrFn) {\n return objectOrFn && _typeof(objectOrFn.referToSelf) === 'object' && typeof objectOrFn.referToSelf.callback === 'function';\n }\n /**\n * Check if name is (A) new, (B) a match, or (C) a mismatch; and throw\n * an error in case (C).\n *\n * @param { string | undefined } nameSoFar\n * @param { string | undefined } newName\n * @returns { string } updated name\n */\n\n\n function checkName(nameSoFar, newName) {\n if (!nameSoFar) {\n return newName;\n }\n\n if (newName && newName !== nameSoFar) {\n var err = new Error('Function names do not match (expected: ' + nameSoFar + ', actual: ' + newName + ')');\n err.data = {\n actual: newName,\n expected: nameSoFar\n };\n throw err;\n }\n\n return nameSoFar;\n }\n /**\n * Retrieve the implied name from an object with signature keys\n * and function values, checking whether all value names match\n *\n * @param { {string: function} } obj\n */\n\n\n function getObjectName(obj) {\n var name;\n\n for (var key in obj) {\n // Only pay attention to own properties, and only if their values\n // are typed functions or functions with a signature property\n if (Object.prototype.hasOwnProperty.call(obj, key) && (isTypedFunction(obj[key]) || typeof obj[key].signature === 'string')) {\n name = checkName(name, obj[key].name);\n }\n }\n\n return name;\n }\n /**\n * Copy all of the signatures from the second argument into the first,\n * which is modified by side effect, checking for conflicts\n *\n * @param {Object.} dest\n * @param {Object.} source\n */\n\n\n function mergeSignatures(dest, source) {\n var key;\n\n for (key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n if (key in dest) {\n if (source[key] !== dest[key]) {\n var err = new Error('Signature \"' + key + '\" is defined twice');\n err.data = {\n signature: key,\n sourceFunction: source[key],\n destFunction: dest[key]\n };\n throw err;\n } // else: both signatures point to the same function, that's fine\n\n }\n\n dest[key] = source[key];\n }\n }\n }\n\n var saveTyped = typed;\n /**\n * Originally the main function was a typed function itself, but then\n * it might not be able to generate error messages if the client\n * replaced the type system with different names.\n *\n * Main entry: typed([name], functions/objects with signatures...)\n *\n * Assembles and returns a new typed-function from the given items\n * that provide signatures and implementations, each of which may be\n * * a plain object mapping (string) signatures to implementing functions,\n * * a previously constructed typed function, or\n * * any other single function with a string-valued property `signature`.\n * The name of the resulting typed-function will be given by the\n * string-valued name argument if present, or if not, by the name\n * of any of the arguments that have one, as long as any that do are\n * consistent with each other. If no name is specified, the name will be\n * an empty string.\n *\n * @param {string} maybeName [optional]\n * @param {(function|object)[]} signature providers\n * @returns {typed-function}\n */\n\n typed = function typed(maybeName) {\n var named = typeof maybeName === 'string';\n var start = named ? 1 : 0;\n var name = named ? maybeName : '';\n var allSignatures = {};\n\n for (var i = start; i < arguments.length; ++i) {\n var item = arguments[i];\n var theseSignatures = {};\n var thisName = void 0;\n\n if (typeof item === 'function') {\n thisName = item.name;\n\n if (typeof item.signature === 'string') {\n // Case 1: Ordinary function with a string 'signature' property\n theseSignatures[item.signature] = item;\n } else if (isTypedFunction(item)) {\n // Case 2: Existing typed function\n theseSignatures = item.signatures;\n }\n } else if (isPlainObject(item)) {\n // Case 3: Plain object, assume keys = signatures, values = functions\n theseSignatures = item;\n\n if (!named) {\n thisName = getObjectName(item);\n }\n }\n\n if (Object.keys(theseSignatures).length === 0) {\n var err = new TypeError('Argument to \\'typed\\' at index ' + i + ' is not a (typed) function, ' + 'nor an object with signatures as keys and functions as values.');\n err.data = {\n index: i,\n argument: item\n };\n throw err;\n }\n\n if (!named) {\n name = checkName(name, thisName);\n }\n\n mergeSignatures(allSignatures, theseSignatures);\n }\n\n return createTypedFunction(name || '', allSignatures);\n };\n\n typed.create = create;\n typed.createCount = saveTyped.createCount;\n typed.onMismatch = _onMismatch;\n typed.throwMismatchError = _onMismatch;\n typed.createError = createError;\n typed.clear = clear;\n typed.clearConversions = clearConversions;\n typed.addTypes = addTypes;\n typed._findType = findType; // For unit testing only\n\n typed.referTo = referTo;\n typed.referToSelf = referToSelf;\n typed.convert = convert;\n typed.findSignature = findSignature;\n typed.find = find;\n typed.isTypedFunction = isTypedFunction;\n typed.warnAgainstDeprecatedThis = true;\n /**\n * add a type (convenience wrapper for typed.addTypes)\n * @param {{name: string, test: function}} type\n * @param {boolean} [beforeObjectTest=true]\n * If true, the new test will be inserted before\n * the test with name 'Object' (if any), since\n * tests for Object match Array and classes too.\n */\n\n typed.addType = function (type, beforeObjectTest) {\n var before = 'any';\n\n if (beforeObjectTest !== false && typeMap.has('Object')) {\n before = 'Object';\n }\n\n typed.addTypes([type], before);\n };\n /**\n * Verify that the ConversionDef conversion has a valid format.\n *\n * @param {conversionDef} conversion\n * @return {void}\n * @throws {TypeError|SyntaxError}\n */\n\n\n function _validateConversion(conversion) {\n if (!conversion || typeof conversion.from !== 'string' || typeof conversion.to !== 'string' || typeof conversion.convert !== 'function') {\n throw new TypeError('Object with properties {from: string, to: string, convert: function} expected');\n }\n\n if (conversion.to === conversion.from) {\n throw new SyntaxError('Illegal to define conversion from \"' + conversion.from + '\" to itself.');\n }\n }\n /**\n * Add a conversion\n *\n * @param {ConversionDef} conversion\n * @returns {void}\n * @throws {TypeError}\n */\n\n\n typed.addConversion = function (conversion) {\n _validateConversion(conversion);\n\n var to = findType(conversion.to);\n\n if (to.conversionsTo.every(function (other) {\n return other.from !== conversion.from;\n })) {\n to.conversionsTo.push({\n from: conversion.from,\n convert: conversion.convert,\n index: nConversions++\n });\n } else {\n throw new Error('There is already a conversion from \"' + conversion.from + '\" to \"' + to.name + '\"');\n }\n };\n /**\n * Convenience wrapper to call addConversion on each conversion in a list.\n *\n @param {ConversionDef[]} conversions\n @returns {void}\n @throws {TypeError}\n */\n\n\n typed.addConversions = function (conversions) {\n conversions.forEach(typed.addConversion);\n };\n /**\n * Remove the specified conversion. The format is the same as for\n * addConversion, and the convert function must match or an error\n * is thrown.\n *\n * @param {{from: string, to: string, convert: function}} conversion\n * @returns {void}\n * @throws {TypeError|SyntaxError|Error}\n */\n\n\n typed.removeConversion = function (conversion) {\n _validateConversion(conversion);\n\n var to = findType(conversion.to);\n var existingConversion = findInArray(to.conversionsTo, function (c) {\n return c.from === conversion.from;\n });\n\n if (!existingConversion) {\n throw new Error('Attempt to remove nonexistent conversion from ' + conversion.from + ' to ' + conversion.to);\n }\n\n if (existingConversion.convert !== conversion.convert) {\n throw new Error('Conversion to remove does not match existing conversion');\n }\n\n var index = to.conversionsTo.indexOf(existingConversion);\n to.conversionsTo.splice(index, 1);\n };\n /**\n * Produce the specific signature that a typed function\n * will execute on the given arguments. Here, a \"signature\" is an\n * object with properties 'params', 'test', 'fn', and 'implementation'.\n * This last property is a function that converts params as necessary\n * and then calls 'fn'. Returns null if there is no matching signature.\n * @param {typed-function} tf\n * @param {any[]} argList\n * @returns {{params: string, test: function, fn: function, implementation: function}}\n */\n\n\n typed.resolve = function (tf, argList) {\n if (!isTypedFunction(tf)) {\n throw new TypeError(NOT_TYPED_FUNCTION);\n }\n\n var sigs = tf._typedFunctionData.signatures;\n\n for (var i = 0; i < sigs.length; ++i) {\n if (sigs[i].test(argList)) {\n return sigs[i];\n }\n }\n\n return null;\n };\n\n return typed;\n}\n\nexport default create();\n//# sourceMappingURL=typed-function.mjs.map","import { isNumber } from './is.js';\n\n/**\n * @typedef {{sign: '+' | '-' | '', coefficients: number[], exponent: number}} SplitValue\n */\n\n/**\n * Check if a number is integer\n * @param {number | boolean} value\n * @return {boolean} isInteger\n */\nexport function isInteger(value) {\n if (typeof value === 'boolean') {\n return true;\n }\n return isFinite(value) ? value === Math.round(value) : false;\n}\n\n/**\n * Calculate the sign of a number\n * @param {number} x\n * @returns {number}\n */\nexport var sign = /* #__PURE__ */Math.sign || function (x) {\n if (x > 0) {\n return 1;\n } else if (x < 0) {\n return -1;\n } else {\n return 0;\n }\n};\n\n/**\n * Calculate the base-2 logarithm of a number\n * @param {number} x\n * @returns {number}\n */\nexport var log2 = /* #__PURE__ */Math.log2 || function log2(x) {\n return Math.log(x) / Math.LN2;\n};\n\n/**\n * Calculate the base-10 logarithm of a number\n * @param {number} x\n * @returns {number}\n */\nexport var log10 = /* #__PURE__ */Math.log10 || function log10(x) {\n return Math.log(x) / Math.LN10;\n};\n\n/**\n * Calculate the natural logarithm of a number + 1\n * @param {number} x\n * @returns {number}\n */\nexport var log1p = /* #__PURE__ */Math.log1p || function (x) {\n return Math.log(x + 1);\n};\n\n/**\n * Calculate cubic root for a number\n *\n * Code from es6-shim.js:\n * https://github.com/paulmillr/es6-shim/blob/master/es6-shim.js#L1564-L1577\n *\n * @param {number} x\n * @returns {number} Returns the cubic root of x\n */\nexport var cbrt = /* #__PURE__ */Math.cbrt || function cbrt(x) {\n if (x === 0) {\n return x;\n }\n var negate = x < 0;\n var result;\n if (negate) {\n x = -x;\n }\n if (isFinite(x)) {\n result = Math.exp(Math.log(x) / 3);\n // from https://en.wikipedia.org/wiki/Cube_root#Numerical_methods\n result = (x / (result * result) + 2 * result) / 3;\n } else {\n result = x;\n }\n return negate ? -result : result;\n};\n\n/**\n * Calculates exponentiation minus 1\n * @param {number} x\n * @return {number} res\n */\nexport var expm1 = /* #__PURE__ */Math.expm1 || function expm1(x) {\n return x >= 2e-4 || x <= -2e-4 ? Math.exp(x) - 1 : x + x * x / 2 + x * x * x / 6;\n};\n\n/**\n * Formats a number in a given base\n * @param {number} n\n * @param {number} base\n * @param {number} size\n * @returns {string}\n */\nfunction formatNumberToBase(n, base, size) {\n var prefixes = {\n 2: '0b',\n 8: '0o',\n 16: '0x'\n };\n var prefix = prefixes[base];\n var suffix = '';\n if (size) {\n if (size < 1) {\n throw new Error('size must be in greater than 0');\n }\n if (!isInteger(size)) {\n throw new Error('size must be an integer');\n }\n if (n > 2 ** (size - 1) - 1 || n < -(2 ** (size - 1))) {\n throw new Error(\"Value must be in range [-2^\".concat(size - 1, \", 2^\").concat(size - 1, \"-1]\"));\n }\n if (!isInteger(n)) {\n throw new Error('Value must be an integer');\n }\n if (n < 0) {\n n = n + 2 ** size;\n }\n suffix = \"i\".concat(size);\n }\n var sign = '';\n if (n < 0) {\n n = -n;\n sign = '-';\n }\n return \"\".concat(sign).concat(prefix).concat(n.toString(base)).concat(suffix);\n}\n\n/**\n * Convert a number to a formatted string representation.\n *\n * Syntax:\n *\n * format(value)\n * format(value, options)\n * format(value, precision)\n * format(value, fn)\n *\n * Where:\n *\n * {number} value The value to be formatted\n * {Object} options An object with formatting options. Available options:\n * {string} notation\n * Number notation. Choose from:\n * 'fixed' Always use regular number notation.\n * For example '123.40' and '14000000'\n * 'exponential' Always use exponential notation.\n * For example '1.234e+2' and '1.4e+7'\n * 'engineering' Always use engineering notation.\n * For example '123.4e+0' and '14.0e+6'\n * 'auto' (default) Regular number notation for numbers\n * having an absolute value between\n * `lowerExp` and `upperExp` bounds, and\n * uses exponential notation elsewhere.\n * Lower bound is included, upper bound\n * is excluded.\n * For example '123.4' and '1.4e7'.\n * 'bin', 'oct, or\n * 'hex' Format the number using binary, octal,\n * or hexadecimal notation.\n * For example '0b1101' and '0x10fe'.\n * {number} wordSize The word size in bits to use for formatting\n * in binary, octal, or hexadecimal notation.\n * To be used only with 'bin', 'oct', or 'hex'\n * values for 'notation' option. When this option\n * is defined the value is formatted as a signed\n * twos complement integer of the given word size\n * and the size suffix is appended to the output.\n * For example\n * format(-1, {notation: 'hex', wordSize: 8}) === '0xffi8'.\n * Default value is undefined.\n * {number} precision A number between 0 and 16 to round\n * the digits of the number.\n * In case of notations 'exponential',\n * 'engineering', and 'auto',\n * `precision` defines the total\n * number of significant digits returned.\n * In case of notation 'fixed',\n * `precision` defines the number of\n * significant digits after the decimal\n * point.\n * `precision` is undefined by default,\n * not rounding any digits.\n * {number} lowerExp Exponent determining the lower boundary\n * for formatting a value with an exponent\n * when `notation='auto`.\n * Default value is `-3`.\n * {number} upperExp Exponent determining the upper boundary\n * for formatting a value with an exponent\n * when `notation='auto`.\n * Default value is `5`.\n * {Function} fn A custom formatting function. Can be used to override the\n * built-in notations. Function `fn` is called with `value` as\n * parameter and must return a string. Is useful for example to\n * format all values inside a matrix in a particular way.\n *\n * Examples:\n *\n * format(6.4) // '6.4'\n * format(1240000) // '1.24e6'\n * format(1/3) // '0.3333333333333333'\n * format(1/3, 3) // '0.333'\n * format(21385, 2) // '21000'\n * format(12.071, {notation: 'fixed'}) // '12'\n * format(2.3, {notation: 'fixed', precision: 2}) // '2.30'\n * format(52.8, {notation: 'exponential'}) // '5.28e+1'\n * format(12345678, {notation: 'engineering'}) // '12.345678e+6'\n *\n * @param {number} value\n * @param {Object | Function | number} [options]\n * @return {string} str The formatted value\n */\nexport function format(value, options) {\n if (typeof options === 'function') {\n // handle format(value, fn)\n return options(value);\n }\n\n // handle special cases\n if (value === Infinity) {\n return 'Infinity';\n } else if (value === -Infinity) {\n return '-Infinity';\n } else if (isNaN(value)) {\n return 'NaN';\n }\n\n // default values for options\n var notation = 'auto';\n var precision;\n var wordSize;\n if (options) {\n // determine notation from options\n if (options.notation) {\n notation = options.notation;\n }\n\n // determine precision from options\n if (isNumber(options)) {\n precision = options;\n } else if (isNumber(options.precision)) {\n precision = options.precision;\n }\n if (options.wordSize) {\n wordSize = options.wordSize;\n if (typeof wordSize !== 'number') {\n throw new Error('Option \"wordSize\" must be a number');\n }\n }\n }\n\n // handle the various notations\n switch (notation) {\n case 'fixed':\n return toFixed(value, precision);\n case 'exponential':\n return toExponential(value, precision);\n case 'engineering':\n return toEngineering(value, precision);\n case 'bin':\n return formatNumberToBase(value, 2, wordSize);\n case 'oct':\n return formatNumberToBase(value, 8, wordSize);\n case 'hex':\n return formatNumberToBase(value, 16, wordSize);\n case 'auto':\n // remove trailing zeros after the decimal point\n return toPrecision(value, precision, options && options).replace(/((\\.\\d*?)(0+))($|e)/, function () {\n var digits = arguments[2];\n var e = arguments[4];\n return digits !== '.' ? digits + e : e;\n });\n default:\n throw new Error('Unknown notation \"' + notation + '\". ' + 'Choose \"auto\", \"exponential\", \"fixed\", \"bin\", \"oct\", or \"hex.');\n }\n}\n\n/**\n * Split a number into sign, coefficients, and exponent\n * @param {number | string} value\n * @return {SplitValue}\n * Returns an object containing sign, coefficients, and exponent\n */\nexport function splitNumber(value) {\n // parse the input value\n var match = String(value).toLowerCase().match(/^(-?)(\\d+\\.?\\d*)(e([+-]?\\d+))?$/);\n if (!match) {\n throw new SyntaxError('Invalid number ' + value);\n }\n var sign = match[1];\n var digits = match[2];\n var exponent = parseFloat(match[4] || '0');\n var dot = digits.indexOf('.');\n exponent += dot !== -1 ? dot - 1 : digits.length - 1;\n var coefficients = digits.replace('.', '') // remove the dot (must be removed before removing leading zeros)\n .replace(/^0*/, function (zeros) {\n // remove leading zeros, add their count to the exponent\n exponent -= zeros.length;\n return '';\n }).replace(/0*$/, '') // remove trailing zeros\n .split('').map(function (d) {\n return parseInt(d);\n });\n if (coefficients.length === 0) {\n coefficients.push(0);\n exponent++;\n }\n return {\n sign,\n coefficients,\n exponent\n };\n}\n\n/**\n * Format a number in engineering notation. Like '1.23e+6', '2.3e+0', '3.500e-3'\n * @param {number | string} value\n * @param {number} [precision] Optional number of significant figures to return.\n */\nexport function toEngineering(value, precision) {\n if (isNaN(value) || !isFinite(value)) {\n return String(value);\n }\n var split = splitNumber(value);\n var rounded = roundDigits(split, precision);\n var e = rounded.exponent;\n var c = rounded.coefficients;\n\n // find nearest lower multiple of 3 for exponent\n var newExp = e % 3 === 0 ? e : e < 0 ? e - 3 - e % 3 : e - e % 3;\n if (isNumber(precision)) {\n // add zeroes to give correct sig figs\n while (precision > c.length || e - newExp + 1 > c.length) {\n c.push(0);\n }\n } else {\n // concatenate coefficients with necessary zeros\n // add zeros if necessary (for example: 1e+8 -> 100e+6)\n var missingZeros = Math.abs(e - newExp) - (c.length - 1);\n for (var i = 0; i < missingZeros; i++) {\n c.push(0);\n }\n }\n\n // find difference in exponents\n var expDiff = Math.abs(e - newExp);\n var decimalIdx = 1;\n\n // push decimal index over by expDiff times\n while (expDiff > 0) {\n decimalIdx++;\n expDiff--;\n }\n\n // if all coefficient values are zero after the decimal point and precision is unset, don't add a decimal value.\n // otherwise concat with the rest of the coefficients\n var decimals = c.slice(decimalIdx).join('');\n var decimalVal = isNumber(precision) && decimals.length || decimals.match(/[1-9]/) ? '.' + decimals : '';\n var str = c.slice(0, decimalIdx).join('') + decimalVal + 'e' + (e >= 0 ? '+' : '') + newExp.toString();\n return rounded.sign + str;\n}\n\n/**\n * Format a number with fixed notation.\n * @param {number | string} value\n * @param {number} [precision=undefined] Optional number of decimals after the\n * decimal point. null by default.\n */\nexport function toFixed(value, precision) {\n if (isNaN(value) || !isFinite(value)) {\n return String(value);\n }\n var splitValue = splitNumber(value);\n var rounded = typeof precision === 'number' ? roundDigits(splitValue, splitValue.exponent + 1 + precision) : splitValue;\n var c = rounded.coefficients;\n var p = rounded.exponent + 1; // exponent may have changed\n\n // append zeros if needed\n var pp = p + (precision || 0);\n if (c.length < pp) {\n c = c.concat(zeros(pp - c.length));\n }\n\n // prepend zeros if needed\n if (p < 0) {\n c = zeros(-p + 1).concat(c);\n p = 1;\n }\n\n // insert a dot if needed\n if (p < c.length) {\n c.splice(p, 0, p === 0 ? '0.' : '.');\n }\n return rounded.sign + c.join('');\n}\n\n/**\n * Format a number in exponential notation. Like '1.23e+5', '2.3e+0', '3.500e-3'\n * @param {number | string} value\n * @param {number} [precision] Number of digits in formatted output.\n * If not provided, the maximum available digits\n * is used.\n */\nexport function toExponential(value, precision) {\n if (isNaN(value) || !isFinite(value)) {\n return String(value);\n }\n\n // round if needed, else create a clone\n var split = splitNumber(value);\n var rounded = precision ? roundDigits(split, precision) : split;\n var c = rounded.coefficients;\n var e = rounded.exponent;\n\n // append zeros if needed\n if (c.length < precision) {\n c = c.concat(zeros(precision - c.length));\n }\n\n // format as `C.CCCe+EEE` or `C.CCCe-EEE`\n var first = c.shift();\n return rounded.sign + first + (c.length > 0 ? '.' + c.join('') : '') + 'e' + (e >= 0 ? '+' : '') + e;\n}\n\n/**\n * Format a number with a certain precision\n * @param {number | string} value\n * @param {number} [precision=undefined] Optional number of digits.\n * @param {{lowerExp: number | undefined, upperExp: number | undefined}} [options]\n * By default:\n * lowerExp = -3 (incl)\n * upper = +5 (excl)\n * @return {string}\n */\nexport function toPrecision(value, precision, options) {\n if (isNaN(value) || !isFinite(value)) {\n return String(value);\n }\n\n // determine lower and upper bound for exponential notation.\n var lowerExp = options && options.lowerExp !== undefined ? options.lowerExp : -3;\n var upperExp = options && options.upperExp !== undefined ? options.upperExp : 5;\n var split = splitNumber(value);\n var rounded = precision ? roundDigits(split, precision) : split;\n if (rounded.exponent < lowerExp || rounded.exponent >= upperExp) {\n // exponential notation\n return toExponential(value, precision);\n } else {\n var c = rounded.coefficients;\n var e = rounded.exponent;\n\n // append trailing zeros\n if (c.length < precision) {\n c = c.concat(zeros(precision - c.length));\n }\n\n // append trailing zeros\n // TODO: simplify the next statement\n c = c.concat(zeros(e - c.length + 1 + (c.length < precision ? precision - c.length : 0)));\n\n // prepend zeros\n c = zeros(-e).concat(c);\n var dot = e > 0 ? e : 0;\n if (dot < c.length - 1) {\n c.splice(dot + 1, 0, '.');\n }\n return rounded.sign + c.join('');\n }\n}\n\n/**\n * Round the number of digits of a number *\n * @param {SplitValue} split A value split with .splitNumber(value)\n * @param {number} precision A positive integer\n * @return {SplitValue}\n * Returns an object containing sign, coefficients, and exponent\n * with rounded digits\n */\nexport function roundDigits(split, precision) {\n // create a clone\n var rounded = {\n sign: split.sign,\n coefficients: split.coefficients,\n exponent: split.exponent\n };\n var c = rounded.coefficients;\n\n // prepend zeros if needed\n while (precision <= 0) {\n c.unshift(0);\n rounded.exponent++;\n precision++;\n }\n if (c.length > precision) {\n var removed = c.splice(precision, c.length - precision);\n if (removed[0] >= 5) {\n var i = precision - 1;\n c[i]++;\n while (c[i] === 10) {\n c.pop();\n if (i === 0) {\n c.unshift(0);\n rounded.exponent++;\n i++;\n }\n i--;\n c[i]++;\n }\n }\n }\n return rounded;\n}\n\n/**\n * Create an array filled with zeros.\n * @param {number} length\n * @return {Array}\n */\nfunction zeros(length) {\n var arr = [];\n for (var i = 0; i < length; i++) {\n arr.push(0);\n }\n return arr;\n}\n\n/**\n * Count the number of significant digits of a number.\n *\n * For example:\n * 2.34 returns 3\n * 0.0034 returns 2\n * 120.5e+30 returns 4\n *\n * @param {number} value\n * @return {number} digits Number of significant digits\n */\nexport function digits(value) {\n return value.toExponential().replace(/e.*$/, '') // remove exponential notation\n .replace(/^0\\.?0*|\\./, '') // remove decimal point and leading zeros\n .length;\n}\n\n/**\n * Minimum number added to one that makes the result different than one\n */\nexport var DBL_EPSILON = Number.EPSILON || 2.2204460492503130808472633361816E-16;\n\n/**\n * Compares two floating point numbers.\n * @param {number} x First value to compare\n * @param {number} y Second value to compare\n * @param {number} [epsilon] The maximum relative difference between x and y\n * If epsilon is undefined or null, the function will\n * test whether x and y are exactly equal.\n * @return {boolean} whether the two numbers are nearly equal\n*/\nexport function nearlyEqual(x, y, epsilon) {\n // if epsilon is null or undefined, test whether x and y are exactly equal\n if (epsilon === null || epsilon === undefined) {\n return x === y;\n }\n if (x === y) {\n return true;\n }\n\n // NaN\n if (isNaN(x) || isNaN(y)) {\n return false;\n }\n\n // at this point x and y should be finite\n if (isFinite(x) && isFinite(y)) {\n // check numbers are very close, needed when comparing numbers near zero\n var diff = Math.abs(x - y);\n if (diff < DBL_EPSILON) {\n return true;\n } else {\n // use relative error\n return diff <= Math.max(Math.abs(x), Math.abs(y)) * epsilon;\n }\n }\n\n // Infinite and Number or negative Infinite and positive Infinite cases\n return false;\n}\n\n/**\n * Calculate the hyperbolic arccos of a number\n * @param {number} x\n * @return {number}\n */\nexport var acosh = Math.acosh || function (x) {\n return Math.log(Math.sqrt(x * x - 1) + x);\n};\nexport var asinh = Math.asinh || function (x) {\n return Math.log(Math.sqrt(x * x + 1) + x);\n};\n\n/**\n * Calculate the hyperbolic arctangent of a number\n * @param {number} x\n * @return {number}\n */\nexport var atanh = Math.atanh || function (x) {\n return Math.log((1 + x) / (1 - x)) / 2;\n};\n\n/**\n * Calculate the hyperbolic cosine of a number\n * @param {number} x\n * @returns {number}\n */\nexport var cosh = Math.cosh || function (x) {\n return (Math.exp(x) + Math.exp(-x)) / 2;\n};\n\n/**\n * Calculate the hyperbolic sine of a number\n * @param {number} x\n * @returns {number}\n */\nexport var sinh = Math.sinh || function (x) {\n return (Math.exp(x) - Math.exp(-x)) / 2;\n};\n\n/**\n * Calculate the hyperbolic tangent of a number\n * @param {number} x\n * @returns {number}\n */\nexport var tanh = Math.tanh || function (x) {\n var e = Math.exp(2 * x);\n return (e - 1) / (e + 1);\n};\n\n/**\n * Returns a value with the magnitude of x and the sign of y.\n * @param {number} x\n * @param {number} y\n * @returns {number}\n */\nexport function copysign(x, y) {\n var signx = x > 0 ? true : x < 0 ? false : 1 / x === Infinity;\n var signy = y > 0 ? true : y < 0 ? false : 1 / y === Infinity;\n return signx ^ signy ? -x : x;\n}","import { isInteger } from '../number.js';\n\n/**\n * Formats a BigNumber in a given base\n * @param {BigNumber} n\n * @param {number} base\n * @param {number} size\n * @returns {string}\n */\nfunction formatBigNumberToBase(n, base, size) {\n var BigNumberCtor = n.constructor;\n var big2 = new BigNumberCtor(2);\n var suffix = '';\n if (size) {\n if (size < 1) {\n throw new Error('size must be in greater than 0');\n }\n if (!isInteger(size)) {\n throw new Error('size must be an integer');\n }\n if (n.greaterThan(big2.pow(size - 1).sub(1)) || n.lessThan(big2.pow(size - 1).mul(-1))) {\n throw new Error(\"Value must be in range [-2^\".concat(size - 1, \", 2^\").concat(size - 1, \"-1]\"));\n }\n if (!n.isInteger()) {\n throw new Error('Value must be an integer');\n }\n if (n.lessThan(0)) {\n n = n.add(big2.pow(size));\n }\n suffix = \"i\".concat(size);\n }\n switch (base) {\n case 2:\n return \"\".concat(n.toBinary()).concat(suffix);\n case 8:\n return \"\".concat(n.toOctal()).concat(suffix);\n case 16:\n return \"\".concat(n.toHexadecimal()).concat(suffix);\n default:\n throw new Error(\"Base \".concat(base, \" not supported \"));\n }\n}\n\n/**\n * Convert a BigNumber to a formatted string representation.\n *\n * Syntax:\n *\n * format(value)\n * format(value, options)\n * format(value, precision)\n * format(value, fn)\n *\n * Where:\n *\n * {number} value The value to be formatted\n * {Object} options An object with formatting options. Available options:\n * {string} notation\n * Number notation. Choose from:\n * 'fixed' Always use regular number notation.\n * For example '123.40' and '14000000'\n * 'exponential' Always use exponential notation.\n * For example '1.234e+2' and '1.4e+7'\n * 'auto' (default) Regular number notation for numbers\n * having an absolute value between\n * `lower` and `upper` bounds, and uses\n * exponential notation elsewhere.\n * Lower bound is included, upper bound\n * is excluded.\n * For example '123.4' and '1.4e7'.\n * 'bin', 'oct, or\n * 'hex' Format the number using binary, octal,\n * or hexadecimal notation.\n * For example '0b1101' and '0x10fe'.\n * {number} wordSize The word size in bits to use for formatting\n * in binary, octal, or hexadecimal notation.\n * To be used only with 'bin', 'oct', or 'hex'\n * values for 'notation' option. When this option\n * is defined the value is formatted as a signed\n * twos complement integer of the given word size\n * and the size suffix is appended to the output.\n * For example\n * format(-1, {notation: 'hex', wordSize: 8}) === '0xffi8'.\n * Default value is undefined.\n * {number} precision A number between 0 and 16 to round\n * the digits of the number.\n * In case of notations 'exponential',\n * 'engineering', and 'auto',\n * `precision` defines the total\n * number of significant digits returned.\n * In case of notation 'fixed',\n * `precision` defines the number of\n * significant digits after the decimal\n * point.\n * `precision` is undefined by default.\n * {number} lowerExp Exponent determining the lower boundary\n * for formatting a value with an exponent\n * when `notation='auto`.\n * Default value is `-3`.\n * {number} upperExp Exponent determining the upper boundary\n * for formatting a value with an exponent\n * when `notation='auto`.\n * Default value is `5`.\n * {Function} fn A custom formatting function. Can be used to override the\n * built-in notations. Function `fn` is called with `value` as\n * parameter and must return a string. Is useful for example to\n * format all values inside a matrix in a particular way.\n *\n * Examples:\n *\n * format(6.4) // '6.4'\n * format(1240000) // '1.24e6'\n * format(1/3) // '0.3333333333333333'\n * format(1/3, 3) // '0.333'\n * format(21385, 2) // '21000'\n * format(12e8, {notation: 'fixed'}) // returns '1200000000'\n * format(2.3, {notation: 'fixed', precision: 4}) // returns '2.3000'\n * format(52.8, {notation: 'exponential'}) // returns '5.28e+1'\n * format(12400, {notation: 'engineering'}) // returns '12.400e+3'\n *\n * @param {BigNumber} value\n * @param {Object | Function | number} [options]\n * @return {string} str The formatted value\n */\nexport function format(value, options) {\n if (typeof options === 'function') {\n // handle format(value, fn)\n return options(value);\n }\n\n // handle special cases\n if (!value.isFinite()) {\n return value.isNaN() ? 'NaN' : value.gt(0) ? 'Infinity' : '-Infinity';\n }\n\n // default values for options\n var notation = 'auto';\n var precision;\n var wordSize;\n if (options !== undefined) {\n // determine notation from options\n if (options.notation) {\n notation = options.notation;\n }\n\n // determine precision from options\n if (typeof options === 'number') {\n precision = options;\n } else if (options.precision !== undefined) {\n precision = options.precision;\n }\n if (options.wordSize) {\n wordSize = options.wordSize;\n if (typeof wordSize !== 'number') {\n throw new Error('Option \"wordSize\" must be a number');\n }\n }\n }\n\n // handle the various notations\n switch (notation) {\n case 'fixed':\n return toFixed(value, precision);\n case 'exponential':\n return toExponential(value, precision);\n case 'engineering':\n return toEngineering(value, precision);\n case 'bin':\n return formatBigNumberToBase(value, 2, wordSize);\n case 'oct':\n return formatBigNumberToBase(value, 8, wordSize);\n case 'hex':\n return formatBigNumberToBase(value, 16, wordSize);\n case 'auto':\n {\n // determine lower and upper bound for exponential notation.\n // TODO: implement support for upper and lower to be BigNumbers themselves\n var lowerExp = options && options.lowerExp !== undefined ? options.lowerExp : -3;\n var upperExp = options && options.upperExp !== undefined ? options.upperExp : 5;\n\n // handle special case zero\n if (value.isZero()) return '0';\n\n // determine whether or not to output exponential notation\n var str;\n var rounded = value.toSignificantDigits(precision);\n var exp = rounded.e;\n if (exp >= lowerExp && exp < upperExp) {\n // normal number notation\n str = rounded.toFixed();\n } else {\n // exponential notation\n str = toExponential(value, precision);\n }\n\n // remove trailing zeros after the decimal point\n return str.replace(/((\\.\\d*?)(0+))($|e)/, function () {\n var digits = arguments[2];\n var e = arguments[4];\n return digits !== '.' ? digits + e : e;\n });\n }\n default:\n throw new Error('Unknown notation \"' + notation + '\". ' + 'Choose \"auto\", \"exponential\", \"fixed\", \"bin\", \"oct\", or \"hex.');\n }\n}\n\n/**\n * Format a BigNumber in engineering notation. Like '1.23e+6', '2.3e+0', '3.500e-3'\n * @param {BigNumber} value\n * @param {number} [precision] Optional number of significant figures to return.\n */\nexport function toEngineering(value, precision) {\n // find nearest lower multiple of 3 for exponent\n var e = value.e;\n var newExp = e % 3 === 0 ? e : e < 0 ? e - 3 - e % 3 : e - e % 3;\n\n // find difference in exponents, and calculate the value without exponent\n var valueWithoutExp = value.mul(Math.pow(10, -newExp));\n var valueStr = valueWithoutExp.toPrecision(precision);\n if (valueStr.indexOf('e') !== -1) {\n var BigNumber = value.constructor;\n valueStr = new BigNumber(valueStr).toFixed();\n }\n return valueStr + 'e' + (e >= 0 ? '+' : '') + newExp.toString();\n}\n\n/**\n * Format a number in exponential notation. Like '1.23e+5', '2.3e+0', '3.500e-3'\n * @param {BigNumber} value\n * @param {number} [precision] Number of digits in formatted output.\n * If not provided, the maximum available digits\n * is used.\n * @returns {string} str\n */\nexport function toExponential(value, precision) {\n if (precision !== undefined) {\n return value.toExponential(precision - 1); // Note the offset of one\n } else {\n return value.toExponential();\n }\n}\n\n/**\n * Format a number with fixed notation.\n * @param {BigNumber} value\n * @param {number} [precision=undefined] Optional number of decimals after the\n * decimal point. Undefined by default.\n */\nexport function toFixed(value, precision) {\n return value.toFixed(precision);\n}","import { isBigNumber, isString, typeOf } from './is.js';\nimport { format as formatNumber } from './number.js';\nimport { format as formatBigNumber } from './bignumber/formatter.js';\n\n/**\n * Check if a text ends with a certain string.\n * @param {string} text\n * @param {string} search\n */\nexport function endsWith(text, search) {\n var start = text.length - search.length;\n var end = text.length;\n return text.substring(start, end) === search;\n}\n\n/**\n * Format a value of any type into a string.\n *\n * Usage:\n * math.format(value)\n * math.format(value, precision)\n * math.format(value, options)\n *\n * When value is a function:\n *\n * - When the function has a property `syntax`, it returns this\n * syntax description.\n * - In other cases, a string `'function'` is returned.\n *\n * When `value` is an Object:\n *\n * - When the object contains a property `format` being a function, this\n * function is invoked as `value.format(options)` and the result is returned.\n * - When the object has its own `toString` method, this method is invoked\n * and the result is returned.\n * - In other cases the function will loop over all object properties and\n * return JSON object notation like '{\"a\": 2, \"b\": 3}'.\n *\n * Example usage:\n * math.format(2/7) // '0.2857142857142857'\n * math.format(math.pi, 3) // '3.14'\n * math.format(new Complex(2, 3)) // '2 + 3i'\n * math.format('hello') // '\"hello\"'\n *\n * @param {*} value Value to be stringified\n * @param {Object | number | Function} [options]\n * Formatting options. See src/utils/number.js:format for a\n * description of the available options controlling number output.\n * This generic \"format\" also supports the option property `truncate: NN`\n * giving the maximum number NN of characters to return (if there would\n * have been more, they are deleted and replaced by an ellipsis).\n * @return {string} str\n */\nexport function format(value, options) {\n var result = _format(value, options);\n if (options && typeof options === 'object' && 'truncate' in options && result.length > options.truncate) {\n return result.substring(0, options.truncate - 3) + '...';\n }\n return result;\n}\nfunction _format(value, options) {\n if (typeof value === 'number') {\n return formatNumber(value, options);\n }\n if (isBigNumber(value)) {\n return formatBigNumber(value, options);\n }\n\n // note: we use unsafe duck-typing here to check for Fractions, this is\n // ok here since we're only invoking toString or concatenating its values\n if (looksLikeFraction(value)) {\n if (!options || options.fraction !== 'decimal') {\n // output as ratio, like '1/3'\n return value.s * value.n + '/' + value.d;\n } else {\n // output as decimal, like '0.(3)'\n return value.toString();\n }\n }\n if (Array.isArray(value)) {\n return formatArray(value, options);\n }\n if (isString(value)) {\n return '\"' + value + '\"';\n }\n if (typeof value === 'function') {\n return value.syntax ? String(value.syntax) : 'function';\n }\n if (value && typeof value === 'object') {\n if (typeof value.format === 'function') {\n return value.format(options);\n } else if (value && value.toString(options) !== {}.toString()) {\n // this object has a non-native toString method, use that one\n return value.toString(options);\n } else {\n var entries = Object.keys(value).map(key => {\n return '\"' + key + '\": ' + format(value[key], options);\n });\n return '{' + entries.join(', ') + '}';\n }\n }\n return String(value);\n}\n\n/**\n * Stringify a value into a string enclosed in double quotes.\n * Unescaped double quotes and backslashes inside the value are escaped.\n * @param {*} value\n * @return {string}\n */\nexport function stringify(value) {\n var text = String(value);\n var escaped = '';\n var i = 0;\n while (i < text.length) {\n var c = text.charAt(i);\n if (c === '\\\\') {\n escaped += c;\n i++;\n c = text.charAt(i);\n if (c === '' || '\"\\\\/bfnrtu'.indexOf(c) === -1) {\n escaped += '\\\\'; // no valid escape character -> escape it\n }\n\n escaped += c;\n } else if (c === '\"') {\n escaped += '\\\\\"';\n } else {\n escaped += c;\n }\n i++;\n }\n return '\"' + escaped + '\"';\n}\n\n/**\n * Escape special HTML characters\n * @param {*} value\n * @return {string}\n */\nexport function escape(value) {\n var text = String(value);\n text = text.replace(/&/g, '&').replace(/\"/g, '"').replace(/'/g, ''').replace(//g, '>');\n return text;\n}\n\n/**\n * Recursively format an n-dimensional matrix\n * Example output: \"[[1, 2], [3, 4]]\"\n * @param {Array} array\n * @param {Object | number | Function} [options] Formatting options. See\n * lib/utils/number:format for a\n * description of the available\n * options.\n * @returns {string} str\n */\nfunction formatArray(array, options) {\n if (Array.isArray(array)) {\n var str = '[';\n var len = array.length;\n for (var i = 0; i < len; i++) {\n if (i !== 0) {\n str += ', ';\n }\n str += formatArray(array[i], options);\n }\n str += ']';\n return str;\n } else {\n return format(array, options);\n }\n}\n\n/**\n * Check whether a value looks like a Fraction (unsafe duck-type check)\n * @param {*} value\n * @return {boolean}\n */\nfunction looksLikeFraction(value) {\n return value && typeof value === 'object' && typeof value.s === 'number' && typeof value.n === 'number' && typeof value.d === 'number' || false;\n}\n\n/**\n * Compare two strings\n * @param {string} x\n * @param {string} y\n * @returns {number}\n */\nexport function compareText(x, y) {\n // we don't want to convert numbers to string, only accept string input\n if (!isString(x)) {\n throw new TypeError('Unexpected type of argument in function compareText ' + '(expected: string or Array or Matrix, actual: ' + typeOf(x) + ', index: 0)');\n }\n if (!isString(y)) {\n throw new TypeError('Unexpected type of argument in function compareText ' + '(expected: string or Array or Matrix, actual: ' + typeOf(y) + ', index: 1)');\n }\n return x === y ? 0 : x > y ? 1 : -1;\n}","/**\n * Create a range error with the message:\n * 'Dimension mismatch ( != )'\n * @param {number | number[]} actual The actual size\n * @param {number | number[]} expected The expected size\n * @param {string} [relation='!='] Optional relation between actual\n * and expected size: '!=', '<', etc.\n * @extends RangeError\n */\nexport function DimensionError(actual, expected, relation) {\n if (!(this instanceof DimensionError)) {\n throw new SyntaxError('Constructor must be called with the new operator');\n }\n this.actual = actual;\n this.expected = expected;\n this.relation = relation;\n this.message = 'Dimension mismatch (' + (Array.isArray(actual) ? '[' + actual.join(', ') + ']' : actual) + ' ' + (this.relation || '!=') + ' ' + (Array.isArray(expected) ? '[' + expected.join(', ') + ']' : expected) + ')';\n this.stack = new Error().stack;\n}\nDimensionError.prototype = new RangeError();\nDimensionError.prototype.constructor = RangeError;\nDimensionError.prototype.name = 'DimensionError';\nDimensionError.prototype.isDimensionError = true;","/**\n * Create a range error with the message:\n * 'Index out of range (index < min)'\n * 'Index out of range (index < max)'\n *\n * @param {number} index The actual index\n * @param {number} [min=0] Minimum index (included)\n * @param {number} [max] Maximum index (excluded)\n * @extends RangeError\n */\nexport function IndexError(index, min, max) {\n if (!(this instanceof IndexError)) {\n throw new SyntaxError('Constructor must be called with the new operator');\n }\n this.index = index;\n if (arguments.length < 3) {\n this.min = 0;\n this.max = min;\n } else {\n this.min = min;\n this.max = max;\n }\n if (this.min !== undefined && this.index < this.min) {\n this.message = 'Index out of range (' + this.index + ' < ' + this.min + ')';\n } else if (this.max !== undefined && this.index >= this.max) {\n this.message = 'Index out of range (' + this.index + ' > ' + (this.max - 1) + ')';\n } else {\n this.message = 'Index out of range (' + this.index + ')';\n }\n this.stack = new Error().stack;\n}\nIndexError.prototype = new RangeError();\nIndexError.prototype.constructor = RangeError;\nIndexError.prototype.name = 'IndexError';\nIndexError.prototype.isIndexError = true;","import { isInteger } from './number.js';\nimport { isNumber } from './is.js';\nimport { format } from './string.js';\nimport { DimensionError } from '../error/DimensionError.js';\nimport { IndexError } from '../error/IndexError.js';\n\n/**\n * Calculate the size of a multi dimensional array.\n * This function checks the size of the first entry, it does not validate\n * whether all dimensions match. (use function `validate` for that)\n * @param {Array} x\n * @Return {Number[]} size\n */\nexport function arraySize(x) {\n var s = [];\n while (Array.isArray(x)) {\n s.push(x.length);\n x = x[0];\n }\n return s;\n}\n\n/**\n * Recursively validate whether each element in a multi dimensional array\n * has a size corresponding to the provided size array.\n * @param {Array} array Array to be validated\n * @param {number[]} size Array with the size of each dimension\n * @param {number} dim Current dimension\n * @throws DimensionError\n * @private\n */\nfunction _validate(array, size, dim) {\n var i;\n var len = array.length;\n if (len !== size[dim]) {\n throw new DimensionError(len, size[dim]);\n }\n if (dim < size.length - 1) {\n // recursively validate each child array\n var dimNext = dim + 1;\n for (i = 0; i < len; i++) {\n var child = array[i];\n if (!Array.isArray(child)) {\n throw new DimensionError(size.length - 1, size.length, '<');\n }\n _validate(array[i], size, dimNext);\n }\n } else {\n // last dimension. none of the childs may be an array\n for (i = 0; i < len; i++) {\n if (Array.isArray(array[i])) {\n throw new DimensionError(size.length + 1, size.length, '>');\n }\n }\n }\n}\n\n/**\n * Validate whether each element in a multi dimensional array has\n * a size corresponding to the provided size array.\n * @param {Array} array Array to be validated\n * @param {number[]} size Array with the size of each dimension\n * @throws DimensionError\n */\nexport function validate(array, size) {\n var isScalar = size.length === 0;\n if (isScalar) {\n // scalar\n if (Array.isArray(array)) {\n throw new DimensionError(array.length, 0);\n }\n } else {\n // array\n _validate(array, size, 0);\n }\n}\n\n/**\n * Test whether index is an integer number with index >= 0 and index < length\n * when length is provided\n * @param {number} index Zero-based index\n * @param {number} [length] Length of the array\n */\nexport function validateIndex(index, length) {\n if (!isNumber(index) || !isInteger(index)) {\n throw new TypeError('Index must be an integer (value: ' + index + ')');\n }\n if (index < 0 || typeof length === 'number' && index >= length) {\n throw new IndexError(index, length);\n }\n}\n\n/**\n * Resize a multi dimensional array. The resized array is returned.\n * @param {Array} array Array to be resized\n * @param {Array.} size Array with the size of each dimension\n * @param {*} [defaultValue=0] Value to be filled in in new entries,\n * zero by default. Specify for example `null`,\n * to clearly see entries that are not explicitly\n * set.\n * @return {Array} array The resized array\n */\nexport function resize(array, size, defaultValue) {\n // TODO: add support for scalars, having size=[] ?\n\n // check the type of the arguments\n if (!Array.isArray(array) || !Array.isArray(size)) {\n throw new TypeError('Array expected');\n }\n if (size.length === 0) {\n throw new Error('Resizing to scalar is not supported');\n }\n\n // check whether size contains positive integers\n size.forEach(function (value) {\n if (!isNumber(value) || !isInteger(value) || value < 0) {\n throw new TypeError('Invalid size, must contain positive integers ' + '(size: ' + format(size) + ')');\n }\n });\n\n // recursively resize the array\n var _defaultValue = defaultValue !== undefined ? defaultValue : 0;\n _resize(array, size, 0, _defaultValue);\n return array;\n}\n\n/**\n * Recursively resize a multi dimensional array\n * @param {Array} array Array to be resized\n * @param {number[]} size Array with the size of each dimension\n * @param {number} dim Current dimension\n * @param {*} [defaultValue] Value to be filled in in new entries,\n * undefined by default.\n * @private\n */\nfunction _resize(array, size, dim, defaultValue) {\n var i;\n var elem;\n var oldLen = array.length;\n var newLen = size[dim];\n var minLen = Math.min(oldLen, newLen);\n\n // apply new length\n array.length = newLen;\n if (dim < size.length - 1) {\n // non-last dimension\n var dimNext = dim + 1;\n\n // resize existing child arrays\n for (i = 0; i < minLen; i++) {\n // resize child array\n elem = array[i];\n if (!Array.isArray(elem)) {\n elem = [elem]; // add a dimension\n array[i] = elem;\n }\n _resize(elem, size, dimNext, defaultValue);\n }\n\n // create new child arrays\n for (i = minLen; i < newLen; i++) {\n // get child array\n elem = [];\n array[i] = elem;\n\n // resize new child array\n _resize(elem, size, dimNext, defaultValue);\n }\n } else {\n // last dimension\n\n // remove dimensions of existing values\n for (i = 0; i < minLen; i++) {\n while (Array.isArray(array[i])) {\n array[i] = array[i][0];\n }\n }\n\n // fill new elements with the default value\n for (i = minLen; i < newLen; i++) {\n array[i] = defaultValue;\n }\n }\n}\n\n/**\n * Re-shape a multi dimensional array to fit the specified dimensions\n * @param {Array} array Array to be reshaped\n * @param {Array.} sizes List of sizes for each dimension\n * @returns {Array} Array whose data has been formatted to fit the\n * specified dimensions\n *\n * @throws {DimensionError} If the product of the new dimension sizes does\n * not equal that of the old ones\n */\nexport function reshape(array, sizes) {\n var flatArray = flatten(array);\n var currentLength = flatArray.length;\n if (!Array.isArray(array) || !Array.isArray(sizes)) {\n throw new TypeError('Array expected');\n }\n if (sizes.length === 0) {\n throw new DimensionError(0, currentLength, '!=');\n }\n sizes = processSizesWildcard(sizes, currentLength);\n var newLength = product(sizes);\n if (currentLength !== newLength) {\n throw new DimensionError(newLength, currentLength, '!=');\n }\n try {\n return _reshape(flatArray, sizes);\n } catch (e) {\n if (e instanceof DimensionError) {\n throw new DimensionError(newLength, currentLength, '!=');\n }\n throw e;\n }\n}\n\n/**\n * Replaces the wildcard -1 in the sizes array.\n * @param {Array.} sizes List of sizes for each dimension. At most on wildcard.\n * @param {number} currentLength Number of elements in the array.\n * @throws {Error} If more than one wildcard or unable to replace it.\n * @returns {Array.} The sizes array with wildcard replaced.\n */\nexport function processSizesWildcard(sizes, currentLength) {\n var newLength = product(sizes);\n var processedSizes = sizes.slice();\n var WILDCARD = -1;\n var wildCardIndex = sizes.indexOf(WILDCARD);\n var isMoreThanOneWildcard = sizes.indexOf(WILDCARD, wildCardIndex + 1) >= 0;\n if (isMoreThanOneWildcard) {\n throw new Error('More than one wildcard in sizes');\n }\n var hasWildcard = wildCardIndex >= 0;\n var canReplaceWildcard = currentLength % newLength === 0;\n if (hasWildcard) {\n if (canReplaceWildcard) {\n processedSizes[wildCardIndex] = -currentLength / newLength;\n } else {\n throw new Error('Could not replace wildcard, since ' + currentLength + ' is no multiple of ' + -newLength);\n }\n }\n return processedSizes;\n}\n\n/**\n * Computes the product of all array elements.\n * @param {Array} array Array of factors\n * @returns {number} Product of all elements\n */\nfunction product(array) {\n return array.reduce((prev, curr) => prev * curr, 1);\n}\n\n/**\n * Iteratively re-shape a multi dimensional array to fit the specified dimensions\n * @param {Array} array Array to be reshaped\n * @param {Array.} sizes List of sizes for each dimension\n * @returns {Array} Array whose data has been formatted to fit the\n * specified dimensions\n */\n\nfunction _reshape(array, sizes) {\n // testing if there are enough elements for the requested shape\n var tmpArray = array;\n var tmpArray2;\n // for each dimensions starting by the last one and ignoring the first one\n for (var sizeIndex = sizes.length - 1; sizeIndex > 0; sizeIndex--) {\n var size = sizes[sizeIndex];\n tmpArray2 = [];\n\n // aggregate the elements of the current tmpArray in elements of the requested size\n var length = tmpArray.length / size;\n for (var i = 0; i < length; i++) {\n tmpArray2.push(tmpArray.slice(i * size, (i + 1) * size));\n }\n // set it as the new tmpArray for the next loop turn or for return\n tmpArray = tmpArray2;\n }\n return tmpArray;\n}\n\n/**\n * Squeeze a multi dimensional array\n * @param {Array} array\n * @param {Array} [size]\n * @returns {Array} returns the array itself\n */\nexport function squeeze(array, size) {\n var s = size || arraySize(array);\n\n // squeeze outer dimensions\n while (Array.isArray(array) && array.length === 1) {\n array = array[0];\n s.shift();\n }\n\n // find the first dimension to be squeezed\n var dims = s.length;\n while (s[dims - 1] === 1) {\n dims--;\n }\n\n // squeeze inner dimensions\n if (dims < s.length) {\n array = _squeeze(array, dims, 0);\n s.length = dims;\n }\n return array;\n}\n\n/**\n * Recursively squeeze a multi dimensional array\n * @param {Array} array\n * @param {number} dims Required number of dimensions\n * @param {number} dim Current dimension\n * @returns {Array | *} Returns the squeezed array\n * @private\n */\nfunction _squeeze(array, dims, dim) {\n var i, ii;\n if (dim < dims) {\n var next = dim + 1;\n for (i = 0, ii = array.length; i < ii; i++) {\n array[i] = _squeeze(array[i], dims, next);\n }\n } else {\n while (Array.isArray(array)) {\n array = array[0];\n }\n }\n return array;\n}\n\n/**\n * Unsqueeze a multi dimensional array: add dimensions when missing\n *\n * Paramter `size` will be mutated to match the new, unqueezed matrix size.\n *\n * @param {Array} array\n * @param {number} dims Desired number of dimensions of the array\n * @param {number} [outer] Number of outer dimensions to be added\n * @param {Array} [size] Current size of array.\n * @returns {Array} returns the array itself\n * @private\n */\nexport function unsqueeze(array, dims, outer, size) {\n var s = size || arraySize(array);\n\n // unsqueeze outer dimensions\n if (outer) {\n for (var i = 0; i < outer; i++) {\n array = [array];\n s.unshift(1);\n }\n }\n\n // unsqueeze inner dimensions\n array = _unsqueeze(array, dims, 0);\n while (s.length < dims) {\n s.push(1);\n }\n return array;\n}\n\n/**\n * Recursively unsqueeze a multi dimensional array\n * @param {Array} array\n * @param {number} dims Required number of dimensions\n * @param {number} dim Current dimension\n * @returns {Array | *} Returns the squeezed array\n * @private\n */\nfunction _unsqueeze(array, dims, dim) {\n var i, ii;\n if (Array.isArray(array)) {\n var next = dim + 1;\n for (i = 0, ii = array.length; i < ii; i++) {\n array[i] = _unsqueeze(array[i], dims, next);\n }\n } else {\n for (var d = dim; d < dims; d++) {\n array = [array];\n }\n }\n return array;\n}\n/**\n * Flatten a multi dimensional array, put all elements in a one dimensional\n * array\n * @param {Array} array A multi dimensional array\n * @return {Array} The flattened array (1 dimensional)\n */\nexport function flatten(array) {\n if (!Array.isArray(array)) {\n // if not an array, return as is\n return array;\n }\n var flat = [];\n array.forEach(function callback(value) {\n if (Array.isArray(value)) {\n value.forEach(callback); // traverse through sub-arrays recursively\n } else {\n flat.push(value);\n }\n });\n return flat;\n}\n\n/**\n * A safe map\n * @param {Array} array\n * @param {function} callback\n */\nexport function map(array, callback) {\n return Array.prototype.map.call(array, callback);\n}\n\n/**\n * A safe forEach\n * @param {Array} array\n * @param {function} callback\n */\nexport function forEach(array, callback) {\n Array.prototype.forEach.call(array, callback);\n}\n\n/**\n * A safe filter\n * @param {Array} array\n * @param {function} callback\n */\nexport function filter(array, callback) {\n if (arraySize(array).length !== 1) {\n throw new Error('Only one dimensional matrices supported');\n }\n return Array.prototype.filter.call(array, callback);\n}\n\n/**\n * Filter values in a callback given a regular expression\n * @param {Array} array\n * @param {RegExp} regexp\n * @return {Array} Returns the filtered array\n * @private\n */\nexport function filterRegExp(array, regexp) {\n if (arraySize(array).length !== 1) {\n throw new Error('Only one dimensional matrices supported');\n }\n return Array.prototype.filter.call(array, entry => regexp.test(entry));\n}\n\n/**\n * A safe join\n * @param {Array} array\n * @param {string} separator\n */\nexport function join(array, separator) {\n return Array.prototype.join.call(array, separator);\n}\n\n/**\n * Assign a numeric identifier to every element of a sorted array\n * @param {Array} a An array\n * @return {Array} An array of objects containing the original value and its identifier\n */\nexport function identify(a) {\n if (!Array.isArray(a)) {\n throw new TypeError('Array input expected');\n }\n if (a.length === 0) {\n return a;\n }\n var b = [];\n var count = 0;\n b[0] = {\n value: a[0],\n identifier: 0\n };\n for (var i = 1; i < a.length; i++) {\n if (a[i] === a[i - 1]) {\n count++;\n } else {\n count = 0;\n }\n b.push({\n value: a[i],\n identifier: count\n });\n }\n return b;\n}\n\n/**\n * Remove the numeric identifier from the elements\n * @param {array} a An array\n * @return {array} An array of values without identifiers\n */\nexport function generalize(a) {\n if (!Array.isArray(a)) {\n throw new TypeError('Array input expected');\n }\n if (a.length === 0) {\n return a;\n }\n var b = [];\n for (var i = 0; i < a.length; i++) {\n b.push(a[i].value);\n }\n return b;\n}\n\n/**\n * Check the datatype of a given object\n * This is a low level implementation that should only be used by\n * parent Matrix classes such as SparseMatrix or DenseMatrix\n * This method does not validate Array Matrix shape\n * @param {Array} array\n * @param {function} typeOf Callback function to use to determine the type of a value\n * @return {string}\n */\nexport function getArrayDataType(array, typeOf) {\n var type; // to hold type info\n var length = 0; // to hold length value to ensure it has consistent sizes\n\n for (var i = 0; i < array.length; i++) {\n var item = array[i];\n var isArray = Array.isArray(item);\n\n // Saving the target matrix row size\n if (i === 0 && isArray) {\n length = item.length;\n }\n\n // If the current item is an array but the length does not equal the targetVectorSize\n if (isArray && item.length !== length) {\n return undefined;\n }\n var itemType = isArray ? getArrayDataType(item, typeOf) // recurse into a nested array\n : typeOf(item);\n if (type === undefined) {\n type = itemType; // first item\n } else if (type !== itemType) {\n return 'mixed';\n } else {\n // we're good, everything has the same type so far\n }\n }\n return type;\n}\n\n/**\n * Return the last item from an array\n * @param array\n * @returns {*}\n */\nexport function last(array) {\n return array[array.length - 1];\n}\n\n/**\n * Get all but the last element of array.\n */\nexport function initial(array) {\n return array.slice(0, array.length - 1);\n}\n\n/**\n * Test whether an array or string contains an item\n * @param {Array | string} array\n * @param {*} item\n * @return {boolean}\n */\nexport function contains(array, item) {\n return array.indexOf(item) !== -1;\n}","import { contains } from './array.js';\nimport { pickShallow } from './object.js';\n\n/**\n * Create a factory function, which can be used to inject dependencies.\n *\n * The created functions are memoized, a consecutive call of the factory\n * with the exact same inputs will return the same function instance.\n * The memoized cache is exposed on `factory.cache` and can be cleared\n * if needed.\n *\n * Example:\n *\n * const name = 'log'\n * const dependencies = ['config', 'typed', 'divideScalar', 'Complex']\n *\n * export const createLog = factory(name, dependencies, ({ typed, config, divideScalar, Complex }) => {\n * // ... create the function log here and return it\n * }\n *\n * @param {string} name Name of the function to be created\n * @param {string[]} dependencies The names of all required dependencies\n * @param {function} create Callback function called with an object with all dependencies\n * @param {Object} [meta] Optional object with meta information that will be attached\n * to the created factory function as property `meta`.\n * @returns {function}\n */\nexport function factory(name, dependencies, create, meta) {\n function assertAndCreate(scope) {\n // we only pass the requested dependencies to the factory function\n // to prevent functions to rely on dependencies that are not explicitly\n // requested.\n var deps = pickShallow(scope, dependencies.map(stripOptionalNotation));\n assertDependencies(name, dependencies, scope);\n return create(deps);\n }\n assertAndCreate.isFactory = true;\n assertAndCreate.fn = name;\n assertAndCreate.dependencies = dependencies.slice().sort();\n if (meta) {\n assertAndCreate.meta = meta;\n }\n return assertAndCreate;\n}\n\n/**\n * Sort all factories such that when loading in order, the dependencies are resolved.\n *\n * @param {Array} factories\n * @returns {Array} Returns a new array with the sorted factories.\n */\nexport function sortFactories(factories) {\n var factoriesByName = {};\n factories.forEach(factory => {\n factoriesByName[factory.fn] = factory;\n });\n function containsDependency(factory, dependency) {\n // TODO: detect circular references\n if (isFactory(factory)) {\n if (contains(factory.dependencies, dependency.fn || dependency.name)) {\n return true;\n }\n if (factory.dependencies.some(d => containsDependency(factoriesByName[d], dependency))) {\n return true;\n }\n }\n return false;\n }\n var sorted = [];\n function addFactory(factory) {\n var index = 0;\n while (index < sorted.length && !containsDependency(sorted[index], factory)) {\n index++;\n }\n sorted.splice(index, 0, factory);\n }\n\n // sort regular factory functions\n factories.filter(isFactory).forEach(addFactory);\n\n // sort legacy factory functions AFTER the regular factory functions\n factories.filter(factory => !isFactory(factory)).forEach(addFactory);\n return sorted;\n}\n\n// TODO: comment or cleanup if unused in the end\nexport function create(factories) {\n var scope = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n sortFactories(factories).forEach(factory => factory(scope));\n return scope;\n}\n\n/**\n * Test whether an object is a factory. This is the case when it has\n * properties name, dependencies, and a function create.\n * @param {*} obj\n * @returns {boolean}\n */\nexport function isFactory(obj) {\n return typeof obj === 'function' && typeof obj.fn === 'string' && Array.isArray(obj.dependencies);\n}\n\n/**\n * Assert that all dependencies of a list with dependencies are available in the provided scope.\n *\n * Will throw an exception when there are dependencies missing.\n *\n * @param {string} name Name for the function to be created. Used to generate a useful error message\n * @param {string[]} dependencies\n * @param {Object} scope\n */\nexport function assertDependencies(name, dependencies, scope) {\n var allDefined = dependencies.filter(dependency => !isOptionalDependency(dependency)) // filter optionals\n .every(dependency => scope[dependency] !== undefined);\n if (!allDefined) {\n var missingDependencies = dependencies.filter(dependency => scope[dependency] === undefined);\n\n // TODO: create a custom error class for this, a MathjsError or something like that\n throw new Error(\"Cannot create function \\\"\".concat(name, \"\\\", \") + \"some dependencies are missing: \".concat(missingDependencies.map(d => \"\\\"\".concat(d, \"\\\"\")).join(', '), \".\"));\n }\n}\nexport function isOptionalDependency(dependency) {\n return dependency && dependency[0] === '?';\n}\nexport function stripOptionalNotation(dependency) {\n return dependency && dependency[0] === '?' ? dependency.slice(1) : dependency;\n}","import { hasOwnProperty } from './object.js';\n\n/**\n * Get a property of a plain object\n * Throws an error in case the object is not a plain object or the\n * property is not defined on the object itself\n * @param {Object} object\n * @param {string} prop\n * @return {*} Returns the property value when safe\n */\nfunction getSafeProperty(object, prop) {\n // only allow getting safe properties of a plain object\n if (isPlainObject(object) && isSafeProperty(object, prop)) {\n return object[prop];\n }\n if (typeof object[prop] === 'function' && isSafeMethod(object, prop)) {\n throw new Error('Cannot access method \"' + prop + '\" as a property');\n }\n throw new Error('No access to property \"' + prop + '\"');\n}\n\n/**\n * Set a property on a plain object.\n * Throws an error in case the object is not a plain object or the\n * property would override an inherited property like .constructor or .toString\n * @param {Object} object\n * @param {string} prop\n * @param {*} value\n * @return {*} Returns the value\n */\n// TODO: merge this function into access.js?\nfunction setSafeProperty(object, prop, value) {\n // only allow setting safe properties of a plain object\n if (isPlainObject(object) && isSafeProperty(object, prop)) {\n object[prop] = value;\n return value;\n }\n throw new Error('No access to property \"' + prop + '\"');\n}\nfunction getSafeProperties(object) {\n return Object.keys(object).filter(prop => hasOwnProperty(object, prop));\n}\nfunction hasSafeProperty(object, prop) {\n return prop in object;\n}\n\n/**\n * Test whether a property is safe to use for an object.\n * For example .toString and .constructor are not safe\n * @param {string} prop\n * @return {boolean} Returns true when safe\n */\nfunction isSafeProperty(object, prop) {\n if (!object || typeof object !== 'object') {\n return false;\n }\n // SAFE: whitelisted\n // e.g length\n if (hasOwnProperty(safeNativeProperties, prop)) {\n return true;\n }\n // UNSAFE: inherited from Object prototype\n // e.g constructor\n if (prop in Object.prototype) {\n // 'in' is used instead of hasOwnProperty for nodejs v0.10\n // which is inconsistent on root prototypes. It is safe\n // here because Object.prototype is a root object\n return false;\n }\n // UNSAFE: inherited from Function prototype\n // e.g call, apply\n if (prop in Function.prototype) {\n // 'in' is used instead of hasOwnProperty for nodejs v0.10\n // which is inconsistent on root prototypes. It is safe\n // here because Function.prototype is a root object\n return false;\n }\n return true;\n}\n\n/**\n * Validate whether a method is safe.\n * Throws an error when that's not the case.\n * @param {Object} object\n * @param {string} method\n * @return {function} Returns the method when valid\n */\nfunction getSafeMethod(object, method) {\n if (!isSafeMethod(object, method)) {\n throw new Error('No access to method \"' + method + '\"');\n }\n return object[method];\n}\n\n/**\n * Check whether a method is safe.\n * Throws an error when that's not the case (for example for `constructor`).\n * @param {Object} object\n * @param {string} method\n * @return {boolean} Returns true when safe, false otherwise\n */\nfunction isSafeMethod(object, method) {\n if (object === null || object === undefined || typeof object[method] !== 'function') {\n return false;\n }\n // UNSAFE: ghosted\n // e.g overridden toString\n // Note that IE10 doesn't support __proto__ and we can't do this check there.\n if (hasOwnProperty(object, method) && Object.getPrototypeOf && method in Object.getPrototypeOf(object)) {\n return false;\n }\n // SAFE: whitelisted\n // e.g toString\n if (hasOwnProperty(safeNativeMethods, method)) {\n return true;\n }\n // UNSAFE: inherited from Object prototype\n // e.g constructor\n if (method in Object.prototype) {\n // 'in' is used instead of hasOwnProperty for nodejs v0.10\n // which is inconsistent on root prototypes. It is safe\n // here because Object.prototype is a root object\n return false;\n }\n // UNSAFE: inherited from Function prototype\n // e.g call, apply\n if (method in Function.prototype) {\n // 'in' is used instead of hasOwnProperty for nodejs v0.10\n // which is inconsistent on root prototypes. It is safe\n // here because Function.prototype is a root object\n return false;\n }\n return true;\n}\nfunction isPlainObject(object) {\n return typeof object === 'object' && object && object.constructor === Object;\n}\nvar safeNativeProperties = {\n length: true,\n name: true\n};\nvar safeNativeMethods = {\n toString: true,\n valueOf: true,\n toLocaleString: true\n};\nexport { getSafeProperty };\nexport { setSafeProperty };\nexport { isSafeProperty };\nexport { hasSafeProperty };\nexport { getSafeProperties };\nexport { getSafeMethod };\nexport { isSafeMethod };\nexport { isPlainObject };","import { setSafeProperty, hasSafeProperty, getSafeProperty } from './customs.js';\nimport { isObject } from './is.js';\n\n/**\n * A map facade on a bare object.\n *\n * The small number of methods needed to implement a scope,\n * forwarding on to the SafeProperty functions. Over time, the codebase\n * will stop using this method, as all objects will be Maps, rather than\n * more security prone objects.\n */\nexport class ObjectWrappingMap {\n constructor(object) {\n this.wrappedObject = object;\n }\n keys() {\n return Object.keys(this.wrappedObject);\n }\n get(key) {\n return getSafeProperty(this.wrappedObject, key);\n }\n set(key, value) {\n setSafeProperty(this.wrappedObject, key, value);\n return this;\n }\n has(key) {\n return hasSafeProperty(this.wrappedObject, key);\n }\n}\n\n/**\n * Creates an empty map, or whatever your platform's polyfill is.\n *\n * @returns an empty Map or Map like object.\n */\nexport function createEmptyMap() {\n return new Map();\n}\n\n/**\n * Creates a Map from the given object.\n *\n * @param { Map | { [key: string]: unknown } | undefined } mapOrObject\n * @returns\n */\nexport function createMap(mapOrObject) {\n if (!mapOrObject) {\n return createEmptyMap();\n }\n if (isMap(mapOrObject)) {\n return mapOrObject;\n }\n if (isObject(mapOrObject)) {\n return new ObjectWrappingMap(mapOrObject);\n }\n throw new Error('createMap can create maps from objects or Maps');\n}\n\n/**\n * Unwraps a map into an object.\n *\n * @param {Map} map\n * @returns { [key: string]: unknown }\n */\nexport function toObject(map) {\n if (map instanceof ObjectWrappingMap) {\n return map.wrappedObject;\n }\n var object = {};\n for (var key of map.keys()) {\n var value = map.get(key);\n setSafeProperty(object, key, value);\n }\n return object;\n}\n\n/**\n * Returns `true` if the passed object appears to be a Map (i.e. duck typing).\n *\n * Methods looked for are `get`, `set`, `keys` and `has`.\n *\n * @param {Map | object} object\n * @returns\n */\nexport function isMap(object) {\n // We can use the fast instanceof, or a slower duck typing check.\n // The duck typing method needs to cover enough methods to not be confused with DenseMatrix.\n if (!object) {\n return false;\n }\n return object instanceof Map || object instanceof ObjectWrappingMap || typeof object.set === 'function' && typeof object.get === 'function' && typeof object.keys === 'function' && typeof object.has === 'function';\n}\n\n/**\n * Copies the contents of key-value pairs from each `objects` in to `map`.\n *\n * Object is `objects` can be a `Map` or object.\n *\n * This is the `Map` analog to `Object.assign`.\n */\nexport function assign(map) {\n for (var _len = arguments.length, objects = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n objects[_key - 1] = arguments[_key];\n }\n for (var args of objects) {\n if (!args) {\n continue;\n }\n if (isMap(args)) {\n for (var key of args.keys()) {\n map.set(key, args.get(key));\n }\n } else if (isObject(args)) {\n for (var _key2 of Object.keys(args)) {\n map.set(_key2, args[_key2]);\n }\n }\n }\n return map;\n}","/**\n * Create a typed-function which checks the types of the arguments and\n * can match them against multiple provided signatures. The typed-function\n * automatically converts inputs in order to find a matching signature.\n * Typed functions throw informative errors in case of wrong input arguments.\n *\n * See the library [typed-function](https://github.com/josdejong/typed-function)\n * for detailed documentation.\n *\n * Syntax:\n *\n * math.typed(name, signatures) : function\n * math.typed(signatures) : function\n *\n * Examples:\n *\n * // create a typed function with multiple types per argument (type union)\n * const fn2 = typed({\n * 'number | boolean': function (b) {\n * return 'b is a number or boolean'\n * },\n * 'string, number | boolean': function (a, b) {\n * return 'a is a string, b is a number or boolean'\n * }\n * })\n *\n * // create a typed function with an any type argument\n * const log = typed({\n * 'string, any': function (event, data) {\n * console.log('event: ' + event + ', data: ' + JSON.stringify(data))\n * }\n * })\n *\n * @param {string} [name] Optional name for the typed-function\n * @param {Object} signatures Object with one or multiple function signatures\n * @returns {function} The created typed-function.\n */\n\nimport { isAccessorNode, isArray, isArrayNode, isAssignmentNode, isBigNumber, isBlockNode, isBoolean, isChain, isCollection, isComplex, isConditionalNode, isConstantNode, isDate, isDenseMatrix, isFraction, isFunction, isFunctionAssignmentNode, isFunctionNode, isHelp, isIndex, isIndexNode, isMatrix, isNode, isNull, isNumber, isObject, isObjectNode, isOperatorNode, isParenthesisNode, isRange, isRangeNode, isRelationalNode, isRegExp, isResultSet, isSparseMatrix, isString, isSymbolNode, isUndefined, isUnit } from '../../utils/is.js';\nimport typedFunction from 'typed-function';\nimport { digits } from '../../utils/number.js';\nimport { factory } from '../../utils/factory.js';\nimport { isMap } from '../../utils/map.js';\n\n// returns a new instance of typed-function\nvar _createTyped2 = function _createTyped() {\n // initially, return the original instance of typed-function\n // consecutively, return a new instance from typed.create.\n _createTyped2 = typedFunction.create;\n return typedFunction;\n};\nvar dependencies = ['?BigNumber', '?Complex', '?DenseMatrix', '?Fraction'];\n\n/**\n * Factory function for creating a new typed instance\n * @param {Object} dependencies Object with data types like Complex and BigNumber\n * @returns {Function}\n */\nexport var createTyped = /* #__PURE__ */factory('typed', dependencies, function createTyped(_ref) {\n var {\n BigNumber,\n Complex,\n DenseMatrix,\n Fraction\n } = _ref;\n // TODO: typed-function must be able to silently ignore signatures with unknown data types\n\n // get a new instance of typed-function\n var typed = _createTyped2();\n\n // define all types. The order of the types determines in which order function\n // arguments are type-checked (so for performance it's important to put the\n // most used types first).\n typed.clear();\n typed.addTypes([{\n name: 'number',\n test: isNumber\n }, {\n name: 'Complex',\n test: isComplex\n }, {\n name: 'BigNumber',\n test: isBigNumber\n }, {\n name: 'Fraction',\n test: isFraction\n }, {\n name: 'Unit',\n test: isUnit\n },\n // The following type matches a valid variable name, i.e., an alphanumeric\n // string starting with an alphabetic character. It is used (at least)\n // in the definition of the derivative() function, as the argument telling\n // what to differentiate over must (currently) be a variable.\n {\n name: 'identifier',\n test: s => isString && /^(?:[A-Za-z\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0560-\\u0588\\u05D0-\\u05EA\\u05EF-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u0860-\\u086A\\u0870-\\u0887\\u0889-\\u088E\\u08A0-\\u08C9\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0980\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u09FC\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0AF9\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58-\\u0C5A\\u0C5D\\u0C60\\u0C61\\u0C80\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D04-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D54-\\u0D56\\u0D5F-\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E86-\\u0E8A\\u0E8C-\\u0EA3\\u0EA5\\u0EA7-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16F1-\\u16F8\\u1700-\\u1711\\u171F-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1878\\u1880-\\u1884\\u1887-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4C\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1C80-\\u1C88\\u1C90-\\u1CBA\\u1CBD-\\u1CBF\\u1CE9-\\u1CEC\\u1CEE-\\u1CF3\\u1CF5\\u1CF6\\u1CFA\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2183\\u2184\\u2C00-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005\\u3006\\u3031-\\u3035\\u303B\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312F\\u3131-\\u318E\\u31A0-\\u31BF\\u31F0-\\u31FF\\u3400-\\u4DBF\\u4E00-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA69D\\uA6A0-\\uA6E5\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7CA\\uA7D0\\uA7D1\\uA7D3\\uA7D5-\\uA7D9\\uA7F2-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA8FD\\uA8FE\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uA9E0-\\uA9E4\\uA9E6-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB69\\uAB70-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]|\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDF00-\\uDF1F\\uDF2D-\\uDF40\\uDF42-\\uDF49\\uDF50-\\uDF75\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF]|\\uD801[\\uDC00-\\uDC9D\\uDCB0-\\uDCD3\\uDCD8-\\uDCFB\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDD70-\\uDD7A\\uDD7C-\\uDD8A\\uDD8C-\\uDD92\\uDD94\\uDD95\\uDD97-\\uDDA1\\uDDA3-\\uDDB1\\uDDB3-\\uDDB9\\uDDBB\\uDDBC\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67\\uDF80-\\uDF85\\uDF87-\\uDFB0\\uDFB2-\\uDFBA]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00\\uDE10-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE35\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE4\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48\\uDC80-\\uDCB2\\uDCC0-\\uDCF2\\uDD00-\\uDD23\\uDE80-\\uDEA9\\uDEB0\\uDEB1\\uDF00-\\uDF1C\\uDF27\\uDF30-\\uDF45\\uDF70-\\uDF81\\uDFB0-\\uDFC4\\uDFE0-\\uDFF6]|\\uD804[\\uDC03-\\uDC37\\uDC71\\uDC72\\uDC75\\uDC83-\\uDCAF\\uDCD0-\\uDCE8\\uDD03-\\uDD26\\uDD44\\uDD47\\uDD50-\\uDD72\\uDD76\\uDD83-\\uDDB2\\uDDC1-\\uDDC4\\uDDDA\\uDDDC\\uDE00-\\uDE11\\uDE13-\\uDE2B\\uDE3F\\uDE40\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA8\\uDEB0-\\uDEDE\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3D\\uDF50\\uDF5D-\\uDF61]|\\uD805[\\uDC00-\\uDC34\\uDC47-\\uDC4A\\uDC5F-\\uDC61\\uDC80-\\uDCAF\\uDCC4\\uDCC5\\uDCC7\\uDD80-\\uDDAE\\uDDD8-\\uDDDB\\uDE00-\\uDE2F\\uDE44\\uDE80-\\uDEAA\\uDEB8\\uDF00-\\uDF1A\\uDF40-\\uDF46]|\\uD806[\\uDC00-\\uDC2B\\uDCA0-\\uDCDF\\uDCFF-\\uDD06\\uDD09\\uDD0C-\\uDD13\\uDD15\\uDD16\\uDD18-\\uDD2F\\uDD3F\\uDD41\\uDDA0-\\uDDA7\\uDDAA-\\uDDD0\\uDDE1\\uDDE3\\uDE00\\uDE0B-\\uDE32\\uDE3A\\uDE50\\uDE5C-\\uDE89\\uDE9D\\uDEB0-\\uDEF8]|\\uD807[\\uDC00-\\uDC08\\uDC0A-\\uDC2E\\uDC40\\uDC72-\\uDC8F\\uDD00-\\uDD06\\uDD08\\uDD09\\uDD0B-\\uDD30\\uDD46\\uDD60-\\uDD65\\uDD67\\uDD68\\uDD6A-\\uDD89\\uDD98\\uDEE0-\\uDEF2\\uDF02\\uDF04-\\uDF10\\uDF12-\\uDF33\\uDFB0]|\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC80-\\uDD43]|\\uD80B[\\uDF90-\\uDFF0]|[\\uD80C\\uD81C-\\uD820\\uD822\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872\\uD874-\\uD879\\uD880-\\uD883\\uD885-\\uD887][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2F\\uDC41-\\uDC46]|\\uD811[\\uDC00-\\uDE46]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDE70-\\uDEBE\\uDED0-\\uDEED\\uDF00-\\uDF2F\\uDF40-\\uDF43\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDE40-\\uDE7F\\uDF00-\\uDF4A\\uDF50\\uDF93-\\uDF9F\\uDFE0\\uDFE1\\uDFE3]|\\uD821[\\uDC00-\\uDFF7]|\\uD823[\\uDC00-\\uDCD5\\uDD00-\\uDD08]|\\uD82B[\\uDFF0-\\uDFF3\\uDFF5-\\uDFFB\\uDFFD\\uDFFE]|\\uD82C[\\uDC00-\\uDD22\\uDD32\\uDD50-\\uDD52\\uDD55\\uDD64-\\uDD67\\uDD70-\\uDEFB]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDEC0\\uDEC2-\\uDEDA\\uDEDC-\\uDEFA\\uDEFC-\\uDF14\\uDF16-\\uDF34\\uDF36-\\uDF4E\\uDF50-\\uDF6E\\uDF70-\\uDF88\\uDF8A-\\uDFA8\\uDFAA-\\uDFC2\\uDFC4-\\uDFCB]|\\uD837[\\uDF00-\\uDF1E\\uDF25-\\uDF2A]|\\uD838[\\uDC30-\\uDC6D\\uDD00-\\uDD2C\\uDD37-\\uDD3D\\uDD4E\\uDE90-\\uDEAD\\uDEC0-\\uDEEB]|\\uD839[\\uDCD0-\\uDCEB\\uDFE0-\\uDFE6\\uDFE8-\\uDFEB\\uDFED\\uDFEE\\uDFF0-\\uDFFE]|\\uD83A[\\uDC00-\\uDCC4\\uDD00-\\uDD43\\uDD4B]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD869[\\uDC00-\\uDEDF\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF39\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1\\uDEB0-\\uDFFF]|\\uD87A[\\uDC00-\\uDFE0]|\\uD87E[\\uDC00-\\uDE1D]|\\uD884[\\uDC00-\\uDF4A\\uDF50-\\uDFFF]|\\uD888[\\uDC00-\\uDFAF])(?:[0-9A-Za-z\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0560-\\u0588\\u05D0-\\u05EA\\u05EF-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u0860-\\u086A\\u0870-\\u0887\\u0889-\\u088E\\u08A0-\\u08C9\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0980\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u09FC\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0AF9\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58-\\u0C5A\\u0C5D\\u0C60\\u0C61\\u0C80\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D04-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D54-\\u0D56\\u0D5F-\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E86-\\u0E8A\\u0E8C-\\u0EA3\\u0EA5\\u0EA7-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16F1-\\u16F8\\u1700-\\u1711\\u171F-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1878\\u1880-\\u1884\\u1887-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4C\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1C80-\\u1C88\\u1C90-\\u1CBA\\u1CBD-\\u1CBF\\u1CE9-\\u1CEC\\u1CEE-\\u1CF3\\u1CF5\\u1CF6\\u1CFA\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2183\\u2184\\u2C00-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005\\u3006\\u3031-\\u3035\\u303B\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312F\\u3131-\\u318E\\u31A0-\\u31BF\\u31F0-\\u31FF\\u3400-\\u4DBF\\u4E00-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA69D\\uA6A0-\\uA6E5\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7CA\\uA7D0\\uA7D1\\uA7D3\\uA7D5-\\uA7D9\\uA7F2-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA8FD\\uA8FE\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uA9E0-\\uA9E4\\uA9E6-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB69\\uAB70-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]|\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDF00-\\uDF1F\\uDF2D-\\uDF40\\uDF42-\\uDF49\\uDF50-\\uDF75\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF]|\\uD801[\\uDC00-\\uDC9D\\uDCB0-\\uDCD3\\uDCD8-\\uDCFB\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDD70-\\uDD7A\\uDD7C-\\uDD8A\\uDD8C-\\uDD92\\uDD94\\uDD95\\uDD97-\\uDDA1\\uDDA3-\\uDDB1\\uDDB3-\\uDDB9\\uDDBB\\uDDBC\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67\\uDF80-\\uDF85\\uDF87-\\uDFB0\\uDFB2-\\uDFBA]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00\\uDE10-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE35\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE4\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48\\uDC80-\\uDCB2\\uDCC0-\\uDCF2\\uDD00-\\uDD23\\uDE80-\\uDEA9\\uDEB0\\uDEB1\\uDF00-\\uDF1C\\uDF27\\uDF30-\\uDF45\\uDF70-\\uDF81\\uDFB0-\\uDFC4\\uDFE0-\\uDFF6]|\\uD804[\\uDC03-\\uDC37\\uDC71\\uDC72\\uDC75\\uDC83-\\uDCAF\\uDCD0-\\uDCE8\\uDD03-\\uDD26\\uDD44\\uDD47\\uDD50-\\uDD72\\uDD76\\uDD83-\\uDDB2\\uDDC1-\\uDDC4\\uDDDA\\uDDDC\\uDE00-\\uDE11\\uDE13-\\uDE2B\\uDE3F\\uDE40\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA8\\uDEB0-\\uDEDE\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3D\\uDF50\\uDF5D-\\uDF61]|\\uD805[\\uDC00-\\uDC34\\uDC47-\\uDC4A\\uDC5F-\\uDC61\\uDC80-\\uDCAF\\uDCC4\\uDCC5\\uDCC7\\uDD80-\\uDDAE\\uDDD8-\\uDDDB\\uDE00-\\uDE2F\\uDE44\\uDE80-\\uDEAA\\uDEB8\\uDF00-\\uDF1A\\uDF40-\\uDF46]|\\uD806[\\uDC00-\\uDC2B\\uDCA0-\\uDCDF\\uDCFF-\\uDD06\\uDD09\\uDD0C-\\uDD13\\uDD15\\uDD16\\uDD18-\\uDD2F\\uDD3F\\uDD41\\uDDA0-\\uDDA7\\uDDAA-\\uDDD0\\uDDE1\\uDDE3\\uDE00\\uDE0B-\\uDE32\\uDE3A\\uDE50\\uDE5C-\\uDE89\\uDE9D\\uDEB0-\\uDEF8]|\\uD807[\\uDC00-\\uDC08\\uDC0A-\\uDC2E\\uDC40\\uDC72-\\uDC8F\\uDD00-\\uDD06\\uDD08\\uDD09\\uDD0B-\\uDD30\\uDD46\\uDD60-\\uDD65\\uDD67\\uDD68\\uDD6A-\\uDD89\\uDD98\\uDEE0-\\uDEF2\\uDF02\\uDF04-\\uDF10\\uDF12-\\uDF33\\uDFB0]|\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC80-\\uDD43]|\\uD80B[\\uDF90-\\uDFF0]|[\\uD80C\\uD81C-\\uD820\\uD822\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872\\uD874-\\uD879\\uD880-\\uD883\\uD885-\\uD887][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2F\\uDC41-\\uDC46]|\\uD811[\\uDC00-\\uDE46]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDE70-\\uDEBE\\uDED0-\\uDEED\\uDF00-\\uDF2F\\uDF40-\\uDF43\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDE40-\\uDE7F\\uDF00-\\uDF4A\\uDF50\\uDF93-\\uDF9F\\uDFE0\\uDFE1\\uDFE3]|\\uD821[\\uDC00-\\uDFF7]|\\uD823[\\uDC00-\\uDCD5\\uDD00-\\uDD08]|\\uD82B[\\uDFF0-\\uDFF3\\uDFF5-\\uDFFB\\uDFFD\\uDFFE]|\\uD82C[\\uDC00-\\uDD22\\uDD32\\uDD50-\\uDD52\\uDD55\\uDD64-\\uDD67\\uDD70-\\uDEFB]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDEC0\\uDEC2-\\uDEDA\\uDEDC-\\uDEFA\\uDEFC-\\uDF14\\uDF16-\\uDF34\\uDF36-\\uDF4E\\uDF50-\\uDF6E\\uDF70-\\uDF88\\uDF8A-\\uDFA8\\uDFAA-\\uDFC2\\uDFC4-\\uDFCB]|\\uD837[\\uDF00-\\uDF1E\\uDF25-\\uDF2A]|\\uD838[\\uDC30-\\uDC6D\\uDD00-\\uDD2C\\uDD37-\\uDD3D\\uDD4E\\uDE90-\\uDEAD\\uDEC0-\\uDEEB]|\\uD839[\\uDCD0-\\uDCEB\\uDFE0-\\uDFE6\\uDFE8-\\uDFEB\\uDFED\\uDFEE\\uDFF0-\\uDFFE]|\\uD83A[\\uDC00-\\uDCC4\\uDD00-\\uDD43\\uDD4B]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD869[\\uDC00-\\uDEDF\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF39\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1\\uDEB0-\\uDFFF]|\\uD87A[\\uDC00-\\uDFE0]|\\uD87E[\\uDC00-\\uDE1D]|\\uD884[\\uDC00-\\uDF4A\\uDF50-\\uDFFF]|\\uD888[\\uDC00-\\uDFAF])*$/.test(s)\n }, {\n name: 'string',\n test: isString\n }, {\n name: 'Chain',\n test: isChain\n }, {\n name: 'Array',\n test: isArray\n }, {\n name: 'Matrix',\n test: isMatrix\n }, {\n name: 'DenseMatrix',\n test: isDenseMatrix\n }, {\n name: 'SparseMatrix',\n test: isSparseMatrix\n }, {\n name: 'Range',\n test: isRange\n }, {\n name: 'Index',\n test: isIndex\n }, {\n name: 'boolean',\n test: isBoolean\n }, {\n name: 'ResultSet',\n test: isResultSet\n }, {\n name: 'Help',\n test: isHelp\n }, {\n name: 'function',\n test: isFunction\n }, {\n name: 'Date',\n test: isDate\n }, {\n name: 'RegExp',\n test: isRegExp\n }, {\n name: 'null',\n test: isNull\n }, {\n name: 'undefined',\n test: isUndefined\n }, {\n name: 'AccessorNode',\n test: isAccessorNode\n }, {\n name: 'ArrayNode',\n test: isArrayNode\n }, {\n name: 'AssignmentNode',\n test: isAssignmentNode\n }, {\n name: 'BlockNode',\n test: isBlockNode\n }, {\n name: 'ConditionalNode',\n test: isConditionalNode\n }, {\n name: 'ConstantNode',\n test: isConstantNode\n }, {\n name: 'FunctionNode',\n test: isFunctionNode\n }, {\n name: 'FunctionAssignmentNode',\n test: isFunctionAssignmentNode\n }, {\n name: 'IndexNode',\n test: isIndexNode\n }, {\n name: 'Node',\n test: isNode\n }, {\n name: 'ObjectNode',\n test: isObjectNode\n }, {\n name: 'OperatorNode',\n test: isOperatorNode\n }, {\n name: 'ParenthesisNode',\n test: isParenthesisNode\n }, {\n name: 'RangeNode',\n test: isRangeNode\n }, {\n name: 'RelationalNode',\n test: isRelationalNode\n }, {\n name: 'SymbolNode',\n test: isSymbolNode\n }, {\n name: 'Map',\n test: isMap\n }, {\n name: 'Object',\n test: isObject\n } // order 'Object' last, it matches on other classes too\n ]);\n\n typed.addConversions([{\n from: 'number',\n to: 'BigNumber',\n convert: function convert(x) {\n if (!BigNumber) {\n throwNoBignumber(x);\n }\n\n // note: conversion from number to BigNumber can fail if x has >15 digits\n if (digits(x) > 15) {\n throw new TypeError('Cannot implicitly convert a number with >15 significant digits to BigNumber ' + '(value: ' + x + '). ' + 'Use function bignumber(x) to convert to BigNumber.');\n }\n return new BigNumber(x);\n }\n }, {\n from: 'number',\n to: 'Complex',\n convert: function convert(x) {\n if (!Complex) {\n throwNoComplex(x);\n }\n return new Complex(x, 0);\n }\n }, {\n from: 'BigNumber',\n to: 'Complex',\n convert: function convert(x) {\n if (!Complex) {\n throwNoComplex(x);\n }\n return new Complex(x.toNumber(), 0);\n }\n }, {\n from: 'Fraction',\n to: 'BigNumber',\n convert: function convert(x) {\n throw new TypeError('Cannot implicitly convert a Fraction to BigNumber or vice versa. ' + 'Use function bignumber(x) to convert to BigNumber or fraction(x) to convert to Fraction.');\n }\n }, {\n from: 'Fraction',\n to: 'Complex',\n convert: function convert(x) {\n if (!Complex) {\n throwNoComplex(x);\n }\n return new Complex(x.valueOf(), 0);\n }\n }, {\n from: 'number',\n to: 'Fraction',\n convert: function convert(x) {\n if (!Fraction) {\n throwNoFraction(x);\n }\n var f = new Fraction(x);\n if (f.valueOf() !== x) {\n throw new TypeError('Cannot implicitly convert a number to a Fraction when there will be a loss of precision ' + '(value: ' + x + '). ' + 'Use function fraction(x) to convert to Fraction.');\n }\n return f;\n }\n }, {\n // FIXME: add conversion from Fraction to number, for example for `sqrt(fraction(1,3))`\n // from: 'Fraction',\n // to: 'number',\n // convert: function (x) {\n // return x.valueOf()\n // }\n // }, {\n from: 'string',\n to: 'number',\n convert: function convert(x) {\n var n = Number(x);\n if (isNaN(n)) {\n throw new Error('Cannot convert \"' + x + '\" to a number');\n }\n return n;\n }\n }, {\n from: 'string',\n to: 'BigNumber',\n convert: function convert(x) {\n if (!BigNumber) {\n throwNoBignumber(x);\n }\n try {\n return new BigNumber(x);\n } catch (err) {\n throw new Error('Cannot convert \"' + x + '\" to BigNumber');\n }\n }\n }, {\n from: 'string',\n to: 'Fraction',\n convert: function convert(x) {\n if (!Fraction) {\n throwNoFraction(x);\n }\n try {\n return new Fraction(x);\n } catch (err) {\n throw new Error('Cannot convert \"' + x + '\" to Fraction');\n }\n }\n }, {\n from: 'string',\n to: 'Complex',\n convert: function convert(x) {\n if (!Complex) {\n throwNoComplex(x);\n }\n try {\n return new Complex(x);\n } catch (err) {\n throw new Error('Cannot convert \"' + x + '\" to Complex');\n }\n }\n }, {\n from: 'boolean',\n to: 'number',\n convert: function convert(x) {\n return +x;\n }\n }, {\n from: 'boolean',\n to: 'BigNumber',\n convert: function convert(x) {\n if (!BigNumber) {\n throwNoBignumber(x);\n }\n return new BigNumber(+x);\n }\n }, {\n from: 'boolean',\n to: 'Fraction',\n convert: function convert(x) {\n if (!Fraction) {\n throwNoFraction(x);\n }\n return new Fraction(+x);\n }\n }, {\n from: 'boolean',\n to: 'string',\n convert: function convert(x) {\n return String(x);\n }\n }, {\n from: 'Array',\n to: 'Matrix',\n convert: function convert(array) {\n if (!DenseMatrix) {\n throwNoMatrix();\n }\n return new DenseMatrix(array);\n }\n }, {\n from: 'Matrix',\n to: 'Array',\n convert: function convert(matrix) {\n return matrix.valueOf();\n }\n }]);\n\n // Provide a suggestion on how to call a function elementwise\n // This was added primarily as guidance for the v10 -> v11 transition,\n // and could potentially be removed in the future if it no longer seems\n // to be helpful.\n typed.onMismatch = (name, args, signatures) => {\n var usualError = typed.createError(name, args, signatures);\n if (['wrongType', 'mismatch'].includes(usualError.data.category) && args.length === 1 && isCollection(args[0]) &&\n // check if the function can be unary:\n signatures.some(sig => !sig.params.includes(','))) {\n var err = new TypeError(\"Function '\".concat(name, \"' doesn't apply to matrices. To call it \") + \"elementwise on a matrix 'M', try 'map(M, \".concat(name, \")'.\"));\n err.data = usualError.data;\n throw err;\n }\n throw usualError;\n };\n\n // Provide a suggestion on how to call a function elementwise\n // This was added primarily as guidance for the v10 -> v11 transition,\n // and could potentially be removed in the future if it no longer seems\n // to be helpful.\n typed.onMismatch = (name, args, signatures) => {\n var usualError = typed.createError(name, args, signatures);\n if (['wrongType', 'mismatch'].includes(usualError.data.category) && args.length === 1 && isCollection(args[0]) &&\n // check if the function can be unary:\n signatures.some(sig => !sig.params.includes(','))) {\n var err = new TypeError(\"Function '\".concat(name, \"' doesn't apply to matrices. To call it \") + \"elementwise on a matrix 'M', try 'map(M, \".concat(name, \")'.\"));\n err.data = usualError.data;\n throw err;\n }\n throw usualError;\n };\n return typed;\n});\nfunction throwNoBignumber(x) {\n throw new Error(\"Cannot convert value \".concat(x, \" into a BigNumber: no class 'BigNumber' provided\"));\n}\nfunction throwNoComplex(x) {\n throw new Error(\"Cannot convert value \".concat(x, \" into a Complex number: no class 'Complex' provided\"));\n}\nfunction throwNoMatrix() {\n throw new Error('Cannot convert array into a Matrix: no class \\'DenseMatrix\\' provided');\n}\nfunction throwNoFraction(x) {\n throw new Error(\"Cannot convert value \".concat(x, \" into a Fraction, no class 'Fraction' provided.\"));\n}","import { factory } from '../../utils/factory.js';\nvar name = 'ResultSet';\nvar dependencies = [];\nexport var createResultSet = /* #__PURE__ */factory(name, dependencies, () => {\n /**\n * A ResultSet contains a list or results\n * @class ResultSet\n * @param {Array} entries\n * @constructor ResultSet\n */\n function ResultSet(entries) {\n if (!(this instanceof ResultSet)) {\n throw new SyntaxError('Constructor must be called with the new operator');\n }\n this.entries = entries || [];\n }\n\n /**\n * Attach type information\n */\n ResultSet.prototype.type = 'ResultSet';\n ResultSet.prototype.isResultSet = true;\n\n /**\n * Returns the array with results hold by this ResultSet\n * @memberof ResultSet\n * @returns {Array} entries\n */\n ResultSet.prototype.valueOf = function () {\n return this.entries;\n };\n\n /**\n * Returns the stringified results of the ResultSet\n * @memberof ResultSet\n * @returns {string} string\n */\n ResultSet.prototype.toString = function () {\n return '[' + this.entries.join(', ') + ']';\n };\n\n /**\n * Get a JSON representation of the ResultSet\n * @memberof ResultSet\n * @returns {Object} Returns a JSON object structured as:\n * `{\"mathjs\": \"ResultSet\", \"entries\": [...]}`\n */\n ResultSet.prototype.toJSON = function () {\n return {\n mathjs: 'ResultSet',\n entries: this.entries\n };\n };\n\n /**\n * Instantiate a ResultSet from a JSON object\n * @memberof ResultSet\n * @param {Object} json A JSON object structured as:\n * `{\"mathjs\": \"ResultSet\", \"entries\": [...]}`\n * @return {ResultSet}\n */\n ResultSet.fromJSON = function (json) {\n return new ResultSet(json.entries);\n };\n return ResultSet;\n}, {\n isClass: true\n});","/*!\r\n * decimal.js v10.4.3\r\n * An arbitrary-precision Decimal type for JavaScript.\r\n * https://github.com/MikeMcl/decimal.js\r\n * Copyright (c) 2022 Michael Mclaughlin \r\n * MIT Licence\r\n */\r\n\r\n\r\n// ----------------------------------- EDITABLE DEFAULTS ------------------------------------ //\r\n\r\n\r\n // The maximum exponent magnitude.\r\n // The limit on the value of `toExpNeg`, `toExpPos`, `minE` and `maxE`.\r\nvar EXP_LIMIT = 9e15, // 0 to 9e15\r\n\r\n // The limit on the value of `precision`, and on the value of the first argument to\r\n // `toDecimalPlaces`, `toExponential`, `toFixed`, `toPrecision` and `toSignificantDigits`.\r\n MAX_DIGITS = 1e9, // 0 to 1e9\r\n\r\n // Base conversion alphabet.\r\n NUMERALS = '0123456789abcdef',\r\n\r\n // The natural logarithm of 10 (1025 digits).\r\n LN10 = '2.3025850929940456840179914546843642076011014886287729760333279009675726096773524802359972050895982983419677840422862486334095254650828067566662873690987816894829072083255546808437998948262331985283935053089653777326288461633662222876982198867465436674744042432743651550489343149393914796194044002221051017141748003688084012647080685567743216228355220114804663715659121373450747856947683463616792101806445070648000277502684916746550586856935673420670581136429224554405758925724208241314695689016758940256776311356919292033376587141660230105703089634572075440370847469940168269282808481184289314848524948644871927809676271275775397027668605952496716674183485704422507197965004714951050492214776567636938662976979522110718264549734772662425709429322582798502585509785265383207606726317164309505995087807523710333101197857547331541421808427543863591778117054309827482385045648019095610299291824318237525357709750539565187697510374970888692180205189339507238539205144634197265287286965110862571492198849978748873771345686209167058',\r\n\r\n // Pi (1025 digits).\r\n PI = '3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632789',\r\n\r\n\r\n // The initial configuration properties of the Decimal constructor.\r\n DEFAULTS = {\r\n\r\n // These values must be integers within the stated ranges (inclusive).\r\n // Most of these values can be changed at run-time using the `Decimal.config` method.\r\n\r\n // The maximum number of significant digits of the result of a calculation or base conversion.\r\n // E.g. `Decimal.config({ precision: 20 });`\r\n precision: 20, // 1 to MAX_DIGITS\r\n\r\n // The rounding mode used when rounding to `precision`.\r\n //\r\n // ROUND_UP 0 Away from zero.\r\n // ROUND_DOWN 1 Towards zero.\r\n // ROUND_CEIL 2 Towards +Infinity.\r\n // ROUND_FLOOR 3 Towards -Infinity.\r\n // ROUND_HALF_UP 4 Towards nearest neighbour. If equidistant, up.\r\n // ROUND_HALF_DOWN 5 Towards nearest neighbour. If equidistant, down.\r\n // ROUND_HALF_EVEN 6 Towards nearest neighbour. If equidistant, towards even neighbour.\r\n // ROUND_HALF_CEIL 7 Towards nearest neighbour. If equidistant, towards +Infinity.\r\n // ROUND_HALF_FLOOR 8 Towards nearest neighbour. If equidistant, towards -Infinity.\r\n //\r\n // E.g.\r\n // `Decimal.rounding = 4;`\r\n // `Decimal.rounding = Decimal.ROUND_HALF_UP;`\r\n rounding: 4, // 0 to 8\r\n\r\n // The modulo mode used when calculating the modulus: a mod n.\r\n // The quotient (q = a / n) is calculated according to the corresponding rounding mode.\r\n // The remainder (r) is calculated as: r = a - n * q.\r\n //\r\n // UP 0 The remainder is positive if the dividend is negative, else is negative.\r\n // DOWN 1 The remainder has the same sign as the dividend (JavaScript %).\r\n // FLOOR 3 The remainder has the same sign as the divisor (Python %).\r\n // HALF_EVEN 6 The IEEE 754 remainder function.\r\n // EUCLID 9 Euclidian division. q = sign(n) * floor(a / abs(n)). Always positive.\r\n //\r\n // Truncated division (1), floored division (3), the IEEE 754 remainder (6), and Euclidian\r\n // division (9) are commonly used for the modulus operation. The other rounding modes can also\r\n // be used, but they may not give useful results.\r\n modulo: 1, // 0 to 9\r\n\r\n // The exponent value at and beneath which `toString` returns exponential notation.\r\n // JavaScript numbers: -7\r\n toExpNeg: -7, // 0 to -EXP_LIMIT\r\n\r\n // The exponent value at and above which `toString` returns exponential notation.\r\n // JavaScript numbers: 21\r\n toExpPos: 21, // 0 to EXP_LIMIT\r\n\r\n // The minimum exponent value, beneath which underflow to zero occurs.\r\n // JavaScript numbers: -324 (5e-324)\r\n minE: -EXP_LIMIT, // -1 to -EXP_LIMIT\r\n\r\n // The maximum exponent value, above which overflow to Infinity occurs.\r\n // JavaScript numbers: 308 (1.7976931348623157e+308)\r\n maxE: EXP_LIMIT, // 1 to EXP_LIMIT\r\n\r\n // Whether to use cryptographically-secure random number generation, if available.\r\n crypto: false // true/false\r\n },\r\n\r\n\r\n// ----------------------------------- END OF EDITABLE DEFAULTS ------------------------------- //\r\n\r\n\r\n inexact, quadrant,\r\n external = true,\r\n\r\n decimalError = '[DecimalError] ',\r\n invalidArgument = decimalError + 'Invalid argument: ',\r\n precisionLimitExceeded = decimalError + 'Precision limit exceeded',\r\n cryptoUnavailable = decimalError + 'crypto unavailable',\r\n tag = '[object Decimal]',\r\n\r\n mathfloor = Math.floor,\r\n mathpow = Math.pow,\r\n\r\n isBinary = /^0b([01]+(\\.[01]*)?|\\.[01]+)(p[+-]?\\d+)?$/i,\r\n isHex = /^0x([0-9a-f]+(\\.[0-9a-f]*)?|\\.[0-9a-f]+)(p[+-]?\\d+)?$/i,\r\n isOctal = /^0o([0-7]+(\\.[0-7]*)?|\\.[0-7]+)(p[+-]?\\d+)?$/i,\r\n isDecimal = /^(\\d+(\\.\\d*)?|\\.\\d+)(e[+-]?\\d+)?$/i,\r\n\r\n BASE = 1e7,\r\n LOG_BASE = 7,\r\n MAX_SAFE_INTEGER = 9007199254740991,\r\n\r\n LN10_PRECISION = LN10.length - 1,\r\n PI_PRECISION = PI.length - 1,\r\n\r\n // Decimal.prototype object\r\n P = { toStringTag: tag };\r\n\r\n\r\n// Decimal prototype methods\r\n\r\n\r\n/*\r\n * absoluteValue abs\r\n * ceil\r\n * clampedTo clamp\r\n * comparedTo cmp\r\n * cosine cos\r\n * cubeRoot cbrt\r\n * decimalPlaces dp\r\n * dividedBy div\r\n * dividedToIntegerBy divToInt\r\n * equals eq\r\n * floor\r\n * greaterThan gt\r\n * greaterThanOrEqualTo gte\r\n * hyperbolicCosine cosh\r\n * hyperbolicSine sinh\r\n * hyperbolicTangent tanh\r\n * inverseCosine acos\r\n * inverseHyperbolicCosine acosh\r\n * inverseHyperbolicSine asinh\r\n * inverseHyperbolicTangent atanh\r\n * inverseSine asin\r\n * inverseTangent atan\r\n * isFinite\r\n * isInteger isInt\r\n * isNaN\r\n * isNegative isNeg\r\n * isPositive isPos\r\n * isZero\r\n * lessThan lt\r\n * lessThanOrEqualTo lte\r\n * logarithm log\r\n * [maximum] [max]\r\n * [minimum] [min]\r\n * minus sub\r\n * modulo mod\r\n * naturalExponential exp\r\n * naturalLogarithm ln\r\n * negated neg\r\n * plus add\r\n * precision sd\r\n * round\r\n * sine sin\r\n * squareRoot sqrt\r\n * tangent tan\r\n * times mul\r\n * toBinary\r\n * toDecimalPlaces toDP\r\n * toExponential\r\n * toFixed\r\n * toFraction\r\n * toHexadecimal toHex\r\n * toNearest\r\n * toNumber\r\n * toOctal\r\n * toPower pow\r\n * toPrecision\r\n * toSignificantDigits toSD\r\n * toString\r\n * truncated trunc\r\n * valueOf toJSON\r\n */\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the absolute value of this Decimal.\r\n *\r\n */\r\nP.absoluteValue = P.abs = function () {\r\n var x = new this.constructor(this);\r\n if (x.s < 0) x.s = 1;\r\n return finalise(x);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal rounded to a whole number in the\r\n * direction of positive Infinity.\r\n *\r\n */\r\nP.ceil = function () {\r\n return finalise(new this.constructor(this), this.e + 1, 2);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal clamped to the range\r\n * delineated by `min` and `max`.\r\n *\r\n * min {number|string|Decimal}\r\n * max {number|string|Decimal}\r\n *\r\n */\r\nP.clampedTo = P.clamp = function (min, max) {\r\n var k,\r\n x = this,\r\n Ctor = x.constructor;\r\n min = new Ctor(min);\r\n max = new Ctor(max);\r\n if (!min.s || !max.s) return new Ctor(NaN);\r\n if (min.gt(max)) throw Error(invalidArgument + max);\r\n k = x.cmp(min);\r\n return k < 0 ? min : x.cmp(max) > 0 ? max : new Ctor(x);\r\n};\r\n\r\n\r\n/*\r\n * Return\r\n * 1 if the value of this Decimal is greater than the value of `y`,\r\n * -1 if the value of this Decimal is less than the value of `y`,\r\n * 0 if they have the same value,\r\n * NaN if the value of either Decimal is NaN.\r\n *\r\n */\r\nP.comparedTo = P.cmp = function (y) {\r\n var i, j, xdL, ydL,\r\n x = this,\r\n xd = x.d,\r\n yd = (y = new x.constructor(y)).d,\r\n xs = x.s,\r\n ys = y.s;\r\n\r\n // Either NaN or ±Infinity?\r\n if (!xd || !yd) {\r\n return !xs || !ys ? NaN : xs !== ys ? xs : xd === yd ? 0 : !xd ^ xs < 0 ? 1 : -1;\r\n }\r\n\r\n // Either zero?\r\n if (!xd[0] || !yd[0]) return xd[0] ? xs : yd[0] ? -ys : 0;\r\n\r\n // Signs differ?\r\n if (xs !== ys) return xs;\r\n\r\n // Compare exponents.\r\n if (x.e !== y.e) return x.e > y.e ^ xs < 0 ? 1 : -1;\r\n\r\n xdL = xd.length;\r\n ydL = yd.length;\r\n\r\n // Compare digit by digit.\r\n for (i = 0, j = xdL < ydL ? xdL : ydL; i < j; ++i) {\r\n if (xd[i] !== yd[i]) return xd[i] > yd[i] ^ xs < 0 ? 1 : -1;\r\n }\r\n\r\n // Compare lengths.\r\n return xdL === ydL ? 0 : xdL > ydL ^ xs < 0 ? 1 : -1;\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the cosine of the value in radians of this Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-1, 1]\r\n *\r\n * cos(0) = 1\r\n * cos(-0) = 1\r\n * cos(Infinity) = NaN\r\n * cos(-Infinity) = NaN\r\n * cos(NaN) = NaN\r\n *\r\n */\r\nP.cosine = P.cos = function () {\r\n var pr, rm,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (!x.d) return new Ctor(NaN);\r\n\r\n // cos(0) = cos(-0) = 1\r\n if (!x.d[0]) return new Ctor(1);\r\n\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n Ctor.precision = pr + Math.max(x.e, x.sd()) + LOG_BASE;\r\n Ctor.rounding = 1;\r\n\r\n x = cosine(Ctor, toLessThanHalfPi(Ctor, x));\r\n\r\n Ctor.precision = pr;\r\n Ctor.rounding = rm;\r\n\r\n return finalise(quadrant == 2 || quadrant == 3 ? x.neg() : x, pr, rm, true);\r\n};\r\n\r\n\r\n/*\r\n *\r\n * Return a new Decimal whose value is the cube root of the value of this Decimal, rounded to\r\n * `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * cbrt(0) = 0\r\n * cbrt(-0) = -0\r\n * cbrt(1) = 1\r\n * cbrt(-1) = -1\r\n * cbrt(N) = N\r\n * cbrt(-I) = -I\r\n * cbrt(I) = I\r\n *\r\n * Math.cbrt(x) = (x < 0 ? -Math.pow(-x, 1/3) : Math.pow(x, 1/3))\r\n *\r\n */\r\nP.cubeRoot = P.cbrt = function () {\r\n var e, m, n, r, rep, s, sd, t, t3, t3plusx,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (!x.isFinite() || x.isZero()) return new Ctor(x);\r\n external = false;\r\n\r\n // Initial estimate.\r\n s = x.s * mathpow(x.s * x, 1 / 3);\r\n\r\n // Math.cbrt underflow/overflow?\r\n // Pass x to Math.pow as integer, then adjust the exponent of the result.\r\n if (!s || Math.abs(s) == 1 / 0) {\r\n n = digitsToString(x.d);\r\n e = x.e;\r\n\r\n // Adjust n exponent so it is a multiple of 3 away from x exponent.\r\n if (s = (e - n.length + 1) % 3) n += (s == 1 || s == -2 ? '0' : '00');\r\n s = mathpow(n, 1 / 3);\r\n\r\n // Rarely, e may be one less than the result exponent value.\r\n e = mathfloor((e + 1) / 3) - (e % 3 == (e < 0 ? -1 : 2));\r\n\r\n if (s == 1 / 0) {\r\n n = '5e' + e;\r\n } else {\r\n n = s.toExponential();\r\n n = n.slice(0, n.indexOf('e') + 1) + e;\r\n }\r\n\r\n r = new Ctor(n);\r\n r.s = x.s;\r\n } else {\r\n r = new Ctor(s.toString());\r\n }\r\n\r\n sd = (e = Ctor.precision) + 3;\r\n\r\n // Halley's method.\r\n // TODO? Compare Newton's method.\r\n for (;;) {\r\n t = r;\r\n t3 = t.times(t).times(t);\r\n t3plusx = t3.plus(x);\r\n r = divide(t3plusx.plus(x).times(t), t3plusx.plus(t3), sd + 2, 1);\r\n\r\n // TODO? Replace with for-loop and checkRoundingDigits.\r\n if (digitsToString(t.d).slice(0, sd) === (n = digitsToString(r.d)).slice(0, sd)) {\r\n n = n.slice(sd - 3, sd + 1);\r\n\r\n // The 4th rounding digit may be in error by -1 so if the 4 rounding digits are 9999 or 4999\r\n // , i.e. approaching a rounding boundary, continue the iteration.\r\n if (n == '9999' || !rep && n == '4999') {\r\n\r\n // On the first iteration only, check to see if rounding up gives the exact result as the\r\n // nines may infinitely repeat.\r\n if (!rep) {\r\n finalise(t, e + 1, 0);\r\n\r\n if (t.times(t).times(t).eq(x)) {\r\n r = t;\r\n break;\r\n }\r\n }\r\n\r\n sd += 4;\r\n rep = 1;\r\n } else {\r\n\r\n // If the rounding digits are null, 0{0,4} or 50{0,3}, check for an exact result.\r\n // If not, then there are further digits and m will be truthy.\r\n if (!+n || !+n.slice(1) && n.charAt(0) == '5') {\r\n\r\n // Truncate to the first rounding digit.\r\n finalise(r, e + 1, 1);\r\n m = !r.times(r).times(r).eq(x);\r\n }\r\n\r\n break;\r\n }\r\n }\r\n }\r\n\r\n external = true;\r\n\r\n return finalise(r, e, Ctor.rounding, m);\r\n};\r\n\r\n\r\n/*\r\n * Return the number of decimal places of the value of this Decimal.\r\n *\r\n */\r\nP.decimalPlaces = P.dp = function () {\r\n var w,\r\n d = this.d,\r\n n = NaN;\r\n\r\n if (d) {\r\n w = d.length - 1;\r\n n = (w - mathfloor(this.e / LOG_BASE)) * LOG_BASE;\r\n\r\n // Subtract the number of trailing zeros of the last word.\r\n w = d[w];\r\n if (w) for (; w % 10 == 0; w /= 10) n--;\r\n if (n < 0) n = 0;\r\n }\r\n\r\n return n;\r\n};\r\n\r\n\r\n/*\r\n * n / 0 = I\r\n * n / N = N\r\n * n / I = 0\r\n * 0 / n = 0\r\n * 0 / 0 = N\r\n * 0 / N = N\r\n * 0 / I = 0\r\n * N / n = N\r\n * N / 0 = N\r\n * N / N = N\r\n * N / I = N\r\n * I / n = I\r\n * I / 0 = I\r\n * I / N = N\r\n * I / I = N\r\n *\r\n * Return a new Decimal whose value is the value of this Decimal divided by `y`, rounded to\r\n * `precision` significant digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.dividedBy = P.div = function (y) {\r\n return divide(this, new this.constructor(y));\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the integer part of dividing the value of this Decimal\r\n * by the value of `y`, rounded to `precision` significant digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.dividedToIntegerBy = P.divToInt = function (y) {\r\n var x = this,\r\n Ctor = x.constructor;\r\n return finalise(divide(x, new Ctor(y), 0, 1, 1), Ctor.precision, Ctor.rounding);\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is equal to the value of `y`, otherwise return false.\r\n *\r\n */\r\nP.equals = P.eq = function (y) {\r\n return this.cmp(y) === 0;\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal rounded to a whole number in the\r\n * direction of negative Infinity.\r\n *\r\n */\r\nP.floor = function () {\r\n return finalise(new this.constructor(this), this.e + 1, 3);\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is greater than the value of `y`, otherwise return\r\n * false.\r\n *\r\n */\r\nP.greaterThan = P.gt = function (y) {\r\n return this.cmp(y) > 0;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is greater than or equal to the value of `y`,\r\n * otherwise return false.\r\n *\r\n */\r\nP.greaterThanOrEqualTo = P.gte = function (y) {\r\n var k = this.cmp(y);\r\n return k == 1 || k === 0;\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the hyperbolic cosine of the value in radians of this\r\n * Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [1, Infinity]\r\n *\r\n * cosh(x) = 1 + x^2/2! + x^4/4! + x^6/6! + ...\r\n *\r\n * cosh(0) = 1\r\n * cosh(-0) = 1\r\n * cosh(Infinity) = Infinity\r\n * cosh(-Infinity) = Infinity\r\n * cosh(NaN) = NaN\r\n *\r\n * x time taken (ms) result\r\n * 1000 9 9.8503555700852349694e+433\r\n * 10000 25 4.4034091128314607936e+4342\r\n * 100000 171 1.4033316802130615897e+43429\r\n * 1000000 3817 1.5166076984010437725e+434294\r\n * 10000000 abandoned after 2 minute wait\r\n *\r\n * TODO? Compare performance of cosh(x) = 0.5 * (exp(x) + exp(-x))\r\n *\r\n */\r\nP.hyperbolicCosine = P.cosh = function () {\r\n var k, n, pr, rm, len,\r\n x = this,\r\n Ctor = x.constructor,\r\n one = new Ctor(1);\r\n\r\n if (!x.isFinite()) return new Ctor(x.s ? 1 / 0 : NaN);\r\n if (x.isZero()) return one;\r\n\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n Ctor.precision = pr + Math.max(x.e, x.sd()) + 4;\r\n Ctor.rounding = 1;\r\n len = x.d.length;\r\n\r\n // Argument reduction: cos(4x) = 1 - 8cos^2(x) + 8cos^4(x) + 1\r\n // i.e. cos(x) = 1 - cos^2(x/4)(8 - 8cos^2(x/4))\r\n\r\n // Estimate the optimum number of times to use the argument reduction.\r\n // TODO? Estimation reused from cosine() and may not be optimal here.\r\n if (len < 32) {\r\n k = Math.ceil(len / 3);\r\n n = (1 / tinyPow(4, k)).toString();\r\n } else {\r\n k = 16;\r\n n = '2.3283064365386962890625e-10';\r\n }\r\n\r\n x = taylorSeries(Ctor, 1, x.times(n), new Ctor(1), true);\r\n\r\n // Reverse argument reduction\r\n var cosh2_x,\r\n i = k,\r\n d8 = new Ctor(8);\r\n for (; i--;) {\r\n cosh2_x = x.times(x);\r\n x = one.minus(cosh2_x.times(d8.minus(cosh2_x.times(d8))));\r\n }\r\n\r\n return finalise(x, Ctor.precision = pr, Ctor.rounding = rm, true);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the hyperbolic sine of the value in radians of this\r\n * Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-Infinity, Infinity]\r\n *\r\n * sinh(x) = x + x^3/3! + x^5/5! + x^7/7! + ...\r\n *\r\n * sinh(0) = 0\r\n * sinh(-0) = -0\r\n * sinh(Infinity) = Infinity\r\n * sinh(-Infinity) = -Infinity\r\n * sinh(NaN) = NaN\r\n *\r\n * x time taken (ms)\r\n * 10 2 ms\r\n * 100 5 ms\r\n * 1000 14 ms\r\n * 10000 82 ms\r\n * 100000 886 ms 1.4033316802130615897e+43429\r\n * 200000 2613 ms\r\n * 300000 5407 ms\r\n * 400000 8824 ms\r\n * 500000 13026 ms 8.7080643612718084129e+217146\r\n * 1000000 48543 ms\r\n *\r\n * TODO? Compare performance of sinh(x) = 0.5 * (exp(x) - exp(-x))\r\n *\r\n */\r\nP.hyperbolicSine = P.sinh = function () {\r\n var k, pr, rm, len,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (!x.isFinite() || x.isZero()) return new Ctor(x);\r\n\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n Ctor.precision = pr + Math.max(x.e, x.sd()) + 4;\r\n Ctor.rounding = 1;\r\n len = x.d.length;\r\n\r\n if (len < 3) {\r\n x = taylorSeries(Ctor, 2, x, x, true);\r\n } else {\r\n\r\n // Alternative argument reduction: sinh(3x) = sinh(x)(3 + 4sinh^2(x))\r\n // i.e. sinh(x) = sinh(x/3)(3 + 4sinh^2(x/3))\r\n // 3 multiplications and 1 addition\r\n\r\n // Argument reduction: sinh(5x) = sinh(x)(5 + sinh^2(x)(20 + 16sinh^2(x)))\r\n // i.e. sinh(x) = sinh(x/5)(5 + sinh^2(x/5)(20 + 16sinh^2(x/5)))\r\n // 4 multiplications and 2 additions\r\n\r\n // Estimate the optimum number of times to use the argument reduction.\r\n k = 1.4 * Math.sqrt(len);\r\n k = k > 16 ? 16 : k | 0;\r\n\r\n x = x.times(1 / tinyPow(5, k));\r\n x = taylorSeries(Ctor, 2, x, x, true);\r\n\r\n // Reverse argument reduction\r\n var sinh2_x,\r\n d5 = new Ctor(5),\r\n d16 = new Ctor(16),\r\n d20 = new Ctor(20);\r\n for (; k--;) {\r\n sinh2_x = x.times(x);\r\n x = x.times(d5.plus(sinh2_x.times(d16.times(sinh2_x).plus(d20))));\r\n }\r\n }\r\n\r\n Ctor.precision = pr;\r\n Ctor.rounding = rm;\r\n\r\n return finalise(x, pr, rm, true);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the hyperbolic tangent of the value in radians of this\r\n * Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-1, 1]\r\n *\r\n * tanh(x) = sinh(x) / cosh(x)\r\n *\r\n * tanh(0) = 0\r\n * tanh(-0) = -0\r\n * tanh(Infinity) = 1\r\n * tanh(-Infinity) = -1\r\n * tanh(NaN) = NaN\r\n *\r\n */\r\nP.hyperbolicTangent = P.tanh = function () {\r\n var pr, rm,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (!x.isFinite()) return new Ctor(x.s);\r\n if (x.isZero()) return new Ctor(x);\r\n\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n Ctor.precision = pr + 7;\r\n Ctor.rounding = 1;\r\n\r\n return divide(x.sinh(), x.cosh(), Ctor.precision = pr, Ctor.rounding = rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arccosine (inverse cosine) in radians of the value of\r\n * this Decimal.\r\n *\r\n * Domain: [-1, 1]\r\n * Range: [0, pi]\r\n *\r\n * acos(x) = pi/2 - asin(x)\r\n *\r\n * acos(0) = pi/2\r\n * acos(-0) = pi/2\r\n * acos(1) = 0\r\n * acos(-1) = pi\r\n * acos(1/2) = pi/3\r\n * acos(-1/2) = 2*pi/3\r\n * acos(|x| > 1) = NaN\r\n * acos(NaN) = NaN\r\n *\r\n */\r\nP.inverseCosine = P.acos = function () {\r\n var halfPi,\r\n x = this,\r\n Ctor = x.constructor,\r\n k = x.abs().cmp(1),\r\n pr = Ctor.precision,\r\n rm = Ctor.rounding;\r\n\r\n if (k !== -1) {\r\n return k === 0\r\n // |x| is 1\r\n ? x.isNeg() ? getPi(Ctor, pr, rm) : new Ctor(0)\r\n // |x| > 1 or x is NaN\r\n : new Ctor(NaN);\r\n }\r\n\r\n if (x.isZero()) return getPi(Ctor, pr + 4, rm).times(0.5);\r\n\r\n // TODO? Special case acos(0.5) = pi/3 and acos(-0.5) = 2*pi/3\r\n\r\n Ctor.precision = pr + 6;\r\n Ctor.rounding = 1;\r\n\r\n x = x.asin();\r\n halfPi = getPi(Ctor, pr + 4, rm).times(0.5);\r\n\r\n Ctor.precision = pr;\r\n Ctor.rounding = rm;\r\n\r\n return halfPi.minus(x);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the inverse of the hyperbolic cosine in radians of the\r\n * value of this Decimal.\r\n *\r\n * Domain: [1, Infinity]\r\n * Range: [0, Infinity]\r\n *\r\n * acosh(x) = ln(x + sqrt(x^2 - 1))\r\n *\r\n * acosh(x < 1) = NaN\r\n * acosh(NaN) = NaN\r\n * acosh(Infinity) = Infinity\r\n * acosh(-Infinity) = NaN\r\n * acosh(0) = NaN\r\n * acosh(-0) = NaN\r\n * acosh(1) = 0\r\n * acosh(-1) = NaN\r\n *\r\n */\r\nP.inverseHyperbolicCosine = P.acosh = function () {\r\n var pr, rm,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (x.lte(1)) return new Ctor(x.eq(1) ? 0 : NaN);\r\n if (!x.isFinite()) return new Ctor(x);\r\n\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n Ctor.precision = pr + Math.max(Math.abs(x.e), x.sd()) + 4;\r\n Ctor.rounding = 1;\r\n external = false;\r\n\r\n x = x.times(x).minus(1).sqrt().plus(x);\r\n\r\n external = true;\r\n Ctor.precision = pr;\r\n Ctor.rounding = rm;\r\n\r\n return x.ln();\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the inverse of the hyperbolic sine in radians of the value\r\n * of this Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-Infinity, Infinity]\r\n *\r\n * asinh(x) = ln(x + sqrt(x^2 + 1))\r\n *\r\n * asinh(NaN) = NaN\r\n * asinh(Infinity) = Infinity\r\n * asinh(-Infinity) = -Infinity\r\n * asinh(0) = 0\r\n * asinh(-0) = -0\r\n *\r\n */\r\nP.inverseHyperbolicSine = P.asinh = function () {\r\n var pr, rm,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (!x.isFinite() || x.isZero()) return new Ctor(x);\r\n\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n Ctor.precision = pr + 2 * Math.max(Math.abs(x.e), x.sd()) + 6;\r\n Ctor.rounding = 1;\r\n external = false;\r\n\r\n x = x.times(x).plus(1).sqrt().plus(x);\r\n\r\n external = true;\r\n Ctor.precision = pr;\r\n Ctor.rounding = rm;\r\n\r\n return x.ln();\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the inverse of the hyperbolic tangent in radians of the\r\n * value of this Decimal.\r\n *\r\n * Domain: [-1, 1]\r\n * Range: [-Infinity, Infinity]\r\n *\r\n * atanh(x) = 0.5 * ln((1 + x) / (1 - x))\r\n *\r\n * atanh(|x| > 1) = NaN\r\n * atanh(NaN) = NaN\r\n * atanh(Infinity) = NaN\r\n * atanh(-Infinity) = NaN\r\n * atanh(0) = 0\r\n * atanh(-0) = -0\r\n * atanh(1) = Infinity\r\n * atanh(-1) = -Infinity\r\n *\r\n */\r\nP.inverseHyperbolicTangent = P.atanh = function () {\r\n var pr, rm, wpr, xsd,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (!x.isFinite()) return new Ctor(NaN);\r\n if (x.e >= 0) return new Ctor(x.abs().eq(1) ? x.s / 0 : x.isZero() ? x : NaN);\r\n\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n xsd = x.sd();\r\n\r\n if (Math.max(xsd, pr) < 2 * -x.e - 1) return finalise(new Ctor(x), pr, rm, true);\r\n\r\n Ctor.precision = wpr = xsd - x.e;\r\n\r\n x = divide(x.plus(1), new Ctor(1).minus(x), wpr + pr, 1);\r\n\r\n Ctor.precision = pr + 4;\r\n Ctor.rounding = 1;\r\n\r\n x = x.ln();\r\n\r\n Ctor.precision = pr;\r\n Ctor.rounding = rm;\r\n\r\n return x.times(0.5);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arcsine (inverse sine) in radians of the value of this\r\n * Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-pi/2, pi/2]\r\n *\r\n * asin(x) = 2*atan(x/(1 + sqrt(1 - x^2)))\r\n *\r\n * asin(0) = 0\r\n * asin(-0) = -0\r\n * asin(1/2) = pi/6\r\n * asin(-1/2) = -pi/6\r\n * asin(1) = pi/2\r\n * asin(-1) = -pi/2\r\n * asin(|x| > 1) = NaN\r\n * asin(NaN) = NaN\r\n *\r\n * TODO? Compare performance of Taylor series.\r\n *\r\n */\r\nP.inverseSine = P.asin = function () {\r\n var halfPi, k,\r\n pr, rm,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (x.isZero()) return new Ctor(x);\r\n\r\n k = x.abs().cmp(1);\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n\r\n if (k !== -1) {\r\n\r\n // |x| is 1\r\n if (k === 0) {\r\n halfPi = getPi(Ctor, pr + 4, rm).times(0.5);\r\n halfPi.s = x.s;\r\n return halfPi;\r\n }\r\n\r\n // |x| > 1 or x is NaN\r\n return new Ctor(NaN);\r\n }\r\n\r\n // TODO? Special case asin(1/2) = pi/6 and asin(-1/2) = -pi/6\r\n\r\n Ctor.precision = pr + 6;\r\n Ctor.rounding = 1;\r\n\r\n x = x.div(new Ctor(1).minus(x.times(x)).sqrt().plus(1)).atan();\r\n\r\n Ctor.precision = pr;\r\n Ctor.rounding = rm;\r\n\r\n return x.times(2);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arctangent (inverse tangent) in radians of the value\r\n * of this Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-pi/2, pi/2]\r\n *\r\n * atan(x) = x - x^3/3 + x^5/5 - x^7/7 + ...\r\n *\r\n * atan(0) = 0\r\n * atan(-0) = -0\r\n * atan(1) = pi/4\r\n * atan(-1) = -pi/4\r\n * atan(Infinity) = pi/2\r\n * atan(-Infinity) = -pi/2\r\n * atan(NaN) = NaN\r\n *\r\n */\r\nP.inverseTangent = P.atan = function () {\r\n var i, j, k, n, px, t, r, wpr, x2,\r\n x = this,\r\n Ctor = x.constructor,\r\n pr = Ctor.precision,\r\n rm = Ctor.rounding;\r\n\r\n if (!x.isFinite()) {\r\n if (!x.s) return new Ctor(NaN);\r\n if (pr + 4 <= PI_PRECISION) {\r\n r = getPi(Ctor, pr + 4, rm).times(0.5);\r\n r.s = x.s;\r\n return r;\r\n }\r\n } else if (x.isZero()) {\r\n return new Ctor(x);\r\n } else if (x.abs().eq(1) && pr + 4 <= PI_PRECISION) {\r\n r = getPi(Ctor, pr + 4, rm).times(0.25);\r\n r.s = x.s;\r\n return r;\r\n }\r\n\r\n Ctor.precision = wpr = pr + 10;\r\n Ctor.rounding = 1;\r\n\r\n // TODO? if (x >= 1 && pr <= PI_PRECISION) atan(x) = halfPi * x.s - atan(1 / x);\r\n\r\n // Argument reduction\r\n // Ensure |x| < 0.42\r\n // atan(x) = 2 * atan(x / (1 + sqrt(1 + x^2)))\r\n\r\n k = Math.min(28, wpr / LOG_BASE + 2 | 0);\r\n\r\n for (i = k; i; --i) x = x.div(x.times(x).plus(1).sqrt().plus(1));\r\n\r\n external = false;\r\n\r\n j = Math.ceil(wpr / LOG_BASE);\r\n n = 1;\r\n x2 = x.times(x);\r\n r = new Ctor(x);\r\n px = x;\r\n\r\n // atan(x) = x - x^3/3 + x^5/5 - x^7/7 + ...\r\n for (; i !== -1;) {\r\n px = px.times(x2);\r\n t = r.minus(px.div(n += 2));\r\n\r\n px = px.times(x2);\r\n r = t.plus(px.div(n += 2));\r\n\r\n if (r.d[j] !== void 0) for (i = j; r.d[i] === t.d[i] && i--;);\r\n }\r\n\r\n if (k) r = r.times(2 << (k - 1));\r\n\r\n external = true;\r\n\r\n return finalise(r, Ctor.precision = pr, Ctor.rounding = rm, true);\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is a finite number, otherwise return false.\r\n *\r\n */\r\nP.isFinite = function () {\r\n return !!this.d;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is an integer, otherwise return false.\r\n *\r\n */\r\nP.isInteger = P.isInt = function () {\r\n return !!this.d && mathfloor(this.e / LOG_BASE) > this.d.length - 2;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is NaN, otherwise return false.\r\n *\r\n */\r\nP.isNaN = function () {\r\n return !this.s;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is negative, otherwise return false.\r\n *\r\n */\r\nP.isNegative = P.isNeg = function () {\r\n return this.s < 0;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is positive, otherwise return false.\r\n *\r\n */\r\nP.isPositive = P.isPos = function () {\r\n return this.s > 0;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is 0 or -0, otherwise return false.\r\n *\r\n */\r\nP.isZero = function () {\r\n return !!this.d && this.d[0] === 0;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is less than `y`, otherwise return false.\r\n *\r\n */\r\nP.lessThan = P.lt = function (y) {\r\n return this.cmp(y) < 0;\r\n};\r\n\r\n\r\n/*\r\n * Return true if the value of this Decimal is less than or equal to `y`, otherwise return false.\r\n *\r\n */\r\nP.lessThanOrEqualTo = P.lte = function (y) {\r\n return this.cmp(y) < 1;\r\n};\r\n\r\n\r\n/*\r\n * Return the logarithm of the value of this Decimal to the specified base, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * If no base is specified, return log[10](arg).\r\n *\r\n * log[base](arg) = ln(arg) / ln(base)\r\n *\r\n * The result will always be correctly rounded if the base of the log is 10, and 'almost always'\r\n * otherwise:\r\n *\r\n * Depending on the rounding mode, the result may be incorrectly rounded if the first fifteen\r\n * rounding digits are [49]99999999999999 or [50]00000000000000. In that case, the maximum error\r\n * between the result and the correctly rounded result will be one ulp (unit in the last place).\r\n *\r\n * log[-b](a) = NaN\r\n * log[0](a) = NaN\r\n * log[1](a) = NaN\r\n * log[NaN](a) = NaN\r\n * log[Infinity](a) = NaN\r\n * log[b](0) = -Infinity\r\n * log[b](-0) = -Infinity\r\n * log[b](-a) = NaN\r\n * log[b](1) = 0\r\n * log[b](Infinity) = Infinity\r\n * log[b](NaN) = NaN\r\n *\r\n * [base] {number|string|Decimal} The base of the logarithm.\r\n *\r\n */\r\nP.logarithm = P.log = function (base) {\r\n var isBase10, d, denominator, k, inf, num, sd, r,\r\n arg = this,\r\n Ctor = arg.constructor,\r\n pr = Ctor.precision,\r\n rm = Ctor.rounding,\r\n guard = 5;\r\n\r\n // Default base is 10.\r\n if (base == null) {\r\n base = new Ctor(10);\r\n isBase10 = true;\r\n } else {\r\n base = new Ctor(base);\r\n d = base.d;\r\n\r\n // Return NaN if base is negative, or non-finite, or is 0 or 1.\r\n if (base.s < 0 || !d || !d[0] || base.eq(1)) return new Ctor(NaN);\r\n\r\n isBase10 = base.eq(10);\r\n }\r\n\r\n d = arg.d;\r\n\r\n // Is arg negative, non-finite, 0 or 1?\r\n if (arg.s < 0 || !d || !d[0] || arg.eq(1)) {\r\n return new Ctor(d && !d[0] ? -1 / 0 : arg.s != 1 ? NaN : d ? 0 : 1 / 0);\r\n }\r\n\r\n // The result will have a non-terminating decimal expansion if base is 10 and arg is not an\r\n // integer power of 10.\r\n if (isBase10) {\r\n if (d.length > 1) {\r\n inf = true;\r\n } else {\r\n for (k = d[0]; k % 10 === 0;) k /= 10;\r\n inf = k !== 1;\r\n }\r\n }\r\n\r\n external = false;\r\n sd = pr + guard;\r\n num = naturalLogarithm(arg, sd);\r\n denominator = isBase10 ? getLn10(Ctor, sd + 10) : naturalLogarithm(base, sd);\r\n\r\n // The result will have 5 rounding digits.\r\n r = divide(num, denominator, sd, 1);\r\n\r\n // If at a rounding boundary, i.e. the result's rounding digits are [49]9999 or [50]0000,\r\n // calculate 10 further digits.\r\n //\r\n // If the result is known to have an infinite decimal expansion, repeat this until it is clear\r\n // that the result is above or below the boundary. Otherwise, if after calculating the 10\r\n // further digits, the last 14 are nines, round up and assume the result is exact.\r\n // Also assume the result is exact if the last 14 are zero.\r\n //\r\n // Example of a result that will be incorrectly rounded:\r\n // log[1048576](4503599627370502) = 2.60000000000000009610279511444746...\r\n // The above result correctly rounded using ROUND_CEIL to 1 decimal place should be 2.7, but it\r\n // will be given as 2.6 as there are 15 zeros immediately after the requested decimal place, so\r\n // the exact result would be assumed to be 2.6, which rounded using ROUND_CEIL to 1 decimal\r\n // place is still 2.6.\r\n if (checkRoundingDigits(r.d, k = pr, rm)) {\r\n\r\n do {\r\n sd += 10;\r\n num = naturalLogarithm(arg, sd);\r\n denominator = isBase10 ? getLn10(Ctor, sd + 10) : naturalLogarithm(base, sd);\r\n r = divide(num, denominator, sd, 1);\r\n\r\n if (!inf) {\r\n\r\n // Check for 14 nines from the 2nd rounding digit, as the first may be 4.\r\n if (+digitsToString(r.d).slice(k + 1, k + 15) + 1 == 1e14) {\r\n r = finalise(r, pr + 1, 0);\r\n }\r\n\r\n break;\r\n }\r\n } while (checkRoundingDigits(r.d, k += 10, rm));\r\n }\r\n\r\n external = true;\r\n\r\n return finalise(r, pr, rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the maximum of the arguments and the value of this Decimal.\r\n *\r\n * arguments {number|string|Decimal}\r\n *\r\nP.max = function () {\r\n Array.prototype.push.call(arguments, this);\r\n return maxOrMin(this.constructor, arguments, 'lt');\r\n};\r\n */\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the minimum of the arguments and the value of this Decimal.\r\n *\r\n * arguments {number|string|Decimal}\r\n *\r\nP.min = function () {\r\n Array.prototype.push.call(arguments, this);\r\n return maxOrMin(this.constructor, arguments, 'gt');\r\n};\r\n */\r\n\r\n\r\n/*\r\n * n - 0 = n\r\n * n - N = N\r\n * n - I = -I\r\n * 0 - n = -n\r\n * 0 - 0 = 0\r\n * 0 - N = N\r\n * 0 - I = -I\r\n * N - n = N\r\n * N - 0 = N\r\n * N - N = N\r\n * N - I = N\r\n * I - n = I\r\n * I - 0 = I\r\n * I - N = N\r\n * I - I = N\r\n *\r\n * Return a new Decimal whose value is the value of this Decimal minus `y`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.minus = P.sub = function (y) {\r\n var d, e, i, j, k, len, pr, rm, xd, xe, xLTy, yd,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n y = new Ctor(y);\r\n\r\n // If either is not finite...\r\n if (!x.d || !y.d) {\r\n\r\n // Return NaN if either is NaN.\r\n if (!x.s || !y.s) y = new Ctor(NaN);\r\n\r\n // Return y negated if x is finite and y is ±Infinity.\r\n else if (x.d) y.s = -y.s;\r\n\r\n // Return x if y is finite and x is ±Infinity.\r\n // Return x if both are ±Infinity with different signs.\r\n // Return NaN if both are ±Infinity with the same sign.\r\n else y = new Ctor(y.d || x.s !== y.s ? x : NaN);\r\n\r\n return y;\r\n }\r\n\r\n // If signs differ...\r\n if (x.s != y.s) {\r\n y.s = -y.s;\r\n return x.plus(y);\r\n }\r\n\r\n xd = x.d;\r\n yd = y.d;\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n\r\n // If either is zero...\r\n if (!xd[0] || !yd[0]) {\r\n\r\n // Return y negated if x is zero and y is non-zero.\r\n if (yd[0]) y.s = -y.s;\r\n\r\n // Return x if y is zero and x is non-zero.\r\n else if (xd[0]) y = new Ctor(x);\r\n\r\n // Return zero if both are zero.\r\n // From IEEE 754 (2008) 6.3: 0 - 0 = -0 - -0 = -0 when rounding to -Infinity.\r\n else return new Ctor(rm === 3 ? -0 : 0);\r\n\r\n return external ? finalise(y, pr, rm) : y;\r\n }\r\n\r\n // x and y are finite, non-zero numbers with the same sign.\r\n\r\n // Calculate base 1e7 exponents.\r\n e = mathfloor(y.e / LOG_BASE);\r\n xe = mathfloor(x.e / LOG_BASE);\r\n\r\n xd = xd.slice();\r\n k = xe - e;\r\n\r\n // If base 1e7 exponents differ...\r\n if (k) {\r\n xLTy = k < 0;\r\n\r\n if (xLTy) {\r\n d = xd;\r\n k = -k;\r\n len = yd.length;\r\n } else {\r\n d = yd;\r\n e = xe;\r\n len = xd.length;\r\n }\r\n\r\n // Numbers with massively different exponents would result in a very high number of\r\n // zeros needing to be prepended, but this can be avoided while still ensuring correct\r\n // rounding by limiting the number of zeros to `Math.ceil(pr / LOG_BASE) + 2`.\r\n i = Math.max(Math.ceil(pr / LOG_BASE), len) + 2;\r\n\r\n if (k > i) {\r\n k = i;\r\n d.length = 1;\r\n }\r\n\r\n // Prepend zeros to equalise exponents.\r\n d.reverse();\r\n for (i = k; i--;) d.push(0);\r\n d.reverse();\r\n\r\n // Base 1e7 exponents equal.\r\n } else {\r\n\r\n // Check digits to determine which is the bigger number.\r\n\r\n i = xd.length;\r\n len = yd.length;\r\n xLTy = i < len;\r\n if (xLTy) len = i;\r\n\r\n for (i = 0; i < len; i++) {\r\n if (xd[i] != yd[i]) {\r\n xLTy = xd[i] < yd[i];\r\n break;\r\n }\r\n }\r\n\r\n k = 0;\r\n }\r\n\r\n if (xLTy) {\r\n d = xd;\r\n xd = yd;\r\n yd = d;\r\n y.s = -y.s;\r\n }\r\n\r\n len = xd.length;\r\n\r\n // Append zeros to `xd` if shorter.\r\n // Don't add zeros to `yd` if shorter as subtraction only needs to start at `yd` length.\r\n for (i = yd.length - len; i > 0; --i) xd[len++] = 0;\r\n\r\n // Subtract yd from xd.\r\n for (i = yd.length; i > k;) {\r\n\r\n if (xd[--i] < yd[i]) {\r\n for (j = i; j && xd[--j] === 0;) xd[j] = BASE - 1;\r\n --xd[j];\r\n xd[i] += BASE;\r\n }\r\n\r\n xd[i] -= yd[i];\r\n }\r\n\r\n // Remove trailing zeros.\r\n for (; xd[--len] === 0;) xd.pop();\r\n\r\n // Remove leading zeros and adjust exponent accordingly.\r\n for (; xd[0] === 0; xd.shift()) --e;\r\n\r\n // Zero?\r\n if (!xd[0]) return new Ctor(rm === 3 ? -0 : 0);\r\n\r\n y.d = xd;\r\n y.e = getBase10Exponent(xd, e);\r\n\r\n return external ? finalise(y, pr, rm) : y;\r\n};\r\n\r\n\r\n/*\r\n * n % 0 = N\r\n * n % N = N\r\n * n % I = n\r\n * 0 % n = 0\r\n * -0 % n = -0\r\n * 0 % 0 = N\r\n * 0 % N = N\r\n * 0 % I = 0\r\n * N % n = N\r\n * N % 0 = N\r\n * N % N = N\r\n * N % I = N\r\n * I % n = N\r\n * I % 0 = N\r\n * I % N = N\r\n * I % I = N\r\n *\r\n * Return a new Decimal whose value is the value of this Decimal modulo `y`, rounded to\r\n * `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * The result depends on the modulo mode.\r\n *\r\n */\r\nP.modulo = P.mod = function (y) {\r\n var q,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n y = new Ctor(y);\r\n\r\n // Return NaN if x is ±Infinity or NaN, or y is NaN or ±0.\r\n if (!x.d || !y.s || y.d && !y.d[0]) return new Ctor(NaN);\r\n\r\n // Return x if y is ±Infinity or x is ±0.\r\n if (!y.d || x.d && !x.d[0]) {\r\n return finalise(new Ctor(x), Ctor.precision, Ctor.rounding);\r\n }\r\n\r\n // Prevent rounding of intermediate calculations.\r\n external = false;\r\n\r\n if (Ctor.modulo == 9) {\r\n\r\n // Euclidian division: q = sign(y) * floor(x / abs(y))\r\n // result = x - q * y where 0 <= result < abs(y)\r\n q = divide(x, y.abs(), 0, 3, 1);\r\n q.s *= y.s;\r\n } else {\r\n q = divide(x, y, 0, Ctor.modulo, 1);\r\n }\r\n\r\n q = q.times(y);\r\n\r\n external = true;\r\n\r\n return x.minus(q);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the natural exponential of the value of this Decimal,\r\n * i.e. the base e raised to the power the value of this Decimal, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.naturalExponential = P.exp = function () {\r\n return naturalExponential(this);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the natural logarithm of the value of this Decimal,\r\n * rounded to `precision` significant digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.naturalLogarithm = P.ln = function () {\r\n return naturalLogarithm(this);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal negated, i.e. as if multiplied by\r\n * -1.\r\n *\r\n */\r\nP.negated = P.neg = function () {\r\n var x = new this.constructor(this);\r\n x.s = -x.s;\r\n return finalise(x);\r\n};\r\n\r\n\r\n/*\r\n * n + 0 = n\r\n * n + N = N\r\n * n + I = I\r\n * 0 + n = n\r\n * 0 + 0 = 0\r\n * 0 + N = N\r\n * 0 + I = I\r\n * N + n = N\r\n * N + 0 = N\r\n * N + N = N\r\n * N + I = N\r\n * I + n = I\r\n * I + 0 = I\r\n * I + N = N\r\n * I + I = I\r\n *\r\n * Return a new Decimal whose value is the value of this Decimal plus `y`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.plus = P.add = function (y) {\r\n var carry, d, e, i, k, len, pr, rm, xd, yd,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n y = new Ctor(y);\r\n\r\n // If either is not finite...\r\n if (!x.d || !y.d) {\r\n\r\n // Return NaN if either is NaN.\r\n if (!x.s || !y.s) y = new Ctor(NaN);\r\n\r\n // Return x if y is finite and x is ±Infinity.\r\n // Return x if both are ±Infinity with the same sign.\r\n // Return NaN if both are ±Infinity with different signs.\r\n // Return y if x is finite and y is ±Infinity.\r\n else if (!x.d) y = new Ctor(y.d || x.s === y.s ? x : NaN);\r\n\r\n return y;\r\n }\r\n\r\n // If signs differ...\r\n if (x.s != y.s) {\r\n y.s = -y.s;\r\n return x.minus(y);\r\n }\r\n\r\n xd = x.d;\r\n yd = y.d;\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n\r\n // If either is zero...\r\n if (!xd[0] || !yd[0]) {\r\n\r\n // Return x if y is zero.\r\n // Return y if y is non-zero.\r\n if (!yd[0]) y = new Ctor(x);\r\n\r\n return external ? finalise(y, pr, rm) : y;\r\n }\r\n\r\n // x and y are finite, non-zero numbers with the same sign.\r\n\r\n // Calculate base 1e7 exponents.\r\n k = mathfloor(x.e / LOG_BASE);\r\n e = mathfloor(y.e / LOG_BASE);\r\n\r\n xd = xd.slice();\r\n i = k - e;\r\n\r\n // If base 1e7 exponents differ...\r\n if (i) {\r\n\r\n if (i < 0) {\r\n d = xd;\r\n i = -i;\r\n len = yd.length;\r\n } else {\r\n d = yd;\r\n e = k;\r\n len = xd.length;\r\n }\r\n\r\n // Limit number of zeros prepended to max(ceil(pr / LOG_BASE), len) + 1.\r\n k = Math.ceil(pr / LOG_BASE);\r\n len = k > len ? k + 1 : len + 1;\r\n\r\n if (i > len) {\r\n i = len;\r\n d.length = 1;\r\n }\r\n\r\n // Prepend zeros to equalise exponents. Note: Faster to use reverse then do unshifts.\r\n d.reverse();\r\n for (; i--;) d.push(0);\r\n d.reverse();\r\n }\r\n\r\n len = xd.length;\r\n i = yd.length;\r\n\r\n // If yd is longer than xd, swap xd and yd so xd points to the longer array.\r\n if (len - i < 0) {\r\n i = len;\r\n d = yd;\r\n yd = xd;\r\n xd = d;\r\n }\r\n\r\n // Only start adding at yd.length - 1 as the further digits of xd can be left as they are.\r\n for (carry = 0; i;) {\r\n carry = (xd[--i] = xd[i] + yd[i] + carry) / BASE | 0;\r\n xd[i] %= BASE;\r\n }\r\n\r\n if (carry) {\r\n xd.unshift(carry);\r\n ++e;\r\n }\r\n\r\n // Remove trailing zeros.\r\n // No need to check for zero, as +x + +y != 0 && -x + -y != 0\r\n for (len = xd.length; xd[--len] == 0;) xd.pop();\r\n\r\n y.d = xd;\r\n y.e = getBase10Exponent(xd, e);\r\n\r\n return external ? finalise(y, pr, rm) : y;\r\n};\r\n\r\n\r\n/*\r\n * Return the number of significant digits of the value of this Decimal.\r\n *\r\n * [z] {boolean|number} Whether to count integer-part trailing zeros: true, false, 1 or 0.\r\n *\r\n */\r\nP.precision = P.sd = function (z) {\r\n var k,\r\n x = this;\r\n\r\n if (z !== void 0 && z !== !!z && z !== 1 && z !== 0) throw Error(invalidArgument + z);\r\n\r\n if (x.d) {\r\n k = getPrecision(x.d);\r\n if (z && x.e + 1 > k) k = x.e + 1;\r\n } else {\r\n k = NaN;\r\n }\r\n\r\n return k;\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal rounded to a whole number using\r\n * rounding mode `rounding`.\r\n *\r\n */\r\nP.round = function () {\r\n var x = this,\r\n Ctor = x.constructor;\r\n\r\n return finalise(new Ctor(x), x.e + 1, Ctor.rounding);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the sine of the value in radians of this Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-1, 1]\r\n *\r\n * sin(x) = x - x^3/3! + x^5/5! - ...\r\n *\r\n * sin(0) = 0\r\n * sin(-0) = -0\r\n * sin(Infinity) = NaN\r\n * sin(-Infinity) = NaN\r\n * sin(NaN) = NaN\r\n *\r\n */\r\nP.sine = P.sin = function () {\r\n var pr, rm,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (!x.isFinite()) return new Ctor(NaN);\r\n if (x.isZero()) return new Ctor(x);\r\n\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n Ctor.precision = pr + Math.max(x.e, x.sd()) + LOG_BASE;\r\n Ctor.rounding = 1;\r\n\r\n x = sine(Ctor, toLessThanHalfPi(Ctor, x));\r\n\r\n Ctor.precision = pr;\r\n Ctor.rounding = rm;\r\n\r\n return finalise(quadrant > 2 ? x.neg() : x, pr, rm, true);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the square root of this Decimal, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * sqrt(-n) = N\r\n * sqrt(N) = N\r\n * sqrt(-I) = N\r\n * sqrt(I) = I\r\n * sqrt(0) = 0\r\n * sqrt(-0) = -0\r\n *\r\n */\r\nP.squareRoot = P.sqrt = function () {\r\n var m, n, sd, r, rep, t,\r\n x = this,\r\n d = x.d,\r\n e = x.e,\r\n s = x.s,\r\n Ctor = x.constructor;\r\n\r\n // Negative/NaN/Infinity/zero?\r\n if (s !== 1 || !d || !d[0]) {\r\n return new Ctor(!s || s < 0 && (!d || d[0]) ? NaN : d ? x : 1 / 0);\r\n }\r\n\r\n external = false;\r\n\r\n // Initial estimate.\r\n s = Math.sqrt(+x);\r\n\r\n // Math.sqrt underflow/overflow?\r\n // Pass x to Math.sqrt as integer, then adjust the exponent of the result.\r\n if (s == 0 || s == 1 / 0) {\r\n n = digitsToString(d);\r\n\r\n if ((n.length + e) % 2 == 0) n += '0';\r\n s = Math.sqrt(n);\r\n e = mathfloor((e + 1) / 2) - (e < 0 || e % 2);\r\n\r\n if (s == 1 / 0) {\r\n n = '5e' + e;\r\n } else {\r\n n = s.toExponential();\r\n n = n.slice(0, n.indexOf('e') + 1) + e;\r\n }\r\n\r\n r = new Ctor(n);\r\n } else {\r\n r = new Ctor(s.toString());\r\n }\r\n\r\n sd = (e = Ctor.precision) + 3;\r\n\r\n // Newton-Raphson iteration.\r\n for (;;) {\r\n t = r;\r\n r = t.plus(divide(x, t, sd + 2, 1)).times(0.5);\r\n\r\n // TODO? Replace with for-loop and checkRoundingDigits.\r\n if (digitsToString(t.d).slice(0, sd) === (n = digitsToString(r.d)).slice(0, sd)) {\r\n n = n.slice(sd - 3, sd + 1);\r\n\r\n // The 4th rounding digit may be in error by -1 so if the 4 rounding digits are 9999 or\r\n // 4999, i.e. approaching a rounding boundary, continue the iteration.\r\n if (n == '9999' || !rep && n == '4999') {\r\n\r\n // On the first iteration only, check to see if rounding up gives the exact result as the\r\n // nines may infinitely repeat.\r\n if (!rep) {\r\n finalise(t, e + 1, 0);\r\n\r\n if (t.times(t).eq(x)) {\r\n r = t;\r\n break;\r\n }\r\n }\r\n\r\n sd += 4;\r\n rep = 1;\r\n } else {\r\n\r\n // If the rounding digits are null, 0{0,4} or 50{0,3}, check for an exact result.\r\n // If not, then there are further digits and m will be truthy.\r\n if (!+n || !+n.slice(1) && n.charAt(0) == '5') {\r\n\r\n // Truncate to the first rounding digit.\r\n finalise(r, e + 1, 1);\r\n m = !r.times(r).eq(x);\r\n }\r\n\r\n break;\r\n }\r\n }\r\n }\r\n\r\n external = true;\r\n\r\n return finalise(r, e, Ctor.rounding, m);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the tangent of the value in radians of this Decimal.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-Infinity, Infinity]\r\n *\r\n * tan(0) = 0\r\n * tan(-0) = -0\r\n * tan(Infinity) = NaN\r\n * tan(-Infinity) = NaN\r\n * tan(NaN) = NaN\r\n *\r\n */\r\nP.tangent = P.tan = function () {\r\n var pr, rm,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (!x.isFinite()) return new Ctor(NaN);\r\n if (x.isZero()) return new Ctor(x);\r\n\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n Ctor.precision = pr + 10;\r\n Ctor.rounding = 1;\r\n\r\n x = x.sin();\r\n x.s = 1;\r\n x = divide(x, new Ctor(1).minus(x.times(x)).sqrt(), pr + 10, 0);\r\n\r\n Ctor.precision = pr;\r\n Ctor.rounding = rm;\r\n\r\n return finalise(quadrant == 2 || quadrant == 4 ? x.neg() : x, pr, rm, true);\r\n};\r\n\r\n\r\n/*\r\n * n * 0 = 0\r\n * n * N = N\r\n * n * I = I\r\n * 0 * n = 0\r\n * 0 * 0 = 0\r\n * 0 * N = N\r\n * 0 * I = N\r\n * N * n = N\r\n * N * 0 = N\r\n * N * N = N\r\n * N * I = N\r\n * I * n = I\r\n * I * 0 = N\r\n * I * N = N\r\n * I * I = I\r\n *\r\n * Return a new Decimal whose value is this Decimal times `y`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n */\r\nP.times = P.mul = function (y) {\r\n var carry, e, i, k, r, rL, t, xdL, ydL,\r\n x = this,\r\n Ctor = x.constructor,\r\n xd = x.d,\r\n yd = (y = new Ctor(y)).d;\r\n\r\n y.s *= x.s;\r\n\r\n // If either is NaN, ±Infinity or ±0...\r\n if (!xd || !xd[0] || !yd || !yd[0]) {\r\n\r\n return new Ctor(!y.s || xd && !xd[0] && !yd || yd && !yd[0] && !xd\r\n\r\n // Return NaN if either is NaN.\r\n // Return NaN if x is ±0 and y is ±Infinity, or y is ±0 and x is ±Infinity.\r\n ? NaN\r\n\r\n // Return ±Infinity if either is ±Infinity.\r\n // Return ±0 if either is ±0.\r\n : !xd || !yd ? y.s / 0 : y.s * 0);\r\n }\r\n\r\n e = mathfloor(x.e / LOG_BASE) + mathfloor(y.e / LOG_BASE);\r\n xdL = xd.length;\r\n ydL = yd.length;\r\n\r\n // Ensure xd points to the longer array.\r\n if (xdL < ydL) {\r\n r = xd;\r\n xd = yd;\r\n yd = r;\r\n rL = xdL;\r\n xdL = ydL;\r\n ydL = rL;\r\n }\r\n\r\n // Initialise the result array with zeros.\r\n r = [];\r\n rL = xdL + ydL;\r\n for (i = rL; i--;) r.push(0);\r\n\r\n // Multiply!\r\n for (i = ydL; --i >= 0;) {\r\n carry = 0;\r\n for (k = xdL + i; k > i;) {\r\n t = r[k] + yd[i] * xd[k - i - 1] + carry;\r\n r[k--] = t % BASE | 0;\r\n carry = t / BASE | 0;\r\n }\r\n\r\n r[k] = (r[k] + carry) % BASE | 0;\r\n }\r\n\r\n // Remove trailing zeros.\r\n for (; !r[--rL];) r.pop();\r\n\r\n if (carry) ++e;\r\n else r.shift();\r\n\r\n y.d = r;\r\n y.e = getBase10Exponent(r, e);\r\n\r\n return external ? finalise(y, Ctor.precision, Ctor.rounding) : y;\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal in base 2, round to `sd` significant\r\n * digits using rounding mode `rm`.\r\n *\r\n * If the optional `sd` argument is present then return binary exponential notation.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\nP.toBinary = function (sd, rm) {\r\n return toStringBinary(this, 2, sd, rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal rounded to a maximum of `dp`\r\n * decimal places using rounding mode `rm` or `rounding` if `rm` is omitted.\r\n *\r\n * If `dp` is omitted, return a new Decimal whose value is the value of this Decimal.\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\nP.toDecimalPlaces = P.toDP = function (dp, rm) {\r\n var x = this,\r\n Ctor = x.constructor;\r\n\r\n x = new Ctor(x);\r\n if (dp === void 0) return x;\r\n\r\n checkInt32(dp, 0, MAX_DIGITS);\r\n\r\n if (rm === void 0) rm = Ctor.rounding;\r\n else checkInt32(rm, 0, 8);\r\n\r\n return finalise(x, dp + x.e + 1, rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal in exponential notation rounded to\r\n * `dp` fixed decimal places using rounding mode `rounding`.\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\nP.toExponential = function (dp, rm) {\r\n var str,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (dp === void 0) {\r\n str = finiteToString(x, true);\r\n } else {\r\n checkInt32(dp, 0, MAX_DIGITS);\r\n\r\n if (rm === void 0) rm = Ctor.rounding;\r\n else checkInt32(rm, 0, 8);\r\n\r\n x = finalise(new Ctor(x), dp + 1, rm);\r\n str = finiteToString(x, true, dp + 1);\r\n }\r\n\r\n return x.isNeg() && !x.isZero() ? '-' + str : str;\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal in normal (fixed-point) notation to\r\n * `dp` fixed decimal places and rounded using rounding mode `rm` or `rounding` if `rm` is\r\n * omitted.\r\n *\r\n * As with JavaScript numbers, (-0).toFixed(0) is '0', but e.g. (-0.00001).toFixed(0) is '-0'.\r\n *\r\n * [dp] {number} Decimal places. Integer, 0 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * (-0).toFixed(0) is '0', but (-0.1).toFixed(0) is '-0'.\r\n * (-0).toFixed(1) is '0.0', but (-0.01).toFixed(1) is '-0.0'.\r\n * (-0).toFixed(3) is '0.000'.\r\n * (-0.5).toFixed(0) is '-0'.\r\n *\r\n */\r\nP.toFixed = function (dp, rm) {\r\n var str, y,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (dp === void 0) {\r\n str = finiteToString(x);\r\n } else {\r\n checkInt32(dp, 0, MAX_DIGITS);\r\n\r\n if (rm === void 0) rm = Ctor.rounding;\r\n else checkInt32(rm, 0, 8);\r\n\r\n y = finalise(new Ctor(x), dp + x.e + 1, rm);\r\n str = finiteToString(y, false, dp + y.e + 1);\r\n }\r\n\r\n // To determine whether to add the minus sign look at the value before it was rounded,\r\n // i.e. look at `x` rather than `y`.\r\n return x.isNeg() && !x.isZero() ? '-' + str : str;\r\n};\r\n\r\n\r\n/*\r\n * Return an array representing the value of this Decimal as a simple fraction with an integer\r\n * numerator and an integer denominator.\r\n *\r\n * The denominator will be a positive non-zero value less than or equal to the specified maximum\r\n * denominator. If a maximum denominator is not specified, the denominator will be the lowest\r\n * value necessary to represent the number exactly.\r\n *\r\n * [maxD] {number|string|Decimal} Maximum denominator. Integer >= 1 and < Infinity.\r\n *\r\n */\r\nP.toFraction = function (maxD) {\r\n var d, d0, d1, d2, e, k, n, n0, n1, pr, q, r,\r\n x = this,\r\n xd = x.d,\r\n Ctor = x.constructor;\r\n\r\n if (!xd) return new Ctor(x);\r\n\r\n n1 = d0 = new Ctor(1);\r\n d1 = n0 = new Ctor(0);\r\n\r\n d = new Ctor(d1);\r\n e = d.e = getPrecision(xd) - x.e - 1;\r\n k = e % LOG_BASE;\r\n d.d[0] = mathpow(10, k < 0 ? LOG_BASE + k : k);\r\n\r\n if (maxD == null) {\r\n\r\n // d is 10**e, the minimum max-denominator needed.\r\n maxD = e > 0 ? d : n1;\r\n } else {\r\n n = new Ctor(maxD);\r\n if (!n.isInt() || n.lt(n1)) throw Error(invalidArgument + n);\r\n maxD = n.gt(d) ? (e > 0 ? d : n1) : n;\r\n }\r\n\r\n external = false;\r\n n = new Ctor(digitsToString(xd));\r\n pr = Ctor.precision;\r\n Ctor.precision = e = xd.length * LOG_BASE * 2;\r\n\r\n for (;;) {\r\n q = divide(n, d, 0, 1, 1);\r\n d2 = d0.plus(q.times(d1));\r\n if (d2.cmp(maxD) == 1) break;\r\n d0 = d1;\r\n d1 = d2;\r\n d2 = n1;\r\n n1 = n0.plus(q.times(d2));\r\n n0 = d2;\r\n d2 = d;\r\n d = n.minus(q.times(d2));\r\n n = d2;\r\n }\r\n\r\n d2 = divide(maxD.minus(d0), d1, 0, 1, 1);\r\n n0 = n0.plus(d2.times(n1));\r\n d0 = d0.plus(d2.times(d1));\r\n n0.s = n1.s = x.s;\r\n\r\n // Determine which fraction is closer to x, n0/d0 or n1/d1?\r\n r = divide(n1, d1, e, 1).minus(x).abs().cmp(divide(n0, d0, e, 1).minus(x).abs()) < 1\r\n ? [n1, d1] : [n0, d0];\r\n\r\n Ctor.precision = pr;\r\n external = true;\r\n\r\n return r;\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal in base 16, round to `sd` significant\r\n * digits using rounding mode `rm`.\r\n *\r\n * If the optional `sd` argument is present then return binary exponential notation.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\nP.toHexadecimal = P.toHex = function (sd, rm) {\r\n return toStringBinary(this, 16, sd, rm);\r\n};\r\n\r\n\r\n/*\r\n * Returns a new Decimal whose value is the nearest multiple of `y` in the direction of rounding\r\n * mode `rm`, or `Decimal.rounding` if `rm` is omitted, to the value of this Decimal.\r\n *\r\n * The return value will always have the same sign as this Decimal, unless either this Decimal\r\n * or `y` is NaN, in which case the return value will be also be NaN.\r\n *\r\n * The return value is not affected by the value of `precision`.\r\n *\r\n * y {number|string|Decimal} The magnitude to round to a multiple of.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * 'toNearest() rounding mode not an integer: {rm}'\r\n * 'toNearest() rounding mode out of range: {rm}'\r\n *\r\n */\r\nP.toNearest = function (y, rm) {\r\n var x = this,\r\n Ctor = x.constructor;\r\n\r\n x = new Ctor(x);\r\n\r\n if (y == null) {\r\n\r\n // If x is not finite, return x.\r\n if (!x.d) return x;\r\n\r\n y = new Ctor(1);\r\n rm = Ctor.rounding;\r\n } else {\r\n y = new Ctor(y);\r\n if (rm === void 0) {\r\n rm = Ctor.rounding;\r\n } else {\r\n checkInt32(rm, 0, 8);\r\n }\r\n\r\n // If x is not finite, return x if y is not NaN, else NaN.\r\n if (!x.d) return y.s ? x : y;\r\n\r\n // If y is not finite, return Infinity with the sign of x if y is Infinity, else NaN.\r\n if (!y.d) {\r\n if (y.s) y.s = x.s;\r\n return y;\r\n }\r\n }\r\n\r\n // If y is not zero, calculate the nearest multiple of y to x.\r\n if (y.d[0]) {\r\n external = false;\r\n x = divide(x, y, 0, rm, 1).times(y);\r\n external = true;\r\n finalise(x);\r\n\r\n // If y is zero, return zero with the sign of x.\r\n } else {\r\n y.s = x.s;\r\n x = y;\r\n }\r\n\r\n return x;\r\n};\r\n\r\n\r\n/*\r\n * Return the value of this Decimal converted to a number primitive.\r\n * Zero keeps its sign.\r\n *\r\n */\r\nP.toNumber = function () {\r\n return +this;\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal in base 8, round to `sd` significant\r\n * digits using rounding mode `rm`.\r\n *\r\n * If the optional `sd` argument is present then return binary exponential notation.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\nP.toOctal = function (sd, rm) {\r\n return toStringBinary(this, 8, sd, rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal raised to the power `y`, rounded\r\n * to `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * ECMAScript compliant.\r\n *\r\n * pow(x, NaN) = NaN\r\n * pow(x, ±0) = 1\r\n\r\n * pow(NaN, non-zero) = NaN\r\n * pow(abs(x) > 1, +Infinity) = +Infinity\r\n * pow(abs(x) > 1, -Infinity) = +0\r\n * pow(abs(x) == 1, ±Infinity) = NaN\r\n * pow(abs(x) < 1, +Infinity) = +0\r\n * pow(abs(x) < 1, -Infinity) = +Infinity\r\n * pow(+Infinity, y > 0) = +Infinity\r\n * pow(+Infinity, y < 0) = +0\r\n * pow(-Infinity, odd integer > 0) = -Infinity\r\n * pow(-Infinity, even integer > 0) = +Infinity\r\n * pow(-Infinity, odd integer < 0) = -0\r\n * pow(-Infinity, even integer < 0) = +0\r\n * pow(+0, y > 0) = +0\r\n * pow(+0, y < 0) = +Infinity\r\n * pow(-0, odd integer > 0) = -0\r\n * pow(-0, even integer > 0) = +0\r\n * pow(-0, odd integer < 0) = -Infinity\r\n * pow(-0, even integer < 0) = +Infinity\r\n * pow(finite x < 0, finite non-integer) = NaN\r\n *\r\n * For non-integer or very large exponents pow(x, y) is calculated using\r\n *\r\n * x^y = exp(y*ln(x))\r\n *\r\n * Assuming the first 15 rounding digits are each equally likely to be any digit 0-9, the\r\n * probability of an incorrectly rounded result\r\n * P([49]9{14} | [50]0{14}) = 2 * 0.2 * 10^-14 = 4e-15 = 1/2.5e+14\r\n * i.e. 1 in 250,000,000,000,000\r\n *\r\n * If a result is incorrectly rounded the maximum error will be 1 ulp (unit in last place).\r\n *\r\n * y {number|string|Decimal} The power to which to raise this Decimal.\r\n *\r\n */\r\nP.toPower = P.pow = function (y) {\r\n var e, k, pr, r, rm, s,\r\n x = this,\r\n Ctor = x.constructor,\r\n yn = +(y = new Ctor(y));\r\n\r\n // Either ±Infinity, NaN or ±0?\r\n if (!x.d || !y.d || !x.d[0] || !y.d[0]) return new Ctor(mathpow(+x, yn));\r\n\r\n x = new Ctor(x);\r\n\r\n if (x.eq(1)) return x;\r\n\r\n pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n\r\n if (y.eq(1)) return finalise(x, pr, rm);\r\n\r\n // y exponent\r\n e = mathfloor(y.e / LOG_BASE);\r\n\r\n // If y is a small integer use the 'exponentiation by squaring' algorithm.\r\n if (e >= y.d.length - 1 && (k = yn < 0 ? -yn : yn) <= MAX_SAFE_INTEGER) {\r\n r = intPow(Ctor, x, k, pr);\r\n return y.s < 0 ? new Ctor(1).div(r) : finalise(r, pr, rm);\r\n }\r\n\r\n s = x.s;\r\n\r\n // if x is negative\r\n if (s < 0) {\r\n\r\n // if y is not an integer\r\n if (e < y.d.length - 1) return new Ctor(NaN);\r\n\r\n // Result is positive if x is negative and the last digit of integer y is even.\r\n if ((y.d[e] & 1) == 0) s = 1;\r\n\r\n // if x.eq(-1)\r\n if (x.e == 0 && x.d[0] == 1 && x.d.length == 1) {\r\n x.s = s;\r\n return x;\r\n }\r\n }\r\n\r\n // Estimate result exponent.\r\n // x^y = 10^e, where e = y * log10(x)\r\n // log10(x) = log10(x_significand) + x_exponent\r\n // log10(x_significand) = ln(x_significand) / ln(10)\r\n k = mathpow(+x, yn);\r\n e = k == 0 || !isFinite(k)\r\n ? mathfloor(yn * (Math.log('0.' + digitsToString(x.d)) / Math.LN10 + x.e + 1))\r\n : new Ctor(k + '').e;\r\n\r\n // Exponent estimate may be incorrect e.g. x: 0.999999999999999999, y: 2.29, e: 0, r.e: -1.\r\n\r\n // Overflow/underflow?\r\n if (e > Ctor.maxE + 1 || e < Ctor.minE - 1) return new Ctor(e > 0 ? s / 0 : 0);\r\n\r\n external = false;\r\n Ctor.rounding = x.s = 1;\r\n\r\n // Estimate the extra guard digits needed to ensure five correct rounding digits from\r\n // naturalLogarithm(x). Example of failure without these extra digits (precision: 10):\r\n // new Decimal(2.32456).pow('2087987436534566.46411')\r\n // should be 1.162377823e+764914905173815, but is 1.162355823e+764914905173815\r\n k = Math.min(12, (e + '').length);\r\n\r\n // r = x^y = exp(y*ln(x))\r\n r = naturalExponential(y.times(naturalLogarithm(x, pr + k)), pr);\r\n\r\n // r may be Infinity, e.g. (0.9999999999999999).pow(-1e+40)\r\n if (r.d) {\r\n\r\n // Truncate to the required precision plus five rounding digits.\r\n r = finalise(r, pr + 5, 1);\r\n\r\n // If the rounding digits are [49]9999 or [50]0000 increase the precision by 10 and recalculate\r\n // the result.\r\n if (checkRoundingDigits(r.d, pr, rm)) {\r\n e = pr + 10;\r\n\r\n // Truncate to the increased precision plus five rounding digits.\r\n r = finalise(naturalExponential(y.times(naturalLogarithm(x, e + k)), e), e + 5, 1);\r\n\r\n // Check for 14 nines from the 2nd rounding digit (the first rounding digit may be 4 or 9).\r\n if (+digitsToString(r.d).slice(pr + 1, pr + 15) + 1 == 1e14) {\r\n r = finalise(r, pr + 1, 0);\r\n }\r\n }\r\n }\r\n\r\n r.s = s;\r\n external = true;\r\n Ctor.rounding = rm;\r\n\r\n return finalise(r, pr, rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal rounded to `sd` significant digits\r\n * using rounding mode `rounding`.\r\n *\r\n * Return exponential notation if `sd` is less than the number of digits necessary to represent\r\n * the integer part of the value in normal notation.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n */\r\nP.toPrecision = function (sd, rm) {\r\n var str,\r\n x = this,\r\n Ctor = x.constructor;\r\n\r\n if (sd === void 0) {\r\n str = finiteToString(x, x.e <= Ctor.toExpNeg || x.e >= Ctor.toExpPos);\r\n } else {\r\n checkInt32(sd, 1, MAX_DIGITS);\r\n\r\n if (rm === void 0) rm = Ctor.rounding;\r\n else checkInt32(rm, 0, 8);\r\n\r\n x = finalise(new Ctor(x), sd, rm);\r\n str = finiteToString(x, sd <= x.e || x.e <= Ctor.toExpNeg, sd);\r\n }\r\n\r\n return x.isNeg() && !x.isZero() ? '-' + str : str;\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal rounded to a maximum of `sd`\r\n * significant digits using rounding mode `rm`, or to `precision` and `rounding` respectively if\r\n * omitted.\r\n *\r\n * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive.\r\n * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\r\n *\r\n * 'toSD() digits out of range: {sd}'\r\n * 'toSD() digits not an integer: {sd}'\r\n * 'toSD() rounding mode not an integer: {rm}'\r\n * 'toSD() rounding mode out of range: {rm}'\r\n *\r\n */\r\nP.toSignificantDigits = P.toSD = function (sd, rm) {\r\n var x = this,\r\n Ctor = x.constructor;\r\n\r\n if (sd === void 0) {\r\n sd = Ctor.precision;\r\n rm = Ctor.rounding;\r\n } else {\r\n checkInt32(sd, 1, MAX_DIGITS);\r\n\r\n if (rm === void 0) rm = Ctor.rounding;\r\n else checkInt32(rm, 0, 8);\r\n }\r\n\r\n return finalise(new Ctor(x), sd, rm);\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal.\r\n *\r\n * Return exponential notation if this Decimal has a positive exponent equal to or greater than\r\n * `toExpPos`, or a negative exponent equal to or less than `toExpNeg`.\r\n *\r\n */\r\nP.toString = function () {\r\n var x = this,\r\n Ctor = x.constructor,\r\n str = finiteToString(x, x.e <= Ctor.toExpNeg || x.e >= Ctor.toExpPos);\r\n\r\n return x.isNeg() && !x.isZero() ? '-' + str : str;\r\n};\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of this Decimal truncated to a whole number.\r\n *\r\n */\r\nP.truncated = P.trunc = function () {\r\n return finalise(new this.constructor(this), this.e + 1, 1);\r\n};\r\n\r\n\r\n/*\r\n * Return a string representing the value of this Decimal.\r\n * Unlike `toString`, negative zero will include the minus sign.\r\n *\r\n */\r\nP.valueOf = P.toJSON = function () {\r\n var x = this,\r\n Ctor = x.constructor,\r\n str = finiteToString(x, x.e <= Ctor.toExpNeg || x.e >= Ctor.toExpPos);\r\n\r\n return x.isNeg() ? '-' + str : str;\r\n};\r\n\r\n\r\n// Helper functions for Decimal.prototype (P) and/or Decimal methods, and their callers.\r\n\r\n\r\n/*\r\n * digitsToString P.cubeRoot, P.logarithm, P.squareRoot, P.toFraction, P.toPower,\r\n * finiteToString, naturalExponential, naturalLogarithm\r\n * checkInt32 P.toDecimalPlaces, P.toExponential, P.toFixed, P.toNearest,\r\n * P.toPrecision, P.toSignificantDigits, toStringBinary, random\r\n * checkRoundingDigits P.logarithm, P.toPower, naturalExponential, naturalLogarithm\r\n * convertBase toStringBinary, parseOther\r\n * cos P.cos\r\n * divide P.atanh, P.cubeRoot, P.dividedBy, P.dividedToIntegerBy,\r\n * P.logarithm, P.modulo, P.squareRoot, P.tan, P.tanh, P.toFraction,\r\n * P.toNearest, toStringBinary, naturalExponential, naturalLogarithm,\r\n * taylorSeries, atan2, parseOther\r\n * finalise P.absoluteValue, P.atan, P.atanh, P.ceil, P.cos, P.cosh,\r\n * P.cubeRoot, P.dividedToIntegerBy, P.floor, P.logarithm, P.minus,\r\n * P.modulo, P.negated, P.plus, P.round, P.sin, P.sinh, P.squareRoot,\r\n * P.tan, P.times, P.toDecimalPlaces, P.toExponential, P.toFixed,\r\n * P.toNearest, P.toPower, P.toPrecision, P.toSignificantDigits,\r\n * P.truncated, divide, getLn10, getPi, naturalExponential,\r\n * naturalLogarithm, ceil, floor, round, trunc\r\n * finiteToString P.toExponential, P.toFixed, P.toPrecision, P.toString, P.valueOf,\r\n * toStringBinary\r\n * getBase10Exponent P.minus, P.plus, P.times, parseOther\r\n * getLn10 P.logarithm, naturalLogarithm\r\n * getPi P.acos, P.asin, P.atan, toLessThanHalfPi, atan2\r\n * getPrecision P.precision, P.toFraction\r\n * getZeroString digitsToString, finiteToString\r\n * intPow P.toPower, parseOther\r\n * isOdd toLessThanHalfPi\r\n * maxOrMin max, min\r\n * naturalExponential P.naturalExponential, P.toPower\r\n * naturalLogarithm P.acosh, P.asinh, P.atanh, P.logarithm, P.naturalLogarithm,\r\n * P.toPower, naturalExponential\r\n * nonFiniteToString finiteToString, toStringBinary\r\n * parseDecimal Decimal\r\n * parseOther Decimal\r\n * sin P.sin\r\n * taylorSeries P.cosh, P.sinh, cos, sin\r\n * toLessThanHalfPi P.cos, P.sin\r\n * toStringBinary P.toBinary, P.toHexadecimal, P.toOctal\r\n * truncate intPow\r\n *\r\n * Throws: P.logarithm, P.precision, P.toFraction, checkInt32, getLn10, getPi,\r\n * naturalLogarithm, config, parseOther, random, Decimal\r\n */\r\n\r\n\r\nfunction digitsToString(d) {\r\n var i, k, ws,\r\n indexOfLastWord = d.length - 1,\r\n str = '',\r\n w = d[0];\r\n\r\n if (indexOfLastWord > 0) {\r\n str += w;\r\n for (i = 1; i < indexOfLastWord; i++) {\r\n ws = d[i] + '';\r\n k = LOG_BASE - ws.length;\r\n if (k) str += getZeroString(k);\r\n str += ws;\r\n }\r\n\r\n w = d[i];\r\n ws = w + '';\r\n k = LOG_BASE - ws.length;\r\n if (k) str += getZeroString(k);\r\n } else if (w === 0) {\r\n return '0';\r\n }\r\n\r\n // Remove trailing zeros of last w.\r\n for (; w % 10 === 0;) w /= 10;\r\n\r\n return str + w;\r\n}\r\n\r\n\r\nfunction checkInt32(i, min, max) {\r\n if (i !== ~~i || i < min || i > max) {\r\n throw Error(invalidArgument + i);\r\n }\r\n}\r\n\r\n\r\n/*\r\n * Check 5 rounding digits if `repeating` is null, 4 otherwise.\r\n * `repeating == null` if caller is `log` or `pow`,\r\n * `repeating != null` if caller is `naturalLogarithm` or `naturalExponential`.\r\n */\r\nfunction checkRoundingDigits(d, i, rm, repeating) {\r\n var di, k, r, rd;\r\n\r\n // Get the length of the first word of the array d.\r\n for (k = d[0]; k >= 10; k /= 10) --i;\r\n\r\n // Is the rounding digit in the first word of d?\r\n if (--i < 0) {\r\n i += LOG_BASE;\r\n di = 0;\r\n } else {\r\n di = Math.ceil((i + 1) / LOG_BASE);\r\n i %= LOG_BASE;\r\n }\r\n\r\n // i is the index (0 - 6) of the rounding digit.\r\n // E.g. if within the word 3487563 the first rounding digit is 5,\r\n // then i = 4, k = 1000, rd = 3487563 % 1000 = 563\r\n k = mathpow(10, LOG_BASE - i);\r\n rd = d[di] % k | 0;\r\n\r\n if (repeating == null) {\r\n if (i < 3) {\r\n if (i == 0) rd = rd / 100 | 0;\r\n else if (i == 1) rd = rd / 10 | 0;\r\n r = rm < 4 && rd == 99999 || rm > 3 && rd == 49999 || rd == 50000 || rd == 0;\r\n } else {\r\n r = (rm < 4 && rd + 1 == k || rm > 3 && rd + 1 == k / 2) &&\r\n (d[di + 1] / k / 100 | 0) == mathpow(10, i - 2) - 1 ||\r\n (rd == k / 2 || rd == 0) && (d[di + 1] / k / 100 | 0) == 0;\r\n }\r\n } else {\r\n if (i < 4) {\r\n if (i == 0) rd = rd / 1000 | 0;\r\n else if (i == 1) rd = rd / 100 | 0;\r\n else if (i == 2) rd = rd / 10 | 0;\r\n r = (repeating || rm < 4) && rd == 9999 || !repeating && rm > 3 && rd == 4999;\r\n } else {\r\n r = ((repeating || rm < 4) && rd + 1 == k ||\r\n (!repeating && rm > 3) && rd + 1 == k / 2) &&\r\n (d[di + 1] / k / 1000 | 0) == mathpow(10, i - 3) - 1;\r\n }\r\n }\r\n\r\n return r;\r\n}\r\n\r\n\r\n// Convert string of `baseIn` to an array of numbers of `baseOut`.\r\n// Eg. convertBase('255', 10, 16) returns [15, 15].\r\n// Eg. convertBase('ff', 16, 10) returns [2, 5, 5].\r\nfunction convertBase(str, baseIn, baseOut) {\r\n var j,\r\n arr = [0],\r\n arrL,\r\n i = 0,\r\n strL = str.length;\r\n\r\n for (; i < strL;) {\r\n for (arrL = arr.length; arrL--;) arr[arrL] *= baseIn;\r\n arr[0] += NUMERALS.indexOf(str.charAt(i++));\r\n for (j = 0; j < arr.length; j++) {\r\n if (arr[j] > baseOut - 1) {\r\n if (arr[j + 1] === void 0) arr[j + 1] = 0;\r\n arr[j + 1] += arr[j] / baseOut | 0;\r\n arr[j] %= baseOut;\r\n }\r\n }\r\n }\r\n\r\n return arr.reverse();\r\n}\r\n\r\n\r\n/*\r\n * cos(x) = 1 - x^2/2! + x^4/4! - ...\r\n * |x| < pi/2\r\n *\r\n */\r\nfunction cosine(Ctor, x) {\r\n var k, len, y;\r\n\r\n if (x.isZero()) return x;\r\n\r\n // Argument reduction: cos(4x) = 8*(cos^4(x) - cos^2(x)) + 1\r\n // i.e. cos(x) = 8*(cos^4(x/4) - cos^2(x/4)) + 1\r\n\r\n // Estimate the optimum number of times to use the argument reduction.\r\n len = x.d.length;\r\n if (len < 32) {\r\n k = Math.ceil(len / 3);\r\n y = (1 / tinyPow(4, k)).toString();\r\n } else {\r\n k = 16;\r\n y = '2.3283064365386962890625e-10';\r\n }\r\n\r\n Ctor.precision += k;\r\n\r\n x = taylorSeries(Ctor, 1, x.times(y), new Ctor(1));\r\n\r\n // Reverse argument reduction\r\n for (var i = k; i--;) {\r\n var cos2x = x.times(x);\r\n x = cos2x.times(cos2x).minus(cos2x).times(8).plus(1);\r\n }\r\n\r\n Ctor.precision -= k;\r\n\r\n return x;\r\n}\r\n\r\n\r\n/*\r\n * Perform division in the specified base.\r\n */\r\nvar divide = (function () {\r\n\r\n // Assumes non-zero x and k, and hence non-zero result.\r\n function multiplyInteger(x, k, base) {\r\n var temp,\r\n carry = 0,\r\n i = x.length;\r\n\r\n for (x = x.slice(); i--;) {\r\n temp = x[i] * k + carry;\r\n x[i] = temp % base | 0;\r\n carry = temp / base | 0;\r\n }\r\n\r\n if (carry) x.unshift(carry);\r\n\r\n return x;\r\n }\r\n\r\n function compare(a, b, aL, bL) {\r\n var i, r;\r\n\r\n if (aL != bL) {\r\n r = aL > bL ? 1 : -1;\r\n } else {\r\n for (i = r = 0; i < aL; i++) {\r\n if (a[i] != b[i]) {\r\n r = a[i] > b[i] ? 1 : -1;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return r;\r\n }\r\n\r\n function subtract(a, b, aL, base) {\r\n var i = 0;\r\n\r\n // Subtract b from a.\r\n for (; aL--;) {\r\n a[aL] -= i;\r\n i = a[aL] < b[aL] ? 1 : 0;\r\n a[aL] = i * base + a[aL] - b[aL];\r\n }\r\n\r\n // Remove leading zeros.\r\n for (; !a[0] && a.length > 1;) a.shift();\r\n }\r\n\r\n return function (x, y, pr, rm, dp, base) {\r\n var cmp, e, i, k, logBase, more, prod, prodL, q, qd, rem, remL, rem0, sd, t, xi, xL, yd0,\r\n yL, yz,\r\n Ctor = x.constructor,\r\n sign = x.s == y.s ? 1 : -1,\r\n xd = x.d,\r\n yd = y.d;\r\n\r\n // Either NaN, Infinity or 0?\r\n if (!xd || !xd[0] || !yd || !yd[0]) {\r\n\r\n return new Ctor(// Return NaN if either NaN, or both Infinity or 0.\r\n !x.s || !y.s || (xd ? yd && xd[0] == yd[0] : !yd) ? NaN :\r\n\r\n // Return ±0 if x is 0 or y is ±Infinity, or return ±Infinity as y is 0.\r\n xd && xd[0] == 0 || !yd ? sign * 0 : sign / 0);\r\n }\r\n\r\n if (base) {\r\n logBase = 1;\r\n e = x.e - y.e;\r\n } else {\r\n base = BASE;\r\n logBase = LOG_BASE;\r\n e = mathfloor(x.e / logBase) - mathfloor(y.e / logBase);\r\n }\r\n\r\n yL = yd.length;\r\n xL = xd.length;\r\n q = new Ctor(sign);\r\n qd = q.d = [];\r\n\r\n // Result exponent may be one less than e.\r\n // The digit array of a Decimal from toStringBinary may have trailing zeros.\r\n for (i = 0; yd[i] == (xd[i] || 0); i++);\r\n\r\n if (yd[i] > (xd[i] || 0)) e--;\r\n\r\n if (pr == null) {\r\n sd = pr = Ctor.precision;\r\n rm = Ctor.rounding;\r\n } else if (dp) {\r\n sd = pr + (x.e - y.e) + 1;\r\n } else {\r\n sd = pr;\r\n }\r\n\r\n if (sd < 0) {\r\n qd.push(1);\r\n more = true;\r\n } else {\r\n\r\n // Convert precision in number of base 10 digits to base 1e7 digits.\r\n sd = sd / logBase + 2 | 0;\r\n i = 0;\r\n\r\n // divisor < 1e7\r\n if (yL == 1) {\r\n k = 0;\r\n yd = yd[0];\r\n sd++;\r\n\r\n // k is the carry.\r\n for (; (i < xL || k) && sd--; i++) {\r\n t = k * base + (xd[i] || 0);\r\n qd[i] = t / yd | 0;\r\n k = t % yd | 0;\r\n }\r\n\r\n more = k || i < xL;\r\n\r\n // divisor >= 1e7\r\n } else {\r\n\r\n // Normalise xd and yd so highest order digit of yd is >= base/2\r\n k = base / (yd[0] + 1) | 0;\r\n\r\n if (k > 1) {\r\n yd = multiplyInteger(yd, k, base);\r\n xd = multiplyInteger(xd, k, base);\r\n yL = yd.length;\r\n xL = xd.length;\r\n }\r\n\r\n xi = yL;\r\n rem = xd.slice(0, yL);\r\n remL = rem.length;\r\n\r\n // Add zeros to make remainder as long as divisor.\r\n for (; remL < yL;) rem[remL++] = 0;\r\n\r\n yz = yd.slice();\r\n yz.unshift(0);\r\n yd0 = yd[0];\r\n\r\n if (yd[1] >= base / 2) ++yd0;\r\n\r\n do {\r\n k = 0;\r\n\r\n // Compare divisor and remainder.\r\n cmp = compare(yd, rem, yL, remL);\r\n\r\n // If divisor < remainder.\r\n if (cmp < 0) {\r\n\r\n // Calculate trial digit, k.\r\n rem0 = rem[0];\r\n if (yL != remL) rem0 = rem0 * base + (rem[1] || 0);\r\n\r\n // k will be how many times the divisor goes into the current remainder.\r\n k = rem0 / yd0 | 0;\r\n\r\n // Algorithm:\r\n // 1. product = divisor * trial digit (k)\r\n // 2. if product > remainder: product -= divisor, k--\r\n // 3. remainder -= product\r\n // 4. if product was < remainder at 2:\r\n // 5. compare new remainder and divisor\r\n // 6. If remainder > divisor: remainder -= divisor, k++\r\n\r\n if (k > 1) {\r\n if (k >= base) k = base - 1;\r\n\r\n // product = divisor * trial digit.\r\n prod = multiplyInteger(yd, k, base);\r\n prodL = prod.length;\r\n remL = rem.length;\r\n\r\n // Compare product and remainder.\r\n cmp = compare(prod, rem, prodL, remL);\r\n\r\n // product > remainder.\r\n if (cmp == 1) {\r\n k--;\r\n\r\n // Subtract divisor from product.\r\n subtract(prod, yL < prodL ? yz : yd, prodL, base);\r\n }\r\n } else {\r\n\r\n // cmp is -1.\r\n // If k is 0, there is no need to compare yd and rem again below, so change cmp to 1\r\n // to avoid it. If k is 1 there is a need to compare yd and rem again below.\r\n if (k == 0) cmp = k = 1;\r\n prod = yd.slice();\r\n }\r\n\r\n prodL = prod.length;\r\n if (prodL < remL) prod.unshift(0);\r\n\r\n // Subtract product from remainder.\r\n subtract(rem, prod, remL, base);\r\n\r\n // If product was < previous remainder.\r\n if (cmp == -1) {\r\n remL = rem.length;\r\n\r\n // Compare divisor and new remainder.\r\n cmp = compare(yd, rem, yL, remL);\r\n\r\n // If divisor < new remainder, subtract divisor from remainder.\r\n if (cmp < 1) {\r\n k++;\r\n\r\n // Subtract divisor from remainder.\r\n subtract(rem, yL < remL ? yz : yd, remL, base);\r\n }\r\n }\r\n\r\n remL = rem.length;\r\n } else if (cmp === 0) {\r\n k++;\r\n rem = [0];\r\n } // if cmp === 1, k will be 0\r\n\r\n // Add the next digit, k, to the result array.\r\n qd[i++] = k;\r\n\r\n // Update the remainder.\r\n if (cmp && rem[0]) {\r\n rem[remL++] = xd[xi] || 0;\r\n } else {\r\n rem = [xd[xi]];\r\n remL = 1;\r\n }\r\n\r\n } while ((xi++ < xL || rem[0] !== void 0) && sd--);\r\n\r\n more = rem[0] !== void 0;\r\n }\r\n\r\n // Leading zero?\r\n if (!qd[0]) qd.shift();\r\n }\r\n\r\n // logBase is 1 when divide is being used for base conversion.\r\n if (logBase == 1) {\r\n q.e = e;\r\n inexact = more;\r\n } else {\r\n\r\n // To calculate q.e, first get the number of digits of qd[0].\r\n for (i = 1, k = qd[0]; k >= 10; k /= 10) i++;\r\n q.e = i + e * logBase - 1;\r\n\r\n finalise(q, dp ? pr + q.e + 1 : pr, rm, more);\r\n }\r\n\r\n return q;\r\n };\r\n})();\r\n\r\n\r\n/*\r\n * Round `x` to `sd` significant digits using rounding mode `rm`.\r\n * Check for over/under-flow.\r\n */\r\n function finalise(x, sd, rm, isTruncated) {\r\n var digits, i, j, k, rd, roundUp, w, xd, xdi,\r\n Ctor = x.constructor;\r\n\r\n // Don't round if sd is null or undefined.\r\n out: if (sd != null) {\r\n xd = x.d;\r\n\r\n // Infinity/NaN.\r\n if (!xd) return x;\r\n\r\n // rd: the rounding digit, i.e. the digit after the digit that may be rounded up.\r\n // w: the word of xd containing rd, a base 1e7 number.\r\n // xdi: the index of w within xd.\r\n // digits: the number of digits of w.\r\n // i: what would be the index of rd within w if all the numbers were 7 digits long (i.e. if\r\n // they had leading zeros)\r\n // j: if > 0, the actual index of rd within w (if < 0, rd is a leading zero).\r\n\r\n // Get the length of the first word of the digits array xd.\r\n for (digits = 1, k = xd[0]; k >= 10; k /= 10) digits++;\r\n i = sd - digits;\r\n\r\n // Is the rounding digit in the first word of xd?\r\n if (i < 0) {\r\n i += LOG_BASE;\r\n j = sd;\r\n w = xd[xdi = 0];\r\n\r\n // Get the rounding digit at index j of w.\r\n rd = w / mathpow(10, digits - j - 1) % 10 | 0;\r\n } else {\r\n xdi = Math.ceil((i + 1) / LOG_BASE);\r\n k = xd.length;\r\n if (xdi >= k) {\r\n if (isTruncated) {\r\n\r\n // Needed by `naturalExponential`, `naturalLogarithm` and `squareRoot`.\r\n for (; k++ <= xdi;) xd.push(0);\r\n w = rd = 0;\r\n digits = 1;\r\n i %= LOG_BASE;\r\n j = i - LOG_BASE + 1;\r\n } else {\r\n break out;\r\n }\r\n } else {\r\n w = k = xd[xdi];\r\n\r\n // Get the number of digits of w.\r\n for (digits = 1; k >= 10; k /= 10) digits++;\r\n\r\n // Get the index of rd within w.\r\n i %= LOG_BASE;\r\n\r\n // Get the index of rd within w, adjusted for leading zeros.\r\n // The number of leading zeros of w is given by LOG_BASE - digits.\r\n j = i - LOG_BASE + digits;\r\n\r\n // Get the rounding digit at index j of w.\r\n rd = j < 0 ? 0 : w / mathpow(10, digits - j - 1) % 10 | 0;\r\n }\r\n }\r\n\r\n // Are there any non-zero digits after the rounding digit?\r\n isTruncated = isTruncated || sd < 0 ||\r\n xd[xdi + 1] !== void 0 || (j < 0 ? w : w % mathpow(10, digits - j - 1));\r\n\r\n // The expression `w % mathpow(10, digits - j - 1)` returns all the digits of w to the right\r\n // of the digit at (left-to-right) index j, e.g. if w is 908714 and j is 2, the expression\r\n // will give 714.\r\n\r\n roundUp = rm < 4\r\n ? (rd || isTruncated) && (rm == 0 || rm == (x.s < 0 ? 3 : 2))\r\n : rd > 5 || rd == 5 && (rm == 4 || isTruncated || rm == 6 &&\r\n\r\n // Check whether the digit to the left of the rounding digit is odd.\r\n ((i > 0 ? j > 0 ? w / mathpow(10, digits - j) : 0 : xd[xdi - 1]) % 10) & 1 ||\r\n rm == (x.s < 0 ? 8 : 7));\r\n\r\n if (sd < 1 || !xd[0]) {\r\n xd.length = 0;\r\n if (roundUp) {\r\n\r\n // Convert sd to decimal places.\r\n sd -= x.e + 1;\r\n\r\n // 1, 0.1, 0.01, 0.001, 0.0001 etc.\r\n xd[0] = mathpow(10, (LOG_BASE - sd % LOG_BASE) % LOG_BASE);\r\n x.e = -sd || 0;\r\n } else {\r\n\r\n // Zero.\r\n xd[0] = x.e = 0;\r\n }\r\n\r\n return x;\r\n }\r\n\r\n // Remove excess digits.\r\n if (i == 0) {\r\n xd.length = xdi;\r\n k = 1;\r\n xdi--;\r\n } else {\r\n xd.length = xdi + 1;\r\n k = mathpow(10, LOG_BASE - i);\r\n\r\n // E.g. 56700 becomes 56000 if 7 is the rounding digit.\r\n // j > 0 means i > number of leading zeros of w.\r\n xd[xdi] = j > 0 ? (w / mathpow(10, digits - j) % mathpow(10, j) | 0) * k : 0;\r\n }\r\n\r\n if (roundUp) {\r\n for (;;) {\r\n\r\n // Is the digit to be rounded up in the first word of xd?\r\n if (xdi == 0) {\r\n\r\n // i will be the length of xd[0] before k is added.\r\n for (i = 1, j = xd[0]; j >= 10; j /= 10) i++;\r\n j = xd[0] += k;\r\n for (k = 1; j >= 10; j /= 10) k++;\r\n\r\n // if i != k the length has increased.\r\n if (i != k) {\r\n x.e++;\r\n if (xd[0] == BASE) xd[0] = 1;\r\n }\r\n\r\n break;\r\n } else {\r\n xd[xdi] += k;\r\n if (xd[xdi] != BASE) break;\r\n xd[xdi--] = 0;\r\n k = 1;\r\n }\r\n }\r\n }\r\n\r\n // Remove trailing zeros.\r\n for (i = xd.length; xd[--i] === 0;) xd.pop();\r\n }\r\n\r\n if (external) {\r\n\r\n // Overflow?\r\n if (x.e > Ctor.maxE) {\r\n\r\n // Infinity.\r\n x.d = null;\r\n x.e = NaN;\r\n\r\n // Underflow?\r\n } else if (x.e < Ctor.minE) {\r\n\r\n // Zero.\r\n x.e = 0;\r\n x.d = [0];\r\n // Ctor.underflow = true;\r\n } // else Ctor.underflow = false;\r\n }\r\n\r\n return x;\r\n}\r\n\r\n\r\nfunction finiteToString(x, isExp, sd) {\r\n if (!x.isFinite()) return nonFiniteToString(x);\r\n var k,\r\n e = x.e,\r\n str = digitsToString(x.d),\r\n len = str.length;\r\n\r\n if (isExp) {\r\n if (sd && (k = sd - len) > 0) {\r\n str = str.charAt(0) + '.' + str.slice(1) + getZeroString(k);\r\n } else if (len > 1) {\r\n str = str.charAt(0) + '.' + str.slice(1);\r\n }\r\n\r\n str = str + (x.e < 0 ? 'e' : 'e+') + x.e;\r\n } else if (e < 0) {\r\n str = '0.' + getZeroString(-e - 1) + str;\r\n if (sd && (k = sd - len) > 0) str += getZeroString(k);\r\n } else if (e >= len) {\r\n str += getZeroString(e + 1 - len);\r\n if (sd && (k = sd - e - 1) > 0) str = str + '.' + getZeroString(k);\r\n } else {\r\n if ((k = e + 1) < len) str = str.slice(0, k) + '.' + str.slice(k);\r\n if (sd && (k = sd - len) > 0) {\r\n if (e + 1 === len) str += '.';\r\n str += getZeroString(k);\r\n }\r\n }\r\n\r\n return str;\r\n}\r\n\r\n\r\n// Calculate the base 10 exponent from the base 1e7 exponent.\r\nfunction getBase10Exponent(digits, e) {\r\n var w = digits[0];\r\n\r\n // Add the number of digits of the first word of the digits array.\r\n for ( e *= LOG_BASE; w >= 10; w /= 10) e++;\r\n return e;\r\n}\r\n\r\n\r\nfunction getLn10(Ctor, sd, pr) {\r\n if (sd > LN10_PRECISION) {\r\n\r\n // Reset global state in case the exception is caught.\r\n external = true;\r\n if (pr) Ctor.precision = pr;\r\n throw Error(precisionLimitExceeded);\r\n }\r\n return finalise(new Ctor(LN10), sd, 1, true);\r\n}\r\n\r\n\r\nfunction getPi(Ctor, sd, rm) {\r\n if (sd > PI_PRECISION) throw Error(precisionLimitExceeded);\r\n return finalise(new Ctor(PI), sd, rm, true);\r\n}\r\n\r\n\r\nfunction getPrecision(digits) {\r\n var w = digits.length - 1,\r\n len = w * LOG_BASE + 1;\r\n\r\n w = digits[w];\r\n\r\n // If non-zero...\r\n if (w) {\r\n\r\n // Subtract the number of trailing zeros of the last word.\r\n for (; w % 10 == 0; w /= 10) len--;\r\n\r\n // Add the number of digits of the first word.\r\n for (w = digits[0]; w >= 10; w /= 10) len++;\r\n }\r\n\r\n return len;\r\n}\r\n\r\n\r\nfunction getZeroString(k) {\r\n var zs = '';\r\n for (; k--;) zs += '0';\r\n return zs;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the value of Decimal `x` to the power `n`, where `n` is an\r\n * integer of type number.\r\n *\r\n * Implements 'exponentiation by squaring'. Called by `pow` and `parseOther`.\r\n *\r\n */\r\nfunction intPow(Ctor, x, n, pr) {\r\n var isTruncated,\r\n r = new Ctor(1),\r\n\r\n // Max n of 9007199254740991 takes 53 loop iterations.\r\n // Maximum digits array length; leaves [28, 34] guard digits.\r\n k = Math.ceil(pr / LOG_BASE + 4);\r\n\r\n external = false;\r\n\r\n for (;;) {\r\n if (n % 2) {\r\n r = r.times(x);\r\n if (truncate(r.d, k)) isTruncated = true;\r\n }\r\n\r\n n = mathfloor(n / 2);\r\n if (n === 0) {\r\n\r\n // To ensure correct rounding when r.d is truncated, increment the last word if it is zero.\r\n n = r.d.length - 1;\r\n if (isTruncated && r.d[n] === 0) ++r.d[n];\r\n break;\r\n }\r\n\r\n x = x.times(x);\r\n truncate(x.d, k);\r\n }\r\n\r\n external = true;\r\n\r\n return r;\r\n}\r\n\r\n\r\nfunction isOdd(n) {\r\n return n.d[n.d.length - 1] & 1;\r\n}\r\n\r\n\r\n/*\r\n * Handle `max` and `min`. `ltgt` is 'lt' or 'gt'.\r\n */\r\nfunction maxOrMin(Ctor, args, ltgt) {\r\n var y,\r\n x = new Ctor(args[0]),\r\n i = 0;\r\n\r\n for (; ++i < args.length;) {\r\n y = new Ctor(args[i]);\r\n if (!y.s) {\r\n x = y;\r\n break;\r\n } else if (x[ltgt](y)) {\r\n x = y;\r\n }\r\n }\r\n\r\n return x;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the natural exponential of `x` rounded to `sd` significant\r\n * digits.\r\n *\r\n * Taylor/Maclaurin series.\r\n *\r\n * exp(x) = x^0/0! + x^1/1! + x^2/2! + x^3/3! + ...\r\n *\r\n * Argument reduction:\r\n * Repeat x = x / 32, k += 5, until |x| < 0.1\r\n * exp(x) = exp(x / 2^k)^(2^k)\r\n *\r\n * Previously, the argument was initially reduced by\r\n * exp(x) = exp(r) * 10^k where r = x - k * ln10, k = floor(x / ln10)\r\n * to first put r in the range [0, ln10], before dividing by 32 until |x| < 0.1, but this was\r\n * found to be slower than just dividing repeatedly by 32 as above.\r\n *\r\n * Max integer argument: exp('20723265836946413') = 6.3e+9000000000000000\r\n * Min integer argument: exp('-20723265836946411') = 1.2e-9000000000000000\r\n * (Math object integer min/max: Math.exp(709) = 8.2e+307, Math.exp(-745) = 5e-324)\r\n *\r\n * exp(Infinity) = Infinity\r\n * exp(-Infinity) = 0\r\n * exp(NaN) = NaN\r\n * exp(±0) = 1\r\n *\r\n * exp(x) is non-terminating for any finite, non-zero x.\r\n *\r\n * The result will always be correctly rounded.\r\n *\r\n */\r\nfunction naturalExponential(x, sd) {\r\n var denominator, guard, j, pow, sum, t, wpr,\r\n rep = 0,\r\n i = 0,\r\n k = 0,\r\n Ctor = x.constructor,\r\n rm = Ctor.rounding,\r\n pr = Ctor.precision;\r\n\r\n // 0/NaN/Infinity?\r\n if (!x.d || !x.d[0] || x.e > 17) {\r\n\r\n return new Ctor(x.d\r\n ? !x.d[0] ? 1 : x.s < 0 ? 0 : 1 / 0\r\n : x.s ? x.s < 0 ? 0 : x : 0 / 0);\r\n }\r\n\r\n if (sd == null) {\r\n external = false;\r\n wpr = pr;\r\n } else {\r\n wpr = sd;\r\n }\r\n\r\n t = new Ctor(0.03125);\r\n\r\n // while abs(x) >= 0.1\r\n while (x.e > -2) {\r\n\r\n // x = x / 2^5\r\n x = x.times(t);\r\n k += 5;\r\n }\r\n\r\n // Use 2 * log10(2^k) + 5 (empirically derived) to estimate the increase in precision\r\n // necessary to ensure the first 4 rounding digits are correct.\r\n guard = Math.log(mathpow(2, k)) / Math.LN10 * 2 + 5 | 0;\r\n wpr += guard;\r\n denominator = pow = sum = new Ctor(1);\r\n Ctor.precision = wpr;\r\n\r\n for (;;) {\r\n pow = finalise(pow.times(x), wpr, 1);\r\n denominator = denominator.times(++i);\r\n t = sum.plus(divide(pow, denominator, wpr, 1));\r\n\r\n if (digitsToString(t.d).slice(0, wpr) === digitsToString(sum.d).slice(0, wpr)) {\r\n j = k;\r\n while (j--) sum = finalise(sum.times(sum), wpr, 1);\r\n\r\n // Check to see if the first 4 rounding digits are [49]999.\r\n // If so, repeat the summation with a higher precision, otherwise\r\n // e.g. with precision: 18, rounding: 1\r\n // exp(18.404272462595034083567793919843761) = 98372560.1229999999 (should be 98372560.123)\r\n // `wpr - guard` is the index of first rounding digit.\r\n if (sd == null) {\r\n\r\n if (rep < 3 && checkRoundingDigits(sum.d, wpr - guard, rm, rep)) {\r\n Ctor.precision = wpr += 10;\r\n denominator = pow = t = new Ctor(1);\r\n i = 0;\r\n rep++;\r\n } else {\r\n return finalise(sum, Ctor.precision = pr, rm, external = true);\r\n }\r\n } else {\r\n Ctor.precision = pr;\r\n return sum;\r\n }\r\n }\r\n\r\n sum = t;\r\n }\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the natural logarithm of `x` rounded to `sd` significant\r\n * digits.\r\n *\r\n * ln(-n) = NaN\r\n * ln(0) = -Infinity\r\n * ln(-0) = -Infinity\r\n * ln(1) = 0\r\n * ln(Infinity) = Infinity\r\n * ln(-Infinity) = NaN\r\n * ln(NaN) = NaN\r\n *\r\n * ln(n) (n != 1) is non-terminating.\r\n *\r\n */\r\nfunction naturalLogarithm(y, sd) {\r\n var c, c0, denominator, e, numerator, rep, sum, t, wpr, x1, x2,\r\n n = 1,\r\n guard = 10,\r\n x = y,\r\n xd = x.d,\r\n Ctor = x.constructor,\r\n rm = Ctor.rounding,\r\n pr = Ctor.precision;\r\n\r\n // Is x negative or Infinity, NaN, 0 or 1?\r\n if (x.s < 0 || !xd || !xd[0] || !x.e && xd[0] == 1 && xd.length == 1) {\r\n return new Ctor(xd && !xd[0] ? -1 / 0 : x.s != 1 ? NaN : xd ? 0 : x);\r\n }\r\n\r\n if (sd == null) {\r\n external = false;\r\n wpr = pr;\r\n } else {\r\n wpr = sd;\r\n }\r\n\r\n Ctor.precision = wpr += guard;\r\n c = digitsToString(xd);\r\n c0 = c.charAt(0);\r\n\r\n if (Math.abs(e = x.e) < 1.5e15) {\r\n\r\n // Argument reduction.\r\n // The series converges faster the closer the argument is to 1, so using\r\n // ln(a^b) = b * ln(a), ln(a) = ln(a^b) / b\r\n // multiply the argument by itself until the leading digits of the significand are 7, 8, 9,\r\n // 10, 11, 12 or 13, recording the number of multiplications so the sum of the series can\r\n // later be divided by this number, then separate out the power of 10 using\r\n // ln(a*10^b) = ln(a) + b*ln(10).\r\n\r\n // max n is 21 (gives 0.9, 1.0 or 1.1) (9e15 / 21 = 4.2e14).\r\n //while (c0 < 9 && c0 != 1 || c0 == 1 && c.charAt(1) > 1) {\r\n // max n is 6 (gives 0.7 - 1.3)\r\n while (c0 < 7 && c0 != 1 || c0 == 1 && c.charAt(1) > 3) {\r\n x = x.times(y);\r\n c = digitsToString(x.d);\r\n c0 = c.charAt(0);\r\n n++;\r\n }\r\n\r\n e = x.e;\r\n\r\n if (c0 > 1) {\r\n x = new Ctor('0.' + c);\r\n e++;\r\n } else {\r\n x = new Ctor(c0 + '.' + c.slice(1));\r\n }\r\n } else {\r\n\r\n // The argument reduction method above may result in overflow if the argument y is a massive\r\n // number with exponent >= 1500000000000000 (9e15 / 6 = 1.5e15), so instead recall this\r\n // function using ln(x*10^e) = ln(x) + e*ln(10).\r\n t = getLn10(Ctor, wpr + 2, pr).times(e + '');\r\n x = naturalLogarithm(new Ctor(c0 + '.' + c.slice(1)), wpr - guard).plus(t);\r\n Ctor.precision = pr;\r\n\r\n return sd == null ? finalise(x, pr, rm, external = true) : x;\r\n }\r\n\r\n // x1 is x reduced to a value near 1.\r\n x1 = x;\r\n\r\n // Taylor series.\r\n // ln(y) = ln((1 + x)/(1 - x)) = 2(x + x^3/3 + x^5/5 + x^7/7 + ...)\r\n // where x = (y - 1)/(y + 1) (|x| < 1)\r\n sum = numerator = x = divide(x.minus(1), x.plus(1), wpr, 1);\r\n x2 = finalise(x.times(x), wpr, 1);\r\n denominator = 3;\r\n\r\n for (;;) {\r\n numerator = finalise(numerator.times(x2), wpr, 1);\r\n t = sum.plus(divide(numerator, new Ctor(denominator), wpr, 1));\r\n\r\n if (digitsToString(t.d).slice(0, wpr) === digitsToString(sum.d).slice(0, wpr)) {\r\n sum = sum.times(2);\r\n\r\n // Reverse the argument reduction. Check that e is not 0 because, besides preventing an\r\n // unnecessary calculation, -0 + 0 = +0 and to ensure correct rounding -0 needs to stay -0.\r\n if (e !== 0) sum = sum.plus(getLn10(Ctor, wpr + 2, pr).times(e + ''));\r\n sum = divide(sum, new Ctor(n), wpr, 1);\r\n\r\n // Is rm > 3 and the first 4 rounding digits 4999, or rm < 4 (or the summation has\r\n // been repeated previously) and the first 4 rounding digits 9999?\r\n // If so, restart the summation with a higher precision, otherwise\r\n // e.g. with precision: 12, rounding: 1\r\n // ln(135520028.6126091714265381533) = 18.7246299999 when it should be 18.72463.\r\n // `wpr - guard` is the index of first rounding digit.\r\n if (sd == null) {\r\n if (checkRoundingDigits(sum.d, wpr - guard, rm, rep)) {\r\n Ctor.precision = wpr += guard;\r\n t = numerator = x = divide(x1.minus(1), x1.plus(1), wpr, 1);\r\n x2 = finalise(x.times(x), wpr, 1);\r\n denominator = rep = 1;\r\n } else {\r\n return finalise(sum, Ctor.precision = pr, rm, external = true);\r\n }\r\n } else {\r\n Ctor.precision = pr;\r\n return sum;\r\n }\r\n }\r\n\r\n sum = t;\r\n denominator += 2;\r\n }\r\n}\r\n\r\n\r\n// ±Infinity, NaN.\r\nfunction nonFiniteToString(x) {\r\n // Unsigned.\r\n return String(x.s * x.s / 0);\r\n}\r\n\r\n\r\n/*\r\n * Parse the value of a new Decimal `x` from string `str`.\r\n */\r\nfunction parseDecimal(x, str) {\r\n var e, i, len;\r\n\r\n // Decimal point?\r\n if ((e = str.indexOf('.')) > -1) str = str.replace('.', '');\r\n\r\n // Exponential form?\r\n if ((i = str.search(/e/i)) > 0) {\r\n\r\n // Determine exponent.\r\n if (e < 0) e = i;\r\n e += +str.slice(i + 1);\r\n str = str.substring(0, i);\r\n } else if (e < 0) {\r\n\r\n // Integer.\r\n e = str.length;\r\n }\r\n\r\n // Determine leading zeros.\r\n for (i = 0; str.charCodeAt(i) === 48; i++);\r\n\r\n // Determine trailing zeros.\r\n for (len = str.length; str.charCodeAt(len - 1) === 48; --len);\r\n str = str.slice(i, len);\r\n\r\n if (str) {\r\n len -= i;\r\n x.e = e = e - i - 1;\r\n x.d = [];\r\n\r\n // Transform base\r\n\r\n // e is the base 10 exponent.\r\n // i is where to slice str to get the first word of the digits array.\r\n i = (e + 1) % LOG_BASE;\r\n if (e < 0) i += LOG_BASE;\r\n\r\n if (i < len) {\r\n if (i) x.d.push(+str.slice(0, i));\r\n for (len -= LOG_BASE; i < len;) x.d.push(+str.slice(i, i += LOG_BASE));\r\n str = str.slice(i);\r\n i = LOG_BASE - str.length;\r\n } else {\r\n i -= len;\r\n }\r\n\r\n for (; i--;) str += '0';\r\n x.d.push(+str);\r\n\r\n if (external) {\r\n\r\n // Overflow?\r\n if (x.e > x.constructor.maxE) {\r\n\r\n // Infinity.\r\n x.d = null;\r\n x.e = NaN;\r\n\r\n // Underflow?\r\n } else if (x.e < x.constructor.minE) {\r\n\r\n // Zero.\r\n x.e = 0;\r\n x.d = [0];\r\n // x.constructor.underflow = true;\r\n } // else x.constructor.underflow = false;\r\n }\r\n } else {\r\n\r\n // Zero.\r\n x.e = 0;\r\n x.d = [0];\r\n }\r\n\r\n return x;\r\n}\r\n\r\n\r\n/*\r\n * Parse the value of a new Decimal `x` from a string `str`, which is not a decimal value.\r\n */\r\nfunction parseOther(x, str) {\r\n var base, Ctor, divisor, i, isFloat, len, p, xd, xe;\r\n\r\n if (str.indexOf('_') > -1) {\r\n str = str.replace(/(\\d)_(?=\\d)/g, '$1');\r\n if (isDecimal.test(str)) return parseDecimal(x, str);\r\n } else if (str === 'Infinity' || str === 'NaN') {\r\n if (!+str) x.s = NaN;\r\n x.e = NaN;\r\n x.d = null;\r\n return x;\r\n }\r\n\r\n if (isHex.test(str)) {\r\n base = 16;\r\n str = str.toLowerCase();\r\n } else if (isBinary.test(str)) {\r\n base = 2;\r\n } else if (isOctal.test(str)) {\r\n base = 8;\r\n } else {\r\n throw Error(invalidArgument + str);\r\n }\r\n\r\n // Is there a binary exponent part?\r\n i = str.search(/p/i);\r\n\r\n if (i > 0) {\r\n p = +str.slice(i + 1);\r\n str = str.substring(2, i);\r\n } else {\r\n str = str.slice(2);\r\n }\r\n\r\n // Convert `str` as an integer then divide the result by `base` raised to a power such that the\r\n // fraction part will be restored.\r\n i = str.indexOf('.');\r\n isFloat = i >= 0;\r\n Ctor = x.constructor;\r\n\r\n if (isFloat) {\r\n str = str.replace('.', '');\r\n len = str.length;\r\n i = len - i;\r\n\r\n // log[10](16) = 1.2041... , log[10](88) = 1.9444....\r\n divisor = intPow(Ctor, new Ctor(base), i, i * 2);\r\n }\r\n\r\n xd = convertBase(str, base, BASE);\r\n xe = xd.length - 1;\r\n\r\n // Remove trailing zeros.\r\n for (i = xe; xd[i] === 0; --i) xd.pop();\r\n if (i < 0) return new Ctor(x.s * 0);\r\n x.e = getBase10Exponent(xd, xe);\r\n x.d = xd;\r\n external = false;\r\n\r\n // At what precision to perform the division to ensure exact conversion?\r\n // maxDecimalIntegerPartDigitCount = ceil(log[10](b) * otherBaseIntegerPartDigitCount)\r\n // log[10](2) = 0.30103, log[10](8) = 0.90309, log[10](16) = 1.20412\r\n // E.g. ceil(1.2 * 3) = 4, so up to 4 decimal digits are needed to represent 3 hex int digits.\r\n // maxDecimalFractionPartDigitCount = {Hex:4|Oct:3|Bin:1} * otherBaseFractionPartDigitCount\r\n // Therefore using 4 * the number of digits of str will always be enough.\r\n if (isFloat) x = divide(x, divisor, len * 4);\r\n\r\n // Multiply by the binary exponent part if present.\r\n if (p) x = x.times(Math.abs(p) < 54 ? mathpow(2, p) : Decimal.pow(2, p));\r\n external = true;\r\n\r\n return x;\r\n}\r\n\r\n\r\n/*\r\n * sin(x) = x - x^3/3! + x^5/5! - ...\r\n * |x| < pi/2\r\n *\r\n */\r\nfunction sine(Ctor, x) {\r\n var k,\r\n len = x.d.length;\r\n\r\n if (len < 3) {\r\n return x.isZero() ? x : taylorSeries(Ctor, 2, x, x);\r\n }\r\n\r\n // Argument reduction: sin(5x) = 16*sin^5(x) - 20*sin^3(x) + 5*sin(x)\r\n // i.e. sin(x) = 16*sin^5(x/5) - 20*sin^3(x/5) + 5*sin(x/5)\r\n // and sin(x) = sin(x/5)(5 + sin^2(x/5)(16sin^2(x/5) - 20))\r\n\r\n // Estimate the optimum number of times to use the argument reduction.\r\n k = 1.4 * Math.sqrt(len);\r\n k = k > 16 ? 16 : k | 0;\r\n\r\n x = x.times(1 / tinyPow(5, k));\r\n x = taylorSeries(Ctor, 2, x, x);\r\n\r\n // Reverse argument reduction\r\n var sin2_x,\r\n d5 = new Ctor(5),\r\n d16 = new Ctor(16),\r\n d20 = new Ctor(20);\r\n for (; k--;) {\r\n sin2_x = x.times(x);\r\n x = x.times(d5.plus(sin2_x.times(d16.times(sin2_x).minus(d20))));\r\n }\r\n\r\n return x;\r\n}\r\n\r\n\r\n// Calculate Taylor series for `cos`, `cosh`, `sin` and `sinh`.\r\nfunction taylorSeries(Ctor, n, x, y, isHyperbolic) {\r\n var j, t, u, x2,\r\n i = 1,\r\n pr = Ctor.precision,\r\n k = Math.ceil(pr / LOG_BASE);\r\n\r\n external = false;\r\n x2 = x.times(x);\r\n u = new Ctor(y);\r\n\r\n for (;;) {\r\n t = divide(u.times(x2), new Ctor(n++ * n++), pr, 1);\r\n u = isHyperbolic ? y.plus(t) : y.minus(t);\r\n y = divide(t.times(x2), new Ctor(n++ * n++), pr, 1);\r\n t = u.plus(y);\r\n\r\n if (t.d[k] !== void 0) {\r\n for (j = k; t.d[j] === u.d[j] && j--;);\r\n if (j == -1) break;\r\n }\r\n\r\n j = u;\r\n u = y;\r\n y = t;\r\n t = j;\r\n i++;\r\n }\r\n\r\n external = true;\r\n t.d.length = k + 1;\r\n\r\n return t;\r\n}\r\n\r\n\r\n// Exponent e must be positive and non-zero.\r\nfunction tinyPow(b, e) {\r\n var n = b;\r\n while (--e) n *= b;\r\n return n;\r\n}\r\n\r\n\r\n// Return the absolute value of `x` reduced to less than or equal to half pi.\r\nfunction toLessThanHalfPi(Ctor, x) {\r\n var t,\r\n isNeg = x.s < 0,\r\n pi = getPi(Ctor, Ctor.precision, 1),\r\n halfPi = pi.times(0.5);\r\n\r\n x = x.abs();\r\n\r\n if (x.lte(halfPi)) {\r\n quadrant = isNeg ? 4 : 1;\r\n return x;\r\n }\r\n\r\n t = x.divToInt(pi);\r\n\r\n if (t.isZero()) {\r\n quadrant = isNeg ? 3 : 2;\r\n } else {\r\n x = x.minus(t.times(pi));\r\n\r\n // 0 <= x < pi\r\n if (x.lte(halfPi)) {\r\n quadrant = isOdd(t) ? (isNeg ? 2 : 3) : (isNeg ? 4 : 1);\r\n return x;\r\n }\r\n\r\n quadrant = isOdd(t) ? (isNeg ? 1 : 4) : (isNeg ? 3 : 2);\r\n }\r\n\r\n return x.minus(pi).abs();\r\n}\r\n\r\n\r\n/*\r\n * Return the value of Decimal `x` as a string in base `baseOut`.\r\n *\r\n * If the optional `sd` argument is present include a binary exponent suffix.\r\n */\r\nfunction toStringBinary(x, baseOut, sd, rm) {\r\n var base, e, i, k, len, roundUp, str, xd, y,\r\n Ctor = x.constructor,\r\n isExp = sd !== void 0;\r\n\r\n if (isExp) {\r\n checkInt32(sd, 1, MAX_DIGITS);\r\n if (rm === void 0) rm = Ctor.rounding;\r\n else checkInt32(rm, 0, 8);\r\n } else {\r\n sd = Ctor.precision;\r\n rm = Ctor.rounding;\r\n }\r\n\r\n if (!x.isFinite()) {\r\n str = nonFiniteToString(x);\r\n } else {\r\n str = finiteToString(x);\r\n i = str.indexOf('.');\r\n\r\n // Use exponential notation according to `toExpPos` and `toExpNeg`? No, but if required:\r\n // maxBinaryExponent = floor((decimalExponent + 1) * log[2](10))\r\n // minBinaryExponent = floor(decimalExponent * log[2](10))\r\n // log[2](10) = 3.321928094887362347870319429489390175864\r\n\r\n if (isExp) {\r\n base = 2;\r\n if (baseOut == 16) {\r\n sd = sd * 4 - 3;\r\n } else if (baseOut == 8) {\r\n sd = sd * 3 - 2;\r\n }\r\n } else {\r\n base = baseOut;\r\n }\r\n\r\n // Convert the number as an integer then divide the result by its base raised to a power such\r\n // that the fraction part will be restored.\r\n\r\n // Non-integer.\r\n if (i >= 0) {\r\n str = str.replace('.', '');\r\n y = new Ctor(1);\r\n y.e = str.length - i;\r\n y.d = convertBase(finiteToString(y), 10, base);\r\n y.e = y.d.length;\r\n }\r\n\r\n xd = convertBase(str, 10, base);\r\n e = len = xd.length;\r\n\r\n // Remove trailing zeros.\r\n for (; xd[--len] == 0;) xd.pop();\r\n\r\n if (!xd[0]) {\r\n str = isExp ? '0p+0' : '0';\r\n } else {\r\n if (i < 0) {\r\n e--;\r\n } else {\r\n x = new Ctor(x);\r\n x.d = xd;\r\n x.e = e;\r\n x = divide(x, y, sd, rm, 0, base);\r\n xd = x.d;\r\n e = x.e;\r\n roundUp = inexact;\r\n }\r\n\r\n // The rounding digit, i.e. the digit after the digit that may be rounded up.\r\n i = xd[sd];\r\n k = base / 2;\r\n roundUp = roundUp || xd[sd + 1] !== void 0;\r\n\r\n roundUp = rm < 4\r\n ? (i !== void 0 || roundUp) && (rm === 0 || rm === (x.s < 0 ? 3 : 2))\r\n : i > k || i === k && (rm === 4 || roundUp || rm === 6 && xd[sd - 1] & 1 ||\r\n rm === (x.s < 0 ? 8 : 7));\r\n\r\n xd.length = sd;\r\n\r\n if (roundUp) {\r\n\r\n // Rounding up may mean the previous digit has to be rounded up and so on.\r\n for (; ++xd[--sd] > base - 1;) {\r\n xd[sd] = 0;\r\n if (!sd) {\r\n ++e;\r\n xd.unshift(1);\r\n }\r\n }\r\n }\r\n\r\n // Determine trailing zeros.\r\n for (len = xd.length; !xd[len - 1]; --len);\r\n\r\n // E.g. [4, 11, 15] becomes 4bf.\r\n for (i = 0, str = ''; i < len; i++) str += NUMERALS.charAt(xd[i]);\r\n\r\n // Add binary exponent suffix?\r\n if (isExp) {\r\n if (len > 1) {\r\n if (baseOut == 16 || baseOut == 8) {\r\n i = baseOut == 16 ? 4 : 3;\r\n for (--len; len % i; len++) str += '0';\r\n xd = convertBase(str, base, baseOut);\r\n for (len = xd.length; !xd[len - 1]; --len);\r\n\r\n // xd[0] will always be be 1\r\n for (i = 1, str = '1.'; i < len; i++) str += NUMERALS.charAt(xd[i]);\r\n } else {\r\n str = str.charAt(0) + '.' + str.slice(1);\r\n }\r\n }\r\n\r\n str = str + (e < 0 ? 'p' : 'p+') + e;\r\n } else if (e < 0) {\r\n for (; ++e;) str = '0' + str;\r\n str = '0.' + str;\r\n } else {\r\n if (++e > len) for (e -= len; e-- ;) str += '0';\r\n else if (e < len) str = str.slice(0, e) + '.' + str.slice(e);\r\n }\r\n }\r\n\r\n str = (baseOut == 16 ? '0x' : baseOut == 2 ? '0b' : baseOut == 8 ? '0o' : '') + str;\r\n }\r\n\r\n return x.s < 0 ? '-' + str : str;\r\n}\r\n\r\n\r\n// Does not strip trailing zeros.\r\nfunction truncate(arr, len) {\r\n if (arr.length > len) {\r\n arr.length = len;\r\n return true;\r\n }\r\n}\r\n\r\n\r\n// Decimal methods\r\n\r\n\r\n/*\r\n * abs\r\n * acos\r\n * acosh\r\n * add\r\n * asin\r\n * asinh\r\n * atan\r\n * atanh\r\n * atan2\r\n * cbrt\r\n * ceil\r\n * clamp\r\n * clone\r\n * config\r\n * cos\r\n * cosh\r\n * div\r\n * exp\r\n * floor\r\n * hypot\r\n * ln\r\n * log\r\n * log2\r\n * log10\r\n * max\r\n * min\r\n * mod\r\n * mul\r\n * pow\r\n * random\r\n * round\r\n * set\r\n * sign\r\n * sin\r\n * sinh\r\n * sqrt\r\n * sub\r\n * sum\r\n * tan\r\n * tanh\r\n * trunc\r\n */\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the absolute value of `x`.\r\n *\r\n * x {number|string|Decimal}\r\n *\r\n */\r\nfunction abs(x) {\r\n return new this(x).abs();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arccosine in radians of `x`.\r\n *\r\n * x {number|string|Decimal}\r\n *\r\n */\r\nfunction acos(x) {\r\n return new this(x).acos();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the inverse of the hyperbolic cosine of `x`, rounded to\r\n * `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal} A value in radians.\r\n *\r\n */\r\nfunction acosh(x) {\r\n return new this(x).acosh();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the sum of `x` and `y`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal}\r\n * y {number|string|Decimal}\r\n *\r\n */\r\nfunction add(x, y) {\r\n return new this(x).plus(y);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arcsine in radians of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal}\r\n *\r\n */\r\nfunction asin(x) {\r\n return new this(x).asin();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the inverse of the hyperbolic sine of `x`, rounded to\r\n * `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal} A value in radians.\r\n *\r\n */\r\nfunction asinh(x) {\r\n return new this(x).asinh();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arctangent in radians of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal}\r\n *\r\n */\r\nfunction atan(x) {\r\n return new this(x).atan();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the inverse of the hyperbolic tangent of `x`, rounded to\r\n * `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal} A value in radians.\r\n *\r\n */\r\nfunction atanh(x) {\r\n return new this(x).atanh();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the arctangent in radians of `y/x` in the range -pi to pi\r\n * (inclusive), rounded to `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * Domain: [-Infinity, Infinity]\r\n * Range: [-pi, pi]\r\n *\r\n * y {number|string|Decimal} The y-coordinate.\r\n * x {number|string|Decimal} The x-coordinate.\r\n *\r\n * atan2(±0, -0) = ±pi\r\n * atan2(±0, +0) = ±0\r\n * atan2(±0, -x) = ±pi for x > 0\r\n * atan2(±0, x) = ±0 for x > 0\r\n * atan2(-y, ±0) = -pi/2 for y > 0\r\n * atan2(y, ±0) = pi/2 for y > 0\r\n * atan2(±y, -Infinity) = ±pi for finite y > 0\r\n * atan2(±y, +Infinity) = ±0 for finite y > 0\r\n * atan2(±Infinity, x) = ±pi/2 for finite x\r\n * atan2(±Infinity, -Infinity) = ±3*pi/4\r\n * atan2(±Infinity, +Infinity) = ±pi/4\r\n * atan2(NaN, x) = NaN\r\n * atan2(y, NaN) = NaN\r\n *\r\n */\r\nfunction atan2(y, x) {\r\n y = new this(y);\r\n x = new this(x);\r\n var r,\r\n pr = this.precision,\r\n rm = this.rounding,\r\n wpr = pr + 4;\r\n\r\n // Either NaN\r\n if (!y.s || !x.s) {\r\n r = new this(NaN);\r\n\r\n // Both ±Infinity\r\n } else if (!y.d && !x.d) {\r\n r = getPi(this, wpr, 1).times(x.s > 0 ? 0.25 : 0.75);\r\n r.s = y.s;\r\n\r\n // x is ±Infinity or y is ±0\r\n } else if (!x.d || y.isZero()) {\r\n r = x.s < 0 ? getPi(this, pr, rm) : new this(0);\r\n r.s = y.s;\r\n\r\n // y is ±Infinity or x is ±0\r\n } else if (!y.d || x.isZero()) {\r\n r = getPi(this, wpr, 1).times(0.5);\r\n r.s = y.s;\r\n\r\n // Both non-zero and finite\r\n } else if (x.s < 0) {\r\n this.precision = wpr;\r\n this.rounding = 1;\r\n r = this.atan(divide(y, x, wpr, 1));\r\n x = getPi(this, wpr, 1);\r\n this.precision = pr;\r\n this.rounding = rm;\r\n r = y.s < 0 ? r.minus(x) : r.plus(x);\r\n } else {\r\n r = this.atan(divide(y, x, wpr, 1));\r\n }\r\n\r\n return r;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the cube root of `x`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal}\r\n *\r\n */\r\nfunction cbrt(x) {\r\n return new this(x).cbrt();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` rounded to an integer using `ROUND_CEIL`.\r\n *\r\n * x {number|string|Decimal}\r\n *\r\n */\r\nfunction ceil(x) {\r\n return finalise(x = new this(x), x.e + 1, 2);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` clamped to the range delineated by `min` and `max`.\r\n *\r\n * x {number|string|Decimal}\r\n * min {number|string|Decimal}\r\n * max {number|string|Decimal}\r\n *\r\n */\r\nfunction clamp(x, min, max) {\r\n return new this(x).clamp(min, max);\r\n}\r\n\r\n\r\n/*\r\n * Configure global settings for a Decimal constructor.\r\n *\r\n * `obj` is an object with one or more of the following properties,\r\n *\r\n * precision {number}\r\n * rounding {number}\r\n * toExpNeg {number}\r\n * toExpPos {number}\r\n * maxE {number}\r\n * minE {number}\r\n * modulo {number}\r\n * crypto {boolean|number}\r\n * defaults {true}\r\n *\r\n * E.g. Decimal.config({ precision: 20, rounding: 4 })\r\n *\r\n */\r\nfunction config(obj) {\r\n if (!obj || typeof obj !== 'object') throw Error(decimalError + 'Object expected');\r\n var i, p, v,\r\n useDefaults = obj.defaults === true,\r\n ps = [\r\n 'precision', 1, MAX_DIGITS,\r\n 'rounding', 0, 8,\r\n 'toExpNeg', -EXP_LIMIT, 0,\r\n 'toExpPos', 0, EXP_LIMIT,\r\n 'maxE', 0, EXP_LIMIT,\r\n 'minE', -EXP_LIMIT, 0,\r\n 'modulo', 0, 9\r\n ];\r\n\r\n for (i = 0; i < ps.length; i += 3) {\r\n if (p = ps[i], useDefaults) this[p] = DEFAULTS[p];\r\n if ((v = obj[p]) !== void 0) {\r\n if (mathfloor(v) === v && v >= ps[i + 1] && v <= ps[i + 2]) this[p] = v;\r\n else throw Error(invalidArgument + p + ': ' + v);\r\n }\r\n }\r\n\r\n if (p = 'crypto', useDefaults) this[p] = DEFAULTS[p];\r\n if ((v = obj[p]) !== void 0) {\r\n if (v === true || v === false || v === 0 || v === 1) {\r\n if (v) {\r\n if (typeof crypto != 'undefined' && crypto &&\r\n (crypto.getRandomValues || crypto.randomBytes)) {\r\n this[p] = true;\r\n } else {\r\n throw Error(cryptoUnavailable);\r\n }\r\n } else {\r\n this[p] = false;\r\n }\r\n } else {\r\n throw Error(invalidArgument + p + ': ' + v);\r\n }\r\n }\r\n\r\n return this;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the cosine of `x`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal} A value in radians.\r\n *\r\n */\r\nfunction cos(x) {\r\n return new this(x).cos();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the hyperbolic cosine of `x`, rounded to precision\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal} A value in radians.\r\n *\r\n */\r\nfunction cosh(x) {\r\n return new this(x).cosh();\r\n}\r\n\r\n\r\n/*\r\n * Create and return a Decimal constructor with the same configuration properties as this Decimal\r\n * constructor.\r\n *\r\n */\r\nfunction clone(obj) {\r\n var i, p, ps;\r\n\r\n /*\r\n * The Decimal constructor and exported function.\r\n * Return a new Decimal instance.\r\n *\r\n * v {number|string|Decimal} A numeric value.\r\n *\r\n */\r\n function Decimal(v) {\r\n var e, i, t,\r\n x = this;\r\n\r\n // Decimal called without new.\r\n if (!(x instanceof Decimal)) return new Decimal(v);\r\n\r\n // Retain a reference to this Decimal constructor, and shadow Decimal.prototype.constructor\r\n // which points to Object.\r\n x.constructor = Decimal;\r\n\r\n // Duplicate.\r\n if (isDecimalInstance(v)) {\r\n x.s = v.s;\r\n\r\n if (external) {\r\n if (!v.d || v.e > Decimal.maxE) {\r\n\r\n // Infinity.\r\n x.e = NaN;\r\n x.d = null;\r\n } else if (v.e < Decimal.minE) {\r\n\r\n // Zero.\r\n x.e = 0;\r\n x.d = [0];\r\n } else {\r\n x.e = v.e;\r\n x.d = v.d.slice();\r\n }\r\n } else {\r\n x.e = v.e;\r\n x.d = v.d ? v.d.slice() : v.d;\r\n }\r\n\r\n return;\r\n }\r\n\r\n t = typeof v;\r\n\r\n if (t === 'number') {\r\n if (v === 0) {\r\n x.s = 1 / v < 0 ? -1 : 1;\r\n x.e = 0;\r\n x.d = [0];\r\n return;\r\n }\r\n\r\n if (v < 0) {\r\n v = -v;\r\n x.s = -1;\r\n } else {\r\n x.s = 1;\r\n }\r\n\r\n // Fast path for small integers.\r\n if (v === ~~v && v < 1e7) {\r\n for (e = 0, i = v; i >= 10; i /= 10) e++;\r\n\r\n if (external) {\r\n if (e > Decimal.maxE) {\r\n x.e = NaN;\r\n x.d = null;\r\n } else if (e < Decimal.minE) {\r\n x.e = 0;\r\n x.d = [0];\r\n } else {\r\n x.e = e;\r\n x.d = [v];\r\n }\r\n } else {\r\n x.e = e;\r\n x.d = [v];\r\n }\r\n\r\n return;\r\n\r\n // Infinity, NaN.\r\n } else if (v * 0 !== 0) {\r\n if (!v) x.s = NaN;\r\n x.e = NaN;\r\n x.d = null;\r\n return;\r\n }\r\n\r\n return parseDecimal(x, v.toString());\r\n\r\n } else if (t !== 'string') {\r\n throw Error(invalidArgument + v);\r\n }\r\n\r\n // Minus sign?\r\n if ((i = v.charCodeAt(0)) === 45) {\r\n v = v.slice(1);\r\n x.s = -1;\r\n } else {\r\n // Plus sign?\r\n if (i === 43) v = v.slice(1);\r\n x.s = 1;\r\n }\r\n\r\n return isDecimal.test(v) ? parseDecimal(x, v) : parseOther(x, v);\r\n }\r\n\r\n Decimal.prototype = P;\r\n\r\n Decimal.ROUND_UP = 0;\r\n Decimal.ROUND_DOWN = 1;\r\n Decimal.ROUND_CEIL = 2;\r\n Decimal.ROUND_FLOOR = 3;\r\n Decimal.ROUND_HALF_UP = 4;\r\n Decimal.ROUND_HALF_DOWN = 5;\r\n Decimal.ROUND_HALF_EVEN = 6;\r\n Decimal.ROUND_HALF_CEIL = 7;\r\n Decimal.ROUND_HALF_FLOOR = 8;\r\n Decimal.EUCLID = 9;\r\n\r\n Decimal.config = Decimal.set = config;\r\n Decimal.clone = clone;\r\n Decimal.isDecimal = isDecimalInstance;\r\n\r\n Decimal.abs = abs;\r\n Decimal.acos = acos;\r\n Decimal.acosh = acosh; // ES6\r\n Decimal.add = add;\r\n Decimal.asin = asin;\r\n Decimal.asinh = asinh; // ES6\r\n Decimal.atan = atan;\r\n Decimal.atanh = atanh; // ES6\r\n Decimal.atan2 = atan2;\r\n Decimal.cbrt = cbrt; // ES6\r\n Decimal.ceil = ceil;\r\n Decimal.clamp = clamp;\r\n Decimal.cos = cos;\r\n Decimal.cosh = cosh; // ES6\r\n Decimal.div = div;\r\n Decimal.exp = exp;\r\n Decimal.floor = floor;\r\n Decimal.hypot = hypot; // ES6\r\n Decimal.ln = ln;\r\n Decimal.log = log;\r\n Decimal.log10 = log10; // ES6\r\n Decimal.log2 = log2; // ES6\r\n Decimal.max = max;\r\n Decimal.min = min;\r\n Decimal.mod = mod;\r\n Decimal.mul = mul;\r\n Decimal.pow = pow;\r\n Decimal.random = random;\r\n Decimal.round = round;\r\n Decimal.sign = sign; // ES6\r\n Decimal.sin = sin;\r\n Decimal.sinh = sinh; // ES6\r\n Decimal.sqrt = sqrt;\r\n Decimal.sub = sub;\r\n Decimal.sum = sum;\r\n Decimal.tan = tan;\r\n Decimal.tanh = tanh; // ES6\r\n Decimal.trunc = trunc; // ES6\r\n\r\n if (obj === void 0) obj = {};\r\n if (obj) {\r\n if (obj.defaults !== true) {\r\n ps = ['precision', 'rounding', 'toExpNeg', 'toExpPos', 'maxE', 'minE', 'modulo', 'crypto'];\r\n for (i = 0; i < ps.length;) if (!obj.hasOwnProperty(p = ps[i++])) obj[p] = this[p];\r\n }\r\n }\r\n\r\n Decimal.config(obj);\r\n\r\n return Decimal;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` divided by `y`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal}\r\n * y {number|string|Decimal}\r\n *\r\n */\r\nfunction div(x, y) {\r\n return new this(x).div(y);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the natural exponential of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal} The power to which to raise the base of the natural log.\r\n *\r\n */\r\nfunction exp(x) {\r\n return new this(x).exp();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` round to an integer using `ROUND_FLOOR`.\r\n *\r\n * x {number|string|Decimal}\r\n *\r\n */\r\nfunction floor(x) {\r\n return finalise(x = new this(x), x.e + 1, 3);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the square root of the sum of the squares of the arguments,\r\n * rounded to `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * hypot(a, b, ...) = sqrt(a^2 + b^2 + ...)\r\n *\r\n * arguments {number|string|Decimal}\r\n *\r\n */\r\nfunction hypot() {\r\n var i, n,\r\n t = new this(0);\r\n\r\n external = false;\r\n\r\n for (i = 0; i < arguments.length;) {\r\n n = new this(arguments[i++]);\r\n if (!n.d) {\r\n if (n.s) {\r\n external = true;\r\n return new this(1 / 0);\r\n }\r\n t = n;\r\n } else if (t.d) {\r\n t = t.plus(n.times(n));\r\n }\r\n }\r\n\r\n external = true;\r\n\r\n return t.sqrt();\r\n}\r\n\r\n\r\n/*\r\n * Return true if object is a Decimal instance (where Decimal is any Decimal constructor),\r\n * otherwise return false.\r\n *\r\n */\r\nfunction isDecimalInstance(obj) {\r\n return obj instanceof Decimal || obj && obj.toStringTag === tag || false;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the natural logarithm of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal}\r\n *\r\n */\r\nfunction ln(x) {\r\n return new this(x).ln();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the log of `x` to the base `y`, or to base 10 if no base\r\n * is specified, rounded to `precision` significant digits using rounding mode `rounding`.\r\n *\r\n * log[y](x)\r\n *\r\n * x {number|string|Decimal} The argument of the logarithm.\r\n * y {number|string|Decimal} The base of the logarithm.\r\n *\r\n */\r\nfunction log(x, y) {\r\n return new this(x).log(y);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the base 2 logarithm of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal}\r\n *\r\n */\r\nfunction log2(x) {\r\n return new this(x).log(2);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the base 10 logarithm of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal}\r\n *\r\n */\r\nfunction log10(x) {\r\n return new this(x).log(10);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the maximum of the arguments.\r\n *\r\n * arguments {number|string|Decimal}\r\n *\r\n */\r\nfunction max() {\r\n return maxOrMin(this, arguments, 'lt');\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the minimum of the arguments.\r\n *\r\n * arguments {number|string|Decimal}\r\n *\r\n */\r\nfunction min() {\r\n return maxOrMin(this, arguments, 'gt');\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` modulo `y`, rounded to `precision` significant digits\r\n * using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal}\r\n * y {number|string|Decimal}\r\n *\r\n */\r\nfunction mod(x, y) {\r\n return new this(x).mod(y);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` multiplied by `y`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal}\r\n * y {number|string|Decimal}\r\n *\r\n */\r\nfunction mul(x, y) {\r\n return new this(x).mul(y);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` raised to the power `y`, rounded to precision\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal} The base.\r\n * y {number|string|Decimal} The exponent.\r\n *\r\n */\r\nfunction pow(x, y) {\r\n return new this(x).pow(y);\r\n}\r\n\r\n\r\n/*\r\n * Returns a new Decimal with a random value equal to or greater than 0 and less than 1, and with\r\n * `sd`, or `Decimal.precision` if `sd` is omitted, significant digits (or less if trailing zeros\r\n * are produced).\r\n *\r\n * [sd] {number} Significant digits. Integer, 0 to MAX_DIGITS inclusive.\r\n *\r\n */\r\nfunction random(sd) {\r\n var d, e, k, n,\r\n i = 0,\r\n r = new this(1),\r\n rd = [];\r\n\r\n if (sd === void 0) sd = this.precision;\r\n else checkInt32(sd, 1, MAX_DIGITS);\r\n\r\n k = Math.ceil(sd / LOG_BASE);\r\n\r\n if (!this.crypto) {\r\n for (; i < k;) rd[i++] = Math.random() * 1e7 | 0;\r\n\r\n // Browsers supporting crypto.getRandomValues.\r\n } else if (crypto.getRandomValues) {\r\n d = crypto.getRandomValues(new Uint32Array(k));\r\n\r\n for (; i < k;) {\r\n n = d[i];\r\n\r\n // 0 <= n < 4294967296\r\n // Probability n >= 4.29e9, is 4967296 / 4294967296 = 0.00116 (1 in 865).\r\n if (n >= 4.29e9) {\r\n d[i] = crypto.getRandomValues(new Uint32Array(1))[0];\r\n } else {\r\n\r\n // 0 <= n <= 4289999999\r\n // 0 <= (n % 1e7) <= 9999999\r\n rd[i++] = n % 1e7;\r\n }\r\n }\r\n\r\n // Node.js supporting crypto.randomBytes.\r\n } else if (crypto.randomBytes) {\r\n\r\n // buffer\r\n d = crypto.randomBytes(k *= 4);\r\n\r\n for (; i < k;) {\r\n\r\n // 0 <= n < 2147483648\r\n n = d[i] + (d[i + 1] << 8) + (d[i + 2] << 16) + ((d[i + 3] & 0x7f) << 24);\r\n\r\n // Probability n >= 2.14e9, is 7483648 / 2147483648 = 0.0035 (1 in 286).\r\n if (n >= 2.14e9) {\r\n crypto.randomBytes(4).copy(d, i);\r\n } else {\r\n\r\n // 0 <= n <= 2139999999\r\n // 0 <= (n % 1e7) <= 9999999\r\n rd.push(n % 1e7);\r\n i += 4;\r\n }\r\n }\r\n\r\n i = k / 4;\r\n } else {\r\n throw Error(cryptoUnavailable);\r\n }\r\n\r\n k = rd[--i];\r\n sd %= LOG_BASE;\r\n\r\n // Convert trailing digits to zeros according to sd.\r\n if (k && sd) {\r\n n = mathpow(10, LOG_BASE - sd);\r\n rd[i] = (k / n | 0) * n;\r\n }\r\n\r\n // Remove trailing words which are zero.\r\n for (; rd[i] === 0; i--) rd.pop();\r\n\r\n // Zero?\r\n if (i < 0) {\r\n e = 0;\r\n rd = [0];\r\n } else {\r\n e = -1;\r\n\r\n // Remove leading words which are zero and adjust exponent accordingly.\r\n for (; rd[0] === 0; e -= LOG_BASE) rd.shift();\r\n\r\n // Count the digits of the first word of rd to determine leading zeros.\r\n for (k = 1, n = rd[0]; n >= 10; n /= 10) k++;\r\n\r\n // Adjust the exponent for leading zeros of the first word of rd.\r\n if (k < LOG_BASE) e -= LOG_BASE - k;\r\n }\r\n\r\n r.e = e;\r\n r.d = rd;\r\n\r\n return r;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` rounded to an integer using rounding mode `rounding`.\r\n *\r\n * To emulate `Math.round`, set rounding to 7 (ROUND_HALF_CEIL).\r\n *\r\n * x {number|string|Decimal}\r\n *\r\n */\r\nfunction round(x) {\r\n return finalise(x = new this(x), x.e + 1, this.rounding);\r\n}\r\n\r\n\r\n/*\r\n * Return\r\n * 1 if x > 0,\r\n * -1 if x < 0,\r\n * 0 if x is 0,\r\n * -0 if x is -0,\r\n * NaN otherwise\r\n *\r\n * x {number|string|Decimal}\r\n *\r\n */\r\nfunction sign(x) {\r\n x = new this(x);\r\n return x.d ? (x.d[0] ? x.s : 0 * x.s) : x.s || NaN;\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the sine of `x`, rounded to `precision` significant digits\r\n * using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal} A value in radians.\r\n *\r\n */\r\nfunction sin(x) {\r\n return new this(x).sin();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the hyperbolic sine of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal} A value in radians.\r\n *\r\n */\r\nfunction sinh(x) {\r\n return new this(x).sinh();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the square root of `x`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal}\r\n *\r\n */\r\nfunction sqrt(x) {\r\n return new this(x).sqrt();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` minus `y`, rounded to `precision` significant digits\r\n * using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal}\r\n * y {number|string|Decimal}\r\n *\r\n */\r\nfunction sub(x, y) {\r\n return new this(x).sub(y);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the sum of the arguments, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * Only the result is rounded, not the intermediate calculations.\r\n *\r\n * arguments {number|string|Decimal}\r\n *\r\n */\r\nfunction sum() {\r\n var i = 0,\r\n args = arguments,\r\n x = new this(args[i]);\r\n\r\n external = false;\r\n for (; x.s && ++i < args.length;) x = x.plus(args[i]);\r\n external = true;\r\n\r\n return finalise(x, this.precision, this.rounding);\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the tangent of `x`, rounded to `precision` significant\r\n * digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal} A value in radians.\r\n *\r\n */\r\nfunction tan(x) {\r\n return new this(x).tan();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is the hyperbolic tangent of `x`, rounded to `precision`\r\n * significant digits using rounding mode `rounding`.\r\n *\r\n * x {number|string|Decimal} A value in radians.\r\n *\r\n */\r\nfunction tanh(x) {\r\n return new this(x).tanh();\r\n}\r\n\r\n\r\n/*\r\n * Return a new Decimal whose value is `x` truncated to an integer.\r\n *\r\n * x {number|string|Decimal}\r\n *\r\n */\r\nfunction trunc(x) {\r\n return finalise(x = new this(x), x.e + 1, 1);\r\n}\r\n\r\n\r\nP[Symbol.for('nodejs.util.inspect.custom')] = P.toString;\r\nP[Symbol.toStringTag] = 'Decimal';\r\n\r\n// Create and configure initial Decimal constructor.\r\nexport var Decimal = P.constructor = clone(DEFAULTS);\r\n\r\n// Create the internal constants from their string values.\r\nLN10 = new Decimal(LN10);\r\nPI = new Decimal(PI);\r\n\r\nexport default Decimal;\r\n","import Decimal from 'decimal.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'BigNumber';\nvar dependencies = ['?on', 'config'];\nexport var createBigNumberClass = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n on,\n config\n } = _ref;\n var BigNumber = Decimal.clone({\n precision: config.precision,\n modulo: Decimal.EUCLID\n });\n BigNumber.prototype = Object.create(BigNumber.prototype);\n\n /**\n * Attach type information\n */\n BigNumber.prototype.type = 'BigNumber';\n BigNumber.prototype.isBigNumber = true;\n\n /**\n * Get a JSON representation of a BigNumber containing\n * type information\n * @returns {Object} Returns a JSON object structured as:\n * `{\"mathjs\": \"BigNumber\", \"value\": \"0.2\"}`\n */\n BigNumber.prototype.toJSON = function () {\n return {\n mathjs: 'BigNumber',\n value: this.toString()\n };\n };\n\n /**\n * Instantiate a BigNumber from a JSON object\n * @param {Object} json a JSON object structured as:\n * `{\"mathjs\": \"BigNumber\", \"value\": \"0.2\"}`\n * @return {BigNumber}\n */\n BigNumber.fromJSON = function (json) {\n return new BigNumber(json.value);\n };\n if (on) {\n // listen for changed in the configuration, automatically apply changed precision\n on('config', function (curr, prev) {\n if (curr.precision !== prev.precision) {\n BigNumber.config({\n precision: curr.precision\n });\n }\n });\n }\n return BigNumber;\n}, {\n isClass: true\n});","import Complex from 'complex.js';\nimport { format } from '../../utils/number.js';\nimport { isNumber, isUnit } from '../../utils/is.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'Complex';\nvar dependencies = [];\nexport var createComplexClass = /* #__PURE__ */factory(name, dependencies, () => {\n /**\n * Attach type information\n */\n Object.defineProperty(Complex, 'name', {\n value: 'Complex'\n });\n Complex.prototype.constructor = Complex;\n Complex.prototype.type = 'Complex';\n Complex.prototype.isComplex = true;\n\n /**\n * Get a JSON representation of the complex number\n * @returns {Object} Returns a JSON object structured as:\n * `{\"mathjs\": \"Complex\", \"re\": 2, \"im\": 3}`\n */\n Complex.prototype.toJSON = function () {\n return {\n mathjs: 'Complex',\n re: this.re,\n im: this.im\n };\n };\n\n /*\n * Return the value of the complex number in polar notation\n * The angle phi will be set in the interval of [-pi, pi].\n * @return {{r: number, phi: number}} Returns and object with properties r and phi.\n */\n Complex.prototype.toPolar = function () {\n return {\n r: this.abs(),\n phi: this.arg()\n };\n };\n\n /**\n * Get a string representation of the complex number,\n * with optional formatting options.\n * @param {Object | number | Function} [options] Formatting options. See\n * lib/utils/number:format for a\n * description of the available\n * options.\n * @return {string} str\n */\n Complex.prototype.format = function (options) {\n var str = '';\n var im = this.im;\n var re = this.re;\n var strRe = format(this.re, options);\n var strIm = format(this.im, options);\n\n // round either re or im when smaller than the configured precision\n var precision = isNumber(options) ? options : options ? options.precision : null;\n if (precision !== null) {\n var epsilon = Math.pow(10, -precision);\n if (Math.abs(re / im) < epsilon) {\n re = 0;\n }\n if (Math.abs(im / re) < epsilon) {\n im = 0;\n }\n }\n if (im === 0) {\n // real value\n str = strRe;\n } else if (re === 0) {\n // purely complex value\n if (im === 1) {\n str = 'i';\n } else if (im === -1) {\n str = '-i';\n } else {\n str = strIm + 'i';\n }\n } else {\n // complex value\n if (im < 0) {\n if (im === -1) {\n str = strRe + ' - i';\n } else {\n str = strRe + ' - ' + strIm.substring(1) + 'i';\n }\n } else {\n if (im === 1) {\n str = strRe + ' + i';\n } else {\n str = strRe + ' + ' + strIm + 'i';\n }\n }\n }\n return str;\n };\n\n /**\n * Create a complex number from polar coordinates\n *\n * Usage:\n *\n * Complex.fromPolar(r: number, phi: number) : Complex\n * Complex.fromPolar({r: number, phi: number}) : Complex\n *\n * @param {*} args...\n * @return {Complex}\n */\n Complex.fromPolar = function (args) {\n switch (arguments.length) {\n case 1:\n {\n var arg = arguments[0];\n if (typeof arg === 'object') {\n return Complex(arg);\n } else {\n throw new TypeError('Input has to be an object with r and phi keys.');\n }\n }\n case 2:\n {\n var r = arguments[0];\n var phi = arguments[1];\n if (isNumber(r)) {\n if (isUnit(phi) && phi.hasBase('ANGLE')) {\n // convert unit to a number in radians\n phi = phi.toNumber('rad');\n }\n if (isNumber(phi)) {\n return new Complex({\n r,\n phi\n });\n }\n throw new TypeError('Phi is not a number nor an angle unit.');\n } else {\n throw new TypeError('Radius r is not a number.');\n }\n }\n default:\n throw new SyntaxError('Wrong number of arguments in function fromPolar');\n }\n };\n Complex.prototype.valueOf = Complex.prototype.toString;\n\n /**\n * Create a Complex number from a JSON object\n * @param {Object} json A JSON Object structured as\n * {\"mathjs\": \"Complex\", \"re\": 2, \"im\": 3}\n * All properties are optional, default values\n * for `re` and `im` are 0.\n * @return {Complex} Returns a new Complex number\n */\n Complex.fromJSON = function (json) {\n return new Complex(json);\n };\n\n /**\n * Compare two complex numbers, `a` and `b`:\n *\n * - Returns 1 when the real part of `a` is larger than the real part of `b`\n * - Returns -1 when the real part of `a` is smaller than the real part of `b`\n * - Returns 1 when the real parts are equal\n * and the imaginary part of `a` is larger than the imaginary part of `b`\n * - Returns -1 when the real parts are equal\n * and the imaginary part of `a` is smaller than the imaginary part of `b`\n * - Returns 0 when both real and imaginary parts are equal.\n *\n * @params {Complex} a\n * @params {Complex} b\n * @returns {number} Returns the comparison result: -1, 0, or 1\n */\n Complex.compare = function (a, b) {\n if (a.re > b.re) {\n return 1;\n }\n if (a.re < b.re) {\n return -1;\n }\n if (a.im > b.im) {\n return 1;\n }\n if (a.im < b.im) {\n return -1;\n }\n return 0;\n };\n return Complex;\n}, {\n isClass: true\n});","import Fraction from 'fraction.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'Fraction';\nvar dependencies = [];\nexport var createFractionClass = /* #__PURE__ */factory(name, dependencies, () => {\n /**\n * Attach type information\n */\n Object.defineProperty(Fraction, 'name', {\n value: 'Fraction'\n });\n Fraction.prototype.constructor = Fraction;\n Fraction.prototype.type = 'Fraction';\n Fraction.prototype.isFraction = true;\n\n /**\n * Get a JSON representation of a Fraction containing type information\n * @returns {Object} Returns a JSON object structured as:\n * `{\"mathjs\": \"Fraction\", \"n\": 3, \"d\": 8}`\n */\n Fraction.prototype.toJSON = function () {\n return {\n mathjs: 'Fraction',\n n: this.s * this.n,\n d: this.d\n };\n };\n\n /**\n * Instantiate a Fraction from a JSON object\n * @param {Object} json a JSON object structured as:\n * `{\"mathjs\": \"Fraction\", \"n\": 3, \"d\": 8}`\n * @return {BigNumber}\n */\n Fraction.fromJSON = function (json) {\n return new Fraction(json);\n };\n return Fraction;\n}, {\n isClass: true\n});","import { isBigNumber } from '../../utils/is.js';\nimport { format, sign } from '../../utils/number.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'Range';\nvar dependencies = [];\nexport var createRangeClass = /* #__PURE__ */factory(name, dependencies, () => {\n /**\n * Create a range. A range has a start, step, and end, and contains functions\n * to iterate over the range.\n *\n * A range can be constructed as:\n *\n * const range = new Range(start, end)\n * const range = new Range(start, end, step)\n *\n * To get the result of the range:\n * range.forEach(function (x) {\n * console.log(x)\n * })\n * range.map(function (x) {\n * return math.sin(x)\n * })\n * range.toArray()\n *\n * Example usage:\n *\n * const c = new Range(2, 6) // 2:1:5\n * c.toArray() // [2, 3, 4, 5]\n * const d = new Range(2, -3, -1) // 2:-1:-2\n * d.toArray() // [2, 1, 0, -1, -2]\n *\n * @class Range\n * @constructor Range\n * @param {number} start included lower bound\n * @param {number} end excluded upper bound\n * @param {number} [step] step size, default value is 1\n */\n function Range(start, end, step) {\n if (!(this instanceof Range)) {\n throw new SyntaxError('Constructor must be called with the new operator');\n }\n var hasStart = start !== null && start !== undefined;\n var hasEnd = end !== null && end !== undefined;\n var hasStep = step !== null && step !== undefined;\n if (hasStart) {\n if (isBigNumber(start)) {\n start = start.toNumber();\n } else if (typeof start !== 'number') {\n throw new TypeError('Parameter start must be a number');\n }\n }\n if (hasEnd) {\n if (isBigNumber(end)) {\n end = end.toNumber();\n } else if (typeof end !== 'number') {\n throw new TypeError('Parameter end must be a number');\n }\n }\n if (hasStep) {\n if (isBigNumber(step)) {\n step = step.toNumber();\n } else if (typeof step !== 'number') {\n throw new TypeError('Parameter step must be a number');\n }\n }\n this.start = hasStart ? parseFloat(start) : 0;\n this.end = hasEnd ? parseFloat(end) : 0;\n this.step = hasStep ? parseFloat(step) : 1;\n }\n\n /**\n * Attach type information\n */\n Range.prototype.type = 'Range';\n Range.prototype.isRange = true;\n\n /**\n * Parse a string into a range,\n * The string contains the start, optional step, and end, separated by a colon.\n * If the string does not contain a valid range, null is returned.\n * For example str='0:2:11'.\n * @memberof Range\n * @param {string} str\n * @return {Range | null} range\n */\n Range.parse = function (str) {\n if (typeof str !== 'string') {\n return null;\n }\n var args = str.split(':');\n var nums = args.map(function (arg) {\n return parseFloat(arg);\n });\n var invalid = nums.some(function (num) {\n return isNaN(num);\n });\n if (invalid) {\n return null;\n }\n switch (nums.length) {\n case 2:\n return new Range(nums[0], nums[1]);\n case 3:\n return new Range(nums[0], nums[2], nums[1]);\n default:\n return null;\n }\n };\n\n /**\n * Create a clone of the range\n * @return {Range} clone\n */\n Range.prototype.clone = function () {\n return new Range(this.start, this.end, this.step);\n };\n\n /**\n * Retrieve the size of the range.\n * Returns an array containing one number, the number of elements in the range.\n * @memberof Range\n * @returns {number[]} size\n */\n Range.prototype.size = function () {\n var len = 0;\n var start = this.start;\n var step = this.step;\n var end = this.end;\n var diff = end - start;\n if (sign(step) === sign(diff)) {\n len = Math.ceil(diff / step);\n } else if (diff === 0) {\n len = 0;\n }\n if (isNaN(len)) {\n len = 0;\n }\n return [len];\n };\n\n /**\n * Calculate the minimum value in the range\n * @memberof Range\n * @return {number | undefined} min\n */\n Range.prototype.min = function () {\n var size = this.size()[0];\n if (size > 0) {\n if (this.step > 0) {\n // positive step\n return this.start;\n } else {\n // negative step\n return this.start + (size - 1) * this.step;\n }\n } else {\n return undefined;\n }\n };\n\n /**\n * Calculate the maximum value in the range\n * @memberof Range\n * @return {number | undefined} max\n */\n Range.prototype.max = function () {\n var size = this.size()[0];\n if (size > 0) {\n if (this.step > 0) {\n // positive step\n return this.start + (size - 1) * this.step;\n } else {\n // negative step\n return this.start;\n }\n } else {\n return undefined;\n }\n };\n\n /**\n * Execute a callback function for each value in the range.\n * @memberof Range\n * @param {function} callback The callback method is invoked with three\n * parameters: the value of the element, the index\n * of the element, and the Range being traversed.\n */\n Range.prototype.forEach = function (callback) {\n var x = this.start;\n var step = this.step;\n var end = this.end;\n var i = 0;\n if (step > 0) {\n while (x < end) {\n callback(x, [i], this);\n x += step;\n i++;\n }\n } else if (step < 0) {\n while (x > end) {\n callback(x, [i], this);\n x += step;\n i++;\n }\n }\n };\n\n /**\n * Execute a callback function for each value in the Range, and return the\n * results as an array\n * @memberof Range\n * @param {function} callback The callback method is invoked with three\n * parameters: the value of the element, the index\n * of the element, and the Matrix being traversed.\n * @returns {Array} array\n */\n Range.prototype.map = function (callback) {\n var array = [];\n this.forEach(function (value, index, obj) {\n array[index[0]] = callback(value, index, obj);\n });\n return array;\n };\n\n /**\n * Create an Array with a copy of the Ranges data\n * @memberof Range\n * @returns {Array} array\n */\n Range.prototype.toArray = function () {\n var array = [];\n this.forEach(function (value, index) {\n array[index[0]] = value;\n });\n return array;\n };\n\n /**\n * Get the primitive value of the Range, a one dimensional array\n * @memberof Range\n * @returns {Array} array\n */\n Range.prototype.valueOf = function () {\n // TODO: implement a caching mechanism for range.valueOf()\n return this.toArray();\n };\n\n /**\n * Get a string representation of the range, with optional formatting options.\n * Output is formatted as 'start:step:end', for example '2:6' or '0:0.2:11'\n * @memberof Range\n * @param {Object | number | function} [options] Formatting options. See\n * lib/utils/number:format for a\n * description of the available\n * options.\n * @returns {string} str\n */\n Range.prototype.format = function (options) {\n var str = format(this.start, options);\n if (this.step !== 1) {\n str += ':' + format(this.step, options);\n }\n str += ':' + format(this.end, options);\n return str;\n };\n\n /**\n * Get a string representation of the range.\n * @memberof Range\n * @returns {string}\n */\n Range.prototype.toString = function () {\n return this.format();\n };\n\n /**\n * Get a JSON representation of the range\n * @memberof Range\n * @returns {Object} Returns a JSON object structured as:\n * `{\"mathjs\": \"Range\", \"start\": 2, \"end\": 4, \"step\": 1}`\n */\n Range.prototype.toJSON = function () {\n return {\n mathjs: 'Range',\n start: this.start,\n end: this.end,\n step: this.step\n };\n };\n\n /**\n * Instantiate a Range from a JSON object\n * @memberof Range\n * @param {Object} json A JSON object structured as:\n * `{\"mathjs\": \"Range\", \"start\": 2, \"end\": 4, \"step\": 1}`\n * @return {Range}\n */\n Range.fromJSON = function (json) {\n return new Range(json.start, json.end, json.step);\n };\n return Range;\n}, {\n isClass: true\n});","import { factory } from '../../utils/factory.js';\nvar name = 'Matrix';\nvar dependencies = [];\nexport var createMatrixClass = /* #__PURE__ */factory(name, dependencies, () => {\n /**\n * @constructor Matrix\n *\n * A Matrix is a wrapper around an Array. A matrix can hold a multi dimensional\n * array. A matrix can be constructed as:\n *\n * let matrix = math.matrix(data)\n *\n * Matrix contains the functions to resize, get and set values, get the size,\n * clone the matrix and to convert the matrix to a vector, array, or scalar.\n * Furthermore, one can iterate over the matrix using map and forEach.\n * The internal Array of the Matrix can be accessed using the function valueOf.\n *\n * Example usage:\n *\n * let matrix = math.matrix([[1, 2], [3, 4]])\n * matix.size() // [2, 2]\n * matrix.resize([3, 2], 5)\n * matrix.valueOf() // [[1, 2], [3, 4], [5, 5]]\n * matrix.subset([1,2]) // 3 (indexes are zero-based)\n *\n */\n function Matrix() {\n if (!(this instanceof Matrix)) {\n throw new SyntaxError('Constructor must be called with the new operator');\n }\n }\n\n /**\n * Attach type information\n */\n Matrix.prototype.type = 'Matrix';\n Matrix.prototype.isMatrix = true;\n\n /**\n * Get the storage format used by the matrix.\n *\n * Usage:\n * const format = matrix.storage() // retrieve storage format\n *\n * @return {string} The storage format.\n */\n Matrix.prototype.storage = function () {\n // must be implemented by each of the Matrix implementations\n throw new Error('Cannot invoke storage on a Matrix interface');\n };\n\n /**\n * Get the datatype of the data stored in the matrix.\n *\n * Usage:\n * const format = matrix.datatype() // retrieve matrix datatype\n *\n * @return {string} The datatype.\n */\n Matrix.prototype.datatype = function () {\n // must be implemented by each of the Matrix implementations\n throw new Error('Cannot invoke datatype on a Matrix interface');\n };\n\n /**\n * Create a new Matrix With the type of the current matrix instance\n * @param {Array | Object} data\n * @param {string} [datatype]\n */\n Matrix.prototype.create = function (data, datatype) {\n throw new Error('Cannot invoke create on a Matrix interface');\n };\n\n /**\n * Get a subset of the matrix, or replace a subset of the matrix.\n *\n * Usage:\n * const subset = matrix.subset(index) // retrieve subset\n * const value = matrix.subset(index, replacement) // replace subset\n *\n * @param {Index} index\n * @param {Array | Matrix | *} [replacement]\n * @param {*} [defaultValue=0] Default value, filled in on new entries when\n * the matrix is resized. If not provided,\n * new matrix elements will be filled with zeros.\n */\n Matrix.prototype.subset = function (index, replacement, defaultValue) {\n // must be implemented by each of the Matrix implementations\n throw new Error('Cannot invoke subset on a Matrix interface');\n };\n\n /**\n * Get a single element from the matrix.\n * @param {number[]} index Zero-based index\n * @return {*} value\n */\n Matrix.prototype.get = function (index) {\n // must be implemented by each of the Matrix implementations\n throw new Error('Cannot invoke get on a Matrix interface');\n };\n\n /**\n * Replace a single element in the matrix.\n * @param {number[]} index Zero-based index\n * @param {*} value\n * @param {*} [defaultValue] Default value, filled in on new entries when\n * the matrix is resized. If not provided,\n * new matrix elements will be left undefined.\n * @return {Matrix} self\n */\n Matrix.prototype.set = function (index, value, defaultValue) {\n // must be implemented by each of the Matrix implementations\n throw new Error('Cannot invoke set on a Matrix interface');\n };\n\n /**\n * Resize the matrix to the given size. Returns a copy of the matrix when\n * `copy=true`, otherwise return the matrix itself (resize in place).\n *\n * @param {number[]} size The new size the matrix should have.\n * @param {*} [defaultValue=0] Default value, filled in on new entries.\n * If not provided, the matrix elements will\n * be filled with zeros.\n * @param {boolean} [copy] Return a resized copy of the matrix\n *\n * @return {Matrix} The resized matrix\n */\n Matrix.prototype.resize = function (size, defaultValue) {\n // must be implemented by each of the Matrix implementations\n throw new Error('Cannot invoke resize on a Matrix interface');\n };\n\n /**\n * Reshape the matrix to the given size. Returns a copy of the matrix when\n * `copy=true`, otherwise return the matrix itself (reshape in place).\n *\n * @param {number[]} size The new size the matrix should have.\n * @param {boolean} [copy] Return a reshaped copy of the matrix\n *\n * @return {Matrix} The reshaped matrix\n */\n Matrix.prototype.reshape = function (size, defaultValue) {\n // must be implemented by each of the Matrix implementations\n throw new Error('Cannot invoke reshape on a Matrix interface');\n };\n\n /**\n * Create a clone of the matrix\n * @return {Matrix} clone\n */\n Matrix.prototype.clone = function () {\n // must be implemented by each of the Matrix implementations\n throw new Error('Cannot invoke clone on a Matrix interface');\n };\n\n /**\n * Retrieve the size of the matrix.\n * @returns {number[]} size\n */\n Matrix.prototype.size = function () {\n // must be implemented by each of the Matrix implementations\n throw new Error('Cannot invoke size on a Matrix interface');\n };\n\n /**\n * Create a new matrix with the results of the callback function executed on\n * each entry of the matrix.\n * @param {Function} callback The callback function is invoked with three\n * parameters: the value of the element, the index\n * of the element, and the Matrix being traversed.\n * @param {boolean} [skipZeros] Invoke callback function for non-zero values only.\n *\n * @return {Matrix} matrix\n */\n Matrix.prototype.map = function (callback, skipZeros) {\n // must be implemented by each of the Matrix implementations\n throw new Error('Cannot invoke map on a Matrix interface');\n };\n\n /**\n * Execute a callback function on each entry of the matrix.\n * @param {Function} callback The callback function is invoked with three\n * parameters: the value of the element, the index\n * of the element, and the Matrix being traversed.\n */\n Matrix.prototype.forEach = function (callback) {\n // must be implemented by each of the Matrix implementations\n throw new Error('Cannot invoke forEach on a Matrix interface');\n };\n\n /**\n * Iterate over the matrix elements\n * @return {Iterable<{ value, index: number[] }>}\n */\n Matrix.prototype[Symbol.iterator] = function () {\n // must be implemented by each of the Matrix implementations\n throw new Error('Cannot iterate a Matrix interface');\n };\n\n /**\n * Create an Array with a copy of the data of the Matrix\n * @returns {Array} array\n */\n Matrix.prototype.toArray = function () {\n // must be implemented by each of the Matrix implementations\n throw new Error('Cannot invoke toArray on a Matrix interface');\n };\n\n /**\n * Get the primitive value of the Matrix: a multidimensional array\n * @returns {Array} array\n */\n Matrix.prototype.valueOf = function () {\n // must be implemented by each of the Matrix implementations\n throw new Error('Cannot invoke valueOf on a Matrix interface');\n };\n\n /**\n * Get a string representation of the matrix, with optional formatting options.\n * @param {Object | number | Function} [options] Formatting options. See\n * lib/utils/number:format for a\n * description of the available\n * options.\n * @returns {string} str\n */\n Matrix.prototype.format = function (options) {\n // must be implemented by each of the Matrix implementations\n throw new Error('Cannot invoke format on a Matrix interface');\n };\n\n /**\n * Get a string representation of the matrix\n * @returns {string} str\n */\n Matrix.prototype.toString = function () {\n // must be implemented by each of the Matrix implementations\n throw new Error('Cannot invoke toString on a Matrix interface');\n };\n return Matrix;\n}, {\n isClass: true\n});","// (c) 2018, Mariusz Nowak\n// SPDX-License-Identifier: ISC\n// Derived from https://github.com/medikoo/lru-queue\nexport function lruQueue(limit) {\n var size = 0;\n var base = 1;\n var queue = Object.create(null);\n var map = Object.create(null);\n var index = 0;\n var del = function del(id) {\n var oldIndex = map[id];\n if (!oldIndex) return;\n delete queue[oldIndex];\n delete map[id];\n --size;\n if (base !== oldIndex) return;\n if (!size) {\n index = 0;\n base = 1;\n return;\n }\n while (!hasOwnProperty.call(queue, ++base)) continue;\n };\n limit = Math.abs(limit);\n return {\n hit: function hit(id) {\n var oldIndex = map[id];\n var nuIndex = ++index;\n queue[nuIndex] = id;\n map[id] = nuIndex;\n if (!oldIndex) {\n ++size;\n if (size <= limit) return undefined;\n id = queue[base];\n del(id);\n return id;\n }\n delete queue[oldIndex];\n if (base !== oldIndex) return undefined;\n while (!hasOwnProperty.call(queue, ++base)) continue;\n return undefined;\n },\n delete: del,\n clear: function clear() {\n size = index = 0;\n base = 1;\n queue = Object.create(null);\n map = Object.create(null);\n }\n };\n}","// function utils\n\nimport { lruQueue } from './lruQueue.js';\n\n/**\n * Memoize a given function by caching the computed result.\n * The cache of a memoized function can be cleared by deleting the `cache`\n * property of the function.\n *\n * @param {function} fn The function to be memoized.\n * Must be a pure function.\n * @param {Object} [options]\n * @param {function(args: Array): string} [options.hasher]\n * A custom hash builder. Is JSON.stringify by default.\n * @param {number | undefined} [options.limit]\n * Maximum number of values that may be cached. Undefined indicates\n * unlimited (default)\n * @return {function} Returns the memoized function\n */\nexport function memoize(fn) {\n var {\n hasher,\n limit\n } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n limit = limit == null ? Number.POSITIVE_INFINITY : limit;\n hasher = hasher == null ? JSON.stringify : hasher;\n return function memoize() {\n if (typeof memoize.cache !== 'object') {\n memoize.cache = {\n values: new Map(),\n lru: lruQueue(limit || Number.POSITIVE_INFINITY)\n };\n }\n var args = [];\n for (var i = 0; i < arguments.length; i++) {\n args[i] = arguments[i];\n }\n var hash = hasher(args);\n if (memoize.cache.values.has(hash)) {\n memoize.cache.lru.hit(hash);\n return memoize.cache.values.get(hash);\n }\n var newVal = fn.apply(fn, args);\n memoize.cache.values.set(hash, newVal);\n memoize.cache.values.delete(memoize.cache.lru.hit(hash));\n return newVal;\n };\n}\n\n/**\n * Memoize a given function by caching all results and the arguments,\n * and comparing against the arguments of previous results before\n * executing again.\n * This is less performant than `memoize` which calculates a hash,\n * which is very fast to compare. Use `memoizeCompare` only when it is\n * not possible to create a unique serializable hash from the function\n * arguments.\n * The isEqual function must compare two sets of arguments\n * and return true when equal (can be a deep equality check for example).\n * @param {function} fn\n * @param {function(a: *, b: *) : boolean} isEqual\n * @returns {function}\n */\nexport function memoizeCompare(fn, isEqual) {\n var memoize = function memoize() {\n var args = [];\n for (var i = 0; i < arguments.length; i++) {\n args[i] = arguments[i];\n }\n for (var c = 0; c < memoize.cache.length; c++) {\n var cached = memoize.cache[c];\n if (isEqual(args, cached.args)) {\n // TODO: move this cache entry to the top so recently used entries move up?\n return cached.res;\n }\n }\n var res = fn.apply(fn, args);\n memoize.cache.unshift({\n args,\n res\n });\n return res;\n };\n memoize.cache = [];\n return memoize;\n}\n\n/**\n * Find the maximum number of arguments expected by a typed function.\n * @param {function} fn A typed function\n * @return {number} Returns the maximum number of expected arguments.\n * Returns -1 when no signatures where found on the function.\n */\nexport function maxArgumentCount(fn) {\n return Object.keys(fn.signatures || {}).reduce(function (args, signature) {\n var count = (signature.match(/,/g) || []).length + 1;\n return Math.max(args, count);\n }, -1);\n}","import { isArray, isBigNumber, isCollection, isIndex, isMatrix, isNumber, isString, typeOf } from '../../utils/is.js';\nimport { arraySize, getArrayDataType, processSizesWildcard, reshape, resize, unsqueeze, validate, validateIndex } from '../../utils/array.js';\nimport { format } from '../../utils/string.js';\nimport { isInteger } from '../../utils/number.js';\nimport { clone, deepStrictEqual } from '../../utils/object.js';\nimport { DimensionError } from '../../error/DimensionError.js';\nimport { factory } from '../../utils/factory.js';\nimport { maxArgumentCount } from '../../utils/function.js';\nvar name = 'DenseMatrix';\nvar dependencies = ['Matrix'];\nexport var createDenseMatrixClass = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n Matrix\n } = _ref;\n /**\n * Dense Matrix implementation. A regular, dense matrix, supporting multi-dimensional matrices. This is the default matrix type.\n * @class DenseMatrix\n * @enum {{ value, index: number[] }}\n */\n function DenseMatrix(data, datatype) {\n if (!(this instanceof DenseMatrix)) {\n throw new SyntaxError('Constructor must be called with the new operator');\n }\n if (datatype && !isString(datatype)) {\n throw new Error('Invalid datatype: ' + datatype);\n }\n if (isMatrix(data)) {\n // check data is a DenseMatrix\n if (data.type === 'DenseMatrix') {\n // clone data & size\n this._data = clone(data._data);\n this._size = clone(data._size);\n this._datatype = datatype || data._datatype;\n } else {\n // build data from existing matrix\n this._data = data.toArray();\n this._size = data.size();\n this._datatype = datatype || data._datatype;\n }\n } else if (data && isArray(data.data) && isArray(data.size)) {\n // initialize fields from JSON representation\n this._data = data.data;\n this._size = data.size;\n // verify the dimensions of the array\n validate(this._data, this._size);\n this._datatype = datatype || data.datatype;\n } else if (isArray(data)) {\n // replace nested Matrices with Arrays\n this._data = preprocess(data);\n // get the dimensions of the array\n this._size = arraySize(this._data);\n // verify the dimensions of the array, TODO: compute size while processing array\n validate(this._data, this._size);\n // data type unknown\n this._datatype = datatype;\n } else if (data) {\n // unsupported type\n throw new TypeError('Unsupported type of data (' + typeOf(data) + ')');\n } else {\n // nothing provided\n this._data = [];\n this._size = [0];\n this._datatype = datatype;\n }\n }\n DenseMatrix.prototype = new Matrix();\n\n /**\n * Create a new DenseMatrix\n */\n DenseMatrix.prototype.createDenseMatrix = function (data, datatype) {\n return new DenseMatrix(data, datatype);\n };\n\n /**\n * Attach type information\n */\n Object.defineProperty(DenseMatrix, 'name', {\n value: 'DenseMatrix'\n });\n DenseMatrix.prototype.constructor = DenseMatrix;\n DenseMatrix.prototype.type = 'DenseMatrix';\n DenseMatrix.prototype.isDenseMatrix = true;\n\n /**\n * Get the matrix type\n *\n * Usage:\n * const matrixType = matrix.getDataType() // retrieves the matrix type\n *\n * @memberOf DenseMatrix\n * @return {string} type information; if multiple types are found from the Matrix, it will return \"mixed\"\n */\n DenseMatrix.prototype.getDataType = function () {\n return getArrayDataType(this._data, typeOf);\n };\n\n /**\n * Get the storage format used by the matrix.\n *\n * Usage:\n * const format = matrix.storage() // retrieve storage format\n *\n * @memberof DenseMatrix\n * @return {string} The storage format.\n */\n DenseMatrix.prototype.storage = function () {\n return 'dense';\n };\n\n /**\n * Get the datatype of the data stored in the matrix.\n *\n * Usage:\n * const format = matrix.datatype() // retrieve matrix datatype\n *\n * @memberof DenseMatrix\n * @return {string} The datatype.\n */\n DenseMatrix.prototype.datatype = function () {\n return this._datatype;\n };\n\n /**\n * Create a new DenseMatrix\n * @memberof DenseMatrix\n * @param {Array} data\n * @param {string} [datatype]\n */\n DenseMatrix.prototype.create = function (data, datatype) {\n return new DenseMatrix(data, datatype);\n };\n\n /**\n * Get a subset of the matrix, or replace a subset of the matrix.\n *\n * Usage:\n * const subset = matrix.subset(index) // retrieve subset\n * const value = matrix.subset(index, replacement) // replace subset\n *\n * @memberof DenseMatrix\n * @param {Index} index\n * @param {Array | Matrix | *} [replacement]\n * @param {*} [defaultValue=0] Default value, filled in on new entries when\n * the matrix is resized. If not provided,\n * new matrix elements will be filled with zeros.\n */\n DenseMatrix.prototype.subset = function (index, replacement, defaultValue) {\n switch (arguments.length) {\n case 1:\n return _get(this, index);\n\n // intentional fall through\n case 2:\n case 3:\n return _set(this, index, replacement, defaultValue);\n default:\n throw new SyntaxError('Wrong number of arguments');\n }\n };\n\n /**\n * Get a single element from the matrix.\n * @memberof DenseMatrix\n * @param {number[]} index Zero-based index\n * @return {*} value\n */\n DenseMatrix.prototype.get = function (index) {\n if (!isArray(index)) {\n throw new TypeError('Array expected');\n }\n if (index.length !== this._size.length) {\n throw new DimensionError(index.length, this._size.length);\n }\n\n // check index\n for (var x = 0; x < index.length; x++) {\n validateIndex(index[x], this._size[x]);\n }\n var data = this._data;\n for (var i = 0, ii = index.length; i < ii; i++) {\n var indexI = index[i];\n validateIndex(indexI, data.length);\n data = data[indexI];\n }\n return data;\n };\n\n /**\n * Replace a single element in the matrix.\n * @memberof DenseMatrix\n * @param {number[]} index Zero-based index\n * @param {*} value\n * @param {*} [defaultValue] Default value, filled in on new entries when\n * the matrix is resized. If not provided,\n * new matrix elements will be left undefined.\n * @return {DenseMatrix} self\n */\n DenseMatrix.prototype.set = function (index, value, defaultValue) {\n if (!isArray(index)) {\n throw new TypeError('Array expected');\n }\n if (index.length < this._size.length) {\n throw new DimensionError(index.length, this._size.length, '<');\n }\n var i, ii, indexI;\n\n // enlarge matrix when needed\n var size = index.map(function (i) {\n return i + 1;\n });\n _fit(this, size, defaultValue);\n\n // traverse over the dimensions\n var data = this._data;\n for (i = 0, ii = index.length - 1; i < ii; i++) {\n indexI = index[i];\n validateIndex(indexI, data.length);\n data = data[indexI];\n }\n\n // set new value\n indexI = index[index.length - 1];\n validateIndex(indexI, data.length);\n data[indexI] = value;\n return this;\n };\n\n /**\n * Get a submatrix of this matrix\n * @memberof DenseMatrix\n * @param {DenseMatrix} matrix\n * @param {Index} index Zero-based index\n * @private\n */\n function _get(matrix, index) {\n if (!isIndex(index)) {\n throw new TypeError('Invalid index');\n }\n var isScalar = index.isScalar();\n if (isScalar) {\n // return a scalar\n return matrix.get(index.min());\n } else {\n // validate dimensions\n var size = index.size();\n if (size.length !== matrix._size.length) {\n throw new DimensionError(size.length, matrix._size.length);\n }\n\n // validate if any of the ranges in the index is out of range\n var min = index.min();\n var max = index.max();\n for (var i = 0, ii = matrix._size.length; i < ii; i++) {\n validateIndex(min[i], matrix._size[i]);\n validateIndex(max[i], matrix._size[i]);\n }\n\n // retrieve submatrix\n // TODO: more efficient when creating an empty matrix and setting _data and _size manually\n return new DenseMatrix(_getSubmatrix(matrix._data, index, size.length, 0), matrix._datatype);\n }\n }\n\n /**\n * Recursively get a submatrix of a multi dimensional matrix.\n * Index is not checked for correct number or length of dimensions.\n * @memberof DenseMatrix\n * @param {Array} data\n * @param {Index} index\n * @param {number} dims Total number of dimensions\n * @param {number} dim Current dimension\n * @return {Array} submatrix\n * @private\n */\n function _getSubmatrix(data, index, dims, dim) {\n var last = dim === dims - 1;\n var range = index.dimension(dim);\n if (last) {\n return range.map(function (i) {\n validateIndex(i, data.length);\n return data[i];\n }).valueOf();\n } else {\n return range.map(function (i) {\n validateIndex(i, data.length);\n var child = data[i];\n return _getSubmatrix(child, index, dims, dim + 1);\n }).valueOf();\n }\n }\n\n /**\n * Replace a submatrix in this matrix\n * Indexes are zero-based.\n * @memberof DenseMatrix\n * @param {DenseMatrix} matrix\n * @param {Index} index\n * @param {DenseMatrix | Array | *} submatrix\n * @param {*} defaultValue Default value, filled in on new entries when\n * the matrix is resized.\n * @return {DenseMatrix} matrix\n * @private\n */\n function _set(matrix, index, submatrix, defaultValue) {\n if (!index || index.isIndex !== true) {\n throw new TypeError('Invalid index');\n }\n\n // get index size and check whether the index contains a single value\n var iSize = index.size();\n var isScalar = index.isScalar();\n\n // calculate the size of the submatrix, and convert it into an Array if needed\n var sSize;\n if (isMatrix(submatrix)) {\n sSize = submatrix.size();\n submatrix = submatrix.valueOf();\n } else {\n sSize = arraySize(submatrix);\n }\n if (isScalar) {\n // set a scalar\n\n // check whether submatrix is a scalar\n if (sSize.length !== 0) {\n throw new TypeError('Scalar expected');\n }\n matrix.set(index.min(), submatrix, defaultValue);\n } else {\n // set a submatrix\n\n // validate dimensions\n if (iSize.length < matrix._size.length) {\n throw new DimensionError(iSize.length, matrix._size.length, '<');\n }\n if (sSize.length < iSize.length) {\n // calculate number of missing outer dimensions\n var i = 0;\n var outer = 0;\n while (iSize[i] === 1 && sSize[i] === 1) {\n i++;\n }\n while (iSize[i] === 1) {\n outer++;\n i++;\n }\n\n // unsqueeze both outer and inner dimensions\n submatrix = unsqueeze(submatrix, iSize.length, outer, sSize);\n }\n\n // check whether the size of the submatrix matches the index size\n if (!deepStrictEqual(iSize, sSize)) {\n throw new DimensionError(iSize, sSize, '>');\n }\n\n // enlarge matrix when needed\n var size = index.max().map(function (i) {\n return i + 1;\n });\n _fit(matrix, size, defaultValue);\n\n // insert the sub matrix\n var dims = iSize.length;\n var dim = 0;\n _setSubmatrix(matrix._data, index, submatrix, dims, dim);\n }\n return matrix;\n }\n\n /**\n * Replace a submatrix of a multi dimensional matrix.\n * @memberof DenseMatrix\n * @param {Array} data\n * @param {Index} index\n * @param {Array} submatrix\n * @param {number} dims Total number of dimensions\n * @param {number} dim\n * @private\n */\n function _setSubmatrix(data, index, submatrix, dims, dim) {\n var last = dim === dims - 1;\n var range = index.dimension(dim);\n if (last) {\n range.forEach(function (dataIndex, subIndex) {\n validateIndex(dataIndex);\n data[dataIndex] = submatrix[subIndex[0]];\n });\n } else {\n range.forEach(function (dataIndex, subIndex) {\n validateIndex(dataIndex);\n _setSubmatrix(data[dataIndex], index, submatrix[subIndex[0]], dims, dim + 1);\n });\n }\n }\n\n /**\n * Resize the matrix to the given size. Returns a copy of the matrix when\n * `copy=true`, otherwise return the matrix itself (resize in place).\n *\n * @memberof DenseMatrix\n * @param {number[] || Matrix} size The new size the matrix should have.\n * @param {*} [defaultValue=0] Default value, filled in on new entries.\n * If not provided, the matrix elements will\n * be filled with zeros.\n * @param {boolean} [copy] Return a resized copy of the matrix\n *\n * @return {Matrix} The resized matrix\n */\n DenseMatrix.prototype.resize = function (size, defaultValue, copy) {\n // validate arguments\n if (!isCollection(size)) {\n throw new TypeError('Array or Matrix expected');\n }\n\n // SparseMatrix input is always 2d, flatten this into 1d if it's indeed a vector\n var sizeArray = size.valueOf().map(value => {\n return Array.isArray(value) && value.length === 1 ? value[0] : value;\n });\n\n // matrix to resize\n var m = copy ? this.clone() : this;\n // resize matrix\n return _resize(m, sizeArray, defaultValue);\n };\n function _resize(matrix, size, defaultValue) {\n // check size\n if (size.length === 0) {\n // first value in matrix\n var v = matrix._data;\n // go deep\n while (isArray(v)) {\n v = v[0];\n }\n return v;\n }\n // resize matrix\n matrix._size = size.slice(0); // copy the array\n matrix._data = resize(matrix._data, matrix._size, defaultValue);\n // return matrix\n return matrix;\n }\n\n /**\n * Reshape the matrix to the given size. Returns a copy of the matrix when\n * `copy=true`, otherwise return the matrix itself (reshape in place).\n *\n * NOTE: This might be better suited to copy by default, instead of modifying\n * in place. For now, it operates in place to remain consistent with\n * resize().\n *\n * @memberof DenseMatrix\n * @param {number[]} size The new size the matrix should have.\n * @param {boolean} [copy] Return a reshaped copy of the matrix\n *\n * @return {Matrix} The reshaped matrix\n */\n DenseMatrix.prototype.reshape = function (size, copy) {\n var m = copy ? this.clone() : this;\n m._data = reshape(m._data, size);\n var currentLength = m._size.reduce((length, size) => length * size);\n m._size = processSizesWildcard(size, currentLength);\n return m;\n };\n\n /**\n * Enlarge the matrix when it is smaller than given size.\n * If the matrix is larger or equal sized, nothing is done.\n * @memberof DenseMatrix\n * @param {DenseMatrix} matrix The matrix to be resized\n * @param {number[]} size\n * @param {*} defaultValue Default value, filled in on new entries.\n * @private\n */\n function _fit(matrix, size, defaultValue) {\n var\n // copy the array\n newSize = matrix._size.slice(0);\n var changed = false;\n\n // add dimensions when needed\n while (newSize.length < size.length) {\n newSize.push(0);\n changed = true;\n }\n\n // enlarge size when needed\n for (var i = 0, ii = size.length; i < ii; i++) {\n if (size[i] > newSize[i]) {\n newSize[i] = size[i];\n changed = true;\n }\n }\n if (changed) {\n // resize only when size is changed\n _resize(matrix, newSize, defaultValue);\n }\n }\n\n /**\n * Create a clone of the matrix\n * @memberof DenseMatrix\n * @return {DenseMatrix} clone\n */\n DenseMatrix.prototype.clone = function () {\n var m = new DenseMatrix({\n data: clone(this._data),\n size: clone(this._size),\n datatype: this._datatype\n });\n return m;\n };\n\n /**\n * Retrieve the size of the matrix.\n * @memberof DenseMatrix\n * @returns {number[]} size\n */\n DenseMatrix.prototype.size = function () {\n return this._size.slice(0); // return a clone of _size\n };\n\n /**\n * Create a new matrix with the results of the callback function executed on\n * each entry of the matrix.\n * @memberof DenseMatrix\n * @param {Function} callback The callback function is invoked with three\n * parameters: the value of the element, the index\n * of the element, and the Matrix being traversed.\n *\n * @return {DenseMatrix} matrix\n */\n DenseMatrix.prototype.map = function (callback) {\n // matrix instance\n var me = this;\n var args = maxArgumentCount(callback);\n var recurse = function recurse(value, index) {\n if (isArray(value)) {\n return value.map(function (child, i) {\n return recurse(child, index.concat(i));\n });\n } else {\n // invoke the callback function with the right number of arguments\n if (args === 1) {\n return callback(value);\n } else if (args === 2) {\n return callback(value, index);\n } else {\n // 3 or -1\n return callback(value, index, me);\n }\n }\n };\n\n // determine the new datatype when the original matrix has datatype defined\n // TODO: should be done in matrix constructor instead\n var data = recurse(this._data, []);\n var datatype = this._datatype !== undefined ? getArrayDataType(data, typeOf) : undefined;\n return new DenseMatrix(data, datatype);\n };\n\n /**\n * Execute a callback function on each entry of the matrix.\n * @memberof DenseMatrix\n * @param {Function} callback The callback function is invoked with three\n * parameters: the value of the element, the index\n * of the element, and the Matrix being traversed.\n */\n DenseMatrix.prototype.forEach = function (callback) {\n // matrix instance\n var me = this;\n var recurse = function recurse(value, index) {\n if (isArray(value)) {\n value.forEach(function (child, i) {\n recurse(child, index.concat(i));\n });\n } else {\n callback(value, index, me);\n }\n };\n recurse(this._data, []);\n };\n\n /**\n * Iterate over the matrix elements\n * @return {Iterable<{ value, index: number[] }>}\n */\n DenseMatrix.prototype[Symbol.iterator] = function* () {\n var recurse = function* recurse(value, index) {\n if (isArray(value)) {\n for (var i = 0; i < value.length; i++) {\n yield* recurse(value[i], index.concat(i));\n }\n } else {\n yield {\n value,\n index\n };\n }\n };\n yield* recurse(this._data, []);\n };\n\n /**\n * Returns an array containing the rows of a 2D matrix\n * @returns {Array}\n */\n DenseMatrix.prototype.rows = function () {\n var result = [];\n var s = this.size();\n if (s.length !== 2) {\n throw new TypeError('Rows can only be returned for a 2D matrix.');\n }\n var data = this._data;\n for (var row of data) {\n result.push(new DenseMatrix([row], this._datatype));\n }\n return result;\n };\n\n /**\n * Returns an array containing the columns of a 2D matrix\n * @returns {Array}\n */\n DenseMatrix.prototype.columns = function () {\n var _this = this;\n var result = [];\n var s = this.size();\n if (s.length !== 2) {\n throw new TypeError('Rows can only be returned for a 2D matrix.');\n }\n var data = this._data;\n var _loop = function _loop(i) {\n var col = data.map(row => [row[i]]);\n result.push(new DenseMatrix(col, _this._datatype));\n };\n for (var i = 0; i < s[1]; i++) {\n _loop(i);\n }\n return result;\n };\n\n /**\n * Create an Array with a copy of the data of the DenseMatrix\n * @memberof DenseMatrix\n * @returns {Array} array\n */\n DenseMatrix.prototype.toArray = function () {\n return clone(this._data);\n };\n\n /**\n * Get the primitive value of the DenseMatrix: a multidimensional array\n * @memberof DenseMatrix\n * @returns {Array} array\n */\n DenseMatrix.prototype.valueOf = function () {\n return this._data;\n };\n\n /**\n * Get a string representation of the matrix, with optional formatting options.\n * @memberof DenseMatrix\n * @param {Object | number | Function} [options] Formatting options. See\n * lib/utils/number:format for a\n * description of the available\n * options.\n * @returns {string} str\n */\n DenseMatrix.prototype.format = function (options) {\n return format(this._data, options);\n };\n\n /**\n * Get a string representation of the matrix\n * @memberof DenseMatrix\n * @returns {string} str\n */\n DenseMatrix.prototype.toString = function () {\n return format(this._data);\n };\n\n /**\n * Get a JSON representation of the matrix\n * @memberof DenseMatrix\n * @returns {Object}\n */\n DenseMatrix.prototype.toJSON = function () {\n return {\n mathjs: 'DenseMatrix',\n data: this._data,\n size: this._size,\n datatype: this._datatype\n };\n };\n\n /**\n * Get the kth Matrix diagonal.\n *\n * @memberof DenseMatrix\n * @param {number | BigNumber} [k=0] The kth diagonal where the vector will retrieved.\n *\n * @returns {Matrix} The matrix with the diagonal values.\n */\n DenseMatrix.prototype.diagonal = function (k) {\n // validate k if any\n if (k) {\n // convert BigNumber to a number\n if (isBigNumber(k)) {\n k = k.toNumber();\n }\n // is must be an integer\n if (!isNumber(k) || !isInteger(k)) {\n throw new TypeError('The parameter k must be an integer number');\n }\n } else {\n // default value\n k = 0;\n }\n var kSuper = k > 0 ? k : 0;\n var kSub = k < 0 ? -k : 0;\n\n // rows & columns\n var rows = this._size[0];\n var columns = this._size[1];\n\n // number diagonal values\n var n = Math.min(rows - kSub, columns - kSuper);\n\n // x is a matrix get diagonal from matrix\n var data = [];\n\n // loop rows\n for (var i = 0; i < n; i++) {\n data[i] = this._data[i + kSub][i + kSuper];\n }\n\n // create DenseMatrix\n return new DenseMatrix({\n data,\n size: [n],\n datatype: this._datatype\n });\n };\n\n /**\n * Create a diagonal matrix.\n *\n * @memberof DenseMatrix\n * @param {Array} size The matrix size.\n * @param {number | Matrix | Array } value The values for the diagonal.\n * @param {number | BigNumber} [k=0] The kth diagonal where the vector will be filled in.\n * @param {number} [defaultValue] The default value for non-diagonal\n * @param {string} [datatype] The datatype for the diagonal\n *\n * @returns {DenseMatrix}\n */\n DenseMatrix.diagonal = function (size, value, k, defaultValue) {\n if (!isArray(size)) {\n throw new TypeError('Array expected, size parameter');\n }\n if (size.length !== 2) {\n throw new Error('Only two dimensions matrix are supported');\n }\n\n // map size & validate\n size = size.map(function (s) {\n // check it is a big number\n if (isBigNumber(s)) {\n // convert it\n s = s.toNumber();\n }\n // validate arguments\n if (!isNumber(s) || !isInteger(s) || s < 1) {\n throw new Error('Size values must be positive integers');\n }\n return s;\n });\n\n // validate k if any\n if (k) {\n // convert BigNumber to a number\n if (isBigNumber(k)) {\n k = k.toNumber();\n }\n // is must be an integer\n if (!isNumber(k) || !isInteger(k)) {\n throw new TypeError('The parameter k must be an integer number');\n }\n } else {\n // default value\n k = 0;\n }\n var kSuper = k > 0 ? k : 0;\n var kSub = k < 0 ? -k : 0;\n\n // rows and columns\n var rows = size[0];\n var columns = size[1];\n\n // number of non-zero items\n var n = Math.min(rows - kSub, columns - kSuper);\n\n // value extraction function\n var _value;\n\n // check value\n if (isArray(value)) {\n // validate array\n if (value.length !== n) {\n // number of values in array must be n\n throw new Error('Invalid value array length');\n }\n // define function\n _value = function _value(i) {\n // return value @ i\n return value[i];\n };\n } else if (isMatrix(value)) {\n // matrix size\n var ms = value.size();\n // validate matrix\n if (ms.length !== 1 || ms[0] !== n) {\n // number of values in array must be n\n throw new Error('Invalid matrix length');\n }\n // define function\n _value = function _value(i) {\n // return value @ i\n return value.get([i]);\n };\n } else {\n // define function\n _value = function _value() {\n // return value\n return value;\n };\n }\n\n // discover default value if needed\n if (!defaultValue) {\n // check first value in array\n defaultValue = isBigNumber(_value(0)) ? _value(0).mul(0) // trick to create a BigNumber with value zero\n : 0;\n }\n\n // empty array\n var data = [];\n\n // check we need to resize array\n if (size.length > 0) {\n // resize array\n data = resize(data, size, defaultValue);\n // fill diagonal\n for (var d = 0; d < n; d++) {\n data[d + kSub][d + kSuper] = _value(d);\n }\n }\n\n // create DenseMatrix\n return new DenseMatrix({\n data,\n size: [rows, columns]\n });\n };\n\n /**\n * Generate a matrix from a JSON object\n * @memberof DenseMatrix\n * @param {Object} json An object structured like\n * `{\"mathjs\": \"DenseMatrix\", data: [], size: []}`,\n * where mathjs is optional\n * @returns {DenseMatrix}\n */\n DenseMatrix.fromJSON = function (json) {\n return new DenseMatrix(json);\n };\n\n /**\n * Swap rows i and j in Matrix.\n *\n * @memberof DenseMatrix\n * @param {number} i Matrix row index 1\n * @param {number} j Matrix row index 2\n *\n * @return {Matrix} The matrix reference\n */\n DenseMatrix.prototype.swapRows = function (i, j) {\n // check index\n if (!isNumber(i) || !isInteger(i) || !isNumber(j) || !isInteger(j)) {\n throw new Error('Row index must be positive integers');\n }\n // check dimensions\n if (this._size.length !== 2) {\n throw new Error('Only two dimensional matrix is supported');\n }\n // validate index\n validateIndex(i, this._size[0]);\n validateIndex(j, this._size[0]);\n\n // swap rows\n DenseMatrix._swapRows(i, j, this._data);\n // return current instance\n return this;\n };\n\n /**\n * Swap rows i and j in Dense Matrix data structure.\n *\n * @param {number} i Matrix row index 1\n * @param {number} j Matrix row index 2\n * @param {Array} data Matrix data\n */\n DenseMatrix._swapRows = function (i, j, data) {\n // swap values i <-> j\n var vi = data[i];\n data[i] = data[j];\n data[j] = vi;\n };\n\n /**\n * Preprocess data, which can be an Array or DenseMatrix with nested Arrays and\n * Matrices. Replaces all nested Matrices with Arrays\n * @memberof DenseMatrix\n * @param {Array} data\n * @return {Array} data\n */\n function preprocess(data) {\n for (var i = 0, ii = data.length; i < ii; i++) {\n var elem = data[i];\n if (isArray(elem)) {\n data[i] = preprocess(elem);\n } else if (elem && elem.isMatrix === true) {\n data[i] = preprocess(elem.valueOf());\n }\n }\n return data;\n }\n return DenseMatrix;\n}, {\n isClass: true\n});","import { clone as objectClone } from '../../utils/object.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'clone';\nvar dependencies = ['typed'];\nexport var createClone = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed\n } = _ref;\n /**\n * Clone an object. Will make a deep copy of the data.\n *\n * Syntax:\n *\n * math.clone(x)\n *\n * Examples:\n *\n * math.clone(3.5) // returns number 3.5\n * math.clone(math.complex('2-4i')) // returns Complex 2 - 4i\n * math.clone(math.unit(45, 'deg')) // returns Unit 45 deg\n * math.clone([[1, 2], [3, 4]]) // returns Array [[1, 2], [3, 4]]\n * math.clone(\"hello world\") // returns string \"hello world\"\n *\n * @param {*} x Object to be cloned\n * @return {*} A clone of object x\n */\n return typed(name, {\n any: objectClone\n });\n});","/**\n * Transpose a matrix\n * @param {Array} mat\n * @returns {Array} ret\n * @private\n */\nexport function _switch(mat) {\n var I = mat.length;\n var J = mat[0].length;\n var i, j;\n var ret = [];\n for (j = 0; j < J; j++) {\n var tmp = [];\n for (i = 0; i < I; i++) {\n tmp.push(mat[i][j]);\n }\n ret.push(tmp);\n }\n return ret;\n}","import { isCollection, isMatrix } from './is.js';\nimport { IndexError } from '../error/IndexError.js';\nimport { arraySize } from './array.js';\nimport { _switch } from './switch.js';\n\n/**\n * Test whether an array contains collections\n * @param {Array} array\n * @returns {boolean} Returns true when the array contains one or multiple\n * collections (Arrays or Matrices). Returns false otherwise.\n */\nexport function containsCollections(array) {\n for (var i = 0; i < array.length; i++) {\n if (isCollection(array[i])) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Recursively loop over all elements in a given multi dimensional array\n * and invoke the callback on each of the elements.\n * @param {Array | Matrix} array\n * @param {Function} callback The callback method is invoked with one\n * parameter: the current element in the array\n */\nexport function deepForEach(array, callback) {\n if (isMatrix(array)) {\n array = array.valueOf();\n }\n for (var i = 0, ii = array.length; i < ii; i++) {\n var value = array[i];\n if (Array.isArray(value)) {\n deepForEach(value, callback);\n } else {\n callback(value);\n }\n }\n}\n\n/**\n * Execute the callback function element wise for each element in array and any\n * nested array\n * Returns an array with the results\n * @param {Array | Matrix} array\n * @param {Function} callback The callback is called with two parameters:\n * value1 and value2, which contain the current\n * element of both arrays.\n * @param {boolean} [skipZeros] Invoke callback function for non-zero values only.\n *\n * @return {Array | Matrix} res\n */\nexport function deepMap(array, callback, skipZeros) {\n if (array && typeof array.map === 'function') {\n // TODO: replace array.map with a for loop to improve performance\n return array.map(function (x) {\n return deepMap(x, callback, skipZeros);\n });\n } else {\n return callback(array);\n }\n}\n\n/**\n * Reduce a given matrix or array to a new matrix or\n * array with one less dimension, applying the given\n * callback in the selected dimension.\n * @param {Array | Matrix} mat\n * @param {number} dim\n * @param {Function} callback\n * @return {Array | Matrix} res\n */\nexport function reduce(mat, dim, callback) {\n var size = Array.isArray(mat) ? arraySize(mat) : mat.size();\n if (dim < 0 || dim >= size.length) {\n // TODO: would be more clear when throwing a DimensionError here\n throw new IndexError(dim, size.length);\n }\n if (isMatrix(mat)) {\n return mat.create(_reduce(mat.valueOf(), dim, callback));\n } else {\n return _reduce(mat, dim, callback);\n }\n}\n\n/**\n * Recursively reduce a matrix\n * @param {Array} mat\n * @param {number} dim\n * @param {Function} callback\n * @returns {Array} ret\n * @private\n */\nfunction _reduce(mat, dim, callback) {\n var i, ret, val, tran;\n if (dim <= 0) {\n if (!Array.isArray(mat[0])) {\n val = mat[0];\n for (i = 1; i < mat.length; i++) {\n val = callback(val, mat[i]);\n }\n return val;\n } else {\n tran = _switch(mat);\n ret = [];\n for (i = 0; i < tran.length; i++) {\n ret[i] = _reduce(tran[i], dim - 1, callback);\n }\n return ret;\n }\n } else {\n ret = [];\n for (i = 0; i < mat.length; i++) {\n ret[i] = _reduce(mat[i], dim - 1, callback);\n }\n return ret;\n }\n}\n\n// TODO: document function scatter\nexport function scatter(a, j, w, x, u, mark, cindex, f, inverse, update, value) {\n // a arrays\n var avalues = a._values;\n var aindex = a._index;\n var aptr = a._ptr;\n\n // vars\n var k, k0, k1, i;\n\n // check we need to process values (pattern matrix)\n if (x) {\n // values in j\n for (k0 = aptr[j], k1 = aptr[j + 1], k = k0; k < k1; k++) {\n // row\n i = aindex[k];\n // check value exists in current j\n if (w[i] !== mark) {\n // i is new entry in j\n w[i] = mark;\n // add i to pattern of C\n cindex.push(i);\n // x(i) = A, check we need to call function this time\n if (update) {\n // copy value to workspace calling callback function\n x[i] = inverse ? f(avalues[k], value) : f(value, avalues[k]);\n // function was called on current row\n u[i] = mark;\n } else {\n // copy value to workspace\n x[i] = avalues[k];\n }\n } else {\n // i exists in C already\n x[i] = inverse ? f(avalues[k], x[i]) : f(x[i], avalues[k]);\n // function was called on current row\n u[i] = mark;\n }\n }\n } else {\n // values in j\n for (k0 = aptr[j], k1 = aptr[j + 1], k = k0; k < k1; k++) {\n // row\n i = aindex[k];\n // check value exists in current j\n if (w[i] !== mark) {\n // i is new entry in j\n w[i] = mark;\n // add i to pattern of C\n cindex.push(i);\n } else {\n // indicate function was called on current row\n u[i] = mark;\n }\n }\n }\n}","import { deepMap } from '../../utils/collection.js';\nimport { isInteger as isIntegerNumber } from '../../utils/number.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'isInteger';\nvar dependencies = ['typed'];\nexport var createIsInteger = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed\n } = _ref;\n /**\n * Test whether a value is an integer number.\n * The function supports `number`, `BigNumber`, and `Fraction`.\n *\n * The function is evaluated element-wise in case of Array or Matrix input.\n *\n * Syntax:\n *\n * math.isInteger(x)\n *\n * Examples:\n *\n * math.isInteger(2) // returns true\n * math.isInteger(0) // returns true\n * math.isInteger(0.5) // returns false\n * math.isInteger(math.bignumber(500)) // returns true\n * math.isInteger(math.fraction(4)) // returns true\n * math.isInteger('3') // returns true\n * math.isInteger([3, 0.5, -2]) // returns [true, false, true]\n * math.isInteger(math.complex('2-4i')) // throws an error\n *\n * See also:\n *\n * isNumeric, isPositive, isNegative, isZero\n *\n * @param {number | BigNumber | Fraction | Array | Matrix} x Value to be tested\n * @return {boolean} Returns true when `x` contains a numeric, integer value.\n * Throws an error in case of an unknown data type.\n */\n return typed(name, {\n number: isIntegerNumber,\n // TODO: what to do with isInteger(add(0.1, 0.2)) ?\n\n BigNumber: function BigNumber(x) {\n return x.isInt();\n },\n Fraction: function Fraction(x) {\n return x.d === 1 && isFinite(x.n);\n },\n 'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self))\n });\n});","import { cbrt, expm1, isInteger, log10, log1p, log2, sign, toFixed } from '../../utils/number.js';\nvar n1 = 'number';\nvar n2 = 'number, number';\nexport function absNumber(a) {\n return Math.abs(a);\n}\nabsNumber.signature = n1;\nexport function addNumber(a, b) {\n return a + b;\n}\naddNumber.signature = n2;\nexport function subtractNumber(a, b) {\n return a - b;\n}\nsubtractNumber.signature = n2;\nexport function multiplyNumber(a, b) {\n return a * b;\n}\nmultiplyNumber.signature = n2;\nexport function divideNumber(a, b) {\n return a / b;\n}\ndivideNumber.signature = n2;\nexport function unaryMinusNumber(x) {\n return -x;\n}\nunaryMinusNumber.signature = n1;\nexport function unaryPlusNumber(x) {\n return x;\n}\nunaryPlusNumber.signature = n1;\nexport function cbrtNumber(x) {\n return cbrt(x);\n}\ncbrtNumber.signature = n1;\nexport function cubeNumber(x) {\n return x * x * x;\n}\ncubeNumber.signature = n1;\nexport function expNumber(x) {\n return Math.exp(x);\n}\nexpNumber.signature = n1;\nexport function expm1Number(x) {\n return expm1(x);\n}\nexpm1Number.signature = n1;\n\n/**\n * Calculate gcd for numbers\n * @param {number} a\n * @param {number} b\n * @returns {number} Returns the greatest common denominator of a and b\n */\nexport function gcdNumber(a, b) {\n if (!isInteger(a) || !isInteger(b)) {\n throw new Error('Parameters in function gcd must be integer numbers');\n }\n\n // https://en.wikipedia.org/wiki/Euclidean_algorithm\n var r;\n while (b !== 0) {\n r = a % b;\n a = b;\n b = r;\n }\n return a < 0 ? -a : a;\n}\ngcdNumber.signature = n2;\n\n/**\n * Calculate lcm for two numbers\n * @param {number} a\n * @param {number} b\n * @returns {number} Returns the least common multiple of a and b\n */\nexport function lcmNumber(a, b) {\n if (!isInteger(a) || !isInteger(b)) {\n throw new Error('Parameters in function lcm must be integer numbers');\n }\n if (a === 0 || b === 0) {\n return 0;\n }\n\n // https://en.wikipedia.org/wiki/Euclidean_algorithm\n // evaluate lcm here inline to reduce overhead\n var t;\n var prod = a * b;\n while (b !== 0) {\n t = b;\n b = a % t;\n a = t;\n }\n return Math.abs(prod / a);\n}\nlcmNumber.signature = n2;\n\n/**\n * Calculate the logarithm of a value, optionally to a given base.\n * @param {number} x\n * @param {number | null | undefined} base\n * @return {number}\n */\nexport function logNumber(x, y) {\n if (y) {\n return Math.log(x) / Math.log(y);\n }\n return Math.log(x);\n}\n\n/**\n * Calculate the 10-base logarithm of a number\n * @param {number} x\n * @return {number}\n */\nexport function log10Number(x) {\n return log10(x);\n}\nlog10Number.signature = n1;\n\n/**\n * Calculate the 2-base logarithm of a number\n * @param {number} x\n * @return {number}\n */\nexport function log2Number(x) {\n return log2(x);\n}\nlog2Number.signature = n1;\n\n/**\n * Calculate the natural logarithm of a `number+1`\n * @param {number} x\n * @returns {number}\n */\nexport function log1pNumber(x) {\n return log1p(x);\n}\nlog1pNumber.signature = n1;\n\n/**\n * Calculate the modulus of two numbers\n * @param {number} x\n * @param {number} y\n * @returns {number} res\n * @private\n */\nexport function modNumber(x, y) {\n if (y > 0) {\n // We don't use JavaScript's % operator here as this doesn't work\n // correctly for x < 0 and x === 0\n // see https://en.wikipedia.org/wiki/Modulo_operation\n return x - y * Math.floor(x / y);\n } else if (y === 0) {\n return x;\n } else {\n // y < 0\n // TODO: implement mod for a negative divisor\n throw new Error('Cannot calculate mod for a negative divisor');\n }\n}\nmodNumber.signature = n2;\n\n/**\n * Calculate the nth root of a, solve x^root == a\n * http://rosettacode.org/wiki/Nth_root#JavaScript\n * @param {number} a\n * @param {number} [2] root\n * @private\n */\nexport function nthRootNumber(a) {\n var root = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 2;\n var inv = root < 0;\n if (inv) {\n root = -root;\n }\n if (root === 0) {\n throw new Error('Root must be non-zero');\n }\n if (a < 0 && Math.abs(root) % 2 !== 1) {\n throw new Error('Root must be odd when a is negative.');\n }\n\n // edge cases zero and infinity\n if (a === 0) {\n return inv ? Infinity : 0;\n }\n if (!isFinite(a)) {\n return inv ? 0 : a;\n }\n var x = Math.pow(Math.abs(a), 1 / root);\n // If a < 0, we require that root is an odd integer,\n // so (-1) ^ (1/root) = -1\n x = a < 0 ? -x : x;\n return inv ? 1 / x : x;\n\n // Very nice algorithm, but fails with nthRoot(-2, 3).\n // Newton's method has some well-known problems at times:\n // https://en.wikipedia.org/wiki/Newton%27s_method#Failure_analysis\n /*\n let x = 1 // Initial guess\n let xPrev = 1\n let i = 0\n const iMax = 10000\n do {\n const delta = (a / Math.pow(x, root - 1) - x) / root\n xPrev = x\n x = x + delta\n i++\n }\n while (xPrev !== x && i < iMax)\n if (xPrev !== x) {\n throw new Error('Function nthRoot failed to converge')\n }\n return inv ? 1 / x : x\n */\n}\n\nexport function signNumber(x) {\n return sign(x);\n}\nsignNumber.signature = n1;\nexport function sqrtNumber(x) {\n return Math.sqrt(x);\n}\nsqrtNumber.signature = n1;\nexport function squareNumber(x) {\n return x * x;\n}\nsquareNumber.signature = n1;\n\n/**\n * Calculate xgcd for two numbers\n * @param {number} a\n * @param {number} b\n * @return {number} result\n * @private\n */\nexport function xgcdNumber(a, b) {\n // source: https://en.wikipedia.org/wiki/Extended_Euclidean_algorithm\n var t; // used to swap two variables\n var q; // quotient\n var r; // remainder\n var x = 0;\n var lastx = 1;\n var y = 1;\n var lasty = 0;\n if (!isInteger(a) || !isInteger(b)) {\n throw new Error('Parameters in function xgcd must be integer numbers');\n }\n while (b) {\n q = Math.floor(a / b);\n r = a - q * b;\n t = x;\n x = lastx - q * x;\n lastx = t;\n t = y;\n y = lasty - q * y;\n lasty = t;\n a = b;\n b = r;\n }\n var res;\n if (a < 0) {\n res = [-a, -lastx, -lasty];\n } else {\n res = [a, a ? lastx : 0, lasty];\n }\n return res;\n}\nxgcdNumber.signature = n2;\n\n/**\n * Calculates the power of x to y, x^y, for two numbers.\n * @param {number} x\n * @param {number} y\n * @return {number} res\n */\nexport function powNumber(x, y) {\n // x^Infinity === 0 if -1 < x < 1\n // A real number 0 is returned instead of complex(0)\n if (x * x < 1 && y === Infinity || x * x > 1 && y === -Infinity) {\n return 0;\n }\n return Math.pow(x, y);\n}\npowNumber.signature = n2;\n\n/**\n * round a number to the given number of decimals, or to zero if decimals is\n * not provided\n * @param {number} value\n * @param {number} decimals number of decimals, between 0 and 15 (0 by default)\n * @return {number} roundedValue\n */\nexport function roundNumber(value) {\n var decimals = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n if (!isInteger(decimals) || decimals < 0 || decimals > 15) {\n throw new Error('Number of decimals in function round must be an integer from 0 to 15 inclusive');\n }\n return parseFloat(toFixed(value, decimals));\n}\n\n/**\n * Calculate the norm of a number, the absolute value.\n * @param {number} x\n * @return {number}\n */\nexport function normNumber(x) {\n return Math.abs(x);\n}\nnormNumber.signature = n1;","import { isInteger } from '../../utils/number.js';\nvar n1 = 'number';\nvar n2 = 'number, number';\nexport function bitAndNumber(x, y) {\n if (!isInteger(x) || !isInteger(y)) {\n throw new Error('Integers expected in function bitAnd');\n }\n return x & y;\n}\nbitAndNumber.signature = n2;\nexport function bitNotNumber(x) {\n if (!isInteger(x)) {\n throw new Error('Integer expected in function bitNot');\n }\n return ~x;\n}\nbitNotNumber.signature = n1;\nexport function bitOrNumber(x, y) {\n if (!isInteger(x) || !isInteger(y)) {\n throw new Error('Integers expected in function bitOr');\n }\n return x | y;\n}\nbitOrNumber.signature = n2;\nexport function bitXorNumber(x, y) {\n if (!isInteger(x) || !isInteger(y)) {\n throw new Error('Integers expected in function bitXor');\n }\n return x ^ y;\n}\nbitXorNumber.signature = n2;\nexport function leftShiftNumber(x, y) {\n if (!isInteger(x) || !isInteger(y)) {\n throw new Error('Integers expected in function leftShift');\n }\n return x << y;\n}\nleftShiftNumber.signature = n2;\nexport function rightArithShiftNumber(x, y) {\n if (!isInteger(x) || !isInteger(y)) {\n throw new Error('Integers expected in function rightArithShift');\n }\n return x >> y;\n}\nrightArithShiftNumber.signature = n2;\nexport function rightLogShiftNumber(x, y) {\n if (!isInteger(x) || !isInteger(y)) {\n throw new Error('Integers expected in function rightLogShift');\n }\n return x >>> y;\n}\nrightLogShiftNumber.signature = n2;","/** @param {number} i\n * @param {number} n\n * @returns {number} product of i to n\n */\nexport function product(i, n) {\n if (n < i) {\n return 1;\n }\n if (n === i) {\n return n;\n }\n var half = n + i >> 1; // divide (n + i) by 2 and truncate to integer\n return product(i, half) * product(half + 1, n);\n}","import { isInteger } from '../../utils/number.js';\nimport { product } from '../../utils/product.js';\nexport function combinationsNumber(n, k) {\n if (!isInteger(n) || n < 0) {\n throw new TypeError('Positive integer value expected in function combinations');\n }\n if (!isInteger(k) || k < 0) {\n throw new TypeError('Positive integer value expected in function combinations');\n }\n if (k > n) {\n throw new TypeError('k must be less than or equal to n');\n }\n var nMinusk = n - k;\n var answer = 1;\n var firstnumerator = k < nMinusk ? nMinusk + 1 : k + 1;\n var nextdivisor = 2;\n var lastdivisor = k < nMinusk ? k : nMinusk;\n // balance multiplications and divisions to try to keep intermediate values\n // in exact-integer range as long as possible\n for (var nextnumerator = firstnumerator; nextnumerator <= n; ++nextnumerator) {\n answer *= nextnumerator;\n while (nextdivisor <= lastdivisor && answer % nextdivisor === 0) {\n answer /= nextdivisor;\n ++nextdivisor;\n }\n }\n // for big n, k, floating point may have caused weirdness in remainder\n if (nextdivisor <= lastdivisor) {\n answer /= product(nextdivisor, lastdivisor);\n }\n return answer;\n}\ncombinationsNumber.signature = 'number, number';","export var pi = Math.PI;\nexport var tau = 2 * Math.PI;\nexport var e = Math.E;\nexport var phi = 1.6180339887498948; // eslint-disable-line no-loss-of-precision","var n1 = 'number';\nvar n2 = 'number, number';\nexport function notNumber(x) {\n return !x;\n}\nnotNumber.signature = n1;\nexport function orNumber(x, y) {\n return !!(x || y);\n}\norNumber.signature = n2;\nexport function xorNumber(x, y) {\n return !!x !== !!y;\n}\nxorNumber.signature = n2;\nexport function andNumber(x, y) {\n return !!(x && y);\n}\nandNumber.signature = n2;","/* eslint-disable no-loss-of-precision */\n\nimport { isInteger } from '../../utils/number.js';\nimport { product } from '../../utils/product.js';\nexport function gammaNumber(n) {\n var x;\n if (isInteger(n)) {\n if (n <= 0) {\n return isFinite(n) ? Infinity : NaN;\n }\n if (n > 171) {\n return Infinity; // Will overflow\n }\n\n return product(1, n - 1);\n }\n if (n < 0.5) {\n return Math.PI / (Math.sin(Math.PI * n) * gammaNumber(1 - n));\n }\n if (n >= 171.35) {\n return Infinity; // will overflow\n }\n\n if (n > 85.0) {\n // Extended Stirling Approx\n var twoN = n * n;\n var threeN = twoN * n;\n var fourN = threeN * n;\n var fiveN = fourN * n;\n return Math.sqrt(2 * Math.PI / n) * Math.pow(n / Math.E, n) * (1 + 1 / (12 * n) + 1 / (288 * twoN) - 139 / (51840 * threeN) - 571 / (2488320 * fourN) + 163879 / (209018880 * fiveN) + 5246819 / (75246796800 * fiveN * n));\n }\n --n;\n x = gammaP[0];\n for (var i = 1; i < gammaP.length; ++i) {\n x += gammaP[i] / (n + i);\n }\n var t = n + gammaG + 0.5;\n return Math.sqrt(2 * Math.PI) * Math.pow(t, n + 0.5) * Math.exp(-t) * x;\n}\ngammaNumber.signature = 'number';\n\n// TODO: comment on the variables g and p\n\nexport var gammaG = 4.7421875;\nexport var gammaP = [0.99999999999999709182, 57.156235665862923517, -59.597960355475491248, 14.136097974741747174, -0.49191381609762019978, 0.33994649984811888699e-4, 0.46523628927048575665e-4, -0.98374475304879564677e-4, 0.15808870322491248884e-3, -0.21026444172410488319e-3, 0.21743961811521264320e-3, -0.16431810653676389022e-3, 0.84418223983852743293e-4, -0.26190838401581408670e-4, 0.36899182659531622704e-5];\n\n// lgamma implementation ref: https://mrob.com/pub/ries/lanczos-gamma.html#code\n\n// log(2 * pi) / 2\nexport var lnSqrt2PI = 0.91893853320467274178;\nexport var lgammaG = 5; // Lanczos parameter \"g\"\nexport var lgammaN = 7; // Range of coefficients \"n\"\n\nexport var lgammaSeries = [1.000000000190015, 76.18009172947146, -86.50532032941677, 24.01409824083091, -1.231739572450155, 0.1208650973866179e-2, -0.5395239384953e-5];\nexport function lgammaNumber(n) {\n if (n < 0) return NaN;\n if (n === 0) return Infinity;\n if (!isFinite(n)) return n;\n if (n < 0.5) {\n // Use Euler's reflection formula:\n // gamma(z) = PI / (sin(PI * z) * gamma(1 - z))\n return Math.log(Math.PI / Math.sin(Math.PI * n)) - lgammaNumber(1 - n);\n }\n\n // Compute the logarithm of the Gamma function using the Lanczos method\n\n n = n - 1;\n var base = n + lgammaG + 0.5; // Base of the Lanczos exponential\n var sum = lgammaSeries[0];\n\n // We start with the terms that have the smallest coefficients and largest denominator\n for (var i = lgammaN - 1; i >= 1; i--) {\n sum += lgammaSeries[i] / (n + i);\n }\n return lnSqrt2PI + (n + 0.5) * Math.log(base) - base + Math.log(sum);\n}\nlgammaNumber.signature = 'number';","import { acosh, asinh, atanh, cosh, sign, sinh, tanh } from '../../utils/number.js';\nvar n1 = 'number';\nvar n2 = 'number, number';\nexport function acosNumber(x) {\n return Math.acos(x);\n}\nacosNumber.signature = n1;\nexport function acoshNumber(x) {\n return acosh(x);\n}\nacoshNumber.signature = n1;\nexport function acotNumber(x) {\n return Math.atan(1 / x);\n}\nacotNumber.signature = n1;\nexport function acothNumber(x) {\n return isFinite(x) ? (Math.log((x + 1) / x) + Math.log(x / (x - 1))) / 2 : 0;\n}\nacothNumber.signature = n1;\nexport function acscNumber(x) {\n return Math.asin(1 / x);\n}\nacscNumber.signature = n1;\nexport function acschNumber(x) {\n var xInv = 1 / x;\n return Math.log(xInv + Math.sqrt(xInv * xInv + 1));\n}\nacschNumber.signature = n1;\nexport function asecNumber(x) {\n return Math.acos(1 / x);\n}\nasecNumber.signature = n1;\nexport function asechNumber(x) {\n var xInv = 1 / x;\n var ret = Math.sqrt(xInv * xInv - 1);\n return Math.log(ret + xInv);\n}\nasechNumber.signature = n1;\nexport function asinNumber(x) {\n return Math.asin(x);\n}\nasinNumber.signature = n1;\nexport function asinhNumber(x) {\n return asinh(x);\n}\nasinhNumber.signature = n1;\nexport function atanNumber(x) {\n return Math.atan(x);\n}\natanNumber.signature = n1;\nexport function atan2Number(y, x) {\n return Math.atan2(y, x);\n}\natan2Number.signature = n2;\nexport function atanhNumber(x) {\n return atanh(x);\n}\natanhNumber.signature = n1;\nexport function cosNumber(x) {\n return Math.cos(x);\n}\ncosNumber.signature = n1;\nexport function coshNumber(x) {\n return cosh(x);\n}\ncoshNumber.signature = n1;\nexport function cotNumber(x) {\n return 1 / Math.tan(x);\n}\ncotNumber.signature = n1;\nexport function cothNumber(x) {\n var e = Math.exp(2 * x);\n return (e + 1) / (e - 1);\n}\ncothNumber.signature = n1;\nexport function cscNumber(x) {\n return 1 / Math.sin(x);\n}\ncscNumber.signature = n1;\nexport function cschNumber(x) {\n // consider values close to zero (+/-)\n if (x === 0) {\n return Number.POSITIVE_INFINITY;\n } else {\n return Math.abs(2 / (Math.exp(x) - Math.exp(-x))) * sign(x);\n }\n}\ncschNumber.signature = n1;\nexport function secNumber(x) {\n return 1 / Math.cos(x);\n}\nsecNumber.signature = n1;\nexport function sechNumber(x) {\n return 2 / (Math.exp(x) + Math.exp(-x));\n}\nsechNumber.signature = n1;\nexport function sinNumber(x) {\n return Math.sin(x);\n}\nsinNumber.signature = n1;\nexport function sinhNumber(x) {\n return sinh(x);\n}\nsinhNumber.signature = n1;\nexport function tanNumber(x) {\n return Math.tan(x);\n}\ntanNumber.signature = n1;\nexport function tanhNumber(x) {\n return tanh(x);\n}\ntanhNumber.signature = n1;","import { isInteger } from '../../utils/number.js';\nvar n1 = 'number';\nexport function isIntegerNumber(x) {\n return isInteger(x);\n}\nisIntegerNumber.signature = n1;\nexport function isNegativeNumber(x) {\n return x < 0;\n}\nisNegativeNumber.signature = n1;\nexport function isPositiveNumber(x) {\n return x > 0;\n}\nisPositiveNumber.signature = n1;\nexport function isZeroNumber(x) {\n return x === 0;\n}\nisZeroNumber.signature = n1;\nexport function isNaNNumber(x) {\n return Number.isNaN(x);\n}\nisNaNNumber.signature = n1;","import { deepMap } from '../../utils/collection.js';\nimport { factory } from '../../utils/factory.js';\nimport { isNegativeNumber } from '../../plain/number/index.js';\nvar name = 'isNegative';\nvar dependencies = ['typed'];\nexport var createIsNegative = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed\n } = _ref;\n /**\n * Test whether a value is negative: smaller than zero.\n * The function supports types `number`, `BigNumber`, `Fraction`, and `Unit`.\n *\n * The function is evaluated element-wise in case of Array or Matrix input.\n *\n * Syntax:\n *\n * math.isNegative(x)\n *\n * Examples:\n *\n * math.isNegative(3) // returns false\n * math.isNegative(-2) // returns true\n * math.isNegative(0) // returns false\n * math.isNegative(-0) // returns false\n * math.isNegative(math.bignumber(2)) // returns false\n * math.isNegative(math.fraction(-2, 5)) // returns true\n * math.isNegative('-2') // returns true\n * math.isNegative([2, 0, -3]) // returns [false, false, true]\n *\n * See also:\n *\n * isNumeric, isPositive, isZero, isInteger\n *\n * @param {number | BigNumber | Fraction | Unit | Array | Matrix} x Value to be tested\n * @return {boolean} Returns true when `x` is larger than zero.\n * Throws an error in case of an unknown data type.\n */\n return typed(name, {\n number: isNegativeNumber,\n BigNumber: function BigNumber(x) {\n return x.isNeg() && !x.isZero() && !x.isNaN();\n },\n Fraction: function Fraction(x) {\n return x.s < 0; // It's enough to decide on the sign\n },\n\n Unit: typed.referToSelf(self => x => typed.find(self, x.valueType())(x.value)),\n 'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self))\n });\n});","import { deepMap } from '../../utils/collection.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'isNumeric';\nvar dependencies = ['typed'];\nexport var createIsNumeric = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed\n } = _ref;\n /**\n * Test whether a value is an numeric value.\n *\n * The function is evaluated element-wise in case of Array or Matrix input.\n *\n * Syntax:\n *\n * math.isNumeric(x)\n *\n * Examples:\n *\n * math.isNumeric(2) // returns true\n * math.isNumeric('2') // returns false\n * math.hasNumericValue('2') // returns true\n * math.isNumeric(0) // returns true\n * math.isNumeric(math.bignumber(500)) // returns true\n * math.isNumeric(math.fraction(4)) // returns true\n * math.isNumeric(math.complex('2-4i')) // returns false\n * math.isNumeric([2.3, 'foo', false]) // returns [true, false, true]\n *\n * See also:\n *\n * isZero, isPositive, isNegative, isInteger, hasNumericValue\n *\n * @param {*} x Value to be tested\n * @return {boolean} Returns true when `x` is a `number`, `BigNumber`,\n * `Fraction`, or `boolean`. Returns false for other types.\n * Throws an error in case of unknown types.\n */\n return typed(name, {\n 'number | BigNumber | Fraction | boolean': () => true,\n 'Complex | Unit | string | null | undefined | Node': () => false,\n 'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self))\n });\n});","import { factory } from '../../utils/factory.js';\nvar name = 'hasNumericValue';\nvar dependencies = ['typed', 'isNumeric'];\nexport var createHasNumericValue = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n isNumeric\n } = _ref;\n /**\n * Test whether a value is an numeric value.\n *\n * In case of a string, true is returned if the string contains a numeric value.\n *\n * Syntax:\n *\n * math.hasNumericValue(x)\n *\n * Examples:\n *\n * math.hasNumericValue(2) // returns true\n * math.hasNumericValue('2') // returns true\n * math.isNumeric('2') // returns false\n * math.hasNumericValue(0) // returns true\n * math.hasNumericValue(math.bignumber(500)) // returns true\n * math.hasNumericValue(math.fraction(4)) // returns true\n * math.hasNumericValue(math.complex('2-4i')) // returns false\n * math.hasNumericValue(false) // returns true\n * math.hasNumericValue([2.3, 'foo', false]) // returns [true, false, true]\n *\n * See also:\n *\n * isZero, isPositive, isNegative, isInteger, isNumeric\n *\n * @param {*} x Value to be tested\n * @return {boolean} Returns true when `x` is a `number`, `BigNumber`,\n * `Fraction`, `Boolean`, or a `String` containing number. Returns false for other types.\n * Throws an error in case of unknown types.\n */\n return typed(name, {\n boolean: () => true,\n string: function string(x) {\n return x.trim().length > 0 && !isNaN(Number(x));\n },\n any: function any(x) {\n return isNumeric(x);\n }\n });\n});","import { deepMap } from '../../utils/collection.js';\nimport { factory } from '../../utils/factory.js';\nimport { isPositiveNumber } from '../../plain/number/index.js';\nvar name = 'isPositive';\nvar dependencies = ['typed'];\nexport var createIsPositive = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed\n } = _ref;\n /**\n * Test whether a value is positive: larger than zero.\n * The function supports types `number`, `BigNumber`, `Fraction`, and `Unit`.\n *\n * The function is evaluated element-wise in case of Array or Matrix input.\n *\n * Syntax:\n *\n * math.isPositive(x)\n *\n * Examples:\n *\n * math.isPositive(3) // returns true\n * math.isPositive(-2) // returns false\n * math.isPositive(0) // returns false\n * math.isPositive(-0) // returns false\n * math.isPositive(0.5) // returns true\n * math.isPositive(math.bignumber(2)) // returns true\n * math.isPositive(math.fraction(-2, 5)) // returns false\n * math.isPositive(math.fraction(1, 3)) // returns true\n * math.isPositive('2') // returns true\n * math.isPositive([2, 0, -3]) // returns [true, false, false]\n *\n * See also:\n *\n * isNumeric, isZero, isNegative, isInteger\n *\n * @param {number | BigNumber | Fraction | Unit | Array | Matrix} x Value to be tested\n * @return {boolean} Returns true when `x` is larger than zero.\n * Throws an error in case of an unknown data type.\n */\n return typed(name, {\n number: isPositiveNumber,\n BigNumber: function BigNumber(x) {\n return !x.isNeg() && !x.isZero() && !x.isNaN();\n },\n Fraction: function Fraction(x) {\n return x.s > 0 && x.n > 0;\n },\n Unit: typed.referToSelf(self => x => typed.find(self, x.valueType())(x.value)),\n 'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self))\n });\n});","import { deepMap } from '../../utils/collection.js';\nimport { factory } from '../../utils/factory.js';\nimport { isZeroNumber } from '../../plain/number/index.js';\nvar name = 'isZero';\nvar dependencies = ['typed'];\nexport var createIsZero = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed\n } = _ref;\n /**\n * Test whether a value is zero.\n * The function can check for zero for types `number`, `BigNumber`, `Fraction`,\n * `Complex`, and `Unit`.\n *\n * The function is evaluated element-wise in case of Array or Matrix input.\n *\n * Syntax:\n *\n * math.isZero(x)\n *\n * Examples:\n *\n * math.isZero(0) // returns true\n * math.isZero(2) // returns false\n * math.isZero(0.5) // returns false\n * math.isZero(math.bignumber(0)) // returns true\n * math.isZero(math.fraction(0)) // returns true\n * math.isZero(math.fraction(1,3)) // returns false\n * math.isZero(math.complex('2 - 4i')) // returns false\n * math.isZero(math.complex('0i')) // returns true\n * math.isZero('0') // returns true\n * math.isZero('2') // returns false\n * math.isZero([2, 0, -3]) // returns [false, true, false]\n *\n * See also:\n *\n * isNumeric, isPositive, isNegative, isInteger\n *\n * @param {number | BigNumber | Complex | Fraction | Unit | Array | Matrix} x Value to be tested\n * @return {boolean} Returns true when `x` is zero.\n * Throws an error in case of an unknown data type.\n */\n return typed(name, {\n number: isZeroNumber,\n BigNumber: function BigNumber(x) {\n return x.isZero();\n },\n Complex: function Complex(x) {\n return x.re === 0 && x.im === 0;\n },\n Fraction: function Fraction(x) {\n return x.d === 1 && x.n === 0;\n },\n Unit: typed.referToSelf(self => x => typed.find(self, x.valueType())(x.value)),\n 'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self))\n });\n});","import { deepMap } from '../../utils/collection.js';\nimport { factory } from '../../utils/factory.js';\nimport { isNaNNumber } from '../../plain/number/index.js';\nvar name = 'isNaN';\nvar dependencies = ['typed'];\nexport var createIsNaN = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed\n } = _ref;\n /**\n * Test whether a value is NaN (not a number).\n * The function supports types `number`, `BigNumber`, `Fraction`, `Unit` and `Complex`.\n *\n * The function is evaluated element-wise in case of Array or Matrix input.\n *\n * Syntax:\n *\n * math.isNaN(x)\n *\n * Examples:\n *\n * math.isNaN(3) // returns false\n * math.isNaN(NaN) // returns true\n * math.isNaN(0) // returns false\n * math.isNaN(math.bignumber(NaN)) // returns true\n * math.isNaN(math.bignumber(0)) // returns false\n * math.isNaN(math.fraction(-2, 5)) // returns false\n * math.isNaN('-2') // returns false\n * math.isNaN([2, 0, -3, NaN]) // returns [false, false, false, true]\n *\n * See also:\n *\n * isNumeric, isNegative, isPositive, isZero, isInteger\n *\n * @param {number | BigNumber | Fraction | Unit | Array | Matrix} x Value to be tested\n * @return {boolean} Returns true when `x` is NaN.\n * Throws an error in case of an unknown data type.\n */\n return typed(name, {\n number: isNaNNumber,\n BigNumber: function BigNumber(x) {\n return x.isNaN();\n },\n Fraction: function Fraction(x) {\n return false;\n },\n Complex: function Complex(x) {\n return x.isNaN();\n },\n Unit: function Unit(x) {\n return Number.isNaN(x.value);\n },\n 'Array | Matrix': function ArrayMatrix(x) {\n return deepMap(x, Number.isNaN);\n }\n });\n});","import { factory } from '../../utils/factory.js';\nimport { typeOf as _typeOf } from '../../utils/is.js';\nvar name = 'typeOf';\nvar dependencies = ['typed'];\nexport var createTypeOf = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed\n } = _ref;\n /**\n * Determine the type of an entity.\n *\n * Syntax:\n *\n * math.typeOf(x)\n *\n * Examples:\n *\n * // This list is intended to include all relevant types, for testing\n * // purposes:\n * math.typeOf(3.5) // returns 'number'\n * math.typeOf(math.complex('2-4i')) // returns 'Complex'\n * math.typeOf(math.unit('45 deg')) // returns 'Unit'\n * math.typeOf('hello world') // returns 'string'\n * math.typeOf(null) // returns 'null'\n * math.typeOf(true) // returns 'boolean'\n * math.typeOf([1, 2, 3]) // returns 'Array'\n * math.typeOf(new Date()) // returns 'Date'\n * math.typeOf(function () {}) // returns 'function'\n * math.typeOf({a: 2, b: 3}) // returns 'Object'\n * math.typeOf(/a regexp/) // returns 'RegExp'\n * math.typeOf(undefined) // returns 'undefined'\n * math.typeOf(math.bignumber('23e99')) // returns 'BigNumber'\n * math.typeOf(math.chain(2)) // returns 'Chain'\n * math.typeOf(math.fraction(1, 3)) // returns 'Fraction'\n * math.typeOf(math.help('sqrt')) // returns 'Help'\n * math.typeOf(math.index(1, 3)) // returns 'Index'\n * math.typeOf(math.matrix([[1],[3]])) // returns 'DenseMatrix'\n * math.typeOf(math.matrix([],'sparse')) // returns 'SparseMatrix'\n * math.typeOf(new math.Range(0, 10)) // returns 'Range'\n * math.typeOf(math.evaluate('a=2\\na')) // returns 'ResultSet'\n * math.typeOf(math.parse('A[2]')) // returns 'AccessorNode'\n * math.typeOf(math.parse('[1,2,3]')) // returns 'ArrayNode'\n * math.typeOf(math.parse('x=2')) // returns 'AssignmentNode'\n * math.typeOf(math.parse('a=2; b=3')) // returns 'BlockNode'\n * math.typeOf(math.parse('x<0?-1:1')) // returns 'ConditionalNode'\n * math.typeOf(math.parse('2.3')) // returns 'ConstantNode'\n * math.typeOf(math.parse('f(x)=x^2')) // returns 'FunctionAssignmentNode'\n * math.typeOf(math.parse('sqrt(4)')) // returns 'FunctionNode'\n * math.typeOf(math.parse('A[2]').index) // returns 'IndexNode'\n * math.typeOf(math.parse('{a:2}')) // returns 'ObjectNode'\n * math.typeOf(math.parse('(2+3)')) // returns 'ParenthesisNode'\n * math.typeOf(math.parse('1:10')) // returns 'RangeNode'\n * math.typeOf(math.parse('a {\n var {\n typed\n } = _ref;\n return {\n 'Unit, Unit': typed.referToSelf(self => (x, y) => {\n if (!x.equalBase(y)) {\n throw new Error('Cannot compare units with different base');\n }\n return typed.find(self, [x.valueType(), y.valueType()])(x.value, y.value);\n })\n };\n});","import { nearlyEqual as bigNearlyEqual } from '../../utils/bignumber/nearlyEqual.js';\nimport { nearlyEqual } from '../../utils/number.js';\nimport { factory } from '../../utils/factory.js';\nimport { complexEquals } from '../../utils/complex.js';\nimport { createCompareUnits } from './compareUnits.js';\nvar name = 'equalScalar';\nvar dependencies = ['typed', 'config'];\nexport var createEqualScalar = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n config\n } = _ref;\n var compareUnits = createCompareUnits({\n typed\n });\n\n /**\n * Test whether two scalar values are nearly equal.\n *\n * @param {number | BigNumber | Fraction | boolean | Complex | Unit} x First value to compare\n * @param {number | BigNumber | Fraction | boolean | Complex} y Second value to compare\n * @return {boolean} Returns true when the compared values are equal, else returns false\n * @private\n */\n return typed(name, {\n 'boolean, boolean': function booleanBoolean(x, y) {\n return x === y;\n },\n 'number, number': function numberNumber(x, y) {\n return nearlyEqual(x, y, config.epsilon);\n },\n 'BigNumber, BigNumber': function BigNumberBigNumber(x, y) {\n return x.eq(y) || bigNearlyEqual(x, y, config.epsilon);\n },\n 'Fraction, Fraction': function FractionFraction(x, y) {\n return x.equals(y);\n },\n 'Complex, Complex': function ComplexComplex(x, y) {\n return complexEquals(x, y, config.epsilon);\n }\n }, compareUnits);\n});\nexport var createEqualScalarNumber = factory(name, ['typed', 'config'], _ref2 => {\n var {\n typed,\n config\n } = _ref2;\n return typed(name, {\n 'number, number': function numberNumber(x, y) {\n return nearlyEqual(x, y, config.epsilon);\n }\n });\n});","import { nearlyEqual } from './number.js';\n\n/**\n * Test whether two complex values are equal provided a given epsilon.\n * Does not use or change the global Complex.EPSILON setting\n * @param {Complex} x\n * @param {Complex} y\n * @param {number} epsilon\n * @returns {boolean}\n */\nexport function complexEquals(x, y, epsilon) {\n return nearlyEqual(x.re, y.re, epsilon) && nearlyEqual(x.im, y.im, epsilon);\n}","import { isArray, isBigNumber, isCollection, isIndex, isMatrix, isNumber, isString, typeOf } from '../../utils/is.js';\nimport { isInteger } from '../../utils/number.js';\nimport { format } from '../../utils/string.js';\nimport { clone, deepStrictEqual } from '../../utils/object.js';\nimport { arraySize, getArrayDataType, processSizesWildcard, unsqueeze, validateIndex } from '../../utils/array.js';\nimport { factory } from '../../utils/factory.js';\nimport { DimensionError } from '../../error/DimensionError.js';\nimport { maxArgumentCount } from '../../utils/function.js';\nvar name = 'SparseMatrix';\nvar dependencies = ['typed', 'equalScalar', 'Matrix'];\nexport var createSparseMatrixClass = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n equalScalar,\n Matrix\n } = _ref;\n /**\n * Sparse Matrix implementation. This type implements\n * a [Compressed Column Storage](https://en.wikipedia.org/wiki/Sparse_matrix#Compressed_sparse_column_(CSC_or_CCS))\n * format for two-dimensional sparse matrices.\n * @class SparseMatrix\n */\n function SparseMatrix(data, datatype) {\n if (!(this instanceof SparseMatrix)) {\n throw new SyntaxError('Constructor must be called with the new operator');\n }\n if (datatype && !isString(datatype)) {\n throw new Error('Invalid datatype: ' + datatype);\n }\n if (isMatrix(data)) {\n // create from matrix\n _createFromMatrix(this, data, datatype);\n } else if (data && isArray(data.index) && isArray(data.ptr) && isArray(data.size)) {\n // initialize fields\n this._values = data.values;\n this._index = data.index;\n this._ptr = data.ptr;\n this._size = data.size;\n this._datatype = datatype || data.datatype;\n } else if (isArray(data)) {\n // create from array\n _createFromArray(this, data, datatype);\n } else if (data) {\n // unsupported type\n throw new TypeError('Unsupported type of data (' + typeOf(data) + ')');\n } else {\n // nothing provided\n this._values = [];\n this._index = [];\n this._ptr = [0];\n this._size = [0, 0];\n this._datatype = datatype;\n }\n }\n function _createFromMatrix(matrix, source, datatype) {\n // check matrix type\n if (source.type === 'SparseMatrix') {\n // clone arrays\n matrix._values = source._values ? clone(source._values) : undefined;\n matrix._index = clone(source._index);\n matrix._ptr = clone(source._ptr);\n matrix._size = clone(source._size);\n matrix._datatype = datatype || source._datatype;\n } else {\n // build from matrix data\n _createFromArray(matrix, source.valueOf(), datatype || source._datatype);\n }\n }\n function _createFromArray(matrix, data, datatype) {\n // initialize fields\n matrix._values = [];\n matrix._index = [];\n matrix._ptr = [];\n matrix._datatype = datatype;\n // discover rows & columns, do not use math.size() to avoid looping array twice\n var rows = data.length;\n var columns = 0;\n\n // equal signature to use\n var eq = equalScalar;\n // zero value\n var zero = 0;\n if (isString(datatype)) {\n // find signature that matches (datatype, datatype)\n eq = typed.find(equalScalar, [datatype, datatype]) || equalScalar;\n // convert 0 to the same datatype\n zero = typed.convert(0, datatype);\n }\n\n // check we have rows (empty array)\n if (rows > 0) {\n // column index\n var j = 0;\n do {\n // store pointer to values index\n matrix._ptr.push(matrix._index.length);\n // loop rows\n for (var i = 0; i < rows; i++) {\n // current row\n var row = data[i];\n // check row is an array\n if (isArray(row)) {\n // update columns if needed (only on first column)\n if (j === 0 && columns < row.length) {\n columns = row.length;\n }\n // check row has column\n if (j < row.length) {\n // value\n var v = row[j];\n // check value != 0\n if (!eq(v, zero)) {\n // store value\n matrix._values.push(v);\n // index\n matrix._index.push(i);\n }\n }\n } else {\n // update columns if needed (only on first column)\n if (j === 0 && columns < 1) {\n columns = 1;\n }\n // check value != 0 (row is a scalar)\n if (!eq(row, zero)) {\n // store value\n matrix._values.push(row);\n // index\n matrix._index.push(i);\n }\n }\n }\n // increment index\n j++;\n } while (j < columns);\n }\n // store number of values in ptr\n matrix._ptr.push(matrix._index.length);\n // size\n matrix._size = [rows, columns];\n }\n SparseMatrix.prototype = new Matrix();\n\n /**\n * Create a new SparseMatrix\n */\n SparseMatrix.prototype.createSparseMatrix = function (data, datatype) {\n return new SparseMatrix(data, datatype);\n };\n\n /**\n * Attach type information\n */\n Object.defineProperty(SparseMatrix, 'name', {\n value: 'SparseMatrix'\n });\n SparseMatrix.prototype.constructor = SparseMatrix;\n SparseMatrix.prototype.type = 'SparseMatrix';\n SparseMatrix.prototype.isSparseMatrix = true;\n\n /**\n * Get the matrix type\n *\n * Usage:\n * const matrixType = matrix.getDataType() // retrieves the matrix type\n *\n * @memberOf SparseMatrix\n * @return {string} type information; if multiple types are found from the Matrix, it will return \"mixed\"\n */\n SparseMatrix.prototype.getDataType = function () {\n return getArrayDataType(this._values, typeOf);\n };\n\n /**\n * Get the storage format used by the matrix.\n *\n * Usage:\n * const format = matrix.storage() // retrieve storage format\n *\n * @memberof SparseMatrix\n * @return {string} The storage format.\n */\n SparseMatrix.prototype.storage = function () {\n return 'sparse';\n };\n\n /**\n * Get the datatype of the data stored in the matrix.\n *\n * Usage:\n * const format = matrix.datatype() // retrieve matrix datatype\n *\n * @memberof SparseMatrix\n * @return {string} The datatype.\n */\n SparseMatrix.prototype.datatype = function () {\n return this._datatype;\n };\n\n /**\n * Create a new SparseMatrix\n * @memberof SparseMatrix\n * @param {Array} data\n * @param {string} [datatype]\n */\n SparseMatrix.prototype.create = function (data, datatype) {\n return new SparseMatrix(data, datatype);\n };\n\n /**\n * Get the matrix density.\n *\n * Usage:\n * const density = matrix.density() // retrieve matrix density\n *\n * @memberof SparseMatrix\n * @return {number} The matrix density.\n */\n SparseMatrix.prototype.density = function () {\n // rows & columns\n var rows = this._size[0];\n var columns = this._size[1];\n // calculate density\n return rows !== 0 && columns !== 0 ? this._index.length / (rows * columns) : 0;\n };\n\n /**\n * Get a subset of the matrix, or replace a subset of the matrix.\n *\n * Usage:\n * const subset = matrix.subset(index) // retrieve subset\n * const value = matrix.subset(index, replacement) // replace subset\n *\n * @memberof SparseMatrix\n * @param {Index} index\n * @param {Array | Matrix | *} [replacement]\n * @param {*} [defaultValue=0] Default value, filled in on new entries when\n * the matrix is resized. If not provided,\n * new matrix elements will be filled with zeros.\n */\n SparseMatrix.prototype.subset = function (index, replacement, defaultValue) {\n // check it is a pattern matrix\n if (!this._values) {\n throw new Error('Cannot invoke subset on a Pattern only matrix');\n }\n\n // check arguments\n switch (arguments.length) {\n case 1:\n return _getsubset(this, index);\n\n // intentional fall through\n case 2:\n case 3:\n return _setsubset(this, index, replacement, defaultValue);\n default:\n throw new SyntaxError('Wrong number of arguments');\n }\n };\n function _getsubset(matrix, idx) {\n // check idx\n if (!isIndex(idx)) {\n throw new TypeError('Invalid index');\n }\n var isScalar = idx.isScalar();\n if (isScalar) {\n // return a scalar\n return matrix.get(idx.min());\n }\n // validate dimensions\n var size = idx.size();\n if (size.length !== matrix._size.length) {\n throw new DimensionError(size.length, matrix._size.length);\n }\n\n // vars\n var i, ii, k, kk;\n\n // validate if any of the ranges in the index is out of range\n var min = idx.min();\n var max = idx.max();\n for (i = 0, ii = matrix._size.length; i < ii; i++) {\n validateIndex(min[i], matrix._size[i]);\n validateIndex(max[i], matrix._size[i]);\n }\n\n // matrix arrays\n var mvalues = matrix._values;\n var mindex = matrix._index;\n var mptr = matrix._ptr;\n\n // rows & columns dimensions for result matrix\n var rows = idx.dimension(0);\n var columns = idx.dimension(1);\n\n // workspace & permutation vector\n var w = [];\n var pv = [];\n\n // loop rows in resulting matrix\n rows.forEach(function (i, r) {\n // update permutation vector\n pv[i] = r[0];\n // mark i in workspace\n w[i] = true;\n });\n\n // result matrix arrays\n var values = mvalues ? [] : undefined;\n var index = [];\n var ptr = [];\n\n // loop columns in result matrix\n columns.forEach(function (j) {\n // update ptr\n ptr.push(index.length);\n // loop values in column j\n for (k = mptr[j], kk = mptr[j + 1]; k < kk; k++) {\n // row\n i = mindex[k];\n // check row is in result matrix\n if (w[i] === true) {\n // push index\n index.push(pv[i]);\n // check we need to process values\n if (values) {\n values.push(mvalues[k]);\n }\n }\n }\n });\n // update ptr\n ptr.push(index.length);\n\n // return matrix\n return new SparseMatrix({\n values,\n index,\n ptr,\n size,\n datatype: matrix._datatype\n });\n }\n function _setsubset(matrix, index, submatrix, defaultValue) {\n // check index\n if (!index || index.isIndex !== true) {\n throw new TypeError('Invalid index');\n }\n\n // get index size and check whether the index contains a single value\n var iSize = index.size();\n var isScalar = index.isScalar();\n\n // calculate the size of the submatrix, and convert it into an Array if needed\n var sSize;\n if (isMatrix(submatrix)) {\n // submatrix size\n sSize = submatrix.size();\n // use array representation\n submatrix = submatrix.toArray();\n } else {\n // get submatrix size (array, scalar)\n sSize = arraySize(submatrix);\n }\n\n // check index is a scalar\n if (isScalar) {\n // verify submatrix is a scalar\n if (sSize.length !== 0) {\n throw new TypeError('Scalar expected');\n }\n // set value\n matrix.set(index.min(), submatrix, defaultValue);\n } else {\n // validate dimensions, index size must be one or two dimensions\n if (iSize.length !== 1 && iSize.length !== 2) {\n throw new DimensionError(iSize.length, matrix._size.length, '<');\n }\n\n // check submatrix and index have the same dimensions\n if (sSize.length < iSize.length) {\n // calculate number of missing outer dimensions\n var i = 0;\n var outer = 0;\n while (iSize[i] === 1 && sSize[i] === 1) {\n i++;\n }\n while (iSize[i] === 1) {\n outer++;\n i++;\n }\n // unsqueeze both outer and inner dimensions\n submatrix = unsqueeze(submatrix, iSize.length, outer, sSize);\n }\n\n // check whether the size of the submatrix matches the index size\n if (!deepStrictEqual(iSize, sSize)) {\n throw new DimensionError(iSize, sSize, '>');\n }\n\n // insert the sub matrix\n if (iSize.length === 1) {\n // if the replacement index only has 1 dimension, go trough each one and set its value\n var range = index.dimension(0);\n range.forEach(function (dataIndex, subIndex) {\n validateIndex(dataIndex);\n matrix.set([dataIndex, 0], submatrix[subIndex[0]], defaultValue);\n });\n } else {\n // if the replacement index has 2 dimensions, go through each one and set the value in the correct index\n var firstDimensionRange = index.dimension(0);\n var secondDimensionRange = index.dimension(1);\n firstDimensionRange.forEach(function (firstDataIndex, firstSubIndex) {\n validateIndex(firstDataIndex);\n secondDimensionRange.forEach(function (secondDataIndex, secondSubIndex) {\n validateIndex(secondDataIndex);\n matrix.set([firstDataIndex, secondDataIndex], submatrix[firstSubIndex[0]][secondSubIndex[0]], defaultValue);\n });\n });\n }\n }\n return matrix;\n }\n\n /**\n * Get a single element from the matrix.\n * @memberof SparseMatrix\n * @param {number[]} index Zero-based index\n * @return {*} value\n */\n SparseMatrix.prototype.get = function (index) {\n if (!isArray(index)) {\n throw new TypeError('Array expected');\n }\n if (index.length !== this._size.length) {\n throw new DimensionError(index.length, this._size.length);\n }\n\n // check it is a pattern matrix\n if (!this._values) {\n throw new Error('Cannot invoke get on a Pattern only matrix');\n }\n\n // row and column\n var i = index[0];\n var j = index[1];\n\n // check i, j are valid\n validateIndex(i, this._size[0]);\n validateIndex(j, this._size[1]);\n\n // find value index\n var k = _getValueIndex(i, this._ptr[j], this._ptr[j + 1], this._index);\n // check k is prior to next column k and it is in the correct row\n if (k < this._ptr[j + 1] && this._index[k] === i) {\n return this._values[k];\n }\n return 0;\n };\n\n /**\n * Replace a single element in the matrix.\n * @memberof SparseMatrix\n * @param {number[]} index Zero-based index\n * @param {*} v\n * @param {*} [defaultValue] Default value, filled in on new entries when\n * the matrix is resized. If not provided,\n * new matrix elements will be set to zero.\n * @return {SparseMatrix} self\n */\n SparseMatrix.prototype.set = function (index, v, defaultValue) {\n if (!isArray(index)) {\n throw new TypeError('Array expected');\n }\n if (index.length !== this._size.length) {\n throw new DimensionError(index.length, this._size.length);\n }\n\n // check it is a pattern matrix\n if (!this._values) {\n throw new Error('Cannot invoke set on a Pattern only matrix');\n }\n\n // row and column\n var i = index[0];\n var j = index[1];\n\n // rows & columns\n var rows = this._size[0];\n var columns = this._size[1];\n\n // equal signature to use\n var eq = equalScalar;\n // zero value\n var zero = 0;\n if (isString(this._datatype)) {\n // find signature that matches (datatype, datatype)\n eq = typed.find(equalScalar, [this._datatype, this._datatype]) || equalScalar;\n // convert 0 to the same datatype\n zero = typed.convert(0, this._datatype);\n }\n\n // check we need to resize matrix\n if (i > rows - 1 || j > columns - 1) {\n // resize matrix\n _resize(this, Math.max(i + 1, rows), Math.max(j + 1, columns), defaultValue);\n // update rows & columns\n rows = this._size[0];\n columns = this._size[1];\n }\n\n // check i, j are valid\n validateIndex(i, rows);\n validateIndex(j, columns);\n\n // find value index\n var k = _getValueIndex(i, this._ptr[j], this._ptr[j + 1], this._index);\n // check k is prior to next column k and it is in the correct row\n if (k < this._ptr[j + 1] && this._index[k] === i) {\n // check value != 0\n if (!eq(v, zero)) {\n // update value\n this._values[k] = v;\n } else {\n // remove value from matrix\n _remove(k, j, this._values, this._index, this._ptr);\n }\n } else {\n if (!eq(v, zero)) {\n // insert value @ (i, j)\n _insert(k, i, j, v, this._values, this._index, this._ptr);\n }\n }\n return this;\n };\n function _getValueIndex(i, top, bottom, index) {\n // check row is on the bottom side\n if (bottom - top === 0) {\n return bottom;\n }\n // loop rows [top, bottom[\n for (var r = top; r < bottom; r++) {\n // check we found value index\n if (index[r] === i) {\n return r;\n }\n }\n // we did not find row\n return top;\n }\n function _remove(k, j, values, index, ptr) {\n // remove value @ k\n values.splice(k, 1);\n index.splice(k, 1);\n // update pointers\n for (var x = j + 1; x < ptr.length; x++) {\n ptr[x]--;\n }\n }\n function _insert(k, i, j, v, values, index, ptr) {\n // insert value\n values.splice(k, 0, v);\n // update row for k\n index.splice(k, 0, i);\n // update column pointers\n for (var x = j + 1; x < ptr.length; x++) {\n ptr[x]++;\n }\n }\n\n /**\n * Resize the matrix to the given size. Returns a copy of the matrix when\n * `copy=true`, otherwise return the matrix itself (resize in place).\n *\n * @memberof SparseMatrix\n * @param {number[] | Matrix} size The new size the matrix should have.\n * Since sparse matrices are always two-dimensional,\n * size must be two numbers in either an array or a matrix\n * @param {*} [defaultValue=0] Default value, filled in on new entries.\n * If not provided, the matrix elements will\n * be filled with zeros.\n * @param {boolean} [copy] Return a resized copy of the matrix\n *\n * @return {Matrix} The resized matrix\n */\n SparseMatrix.prototype.resize = function (size, defaultValue, copy) {\n // validate arguments\n if (!isCollection(size)) {\n throw new TypeError('Array or Matrix expected');\n }\n\n // SparseMatrix input is always 2d, flatten this into 1d if it's indeed a vector\n var sizeArray = size.valueOf().map(value => {\n return Array.isArray(value) && value.length === 1 ? value[0] : value;\n });\n if (sizeArray.length !== 2) {\n throw new Error('Only two dimensions matrix are supported');\n }\n\n // check sizes\n sizeArray.forEach(function (value) {\n if (!isNumber(value) || !isInteger(value) || value < 0) {\n throw new TypeError('Invalid size, must contain positive integers ' + '(size: ' + format(sizeArray) + ')');\n }\n });\n\n // matrix to resize\n var m = copy ? this.clone() : this;\n // resize matrix\n return _resize(m, sizeArray[0], sizeArray[1], defaultValue);\n };\n function _resize(matrix, rows, columns, defaultValue) {\n // value to insert at the time of growing matrix\n var value = defaultValue || 0;\n\n // equal signature to use\n var eq = equalScalar;\n // zero value\n var zero = 0;\n if (isString(matrix._datatype)) {\n // find signature that matches (datatype, datatype)\n eq = typed.find(equalScalar, [matrix._datatype, matrix._datatype]) || equalScalar;\n // convert 0 to the same datatype\n zero = typed.convert(0, matrix._datatype);\n // convert value to the same datatype\n value = typed.convert(value, matrix._datatype);\n }\n\n // should we insert the value?\n var ins = !eq(value, zero);\n\n // old columns and rows\n var r = matrix._size[0];\n var c = matrix._size[1];\n var i, j, k;\n\n // check we need to increase columns\n if (columns > c) {\n // loop new columns\n for (j = c; j < columns; j++) {\n // update matrix._ptr for current column\n matrix._ptr[j] = matrix._values.length;\n // check we need to insert matrix._values\n if (ins) {\n // loop rows\n for (i = 0; i < r; i++) {\n // add new matrix._values\n matrix._values.push(value);\n // update matrix._index\n matrix._index.push(i);\n }\n }\n }\n // store number of matrix._values in matrix._ptr\n matrix._ptr[columns] = matrix._values.length;\n } else if (columns < c) {\n // truncate matrix._ptr\n matrix._ptr.splice(columns + 1, c - columns);\n // truncate matrix._values and matrix._index\n matrix._values.splice(matrix._ptr[columns], matrix._values.length);\n matrix._index.splice(matrix._ptr[columns], matrix._index.length);\n }\n // update columns\n c = columns;\n\n // check we need to increase rows\n if (rows > r) {\n // check we have to insert values\n if (ins) {\n // inserts\n var n = 0;\n // loop columns\n for (j = 0; j < c; j++) {\n // update matrix._ptr for current column\n matrix._ptr[j] = matrix._ptr[j] + n;\n // where to insert matrix._values\n k = matrix._ptr[j + 1] + n;\n // pointer\n var p = 0;\n // loop new rows, initialize pointer\n for (i = r; i < rows; i++, p++) {\n // add value\n matrix._values.splice(k + p, 0, value);\n // update matrix._index\n matrix._index.splice(k + p, 0, i);\n // increment inserts\n n++;\n }\n }\n // store number of matrix._values in matrix._ptr\n matrix._ptr[c] = matrix._values.length;\n }\n } else if (rows < r) {\n // deletes\n var d = 0;\n // loop columns\n for (j = 0; j < c; j++) {\n // update matrix._ptr for current column\n matrix._ptr[j] = matrix._ptr[j] - d;\n // where matrix._values start for next column\n var k0 = matrix._ptr[j];\n var k1 = matrix._ptr[j + 1] - d;\n // loop matrix._index\n for (k = k0; k < k1; k++) {\n // row\n i = matrix._index[k];\n // check we need to delete value and matrix._index\n if (i > rows - 1) {\n // remove value\n matrix._values.splice(k, 1);\n // remove item from matrix._index\n matrix._index.splice(k, 1);\n // increase deletes\n d++;\n }\n }\n }\n // update matrix._ptr for current column\n matrix._ptr[j] = matrix._values.length;\n }\n // update matrix._size\n matrix._size[0] = rows;\n matrix._size[1] = columns;\n // return matrix\n return matrix;\n }\n\n /**\n * Reshape the matrix to the given size. Returns a copy of the matrix when\n * `copy=true`, otherwise return the matrix itself (reshape in place).\n *\n * NOTE: This might be better suited to copy by default, instead of modifying\n * in place. For now, it operates in place to remain consistent with\n * resize().\n *\n * @memberof SparseMatrix\n * @param {number[]} sizes The new size the matrix should have.\n * Since sparse matrices are always two-dimensional,\n * size must be two numbers in either an array or a matrix\n * @param {boolean} [copy] Return a reshaped copy of the matrix\n *\n * @return {Matrix} The reshaped matrix\n */\n SparseMatrix.prototype.reshape = function (sizes, copy) {\n // validate arguments\n if (!isArray(sizes)) {\n throw new TypeError('Array expected');\n }\n if (sizes.length !== 2) {\n throw new Error('Sparse matrices can only be reshaped in two dimensions');\n }\n\n // check sizes\n sizes.forEach(function (value) {\n if (!isNumber(value) || !isInteger(value) || value <= -2 || value === 0) {\n throw new TypeError('Invalid size, must contain positive integers or -1 ' + '(size: ' + format(sizes) + ')');\n }\n });\n var currentLength = this._size[0] * this._size[1];\n sizes = processSizesWildcard(sizes, currentLength);\n var newLength = sizes[0] * sizes[1];\n\n // m * n must not change\n if (currentLength !== newLength) {\n throw new Error('Reshaping sparse matrix will result in the wrong number of elements');\n }\n\n // matrix to reshape\n var m = copy ? this.clone() : this;\n\n // return unchanged if the same shape\n if (this._size[0] === sizes[0] && this._size[1] === sizes[1]) {\n return m;\n }\n\n // Convert to COO format (generate a column index)\n var colIndex = [];\n for (var i = 0; i < m._ptr.length; i++) {\n for (var j = 0; j < m._ptr[i + 1] - m._ptr[i]; j++) {\n colIndex.push(i);\n }\n }\n\n // Clone the values array\n var values = m._values.slice();\n\n // Clone the row index array\n var rowIndex = m._index.slice();\n\n // Transform the (row, column) indices\n for (var _i = 0; _i < m._index.length; _i++) {\n var r1 = rowIndex[_i];\n var c1 = colIndex[_i];\n var flat = r1 * m._size[1] + c1;\n colIndex[_i] = flat % sizes[1];\n rowIndex[_i] = Math.floor(flat / sizes[1]);\n }\n\n // Now reshaping is supposed to preserve the row-major order, BUT these sparse matrices are stored\n // in column-major order, so we have to reorder the value array now. One option is to use a multisort,\n // sorting several arrays based on some other array.\n\n // OR, we could easily just:\n\n // 1. Remove all values from the matrix\n m._values.length = 0;\n m._index.length = 0;\n m._ptr.length = sizes[1] + 1;\n m._size = sizes.slice();\n for (var _i2 = 0; _i2 < m._ptr.length; _i2++) {\n m._ptr[_i2] = 0;\n }\n\n // 2. Re-insert all elements in the proper order (simplified code from SparseMatrix.prototype.set)\n // This step is probably the most time-consuming\n for (var h = 0; h < values.length; h++) {\n var _i3 = rowIndex[h];\n var _j = colIndex[h];\n var v = values[h];\n var k = _getValueIndex(_i3, m._ptr[_j], m._ptr[_j + 1], m._index);\n _insert(k, _i3, _j, v, m._values, m._index, m._ptr);\n }\n\n // The value indices are inserted out of order, but apparently that's... still OK?\n\n return m;\n };\n\n /**\n * Create a clone of the matrix\n * @memberof SparseMatrix\n * @return {SparseMatrix} clone\n */\n SparseMatrix.prototype.clone = function () {\n var m = new SparseMatrix({\n values: this._values ? clone(this._values) : undefined,\n index: clone(this._index),\n ptr: clone(this._ptr),\n size: clone(this._size),\n datatype: this._datatype\n });\n return m;\n };\n\n /**\n * Retrieve the size of the matrix.\n * @memberof SparseMatrix\n * @returns {number[]} size\n */\n SparseMatrix.prototype.size = function () {\n return this._size.slice(0); // copy the Array\n };\n\n /**\n * Create a new matrix with the results of the callback function executed on\n * each entry of the matrix.\n * @memberof SparseMatrix\n * @param {Function} callback The callback function is invoked with three\n * parameters: the value of the element, the index\n * of the element, and the Matrix being traversed.\n * @param {boolean} [skipZeros] Invoke callback function for non-zero values only.\n *\n * @return {SparseMatrix} matrix\n */\n SparseMatrix.prototype.map = function (callback, skipZeros) {\n // check it is a pattern matrix\n if (!this._values) {\n throw new Error('Cannot invoke map on a Pattern only matrix');\n }\n // matrix instance\n var me = this;\n // rows and columns\n var rows = this._size[0];\n var columns = this._size[1];\n // invoke callback\n var args = maxArgumentCount(callback);\n var invoke = function invoke(v, i, j) {\n // invoke callback\n if (args === 1) return callback(v);\n if (args === 2) return callback(v, [i, j]);\n return callback(v, [i, j], me);\n };\n // invoke _map\n return _map(this, 0, rows - 1, 0, columns - 1, invoke, skipZeros);\n };\n\n /**\n * Create a new matrix with the results of the callback function executed on the interval\n * [minRow..maxRow, minColumn..maxColumn].\n */\n function _map(matrix, minRow, maxRow, minColumn, maxColumn, callback, skipZeros) {\n // result arrays\n var values = [];\n var index = [];\n var ptr = [];\n\n // equal signature to use\n var eq = equalScalar;\n // zero value\n var zero = 0;\n if (isString(matrix._datatype)) {\n // find signature that matches (datatype, datatype)\n eq = typed.find(equalScalar, [matrix._datatype, matrix._datatype]) || equalScalar;\n // convert 0 to the same datatype\n zero = typed.convert(0, matrix._datatype);\n }\n\n // invoke callback\n var invoke = function invoke(v, x, y) {\n // invoke callback\n v = callback(v, x, y);\n // check value != 0\n if (!eq(v, zero)) {\n // store value\n values.push(v);\n // index\n index.push(x);\n }\n };\n // loop columns\n for (var j = minColumn; j <= maxColumn; j++) {\n // store pointer to values index\n ptr.push(values.length);\n // k0 <= k < k1 where k0 = _ptr[j] && k1 = _ptr[j+1]\n var k0 = matrix._ptr[j];\n var k1 = matrix._ptr[j + 1];\n if (skipZeros) {\n // loop k within [k0, k1[\n for (var k = k0; k < k1; k++) {\n // row index\n var i = matrix._index[k];\n // check i is in range\n if (i >= minRow && i <= maxRow) {\n // value @ k\n invoke(matrix._values[k], i - minRow, j - minColumn);\n }\n }\n } else {\n // create a cache holding all defined values\n var _values = {};\n for (var _k = k0; _k < k1; _k++) {\n var _i4 = matrix._index[_k];\n _values[_i4] = matrix._values[_k];\n }\n\n // loop over all rows (indexes can be unordered so we can't use that),\n // and either read the value or zero\n for (var _i5 = minRow; _i5 <= maxRow; _i5++) {\n var value = _i5 in _values ? _values[_i5] : 0;\n invoke(value, _i5 - minRow, j - minColumn);\n }\n }\n }\n\n // store number of values in ptr\n ptr.push(values.length);\n // return sparse matrix\n return new SparseMatrix({\n values,\n index,\n ptr,\n size: [maxRow - minRow + 1, maxColumn - minColumn + 1]\n });\n }\n\n /**\n * Execute a callback function on each entry of the matrix.\n * @memberof SparseMatrix\n * @param {Function} callback The callback function is invoked with three\n * parameters: the value of the element, the index\n * of the element, and the Matrix being traversed.\n * @param {boolean} [skipZeros] Invoke callback function for non-zero values only.\n * If false, the indices are guaranteed to be in order,\n * if true, the indices can be unordered.\n */\n SparseMatrix.prototype.forEach = function (callback, skipZeros) {\n // check it is a pattern matrix\n if (!this._values) {\n throw new Error('Cannot invoke forEach on a Pattern only matrix');\n }\n // matrix instance\n var me = this;\n // rows and columns\n var rows = this._size[0];\n var columns = this._size[1];\n // loop columns\n for (var j = 0; j < columns; j++) {\n // k0 <= k < k1 where k0 = _ptr[j] && k1 = _ptr[j+1]\n var k0 = this._ptr[j];\n var k1 = this._ptr[j + 1];\n if (skipZeros) {\n // loop k within [k0, k1[\n for (var k = k0; k < k1; k++) {\n // row index\n var i = this._index[k];\n\n // value @ k\n callback(this._values[k], [i, j], me);\n }\n } else {\n // create a cache holding all defined values\n var values = {};\n for (var _k2 = k0; _k2 < k1; _k2++) {\n var _i6 = this._index[_k2];\n values[_i6] = this._values[_k2];\n }\n\n // loop over all rows (indexes can be unordered so we can't use that),\n // and either read the value or zero\n for (var _i7 = 0; _i7 < rows; _i7++) {\n var value = _i7 in values ? values[_i7] : 0;\n callback(value, [_i7, j], me);\n }\n }\n }\n };\n\n /**\n * Iterate over the matrix elements, skipping zeros\n * @return {Iterable<{ value, index: number[] }>}\n */\n SparseMatrix.prototype[Symbol.iterator] = function* () {\n if (!this._values) {\n throw new Error('Cannot iterate a Pattern only matrix');\n }\n var columns = this._size[1];\n for (var j = 0; j < columns; j++) {\n var k0 = this._ptr[j];\n var k1 = this._ptr[j + 1];\n for (var k = k0; k < k1; k++) {\n // row index\n var i = this._index[k];\n yield {\n value: this._values[k],\n index: [i, j]\n };\n }\n }\n };\n\n /**\n * Create an Array with a copy of the data of the SparseMatrix\n * @memberof SparseMatrix\n * @returns {Array} array\n */\n SparseMatrix.prototype.toArray = function () {\n return _toArray(this._values, this._index, this._ptr, this._size, true);\n };\n\n /**\n * Get the primitive value of the SparseMatrix: a two dimensions array\n * @memberof SparseMatrix\n * @returns {Array} array\n */\n SparseMatrix.prototype.valueOf = function () {\n return _toArray(this._values, this._index, this._ptr, this._size, false);\n };\n function _toArray(values, index, ptr, size, copy) {\n // rows and columns\n var rows = size[0];\n var columns = size[1];\n // result\n var a = [];\n // vars\n var i, j;\n // initialize array\n for (i = 0; i < rows; i++) {\n a[i] = [];\n for (j = 0; j < columns; j++) {\n a[i][j] = 0;\n }\n }\n\n // loop columns\n for (j = 0; j < columns; j++) {\n // k0 <= k < k1 where k0 = _ptr[j] && k1 = _ptr[j+1]\n var k0 = ptr[j];\n var k1 = ptr[j + 1];\n // loop k within [k0, k1[\n for (var k = k0; k < k1; k++) {\n // row index\n i = index[k];\n // set value (use one for pattern matrix)\n a[i][j] = values ? copy ? clone(values[k]) : values[k] : 1;\n }\n }\n return a;\n }\n\n /**\n * Get a string representation of the matrix, with optional formatting options.\n * @memberof SparseMatrix\n * @param {Object | number | Function} [options] Formatting options. See\n * lib/utils/number:format for a\n * description of the available\n * options.\n * @returns {string} str\n */\n SparseMatrix.prototype.format = function (options) {\n // rows and columns\n var rows = this._size[0];\n var columns = this._size[1];\n // density\n var density = this.density();\n // rows & columns\n var str = 'Sparse Matrix [' + format(rows, options) + ' x ' + format(columns, options) + '] density: ' + format(density, options) + '\\n';\n // loop columns\n for (var j = 0; j < columns; j++) {\n // k0 <= k < k1 where k0 = _ptr[j] && k1 = _ptr[j+1]\n var k0 = this._ptr[j];\n var k1 = this._ptr[j + 1];\n // loop k within [k0, k1[\n for (var k = k0; k < k1; k++) {\n // row index\n var i = this._index[k];\n // append value\n str += '\\n (' + format(i, options) + ', ' + format(j, options) + ') ==> ' + (this._values ? format(this._values[k], options) : 'X');\n }\n }\n return str;\n };\n\n /**\n * Get a string representation of the matrix\n * @memberof SparseMatrix\n * @returns {string} str\n */\n SparseMatrix.prototype.toString = function () {\n return format(this.toArray());\n };\n\n /**\n * Get a JSON representation of the matrix\n * @memberof SparseMatrix\n * @returns {Object}\n */\n SparseMatrix.prototype.toJSON = function () {\n return {\n mathjs: 'SparseMatrix',\n values: this._values,\n index: this._index,\n ptr: this._ptr,\n size: this._size,\n datatype: this._datatype\n };\n };\n\n /**\n * Get the kth Matrix diagonal.\n *\n * @memberof SparseMatrix\n * @param {number | BigNumber} [k=0] The kth diagonal where the vector will retrieved.\n *\n * @returns {Matrix} The matrix vector with the diagonal values.\n */\n SparseMatrix.prototype.diagonal = function (k) {\n // validate k if any\n if (k) {\n // convert BigNumber to a number\n if (isBigNumber(k)) {\n k = k.toNumber();\n }\n // is must be an integer\n if (!isNumber(k) || !isInteger(k)) {\n throw new TypeError('The parameter k must be an integer number');\n }\n } else {\n // default value\n k = 0;\n }\n var kSuper = k > 0 ? k : 0;\n var kSub = k < 0 ? -k : 0;\n\n // rows & columns\n var rows = this._size[0];\n var columns = this._size[1];\n\n // number diagonal values\n var n = Math.min(rows - kSub, columns - kSuper);\n\n // diagonal arrays\n var values = [];\n var index = [];\n var ptr = [];\n // initial ptr value\n ptr[0] = 0;\n // loop columns\n for (var j = kSuper; j < columns && values.length < n; j++) {\n // k0 <= k < k1 where k0 = _ptr[j] && k1 = _ptr[j+1]\n var k0 = this._ptr[j];\n var k1 = this._ptr[j + 1];\n // loop x within [k0, k1[\n for (var x = k0; x < k1; x++) {\n // row index\n var i = this._index[x];\n // check row\n if (i === j - kSuper + kSub) {\n // value on this column\n values.push(this._values[x]);\n // store row\n index[values.length - 1] = i - kSub;\n // exit loop\n break;\n }\n }\n }\n // close ptr\n ptr.push(values.length);\n // return matrix\n return new SparseMatrix({\n values,\n index,\n ptr,\n size: [n, 1]\n });\n };\n\n /**\n * Generate a matrix from a JSON object\n * @memberof SparseMatrix\n * @param {Object} json An object structured like\n * `{\"mathjs\": \"SparseMatrix\", \"values\": [], \"index\": [], \"ptr\": [], \"size\": []}`,\n * where mathjs is optional\n * @returns {SparseMatrix}\n */\n SparseMatrix.fromJSON = function (json) {\n return new SparseMatrix(json);\n };\n\n /**\n * Create a diagonal matrix.\n *\n * @memberof SparseMatrix\n * @param {Array} size The matrix size.\n * @param {number | Array | Matrix } value The values for the diagonal.\n * @param {number | BigNumber} [k=0] The kth diagonal where the vector will be filled in.\n * @param {number} [defaultValue] The default value for non-diagonal\n * @param {string} [datatype] The Matrix datatype, values must be of this datatype.\n *\n * @returns {SparseMatrix}\n */\n SparseMatrix.diagonal = function (size, value, k, defaultValue, datatype) {\n if (!isArray(size)) {\n throw new TypeError('Array expected, size parameter');\n }\n if (size.length !== 2) {\n throw new Error('Only two dimensions matrix are supported');\n }\n\n // map size & validate\n size = size.map(function (s) {\n // check it is a big number\n if (isBigNumber(s)) {\n // convert it\n s = s.toNumber();\n }\n // validate arguments\n if (!isNumber(s) || !isInteger(s) || s < 1) {\n throw new Error('Size values must be positive integers');\n }\n return s;\n });\n\n // validate k if any\n if (k) {\n // convert BigNumber to a number\n if (isBigNumber(k)) {\n k = k.toNumber();\n }\n // is must be an integer\n if (!isNumber(k) || !isInteger(k)) {\n throw new TypeError('The parameter k must be an integer number');\n }\n } else {\n // default value\n k = 0;\n }\n\n // equal signature to use\n var eq = equalScalar;\n // zero value\n var zero = 0;\n if (isString(datatype)) {\n // find signature that matches (datatype, datatype)\n eq = typed.find(equalScalar, [datatype, datatype]) || equalScalar;\n // convert 0 to the same datatype\n zero = typed.convert(0, datatype);\n }\n var kSuper = k > 0 ? k : 0;\n var kSub = k < 0 ? -k : 0;\n\n // rows and columns\n var rows = size[0];\n var columns = size[1];\n\n // number of non-zero items\n var n = Math.min(rows - kSub, columns - kSuper);\n\n // value extraction function\n var _value;\n\n // check value\n if (isArray(value)) {\n // validate array\n if (value.length !== n) {\n // number of values in array must be n\n throw new Error('Invalid value array length');\n }\n // define function\n _value = function _value(i) {\n // return value @ i\n return value[i];\n };\n } else if (isMatrix(value)) {\n // matrix size\n var ms = value.size();\n // validate matrix\n if (ms.length !== 1 || ms[0] !== n) {\n // number of values in array must be n\n throw new Error('Invalid matrix length');\n }\n // define function\n _value = function _value(i) {\n // return value @ i\n return value.get([i]);\n };\n } else {\n // define function\n _value = function _value() {\n // return value\n return value;\n };\n }\n\n // create arrays\n var values = [];\n var index = [];\n var ptr = [];\n\n // loop items\n for (var j = 0; j < columns; j++) {\n // number of rows with value\n ptr.push(values.length);\n // diagonal index\n var i = j - kSuper;\n // check we need to set diagonal value\n if (i >= 0 && i < n) {\n // get value @ i\n var v = _value(i);\n // check for zero\n if (!eq(v, zero)) {\n // column\n index.push(i + kSub);\n // add value\n values.push(v);\n }\n }\n }\n // last value should be number of values\n ptr.push(values.length);\n // create SparseMatrix\n return new SparseMatrix({\n values,\n index,\n ptr,\n size: [rows, columns]\n });\n };\n\n /**\n * Swap rows i and j in Matrix.\n *\n * @memberof SparseMatrix\n * @param {number} i Matrix row index 1\n * @param {number} j Matrix row index 2\n *\n * @return {Matrix} The matrix reference\n */\n SparseMatrix.prototype.swapRows = function (i, j) {\n // check index\n if (!isNumber(i) || !isInteger(i) || !isNumber(j) || !isInteger(j)) {\n throw new Error('Row index must be positive integers');\n }\n // check dimensions\n if (this._size.length !== 2) {\n throw new Error('Only two dimensional matrix is supported');\n }\n // validate index\n validateIndex(i, this._size[0]);\n validateIndex(j, this._size[0]);\n\n // swap rows\n SparseMatrix._swapRows(i, j, this._size[1], this._values, this._index, this._ptr);\n // return current instance\n return this;\n };\n\n /**\n * Loop rows with data in column j.\n *\n * @param {number} j Column\n * @param {Array} values Matrix values\n * @param {Array} index Matrix row indeces\n * @param {Array} ptr Matrix column pointers\n * @param {Function} callback Callback function invoked for every row in column j\n */\n SparseMatrix._forEachRow = function (j, values, index, ptr, callback) {\n // indeces for column j\n var k0 = ptr[j];\n var k1 = ptr[j + 1];\n // loop\n for (var k = k0; k < k1; k++) {\n // invoke callback\n callback(index[k], values[k]);\n }\n };\n\n /**\n * Swap rows x and y in Sparse Matrix data structures.\n *\n * @param {number} x Matrix row index 1\n * @param {number} y Matrix row index 2\n * @param {number} columns Number of columns in matrix\n * @param {Array} values Matrix values\n * @param {Array} index Matrix row indeces\n * @param {Array} ptr Matrix column pointers\n */\n SparseMatrix._swapRows = function (x, y, columns, values, index, ptr) {\n // loop columns\n for (var j = 0; j < columns; j++) {\n // k0 <= k < k1 where k0 = _ptr[j] && k1 = _ptr[j+1]\n var k0 = ptr[j];\n var k1 = ptr[j + 1];\n // find value index @ x\n var kx = _getValueIndex(x, k0, k1, index);\n // find value index @ x\n var ky = _getValueIndex(y, k0, k1, index);\n // check both rows exist in matrix\n if (kx < k1 && ky < k1 && index[kx] === x && index[ky] === y) {\n // swap values (check for pattern matrix)\n if (values) {\n var v = values[kx];\n values[kx] = values[ky];\n values[ky] = v;\n }\n // next column\n continue;\n }\n // check x row exist & no y row\n if (kx < k1 && index[kx] === x && (ky >= k1 || index[ky] !== y)) {\n // value @ x (check for pattern matrix)\n var vx = values ? values[kx] : undefined;\n // insert value @ y\n index.splice(ky, 0, y);\n if (values) {\n values.splice(ky, 0, vx);\n }\n // remove value @ x (adjust array index if needed)\n index.splice(ky <= kx ? kx + 1 : kx, 1);\n if (values) {\n values.splice(ky <= kx ? kx + 1 : kx, 1);\n }\n // next column\n continue;\n }\n // check y row exist & no x row\n if (ky < k1 && index[ky] === y && (kx >= k1 || index[kx] !== x)) {\n // value @ y (check for pattern matrix)\n var vy = values ? values[ky] : undefined;\n // insert value @ x\n index.splice(kx, 0, x);\n if (values) {\n values.splice(kx, 0, vy);\n }\n // remove value @ y (adjust array index if needed)\n index.splice(kx <= ky ? ky + 1 : ky, 1);\n if (values) {\n values.splice(kx <= ky ? ky + 1 : ky, 1);\n }\n }\n }\n };\n return SparseMatrix;\n}, {\n isClass: true\n});","import { factory } from '../utils/factory.js';\nimport { deepMap } from '../utils/collection.js';\nvar name = 'number';\nvar dependencies = ['typed'];\n\n/**\n * Separates the radix, integer part, and fractional part of a non decimal number string\n * @param {string} input string to parse\n * @returns {object} the parts of the string or null if not a valid input\n */\nfunction getNonDecimalNumberParts(input) {\n var nonDecimalWithRadixMatch = input.match(/(0[box])([0-9a-fA-F]*)\\.([0-9a-fA-F]*)/);\n if (nonDecimalWithRadixMatch) {\n var radix = {\n '0b': 2,\n '0o': 8,\n '0x': 16\n }[nonDecimalWithRadixMatch[1]];\n var integerPart = nonDecimalWithRadixMatch[2];\n var fractionalPart = nonDecimalWithRadixMatch[3];\n return {\n input,\n radix,\n integerPart,\n fractionalPart\n };\n } else {\n return null;\n }\n}\n\n/**\n * Makes a number from a radix, and integer part, and a fractional part\n * @param {parts} [x] parts of the number string (from getNonDecimalNumberParts)\n * @returns {number} the number\n */\nfunction makeNumberFromNonDecimalParts(parts) {\n var n = parseInt(parts.integerPart, parts.radix);\n var f = 0;\n for (var i = 0; i < parts.fractionalPart.length; i++) {\n var digitValue = parseInt(parts.fractionalPart[i], parts.radix);\n f += digitValue / Math.pow(parts.radix, i + 1);\n }\n var result = n + f;\n if (isNaN(result)) {\n throw new SyntaxError('String \"' + parts.input + '\" is no valid number');\n }\n return result;\n}\nexport var createNumber = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed\n } = _ref;\n /**\n * Create a number or convert a string, boolean, or unit to a number.\n * When value is a matrix, all elements will be converted to number.\n *\n * Syntax:\n *\n * math.number(value)\n * math.number(unit, valuelessUnit)\n *\n * Examples:\n *\n * math.number(2) // returns number 2\n * math.number('7.2') // returns number 7.2\n * math.number(true) // returns number 1\n * math.number([true, false, true, true]) // returns [1, 0, 1, 1]\n * math.number(math.unit('52cm'), 'm') // returns 0.52\n *\n * See also:\n *\n * bignumber, boolean, complex, index, matrix, string, unit\n *\n * @param {string | number | BigNumber | Fraction | boolean | Array | Matrix | Unit | null} [value] Value to be converted\n * @param {Unit | string} [valuelessUnit] A valueless unit, used to convert a unit to a number\n * @return {number | Array | Matrix} The created number\n */\n var number = typed('number', {\n '': function _() {\n return 0;\n },\n number: function number(x) {\n return x;\n },\n string: function string(x) {\n if (x === 'NaN') return NaN;\n var nonDecimalNumberParts = getNonDecimalNumberParts(x);\n if (nonDecimalNumberParts) {\n return makeNumberFromNonDecimalParts(nonDecimalNumberParts);\n }\n var size = 0;\n var wordSizeSuffixMatch = x.match(/(0[box][0-9a-fA-F]*)i([0-9]*)/);\n if (wordSizeSuffixMatch) {\n // x includes a size suffix like 0xffffi32, so we extract\n // the suffix and remove it from x\n size = Number(wordSizeSuffixMatch[2]);\n x = wordSizeSuffixMatch[1];\n }\n var num = Number(x);\n if (isNaN(num)) {\n throw new SyntaxError('String \"' + x + '\" is no valid number');\n }\n if (wordSizeSuffixMatch) {\n // x is a signed bin, oct, or hex literal\n // num is the value of string x if x is interpreted as unsigned\n if (num > 2 ** size - 1) {\n // literal is too large for size suffix\n throw new SyntaxError(\"String \\\"\".concat(x, \"\\\" is out of range\"));\n }\n // check if the bit at index size - 1 is set and if so do the twos complement\n if (num >= 2 ** (size - 1)) {\n num = num - 2 ** size;\n }\n }\n return num;\n },\n BigNumber: function BigNumber(x) {\n return x.toNumber();\n },\n Fraction: function Fraction(x) {\n return x.valueOf();\n },\n Unit: typed.referToSelf(self => x => {\n var clone = x.clone();\n clone.value = self(x.value);\n return clone;\n }),\n null: function _null(x) {\n return 0;\n },\n 'Unit, string | Unit': function UnitStringUnit(unit, valuelessUnit) {\n return unit.toNumber(valuelessUnit);\n },\n 'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self))\n });\n\n // reviver function to parse a JSON object like:\n //\n // {\"mathjs\":\"number\",\"value\":\"2.3\"}\n //\n // into a number 2.3\n number.fromJSON = function (json) {\n return parseFloat(json.value);\n };\n return number;\n});","import { factory } from '../utils/factory.js';\nimport { deepMap } from '../utils/collection.js';\nimport { format } from '../utils/number.js';\nvar name = 'string';\nvar dependencies = ['typed'];\nexport var createString = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed\n } = _ref;\n /**\n * Create a string or convert any object into a string.\n * Elements of Arrays and Matrices are processed element wise.\n *\n * Syntax:\n *\n * math.string(value)\n *\n * Examples:\n *\n * math.string(4.2) // returns string '4.2'\n * math.string(math.complex(3, 2) // returns string '3 + 2i'\n *\n * const u = math.unit(5, 'km')\n * math.string(u.to('m')) // returns string '5000 m'\n *\n * math.string([true, false]) // returns ['true', 'false']\n *\n * See also:\n *\n * bignumber, boolean, complex, index, matrix, number, unit\n *\n * @param {* | Array | Matrix | null} [value] A value to convert to a string\n * @return {string | Array | Matrix} The created string\n */\n return typed(name, {\n '': function _() {\n return '';\n },\n number: format,\n null: function _null(x) {\n return 'null';\n },\n boolean: function boolean(x) {\n return x + '';\n },\n string: function string(x) {\n return x;\n },\n 'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self)),\n any: function any(x) {\n return String(x);\n }\n });\n});","import { factory } from '../utils/factory.js';\nimport { deepMap } from '../utils/collection.js';\nvar name = 'boolean';\nvar dependencies = ['typed'];\nexport var createBoolean = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed\n } = _ref;\n /**\n * Create a boolean or convert a string or number to a boolean.\n * In case of a number, `true` is returned for non-zero numbers, and `false` in\n * case of zero.\n * Strings can be `'true'` or `'false'`, or can contain a number.\n * When value is a matrix, all elements will be converted to boolean.\n *\n * Syntax:\n *\n * math.boolean(x)\n *\n * Examples:\n *\n * math.boolean(0) // returns false\n * math.boolean(1) // returns true\n * math.boolean(-3) // returns true\n * math.boolean('true') // returns true\n * math.boolean('false') // returns false\n * math.boolean([1, 0, 1, 1]) // returns [true, false, true, true]\n *\n * See also:\n *\n * bignumber, complex, index, matrix, string, unit\n *\n * @param {string | number | boolean | Array | Matrix | null} value A value of any type\n * @return {boolean | Array | Matrix} The boolean value\n */\n return typed(name, {\n '': function _() {\n return false;\n },\n boolean: function boolean(x) {\n return x;\n },\n number: function number(x) {\n return !!x;\n },\n null: function _null(x) {\n return false;\n },\n BigNumber: function BigNumber(x) {\n return !x.isZero();\n },\n string: function string(x) {\n // try case insensitive\n var lcase = x.toLowerCase();\n if (lcase === 'true') {\n return true;\n } else if (lcase === 'false') {\n return false;\n }\n\n // test whether value is a valid number\n var num = Number(x);\n if (x !== '' && !isNaN(num)) {\n return !!num;\n }\n throw new Error('Cannot convert \"' + x + '\" to a boolean');\n },\n 'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self))\n });\n});","import { factory } from '../../../utils/factory.js';\nimport { deepMap } from '../../../utils/collection.js';\nvar name = 'bignumber';\nvar dependencies = ['typed', 'BigNumber'];\nexport var createBignumber = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n BigNumber\n } = _ref;\n /**\n * Create a BigNumber, which can store numbers with arbitrary precision.\n * When a matrix is provided, all elements will be converted to BigNumber.\n *\n * Syntax:\n *\n * math.bignumber(x)\n *\n * Examples:\n *\n * 0.1 + 0.2 // returns number 0.30000000000000004\n * math.bignumber(0.1) + math.bignumber(0.2) // returns BigNumber 0.3\n *\n *\n * 7.2e500 // returns number Infinity\n * math.bignumber('7.2e500') // returns BigNumber 7.2e500\n *\n * See also:\n *\n * boolean, complex, index, matrix, string, unit\n *\n * @param {number | string | Fraction | BigNumber | Array | Matrix | boolean | null} [value] Value for the big number,\n * 0 by default.\n * @returns {BigNumber} The created bignumber\n */\n return typed('bignumber', {\n '': function _() {\n return new BigNumber(0);\n },\n number: function number(x) {\n // convert to string to prevent errors in case of >15 digits\n return new BigNumber(x + '');\n },\n string: function string(x) {\n var wordSizeSuffixMatch = x.match(/(0[box][0-9a-fA-F]*)i([0-9]*)/);\n if (wordSizeSuffixMatch) {\n // x has a word size suffix\n var size = wordSizeSuffixMatch[2];\n var n = BigNumber(wordSizeSuffixMatch[1]);\n var twoPowSize = new BigNumber(2).pow(Number(size));\n if (n.gt(twoPowSize.sub(1))) {\n throw new SyntaxError(\"String \\\"\".concat(x, \"\\\" is out of range\"));\n }\n var twoPowSizeSubOne = new BigNumber(2).pow(Number(size) - 1);\n if (n.gte(twoPowSizeSubOne)) {\n return n.sub(twoPowSize);\n } else {\n return n;\n }\n }\n return new BigNumber(x);\n },\n BigNumber: function BigNumber(x) {\n // we assume a BigNumber is immutable\n return x;\n },\n Unit: typed.referToSelf(self => x => {\n var clone = x.clone();\n clone.value = self(x.value);\n return clone;\n }),\n Fraction: function Fraction(x) {\n return new BigNumber(x.n).div(x.d).times(x.s);\n },\n null: function _null(x) {\n return new BigNumber(0);\n },\n 'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self))\n });\n});","import { factory } from '../../../utils/factory.js';\nimport { deepMap } from '../../../utils/collection.js';\nvar name = 'complex';\nvar dependencies = ['typed', 'Complex'];\nexport var createComplex = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n Complex\n } = _ref;\n /**\n * Create a complex value or convert a value to a complex value.\n *\n * Syntax:\n *\n * math.complex() // creates a complex value with zero\n * // as real and imaginary part.\n * math.complex(re : number, im : string) // creates a complex value with provided\n * // values for real and imaginary part.\n * math.complex(re : number) // creates a complex value with provided\n * // real value and zero imaginary part.\n * math.complex(complex : Complex) // clones the provided complex value.\n * math.complex(arg : string) // parses a string into a complex value.\n * math.complex(array : Array) // converts the elements of the array\n * // or matrix element wise into a\n * // complex value.\n * math.complex({re: number, im: number}) // creates a complex value with provided\n * // values for real an imaginary part.\n * math.complex({r: number, phi: number}) // creates a complex value with provided\n * // polar coordinates\n *\n * Examples:\n *\n * const a = math.complex(3, -4) // a = Complex 3 - 4i\n * a.re = 5 // a = Complex 5 - 4i\n * const i = a.im // Number -4\n * const b = math.complex('2 + 6i') // Complex 2 + 6i\n * const c = math.complex() // Complex 0 + 0i\n * const d = math.add(a, b) // Complex 5 + 2i\n *\n * See also:\n *\n * bignumber, boolean, index, matrix, number, string, unit\n *\n * @param {* | Array | Matrix} [args]\n * Arguments specifying the real and imaginary part of the complex number\n * @return {Complex | Array | Matrix} Returns a complex value\n */\n return typed('complex', {\n '': function _() {\n return Complex.ZERO;\n },\n number: function number(x) {\n return new Complex(x, 0);\n },\n 'number, number': function numberNumber(re, im) {\n return new Complex(re, im);\n },\n // TODO: this signature should be redundant\n 'BigNumber, BigNumber': function BigNumberBigNumber(re, im) {\n return new Complex(re.toNumber(), im.toNumber());\n },\n Fraction: function Fraction(x) {\n return new Complex(x.valueOf(), 0);\n },\n Complex: function Complex(x) {\n return x.clone();\n },\n string: function string(x) {\n return Complex(x); // for example '2 + 3i'\n },\n\n null: function _null(x) {\n return Complex(0);\n },\n Object: function Object(x) {\n if ('re' in x && 'im' in x) {\n return new Complex(x.re, x.im);\n }\n if ('r' in x && 'phi' in x || 'abs' in x && 'arg' in x) {\n return new Complex(x);\n }\n throw new Error('Expected object with properties (re and im) or (r and phi) or (abs and arg)');\n },\n 'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self))\n });\n});","import { factory } from '../../../utils/factory.js';\nimport { deepMap } from '../../../utils/collection.js';\nvar name = 'fraction';\nvar dependencies = ['typed', 'Fraction'];\nexport var createFraction = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n Fraction\n } = _ref;\n /**\n * Create a fraction or convert a value to a fraction.\n *\n * With one numeric argument, produces the closest rational approximation to the\n * input.\n * With two arguments, the first is the numerator and the second is the denominator,\n * and creates the corresponding fraction. Both numerator and denominator must be\n * integers.\n * With one object argument, looks for the integer numerator as the value of property\n * 'n' and the integer denominator as the value of property 'd'.\n * With a matrix argument, creates a matrix of the same shape with entries\n * converted into fractions.\n *\n * Syntax:\n * math.fraction(value)\n * math.fraction(numerator, denominator)\n * math.fraction({n: numerator, d: denominator})\n * math.fraction(matrix: Array | Matrix)\n *\n * Examples:\n *\n * math.fraction(6.283) // returns Fraction 6283/1000\n * math.fraction(1, 3) // returns Fraction 1/3\n * math.fraction('2/3') // returns Fraction 2/3\n * math.fraction({n: 2, d: 3}) // returns Fraction 2/3\n * math.fraction([0.2, 0.25, 1.25]) // returns Array [1/5, 1/4, 5/4]\n * math.fraction(4, 5.1) // throws Error: Parameters must be integer\n *\n * See also:\n *\n * bignumber, number, string, unit\n *\n * @param {number | string | Fraction | BigNumber | Unit | Array | Matrix} [args]\n * Arguments specifying the value, or numerator and denominator of\n * the fraction\n * @return {Fraction | Array | Matrix} Returns a fraction\n */\n return typed('fraction', {\n number: function number(x) {\n if (!isFinite(x) || isNaN(x)) {\n throw new Error(x + ' cannot be represented as a fraction');\n }\n return new Fraction(x);\n },\n string: function string(x) {\n return new Fraction(x);\n },\n 'number, number': function numberNumber(numerator, denominator) {\n return new Fraction(numerator, denominator);\n },\n null: function _null(x) {\n return new Fraction(0);\n },\n BigNumber: function BigNumber(x) {\n return new Fraction(x.toString());\n },\n Fraction: function Fraction(x) {\n return x; // fractions are immutable\n },\n\n Unit: typed.referToSelf(self => x => {\n var clone = x.clone();\n clone.value = self(x.value);\n return clone;\n }),\n Object: function Object(x) {\n return new Fraction(x);\n },\n 'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self))\n });\n});","import { factory } from '../../../utils/factory.js';\nvar name = 'matrix';\nvar dependencies = ['typed', 'Matrix', 'DenseMatrix', 'SparseMatrix'];\nexport var createMatrix = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n Matrix,\n DenseMatrix,\n SparseMatrix\n } = _ref;\n /**\n * Create a Matrix. The function creates a new `math.Matrix` object from\n * an `Array`. A Matrix has utility functions to manipulate the data in the\n * matrix, like getting the size and getting or setting values in the matrix.\n * Supported storage formats are 'dense' and 'sparse'.\n *\n * Syntax:\n *\n * math.matrix() // creates an empty matrix using default storage format (dense).\n * math.matrix(data) // creates a matrix with initial data using default storage format (dense).\n * math.matrix('dense') // creates an empty matrix using the given storage format.\n * math.matrix(data, 'dense') // creates a matrix with initial data using the given storage format.\n * math.matrix(data, 'sparse') // creates a sparse matrix with initial data.\n * math.matrix(data, 'sparse', 'number') // creates a sparse matrix with initial data, number data type.\n *\n * Examples:\n *\n * let m = math.matrix([[1, 2], [3, 4]])\n * m.size() // Array [2, 2]\n * m.resize([3, 2], 5)\n * m.valueOf() // Array [[1, 2], [3, 4], [5, 5]]\n * m.get([1, 0]) // number 3\n *\n * See also:\n *\n * bignumber, boolean, complex, index, number, string, unit, sparse\n *\n * @param {Array | Matrix} [data] A multi dimensional array\n * @param {string} [format] The Matrix storage format, either `'dense'` or `'sparse'`\n * @param {string} [datatype] Type of the values\n *\n * @return {Matrix} The created matrix\n */\n return typed(name, {\n '': function _() {\n return _create([]);\n },\n string: function string(format) {\n return _create([], format);\n },\n 'string, string': function stringString(format, datatype) {\n return _create([], format, datatype);\n },\n Array: function Array(data) {\n return _create(data);\n },\n Matrix: function Matrix(data) {\n return _create(data, data.storage());\n },\n 'Array | Matrix, string': _create,\n 'Array | Matrix, string, string': _create\n });\n\n /**\n * Create a new Matrix with given storage format\n * @param {Array} data\n * @param {string} [format]\n * @param {string} [datatype]\n * @returns {Matrix} Returns a new Matrix\n * @private\n */\n function _create(data, format, datatype) {\n // get storage format constructor\n if (format === 'dense' || format === 'default' || format === undefined) {\n return new DenseMatrix(data, datatype);\n }\n if (format === 'sparse') {\n return new SparseMatrix(data, datatype);\n }\n throw new TypeError('Unknown matrix type ' + JSON.stringify(format) + '.');\n }\n});","import { factory } from '../../utils/factory.js';\nvar name = 'matrixFromFunction';\nvar dependencies = ['typed', 'matrix', 'isZero'];\nexport var createMatrixFromFunction = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n matrix,\n isZero\n } = _ref;\n /**\n * Create a matrix by evaluating a generating function at each index.\n * The simplest overload returns a multi-dimensional array as long as `size` is an array.\n * Passing `size` as a Matrix or specifying a `format` will result in returning a Matrix.\n *\n * Syntax:\n *\n * math.matrixFromFunction(size, fn)\n * math.matrixFromFunction(size, fn, format)\n * math.matrixFromFunction(size, fn, format, datatype)\n * math.matrixFromFunction(size, format, fn)\n * math.matrixFromFunction(size, format, datatype, fn)\n *\n * Examples:\n *\n * math.matrixFromFunction([3,3], i => i[0] - i[1]) // an antisymmetric matrix\n * math.matrixFromFunction([100, 100], 'sparse', i => i[0] - i[1] === 1 ? 4 : 0) // a sparse subdiagonal matrix\n * math.matrixFromFunction([5], i => math.random()) // a random vector\n *\n * See also:\n *\n * matrix, zeros\n *\n * @param {Array | Matrix} size The size of the matrix to be created\n * @param {function} fn Callback function invoked for every entry in the matrix\n * @param {string} [format] The Matrix storage format, either `'dense'` or `'sparse'`\n * @param {string} [datatype] Type of the values\n * @return {Array | Matrix} Returns the created matrix\n */\n return typed(name, {\n 'Array | Matrix, function, string, string': function ArrayMatrixFunctionStringString(size, fn, format, datatype) {\n return _create(size, fn, format, datatype);\n },\n 'Array | Matrix, function, string': function ArrayMatrixFunctionString(size, fn, format) {\n return _create(size, fn, format);\n },\n 'Matrix, function': function MatrixFunction(size, fn) {\n return _create(size, fn, 'dense');\n },\n 'Array, function': function ArrayFunction(size, fn) {\n return _create(size, fn, 'dense').toArray();\n },\n 'Array | Matrix, string, function': function ArrayMatrixStringFunction(size, format, fn) {\n return _create(size, fn, format);\n },\n 'Array | Matrix, string, string, function': function ArrayMatrixStringStringFunction(size, format, datatype, fn) {\n return _create(size, fn, format, datatype);\n }\n });\n function _create(size, fn, format, datatype) {\n var m;\n if (datatype !== undefined) {\n m = matrix(format, datatype);\n } else {\n m = matrix(format);\n }\n m.resize(size);\n m.forEach(function (_, index) {\n var val = fn(index);\n if (isZero(val)) return;\n m.set(index, val);\n });\n return m;\n }\n});","import { factory } from '../../utils/factory.js';\nvar name = 'matrixFromRows';\nvar dependencies = ['typed', 'matrix', 'flatten', 'size'];\nexport var createMatrixFromRows = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n matrix,\n flatten,\n size\n } = _ref;\n /**\n * Create a dense matrix from vectors as individual rows.\n * If you pass column vectors, they will be transposed (but not conjugated!)\n *\n * Syntax:\n *\n * math.matrixFromRows(...arr)\n * math.matrixFromRows(row1, row2)\n * math.matrixFromRows(row1, row2, row3)\n *\n * Examples:\n *\n * math.matrixFromRows([1, 2, 3], [[4],[5],[6]])\n * math.matrixFromRows(...vectors)\n *\n * See also:\n *\n * matrix, matrixFromColumns, matrixFromFunction, zeros\n *\n * @param {... Array | Matrix} rows Multiple rows\n * @return { number[][] | Matrix } if at least one of the arguments is an array, an array will be returned\n */\n return typed(name, {\n '...Array': function Array(arr) {\n return _createArray(arr);\n },\n '...Matrix': function Matrix(arr) {\n return matrix(_createArray(arr.map(m => m.toArray())));\n }\n\n // TODO implement this properly for SparseMatrix\n });\n\n function _createArray(arr) {\n if (arr.length === 0) throw new TypeError('At least one row is needed to construct a matrix.');\n var N = checkVectorTypeAndReturnLength(arr[0]);\n var result = [];\n for (var row of arr) {\n var rowLength = checkVectorTypeAndReturnLength(row);\n if (rowLength !== N) {\n throw new TypeError('The vectors had different length: ' + (N | 0) + ' ≠ ' + (rowLength | 0));\n }\n result.push(flatten(row));\n }\n return result;\n }\n function checkVectorTypeAndReturnLength(vec) {\n var s = size(vec);\n if (s.length === 1) {\n // 1D vector\n return s[0];\n } else if (s.length === 2) {\n // 2D vector\n if (s[0] === 1) {\n // row vector\n return s[1];\n } else if (s[1] === 1) {\n // col vector\n return s[0];\n } else {\n throw new TypeError('At least one of the arguments is not a vector.');\n }\n } else {\n throw new TypeError('Only one- or two-dimensional vectors are supported.');\n }\n }\n});","import { factory } from '../../utils/factory.js';\nvar name = 'matrixFromColumns';\nvar dependencies = ['typed', 'matrix', 'flatten', 'size'];\nexport var createMatrixFromColumns = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n matrix,\n flatten,\n size\n } = _ref;\n /**\n * Create a dense matrix from vectors as individual columns.\n * If you pass row vectors, they will be transposed (but not conjugated!)\n *\n * Syntax:\n *\n * math.matrixFromColumns(...arr)\n * math.matrixFromColumns(col1, col2)\n * math.matrixFromColumns(col1, col2, col3)\n *\n * Examples:\n *\n * math.matrixFromColumns([1, 2, 3], [[4],[5],[6]])\n * math.matrixFromColumns(...vectors)\n *\n * See also:\n *\n * matrix, matrixFromRows, matrixFromFunction, zeros\n *\n * @param {... Array | Matrix} cols Multiple columns\n * @return { number[][] | Matrix } if at least one of the arguments is an array, an array will be returned\n */\n return typed(name, {\n '...Array': function Array(arr) {\n return _createArray(arr);\n },\n '...Matrix': function Matrix(arr) {\n return matrix(_createArray(arr.map(m => m.toArray())));\n }\n\n // TODO implement this properly for SparseMatrix\n });\n\n function _createArray(arr) {\n if (arr.length === 0) throw new TypeError('At least one column is needed to construct a matrix.');\n var N = checkVectorTypeAndReturnLength(arr[0]);\n\n // create an array with empty rows\n var result = [];\n for (var i = 0; i < N; i++) {\n result[i] = [];\n }\n\n // loop columns\n for (var col of arr) {\n var colLength = checkVectorTypeAndReturnLength(col);\n if (colLength !== N) {\n throw new TypeError('The vectors had different length: ' + (N | 0) + ' ≠ ' + (colLength | 0));\n }\n var f = flatten(col);\n\n // push a value to each row\n for (var _i = 0; _i < N; _i++) {\n result[_i].push(f[_i]);\n }\n }\n return result;\n }\n function checkVectorTypeAndReturnLength(vec) {\n var s = size(vec);\n if (s.length === 1) {\n // 1D vector\n return s[0];\n } else if (s.length === 2) {\n // 2D vector\n if (s[0] === 1) {\n // row vector\n return s[1];\n } else if (s[1] === 1) {\n // col vector\n return s[0];\n } else {\n throw new TypeError('At least one of the arguments is not a vector.');\n }\n } else {\n throw new TypeError('Only one- or two-dimensional vectors are supported.');\n }\n }\n});","import { factory } from '../../../utils/factory.js';\nvar name = 'splitUnit';\nvar dependencies = ['typed'];\nexport var createSplitUnit = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed\n } = _ref;\n /**\n * Split a unit in an array of units whose sum is equal to the original unit.\n *\n * Syntax:\n *\n * math.splitUnit(unit: Unit, parts: Array.)\n *\n * Example:\n *\n * math.splitUnit(new Unit(1, 'm'), ['feet', 'inch'])\n * // [ 3 feet, 3.3700787401575 inch ]\n *\n * See also:\n *\n * unit\n *\n * @param {Array} [parts] An array of strings or valueless units.\n * @return {Array} An array of units.\n */\n return typed(name, {\n 'Unit, Array': function UnitArray(unit, parts) {\n return unit.splitUnit(parts);\n }\n });\n});","import { factory } from '../../utils/factory.js';\nimport { deepMap } from '../../utils/collection.js';\nimport { unaryMinusNumber } from '../../plain/number/index.js';\nvar name = 'unaryMinus';\nvar dependencies = ['typed'];\nexport var createUnaryMinus = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed\n } = _ref;\n /**\n * Inverse the sign of a value, apply a unary minus operation.\n *\n * For matrices, the function is evaluated element wise. Boolean values and\n * strings will be converted to a number. For complex numbers, both real and\n * complex value are inverted.\n *\n * Syntax:\n *\n * math.unaryMinus(x)\n *\n * Examples:\n *\n * math.unaryMinus(3.5) // returns -3.5\n * math.unaryMinus(-4.2) // returns 4.2\n *\n * See also:\n *\n * add, subtract, unaryPlus\n *\n * @param {number | BigNumber | Fraction | Complex | Unit | Array | Matrix} x Number to be inverted.\n * @return {number | BigNumber | Fraction | Complex | Unit | Array | Matrix} Returns the value with inverted sign.\n */\n return typed(name, {\n number: unaryMinusNumber,\n 'Complex | BigNumber | Fraction': x => x.neg(),\n Unit: typed.referToSelf(self => x => {\n var res = x.clone();\n res.value = typed.find(self, res.valueType())(x.value);\n return res;\n }),\n // deep map collection, skip zeros since unaryMinus(0) = 0\n 'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self, true))\n\n // TODO: add support for string\n });\n});","import { factory } from '../../utils/factory.js';\nimport { deepMap } from '../../utils/collection.js';\nimport { unaryPlusNumber } from '../../plain/number/index.js';\nvar name = 'unaryPlus';\nvar dependencies = ['typed', 'config', 'BigNumber'];\nexport var createUnaryPlus = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n config,\n BigNumber\n } = _ref;\n /**\n * Unary plus operation.\n * Boolean values and strings will be converted to a number, numeric values will be returned as is.\n *\n * For matrices, the function is evaluated element wise.\n *\n * Syntax:\n *\n * math.unaryPlus(x)\n *\n * Examples:\n *\n * math.unaryPlus(3.5) // returns 3.5\n * math.unaryPlus(1) // returns 1\n *\n * See also:\n *\n * unaryMinus, add, subtract\n *\n * @param {number | BigNumber | Fraction | string | Complex | Unit | Array | Matrix} x\n * Input value\n * @return {number | BigNumber | Fraction | Complex | Unit | Array | Matrix}\n * Returns the input value when numeric, converts to a number when input is non-numeric.\n */\n return typed(name, {\n number: unaryPlusNumber,\n Complex: function Complex(x) {\n return x; // complex numbers are immutable\n },\n\n BigNumber: function BigNumber(x) {\n return x; // bignumbers are immutable\n },\n\n Fraction: function Fraction(x) {\n return x; // fractions are immutable\n },\n\n Unit: function Unit(x) {\n return x.clone();\n },\n // deep map collection, skip zeros since unaryPlus(0) = 0\n 'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self, true)),\n 'boolean | string': function booleanString(x) {\n // convert to a number or bignumber\n return config.number === 'BigNumber' ? new BigNumber(+x) : +x;\n }\n });\n});","import { factory } from '../../utils/factory.js';\nimport { deepMap } from '../../utils/collection.js';\nimport { absNumber } from '../../plain/number/index.js';\nvar name = 'abs';\nvar dependencies = ['typed'];\nexport var createAbs = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed\n } = _ref;\n /**\n * Calculate the absolute value of a number. For matrices, the function is\n * evaluated element wise.\n *\n * Syntax:\n *\n * math.abs(x)\n *\n * Examples:\n *\n * math.abs(3.5) // returns number 3.5\n * math.abs(-4.2) // returns number 4.2\n *\n * math.abs([3, -5, -1, 0, 2]) // returns Array [3, 5, 1, 0, 2]\n *\n * See also:\n *\n * sign\n *\n * @param {number | BigNumber | Fraction | Complex | Array | Matrix | Unit} x\n * A number or matrix for which to get the absolute value\n * @return {number | BigNumber | Fraction | Complex | Array | Matrix | Unit}\n * Absolute value of `x`\n */\n return typed(name, {\n number: absNumber,\n 'Complex | BigNumber | Fraction | Unit': x => x.abs(),\n // deep map collection, skip zeros since abs(0) = 0\n 'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self, true))\n });\n});","import { factory } from '../../utils/factory.js';\nimport { arraySize } from '../../utils/array.js';\nimport { isMatrix } from '../../utils/is.js';\nimport { IndexError } from '../../error/IndexError.js';\nvar name = 'apply';\nvar dependencies = ['typed', 'isInteger'];\nexport var createApply = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n isInteger\n } = _ref;\n /**\n * Apply a function that maps an array to a scalar\n * along a given axis of a matrix or array.\n * Returns a new matrix or array with one less dimension than the input.\n *\n * Syntax:\n *\n * math.apply(A, dim, callback)\n *\n * Where:\n *\n * - `dim: number` is a zero-based dimension over which to concatenate the matrices.\n *\n * Examples:\n *\n * const A = [[1, 2], [3, 4]]\n * const sum = math.sum\n *\n * math.apply(A, 0, sum) // returns [4, 6]\n * math.apply(A, 1, sum) // returns [3, 7]\n *\n * See also:\n *\n * map, filter, forEach\n *\n * @param {Array | Matrix} array The input Matrix\n * @param {number} dim The dimension along which the callback is applied\n * @param {Function} callback The callback function that is applied. This Function\n * should take an array or 1-d matrix as an input and\n * return a number.\n * @return {Array | Matrix} res The residual matrix with the function applied over some dimension.\n */\n return typed(name, {\n 'Array | Matrix, number | BigNumber, function': function ArrayMatrixNumberBigNumberFunction(mat, dim, callback) {\n if (!isInteger(dim)) {\n throw new TypeError('Integer number expected for dimension');\n }\n var size = Array.isArray(mat) ? arraySize(mat) : mat.size();\n if (dim < 0 || dim >= size.length) {\n throw new IndexError(dim, size.length);\n }\n if (isMatrix(mat)) {\n return mat.create(_apply(mat.valueOf(), dim, callback));\n } else {\n return _apply(mat, dim, callback);\n }\n }\n });\n});\n\n/**\n * Recursively reduce a matrix\n * @param {Array} mat\n * @param {number} dim\n * @param {Function} callback\n * @returns {Array} ret\n * @private\n */\nfunction _apply(mat, dim, callback) {\n var i, ret, tran;\n if (dim <= 0) {\n if (!Array.isArray(mat[0])) {\n return callback(mat);\n } else {\n tran = _switch(mat);\n ret = [];\n for (i = 0; i < tran.length; i++) {\n ret[i] = _apply(tran[i], dim - 1, callback);\n }\n return ret;\n }\n } else {\n ret = [];\n for (i = 0; i < mat.length; i++) {\n ret[i] = _apply(mat[i], dim - 1, callback);\n }\n return ret;\n }\n}\n\n/**\n * Transpose a matrix\n * @param {Array} mat\n * @returns {Array} ret\n * @private\n */\nfunction _switch(mat) {\n var I = mat.length;\n var J = mat[0].length;\n var i, j;\n var ret = [];\n for (j = 0; j < J; j++) {\n var tmp = [];\n for (i = 0; i < I; i++) {\n tmp.push(mat[i][j]);\n }\n ret.push(tmp);\n }\n return ret;\n}","import { factory } from '../../utils/factory.js';\nimport { addNumber } from '../../plain/number/index.js';\nvar name = 'addScalar';\nvar dependencies = ['typed'];\nexport var createAddScalar = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed\n } = _ref;\n /**\n * Add two scalar values, `x + y`.\n * This function is meant for internal use: it is used by the public function\n * `add`\n *\n * This function does not support collections (Array or Matrix).\n *\n * @param {number | BigNumber | Fraction | Complex | Unit} x First value to add\n * @param {number | BigNumber | Fraction | Complex} y Second value to add\n * @return {number | BigNumber | Fraction | Complex | Unit} Sum of `x` and `y`\n * @private\n */\n return typed(name, {\n 'number, number': addNumber,\n 'Complex, Complex': function ComplexComplex(x, y) {\n return x.add(y);\n },\n 'BigNumber, BigNumber': function BigNumberBigNumber(x, y) {\n return x.plus(y);\n },\n 'Fraction, Fraction': function FractionFraction(x, y) {\n return x.add(y);\n },\n 'Unit, Unit': typed.referToSelf(self => (x, y) => {\n if (x.value === null || x.value === undefined) {\n throw new Error('Parameter x contains a unit with undefined value');\n }\n if (y.value === null || y.value === undefined) {\n throw new Error('Parameter y contains a unit with undefined value');\n }\n if (!x.equalBase(y)) throw new Error('Units do not match');\n var res = x.clone();\n res.value = typed.find(self, [res.valueType(), y.valueType()])(res.value, y.value);\n res.fixPrefix = false;\n return res;\n })\n });\n});","import { factory } from '../../utils/factory.js';\nimport { isBigNumber, isComplex, isFraction } from '../../utils/is.js';\nimport { cbrtNumber } from '../../plain/number/index.js';\nvar name = 'cbrt';\nvar dependencies = ['config', 'typed', 'isNegative', 'unaryMinus', 'matrix', 'Complex', 'BigNumber', 'Fraction'];\nexport var createCbrt = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n config,\n typed,\n isNegative,\n unaryMinus,\n matrix,\n Complex,\n BigNumber,\n Fraction\n } = _ref;\n /**\n * Calculate the cubic root of a value.\n *\n * To avoid confusion with the matrix cube root, this function does not\n * apply to matrices. For a matrix, to take the cube root elementwise,\n * see the examples.\n *\n * Syntax:\n *\n * math.cbrt(x)\n * math.cbrt(x, allRoots)\n *\n * Examples:\n *\n * math.cbrt(27) // returns 3\n * math.cube(3) // returns 27\n * math.cbrt(-64) // returns -4\n * math.cbrt(math.unit('27 m^3')) // returns Unit 3 m\n * math.map([27, 64, 125], x => math.cbrt(x)) // returns [3, 4, 5]\n *\n * const x = math.complex('8i')\n * math.cbrt(x) // returns Complex 1.7320508075689 + i\n * math.cbrt(x, true) // returns Matrix [\n * // 1.7320508075689 + i\n * // -1.7320508075689 + i\n * // -2i\n * // ]\n *\n * See also:\n *\n * square, sqrt, cube\n *\n * @param {number | BigNumber | Complex | Unit} x\n * Value for which to calculate the cubic root.\n * @param {boolean} [allRoots] Optional, false by default. Only applicable\n * when `x` is a number or complex number. If true, all complex\n * roots are returned, if false (default) the principal root is\n * returned.\n * @return {number | BigNumber | Complex | Unit}\n * Returns the cubic root of `x`\n */\n return typed(name, {\n number: cbrtNumber,\n // note: signature 'number, boolean' is also supported,\n // created by typed as it knows how to convert number to Complex\n\n Complex: _cbrtComplex,\n 'Complex, boolean': _cbrtComplex,\n BigNumber: function BigNumber(x) {\n return x.cbrt();\n },\n Unit: _cbrtUnit\n });\n\n /**\n * Calculate the cubic root for a complex number\n * @param {Complex} x\n * @param {boolean} [allRoots] If true, the function will return an array\n * with all three roots. If false or undefined,\n * the principal root is returned.\n * @returns {Complex | Array. | Matrix.} Returns the cubic root(s) of x\n * @private\n */\n function _cbrtComplex(x, allRoots) {\n // https://www.wikiwand.com/en/Cube_root#/Complex_numbers\n\n var arg3 = x.arg() / 3;\n var abs = x.abs();\n\n // principal root:\n var principal = new Complex(cbrtNumber(abs), 0).mul(new Complex(0, arg3).exp());\n if (allRoots) {\n var all = [principal, new Complex(cbrtNumber(abs), 0).mul(new Complex(0, arg3 + Math.PI * 2 / 3).exp()), new Complex(cbrtNumber(abs), 0).mul(new Complex(0, arg3 - Math.PI * 2 / 3).exp())];\n return config.matrix === 'Array' ? all : matrix(all);\n } else {\n return principal;\n }\n }\n\n /**\n * Calculate the cubic root for a Unit\n * @param {Unit} x\n * @return {Unit} Returns the cubic root of x\n * @private\n */\n function _cbrtUnit(x) {\n if (x.value && isComplex(x.value)) {\n var result = x.clone();\n result.value = 1.0;\n result = result.pow(1.0 / 3); // Compute the units\n result.value = _cbrtComplex(x.value); // Compute the value\n return result;\n } else {\n var negate = isNegative(x.value);\n if (negate) {\n x.value = unaryMinus(x.value);\n }\n\n // TODO: create a helper function for this\n var third;\n if (isBigNumber(x.value)) {\n third = new BigNumber(1).div(3);\n } else if (isFraction(x.value)) {\n third = new Fraction(1, 3);\n } else {\n third = 1 / 3;\n }\n var _result = x.pow(third);\n if (negate) {\n _result.value = unaryMinus(_result.value);\n }\n return _result;\n }\n }\n});","import { factory } from '../../../utils/factory.js';\nvar name = 'matAlgo11xS0s';\nvar dependencies = ['typed', 'equalScalar'];\nexport var createMatAlgo11xS0s = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n equalScalar\n } = _ref;\n /**\n * Iterates over SparseMatrix S nonzero items and invokes the callback function f(Sij, b).\n * Callback function invoked NZ times (number of nonzero items in S).\n *\n *\n * ┌ f(Sij, b) ; S(i,j) !== 0\n * C(i,j) = ┤\n * └ 0 ; otherwise\n *\n *\n * @param {Matrix} s The SparseMatrix instance (S)\n * @param {Scalar} b The Scalar value\n * @param {Function} callback The f(Aij,b) operation to invoke\n * @param {boolean} inverse A true value indicates callback should be invoked f(b,Sij)\n *\n * @return {Matrix} SparseMatrix (C)\n *\n * https://github.com/josdejong/mathjs/pull/346#issuecomment-97626813\n */\n return function matAlgo11xS0s(s, b, callback, inverse) {\n // sparse matrix arrays\n var avalues = s._values;\n var aindex = s._index;\n var aptr = s._ptr;\n var asize = s._size;\n var adt = s._datatype;\n\n // sparse matrix cannot be a Pattern matrix\n if (!avalues) {\n throw new Error('Cannot perform operation on Pattern Sparse Matrix and Scalar value');\n }\n\n // rows & columns\n var rows = asize[0];\n var columns = asize[1];\n\n // datatype\n var dt;\n // equal signature to use\n var eq = equalScalar;\n // zero value\n var zero = 0;\n // callback signature to use\n var cf = callback;\n\n // process data types\n if (typeof adt === 'string') {\n // datatype\n dt = adt;\n // find signature that matches (dt, dt)\n eq = typed.find(equalScalar, [dt, dt]);\n // convert 0 to the same datatype\n zero = typed.convert(0, dt);\n // convert b to the same datatype\n b = typed.convert(b, dt);\n // callback\n cf = typed.find(callback, [dt, dt]);\n }\n\n // result arrays\n var cvalues = [];\n var cindex = [];\n var cptr = [];\n\n // loop columns\n for (var j = 0; j < columns; j++) {\n // initialize ptr\n cptr[j] = cindex.length;\n // values in j\n for (var k0 = aptr[j], k1 = aptr[j + 1], k = k0; k < k1; k++) {\n // row\n var i = aindex[k];\n // invoke callback\n var v = inverse ? cf(b, avalues[k]) : cf(avalues[k], b);\n // check value is zero\n if (!eq(v, zero)) {\n // push index & value\n cindex.push(i);\n cvalues.push(v);\n }\n }\n }\n // update ptr\n cptr[columns] = cindex.length;\n\n // return sparse matrix\n return s.createSparseMatrix({\n values: cvalues,\n index: cindex,\n ptr: cptr,\n size: [rows, columns],\n datatype: dt\n });\n };\n});","import { factory } from '../../../utils/factory.js';\nvar name = 'matAlgo12xSfs';\nvar dependencies = ['typed', 'DenseMatrix'];\nexport var createMatAlgo12xSfs = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n DenseMatrix\n } = _ref;\n /**\n * Iterates over SparseMatrix S nonzero items and invokes the callback function f(Sij, b).\n * Callback function invoked MxN times.\n *\n *\n * ┌ f(Sij, b) ; S(i,j) !== 0\n * C(i,j) = ┤\n * └ f(0, b) ; otherwise\n *\n *\n * @param {Matrix} s The SparseMatrix instance (S)\n * @param {Scalar} b The Scalar value\n * @param {Function} callback The f(Aij,b) operation to invoke\n * @param {boolean} inverse A true value indicates callback should be invoked f(b,Sij)\n *\n * @return {Matrix} DenseMatrix (C)\n *\n * https://github.com/josdejong/mathjs/pull/346#issuecomment-97626813\n */\n return function matAlgo12xSfs(s, b, callback, inverse) {\n // sparse matrix arrays\n var avalues = s._values;\n var aindex = s._index;\n var aptr = s._ptr;\n var asize = s._size;\n var adt = s._datatype;\n\n // sparse matrix cannot be a Pattern matrix\n if (!avalues) {\n throw new Error('Cannot perform operation on Pattern Sparse Matrix and Scalar value');\n }\n\n // rows & columns\n var rows = asize[0];\n var columns = asize[1];\n\n // datatype\n var dt;\n // callback signature to use\n var cf = callback;\n\n // process data types\n if (typeof adt === 'string') {\n // datatype\n dt = adt;\n // convert b to the same datatype\n b = typed.convert(b, dt);\n // callback\n cf = typed.find(callback, [dt, dt]);\n }\n\n // result arrays\n var cdata = [];\n\n // workspaces\n var x = [];\n // marks indicating we have a value in x for a given column\n var w = [];\n\n // loop columns\n for (var j = 0; j < columns; j++) {\n // columns mark\n var mark = j + 1;\n // values in j\n for (var k0 = aptr[j], k1 = aptr[j + 1], k = k0; k < k1; k++) {\n // row\n var r = aindex[k];\n // update workspace\n x[r] = avalues[k];\n w[r] = mark;\n }\n // loop rows\n for (var i = 0; i < rows; i++) {\n // initialize C on first column\n if (j === 0) {\n // create row array\n cdata[i] = [];\n }\n // check sparse matrix has a value @ i,j\n if (w[i] === mark) {\n // invoke callback, update C\n cdata[i][j] = inverse ? cf(b, x[i]) : cf(x[i], b);\n } else {\n // dense matrix value @ i, j\n cdata[i][j] = inverse ? cf(b, 0) : cf(0, b);\n }\n }\n }\n\n // return dense matrix\n return new DenseMatrix({\n data: cdata,\n size: [rows, columns],\n datatype: dt\n });\n };\n});","import { factory } from '../../../utils/factory.js';\nimport { clone } from '../../../utils/object.js';\nvar name = 'matAlgo14xDs';\nvar dependencies = ['typed'];\nexport var createMatAlgo14xDs = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed\n } = _ref;\n /**\n * Iterates over DenseMatrix items and invokes the callback function f(Aij..z, b).\n * Callback function invoked MxN times.\n *\n * C(i,j,...z) = f(Aij..z, b)\n *\n * @param {Matrix} a The DenseMatrix instance (A)\n * @param {Scalar} b The Scalar value\n * @param {Function} callback The f(Aij..z,b) operation to invoke\n * @param {boolean} inverse A true value indicates callback should be invoked f(b,Aij..z)\n *\n * @return {Matrix} DenseMatrix (C)\n *\n * https://github.com/josdejong/mathjs/pull/346#issuecomment-97659042\n */\n return function matAlgo14xDs(a, b, callback, inverse) {\n // a arrays\n var adata = a._data;\n var asize = a._size;\n var adt = a._datatype;\n\n // datatype\n var dt;\n // callback signature to use\n var cf = callback;\n\n // process data types\n if (typeof adt === 'string') {\n // datatype\n dt = adt;\n // convert b to the same datatype\n b = typed.convert(b, dt);\n // callback\n cf = typed.find(callback, [dt, dt]);\n }\n\n // populate cdata, iterate through dimensions\n var cdata = asize.length > 0 ? _iterate(cf, 0, asize, asize[0], adata, b, inverse) : [];\n\n // c matrix\n return a.createDenseMatrix({\n data: cdata,\n size: clone(asize),\n datatype: dt\n });\n };\n\n // recursive function\n function _iterate(f, level, s, n, av, bv, inverse) {\n // initialize array for this level\n var cv = [];\n // check we reach the last level\n if (level === s.length - 1) {\n // loop arrays in last level\n for (var i = 0; i < n; i++) {\n // invoke callback and store value\n cv[i] = inverse ? f(bv, av[i]) : f(av[i], bv);\n }\n } else {\n // iterate current level\n for (var j = 0; j < n; j++) {\n // iterate next level\n cv[j] = _iterate(f, level + 1, s, s[level + 1], av[j], bv, inverse);\n }\n }\n return cv;\n }\n});","import Decimal from 'decimal.js';\nimport { factory } from '../../utils/factory.js';\nimport { deepMap } from '../../utils/collection.js';\nimport { nearlyEqual } from '../../utils/number.js';\nimport { nearlyEqual as bigNearlyEqual } from '../../utils/bignumber/nearlyEqual.js';\nimport { createMatAlgo11xS0s } from '../../type/matrix/utils/matAlgo11xS0s.js';\nimport { createMatAlgo12xSfs } from '../../type/matrix/utils/matAlgo12xSfs.js';\nimport { createMatAlgo14xDs } from '../../type/matrix/utils/matAlgo14xDs.js';\nvar name = 'ceil';\nvar dependencies = ['typed', 'config', 'round', 'matrix', 'equalScalar', 'zeros', 'DenseMatrix'];\nexport var createCeilNumber = /* #__PURE__ */factory(name, ['typed', 'config', 'round'], _ref => {\n var {\n typed,\n config,\n round\n } = _ref;\n return typed(name, {\n number: function number(x) {\n if (nearlyEqual(x, round(x), config.epsilon)) {\n return round(x);\n } else {\n return Math.ceil(x);\n }\n },\n 'number, number': function numberNumber(x, n) {\n if (nearlyEqual(x, round(x, n), config.epsilon)) {\n return round(x, n);\n } else {\n var [number, exponent] = \"\".concat(x, \"e\").split('e');\n var result = Math.ceil(Number(\"\".concat(number, \"e\").concat(Number(exponent) + n)));\n [number, exponent] = \"\".concat(result, \"e\").split('e');\n return Number(\"\".concat(number, \"e\").concat(Number(exponent) - n));\n }\n }\n });\n});\nexport var createCeil = /* #__PURE__ */factory(name, dependencies, _ref2 => {\n var {\n typed,\n config,\n round,\n matrix,\n equalScalar,\n zeros,\n DenseMatrix\n } = _ref2;\n var matAlgo11xS0s = createMatAlgo11xS0s({\n typed,\n equalScalar\n });\n var matAlgo12xSfs = createMatAlgo12xSfs({\n typed,\n DenseMatrix\n });\n var matAlgo14xDs = createMatAlgo14xDs({\n typed\n });\n var ceilNumber = createCeilNumber({\n typed,\n config,\n round\n });\n /**\n * Round a value towards plus infinity\n * If `x` is complex, both real and imaginary part are rounded towards plus infinity.\n * For matrices, the function is evaluated element wise.\n *\n * Syntax:\n *\n * math.ceil(x)\n * math.ceil(x, n)\n *\n * Examples:\n *\n * math.ceil(3.2) // returns number 4\n * math.ceil(3.8) // returns number 4\n * math.ceil(-4.2) // returns number -4\n * math.ceil(-4.7) // returns number -4\n *\n * math.ceil(3.212, 2) // returns number 3.22\n * math.ceil(3.288, 2) // returns number 3.29\n * math.ceil(-4.212, 2) // returns number -4.21\n * math.ceil(-4.782, 2) // returns number -4.78\n *\n * const c = math.complex(3.24, -2.71)\n * math.ceil(c) // returns Complex 4 - 2i\n * math.ceil(c, 1) // returns Complex 3.3 - 2.7i\n *\n * math.ceil([3.2, 3.8, -4.7]) // returns Array [4, 4, -4]\n * math.ceil([3.21, 3.82, -4.71], 1) // returns Array [3.3, 3.9, -4.7]\n *\n * See also:\n *\n * floor, fix, round\n *\n * @param {number | BigNumber | Fraction | Complex | Array | Matrix} x Number to be rounded\n * @param {number | BigNumber | Array} [n=0] Number of decimals\n * @return {number | BigNumber | Fraction | Complex | Array | Matrix} Rounded value\n */\n return typed('ceil', {\n number: ceilNumber.signatures.number,\n 'number,number': ceilNumber.signatures['number,number'],\n Complex: function Complex(x) {\n return x.ceil();\n },\n 'Complex, number': function ComplexNumber(x, n) {\n return x.ceil(n);\n },\n 'Complex, BigNumber': function ComplexBigNumber(x, n) {\n return x.ceil(n.toNumber());\n },\n BigNumber: function BigNumber(x) {\n if (bigNearlyEqual(x, round(x), config.epsilon)) {\n return round(x);\n } else {\n return x.ceil();\n }\n },\n 'BigNumber, BigNumber': function BigNumberBigNumber(x, n) {\n if (bigNearlyEqual(x, round(x, n), config.epsilon)) {\n return round(x, n);\n } else {\n return x.toDecimalPlaces(n.toNumber(), Decimal.ROUND_CEIL);\n }\n },\n Fraction: function Fraction(x) {\n return x.ceil();\n },\n 'Fraction, number': function FractionNumber(x, n) {\n return x.ceil(n);\n },\n 'Fraction, BigNumber': function FractionBigNumber(x, n) {\n return x.ceil(n.toNumber());\n },\n 'Array | Matrix': typed.referToSelf(self => x => {\n // deep map collection, skip zeros since ceil(0) = 0\n return deepMap(x, self, true);\n }),\n 'Array, number | BigNumber': typed.referToSelf(self => (x, n) => {\n // deep map collection, skip zeros since ceil(0) = 0\n return deepMap(x, i => self(i, n), true);\n }),\n 'SparseMatrix, number | BigNumber': typed.referToSelf(self => (x, y) => {\n return matAlgo11xS0s(x, y, self, false);\n }),\n 'DenseMatrix, number | BigNumber': typed.referToSelf(self => (x, y) => {\n return matAlgo14xDs(x, y, self, false);\n }),\n 'number | Complex | Fraction | BigNumber, Array': typed.referToSelf(self => (x, y) => {\n // use matrix implementation\n return matAlgo14xDs(matrix(y), x, self, true).valueOf();\n }),\n 'number | Complex | Fraction | BigNumber, Matrix': typed.referToSelf(self => (x, y) => {\n if (equalScalar(x, 0)) return zeros(y.size(), y.storage());\n if (y.storage() === 'dense') {\n return matAlgo14xDs(y, x, self, true);\n }\n return matAlgo12xSfs(y, x, self, true);\n })\n });\n});","import { factory } from '../../utils/factory.js';\nimport { cubeNumber } from '../../plain/number/index.js';\nvar name = 'cube';\nvar dependencies = ['typed'];\nexport var createCube = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed\n } = _ref;\n /**\n * Compute the cube of a value, `x * x * x`.\n * To avoid confusion with `pow(M,3)`, this function does not apply to matrices.\n * If you wish to cube every entry of a matrix, see the examples.\n *\n * Syntax:\n *\n * math.cube(x)\n *\n * Examples:\n *\n * math.cube(2) // returns number 8\n * math.pow(2, 3) // returns number 8\n * math.cube(4) // returns number 64\n * 4 * 4 * 4 // returns number 64\n *\n * math.map([1, 2, 3, 4], math.cube) // returns Array [1, 8, 27, 64]\n *\n * See also:\n *\n * multiply, square, pow, cbrt\n *\n * @param {number | BigNumber | Fraction | Complex | Unit} x Number for which to calculate the cube\n * @return {number | BigNumber | Fraction | Complex | Unit} Cube of x\n */\n return typed(name, {\n number: cubeNumber,\n Complex: function Complex(x) {\n return x.mul(x).mul(x); // Is faster than pow(x, 3)\n },\n\n BigNumber: function BigNumber(x) {\n return x.times(x).times(x);\n },\n Fraction: function Fraction(x) {\n return x.pow(3); // Is faster than mul()mul()mul()\n },\n\n Unit: function Unit(x) {\n return x.pow(3);\n }\n });\n});","import { factory } from '../../utils/factory.js';\nimport { expNumber } from '../../plain/number/index.js';\nvar name = 'exp';\nvar dependencies = ['typed'];\nexport var createExp = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed\n } = _ref;\n /**\n * Calculate the exponential of a value.\n * For matrices, if you want the matrix exponential of square matrix, use\n * the `expm` function; if you want to take the exponential of each element,\n * see the examples.\n *\n * Syntax:\n *\n * math.exp(x)\n *\n * Examples:\n *\n * math.exp(2) // returns number 7.3890560989306495\n * math.pow(math.e, 2) // returns number 7.3890560989306495\n * math.log(math.exp(2)) // returns number 2\n *\n * math.map([1, 2, 3], math.exp)\n * // returns Array [\n * // 2.718281828459045,\n * // 7.3890560989306495,\n * // 20.085536923187668\n * // ]\n *\n * See also:\n *\n * expm1, expm, log, pow\n *\n * @param {number | BigNumber | Complex} x A number to exponentiate\n * @return {number | BigNumber | Complex} Exponential of `x`\n */\n return typed(name, {\n number: expNumber,\n Complex: function Complex(x) {\n return x.exp();\n },\n BigNumber: function BigNumber(x) {\n return x.exp();\n }\n });\n});","import { factory } from '../../utils/factory.js';\nimport { expm1Number } from '../../plain/number/index.js';\nvar name = 'expm1';\nvar dependencies = ['typed', 'Complex'];\nexport var createExpm1 = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n Complex: _Complex\n } = _ref;\n /**\n * Calculate the value of subtracting 1 from the exponential value.\n * This function is more accurate than `math.exp(x)-1` when `x` is near 0\n * To avoid ambiguity with the matrix exponential `expm`, this function\n * does not operate on matrices; if you wish to apply it elementwise, see\n * the examples.\n *\n * Syntax:\n *\n * math.expm1(x)\n *\n * Examples:\n *\n * math.expm1(2) // returns number 6.38905609893065\n * math.pow(math.e, 2) - 1 // returns number 6.3890560989306495\n * math.expm1(1e-8) // returns number 1.0000000050000001e-8\n * math.exp(1e-8) - 1 // returns number 9.9999999392253e-9\n * math.log(math.expm1(2) + 1) // returns number 2\n *\n * math.map([1, 2, 3], math.expm1)\n * // returns Array [\n * // 1.718281828459045,\n * // 6.3890560989306495,\n * // 19.085536923187668\n * // ]\n *\n * See also:\n *\n * exp, expm, log, pow\n *\n * @param {number | BigNumber | Complex} x The number to exponentiate\n * @return {number | BigNumber | Complex} Exponential of `x`, minus one\n */\n return typed(name, {\n number: expm1Number,\n Complex: function Complex(x) {\n var r = Math.exp(x.re);\n return new _Complex(r * Math.cos(x.im) - 1, r * Math.sin(x.im));\n },\n BigNumber: function BigNumber(x) {\n return x.exp().minus(1);\n }\n });\n});","import { factory } from '../../utils/factory.js';\nimport { deepMap } from '../../utils/collection.js';\nimport { createMatAlgo12xSfs } from '../../type/matrix/utils/matAlgo12xSfs.js';\nimport { createMatAlgo14xDs } from '../../type/matrix/utils/matAlgo14xDs.js';\nvar name = 'fix';\nvar dependencies = ['typed', 'Complex', 'matrix', 'ceil', 'floor', 'equalScalar', 'zeros', 'DenseMatrix'];\nexport var createFixNumber = /* #__PURE__ */factory(name, ['typed', 'ceil', 'floor'], _ref => {\n var {\n typed,\n ceil,\n floor\n } = _ref;\n return typed(name, {\n number: function number(x) {\n return x > 0 ? floor(x) : ceil(x);\n },\n 'number, number': function numberNumber(x, n) {\n return x > 0 ? floor(x, n) : ceil(x, n);\n }\n });\n});\nexport var createFix = /* #__PURE__ */factory(name, dependencies, _ref2 => {\n var {\n typed,\n Complex: _Complex,\n matrix,\n ceil,\n floor,\n equalScalar,\n zeros,\n DenseMatrix\n } = _ref2;\n var matAlgo12xSfs = createMatAlgo12xSfs({\n typed,\n DenseMatrix\n });\n var matAlgo14xDs = createMatAlgo14xDs({\n typed\n });\n var fixNumber = createFixNumber({\n typed,\n ceil,\n floor\n });\n /**\n * Round a value towards zero.\n * For matrices, the function is evaluated element wise.\n *\n * Syntax:\n *\n * math.fix(x)\n * math.fix(x,n)\n *\n * Examples:\n *\n * math.fix(3.2) // returns number 3\n * math.fix(3.8) // returns number 3\n * math.fix(-4.2) // returns number -4\n * math.fix(-4.7) // returns number -4\n *\n * math.fix(3.12, 1) // returns number 3.1\n * math.fix(3.18, 1) // returns number 3.1\n * math.fix(-4.12, 1) // returns number -4.1\n * math.fix(-4.17, 1) // returns number -4.1\n *\n * const c = math.complex(3.22, -2.78)\n * math.fix(c) // returns Complex 3 - 2i\n * math.fix(c, 1) // returns Complex 3.2 -2.7i\n *\n * math.fix([3.2, 3.8, -4.7]) // returns Array [3, 3, -4]\n * math.fix([3.2, 3.8, -4.7], 1) // returns Array [3.2, 3.8, -4.7]\n *\n * See also:\n *\n * ceil, floor, round\n *\n * @param {number | BigNumber | Fraction | Complex | Array | Matrix} x Number to be rounded\n * @param {number | BigNumber | Array} [n=0] Number of decimals\n * @return {number | BigNumber | Fraction | Complex | Array | Matrix} Rounded value\n */\n return typed('fix', {\n number: fixNumber.signatures.number,\n 'number, number | BigNumber': fixNumber.signatures['number,number'],\n Complex: function Complex(x) {\n return new _Complex(x.re > 0 ? Math.floor(x.re) : Math.ceil(x.re), x.im > 0 ? Math.floor(x.im) : Math.ceil(x.im));\n },\n 'Complex, number': function ComplexNumber(x, n) {\n return new _Complex(x.re > 0 ? floor(x.re, n) : ceil(x.re, n), x.im > 0 ? floor(x.im, n) : ceil(x.im, n));\n },\n 'Complex, BigNumber': function ComplexBigNumber(x, bn) {\n var n = bn.toNumber();\n return new _Complex(x.re > 0 ? floor(x.re, n) : ceil(x.re, n), x.im > 0 ? floor(x.im, n) : ceil(x.im, n));\n },\n BigNumber: function BigNumber(x) {\n return x.isNegative() ? ceil(x) : floor(x);\n },\n 'BigNumber, number | BigNumber': function BigNumberNumberBigNumber(x, n) {\n return x.isNegative() ? ceil(x, n) : floor(x, n);\n },\n Fraction: function Fraction(x) {\n return x.s < 0 ? x.ceil() : x.floor();\n },\n 'Fraction, number | BigNumber': function FractionNumberBigNumber(x, n) {\n return x.s < 0 ? ceil(x, n) : floor(x, n);\n },\n 'Array | Matrix': typed.referToSelf(self => x => {\n // deep map collection, skip zeros since fix(0) = 0\n return deepMap(x, self, true);\n }),\n 'Array | Matrix, number | BigNumber': typed.referToSelf(self => (x, n) => {\n // deep map collection, skip zeros since fix(0) = 0\n return deepMap(x, i => self(i, n), true);\n }),\n 'number | Complex | Fraction | BigNumber, Array': typed.referToSelf(self => (x, y) => {\n // use matrix implementation\n return matAlgo14xDs(matrix(y), x, self, true).valueOf();\n }),\n 'number | Complex | Fraction | BigNumber, Matrix': typed.referToSelf(self => (x, y) => {\n if (equalScalar(x, 0)) return zeros(y.size(), y.storage());\n if (y.storage() === 'dense') {\n return matAlgo14xDs(y, x, self, true);\n }\n return matAlgo12xSfs(y, x, self, true);\n })\n });\n});","import Decimal from 'decimal.js';\nimport { factory } from '../../utils/factory.js';\nimport { deepMap } from '../../utils/collection.js';\nimport { nearlyEqual } from '../../utils/number.js';\nimport { nearlyEqual as bigNearlyEqual } from '../../utils/bignumber/nearlyEqual.js';\nimport { createMatAlgo11xS0s } from '../../type/matrix/utils/matAlgo11xS0s.js';\nimport { createMatAlgo12xSfs } from '../../type/matrix/utils/matAlgo12xSfs.js';\nimport { createMatAlgo14xDs } from '../../type/matrix/utils/matAlgo14xDs.js';\nvar name = 'floor';\nvar dependencies = ['typed', 'config', 'round', 'matrix', 'equalScalar', 'zeros', 'DenseMatrix'];\nexport var createFloorNumber = /* #__PURE__ */factory(name, ['typed', 'config', 'round'], _ref => {\n var {\n typed,\n config,\n round\n } = _ref;\n return typed(name, {\n number: function number(x) {\n if (nearlyEqual(x, round(x), config.epsilon)) {\n return round(x);\n } else {\n return Math.floor(x);\n }\n },\n 'number, number': function numberNumber(x, n) {\n if (nearlyEqual(x, round(x, n), config.epsilon)) {\n return round(x, n);\n } else {\n var [number, exponent] = \"\".concat(x, \"e\").split('e');\n var result = Math.floor(Number(\"\".concat(number, \"e\").concat(Number(exponent) + n)));\n [number, exponent] = \"\".concat(result, \"e\").split('e');\n return Number(\"\".concat(number, \"e\").concat(Number(exponent) - n));\n }\n }\n });\n});\nexport var createFloor = /* #__PURE__ */factory(name, dependencies, _ref2 => {\n var {\n typed,\n config,\n round,\n matrix,\n equalScalar,\n zeros,\n DenseMatrix\n } = _ref2;\n var matAlgo11xS0s = createMatAlgo11xS0s({\n typed,\n equalScalar\n });\n var matAlgo12xSfs = createMatAlgo12xSfs({\n typed,\n DenseMatrix\n });\n var matAlgo14xDs = createMatAlgo14xDs({\n typed\n });\n var floorNumber = createFloorNumber({\n typed,\n config,\n round\n });\n /**\n * Round a value towards minus infinity.\n * For matrices, the function is evaluated element wise.\n *\n * Syntax:\n *\n * math.floor(x)\n * math.floor(x, n)\n *\n * Examples:\n *\n * math.floor(3.2) // returns number 3\n * math.floor(3.8) // returns number 3\n * math.floor(-4.2) // returns number -5\n * math.floor(-4.7) // returns number -5\n *\n * math.floor(3.212, 2) // returns number 3.21\n * math.floor(3.288, 2) // returns number 3.28\n * math.floor(-4.212, 2) // returns number -4.22\n * math.floor(-4.782, 2) // returns number -4.79\n *\n * const c = math.complex(3.24, -2.71)\n * math.floor(c) // returns Complex 3 - 3i\n * math.floor(c, 1) // returns Complex 3.2 -2.8i\n *\n * math.floor([3.2, 3.8, -4.7]) // returns Array [3, 3, -5]\n * math.floor([3.21, 3.82, -4.71], 1) // returns Array [3.2, 3.8, -4.8]\n *\n * math.floor(math.tau, [2, 3]) // returns Array [6.28, 6.283]\n *\n * // Note that floor(array, array) currently not implemented.\n *\n * See also:\n *\n * ceil, fix, round\n *\n * @param {number | BigNumber | Fraction | Complex | Array | Matrix} x Number to be rounded\n * @param {number | BigNumber | Array} [n=0] Number of decimals\n * @return {number | BigNumber | Fraction | Complex | Array | Matrix} Rounded value\n */\n return typed('floor', {\n number: floorNumber.signatures.number,\n 'number,number': floorNumber.signatures['number,number'],\n Complex: function Complex(x) {\n return x.floor();\n },\n 'Complex, number': function ComplexNumber(x, n) {\n return x.floor(n);\n },\n 'Complex, BigNumber': function ComplexBigNumber(x, n) {\n return x.floor(n.toNumber());\n },\n BigNumber: function BigNumber(x) {\n if (bigNearlyEqual(x, round(x), config.epsilon)) {\n return round(x);\n } else {\n return x.floor();\n }\n },\n 'BigNumber, BigNumber': function BigNumberBigNumber(x, n) {\n if (bigNearlyEqual(x, round(x, n), config.epsilon)) {\n return round(x, n);\n } else {\n return x.toDecimalPlaces(n.toNumber(), Decimal.ROUND_FLOOR);\n }\n },\n Fraction: function Fraction(x) {\n return x.floor();\n },\n 'Fraction, number': function FractionNumber(x, n) {\n return x.floor(n);\n },\n 'Fraction, BigNumber': function FractionBigNumber(x, n) {\n return x.floor(n.toNumber());\n },\n 'Array | Matrix': typed.referToSelf(self => x => {\n // deep map collection, skip zeros since floor(0) = 0\n return deepMap(x, self, true);\n }),\n 'Array, number | BigNumber': typed.referToSelf(self => (x, n) => {\n // deep map collection, skip zeros since ceil(0) = 0\n return deepMap(x, i => self(i, n), true);\n }),\n 'SparseMatrix, number | BigNumber': typed.referToSelf(self => (x, y) => {\n return matAlgo11xS0s(x, y, self, false);\n }),\n 'DenseMatrix, number | BigNumber': typed.referToSelf(self => (x, y) => {\n return matAlgo14xDs(x, y, self, false);\n }),\n 'number | Complex | Fraction | BigNumber, Array': typed.referToSelf(self => (x, y) => {\n // use matrix implementation\n return matAlgo14xDs(matrix(y), x, self, true).valueOf();\n }),\n 'number | Complex | Fraction | BigNumber, Matrix': typed.referToSelf(self => (x, y) => {\n if (equalScalar(x, 0)) return zeros(y.size(), y.storage());\n if (y.storage() === 'dense') {\n return matAlgo14xDs(y, x, self, true);\n }\n return matAlgo12xSfs(y, x, self, true);\n })\n });\n});","import { factory } from '../../../utils/factory.js';\nimport { DimensionError } from '../../../error/DimensionError.js';\nvar name = 'matAlgo01xDSid';\nvar dependencies = ['typed'];\nexport var createMatAlgo01xDSid = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed\n } = _ref;\n /**\n * Iterates over SparseMatrix nonzero items and invokes the callback function f(Dij, Sij).\n * Callback function invoked NNZ times (number of nonzero items in SparseMatrix).\n *\n *\n * ┌ f(Dij, Sij) ; S(i,j) !== 0\n * C(i,j) = ┤\n * └ Dij ; otherwise\n *\n *\n * @param {Matrix} denseMatrix The DenseMatrix instance (D)\n * @param {Matrix} sparseMatrix The SparseMatrix instance (S)\n * @param {Function} callback The f(Dij,Sij) operation to invoke, where Dij = DenseMatrix(i,j) and Sij = SparseMatrix(i,j)\n * @param {boolean} inverse A true value indicates callback should be invoked f(Sij,Dij)\n *\n * @return {Matrix} DenseMatrix (C)\n *\n * see https://github.com/josdejong/mathjs/pull/346#issuecomment-97477571\n */\n return function algorithm1(denseMatrix, sparseMatrix, callback, inverse) {\n // dense matrix arrays\n var adata = denseMatrix._data;\n var asize = denseMatrix._size;\n var adt = denseMatrix._datatype;\n // sparse matrix arrays\n var bvalues = sparseMatrix._values;\n var bindex = sparseMatrix._index;\n var bptr = sparseMatrix._ptr;\n var bsize = sparseMatrix._size;\n var bdt = sparseMatrix._datatype;\n\n // validate dimensions\n if (asize.length !== bsize.length) {\n throw new DimensionError(asize.length, bsize.length);\n }\n\n // check rows & columns\n if (asize[0] !== bsize[0] || asize[1] !== bsize[1]) {\n throw new RangeError('Dimension mismatch. Matrix A (' + asize + ') must match Matrix B (' + bsize + ')');\n }\n\n // sparse matrix cannot be a Pattern matrix\n if (!bvalues) {\n throw new Error('Cannot perform operation on Dense Matrix and Pattern Sparse Matrix');\n }\n\n // rows & columns\n var rows = asize[0];\n var columns = asize[1];\n\n // process data types\n var dt = typeof adt === 'string' && adt === bdt ? adt : undefined;\n // callback function\n var cf = dt ? typed.find(callback, [dt, dt]) : callback;\n\n // vars\n var i, j;\n\n // result (DenseMatrix)\n var cdata = [];\n // initialize c\n for (i = 0; i < rows; i++) {\n cdata[i] = [];\n }\n\n // workspace\n var x = [];\n // marks indicating we have a value in x for a given column\n var w = [];\n\n // loop columns in b\n for (j = 0; j < columns; j++) {\n // column mark\n var mark = j + 1;\n // values in column j\n for (var k0 = bptr[j], k1 = bptr[j + 1], k = k0; k < k1; k++) {\n // row\n i = bindex[k];\n // update workspace\n x[i] = inverse ? cf(bvalues[k], adata[i][j]) : cf(adata[i][j], bvalues[k]);\n // mark i as updated\n w[i] = mark;\n }\n // loop rows\n for (i = 0; i < rows; i++) {\n // check row is in workspace\n if (w[i] === mark) {\n // c[i][j] was already calculated\n cdata[i][j] = x[i];\n } else {\n // item does not exist in S\n cdata[i][j] = adata[i][j];\n }\n }\n }\n\n // return dense matrix\n return denseMatrix.createDenseMatrix({\n data: cdata,\n size: [rows, columns],\n datatype: dt\n });\n };\n});","import { factory } from '../../../utils/factory.js';\nimport { DimensionError } from '../../../error/DimensionError.js';\nvar name = 'matAlgo04xSidSid';\nvar dependencies = ['typed', 'equalScalar'];\nexport var createMatAlgo04xSidSid = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n equalScalar\n } = _ref;\n /**\n * Iterates over SparseMatrix A and SparseMatrix B nonzero items and invokes the callback function f(Aij, Bij).\n * Callback function invoked MAX(NNZA, NNZB) times\n *\n *\n * ┌ f(Aij, Bij) ; A(i,j) !== 0 && B(i,j) !== 0\n * C(i,j) = ┤ A(i,j) ; A(i,j) !== 0 && B(i,j) === 0\n * └ B(i,j) ; A(i,j) === 0\n *\n *\n * @param {Matrix} a The SparseMatrix instance (A)\n * @param {Matrix} b The SparseMatrix instance (B)\n * @param {Function} callback The f(Aij,Bij) operation to invoke\n *\n * @return {Matrix} SparseMatrix (C)\n *\n * see https://github.com/josdejong/mathjs/pull/346#issuecomment-97620294\n */\n return function matAlgo04xSidSid(a, b, callback) {\n // sparse matrix arrays\n var avalues = a._values;\n var aindex = a._index;\n var aptr = a._ptr;\n var asize = a._size;\n var adt = a._datatype;\n // sparse matrix arrays\n var bvalues = b._values;\n var bindex = b._index;\n var bptr = b._ptr;\n var bsize = b._size;\n var bdt = b._datatype;\n\n // validate dimensions\n if (asize.length !== bsize.length) {\n throw new DimensionError(asize.length, bsize.length);\n }\n\n // check rows & columns\n if (asize[0] !== bsize[0] || asize[1] !== bsize[1]) {\n throw new RangeError('Dimension mismatch. Matrix A (' + asize + ') must match Matrix B (' + bsize + ')');\n }\n\n // rows & columns\n var rows = asize[0];\n var columns = asize[1];\n\n // datatype\n var dt;\n // equal signature to use\n var eq = equalScalar;\n // zero value\n var zero = 0;\n // callback signature to use\n var cf = callback;\n\n // process data types\n if (typeof adt === 'string' && adt === bdt) {\n // datatype\n dt = adt;\n // find signature that matches (dt, dt)\n eq = typed.find(equalScalar, [dt, dt]);\n // convert 0 to the same datatype\n zero = typed.convert(0, dt);\n // callback\n cf = typed.find(callback, [dt, dt]);\n }\n\n // result arrays\n var cvalues = avalues && bvalues ? [] : undefined;\n var cindex = [];\n var cptr = [];\n\n // workspace\n var xa = avalues && bvalues ? [] : undefined;\n var xb = avalues && bvalues ? [] : undefined;\n // marks indicating we have a value in x for a given column\n var wa = [];\n var wb = [];\n\n // vars\n var i, j, k, k0, k1;\n\n // loop columns\n for (j = 0; j < columns; j++) {\n // update cptr\n cptr[j] = cindex.length;\n // columns mark\n var mark = j + 1;\n // loop A(:,j)\n for (k0 = aptr[j], k1 = aptr[j + 1], k = k0; k < k1; k++) {\n // row\n i = aindex[k];\n // update c\n cindex.push(i);\n // update workspace\n wa[i] = mark;\n // check we need to process values\n if (xa) {\n xa[i] = avalues[k];\n }\n }\n // loop B(:,j)\n for (k0 = bptr[j], k1 = bptr[j + 1], k = k0; k < k1; k++) {\n // row\n i = bindex[k];\n // check row exists in A\n if (wa[i] === mark) {\n // update record in xa @ i\n if (xa) {\n // invoke callback\n var v = cf(xa[i], bvalues[k]);\n // check for zero\n if (!eq(v, zero)) {\n // update workspace\n xa[i] = v;\n } else {\n // remove mark (index will be removed later)\n wa[i] = null;\n }\n }\n } else {\n // update c\n cindex.push(i);\n // update workspace\n wb[i] = mark;\n // check we need to process values\n if (xb) {\n xb[i] = bvalues[k];\n }\n }\n }\n // check we need to process values (non pattern matrix)\n if (xa && xb) {\n // initialize first index in j\n k = cptr[j];\n // loop index in j\n while (k < cindex.length) {\n // row\n i = cindex[k];\n // check workspace has value @ i\n if (wa[i] === mark) {\n // push value (Aij != 0 || (Aij != 0 && Bij != 0))\n cvalues[k] = xa[i];\n // increment pointer\n k++;\n } else if (wb[i] === mark) {\n // push value (bij != 0)\n cvalues[k] = xb[i];\n // increment pointer\n k++;\n } else {\n // remove index @ k\n cindex.splice(k, 1);\n }\n }\n }\n }\n // update cptr\n cptr[columns] = cindex.length;\n\n // return sparse matrix\n return a.createSparseMatrix({\n values: cvalues,\n index: cindex,\n ptr: cptr,\n size: [rows, columns],\n datatype: dt\n });\n };\n});","import { factory } from '../../../utils/factory.js';\nvar name = 'matAlgo10xSids';\nvar dependencies = ['typed', 'DenseMatrix'];\nexport var createMatAlgo10xSids = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n DenseMatrix\n } = _ref;\n /**\n * Iterates over SparseMatrix S nonzero items and invokes the callback function f(Sij, b).\n * Callback function invoked NZ times (number of nonzero items in S).\n *\n *\n * ┌ f(Sij, b) ; S(i,j) !== 0\n * C(i,j) = ┤\n * └ b ; otherwise\n *\n *\n * @param {Matrix} s The SparseMatrix instance (S)\n * @param {Scalar} b The Scalar value\n * @param {Function} callback The f(Aij,b) operation to invoke\n * @param {boolean} inverse A true value indicates callback should be invoked f(b,Sij)\n *\n * @return {Matrix} DenseMatrix (C)\n *\n * https://github.com/josdejong/mathjs/pull/346#issuecomment-97626813\n */\n return function matAlgo10xSids(s, b, callback, inverse) {\n // sparse matrix arrays\n var avalues = s._values;\n var aindex = s._index;\n var aptr = s._ptr;\n var asize = s._size;\n var adt = s._datatype;\n\n // sparse matrix cannot be a Pattern matrix\n if (!avalues) {\n throw new Error('Cannot perform operation on Pattern Sparse Matrix and Scalar value');\n }\n\n // rows & columns\n var rows = asize[0];\n var columns = asize[1];\n\n // datatype\n var dt;\n // callback signature to use\n var cf = callback;\n\n // process data types\n if (typeof adt === 'string') {\n // datatype\n dt = adt;\n // convert b to the same datatype\n b = typed.convert(b, dt);\n // callback\n cf = typed.find(callback, [dt, dt]);\n }\n\n // result arrays\n var cdata = [];\n\n // workspaces\n var x = [];\n // marks indicating we have a value in x for a given column\n var w = [];\n\n // loop columns\n for (var j = 0; j < columns; j++) {\n // columns mark\n var mark = j + 1;\n // values in j\n for (var k0 = aptr[j], k1 = aptr[j + 1], k = k0; k < k1; k++) {\n // row\n var r = aindex[k];\n // update workspace\n x[r] = avalues[k];\n w[r] = mark;\n }\n // loop rows\n for (var i = 0; i < rows; i++) {\n // initialize C on first column\n if (j === 0) {\n // create row array\n cdata[i] = [];\n }\n // check sparse matrix has a value @ i,j\n if (w[i] === mark) {\n // invoke callback, update C\n cdata[i][j] = inverse ? cf(b, x[i]) : cf(x[i], b);\n } else {\n // dense matrix value @ i, j\n cdata[i][j] = b;\n }\n }\n }\n\n // return dense matrix\n return new DenseMatrix({\n data: cdata,\n size: [rows, columns],\n datatype: dt\n });\n };\n});","import { factory } from '../../../utils/factory.js';\nimport { DimensionError } from '../../../error/DimensionError.js';\nvar name = 'matAlgo13xDD';\nvar dependencies = ['typed'];\nexport var createMatAlgo13xDD = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed\n } = _ref;\n /**\n * Iterates over DenseMatrix items and invokes the callback function f(Aij..z, Bij..z).\n * Callback function invoked MxN times.\n *\n * C(i,j,...z) = f(Aij..z, Bij..z)\n *\n * @param {Matrix} a The DenseMatrix instance (A)\n * @param {Matrix} b The DenseMatrix instance (B)\n * @param {Function} callback The f(Aij..z,Bij..z) operation to invoke\n *\n * @return {Matrix} DenseMatrix (C)\n *\n * https://github.com/josdejong/mathjs/pull/346#issuecomment-97658658\n */\n return function matAlgo13xDD(a, b, callback) {\n // a arrays\n var adata = a._data;\n var asize = a._size;\n var adt = a._datatype;\n // b arrays\n var bdata = b._data;\n var bsize = b._size;\n var bdt = b._datatype;\n // c arrays\n var csize = [];\n\n // validate dimensions\n if (asize.length !== bsize.length) {\n throw new DimensionError(asize.length, bsize.length);\n }\n\n // validate each one of the dimension sizes\n for (var s = 0; s < asize.length; s++) {\n // must match\n if (asize[s] !== bsize[s]) {\n throw new RangeError('Dimension mismatch. Matrix A (' + asize + ') must match Matrix B (' + bsize + ')');\n }\n // update dimension in c\n csize[s] = asize[s];\n }\n\n // datatype\n var dt;\n // callback signature to use\n var cf = callback;\n\n // process data types\n if (typeof adt === 'string' && adt === bdt) {\n // datatype\n dt = adt;\n // callback\n cf = typed.find(callback, [dt, dt]);\n }\n\n // populate cdata, iterate through dimensions\n var cdata = csize.length > 0 ? _iterate(cf, 0, csize, csize[0], adata, bdata) : [];\n\n // c matrix\n return a.createDenseMatrix({\n data: cdata,\n size: csize,\n datatype: dt\n });\n };\n\n // recursive function\n function _iterate(f, level, s, n, av, bv) {\n // initialize array for this level\n var cv = [];\n // check we reach the last level\n if (level === s.length - 1) {\n // loop arrays in last level\n for (var i = 0; i < n; i++) {\n // invoke callback and store value\n cv[i] = f(av[i], bv[i]);\n }\n } else {\n // iterate current level\n for (var j = 0; j < n; j++) {\n // iterate next level\n cv[j] = _iterate(f, level + 1, s, s[level + 1], av[j], bv[j]);\n }\n }\n return cv;\n }\n});","import { factory } from '../../../utils/factory.js';\nvar name = 'broadcast';\nvar dependancies = ['concat'];\nexport var createBroadcast = /* #__PURE__ */factory(name, dependancies, _ref => {\n var {\n concat\n } = _ref;\n /**\n * Broadcasts two matrices, and return both in an array\n * It checks if it's possible with broadcasting rules\n *\n * @param {Matrix} A First Matrix\n * @param {Matrix} B Second Matrix\n *\n * @return {Matrix[]} [ broadcastedA, broadcastedB ]\n */\n return function (A, B) {\n var N = Math.max(A._size.length, B._size.length); // max number of dims\n if (A._size.length === B._size.length) {\n if (A._size.every((dim, i) => dim === B._size[i])) {\n // If matrices have the same size return them\n return [A, B];\n }\n }\n var sizeA = _padLeft(A._size, N, 0); // pad to the left to align dimensions to the right\n var sizeB = _padLeft(B._size, N, 0); // pad to the left to align dimensions to the right\n\n // calculate the max dimensions\n var sizeMax = [];\n for (var dim = 0; dim < N; dim++) {\n sizeMax[dim] = Math.max(sizeA[dim], sizeB[dim]);\n }\n\n // check if the broadcasting rules applyes for both matrices\n for (var _dim = 0; _dim < N; _dim++) {\n _checkRules(sizeA, sizeMax, _dim);\n _checkRules(sizeB, sizeMax, _dim);\n }\n\n // reshape A or B if needed to make them ready for concat\n var AA = A.clone();\n var BB = B.clone();\n if (AA._size.length < N) {\n AA.reshape(_padLeft(AA._size, N, 1));\n } else if (BB._size.length < N) {\n BB.reshape(_padLeft(BB._size, N, 1));\n }\n\n // stretches the matrices on each dimension to make them the same size\n for (var _dim2 = 0; _dim2 < N; _dim2++) {\n if (AA._size[_dim2] < sizeMax[_dim2]) {\n AA = _stretch(AA, sizeMax[_dim2], _dim2);\n }\n if (BB._size[_dim2] < sizeMax[_dim2]) {\n BB = _stretch(BB, sizeMax[_dim2], _dim2);\n }\n }\n\n // return the array with the two broadcasted matrices\n return [AA, BB];\n };\n function _padLeft(shape, N, filler) {\n // pads an array of dimensions with numbers to the left, unitl the number of dimensions is N\n return [...Array(N - shape.length).fill(filler), ...shape];\n }\n function _stretch(arrayToStretch, sizeToStretch, dimToStretch) {\n // stretches a matrix up to a certain size in a certain dimension\n return concat(...Array(sizeToStretch).fill(arrayToStretch), dimToStretch);\n }\n function _checkRules(shape, sizeMax, dim) {\n if (shape[dim] < sizeMax[dim] & shape[dim] > 1) {\n throw new Error(\"shape missmatch: missmatch is found in arg with shape (\".concat(shape, \") not possible to broadcast dimension \").concat(dim, \" with size \").concat(shape[dim], \" to size \").concat(sizeMax[dim]));\n }\n }\n});","import { factory } from '../../../utils/factory.js';\nimport { extend } from '../../../utils/object.js';\nimport { createMatAlgo13xDD } from './matAlgo13xDD.js';\nimport { createMatAlgo14xDs } from './matAlgo14xDs.js';\nimport { createBroadcast } from './broadcast.js';\nvar name = 'matrixAlgorithmSuite';\nvar dependencies = ['typed', 'matrix', 'concat'];\nexport var createMatrixAlgorithmSuite = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n matrix,\n concat\n } = _ref;\n var matAlgo13xDD = createMatAlgo13xDD({\n typed\n });\n var matAlgo14xDs = createMatAlgo14xDs({\n typed\n });\n var broadcast = createBroadcast({\n concat\n });\n\n /**\n * Return a signatures object with the usual boilerplate of\n * matrix algorithms, based on a plain options object with the\n * following properties:\n * elop: function -- the elementwise operation to use, defaults to self\n * SS: function -- the algorithm to apply for two sparse matrices\n * DS: function -- the algorithm to apply for a dense and a sparse matrix\n * SD: function -- algo for a sparse and a dense; defaults to SD flipped\n * Ss: function -- the algorithm to apply for a sparse matrix and scalar\n * sS: function -- algo for scalar and sparse; defaults to Ss flipped\n * scalar: string -- typed-function type for scalars, defaults to 'any'\n *\n * If Ss is not specified, no matrix-scalar signatures are generated.\n *\n * @param {object} options\n * @return {Object} signatures\n */\n return function matrixAlgorithmSuite(options) {\n var elop = options.elop;\n var SD = options.SD || options.DS;\n var matrixSignatures;\n if (elop) {\n // First the dense ones\n matrixSignatures = {\n 'DenseMatrix, DenseMatrix': (x, y) => matAlgo13xDD(...broadcast(x, y), elop),\n 'Array, Array': (x, y) => matAlgo13xDD(...broadcast(matrix(x), matrix(y)), elop).valueOf(),\n 'Array, DenseMatrix': (x, y) => matAlgo13xDD(...broadcast(matrix(x), y), elop),\n 'DenseMatrix, Array': (x, y) => matAlgo13xDD(...broadcast(x, matrix(y)), elop)\n };\n // Now incorporate sparse matrices\n if (options.SS) {\n matrixSignatures['SparseMatrix, SparseMatrix'] = (x, y) => options.SS(...broadcast(x, y), elop, false);\n }\n if (options.DS) {\n matrixSignatures['DenseMatrix, SparseMatrix'] = (x, y) => options.DS(...broadcast(x, y), elop, false);\n matrixSignatures['Array, SparseMatrix'] = (x, y) => options.DS(...broadcast(matrix(x), y), elop, false);\n }\n if (SD) {\n matrixSignatures['SparseMatrix, DenseMatrix'] = (x, y) => SD(...broadcast(y, x), elop, true);\n matrixSignatures['SparseMatrix, Array'] = (x, y) => SD(...broadcast(matrix(y), x), elop, true);\n }\n } else {\n // No elop, use this\n // First the dense ones\n matrixSignatures = {\n 'DenseMatrix, DenseMatrix': typed.referToSelf(self => (x, y) => {\n return matAlgo13xDD(...broadcast(x, y), self);\n }),\n 'Array, Array': typed.referToSelf(self => (x, y) => {\n return matAlgo13xDD(...broadcast(matrix(x), matrix(y)), self).valueOf();\n }),\n 'Array, DenseMatrix': typed.referToSelf(self => (x, y) => {\n return matAlgo13xDD(...broadcast(matrix(x), y), self);\n }),\n 'DenseMatrix, Array': typed.referToSelf(self => (x, y) => {\n return matAlgo13xDD(...broadcast(x, matrix(y)), self);\n })\n };\n // Now incorporate sparse matrices\n if (options.SS) {\n matrixSignatures['SparseMatrix, SparseMatrix'] = typed.referToSelf(self => (x, y) => {\n return options.SS(...broadcast(x, y), self, false);\n });\n }\n if (options.DS) {\n matrixSignatures['DenseMatrix, SparseMatrix'] = typed.referToSelf(self => (x, y) => {\n return options.DS(...broadcast(x, y), self, false);\n });\n matrixSignatures['Array, SparseMatrix'] = typed.referToSelf(self => (x, y) => {\n return options.DS(...broadcast(matrix(x), y), self, false);\n });\n }\n if (SD) {\n matrixSignatures['SparseMatrix, DenseMatrix'] = typed.referToSelf(self => (x, y) => {\n return SD(...broadcast(y, x), self, true);\n });\n matrixSignatures['SparseMatrix, Array'] = typed.referToSelf(self => (x, y) => {\n return SD(...broadcast(matrix(y), x), self, true);\n });\n }\n }\n\n // Now add the scalars\n var scalar = options.scalar || 'any';\n var Ds = options.Ds || options.Ss;\n if (Ds) {\n if (elop) {\n matrixSignatures['DenseMatrix,' + scalar] = (x, y) => matAlgo14xDs(x, y, elop, false);\n matrixSignatures[scalar + ', DenseMatrix'] = (x, y) => matAlgo14xDs(y, x, elop, true);\n matrixSignatures['Array,' + scalar] = (x, y) => matAlgo14xDs(matrix(x), y, elop, false).valueOf();\n matrixSignatures[scalar + ', Array'] = (x, y) => matAlgo14xDs(matrix(y), x, elop, true).valueOf();\n } else {\n matrixSignatures['DenseMatrix,' + scalar] = typed.referToSelf(self => (x, y) => {\n return matAlgo14xDs(x, y, self, false);\n });\n matrixSignatures[scalar + ', DenseMatrix'] = typed.referToSelf(self => (x, y) => {\n return matAlgo14xDs(y, x, self, true);\n });\n matrixSignatures['Array,' + scalar] = typed.referToSelf(self => (x, y) => {\n return matAlgo14xDs(matrix(x), y, self, false).valueOf();\n });\n matrixSignatures[scalar + ', Array'] = typed.referToSelf(self => (x, y) => {\n return matAlgo14xDs(matrix(y), x, self, true).valueOf();\n });\n }\n }\n var sS = options.sS !== undefined ? options.sS : options.Ss;\n if (elop) {\n if (options.Ss) {\n matrixSignatures['SparseMatrix,' + scalar] = (x, y) => options.Ss(x, y, elop, false);\n }\n if (sS) {\n matrixSignatures[scalar + ', SparseMatrix'] = (x, y) => sS(y, x, elop, true);\n }\n } else {\n if (options.Ss) {\n matrixSignatures['SparseMatrix,' + scalar] = typed.referToSelf(self => (x, y) => {\n return options.Ss(x, y, self, false);\n });\n }\n if (sS) {\n matrixSignatures[scalar + ', SparseMatrix'] = typed.referToSelf(self => (x, y) => {\n return sS(y, x, self, true);\n });\n }\n }\n // Also pull in the scalar signatures if the operator is a typed function\n if (elop && elop.signatures) {\n extend(matrixSignatures, elop.signatures);\n }\n return matrixSignatures;\n };\n});","/**\n * Create a syntax error with the message:\n * 'Wrong number of arguments in function ( provided, - expected)'\n * @param {string} fn Function name\n * @param {number} count Actual argument count\n * @param {number} min Minimum required argument count\n * @param {number} [max] Maximum required argument count\n * @extends Error\n */\nexport function ArgumentsError(fn, count, min, max) {\n if (!(this instanceof ArgumentsError)) {\n throw new SyntaxError('Constructor must be called with the new operator');\n }\n this.fn = fn;\n this.count = count;\n this.min = min;\n this.max = max;\n this.message = 'Wrong number of arguments in function ' + fn + ' (' + count + ' provided, ' + min + (max !== undefined && max !== null ? '-' + max : '') + ' expected)';\n this.stack = new Error().stack;\n}\nArgumentsError.prototype = new Error();\nArgumentsError.prototype.constructor = Error;\nArgumentsError.prototype.name = 'ArgumentsError';\nArgumentsError.prototype.isArgumentsError = true;","import { factory } from '../../utils/factory.js';\nimport { createMatAlgo01xDSid } from '../../type/matrix/utils/matAlgo01xDSid.js';\nimport { createMatAlgo04xSidSid } from '../../type/matrix/utils/matAlgo04xSidSid.js';\nimport { createMatAlgo10xSids } from '../../type/matrix/utils/matAlgo10xSids.js';\nimport { createMatrixAlgorithmSuite } from '../../type/matrix/utils/matrixAlgorithmSuite.js';\nimport { gcdNumber } from '../../plain/number/index.js';\nimport { ArgumentsError } from '../../error/ArgumentsError.js';\nvar name = 'gcd';\nvar dependencies = ['typed', 'matrix', 'equalScalar', 'BigNumber', 'DenseMatrix', 'concat'];\nvar gcdTypes = 'number | BigNumber | Fraction | Matrix | Array';\nvar gcdManyTypesSignature = \"\".concat(gcdTypes, \", \").concat(gcdTypes, \", ...\").concat(gcdTypes);\nfunction is1d(array) {\n return !array.some(element => Array.isArray(element));\n}\nexport var createGcd = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n matrix,\n equalScalar,\n BigNumber,\n DenseMatrix,\n concat\n } = _ref;\n var matAlgo01xDSid = createMatAlgo01xDSid({\n typed\n });\n var matAlgo04xSidSid = createMatAlgo04xSidSid({\n typed,\n equalScalar\n });\n var matAlgo10xSids = createMatAlgo10xSids({\n typed,\n DenseMatrix\n });\n var matrixAlgorithmSuite = createMatrixAlgorithmSuite({\n typed,\n matrix,\n concat\n });\n\n /**\n * Calculate the greatest common divisor for two or more values or arrays.\n *\n * For matrices, the function is evaluated element wise.\n *\n * Syntax:\n *\n * math.gcd(a, b)\n * math.gcd(a, b, c, ...)\n *\n * Examples:\n *\n * math.gcd(8, 12) // returns 4\n * math.gcd(-4, 6) // returns 2\n * math.gcd(25, 15, -10) // returns 5\n *\n * math.gcd([8, -4], [12, 6]) // returns [4, 2]\n *\n * See also:\n *\n * lcm, xgcd\n *\n * @param {... number | BigNumber | Fraction | Array | Matrix} args Two or more integer numbers\n * @return {number | BigNumber | Fraction | Array | Matrix} The greatest common divisor\n */\n return typed(name, {\n 'number, number': gcdNumber,\n 'BigNumber, BigNumber': _gcdBigNumber,\n 'Fraction, Fraction': (x, y) => x.gcd(y)\n }, matrixAlgorithmSuite({\n SS: matAlgo04xSidSid,\n DS: matAlgo01xDSid,\n Ss: matAlgo10xSids\n }), {\n [gcdManyTypesSignature]: typed.referToSelf(self => (a, b, args) => {\n var res = self(a, b);\n for (var i = 0; i < args.length; i++) {\n res = self(res, args[i]);\n }\n return res;\n }),\n Array: typed.referToSelf(self => array => {\n if (array.length === 1 && Array.isArray(array[0]) && is1d(array[0])) {\n return self(...array[0]);\n }\n if (is1d(array)) {\n return self(...array);\n }\n throw new ArgumentsError('gcd() supports only 1d matrices!');\n }),\n Matrix: typed.referToSelf(self => matrix => {\n return self(matrix.toArray());\n })\n });\n\n /**\n * Calculate gcd for BigNumbers\n * @param {BigNumber} a\n * @param {BigNumber} b\n * @returns {BigNumber} Returns greatest common denominator of a and b\n * @private\n */\n function _gcdBigNumber(a, b) {\n if (!a.isInt() || !b.isInt()) {\n throw new Error('Parameters in function gcd must be integer numbers');\n }\n\n // https://en.wikipedia.org/wiki/Euclidean_algorithm\n var zero = new BigNumber(0);\n while (!b.isZero()) {\n var r = a.mod(b);\n a = b;\n b = r;\n }\n return a.lt(zero) ? a.neg() : a;\n }\n});","import { factory } from '../../../utils/factory.js';\nimport { DimensionError } from '../../../error/DimensionError.js';\nvar name = 'matAlgo02xDS0';\nvar dependencies = ['typed', 'equalScalar'];\nexport var createMatAlgo02xDS0 = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n equalScalar\n } = _ref;\n /**\n * Iterates over SparseMatrix nonzero items and invokes the callback function f(Dij, Sij).\n * Callback function invoked NNZ times (number of nonzero items in SparseMatrix).\n *\n *\n * ┌ f(Dij, Sij) ; S(i,j) !== 0\n * C(i,j) = ┤\n * └ 0 ; otherwise\n *\n *\n * @param {Matrix} denseMatrix The DenseMatrix instance (D)\n * @param {Matrix} sparseMatrix The SparseMatrix instance (S)\n * @param {Function} callback The f(Dij,Sij) operation to invoke, where Dij = DenseMatrix(i,j) and Sij = SparseMatrix(i,j)\n * @param {boolean} inverse A true value indicates callback should be invoked f(Sij,Dij)\n *\n * @return {Matrix} SparseMatrix (C)\n *\n * see https://github.com/josdejong/mathjs/pull/346#issuecomment-97477571\n */\n return function matAlgo02xDS0(denseMatrix, sparseMatrix, callback, inverse) {\n // dense matrix arrays\n var adata = denseMatrix._data;\n var asize = denseMatrix._size;\n var adt = denseMatrix._datatype;\n // sparse matrix arrays\n var bvalues = sparseMatrix._values;\n var bindex = sparseMatrix._index;\n var bptr = sparseMatrix._ptr;\n var bsize = sparseMatrix._size;\n var bdt = sparseMatrix._datatype;\n\n // validate dimensions\n if (asize.length !== bsize.length) {\n throw new DimensionError(asize.length, bsize.length);\n }\n\n // check rows & columns\n if (asize[0] !== bsize[0] || asize[1] !== bsize[1]) {\n throw new RangeError('Dimension mismatch. Matrix A (' + asize + ') must match Matrix B (' + bsize + ')');\n }\n\n // sparse matrix cannot be a Pattern matrix\n if (!bvalues) {\n throw new Error('Cannot perform operation on Dense Matrix and Pattern Sparse Matrix');\n }\n\n // rows & columns\n var rows = asize[0];\n var columns = asize[1];\n\n // datatype\n var dt;\n // equal signature to use\n var eq = equalScalar;\n // zero value\n var zero = 0;\n // callback signature to use\n var cf = callback;\n\n // process data types\n if (typeof adt === 'string' && adt === bdt) {\n // datatype\n dt = adt;\n // find signature that matches (dt, dt)\n eq = typed.find(equalScalar, [dt, dt]);\n // convert 0 to the same datatype\n zero = typed.convert(0, dt);\n // callback\n cf = typed.find(callback, [dt, dt]);\n }\n\n // result (SparseMatrix)\n var cvalues = [];\n var cindex = [];\n var cptr = [];\n\n // loop columns in b\n for (var j = 0; j < columns; j++) {\n // update cptr\n cptr[j] = cindex.length;\n // values in column j\n for (var k0 = bptr[j], k1 = bptr[j + 1], k = k0; k < k1; k++) {\n // row\n var i = bindex[k];\n // update C(i,j)\n var cij = inverse ? cf(bvalues[k], adata[i][j]) : cf(adata[i][j], bvalues[k]);\n // check for nonzero\n if (!eq(cij, zero)) {\n // push i & v\n cindex.push(i);\n cvalues.push(cij);\n }\n }\n }\n // update cptr\n cptr[columns] = cindex.length;\n\n // return sparse matrix\n return sparseMatrix.createSparseMatrix({\n values: cvalues,\n index: cindex,\n ptr: cptr,\n size: [rows, columns],\n datatype: dt\n });\n };\n});","import { factory } from '../../../utils/factory.js';\nimport { DimensionError } from '../../../error/DimensionError.js';\nimport { scatter } from '../../../utils/collection.js';\nvar name = 'matAlgo06xS0S0';\nvar dependencies = ['typed', 'equalScalar'];\nexport var createMatAlgo06xS0S0 = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n equalScalar\n } = _ref;\n /**\n * Iterates over SparseMatrix A and SparseMatrix B nonzero items and invokes the callback function f(Aij, Bij).\n * Callback function invoked (Anz U Bnz) times, where Anz and Bnz are the nonzero elements in both matrices.\n *\n *\n * ┌ f(Aij, Bij) ; A(i,j) !== 0 && B(i,j) !== 0\n * C(i,j) = ┤\n * └ 0 ; otherwise\n *\n *\n * @param {Matrix} a The SparseMatrix instance (A)\n * @param {Matrix} b The SparseMatrix instance (B)\n * @param {Function} callback The f(Aij,Bij) operation to invoke\n *\n * @return {Matrix} SparseMatrix (C)\n *\n * see https://github.com/josdejong/mathjs/pull/346#issuecomment-97620294\n */\n return function matAlgo06xS0S0(a, b, callback) {\n // sparse matrix arrays\n var avalues = a._values;\n var asize = a._size;\n var adt = a._datatype;\n // sparse matrix arrays\n var bvalues = b._values;\n var bsize = b._size;\n var bdt = b._datatype;\n\n // validate dimensions\n if (asize.length !== bsize.length) {\n throw new DimensionError(asize.length, bsize.length);\n }\n\n // check rows & columns\n if (asize[0] !== bsize[0] || asize[1] !== bsize[1]) {\n throw new RangeError('Dimension mismatch. Matrix A (' + asize + ') must match Matrix B (' + bsize + ')');\n }\n\n // rows & columns\n var rows = asize[0];\n var columns = asize[1];\n\n // datatype\n var dt;\n // equal signature to use\n var eq = equalScalar;\n // zero value\n var zero = 0;\n // callback signature to use\n var cf = callback;\n\n // process data types\n if (typeof adt === 'string' && adt === bdt) {\n // datatype\n dt = adt;\n // find signature that matches (dt, dt)\n eq = typed.find(equalScalar, [dt, dt]);\n // convert 0 to the same datatype\n zero = typed.convert(0, dt);\n // callback\n cf = typed.find(callback, [dt, dt]);\n }\n\n // result arrays\n var cvalues = avalues && bvalues ? [] : undefined;\n var cindex = [];\n var cptr = [];\n\n // workspaces\n var x = cvalues ? [] : undefined;\n // marks indicating we have a value in x for a given column\n var w = [];\n // marks indicating value in a given row has been updated\n var u = [];\n\n // loop columns\n for (var j = 0; j < columns; j++) {\n // update cptr\n cptr[j] = cindex.length;\n // columns mark\n var mark = j + 1;\n // scatter the values of A(:,j) into workspace\n scatter(a, j, w, x, u, mark, cindex, cf);\n // scatter the values of B(:,j) into workspace\n scatter(b, j, w, x, u, mark, cindex, cf);\n // check we need to process values (non pattern matrix)\n if (x) {\n // initialize first index in j\n var k = cptr[j];\n // loop index in j\n while (k < cindex.length) {\n // row\n var i = cindex[k];\n // check function was invoked on current row (Aij !=0 && Bij != 0)\n if (u[i] === mark) {\n // value @ i\n var v = x[i];\n // check for zero value\n if (!eq(v, zero)) {\n // push value\n cvalues.push(v);\n // increment pointer\n k++;\n } else {\n // remove value @ i, do not increment pointer\n cindex.splice(k, 1);\n }\n } else {\n // remove value @ i, do not increment pointer\n cindex.splice(k, 1);\n }\n }\n } else {\n // initialize first index in j\n var p = cptr[j];\n // loop index in j\n while (p < cindex.length) {\n // row\n var r = cindex[p];\n // check function was invoked on current row (Aij !=0 && Bij != 0)\n if (u[r] !== mark) {\n // remove value @ i, do not increment pointer\n cindex.splice(p, 1);\n } else {\n // increment pointer\n p++;\n }\n }\n }\n }\n // update cptr\n cptr[columns] = cindex.length;\n\n // return sparse matrix\n return a.createSparseMatrix({\n values: cvalues,\n index: cindex,\n ptr: cptr,\n size: [rows, columns],\n datatype: dt\n });\n };\n});","import { factory } from '../../utils/factory.js';\nimport { createMatAlgo02xDS0 } from '../../type/matrix/utils/matAlgo02xDS0.js';\nimport { createMatAlgo06xS0S0 } from '../../type/matrix/utils/matAlgo06xS0S0.js';\nimport { createMatAlgo11xS0s } from '../../type/matrix/utils/matAlgo11xS0s.js';\nimport { createMatrixAlgorithmSuite } from '../../type/matrix/utils/matrixAlgorithmSuite.js';\nimport { lcmNumber } from '../../plain/number/index.js';\nvar name = 'lcm';\nvar dependencies = ['typed', 'matrix', 'equalScalar', 'concat'];\nexport var createLcm = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n matrix,\n equalScalar,\n concat\n } = _ref;\n var matAlgo02xDS0 = createMatAlgo02xDS0({\n typed,\n equalScalar\n });\n var matAlgo06xS0S0 = createMatAlgo06xS0S0({\n typed,\n equalScalar\n });\n var matAlgo11xS0s = createMatAlgo11xS0s({\n typed,\n equalScalar\n });\n var matrixAlgorithmSuite = createMatrixAlgorithmSuite({\n typed,\n matrix,\n concat\n });\n var lcmTypes = 'number | BigNumber | Fraction | Matrix | Array';\n var lcmManySignature = {};\n lcmManySignature[\"\".concat(lcmTypes, \", \").concat(lcmTypes, \", ...\").concat(lcmTypes)] = typed.referToSelf(self => (a, b, args) => {\n var res = self(a, b);\n for (var i = 0; i < args.length; i++) {\n res = self(res, args[i]);\n }\n return res;\n });\n\n /**\n * Calculate the least common multiple for two or more values or arrays.\n *\n * lcm is defined as:\n *\n * lcm(a, b) = abs(a * b) / gcd(a, b)\n *\n * For matrices, the function is evaluated element wise.\n *\n * Syntax:\n *\n * math.lcm(a, b)\n * math.lcm(a, b, c, ...)\n *\n * Examples:\n *\n * math.lcm(4, 6) // returns 12\n * math.lcm(6, 21) // returns 42\n * math.lcm(6, 21, 5) // returns 210\n *\n * math.lcm([4, 6], [6, 21]) // returns [12, 42]\n *\n * See also:\n *\n * gcd, xgcd\n *\n * @param {... number | BigNumber | Array | Matrix} args Two or more integer numbers\n * @return {number | BigNumber | Array | Matrix} The least common multiple\n */\n return typed(name, {\n 'number, number': lcmNumber,\n 'BigNumber, BigNumber': _lcmBigNumber,\n 'Fraction, Fraction': (x, y) => x.lcm(y)\n }, matrixAlgorithmSuite({\n SS: matAlgo06xS0S0,\n DS: matAlgo02xDS0,\n Ss: matAlgo11xS0s\n }), lcmManySignature);\n\n /**\n * Calculate lcm for two BigNumbers\n * @param {BigNumber} a\n * @param {BigNumber} b\n * @returns {BigNumber} Returns the least common multiple of a and b\n * @private\n */\n function _lcmBigNumber(a, b) {\n if (!a.isInt() || !b.isInt()) {\n throw new Error('Parameters in function lcm must be integer numbers');\n }\n if (a.isZero()) {\n return a;\n }\n if (b.isZero()) {\n return b;\n }\n\n // https://en.wikipedia.org/wiki/Euclidean_algorithm\n // evaluate lcm here inline to reduce overhead\n var prod = a.times(b);\n while (!b.isZero()) {\n var t = b;\n b = a.mod(t);\n a = t;\n }\n return prod.div(a).abs();\n }\n});","import { factory } from '../../utils/factory.js';\nimport { deepMap } from '../../utils/collection.js';\nimport { log10Number } from '../../plain/number/index.js';\nvar name = 'log10';\nvar dependencies = ['typed', 'config', 'Complex'];\nexport var createLog10 = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n config,\n Complex: _Complex\n } = _ref;\n /**\n * Calculate the 10-base logarithm of a value. This is the same as calculating `log(x, 10)`.\n *\n * For matrices, the function is evaluated element wise.\n *\n * Syntax:\n *\n * math.log10(x)\n *\n * Examples:\n *\n * math.log10(0.00001) // returns -5\n * math.log10(10000) // returns 4\n * math.log(10000) / math.log(10) // returns 4\n * math.pow(10, 4) // returns 10000\n *\n * See also:\n *\n * exp, log, log1p, log2\n *\n * @param {number | BigNumber | Complex | Array | Matrix} x\n * Value for which to calculate the logarithm.\n * @return {number | BigNumber | Complex | Array | Matrix}\n * Returns the 10-base logarithm of `x`\n */\n return typed(name, {\n number: function number(x) {\n if (x >= 0 || config.predictable) {\n return log10Number(x);\n } else {\n // negative value -> complex value computation\n return new _Complex(x, 0).log().div(Math.LN10);\n }\n },\n Complex: function Complex(x) {\n return new _Complex(x).log().div(Math.LN10);\n },\n BigNumber: function BigNumber(x) {\n if (!x.isNegative() || config.predictable) {\n return x.log();\n } else {\n // downgrade to number, return Complex valued result\n return new _Complex(x.toNumber(), 0).log().div(Math.LN10);\n }\n },\n 'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self))\n });\n});","import { factory } from '../../utils/factory.js';\nimport { deepMap } from '../../utils/collection.js';\nimport { log2Number } from '../../plain/number/index.js';\nvar name = 'log2';\nvar dependencies = ['typed', 'config', 'Complex'];\nexport var createLog2 = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n config,\n Complex\n } = _ref;\n /**\n * Calculate the 2-base of a value. This is the same as calculating `log(x, 2)`.\n *\n * For matrices, the function is evaluated element wise.\n *\n * Syntax:\n *\n * math.log2(x)\n *\n * Examples:\n *\n * math.log2(0.03125) // returns -5\n * math.log2(16) // returns 4\n * math.log2(16) / math.log2(2) // returns 4\n * math.pow(2, 4) // returns 16\n *\n * See also:\n *\n * exp, log, log1p, log10\n *\n * @param {number | BigNumber | Complex | Array | Matrix} x\n * Value for which to calculate the logarithm.\n * @return {number | BigNumber | Complex | Array | Matrix}\n * Returns the 2-base logarithm of `x`\n */\n return typed(name, {\n number: function number(x) {\n if (x >= 0 || config.predictable) {\n return log2Number(x);\n } else {\n // negative value -> complex value computation\n return _log2Complex(new Complex(x, 0));\n }\n },\n Complex: _log2Complex,\n BigNumber: function BigNumber(x) {\n if (!x.isNegative() || config.predictable) {\n return x.log(2);\n } else {\n // downgrade to number, return Complex valued result\n return _log2Complex(new Complex(x.toNumber(), 0));\n }\n },\n 'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self))\n });\n\n /**\n * Calculate log2 for a complex value\n * @param {Complex} x\n * @returns {Complex}\n * @private\n */\n function _log2Complex(x) {\n var newX = Math.sqrt(x.re * x.re + x.im * x.im);\n return new Complex(Math.log2 ? Math.log2(newX) : Math.log(newX) / Math.LN2, Math.atan2(x.im, x.re) / Math.LN2);\n }\n});","import { factory } from '../../../utils/factory.js';\nimport { DimensionError } from '../../../error/DimensionError.js';\nvar name = 'matAlgo03xDSf';\nvar dependencies = ['typed'];\nexport var createMatAlgo03xDSf = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed\n } = _ref;\n /**\n * Iterates over SparseMatrix items and invokes the callback function f(Dij, Sij).\n * Callback function invoked M*N times.\n *\n *\n * ┌ f(Dij, Sij) ; S(i,j) !== 0\n * C(i,j) = ┤\n * └ f(Dij, 0) ; otherwise\n *\n *\n * @param {Matrix} denseMatrix The DenseMatrix instance (D)\n * @param {Matrix} sparseMatrix The SparseMatrix instance (C)\n * @param {Function} callback The f(Dij,Sij) operation to invoke, where Dij = DenseMatrix(i,j) and Sij = SparseMatrix(i,j)\n * @param {boolean} inverse A true value indicates callback should be invoked f(Sij,Dij)\n *\n * @return {Matrix} DenseMatrix (C)\n *\n * see https://github.com/josdejong/mathjs/pull/346#issuecomment-97477571\n */\n return function matAlgo03xDSf(denseMatrix, sparseMatrix, callback, inverse) {\n // dense matrix arrays\n var adata = denseMatrix._data;\n var asize = denseMatrix._size;\n var adt = denseMatrix._datatype;\n // sparse matrix arrays\n var bvalues = sparseMatrix._values;\n var bindex = sparseMatrix._index;\n var bptr = sparseMatrix._ptr;\n var bsize = sparseMatrix._size;\n var bdt = sparseMatrix._datatype;\n\n // validate dimensions\n if (asize.length !== bsize.length) {\n throw new DimensionError(asize.length, bsize.length);\n }\n\n // check rows & columns\n if (asize[0] !== bsize[0] || asize[1] !== bsize[1]) {\n throw new RangeError('Dimension mismatch. Matrix A (' + asize + ') must match Matrix B (' + bsize + ')');\n }\n\n // sparse matrix cannot be a Pattern matrix\n if (!bvalues) {\n throw new Error('Cannot perform operation on Dense Matrix and Pattern Sparse Matrix');\n }\n\n // rows & columns\n var rows = asize[0];\n var columns = asize[1];\n\n // datatype\n var dt;\n // zero value\n var zero = 0;\n // callback signature to use\n var cf = callback;\n\n // process data types\n if (typeof adt === 'string' && adt === bdt) {\n // datatype\n dt = adt;\n // convert 0 to the same datatype\n zero = typed.convert(0, dt);\n // callback\n cf = typed.find(callback, [dt, dt]);\n }\n\n // result (DenseMatrix)\n var cdata = [];\n\n // initialize dense matrix\n for (var z = 0; z < rows; z++) {\n // initialize row\n cdata[z] = [];\n }\n\n // workspace\n var x = [];\n // marks indicating we have a value in x for a given column\n var w = [];\n\n // loop columns in b\n for (var j = 0; j < columns; j++) {\n // column mark\n var mark = j + 1;\n // values in column j\n for (var k0 = bptr[j], k1 = bptr[j + 1], k = k0; k < k1; k++) {\n // row\n var i = bindex[k];\n // update workspace\n x[i] = inverse ? cf(bvalues[k], adata[i][j]) : cf(adata[i][j], bvalues[k]);\n w[i] = mark;\n }\n // process workspace\n for (var y = 0; y < rows; y++) {\n // check we have a calculated value for current row\n if (w[y] === mark) {\n // use calculated value\n cdata[y][j] = x[y];\n } else {\n // calculate value\n cdata[y][j] = inverse ? cf(zero, adata[y][j]) : cf(adata[y][j], zero);\n }\n }\n }\n\n // return dense matrix\n return denseMatrix.createDenseMatrix({\n data: cdata,\n size: [rows, columns],\n datatype: dt\n });\n };\n});","import { factory } from '../../../utils/factory.js';\nimport { DimensionError } from '../../../error/DimensionError.js';\nvar name = 'matAlgo05xSfSf';\nvar dependencies = ['typed', 'equalScalar'];\nexport var createMatAlgo05xSfSf = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n equalScalar\n } = _ref;\n /**\n * Iterates over SparseMatrix A and SparseMatrix B nonzero items and invokes the callback function f(Aij, Bij).\n * Callback function invoked MAX(NNZA, NNZB) times\n *\n *\n * ┌ f(Aij, Bij) ; A(i,j) !== 0 || B(i,j) !== 0\n * C(i,j) = ┤\n * └ 0 ; otherwise\n *\n *\n * @param {Matrix} a The SparseMatrix instance (A)\n * @param {Matrix} b The SparseMatrix instance (B)\n * @param {Function} callback The f(Aij,Bij) operation to invoke\n *\n * @return {Matrix} SparseMatrix (C)\n *\n * see https://github.com/josdejong/mathjs/pull/346#issuecomment-97620294\n */\n return function matAlgo05xSfSf(a, b, callback) {\n // sparse matrix arrays\n var avalues = a._values;\n var aindex = a._index;\n var aptr = a._ptr;\n var asize = a._size;\n var adt = a._datatype;\n // sparse matrix arrays\n var bvalues = b._values;\n var bindex = b._index;\n var bptr = b._ptr;\n var bsize = b._size;\n var bdt = b._datatype;\n\n // validate dimensions\n if (asize.length !== bsize.length) {\n throw new DimensionError(asize.length, bsize.length);\n }\n\n // check rows & columns\n if (asize[0] !== bsize[0] || asize[1] !== bsize[1]) {\n throw new RangeError('Dimension mismatch. Matrix A (' + asize + ') must match Matrix B (' + bsize + ')');\n }\n\n // rows & columns\n var rows = asize[0];\n var columns = asize[1];\n\n // datatype\n var dt;\n // equal signature to use\n var eq = equalScalar;\n // zero value\n var zero = 0;\n // callback signature to use\n var cf = callback;\n\n // process data types\n if (typeof adt === 'string' && adt === bdt) {\n // datatype\n dt = adt;\n // find signature that matches (dt, dt)\n eq = typed.find(equalScalar, [dt, dt]);\n // convert 0 to the same datatype\n zero = typed.convert(0, dt);\n // callback\n cf = typed.find(callback, [dt, dt]);\n }\n\n // result arrays\n var cvalues = avalues && bvalues ? [] : undefined;\n var cindex = [];\n var cptr = [];\n\n // workspaces\n var xa = cvalues ? [] : undefined;\n var xb = cvalues ? [] : undefined;\n // marks indicating we have a value in x for a given column\n var wa = [];\n var wb = [];\n\n // vars\n var i, j, k, k1;\n\n // loop columns\n for (j = 0; j < columns; j++) {\n // update cptr\n cptr[j] = cindex.length;\n // columns mark\n var mark = j + 1;\n // loop values A(:,j)\n for (k = aptr[j], k1 = aptr[j + 1]; k < k1; k++) {\n // row\n i = aindex[k];\n // push index\n cindex.push(i);\n // update workspace\n wa[i] = mark;\n // check we need to process values\n if (xa) {\n xa[i] = avalues[k];\n }\n }\n // loop values B(:,j)\n for (k = bptr[j], k1 = bptr[j + 1]; k < k1; k++) {\n // row\n i = bindex[k];\n // check row existed in A\n if (wa[i] !== mark) {\n // push index\n cindex.push(i);\n }\n // update workspace\n wb[i] = mark;\n // check we need to process values\n if (xb) {\n xb[i] = bvalues[k];\n }\n }\n // check we need to process values (non pattern matrix)\n if (cvalues) {\n // initialize first index in j\n k = cptr[j];\n // loop index in j\n while (k < cindex.length) {\n // row\n i = cindex[k];\n // marks\n var wai = wa[i];\n var wbi = wb[i];\n // check Aij or Bij are nonzero\n if (wai === mark || wbi === mark) {\n // matrix values @ i,j\n var va = wai === mark ? xa[i] : zero;\n var vb = wbi === mark ? xb[i] : zero;\n // Cij\n var vc = cf(va, vb);\n // check for zero\n if (!eq(vc, zero)) {\n // push value\n cvalues.push(vc);\n // increment pointer\n k++;\n } else {\n // remove value @ i, do not increment pointer\n cindex.splice(k, 1);\n }\n }\n }\n }\n }\n // update cptr\n cptr[columns] = cindex.length;\n\n // return sparse matrix\n return a.createSparseMatrix({\n values: cvalues,\n index: cindex,\n ptr: cptr,\n size: [rows, columns],\n datatype: dt\n });\n };\n});","import { factory } from '../../utils/factory.js';\nimport { createMatAlgo02xDS0 } from '../../type/matrix/utils/matAlgo02xDS0.js';\nimport { createMatAlgo03xDSf } from '../../type/matrix/utils/matAlgo03xDSf.js';\nimport { createMatAlgo05xSfSf } from '../../type/matrix/utils/matAlgo05xSfSf.js';\nimport { createMatAlgo11xS0s } from '../../type/matrix/utils/matAlgo11xS0s.js';\nimport { createMatAlgo12xSfs } from '../../type/matrix/utils/matAlgo12xSfs.js';\nimport { modNumber } from '../../plain/number/index.js';\nimport { createMatrixAlgorithmSuite } from '../../type/matrix/utils/matrixAlgorithmSuite.js';\nvar name = 'mod';\nvar dependencies = ['typed', 'matrix', 'equalScalar', 'DenseMatrix', 'concat'];\nexport var createMod = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n matrix,\n equalScalar,\n DenseMatrix,\n concat\n } = _ref;\n var matAlgo02xDS0 = createMatAlgo02xDS0({\n typed,\n equalScalar\n });\n var matAlgo03xDSf = createMatAlgo03xDSf({\n typed\n });\n var matAlgo05xSfSf = createMatAlgo05xSfSf({\n typed,\n equalScalar\n });\n var matAlgo11xS0s = createMatAlgo11xS0s({\n typed,\n equalScalar\n });\n var matAlgo12xSfs = createMatAlgo12xSfs({\n typed,\n DenseMatrix\n });\n var matrixAlgorithmSuite = createMatrixAlgorithmSuite({\n typed,\n matrix,\n concat\n });\n\n /**\n * Calculates the modulus, the remainder of an integer division.\n *\n * For matrices, the function is evaluated element wise.\n *\n * The modulus is defined as:\n *\n * x - y * floor(x / y)\n *\n * See https://en.wikipedia.org/wiki/Modulo_operation.\n *\n * Syntax:\n *\n * math.mod(x, y)\n *\n * Examples:\n *\n * math.mod(8, 3) // returns 2\n * math.mod(11, 2) // returns 1\n *\n * function isOdd(x) {\n * return math.mod(x, 2) != 0\n * }\n *\n * isOdd(2) // returns false\n * isOdd(3) // returns true\n *\n * See also:\n *\n * divide\n *\n * @param {number | BigNumber | Fraction | Array | Matrix} x Dividend\n * @param {number | BigNumber | Fraction | Array | Matrix} y Divisor\n * @return {number | BigNumber | Fraction | Array | Matrix} Returns the remainder of `x` divided by `y`.\n */\n return typed(name, {\n 'number, number': modNumber,\n 'BigNumber, BigNumber': function BigNumberBigNumber(x, y) {\n if (y.isNeg()) {\n throw new Error('Cannot calculate mod for a negative divisor');\n }\n return y.isZero() ? x : x.mod(y);\n },\n 'Fraction, Fraction': function FractionFraction(x, y) {\n if (y.compare(0) < 0) {\n throw new Error('Cannot calculate mod for a negative divisor');\n }\n // Workaround suggested in Fraction.js library to calculate correct modulo for negative dividend\n return x.compare(0) >= 0 ? x.mod(y) : x.mod(y).add(y).mod(y);\n }\n }, matrixAlgorithmSuite({\n SS: matAlgo05xSfSf,\n DS: matAlgo03xDSf,\n SD: matAlgo02xDS0,\n Ss: matAlgo11xS0s,\n sS: matAlgo12xSfs\n }));\n});","import { factory } from '../../utils/factory.js';\nimport { multiplyNumber } from '../../plain/number/index.js';\nvar name = 'multiplyScalar';\nvar dependencies = ['typed'];\nexport var createMultiplyScalar = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed\n } = _ref;\n /**\n * Multiply two scalar values, `x * y`.\n * This function is meant for internal use: it is used by the public function\n * `multiply`\n *\n * This function does not support collections (Array or Matrix).\n *\n * @param {number | BigNumber | Fraction | Complex | Unit} x First value to multiply\n * @param {number | BigNumber | Fraction | Complex} y Second value to multiply\n * @return {number | BigNumber | Fraction | Complex | Unit} Multiplication of `x` and `y`\n * @private\n */\n return typed('multiplyScalar', {\n 'number, number': multiplyNumber,\n 'Complex, Complex': function ComplexComplex(x, y) {\n return x.mul(y);\n },\n 'BigNumber, BigNumber': function BigNumberBigNumber(x, y) {\n return x.times(y);\n },\n 'Fraction, Fraction': function FractionFraction(x, y) {\n return x.mul(y);\n },\n 'number | Fraction | BigNumber | Complex, Unit': (x, y) => y.multiply(x),\n 'Unit, number | Fraction | BigNumber | Complex | Unit': (x, y) => x.multiply(y)\n });\n});","import { factory } from '../../utils/factory.js';\nimport { isMatrix } from '../../utils/is.js';\nimport { arraySize } from '../../utils/array.js';\nimport { createMatAlgo11xS0s } from '../../type/matrix/utils/matAlgo11xS0s.js';\nimport { createMatAlgo14xDs } from '../../type/matrix/utils/matAlgo14xDs.js';\nvar name = 'multiply';\nvar dependencies = ['typed', 'matrix', 'addScalar', 'multiplyScalar', 'equalScalar', 'dot'];\nexport var createMultiply = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n matrix,\n addScalar,\n multiplyScalar,\n equalScalar,\n dot\n } = _ref;\n var matAlgo11xS0s = createMatAlgo11xS0s({\n typed,\n equalScalar\n });\n var matAlgo14xDs = createMatAlgo14xDs({\n typed\n });\n function _validateMatrixDimensions(size1, size2) {\n // check left operand dimensions\n switch (size1.length) {\n case 1:\n // check size2\n switch (size2.length) {\n case 1:\n // Vector x Vector\n if (size1[0] !== size2[0]) {\n // throw error\n throw new RangeError('Dimension mismatch in multiplication. Vectors must have the same length');\n }\n break;\n case 2:\n // Vector x Matrix\n if (size1[0] !== size2[0]) {\n // throw error\n throw new RangeError('Dimension mismatch in multiplication. Vector length (' + size1[0] + ') must match Matrix rows (' + size2[0] + ')');\n }\n break;\n default:\n throw new Error('Can only multiply a 1 or 2 dimensional matrix (Matrix B has ' + size2.length + ' dimensions)');\n }\n break;\n case 2:\n // check size2\n switch (size2.length) {\n case 1:\n // Matrix x Vector\n if (size1[1] !== size2[0]) {\n // throw error\n throw new RangeError('Dimension mismatch in multiplication. Matrix columns (' + size1[1] + ') must match Vector length (' + size2[0] + ')');\n }\n break;\n case 2:\n // Matrix x Matrix\n if (size1[1] !== size2[0]) {\n // throw error\n throw new RangeError('Dimension mismatch in multiplication. Matrix A columns (' + size1[1] + ') must match Matrix B rows (' + size2[0] + ')');\n }\n break;\n default:\n throw new Error('Can only multiply a 1 or 2 dimensional matrix (Matrix B has ' + size2.length + ' dimensions)');\n }\n break;\n default:\n throw new Error('Can only multiply a 1 or 2 dimensional matrix (Matrix A has ' + size1.length + ' dimensions)');\n }\n }\n\n /**\n * C = A * B\n *\n * @param {Matrix} a Dense Vector (N)\n * @param {Matrix} b Dense Vector (N)\n *\n * @return {number} Scalar value\n */\n function _multiplyVectorVector(a, b, n) {\n // check empty vector\n if (n === 0) {\n throw new Error('Cannot multiply two empty vectors');\n }\n return dot(a, b);\n }\n\n /**\n * C = A * B\n *\n * @param {Matrix} a Dense Vector (M)\n * @param {Matrix} b Matrix (MxN)\n *\n * @return {Matrix} Dense Vector (N)\n */\n function _multiplyVectorMatrix(a, b) {\n // process storage\n if (b.storage() !== 'dense') {\n throw new Error('Support for SparseMatrix not implemented');\n }\n return _multiplyVectorDenseMatrix(a, b);\n }\n\n /**\n * C = A * B\n *\n * @param {Matrix} a Dense Vector (M)\n * @param {Matrix} b Dense Matrix (MxN)\n *\n * @return {Matrix} Dense Vector (N)\n */\n function _multiplyVectorDenseMatrix(a, b) {\n // a dense\n var adata = a._data;\n var asize = a._size;\n var adt = a._datatype;\n // b dense\n var bdata = b._data;\n var bsize = b._size;\n var bdt = b._datatype;\n // rows & columns\n var alength = asize[0];\n var bcolumns = bsize[1];\n\n // datatype\n var dt;\n // addScalar signature to use\n var af = addScalar;\n // multiplyScalar signature to use\n var mf = multiplyScalar;\n\n // process data types\n if (adt && bdt && adt === bdt && typeof adt === 'string') {\n // datatype\n dt = adt;\n // find signatures that matches (dt, dt)\n af = typed.find(addScalar, [dt, dt]);\n mf = typed.find(multiplyScalar, [dt, dt]);\n }\n\n // result\n var c = [];\n\n // loop matrix columns\n for (var j = 0; j < bcolumns; j++) {\n // sum (do not initialize it with zero)\n var sum = mf(adata[0], bdata[0][j]);\n // loop vector\n for (var i = 1; i < alength; i++) {\n // multiply & accumulate\n sum = af(sum, mf(adata[i], bdata[i][j]));\n }\n c[j] = sum;\n }\n\n // return matrix\n return a.createDenseMatrix({\n data: c,\n size: [bcolumns],\n datatype: dt\n });\n }\n\n /**\n * C = A * B\n *\n * @param {Matrix} a Matrix (MxN)\n * @param {Matrix} b Dense Vector (N)\n *\n * @return {Matrix} Dense Vector (M)\n */\n var _multiplyMatrixVector = typed('_multiplyMatrixVector', {\n 'DenseMatrix, any': _multiplyDenseMatrixVector,\n 'SparseMatrix, any': _multiplySparseMatrixVector\n });\n\n /**\n * C = A * B\n *\n * @param {Matrix} a Matrix (MxN)\n * @param {Matrix} b Matrix (NxC)\n *\n * @return {Matrix} Matrix (MxC)\n */\n var _multiplyMatrixMatrix = typed('_multiplyMatrixMatrix', {\n 'DenseMatrix, DenseMatrix': _multiplyDenseMatrixDenseMatrix,\n 'DenseMatrix, SparseMatrix': _multiplyDenseMatrixSparseMatrix,\n 'SparseMatrix, DenseMatrix': _multiplySparseMatrixDenseMatrix,\n 'SparseMatrix, SparseMatrix': _multiplySparseMatrixSparseMatrix\n });\n\n /**\n * C = A * B\n *\n * @param {Matrix} a DenseMatrix (MxN)\n * @param {Matrix} b Dense Vector (N)\n *\n * @return {Matrix} Dense Vector (M)\n */\n function _multiplyDenseMatrixVector(a, b) {\n // a dense\n var adata = a._data;\n var asize = a._size;\n var adt = a._datatype;\n // b dense\n var bdata = b._data;\n var bdt = b._datatype;\n // rows & columns\n var arows = asize[0];\n var acolumns = asize[1];\n\n // datatype\n var dt;\n // addScalar signature to use\n var af = addScalar;\n // multiplyScalar signature to use\n var mf = multiplyScalar;\n\n // process data types\n if (adt && bdt && adt === bdt && typeof adt === 'string') {\n // datatype\n dt = adt;\n // find signatures that matches (dt, dt)\n af = typed.find(addScalar, [dt, dt]);\n mf = typed.find(multiplyScalar, [dt, dt]);\n }\n\n // result\n var c = [];\n\n // loop matrix a rows\n for (var i = 0; i < arows; i++) {\n // current row\n var row = adata[i];\n // sum (do not initialize it with zero)\n var sum = mf(row[0], bdata[0]);\n // loop matrix a columns\n for (var j = 1; j < acolumns; j++) {\n // multiply & accumulate\n sum = af(sum, mf(row[j], bdata[j]));\n }\n c[i] = sum;\n }\n\n // return matrix\n return a.createDenseMatrix({\n data: c,\n size: [arows],\n datatype: dt\n });\n }\n\n /**\n * C = A * B\n *\n * @param {Matrix} a DenseMatrix (MxN)\n * @param {Matrix} b DenseMatrix (NxC)\n *\n * @return {Matrix} DenseMatrix (MxC)\n */\n function _multiplyDenseMatrixDenseMatrix(a, b) {\n // a dense\n var adata = a._data;\n var asize = a._size;\n var adt = a._datatype;\n // b dense\n var bdata = b._data;\n var bsize = b._size;\n var bdt = b._datatype;\n // rows & columns\n var arows = asize[0];\n var acolumns = asize[1];\n var bcolumns = bsize[1];\n\n // datatype\n var dt;\n // addScalar signature to use\n var af = addScalar;\n // multiplyScalar signature to use\n var mf = multiplyScalar;\n\n // process data types\n if (adt && bdt && adt === bdt && typeof adt === 'string') {\n // datatype\n dt = adt;\n // find signatures that matches (dt, dt)\n af = typed.find(addScalar, [dt, dt]);\n mf = typed.find(multiplyScalar, [dt, dt]);\n }\n\n // result\n var c = [];\n\n // loop matrix a rows\n for (var i = 0; i < arows; i++) {\n // current row\n var row = adata[i];\n // initialize row array\n c[i] = [];\n // loop matrix b columns\n for (var j = 0; j < bcolumns; j++) {\n // sum (avoid initializing sum to zero)\n var sum = mf(row[0], bdata[0][j]);\n // loop matrix a columns\n for (var x = 1; x < acolumns; x++) {\n // multiply & accumulate\n sum = af(sum, mf(row[x], bdata[x][j]));\n }\n c[i][j] = sum;\n }\n }\n\n // return matrix\n return a.createDenseMatrix({\n data: c,\n size: [arows, bcolumns],\n datatype: dt\n });\n }\n\n /**\n * C = A * B\n *\n * @param {Matrix} a DenseMatrix (MxN)\n * @param {Matrix} b SparseMatrix (NxC)\n *\n * @return {Matrix} SparseMatrix (MxC)\n */\n function _multiplyDenseMatrixSparseMatrix(a, b) {\n // a dense\n var adata = a._data;\n var asize = a._size;\n var adt = a._datatype;\n // b sparse\n var bvalues = b._values;\n var bindex = b._index;\n var bptr = b._ptr;\n var bsize = b._size;\n var bdt = b._datatype;\n // validate b matrix\n if (!bvalues) {\n throw new Error('Cannot multiply Dense Matrix times Pattern only Matrix');\n }\n // rows & columns\n var arows = asize[0];\n var bcolumns = bsize[1];\n\n // datatype\n var dt;\n // addScalar signature to use\n var af = addScalar;\n // multiplyScalar signature to use\n var mf = multiplyScalar;\n // equalScalar signature to use\n var eq = equalScalar;\n // zero value\n var zero = 0;\n\n // process data types\n if (adt && bdt && adt === bdt && typeof adt === 'string') {\n // datatype\n dt = adt;\n // find signatures that matches (dt, dt)\n af = typed.find(addScalar, [dt, dt]);\n mf = typed.find(multiplyScalar, [dt, dt]);\n eq = typed.find(equalScalar, [dt, dt]);\n // convert 0 to the same datatype\n zero = typed.convert(0, dt);\n }\n\n // result\n var cvalues = [];\n var cindex = [];\n var cptr = [];\n // c matrix\n var c = b.createSparseMatrix({\n values: cvalues,\n index: cindex,\n ptr: cptr,\n size: [arows, bcolumns],\n datatype: dt\n });\n\n // loop b columns\n for (var jb = 0; jb < bcolumns; jb++) {\n // update ptr\n cptr[jb] = cindex.length;\n // indeces in column jb\n var kb0 = bptr[jb];\n var kb1 = bptr[jb + 1];\n // do not process column jb if no data exists\n if (kb1 > kb0) {\n // last row mark processed\n var last = 0;\n // loop a rows\n for (var i = 0; i < arows; i++) {\n // column mark\n var mark = i + 1;\n // C[i, jb]\n var cij = void 0;\n // values in b column j\n for (var kb = kb0; kb < kb1; kb++) {\n // row\n var ib = bindex[kb];\n // check value has been initialized\n if (last !== mark) {\n // first value in column jb\n cij = mf(adata[i][ib], bvalues[kb]);\n // update mark\n last = mark;\n } else {\n // accumulate value\n cij = af(cij, mf(adata[i][ib], bvalues[kb]));\n }\n }\n // check column has been processed and value != 0\n if (last === mark && !eq(cij, zero)) {\n // push row & value\n cindex.push(i);\n cvalues.push(cij);\n }\n }\n }\n }\n // update ptr\n cptr[bcolumns] = cindex.length;\n\n // return sparse matrix\n return c;\n }\n\n /**\n * C = A * B\n *\n * @param {Matrix} a SparseMatrix (MxN)\n * @param {Matrix} b Dense Vector (N)\n *\n * @return {Matrix} SparseMatrix (M, 1)\n */\n function _multiplySparseMatrixVector(a, b) {\n // a sparse\n var avalues = a._values;\n var aindex = a._index;\n var aptr = a._ptr;\n var adt = a._datatype;\n // validate a matrix\n if (!avalues) {\n throw new Error('Cannot multiply Pattern only Matrix times Dense Matrix');\n }\n // b dense\n var bdata = b._data;\n var bdt = b._datatype;\n // rows & columns\n var arows = a._size[0];\n var brows = b._size[0];\n // result\n var cvalues = [];\n var cindex = [];\n var cptr = [];\n\n // datatype\n var dt;\n // addScalar signature to use\n var af = addScalar;\n // multiplyScalar signature to use\n var mf = multiplyScalar;\n // equalScalar signature to use\n var eq = equalScalar;\n // zero value\n var zero = 0;\n\n // process data types\n if (adt && bdt && adt === bdt && typeof adt === 'string') {\n // datatype\n dt = adt;\n // find signatures that matches (dt, dt)\n af = typed.find(addScalar, [dt, dt]);\n mf = typed.find(multiplyScalar, [dt, dt]);\n eq = typed.find(equalScalar, [dt, dt]);\n // convert 0 to the same datatype\n zero = typed.convert(0, dt);\n }\n\n // workspace\n var x = [];\n // vector with marks indicating a value x[i] exists in a given column\n var w = [];\n\n // update ptr\n cptr[0] = 0;\n // rows in b\n for (var ib = 0; ib < brows; ib++) {\n // b[ib]\n var vbi = bdata[ib];\n // check b[ib] != 0, avoid loops\n if (!eq(vbi, zero)) {\n // A values & index in ib column\n for (var ka0 = aptr[ib], ka1 = aptr[ib + 1], ka = ka0; ka < ka1; ka++) {\n // a row\n var ia = aindex[ka];\n // check value exists in current j\n if (!w[ia]) {\n // ia is new entry in j\n w[ia] = true;\n // add i to pattern of C\n cindex.push(ia);\n // x(ia) = A\n x[ia] = mf(vbi, avalues[ka]);\n } else {\n // i exists in C already\n x[ia] = af(x[ia], mf(vbi, avalues[ka]));\n }\n }\n }\n }\n // copy values from x to column jb of c\n for (var p1 = cindex.length, p = 0; p < p1; p++) {\n // row\n var ic = cindex[p];\n // copy value\n cvalues[p] = x[ic];\n }\n // update ptr\n cptr[1] = cindex.length;\n\n // return sparse matrix\n return a.createSparseMatrix({\n values: cvalues,\n index: cindex,\n ptr: cptr,\n size: [arows, 1],\n datatype: dt\n });\n }\n\n /**\n * C = A * B\n *\n * @param {Matrix} a SparseMatrix (MxN)\n * @param {Matrix} b DenseMatrix (NxC)\n *\n * @return {Matrix} SparseMatrix (MxC)\n */\n function _multiplySparseMatrixDenseMatrix(a, b) {\n // a sparse\n var avalues = a._values;\n var aindex = a._index;\n var aptr = a._ptr;\n var adt = a._datatype;\n // validate a matrix\n if (!avalues) {\n throw new Error('Cannot multiply Pattern only Matrix times Dense Matrix');\n }\n // b dense\n var bdata = b._data;\n var bdt = b._datatype;\n // rows & columns\n var arows = a._size[0];\n var brows = b._size[0];\n var bcolumns = b._size[1];\n\n // datatype\n var dt;\n // addScalar signature to use\n var af = addScalar;\n // multiplyScalar signature to use\n var mf = multiplyScalar;\n // equalScalar signature to use\n var eq = equalScalar;\n // zero value\n var zero = 0;\n\n // process data types\n if (adt && bdt && adt === bdt && typeof adt === 'string') {\n // datatype\n dt = adt;\n // find signatures that matches (dt, dt)\n af = typed.find(addScalar, [dt, dt]);\n mf = typed.find(multiplyScalar, [dt, dt]);\n eq = typed.find(equalScalar, [dt, dt]);\n // convert 0 to the same datatype\n zero = typed.convert(0, dt);\n }\n\n // result\n var cvalues = [];\n var cindex = [];\n var cptr = [];\n // c matrix\n var c = a.createSparseMatrix({\n values: cvalues,\n index: cindex,\n ptr: cptr,\n size: [arows, bcolumns],\n datatype: dt\n });\n\n // workspace\n var x = [];\n // vector with marks indicating a value x[i] exists in a given column\n var w = [];\n\n // loop b columns\n for (var jb = 0; jb < bcolumns; jb++) {\n // update ptr\n cptr[jb] = cindex.length;\n // mark in workspace for current column\n var mark = jb + 1;\n // rows in jb\n for (var ib = 0; ib < brows; ib++) {\n // b[ib, jb]\n var vbij = bdata[ib][jb];\n // check b[ib, jb] != 0, avoid loops\n if (!eq(vbij, zero)) {\n // A values & index in ib column\n for (var ka0 = aptr[ib], ka1 = aptr[ib + 1], ka = ka0; ka < ka1; ka++) {\n // a row\n var ia = aindex[ka];\n // check value exists in current j\n if (w[ia] !== mark) {\n // ia is new entry in j\n w[ia] = mark;\n // add i to pattern of C\n cindex.push(ia);\n // x(ia) = A\n x[ia] = mf(vbij, avalues[ka]);\n } else {\n // i exists in C already\n x[ia] = af(x[ia], mf(vbij, avalues[ka]));\n }\n }\n }\n }\n // copy values from x to column jb of c\n for (var p0 = cptr[jb], p1 = cindex.length, p = p0; p < p1; p++) {\n // row\n var ic = cindex[p];\n // copy value\n cvalues[p] = x[ic];\n }\n }\n // update ptr\n cptr[bcolumns] = cindex.length;\n\n // return sparse matrix\n return c;\n }\n\n /**\n * C = A * B\n *\n * @param {Matrix} a SparseMatrix (MxN)\n * @param {Matrix} b SparseMatrix (NxC)\n *\n * @return {Matrix} SparseMatrix (MxC)\n */\n function _multiplySparseMatrixSparseMatrix(a, b) {\n // a sparse\n var avalues = a._values;\n var aindex = a._index;\n var aptr = a._ptr;\n var adt = a._datatype;\n // b sparse\n var bvalues = b._values;\n var bindex = b._index;\n var bptr = b._ptr;\n var bdt = b._datatype;\n\n // rows & columns\n var arows = a._size[0];\n var bcolumns = b._size[1];\n // flag indicating both matrices (a & b) contain data\n var values = avalues && bvalues;\n\n // datatype\n var dt;\n // addScalar signature to use\n var af = addScalar;\n // multiplyScalar signature to use\n var mf = multiplyScalar;\n\n // process data types\n if (adt && bdt && adt === bdt && typeof adt === 'string') {\n // datatype\n dt = adt;\n // find signatures that matches (dt, dt)\n af = typed.find(addScalar, [dt, dt]);\n mf = typed.find(multiplyScalar, [dt, dt]);\n }\n\n // result\n var cvalues = values ? [] : undefined;\n var cindex = [];\n var cptr = [];\n // c matrix\n var c = a.createSparseMatrix({\n values: cvalues,\n index: cindex,\n ptr: cptr,\n size: [arows, bcolumns],\n datatype: dt\n });\n\n // workspace\n var x = values ? [] : undefined;\n // vector with marks indicating a value x[i] exists in a given column\n var w = [];\n // variables\n var ka, ka0, ka1, kb, kb0, kb1, ia, ib;\n // loop b columns\n for (var jb = 0; jb < bcolumns; jb++) {\n // update ptr\n cptr[jb] = cindex.length;\n // mark in workspace for current column\n var mark = jb + 1;\n // B values & index in j\n for (kb0 = bptr[jb], kb1 = bptr[jb + 1], kb = kb0; kb < kb1; kb++) {\n // b row\n ib = bindex[kb];\n // check we need to process values\n if (values) {\n // loop values in a[:,ib]\n for (ka0 = aptr[ib], ka1 = aptr[ib + 1], ka = ka0; ka < ka1; ka++) {\n // row\n ia = aindex[ka];\n // check value exists in current j\n if (w[ia] !== mark) {\n // ia is new entry in j\n w[ia] = mark;\n // add i to pattern of C\n cindex.push(ia);\n // x(ia) = A\n x[ia] = mf(bvalues[kb], avalues[ka]);\n } else {\n // i exists in C already\n x[ia] = af(x[ia], mf(bvalues[kb], avalues[ka]));\n }\n }\n } else {\n // loop values in a[:,ib]\n for (ka0 = aptr[ib], ka1 = aptr[ib + 1], ka = ka0; ka < ka1; ka++) {\n // row\n ia = aindex[ka];\n // check value exists in current j\n if (w[ia] !== mark) {\n // ia is new entry in j\n w[ia] = mark;\n // add i to pattern of C\n cindex.push(ia);\n }\n }\n }\n }\n // check we need to process matrix values (pattern matrix)\n if (values) {\n // copy values from x to column jb of c\n for (var p0 = cptr[jb], p1 = cindex.length, p = p0; p < p1; p++) {\n // row\n var ic = cindex[p];\n // copy value\n cvalues[p] = x[ic];\n }\n }\n }\n // update ptr\n cptr[bcolumns] = cindex.length;\n\n // return sparse matrix\n return c;\n }\n\n /**\n * Multiply two or more values, `x * y`.\n * For matrices, the matrix product is calculated.\n *\n * Syntax:\n *\n * math.multiply(x, y)\n * math.multiply(x, y, z, ...)\n *\n * Examples:\n *\n * math.multiply(4, 5.2) // returns number 20.8\n * math.multiply(2, 3, 4) // returns number 24\n *\n * const a = math.complex(2, 3)\n * const b = math.complex(4, 1)\n * math.multiply(a, b) // returns Complex 5 + 14i\n *\n * const c = [[1, 2], [4, 3]]\n * const d = [[1, 2, 3], [3, -4, 7]]\n * math.multiply(c, d) // returns Array [[7, -6, 17], [13, -4, 33]]\n *\n * const e = math.unit('2.1 km')\n * math.multiply(3, e) // returns Unit 6.3 km\n *\n * See also:\n *\n * divide, prod, cross, dot\n *\n * @param {number | BigNumber | Fraction | Complex | Unit | Array | Matrix} x First value to multiply\n * @param {number | BigNumber | Fraction | Complex | Unit | Array | Matrix} y Second value to multiply\n * @return {number | BigNumber | Fraction | Complex | Unit | Array | Matrix} Multiplication of `x` and `y`\n */\n return typed(name, multiplyScalar, {\n // we extend the signatures of multiplyScalar with signatures dealing with matrices\n\n 'Array, Array': typed.referTo('Matrix, Matrix', selfMM => (x, y) => {\n // check dimensions\n _validateMatrixDimensions(arraySize(x), arraySize(y));\n\n // use dense matrix implementation\n var m = selfMM(matrix(x), matrix(y));\n // return array or scalar\n return isMatrix(m) ? m.valueOf() : m;\n }),\n 'Matrix, Matrix': function MatrixMatrix(x, y) {\n // dimensions\n var xsize = x.size();\n var ysize = y.size();\n\n // check dimensions\n _validateMatrixDimensions(xsize, ysize);\n\n // process dimensions\n if (xsize.length === 1) {\n // process y dimensions\n if (ysize.length === 1) {\n // Vector * Vector\n return _multiplyVectorVector(x, y, xsize[0]);\n }\n // Vector * Matrix\n return _multiplyVectorMatrix(x, y);\n }\n // process y dimensions\n if (ysize.length === 1) {\n // Matrix * Vector\n return _multiplyMatrixVector(x, y);\n }\n // Matrix * Matrix\n return _multiplyMatrixMatrix(x, y);\n },\n 'Matrix, Array': typed.referTo('Matrix,Matrix', selfMM => (x, y) => selfMM(x, matrix(y))),\n 'Array, Matrix': typed.referToSelf(self => (x, y) => {\n // use Matrix * Matrix implementation\n return self(matrix(x, y.storage()), y);\n }),\n 'SparseMatrix, any': function SparseMatrixAny(x, y) {\n return matAlgo11xS0s(x, y, multiplyScalar, false);\n },\n 'DenseMatrix, any': function DenseMatrixAny(x, y) {\n return matAlgo14xDs(x, y, multiplyScalar, false);\n },\n 'any, SparseMatrix': function anySparseMatrix(x, y) {\n return matAlgo11xS0s(y, x, multiplyScalar, true);\n },\n 'any, DenseMatrix': function anyDenseMatrix(x, y) {\n return matAlgo14xDs(y, x, multiplyScalar, true);\n },\n 'Array, any': function ArrayAny(x, y) {\n // use matrix implementation\n return matAlgo14xDs(matrix(x), y, multiplyScalar, false).valueOf();\n },\n 'any, Array': function anyArray(x, y) {\n // use matrix implementation\n return matAlgo14xDs(matrix(y), x, multiplyScalar, true).valueOf();\n },\n 'any, any': multiplyScalar,\n 'any, any, ...any': typed.referToSelf(self => (x, y, rest) => {\n var result = self(x, y);\n for (var i = 0; i < rest.length; i++) {\n result = self(result, rest[i]);\n }\n return result;\n })\n });\n});","import { factory } from '../../utils/factory.js';\nimport { createMatAlgo01xDSid } from '../../type/matrix/utils/matAlgo01xDSid.js';\nimport { createMatAlgo02xDS0 } from '../../type/matrix/utils/matAlgo02xDS0.js';\nimport { createMatAlgo06xS0S0 } from '../../type/matrix/utils/matAlgo06xS0S0.js';\nimport { createMatAlgo11xS0s } from '../../type/matrix/utils/matAlgo11xS0s.js';\nimport { createMatrixAlgorithmSuite } from '../../type/matrix/utils/matrixAlgorithmSuite.js';\nimport { nthRootNumber } from '../../plain/number/index.js';\nvar name = 'nthRoot';\nvar dependencies = ['typed', 'matrix', 'equalScalar', 'BigNumber', 'concat'];\nexport var createNthRoot = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n matrix,\n equalScalar,\n BigNumber: _BigNumber,\n concat\n } = _ref;\n var matAlgo01xDSid = createMatAlgo01xDSid({\n typed\n });\n var matAlgo02xDS0 = createMatAlgo02xDS0({\n typed,\n equalScalar\n });\n var matAlgo06xS0S0 = createMatAlgo06xS0S0({\n typed,\n equalScalar\n });\n var matAlgo11xS0s = createMatAlgo11xS0s({\n typed,\n equalScalar\n });\n var matrixAlgorithmSuite = createMatrixAlgorithmSuite({\n typed,\n matrix,\n concat\n });\n\n /**\n * Calculate the nth root of a value.\n * The principal nth root of a positive real number A, is the positive real\n * solution of the equation\n *\n * x^root = A\n *\n * For matrices, the function is evaluated element wise.\n *\n * Syntax:\n *\n * math.nthRoot(a)\n * math.nthRoot(a, root)\n *\n * Examples:\n *\n * math.nthRoot(9, 2) // returns 3 (since 3^2 == 9)\n * math.sqrt(9) // returns 3 (since 3^2 == 9)\n * math.nthRoot(64, 3) // returns 4 (since 4^3 == 64)\n *\n * See also:\n *\n * sqrt, pow\n *\n * @param {number | BigNumber | Array | Matrix | Complex} a\n * Value for which to calculate the nth root\n * @param {number | BigNumber} [root=2] The root.\n * @return {number | Complex | Array | Matrix} Returns the nth root of `a`\n */\n function complexErr() {\n throw new Error('Complex number not supported in function nthRoot. Use nthRoots instead.');\n }\n return typed(name, {\n number: nthRootNumber,\n 'number, number': nthRootNumber,\n BigNumber: x => _bigNthRoot(x, new _BigNumber(2)),\n 'BigNumber, BigNumber': _bigNthRoot,\n Complex: complexErr,\n 'Complex, number': complexErr,\n Array: typed.referTo('DenseMatrix,number', selfDn => x => selfDn(matrix(x), 2).valueOf()),\n DenseMatrix: typed.referTo('DenseMatrix,number', selfDn => x => selfDn(x, 2)),\n SparseMatrix: typed.referTo('SparseMatrix,number', selfSn => x => selfSn(x, 2)),\n 'SparseMatrix, SparseMatrix': typed.referToSelf(self => (x, y) => {\n // density must be one (no zeros in matrix)\n if (y.density() === 1) {\n // sparse + sparse\n return matAlgo06xS0S0(x, y, self);\n } else {\n // throw exception\n throw new Error('Root must be non-zero');\n }\n }),\n 'DenseMatrix, SparseMatrix': typed.referToSelf(self => (x, y) => {\n // density must be one (no zeros in matrix)\n if (y.density() === 1) {\n // dense + sparse\n return matAlgo01xDSid(x, y, self, false);\n } else {\n // throw exception\n throw new Error('Root must be non-zero');\n }\n }),\n 'Array, SparseMatrix': typed.referTo('DenseMatrix,SparseMatrix', selfDS => (x, y) => selfDS(matrix(x), y)),\n 'number | BigNumber, SparseMatrix': typed.referToSelf(self => (x, y) => {\n // density must be one (no zeros in matrix)\n if (y.density() === 1) {\n // sparse - scalar\n return matAlgo11xS0s(y, x, self, true);\n } else {\n // throw exception\n throw new Error('Root must be non-zero');\n }\n })\n }, matrixAlgorithmSuite({\n scalar: 'number | BigNumber',\n SD: matAlgo02xDS0,\n Ss: matAlgo11xS0s,\n sS: false\n }));\n\n /**\n * Calculate the nth root of a for BigNumbers, solve x^root == a\n * https://rosettacode.org/wiki/Nth_root#JavaScript\n * @param {BigNumber} a\n * @param {BigNumber} root\n * @private\n */\n function _bigNthRoot(a, root) {\n var precision = _BigNumber.precision;\n var Big = _BigNumber.clone({\n precision: precision + 2\n });\n var zero = new _BigNumber(0);\n var one = new Big(1);\n var inv = root.isNegative();\n if (inv) {\n root = root.neg();\n }\n if (root.isZero()) {\n throw new Error('Root must be non-zero');\n }\n if (a.isNegative() && !root.abs().mod(2).equals(1)) {\n throw new Error('Root must be odd when a is negative.');\n }\n\n // edge cases zero and infinity\n if (a.isZero()) {\n return inv ? new Big(Infinity) : 0;\n }\n if (!a.isFinite()) {\n return inv ? zero : a;\n }\n var x = a.abs().pow(one.div(root));\n // If a < 0, we require that root is an odd integer,\n // so (-1) ^ (1/root) = -1\n x = a.isNeg() ? x.neg() : x;\n return new _BigNumber((inv ? one.div(x) : x).toPrecision(precision));\n }\n});\nexport var createNthRootNumber = /* #__PURE__ */factory(name, ['typed'], _ref2 => {\n var {\n typed\n } = _ref2;\n return typed(name, {\n number: nthRootNumber,\n 'number, number': nthRootNumber\n });\n});","import { factory } from '../../utils/factory.js';\nimport { deepMap } from '../../utils/collection.js';\nimport { signNumber } from '../../plain/number/index.js';\nvar name = 'sign';\nvar dependencies = ['typed', 'BigNumber', 'Fraction', 'complex'];\nexport var createSign = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n BigNumber: _BigNumber,\n complex,\n Fraction: _Fraction\n } = _ref;\n /**\n * Compute the sign of a value. The sign of a value x is:\n *\n * - 1 when x > 0\n * - -1 when x < 0\n * - 0 when x == 0\n *\n * For matrices, the function is evaluated element wise.\n *\n * Syntax:\n *\n * math.sign(x)\n *\n * Examples:\n *\n * math.sign(3.5) // returns 1\n * math.sign(-4.2) // returns -1\n * math.sign(0) // returns 0\n *\n * math.sign([3, 5, -2, 0, 2]) // returns [1, 1, -1, 0, 1]\n *\n * See also:\n *\n * abs\n *\n * @param {number | BigNumber | Fraction | Complex | Array | Matrix | Unit} x\n * The number for which to determine the sign\n * @return {number | BigNumber | Fraction | Complex | Array | Matrix | Unit}\n * The sign of `x`\n */\n return typed(name, {\n number: signNumber,\n Complex: function Complex(x) {\n return x.im === 0 ? complex(signNumber(x.re)) : x.sign();\n },\n BigNumber: function BigNumber(x) {\n return new _BigNumber(x.cmp(0));\n },\n Fraction: function Fraction(x) {\n return new _Fraction(x.s, 1);\n },\n // deep map collection, skip zeros since sign(0) = 0\n 'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self, true)),\n Unit: typed.referToSelf(self => x => {\n if (!x._isDerived() && x.units[0].unit.offset !== 0) {\n throw new TypeError('sign is ambiguous for units with offset');\n }\n return typed.find(self, x.valueType())(x.value);\n })\n });\n});","import { factory } from '../../utils/factory.js';\nvar name = 'sqrt';\nvar dependencies = ['config', 'typed', 'Complex'];\nexport var createSqrt = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n config,\n typed,\n Complex\n } = _ref;\n /**\n * Calculate the square root of a value.\n *\n * For matrices, if you want the matrix square root of a square matrix,\n * use the `sqrtm` function. If you wish to apply `sqrt` elementwise to\n * a matrix M, use `math.map(M, math.sqrt)`.\n *\n * Syntax:\n *\n * math.sqrt(x)\n *\n * Examples:\n *\n * math.sqrt(25) // returns 5\n * math.square(5) // returns 25\n * math.sqrt(-4) // returns Complex 2i\n *\n * See also:\n *\n * square, multiply, cube, cbrt, sqrtm\n *\n * @param {number | BigNumber | Complex | Unit} x\n * Value for which to calculate the square root.\n * @return {number | BigNumber | Complex | Unit}\n * Returns the square root of `x`\n */\n return typed('sqrt', {\n number: _sqrtNumber,\n Complex: function Complex(x) {\n return x.sqrt();\n },\n BigNumber: function BigNumber(x) {\n if (!x.isNegative() || config.predictable) {\n return x.sqrt();\n } else {\n // negative value -> downgrade to number to do complex value computation\n return _sqrtNumber(x.toNumber());\n }\n },\n Unit: function Unit(x) {\n // Someday will work for complex units when they are implemented\n return x.pow(0.5);\n }\n });\n\n /**\n * Calculate sqrt for a number\n * @param {number} x\n * @returns {number | Complex} Returns the square root of x\n * @private\n */\n function _sqrtNumber(x) {\n if (isNaN(x)) {\n return NaN;\n } else if (x >= 0 || config.predictable) {\n return Math.sqrt(x);\n } else {\n return new Complex(x, 0).sqrt();\n }\n }\n});","import { factory } from '../../utils/factory.js';\nimport { squareNumber } from '../../plain/number/index.js';\nvar name = 'square';\nvar dependencies = ['typed'];\nexport var createSquare = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed\n } = _ref;\n /**\n * Compute the square of a value, `x * x`.\n * To avoid confusion with multiplying a square matrix by itself,\n * this function does not apply to matrices. If you wish to square\n * every element of a matrix, see the examples.\n *\n * Syntax:\n *\n * math.square(x)\n *\n * Examples:\n *\n * math.square(2) // returns number 4\n * math.square(3) // returns number 9\n * math.pow(3, 2) // returns number 9\n * math.multiply(3, 3) // returns number 9\n *\n * math.map([1, 2, 3, 4], math.square) // returns Array [1, 4, 9, 16]\n *\n * See also:\n *\n * multiply, cube, sqrt, pow\n *\n * @param {number | BigNumber | Fraction | Complex | Unit} x\n * Number for which to calculate the square\n * @return {number | BigNumber | Fraction | Complex | Unit}\n * Squared value\n */\n return typed(name, {\n number: squareNumber,\n Complex: function Complex(x) {\n return x.mul(x);\n },\n BigNumber: function BigNumber(x) {\n return x.times(x);\n },\n Fraction: function Fraction(x) {\n return x.mul(x);\n },\n Unit: function Unit(x) {\n return x.pow(2);\n }\n });\n});","import { factory } from '../../utils/factory.js';\nimport { createMatAlgo01xDSid } from '../../type/matrix/utils/matAlgo01xDSid.js';\nimport { createMatAlgo03xDSf } from '../../type/matrix/utils/matAlgo03xDSf.js';\nimport { createMatAlgo05xSfSf } from '../../type/matrix/utils/matAlgo05xSfSf.js';\nimport { createMatAlgo10xSids } from '../../type/matrix/utils/matAlgo10xSids.js';\nimport { createMatAlgo12xSfs } from '../../type/matrix/utils/matAlgo12xSfs.js';\nimport { createMatrixAlgorithmSuite } from '../../type/matrix/utils/matrixAlgorithmSuite.js';\nvar name = 'subtract';\nvar dependencies = ['typed', 'matrix', 'equalScalar', 'addScalar', 'unaryMinus', 'DenseMatrix', 'concat'];\nexport var createSubtract = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n matrix,\n equalScalar,\n addScalar,\n unaryMinus,\n DenseMatrix,\n concat\n } = _ref;\n // TODO: split function subtract in two: subtract and subtractScalar\n\n var matAlgo01xDSid = createMatAlgo01xDSid({\n typed\n });\n var matAlgo03xDSf = createMatAlgo03xDSf({\n typed\n });\n var matAlgo05xSfSf = createMatAlgo05xSfSf({\n typed,\n equalScalar\n });\n var matAlgo10xSids = createMatAlgo10xSids({\n typed,\n DenseMatrix\n });\n var matAlgo12xSfs = createMatAlgo12xSfs({\n typed,\n DenseMatrix\n });\n var matrixAlgorithmSuite = createMatrixAlgorithmSuite({\n typed,\n matrix,\n concat\n });\n\n /**\n * Subtract two values, `x - y`.\n * For matrices, the function is evaluated element wise.\n *\n * Syntax:\n *\n * math.subtract(x, y)\n *\n * Examples:\n *\n * math.subtract(5.3, 2) // returns number 3.3\n *\n * const a = math.complex(2, 3)\n * const b = math.complex(4, 1)\n * math.subtract(a, b) // returns Complex -2 + 2i\n *\n * math.subtract([5, 7, 4], 4) // returns Array [1, 3, 0]\n *\n * const c = math.unit('2.1 km')\n * const d = math.unit('500m')\n * math.subtract(c, d) // returns Unit 1.6 km\n *\n * See also:\n *\n * add\n *\n * @param {number | BigNumber | Fraction | Complex | Unit | Array | Matrix} x\n * Initial value\n * @param {number | BigNumber | Fraction | Complex | Unit | Array | Matrix} y\n * Value to subtract from `x`\n * @return {number | BigNumber | Fraction | Complex | Unit | Array | Matrix}\n * Subtraction of `x` and `y`\n */\n return typed(name, {\n 'number, number': (x, y) => x - y,\n 'Complex, Complex': (x, y) => x.sub(y),\n 'BigNumber, BigNumber': (x, y) => x.minus(y),\n 'Fraction, Fraction': (x, y) => x.sub(y),\n 'Unit, Unit': typed.referToSelf(self => (x, y) => {\n if (x.value === null) {\n throw new Error('Parameter x contains a unit with undefined value');\n }\n if (y.value === null) {\n throw new Error('Parameter y contains a unit with undefined value');\n }\n if (!x.equalBase(y)) {\n throw new Error('Units do not match');\n }\n var res = x.clone();\n res.value = typed.find(self, [res.valueType(), y.valueType()])(res.value, y.value);\n res.fixPrefix = false;\n return res;\n })\n }, matrixAlgorithmSuite({\n SS: matAlgo05xSfSf,\n DS: matAlgo01xDSid,\n SD: matAlgo03xDSf,\n Ss: matAlgo12xSfs,\n sS: matAlgo10xSids\n }));\n});","import { factory } from '../../utils/factory.js';\nimport { xgcdNumber } from '../../plain/number/index.js';\nvar name = 'xgcd';\nvar dependencies = ['typed', 'config', 'matrix', 'BigNumber'];\nexport var createXgcd = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n config,\n matrix,\n BigNumber\n } = _ref;\n /**\n * Calculate the extended greatest common divisor for two values.\n * See https://en.wikipedia.org/wiki/Extended_Euclidean_algorithm.\n *\n * Syntax:\n *\n * math.xgcd(a, b)\n *\n * Examples:\n *\n * math.xgcd(8, 12) // returns [4, -1, 1]\n * math.gcd(8, 12) // returns 4\n * math.xgcd(36163, 21199) // returns [1247, -7, 12]\n *\n * See also:\n *\n * gcd, lcm\n *\n * @param {number | BigNumber} a An integer number\n * @param {number | BigNumber} b An integer number\n * @return {Array} Returns an array containing 3 integers `[div, m, n]`\n * where `div = gcd(a, b)` and `a*m + b*n = div`\n */\n return typed(name, {\n 'number, number': function numberNumber(a, b) {\n var res = xgcdNumber(a, b);\n return config.matrix === 'Array' ? res : matrix(res);\n },\n 'BigNumber, BigNumber': _xgcdBigNumber\n // TODO: implement support for Fraction\n });\n\n /**\n * Calculate xgcd for two BigNumbers\n * @param {BigNumber} a\n * @param {BigNumber} b\n * @return {BigNumber[]} result\n * @private\n */\n function _xgcdBigNumber(a, b) {\n // source: https://en.wikipedia.org/wiki/Extended_Euclidean_algorithm\n var\n // used to swap two variables\n t;\n var\n // quotient\n q;\n var\n // remainder\n r;\n var zero = new BigNumber(0);\n var one = new BigNumber(1);\n var x = zero;\n var lastx = one;\n var y = one;\n var lasty = zero;\n if (!a.isInt() || !b.isInt()) {\n throw new Error('Parameters in function xgcd must be integer numbers');\n }\n while (!b.isZero()) {\n q = a.div(b).floor();\n r = a.mod(b);\n t = x;\n x = lastx.minus(q.times(x));\n lastx = t;\n t = y;\n y = lasty.minus(q.times(y));\n lasty = t;\n a = b;\n b = r;\n }\n var res;\n if (a.lt(zero)) {\n res = [a.neg(), lastx.neg(), lasty.neg()];\n } else {\n res = [a, !a.isZero() ? lastx : 0, lasty];\n }\n return config.matrix === 'Array' ? res : matrix(res);\n }\n});","import { factory } from '../../utils/factory.js';\nvar name = 'invmod';\nvar dependencies = ['typed', 'config', 'BigNumber', 'xgcd', 'equal', 'smaller', 'mod', 'add', 'isInteger'];\nexport var createInvmod = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n config,\n BigNumber,\n xgcd,\n equal,\n smaller,\n mod,\n add,\n isInteger\n } = _ref;\n /**\n * Calculate the (modular) multiplicative inverse of a modulo b. Solution to the equation `ax ≣ 1 (mod b)`\n * See https://en.wikipedia.org/wiki/Modular_multiplicative_inverse.\n *\n * Syntax:\n *\n * math.invmod(a, b)\n *\n * Examples:\n *\n * math.invmod(8, 12) // returns NaN\n * math.invmod(7, 13) // returns 2\n * math.invmod(15151, 15122) // returns 10429\n *\n * See also:\n *\n * gcd, xgcd\n *\n * @param {number | BigNumber} a An integer number\n * @param {number | BigNumber} b An integer number\n * @return {number | BigNumber } Returns an integer number\n * where `invmod(a,b)*a ≣ 1 (mod b)`\n */\n return typed(name, {\n 'number, number': invmod,\n 'BigNumber, BigNumber': invmod\n });\n function invmod(a, b) {\n if (!isInteger(a) || !isInteger(b)) throw new Error('Parameters in function invmod must be integer numbers');\n a = mod(a, b);\n if (equal(b, 0)) throw new Error('Divisor must be non zero');\n var res = xgcd(a, b);\n res = res.valueOf();\n var [gcd, inv] = res;\n if (!equal(gcd, BigNumber(1))) return NaN;\n inv = mod(inv, b);\n if (smaller(inv, BigNumber(0))) inv = add(inv, b);\n return inv;\n }\n});","import { factory } from '../../../utils/factory.js';\nimport { DimensionError } from '../../../error/DimensionError.js';\nvar name = 'matAlgo09xS0Sf';\nvar dependencies = ['typed', 'equalScalar'];\nexport var createMatAlgo09xS0Sf = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n equalScalar\n } = _ref;\n /**\n * Iterates over SparseMatrix A and invokes the callback function f(Aij, Bij).\n * Callback function invoked NZA times, number of nonzero elements in A.\n *\n *\n * ┌ f(Aij, Bij) ; A(i,j) !== 0\n * C(i,j) = ┤\n * └ 0 ; otherwise\n *\n *\n * @param {Matrix} a The SparseMatrix instance (A)\n * @param {Matrix} b The SparseMatrix instance (B)\n * @param {Function} callback The f(Aij,Bij) operation to invoke\n *\n * @return {Matrix} SparseMatrix (C)\n *\n * see https://github.com/josdejong/mathjs/pull/346#issuecomment-97620294\n */\n return function matAlgo09xS0Sf(a, b, callback) {\n // sparse matrix arrays\n var avalues = a._values;\n var aindex = a._index;\n var aptr = a._ptr;\n var asize = a._size;\n var adt = a._datatype;\n // sparse matrix arrays\n var bvalues = b._values;\n var bindex = b._index;\n var bptr = b._ptr;\n var bsize = b._size;\n var bdt = b._datatype;\n\n // validate dimensions\n if (asize.length !== bsize.length) {\n throw new DimensionError(asize.length, bsize.length);\n }\n\n // check rows & columns\n if (asize[0] !== bsize[0] || asize[1] !== bsize[1]) {\n throw new RangeError('Dimension mismatch. Matrix A (' + asize + ') must match Matrix B (' + bsize + ')');\n }\n\n // rows & columns\n var rows = asize[0];\n var columns = asize[1];\n\n // datatype\n var dt;\n // equal signature to use\n var eq = equalScalar;\n // zero value\n var zero = 0;\n // callback signature to use\n var cf = callback;\n\n // process data types\n if (typeof adt === 'string' && adt === bdt) {\n // datatype\n dt = adt;\n // find signature that matches (dt, dt)\n eq = typed.find(equalScalar, [dt, dt]);\n // convert 0 to the same datatype\n zero = typed.convert(0, dt);\n // callback\n cf = typed.find(callback, [dt, dt]);\n }\n\n // result arrays\n var cvalues = avalues && bvalues ? [] : undefined;\n var cindex = [];\n var cptr = [];\n\n // workspaces\n var x = cvalues ? [] : undefined;\n // marks indicating we have a value in x for a given column\n var w = [];\n\n // vars\n var i, j, k, k0, k1;\n\n // loop columns\n for (j = 0; j < columns; j++) {\n // update cptr\n cptr[j] = cindex.length;\n // column mark\n var mark = j + 1;\n // check we need to process values\n if (x) {\n // loop B(:,j)\n for (k0 = bptr[j], k1 = bptr[j + 1], k = k0; k < k1; k++) {\n // row\n i = bindex[k];\n // update workspace\n w[i] = mark;\n x[i] = bvalues[k];\n }\n }\n // loop A(:,j)\n for (k0 = aptr[j], k1 = aptr[j + 1], k = k0; k < k1; k++) {\n // row\n i = aindex[k];\n // check we need to process values\n if (x) {\n // b value @ i,j\n var vb = w[i] === mark ? x[i] : zero;\n // invoke f\n var vc = cf(avalues[k], vb);\n // check zero value\n if (!eq(vc, zero)) {\n // push index\n cindex.push(i);\n // push value\n cvalues.push(vc);\n }\n } else {\n // push index\n cindex.push(i);\n }\n }\n }\n // update cptr\n cptr[columns] = cindex.length;\n\n // return sparse matrix\n return a.createSparseMatrix({\n values: cvalues,\n index: cindex,\n ptr: cptr,\n size: [rows, columns],\n datatype: dt\n });\n };\n});","import { factory } from '../../utils/factory.js';\nimport { createMatAlgo02xDS0 } from '../../type/matrix/utils/matAlgo02xDS0.js';\nimport { createMatAlgo09xS0Sf } from '../../type/matrix/utils/matAlgo09xS0Sf.js';\nimport { createMatAlgo11xS0s } from '../../type/matrix/utils/matAlgo11xS0s.js';\nimport { createMatrixAlgorithmSuite } from '../../type/matrix/utils/matrixAlgorithmSuite.js';\nvar name = 'dotMultiply';\nvar dependencies = ['typed', 'matrix', 'equalScalar', 'multiplyScalar', 'concat'];\nexport var createDotMultiply = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n matrix,\n equalScalar,\n multiplyScalar,\n concat\n } = _ref;\n var matAlgo02xDS0 = createMatAlgo02xDS0({\n typed,\n equalScalar\n });\n var matAlgo09xS0Sf = createMatAlgo09xS0Sf({\n typed,\n equalScalar\n });\n var matAlgo11xS0s = createMatAlgo11xS0s({\n typed,\n equalScalar\n });\n var matrixAlgorithmSuite = createMatrixAlgorithmSuite({\n typed,\n matrix,\n concat\n });\n\n /**\n * Multiply two matrices element wise. The function accepts both matrices and\n * scalar values.\n *\n * Syntax:\n *\n * math.dotMultiply(x, y)\n *\n * Examples:\n *\n * math.dotMultiply(2, 4) // returns 8\n *\n * a = [[9, 5], [6, 1]]\n * b = [[3, 2], [5, 2]]\n *\n * math.dotMultiply(a, b) // returns [[27, 10], [30, 2]]\n * math.multiply(a, b) // returns [[52, 28], [23, 14]]\n *\n * See also:\n *\n * multiply, divide, dotDivide\n *\n * @param {number | BigNumber | Fraction | Complex | Unit | Array | Matrix} x Left hand value\n * @param {number | BigNumber | Fraction | Complex | Unit | Array | Matrix} y Right hand value\n * @return {number | BigNumber | Fraction | Complex | Unit | Array | Matrix} Multiplication of `x` and `y`\n */\n return typed(name, matrixAlgorithmSuite({\n elop: multiplyScalar,\n SS: matAlgo09xS0Sf,\n DS: matAlgo02xDS0,\n Ss: matAlgo11xS0s\n }));\n});","/**\n * Bitwise and for Bignumbers\n *\n * Special Cases:\n * N & n = N\n * n & 0 = 0\n * n & -1 = n\n * n & n = n\n * I & I = I\n * -I & -I = -I\n * I & -I = 0\n * I & n = n\n * I & -n = I\n * -I & n = 0\n * -I & -n = -I\n *\n * @param {BigNumber} x\n * @param {BigNumber} y\n * @return {BigNumber} Result of `x` & `y`, is fully precise\n * @private\n */\nexport function bitAndBigNumber(x, y) {\n if (x.isFinite() && !x.isInteger() || y.isFinite() && !y.isInteger()) {\n throw new Error('Integers expected in function bitAnd');\n }\n var BigNumber = x.constructor;\n if (x.isNaN() || y.isNaN()) {\n return new BigNumber(NaN);\n }\n if (x.isZero() || y.eq(-1) || x.eq(y)) {\n return x;\n }\n if (y.isZero() || x.eq(-1)) {\n return y;\n }\n if (!x.isFinite() || !y.isFinite()) {\n if (!x.isFinite() && !y.isFinite()) {\n if (x.isNegative() === y.isNegative()) {\n return x;\n }\n return new BigNumber(0);\n }\n if (!x.isFinite()) {\n if (y.isNegative()) {\n return x;\n }\n if (x.isNegative()) {\n return new BigNumber(0);\n }\n return y;\n }\n if (!y.isFinite()) {\n if (x.isNegative()) {\n return y;\n }\n if (y.isNegative()) {\n return new BigNumber(0);\n }\n return x;\n }\n }\n return bitwise(x, y, function (a, b) {\n return a & b;\n });\n}\n\n/**\n * Bitwise not\n * @param {BigNumber} x\n * @return {BigNumber} Result of ~`x`, fully precise\n *\n */\nexport function bitNotBigNumber(x) {\n if (x.isFinite() && !x.isInteger()) {\n throw new Error('Integer expected in function bitNot');\n }\n var BigNumber = x.constructor;\n var prevPrec = BigNumber.precision;\n BigNumber.config({\n precision: 1E9\n });\n var result = x.plus(new BigNumber(1));\n result.s = -result.s || null;\n BigNumber.config({\n precision: prevPrec\n });\n return result;\n}\n\n/**\n * Bitwise OR for BigNumbers\n *\n * Special Cases:\n * N | n = N\n * n | 0 = n\n * n | -1 = -1\n * n | n = n\n * I | I = I\n * -I | -I = -I\n * I | -n = -1\n * I | -I = -1\n * I | n = I\n * -I | n = -I\n * -I | -n = -n\n *\n * @param {BigNumber} x\n * @param {BigNumber} y\n * @return {BigNumber} Result of `x` | `y`, fully precise\n */\nexport function bitOrBigNumber(x, y) {\n if (x.isFinite() && !x.isInteger() || y.isFinite() && !y.isInteger()) {\n throw new Error('Integers expected in function bitOr');\n }\n var BigNumber = x.constructor;\n if (x.isNaN() || y.isNaN()) {\n return new BigNumber(NaN);\n }\n var negOne = new BigNumber(-1);\n if (x.isZero() || y.eq(negOne) || x.eq(y)) {\n return y;\n }\n if (y.isZero() || x.eq(negOne)) {\n return x;\n }\n if (!x.isFinite() || !y.isFinite()) {\n if (!x.isFinite() && !x.isNegative() && y.isNegative() || x.isNegative() && !y.isNegative() && !y.isFinite()) {\n return negOne;\n }\n if (x.isNegative() && y.isNegative()) {\n return x.isFinite() ? x : y;\n }\n return x.isFinite() ? y : x;\n }\n return bitwise(x, y, function (a, b) {\n return a | b;\n });\n}\n\n/**\n * Applies bitwise function to numbers\n * @param {BigNumber} x\n * @param {BigNumber} y\n * @param {function (a, b)} func\n * @return {BigNumber}\n */\nexport function bitwise(x, y, func) {\n var BigNumber = x.constructor;\n var xBits, yBits;\n var xSign = +(x.s < 0);\n var ySign = +(y.s < 0);\n if (xSign) {\n xBits = decCoefficientToBinaryString(bitNotBigNumber(x));\n for (var i = 0; i < xBits.length; ++i) {\n xBits[i] ^= 1;\n }\n } else {\n xBits = decCoefficientToBinaryString(x);\n }\n if (ySign) {\n yBits = decCoefficientToBinaryString(bitNotBigNumber(y));\n for (var _i = 0; _i < yBits.length; ++_i) {\n yBits[_i] ^= 1;\n }\n } else {\n yBits = decCoefficientToBinaryString(y);\n }\n var minBits, maxBits, minSign;\n if (xBits.length <= yBits.length) {\n minBits = xBits;\n maxBits = yBits;\n minSign = xSign;\n } else {\n minBits = yBits;\n maxBits = xBits;\n minSign = ySign;\n }\n var shortLen = minBits.length;\n var longLen = maxBits.length;\n var expFuncVal = func(xSign, ySign) ^ 1;\n var outVal = new BigNumber(expFuncVal ^ 1);\n var twoPower = new BigNumber(1);\n var two = new BigNumber(2);\n var prevPrec = BigNumber.precision;\n BigNumber.config({\n precision: 1E9\n });\n while (shortLen > 0) {\n if (func(minBits[--shortLen], maxBits[--longLen]) === expFuncVal) {\n outVal = outVal.plus(twoPower);\n }\n twoPower = twoPower.times(two);\n }\n while (longLen > 0) {\n if (func(minSign, maxBits[--longLen]) === expFuncVal) {\n outVal = outVal.plus(twoPower);\n }\n twoPower = twoPower.times(two);\n }\n BigNumber.config({\n precision: prevPrec\n });\n if (expFuncVal === 0) {\n outVal.s = -outVal.s;\n }\n return outVal;\n}\n\n/* Extracted from decimal.js, and edited to specialize. */\nfunction decCoefficientToBinaryString(x) {\n // Convert to string\n var a = x.d; // array with digits\n var r = a[0] + '';\n for (var i = 1; i < a.length; ++i) {\n var s = a[i] + '';\n for (var z = 7 - s.length; z--;) {\n s = '0' + s;\n }\n r += s;\n }\n var j = r.length;\n while (r.charAt(j) === '0') {\n j--;\n }\n var xe = x.e;\n var str = r.slice(0, j + 1 || 1);\n var strL = str.length;\n if (xe > 0) {\n if (++xe > strL) {\n // Append zeros.\n xe -= strL;\n while (xe--) {\n str += '0';\n }\n } else if (xe < strL) {\n str = str.slice(0, xe) + '.' + str.slice(xe);\n }\n }\n\n // Convert from base 10 (decimal) to base 2\n var arr = [0];\n for (var _i2 = 0; _i2 < str.length;) {\n var arrL = arr.length;\n while (arrL--) {\n arr[arrL] *= 10;\n }\n arr[0] += parseInt(str.charAt(_i2++)); // convert to int\n for (var _j = 0; _j < arr.length; ++_j) {\n if (arr[_j] > 1) {\n if (arr[_j + 1] === null || arr[_j + 1] === undefined) {\n arr[_j + 1] = 0;\n }\n arr[_j + 1] += arr[_j] >> 1;\n arr[_j] &= 1;\n }\n }\n }\n return arr.reverse();\n}\n\n/**\n * Bitwise XOR for BigNumbers\n *\n * Special Cases:\n * N ^ n = N\n * n ^ 0 = n\n * n ^ n = 0\n * n ^ -1 = ~n\n * I ^ n = I\n * I ^ -n = -I\n * I ^ -I = -1\n * -I ^ n = -I\n * -I ^ -n = I\n *\n * @param {BigNumber} x\n * @param {BigNumber} y\n * @return {BigNumber} Result of `x` ^ `y`, fully precise\n *\n */\nexport function bitXor(x, y) {\n if (x.isFinite() && !x.isInteger() || y.isFinite() && !y.isInteger()) {\n throw new Error('Integers expected in function bitXor');\n }\n var BigNumber = x.constructor;\n if (x.isNaN() || y.isNaN()) {\n return new BigNumber(NaN);\n }\n if (x.isZero()) {\n return y;\n }\n if (y.isZero()) {\n return x;\n }\n if (x.eq(y)) {\n return new BigNumber(0);\n }\n var negOne = new BigNumber(-1);\n if (x.eq(negOne)) {\n return bitNotBigNumber(y);\n }\n if (y.eq(negOne)) {\n return bitNotBigNumber(x);\n }\n if (!x.isFinite() || !y.isFinite()) {\n if (!x.isFinite() && !y.isFinite()) {\n return negOne;\n }\n return new BigNumber(x.isNegative() === y.isNegative() ? Infinity : -Infinity);\n }\n return bitwise(x, y, function (a, b) {\n return a ^ b;\n });\n}\n\n/**\n * Bitwise left shift\n *\n * Special Cases:\n * n << -n = N\n * n << N = N\n * N << n = N\n * n << 0 = n\n * 0 << n = 0\n * I << I = N\n * I << n = I\n * n << I = I\n *\n * @param {BigNumber} x\n * @param {BigNumber} y\n * @return {BigNumber} Result of `x` << `y`\n *\n */\nexport function leftShiftBigNumber(x, y) {\n if (x.isFinite() && !x.isInteger() || y.isFinite() && !y.isInteger()) {\n throw new Error('Integers expected in function leftShift');\n }\n var BigNumber = x.constructor;\n if (x.isNaN() || y.isNaN() || y.isNegative() && !y.isZero()) {\n return new BigNumber(NaN);\n }\n if (x.isZero() || y.isZero()) {\n return x;\n }\n if (!x.isFinite() && !y.isFinite()) {\n return new BigNumber(NaN);\n }\n\n // Math.pow(2, y) is fully precise for y < 55, and fast\n if (y.lt(55)) {\n return x.times(Math.pow(2, y.toNumber()) + '');\n }\n return x.times(new BigNumber(2).pow(y));\n}\n\n/*\n * Special Cases:\n * n >> -n = N\n * n >> N = N\n * N >> n = N\n * I >> I = N\n * n >> 0 = n\n * I >> n = I\n * -I >> n = -I\n * -I >> I = -I\n * n >> I = I\n * -n >> I = -1\n * 0 >> n = 0\n *\n * @param {BigNumber} value\n * @param {BigNumber} value\n * @return {BigNumber} Result of `x` >> `y`\n *\n */\nexport function rightArithShiftBigNumber(x, y) {\n if (x.isFinite() && !x.isInteger() || y.isFinite() && !y.isInteger()) {\n throw new Error('Integers expected in function rightArithShift');\n }\n var BigNumber = x.constructor;\n if (x.isNaN() || y.isNaN() || y.isNegative() && !y.isZero()) {\n return new BigNumber(NaN);\n }\n if (x.isZero() || y.isZero()) {\n return x;\n }\n if (!y.isFinite()) {\n if (x.isNegative()) {\n return new BigNumber(-1);\n }\n if (!x.isFinite()) {\n return new BigNumber(NaN);\n }\n return new BigNumber(0);\n }\n\n // Math.pow(2, y) is fully precise for y < 55, and fast\n if (y.lt(55)) {\n return x.div(Math.pow(2, y.toNumber()) + '').floor();\n }\n return x.div(new BigNumber(2).pow(y)).floor();\n}","import { bitAndBigNumber } from '../../utils/bignumber/bitwise.js';\nimport { createMatAlgo02xDS0 } from '../../type/matrix/utils/matAlgo02xDS0.js';\nimport { createMatAlgo11xS0s } from '../../type/matrix/utils/matAlgo11xS0s.js';\nimport { createMatAlgo06xS0S0 } from '../../type/matrix/utils/matAlgo06xS0S0.js';\nimport { factory } from '../../utils/factory.js';\nimport { createMatrixAlgorithmSuite } from '../../type/matrix/utils/matrixAlgorithmSuite.js';\nimport { bitAndNumber } from '../../plain/number/index.js';\nvar name = 'bitAnd';\nvar dependencies = ['typed', 'matrix', 'equalScalar', 'concat'];\nexport var createBitAnd = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n matrix,\n equalScalar,\n concat\n } = _ref;\n var matAlgo02xDS0 = createMatAlgo02xDS0({\n typed,\n equalScalar\n });\n var matAlgo06xS0S0 = createMatAlgo06xS0S0({\n typed,\n equalScalar\n });\n var matAlgo11xS0s = createMatAlgo11xS0s({\n typed,\n equalScalar\n });\n var matrixAlgorithmSuite = createMatrixAlgorithmSuite({\n typed,\n matrix,\n concat\n });\n\n /**\n * Bitwise AND two values, `x & y`.\n * For matrices, the function is evaluated element wise.\n *\n * Syntax:\n *\n * math.bitAnd(x, y)\n *\n * Examples:\n *\n * math.bitAnd(53, 131) // returns number 1\n *\n * math.bitAnd([1, 12, 31], 42) // returns Array [0, 8, 10]\n *\n * See also:\n *\n * bitNot, bitOr, bitXor, leftShift, rightArithShift, rightLogShift\n *\n * @param {number | BigNumber | Array | Matrix} x First value to and\n * @param {number | BigNumber | Array | Matrix} y Second value to and\n * @return {number | BigNumber | Array | Matrix} AND of `x` and `y`\n */\n return typed(name, {\n 'number, number': bitAndNumber,\n 'BigNumber, BigNumber': bitAndBigNumber\n }, matrixAlgorithmSuite({\n SS: matAlgo06xS0S0,\n DS: matAlgo02xDS0,\n Ss: matAlgo11xS0s\n }));\n});","import { bitNotBigNumber } from '../../utils/bignumber/bitwise.js';\nimport { deepMap } from '../../utils/collection.js';\nimport { factory } from '../../utils/factory.js';\nimport { bitNotNumber } from '../../plain/number/index.js';\nvar name = 'bitNot';\nvar dependencies = ['typed'];\nexport var createBitNot = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed\n } = _ref;\n /**\n * Bitwise NOT value, `~x`.\n * For matrices, the function is evaluated element wise.\n * For units, the function is evaluated on the best prefix base.\n *\n * Syntax:\n *\n * math.bitNot(x)\n *\n * Examples:\n *\n * math.bitNot(1) // returns number -2\n *\n * math.bitNot([2, -3, 4]) // returns Array [-3, 2, -5]\n *\n * See also:\n *\n * bitAnd, bitOr, bitXor, leftShift, rightArithShift, rightLogShift\n *\n * @param {number | BigNumber | Array | Matrix} x Value to not\n * @return {number | BigNumber | Array | Matrix} NOT of `x`\n */\n return typed(name, {\n number: bitNotNumber,\n BigNumber: bitNotBigNumber,\n 'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self))\n });\n});","import { bitOrBigNumber } from '../../utils/bignumber/bitwise.js';\nimport { factory } from '../../utils/factory.js';\nimport { createMatAlgo10xSids } from '../../type/matrix/utils/matAlgo10xSids.js';\nimport { createMatAlgo04xSidSid } from '../../type/matrix/utils/matAlgo04xSidSid.js';\nimport { createMatAlgo01xDSid } from '../../type/matrix/utils/matAlgo01xDSid.js';\nimport { createMatrixAlgorithmSuite } from '../../type/matrix/utils/matrixAlgorithmSuite.js';\nimport { bitOrNumber } from '../../plain/number/index.js';\nvar name = 'bitOr';\nvar dependencies = ['typed', 'matrix', 'equalScalar', 'DenseMatrix', 'concat'];\nexport var createBitOr = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n matrix,\n equalScalar,\n DenseMatrix,\n concat\n } = _ref;\n var matAlgo01xDSid = createMatAlgo01xDSid({\n typed\n });\n var matAlgo04xSidSid = createMatAlgo04xSidSid({\n typed,\n equalScalar\n });\n var matAlgo10xSids = createMatAlgo10xSids({\n typed,\n DenseMatrix\n });\n var matrixAlgorithmSuite = createMatrixAlgorithmSuite({\n typed,\n matrix,\n concat\n });\n\n /**\n * Bitwise OR two values, `x | y`.\n * For matrices, the function is evaluated element wise.\n * For units, the function is evaluated on the lowest print base.\n *\n * Syntax:\n *\n * math.bitOr(x, y)\n *\n * Examples:\n *\n * math.bitOr(1, 2) // returns number 3\n *\n * math.bitOr([1, 2, 3], 4) // returns Array [5, 6, 7]\n *\n * See also:\n *\n * bitAnd, bitNot, bitXor, leftShift, rightArithShift, rightLogShift\n *\n * @param {number | BigNumber | Array | Matrix} x First value to or\n * @param {number | BigNumber | Array | Matrix} y Second value to or\n * @return {number | BigNumber | Array | Matrix} OR of `x` and `y`\n */\n return typed(name, {\n 'number, number': bitOrNumber,\n 'BigNumber, BigNumber': bitOrBigNumber\n }, matrixAlgorithmSuite({\n SS: matAlgo04xSidSid,\n DS: matAlgo01xDSid,\n Ss: matAlgo10xSids\n }));\n});","import { factory } from '../../../utils/factory.js';\nimport { DimensionError } from '../../../error/DimensionError.js';\nvar name = 'matAlgo07xSSf';\nvar dependencies = ['typed', 'DenseMatrix'];\nexport var createMatAlgo07xSSf = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n DenseMatrix\n } = _ref;\n /**\n * Iterates over SparseMatrix A and SparseMatrix B items (zero and nonzero) and invokes the callback function f(Aij, Bij).\n * Callback function invoked MxN times.\n *\n * C(i,j) = f(Aij, Bij)\n *\n * @param {Matrix} a The SparseMatrix instance (A)\n * @param {Matrix} b The SparseMatrix instance (B)\n * @param {Function} callback The f(Aij,Bij) operation to invoke\n *\n * @return {Matrix} DenseMatrix (C)\n *\n * see https://github.com/josdejong/mathjs/pull/346#issuecomment-97620294\n */\n return function matAlgo07xSSf(a, b, callback) {\n // sparse matrix arrays\n var asize = a._size;\n var adt = a._datatype;\n // sparse matrix arrays\n var bsize = b._size;\n var bdt = b._datatype;\n\n // validate dimensions\n if (asize.length !== bsize.length) {\n throw new DimensionError(asize.length, bsize.length);\n }\n\n // check rows & columns\n if (asize[0] !== bsize[0] || asize[1] !== bsize[1]) {\n throw new RangeError('Dimension mismatch. Matrix A (' + asize + ') must match Matrix B (' + bsize + ')');\n }\n\n // rows & columns\n var rows = asize[0];\n var columns = asize[1];\n\n // datatype\n var dt;\n // zero value\n var zero = 0;\n // callback signature to use\n var cf = callback;\n\n // process data types\n if (typeof adt === 'string' && adt === bdt) {\n // datatype\n dt = adt;\n // convert 0 to the same datatype\n zero = typed.convert(0, dt);\n // callback\n cf = typed.find(callback, [dt, dt]);\n }\n\n // vars\n var i, j;\n\n // result arrays\n var cdata = [];\n // initialize c\n for (i = 0; i < rows; i++) {\n cdata[i] = [];\n }\n\n // workspaces\n var xa = [];\n var xb = [];\n // marks indicating we have a value in x for a given column\n var wa = [];\n var wb = [];\n\n // loop columns\n for (j = 0; j < columns; j++) {\n // columns mark\n var mark = j + 1;\n // scatter the values of A(:,j) into workspace\n _scatter(a, j, wa, xa, mark);\n // scatter the values of B(:,j) into workspace\n _scatter(b, j, wb, xb, mark);\n // loop rows\n for (i = 0; i < rows; i++) {\n // matrix values @ i,j\n var va = wa[i] === mark ? xa[i] : zero;\n var vb = wb[i] === mark ? xb[i] : zero;\n // invoke callback\n cdata[i][j] = cf(va, vb);\n }\n }\n\n // return dense matrix\n return new DenseMatrix({\n data: cdata,\n size: [rows, columns],\n datatype: dt\n });\n };\n function _scatter(m, j, w, x, mark) {\n // a arrays\n var values = m._values;\n var index = m._index;\n var ptr = m._ptr;\n // loop values in column j\n for (var k = ptr[j], k1 = ptr[j + 1]; k < k1; k++) {\n // row\n var i = index[k];\n // update workspace\n w[i] = mark;\n x[i] = values[k];\n }\n }\n});","import { bitXor as bigBitXor } from '../../utils/bignumber/bitwise.js';\nimport { createMatAlgo03xDSf } from '../../type/matrix/utils/matAlgo03xDSf.js';\nimport { createMatAlgo07xSSf } from '../../type/matrix/utils/matAlgo07xSSf.js';\nimport { createMatAlgo12xSfs } from '../../type/matrix/utils/matAlgo12xSfs.js';\nimport { factory } from '../../utils/factory.js';\nimport { createMatrixAlgorithmSuite } from '../../type/matrix/utils/matrixAlgorithmSuite.js';\nimport { bitXorNumber } from '../../plain/number/index.js';\nvar name = 'bitXor';\nvar dependencies = ['typed', 'matrix', 'DenseMatrix', 'concat'];\nexport var createBitXor = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n matrix,\n DenseMatrix,\n concat\n } = _ref;\n var matAlgo03xDSf = createMatAlgo03xDSf({\n typed\n });\n var matAlgo07xSSf = createMatAlgo07xSSf({\n typed,\n DenseMatrix\n });\n var matAlgo12xSfs = createMatAlgo12xSfs({\n typed,\n DenseMatrix\n });\n var matrixAlgorithmSuite = createMatrixAlgorithmSuite({\n typed,\n matrix,\n concat\n });\n\n /**\n * Bitwise XOR two values, `x ^ y`.\n * For matrices, the function is evaluated element wise.\n *\n * Syntax:\n *\n * math.bitXor(x, y)\n *\n * Examples:\n *\n * math.bitXor(1, 2) // returns number 3\n *\n * math.bitXor([2, 3, 4], 4) // returns Array [6, 7, 0]\n *\n * See also:\n *\n * bitAnd, bitNot, bitOr, leftShift, rightArithShift, rightLogShift\n *\n * @param {number | BigNumber | Array | Matrix} x First value to xor\n * @param {number | BigNumber | Array | Matrix} y Second value to xor\n * @return {number | BigNumber | Array | Matrix} XOR of `x` and `y`\n */\n return typed(name, {\n 'number, number': bitXorNumber,\n 'BigNumber, BigNumber': bigBitXor\n }, matrixAlgorithmSuite({\n SS: matAlgo07xSSf,\n DS: matAlgo03xDSf,\n Ss: matAlgo12xSfs\n }));\n});","import { factory } from '../../utils/factory.js';\nimport { deepMap } from '../../utils/collection.js';\nvar name = 'arg';\nvar dependencies = ['typed'];\nexport var createArg = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed\n } = _ref;\n /**\n * Compute the argument of a complex value.\n * For a complex number `a + bi`, the argument is computed as `atan2(b, a)`.\n *\n * For matrices, the function is evaluated element wise.\n *\n * Syntax:\n *\n * math.arg(x)\n *\n * Examples:\n *\n * const a = math.complex(2, 2)\n * math.arg(a) / math.pi // returns number 0.25\n *\n * const b = math.complex('2 + 3i')\n * math.arg(b) // returns number 0.982793723247329\n * math.atan2(3, 2) // returns number 0.982793723247329\n *\n * See also:\n *\n * re, im, conj, abs\n *\n * @param {number | BigNumber | Complex | Array | Matrix} x\n * A complex number or array with complex numbers\n * @return {number | BigNumber | Array | Matrix} The argument of x\n */\n return typed(name, {\n number: function number(x) {\n return Math.atan2(0, x);\n },\n BigNumber: function BigNumber(x) {\n return x.constructor.atan2(0, x);\n },\n Complex: function Complex(x) {\n return x.arg();\n },\n // TODO: implement BigNumber support for function arg\n\n 'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self))\n });\n});","import { factory } from '../../utils/factory.js';\nimport { deepMap } from '../../utils/collection.js';\nvar name = 'conj';\nvar dependencies = ['typed'];\nexport var createConj = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed\n } = _ref;\n /**\n * Compute the complex conjugate of a complex value.\n * If `x = a+bi`, the complex conjugate of `x` is `a - bi`.\n *\n * For matrices, the function is evaluated element wise.\n *\n * Syntax:\n *\n * math.conj(x)\n *\n * Examples:\n *\n * math.conj(math.complex('2 + 3i')) // returns Complex 2 - 3i\n * math.conj(math.complex('2 - 3i')) // returns Complex 2 + 3i\n * math.conj(math.complex('-5.2i')) // returns Complex 5.2i\n *\n * See also:\n *\n * re, im, arg, abs\n *\n * @param {number | BigNumber | Complex | Array | Matrix} x\n * A complex number or array with complex numbers\n * @return {number | BigNumber | Complex | Array | Matrix}\n * The complex conjugate of x\n */\n return typed(name, {\n 'number | BigNumber | Fraction': x => x,\n Complex: x => x.conjugate(),\n 'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self))\n });\n});","import { factory } from '../../utils/factory.js';\nimport { deepMap } from '../../utils/collection.js';\nvar name = 'im';\nvar dependencies = ['typed'];\nexport var createIm = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed\n } = _ref;\n /**\n * Get the imaginary part of a complex number.\n * For a complex number `a + bi`, the function returns `b`.\n *\n * For matrices, the function is evaluated element wise.\n *\n * Syntax:\n *\n * math.im(x)\n *\n * Examples:\n *\n * const a = math.complex(2, 3)\n * math.re(a) // returns number 2\n * math.im(a) // returns number 3\n *\n * math.re(math.complex('-5.2i')) // returns number -5.2\n * math.re(math.complex(2.4)) // returns number 0\n *\n * See also:\n *\n * re, conj, abs, arg\n *\n * @param {number | BigNumber | Complex | Array | Matrix} x\n * A complex number or array with complex numbers\n * @return {number | BigNumber | Array | Matrix} The imaginary part of x\n */\n return typed(name, {\n number: () => 0,\n 'BigNumber | Fraction': x => x.mul(0),\n Complex: x => x.im,\n 'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self))\n });\n});","import { factory } from '../../utils/factory.js';\nimport { deepMap } from '../../utils/collection.js';\nvar name = 're';\nvar dependencies = ['typed'];\nexport var createRe = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed\n } = _ref;\n /**\n * Get the real part of a complex number.\n * For a complex number `a + bi`, the function returns `a`.\n *\n * For matrices, the function is evaluated element wise.\n *\n * Syntax:\n *\n * math.re(x)\n *\n * Examples:\n *\n * const a = math.complex(2, 3)\n * math.re(a) // returns number 2\n * math.im(a) // returns number 3\n *\n * math.re(math.complex('-5.2i')) // returns number 0\n * math.re(math.complex(2.4)) // returns number 2.4\n *\n * See also:\n *\n * im, conj, abs, arg\n *\n * @param {number | BigNumber | Complex | Array | Matrix} x\n * A complex number or array with complex numbers\n * @return {number | BigNumber | Array | Matrix} The real part of x\n */\n return typed(name, {\n 'number | BigNumber | Fraction': x => x,\n Complex: x => x.re,\n 'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self))\n });\n});","import { deepMap } from '../../utils/collection.js';\nimport { factory } from '../../utils/factory.js';\nimport { notNumber } from '../../plain/number/index.js';\nvar name = 'not';\nvar dependencies = ['typed'];\nexport var createNot = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed\n } = _ref;\n /**\n * Logical `not`. Flips boolean value of a given parameter.\n * For matrices, the function is evaluated element wise.\n *\n * Syntax:\n *\n * math.not(x)\n *\n * Examples:\n *\n * math.not(2) // returns false\n * math.not(0) // returns true\n * math.not(true) // returns false\n *\n * a = [2, -7, 0]\n * math.not(a) // returns [false, false, true]\n *\n * See also:\n *\n * and, or, xor\n *\n * @param {number | BigNumber | Complex | Unit | Array | Matrix} x First value to check\n * @return {boolean | Array | Matrix}\n * Returns true when input is a zero or empty value.\n */\n return typed(name, {\n 'null | undefined': () => true,\n number: notNumber,\n Complex: function Complex(x) {\n return x.re === 0 && x.im === 0;\n },\n BigNumber: function BigNumber(x) {\n return x.isZero() || x.isNaN();\n },\n Unit: typed.referToSelf(self => x => typed.find(self, x.valueType())(x.value)),\n 'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self))\n });\n});","import { createMatAlgo03xDSf } from '../../type/matrix/utils/matAlgo03xDSf.js';\nimport { createMatAlgo12xSfs } from '../../type/matrix/utils/matAlgo12xSfs.js';\nimport { createMatAlgo05xSfSf } from '../../type/matrix/utils/matAlgo05xSfSf.js';\nimport { factory } from '../../utils/factory.js';\nimport { createMatrixAlgorithmSuite } from '../../type/matrix/utils/matrixAlgorithmSuite.js';\nimport { orNumber } from '../../plain/number/index.js';\nvar name = 'or';\nvar dependencies = ['typed', 'matrix', 'equalScalar', 'DenseMatrix', 'concat'];\nexport var createOr = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n matrix,\n equalScalar,\n DenseMatrix,\n concat\n } = _ref;\n var matAlgo03xDSf = createMatAlgo03xDSf({\n typed\n });\n var matAlgo05xSfSf = createMatAlgo05xSfSf({\n typed,\n equalScalar\n });\n var matAlgo12xSfs = createMatAlgo12xSfs({\n typed,\n DenseMatrix\n });\n var matrixAlgorithmSuite = createMatrixAlgorithmSuite({\n typed,\n matrix,\n concat\n });\n\n /**\n * Logical `or`. Test if at least one value is defined with a nonzero/nonempty value.\n * For matrices, the function is evaluated element wise.\n *\n * Syntax:\n *\n * math.or(x, y)\n *\n * Examples:\n *\n * math.or(2, 4) // returns true\n *\n * a = [2, 5, 0]\n * b = [0, 22, 0]\n * c = 0\n *\n * math.or(a, b) // returns [true, true, false]\n * math.or(b, c) // returns [false, true, false]\n *\n * See also:\n *\n * and, not, xor\n *\n * @param {number | BigNumber | Complex | Unit | Array | Matrix} x First value to check\n * @param {number | BigNumber | Complex | Unit | Array | Matrix} y Second value to check\n * @return {boolean | Array | Matrix}\n * Returns true when one of the inputs is defined with a nonzero/nonempty value.\n */\n return typed(name, {\n 'number, number': orNumber,\n 'Complex, Complex': function ComplexComplex(x, y) {\n return x.re !== 0 || x.im !== 0 || y.re !== 0 || y.im !== 0;\n },\n 'BigNumber, BigNumber': function BigNumberBigNumber(x, y) {\n return !x.isZero() && !x.isNaN() || !y.isZero() && !y.isNaN();\n },\n 'Unit, Unit': typed.referToSelf(self => (x, y) => self(x.value || 0, y.value || 0))\n }, matrixAlgorithmSuite({\n SS: matAlgo05xSfSf,\n DS: matAlgo03xDSf,\n Ss: matAlgo12xSfs\n }));\n});","import { createMatAlgo03xDSf } from '../../type/matrix/utils/matAlgo03xDSf.js';\nimport { createMatAlgo07xSSf } from '../../type/matrix/utils/matAlgo07xSSf.js';\nimport { createMatAlgo12xSfs } from '../../type/matrix/utils/matAlgo12xSfs.js';\nimport { factory } from '../../utils/factory.js';\nimport { createMatrixAlgorithmSuite } from '../../type/matrix/utils/matrixAlgorithmSuite.js';\nimport { xorNumber } from '../../plain/number/index.js';\nvar name = 'xor';\nvar dependencies = ['typed', 'matrix', 'DenseMatrix', 'concat'];\nexport var createXor = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n matrix,\n DenseMatrix,\n concat\n } = _ref;\n var matAlgo03xDSf = createMatAlgo03xDSf({\n typed\n });\n var matAlgo07xSSf = createMatAlgo07xSSf({\n typed,\n DenseMatrix\n });\n var matAlgo12xSfs = createMatAlgo12xSfs({\n typed,\n DenseMatrix\n });\n var matrixAlgorithmSuite = createMatrixAlgorithmSuite({\n typed,\n matrix,\n concat\n });\n\n /**\n * Logical `xor`. Test whether one and only one value is defined with a nonzero/nonempty value.\n * For matrices, the function is evaluated element wise.\n *\n * Syntax:\n *\n * math.xor(x, y)\n *\n * Examples:\n *\n * math.xor(2, 4) // returns false\n *\n * a = [2, 0, 0]\n * b = [2, 7, 0]\n * c = 0\n *\n * math.xor(a, b) // returns [false, true, false]\n * math.xor(a, c) // returns [true, false, false]\n *\n * See also:\n *\n * and, not, or\n *\n * @param {number | BigNumber | Complex | Unit | Array | Matrix} x First value to check\n * @param {number | BigNumber | Complex | Unit | Array | Matrix} y Second value to check\n * @return {boolean | Array | Matrix}\n * Returns true when one and only one input is defined with a nonzero/nonempty value.\n */\n return typed(name, {\n 'number, number': xorNumber,\n 'Complex, Complex': function ComplexComplex(x, y) {\n return (x.re !== 0 || x.im !== 0) !== (y.re !== 0 || y.im !== 0);\n },\n 'BigNumber, BigNumber': function BigNumberBigNumber(x, y) {\n return (!x.isZero() && !x.isNaN()) !== (!y.isZero() && !y.isNaN());\n },\n 'Unit, Unit': typed.referToSelf(self => (x, y) => self(x.value || 0, y.value || 0))\n }, matrixAlgorithmSuite({\n SS: matAlgo07xSSf,\n DS: matAlgo03xDSf,\n Ss: matAlgo12xSfs\n }));\n});","import { isBigNumber, isMatrix, isNumber } from '../../utils/is.js';\nimport { clone } from '../../utils/object.js';\nimport { arraySize } from '../../utils/array.js';\nimport { IndexError } from '../../error/IndexError.js';\nimport { DimensionError } from '../../error/DimensionError.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'concat';\nvar dependencies = ['typed', 'matrix', 'isInteger'];\nexport var createConcat = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n matrix,\n isInteger\n } = _ref;\n /**\n * Concatenate two or more matrices.\n *\n * Syntax:\n *\n * math.concat(A, B, C, ...)\n * math.concat(A, B, C, ..., dim)\n *\n * Where:\n *\n * - `dim: number` is a zero-based dimension over which to concatenate the matrices.\n * By default the last dimension of the matrices.\n *\n * Examples:\n *\n * const A = [[1, 2], [5, 6]]\n * const B = [[3, 4], [7, 8]]\n *\n * math.concat(A, B) // returns [[1, 2, 3, 4], [5, 6, 7, 8]]\n * math.concat(A, B, 0) // returns [[1, 2], [5, 6], [3, 4], [7, 8]]\n * math.concat('hello', ' ', 'world') // returns 'hello world'\n *\n * See also:\n *\n * size, squeeze, subset, transpose\n *\n * @param {... Array | Matrix} args Two or more matrices\n * @return {Array | Matrix} Concatenated matrix\n */\n return typed(name, {\n // TODO: change signature to '...Array | Matrix, dim?' when supported\n '...Array | Matrix | number | BigNumber': function ArrayMatrixNumberBigNumber(args) {\n var i;\n var len = args.length;\n var dim = -1; // zero-based dimension\n var prevDim;\n var asMatrix = false;\n var matrices = []; // contains multi dimensional arrays\n\n for (i = 0; i < len; i++) {\n var arg = args[i];\n\n // test whether we need to return a Matrix (if not we return an Array)\n if (isMatrix(arg)) {\n asMatrix = true;\n }\n if (isNumber(arg) || isBigNumber(arg)) {\n if (i !== len - 1) {\n throw new Error('Dimension must be specified as last argument');\n }\n\n // last argument contains the dimension on which to concatenate\n prevDim = dim;\n dim = arg.valueOf(); // change BigNumber to number\n\n if (!isInteger(dim)) {\n throw new TypeError('Integer number expected for dimension');\n }\n if (dim < 0 || i > 0 && dim > prevDim) {\n // TODO: would be more clear when throwing a DimensionError here\n throw new IndexError(dim, prevDim + 1);\n }\n } else {\n // this is a matrix or array\n var m = clone(arg).valueOf();\n var size = arraySize(m);\n matrices[i] = m;\n prevDim = dim;\n dim = size.length - 1;\n\n // verify whether each of the matrices has the same number of dimensions\n if (i > 0 && dim !== prevDim) {\n throw new DimensionError(prevDim + 1, dim + 1);\n }\n }\n }\n if (matrices.length === 0) {\n throw new SyntaxError('At least one matrix expected');\n }\n var res = matrices.shift();\n while (matrices.length) {\n res = _concat(res, matrices.shift(), dim, 0);\n }\n return asMatrix ? matrix(res) : res;\n },\n '...string': function string(args) {\n return args.join('');\n }\n });\n});\n\n/**\n * Recursively concatenate two matrices.\n * The contents of the matrices is not cloned.\n * @param {Array} a Multi dimensional array\n * @param {Array} b Multi dimensional array\n * @param {number} concatDim The dimension on which to concatenate (zero-based)\n * @param {number} dim The current dim (zero-based)\n * @return {Array} c The concatenated matrix\n * @private\n */\nfunction _concat(a, b, concatDim, dim) {\n if (dim < concatDim) {\n // recurse into next dimension\n if (a.length !== b.length) {\n throw new DimensionError(a.length, b.length);\n }\n var c = [];\n for (var i = 0; i < a.length; i++) {\n c[i] = _concat(a[i], b[i], concatDim, dim + 1);\n }\n return c;\n } else {\n // concatenate this dimension\n return a.concat(b);\n }\n}","import { factory } from '../../utils/factory.js';\nimport { isMatrix } from '../../utils/is.js';\nimport { clone } from '../../utils/object.js';\nimport { validateIndex } from '../../utils/array.js';\nvar name = 'column';\nvar dependencies = ['typed', 'Index', 'matrix', 'range'];\nexport var createColumn = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n Index,\n matrix,\n range\n } = _ref;\n /**\n * Return a column from a Matrix.\n *\n * Syntax:\n *\n * math.column(value, index)\n *\n * Example:\n *\n * // get a column\n * const d = [[1, 2], [3, 4]]\n * math.column(d, 1) // returns [[2], [4]]\n *\n * See also:\n *\n * row\n *\n * @param {Array | Matrix } value An array or matrix\n * @param {number} column The index of the column\n * @return {Array | Matrix} The retrieved column\n */\n return typed(name, {\n 'Matrix, number': _column,\n 'Array, number': function ArrayNumber(value, column) {\n return _column(matrix(clone(value)), column).valueOf();\n }\n });\n\n /**\n * Retrieve a column of a matrix\n * @param {Matrix } value A matrix\n * @param {number} column The index of the column\n * @return {Matrix} The retrieved column\n */\n function _column(value, column) {\n // check dimensions\n if (value.size().length !== 2) {\n throw new Error('Only two dimensional matrix is supported');\n }\n validateIndex(column, value.size()[1]);\n var rowRange = range(0, value.size()[0]);\n var index = new Index(rowRange, column);\n var result = value.subset(index);\n return isMatrix(result) ? result : matrix([[result]]);\n }\n});","import { factory } from '../../utils/factory.js';\nvar name = 'count';\nvar dependencies = ['typed', 'size', 'prod'];\nexport var createCount = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n size,\n prod\n } = _ref;\n /**\n * Count the number of elements of a matrix, array or string.\n *\n * Syntax:\n *\n * math.count(x)\n *\n * Examples:\n *\n * math.count('hello world') // returns 11\n * const A = [[1, 2, 3], [4, 5, 6]]\n * math.count(A) // returns 6\n * math.count(math.range(1,6)) // returns 5\n *\n * See also:\n *\n * size\n *\n * @param {string | Array | Matrix} x A matrix or string\n * @return {number} An integer with the elements in `x`.\n */\n return typed(name, {\n string: function string(x) {\n return x.length;\n },\n 'Matrix | Array': function MatrixArray(x) {\n return prod(size(x));\n }\n });\n});","import { arraySize, squeeze } from '../../utils/array.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'cross';\nvar dependencies = ['typed', 'matrix', 'subtract', 'multiply'];\nexport var createCross = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n matrix,\n subtract,\n multiply\n } = _ref;\n /**\n * Calculate the cross product for two vectors in three dimensional space.\n * The cross product of `A = [a1, a2, a3]` and `B = [b1, b2, b3]` is defined\n * as:\n *\n * cross(A, B) = [\n * a2 * b3 - a3 * b2,\n * a3 * b1 - a1 * b3,\n * a1 * b2 - a2 * b1\n * ]\n *\n * If one of the input vectors has a dimension greater than 1, the output\n * vector will be a 1x3 (2-dimensional) matrix.\n *\n * Syntax:\n *\n * math.cross(x, y)\n *\n * Examples:\n *\n * math.cross([1, 1, 0], [0, 1, 1]) // Returns [1, -1, 1]\n * math.cross([3, -3, 1], [4, 9, 2]) // Returns [-15, -2, 39]\n * math.cross([2, 3, 4], [5, 6, 7]) // Returns [-3, 6, -3]\n * math.cross([[1, 2, 3]], [[4], [5], [6]]) // Returns [[-3, 6, -3]]\n *\n * See also:\n *\n * dot, multiply\n *\n * @param {Array | Matrix} x First vector\n * @param {Array | Matrix} y Second vector\n * @return {Array | Matrix} Returns the cross product of `x` and `y`\n */\n return typed(name, {\n 'Matrix, Matrix': function MatrixMatrix(x, y) {\n return matrix(_cross(x.toArray(), y.toArray()));\n },\n 'Matrix, Array': function MatrixArray(x, y) {\n return matrix(_cross(x.toArray(), y));\n },\n 'Array, Matrix': function ArrayMatrix(x, y) {\n return matrix(_cross(x, y.toArray()));\n },\n 'Array, Array': _cross\n });\n\n /**\n * Calculate the cross product for two arrays\n * @param {Array} x First vector\n * @param {Array} y Second vector\n * @returns {Array} Returns the cross product of x and y\n * @private\n */\n function _cross(x, y) {\n var highestDimension = Math.max(arraySize(x).length, arraySize(y).length);\n x = squeeze(x);\n y = squeeze(y);\n var xSize = arraySize(x);\n var ySize = arraySize(y);\n if (xSize.length !== 1 || ySize.length !== 1 || xSize[0] !== 3 || ySize[0] !== 3) {\n throw new RangeError('Vectors with length 3 expected ' + '(Size A = [' + xSize.join(', ') + '], B = [' + ySize.join(', ') + '])');\n }\n var product = [subtract(multiply(x[1], y[2]), multiply(x[2], y[1])), subtract(multiply(x[2], y[0]), multiply(x[0], y[2])), subtract(multiply(x[0], y[1]), multiply(x[1], y[0]))];\n if (highestDimension > 1) {\n return [product];\n } else {\n return product;\n }\n }\n});","import { isMatrix } from '../../utils/is.js';\nimport { arraySize } from '../../utils/array.js';\nimport { isInteger } from '../../utils/number.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'diag';\nvar dependencies = ['typed', 'matrix', 'DenseMatrix', 'SparseMatrix'];\nexport var createDiag = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n matrix,\n DenseMatrix,\n SparseMatrix\n } = _ref;\n /**\n * Create a diagonal matrix or retrieve the diagonal of a matrix\n *\n * When `x` is a vector, a matrix with vector `x` on the diagonal will be returned.\n * When `x` is a two dimensional matrix, the matrixes `k`th diagonal will be returned as vector.\n * When k is positive, the values are placed on the super diagonal.\n * When k is negative, the values are placed on the sub diagonal.\n *\n * Syntax:\n *\n * math.diag(X)\n * math.diag(X, format)\n * math.diag(X, k)\n * math.diag(X, k, format)\n *\n * Examples:\n *\n * // create a diagonal matrix\n * math.diag([1, 2, 3]) // returns [[1, 0, 0], [0, 2, 0], [0, 0, 3]]\n * math.diag([1, 2, 3], 1) // returns [[0, 1, 0, 0], [0, 0, 2, 0], [0, 0, 0, 3]]\n * math.diag([1, 2, 3], -1) // returns [[0, 0, 0], [1, 0, 0], [0, 2, 0], [0, 0, 3]]\n *\n * // retrieve the diagonal from a matrix\n * const a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]\n * math.diag(a) // returns [1, 5, 9]\n *\n * See also:\n *\n * ones, zeros, identity\n *\n * @param {Matrix | Array} x A two dimensional matrix or a vector\n * @param {number | BigNumber} [k=0] The diagonal where the vector will be filled\n * in or retrieved.\n * @param {string} [format='dense'] The matrix storage format.\n *\n * @returns {Matrix | Array} Diagonal matrix from input vector, or diagonal from input matrix.\n */\n return typed(name, {\n // FIXME: simplify this huge amount of signatures as soon as typed-function supports optional arguments\n\n Array: function Array(x) {\n return _diag(x, 0, arraySize(x), null);\n },\n 'Array, number': function ArrayNumber(x, k) {\n return _diag(x, k, arraySize(x), null);\n },\n 'Array, BigNumber': function ArrayBigNumber(x, k) {\n return _diag(x, k.toNumber(), arraySize(x), null);\n },\n 'Array, string': function ArrayString(x, format) {\n return _diag(x, 0, arraySize(x), format);\n },\n 'Array, number, string': function ArrayNumberString(x, k, format) {\n return _diag(x, k, arraySize(x), format);\n },\n 'Array, BigNumber, string': function ArrayBigNumberString(x, k, format) {\n return _diag(x, k.toNumber(), arraySize(x), format);\n },\n Matrix: function Matrix(x) {\n return _diag(x, 0, x.size(), x.storage());\n },\n 'Matrix, number': function MatrixNumber(x, k) {\n return _diag(x, k, x.size(), x.storage());\n },\n 'Matrix, BigNumber': function MatrixBigNumber(x, k) {\n return _diag(x, k.toNumber(), x.size(), x.storage());\n },\n 'Matrix, string': function MatrixString(x, format) {\n return _diag(x, 0, x.size(), format);\n },\n 'Matrix, number, string': function MatrixNumberString(x, k, format) {\n return _diag(x, k, x.size(), format);\n },\n 'Matrix, BigNumber, string': function MatrixBigNumberString(x, k, format) {\n return _diag(x, k.toNumber(), x.size(), format);\n }\n });\n\n /**\n * Creeate diagonal matrix from a vector or vice versa\n * @param {Array | Matrix} x\n * @param {number} k\n * @param {string} format Storage format for matrix. If null,\n * an Array is returned\n * @returns {Array | Matrix}\n * @private\n */\n function _diag(x, k, size, format) {\n if (!isInteger(k)) {\n throw new TypeError('Second parameter in function diag must be an integer');\n }\n var kSuper = k > 0 ? k : 0;\n var kSub = k < 0 ? -k : 0;\n\n // check dimensions\n switch (size.length) {\n case 1:\n return _createDiagonalMatrix(x, k, format, size[0], kSub, kSuper);\n case 2:\n return _getDiagonal(x, k, format, size, kSub, kSuper);\n }\n throw new RangeError('Matrix for function diag must be 2 dimensional');\n }\n function _createDiagonalMatrix(x, k, format, l, kSub, kSuper) {\n // matrix size\n var ms = [l + kSub, l + kSuper];\n if (format && format !== 'sparse' && format !== 'dense') {\n throw new TypeError(\"Unknown matrix type \".concat(format, \"\\\"\"));\n }\n\n // create diagonal matrix\n var m = format === 'sparse' ? SparseMatrix.diagonal(ms, x, k) : DenseMatrix.diagonal(ms, x, k);\n // check we need to return a matrix\n return format !== null ? m : m.valueOf();\n }\n function _getDiagonal(x, k, format, s, kSub, kSuper) {\n // check x is a Matrix\n if (isMatrix(x)) {\n // get diagonal matrix\n var dm = x.diagonal(k);\n // check we need to return a matrix\n if (format !== null) {\n // check we need to change matrix format\n if (format !== dm.storage()) {\n return matrix(dm, format);\n }\n return dm;\n }\n return dm.valueOf();\n }\n // vector size\n var n = Math.min(s[0] - kSub, s[1] - kSuper);\n // diagonal values\n var vector = [];\n // loop diagonal\n for (var i = 0; i < n; i++) {\n vector[i] = x[i + kSub][i + kSuper];\n }\n // check we need to return a matrix\n return format !== null ? matrix(vector) : vector;\n }\n});","import typed from 'typed-function';\nimport { typeOf as _typeOf } from './is.js';\n\n/**\n * Invoke a callback for functions like map and filter with a matching number of arguments\n * @param {function} callback\n * @param {any} value\n * @param {number | number[]} index\n * @param {Array} array\n * @param {string} mappingFnName The name of the function that is invoking these callbacks, for example \"map\" or \"filter\"\n * @returns {*}\n */\nexport function applyCallback(callback, value, index, array, mappingFnName) {\n if (typed.isTypedFunction(callback)) {\n // invoke the typed callback function with the matching number of arguments only\n\n var args3 = [value, index, array];\n var signature3 = typed.resolve(callback, args3);\n if (signature3) {\n return tryWithArgs(signature3.implementation, args3);\n }\n var args2 = [value, index];\n var signature2 = typed.resolve(callback, args2);\n if (signature2) {\n return tryWithArgs(signature2.implementation, args2);\n }\n var args1 = [value];\n var signature1 = typed.resolve(callback, args1);\n if (signature1) {\n return tryWithArgs(signature1.implementation, args1);\n }\n\n // fallback (will throw an exception)\n return tryWithArgs(callback, args3);\n } else {\n // A regular JavaScript function\n return callback(value, index, array);\n }\n\n /**\n * @param {function} signature The selected signature of the typed-function\n * @param {Array} args List with arguments to apply to the selected signature\n * @returns {*} Returns the return value of the invoked signature\n * @throws {TypeError} Throws an error when no matching signature was found\n */\n function tryWithArgs(signature, args) {\n try {\n return signature.apply(signature, args);\n } catch (err) {\n var _err$data;\n // Enrich the error message so the user understands that it took place inside the callback function\n if (err instanceof TypeError && ((_err$data = err.data) === null || _err$data === void 0 ? void 0 : _err$data.category) === 'wrongType') {\n var argsDesc = [];\n argsDesc.push(\"value: \".concat(_typeOf(value)));\n if (args.length >= 2) {\n argsDesc.push(\"index: \".concat(_typeOf(index)));\n }\n if (args.length >= 3) {\n argsDesc.push(\"array: \".concat(_typeOf(array)));\n }\n throw new TypeError(\"Function \".concat(mappingFnName, \" cannot apply callback arguments \") + \"\".concat(callback.name, \"(\").concat(argsDesc.join(', '), \") at index \").concat(JSON.stringify(index)));\n } else {\n throw new TypeError(\"Function \".concat(mappingFnName, \" cannot apply callback arguments \") + \"to function \".concat(callback.name, \": \").concat(err.message));\n }\n }\n }\n}","import { applyCallback } from '../../utils/applyCallback.js';\nimport { filter, filterRegExp } from '../../utils/array.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'filter';\nvar dependencies = ['typed'];\nexport var createFilter = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed\n } = _ref;\n /**\n * Filter the items in an array or one dimensional matrix.\n *\n * Syntax:\n *\n * math.filter(x, test)\n *\n * Examples:\n *\n * function isPositive (x) {\n * return x > 0\n * }\n * math.filter([6, -2, -1, 4, 3], isPositive) // returns [6, 4, 3]\n *\n * math.filter([\"23\", \"foo\", \"100\", \"55\", \"bar\"], /[0-9]+/) // returns [\"23\", \"100\", \"55\"]\n *\n * See also:\n *\n * forEach, map, sort\n *\n * @param {Matrix | Array} x A one dimensional matrix or array to filter\n * @param {Function | RegExp} test\n * A function or regular expression to test items.\n * All entries for which `test` returns true are returned.\n * When `test` is a function, it is invoked with three parameters:\n * the value of the element, the index of the element, and the\n * matrix/array being traversed. The function must return a boolean.\n * @return {Matrix | Array} Returns the filtered matrix.\n */\n return typed('filter', {\n 'Array, function': _filterCallback,\n 'Matrix, function': function MatrixFunction(x, test) {\n return x.create(_filterCallback(x.toArray(), test));\n },\n 'Array, RegExp': filterRegExp,\n 'Matrix, RegExp': function MatrixRegExp(x, test) {\n return x.create(filterRegExp(x.toArray(), test));\n }\n });\n});\n\n/**\n * Filter values in a callback given a callback function\n * @param {Array} x\n * @param {Function} callback\n * @return {Array} Returns the filtered array\n * @private\n */\nfunction _filterCallback(x, callback) {\n return filter(x, function (value, index, array) {\n // invoke the callback function with the right number of arguments\n return applyCallback(callback, value, [index], array, 'filter');\n });\n}","import { flatten as flattenArray } from '../../utils/array.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'flatten';\nvar dependencies = ['typed', 'matrix'];\nexport var createFlatten = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n matrix\n } = _ref;\n /**\n * Flatten a multidimensional matrix into a single dimensional matrix.\n * A new matrix is returned, the original matrix is left untouched.\n *\n * Syntax:\n *\n * math.flatten(x)\n *\n * Examples:\n *\n * math.flatten([[1,2], [3,4]]) // returns [1, 2, 3, 4]\n *\n * See also:\n *\n * concat, resize, size, squeeze\n *\n * @param {Matrix | Array} x Matrix to be flattened\n * @return {Matrix | Array} Returns the flattened matrix\n */\n return typed(name, {\n Array: function Array(x) {\n return flattenArray(x);\n },\n Matrix: function Matrix(x) {\n var flat = flattenArray(x.toArray());\n // TODO: return the same matrix type as x (Dense or Sparse Matrix)\n return matrix(flat);\n }\n });\n});","import { applyCallback } from '../../utils/applyCallback.js';\nimport { forEach as forEachArray } from '../../utils/array.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'forEach';\nvar dependencies = ['typed'];\nexport var createForEach = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed\n } = _ref;\n /**\n * Iterate over all elements of a matrix/array, and executes the given callback function.\n *\n * Syntax:\n *\n * math.forEach(x, callback)\n *\n * Examples:\n *\n * math.forEach([1, 2, 3], function(value) {\n * console.log(value)\n * })\n * // outputs 1, 2, 3\n *\n * See also:\n *\n * filter, map, sort\n *\n * @param {Matrix | Array} x The matrix to iterate on.\n * @param {Function} callback The callback function is invoked with three\n * parameters: the value of the element, the index\n * of the element, and the Matrix/array being traversed.\n */\n return typed(name, {\n 'Array, function': _forEach,\n 'Matrix, function': function MatrixFunction(x, callback) {\n x.forEach(callback);\n }\n });\n});\n\n/**\n * forEach for a multidimensional array\n * @param {Array} array\n * @param {Function} callback\n * @private\n */\nfunction _forEach(array, callback) {\n var recurse = function recurse(value, index) {\n if (Array.isArray(value)) {\n forEachArray(value, function (child, i) {\n // we create a copy of the index array and append the new index value\n recurse(child, index.concat(i));\n });\n } else {\n // invoke the callback function with the right number of arguments\n return applyCallback(callback, value, index, array, 'forEach');\n }\n };\n recurse(array, []);\n}","import { factory } from '../../utils/factory.js';\nimport { getArrayDataType } from '../../utils/array.js';\nimport { typeOf } from '../../utils/is.js';\nvar name = 'getMatrixDataType';\nvar dependencies = ['typed'];\nexport var createGetMatrixDataType = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed\n } = _ref;\n /**\n * Find the data type of all elements in a matrix or array,\n * for example 'number' if all items are a number and 'Complex' if all values\n * are complex numbers.\n * If a matrix contains more than one data type, it will return 'mixed'.\n *\n * Syntax:\n *\n * math.getMatrixDataType(x)\n *\n * Examples:\n *\n * const x = [ [1, 2, 3], [4, 5, 6] ]\n * const mixedX = [ [1, true], [2, 3] ]\n * const fractionX = [ [math.fraction(1, 3)], [math.fraction(1, 3)] ]\n * const unitX = [ [math.unit('5cm')], [math.unit('5cm')] ]\n * const bigNumberX = [ [math.bignumber(1)], [math.bignumber(0)] ]\n * const sparse = math.sparse(x)\n * const dense = math.matrix(x)\n * math.getMatrixDataType(x) // returns 'number'\n * math.getMatrixDataType(sparse) // returns 'number'\n * math.getMatrixDataType(dense) // returns 'number'\n * math.getMatrixDataType(mixedX) // returns 'mixed'\n * math.getMatrixDataType(fractionX) // returns 'Fraction'\n * math.getMatrixDataType(unitX) // returns 'Unit'\n * math.getMatrixDataType(bigNumberX) // return 'BigNumber'\n *\n * See also:\n * SparseMatrix, DenseMatrix\n *\n * @param {...Matrix | Array} x The Matrix with values.\n *\n * @return {string} A string representation of the matrix type\n */\n return typed(name, {\n Array: function Array(x) {\n return getArrayDataType(x, typeOf);\n },\n Matrix: function Matrix(x) {\n return x.getDataType();\n }\n });\n});","import { isBigNumber } from '../../utils/is.js';\nimport { resize } from '../../utils/array.js';\nimport { isInteger } from '../../utils/number.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'identity';\nvar dependencies = ['typed', 'config', 'matrix', 'BigNumber', 'DenseMatrix', 'SparseMatrix'];\nexport var createIdentity = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n config,\n matrix,\n BigNumber,\n DenseMatrix,\n SparseMatrix\n } = _ref;\n /**\n * Create a 2-dimensional identity matrix with size m x n or n x n.\n * The matrix has ones on the diagonal and zeros elsewhere.\n *\n * Syntax:\n *\n * math.identity(n)\n * math.identity(n, format)\n * math.identity(m, n)\n * math.identity(m, n, format)\n * math.identity([m, n])\n * math.identity([m, n], format)\n *\n * Examples:\n *\n * math.identity(3) // returns [[1, 0, 0], [0, 1, 0], [0, 0, 1]]\n * math.identity(3, 2) // returns [[1, 0], [0, 1], [0, 0]]\n *\n * const A = [[1, 2, 3], [4, 5, 6]]\n * math.identity(math.size(A)) // returns [[1, 0, 0], [0, 1, 0]]\n *\n * See also:\n *\n * diag, ones, zeros, size, range\n *\n * @param {...number | Matrix | Array} size The size for the matrix\n * @param {string} [format] The Matrix storage format\n *\n * @return {Matrix | Array | number} A matrix with ones on the diagonal.\n */\n return typed(name, {\n '': function _() {\n return config.matrix === 'Matrix' ? matrix([]) : [];\n },\n string: function string(format) {\n return matrix(format);\n },\n 'number | BigNumber': function numberBigNumber(rows) {\n return _identity(rows, rows, config.matrix === 'Matrix' ? 'dense' : undefined);\n },\n 'number | BigNumber, string': function numberBigNumberString(rows, format) {\n return _identity(rows, rows, format);\n },\n 'number | BigNumber, number | BigNumber': function numberBigNumberNumberBigNumber(rows, cols) {\n return _identity(rows, cols, config.matrix === 'Matrix' ? 'dense' : undefined);\n },\n 'number | BigNumber, number | BigNumber, string': function numberBigNumberNumberBigNumberString(rows, cols, format) {\n return _identity(rows, cols, format);\n },\n Array: function Array(size) {\n return _identityVector(size);\n },\n 'Array, string': function ArrayString(size, format) {\n return _identityVector(size, format);\n },\n Matrix: function Matrix(size) {\n return _identityVector(size.valueOf(), size.storage());\n },\n 'Matrix, string': function MatrixString(size, format) {\n return _identityVector(size.valueOf(), format);\n }\n });\n function _identityVector(size, format) {\n switch (size.length) {\n case 0:\n return format ? matrix(format) : [];\n case 1:\n return _identity(size[0], size[0], format);\n case 2:\n return _identity(size[0], size[1], format);\n default:\n throw new Error('Vector containing two values expected');\n }\n }\n\n /**\n * Create an identity matrix\n * @param {number | BigNumber} rows\n * @param {number | BigNumber} cols\n * @param {string} [format]\n * @returns {Matrix}\n * @private\n */\n function _identity(rows, cols, format) {\n // BigNumber constructor with the right precision\n var Big = isBigNumber(rows) || isBigNumber(cols) ? BigNumber : null;\n if (isBigNumber(rows)) rows = rows.toNumber();\n if (isBigNumber(cols)) cols = cols.toNumber();\n if (!isInteger(rows) || rows < 1) {\n throw new Error('Parameters in function identity must be positive integers');\n }\n if (!isInteger(cols) || cols < 1) {\n throw new Error('Parameters in function identity must be positive integers');\n }\n var one = Big ? new BigNumber(1) : 1;\n var defaultValue = Big ? new Big(0) : 0;\n var size = [rows, cols];\n\n // check we need to return a matrix\n if (format) {\n // create diagonal matrix (use optimized implementation for storage format)\n if (format === 'sparse') {\n return SparseMatrix.diagonal(size, one, 0, defaultValue);\n }\n if (format === 'dense') {\n return DenseMatrix.diagonal(size, one, 0, defaultValue);\n }\n throw new TypeError(\"Unknown matrix type \\\"\".concat(format, \"\\\"\"));\n }\n\n // create and resize array\n var res = resize([], size, defaultValue);\n // fill in ones on the diagonal\n var minimum = rows < cols ? rows : cols;\n // fill diagonal\n for (var d = 0; d < minimum; d++) {\n res[d][d] = one;\n }\n return res;\n }\n});","import { arraySize as size } from '../../utils/array.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'kron';\nvar dependencies = ['typed', 'matrix', 'multiplyScalar'];\nexport var createKron = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n matrix,\n multiplyScalar\n } = _ref;\n /**\n * Calculates the kronecker product of 2 matrices or vectors.\n *\n * NOTE: If a one dimensional vector / matrix is given, it will be\n * wrapped so its two dimensions.\n * See the examples.\n *\n * Syntax:\n *\n * math.kron(x, y)\n *\n * Examples:\n *\n * math.kron([[1, 0], [0, 1]], [[1, 2], [3, 4]])\n * // returns [ [ 1, 2, 0, 0 ], [ 3, 4, 0, 0 ], [ 0, 0, 1, 2 ], [ 0, 0, 3, 4 ] ]\n *\n * math.kron([1,1], [2,3,4])\n * // returns [ [ 2, 3, 4, 2, 3, 4 ] ]\n *\n * See also:\n *\n * multiply, dot, cross\n *\n * @param {Array | Matrix} x First vector\n * @param {Array | Matrix} y Second vector\n * @return {Array | Matrix} Returns the kronecker product of `x` and `y`\n */\n return typed(name, {\n 'Matrix, Matrix': function MatrixMatrix(x, y) {\n return matrix(_kron(x.toArray(), y.toArray()));\n },\n 'Matrix, Array': function MatrixArray(x, y) {\n return matrix(_kron(x.toArray(), y));\n },\n 'Array, Matrix': function ArrayMatrix(x, y) {\n return matrix(_kron(x, y.toArray()));\n },\n 'Array, Array': _kron\n });\n\n /**\n * Calculate the kronecker product of two matrices / vectors\n * @param {Array} a First vector\n * @param {Array} b Second vector\n * @returns {Array} Returns the kronecker product of x and y\n * @private\n */\n function _kron(a, b) {\n // Deal with the dimensions of the matricies.\n if (size(a).length === 1) {\n // Wrap it in a 2D Matrix\n a = [a];\n }\n if (size(b).length === 1) {\n // Wrap it in a 2D Matrix\n b = [b];\n }\n if (size(a).length > 2 || size(b).length > 2) {\n throw new RangeError('Vectors with dimensions greater then 2 are not supported expected ' + '(Size x = ' + JSON.stringify(a.length) + ', y = ' + JSON.stringify(b.length) + ')');\n }\n var t = [];\n var r = [];\n return a.map(function (a) {\n return b.map(function (b) {\n r = [];\n t.push(r);\n return a.map(function (y) {\n return b.map(function (x) {\n return r.push(multiplyScalar(y, x));\n });\n });\n });\n }) && t;\n }\n});","import { applyCallback } from '../../utils/applyCallback.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'map';\nvar dependencies = ['typed'];\nexport var createMap = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed\n } = _ref;\n /**\n * Create a new matrix or array with the results of a callback function executed on\n * each entry of a given matrix/array.\n *\n * For each entry of the input, the callback is invoked with three arguments:\n * the value of the entry, the index at which that entry occurs, and the full\n * matrix/array being traversed. Note that because the matrix/array might be\n * multidimensional, the \"index\" argument is always an array of numbers giving\n * the index in each dimension. This is true even for vectors: the \"index\"\n * argument is an array of length 1, rather than simply a number.\n *\n * Syntax:\n *\n * math.map(x, callback)\n *\n * Examples:\n *\n * math.map([1, 2, 3], function(value) {\n * return value * value\n * }) // returns [1, 4, 9]\n *\n * // The callback is normally called with three arguments:\n * // callback(value, index, Array)\n * // If you want to call with only one argument, use:\n * math.map([1, 2, 3], x => math.format(x)) // returns ['1', '2', '3']\n *\n * See also:\n *\n * filter, forEach, sort\n *\n * @param {Matrix | Array} x The input to iterate on.\n * @param {Function} callback\n * The function to call (as described above) on each entry of the input\n * @return {Matrix | array}\n * Transformed map of x; always has the same type and shape as x\n */\n return typed(name, {\n 'Array, function': _map,\n 'Matrix, function': function MatrixFunction(x, callback) {\n return x.map(callback);\n }\n });\n});\n\n/**\n * Map for a multi dimensional array\n * @param {Array} array\n * @param {Function} callback\n * @return {Array}\n * @private\n */\nfunction _map(array, callback) {\n var recurse = function recurse(value, index) {\n if (Array.isArray(value)) {\n return value.map(function (child, i) {\n // we create a copy of the index array and append the new index value\n return recurse(child, index.concat(i));\n });\n } else {\n // invoke the callback function with the right number of arguments\n return applyCallback(callback, value, index, array, 'map');\n }\n };\n return recurse(array, []);\n}","import { factory } from '../../utils/factory.js';\nimport { isInteger } from '../../utils/number.js';\nimport { isMatrix } from '../../utils/is.js';\nvar name = 'diff';\nvar dependencies = ['typed', 'matrix', 'subtract', 'number'];\nexport var createDiff = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n matrix,\n subtract,\n number\n } = _ref;\n /**\n * Create a new matrix or array of the difference between elements of the given array\n * The optional dim parameter lets you specify the dimension to evaluate the difference of\n * If no dimension parameter is passed it is assumed as dimension 0\n *\n * Dimension is zero-based in javascript and one-based in the parser and can be a number or bignumber\n * Arrays must be 'rectangular' meaning arrays like [1, 2]\n * If something is passed as a matrix it will be returned as a matrix but other than that all matrices are converted to arrays\n *\n * Syntax:\n *\n * math.diff(arr)\n * math.diff(arr, dim)\n *\n * Examples:\n *\n * const arr = [1, 2, 4, 7, 0]\n * math.diff(arr) // returns [1, 2, 3, -7] (no dimension passed so 0 is assumed)\n * math.diff(math.matrix(arr)) // returns Matrix [1, 2, 3, -7]\n *\n * const arr = [[1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [9, 8, 7, 6, 4]]\n * math.diff(arr) // returns [[0, 0, 0, 0, 0], [8, 6, 4, 2, -1]]\n * math.diff(arr, 0) // returns [[0, 0, 0, 0, 0], [8, 6, 4, 2, -1]]\n * math.diff(arr, 1) // returns [[1, 1, 1, 1], [1, 1, 1, 1], [-1, -1, -1, -2]]\n * math.diff(arr, math.bignumber(1)) // returns [[1, 1, 1, 1], [1, 1, 1, 1], [-1, -1, -1, -2]]\n *\n * math.diff(arr, 2) // throws RangeError as arr is 2 dimensional not 3\n * math.diff(arr, -1) // throws RangeError as negative dimensions are not allowed\n *\n * // These will all produce the same result\n * math.diff([[1, 2], [3, 4]])\n * math.diff([math.matrix([1, 2]), math.matrix([3, 4])])\n * math.diff([[1, 2], math.matrix([3, 4])])\n * math.diff([math.matrix([1, 2]), [3, 4]])\n * // They do not produce the same result as math.diff(math.matrix([[1, 2], [3, 4]])) as this returns a matrix\n *\n * See Also:\n *\n * sum\n * subtract\n * partitionSelect\n *\n * @param {Array | Matrix} arr An array or matrix\n * @param {number | BigNumber} dim Dimension\n * @return {Array | Matrix} Difference between array elements in given dimension\n */\n return typed(name, {\n 'Array | Matrix': function ArrayMatrix(arr) {\n // No dimension specified => assume dimension 0\n if (isMatrix(arr)) {\n return matrix(_diff(arr.toArray()));\n } else {\n return _diff(arr);\n }\n },\n 'Array | Matrix, number': function ArrayMatrixNumber(arr, dim) {\n if (!isInteger(dim)) throw new RangeError('Dimension must be a whole number');\n if (isMatrix(arr)) {\n return matrix(_recursive(arr.toArray(), dim));\n } else {\n return _recursive(arr, dim);\n }\n },\n 'Array, BigNumber': typed.referTo('Array,number', selfAn => (arr, dim) => selfAn(arr, number(dim))),\n 'Matrix, BigNumber': typed.referTo('Matrix,number', selfMn => (arr, dim) => selfMn(arr, number(dim)))\n });\n\n /**\n * Recursively find the correct dimension in the array/matrix\n * Then Apply _diff to that dimension\n *\n * @param {Array} arr The array\n * @param {number} dim Dimension\n * @return {Array} resulting array\n */\n function _recursive(arr, dim) {\n if (isMatrix(arr)) {\n arr = arr.toArray(); // Makes sure arrays like [ matrix([0, 1]), matrix([1, 0]) ] are processed properly\n }\n\n if (!Array.isArray(arr)) {\n throw RangeError('Array/Matrix does not have that many dimensions');\n }\n if (dim > 0) {\n var result = [];\n arr.forEach(element => {\n result.push(_recursive(element, dim - 1));\n });\n return result;\n } else if (dim === 0) {\n return _diff(arr);\n } else {\n throw RangeError('Cannot have negative dimension');\n }\n }\n\n /**\n * Difference between elements in the array\n *\n * @param {Array} arr An array\n * @return {Array} resulting array\n */\n function _diff(arr) {\n var result = [];\n var size = arr.length;\n for (var i = 1; i < size; i++) {\n result.push(_ElementDiff(arr[i - 1], arr[i]));\n }\n return result;\n }\n\n /**\n * Difference between 2 objects\n *\n * @param {Object} obj1 First object\n * @param {Object} obj2 Second object\n * @return {Array} resulting array\n */\n function _ElementDiff(obj1, obj2) {\n // Convert matrices to arrays\n if (isMatrix(obj1)) obj1 = obj1.toArray();\n if (isMatrix(obj2)) obj2 = obj2.toArray();\n var obj1IsArray = Array.isArray(obj1);\n var obj2IsArray = Array.isArray(obj2);\n if (obj1IsArray && obj2IsArray) {\n return _ArrayDiff(obj1, obj2);\n }\n if (!obj1IsArray && !obj2IsArray) {\n return subtract(obj2, obj1); // Difference is (second - first) NOT (first - second)\n }\n\n throw TypeError('Cannot calculate difference between 1 array and 1 non-array');\n }\n\n /**\n * Difference of elements in 2 arrays\n *\n * @param {Array} arr1 Array 1\n * @param {Array} arr2 Array 2\n * @return {Array} resulting array\n */\n function _ArrayDiff(arr1, arr2) {\n if (arr1.length !== arr2.length) {\n throw RangeError('Not all sub-arrays have the same length');\n }\n var result = [];\n var size = arr1.length;\n for (var i = 0; i < size; i++) {\n result.push(_ElementDiff(arr1[i], arr2[i]));\n }\n return result;\n }\n});","import { isBigNumber } from '../../utils/is.js';\nimport { isInteger } from '../../utils/number.js';\nimport { resize } from '../../utils/array.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'ones';\nvar dependencies = ['typed', 'config', 'matrix', 'BigNumber'];\nexport var createOnes = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n config,\n matrix,\n BigNumber\n } = _ref;\n /**\n * Create a matrix filled with ones. The created matrix can have one or\n * multiple dimensions.\n *\n * Syntax:\n *\n * math.ones(m)\n * math.ones(m, format)\n * math.ones(m, n)\n * math.ones(m, n, format)\n * math.ones([m, n])\n * math.ones([m, n], format)\n * math.ones([m, n, p, ...])\n * math.ones([m, n, p, ...], format)\n *\n * Examples:\n *\n * math.ones() // returns []\n * math.ones(3) // returns [1, 1, 1]\n * math.ones(3, 2) // returns [[1, 1], [1, 1], [1, 1]]\n * math.ones(3, 2, 'dense') // returns Dense Matrix [[1, 1], [1, 1], [1, 1]]\n *\n * const A = [[1, 2, 3], [4, 5, 6]]\n * math.ones(math.size(A)) // returns [[1, 1, 1], [1, 1, 1]]\n *\n * See also:\n *\n * zeros, identity, size, range\n *\n * @param {...(number|BigNumber) | Array} size The size of each dimension of the matrix\n * @param {string} [format] The Matrix storage format\n *\n * @return {Array | Matrix | number} A matrix filled with ones\n */\n return typed('ones', {\n '': function _() {\n return config.matrix === 'Array' ? _ones([]) : _ones([], 'default');\n },\n // math.ones(m, n, p, ..., format)\n // TODO: more accurate signature '...number | BigNumber, string' as soon as typed-function supports this\n '...number | BigNumber | string': function numberBigNumberString(size) {\n var last = size[size.length - 1];\n if (typeof last === 'string') {\n var format = size.pop();\n return _ones(size, format);\n } else if (config.matrix === 'Array') {\n return _ones(size);\n } else {\n return _ones(size, 'default');\n }\n },\n Array: _ones,\n Matrix: function Matrix(size) {\n var format = size.storage();\n return _ones(size.valueOf(), format);\n },\n 'Array | Matrix, string': function ArrayMatrixString(size, format) {\n return _ones(size.valueOf(), format);\n }\n });\n\n /**\n * Create an Array or Matrix with ones\n * @param {Array} size\n * @param {string} [format='default']\n * @return {Array | Matrix}\n * @private\n */\n function _ones(size, format) {\n var hasBigNumbers = _normalize(size);\n var defaultValue = hasBigNumbers ? new BigNumber(1) : 1;\n _validate(size);\n if (format) {\n // return a matrix\n var m = matrix(format);\n if (size.length > 0) {\n return m.resize(size, defaultValue);\n }\n return m;\n } else {\n // return an Array\n var arr = [];\n if (size.length > 0) {\n return resize(arr, size, defaultValue);\n }\n return arr;\n }\n }\n\n // replace BigNumbers with numbers, returns true if size contained BigNumbers\n function _normalize(size) {\n var hasBigNumbers = false;\n size.forEach(function (value, index, arr) {\n if (isBigNumber(value)) {\n hasBigNumbers = true;\n arr[index] = value.toNumber();\n }\n });\n return hasBigNumbers;\n }\n\n // validate arguments\n function _validate(size) {\n size.forEach(function (value) {\n if (typeof value !== 'number' || !isInteger(value) || value < 0) {\n throw new Error('Parameters in function ones must be positive integers');\n }\n });\n }\n});","export function noBignumber() {\n throw new Error('No \"bignumber\" implementation available');\n}\nexport function noFraction() {\n throw new Error('No \"fraction\" implementation available');\n}\nexport function noMatrix() {\n throw new Error('No \"matrix\" implementation available');\n}\nexport function noIndex() {\n throw new Error('No \"index\" implementation available');\n}\nexport function noSubset() {\n throw new Error('No \"matrix\" implementation available');\n}","import { factory } from '../../utils/factory.js';\nimport { noBignumber, noMatrix } from '../../utils/noop.js';\nvar name = 'range';\nvar dependencies = ['typed', 'config', '?matrix', '?bignumber', 'smaller', 'smallerEq', 'larger', 'largerEq', 'add', 'isPositive'];\nexport var createRange = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n config,\n matrix,\n bignumber,\n smaller,\n smallerEq,\n larger,\n largerEq,\n add,\n isPositive\n } = _ref;\n /**\n * Create an array from a range.\n * By default, the range end is excluded. This can be customized by providing\n * an extra parameter `includeEnd`.\n *\n * Syntax:\n *\n * math.range(str [, includeEnd]) // Create a range from a string,\n * // where the string contains the\n * // start, optional step, and end,\n * // separated by a colon.\n * math.range(start, end [, includeEnd]) // Create a range with start and\n * // end and a step size of 1.\n * math.range(start, end, step [, includeEnd]) // Create a range with start, step,\n * // and end.\n *\n * Where:\n *\n * - `str: string`\n * A string 'start:end' or 'start:step:end'\n * - `start: {number | BigNumber | Unit}`\n * Start of the range\n * - `end: number | BigNumber | Unit`\n * End of the range, excluded by default, included when parameter includeEnd=true\n * - `step: number | BigNumber | Unit`\n * Step size. Default value is 1.\n * - `includeEnd: boolean`\n * Option to specify whether to include the end or not. False by default.\n *\n * Examples:\n *\n * math.range(2, 6) // [2, 3, 4, 5]\n * math.range(2, -3, -1) // [2, 1, 0, -1, -2]\n * math.range('2:1:6') // [2, 3, 4, 5]\n * math.range(2, 6, true) // [2, 3, 4, 5, 6]\n * math.range(math.unit(2, 'm'), math.unit(-3, 'm'), math.unit(-1, 'm')) // [2 m, 1 m, 0 m , -1 m, -2 m]\n *\n * See also:\n *\n * ones, zeros, size, subset\n *\n * @param {*} args Parameters describing the ranges `start`, `end`, and optional `step`.\n * @return {Array | Matrix} range\n */\n return typed(name, {\n // TODO: simplify signatures when typed-function supports default values and optional arguments\n\n // TODO: a number or boolean should not be converted to string here\n string: _strRange,\n 'string, boolean': _strRange,\n 'number, number': function numberNumber(start, end) {\n return _out(_range(start, end, 1, false));\n },\n 'number, number, number': function numberNumberNumber(start, end, step) {\n return _out(_range(start, end, step, false));\n },\n 'number, number, boolean': function numberNumberBoolean(start, end, includeEnd) {\n return _out(_range(start, end, 1, includeEnd));\n },\n 'number, number, number, boolean': function numberNumberNumberBoolean(start, end, step, includeEnd) {\n return _out(_range(start, end, step, includeEnd));\n },\n 'BigNumber, BigNumber': function BigNumberBigNumber(start, end) {\n var BigNumber = start.constructor;\n return _out(_range(start, end, new BigNumber(1), false));\n },\n 'BigNumber, BigNumber, BigNumber': function BigNumberBigNumberBigNumber(start, end, step) {\n return _out(_range(start, end, step, false));\n },\n 'BigNumber, BigNumber, boolean': function BigNumberBigNumberBoolean(start, end, includeEnd) {\n var BigNumber = start.constructor;\n return _out(_range(start, end, new BigNumber(1), includeEnd));\n },\n 'BigNumber, BigNumber, BigNumber, boolean': function BigNumberBigNumberBigNumberBoolean(start, end, step, includeEnd) {\n return _out(_range(start, end, step, includeEnd));\n },\n 'Unit, Unit, Unit': function UnitUnitUnit(start, end, step) {\n return _out(_range(start, end, step, false));\n },\n 'Unit, Unit, Unit, boolean': function UnitUnitUnitBoolean(start, end, step, includeEnd) {\n return _out(_range(start, end, step, includeEnd));\n }\n });\n function _out(arr) {\n if (config.matrix === 'Matrix') {\n return matrix ? matrix(arr) : noMatrix();\n }\n return arr;\n }\n function _strRange(str, includeEnd) {\n var r = _parse(str);\n if (!r) {\n throw new SyntaxError('String \"' + str + '\" is no valid range');\n }\n if (config.number === 'BigNumber') {\n if (bignumber === undefined) {\n noBignumber();\n }\n return _out(_range(bignumber(r.start), bignumber(r.end), bignumber(r.step)), includeEnd);\n } else {\n return _out(_range(r.start, r.end, r.step, includeEnd));\n }\n }\n\n /**\n * Create a range with numbers or BigNumbers\n * @param {number | BigNumber | Unit} start\n * @param {number | BigNumber | Unit} end\n * @param {number | BigNumber | Unit} step\n * @param {boolean} includeEnd\n * @returns {Array} range\n * @private\n */\n function _range(start, end, step, includeEnd) {\n var array = [];\n var ongoing = isPositive(step) ? includeEnd ? smallerEq : smaller : includeEnd ? largerEq : larger;\n var x = start;\n while (ongoing(x, end)) {\n array.push(x);\n x = add(x, step);\n }\n return array;\n }\n\n /**\n * Parse a string into a range,\n * The string contains the start, optional step, and end, separated by a colon.\n * If the string does not contain a valid range, null is returned.\n * For example str='0:2:11'.\n * @param {string} str\n * @return {{start: number, end: number, step: number} | null} range Object containing properties start, end, step\n * @private\n */\n function _parse(str) {\n var args = str.split(':');\n\n // number\n var nums = args.map(function (arg) {\n // use Number and not parseFloat as Number returns NaN on invalid garbage in the string\n return Number(arg);\n });\n var invalid = nums.some(function (num) {\n return isNaN(num);\n });\n if (invalid) {\n return null;\n }\n switch (nums.length) {\n case 2:\n return {\n start: nums[0],\n end: nums[1],\n step: 1\n };\n case 3:\n return {\n start: nums[0],\n end: nums[2],\n step: nums[1]\n };\n default:\n return null;\n }\n }\n});","import { reshape as arrayReshape } from '../../utils/array.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'reshape';\nvar dependencies = ['typed', 'isInteger', 'matrix'];\nexport var createReshape = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n isInteger\n } = _ref;\n /**\n * Reshape a multi dimensional array to fit the specified dimensions\n *\n * Syntax:\n *\n * math.reshape(x, sizes)\n *\n * Examples:\n *\n * math.reshape([1, 2, 3, 4, 5, 6], [2, 3])\n * // returns Array [[1, 2, 3], [4, 5, 6]]\n *\n * math.reshape([[1, 2], [3, 4]], [1, 4])\n * // returns Array [[1, 2, 3, 4]]\n *\n * math.reshape([[1, 2], [3, 4]], [4])\n * // returns Array [1, 2, 3, 4]\n *\n * const x = math.matrix([1, 2, 3, 4, 5, 6, 7, 8])\n * math.reshape(x, [2, 2, 2])\n * // returns Matrix [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]\n *\n * math.reshape([1, 2, 3, 4], [-1, 2])\n * // returns Matrix [[1, 2], [3, 4]]\n *\n * See also:\n *\n * size, squeeze, resize\n *\n * @param {Array | Matrix | *} x Matrix to be reshaped\n * @param {number[]} sizes One dimensional array with integral sizes for\n * each dimension. One -1 is allowed as wildcard,\n * which calculates this dimension automatically.\n *\n * @return {* | Array | Matrix} A reshaped clone of matrix `x`\n *\n * @throws {TypeError} If `sizes` does not contain solely integers\n * @throws {DimensionError} If the product of the new dimension sizes does\n * not equal that of the old ones\n */\n return typed(name, {\n 'Matrix, Array': function MatrixArray(x, sizes) {\n return x.reshape(sizes, true);\n },\n 'Array, Array': function ArrayArray(x, sizes) {\n sizes.forEach(function (size) {\n if (!isInteger(size)) {\n throw new TypeError('Invalid size for dimension: ' + size);\n }\n });\n return arrayReshape(x, sizes);\n }\n });\n});","import { isBigNumber, isMatrix } from '../../utils/is.js';\nimport { DimensionError } from '../../error/DimensionError.js';\nimport { ArgumentsError } from '../../error/ArgumentsError.js';\nimport { isInteger } from '../../utils/number.js';\nimport { format } from '../../utils/string.js';\nimport { clone } from '../../utils/object.js';\nimport { resize as arrayResize } from '../../utils/array.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'resize';\nvar dependencies = ['config', 'matrix'];\nexport var createResize = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n config,\n matrix\n } = _ref;\n /**\n * Resize a matrix\n *\n * Syntax:\n *\n * math.resize(x, size)\n * math.resize(x, size, defaultValue)\n *\n * Examples:\n *\n * math.resize([1, 2, 3, 4, 5], [3]) // returns Array [1, 2, 3]\n * math.resize([1, 2, 3], [5], 0) // returns Array [1, 2, 3, 0, 0]\n * math.resize(2, [2, 3], 0) // returns Matrix [[2, 0, 0], [0, 0, 0]]\n * math.resize(\"hello\", [8], \"!\") // returns string 'hello!!!'\n *\n * See also:\n *\n * size, squeeze, subset, reshape\n *\n * @param {Array | Matrix | *} x Matrix to be resized\n * @param {Array | Matrix} size One dimensional array with numbers\n * @param {number | string} [defaultValue=0] Zero by default, except in\n * case of a string, in that case\n * defaultValue = ' '\n * @return {* | Array | Matrix} A resized clone of matrix `x`\n */\n // TODO: rework resize to a typed-function\n return function resize(x, size, defaultValue) {\n if (arguments.length !== 2 && arguments.length !== 3) {\n throw new ArgumentsError('resize', arguments.length, 2, 3);\n }\n if (isMatrix(size)) {\n size = size.valueOf(); // get Array\n }\n\n if (isBigNumber(size[0])) {\n // convert bignumbers to numbers\n size = size.map(function (value) {\n return !isBigNumber(value) ? value : value.toNumber();\n });\n }\n\n // check x is a Matrix\n if (isMatrix(x)) {\n // use optimized matrix implementation, return copy\n return x.resize(size, defaultValue, true);\n }\n if (typeof x === 'string') {\n // resize string\n return _resizeString(x, size, defaultValue);\n }\n\n // check result should be a matrix\n var asMatrix = Array.isArray(x) ? false : config.matrix !== 'Array';\n if (size.length === 0) {\n // output a scalar\n while (Array.isArray(x)) {\n x = x[0];\n }\n return clone(x);\n } else {\n // output an array/matrix\n if (!Array.isArray(x)) {\n x = [x];\n }\n x = clone(x);\n var res = arrayResize(x, size, defaultValue);\n return asMatrix ? matrix(res) : res;\n }\n };\n\n /**\n * Resize a string\n * @param {string} str\n * @param {number[]} size\n * @param {string} [defaultChar=' ']\n * @private\n */\n function _resizeString(str, size, defaultChar) {\n if (defaultChar !== undefined) {\n if (typeof defaultChar !== 'string' || defaultChar.length !== 1) {\n throw new TypeError('Single character expected as defaultValue');\n }\n } else {\n defaultChar = ' ';\n }\n if (size.length !== 1) {\n throw new DimensionError(size.length, 1);\n }\n var len = size[0];\n if (typeof len !== 'number' || !isInteger(len)) {\n throw new TypeError('Invalid size, must contain positive integers ' + '(size: ' + format(size) + ')');\n }\n if (str.length > len) {\n return str.substring(0, len);\n } else if (str.length < len) {\n var res = str;\n for (var i = 0, ii = len - str.length; i < ii; i++) {\n res += defaultChar;\n }\n return res;\n } else {\n return str;\n }\n }\n});","import { factory } from '../../utils/factory.js';\nimport { arraySize } from '../../utils/array.js';\nvar name = 'rotate';\nvar dependencies = ['typed', 'multiply', 'rotationMatrix'];\nexport var createRotate = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n multiply,\n rotationMatrix\n } = _ref;\n /**\n * Rotate a vector of size 1x2 counter-clockwise by a given angle\n * Rotate a vector of size 1x3 counter-clockwise by a given angle around the given axis\n *\n * Syntax:\n *\n * math.rotate(w, theta)\n * math.rotate(w, theta, v)\n *\n * Examples:\n *\n * math.rotate([11, 12], math.pi / 2) // returns [-12, 11]\n * math.rotate(matrix([11, 12]), math.pi / 2) // returns [-12, 11]\n *\n * math.rotate([1, 0, 0], unit('90deg'), [0, 0, 1]) // returns [0, 1, 0]\n * math.rotate(matrix([1, 0, 0]), unit('90deg'), [0, 0, 1]) // returns Matrix [0, 1, 0]\n *\n * math.rotate([1, 0], math.complex(1 + i)) // returns [cos(1 + i) - sin(1 + i), sin(1 + i) + cos(1 + i)]\n *\n * See also:\n *\n * matrix, rotationMatrix\n *\n * @param {Array | Matrix} w Vector to rotate\n * @param {number | BigNumber | Complex | Unit} theta Rotation angle\n * @param {Array | Matrix} [v] Rotation axis\n * @return {Array | Matrix} Multiplication of the rotation matrix and w\n */\n return typed(name, {\n 'Array , number | BigNumber | Complex | Unit': function ArrayNumberBigNumberComplexUnit(w, theta) {\n _validateSize(w, 2);\n var matrixRes = multiply(rotationMatrix(theta), w);\n return matrixRes.toArray();\n },\n 'Matrix , number | BigNumber | Complex | Unit': function MatrixNumberBigNumberComplexUnit(w, theta) {\n _validateSize(w, 2);\n return multiply(rotationMatrix(theta), w);\n },\n 'Array, number | BigNumber | Complex | Unit, Array | Matrix': function ArrayNumberBigNumberComplexUnitArrayMatrix(w, theta, v) {\n _validateSize(w, 3);\n var matrixRes = multiply(rotationMatrix(theta, v), w);\n return matrixRes;\n },\n 'Matrix, number | BigNumber | Complex | Unit, Array | Matrix': function MatrixNumberBigNumberComplexUnitArrayMatrix(w, theta, v) {\n _validateSize(w, 3);\n return multiply(rotationMatrix(theta, v), w);\n }\n });\n function _validateSize(v, expectedSize) {\n var actualSize = Array.isArray(v) ? arraySize(v) : v.size();\n if (actualSize.length > 2) {\n throw new RangeError(\"Vector must be of dimensions 1x\".concat(expectedSize));\n }\n if (actualSize.length === 2 && actualSize[1] !== 1) {\n throw new RangeError(\"Vector must be of dimensions 1x\".concat(expectedSize));\n }\n if (actualSize[0] !== expectedSize) {\n throw new RangeError(\"Vector must be of dimensions 1x\".concat(expectedSize));\n }\n }\n});","import { isBigNumber } from '../../utils/is.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'rotationMatrix';\nvar dependencies = ['typed', 'config', 'multiplyScalar', 'addScalar', 'unaryMinus', 'norm', 'matrix', 'BigNumber', 'DenseMatrix', 'SparseMatrix', 'cos', 'sin'];\nexport var createRotationMatrix = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n config,\n multiplyScalar,\n addScalar,\n unaryMinus,\n norm,\n BigNumber,\n matrix,\n DenseMatrix,\n SparseMatrix,\n cos,\n sin\n } = _ref;\n /**\n * Create a 2-dimensional counter-clockwise rotation matrix (2x2) for a given angle (expressed in radians).\n * Create a 2-dimensional counter-clockwise rotation matrix (3x3) by a given angle (expressed in radians) around a given axis (1x3).\n *\n * Syntax:\n *\n * math.rotationMatrix(theta)\n * math.rotationMatrix(theta, format)\n * math.rotationMatrix(theta, [v])\n * math.rotationMatrix(theta, [v], format)\n *\n * Examples:\n *\n * math.rotationMatrix(math.pi / 2) // returns [[0, -1], [1, 0]]\n * math.rotationMatrix(math.bignumber(1)) // returns [[bignumber(cos(1)), bignumber(-sin(1))], [bignumber(sin(1)), bignumber(cos(1))]]\n * math.rotationMatrix(math.complex(1 + i)) // returns [[cos(1 + i), -sin(1 + i)], [sin(1 + i), cos(1 + i)]]\n * math.rotationMatrix(math.unit('1rad')) // returns [[cos(1), -sin(1)], [sin(1), cos(1)]]\n *\n * math.rotationMatrix(math.pi / 2, [0, 1, 0]) // returns [[0, 0, 1], [0, 1, 0], [-1, 0, 0]]\n * math.rotationMatrix(math.pi / 2, matrix([0, 1, 0])) // returns matrix([[0, 0, 1], [0, 1, 0], [-1, 0, 0]])\n *\n *\n * See also:\n *\n * matrix, cos, sin\n *\n *\n * @param {number | BigNumber | Complex | Unit} theta Rotation angle\n * @param {Array | Matrix} [v] Rotation axis\n * @param {string} [format] Result Matrix storage format\n * @return {Array | Matrix} Rotation matrix\n */\n\n return typed(name, {\n '': function _() {\n return config.matrix === 'Matrix' ? matrix([]) : [];\n },\n string: function string(format) {\n return matrix(format);\n },\n 'number | BigNumber | Complex | Unit': function numberBigNumberComplexUnit(theta) {\n return _rotationMatrix2x2(theta, config.matrix === 'Matrix' ? 'dense' : undefined);\n },\n 'number | BigNumber | Complex | Unit, string': function numberBigNumberComplexUnitString(theta, format) {\n return _rotationMatrix2x2(theta, format);\n },\n 'number | BigNumber | Complex | Unit, Array': function numberBigNumberComplexUnitArray(theta, v) {\n var matrixV = matrix(v);\n _validateVector(matrixV);\n return _rotationMatrix3x3(theta, matrixV, undefined);\n },\n 'number | BigNumber | Complex | Unit, Matrix': function numberBigNumberComplexUnitMatrix(theta, v) {\n _validateVector(v);\n var storageType = v.storage() || (config.matrix === 'Matrix' ? 'dense' : undefined);\n return _rotationMatrix3x3(theta, v, storageType);\n },\n 'number | BigNumber | Complex | Unit, Array, string': function numberBigNumberComplexUnitArrayString(theta, v, format) {\n var matrixV = matrix(v);\n _validateVector(matrixV);\n return _rotationMatrix3x3(theta, matrixV, format);\n },\n 'number | BigNumber | Complex | Unit, Matrix, string': function numberBigNumberComplexUnitMatrixString(theta, v, format) {\n _validateVector(v);\n return _rotationMatrix3x3(theta, v, format);\n }\n });\n\n /**\n * Returns 2x2 matrix of 2D rotation of angle theta\n *\n * @param {number | BigNumber | Complex | Unit} theta The rotation angle\n * @param {string} format The result Matrix storage format\n * @returns {Matrix}\n * @private\n */\n function _rotationMatrix2x2(theta, format) {\n var Big = isBigNumber(theta);\n var minusOne = Big ? new BigNumber(-1) : -1;\n var cosTheta = cos(theta);\n var sinTheta = sin(theta);\n var data = [[cosTheta, multiplyScalar(minusOne, sinTheta)], [sinTheta, cosTheta]];\n return _convertToFormat(data, format);\n }\n function _validateVector(v) {\n var size = v.size();\n if (size.length < 1 || size[0] !== 3) {\n throw new RangeError('Vector must be of dimensions 1x3');\n }\n }\n function _mul(array) {\n return array.reduce((p, curr) => multiplyScalar(p, curr));\n }\n function _convertToFormat(data, format) {\n if (format) {\n if (format === 'sparse') {\n return new SparseMatrix(data);\n }\n if (format === 'dense') {\n return new DenseMatrix(data);\n }\n throw new TypeError(\"Unknown matrix type \\\"\".concat(format, \"\\\"\"));\n }\n return data;\n }\n\n /**\n * Returns a 3x3 matrix of rotation of angle theta around vector v\n *\n * @param {number | BigNumber | Complex | Unit} theta The rotation angle\n * @param {Matrix} v The rotation axis vector\n * @param {string} format The storage format of the resulting matrix\n * @returns {Matrix}\n * @private\n */\n function _rotationMatrix3x3(theta, v, format) {\n var normV = norm(v);\n if (normV === 0) {\n throw new RangeError('Rotation around zero vector');\n }\n var Big = isBigNumber(theta) ? BigNumber : null;\n var one = Big ? new Big(1) : 1;\n var minusOne = Big ? new Big(-1) : -1;\n var vx = Big ? new Big(v.get([0]) / normV) : v.get([0]) / normV;\n var vy = Big ? new Big(v.get([1]) / normV) : v.get([1]) / normV;\n var vz = Big ? new Big(v.get([2]) / normV) : v.get([2]) / normV;\n var c = cos(theta);\n var oneMinusC = addScalar(one, unaryMinus(c));\n var s = sin(theta);\n var r11 = addScalar(c, _mul([vx, vx, oneMinusC]));\n var r12 = addScalar(_mul([vx, vy, oneMinusC]), _mul([minusOne, vz, s]));\n var r13 = addScalar(_mul([vx, vz, oneMinusC]), _mul([vy, s]));\n var r21 = addScalar(_mul([vx, vy, oneMinusC]), _mul([vz, s]));\n var r22 = addScalar(c, _mul([vy, vy, oneMinusC]));\n var r23 = addScalar(_mul([vy, vz, oneMinusC]), _mul([minusOne, vx, s]));\n var r31 = addScalar(_mul([vx, vz, oneMinusC]), _mul([minusOne, vy, s]));\n var r32 = addScalar(_mul([vy, vz, oneMinusC]), _mul([vx, s]));\n var r33 = addScalar(c, _mul([vz, vz, oneMinusC]));\n var data = [[r11, r12, r13], [r21, r22, r23], [r31, r32, r33]];\n return _convertToFormat(data, format);\n }\n});","import { factory } from '../../utils/factory.js';\nimport { isMatrix } from '../../utils/is.js';\nimport { clone } from '../../utils/object.js';\nimport { validateIndex } from '../../utils/array.js';\nvar name = 'row';\nvar dependencies = ['typed', 'Index', 'matrix', 'range'];\nexport var createRow = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n Index,\n matrix,\n range\n } = _ref;\n /**\n * Return a row from a Matrix.\n *\n * Syntax:\n *\n * math.row(value, index)\n *\n * Example:\n *\n * // get a row\n * const d = [[1, 2], [3, 4]]\n * math.row(d, 1) // returns [[3, 4]]\n *\n * See also:\n *\n * column\n *\n * @param {Array | Matrix } value An array or matrix\n * @param {number} row The index of the row\n * @return {Array | Matrix} The retrieved row\n */\n return typed(name, {\n 'Matrix, number': _row,\n 'Array, number': function ArrayNumber(value, row) {\n return _row(matrix(clone(value)), row).valueOf();\n }\n });\n\n /**\n * Retrieve a row of a matrix\n * @param {Matrix } value A matrix\n * @param {number} row The index of the row\n * @return {Matrix} The retrieved row\n */\n function _row(value, row) {\n // check dimensions\n if (value.size().length !== 2) {\n throw new Error('Only two dimensional matrix is supported');\n }\n validateIndex(row, value.size()[0]);\n var columnRange = range(0, value.size()[1]);\n var index = new Index(row, columnRange);\n var result = value.subset(index);\n return isMatrix(result) ? result : matrix([[result]]);\n }\n});","import { arraySize } from '../../utils/array.js';\nimport { factory } from '../../utils/factory.js';\nimport { noMatrix } from '../../utils/noop.js';\nvar name = 'size';\nvar dependencies = ['typed', 'config', '?matrix'];\nexport var createSize = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n config,\n matrix\n } = _ref;\n /**\n * Calculate the size of a matrix or scalar.\n *\n * Syntax:\n *\n * math.size(x)\n *\n * Examples:\n *\n * math.size(2.3) // returns []\n * math.size('hello world') // returns [11]\n *\n * const A = [[1, 2, 3], [4, 5, 6]]\n * math.size(A) // returns [2, 3]\n * math.size(math.range(1,6)) // returns [5]\n *\n * See also:\n *\n * count, resize, squeeze, subset\n *\n * @param {boolean | number | Complex | Unit | string | Array | Matrix} x A matrix\n * @return {Array | Matrix} A vector with size of `x`.\n */\n return typed(name, {\n Matrix: function Matrix(x) {\n return x.create(x.size());\n },\n Array: arraySize,\n string: function string(x) {\n return config.matrix === 'Array' ? [x.length] : matrix([x.length]);\n },\n 'number | Complex | BigNumber | Unit | boolean | null': function numberComplexBigNumberUnitBooleanNull(x) {\n // scalar\n return config.matrix === 'Array' ? [] : matrix ? matrix([]) : noMatrix();\n }\n });\n});","import { clone } from '../../utils/object.js';\nimport { squeeze as arraySqueeze } from '../../utils/array.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'squeeze';\nvar dependencies = ['typed', 'matrix'];\nexport var createSqueeze = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n matrix\n } = _ref;\n /**\n * Squeeze a matrix, remove inner and outer singleton dimensions from a matrix.\n *\n * Syntax:\n *\n * math.squeeze(x)\n *\n * Examples:\n *\n * math.squeeze([3]) // returns 3\n * math.squeeze([[3]]) // returns 3\n *\n * const A = math.zeros(3, 1) // returns [[0], [0], [0]] (size 3x1)\n * math.squeeze(A) // returns [0, 0, 0] (size 3)\n *\n * const B = math.zeros(1, 3) // returns [[0, 0, 0]] (size 1x3)\n * math.squeeze(B) // returns [0, 0, 0] (size 3)\n *\n * // only inner and outer dimensions are removed\n * const C = math.zeros(2, 1, 3) // returns [[[0, 0, 0]], [[0, 0, 0]]] (size 2x1x3)\n * math.squeeze(C) // returns [[[0, 0, 0]], [[0, 0, 0]]] (size 2x1x3)\n *\n * See also:\n *\n * subset\n *\n * @param {Matrix | Array} x Matrix to be squeezed\n * @return {Matrix | Array} Squeezed matrix\n */\n return typed(name, {\n Array: function Array(x) {\n return arraySqueeze(clone(x));\n },\n Matrix: function Matrix(x) {\n var res = arraySqueeze(x.toArray());\n // FIXME: return the same type of matrix as the input\n return Array.isArray(res) ? matrix(res) : res;\n },\n any: function any(x) {\n // scalar\n return clone(x);\n }\n });\n});","import { isIndex } from '../../utils/is.js';\nimport { clone } from '../../utils/object.js';\nimport { validateIndex } from '../../utils/array.js';\nimport { getSafeProperty, setSafeProperty } from '../../utils/customs.js';\nimport { DimensionError } from '../../error/DimensionError.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'subset';\nvar dependencies = ['typed', 'matrix'];\nexport var createSubset = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n matrix\n } = _ref;\n /**\n * Get or set a subset of a matrix or string.\n *\n * Syntax:\n * math.subset(value, index) // retrieve a subset\n * math.subset(value, index, replacement [, defaultValue]) // replace a subset\n *\n * Examples:\n *\n * // get a subset\n * const d = [[1, 2], [3, 4]]\n * math.subset(d, math.index(1, 0)) // returns 3\n * math.subset(d, math.index([0, 1], 1)) // returns [[2], [4]]\n *\n * // replace a subset\n * const e = []\n * const f = math.subset(e, math.index(0, [0, 2]), [5, 6]) // f = [[5, 6]]\n * const g = math.subset(f, math.index(1, 1), 7, 0) // g = [[5, 6], [0, 7]]\n *\n * // get submatrix using ranges\n * const M = [\n * [1,2,3],\n * [4,5,6],\n * [7,8,9]\n * ]\n * math.subset(M, math.index(math.range(0,2), math.range(0,3))) // [[1,2,3],[4,5,6]]\n *\n * See also:\n *\n * size, resize, squeeze, index\n *\n * @param {Array | Matrix | string} matrix An array, matrix, or string\n * @param {Index} index\n * For each dimension of the target, specifies an index or a list of\n * indices to fetch or set. `subset` uses the cartesian product of\n * the indices specified in each dimension.\n * @param {*} [replacement] An array, matrix, or scalar.\n * If provided, the subset is replaced with replacement.\n * If not provided, the subset is returned\n * @param {*} [defaultValue=undefined] Default value, filled in on new entries when\n * the matrix is resized. If not provided,\n * math.matrix elements will be left undefined.\n * @return {Array | Matrix | string} Either the retrieved subset or the updated matrix.\n */\n return typed(name, {\n // get subset\n 'Array, Index': function ArrayIndex(value, index) {\n var m = matrix(value);\n var subset = m.subset(index); // returns a Matrix\n return index.isScalar() ? subset : subset.valueOf(); // return an Array (like the input)\n },\n\n 'Matrix, Index': function MatrixIndex(value, index) {\n return value.subset(index);\n },\n 'Object, Index': _getObjectProperty,\n 'string, Index': _getSubstring,\n // set subset\n 'Array, Index, any': function ArrayIndexAny(value, index, replacement) {\n return matrix(clone(value)).subset(index, replacement, undefined).valueOf();\n },\n 'Array, Index, any, any': function ArrayIndexAnyAny(value, index, replacement, defaultValue) {\n return matrix(clone(value)).subset(index, replacement, defaultValue).valueOf();\n },\n 'Matrix, Index, any': function MatrixIndexAny(value, index, replacement) {\n return value.clone().subset(index, replacement);\n },\n 'Matrix, Index, any, any': function MatrixIndexAnyAny(value, index, replacement, defaultValue) {\n return value.clone().subset(index, replacement, defaultValue);\n },\n 'string, Index, string': _setSubstring,\n 'string, Index, string, string': _setSubstring,\n 'Object, Index, any': _setObjectProperty\n });\n});\n\n/**\n * Retrieve a subset of a string\n * @param {string} str string from which to get a substring\n * @param {Index} index An index or list of indices (character positions)\n * @returns {string} substring\n * @private\n */\nfunction _getSubstring(str, index) {\n if (!isIndex(index)) {\n // TODO: better error message\n throw new TypeError('Index expected');\n }\n if (index.size().length !== 1) {\n throw new DimensionError(index.size().length, 1);\n }\n\n // validate whether the range is out of range\n var strLen = str.length;\n validateIndex(index.min()[0], strLen);\n validateIndex(index.max()[0], strLen);\n var range = index.dimension(0);\n var substr = '';\n range.forEach(function (v) {\n substr += str.charAt(v);\n });\n return substr;\n}\n\n/**\n * Replace a substring in a string\n * @param {string} str string to be replaced\n * @param {Index} index An index or list of indices (character positions)\n * @param {string} replacement Replacement string\n * @param {string} [defaultValue] Default value to be uses when resizing\n * the string. is ' ' by default\n * @returns {string} result\n * @private\n */\nfunction _setSubstring(str, index, replacement, defaultValue) {\n if (!index || index.isIndex !== true) {\n // TODO: better error message\n throw new TypeError('Index expected');\n }\n if (index.size().length !== 1) {\n throw new DimensionError(index.size().length, 1);\n }\n if (defaultValue !== undefined) {\n if (typeof defaultValue !== 'string' || defaultValue.length !== 1) {\n throw new TypeError('Single character expected as defaultValue');\n }\n } else {\n defaultValue = ' ';\n }\n var range = index.dimension(0);\n var len = range.size()[0];\n if (len !== replacement.length) {\n throw new DimensionError(range.size()[0], replacement.length);\n }\n\n // validate whether the range is out of range\n var strLen = str.length;\n validateIndex(index.min()[0]);\n validateIndex(index.max()[0]);\n\n // copy the string into an array with characters\n var chars = [];\n for (var i = 0; i < strLen; i++) {\n chars[i] = str.charAt(i);\n }\n range.forEach(function (v, i) {\n chars[v] = replacement.charAt(i[0]);\n });\n\n // initialize undefined characters with a space\n if (chars.length > strLen) {\n for (var _i = strLen - 1, _len = chars.length; _i < _len; _i++) {\n if (!chars[_i]) {\n chars[_i] = defaultValue;\n }\n }\n }\n return chars.join('');\n}\n\n/**\n * Retrieve a property from an object\n * @param {Object} object\n * @param {Index} index\n * @return {*} Returns the value of the property\n * @private\n */\nfunction _getObjectProperty(object, index) {\n if (index.size().length !== 1) {\n throw new DimensionError(index.size(), 1);\n }\n var key = index.dimension(0);\n if (typeof key !== 'string') {\n throw new TypeError('String expected as index to retrieve an object property');\n }\n return getSafeProperty(object, key);\n}\n\n/**\n * Set a property on an object\n * @param {Object} object\n * @param {Index} index\n * @param {*} replacement\n * @return {*} Returns the updated object\n * @private\n */\nfunction _setObjectProperty(object, index, replacement) {\n if (index.size().length !== 1) {\n throw new DimensionError(index.size(), 1);\n }\n var key = index.dimension(0);\n if (typeof key !== 'string') {\n throw new TypeError('String expected as index to retrieve an object property');\n }\n\n // clone the object, and apply the property to the clone\n var updated = clone(object);\n setSafeProperty(updated, key, replacement);\n return updated;\n}","import { clone } from '../../utils/object.js';\nimport { format } from '../../utils/string.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'transpose';\nvar dependencies = ['typed', 'matrix'];\nexport var createTranspose = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n matrix\n } = _ref;\n /**\n * Transpose a matrix. All values of the matrix are reflected over its\n * main diagonal. Only applicable to two dimensional matrices containing\n * a vector (i.e. having size `[1,n]` or `[n,1]`). One dimensional\n * vectors and scalars return the input unchanged.\n *\n * Syntax:\n *\n * math.transpose(x)\n *\n * Examples:\n *\n * const A = [[1, 2, 3], [4, 5, 6]]\n * math.transpose(A) // returns [[1, 4], [2, 5], [3, 6]]\n *\n * See also:\n *\n * diag, inv, subset, squeeze\n *\n * @param {Array | Matrix} x Matrix to be transposed\n * @return {Array | Matrix} The transposed matrix\n */\n return typed(name, {\n Array: x => transposeMatrix(matrix(x)).valueOf(),\n Matrix: transposeMatrix,\n any: clone // scalars\n });\n\n function transposeMatrix(x) {\n // matrix size\n var size = x.size();\n\n // result\n var c;\n\n // process dimensions\n switch (size.length) {\n case 1:\n // vector\n c = x.clone();\n break;\n case 2:\n {\n // rows and columns\n var rows = size[0];\n var columns = size[1];\n\n // check columns\n if (columns === 0) {\n // throw exception\n throw new RangeError('Cannot transpose a 2D matrix with no columns (size: ' + format(size) + ')');\n }\n\n // process storage format\n switch (x.storage()) {\n case 'dense':\n c = _denseTranspose(x, rows, columns);\n break;\n case 'sparse':\n c = _sparseTranspose(x, rows, columns);\n break;\n }\n }\n break;\n default:\n // multi dimensional\n throw new RangeError('Matrix must be a vector or two dimensional (size: ' + format(size) + ')');\n }\n return c;\n }\n function _denseTranspose(m, rows, columns) {\n // matrix array\n var data = m._data;\n // transposed matrix data\n var transposed = [];\n var transposedRow;\n // loop columns\n for (var j = 0; j < columns; j++) {\n // initialize row\n transposedRow = transposed[j] = [];\n // loop rows\n for (var i = 0; i < rows; i++) {\n // set data\n transposedRow[i] = clone(data[i][j]);\n }\n }\n // return matrix\n return m.createDenseMatrix({\n data: transposed,\n size: [columns, rows],\n datatype: m._datatype\n });\n }\n function _sparseTranspose(m, rows, columns) {\n // matrix arrays\n var values = m._values;\n var index = m._index;\n var ptr = m._ptr;\n // result matrices\n var cvalues = values ? [] : undefined;\n var cindex = [];\n var cptr = [];\n // row counts\n var w = [];\n for (var x = 0; x < rows; x++) {\n w[x] = 0;\n }\n // vars\n var p, l, j;\n // loop values in matrix\n for (p = 0, l = index.length; p < l; p++) {\n // number of values in row\n w[index[p]]++;\n }\n // cumulative sum\n var sum = 0;\n // initialize cptr with the cummulative sum of row counts\n for (var i = 0; i < rows; i++) {\n // update cptr\n cptr.push(sum);\n // update sum\n sum += w[i];\n // update w\n w[i] = cptr[i];\n }\n // update cptr\n cptr.push(sum);\n // loop columns\n for (j = 0; j < columns; j++) {\n // values & index in column\n for (var k0 = ptr[j], k1 = ptr[j + 1], k = k0; k < k1; k++) {\n // C values & index\n var q = w[index[k]]++;\n // C[j, i] = A[i, j]\n cindex[q] = j;\n // check we need to process values (pattern matrix)\n if (values) {\n cvalues[q] = clone(values[k]);\n }\n }\n }\n // return matrix\n return m.createSparseMatrix({\n values: cvalues,\n index: cindex,\n ptr: cptr,\n size: [columns, rows],\n datatype: m._datatype\n });\n }\n});","import { factory } from '../../utils/factory.js';\nvar name = 'ctranspose';\nvar dependencies = ['typed', 'transpose', 'conj'];\nexport var createCtranspose = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n transpose,\n conj\n } = _ref;\n /**\n * Transpose and complex conjugate a matrix. All values of the matrix are\n * reflected over its main diagonal and then the complex conjugate is\n * taken. This is equivalent to complex conjugation for scalars and\n * vectors.\n *\n * Syntax:\n *\n * math.ctranspose(x)\n *\n * Examples:\n *\n * const A = [[1, 2, 3], [4, 5, math.complex(6,7)]]\n * math.ctranspose(A) // returns [[1, 4], [2, 5], [3, {re:6,im:7}]]\n *\n * See also:\n *\n * transpose, diag, inv, subset, squeeze\n *\n * @param {Array | Matrix} x Matrix to be ctransposed\n * @return {Array | Matrix} The ctransposed matrix\n */\n return typed(name, {\n any: function any(x) {\n return conj(transpose(x));\n }\n });\n});","import { isBigNumber } from '../../utils/is.js';\nimport { isInteger } from '../../utils/number.js';\nimport { resize } from '../../utils/array.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'zeros';\nvar dependencies = ['typed', 'config', 'matrix', 'BigNumber'];\nexport var createZeros = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n config,\n matrix,\n BigNumber\n } = _ref;\n /**\n * Create a matrix filled with zeros. The created matrix can have one or\n * multiple dimensions.\n *\n * Syntax:\n *\n * math.zeros(m)\n * math.zeros(m, format)\n * math.zeros(m, n)\n * math.zeros(m, n, format)\n * math.zeros([m, n])\n * math.zeros([m, n], format)\n *\n * Examples:\n *\n * math.zeros() // returns []\n * math.zeros(3) // returns [0, 0, 0]\n * math.zeros(3, 2) // returns [[0, 0], [0, 0], [0, 0]]\n * math.zeros(3, 'dense') // returns [0, 0, 0]\n *\n * const A = [[1, 2, 3], [4, 5, 6]]\n * math.zeros(math.size(A)) // returns [[0, 0, 0], [0, 0, 0]]\n *\n * See also:\n *\n * ones, identity, size, range\n *\n * @param {...(number|BigNumber) | Array} size The size of each dimension of the matrix\n * @param {string} [format] The Matrix storage format\n *\n * @return {Array | Matrix} A matrix filled with zeros\n */\n return typed(name, {\n '': function _() {\n return config.matrix === 'Array' ? _zeros([]) : _zeros([], 'default');\n },\n // math.zeros(m, n, p, ..., format)\n // TODO: more accurate signature '...number | BigNumber, string' as soon as typed-function supports this\n '...number | BigNumber | string': function numberBigNumberString(size) {\n var last = size[size.length - 1];\n if (typeof last === 'string') {\n var format = size.pop();\n return _zeros(size, format);\n } else if (config.matrix === 'Array') {\n return _zeros(size);\n } else {\n return _zeros(size, 'default');\n }\n },\n Array: _zeros,\n Matrix: function Matrix(size) {\n var format = size.storage();\n return _zeros(size.valueOf(), format);\n },\n 'Array | Matrix, string': function ArrayMatrixString(size, format) {\n return _zeros(size.valueOf(), format);\n }\n });\n\n /**\n * Create an Array or Matrix with zeros\n * @param {Array} size\n * @param {string} [format='default']\n * @return {Array | Matrix}\n * @private\n */\n function _zeros(size, format) {\n var hasBigNumbers = _normalize(size);\n var defaultValue = hasBigNumbers ? new BigNumber(0) : 0;\n _validate(size);\n if (format) {\n // return a matrix\n var m = matrix(format);\n if (size.length > 0) {\n return m.resize(size, defaultValue);\n }\n return m;\n } else {\n // return an Array\n var arr = [];\n if (size.length > 0) {\n return resize(arr, size, defaultValue);\n }\n return arr;\n }\n }\n\n // replace BigNumbers with numbers, returns true if size contained BigNumbers\n function _normalize(size) {\n var hasBigNumbers = false;\n size.forEach(function (value, index, arr) {\n if (isBigNumber(value)) {\n hasBigNumbers = true;\n arr[index] = value.toNumber();\n }\n });\n return hasBigNumbers;\n }\n\n // validate arguments\n function _validate(size) {\n size.forEach(function (value) {\n if (typeof value !== 'number' || !isInteger(value) || value < 0) {\n throw new Error('Parameters in function zeros must be positive integers');\n }\n });\n }\n});\n\n// TODO: zeros contains almost the same code as ones. Reuse this?","import { arraySize } from '../../utils/array.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'fft';\nvar dependencies = ['typed', 'matrix', 'addScalar', 'multiplyScalar', 'divideScalar', 'exp', 'tau', 'i', 'dotDivide', 'conj', 'pow', 'ceil', 'log2'];\nexport var createFft = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n matrix,\n addScalar,\n multiplyScalar,\n divideScalar,\n exp,\n tau,\n i: I,\n dotDivide,\n conj,\n pow,\n ceil,\n log2\n } = _ref;\n /**\n * Calculate N-dimensional fourier transform\n *\n * Syntax:\n *\n * math.fft(arr)\n *\n * Examples:\n *\n * math.fft([[1, 0], [1, 0]]) // returns [[{re:2, im:0}, {re:2, im:0}], [{re:0, im:0}, {re:0, im:0}]]\n *\n *\n * See Also:\n *\n * ifft\n *\n * @param {Array | Matrix} arr An array or matrix\n * @return {Array | Matrix} N-dimensional fourier transformation of the array\n */\n return typed(name, {\n Array: _ndFft,\n Matrix: function Matrix(matrix) {\n return matrix.create(_ndFft(matrix.toArray()));\n }\n });\n\n /**\n * Perform an N-dimensional Fourier transform\n *\n * @param {Array} arr The array\n * @return {Array} resulting array\n */\n function _ndFft(arr) {\n var size = arraySize(arr);\n if (size.length === 1) return _fft(arr, size[0]);\n // ndFft along dimension 1,...,N-1 then 1dFft along dimension 0\n return _1dFft(arr.map(slice => _ndFft(slice, size.slice(1))), 0);\n }\n\n /**\n * Perform an 1-dimensional Fourier transform\n *\n * @param {Array} arr The array\n * @param {number} dim dimension of the array to perform on\n * @return {Array} resulting array\n */\n function _1dFft(arr, dim) {\n var size = arraySize(arr);\n if (dim !== 0) return new Array(size[0]).fill(0).map((_, i) => _1dFft(arr[i], dim - 1));\n if (size.length === 1) return _fft(arr);\n function _transpose(arr) {\n // Swap first 2 dimensions\n var size = arraySize(arr);\n return new Array(size[1]).fill(0).map((_, j) => new Array(size[0]).fill(0).map((_, i) => arr[i][j]));\n }\n return _transpose(_1dFft(_transpose(arr), 1));\n }\n /**\n * Perform an 1-dimensional non-power-of-2 Fourier transform using Chirp-Z Transform\n *\n * @param {Array} arr The array\n * @return {Array} resulting array\n */\n function _czt(arr) {\n var n = arr.length;\n var w = exp(divideScalar(multiplyScalar(-1, multiplyScalar(I, tau)), n));\n var chirp = [];\n for (var i = 1 - n; i < n; i++) {\n chirp.push(pow(w, divideScalar(pow(i, 2), 2)));\n }\n var N2 = pow(2, ceil(log2(n + n - 1)));\n var xp = [...new Array(n).fill(0).map((_, i) => multiplyScalar(arr[i], chirp[n - 1 + i])), ...new Array(N2 - n).fill(0)];\n var ichirp = [...new Array(n + n - 1).fill(0).map((_, i) => divideScalar(1, chirp[i])), ...new Array(N2 - (n + n - 1)).fill(0)];\n var fftXp = _fft(xp);\n var fftIchirp = _fft(ichirp);\n var fftProduct = new Array(N2).fill(0).map((_, i) => multiplyScalar(fftXp[i], fftIchirp[i]));\n var ifftProduct = dotDivide(conj(_ndFft(conj(fftProduct))), N2);\n var ret = [];\n for (var _i = n - 1; _i < n + n - 1; _i++) {\n ret.push(multiplyScalar(ifftProduct[_i], chirp[_i]));\n }\n return ret;\n }\n /**\n * Perform an 1-dimensional Fourier transform\n *\n * @param {Array} arr The array\n * @return {Array} resulting array\n */\n function _fft(arr) {\n var len = arr.length;\n if (len === 1) return [arr[0]];\n if (len % 2 === 0) {\n var ret = [..._fft(arr.filter((_, i) => i % 2 === 0), len / 2), ..._fft(arr.filter((_, i) => i % 2 === 1), len / 2)];\n for (var k = 0; k < len / 2; k++) {\n var p = ret[k];\n var q = multiplyScalar(ret[k + len / 2], exp(multiplyScalar(multiplyScalar(tau, I), divideScalar(-k, len))));\n ret[k] = addScalar(p, q);\n ret[k + len / 2] = addScalar(p, multiplyScalar(-1, q));\n }\n return ret;\n } else {\n // use chirp-z transform for non-power-of-2 FFT\n return _czt(arr);\n }\n // throw new Error('Can only calculate FFT of power-of-two size')\n }\n});","import { arraySize } from '../../utils/array.js';\nimport { factory } from '../../utils/factory.js';\nimport { isMatrix } from '../../utils/is.js';\nvar name = 'ifft';\nvar dependencies = ['typed', 'fft', 'dotDivide', 'conj'];\nexport var createIfft = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n fft,\n dotDivide,\n conj\n } = _ref;\n /**\n * Calculate N-dimensional inverse fourier transform\n *\n * Syntax:\n *\n * math.ifft(arr)\n *\n * Examples:\n *\n * math.ifft([[2, 2], [0, 0]]) // returns [[{re:1, im:0}, {re:0, im:0}], [{re:1, im:0}, {re:0, im:0}]]\n *\n * See Also:\n *\n * fft\n *\n * @param {Array | Matrix} arr An array or matrix\n * @return {Array | Matrix} N-dimensional fourier transformation of the array\n */\n return typed(name, {\n 'Array | Matrix': function ArrayMatrix(arr) {\n var size = isMatrix(arr) ? arr.size() : arraySize(arr);\n return dotDivide(conj(fft(conj(arr))), size.reduce((acc, curr) => acc * curr, 1));\n }\n });\n});","import _defineProperty from \"@babel/runtime/helpers/defineProperty\";\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nimport { isUnit, isNumber, isBigNumber } from '../../utils/is.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'solveODE';\nvar dependencies = ['typed', 'add', 'subtract', 'multiply', 'divide', 'max', 'map', 'abs', 'isPositive', 'isNegative', 'larger', 'smaller', 'matrix', 'bignumber', 'unaryMinus'];\nexport var createSolveODE = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n add,\n subtract,\n multiply,\n divide,\n max,\n map,\n abs,\n isPositive,\n isNegative,\n larger,\n smaller,\n matrix,\n bignumber,\n unaryMinus\n } = _ref;\n /**\n * Numerical Integration of Ordinary Differential Equations\n *\n * Two variable step methods are provided:\n * - \"RK23\": Bogacki–Shampine method\n * - \"RK45\": Dormand-Prince method RK5(4)7M (default)\n *\n * The arguments are expected as follows.\n *\n * - `func` should be the forcing function `f(t, y)`\n * - `tspan` should be a vector of two numbers or units `[tStart, tEnd]`\n * - `y0` the initial state values, should be a scalar or a flat array\n * - `options` should be an object with the following information:\n * - `method` ('RK45'): ['RK23', 'RK45']\n * - `tol` (1e-3): Numeric tolerance of the method, the solver keeps the error estimates less than this value\n * - `firstStep`: Initial step size\n * - `minStep`: minimum step size of the method\n * - `maxStep`: maximum step size of the method\n * - `minDelta` (0.2): minimum ratio of change for the step\n * - `maxDelta` (5): maximum ratio of change for the step\n * - `maxIter` (1e4): maximum number of iterations\n *\n * The returned value is an object with `{t, y}` please note that even though `t` means time, it can represent any other independant variable like `x`:\n * - `t` an array of size `[n]`\n * - `y` the states array can be in two ways\n * - **if `y0` is a scalar:** returns an array-like of size `[n]`\n * - **if `y0` is a flat array-like of size [m]:** returns an array like of size `[n, m]`\n *\n * Syntax:\n *\n * math.solveODE(func, tspan, y0)\n * math.solveODE(func, tspan, y0, options)\n *\n * Examples:\n *\n * function func(t, y) {return y}\n * const tspan = [0, 4]\n * const y0 = 1\n * math.solveODE(func, tspan, y0)\n * math.solveODE(func, tspan, [1, 2])\n * math.solveODE(func, tspan, y0, { method:\"RK23\", maxStep:0.1 })\n *\n * See also:\n *\n * derivative, simplifyCore\n *\n * @param {function} func The forcing function f(t,y)\n * @param {Array | Matrix} tspan The time span\n * @param {number | BigNumber | Unit | Array | Matrix} y0 The initial value\n * @param {Object} [options] Optional configuration options\n * @return {Object} Return an object with t and y values as arrays\n */\n\n function _rk(butcherTableau) {\n // generates an adaptive runge kutta method from it's butcher tableau\n\n return function (f, tspan, y0, options) {\n // adaptive runge kutta methods\n var wrongTSpan = !(tspan.length === 2 && (tspan.every(isNumOrBig) || tspan.every(isUnit)));\n if (wrongTSpan) {\n throw new Error('\"tspan\" must be an Array of two numeric values or two units [tStart, tEnd]');\n }\n var t0 = tspan[0]; // initial time\n var tf = tspan[1]; // final time\n var isForwards = larger(tf, t0);\n var firstStep = options.firstStep;\n if (firstStep !== undefined && !isPositive(firstStep)) {\n throw new Error('\"firstStep\" must be positive');\n }\n var maxStep = options.maxStep;\n if (maxStep !== undefined && !isPositive(maxStep)) {\n throw new Error('\"maxStep\" must be positive');\n }\n var minStep = options.minStep;\n if (minStep && isNegative(minStep)) {\n throw new Error('\"minStep\" must be positive or zero');\n }\n var timeVars = [t0, tf, firstStep, minStep, maxStep].filter(x => x !== undefined);\n if (!(timeVars.every(isNumOrBig) || timeVars.every(isUnit))) {\n throw new Error('Inconsistent type of \"t\" dependant variables');\n }\n var steps = 1; // divide time in this number of steps\n var tol = options.tol ? options.tol : 1e-4; // define a tolerance (must be an option)\n var minDelta = options.minDelta ? options.minDelta : 0.2;\n var maxDelta = options.maxDelta ? options.maxDelta : 5;\n var maxIter = options.maxIter ? options.maxIter : 10000; // stop inifite evaluation if something goes wrong\n var hasBigNumbers = [t0, tf, ...y0, maxStep, minStep].some(isBigNumber);\n var [a, c, b, bp] = hasBigNumbers ? [bignumber(butcherTableau.a), bignumber(butcherTableau.c), bignumber(butcherTableau.b), bignumber(butcherTableau.bp)] : [butcherTableau.a, butcherTableau.c, butcherTableau.b, butcherTableau.bp];\n var h = firstStep ? isForwards ? firstStep : unaryMinus(firstStep) : divide(subtract(tf, t0), steps); // define the first step size\n var t = [t0]; // start the time array\n var y = [y0]; // start the solution array\n\n var deltaB = subtract(b, bp); // b - bp\n\n var n = 0;\n var iter = 0;\n var ongoing = _createOngoing(isForwards);\n var trimStep = _createTrimStep(isForwards);\n // iterate unitil it reaches either the final time or maximum iterations\n while (ongoing(t[n], tf)) {\n var k = [];\n\n // trim the time step so that it doesn't overshoot\n h = trimStep(t[n], tf, h);\n\n // calculate the first value of k\n k.push(f(t[n], y[n]));\n\n // calculate the rest of the values of k\n for (var i = 1; i < c.length; ++i) {\n k.push(f(add(t[n], multiply(c[i], h)), add(y[n], multiply(h, a[i], k))));\n }\n\n // estimate the error by comparing solutions of different orders\n var TE = max(abs(map(multiply(deltaB, k), X => isUnit(X) ? X.value : X)));\n if (TE < tol && tol / TE > 1 / 4) {\n // push solution if within tol\n t.push(add(t[n], h));\n y.push(add(y[n], multiply(h, b, k)));\n n++;\n }\n\n // estimate the delta value that will affect the step size\n var delta = 0.84 * (tol / TE) ** (1 / 5);\n if (smaller(delta, minDelta)) {\n delta = minDelta;\n } else if (larger(delta, maxDelta)) {\n delta = maxDelta;\n }\n delta = hasBigNumbers ? bignumber(delta) : delta;\n h = multiply(h, delta);\n if (maxStep && larger(abs(h), maxStep)) {\n h = isForwards ? maxStep : unaryMinus(maxStep);\n } else if (minStep && smaller(abs(h), minStep)) {\n h = isForwards ? minStep : unaryMinus(minStep);\n }\n iter++;\n if (iter > maxIter) {\n throw new Error('Maximum number of iterations reached, try changing options');\n }\n }\n return {\n t,\n y\n };\n };\n }\n function _rk23(f, tspan, y0, options) {\n // Bogacki–Shampine method\n\n // Define the butcher table\n var a = [[], [1 / 2], [0, 3 / 4], [2 / 9, 1 / 3, 4 / 9]];\n var c = [null, 1 / 2, 3 / 4, 1];\n var b = [2 / 9, 1 / 3, 4 / 9, 0];\n var bp = [7 / 24, 1 / 4, 1 / 3, 1 / 8];\n var butcherTableau = {\n a,\n c,\n b,\n bp\n };\n\n // Solve an adaptive step size rk method\n return _rk(butcherTableau)(f, tspan, y0, options);\n }\n function _rk45(f, tspan, y0, options) {\n // Dormand Prince method\n\n // Define the butcher tableau\n var a = [[], [1 / 5], [3 / 40, 9 / 40], [44 / 45, -56 / 15, 32 / 9], [19372 / 6561, -25360 / 2187, 64448 / 6561, -212 / 729], [9017 / 3168, -355 / 33, 46732 / 5247, 49 / 176, -5103 / 18656], [35 / 384, 0, 500 / 1113, 125 / 192, -2187 / 6784, 11 / 84]];\n var c = [null, 1 / 5, 3 / 10, 4 / 5, 8 / 9, 1, 1];\n var b = [35 / 384, 0, 500 / 1113, 125 / 192, -2187 / 6784, 11 / 84, 0];\n var bp = [5179 / 57600, 0, 7571 / 16695, 393 / 640, -92097 / 339200, 187 / 2100, 1 / 40];\n var butcherTableau = {\n a,\n c,\n b,\n bp\n };\n\n // Solve an adaptive step size rk method\n return _rk(butcherTableau)(f, tspan, y0, options);\n }\n function _solveODE(f, tspan, y0, opt) {\n var method = opt.method ? opt.method : 'RK45';\n var methods = {\n RK23: _rk23,\n RK45: _rk45\n };\n if (method.toUpperCase() in methods) {\n var methodOptions = _objectSpread({}, opt); // clone the options object\n delete methodOptions.method; // delete the method as it won't be needed\n return methods[method.toUpperCase()](f, tspan, y0, methodOptions);\n } else {\n // throw an error indicating there is no such method\n var methodsWithQuotes = Object.keys(methods).map(x => \"\\\"\".concat(x, \"\\\"\"));\n // generates a string of methods like: \"BDF\", \"RK23\" and \"RK45\"\n var availableMethodsString = \"\".concat(methodsWithQuotes.slice(0, -1).join(', '), \" and \").concat(methodsWithQuotes.slice(-1));\n throw new Error(\"Unavailable method \\\"\".concat(method, \"\\\". Available methods are \").concat(availableMethodsString));\n }\n }\n function _createOngoing(isForwards) {\n // returns the correct function to test if it's still iterating\n return isForwards ? smaller : larger;\n }\n function _createTrimStep(isForwards) {\n var outOfBounds = isForwards ? larger : smaller;\n return function (t, tf, h) {\n var next = add(t, h);\n return outOfBounds(next, tf) ? subtract(tf, t) : h;\n };\n }\n function isNumOrBig(x) {\n // checks if it's a number or bignumber\n return isBigNumber(x) || isNumber(x);\n }\n function _matrixSolveODE(f, T, y0, options) {\n // receives matrices and returns matrices\n var sol = _solveODE(f, T.toArray(), y0.toArray(), options);\n return {\n t: matrix(sol.t),\n y: matrix(sol.y)\n };\n }\n return typed('solveODE', {\n 'function, Array, Array, Object': _solveODE,\n 'function, Matrix, Matrix, Object': _matrixSolveODE,\n 'function, Array, Array': (f, T, y0) => _solveODE(f, T, y0, {}),\n 'function, Matrix, Matrix': (f, T, y0) => _matrixSolveODE(f, T, y0, {}),\n 'function, Array, number | BigNumber | Unit': (f, T, y0) => {\n var sol = _solveODE(f, T, [y0], {});\n return {\n t: sol.t,\n y: sol.y.map(Y => Y[0])\n };\n },\n 'function, Matrix, number | BigNumber | Unit': (f, T, y0) => {\n var sol = _solveODE(f, T.toArray(), [y0], {});\n return {\n t: matrix(sol.t),\n y: matrix(sol.y.map(Y => Y[0]))\n };\n },\n 'function, Array, number | BigNumber | Unit, Object': (f, T, y0, options) => {\n var sol = _solveODE(f, T, [y0], options);\n return {\n t: sol.t,\n y: sol.y.map(Y => Y[0])\n };\n },\n 'function, Matrix, number | BigNumber | Unit, Object': (f, T, y0, options) => {\n var sol = _solveODE(f, T.toArray(), [y0], options);\n return {\n t: matrix(sol.t),\n y: matrix(sol.y.map(Y => Y[0]))\n };\n }\n });\n});","/* eslint-disable no-loss-of-precision */\n\nimport { deepMap } from '../../utils/collection.js';\nimport { sign } from '../../utils/number.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'erf';\nvar dependencies = ['typed'];\nexport var createErf = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed\n } = _ref;\n /**\n * Compute the erf function of a value using a rational Chebyshev\n * approximations for different intervals of x.\n *\n * This is a translation of W. J. Cody's Fortran implementation from 1987\n * ( https://www.netlib.org/specfun/erf ). See the AMS publication\n * \"Rational Chebyshev Approximations for the Error Function\" by W. J. Cody\n * for an explanation of this process.\n *\n * For matrices, the function is evaluated element wise.\n *\n * Syntax:\n *\n * math.erf(x)\n *\n * Examples:\n *\n * math.erf(0.2) // returns 0.22270258921047847\n * math.erf(-0.5) // returns -0.5204998778130465\n * math.erf(4) // returns 0.9999999845827421\n *\n * @param {number | Array | Matrix} x A real number\n * @return {number | Array | Matrix} The erf of `x`\n */\n return typed('name', {\n number: function number(x) {\n var y = Math.abs(x);\n if (y >= MAX_NUM) {\n return sign(x);\n }\n if (y <= THRESH) {\n return sign(x) * erf1(y);\n }\n if (y <= 4.0) {\n return sign(x) * (1 - erfc2(y));\n }\n return sign(x) * (1 - erfc3(y));\n },\n 'Array | Matrix': typed.referToSelf(self => n => deepMap(n, self))\n\n // TODO: For complex numbers, use the approximation for the Faddeeva function\n // from \"More Efficient Computation of the Complex Error Function\" (AMS)\n });\n\n /**\n * Approximates the error function erf() for x <= 0.46875 using this function:\n * n\n * erf(x) = x * sum (p_j * x^(2j)) / (q_j * x^(2j))\n * j=0\n */\n function erf1(y) {\n var ysq = y * y;\n var xnum = P[0][4] * ysq;\n var xden = ysq;\n var i;\n for (i = 0; i < 3; i += 1) {\n xnum = (xnum + P[0][i]) * ysq;\n xden = (xden + Q[0][i]) * ysq;\n }\n return y * (xnum + P[0][3]) / (xden + Q[0][3]);\n }\n\n /**\n * Approximates the complement of the error function erfc() for\n * 0.46875 <= x <= 4.0 using this function:\n * n\n * erfc(x) = e^(-x^2) * sum (p_j * x^j) / (q_j * x^j)\n * j=0\n */\n function erfc2(y) {\n var xnum = P[1][8] * y;\n var xden = y;\n var i;\n for (i = 0; i < 7; i += 1) {\n xnum = (xnum + P[1][i]) * y;\n xden = (xden + Q[1][i]) * y;\n }\n var result = (xnum + P[1][7]) / (xden + Q[1][7]);\n var ysq = parseInt(y * 16) / 16;\n var del = (y - ysq) * (y + ysq);\n return Math.exp(-ysq * ysq) * Math.exp(-del) * result;\n }\n\n /**\n * Approximates the complement of the error function erfc() for x > 4.0 using\n * this function:\n *\n * erfc(x) = (e^(-x^2) / x) * [ 1/sqrt(pi) +\n * n\n * 1/(x^2) * sum (p_j * x^(-2j)) / (q_j * x^(-2j)) ]\n * j=0\n */\n function erfc3(y) {\n var ysq = 1 / (y * y);\n var xnum = P[2][5] * ysq;\n var xden = ysq;\n var i;\n for (i = 0; i < 4; i += 1) {\n xnum = (xnum + P[2][i]) * ysq;\n xden = (xden + Q[2][i]) * ysq;\n }\n var result = ysq * (xnum + P[2][4]) / (xden + Q[2][4]);\n result = (SQRPI - result) / y;\n ysq = parseInt(y * 16) / 16;\n var del = (y - ysq) * (y + ysq);\n return Math.exp(-ysq * ysq) * Math.exp(-del) * result;\n }\n});\n\n/**\n * Upper bound for the first approximation interval, 0 <= x <= THRESH\n * @constant\n */\nvar THRESH = 0.46875;\n\n/**\n * Constant used by W. J. Cody's Fortran77 implementation to denote sqrt(pi)\n * @constant\n */\nvar SQRPI = 5.6418958354775628695e-1;\n\n/**\n * Coefficients for each term of the numerator sum (p_j) for each approximation\n * interval (see W. J. Cody's paper for more details)\n * @constant\n */\nvar P = [[3.16112374387056560e00, 1.13864154151050156e02, 3.77485237685302021e02, 3.20937758913846947e03, 1.85777706184603153e-1], [5.64188496988670089e-1, 8.88314979438837594e00, 6.61191906371416295e01, 2.98635138197400131e02, 8.81952221241769090e02, 1.71204761263407058e03, 2.05107837782607147e03, 1.23033935479799725e03, 2.15311535474403846e-8], [3.05326634961232344e-1, 3.60344899949804439e-1, 1.25781726111229246e-1, 1.60837851487422766e-2, 6.58749161529837803e-4, 1.63153871373020978e-2]];\n\n/**\n * Coefficients for each term of the denominator sum (q_j) for each approximation\n * interval (see W. J. Cody's paper for more details)\n * @constant\n */\nvar Q = [[2.36012909523441209e01, 2.44024637934444173e02, 1.28261652607737228e03, 2.84423683343917062e03], [1.57449261107098347e01, 1.17693950891312499e02, 5.37181101862009858e02, 1.62138957456669019e03, 3.29079923573345963e03, 4.36261909014324716e03, 3.43936767414372164e03, 1.23033935480374942e03], [2.56852019228982242e00, 1.87295284992346047e00, 5.27905102951428412e-1, 6.05183413124413191e-2, 2.33520497626869185e-3]];\n\n/**\n * Maximum/minimum safe numbers to input to erf() (in ES6+, this number is\n * Number.[MAX|MIN]_SAFE_INTEGER). erf() for all numbers beyond this limit will\n * return 1\n */\nvar MAX_NUM = Math.pow(2, 53);","import { flatten } from '../../utils/array.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'mode';\nvar dependencies = ['typed', 'isNaN', 'isNumeric'];\nexport var createMode = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n isNaN,\n isNumeric\n } = _ref;\n /**\n * Computes the mode of a set of numbers or a list with values(numbers or characters).\n * If there are multiple modes, it returns a list of those values.\n *\n * Syntax:\n *\n * math.mode(a, b, c, ...)\n * math.mode(A)\n *\n * Examples:\n *\n * math.mode(2, 1, 4, 3, 1) // returns [1]\n * math.mode([1, 2.7, 3.2, 4, 2.7]) // returns [2.7]\n * math.mode(1, 4, 6, 1, 6) // returns [1, 6]\n * math.mode('a','a','b','c') // returns [\"a\"]\n * math.mode(1, 1.5, 'abc') // returns [1, 1.5, \"abc\"]\n *\n * See also:\n *\n * median,\n * mean\n *\n * @param {... *} args A single matrix\n * @return {*} The mode of all values\n */\n return typed(name, {\n 'Array | Matrix': _mode,\n '...': function _(args) {\n return _mode(args);\n }\n });\n\n /**\n * Calculates the mode in an 1-dimensional array\n * @param {Array} values\n * @return {Array} mode\n * @private\n */\n function _mode(values) {\n values = flatten(values.valueOf());\n var num = values.length;\n if (num === 0) {\n throw new Error('Cannot calculate mode of an empty array');\n }\n var count = {};\n var mode = [];\n var max = 0;\n for (var i = 0; i < values.length; i++) {\n var value = values[i];\n if (isNumeric(value) && isNaN(value)) {\n throw new Error('Cannot calculate mode of an array containing NaN values');\n }\n if (!(value in count)) {\n count[value] = 0;\n }\n count[value]++;\n if (count[value] === max) {\n mode.push(value);\n } else if (count[value] > max) {\n max = count[value];\n mode = [value];\n }\n }\n return mode;\n }\n});","import { typeOf } from '../../../utils/is.js';\n\n/**\n * Improve error messages for statistics functions. Errors are typically\n * thrown in an internally used function like larger, causing the error\n * not to mention the function (like max) which is actually used by the user.\n *\n * @param {Error} err\n * @param {String} fnName\n * @param {*} [value]\n * @return {Error}\n */\nexport function improveErrorMessage(err, fnName, value) {\n // TODO: add information with the index (also needs transform in expression parser)\n var details;\n if (String(err).indexOf('Unexpected type') !== -1) {\n details = arguments.length > 2 ? ' (type: ' + typeOf(value) + ', value: ' + JSON.stringify(value) + ')' : ' (type: ' + err.data.actual + ')';\n return new TypeError('Cannot calculate ' + fnName + ', unexpected type of argument' + details);\n }\n if (String(err).indexOf('complex numbers') !== -1) {\n details = arguments.length > 2 ? ' (type: ' + typeOf(value) + ', value: ' + JSON.stringify(value) + ')' : '';\n return new TypeError('Cannot calculate ' + fnName + ', no ordering relation is defined for complex numbers' + details);\n }\n return err;\n}","import { deepForEach } from '../../utils/collection.js';\nimport { factory } from '../../utils/factory.js';\nimport { improveErrorMessage } from './utils/improveErrorMessage.js';\nvar name = 'prod';\nvar dependencies = ['typed', 'config', 'multiplyScalar', 'numeric'];\nexport var createProd = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n config,\n multiplyScalar,\n numeric\n } = _ref;\n /**\n * Compute the product of a matrix or a list with values.\n * In case of a multidimensional array or matrix, the sum of all\n * elements will be calculated.\n *\n * Syntax:\n *\n * math.prod(a, b, c, ...)\n * math.prod(A)\n *\n * Examples:\n *\n * math.multiply(2, 3) // returns 6\n * math.prod(2, 3) // returns 6\n * math.prod(2, 3, 4) // returns 24\n * math.prod([2, 3, 4]) // returns 24\n * math.prod([[2, 5], [4, 3]]) // returns 120\n *\n * See also:\n *\n * mean, median, min, max, sum, std, variance\n *\n * @param {... *} args A single matrix or or multiple scalar values\n * @return {*} The product of all values\n */\n return typed(name, {\n // prod([a, b, c, d, ...])\n 'Array | Matrix': _prod,\n // prod([a, b, c, d, ...], dim)\n 'Array | Matrix, number | BigNumber': function ArrayMatrixNumberBigNumber(array, dim) {\n // TODO: implement prod(A, dim)\n throw new Error('prod(A, dim) is not yet supported');\n // return reduce(arguments[0], arguments[1], math.prod)\n },\n\n // prod(a, b, c, d, ...)\n '...': function _(args) {\n return _prod(args);\n }\n });\n\n /**\n * Recursively calculate the product of an n-dimensional array\n * @param {Array} array\n * @return {number} prod\n * @private\n */\n function _prod(array) {\n var prod;\n deepForEach(array, function (value) {\n try {\n prod = prod === undefined ? value : multiplyScalar(prod, value);\n } catch (err) {\n throw improveErrorMessage(err, 'prod', value);\n }\n });\n\n // make sure returning numeric value: parse a string into a numeric value\n if (typeof prod === 'string') {\n prod = numeric(prod, config.number);\n }\n if (prod === undefined) {\n throw new Error('Cannot calculate prod of an empty array');\n }\n return prod;\n }\n});","import { format as formatString } from '../../utils/string.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'format';\nvar dependencies = ['typed'];\nexport var createFormat = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed\n } = _ref;\n /**\n * Format a value of any type into a string.\n *\n * Syntax:\n *\n * math.format(value)\n * math.format(value, options)\n * math.format(value, precision)\n * math.format(value, callback)\n *\n * Where:\n *\n * - `value: *`\n * The value to be formatted\n * - `options: Object`\n * An object with formatting options. Available options:\n * - `notation: string`\n * Number notation. Choose from:\n * - `'fixed'`\n * Always use regular number notation.\n * For example `'123.40'` and `'14000000'`\n * - `'exponential'`\n * Always use exponential notation.\n * For example `'1.234e+2'` and `'1.4e+7'`\n * - `'engineering'`\n * Always use engineering notation: always have exponential notation,\n * and select the exponent to be a multiple of `3`.\n * For example `'123.4e+0'` and `'14.0e+6'`\n * - `'auto'` (default)\n * Regular number notation for numbers having an absolute value between\n * `lower` and `upper` bounds, and uses exponential notation elsewhere.\n * Lower bound is included, upper bound is excluded.\n * For example `'123.4'` and `'1.4e7'`.\n * - `'bin'`, `'oct'`, or `'hex'`\n * Format the number using binary, octal, or hexadecimal notation.\n * For example `'0b1101'` and `'0x10fe'`.\n * - `wordSize: number`\n * The word size in bits to use for formatting in binary, octal, or\n * hexadecimal notation. To be used only with `'bin'`, `'oct'`, or `'hex'`\n * values for `notation` option. When this option is defined the value\n * is formatted as a signed twos complement integer of the given word\n * size and the size suffix is appended to the output.\n * For example `format(-1, {notation: 'hex', wordSize: 8}) === '0xffi8'`.\n * Default value is undefined.\n * - `precision: number`\n * Limit the number of digits of the formatted value.\n * For regular numbers, must be a number between `0` and `16`.\n * For bignumbers, the maximum depends on the configured precision,\n * see function `config()`.\n * In case of notations `'exponential'`, `'engineering'`, and `'auto'`,\n * `precision` defines the total number of significant digits returned.\n * In case of notation `'fixed'`, `precision` defines the number of\n * significant digits after the decimal point.\n * `precision` is undefined by default.\n * - `lowerExp: number`\n * Exponent determining the lower boundary for formatting a value with\n * an exponent when `notation='auto'`. Default value is `-3`.\n * - `upperExp: number`\n * Exponent determining the upper boundary for formatting a value with\n * an exponent when `notation='auto'`. Default value is `5`.\n * - `fraction: string`. Available values: `'ratio'` (default) or `'decimal'`.\n * For example `format(fraction(1, 3))` will output `'1/3'` when `'ratio'`\n * is configured, and will output `'0.(3)'` when `'decimal'` is configured.\n * - `truncate: number`. Specifies the maximum allowed length of the\n * returned string. If it had been longer, the excess characters\n * are deleted and replaced with `'...'`.\n * - `callback: function`\n * A custom formatting function, invoked for all numeric elements in `value`,\n * for example all elements of a matrix, or the real and imaginary\n * parts of a complex number. This callback can be used to override the\n * built-in numeric notation with any type of formatting. Function `callback`\n * is called with `value` as parameter and must return a string.\n *\n * When `value` is an Object:\n *\n * - When the object contains a property `format` being a function, this function\n * is invoked as `value.format(options)` and the result is returned.\n * - When the object has its own `toString` method, this method is invoked\n * and the result is returned.\n * - In other cases the function will loop over all object properties and\n * return JSON object notation like '{\"a\": 2, \"b\": 3}'.\n *\n * When value is a function:\n *\n * - When the function has a property `syntax`, it returns this\n * syntax description.\n * - In other cases, a string `'function'` is returned.\n *\n * Examples:\n *\n * math.format(6.4) // returns '6.4'\n * math.format(1240000) // returns '1.24e+6'\n * math.format(1/3) // returns '0.3333333333333333'\n * math.format(1/3, 3) // returns '0.333'\n * math.format(21385, 2) // returns '21000'\n * math.format(12e8, {notation: 'fixed'}) // returns '1200000000'\n * math.format(2.3, {notation: 'fixed', precision: 4}) // returns '2.3000'\n * math.format(52.8, {notation: 'exponential'}) // returns '5.28e+1'\n * math.format(12400, {notation: 'engineering'}) // returns '12.4e+3'\n * math.format(2000, {lowerExp: -2, upperExp: 2}) // returns '2e+3'\n *\n * function formatCurrency(value) {\n * // return currency notation with two digits:\n * return '$' + value.toFixed(2)\n *\n * // you could also use math.format inside the callback:\n * // return '$' + math.format(value, {notation: 'fixed', precision: 2})\n * }\n * math.format([2.1, 3, 0.016], formatCurrency) // returns '[$2.10, $3.00, $0.02]'\n *\n * See also:\n *\n * print\n *\n * @param {*} value Value to be stringified\n * @param {Object | Function | number} [options] Formatting options\n * @return {string} The formatted value\n */\n return typed(name, {\n any: formatString,\n 'any, Object | function | number': formatString\n });\n});","import { factory } from '../../utils/factory.js';\nvar name = 'bin';\nvar dependencies = ['typed', 'format'];\n\n/**\n * Format a number as binary.\n *\n * Syntax:\n *\n * math.bin(value)\n *\n * Examples:\n *\n * //the following outputs \"0b10\"\n * math.bin(2)\n *\n * See also:\n *\n * oct\n * hex\n *\n * @param {number} value Value to be stringified\n * @param {number} wordSize Optional word size (see `format`)\n * @return {string} The formatted value\n */\nexport var createBin = factory(name, dependencies, _ref => {\n var {\n typed,\n format\n } = _ref;\n return typed(name, {\n 'number | BigNumber': function numberBigNumber(n) {\n return format(n, {\n notation: 'bin'\n });\n },\n 'number | BigNumber, number': function numberBigNumberNumber(n, wordSize) {\n return format(n, {\n notation: 'bin',\n wordSize\n });\n }\n });\n});","import { factory } from '../../utils/factory.js';\nvar name = 'oct';\nvar dependencies = ['typed', 'format'];\n\n/**\n * Format a number as octal.\n *\n * Syntax:\n *\n * math.oct(value)\n *\n * Examples:\n *\n * //the following outputs \"0o70\"\n * math.oct(56)\n *\n * See also:\n *\n * bin\n * hex\n *\n * @param {number} value Value to be stringified\n * @param {number} wordSize Optional word size (see `format`)\n * @return {string} The formatted value\n */\n\nexport var createOct = factory(name, dependencies, _ref => {\n var {\n typed,\n format\n } = _ref;\n return typed(name, {\n 'number | BigNumber': function numberBigNumber(n) {\n return format(n, {\n notation: 'oct'\n });\n },\n 'number | BigNumber, number': function numberBigNumberNumber(n, wordSize) {\n return format(n, {\n notation: 'oct',\n wordSize\n });\n }\n });\n});","import { factory } from '../../utils/factory.js';\nvar name = 'hex';\nvar dependencies = ['typed', 'format'];\n\n/**\n * Format a number as hexadecimal.\n *\n * Syntax:\n *\n * math.hex(value)\n *\n * Examples:\n *\n * math.hex(240) // returns \"0xF0\"\n *\n * See also:\n *\n * oct\n * bin\n *\n * @param {number} value Value to be stringified\n * @param {number} wordSize Optional word size (see `format`)\n * @return {string} The formatted value\n */\nexport var createHex = factory(name, dependencies, _ref => {\n var {\n typed,\n format\n } = _ref;\n return typed(name, {\n 'number | BigNumber': function numberBigNumber(n) {\n return format(n, {\n notation: 'hex'\n });\n },\n 'number | BigNumber, number': function numberBigNumberNumber(n, wordSize) {\n return format(n, {\n notation: 'hex',\n wordSize\n });\n }\n });\n});","import { format } from '../../utils/string.js';\nimport { isString } from '../../utils/is.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'print';\nvar dependencies = ['typed'];\nexport var createPrint = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed\n } = _ref;\n /**\n * Interpolate values into a string template.\n *\n * Syntax:\n *\n * math.print(template, values)\n * math.print(template, values, precision)\n * math.print(template, values, options)\n *\n * Example usage:\n *\n * // the following outputs: 'Lucy is 5 years old'\n * math.print('Lucy is $age years old', {age: 5})\n *\n * // the following outputs: 'The value of pi is 3.141592654'\n * math.print('The value of pi is $pi', {pi: math.pi}, 10)\n *\n * // the following outputs: 'hello Mary! The date is 2013-03-23'\n * math.print('Hello $user.name! The date is $date', {\n * user: {\n * name: 'Mary',\n * },\n * date: new Date(2013, 2, 23).toISOString().substring(0, 10)\n * })\n *\n * // the following outputs: 'My favorite fruits are apples and bananas !'\n * math.print('My favorite fruits are $0 and $1 !', [\n * 'apples',\n * 'bananas'\n * ])\n *\n * See also:\n *\n * format\n *\n * @param {string} template A string containing variable placeholders.\n * @param {Object | Array | Matrix} values An object or array containing variables\n * which will be filled in in the template.\n * @param {number | Object} [options] Formatting options,\n * or the number of digits to format numbers.\n * See function math.format for a description\n * of all options.\n * @return {string} Interpolated string\n */\n return typed(name, {\n // note: Matrix will be converted automatically to an Array\n 'string, Object | Array': _print,\n 'string, Object | Array, number | Object': _print\n });\n});\n\n/**\n * Interpolate values into a string template.\n * @param {string} template\n * @param {Object} values\n * @param {number | Object} [options]\n * @returns {string} Interpolated string\n * @private\n */\nfunction _print(template, values, options) {\n return template.replace(/\\$([\\w.]+)/g, function (original, key) {\n var keys = key.split('.');\n var value = values[keys.shift()];\n while (keys.length && value !== undefined) {\n var k = keys.shift();\n value = k ? value[k] : value + '.';\n }\n if (value !== undefined) {\n if (!isString(value)) {\n return format(value, options);\n } else {\n return value;\n }\n }\n return original;\n });\n}","import { factory } from '../../utils/factory.js';\nimport { createMatrixAlgorithmSuite } from '../../type/matrix/utils/matrixAlgorithmSuite.js';\nvar name = 'to';\nvar dependencies = ['typed', 'matrix', 'concat'];\nexport var createTo = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n matrix,\n concat\n } = _ref;\n var matrixAlgorithmSuite = createMatrixAlgorithmSuite({\n typed,\n matrix,\n concat\n });\n\n /**\n * Change the unit of a value.\n *\n * For matrices, the function is evaluated element wise.\n *\n * Syntax:\n *\n * math.to(x, unit)\n *\n * Examples:\n *\n * math.to(math.unit('2 inch'), 'cm') // returns Unit 5.08 cm\n * math.to(math.unit('2 inch'), math.unit('cm')) // returns Unit 5.08 cm\n * math.to(math.unit(16, 'bytes'), 'bits') // returns Unit 128 bits\n *\n * See also:\n *\n * unit\n *\n * @param {Unit | Array | Matrix} x The unit to be converted.\n * @param {Unit | Array | Matrix} unit New unit. Can be a string like \"cm\"\n * or a unit without value.\n * @return {Unit | Array | Matrix} value with changed, fixed unit.\n */\n return typed(name, {\n 'Unit, Unit | string': (x, unit) => x.to(unit)\n }, matrixAlgorithmSuite({\n Ds: true\n }));\n});","import { deepMap } from '../../utils/collection.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'isPrime';\nvar dependencies = ['typed'];\nexport var createIsPrime = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed\n } = _ref;\n /**\n * Test whether a value is prime: has no divisors other than itself and one.\n * The function supports type `number`, `bignumber`.\n *\n * The function is evaluated element-wise in case of Array or Matrix input.\n *\n * Syntax:\n *\n * math.isPrime(x)\n *\n * Examples:\n *\n * math.isPrime(3) // returns true\n * math.isPrime(-2) // returns false\n * math.isPrime(0) // returns false\n * math.isPrime(-0) // returns false\n * math.isPrime(0.5) // returns false\n * math.isPrime('2') // returns true\n * math.isPrime([2, 17, 100]) // returns [true, true, false]\n *\n * See also:\n *\n * isNumeric, isZero, isNegative, isInteger\n *\n * @param {number | BigNumber | Array | Matrix} x Value to be tested\n * @return {boolean} Returns true when `x` is larger than zero.\n * Throws an error in case of an unknown data type.\n */\n return typed(name, {\n number: function number(x) {\n if (x * 0 !== 0) {\n return false;\n }\n if (x <= 3) {\n return x > 1;\n }\n if (x % 2 === 0 || x % 3 === 0) {\n return false;\n }\n for (var i = 5; i * i <= x; i += 6) {\n if (x % i === 0 || x % (i + 2) === 0) {\n return false;\n }\n }\n return true;\n },\n BigNumber: function BigNumber(n) {\n if (n.toNumber() * 0 !== 0) {\n return false;\n }\n if (n.lte(3)) return n.gt(1);\n if (n.mod(2).eq(0) || n.mod(3).eq(0)) return false;\n if (n.lt(Math.pow(2, 32))) {\n var x = n.toNumber();\n for (var i = 5; i * i <= x; i += 6) {\n if (x % i === 0 || x % (i + 2) === 0) {\n return false;\n }\n }\n return true;\n }\n function modPow(base, exponent, modulus) {\n // exponent can be huge, use non-recursive variant\n var accumulator = 1;\n while (!exponent.eq(0)) {\n if (exponent.mod(2).eq(0)) {\n exponent = exponent.div(2);\n base = base.mul(base).mod(modulus);\n } else {\n exponent = exponent.sub(1);\n accumulator = base.mul(accumulator).mod(modulus);\n }\n }\n return accumulator;\n }\n\n // https://en.wikipedia.org/wiki/Miller%E2%80%93Rabin_primality_test#Deterministic_variants\n var Decimal = n.constructor.clone({\n precision: n.toFixed(0).length * 2\n });\n n = new Decimal(n);\n var r = 0;\n var d = n.sub(1);\n while (d.mod(2).eq(0)) {\n d = d.div(2);\n r += 1;\n }\n var bases = null;\n // https://en.wikipedia.org/wiki/Miller–Rabin_primality_test#Testing_against_small_sets_of_bases\n if (n.lt('3317044064679887385961981')) {\n bases = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41].filter(x => x < n);\n } else {\n var max = Math.min(n.toNumber() - 2, Math.floor(2 * Math.pow(n.toFixed(0).length * Math.log(10), 2)));\n bases = [];\n for (var _i = 2; _i <= max; _i += 1) {\n bases.push(max);\n }\n }\n for (var _i2 = 0; _i2 < bases.length; _i2 += 1) {\n var a = bases[_i2];\n var adn = modPow(n.sub(n).add(a), d, n);\n if (!adn.eq(1)) {\n for (var _i3 = 0, _x = adn; !_x.eq(n.sub(1)); _i3 += 1, _x = _x.mul(_x).mod(n)) {\n if (_i3 === r - 1) {\n return false;\n }\n }\n }\n }\n return true;\n },\n 'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self))\n });\n});","import { typeOf } from '../../utils/is.js';\nimport { factory } from '../../utils/factory.js';\nimport { noBignumber, noFraction } from '../../utils/noop.js';\nvar name = 'numeric';\nvar dependencies = ['number', '?bignumber', '?fraction'];\nexport var createNumeric = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n number: _number,\n bignumber,\n fraction\n } = _ref;\n var validInputTypes = {\n string: true,\n number: true,\n BigNumber: true,\n Fraction: true\n };\n\n // Load the conversion functions for each output type\n var validOutputTypes = {\n number: x => _number(x),\n BigNumber: bignumber ? x => bignumber(x) : noBignumber,\n Fraction: fraction ? x => fraction(x) : noFraction\n };\n\n /**\n * Convert a numeric input to a specific numeric type: number, BigNumber, or Fraction.\n *\n * Syntax:\n *\n * math.numeric(x)\n *\n * Examples:\n *\n * math.numeric('4') // returns 4\n * math.numeric('4', 'number') // returns 4\n * math.numeric('4', 'BigNumber') // returns BigNumber 4\n * math.numeric('4', 'Fraction') // returns Fraction 4\n * math.numeric(4, 'Fraction') // returns Fraction 4\n * math.numeric(math.fraction(2, 5), 'number') // returns 0.4\n *\n * See also:\n *\n * number, fraction, bignumber, string, format\n *\n * @param {string | number | BigNumber | Fraction } value\n * A numeric value or a string containing a numeric value\n * @param {string} outputType\n * Desired numeric output type.\n * Available values: 'number', 'BigNumber', or 'Fraction'\n * @return {number | BigNumber | Fraction}\n * Returns an instance of the numeric in the requested type\n */\n return function numeric(value) {\n var outputType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'number';\n var check = arguments.length > 2 ? arguments[2] : undefined;\n if (check !== undefined) {\n throw new SyntaxError('numeric() takes one or two arguments');\n }\n var inputType = typeOf(value);\n if (!(inputType in validInputTypes)) {\n throw new TypeError('Cannot convert ' + value + ' of type \"' + inputType + '\"; valid input types are ' + Object.keys(validInputTypes).join(', '));\n }\n if (!(outputType in validOutputTypes)) {\n throw new TypeError('Cannot convert ' + value + ' to type \"' + outputType + '\"; valid output types are ' + Object.keys(validOutputTypes).join(', '));\n }\n if (outputType === inputType) {\n return value;\n } else {\n return validOutputTypes[outputType](value);\n }\n };\n});","import { factory } from '../../utils/factory.js';\nvar name = 'divideScalar';\nvar dependencies = ['typed', 'numeric'];\nexport var createDivideScalar = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n numeric\n } = _ref;\n /**\n * Divide two scalar values, `x / y`.\n * This function is meant for internal use: it is used by the public functions\n * `divide` and `inv`.\n *\n * This function does not support collections (Array or Matrix).\n *\n * @param {number | BigNumber | Fraction | Complex | Unit} x Numerator\n * @param {number | BigNumber | Fraction | Complex} y Denominator\n * @return {number | BigNumber | Fraction | Complex | Unit} Quotient, `x / y`\n * @private\n */\n return typed(name, {\n 'number, number': function numberNumber(x, y) {\n return x / y;\n },\n 'Complex, Complex': function ComplexComplex(x, y) {\n return x.div(y);\n },\n 'BigNumber, BigNumber': function BigNumberBigNumber(x, y) {\n return x.div(y);\n },\n 'Fraction, Fraction': function FractionFraction(x, y) {\n return x.div(y);\n },\n 'Unit, number | Complex | Fraction | BigNumber | Unit': (x, y) => x.divide(y),\n 'number | Fraction | Complex | BigNumber, Unit': (x, y) => y.divideInto(x)\n });\n});","import { factory } from '../../utils/factory.js';\nimport { isInteger } from '../../utils/number.js';\nimport { arraySize as size } from '../../utils/array.js';\nimport { powNumber } from '../../plain/number/index.js';\nvar name = 'pow';\nvar dependencies = ['typed', 'config', 'identity', 'multiply', 'matrix', 'inv', 'fraction', 'number', 'Complex'];\nexport var createPow = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n config,\n identity,\n multiply,\n matrix,\n inv,\n number,\n fraction,\n Complex\n } = _ref;\n /**\n * Calculates the power of x to y, `x ^ y`.\n *\n * Matrix exponentiation is supported for square matrices `x` and integers `y`:\n * when `y` is nonnegative, `x` may be any square matrix; and when `y` is\n * negative, `x` must be invertible, and then this function returns\n * inv(x)^(-y).\n *\n * For cubic roots of negative numbers, the function returns the principal\n * root by default. In order to let the function return the real root,\n * math.js can be configured with `math.config({predictable: true})`.\n * To retrieve all cubic roots of a value, use `math.cbrt(x, true)`.\n *\n * Syntax:\n *\n * math.pow(x, y)\n *\n * Examples:\n *\n * math.pow(2, 3) // returns number 8\n *\n * const a = math.complex(2, 3)\n * math.pow(a, 2) // returns Complex -5 + 12i\n *\n * const b = [[1, 2], [4, 3]]\n * math.pow(b, 2) // returns Array [[9, 8], [16, 17]]\n *\n * const c = [[1, 2], [4, 3]]\n * math.pow(c, -1) // returns Array [[-0.6, 0.4], [0.8, -0.2]]\n *\n * See also:\n *\n * multiply, sqrt, cbrt, nthRoot\n *\n * @param {number | BigNumber | Complex | Unit | Array | Matrix} x The base\n * @param {number | BigNumber | Complex} y The exponent\n * @return {number | BigNumber | Complex | Array | Matrix} The value of `x` to the power `y`\n */\n return typed(name, {\n 'number, number': _pow,\n 'Complex, Complex': function ComplexComplex(x, y) {\n return x.pow(y);\n },\n 'BigNumber, BigNumber': function BigNumberBigNumber(x, y) {\n if (y.isInteger() || x >= 0 || config.predictable) {\n return x.pow(y);\n } else {\n return new Complex(x.toNumber(), 0).pow(y.toNumber(), 0);\n }\n },\n 'Fraction, Fraction': function FractionFraction(x, y) {\n var result = x.pow(y);\n if (result != null) {\n return result;\n }\n if (config.predictable) {\n throw new Error('Result of pow is non-rational and cannot be expressed as a fraction');\n } else {\n return _pow(x.valueOf(), y.valueOf());\n }\n },\n 'Array, number': _powArray,\n 'Array, BigNumber': function ArrayBigNumber(x, y) {\n return _powArray(x, y.toNumber());\n },\n 'Matrix, number': _powMatrix,\n 'Matrix, BigNumber': function MatrixBigNumber(x, y) {\n return _powMatrix(x, y.toNumber());\n },\n 'Unit, number | BigNumber': function UnitNumberBigNumber(x, y) {\n return x.pow(y);\n }\n });\n\n /**\n * Calculates the power of x to y, x^y, for two numbers.\n * @param {number} x\n * @param {number} y\n * @return {number | Complex} res\n * @private\n */\n function _pow(x, y) {\n // Alternatively could define a 'realmode' config option or something, but\n // 'predictable' will work for now\n if (config.predictable && !isInteger(y) && x < 0) {\n // Check to see if y can be represented as a fraction\n try {\n var yFrac = fraction(y);\n var yNum = number(yFrac);\n if (y === yNum || Math.abs((y - yNum) / y) < 1e-14) {\n if (yFrac.d % 2 === 1) {\n return (yFrac.n % 2 === 0 ? 1 : -1) * Math.pow(-x, y);\n }\n }\n } catch (ex) {\n // fraction() throws an error if y is Infinity, etc.\n }\n\n // Unable to express y as a fraction, so continue on\n }\n\n // **for predictable mode** x^Infinity === NaN if x < -1\n // N.B. this behavour is different from `Math.pow` which gives\n // (-2)^Infinity === Infinity\n if (config.predictable && (x < -1 && y === Infinity || x > -1 && x < 0 && y === -Infinity)) {\n return NaN;\n }\n if (isInteger(y) || x >= 0 || config.predictable) {\n return powNumber(x, y);\n } else {\n // TODO: the following infinity checks are duplicated from powNumber. Deduplicate this somehow\n\n // x^Infinity === 0 if -1 < x < 1\n // A real number 0 is returned instead of complex(0)\n if (x * x < 1 && y === Infinity || x * x > 1 && y === -Infinity) {\n return 0;\n }\n return new Complex(x, 0).pow(y, 0);\n }\n }\n\n /**\n * Calculate the power of a 2d array\n * @param {Array} x must be a 2 dimensional, square matrix\n * @param {number} y a integer value (positive if `x` is not invertible)\n * @returns {Array}\n * @private\n */\n function _powArray(x, y) {\n if (!isInteger(y)) {\n throw new TypeError('For A^b, b must be an integer (value is ' + y + ')');\n }\n // verify that A is a 2 dimensional square matrix\n var s = size(x);\n if (s.length !== 2) {\n throw new Error('For A^b, A must be 2 dimensional (A has ' + s.length + ' dimensions)');\n }\n if (s[0] !== s[1]) {\n throw new Error('For A^b, A must be square (size is ' + s[0] + 'x' + s[1] + ')');\n }\n if (y < 0) {\n try {\n return _powArray(inv(x), -y);\n } catch (error) {\n if (error.message === 'Cannot calculate inverse, determinant is zero') {\n throw new TypeError('For A^b, when A is not invertible, b must be a positive integer (value is ' + y + ')');\n }\n throw error;\n }\n }\n var res = identity(s[0]).valueOf();\n var px = x;\n while (y >= 1) {\n if ((y & 1) === 1) {\n res = multiply(px, res);\n }\n y >>= 1;\n px = multiply(px, px);\n }\n return res;\n }\n\n /**\n * Calculate the power of a 2d matrix\n * @param {Matrix} x must be a 2 dimensional, square matrix\n * @param {number} y a positive, integer value\n * @returns {Matrix}\n * @private\n */\n function _powMatrix(x, y) {\n return matrix(_powArray(x.valueOf(), y));\n }\n});","import { factory } from '../../utils/factory.js';\nimport { deepMap } from '../../utils/collection.js';\nimport { createMatAlgo11xS0s } from '../../type/matrix/utils/matAlgo11xS0s.js';\nimport { createMatAlgo12xSfs } from '../../type/matrix/utils/matAlgo12xSfs.js';\nimport { createMatAlgo14xDs } from '../../type/matrix/utils/matAlgo14xDs.js';\nimport { roundNumber } from '../../plain/number/index.js';\nvar NO_INT = 'Number of decimals in function round must be an integer';\nvar name = 'round';\nvar dependencies = ['typed', 'matrix', 'equalScalar', 'zeros', 'BigNumber', 'DenseMatrix'];\nexport var createRound = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n matrix,\n equalScalar,\n zeros,\n BigNumber,\n DenseMatrix\n } = _ref;\n var matAlgo11xS0s = createMatAlgo11xS0s({\n typed,\n equalScalar\n });\n var matAlgo12xSfs = createMatAlgo12xSfs({\n typed,\n DenseMatrix\n });\n var matAlgo14xDs = createMatAlgo14xDs({\n typed\n });\n\n /**\n * Round a value towards the nearest rounded value.\n * For matrices, the function is evaluated element wise.\n *\n * Syntax:\n *\n * math.round(x)\n * math.round(x, n)\n *\n * Examples:\n *\n * math.round(3.22) // returns number 3\n * math.round(3.82) // returns number 4\n * math.round(-4.2) // returns number -4\n * math.round(-4.7) // returns number -5\n * math.round(3.22, 1) // returns number 3.2\n * math.round(3.88, 1) // returns number 3.9\n * math.round(-4.21, 1) // returns number -4.2\n * math.round(-4.71, 1) // returns number -4.7\n * math.round(math.pi, 3) // returns number 3.142\n * math.round(123.45678, 2) // returns number 123.46\n *\n * const c = math.complex(3.2, -2.7)\n * math.round(c) // returns Complex 3 - 3i\n *\n * math.round([3.2, 3.8, -4.7]) // returns Array [3, 4, -5]\n *\n * See also:\n *\n * ceil, fix, floor\n *\n * @param {number | BigNumber | Fraction | Complex | Array | Matrix} x Number to be rounded\n * @param {number | BigNumber | Array} [n=0] Number of decimals\n * @return {number | BigNumber | Fraction | Complex | Array | Matrix} Rounded value\n */\n return typed(name, {\n number: roundNumber,\n 'number, number': roundNumber,\n 'number, BigNumber': function numberBigNumber(x, n) {\n if (!n.isInteger()) {\n throw new TypeError(NO_INT);\n }\n return new BigNumber(x).toDecimalPlaces(n.toNumber());\n },\n Complex: function Complex(x) {\n return x.round();\n },\n 'Complex, number': function ComplexNumber(x, n) {\n if (n % 1) {\n throw new TypeError(NO_INT);\n }\n return x.round(n);\n },\n 'Complex, BigNumber': function ComplexBigNumber(x, n) {\n if (!n.isInteger()) {\n throw new TypeError(NO_INT);\n }\n var _n = n.toNumber();\n return x.round(_n);\n },\n BigNumber: function BigNumber(x) {\n return x.toDecimalPlaces(0);\n },\n 'BigNumber, BigNumber': function BigNumberBigNumber(x, n) {\n if (!n.isInteger()) {\n throw new TypeError(NO_INT);\n }\n return x.toDecimalPlaces(n.toNumber());\n },\n Fraction: function Fraction(x) {\n return x.round();\n },\n 'Fraction, number': function FractionNumber(x, n) {\n if (n % 1) {\n throw new TypeError(NO_INT);\n }\n return x.round(n);\n },\n 'Fraction, BigNumber': function FractionBigNumber(x, n) {\n if (!n.isInteger()) {\n throw new TypeError(NO_INT);\n }\n return x.round(n.toNumber());\n },\n // deep map collection, skip zeros since round(0) = 0\n 'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self, true)),\n 'SparseMatrix, number | BigNumber': typed.referToSelf(self => (x, y) => {\n return matAlgo11xS0s(x, y, self, false);\n }),\n 'DenseMatrix, number | BigNumber': typed.referToSelf(self => (x, y) => {\n return matAlgo14xDs(x, y, self, false);\n }),\n 'Array, number | BigNumber': typed.referToSelf(self => (x, y) => {\n // use matrix implementation\n return matAlgo14xDs(matrix(x), y, self, false).valueOf();\n }),\n 'number | Complex | BigNumber | Fraction, SparseMatrix': typed.referToSelf(self => (x, y) => {\n // check scalar is zero\n if (equalScalar(x, 0)) {\n // do not execute algorithm, result will be a zero matrix\n return zeros(y.size(), y.storage());\n }\n return matAlgo12xSfs(y, x, self, true);\n }),\n 'number | Complex | BigNumber | Fraction, DenseMatrix': typed.referToSelf(self => (x, y) => {\n // check scalar is zero\n if (equalScalar(x, 0)) {\n // do not execute algorithm, result will be a zero matrix\n return zeros(y.size(), y.storage());\n }\n return matAlgo14xDs(y, x, self, true);\n }),\n 'number | Complex | BigNumber | Fraction, Array': typed.referToSelf(self => (x, y) => {\n // use matrix implementation\n return matAlgo14xDs(matrix(y), x, self, true).valueOf();\n })\n });\n});","import { factory } from '../../utils/factory.js';\nimport { logNumber } from '../../plain/number/index.js';\nvar name = 'log';\nvar dependencies = ['config', 'typed', 'divideScalar', 'Complex'];\nexport var createLog = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n config,\n divideScalar,\n Complex\n } = _ref;\n /**\n * Calculate the logarithm of a value.\n *\n * To avoid confusion with the matrix logarithm, this function does not\n * apply to matrices.\n *\n * Syntax:\n *\n * math.log(x)\n * math.log(x, base)\n *\n * Examples:\n *\n * math.log(3.5) // returns 1.252762968495368\n * math.exp(math.log(2.4)) // returns 2.4\n *\n * math.pow(10, 4) // returns 10000\n * math.log(10000, 10) // returns 4\n * math.log(10000) / math.log(10) // returns 4\n *\n * math.log(1024, 2) // returns 10\n * math.pow(2, 10) // returns 1024\n *\n * See also:\n *\n * exp, log2, log10, log1p\n *\n * @param {number | BigNumber | Complex} x\n * Value for which to calculate the logarithm.\n * @param {number | BigNumber | Complex} [base=e]\n * Optional base for the logarithm. If not provided, the natural\n * logarithm of `x` is calculated.\n * @return {number | BigNumber | Complex}\n * Returns the logarithm of `x`\n */\n return typed(name, {\n number: function number(x) {\n if (x >= 0 || config.predictable) {\n return logNumber(x);\n } else {\n // negative value -> complex value computation\n return new Complex(x, 0).log();\n }\n },\n Complex: function Complex(x) {\n return x.log();\n },\n BigNumber: function BigNumber(x) {\n if (!x.isNegative() || config.predictable) {\n return x.ln();\n } else {\n // downgrade to number, return Complex valued result\n return new Complex(x.toNumber(), 0).log();\n }\n },\n 'any, any': typed.referToSelf(self => (x, base) => {\n // calculate logarithm for a specified base, log(x, base)\n return divideScalar(self(x), self(base));\n })\n });\n});","import { factory } from '../../utils/factory.js';\nimport { deepMap } from '../../utils/collection.js';\nimport { log1p as _log1p } from '../../utils/number.js';\nvar name = 'log1p';\nvar dependencies = ['typed', 'config', 'divideScalar', 'log', 'Complex'];\nexport var createLog1p = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n config,\n divideScalar,\n log,\n Complex\n } = _ref;\n /**\n * Calculate the logarithm of a `value+1`.\n *\n * For matrices, the function is evaluated element wise.\n *\n * Syntax:\n *\n * math.log1p(x)\n * math.log1p(x, base)\n *\n * Examples:\n *\n * math.log1p(2.5) // returns 1.252762968495368\n * math.exp(math.log1p(1.4)) // returns 2.4\n *\n * math.pow(10, 4) // returns 10000\n * math.log1p(9999, 10) // returns 4\n * math.log1p(9999) / math.log(10) // returns 4\n *\n * See also:\n *\n * exp, log, log2, log10\n *\n * @param {number | BigNumber | Complex | Array | Matrix} x\n * Value for which to calculate the logarithm of `x+1`.\n * @param {number | BigNumber | Complex} [base=e]\n * Optional base for the logarithm. If not provided, the natural\n * logarithm of `x+1` is calculated.\n * @return {number | BigNumber | Complex | Array | Matrix}\n * Returns the logarithm of `x+1`\n */\n return typed(name, {\n number: function number(x) {\n if (x >= -1 || config.predictable) {\n return _log1p(x);\n } else {\n // negative value -> complex value computation\n return _log1pComplex(new Complex(x, 0));\n }\n },\n Complex: _log1pComplex,\n BigNumber: function BigNumber(x) {\n var y = x.plus(1);\n if (!y.isNegative() || config.predictable) {\n return y.ln();\n } else {\n // downgrade to number, return Complex valued result\n return _log1pComplex(new Complex(x.toNumber(), 0));\n }\n },\n 'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self)),\n 'any, any': typed.referToSelf(self => (x, base) => {\n // calculate logarithm for a specified base, log1p(x, base)\n return divideScalar(self(x), log(base));\n })\n });\n\n /**\n * Calculate the natural logarithm of a complex number + 1\n * @param {Complex} x\n * @returns {Complex}\n * @private\n */\n function _log1pComplex(x) {\n var xRe1p = x.re + 1;\n return new Complex(Math.log(Math.sqrt(xRe1p * xRe1p + x.im * x.im)), Math.atan2(x.im, xRe1p));\n }\n});","import { factory } from '../../utils/factory.js';\nvar name = 'nthRoots';\nvar dependencies = ['config', 'typed', 'divideScalar', 'Complex'];\nexport var createNthRoots = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n config,\n divideScalar,\n Complex\n } = _ref;\n /**\n * Each function here returns a real multiple of i as a Complex value.\n * @param {number} val\n * @return {Complex} val, i*val, -val or -i*val for index 0, 1, 2, 3\n */\n // This is used to fix float artifacts for zero-valued components.\n var _calculateExactResult = [function realPos(val) {\n return new Complex(val, 0);\n }, function imagPos(val) {\n return new Complex(0, val);\n }, function realNeg(val) {\n return new Complex(-val, 0);\n }, function imagNeg(val) {\n return new Complex(0, -val);\n }];\n\n /**\n * Calculate the nth root of a Complex Number a using De Movire's Theorem.\n * @param {Complex} a\n * @param {number} root\n * @return {Array} array of n Complex Roots\n */\n function _nthComplexRoots(a, root) {\n if (root < 0) throw new Error('Root must be greater than zero');\n if (root === 0) throw new Error('Root must be non-zero');\n if (root % 1 !== 0) throw new Error('Root must be an integer');\n if (a === 0 || a.abs() === 0) return [new Complex(0, 0)];\n var aIsNumeric = typeof a === 'number';\n var offset;\n // determine the offset (argument of a)/(pi/2)\n if (aIsNumeric || a.re === 0 || a.im === 0) {\n if (aIsNumeric) {\n offset = 2 * +(a < 0); // numeric value on the real axis\n } else if (a.im === 0) {\n offset = 2 * +(a.re < 0); // complex value on the real axis\n } else {\n offset = 2 * +(a.im < 0) + 1; // complex value on the imaginary axis\n }\n }\n\n var arg = a.arg();\n var abs = a.abs();\n var roots = [];\n var r = Math.pow(abs, 1 / root);\n for (var k = 0; k < root; k++) {\n var halfPiFactor = (offset + 4 * k) / root;\n /**\n * If (offset + 4*k)/root is an integral multiple of pi/2\n * then we can produce a more exact result.\n */\n if (halfPiFactor === Math.round(halfPiFactor)) {\n roots.push(_calculateExactResult[halfPiFactor % 4](r));\n continue;\n }\n roots.push(new Complex({\n r,\n phi: (arg + 2 * Math.PI * k) / root\n }));\n }\n return roots;\n }\n\n /**\n * Calculate the nth roots of a value.\n * An nth root of a positive real number A,\n * is a positive real solution of the equation \"x^root = A\".\n * This function returns an array of complex values.\n *\n * Syntax:\n *\n * math.nthRoots(x)\n * math.nthRoots(x, root)\n *\n * Examples:\n *\n * math.nthRoots(1)\n * // returns [\n * // {re: 1, im: 0},\n * // {re: -1, im: 0}\n * // ]\n * math.nthRoots(1, 3)\n * // returns [\n * // { re: 1, im: 0 },\n * // { re: -0.4999999999999998, im: 0.8660254037844387 },\n * // { re: -0.5000000000000004, im: -0.8660254037844385 }\n * // ]\n *\n * See also:\n *\n * nthRoot, pow, sqrt\n *\n * @param {number | BigNumber | Fraction | Complex} x Number to be rounded\n * @param {number} [root=2] Optional root, default value is 2\n * @return {number | BigNumber | Fraction | Complex} Returns the nth roots\n */\n return typed(name, {\n Complex: function Complex(x) {\n return _nthComplexRoots(x, 2);\n },\n 'Complex, number': _nthComplexRoots\n });\n});","import { factory } from '../../utils/factory.js';\nimport { createMatAlgo03xDSf } from '../../type/matrix/utils/matAlgo03xDSf.js';\nimport { createMatAlgo07xSSf } from '../../type/matrix/utils/matAlgo07xSSf.js';\nimport { createMatAlgo11xS0s } from '../../type/matrix/utils/matAlgo11xS0s.js';\nimport { createMatAlgo12xSfs } from '../../type/matrix/utils/matAlgo12xSfs.js';\nimport { createMatrixAlgorithmSuite } from '../../type/matrix/utils/matrixAlgorithmSuite.js';\nvar name = 'dotPow';\nvar dependencies = ['typed', 'equalScalar', 'matrix', 'pow', 'DenseMatrix', 'concat'];\nexport var createDotPow = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n equalScalar,\n matrix,\n pow,\n DenseMatrix,\n concat\n } = _ref;\n var matAlgo03xDSf = createMatAlgo03xDSf({\n typed\n });\n var matAlgo07xSSf = createMatAlgo07xSSf({\n typed,\n DenseMatrix\n });\n var matAlgo11xS0s = createMatAlgo11xS0s({\n typed,\n equalScalar\n });\n var matAlgo12xSfs = createMatAlgo12xSfs({\n typed,\n DenseMatrix\n });\n var matrixAlgorithmSuite = createMatrixAlgorithmSuite({\n typed,\n matrix,\n concat\n });\n var powScalarSignatures = {};\n for (var signature in pow.signatures) {\n if (Object.prototype.hasOwnProperty.call(pow.signatures, signature)) {\n if (!signature.includes('Matrix') && !signature.includes('Array')) {\n powScalarSignatures[signature] = pow.signatures[signature];\n }\n }\n }\n var powScalar = typed(powScalarSignatures);\n\n /**\n * Calculates the power of x to y element wise.\n *\n * Syntax:\n *\n * math.dotPow(x, y)\n *\n * Examples:\n *\n * math.dotPow(2, 3) // returns number 8\n *\n * const a = [[1, 2], [4, 3]]\n * math.dotPow(a, 2) // returns Array [[1, 4], [16, 9]]\n * math.pow(a, 2) // returns Array [[9, 8], [16, 17]]\n *\n * See also:\n *\n * pow, sqrt, multiply\n *\n * @param {number | BigNumber | Complex | Unit | Array | Matrix} x The base\n * @param {number | BigNumber | Complex | Unit | Array | Matrix} y The exponent\n * @return {number | BigNumber | Complex | Unit | Array | Matrix} The value of `x` to the power `y`\n */\n return typed(name, matrixAlgorithmSuite({\n elop: powScalar,\n SS: matAlgo07xSSf,\n DS: matAlgo03xDSf,\n Ss: matAlgo11xS0s,\n sS: matAlgo12xSfs\n }));\n});","import { factory } from '../../utils/factory.js';\nimport { createMatAlgo02xDS0 } from '../../type/matrix/utils/matAlgo02xDS0.js';\nimport { createMatAlgo03xDSf } from '../../type/matrix/utils/matAlgo03xDSf.js';\nimport { createMatAlgo07xSSf } from '../../type/matrix/utils/matAlgo07xSSf.js';\nimport { createMatAlgo11xS0s } from '../../type/matrix/utils/matAlgo11xS0s.js';\nimport { createMatAlgo12xSfs } from '../../type/matrix/utils/matAlgo12xSfs.js';\nimport { createMatrixAlgorithmSuite } from '../../type/matrix/utils/matrixAlgorithmSuite.js';\nvar name = 'dotDivide';\nvar dependencies = ['typed', 'matrix', 'equalScalar', 'divideScalar', 'DenseMatrix', 'concat'];\nexport var createDotDivide = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n matrix,\n equalScalar,\n divideScalar,\n DenseMatrix,\n concat\n } = _ref;\n var matAlgo02xDS0 = createMatAlgo02xDS0({\n typed,\n equalScalar\n });\n var matAlgo03xDSf = createMatAlgo03xDSf({\n typed\n });\n var matAlgo07xSSf = createMatAlgo07xSSf({\n typed,\n DenseMatrix\n });\n var matAlgo11xS0s = createMatAlgo11xS0s({\n typed,\n equalScalar\n });\n var matAlgo12xSfs = createMatAlgo12xSfs({\n typed,\n DenseMatrix\n });\n var matrixAlgorithmSuite = createMatrixAlgorithmSuite({\n typed,\n matrix,\n concat\n });\n\n /**\n * Divide two matrices element wise. The function accepts both matrices and\n * scalar values.\n *\n * Syntax:\n *\n * math.dotDivide(x, y)\n *\n * Examples:\n *\n * math.dotDivide(2, 4) // returns 0.5\n *\n * a = [[9, 5], [6, 1]]\n * b = [[3, 2], [5, 2]]\n *\n * math.dotDivide(a, b) // returns [[3, 2.5], [1.2, 0.5]]\n * math.divide(a, b) // returns [[1.75, 0.75], [-1.75, 2.25]]\n *\n * See also:\n *\n * divide, multiply, dotMultiply\n *\n * @param {number | BigNumber | Fraction | Complex | Unit | Array | Matrix} x Numerator\n * @param {number | BigNumber | Fraction | Complex | Unit | Array | Matrix} y Denominator\n * @return {number | BigNumber | Fraction | Complex | Unit | Array | Matrix} Quotient, `x ./ y`\n */\n return typed(name, matrixAlgorithmSuite({\n elop: divideScalar,\n SS: matAlgo07xSSf,\n DS: matAlgo03xDSf,\n SD: matAlgo02xDS0,\n Ss: matAlgo11xS0s,\n sS: matAlgo12xSfs\n }));\n});","import { isArray, isMatrix, isDenseMatrix, isSparseMatrix } from '../../../../utils/is.js';\nimport { arraySize } from '../../../../utils/array.js';\nimport { format } from '../../../../utils/string.js';\nexport function createSolveValidation(_ref) {\n var {\n DenseMatrix\n } = _ref;\n /**\n * Validates matrix and column vector b for backward/forward substitution algorithms.\n *\n * @param {Matrix} m An N x N matrix\n * @param {Array | Matrix} b A column vector\n * @param {Boolean} copy Return a copy of vector b\n *\n * @return {DenseMatrix} Dense column vector b\n */\n return function solveValidation(m, b, copy) {\n var mSize = m.size();\n if (mSize.length !== 2) {\n throw new RangeError('Matrix must be two dimensional (size: ' + format(mSize) + ')');\n }\n var rows = mSize[0];\n var columns = mSize[1];\n if (rows !== columns) {\n throw new RangeError('Matrix must be square (size: ' + format(mSize) + ')');\n }\n var data = [];\n if (isMatrix(b)) {\n var bSize = b.size();\n var bdata = b._data;\n\n // 1-dim vector\n if (bSize.length === 1) {\n if (bSize[0] !== rows) {\n throw new RangeError('Dimension mismatch. Matrix columns must match vector length.');\n }\n for (var i = 0; i < rows; i++) {\n data[i] = [bdata[i]];\n }\n return new DenseMatrix({\n data,\n size: [rows, 1],\n datatype: b._datatype\n });\n }\n\n // 2-dim column\n if (bSize.length === 2) {\n if (bSize[0] !== rows || bSize[1] !== 1) {\n throw new RangeError('Dimension mismatch. Matrix columns must match vector length.');\n }\n if (isDenseMatrix(b)) {\n if (copy) {\n data = [];\n for (var _i = 0; _i < rows; _i++) {\n data[_i] = [bdata[_i][0]];\n }\n return new DenseMatrix({\n data,\n size: [rows, 1],\n datatype: b._datatype\n });\n }\n return b;\n }\n if (isSparseMatrix(b)) {\n for (var _i2 = 0; _i2 < rows; _i2++) {\n data[_i2] = [0];\n }\n var values = b._values;\n var index = b._index;\n var ptr = b._ptr;\n for (var k1 = ptr[1], k = ptr[0]; k < k1; k++) {\n var _i3 = index[k];\n data[_i3][0] = values[k];\n }\n return new DenseMatrix({\n data,\n size: [rows, 1],\n datatype: b._datatype\n });\n }\n }\n throw new RangeError('Dimension mismatch. The right side has to be either 1- or 2-dimensional vector.');\n }\n if (isArray(b)) {\n var bsize = arraySize(b);\n if (bsize.length === 1) {\n if (bsize[0] !== rows) {\n throw new RangeError('Dimension mismatch. Matrix columns must match vector length.');\n }\n for (var _i4 = 0; _i4 < rows; _i4++) {\n data[_i4] = [b[_i4]];\n }\n return new DenseMatrix({\n data,\n size: [rows, 1]\n });\n }\n if (bsize.length === 2) {\n if (bsize[0] !== rows || bsize[1] !== 1) {\n throw new RangeError('Dimension mismatch. Matrix columns must match vector length.');\n }\n for (var _i5 = 0; _i5 < rows; _i5++) {\n data[_i5] = [b[_i5][0]];\n }\n return new DenseMatrix({\n data,\n size: [rows, 1]\n });\n }\n throw new RangeError('Dimension mismatch. The right side has to be either 1- or 2-dimensional vector.');\n }\n };\n}","import { factory } from '../../../utils/factory.js';\nimport { createSolveValidation } from './utils/solveValidation.js';\nvar name = 'lsolve';\nvar dependencies = ['typed', 'matrix', 'divideScalar', 'multiplyScalar', 'subtract', 'equalScalar', 'DenseMatrix'];\nexport var createLsolve = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n matrix,\n divideScalar,\n multiplyScalar,\n subtract,\n equalScalar,\n DenseMatrix\n } = _ref;\n var solveValidation = createSolveValidation({\n DenseMatrix\n });\n\n /**\n * Finds one solution of a linear equation system by forwards substitution. Matrix must be a lower triangular matrix. Throws an error if there's no solution.\n *\n * `L * x = b`\n *\n * Syntax:\n *\n * math.lsolve(L, b)\n *\n * Examples:\n *\n * const a = [[-2, 3], [2, 1]]\n * const b = [11, 9]\n * const x = lsolve(a, b) // [[-5.5], [20]]\n *\n * See also:\n *\n * lsolveAll, lup, slu, usolve, lusolve\n *\n * @param {Matrix, Array} L A N x N matrix or array (L)\n * @param {Matrix, Array} b A column vector with the b values\n *\n * @return {DenseMatrix | Array} A column vector with the linear system solution (x)\n */\n return typed(name, {\n 'SparseMatrix, Array | Matrix': function SparseMatrixArrayMatrix(m, b) {\n return _sparseForwardSubstitution(m, b);\n },\n 'DenseMatrix, Array | Matrix': function DenseMatrixArrayMatrix(m, b) {\n return _denseForwardSubstitution(m, b);\n },\n 'Array, Array | Matrix': function ArrayArrayMatrix(a, b) {\n var m = matrix(a);\n var r = _denseForwardSubstitution(m, b);\n return r.valueOf();\n }\n });\n function _denseForwardSubstitution(m, b) {\n // validate matrix and vector, return copy of column vector b\n b = solveValidation(m, b, true);\n var bdata = b._data;\n var rows = m._size[0];\n var columns = m._size[1];\n\n // result\n var x = [];\n var mdata = m._data;\n\n // loop columns\n for (var j = 0; j < columns; j++) {\n var bj = bdata[j][0] || 0;\n var xj = void 0;\n if (!equalScalar(bj, 0)) {\n // non-degenerate row, find solution\n\n var vjj = mdata[j][j];\n if (equalScalar(vjj, 0)) {\n throw new Error('Linear system cannot be solved since matrix is singular');\n }\n xj = divideScalar(bj, vjj);\n\n // loop rows\n for (var i = j + 1; i < rows; i++) {\n bdata[i] = [subtract(bdata[i][0] || 0, multiplyScalar(xj, mdata[i][j]))];\n }\n } else {\n // degenerate row, we can choose any value\n xj = 0;\n }\n x[j] = [xj];\n }\n return new DenseMatrix({\n data: x,\n size: [rows, 1]\n });\n }\n function _sparseForwardSubstitution(m, b) {\n // validate matrix and vector, return copy of column vector b\n b = solveValidation(m, b, true);\n var bdata = b._data;\n var rows = m._size[0];\n var columns = m._size[1];\n var values = m._values;\n var index = m._index;\n var ptr = m._ptr;\n\n // result\n var x = [];\n\n // loop columns\n for (var j = 0; j < columns; j++) {\n var bj = bdata[j][0] || 0;\n if (!equalScalar(bj, 0)) {\n // non-degenerate row, find solution\n\n var vjj = 0;\n // matrix values & indices (column j)\n var jValues = [];\n var jIndices = [];\n\n // first and last index in the column\n var firstIndex = ptr[j];\n var lastIndex = ptr[j + 1];\n\n // values in column, find value at [j, j]\n for (var k = firstIndex; k < lastIndex; k++) {\n var i = index[k];\n\n // check row (rows are not sorted!)\n if (i === j) {\n vjj = values[k];\n } else if (i > j) {\n // store lower triangular\n jValues.push(values[k]);\n jIndices.push(i);\n }\n }\n\n // at this point we must have a value in vjj\n if (equalScalar(vjj, 0)) {\n throw new Error('Linear system cannot be solved since matrix is singular');\n }\n var xj = divideScalar(bj, vjj);\n for (var _k = 0, l = jIndices.length; _k < l; _k++) {\n var _i = jIndices[_k];\n bdata[_i] = [subtract(bdata[_i][0] || 0, multiplyScalar(xj, jValues[_k]))];\n }\n x[j] = [xj];\n } else {\n // degenerate row, we can choose any value\n x[j] = [0];\n }\n }\n return new DenseMatrix({\n data: x,\n size: [rows, 1]\n });\n }\n});","import { factory } from '../../../utils/factory.js';\nimport { createSolveValidation } from './utils/solveValidation.js';\nvar name = 'usolve';\nvar dependencies = ['typed', 'matrix', 'divideScalar', 'multiplyScalar', 'subtract', 'equalScalar', 'DenseMatrix'];\nexport var createUsolve = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n matrix,\n divideScalar,\n multiplyScalar,\n subtract,\n equalScalar,\n DenseMatrix\n } = _ref;\n var solveValidation = createSolveValidation({\n DenseMatrix\n });\n\n /**\n * Finds one solution of a linear equation system by backward substitution. Matrix must be an upper triangular matrix. Throws an error if there's no solution.\n *\n * `U * x = b`\n *\n * Syntax:\n *\n * math.usolve(U, b)\n *\n * Examples:\n *\n * const a = [[-2, 3], [2, 1]]\n * const b = [11, 9]\n * const x = usolve(a, b) // [[8], [9]]\n *\n * See also:\n *\n * usolveAll, lup, slu, usolve, lusolve\n *\n * @param {Matrix, Array} U A N x N matrix or array (U)\n * @param {Matrix, Array} b A column vector with the b values\n *\n * @return {DenseMatrix | Array} A column vector with the linear system solution (x)\n */\n return typed(name, {\n 'SparseMatrix, Array | Matrix': function SparseMatrixArrayMatrix(m, b) {\n return _sparseBackwardSubstitution(m, b);\n },\n 'DenseMatrix, Array | Matrix': function DenseMatrixArrayMatrix(m, b) {\n return _denseBackwardSubstitution(m, b);\n },\n 'Array, Array | Matrix': function ArrayArrayMatrix(a, b) {\n var m = matrix(a);\n var r = _denseBackwardSubstitution(m, b);\n return r.valueOf();\n }\n });\n function _denseBackwardSubstitution(m, b) {\n // make b into a column vector\n b = solveValidation(m, b, true);\n var bdata = b._data;\n var rows = m._size[0];\n var columns = m._size[1];\n\n // result\n var x = [];\n var mdata = m._data;\n // loop columns backwards\n for (var j = columns - 1; j >= 0; j--) {\n // b[j]\n var bj = bdata[j][0] || 0;\n // x[j]\n var xj = void 0;\n if (!equalScalar(bj, 0)) {\n // value at [j, j]\n var vjj = mdata[j][j];\n if (equalScalar(vjj, 0)) {\n // system cannot be solved\n throw new Error('Linear system cannot be solved since matrix is singular');\n }\n xj = divideScalar(bj, vjj);\n\n // loop rows\n for (var i = j - 1; i >= 0; i--) {\n // update copy of b\n bdata[i] = [subtract(bdata[i][0] || 0, multiplyScalar(xj, mdata[i][j]))];\n }\n } else {\n // zero value at j\n xj = 0;\n }\n // update x\n x[j] = [xj];\n }\n return new DenseMatrix({\n data: x,\n size: [rows, 1]\n });\n }\n function _sparseBackwardSubstitution(m, b) {\n // make b into a column vector\n b = solveValidation(m, b, true);\n var bdata = b._data;\n var rows = m._size[0];\n var columns = m._size[1];\n var values = m._values;\n var index = m._index;\n var ptr = m._ptr;\n\n // result\n var x = [];\n\n // loop columns backwards\n for (var j = columns - 1; j >= 0; j--) {\n var bj = bdata[j][0] || 0;\n if (!equalScalar(bj, 0)) {\n // non-degenerate row, find solution\n\n var vjj = 0;\n\n // upper triangular matrix values & index (column j)\n var jValues = [];\n var jIndices = [];\n\n // first & last indeces in column\n var firstIndex = ptr[j];\n var lastIndex = ptr[j + 1];\n\n // values in column, find value at [j, j], loop backwards\n for (var k = lastIndex - 1; k >= firstIndex; k--) {\n var i = index[k];\n\n // check row (rows are not sorted!)\n if (i === j) {\n vjj = values[k];\n } else if (i < j) {\n // store upper triangular\n jValues.push(values[k]);\n jIndices.push(i);\n }\n }\n\n // at this point we must have a value in vjj\n if (equalScalar(vjj, 0)) {\n throw new Error('Linear system cannot be solved since matrix is singular');\n }\n var xj = divideScalar(bj, vjj);\n for (var _k = 0, _lastIndex = jIndices.length; _k < _lastIndex; _k++) {\n var _i = jIndices[_k];\n bdata[_i] = [subtract(bdata[_i][0], multiplyScalar(xj, jValues[_k]))];\n }\n x[j] = [xj];\n } else {\n // degenerate row, we can choose any value\n x[j] = [0];\n }\n }\n return new DenseMatrix({\n data: x,\n size: [rows, 1]\n });\n }\n});","import { factory } from '../../../utils/factory.js';\nimport { createSolveValidation } from './utils/solveValidation.js';\nvar name = 'lsolveAll';\nvar dependencies = ['typed', 'matrix', 'divideScalar', 'multiplyScalar', 'subtract', 'equalScalar', 'DenseMatrix'];\nexport var createLsolveAll = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n matrix,\n divideScalar,\n multiplyScalar,\n subtract,\n equalScalar,\n DenseMatrix\n } = _ref;\n var solveValidation = createSolveValidation({\n DenseMatrix\n });\n\n /**\n * Finds all solutions of a linear equation system by forwards substitution. Matrix must be a lower triangular matrix.\n *\n * `L * x = b`\n *\n * Syntax:\n *\n * math.lsolveAll(L, b)\n *\n * Examples:\n *\n * const a = [[-2, 3], [2, 1]]\n * const b = [11, 9]\n * const x = lsolveAll(a, b) // [ [[-5.5], [20]] ]\n *\n * See also:\n *\n * lsolve, lup, slu, usolve, lusolve\n *\n * @param {Matrix, Array} L A N x N matrix or array (L)\n * @param {Matrix, Array} b A column vector with the b values\n *\n * @return {DenseMatrix[] | Array[]} An array of affine-independent column vectors (x) that solve the linear system\n */\n return typed(name, {\n 'SparseMatrix, Array | Matrix': function SparseMatrixArrayMatrix(m, b) {\n return _sparseForwardSubstitution(m, b);\n },\n 'DenseMatrix, Array | Matrix': function DenseMatrixArrayMatrix(m, b) {\n return _denseForwardSubstitution(m, b);\n },\n 'Array, Array | Matrix': function ArrayArrayMatrix(a, b) {\n var m = matrix(a);\n var R = _denseForwardSubstitution(m, b);\n return R.map(r => r.valueOf());\n }\n });\n function _denseForwardSubstitution(m, b_) {\n // the algorithm is derived from\n // https://www.overleaf.com/read/csvgqdxggyjv\n\n // array of right-hand sides\n var B = [solveValidation(m, b_, true)._data.map(e => e[0])];\n var M = m._data;\n var rows = m._size[0];\n var columns = m._size[1];\n\n // loop columns\n for (var i = 0; i < columns; i++) {\n var L = B.length;\n\n // loop right-hand sides\n for (var k = 0; k < L; k++) {\n var b = B[k];\n if (!equalScalar(M[i][i], 0)) {\n // non-singular row\n\n b[i] = divideScalar(b[i], M[i][i]);\n for (var j = i + 1; j < columns; j++) {\n // b[j] -= b[i] * M[j,i]\n b[j] = subtract(b[j], multiplyScalar(b[i], M[j][i]));\n }\n } else if (!equalScalar(b[i], 0)) {\n // singular row, nonzero RHS\n\n if (k === 0) {\n // There is no valid solution\n return [];\n } else {\n // This RHS is invalid but other solutions may still exist\n B.splice(k, 1);\n k -= 1;\n L -= 1;\n }\n } else if (k === 0) {\n // singular row, RHS is zero\n\n var bNew = [...b];\n bNew[i] = 1;\n for (var _j = i + 1; _j < columns; _j++) {\n bNew[_j] = subtract(bNew[_j], M[_j][i]);\n }\n B.push(bNew);\n }\n }\n }\n return B.map(x => new DenseMatrix({\n data: x.map(e => [e]),\n size: [rows, 1]\n }));\n }\n function _sparseForwardSubstitution(m, b_) {\n // array of right-hand sides\n var B = [solveValidation(m, b_, true)._data.map(e => e[0])];\n var rows = m._size[0];\n var columns = m._size[1];\n var values = m._values;\n var index = m._index;\n var ptr = m._ptr;\n\n // loop columns\n for (var i = 0; i < columns; i++) {\n var L = B.length;\n\n // loop right-hand sides\n for (var k = 0; k < L; k++) {\n var b = B[k];\n\n // values & indices (column i)\n var iValues = [];\n var iIndices = [];\n\n // first & last indeces in column\n var firstIndex = ptr[i];\n var lastIndex = ptr[i + 1];\n\n // find the value at [i, i]\n var Mii = 0;\n for (var j = firstIndex; j < lastIndex; j++) {\n var J = index[j];\n // check row\n if (J === i) {\n Mii = values[j];\n } else if (J > i) {\n // store lower triangular\n iValues.push(values[j]);\n iIndices.push(J);\n }\n }\n if (!equalScalar(Mii, 0)) {\n // non-singular row\n\n b[i] = divideScalar(b[i], Mii);\n for (var _j2 = 0, _lastIndex = iIndices.length; _j2 < _lastIndex; _j2++) {\n var _J = iIndices[_j2];\n b[_J] = subtract(b[_J], multiplyScalar(b[i], iValues[_j2]));\n }\n } else if (!equalScalar(b[i], 0)) {\n // singular row, nonzero RHS\n\n if (k === 0) {\n // There is no valid solution\n return [];\n } else {\n // This RHS is invalid but other solutions may still exist\n B.splice(k, 1);\n k -= 1;\n L -= 1;\n }\n } else if (k === 0) {\n // singular row, RHS is zero\n\n var bNew = [...b];\n bNew[i] = 1;\n for (var _j3 = 0, _lastIndex2 = iIndices.length; _j3 < _lastIndex2; _j3++) {\n var _J2 = iIndices[_j3];\n bNew[_J2] = subtract(bNew[_J2], iValues[_j3]);\n }\n B.push(bNew);\n }\n }\n }\n return B.map(x => new DenseMatrix({\n data: x.map(e => [e]),\n size: [rows, 1]\n }));\n }\n});","import { factory } from '../../../utils/factory.js';\nimport { createSolveValidation } from './utils/solveValidation.js';\nvar name = 'usolveAll';\nvar dependencies = ['typed', 'matrix', 'divideScalar', 'multiplyScalar', 'subtract', 'equalScalar', 'DenseMatrix'];\nexport var createUsolveAll = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n matrix,\n divideScalar,\n multiplyScalar,\n subtract,\n equalScalar,\n DenseMatrix\n } = _ref;\n var solveValidation = createSolveValidation({\n DenseMatrix\n });\n\n /**\n * Finds all solutions of a linear equation system by backward substitution. Matrix must be an upper triangular matrix.\n *\n * `U * x = b`\n *\n * Syntax:\n *\n * math.usolveAll(U, b)\n *\n * Examples:\n *\n * const a = [[-2, 3], [2, 1]]\n * const b = [11, 9]\n * const x = usolveAll(a, b) // [ [[8], [9]] ]\n *\n * See also:\n *\n * usolve, lup, slu, usolve, lusolve\n *\n * @param {Matrix, Array} U A N x N matrix or array (U)\n * @param {Matrix, Array} b A column vector with the b values\n *\n * @return {DenseMatrix[] | Array[]} An array of affine-independent column vectors (x) that solve the linear system\n */\n return typed(name, {\n 'SparseMatrix, Array | Matrix': function SparseMatrixArrayMatrix(m, b) {\n return _sparseBackwardSubstitution(m, b);\n },\n 'DenseMatrix, Array | Matrix': function DenseMatrixArrayMatrix(m, b) {\n return _denseBackwardSubstitution(m, b);\n },\n 'Array, Array | Matrix': function ArrayArrayMatrix(a, b) {\n var m = matrix(a);\n var R = _denseBackwardSubstitution(m, b);\n return R.map(r => r.valueOf());\n }\n });\n function _denseBackwardSubstitution(m, b_) {\n // the algorithm is derived from\n // https://www.overleaf.com/read/csvgqdxggyjv\n\n // array of right-hand sides\n var B = [solveValidation(m, b_, true)._data.map(e => e[0])];\n var M = m._data;\n var rows = m._size[0];\n var columns = m._size[1];\n\n // loop columns backwards\n for (var i = columns - 1; i >= 0; i--) {\n var L = B.length;\n\n // loop right-hand sides\n for (var k = 0; k < L; k++) {\n var b = B[k];\n if (!equalScalar(M[i][i], 0)) {\n // non-singular row\n\n b[i] = divideScalar(b[i], M[i][i]);\n for (var j = i - 1; j >= 0; j--) {\n // b[j] -= b[i] * M[j,i]\n b[j] = subtract(b[j], multiplyScalar(b[i], M[j][i]));\n }\n } else if (!equalScalar(b[i], 0)) {\n // singular row, nonzero RHS\n\n if (k === 0) {\n // There is no valid solution\n return [];\n } else {\n // This RHS is invalid but other solutions may still exist\n B.splice(k, 1);\n k -= 1;\n L -= 1;\n }\n } else if (k === 0) {\n // singular row, RHS is zero\n\n var bNew = [...b];\n bNew[i] = 1;\n for (var _j = i - 1; _j >= 0; _j--) {\n bNew[_j] = subtract(bNew[_j], M[_j][i]);\n }\n B.push(bNew);\n }\n }\n }\n return B.map(x => new DenseMatrix({\n data: x.map(e => [e]),\n size: [rows, 1]\n }));\n }\n function _sparseBackwardSubstitution(m, b_) {\n // array of right-hand sides\n var B = [solveValidation(m, b_, true)._data.map(e => e[0])];\n var rows = m._size[0];\n var columns = m._size[1];\n var values = m._values;\n var index = m._index;\n var ptr = m._ptr;\n\n // loop columns backwards\n for (var i = columns - 1; i >= 0; i--) {\n var L = B.length;\n\n // loop right-hand sides\n for (var k = 0; k < L; k++) {\n var b = B[k];\n\n // values & indices (column i)\n var iValues = [];\n var iIndices = [];\n\n // first & last indeces in column\n var firstIndex = ptr[i];\n var lastIndex = ptr[i + 1];\n\n // find the value at [i, i]\n var Mii = 0;\n for (var j = lastIndex - 1; j >= firstIndex; j--) {\n var J = index[j];\n // check row\n if (J === i) {\n Mii = values[j];\n } else if (J < i) {\n // store upper triangular\n iValues.push(values[j]);\n iIndices.push(J);\n }\n }\n if (!equalScalar(Mii, 0)) {\n // non-singular row\n\n b[i] = divideScalar(b[i], Mii);\n\n // loop upper triangular\n for (var _j2 = 0, _lastIndex = iIndices.length; _j2 < _lastIndex; _j2++) {\n var _J = iIndices[_j2];\n b[_J] = subtract(b[_J], multiplyScalar(b[i], iValues[_j2]));\n }\n } else if (!equalScalar(b[i], 0)) {\n // singular row, nonzero RHS\n\n if (k === 0) {\n // There is no valid solution\n return [];\n } else {\n // This RHS is invalid but other solutions may still exist\n B.splice(k, 1);\n k -= 1;\n L -= 1;\n }\n } else if (k === 0) {\n // singular row, RHS is zero\n\n var bNew = [...b];\n bNew[i] = 1;\n\n // loop upper triangular\n for (var _j3 = 0, _lastIndex2 = iIndices.length; _j3 < _lastIndex2; _j3++) {\n var _J2 = iIndices[_j3];\n bNew[_J2] = subtract(bNew[_J2], iValues[_j3]);\n }\n B.push(bNew);\n }\n }\n }\n return B.map(x => new DenseMatrix({\n data: x.map(e => [e]),\n size: [rows, 1]\n }));\n }\n});","import { factory } from '../../../utils/factory.js';\nimport { DimensionError } from '../../../error/DimensionError.js';\nvar name = 'matAlgo08xS0Sid';\nvar dependencies = ['typed', 'equalScalar'];\nexport var createMatAlgo08xS0Sid = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n equalScalar\n } = _ref;\n /**\n * Iterates over SparseMatrix A and SparseMatrix B nonzero items and invokes the callback function f(Aij, Bij).\n * Callback function invoked MAX(NNZA, NNZB) times\n *\n *\n * ┌ f(Aij, Bij) ; A(i,j) !== 0 && B(i,j) !== 0\n * C(i,j) = ┤ A(i,j) ; A(i,j) !== 0 && B(i,j) === 0\n * └ 0 ; otherwise\n *\n *\n * @param {Matrix} a The SparseMatrix instance (A)\n * @param {Matrix} b The SparseMatrix instance (B)\n * @param {Function} callback The f(Aij,Bij) operation to invoke\n *\n * @return {Matrix} SparseMatrix (C)\n *\n * see https://github.com/josdejong/mathjs/pull/346#issuecomment-97620294\n */\n return function matAlgo08xS0Sid(a, b, callback) {\n // sparse matrix arrays\n var avalues = a._values;\n var aindex = a._index;\n var aptr = a._ptr;\n var asize = a._size;\n var adt = a._datatype;\n // sparse matrix arrays\n var bvalues = b._values;\n var bindex = b._index;\n var bptr = b._ptr;\n var bsize = b._size;\n var bdt = b._datatype;\n\n // validate dimensions\n if (asize.length !== bsize.length) {\n throw new DimensionError(asize.length, bsize.length);\n }\n\n // check rows & columns\n if (asize[0] !== bsize[0] || asize[1] !== bsize[1]) {\n throw new RangeError('Dimension mismatch. Matrix A (' + asize + ') must match Matrix B (' + bsize + ')');\n }\n\n // sparse matrix cannot be a Pattern matrix\n if (!avalues || !bvalues) {\n throw new Error('Cannot perform operation on Pattern Sparse Matrices');\n }\n\n // rows & columns\n var rows = asize[0];\n var columns = asize[1];\n\n // datatype\n var dt;\n // equal signature to use\n var eq = equalScalar;\n // zero value\n var zero = 0;\n // callback signature to use\n var cf = callback;\n\n // process data types\n if (typeof adt === 'string' && adt === bdt) {\n // datatype\n dt = adt;\n // find signature that matches (dt, dt)\n eq = typed.find(equalScalar, [dt, dt]);\n // convert 0 to the same datatype\n zero = typed.convert(0, dt);\n // callback\n cf = typed.find(callback, [dt, dt]);\n }\n\n // result arrays\n var cvalues = [];\n var cindex = [];\n var cptr = [];\n\n // workspace\n var x = [];\n // marks indicating we have a value in x for a given column\n var w = [];\n\n // vars\n var k, k0, k1, i;\n\n // loop columns\n for (var j = 0; j < columns; j++) {\n // update cptr\n cptr[j] = cindex.length;\n // columns mark\n var mark = j + 1;\n // loop values in a\n for (k0 = aptr[j], k1 = aptr[j + 1], k = k0; k < k1; k++) {\n // row\n i = aindex[k];\n // mark workspace\n w[i] = mark;\n // set value\n x[i] = avalues[k];\n // add index\n cindex.push(i);\n }\n // loop values in b\n for (k0 = bptr[j], k1 = bptr[j + 1], k = k0; k < k1; k++) {\n // row\n i = bindex[k];\n // check value exists in workspace\n if (w[i] === mark) {\n // evaluate callback\n x[i] = cf(x[i], bvalues[k]);\n }\n }\n // initialize first index in j\n k = cptr[j];\n // loop index in j\n while (k < cindex.length) {\n // row\n i = cindex[k];\n // value @ i\n var v = x[i];\n // check for zero value\n if (!eq(v, zero)) {\n // push value\n cvalues.push(v);\n // increment pointer\n k++;\n } else {\n // remove value @ i, do not increment pointer\n cindex.splice(k, 1);\n }\n }\n }\n // update cptr\n cptr[columns] = cindex.length;\n\n // return sparse matrix\n return a.createSparseMatrix({\n values: cvalues,\n index: cindex,\n ptr: cptr,\n size: [rows, columns],\n datatype: dt\n });\n };\n});","import { factory } from '../../utils/factory.js';\nexport var createUseMatrixForArrayScalar = /* #__PURE__ */factory('useMatrixForArrayScalar', ['typed', 'matrix'], _ref => {\n var {\n typed,\n matrix\n } = _ref;\n return {\n 'Array, number': typed.referTo('DenseMatrix, number', selfDn => (x, y) => selfDn(matrix(x), y).valueOf()),\n 'Array, BigNumber': typed.referTo('DenseMatrix, BigNumber', selfDB => (x, y) => selfDB(matrix(x), y).valueOf()),\n 'number, Array': typed.referTo('number, DenseMatrix', selfnD => (x, y) => selfnD(x, matrix(y)).valueOf()),\n 'BigNumber, Array': typed.referTo('BigNumber, DenseMatrix', selfBD => (x, y) => selfBD(x, matrix(y)).valueOf())\n };\n});","import { createMatAlgo02xDS0 } from '../../type/matrix/utils/matAlgo02xDS0.js';\nimport { createMatAlgo11xS0s } from '../../type/matrix/utils/matAlgo11xS0s.js';\nimport { createMatAlgo14xDs } from '../../type/matrix/utils/matAlgo14xDs.js';\nimport { createMatAlgo01xDSid } from '../../type/matrix/utils/matAlgo01xDSid.js';\nimport { createMatAlgo10xSids } from '../../type/matrix/utils/matAlgo10xSids.js';\nimport { createMatAlgo08xS0Sid } from '../../type/matrix/utils/matAlgo08xS0Sid.js';\nimport { factory } from '../../utils/factory.js';\nimport { createMatrixAlgorithmSuite } from '../../type/matrix/utils/matrixAlgorithmSuite.js';\nimport { createUseMatrixForArrayScalar } from './useMatrixForArrayScalar.js';\nimport { leftShiftNumber } from '../../plain/number/index.js';\nimport { leftShiftBigNumber } from '../../utils/bignumber/bitwise.js';\nvar name = 'leftShift';\nvar dependencies = ['typed', 'matrix', 'equalScalar', 'zeros', 'DenseMatrix', 'concat'];\nexport var createLeftShift = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n matrix,\n equalScalar,\n zeros,\n DenseMatrix,\n concat\n } = _ref;\n var matAlgo01xDSid = createMatAlgo01xDSid({\n typed\n });\n var matAlgo02xDS0 = createMatAlgo02xDS0({\n typed,\n equalScalar\n });\n var matAlgo08xS0Sid = createMatAlgo08xS0Sid({\n typed,\n equalScalar\n });\n var matAlgo10xSids = createMatAlgo10xSids({\n typed,\n DenseMatrix\n });\n var matAlgo11xS0s = createMatAlgo11xS0s({\n typed,\n equalScalar\n });\n var matAlgo14xDs = createMatAlgo14xDs({\n typed\n });\n var matrixAlgorithmSuite = createMatrixAlgorithmSuite({\n typed,\n matrix,\n concat\n });\n var useMatrixForArrayScalar = createUseMatrixForArrayScalar({\n typed,\n matrix\n });\n\n /**\n * Bitwise left logical shift of a value x by y number of bits, `x << y`.\n * For matrices, the function is evaluated element wise.\n * For units, the function is evaluated on the best prefix base.\n *\n * Syntax:\n *\n * math.leftShift(x, y)\n *\n * Examples:\n *\n * math.leftShift(1, 2) // returns number 4\n *\n * math.leftShift([1, 2, 4], 4) // returns Array [16, 32, 64]\n *\n * See also:\n *\n * leftShift, bitNot, bitOr, bitXor, rightArithShift, rightLogShift\n *\n * @param {number | BigNumber | Array | Matrix} x Value to be shifted\n * @param {number | BigNumber} y Amount of shifts\n * @return {number | BigNumber | Array | Matrix} `x` shifted left `y` times\n */\n return typed(name, {\n 'number, number': leftShiftNumber,\n 'BigNumber, BigNumber': leftShiftBigNumber,\n 'SparseMatrix, number | BigNumber': typed.referToSelf(self => (x, y) => {\n // check scalar\n if (equalScalar(y, 0)) {\n return x.clone();\n }\n return matAlgo11xS0s(x, y, self, false);\n }),\n 'DenseMatrix, number | BigNumber': typed.referToSelf(self => (x, y) => {\n // check scalar\n if (equalScalar(y, 0)) {\n return x.clone();\n }\n return matAlgo14xDs(x, y, self, false);\n }),\n 'number | BigNumber, SparseMatrix': typed.referToSelf(self => (x, y) => {\n // check scalar\n if (equalScalar(x, 0)) {\n return zeros(y.size(), y.storage());\n }\n return matAlgo10xSids(y, x, self, true);\n }),\n 'number | BigNumber, DenseMatrix': typed.referToSelf(self => (x, y) => {\n // check scalar\n if (equalScalar(x, 0)) {\n return zeros(y.size(), y.storage());\n }\n return matAlgo14xDs(y, x, self, true);\n })\n }, useMatrixForArrayScalar, matrixAlgorithmSuite({\n SS: matAlgo08xS0Sid,\n DS: matAlgo01xDSid,\n SD: matAlgo02xDS0\n }));\n});","import { rightArithShiftBigNumber } from '../../utils/bignumber/bitwise.js';\nimport { createMatAlgo02xDS0 } from '../../type/matrix/utils/matAlgo02xDS0.js';\nimport { createMatAlgo11xS0s } from '../../type/matrix/utils/matAlgo11xS0s.js';\nimport { createMatAlgo14xDs } from '../../type/matrix/utils/matAlgo14xDs.js';\nimport { createMatAlgo01xDSid } from '../../type/matrix/utils/matAlgo01xDSid.js';\nimport { createMatAlgo10xSids } from '../../type/matrix/utils/matAlgo10xSids.js';\nimport { createMatAlgo08xS0Sid } from '../../type/matrix/utils/matAlgo08xS0Sid.js';\nimport { factory } from '../../utils/factory.js';\nimport { createMatrixAlgorithmSuite } from '../../type/matrix/utils/matrixAlgorithmSuite.js';\nimport { createUseMatrixForArrayScalar } from './useMatrixForArrayScalar.js';\nimport { rightArithShiftNumber } from '../../plain/number/index.js';\nvar name = 'rightArithShift';\nvar dependencies = ['typed', 'matrix', 'equalScalar', 'zeros', 'DenseMatrix', 'concat'];\nexport var createRightArithShift = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n matrix,\n equalScalar,\n zeros,\n DenseMatrix,\n concat\n } = _ref;\n var matAlgo01xDSid = createMatAlgo01xDSid({\n typed\n });\n var matAlgo02xDS0 = createMatAlgo02xDS0({\n typed,\n equalScalar\n });\n var matAlgo08xS0Sid = createMatAlgo08xS0Sid({\n typed,\n equalScalar\n });\n var matAlgo10xSids = createMatAlgo10xSids({\n typed,\n DenseMatrix\n });\n var matAlgo11xS0s = createMatAlgo11xS0s({\n typed,\n equalScalar\n });\n var matAlgo14xDs = createMatAlgo14xDs({\n typed\n });\n var matrixAlgorithmSuite = createMatrixAlgorithmSuite({\n typed,\n matrix,\n concat\n });\n var useMatrixForArrayScalar = createUseMatrixForArrayScalar({\n typed,\n matrix\n });\n\n /**\n * Bitwise right arithmetic shift of a value x by y number of bits, `x >> y`.\n * For matrices, the function is evaluated element wise.\n * For units, the function is evaluated on the best prefix base.\n *\n * Syntax:\n *\n * math.rightArithShift(x, y)\n *\n * Examples:\n *\n * math.rightArithShift(4, 2) // returns number 1\n *\n * math.rightArithShift([16, -32, 64], 4) // returns Array [1, -2, 4]\n *\n * See also:\n *\n * bitAnd, bitNot, bitOr, bitXor, rightArithShift, rightLogShift\n *\n * @param {number | BigNumber | Array | Matrix} x Value to be shifted\n * @param {number | BigNumber} y Amount of shifts\n * @return {number | BigNumber | Array | Matrix} `x` zero-filled shifted right `y` times\n */\n return typed(name, {\n 'number, number': rightArithShiftNumber,\n 'BigNumber, BigNumber': rightArithShiftBigNumber,\n 'SparseMatrix, number | BigNumber': typed.referToSelf(self => (x, y) => {\n // check scalar\n if (equalScalar(y, 0)) {\n return x.clone();\n }\n return matAlgo11xS0s(x, y, self, false);\n }),\n 'DenseMatrix, number | BigNumber': typed.referToSelf(self => (x, y) => {\n // check scalar\n if (equalScalar(y, 0)) {\n return x.clone();\n }\n return matAlgo14xDs(x, y, self, false);\n }),\n 'number | BigNumber, SparseMatrix': typed.referToSelf(self => (x, y) => {\n // check scalar\n if (equalScalar(x, 0)) {\n return zeros(y.size(), y.storage());\n }\n return matAlgo10xSids(y, x, self, true);\n }),\n 'number | BigNumber, DenseMatrix': typed.referToSelf(self => (x, y) => {\n // check scalar\n if (equalScalar(x, 0)) {\n return zeros(y.size(), y.storage());\n }\n return matAlgo14xDs(y, x, self, true);\n })\n }, useMatrixForArrayScalar, matrixAlgorithmSuite({\n SS: matAlgo08xS0Sid,\n DS: matAlgo01xDSid,\n SD: matAlgo02xDS0\n }));\n});","import { createMatAlgo02xDS0 } from '../../type/matrix/utils/matAlgo02xDS0.js';\nimport { createMatAlgo11xS0s } from '../../type/matrix/utils/matAlgo11xS0s.js';\nimport { createMatAlgo14xDs } from '../../type/matrix/utils/matAlgo14xDs.js';\nimport { createMatAlgo01xDSid } from '../../type/matrix/utils/matAlgo01xDSid.js';\nimport { createMatAlgo10xSids } from '../../type/matrix/utils/matAlgo10xSids.js';\nimport { createMatAlgo08xS0Sid } from '../../type/matrix/utils/matAlgo08xS0Sid.js';\nimport { factory } from '../../utils/factory.js';\nimport { createMatrixAlgorithmSuite } from '../../type/matrix/utils/matrixAlgorithmSuite.js';\nimport { rightLogShiftNumber } from '../../plain/number/index.js';\nimport { createUseMatrixForArrayScalar } from './useMatrixForArrayScalar.js';\nvar name = 'rightLogShift';\nvar dependencies = ['typed', 'matrix', 'equalScalar', 'zeros', 'DenseMatrix', 'concat'];\nexport var createRightLogShift = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n matrix,\n equalScalar,\n zeros,\n DenseMatrix,\n concat\n } = _ref;\n var matAlgo01xDSid = createMatAlgo01xDSid({\n typed\n });\n var matAlgo02xDS0 = createMatAlgo02xDS0({\n typed,\n equalScalar\n });\n var matAlgo08xS0Sid = createMatAlgo08xS0Sid({\n typed,\n equalScalar\n });\n var matAlgo10xSids = createMatAlgo10xSids({\n typed,\n DenseMatrix\n });\n var matAlgo11xS0s = createMatAlgo11xS0s({\n typed,\n equalScalar\n });\n var matAlgo14xDs = createMatAlgo14xDs({\n typed\n });\n var matrixAlgorithmSuite = createMatrixAlgorithmSuite({\n typed,\n matrix,\n concat\n });\n var useMatrixForArrayScalar = createUseMatrixForArrayScalar({\n typed,\n matrix\n });\n\n /**\n * Bitwise right logical shift of value x by y number of bits, `x >>> y`.\n * For matrices, the function is evaluated element wise.\n * For units, the function is evaluated on the best prefix base.\n *\n * Syntax:\n *\n * math.rightLogShift(x, y)\n *\n * Examples:\n *\n * math.rightLogShift(4, 2) // returns number 1\n *\n * math.rightLogShift([16, 32, 64], 4) // returns Array [1, 2, 4]\n *\n * See also:\n *\n * bitAnd, bitNot, bitOr, bitXor, leftShift, rightLogShift\n *\n * @param {number | Array | Matrix} x Value to be shifted\n * @param {number} y Amount of shifts\n * @return {number | Array | Matrix} `x` zero-filled shifted right `y` times\n */\n\n return typed(name, {\n 'number, number': rightLogShiftNumber,\n // 'BigNumber, BigNumber': ..., // TODO: implement BigNumber support for rightLogShift\n\n 'SparseMatrix, number | BigNumber': typed.referToSelf(self => (x, y) => {\n // check scalar\n if (equalScalar(y, 0)) {\n return x.clone();\n }\n return matAlgo11xS0s(x, y, self, false);\n }),\n 'DenseMatrix, number | BigNumber': typed.referToSelf(self => (x, y) => {\n // check scalar\n if (equalScalar(y, 0)) {\n return x.clone();\n }\n return matAlgo14xDs(x, y, self, false);\n }),\n 'number | BigNumber, SparseMatrix': typed.referToSelf(self => (x, y) => {\n // check scalar\n if (equalScalar(x, 0)) {\n return zeros(y.size(), y.storage());\n }\n return matAlgo10xSids(y, x, self, true);\n }),\n 'number | BigNumber, DenseMatrix': typed.referToSelf(self => (x, y) => {\n // check scalar\n if (equalScalar(x, 0)) {\n return zeros(y.size(), y.storage());\n }\n return matAlgo14xDs(y, x, self, true);\n })\n }, useMatrixForArrayScalar, matrixAlgorithmSuite({\n SS: matAlgo08xS0Sid,\n DS: matAlgo01xDSid,\n SD: matAlgo02xDS0\n }));\n});","import { createMatAlgo02xDS0 } from '../../type/matrix/utils/matAlgo02xDS0.js';\nimport { createMatAlgo11xS0s } from '../../type/matrix/utils/matAlgo11xS0s.js';\nimport { createMatAlgo14xDs } from '../../type/matrix/utils/matAlgo14xDs.js';\nimport { createMatAlgo06xS0S0 } from '../../type/matrix/utils/matAlgo06xS0S0.js';\nimport { factory } from '../../utils/factory.js';\nimport { createMatrixAlgorithmSuite } from '../../type/matrix/utils/matrixAlgorithmSuite.js';\nimport { andNumber } from '../../plain/number/index.js';\nvar name = 'and';\nvar dependencies = ['typed', 'matrix', 'equalScalar', 'zeros', 'not', 'concat'];\nexport var createAnd = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n matrix,\n equalScalar,\n zeros,\n not,\n concat\n } = _ref;\n var matAlgo02xDS0 = createMatAlgo02xDS0({\n typed,\n equalScalar\n });\n var matAlgo06xS0S0 = createMatAlgo06xS0S0({\n typed,\n equalScalar\n });\n var matAlgo11xS0s = createMatAlgo11xS0s({\n typed,\n equalScalar\n });\n var matAlgo14xDs = createMatAlgo14xDs({\n typed\n });\n var matrixAlgorithmSuite = createMatrixAlgorithmSuite({\n typed,\n matrix,\n concat\n });\n\n /**\n * Logical `and`. Test whether two values are both defined with a nonzero/nonempty value.\n * For matrices, the function is evaluated element wise.\n *\n * Syntax:\n *\n * math.and(x, y)\n *\n * Examples:\n *\n * math.and(2, 4) // returns true\n *\n * a = [2, 0, 0]\n * b = [3, 7, 0]\n * c = 0\n *\n * math.and(a, b) // returns [true, false, false]\n * math.and(a, c) // returns [false, false, false]\n *\n * See also:\n *\n * not, or, xor\n *\n * @param {number | BigNumber | Complex | Unit | Array | Matrix} x First value to check\n * @param {number | BigNumber | Complex | Unit | Array | Matrix} y Second value to check\n * @return {boolean | Array | Matrix}\n * Returns true when both inputs are defined with a nonzero/nonempty value.\n */\n return typed(name, {\n 'number, number': andNumber,\n 'Complex, Complex': function ComplexComplex(x, y) {\n return (x.re !== 0 || x.im !== 0) && (y.re !== 0 || y.im !== 0);\n },\n 'BigNumber, BigNumber': function BigNumberBigNumber(x, y) {\n return !x.isZero() && !y.isZero() && !x.isNaN() && !y.isNaN();\n },\n 'Unit, Unit': typed.referToSelf(self => (x, y) => self(x.value || 0, y.value || 0)),\n 'SparseMatrix, any': typed.referToSelf(self => (x, y) => {\n // check scalar\n if (not(y)) {\n // return zero matrix\n return zeros(x.size(), x.storage());\n }\n return matAlgo11xS0s(x, y, self, false);\n }),\n 'DenseMatrix, any': typed.referToSelf(self => (x, y) => {\n // check scalar\n if (not(y)) {\n // return zero matrix\n return zeros(x.size(), x.storage());\n }\n return matAlgo14xDs(x, y, self, false);\n }),\n 'any, SparseMatrix': typed.referToSelf(self => (x, y) => {\n // check scalar\n if (not(x)) {\n // return zero matrix\n return zeros(x.size(), x.storage());\n }\n return matAlgo11xS0s(y, x, self, true);\n }),\n 'any, DenseMatrix': typed.referToSelf(self => (x, y) => {\n // check scalar\n if (not(x)) {\n // return zero matrix\n return zeros(x.size(), x.storage());\n }\n return matAlgo14xDs(y, x, self, true);\n }),\n 'Array, any': typed.referToSelf(self => (x, y) => {\n // use matrix implementation\n return self(matrix(x), y).valueOf();\n }),\n 'any, Array': typed.referToSelf(self => (x, y) => {\n // use matrix implementation\n return self(x, matrix(y)).valueOf();\n })\n }, matrixAlgorithmSuite({\n SS: matAlgo06xS0S0,\n DS: matAlgo02xDS0\n }));\n});","import { nearlyEqual as bigNearlyEqual } from '../../utils/bignumber/nearlyEqual.js';\nimport { nearlyEqual } from '../../utils/number.js';\nimport { factory } from '../../utils/factory.js';\nimport { createMatAlgo03xDSf } from '../../type/matrix/utils/matAlgo03xDSf.js';\nimport { createMatAlgo12xSfs } from '../../type/matrix/utils/matAlgo12xSfs.js';\nimport { createMatAlgo05xSfSf } from '../../type/matrix/utils/matAlgo05xSfSf.js';\nimport { createMatrixAlgorithmSuite } from '../../type/matrix/utils/matrixAlgorithmSuite.js';\nimport { createCompareUnits } from './compareUnits.js';\nvar name = 'compare';\nvar dependencies = ['typed', 'config', 'matrix', 'equalScalar', 'BigNumber', 'Fraction', 'DenseMatrix', 'concat'];\nexport var createCompare = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n config,\n equalScalar,\n matrix,\n BigNumber,\n Fraction,\n DenseMatrix,\n concat\n } = _ref;\n var matAlgo03xDSf = createMatAlgo03xDSf({\n typed\n });\n var matAlgo05xSfSf = createMatAlgo05xSfSf({\n typed,\n equalScalar\n });\n var matAlgo12xSfs = createMatAlgo12xSfs({\n typed,\n DenseMatrix\n });\n var matrixAlgorithmSuite = createMatrixAlgorithmSuite({\n typed,\n matrix,\n concat\n });\n var compareUnits = createCompareUnits({\n typed\n });\n\n /**\n * Compare two values. Returns 1 when x > y, -1 when x < y, and 0 when x == y.\n *\n * x and y are considered equal when the relative difference between x and y\n * is smaller than the configured epsilon. The function cannot be used to\n * compare values smaller than approximately 2.22e-16.\n *\n * For matrices, the function is evaluated element wise.\n * Strings are compared by their numerical value.\n *\n * Syntax:\n *\n * math.compare(x, y)\n *\n * Examples:\n *\n * math.compare(6, 1) // returns 1\n * math.compare(2, 3) // returns -1\n * math.compare(7, 7) // returns 0\n * math.compare('10', '2') // returns 1\n * math.compare('1000', '1e3') // returns 0\n *\n * const a = math.unit('5 cm')\n * const b = math.unit('40 mm')\n * math.compare(a, b) // returns 1\n *\n * math.compare(2, [1, 2, 3]) // returns [1, 0, -1]\n *\n * See also:\n *\n * equal, unequal, smaller, smallerEq, larger, largerEq, compareNatural, compareText\n *\n * @param {number | BigNumber | Fraction | Unit | string | Array | Matrix} x First value to compare\n * @param {number | BigNumber | Fraction | Unit | string | Array | Matrix} y Second value to compare\n * @return {number | BigNumber | Fraction | Array | Matrix} Returns the result of the comparison:\n * 1 when x > y, -1 when x < y, and 0 when x == y.\n */\n return typed(name, createCompareNumber({\n typed,\n config\n }), {\n 'boolean, boolean': function booleanBoolean(x, y) {\n return x === y ? 0 : x > y ? 1 : -1;\n },\n 'BigNumber, BigNumber': function BigNumberBigNumber(x, y) {\n return bigNearlyEqual(x, y, config.epsilon) ? new BigNumber(0) : new BigNumber(x.cmp(y));\n },\n 'Fraction, Fraction': function FractionFraction(x, y) {\n return new Fraction(x.compare(y));\n },\n 'Complex, Complex': function ComplexComplex() {\n throw new TypeError('No ordering relation is defined for complex numbers');\n }\n }, compareUnits, matrixAlgorithmSuite({\n SS: matAlgo05xSfSf,\n DS: matAlgo03xDSf,\n Ss: matAlgo12xSfs\n }));\n});\nexport var createCompareNumber = /* #__PURE__ */factory(name, ['typed', 'config'], _ref2 => {\n var {\n typed,\n config\n } = _ref2;\n return typed(name, {\n 'number, number': function numberNumber(x, y) {\n return nearlyEqual(x, y, config.epsilon) ? 0 : x > y ? 1 : -1;\n }\n });\n});","import naturalSort from 'javascript-natural-sort';\nimport { isDenseMatrix, isSparseMatrix, typeOf } from '../../utils/is.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'compareNatural';\nvar dependencies = ['typed', 'compare'];\nexport var createCompareNatural = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n compare\n } = _ref;\n var compareBooleans = compare.signatures['boolean,boolean'];\n\n /**\n * Compare two values of any type in a deterministic, natural way.\n *\n * For numeric values, the function works the same as `math.compare`.\n * For types of values that can't be compared mathematically,\n * the function compares in a natural way.\n *\n * For numeric values, x and y are considered equal when the relative\n * difference between x and y is smaller than the configured epsilon.\n * The function cannot be used to compare values smaller than\n * approximately 2.22e-16.\n *\n * For Complex numbers, first the real parts are compared. If equal,\n * the imaginary parts are compared.\n *\n * Strings are compared with a natural sorting algorithm, which\n * orders strings in a \"logic\" way following some heuristics.\n * This differs from the function `compare`, which converts the string\n * into a numeric value and compares that. The function `compareText`\n * on the other hand compares text lexically.\n *\n * Arrays and Matrices are compared value by value until there is an\n * unequal pair of values encountered. Objects are compared by sorted\n * keys until the keys or their values are unequal.\n *\n * Syntax:\n *\n * math.compareNatural(x, y)\n *\n * Examples:\n *\n * math.compareNatural(6, 1) // returns 1\n * math.compareNatural(2, 3) // returns -1\n * math.compareNatural(7, 7) // returns 0\n *\n * math.compareNatural('10', '2') // returns 1\n * math.compareText('10', '2') // returns -1\n * math.compare('10', '2') // returns 1\n *\n * math.compareNatural('Answer: 10', 'Answer: 2') // returns 1\n * math.compareText('Answer: 10', 'Answer: 2') // returns -1\n * math.compare('Answer: 10', 'Answer: 2')\n * // Error: Cannot convert \"Answer: 10\" to a number\n *\n * const a = math.unit('5 cm')\n * const b = math.unit('40 mm')\n * math.compareNatural(a, b) // returns 1\n *\n * const c = math.complex('2 + 3i')\n * const d = math.complex('2 + 4i')\n * math.compareNatural(c, d) // returns -1\n *\n * math.compareNatural([1, 2, 4], [1, 2, 3]) // returns 1\n * math.compareNatural([1, 2, 3], [1, 2]) // returns 1\n * math.compareNatural([1, 5], [1, 2, 3]) // returns 1\n * math.compareNatural([1, 2], [1, 2]) // returns 0\n *\n * math.compareNatural({a: 2}, {a: 4}) // returns -1\n *\n * See also:\n *\n * compare, compareText\n *\n * @param {*} x First value to compare\n * @param {*} y Second value to compare\n * @return {number} Returns the result of the comparison:\n * 1 when x > y, -1 when x < y, and 0 when x == y.\n */\n return typed(name, {\n 'any, any': _compareNatural\n }); // just to check # args\n\n function _compareNatural(x, y) {\n var typeX = typeOf(x);\n var typeY = typeOf(y);\n var c;\n\n // numeric types\n if ((typeX === 'number' || typeX === 'BigNumber' || typeX === 'Fraction') && (typeY === 'number' || typeY === 'BigNumber' || typeY === 'Fraction')) {\n c = compare(x, y);\n if (c.toString() !== '0') {\n // c can be number, BigNumber, or Fraction\n return c > 0 ? 1 : -1; // return a number\n } else {\n return naturalSort(typeX, typeY);\n }\n }\n\n // matrix types\n var matTypes = ['Array', 'DenseMatrix', 'SparseMatrix'];\n if (matTypes.includes(typeX) || matTypes.includes(typeY)) {\n c = compareMatricesAndArrays(_compareNatural, x, y);\n if (c !== 0) {\n return c;\n } else {\n return naturalSort(typeX, typeY);\n }\n }\n\n // in case of different types, order by name of type, i.e. 'BigNumber' < 'Complex'\n if (typeX !== typeY) {\n return naturalSort(typeX, typeY);\n }\n if (typeX === 'Complex') {\n return compareComplexNumbers(x, y);\n }\n if (typeX === 'Unit') {\n if (x.equalBase(y)) {\n return _compareNatural(x.value, y.value);\n }\n\n // compare by units\n return compareArrays(_compareNatural, x.formatUnits(), y.formatUnits());\n }\n if (typeX === 'boolean') {\n return compareBooleans(x, y);\n }\n if (typeX === 'string') {\n return naturalSort(x, y);\n }\n if (typeX === 'Object') {\n return compareObjects(_compareNatural, x, y);\n }\n if (typeX === 'null') {\n return 0;\n }\n if (typeX === 'undefined') {\n return 0;\n }\n\n // this should not occur...\n throw new TypeError('Unsupported type of value \"' + typeX + '\"');\n }\n\n /**\n * Compare mixed matrix/array types, by converting to same-shaped array.\n * This comparator is non-deterministic regarding input types.\n * @param {Array | SparseMatrix | DenseMatrix | *} x\n * @param {Array | SparseMatrix | DenseMatrix | *} y\n * @returns {number} Returns the comparison result: -1, 0, or 1\n */\n function compareMatricesAndArrays(compareNatural, x, y) {\n if (isSparseMatrix(x) && isSparseMatrix(y)) {\n return compareArrays(compareNatural, x.toJSON().values, y.toJSON().values);\n }\n if (isSparseMatrix(x)) {\n // note: convert to array is expensive\n return compareMatricesAndArrays(compareNatural, x.toArray(), y);\n }\n if (isSparseMatrix(y)) {\n // note: convert to array is expensive\n return compareMatricesAndArrays(compareNatural, x, y.toArray());\n }\n\n // convert DenseArray into Array\n if (isDenseMatrix(x)) {\n return compareMatricesAndArrays(compareNatural, x.toJSON().data, y);\n }\n if (isDenseMatrix(y)) {\n return compareMatricesAndArrays(compareNatural, x, y.toJSON().data);\n }\n\n // convert scalars to array\n if (!Array.isArray(x)) {\n return compareMatricesAndArrays(compareNatural, [x], y);\n }\n if (!Array.isArray(y)) {\n return compareMatricesAndArrays(compareNatural, x, [y]);\n }\n return compareArrays(compareNatural, x, y);\n }\n\n /**\n * Compare two Arrays\n *\n * - First, compares value by value\n * - Next, if all corresponding values are equal,\n * look at the length: longest array will be considered largest\n *\n * @param {Array} x\n * @param {Array} y\n * @returns {number} Returns the comparison result: -1, 0, or 1\n */\n function compareArrays(compareNatural, x, y) {\n // compare each value\n for (var i = 0, ii = Math.min(x.length, y.length); i < ii; i++) {\n var v = compareNatural(x[i], y[i]);\n if (v !== 0) {\n return v;\n }\n }\n\n // compare the size of the arrays\n if (x.length > y.length) {\n return 1;\n }\n if (x.length < y.length) {\n return -1;\n }\n\n // both Arrays have equal size and content\n return 0;\n }\n\n /**\n * Compare two objects\n *\n * - First, compare sorted property names\n * - Next, compare the property values\n *\n * @param {Object} x\n * @param {Object} y\n * @returns {number} Returns the comparison result: -1, 0, or 1\n */\n function compareObjects(compareNatural, x, y) {\n var keysX = Object.keys(x);\n var keysY = Object.keys(y);\n\n // compare keys\n keysX.sort(naturalSort);\n keysY.sort(naturalSort);\n var c = compareArrays(compareNatural, keysX, keysY);\n if (c !== 0) {\n return c;\n }\n\n // compare values\n for (var i = 0; i < keysX.length; i++) {\n var v = compareNatural(x[keysX[i]], y[keysY[i]]);\n if (v !== 0) {\n return v;\n }\n }\n return 0;\n }\n});\n\n/**\n * Compare two complex numbers, `x` and `y`:\n *\n * - First, compare the real values of `x` and `y`\n * - If equal, compare the imaginary values of `x` and `y`\n *\n * @params {Complex} x\n * @params {Complex} y\n * @returns {number} Returns the comparison result: -1, 0, or 1\n */\nfunction compareComplexNumbers(x, y) {\n if (x.re > y.re) {\n return 1;\n }\n if (x.re < y.re) {\n return -1;\n }\n if (x.im > y.im) {\n return 1;\n }\n if (x.im < y.im) {\n return -1;\n }\n return 0;\n}","import { compareText as _compareText } from '../../utils/string.js';\nimport { factory } from '../../utils/factory.js';\nimport { createMatrixAlgorithmSuite } from '../../type/matrix/utils/matrixAlgorithmSuite.js';\nvar name = 'compareText';\nvar dependencies = ['typed', 'matrix', 'concat'];\n_compareText.signature = 'any, any';\nexport var createCompareText = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n matrix,\n concat\n } = _ref;\n var matrixAlgorithmSuite = createMatrixAlgorithmSuite({\n typed,\n matrix,\n concat\n });\n\n /**\n * Compare two strings lexically. Comparison is case sensitive.\n * Returns 1 when x > y, -1 when x < y, and 0 when x == y.\n *\n * For matrices, the function is evaluated element wise.\n *\n * Syntax:\n *\n * math.compareText(x, y)\n *\n * Examples:\n *\n * math.compareText('B', 'A') // returns 1\n * math.compareText('2', '10') // returns 1\n * math.compare('2', '10') // returns -1\n * math.compareNatural('2', '10') // returns -1\n *\n * math.compareText('B', ['A', 'B', 'C']) // returns [1, 0, -1]\n *\n * See also:\n *\n * equal, equalText, compare, compareNatural\n *\n * @param {string | Array | DenseMatrix} x First string to compare\n * @param {string | Array | DenseMatrix} y Second string to compare\n * @return {number | Array | DenseMatrix} Returns the result of the comparison:\n * 1 when x > y, -1 when x < y, and 0 when x == y.\n */\n return typed(name, _compareText, matrixAlgorithmSuite({\n elop: _compareText,\n Ds: true\n }));\n});\nexport var createCompareTextNumber = /* #__PURE__ */factory(name, ['typed'], _ref2 => {\n var {\n typed\n } = _ref2;\n return typed(name, _compareText);\n});","import { factory } from '../../utils/factory.js';\nimport { createMatAlgo03xDSf } from '../../type/matrix/utils/matAlgo03xDSf.js';\nimport { createMatAlgo07xSSf } from '../../type/matrix/utils/matAlgo07xSSf.js';\nimport { createMatAlgo12xSfs } from '../../type/matrix/utils/matAlgo12xSfs.js';\nimport { createMatrixAlgorithmSuite } from '../../type/matrix/utils/matrixAlgorithmSuite.js';\nvar name = 'equal';\nvar dependencies = ['typed', 'matrix', 'equalScalar', 'DenseMatrix', 'concat'];\nexport var createEqual = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n matrix,\n equalScalar,\n DenseMatrix,\n concat\n } = _ref;\n var matAlgo03xDSf = createMatAlgo03xDSf({\n typed\n });\n var matAlgo07xSSf = createMatAlgo07xSSf({\n typed,\n DenseMatrix\n });\n var matAlgo12xSfs = createMatAlgo12xSfs({\n typed,\n DenseMatrix\n });\n var matrixAlgorithmSuite = createMatrixAlgorithmSuite({\n typed,\n matrix,\n concat\n });\n\n /**\n * Test whether two values are equal.\n *\n * The function tests whether the relative difference between x and y is\n * smaller than the configured epsilon. The function cannot be used to\n * compare values smaller than approximately 2.22e-16.\n *\n * For matrices, the function is evaluated element wise.\n * In case of complex numbers, x.re must equal y.re, and x.im must equal y.im.\n *\n * Values `null` and `undefined` are compared strictly, thus `null` is only\n * equal to `null` and nothing else, and `undefined` is only equal to\n * `undefined` and nothing else. Strings are compared by their numerical value.\n *\n * Syntax:\n *\n * math.equal(x, y)\n *\n * Examples:\n *\n * math.equal(2 + 2, 3) // returns false\n * math.equal(2 + 2, 4) // returns true\n *\n * const a = math.unit('50 cm')\n * const b = math.unit('5 m')\n * math.equal(a, b) // returns true\n *\n * const c = [2, 5, 1]\n * const d = [2, 7, 1]\n *\n * math.equal(c, d) // returns [true, false, true]\n * math.deepEqual(c, d) // returns false\n *\n * math.equal(\"1000\", \"1e3\") // returns true\n * math.equal(0, null) // returns false\n *\n * See also:\n *\n * unequal, smaller, smallerEq, larger, largerEq, compare, deepEqual, equalText\n *\n * @param {number | BigNumber | boolean | Complex | Unit | string | Array | Matrix} x First value to compare\n * @param {number | BigNumber | boolean | Complex | Unit | string | Array | Matrix} y Second value to compare\n * @return {boolean | Array | Matrix} Returns true when the compared values are equal, else returns false\n */\n return typed(name, createEqualNumber({\n typed,\n equalScalar\n }), matrixAlgorithmSuite({\n elop: equalScalar,\n SS: matAlgo07xSSf,\n DS: matAlgo03xDSf,\n Ss: matAlgo12xSfs\n }));\n});\nexport var createEqualNumber = factory(name, ['typed', 'equalScalar'], _ref2 => {\n var {\n typed,\n equalScalar\n } = _ref2;\n return typed(name, {\n 'any, any': function anyAny(x, y) {\n // strict equality for null and undefined?\n if (x === null) {\n return y === null;\n }\n if (y === null) {\n return x === null;\n }\n if (x === undefined) {\n return y === undefined;\n }\n if (y === undefined) {\n return x === undefined;\n }\n return equalScalar(x, y);\n }\n });\n});","import { factory } from '../../utils/factory.js';\nvar name = 'equalText';\nvar dependencies = ['typed', 'compareText', 'isZero'];\nexport var createEqualText = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n compareText,\n isZero\n } = _ref;\n /**\n * Check equality of two strings. Comparison is case sensitive.\n *\n * For matrices, the function is evaluated element wise.\n *\n * Syntax:\n *\n * math.equalText(x, y)\n *\n * Examples:\n *\n * math.equalText('Hello', 'Hello') // returns true\n * math.equalText('a', 'A') // returns false\n * math.equal('2e3', '2000') // returns true\n * math.equalText('2e3', '2000') // returns false\n *\n * math.equalText('B', ['A', 'B', 'C']) // returns [false, true, false]\n *\n * See also:\n *\n * equal, compareText, compare, compareNatural\n *\n * @param {string | Array | DenseMatrix} x First string to compare\n * @param {string | Array | DenseMatrix} y Second string to compare\n * @return {number | Array | DenseMatrix} Returns true if the values are equal, and false if not.\n */\n return typed(name, {\n 'any, any': function anyAny(x, y) {\n return isZero(compareText(x, y));\n }\n });\n});","import { nearlyEqual as bigNearlyEqual } from '../../utils/bignumber/nearlyEqual.js';\nimport { nearlyEqual } from '../../utils/number.js';\nimport { factory } from '../../utils/factory.js';\nimport { createMatAlgo03xDSf } from '../../type/matrix/utils/matAlgo03xDSf.js';\nimport { createMatAlgo07xSSf } from '../../type/matrix/utils/matAlgo07xSSf.js';\nimport { createMatAlgo12xSfs } from '../../type/matrix/utils/matAlgo12xSfs.js';\nimport { createMatrixAlgorithmSuite } from '../../type/matrix/utils/matrixAlgorithmSuite.js';\nimport { createCompareUnits } from './compareUnits.js';\nvar name = 'smaller';\nvar dependencies = ['typed', 'config', 'matrix', 'DenseMatrix', 'concat'];\nexport var createSmaller = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n config,\n matrix,\n DenseMatrix,\n concat\n } = _ref;\n var matAlgo03xDSf = createMatAlgo03xDSf({\n typed\n });\n var matAlgo07xSSf = createMatAlgo07xSSf({\n typed,\n DenseMatrix\n });\n var matAlgo12xSfs = createMatAlgo12xSfs({\n typed,\n DenseMatrix\n });\n var matrixAlgorithmSuite = createMatrixAlgorithmSuite({\n typed,\n matrix,\n concat\n });\n var compareUnits = createCompareUnits({\n typed\n });\n\n /**\n * Test whether value x is smaller than y.\n *\n * The function returns true when x is smaller than y and the relative\n * difference between x and y is smaller than the configured epsilon. The\n * function cannot be used to compare values smaller than approximately 2.22e-16.\n *\n * For matrices, the function is evaluated element wise.\n * Strings are compared by their numerical value.\n *\n * Syntax:\n *\n * math.smaller(x, y)\n *\n * Examples:\n *\n * math.smaller(2, 3) // returns true\n * math.smaller(5, 2 * 2) // returns false\n *\n * const a = math.unit('5 cm')\n * const b = math.unit('2 inch')\n * math.smaller(a, b) // returns true\n *\n * See also:\n *\n * equal, unequal, smallerEq, smaller, smallerEq, compare\n *\n * @param {number | BigNumber | Fraction | boolean | Unit | string | Array | Matrix} x First value to compare\n * @param {number | BigNumber | Fraction | boolean | Unit | string | Array | Matrix} y Second value to compare\n * @return {boolean | Array | Matrix} Returns true when the x is smaller than y, else returns false\n */\n return typed(name, createSmallerNumber({\n typed,\n config\n }), {\n 'boolean, boolean': (x, y) => x < y,\n 'BigNumber, BigNumber': function BigNumberBigNumber(x, y) {\n return x.lt(y) && !bigNearlyEqual(x, y, config.epsilon);\n },\n 'Fraction, Fraction': (x, y) => x.compare(y) === -1,\n 'Complex, Complex': function ComplexComplex(x, y) {\n throw new TypeError('No ordering relation is defined for complex numbers');\n }\n }, compareUnits, matrixAlgorithmSuite({\n SS: matAlgo07xSSf,\n DS: matAlgo03xDSf,\n Ss: matAlgo12xSfs\n }));\n});\nexport var createSmallerNumber = /* #__PURE__ */factory(name, ['typed', 'config'], _ref2 => {\n var {\n typed,\n config\n } = _ref2;\n return typed(name, {\n 'number, number': function numberNumber(x, y) {\n return x < y && !nearlyEqual(x, y, config.epsilon);\n }\n });\n});","import { nearlyEqual as bigNearlyEqual } from '../../utils/bignumber/nearlyEqual.js';\nimport { nearlyEqual } from '../../utils/number.js';\nimport { factory } from '../../utils/factory.js';\nimport { createMatAlgo03xDSf } from '../../type/matrix/utils/matAlgo03xDSf.js';\nimport { createMatAlgo07xSSf } from '../../type/matrix/utils/matAlgo07xSSf.js';\nimport { createMatAlgo12xSfs } from '../../type/matrix/utils/matAlgo12xSfs.js';\nimport { createMatrixAlgorithmSuite } from '../../type/matrix/utils/matrixAlgorithmSuite.js';\nimport { createCompareUnits } from './compareUnits.js';\nvar name = 'smallerEq';\nvar dependencies = ['typed', 'config', 'matrix', 'DenseMatrix', 'concat'];\nexport var createSmallerEq = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n config,\n matrix,\n DenseMatrix,\n concat\n } = _ref;\n var matAlgo03xDSf = createMatAlgo03xDSf({\n typed\n });\n var matAlgo07xSSf = createMatAlgo07xSSf({\n typed,\n DenseMatrix\n });\n var matAlgo12xSfs = createMatAlgo12xSfs({\n typed,\n DenseMatrix\n });\n var matrixAlgorithmSuite = createMatrixAlgorithmSuite({\n typed,\n matrix,\n concat\n });\n var compareUnits = createCompareUnits({\n typed\n });\n\n /**\n * Test whether value x is smaller or equal to y.\n *\n * The function returns true when x is smaller than y or the relative\n * difference between x and y is smaller than the configured epsilon. The\n * function cannot be used to compare values smaller than approximately 2.22e-16.\n *\n * For matrices, the function is evaluated element wise.\n * Strings are compared by their numerical value.\n *\n * Syntax:\n *\n * math.smallerEq(x, y)\n *\n * Examples:\n *\n * math.smaller(1 + 2, 3) // returns false\n * math.smallerEq(1 + 2, 3) // returns true\n *\n * See also:\n *\n * equal, unequal, smaller, larger, largerEq, compare\n *\n * @param {number | BigNumber | Fraction | boolean | Unit | string | Array | Matrix} x First value to compare\n * @param {number | BigNumber | Fraction | boolean | Unit | string | Array | Matrix} y Second value to compare\n * @return {boolean | Array | Matrix} Returns true when the x is smaller than y, else returns false\n */\n return typed(name, createSmallerEqNumber({\n typed,\n config\n }), {\n 'boolean, boolean': (x, y) => x <= y,\n 'BigNumber, BigNumber': function BigNumberBigNumber(x, y) {\n return x.lte(y) || bigNearlyEqual(x, y, config.epsilon);\n },\n 'Fraction, Fraction': (x, y) => x.compare(y) !== 1,\n 'Complex, Complex': function ComplexComplex() {\n throw new TypeError('No ordering relation is defined for complex numbers');\n }\n }, compareUnits, matrixAlgorithmSuite({\n SS: matAlgo07xSSf,\n DS: matAlgo03xDSf,\n Ss: matAlgo12xSfs\n }));\n});\nexport var createSmallerEqNumber = /* #__PURE__ */factory(name, ['typed', 'config'], _ref2 => {\n var {\n typed,\n config\n } = _ref2;\n return typed(name, {\n 'number, number': function numberNumber(x, y) {\n return x <= y || nearlyEqual(x, y, config.epsilon);\n }\n });\n});","import { nearlyEqual as bigNearlyEqual } from '../../utils/bignumber/nearlyEqual.js';\nimport { nearlyEqual } from '../../utils/number.js';\nimport { factory } from '../../utils/factory.js';\nimport { createMatAlgo03xDSf } from '../../type/matrix/utils/matAlgo03xDSf.js';\nimport { createMatAlgo07xSSf } from '../../type/matrix/utils/matAlgo07xSSf.js';\nimport { createMatAlgo12xSfs } from '../../type/matrix/utils/matAlgo12xSfs.js';\nimport { createMatrixAlgorithmSuite } from '../../type/matrix/utils/matrixAlgorithmSuite.js';\nimport { createCompareUnits } from './compareUnits.js';\nvar name = 'larger';\nvar dependencies = ['typed', 'config', 'matrix', 'DenseMatrix', 'concat'];\nexport var createLarger = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n config,\n matrix,\n DenseMatrix,\n concat\n } = _ref;\n var matAlgo03xDSf = createMatAlgo03xDSf({\n typed\n });\n var matAlgo07xSSf = createMatAlgo07xSSf({\n typed,\n DenseMatrix\n });\n var matAlgo12xSfs = createMatAlgo12xSfs({\n typed,\n DenseMatrix\n });\n var matrixAlgorithmSuite = createMatrixAlgorithmSuite({\n typed,\n matrix,\n concat\n });\n var compareUnits = createCompareUnits({\n typed\n });\n\n /**\n * Test whether value x is larger than y.\n *\n * The function returns true when x is larger than y and the relative\n * difference between x and y is larger than the configured epsilon. The\n * function cannot be used to compare values smaller than approximately 2.22e-16.\n *\n * For matrices, the function is evaluated element wise.\n * Strings are compared by their numerical value.\n *\n * Syntax:\n *\n * math.larger(x, y)\n *\n * Examples:\n *\n * math.larger(2, 3) // returns false\n * math.larger(5, 2 + 2) // returns true\n *\n * const a = math.unit('5 cm')\n * const b = math.unit('2 inch')\n * math.larger(a, b) // returns false\n *\n * See also:\n *\n * equal, unequal, smaller, smallerEq, largerEq, compare\n *\n * @param {number | BigNumber | Fraction | boolean | Unit | string | Array | Matrix} x First value to compare\n * @param {number | BigNumber | Fraction | boolean | Unit | string | Array | Matrix} y Second value to compare\n * @return {boolean | Array | Matrix} Returns true when the x is larger than y, else returns false\n */\n return typed(name, createLargerNumber({\n typed,\n config\n }), {\n 'boolean, boolean': (x, y) => x > y,\n 'BigNumber, BigNumber': function BigNumberBigNumber(x, y) {\n return x.gt(y) && !bigNearlyEqual(x, y, config.epsilon);\n },\n 'Fraction, Fraction': (x, y) => x.compare(y) === 1,\n 'Complex, Complex': function ComplexComplex() {\n throw new TypeError('No ordering relation is defined for complex numbers');\n }\n }, compareUnits, matrixAlgorithmSuite({\n SS: matAlgo07xSSf,\n DS: matAlgo03xDSf,\n Ss: matAlgo12xSfs\n }));\n});\nexport var createLargerNumber = /* #__PURE__ */factory(name, ['typed', 'config'], _ref2 => {\n var {\n typed,\n config\n } = _ref2;\n return typed(name, {\n 'number, number': function numberNumber(x, y) {\n return x > y && !nearlyEqual(x, y, config.epsilon);\n }\n });\n});","import { nearlyEqual as bigNearlyEqual } from '../../utils/bignumber/nearlyEqual.js';\nimport { nearlyEqual } from '../../utils/number.js';\nimport { factory } from '../../utils/factory.js';\nimport { createMatAlgo03xDSf } from '../../type/matrix/utils/matAlgo03xDSf.js';\nimport { createMatAlgo07xSSf } from '../../type/matrix/utils/matAlgo07xSSf.js';\nimport { createMatAlgo12xSfs } from '../../type/matrix/utils/matAlgo12xSfs.js';\nimport { createMatrixAlgorithmSuite } from '../../type/matrix/utils/matrixAlgorithmSuite.js';\nimport { createCompareUnits } from './compareUnits.js';\nvar name = 'largerEq';\nvar dependencies = ['typed', 'config', 'matrix', 'DenseMatrix', 'concat'];\nexport var createLargerEq = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n config,\n matrix,\n DenseMatrix,\n concat\n } = _ref;\n var matAlgo03xDSf = createMatAlgo03xDSf({\n typed\n });\n var matAlgo07xSSf = createMatAlgo07xSSf({\n typed,\n DenseMatrix\n });\n var matAlgo12xSfs = createMatAlgo12xSfs({\n typed,\n DenseMatrix\n });\n var matrixAlgorithmSuite = createMatrixAlgorithmSuite({\n typed,\n matrix,\n concat\n });\n var compareUnits = createCompareUnits({\n typed\n });\n\n /**\n * Test whether value x is larger or equal to y.\n *\n * The function returns true when x is larger than y or the relative\n * difference between x and y is smaller than the configured epsilon. The\n * function cannot be used to compare values smaller than approximately 2.22e-16.\n *\n * For matrices, the function is evaluated element wise.\n * Strings are compared by their numerical value.\n *\n * Syntax:\n *\n * math.largerEq(x, y)\n *\n * Examples:\n *\n * math.larger(2, 1 + 1) // returns false\n * math.largerEq(2, 1 + 1) // returns true\n *\n * See also:\n *\n * equal, unequal, smaller, smallerEq, larger, compare\n *\n * @param {number | BigNumber | Fraction | boolean | Unit | string | Array | Matrix} x First value to compare\n * @param {number | BigNumber | Fraction | boolean | Unit | string | Array | Matrix} y Second value to compare\n * @return {boolean | Array | Matrix} Returns true when the x is larger or equal to y, else returns false\n */\n return typed(name, createLargerEqNumber({\n typed,\n config\n }), {\n 'boolean, boolean': (x, y) => x >= y,\n 'BigNumber, BigNumber': function BigNumberBigNumber(x, y) {\n return x.gte(y) || bigNearlyEqual(x, y, config.epsilon);\n },\n 'Fraction, Fraction': (x, y) => x.compare(y) !== -1,\n 'Complex, Complex': function ComplexComplex() {\n throw new TypeError('No ordering relation is defined for complex numbers');\n }\n }, compareUnits, matrixAlgorithmSuite({\n SS: matAlgo07xSSf,\n DS: matAlgo03xDSf,\n Ss: matAlgo12xSfs\n }));\n});\nexport var createLargerEqNumber = /* #__PURE__ */factory(name, ['typed', 'config'], _ref2 => {\n var {\n typed,\n config\n } = _ref2;\n return typed(name, {\n 'number, number': function numberNumber(x, y) {\n return x >= y || nearlyEqual(x, y, config.epsilon);\n }\n });\n});","import { factory } from '../../utils/factory.js';\nvar name = 'deepEqual';\nvar dependencies = ['typed', 'equal'];\nexport var createDeepEqual = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n equal\n } = _ref;\n /**\n * Test element wise whether two matrices are equal.\n * The function accepts both matrices and scalar values.\n *\n * Strings are compared by their numerical value.\n *\n * Syntax:\n *\n * math.deepEqual(x, y)\n *\n * Examples:\n *\n * math.deepEqual(2, 4) // returns false\n *\n * a = [2, 5, 1]\n * b = [2, 7, 1]\n *\n * math.deepEqual(a, b) // returns false\n * math.equal(a, b) // returns [true, false, true]\n *\n * See also:\n *\n * equal, unequal\n *\n * @param {number | BigNumber | Fraction | Complex | Unit | Array | Matrix} x First matrix to compare\n * @param {number | BigNumber | Fraction | Complex | Unit | Array | Matrix} y Second matrix to compare\n * @return {number | BigNumber | Fraction | Complex | Unit | Array | Matrix}\n * Returns true when the input matrices have the same size and each of their elements is equal.\n */\n return typed(name, {\n 'any, any': function anyAny(x, y) {\n return _deepEqual(x.valueOf(), y.valueOf());\n }\n });\n\n /**\n * Test whether two arrays have the same size and all elements are equal\n * @param {Array | *} x\n * @param {Array | *} y\n * @return {boolean} Returns true if both arrays are deep equal\n */\n function _deepEqual(x, y) {\n if (Array.isArray(x)) {\n if (Array.isArray(y)) {\n var len = x.length;\n if (len !== y.length) {\n return false;\n }\n for (var i = 0; i < len; i++) {\n if (!_deepEqual(x[i], y[i])) {\n return false;\n }\n }\n return true;\n } else {\n return false;\n }\n } else {\n if (Array.isArray(y)) {\n return false;\n } else {\n return equal(x, y);\n }\n }\n }\n});","import { factory } from '../../utils/factory.js';\nimport { createMatAlgo03xDSf } from '../../type/matrix/utils/matAlgo03xDSf.js';\nimport { createMatAlgo07xSSf } from '../../type/matrix/utils/matAlgo07xSSf.js';\nimport { createMatAlgo12xSfs } from '../../type/matrix/utils/matAlgo12xSfs.js';\nimport { createMatrixAlgorithmSuite } from '../../type/matrix/utils/matrixAlgorithmSuite.js';\nvar name = 'unequal';\nvar dependencies = ['typed', 'config', 'equalScalar', 'matrix', 'DenseMatrix', 'concat'];\nexport var createUnequal = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n config,\n equalScalar,\n matrix,\n DenseMatrix,\n concat\n } = _ref;\n var matAlgo03xDSf = createMatAlgo03xDSf({\n typed\n });\n var matAlgo07xSSf = createMatAlgo07xSSf({\n typed,\n DenseMatrix\n });\n var matAlgo12xSfs = createMatAlgo12xSfs({\n typed,\n DenseMatrix\n });\n var matrixAlgorithmSuite = createMatrixAlgorithmSuite({\n typed,\n matrix,\n concat\n });\n\n /**\n * Test whether two values are unequal.\n *\n * The function tests whether the relative difference between x and y is\n * larger than the configured epsilon. The function cannot be used to compare\n * values smaller than approximately 2.22e-16.\n *\n * For matrices, the function is evaluated element wise.\n * In case of complex numbers, x.re must unequal y.re, or x.im must unequal y.im.\n * Strings are compared by their numerical value.\n *\n * Values `null` and `undefined` are compared strictly, thus `null` is unequal\n * with everything except `null`, and `undefined` is unequal with everything\n * except `undefined`.\n *\n * Syntax:\n *\n * math.unequal(x, y)\n *\n * Examples:\n *\n * math.unequal(2 + 2, 3) // returns true\n * math.unequal(2 + 2, 4) // returns false\n *\n * const a = math.unit('50 cm')\n * const b = math.unit('5 m')\n * math.unequal(a, b) // returns false\n *\n * const c = [2, 5, 1]\n * const d = [2, 7, 1]\n *\n * math.unequal(c, d) // returns [false, true, false]\n * math.deepEqual(c, d) // returns false\n *\n * math.unequal(0, null) // returns true\n * See also:\n *\n * equal, deepEqual, smaller, smallerEq, larger, largerEq, compare\n *\n * @param {number | BigNumber | Fraction | boolean | Complex | Unit | string | Array | Matrix | undefined} x First value to compare\n * @param {number | BigNumber | Fraction | boolean | Complex | Unit | string | Array | Matrix | undefined} y Second value to compare\n * @return {boolean | Array | Matrix} Returns true when the compared values are unequal, else returns false\n */\n return typed(name, createUnequalNumber({\n typed,\n equalScalar\n }), matrixAlgorithmSuite({\n elop: _unequal,\n SS: matAlgo07xSSf,\n DS: matAlgo03xDSf,\n Ss: matAlgo12xSfs\n }));\n function _unequal(x, y) {\n return !equalScalar(x, y);\n }\n});\nexport var createUnequalNumber = factory(name, ['typed', 'equalScalar'], _ref2 => {\n var {\n typed,\n equalScalar\n } = _ref2;\n return typed(name, {\n 'any, any': function anyAny(x, y) {\n // strict equality for null and undefined?\n if (x === null) {\n return y !== null;\n }\n if (y === null) {\n return x !== null;\n }\n if (x === undefined) {\n return y !== undefined;\n }\n if (y === undefined) {\n return x !== undefined;\n }\n return !equalScalar(x, y);\n }\n });\n});","import { isMatrix } from '../../utils/is.js';\nimport { isInteger } from '../../utils/number.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'partitionSelect';\nvar dependencies = ['typed', 'isNumeric', 'isNaN', 'compare'];\nexport var createPartitionSelect = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n isNumeric,\n isNaN,\n compare\n } = _ref;\n var asc = compare;\n var desc = (a, b) => -compare(a, b);\n\n /**\n * Partition-based selection of an array or 1D matrix.\n * Will find the kth smallest value, and mutates the input array.\n * Uses Quickselect.\n *\n * Syntax:\n *\n * math.partitionSelect(x, k)\n * math.partitionSelect(x, k, compare)\n *\n * Examples:\n *\n * math.partitionSelect([5, 10, 1], 2) // returns 10\n * math.partitionSelect(['C', 'B', 'A', 'D'], 1, math.compareText) // returns 'B'\n *\n * function sortByLength (a, b) {\n * return a.length - b.length\n * }\n * math.partitionSelect(['Langdon', 'Tom', 'Sara'], 2, sortByLength) // returns 'Langdon'\n *\n * // the input array is mutated\n * arr = [5, 2, 1]\n * math.partitionSelect(arr, 0) // returns 1, arr is now: [1, 2, 5]\n * math.partitionSelect(arr, 1, 'desc') // returns 2, arr is now: [5, 2, 1]\n *\n * See also:\n *\n * sort\n *\n * @param {Matrix | Array} x A one dimensional matrix or array to sort\n * @param {Number} k The kth smallest value to be retrieved zero-based index\n * @param {Function | 'asc' | 'desc'} [compare='asc']\n * An optional comparator function. The function is called as\n * `compare(a, b)`, and must return 1 when a > b, -1 when a < b,\n * and 0 when a == b.\n * @return {*} Returns the kth lowest value.\n */\n return typed(name, {\n 'Array | Matrix, number': function ArrayMatrixNumber(x, k) {\n return _partitionSelect(x, k, asc);\n },\n 'Array | Matrix, number, string': function ArrayMatrixNumberString(x, k, compare) {\n if (compare === 'asc') {\n return _partitionSelect(x, k, asc);\n } else if (compare === 'desc') {\n return _partitionSelect(x, k, desc);\n } else {\n throw new Error('Compare string must be \"asc\" or \"desc\"');\n }\n },\n 'Array | Matrix, number, function': _partitionSelect\n });\n function _partitionSelect(x, k, compare) {\n if (!isInteger(k) || k < 0) {\n throw new Error('k must be a non-negative integer');\n }\n if (isMatrix(x)) {\n var size = x.size();\n if (size.length > 1) {\n throw new Error('Only one dimensional matrices supported');\n }\n return quickSelect(x.valueOf(), k, compare);\n }\n if (Array.isArray(x)) {\n return quickSelect(x, k, compare);\n }\n }\n\n /**\n * Quickselect algorithm.\n * Code adapted from:\n * https://blog.teamleadnet.com/2012/07/quick-select-algorithm-find-kth-element.html\n *\n * @param {Array} arr\n * @param {Number} k\n * @param {Function} compare\n * @private\n */\n function quickSelect(arr, k, compare) {\n if (k >= arr.length) {\n throw new Error('k out of bounds');\n }\n\n // check for NaN values since these can cause an infinite while loop\n for (var i = 0; i < arr.length; i++) {\n if (isNumeric(arr[i]) && isNaN(arr[i])) {\n return arr[i]; // return NaN\n }\n }\n\n var from = 0;\n var to = arr.length - 1;\n\n // if from == to we reached the kth element\n while (from < to) {\n var r = from;\n var w = to;\n var pivot = arr[Math.floor(Math.random() * (to - from + 1)) + from];\n\n // stop if the reader and writer meets\n while (r < w) {\n // arr[r] >= pivot\n if (compare(arr[r], pivot) >= 0) {\n // put the large values at the end\n var tmp = arr[w];\n arr[w] = arr[r];\n arr[r] = tmp;\n --w;\n } else {\n // the value is smaller than the pivot, skip\n ++r;\n }\n }\n\n // if we stepped up (r++) we need to step one down (arr[r] > pivot)\n if (compare(arr[r], pivot) > 0) {\n --r;\n }\n\n // the r pointer is on the end of the first k elements\n if (k <= r) {\n to = r;\n } else {\n from = r + 1;\n }\n }\n return arr[k];\n }\n});","import { arraySize as size } from '../../utils/array.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'sort';\nvar dependencies = ['typed', 'matrix', 'compare', 'compareNatural'];\nexport var createSort = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n matrix,\n compare,\n compareNatural\n } = _ref;\n var compareAsc = compare;\n var compareDesc = (a, b) => -compare(a, b);\n\n /**\n * Sort the items in a matrix.\n *\n * Syntax:\n *\n * math.sort(x)\n * math.sort(x, compare)\n *\n * Examples:\n *\n * math.sort([5, 10, 1]) // returns [1, 5, 10]\n * math.sort(['C', 'B', 'A', 'D'], math.compareNatural)\n * // returns ['A', 'B', 'C', 'D']\n *\n * function sortByLength (a, b) {\n * return a.length - b.length\n * }\n * math.sort(['Langdon', 'Tom', 'Sara'], sortByLength)\n * // returns ['Tom', 'Sara', 'Langdon']\n *\n * See also:\n *\n * filter, forEach, map, compare, compareNatural\n *\n * @param {Matrix | Array} x A one dimensional matrix or array to sort\n * @param {Function | 'asc' | 'desc' | 'natural'} [compare='asc']\n * An optional _comparator function or name. The function is called as\n * `compare(a, b)`, and must return 1 when a > b, -1 when a < b,\n * and 0 when a == b.\n * @return {Matrix | Array} Returns the sorted matrix.\n */\n return typed(name, {\n Array: function Array(x) {\n _arrayIsVector(x);\n return x.sort(compareAsc);\n },\n Matrix: function Matrix(x) {\n _matrixIsVector(x);\n return matrix(x.toArray().sort(compareAsc), x.storage());\n },\n 'Array, function': function ArrayFunction(x, _comparator) {\n _arrayIsVector(x);\n return x.sort(_comparator);\n },\n 'Matrix, function': function MatrixFunction(x, _comparator) {\n _matrixIsVector(x);\n return matrix(x.toArray().sort(_comparator), x.storage());\n },\n 'Array, string': function ArrayString(x, order) {\n _arrayIsVector(x);\n return x.sort(_comparator(order));\n },\n 'Matrix, string': function MatrixString(x, order) {\n _matrixIsVector(x);\n return matrix(x.toArray().sort(_comparator(order)), x.storage());\n }\n });\n\n /**\n * Get the comparator for given order ('asc', 'desc', 'natural')\n * @param {'asc' | 'desc' | 'natural'} order\n * @return {Function} Returns a _comparator function\n */\n function _comparator(order) {\n if (order === 'asc') {\n return compareAsc;\n } else if (order === 'desc') {\n return compareDesc;\n } else if (order === 'natural') {\n return compareNatural;\n } else {\n throw new Error('String \"asc\", \"desc\", or \"natural\" expected');\n }\n }\n\n /**\n * Validate whether an array is one dimensional\n * Throws an error when this is not the case\n * @param {Array} array\n * @private\n */\n function _arrayIsVector(array) {\n if (size(array).length !== 1) {\n throw new Error('One dimensional array expected');\n }\n }\n\n /**\n * Validate whether a matrix is one dimensional\n * Throws an error when this is not the case\n * @param {Matrix} matrix\n * @private\n */\n function _matrixIsVector(matrix) {\n if (matrix.size().length !== 1) {\n throw new Error('One dimensional matrix expected');\n }\n }\n});","import { deepForEach, reduce, containsCollections } from '../../utils/collection.js';\nimport { factory } from '../../utils/factory.js';\nimport { improveErrorMessage } from './utils/improveErrorMessage.js';\nvar name = 'max';\nvar dependencies = ['typed', 'config', 'numeric', 'larger'];\nexport var createMax = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n config,\n numeric,\n larger\n } = _ref;\n /**\n * Compute the maximum value of a matrix or a list with values.\n * In case of a multidimensional array, the maximum of the flattened array\n * will be calculated. When `dim` is provided, the maximum over the selected\n * dimension will be calculated. Parameter `dim` is zero-based.\n *\n * Syntax:\n *\n * math.max(a, b, c, ...)\n * math.max(A)\n * math.max(A, dimension)\n *\n * Examples:\n *\n * math.max(2, 1, 4, 3) // returns 4\n * math.max([2, 1, 4, 3]) // returns 4\n *\n * // maximum over a specified dimension (zero-based)\n * math.max([[2, 5], [4, 3], [1, 7]], 0) // returns [4, 7]\n * math.max([[2, 5], [4, 3], [1, 7]], 1) // returns [5, 4, 7]\n *\n * math.max(2.7, 7.1, -4.5, 2.0, 4.1) // returns 7.1\n * math.min(2.7, 7.1, -4.5, 2.0, 4.1) // returns -4.5\n *\n * See also:\n *\n * mean, median, min, prod, std, sum, variance\n *\n * @param {... *} args A single matrix or or multiple scalar values\n * @return {*} The maximum value\n */\n return typed(name, {\n // max([a, b, c, d, ...])\n 'Array | Matrix': _max,\n // max([a, b, c, d, ...], dim)\n 'Array | Matrix, number | BigNumber': function ArrayMatrixNumberBigNumber(array, dim) {\n return reduce(array, dim.valueOf(), _largest);\n },\n // max(a, b, c, d, ...)\n '...': function _(args) {\n if (containsCollections(args)) {\n throw new TypeError('Scalar values expected in function max');\n }\n return _max(args);\n }\n });\n\n /**\n * Return the largest of two values\n * @param {*} x\n * @param {*} y\n * @returns {*} Returns x when x is largest, or y when y is largest\n * @private\n */\n function _largest(x, y) {\n try {\n return larger(x, y) ? x : y;\n } catch (err) {\n throw improveErrorMessage(err, 'max', y);\n }\n }\n\n /**\n * Recursively calculate the maximum value in an n-dimensional array\n * @param {Array} array\n * @return {number} max\n * @private\n */\n function _max(array) {\n var res;\n deepForEach(array, function (value) {\n try {\n if (isNaN(value) && typeof value === 'number') {\n res = NaN;\n } else if (res === undefined || larger(value, res)) {\n res = value;\n }\n } catch (err) {\n throw improveErrorMessage(err, 'max', value);\n }\n });\n if (res === undefined) {\n throw new Error('Cannot calculate max of an empty array');\n }\n\n // make sure returning numeric value: parse a string into a numeric value\n if (typeof res === 'string') {\n res = numeric(res, config.number);\n }\n return res;\n }\n});","import { containsCollections, deepForEach, reduce } from '../../utils/collection.js';\nimport { factory } from '../../utils/factory.js';\nimport { improveErrorMessage } from './utils/improveErrorMessage.js';\nvar name = 'min';\nvar dependencies = ['typed', 'config', 'numeric', 'smaller'];\nexport var createMin = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n config,\n numeric,\n smaller\n } = _ref;\n /**\n * Compute the minimum value of a matrix or a list of values.\n * In case of a multidimensional array, the minimum of the flattened array\n * will be calculated. When `dim` is provided, the minimum over the selected\n * dimension will be calculated. Parameter `dim` is zero-based.\n *\n * Syntax:\n *\n * math.min(a, b, c, ...)\n * math.min(A)\n * math.min(A, dimension)\n *\n * Examples:\n *\n * math.min(2, 1, 4, 3) // returns 1\n * math.min([2, 1, 4, 3]) // returns 1\n *\n * // minimum over a specified dimension (zero-based)\n * math.min([[2, 5], [4, 3], [1, 7]], 0) // returns [1, 3]\n * math.min([[2, 5], [4, 3], [1, 7]], 1) // returns [2, 3, 1]\n *\n * math.max(2.7, 7.1, -4.5, 2.0, 4.1) // returns 7.1\n * math.min(2.7, 7.1, -4.5, 2.0, 4.1) // returns -4.5\n *\n * See also:\n *\n * mean, median, max, prod, std, sum, variance\n *\n * @param {... *} args A single matrix or or multiple scalar values\n * @return {*} The minimum value\n */\n return typed(name, {\n // min([a, b, c, d, ...])\n 'Array | Matrix': _min,\n // min([a, b, c, d, ...], dim)\n 'Array | Matrix, number | BigNumber': function ArrayMatrixNumberBigNumber(array, dim) {\n return reduce(array, dim.valueOf(), _smallest);\n },\n // min(a, b, c, d, ...)\n '...': function _(args) {\n if (containsCollections(args)) {\n throw new TypeError('Scalar values expected in function min');\n }\n return _min(args);\n }\n });\n\n /**\n * Return the smallest of two values\n * @param {*} x\n * @param {*} y\n * @returns {*} Returns x when x is smallest, or y when y is smallest\n * @private\n */\n function _smallest(x, y) {\n try {\n return smaller(x, y) ? x : y;\n } catch (err) {\n throw improveErrorMessage(err, 'min', y);\n }\n }\n\n /**\n * Recursively calculate the minimum value in an n-dimensional array\n * @param {Array} array\n * @return {number} min\n * @private\n */\n function _min(array) {\n var min;\n deepForEach(array, function (value) {\n try {\n if (isNaN(value) && typeof value === 'number') {\n min = NaN;\n } else if (min === undefined || smaller(value, min)) {\n min = value;\n }\n } catch (err) {\n throw improveErrorMessage(err, 'min', value);\n }\n });\n if (min === undefined) {\n throw new Error('Cannot calculate min of an empty array');\n }\n\n // make sure returning numeric value: parse a string into a numeric value\n if (typeof min === 'string') {\n min = numeric(min, config.number);\n }\n return min;\n }\n});","import { isArray, isMatrix, isString, typeOf } from '../../utils/is.js';\nimport { clone } from '../../utils/object.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'ImmutableDenseMatrix';\nvar dependencies = ['smaller', 'DenseMatrix'];\nexport var createImmutableDenseMatrixClass = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n smaller,\n DenseMatrix\n } = _ref;\n function ImmutableDenseMatrix(data, datatype) {\n if (!(this instanceof ImmutableDenseMatrix)) {\n throw new SyntaxError('Constructor must be called with the new operator');\n }\n if (datatype && !isString(datatype)) {\n throw new Error('Invalid datatype: ' + datatype);\n }\n if (isMatrix(data) || isArray(data)) {\n // use DenseMatrix implementation\n var matrix = new DenseMatrix(data, datatype);\n // internal structures\n this._data = matrix._data;\n this._size = matrix._size;\n this._datatype = matrix._datatype;\n this._min = null;\n this._max = null;\n } else if (data && isArray(data.data) && isArray(data.size)) {\n // initialize fields from JSON representation\n this._data = data.data;\n this._size = data.size;\n this._datatype = data.datatype;\n this._min = typeof data.min !== 'undefined' ? data.min : null;\n this._max = typeof data.max !== 'undefined' ? data.max : null;\n } else if (data) {\n // unsupported type\n throw new TypeError('Unsupported type of data (' + typeOf(data) + ')');\n } else {\n // nothing provided\n this._data = [];\n this._size = [0];\n this._datatype = datatype;\n this._min = null;\n this._max = null;\n }\n }\n ImmutableDenseMatrix.prototype = new DenseMatrix();\n\n /**\n * Attach type information\n */\n ImmutableDenseMatrix.prototype.type = 'ImmutableDenseMatrix';\n ImmutableDenseMatrix.prototype.isImmutableDenseMatrix = true;\n\n /**\n * Get a subset of the matrix, or replace a subset of the matrix.\n *\n * Usage:\n * const subset = matrix.subset(index) // retrieve subset\n * const value = matrix.subset(index, replacement) // replace subset\n *\n * @param {Index} index\n * @param {Array | ImmutableDenseMatrix | *} [replacement]\n * @param {*} [defaultValue=0] Default value, filled in on new entries when\n * the matrix is resized. If not provided,\n * new matrix elements will be filled with zeros.\n */\n ImmutableDenseMatrix.prototype.subset = function (index) {\n switch (arguments.length) {\n case 1:\n {\n // use base implementation\n var m = DenseMatrix.prototype.subset.call(this, index);\n // check result is a matrix\n if (isMatrix(m)) {\n // return immutable matrix\n return new ImmutableDenseMatrix({\n data: m._data,\n size: m._size,\n datatype: m._datatype\n });\n }\n return m;\n }\n // intentional fall through\n case 2:\n case 3:\n throw new Error('Cannot invoke set subset on an Immutable Matrix instance');\n default:\n throw new SyntaxError('Wrong number of arguments');\n }\n };\n\n /**\n * Replace a single element in the matrix.\n * @param {Number[]} index Zero-based index\n * @param {*} value\n * @param {*} [defaultValue] Default value, filled in on new entries when\n * the matrix is resized. If not provided,\n * new matrix elements will be left undefined.\n * @return {ImmutableDenseMatrix} self\n */\n ImmutableDenseMatrix.prototype.set = function () {\n throw new Error('Cannot invoke set on an Immutable Matrix instance');\n };\n\n /**\n * Resize the matrix to the given size. Returns a copy of the matrix when\n * `copy=true`, otherwise return the matrix itself (resize in place).\n *\n * @param {Number[]} size The new size the matrix should have.\n * @param {*} [defaultValue=0] Default value, filled in on new entries.\n * If not provided, the matrix elements will\n * be filled with zeros.\n * @param {boolean} [copy] Return a resized copy of the matrix\n *\n * @return {Matrix} The resized matrix\n */\n ImmutableDenseMatrix.prototype.resize = function () {\n throw new Error('Cannot invoke resize on an Immutable Matrix instance');\n };\n\n /**\n * Disallows reshaping in favor of immutability.\n *\n * @throws {Error} Operation not allowed\n */\n ImmutableDenseMatrix.prototype.reshape = function () {\n throw new Error('Cannot invoke reshape on an Immutable Matrix instance');\n };\n\n /**\n * Create a clone of the matrix\n * @return {ImmutableDenseMatrix} clone\n */\n ImmutableDenseMatrix.prototype.clone = function () {\n return new ImmutableDenseMatrix({\n data: clone(this._data),\n size: clone(this._size),\n datatype: this._datatype\n });\n };\n\n /**\n * Get a JSON representation of the matrix\n * @returns {Object}\n */\n ImmutableDenseMatrix.prototype.toJSON = function () {\n return {\n mathjs: 'ImmutableDenseMatrix',\n data: this._data,\n size: this._size,\n datatype: this._datatype\n };\n };\n\n /**\n * Generate a matrix from a JSON object\n * @param {Object} json An object structured like\n * `{\"mathjs\": \"ImmutableDenseMatrix\", data: [], size: []}`,\n * where mathjs is optional\n * @returns {ImmutableDenseMatrix}\n */\n ImmutableDenseMatrix.fromJSON = function (json) {\n return new ImmutableDenseMatrix(json);\n };\n\n /**\n * Swap rows i and j in Matrix.\n *\n * @param {Number} i Matrix row index 1\n * @param {Number} j Matrix row index 2\n *\n * @return {Matrix} The matrix reference\n */\n ImmutableDenseMatrix.prototype.swapRows = function () {\n throw new Error('Cannot invoke swapRows on an Immutable Matrix instance');\n };\n\n /**\n * Calculate the minimum value in the set\n * @return {Number | undefined} min\n */\n ImmutableDenseMatrix.prototype.min = function () {\n // check min has been calculated before\n if (this._min === null) {\n // minimum\n var m = null;\n // compute min\n this.forEach(function (v) {\n if (m === null || smaller(v, m)) {\n m = v;\n }\n });\n this._min = m !== null ? m : undefined;\n }\n return this._min;\n };\n\n /**\n * Calculate the maximum value in the set\n * @return {Number | undefined} max\n */\n ImmutableDenseMatrix.prototype.max = function () {\n // check max has been calculated before\n if (this._max === null) {\n // maximum\n var m = null;\n // compute max\n this.forEach(function (v) {\n if (m === null || smaller(m, v)) {\n m = v;\n }\n });\n this._max = m !== null ? m : undefined;\n }\n return this._max;\n };\n return ImmutableDenseMatrix;\n}, {\n isClass: true\n});","import { isMatrix, isRange } from '../../utils/is.js';\nimport { clone } from '../../utils/object.js';\nimport { isInteger } from '../../utils/number.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'Index';\nvar dependencies = ['ImmutableDenseMatrix'];\nexport var createIndexClass = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n ImmutableDenseMatrix\n } = _ref;\n /**\n * Create an index. An Index can store ranges and sets for multiple dimensions.\n * Matrix.get, Matrix.set, and math.subset accept an Index as input.\n *\n * Usage:\n * const index = new Index(range1, range2, matrix1, array1, ...)\n *\n * Where each parameter can be any of:\n * A number\n * A string (containing a name of an object property)\n * An instance of Range\n * An Array with the Set values\n * A Matrix with the Set values\n *\n * The parameters start, end, and step must be integer numbers.\n *\n * @class Index\n * @Constructor Index\n * @param {...*} ranges\n */\n function Index(ranges) {\n if (!(this instanceof Index)) {\n throw new SyntaxError('Constructor must be called with the new operator');\n }\n this._dimensions = [];\n this._isScalar = true;\n for (var i = 0, ii = arguments.length; i < ii; i++) {\n var arg = arguments[i];\n if (isRange(arg)) {\n this._dimensions.push(arg);\n this._isScalar = false;\n } else if (Array.isArray(arg) || isMatrix(arg)) {\n // create matrix\n var m = _createImmutableMatrix(arg.valueOf());\n this._dimensions.push(m);\n // size\n var size = m.size();\n // scalar\n if (size.length !== 1 || size[0] !== 1) {\n this._isScalar = false;\n }\n } else if (typeof arg === 'number') {\n this._dimensions.push(_createImmutableMatrix([arg]));\n } else if (typeof arg === 'string') {\n // object property (arguments.count should be 1)\n this._dimensions.push(arg);\n } else {\n throw new TypeError('Dimension must be an Array, Matrix, number, string, or Range');\n }\n // TODO: implement support for wildcard '*'\n }\n }\n\n /**\n * Attach type information\n */\n Index.prototype.type = 'Index';\n Index.prototype.isIndex = true;\n function _createImmutableMatrix(arg) {\n // loop array elements\n for (var i = 0, l = arg.length; i < l; i++) {\n if (typeof arg[i] !== 'number' || !isInteger(arg[i])) {\n throw new TypeError('Index parameters must be positive integer numbers');\n }\n }\n // create matrix\n return new ImmutableDenseMatrix(arg);\n }\n\n /**\n * Create a clone of the index\n * @memberof Index\n * @return {Index} clone\n */\n Index.prototype.clone = function () {\n var index = new Index();\n index._dimensions = clone(this._dimensions);\n index._isScalar = this._isScalar;\n return index;\n };\n\n /**\n * Create an index from an array with ranges/numbers\n * @memberof Index\n * @param {Array.} ranges\n * @return {Index} index\n * @private\n */\n Index.create = function (ranges) {\n var index = new Index();\n Index.apply(index, ranges);\n return index;\n };\n\n /**\n * Retrieve the size of the index, the number of elements for each dimension.\n * @memberof Index\n * @returns {number[]} size\n */\n Index.prototype.size = function () {\n var size = [];\n for (var i = 0, ii = this._dimensions.length; i < ii; i++) {\n var d = this._dimensions[i];\n size[i] = typeof d === 'string' ? 1 : d.size()[0];\n }\n return size;\n };\n\n /**\n * Get the maximum value for each of the indexes ranges.\n * @memberof Index\n * @returns {number[]} max\n */\n Index.prototype.max = function () {\n var values = [];\n for (var i = 0, ii = this._dimensions.length; i < ii; i++) {\n var range = this._dimensions[i];\n values[i] = typeof range === 'string' ? range : range.max();\n }\n return values;\n };\n\n /**\n * Get the minimum value for each of the indexes ranges.\n * @memberof Index\n * @returns {number[]} min\n */\n Index.prototype.min = function () {\n var values = [];\n for (var i = 0, ii = this._dimensions.length; i < ii; i++) {\n var range = this._dimensions[i];\n values[i] = typeof range === 'string' ? range : range.min();\n }\n return values;\n };\n\n /**\n * Loop over each of the ranges of the index\n * @memberof Index\n * @param {Function} callback Called for each range with a Range as first\n * argument, the dimension as second, and the\n * index object as third.\n */\n Index.prototype.forEach = function (callback) {\n for (var i = 0, ii = this._dimensions.length; i < ii; i++) {\n callback(this._dimensions[i], i, this);\n }\n };\n\n /**\n * Retrieve the dimension for the given index\n * @memberof Index\n * @param {Number} dim Number of the dimension\n * @returns {Range | null} range\n */\n Index.prototype.dimension = function (dim) {\n return this._dimensions[dim] || null;\n };\n\n /**\n * Test whether this index contains an object property\n * @returns {boolean} Returns true if the index is an object property\n */\n Index.prototype.isObjectProperty = function () {\n return this._dimensions.length === 1 && typeof this._dimensions[0] === 'string';\n };\n\n /**\n * Returns the object property name when the Index holds a single object property,\n * else returns null\n * @returns {string | null}\n */\n Index.prototype.getObjectProperty = function () {\n return this.isObjectProperty() ? this._dimensions[0] : null;\n };\n\n /**\n * Test whether this index contains only a single value.\n *\n * This is the case when the index is created with only scalar values as ranges,\n * not for ranges resolving into a single value.\n * @memberof Index\n * @return {boolean} isScalar\n */\n Index.prototype.isScalar = function () {\n return this._isScalar;\n };\n\n /**\n * Expand the Index into an array.\n * For example new Index([0,3], [2,7]) returns [[0,1,2], [2,3,4,5,6]]\n * @memberof Index\n * @returns {Array} array\n */\n Index.prototype.toArray = function () {\n var array = [];\n for (var i = 0, ii = this._dimensions.length; i < ii; i++) {\n var dimension = this._dimensions[i];\n array.push(typeof dimension === 'string' ? dimension : dimension.toArray());\n }\n return array;\n };\n\n /**\n * Get the primitive value of the Index, a two dimensional array.\n * Equivalent to Index.toArray().\n * @memberof Index\n * @returns {Array} array\n */\n Index.prototype.valueOf = Index.prototype.toArray;\n\n /**\n * Get the string representation of the index, for example '[2:6]' or '[0:2:10, 4:7, [1,2,3]]'\n * @memberof Index\n * @returns {String} str\n */\n Index.prototype.toString = function () {\n var strings = [];\n for (var i = 0, ii = this._dimensions.length; i < ii; i++) {\n var dimension = this._dimensions[i];\n if (typeof dimension === 'string') {\n strings.push(JSON.stringify(dimension));\n } else {\n strings.push(dimension.toString());\n }\n }\n return '[' + strings.join(', ') + ']';\n };\n\n /**\n * Get a JSON representation of the Index\n * @memberof Index\n * @returns {Object} Returns a JSON object structured as:\n * `{\"mathjs\": \"Index\", \"ranges\": [{\"mathjs\": \"Range\", start: 0, end: 10, step:1}, ...]}`\n */\n Index.prototype.toJSON = function () {\n return {\n mathjs: 'Index',\n dimensions: this._dimensions\n };\n };\n\n /**\n * Instantiate an Index from a JSON object\n * @memberof Index\n * @param {Object} json A JSON object structured as:\n * `{\"mathjs\": \"Index\", \"dimensions\": [{\"mathjs\": \"Range\", start: 0, end: 10, step:1}, ...]}`\n * @return {Index}\n */\n Index.fromJSON = function (json) {\n return Index.create(json.dimensions);\n };\n return Index;\n}, {\n isClass: true\n});","import { factory } from '../../utils/factory.js';\nvar name = 'FibonacciHeap';\nvar dependencies = ['smaller', 'larger'];\nexport var createFibonacciHeapClass = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n smaller,\n larger\n } = _ref;\n var oneOverLogPhi = 1.0 / Math.log((1.0 + Math.sqrt(5.0)) / 2.0);\n\n /**\n * Fibonacci Heap implementation, used interally for Matrix math.\n * @class FibonacciHeap\n * @constructor FibonacciHeap\n */\n function FibonacciHeap() {\n if (!(this instanceof FibonacciHeap)) {\n throw new SyntaxError('Constructor must be called with the new operator');\n }\n\n // initialize fields\n this._minimum = null;\n this._size = 0;\n }\n\n /**\n * Attach type information\n */\n FibonacciHeap.prototype.type = 'FibonacciHeap';\n FibonacciHeap.prototype.isFibonacciHeap = true;\n\n /**\n * Inserts a new data element into the heap. No heap consolidation is\n * performed at this time, the new node is simply inserted into the root\n * list of this heap. Running time: O(1) actual.\n * @memberof FibonacciHeap\n */\n FibonacciHeap.prototype.insert = function (key, value) {\n // create node\n var node = {\n key,\n value,\n degree: 0\n };\n // check we have a node in the minimum\n if (this._minimum) {\n // minimum node\n var minimum = this._minimum;\n // update left & right of node\n node.left = minimum;\n node.right = minimum.right;\n minimum.right = node;\n node.right.left = node;\n // update minimum node in heap if needed\n if (smaller(key, minimum.key)) {\n // node has a smaller key, use it as minimum\n this._minimum = node;\n }\n } else {\n // set left & right\n node.left = node;\n node.right = node;\n // this is the first node\n this._minimum = node;\n }\n // increment number of nodes in heap\n this._size++;\n // return node\n return node;\n };\n\n /**\n * Returns the number of nodes in heap. Running time: O(1) actual.\n * @memberof FibonacciHeap\n */\n FibonacciHeap.prototype.size = function () {\n return this._size;\n };\n\n /**\n * Removes all elements from this heap.\n * @memberof FibonacciHeap\n */\n FibonacciHeap.prototype.clear = function () {\n this._minimum = null;\n this._size = 0;\n };\n\n /**\n * Returns true if the heap is empty, otherwise false.\n * @memberof FibonacciHeap\n */\n FibonacciHeap.prototype.isEmpty = function () {\n return this._size === 0;\n };\n\n /**\n * Extracts the node with minimum key from heap. Amortized running\n * time: O(log n).\n * @memberof FibonacciHeap\n */\n FibonacciHeap.prototype.extractMinimum = function () {\n // node to remove\n var node = this._minimum;\n // check we have a minimum\n if (node === null) {\n return node;\n }\n // current minimum\n var minimum = this._minimum;\n // get number of children\n var numberOfChildren = node.degree;\n // pointer to the first child\n var x = node.child;\n // for each child of node do...\n while (numberOfChildren > 0) {\n // store node in right side\n var tempRight = x.right;\n // remove x from child list\n x.left.right = x.right;\n x.right.left = x.left;\n // add x to root list of heap\n x.left = minimum;\n x.right = minimum.right;\n minimum.right = x;\n x.right.left = x;\n // set Parent[x] to null\n x.parent = null;\n x = tempRight;\n numberOfChildren--;\n }\n // remove node from root list of heap\n node.left.right = node.right;\n node.right.left = node.left;\n // update minimum\n if (node === node.right) {\n // empty\n minimum = null;\n } else {\n // update minimum\n minimum = node.right;\n // we need to update the pointer to the root with minimum key\n minimum = _findMinimumNode(minimum, this._size);\n }\n // decrement size of heap\n this._size--;\n // update minimum\n this._minimum = minimum;\n // return node\n return node;\n };\n\n /**\n * Removes a node from the heap given the reference to the node. The trees\n * in the heap will be consolidated, if necessary. This operation may fail\n * to remove the correct element if there are nodes with key value -Infinity.\n * Running time: O(log n) amortized.\n * @memberof FibonacciHeap\n */\n FibonacciHeap.prototype.remove = function (node) {\n // decrease key value\n this._minimum = _decreaseKey(this._minimum, node, -1);\n // remove the smallest\n this.extractMinimum();\n };\n\n /**\n * Decreases the key value for a heap node, given the new value to take on.\n * The structure of the heap may be changed and will not be consolidated.\n * Running time: O(1) amortized.\n * @memberof FibonacciHeap\n */\n function _decreaseKey(minimum, node, key) {\n // set node key\n node.key = key;\n // get parent node\n var parent = node.parent;\n if (parent && smaller(node.key, parent.key)) {\n // remove node from parent\n _cut(minimum, node, parent);\n // remove all nodes from parent to the root parent\n _cascadingCut(minimum, parent);\n }\n // update minimum node if needed\n if (smaller(node.key, minimum.key)) {\n minimum = node;\n }\n // return minimum\n return minimum;\n }\n\n /**\n * The reverse of the link operation: removes node from the child list of parent.\n * This method assumes that min is non-null. Running time: O(1).\n * @memberof FibonacciHeap\n */\n function _cut(minimum, node, parent) {\n // remove node from parent children and decrement Degree[parent]\n node.left.right = node.right;\n node.right.left = node.left;\n parent.degree--;\n // reset y.child if necessary\n if (parent.child === node) {\n parent.child = node.right;\n }\n // remove child if degree is 0\n if (parent.degree === 0) {\n parent.child = null;\n }\n // add node to root list of heap\n node.left = minimum;\n node.right = minimum.right;\n minimum.right = node;\n node.right.left = node;\n // set parent[node] to null\n node.parent = null;\n // set mark[node] to false\n node.mark = false;\n }\n\n /**\n * Performs a cascading cut operation. This cuts node from its parent and then\n * does the same for its parent, and so on up the tree.\n * Running time: O(log n); O(1) excluding the recursion.\n * @memberof FibonacciHeap\n */\n function _cascadingCut(minimum, node) {\n // store parent node\n var parent = node.parent;\n // if there's a parent...\n if (!parent) {\n return;\n }\n // if node is unmarked, set it marked\n if (!node.mark) {\n node.mark = true;\n } else {\n // it's marked, cut it from parent\n _cut(minimum, node, parent);\n // cut its parent as well\n _cascadingCut(parent);\n }\n }\n\n /**\n * Make the first node a child of the second one. Running time: O(1) actual.\n * @memberof FibonacciHeap\n */\n var _linkNodes = function _linkNodes(node, parent) {\n // remove node from root list of heap\n node.left.right = node.right;\n node.right.left = node.left;\n // make node a Child of parent\n node.parent = parent;\n if (!parent.child) {\n parent.child = node;\n node.right = node;\n node.left = node;\n } else {\n node.left = parent.child;\n node.right = parent.child.right;\n parent.child.right = node;\n node.right.left = node;\n }\n // increase degree[parent]\n parent.degree++;\n // set mark[node] false\n node.mark = false;\n };\n function _findMinimumNode(minimum, size) {\n // to find trees of the same degree efficiently we use an array of length O(log n) in which we keep a pointer to one root of each degree\n var arraySize = Math.floor(Math.log(size) * oneOverLogPhi) + 1;\n // create list with initial capacity\n var array = new Array(arraySize);\n // find the number of root nodes.\n var numRoots = 0;\n var x = minimum;\n if (x) {\n numRoots++;\n x = x.right;\n while (x !== minimum) {\n numRoots++;\n x = x.right;\n }\n }\n // vars\n var y;\n // For each node in root list do...\n while (numRoots > 0) {\n // access this node's degree..\n var d = x.degree;\n // get next node\n var next = x.right;\n // check if there is a node already in array with the same degree\n while (true) {\n // get node with the same degree is any\n y = array[d];\n if (!y) {\n break;\n }\n // make one node with the same degree a child of the other, do this based on the key value.\n if (larger(x.key, y.key)) {\n var temp = y;\n y = x;\n x = temp;\n }\n // make y a child of x\n _linkNodes(y, x);\n // we have handled this degree, go to next one.\n array[d] = null;\n d++;\n }\n // save this node for later when we might encounter another of the same degree.\n array[d] = x;\n // move forward through list.\n x = next;\n numRoots--;\n }\n // Set min to null (effectively losing the root list) and reconstruct the root list from the array entries in array[].\n minimum = null;\n // loop nodes in array\n for (var i = 0; i < arraySize; i++) {\n // get current node\n y = array[i];\n if (!y) {\n continue;\n }\n // check if we have a linked list\n if (minimum) {\n // First remove node from root list.\n y.left.right = y.right;\n y.right.left = y.left;\n // now add to root list, again.\n y.left = minimum;\n y.right = minimum.right;\n minimum.right = y;\n y.right.left = y;\n // check if this is a new min.\n if (smaller(y.key, minimum.key)) {\n minimum = y;\n }\n } else {\n minimum = y;\n }\n }\n return minimum;\n }\n return FibonacciHeap;\n}, {\n isClass: true\n});","import { factory } from '../../utils/factory.js';\nvar name = 'Spa';\nvar dependencies = ['addScalar', 'equalScalar', 'FibonacciHeap'];\nexport var createSpaClass = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n addScalar,\n equalScalar,\n FibonacciHeap\n } = _ref;\n /**\n * An ordered Sparse Accumulator is a representation for a sparse vector that includes a dense array\n * of the vector elements and an ordered list of non-zero elements.\n */\n function Spa() {\n if (!(this instanceof Spa)) {\n throw new SyntaxError('Constructor must be called with the new operator');\n }\n\n // allocate vector, TODO use typed arrays\n this._values = [];\n this._heap = new FibonacciHeap();\n }\n\n /**\n * Attach type information\n */\n Spa.prototype.type = 'Spa';\n Spa.prototype.isSpa = true;\n\n /**\n * Set the value for index i.\n *\n * @param {number} i The index\n * @param {number | BigNumber | Complex} The value at index i\n */\n Spa.prototype.set = function (i, v) {\n // check we have a value @ i\n if (!this._values[i]) {\n // insert in heap\n var node = this._heap.insert(i, v);\n // set the value @ i\n this._values[i] = node;\n } else {\n // update the value @ i\n this._values[i].value = v;\n }\n };\n Spa.prototype.get = function (i) {\n var node = this._values[i];\n if (node) {\n return node.value;\n }\n return 0;\n };\n Spa.prototype.accumulate = function (i, v) {\n // node @ i\n var node = this._values[i];\n if (!node) {\n // insert in heap\n node = this._heap.insert(i, v);\n // initialize value\n this._values[i] = node;\n } else {\n // accumulate value\n node.value = addScalar(node.value, v);\n }\n };\n Spa.prototype.forEach = function (from, to, callback) {\n // references\n var heap = this._heap;\n var values = this._values;\n // nodes\n var nodes = [];\n // node with minimum key, save it\n var node = heap.extractMinimum();\n if (node) {\n nodes.push(node);\n }\n // extract nodes from heap (ordered)\n while (node && node.key <= to) {\n // check it is in range\n if (node.key >= from) {\n // check value is not zero\n if (!equalScalar(node.value, 0)) {\n // invoke callback\n callback(node.key, node.value, this);\n }\n }\n // extract next node, save it\n node = heap.extractMinimum();\n if (node) {\n nodes.push(node);\n }\n }\n // reinsert all nodes in heap\n for (var i = 0; i < nodes.length; i++) {\n // current node\n var n = nodes[i];\n // insert node in heap\n node = heap.insert(n.key, n.value);\n // update values\n values[node.key] = node;\n }\n };\n Spa.prototype.swap = function (i, j) {\n // node @ i and j\n var nodei = this._values[i];\n var nodej = this._values[j];\n // check we need to insert indeces\n if (!nodei && nodej) {\n // insert in heap\n nodei = this._heap.insert(i, nodej.value);\n // remove from heap\n this._heap.remove(nodej);\n // set values\n this._values[i] = nodei;\n this._values[j] = undefined;\n } else if (nodei && !nodej) {\n // insert in heap\n nodej = this._heap.insert(j, nodei.value);\n // remove from heap\n this._heap.remove(nodei);\n // set values\n this._values[j] = nodej;\n this._values[i] = undefined;\n } else if (nodei && nodej) {\n // swap values\n var v = nodei.value;\n nodei.value = nodej.value;\n nodej.value = v;\n }\n };\n return Spa;\n}, {\n isClass: true\n});","import { memoize } from '../function.js';\n\n/**\n * Calculate BigNumber e\n * @param {function} BigNumber BigNumber constructor\n * @returns {BigNumber} Returns e\n */\nexport var createBigNumberE = memoize(function (BigNumber) {\n return new BigNumber(1).exp();\n}, {\n hasher\n});\n\n/**\n * Calculate BigNumber golden ratio, phi = (1+sqrt(5))/2\n * @param {function} BigNumber BigNumber constructor\n * @returns {BigNumber} Returns phi\n */\nexport var createBigNumberPhi = memoize(function (BigNumber) {\n return new BigNumber(1).plus(new BigNumber(5).sqrt()).div(2);\n}, {\n hasher\n});\n\n/**\n * Calculate BigNumber pi.\n * @param {function} BigNumber BigNumber constructor\n * @returns {BigNumber} Returns pi\n */\nexport var createBigNumberPi = memoize(function (BigNumber) {\n return BigNumber.acos(-1);\n}, {\n hasher\n});\n\n/**\n * Calculate BigNumber tau, tau = 2 * pi\n * @param {function} BigNumber BigNumber constructor\n * @returns {BigNumber} Returns tau\n */\nexport var createBigNumberTau = memoize(function (BigNumber) {\n return createBigNumberPi(BigNumber).times(2);\n}, {\n hasher\n});\n\n/**\n * Create a hash for a BigNumber constructor function. The created has is\n * the configured precision\n * @param {Array} args Supposed to contain a single entry with\n * a BigNumber constructor\n * @return {number} precision\n * @private\n */\nfunction hasher(args) {\n return args[0].precision;\n}","import _defineProperty from \"@babel/runtime/helpers/defineProperty\";\nimport _extends from \"@babel/runtime/helpers/extends\";\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nimport { isComplex, isUnit, typeOf } from '../../utils/is.js';\nimport { factory } from '../../utils/factory.js';\nimport { memoize } from '../../utils/function.js';\nimport { endsWith } from '../../utils/string.js';\nimport { clone, hasOwnProperty } from '../../utils/object.js';\nimport { createBigNumberPi as createPi } from '../../utils/bignumber/constants.js';\nvar name = 'Unit';\nvar dependencies = ['?on', 'config', 'addScalar', 'subtract', 'multiplyScalar', 'divideScalar', 'pow', 'abs', 'fix', 'round', 'equal', 'isNumeric', 'format', 'number', 'Complex', 'BigNumber', 'Fraction'];\nexport var createUnitClass = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n on,\n config,\n addScalar,\n subtract,\n multiplyScalar,\n divideScalar,\n pow,\n abs,\n fix,\n round,\n equal,\n isNumeric,\n format,\n number: _number,\n Complex,\n BigNumber: _BigNumber,\n Fraction: _Fraction\n } = _ref;\n var toNumber = _number;\n /**\n * A unit can be constructed in the following ways:\n *\n * const a = new Unit(value, valuelessUnit)\n * const b = new Unit(null, valuelessUnit)\n * const c = Unit.parse(str)\n *\n * Example usage:\n *\n * const a = new Unit(5, 'cm') // 50 mm\n * const b = Unit.parse('23 kg') // 23 kg\n * const c = math.in(a, new Unit(null, 'm') // 0.05 m\n * const d = new Unit(9.81, \"m/s^2\") // 9.81 m/s^2\n *\n * @class Unit\n * @constructor Unit\n * @param {number | BigNumber | Fraction | Complex | boolean} [value] A value like 5.2\n * @param {string | Unit} valuelessUnit A unit without value. Can have prefix, like \"cm\"\n */\n function Unit(value, valuelessUnit) {\n if (!(this instanceof Unit)) {\n throw new Error('Constructor must be called with the new operator');\n }\n if (!(value === null || value === undefined || isNumeric(value) || isComplex(value))) {\n throw new TypeError('First parameter in Unit constructor must be number, BigNumber, Fraction, Complex, or undefined');\n }\n this.fixPrefix = false; // if true, function format will not search for the\n // best prefix but leave it as initially provided.\n // fixPrefix is set true by the method Unit.to\n\n // The justification behind this is that if the constructor is explicitly called,\n // the caller wishes the units to be returned exactly as supplied.\n this.skipAutomaticSimplification = true;\n if (valuelessUnit === undefined) {\n this.units = [];\n this.dimensions = BASE_DIMENSIONS.map(x => 0);\n } else if (typeof valuelessUnit === 'string') {\n var u = Unit.parse(valuelessUnit);\n this.units = u.units;\n this.dimensions = u.dimensions;\n } else if (isUnit(valuelessUnit) && valuelessUnit.value === null) {\n // clone from valuelessUnit\n this.fixPrefix = valuelessUnit.fixPrefix;\n this.skipAutomaticSimplification = valuelessUnit.skipAutomaticSimplification;\n this.dimensions = valuelessUnit.dimensions.slice(0);\n this.units = valuelessUnit.units.map(u => _extends({}, u));\n } else {\n throw new TypeError('Second parameter in Unit constructor must be a string or valueless Unit');\n }\n this.value = this._normalize(value);\n }\n\n /**\n * Attach type information\n */\n Object.defineProperty(Unit, 'name', {\n value: 'Unit'\n });\n Unit.prototype.constructor = Unit;\n Unit.prototype.type = 'Unit';\n Unit.prototype.isUnit = true;\n\n // private variables and functions for the Unit parser\n var text, index, c;\n function skipWhitespace() {\n while (c === ' ' || c === '\\t') {\n next();\n }\n }\n function isDigitDot(c) {\n return c >= '0' && c <= '9' || c === '.';\n }\n function isDigit(c) {\n return c >= '0' && c <= '9';\n }\n function next() {\n index++;\n c = text.charAt(index);\n }\n function revert(oldIndex) {\n index = oldIndex;\n c = text.charAt(index);\n }\n function parseNumber() {\n var number = '';\n var oldIndex = index;\n if (c === '+') {\n next();\n } else if (c === '-') {\n number += c;\n next();\n }\n if (!isDigitDot(c)) {\n // a + or - must be followed by a digit\n revert(oldIndex);\n return null;\n }\n\n // get number, can have a single dot\n if (c === '.') {\n number += c;\n next();\n if (!isDigit(c)) {\n // this is no legal number, it is just a dot\n revert(oldIndex);\n return null;\n }\n } else {\n while (isDigit(c)) {\n number += c;\n next();\n }\n if (c === '.') {\n number += c;\n next();\n }\n }\n while (isDigit(c)) {\n number += c;\n next();\n }\n\n // check for exponential notation like \"2.3e-4\" or \"1.23e50\"\n if (c === 'E' || c === 'e') {\n // The grammar branches here. This could either be part of an exponent or the start of a unit that begins with the letter e, such as \"4exabytes\"\n\n var tentativeNumber = '';\n var tentativeIndex = index;\n tentativeNumber += c;\n next();\n if (c === '+' || c === '-') {\n tentativeNumber += c;\n next();\n }\n\n // Scientific notation MUST be followed by an exponent (otherwise we assume it is not scientific notation)\n if (!isDigit(c)) {\n // The e or E must belong to something else, so return the number without the e or E.\n revert(tentativeIndex);\n return number;\n }\n\n // We can now safely say that this is scientific notation.\n number = number + tentativeNumber;\n while (isDigit(c)) {\n number += c;\n next();\n }\n }\n return number;\n }\n function parseUnit() {\n var unitName = '';\n\n // Alphanumeric characters only; matches [a-zA-Z0-9]\n while (isDigit(c) || Unit.isValidAlpha(c)) {\n unitName += c;\n next();\n }\n\n // Must begin with [a-zA-Z]\n var firstC = unitName.charAt(0);\n if (Unit.isValidAlpha(firstC)) {\n return unitName;\n } else {\n return null;\n }\n }\n function parseCharacter(toFind) {\n if (c === toFind) {\n next();\n return toFind;\n } else {\n return null;\n }\n }\n\n /**\n * Parse a string into a unit. The value of the unit is parsed as number,\n * BigNumber, or Fraction depending on the math.js config setting `number`.\n *\n * Throws an exception if the provided string does not contain a valid unit or\n * cannot be parsed.\n * @memberof Unit\n * @param {string} str A string like \"5.2 inch\", \"4e2 cm/s^2\"\n * @return {Unit} unit\n */\n Unit.parse = function (str, options) {\n options = options || {};\n text = str;\n index = -1;\n c = '';\n if (typeof text !== 'string') {\n throw new TypeError('Invalid argument in Unit.parse, string expected');\n }\n var unit = new Unit();\n unit.units = [];\n var powerMultiplierCurrent = 1;\n var expectingUnit = false;\n\n // A unit should follow this pattern:\n // [number] ...[ [*/] unit[^number] ]\n // unit[^number] ... [ [*/] unit[^number] ]\n\n // Rules:\n // number is any floating point number.\n // unit is any alphanumeric string beginning with an alpha. Units with names like e3 should be avoided because they look like the exponent of a floating point number!\n // The string may optionally begin with a number.\n // Each unit may optionally be followed by ^number.\n // Whitespace or a forward slash is recommended between consecutive units, although the following technically is parseable:\n // 2m^2kg/s^2\n // it is not good form. If a unit starts with e, then it could be confused as a floating point number:\n // 4erg\n\n next();\n skipWhitespace();\n\n // Optional number at the start of the string\n var valueStr = parseNumber();\n var value = null;\n if (valueStr) {\n if (config.number === 'BigNumber') {\n value = new _BigNumber(valueStr);\n } else if (config.number === 'Fraction') {\n try {\n // not all numbers can be turned in Fractions, for example very small numbers not\n value = new _Fraction(valueStr);\n } catch (err) {\n value = parseFloat(valueStr);\n }\n } else {\n // number\n value = parseFloat(valueStr);\n }\n skipWhitespace(); // Whitespace is not required here\n\n // handle multiplication or division right after the value, like '1/s'\n if (parseCharacter('*')) {\n powerMultiplierCurrent = 1;\n expectingUnit = true;\n } else if (parseCharacter('/')) {\n powerMultiplierCurrent = -1;\n expectingUnit = true;\n }\n }\n\n // Stack to keep track of powerMultipliers applied to each parentheses group\n var powerMultiplierStack = [];\n\n // Running product of all elements in powerMultiplierStack\n var powerMultiplierStackProduct = 1;\n while (true) {\n skipWhitespace();\n\n // Check for and consume opening parentheses, pushing powerMultiplierCurrent to the stack\n // A '(' will always appear directly before a unit.\n while (c === '(') {\n powerMultiplierStack.push(powerMultiplierCurrent);\n powerMultiplierStackProduct *= powerMultiplierCurrent;\n powerMultiplierCurrent = 1;\n next();\n skipWhitespace();\n }\n\n // Is there something here?\n var uStr = void 0;\n if (c) {\n var oldC = c;\n uStr = parseUnit();\n if (uStr === null) {\n throw new SyntaxError('Unexpected \"' + oldC + '\" in \"' + text + '\" at index ' + index.toString());\n }\n } else {\n // End of input.\n break;\n }\n\n // Verify the unit exists and get the prefix (if any)\n var res = _findUnit(uStr);\n if (res === null) {\n // Unit not found.\n throw new SyntaxError('Unit \"' + uStr + '\" not found.');\n }\n var power = powerMultiplierCurrent * powerMultiplierStackProduct;\n // Is there a \"^ number\"?\n skipWhitespace();\n if (parseCharacter('^')) {\n skipWhitespace();\n var p = parseNumber();\n if (p === null) {\n // No valid number found for the power!\n throw new SyntaxError('In \"' + str + '\", \"^\" must be followed by a floating-point number');\n }\n power *= p;\n }\n\n // Add the unit to the list\n unit.units.push({\n unit: res.unit,\n prefix: res.prefix,\n power\n });\n for (var i = 0; i < BASE_DIMENSIONS.length; i++) {\n unit.dimensions[i] += (res.unit.dimensions[i] || 0) * power;\n }\n\n // Check for and consume closing parentheses, popping from the stack.\n // A ')' will always follow a unit.\n skipWhitespace();\n while (c === ')') {\n if (powerMultiplierStack.length === 0) {\n throw new SyntaxError('Unmatched \")\" in \"' + text + '\" at index ' + index.toString());\n }\n powerMultiplierStackProduct /= powerMultiplierStack.pop();\n next();\n skipWhitespace();\n }\n\n // \"*\" and \"/\" should mean we are expecting something to come next.\n // Is there a forward slash? If so, negate powerMultiplierCurrent. The next unit or paren group is in the denominator.\n expectingUnit = false;\n if (parseCharacter('*')) {\n // explicit multiplication\n powerMultiplierCurrent = 1;\n expectingUnit = true;\n } else if (parseCharacter('/')) {\n // division\n powerMultiplierCurrent = -1;\n expectingUnit = true;\n } else {\n // implicit multiplication\n powerMultiplierCurrent = 1;\n }\n\n // Replace the unit into the auto unit system\n if (res.unit.base) {\n var baseDim = res.unit.base.key;\n UNIT_SYSTEMS.auto[baseDim] = {\n unit: res.unit,\n prefix: res.prefix\n };\n }\n }\n\n // Has the string been entirely consumed?\n skipWhitespace();\n if (c) {\n throw new SyntaxError('Could not parse: \"' + str + '\"');\n }\n\n // Is there a trailing slash?\n if (expectingUnit) {\n throw new SyntaxError('Trailing characters: \"' + str + '\"');\n }\n\n // Is the parentheses stack empty?\n if (powerMultiplierStack.length !== 0) {\n throw new SyntaxError('Unmatched \"(\" in \"' + text + '\"');\n }\n\n // Are there any units at all?\n if (unit.units.length === 0 && !options.allowNoUnits) {\n throw new SyntaxError('\"' + str + '\" contains no units');\n }\n unit.value = value !== undefined ? unit._normalize(value) : null;\n return unit;\n };\n\n /**\n * create a copy of this unit\n * @memberof Unit\n * @return {Unit} Returns a cloned version of the unit\n */\n Unit.prototype.clone = function () {\n var unit = new Unit();\n unit.fixPrefix = this.fixPrefix;\n unit.skipAutomaticSimplification = this.skipAutomaticSimplification;\n unit.value = clone(this.value);\n unit.dimensions = this.dimensions.slice(0);\n unit.units = [];\n for (var i = 0; i < this.units.length; i++) {\n unit.units[i] = {};\n for (var p in this.units[i]) {\n if (hasOwnProperty(this.units[i], p)) {\n unit.units[i][p] = this.units[i][p];\n }\n }\n }\n return unit;\n };\n\n /**\n * Return the type of the value of this unit\n *\n * @memberof Unit\n * @ return {string} type of the value of the unit\n */\n Unit.prototype.valueType = function () {\n return typeOf(this.value);\n };\n\n /**\n * Return whether the unit is derived (such as m/s, or cm^2, but not N)\n * @memberof Unit\n * @return {boolean} True if the unit is derived\n */\n Unit.prototype._isDerived = function () {\n if (this.units.length === 0) {\n return false;\n }\n return this.units.length > 1 || Math.abs(this.units[0].power - 1.0) > 1e-15;\n };\n\n /**\n * Normalize a value, based on its currently set unit(s)\n * @memberof Unit\n * @param {number | BigNumber | Fraction | boolean} value\n * @return {number | BigNumber | Fraction | boolean} normalized value\n * @private\n */\n Unit.prototype._normalize = function (value) {\n if (value === null || value === undefined || this.units.length === 0) {\n return value;\n }\n var res = value;\n var convert = Unit._getNumberConverter(typeOf(value)); // convert to Fraction or BigNumber if needed\n\n for (var i = 0; i < this.units.length; i++) {\n var unitValue = convert(this.units[i].unit.value);\n var unitPrefixValue = convert(this.units[i].prefix.value);\n var unitPower = convert(this.units[i].power);\n res = multiplyScalar(res, pow(multiplyScalar(unitValue, unitPrefixValue), unitPower));\n }\n return res;\n };\n\n /**\n * Denormalize a value, based on its currently set unit(s)\n * @memberof Unit\n * @param {number} value\n * @param {number} [prefixValue] Optional prefix value to be used (ignored if this is a derived unit)\n * @return {number} denormalized value\n * @private\n */\n Unit.prototype._denormalize = function (value, prefixValue) {\n if (value === null || value === undefined || this.units.length === 0) {\n return value;\n }\n var res = value;\n var convert = Unit._getNumberConverter(typeOf(value)); // convert to Fraction or BigNumber if needed\n\n for (var i = 0; i < this.units.length; i++) {\n var unitValue = convert(this.units[i].unit.value);\n var unitPrefixValue = convert(this.units[i].prefix.value);\n var unitPower = convert(this.units[i].power);\n res = divideScalar(res, pow(multiplyScalar(unitValue, unitPrefixValue), unitPower));\n }\n return res;\n };\n\n /**\n * Find a unit from a string\n * @memberof Unit\n * @param {string} str A string like 'cm' or 'inch'\n * @returns {Object | null} result When found, an object with fields unit and\n * prefix is returned. Else, null is returned.\n * @private\n */\n var _findUnit = memoize(str => {\n // First, match units names exactly. For example, a user could define 'mm' as 10^-4 m, which is silly, but then we would want 'mm' to match the user-defined unit.\n if (hasOwnProperty(UNITS, str)) {\n var unit = UNITS[str];\n var prefix = unit.prefixes[''];\n return {\n unit,\n prefix\n };\n }\n for (var _name in UNITS) {\n if (hasOwnProperty(UNITS, _name)) {\n if (endsWith(str, _name)) {\n var _unit = UNITS[_name];\n var prefixLen = str.length - _name.length;\n var prefixName = str.substring(0, prefixLen);\n var _prefix = hasOwnProperty(_unit.prefixes, prefixName) ? _unit.prefixes[prefixName] : undefined;\n if (_prefix !== undefined) {\n // store unit, prefix, and value\n return {\n unit: _unit,\n prefix: _prefix\n };\n }\n }\n }\n }\n return null;\n }, {\n hasher: args => args[0],\n limit: 100\n });\n\n /**\n * Test if the given expression is a unit.\n * The unit can have a prefix but cannot have a value.\n * @memberof Unit\n * @param {string} name A string to be tested whether it is a value less unit.\n * The unit can have prefix, like \"cm\"\n * @return {boolean} true if the given string is a unit\n */\n Unit.isValuelessUnit = function (name) {\n return _findUnit(name) !== null;\n };\n\n /**\n * check if this unit has given base unit\n * If this unit is a derived unit, this will ALWAYS return false, since by definition base units are not derived.\n * @memberof Unit\n * @param {BASE_UNITS | string | undefined} base\n */\n Unit.prototype.hasBase = function (base) {\n if (typeof base === 'string') {\n base = BASE_UNITS[base];\n }\n if (!base) {\n return false;\n }\n\n // All dimensions must be the same\n for (var i = 0; i < BASE_DIMENSIONS.length; i++) {\n if (Math.abs((this.dimensions[i] || 0) - (base.dimensions[i] || 0)) > 1e-12) {\n return false;\n }\n }\n return true;\n };\n\n /**\n * Check if this unit has a base or bases equal to another base or bases\n * For derived units, the exponent on each base also must match\n * @memberof Unit\n * @param {Unit} other\n * @return {boolean} true if equal base\n */\n Unit.prototype.equalBase = function (other) {\n // All dimensions must be the same\n for (var i = 0; i < BASE_DIMENSIONS.length; i++) {\n if (Math.abs((this.dimensions[i] || 0) - (other.dimensions[i] || 0)) > 1e-12) {\n return false;\n }\n }\n return true;\n };\n\n /**\n * Check if this unit equals another unit\n * @memberof Unit\n * @param {Unit} other\n * @return {boolean} true if both units are equal\n */\n Unit.prototype.equals = function (other) {\n return this.equalBase(other) && equal(this.value, other.value);\n };\n\n /**\n * Multiply this unit with another one or with a scalar\n * @memberof Unit\n * @param {Unit} other\n * @return {Unit} product of this unit and the other unit\n */\n Unit.prototype.multiply = function (_other) {\n var res = this.clone();\n var other = isUnit(_other) ? _other : new Unit(_other);\n for (var i = 0; i < BASE_DIMENSIONS.length; i++) {\n // Dimensions arrays may be of different lengths. Default to 0.\n res.dimensions[i] = (this.dimensions[i] || 0) + (other.dimensions[i] || 0);\n }\n\n // Append other's units list onto res\n for (var _i = 0; _i < other.units.length; _i++) {\n // Make a shallow copy of every unit\n var inverted = _objectSpread({}, other.units[_i]);\n res.units.push(inverted);\n }\n\n // If at least one operand has a value, then the result should also have a value\n if (this.value !== null || other.value !== null) {\n var valThis = this.value === null ? this._normalize(1) : this.value;\n var valOther = other.value === null ? other._normalize(1) : other.value;\n res.value = multiplyScalar(valThis, valOther);\n } else {\n res.value = null;\n }\n if (isUnit(_other)) {\n res.skipAutomaticSimplification = false;\n }\n return getNumericIfUnitless(res);\n };\n\n /**\n * Divide a number by this unit\n *\n * @memberof Unit\n * @param {numeric} numerator\n * @param {unit} result of dividing numerator by this unit\n */\n Unit.prototype.divideInto = function (numerator) {\n return new Unit(numerator).divide(this);\n };\n\n /**\n * Divide this unit by another one\n * @memberof Unit\n * @param {Unit | numeric} other\n * @return {Unit} result of dividing this unit by the other unit\n */\n Unit.prototype.divide = function (_other) {\n var res = this.clone();\n var other = isUnit(_other) ? _other : new Unit(_other);\n for (var i = 0; i < BASE_DIMENSIONS.length; i++) {\n // Dimensions arrays may be of different lengths. Default to 0.\n res.dimensions[i] = (this.dimensions[i] || 0) - (other.dimensions[i] || 0);\n }\n\n // Invert and append other's units list onto res\n for (var _i2 = 0; _i2 < other.units.length; _i2++) {\n // Make a shallow copy of every unit\n var inverted = _objectSpread(_objectSpread({}, other.units[_i2]), {}, {\n power: -other.units[_i2].power\n });\n res.units.push(inverted);\n }\n\n // If at least one operand has a value, the result should have a value\n if (this.value !== null || other.value !== null) {\n var valThis = this.value === null ? this._normalize(1) : this.value;\n var valOther = other.value === null ? other._normalize(1) : other.value;\n res.value = divideScalar(valThis, valOther);\n } else {\n res.value = null;\n }\n if (isUnit(_other)) {\n res.skipAutomaticSimplification = false;\n }\n return getNumericIfUnitless(res);\n };\n\n /**\n * Calculate the power of a unit\n * @memberof Unit\n * @param {number | Fraction | BigNumber} p\n * @returns {Unit} The result: this^p\n */\n Unit.prototype.pow = function (p) {\n var res = this.clone();\n for (var i = 0; i < BASE_DIMENSIONS.length; i++) {\n // Dimensions arrays may be of different lengths. Default to 0.\n res.dimensions[i] = (this.dimensions[i] || 0) * p;\n }\n\n // Adjust the power of each unit in the list\n for (var _i3 = 0; _i3 < res.units.length; _i3++) {\n res.units[_i3].power *= p;\n }\n if (res.value !== null) {\n res.value = pow(res.value, p);\n\n // only allow numeric output, we don't want to return a Complex number\n // if (!isNumeric(res.value)) {\n // res.value = NaN\n // }\n // Update: Complex supported now\n } else {\n res.value = null;\n }\n res.skipAutomaticSimplification = false;\n return getNumericIfUnitless(res);\n };\n\n /**\n * Return the numeric value of this unit if it is dimensionless, has a value, and config.predictable == false; or the original unit otherwise\n * @param {Unit} unit\n * @returns {number | Fraction | BigNumber | Unit} The numeric value of the unit if conditions are met, or the original unit otherwise\n */\n function getNumericIfUnitless(unit) {\n if (unit.equalBase(BASE_UNITS.NONE) && unit.value !== null && !config.predictable) {\n return unit.value;\n } else {\n return unit;\n }\n }\n\n /**\n * Calculate the absolute value of a unit\n * @memberof Unit\n * @param {number | Fraction | BigNumber} x\n * @returns {Unit} The result: |x|, absolute value of x\n */\n Unit.prototype.abs = function () {\n var ret = this.clone();\n if (ret.value !== null) {\n if (ret._isDerived() || ret.units[0].unit.offset === 0) {\n ret.value = abs(ret.value);\n } else {\n // To give the correct, but unexpected, results for units with an offset.\n // For example, abs(-283.15 degC) = -263.15 degC !!!\n // We must take the offset into consideration here\n var convert = ret._numberConverter(); // convert to Fraction or BigNumber if needed\n var unitValue = convert(ret.units[0].unit.value);\n var nominalOffset = convert(ret.units[0].unit.offset);\n var unitOffset = multiplyScalar(unitValue, nominalOffset);\n ret.value = subtract(abs(addScalar(ret.value, unitOffset)), unitOffset);\n }\n }\n for (var i in ret.units) {\n if (ret.units[i].unit.name === 'VA' || ret.units[i].unit.name === 'VAR') {\n ret.units[i].unit = UNITS.W;\n }\n }\n return ret;\n };\n\n /**\n * Convert the unit to a specific unit name.\n * @memberof Unit\n * @param {string | Unit} valuelessUnit A unit without value. Can have prefix, like \"cm\"\n * @returns {Unit} Returns a clone of the unit with a fixed prefix and unit.\n */\n Unit.prototype.to = function (valuelessUnit) {\n var value = this.value === null ? this._normalize(1) : this.value;\n var other;\n if (typeof valuelessUnit === 'string') {\n other = Unit.parse(valuelessUnit);\n } else if (isUnit(valuelessUnit)) {\n other = valuelessUnit.clone();\n } else {\n throw new Error('String or Unit expected as parameter');\n }\n if (!this.equalBase(other)) {\n throw new Error(\"Units do not match ('\".concat(other.toString(), \"' != '\").concat(this.toString(), \"')\"));\n }\n if (other.value !== null) {\n throw new Error('Cannot convert to a unit with a value');\n }\n if (this.value === null || this._isDerived() || this.units[0].unit.offset === other.units[0].unit.offset) {\n other.value = clone(value);\n } else {\n /* Need to adjust value by difference in offset to convert */\n var convert = Unit._getNumberConverter(typeOf(value)); // convert to Fraction or BigNumber if needed\n\n var thisUnitValue = this.units[0].unit.value;\n var thisNominalOffset = this.units[0].unit.offset;\n var thisUnitOffset = multiplyScalar(thisUnitValue, thisNominalOffset);\n var otherUnitValue = other.units[0].unit.value;\n var otherNominalOffset = other.units[0].unit.offset;\n var otherUnitOffset = multiplyScalar(otherUnitValue, otherNominalOffset);\n other.value = addScalar(value, convert(subtract(thisUnitOffset, otherUnitOffset)));\n }\n other.fixPrefix = true;\n other.skipAutomaticSimplification = true;\n return other;\n };\n\n /**\n * Return the value of the unit when represented with given valueless unit\n * @memberof Unit\n * @param {string | Unit} valuelessUnit For example 'cm' or 'inch'\n * @return {number} Returns the unit value as number.\n */\n // TODO: deprecate Unit.toNumber? It's always better to use toNumeric\n Unit.prototype.toNumber = function (valuelessUnit) {\n return toNumber(this.toNumeric(valuelessUnit));\n };\n\n /**\n * Return the value of the unit in the original numeric type\n * @memberof Unit\n * @param {string | Unit} valuelessUnit For example 'cm' or 'inch'\n * @return {number | BigNumber | Fraction} Returns the unit value\n */\n Unit.prototype.toNumeric = function (valuelessUnit) {\n var other;\n if (valuelessUnit) {\n // Allow getting the numeric value without converting to a different unit\n other = this.to(valuelessUnit);\n } else {\n other = this.clone();\n }\n if (other._isDerived() || other.units.length === 0) {\n return other._denormalize(other.value);\n } else {\n return other._denormalize(other.value, other.units[0].prefix.value);\n }\n };\n\n /**\n * Get a string representation of the unit.\n * @memberof Unit\n * @return {string}\n */\n Unit.prototype.toString = function () {\n return this.format();\n };\n\n /**\n * Get a JSON representation of the unit\n * @memberof Unit\n * @returns {Object} Returns a JSON object structured as:\n * `{\"mathjs\": \"Unit\", \"value\": 2, \"unit\": \"cm\", \"fixPrefix\": false}`\n */\n Unit.prototype.toJSON = function () {\n return {\n mathjs: 'Unit',\n value: this._denormalize(this.value),\n unit: this.formatUnits(),\n fixPrefix: this.fixPrefix\n };\n };\n\n /**\n * Instantiate a Unit from a JSON object\n * @memberof Unit\n * @param {Object} json A JSON object structured as:\n * `{\"mathjs\": \"Unit\", \"value\": 2, \"unit\": \"cm\", \"fixPrefix\": false}`\n * @return {Unit}\n */\n Unit.fromJSON = function (json) {\n var unit = new Unit(json.value, json.unit);\n unit.fixPrefix = json.fixPrefix || false;\n return unit;\n };\n\n /**\n * Returns the string representation of the unit.\n * @memberof Unit\n * @return {string}\n */\n Unit.prototype.valueOf = Unit.prototype.toString;\n\n /**\n * Simplify this Unit's unit list and return a new Unit with the simplified list.\n * The returned Unit will contain a list of the \"best\" units for formatting.\n */\n Unit.prototype.simplify = function () {\n var ret = this.clone();\n var proposedUnitList = [];\n\n // Search for a matching base\n var matchingBase;\n for (var key in currentUnitSystem) {\n if (hasOwnProperty(currentUnitSystem, key)) {\n if (ret.hasBase(BASE_UNITS[key])) {\n matchingBase = key;\n break;\n }\n }\n }\n if (matchingBase === 'NONE') {\n ret.units = [];\n } else {\n var matchingUnit;\n if (matchingBase) {\n // Does the unit system have a matching unit?\n if (hasOwnProperty(currentUnitSystem, matchingBase)) {\n matchingUnit = currentUnitSystem[matchingBase];\n }\n }\n if (matchingUnit) {\n ret.units = [{\n unit: matchingUnit.unit,\n prefix: matchingUnit.prefix,\n power: 1.0\n }];\n } else {\n // Multiple units or units with powers are formatted like this:\n // 5 (kg m^2) / (s^3 mol)\n // Build an representation from the base units of the current unit system\n var missingBaseDim = false;\n for (var i = 0; i < BASE_DIMENSIONS.length; i++) {\n var baseDim = BASE_DIMENSIONS[i];\n if (Math.abs(ret.dimensions[i] || 0) > 1e-12) {\n if (hasOwnProperty(currentUnitSystem, baseDim)) {\n proposedUnitList.push({\n unit: currentUnitSystem[baseDim].unit,\n prefix: currentUnitSystem[baseDim].prefix,\n power: ret.dimensions[i] || 0\n });\n } else {\n missingBaseDim = true;\n }\n }\n }\n\n // Is the proposed unit list \"simpler\" than the existing one?\n if (proposedUnitList.length < ret.units.length && !missingBaseDim) {\n // Replace this unit list with the proposed list\n ret.units = proposedUnitList;\n }\n }\n }\n return ret;\n };\n\n /**\n * Returns a new Unit in the SI system with the same value as this one\n */\n Unit.prototype.toSI = function () {\n var ret = this.clone();\n var proposedUnitList = [];\n\n // Multiple units or units with powers are formatted like this:\n // 5 (kg m^2) / (s^3 mol)\n // Build an representation from the base units of the SI unit system\n for (var i = 0; i < BASE_DIMENSIONS.length; i++) {\n var baseDim = BASE_DIMENSIONS[i];\n if (Math.abs(ret.dimensions[i] || 0) > 1e-12) {\n if (hasOwnProperty(UNIT_SYSTEMS.si, baseDim)) {\n proposedUnitList.push({\n unit: UNIT_SYSTEMS.si[baseDim].unit,\n prefix: UNIT_SYSTEMS.si[baseDim].prefix,\n power: ret.dimensions[i] || 0\n });\n } else {\n throw new Error('Cannot express custom unit ' + baseDim + ' in SI units');\n }\n }\n }\n\n // Replace this unit list with the proposed list\n ret.units = proposedUnitList;\n ret.fixPrefix = true;\n ret.skipAutomaticSimplification = true;\n return ret;\n };\n\n /**\n * Get a string representation of the units of this Unit, without the value. The unit list is formatted as-is without first being simplified.\n * @memberof Unit\n * @return {string}\n */\n Unit.prototype.formatUnits = function () {\n var strNum = '';\n var strDen = '';\n var nNum = 0;\n var nDen = 0;\n for (var i = 0; i < this.units.length; i++) {\n if (this.units[i].power > 0) {\n nNum++;\n strNum += ' ' + this.units[i].prefix.name + this.units[i].unit.name;\n if (Math.abs(this.units[i].power - 1.0) > 1e-15) {\n strNum += '^' + this.units[i].power;\n }\n } else if (this.units[i].power < 0) {\n nDen++;\n }\n }\n if (nDen > 0) {\n for (var _i4 = 0; _i4 < this.units.length; _i4++) {\n if (this.units[_i4].power < 0) {\n if (nNum > 0) {\n strDen += ' ' + this.units[_i4].prefix.name + this.units[_i4].unit.name;\n if (Math.abs(this.units[_i4].power + 1.0) > 1e-15) {\n strDen += '^' + -this.units[_i4].power;\n }\n } else {\n strDen += ' ' + this.units[_i4].prefix.name + this.units[_i4].unit.name;\n strDen += '^' + this.units[_i4].power;\n }\n }\n }\n }\n // Remove leading \" \"\n strNum = strNum.substr(1);\n strDen = strDen.substr(1);\n\n // Add parans for better copy/paste back into evaluate, for example, or for better pretty print formatting\n if (nNum > 1 && nDen > 0) {\n strNum = '(' + strNum + ')';\n }\n if (nDen > 1 && nNum > 0) {\n strDen = '(' + strDen + ')';\n }\n var str = strNum;\n if (nNum > 0 && nDen > 0) {\n str += ' / ';\n }\n str += strDen;\n return str;\n };\n\n /**\n * Get a string representation of the Unit, with optional formatting options.\n * @memberof Unit\n * @param {Object | number | Function} [options] Formatting options. See\n * lib/utils/number:format for a\n * description of the available\n * options.\n * @return {string}\n */\n Unit.prototype.format = function (options) {\n // Simplfy the unit list, unless it is valueless or was created directly in the\n // constructor or as the result of to or toSI\n var simp = this.skipAutomaticSimplification || this.value === null ? this.clone() : this.simplify();\n\n // Apply some custom logic for handling VA and VAR. The goal is to express the value of the unit as a real value, if possible. Otherwise, use a real-valued unit instead of a complex-valued one.\n var isImaginary = false;\n if (typeof simp.value !== 'undefined' && simp.value !== null && isComplex(simp.value)) {\n // TODO: Make this better, for example, use relative magnitude of re and im rather than absolute\n isImaginary = Math.abs(simp.value.re) < 1e-14;\n }\n for (var i in simp.units) {\n if (hasOwnProperty(simp.units, i)) {\n if (simp.units[i].unit) {\n if (simp.units[i].unit.name === 'VA' && isImaginary) {\n simp.units[i].unit = UNITS.VAR;\n } else if (simp.units[i].unit.name === 'VAR' && !isImaginary) {\n simp.units[i].unit = UNITS.VA;\n }\n }\n }\n }\n\n // Now apply the best prefix\n // Units must have only one unit and not have the fixPrefix flag set\n if (simp.units.length === 1 && !simp.fixPrefix) {\n // Units must have integer powers, otherwise the prefix will change the\n // outputted value by not-an-integer-power-of-ten\n if (Math.abs(simp.units[0].power - Math.round(simp.units[0].power)) < 1e-14) {\n // Apply the best prefix\n simp.units[0].prefix = simp._bestPrefix();\n }\n }\n var value = simp._denormalize(simp.value);\n var str = simp.value !== null ? format(value, options || {}) : '';\n var unitStr = simp.formatUnits();\n if (simp.value && isComplex(simp.value)) {\n str = '(' + str + ')'; // Surround complex values with ( ) to enable better parsing\n }\n\n if (unitStr.length > 0 && str.length > 0) {\n str += ' ';\n }\n str += unitStr;\n return str;\n };\n\n /**\n * Calculate the best prefix using current value.\n * @memberof Unit\n * @returns {Object} prefix\n * @private\n */\n Unit.prototype._bestPrefix = function () {\n if (this.units.length !== 1) {\n throw new Error('Can only compute the best prefix for single units with integer powers, like kg, s^2, N^-1, and so forth!');\n }\n if (Math.abs(this.units[0].power - Math.round(this.units[0].power)) >= 1e-14) {\n throw new Error('Can only compute the best prefix for single units with integer powers, like kg, s^2, N^-1, and so forth!');\n }\n\n // find the best prefix value (resulting in the value of which\n // the absolute value of the log10 is closest to zero,\n // though with a little offset of 1.2 for nicer values: you get a\n // sequence 1mm 100mm 500mm 0.6m 1m 10m 100m 500m 0.6km 1km ...\n\n // Note: the units value can be any numeric type, but to find the best\n // prefix it's enough to work with limited precision of a regular number\n // Update: using mathjs abs since we also allow complex numbers\n var absValue = this.value !== null ? abs(this.value) : 0;\n var absUnitValue = abs(this.units[0].unit.value);\n var bestPrefix = this.units[0].prefix;\n if (absValue === 0) {\n return bestPrefix;\n }\n var power = this.units[0].power;\n var bestDiff = Math.log(absValue / Math.pow(bestPrefix.value * absUnitValue, power)) / Math.LN10 - 1.2;\n if (bestDiff > -2.200001 && bestDiff < 1.800001) return bestPrefix; // Allow the original prefix\n bestDiff = Math.abs(bestDiff);\n var prefixes = this.units[0].unit.prefixes;\n for (var p in prefixes) {\n if (hasOwnProperty(prefixes, p)) {\n var prefix = prefixes[p];\n if (prefix.scientific) {\n var diff = Math.abs(Math.log(absValue / Math.pow(prefix.value * absUnitValue, power)) / Math.LN10 - 1.2);\n if (diff < bestDiff || diff === bestDiff && prefix.name.length < bestPrefix.name.length) {\n // choose the prefix with the smallest diff, or if equal, choose the one\n // with the shortest name (can happen with SHORTLONG for example)\n bestPrefix = prefix;\n bestDiff = diff;\n }\n }\n }\n }\n return bestPrefix;\n };\n\n /**\n * Returns an array of units whose sum is equal to this unit\n * @memberof Unit\n * @param {Array} [parts] An array of strings or valueless units.\n *\n * Example:\n *\n * const u = new Unit(1, 'm')\n * u.splitUnit(['feet', 'inch'])\n * [ 3 feet, 3.3700787401575 inch ]\n *\n * @return {Array} An array of units.\n */\n Unit.prototype.splitUnit = function (parts) {\n var x = this.clone();\n var ret = [];\n for (var i = 0; i < parts.length; i++) {\n // Convert x to the requested unit\n x = x.to(parts[i]);\n if (i === parts.length - 1) break;\n\n // Get the numeric value of this unit\n var xNumeric = x.toNumeric();\n\n // Check to see if xNumeric is nearly equal to an integer,\n // since fix can incorrectly round down if there is round-off error\n var xRounded = round(xNumeric);\n var xFixed = void 0;\n var isNearlyEqual = equal(xRounded, xNumeric);\n if (isNearlyEqual) {\n xFixed = xRounded;\n } else {\n xFixed = fix(x.toNumeric());\n }\n var y = new Unit(xFixed, parts[i].toString());\n ret.push(y);\n x = subtract(x, y);\n }\n\n // This little bit fixes a bug where the remainder should be 0 but is a little bit off.\n // But instead of comparing x, the remainder, with zero--we will compare the sum of\n // all the parts so far with the original value. If they are nearly equal,\n // we set the remainder to 0.\n var testSum = 0;\n for (var _i5 = 0; _i5 < ret.length; _i5++) {\n testSum = addScalar(testSum, ret[_i5].value);\n }\n if (equal(testSum, this.value)) {\n x.value = 0;\n }\n ret.push(x);\n return ret;\n };\n var PREFIXES = {\n NONE: {\n '': {\n name: '',\n value: 1,\n scientific: true\n }\n },\n SHORT: {\n '': {\n name: '',\n value: 1,\n scientific: true\n },\n da: {\n name: 'da',\n value: 1e1,\n scientific: false\n },\n h: {\n name: 'h',\n value: 1e2,\n scientific: false\n },\n k: {\n name: 'k',\n value: 1e3,\n scientific: true\n },\n M: {\n name: 'M',\n value: 1e6,\n scientific: true\n },\n G: {\n name: 'G',\n value: 1e9,\n scientific: true\n },\n T: {\n name: 'T',\n value: 1e12,\n scientific: true\n },\n P: {\n name: 'P',\n value: 1e15,\n scientific: true\n },\n E: {\n name: 'E',\n value: 1e18,\n scientific: true\n },\n Z: {\n name: 'Z',\n value: 1e21,\n scientific: true\n },\n Y: {\n name: 'Y',\n value: 1e24,\n scientific: true\n },\n d: {\n name: 'd',\n value: 1e-1,\n scientific: false\n },\n c: {\n name: 'c',\n value: 1e-2,\n scientific: false\n },\n m: {\n name: 'm',\n value: 1e-3,\n scientific: true\n },\n u: {\n name: 'u',\n value: 1e-6,\n scientific: true\n },\n n: {\n name: 'n',\n value: 1e-9,\n scientific: true\n },\n p: {\n name: 'p',\n value: 1e-12,\n scientific: true\n },\n f: {\n name: 'f',\n value: 1e-15,\n scientific: true\n },\n a: {\n name: 'a',\n value: 1e-18,\n scientific: true\n },\n z: {\n name: 'z',\n value: 1e-21,\n scientific: true\n },\n y: {\n name: 'y',\n value: 1e-24,\n scientific: true\n }\n },\n LONG: {\n '': {\n name: '',\n value: 1,\n scientific: true\n },\n deca: {\n name: 'deca',\n value: 1e1,\n scientific: false\n },\n hecto: {\n name: 'hecto',\n value: 1e2,\n scientific: false\n },\n kilo: {\n name: 'kilo',\n value: 1e3,\n scientific: true\n },\n mega: {\n name: 'mega',\n value: 1e6,\n scientific: true\n },\n giga: {\n name: 'giga',\n value: 1e9,\n scientific: true\n },\n tera: {\n name: 'tera',\n value: 1e12,\n scientific: true\n },\n peta: {\n name: 'peta',\n value: 1e15,\n scientific: true\n },\n exa: {\n name: 'exa',\n value: 1e18,\n scientific: true\n },\n zetta: {\n name: 'zetta',\n value: 1e21,\n scientific: true\n },\n yotta: {\n name: 'yotta',\n value: 1e24,\n scientific: true\n },\n deci: {\n name: 'deci',\n value: 1e-1,\n scientific: false\n },\n centi: {\n name: 'centi',\n value: 1e-2,\n scientific: false\n },\n milli: {\n name: 'milli',\n value: 1e-3,\n scientific: true\n },\n micro: {\n name: 'micro',\n value: 1e-6,\n scientific: true\n },\n nano: {\n name: 'nano',\n value: 1e-9,\n scientific: true\n },\n pico: {\n name: 'pico',\n value: 1e-12,\n scientific: true\n },\n femto: {\n name: 'femto',\n value: 1e-15,\n scientific: true\n },\n atto: {\n name: 'atto',\n value: 1e-18,\n scientific: true\n },\n zepto: {\n name: 'zepto',\n value: 1e-21,\n scientific: true\n },\n yocto: {\n name: 'yocto',\n value: 1e-24,\n scientific: true\n }\n },\n SQUARED: {\n '': {\n name: '',\n value: 1,\n scientific: true\n },\n da: {\n name: 'da',\n value: 1e2,\n scientific: false\n },\n h: {\n name: 'h',\n value: 1e4,\n scientific: false\n },\n k: {\n name: 'k',\n value: 1e6,\n scientific: true\n },\n M: {\n name: 'M',\n value: 1e12,\n scientific: true\n },\n G: {\n name: 'G',\n value: 1e18,\n scientific: true\n },\n T: {\n name: 'T',\n value: 1e24,\n scientific: true\n },\n P: {\n name: 'P',\n value: 1e30,\n scientific: true\n },\n E: {\n name: 'E',\n value: 1e36,\n scientific: true\n },\n Z: {\n name: 'Z',\n value: 1e42,\n scientific: true\n },\n Y: {\n name: 'Y',\n value: 1e48,\n scientific: true\n },\n d: {\n name: 'd',\n value: 1e-2,\n scientific: false\n },\n c: {\n name: 'c',\n value: 1e-4,\n scientific: false\n },\n m: {\n name: 'm',\n value: 1e-6,\n scientific: true\n },\n u: {\n name: 'u',\n value: 1e-12,\n scientific: true\n },\n n: {\n name: 'n',\n value: 1e-18,\n scientific: true\n },\n p: {\n name: 'p',\n value: 1e-24,\n scientific: true\n },\n f: {\n name: 'f',\n value: 1e-30,\n scientific: true\n },\n a: {\n name: 'a',\n value: 1e-36,\n scientific: true\n },\n z: {\n name: 'z',\n value: 1e-42,\n scientific: true\n },\n y: {\n name: 'y',\n value: 1e-48,\n scientific: true\n }\n },\n CUBIC: {\n '': {\n name: '',\n value: 1,\n scientific: true\n },\n da: {\n name: 'da',\n value: 1e3,\n scientific: false\n },\n h: {\n name: 'h',\n value: 1e6,\n scientific: false\n },\n k: {\n name: 'k',\n value: 1e9,\n scientific: true\n },\n M: {\n name: 'M',\n value: 1e18,\n scientific: true\n },\n G: {\n name: 'G',\n value: 1e27,\n scientific: true\n },\n T: {\n name: 'T',\n value: 1e36,\n scientific: true\n },\n P: {\n name: 'P',\n value: 1e45,\n scientific: true\n },\n E: {\n name: 'E',\n value: 1e54,\n scientific: true\n },\n Z: {\n name: 'Z',\n value: 1e63,\n scientific: true\n },\n Y: {\n name: 'Y',\n value: 1e72,\n scientific: true\n },\n d: {\n name: 'd',\n value: 1e-3,\n scientific: false\n },\n c: {\n name: 'c',\n value: 1e-6,\n scientific: false\n },\n m: {\n name: 'm',\n value: 1e-9,\n scientific: true\n },\n u: {\n name: 'u',\n value: 1e-18,\n scientific: true\n },\n n: {\n name: 'n',\n value: 1e-27,\n scientific: true\n },\n p: {\n name: 'p',\n value: 1e-36,\n scientific: true\n },\n f: {\n name: 'f',\n value: 1e-45,\n scientific: true\n },\n a: {\n name: 'a',\n value: 1e-54,\n scientific: true\n },\n z: {\n name: 'z',\n value: 1e-63,\n scientific: true\n },\n y: {\n name: 'y',\n value: 1e-72,\n scientific: true\n }\n },\n BINARY_SHORT_SI: {\n '': {\n name: '',\n value: 1,\n scientific: true\n },\n k: {\n name: 'k',\n value: 1e3,\n scientific: true\n },\n M: {\n name: 'M',\n value: 1e6,\n scientific: true\n },\n G: {\n name: 'G',\n value: 1e9,\n scientific: true\n },\n T: {\n name: 'T',\n value: 1e12,\n scientific: true\n },\n P: {\n name: 'P',\n value: 1e15,\n scientific: true\n },\n E: {\n name: 'E',\n value: 1e18,\n scientific: true\n },\n Z: {\n name: 'Z',\n value: 1e21,\n scientific: true\n },\n Y: {\n name: 'Y',\n value: 1e24,\n scientific: true\n }\n },\n BINARY_SHORT_IEC: {\n '': {\n name: '',\n value: 1,\n scientific: true\n },\n Ki: {\n name: 'Ki',\n value: 1024,\n scientific: true\n },\n Mi: {\n name: 'Mi',\n value: Math.pow(1024, 2),\n scientific: true\n },\n Gi: {\n name: 'Gi',\n value: Math.pow(1024, 3),\n scientific: true\n },\n Ti: {\n name: 'Ti',\n value: Math.pow(1024, 4),\n scientific: true\n },\n Pi: {\n name: 'Pi',\n value: Math.pow(1024, 5),\n scientific: true\n },\n Ei: {\n name: 'Ei',\n value: Math.pow(1024, 6),\n scientific: true\n },\n Zi: {\n name: 'Zi',\n value: Math.pow(1024, 7),\n scientific: true\n },\n Yi: {\n name: 'Yi',\n value: Math.pow(1024, 8),\n scientific: true\n }\n },\n BINARY_LONG_SI: {\n '': {\n name: '',\n value: 1,\n scientific: true\n },\n kilo: {\n name: 'kilo',\n value: 1e3,\n scientific: true\n },\n mega: {\n name: 'mega',\n value: 1e6,\n scientific: true\n },\n giga: {\n name: 'giga',\n value: 1e9,\n scientific: true\n },\n tera: {\n name: 'tera',\n value: 1e12,\n scientific: true\n },\n peta: {\n name: 'peta',\n value: 1e15,\n scientific: true\n },\n exa: {\n name: 'exa',\n value: 1e18,\n scientific: true\n },\n zetta: {\n name: 'zetta',\n value: 1e21,\n scientific: true\n },\n yotta: {\n name: 'yotta',\n value: 1e24,\n scientific: true\n }\n },\n BINARY_LONG_IEC: {\n '': {\n name: '',\n value: 1,\n scientific: true\n },\n kibi: {\n name: 'kibi',\n value: 1024,\n scientific: true\n },\n mebi: {\n name: 'mebi',\n value: Math.pow(1024, 2),\n scientific: true\n },\n gibi: {\n name: 'gibi',\n value: Math.pow(1024, 3),\n scientific: true\n },\n tebi: {\n name: 'tebi',\n value: Math.pow(1024, 4),\n scientific: true\n },\n pebi: {\n name: 'pebi',\n value: Math.pow(1024, 5),\n scientific: true\n },\n exi: {\n name: 'exi',\n value: Math.pow(1024, 6),\n scientific: true\n },\n zebi: {\n name: 'zebi',\n value: Math.pow(1024, 7),\n scientific: true\n },\n yobi: {\n name: 'yobi',\n value: Math.pow(1024, 8),\n scientific: true\n }\n },\n BTU: {\n '': {\n name: '',\n value: 1,\n scientific: true\n },\n MM: {\n name: 'MM',\n value: 1e6,\n scientific: true\n }\n }\n };\n PREFIXES.SHORTLONG = _extends({}, PREFIXES.SHORT, PREFIXES.LONG);\n PREFIXES.BINARY_SHORT = _extends({}, PREFIXES.BINARY_SHORT_SI, PREFIXES.BINARY_SHORT_IEC);\n PREFIXES.BINARY_LONG = _extends({}, PREFIXES.BINARY_LONG_SI, PREFIXES.BINARY_LONG_IEC);\n\n /* Internally, each unit is represented by a value and a dimension array. The elements of the dimensions array have the following meaning:\n * Index Dimension\n * ----- ---------\n * 0 Length\n * 1 Mass\n * 2 Time\n * 3 Current\n * 4 Temperature\n * 5 Luminous intensity\n * 6 Amount of substance\n * 7 Angle\n * 8 Bit (digital)\n * For example, the unit \"298.15 K\" is a pure temperature and would have a value of 298.15 and a dimension array of [0, 0, 0, 0, 1, 0, 0, 0, 0]. The unit \"1 cal / (gm °C)\" can be written in terms of the 9 fundamental dimensions as [length^2] / ([time^2] * [temperature]), and would a value of (after conversion to SI) 4184.0 and a dimensions array of [2, 0, -2, 0, -1, 0, 0, 0, 0].\n *\n */\n\n var BASE_DIMENSIONS = ['MASS', 'LENGTH', 'TIME', 'CURRENT', 'TEMPERATURE', 'LUMINOUS_INTENSITY', 'AMOUNT_OF_SUBSTANCE', 'ANGLE', 'BIT'];\n var BASE_UNITS = {\n NONE: {\n dimensions: [0, 0, 0, 0, 0, 0, 0, 0, 0]\n },\n MASS: {\n dimensions: [1, 0, 0, 0, 0, 0, 0, 0, 0]\n },\n LENGTH: {\n dimensions: [0, 1, 0, 0, 0, 0, 0, 0, 0]\n },\n TIME: {\n dimensions: [0, 0, 1, 0, 0, 0, 0, 0, 0]\n },\n CURRENT: {\n dimensions: [0, 0, 0, 1, 0, 0, 0, 0, 0]\n },\n TEMPERATURE: {\n dimensions: [0, 0, 0, 0, 1, 0, 0, 0, 0]\n },\n LUMINOUS_INTENSITY: {\n dimensions: [0, 0, 0, 0, 0, 1, 0, 0, 0]\n },\n AMOUNT_OF_SUBSTANCE: {\n dimensions: [0, 0, 0, 0, 0, 0, 1, 0, 0]\n },\n FORCE: {\n dimensions: [1, 1, -2, 0, 0, 0, 0, 0, 0]\n },\n SURFACE: {\n dimensions: [0, 2, 0, 0, 0, 0, 0, 0, 0]\n },\n VOLUME: {\n dimensions: [0, 3, 0, 0, 0, 0, 0, 0, 0]\n },\n ENERGY: {\n dimensions: [1, 2, -2, 0, 0, 0, 0, 0, 0]\n },\n POWER: {\n dimensions: [1, 2, -3, 0, 0, 0, 0, 0, 0]\n },\n PRESSURE: {\n dimensions: [1, -1, -2, 0, 0, 0, 0, 0, 0]\n },\n ELECTRIC_CHARGE: {\n dimensions: [0, 0, 1, 1, 0, 0, 0, 0, 0]\n },\n ELECTRIC_CAPACITANCE: {\n dimensions: [-1, -2, 4, 2, 0, 0, 0, 0, 0]\n },\n ELECTRIC_POTENTIAL: {\n dimensions: [1, 2, -3, -1, 0, 0, 0, 0, 0]\n },\n ELECTRIC_RESISTANCE: {\n dimensions: [1, 2, -3, -2, 0, 0, 0, 0, 0]\n },\n ELECTRIC_INDUCTANCE: {\n dimensions: [1, 2, -2, -2, 0, 0, 0, 0, 0]\n },\n ELECTRIC_CONDUCTANCE: {\n dimensions: [-1, -2, 3, 2, 0, 0, 0, 0, 0]\n },\n MAGNETIC_FLUX: {\n dimensions: [1, 2, -2, -1, 0, 0, 0, 0, 0]\n },\n MAGNETIC_FLUX_DENSITY: {\n dimensions: [1, 0, -2, -1, 0, 0, 0, 0, 0]\n },\n FREQUENCY: {\n dimensions: [0, 0, -1, 0, 0, 0, 0, 0, 0]\n },\n ANGLE: {\n dimensions: [0, 0, 0, 0, 0, 0, 0, 1, 0]\n },\n BIT: {\n dimensions: [0, 0, 0, 0, 0, 0, 0, 0, 1]\n }\n };\n for (var key in BASE_UNITS) {\n if (hasOwnProperty(BASE_UNITS, key)) {\n BASE_UNITS[key].key = key;\n }\n }\n var BASE_UNIT_NONE = {};\n var UNIT_NONE = {\n name: '',\n base: BASE_UNIT_NONE,\n value: 1,\n offset: 0,\n dimensions: BASE_DIMENSIONS.map(x => 0)\n };\n var UNITS = {\n // length\n meter: {\n name: 'meter',\n base: BASE_UNITS.LENGTH,\n prefixes: PREFIXES.LONG,\n value: 1,\n offset: 0\n },\n inch: {\n name: 'inch',\n base: BASE_UNITS.LENGTH,\n prefixes: PREFIXES.NONE,\n value: 0.0254,\n offset: 0\n },\n foot: {\n name: 'foot',\n base: BASE_UNITS.LENGTH,\n prefixes: PREFIXES.NONE,\n value: 0.3048,\n offset: 0\n },\n yard: {\n name: 'yard',\n base: BASE_UNITS.LENGTH,\n prefixes: PREFIXES.NONE,\n value: 0.9144,\n offset: 0\n },\n mile: {\n name: 'mile',\n base: BASE_UNITS.LENGTH,\n prefixes: PREFIXES.NONE,\n value: 1609.344,\n offset: 0\n },\n link: {\n name: 'link',\n base: BASE_UNITS.LENGTH,\n prefixes: PREFIXES.NONE,\n value: 0.201168,\n offset: 0\n },\n rod: {\n name: 'rod',\n base: BASE_UNITS.LENGTH,\n prefixes: PREFIXES.NONE,\n value: 5.0292,\n offset: 0\n },\n chain: {\n name: 'chain',\n base: BASE_UNITS.LENGTH,\n prefixes: PREFIXES.NONE,\n value: 20.1168,\n offset: 0\n },\n angstrom: {\n name: 'angstrom',\n base: BASE_UNITS.LENGTH,\n prefixes: PREFIXES.NONE,\n value: 1e-10,\n offset: 0\n },\n m: {\n name: 'm',\n base: BASE_UNITS.LENGTH,\n prefixes: PREFIXES.SHORT,\n value: 1,\n offset: 0\n },\n in: {\n name: 'in',\n base: BASE_UNITS.LENGTH,\n prefixes: PREFIXES.NONE,\n value: 0.0254,\n offset: 0\n },\n ft: {\n name: 'ft',\n base: BASE_UNITS.LENGTH,\n prefixes: PREFIXES.NONE,\n value: 0.3048,\n offset: 0\n },\n yd: {\n name: 'yd',\n base: BASE_UNITS.LENGTH,\n prefixes: PREFIXES.NONE,\n value: 0.9144,\n offset: 0\n },\n mi: {\n name: 'mi',\n base: BASE_UNITS.LENGTH,\n prefixes: PREFIXES.NONE,\n value: 1609.344,\n offset: 0\n },\n li: {\n name: 'li',\n base: BASE_UNITS.LENGTH,\n prefixes: PREFIXES.NONE,\n value: 0.201168,\n offset: 0\n },\n rd: {\n name: 'rd',\n base: BASE_UNITS.LENGTH,\n prefixes: PREFIXES.NONE,\n value: 5.029210,\n offset: 0\n },\n ch: {\n name: 'ch',\n base: BASE_UNITS.LENGTH,\n prefixes: PREFIXES.NONE,\n value: 20.1168,\n offset: 0\n },\n mil: {\n name: 'mil',\n base: BASE_UNITS.LENGTH,\n prefixes: PREFIXES.NONE,\n value: 0.0000254,\n offset: 0\n },\n // 1/1000 inch\n\n // Surface\n m2: {\n name: 'm2',\n base: BASE_UNITS.SURFACE,\n prefixes: PREFIXES.SQUARED,\n value: 1,\n offset: 0\n },\n sqin: {\n name: 'sqin',\n base: BASE_UNITS.SURFACE,\n prefixes: PREFIXES.NONE,\n value: 0.00064516,\n offset: 0\n },\n // 645.16 mm2\n sqft: {\n name: 'sqft',\n base: BASE_UNITS.SURFACE,\n prefixes: PREFIXES.NONE,\n value: 0.09290304,\n offset: 0\n },\n // 0.09290304 m2\n sqyd: {\n name: 'sqyd',\n base: BASE_UNITS.SURFACE,\n prefixes: PREFIXES.NONE,\n value: 0.83612736,\n offset: 0\n },\n // 0.83612736 m2\n sqmi: {\n name: 'sqmi',\n base: BASE_UNITS.SURFACE,\n prefixes: PREFIXES.NONE,\n value: 2589988.110336,\n offset: 0\n },\n // 2.589988110336 km2\n sqrd: {\n name: 'sqrd',\n base: BASE_UNITS.SURFACE,\n prefixes: PREFIXES.NONE,\n value: 25.29295,\n offset: 0\n },\n // 25.29295 m2\n sqch: {\n name: 'sqch',\n base: BASE_UNITS.SURFACE,\n prefixes: PREFIXES.NONE,\n value: 404.6873,\n offset: 0\n },\n // 404.6873 m2\n sqmil: {\n name: 'sqmil',\n base: BASE_UNITS.SURFACE,\n prefixes: PREFIXES.NONE,\n value: 6.4516e-10,\n offset: 0\n },\n // 6.4516 * 10^-10 m2\n acre: {\n name: 'acre',\n base: BASE_UNITS.SURFACE,\n prefixes: PREFIXES.NONE,\n value: 4046.86,\n offset: 0\n },\n // 4046.86 m2\n hectare: {\n name: 'hectare',\n base: BASE_UNITS.SURFACE,\n prefixes: PREFIXES.NONE,\n value: 10000,\n offset: 0\n },\n // 10000 m2\n\n // Volume\n m3: {\n name: 'm3',\n base: BASE_UNITS.VOLUME,\n prefixes: PREFIXES.CUBIC,\n value: 1,\n offset: 0\n },\n L: {\n name: 'L',\n base: BASE_UNITS.VOLUME,\n prefixes: PREFIXES.SHORT,\n value: 0.001,\n offset: 0\n },\n // litre\n l: {\n name: 'l',\n base: BASE_UNITS.VOLUME,\n prefixes: PREFIXES.SHORT,\n value: 0.001,\n offset: 0\n },\n // litre\n litre: {\n name: 'litre',\n base: BASE_UNITS.VOLUME,\n prefixes: PREFIXES.LONG,\n value: 0.001,\n offset: 0\n },\n cuin: {\n name: 'cuin',\n base: BASE_UNITS.VOLUME,\n prefixes: PREFIXES.NONE,\n value: 1.6387064e-5,\n offset: 0\n },\n // 1.6387064e-5 m3\n cuft: {\n name: 'cuft',\n base: BASE_UNITS.VOLUME,\n prefixes: PREFIXES.NONE,\n value: 0.028316846592,\n offset: 0\n },\n // 28.316 846 592 L\n cuyd: {\n name: 'cuyd',\n base: BASE_UNITS.VOLUME,\n prefixes: PREFIXES.NONE,\n value: 0.764554857984,\n offset: 0\n },\n // 764.554 857 984 L\n teaspoon: {\n name: 'teaspoon',\n base: BASE_UNITS.VOLUME,\n prefixes: PREFIXES.NONE,\n value: 0.000005,\n offset: 0\n },\n // 5 mL\n tablespoon: {\n name: 'tablespoon',\n base: BASE_UNITS.VOLUME,\n prefixes: PREFIXES.NONE,\n value: 0.000015,\n offset: 0\n },\n // 15 mL\n // {name: 'cup', base: BASE_UNITS.VOLUME, prefixes: PREFIXES.NONE, value: 0.000240, offset: 0}, // 240 mL // not possible, we have already another cup\n drop: {\n name: 'drop',\n base: BASE_UNITS.VOLUME,\n prefixes: PREFIXES.NONE,\n value: 5e-8,\n offset: 0\n },\n // 0.05 mL = 5e-8 m3\n gtt: {\n name: 'gtt',\n base: BASE_UNITS.VOLUME,\n prefixes: PREFIXES.NONE,\n value: 5e-8,\n offset: 0\n },\n // 0.05 mL = 5e-8 m3\n\n // Liquid volume\n minim: {\n name: 'minim',\n base: BASE_UNITS.VOLUME,\n prefixes: PREFIXES.NONE,\n value: 0.00000006161152,\n offset: 0\n },\n // 0.06161152 mL\n fluiddram: {\n name: 'fluiddram',\n base: BASE_UNITS.VOLUME,\n prefixes: PREFIXES.NONE,\n value: 0.0000036966911,\n offset: 0\n },\n // 3.696691 mL\n fluidounce: {\n name: 'fluidounce',\n base: BASE_UNITS.VOLUME,\n prefixes: PREFIXES.NONE,\n value: 0.00002957353,\n offset: 0\n },\n // 29.57353 mL\n gill: {\n name: 'gill',\n base: BASE_UNITS.VOLUME,\n prefixes: PREFIXES.NONE,\n value: 0.0001182941,\n offset: 0\n },\n // 118.2941 mL\n cc: {\n name: 'cc',\n base: BASE_UNITS.VOLUME,\n prefixes: PREFIXES.NONE,\n value: 1e-6,\n offset: 0\n },\n // 1e-6 L\n cup: {\n name: 'cup',\n base: BASE_UNITS.VOLUME,\n prefixes: PREFIXES.NONE,\n value: 0.0002365882,\n offset: 0\n },\n // 236.5882 mL\n pint: {\n name: 'pint',\n base: BASE_UNITS.VOLUME,\n prefixes: PREFIXES.NONE,\n value: 0.0004731765,\n offset: 0\n },\n // 473.1765 mL\n quart: {\n name: 'quart',\n base: BASE_UNITS.VOLUME,\n prefixes: PREFIXES.NONE,\n value: 0.0009463529,\n offset: 0\n },\n // 946.3529 mL\n gallon: {\n name: 'gallon',\n base: BASE_UNITS.VOLUME,\n prefixes: PREFIXES.NONE,\n value: 0.003785412,\n offset: 0\n },\n // 3.785412 L\n beerbarrel: {\n name: 'beerbarrel',\n base: BASE_UNITS.VOLUME,\n prefixes: PREFIXES.NONE,\n value: 0.1173478,\n offset: 0\n },\n // 117.3478 L\n oilbarrel: {\n name: 'oilbarrel',\n base: BASE_UNITS.VOLUME,\n prefixes: PREFIXES.NONE,\n value: 0.1589873,\n offset: 0\n },\n // 158.9873 L\n hogshead: {\n name: 'hogshead',\n base: BASE_UNITS.VOLUME,\n prefixes: PREFIXES.NONE,\n value: 0.2384810,\n offset: 0\n },\n // 238.4810 L\n\n // {name: 'min', base: BASE_UNITS.VOLUME, prefixes: PREFIXES.NONE, value: 0.00000006161152, offset: 0}, // 0.06161152 mL // min is already in use as minute\n fldr: {\n name: 'fldr',\n base: BASE_UNITS.VOLUME,\n prefixes: PREFIXES.NONE,\n value: 0.0000036966911,\n offset: 0\n },\n // 3.696691 mL\n floz: {\n name: 'floz',\n base: BASE_UNITS.VOLUME,\n prefixes: PREFIXES.NONE,\n value: 0.00002957353,\n offset: 0\n },\n // 29.57353 mL\n gi: {\n name: 'gi',\n base: BASE_UNITS.VOLUME,\n prefixes: PREFIXES.NONE,\n value: 0.0001182941,\n offset: 0\n },\n // 118.2941 mL\n cp: {\n name: 'cp',\n base: BASE_UNITS.VOLUME,\n prefixes: PREFIXES.NONE,\n value: 0.0002365882,\n offset: 0\n },\n // 236.5882 mL\n pt: {\n name: 'pt',\n base: BASE_UNITS.VOLUME,\n prefixes: PREFIXES.NONE,\n value: 0.0004731765,\n offset: 0\n },\n // 473.1765 mL\n qt: {\n name: 'qt',\n base: BASE_UNITS.VOLUME,\n prefixes: PREFIXES.NONE,\n value: 0.0009463529,\n offset: 0\n },\n // 946.3529 mL\n gal: {\n name: 'gal',\n base: BASE_UNITS.VOLUME,\n prefixes: PREFIXES.NONE,\n value: 0.003785412,\n offset: 0\n },\n // 3.785412 L\n bbl: {\n name: 'bbl',\n base: BASE_UNITS.VOLUME,\n prefixes: PREFIXES.NONE,\n value: 0.1173478,\n offset: 0\n },\n // 117.3478 L\n obl: {\n name: 'obl',\n base: BASE_UNITS.VOLUME,\n prefixes: PREFIXES.NONE,\n value: 0.1589873,\n offset: 0\n },\n // 158.9873 L\n // {name: 'hogshead', base: BASE_UNITS.VOLUME, prefixes: PREFIXES.NONE, value: 0.2384810, offset: 0}, // 238.4810 L // TODO: hh?\n\n // Mass\n g: {\n name: 'g',\n base: BASE_UNITS.MASS,\n prefixes: PREFIXES.SHORT,\n value: 0.001,\n offset: 0\n },\n gram: {\n name: 'gram',\n base: BASE_UNITS.MASS,\n prefixes: PREFIXES.LONG,\n value: 0.001,\n offset: 0\n },\n ton: {\n name: 'ton',\n base: BASE_UNITS.MASS,\n prefixes: PREFIXES.SHORT,\n value: 907.18474,\n offset: 0\n },\n t: {\n name: 't',\n base: BASE_UNITS.MASS,\n prefixes: PREFIXES.SHORT,\n value: 1000,\n offset: 0\n },\n tonne: {\n name: 'tonne',\n base: BASE_UNITS.MASS,\n prefixes: PREFIXES.LONG,\n value: 1000,\n offset: 0\n },\n grain: {\n name: 'grain',\n base: BASE_UNITS.MASS,\n prefixes: PREFIXES.NONE,\n value: 64.79891e-6,\n offset: 0\n },\n dram: {\n name: 'dram',\n base: BASE_UNITS.MASS,\n prefixes: PREFIXES.NONE,\n value: 1.7718451953125e-3,\n offset: 0\n },\n ounce: {\n name: 'ounce',\n base: BASE_UNITS.MASS,\n prefixes: PREFIXES.NONE,\n value: 28.349523125e-3,\n offset: 0\n },\n poundmass: {\n name: 'poundmass',\n base: BASE_UNITS.MASS,\n prefixes: PREFIXES.NONE,\n value: 453.59237e-3,\n offset: 0\n },\n hundredweight: {\n name: 'hundredweight',\n base: BASE_UNITS.MASS,\n prefixes: PREFIXES.NONE,\n value: 45.359237,\n offset: 0\n },\n stick: {\n name: 'stick',\n base: BASE_UNITS.MASS,\n prefixes: PREFIXES.NONE,\n value: 115e-3,\n offset: 0\n },\n stone: {\n name: 'stone',\n base: BASE_UNITS.MASS,\n prefixes: PREFIXES.NONE,\n value: 6.35029318,\n offset: 0\n },\n gr: {\n name: 'gr',\n base: BASE_UNITS.MASS,\n prefixes: PREFIXES.NONE,\n value: 64.79891e-6,\n offset: 0\n },\n dr: {\n name: 'dr',\n base: BASE_UNITS.MASS,\n prefixes: PREFIXES.NONE,\n value: 1.7718451953125e-3,\n offset: 0\n },\n oz: {\n name: 'oz',\n base: BASE_UNITS.MASS,\n prefixes: PREFIXES.NONE,\n value: 28.349523125e-3,\n offset: 0\n },\n lbm: {\n name: 'lbm',\n base: BASE_UNITS.MASS,\n prefixes: PREFIXES.NONE,\n value: 453.59237e-3,\n offset: 0\n },\n cwt: {\n name: 'cwt',\n base: BASE_UNITS.MASS,\n prefixes: PREFIXES.NONE,\n value: 45.359237,\n offset: 0\n },\n // Time\n s: {\n name: 's',\n base: BASE_UNITS.TIME,\n prefixes: PREFIXES.SHORT,\n value: 1,\n offset: 0\n },\n min: {\n name: 'min',\n base: BASE_UNITS.TIME,\n prefixes: PREFIXES.NONE,\n value: 60,\n offset: 0\n },\n h: {\n name: 'h',\n base: BASE_UNITS.TIME,\n prefixes: PREFIXES.NONE,\n value: 3600,\n offset: 0\n },\n second: {\n name: 'second',\n base: BASE_UNITS.TIME,\n prefixes: PREFIXES.LONG,\n value: 1,\n offset: 0\n },\n sec: {\n name: 'sec',\n base: BASE_UNITS.TIME,\n prefixes: PREFIXES.LONG,\n value: 1,\n offset: 0\n },\n minute: {\n name: 'minute',\n base: BASE_UNITS.TIME,\n prefixes: PREFIXES.NONE,\n value: 60,\n offset: 0\n },\n hour: {\n name: 'hour',\n base: BASE_UNITS.TIME,\n prefixes: PREFIXES.NONE,\n value: 3600,\n offset: 0\n },\n day: {\n name: 'day',\n base: BASE_UNITS.TIME,\n prefixes: PREFIXES.NONE,\n value: 86400,\n offset: 0\n },\n week: {\n name: 'week',\n base: BASE_UNITS.TIME,\n prefixes: PREFIXES.NONE,\n value: 7 * 86400,\n offset: 0\n },\n month: {\n name: 'month',\n base: BASE_UNITS.TIME,\n prefixes: PREFIXES.NONE,\n value: 2629800,\n // 1/12th of Julian year\n offset: 0\n },\n year: {\n name: 'year',\n base: BASE_UNITS.TIME,\n prefixes: PREFIXES.NONE,\n value: 31557600,\n // Julian year\n offset: 0\n },\n decade: {\n name: 'decade',\n base: BASE_UNITS.TIME,\n prefixes: PREFIXES.NONE,\n value: 315576000,\n // Julian decade\n offset: 0\n },\n century: {\n name: 'century',\n base: BASE_UNITS.TIME,\n prefixes: PREFIXES.NONE,\n value: 3155760000,\n // Julian century\n offset: 0\n },\n millennium: {\n name: 'millennium',\n base: BASE_UNITS.TIME,\n prefixes: PREFIXES.NONE,\n value: 31557600000,\n // Julian millennium\n offset: 0\n },\n // Frequency\n hertz: {\n name: 'Hertz',\n base: BASE_UNITS.FREQUENCY,\n prefixes: PREFIXES.LONG,\n value: 1,\n offset: 0,\n reciprocal: true\n },\n Hz: {\n name: 'Hz',\n base: BASE_UNITS.FREQUENCY,\n prefixes: PREFIXES.SHORT,\n value: 1,\n offset: 0,\n reciprocal: true\n },\n // Angle\n rad: {\n name: 'rad',\n base: BASE_UNITS.ANGLE,\n prefixes: PREFIXES.SHORT,\n value: 1,\n offset: 0\n },\n radian: {\n name: 'radian',\n base: BASE_UNITS.ANGLE,\n prefixes: PREFIXES.LONG,\n value: 1,\n offset: 0\n },\n // deg = rad / (2*pi) * 360 = rad / 0.017453292519943295769236907684888\n deg: {\n name: 'deg',\n base: BASE_UNITS.ANGLE,\n prefixes: PREFIXES.SHORT,\n value: null,\n // will be filled in by calculateAngleValues()\n offset: 0\n },\n degree: {\n name: 'degree',\n base: BASE_UNITS.ANGLE,\n prefixes: PREFIXES.LONG,\n value: null,\n // will be filled in by calculateAngleValues()\n offset: 0\n },\n // grad = rad / (2*pi) * 400 = rad / 0.015707963267948966192313216916399\n grad: {\n name: 'grad',\n base: BASE_UNITS.ANGLE,\n prefixes: PREFIXES.SHORT,\n value: null,\n // will be filled in by calculateAngleValues()\n offset: 0\n },\n gradian: {\n name: 'gradian',\n base: BASE_UNITS.ANGLE,\n prefixes: PREFIXES.LONG,\n value: null,\n // will be filled in by calculateAngleValues()\n offset: 0\n },\n // cycle = rad / (2*pi) = rad / 6.2831853071795864769252867665793\n cycle: {\n name: 'cycle',\n base: BASE_UNITS.ANGLE,\n prefixes: PREFIXES.NONE,\n value: null,\n // will be filled in by calculateAngleValues()\n offset: 0\n },\n // arcsec = rad / (3600 * (360 / 2 * pi)) = rad / 0.0000048481368110953599358991410235795\n arcsec: {\n name: 'arcsec',\n base: BASE_UNITS.ANGLE,\n prefixes: PREFIXES.NONE,\n value: null,\n // will be filled in by calculateAngleValues()\n offset: 0\n },\n // arcmin = rad / (60 * (360 / 2 * pi)) = rad / 0.00029088820866572159615394846141477\n arcmin: {\n name: 'arcmin',\n base: BASE_UNITS.ANGLE,\n prefixes: PREFIXES.NONE,\n value: null,\n // will be filled in by calculateAngleValues()\n offset: 0\n },\n // Electric current\n A: {\n name: 'A',\n base: BASE_UNITS.CURRENT,\n prefixes: PREFIXES.SHORT,\n value: 1,\n offset: 0\n },\n ampere: {\n name: 'ampere',\n base: BASE_UNITS.CURRENT,\n prefixes: PREFIXES.LONG,\n value: 1,\n offset: 0\n },\n // Temperature\n // K(C) = °C + 273.15\n // K(F) = (°F + 459.67) * (5 / 9)\n // K(R) = °R * (5 / 9)\n K: {\n name: 'K',\n base: BASE_UNITS.TEMPERATURE,\n prefixes: PREFIXES.SHORT,\n value: 1,\n offset: 0\n },\n degC: {\n name: 'degC',\n base: BASE_UNITS.TEMPERATURE,\n prefixes: PREFIXES.SHORT,\n value: 1,\n offset: 273.15\n },\n degF: {\n name: 'degF',\n base: BASE_UNITS.TEMPERATURE,\n prefixes: PREFIXES.SHORT,\n value: new _Fraction(5, 9),\n offset: 459.67\n },\n degR: {\n name: 'degR',\n base: BASE_UNITS.TEMPERATURE,\n prefixes: PREFIXES.SHORT,\n value: new _Fraction(5, 9),\n offset: 0\n },\n kelvin: {\n name: 'kelvin',\n base: BASE_UNITS.TEMPERATURE,\n prefixes: PREFIXES.LONG,\n value: 1,\n offset: 0\n },\n celsius: {\n name: 'celsius',\n base: BASE_UNITS.TEMPERATURE,\n prefixes: PREFIXES.LONG,\n value: 1,\n offset: 273.15\n },\n fahrenheit: {\n name: 'fahrenheit',\n base: BASE_UNITS.TEMPERATURE,\n prefixes: PREFIXES.LONG,\n value: new _Fraction(5, 9),\n offset: 459.67\n },\n rankine: {\n name: 'rankine',\n base: BASE_UNITS.TEMPERATURE,\n prefixes: PREFIXES.LONG,\n value: new _Fraction(5, 9),\n offset: 0\n },\n // amount of substance\n mol: {\n name: 'mol',\n base: BASE_UNITS.AMOUNT_OF_SUBSTANCE,\n prefixes: PREFIXES.SHORT,\n value: 1,\n offset: 0\n },\n mole: {\n name: 'mole',\n base: BASE_UNITS.AMOUNT_OF_SUBSTANCE,\n prefixes: PREFIXES.LONG,\n value: 1,\n offset: 0\n },\n // luminous intensity\n cd: {\n name: 'cd',\n base: BASE_UNITS.LUMINOUS_INTENSITY,\n prefixes: PREFIXES.SHORT,\n value: 1,\n offset: 0\n },\n candela: {\n name: 'candela',\n base: BASE_UNITS.LUMINOUS_INTENSITY,\n prefixes: PREFIXES.LONG,\n value: 1,\n offset: 0\n },\n // TODO: units STERADIAN\n // {name: 'sr', base: BASE_UNITS.STERADIAN, prefixes: PREFIXES.NONE, value: 1, offset: 0},\n // {name: 'steradian', base: BASE_UNITS.STERADIAN, prefixes: PREFIXES.NONE, value: 1, offset: 0},\n\n // Force\n N: {\n name: 'N',\n base: BASE_UNITS.FORCE,\n prefixes: PREFIXES.SHORT,\n value: 1,\n offset: 0\n },\n newton: {\n name: 'newton',\n base: BASE_UNITS.FORCE,\n prefixes: PREFIXES.LONG,\n value: 1,\n offset: 0\n },\n dyn: {\n name: 'dyn',\n base: BASE_UNITS.FORCE,\n prefixes: PREFIXES.SHORT,\n value: 0.00001,\n offset: 0\n },\n dyne: {\n name: 'dyne',\n base: BASE_UNITS.FORCE,\n prefixes: PREFIXES.LONG,\n value: 0.00001,\n offset: 0\n },\n lbf: {\n name: 'lbf',\n base: BASE_UNITS.FORCE,\n prefixes: PREFIXES.NONE,\n value: 4.4482216152605,\n offset: 0\n },\n poundforce: {\n name: 'poundforce',\n base: BASE_UNITS.FORCE,\n prefixes: PREFIXES.NONE,\n value: 4.4482216152605,\n offset: 0\n },\n kip: {\n name: 'kip',\n base: BASE_UNITS.FORCE,\n prefixes: PREFIXES.LONG,\n value: 4448.2216,\n offset: 0\n },\n kilogramforce: {\n name: 'kilogramforce',\n base: BASE_UNITS.FORCE,\n prefixes: PREFIXES.NONE,\n value: 9.80665,\n offset: 0\n },\n // Energy\n J: {\n name: 'J',\n base: BASE_UNITS.ENERGY,\n prefixes: PREFIXES.SHORT,\n value: 1,\n offset: 0\n },\n joule: {\n name: 'joule',\n base: BASE_UNITS.ENERGY,\n prefixes: PREFIXES.SHORT,\n value: 1,\n offset: 0\n },\n erg: {\n name: 'erg',\n base: BASE_UNITS.ENERGY,\n prefixes: PREFIXES.NONE,\n value: 1e-7,\n offset: 0\n },\n Wh: {\n name: 'Wh',\n base: BASE_UNITS.ENERGY,\n prefixes: PREFIXES.SHORT,\n value: 3600,\n offset: 0\n },\n BTU: {\n name: 'BTU',\n base: BASE_UNITS.ENERGY,\n prefixes: PREFIXES.BTU,\n value: 1055.05585262,\n offset: 0\n },\n eV: {\n name: 'eV',\n base: BASE_UNITS.ENERGY,\n prefixes: PREFIXES.SHORT,\n value: 1.602176565e-19,\n offset: 0\n },\n electronvolt: {\n name: 'electronvolt',\n base: BASE_UNITS.ENERGY,\n prefixes: PREFIXES.LONG,\n value: 1.602176565e-19,\n offset: 0\n },\n // Power\n W: {\n name: 'W',\n base: BASE_UNITS.POWER,\n prefixes: PREFIXES.SHORT,\n value: 1,\n offset: 0\n },\n watt: {\n name: 'watt',\n base: BASE_UNITS.POWER,\n prefixes: PREFIXES.LONG,\n value: 1,\n offset: 0\n },\n hp: {\n name: 'hp',\n base: BASE_UNITS.POWER,\n prefixes: PREFIXES.NONE,\n value: 745.6998715386,\n offset: 0\n },\n // Electrical power units\n VAR: {\n name: 'VAR',\n base: BASE_UNITS.POWER,\n prefixes: PREFIXES.SHORT,\n value: Complex.I,\n offset: 0\n },\n VA: {\n name: 'VA',\n base: BASE_UNITS.POWER,\n prefixes: PREFIXES.SHORT,\n value: 1,\n offset: 0\n },\n // Pressure\n Pa: {\n name: 'Pa',\n base: BASE_UNITS.PRESSURE,\n prefixes: PREFIXES.SHORT,\n value: 1,\n offset: 0\n },\n psi: {\n name: 'psi',\n base: BASE_UNITS.PRESSURE,\n prefixes: PREFIXES.NONE,\n value: 6894.75729276459,\n offset: 0\n },\n atm: {\n name: 'atm',\n base: BASE_UNITS.PRESSURE,\n prefixes: PREFIXES.NONE,\n value: 101325,\n offset: 0\n },\n bar: {\n name: 'bar',\n base: BASE_UNITS.PRESSURE,\n prefixes: PREFIXES.SHORTLONG,\n value: 100000,\n offset: 0\n },\n torr: {\n name: 'torr',\n base: BASE_UNITS.PRESSURE,\n prefixes: PREFIXES.NONE,\n value: 133.322,\n offset: 0\n },\n mmHg: {\n name: 'mmHg',\n base: BASE_UNITS.PRESSURE,\n prefixes: PREFIXES.NONE,\n value: 133.322,\n offset: 0\n },\n mmH2O: {\n name: 'mmH2O',\n base: BASE_UNITS.PRESSURE,\n prefixes: PREFIXES.NONE,\n value: 9.80665,\n offset: 0\n },\n cmH2O: {\n name: 'cmH2O',\n base: BASE_UNITS.PRESSURE,\n prefixes: PREFIXES.NONE,\n value: 98.0665,\n offset: 0\n },\n // Electric charge\n coulomb: {\n name: 'coulomb',\n base: BASE_UNITS.ELECTRIC_CHARGE,\n prefixes: PREFIXES.LONG,\n value: 1,\n offset: 0\n },\n C: {\n name: 'C',\n base: BASE_UNITS.ELECTRIC_CHARGE,\n prefixes: PREFIXES.SHORT,\n value: 1,\n offset: 0\n },\n // Electric capacitance\n farad: {\n name: 'farad',\n base: BASE_UNITS.ELECTRIC_CAPACITANCE,\n prefixes: PREFIXES.LONG,\n value: 1,\n offset: 0\n },\n F: {\n name: 'F',\n base: BASE_UNITS.ELECTRIC_CAPACITANCE,\n prefixes: PREFIXES.SHORT,\n value: 1,\n offset: 0\n },\n // Electric potential\n volt: {\n name: 'volt',\n base: BASE_UNITS.ELECTRIC_POTENTIAL,\n prefixes: PREFIXES.LONG,\n value: 1,\n offset: 0\n },\n V: {\n name: 'V',\n base: BASE_UNITS.ELECTRIC_POTENTIAL,\n prefixes: PREFIXES.SHORT,\n value: 1,\n offset: 0\n },\n // Electric resistance\n ohm: {\n name: 'ohm',\n base: BASE_UNITS.ELECTRIC_RESISTANCE,\n prefixes: PREFIXES.SHORTLONG,\n // Both Mohm and megaohm are acceptable\n value: 1,\n offset: 0\n },\n /*\n * Unicode breaks in browsers if charset is not specified\n Ω: {\n name: 'Ω',\n base: BASE_UNITS.ELECTRIC_RESISTANCE,\n prefixes: PREFIXES.SHORT,\n value: 1,\n offset: 0\n },\n */\n // Electric inductance\n henry: {\n name: 'henry',\n base: BASE_UNITS.ELECTRIC_INDUCTANCE,\n prefixes: PREFIXES.LONG,\n value: 1,\n offset: 0\n },\n H: {\n name: 'H',\n base: BASE_UNITS.ELECTRIC_INDUCTANCE,\n prefixes: PREFIXES.SHORT,\n value: 1,\n offset: 0\n },\n // Electric conductance\n siemens: {\n name: 'siemens',\n base: BASE_UNITS.ELECTRIC_CONDUCTANCE,\n prefixes: PREFIXES.LONG,\n value: 1,\n offset: 0\n },\n S: {\n name: 'S',\n base: BASE_UNITS.ELECTRIC_CONDUCTANCE,\n prefixes: PREFIXES.SHORT,\n value: 1,\n offset: 0\n },\n // Magnetic flux\n weber: {\n name: 'weber',\n base: BASE_UNITS.MAGNETIC_FLUX,\n prefixes: PREFIXES.LONG,\n value: 1,\n offset: 0\n },\n Wb: {\n name: 'Wb',\n base: BASE_UNITS.MAGNETIC_FLUX,\n prefixes: PREFIXES.SHORT,\n value: 1,\n offset: 0\n },\n // Magnetic flux density\n tesla: {\n name: 'tesla',\n base: BASE_UNITS.MAGNETIC_FLUX_DENSITY,\n prefixes: PREFIXES.LONG,\n value: 1,\n offset: 0\n },\n T: {\n name: 'T',\n base: BASE_UNITS.MAGNETIC_FLUX_DENSITY,\n prefixes: PREFIXES.SHORT,\n value: 1,\n offset: 0\n },\n // Binary\n b: {\n name: 'b',\n base: BASE_UNITS.BIT,\n prefixes: PREFIXES.BINARY_SHORT,\n value: 1,\n offset: 0\n },\n bits: {\n name: 'bits',\n base: BASE_UNITS.BIT,\n prefixes: PREFIXES.BINARY_LONG,\n value: 1,\n offset: 0\n },\n B: {\n name: 'B',\n base: BASE_UNITS.BIT,\n prefixes: PREFIXES.BINARY_SHORT,\n value: 8,\n offset: 0\n },\n bytes: {\n name: 'bytes',\n base: BASE_UNITS.BIT,\n prefixes: PREFIXES.BINARY_LONG,\n value: 8,\n offset: 0\n }\n };\n\n // aliases (formerly plurals)\n var ALIASES = {\n meters: 'meter',\n inches: 'inch',\n feet: 'foot',\n yards: 'yard',\n miles: 'mile',\n links: 'link',\n rods: 'rod',\n chains: 'chain',\n angstroms: 'angstrom',\n lt: 'l',\n litres: 'litre',\n liter: 'litre',\n liters: 'litre',\n teaspoons: 'teaspoon',\n tablespoons: 'tablespoon',\n minims: 'minim',\n fluiddrams: 'fluiddram',\n fluidounces: 'fluidounce',\n gills: 'gill',\n cups: 'cup',\n pints: 'pint',\n quarts: 'quart',\n gallons: 'gallon',\n beerbarrels: 'beerbarrel',\n oilbarrels: 'oilbarrel',\n hogsheads: 'hogshead',\n gtts: 'gtt',\n grams: 'gram',\n tons: 'ton',\n tonnes: 'tonne',\n grains: 'grain',\n drams: 'dram',\n ounces: 'ounce',\n poundmasses: 'poundmass',\n hundredweights: 'hundredweight',\n sticks: 'stick',\n lb: 'lbm',\n lbs: 'lbm',\n kips: 'kip',\n kgf: 'kilogramforce',\n acres: 'acre',\n hectares: 'hectare',\n sqfeet: 'sqft',\n sqyard: 'sqyd',\n sqmile: 'sqmi',\n sqmiles: 'sqmi',\n mmhg: 'mmHg',\n mmh2o: 'mmH2O',\n cmh2o: 'cmH2O',\n seconds: 'second',\n secs: 'second',\n minutes: 'minute',\n mins: 'minute',\n hours: 'hour',\n hr: 'hour',\n hrs: 'hour',\n days: 'day',\n weeks: 'week',\n months: 'month',\n years: 'year',\n decades: 'decade',\n centuries: 'century',\n millennia: 'millennium',\n hertz: 'hertz',\n radians: 'radian',\n degrees: 'degree',\n gradians: 'gradian',\n cycles: 'cycle',\n arcsecond: 'arcsec',\n arcseconds: 'arcsec',\n arcminute: 'arcmin',\n arcminutes: 'arcmin',\n BTUs: 'BTU',\n watts: 'watt',\n joules: 'joule',\n amperes: 'ampere',\n amps: 'ampere',\n amp: 'ampere',\n coulombs: 'coulomb',\n volts: 'volt',\n ohms: 'ohm',\n farads: 'farad',\n webers: 'weber',\n teslas: 'tesla',\n electronvolts: 'electronvolt',\n moles: 'mole',\n bit: 'bits',\n byte: 'bytes'\n };\n\n /**\n * Calculate the values for the angle units.\n * Value is calculated as number or BigNumber depending on the configuration\n * @param {{number: 'number' | 'BigNumber'}} config\n */\n function calculateAngleValues(config) {\n if (config.number === 'BigNumber') {\n var pi = createPi(_BigNumber);\n UNITS.rad.value = new _BigNumber(1);\n UNITS.deg.value = pi.div(180); // 2 * pi / 360\n UNITS.grad.value = pi.div(200); // 2 * pi / 400\n UNITS.cycle.value = pi.times(2); // 2 * pi\n UNITS.arcsec.value = pi.div(648000); // 2 * pi / 360 / 3600\n UNITS.arcmin.value = pi.div(10800); // 2 * pi / 360 / 60\n } else {\n // number\n UNITS.rad.value = 1;\n UNITS.deg.value = Math.PI / 180; // 2 * pi / 360\n UNITS.grad.value = Math.PI / 200; // 2 * pi / 400\n UNITS.cycle.value = Math.PI * 2; // 2 * pi\n UNITS.arcsec.value = Math.PI / 648000; // 2 * pi / 360 / 3600\n UNITS.arcmin.value = Math.PI / 10800; // 2 * pi / 360 / 60\n }\n\n // copy to the full names of the angles\n UNITS.radian.value = UNITS.rad.value;\n UNITS.degree.value = UNITS.deg.value;\n UNITS.gradian.value = UNITS.grad.value;\n }\n\n // apply the angle values now\n calculateAngleValues(config);\n if (on) {\n // recalculate the values on change of configuration\n on('config', function (curr, prev) {\n if (curr.number !== prev.number) {\n calculateAngleValues(curr);\n }\n });\n }\n\n /**\n * A unit system is a set of dimensionally independent base units plus a set of derived units, formed by multiplication and division of the base units, that are by convention used with the unit system.\n * A user perhaps could issue a command to select a preferred unit system, or use the default (see below).\n * Auto unit system: The default unit system is updated on the fly anytime a unit is parsed. The corresponding unit in the default unit system is updated, so that answers are given in the same units the user supplies.\n */\n var UNIT_SYSTEMS = {\n si: {\n // Base units\n NONE: {\n unit: UNIT_NONE,\n prefix: PREFIXES.NONE['']\n },\n LENGTH: {\n unit: UNITS.m,\n prefix: PREFIXES.SHORT['']\n },\n MASS: {\n unit: UNITS.g,\n prefix: PREFIXES.SHORT.k\n },\n TIME: {\n unit: UNITS.s,\n prefix: PREFIXES.SHORT['']\n },\n CURRENT: {\n unit: UNITS.A,\n prefix: PREFIXES.SHORT['']\n },\n TEMPERATURE: {\n unit: UNITS.K,\n prefix: PREFIXES.SHORT['']\n },\n LUMINOUS_INTENSITY: {\n unit: UNITS.cd,\n prefix: PREFIXES.SHORT['']\n },\n AMOUNT_OF_SUBSTANCE: {\n unit: UNITS.mol,\n prefix: PREFIXES.SHORT['']\n },\n ANGLE: {\n unit: UNITS.rad,\n prefix: PREFIXES.SHORT['']\n },\n BIT: {\n unit: UNITS.bits,\n prefix: PREFIXES.SHORT['']\n },\n // Derived units\n FORCE: {\n unit: UNITS.N,\n prefix: PREFIXES.SHORT['']\n },\n ENERGY: {\n unit: UNITS.J,\n prefix: PREFIXES.SHORT['']\n },\n POWER: {\n unit: UNITS.W,\n prefix: PREFIXES.SHORT['']\n },\n PRESSURE: {\n unit: UNITS.Pa,\n prefix: PREFIXES.SHORT['']\n },\n ELECTRIC_CHARGE: {\n unit: UNITS.C,\n prefix: PREFIXES.SHORT['']\n },\n ELECTRIC_CAPACITANCE: {\n unit: UNITS.F,\n prefix: PREFIXES.SHORT['']\n },\n ELECTRIC_POTENTIAL: {\n unit: UNITS.V,\n prefix: PREFIXES.SHORT['']\n },\n ELECTRIC_RESISTANCE: {\n unit: UNITS.ohm,\n prefix: PREFIXES.SHORT['']\n },\n ELECTRIC_INDUCTANCE: {\n unit: UNITS.H,\n prefix: PREFIXES.SHORT['']\n },\n ELECTRIC_CONDUCTANCE: {\n unit: UNITS.S,\n prefix: PREFIXES.SHORT['']\n },\n MAGNETIC_FLUX: {\n unit: UNITS.Wb,\n prefix: PREFIXES.SHORT['']\n },\n MAGNETIC_FLUX_DENSITY: {\n unit: UNITS.T,\n prefix: PREFIXES.SHORT['']\n },\n FREQUENCY: {\n unit: UNITS.Hz,\n prefix: PREFIXES.SHORT['']\n }\n }\n };\n\n // Clone to create the other unit systems\n UNIT_SYSTEMS.cgs = JSON.parse(JSON.stringify(UNIT_SYSTEMS.si));\n UNIT_SYSTEMS.cgs.LENGTH = {\n unit: UNITS.m,\n prefix: PREFIXES.SHORT.c\n };\n UNIT_SYSTEMS.cgs.MASS = {\n unit: UNITS.g,\n prefix: PREFIXES.SHORT['']\n };\n UNIT_SYSTEMS.cgs.FORCE = {\n unit: UNITS.dyn,\n prefix: PREFIXES.SHORT['']\n };\n UNIT_SYSTEMS.cgs.ENERGY = {\n unit: UNITS.erg,\n prefix: PREFIXES.NONE['']\n };\n // there are wholly 4 unique cgs systems for electricity and magnetism,\n // so let's not worry about it unless somebody complains\n\n UNIT_SYSTEMS.us = JSON.parse(JSON.stringify(UNIT_SYSTEMS.si));\n UNIT_SYSTEMS.us.LENGTH = {\n unit: UNITS.ft,\n prefix: PREFIXES.NONE['']\n };\n UNIT_SYSTEMS.us.MASS = {\n unit: UNITS.lbm,\n prefix: PREFIXES.NONE['']\n };\n UNIT_SYSTEMS.us.TEMPERATURE = {\n unit: UNITS.degF,\n prefix: PREFIXES.NONE['']\n };\n UNIT_SYSTEMS.us.FORCE = {\n unit: UNITS.lbf,\n prefix: PREFIXES.NONE['']\n };\n UNIT_SYSTEMS.us.ENERGY = {\n unit: UNITS.BTU,\n prefix: PREFIXES.BTU['']\n };\n UNIT_SYSTEMS.us.POWER = {\n unit: UNITS.hp,\n prefix: PREFIXES.NONE['']\n };\n UNIT_SYSTEMS.us.PRESSURE = {\n unit: UNITS.psi,\n prefix: PREFIXES.NONE['']\n };\n\n // Add additional unit systems here.\n\n // Choose a unit system to seed the auto unit system.\n UNIT_SYSTEMS.auto = JSON.parse(JSON.stringify(UNIT_SYSTEMS.si));\n\n // Set the current unit system\n var currentUnitSystem = UNIT_SYSTEMS.auto;\n\n /**\n * Set a unit system for formatting derived units.\n * @param {string} [name] The name of the unit system.\n */\n Unit.setUnitSystem = function (name) {\n if (hasOwnProperty(UNIT_SYSTEMS, name)) {\n currentUnitSystem = UNIT_SYSTEMS[name];\n } else {\n throw new Error('Unit system ' + name + ' does not exist. Choices are: ' + Object.keys(UNIT_SYSTEMS).join(', '));\n }\n };\n\n /**\n * Return the current unit system.\n * @return {string} The current unit system.\n */\n Unit.getUnitSystem = function () {\n for (var _key in UNIT_SYSTEMS) {\n if (hasOwnProperty(UNIT_SYSTEMS, _key)) {\n if (UNIT_SYSTEMS[_key] === currentUnitSystem) {\n return _key;\n }\n }\n }\n };\n\n /**\n * Converters to convert from number to an other numeric type like BigNumber\n * or Fraction\n */\n Unit.typeConverters = {\n BigNumber: function BigNumber(x) {\n if (x !== null && x !== void 0 && x.isFraction) return new _BigNumber(x.n).div(x.d).times(x.s);\n return new _BigNumber(x + ''); // stringify to prevent constructor error\n },\n\n Fraction: function Fraction(x) {\n return new _Fraction(x);\n },\n Complex: function Complex(x) {\n return x;\n },\n number: function number(x) {\n if (x !== null && x !== void 0 && x.isFraction) return _number(x);\n return x;\n }\n };\n\n /**\n * Retrieve the right converter function corresponding with this unit's\n * value\n *\n * @memberof Unit\n * @return {Function}\n */\n Unit.prototype._numberConverter = function () {\n var convert = Unit.typeConverters[this.valueType()];\n if (convert) {\n return convert;\n }\n throw new TypeError('Unsupported Unit value type \"' + this.valueType() + '\"');\n };\n\n /**\n * Retrieve the right convertor function corresponding with the type\n * of provided exampleValue.\n *\n * @param {string} type A string 'number', 'BigNumber', or 'Fraction'\n * In case of an unknown type,\n * @return {Function}\n */\n Unit._getNumberConverter = function (type) {\n if (!Unit.typeConverters[type]) {\n throw new TypeError('Unsupported type \"' + type + '\"');\n }\n return Unit.typeConverters[type];\n };\n\n // Add dimensions to each built-in unit\n for (var _key2 in UNITS) {\n if (hasOwnProperty(UNITS, _key2)) {\n var unit = UNITS[_key2];\n unit.dimensions = unit.base.dimensions;\n }\n }\n\n // Create aliases\n for (var _name2 in ALIASES) {\n if (hasOwnProperty(ALIASES, _name2)) {\n var _unit2 = UNITS[ALIASES[_name2]];\n var alias = {};\n for (var _key3 in _unit2) {\n if (hasOwnProperty(_unit2, _key3)) {\n alias[_key3] = _unit2[_key3];\n }\n }\n alias.name = _name2;\n UNITS[_name2] = alias;\n }\n }\n\n /**\n * Checks if a character is a valid latin letter (upper or lower case).\n * Note that this function can be overridden, for example to allow support of other alphabets.\n * @param {string} c Tested character\n */\n Unit.isValidAlpha = function isValidAlpha(c) {\n return /^[a-zA-Z]$/.test(c);\n };\n function assertUnitNameIsValid(name) {\n for (var i = 0; i < name.length; i++) {\n c = name.charAt(i);\n if (i === 0 && !Unit.isValidAlpha(c)) {\n throw new Error('Invalid unit name (must begin with alpha character): \"' + name + '\"');\n }\n if (i > 0 && !(Unit.isValidAlpha(c) || isDigit(c))) {\n throw new Error('Invalid unit name (only alphanumeric characters are allowed): \"' + name + '\"');\n }\n }\n }\n\n /**\n * Wrapper around createUnitSingle.\n * Example:\n * createUnit({\n * foo: { },\n * bar: {\n * definition: 'kg/foo',\n * aliases: ['ba', 'barr', 'bars'],\n * offset: 200\n * },\n * baz: '4 bar'\n * },\n * {\n * override: true\n * })\n * @param {object} obj Object map. Each key becomes a unit which is defined by its value.\n * @param {object} options\n */\n Unit.createUnit = function (obj, options) {\n if (typeof obj !== 'object') {\n throw new TypeError(\"createUnit expects first parameter to be of type 'Object'\");\n }\n\n // Remove all units and aliases we are overriding\n if (options && options.override) {\n for (var _key4 in obj) {\n if (hasOwnProperty(obj, _key4)) {\n Unit.deleteUnit(_key4);\n }\n if (obj[_key4].aliases) {\n for (var i = 0; i < obj[_key4].aliases.length; i++) {\n Unit.deleteUnit(obj[_key4].aliases[i]);\n }\n }\n }\n }\n\n // TODO: traverse multiple times until all units have been added\n var lastUnit;\n for (var _key5 in obj) {\n if (hasOwnProperty(obj, _key5)) {\n lastUnit = Unit.createUnitSingle(_key5, obj[_key5]);\n }\n }\n return lastUnit;\n };\n\n /**\n * Create a user-defined unit and register it with the Unit type.\n * Example:\n * createUnitSingle('knot', '0.514444444 m/s')\n * createUnitSingle('acre', new Unit(43560, 'ft^2'))\n *\n * @param {string} name The name of the new unit. Must be unique. Example: 'knot'\n * @param {string, Unit, Object} definition Definition of the unit in terms\n * of existing units. For example, '0.514444444 m / s'. Can be a Unit, a string,\n * or an Object. If an Object, may have the following properties:\n * - definition {string|Unit} The definition of this unit.\n * - prefixes {string} \"none\", \"short\", \"long\", \"binary_short\", or \"binary_long\".\n * The default is \"none\".\n * - aliases {Array} Array of strings. Example: ['knots', 'kt', 'kts']\n * - offset {Numeric} An offset to apply when converting from the unit. For\n * example, the offset for celsius is 273.15 and the offset for farhenheit\n * is 459.67. Default is 0.\n * - baseName {string} If the unit's dimension does not match that of any other\n * base unit, the name of the newly create base unit. Otherwise, this property\n * has no effect.\n *\n * @return {Unit}\n */\n Unit.createUnitSingle = function (name, obj) {\n if (typeof obj === 'undefined' || obj === null) {\n obj = {};\n }\n if (typeof name !== 'string') {\n throw new TypeError(\"createUnitSingle expects first parameter to be of type 'string'\");\n }\n\n // Check collisions with existing units\n if (hasOwnProperty(UNITS, name)) {\n throw new Error('Cannot create unit \"' + name + '\": a unit with that name already exists');\n }\n\n // TODO: Validate name for collisions with other built-in functions (like abs or cos, for example), and for acceptable variable names. For example, '42' is probably not a valid unit. Nor is '%', since it is also an operator.\n\n assertUnitNameIsValid(name);\n var defUnit = null; // The Unit from which the new unit will be created.\n var aliases = [];\n var offset = 0;\n var definition;\n var prefixes;\n var baseName;\n if (obj && obj.type === 'Unit') {\n defUnit = obj.clone();\n } else if (typeof obj === 'string') {\n if (obj !== '') {\n definition = obj;\n }\n } else if (typeof obj === 'object') {\n definition = obj.definition;\n prefixes = obj.prefixes;\n offset = obj.offset;\n baseName = obj.baseName;\n if (obj.aliases) {\n aliases = obj.aliases.valueOf(); // aliases could be a Matrix, so convert to Array\n }\n } else {\n throw new TypeError('Cannot create unit \"' + name + '\" from \"' + obj.toString() + '\": expecting \"string\" or \"Unit\" or \"Object\"');\n }\n if (aliases) {\n for (var i = 0; i < aliases.length; i++) {\n if (hasOwnProperty(UNITS, aliases[i])) {\n throw new Error('Cannot create alias \"' + aliases[i] + '\": a unit with that name already exists');\n }\n }\n }\n if (definition && typeof definition === 'string' && !defUnit) {\n try {\n defUnit = Unit.parse(definition, {\n allowNoUnits: true\n });\n } catch (ex) {\n ex.message = 'Could not create unit \"' + name + '\" from \"' + definition + '\": ' + ex.message;\n throw ex;\n }\n } else if (definition && definition.type === 'Unit') {\n defUnit = definition.clone();\n }\n aliases = aliases || [];\n offset = offset || 0;\n if (prefixes && prefixes.toUpperCase) {\n prefixes = PREFIXES[prefixes.toUpperCase()] || PREFIXES.NONE;\n } else {\n prefixes = PREFIXES.NONE;\n }\n\n // If defUnit is null, it is because the user did not\n // specify a defintion. So create a new base dimension.\n var newUnit = {};\n if (!defUnit) {\n // Add a new base dimension\n baseName = baseName || name + '_STUFF'; // foo --> foo_STUFF, or the essence of foo\n if (BASE_DIMENSIONS.indexOf(baseName) >= 0) {\n throw new Error('Cannot create new base unit \"' + name + '\": a base unit with that name already exists (and cannot be overridden)');\n }\n BASE_DIMENSIONS.push(baseName);\n\n // Push 0 onto existing base units\n for (var b in BASE_UNITS) {\n if (hasOwnProperty(BASE_UNITS, b)) {\n BASE_UNITS[b].dimensions[BASE_DIMENSIONS.length - 1] = 0;\n }\n }\n\n // Add the new base unit\n var newBaseUnit = {\n dimensions: []\n };\n for (var _i6 = 0; _i6 < BASE_DIMENSIONS.length; _i6++) {\n newBaseUnit.dimensions[_i6] = 0;\n }\n newBaseUnit.dimensions[BASE_DIMENSIONS.length - 1] = 1;\n newBaseUnit.key = baseName;\n BASE_UNITS[baseName] = newBaseUnit;\n newUnit = {\n name,\n value: 1,\n dimensions: BASE_UNITS[baseName].dimensions.slice(0),\n prefixes,\n offset,\n base: BASE_UNITS[baseName]\n };\n currentUnitSystem[baseName] = {\n unit: newUnit,\n prefix: PREFIXES.NONE['']\n };\n } else {\n newUnit = {\n name,\n value: defUnit.value,\n dimensions: defUnit.dimensions.slice(0),\n prefixes,\n offset\n };\n\n // Create a new base if no matching base exists\n var anyMatch = false;\n for (var _i7 in BASE_UNITS) {\n if (hasOwnProperty(BASE_UNITS, _i7)) {\n var match = true;\n for (var j = 0; j < BASE_DIMENSIONS.length; j++) {\n if (Math.abs((newUnit.dimensions[j] || 0) - (BASE_UNITS[_i7].dimensions[j] || 0)) > 1e-12) {\n match = false;\n break;\n }\n }\n if (match) {\n anyMatch = true;\n newUnit.base = BASE_UNITS[_i7];\n break;\n }\n }\n }\n if (!anyMatch) {\n baseName = baseName || name + '_STUFF'; // foo --> foo_STUFF, or the essence of foo\n // Add the new base unit\n var _newBaseUnit = {\n dimensions: defUnit.dimensions.slice(0)\n };\n _newBaseUnit.key = baseName;\n BASE_UNITS[baseName] = _newBaseUnit;\n currentUnitSystem[baseName] = {\n unit: newUnit,\n prefix: PREFIXES.NONE['']\n };\n newUnit.base = BASE_UNITS[baseName];\n }\n }\n Unit.UNITS[name] = newUnit;\n for (var _i8 = 0; _i8 < aliases.length; _i8++) {\n var aliasName = aliases[_i8];\n var _alias = {};\n for (var _key6 in newUnit) {\n if (hasOwnProperty(newUnit, _key6)) {\n _alias[_key6] = newUnit[_key6];\n }\n }\n _alias.name = aliasName;\n Unit.UNITS[aliasName] = _alias;\n }\n // delete the memoization cache, since adding a new unit to the array\n // invalidates all old results\n delete _findUnit.cache;\n return new Unit(null, name);\n };\n Unit.deleteUnit = function (name) {\n delete Unit.UNITS[name];\n };\n\n // expose arrays with prefixes, dimensions, units, systems\n Unit.PREFIXES = PREFIXES;\n Unit.BASE_DIMENSIONS = BASE_DIMENSIONS;\n Unit.BASE_UNITS = BASE_UNITS;\n Unit.UNIT_SYSTEMS = UNIT_SYSTEMS;\n Unit.UNITS = UNITS;\n return Unit;\n}, {\n isClass: true\n});","import { factory } from '../../../utils/factory.js';\nimport { deepMap } from '../../../utils/collection.js';\nvar name = 'unit';\nvar dependencies = ['typed', 'Unit'];\n\n// This function is named createUnitFunction to prevent a naming conflict with createUnit\nexport var createUnitFunction = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n Unit\n } = _ref;\n /**\n * Create a unit. Depending on the passed arguments, the function\n * will create and return a new math.Unit object.\n * When a matrix is provided, all elements will be converted to units.\n *\n * Syntax:\n *\n * math.unit(unit : string)\n * math.unit(value : number, valuelessUnit : Unit)\n * math.unit(value : number, valuelessUnit : string)\n *\n * Examples:\n *\n * const kph = math.unit('km/h') // returns Unit km/h (valueless)\n * const v = math.unit(25, kph) // returns Unit 25 km/h\n * const a = math.unit(5, 'cm') // returns Unit 50 mm\n * const b = math.unit('23 kg') // returns Unit 23 kg\n * a.to('m') // returns Unit 0.05 m\n *\n * See also:\n *\n * bignumber, boolean, complex, index, matrix, number, string, createUnit\n *\n * @param {* | Array | Matrix} args A number and unit.\n * @return {Unit | Array | Matrix} The created unit\n */\n\n return typed(name, {\n Unit: function Unit(x) {\n return x.clone();\n },\n string: function string(x) {\n if (Unit.isValuelessUnit(x)) {\n return new Unit(null, x); // a pure unit\n }\n\n return Unit.parse(x, {\n allowNoUnits: true\n }); // a unit with value, like '5cm'\n },\n\n 'number | BigNumber | Fraction | Complex, string | Unit': function numberBigNumberFractionComplexStringUnit(value, unit) {\n return new Unit(value, unit);\n },\n 'number | BigNumber | Fraction': function numberBigNumberFraction(value) {\n // dimensionless\n return new Unit(value);\n },\n 'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self))\n });\n});","import { factory } from '../../../utils/factory.js';\nvar name = 'sparse';\nvar dependencies = ['typed', 'SparseMatrix'];\nexport var createSparse = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n SparseMatrix\n } = _ref;\n /**\n * Create a Sparse Matrix. The function creates a new `math.Matrix` object from\n * an `Array`. A Matrix has utility functions to manipulate the data in the\n * matrix, like getting the size and getting or setting values in the matrix.\n * Note that a Sparse Matrix is always 2-dimensional, so for example if\n * you create one from a plain array of _n_ numbers, you get an _n_ by 1\n * Sparse \"column vector\".\n *\n * Syntax:\n *\n * math.sparse() // creates an empty sparse matrix.\n * math.sparse(data) // creates a sparse matrix with initial data.\n * math.sparse(data, 'number') // creates a sparse matrix with initial data, number datatype.\n *\n * Examples:\n *\n * let m = math.sparse([[1, 2], [3, 4]])\n * m.size() // Array [2, 2]\n * m.resize([3, 2], 5)\n * m.valueOf() // Array [[1, 2], [3, 4], [5, 5]]\n * m.get([1, 0]) // number 3\n * let v = math.sparse([0, 0, 1])\n * v.size() // Array [3, 1]\n * v.get([2, 0]) // number 1\n *\n * See also:\n *\n * bignumber, boolean, complex, index, number, string, unit, matrix\n *\n * @param {Array | Matrix} [data] A two dimensional array\n *\n * @return {Matrix} The created matrix\n */\n return typed(name, {\n '': function _() {\n return new SparseMatrix([]);\n },\n string: function string(datatype) {\n return new SparseMatrix([], datatype);\n },\n 'Array | Matrix': function ArrayMatrix(data) {\n return new SparseMatrix(data);\n },\n 'Array | Matrix, string': function ArrayMatrixString(data, datatype) {\n return new SparseMatrix(data, datatype);\n }\n });\n});","import { factory } from '../../../utils/factory.js';\nvar name = 'createUnit';\nvar dependencies = ['typed', 'Unit'];\nexport var createCreateUnit = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n Unit\n } = _ref;\n /**\n * Create a user-defined unit and register it with the Unit type.\n *\n * Syntax:\n *\n * math.createUnit({\n * baseUnit1: {\n * aliases: [string, ...]\n * prefixes: object\n * },\n * unit2: {\n * definition: string,\n * aliases: [string, ...]\n * prefixes: object,\n * offset: number\n * },\n * unit3: string // Shortcut\n * })\n *\n * // Another shortcut:\n * math.createUnit(string, unit : string, [object])\n *\n * Examples:\n *\n * math.createUnit('foo')\n * math.createUnit('knot', {definition: '0.514444444 m/s', aliases: ['knots', 'kt', 'kts']})\n * math.createUnit('mph', '1 mile/hour')\n * math.createUnit('km', math.unit(1000, 'm'))\n *\n * @param {string} name The name of the new unit. Must be unique. Example: 'knot'\n * @param {string, UnitDefinition, Unit} definition Definition of the unit in terms of existing units. For example, '0.514444444 m / s'.\n * @param {Object} options (optional) An object containing any of the following properties:\n * - `prefixes {string}` \"none\", \"short\", \"long\", \"binary_short\", or \"binary_long\". The default is \"none\".\n * - `aliases {Array}` Array of strings. Example: ['knots', 'kt', 'kts']\n * - `offset {Numeric}` An offset to apply when converting from the unit. For example, the offset for celsius is 273.15. Default is 0.\n *\n * See also:\n *\n * unit\n *\n * @return {Unit} The new unit\n */\n return typed(name, {\n // General function signature. First parameter is an object where each property is the definition of a new unit. The object keys are the unit names and the values are the definitions. The values can be objects, strings, or Units. If a property is an empty object or an empty string, a new base unit is created. The second parameter is the options.\n 'Object, Object': function ObjectObject(obj, options) {\n return Unit.createUnit(obj, options);\n },\n // Same as above but without the options.\n Object: function Object(obj) {\n return Unit.createUnit(obj, {});\n },\n // Shortcut method for creating one unit.\n 'string, Unit | string | Object, Object': function stringUnitStringObjectObject(name, def, options) {\n var obj = {};\n obj[name] = def;\n return Unit.createUnit(obj, options);\n },\n // Same as above but without the options.\n 'string, Unit | string | Object': function stringUnitStringObject(name, def) {\n var obj = {};\n obj[name] = def;\n return Unit.createUnit(obj, {});\n },\n // Without a definition, creates a base unit.\n string: function string(name) {\n var obj = {};\n obj[name] = {};\n return Unit.createUnit(obj, {});\n }\n });\n});","import { factory } from '../../utils/factory.js';\nvar name = 'acos';\nvar dependencies = ['typed', 'config', 'Complex'];\nexport var createAcos = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n config,\n Complex\n } = _ref;\n /**\n * Calculate the inverse cosine of a value.\n *\n * To avoid confusion with the matrix arccosine, this function does not\n * apply to matrices.\n *\n * Syntax:\n *\n * math.acos(x)\n *\n * Examples:\n *\n * math.acos(0.5) // returns number 1.0471975511965979\n * math.acos(math.cos(1.5)) // returns number 1.5\n *\n * math.acos(2) // returns Complex 0 + 1.3169578969248166 i\n *\n * See also:\n *\n * cos, atan, asin\n *\n * @param {number | BigNumber | Complex} x Function input\n * @return {number | BigNumber | Complex} The arc cosine of x\n */\n return typed(name, {\n number: function number(x) {\n if (x >= -1 && x <= 1 || config.predictable) {\n return Math.acos(x);\n } else {\n return new Complex(x, 0).acos();\n }\n },\n Complex: function Complex(x) {\n return x.acos();\n },\n BigNumber: function BigNumber(x) {\n return x.acos();\n }\n });\n});","import { factory } from '../../utils/factory.js';\nimport { acoshNumber } from '../../plain/number/index.js';\nvar name = 'acosh';\nvar dependencies = ['typed', 'config', 'Complex'];\nexport var createAcosh = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n config,\n Complex\n } = _ref;\n /**\n * Calculate the hyperbolic arccos of a value,\n * defined as `acosh(x) = ln(sqrt(x^2 - 1) + x)`.\n *\n * For matrices, the function is evaluated element wise.\n *\n * Syntax:\n *\n * math.acosh(x)\n *\n * Examples:\n *\n * math.acosh(1.5) // returns 0.9624236501192069\n *\n * See also:\n *\n * cosh, asinh, atanh\n *\n * @param {number | BigNumber | Complex} x Function input\n * @return {number | BigNumber | Complex} Hyperbolic arccosine of x\n */\n return typed(name, {\n number: function number(x) {\n if (x >= 1 || config.predictable) {\n return acoshNumber(x);\n }\n if (x <= -1) {\n return new Complex(Math.log(Math.sqrt(x * x - 1) - x), Math.PI);\n }\n return new Complex(x, 0).acosh();\n },\n Complex: function Complex(x) {\n return x.acosh();\n },\n BigNumber: function BigNumber(x) {\n return x.acosh();\n }\n });\n});","import { factory } from '../../utils/factory.js';\nimport { acotNumber } from '../../plain/number/index.js';\nvar name = 'acot';\nvar dependencies = ['typed', 'BigNumber'];\nexport var createAcot = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n BigNumber: _BigNumber\n } = _ref;\n /**\n * Calculate the inverse cotangent of a value, defined as `acot(x) = atan(1/x)`.\n *\n * To avoid confusion with the matrix arccotanget, this function does not\n * apply to matrices.\n *\n * Syntax:\n *\n * math.acot(x)\n *\n * Examples:\n *\n * math.acot(0.5) // returns number 1.1071487177940904\n * math.acot(2) // returns number 0.4636476090008061\n * math.acot(math.cot(1.5)) // returns number 1.5\n *\n * See also:\n *\n * cot, atan\n *\n * @param {number | BigNumber| Complex} x Function input\n * @return {number | BigNumber| Complex} The arc cotangent of x\n */\n return typed(name, {\n number: acotNumber,\n Complex: function Complex(x) {\n return x.acot();\n },\n BigNumber: function BigNumber(x) {\n return new _BigNumber(1).div(x).atan();\n }\n });\n});","import { factory } from '../../utils/factory.js';\nimport { acothNumber } from '../../plain/number/index.js';\nvar name = 'acoth';\nvar dependencies = ['typed', 'config', 'Complex', 'BigNumber'];\nexport var createAcoth = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n config,\n Complex,\n BigNumber: _BigNumber\n } = _ref;\n /**\n * Calculate the hyperbolic arccotangent of a value,\n * defined as `acoth(x) = atanh(1/x) = (ln((x+1)/x) + ln(x/(x-1))) / 2`.\n *\n * To avoid confusion with the matrix hyperbolic arccotangent, this\n * function does not apply to matrices.\n *\n * Syntax:\n *\n * math.acoth(x)\n *\n * Examples:\n *\n * math.acoth(0.5) // returns 0.8047189562170503\n *\n * See also:\n *\n * acsch, asech\n *\n * @param {number | BigNumber | Complex} x Function input\n * @return {number | BigNumber | Complex} Hyperbolic arccotangent of x\n */\n return typed(name, {\n number: function number(x) {\n if (x >= 1 || x <= -1 || config.predictable) {\n return acothNumber(x);\n }\n return new Complex(x, 0).acoth();\n },\n Complex: function Complex(x) {\n return x.acoth();\n },\n BigNumber: function BigNumber(x) {\n return new _BigNumber(1).div(x).atanh();\n }\n });\n});","import { factory } from '../../utils/factory.js';\nimport { acscNumber } from '../../plain/number/index.js';\nvar name = 'acsc';\nvar dependencies = ['typed', 'config', 'Complex', 'BigNumber'];\nexport var createAcsc = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n config,\n Complex,\n BigNumber: _BigNumber\n } = _ref;\n /**\n * Calculate the inverse cosecant of a value, defined as `acsc(x) = asin(1/x)`.\n *\n * To avoid confusion with the matrix arccosecant, this function does not\n * apply to matrices.\n *\n * Syntax:\n *\n * math.acsc(x)\n *\n * Examples:\n *\n * math.acsc(2) // returns 0.5235987755982989\n * math.acsc(0.5) // returns Complex 1.5707963267948966 -1.3169578969248166i\n * math.acsc(math.csc(1.5)) // returns number ~1.5\n *\n * See also:\n *\n * csc, asin, asec\n *\n * @param {number | BigNumber | Complex} x Function input\n * @return {number | BigNumber | Complex} The arc cosecant of x\n */\n return typed(name, {\n number: function number(x) {\n if (x <= -1 || x >= 1 || config.predictable) {\n return acscNumber(x);\n }\n return new Complex(x, 0).acsc();\n },\n Complex: function Complex(x) {\n return x.acsc();\n },\n BigNumber: function BigNumber(x) {\n return new _BigNumber(1).div(x).asin();\n }\n });\n});","import { factory } from '../../utils/factory.js';\nimport { acschNumber } from '../../plain/number/index.js';\nvar name = 'acsch';\nvar dependencies = ['typed', 'BigNumber'];\nexport var createAcsch = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n BigNumber: _BigNumber\n } = _ref;\n /**\n * Calculate the hyperbolic arccosecant of a value,\n * defined as `acsch(x) = asinh(1/x) = ln(1/x + sqrt(1/x^2 + 1))`.\n *\n * To avoid confusion with the matrix hyperbolic arccosecant, this function\n * does not apply to matrices.\n *\n * Syntax:\n *\n * math.acsch(x)\n *\n * Examples:\n *\n * math.acsch(0.5) // returns 1.4436354751788103\n *\n * See also:\n *\n * asech, acoth\n *\n * @param {number | BigNumber | Complex} x Function input\n * @return {number | BigNumber | Complex} Hyperbolic arccosecant of x\n */\n return typed(name, {\n number: acschNumber,\n Complex: function Complex(x) {\n return x.acsch();\n },\n BigNumber: function BigNumber(x) {\n return new _BigNumber(1).div(x).asinh();\n }\n });\n});","import { factory } from '../../utils/factory.js';\nimport { asecNumber } from '../../plain/number/index.js';\nvar name = 'asec';\nvar dependencies = ['typed', 'config', 'Complex', 'BigNumber'];\nexport var createAsec = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n config,\n Complex,\n BigNumber: _BigNumber\n } = _ref;\n /**\n * Calculate the inverse secant of a value. Defined as `asec(x) = acos(1/x)`.\n *\n * To avoid confusion with the matrix arcsecant, this function does not\n * apply to matrices.\n *\n * Syntax:\n *\n * math.asec(x)\n *\n * Examples:\n *\n * math.asec(2) // returns 1.0471975511965979\n * math.asec(math.sec(1.5)) // returns 1.5\n *\n * math.asec(0.5) // returns Complex 0 + 1.3169578969248166i\n *\n * See also:\n *\n * acos, acot, acsc\n *\n * @param {number | BigNumber | Complex} x Function input\n * @return {number | BigNumber | Complex} The arc secant of x\n */\n return typed(name, {\n number: function number(x) {\n if (x <= -1 || x >= 1 || config.predictable) {\n return asecNumber(x);\n }\n return new Complex(x, 0).asec();\n },\n Complex: function Complex(x) {\n return x.asec();\n },\n BigNumber: function BigNumber(x) {\n return new _BigNumber(1).div(x).acos();\n }\n });\n});","import { factory } from '../../utils/factory.js';\nimport { asechNumber } from '../../plain/number/index.js';\nvar name = 'asech';\nvar dependencies = ['typed', 'config', 'Complex', 'BigNumber'];\nexport var createAsech = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n config,\n Complex,\n BigNumber: _BigNumber\n } = _ref;\n /**\n * Calculate the hyperbolic arcsecant of a value,\n * defined as `asech(x) = acosh(1/x) = ln(sqrt(1/x^2 - 1) + 1/x)`.\n *\n * To avoid confusion with the matrix hyperbolic arcsecant, this function\n * does not apply to matrices.\n *\n * Syntax:\n *\n * math.asech(x)\n *\n * Examples:\n *\n * math.asech(0.5) // returns 1.3169578969248166\n *\n * See also:\n *\n * acsch, acoth\n *\n * @param {number | BigNumber | Complex} x Function input\n * @return {number | BigNumber | Complex} Hyperbolic arcsecant of x\n */\n return typed(name, {\n number: function number(x) {\n if (x <= 1 && x >= -1 || config.predictable) {\n var xInv = 1 / x;\n if (xInv > 0 || config.predictable) {\n return asechNumber(x);\n }\n var ret = Math.sqrt(xInv * xInv - 1);\n return new Complex(Math.log(ret - xInv), Math.PI);\n }\n return new Complex(x, 0).asech();\n },\n Complex: function Complex(x) {\n return x.asech();\n },\n BigNumber: function BigNumber(x) {\n return new _BigNumber(1).div(x).acosh();\n }\n });\n});","import { factory } from '../../utils/factory.js';\nvar name = 'asin';\nvar dependencies = ['typed', 'config', 'Complex'];\nexport var createAsin = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n config,\n Complex\n } = _ref;\n /**\n * Calculate the inverse sine of a value.\n *\n * To avoid confusion with the matric arcsine, this function does not apply\n * to matrices.\n *\n * Syntax:\n *\n * math.asin(x)\n *\n * Examples:\n *\n * math.asin(0.5) // returns number 0.5235987755982989\n * math.asin(math.sin(1.5)) // returns number ~1.5\n *\n * math.asin(2) // returns Complex 1.5707963267948966 -1.3169578969248166i\n *\n * See also:\n *\n * sin, atan, acos\n *\n * @param {number | BigNumber | Complex} x Function input\n * @return {number | BigNumber | Complex} The arc sine of x\n */\n return typed(name, {\n number: function number(x) {\n if (x >= -1 && x <= 1 || config.predictable) {\n return Math.asin(x);\n } else {\n return new Complex(x, 0).asin();\n }\n },\n Complex: function Complex(x) {\n return x.asin();\n },\n BigNumber: function BigNumber(x) {\n return x.asin();\n }\n });\n});","import { factory } from '../../utils/factory.js';\nimport { asinhNumber } from '../../plain/number/index.js';\nvar name = 'asinh';\nvar dependencies = ['typed'];\nexport var createAsinh = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed\n } = _ref;\n /**\n * Calculate the hyperbolic arcsine of a value,\n * defined as `asinh(x) = ln(x + sqrt(x^2 + 1))`.\n *\n * To avoid confusion with the matrix hyperbolic arcsine, this function\n * does not apply to matrices.\n *\n * Syntax:\n *\n * math.asinh(x)\n *\n * Examples:\n *\n * math.asinh(0.5) // returns 0.48121182505960347\n *\n * See also:\n *\n * acosh, atanh\n *\n * @param {number | BigNumber | Complex} x Function input\n * @return {number | BigNumber | Complex} Hyperbolic arcsine of x\n */\n return typed('asinh', {\n number: asinhNumber,\n Complex: function Complex(x) {\n return x.asinh();\n },\n BigNumber: function BigNumber(x) {\n return x.asinh();\n }\n });\n});","import { factory } from '../../utils/factory.js';\nvar name = 'atan';\nvar dependencies = ['typed'];\nexport var createAtan = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed\n } = _ref;\n /**\n * Calculate the inverse tangent of a value.\n *\n * To avoid confusion with matrix arctangent, this function does not apply\n * to matrices.\n *\n * Syntax:\n *\n * math.atan(x)\n *\n * Examples:\n *\n * math.atan(0.5) // returns number 0.4636476090008061\n * math.atan(2) // returns number 1.1071487177940904\n * math.atan(math.tan(1.5)) // returns number 1.5\n *\n * See also:\n *\n * tan, asin, acos\n *\n * @param {number | BigNumber | Complex} x Function input\n * @return {number | BigNumber | Complex} The arc tangent of x\n */\n return typed('atan', {\n number: function number(x) {\n return Math.atan(x);\n },\n Complex: function Complex(x) {\n return x.atan();\n },\n BigNumber: function BigNumber(x) {\n return x.atan();\n }\n });\n});","import { factory } from '../../utils/factory.js';\nimport { createMatAlgo02xDS0 } from '../../type/matrix/utils/matAlgo02xDS0.js';\nimport { createMatAlgo03xDSf } from '../../type/matrix/utils/matAlgo03xDSf.js';\nimport { createMatAlgo09xS0Sf } from '../../type/matrix/utils/matAlgo09xS0Sf.js';\nimport { createMatAlgo11xS0s } from '../../type/matrix/utils/matAlgo11xS0s.js';\nimport { createMatAlgo12xSfs } from '../../type/matrix/utils/matAlgo12xSfs.js';\nimport { createMatrixAlgorithmSuite } from '../../type/matrix/utils/matrixAlgorithmSuite.js';\nvar name = 'atan2';\nvar dependencies = ['typed', 'matrix', 'equalScalar', 'BigNumber', 'DenseMatrix', 'concat'];\nexport var createAtan2 = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n matrix,\n equalScalar,\n BigNumber,\n DenseMatrix,\n concat\n } = _ref;\n var matAlgo02xDS0 = createMatAlgo02xDS0({\n typed,\n equalScalar\n });\n var matAlgo03xDSf = createMatAlgo03xDSf({\n typed\n });\n var matAlgo09xS0Sf = createMatAlgo09xS0Sf({\n typed,\n equalScalar\n });\n var matAlgo11xS0s = createMatAlgo11xS0s({\n typed,\n equalScalar\n });\n var matAlgo12xSfs = createMatAlgo12xSfs({\n typed,\n DenseMatrix\n });\n var matrixAlgorithmSuite = createMatrixAlgorithmSuite({\n typed,\n matrix,\n concat\n });\n\n /**\n * Calculate the inverse tangent function with two arguments, y/x.\n * By providing two arguments, the right quadrant of the computed angle can be\n * determined.\n *\n * For matrices, the function is evaluated element wise.\n *\n * Syntax:\n *\n * math.atan2(y, x)\n *\n * Examples:\n *\n * math.atan2(2, 2) / math.pi // returns number 0.25\n *\n * const angle = math.unit(60, 'deg') // returns Unit 60 deg\n * const x = math.cos(angle)\n * const y = math.sin(angle)\n *\n * math.atan(2) // returns number 1.1071487177940904\n *\n * See also:\n *\n * tan, atan, sin, cos\n *\n * @param {number | Array | Matrix} y Second dimension\n * @param {number | Array | Matrix} x First dimension\n * @return {number | Array | Matrix} Four-quadrant inverse tangent\n */\n return typed(name, {\n 'number, number': Math.atan2,\n // Complex numbers doesn't seem to have a reasonable implementation of\n // atan2(). Even Matlab removed the support, after they only calculated\n // the atan only on base of the real part of the numbers and ignored\n // the imaginary.\n\n 'BigNumber, BigNumber': (y, x) => BigNumber.atan2(y, x)\n }, matrixAlgorithmSuite({\n scalar: 'number | BigNumber',\n SS: matAlgo09xS0Sf,\n DS: matAlgo03xDSf,\n SD: matAlgo02xDS0,\n Ss: matAlgo11xS0s,\n sS: matAlgo12xSfs\n }));\n});","import { factory } from '../../utils/factory.js';\nimport { atanhNumber } from '../../plain/number/index.js';\nvar name = 'atanh';\nvar dependencies = ['typed', 'config', 'Complex'];\nexport var createAtanh = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n config,\n Complex\n } = _ref;\n /**\n * Calculate the hyperbolic arctangent of a value,\n * defined as `atanh(x) = ln((1 + x)/(1 - x)) / 2`.\n *\n * To avoid confusion with the matrix hyperbolic arctangent, this function\n * does not apply to matrices.\n *\n * Syntax:\n *\n * math.atanh(x)\n *\n * Examples:\n *\n * math.atanh(0.5) // returns 0.5493061443340549\n *\n * See also:\n *\n * acosh, asinh\n *\n * @param {number | BigNumber | Complex} x Function input\n * @return {number | BigNumber | Complex} Hyperbolic arctangent of x\n */\n return typed(name, {\n number: function number(x) {\n if (x <= 1 && x >= -1 || config.predictable) {\n return atanhNumber(x);\n }\n return new Complex(x, 0).atanh();\n },\n Complex: function Complex(x) {\n return x.atanh();\n },\n BigNumber: function BigNumber(x) {\n return x.atanh();\n }\n });\n});","import { factory } from '../../utils/factory.js';\nexport var createTrigUnit = /* #__PURE__ */factory('trigUnit', ['typed'], _ref => {\n var {\n typed\n } = _ref;\n return {\n Unit: typed.referToSelf(self => x => {\n if (!x.hasBase(x.constructor.BASE_UNITS.ANGLE)) {\n throw new TypeError('Unit in function cot is no angle');\n }\n return typed.find(self, x.valueType())(x.value);\n })\n };\n});","import { factory } from '../../utils/factory.js';\nimport { createTrigUnit } from './trigUnit.js';\nvar name = 'cos';\nvar dependencies = ['typed'];\nexport var createCos = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed\n } = _ref;\n var trigUnit = createTrigUnit({\n typed\n });\n\n /**\n * Calculate the cosine of a value.\n *\n * To avoid confusion with the matrix cosine, this function does not\n * apply to matrices.\n *\n * Syntax:\n *\n * math.cos(x)\n *\n * Examples:\n *\n * math.cos(2) // returns number -0.4161468365471422\n * math.cos(math.pi / 4) // returns number 0.7071067811865475\n * math.cos(math.unit(180, 'deg')) // returns number -1\n * math.cos(math.unit(60, 'deg')) // returns number 0.5\n *\n * const angle = 0.2\n * math.pow(math.sin(angle), 2) + math.pow(math.cos(angle), 2) // returns number ~1\n *\n * See also:\n *\n * cos, tan\n *\n * @param {number | BigNumber | Complex | Unit} x Function input\n * @return {number | BigNumber | Complex} Cosine of x\n */\n return typed(name, {\n number: Math.cos,\n 'Complex | BigNumber': x => x.cos()\n }, trigUnit);\n});","import { factory } from '../../utils/factory.js';\nimport { cosh as coshNumber } from '../../utils/number.js';\nvar name = 'cosh';\nvar dependencies = ['typed'];\nexport var createCosh = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed\n } = _ref;\n /**\n * Calculate the hyperbolic cosine of a value,\n * defined as `cosh(x) = 1/2 * (exp(x) + exp(-x))`.\n *\n * To avoid confusion with the matrix hyperbolic cosine, this function does\n * not apply to matrices.\n *\n * Syntax:\n *\n * math.cosh(x)\n *\n * Examples:\n *\n * math.cosh(0.5) // returns number 1.1276259652063807\n *\n * See also:\n *\n * sinh, tanh\n *\n * @param {number | BigNumber | Complex} x Function input\n * @return {number | BigNumber | Complex} Hyperbolic cosine of x\n */\n return typed(name, {\n number: coshNumber,\n 'Complex | BigNumber': x => x.cosh()\n });\n});","import { factory } from '../../utils/factory.js';\nimport { cotNumber } from '../../plain/number/index.js';\nimport { createTrigUnit } from './trigUnit.js';\nvar name = 'cot';\nvar dependencies = ['typed', 'BigNumber'];\nexport var createCot = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n BigNumber: _BigNumber\n } = _ref;\n var trigUnit = createTrigUnit({\n typed\n });\n\n /**\n * Calculate the cotangent of a value. Defined as `cot(x) = 1 / tan(x)`.\n *\n * To avoid confusion with the matrix cotangent, this function does not\n * apply to matrices.\n *\n * Syntax:\n *\n * math.cot(x)\n *\n * Examples:\n *\n * math.cot(2) // returns number -0.45765755436028577\n * 1 / math.tan(2) // returns number -0.45765755436028577\n *\n * See also:\n *\n * tan, sec, csc\n *\n * @param {number | Complex | Unit | Array | Matrix} x Function input\n * @return {number | Complex | Array | Matrix} Cotangent of x\n */\n return typed(name, {\n number: cotNumber,\n Complex: x => x.cot(),\n BigNumber: x => new _BigNumber(1).div(x.tan())\n }, trigUnit);\n});","import { factory } from '../../utils/factory.js';\nimport { cothNumber } from '../../plain/number/index.js';\nvar name = 'coth';\nvar dependencies = ['typed', 'BigNumber'];\nexport var createCoth = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n BigNumber: _BigNumber\n } = _ref;\n /**\n * Calculate the hyperbolic cotangent of a value,\n * defined as `coth(x) = 1 / tanh(x)`.\n *\n * To avoid confusion with the matrix hyperbolic cotangent, this function\n * does not apply to matrices.\n *\n * Syntax:\n *\n * math.coth(x)\n *\n * Examples:\n *\n * // coth(x) = 1 / tanh(x)\n * math.coth(2) // returns 1.0373147207275482\n * 1 / math.tanh(2) // returns 1.0373147207275482\n *\n * See also:\n *\n * sinh, tanh, cosh\n *\n * @param {number | BigNumber | Complex} x Function input\n * @return {number | BigNumber | Complex} Hyperbolic cotangent of x\n */\n return typed(name, {\n number: cothNumber,\n Complex: x => x.coth(),\n BigNumber: x => new _BigNumber(1).div(x.tanh())\n });\n});","import { factory } from '../../utils/factory.js';\nimport { cscNumber } from '../../plain/number/index.js';\nimport { createTrigUnit } from './trigUnit.js';\nvar name = 'csc';\nvar dependencies = ['typed', 'BigNumber'];\nexport var createCsc = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n BigNumber: _BigNumber\n } = _ref;\n var trigUnit = createTrigUnit({\n typed\n });\n\n /**\n * Calculate the cosecant of a value, defined as `csc(x) = 1/sin(x)`.\n *\n * To avoid confusion with the matrix cosecant, this function does not\n * apply to matrices.\n *\n * Syntax:\n *\n * math.csc(x)\n *\n * Examples:\n *\n * math.csc(2) // returns number 1.099750170294617\n * 1 / math.sin(2) // returns number 1.099750170294617\n *\n * See also:\n *\n * sin, sec, cot\n *\n * @param {number | BigNumber | Complex | Unit} x Function input\n * @return {number | BigNumber | Complex} Cosecant of x\n */\n return typed(name, {\n number: cscNumber,\n Complex: x => x.csc(),\n BigNumber: x => new _BigNumber(1).div(x.sin())\n }, trigUnit);\n});","import { factory } from '../../utils/factory.js';\nimport { cschNumber } from '../../plain/number/index.js';\nvar name = 'csch';\nvar dependencies = ['typed', 'BigNumber'];\nexport var createCsch = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n BigNumber: _BigNumber\n } = _ref;\n /**\n * Calculate the hyperbolic cosecant of a value,\n * defined as `csch(x) = 1 / sinh(x)`.\n *\n * To avoid confusion with the matrix hyperbolic cosecant, this function\n * does not apply to matrices.\n *\n * Syntax:\n *\n * math.csch(x)\n *\n * Examples:\n *\n * // csch(x) = 1/ sinh(x)\n * math.csch(0.5) // returns 1.9190347513349437\n * 1 / math.sinh(0.5) // returns 1.9190347513349437\n *\n * See also:\n *\n * sinh, sech, coth\n *\n * @param {number | BigNumber | Complex} x Function input\n * @return {number | BigNumber | Complex} Hyperbolic cosecant of x\n */\n return typed(name, {\n number: cschNumber,\n Complex: x => x.csch(),\n BigNumber: x => new _BigNumber(1).div(x.sinh())\n });\n});","import { factory } from '../../utils/factory.js';\nimport { secNumber } from '../../plain/number/index.js';\nimport { createTrigUnit } from './trigUnit.js';\nvar name = 'sec';\nvar dependencies = ['typed', 'BigNumber'];\nexport var createSec = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n BigNumber: _BigNumber\n } = _ref;\n var trigUnit = createTrigUnit({\n typed\n });\n\n /**\n * Calculate the secant of a value, defined as `sec(x) = 1/cos(x)`.\n *\n * To avoid confusion with the matrix secant, this function does not\n * apply to matrices.\n *\n * Syntax:\n *\n * math.sec(x)\n *\n * Examples:\n *\n * math.sec(2) // returns number -2.4029979617223822\n * 1 / math.cos(2) // returns number -2.4029979617223822\n *\n * See also:\n *\n * cos, csc, cot\n *\n * @param {number | BigNumber | Complex | Unit} x Function input\n * @return {number | BigNumber | Complex} Secant of x\n */\n return typed(name, {\n number: secNumber,\n Complex: x => x.sec(),\n BigNumber: x => new _BigNumber(1).div(x.cos())\n }, trigUnit);\n});","import { factory } from '../../utils/factory.js';\nimport { sechNumber } from '../../plain/number/index.js';\nvar name = 'sech';\nvar dependencies = ['typed', 'BigNumber'];\nexport var createSech = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n BigNumber: _BigNumber\n } = _ref;\n /**\n * Calculate the hyperbolic secant of a value,\n * defined as `sech(x) = 1 / cosh(x)`.\n *\n * To avoid confusion with the matrix hyperbolic secant, this function does\n * not apply to matrices.\n *\n * Syntax:\n *\n * math.sech(x)\n *\n * Examples:\n *\n * // sech(x) = 1/ cosh(x)\n * math.sech(0.5) // returns 0.886818883970074\n * 1 / math.cosh(0.5) // returns 0.886818883970074\n *\n * See also:\n *\n * cosh, csch, coth\n *\n * @param {number | BigNumber | Complex} x Function input\n * @return {number | BigNumber | Complex} Hyperbolic secant of x\n */\n return typed(name, {\n number: sechNumber,\n Complex: x => x.sech(),\n BigNumber: x => new _BigNumber(1).div(x.cosh())\n });\n});","import { factory } from '../../utils/factory.js';\nimport { createTrigUnit } from './trigUnit.js';\nvar name = 'sin';\nvar dependencies = ['typed'];\nexport var createSin = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed\n } = _ref;\n var trigUnit = createTrigUnit({\n typed\n });\n\n /**\n * Calculate the sine of a value.\n *\n * To avoid confusion with the matrix sine, this function does not apply\n * to matrices.\n *\n * Syntax:\n *\n * math.sin(x)\n *\n * Examples:\n *\n * math.sin(2) // returns number 0.9092974268256813\n * math.sin(math.pi / 4) // returns number 0.7071067811865475\n * math.sin(math.unit(90, 'deg')) // returns number 1\n * math.sin(math.unit(30, 'deg')) // returns number 0.5\n *\n * const angle = 0.2\n * math.pow(math.sin(angle), 2) + math.pow(math.cos(angle), 2) // returns number ~1\n *\n * See also:\n *\n * cos, tan\n *\n * @param {number | BigNumber | Complex | Unit} x Function input\n * @return {number | BigNumber | Complex} Sine of x\n */\n return typed(name, {\n number: Math.sin,\n 'Complex | BigNumber': x => x.sin()\n }, trigUnit);\n});","import { factory } from '../../utils/factory.js';\nimport { sinhNumber } from '../../plain/number/index.js';\nvar name = 'sinh';\nvar dependencies = ['typed'];\nexport var createSinh = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed\n } = _ref;\n /**\n * Calculate the hyperbolic sine of a value,\n * defined as `sinh(x) = 1/2 * (exp(x) - exp(-x))`.\n *\n * To avoid confusion with the matrix hyperbolic sine, this function does\n * not apply to matrices.\n *\n * Syntax:\n *\n * math.sinh(x)\n *\n * Examples:\n *\n * math.sinh(0.5) // returns number 0.5210953054937474\n *\n * See also:\n *\n * cosh, tanh\n *\n * @param {number | BigNumber | Complex} x Function input\n * @return {number | BigNumber | Complex} Hyperbolic sine of x\n */\n return typed(name, {\n number: sinhNumber,\n 'Complex | BigNumber': x => x.sinh()\n });\n});","import { factory } from '../../utils/factory.js';\nimport { createTrigUnit } from './trigUnit.js';\nvar name = 'tan';\nvar dependencies = ['typed'];\nexport var createTan = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed\n } = _ref;\n var trigUnit = createTrigUnit({\n typed\n });\n\n /**\n * Calculate the tangent of a value. `tan(x)` is equal to `sin(x) / cos(x)`.\n *\n * To avoid confusion with the matrix tangent, this function does not apply\n * to matrices.\n *\n * Syntax:\n *\n * math.tan(x)\n *\n * Examples:\n *\n * math.tan(0.5) // returns number 0.5463024898437905\n * math.sin(0.5) / math.cos(0.5) // returns number 0.5463024898437905\n * math.tan(math.pi / 4) // returns number 1\n * math.tan(math.unit(45, 'deg')) // returns number 1\n *\n * See also:\n *\n * atan, sin, cos\n *\n * @param {number | BigNumber | Complex | Unit} x Function input\n * @return {number | BigNumber | Complex} Tangent of x\n */\n return typed(name, {\n number: Math.tan,\n 'Complex | BigNumber': x => x.tan()\n }, trigUnit);\n});","import { factory } from '../../utils/factory.js';\nimport { tanh as _tanh } from '../../utils/number.js';\nvar name = 'tanh';\nvar dependencies = ['typed'];\nexport var createTanh = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed\n } = _ref;\n /**\n * Calculate the hyperbolic tangent of a value,\n * defined as `tanh(x) = (exp(2 * x) - 1) / (exp(2 * x) + 1)`.\n *\n * To avoid confusion with matrix hyperbolic tangent, this function does\n * not apply to matrices.\n *\n * Syntax:\n *\n * math.tanh(x)\n *\n * Examples:\n *\n * // tanh(x) = sinh(x) / cosh(x) = 1 / coth(x)\n * math.tanh(0.5) // returns 0.46211715726000974\n * math.sinh(0.5) / math.cosh(0.5) // returns 0.46211715726000974\n * 1 / math.coth(0.5) // returns 0.46211715726000974\n *\n * See also:\n *\n * sinh, cosh, coth\n *\n * @param {number | BigNumber | Complex} x Function input\n * @return {number | BigNumber | Complex} Hyperbolic tangent of x\n */\n return typed('tanh', {\n number: _tanh,\n 'Complex | BigNumber': x => x.tanh()\n });\n});","import { flatten } from '../../utils/array.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'setCartesian';\nvar dependencies = ['typed', 'size', 'subset', 'compareNatural', 'Index', 'DenseMatrix'];\nexport var createSetCartesian = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n size,\n subset,\n compareNatural,\n Index,\n DenseMatrix\n } = _ref;\n /**\n * Create the cartesian product of two (multi)sets.\n * Multi-dimension arrays will be converted to single-dimension arrays\n * and the values will be sorted in ascending order before the operation.\n *\n * Syntax:\n *\n * math.setCartesian(set1, set2)\n *\n * Examples:\n *\n * math.setCartesian([1, 2], [3, 4]) // returns [[1, 3], [1, 4], [2, 3], [2, 4]]\n * math.setCartesian([4, 3], [2, 1]) // returns [[3, 1], [3, 2], [4, 1], [4, 2]]\n *\n * See also:\n *\n * setUnion, setIntersect, setDifference, setPowerset\n *\n * @param {Array | Matrix} a1 A (multi)set\n * @param {Array | Matrix} a2 A (multi)set\n * @return {Array | Matrix} The cartesian product of two (multi)sets\n */\n return typed(name, {\n 'Array | Matrix, Array | Matrix': function ArrayMatrixArrayMatrix(a1, a2) {\n var result = [];\n if (subset(size(a1), new Index(0)) !== 0 && subset(size(a2), new Index(0)) !== 0) {\n // if any of them is empty, return empty\n var b1 = flatten(Array.isArray(a1) ? a1 : a1.toArray()).sort(compareNatural);\n var b2 = flatten(Array.isArray(a2) ? a2 : a2.toArray()).sort(compareNatural);\n result = [];\n for (var i = 0; i < b1.length; i++) {\n for (var j = 0; j < b2.length; j++) {\n result.push([b1[i], b2[j]]);\n }\n }\n }\n // return an array, if both inputs were arrays\n if (Array.isArray(a1) && Array.isArray(a2)) {\n return result;\n }\n // return a matrix otherwise\n return new DenseMatrix(result);\n }\n });\n});","import { flatten, generalize, identify } from '../../utils/array.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'setDifference';\nvar dependencies = ['typed', 'size', 'subset', 'compareNatural', 'Index', 'DenseMatrix'];\nexport var createSetDifference = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n size,\n subset,\n compareNatural,\n Index,\n DenseMatrix\n } = _ref;\n /**\n * Create the difference of two (multi)sets: every element of set1, that is not the element of set2.\n * Multi-dimension arrays will be converted to single-dimension arrays before the operation.\n *\n * Syntax:\n *\n * math.setDifference(set1, set2)\n *\n * Examples:\n *\n * math.setDifference([1, 2, 3, 4], [3, 4, 5, 6]) // returns [1, 2]\n * math.setDifference([[1, 2], [3, 4]], [[3, 4], [5, 6]]) // returns [1, 2]\n *\n * See also:\n *\n * setUnion, setIntersect, setSymDifference\n *\n * @param {Array | Matrix} a1 A (multi)set\n * @param {Array | Matrix} a2 A (multi)set\n * @return {Array | Matrix} The difference of two (multi)sets\n */\n return typed(name, {\n 'Array | Matrix, Array | Matrix': function ArrayMatrixArrayMatrix(a1, a2) {\n var result;\n if (subset(size(a1), new Index(0)) === 0) {\n // empty-anything=empty\n result = [];\n } else if (subset(size(a2), new Index(0)) === 0) {\n // anything-empty=anything\n return flatten(a1.toArray());\n } else {\n var b1 = identify(flatten(Array.isArray(a1) ? a1 : a1.toArray()).sort(compareNatural));\n var b2 = identify(flatten(Array.isArray(a2) ? a2 : a2.toArray()).sort(compareNatural));\n result = [];\n var inb2;\n for (var i = 0; i < b1.length; i++) {\n inb2 = false;\n for (var j = 0; j < b2.length; j++) {\n if (compareNatural(b1[i].value, b2[j].value) === 0 && b1[i].identifier === b2[j].identifier) {\n // the identifier is always a decimal int\n inb2 = true;\n break;\n }\n }\n if (!inb2) {\n result.push(b1[i]);\n }\n }\n }\n // return an array, if both inputs were arrays\n if (Array.isArray(a1) && Array.isArray(a2)) {\n return generalize(result);\n }\n // return a matrix otherwise\n return new DenseMatrix(generalize(result));\n }\n });\n});","import { flatten } from '../../utils/array.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'setDistinct';\nvar dependencies = ['typed', 'size', 'subset', 'compareNatural', 'Index', 'DenseMatrix'];\nexport var createSetDistinct = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n size,\n subset,\n compareNatural,\n Index,\n DenseMatrix\n } = _ref;\n /**\n * Collect the distinct elements of a multiset.\n * A multi-dimension array will be converted to a single-dimension array before the operation.\n *\n * Syntax:\n *\n * math.setDistinct(set)\n *\n * Examples:\n *\n * math.setDistinct([1, 1, 1, 2, 2, 3]) // returns [1, 2, 3]\n *\n * See also:\n *\n * setMultiplicity\n *\n * @param {Array | Matrix} a A multiset\n * @return {Array | Matrix} A set containing the distinc elements of the multiset\n */\n return typed(name, {\n 'Array | Matrix': function ArrayMatrix(a) {\n var result;\n if (subset(size(a), new Index(0)) === 0) {\n // if empty, return empty\n result = [];\n } else {\n var b = flatten(Array.isArray(a) ? a : a.toArray()).sort(compareNatural);\n result = [];\n result.push(b[0]);\n for (var i = 1; i < b.length; i++) {\n if (compareNatural(b[i], b[i - 1]) !== 0) {\n result.push(b[i]);\n }\n }\n }\n // return an array, if the input was an array\n if (Array.isArray(a)) {\n return result;\n }\n // return a matrix otherwise\n return new DenseMatrix(result);\n }\n });\n});","import { flatten, generalize, identify } from '../../utils/array.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'setIntersect';\nvar dependencies = ['typed', 'size', 'subset', 'compareNatural', 'Index', 'DenseMatrix'];\nexport var createSetIntersect = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n size,\n subset,\n compareNatural,\n Index,\n DenseMatrix\n } = _ref;\n /**\n * Create the intersection of two (multi)sets.\n * Multi-dimension arrays will be converted to single-dimension arrays before the operation.\n *\n * Syntax:\n *\n * math.setIntersect(set1, set2)\n *\n * Examples:\n *\n * math.setIntersect([1, 2, 3, 4], [3, 4, 5, 6]) // returns [3, 4]\n * math.setIntersect([[1, 2], [3, 4]], [[3, 4], [5, 6]]) // returns [3, 4]\n *\n * See also:\n *\n * setUnion, setDifference\n *\n * @param {Array | Matrix} a1 A (multi)set\n * @param {Array | Matrix} a2 A (multi)set\n * @return {Array | Matrix} The intersection of two (multi)sets\n */\n return typed(name, {\n 'Array | Matrix, Array | Matrix': function ArrayMatrixArrayMatrix(a1, a2) {\n var result;\n if (subset(size(a1), new Index(0)) === 0 || subset(size(a2), new Index(0)) === 0) {\n // of any of them is empty, return empty\n result = [];\n } else {\n var b1 = identify(flatten(Array.isArray(a1) ? a1 : a1.toArray()).sort(compareNatural));\n var b2 = identify(flatten(Array.isArray(a2) ? a2 : a2.toArray()).sort(compareNatural));\n result = [];\n for (var i = 0; i < b1.length; i++) {\n for (var j = 0; j < b2.length; j++) {\n if (compareNatural(b1[i].value, b2[j].value) === 0 && b1[i].identifier === b2[j].identifier) {\n // the identifier is always a decimal int\n result.push(b1[i]);\n break;\n }\n }\n }\n }\n // return an array, if both inputs were arrays\n if (Array.isArray(a1) && Array.isArray(a2)) {\n return generalize(result);\n }\n // return a matrix otherwise\n return new DenseMatrix(generalize(result));\n }\n });\n});","import { flatten, identify } from '../../utils/array.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'setIsSubset';\nvar dependencies = ['typed', 'size', 'subset', 'compareNatural', 'Index'];\nexport var createSetIsSubset = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n size,\n subset,\n compareNatural,\n Index\n } = _ref;\n /**\n * Check whether a (multi)set is a subset of another (multi)set. (Every element of set1 is the element of set2.)\n * Multi-dimension arrays will be converted to single-dimension arrays before the operation.\n *\n * Syntax:\n *\n * math.setIsSubset(set1, set2)\n *\n * Examples:\n *\n * math.setIsSubset([1, 2], [3, 4, 5, 6]) // returns false\n * math.setIsSubset([3, 4], [3, 4, 5, 6]) // returns true\n *\n * See also:\n *\n * setUnion, setIntersect, setDifference\n *\n * @param {Array | Matrix} a1 A (multi)set\n * @param {Array | Matrix} a2 A (multi)set\n * @return {boolean} Returns true when a1 is a subset of a2, returns false otherwise\n */\n return typed(name, {\n 'Array | Matrix, Array | Matrix': function ArrayMatrixArrayMatrix(a1, a2) {\n if (subset(size(a1), new Index(0)) === 0) {\n // empty is a subset of anything\n return true;\n } else if (subset(size(a2), new Index(0)) === 0) {\n // anything is not a subset of empty\n return false;\n }\n var b1 = identify(flatten(Array.isArray(a1) ? a1 : a1.toArray()).sort(compareNatural));\n var b2 = identify(flatten(Array.isArray(a2) ? a2 : a2.toArray()).sort(compareNatural));\n var inb2;\n for (var i = 0; i < b1.length; i++) {\n inb2 = false;\n for (var j = 0; j < b2.length; j++) {\n if (compareNatural(b1[i].value, b2[j].value) === 0 && b1[i].identifier === b2[j].identifier) {\n // the identifier is always a decimal int\n inb2 = true;\n break;\n }\n }\n if (inb2 === false) {\n return false;\n }\n }\n return true;\n }\n });\n});","import { flatten } from '../../utils/array.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'setMultiplicity';\nvar dependencies = ['typed', 'size', 'subset', 'compareNatural', 'Index'];\nexport var createSetMultiplicity = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n size,\n subset,\n compareNatural,\n Index\n } = _ref;\n /**\n * Count the multiplicity of an element in a multiset.\n * A multi-dimension array will be converted to a single-dimension array before the operation.\n *\n * Syntax:\n *\n * math.setMultiplicity(element, set)\n *\n * Examples:\n *\n * math.setMultiplicity(1, [1, 2, 2, 4]) // returns 1\n * math.setMultiplicity(2, [1, 2, 2, 4]) // returns 2\n *\n * See also:\n *\n * setDistinct, setSize\n *\n * @param {number | BigNumber | Fraction | Complex} e An element in the multiset\n * @param {Array | Matrix} a A multiset\n * @return {number} The number of how many times the multiset contains the element\n */\n return typed(name, {\n 'number | BigNumber | Fraction | Complex, Array | Matrix': function numberBigNumberFractionComplexArrayMatrix(e, a) {\n if (subset(size(a), new Index(0)) === 0) {\n // if empty, return 0\n return 0;\n }\n var b = flatten(Array.isArray(a) ? a : a.toArray());\n var count = 0;\n for (var i = 0; i < b.length; i++) {\n if (compareNatural(b[i], e) === 0) {\n count++;\n }\n }\n return count;\n }\n });\n});","import { flatten } from '../../utils/array.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'setPowerset';\nvar dependencies = ['typed', 'size', 'subset', 'compareNatural', 'Index'];\nexport var createSetPowerset = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n size,\n subset,\n compareNatural,\n Index\n } = _ref;\n /**\n * Create the powerset of a (multi)set. (The powerset contains very possible subsets of a (multi)set.)\n * A multi-dimension array will be converted to a single-dimension array before the operation.\n *\n * Syntax:\n *\n * math.setPowerset(set)\n *\n * Examples:\n *\n * math.setPowerset([1, 2, 3]) // returns [[], [1], [2], [3], [1, 2], [1, 3], [2, 3], [1, 2, 3]]\n *\n * See also:\n *\n * setCartesian\n *\n * @param {Array | Matrix} a A (multi)set\n * @return {Array} The powerset of the (multi)set\n */\n return typed(name, {\n 'Array | Matrix': function ArrayMatrix(a) {\n if (subset(size(a), new Index(0)) === 0) {\n // if empty, return empty\n return [];\n }\n var b = flatten(Array.isArray(a) ? a : a.toArray()).sort(compareNatural);\n var result = [];\n var number = 0;\n while (number.toString(2).length <= b.length) {\n result.push(_subset(b, number.toString(2).split('').reverse()));\n number++;\n }\n // can not return a matrix, because of the different size of the subarrays\n return _sort(result);\n }\n });\n\n // create subset\n function _subset(array, bitarray) {\n var result = [];\n for (var i = 0; i < bitarray.length; i++) {\n if (bitarray[i] === '1') {\n result.push(array[i]);\n }\n }\n return result;\n }\n\n // sort subsests by length\n function _sort(array) {\n var temp = [];\n for (var i = array.length - 1; i > 0; i--) {\n for (var j = 0; j < i; j++) {\n if (array[j].length > array[j + 1].length) {\n temp = array[j];\n array[j] = array[j + 1];\n array[j + 1] = temp;\n }\n }\n }\n return array;\n }\n});","import { flatten } from '../../utils/array.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'setSize';\nvar dependencies = ['typed', 'compareNatural'];\nexport var createSetSize = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n compareNatural\n } = _ref;\n /**\n * Count the number of elements of a (multi)set. When a second parameter is 'true', count only the unique values.\n * A multi-dimension array will be converted to a single-dimension array before the operation.\n *\n * Syntax:\n *\n * math.setSize(set)\n * math.setSize(set, unique)\n *\n * Examples:\n *\n * math.setSize([1, 2, 2, 4]) // returns 4\n * math.setSize([1, 2, 2, 4], true) // returns 3\n *\n * See also:\n *\n * setUnion, setIntersect, setDifference\n *\n * @param {Array | Matrix} a A multiset\n * @param {boolean} [unique] If true, only the unique values are counted. False by default\n * @return {number} The number of elements of the (multi)set\n */\n return typed(name, {\n 'Array | Matrix': function ArrayMatrix(a) {\n return Array.isArray(a) ? flatten(a).length : flatten(a.toArray()).length;\n },\n 'Array | Matrix, boolean': function ArrayMatrixBoolean(a, unique) {\n if (unique === false || a.length === 0) {\n return Array.isArray(a) ? flatten(a).length : flatten(a.toArray()).length;\n } else {\n var b = flatten(Array.isArray(a) ? a : a.toArray()).sort(compareNatural);\n var count = 1;\n for (var i = 1; i < b.length; i++) {\n if (compareNatural(b[i], b[i - 1]) !== 0) {\n count++;\n }\n }\n return count;\n }\n }\n });\n});","import { flatten } from '../../utils/array.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'setSymDifference';\nvar dependencies = ['typed', 'size', 'concat', 'subset', 'setDifference', 'Index'];\nexport var createSetSymDifference = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n size,\n concat,\n subset,\n setDifference,\n Index\n } = _ref;\n /**\n * Create the symmetric difference of two (multi)sets.\n * Multi-dimension arrays will be converted to single-dimension arrays before the operation.\n *\n * Syntax:\n *\n * math.setSymDifference(set1, set2)\n *\n * Examples:\n *\n * math.setSymDifference([1, 2, 3, 4], [3, 4, 5, 6]) // returns [1, 2, 5, 6]\n * math.setSymDifference([[1, 2], [3, 4]], [[3, 4], [5, 6]]) // returns [1, 2, 5, 6]\n *\n * See also:\n *\n * setUnion, setIntersect, setDifference\n *\n * @param {Array | Matrix} a1 A (multi)set\n * @param {Array | Matrix} a2 A (multi)set\n * @return {Array | Matrix} The symmetric difference of two (multi)sets\n */\n return typed(name, {\n 'Array | Matrix, Array | Matrix': function ArrayMatrixArrayMatrix(a1, a2) {\n if (subset(size(a1), new Index(0)) === 0) {\n // if any of them is empty, return the other one\n return flatten(a2);\n } else if (subset(size(a2), new Index(0)) === 0) {\n return flatten(a1);\n }\n var b1 = flatten(a1);\n var b2 = flatten(a2);\n return concat(setDifference(b1, b2), setDifference(b2, b1));\n }\n });\n});","import { flatten } from '../../utils/array.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'setUnion';\nvar dependencies = ['typed', 'size', 'concat', 'subset', 'setIntersect', 'setSymDifference', 'Index'];\nexport var createSetUnion = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n size,\n concat,\n subset,\n setIntersect,\n setSymDifference,\n Index\n } = _ref;\n /**\n * Create the union of two (multi)sets.\n * Multi-dimension arrays will be converted to single-dimension arrays before the operation.\n *\n * Syntax:\n *\n * math.setUnion(set1, set2)\n *\n * Examples:\n *\n * math.setUnion([1, 2, 3, 4], [3, 4, 5, 6]) // returns [1, 2, 3, 4, 5, 6]\n * math.setUnion([[1, 2], [3, 4]], [[3, 4], [5, 6]]) // returns [1, 2, 3, 4, 5, 6]\n *\n * See also:\n *\n * setIntersect, setDifference\n *\n * @param {Array | Matrix} a1 A (multi)set\n * @param {Array | Matrix} a2 A (multi)set\n * @return {Array | Matrix} The union of two (multi)sets\n */\n return typed(name, {\n 'Array | Matrix, Array | Matrix': function ArrayMatrixArrayMatrix(a1, a2) {\n if (subset(size(a1), new Index(0)) === 0) {\n // if any of them is empty, return the other one\n return flatten(a2);\n } else if (subset(size(a2), new Index(0)) === 0) {\n return flatten(a1);\n }\n var b1 = flatten(a1);\n var b2 = flatten(a2);\n return concat(setSymDifference(b1, b2), setIntersect(b1, b2));\n }\n });\n});","import { factory } from '../../utils/factory.js';\nimport { createMatAlgo01xDSid } from '../../type/matrix/utils/matAlgo01xDSid.js';\nimport { createMatAlgo04xSidSid } from '../../type/matrix/utils/matAlgo04xSidSid.js';\nimport { createMatAlgo10xSids } from '../../type/matrix/utils/matAlgo10xSids.js';\nimport { createMatrixAlgorithmSuite } from '../../type/matrix/utils/matrixAlgorithmSuite.js';\nvar name = 'add';\nvar dependencies = ['typed', 'matrix', 'addScalar', 'equalScalar', 'DenseMatrix', 'SparseMatrix', 'concat'];\nexport var createAdd = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n matrix,\n addScalar,\n equalScalar,\n DenseMatrix,\n SparseMatrix,\n concat\n } = _ref;\n var matAlgo01xDSid = createMatAlgo01xDSid({\n typed\n });\n var matAlgo04xSidSid = createMatAlgo04xSidSid({\n typed,\n equalScalar\n });\n var matAlgo10xSids = createMatAlgo10xSids({\n typed,\n DenseMatrix\n });\n var matrixAlgorithmSuite = createMatrixAlgorithmSuite({\n typed,\n matrix,\n concat\n });\n /**\n * Add two or more values, `x + y`.\n * For matrices, the function is evaluated element wise.\n *\n * Syntax:\n *\n * math.add(x, y)\n * math.add(x, y, z, ...)\n *\n * Examples:\n *\n * math.add(2, 3) // returns number 5\n * math.add(2, 3, 4) // returns number 9\n *\n * const a = math.complex(2, 3)\n * const b = math.complex(-4, 1)\n * math.add(a, b) // returns Complex -2 + 4i\n *\n * math.add([1, 2, 3], 4) // returns Array [5, 6, 7]\n *\n * const c = math.unit('5 cm')\n * const d = math.unit('2.1 mm')\n * math.add(c, d) // returns Unit 52.1 mm\n *\n * math.add(\"2.3\", \"4\") // returns number 6.3\n *\n * See also:\n *\n * subtract, sum\n *\n * @param {number | BigNumber | Fraction | Complex | Unit | Array | Matrix} x First value to add\n * @param {number | BigNumber | Fraction | Complex | Unit | Array | Matrix} y Second value to add\n * @return {number | BigNumber | Fraction | Complex | Unit | Array | Matrix} Sum of `x` and `y`\n */\n return typed(name, {\n 'any, any': addScalar,\n 'any, any, ...any': typed.referToSelf(self => (x, y, rest) => {\n var result = self(x, y);\n for (var i = 0; i < rest.length; i++) {\n result = self(result, rest[i]);\n }\n return result;\n })\n }, matrixAlgorithmSuite({\n elop: addScalar,\n DS: matAlgo01xDSid,\n SS: matAlgo04xSidSid,\n Ss: matAlgo10xSids\n }));\n});","import { factory } from '../../utils/factory.js';\nimport { flatten } from '../../utils/array.js';\nimport { isComplex } from '../../utils/is.js';\nvar name = 'hypot';\nvar dependencies = ['typed', 'abs', 'addScalar', 'divideScalar', 'multiplyScalar', 'sqrt', 'smaller', 'isPositive'];\nexport var createHypot = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n abs,\n addScalar,\n divideScalar,\n multiplyScalar,\n sqrt,\n smaller,\n isPositive\n } = _ref;\n /**\n * Calculate the hypotenusa of a list with values. The hypotenusa is defined as:\n *\n * hypot(a, b, c, ...) = sqrt(a^2 + b^2 + c^2 + ...)\n *\n * For matrix input, the hypotenusa is calculated for all values in the matrix.\n *\n * Syntax:\n *\n * math.hypot(a, b, ...)\n * math.hypot([a, b, c, ...])\n *\n * Examples:\n *\n * math.hypot(3, 4) // 5\n * math.hypot(3, 4, 5) // 7.0710678118654755\n * math.hypot([3, 4, 5]) // 7.0710678118654755\n * math.hypot(-2) // 2\n *\n * See also:\n *\n * abs, norm\n *\n * @param {... number | BigNumber | Array | Matrix} args A list with numeric values or an Array or Matrix.\n * Matrix and Array input is flattened and returns a\n * single number for the whole matrix.\n * @return {number | BigNumber} Returns the hypothenusa of the input values.\n */\n return typed(name, {\n '... number | BigNumber': _hypot,\n Array: _hypot,\n Matrix: M => _hypot(flatten(M.toArray()))\n });\n\n /**\n * Calculate the hypotenusa for an Array with values\n * @param {Array.} args\n * @return {number | BigNumber} Returns the result\n * @private\n */\n function _hypot(args) {\n // code based on `hypot` from es6-shim:\n // https://github.com/paulmillr/es6-shim/blob/master/es6-shim.js#L1619-L1633\n var result = 0;\n var largest = 0;\n for (var i = 0; i < args.length; i++) {\n if (isComplex(args[i])) {\n throw new TypeError('Unexpected type of argument to hypot');\n }\n var value = abs(args[i]);\n if (smaller(largest, value)) {\n result = multiplyScalar(result, multiplyScalar(divideScalar(largest, value), divideScalar(largest, value)));\n result = addScalar(result, 1);\n largest = value;\n } else {\n result = addScalar(result, isPositive(value) ? multiplyScalar(divideScalar(value, largest), divideScalar(value, largest)) : value);\n }\n }\n return multiplyScalar(largest, sqrt(result));\n }\n});","import { factory } from '../../utils/factory.js';\nvar name = 'norm';\nvar dependencies = ['typed', 'abs', 'add', 'pow', 'conj', 'sqrt', 'multiply', 'equalScalar', 'larger', 'smaller', 'matrix', 'ctranspose', 'eigs'];\nexport var createNorm = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n abs,\n add,\n pow,\n conj,\n sqrt,\n multiply,\n equalScalar,\n larger,\n smaller,\n matrix,\n ctranspose,\n eigs\n } = _ref;\n /**\n * Calculate the norm of a number, vector or matrix.\n *\n * The second parameter p is optional. If not provided, it defaults to 2.\n *\n * Syntax:\n *\n * math.norm(x)\n * math.norm(x, p)\n *\n * Examples:\n *\n * math.abs(-3.5) // returns 3.5\n * math.norm(-3.5) // returns 3.5\n *\n * math.norm(math.complex(3, -4)) // returns 5\n *\n * math.norm([1, 2, -3], Infinity) // returns 3\n * math.norm([1, 2, -3], -Infinity) // returns 1\n *\n * math.norm([3, 4], 2) // returns 5\n *\n * math.norm([[1, 2], [3, 4]], 1) // returns 6\n * math.norm([[1, 2], [3, 4]], 'inf') // returns 7\n * math.norm([[1, 2], [3, 4]], 'fro') // returns 5.477225575051661\n *\n * See also:\n *\n * abs, hypot\n *\n * @param {number | BigNumber | Complex | Array | Matrix} x\n * Value for which to calculate the norm\n * @param {number | BigNumber | string} [p=2]\n * Vector space.\n * Supported numbers include Infinity and -Infinity.\n * Supported strings are: 'inf', '-inf', and 'fro' (The Frobenius norm)\n * @return {number | BigNumber} the p-norm\n */\n return typed(name, {\n number: Math.abs,\n Complex: function Complex(x) {\n return x.abs();\n },\n BigNumber: function BigNumber(x) {\n // norm(x) = abs(x)\n return x.abs();\n },\n boolean: function boolean(x) {\n // norm(x) = abs(x)\n return Math.abs(x);\n },\n Array: function Array(x) {\n return _norm(matrix(x), 2);\n },\n Matrix: function Matrix(x) {\n return _norm(x, 2);\n },\n 'Array, number | BigNumber | string': function ArrayNumberBigNumberString(x, p) {\n return _norm(matrix(x), p);\n },\n 'Matrix, number | BigNumber | string': function MatrixNumberBigNumberString(x, p) {\n return _norm(x, p);\n }\n });\n\n /**\n * Calculate the plus infinity norm for a vector\n * @param {Matrix} x\n * @returns {number} Returns the norm\n * @private\n */\n function _vectorNormPlusInfinity(x) {\n // norm(x, Infinity) = max(abs(x))\n var pinf = 0;\n // skip zeros since abs(0) === 0\n x.forEach(function (value) {\n var v = abs(value);\n if (larger(v, pinf)) {\n pinf = v;\n }\n }, true);\n return pinf;\n }\n\n /**\n * Calculate the minus infinity norm for a vector\n * @param {Matrix} x\n * @returns {number} Returns the norm\n * @private\n */\n function _vectorNormMinusInfinity(x) {\n // norm(x, -Infinity) = min(abs(x))\n var ninf;\n // skip zeros since abs(0) === 0\n x.forEach(function (value) {\n var v = abs(value);\n if (!ninf || smaller(v, ninf)) {\n ninf = v;\n }\n }, true);\n return ninf || 0;\n }\n\n /**\n * Calculate the norm for a vector\n * @param {Matrix} x\n * @param {number | string} p\n * @returns {number} Returns the norm\n * @private\n */\n function _vectorNorm(x, p) {\n // check p\n if (p === Number.POSITIVE_INFINITY || p === 'inf') {\n return _vectorNormPlusInfinity(x);\n }\n if (p === Number.NEGATIVE_INFINITY || p === '-inf') {\n return _vectorNormMinusInfinity(x);\n }\n if (p === 'fro') {\n return _norm(x, 2);\n }\n if (typeof p === 'number' && !isNaN(p)) {\n // check p != 0\n if (!equalScalar(p, 0)) {\n // norm(x, p) = sum(abs(xi) ^ p) ^ 1/p\n var n = 0;\n // skip zeros since abs(0) === 0\n x.forEach(function (value) {\n n = add(pow(abs(value), p), n);\n }, true);\n return pow(n, 1 / p);\n }\n return Number.POSITIVE_INFINITY;\n }\n // invalid parameter value\n throw new Error('Unsupported parameter value');\n }\n\n /**\n * Calculate the Frobenius norm for a matrix\n * @param {Matrix} x\n * @returns {number} Returns the norm\n * @private\n */\n function _matrixNormFrobenius(x) {\n // norm(x) = sqrt(sum(diag(x'x)))\n var fro = 0;\n x.forEach(function (value, index) {\n fro = add(fro, multiply(value, conj(value)));\n });\n return abs(sqrt(fro));\n }\n\n /**\n * Calculate the norm L1 for a matrix\n * @param {Matrix} x\n * @returns {number} Returns the norm\n * @private\n */\n function _matrixNormOne(x) {\n // norm(x) = the largest column sum\n var c = [];\n // result\n var maxc = 0;\n // skip zeros since abs(0) == 0\n x.forEach(function (value, index) {\n var j = index[1];\n var cj = add(c[j] || 0, abs(value));\n if (larger(cj, maxc)) {\n maxc = cj;\n }\n c[j] = cj;\n }, true);\n return maxc;\n }\n\n /**\n * Calculate the norm L2 for a matrix\n * @param {Matrix} x\n * @returns {number} Returns the norm\n * @private\n */\n function _matrixNormTwo(x) {\n // norm(x) = sqrt( max eigenvalue of A*.A)\n var sizeX = x.size();\n if (sizeX[0] !== sizeX[1]) {\n throw new RangeError('Invalid matrix dimensions');\n }\n var tx = ctranspose(x);\n var squaredX = multiply(tx, x);\n var eigenVals = eigs(squaredX).values.toArray();\n var rho = eigenVals[eigenVals.length - 1];\n return abs(sqrt(rho));\n }\n\n /**\n * Calculate the infinity norm for a matrix\n * @param {Matrix} x\n * @returns {number} Returns the norm\n * @private\n */\n function _matrixNormInfinity(x) {\n // norm(x) = the largest row sum\n var r = [];\n // result\n var maxr = 0;\n // skip zeros since abs(0) == 0\n x.forEach(function (value, index) {\n var i = index[0];\n var ri = add(r[i] || 0, abs(value));\n if (larger(ri, maxr)) {\n maxr = ri;\n }\n r[i] = ri;\n }, true);\n return maxr;\n }\n\n /**\n * Calculate the norm for a 2D Matrix (M*N)\n * @param {Matrix} x\n * @param {number | string} p\n * @returns {number} Returns the norm\n * @private\n */\n function _matrixNorm(x, p) {\n // check p\n if (p === 1) {\n return _matrixNormOne(x);\n }\n if (p === Number.POSITIVE_INFINITY || p === 'inf') {\n return _matrixNormInfinity(x);\n }\n if (p === 'fro') {\n return _matrixNormFrobenius(x);\n }\n if (p === 2) {\n return _matrixNormTwo(x);\n } // invalid parameter value\n\n throw new Error('Unsupported parameter value ' + p);\n }\n\n /**\n * Calculate the norm for an array\n * @param {Matrix} x\n * @param {number | string} p\n * @returns {number} Returns the norm\n * @private\n */\n function _norm(x, p) {\n // size\n var sizeX = x.size();\n\n // check if it is a vector\n if (sizeX.length === 1) {\n return _vectorNorm(x, p);\n }\n // MxN matrix\n if (sizeX.length === 2) {\n if (sizeX[0] && sizeX[1]) {\n return _matrixNorm(x, p);\n } else {\n throw new RangeError('Invalid matrix dimensions');\n }\n }\n }\n});","import { factory } from '../../utils/factory.js';\nimport { isMatrix } from '../../utils/is.js';\nvar name = 'dot';\nvar dependencies = ['typed', 'addScalar', 'multiplyScalar', 'conj', 'size'];\nexport var createDot = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n addScalar,\n multiplyScalar,\n conj,\n size\n } = _ref;\n /**\n * Calculate the dot product of two vectors. The dot product of\n * `A = [a1, a2, ..., an]` and `B = [b1, b2, ..., bn]` is defined as:\n *\n * dot(A, B) = conj(a1) * b1 + conj(a2) * b2 + ... + conj(an) * bn\n *\n * Syntax:\n *\n * math.dot(x, y)\n *\n * Examples:\n *\n * math.dot([2, 4, 1], [2, 2, 3]) // returns number 15\n * math.multiply([2, 4, 1], [2, 2, 3]) // returns number 15\n *\n * See also:\n *\n * multiply, cross\n *\n * @param {Array | Matrix} x First vector\n * @param {Array | Matrix} y Second vector\n * @return {number} Returns the dot product of `x` and `y`\n */\n return typed(name, {\n 'Array | DenseMatrix, Array | DenseMatrix': _denseDot,\n 'SparseMatrix, SparseMatrix': _sparseDot\n });\n function _validateDim(x, y) {\n var xSize = _size(x);\n var ySize = _size(y);\n var xLen, yLen;\n if (xSize.length === 1) {\n xLen = xSize[0];\n } else if (xSize.length === 2 && xSize[1] === 1) {\n xLen = xSize[0];\n } else {\n throw new RangeError('Expected a column vector, instead got a matrix of size (' + xSize.join(', ') + ')');\n }\n if (ySize.length === 1) {\n yLen = ySize[0];\n } else if (ySize.length === 2 && ySize[1] === 1) {\n yLen = ySize[0];\n } else {\n throw new RangeError('Expected a column vector, instead got a matrix of size (' + ySize.join(', ') + ')');\n }\n if (xLen !== yLen) throw new RangeError('Vectors must have equal length (' + xLen + ' != ' + yLen + ')');\n if (xLen === 0) throw new RangeError('Cannot calculate the dot product of empty vectors');\n return xLen;\n }\n function _denseDot(a, b) {\n var N = _validateDim(a, b);\n var adata = isMatrix(a) ? a._data : a;\n var adt = isMatrix(a) ? a._datatype : undefined;\n var bdata = isMatrix(b) ? b._data : b;\n var bdt = isMatrix(b) ? b._datatype : undefined;\n\n // are these 2-dimensional column vectors? (as opposed to 1-dimensional vectors)\n var aIsColumn = _size(a).length === 2;\n var bIsColumn = _size(b).length === 2;\n var add = addScalar;\n var mul = multiplyScalar;\n\n // process data types\n if (adt && bdt && adt === bdt && typeof adt === 'string') {\n var dt = adt;\n // find signatures that matches (dt, dt)\n add = typed.find(addScalar, [dt, dt]);\n mul = typed.find(multiplyScalar, [dt, dt]);\n }\n\n // both vectors 1-dimensional\n if (!aIsColumn && !bIsColumn) {\n var c = mul(conj(adata[0]), bdata[0]);\n for (var i = 1; i < N; i++) {\n c = add(c, mul(conj(adata[i]), bdata[i]));\n }\n return c;\n }\n\n // a is 1-dim, b is column\n if (!aIsColumn && bIsColumn) {\n var _c = mul(conj(adata[0]), bdata[0][0]);\n for (var _i = 1; _i < N; _i++) {\n _c = add(_c, mul(conj(adata[_i]), bdata[_i][0]));\n }\n return _c;\n }\n\n // a is column, b is 1-dim\n if (aIsColumn && !bIsColumn) {\n var _c2 = mul(conj(adata[0][0]), bdata[0]);\n for (var _i2 = 1; _i2 < N; _i2++) {\n _c2 = add(_c2, mul(conj(adata[_i2][0]), bdata[_i2]));\n }\n return _c2;\n }\n\n // both vectors are column\n if (aIsColumn && bIsColumn) {\n var _c3 = mul(conj(adata[0][0]), bdata[0][0]);\n for (var _i3 = 1; _i3 < N; _i3++) {\n _c3 = add(_c3, mul(conj(adata[_i3][0]), bdata[_i3][0]));\n }\n return _c3;\n }\n }\n function _sparseDot(x, y) {\n _validateDim(x, y);\n var xindex = x._index;\n var xvalues = x._values;\n var yindex = y._index;\n var yvalues = y._values;\n\n // TODO optimize add & mul using datatype\n var c = 0;\n var add = addScalar;\n var mul = multiplyScalar;\n var i = 0;\n var j = 0;\n while (i < xindex.length && j < yindex.length) {\n var I = xindex[i];\n var J = yindex[j];\n if (I < J) {\n i++;\n continue;\n }\n if (I > J) {\n j++;\n continue;\n }\n if (I === J) {\n c = add(c, mul(xvalues[i], yvalues[j]));\n i++;\n j++;\n }\n }\n return c;\n }\n\n // TODO remove this once #1771 is fixed\n function _size(x) {\n return isMatrix(x) ? x.size() : size(x);\n }\n});","import { clone } from '../../utils/object.js';\nimport { format } from '../../utils/string.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'trace';\nvar dependencies = ['typed', 'matrix', 'add'];\nexport var createTrace = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n matrix,\n add\n } = _ref;\n /**\n * Calculate the trace of a matrix: the sum of the elements on the main\n * diagonal of a square matrix.\n *\n * Syntax:\n *\n * math.trace(x)\n *\n * Examples:\n *\n * math.trace([[1, 2], [3, 4]]) // returns 5\n *\n * const A = [\n * [1, 2, 3],\n * [-1, 2, 3],\n * [2, 0, 3]\n * ]\n * math.trace(A) // returns 6\n *\n * See also:\n *\n * diag\n *\n * @param {Array | Matrix} x A matrix\n *\n * @return {number} The trace of `x`\n */\n return typed('trace', {\n Array: function _arrayTrace(x) {\n // use dense matrix implementation\n return _denseTrace(matrix(x));\n },\n SparseMatrix: _sparseTrace,\n DenseMatrix: _denseTrace,\n any: clone\n });\n function _denseTrace(m) {\n // matrix size & data\n var size = m._size;\n var data = m._data;\n\n // process dimensions\n switch (size.length) {\n case 1:\n // vector\n if (size[0] === 1) {\n // return data[0]\n return clone(data[0]);\n }\n throw new RangeError('Matrix must be square (size: ' + format(size) + ')');\n case 2:\n {\n // two dimensional\n var rows = size[0];\n var cols = size[1];\n if (rows === cols) {\n // calulate sum\n var sum = 0;\n // loop diagonal\n for (var i = 0; i < rows; i++) {\n sum = add(sum, data[i][i]);\n }\n // return trace\n return sum;\n } else {\n throw new RangeError('Matrix must be square (size: ' + format(size) + ')');\n }\n }\n default:\n // multi dimensional\n throw new RangeError('Matrix must be two dimensional (size: ' + format(size) + ')');\n }\n }\n function _sparseTrace(m) {\n // matrix arrays\n var values = m._values;\n var index = m._index;\n var ptr = m._ptr;\n var size = m._size;\n // check dimensions\n var rows = size[0];\n var columns = size[1];\n // matrix must be square\n if (rows === columns) {\n // calulate sum\n var sum = 0;\n // check we have data (avoid looping columns)\n if (values.length > 0) {\n // loop columns\n for (var j = 0; j < columns; j++) {\n // k0 <= k < k1 where k0 = _ptr[j] && k1 = _ptr[j+1]\n var k0 = ptr[j];\n var k1 = ptr[j + 1];\n // loop k within [k0, k1[\n for (var k = k0; k < k1; k++) {\n // row index\n var i = index[k];\n // check row\n if (i === j) {\n // accumulate value\n sum = add(sum, values[k]);\n // exit loop\n break;\n }\n if (i > j) {\n // exit loop, no value on the diagonal for column j\n break;\n }\n }\n }\n }\n // return trace\n return sum;\n }\n throw new RangeError('Matrix must be square (size: ' + format(size) + ')');\n }\n});","import { factory } from '../../../utils/factory.js';\nimport { isBigNumber, isMatrix } from '../../../utils/is.js';\nvar name = 'index';\nvar dependencies = ['typed', 'Index'];\nexport var createIndex = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n Index\n } = _ref;\n /**\n * Create an index. An Index can store ranges having start, step, and end\n * for multiple dimensions.\n * Matrix.get, Matrix.set, and math.subset accept an Index as input.\n *\n * Syntax:\n *\n * math.index(range1, range2, ...)\n *\n * Where each range can be any of:\n *\n * - A number\n * - A string for getting/setting an object property\n * - An instance of `Range`\n * - A one-dimensional Array or a Matrix with numbers\n *\n * Indexes must be zero-based, integer numbers.\n *\n * Examples:\n *\n * const b = [1, 2, 3, 4, 5]\n * math.subset(b, math.index([1, 2, 3])) // returns [2, 3, 4]\n *\n * const a = math.matrix([[1, 2], [3, 4]])\n * a.subset(math.index(0, 1)) // returns 2\n *\n * See also:\n *\n * bignumber, boolean, complex, matrix, number, string, unit\n *\n * @param {...*} ranges Zero or more ranges or numbers.\n * @return {Index} Returns the created index\n */\n return typed(name, {\n '...number | string | BigNumber | Range | Array | Matrix': function numberStringBigNumberRangeArrayMatrix(args) {\n var ranges = args.map(function (arg) {\n if (isBigNumber(arg)) {\n return arg.toNumber(); // convert BigNumber to Number\n } else if (Array.isArray(arg) || isMatrix(arg)) {\n return arg.map(function (elem) {\n // convert BigNumber to Number\n return isBigNumber(elem) ? elem.toNumber() : elem;\n });\n } else {\n return arg;\n }\n });\n var res = new Index();\n Index.apply(res, ranges);\n return res;\n }\n });\n});","// Reserved keywords not allowed to use in the parser\nexport var keywords = new Set(['end']);","import { isNode } from '../../utils/is.js';\nimport { keywords } from '../keywords.js';\nimport { deepStrictEqual } from '../../utils/object.js';\nimport { factory } from '../../utils/factory.js';\nimport { createMap } from '../../utils/map.js';\nvar name = 'Node';\nvar dependencies = ['mathWithTransform'];\nexport var createNode = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n mathWithTransform\n } = _ref;\n /**\n * Validate the symbol names of a scope.\n * Throws an error when the scope contains an illegal symbol.\n * @param {Object} scope\n */\n function _validateScope(scope) {\n for (var symbol of [...keywords]) {\n if (scope.has(symbol)) {\n throw new Error('Scope contains an illegal symbol, \"' + symbol + '\" is a reserved keyword');\n }\n }\n }\n class Node {\n get type() {\n return 'Node';\n }\n get isNode() {\n return true;\n }\n\n /**\n * Evaluate the node\n * @param {Object} [scope] Scope to read/write variables\n * @return {*} Returns the result\n */\n evaluate(scope) {\n return this.compile().evaluate(scope);\n }\n\n /**\n * Compile the node into an optimized, evauatable JavaScript function\n * @return {{evaluate: function([Object])}} object\n * Returns an object with a function 'evaluate',\n * which can be invoked as expr.evaluate([scope: Object]),\n * where scope is an optional object with\n * variables.\n */\n compile() {\n var expr = this._compile(mathWithTransform, {});\n var args = {};\n var context = null;\n function evaluate(scope) {\n var s = createMap(scope);\n _validateScope(s);\n return expr(s, args, context);\n }\n return {\n evaluate\n };\n }\n\n /**\n * Compile a node into a JavaScript function.\n * This basically pre-calculates as much as possible and only leaves open\n * calculations which depend on a dynamic scope with variables.\n * @param {Object} math Math.js namespace with functions and constants.\n * @param {Object} argNames An object with argument names as key and `true`\n * as value. Used in the SymbolNode to optimize\n * for arguments from user assigned functions\n * (see FunctionAssignmentNode) or special symbols\n * like `end` (see IndexNode).\n * @return {function} Returns a function which can be called like:\n * evalNode(scope: Object, args: Object, context: *)\n */\n _compile(math, argNames) {\n throw new Error('Method _compile must be implemented by type ' + this.type);\n }\n\n /**\n * Execute a callback for each of the child nodes of this node\n * @param {function(child: Node, path: string, parent: Node)} callback\n */\n forEach(callback) {\n // must be implemented by each of the Node implementations\n throw new Error('Cannot run forEach on a Node interface');\n }\n\n /**\n * Create a new Node whose children are the results of calling the\n * provided callback function for each child of the original node.\n * @param {function(child: Node, path: string, parent: Node): Node} callback\n * @returns {OperatorNode} Returns a transformed copy of the node\n */\n map(callback) {\n // must be implemented by each of the Node implementations\n throw new Error('Cannot run map on a Node interface');\n }\n\n /**\n * Validate whether an object is a Node, for use with map\n * @param {Node} node\n * @returns {Node} Returns the input if it's a node, else throws an Error\n * @protected\n */\n _ifNode(node) {\n if (!isNode(node)) {\n throw new TypeError('Callback function must return a Node');\n }\n return node;\n }\n\n /**\n * Recursively traverse all nodes in a node tree. Executes given callback for\n * this node and each of its child nodes.\n * @param {function(node: Node, path: string, parent: Node)} callback\n * A callback called for every node in the node tree.\n */\n traverse(callback) {\n // execute callback for itself\n // eslint-disable-next-line\n callback(this, null, null);\n\n // recursively traverse over all children of a node\n function _traverse(node, callback) {\n node.forEach(function (child, path, parent) {\n callback(child, path, parent);\n _traverse(child, callback);\n });\n }\n _traverse(this, callback);\n }\n\n /**\n * Recursively transform a node tree via a transform function.\n *\n * For example, to replace all nodes of type SymbolNode having name 'x' with\n * a ConstantNode with value 2:\n *\n * const res = Node.transform(function (node, path, parent) {\n * if (node && node.isSymbolNode) && (node.name === 'x')) {\n * return new ConstantNode(2)\n * }\n * else {\n * return node\n * }\n * })\n *\n * @param {function(node: Node, path: string, parent: Node) : Node} callback\n * A mapping function accepting a node, and returning\n * a replacement for the node or the original node. The \"signature\"\n * of the callback must be:\n * callback(node: Node, index: string, parent: Node) : Node\n * @return {Node} Returns the original node or its replacement\n */\n transform(callback) {\n function _transform(child, path, parent) {\n var replacement = callback(child, path, parent);\n if (replacement !== child) {\n // stop iterating when the node is replaced\n return replacement;\n }\n return child.map(_transform);\n }\n return _transform(this, null, null);\n }\n\n /**\n * Find any node in the node tree matching given filter function. For\n * example, to find all nodes of type SymbolNode having name 'x':\n *\n * const results = Node.filter(function (node) {\n * return (node && node.isSymbolNode) && (node.name === 'x')\n * })\n *\n * @param {function(node: Node, path: string, parent: Node) : Node} callback\n * A test function returning true when a node matches, and false\n * otherwise. Function signature:\n * callback(node: Node, index: string, parent: Node) : boolean\n * @return {Node[]} nodes\n * An array with nodes matching given filter criteria\n */\n filter(callback) {\n var nodes = [];\n this.traverse(function (node, path, parent) {\n if (callback(node, path, parent)) {\n nodes.push(node);\n }\n });\n return nodes;\n }\n\n /**\n * Create a shallow clone of this node\n * @return {Node}\n */\n clone() {\n // must be implemented by each of the Node implementations\n throw new Error('Cannot clone a Node interface');\n }\n\n /**\n * Create a deep clone of this node\n * @return {Node}\n */\n cloneDeep() {\n return this.map(function (node) {\n return node.cloneDeep();\n });\n }\n\n /**\n * Deep compare this node with another node.\n * @param {Node} other\n * @return {boolean} Returns true when both nodes are of the same type and\n * contain the same values (as do their childs)\n */\n equals(other) {\n return other ? this.type === other.type && deepStrictEqual(this, other) : false;\n }\n\n /**\n * Get string representation. (wrapper function)\n *\n * This function can get an object of the following form:\n * {\n * handler: //This can be a callback function of the form\n * // \"function callback(node, options)\"or\n * // a map that maps function names (used in FunctionNodes)\n * // to callbacks\n * parenthesis: \"keep\" //the parenthesis option (This is optional)\n * }\n *\n * @param {Object} [options]\n * @return {string}\n */\n toString(options) {\n var customString = this._getCustomString(options);\n if (typeof customString !== 'undefined') {\n return customString;\n }\n return this._toString(options);\n }\n\n /**\n * Get a JSON representation of the node\n * Both .toJSON() and the static .fromJSON(json) should be implemented by all\n * implementations of Node\n * @returns {Object}\n */\n toJSON() {\n throw new Error('Cannot serialize object: toJSON not implemented by ' + this.type);\n }\n\n /**\n * Get HTML representation. (wrapper function)\n *\n * This function can get an object of the following form:\n * {\n * handler: //This can be a callback function of the form\n * // \"function callback(node, options)\" or\n * // a map that maps function names (used in FunctionNodes)\n * // to callbacks\n * parenthesis: \"keep\" //the parenthesis option (This is optional)\n * }\n *\n * @param {Object} [options]\n * @return {string}\n */\n toHTML(options) {\n var customString = this._getCustomString(options);\n if (typeof customString !== 'undefined') {\n return customString;\n }\n return this.toHTML(options);\n }\n\n /**\n * Internal function to generate the string output.\n * This has to be implemented by every Node\n *\n * @throws {Error}\n */\n _toString() {\n // must be implemented by each of the Node implementations\n throw new Error('_toString not implemented for ' + this.type);\n }\n\n /**\n * Get LaTeX representation. (wrapper function)\n *\n * This function can get an object of the following form:\n * {\n * handler: //This can be a callback function of the form\n * // \"function callback(node, options)\"or\n * // a map that maps function names (used in FunctionNodes)\n * // to callbacks\n * parenthesis: \"keep\" //the parenthesis option (This is optional)\n * }\n *\n * @param {Object} [options]\n * @return {string}\n */\n toTex(options) {\n var customString = this._getCustomString(options);\n if (typeof customString !== 'undefined') {\n return customString;\n }\n return this._toTex(options);\n }\n\n /**\n * Internal function to generate the LaTeX output.\n * This has to be implemented by every Node\n *\n * @param {Object} [options]\n * @throws {Error}\n */\n _toTex(options) {\n // must be implemented by each of the Node implementations\n throw new Error('_toTex not implemented for ' + this.type);\n }\n\n /**\n * Helper used by `to...` functions.\n */\n _getCustomString(options) {\n if (options && typeof options === 'object') {\n switch (typeof options.handler) {\n case 'object':\n case 'undefined':\n return;\n case 'function':\n return options.handler(this, options);\n default:\n throw new TypeError('Object or function expected as callback');\n }\n }\n }\n\n /**\n * Get identifier.\n * @return {string}\n */\n getIdentifier() {\n return this.type;\n }\n\n /**\n * Get the content of the current Node.\n * @return {Node} node\n **/\n getContent() {\n return this;\n }\n }\n return Node;\n}, {\n isClass: true,\n isNode: true\n});","import { IndexError } from '../../../error/IndexError.js';\n\n/**\n * Transform zero-based indices to one-based indices in errors\n * @param {Error} err\n * @returns {Error | IndexError} Returns the transformed error\n */\nexport function errorTransform(err) {\n if (err && err.isIndexError) {\n return new IndexError(err.index + 1, err.min + 1, err.max !== undefined ? err.max + 1 : undefined);\n }\n return err;\n}","import { errorTransform } from '../../transform/utils/errorTransform.js';\nimport { getSafeProperty } from '../../../utils/customs.js';\nexport function accessFactory(_ref) {\n var {\n subset\n } = _ref;\n /**\n * Retrieve part of an object:\n *\n * - Retrieve a property from an object\n * - Retrieve a part of a string\n * - Retrieve a matrix subset\n *\n * @param {Object | Array | Matrix | string} object\n * @param {Index} index\n * @return {Object | Array | Matrix | string} Returns the subset\n */\n return function access(object, index) {\n try {\n if (Array.isArray(object)) {\n return subset(object, index);\n } else if (object && typeof object.subset === 'function') {\n // Matrix\n return object.subset(index);\n } else if (typeof object === 'string') {\n // TODO: move getStringSubset into a separate util file, use that\n return subset(object, index);\n } else if (typeof object === 'object') {\n if (!index.isObjectProperty()) {\n throw new TypeError('Cannot apply a numeric index as object property');\n }\n return getSafeProperty(object, index.getObjectProperty());\n } else {\n throw new TypeError('Cannot apply index: unsupported type of object');\n }\n } catch (err) {\n throw errorTransform(err);\n }\n };\n}","import _defineProperty from \"@babel/runtime/helpers/defineProperty\";\nimport { isAccessorNode, isArrayNode, isConstantNode, isFunctionNode, isIndexNode, isNode, isObjectNode, isParenthesisNode, isSymbolNode } from '../../utils/is.js';\nimport { getSafeProperty } from '../../utils/customs.js';\nimport { factory } from '../../utils/factory.js';\nimport { accessFactory } from './utils/access.js';\nvar name = 'AccessorNode';\nvar dependencies = ['subset', 'Node'];\nexport var createAccessorNode = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n subset,\n Node\n } = _ref;\n var access = accessFactory({\n subset\n });\n\n /**\n * Are parenthesis needed?\n * @private\n */\n function needParenthesis(node) {\n // TODO: maybe make a method on the nodes which tells whether they need parenthesis?\n return !(isAccessorNode(node) || isArrayNode(node) || isConstantNode(node) || isFunctionNode(node) || isObjectNode(node) || isParenthesisNode(node) || isSymbolNode(node));\n }\n class AccessorNode extends Node {\n /**\n * @constructor AccessorNode\n * @extends {Node}\n * Access an object property or get a matrix subset\n *\n * @param {Node} object The object from which to retrieve\n * a property or subset.\n * @param {IndexNode} index IndexNode containing ranges\n */\n constructor(object, index) {\n super();\n if (!isNode(object)) {\n throw new TypeError('Node expected for parameter \"object\"');\n }\n if (!isIndexNode(index)) {\n throw new TypeError('IndexNode expected for parameter \"index\"');\n }\n this.object = object;\n this.index = index;\n }\n\n // readonly property name\n get name() {\n if (this.index) {\n return this.index.isObjectProperty() ? this.index.getObjectProperty() : '';\n } else {\n return this.object.name || '';\n }\n }\n get type() {\n return name;\n }\n get isAccessorNode() {\n return true;\n }\n\n /**\n * Compile a node into a JavaScript function.\n * This basically pre-calculates as much as possible and only leaves open\n * calculations which depend on a dynamic scope with variables.\n * @param {Object} math Math.js namespace with functions and constants.\n * @param {Object} argNames An object with argument names as key and `true`\n * as value. Used in the SymbolNode to optimize\n * for arguments from user assigned functions\n * (see FunctionAssignmentNode) or special symbols\n * like `end` (see IndexNode).\n * @return {function} Returns a function which can be called like:\n * evalNode(scope: Object, args: Object, context: *)\n */\n _compile(math, argNames) {\n var evalObject = this.object._compile(math, argNames);\n var evalIndex = this.index._compile(math, argNames);\n if (this.index.isObjectProperty()) {\n var prop = this.index.getObjectProperty();\n return function evalAccessorNode(scope, args, context) {\n // get a property from an object evaluated using the scope.\n return getSafeProperty(evalObject(scope, args, context), prop);\n };\n } else {\n return function evalAccessorNode(scope, args, context) {\n var object = evalObject(scope, args, context);\n // we pass just object here instead of context:\n var index = evalIndex(scope, args, object);\n return access(object, index);\n };\n }\n }\n\n /**\n * Execute a callback for each of the child nodes of this node\n * @param {function(child: Node, path: string, parent: Node)} callback\n */\n forEach(callback) {\n callback(this.object, 'object', this);\n callback(this.index, 'index', this);\n }\n\n /**\n * Create a new AccessorNode whose children are the results of calling\n * the provided callback function for each child of the original node.\n * @param {function(child: Node, path: string, parent: Node): Node} callback\n * @returns {AccessorNode} Returns a transformed copy of the node\n */\n map(callback) {\n return new AccessorNode(this._ifNode(callback(this.object, 'object', this)), this._ifNode(callback(this.index, 'index', this)));\n }\n\n /**\n * Create a clone of this node, a shallow copy\n * @return {AccessorNode}\n */\n clone() {\n return new AccessorNode(this.object, this.index);\n }\n\n /**\n * Get string representation\n * @param {Object} options\n * @return {string}\n */\n _toString(options) {\n var object = this.object.toString(options);\n if (needParenthesis(this.object)) {\n object = '(' + object + ')';\n }\n return object + this.index.toString(options);\n }\n\n /**\n * Get HTML representation\n * @param {Object} options\n * @return {string}\n */\n toHTML(options) {\n var object = this.object.toHTML(options);\n if (needParenthesis(this.object)) {\n object = '(' + object + ')';\n }\n return object + this.index.toHTML(options);\n }\n\n /**\n * Get LaTeX representation\n * @param {Object} options\n * @return {string}\n */\n _toTex(options) {\n var object = this.object.toTex(options);\n if (needParenthesis(this.object)) {\n object = '\\\\left(\\' + object + \\'\\\\right)';\n }\n return object + this.index.toTex(options);\n }\n\n /**\n * Get a JSON representation of the node\n * @returns {Object}\n */\n toJSON() {\n return {\n mathjs: name,\n object: this.object,\n index: this.index\n };\n }\n\n /**\n * Instantiate an AccessorNode from its JSON representation\n * @param {Object} json\n * An object structured like\n * `{\"mathjs\": \"AccessorNode\", object: ..., index: ...}`,\n * where mathjs is optional\n * @returns {AccessorNode}\n */\n static fromJSON(json) {\n return new AccessorNode(json.object, json.index);\n }\n }\n _defineProperty(AccessorNode, \"name\", name);\n return AccessorNode;\n}, {\n isClass: true,\n isNode: true\n});","import _defineProperty from \"@babel/runtime/helpers/defineProperty\";\nimport { isArrayNode, isNode } from '../../utils/is.js';\nimport { map } from '../../utils/array.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'ArrayNode';\nvar dependencies = ['Node'];\nexport var createArrayNode = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n Node\n } = _ref;\n class ArrayNode extends Node {\n /**\n * @constructor ArrayNode\n * @extends {Node}\n * Holds an 1-dimensional array with items\n * @param {Node[]} [items] 1 dimensional array with items\n */\n constructor(items) {\n super();\n this.items = items || [];\n\n // validate input\n if (!Array.isArray(this.items) || !this.items.every(isNode)) {\n throw new TypeError('Array containing Nodes expected');\n }\n }\n get type() {\n return name;\n }\n get isArrayNode() {\n return true;\n }\n\n /**\n * Compile a node into a JavaScript function.\n * This basically pre-calculates as much as possible and only leaves open\n * calculations which depend on a dynamic scope with variables.\n * @param {Object} math Math.js namespace with functions and constants.\n * @param {Object} argNames An object with argument names as key and `true`\n * as value. Used in the SymbolNode to optimize\n * for arguments from user assigned functions\n * (see FunctionAssignmentNode) or special symbols\n * like `end` (see IndexNode).\n * @return {function} Returns a function which can be called like:\n * evalNode(scope: Object, args: Object, context: *)\n */\n _compile(math, argNames) {\n var evalItems = map(this.items, function (item) {\n return item._compile(math, argNames);\n });\n var asMatrix = math.config.matrix !== 'Array';\n if (asMatrix) {\n var matrix = math.matrix;\n return function evalArrayNode(scope, args, context) {\n return matrix(map(evalItems, function (evalItem) {\n return evalItem(scope, args, context);\n }));\n };\n } else {\n return function evalArrayNode(scope, args, context) {\n return map(evalItems, function (evalItem) {\n return evalItem(scope, args, context);\n });\n };\n }\n }\n\n /**\n * Execute a callback for each of the child nodes of this node\n * @param {function(child: Node, path: string, parent: Node)} callback\n */\n forEach(callback) {\n for (var i = 0; i < this.items.length; i++) {\n var node = this.items[i];\n callback(node, 'items[' + i + ']', this);\n }\n }\n\n /**\n * Create a new ArrayNode whose children are the results of calling\n * the provided callback function for each child of the original node.\n * @param {function(child: Node, path: string, parent: Node): Node} callback\n * @returns {ArrayNode} Returns a transformed copy of the node\n */\n map(callback) {\n var items = [];\n for (var i = 0; i < this.items.length; i++) {\n items[i] = this._ifNode(callback(this.items[i], 'items[' + i + ']', this));\n }\n return new ArrayNode(items);\n }\n\n /**\n * Create a clone of this node, a shallow copy\n * @return {ArrayNode}\n */\n clone() {\n return new ArrayNode(this.items.slice(0));\n }\n\n /**\n * Get string representation\n * @param {Object} options\n * @return {string} str\n * @override\n */\n _toString(options) {\n var items = this.items.map(function (node) {\n return node.toString(options);\n });\n return '[' + items.join(', ') + ']';\n }\n\n /**\n * Get a JSON representation of the node\n * @returns {Object}\n */\n toJSON() {\n return {\n mathjs: name,\n items: this.items\n };\n }\n\n /**\n * Instantiate an ArrayNode from its JSON representation\n * @param {Object} json An object structured like\n * `{\"mathjs\": \"ArrayNode\", items: [...]}`,\n * where mathjs is optional\n * @returns {ArrayNode}\n */\n static fromJSON(json) {\n return new ArrayNode(json.items);\n }\n\n /**\n * Get HTML representation\n * @param {Object} options\n * @return {string} str\n * @override\n */\n toHTML(options) {\n var items = this.items.map(function (node) {\n return node.toHTML(options);\n });\n return '[' + items.join(',') + ']';\n }\n\n /**\n * Get LaTeX representation\n * @param {Object} options\n * @return {string} str\n */\n _toTex(options) {\n function itemsToTex(items, nested) {\n var mixedItems = items.some(isArrayNode) && !items.every(isArrayNode);\n var itemsFormRow = nested || mixedItems;\n var itemSep = itemsFormRow ? '&' : '\\\\\\\\';\n var itemsTex = items.map(function (node) {\n if (node.items) {\n return itemsToTex(node.items, !nested);\n } else {\n return node.toTex(options);\n }\n }).join(itemSep);\n return mixedItems || !itemsFormRow || itemsFormRow && !nested ? '\\\\begin{bmatrix}' + itemsTex + '\\\\end{bmatrix}' : itemsTex;\n }\n return itemsToTex(this.items, false);\n }\n }\n _defineProperty(ArrayNode, \"name\", name);\n return ArrayNode;\n}, {\n isClass: true,\n isNode: true\n});","// list of identifiers of nodes in order of their precedence\n// also contains information about left/right associativity\n// and which other operator the operator is associative with\n// Example:\n// addition is associative with addition and subtraction, because:\n// (a+b)+c=a+(b+c)\n// (a+b)-c=a+(b-c)\n//\n// postfix operators are left associative, prefix operators\n// are right associative\n//\n// It's also possible to set the following properties:\n// latexParens: if set to false, this node doesn't need to be enclosed\n// in parentheses when using LaTeX\n// latexLeftParens: if set to false, this !OperatorNode's!\n// left argument doesn't need to be enclosed\n// in parentheses\n// latexRightParens: the same for the right argument\nimport { hasOwnProperty } from '../utils/object.js';\nimport { isConstantNode, isParenthesisNode, rule2Node } from '../utils/is.js';\nexport var properties = [{\n // assignment\n AssignmentNode: {},\n FunctionAssignmentNode: {}\n}, {\n // conditional expression\n ConditionalNode: {\n latexLeftParens: false,\n latexRightParens: false,\n latexParens: false\n // conditionals don't need parentheses in LaTeX because\n // they are 2 dimensional\n }\n}, {\n // logical or\n 'OperatorNode:or': {\n op: 'or',\n associativity: 'left',\n associativeWith: []\n }\n}, {\n // logical xor\n 'OperatorNode:xor': {\n op: 'xor',\n associativity: 'left',\n associativeWith: []\n }\n}, {\n // logical and\n 'OperatorNode:and': {\n op: 'and',\n associativity: 'left',\n associativeWith: []\n }\n}, {\n // bitwise or\n 'OperatorNode:bitOr': {\n op: '|',\n associativity: 'left',\n associativeWith: []\n }\n}, {\n // bitwise xor\n 'OperatorNode:bitXor': {\n op: '^|',\n associativity: 'left',\n associativeWith: []\n }\n}, {\n // bitwise and\n 'OperatorNode:bitAnd': {\n op: '&',\n associativity: 'left',\n associativeWith: []\n }\n}, {\n // relational operators\n 'OperatorNode:equal': {\n op: '==',\n associativity: 'left',\n associativeWith: []\n },\n 'OperatorNode:unequal': {\n op: '!=',\n associativity: 'left',\n associativeWith: []\n },\n 'OperatorNode:smaller': {\n op: '<',\n associativity: 'left',\n associativeWith: []\n },\n 'OperatorNode:larger': {\n op: '>',\n associativity: 'left',\n associativeWith: []\n },\n 'OperatorNode:smallerEq': {\n op: '<=',\n associativity: 'left',\n associativeWith: []\n },\n 'OperatorNode:largerEq': {\n op: '>=',\n associativity: 'left',\n associativeWith: []\n },\n RelationalNode: {\n associativity: 'left',\n associativeWith: []\n }\n}, {\n // bitshift operators\n 'OperatorNode:leftShift': {\n op: '<<',\n associativity: 'left',\n associativeWith: []\n },\n 'OperatorNode:rightArithShift': {\n op: '>>',\n associativity: 'left',\n associativeWith: []\n },\n 'OperatorNode:rightLogShift': {\n op: '>>>',\n associativity: 'left',\n associativeWith: []\n }\n}, {\n // unit conversion\n 'OperatorNode:to': {\n op: 'to',\n associativity: 'left',\n associativeWith: []\n }\n}, {\n // range\n RangeNode: {}\n}, {\n // addition, subtraction\n 'OperatorNode:add': {\n op: '+',\n associativity: 'left',\n associativeWith: ['OperatorNode:add', 'OperatorNode:subtract']\n },\n 'OperatorNode:subtract': {\n op: '-',\n associativity: 'left',\n associativeWith: []\n }\n}, {\n // multiply, divide, modulus\n 'OperatorNode:multiply': {\n op: '*',\n associativity: 'left',\n associativeWith: ['OperatorNode:multiply', 'OperatorNode:divide', 'Operator:dotMultiply', 'Operator:dotDivide']\n },\n 'OperatorNode:divide': {\n op: '/',\n associativity: 'left',\n associativeWith: [],\n latexLeftParens: false,\n latexRightParens: false,\n latexParens: false\n // fractions don't require parentheses because\n // they're 2 dimensional, so parens aren't needed\n // in LaTeX\n },\n\n 'OperatorNode:dotMultiply': {\n op: '.*',\n associativity: 'left',\n associativeWith: ['OperatorNode:multiply', 'OperatorNode:divide', 'OperatorNode:dotMultiply', 'OperatorNode:doDivide']\n },\n 'OperatorNode:dotDivide': {\n op: './',\n associativity: 'left',\n associativeWith: []\n },\n 'OperatorNode:mod': {\n op: 'mod',\n associativity: 'left',\n associativeWith: []\n }\n}, {\n // Repeat multiplication for implicit multiplication\n 'OperatorNode:multiply': {\n associativity: 'left',\n associativeWith: ['OperatorNode:multiply', 'OperatorNode:divide', 'Operator:dotMultiply', 'Operator:dotDivide']\n }\n}, {\n // unary prefix operators\n 'OperatorNode:unaryPlus': {\n op: '+',\n associativity: 'right'\n },\n 'OperatorNode:unaryMinus': {\n op: '-',\n associativity: 'right'\n },\n 'OperatorNode:bitNot': {\n op: '~',\n associativity: 'right'\n },\n 'OperatorNode:not': {\n op: 'not',\n associativity: 'right'\n }\n}, {\n // exponentiation\n 'OperatorNode:pow': {\n op: '^',\n associativity: 'right',\n associativeWith: [],\n latexRightParens: false\n // the exponent doesn't need parentheses in\n // LaTeX because it's 2 dimensional\n // (it's on top)\n },\n\n 'OperatorNode:dotPow': {\n op: '.^',\n associativity: 'right',\n associativeWith: []\n }\n}, {\n // factorial\n 'OperatorNode:factorial': {\n op: '!',\n associativity: 'left'\n }\n}, {\n // matrix transpose\n 'OperatorNode:ctranspose': {\n op: \"'\",\n associativity: 'left'\n }\n}];\n\n/**\n * Returns the first non-parenthesis internal node, but only\n * when the 'parenthesis' option is unset or auto.\n * @param {Node} _node\n * @param {string} parenthesis\n * @return {Node}\n */\nfunction unwrapParen(_node, parenthesis) {\n if (!parenthesis || parenthesis !== 'auto') return _node;\n var node = _node;\n while (isParenthesisNode(node)) node = node.content;\n return node;\n}\n\n/**\n * Get the precedence of a Node.\n * Higher number for higher precedence, starting with 0.\n * Returns null if the precedence is undefined.\n *\n * @param {Node} _node\n * @param {string} parenthesis\n * @param {string} implicit\n * @param {Node} parent (for determining context for implicit multiplication)\n * @return {number | null}\n */\nexport function getPrecedence(_node, parenthesis, implicit, parent) {\n var node = _node;\n if (parenthesis !== 'keep') {\n // ParenthesisNodes are only ignored when not in 'keep' mode\n node = _node.getContent();\n }\n var identifier = node.getIdentifier();\n var precedence = null;\n for (var i = 0; i < properties.length; i++) {\n if (identifier in properties[i]) {\n precedence = i;\n break;\n }\n }\n // Bump up precedence of implicit multiplication, except when preceded\n // by a \"Rule 2\" fraction ( [unaryOp]constant / constant )\n if (identifier === 'OperatorNode:multiply' && node.implicit && implicit !== 'show') {\n var leftArg = unwrapParen(node.args[0], parenthesis);\n if (!(isConstantNode(leftArg) && parent && parent.getIdentifier() === 'OperatorNode:divide' && rule2Node(unwrapParen(parent.args[0], parenthesis))) && !(leftArg.getIdentifier() === 'OperatorNode:divide' && rule2Node(unwrapParen(leftArg.args[0], parenthesis)) && isConstantNode(unwrapParen(leftArg.args[1])))) {\n precedence += 1;\n }\n }\n return precedence;\n}\n\n/**\n * Get the associativity of an operator (left or right).\n * Returns a string containing 'left' or 'right' or null if\n * the associativity is not defined.\n *\n * @param {Node} _node\n * @param {string} parenthesis\n * @return {string|null}\n * @throws {Error}\n */\nexport function getAssociativity(_node, parenthesis) {\n var node = _node;\n if (parenthesis !== 'keep') {\n // ParenthesisNodes are only ignored when not in 'keep' mode\n node = _node.getContent();\n }\n var identifier = node.getIdentifier();\n var index = getPrecedence(node, parenthesis);\n if (index === null) {\n // node isn't in the list\n return null;\n }\n var property = properties[index][identifier];\n if (hasOwnProperty(property, 'associativity')) {\n if (property.associativity === 'left') {\n return 'left';\n }\n if (property.associativity === 'right') {\n return 'right';\n }\n // associativity is invalid\n throw Error('\\'' + identifier + '\\' has the invalid associativity \\'' + property.associativity + '\\'.');\n }\n\n // associativity is undefined\n return null;\n}\n\n/**\n * Check if an operator is associative with another operator.\n * Returns either true or false or null if not defined.\n *\n * @param {Node} nodeA\n * @param {Node} nodeB\n * @param {string} parenthesis\n * @return {boolean | null}\n */\nexport function isAssociativeWith(nodeA, nodeB, parenthesis) {\n // ParenthesisNodes are only ignored when not in 'keep' mode\n var a = parenthesis !== 'keep' ? nodeA.getContent() : nodeA;\n var b = parenthesis !== 'keep' ? nodeA.getContent() : nodeB;\n var identifierA = a.getIdentifier();\n var identifierB = b.getIdentifier();\n var index = getPrecedence(a, parenthesis);\n if (index === null) {\n // node isn't in the list\n return null;\n }\n var property = properties[index][identifierA];\n if (hasOwnProperty(property, 'associativeWith') && property.associativeWith instanceof Array) {\n for (var i = 0; i < property.associativeWith.length; i++) {\n if (property.associativeWith[i] === identifierB) {\n return true;\n }\n }\n return false;\n }\n\n // associativeWith is not defined\n return null;\n}\n\n/**\n * Get the operator associated with a function name.\n * Returns a string with the operator symbol, or null if the\n * input is not the name of a function associated with an\n * operator.\n *\n * @param {string} Function name\n * @return {string | null} Associated operator symbol, if any\n */\nexport function getOperator(fn) {\n var identifier = 'OperatorNode:' + fn;\n for (var group of properties) {\n if (identifier in group) {\n return group[identifier].op;\n }\n }\n return null;\n}","import _defineProperty from \"@babel/runtime/helpers/defineProperty\";\nimport { isAccessorNode, isIndexNode, isNode, isSymbolNode } from '../../utils/is.js';\nimport { getSafeProperty, setSafeProperty } from '../../utils/customs.js';\nimport { factory } from '../../utils/factory.js';\nimport { accessFactory } from './utils/access.js';\nimport { assignFactory } from './utils/assign.js';\nimport { getPrecedence } from '../operators.js';\nvar name = 'AssignmentNode';\nvar dependencies = ['subset', '?matrix',\n// FIXME: should not be needed at all, should be handled by subset\n'Node'];\nexport var createAssignmentNode = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n subset,\n matrix,\n Node\n } = _ref;\n var access = accessFactory({\n subset\n });\n var assign = assignFactory({\n subset,\n matrix\n });\n\n /*\n * Is parenthesis needed?\n * @param {node} node\n * @param {string} [parenthesis='keep']\n * @param {string} implicit\n * @private\n */\n function needParenthesis(node, parenthesis, implicit) {\n if (!parenthesis) {\n parenthesis = 'keep';\n }\n var precedence = getPrecedence(node, parenthesis, implicit);\n var exprPrecedence = getPrecedence(node.value, parenthesis, implicit);\n return parenthesis === 'all' || exprPrecedence !== null && exprPrecedence <= precedence;\n }\n class AssignmentNode extends Node {\n /**\n * @constructor AssignmentNode\n * @extends {Node}\n *\n * Define a symbol, like `a=3.2`, update a property like `a.b=3.2`, or\n * replace a subset of a matrix like `A[2,2]=42`.\n *\n * Syntax:\n *\n * new AssignmentNode(symbol, value)\n * new AssignmentNode(object, index, value)\n *\n * Usage:\n *\n * new AssignmentNode(new SymbolNode('a'), new ConstantNode(2)) // a=2\n * new AssignmentNode(new SymbolNode('a'),\n * new IndexNode('b'),\n * new ConstantNode(2)) // a.b=2\n * new AssignmentNode(new SymbolNode('a'),\n * new IndexNode(1, 2),\n * new ConstantNode(3)) // a[1,2]=3\n *\n * @param {SymbolNode | AccessorNode} object\n * Object on which to assign a value\n * @param {IndexNode} [index=null]\n * Index, property name or matrix index. Optional. If not provided\n * and `object` is a SymbolNode, the property is assigned to the\n * global scope.\n * @param {Node} value\n * The value to be assigned\n */\n constructor(object, index, value) {\n super();\n this.object = object;\n this.index = value ? index : null;\n this.value = value || index;\n\n // validate input\n if (!isSymbolNode(object) && !isAccessorNode(object)) {\n throw new TypeError('SymbolNode or AccessorNode expected as \"object\"');\n }\n if (isSymbolNode(object) && object.name === 'end') {\n throw new Error('Cannot assign to symbol \"end\"');\n }\n if (this.index && !isIndexNode(this.index)) {\n // index is optional\n throw new TypeError('IndexNode expected as \"index\"');\n }\n if (!isNode(this.value)) {\n throw new TypeError('Node expected as \"value\"');\n }\n }\n\n // class name for typing purposes:\n\n // readonly property name\n get name() {\n if (this.index) {\n return this.index.isObjectProperty() ? this.index.getObjectProperty() : '';\n } else {\n return this.object.name || '';\n }\n }\n get type() {\n return name;\n }\n get isAssignmentNode() {\n return true;\n }\n\n /**\n * Compile a node into a JavaScript function.\n * This basically pre-calculates as much as possible and only leaves open\n * calculations which depend on a dynamic scope with variables.\n * @param {Object} math Math.js namespace with functions and constants.\n * @param {Object} argNames An object with argument names as key and `true`\n * as value. Used in the SymbolNode to optimize\n * for arguments from user assigned functions\n * (see FunctionAssignmentNode) or special symbols\n * like `end` (see IndexNode).\n * @return {function} Returns a function which can be called like:\n * evalNode(scope: Object, args: Object, context: *)\n */\n _compile(math, argNames) {\n var evalObject = this.object._compile(math, argNames);\n var evalIndex = this.index ? this.index._compile(math, argNames) : null;\n var evalValue = this.value._compile(math, argNames);\n var name = this.object.name;\n if (!this.index) {\n // apply a variable to the scope, for example `a=2`\n if (!isSymbolNode(this.object)) {\n throw new TypeError('SymbolNode expected as object');\n }\n return function evalAssignmentNode(scope, args, context) {\n var value = evalValue(scope, args, context);\n scope.set(name, value);\n return value;\n };\n } else if (this.index.isObjectProperty()) {\n // apply an object property for example `a.b=2`\n var prop = this.index.getObjectProperty();\n return function evalAssignmentNode(scope, args, context) {\n var object = evalObject(scope, args, context);\n var value = evalValue(scope, args, context);\n setSafeProperty(object, prop, value);\n return value;\n };\n } else if (isSymbolNode(this.object)) {\n // update a matrix subset, for example `a[2]=3`\n return function evalAssignmentNode(scope, args, context) {\n var childObject = evalObject(scope, args, context);\n var value = evalValue(scope, args, context);\n // Important: we pass childObject instead of context:\n var index = evalIndex(scope, args, childObject);\n scope.set(name, assign(childObject, index, value));\n return value;\n };\n } else {\n // isAccessorNode(node.object) === true\n // update a matrix subset, for example `a.b[2]=3`\n\n // we will not use the compile function of the AccessorNode, but\n // compile it ourselves here as we need the parent object of the\n // AccessorNode:\n // wee need to apply the updated object to parent object\n var evalParentObject = this.object.object._compile(math, argNames);\n if (this.object.index.isObjectProperty()) {\n var parentProp = this.object.index.getObjectProperty();\n return function evalAssignmentNode(scope, args, context) {\n var parent = evalParentObject(scope, args, context);\n var childObject = getSafeProperty(parent, parentProp);\n // Important: we pass childObject instead of context:\n var index = evalIndex(scope, args, childObject);\n var value = evalValue(scope, args, context);\n setSafeProperty(parent, parentProp, assign(childObject, index, value));\n return value;\n };\n } else {\n // if some parameters use the 'end' parameter, we need to calculate\n // the size\n var evalParentIndex = this.object.index._compile(math, argNames);\n return function evalAssignmentNode(scope, args, context) {\n var parent = evalParentObject(scope, args, context);\n // Important: we pass parent instead of context:\n var parentIndex = evalParentIndex(scope, args, parent);\n var childObject = access(parent, parentIndex);\n // Important: we pass childObject instead of context\n var index = evalIndex(scope, args, childObject);\n var value = evalValue(scope, args, context);\n assign(parent, parentIndex, assign(childObject, index, value));\n return value;\n };\n }\n }\n }\n\n /**\n * Execute a callback for each of the child nodes of this node\n * @param {function(child: Node, path: string, parent: Node)} callback\n */\n forEach(callback) {\n callback(this.object, 'object', this);\n if (this.index) {\n callback(this.index, 'index', this);\n }\n callback(this.value, 'value', this);\n }\n\n /**\n * Create a new AssignmentNode whose children are the results of calling\n * the provided callback function for each child of the original node.\n * @param {function(child: Node, path: string, parent: Node): Node} callback\n * @returns {AssignmentNode} Returns a transformed copy of the node\n */\n map(callback) {\n var object = this._ifNode(callback(this.object, 'object', this));\n var index = this.index ? this._ifNode(callback(this.index, 'index', this)) : null;\n var value = this._ifNode(callback(this.value, 'value', this));\n return new AssignmentNode(object, index, value);\n }\n\n /**\n * Create a clone of this node, a shallow copy\n * @return {AssignmentNode}\n */\n clone() {\n return new AssignmentNode(this.object, this.index, this.value);\n }\n\n /**\n * Get string representation\n * @param {Object} options\n * @return {string}\n */\n _toString(options) {\n var object = this.object.toString(options);\n var index = this.index ? this.index.toString(options) : '';\n var value = this.value.toString(options);\n if (needParenthesis(this, options && options.parenthesis, options && options.implicit)) {\n value = '(' + value + ')';\n }\n return object + index + ' = ' + value;\n }\n\n /**\n * Get a JSON representation of the node\n * @returns {Object}\n */\n toJSON() {\n return {\n mathjs: name,\n object: this.object,\n index: this.index,\n value: this.value\n };\n }\n\n /**\n * Instantiate an AssignmentNode from its JSON representation\n * @param {Object} json\n * An object structured like\n * `{\"mathjs\": \"AssignmentNode\", object: ..., index: ..., value: ...}`,\n * where mathjs is optional\n * @returns {AssignmentNode}\n */\n static fromJSON(json) {\n return new AssignmentNode(json.object, json.index, json.value);\n }\n\n /**\n * Get HTML representation\n * @param {Object} options\n * @return {string}\n */\n toHTML(options) {\n var object = this.object.toHTML(options);\n var index = this.index ? this.index.toHTML(options) : '';\n var value = this.value.toHTML(options);\n if (needParenthesis(this, options && options.parenthesis, options && options.implicit)) {\n value = '(' + value + ')';\n }\n return object + index + '=' + value;\n }\n\n /**\n * Get LaTeX representation\n * @param {Object} options\n * @return {string}\n */\n _toTex(options) {\n var object = this.object.toTex(options);\n var index = this.index ? this.index.toTex(options) : '';\n var value = this.value.toTex(options);\n if (needParenthesis(this, options && options.parenthesis, options && options.implicit)) {\n value = \"\\\\left(\".concat(value, \"\\\\right)\");\n }\n return object + index + ':=' + value;\n }\n }\n _defineProperty(AssignmentNode, \"name\", name);\n return AssignmentNode;\n}, {\n isClass: true,\n isNode: true\n});","import { errorTransform } from '../../transform/utils/errorTransform.js';\nimport { setSafeProperty } from '../../../utils/customs.js';\nexport function assignFactory(_ref) {\n var {\n subset,\n matrix\n } = _ref;\n /**\n * Replace part of an object:\n *\n * - Assign a property to an object\n * - Replace a part of a string\n * - Replace a matrix subset\n *\n * @param {Object | Array | Matrix | string} object\n * @param {Index} index\n * @param {*} value\n * @return {Object | Array | Matrix | string} Returns the original object\n * except in case of a string\n */\n // TODO: change assign to return the value instead of the object\n return function assign(object, index, value) {\n try {\n if (Array.isArray(object)) {\n // we use matrix.subset here instead of the function subset because we must not clone the contents\n return matrix(object).subset(index, value).valueOf();\n } else if (object && typeof object.subset === 'function') {\n // Matrix\n return object.subset(index, value);\n } else if (typeof object === 'string') {\n // TODO: move setStringSubset into a separate util file, use that\n return subset(object, index, value);\n } else if (typeof object === 'object') {\n if (!index.isObjectProperty()) {\n throw TypeError('Cannot apply a numeric index as object property');\n }\n setSafeProperty(object, index.getObjectProperty(), value);\n return object;\n } else {\n throw new TypeError('Cannot apply index: unsupported type of object');\n }\n } catch (err) {\n throw errorTransform(err);\n }\n };\n}","import _defineProperty from \"@babel/runtime/helpers/defineProperty\";\nimport { isNode } from '../../utils/is.js';\nimport { forEach, map } from '../../utils/array.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'BlockNode';\nvar dependencies = ['ResultSet', 'Node'];\nexport var createBlockNode = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n ResultSet,\n Node\n } = _ref;\n class BlockNode extends Node {\n /**\n * @constructor BlockNode\n * @extends {Node}\n * Holds a set with blocks\n * @param {Array.<{node: Node} | {node: Node, visible: boolean}>} blocks\n * An array with blocks, where a block is constructed as an\n * Object with properties block, which is a Node, and visible,\n * which is a boolean. The property visible is optional and\n * is true by default\n */\n constructor(blocks) {\n super();\n // validate input, copy blocks\n if (!Array.isArray(blocks)) throw new Error('Array expected');\n this.blocks = blocks.map(function (block) {\n var node = block && block.node;\n var visible = block && block.visible !== undefined ? block.visible : true;\n if (!isNode(node)) throw new TypeError('Property \"node\" must be a Node');\n if (typeof visible !== 'boolean') {\n throw new TypeError('Property \"visible\" must be a boolean');\n }\n return {\n node,\n visible\n };\n });\n }\n get type() {\n return name;\n }\n get isBlockNode() {\n return true;\n }\n\n /**\n * Compile a node into a JavaScript function.\n * This basically pre-calculates as much as possible and only leaves open\n * calculations which depend on a dynamic scope with variables.\n * @param {Object} math Math.js namespace with functions and constants.\n * @param {Object} argNames An object with argument names as key and `true`\n * as value. Used in the SymbolNode to optimize\n * for arguments from user assigned functions\n * (see FunctionAssignmentNode) or special symbols\n * like `end` (see IndexNode).\n * @return {function} Returns a function which can be called like:\n * evalNode(scope: Object, args: Object, context: *)\n */\n _compile(math, argNames) {\n var evalBlocks = map(this.blocks, function (block) {\n return {\n evaluate: block.node._compile(math, argNames),\n visible: block.visible\n };\n });\n return function evalBlockNodes(scope, args, context) {\n var results = [];\n forEach(evalBlocks, function evalBlockNode(block) {\n var result = block.evaluate(scope, args, context);\n if (block.visible) {\n results.push(result);\n }\n });\n return new ResultSet(results);\n };\n }\n\n /**\n * Execute a callback for each of the child blocks of this node\n * @param {function(child: Node, path: string, parent: Node)} callback\n */\n forEach(callback) {\n for (var i = 0; i < this.blocks.length; i++) {\n callback(this.blocks[i].node, 'blocks[' + i + '].node', this);\n }\n }\n\n /**\n * Create a new BlockNode whose children are the results of calling\n * the provided callback function for each child of the original node.\n * @param {function(child: Node, path: string, parent: Node): Node} callback\n * @returns {BlockNode} Returns a transformed copy of the node\n */\n map(callback) {\n var blocks = [];\n for (var i = 0; i < this.blocks.length; i++) {\n var block = this.blocks[i];\n var node = this._ifNode(callback(block.node, 'blocks[' + i + '].node', this));\n blocks[i] = {\n node,\n visible: block.visible\n };\n }\n return new BlockNode(blocks);\n }\n\n /**\n * Create a clone of this node, a shallow copy\n * @return {BlockNode}\n */\n clone() {\n var blocks = this.blocks.map(function (block) {\n return {\n node: block.node,\n visible: block.visible\n };\n });\n return new BlockNode(blocks);\n }\n\n /**\n * Get string representation\n * @param {Object} options\n * @return {string} str\n * @override\n */\n _toString(options) {\n return this.blocks.map(function (param) {\n return param.node.toString(options) + (param.visible ? '' : ';');\n }).join('\\n');\n }\n\n /**\n * Get a JSON representation of the node\n * @returns {Object}\n */\n toJSON() {\n return {\n mathjs: name,\n blocks: this.blocks\n };\n }\n\n /**\n * Instantiate an BlockNode from its JSON representation\n * @param {Object} json\n * An object structured like\n * `{\"mathjs\": \"BlockNode\", blocks: [{node: ..., visible: false}, ...]}`,\n * where mathjs is optional\n * @returns {BlockNode}\n */\n static fromJSON(json) {\n return new BlockNode(json.blocks);\n }\n\n /**\n * Get HTML representation\n * @param {Object} options\n * @return {string} str\n * @override\n */\n toHTML(options) {\n return this.blocks.map(function (param) {\n return param.node.toHTML(options) + (param.visible ? '' : ';');\n }).join('
');\n }\n\n /**\n * Get LaTeX representation\n * @param {Object} options\n * @return {string} str\n */\n _toTex(options) {\n return this.blocks.map(function (param) {\n return param.node.toTex(options) + (param.visible ? '' : ';');\n }).join('\\\\;\\\\;\\n');\n }\n }\n _defineProperty(BlockNode, \"name\", name);\n return BlockNode;\n}, {\n isClass: true,\n isNode: true\n});","import _defineProperty from \"@babel/runtime/helpers/defineProperty\";\nimport { isBigNumber, isComplex, isNode, isUnit, typeOf } from '../../utils/is.js';\nimport { factory } from '../../utils/factory.js';\nimport { getPrecedence } from '../operators.js';\nvar name = 'ConditionalNode';\nvar dependencies = ['Node'];\nexport var createConditionalNode = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n Node\n } = _ref;\n /**\n * Test whether a condition is met\n * @param {*} condition\n * @returns {boolean} true if condition is true or non-zero, else false\n */\n function testCondition(condition) {\n if (typeof condition === 'number' || typeof condition === 'boolean' || typeof condition === 'string') {\n return !!condition;\n }\n if (condition) {\n if (isBigNumber(condition)) {\n return !condition.isZero();\n }\n if (isComplex(condition)) {\n return !!(condition.re || condition.im);\n }\n if (isUnit(condition)) {\n return !!condition.value;\n }\n }\n if (condition === null || condition === undefined) {\n return false;\n }\n throw new TypeError('Unsupported type of condition \"' + typeOf(condition) + '\"');\n }\n class ConditionalNode extends Node {\n /**\n * A lazy evaluating conditional operator: 'condition ? trueExpr : falseExpr'\n *\n * @param {Node} condition Condition, must result in a boolean\n * @param {Node} trueExpr Expression evaluated when condition is true\n * @param {Node} falseExpr Expression evaluated when condition is true\n *\n * @constructor ConditionalNode\n * @extends {Node}\n */\n constructor(condition, trueExpr, falseExpr) {\n super();\n if (!isNode(condition)) {\n throw new TypeError('Parameter condition must be a Node');\n }\n if (!isNode(trueExpr)) {\n throw new TypeError('Parameter trueExpr must be a Node');\n }\n if (!isNode(falseExpr)) {\n throw new TypeError('Parameter falseExpr must be a Node');\n }\n this.condition = condition;\n this.trueExpr = trueExpr;\n this.falseExpr = falseExpr;\n }\n get type() {\n return name;\n }\n get isConditionalNode() {\n return true;\n }\n\n /**\n * Compile a node into a JavaScript function.\n * This basically pre-calculates as much as possible and only leaves open\n * calculations which depend on a dynamic scope with variables.\n * @param {Object} math Math.js namespace with functions and constants.\n * @param {Object} argNames An object with argument names as key and `true`\n * as value. Used in the SymbolNode to optimize\n * for arguments from user assigned functions\n * (see FunctionAssignmentNode) or special symbols\n * like `end` (see IndexNode).\n * @return {function} Returns a function which can be called like:\n * evalNode(scope: Object, args: Object, context: *)\n */\n _compile(math, argNames) {\n var evalCondition = this.condition._compile(math, argNames);\n var evalTrueExpr = this.trueExpr._compile(math, argNames);\n var evalFalseExpr = this.falseExpr._compile(math, argNames);\n return function evalConditionalNode(scope, args, context) {\n return testCondition(evalCondition(scope, args, context)) ? evalTrueExpr(scope, args, context) : evalFalseExpr(scope, args, context);\n };\n }\n\n /**\n * Execute a callback for each of the child nodes of this node\n * @param {function(child: Node, path: string, parent: Node)} callback\n */\n forEach(callback) {\n callback(this.condition, 'condition', this);\n callback(this.trueExpr, 'trueExpr', this);\n callback(this.falseExpr, 'falseExpr', this);\n }\n\n /**\n * Create a new ConditionalNode whose children are the results of calling\n * the provided callback function for each child of the original node.\n * @param {function(child: Node, path: string, parent: Node): Node} callback\n * @returns {ConditionalNode} Returns a transformed copy of the node\n */\n map(callback) {\n return new ConditionalNode(this._ifNode(callback(this.condition, 'condition', this)), this._ifNode(callback(this.trueExpr, 'trueExpr', this)), this._ifNode(callback(this.falseExpr, 'falseExpr', this)));\n }\n\n /**\n * Create a clone of this node, a shallow copy\n * @return {ConditionalNode}\n */\n clone() {\n return new ConditionalNode(this.condition, this.trueExpr, this.falseExpr);\n }\n\n /**\n * Get string representation\n * @param {Object} options\n * @return {string} str\n */\n _toString(options) {\n var parenthesis = options && options.parenthesis ? options.parenthesis : 'keep';\n var precedence = getPrecedence(this, parenthesis, options && options.implicit);\n\n // Enclose Arguments in parentheses if they are an OperatorNode\n // or have lower or equal precedence\n // NOTE: enclosing all OperatorNodes in parentheses is a decision\n // purely based on aesthetics and readability\n var condition = this.condition.toString(options);\n var conditionPrecedence = getPrecedence(this.condition, parenthesis, options && options.implicit);\n if (parenthesis === 'all' || this.condition.type === 'OperatorNode' || conditionPrecedence !== null && conditionPrecedence <= precedence) {\n condition = '(' + condition + ')';\n }\n var trueExpr = this.trueExpr.toString(options);\n var truePrecedence = getPrecedence(this.trueExpr, parenthesis, options && options.implicit);\n if (parenthesis === 'all' || this.trueExpr.type === 'OperatorNode' || truePrecedence !== null && truePrecedence <= precedence) {\n trueExpr = '(' + trueExpr + ')';\n }\n var falseExpr = this.falseExpr.toString(options);\n var falsePrecedence = getPrecedence(this.falseExpr, parenthesis, options && options.implicit);\n if (parenthesis === 'all' || this.falseExpr.type === 'OperatorNode' || falsePrecedence !== null && falsePrecedence <= precedence) {\n falseExpr = '(' + falseExpr + ')';\n }\n return condition + ' ? ' + trueExpr + ' : ' + falseExpr;\n }\n\n /**\n * Get a JSON representation of the node\n * @returns {Object}\n */\n toJSON() {\n return {\n mathjs: name,\n condition: this.condition,\n trueExpr: this.trueExpr,\n falseExpr: this.falseExpr\n };\n }\n\n /**\n * Instantiate an ConditionalNode from its JSON representation\n * @param {Object} json\n * An object structured like\n * ```\n * {\"mathjs\": \"ConditionalNode\",\n * \"condition\": ...,\n * \"trueExpr\": ...,\n * \"falseExpr\": ...}\n * ```\n * where mathjs is optional\n * @returns {ConditionalNode}\n */\n static fromJSON(json) {\n return new ConditionalNode(json.condition, json.trueExpr, json.falseExpr);\n }\n\n /**\n * Get HTML representation\n * @param {Object} options\n * @return {string} str\n */\n toHTML(options) {\n var parenthesis = options && options.parenthesis ? options.parenthesis : 'keep';\n var precedence = getPrecedence(this, parenthesis, options && options.implicit);\n\n // Enclose Arguments in parentheses if they are an OperatorNode\n // or have lower or equal precedence\n // NOTE: enclosing all OperatorNodes in parentheses is a decision\n // purely based on aesthetics and readability\n var condition = this.condition.toHTML(options);\n var conditionPrecedence = getPrecedence(this.condition, parenthesis, options && options.implicit);\n if (parenthesis === 'all' || this.condition.type === 'OperatorNode' || conditionPrecedence !== null && conditionPrecedence <= precedence) {\n condition = '(' + condition + ')';\n }\n var trueExpr = this.trueExpr.toHTML(options);\n var truePrecedence = getPrecedence(this.trueExpr, parenthesis, options && options.implicit);\n if (parenthesis === 'all' || this.trueExpr.type === 'OperatorNode' || truePrecedence !== null && truePrecedence <= precedence) {\n trueExpr = '(' + trueExpr + ')';\n }\n var falseExpr = this.falseExpr.toHTML(options);\n var falsePrecedence = getPrecedence(this.falseExpr, parenthesis, options && options.implicit);\n if (parenthesis === 'all' || this.falseExpr.type === 'OperatorNode' || falsePrecedence !== null && falsePrecedence <= precedence) {\n falseExpr = '(' + falseExpr + ')';\n }\n return condition + '?' + trueExpr + ':' + falseExpr;\n }\n\n /**\n * Get LaTeX representation\n * @param {Object} options\n * @return {string} str\n */\n _toTex(options) {\n return '\\\\begin{cases} {' + this.trueExpr.toTex(options) + '}, &\\\\quad{\\\\text{if }\\\\;' + this.condition.toTex(options) + '}\\\\\\\\{' + this.falseExpr.toTex(options) + '}, &\\\\quad{\\\\text{otherwise}}\\\\end{cases}';\n }\n }\n _defineProperty(ConditionalNode, \"name\", name);\n return ConditionalNode;\n}, {\n isClass: true,\n isNode: true\n});","/* eslint no-template-curly-in-string: \"off\" */\n\nimport escapeLatexLib from 'escape-latex';\nimport { hasOwnProperty } from './object.js';\nexport var latexSymbols = {\n // GREEK LETTERS\n Alpha: 'A',\n alpha: '\\\\alpha',\n Beta: 'B',\n beta: '\\\\beta',\n Gamma: '\\\\Gamma',\n gamma: '\\\\gamma',\n Delta: '\\\\Delta',\n delta: '\\\\delta',\n Epsilon: 'E',\n epsilon: '\\\\epsilon',\n varepsilon: '\\\\varepsilon',\n Zeta: 'Z',\n zeta: '\\\\zeta',\n Eta: 'H',\n eta: '\\\\eta',\n Theta: '\\\\Theta',\n theta: '\\\\theta',\n vartheta: '\\\\vartheta',\n Iota: 'I',\n iota: '\\\\iota',\n Kappa: 'K',\n kappa: '\\\\kappa',\n varkappa: '\\\\varkappa',\n Lambda: '\\\\Lambda',\n lambda: '\\\\lambda',\n Mu: 'M',\n mu: '\\\\mu',\n Nu: 'N',\n nu: '\\\\nu',\n Xi: '\\\\Xi',\n xi: '\\\\xi',\n Omicron: 'O',\n omicron: 'o',\n Pi: '\\\\Pi',\n pi: '\\\\pi',\n varpi: '\\\\varpi',\n Rho: 'P',\n rho: '\\\\rho',\n varrho: '\\\\varrho',\n Sigma: '\\\\Sigma',\n sigma: '\\\\sigma',\n varsigma: '\\\\varsigma',\n Tau: 'T',\n tau: '\\\\tau',\n Upsilon: '\\\\Upsilon',\n upsilon: '\\\\upsilon',\n Phi: '\\\\Phi',\n phi: '\\\\phi',\n varphi: '\\\\varphi',\n Chi: 'X',\n chi: '\\\\chi',\n Psi: '\\\\Psi',\n psi: '\\\\psi',\n Omega: '\\\\Omega',\n omega: '\\\\omega',\n // logic\n true: '\\\\mathrm{True}',\n false: '\\\\mathrm{False}',\n // other\n i: 'i',\n // TODO use \\i ??\n inf: '\\\\infty',\n Inf: '\\\\infty',\n infinity: '\\\\infty',\n Infinity: '\\\\infty',\n oo: '\\\\infty',\n lim: '\\\\lim',\n undefined: '\\\\mathbf{?}'\n};\nexport var latexOperators = {\n transpose: '^\\\\top',\n ctranspose: '^H',\n factorial: '!',\n pow: '^',\n dotPow: '.^\\\\wedge',\n // TODO find ideal solution\n unaryPlus: '+',\n unaryMinus: '-',\n bitNot: '\\\\~',\n // TODO find ideal solution\n not: '\\\\neg',\n multiply: '\\\\cdot',\n divide: '\\\\frac',\n // TODO how to handle that properly?\n dotMultiply: '.\\\\cdot',\n // TODO find ideal solution\n dotDivide: '.:',\n // TODO find ideal solution\n mod: '\\\\mod',\n add: '+',\n subtract: '-',\n to: '\\\\rightarrow',\n leftShift: '<<',\n rightArithShift: '>>',\n rightLogShift: '>>>',\n equal: '=',\n unequal: '\\\\neq',\n smaller: '<',\n larger: '>',\n smallerEq: '\\\\leq',\n largerEq: '\\\\geq',\n bitAnd: '\\\\&',\n bitXor: '\\\\underline{|}',\n bitOr: '|',\n and: '\\\\wedge',\n xor: '\\\\veebar',\n or: '\\\\vee'\n};\nexport var latexFunctions = {\n // arithmetic\n abs: {\n 1: '\\\\left|${args[0]}\\\\right|'\n },\n add: {\n 2: \"\\\\left(${args[0]}\".concat(latexOperators.add, \"${args[1]}\\\\right)\")\n },\n cbrt: {\n 1: '\\\\sqrt[3]{${args[0]}}'\n },\n ceil: {\n 1: '\\\\left\\\\lceil${args[0]}\\\\right\\\\rceil'\n },\n cube: {\n 1: '\\\\left(${args[0]}\\\\right)^3'\n },\n divide: {\n 2: '\\\\frac{${args[0]}}{${args[1]}}'\n },\n dotDivide: {\n 2: \"\\\\left(${args[0]}\".concat(latexOperators.dotDivide, \"${args[1]}\\\\right)\")\n },\n dotMultiply: {\n 2: \"\\\\left(${args[0]}\".concat(latexOperators.dotMultiply, \"${args[1]}\\\\right)\")\n },\n dotPow: {\n 2: \"\\\\left(${args[0]}\".concat(latexOperators.dotPow, \"${args[1]}\\\\right)\")\n },\n exp: {\n 1: '\\\\exp\\\\left(${args[0]}\\\\right)'\n },\n expm1: \"\\\\left(e\".concat(latexOperators.pow, \"{${args[0]}}-1\\\\right)\"),\n fix: {\n 1: '\\\\mathrm{${name}}\\\\left(${args[0]}\\\\right)'\n },\n floor: {\n 1: '\\\\left\\\\lfloor${args[0]}\\\\right\\\\rfloor'\n },\n gcd: '\\\\gcd\\\\left(${args}\\\\right)',\n hypot: '\\\\hypot\\\\left(${args}\\\\right)',\n log: {\n 1: '\\\\ln\\\\left(${args[0]}\\\\right)',\n 2: '\\\\log_{${args[1]}}\\\\left(${args[0]}\\\\right)'\n },\n log10: {\n 1: '\\\\log_{10}\\\\left(${args[0]}\\\\right)'\n },\n log1p: {\n 1: '\\\\ln\\\\left(${args[0]}+1\\\\right)',\n 2: '\\\\log_{${args[1]}}\\\\left(${args[0]}+1\\\\right)'\n },\n log2: '\\\\log_{2}\\\\left(${args[0]}\\\\right)',\n mod: {\n 2: \"\\\\left(${args[0]}\".concat(latexOperators.mod, \"${args[1]}\\\\right)\")\n },\n multiply: {\n 2: \"\\\\left(${args[0]}\".concat(latexOperators.multiply, \"${args[1]}\\\\right)\")\n },\n norm: {\n 1: '\\\\left\\\\|${args[0]}\\\\right\\\\|',\n 2: undefined // use default template\n },\n\n nthRoot: {\n 2: '\\\\sqrt[${args[1]}]{${args[0]}}'\n },\n nthRoots: {\n 2: '\\\\{y : $y^{args[1]} = {${args[0]}}\\\\}'\n },\n pow: {\n 2: \"\\\\left(${args[0]}\\\\right)\".concat(latexOperators.pow, \"{${args[1]}}\")\n },\n round: {\n 1: '\\\\left\\\\lfloor${args[0]}\\\\right\\\\rceil',\n 2: undefined // use default template\n },\n\n sign: {\n 1: '\\\\mathrm{${name}}\\\\left(${args[0]}\\\\right)'\n },\n sqrt: {\n 1: '\\\\sqrt{${args[0]}}'\n },\n square: {\n 1: '\\\\left(${args[0]}\\\\right)^2'\n },\n subtract: {\n 2: \"\\\\left(${args[0]}\".concat(latexOperators.subtract, \"${args[1]}\\\\right)\")\n },\n unaryMinus: {\n 1: \"\".concat(latexOperators.unaryMinus, \"\\\\left(${args[0]}\\\\right)\")\n },\n unaryPlus: {\n 1: \"\".concat(latexOperators.unaryPlus, \"\\\\left(${args[0]}\\\\right)\")\n },\n // bitwise\n bitAnd: {\n 2: \"\\\\left(${args[0]}\".concat(latexOperators.bitAnd, \"${args[1]}\\\\right)\")\n },\n bitNot: {\n 1: latexOperators.bitNot + '\\\\left(${args[0]}\\\\right)'\n },\n bitOr: {\n 2: \"\\\\left(${args[0]}\".concat(latexOperators.bitOr, \"${args[1]}\\\\right)\")\n },\n bitXor: {\n 2: \"\\\\left(${args[0]}\".concat(latexOperators.bitXor, \"${args[1]}\\\\right)\")\n },\n leftShift: {\n 2: \"\\\\left(${args[0]}\".concat(latexOperators.leftShift, \"${args[1]}\\\\right)\")\n },\n rightArithShift: {\n 2: \"\\\\left(${args[0]}\".concat(latexOperators.rightArithShift, \"${args[1]}\\\\right)\")\n },\n rightLogShift: {\n 2: \"\\\\left(${args[0]}\".concat(latexOperators.rightLogShift, \"${args[1]}\\\\right)\")\n },\n // combinatorics\n bellNumbers: {\n 1: '\\\\mathrm{B}_{${args[0]}}'\n },\n catalan: {\n 1: '\\\\mathrm{C}_{${args[0]}}'\n },\n stirlingS2: {\n 2: '\\\\mathrm{S}\\\\left(${args}\\\\right)'\n },\n // complex\n arg: {\n 1: '\\\\arg\\\\left(${args[0]}\\\\right)'\n },\n conj: {\n 1: '\\\\left(${args[0]}\\\\right)^*'\n },\n im: {\n 1: '\\\\Im\\\\left\\\\lbrace${args[0]}\\\\right\\\\rbrace'\n },\n re: {\n 1: '\\\\Re\\\\left\\\\lbrace${args[0]}\\\\right\\\\rbrace'\n },\n // logical\n and: {\n 2: \"\\\\left(${args[0]}\".concat(latexOperators.and, \"${args[1]}\\\\right)\")\n },\n not: {\n 1: latexOperators.not + '\\\\left(${args[0]}\\\\right)'\n },\n or: {\n 2: \"\\\\left(${args[0]}\".concat(latexOperators.or, \"${args[1]}\\\\right)\")\n },\n xor: {\n 2: \"\\\\left(${args[0]}\".concat(latexOperators.xor, \"${args[1]}\\\\right)\")\n },\n // matrix\n cross: {\n 2: '\\\\left(${args[0]}\\\\right)\\\\times\\\\left(${args[1]}\\\\right)'\n },\n ctranspose: {\n 1: \"\\\\left(${args[0]}\\\\right)\".concat(latexOperators.ctranspose)\n },\n det: {\n 1: '\\\\det\\\\left(${args[0]}\\\\right)'\n },\n dot: {\n 2: '\\\\left(${args[0]}\\\\cdot${args[1]}\\\\right)'\n },\n expm: {\n 1: '\\\\exp\\\\left(${args[0]}\\\\right)'\n },\n inv: {\n 1: '\\\\left(${args[0]}\\\\right)^{-1}'\n },\n pinv: {\n 1: '\\\\left(${args[0]}\\\\right)^{+}'\n },\n sqrtm: {\n 1: \"{${args[0]}}\".concat(latexOperators.pow, \"{\\\\frac{1}{2}}\")\n },\n trace: {\n 1: '\\\\mathrm{tr}\\\\left(${args[0]}\\\\right)'\n },\n transpose: {\n 1: \"\\\\left(${args[0]}\\\\right)\".concat(latexOperators.transpose)\n },\n // probability\n combinations: {\n 2: '\\\\binom{${args[0]}}{${args[1]}}'\n },\n combinationsWithRep: {\n 2: '\\\\left(\\\\!\\\\!{\\\\binom{${args[0]}}{${args[1]}}}\\\\!\\\\!\\\\right)'\n },\n factorial: {\n 1: \"\\\\left(${args[0]}\\\\right)\".concat(latexOperators.factorial)\n },\n gamma: {\n 1: '\\\\Gamma\\\\left(${args[0]}\\\\right)'\n },\n lgamma: {\n 1: '\\\\ln\\\\Gamma\\\\left(${args[0]}\\\\right)'\n },\n // relational\n equal: {\n 2: \"\\\\left(${args[0]}\".concat(latexOperators.equal, \"${args[1]}\\\\right)\")\n },\n larger: {\n 2: \"\\\\left(${args[0]}\".concat(latexOperators.larger, \"${args[1]}\\\\right)\")\n },\n largerEq: {\n 2: \"\\\\left(${args[0]}\".concat(latexOperators.largerEq, \"${args[1]}\\\\right)\")\n },\n smaller: {\n 2: \"\\\\left(${args[0]}\".concat(latexOperators.smaller, \"${args[1]}\\\\right)\")\n },\n smallerEq: {\n 2: \"\\\\left(${args[0]}\".concat(latexOperators.smallerEq, \"${args[1]}\\\\right)\")\n },\n unequal: {\n 2: \"\\\\left(${args[0]}\".concat(latexOperators.unequal, \"${args[1]}\\\\right)\")\n },\n // special\n erf: {\n 1: 'erf\\\\left(${args[0]}\\\\right)'\n },\n // statistics\n max: '\\\\max\\\\left(${args}\\\\right)',\n min: '\\\\min\\\\left(${args}\\\\right)',\n variance: '\\\\mathrm{Var}\\\\left(${args}\\\\right)',\n // trigonometry\n acos: {\n 1: '\\\\cos^{-1}\\\\left(${args[0]}\\\\right)'\n },\n acosh: {\n 1: '\\\\cosh^{-1}\\\\left(${args[0]}\\\\right)'\n },\n acot: {\n 1: '\\\\cot^{-1}\\\\left(${args[0]}\\\\right)'\n },\n acoth: {\n 1: '\\\\coth^{-1}\\\\left(${args[0]}\\\\right)'\n },\n acsc: {\n 1: '\\\\csc^{-1}\\\\left(${args[0]}\\\\right)'\n },\n acsch: {\n 1: '\\\\mathrm{csch}^{-1}\\\\left(${args[0]}\\\\right)'\n },\n asec: {\n 1: '\\\\sec^{-1}\\\\left(${args[0]}\\\\right)'\n },\n asech: {\n 1: '\\\\mathrm{sech}^{-1}\\\\left(${args[0]}\\\\right)'\n },\n asin: {\n 1: '\\\\sin^{-1}\\\\left(${args[0]}\\\\right)'\n },\n asinh: {\n 1: '\\\\sinh^{-1}\\\\left(${args[0]}\\\\right)'\n },\n atan: {\n 1: '\\\\tan^{-1}\\\\left(${args[0]}\\\\right)'\n },\n atan2: {\n 2: '\\\\mathrm{atan2}\\\\left(${args}\\\\right)'\n },\n atanh: {\n 1: '\\\\tanh^{-1}\\\\left(${args[0]}\\\\right)'\n },\n cos: {\n 1: '\\\\cos\\\\left(${args[0]}\\\\right)'\n },\n cosh: {\n 1: '\\\\cosh\\\\left(${args[0]}\\\\right)'\n },\n cot: {\n 1: '\\\\cot\\\\left(${args[0]}\\\\right)'\n },\n coth: {\n 1: '\\\\coth\\\\left(${args[0]}\\\\right)'\n },\n csc: {\n 1: '\\\\csc\\\\left(${args[0]}\\\\right)'\n },\n csch: {\n 1: '\\\\mathrm{csch}\\\\left(${args[0]}\\\\right)'\n },\n sec: {\n 1: '\\\\sec\\\\left(${args[0]}\\\\right)'\n },\n sech: {\n 1: '\\\\mathrm{sech}\\\\left(${args[0]}\\\\right)'\n },\n sin: {\n 1: '\\\\sin\\\\left(${args[0]}\\\\right)'\n },\n sinh: {\n 1: '\\\\sinh\\\\left(${args[0]}\\\\right)'\n },\n tan: {\n 1: '\\\\tan\\\\left(${args[0]}\\\\right)'\n },\n tanh: {\n 1: '\\\\tanh\\\\left(${args[0]}\\\\right)'\n },\n // unit\n to: {\n 2: \"\\\\left(${args[0]}\".concat(latexOperators.to, \"${args[1]}\\\\right)\")\n },\n // utils\n numeric: function numeric(node, options) {\n // Not sure if this is strictly right but should work correctly for the vast majority of use cases.\n return node.args[0].toTex();\n },\n // type\n number: {\n 0: '0',\n 1: '\\\\left(${args[0]}\\\\right)',\n 2: '\\\\left(\\\\left(${args[0]}\\\\right)${args[1]}\\\\right)'\n },\n string: {\n 0: '\\\\mathtt{\"\"}',\n 1: '\\\\mathrm{string}\\\\left(${args[0]}\\\\right)'\n },\n bignumber: {\n 0: '0',\n 1: '\\\\left(${args[0]}\\\\right)'\n },\n complex: {\n 0: '0',\n 1: '\\\\left(${args[0]}\\\\right)',\n 2: \"\\\\left(\\\\left(${args[0]}\\\\right)+\".concat(latexSymbols.i, \"\\\\cdot\\\\left(${args[1]}\\\\right)\\\\right)\")\n },\n matrix: {\n 0: '\\\\begin{bmatrix}\\\\end{bmatrix}',\n 1: '\\\\left(${args[0]}\\\\right)',\n 2: '\\\\left(${args[0]}\\\\right)'\n },\n sparse: {\n 0: '\\\\begin{bsparse}\\\\end{bsparse}',\n 1: '\\\\left(${args[0]}\\\\right)'\n },\n unit: {\n 1: '\\\\left(${args[0]}\\\\right)',\n 2: '\\\\left(\\\\left(${args[0]}\\\\right)${args[1]}\\\\right)'\n }\n};\nexport var defaultTemplate = '\\\\mathrm{${name}}\\\\left(${args}\\\\right)';\nvar latexUnits = {\n deg: '^\\\\circ'\n};\nexport function escapeLatex(string) {\n return escapeLatexLib(string, {\n preserveFormatting: true\n });\n}\n\n// @param {string} name\n// @param {boolean} isUnit\nexport function toSymbol(name, isUnit) {\n isUnit = typeof isUnit === 'undefined' ? false : isUnit;\n if (isUnit) {\n if (hasOwnProperty(latexUnits, name)) {\n return latexUnits[name];\n }\n return '\\\\mathrm{' + escapeLatex(name) + '}';\n }\n if (hasOwnProperty(latexSymbols, name)) {\n return latexSymbols[name];\n }\n return escapeLatex(name);\n}","import _defineProperty from \"@babel/runtime/helpers/defineProperty\";\nimport { format } from '../../utils/string.js';\nimport { typeOf } from '../../utils/is.js';\nimport { escapeLatex } from '../../utils/latex.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'ConstantNode';\nvar dependencies = ['Node'];\nexport var createConstantNode = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n Node\n } = _ref;\n class ConstantNode extends Node {\n /**\n * A ConstantNode holds a constant value like a number or string.\n *\n * Usage:\n *\n * new ConstantNode(2.3)\n * new ConstantNode('hello')\n *\n * @param {*} value Value can be any type (number, BigNumber, string, ...)\n * @constructor ConstantNode\n * @extends {Node}\n */\n constructor(value) {\n super();\n this.value = value;\n }\n get type() {\n return name;\n }\n get isConstantNode() {\n return true;\n }\n\n /**\n * Compile a node into a JavaScript function.\n * This basically pre-calculates as much as possible and only leaves open\n * calculations which depend on a dynamic scope with variables.\n * @param {Object} math Math.js namespace with functions and constants.\n * @param {Object} argNames An object with argument names as key and `true`\n * as value. Used in the SymbolNode to optimize\n * for arguments from user assigned functions\n * (see FunctionAssignmentNode) or special symbols\n * like `end` (see IndexNode).\n * @return {function} Returns a function which can be called like:\n * evalNode(scope: Object, args: Object, context: *)\n */\n _compile(math, argNames) {\n var value = this.value;\n return function evalConstantNode() {\n return value;\n };\n }\n\n /**\n * Execute a callback for each of the child nodes of this node\n * @param {function(child: Node, path: string, parent: Node)} callback\n */\n forEach(callback) {\n // nothing to do, we don't have any children\n }\n\n /**\n * Create a new ConstantNode with children produced by the given callback.\n * Trivial because there are no children.\n * @param {function(child: Node, path: string, parent: Node) : Node} callback\n * @returns {ConstantNode} Returns a clone of the node\n */\n map(callback) {\n return this.clone();\n }\n\n /**\n * Create a clone of this node, a shallow copy\n * @return {ConstantNode}\n */\n clone() {\n return new ConstantNode(this.value);\n }\n\n /**\n * Get string representation\n * @param {Object} options\n * @return {string} str\n */\n _toString(options) {\n return format(this.value, options);\n }\n\n /**\n * Get HTML representation\n * @param {Object} options\n * @return {string} str\n */\n toHTML(options) {\n var value = this._toString(options);\n switch (typeOf(this.value)) {\n case 'number':\n case 'BigNumber':\n case 'Fraction':\n return '' + value + '';\n case 'string':\n return '' + value + '';\n case 'boolean':\n return '' + value + '';\n case 'null':\n return '' + value + '';\n case 'undefined':\n return '' + value + '';\n default:\n return '' + value + '';\n }\n }\n\n /**\n * Get a JSON representation of the node\n * @returns {Object}\n */\n toJSON() {\n return {\n mathjs: name,\n value: this.value\n };\n }\n\n /**\n * Instantiate a ConstantNode from its JSON representation\n * @param {Object} json An object structured like\n * `{\"mathjs\": \"SymbolNode\", value: 2.3}`,\n * where mathjs is optional\n * @returns {ConstantNode}\n */\n static fromJSON(json) {\n return new ConstantNode(json.value);\n }\n\n /**\n * Get LaTeX representation\n * @param {Object} options\n * @return {string} str\n */\n _toTex(options) {\n var value = this._toString(options);\n switch (typeOf(this.value)) {\n case 'string':\n return '\\\\mathtt{' + escapeLatex(value) + '}';\n case 'number':\n case 'BigNumber':\n {\n if (!isFinite(this.value)) {\n return this.value.valueOf() < 0 ? '-\\\\infty' : '\\\\infty';\n }\n var index = value.toLowerCase().indexOf('e');\n if (index !== -1) {\n return value.substring(0, index) + '\\\\cdot10^{' + value.substring(index + 1) + '}';\n }\n }\n return value;\n case 'Fraction':\n return this.value.toLatex();\n default:\n return value;\n }\n }\n }\n _defineProperty(ConstantNode, \"name\", name);\n return ConstantNode;\n}, {\n isClass: true,\n isNode: true\n});","import _defineProperty from \"@babel/runtime/helpers/defineProperty\";\nimport { isNode } from '../../utils/is.js';\nimport { keywords } from '../keywords.js';\nimport { escape } from '../../utils/string.js';\nimport { forEach, join } from '../../utils/array.js';\nimport { toSymbol } from '../../utils/latex.js';\nimport { getPrecedence } from '../operators.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'FunctionAssignmentNode';\nvar dependencies = ['typed', 'Node'];\nexport var createFunctionAssignmentNode = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n Node\n } = _ref;\n /**\n * Is parenthesis needed?\n * @param {Node} node\n * @param {Object} parenthesis\n * @param {string} implicit\n * @private\n */\n function needParenthesis(node, parenthesis, implicit) {\n var precedence = getPrecedence(node, parenthesis, implicit);\n var exprPrecedence = getPrecedence(node.expr, parenthesis, implicit);\n return parenthesis === 'all' || exprPrecedence !== null && exprPrecedence <= precedence;\n }\n class FunctionAssignmentNode extends Node {\n /**\n * @constructor FunctionAssignmentNode\n * @extends {Node}\n * Function assignment\n *\n * @param {string} name Function name\n * @param {string[] | Array.<{name: string, type: string}>} params\n * Array with function parameter names, or an\n * array with objects containing the name\n * and type of the parameter\n * @param {Node} expr The function expression\n */\n constructor(name, params, expr) {\n super();\n // validate input\n if (typeof name !== 'string') {\n throw new TypeError('String expected for parameter \"name\"');\n }\n if (!Array.isArray(params)) {\n throw new TypeError('Array containing strings or objects expected for parameter \"params\"');\n }\n if (!isNode(expr)) {\n throw new TypeError('Node expected for parameter \"expr\"');\n }\n if (keywords.has(name)) {\n throw new Error('Illegal function name, \"' + name + '\" is a reserved keyword');\n }\n var paramNames = new Set();\n for (var param of params) {\n var _name = typeof param === 'string' ? param : param.name;\n if (paramNames.has(_name)) {\n throw new Error(\"Duplicate parameter name \\\"\".concat(_name, \"\\\"\"));\n } else {\n paramNames.add(_name);\n }\n }\n this.name = name;\n this.params = params.map(function (param) {\n return param && param.name || param;\n });\n this.types = params.map(function (param) {\n return param && param.type || 'any';\n });\n this.expr = expr;\n }\n get type() {\n return name;\n }\n get isFunctionAssignmentNode() {\n return true;\n }\n\n /**\n * Compile a node into a JavaScript function.\n * This basically pre-calculates as much as possible and only leaves open\n * calculations which depend on a dynamic scope with variables.\n * @param {Object} math Math.js namespace with functions and constants.\n * @param {Object} argNames An object with argument names as key and `true`\n * as value. Used in the SymbolNode to optimize\n * for arguments from user assigned functions\n * (see FunctionAssignmentNode) or special symbols\n * like `end` (see IndexNode).\n * @return {function} Returns a function which can be called like:\n * evalNode(scope: Object, args: Object, context: *)\n */\n _compile(math, argNames) {\n var childArgNames = Object.create(argNames);\n forEach(this.params, function (param) {\n childArgNames[param] = true;\n });\n\n // compile the function expression with the child args\n var evalExpr = this.expr._compile(math, childArgNames);\n var name = this.name;\n var params = this.params;\n var signature = join(this.types, ',');\n var syntax = name + '(' + join(this.params, ', ') + ')';\n return function evalFunctionAssignmentNode(scope, args, context) {\n var signatures = {};\n signatures[signature] = function () {\n var childArgs = Object.create(args);\n for (var i = 0; i < params.length; i++) {\n childArgs[params[i]] = arguments[i];\n }\n return evalExpr(scope, childArgs, context);\n };\n var fn = typed(name, signatures);\n fn.syntax = syntax;\n scope.set(name, fn);\n return fn;\n };\n }\n\n /**\n * Execute a callback for each of the child nodes of this node\n * @param {function(child: Node, path: string, parent: Node)} callback\n */\n forEach(callback) {\n callback(this.expr, 'expr', this);\n }\n\n /**\n * Create a new FunctionAssignmentNode whose children are the results of\n * calling the provided callback function for each child of the original\n * node.\n * @param {function(child: Node, path: string, parent: Node): Node} callback\n * @returns {FunctionAssignmentNode} Returns a transformed copy of the node\n */\n map(callback) {\n var expr = this._ifNode(callback(this.expr, 'expr', this));\n return new FunctionAssignmentNode(this.name, this.params.slice(0), expr);\n }\n\n /**\n * Create a clone of this node, a shallow copy\n * @return {FunctionAssignmentNode}\n */\n clone() {\n return new FunctionAssignmentNode(this.name, this.params.slice(0), this.expr);\n }\n\n /**\n * get string representation\n * @param {Object} options\n * @return {string} str\n */\n _toString(options) {\n var parenthesis = options && options.parenthesis ? options.parenthesis : 'keep';\n var expr = this.expr.toString(options);\n if (needParenthesis(this, parenthesis, options && options.implicit)) {\n expr = '(' + expr + ')';\n }\n return this.name + '(' + this.params.join(', ') + ') = ' + expr;\n }\n\n /**\n * Get a JSON representation of the node\n * @returns {Object}\n */\n toJSON() {\n var types = this.types;\n return {\n mathjs: name,\n name: this.name,\n params: this.params.map(function (param, index) {\n return {\n name: param,\n type: types[index]\n };\n }),\n expr: this.expr\n };\n }\n\n /**\n * Instantiate an FunctionAssignmentNode from its JSON representation\n * @param {Object} json\n * An object structured like\n * ```\n * {\"mathjs\": \"FunctionAssignmentNode\",\n * name: ..., params: ..., expr: ...}\n * ```\n * where mathjs is optional\n * @returns {FunctionAssignmentNode}\n */\n static fromJSON(json) {\n return new FunctionAssignmentNode(json.name, json.params, json.expr);\n }\n\n /**\n * get HTML representation\n * @param {Object} options\n * @return {string} str\n */\n toHTML(options) {\n var parenthesis = options && options.parenthesis ? options.parenthesis : 'keep';\n var params = [];\n for (var i = 0; i < this.params.length; i++) {\n params.push('' + escape(this.params[i]) + '');\n }\n var expr = this.expr.toHTML(options);\n if (needParenthesis(this, parenthesis, options && options.implicit)) {\n expr = '(' + expr + ')';\n }\n return '' + escape(this.name) + '' + '(' + params.join(',') + ')' + '=' + expr;\n }\n\n /**\n * get LaTeX representation\n * @param {Object} options\n * @return {string} str\n */\n _toTex(options) {\n var parenthesis = options && options.parenthesis ? options.parenthesis : 'keep';\n var expr = this.expr.toTex(options);\n if (needParenthesis(this, parenthesis, options && options.implicit)) {\n expr = \"\\\\left(\".concat(expr, \"\\\\right)\");\n }\n return '\\\\mathrm{' + this.name + '}\\\\left(' + this.params.map(toSymbol).join(',') + '\\\\right):=' + expr;\n }\n }\n _defineProperty(FunctionAssignmentNode, \"name\", name);\n return FunctionAssignmentNode;\n}, {\n isClass: true,\n isNode: true\n});","import _defineProperty from \"@babel/runtime/helpers/defineProperty\";\nimport { map } from '../../utils/array.js';\nimport { getSafeProperty } from '../../utils/customs.js';\nimport { factory } from '../../utils/factory.js';\nimport { isArray, isConstantNode, isMatrix, isNode, isString, typeOf } from '../../utils/is.js';\nimport { escape } from '../../utils/string.js';\nvar name = 'IndexNode';\nvar dependencies = ['Node', 'size'];\nexport var createIndexNode = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n Node,\n size\n } = _ref;\n class IndexNode extends Node {\n /**\n * @constructor IndexNode\n * @extends Node\n *\n * Describes a subset of a matrix or an object property.\n * Cannot be used on its own, needs to be used within an AccessorNode or\n * AssignmentNode.\n *\n * @param {Node[]} dimensions\n * @param {boolean} [dotNotation=false]\n * Optional property describing whether this index was written using dot\n * notation like `a.b`, or using bracket notation like `a[\"b\"]`\n * (which is the default). This property is used for string conversion.\n */\n constructor(dimensions, dotNotation) {\n super();\n this.dimensions = dimensions;\n this.dotNotation = dotNotation || false;\n\n // validate input\n if (!Array.isArray(dimensions) || !dimensions.every(isNode)) {\n throw new TypeError('Array containing Nodes expected for parameter \"dimensions\"');\n }\n if (this.dotNotation && !this.isObjectProperty()) {\n throw new Error('dotNotation only applicable for object properties');\n }\n }\n get type() {\n return name;\n }\n get isIndexNode() {\n return true;\n }\n\n /**\n * Compile a node into a JavaScript function.\n * This basically pre-calculates as much as possible and only leaves open\n * calculations which depend on a dynamic scope with variables.\n * @param {Object} math Math.js namespace with functions and constants.\n * @param {Object} argNames An object with argument names as key and `true`\n * as value. Used in the SymbolNode to optimize\n * for arguments from user assigned functions\n * (see FunctionAssignmentNode) or special symbols\n * like `end` (see IndexNode).\n * @return {function} Returns a function which can be called like:\n * evalNode(scope: Object, args: Object, context: *)\n */\n _compile(math, argNames) {\n // TODO: implement support for bignumber (currently bignumbers are silently\n // reduced to numbers when changing the value to zero-based)\n\n // TODO: Optimization: when the range values are ConstantNodes,\n // we can beforehand resolve the zero-based value\n\n // optimization for a simple object property\n var evalDimensions = map(this.dimensions, function (dimension, i) {\n var needsEnd = dimension.filter(node => node.isSymbolNode && node.name === 'end').length > 0;\n if (needsEnd) {\n // SymbolNode 'end' is used inside the index,\n // like in `A[end]` or `A[end - 2]`\n var childArgNames = Object.create(argNames);\n childArgNames.end = true;\n var _evalDimension = dimension._compile(math, childArgNames);\n return function evalDimension(scope, args, context) {\n if (!isMatrix(context) && !isArray(context) && !isString(context)) {\n throw new TypeError('Cannot resolve \"end\": ' + 'context must be a Matrix, Array, or string but is ' + typeOf(context));\n }\n var s = size(context).valueOf();\n var childArgs = Object.create(args);\n childArgs.end = s[i];\n return _evalDimension(scope, childArgs, context);\n };\n } else {\n // SymbolNode `end` not used\n return dimension._compile(math, argNames);\n }\n });\n var index = getSafeProperty(math, 'index');\n return function evalIndexNode(scope, args, context) {\n var dimensions = map(evalDimensions, function (evalDimension) {\n return evalDimension(scope, args, context);\n });\n return index(...dimensions);\n };\n }\n\n /**\n * Execute a callback for each of the child nodes of this node\n * @param {function(child: Node, path: string, parent: Node)} callback\n */\n forEach(callback) {\n for (var i = 0; i < this.dimensions.length; i++) {\n callback(this.dimensions[i], 'dimensions[' + i + ']', this);\n }\n }\n\n /**\n * Create a new IndexNode whose children are the results of calling\n * the provided callback function for each child of the original node.\n * @param {function(child: Node, path: string, parent: Node): Node} callback\n * @returns {IndexNode} Returns a transformed copy of the node\n */\n map(callback) {\n var dimensions = [];\n for (var i = 0; i < this.dimensions.length; i++) {\n dimensions[i] = this._ifNode(callback(this.dimensions[i], 'dimensions[' + i + ']', this));\n }\n return new IndexNode(dimensions, this.dotNotation);\n }\n\n /**\n * Create a clone of this node, a shallow copy\n * @return {IndexNode}\n */\n clone() {\n return new IndexNode(this.dimensions.slice(0), this.dotNotation);\n }\n\n /**\n * Test whether this IndexNode contains a single property name\n * @return {boolean}\n */\n isObjectProperty() {\n return this.dimensions.length === 1 && isConstantNode(this.dimensions[0]) && typeof this.dimensions[0].value === 'string';\n }\n\n /**\n * Returns the property name if IndexNode contains a property.\n * If not, returns null.\n * @return {string | null}\n */\n getObjectProperty() {\n return this.isObjectProperty() ? this.dimensions[0].value : null;\n }\n\n /**\n * Get string representation\n * @param {Object} options\n * @return {string} str\n */\n _toString(options) {\n // format the parameters like \"[1, 0:5]\"\n return this.dotNotation ? '.' + this.getObjectProperty() : '[' + this.dimensions.join(', ') + ']';\n }\n\n /**\n * Get a JSON representation of the node\n * @returns {Object}\n */\n toJSON() {\n return {\n mathjs: name,\n dimensions: this.dimensions,\n dotNotation: this.dotNotation\n };\n }\n\n /**\n * Instantiate an IndexNode from its JSON representation\n * @param {Object} json\n * An object structured like\n * `{\"mathjs\": \"IndexNode\", dimensions: [...], dotNotation: false}`,\n * where mathjs is optional\n * @returns {IndexNode}\n */\n static fromJSON(json) {\n return new IndexNode(json.dimensions, json.dotNotation);\n }\n\n /**\n * Get HTML representation\n * @param {Object} options\n * @return {string} str\n */\n toHTML(options) {\n // format the parameters like \"[1, 0:5]\"\n var dimensions = [];\n for (var i = 0; i < this.dimensions.length; i++) {\n dimensions[i] = this.dimensions[i].toHTML();\n }\n if (this.dotNotation) {\n return '.' + '' + escape(this.getObjectProperty()) + '';\n } else {\n return '[' + dimensions.join(',') + ']';\n }\n }\n\n /**\n * Get LaTeX representation\n * @param {Object} options\n * @return {string} str\n */\n _toTex(options) {\n var dimensions = this.dimensions.map(function (range) {\n return range.toTex(options);\n });\n return this.dotNotation ? '.' + this.getObjectProperty() + '' : '_{' + dimensions.join(',') + '}';\n }\n }\n _defineProperty(IndexNode, \"name\", name);\n return IndexNode;\n}, {\n isClass: true,\n isNode: true\n});","import _defineProperty from \"@babel/runtime/helpers/defineProperty\";\nimport { getSafeProperty } from '../../utils/customs.js';\nimport { factory } from '../../utils/factory.js';\nimport { isNode } from '../../utils/is.js';\nimport { hasOwnProperty } from '../../utils/object.js';\nimport { escape, stringify } from '../../utils/string.js';\nvar name = 'ObjectNode';\nvar dependencies = ['Node'];\nexport var createObjectNode = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n Node\n } = _ref;\n class ObjectNode extends Node {\n /**\n * @constructor ObjectNode\n * @extends {Node}\n * Holds an object with keys/values\n * @param {Object.} [properties] object with key/value pairs\n */\n constructor(properties) {\n super();\n this.properties = properties || {};\n\n // validate input\n if (properties) {\n if (!(typeof properties === 'object') || !Object.keys(properties).every(function (key) {\n return isNode(properties[key]);\n })) {\n throw new TypeError('Object containing Nodes expected');\n }\n }\n }\n get type() {\n return name;\n }\n get isObjectNode() {\n return true;\n }\n\n /**\n * Compile a node into a JavaScript function.\n * This basically pre-calculates as much as possible and only leaves open\n * calculations which depend on a dynamic scope with variables.\n * @param {Object} math Math.js namespace with functions and constants.\n * @param {Object} argNames An object with argument names as key and `true`\n * as value. Used in the SymbolNode to optimize\n * for arguments from user assigned functions\n * (see FunctionAssignmentNode) or special symbols\n * like `end` (see IndexNode).\n * @return {function} Returns a function which can be called like:\n * evalNode(scope: Object, args: Object, context: *)\n */\n _compile(math, argNames) {\n var evalEntries = {};\n for (var key in this.properties) {\n if (hasOwnProperty(this.properties, key)) {\n // we stringify/parse the key here to resolve unicode characters,\n // so you cannot create a key like {\"co\\\\u006Estructor\": null}\n var stringifiedKey = stringify(key);\n var parsedKey = JSON.parse(stringifiedKey);\n var prop = getSafeProperty(this.properties, key);\n evalEntries[parsedKey] = prop._compile(math, argNames);\n }\n }\n return function evalObjectNode(scope, args, context) {\n var obj = {};\n for (var _key in evalEntries) {\n if (hasOwnProperty(evalEntries, _key)) {\n obj[_key] = evalEntries[_key](scope, args, context);\n }\n }\n return obj;\n };\n }\n\n /**\n * Execute a callback for each of the child nodes of this node\n * @param {function(child: Node, path: string, parent: Node)} callback\n */\n forEach(callback) {\n for (var key in this.properties) {\n if (hasOwnProperty(this.properties, key)) {\n callback(this.properties[key], 'properties[' + stringify(key) + ']', this);\n }\n }\n }\n\n /**\n * Create a new ObjectNode whose children are the results of calling\n * the provided callback function for each child of the original node.\n * @param {function(child: Node, path: string, parent: Node): Node} callback\n * @returns {ObjectNode} Returns a transformed copy of the node\n */\n map(callback) {\n var properties = {};\n for (var key in this.properties) {\n if (hasOwnProperty(this.properties, key)) {\n properties[key] = this._ifNode(callback(this.properties[key], 'properties[' + stringify(key) + ']', this));\n }\n }\n return new ObjectNode(properties);\n }\n\n /**\n * Create a clone of this node, a shallow copy\n * @return {ObjectNode}\n */\n clone() {\n var properties = {};\n for (var key in this.properties) {\n if (hasOwnProperty(this.properties, key)) {\n properties[key] = this.properties[key];\n }\n }\n return new ObjectNode(properties);\n }\n\n /**\n * Get string representation\n * @param {Object} options\n * @return {string} str\n * @override\n */\n _toString(options) {\n var entries = [];\n for (var key in this.properties) {\n if (hasOwnProperty(this.properties, key)) {\n entries.push(stringify(key) + ': ' + this.properties[key].toString(options));\n }\n }\n return '{' + entries.join(', ') + '}';\n }\n\n /**\n * Get a JSON representation of the node\n * @returns {Object}\n */\n toJSON() {\n return {\n mathjs: name,\n properties: this.properties\n };\n }\n\n /**\n * Instantiate an OperatorNode from its JSON representation\n * @param {Object} json An object structured like\n * `{\"mathjs\": \"ObjectNode\", \"properties\": {...}}`,\n * where mathjs is optional\n * @returns {ObjectNode}\n */\n static fromJSON(json) {\n return new ObjectNode(json.properties);\n }\n\n /**\n * Get HTML representation\n * @param {Object} options\n * @return {string} str\n * @override\n */\n toHTML(options) {\n var entries = [];\n for (var key in this.properties) {\n if (hasOwnProperty(this.properties, key)) {\n entries.push('' + escape(key) + '' + '' + ':' + this.properties[key].toHTML(options));\n }\n }\n return '{' + entries.join(',') + '}';\n }\n\n /**\n * Get LaTeX representation\n * @param {Object} options\n * @return {string} str\n */\n _toTex(options) {\n var entries = [];\n for (var key in this.properties) {\n if (hasOwnProperty(this.properties, key)) {\n entries.push('\\\\mathbf{' + key + ':} & ' + this.properties[key].toTex(options) + '\\\\\\\\');\n }\n }\n var tex = '\\\\left\\\\{\\\\begin{array}{ll}' + entries.join('\\n') + '\\\\end{array}\\\\right\\\\}';\n return tex;\n }\n }\n _defineProperty(ObjectNode, \"name\", name);\n return ObjectNode;\n}, {\n isClass: true,\n isNode: true\n});","import _defineProperty from \"@babel/runtime/helpers/defineProperty\";\nimport { isNode, isConstantNode, isOperatorNode, isParenthesisNode } from '../../utils/is.js';\nimport { map } from '../../utils/array.js';\nimport { escape } from '../../utils/string.js';\nimport { getSafeProperty, isSafeMethod } from '../../utils/customs.js';\nimport { getAssociativity, getPrecedence, isAssociativeWith, properties } from '../operators.js';\nimport { latexOperators } from '../../utils/latex.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'OperatorNode';\nvar dependencies = ['Node'];\nexport var createOperatorNode = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n Node\n } = _ref;\n /**\n * Returns true if the expression starts with a constant, under\n * the current parenthesization:\n * @param {Node} expression\n * @param {string} parenthesis\n * @return {boolean}\n */\n function startsWithConstant(expr, parenthesis) {\n var curNode = expr;\n if (parenthesis === 'auto') {\n while (isParenthesisNode(curNode)) curNode = curNode.content;\n }\n if (isConstantNode(curNode)) return true;\n if (isOperatorNode(curNode)) {\n return startsWithConstant(curNode.args[0], parenthesis);\n }\n return false;\n }\n\n /**\n * Calculate which parentheses are necessary. Gets an OperatorNode\n * (which is the root of the tree) and an Array of Nodes\n * (this.args) and returns an array where 'true' means that an argument\n * has to be enclosed in parentheses whereas 'false' means the opposite.\n *\n * @param {OperatorNode} root\n * @param {string} parenthesis\n * @param {Node[]} args\n * @param {boolean} latex\n * @return {boolean[]}\n * @private\n */\n function calculateNecessaryParentheses(root, parenthesis, implicit, args, latex) {\n // precedence of the root OperatorNode\n var precedence = getPrecedence(root, parenthesis, implicit);\n var associativity = getAssociativity(root, parenthesis);\n if (parenthesis === 'all' || args.length > 2 && root.getIdentifier() !== 'OperatorNode:add' && root.getIdentifier() !== 'OperatorNode:multiply') {\n return args.map(function (arg) {\n switch (arg.getContent().type) {\n // Nodes that don't need extra parentheses\n case 'ArrayNode':\n case 'ConstantNode':\n case 'SymbolNode':\n case 'ParenthesisNode':\n return false;\n default:\n return true;\n }\n });\n }\n var result;\n switch (args.length) {\n case 0:\n result = [];\n break;\n case 1:\n // unary operators\n {\n // precedence of the operand\n var operandPrecedence = getPrecedence(args[0], parenthesis, implicit, root);\n\n // handle special cases for LaTeX, where some of the parentheses aren't needed\n if (latex && operandPrecedence !== null) {\n var operandIdentifier;\n var rootIdentifier;\n if (parenthesis === 'keep') {\n operandIdentifier = args[0].getIdentifier();\n rootIdentifier = root.getIdentifier();\n } else {\n // Ignore Parenthesis Nodes when not in 'keep' mode\n operandIdentifier = args[0].getContent().getIdentifier();\n rootIdentifier = root.getContent().getIdentifier();\n }\n if (properties[precedence][rootIdentifier].latexLeftParens === false) {\n result = [false];\n break;\n }\n if (properties[operandPrecedence][operandIdentifier].latexParens === false) {\n result = [false];\n break;\n }\n }\n if (operandPrecedence === null) {\n // if the operand has no defined precedence, no parens are needed\n result = [false];\n break;\n }\n if (operandPrecedence <= precedence) {\n // if the operands precedence is lower, parens are needed\n result = [true];\n break;\n }\n\n // otherwise, no parens needed\n result = [false];\n }\n break;\n case 2:\n // binary operators\n {\n var lhsParens; // left hand side needs parenthesis?\n // precedence of the left hand side\n var lhsPrecedence = getPrecedence(args[0], parenthesis, implicit, root);\n // is the root node associative with the left hand side\n var assocWithLhs = isAssociativeWith(root, args[0], parenthesis);\n if (lhsPrecedence === null) {\n // if the left hand side has no defined precedence, no parens are needed\n // FunctionNode for example\n lhsParens = false;\n } else if (lhsPrecedence === precedence && associativity === 'right' && !assocWithLhs) {\n // In case of equal precedence, if the root node is left associative\n // parens are **never** necessary for the left hand side.\n // If it is right associative however, parens are necessary\n // if the root node isn't associative with the left hand side\n lhsParens = true;\n } else if (lhsPrecedence < precedence) {\n lhsParens = true;\n } else {\n lhsParens = false;\n }\n var rhsParens; // right hand side needs parenthesis?\n // precedence of the right hand side\n var rhsPrecedence = getPrecedence(args[1], parenthesis, implicit, root);\n // is the root node associative with the right hand side?\n var assocWithRhs = isAssociativeWith(root, args[1], parenthesis);\n if (rhsPrecedence === null) {\n // if the right hand side has no defined precedence, no parens are needed\n // FunctionNode for example\n rhsParens = false;\n } else if (rhsPrecedence === precedence && associativity === 'left' && !assocWithRhs) {\n // In case of equal precedence, if the root node is right associative\n // parens are **never** necessary for the right hand side.\n // If it is left associative however, parens are necessary\n // if the root node isn't associative with the right hand side\n rhsParens = true;\n } else if (rhsPrecedence < precedence) {\n rhsParens = true;\n } else {\n rhsParens = false;\n }\n\n // handle special cases for LaTeX, where some of the parentheses aren't needed\n if (latex) {\n var _rootIdentifier;\n var lhsIdentifier;\n var rhsIdentifier;\n if (parenthesis === 'keep') {\n _rootIdentifier = root.getIdentifier();\n lhsIdentifier = root.args[0].getIdentifier();\n rhsIdentifier = root.args[1].getIdentifier();\n } else {\n // Ignore ParenthesisNodes when not in 'keep' mode\n _rootIdentifier = root.getContent().getIdentifier();\n lhsIdentifier = root.args[0].getContent().getIdentifier();\n rhsIdentifier = root.args[1].getContent().getIdentifier();\n }\n if (lhsPrecedence !== null) {\n if (properties[precedence][_rootIdentifier].latexLeftParens === false) {\n lhsParens = false;\n }\n if (properties[lhsPrecedence][lhsIdentifier].latexParens === false) {\n lhsParens = false;\n }\n }\n if (rhsPrecedence !== null) {\n if (properties[precedence][_rootIdentifier].latexRightParens === false) {\n rhsParens = false;\n }\n if (properties[rhsPrecedence][rhsIdentifier].latexParens === false) {\n rhsParens = false;\n }\n }\n }\n result = [lhsParens, rhsParens];\n }\n break;\n default:\n if (root.getIdentifier() === 'OperatorNode:add' || root.getIdentifier() === 'OperatorNode:multiply') {\n result = args.map(function (arg) {\n var argPrecedence = getPrecedence(arg, parenthesis, implicit, root);\n var assocWithArg = isAssociativeWith(root, arg, parenthesis);\n var argAssociativity = getAssociativity(arg, parenthesis);\n if (argPrecedence === null) {\n // if the argument has no defined precedence, no parens are needed\n return false;\n } else if (precedence === argPrecedence && associativity === argAssociativity && !assocWithArg) {\n return true;\n } else if (argPrecedence < precedence) {\n return true;\n }\n return false;\n });\n }\n break;\n }\n\n // Handles an edge case of parentheses with implicit multiplication\n // of ConstantNode.\n // In that case, parenthesize ConstantNodes that follow an unparenthesized\n // expression, even though they normally wouldn't be printed.\n if (args.length >= 2 && root.getIdentifier() === 'OperatorNode:multiply' && root.implicit && parenthesis !== 'all' && implicit === 'hide') {\n for (var i = 1; i < result.length; ++i) {\n if (startsWithConstant(args[i], parenthesis) && !result[i - 1] && (parenthesis !== 'keep' || !isParenthesisNode(args[i - 1]))) {\n result[i] = true;\n }\n }\n }\n return result;\n }\n class OperatorNode extends Node {\n /**\n * @constructor OperatorNode\n * @extends {Node}\n * An operator with two arguments, like 2+3\n *\n * @param {string} op Operator name, for example '+'\n * @param {string} fn Function name, for example 'add'\n * @param {Node[]} args Operator arguments\n * @param {boolean} [implicit] Is this an implicit multiplication?\n * @param {boolean} [isPercentage] Is this an percentage Operation?\n */\n constructor(op, fn, args, implicit, isPercentage) {\n super();\n // validate input\n if (typeof op !== 'string') {\n throw new TypeError('string expected for parameter \"op\"');\n }\n if (typeof fn !== 'string') {\n throw new TypeError('string expected for parameter \"fn\"');\n }\n if (!Array.isArray(args) || !args.every(isNode)) {\n throw new TypeError('Array containing Nodes expected for parameter \"args\"');\n }\n this.implicit = implicit === true;\n this.isPercentage = isPercentage === true;\n this.op = op;\n this.fn = fn;\n this.args = args || [];\n }\n get type() {\n return name;\n }\n get isOperatorNode() {\n return true;\n }\n\n /**\n * Compile a node into a JavaScript function.\n * This basically pre-calculates as much as possible and only leaves open\n * calculations which depend on a dynamic scope with variables.\n * @param {Object} math Math.js namespace with functions and constants.\n * @param {Object} argNames An object with argument names as key and `true`\n * as value. Used in the SymbolNode to optimize\n * for arguments from user assigned functions\n * (see FunctionAssignmentNode) or special symbols\n * like `end` (see IndexNode).\n * @return {function} Returns a function which can be called like:\n * evalNode(scope: Object, args: Object, context: *)\n */\n _compile(math, argNames) {\n // validate fn\n if (typeof this.fn !== 'string' || !isSafeMethod(math, this.fn)) {\n if (!math[this.fn]) {\n throw new Error('Function ' + this.fn + ' missing in provided namespace \"math\"');\n } else {\n throw new Error('No access to function \"' + this.fn + '\"');\n }\n }\n var fn = getSafeProperty(math, this.fn);\n var evalArgs = map(this.args, function (arg) {\n return arg._compile(math, argNames);\n });\n if (evalArgs.length === 1) {\n var evalArg0 = evalArgs[0];\n return function evalOperatorNode(scope, args, context) {\n return fn(evalArg0(scope, args, context));\n };\n } else if (evalArgs.length === 2) {\n var _evalArg = evalArgs[0];\n var evalArg1 = evalArgs[1];\n return function evalOperatorNode(scope, args, context) {\n return fn(_evalArg(scope, args, context), evalArg1(scope, args, context));\n };\n } else {\n return function evalOperatorNode(scope, args, context) {\n return fn.apply(null, map(evalArgs, function (evalArg) {\n return evalArg(scope, args, context);\n }));\n };\n }\n }\n\n /**\n * Execute a callback for each of the child nodes of this node\n * @param {function(child: Node, path: string, parent: Node)} callback\n */\n forEach(callback) {\n for (var i = 0; i < this.args.length; i++) {\n callback(this.args[i], 'args[' + i + ']', this);\n }\n }\n\n /**\n * Create a new OperatorNode whose children are the results of calling\n * the provided callback function for each child of the original node.\n * @param {function(child: Node, path: string, parent: Node): Node} callback\n * @returns {OperatorNode} Returns a transformed copy of the node\n */\n map(callback) {\n var args = [];\n for (var i = 0; i < this.args.length; i++) {\n args[i] = this._ifNode(callback(this.args[i], 'args[' + i + ']', this));\n }\n return new OperatorNode(this.op, this.fn, args, this.implicit, this.isPercentage);\n }\n\n /**\n * Create a clone of this node, a shallow copy\n * @return {OperatorNode}\n */\n clone() {\n return new OperatorNode(this.op, this.fn, this.args.slice(0), this.implicit, this.isPercentage);\n }\n\n /**\n * Check whether this is an unary OperatorNode:\n * has exactly one argument, like `-a`.\n * @return {boolean}\n * Returns true when an unary operator node, false otherwise.\n */\n isUnary() {\n return this.args.length === 1;\n }\n\n /**\n * Check whether this is a binary OperatorNode:\n * has exactly two arguments, like `a + b`.\n * @return {boolean}\n * Returns true when a binary operator node, false otherwise.\n */\n isBinary() {\n return this.args.length === 2;\n }\n\n /**\n * Get string representation.\n * @param {Object} options\n * @return {string} str\n */\n _toString(options) {\n var parenthesis = options && options.parenthesis ? options.parenthesis : 'keep';\n var implicit = options && options.implicit ? options.implicit : 'hide';\n var args = this.args;\n var parens = calculateNecessaryParentheses(this, parenthesis, implicit, args, false);\n if (args.length === 1) {\n // unary operators\n var assoc = getAssociativity(this, parenthesis);\n var operand = args[0].toString(options);\n if (parens[0]) {\n operand = '(' + operand + ')';\n }\n\n // for example for \"not\", we want a space between operand and argument\n var opIsNamed = /[a-zA-Z]+/.test(this.op);\n if (assoc === 'right') {\n // prefix operator\n return this.op + (opIsNamed ? ' ' : '') + operand;\n } else if (assoc === 'left') {\n // postfix\n return operand + (opIsNamed ? ' ' : '') + this.op;\n }\n\n // fall back to postfix\n return operand + this.op;\n } else if (args.length === 2) {\n var lhs = args[0].toString(options); // left hand side\n var rhs = args[1].toString(options); // right hand side\n if (parens[0]) {\n // left hand side in parenthesis?\n lhs = '(' + lhs + ')';\n }\n if (parens[1]) {\n // right hand side in parenthesis?\n rhs = '(' + rhs + ')';\n }\n if (this.implicit && this.getIdentifier() === 'OperatorNode:multiply' && implicit === 'hide') {\n return lhs + ' ' + rhs;\n }\n return lhs + ' ' + this.op + ' ' + rhs;\n } else if (args.length > 2 && (this.getIdentifier() === 'OperatorNode:add' || this.getIdentifier() === 'OperatorNode:multiply')) {\n var stringifiedArgs = args.map(function (arg, index) {\n arg = arg.toString(options);\n if (parens[index]) {\n // put in parenthesis?\n arg = '(' + arg + ')';\n }\n return arg;\n });\n if (this.implicit && this.getIdentifier() === 'OperatorNode:multiply' && implicit === 'hide') {\n return stringifiedArgs.join(' ');\n }\n return stringifiedArgs.join(' ' + this.op + ' ');\n } else {\n // fallback to formatting as a function call\n return this.fn + '(' + this.args.join(', ') + ')';\n }\n }\n\n /**\n * Get a JSON representation of the node\n * @returns {Object}\n */\n toJSON() {\n return {\n mathjs: name,\n op: this.op,\n fn: this.fn,\n args: this.args,\n implicit: this.implicit,\n isPercentage: this.isPercentage\n };\n }\n\n /**\n * Instantiate an OperatorNode from its JSON representation\n * @param {Object} json\n * An object structured like\n * ```\n * {\"mathjs\": \"OperatorNode\",\n * \"op\": \"+\", \"fn\": \"add\", \"args\": [...],\n * \"implicit\": false,\n * \"isPercentage\":false}\n * ```\n * where mathjs is optional\n * @returns {OperatorNode}\n */\n static fromJSON(json) {\n return new OperatorNode(json.op, json.fn, json.args, json.implicit, json.isPercentage);\n }\n\n /**\n * Get HTML representation.\n * @param {Object} options\n * @return {string} str\n */\n toHTML(options) {\n var parenthesis = options && options.parenthesis ? options.parenthesis : 'keep';\n var implicit = options && options.implicit ? options.implicit : 'hide';\n var args = this.args;\n var parens = calculateNecessaryParentheses(this, parenthesis, implicit, args, false);\n if (args.length === 1) {\n // unary operators\n var assoc = getAssociativity(this, parenthesis);\n var operand = args[0].toHTML(options);\n if (parens[0]) {\n operand = '(' + operand + ')';\n }\n if (assoc === 'right') {\n // prefix operator\n return '' + escape(this.op) + '' + operand;\n } else {\n // postfix when assoc === 'left' or undefined\n return operand + '' + escape(this.op) + '';\n }\n } else if (args.length === 2) {\n // binary operatoes\n var lhs = args[0].toHTML(options); // left hand side\n var rhs = args[1].toHTML(options); // right hand side\n if (parens[0]) {\n // left hand side in parenthesis?\n lhs = '(' + lhs + ')';\n }\n if (parens[1]) {\n // right hand side in parenthesis?\n rhs = '(' + rhs + ')';\n }\n if (this.implicit && this.getIdentifier() === 'OperatorNode:multiply' && implicit === 'hide') {\n return lhs + '' + rhs;\n }\n return lhs + '' + escape(this.op) + '' + rhs;\n } else {\n var stringifiedArgs = args.map(function (arg, index) {\n arg = arg.toHTML(options);\n if (parens[index]) {\n // put in parenthesis?\n arg = '(' + arg + ')';\n }\n return arg;\n });\n if (args.length > 2 && (this.getIdentifier() === 'OperatorNode:add' || this.getIdentifier() === 'OperatorNode:multiply')) {\n if (this.implicit && this.getIdentifier() === 'OperatorNode:multiply' && implicit === 'hide') {\n return stringifiedArgs.join('');\n }\n return stringifiedArgs.join('' + escape(this.op) + '');\n } else {\n // fallback to formatting as a function call\n return '' + escape(this.fn) + '' + '(' + stringifiedArgs.join(',') + ')';\n }\n }\n }\n\n /**\n * Get LaTeX representation\n * @param {Object} options\n * @return {string} str\n */\n _toTex(options) {\n var parenthesis = options && options.parenthesis ? options.parenthesis : 'keep';\n var implicit = options && options.implicit ? options.implicit : 'hide';\n var args = this.args;\n var parens = calculateNecessaryParentheses(this, parenthesis, implicit, args, true);\n var op = latexOperators[this.fn];\n op = typeof op === 'undefined' ? this.op : op; // fall back to using this.op\n\n if (args.length === 1) {\n // unary operators\n var assoc = getAssociativity(this, parenthesis);\n var operand = args[0].toTex(options);\n if (parens[0]) {\n operand = \"\\\\left(\".concat(operand, \"\\\\right)\");\n }\n if (assoc === 'right') {\n // prefix operator\n return op + operand;\n } else if (assoc === 'left') {\n // postfix operator\n return operand + op;\n }\n\n // fall back to postfix\n return operand + op;\n } else if (args.length === 2) {\n // binary operators\n var lhs = args[0]; // left hand side\n var lhsTex = lhs.toTex(options);\n if (parens[0]) {\n lhsTex = \"\\\\left(\".concat(lhsTex, \"\\\\right)\");\n }\n var rhs = args[1]; // right hand side\n var rhsTex = rhs.toTex(options);\n if (parens[1]) {\n rhsTex = \"\\\\left(\".concat(rhsTex, \"\\\\right)\");\n }\n\n // handle some exceptions (due to the way LaTeX works)\n var lhsIdentifier;\n if (parenthesis === 'keep') {\n lhsIdentifier = lhs.getIdentifier();\n } else {\n // Ignore ParenthesisNodes if in 'keep' mode\n lhsIdentifier = lhs.getContent().getIdentifier();\n }\n switch (this.getIdentifier()) {\n case 'OperatorNode:divide':\n // op contains '\\\\frac' at this point\n return op + '{' + lhsTex + '}' + '{' + rhsTex + '}';\n case 'OperatorNode:pow':\n lhsTex = '{' + lhsTex + '}';\n rhsTex = '{' + rhsTex + '}';\n switch (lhsIdentifier) {\n case 'ConditionalNode': //\n case 'OperatorNode:divide':\n lhsTex = \"\\\\left(\".concat(lhsTex, \"\\\\right)\");\n }\n break;\n case 'OperatorNode:multiply':\n if (this.implicit && implicit === 'hide') {\n return lhsTex + '~' + rhsTex;\n }\n }\n return lhsTex + op + rhsTex;\n } else if (args.length > 2 && (this.getIdentifier() === 'OperatorNode:add' || this.getIdentifier() === 'OperatorNode:multiply')) {\n var texifiedArgs = args.map(function (arg, index) {\n arg = arg.toTex(options);\n if (parens[index]) {\n arg = \"\\\\left(\".concat(arg, \"\\\\right)\");\n }\n return arg;\n });\n if (this.getIdentifier() === 'OperatorNode:multiply' && this.implicit && implicit === 'hide') {\n return texifiedArgs.join('~');\n }\n return texifiedArgs.join(op);\n } else {\n // fall back to formatting as a function call\n // as this is a fallback, it doesn't use\n // fancy function names\n return '\\\\mathrm{' + this.fn + '}\\\\left(' + args.map(function (arg) {\n return arg.toTex(options);\n }).join(',') + '\\\\right)';\n }\n }\n\n /**\n * Get identifier.\n * @return {string}\n */\n getIdentifier() {\n return this.type + ':' + this.fn;\n }\n }\n _defineProperty(OperatorNode, \"name\", name);\n return OperatorNode;\n}, {\n isClass: true,\n isNode: true\n});","import _defineProperty from \"@babel/runtime/helpers/defineProperty\";\nimport { isNode } from '../../utils/is.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'ParenthesisNode';\nvar dependencies = ['Node'];\nexport var createParenthesisNode = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n Node\n } = _ref;\n class ParenthesisNode extends Node {\n /**\n * @constructor ParenthesisNode\n * @extends {Node}\n * A parenthesis node describes manual parenthesis from the user input\n * @param {Node} content\n * @extends {Node}\n */\n constructor(content) {\n super();\n // validate input\n if (!isNode(content)) {\n throw new TypeError('Node expected for parameter \"content\"');\n }\n this.content = content;\n }\n get type() {\n return name;\n }\n get isParenthesisNode() {\n return true;\n }\n\n /**\n * Compile a node into a JavaScript function.\n * This basically pre-calculates as much as possible and only leaves open\n * calculations which depend on a dynamic scope with variables.\n * @param {Object} math Math.js namespace with functions and constants.\n * @param {Object} argNames An object with argument names as key and `true`\n * as value. Used in the SymbolNode to optimize\n * for arguments from user assigned functions\n * (see FunctionAssignmentNode) or special symbols\n * like `end` (see IndexNode).\n * @return {function} Returns a function which can be called like:\n * evalNode(scope: Object, args: Object, context: *)\n */\n _compile(math, argNames) {\n return this.content._compile(math, argNames);\n }\n\n /**\n * Get the content of the current Node.\n * @return {Node} content\n * @override\n **/\n getContent() {\n return this.content.getContent();\n }\n\n /**\n * Execute a callback for each of the child nodes of this node\n * @param {function(child: Node, path: string, parent: Node)} callback\n */\n forEach(callback) {\n callback(this.content, 'content', this);\n }\n\n /**\n * Create a new ParenthesisNode whose child is the result of calling\n * the provided callback function on the child of this node.\n * @param {function(child: Node, path: string, parent: Node) : Node} callback\n * @returns {ParenthesisNode} Returns a clone of the node\n */\n map(callback) {\n var content = callback(this.content, 'content', this);\n return new ParenthesisNode(content);\n }\n\n /**\n * Create a clone of this node, a shallow copy\n * @return {ParenthesisNode}\n */\n clone() {\n return new ParenthesisNode(this.content);\n }\n\n /**\n * Get string representation\n * @param {Object} options\n * @return {string} str\n * @override\n */\n _toString(options) {\n if (!options || options && !options.parenthesis || options && options.parenthesis === 'keep') {\n return '(' + this.content.toString(options) + ')';\n }\n return this.content.toString(options);\n }\n\n /**\n * Get a JSON representation of the node\n * @returns {Object}\n */\n toJSON() {\n return {\n mathjs: name,\n content: this.content\n };\n }\n\n /**\n * Instantiate an ParenthesisNode from its JSON representation\n * @param {Object} json An object structured like\n * `{\"mathjs\": \"ParenthesisNode\", \"content\": ...}`,\n * where mathjs is optional\n * @returns {ParenthesisNode}\n */\n static fromJSON(json) {\n return new ParenthesisNode(json.content);\n }\n\n /**\n * Get HTML representation\n * @param {Object} options\n * @return {string} str\n * @override\n */\n toHTML(options) {\n if (!options || options && !options.parenthesis || options && options.parenthesis === 'keep') {\n return '(' + this.content.toHTML(options) + ')';\n }\n return this.content.toHTML(options);\n }\n\n /**\n * Get LaTeX representation\n * @param {Object} options\n * @return {string} str\n * @override\n */\n _toTex(options) {\n if (!options || options && !options.parenthesis || options && options.parenthesis === 'keep') {\n return \"\\\\left(\".concat(this.content.toTex(options), \"\\\\right)\");\n }\n return this.content.toTex(options);\n }\n }\n _defineProperty(ParenthesisNode, \"name\", name);\n return ParenthesisNode;\n}, {\n isClass: true,\n isNode: true\n});","import _defineProperty from \"@babel/runtime/helpers/defineProperty\";\nimport { isNode, isSymbolNode } from '../../utils/is.js';\nimport { factory } from '../../utils/factory.js';\nimport { getPrecedence } from '../operators.js';\nvar name = 'RangeNode';\nvar dependencies = ['Node'];\nexport var createRangeNode = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n Node\n } = _ref;\n /**\n * Calculate the necessary parentheses\n * @param {Node} node\n * @param {string} parenthesis\n * @param {string} implicit\n * @return {Object} parentheses\n * @private\n */\n function calculateNecessaryParentheses(node, parenthesis, implicit) {\n var precedence = getPrecedence(node, parenthesis, implicit);\n var parens = {};\n var startPrecedence = getPrecedence(node.start, parenthesis, implicit);\n parens.start = startPrecedence !== null && startPrecedence <= precedence || parenthesis === 'all';\n if (node.step) {\n var stepPrecedence = getPrecedence(node.step, parenthesis, implicit);\n parens.step = stepPrecedence !== null && stepPrecedence <= precedence || parenthesis === 'all';\n }\n var endPrecedence = getPrecedence(node.end, parenthesis, implicit);\n parens.end = endPrecedence !== null && endPrecedence <= precedence || parenthesis === 'all';\n return parens;\n }\n class RangeNode extends Node {\n /**\n * @constructor RangeNode\n * @extends {Node}\n * create a range\n * @param {Node} start included lower-bound\n * @param {Node} end included upper-bound\n * @param {Node} [step] optional step\n */\n constructor(start, end, step) {\n super();\n // validate inputs\n if (!isNode(start)) throw new TypeError('Node expected');\n if (!isNode(end)) throw new TypeError('Node expected');\n if (step && !isNode(step)) throw new TypeError('Node expected');\n if (arguments.length > 3) throw new Error('Too many arguments');\n this.start = start; // included lower-bound\n this.end = end; // included upper-bound\n this.step = step || null; // optional step\n }\n\n get type() {\n return name;\n }\n get isRangeNode() {\n return true;\n }\n\n /**\n * Check whether the RangeNode needs the `end` symbol to be defined.\n * This end is the size of the Matrix in current dimension.\n * @return {boolean}\n */\n needsEnd() {\n // find all `end` symbols in this RangeNode\n var endSymbols = this.filter(function (node) {\n return isSymbolNode(node) && node.name === 'end';\n });\n return endSymbols.length > 0;\n }\n\n /**\n * Compile a node into a JavaScript function.\n * This basically pre-calculates as much as possible and only leaves open\n * calculations which depend on a dynamic scope with variables.\n * @param {Object} math Math.js namespace with functions and constants.\n * @param {Object} argNames An object with argument names as key and `true`\n * as value. Used in the SymbolNode to optimize\n * for arguments from user assigned functions\n * (see FunctionAssignmentNode) or special symbols\n * like `end` (see IndexNode).\n * @return {function} Returns a function which can be called like:\n * evalNode(scope: Object, args: Object, context: *)\n */\n _compile(math, argNames) {\n var range = math.range;\n var evalStart = this.start._compile(math, argNames);\n var evalEnd = this.end._compile(math, argNames);\n if (this.step) {\n var evalStep = this.step._compile(math, argNames);\n return function evalRangeNode(scope, args, context) {\n return range(evalStart(scope, args, context), evalEnd(scope, args, context), evalStep(scope, args, context));\n };\n } else {\n return function evalRangeNode(scope, args, context) {\n return range(evalStart(scope, args, context), evalEnd(scope, args, context));\n };\n }\n }\n\n /**\n * Execute a callback for each of the child nodes of this node\n * @param {function(child: Node, path: string, parent: Node)} callback\n */\n forEach(callback) {\n callback(this.start, 'start', this);\n callback(this.end, 'end', this);\n if (this.step) {\n callback(this.step, 'step', this);\n }\n }\n\n /**\n * Create a new RangeNode whose children are the results of calling\n * the provided callback function for each child of the original node.\n * @param {function(child: Node, path: string, parent: Node): Node} callback\n * @returns {RangeNode} Returns a transformed copy of the node\n */\n map(callback) {\n return new RangeNode(this._ifNode(callback(this.start, 'start', this)), this._ifNode(callback(this.end, 'end', this)), this.step && this._ifNode(callback(this.step, 'step', this)));\n }\n\n /**\n * Create a clone of this node, a shallow copy\n * @return {RangeNode}\n */\n clone() {\n return new RangeNode(this.start, this.end, this.step && this.step);\n }\n\n /**\n * Get string representation\n * @param {Object} options\n * @return {string} str\n */\n _toString(options) {\n var parenthesis = options && options.parenthesis ? options.parenthesis : 'keep';\n var parens = calculateNecessaryParentheses(this, parenthesis, options && options.implicit);\n\n // format string as start:step:stop\n var str;\n var start = this.start.toString(options);\n if (parens.start) {\n start = '(' + start + ')';\n }\n str = start;\n if (this.step) {\n var step = this.step.toString(options);\n if (parens.step) {\n step = '(' + step + ')';\n }\n str += ':' + step;\n }\n var end = this.end.toString(options);\n if (parens.end) {\n end = '(' + end + ')';\n }\n str += ':' + end;\n return str;\n }\n\n /**\n * Get a JSON representation of the node\n * @returns {Object}\n */\n toJSON() {\n return {\n mathjs: name,\n start: this.start,\n end: this.end,\n step: this.step\n };\n }\n\n /**\n * Instantiate an RangeNode from its JSON representation\n * @param {Object} json\n * An object structured like\n * `{\"mathjs\": \"RangeNode\", \"start\": ..., \"end\": ..., \"step\": ...}`,\n * where mathjs is optional\n * @returns {RangeNode}\n */\n static fromJSON(json) {\n return new RangeNode(json.start, json.end, json.step);\n }\n\n /**\n * Get HTML representation\n * @param {Object} options\n * @return {string} str\n */\n toHTML(options) {\n var parenthesis = options && options.parenthesis ? options.parenthesis : 'keep';\n var parens = calculateNecessaryParentheses(this, parenthesis, options && options.implicit);\n\n // format string as start:step:stop\n var str;\n var start = this.start.toHTML(options);\n if (parens.start) {\n start = '(' + start + ')';\n }\n str = start;\n if (this.step) {\n var step = this.step.toHTML(options);\n if (parens.step) {\n step = '(' + step + ')';\n }\n str += ':' + step;\n }\n var end = this.end.toHTML(options);\n if (parens.end) {\n end = '(' + end + ')';\n }\n str += ':' + end;\n return str;\n }\n\n /**\n * Get LaTeX representation\n * @params {Object} options\n * @return {string} str\n */\n _toTex(options) {\n var parenthesis = options && options.parenthesis ? options.parenthesis : 'keep';\n var parens = calculateNecessaryParentheses(this, parenthesis, options && options.implicit);\n var str = this.start.toTex(options);\n if (parens.start) {\n str = \"\\\\left(\".concat(str, \"\\\\right)\");\n }\n if (this.step) {\n var step = this.step.toTex(options);\n if (parens.step) {\n step = \"\\\\left(\".concat(step, \"\\\\right)\");\n }\n str += ':' + step;\n }\n var end = this.end.toTex(options);\n if (parens.end) {\n end = \"\\\\left(\".concat(end, \"\\\\right)\");\n }\n str += ':' + end;\n return str;\n }\n }\n _defineProperty(RangeNode, \"name\", name);\n return RangeNode;\n}, {\n isClass: true,\n isNode: true\n});","import _defineProperty from \"@babel/runtime/helpers/defineProperty\";\nimport { getPrecedence } from '../operators.js';\nimport { escape } from '../../utils/string.js';\nimport { getSafeProperty } from '../../utils/customs.js';\nimport { latexOperators } from '../../utils/latex.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'RelationalNode';\nvar dependencies = ['Node'];\nexport var createRelationalNode = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n Node\n } = _ref;\n var operatorMap = {\n equal: '==',\n unequal: '!=',\n smaller: '<',\n larger: '>',\n smallerEq: '<=',\n largerEq: '>='\n };\n class RelationalNode extends Node {\n /**\n * A node representing a chained conditional expression, such as 'x > y > z'\n *\n * @param {String[]} conditionals\n * An array of conditional operators used to compare the parameters\n * @param {Node[]} params\n * The parameters that will be compared\n *\n * @constructor RelationalNode\n * @extends {Node}\n */\n constructor(conditionals, params) {\n super();\n if (!Array.isArray(conditionals)) {\n throw new TypeError('Parameter conditionals must be an array');\n }\n if (!Array.isArray(params)) {\n throw new TypeError('Parameter params must be an array');\n }\n if (conditionals.length !== params.length - 1) {\n throw new TypeError('Parameter params must contain exactly one more element ' + 'than parameter conditionals');\n }\n this.conditionals = conditionals;\n this.params = params;\n }\n get type() {\n return name;\n }\n get isRelationalNode() {\n return true;\n }\n\n /**\n * Compile a node into a JavaScript function.\n * This basically pre-calculates as much as possible and only leaves open\n * calculations which depend on a dynamic scope with variables.\n * @param {Object} math Math.js namespace with functions and constants.\n * @param {Object} argNames An object with argument names as key and `true`\n * as value. Used in the SymbolNode to optimize\n * for arguments from user assigned functions\n * (see FunctionAssignmentNode) or special symbols\n * like `end` (see IndexNode).\n * @return {function} Returns a function which can be called like:\n * evalNode(scope: Object, args: Object, context: *)\n */\n _compile(math, argNames) {\n var self = this;\n var compiled = this.params.map(p => p._compile(math, argNames));\n return function evalRelationalNode(scope, args, context) {\n var evalLhs;\n var evalRhs = compiled[0](scope, args, context);\n for (var i = 0; i < self.conditionals.length; i++) {\n evalLhs = evalRhs;\n evalRhs = compiled[i + 1](scope, args, context);\n var condFn = getSafeProperty(math, self.conditionals[i]);\n if (!condFn(evalLhs, evalRhs)) {\n return false;\n }\n }\n return true;\n };\n }\n\n /**\n * Execute a callback for each of the child nodes of this node\n * @param {function(child: Node, path: string, parent: Node)} callback\n */\n forEach(callback) {\n this.params.forEach((n, i) => callback(n, 'params[' + i + ']', this), this);\n }\n\n /**\n * Create a new RelationalNode whose children are the results of calling\n * the provided callback function for each child of the original node.\n * @param {function(child: Node, path: string, parent: Node): Node} callback\n * @returns {RelationalNode} Returns a transformed copy of the node\n */\n map(callback) {\n return new RelationalNode(this.conditionals.slice(), this.params.map((n, i) => this._ifNode(callback(n, 'params[' + i + ']', this)), this));\n }\n\n /**\n * Create a clone of this node, a shallow copy\n * @return {RelationalNode}\n */\n clone() {\n return new RelationalNode(this.conditionals, this.params);\n }\n\n /**\n * Get string representation.\n * @param {Object} options\n * @return {string} str\n */\n _toString(options) {\n var parenthesis = options && options.parenthesis ? options.parenthesis : 'keep';\n var precedence = getPrecedence(this, parenthesis, options && options.implicit);\n var paramStrings = this.params.map(function (p, index) {\n var paramPrecedence = getPrecedence(p, parenthesis, options && options.implicit);\n return parenthesis === 'all' || paramPrecedence !== null && paramPrecedence <= precedence ? '(' + p.toString(options) + ')' : p.toString(options);\n });\n var ret = paramStrings[0];\n for (var i = 0; i < this.conditionals.length; i++) {\n ret += ' ' + operatorMap[this.conditionals[i]];\n ret += ' ' + paramStrings[i + 1];\n }\n return ret;\n }\n\n /**\n * Get a JSON representation of the node\n * @returns {Object}\n */\n toJSON() {\n return {\n mathjs: name,\n conditionals: this.conditionals,\n params: this.params\n };\n }\n\n /**\n * Instantiate a RelationalNode from its JSON representation\n * @param {Object} json\n * An object structured like\n * `{\"mathjs\": \"RelationalNode\", \"conditionals\": ..., \"params\": ...}`,\n * where mathjs is optional\n * @returns {RelationalNode}\n */\n static fromJSON(json) {\n return new RelationalNode(json.conditionals, json.params);\n }\n\n /**\n * Get HTML representation\n * @param {Object} options\n * @return {string} str\n */\n toHTML(options) {\n var parenthesis = options && options.parenthesis ? options.parenthesis : 'keep';\n var precedence = getPrecedence(this, parenthesis, options && options.implicit);\n var paramStrings = this.params.map(function (p, index) {\n var paramPrecedence = getPrecedence(p, parenthesis, options && options.implicit);\n return parenthesis === 'all' || paramPrecedence !== null && paramPrecedence <= precedence ? '(' + p.toHTML(options) + ')' : p.toHTML(options);\n });\n var ret = paramStrings[0];\n for (var i = 0; i < this.conditionals.length; i++) {\n ret += '' + escape(operatorMap[this.conditionals[i]]) + '' + paramStrings[i + 1];\n }\n return ret;\n }\n\n /**\n * Get LaTeX representation\n * @param {Object} options\n * @return {string} str\n */\n _toTex(options) {\n var parenthesis = options && options.parenthesis ? options.parenthesis : 'keep';\n var precedence = getPrecedence(this, parenthesis, options && options.implicit);\n var paramStrings = this.params.map(function (p, index) {\n var paramPrecedence = getPrecedence(p, parenthesis, options && options.implicit);\n return parenthesis === 'all' || paramPrecedence !== null && paramPrecedence <= precedence ? '\\\\left(' + p.toTex(options) + '\\right)' : p.toTex(options);\n });\n var ret = paramStrings[0];\n for (var i = 0; i < this.conditionals.length; i++) {\n ret += latexOperators[this.conditionals[i]] + paramStrings[i + 1];\n }\n return ret;\n }\n }\n _defineProperty(RelationalNode, \"name\", name);\n return RelationalNode;\n}, {\n isClass: true,\n isNode: true\n});","import { escape } from '../../utils/string.js';\nimport { getSafeProperty } from '../../utils/customs.js';\nimport { factory } from '../../utils/factory.js';\nimport { toSymbol } from '../../utils/latex.js';\nvar name = 'SymbolNode';\nvar dependencies = ['math', '?Unit', 'Node'];\nexport var createSymbolNode = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n math,\n Unit,\n Node\n } = _ref;\n /**\n * Check whether some name is a valueless unit like \"inch\".\n * @param {string} name\n * @return {boolean}\n */\n function isValuelessUnit(name) {\n return Unit ? Unit.isValuelessUnit(name) : false;\n }\n class SymbolNode extends Node {\n /**\n * @constructor SymbolNode\n * @extends {Node}\n * A symbol node can hold and resolve a symbol\n * @param {string} name\n * @extends {Node}\n */\n constructor(name) {\n super();\n // validate input\n if (typeof name !== 'string') {\n throw new TypeError('String expected for parameter \"name\"');\n }\n this.name = name;\n }\n get type() {\n return 'SymbolNode';\n }\n get isSymbolNode() {\n return true;\n }\n\n /**\n * Compile a node into a JavaScript function.\n * This basically pre-calculates as much as possible and only leaves open\n * calculations which depend on a dynamic scope with variables.\n * @param {Object} math Math.js namespace with functions and constants.\n * @param {Object} argNames An object with argument names as key and `true`\n * as value. Used in the SymbolNode to optimize\n * for arguments from user assigned functions\n * (see FunctionAssignmentNode) or special symbols\n * like `end` (see IndexNode).\n * @return {function} Returns a function which can be called like:\n * evalNode(scope: Object, args: Object, context: *)\n */\n _compile(math, argNames) {\n var name = this.name;\n if (argNames[name] === true) {\n // this is a FunctionAssignment argument\n // (like an x when inside the expression of a function\n // assignment `f(x) = ...`)\n return function (scope, args, context) {\n return getSafeProperty(args, name);\n };\n } else if (name in math) {\n return function (scope, args, context) {\n return scope.has(name) ? scope.get(name) : getSafeProperty(math, name);\n };\n } else {\n var isUnit = isValuelessUnit(name);\n return function (scope, args, context) {\n return scope.has(name) ? scope.get(name) : isUnit ? new Unit(null, name) : SymbolNode.onUndefinedSymbol(name);\n };\n }\n }\n\n /**\n * Execute a callback for each of the child nodes of this node\n * @param {function(child: Node, path: string, parent: Node)} callback\n */\n forEach(callback) {\n // nothing to do, we don't have any children\n }\n\n /**\n * Create a new SymbolNode with children produced by the given callback.\n * Trivial since a SymbolNode has no children\n * @param {function(child: Node, path: string, parent: Node) : Node} callback\n * @returns {SymbolNode} Returns a clone of the node\n */\n map(callback) {\n return this.clone();\n }\n\n /**\n * Throws an error 'Undefined symbol {name}'\n * @param {string} name\n */\n static onUndefinedSymbol(name) {\n throw new Error('Undefined symbol ' + name);\n }\n\n /**\n * Create a clone of this node, a shallow copy\n * @return {SymbolNode}\n */\n clone() {\n return new SymbolNode(this.name);\n }\n\n /**\n * Get string representation\n * @param {Object} options\n * @return {string} str\n * @override\n */\n _toString(options) {\n return this.name;\n }\n\n /**\n * Get HTML representation\n * @param {Object} options\n * @return {string} str\n * @override\n */\n toHTML(options) {\n var name = escape(this.name);\n if (name === 'true' || name === 'false') {\n return '' + name + '';\n } else if (name === 'i') {\n return '' + name + '';\n } else if (name === 'Infinity') {\n return '' + name + '';\n } else if (name === 'NaN') {\n return '' + name + '';\n } else if (name === 'null') {\n return '' + name + '';\n } else if (name === 'undefined') {\n return '' + name + '';\n }\n return '' + name + '';\n }\n\n /**\n * Get a JSON representation of the node\n * @returns {Object}\n */\n toJSON() {\n return {\n mathjs: 'SymbolNode',\n name: this.name\n };\n }\n\n /**\n * Instantiate a SymbolNode from its JSON representation\n * @param {Object} json An object structured like\n * `{\"mathjs\": \"SymbolNode\", name: \"x\"}`,\n * where mathjs is optional\n * @returns {SymbolNode}\n */\n static fromJSON(json) {\n return new SymbolNode(json.name);\n }\n\n /**\n * Get LaTeX representation\n * @param {Object} options\n * @return {string} str\n * @override\n */\n _toTex(options) {\n var isUnit = false;\n if (typeof math[this.name] === 'undefined' && isValuelessUnit(this.name)) {\n isUnit = true;\n }\n var symbol = toSymbol(this.name, isUnit);\n if (symbol[0] === '\\\\') {\n // no space needed if the symbol starts with '\\'\n return symbol;\n }\n // the space prevents symbols from breaking stuff like '\\cdot'\n // if it's written right before the symbol\n return ' ' + symbol;\n }\n }\n return SymbolNode;\n}, {\n isClass: true,\n isNode: true\n});","import { createEmptyMap, assign } from './map.js';\n\n/**\n * Create a new scope which can access the parent scope,\n * but does not affect it when written. This is suitable for variable definitions\n * within a block node, or function definition.\n *\n * If parent scope has a createSubScope method, it delegates to that. Otherwise,\n * creates an empty map, and copies the parent scope to it, adding in\n * the remaining `args`.\n *\n * @param {Map} parentScope\n * @param {...any} args\n * @returns {Map}\n */\nexport function createSubScope(parentScope) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n if (typeof parentScope.createSubScope === 'function') {\n return assign(parentScope.createSubScope(), ...args);\n }\n return assign(createEmptyMap(), parentScope, ...args);\n}","import _defineProperty from \"@babel/runtime/helpers/defineProperty\";\nimport { isAccessorNode, isFunctionAssignmentNode, isIndexNode, isNode, isSymbolNode } from '../../utils/is.js';\nimport { escape, format } from '../../utils/string.js';\nimport { hasOwnProperty } from '../../utils/object.js';\nimport { getSafeProperty, getSafeMethod } from '../../utils/customs.js';\nimport { createSubScope } from '../../utils/scope.js';\nimport { factory } from '../../utils/factory.js';\nimport { defaultTemplate, latexFunctions } from '../../utils/latex.js';\nvar name = 'FunctionNode';\nvar dependencies = ['math', 'Node', 'SymbolNode'];\nexport var createFunctionNode = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n math,\n Node,\n SymbolNode\n } = _ref;\n /* format to fixed length */\n var strin = entity => format(entity, {\n truncate: 78\n });\n\n /*\n * Expand a LaTeX template\n *\n * @param {string} template\n * @param {Node} node\n * @param {Object} options\n * @private\n **/\n function expandTemplate(template, node, options) {\n var latex = '';\n\n // Match everything of the form ${identifier} or ${identifier[2]} or $$\n // while submatching identifier and 2 (in the second case)\n var regex = /\\$(?:\\{([a-z_][a-z_0-9]*)(?:\\[([0-9]+)\\])?\\}|\\$)/gi;\n var inputPos = 0; // position in the input string\n var match;\n while ((match = regex.exec(template)) !== null) {\n // go through all matches\n // add everything in front of the match to the LaTeX string\n latex += template.substring(inputPos, match.index);\n inputPos = match.index;\n if (match[0] === '$$') {\n // escaped dollar sign\n latex += '$';\n inputPos++;\n } else {\n // template parameter\n inputPos += match[0].length;\n var property = node[match[1]];\n if (!property) {\n throw new ReferenceError('Template: Property ' + match[1] + ' does not exist.');\n }\n if (match[2] === undefined) {\n // no square brackets\n switch (typeof property) {\n case 'string':\n latex += property;\n break;\n case 'object':\n if (isNode(property)) {\n latex += property.toTex(options);\n } else if (Array.isArray(property)) {\n // make array of Nodes into comma separated list\n latex += property.map(function (arg, index) {\n if (isNode(arg)) {\n return arg.toTex(options);\n }\n throw new TypeError('Template: ' + match[1] + '[' + index + '] is not a Node.');\n }).join(',');\n } else {\n throw new TypeError('Template: ' + match[1] + ' has to be a Node, String or array of Nodes');\n }\n break;\n default:\n throw new TypeError('Template: ' + match[1] + ' has to be a Node, String or array of Nodes');\n }\n } else {\n // with square brackets\n if (isNode(property[match[2]] && property[match[2]])) {\n latex += property[match[2]].toTex(options);\n } else {\n throw new TypeError('Template: ' + match[1] + '[' + match[2] + '] is not a Node.');\n }\n }\n }\n }\n latex += template.slice(inputPos); // append rest of the template\n\n return latex;\n }\n class FunctionNode extends Node {\n /**\n * @constructor FunctionNode\n * @extends {./Node}\n * invoke a list with arguments on a node\n * @param {./Node | string} fn\n * Item resolving to a function on which to invoke\n * the arguments, typically a SymboNode or AccessorNode\n * @param {./Node[]} args\n */\n constructor(fn, args) {\n super();\n if (typeof fn === 'string') {\n fn = new SymbolNode(fn);\n }\n\n // validate input\n if (!isNode(fn)) throw new TypeError('Node expected as parameter \"fn\"');\n if (!Array.isArray(args) || !args.every(isNode)) {\n throw new TypeError('Array containing Nodes expected for parameter \"args\"');\n }\n this.fn = fn;\n this.args = args || [];\n }\n\n // readonly property name\n get name() {\n return this.fn.name || '';\n }\n get type() {\n return name;\n }\n get isFunctionNode() {\n return true;\n }\n\n /**\n * Compile a node into a JavaScript function.\n * This basically pre-calculates as much as possible and only leaves open\n * calculations which depend on a dynamic scope with variables.\n * @param {Object} math Math.js namespace with functions and constants.\n * @param {Object} argNames An object with argument names as key and `true`\n * as value. Used in the SymbolNode to optimize\n * for arguments from user assigned functions\n * (see FunctionAssignmentNode) or special symbols\n * like `end` (see IndexNode).\n * @return {function} Returns a function which can be called like:\n * evalNode(scope: Object, args: Object, context: *)\n */\n _compile(math, argNames) {\n // compile arguments\n var evalArgs = this.args.map(arg => arg._compile(math, argNames));\n if (isSymbolNode(this.fn)) {\n var _name = this.fn.name;\n if (!argNames[_name]) {\n // we can statically determine whether the function\n // has the rawArgs property\n var fn = _name in math ? getSafeProperty(math, _name) : undefined;\n var isRaw = typeof fn === 'function' && fn.rawArgs === true;\n var resolveFn = scope => {\n var value;\n if (scope.has(_name)) {\n value = scope.get(_name);\n } else if (_name in math) {\n value = getSafeProperty(math, _name);\n } else {\n return FunctionNode.onUndefinedFunction(_name);\n }\n if (typeof value === 'function') {\n return value;\n }\n throw new TypeError(\"'\".concat(_name, \"' is not a function; its value is:\\n \").concat(strin(value)));\n };\n if (isRaw) {\n // pass unevaluated parameters (nodes) to the function\n // \"raw\" evaluation\n var rawArgs = this.args;\n return function evalFunctionNode(scope, args, context) {\n var fn = resolveFn(scope);\n return fn(rawArgs, math, createSubScope(scope, args), scope);\n };\n } else {\n // \"regular\" evaluation\n switch (evalArgs.length) {\n case 0:\n return function evalFunctionNode(scope, args, context) {\n var fn = resolveFn(scope);\n return fn();\n };\n case 1:\n return function evalFunctionNode(scope, args, context) {\n var fn = resolveFn(scope);\n var evalArg0 = evalArgs[0];\n return fn(evalArg0(scope, args, context));\n };\n case 2:\n return function evalFunctionNode(scope, args, context) {\n var fn = resolveFn(scope);\n var evalArg0 = evalArgs[0];\n var evalArg1 = evalArgs[1];\n return fn(evalArg0(scope, args, context), evalArg1(scope, args, context));\n };\n default:\n return function evalFunctionNode(scope, args, context) {\n var fn = resolveFn(scope);\n var values = evalArgs.map(evalArg => evalArg(scope, args, context));\n return fn(...values);\n };\n }\n }\n } else {\n // the function symbol is an argName\n var _rawArgs = this.args;\n return function evalFunctionNode(scope, args, context) {\n var fn = getSafeProperty(args, _name);\n if (typeof fn !== 'function') {\n throw new TypeError(\"Argument '\".concat(_name, \"' was not a function; received: \").concat(strin(fn)));\n }\n if (fn.rawArgs) {\n // \"Raw\" evaluation\n return fn(_rawArgs, math, createSubScope(scope, args), scope);\n } else {\n var values = evalArgs.map(evalArg => evalArg(scope, args, context));\n return fn.apply(fn, values);\n }\n };\n }\n } else if (isAccessorNode(this.fn) && isIndexNode(this.fn.index) && this.fn.index.isObjectProperty()) {\n // execute the function with the right context:\n // the object of the AccessorNode\n\n var evalObject = this.fn.object._compile(math, argNames);\n var prop = this.fn.index.getObjectProperty();\n var _rawArgs2 = this.args;\n return function evalFunctionNode(scope, args, context) {\n var object = evalObject(scope, args, context);\n var fn = getSafeMethod(object, prop);\n if (fn !== null && fn !== void 0 && fn.rawArgs) {\n // \"Raw\" evaluation\n return fn(_rawArgs2, math, createSubScope(scope, args), scope);\n } else {\n // \"regular\" evaluation\n var values = evalArgs.map(evalArg => evalArg(scope, args, context));\n return fn.apply(object, values);\n }\n };\n } else {\n // node.fn.isAccessorNode && !node.fn.index.isObjectProperty()\n // we have to dynamically determine whether the function has the\n // rawArgs property\n var fnExpr = this.fn.toString();\n var evalFn = this.fn._compile(math, argNames);\n var _rawArgs3 = this.args;\n return function evalFunctionNode(scope, args, context) {\n var fn = evalFn(scope, args, context);\n if (typeof fn !== 'function') {\n throw new TypeError(\"Expression '\".concat(fnExpr, \"' did not evaluate to a function; value is:\") + \"\\n \".concat(strin(fn)));\n }\n if (fn.rawArgs) {\n // \"Raw\" evaluation\n return fn(_rawArgs3, math, createSubScope(scope, args), scope);\n } else {\n // \"regular\" evaluation\n var values = evalArgs.map(evalArg => evalArg(scope, args, context));\n return fn.apply(fn, values);\n }\n };\n }\n }\n\n /**\n * Execute a callback for each of the child nodes of this node\n * @param {function(child: Node, path: string, parent: Node)} callback\n */\n forEach(callback) {\n callback(this.fn, 'fn', this);\n for (var i = 0; i < this.args.length; i++) {\n callback(this.args[i], 'args[' + i + ']', this);\n }\n }\n\n /**\n * Create a new FunctionNode whose children are the results of calling\n * the provided callback function for each child of the original node.\n * @param {function(child: Node, path: string, parent: Node): Node} callback\n * @returns {FunctionNode} Returns a transformed copy of the node\n */\n map(callback) {\n var fn = this._ifNode(callback(this.fn, 'fn', this));\n var args = [];\n for (var i = 0; i < this.args.length; i++) {\n args[i] = this._ifNode(callback(this.args[i], 'args[' + i + ']', this));\n }\n return new FunctionNode(fn, args);\n }\n\n /**\n * Create a clone of this node, a shallow copy\n * @return {FunctionNode}\n */\n clone() {\n return new FunctionNode(this.fn, this.args.slice(0));\n }\n\n /**\n * Throws an error 'Undefined function {name}'\n * @param {string} name\n */\n\n /**\n * Get string representation. (wrapper function)\n * This overrides parts of Node's toString function.\n * If callback is an object containing callbacks, it\n * calls the correct callback for the current node,\n * otherwise it falls back to calling Node's toString\n * function.\n *\n * @param {Object} options\n * @return {string} str\n * @override\n */\n toString(options) {\n var customString;\n var name = this.fn.toString(options);\n if (options && typeof options.handler === 'object' && hasOwnProperty(options.handler, name)) {\n // callback is a map of callback functions\n customString = options.handler[name](this, options);\n }\n if (typeof customString !== 'undefined') {\n return customString;\n }\n\n // fall back to Node's toString\n return super.toString(options);\n }\n\n /**\n * Get string representation\n * @param {Object} options\n * @return {string} str\n */\n _toString(options) {\n var args = this.args.map(function (arg) {\n return arg.toString(options);\n });\n var fn = isFunctionAssignmentNode(this.fn) ? '(' + this.fn.toString(options) + ')' : this.fn.toString(options);\n\n // format the arguments like \"add(2, 4.2)\"\n return fn + '(' + args.join(', ') + ')';\n }\n\n /**\n * Get a JSON representation of the node\n * @returns {Object}\n */\n toJSON() {\n return {\n mathjs: name,\n fn: this.fn,\n args: this.args\n };\n }\n\n /**\n * Instantiate an AssignmentNode from its JSON representation\n * @param {Object} json An object structured like\n * `{\"mathjs\": \"FunctionNode\", fn: ..., args: ...}`,\n * where mathjs is optional\n * @returns {FunctionNode}\n */\n\n /**\n * Get HTML representation\n * @param {Object} options\n * @return {string} str\n */\n toHTML(options) {\n var args = this.args.map(function (arg) {\n return arg.toHTML(options);\n });\n\n // format the arguments like \"add(2, 4.2)\"\n return '' + escape(this.fn) + '(' + args.join(',') + ')';\n }\n\n /**\n * Get LaTeX representation. (wrapper function)\n * This overrides parts of Node's toTex function.\n * If callback is an object containing callbacks, it\n * calls the correct callback for the current node,\n * otherwise it falls back to calling Node's toTex\n * function.\n *\n * @param {Object} options\n * @return {string}\n */\n toTex(options) {\n var customTex;\n if (options && typeof options.handler === 'object' && hasOwnProperty(options.handler, this.name)) {\n // callback is a map of callback functions\n customTex = options.handler[this.name](this, options);\n }\n if (typeof customTex !== 'undefined') {\n return customTex;\n }\n\n // fall back to Node's toTex\n return super.toTex(options);\n }\n\n /**\n * Get LaTeX representation\n * @param {Object} options\n * @return {string} str\n */\n _toTex(options) {\n var args = this.args.map(function (arg) {\n // get LaTeX of the arguments\n return arg.toTex(options);\n });\n var latexConverter;\n if (latexFunctions[this.name]) {\n latexConverter = latexFunctions[this.name];\n }\n\n // toTex property on the function itself\n if (math[this.name] && (typeof math[this.name].toTex === 'function' || typeof math[this.name].toTex === 'object' || typeof math[this.name].toTex === 'string')) {\n // .toTex is a callback function\n latexConverter = math[this.name].toTex;\n }\n var customToTex;\n switch (typeof latexConverter) {\n case 'function':\n // a callback function\n customToTex = latexConverter(this, options);\n break;\n case 'string':\n // a template string\n customToTex = expandTemplate(latexConverter, this, options);\n break;\n case 'object':\n // an object with different \"converters\" for different\n // numbers of arguments\n switch (typeof latexConverter[args.length]) {\n case 'function':\n customToTex = latexConverter[args.length](this, options);\n break;\n case 'string':\n customToTex = expandTemplate(latexConverter[args.length], this, options);\n break;\n }\n }\n if (typeof customToTex !== 'undefined') {\n return customToTex;\n }\n return expandTemplate(defaultTemplate, this, options);\n }\n\n /**\n * Get identifier.\n * @return {string}\n */\n getIdentifier() {\n return this.type + ':' + this.name;\n }\n }\n _defineProperty(FunctionNode, \"name\", name);\n _defineProperty(FunctionNode, \"onUndefinedFunction\", function (name) {\n throw new Error('Undefined function ' + name);\n });\n _defineProperty(FunctionNode, \"fromJSON\", function (json) {\n return new FunctionNode(json.fn, json.args);\n });\n return FunctionNode;\n}, {\n isClass: true,\n isNode: true\n});","import _extends from \"@babel/runtime/helpers/extends\";\nimport { factory } from '../utils/factory.js';\nimport { isAccessorNode, isConstantNode, isFunctionNode, isOperatorNode, isSymbolNode, rule2Node } from '../utils/is.js';\nimport { deepMap } from '../utils/collection.js';\nimport { hasOwnProperty } from '../utils/object.js';\nvar name = 'parse';\nvar dependencies = ['typed', 'numeric', 'config', 'AccessorNode', 'ArrayNode', 'AssignmentNode', 'BlockNode', 'ConditionalNode', 'ConstantNode', 'FunctionAssignmentNode', 'FunctionNode', 'IndexNode', 'ObjectNode', 'OperatorNode', 'ParenthesisNode', 'RangeNode', 'RelationalNode', 'SymbolNode'];\nexport var createParse = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n numeric,\n config,\n AccessorNode,\n ArrayNode,\n AssignmentNode,\n BlockNode,\n ConditionalNode,\n ConstantNode,\n FunctionAssignmentNode,\n FunctionNode,\n IndexNode,\n ObjectNode,\n OperatorNode,\n ParenthesisNode,\n RangeNode,\n RelationalNode,\n SymbolNode\n } = _ref;\n /**\n * Parse an expression. Returns a node tree, which can be evaluated by\n * invoking node.evaluate().\n *\n * Note the evaluating arbitrary expressions may involve security risks,\n * see [https://mathjs.org/docs/expressions/security.html](https://mathjs.org/docs/expressions/security.html) for more information.\n *\n * Syntax:\n *\n * math.parse(expr)\n * math.parse(expr, options)\n * math.parse([expr1, expr2, expr3, ...])\n * math.parse([expr1, expr2, expr3, ...], options)\n *\n * Example:\n *\n * const node1 = math.parse('sqrt(3^2 + 4^2)')\n * node1.compile().evaluate() // 5\n *\n * let scope = {a:3, b:4}\n * const node2 = math.parse('a * b') // 12\n * const code2 = node2.compile()\n * code2.evaluate(scope) // 12\n * scope.a = 5\n * code2.evaluate(scope) // 20\n *\n * const nodes = math.parse(['a = 3', 'b = 4', 'a * b'])\n * nodes[2].compile().evaluate() // 12\n *\n * See also:\n *\n * evaluate, compile\n *\n * @param {string | string[] | Matrix} expr Expression to be parsed\n * @param {{nodes: Object}} [options] Available options:\n * - `nodes` a set of custom nodes\n * @return {Node | Node[]} node\n * @throws {Error}\n */\n var parse = typed(name, {\n string: function string(expression) {\n return parseStart(expression, {});\n },\n 'Array | Matrix': function ArrayMatrix(expressions) {\n return parseMultiple(expressions, {});\n },\n 'string, Object': function stringObject(expression, options) {\n var extraNodes = options.nodes !== undefined ? options.nodes : {};\n return parseStart(expression, extraNodes);\n },\n 'Array | Matrix, Object': parseMultiple\n });\n function parseMultiple(expressions) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var extraNodes = options.nodes !== undefined ? options.nodes : {};\n\n // parse an array or matrix with expressions\n return deepMap(expressions, function (elem) {\n if (typeof elem !== 'string') throw new TypeError('String expected');\n return parseStart(elem, extraNodes);\n });\n }\n\n // token types enumeration\n var TOKENTYPE = {\n NULL: 0,\n DELIMITER: 1,\n NUMBER: 2,\n SYMBOL: 3,\n UNKNOWN: 4\n };\n\n // map with all delimiters\n var DELIMITERS = {\n ',': true,\n '(': true,\n ')': true,\n '[': true,\n ']': true,\n '{': true,\n '}': true,\n '\"': true,\n '\\'': true,\n ';': true,\n '+': true,\n '-': true,\n '*': true,\n '.*': true,\n '/': true,\n './': true,\n '%': true,\n '^': true,\n '.^': true,\n '~': true,\n '!': true,\n '&': true,\n '|': true,\n '^|': true,\n '=': true,\n ':': true,\n '?': true,\n '==': true,\n '!=': true,\n '<': true,\n '>': true,\n '<=': true,\n '>=': true,\n '<<': true,\n '>>': true,\n '>>>': true\n };\n\n // map with all named delimiters\n var NAMED_DELIMITERS = {\n mod: true,\n to: true,\n in: true,\n and: true,\n xor: true,\n or: true,\n not: true\n };\n var CONSTANTS = {\n true: true,\n false: false,\n null: null,\n undefined\n };\n var NUMERIC_CONSTANTS = ['NaN', 'Infinity'];\n function initialState() {\n return {\n extraNodes: {},\n // current extra nodes, must be careful not to mutate\n expression: '',\n // current expression\n comment: '',\n // last parsed comment\n index: 0,\n // current index in expr\n token: '',\n // current token\n tokenType: TOKENTYPE.NULL,\n // type of the token\n nestingLevel: 0,\n // level of nesting inside parameters, used to ignore newline characters\n conditionalLevel: null // when a conditional is being parsed, the level of the conditional is stored here\n };\n }\n\n /**\n * View upto `length` characters of the expression starting at the current character.\n *\n * @param {Object} state\n * @param {number} [length=1] Number of characters to view\n * @returns {string}\n * @private\n */\n function currentString(state, length) {\n return state.expression.substr(state.index, length);\n }\n\n /**\n * View the current character. Returns '' if end of expression is reached.\n *\n * @param {Object} state\n * @returns {string}\n * @private\n */\n function currentCharacter(state) {\n return currentString(state, 1);\n }\n\n /**\n * Get the next character from the expression.\n * The character is stored into the char c. If the end of the expression is\n * reached, the function puts an empty string in c.\n * @private\n */\n function next(state) {\n state.index++;\n }\n\n /**\n * Preview the previous character from the expression.\n * @return {string} cNext\n * @private\n */\n function prevCharacter(state) {\n return state.expression.charAt(state.index - 1);\n }\n\n /**\n * Preview the next character from the expression.\n * @return {string} cNext\n * @private\n */\n function nextCharacter(state) {\n return state.expression.charAt(state.index + 1);\n }\n\n /**\n * Get next token in the current string expr.\n * The token and token type are available as token and tokenType\n * @private\n */\n function getToken(state) {\n state.tokenType = TOKENTYPE.NULL;\n state.token = '';\n state.comment = '';\n\n // skip over ignored characters:\n while (true) {\n // comments:\n if (currentCharacter(state) === '#') {\n while (currentCharacter(state) !== '\\n' && currentCharacter(state) !== '') {\n state.comment += currentCharacter(state);\n next(state);\n }\n }\n // whitespace: space, tab, and newline when inside parameters\n if (parse.isWhitespace(currentCharacter(state), state.nestingLevel)) {\n next(state);\n } else {\n break;\n }\n }\n\n // check for end of expression\n if (currentCharacter(state) === '') {\n // token is still empty\n state.tokenType = TOKENTYPE.DELIMITER;\n return;\n }\n\n // check for new line character\n if (currentCharacter(state) === '\\n' && !state.nestingLevel) {\n state.tokenType = TOKENTYPE.DELIMITER;\n state.token = currentCharacter(state);\n next(state);\n return;\n }\n var c1 = currentCharacter(state);\n var c2 = currentString(state, 2);\n var c3 = currentString(state, 3);\n if (c3.length === 3 && DELIMITERS[c3]) {\n state.tokenType = TOKENTYPE.DELIMITER;\n state.token = c3;\n next(state);\n next(state);\n next(state);\n return;\n }\n\n // check for delimiters consisting of 2 characters\n if (c2.length === 2 && DELIMITERS[c2]) {\n state.tokenType = TOKENTYPE.DELIMITER;\n state.token = c2;\n next(state);\n next(state);\n return;\n }\n\n // check for delimiters consisting of 1 character\n if (DELIMITERS[c1]) {\n state.tokenType = TOKENTYPE.DELIMITER;\n state.token = c1;\n next(state);\n return;\n }\n\n // check for a number\n if (parse.isDigitDot(c1)) {\n state.tokenType = TOKENTYPE.NUMBER;\n\n // check for binary, octal, or hex\n var _c = currentString(state, 2);\n if (_c === '0b' || _c === '0o' || _c === '0x') {\n state.token += currentCharacter(state);\n next(state);\n state.token += currentCharacter(state);\n next(state);\n while (parse.isHexDigit(currentCharacter(state))) {\n state.token += currentCharacter(state);\n next(state);\n }\n if (currentCharacter(state) === '.') {\n // this number has a radix point\n state.token += '.';\n next(state);\n // get the digits after the radix\n while (parse.isHexDigit(currentCharacter(state))) {\n state.token += currentCharacter(state);\n next(state);\n }\n } else if (currentCharacter(state) === 'i') {\n // this number has a word size suffix\n state.token += 'i';\n next(state);\n // get the word size\n while (parse.isDigit(currentCharacter(state))) {\n state.token += currentCharacter(state);\n next(state);\n }\n }\n return;\n }\n\n // get number, can have a single dot\n if (currentCharacter(state) === '.') {\n state.token += currentCharacter(state);\n next(state);\n if (!parse.isDigit(currentCharacter(state))) {\n // this is no number, it is just a dot (can be dot notation)\n state.tokenType = TOKENTYPE.DELIMITER;\n return;\n }\n } else {\n while (parse.isDigit(currentCharacter(state))) {\n state.token += currentCharacter(state);\n next(state);\n }\n if (parse.isDecimalMark(currentCharacter(state), nextCharacter(state))) {\n state.token += currentCharacter(state);\n next(state);\n }\n }\n while (parse.isDigit(currentCharacter(state))) {\n state.token += currentCharacter(state);\n next(state);\n }\n // check for exponential notation like \"2.3e-4\", \"1.23e50\" or \"2e+4\"\n if (currentCharacter(state) === 'E' || currentCharacter(state) === 'e') {\n if (parse.isDigit(nextCharacter(state)) || nextCharacter(state) === '-' || nextCharacter(state) === '+') {\n state.token += currentCharacter(state);\n next(state);\n if (currentCharacter(state) === '+' || currentCharacter(state) === '-') {\n state.token += currentCharacter(state);\n next(state);\n }\n // Scientific notation MUST be followed by an exponent\n if (!parse.isDigit(currentCharacter(state))) {\n throw createSyntaxError(state, 'Digit expected, got \"' + currentCharacter(state) + '\"');\n }\n while (parse.isDigit(currentCharacter(state))) {\n state.token += currentCharacter(state);\n next(state);\n }\n if (parse.isDecimalMark(currentCharacter(state), nextCharacter(state))) {\n throw createSyntaxError(state, 'Digit expected, got \"' + currentCharacter(state) + '\"');\n }\n } else if (nextCharacter(state) === '.') {\n next(state);\n throw createSyntaxError(state, 'Digit expected, got \"' + currentCharacter(state) + '\"');\n }\n }\n return;\n }\n\n // check for variables, functions, named operators\n if (parse.isAlpha(currentCharacter(state), prevCharacter(state), nextCharacter(state))) {\n while (parse.isAlpha(currentCharacter(state), prevCharacter(state), nextCharacter(state)) || parse.isDigit(currentCharacter(state))) {\n state.token += currentCharacter(state);\n next(state);\n }\n if (hasOwnProperty(NAMED_DELIMITERS, state.token)) {\n state.tokenType = TOKENTYPE.DELIMITER;\n } else {\n state.tokenType = TOKENTYPE.SYMBOL;\n }\n return;\n }\n\n // something unknown is found, wrong characters -> a syntax error\n state.tokenType = TOKENTYPE.UNKNOWN;\n while (currentCharacter(state) !== '') {\n state.token += currentCharacter(state);\n next(state);\n }\n throw createSyntaxError(state, 'Syntax error in part \"' + state.token + '\"');\n }\n\n /**\n * Get next token and skip newline tokens\n */\n function getTokenSkipNewline(state) {\n do {\n getToken(state);\n } while (state.token === '\\n'); // eslint-disable-line no-unmodified-loop-condition\n }\n\n /**\n * Open parameters.\n * New line characters will be ignored until closeParams(state) is called\n */\n function openParams(state) {\n state.nestingLevel++;\n }\n\n /**\n * Close parameters.\n * New line characters will no longer be ignored\n */\n function closeParams(state) {\n state.nestingLevel--;\n }\n\n /**\n * Checks whether the current character `c` is a valid alpha character:\n *\n * - A latin letter (upper or lower case) Ascii: a-z, A-Z\n * - An underscore Ascii: _\n * - A dollar sign Ascii: $\n * - A latin letter with accents Unicode: \\u00C0 - \\u02AF\n * - A greek letter Unicode: \\u0370 - \\u03FF\n * - A mathematical alphanumeric symbol Unicode: \\u{1D400} - \\u{1D7FF} excluding invalid code points\n *\n * The previous and next characters are needed to determine whether\n * this character is part of a unicode surrogate pair.\n *\n * @param {string} c Current character in the expression\n * @param {string} cPrev Previous character\n * @param {string} cNext Next character\n * @return {boolean}\n */\n parse.isAlpha = function isAlpha(c, cPrev, cNext) {\n return parse.isValidLatinOrGreek(c) || parse.isValidMathSymbol(c, cNext) || parse.isValidMathSymbol(cPrev, c);\n };\n\n /**\n * Test whether a character is a valid latin, greek, or letter-like character\n * @param {string} c\n * @return {boolean}\n */\n parse.isValidLatinOrGreek = function isValidLatinOrGreek(c) {\n return /^[a-zA-Z_$\\u00C0-\\u02AF\\u0370-\\u03FF\\u2100-\\u214F]$/.test(c);\n };\n\n /**\n * Test whether two given 16 bit characters form a surrogate pair of a\n * unicode math symbol.\n *\n * https://unicode-table.com/en/\n * https://www.wikiwand.com/en/Mathematical_operators_and_symbols_in_Unicode\n *\n * Note: In ES6 will be unicode aware:\n * https://stackoverflow.com/questions/280712/javascript-unicode-regexes\n * https://mathiasbynens.be/notes/es6-unicode-regex\n *\n * @param {string} high\n * @param {string} low\n * @return {boolean}\n */\n parse.isValidMathSymbol = function isValidMathSymbol(high, low) {\n return /^[\\uD835]$/.test(high) && /^[\\uDC00-\\uDFFF]$/.test(low) && /^[^\\uDC55\\uDC9D\\uDCA0\\uDCA1\\uDCA3\\uDCA4\\uDCA7\\uDCA8\\uDCAD\\uDCBA\\uDCBC\\uDCC4\\uDD06\\uDD0B\\uDD0C\\uDD15\\uDD1D\\uDD3A\\uDD3F\\uDD45\\uDD47-\\uDD49\\uDD51\\uDEA6\\uDEA7\\uDFCC\\uDFCD]$/.test(low);\n };\n\n /**\n * Check whether given character c is a white space character: space, tab, or enter\n * @param {string} c\n * @param {number} nestingLevel\n * @return {boolean}\n */\n parse.isWhitespace = function isWhitespace(c, nestingLevel) {\n // TODO: also take '\\r' carriage return as newline? Or does that give problems on mac?\n return c === ' ' || c === '\\t' || c === '\\n' && nestingLevel > 0;\n };\n\n /**\n * Test whether the character c is a decimal mark (dot).\n * This is the case when it's not the start of a delimiter '.*', './', or '.^'\n * @param {string} c\n * @param {string} cNext\n * @return {boolean}\n */\n parse.isDecimalMark = function isDecimalMark(c, cNext) {\n return c === '.' && cNext !== '/' && cNext !== '*' && cNext !== '^';\n };\n\n /**\n * checks if the given char c is a digit or dot\n * @param {string} c a string with one character\n * @return {boolean}\n */\n parse.isDigitDot = function isDigitDot(c) {\n return c >= '0' && c <= '9' || c === '.';\n };\n\n /**\n * checks if the given char c is a digit\n * @param {string} c a string with one character\n * @return {boolean}\n */\n parse.isDigit = function isDigit(c) {\n return c >= '0' && c <= '9';\n };\n\n /**\n * checks if the given char c is a hex digit\n * @param {string} c a string with one character\n * @return {boolean}\n */\n parse.isHexDigit = function isHexDigit(c) {\n return c >= '0' && c <= '9' || c >= 'a' && c <= 'f' || c >= 'A' && c <= 'F';\n };\n\n /**\n * Start of the parse levels below, in order of precedence\n * @return {Node} node\n * @private\n */\n function parseStart(expression, extraNodes) {\n var state = initialState();\n _extends(state, {\n expression,\n extraNodes\n });\n getToken(state);\n var node = parseBlock(state);\n\n // check for garbage at the end of the expression\n // an expression ends with a empty character '' and tokenType DELIMITER\n if (state.token !== '') {\n if (state.tokenType === TOKENTYPE.DELIMITER) {\n // user entered a not existing operator like \"//\"\n\n // TODO: give hints for aliases, for example with \"<>\" give as hint \" did you mean !== ?\"\n throw createError(state, 'Unexpected operator ' + state.token);\n } else {\n throw createSyntaxError(state, 'Unexpected part \"' + state.token + '\"');\n }\n }\n return node;\n }\n\n /**\n * Parse a block with expressions. Expressions can be separated by a newline\n * character '\\n', or by a semicolon ';'. In case of a semicolon, no output\n * of the preceding line is returned.\n * @return {Node} node\n * @private\n */\n function parseBlock(state) {\n var node;\n var blocks = [];\n var visible;\n if (state.token !== '' && state.token !== '\\n' && state.token !== ';') {\n node = parseAssignment(state);\n if (state.comment) {\n node.comment = state.comment;\n }\n }\n\n // TODO: simplify this loop\n while (state.token === '\\n' || state.token === ';') {\n // eslint-disable-line no-unmodified-loop-condition\n if (blocks.length === 0 && node) {\n visible = state.token !== ';';\n blocks.push({\n node,\n visible\n });\n }\n getToken(state);\n if (state.token !== '\\n' && state.token !== ';' && state.token !== '') {\n node = parseAssignment(state);\n if (state.comment) {\n node.comment = state.comment;\n }\n visible = state.token !== ';';\n blocks.push({\n node,\n visible\n });\n }\n }\n if (blocks.length > 0) {\n return new BlockNode(blocks);\n } else {\n if (!node) {\n node = new ConstantNode(undefined);\n if (state.comment) {\n node.comment = state.comment;\n }\n }\n return node;\n }\n }\n\n /**\n * Assignment of a function or variable,\n * - can be a variable like 'a=2.3'\n * - or a updating an existing variable like 'matrix(2,3:5)=[6,7,8]'\n * - defining a function like 'f(x) = x^2'\n * @return {Node} node\n * @private\n */\n function parseAssignment(state) {\n var name, args, value, valid;\n var node = parseConditional(state);\n if (state.token === '=') {\n if (isSymbolNode(node)) {\n // parse a variable assignment like 'a = 2/3'\n name = node.name;\n getTokenSkipNewline(state);\n value = parseAssignment(state);\n return new AssignmentNode(new SymbolNode(name), value);\n } else if (isAccessorNode(node)) {\n // parse a matrix subset assignment like 'A[1,2] = 4'\n getTokenSkipNewline(state);\n value = parseAssignment(state);\n return new AssignmentNode(node.object, node.index, value);\n } else if (isFunctionNode(node) && isSymbolNode(node.fn)) {\n // parse function assignment like 'f(x) = x^2'\n valid = true;\n args = [];\n name = node.name;\n node.args.forEach(function (arg, index) {\n if (isSymbolNode(arg)) {\n args[index] = arg.name;\n } else {\n valid = false;\n }\n });\n if (valid) {\n getTokenSkipNewline(state);\n value = parseAssignment(state);\n return new FunctionAssignmentNode(name, args, value);\n }\n }\n throw createSyntaxError(state, 'Invalid left hand side of assignment operator =');\n }\n return node;\n }\n\n /**\n * conditional operation\n *\n * condition ? truePart : falsePart\n *\n * Note: conditional operator is right-associative\n *\n * @return {Node} node\n * @private\n */\n function parseConditional(state) {\n var node = parseLogicalOr(state);\n while (state.token === '?') {\n // eslint-disable-line no-unmodified-loop-condition\n // set a conditional level, the range operator will be ignored as long\n // as conditionalLevel === state.nestingLevel.\n var prev = state.conditionalLevel;\n state.conditionalLevel = state.nestingLevel;\n getTokenSkipNewline(state);\n var condition = node;\n var trueExpr = parseAssignment(state);\n if (state.token !== ':') throw createSyntaxError(state, 'False part of conditional expression expected');\n state.conditionalLevel = null;\n getTokenSkipNewline(state);\n var falseExpr = parseAssignment(state); // Note: check for conditional operator again, right associativity\n\n node = new ConditionalNode(condition, trueExpr, falseExpr);\n\n // restore the previous conditional level\n state.conditionalLevel = prev;\n }\n return node;\n }\n\n /**\n * logical or, 'x or y'\n * @return {Node} node\n * @private\n */\n function parseLogicalOr(state) {\n var node = parseLogicalXor(state);\n while (state.token === 'or') {\n // eslint-disable-line no-unmodified-loop-condition\n getTokenSkipNewline(state);\n node = new OperatorNode('or', 'or', [node, parseLogicalXor(state)]);\n }\n return node;\n }\n\n /**\n * logical exclusive or, 'x xor y'\n * @return {Node} node\n * @private\n */\n function parseLogicalXor(state) {\n var node = parseLogicalAnd(state);\n while (state.token === 'xor') {\n // eslint-disable-line no-unmodified-loop-condition\n getTokenSkipNewline(state);\n node = new OperatorNode('xor', 'xor', [node, parseLogicalAnd(state)]);\n }\n return node;\n }\n\n /**\n * logical and, 'x and y'\n * @return {Node} node\n * @private\n */\n function parseLogicalAnd(state) {\n var node = parseBitwiseOr(state);\n while (state.token === 'and') {\n // eslint-disable-line no-unmodified-loop-condition\n getTokenSkipNewline(state);\n node = new OperatorNode('and', 'and', [node, parseBitwiseOr(state)]);\n }\n return node;\n }\n\n /**\n * bitwise or, 'x | y'\n * @return {Node} node\n * @private\n */\n function parseBitwiseOr(state) {\n var node = parseBitwiseXor(state);\n while (state.token === '|') {\n // eslint-disable-line no-unmodified-loop-condition\n getTokenSkipNewline(state);\n node = new OperatorNode('|', 'bitOr', [node, parseBitwiseXor(state)]);\n }\n return node;\n }\n\n /**\n * bitwise exclusive or (xor), 'x ^| y'\n * @return {Node} node\n * @private\n */\n function parseBitwiseXor(state) {\n var node = parseBitwiseAnd(state);\n while (state.token === '^|') {\n // eslint-disable-line no-unmodified-loop-condition\n getTokenSkipNewline(state);\n node = new OperatorNode('^|', 'bitXor', [node, parseBitwiseAnd(state)]);\n }\n return node;\n }\n\n /**\n * bitwise and, 'x & y'\n * @return {Node} node\n * @private\n */\n function parseBitwiseAnd(state) {\n var node = parseRelational(state);\n while (state.token === '&') {\n // eslint-disable-line no-unmodified-loop-condition\n getTokenSkipNewline(state);\n node = new OperatorNode('&', 'bitAnd', [node, parseRelational(state)]);\n }\n return node;\n }\n\n /**\n * Parse a chained conditional, like 'a > b >= c'\n * @return {Node} node\n */\n function parseRelational(state) {\n var params = [parseShift(state)];\n var conditionals = [];\n var operators = {\n '==': 'equal',\n '!=': 'unequal',\n '<': 'smaller',\n '>': 'larger',\n '<=': 'smallerEq',\n '>=': 'largerEq'\n };\n while (hasOwnProperty(operators, state.token)) {\n // eslint-disable-line no-unmodified-loop-condition\n var cond = {\n name: state.token,\n fn: operators[state.token]\n };\n conditionals.push(cond);\n getTokenSkipNewline(state);\n params.push(parseShift(state));\n }\n if (params.length === 1) {\n return params[0];\n } else if (params.length === 2) {\n return new OperatorNode(conditionals[0].name, conditionals[0].fn, params);\n } else {\n return new RelationalNode(conditionals.map(c => c.fn), params);\n }\n }\n\n /**\n * Bitwise left shift, bitwise right arithmetic shift, bitwise right logical shift\n * @return {Node} node\n * @private\n */\n function parseShift(state) {\n var node, name, fn, params;\n node = parseConversion(state);\n var operators = {\n '<<': 'leftShift',\n '>>': 'rightArithShift',\n '>>>': 'rightLogShift'\n };\n while (hasOwnProperty(operators, state.token)) {\n name = state.token;\n fn = operators[name];\n getTokenSkipNewline(state);\n params = [node, parseConversion(state)];\n node = new OperatorNode(name, fn, params);\n }\n return node;\n }\n\n /**\n * conversion operators 'to' and 'in'\n * @return {Node} node\n * @private\n */\n function parseConversion(state) {\n var node, name, fn, params;\n node = parseRange(state);\n var operators = {\n to: 'to',\n in: 'to' // alias of 'to'\n };\n\n while (hasOwnProperty(operators, state.token)) {\n name = state.token;\n fn = operators[name];\n getTokenSkipNewline(state);\n if (name === 'in' && state.token === '') {\n // end of expression -> this is the unit 'in' ('inch')\n node = new OperatorNode('*', 'multiply', [node, new SymbolNode('in')], true);\n } else {\n // operator 'a to b' or 'a in b'\n params = [node, parseRange(state)];\n node = new OperatorNode(name, fn, params);\n }\n }\n return node;\n }\n\n /**\n * parse range, \"start:end\", \"start:step:end\", \":\", \"start:\", \":end\", etc\n * @return {Node} node\n * @private\n */\n function parseRange(state) {\n var node;\n var params = [];\n if (state.token === ':') {\n // implicit start=1 (one-based)\n node = new ConstantNode(1);\n } else {\n // explicit start\n node = parseAddSubtract(state);\n }\n if (state.token === ':' && state.conditionalLevel !== state.nestingLevel) {\n // we ignore the range operator when a conditional operator is being processed on the same level\n params.push(node);\n\n // parse step and end\n while (state.token === ':' && params.length < 3) {\n // eslint-disable-line no-unmodified-loop-condition\n getTokenSkipNewline(state);\n if (state.token === ')' || state.token === ']' || state.token === ',' || state.token === '') {\n // implicit end\n params.push(new SymbolNode('end'));\n } else {\n // explicit end\n params.push(parseAddSubtract(state));\n }\n }\n if (params.length === 3) {\n // params = [start, step, end]\n node = new RangeNode(params[0], params[2], params[1]); // start, end, step\n } else {\n // length === 2\n // params = [start, end]\n node = new RangeNode(params[0], params[1]); // start, end\n }\n }\n\n return node;\n }\n\n /**\n * add or subtract\n * @return {Node} node\n * @private\n */\n function parseAddSubtract(state) {\n var node, name, fn, params;\n node = parseMultiplyDivide(state);\n var operators = {\n '+': 'add',\n '-': 'subtract'\n };\n while (hasOwnProperty(operators, state.token)) {\n name = state.token;\n fn = operators[name];\n getTokenSkipNewline(state);\n var rightNode = parseMultiplyDivide(state);\n if (rightNode.isPercentage) {\n params = [node, new OperatorNode('*', 'multiply', [node, rightNode])];\n } else {\n params = [node, rightNode];\n }\n node = new OperatorNode(name, fn, params);\n }\n return node;\n }\n\n /**\n * multiply, divide, modulus\n * @return {Node} node\n * @private\n */\n function parseMultiplyDivide(state) {\n var node, last, name, fn;\n node = parseImplicitMultiplication(state);\n last = node;\n var operators = {\n '*': 'multiply',\n '.*': 'dotMultiply',\n '/': 'divide',\n './': 'dotDivide'\n };\n while (true) {\n if (hasOwnProperty(operators, state.token)) {\n // explicit operators\n name = state.token;\n fn = operators[name];\n getTokenSkipNewline(state);\n last = parseImplicitMultiplication(state);\n node = new OperatorNode(name, fn, [node, last]);\n } else {\n break;\n }\n }\n return node;\n }\n\n /**\n * implicit multiplication\n * @return {Node} node\n * @private\n */\n function parseImplicitMultiplication(state) {\n var node, last;\n node = parseRule2(state);\n last = node;\n while (true) {\n if (state.tokenType === TOKENTYPE.SYMBOL || state.token === 'in' && isConstantNode(node) || state.tokenType === TOKENTYPE.NUMBER && !isConstantNode(last) && (!isOperatorNode(last) || last.op === '!') || state.token === '(') {\n // parse implicit multiplication\n //\n // symbol: implicit multiplication like '2a', '(2+3)a', 'a b'\n // number: implicit multiplication like '(2+3)2'\n // parenthesis: implicit multiplication like '2(3+4)', '(3+4)(1+2)'\n last = parseRule2(state);\n node = new OperatorNode('*', 'multiply', [node, last], true /* implicit */);\n } else {\n break;\n }\n }\n return node;\n }\n\n /**\n * Infamous \"rule 2\" as described in https://github.com/josdejong/mathjs/issues/792#issuecomment-361065370\n * And as amended in https://github.com/josdejong/mathjs/issues/2370#issuecomment-1054052164\n * Explicit division gets higher precedence than implicit multiplication\n * when the division matches this pattern:\n * [unaryPrefixOp]?[number] / [number] [symbol]\n * @return {Node} node\n * @private\n */\n function parseRule2(state) {\n var node = parsePercentage(state);\n var last = node;\n var tokenStates = [];\n while (true) {\n // Match the \"number /\" part of the pattern \"number / number symbol\"\n if (state.token === '/' && rule2Node(last)) {\n // Look ahead to see if the next token is a number\n tokenStates.push(_extends({}, state));\n getTokenSkipNewline(state);\n\n // Match the \"number / number\" part of the pattern\n if (state.tokenType === TOKENTYPE.NUMBER) {\n // Look ahead again\n tokenStates.push(_extends({}, state));\n getTokenSkipNewline(state);\n\n // Match the \"symbol\" part of the pattern, or a left parenthesis\n if (state.tokenType === TOKENTYPE.SYMBOL || state.token === '(') {\n // We've matched the pattern \"number / number symbol\".\n // Rewind once and build the \"number / number\" node; the symbol will be consumed later\n _extends(state, tokenStates.pop());\n tokenStates.pop();\n last = parsePercentage(state);\n node = new OperatorNode('/', 'divide', [node, last]);\n } else {\n // Not a match, so rewind\n tokenStates.pop();\n _extends(state, tokenStates.pop());\n break;\n }\n } else {\n // Not a match, so rewind\n _extends(state, tokenStates.pop());\n break;\n }\n } else {\n break;\n }\n }\n return node;\n }\n\n /**\n * percentage or mod\n * @return {Node} node\n * @private\n */\n function parsePercentage(state) {\n var node, name, fn, params;\n node = parseUnary(state);\n var operators = {\n '%': 'mod',\n mod: 'mod'\n };\n while (hasOwnProperty(operators, state.token)) {\n name = state.token;\n fn = operators[name];\n getTokenSkipNewline(state);\n if (name === '%' && state.tokenType === TOKENTYPE.DELIMITER && state.token !== '(') {\n // If the expression contains only %, then treat that as /100\n node = new OperatorNode('/', 'divide', [node, new ConstantNode(100)], false, true);\n } else {\n params = [node, parseUnary(state)];\n node = new OperatorNode(name, fn, params);\n }\n }\n return node;\n }\n\n /**\n * Unary plus and minus, and logical and bitwise not\n * @return {Node} node\n * @private\n */\n function parseUnary(state) {\n var name, params, fn;\n var operators = {\n '-': 'unaryMinus',\n '+': 'unaryPlus',\n '~': 'bitNot',\n not: 'not'\n };\n if (hasOwnProperty(operators, state.token)) {\n fn = operators[state.token];\n name = state.token;\n getTokenSkipNewline(state);\n params = [parseUnary(state)];\n return new OperatorNode(name, fn, params);\n }\n return parsePow(state);\n }\n\n /**\n * power\n * Note: power operator is right associative\n * @return {Node} node\n * @private\n */\n function parsePow(state) {\n var node, name, fn, params;\n node = parseLeftHandOperators(state);\n if (state.token === '^' || state.token === '.^') {\n name = state.token;\n fn = name === '^' ? 'pow' : 'dotPow';\n getTokenSkipNewline(state);\n params = [node, parseUnary(state)]; // Go back to unary, we can have '2^-3'\n node = new OperatorNode(name, fn, params);\n }\n return node;\n }\n\n /**\n * Left hand operators: factorial x!, ctranspose x'\n * @return {Node} node\n * @private\n */\n function parseLeftHandOperators(state) {\n var node, name, fn, params;\n node = parseCustomNodes(state);\n var operators = {\n '!': 'factorial',\n '\\'': 'ctranspose'\n };\n while (hasOwnProperty(operators, state.token)) {\n name = state.token;\n fn = operators[name];\n getToken(state);\n params = [node];\n node = new OperatorNode(name, fn, params);\n node = parseAccessors(state, node);\n }\n return node;\n }\n\n /**\n * Parse a custom node handler. A node handler can be used to process\n * nodes in a custom way, for example for handling a plot.\n *\n * A handler must be passed as second argument of the parse function.\n * - must extend math.Node\n * - must contain a function _compile(defs: Object) : string\n * - must contain a function find(filter: Object) : Node[]\n * - must contain a function toString() : string\n * - the constructor is called with a single argument containing all parameters\n *\n * For example:\n *\n * nodes = {\n * 'plot': PlotHandler\n * }\n *\n * The constructor of the handler is called as:\n *\n * node = new PlotHandler(params)\n *\n * The handler will be invoked when evaluating an expression like:\n *\n * node = math.parse('plot(sin(x), x)', nodes)\n *\n * @return {Node} node\n * @private\n */\n function parseCustomNodes(state) {\n var params = [];\n if (state.tokenType === TOKENTYPE.SYMBOL && hasOwnProperty(state.extraNodes, state.token)) {\n var CustomNode = state.extraNodes[state.token];\n getToken(state);\n\n // parse parameters\n if (state.token === '(') {\n params = [];\n openParams(state);\n getToken(state);\n if (state.token !== ')') {\n params.push(parseAssignment(state));\n\n // parse a list with parameters\n while (state.token === ',') {\n // eslint-disable-line no-unmodified-loop-condition\n getToken(state);\n params.push(parseAssignment(state));\n }\n }\n if (state.token !== ')') {\n throw createSyntaxError(state, 'Parenthesis ) expected');\n }\n closeParams(state);\n getToken(state);\n }\n\n // create a new custom node\n // noinspection JSValidateTypes\n return new CustomNode(params);\n }\n return parseSymbol(state);\n }\n\n /**\n * parse symbols: functions, variables, constants, units\n * @return {Node} node\n * @private\n */\n function parseSymbol(state) {\n var node, name;\n if (state.tokenType === TOKENTYPE.SYMBOL || state.tokenType === TOKENTYPE.DELIMITER && state.token in NAMED_DELIMITERS) {\n name = state.token;\n getToken(state);\n if (hasOwnProperty(CONSTANTS, name)) {\n // true, false, null, ...\n node = new ConstantNode(CONSTANTS[name]);\n } else if (NUMERIC_CONSTANTS.indexOf(name) !== -1) {\n // NaN, Infinity\n node = new ConstantNode(numeric(name, 'number'));\n } else {\n node = new SymbolNode(name);\n }\n\n // parse function parameters and matrix index\n node = parseAccessors(state, node);\n return node;\n }\n return parseDoubleQuotesString(state);\n }\n\n /**\n * parse accessors:\n * - function invocation in round brackets (...), for example sqrt(2)\n * - index enclosed in square brackets [...], for example A[2,3]\n * - dot notation for properties, like foo.bar\n * @param {Object} state\n * @param {Node} node Node on which to apply the parameters. If there\n * are no parameters in the expression, the node\n * itself is returned\n * @param {string[]} [types] Filter the types of notations\n * can be ['(', '[', '.']\n * @return {Node} node\n * @private\n */\n function parseAccessors(state, node, types) {\n var params;\n while ((state.token === '(' || state.token === '[' || state.token === '.') && (!types || types.indexOf(state.token) !== -1)) {\n // eslint-disable-line no-unmodified-loop-condition\n params = [];\n if (state.token === '(') {\n if (isSymbolNode(node) || isAccessorNode(node)) {\n // function invocation like fn(2, 3) or obj.fn(2, 3)\n openParams(state);\n getToken(state);\n if (state.token !== ')') {\n params.push(parseAssignment(state));\n\n // parse a list with parameters\n while (state.token === ',') {\n // eslint-disable-line no-unmodified-loop-condition\n getToken(state);\n params.push(parseAssignment(state));\n }\n }\n if (state.token !== ')') {\n throw createSyntaxError(state, 'Parenthesis ) expected');\n }\n closeParams(state);\n getToken(state);\n node = new FunctionNode(node, params);\n } else {\n // implicit multiplication like (2+3)(4+5) or sqrt(2)(1+2)\n // don't parse it here but let it be handled by parseImplicitMultiplication\n // with correct precedence\n return node;\n }\n } else if (state.token === '[') {\n // index notation like variable[2, 3]\n openParams(state);\n getToken(state);\n if (state.token !== ']') {\n params.push(parseAssignment(state));\n\n // parse a list with parameters\n while (state.token === ',') {\n // eslint-disable-line no-unmodified-loop-condition\n getToken(state);\n params.push(parseAssignment(state));\n }\n }\n if (state.token !== ']') {\n throw createSyntaxError(state, 'Parenthesis ] expected');\n }\n closeParams(state);\n getToken(state);\n node = new AccessorNode(node, new IndexNode(params));\n } else {\n // dot notation like variable.prop\n getToken(state);\n if (state.tokenType !== TOKENTYPE.SYMBOL) {\n throw createSyntaxError(state, 'Property name expected after dot');\n }\n params.push(new ConstantNode(state.token));\n getToken(state);\n var dotNotation = true;\n node = new AccessorNode(node, new IndexNode(params, dotNotation));\n }\n }\n return node;\n }\n\n /**\n * Parse a double quotes string.\n * @return {Node} node\n * @private\n */\n function parseDoubleQuotesString(state) {\n var node, str;\n if (state.token === '\"') {\n str = parseDoubleQuotesStringToken(state);\n\n // create constant\n node = new ConstantNode(str);\n\n // parse index parameters\n node = parseAccessors(state, node);\n return node;\n }\n return parseSingleQuotesString(state);\n }\n\n /**\n * Parse a string surrounded by double quotes \"...\"\n * @return {string}\n */\n function parseDoubleQuotesStringToken(state) {\n var str = '';\n while (currentCharacter(state) !== '' && currentCharacter(state) !== '\"') {\n if (currentCharacter(state) === '\\\\') {\n // escape character, immediately process the next\n // character to prevent stopping at a next '\\\"'\n str += currentCharacter(state);\n next(state);\n }\n str += currentCharacter(state);\n next(state);\n }\n getToken(state);\n if (state.token !== '\"') {\n throw createSyntaxError(state, 'End of string \" expected');\n }\n getToken(state);\n return JSON.parse('\"' + str + '\"'); // unescape escaped characters\n }\n\n /**\n * Parse a single quotes string.\n * @return {Node} node\n * @private\n */\n function parseSingleQuotesString(state) {\n var node, str;\n if (state.token === '\\'') {\n str = parseSingleQuotesStringToken(state);\n\n // create constant\n node = new ConstantNode(str);\n\n // parse index parameters\n node = parseAccessors(state, node);\n return node;\n }\n return parseMatrix(state);\n }\n\n /**\n * Parse a string surrounded by single quotes '...'\n * @return {string}\n */\n function parseSingleQuotesStringToken(state) {\n var str = '';\n while (currentCharacter(state) !== '' && currentCharacter(state) !== '\\'') {\n if (currentCharacter(state) === '\\\\') {\n // escape character, immediately process the next\n // character to prevent stopping at a next '\\''\n str += currentCharacter(state);\n next(state);\n }\n str += currentCharacter(state);\n next(state);\n }\n getToken(state);\n if (state.token !== '\\'') {\n throw createSyntaxError(state, 'End of string \\' expected');\n }\n getToken(state);\n return JSON.parse('\"' + str + '\"'); // unescape escaped characters\n }\n\n /**\n * parse the matrix\n * @return {Node} node\n * @private\n */\n function parseMatrix(state) {\n var array, params, rows, cols;\n if (state.token === '[') {\n // matrix [...]\n openParams(state);\n getToken(state);\n if (state.token !== ']') {\n // this is a non-empty matrix\n var row = parseRow(state);\n if (state.token === ';') {\n // 2 dimensional array\n rows = 1;\n params = [row];\n\n // the rows of the matrix are separated by dot-comma's\n while (state.token === ';') {\n // eslint-disable-line no-unmodified-loop-condition\n getToken(state);\n params[rows] = parseRow(state);\n rows++;\n }\n if (state.token !== ']') {\n throw createSyntaxError(state, 'End of matrix ] expected');\n }\n closeParams(state);\n getToken(state);\n\n // check if the number of columns matches in all rows\n cols = params[0].items.length;\n for (var r = 1; r < rows; r++) {\n if (params[r].items.length !== cols) {\n throw createError(state, 'Column dimensions mismatch ' + '(' + params[r].items.length + ' !== ' + cols + ')');\n }\n }\n array = new ArrayNode(params);\n } else {\n // 1 dimensional vector\n if (state.token !== ']') {\n throw createSyntaxError(state, 'End of matrix ] expected');\n }\n closeParams(state);\n getToken(state);\n array = row;\n }\n } else {\n // this is an empty matrix \"[ ]\"\n closeParams(state);\n getToken(state);\n array = new ArrayNode([]);\n }\n return parseAccessors(state, array);\n }\n return parseObject(state);\n }\n\n /**\n * Parse a single comma-separated row from a matrix, like 'a, b, c'\n * @return {ArrayNode} node\n */\n function parseRow(state) {\n var params = [parseAssignment(state)];\n var len = 1;\n while (state.token === ',') {\n // eslint-disable-line no-unmodified-loop-condition\n getToken(state);\n\n // parse expression\n params[len] = parseAssignment(state);\n len++;\n }\n return new ArrayNode(params);\n }\n\n /**\n * parse an object, enclosed in angle brackets{...}, for example {value: 2}\n * @return {Node} node\n * @private\n */\n function parseObject(state) {\n if (state.token === '{') {\n openParams(state);\n var key;\n var properties = {};\n do {\n getToken(state);\n if (state.token !== '}') {\n // parse key\n if (state.token === '\"') {\n key = parseDoubleQuotesStringToken(state);\n } else if (state.token === '\\'') {\n key = parseSingleQuotesStringToken(state);\n } else if (state.tokenType === TOKENTYPE.SYMBOL || state.tokenType === TOKENTYPE.DELIMITER && state.token in NAMED_DELIMITERS) {\n key = state.token;\n getToken(state);\n } else {\n throw createSyntaxError(state, 'Symbol or string expected as object key');\n }\n\n // parse key/value separator\n if (state.token !== ':') {\n throw createSyntaxError(state, 'Colon : expected after object key');\n }\n getToken(state);\n\n // parse key\n properties[key] = parseAssignment(state);\n }\n } while (state.token === ','); // eslint-disable-line no-unmodified-loop-condition\n\n if (state.token !== '}') {\n throw createSyntaxError(state, 'Comma , or bracket } expected after object value');\n }\n closeParams(state);\n getToken(state);\n var node = new ObjectNode(properties);\n\n // parse index parameters\n node = parseAccessors(state, node);\n return node;\n }\n return parseNumber(state);\n }\n\n /**\n * parse a number\n * @return {Node} node\n * @private\n */\n function parseNumber(state) {\n var numberStr;\n if (state.tokenType === TOKENTYPE.NUMBER) {\n // this is a number\n numberStr = state.token;\n getToken(state);\n return new ConstantNode(numeric(numberStr, config.number));\n }\n return parseParentheses(state);\n }\n\n /**\n * parentheses\n * @return {Node} node\n * @private\n */\n function parseParentheses(state) {\n var node;\n\n // check if it is a parenthesized expression\n if (state.token === '(') {\n // parentheses (...)\n openParams(state);\n getToken(state);\n node = parseAssignment(state); // start again\n\n if (state.token !== ')') {\n throw createSyntaxError(state, 'Parenthesis ) expected');\n }\n closeParams(state);\n getToken(state);\n node = new ParenthesisNode(node);\n node = parseAccessors(state, node);\n return node;\n }\n return parseEnd(state);\n }\n\n /**\n * Evaluated when the expression is not yet ended but expected to end\n * @return {Node} res\n * @private\n */\n function parseEnd(state) {\n if (state.token === '') {\n // syntax error or unexpected end of expression\n throw createSyntaxError(state, 'Unexpected end of expression');\n } else {\n throw createSyntaxError(state, 'Value expected');\n }\n }\n\n /**\n * Shortcut for getting the current row value (one based)\n * Returns the line of the currently handled expression\n * @private\n */\n /* TODO: implement keeping track on the row number\n function row () {\n return null\n }\n */\n\n /**\n * Shortcut for getting the current col value (one based)\n * Returns the column (position) where the last state.token starts\n * @private\n */\n function col(state) {\n return state.index - state.token.length + 1;\n }\n\n /**\n * Create an error\n * @param {Object} state\n * @param {string} message\n * @return {SyntaxError} instantiated error\n * @private\n */\n function createSyntaxError(state, message) {\n var c = col(state);\n var error = new SyntaxError(message + ' (char ' + c + ')');\n error.char = c;\n return error;\n }\n\n /**\n * Create an error\n * @param {Object} state\n * @param {string} message\n * @return {Error} instantiated error\n * @private\n */\n function createError(state, message) {\n var c = col(state);\n var error = new SyntaxError(message + ' (char ' + c + ')');\n error.char = c;\n return error;\n }\n\n // Now that we can parse, automatically convert strings to Nodes by parsing\n typed.addConversion({\n from: 'string',\n to: 'Node',\n convert: parse\n });\n return parse;\n});","import { deepMap } from '../../utils/collection.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'compile';\nvar dependencies = ['typed', 'parse'];\nexport var createCompile = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n parse\n } = _ref;\n /**\n * Parse and compile an expression.\n * Returns a an object with a function `evaluate([scope])` to evaluate the\n * compiled expression.\n *\n * Syntax:\n *\n * math.compile(expr) // returns one node\n * math.compile([expr1, expr2, expr3, ...]) // returns an array with nodes\n *\n * Examples:\n *\n * const code1 = math.compile('sqrt(3^2 + 4^2)')\n * code1.evaluate() // 5\n *\n * let scope = {a: 3, b: 4}\n * const code2 = math.compile('a * b') // 12\n * code2.evaluate(scope) // 12\n * scope.a = 5\n * code2.evaluate(scope) // 20\n *\n * const nodes = math.compile(['a = 3', 'b = 4', 'a * b'])\n * nodes[2].evaluate() // 12\n *\n * See also:\n *\n * parse, evaluate\n *\n * @param {string | string[] | Array | Matrix} expr\n * The expression to be compiled\n * @return {{evaluate: Function} | Array.<{evaluate: Function}>} code\n * An object with the compiled expression\n * @throws {Error}\n */\n return typed(name, {\n string: function string(expr) {\n return parse(expr).compile();\n },\n 'Array | Matrix': function ArrayMatrix(expr) {\n return deepMap(expr, function (entry) {\n return parse(entry).compile();\n });\n }\n });\n});","import { deepMap } from '../../utils/collection.js';\nimport { factory } from '../../utils/factory.js';\nimport { createEmptyMap } from '../../utils/map.js';\nvar name = 'evaluate';\nvar dependencies = ['typed', 'parse'];\nexport var createEvaluate = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n parse\n } = _ref;\n /**\n * Evaluate an expression.\n *\n * Note the evaluating arbitrary expressions may involve security risks,\n * see [https://mathjs.org/docs/expressions/security.html](https://mathjs.org/docs/expressions/security.html) for more information.\n *\n * Syntax:\n *\n * math.evaluate(expr)\n * math.evaluate(expr, scope)\n * math.evaluate([expr1, expr2, expr3, ...])\n * math.evaluate([expr1, expr2, expr3, ...], scope)\n *\n * Example:\n *\n * math.evaluate('(2+3)/4') // 1.25\n * math.evaluate('sqrt(3^2 + 4^2)') // 5\n * math.evaluate('sqrt(-4)') // 2i\n * math.evaluate(['a=3', 'b=4', 'a*b']) // [3, 4, 12]\n *\n * let scope = {a:3, b:4}\n * math.evaluate('a * b', scope) // 12\n *\n * See also:\n *\n * parse, compile\n *\n * @param {string | string[] | Matrix} expr The expression to be evaluated\n * @param {Object} [scope] Scope to read/write variables\n * @return {*} The result of the expression\n * @throws {Error}\n */\n return typed(name, {\n string: function string(expr) {\n var scope = createEmptyMap();\n return parse(expr).compile().evaluate(scope);\n },\n 'string, Map | Object': function stringMapObject(expr, scope) {\n return parse(expr).compile().evaluate(scope);\n },\n 'Array | Matrix': function ArrayMatrix(expr) {\n var scope = createEmptyMap();\n return deepMap(expr, function (entry) {\n return parse(entry).compile().evaluate(scope);\n });\n },\n 'Array | Matrix, Map | Object': function ArrayMatrixMapObject(expr, scope) {\n return deepMap(expr, function (entry) {\n return parse(entry).compile().evaluate(scope);\n });\n }\n });\n});","import { factory } from '../utils/factory.js';\nimport { createEmptyMap, toObject } from '../utils/map.js';\nvar name = 'Parser';\nvar dependencies = ['evaluate'];\nexport var createParserClass = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n evaluate\n } = _ref;\n /**\n * @constructor Parser\n * Parser contains methods to evaluate or parse expressions, and has a number\n * of convenience methods to get, set, and remove variables from memory. Parser\n * keeps a scope containing variables in memory, which is used for all\n * evaluations.\n *\n * Methods:\n * const result = parser.evaluate(expr) // evaluate an expression\n * const value = parser.get(name) // retrieve a variable from the parser\n * const values = parser.getAll() // retrieve all defined variables\n * parser.set(name, value) // set a variable in the parser\n * parser.remove(name) // clear a variable from the\n * // parsers scope\n * parser.clear() // clear the parsers scope\n *\n * Example usage:\n * const parser = new Parser()\n * // Note: there is a convenience method which can be used instead:\n * // const parser = new math.parser()\n *\n * // evaluate expressions\n * parser.evaluate('sqrt(3^2 + 4^2)') // 5\n * parser.evaluate('sqrt(-4)') // 2i\n * parser.evaluate('2 inch in cm') // 5.08 cm\n * parser.evaluate('cos(45 deg)') // 0.7071067811865476\n *\n * // define variables and functions\n * parser.evaluate('x = 7 / 2') // 3.5\n * parser.evaluate('x + 3') // 6.5\n * parser.evaluate('f(x, y) = x^y') // f(x, y)\n * parser.evaluate('f(2, 3)') // 8\n *\n * // get and set variables and functions\n * const x = parser.get('x') // 3.5\n * const f = parser.get('f') // function\n * const g = f(3, 2) // 9\n * parser.set('h', 500)\n * const i = parser.evaluate('h / 2') // 250\n * parser.set('hello', function (name) {\n * return 'hello, ' + name + '!'\n * })\n * parser.evaluate('hello(\"user\")') // \"hello, user!\"\n *\n * // clear defined functions and variables\n * parser.clear()\n *\n */\n function Parser() {\n if (!(this instanceof Parser)) {\n throw new SyntaxError('Constructor must be called with the new operator');\n }\n Object.defineProperty(this, 'scope', {\n value: createEmptyMap(),\n writable: false\n });\n }\n\n /**\n * Attach type information\n */\n Parser.prototype.type = 'Parser';\n Parser.prototype.isParser = true;\n\n /**\n * Parse and evaluate the given expression\n * @param {string | string[]} expr A string containing an expression,\n * for example \"2+3\", or a list with expressions\n * @return {*} result The result, or undefined when the expression was empty\n * @throws {Error}\n */\n Parser.prototype.evaluate = function (expr) {\n // TODO: validate arguments\n return evaluate(expr, this.scope);\n };\n\n /**\n * Get a variable (a function or variable) by name from the parsers scope.\n * Returns undefined when not found\n * @param {string} name\n * @return {* | undefined} value\n */\n Parser.prototype.get = function (name) {\n // TODO: validate arguments\n if (this.scope.has(name)) {\n return this.scope.get(name);\n }\n };\n\n /**\n * Get a map with all defined variables\n * @return {Object} values\n */\n Parser.prototype.getAll = function () {\n return toObject(this.scope);\n };\n\n /**\n * Get a map with all defined variables\n * @return {Map} values\n */\n Parser.prototype.getAllAsMap = function () {\n return this.scope;\n };\n\n /**\n * Set a symbol (a function or variable) by name from the parsers scope.\n * @param {string} name\n * @param {* | undefined} value\n */\n Parser.prototype.set = function (name, value) {\n this.scope.set(name, value);\n return value;\n };\n\n /**\n * Remove a variable from the parsers scope\n * @param {string} name\n */\n Parser.prototype.remove = function (name) {\n this.scope.delete(name);\n };\n\n /**\n * Clear the scope with variables and functions\n */\n Parser.prototype.clear = function () {\n this.scope.clear();\n };\n return Parser;\n}, {\n isClass: true\n});","import { factory } from '../../utils/factory.js';\nvar name = 'parser';\nvar dependencies = ['typed', 'Parser'];\nexport var createParser = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n Parser\n } = _ref;\n /**\n * Create a parser. The function creates a new `math.Parser` object.\n *\n * Syntax:\n *\n * math.parser()\n *\n * Examples:\n *\n * const parser = new math.parser()\n *\n * // evaluate expressions\n * const a = parser.evaluate('sqrt(3^2 + 4^2)') // 5\n * const b = parser.evaluate('sqrt(-4)') // 2i\n * const c = parser.evaluate('2 inch in cm') // 5.08 cm\n * const d = parser.evaluate('cos(45 deg)') // 0.7071067811865476\n *\n * // define variables and functions\n * parser.evaluate('x = 7 / 2') // 3.5\n * parser.evaluate('x + 3') // 6.5\n * parser.evaluate('f(x, y) = x^y') // f(x, y)\n * parser.evaluate('f(2, 3)') // 8\n *\n * // get and set variables and functions\n * const x = parser.get('x') // 3.5\n * const f = parser.get('f') // function\n * const g = f(3, 2) // 9\n * parser.set('h', 500)\n * const i = parser.evaluate('h / 2') // 250\n * parser.set('hello', function (name) {\n * return 'hello, ' + name + '!'\n * })\n * parser.evaluate('hello(\"user\")') // \"hello, user!\"\n *\n * // clear defined functions and variables\n * parser.clear()\n *\n * See also:\n *\n * evaluate, compile, parse\n *\n * @return {Parser} Parser\n */\n return typed(name, {\n '': function _() {\n return new Parser();\n }\n });\n});","import { clone } from '../../../utils/object.js';\nimport { factory } from '../../../utils/factory.js';\nvar name = 'lup';\nvar dependencies = ['typed', 'matrix', 'abs', 'addScalar', 'divideScalar', 'multiplyScalar', 'subtract', 'larger', 'equalScalar', 'unaryMinus', 'DenseMatrix', 'SparseMatrix', 'Spa'];\nexport var createLup = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n matrix,\n abs,\n addScalar,\n divideScalar,\n multiplyScalar,\n subtract,\n larger,\n equalScalar,\n unaryMinus,\n DenseMatrix,\n SparseMatrix,\n Spa\n } = _ref;\n /**\n * Calculate the Matrix LU decomposition with partial pivoting. Matrix `A` is decomposed in two matrices (`L`, `U`) and a\n * row permutation vector `p` where `A[p,:] = L * U`\n *\n * Syntax:\n *\n * math.lup(A)\n *\n * Example:\n *\n * const m = [[2, 1], [1, 4]]\n * const r = math.lup(m)\n * // r = {\n * // L: [[1, 0], [0.5, 1]],\n * // U: [[2, 1], [0, 3.5]],\n * // P: [0, 1]\n * // }\n *\n * See also:\n *\n * slu, lsolve, lusolve, usolve\n *\n * @param {Matrix | Array} A A two dimensional matrix or array for which to get the LUP decomposition.\n *\n * @return {{L: Array | Matrix, U: Array | Matrix, P: Array.}} The lower triangular matrix, the upper triangular matrix and the permutation matrix.\n */\n return typed(name, {\n DenseMatrix: function DenseMatrix(m) {\n return _denseLUP(m);\n },\n SparseMatrix: function SparseMatrix(m) {\n return _sparseLUP(m);\n },\n Array: function Array(a) {\n // create dense matrix from array\n var m = matrix(a);\n // lup, use matrix implementation\n var r = _denseLUP(m);\n // result\n return {\n L: r.L.valueOf(),\n U: r.U.valueOf(),\n p: r.p\n };\n }\n });\n function _denseLUP(m) {\n // rows & columns\n var rows = m._size[0];\n var columns = m._size[1];\n // minimum rows and columns\n var n = Math.min(rows, columns);\n // matrix array, clone original data\n var data = clone(m._data);\n // l matrix arrays\n var ldata = [];\n var lsize = [rows, n];\n // u matrix arrays\n var udata = [];\n var usize = [n, columns];\n // vars\n var i, j, k;\n // permutation vector\n var p = [];\n for (i = 0; i < rows; i++) {\n p[i] = i;\n }\n // loop columns\n for (j = 0; j < columns; j++) {\n // skip first column in upper triangular matrix\n if (j > 0) {\n // loop rows\n for (i = 0; i < rows; i++) {\n // min i,j\n var min = Math.min(i, j);\n // v[i, j]\n var s = 0;\n // loop up to min\n for (k = 0; k < min; k++) {\n // s = l[i, k] - data[k, j]\n s = addScalar(s, multiplyScalar(data[i][k], data[k][j]));\n }\n data[i][j] = subtract(data[i][j], s);\n }\n }\n // row with larger value in cvector, row >= j\n var pi = j;\n var pabsv = 0;\n var vjj = 0;\n // loop rows\n for (i = j; i < rows; i++) {\n // data @ i, j\n var v = data[i][j];\n // absolute value\n var absv = abs(v);\n // value is greater than pivote value\n if (larger(absv, pabsv)) {\n // store row\n pi = i;\n // update max value\n pabsv = absv;\n // value @ [j, j]\n vjj = v;\n }\n }\n // swap rows (j <-> pi)\n if (j !== pi) {\n // swap values j <-> pi in p\n p[j] = [p[pi], p[pi] = p[j]][0];\n // swap j <-> pi in data\n DenseMatrix._swapRows(j, pi, data);\n }\n // check column is in lower triangular matrix\n if (j < rows) {\n // loop rows (lower triangular matrix)\n for (i = j + 1; i < rows; i++) {\n // value @ i, j\n var vij = data[i][j];\n if (!equalScalar(vij, 0)) {\n // update data\n data[i][j] = divideScalar(data[i][j], vjj);\n }\n }\n }\n }\n // loop columns\n for (j = 0; j < columns; j++) {\n // loop rows\n for (i = 0; i < rows; i++) {\n // initialize row in arrays\n if (j === 0) {\n // check row exists in upper triangular matrix\n if (i < columns) {\n // U\n udata[i] = [];\n }\n // L\n ldata[i] = [];\n }\n // check we are in the upper triangular matrix\n if (i < j) {\n // check row exists in upper triangular matrix\n if (i < columns) {\n // U\n udata[i][j] = data[i][j];\n }\n // check column exists in lower triangular matrix\n if (j < rows) {\n // L\n ldata[i][j] = 0;\n }\n continue;\n }\n // diagonal value\n if (i === j) {\n // check row exists in upper triangular matrix\n if (i < columns) {\n // U\n udata[i][j] = data[i][j];\n }\n // check column exists in lower triangular matrix\n if (j < rows) {\n // L\n ldata[i][j] = 1;\n }\n continue;\n }\n // check row exists in upper triangular matrix\n if (i < columns) {\n // U\n udata[i][j] = 0;\n }\n // check column exists in lower triangular matrix\n if (j < rows) {\n // L\n ldata[i][j] = data[i][j];\n }\n }\n }\n // l matrix\n var l = new DenseMatrix({\n data: ldata,\n size: lsize\n });\n // u matrix\n var u = new DenseMatrix({\n data: udata,\n size: usize\n });\n // p vector\n var pv = [];\n for (i = 0, n = p.length; i < n; i++) {\n pv[p[i]] = i;\n }\n // return matrices\n return {\n L: l,\n U: u,\n p: pv,\n toString: function toString() {\n return 'L: ' + this.L.toString() + '\\nU: ' + this.U.toString() + '\\nP: ' + this.p;\n }\n };\n }\n function _sparseLUP(m) {\n // rows & columns\n var rows = m._size[0];\n var columns = m._size[1];\n // minimum rows and columns\n var n = Math.min(rows, columns);\n // matrix arrays (will not be modified, thanks to permutation vector)\n var values = m._values;\n var index = m._index;\n var ptr = m._ptr;\n // l matrix arrays\n var lvalues = [];\n var lindex = [];\n var lptr = [];\n var lsize = [rows, n];\n // u matrix arrays\n var uvalues = [];\n var uindex = [];\n var uptr = [];\n var usize = [n, columns];\n // vars\n var i, j, k;\n // permutation vectors, (current index -> original index) and (original index -> current index)\n var pvCo = [];\n var pvOc = [];\n for (i = 0; i < rows; i++) {\n pvCo[i] = i;\n pvOc[i] = i;\n }\n // swap indices in permutation vectors (condition x < y)!\n var swapIndeces = function swapIndeces(x, y) {\n // find pv indeces getting data from x and y\n var kx = pvOc[x];\n var ky = pvOc[y];\n // update permutation vector current -> original\n pvCo[kx] = y;\n pvCo[ky] = x;\n // update permutation vector original -> current\n pvOc[x] = ky;\n pvOc[y] = kx;\n };\n // loop columns\n var _loop = function _loop() {\n // sparse accumulator\n var spa = new Spa();\n // check lower triangular matrix has a value @ column j\n if (j < rows) {\n // update ptr\n lptr.push(lvalues.length);\n // first value in j column for lower triangular matrix\n lvalues.push(1);\n lindex.push(j);\n }\n // update ptr\n uptr.push(uvalues.length);\n // k0 <= k < k1 where k0 = _ptr[j] && k1 = _ptr[j+1]\n var k0 = ptr[j];\n var k1 = ptr[j + 1];\n // copy column j into sparse accumulator\n for (k = k0; k < k1; k++) {\n // row\n i = index[k];\n // copy column values into sparse accumulator (use permutation vector)\n spa.set(pvCo[i], values[k]);\n }\n // skip first column in upper triangular matrix\n if (j > 0) {\n // loop rows in column j (above diagonal)\n spa.forEach(0, j - 1, function (k, vkj) {\n // loop rows in column k (L)\n SparseMatrix._forEachRow(k, lvalues, lindex, lptr, function (i, vik) {\n // check row is below k\n if (i > k) {\n // update spa value\n spa.accumulate(i, unaryMinus(multiplyScalar(vik, vkj)));\n }\n });\n });\n }\n // row with larger value in spa, row >= j\n var pi = j;\n var vjj = spa.get(j);\n var pabsv = abs(vjj);\n // loop values in spa (order by row, below diagonal)\n spa.forEach(j + 1, rows - 1, function (x, v) {\n // absolute value\n var absv = abs(v);\n // value is greater than pivote value\n if (larger(absv, pabsv)) {\n // store row\n pi = x;\n // update max value\n pabsv = absv;\n // value @ [j, j]\n vjj = v;\n }\n });\n // swap rows (j <-> pi)\n if (j !== pi) {\n // swap values j <-> pi in L\n SparseMatrix._swapRows(j, pi, lsize[1], lvalues, lindex, lptr);\n // swap values j <-> pi in U\n SparseMatrix._swapRows(j, pi, usize[1], uvalues, uindex, uptr);\n // swap values in spa\n spa.swap(j, pi);\n // update permutation vector (swap values @ j, pi)\n swapIndeces(j, pi);\n }\n // loop values in spa (order by row)\n spa.forEach(0, rows - 1, function (x, v) {\n // check we are above diagonal\n if (x <= j) {\n // update upper triangular matrix\n uvalues.push(v);\n uindex.push(x);\n } else {\n // update value\n v = divideScalar(v, vjj);\n // check value is non zero\n if (!equalScalar(v, 0)) {\n // update lower triangular matrix\n lvalues.push(v);\n lindex.push(x);\n }\n }\n });\n };\n for (j = 0; j < columns; j++) {\n _loop();\n }\n // update ptrs\n uptr.push(uvalues.length);\n lptr.push(lvalues.length);\n\n // return matrices\n return {\n L: new SparseMatrix({\n values: lvalues,\n index: lindex,\n ptr: lptr,\n size: lsize\n }),\n U: new SparseMatrix({\n values: uvalues,\n index: uindex,\n ptr: uptr,\n size: usize\n }),\n p: pvCo,\n toString: function toString() {\n return 'L: ' + this.L.toString() + '\\nU: ' + this.U.toString() + '\\nP: ' + this.p;\n }\n };\n }\n});","import _extends from \"@babel/runtime/helpers/extends\";\nimport { factory } from '../../../utils/factory.js';\nvar name = 'qr';\nvar dependencies = ['typed', 'matrix', 'zeros', 'identity', 'isZero', 'equal', 'sign', 'sqrt', 'conj', 'unaryMinus', 'addScalar', 'divideScalar', 'multiplyScalar', 'subtract', 'complex'];\nexport var createQr = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n matrix,\n zeros,\n identity,\n isZero,\n equal,\n sign,\n sqrt,\n conj,\n unaryMinus,\n addScalar,\n divideScalar,\n multiplyScalar,\n subtract,\n complex\n } = _ref;\n /**\n * Calculate the Matrix QR decomposition. Matrix `A` is decomposed in\n * two matrices (`Q`, `R`) where `Q` is an\n * orthogonal matrix and `R` is an upper triangular matrix.\n *\n * Syntax:\n *\n * math.qr(A)\n *\n * Example:\n *\n * const m = [\n * [1, -1, 4],\n * [1, 4, -2],\n * [1, 4, 2],\n * [1, -1, 0]\n * ]\n * const result = math.qr(m)\n * // r = {\n * // Q: [\n * // [0.5, -0.5, 0.5],\n * // [0.5, 0.5, -0.5],\n * // [0.5, 0.5, 0.5],\n * // [0.5, -0.5, -0.5],\n * // ],\n * // R: [\n * // [2, 3, 2],\n * // [0, 5, -2],\n * // [0, 0, 4],\n * // [0, 0, 0]\n * // ]\n * // }\n *\n * See also:\n *\n * lup, lusolve\n *\n * @param {Matrix | Array} A A two dimensional matrix or array\n * for which to get the QR decomposition.\n *\n * @return {{Q: Array | Matrix, R: Array | Matrix}} Q: the orthogonal\n * matrix and R: the upper triangular matrix\n */\n return _extends(typed(name, {\n DenseMatrix: function DenseMatrix(m) {\n return _denseQR(m);\n },\n SparseMatrix: function SparseMatrix(m) {\n return _sparseQR(m);\n },\n Array: function Array(a) {\n // create dense matrix from array\n var m = matrix(a);\n // lup, use matrix implementation\n var r = _denseQR(m);\n // result\n return {\n Q: r.Q.valueOf(),\n R: r.R.valueOf()\n };\n }\n }), {\n _denseQRimpl\n });\n function _denseQRimpl(m) {\n // rows & columns (m x n)\n var rows = m._size[0]; // m\n var cols = m._size[1]; // n\n\n var Q = identity([rows], 'dense');\n var Qdata = Q._data;\n var R = m.clone();\n var Rdata = R._data;\n\n // vars\n var i, j, k;\n var w = zeros([rows], '');\n for (k = 0; k < Math.min(cols, rows); ++k) {\n /*\n * **k-th Household matrix**\n *\n * The matrix I - 2*v*transpose(v)\n * x = first column of A\n * x1 = first element of x\n * alpha = x1 / |x1| * |x|\n * e1 = tranpose([1, 0, 0, ...])\n * u = x - alpha * e1\n * v = u / |u|\n *\n * Household matrix = I - 2 * v * tranpose(v)\n *\n * * Initially Q = I and R = A.\n * * Household matrix is a reflection in a plane normal to v which\n * will zero out all but the top right element in R.\n * * Appplying reflection to both Q and R will not change product.\n * * Repeat this process on the (1,1) minor to get R as an upper\n * triangular matrix.\n * * Reflections leave the magnitude of the columns of Q unchanged\n * so Q remains othoganal.\n *\n */\n\n var pivot = Rdata[k][k];\n var sgn = unaryMinus(equal(pivot, 0) ? 1 : sign(pivot));\n var conjSgn = conj(sgn);\n var alphaSquared = 0;\n for (i = k; i < rows; i++) {\n alphaSquared = addScalar(alphaSquared, multiplyScalar(Rdata[i][k], conj(Rdata[i][k])));\n }\n var alpha = multiplyScalar(sgn, sqrt(alphaSquared));\n if (!isZero(alpha)) {\n // first element in vector u\n var u1 = subtract(pivot, alpha);\n\n // w = v * u1 / |u| (only elements k to (rows-1) are used)\n w[k] = 1;\n for (i = k + 1; i < rows; i++) {\n w[i] = divideScalar(Rdata[i][k], u1);\n }\n\n // tau = - conj(u1 / alpha)\n var tau = unaryMinus(conj(divideScalar(u1, alpha)));\n var s = void 0;\n\n /*\n * tau and w have been choosen so that\n *\n * 2 * v * tranpose(v) = tau * w * tranpose(w)\n */\n\n /*\n * -- calculate R = R - tau * w * tranpose(w) * R --\n * Only do calculation with rows k to (rows-1)\n * Additionally columns 0 to (k-1) will not be changed by this\n * multiplication so do not bother recalculating them\n */\n for (j = k; j < cols; j++) {\n s = 0.0;\n\n // calculate jth element of [tranpose(w) * R]\n for (i = k; i < rows; i++) {\n s = addScalar(s, multiplyScalar(conj(w[i]), Rdata[i][j]));\n }\n\n // calculate the jth element of [tau * transpose(w) * R]\n s = multiplyScalar(s, tau);\n for (i = k; i < rows; i++) {\n Rdata[i][j] = multiplyScalar(subtract(Rdata[i][j], multiplyScalar(w[i], s)), conjSgn);\n }\n }\n /*\n * -- calculate Q = Q - tau * Q * w * transpose(w) --\n * Q is a square matrix (rows x rows)\n * Only do calculation with columns k to (rows-1)\n * Additionally rows 0 to (k-1) will not be changed by this\n * multiplication so do not bother recalculating them\n */\n for (i = 0; i < rows; i++) {\n s = 0.0;\n\n // calculate ith element of [Q * w]\n for (j = k; j < rows; j++) {\n s = addScalar(s, multiplyScalar(Qdata[i][j], w[j]));\n }\n\n // calculate the ith element of [tau * Q * w]\n s = multiplyScalar(s, tau);\n for (j = k; j < rows; ++j) {\n Qdata[i][j] = divideScalar(subtract(Qdata[i][j], multiplyScalar(s, conj(w[j]))), conjSgn);\n }\n }\n }\n }\n\n // return matrices\n return {\n Q,\n R,\n toString: function toString() {\n return 'Q: ' + this.Q.toString() + '\\nR: ' + this.R.toString();\n }\n };\n }\n function _denseQR(m) {\n var ret = _denseQRimpl(m);\n var Rdata = ret.R._data;\n if (m._data.length > 0) {\n var zero = Rdata[0][0].type === 'Complex' ? complex(0) : 0;\n for (var i = 0; i < Rdata.length; ++i) {\n for (var j = 0; j < i && j < (Rdata[0] || []).length; ++j) {\n Rdata[i][j] = zero;\n }\n }\n }\n return ret;\n }\n function _sparseQR(m) {\n throw new Error('qr not implemented for sparse matrices yet');\n }\n});","/**\n * Depth-first search and postorder of a tree rooted at node j\n *\n * @param {Number} j The tree node\n * @param {Number} k\n * @param {Array} w The workspace array\n * @param {Number} head The index offset within the workspace for the head array\n * @param {Number} next The index offset within the workspace for the next array\n * @param {Array} post The post ordering array\n * @param {Number} stack The index offset within the workspace for the stack array\n *\n * Reference: http://faculty.cse.tamu.edu/davis/publications.html\n */\nexport function csTdfs(j, k, w, head, next, post, stack) {\n // variables\n var top = 0;\n // place j on the stack\n w[stack] = j;\n // while (stack is not empty)\n while (top >= 0) {\n // p = top of stack\n var p = w[stack + top];\n // i = youngest child of p\n var i = w[head + p];\n if (i === -1) {\n // p has no unordered children left\n top--;\n // node p is the kth postordered node\n post[k++] = p;\n } else {\n // remove i from children of p\n w[head + p] = w[next + i];\n // increment top\n ++top;\n // start dfs on child node i\n w[stack + top] = i;\n }\n }\n return k;\n}","/**\n * This function \"flips\" its input about the integer -1.\n *\n * @param {Number} i The value to flip\n *\n * Reference: http://faculty.cse.tamu.edu/davis/publications.html\n */\nexport function csFlip(i) {\n // flip the value\n return -i - 2;\n}","import { factory } from '../../../utils/factory.js';\nimport { csFkeep } from './csFkeep.js';\nimport { csFlip } from './csFlip.js';\nimport { csTdfs } from './csTdfs.js';\nvar name = 'csAmd';\nvar dependencies = ['add', 'multiply', 'transpose'];\nexport var createCsAmd = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n add,\n multiply,\n transpose\n } = _ref;\n /**\n * Approximate minimum degree ordering. The minimum degree algorithm is a widely used\n * heuristic for finding a permutation P so that P*A*P' has fewer nonzeros in its factorization\n * than A. It is a gready method that selects the sparsest pivot row and column during the course\n * of a right looking sparse Cholesky factorization.\n *\n * Reference: http://faculty.cse.tamu.edu/davis/publications.html\n *\n * @param {Number} order 0: Natural, 1: Cholesky, 2: LU, 3: QR\n * @param {Matrix} m Sparse Matrix\n */\n return function csAmd(order, a) {\n // check input parameters\n if (!a || order <= 0 || order > 3) {\n return null;\n }\n // a matrix arrays\n var asize = a._size;\n // rows and columns\n var m = asize[0];\n var n = asize[1];\n // initialize vars\n var lemax = 0;\n // dense threshold\n var dense = Math.max(16, 10 * Math.sqrt(n));\n dense = Math.min(n - 2, dense);\n // create target matrix C\n var cm = _createTargetMatrix(order, a, m, n, dense);\n // drop diagonal entries\n csFkeep(cm, _diag, null);\n // C matrix arrays\n var cindex = cm._index;\n var cptr = cm._ptr;\n\n // number of nonzero elements in C\n var cnz = cptr[n];\n\n // allocate result (n+1)\n var P = [];\n\n // create workspace (8 * (n + 1))\n var W = [];\n var len = 0; // first n + 1 entries\n var nv = n + 1; // next n + 1 entries\n var next = 2 * (n + 1); // next n + 1 entries\n var head = 3 * (n + 1); // next n + 1 entries\n var elen = 4 * (n + 1); // next n + 1 entries\n var degree = 5 * (n + 1); // next n + 1 entries\n var w = 6 * (n + 1); // next n + 1 entries\n var hhead = 7 * (n + 1); // last n + 1 entries\n\n // use P as workspace for last\n var last = P;\n\n // initialize quotient graph\n var mark = _initializeQuotientGraph(n, cptr, W, len, head, last, next, hhead, nv, w, elen, degree);\n\n // initialize degree lists\n var nel = _initializeDegreeLists(n, cptr, W, degree, elen, w, dense, nv, head, last, next);\n\n // minimum degree node\n var mindeg = 0;\n\n // vars\n var i, j, k, k1, k2, e, pj, ln, nvi, pk, eln, p1, p2, pn, h, d;\n\n // while (selecting pivots) do\n while (nel < n) {\n // select node of minimum approximate degree. amd() is now ready to start eliminating the graph. It first\n // finds a node k of minimum degree and removes it from its degree list. The variable nel keeps track of thow\n // many nodes have been eliminated.\n for (k = -1; mindeg < n && (k = W[head + mindeg]) === -1; mindeg++);\n if (W[next + k] !== -1) {\n last[W[next + k]] = -1;\n }\n // remove k from degree list\n W[head + mindeg] = W[next + k];\n // elenk = |Ek|\n var elenk = W[elen + k];\n // # of nodes k represents\n var nvk = W[nv + k];\n // W[nv + k] nodes of A eliminated\n nel += nvk;\n\n // Construct a new element. The new element Lk is constructed in place if |Ek| = 0. nv[i] is\n // negated for all nodes i in Lk to flag them as members of this set. Each node i is removed from the\n // degree lists. All elements e in Ek are absorved into element k.\n var dk = 0;\n // flag k as in Lk\n W[nv + k] = -nvk;\n var p = cptr[k];\n // do in place if W[elen + k] === 0\n var pk1 = elenk === 0 ? p : cnz;\n var pk2 = pk1;\n for (k1 = 1; k1 <= elenk + 1; k1++) {\n if (k1 > elenk) {\n // search the nodes in k\n e = k;\n // list of nodes starts at cindex[pj]\n pj = p;\n // length of list of nodes in k\n ln = W[len + k] - elenk;\n } else {\n // search the nodes in e\n e = cindex[p++];\n pj = cptr[e];\n // length of list of nodes in e\n ln = W[len + e];\n }\n for (k2 = 1; k2 <= ln; k2++) {\n i = cindex[pj++];\n // check node i dead, or seen\n if ((nvi = W[nv + i]) <= 0) {\n continue;\n }\n // W[degree + Lk] += size of node i\n dk += nvi;\n // negate W[nv + i] to denote i in Lk\n W[nv + i] = -nvi;\n // place i in Lk\n cindex[pk2++] = i;\n if (W[next + i] !== -1) {\n last[W[next + i]] = last[i];\n }\n // check we need to remove i from degree list\n if (last[i] !== -1) {\n W[next + last[i]] = W[next + i];\n } else {\n W[head + W[degree + i]] = W[next + i];\n }\n }\n if (e !== k) {\n // absorb e into k\n cptr[e] = csFlip(k);\n // e is now a dead element\n W[w + e] = 0;\n }\n }\n // cindex[cnz...nzmax] is free\n if (elenk !== 0) {\n cnz = pk2;\n }\n // external degree of k - |Lk\\i|\n W[degree + k] = dk;\n // element k is in cindex[pk1..pk2-1]\n cptr[k] = pk1;\n W[len + k] = pk2 - pk1;\n // k is now an element\n W[elen + k] = -2;\n\n // Find set differences. The scan1 function now computes the set differences |Le \\ Lk| for all elements e. At the start of the\n // scan, no entry in the w array is greater than or equal to mark.\n\n // clear w if necessary\n mark = _wclear(mark, lemax, W, w, n);\n // scan 1: find |Le\\Lk|\n for (pk = pk1; pk < pk2; pk++) {\n i = cindex[pk];\n // check if W[elen + i] empty, skip it\n if ((eln = W[elen + i]) <= 0) {\n continue;\n }\n // W[nv + i] was negated\n nvi = -W[nv + i];\n var wnvi = mark - nvi;\n // scan Ei\n for (p = cptr[i], p1 = cptr[i] + eln - 1; p <= p1; p++) {\n e = cindex[p];\n if (W[w + e] >= mark) {\n // decrement |Le\\Lk|\n W[w + e] -= nvi;\n } else if (W[w + e] !== 0) {\n // ensure e is a live element, 1st time e seen in scan 1\n W[w + e] = W[degree + e] + wnvi;\n }\n }\n }\n\n // degree update\n // The second pass computes the approximate degree di, prunes the sets Ei and Ai, and computes a hash\n // function h(i) for all nodes in Lk.\n\n // scan2: degree update\n for (pk = pk1; pk < pk2; pk++) {\n // consider node i in Lk\n i = cindex[pk];\n p1 = cptr[i];\n p2 = p1 + W[elen + i] - 1;\n pn = p1;\n // scan Ei\n for (h = 0, d = 0, p = p1; p <= p2; p++) {\n e = cindex[p];\n // check e is an unabsorbed element\n if (W[w + e] !== 0) {\n // dext = |Le\\Lk|\n var dext = W[w + e] - mark;\n if (dext > 0) {\n // sum up the set differences\n d += dext;\n // keep e in Ei\n cindex[pn++] = e;\n // compute the hash of node i\n h += e;\n } else {\n // aggressive absorb. e->k\n cptr[e] = csFlip(k);\n // e is a dead element\n W[w + e] = 0;\n }\n }\n }\n // W[elen + i] = |Ei|\n W[elen + i] = pn - p1 + 1;\n var p3 = pn;\n var p4 = p1 + W[len + i];\n // prune edges in Ai\n for (p = p2 + 1; p < p4; p++) {\n j = cindex[p];\n // check node j dead or in Lk\n var nvj = W[nv + j];\n if (nvj <= 0) {\n continue;\n }\n // degree(i) += |j|\n d += nvj;\n // place j in node list of i\n cindex[pn++] = j;\n // compute hash for node i\n h += j;\n }\n // check for mass elimination\n if (d === 0) {\n // absorb i into k\n cptr[i] = csFlip(k);\n nvi = -W[nv + i];\n // |Lk| -= |i|\n dk -= nvi;\n // |k| += W[nv + i]\n nvk += nvi;\n nel += nvi;\n W[nv + i] = 0;\n // node i is dead\n W[elen + i] = -1;\n } else {\n // update degree(i)\n W[degree + i] = Math.min(W[degree + i], d);\n // move first node to end\n cindex[pn] = cindex[p3];\n // move 1st el. to end of Ei\n cindex[p3] = cindex[p1];\n // add k as 1st element in of Ei\n cindex[p1] = k;\n // new len of adj. list of node i\n W[len + i] = pn - p1 + 1;\n // finalize hash of i\n h = (h < 0 ? -h : h) % n;\n // place i in hash bucket\n W[next + i] = W[hhead + h];\n W[hhead + h] = i;\n // save hash of i in last[i]\n last[i] = h;\n }\n }\n // finalize |Lk|\n W[degree + k] = dk;\n lemax = Math.max(lemax, dk);\n // clear w\n mark = _wclear(mark + lemax, lemax, W, w, n);\n\n // Supernode detection. Supernode detection relies on the hash function h(i) computed for each node i.\n // If two nodes have identical adjacency lists, their hash functions wil be identical.\n for (pk = pk1; pk < pk2; pk++) {\n i = cindex[pk];\n // check i is dead, skip it\n if (W[nv + i] >= 0) {\n continue;\n }\n // scan hash bucket of node i\n h = last[i];\n i = W[hhead + h];\n // hash bucket will be empty\n W[hhead + h] = -1;\n for (; i !== -1 && W[next + i] !== -1; i = W[next + i], mark++) {\n ln = W[len + i];\n eln = W[elen + i];\n for (p = cptr[i] + 1; p <= cptr[i] + ln - 1; p++) {\n W[w + cindex[p]] = mark;\n }\n var jlast = i;\n // compare i with all j\n for (j = W[next + i]; j !== -1;) {\n var ok = W[len + j] === ln && W[elen + j] === eln;\n for (p = cptr[j] + 1; ok && p <= cptr[j] + ln - 1; p++) {\n // compare i and j\n if (W[w + cindex[p]] !== mark) {\n ok = 0;\n }\n }\n // check i and j are identical\n if (ok) {\n // absorb j into i\n cptr[j] = csFlip(i);\n W[nv + i] += W[nv + j];\n W[nv + j] = 0;\n // node j is dead\n W[elen + j] = -1;\n // delete j from hash bucket\n j = W[next + j];\n W[next + jlast] = j;\n } else {\n // j and i are different\n jlast = j;\n j = W[next + j];\n }\n }\n }\n }\n\n // Finalize new element. The elimination of node k is nearly complete. All nodes i in Lk are scanned one last time.\n // Node i is removed from Lk if it is dead. The flagged status of nv[i] is cleared.\n for (p = pk1, pk = pk1; pk < pk2; pk++) {\n i = cindex[pk];\n // check i is dead, skip it\n if ((nvi = -W[nv + i]) <= 0) {\n continue;\n }\n // restore W[nv + i]\n W[nv + i] = nvi;\n // compute external degree(i)\n d = W[degree + i] + dk - nvi;\n d = Math.min(d, n - nel - nvi);\n if (W[head + d] !== -1) {\n last[W[head + d]] = i;\n }\n // put i back in degree list\n W[next + i] = W[head + d];\n last[i] = -1;\n W[head + d] = i;\n // find new minimum degree\n mindeg = Math.min(mindeg, d);\n W[degree + i] = d;\n // place i in Lk\n cindex[p++] = i;\n }\n // # nodes absorbed into k\n W[nv + k] = nvk;\n // length of adj list of element k\n if ((W[len + k] = p - pk1) === 0) {\n // k is a root of the tree\n cptr[k] = -1;\n // k is now a dead element\n W[w + k] = 0;\n }\n if (elenk !== 0) {\n // free unused space in Lk\n cnz = p;\n }\n }\n\n // Postordering. The elimination is complete, but no permutation has been computed. All that is left\n // of the graph is the assembly tree (ptr) and a set of dead nodes and elements (i is a dead node if\n // nv[i] is zero and a dead element if nv[i] > 0). It is from this information only that the final permutation\n // is computed. The tree is restored by unflipping all of ptr.\n\n // fix assembly tree\n for (i = 0; i < n; i++) {\n cptr[i] = csFlip(cptr[i]);\n }\n for (j = 0; j <= n; j++) {\n W[head + j] = -1;\n }\n // place unordered nodes in lists\n for (j = n; j >= 0; j--) {\n // skip if j is an element\n if (W[nv + j] > 0) {\n continue;\n }\n // place j in list of its parent\n W[next + j] = W[head + cptr[j]];\n W[head + cptr[j]] = j;\n }\n // place elements in lists\n for (e = n; e >= 0; e--) {\n // skip unless e is an element\n if (W[nv + e] <= 0) {\n continue;\n }\n if (cptr[e] !== -1) {\n // place e in list of its parent\n W[next + e] = W[head + cptr[e]];\n W[head + cptr[e]] = e;\n }\n }\n // postorder the assembly tree\n for (k = 0, i = 0; i <= n; i++) {\n if (cptr[i] === -1) {\n k = csTdfs(i, k, W, head, next, P, w);\n }\n }\n // remove last item in array\n P.splice(P.length - 1, 1);\n // return P\n return P;\n };\n\n /**\n * Creates the matrix that will be used by the approximate minimum degree ordering algorithm. The function accepts the matrix M as input and returns a permutation\n * vector P. The amd algorithm operates on a symmetrix matrix, so one of three symmetric matrices is formed.\n *\n * Order: 0\n * A natural ordering P=null matrix is returned.\n *\n * Order: 1\n * Matrix must be square. This is appropriate for a Cholesky or LU factorization.\n * P = M + M'\n *\n * Order: 2\n * Dense columns from M' are dropped, M recreated from M'. This is appropriatefor LU factorization of unsymmetric matrices.\n * P = M' * M\n *\n * Order: 3\n * This is best used for QR factorization or LU factorization is matrix M has no dense rows. A dense row is a row with more than 10*sqr(columns) entries.\n * P = M' * M\n */\n function _createTargetMatrix(order, a, m, n, dense) {\n // compute A'\n var at = transpose(a);\n\n // check order = 1, matrix must be square\n if (order === 1 && n === m) {\n // C = A + A'\n return add(a, at);\n }\n\n // check order = 2, drop dense columns from M'\n if (order === 2) {\n // transpose arrays\n var tindex = at._index;\n var tptr = at._ptr;\n // new column index\n var p2 = 0;\n // loop A' columns (rows)\n for (var j = 0; j < m; j++) {\n // column j of AT starts here\n var p = tptr[j];\n // new column j starts here\n tptr[j] = p2;\n // skip dense col j\n if (tptr[j + 1] - p > dense) {\n continue;\n }\n // map rows in column j of A\n for (var p1 = tptr[j + 1]; p < p1; p++) {\n tindex[p2++] = tindex[p];\n }\n }\n // finalize AT\n tptr[m] = p2;\n // recreate A from new transpose matrix\n a = transpose(at);\n // use A' * A\n return multiply(at, a);\n }\n\n // use A' * A, square or rectangular matrix\n return multiply(at, a);\n }\n\n /**\n * Initialize quotient graph. There are four kind of nodes and elements that must be represented:\n *\n * - A live node is a node i (or a supernode) that has not been selected as a pivot nad has not been merged into another supernode.\n * - A dead node i is one that has been removed from the graph, having been absorved into r = flip(ptr[i]).\n * - A live element e is one that is in the graph, having been formed when node e was selected as the pivot.\n * - A dead element e is one that has benn absorved into a subsequent element s = flip(ptr[e]).\n */\n function _initializeQuotientGraph(n, cptr, W, len, head, last, next, hhead, nv, w, elen, degree) {\n // Initialize quotient graph\n for (var k = 0; k < n; k++) {\n W[len + k] = cptr[k + 1] - cptr[k];\n }\n W[len + n] = 0;\n // initialize workspace\n for (var i = 0; i <= n; i++) {\n // degree list i is empty\n W[head + i] = -1;\n last[i] = -1;\n W[next + i] = -1;\n // hash list i is empty\n W[hhead + i] = -1;\n // node i is just one node\n W[nv + i] = 1;\n // node i is alive\n W[w + i] = 1;\n // Ek of node i is empty\n W[elen + i] = 0;\n // degree of node i\n W[degree + i] = W[len + i];\n }\n // clear w\n var mark = _wclear(0, 0, W, w, n);\n // n is a dead element\n W[elen + n] = -2;\n // n is a root of assembly tree\n cptr[n] = -1;\n // n is a dead element\n W[w + n] = 0;\n // return mark\n return mark;\n }\n\n /**\n * Initialize degree lists. Each node is placed in its degree lists. Nodes of zero degree are eliminated immediately. Nodes with\n * degree >= dense are alsol eliminated and merged into a placeholder node n, a dead element. Thes nodes will appera last in the\n * output permutation p.\n */\n function _initializeDegreeLists(n, cptr, W, degree, elen, w, dense, nv, head, last, next) {\n // result\n var nel = 0;\n // loop columns\n for (var i = 0; i < n; i++) {\n // degree @ i\n var d = W[degree + i];\n // check node i is empty\n if (d === 0) {\n // element i is dead\n W[elen + i] = -2;\n nel++;\n // i is a root of assembly tree\n cptr[i] = -1;\n W[w + i] = 0;\n } else if (d > dense) {\n // absorb i into element n\n W[nv + i] = 0;\n // node i is dead\n W[elen + i] = -1;\n nel++;\n cptr[i] = csFlip(n);\n W[nv + n]++;\n } else {\n var h = W[head + d];\n if (h !== -1) {\n last[h] = i;\n }\n // put node i in degree list d\n W[next + i] = W[head + d];\n W[head + d] = i;\n }\n }\n return nel;\n }\n function _wclear(mark, lemax, W, w, n) {\n if (mark < 2 || mark + lemax < 0) {\n for (var k = 0; k < n; k++) {\n if (W[w + k] !== 0) {\n W[w + k] = 1;\n }\n }\n mark = 2;\n }\n // at this point, W [0..n-1] < mark holds\n return mark;\n }\n function _diag(i, j) {\n return i !== j;\n }\n});","/**\n * Keeps entries in the matrix when the callback function returns true, removes the entry otherwise\n *\n * @param {Matrix} a The sparse matrix\n * @param {function} callback The callback function, function will be invoked with the following args:\n * - The entry row\n * - The entry column\n * - The entry value\n * - The state parameter\n * @param {any} other The state\n *\n * @return The number of nonzero elements in the matrix\n *\n * Reference: http://faculty.cse.tamu.edu/davis/publications.html\n */\nexport function csFkeep(a, callback, other) {\n // a arrays\n var avalues = a._values;\n var aindex = a._index;\n var aptr = a._ptr;\n var asize = a._size;\n // columns\n var n = asize[1];\n // nonzero items\n var nz = 0;\n // loop columns\n for (var j = 0; j < n; j++) {\n // get current location of col j\n var p = aptr[j];\n // record new location of col j\n aptr[j] = nz;\n for (; p < aptr[j + 1]; p++) {\n // check we need to keep this item\n if (callback(aindex[p], j, avalues ? avalues[p] : 1, other)) {\n // keep A(i,j)\n aindex[nz] = aindex[p];\n // check we need to process values (pattern only)\n if (avalues) {\n avalues[nz] = avalues[p];\n }\n // increment nonzero items\n nz++;\n }\n }\n }\n // finalize A\n aptr[n] = nz;\n // trim arrays\n aindex.splice(nz, aindex.length - nz);\n // check we need to process values (pattern only)\n if (avalues) {\n avalues.splice(nz, avalues.length - nz);\n }\n // return number of nonzero items\n return nz;\n}","/**\n * This function determines if j is a leaf of the ith row subtree.\n * Consider A(i,j), node j in ith row subtree and return lca(jprev,j)\n *\n * @param {Number} i The ith row subtree\n * @param {Number} j The node to test\n * @param {Array} w The workspace array\n * @param {Number} first The index offset within the workspace for the first array\n * @param {Number} maxfirst The index offset within the workspace for the maxfirst array\n * @param {Number} prevleaf The index offset within the workspace for the prevleaf array\n * @param {Number} ancestor The index offset within the workspace for the ancestor array\n *\n * @return {Object}\n *\n * Reference: http://faculty.cse.tamu.edu/davis/publications.html\n */\nexport function csLeaf(i, j, w, first, maxfirst, prevleaf, ancestor) {\n var s, sparent;\n\n // our result\n var jleaf = 0;\n var q;\n\n // check j is a leaf\n if (i <= j || w[first + j] <= w[maxfirst + i]) {\n return -1;\n }\n // update max first[j] seen so far\n w[maxfirst + i] = w[first + j];\n // jprev = previous leaf of ith subtree\n var jprev = w[prevleaf + i];\n w[prevleaf + i] = j;\n\n // check j is first or subsequent leaf\n if (jprev === -1) {\n // 1st leaf, q = root of ith subtree\n jleaf = 1;\n q = i;\n } else {\n // update jleaf\n jleaf = 2;\n // q = least common ancester (jprev,j)\n for (q = jprev; q !== w[ancestor + q]; q = w[ancestor + q]);\n for (s = jprev; s !== q; s = sparent) {\n // path compression\n sparent = w[ancestor + s];\n w[ancestor + s] = q;\n }\n }\n return {\n jleaf,\n q\n };\n}","import { factory } from '../../../utils/factory.js';\nimport { csLeaf } from './csLeaf.js';\nvar name = 'csCounts';\nvar dependencies = ['transpose'];\nexport var createCsCounts = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n transpose\n } = _ref;\n /**\n * Computes the column counts using the upper triangular part of A.\n * It transposes A internally, none of the input parameters are modified.\n *\n * @param {Matrix} a The sparse matrix A\n *\n * @param {Matrix} ata Count the columns of A'A instead\n *\n * @return An array of size n of the column counts or null on error\n *\n * Reference: http://faculty.cse.tamu.edu/davis/publications.html\n */\n return function (a, parent, post, ata) {\n // check inputs\n if (!a || !parent || !post) {\n return null;\n }\n // a matrix arrays\n var asize = a._size;\n // rows and columns\n var m = asize[0];\n var n = asize[1];\n // variables\n var i, j, k, J, p, p0, p1;\n\n // workspace size\n var s = 4 * n + (ata ? n + m + 1 : 0);\n // allocate workspace\n var w = []; // (s)\n var ancestor = 0; // first n entries\n var maxfirst = n; // next n entries\n var prevleaf = 2 * n; // next n entries\n var first = 3 * n; // next n entries\n var head = 4 * n; // next n + 1 entries (used when ata is true)\n var next = 5 * n + 1; // last entries in workspace\n // clear workspace w[0..s-1]\n for (k = 0; k < s; k++) {\n w[k] = -1;\n }\n\n // allocate result\n var colcount = []; // (n)\n\n // AT = A'\n var at = transpose(a);\n // at arrays\n var tindex = at._index;\n var tptr = at._ptr;\n\n // find w[first + j]\n for (k = 0; k < n; k++) {\n j = post[k];\n // colcount[j]=1 if j is a leaf\n colcount[j] = w[first + j] === -1 ? 1 : 0;\n for (; j !== -1 && w[first + j] === -1; j = parent[j]) {\n w[first + j] = k;\n }\n }\n\n // initialize ata if needed\n if (ata) {\n // invert post\n for (k = 0; k < n; k++) {\n w[post[k]] = k;\n }\n // loop rows (columns in AT)\n for (i = 0; i < m; i++) {\n // values in column i of AT\n for (k = n, p0 = tptr[i], p1 = tptr[i + 1], p = p0; p < p1; p++) {\n k = Math.min(k, w[tindex[p]]);\n }\n // place row i in linked list k\n w[next + i] = w[head + k];\n w[head + k] = i;\n }\n }\n\n // each node in its own set\n for (i = 0; i < n; i++) {\n w[ancestor + i] = i;\n }\n for (k = 0; k < n; k++) {\n // j is the kth node in postordered etree\n j = post[k];\n // check j is not a root\n if (parent[j] !== -1) {\n colcount[parent[j]]--;\n }\n\n // J=j for LL'=A case\n for (J = ata ? w[head + k] : j; J !== -1; J = ata ? w[next + J] : -1) {\n for (p = tptr[J]; p < tptr[J + 1]; p++) {\n i = tindex[p];\n var r = csLeaf(i, j, w, first, maxfirst, prevleaf, ancestor);\n // check A(i,j) is in skeleton\n if (r.jleaf >= 1) {\n colcount[j]++;\n }\n // check account for overlap in q\n if (r.jleaf === 2) {\n colcount[r.q]--;\n }\n }\n }\n if (parent[j] !== -1) {\n w[ancestor + j] = parent[j];\n }\n }\n // sum up colcount's of each child\n for (j = 0; j < n; j++) {\n if (parent[j] !== -1) {\n colcount[parent[j]] += colcount[j];\n }\n }\n return colcount;\n };\n});","import { csPermute } from './csPermute.js';\nimport { csPost } from './csPost.js';\nimport { csEtree } from './csEtree.js';\nimport { createCsAmd } from './csAmd.js';\nimport { createCsCounts } from './csCounts.js';\nimport { factory } from '../../../utils/factory.js';\nvar name = 'csSqr';\nvar dependencies = ['add', 'multiply', 'transpose'];\nexport var createCsSqr = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n add,\n multiply,\n transpose\n } = _ref;\n var csAmd = createCsAmd({\n add,\n multiply,\n transpose\n });\n var csCounts = createCsCounts({\n transpose\n });\n\n /**\n * Symbolic ordering and analysis for QR and LU decompositions.\n *\n * @param {Number} order The ordering strategy (see csAmd for more details)\n * @param {Matrix} a The A matrix\n * @param {boolean} qr Symbolic ordering and analysis for QR decomposition (true) or\n * symbolic ordering and analysis for LU decomposition (false)\n *\n * @return {Object} The Symbolic ordering and analysis for matrix A\n *\n * Reference: http://faculty.cse.tamu.edu/davis/publications.html\n */\n return function csSqr(order, a, qr) {\n // a arrays\n var aptr = a._ptr;\n var asize = a._size;\n // columns\n var n = asize[1];\n // vars\n var k;\n // symbolic analysis result\n var s = {};\n // fill-reducing ordering\n s.q = csAmd(order, a);\n // validate results\n if (order && !s.q) {\n return null;\n }\n // QR symbolic analysis\n if (qr) {\n // apply permutations if needed\n var c = order ? csPermute(a, null, s.q, 0) : a;\n // etree of C'*C, where C=A(:,q)\n s.parent = csEtree(c, 1);\n // post order elimination tree\n var post = csPost(s.parent, n);\n // col counts chol(C'*C)\n s.cp = csCounts(c, s.parent, post, 1);\n // check we have everything needed to calculate number of nonzero elements\n if (c && s.parent && s.cp && _vcount(c, s)) {\n // calculate number of nonzero elements\n for (s.unz = 0, k = 0; k < n; k++) {\n s.unz += s.cp[k];\n }\n }\n } else {\n // for LU factorization only, guess nnz(L) and nnz(U)\n s.unz = 4 * aptr[n] + n;\n s.lnz = s.unz;\n }\n // return result S\n return s;\n };\n\n /**\n * Compute nnz(V) = s.lnz, s.pinv, s.leftmost, s.m2 from A and s.parent\n */\n function _vcount(a, s) {\n // a arrays\n var aptr = a._ptr;\n var aindex = a._index;\n var asize = a._size;\n // rows & columns\n var m = asize[0];\n var n = asize[1];\n // initialize s arrays\n s.pinv = []; // (m + n)\n s.leftmost = []; // (m)\n // vars\n var parent = s.parent;\n var pinv = s.pinv;\n var leftmost = s.leftmost;\n // workspace, next: first m entries, head: next n entries, tail: next n entries, nque: next n entries\n var w = []; // (m + 3 * n)\n var next = 0;\n var head = m;\n var tail = m + n;\n var nque = m + 2 * n;\n // vars\n var i, k, p, p0, p1;\n // initialize w\n for (k = 0; k < n; k++) {\n // queue k is empty\n w[head + k] = -1;\n w[tail + k] = -1;\n w[nque + k] = 0;\n }\n // initialize row arrays\n for (i = 0; i < m; i++) {\n leftmost[i] = -1;\n }\n // loop columns backwards\n for (k = n - 1; k >= 0; k--) {\n // values & index for column k\n for (p0 = aptr[k], p1 = aptr[k + 1], p = p0; p < p1; p++) {\n // leftmost[i] = min(find(A(i,:)))\n leftmost[aindex[p]] = k;\n }\n }\n // scan rows in reverse order\n for (i = m - 1; i >= 0; i--) {\n // row i is not yet ordered\n pinv[i] = -1;\n k = leftmost[i];\n // check row i is empty\n if (k === -1) {\n continue;\n }\n // first row in queue k\n if (w[nque + k]++ === 0) {\n w[tail + k] = i;\n }\n // put i at head of queue k\n w[next + i] = w[head + k];\n w[head + k] = i;\n }\n s.lnz = 0;\n s.m2 = m;\n // find row permutation and nnz(V)\n for (k = 0; k < n; k++) {\n // remove row i from queue k\n i = w[head + k];\n // count V(k,k) as nonzero\n s.lnz++;\n // add a fictitious row\n if (i < 0) {\n i = s.m2++;\n }\n // associate row i with V(:,k)\n pinv[i] = k;\n // skip if V(k+1:m,k) is empty\n if (--nque[k] <= 0) {\n continue;\n }\n // nque[k] is nnz (V(k+1:m,k))\n s.lnz += w[nque + k];\n // move all rows to parent of k\n var pa = parent[k];\n if (pa !== -1) {\n if (w[nque + pa] === 0) {\n w[tail + pa] = w[tail + k];\n }\n w[next + w[tail + k]] = w[head + pa];\n w[head + pa] = w[next + i];\n w[nque + pa] += w[nque + k];\n }\n }\n for (i = 0; i < m; i++) {\n if (pinv[i] < 0) {\n pinv[i] = k++;\n }\n }\n return true;\n }\n});","/**\n * Permutes a sparse matrix C = P * A * Q\n *\n * @param {SparseMatrix} a The Matrix A\n * @param {Array} pinv The row permutation vector\n * @param {Array} q The column permutation vector\n * @param {boolean} values Create a pattern matrix (false), values and pattern otherwise\n *\n * @return {Matrix} C = P * A * Q, null on error\n *\n * Reference: http://faculty.cse.tamu.edu/davis/publications.html\n */\nexport function csPermute(a, pinv, q, values) {\n // a arrays\n var avalues = a._values;\n var aindex = a._index;\n var aptr = a._ptr;\n var asize = a._size;\n var adt = a._datatype;\n // rows & columns\n var m = asize[0];\n var n = asize[1];\n // c arrays\n var cvalues = values && a._values ? [] : null;\n var cindex = []; // (aptr[n])\n var cptr = []; // (n + 1)\n // initialize vars\n var nz = 0;\n // loop columns\n for (var k = 0; k < n; k++) {\n // column k of C is column q[k] of A\n cptr[k] = nz;\n // apply column permutation\n var j = q ? q[k] : k;\n // loop values in column j of A\n for (var t0 = aptr[j], t1 = aptr[j + 1], t = t0; t < t1; t++) {\n // row i of A is row pinv[i] of C\n var r = pinv ? pinv[aindex[t]] : aindex[t];\n // index\n cindex[nz] = r;\n // check we need to populate values\n if (cvalues) {\n cvalues[nz] = avalues[t];\n }\n // increment number of nonzero elements\n nz++;\n }\n }\n // finalize the last column of C\n cptr[n] = nz;\n // return C matrix\n return a.createSparseMatrix({\n values: cvalues,\n index: cindex,\n ptr: cptr,\n size: [m, n],\n datatype: adt\n });\n}","/**\n * Computes the elimination tree of Matrix A (using triu(A)) or the\n * elimination tree of A'A without forming A'A.\n *\n * @param {Matrix} a The A Matrix\n * @param {boolean} ata A value of true the function computes the etree of A'A\n *\n * Reference: http://faculty.cse.tamu.edu/davis/publications.html\n */\nexport function csEtree(a, ata) {\n // check inputs\n if (!a) {\n return null;\n }\n // a arrays\n var aindex = a._index;\n var aptr = a._ptr;\n var asize = a._size;\n // rows & columns\n var m = asize[0];\n var n = asize[1];\n\n // allocate result\n var parent = []; // (n)\n\n // allocate workspace\n var w = []; // (n + (ata ? m : 0))\n var ancestor = 0; // first n entries in w\n var prev = n; // last m entries (ata = true)\n\n var i, inext;\n\n // check we are calculating A'A\n if (ata) {\n // initialize workspace\n for (i = 0; i < m; i++) {\n w[prev + i] = -1;\n }\n }\n // loop columns\n for (var k = 0; k < n; k++) {\n // node k has no parent yet\n parent[k] = -1;\n // nor does k have an ancestor\n w[ancestor + k] = -1;\n // values in column k\n for (var p0 = aptr[k], p1 = aptr[k + 1], p = p0; p < p1; p++) {\n // row\n var r = aindex[p];\n // node\n i = ata ? w[prev + r] : r;\n // traverse from i to k\n for (; i !== -1 && i < k; i = inext) {\n // inext = ancestor of i\n inext = w[ancestor + i];\n // path compression\n w[ancestor + i] = k;\n // check no anc., parent is k\n if (inext === -1) {\n parent[i] = k;\n }\n }\n if (ata) {\n w[prev + r] = k;\n }\n }\n }\n return parent;\n}","import { csTdfs } from './csTdfs.js';\n\n/**\n * Post order a tree of forest\n *\n * @param {Array} parent The tree or forest\n * @param {Number} n Number of columns\n *\n * Reference: http://faculty.cse.tamu.edu/davis/publications.html\n */\nexport function csPost(parent, n) {\n // check inputs\n if (!parent) {\n return null;\n }\n // vars\n var k = 0;\n var j;\n // allocate result\n var post = []; // (n)\n // workspace, head: first n entries, next: next n entries, stack: last n entries\n var w = []; // (3 * n)\n var head = 0;\n var next = n;\n var stack = 2 * n;\n // initialize workspace\n for (j = 0; j < n; j++) {\n // empty linked lists\n w[head + j] = -1;\n }\n // traverse nodes in reverse order\n for (j = n - 1; j >= 0; j--) {\n // check j is a root\n if (parent[j] === -1) {\n continue;\n }\n // add j to list of its parent\n w[next + j] = w[head + parent[j]];\n w[head + parent[j]] = j;\n }\n // loop nodes\n for (j = 0; j < n; j++) {\n // skip j if it is not a root\n if (parent[j] !== -1) {\n continue;\n }\n // depth-first search\n k = csTdfs(j, k, w, head, next, post, stack);\n }\n return post;\n}","/**\n * Checks if the node at w[j] is marked\n *\n * @param {Array} w The array\n * @param {Number} j The array index\n *\n * Reference: http://faculty.cse.tamu.edu/davis/publications.html\n */\nexport function csMarked(w, j) {\n // check node is marked\n return w[j] < 0;\n}","import { csFlip } from './csFlip.js';\n\n/**\n * Marks the node at w[j]\n *\n * @param {Array} w The array\n * @param {Number} j The array index\n *\n * Reference: http://faculty.cse.tamu.edu/davis/publications.html\n */\nexport function csMark(w, j) {\n // mark w[j]\n w[j] = csFlip(w[j]);\n}","import { csFlip } from './csFlip.js';\n\n/**\n * Flips the value if it is negative of returns the same value otherwise.\n *\n * @param {Number} i The value to flip\n *\n * Reference: http://faculty.cse.tamu.edu/davis/publications.html\n */\nexport function csUnflip(i) {\n // flip the value if it is negative\n return i < 0 ? csFlip(i) : i;\n}","import { csMarked } from './csMarked.js';\nimport { csMark } from './csMark.js';\nimport { csUnflip } from './csUnflip.js';\n\n/**\n * Depth-first search computes the nonzero pattern xi of the directed graph G (Matrix) starting\n * at nodes in B (see csReach()).\n *\n * @param {Number} j The starting node for the DFS algorithm\n * @param {Matrix} g The G matrix to search, ptr array modified, then restored\n * @param {Number} top Start index in stack xi[top..n-1]\n * @param {Number} k The kth column in B\n * @param {Array} xi The nonzero pattern xi[top] .. xi[n - 1], an array of size = 2 * n\n * The first n entries is the nonzero pattern, the last n entries is the stack\n * @param {Array} pinv The inverse row permutation vector, must be null for L * x = b\n *\n * @return {Number} New value of top\n *\n * Reference: http://faculty.cse.tamu.edu/davis/publications.html\n */\nexport function csDfs(j, g, top, xi, pinv) {\n // g arrays\n var index = g._index;\n var ptr = g._ptr;\n var size = g._size;\n // columns\n var n = size[1];\n // vars\n var i, p, p2;\n // initialize head\n var head = 0;\n // initialize the recursion stack\n xi[0] = j;\n // loop\n while (head >= 0) {\n // get j from the top of the recursion stack\n j = xi[head];\n // apply permutation vector\n var jnew = pinv ? pinv[j] : j;\n // check node j is marked\n if (!csMarked(ptr, j)) {\n // mark node j as visited\n csMark(ptr, j);\n // update stack (last n entries in xi)\n xi[n + head] = jnew < 0 ? 0 : csUnflip(ptr[jnew]);\n }\n // node j done if no unvisited neighbors\n var done = 1;\n // examine all neighbors of j, stack (last n entries in xi)\n for (p = xi[n + head], p2 = jnew < 0 ? 0 : csUnflip(ptr[jnew + 1]); p < p2; p++) {\n // consider neighbor node i\n i = index[p];\n // check we have visited node i, skip it\n if (csMarked(ptr, i)) {\n continue;\n }\n // pause depth-first search of node j, update stack (last n entries in xi)\n xi[n + head] = p;\n // start dfs at node i\n xi[++head] = i;\n // node j is not done\n done = 0;\n // break, to start dfs(i)\n break;\n }\n // check depth-first search at node j is done\n if (done) {\n // remove j from the recursion stack\n head--;\n // and place in the output stack\n xi[--top] = j;\n }\n }\n return top;\n}","import { csReach } from './csReach.js';\nimport { factory } from '../../../utils/factory.js';\nvar name = 'csSpsolve';\nvar dependencies = ['divideScalar', 'multiply', 'subtract'];\nexport var createCsSpsolve = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n divideScalar,\n multiply,\n subtract\n } = _ref;\n /**\n * The function csSpsolve() computes the solution to G * x = bk, where bk is the\n * kth column of B. When lo is true, the function assumes G = L is lower triangular with the\n * diagonal entry as the first entry in each column. When lo is true, the function assumes G = U\n * is upper triangular with the diagonal entry as the last entry in each column.\n *\n * @param {Matrix} g The G matrix\n * @param {Matrix} b The B matrix\n * @param {Number} k The kth column in B\n * @param {Array} xi The nonzero pattern xi[top] .. xi[n - 1], an array of size = 2 * n\n * The first n entries is the nonzero pattern, the last n entries is the stack\n * @param {Array} x The soluton to the linear system G * x = b\n * @param {Array} pinv The inverse row permutation vector, must be null for L * x = b\n * @param {boolean} lo The lower (true) upper triangular (false) flag\n *\n * @return {Number} The index for the nonzero pattern\n *\n * Reference: http://faculty.cse.tamu.edu/davis/publications.html\n */\n return function csSpsolve(g, b, k, xi, x, pinv, lo) {\n // g arrays\n var gvalues = g._values;\n var gindex = g._index;\n var gptr = g._ptr;\n var gsize = g._size;\n // columns\n var n = gsize[1];\n // b arrays\n var bvalues = b._values;\n var bindex = b._index;\n var bptr = b._ptr;\n // vars\n var p, p0, p1, q;\n // xi[top..n-1] = csReach(B(:,k))\n var top = csReach(g, b, k, xi, pinv);\n // clear x\n for (p = top; p < n; p++) {\n x[xi[p]] = 0;\n }\n // scatter b\n for (p0 = bptr[k], p1 = bptr[k + 1], p = p0; p < p1; p++) {\n x[bindex[p]] = bvalues[p];\n }\n // loop columns\n for (var px = top; px < n; px++) {\n // x array index for px\n var j = xi[px];\n // apply permutation vector (U x = b), j maps to column J of G\n var J = pinv ? pinv[j] : j;\n // check column J is empty\n if (J < 0) {\n continue;\n }\n // column value indeces in G, p0 <= p < p1\n p0 = gptr[J];\n p1 = gptr[J + 1];\n // x(j) /= G(j,j)\n x[j] = divideScalar(x[j], gvalues[lo ? p0 : p1 - 1]);\n // first entry L(j,j)\n p = lo ? p0 + 1 : p0;\n q = lo ? p1 : p1 - 1;\n // loop\n for (; p < q; p++) {\n // row\n var i = gindex[p];\n // x(i) -= G(i,j) * x(j)\n x[i] = subtract(x[i], multiply(gvalues[p], x[j]));\n }\n }\n // return top of stack\n return top;\n };\n});","import { csMarked } from './csMarked.js';\nimport { csMark } from './csMark.js';\nimport { csDfs } from './csDfs.js';\n\n/**\n * The csReach function computes X = Reach(B), where B is the nonzero pattern of the n-by-1\n * sparse column of vector b. The function returns the set of nodes reachable from any node in B. The\n * nonzero pattern xi of the solution x to the sparse linear system Lx=b is given by X=Reach(B).\n *\n * @param {Matrix} g The G matrix\n * @param {Matrix} b The B matrix\n * @param {Number} k The kth column in B\n * @param {Array} xi The nonzero pattern xi[top] .. xi[n - 1], an array of size = 2 * n\n * The first n entries is the nonzero pattern, the last n entries is the stack\n * @param {Array} pinv The inverse row permutation vector\n *\n * @return {Number} The index for the nonzero pattern\n *\n * Reference: http://faculty.cse.tamu.edu/davis/publications.html\n */\nexport function csReach(g, b, k, xi, pinv) {\n // g arrays\n var gptr = g._ptr;\n var gsize = g._size;\n // b arrays\n var bindex = b._index;\n var bptr = b._ptr;\n // columns\n var n = gsize[1];\n // vars\n var p, p0, p1;\n // initialize top\n var top = n;\n // loop column indeces in B\n for (p0 = bptr[k], p1 = bptr[k + 1], p = p0; p < p1; p++) {\n // node i\n var i = bindex[p];\n // check node i is marked\n if (!csMarked(gptr, i)) {\n // start a dfs at unmarked node i\n top = csDfs(i, g, top, xi, pinv);\n }\n }\n // loop columns from top -> n - 1\n for (p = top; p < n; p++) {\n // restore G\n csMark(gptr, xi[p]);\n }\n return top;\n}","import { factory } from '../../../utils/factory.js';\nimport { createCsSpsolve } from './csSpsolve.js';\nvar name = 'csLu';\nvar dependencies = ['abs', 'divideScalar', 'multiply', 'subtract', 'larger', 'largerEq', 'SparseMatrix'];\nexport var createCsLu = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n abs,\n divideScalar,\n multiply,\n subtract,\n larger,\n largerEq,\n SparseMatrix\n } = _ref;\n var csSpsolve = createCsSpsolve({\n divideScalar,\n multiply,\n subtract\n });\n\n /**\n * Computes the numeric LU factorization of the sparse matrix A. Implements a Left-looking LU factorization\n * algorithm that computes L and U one column at a tume. At the kth step, it access columns 1 to k-1 of L\n * and column k of A. Given the fill-reducing column ordering q (see parameter s) computes L, U and pinv so\n * L * U = A(p, q), where p is the inverse of pinv.\n *\n * @param {Matrix} m The A Matrix to factorize\n * @param {Object} s The symbolic analysis from csSqr(). Provides the fill-reducing\n * column ordering q\n * @param {Number} tol Partial pivoting threshold (1 for partial pivoting)\n *\n * @return {Number} The numeric LU factorization of A or null\n *\n * Reference: http://faculty.cse.tamu.edu/davis/publications.html\n */\n return function csLu(m, s, tol) {\n // validate input\n if (!m) {\n return null;\n }\n // m arrays\n var size = m._size;\n // columns\n var n = size[1];\n // symbolic analysis result\n var q;\n var lnz = 100;\n var unz = 100;\n // update symbolic analysis parameters\n if (s) {\n q = s.q;\n lnz = s.lnz || lnz;\n unz = s.unz || unz;\n }\n // L arrays\n var lvalues = []; // (lnz)\n var lindex = []; // (lnz)\n var lptr = []; // (n + 1)\n // L\n var L = new SparseMatrix({\n values: lvalues,\n index: lindex,\n ptr: lptr,\n size: [n, n]\n });\n // U arrays\n var uvalues = []; // (unz)\n var uindex = []; // (unz)\n var uptr = []; // (n + 1)\n // U\n var U = new SparseMatrix({\n values: uvalues,\n index: uindex,\n ptr: uptr,\n size: [n, n]\n });\n // inverse of permutation vector\n var pinv = []; // (n)\n // vars\n var i, p;\n // allocate arrays\n var x = []; // (n)\n var xi = []; // (2 * n)\n // initialize variables\n for (i = 0; i < n; i++) {\n // clear workspace\n x[i] = 0;\n // no rows pivotal yet\n pinv[i] = -1;\n // no cols of L yet\n lptr[i + 1] = 0;\n }\n // reset number of nonzero elements in L and U\n lnz = 0;\n unz = 0;\n // compute L(:,k) and U(:,k)\n for (var k = 0; k < n; k++) {\n // update ptr\n lptr[k] = lnz;\n uptr[k] = unz;\n // apply column permutations if needed\n var col = q ? q[k] : k;\n // solve triangular system, x = L\\A(:,col)\n var top = csSpsolve(L, m, col, xi, x, pinv, 1);\n // find pivot\n var ipiv = -1;\n var a = -1;\n // loop xi[] from top -> n\n for (p = top; p < n; p++) {\n // x[i] is nonzero\n i = xi[p];\n // check row i is not yet pivotal\n if (pinv[i] < 0) {\n // absolute value of x[i]\n var xabs = abs(x[i]);\n // check absoulte value is greater than pivot value\n if (larger(xabs, a)) {\n // largest pivot candidate so far\n a = xabs;\n ipiv = i;\n }\n } else {\n // x(i) is the entry U(pinv[i],k)\n uindex[unz] = pinv[i];\n uvalues[unz++] = x[i];\n }\n }\n // validate we found a valid pivot\n if (ipiv === -1 || a <= 0) {\n return null;\n }\n // update actual pivot column, give preference to diagonal value\n if (pinv[col] < 0 && largerEq(abs(x[col]), multiply(a, tol))) {\n ipiv = col;\n }\n // the chosen pivot\n var pivot = x[ipiv];\n // last entry in U(:,k) is U(k,k)\n uindex[unz] = k;\n uvalues[unz++] = pivot;\n // ipiv is the kth pivot row\n pinv[ipiv] = k;\n // first entry in L(:,k) is L(k,k) = 1\n lindex[lnz] = ipiv;\n lvalues[lnz++] = 1;\n // L(k+1:n,k) = x / pivot\n for (p = top; p < n; p++) {\n // row\n i = xi[p];\n // check x(i) is an entry in L(:,k)\n if (pinv[i] < 0) {\n // save unpermuted row in L\n lindex[lnz] = i;\n // scale pivot column\n lvalues[lnz++] = divideScalar(x[i], pivot);\n }\n // x[0..n-1] = 0 for next k\n x[i] = 0;\n }\n }\n // update ptr\n lptr[n] = lnz;\n uptr[n] = unz;\n // fix row indices of L for final pinv\n for (p = 0; p < lnz; p++) {\n lindex[p] = pinv[lindex[p]];\n }\n // trim arrays\n lvalues.splice(lnz, lvalues.length - lnz);\n lindex.splice(lnz, lindex.length - lnz);\n uvalues.splice(unz, uvalues.length - unz);\n uindex.splice(unz, uindex.length - unz);\n // return LU factor\n return {\n L,\n U,\n pinv\n };\n };\n});","import { isInteger } from '../../../utils/number.js';\nimport { factory } from '../../../utils/factory.js';\nimport { createCsSqr } from '../sparse/csSqr.js';\nimport { createCsLu } from '../sparse/csLu.js';\nvar name = 'slu';\nvar dependencies = ['typed', 'abs', 'add', 'multiply', 'transpose', 'divideScalar', 'subtract', 'larger', 'largerEq', 'SparseMatrix'];\nexport var createSlu = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n abs,\n add,\n multiply,\n transpose,\n divideScalar,\n subtract,\n larger,\n largerEq,\n SparseMatrix\n } = _ref;\n var csSqr = createCsSqr({\n add,\n multiply,\n transpose\n });\n var csLu = createCsLu({\n abs,\n divideScalar,\n multiply,\n subtract,\n larger,\n largerEq,\n SparseMatrix\n });\n\n /**\n * Calculate the Sparse Matrix LU decomposition with full pivoting. Sparse Matrix `A` is decomposed in two matrices (`L`, `U`) and two permutation vectors (`pinv`, `q`) where\n *\n * `P * A * Q = L * U`\n *\n * Syntax:\n *\n * math.slu(A, order, threshold)\n *\n * Examples:\n *\n * const A = math.sparse([[4,3], [6, 3]])\n * math.slu(A, 1, 0.001)\n * // returns:\n * // {\n * // L: [[1, 0], [1.5, 1]]\n * // U: [[4, 3], [0, -1.5]]\n * // p: [0, 1]\n * // q: [0, 1]\n * // }\n *\n * See also:\n *\n * lup, lsolve, usolve, lusolve\n *\n * @param {SparseMatrix} A A two dimensional sparse matrix for which to get the LU decomposition.\n * @param {Number} order The Symbolic Ordering and Analysis order:\n * 0 - Natural ordering, no permutation vector q is returned\n * 1 - Matrix must be square, symbolic ordering and analisis is performed on M = A + A'\n * 2 - Symbolic ordering and analisis is performed on M = A' * A. Dense columns from A' are dropped, A recreated from A'.\n * This is appropriatefor LU factorization of unsymmetric matrices.\n * 3 - Symbolic ordering and analisis is performed on M = A' * A. This is best used for LU factorization is matrix M has no dense rows.\n * A dense row is a row with more than 10*sqr(columns) entries.\n * @param {Number} threshold Partial pivoting threshold (1 for partial pivoting)\n *\n * @return {Object} The lower triangular matrix, the upper triangular matrix and the permutation vectors.\n */\n return typed(name, {\n 'SparseMatrix, number, number': function SparseMatrixNumberNumber(a, order, threshold) {\n // verify order\n if (!isInteger(order) || order < 0 || order > 3) {\n throw new Error('Symbolic Ordering and Analysis order must be an integer number in the interval [0, 3]');\n }\n // verify threshold\n if (threshold < 0 || threshold > 1) {\n throw new Error('Partial pivoting threshold must be a number from 0 to 1');\n }\n\n // perform symbolic ordering and analysis\n var s = csSqr(order, a, false);\n\n // perform lu decomposition\n var f = csLu(a, s, threshold);\n\n // return decomposition\n return {\n L: f.L,\n U: f.U,\n p: f.pinv,\n q: s.q,\n toString: function toString() {\n return 'L: ' + this.L.toString() + '\\nU: ' + this.U.toString() + '\\np: ' + this.p.toString() + (this.q ? '\\nq: ' + this.q.toString() : '') + '\\n';\n }\n };\n }\n });\n});","/**\n * Permutes a vector; x = P'b. In MATLAB notation, x(p)=b.\n *\n * @param {Array} p The permutation vector of length n. null value denotes identity\n * @param {Array} b The input vector\n *\n * @return {Array} The output vector x = P'b\n */\nexport function csIpvec(p, b) {\n // vars\n var k;\n var n = b.length;\n var x = [];\n // check permutation vector was provided, p = null denotes identity\n if (p) {\n // loop vector\n for (k = 0; k < n; k++) {\n // apply permutation\n x[p[k]] = b[k];\n }\n } else {\n // loop vector\n for (k = 0; k < n; k++) {\n // x[i] = b[i]\n x[k] = b[k];\n }\n }\n return x;\n}","import { isArray, isMatrix } from '../../../utils/is.js';\nimport { factory } from '../../../utils/factory.js';\nimport { createSolveValidation } from './utils/solveValidation.js';\nimport { csIpvec } from '../sparse/csIpvec.js';\nvar name = 'lusolve';\nvar dependencies = ['typed', 'matrix', 'lup', 'slu', 'usolve', 'lsolve', 'DenseMatrix'];\nexport var createLusolve = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n matrix,\n lup,\n slu,\n usolve,\n lsolve,\n DenseMatrix\n } = _ref;\n var solveValidation = createSolveValidation({\n DenseMatrix\n });\n\n /**\n * Solves the linear system `A * x = b` where `A` is an [n x n] matrix and `b` is a [n] column vector.\n *\n * Syntax:\n *\n * math.lusolve(A, b) // returns column vector with the solution to the linear system A * x = b\n * math.lusolve(lup, b) // returns column vector with the solution to the linear system A * x = b, lup = math.lup(A)\n *\n * Examples:\n *\n * const m = [[1, 0, 0, 0], [0, 2, 0, 0], [0, 0, 3, 0], [0, 0, 0, 4]]\n *\n * const x = math.lusolve(m, [-1, -1, -1, -1]) // x = [[-1], [-0.5], [-1/3], [-0.25]]\n *\n * const f = math.lup(m)\n * const x1 = math.lusolve(f, [-1, -1, -1, -1]) // x1 = [[-1], [-0.5], [-1/3], [-0.25]]\n * const x2 = math.lusolve(f, [1, 2, 1, -1]) // x2 = [[1], [1], [1/3], [-0.25]]\n *\n * const a = [[-2, 3], [2, 1]]\n * const b = [11, 9]\n * const x = math.lusolve(a, b) // [[2], [5]]\n *\n * See also:\n *\n * lup, slu, lsolve, usolve\n *\n * @param {Matrix | Array | Object} A Invertible Matrix or the Matrix LU decomposition\n * @param {Matrix | Array} b Column Vector\n * @param {number} [order] The Symbolic Ordering and Analysis order, see slu for details. Matrix must be a SparseMatrix\n * @param {Number} [threshold] Partial pivoting threshold (1 for partial pivoting), see slu for details. Matrix must be a SparseMatrix.\n *\n * @return {DenseMatrix | Array} Column vector with the solution to the linear system A * x = b\n */\n return typed(name, {\n 'Array, Array | Matrix': function ArrayArrayMatrix(a, b) {\n a = matrix(a);\n var d = lup(a);\n var x = _lusolve(d.L, d.U, d.p, null, b);\n return x.valueOf();\n },\n 'DenseMatrix, Array | Matrix': function DenseMatrixArrayMatrix(a, b) {\n var d = lup(a);\n return _lusolve(d.L, d.U, d.p, null, b);\n },\n 'SparseMatrix, Array | Matrix': function SparseMatrixArrayMatrix(a, b) {\n var d = lup(a);\n return _lusolve(d.L, d.U, d.p, null, b);\n },\n 'SparseMatrix, Array | Matrix, number, number': function SparseMatrixArrayMatrixNumberNumber(a, b, order, threshold) {\n var d = slu(a, order, threshold);\n return _lusolve(d.L, d.U, d.p, d.q, b);\n },\n 'Object, Array | Matrix': function ObjectArrayMatrix(d, b) {\n return _lusolve(d.L, d.U, d.p, d.q, b);\n }\n });\n function _toMatrix(a) {\n if (isMatrix(a)) {\n return a;\n }\n if (isArray(a)) {\n return matrix(a);\n }\n throw new TypeError('Invalid Matrix LU decomposition');\n }\n function _lusolve(l, u, p, q, b) {\n // verify decomposition\n l = _toMatrix(l);\n u = _toMatrix(u);\n\n // apply row permutations if needed (b is a DenseMatrix)\n if (p) {\n b = solveValidation(l, b, true);\n b._data = csIpvec(p, b._data);\n }\n\n // use forward substitution to resolve L * y = b\n var y = lsolve(l, b);\n // use backward substitution to resolve U * x = y\n var x = usolve(u, y);\n\n // apply column permutations if needed (x is a DenseMatrix)\n if (q) {\n x._data = csIpvec(q, x._data);\n }\n return x;\n }\n});","import { factory } from '../../utils/factory.js';\nvar name = 'polynomialRoot';\nvar dependencies = ['typed', 'isZero', 'equalScalar', 'add', 'subtract', 'multiply', 'divide', 'sqrt', 'unaryMinus', 'cbrt', 'typeOf', 'im', 're'];\nexport var createPolynomialRoot = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n isZero,\n equalScalar,\n add,\n subtract,\n multiply,\n divide,\n sqrt,\n unaryMinus,\n cbrt,\n typeOf,\n im,\n re\n } = _ref;\n /**\n * Finds the numerical values of the distinct roots of a polynomial with real or complex coefficients.\n * Currently operates only on linear, quadratic, and cubic polynomials using the standard\n * formulas for the roots.\n *\n * Syntax:\n *\n * math.polynomialRoot(constant, linearCoeff, quadraticCoeff, cubicCoeff)\n *\n * Examples:\n * // linear\n * math.polynomialRoot(6, 3) // [-2]\n * math.polynomialRoot(math.complex(6,3), 3) // [-2 - i]\n * math.polynomialRoot(math.complex(6,3), math.complex(2,1)) // [-3 + 0i]\n * // quadratic\n * math.polynomialRoot(2, -3, 1) // [2, 1]\n * math.polynomialRoot(8, 8, 2) // [-2]\n * math.polynomialRoot(-2, 0, 1) // [1.4142135623730951, -1.4142135623730951]\n * math.polynomialRoot(2, -2, 1) // [1 + i, 1 - i]\n * math.polynomialRoot(math.complex(1,3), math.complex(-3, -2), 1) // [2 + i, 1 + i]\n * // cubic\n * math.polynomialRoot(-6, 11, -6, 1) // [1, 3, 2]\n * math.polynomialRoot(-8, 0, 0, 1) // [-1 - 1.7320508075688774i, 2, -1 + 1.7320508075688774i]\n * math.polynomialRoot(0, 8, 8, 2) // [0, -2]\n * math.polynomialRoot(1, 1, 1, 1) // [-1 + 0i, 0 - i, 0 + i]\n *\n * See also:\n * cbrt, sqrt\n *\n * @param {... number | Complex} coeffs\n * The coefficients of the polynomial, starting with with the constant coefficent, followed\n * by the linear coefficient and subsequent coefficients of increasing powers.\n * @return {Array} The distinct roots of the polynomial\n */\n\n return typed(name, {\n 'number|Complex, ...number|Complex': (constant, restCoeffs) => {\n var coeffs = [constant, ...restCoeffs];\n while (coeffs.length > 0 && isZero(coeffs[coeffs.length - 1])) {\n coeffs.pop();\n }\n if (coeffs.length < 2) {\n throw new RangeError(\"Polynomial [\".concat(constant, \", \").concat(restCoeffs, \"] must have a non-zero non-constant coefficient\"));\n }\n switch (coeffs.length) {\n case 2:\n // linear\n return [unaryMinus(divide(coeffs[0], coeffs[1]))];\n case 3:\n {\n // quadratic\n var [c, b, a] = coeffs;\n var denom = multiply(2, a);\n var d1 = multiply(b, b);\n var d2 = multiply(4, a, c);\n if (equalScalar(d1, d2)) return [divide(unaryMinus(b), denom)];\n var discriminant = sqrt(subtract(d1, d2));\n return [divide(subtract(discriminant, b), denom), divide(subtract(unaryMinus(discriminant), b), denom)];\n }\n case 4:\n {\n // cubic, cf. https://en.wikipedia.org/wiki/Cubic_equation\n var [d, _c, _b, _a] = coeffs;\n var _denom = unaryMinus(multiply(3, _a));\n var D0_1 = multiply(_b, _b);\n var D0_2 = multiply(3, _a, _c);\n var D1_1 = add(multiply(2, _b, _b, _b), multiply(27, _a, _a, d));\n var D1_2 = multiply(9, _a, _b, _c);\n if (equalScalar(D0_1, D0_2) && equalScalar(D1_1, D1_2)) {\n return [divide(_b, _denom)];\n }\n var Delta0 = subtract(D0_1, D0_2);\n var Delta1 = subtract(D1_1, D1_2);\n var discriminant1 = add(multiply(18, _a, _b, _c, d), multiply(_b, _b, _c, _c));\n var discriminant2 = add(multiply(4, _b, _b, _b, d), multiply(4, _a, _c, _c, _c), multiply(27, _a, _a, d, d));\n if (equalScalar(discriminant1, discriminant2)) {\n return [divide(subtract(multiply(4, _a, _b, _c), add(multiply(9, _a, _a, d), multiply(_b, _b, _b))), multiply(_a, Delta0)),\n // simple root\n divide(subtract(multiply(9, _a, d), multiply(_b, _c)), multiply(2, Delta0)) // double root\n ];\n }\n // OK, we have three distinct roots\n var Ccubed;\n if (equalScalar(D0_1, D0_2)) {\n Ccubed = Delta1;\n } else {\n Ccubed = divide(add(Delta1, sqrt(subtract(multiply(Delta1, Delta1), multiply(4, Delta0, Delta0, Delta0)))), 2);\n }\n var allRoots = true;\n var rawRoots = cbrt(Ccubed, allRoots).toArray().map(C => divide(add(_b, C, divide(Delta0, C)), _denom));\n return rawRoots.map(r => {\n if (typeOf(r) === 'Complex' && equalScalar(re(r), re(r) + im(r))) {\n return re(r);\n }\n return r;\n });\n }\n default:\n throw new RangeError(\"only implemented for cubic or lower-order polynomials, not \".concat(coeffs));\n }\n }\n });\n});","import { isHelp } from '../utils/is.js';\nimport { clone } from '../utils/object.js';\nimport { format } from '../utils/string.js';\nimport { factory } from '../utils/factory.js';\nvar name = 'Help';\nvar dependencies = ['parse'];\nexport var createHelpClass = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n parse\n } = _ref;\n /**\n * Documentation object\n * @param {Object} doc Object containing properties:\n * {string} name\n * {string} category\n * {string} description\n * {string[]} syntax\n * {string[]} examples\n * {string[]} seealso\n * @constructor\n */\n function Help(doc) {\n if (!(this instanceof Help)) {\n throw new SyntaxError('Constructor must be called with the new operator');\n }\n if (!doc) throw new Error('Argument \"doc\" missing');\n this.doc = doc;\n }\n\n /**\n * Attach type information\n */\n Help.prototype.type = 'Help';\n Help.prototype.isHelp = true;\n\n /**\n * Generate a string representation of the Help object\n * @return {string} Returns a string\n * @private\n */\n Help.prototype.toString = function () {\n var doc = this.doc || {};\n var desc = '\\n';\n if (doc.name) {\n desc += 'Name: ' + doc.name + '\\n\\n';\n }\n if (doc.category) {\n desc += 'Category: ' + doc.category + '\\n\\n';\n }\n if (doc.description) {\n desc += 'Description:\\n ' + doc.description + '\\n\\n';\n }\n if (doc.syntax) {\n desc += 'Syntax:\\n ' + doc.syntax.join('\\n ') + '\\n\\n';\n }\n if (doc.examples) {\n desc += 'Examples:\\n';\n var scope = {};\n for (var i = 0; i < doc.examples.length; i++) {\n var expr = doc.examples[i];\n desc += ' ' + expr + '\\n';\n var res = void 0;\n try {\n // note: res can be undefined when `expr` is an empty string\n res = parse(expr).compile().evaluate(scope);\n } catch (e) {\n res = e;\n }\n if (res !== undefined && !isHelp(res)) {\n desc += ' ' + format(res, {\n precision: 14\n }) + '\\n';\n }\n }\n desc += '\\n';\n }\n if (doc.mayThrow && doc.mayThrow.length) {\n desc += 'Throws: ' + doc.mayThrow.join(', ') + '\\n\\n';\n }\n if (doc.seealso && doc.seealso.length) {\n desc += 'See also: ' + doc.seealso.join(', ') + '\\n';\n }\n return desc;\n };\n\n /**\n * Export the help object to JSON\n */\n Help.prototype.toJSON = function () {\n var obj = clone(this.doc);\n obj.mathjs = 'Help';\n return obj;\n };\n\n /**\n * Instantiate a Help object from a JSON object\n * @param {Object} json\n * @returns {Help} Returns a new Help object\n */\n Help.fromJSON = function (json) {\n var doc = {};\n Object.keys(json).filter(prop => prop !== 'mathjs').forEach(prop => {\n doc[prop] = json[prop];\n });\n return new Help(doc);\n };\n\n /**\n * Returns a string representation of the Help object\n */\n Help.prototype.valueOf = Help.prototype.toString;\n return Help;\n}, {\n isClass: true\n});","import { isChain } from '../../utils/is.js';\nimport { format } from '../../utils/string.js';\nimport { hasOwnProperty, lazy } from '../../utils/object.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'Chain';\nvar dependencies = ['?on', 'math', 'typed'];\nexport var createChainClass = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n on,\n math,\n typed\n } = _ref;\n /**\n * @constructor Chain\n * Wrap any value in a chain, allowing to perform chained operations on\n * the value.\n *\n * All methods available in the math.js library can be called upon the chain,\n * and then will be evaluated with the value itself as first argument.\n * The chain can be closed by executing chain.done(), which will return\n * the final value.\n *\n * The Chain has a number of special functions:\n * - done() Finalize the chained operation and return the\n * chain's value.\n * - valueOf() The same as done()\n * - toString() Returns a string representation of the chain's value.\n *\n * @param {*} [value]\n */\n function Chain(value) {\n if (!(this instanceof Chain)) {\n throw new SyntaxError('Constructor must be called with the new operator');\n }\n if (isChain(value)) {\n this.value = value.value;\n } else {\n this.value = value;\n }\n }\n\n /**\n * Attach type information\n */\n Chain.prototype.type = 'Chain';\n Chain.prototype.isChain = true;\n\n /**\n * Close the chain. Returns the final value.\n * Does the same as method valueOf()\n * @returns {*} value\n */\n Chain.prototype.done = function () {\n return this.value;\n };\n\n /**\n * Close the chain. Returns the final value.\n * Does the same as method done()\n * @returns {*} value\n */\n Chain.prototype.valueOf = function () {\n return this.value;\n };\n\n /**\n * Get a string representation of the value in the chain\n * @returns {string}\n */\n Chain.prototype.toString = function () {\n return format(this.value);\n };\n\n /**\n * Get a JSON representation of the chain\n * @returns {Object}\n */\n Chain.prototype.toJSON = function () {\n return {\n mathjs: 'Chain',\n value: this.value\n };\n };\n\n /**\n * Instantiate a Chain from its JSON representation\n * @param {Object} json An object structured like\n * `{\"mathjs\": \"Chain\", value: ...}`,\n * where mathjs is optional\n * @returns {Chain}\n */\n Chain.fromJSON = function (json) {\n return new Chain(json.value);\n };\n\n /**\n * Create a proxy method for the chain\n * @param {string} name\n * @param {Function} fn The function to be proxied\n * If fn is no function, it is silently ignored.\n * @private\n */\n function createProxy(name, fn) {\n if (typeof fn === 'function') {\n Chain.prototype[name] = chainify(fn);\n }\n }\n\n /**\n * Create a proxy method for the chain\n * @param {string} name\n * @param {function} resolver The function resolving with the\n * function to be proxied\n * @private\n */\n function createLazyProxy(name, resolver) {\n lazy(Chain.prototype, name, function outerResolver() {\n var fn = resolver();\n if (typeof fn === 'function') {\n return chainify(fn);\n }\n return undefined; // if not a function, ignore\n });\n }\n\n /**\n * Make a function chainable\n * @param {function} fn\n * @return {Function} chain function\n * @private\n */\n function chainify(fn) {\n return function () {\n // Here, `this` will be the context of a Chain instance\n if (arguments.length === 0) {\n return new Chain(fn(this.value));\n }\n var args = [this.value];\n for (var i = 0; i < arguments.length; i++) {\n args[i + 1] = arguments[i];\n }\n if (typed.isTypedFunction(fn)) {\n var sigObject = typed.resolve(fn, args);\n // We want to detect if a rest parameter has matched across the\n // value in the chain and the current arguments of this call.\n // That is the case if and only if the matching signature has\n // exactly one parameter (which then must be a rest parameter\n // as it is matching at least two actual arguments).\n if (sigObject.params.length === 1) {\n throw new Error('chain function ' + fn.name + ' cannot match rest parameter between chain value and additional arguments.');\n }\n return new Chain(sigObject.implementation.apply(fn, args));\n }\n return new Chain(fn.apply(fn, args));\n };\n }\n\n /**\n * Create a proxy for a single method, or an object with multiple methods.\n * Example usage:\n *\n * Chain.createProxy('add', function add (x, y) {...})\n * Chain.createProxy({\n * add: function add (x, y) {...},\n * subtract: function subtract (x, y) {...}\n * }\n *\n * @param {string | Object} arg0 A name (string), or an object with\n * functions\n * @param {*} [arg1] A function, when arg0 is a name\n */\n Chain.createProxy = function (arg0, arg1) {\n if (typeof arg0 === 'string') {\n // createProxy(name, value)\n createProxy(arg0, arg1);\n } else {\n var _loop = function _loop(_name) {\n if (hasOwnProperty(arg0, _name) && excludedNames[_name] === undefined) {\n createLazyProxy(_name, () => arg0[_name]);\n }\n };\n // createProxy(values)\n for (var _name in arg0) {\n _loop(_name);\n }\n }\n };\n var excludedNames = {\n expression: true,\n docs: true,\n type: true,\n classes: true,\n json: true,\n error: true,\n isChain: true // conflicts with the property isChain of a Chain instance\n };\n\n // create proxy for everything that is in math.js\n Chain.createProxy(math);\n\n // register on the import event, automatically add a proxy for every imported function.\n if (on) {\n on('import', function (name, resolver, path) {\n if (!path) {\n // an imported function (not a data type or something special)\n createLazyProxy(name, resolver);\n }\n });\n }\n return Chain;\n}, {\n isClass: true\n});","export var eDocs = {\n name: 'e',\n category: 'Constants',\n syntax: ['e'],\n description: 'Euler\\'s number, the base of the natural logarithm. Approximately equal to 2.71828',\n examples: ['e', 'e ^ 2', 'exp(2)', 'log(e)'],\n seealso: ['exp']\n};","export var piDocs = {\n name: 'pi',\n category: 'Constants',\n syntax: ['pi'],\n description: 'The number pi is a mathematical constant that is the ratio of a circle\\'s circumference to its diameter, and is approximately equal to 3.14159',\n examples: ['pi', 'sin(pi/2)'],\n seealso: ['tau']\n};","import { eDocs } from './constants/e.js';\nimport { falseDocs } from './constants/false.js';\nimport { iDocs } from './constants/i.js';\nimport { InfinityDocs } from './constants/Infinity.js';\nimport { LN10Docs } from './constants/LN10.js';\nimport { LN2Docs } from './constants/LN2.js';\nimport { LOG10EDocs } from './constants/LOG10E.js';\nimport { LOG2EDocs } from './constants/LOG2E.js';\nimport { NaNDocs } from './constants/NaN.js';\nimport { nullDocs } from './constants/null.js';\nimport { phiDocs } from './constants/phi.js';\nimport { piDocs } from './constants/pi.js';\nimport { SQRT12Docs } from './constants/SQRT1_2.js';\nimport { SQRT2Docs } from './constants/SQRT2.js';\nimport { tauDocs } from './constants/tau.js';\nimport { trueDocs } from './constants/true.js';\nimport { versionDocs } from './constants/version.js';\nimport { bignumberDocs } from './construction/bignumber.js';\nimport { booleanDocs } from './construction/boolean.js';\nimport { complexDocs } from './construction/complex.js';\nimport { createUnitDocs } from './construction/createUnit.js';\nimport { fractionDocs } from './construction/fraction.js';\nimport { indexDocs } from './construction/index.js';\nimport { matrixDocs } from './construction/matrix.js';\nimport { numberDocs } from './construction/number.js';\nimport { sparseDocs } from './construction/sparse.js';\nimport { splitUnitDocs } from './construction/splitUnit.js';\nimport { stringDocs } from './construction/string.js';\nimport { unitDocs } from './construction/unit.js';\nimport { configDocs } from './core/config.js';\nimport { importDocs } from './core/import.js';\nimport { typedDocs } from './core/typed.js';\nimport { derivativeDocs } from './function/algebra/derivative.js';\nimport { leafCountDocs } from './function/algebra/leafCount.js';\nimport { lsolveDocs } from './function/algebra/lsolve.js';\nimport { lsolveAllDocs } from './function/algebra/lsolveAll.js';\nimport { lupDocs } from './function/algebra/lup.js';\nimport { lusolveDocs } from './function/algebra/lusolve.js';\nimport { polynomialRootDocs } from './function/algebra/polynomialRoot.js';\nimport { qrDocs } from './function/algebra/qr.js';\nimport { rationalizeDocs } from './function/algebra/rationalize.js';\nimport { resolveDocs } from './function/algebra/resolve.js';\nimport { simplifyDocs } from './function/algebra/simplify.js';\nimport { simplifyConstantDocs } from './function/algebra/simplifyConstant.js';\nimport { simplifyCoreDocs } from './function/algebra/simplifyCore.js';\nimport { sluDocs } from './function/algebra/slu.js';\nimport { symbolicEqualDocs } from './function/algebra/symbolicEqual.js';\nimport { usolveDocs } from './function/algebra/usolve.js';\nimport { usolveAllDocs } from './function/algebra/usolveAll.js';\nimport { absDocs } from './function/arithmetic/abs.js';\nimport { addDocs } from './function/arithmetic/add.js';\nimport { cbrtDocs } from './function/arithmetic/cbrt.js';\nimport { ceilDocs } from './function/arithmetic/ceil.js';\nimport { cubeDocs } from './function/arithmetic/cube.js';\nimport { divideDocs } from './function/arithmetic/divide.js';\nimport { dotDivideDocs } from './function/arithmetic/dotDivide.js';\nimport { dotMultiplyDocs } from './function/arithmetic/dotMultiply.js';\nimport { dotPowDocs } from './function/arithmetic/dotPow.js';\nimport { expDocs } from './function/arithmetic/exp.js';\nimport { expmDocs } from './function/arithmetic/expm.js';\nimport { expm1Docs } from './function/arithmetic/expm1.js';\nimport { fixDocs } from './function/arithmetic/fix.js';\nimport { floorDocs } from './function/arithmetic/floor.js';\nimport { gcdDocs } from './function/arithmetic/gcd.js';\nimport { hypotDocs } from './function/arithmetic/hypot.js';\nimport { invmodDocs } from './function/arithmetic/invmod.js';\nimport { lcmDocs } from './function/arithmetic/lcm.js';\nimport { logDocs } from './function/arithmetic/log.js';\nimport { log10Docs } from './function/arithmetic/log10.js';\nimport { log1pDocs } from './function/arithmetic/log1p.js';\nimport { log2Docs } from './function/arithmetic/log2.js';\nimport { modDocs } from './function/arithmetic/mod.js';\nimport { multiplyDocs } from './function/arithmetic/multiply.js';\nimport { normDocs } from './function/arithmetic/norm.js';\nimport { nthRootDocs } from './function/arithmetic/nthRoot.js';\nimport { nthRootsDocs } from './function/arithmetic/nthRoots.js';\nimport { powDocs } from './function/arithmetic/pow.js';\nimport { roundDocs } from './function/arithmetic/round.js';\nimport { signDocs } from './function/arithmetic/sign.js';\nimport { sqrtDocs } from './function/arithmetic/sqrt.js';\nimport { sqrtmDocs } from './function/arithmetic/sqrtm.js';\nimport { sylvesterDocs } from './function/algebra/sylvester.js';\nimport { schurDocs } from './function/algebra/schur.js';\nimport { lyapDocs } from './function/algebra/lyap.js';\nimport { squareDocs } from './function/arithmetic/square.js';\nimport { subtractDocs } from './function/arithmetic/subtract.js';\nimport { unaryMinusDocs } from './function/arithmetic/unaryMinus.js';\nimport { unaryPlusDocs } from './function/arithmetic/unaryPlus.js';\nimport { xgcdDocs } from './function/arithmetic/xgcd.js';\nimport { bitAndDocs } from './function/bitwise/bitAnd.js';\nimport { bitNotDocs } from './function/bitwise/bitNot.js';\nimport { bitOrDocs } from './function/bitwise/bitOr.js';\nimport { bitXorDocs } from './function/bitwise/bitXor.js';\nimport { leftShiftDocs } from './function/bitwise/leftShift.js';\nimport { rightArithShiftDocs } from './function/bitwise/rightArithShift.js';\nimport { rightLogShiftDocs } from './function/bitwise/rightLogShift.js';\nimport { bellNumbersDocs } from './function/combinatorics/bellNumbers.js';\nimport { catalanDocs } from './function/combinatorics/catalan.js';\nimport { compositionDocs } from './function/combinatorics/composition.js';\nimport { stirlingS2Docs } from './function/combinatorics/stirlingS2.js';\nimport { argDocs } from './function/complex/arg.js';\nimport { conjDocs } from './function/complex/conj.js';\nimport { imDocs } from './function/complex/im.js';\nimport { reDocs } from './function/complex/re.js';\nimport { evaluateDocs } from './function/expression/evaluate.js';\nimport { helpDocs } from './function/expression/help.js';\nimport { distanceDocs } from './function/geometry/distance.js';\nimport { intersectDocs } from './function/geometry/intersect.js';\nimport { andDocs } from './function/logical/and.js';\nimport { notDocs } from './function/logical/not.js';\nimport { orDocs } from './function/logical/or.js';\nimport { xorDocs } from './function/logical/xor.js';\nimport { columnDocs } from './function/matrix/column.js';\nimport { concatDocs } from './function/matrix/concat.js';\nimport { countDocs } from './function/matrix/count.js';\nimport { crossDocs } from './function/matrix/cross.js';\nimport { ctransposeDocs } from './function/matrix/ctranspose.js';\nimport { detDocs } from './function/matrix/det.js';\nimport { diagDocs } from './function/matrix/diag.js';\nimport { diffDocs } from './function/matrix/diff.js';\nimport { dotDocs } from './function/matrix/dot.js';\nimport { eigsDocs } from './function/matrix/eigs.js';\nimport { filterDocs } from './function/matrix/filter.js';\nimport { flattenDocs } from './function/matrix/flatten.js';\nimport { forEachDocs } from './function/matrix/forEach.js';\nimport { getMatrixDataTypeDocs } from './function/matrix/getMatrixDataType.js';\nimport { identityDocs } from './function/matrix/identity.js';\nimport { invDocs } from './function/matrix/inv.js';\nimport { pinvDocs } from './function/matrix/pinv.js';\nimport { kronDocs } from './function/matrix/kron.js';\nimport { mapDocs } from './function/matrix/map.js';\nimport { matrixFromColumnsDocs } from './function/matrix/matrixFromColumns.js';\nimport { matrixFromFunctionDocs } from './function/matrix/matrixFromFunction.js';\nimport { matrixFromRowsDocs } from './function/matrix/matrixFromRows.js';\nimport { onesDocs } from './function/matrix/ones.js';\nimport { partitionSelectDocs } from './function/matrix/partitionSelect.js';\nimport { rangeDocs } from './function/matrix/range.js';\nimport { reshapeDocs } from './function/matrix/reshape.js';\nimport { resizeDocs } from './function/matrix/resize.js';\nimport { rotateDocs } from './function/matrix/rotate.js';\nimport { rotationMatrixDocs } from './function/matrix/rotationMatrix.js';\nimport { rowDocs } from './function/matrix/row.js';\nimport { sizeDocs } from './function/matrix/size.js';\nimport { sortDocs } from './function/matrix/sort.js';\nimport { squeezeDocs } from './function/matrix/squeeze.js';\nimport { subsetDocs } from './function/matrix/subset.js';\nimport { traceDocs } from './function/matrix/trace.js';\nimport { transposeDocs } from './function/matrix/transpose.js';\nimport { zerosDocs } from './function/matrix/zeros.js';\nimport { fftDocs } from './function/matrix/fft.js';\nimport { ifftDocs } from './function/matrix/ifft.js';\nimport { combinationsDocs } from './function/probability/combinations.js';\nimport { combinationsWithRepDocs } from './function/probability/combinationsWithRep.js';\nimport { factorialDocs } from './function/probability/factorial.js';\nimport { gammaDocs } from './function/probability/gamma.js';\nimport { lgammaDocs } from './function/probability/lgamma.js';\nimport { kldivergenceDocs } from './function/probability/kldivergence.js';\nimport { multinomialDocs } from './function/probability/multinomial.js';\nimport { permutationsDocs } from './function/probability/permutations.js';\nimport { pickRandomDocs } from './function/probability/pickRandom.js';\nimport { randomDocs } from './function/probability/random.js';\nimport { randomIntDocs } from './function/probability/randomInt.js';\nimport { compareDocs } from './function/relational/compare.js';\nimport { compareNaturalDocs } from './function/relational/compareNatural.js';\nimport { compareTextDocs } from './function/relational/compareText.js';\nimport { deepEqualDocs } from './function/relational/deepEqual.js';\nimport { equalDocs } from './function/relational/equal.js';\nimport { equalTextDocs } from './function/relational/equalText.js';\nimport { largerDocs } from './function/relational/larger.js';\nimport { largerEqDocs } from './function/relational/largerEq.js';\nimport { smallerDocs } from './function/relational/smaller.js';\nimport { smallerEqDocs } from './function/relational/smallerEq.js';\nimport { unequalDocs } from './function/relational/unequal.js';\nimport { setCartesianDocs } from './function/set/setCartesian.js';\nimport { setDifferenceDocs } from './function/set/setDifference.js';\nimport { setDistinctDocs } from './function/set/setDistinct.js';\nimport { setIntersectDocs } from './function/set/setIntersect.js';\nimport { setIsSubsetDocs } from './function/set/setIsSubset.js';\nimport { setMultiplicityDocs } from './function/set/setMultiplicity.js';\nimport { setPowersetDocs } from './function/set/setPowerset.js';\nimport { setSizeDocs } from './function/set/setSize.js';\nimport { setSymDifferenceDocs } from './function/set/setSymDifference.js';\nimport { setUnionDocs } from './function/set/setUnion.js';\nimport { zpk2tfDocs } from './function/signal/zpk2tf.js';\nimport { freqzDocs } from './function/signal/freqz.js';\nimport { erfDocs } from './function/special/erf.js';\nimport { madDocs } from './function/statistics/mad.js';\nimport { maxDocs } from './function/statistics/max.js';\nimport { meanDocs } from './function/statistics/mean.js';\nimport { medianDocs } from './function/statistics/median.js';\nimport { minDocs } from './function/statistics/min.js';\nimport { modeDocs } from './function/statistics/mode.js';\nimport { prodDocs } from './function/statistics/prod.js';\nimport { quantileSeqDocs } from './function/statistics/quantileSeq.js';\nimport { stdDocs } from './function/statistics/std.js';\nimport { cumSumDocs } from './function/statistics/cumsum.js';\nimport { sumDocs } from './function/statistics/sum.js';\nimport { varianceDocs } from './function/statistics/variance.js';\nimport { acosDocs } from './function/trigonometry/acos.js';\nimport { acoshDocs } from './function/trigonometry/acosh.js';\nimport { acotDocs } from './function/trigonometry/acot.js';\nimport { acothDocs } from './function/trigonometry/acoth.js';\nimport { acscDocs } from './function/trigonometry/acsc.js';\nimport { acschDocs } from './function/trigonometry/acsch.js';\nimport { asecDocs } from './function/trigonometry/asec.js';\nimport { asechDocs } from './function/trigonometry/asech.js';\nimport { asinDocs } from './function/trigonometry/asin.js';\nimport { asinhDocs } from './function/trigonometry/asinh.js';\nimport { atanDocs } from './function/trigonometry/atan.js';\nimport { atan2Docs } from './function/trigonometry/atan2.js';\nimport { atanhDocs } from './function/trigonometry/atanh.js';\nimport { cosDocs } from './function/trigonometry/cos.js';\nimport { coshDocs } from './function/trigonometry/cosh.js';\nimport { cotDocs } from './function/trigonometry/cot.js';\nimport { cothDocs } from './function/trigonometry/coth.js';\nimport { cscDocs } from './function/trigonometry/csc.js';\nimport { cschDocs } from './function/trigonometry/csch.js';\nimport { secDocs } from './function/trigonometry/sec.js';\nimport { sechDocs } from './function/trigonometry/sech.js';\nimport { sinDocs } from './function/trigonometry/sin.js';\nimport { sinhDocs } from './function/trigonometry/sinh.js';\nimport { tanDocs } from './function/trigonometry/tan.js';\nimport { tanhDocs } from './function/trigonometry/tanh.js';\nimport { toDocs } from './function/units/to.js';\nimport { binDocs } from './function/utils/bin.js';\nimport { cloneDocs } from './function/utils/clone.js';\nimport { formatDocs } from './function/utils/format.js';\nimport { hasNumericValueDocs } from './function/utils/hasNumericValue.js';\nimport { hexDocs } from './function/utils/hex.js';\nimport { isIntegerDocs } from './function/utils/isInteger.js';\nimport { isNaNDocs } from './function/utils/isNaN.js';\nimport { isNegativeDocs } from './function/utils/isNegative.js';\nimport { isNumericDocs } from './function/utils/isNumeric.js';\nimport { isPositiveDocs } from './function/utils/isPositive.js';\nimport { isPrimeDocs } from './function/utils/isPrime.js';\nimport { isZeroDocs } from './function/utils/isZero.js';\nimport { numericDocs } from './function/utils/numeric.js';\nimport { octDocs } from './function/utils/oct.js';\nimport { printDocs } from './function/utils/print.js';\nimport { typeOfDocs } from './function/utils/typeOf.js';\nimport { solveODEDocs } from './function/numeric/solveODE.js';\nexport var embeddedDocs = {\n // construction functions\n bignumber: bignumberDocs,\n boolean: booleanDocs,\n complex: complexDocs,\n createUnit: createUnitDocs,\n fraction: fractionDocs,\n index: indexDocs,\n matrix: matrixDocs,\n number: numberDocs,\n sparse: sparseDocs,\n splitUnit: splitUnitDocs,\n string: stringDocs,\n unit: unitDocs,\n // constants\n e: eDocs,\n E: eDocs,\n false: falseDocs,\n i: iDocs,\n Infinity: InfinityDocs,\n LN2: LN2Docs,\n LN10: LN10Docs,\n LOG2E: LOG2EDocs,\n LOG10E: LOG10EDocs,\n NaN: NaNDocs,\n null: nullDocs,\n pi: piDocs,\n PI: piDocs,\n phi: phiDocs,\n SQRT1_2: SQRT12Docs,\n SQRT2: SQRT2Docs,\n tau: tauDocs,\n true: trueDocs,\n version: versionDocs,\n // physical constants\n // TODO: more detailed docs for physical constants\n speedOfLight: {\n description: 'Speed of light in vacuum',\n examples: ['speedOfLight']\n },\n gravitationConstant: {\n description: 'Newtonian constant of gravitation',\n examples: ['gravitationConstant']\n },\n planckConstant: {\n description: 'Planck constant',\n examples: ['planckConstant']\n },\n reducedPlanckConstant: {\n description: 'Reduced Planck constant',\n examples: ['reducedPlanckConstant']\n },\n magneticConstant: {\n description: 'Magnetic constant (vacuum permeability)',\n examples: ['magneticConstant']\n },\n electricConstant: {\n description: 'Electric constant (vacuum permeability)',\n examples: ['electricConstant']\n },\n vacuumImpedance: {\n description: 'Characteristic impedance of vacuum',\n examples: ['vacuumImpedance']\n },\n coulomb: {\n description: 'Coulomb\\'s constant',\n examples: ['coulomb']\n },\n elementaryCharge: {\n description: 'Elementary charge',\n examples: ['elementaryCharge']\n },\n bohrMagneton: {\n description: 'Borh magneton',\n examples: ['bohrMagneton']\n },\n conductanceQuantum: {\n description: 'Conductance quantum',\n examples: ['conductanceQuantum']\n },\n inverseConductanceQuantum: {\n description: 'Inverse conductance quantum',\n examples: ['inverseConductanceQuantum']\n },\n // josephson: {description: 'Josephson constant', examples: ['josephson']},\n magneticFluxQuantum: {\n description: 'Magnetic flux quantum',\n examples: ['magneticFluxQuantum']\n },\n nuclearMagneton: {\n description: 'Nuclear magneton',\n examples: ['nuclearMagneton']\n },\n klitzing: {\n description: 'Von Klitzing constant',\n examples: ['klitzing']\n },\n bohrRadius: {\n description: 'Borh radius',\n examples: ['bohrRadius']\n },\n classicalElectronRadius: {\n description: 'Classical electron radius',\n examples: ['classicalElectronRadius']\n },\n electronMass: {\n description: 'Electron mass',\n examples: ['electronMass']\n },\n fermiCoupling: {\n description: 'Fermi coupling constant',\n examples: ['fermiCoupling']\n },\n fineStructure: {\n description: 'Fine-structure constant',\n examples: ['fineStructure']\n },\n hartreeEnergy: {\n description: 'Hartree energy',\n examples: ['hartreeEnergy']\n },\n protonMass: {\n description: 'Proton mass',\n examples: ['protonMass']\n },\n deuteronMass: {\n description: 'Deuteron Mass',\n examples: ['deuteronMass']\n },\n neutronMass: {\n description: 'Neutron mass',\n examples: ['neutronMass']\n },\n quantumOfCirculation: {\n description: 'Quantum of circulation',\n examples: ['quantumOfCirculation']\n },\n rydberg: {\n description: 'Rydberg constant',\n examples: ['rydberg']\n },\n thomsonCrossSection: {\n description: 'Thomson cross section',\n examples: ['thomsonCrossSection']\n },\n weakMixingAngle: {\n description: 'Weak mixing angle',\n examples: ['weakMixingAngle']\n },\n efimovFactor: {\n description: 'Efimov factor',\n examples: ['efimovFactor']\n },\n atomicMass: {\n description: 'Atomic mass constant',\n examples: ['atomicMass']\n },\n avogadro: {\n description: 'Avogadro\\'s number',\n examples: ['avogadro']\n },\n boltzmann: {\n description: 'Boltzmann constant',\n examples: ['boltzmann']\n },\n faraday: {\n description: 'Faraday constant',\n examples: ['faraday']\n },\n firstRadiation: {\n description: 'First radiation constant',\n examples: ['firstRadiation']\n },\n loschmidt: {\n description: 'Loschmidt constant at T=273.15 K and p=101.325 kPa',\n examples: ['loschmidt']\n },\n gasConstant: {\n description: 'Gas constant',\n examples: ['gasConstant']\n },\n molarPlanckConstant: {\n description: 'Molar Planck constant',\n examples: ['molarPlanckConstant']\n },\n molarVolume: {\n description: 'Molar volume of an ideal gas at T=273.15 K and p=101.325 kPa',\n examples: ['molarVolume']\n },\n sackurTetrode: {\n description: 'Sackur-Tetrode constant at T=1 K and p=101.325 kPa',\n examples: ['sackurTetrode']\n },\n secondRadiation: {\n description: 'Second radiation constant',\n examples: ['secondRadiation']\n },\n stefanBoltzmann: {\n description: 'Stefan-Boltzmann constant',\n examples: ['stefanBoltzmann']\n },\n wienDisplacement: {\n description: 'Wien displacement law constant',\n examples: ['wienDisplacement']\n },\n // spectralRadiance: {description: 'First radiation constant for spectral radiance', examples: ['spectralRadiance']},\n\n molarMass: {\n description: 'Molar mass constant',\n examples: ['molarMass']\n },\n molarMassC12: {\n description: 'Molar mass constant of carbon-12',\n examples: ['molarMassC12']\n },\n gravity: {\n description: 'Standard acceleration of gravity (standard acceleration of free-fall on Earth)',\n examples: ['gravity']\n },\n planckLength: {\n description: 'Planck length',\n examples: ['planckLength']\n },\n planckMass: {\n description: 'Planck mass',\n examples: ['planckMass']\n },\n planckTime: {\n description: 'Planck time',\n examples: ['planckTime']\n },\n planckCharge: {\n description: 'Planck charge',\n examples: ['planckCharge']\n },\n planckTemperature: {\n description: 'Planck temperature',\n examples: ['planckTemperature']\n },\n // functions - algebra\n derivative: derivativeDocs,\n lsolve: lsolveDocs,\n lsolveAll: lsolveAllDocs,\n lup: lupDocs,\n lusolve: lusolveDocs,\n leafCount: leafCountDocs,\n polynomialRoot: polynomialRootDocs,\n resolve: resolveDocs,\n simplify: simplifyDocs,\n simplifyConstant: simplifyConstantDocs,\n simplifyCore: simplifyCoreDocs,\n symbolicEqual: symbolicEqualDocs,\n rationalize: rationalizeDocs,\n slu: sluDocs,\n usolve: usolveDocs,\n usolveAll: usolveAllDocs,\n qr: qrDocs,\n // functions - arithmetic\n abs: absDocs,\n add: addDocs,\n cbrt: cbrtDocs,\n ceil: ceilDocs,\n cube: cubeDocs,\n divide: divideDocs,\n dotDivide: dotDivideDocs,\n dotMultiply: dotMultiplyDocs,\n dotPow: dotPowDocs,\n exp: expDocs,\n expm: expmDocs,\n expm1: expm1Docs,\n fix: fixDocs,\n floor: floorDocs,\n gcd: gcdDocs,\n hypot: hypotDocs,\n lcm: lcmDocs,\n log: logDocs,\n log2: log2Docs,\n log1p: log1pDocs,\n log10: log10Docs,\n mod: modDocs,\n multiply: multiplyDocs,\n norm: normDocs,\n nthRoot: nthRootDocs,\n nthRoots: nthRootsDocs,\n pow: powDocs,\n round: roundDocs,\n sign: signDocs,\n sqrt: sqrtDocs,\n sqrtm: sqrtmDocs,\n square: squareDocs,\n subtract: subtractDocs,\n unaryMinus: unaryMinusDocs,\n unaryPlus: unaryPlusDocs,\n xgcd: xgcdDocs,\n invmod: invmodDocs,\n // functions - bitwise\n bitAnd: bitAndDocs,\n bitNot: bitNotDocs,\n bitOr: bitOrDocs,\n bitXor: bitXorDocs,\n leftShift: leftShiftDocs,\n rightArithShift: rightArithShiftDocs,\n rightLogShift: rightLogShiftDocs,\n // functions - combinatorics\n bellNumbers: bellNumbersDocs,\n catalan: catalanDocs,\n composition: compositionDocs,\n stirlingS2: stirlingS2Docs,\n // functions - core\n config: configDocs,\n import: importDocs,\n typed: typedDocs,\n // functions - complex\n arg: argDocs,\n conj: conjDocs,\n re: reDocs,\n im: imDocs,\n // functions - expression\n evaluate: evaluateDocs,\n help: helpDocs,\n // functions - geometry\n distance: distanceDocs,\n intersect: intersectDocs,\n // functions - logical\n and: andDocs,\n not: notDocs,\n or: orDocs,\n xor: xorDocs,\n // functions - matrix\n concat: concatDocs,\n count: countDocs,\n cross: crossDocs,\n column: columnDocs,\n ctranspose: ctransposeDocs,\n det: detDocs,\n diag: diagDocs,\n diff: diffDocs,\n dot: dotDocs,\n getMatrixDataType: getMatrixDataTypeDocs,\n identity: identityDocs,\n filter: filterDocs,\n flatten: flattenDocs,\n forEach: forEachDocs,\n inv: invDocs,\n pinv: pinvDocs,\n eigs: eigsDocs,\n kron: kronDocs,\n matrixFromFunction: matrixFromFunctionDocs,\n matrixFromRows: matrixFromRowsDocs,\n matrixFromColumns: matrixFromColumnsDocs,\n map: mapDocs,\n ones: onesDocs,\n partitionSelect: partitionSelectDocs,\n range: rangeDocs,\n resize: resizeDocs,\n reshape: reshapeDocs,\n rotate: rotateDocs,\n rotationMatrix: rotationMatrixDocs,\n row: rowDocs,\n size: sizeDocs,\n sort: sortDocs,\n squeeze: squeezeDocs,\n subset: subsetDocs,\n trace: traceDocs,\n transpose: transposeDocs,\n zeros: zerosDocs,\n fft: fftDocs,\n ifft: ifftDocs,\n sylvester: sylvesterDocs,\n schur: schurDocs,\n lyap: lyapDocs,\n // functions - numeric\n solveODE: solveODEDocs,\n // functions - probability\n combinations: combinationsDocs,\n combinationsWithRep: combinationsWithRepDocs,\n // distribution: distributionDocs,\n factorial: factorialDocs,\n gamma: gammaDocs,\n kldivergence: kldivergenceDocs,\n lgamma: lgammaDocs,\n multinomial: multinomialDocs,\n permutations: permutationsDocs,\n pickRandom: pickRandomDocs,\n random: randomDocs,\n randomInt: randomIntDocs,\n // functions - relational\n compare: compareDocs,\n compareNatural: compareNaturalDocs,\n compareText: compareTextDocs,\n deepEqual: deepEqualDocs,\n equal: equalDocs,\n equalText: equalTextDocs,\n larger: largerDocs,\n largerEq: largerEqDocs,\n smaller: smallerDocs,\n smallerEq: smallerEqDocs,\n unequal: unequalDocs,\n // functions - set\n setCartesian: setCartesianDocs,\n setDifference: setDifferenceDocs,\n setDistinct: setDistinctDocs,\n setIntersect: setIntersectDocs,\n setIsSubset: setIsSubsetDocs,\n setMultiplicity: setMultiplicityDocs,\n setPowerset: setPowersetDocs,\n setSize: setSizeDocs,\n setSymDifference: setSymDifferenceDocs,\n setUnion: setUnionDocs,\n // functions - signal\n zpk2tf: zpk2tfDocs,\n freqz: freqzDocs,\n // functions - special\n erf: erfDocs,\n // functions - statistics\n cumsum: cumSumDocs,\n mad: madDocs,\n max: maxDocs,\n mean: meanDocs,\n median: medianDocs,\n min: minDocs,\n mode: modeDocs,\n prod: prodDocs,\n quantileSeq: quantileSeqDocs,\n std: stdDocs,\n sum: sumDocs,\n variance: varianceDocs,\n // functions - trigonometry\n acos: acosDocs,\n acosh: acoshDocs,\n acot: acotDocs,\n acoth: acothDocs,\n acsc: acscDocs,\n acsch: acschDocs,\n asec: asecDocs,\n asech: asechDocs,\n asin: asinDocs,\n asinh: asinhDocs,\n atan: atanDocs,\n atanh: atanhDocs,\n atan2: atan2Docs,\n cos: cosDocs,\n cosh: coshDocs,\n cot: cotDocs,\n coth: cothDocs,\n csc: cscDocs,\n csch: cschDocs,\n sec: secDocs,\n sech: sechDocs,\n sin: sinDocs,\n sinh: sinhDocs,\n tan: tanDocs,\n tanh: tanhDocs,\n // functions - units\n to: toDocs,\n // functions - utils\n clone: cloneDocs,\n format: formatDocs,\n bin: binDocs,\n oct: octDocs,\n hex: hexDocs,\n isNaN: isNaNDocs,\n isInteger: isIntegerDocs,\n isNegative: isNegativeDocs,\n isNumeric: isNumericDocs,\n hasNumericValue: hasNumericValueDocs,\n isPositive: isPositiveDocs,\n isPrime: isPrimeDocs,\n isZero: isZeroDocs,\n print: printDocs,\n typeOf: typeOfDocs,\n numeric: numericDocs\n};","export var bignumberDocs = {\n name: 'bignumber',\n category: 'Construction',\n syntax: ['bignumber(x)'],\n description: 'Create a big number from a number or string.',\n examples: ['0.1 + 0.2', 'bignumber(0.1) + bignumber(0.2)', 'bignumber(\"7.2\")', 'bignumber(\"7.2e500\")', 'bignumber([0.1, 0.2, 0.3])'],\n seealso: ['boolean', 'complex', 'fraction', 'index', 'matrix', 'string', 'unit']\n};","export var booleanDocs = {\n name: 'boolean',\n category: 'Construction',\n syntax: ['x', 'boolean(x)'],\n description: 'Convert a string or number into a boolean.',\n examples: ['boolean(0)', 'boolean(1)', 'boolean(3)', 'boolean(\"true\")', 'boolean(\"false\")', 'boolean([1, 0, 1, 1])'],\n seealso: ['bignumber', 'complex', 'index', 'matrix', 'number', 'string', 'unit']\n};","export var complexDocs = {\n name: 'complex',\n category: 'Construction',\n syntax: ['complex()', 'complex(re, im)', 'complex(string)'],\n description: 'Create a complex number.',\n examples: ['complex()', 'complex(2, 3)', 'complex(\"7 - 2i\")'],\n seealso: ['bignumber', 'boolean', 'index', 'matrix', 'number', 'string', 'unit']\n};","export var createUnitDocs = {\n name: 'createUnit',\n category: 'Construction',\n syntax: ['createUnit(definitions)', 'createUnit(name, definition)'],\n description: 'Create a user-defined unit and register it with the Unit type.',\n examples: ['createUnit(\"foo\")', 'createUnit(\"knot\", {definition: \"0.514444444 m/s\", aliases: [\"knots\", \"kt\", \"kts\"]})', 'createUnit(\"mph\", \"1 mile/hour\")'],\n seealso: ['unit', 'splitUnit']\n};","export var fractionDocs = {\n name: 'fraction',\n category: 'Construction',\n syntax: ['fraction(num)', 'fraction(matrix)', 'fraction(num,den)', 'fraction({n: num, d: den})'],\n description: 'Create a fraction from a number or from integer numerator and denominator.',\n examples: ['fraction(0.125)', 'fraction(1, 3) + fraction(2, 5)', 'fraction({n: 333, d: 53})', 'fraction([sqrt(9), sqrt(10), sqrt(11)])'],\n seealso: ['bignumber', 'boolean', 'complex', 'index', 'matrix', 'string', 'unit']\n};","export var indexDocs = {\n name: 'index',\n category: 'Construction',\n syntax: ['[start]', '[start:end]', '[start:step:end]', '[start1, start 2, ...]', '[start1:end1, start2:end2, ...]', '[start1:step1:end1, start2:step2:end2, ...]'],\n description: 'Create an index to get or replace a subset of a matrix',\n examples: ['[1, 2, 3]', 'A = [1, 2, 3; 4, 5, 6]', 'A[1, :]', 'A[1, 2] = 50', 'A[1:2, 1:2] = ones(2, 2)'],\n seealso: ['bignumber', 'boolean', 'complex', 'matrix,', 'number', 'range', 'string', 'unit']\n};","export var matrixDocs = {\n name: 'matrix',\n category: 'Construction',\n syntax: ['[]', '[a1, b1, ...; a2, b2, ...]', 'matrix()', 'matrix(\"dense\")', 'matrix([...])'],\n description: 'Create a matrix.',\n examples: ['[]', '[1, 2, 3]', '[1, 2, 3; 4, 5, 6]', 'matrix()', 'matrix([3, 4])', 'matrix([3, 4; 5, 6], \"sparse\")', 'matrix([3, 4; 5, 6], \"sparse\", \"number\")'],\n seealso: ['bignumber', 'boolean', 'complex', 'index', 'number', 'string', 'unit', 'sparse']\n};","export var numberDocs = {\n name: 'number',\n category: 'Construction',\n syntax: ['x', 'number(x)', 'number(unit, valuelessUnit)'],\n description: 'Create a number or convert a string or boolean into a number.',\n examples: ['2', '2e3', '4.05', 'number(2)', 'number(\"7.2\")', 'number(true)', 'number([true, false, true, true])', 'number(unit(\"52cm\"), \"m\")'],\n seealso: ['bignumber', 'boolean', 'complex', 'fraction', 'index', 'matrix', 'string', 'unit']\n};","export var sparseDocs = {\n name: 'sparse',\n category: 'Construction',\n syntax: ['sparse()', 'sparse([a1, b1, ...; a1, b2, ...])', 'sparse([a1, b1, ...; a1, b2, ...], \"number\")'],\n description: 'Create a sparse matrix.',\n examples: ['sparse()', 'sparse([3, 4; 5, 6])', 'sparse([3, 0; 5, 0], \"number\")'],\n seealso: ['bignumber', 'boolean', 'complex', 'index', 'number', 'string', 'unit', 'matrix']\n};","export var splitUnitDocs = {\n name: 'splitUnit',\n category: 'Construction',\n syntax: ['splitUnit(unit: Unit, parts: Unit[])'],\n description: 'Split a unit in an array of units whose sum is equal to the original unit.',\n examples: ['splitUnit(1 m, [\"feet\", \"inch\"])'],\n seealso: ['unit', 'createUnit']\n};","export var stringDocs = {\n name: 'string',\n category: 'Construction',\n syntax: ['\"text\"', 'string(x)'],\n description: 'Create a string or convert a value to a string',\n examples: ['\"Hello World!\"', 'string(4.2)', 'string(3 + 2i)'],\n seealso: ['bignumber', 'boolean', 'complex', 'index', 'matrix', 'number', 'unit']\n};","export var unitDocs = {\n name: 'unit',\n category: 'Construction',\n syntax: ['value unit', 'unit(value, unit)', 'unit(string)'],\n description: 'Create a unit.',\n examples: ['5.5 mm', '3 inch', 'unit(7.1, \"kilogram\")', 'unit(\"23 deg\")'],\n seealso: ['bignumber', 'boolean', 'complex', 'index', 'matrix', 'number', 'string']\n};","export var falseDocs = {\n name: 'false',\n category: 'Constants',\n syntax: ['false'],\n description: 'Boolean value false',\n examples: ['false'],\n seealso: ['true']\n};","export var iDocs = {\n name: 'i',\n category: 'Constants',\n syntax: ['i'],\n description: 'Imaginary unit, defined as i*i=-1. A complex number is described as a + b*i, where a is the real part, and b is the imaginary part.',\n examples: ['i', 'i * i', 'sqrt(-1)'],\n seealso: []\n};","export var InfinityDocs = {\n name: 'Infinity',\n category: 'Constants',\n syntax: ['Infinity'],\n description: 'Infinity, a number which is larger than the maximum number that can be handled by a floating point number.',\n examples: ['Infinity', '1 / 0'],\n seealso: []\n};","export var LN2Docs = {\n name: 'LN2',\n category: 'Constants',\n syntax: ['LN2'],\n description: 'Returns the natural logarithm of 2, approximately equal to 0.693',\n examples: ['LN2', 'log(2)'],\n seealso: []\n};","export var LN10Docs = {\n name: 'LN10',\n category: 'Constants',\n syntax: ['LN10'],\n description: 'Returns the natural logarithm of 10, approximately equal to 2.302',\n examples: ['LN10', 'log(10)'],\n seealso: []\n};","export var LOG2EDocs = {\n name: 'LOG2E',\n category: 'Constants',\n syntax: ['LOG2E'],\n description: 'Returns the base-2 logarithm of E, approximately equal to 1.442',\n examples: ['LOG2E', 'log(e, 2)'],\n seealso: []\n};","export var LOG10EDocs = {\n name: 'LOG10E',\n category: 'Constants',\n syntax: ['LOG10E'],\n description: 'Returns the base-10 logarithm of E, approximately equal to 0.434',\n examples: ['LOG10E', 'log(e, 10)'],\n seealso: []\n};","export var NaNDocs = {\n name: 'NaN',\n category: 'Constants',\n syntax: ['NaN'],\n description: 'Not a number',\n examples: ['NaN', '0 / 0'],\n seealso: []\n};","export var nullDocs = {\n name: 'null',\n category: 'Constants',\n syntax: ['null'],\n description: 'Value null',\n examples: ['null'],\n seealso: ['true', 'false']\n};","export var phiDocs = {\n name: 'phi',\n category: 'Constants',\n syntax: ['phi'],\n description: 'Phi is the golden ratio. Two quantities are in the golden ratio if their ratio is the same as the ratio of their sum to the larger of the two quantities. Phi is defined as `(1 + sqrt(5)) / 2` and is approximately 1.618034...',\n examples: ['phi'],\n seealso: []\n};","export var SQRT12Docs = {\n name: 'SQRT1_2',\n category: 'Constants',\n syntax: ['SQRT1_2'],\n description: 'Returns the square root of 1/2, approximately equal to 0.707',\n examples: ['SQRT1_2', 'sqrt(1/2)'],\n seealso: []\n};","export var SQRT2Docs = {\n name: 'SQRT2',\n category: 'Constants',\n syntax: ['SQRT2'],\n description: 'Returns the square root of 2, approximately equal to 1.414',\n examples: ['SQRT2', 'sqrt(2)'],\n seealso: []\n};","export var tauDocs = {\n name: 'tau',\n category: 'Constants',\n syntax: ['tau'],\n description: 'Tau is the ratio constant of a circle\\'s circumference to radius, equal to 2 * pi, approximately 6.2832.',\n examples: ['tau', '2 * pi'],\n seealso: ['pi']\n};","export var trueDocs = {\n name: 'true',\n category: 'Constants',\n syntax: ['true'],\n description: 'Boolean value true',\n examples: ['true'],\n seealso: ['false']\n};","export var versionDocs = {\n name: 'version',\n category: 'Constants',\n syntax: ['version'],\n description: 'A string with the version number of math.js',\n examples: ['version'],\n seealso: []\n};","export var derivativeDocs = {\n name: 'derivative',\n category: 'Algebra',\n syntax: ['derivative(expr, variable)', 'derivative(expr, variable, {simplify: boolean})'],\n description: 'Takes the derivative of an expression expressed in parser Nodes. The derivative will be taken over the supplied variable in the second parameter. If there are multiple variables in the expression, it will return a partial derivative.',\n examples: ['derivative(\"2x^3\", \"x\")', 'derivative(\"2x^3\", \"x\", {simplify: false})', 'derivative(\"2x^2 + 3x + 4\", \"x\")', 'derivative(\"sin(2x)\", \"x\")', 'f = parse(\"x^2 + x\")', 'x = parse(\"x\")', 'df = derivative(f, x)', 'df.evaluate({x: 3})'],\n seealso: ['simplify', 'parse', 'evaluate']\n};","export var lsolveDocs = {\n name: 'lsolve',\n category: 'Algebra',\n syntax: ['x=lsolve(L, b)'],\n description: 'Finds one solution of the linear system L * x = b where L is an [n x n] lower triangular matrix and b is a [n] column vector.',\n examples: ['a = [-2, 3; 2, 1]', 'b = [11, 9]', 'x = lsolve(a, b)'],\n seealso: ['lsolveAll', 'lup', 'lusolve', 'usolve', 'matrix', 'sparse']\n};","export var lsolveAllDocs = {\n name: 'lsolveAll',\n category: 'Algebra',\n syntax: ['x=lsolveAll(L, b)'],\n description: 'Finds all solutions of the linear system L * x = b where L is an [n x n] lower triangular matrix and b is a [n] column vector.',\n examples: ['a = [-2, 3; 2, 1]', 'b = [11, 9]', 'x = lsolve(a, b)'],\n seealso: ['lsolve', 'lup', 'lusolve', 'usolve', 'matrix', 'sparse']\n};","export var lupDocs = {\n name: 'lup',\n category: 'Algebra',\n syntax: ['lup(m)'],\n description: 'Calculate the Matrix LU decomposition with partial pivoting. Matrix A is decomposed in three matrices (L, U, P) where P * A = L * U',\n examples: ['lup([[2, 1], [1, 4]])', 'lup(matrix([[2, 1], [1, 4]]))', 'lup(sparse([[2, 1], [1, 4]]))'],\n seealso: ['lusolve', 'lsolve', 'usolve', 'matrix', 'sparse', 'slu', 'qr']\n};","export var lusolveDocs = {\n name: 'lusolve',\n category: 'Algebra',\n syntax: ['x=lusolve(A, b)', 'x=lusolve(lu, b)'],\n description: 'Solves the linear system A * x = b where A is an [n x n] matrix and b is a [n] column vector.',\n examples: ['a = [-2, 3; 2, 1]', 'b = [11, 9]', 'x = lusolve(a, b)'],\n seealso: ['lup', 'slu', 'lsolve', 'usolve', 'matrix', 'sparse']\n};","export var leafCountDocs = {\n name: 'leafCount',\n category: 'Algebra',\n syntax: ['leafCount(expr)'],\n description: 'Computes the number of leaves in the parse tree of the given expression',\n examples: ['leafCount(\"e^(i*pi)-1\")', 'leafCount(parse(\"{a: 22/7, b: 10^(1/2)}\"))'],\n seealso: ['simplify']\n};","export var polynomialRootDocs = {\n name: 'polynomialRoot',\n category: 'Algebra',\n syntax: ['x=polynomialRoot(-6, 3)', 'x=polynomialRoot(4, -4, 1)', 'x=polynomialRoot(-8, 12, -6, 1)'],\n description: 'Finds the roots of a univariate polynomial given by its coefficients starting from constant, linear, and so on, increasing in degree.',\n examples: ['a = polynomialRoot(-6, 11, -6, 1)'],\n seealso: ['cbrt', 'sqrt']\n};","export var resolveDocs = {\n name: 'resolve',\n category: 'Algebra',\n syntax: ['resolve(node, scope)'],\n description: 'Recursively substitute variables in an expression tree.',\n examples: ['resolve(parse(\"1 + x\"), { x: 7 })', 'resolve(parse(\"size(text)\"), { text: \"Hello World\" })', 'resolve(parse(\"x + y\"), { x: parse(\"3z\") })', 'resolve(parse(\"3x\"), { x: parse(\"y+z\"), z: parse(\"w^y\") })'],\n seealso: ['simplify', 'evaluate'],\n mayThrow: ['ReferenceError']\n};","export var simplifyDocs = {\n name: 'simplify',\n category: 'Algebra',\n syntax: ['simplify(expr)', 'simplify(expr, rules)'],\n description: 'Simplify an expression tree.',\n examples: ['simplify(\"3 + 2 / 4\")', 'simplify(\"2x + x\")', 'f = parse(\"x * (x + 2 + x)\")', 'simplified = simplify(f)', 'simplified.evaluate({x: 2})'],\n seealso: ['simplifyCore', 'derivative', 'evaluate', 'parse', 'rationalize', 'resolve']\n};","export var simplifyConstantDocs = {\n name: 'simplifyConstant',\n category: 'Algebra',\n syntax: ['simplifyConstant(expr)', 'simplifyConstant(expr, options)'],\n description: 'Replace constant subexpressions of node with their values.',\n examples: ['simplifyConstant(\"(3-3)*x\")', 'simplifyConstant(parse(\"z-cos(tau/8)\"))'],\n seealso: ['simplify', 'simplifyCore', 'evaluate']\n};","export var simplifyCoreDocs = {\n name: 'simplifyCore',\n category: 'Algebra',\n syntax: ['simplifyCore(node)'],\n description: 'Perform simple one-pass simplifications on an expression tree.',\n examples: ['simplifyCore(parse(\"0*x\"))', 'simplifyCore(parse(\"(x+0)*2\"))'],\n seealso: ['simplify', 'simplifyConstant', 'evaluate']\n};","export var symbolicEqualDocs = {\n name: 'symbolicEqual',\n category: 'Algebra',\n syntax: ['symbolicEqual(expr1, expr2)', 'symbolicEqual(expr1, expr2, options)'],\n description: 'Returns true if the difference of the expressions simplifies to 0',\n examples: ['symbolicEqual(\"x*y\",\"y*x\")', 'symbolicEqual(\"abs(x^2)\", \"x^2\")', 'symbolicEqual(\"abs(x)\", \"x\", {context: {abs: {trivial: true}}})'],\n seealso: ['simplify', 'evaluate']\n};","export var rationalizeDocs = {\n name: 'rationalize',\n category: 'Algebra',\n syntax: ['rationalize(expr)', 'rationalize(expr, scope)', 'rationalize(expr, scope, detailed)'],\n description: 'Transform a rationalizable expression in a rational fraction. If rational fraction is one variable polynomial then converts the numerator and denominator in canonical form, with decreasing exponents, returning the coefficients of numerator.',\n examples: ['rationalize(\"2x/y - y/(x+1)\")', 'rationalize(\"2x/y - y/(x+1)\", true)'],\n seealso: ['simplify']\n};","export var sluDocs = {\n name: 'slu',\n category: 'Algebra',\n syntax: ['slu(A, order, threshold)'],\n description: 'Calculate the Matrix LU decomposition with full pivoting. Matrix A is decomposed in two matrices (L, U) and two permutation vectors (pinv, q) where P * A * Q = L * U',\n examples: ['slu(sparse([4.5, 0, 3.2, 0; 3.1, 2.9, 0, 0.9; 0, 1.7, 3, 0; 3.5, 0.4, 0, 1]), 1, 0.001)'],\n seealso: ['lusolve', 'lsolve', 'usolve', 'matrix', 'sparse', 'lup', 'qr']\n};","export var usolveDocs = {\n name: 'usolve',\n category: 'Algebra',\n syntax: ['x=usolve(U, b)'],\n description: 'Finds one solution of the linear system U * x = b where U is an [n x n] upper triangular matrix and b is a [n] column vector.',\n examples: ['x=usolve(sparse([1, 1, 1, 1; 0, 1, 1, 1; 0, 0, 1, 1; 0, 0, 0, 1]), [1; 2; 3; 4])'],\n seealso: ['usolveAll', 'lup', 'lusolve', 'lsolve', 'matrix', 'sparse']\n};","export var usolveAllDocs = {\n name: 'usolveAll',\n category: 'Algebra',\n syntax: ['x=usolve(U, b)'],\n description: 'Finds all solutions of the linear system U * x = b where U is an [n x n] upper triangular matrix and b is a [n] column vector.',\n examples: ['x=usolve(sparse([1, 1, 1, 1; 0, 1, 1, 1; 0, 0, 1, 1; 0, 0, 0, 1]), [1; 2; 3; 4])'],\n seealso: ['usolve', 'lup', 'lusolve', 'lsolve', 'matrix', 'sparse']\n};","export var qrDocs = {\n name: 'qr',\n category: 'Algebra',\n syntax: ['qr(A)'],\n description: 'Calculates the Matrix QR decomposition. Matrix `A` is decomposed in two matrices (`Q`, `R`) where `Q` is an orthogonal matrix and `R` is an upper triangular matrix.',\n examples: ['qr([[1, -1, 4], [1, 4, -2], [1, 4, 2], [1, -1, 0]])'],\n seealso: ['lup', 'slu', 'matrix']\n};","export var absDocs = {\n name: 'abs',\n category: 'Arithmetic',\n syntax: ['abs(x)'],\n description: 'Compute the absolute value.',\n examples: ['abs(3.5)', 'abs(-4.2)'],\n seealso: ['sign']\n};","export var addDocs = {\n name: 'add',\n category: 'Operators',\n syntax: ['x + y', 'add(x, y)'],\n description: 'Add two values.',\n examples: ['a = 2.1 + 3.6', 'a - 3.6', '3 + 2i', '3 cm + 2 inch', '\"2.3\" + \"4\"'],\n seealso: ['subtract']\n};","export var cbrtDocs = {\n name: 'cbrt',\n category: 'Arithmetic',\n syntax: ['cbrt(x)', 'cbrt(x, allRoots)'],\n description: 'Compute the cubic root value. If x = y * y * y, then y is the cubic root of x. When `x` is a number or complex number, an optional second argument `allRoots` can be provided to return all three cubic roots. If not provided, the principal root is returned',\n examples: ['cbrt(64)', 'cube(4)', 'cbrt(-8)', 'cbrt(2 + 3i)', 'cbrt(8i)', 'cbrt(8i, true)', 'cbrt(27 m^3)'],\n seealso: ['square', 'sqrt', 'cube', 'multiply']\n};","export var ceilDocs = {\n name: 'ceil',\n category: 'Arithmetic',\n syntax: ['ceil(x)'],\n description: 'Round a value towards plus infinity. If x is complex, both real and imaginary part are rounded towards plus infinity.',\n examples: ['ceil(3.2)', 'ceil(3.8)', 'ceil(-4.2)'],\n seealso: ['floor', 'fix', 'round']\n};","export var cubeDocs = {\n name: 'cube',\n category: 'Arithmetic',\n syntax: ['cube(x)'],\n description: 'Compute the cube of a value. The cube of x is x * x * x.',\n examples: ['cube(2)', '2^3', '2 * 2 * 2'],\n seealso: ['multiply', 'square', 'pow']\n};","export var divideDocs = {\n name: 'divide',\n category: 'Operators',\n syntax: ['x / y', 'divide(x, y)'],\n description: 'Divide two values.',\n examples: ['a = 2 / 3', 'a * 3', '4.5 / 2', '3 + 4 / 2', '(3 + 4) / 2', '18 km / 4.5'],\n seealso: ['multiply']\n};","export var dotDivideDocs = {\n name: 'dotDivide',\n category: 'Operators',\n syntax: ['x ./ y', 'dotDivide(x, y)'],\n description: 'Divide two values element wise.',\n examples: ['a = [1, 2, 3; 4, 5, 6]', 'b = [2, 1, 1; 3, 2, 5]', 'a ./ b'],\n seealso: ['multiply', 'dotMultiply', 'divide']\n};","export var dotMultiplyDocs = {\n name: 'dotMultiply',\n category: 'Operators',\n syntax: ['x .* y', 'dotMultiply(x, y)'],\n description: 'Multiply two values element wise.',\n examples: ['a = [1, 2, 3; 4, 5, 6]', 'b = [2, 1, 1; 3, 2, 5]', 'a .* b'],\n seealso: ['multiply', 'divide', 'dotDivide']\n};","export var dotPowDocs = {\n name: 'dotPow',\n category: 'Operators',\n syntax: ['x .^ y', 'dotPow(x, y)'],\n description: 'Calculates the power of x to y element wise.',\n examples: ['a = [1, 2, 3; 4, 5, 6]', 'a .^ 2'],\n seealso: ['pow']\n};","export var expDocs = {\n name: 'exp',\n category: 'Arithmetic',\n syntax: ['exp(x)'],\n description: 'Calculate the exponent of a value.',\n examples: ['exp(1.3)', 'e ^ 1.3', 'log(exp(1.3))', 'x = 2.4', '(exp(i*x) == cos(x) + i*sin(x)) # Euler\\'s formula'],\n seealso: ['expm', 'expm1', 'pow', 'log']\n};","export var expmDocs = {\n name: 'expm',\n category: 'Arithmetic',\n syntax: ['exp(x)'],\n description: 'Compute the matrix exponential, expm(A) = e^A. ' + 'The matrix must be square. ' + 'Not to be confused with exp(a), which performs element-wise exponentiation.',\n examples: ['expm([[0,2],[0,0]])'],\n seealso: ['exp']\n};","export var expm1Docs = {\n name: 'expm1',\n category: 'Arithmetic',\n syntax: ['expm1(x)'],\n description: 'Calculate the value of subtracting 1 from the exponential value.',\n examples: ['expm1(2)', 'pow(e, 2) - 1', 'log(expm1(2) + 1)'],\n seealso: ['exp', 'pow', 'log']\n};","export var fixDocs = {\n name: 'fix',\n category: 'Arithmetic',\n syntax: ['fix(x)'],\n description: 'Round a value towards zero. If x is complex, both real and imaginary part are rounded towards zero.',\n examples: ['fix(3.2)', 'fix(3.8)', 'fix(-4.2)', 'fix(-4.8)'],\n seealso: ['ceil', 'floor', 'round']\n};","export var floorDocs = {\n name: 'floor',\n category: 'Arithmetic',\n syntax: ['floor(x)'],\n description: 'Round a value towards minus infinity.If x is complex, both real and imaginary part are rounded towards minus infinity.',\n examples: ['floor(3.2)', 'floor(3.8)', 'floor(-4.2)'],\n seealso: ['ceil', 'fix', 'round']\n};","export var gcdDocs = {\n name: 'gcd',\n category: 'Arithmetic',\n syntax: ['gcd(a, b)', 'gcd(a, b, c, ...)'],\n description: 'Compute the greatest common divisor.',\n examples: ['gcd(8, 12)', 'gcd(-4, 6)', 'gcd(25, 15, -10)'],\n seealso: ['lcm', 'xgcd']\n};","export var hypotDocs = {\n name: 'hypot',\n category: 'Arithmetic',\n syntax: ['hypot(a, b, c, ...)', 'hypot([a, b, c, ...])'],\n description: 'Calculate the hypotenusa of a list with values. ',\n examples: ['hypot(3, 4)', 'sqrt(3^2 + 4^2)', 'hypot(-2)', 'hypot([3, 4, 5])'],\n seealso: ['abs', 'norm']\n};","export var lcmDocs = {\n name: 'lcm',\n category: 'Arithmetic',\n syntax: ['lcm(x, y)'],\n description: 'Compute the least common multiple.',\n examples: ['lcm(4, 6)', 'lcm(6, 21)', 'lcm(6, 21, 5)'],\n seealso: ['gcd']\n};","export var logDocs = {\n name: 'log',\n category: 'Arithmetic',\n syntax: ['log(x)', 'log(x, base)'],\n description: 'Compute the logarithm of a value. If no base is provided, the natural logarithm of x is calculated. If base if provided, the logarithm is calculated for the specified base. log(x, base) is defined as log(x) / log(base).',\n examples: ['log(3.5)', 'a = log(2.4)', 'exp(a)', '10 ^ 4', 'log(10000, 10)', 'log(10000) / log(10)', 'b = log(1024, 2)', '2 ^ b'],\n seealso: ['exp', 'log1p', 'log2', 'log10']\n};","export var log2Docs = {\n name: 'log2',\n category: 'Arithmetic',\n syntax: ['log2(x)'],\n description: 'Calculate the 2-base of a value. This is the same as calculating `log(x, 2)`.',\n examples: ['log2(0.03125)', 'log2(16)', 'log2(16) / log2(2)', 'pow(2, 4)'],\n seealso: ['exp', 'log1p', 'log', 'log10']\n};","export var log1pDocs = {\n name: 'log1p',\n category: 'Arithmetic',\n syntax: ['log1p(x)', 'log1p(x, base)'],\n description: 'Calculate the logarithm of a `value+1`',\n examples: ['log1p(2.5)', 'exp(log1p(1.4))', 'pow(10, 4)', 'log1p(9999, 10)', 'log1p(9999) / log(10)'],\n seealso: ['exp', 'log', 'log2', 'log10']\n};","export var log10Docs = {\n name: 'log10',\n category: 'Arithmetic',\n syntax: ['log10(x)'],\n description: 'Compute the 10-base logarithm of a value.',\n examples: ['log10(0.00001)', 'log10(10000)', '10 ^ 4', 'log(10000) / log(10)', 'log(10000, 10)'],\n seealso: ['exp', 'log']\n};","export var modDocs = {\n name: 'mod',\n category: 'Operators',\n syntax: ['x % y', 'x mod y', 'mod(x, y)'],\n description: 'Calculates the modulus, the remainder of an integer division.',\n examples: ['7 % 3', '11 % 2', '10 mod 4', 'isOdd(x) = x % 2', 'isOdd(2)', 'isOdd(3)'],\n seealso: ['divide']\n};","export var multiplyDocs = {\n name: 'multiply',\n category: 'Operators',\n syntax: ['x * y', 'multiply(x, y)'],\n description: 'multiply two values.',\n examples: ['a = 2.1 * 3.4', 'a / 3.4', '2 * 3 + 4', '2 * (3 + 4)', '3 * 2.1 km'],\n seealso: ['divide']\n};","export var normDocs = {\n name: 'norm',\n category: 'Arithmetic',\n syntax: ['norm(x)', 'norm(x, p)'],\n description: 'Calculate the norm of a number, vector or matrix.',\n examples: ['abs(-3.5)', 'norm(-3.5)', 'norm(3 - 4i)', 'norm([1, 2, -3], Infinity)', 'norm([1, 2, -3], -Infinity)', 'norm([3, 4], 2)', 'norm([[1, 2], [3, 4]], 1)', 'norm([[1, 2], [3, 4]], \"inf\")', 'norm([[1, 2], [3, 4]], \"fro\")']\n};","export var nthRootDocs = {\n name: 'nthRoot',\n category: 'Arithmetic',\n syntax: ['nthRoot(a)', 'nthRoot(a, root)'],\n description: 'Calculate the nth root of a value. ' + 'The principal nth root of a positive real number A, ' + 'is the positive real solution of the equation \"x^root = A\".',\n examples: ['4 ^ 3', 'nthRoot(64, 3)', 'nthRoot(9, 2)', 'sqrt(9)'],\n seealso: ['nthRoots', 'pow', 'sqrt']\n};","export var nthRootsDocs = {\n name: 'nthRoots',\n category: 'Arithmetic',\n syntax: ['nthRoots(A)', 'nthRoots(A, root)'],\n description: '' + 'Calculate the nth roots of a value. ' + 'An nth root of a positive real number A, ' + 'is a positive real solution of the equation \"x^root = A\". ' + 'This function returns an array of complex values.',\n examples: ['nthRoots(1)', 'nthRoots(1, 3)'],\n seealso: ['sqrt', 'pow', 'nthRoot']\n};","export var powDocs = {\n name: 'pow',\n category: 'Operators',\n syntax: ['x ^ y', 'pow(x, y)'],\n description: 'Calculates the power of x to y, x^y.',\n examples: ['2^3', '2*2*2', '1 + e ^ (pi * i)', 'pow([[1, 2], [4, 3]], 2)', 'pow([[1, 2], [4, 3]], -1)'],\n seealso: ['multiply', 'nthRoot', 'nthRoots', 'sqrt']\n};","export var roundDocs = {\n name: 'round',\n category: 'Arithmetic',\n syntax: ['round(x)', 'round(x, n)'],\n description: 'round a value towards the nearest integer.If x is complex, both real and imaginary part are rounded towards the nearest integer. When n is specified, the value is rounded to n decimals.',\n examples: ['round(3.2)', 'round(3.8)', 'round(-4.2)', 'round(-4.8)', 'round(pi, 3)', 'round(123.45678, 2)'],\n seealso: ['ceil', 'floor', 'fix']\n};","export var signDocs = {\n name: 'sign',\n category: 'Arithmetic',\n syntax: ['sign(x)'],\n description: 'Compute the sign of a value. The sign of a value x is 1 when x>1, -1 when x<0, and 0 when x=0.',\n examples: ['sign(3.5)', 'sign(-4.2)', 'sign(0)'],\n seealso: ['abs']\n};","export var sqrtDocs = {\n name: 'sqrt',\n category: 'Arithmetic',\n syntax: ['sqrt(x)'],\n description: 'Compute the square root value. If x = y * y, then y is the square root of x.',\n examples: ['sqrt(25)', '5 * 5', 'sqrt(-1)'],\n seealso: ['square', 'sqrtm', 'multiply', 'nthRoot', 'nthRoots', 'pow']\n};","export var sqrtmDocs = {\n name: 'sqrtm',\n category: 'Arithmetic',\n syntax: ['sqrtm(x)'],\n description: 'Calculate the principal square root of a square matrix. The principal square root matrix `X` of another matrix `A` is such that `X * X = A`.',\n examples: ['sqrtm([[33, 24], [48, 57]])'],\n seealso: ['sqrt', 'abs', 'square', 'multiply']\n};","export var squareDocs = {\n name: 'square',\n category: 'Arithmetic',\n syntax: ['square(x)'],\n description: 'Compute the square of a value. The square of x is x * x.',\n examples: ['square(3)', 'sqrt(9)', '3^2', '3 * 3'],\n seealso: ['multiply', 'pow', 'sqrt', 'cube']\n};","export var subtractDocs = {\n name: 'subtract',\n category: 'Operators',\n syntax: ['x - y', 'subtract(x, y)'],\n description: 'subtract two values.',\n examples: ['a = 5.3 - 2', 'a + 2', '2/3 - 1/6', '2 * 3 - 3', '2.1 km - 500m'],\n seealso: ['add']\n};","export var unaryMinusDocs = {\n name: 'unaryMinus',\n category: 'Operators',\n syntax: ['-x', 'unaryMinus(x)'],\n description: 'Inverse the sign of a value. Converts booleans and strings to numbers.',\n examples: ['-4.5', '-(-5.6)', '-\"22\"'],\n seealso: ['add', 'subtract', 'unaryPlus']\n};","export var unaryPlusDocs = {\n name: 'unaryPlus',\n category: 'Operators',\n syntax: ['+x', 'unaryPlus(x)'],\n description: 'Converts booleans and strings to numbers.',\n examples: ['+true', '+\"2\"'],\n seealso: ['add', 'subtract', 'unaryMinus']\n};","export var xgcdDocs = {\n name: 'xgcd',\n category: 'Arithmetic',\n syntax: ['xgcd(a, b)'],\n description: 'Calculate the extended greatest common divisor for two values. The result is an array [d, x, y] with 3 entries, where d is the greatest common divisor, and d = x * a + y * b.',\n examples: ['xgcd(8, 12)', 'gcd(8, 12)', 'xgcd(36163, 21199)'],\n seealso: ['gcd', 'lcm']\n};","export var invmodDocs = {\n name: 'invmod',\n category: 'Arithmetic',\n syntax: ['invmod(a, b)'],\n description: 'Calculate the (modular) multiplicative inverse of a modulo b. Solution to the equation ax ≣ 1 (mod b)',\n examples: ['invmod(8, 12)', 'invmod(7, 13)', 'invmod(15151, 15122)'],\n seealso: ['gcd', 'xgcd']\n};","export var bitAndDocs = {\n name: 'bitAnd',\n category: 'Bitwise',\n syntax: ['x & y', 'bitAnd(x, y)'],\n description: 'Bitwise AND operation. Performs the logical AND operation on each pair of the corresponding bits of the two given values by multiplying them. If both bits in the compared position are 1, the bit in the resulting binary representation is 1, otherwise, the result is 0',\n examples: ['5 & 3', 'bitAnd(53, 131)', '[1, 12, 31] & 42'],\n seealso: ['bitNot', 'bitOr', 'bitXor', 'leftShift', 'rightArithShift', 'rightLogShift']\n};","export var bitNotDocs = {\n name: 'bitNot',\n category: 'Bitwise',\n syntax: ['~x', 'bitNot(x)'],\n description: 'Bitwise NOT operation. Performs a logical negation on each bit of the given value. Bits that are 0 become 1, and those that are 1 become 0.',\n examples: ['~1', '~2', 'bitNot([2, -3, 4])'],\n seealso: ['bitAnd', 'bitOr', 'bitXor', 'leftShift', 'rightArithShift', 'rightLogShift']\n};","export var bitOrDocs = {\n name: 'bitOr',\n category: 'Bitwise',\n syntax: ['x | y', 'bitOr(x, y)'],\n description: 'Bitwise OR operation. Performs the logical inclusive OR operation on each pair of corresponding bits of the two given values. The result in each position is 1 if the first bit is 1 or the second bit is 1 or both bits are 1, otherwise, the result is 0.',\n examples: ['5 | 3', 'bitOr([1, 2, 3], 4)'],\n seealso: ['bitAnd', 'bitNot', 'bitXor', 'leftShift', 'rightArithShift', 'rightLogShift']\n};","export var bitXorDocs = {\n name: 'bitXor',\n category: 'Bitwise',\n syntax: ['bitXor(x, y)'],\n description: 'Bitwise XOR operation, exclusive OR. Performs the logical exclusive OR operation on each pair of corresponding bits of the two given values. The result in each position is 1 if only the first bit is 1 or only the second bit is 1, but will be 0 if both are 0 or both are 1.',\n examples: ['bitOr(1, 2)', 'bitXor([2, 3, 4], 4)'],\n seealso: ['bitAnd', 'bitNot', 'bitOr', 'leftShift', 'rightArithShift', 'rightLogShift']\n};","export var leftShiftDocs = {\n name: 'leftShift',\n category: 'Bitwise',\n syntax: ['x << y', 'leftShift(x, y)'],\n description: 'Bitwise left logical shift of a value x by y number of bits.',\n examples: ['4 << 1', '8 >> 1'],\n seealso: ['bitAnd', 'bitNot', 'bitOr', 'bitXor', 'rightArithShift', 'rightLogShift']\n};","export var rightArithShiftDocs = {\n name: 'rightArithShift',\n category: 'Bitwise',\n syntax: ['x >> y', 'rightArithShift(x, y)'],\n description: 'Bitwise right arithmetic shift of a value x by y number of bits.',\n examples: ['8 >> 1', '4 << 1', '-12 >> 2'],\n seealso: ['bitAnd', 'bitNot', 'bitOr', 'bitXor', 'leftShift', 'rightLogShift']\n};","export var rightLogShiftDocs = {\n name: 'rightLogShift',\n category: 'Bitwise',\n syntax: ['x >>> y', 'rightLogShift(x, y)'],\n description: 'Bitwise right logical shift of a value x by y number of bits.',\n examples: ['8 >>> 1', '4 << 1', '-12 >>> 2'],\n seealso: ['bitAnd', 'bitNot', 'bitOr', 'bitXor', 'leftShift', 'rightArithShift']\n};","export var bellNumbersDocs = {\n name: 'bellNumbers',\n category: 'Combinatorics',\n syntax: ['bellNumbers(n)'],\n description: 'The Bell Numbers count the number of partitions of a set. A partition is a pairwise disjoint subset of S whose union is S. `bellNumbers` only takes integer arguments. The following condition must be enforced: n >= 0.',\n examples: ['bellNumbers(3)', 'bellNumbers(8)'],\n seealso: ['stirlingS2']\n};","export var catalanDocs = {\n name: 'catalan',\n category: 'Combinatorics',\n syntax: ['catalan(n)'],\n description: 'The Catalan Numbers enumerate combinatorial structures of many different types. catalan only takes integer arguments. The following condition must be enforced: n >= 0.',\n examples: ['catalan(3)', 'catalan(8)'],\n seealso: ['bellNumbers']\n};","export var compositionDocs = {\n name: 'composition',\n category: 'Combinatorics',\n syntax: ['composition(n, k)'],\n description: 'The composition counts of n into k parts. composition only takes integer arguments. The following condition must be enforced: k <= n.',\n examples: ['composition(5, 3)'],\n seealso: ['combinations']\n};","export var stirlingS2Docs = {\n name: 'stirlingS2',\n category: 'Combinatorics',\n syntax: ['stirlingS2(n, k)'],\n description: 'he Stirling numbers of the second kind, counts the number of ways to partition a set of n labelled objects into k nonempty unlabelled subsets. `stirlingS2` only takes integer arguments. The following condition must be enforced: k <= n. If n = k or k = 1, then s(n,k) = 1.',\n examples: ['stirlingS2(5, 3)'],\n seealso: ['bellNumbers']\n};","export var configDocs = {\n name: 'config',\n category: 'Core',\n syntax: ['config()', 'config(options)'],\n description: 'Get configuration or change configuration.',\n examples: ['config()', '1/3 + 1/4', 'config({number: \"Fraction\"})', '1/3 + 1/4'],\n seealso: []\n};","export var importDocs = {\n name: 'import',\n category: 'Core',\n syntax: ['import(functions)', 'import(functions, options)'],\n description: 'Import functions or constants from an object.',\n examples: ['import({myFn: f(x)=x^2, myConstant: 32 })', 'myFn(2)', 'myConstant'],\n seealso: []\n};","export var typedDocs = {\n name: 'typed',\n category: 'Core',\n syntax: ['typed(signatures)', 'typed(name, signatures)'],\n description: 'Create a typed function.',\n examples: ['double = typed({ \"number\": f(x)=x+x, \"string\": f(x)=concat(x,x) })', 'double(2)', 'double(\"hello\")'],\n seealso: []\n};","export var argDocs = {\n name: 'arg',\n category: 'Complex',\n syntax: ['arg(x)'],\n description: 'Compute the argument of a complex value. If x = a+bi, the argument is computed as atan2(b, a).',\n examples: ['arg(2 + 2i)', 'atan2(3, 2)', 'arg(2 + 3i)'],\n seealso: ['re', 'im', 'conj', 'abs']\n};","export var conjDocs = {\n name: 'conj',\n category: 'Complex',\n syntax: ['conj(x)'],\n description: 'Compute the complex conjugate of a complex value. If x = a+bi, the complex conjugate is a-bi.',\n examples: ['conj(2 + 3i)', 'conj(2 - 3i)', 'conj(-5.2i)'],\n seealso: ['re', 'im', 'abs', 'arg']\n};","export var reDocs = {\n name: 're',\n category: 'Complex',\n syntax: ['re(x)'],\n description: 'Get the real part of a complex number.',\n examples: ['re(2 + 3i)', 'im(2 + 3i)', 're(-5.2i)', 're(2.4)'],\n seealso: ['im', 'conj', 'abs', 'arg']\n};","export var imDocs = {\n name: 'im',\n category: 'Complex',\n syntax: ['im(x)'],\n description: 'Get the imaginary part of a complex number.',\n examples: ['im(2 + 3i)', 're(2 + 3i)', 'im(-5.2i)', 'im(2.4)'],\n seealso: ['re', 'conj', 'abs', 'arg']\n};","export var evaluateDocs = {\n name: 'evaluate',\n category: 'Expression',\n syntax: ['evaluate(expression)', 'evaluate(expression, scope)', 'evaluate([expr1, expr2, expr3, ...])', 'evaluate([expr1, expr2, expr3, ...], scope)'],\n description: 'Evaluate an expression or an array with expressions.',\n examples: ['evaluate(\"2 + 3\")', 'evaluate(\"sqrt(16)\")', 'evaluate(\"2 inch to cm\")', 'evaluate(\"sin(x * pi)\", { \"x\": 1/2 })', 'evaluate([\"width=2\", \"height=4\",\"width*height\"])'],\n seealso: []\n};","export var helpDocs = {\n name: 'help',\n category: 'Expression',\n syntax: ['help(object)', 'help(string)'],\n description: 'Display documentation on a function or data type.',\n examples: ['help(sqrt)', 'help(\"complex\")'],\n seealso: []\n};","export var distanceDocs = {\n name: 'distance',\n category: 'Geometry',\n syntax: ['distance([x1, y1], [x2, y2])', 'distance([[x1, y1], [x2, y2]])'],\n description: 'Calculates the Euclidean distance between two points.',\n examples: ['distance([0,0], [4,4])', 'distance([[0,0], [4,4]])'],\n seealso: []\n};","export var intersectDocs = {\n name: 'intersect',\n category: 'Geometry',\n syntax: ['intersect(expr1, expr2, expr3, expr4)', 'intersect(expr1, expr2, expr3)'],\n description: 'Computes the intersection point of lines and/or planes.',\n examples: ['intersect([0, 0], [10, 10], [10, 0], [0, 10])', 'intersect([1, 0, 1], [4, -2, 2], [1, 1, 1, 6])'],\n seealso: []\n};","export var andDocs = {\n name: 'and',\n category: 'Logical',\n syntax: ['x and y', 'and(x, y)'],\n description: 'Logical and. Test whether two values are both defined with a nonzero/nonempty value.',\n examples: ['true and false', 'true and true', '2 and 4'],\n seealso: ['not', 'or', 'xor']\n};","export var notDocs = {\n name: 'not',\n category: 'Logical',\n syntax: ['not x', 'not(x)'],\n description: 'Logical not. Flips the boolean value of given argument.',\n examples: ['not true', 'not false', 'not 2', 'not 0'],\n seealso: ['and', 'or', 'xor']\n};","export var orDocs = {\n name: 'or',\n category: 'Logical',\n syntax: ['x or y', 'or(x, y)'],\n description: 'Logical or. Test if at least one value is defined with a nonzero/nonempty value.',\n examples: ['true or false', 'false or false', '0 or 4'],\n seealso: ['not', 'and', 'xor']\n};","export var xorDocs = {\n name: 'xor',\n category: 'Logical',\n syntax: ['x xor y', 'xor(x, y)'],\n description: 'Logical exclusive or, xor. Test whether one and only one value is defined with a nonzero/nonempty value.',\n examples: ['true xor false', 'false xor false', 'true xor true', '0 xor 4'],\n seealso: ['not', 'and', 'or']\n};","export var concatDocs = {\n name: 'concat',\n category: 'Matrix',\n syntax: ['concat(A, B, C, ...)', 'concat(A, B, C, ..., dim)'],\n description: 'Concatenate matrices. By default, the matrices are concatenated by the last dimension. The dimension on which to concatenate can be provided as last argument.',\n examples: ['A = [1, 2; 5, 6]', 'B = [3, 4; 7, 8]', 'concat(A, B)', 'concat(A, B, 1)', 'concat(A, B, 2)'],\n seealso: ['det', 'diag', 'identity', 'inv', 'ones', 'range', 'size', 'squeeze', 'subset', 'trace', 'transpose', 'zeros']\n};","export var countDocs = {\n name: 'count',\n category: 'Matrix',\n syntax: ['count(x)'],\n description: 'Count the number of elements of a matrix, array or string.',\n examples: ['a = [1, 2; 3, 4; 5, 6]', 'count(a)', 'size(a)', 'count(\"hello world\")'],\n seealso: ['size']\n};","export var crossDocs = {\n name: 'cross',\n category: 'Matrix',\n syntax: ['cross(A, B)'],\n description: 'Calculate the cross product for two vectors in three dimensional space.',\n examples: ['cross([1, 1, 0], [0, 1, 1])', 'cross([3, -3, 1], [4, 9, 2])', 'cross([2, 3, 4], [5, 6, 7])'],\n seealso: ['multiply', 'dot']\n};","export var columnDocs = {\n name: 'column',\n category: 'Matrix',\n syntax: ['column(x, index)'],\n description: 'Return a column from a matrix or array.',\n examples: ['A = [[1, 2], [3, 4]]', 'column(A, 1)', 'column(A, 2)'],\n seealso: ['row', 'matrixFromColumns']\n};","export var ctransposeDocs = {\n name: 'ctranspose',\n category: 'Matrix',\n syntax: ['x\\'', 'ctranspose(x)'],\n description: 'Complex Conjugate and Transpose a matrix',\n examples: ['a = [1, 2, 3; 4, 5, 6]', 'a\\'', 'ctranspose(a)'],\n seealso: ['concat', 'det', 'diag', 'identity', 'inv', 'ones', 'range', 'size', 'squeeze', 'subset', 'trace', 'zeros']\n};","export var detDocs = {\n name: 'det',\n category: 'Matrix',\n syntax: ['det(x)'],\n description: 'Calculate the determinant of a matrix',\n examples: ['det([1, 2; 3, 4])', 'det([-2, 2, 3; -1, 1, 3; 2, 0, -1])'],\n seealso: ['concat', 'diag', 'identity', 'inv', 'ones', 'range', 'size', 'squeeze', 'subset', 'trace', 'transpose', 'zeros']\n};","export var diagDocs = {\n name: 'diag',\n category: 'Matrix',\n syntax: ['diag(x)', 'diag(x, k)'],\n description: 'Create a diagonal matrix or retrieve the diagonal of a matrix. When x is a vector, a matrix with the vector values on the diagonal will be returned. When x is a matrix, a vector with the diagonal values of the matrix is returned. When k is provided, the k-th diagonal will be filled in or retrieved, if k is positive, the values are placed on the super diagonal. When k is negative, the values are placed on the sub diagonal.',\n examples: ['diag(1:3)', 'diag(1:3, 1)', 'a = [1, 2, 3; 4, 5, 6; 7, 8, 9]', 'diag(a)'],\n seealso: ['concat', 'det', 'identity', 'inv', 'ones', 'range', 'size', 'squeeze', 'subset', 'trace', 'transpose', 'zeros']\n};","export var diffDocs = {\n name: 'diff',\n category: 'Matrix',\n syntax: ['diff(arr)', 'diff(arr, dim)'],\n description: ['Create a new matrix or array with the difference of the passed matrix or array.', 'Dim parameter is optional and used to indicant the dimension of the array/matrix to apply the difference', 'If no dimension parameter is passed it is assumed as dimension 0', 'Dimension is zero-based in javascript and one-based in the parser', 'Arrays must be \\'rectangular\\' meaning arrays like [1, 2]', 'If something is passed as a matrix it will be returned as a matrix but other than that all matrices are converted to arrays'],\n examples: ['A = [1, 2, 4, 7, 0]', 'diff(A)', 'diff(A, 1)', 'B = [[1, 2], [3, 4]]', 'diff(B)', 'diff(B, 1)', 'diff(B, 2)', 'diff(B, bignumber(2))', 'diff([[1, 2], matrix([3, 4])], 2)'],\n seealso: ['subtract', 'partitionSelect']\n};","export var dotDocs = {\n name: 'dot',\n category: 'Matrix',\n syntax: ['dot(A, B)', 'A * B'],\n description: 'Calculate the dot product of two vectors. ' + 'The dot product of A = [a1, a2, a3, ..., an] and B = [b1, b2, b3, ..., bn] ' + 'is defined as dot(A, B) = a1 * b1 + a2 * b2 + a3 * b3 + ... + an * bn',\n examples: ['dot([2, 4, 1], [2, 2, 3])', '[2, 4, 1] * [2, 2, 3]'],\n seealso: ['multiply', 'cross']\n};","export var getMatrixDataTypeDocs = {\n name: 'getMatrixDataType',\n category: 'Matrix',\n syntax: ['getMatrixDataType(x)'],\n description: 'Find the data type of all elements in a matrix or array, ' + 'for example \"number\" if all items are a number ' + 'and \"Complex\" if all values are complex numbers. ' + 'If a matrix contains more than one data type, it will return \"mixed\".',\n examples: ['getMatrixDataType([1, 2, 3])', 'getMatrixDataType([[5 cm], [2 inch]])', 'getMatrixDataType([1, \"text\"])', 'getMatrixDataType([1, bignumber(4)])'],\n seealso: ['matrix', 'sparse', 'typeOf']\n};","export var identityDocs = {\n name: 'identity',\n category: 'Matrix',\n syntax: ['identity(n)', 'identity(m, n)', 'identity([m, n])'],\n description: 'Returns the identity matrix with size m-by-n. The matrix has ones on the diagonal and zeros elsewhere.',\n examples: ['identity(3)', 'identity(3, 5)', 'a = [1, 2, 3; 4, 5, 6]', 'identity(size(a))'],\n seealso: ['concat', 'det', 'diag', 'inv', 'ones', 'range', 'size', 'squeeze', 'subset', 'trace', 'transpose', 'zeros']\n};","export var filterDocs = {\n name: 'filter',\n category: 'Matrix',\n syntax: ['filter(x, test)'],\n description: 'Filter items in a matrix.',\n examples: ['isPositive(x) = x > 0', 'filter([6, -2, -1, 4, 3], isPositive)', 'filter([6, -2, 0, 1, 0], x != 0)'],\n seealso: ['sort', 'map', 'forEach']\n};","export var flattenDocs = {\n name: 'flatten',\n category: 'Matrix',\n syntax: ['flatten(x)'],\n description: 'Flatten a multi dimensional matrix into a single dimensional matrix.',\n examples: ['a = [1, 2, 3; 4, 5, 6]', 'size(a)', 'b = flatten(a)', 'size(b)'],\n seealso: ['concat', 'resize', 'size', 'squeeze']\n};","export var forEachDocs = {\n name: 'forEach',\n category: 'Matrix',\n syntax: ['forEach(x, callback)'],\n description: 'Iterates over all elements of a matrix/array, and executes the given callback function.',\n examples: ['numberOfPets = {}', 'addPet(n) = numberOfPets[n] = (numberOfPets[n] ? numberOfPets[n]:0 ) + 1;', 'forEach([\"Dog\",\"Cat\",\"Cat\"], addPet)', 'numberOfPets'],\n seealso: ['map', 'sort', 'filter']\n};","export var invDocs = {\n name: 'inv',\n category: 'Matrix',\n syntax: ['inv(x)'],\n description: 'Calculate the inverse of a matrix',\n examples: ['inv([1, 2; 3, 4])', 'inv(4)', '1 / 4'],\n seealso: ['concat', 'det', 'diag', 'identity', 'ones', 'range', 'size', 'squeeze', 'subset', 'trace', 'transpose', 'zeros']\n};","export var pinvDocs = {\n name: 'pinv',\n category: 'Matrix',\n syntax: ['pinv(x)'],\n description: 'Calculate the Moore–Penrose inverse of a matrix',\n examples: ['pinv([1, 2; 3, 4])', 'pinv([[1, 0], [0, 1], [0, 1]])', 'pinv(4)'],\n seealso: ['inv']\n};","export var eigsDocs = {\n name: 'eigs',\n category: 'Matrix',\n syntax: ['eigs(x)'],\n description: 'Calculate the eigenvalues and eigenvectors of a real symmetric matrix',\n examples: ['eigs([[5, 2.3], [2.3, 1]])'],\n seealso: ['inv']\n};","export var kronDocs = {\n name: 'kron',\n category: 'Matrix',\n syntax: ['kron(x, y)'],\n description: 'Calculates the kronecker product of 2 matrices or vectors.',\n examples: ['kron([[1, 0], [0, 1]], [[1, 2], [3, 4]])', 'kron([1,1], [2,3,4])'],\n seealso: ['multiply', 'dot', 'cross']\n};","export var matrixFromFunctionDocs = {\n name: 'matrixFromFunction',\n category: 'Matrix',\n syntax: ['matrixFromFunction(size, fn)', 'matrixFromFunction(size, fn, format)', 'matrixFromFunction(size, fn, format, datatype)', 'matrixFromFunction(size, format, fn)', 'matrixFromFunction(size, format, datatype, fn)'],\n description: 'Create a matrix by evaluating a generating function at each index.',\n examples: ['f(I) = I[1] - I[2]', 'matrixFromFunction([3,3], f)', 'g(I) = I[1] - I[2] == 1 ? 4 : 0', 'matrixFromFunction([100, 100], \"sparse\", g)', 'matrixFromFunction([5], random)'],\n seealso: ['matrix', 'matrixFromRows', 'matrixFromColumns', 'zeros']\n};","export var matrixFromRowsDocs = {\n name: 'matrixFromRows',\n category: 'Matrix',\n syntax: ['matrixFromRows(...arr)', 'matrixFromRows(row1, row2)', 'matrixFromRows(row1, row2, row3)'],\n description: 'Create a dense matrix from vectors as individual rows.',\n examples: ['matrixFromRows([1, 2, 3], [[4],[5],[6]])'],\n seealso: ['matrix', 'matrixFromColumns', 'matrixFromFunction', 'zeros']\n};","export var matrixFromColumnsDocs = {\n name: 'matrixFromColumns',\n category: 'Matrix',\n syntax: ['matrixFromColumns(...arr)', 'matrixFromColumns(row1, row2)', 'matrixFromColumns(row1, row2, row3)'],\n description: 'Create a dense matrix from vectors as individual columns.',\n examples: ['matrixFromColumns([1, 2, 3], [[4],[5],[6]])'],\n seealso: ['matrix', 'matrixFromRows', 'matrixFromFunction', 'zeros']\n};","export var mapDocs = {\n name: 'map',\n category: 'Matrix',\n syntax: ['map(x, callback)'],\n description: 'Create a new matrix or array with the results of the callback function executed on each entry of the matrix/array.',\n examples: ['map([1, 2, 3], square)'],\n seealso: ['filter', 'forEach']\n};","export var onesDocs = {\n name: 'ones',\n category: 'Matrix',\n syntax: ['ones(m)', 'ones(m, n)', 'ones(m, n, p, ...)', 'ones([m])', 'ones([m, n])', 'ones([m, n, p, ...])'],\n description: 'Create a matrix containing ones.',\n examples: ['ones(3)', 'ones(3, 5)', 'ones([2,3]) * 4.5', 'a = [1, 2, 3; 4, 5, 6]', 'ones(size(a))'],\n seealso: ['concat', 'det', 'diag', 'identity', 'inv', 'range', 'size', 'squeeze', 'subset', 'trace', 'transpose', 'zeros']\n};","export var partitionSelectDocs = {\n name: 'partitionSelect',\n category: 'Matrix',\n syntax: ['partitionSelect(x, k)', 'partitionSelect(x, k, compare)'],\n description: 'Partition-based selection of an array or 1D matrix. Will find the kth smallest value, and mutates the input array. Uses Quickselect.',\n examples: ['partitionSelect([5, 10, 1], 2)', 'partitionSelect([\"C\", \"B\", \"A\", \"D\"], 1, compareText)', 'arr = [5, 2, 1]', 'partitionSelect(arr, 0) # returns 1, arr is now: [1, 2, 5]', 'arr', 'partitionSelect(arr, 1, \\'desc\\') # returns 2, arr is now: [5, 2, 1]', 'arr'],\n seealso: ['sort']\n};","export var rangeDocs = {\n name: 'range',\n category: 'Type',\n syntax: ['start:end', 'start:step:end', 'range(start, end)', 'range(start, end, step)', 'range(string)'],\n description: 'Create a range. Lower bound of the range is included, upper bound is excluded.',\n examples: ['1:5', '3:-1:-3', 'range(3, 7)', 'range(0, 12, 2)', 'range(\"4:10\")', 'range(1m, 1m, 3m)', 'a = [1, 2, 3, 4; 5, 6, 7, 8]', 'a[1:2, 1:2]'],\n seealso: ['concat', 'det', 'diag', 'identity', 'inv', 'ones', 'size', 'squeeze', 'subset', 'trace', 'transpose', 'zeros']\n};","export var resizeDocs = {\n name: 'resize',\n category: 'Matrix',\n syntax: ['resize(x, size)', 'resize(x, size, defaultValue)'],\n description: 'Resize a matrix.',\n examples: ['resize([1,2,3,4,5], [3])', 'resize([1,2,3], [5])', 'resize([1,2,3], [5], -1)', 'resize(2, [2, 3])', 'resize(\"hello\", [8], \"!\")'],\n seealso: ['size', 'subset', 'squeeze', 'reshape']\n};","export var reshapeDocs = {\n name: 'reshape',\n category: 'Matrix',\n syntax: ['reshape(x, sizes)'],\n description: 'Reshape a multi dimensional array to fit the specified dimensions.',\n examples: ['reshape([1, 2, 3, 4, 5, 6], [2, 3])', 'reshape([[1, 2], [3, 4]], [1, 4])', 'reshape([[1, 2], [3, 4]], [4])', 'reshape([1, 2, 3, 4], [-1, 2])'],\n seealso: ['size', 'squeeze', 'resize']\n};","export var rotateDocs = {\n name: 'rotate',\n category: 'Matrix',\n syntax: ['rotate(w, theta)', 'rotate(w, theta, v)'],\n description: 'Returns a 2-D rotation matrix (2x2) for a given angle (in radians). ' + 'Returns a 2-D rotation matrix (3x3) of a given angle (in radians) around given axis.',\n examples: ['rotate([1, 0], pi / 2)', 'rotate(matrix([1, 0]), unit(\"35deg\"))', 'rotate([1, 0, 0], unit(\"90deg\"), [0, 0, 1])', 'rotate(matrix([1, 0, 0]), unit(\"90deg\"), matrix([0, 0, 1]))'],\n seealso: ['matrix', 'rotationMatrix']\n};","export var rotationMatrixDocs = {\n name: 'rotationMatrix',\n category: 'Matrix',\n syntax: ['rotationMatrix(theta)', 'rotationMatrix(theta, v)', 'rotationMatrix(theta, v, format)'],\n description: 'Returns a 2-D rotation matrix (2x2) for a given angle (in radians). ' + 'Returns a 2-D rotation matrix (3x3) of a given angle (in radians) around given axis.',\n examples: ['rotationMatrix(pi / 2)', 'rotationMatrix(unit(\"45deg\"), [0, 0, 1])', 'rotationMatrix(1, matrix([0, 0, 1]), \"sparse\")'],\n seealso: ['cos', 'sin']\n};","export var rowDocs = {\n name: 'row',\n category: 'Matrix',\n syntax: ['row(x, index)'],\n description: 'Return a row from a matrix or array.',\n examples: ['A = [[1, 2], [3, 4]]', 'row(A, 1)', 'row(A, 2)'],\n seealso: ['column', 'matrixFromRows']\n};","export var sizeDocs = {\n name: 'size',\n category: 'Matrix',\n syntax: ['size(x)'],\n description: 'Calculate the size of a matrix.',\n examples: ['size(2.3)', 'size(\"hello world\")', 'a = [1, 2; 3, 4; 5, 6]', 'size(a)', 'size(1:6)'],\n seealso: ['concat', 'count', 'det', 'diag', 'identity', 'inv', 'ones', 'range', 'squeeze', 'subset', 'trace', 'transpose', 'zeros']\n};","export var sortDocs = {\n name: 'sort',\n category: 'Matrix',\n syntax: ['sort(x)', 'sort(x, compare)'],\n description: 'Sort the items in a matrix. Compare can be a string \"asc\", \"desc\", \"natural\", or a custom sort function.',\n examples: ['sort([5, 10, 1])', 'sort([\"C\", \"B\", \"A\", \"D\"], \"natural\")', 'sortByLength(a, b) = size(a)[1] - size(b)[1]', 'sort([\"Langdon\", \"Tom\", \"Sara\"], sortByLength)', 'sort([\"10\", \"1\", \"2\"], \"natural\")'],\n seealso: ['map', 'filter', 'forEach']\n};","export var squeezeDocs = {\n name: 'squeeze',\n category: 'Matrix',\n syntax: ['squeeze(x)'],\n description: 'Remove inner and outer singleton dimensions from a matrix.',\n examples: ['a = zeros(3,2,1)', 'size(squeeze(a))', 'b = zeros(1,1,3)', 'size(squeeze(b))'],\n seealso: ['concat', 'det', 'diag', 'identity', 'inv', 'ones', 'range', 'size', 'subset', 'trace', 'transpose', 'zeros']\n};","export var subsetDocs = {\n name: 'subset',\n category: 'Matrix',\n syntax: ['value(index)', 'value(index) = replacement', 'subset(value, [index])', 'subset(value, [index], replacement)'],\n description: 'Get or set a subset of the entries of a matrix or ' + 'characters of a string. ' + 'Indexes are one-based. There should be one index specification for ' + 'each dimension of the target. Each specification can be a single ' + 'index, a list of indices, or a range in colon notation `l:u`. ' + 'In a range, both the lower bound l and upper bound u are included; ' + 'and if a bound is omitted it defaults to the most extreme valid value. ' + 'The cartesian product of the indices specified in each dimension ' + 'determines the target of the operation.',\n examples: ['d = [1, 2; 3, 4]', 'e = []', 'e[1, 1:2] = [5, 6]', 'e[2, :] = [7, 8]', 'f = d * e', 'f[2, 1]', 'f[:, 1]', 'f[[1,2], [1,3]] = [9, 10; 11, 12]', 'f'],\n seealso: ['concat', 'det', 'diag', 'identity', 'inv', 'ones', 'range', 'size', 'squeeze', 'trace', 'transpose', 'zeros']\n};","export var traceDocs = {\n name: 'trace',\n category: 'Matrix',\n syntax: ['trace(A)'],\n description: 'Calculate the trace of a matrix: the sum of the elements on the main diagonal of a square matrix.',\n examples: ['A = [1, 2, 3; -1, 2, 3; 2, 0, 3]', 'trace(A)'],\n seealso: ['concat', 'det', 'diag', 'identity', 'inv', 'ones', 'range', 'size', 'squeeze', 'subset', 'transpose', 'zeros']\n};","export var transposeDocs = {\n name: 'transpose',\n category: 'Matrix',\n syntax: ['x\\'', 'transpose(x)'],\n description: 'Transpose a matrix',\n examples: ['a = [1, 2, 3; 4, 5, 6]', 'a\\'', 'transpose(a)'],\n seealso: ['concat', 'det', 'diag', 'identity', 'inv', 'ones', 'range', 'size', 'squeeze', 'subset', 'trace', 'zeros']\n};","export var zerosDocs = {\n name: 'zeros',\n category: 'Matrix',\n syntax: ['zeros(m)', 'zeros(m, n)', 'zeros(m, n, p, ...)', 'zeros([m])', 'zeros([m, n])', 'zeros([m, n, p, ...])'],\n description: 'Create a matrix containing zeros.',\n examples: ['zeros(3)', 'zeros(3, 5)', 'a = [1, 2, 3; 4, 5, 6]', 'zeros(size(a))'],\n seealso: ['concat', 'det', 'diag', 'identity', 'inv', 'ones', 'range', 'size', 'squeeze', 'subset', 'trace', 'transpose']\n};","export var fftDocs = {\n name: 'fft',\n category: 'Matrix',\n syntax: ['fft(x)'],\n description: 'Calculate N-dimensional fourier transform',\n examples: ['fft([[1, 0], [1, 0]])'],\n seealso: ['ifft']\n};","export var ifftDocs = {\n name: 'ifft',\n category: 'Matrix',\n syntax: ['ifft(x)'],\n description: 'Calculate N-dimensional inverse fourier transform',\n examples: ['ifft([[2, 2], [0, 0]])'],\n seealso: ['fft']\n};","export var sylvesterDocs = {\n name: 'sylvester',\n category: 'Algebra',\n syntax: ['sylvester(A,B,C)'],\n description: 'Solves the real-valued Sylvester equation AX+XB=C for X',\n examples: ['sylvester([[-1, -2], [1, 1]], [[-2, 1], [-1, 2]], [[-3, 2], [3, 0]])', 'A = [[-1, -2], [1, 1]]; B = [[2, -1], [1, -2]]; C = [[-3, 2], [3, 0]]', 'sylvester(A, B, C)'],\n seealso: ['schur', 'lyap']\n};","export var schurDocs = {\n name: 'schur',\n category: 'Algebra',\n syntax: ['schur(A)'],\n description: 'Performs a real Schur decomposition of the real matrix A = UTU\\'',\n examples: ['schur([[1, 0], [-4, 3]])', 'A = [[1, 0], [-4, 3]]', 'schur(A)'],\n seealso: ['lyap', 'sylvester']\n};","export var lyapDocs = {\n name: 'lyap',\n category: 'Algebra',\n syntax: ['lyap(A,Q)'],\n description: 'Solves the Continuous-time Lyapunov equation AP+PA\\'+Q=0 for P',\n examples: ['lyap([[-2, 0], [1, -4]], [[3, 1], [1, 3]])', 'A = [[-2, 0], [1, -4]]', 'Q = [[3, 1], [1, 3]]', 'lyap(A,Q)'],\n seealso: ['schur', 'sylvester']\n};","export var solveODEDocs = {\n name: 'solveODE',\n category: 'Numeric',\n syntax: ['solveODE(func, tspan, y0)', 'solveODE(func, tspan, y0, options)'],\n description: 'Numerical Integration of Ordinary Differential Equations.',\n examples: ['f(t,y) = y', 'tspan = [0, 4]', 'solveODE(f, tspan, 1)', 'solveODE(f, tspan, [1, 2])', 'solveODE(f, tspan, 1, { method:\"RK23\", maxStep:0.1 })'],\n seealso: ['derivative', 'simplifyCore']\n};","export var combinationsDocs = {\n name: 'combinations',\n category: 'Probability',\n syntax: ['combinations(n, k)'],\n description: 'Compute the number of combinations of n items taken k at a time',\n examples: ['combinations(7, 5)'],\n seealso: ['combinationsWithRep', 'permutations', 'factorial']\n};","export var combinationsWithRepDocs = {\n name: 'combinationsWithRep',\n category: 'Probability',\n syntax: ['combinationsWithRep(n, k)'],\n description: 'Compute the number of combinations of n items taken k at a time with replacements.',\n examples: ['combinationsWithRep(7, 5)'],\n seealso: ['combinations', 'permutations', 'factorial']\n};","export var factorialDocs = {\n name: 'factorial',\n category: 'Probability',\n syntax: ['n!', 'factorial(n)'],\n description: 'Compute the factorial of a value',\n examples: ['5!', '5 * 4 * 3 * 2 * 1', '3!'],\n seealso: ['combinations', 'combinationsWithRep', 'permutations', 'gamma']\n};","export var gammaDocs = {\n name: 'gamma',\n category: 'Probability',\n syntax: ['gamma(n)'],\n description: 'Compute the gamma function. For small values, the Lanczos approximation is used, and for large values the extended Stirling approximation.',\n examples: ['gamma(4)', '3!', 'gamma(1/2)', 'sqrt(pi)'],\n seealso: ['factorial']\n};","export var kldivergenceDocs = {\n name: 'kldivergence',\n category: 'Probability',\n syntax: ['kldivergence(x, y)'],\n description: 'Calculate the Kullback-Leibler (KL) divergence between two distributions.',\n examples: ['kldivergence([0.7,0.5,0.4], [0.2,0.9,0.5])'],\n seealso: []\n};","export var lgammaDocs = {\n name: 'lgamma',\n category: 'Probability',\n syntax: ['lgamma(n)'],\n description: 'Logarithm of the gamma function for real, positive numbers and complex numbers, ' + 'using Lanczos approximation for numbers and Stirling series for complex numbers.',\n examples: ['lgamma(4)', 'lgamma(1/2)', 'lgamma(i)', 'lgamma(complex(1.1, 2))'],\n seealso: ['gamma']\n};","export var multinomialDocs = {\n name: 'multinomial',\n category: 'Probability',\n syntax: ['multinomial(A)'],\n description: 'Multinomial Coefficients compute the number of ways of picking a1, a2, ..., ai unordered outcomes from `n` possibilities. multinomial takes one array of integers as an argument. The following condition must be enforced: every ai > 0.',\n examples: ['multinomial([1, 2, 1])'],\n seealso: ['combinations', 'factorial']\n};","export var permutationsDocs = {\n name: 'permutations',\n category: 'Probability',\n syntax: ['permutations(n)', 'permutations(n, k)'],\n description: 'Compute the number of permutations of n items taken k at a time',\n examples: ['permutations(5)', 'permutations(5, 3)'],\n seealso: ['combinations', 'combinationsWithRep', 'factorial']\n};","export var pickRandomDocs = {\n name: 'pickRandom',\n category: 'Probability',\n syntax: ['pickRandom(array)', 'pickRandom(array, number)', 'pickRandom(array, weights)', 'pickRandom(array, number, weights)', 'pickRandom(array, weights, number)'],\n description: 'Pick a random entry from a given array.',\n examples: ['pickRandom(0:10)', 'pickRandom([1, 3, 1, 6])', 'pickRandom([1, 3, 1, 6], 2)', 'pickRandom([1, 3, 1, 6], [2, 3, 2, 1])', 'pickRandom([1, 3, 1, 6], 2, [2, 3, 2, 1])', 'pickRandom([1, 3, 1, 6], [2, 3, 2, 1], 2)'],\n seealso: ['random', 'randomInt']\n};","export var randomDocs = {\n name: 'random',\n category: 'Probability',\n syntax: ['random()', 'random(max)', 'random(min, max)', 'random(size)', 'random(size, max)', 'random(size, min, max)'],\n description: 'Return a random number.',\n examples: ['random()', 'random(10, 20)', 'random([2, 3])'],\n seealso: ['pickRandom', 'randomInt']\n};","export var randomIntDocs = {\n name: 'randomInt',\n category: 'Probability',\n syntax: ['randomInt(max)', 'randomInt(min, max)', 'randomInt(size)', 'randomInt(size, max)', 'randomInt(size, min, max)'],\n description: 'Return a random integer number',\n examples: ['randomInt(10, 20)', 'randomInt([2, 3], 10)'],\n seealso: ['pickRandom', 'random']\n};","export var compareDocs = {\n name: 'compare',\n category: 'Relational',\n syntax: ['compare(x, y)'],\n description: 'Compare two values. ' + 'Returns 1 when x > y, -1 when x < y, and 0 when x == y.',\n examples: ['compare(2, 3)', 'compare(3, 2)', 'compare(2, 2)', 'compare(5cm, 40mm)', 'compare(2, [1, 2, 3])'],\n seealso: ['equal', 'unequal', 'smaller', 'smallerEq', 'largerEq', 'compareNatural', 'compareText']\n};","export var compareNaturalDocs = {\n name: 'compareNatural',\n category: 'Relational',\n syntax: ['compareNatural(x, y)'],\n description: 'Compare two values of any type in a deterministic, natural way. ' + 'Returns 1 when x > y, -1 when x < y, and 0 when x == y.',\n examples: ['compareNatural(2, 3)', 'compareNatural(3, 2)', 'compareNatural(2, 2)', 'compareNatural(5cm, 40mm)', 'compareNatural(\"2\", \"10\")', 'compareNatural(2 + 3i, 2 + 4i)', 'compareNatural([1, 2, 4], [1, 2, 3])', 'compareNatural([1, 5], [1, 2, 3])', 'compareNatural([1, 2], [1, 2])', 'compareNatural({a: 2}, {a: 4})'],\n seealso: ['equal', 'unequal', 'smaller', 'smallerEq', 'largerEq', 'compare', 'compareText']\n};","export var compareTextDocs = {\n name: 'compareText',\n category: 'Relational',\n syntax: ['compareText(x, y)'],\n description: 'Compare two strings lexically. Comparison is case sensitive. ' + 'Returns 1 when x > y, -1 when x < y, and 0 when x == y.',\n examples: ['compareText(\"B\", \"A\")', 'compareText(\"A\", \"B\")', 'compareText(\"A\", \"A\")', 'compareText(\"2\", \"10\")', 'compare(\"2\", \"10\")', 'compare(2, 10)', 'compareNatural(\"2\", \"10\")', 'compareText(\"B\", [\"A\", \"B\", \"C\"])'],\n seealso: ['compare', 'compareNatural']\n};","export var deepEqualDocs = {\n name: 'deepEqual',\n category: 'Relational',\n syntax: ['deepEqual(x, y)'],\n description: 'Check equality of two matrices element wise. Returns true if the size of both matrices is equal and when and each of the elements are equal.',\n examples: ['deepEqual([1,3,4], [1,3,4])', 'deepEqual([1,3,4], [1,3])'],\n seealso: ['equal', 'unequal', 'smaller', 'larger', 'smallerEq', 'largerEq', 'compare']\n};","export var equalDocs = {\n name: 'equal',\n category: 'Relational',\n syntax: ['x == y', 'equal(x, y)'],\n description: 'Check equality of two values. Returns true if the values are equal, and false if not.',\n examples: ['2+2 == 3', '2+2 == 4', 'a = 3.2', 'b = 6-2.8', 'a == b', '50cm == 0.5m'],\n seealso: ['unequal', 'smaller', 'larger', 'smallerEq', 'largerEq', 'compare', 'deepEqual', 'equalText']\n};","export var equalTextDocs = {\n name: 'equalText',\n category: 'Relational',\n syntax: ['equalText(x, y)'],\n description: 'Check equality of two strings. Comparison is case sensitive. Returns true if the values are equal, and false if not.',\n examples: ['equalText(\"Hello\", \"Hello\")', 'equalText(\"a\", \"A\")', 'equal(\"2e3\", \"2000\")', 'equalText(\"2e3\", \"2000\")', 'equalText(\"B\", [\"A\", \"B\", \"C\"])'],\n seealso: ['compare', 'compareNatural', 'compareText', 'equal']\n};","export var largerDocs = {\n name: 'larger',\n category: 'Relational',\n syntax: ['x > y', 'larger(x, y)'],\n description: 'Check if value x is larger than y. Returns true if x is larger than y, and false if not.',\n examples: ['2 > 3', '5 > 2*2', 'a = 3.3', 'b = 6-2.8', '(a > b)', '(b < a)', '5 cm > 2 inch'],\n seealso: ['equal', 'unequal', 'smaller', 'smallerEq', 'largerEq', 'compare']\n};","export var largerEqDocs = {\n name: 'largerEq',\n category: 'Relational',\n syntax: ['x >= y', 'largerEq(x, y)'],\n description: 'Check if value x is larger or equal to y. Returns true if x is larger or equal to y, and false if not.',\n examples: ['2 >= 1+1', '2 > 1+1', 'a = 3.2', 'b = 6-2.8', '(a >= b)'],\n seealso: ['equal', 'unequal', 'smallerEq', 'smaller', 'compare']\n};","export var smallerDocs = {\n name: 'smaller',\n category: 'Relational',\n syntax: ['x < y', 'smaller(x, y)'],\n description: 'Check if value x is smaller than value y. Returns true if x is smaller than y, and false if not.',\n examples: ['2 < 3', '5 < 2*2', 'a = 3.3', 'b = 6-2.8', '(a < b)', '5 cm < 2 inch'],\n seealso: ['equal', 'unequal', 'larger', 'smallerEq', 'largerEq', 'compare']\n};","export var smallerEqDocs = {\n name: 'smallerEq',\n category: 'Relational',\n syntax: ['x <= y', 'smallerEq(x, y)'],\n description: 'Check if value x is smaller or equal to value y. Returns true if x is smaller than y, and false if not.',\n examples: ['2 <= 1+1', '2 < 1+1', 'a = 3.2', 'b = 6-2.8', '(a <= b)'],\n seealso: ['equal', 'unequal', 'larger', 'smaller', 'largerEq', 'compare']\n};","export var unequalDocs = {\n name: 'unequal',\n category: 'Relational',\n syntax: ['x != y', 'unequal(x, y)'],\n description: 'Check unequality of two values. Returns true if the values are unequal, and false if they are equal.',\n examples: ['2+2 != 3', '2+2 != 4', 'a = 3.2', 'b = 6-2.8', 'a != b', '50cm != 0.5m', '5 cm != 2 inch'],\n seealso: ['equal', 'smaller', 'larger', 'smallerEq', 'largerEq', 'compare', 'deepEqual']\n};","export var setCartesianDocs = {\n name: 'setCartesian',\n category: 'Set',\n syntax: ['setCartesian(set1, set2)'],\n description: 'Create the cartesian product of two (multi)sets. Multi-dimension arrays will be converted to single-dimension arrays and the values will be sorted in ascending order before the operation.',\n examples: ['setCartesian([1, 2], [3, 4])'],\n seealso: ['setUnion', 'setIntersect', 'setDifference', 'setPowerset']\n};","export var setDifferenceDocs = {\n name: 'setDifference',\n category: 'Set',\n syntax: ['setDifference(set1, set2)'],\n description: 'Create the difference of two (multi)sets: every element of set1, that is not the element of set2. Multi-dimension arrays will be converted to single-dimension arrays before the operation.',\n examples: ['setDifference([1, 2, 3, 4], [3, 4, 5, 6])', 'setDifference([[1, 2], [3, 4]], [[3, 4], [5, 6]])'],\n seealso: ['setUnion', 'setIntersect', 'setSymDifference']\n};","export var setDistinctDocs = {\n name: 'setDistinct',\n category: 'Set',\n syntax: ['setDistinct(set)'],\n description: 'Collect the distinct elements of a multiset. A multi-dimension array will be converted to a single-dimension array before the operation.',\n examples: ['setDistinct([1, 1, 1, 2, 2, 3])'],\n seealso: ['setMultiplicity']\n};","export var setIntersectDocs = {\n name: 'setIntersect',\n category: 'Set',\n syntax: ['setIntersect(set1, set2)'],\n description: 'Create the intersection of two (multi)sets. Multi-dimension arrays will be converted to single-dimension arrays before the operation.',\n examples: ['setIntersect([1, 2, 3, 4], [3, 4, 5, 6])', 'setIntersect([[1, 2], [3, 4]], [[3, 4], [5, 6]])'],\n seealso: ['setUnion', 'setDifference']\n};","export var setIsSubsetDocs = {\n name: 'setIsSubset',\n category: 'Set',\n syntax: ['setIsSubset(set1, set2)'],\n description: 'Check whether a (multi)set is a subset of another (multi)set: every element of set1 is the element of set2. Multi-dimension arrays will be converted to single-dimension arrays before the operation.',\n examples: ['setIsSubset([1, 2], [3, 4, 5, 6])', 'setIsSubset([3, 4], [3, 4, 5, 6])'],\n seealso: ['setUnion', 'setIntersect', 'setDifference']\n};","export var setMultiplicityDocs = {\n name: 'setMultiplicity',\n category: 'Set',\n syntax: ['setMultiplicity(element, set)'],\n description: 'Count the multiplicity of an element in a multiset. A multi-dimension array will be converted to a single-dimension array before the operation.',\n examples: ['setMultiplicity(1, [1, 2, 2, 4])', 'setMultiplicity(2, [1, 2, 2, 4])'],\n seealso: ['setDistinct', 'setSize']\n};","export var setPowersetDocs = {\n name: 'setPowerset',\n category: 'Set',\n syntax: ['setPowerset(set)'],\n description: 'Create the powerset of a (multi)set: the powerset contains very possible subsets of a (multi)set. A multi-dimension array will be converted to a single-dimension array before the operation.',\n examples: ['setPowerset([1, 2, 3])'],\n seealso: ['setCartesian']\n};","export var setSizeDocs = {\n name: 'setSize',\n category: 'Set',\n syntax: ['setSize(set)', 'setSize(set, unique)'],\n description: 'Count the number of elements of a (multi)set. When the second parameter \"unique\" is true, count only the unique values. A multi-dimension array will be converted to a single-dimension array before the operation.',\n examples: ['setSize([1, 2, 2, 4])', 'setSize([1, 2, 2, 4], true)'],\n seealso: ['setUnion', 'setIntersect', 'setDifference']\n};","export var setSymDifferenceDocs = {\n name: 'setSymDifference',\n category: 'Set',\n syntax: ['setSymDifference(set1, set2)'],\n description: 'Create the symmetric difference of two (multi)sets. Multi-dimension arrays will be converted to single-dimension arrays before the operation.',\n examples: ['setSymDifference([1, 2, 3, 4], [3, 4, 5, 6])', 'setSymDifference([[1, 2], [3, 4]], [[3, 4], [5, 6]])'],\n seealso: ['setUnion', 'setIntersect', 'setDifference']\n};","export var setUnionDocs = {\n name: 'setUnion',\n category: 'Set',\n syntax: ['setUnion(set1, set2)'],\n description: 'Create the union of two (multi)sets. Multi-dimension arrays will be converted to single-dimension arrays before the operation.',\n examples: ['setUnion([1, 2, 3, 4], [3, 4, 5, 6])', 'setUnion([[1, 2], [3, 4]], [[3, 4], [5, 6]])'],\n seealso: ['setIntersect', 'setDifference']\n};","export var zpk2tfDocs = {\n name: 'zpk2tf',\n category: 'Signal',\n syntax: ['zpk2tf(z, p, k)'],\n description: 'Compute the transfer function of a zero-pole-gain model.',\n examples: ['zpk2tf([1, 2], [-1, -2], 1)', 'zpk2tf([1, 2], [-1, -2])', 'zpk2tf([1 - 3i, 2 + 2i], [-1, -2])'],\n seealso: []\n};","export var freqzDocs = {\n name: 'freqz',\n category: 'Signal',\n syntax: ['freqz(b, a)', 'freqz(b, a, w)'],\n description: 'Calculates the frequency response of a filter given its numerator and denominator coefficients.',\n examples: ['freqz([1, 2], [1, 2, 3])', 'freqz([1, 2], [1, 2, 3], [0, 1])', 'freqz([1, 2], [1, 2, 3], 512)'],\n seealso: []\n};","export var erfDocs = {\n name: 'erf',\n category: 'Special',\n syntax: ['erf(x)'],\n description: 'Compute the erf function of a value using a rational Chebyshev approximations for different intervals of x',\n examples: ['erf(0.2)', 'erf(-0.5)', 'erf(4)'],\n seealso: []\n};","export var cumSumDocs = {\n name: 'cumsum',\n category: 'Statistics',\n syntax: ['cumsum(a, b, c, ...)', 'cumsum(A)'],\n description: 'Compute the cumulative sum of all values.',\n examples: ['cumsum(2, 3, 4, 1)', 'cumsum([2, 3, 4, 1])', 'cumsum([1, 2; 3, 4])', 'cumsum([1, 2; 3, 4], 1)', 'cumsum([1, 2; 3, 4], 2)'],\n seealso: ['max', 'mean', 'median', 'min', 'prod', 'std', 'sum', 'variance']\n};","export var madDocs = {\n name: 'mad',\n category: 'Statistics',\n syntax: ['mad(a, b, c, ...)', 'mad(A)'],\n description: 'Compute the median absolute deviation of a matrix or a list with values. The median absolute deviation is defined as the median of the absolute deviations from the median.',\n examples: ['mad(10, 20, 30)', 'mad([1, 2, 3])'],\n seealso: ['mean', 'median', 'std', 'abs']\n};","export var maxDocs = {\n name: 'max',\n category: 'Statistics',\n syntax: ['max(a, b, c, ...)', 'max(A)', 'max(A, dimension)'],\n description: 'Compute the maximum value of a list of values.',\n examples: ['max(2, 3, 4, 1)', 'max([2, 3, 4, 1])', 'max([2, 5; 4, 3])', 'max([2, 5; 4, 3], 1)', 'max([2, 5; 4, 3], 2)', 'max(2.7, 7.1, -4.5, 2.0, 4.1)', 'min(2.7, 7.1, -4.5, 2.0, 4.1)'],\n seealso: ['mean', 'median', 'min', 'prod', 'std', 'sum', 'variance']\n};","export var meanDocs = {\n name: 'mean',\n category: 'Statistics',\n syntax: ['mean(a, b, c, ...)', 'mean(A)', 'mean(A, dimension)'],\n description: 'Compute the arithmetic mean of a list of values.',\n examples: ['mean(2, 3, 4, 1)', 'mean([2, 3, 4, 1])', 'mean([2, 5; 4, 3])', 'mean([2, 5; 4, 3], 1)', 'mean([2, 5; 4, 3], 2)', 'mean([1.0, 2.7, 3.2, 4.0])'],\n seealso: ['max', 'median', 'min', 'prod', 'std', 'sum', 'variance']\n};","export var medianDocs = {\n name: 'median',\n category: 'Statistics',\n syntax: ['median(a, b, c, ...)', 'median(A)'],\n description: 'Compute the median of all values. The values are sorted and the middle value is returned. In case of an even number of values, the average of the two middle values is returned.',\n examples: ['median(5, 2, 7)', 'median([3, -1, 5, 7])'],\n seealso: ['max', 'mean', 'min', 'prod', 'std', 'sum', 'variance', 'quantileSeq']\n};","export var minDocs = {\n name: 'min',\n category: 'Statistics',\n syntax: ['min(a, b, c, ...)', 'min(A)', 'min(A, dimension)'],\n description: 'Compute the minimum value of a list of values.',\n examples: ['min(2, 3, 4, 1)', 'min([2, 3, 4, 1])', 'min([2, 5; 4, 3])', 'min([2, 5; 4, 3], 1)', 'min([2, 5; 4, 3], 2)', 'min(2.7, 7.1, -4.5, 2.0, 4.1)', 'max(2.7, 7.1, -4.5, 2.0, 4.1)'],\n seealso: ['max', 'mean', 'median', 'prod', 'std', 'sum', 'variance']\n};","export var modeDocs = {\n name: 'mode',\n category: 'Statistics',\n syntax: ['mode(a, b, c, ...)', 'mode(A)', 'mode(A, a, b, B, c, ...)'],\n description: 'Computes the mode of all values as an array. In case mode being more than one, multiple values are returned in an array.',\n examples: ['mode(2, 1, 4, 3, 1)', 'mode([1, 2.7, 3.2, 4, 2.7])', 'mode(1, 4, 6, 1, 6)'],\n seealso: ['max', 'mean', 'min', 'median', 'prod', 'std', 'sum', 'variance']\n};","export var prodDocs = {\n name: 'prod',\n category: 'Statistics',\n syntax: ['prod(a, b, c, ...)', 'prod(A)'],\n description: 'Compute the product of all values.',\n examples: ['prod(2, 3, 4)', 'prod([2, 3, 4])', 'prod([2, 5; 4, 3])'],\n seealso: ['max', 'mean', 'min', 'median', 'min', 'std', 'sum', 'variance']\n};","export var quantileSeqDocs = {\n name: 'quantileSeq',\n category: 'Statistics',\n syntax: ['quantileSeq(A, prob[, sorted])', 'quantileSeq(A, [prob1, prob2, ...][, sorted])', 'quantileSeq(A, N[, sorted])'],\n description: 'Compute the prob order quantile of a matrix or a list with values. The sequence is sorted and the middle value is returned. Supported types of sequence values are: Number, BigNumber, Unit Supported types of probablity are: Number, BigNumber. \\n\\nIn case of a (multi dimensional) array or matrix, the prob order quantile of all elements will be calculated.',\n examples: ['quantileSeq([3, -1, 5, 7], 0.5)', 'quantileSeq([3, -1, 5, 7], [1/3, 2/3])', 'quantileSeq([3, -1, 5, 7], 2)', 'quantileSeq([-1, 3, 5, 7], 0.5, true)'],\n seealso: ['mean', 'median', 'min', 'max', 'prod', 'std', 'sum', 'variance']\n};","export var stdDocs = {\n name: 'std',\n category: 'Statistics',\n syntax: ['std(a, b, c, ...)', 'std(A)', 'std(A, dimension)', 'std(A, normalization)', 'std(A, dimension, normalization)'],\n description: 'Compute the standard deviation of all values, defined as std(A) = sqrt(variance(A)). Optional parameter normalization can be \"unbiased\" (default), \"uncorrected\", or \"biased\".',\n examples: ['std(2, 4, 6)', 'std([2, 4, 6, 8])', 'std([2, 4, 6, 8], \"uncorrected\")', 'std([2, 4, 6, 8], \"biased\")', 'std([1, 2, 3; 4, 5, 6])'],\n seealso: ['max', 'mean', 'min', 'median', 'prod', 'sum', 'variance']\n};","export var sumDocs = {\n name: 'sum',\n category: 'Statistics',\n syntax: ['sum(a, b, c, ...)', 'sum(A)', 'sum(A, dimension)'],\n description: 'Compute the sum of all values.',\n examples: ['sum(2, 3, 4, 1)', 'sum([2, 3, 4, 1])', 'sum([2, 5; 4, 3])'],\n seealso: ['max', 'mean', 'median', 'min', 'prod', 'std', 'sum', 'variance']\n};","export var varianceDocs = {\n name: 'variance',\n category: 'Statistics',\n syntax: ['variance(a, b, c, ...)', 'variance(A)', 'variance(A, dimension)', 'variance(A, normalization)', 'variance(A, dimension, normalization)'],\n description: 'Compute the variance of all values. Optional parameter normalization can be \"unbiased\" (default), \"uncorrected\", or \"biased\".',\n examples: ['variance(2, 4, 6)', 'variance([2, 4, 6, 8])', 'variance([2, 4, 6, 8], \"uncorrected\")', 'variance([2, 4, 6, 8], \"biased\")', 'variance([1, 2, 3; 4, 5, 6])'],\n seealso: ['max', 'mean', 'min', 'median', 'min', 'prod', 'std', 'sum']\n};","export var acosDocs = {\n name: 'acos',\n category: 'Trigonometry',\n syntax: ['acos(x)'],\n description: 'Compute the inverse cosine of a value in radians.',\n examples: ['acos(0.5)', 'acos(cos(2.3))'],\n seealso: ['cos', 'atan', 'asin']\n};","export var acoshDocs = {\n name: 'acosh',\n category: 'Trigonometry',\n syntax: ['acosh(x)'],\n description: 'Calculate the hyperbolic arccos of a value, defined as `acosh(x) = ln(sqrt(x^2 - 1) + x)`.',\n examples: ['acosh(1.5)'],\n seealso: ['cosh', 'asinh', 'atanh']\n};","export var acotDocs = {\n name: 'acot',\n category: 'Trigonometry',\n syntax: ['acot(x)'],\n description: 'Calculate the inverse cotangent of a value.',\n examples: ['acot(0.5)', 'acot(cot(0.5))', 'acot(2)'],\n seealso: ['cot', 'atan']\n};","export var acothDocs = {\n name: 'acoth',\n category: 'Trigonometry',\n syntax: ['acoth(x)'],\n description: 'Calculate the hyperbolic arccotangent of a value, defined as `acoth(x) = (ln((x+1)/x) + ln(x/(x-1))) / 2`.',\n examples: ['acoth(2)', 'acoth(0.5)'],\n seealso: ['acsch', 'asech']\n};","export var acscDocs = {\n name: 'acsc',\n category: 'Trigonometry',\n syntax: ['acsc(x)'],\n description: 'Calculate the inverse cotangent of a value.',\n examples: ['acsc(2)', 'acsc(csc(0.5))', 'acsc(0.5)'],\n seealso: ['csc', 'asin', 'asec']\n};","export var acschDocs = {\n name: 'acsch',\n category: 'Trigonometry',\n syntax: ['acsch(x)'],\n description: 'Calculate the hyperbolic arccosecant of a value, defined as `acsch(x) = ln(1/x + sqrt(1/x^2 + 1))`.',\n examples: ['acsch(0.5)'],\n seealso: ['asech', 'acoth']\n};","export var asecDocs = {\n name: 'asec',\n category: 'Trigonometry',\n syntax: ['asec(x)'],\n description: 'Calculate the inverse secant of a value.',\n examples: ['asec(0.5)', 'asec(sec(0.5))', 'asec(2)'],\n seealso: ['acos', 'acot', 'acsc']\n};","export var asechDocs = {\n name: 'asech',\n category: 'Trigonometry',\n syntax: ['asech(x)'],\n description: 'Calculate the inverse secant of a value.',\n examples: ['asech(0.5)'],\n seealso: ['acsch', 'acoth']\n};","export var asinDocs = {\n name: 'asin',\n category: 'Trigonometry',\n syntax: ['asin(x)'],\n description: 'Compute the inverse sine of a value in radians.',\n examples: ['asin(0.5)', 'asin(sin(0.5))'],\n seealso: ['sin', 'acos', 'atan']\n};","export var asinhDocs = {\n name: 'asinh',\n category: 'Trigonometry',\n syntax: ['asinh(x)'],\n description: 'Calculate the hyperbolic arcsine of a value, defined as `asinh(x) = ln(x + sqrt(x^2 + 1))`.',\n examples: ['asinh(0.5)'],\n seealso: ['acosh', 'atanh']\n};","export var atanDocs = {\n name: 'atan',\n category: 'Trigonometry',\n syntax: ['atan(x)'],\n description: 'Compute the inverse tangent of a value in radians.',\n examples: ['atan(0.5)', 'atan(tan(0.5))'],\n seealso: ['tan', 'acos', 'asin']\n};","export var atanhDocs = {\n name: 'atanh',\n category: 'Trigonometry',\n syntax: ['atanh(x)'],\n description: 'Calculate the hyperbolic arctangent of a value, defined as `atanh(x) = ln((1 + x)/(1 - x)) / 2`.',\n examples: ['atanh(0.5)'],\n seealso: ['acosh', 'asinh']\n};","export var atan2Docs = {\n name: 'atan2',\n category: 'Trigonometry',\n syntax: ['atan2(y, x)'],\n description: 'Computes the principal value of the arc tangent of y/x in radians.',\n examples: ['atan2(2, 2) / pi', 'angle = 60 deg in rad', 'x = cos(angle)', 'y = sin(angle)', 'atan2(y, x)'],\n seealso: ['sin', 'cos', 'tan']\n};","export var cosDocs = {\n name: 'cos',\n category: 'Trigonometry',\n syntax: ['cos(x)'],\n description: 'Compute the cosine of x in radians.',\n examples: ['cos(2)', 'cos(pi / 4) ^ 2', 'cos(180 deg)', 'cos(60 deg)', 'sin(0.2)^2 + cos(0.2)^2'],\n seealso: ['acos', 'sin', 'tan']\n};","export var coshDocs = {\n name: 'cosh',\n category: 'Trigonometry',\n syntax: ['cosh(x)'],\n description: 'Compute the hyperbolic cosine of x in radians.',\n examples: ['cosh(0.5)'],\n seealso: ['sinh', 'tanh', 'coth']\n};","export var cotDocs = {\n name: 'cot',\n category: 'Trigonometry',\n syntax: ['cot(x)'],\n description: 'Compute the cotangent of x in radians. Defined as 1/tan(x)',\n examples: ['cot(2)', '1 / tan(2)'],\n seealso: ['sec', 'csc', 'tan']\n};","export var cothDocs = {\n name: 'coth',\n category: 'Trigonometry',\n syntax: ['coth(x)'],\n description: 'Compute the hyperbolic cotangent of x in radians.',\n examples: ['coth(2)', '1 / tanh(2)'],\n seealso: ['sech', 'csch', 'tanh']\n};","export var cscDocs = {\n name: 'csc',\n category: 'Trigonometry',\n syntax: ['csc(x)'],\n description: 'Compute the cosecant of x in radians. Defined as 1/sin(x)',\n examples: ['csc(2)', '1 / sin(2)'],\n seealso: ['sec', 'cot', 'sin']\n};","export var cschDocs = {\n name: 'csch',\n category: 'Trigonometry',\n syntax: ['csch(x)'],\n description: 'Compute the hyperbolic cosecant of x in radians. Defined as 1/sinh(x)',\n examples: ['csch(2)', '1 / sinh(2)'],\n seealso: ['sech', 'coth', 'sinh']\n};","export var secDocs = {\n name: 'sec',\n category: 'Trigonometry',\n syntax: ['sec(x)'],\n description: 'Compute the secant of x in radians. Defined as 1/cos(x)',\n examples: ['sec(2)', '1 / cos(2)'],\n seealso: ['cot', 'csc', 'cos']\n};","export var sechDocs = {\n name: 'sech',\n category: 'Trigonometry',\n syntax: ['sech(x)'],\n description: 'Compute the hyperbolic secant of x in radians. Defined as 1/cosh(x)',\n examples: ['sech(2)', '1 / cosh(2)'],\n seealso: ['coth', 'csch', 'cosh']\n};","export var sinDocs = {\n name: 'sin',\n category: 'Trigonometry',\n syntax: ['sin(x)'],\n description: 'Compute the sine of x in radians.',\n examples: ['sin(2)', 'sin(pi / 4) ^ 2', 'sin(90 deg)', 'sin(30 deg)', 'sin(0.2)^2 + cos(0.2)^2'],\n seealso: ['asin', 'cos', 'tan']\n};","export var sinhDocs = {\n name: 'sinh',\n category: 'Trigonometry',\n syntax: ['sinh(x)'],\n description: 'Compute the hyperbolic sine of x in radians.',\n examples: ['sinh(0.5)'],\n seealso: ['cosh', 'tanh']\n};","export var tanDocs = {\n name: 'tan',\n category: 'Trigonometry',\n syntax: ['tan(x)'],\n description: 'Compute the tangent of x in radians.',\n examples: ['tan(0.5)', 'sin(0.5) / cos(0.5)', 'tan(pi / 4)', 'tan(45 deg)'],\n seealso: ['atan', 'sin', 'cos']\n};","export var tanhDocs = {\n name: 'tanh',\n category: 'Trigonometry',\n syntax: ['tanh(x)'],\n description: 'Compute the hyperbolic tangent of x in radians.',\n examples: ['tanh(0.5)', 'sinh(0.5) / cosh(0.5)'],\n seealso: ['sinh', 'cosh']\n};","export var toDocs = {\n name: 'to',\n category: 'Units',\n syntax: ['x to unit', 'to(x, unit)'],\n description: 'Change the unit of a value.',\n examples: ['5 inch to cm', '3.2kg to g', '16 bytes in bits'],\n seealso: []\n};","export var cloneDocs = {\n name: 'clone',\n category: 'Utils',\n syntax: ['clone(x)'],\n description: 'Clone a variable. Creates a copy of primitive variables,and a deep copy of matrices',\n examples: ['clone(3.5)', 'clone(2 - 4i)', 'clone(45 deg)', 'clone([1, 2; 3, 4])', 'clone(\"hello world\")'],\n seealso: []\n};","export var formatDocs = {\n name: 'format',\n category: 'Utils',\n syntax: ['format(value)', 'format(value, precision)'],\n description: 'Format a value of any type as string.',\n examples: ['format(2.3)', 'format(3 - 4i)', 'format([])', 'format(pi, 3)'],\n seealso: ['print']\n};","export var binDocs = {\n name: 'bin',\n category: 'Utils',\n syntax: ['bin(value)'],\n description: 'Format a number as binary',\n examples: ['bin(2)'],\n seealso: ['oct', 'hex']\n};","export var octDocs = {\n name: 'oct',\n category: 'Utils',\n syntax: ['oct(value)'],\n description: 'Format a number as octal',\n examples: ['oct(56)'],\n seealso: ['bin', 'hex']\n};","export var hexDocs = {\n name: 'hex',\n category: 'Utils',\n syntax: ['hex(value)'],\n description: 'Format a number as hexadecimal',\n examples: ['hex(240)'],\n seealso: ['bin', 'oct']\n};","export var isNaNDocs = {\n name: 'isNaN',\n category: 'Utils',\n syntax: ['isNaN(x)'],\n description: 'Test whether a value is NaN (not a number)',\n examples: ['isNaN(2)', 'isNaN(0 / 0)', 'isNaN(NaN)', 'isNaN(Infinity)'],\n seealso: ['isNegative', 'isNumeric', 'isPositive', 'isZero']\n};","export var isIntegerDocs = {\n name: 'isInteger',\n category: 'Utils',\n syntax: ['isInteger(x)'],\n description: 'Test whether a value is an integer number.',\n examples: ['isInteger(2)', 'isInteger(3.5)', 'isInteger([3, 0.5, -2])'],\n seealso: ['isNegative', 'isNumeric', 'isPositive', 'isZero']\n};","export var isNegativeDocs = {\n name: 'isNegative',\n category: 'Utils',\n syntax: ['isNegative(x)'],\n description: 'Test whether a value is negative: smaller than zero.',\n examples: ['isNegative(2)', 'isNegative(0)', 'isNegative(-4)', 'isNegative([3, 0.5, -2])'],\n seealso: ['isInteger', 'isNumeric', 'isPositive', 'isZero']\n};","export var isNumericDocs = {\n name: 'isNumeric',\n category: 'Utils',\n syntax: ['isNumeric(x)'],\n description: 'Test whether a value is a numeric value. ' + 'Returns true when the input is a number, BigNumber, Fraction, or boolean.',\n examples: ['isNumeric(2)', 'isNumeric(\"2\")', 'hasNumericValue(\"2\")', 'isNumeric(0)', 'isNumeric(bignumber(500))', 'isNumeric(fraction(0.125))', 'isNumeric(2 + 3i)', 'isNumeric([2.3, \"foo\", false])'],\n seealso: ['isInteger', 'isZero', 'isNegative', 'isPositive', 'isNaN', 'hasNumericValue']\n};","export var hasNumericValueDocs = {\n name: 'hasNumericValue',\n category: 'Utils',\n syntax: ['hasNumericValue(x)'],\n description: 'Test whether a value is an numeric value. ' + 'In case of a string, true is returned if the string contains a numeric value.',\n examples: ['hasNumericValue(2)', 'hasNumericValue(\"2\")', 'isNumeric(\"2\")', 'hasNumericValue(0)', 'hasNumericValue(bignumber(500))', 'hasNumericValue(fraction(0.125))', 'hasNumericValue(2 + 3i)', 'hasNumericValue([2.3, \"foo\", false])'],\n seealso: ['isInteger', 'isZero', 'isNegative', 'isPositive', 'isNaN', 'isNumeric']\n};","export var isPositiveDocs = {\n name: 'isPositive',\n category: 'Utils',\n syntax: ['isPositive(x)'],\n description: 'Test whether a value is positive: larger than zero.',\n examples: ['isPositive(2)', 'isPositive(0)', 'isPositive(-4)', 'isPositive([3, 0.5, -2])'],\n seealso: ['isInteger', 'isNumeric', 'isNegative', 'isZero']\n};","export var isPrimeDocs = {\n name: 'isPrime',\n category: 'Utils',\n syntax: ['isPrime(x)'],\n description: 'Test whether a value is prime: has no divisors other than itself and one.',\n examples: ['isPrime(3)', 'isPrime(-2)', 'isPrime([2, 17, 100])'],\n seealso: ['isInteger', 'isNumeric', 'isNegative', 'isZero']\n};","export var isZeroDocs = {\n name: 'isZero',\n category: 'Utils',\n syntax: ['isZero(x)'],\n description: 'Test whether a value is zero.',\n examples: ['isZero(2)', 'isZero(0)', 'isZero(-4)', 'isZero([3, 0, -2, 0])'],\n seealso: ['isInteger', 'isNumeric', 'isNegative', 'isPositive']\n};","export var printDocs = {\n name: 'print',\n category: 'Utils',\n syntax: ['print(template, values)', 'print(template, values, precision)'],\n description: 'Interpolate values into a string template.',\n examples: ['print(\"Lucy is $age years old\", {age: 5})', 'print(\"The value of pi is $pi\", {pi: pi}, 3)', 'print(\"Hello, $user.name!\", {user: {name: \"John\"}})', 'print(\"Values: $0, $1, $2\", [6, 9, 4])'],\n seealso: ['format']\n};","export var typeOfDocs = {\n name: 'typeOf',\n category: 'Utils',\n syntax: ['typeOf(x)'],\n description: 'Get the type of a variable.',\n examples: ['typeOf(3.5)', 'typeOf(2 - 4i)', 'typeOf(45 deg)', 'typeOf(\"hello world\")'],\n seealso: ['getMatrixDataType']\n};","export var numericDocs = {\n name: 'numeric',\n category: 'Utils',\n syntax: ['numeric(x)'],\n description: 'Convert a numeric input to a specific numeric type: number, BigNumber, or Fraction.',\n examples: ['numeric(\"4\")', 'numeric(\"4\", \"number\")', 'numeric(\"4\", \"BigNumber\")', 'numeric(\"4\", \"Fraction\")', 'numeric(4, \"Fraction\")', 'numeric(fraction(2, 5), \"number\")'],\n seealso: ['number', 'fraction', 'bignumber', 'string', 'format']\n};","import { factory } from '../../utils/factory.js';\nimport { getSafeProperty } from '../../utils/customs.js';\nimport { embeddedDocs } from '../embeddedDocs/embeddedDocs.js';\nimport { hasOwnProperty } from '../../utils/object.js';\nvar name = 'help';\nvar dependencies = ['typed', 'mathWithTransform', 'Help'];\nexport var createHelp = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n mathWithTransform,\n Help\n } = _ref;\n /**\n * Retrieve help on a function or data type.\n * Help files are retrieved from the embedded documentation in math.docs.\n *\n * Syntax:\n *\n * math.help(search)\n *\n * Examples:\n *\n * console.log(math.help('sin').toString())\n * console.log(math.help(math.add).toString())\n * console.log(math.help(math.add).toJSON())\n *\n * @param {Function | string | Object} search A function or function name\n * for which to get help\n * @return {Help} A help object\n */\n return typed(name, {\n any: function any(search) {\n var prop;\n var searchName = search;\n if (typeof search !== 'string') {\n for (prop in mathWithTransform) {\n // search in functions and constants\n if (hasOwnProperty(mathWithTransform, prop) && search === mathWithTransform[prop]) {\n searchName = prop;\n break;\n }\n }\n\n /* TODO: implement help for data types\n if (!text) {\n // search data type\n for (prop in math.type) {\n if (hasOwnProperty(math, prop)) {\n if (search === math.type[prop]) {\n text = prop\n break\n }\n }\n }\n }\n */\n }\n\n var doc = getSafeProperty(embeddedDocs, searchName);\n if (!doc) {\n var searchText = typeof searchName === 'function' ? searchName.name : searchName;\n throw new Error('No documentation found on \"' + searchText + '\"');\n }\n return new Help(doc);\n }\n });\n});","import { factory } from '../../../utils/factory.js';\nvar name = 'chain';\nvar dependencies = ['typed', 'Chain'];\nexport var createChain = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n Chain\n } = _ref;\n /**\n * Wrap any value in a chain, allowing to perform chained operations on\n * the value.\n *\n * All methods available in the math.js library can be called upon the chain,\n * and then will be evaluated with the value itself as first argument.\n * The chain can be closed by executing `chain.done()`, which returns\n * the final value.\n *\n * The chain has a number of special functions:\n *\n * - `done()` Finalize the chain and return the chain's value.\n * - `valueOf()` The same as `done()`\n * - `toString()` Executes `math.format()` onto the chain's value, returning\n * a string representation of the value.\n *\n * Syntax:\n *\n * math.chain(value)\n *\n * Examples:\n *\n * math.chain(3)\n * .add(4)\n * .subtract(2)\n * .done() // 5\n *\n * math.chain( [[1, 2], [3, 4]] )\n * .subset(math.index(0, 0), 8)\n * .multiply(3)\n * .done() // [[24, 6], [9, 12]]\n *\n * @param {*} [value] A value of any type on which to start a chained operation.\n * @return {math.Chain} The created chain\n */\n return typed(name, {\n '': function _() {\n return new Chain();\n },\n any: function any(value) {\n return new Chain(value);\n }\n });\n});","import { isMatrix } from '../../utils/is.js';\nimport { clone } from '../../utils/object.js';\nimport { format } from '../../utils/string.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'det';\nvar dependencies = ['typed', 'matrix', 'subtract', 'multiply', 'divideScalar', 'isZero', 'unaryMinus'];\nexport var createDet = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n matrix,\n subtract,\n multiply,\n divideScalar,\n isZero,\n unaryMinus\n } = _ref;\n /**\n * Calculate the determinant of a matrix.\n *\n * Syntax:\n *\n * math.det(x)\n *\n * Examples:\n *\n * math.det([[1, 2], [3, 4]]) // returns -2\n *\n * const A = [\n * [-2, 2, 3],\n * [-1, 1, 3],\n * [2, 0, -1]\n * ]\n * math.det(A) // returns 6\n *\n * See also:\n *\n * inv\n *\n * @param {Array | Matrix} x A matrix\n * @return {number} The determinant of `x`\n */\n return typed(name, {\n any: function any(x) {\n return clone(x);\n },\n 'Array | Matrix': function det(x) {\n var size;\n if (isMatrix(x)) {\n size = x.size();\n } else if (Array.isArray(x)) {\n x = matrix(x);\n size = x.size();\n } else {\n // a scalar\n size = [];\n }\n switch (size.length) {\n case 0:\n // scalar\n return clone(x);\n case 1:\n // vector\n if (size[0] === 1) {\n return clone(x.valueOf()[0]);\n }\n if (size[0] === 0) {\n return 1; // det of an empty matrix is per definition 1\n } else {\n throw new RangeError('Matrix must be square ' + '(size: ' + format(size) + ')');\n }\n case 2:\n {\n // two-dimensional array\n var rows = size[0];\n var cols = size[1];\n if (rows === cols) {\n return _det(x.clone().valueOf(), rows, cols);\n }\n if (cols === 0) {\n return 1; // det of an empty matrix is per definition 1\n } else {\n throw new RangeError('Matrix must be square ' + '(size: ' + format(size) + ')');\n }\n }\n default:\n // multi dimensional array\n throw new RangeError('Matrix must be two dimensional ' + '(size: ' + format(size) + ')');\n }\n }\n });\n\n /**\n * Calculate the determinant of a matrix\n * @param {Array[]} matrix A square, two dimensional matrix\n * @param {number} rows Number of rows of the matrix (zero-based)\n * @param {number} cols Number of columns of the matrix (zero-based)\n * @returns {number} det\n * @private\n */\n function _det(matrix, rows, cols) {\n if (rows === 1) {\n // this is a 1 x 1 matrix\n return clone(matrix[0][0]);\n } else if (rows === 2) {\n // this is a 2 x 2 matrix\n // the determinant of [a11,a12;a21,a22] is det = a11*a22-a21*a12\n return subtract(multiply(matrix[0][0], matrix[1][1]), multiply(matrix[1][0], matrix[0][1]));\n } else {\n // Bareiss algorithm\n // this algorithm have same complexity as LUP decomposition (O(n^3))\n // but it preserve precision of floating point more relative to the LUP decomposition\n var negated = false;\n var rowIndices = new Array(rows).fill(0).map((_, i) => i); // matrix index of row i\n for (var k = 0; k < rows; k++) {\n var k_ = rowIndices[k];\n if (isZero(matrix[k_][k])) {\n var _k = void 0;\n for (_k = k + 1; _k < rows; _k++) {\n if (!isZero(matrix[rowIndices[_k]][k])) {\n k_ = rowIndices[_k];\n rowIndices[_k] = rowIndices[k];\n rowIndices[k] = k_;\n negated = !negated;\n break;\n }\n }\n if (_k === rows) return matrix[k_][k]; // some zero of the type\n }\n\n var piv = matrix[k_][k];\n var piv_ = k === 0 ? 1 : matrix[rowIndices[k - 1]][k - 1];\n for (var i = k + 1; i < rows; i++) {\n var i_ = rowIndices[i];\n for (var j = k + 1; j < rows; j++) {\n matrix[i_][j] = divideScalar(subtract(multiply(matrix[i_][j], piv), multiply(matrix[i_][k], matrix[k_][j])), piv_);\n }\n }\n }\n var det = matrix[rowIndices[rows - 1]][rows - 1];\n return negated ? unaryMinus(det) : det;\n }\n }\n});","import { isMatrix } from '../../utils/is.js';\nimport { arraySize } from '../../utils/array.js';\nimport { factory } from '../../utils/factory.js';\nimport { format } from '../../utils/string.js';\nvar name = 'inv';\nvar dependencies = ['typed', 'matrix', 'divideScalar', 'addScalar', 'multiply', 'unaryMinus', 'det', 'identity', 'abs'];\nexport var createInv = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n matrix,\n divideScalar,\n addScalar,\n multiply,\n unaryMinus,\n det,\n identity,\n abs\n } = _ref;\n /**\n * Calculate the inverse of a square matrix.\n *\n * Syntax:\n *\n * math.inv(x)\n *\n * Examples:\n *\n * math.inv([[1, 2], [3, 4]]) // returns [[-2, 1], [1.5, -0.5]]\n * math.inv(4) // returns 0.25\n * 1 / 4 // returns 0.25\n *\n * See also:\n *\n * det, transpose\n *\n * @param {number | Complex | Array | Matrix} x Matrix to be inversed\n * @return {number | Complex | Array | Matrix} The inverse of `x`.\n */\n return typed(name, {\n 'Array | Matrix': function ArrayMatrix(x) {\n var size = isMatrix(x) ? x.size() : arraySize(x);\n switch (size.length) {\n case 1:\n // vector\n if (size[0] === 1) {\n if (isMatrix(x)) {\n return matrix([divideScalar(1, x.valueOf()[0])]);\n } else {\n return [divideScalar(1, x[0])];\n }\n } else {\n throw new RangeError('Matrix must be square ' + '(size: ' + format(size) + ')');\n }\n case 2:\n // two dimensional array\n {\n var rows = size[0];\n var cols = size[1];\n if (rows === cols) {\n if (isMatrix(x)) {\n return matrix(_inv(x.valueOf(), rows, cols), x.storage());\n } else {\n // return an Array\n return _inv(x, rows, cols);\n }\n } else {\n throw new RangeError('Matrix must be square ' + '(size: ' + format(size) + ')');\n }\n }\n default:\n // multi dimensional array\n throw new RangeError('Matrix must be two dimensional ' + '(size: ' + format(size) + ')');\n }\n },\n any: function any(x) {\n // scalar\n return divideScalar(1, x); // FIXME: create a BigNumber one when configured for bignumbers\n }\n });\n\n /**\n * Calculate the inverse of a square matrix\n * @param {Array[]} mat A square matrix\n * @param {number} rows Number of rows\n * @param {number} cols Number of columns, must equal rows\n * @return {Array[]} inv Inverse matrix\n * @private\n */\n function _inv(mat, rows, cols) {\n var r, s, f, value, temp;\n if (rows === 1) {\n // this is a 1 x 1 matrix\n value = mat[0][0];\n if (value === 0) {\n throw Error('Cannot calculate inverse, determinant is zero');\n }\n return [[divideScalar(1, value)]];\n } else if (rows === 2) {\n // this is a 2 x 2 matrix\n var d = det(mat);\n if (d === 0) {\n throw Error('Cannot calculate inverse, determinant is zero');\n }\n return [[divideScalar(mat[1][1], d), divideScalar(unaryMinus(mat[0][1]), d)], [divideScalar(unaryMinus(mat[1][0]), d), divideScalar(mat[0][0], d)]];\n } else {\n // this is a matrix of 3 x 3 or larger\n // calculate inverse using gauss-jordan elimination\n // https://en.wikipedia.org/wiki/Gaussian_elimination\n // http://mathworld.wolfram.com/MatrixInverse.html\n // http://math.uww.edu/~mcfarlat/inverse.htm\n\n // make a copy of the matrix (only the arrays, not of the elements)\n var A = mat.concat();\n for (r = 0; r < rows; r++) {\n A[r] = A[r].concat();\n }\n\n // create an identity matrix which in the end will contain the\n // matrix inverse\n var B = identity(rows).valueOf();\n\n // loop over all columns, and perform row reductions\n for (var c = 0; c < cols; c++) {\n // Pivoting: Swap row c with row r, where row r contains the largest element A[r][c]\n var ABig = abs(A[c][c]);\n var rBig = c;\n r = c + 1;\n while (r < rows) {\n if (abs(A[r][c]) > ABig) {\n ABig = abs(A[r][c]);\n rBig = r;\n }\n r++;\n }\n if (ABig === 0) {\n throw Error('Cannot calculate inverse, determinant is zero');\n }\n r = rBig;\n if (r !== c) {\n temp = A[c];\n A[c] = A[r];\n A[r] = temp;\n temp = B[c];\n B[c] = B[r];\n B[r] = temp;\n }\n\n // eliminate non-zero values on the other rows at column c\n var Ac = A[c];\n var Bc = B[c];\n for (r = 0; r < rows; r++) {\n var Ar = A[r];\n var Br = B[r];\n if (r !== c) {\n // eliminate value at column c and row r\n if (Ar[c] !== 0) {\n f = divideScalar(unaryMinus(Ar[c]), Ac[c]);\n\n // add (f * row c) to row r to eliminate the value\n // at column c\n for (s = c; s < cols; s++) {\n Ar[s] = addScalar(Ar[s], multiply(f, Ac[s]));\n }\n for (s = 0; s < cols; s++) {\n Br[s] = addScalar(Br[s], multiply(f, Bc[s]));\n }\n }\n } else {\n // normalize value at Acc to 1,\n // divide each value on row r with the value at Acc\n f = Ac[c];\n for (s = c; s < cols; s++) {\n Ar[s] = divideScalar(Ar[s], f);\n }\n for (s = 0; s < cols; s++) {\n Br[s] = divideScalar(Br[s], f);\n }\n }\n }\n }\n return B;\n }\n }\n});","import { isMatrix } from '../../utils/is.js';\nimport { arraySize } from '../../utils/array.js';\nimport { factory } from '../../utils/factory.js';\nimport { format } from '../../utils/string.js';\nimport { clone } from '../../utils/object.js';\nvar name = 'pinv';\nvar dependencies = ['typed', 'matrix', 'inv', 'deepEqual', 'equal', 'dotDivide', 'dot', 'ctranspose', 'divideScalar', 'multiply', 'add', 'Complex'];\nexport var createPinv = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n matrix,\n inv,\n deepEqual,\n equal,\n dotDivide,\n dot,\n ctranspose,\n divideScalar,\n multiply,\n add,\n Complex\n } = _ref;\n /**\n * Calculate the Moore–Penrose inverse of a matrix.\n *\n * Syntax:\n *\n * math.pinv(x)\n *\n * Examples:\n *\n * math.pinv([[1, 2], [3, 4]]) // returns [[-2, 1], [1.5, -0.5]]\n * math.pinv([[1, 0], [0, 1], [0, 1]]) // returns [[1, 0, 0], [0, 0.5, 0.5]]\n * math.pinv(4) // returns 0.25\n *\n * See also:\n *\n * inv\n *\n * @param {number | Complex | Array | Matrix} x Matrix to be inversed\n * @return {number | Complex | Array | Matrix} The inverse of `x`.\n */\n return typed(name, {\n 'Array | Matrix': function ArrayMatrix(x) {\n var size = isMatrix(x) ? x.size() : arraySize(x);\n switch (size.length) {\n case 1:\n // vector\n if (_isZeros(x)) return ctranspose(x); // null vector\n if (size[0] === 1) {\n return inv(x); // invertible matrix\n } else {\n return dotDivide(ctranspose(x), dot(x, x));\n }\n case 2:\n // two dimensional array\n {\n if (_isZeros(x)) return ctranspose(x); // zero matrixx\n var rows = size[0];\n var cols = size[1];\n if (rows === cols) {\n try {\n return inv(x); // invertible matrix\n } catch (err) {\n if (err instanceof Error && err.message.match(/Cannot calculate inverse, determinant is zero/)) {\n // Expected\n } else {\n throw err;\n }\n }\n }\n if (isMatrix(x)) {\n return matrix(_pinv(x.valueOf(), rows, cols), x.storage());\n } else {\n // return an Array\n return _pinv(x, rows, cols);\n }\n }\n default:\n // multi dimensional array\n throw new RangeError('Matrix must be two dimensional ' + '(size: ' + format(size) + ')');\n }\n },\n any: function any(x) {\n // scalar\n if (equal(x, 0)) return clone(x); // zero\n return divideScalar(1, x);\n }\n });\n\n /**\n * Calculate the Moore–Penrose inverse of a matrix\n * @param {Array[]} mat A matrix\n * @param {number} rows Number of rows\n * @param {number} cols Number of columns\n * @return {Array[]} pinv Pseudoinverse matrix\n * @private\n */\n function _pinv(mat, rows, cols) {\n var {\n C,\n F\n } = _rankFact(mat, rows, cols); // TODO: Use SVD instead (may improve precision)\n var Cpinv = multiply(inv(multiply(ctranspose(C), C)), ctranspose(C));\n var Fpinv = multiply(ctranspose(F), inv(multiply(F, ctranspose(F))));\n return multiply(Fpinv, Cpinv);\n }\n\n /**\n * Calculate the reduced row echelon form of a matrix\n *\n * Modified from https://rosettacode.org/wiki/Reduced_row_echelon_form\n *\n * @param {Array[]} mat A matrix\n * @param {number} rows Number of rows\n * @param {number} cols Number of columns\n * @return {Array[]} Reduced row echelon form\n * @private\n */\n function _rref(mat, rows, cols) {\n var M = clone(mat);\n var lead = 0;\n for (var r = 0; r < rows; r++) {\n if (cols <= lead) {\n return M;\n }\n var i = r;\n while (_isZero(M[i][lead])) {\n i++;\n if (rows === i) {\n i = r;\n lead++;\n if (cols === lead) {\n return M;\n }\n }\n }\n [M[i], M[r]] = [M[r], M[i]];\n var val = M[r][lead];\n for (var j = 0; j < cols; j++) {\n M[r][j] = dotDivide(M[r][j], val);\n }\n for (var _i = 0; _i < rows; _i++) {\n if (_i === r) continue;\n val = M[_i][lead];\n for (var _j = 0; _j < cols; _j++) {\n M[_i][_j] = add(M[_i][_j], multiply(-1, multiply(val, M[r][_j])));\n }\n }\n lead++;\n }\n return M;\n }\n\n /**\n * Calculate the rank factorization of a matrix\n *\n * @param {Array[]} mat A matrix (M)\n * @param {number} rows Number of rows\n * @param {number} cols Number of columns\n * @return {{C: Array, F: Array}} rank factorization where M = C F\n * @private\n */\n function _rankFact(mat, rows, cols) {\n var rref = _rref(mat, rows, cols);\n var C = mat.map((_, i) => _.filter((_, j) => j < rows && !_isZero(dot(rref[j], rref[j]))));\n var F = rref.filter((_, i) => !_isZero(dot(rref[i], rref[i])));\n return {\n C,\n F\n };\n }\n function _isZero(x) {\n return equal(add(x, Complex(1, 1)), add(0, Complex(1, 1)));\n }\n function _isZeros(arr) {\n return deepEqual(add(arr, Complex(1, 1)), add(multiply(arr, 0), Complex(1, 1)));\n }\n});","import { clone } from '../../../utils/object.js';\nexport function createComplexEigs(_ref) {\n var {\n addScalar,\n subtract,\n flatten,\n multiply,\n multiplyScalar,\n divideScalar,\n sqrt,\n abs,\n bignumber,\n diag,\n inv,\n qr,\n usolve,\n usolveAll,\n equal,\n complex,\n larger,\n smaller,\n matrixFromColumns,\n dot\n } = _ref;\n /**\n * @param {number[][]} arr the matrix to find eigenvalues of\n * @param {number} N size of the matrix\n * @param {number|BigNumber} prec precision, anything lower will be considered zero\n * @param {'number'|'BigNumber'|'Complex'} type\n * @param {boolean} findVectors should we find eigenvectors?\n *\n * @returns {{ values: number[], vectors: number[][] }}\n */\n function complexEigs(arr, N, prec, type, findVectors) {\n if (findVectors === undefined) {\n findVectors = true;\n }\n\n // TODO check if any row/col are zero except the diagonal\n\n // make sure corresponding rows and columns have similar magnitude\n // important because of numerical stability\n // MODIFIES arr by side effect!\n var R = balance(arr, N, prec, type, findVectors);\n\n // R is the row transformation matrix\n // arr = A' = R A R⁻¹, A is the original matrix\n // (if findVectors is false, R is undefined)\n // (And so to return to original matrix: A = R⁻¹ arr R)\n\n // TODO if magnitudes of elements vary over many orders,\n // move greatest elements to the top left corner\n\n // using similarity transformations, reduce the matrix\n // to Hessenberg form (upper triangular plus one subdiagonal row)\n // updates the transformation matrix R with new row operationsq\n // MODIFIES arr by side effect!\n reduceToHessenberg(arr, N, prec, type, findVectors, R);\n // still true that original A = R⁻¹ arr R)\n\n // find eigenvalues\n var {\n values,\n C\n } = iterateUntilTriangular(arr, N, prec, type, findVectors);\n\n // values is the list of eigenvalues, C is the column\n // transformation matrix that transforms arr, the hessenberg\n // matrix, to upper triangular\n // (So U = C⁻¹ arr C and the relationship between current arr\n // and original A is unchanged.)\n\n var vectors;\n if (findVectors) {\n vectors = findEigenvectors(arr, N, C, R, values, prec, type);\n vectors = matrixFromColumns(...vectors);\n }\n return {\n values,\n vectors\n };\n }\n\n /**\n * @param {number[][]} arr\n * @param {number} N\n * @param {number} prec\n * @param {'number'|'BigNumber'|'Complex'} type\n * @returns {number[][]}\n */\n function balance(arr, N, prec, type, findVectors) {\n var big = type === 'BigNumber';\n var cplx = type === 'Complex';\n var realzero = big ? bignumber(0) : 0;\n var one = big ? bignumber(1) : cplx ? complex(1) : 1;\n var realone = big ? bignumber(1) : 1;\n\n // base of the floating-point arithmetic\n var radix = big ? bignumber(10) : 2;\n var radixSq = multiplyScalar(radix, radix);\n\n // the diagonal transformation matrix R\n var Rdiag;\n if (findVectors) {\n Rdiag = Array(N).fill(one);\n }\n\n // this isn't the only time we loop thru the matrix...\n var last = false;\n while (!last) {\n // ...haha I'm joking! unless...\n last = true;\n for (var i = 0; i < N; i++) {\n // compute the taxicab norm of i-th column and row\n // TODO optimize for complex numbers\n var colNorm = realzero;\n var rowNorm = realzero;\n for (var j = 0; j < N; j++) {\n if (i === j) continue;\n var c = abs(arr[i][j]); // should be real\n colNorm = addScalar(colNorm, c);\n rowNorm = addScalar(rowNorm, c);\n }\n if (!equal(colNorm, 0) && !equal(rowNorm, 0)) {\n // find integer power closest to balancing the matrix\n // (we want to scale only by integer powers of radix,\n // so that we don't lose any precision due to round-off)\n\n var f = realone;\n var _c = colNorm;\n var rowDivRadix = divideScalar(rowNorm, radix);\n var rowMulRadix = multiplyScalar(rowNorm, radix);\n while (smaller(_c, rowDivRadix)) {\n _c = multiplyScalar(_c, radixSq);\n f = multiplyScalar(f, radix);\n }\n while (larger(_c, rowMulRadix)) {\n _c = divideScalar(_c, radixSq);\n f = divideScalar(f, radix);\n }\n\n // check whether balancing is needed\n // condition = (c + rowNorm) / f < 0.95 * (colNorm + rowNorm)\n var condition = smaller(divideScalar(addScalar(_c, rowNorm), f), multiplyScalar(addScalar(colNorm, rowNorm), 0.95));\n\n // apply balancing similarity transformation\n if (condition) {\n // we should loop once again to check whether\n // another rebalancing is needed\n last = false;\n var g = divideScalar(1, f);\n for (var _j = 0; _j < N; _j++) {\n if (i === _j) {\n continue;\n }\n arr[i][_j] = multiplyScalar(arr[i][_j], f);\n arr[_j][i] = multiplyScalar(arr[_j][i], g);\n }\n\n // keep track of transformations\n if (findVectors) {\n Rdiag[i] = multiplyScalar(Rdiag[i], f);\n }\n }\n }\n }\n }\n\n // return the diagonal row transformation matrix\n return diag(Rdiag);\n }\n\n /**\n * @param {number[][]} arr\n * @param {number} N\n * @param {number} prec\n * @param {'number'|'BigNumber'|'Complex'} type\n * @param {boolean} findVectors\n * @param {number[][]} R the row transformation matrix that will be modified\n */\n function reduceToHessenberg(arr, N, prec, type, findVectors, R) {\n var big = type === 'BigNumber';\n var cplx = type === 'Complex';\n var zero = big ? bignumber(0) : cplx ? complex(0) : 0;\n if (big) {\n prec = bignumber(prec);\n }\n for (var i = 0; i < N - 2; i++) {\n // Find the largest subdiag element in the i-th col\n\n var maxIndex = 0;\n var max = zero;\n for (var j = i + 1; j < N; j++) {\n var el = arr[j][i];\n if (smaller(abs(max), abs(el))) {\n max = el;\n maxIndex = j;\n }\n }\n\n // This col is pivoted, no need to do anything\n if (smaller(abs(max), prec)) {\n continue;\n }\n if (maxIndex !== i + 1) {\n // Interchange maxIndex-th and (i+1)-th row\n var tmp1 = arr[maxIndex];\n arr[maxIndex] = arr[i + 1];\n arr[i + 1] = tmp1;\n\n // Interchange maxIndex-th and (i+1)-th column\n for (var _j2 = 0; _j2 < N; _j2++) {\n var tmp2 = arr[_j2][maxIndex];\n arr[_j2][maxIndex] = arr[_j2][i + 1];\n arr[_j2][i + 1] = tmp2;\n }\n\n // keep track of transformations\n if (findVectors) {\n var tmp3 = R[maxIndex];\n R[maxIndex] = R[i + 1];\n R[i + 1] = tmp3;\n }\n }\n\n // Reduce following rows and columns\n for (var _j3 = i + 2; _j3 < N; _j3++) {\n var n = divideScalar(arr[_j3][i], max);\n if (n === 0) {\n continue;\n }\n\n // from j-th row subtract n-times (i+1)th row\n for (var k = 0; k < N; k++) {\n arr[_j3][k] = subtract(arr[_j3][k], multiplyScalar(n, arr[i + 1][k]));\n }\n\n // to (i+1)th column add n-times j-th column\n for (var _k = 0; _k < N; _k++) {\n arr[_k][i + 1] = addScalar(arr[_k][i + 1], multiplyScalar(n, arr[_k][_j3]));\n }\n\n // keep track of transformations\n if (findVectors) {\n for (var _k2 = 0; _k2 < N; _k2++) {\n R[_j3][_k2] = subtract(R[_j3][_k2], multiplyScalar(n, R[i + 1][_k2]));\n }\n }\n }\n }\n return R;\n }\n\n /**\n * @returns {{values: values, C: Matrix}}\n * @see Press, Wiliams: Numerical recipes in Fortran 77\n * @see https://en.wikipedia.org/wiki/QR_algorithm\n */\n function iterateUntilTriangular(A, N, prec, type, findVectors) {\n var big = type === 'BigNumber';\n var cplx = type === 'Complex';\n var one = big ? bignumber(1) : cplx ? complex(1) : 1;\n if (big) {\n prec = bignumber(prec);\n }\n\n // The Francis Algorithm\n // The core idea of this algorithm is that doing successive\n // A' = Q⁺AQ transformations will eventually converge to block-\n // upper-triangular with diagonal blocks either 1x1 or 2x2.\n // The Q here is the one from the QR decomposition, A = QR.\n // Since the eigenvalues of a block-upper-triangular matrix are\n // the eigenvalues of its diagonal blocks and we know how to find\n // eigenvalues of a 2x2 matrix, we know the eigenvalues of A.\n\n var arr = clone(A);\n\n // the list of converged eigenvalues\n var lambdas = [];\n\n // size of arr, which will get smaller as eigenvalues converge\n var n = N;\n\n // the diagonal of the block-diagonal matrix that turns\n // converged 2x2 matrices into upper triangular matrices\n var Sdiag = [];\n\n // N×N matrix describing the overall transformation done during the QR algorithm\n var Qtotal = findVectors ? diag(Array(N).fill(one)) : undefined;\n\n // n×n matrix describing the QR transformations done since last convergence\n var Qpartial = findVectors ? diag(Array(n).fill(one)) : undefined;\n\n // last eigenvalue converged before this many steps\n var lastConvergenceBefore = 0;\n while (lastConvergenceBefore <= 100) {\n lastConvergenceBefore += 1;\n\n // TODO if the convergence is slow, do something clever\n\n // Perform the factorization\n\n var k = 0; // TODO set close to an eigenvalue\n\n for (var i = 0; i < n; i++) {\n arr[i][i] = subtract(arr[i][i], k);\n }\n\n // TODO do an implicit QR transformation\n var {\n Q,\n R\n } = qr(arr);\n arr = multiply(R, Q);\n for (var _i = 0; _i < n; _i++) {\n arr[_i][_i] = addScalar(arr[_i][_i], k);\n }\n\n // keep track of transformations\n if (findVectors) {\n Qpartial = multiply(Qpartial, Q);\n }\n\n // The rightmost diagonal element converged to an eigenvalue\n if (n === 1 || smaller(abs(arr[n - 1][n - 2]), prec)) {\n lastConvergenceBefore = 0;\n lambdas.push(arr[n - 1][n - 1]);\n\n // keep track of transformations\n if (findVectors) {\n Sdiag.unshift([[1]]);\n inflateMatrix(Qpartial, N);\n Qtotal = multiply(Qtotal, Qpartial);\n if (n > 1) {\n Qpartial = diag(Array(n - 1).fill(one));\n }\n }\n\n // reduce the matrix size\n n -= 1;\n arr.pop();\n for (var _i2 = 0; _i2 < n; _i2++) {\n arr[_i2].pop();\n }\n\n // The rightmost diagonal 2x2 block converged\n } else if (n === 2 || smaller(abs(arr[n - 2][n - 3]), prec)) {\n lastConvergenceBefore = 0;\n var ll = eigenvalues2x2(arr[n - 2][n - 2], arr[n - 2][n - 1], arr[n - 1][n - 2], arr[n - 1][n - 1]);\n lambdas.push(...ll);\n\n // keep track of transformations\n if (findVectors) {\n Sdiag.unshift(jordanBase2x2(arr[n - 2][n - 2], arr[n - 2][n - 1], arr[n - 1][n - 2], arr[n - 1][n - 1], ll[0], ll[1], prec, type));\n inflateMatrix(Qpartial, N);\n Qtotal = multiply(Qtotal, Qpartial);\n if (n > 2) {\n Qpartial = diag(Array(n - 2).fill(one));\n }\n }\n\n // reduce the matrix size\n n -= 2;\n arr.pop();\n arr.pop();\n for (var _i3 = 0; _i3 < n; _i3++) {\n arr[_i3].pop();\n arr[_i3].pop();\n }\n }\n if (n === 0) {\n break;\n }\n }\n\n // standard sorting\n lambdas.sort((a, b) => +subtract(abs(a), abs(b)));\n\n // the algorithm didn't converge\n if (lastConvergenceBefore > 100) {\n var err = Error('The eigenvalues failed to converge. Only found these eigenvalues: ' + lambdas.join(', '));\n err.values = lambdas;\n err.vectors = [];\n throw err;\n }\n\n // combine the overall QR transformation Qtotal with the subsequent\n // transformation S that turns the diagonal 2x2 blocks to upper triangular\n var C = findVectors ? multiply(Qtotal, blockDiag(Sdiag, N)) : undefined;\n return {\n values: lambdas,\n C\n };\n }\n\n /**\n * @param {Matrix} A hessenberg-form matrix\n * @param {number} N size of A\n * @param {Matrix} C column transformation matrix that turns A into upper triangular\n * @param {Matrix} R similarity that turns original matrix into A\n * @param {number[]} values array of eigenvalues of A\n * @param {'number'|'BigNumber'|'Complex'} type\n * @returns {number[][]} eigenvalues\n */\n function findEigenvectors(A, N, C, R, values, prec, type) {\n var Cinv = inv(C);\n var U = multiply(Cinv, A, C);\n var big = type === 'BigNumber';\n var cplx = type === 'Complex';\n var zero = big ? bignumber(0) : cplx ? complex(0) : 0;\n var one = big ? bignumber(1) : cplx ? complex(1) : 1;\n\n // turn values into a kind of \"multiset\"\n // this way it is easier to find eigenvectors\n var uniqueValues = [];\n var multiplicities = [];\n for (var λ of values) {\n var i = indexOf(uniqueValues, λ, equal);\n if (i === -1) {\n uniqueValues.push(λ);\n multiplicities.push(1);\n } else {\n multiplicities[i] += 1;\n }\n }\n\n // find eigenvectors by solving U − λE = 0\n // TODO replace with an iterative eigenvector algorithm\n // (this one might fail for imprecise eigenvalues)\n\n var vectors = [];\n var len = uniqueValues.length;\n var b = Array(N).fill(zero);\n var E = diag(Array(N).fill(one));\n\n // eigenvalues for which usolve failed (due to numerical error)\n var failedLambdas = [];\n var _loop = function _loop() {\n var λ = uniqueValues[_i4];\n var S = subtract(U, multiply(λ, E)); // the characteristic matrix\n\n var solutions = usolveAll(S, b);\n solutions.shift(); // ignore the null vector\n\n // looks like we missed something, try inverse iteration\n while (solutions.length < multiplicities[_i4]) {\n var approxVec = inverseIterate(S, N, solutions, prec, type);\n if (approxVec == null) {\n // no more vectors were found\n failedLambdas.push(λ);\n break;\n }\n solutions.push(approxVec);\n }\n\n // Transform back into original array coordinates\n var correction = multiply(inv(R), C);\n solutions = solutions.map(v => multiply(correction, v));\n vectors.push(...solutions.map(v => flatten(v)));\n };\n for (var _i4 = 0; _i4 < len; _i4++) {\n _loop();\n }\n if (failedLambdas.length !== 0) {\n var err = new Error('Failed to find eigenvectors for the following eigenvalues: ' + failedLambdas.join(', '));\n err.values = values;\n err.vectors = vectors;\n throw err;\n }\n return vectors;\n }\n\n /**\n * Compute the eigenvalues of an 2x2 matrix\n * @return {[number,number]}\n */\n function eigenvalues2x2(a, b, c, d) {\n // λ± = ½ trA ± ½ √( tr²A - 4 detA )\n var trA = addScalar(a, d);\n var detA = subtract(multiplyScalar(a, d), multiplyScalar(b, c));\n var x = multiplyScalar(trA, 0.5);\n var y = multiplyScalar(sqrt(subtract(multiplyScalar(trA, trA), multiplyScalar(4, detA))), 0.5);\n return [addScalar(x, y), subtract(x, y)];\n }\n\n /**\n * For an 2x2 matrix compute the transformation matrix S,\n * so that SAS⁻¹ is an upper triangular matrix\n * @return {[[number,number],[number,number]]}\n * @see https://math.berkeley.edu/~ogus/old/Math_54-05/webfoils/jordan.pdf\n * @see http://people.math.harvard.edu/~knill/teaching/math21b2004/exhibits/2dmatrices/index.html\n */\n function jordanBase2x2(a, b, c, d, l1, l2, prec, type) {\n var big = type === 'BigNumber';\n var cplx = type === 'Complex';\n var zero = big ? bignumber(0) : cplx ? complex(0) : 0;\n var one = big ? bignumber(1) : cplx ? complex(1) : 1;\n\n // matrix is already upper triangular\n // return an identity matrix\n if (smaller(abs(c), prec)) {\n return [[one, zero], [zero, one]];\n }\n\n // matrix is diagonalizable\n // return its eigenvectors as columns\n if (larger(abs(subtract(l1, l2)), prec)) {\n return [[subtract(l1, d), subtract(l2, d)], [c, c]];\n }\n\n // matrix is not diagonalizable\n // compute off-diagonal elements of N = A - λI\n // N₁₂ = 0 ⇒ S = ( N⃗₁, I⃗₁ )\n // N₁₂ ≠ 0 ⇒ S = ( N⃗₂, I⃗₂ )\n\n var na = subtract(a, l1);\n var nb = subtract(b, l1);\n var nc = subtract(c, l1);\n var nd = subtract(d, l1);\n if (smaller(abs(nb), prec)) {\n return [[na, one], [nc, zero]];\n } else {\n return [[nb, zero], [nd, one]];\n }\n }\n\n /**\n * Enlarge the matrix from n×n to N×N, setting the new\n * elements to 1 on diagonal and 0 elsewhere\n */\n function inflateMatrix(arr, N) {\n // add columns\n for (var i = 0; i < arr.length; i++) {\n arr[i].push(...Array(N - arr[i].length).fill(0));\n }\n\n // add rows\n for (var _i5 = arr.length; _i5 < N; _i5++) {\n arr.push(Array(N).fill(0));\n arr[_i5][_i5] = 1;\n }\n return arr;\n }\n\n /**\n * Create a block-diagonal matrix with the given square matrices on the diagonal\n * @param {Matrix[] | number[][][]} arr array of matrices to be placed on the diagonal\n * @param {number} N the size of the resulting matrix\n */\n function blockDiag(arr, N) {\n var M = [];\n for (var i = 0; i < N; i++) {\n M[i] = Array(N).fill(0);\n }\n var I = 0;\n for (var sub of arr) {\n var n = sub.length;\n for (var _i6 = 0; _i6 < n; _i6++) {\n for (var j = 0; j < n; j++) {\n M[I + _i6][I + j] = sub[_i6][j];\n }\n }\n I += n;\n }\n return M;\n }\n\n /**\n * Finds the index of an element in an array using a custom equality function\n * @template T\n * @param {Array} arr array in which to search\n * @param {T} el the element to find\n * @param {function(T, T): boolean} fn the equality function, first argument is an element of `arr`, the second is always `el`\n * @returns {number} the index of `el`, or -1 when it's not in `arr`\n */\n function indexOf(arr, el, fn) {\n for (var i = 0; i < arr.length; i++) {\n if (fn(arr[i], el)) {\n return i;\n }\n }\n return -1;\n }\n\n /**\n * Provided a near-singular upper-triangular matrix A and a list of vectors,\n * finds an eigenvector of A with the smallest eigenvalue, which is orthogonal\n * to each vector in the list\n * @template T\n * @param {T[][]} A near-singular square matrix\n * @param {number} N dimension\n * @param {T[][]} orthog list of vectors\n * @param {number} prec epsilon\n * @param {'number'|'BigNumber'|'Complex'} type\n * @return {T[] | null} eigenvector\n *\n * @see Numerical Recipes for Fortran 77 – 11.7 Eigenvalues or Eigenvectors by Inverse Iteration\n */\n function inverseIterate(A, N, orthog, prec, type) {\n var largeNum = type === 'BigNumber' ? bignumber(1000) : 1000;\n var b; // the vector\n\n // you better choose a random vector before I count to five\n var i = 0;\n while (true) {\n b = randomOrthogonalVector(N, orthog, type);\n b = usolve(A, b);\n if (larger(norm(b), largeNum)) {\n break;\n }\n if (++i >= 5) {\n return null;\n }\n }\n\n // you better converge before I count to ten\n i = 0;\n while (true) {\n var c = usolve(A, b);\n if (smaller(norm(orthogonalComplement(b, [c])), prec)) {\n break;\n }\n if (++i >= 10) {\n return null;\n }\n b = normalize(c);\n }\n return b;\n }\n\n /**\n * Generates a random unit vector of dimension N, orthogonal to each vector in the list\n * @template T\n * @param {number} N dimension\n * @param {T[][]} orthog list of vectors\n * @param {'number'|'BigNumber'|'Complex'} type\n * @returns {T[]} random vector\n */\n function randomOrthogonalVector(N, orthog, type) {\n var big = type === 'BigNumber';\n var cplx = type === 'Complex';\n\n // generate random vector with the correct type\n var v = Array(N).fill(0).map(_ => 2 * Math.random() - 1);\n if (big) {\n v = v.map(n => bignumber(n));\n }\n if (cplx) {\n v = v.map(n => complex(n));\n }\n\n // project to orthogonal complement\n v = orthogonalComplement(v, orthog);\n\n // normalize\n return normalize(v, type);\n }\n\n /**\n * Project vector v to the orthogonal complement of an array of vectors\n */\n function orthogonalComplement(v, orthog) {\n for (var w of orthog) {\n // v := v − (w, v)/∥w∥² w\n v = subtract(v, multiply(divideScalar(dot(w, v), dot(w, w)), w));\n }\n return v;\n }\n\n /**\n * Calculate the norm of a vector.\n * We can't use math.norm because factory can't handle circular dependency.\n * Seriously, I'm really fed up with factory.\n */\n function norm(v) {\n return abs(sqrt(dot(v, v)));\n }\n\n /**\n * Normalize a vector\n * @template T\n * @param {T[]} v\n * @param {'number'|'BigNumber'|'Complex'} type\n * @returns {T[]} normalized vec\n */\n function normalize(v, type) {\n var big = type === 'BigNumber';\n var cplx = type === 'Complex';\n var one = big ? bignumber(1) : cplx ? complex(1) : 1;\n return multiply(divideScalar(one, norm(v)), v);\n }\n return complexEigs;\n}","import { clone } from '../../../utils/object.js';\nexport function createRealSymmetric(_ref) {\n var {\n config,\n addScalar,\n subtract,\n abs,\n atan,\n cos,\n sin,\n multiplyScalar,\n inv,\n bignumber,\n multiply,\n add\n } = _ref;\n /**\n * @param {number[] | BigNumber[]} arr\n * @param {number} N\n * @param {number} prec\n * @param {'number' | 'BigNumber'} type\n */\n function main(arr, N) {\n var prec = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : config.epsilon;\n var type = arguments.length > 3 ? arguments[3] : undefined;\n if (type === 'number') {\n return diag(arr, prec);\n }\n if (type === 'BigNumber') {\n return diagBig(arr, prec);\n }\n throw TypeError('Unsupported data type: ' + type);\n }\n\n // diagonalization implementation for number (efficient)\n function diag(x, precision) {\n var N = x.length;\n var e0 = Math.abs(precision / N);\n var psi;\n var Sij = new Array(N);\n // Sij is Identity Matrix\n for (var i = 0; i < N; i++) {\n Sij[i] = createArray(N, 0);\n Sij[i][i] = 1.0;\n }\n // initial error\n var Vab = getAij(x);\n while (Math.abs(Vab[1]) >= Math.abs(e0)) {\n var _i = Vab[0][0];\n var j = Vab[0][1];\n psi = getTheta(x[_i][_i], x[j][j], x[_i][j]);\n x = x1(x, psi, _i, j);\n Sij = Sij1(Sij, psi, _i, j);\n Vab = getAij(x);\n }\n var Ei = createArray(N, 0); // eigenvalues\n for (var _i2 = 0; _i2 < N; _i2++) {\n Ei[_i2] = x[_i2][_i2];\n }\n return sorting(clone(Ei), clone(Sij));\n }\n\n // diagonalization implementation for bigNumber\n function diagBig(x, precision) {\n var N = x.length;\n var e0 = abs(precision / N);\n var psi;\n var Sij = new Array(N);\n // Sij is Identity Matrix\n for (var i = 0; i < N; i++) {\n Sij[i] = createArray(N, 0);\n Sij[i][i] = 1.0;\n }\n // initial error\n var Vab = getAijBig(x);\n while (abs(Vab[1]) >= abs(e0)) {\n var _i3 = Vab[0][0];\n var j = Vab[0][1];\n psi = getThetaBig(x[_i3][_i3], x[j][j], x[_i3][j]);\n x = x1Big(x, psi, _i3, j);\n Sij = Sij1Big(Sij, psi, _i3, j);\n Vab = getAijBig(x);\n }\n var Ei = createArray(N, 0); // eigenvalues\n for (var _i4 = 0; _i4 < N; _i4++) {\n Ei[_i4] = x[_i4][_i4];\n }\n // return [clone(Ei), clone(Sij)]\n return sorting(clone(Ei), clone(Sij));\n }\n\n // get angle\n function getTheta(aii, ajj, aij) {\n var denom = ajj - aii;\n if (Math.abs(denom) <= config.epsilon) {\n return Math.PI / 4.0;\n } else {\n return 0.5 * Math.atan(2.0 * aij / (ajj - aii));\n }\n }\n\n // get angle\n function getThetaBig(aii, ajj, aij) {\n var denom = subtract(ajj, aii);\n if (abs(denom) <= config.epsilon) {\n return bignumber(-1).acos().div(4);\n } else {\n return multiplyScalar(0.5, atan(multiply(2.0, aij, inv(denom))));\n }\n }\n\n // update eigvec\n function Sij1(Sij, theta, i, j) {\n var N = Sij.length;\n var c = Math.cos(theta);\n var s = Math.sin(theta);\n var Ski = createArray(N, 0);\n var Skj = createArray(N, 0);\n for (var k = 0; k < N; k++) {\n Ski[k] = c * Sij[k][i] - s * Sij[k][j];\n Skj[k] = s * Sij[k][i] + c * Sij[k][j];\n }\n for (var _k = 0; _k < N; _k++) {\n Sij[_k][i] = Ski[_k];\n Sij[_k][j] = Skj[_k];\n }\n return Sij;\n }\n // update eigvec for overlap\n function Sij1Big(Sij, theta, i, j) {\n var N = Sij.length;\n var c = cos(theta);\n var s = sin(theta);\n var Ski = createArray(N, bignumber(0));\n var Skj = createArray(N, bignumber(0));\n for (var k = 0; k < N; k++) {\n Ski[k] = subtract(multiplyScalar(c, Sij[k][i]), multiplyScalar(s, Sij[k][j]));\n Skj[k] = addScalar(multiplyScalar(s, Sij[k][i]), multiplyScalar(c, Sij[k][j]));\n }\n for (var _k2 = 0; _k2 < N; _k2++) {\n Sij[_k2][i] = Ski[_k2];\n Sij[_k2][j] = Skj[_k2];\n }\n return Sij;\n }\n\n // update matrix\n function x1Big(Hij, theta, i, j) {\n var N = Hij.length;\n var c = bignumber(cos(theta));\n var s = bignumber(sin(theta));\n var c2 = multiplyScalar(c, c);\n var s2 = multiplyScalar(s, s);\n var Aki = createArray(N, bignumber(0));\n var Akj = createArray(N, bignumber(0));\n // 2cs Hij\n var csHij = multiply(bignumber(2), c, s, Hij[i][j]);\n // Aii\n var Aii = addScalar(subtract(multiplyScalar(c2, Hij[i][i]), csHij), multiplyScalar(s2, Hij[j][j]));\n var Ajj = add(multiplyScalar(s2, Hij[i][i]), csHij, multiplyScalar(c2, Hij[j][j]));\n // 0 to i\n for (var k = 0; k < N; k++) {\n Aki[k] = subtract(multiplyScalar(c, Hij[i][k]), multiplyScalar(s, Hij[j][k]));\n Akj[k] = addScalar(multiplyScalar(s, Hij[i][k]), multiplyScalar(c, Hij[j][k]));\n }\n // Modify Hij\n Hij[i][i] = Aii;\n Hij[j][j] = Ajj;\n Hij[i][j] = bignumber(0);\n Hij[j][i] = bignumber(0);\n // 0 to i\n for (var _k3 = 0; _k3 < N; _k3++) {\n if (_k3 !== i && _k3 !== j) {\n Hij[i][_k3] = Aki[_k3];\n Hij[_k3][i] = Aki[_k3];\n Hij[j][_k3] = Akj[_k3];\n Hij[_k3][j] = Akj[_k3];\n }\n }\n return Hij;\n }\n\n // update matrix\n function x1(Hij, theta, i, j) {\n var N = Hij.length;\n var c = Math.cos(theta);\n var s = Math.sin(theta);\n var c2 = c * c;\n var s2 = s * s;\n var Aki = createArray(N, 0);\n var Akj = createArray(N, 0);\n // Aii\n var Aii = c2 * Hij[i][i] - 2 * c * s * Hij[i][j] + s2 * Hij[j][j];\n var Ajj = s2 * Hij[i][i] + 2 * c * s * Hij[i][j] + c2 * Hij[j][j];\n // 0 to i\n for (var k = 0; k < N; k++) {\n Aki[k] = c * Hij[i][k] - s * Hij[j][k];\n Akj[k] = s * Hij[i][k] + c * Hij[j][k];\n }\n // Modify Hij\n Hij[i][i] = Aii;\n Hij[j][j] = Ajj;\n Hij[i][j] = 0;\n Hij[j][i] = 0;\n // 0 to i\n for (var _k4 = 0; _k4 < N; _k4++) {\n if (_k4 !== i && _k4 !== j) {\n Hij[i][_k4] = Aki[_k4];\n Hij[_k4][i] = Aki[_k4];\n Hij[j][_k4] = Akj[_k4];\n Hij[_k4][j] = Akj[_k4];\n }\n }\n return Hij;\n }\n\n // get max off-diagonal value from Upper Diagonal\n function getAij(Mij) {\n var N = Mij.length;\n var maxMij = 0;\n var maxIJ = [0, 1];\n for (var i = 0; i < N; i++) {\n for (var j = i + 1; j < N; j++) {\n if (Math.abs(maxMij) < Math.abs(Mij[i][j])) {\n maxMij = Math.abs(Mij[i][j]);\n maxIJ = [i, j];\n }\n }\n }\n return [maxIJ, maxMij];\n }\n\n // get max off-diagonal value from Upper Diagonal\n function getAijBig(Mij) {\n var N = Mij.length;\n var maxMij = 0;\n var maxIJ = [0, 1];\n for (var i = 0; i < N; i++) {\n for (var j = i + 1; j < N; j++) {\n if (abs(maxMij) < abs(Mij[i][j])) {\n maxMij = abs(Mij[i][j]);\n maxIJ = [i, j];\n }\n }\n }\n return [maxIJ, maxMij];\n }\n\n // sort results\n function sorting(E, S) {\n var N = E.length;\n var values = Array(N);\n var vectors = Array(N);\n for (var k = 0; k < N; k++) {\n vectors[k] = Array(N);\n }\n for (var i = 0; i < N; i++) {\n var minID = 0;\n var minE = E[0];\n for (var j = 0; j < E.length; j++) {\n if (abs(E[j]) < abs(minE)) {\n minID = j;\n minE = E[minID];\n }\n }\n values[i] = E.splice(minID, 1)[0];\n for (var _k5 = 0; _k5 < N; _k5++) {\n vectors[_k5][i] = S[_k5][minID];\n S[_k5].splice(minID, 1);\n }\n }\n return {\n values,\n vectors\n };\n }\n\n /**\n * Create an array of a certain size and fill all items with an initial value\n * @param {number} size\n * @param {number} value\n * @return {number[]}\n */\n function createArray(size, value) {\n // TODO: as soon as all browsers support Array.fill, use that instead (IE doesn't support it)\n var array = new Array(size);\n for (var i = 0; i < size; i++) {\n array[i] = value;\n }\n return array;\n }\n return main;\n}","import { factory } from '../../utils/factory.js';\nimport { format } from '../../utils/string.js';\nimport { createComplexEigs } from './eigs/complexEigs.js';\nimport { createRealSymmetric } from './eigs/realSymetric.js';\nimport { typeOf, isNumber, isBigNumber, isComplex, isFraction } from '../../utils/is.js';\nvar name = 'eigs';\n\n// The absolute state of math.js's dependency system:\nvar dependencies = ['config', 'typed', 'matrix', 'addScalar', 'equal', 'subtract', 'abs', 'atan', 'cos', 'sin', 'multiplyScalar', 'divideScalar', 'inv', 'bignumber', 'multiply', 'add', 'larger', 'column', 'flatten', 'number', 'complex', 'sqrt', 'diag', 'qr', 'usolve', 'usolveAll', 'im', 're', 'smaller', 'matrixFromColumns', 'dot'];\nexport var createEigs = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n config,\n typed,\n matrix,\n addScalar,\n subtract,\n equal,\n abs,\n atan,\n cos,\n sin,\n multiplyScalar,\n divideScalar,\n inv,\n bignumber,\n multiply,\n add,\n larger,\n column,\n flatten,\n number,\n complex,\n sqrt,\n diag,\n qr,\n usolve,\n usolveAll,\n im,\n re,\n smaller,\n matrixFromColumns,\n dot\n } = _ref;\n var doRealSymetric = createRealSymmetric({\n config,\n addScalar,\n subtract,\n column,\n flatten,\n equal,\n abs,\n atan,\n cos,\n sin,\n multiplyScalar,\n inv,\n bignumber,\n complex,\n multiply,\n add\n });\n var doComplexEigs = createComplexEigs({\n config,\n addScalar,\n subtract,\n multiply,\n multiplyScalar,\n flatten,\n divideScalar,\n sqrt,\n abs,\n bignumber,\n diag,\n qr,\n inv,\n usolve,\n usolveAll,\n equal,\n complex,\n larger,\n smaller,\n matrixFromColumns,\n dot\n });\n\n /**\n * Compute eigenvalues and eigenvectors of a matrix. The eigenvalues are sorted by their absolute value, ascending.\n * An eigenvalue with multiplicity k will be listed k times. The eigenvectors are returned as columns of a matrix –\n * the eigenvector that belongs to the j-th eigenvalue in the list (eg. `values[j]`) is the j-th column (eg. `column(vectors, j)`).\n * If the algorithm fails to converge, it will throw an error – in that case, however, you may still find useful information\n * in `err.values` and `err.vectors`.\n *\n * Syntax:\n *\n * math.eigs(x, [prec])\n *\n * Examples:\n *\n * const { eigs, multiply, column, transpose } = math\n * const H = [[5, 2.3], [2.3, 1]]\n * const ans = eigs(H) // returns {values: [E1,E2...sorted], vectors: [v1,v2.... corresponding vectors as columns]}\n * const E = ans.values\n * const U = ans.vectors\n * multiply(H, column(U, 0)) // returns multiply(E[0], column(U, 0))\n * const UTxHxU = multiply(transpose(U), H, U) // diagonalizes H\n * E[0] == UTxHxU[0][0] // returns true\n *\n * See also:\n *\n * inv\n *\n * @param {Array | Matrix} x Matrix to be diagonalized\n *\n * @param {number | BigNumber} [prec] Precision, default value: 1e-15\n * @return {{values: Array|Matrix, vectors: Array|Matrix}} Object containing an array of eigenvalues and a matrix with eigenvectors as columns.\n *\n */\n return typed('eigs', {\n Array: function Array(x) {\n var mat = matrix(x);\n return computeValuesAndVectors(mat);\n },\n 'Array, number|BigNumber': function ArrayNumberBigNumber(x, prec) {\n var mat = matrix(x);\n return computeValuesAndVectors(mat, prec);\n },\n Matrix: function Matrix(mat) {\n var {\n values,\n vectors\n } = computeValuesAndVectors(mat);\n return {\n values: matrix(values),\n vectors: matrix(vectors)\n };\n },\n 'Matrix, number|BigNumber': function MatrixNumberBigNumber(mat, prec) {\n var {\n values,\n vectors\n } = computeValuesAndVectors(mat, prec);\n return {\n values: matrix(values),\n vectors: matrix(vectors)\n };\n }\n });\n function computeValuesAndVectors(mat, prec) {\n if (prec === undefined) {\n prec = config.epsilon;\n }\n var size = mat.size();\n if (size.length !== 2 || size[0] !== size[1]) {\n throw new RangeError('Matrix must be square (size: ' + format(size) + ')');\n }\n var arr = mat.toArray();\n var N = size[0];\n if (isReal(arr, N, prec)) {\n coerceReal(arr, N);\n if (isSymmetric(arr, N, prec)) {\n var _type = coerceTypes(mat, arr, N);\n return doRealSymetric(arr, N, prec, _type);\n }\n }\n var type = coerceTypes(mat, arr, N);\n return doComplexEigs(arr, N, prec, type);\n }\n\n /** @return {boolean} */\n function isSymmetric(arr, N, prec) {\n for (var i = 0; i < N; i++) {\n for (var j = i; j < N; j++) {\n // TODO proper comparison of bignum and frac\n if (larger(bignumber(abs(subtract(arr[i][j], arr[j][i]))), prec)) {\n return false;\n }\n }\n }\n return true;\n }\n\n /** @return {boolean} */\n function isReal(arr, N, prec) {\n for (var i = 0; i < N; i++) {\n for (var j = 0; j < N; j++) {\n // TODO proper comparison of bignum and frac\n if (larger(bignumber(abs(im(arr[i][j]))), prec)) {\n return false;\n }\n }\n }\n return true;\n }\n function coerceReal(arr, N) {\n for (var i = 0; i < N; i++) {\n for (var j = 0; j < N; j++) {\n arr[i][j] = re(arr[i][j]);\n }\n }\n }\n\n /** @return {'number' | 'BigNumber' | 'Complex'} */\n function coerceTypes(mat, arr, N) {\n /** @type {string} */\n var type = mat.datatype();\n if (type === 'number' || type === 'BigNumber' || type === 'Complex') {\n return type;\n }\n var hasNumber = false;\n var hasBig = false;\n var hasComplex = false;\n for (var i = 0; i < N; i++) {\n for (var j = 0; j < N; j++) {\n var el = arr[i][j];\n if (isNumber(el) || isFraction(el)) {\n hasNumber = true;\n } else if (isBigNumber(el)) {\n hasBig = true;\n } else if (isComplex(el)) {\n hasComplex = true;\n } else {\n throw TypeError('Unsupported type in Matrix: ' + typeOf(el));\n }\n }\n }\n if (hasBig && hasComplex) {\n console.warn('Complex BigNumbers not supported, this operation will lose precission.');\n }\n if (hasComplex) {\n for (var _i = 0; _i < N; _i++) {\n for (var _j = 0; _j < N; _j++) {\n arr[_i][_j] = complex(arr[_i][_j]);\n }\n }\n return 'Complex';\n }\n if (hasBig) {\n for (var _i2 = 0; _i2 < N; _i2++) {\n for (var _j2 = 0; _j2 < N; _j2++) {\n arr[_i2][_j2] = bignumber(arr[_i2][_j2]);\n }\n }\n return 'BigNumber';\n }\n if (hasNumber) {\n for (var _i3 = 0; _i3 < N; _i3++) {\n for (var _j3 = 0; _j3 < N; _j3++) {\n arr[_i3][_j3] = number(arr[_i3][_j3]);\n }\n }\n return 'number';\n } else {\n throw TypeError('Matrix contains unsupported types only.');\n }\n }\n});","import { isSparseMatrix } from '../../utils/is.js';\nimport { format } from '../../utils/string.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'expm';\nvar dependencies = ['typed', 'abs', 'add', 'identity', 'inv', 'multiply'];\nexport var createExpm = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n abs,\n add,\n identity,\n inv,\n multiply\n } = _ref;\n /**\n * Compute the matrix exponential, expm(A) = e^A. The matrix must be square.\n * Not to be confused with exp(a), which performs element-wise\n * exponentiation.\n *\n * The exponential is calculated using the Padé approximant with scaling and\n * squaring; see \"Nineteen Dubious Ways to Compute the Exponential of a\n * Matrix,\" by Moler and Van Loan.\n *\n * Syntax:\n *\n * math.expm(x)\n *\n * Examples:\n *\n * const A = [[0,2],[0,0]]\n * math.expm(A) // returns [[1,2],[0,1]]\n *\n * See also:\n *\n * exp\n *\n * @param {Matrix} x A square Matrix\n * @return {Matrix} The exponential of x\n */\n return typed(name, {\n Matrix: function Matrix(A) {\n // Check matrix size\n var size = A.size();\n if (size.length !== 2 || size[0] !== size[1]) {\n throw new RangeError('Matrix must be square ' + '(size: ' + format(size) + ')');\n }\n var n = size[0];\n\n // Desired accuracy of the approximant (The actual accuracy\n // will be affected by round-off error)\n var eps = 1e-15;\n\n // The Padé approximant is not so accurate when the values of A\n // are \"large\", so scale A by powers of two. Then compute the\n // exponential, and square the result repeatedly according to\n // the identity e^A = (e^(A/m))^m\n\n // Compute infinity-norm of A, ||A||, to see how \"big\" it is\n var infNorm = infinityNorm(A);\n\n // Find the optimal scaling factor and number of terms in the\n // Padé approximant to reach the desired accuracy\n var params = findParams(infNorm, eps);\n var q = params.q;\n var j = params.j;\n\n // The Pade approximation to e^A is:\n // Rqq(A) = Dqq(A) ^ -1 * Nqq(A)\n // where\n // Nqq(A) = sum(i=0, q, (2q-i)!p! / [ (2q)!i!(q-i)! ] A^i\n // Dqq(A) = sum(i=0, q, (2q-i)!q! / [ (2q)!i!(q-i)! ] (-A)^i\n\n // Scale A by 1 / 2^j\n var Apos = multiply(A, Math.pow(2, -j));\n\n // The i=0 term is just the identity matrix\n var N = identity(n);\n var D = identity(n);\n\n // Initialization (i=0)\n var factor = 1;\n\n // Initialization (i=1)\n var AposToI = Apos; // Cloning not necessary\n var alternate = -1;\n for (var i = 1; i <= q; i++) {\n if (i > 1) {\n AposToI = multiply(AposToI, Apos);\n alternate = -alternate;\n }\n factor = factor * (q - i + 1) / ((2 * q - i + 1) * i);\n N = add(N, multiply(factor, AposToI));\n D = add(D, multiply(factor * alternate, AposToI));\n }\n var R = multiply(inv(D), N);\n\n // Square j times\n for (var _i = 0; _i < j; _i++) {\n R = multiply(R, R);\n }\n return isSparseMatrix(A) ? A.createSparseMatrix(R) : R;\n }\n });\n function infinityNorm(A) {\n var n = A.size()[0];\n var infNorm = 0;\n for (var i = 0; i < n; i++) {\n var rowSum = 0;\n for (var j = 0; j < n; j++) {\n rowSum += abs(A.get([i, j]));\n }\n infNorm = Math.max(rowSum, infNorm);\n }\n return infNorm;\n }\n\n /**\n * Find the best parameters for the Pade approximant given\n * the matrix norm and desired accuracy. Returns the first acceptable\n * combination in order of increasing computational load.\n */\n function findParams(infNorm, eps) {\n var maxSearchSize = 30;\n for (var k = 0; k < maxSearchSize; k++) {\n for (var q = 0; q <= k; q++) {\n var j = k - q;\n if (errorEstimate(infNorm, q, j) < eps) {\n return {\n q,\n j\n };\n }\n }\n }\n throw new Error('Could not find acceptable parameters to compute the matrix exponential (try increasing maxSearchSize in expm.js)');\n }\n\n /**\n * Returns the estimated error of the Pade approximant for the given\n * parameters.\n */\n function errorEstimate(infNorm, q, j) {\n var qfac = 1;\n for (var i = 2; i <= q; i++) {\n qfac *= i;\n }\n var twoqfac = qfac;\n for (var _i2 = q + 1; _i2 <= 2 * q; _i2++) {\n twoqfac *= _i2;\n }\n var twoqp1fac = twoqfac * (2 * q + 1);\n return 8.0 * Math.pow(infNorm / Math.pow(2, j), 2 * q) * qfac * qfac / (twoqfac * twoqp1fac);\n }\n});","import { isMatrix } from '../../utils/is.js';\nimport { format } from '../../utils/string.js';\nimport { arraySize } from '../../utils/array.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'sqrtm';\nvar dependencies = ['typed', 'abs', 'add', 'multiply', 'map', 'sqrt', 'subtract', 'inv', 'size', 'max', 'identity'];\nexport var createSqrtm = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n abs,\n add,\n multiply,\n map,\n sqrt,\n subtract,\n inv,\n size,\n max,\n identity\n } = _ref;\n var _maxIterations = 1e3;\n var _tolerance = 1e-6;\n\n /**\n * Calculate the principal square root matrix using the Denman–Beavers iterative method\n *\n * https://en.wikipedia.org/wiki/Square_root_of_a_matrix#By_Denman–Beavers_iteration\n *\n * @param {Array | Matrix} A The square matrix `A`\n * @return {Array | Matrix} The principal square root of matrix `A`\n * @private\n */\n function _denmanBeavers(A) {\n var error;\n var iterations = 0;\n var Y = A;\n var Z = identity(size(A));\n do {\n var Yk = Y;\n Y = multiply(0.5, add(Yk, inv(Z)));\n Z = multiply(0.5, add(Z, inv(Yk)));\n error = max(abs(subtract(Y, Yk)));\n if (error > _tolerance && ++iterations > _maxIterations) {\n throw new Error('computing square root of matrix: iterative method could not converge');\n }\n } while (error > _tolerance);\n return Y;\n }\n\n /**\n * Calculate the principal square root of a square matrix.\n * The principal square root matrix `X` of another matrix `A` is such that `X * X = A`.\n *\n * https://en.wikipedia.org/wiki/Square_root_of_a_matrix\n *\n * Syntax:\n *\n * math.sqrtm(A)\n *\n * Examples:\n *\n * math.sqrtm([[33, 24], [48, 57]]) // returns [[5, 2], [4, 7]]\n *\n * See also:\n *\n * sqrt, pow\n *\n * @param {Array | Matrix} A The square matrix `A`\n * @return {Array | Matrix} The principal square root of matrix `A`\n */\n return typed(name, {\n 'Array | Matrix': function ArrayMatrix(A) {\n var size = isMatrix(A) ? A.size() : arraySize(A);\n switch (size.length) {\n case 1:\n // Single element Array | Matrix\n if (size[0] === 1) {\n return map(A, sqrt);\n } else {\n throw new RangeError('Matrix must be square ' + '(size: ' + format(size) + ')');\n }\n case 2:\n {\n // Two-dimensional Array | Matrix\n var rows = size[0];\n var cols = size[1];\n if (rows === cols) {\n return _denmanBeavers(A);\n } else {\n throw new RangeError('Matrix must be square ' + '(size: ' + format(size) + ')');\n }\n }\n default:\n // Multi dimensional array\n throw new RangeError('Matrix must be at most two dimensional ' + '(size: ' + format(size) + ')');\n }\n }\n });\n});","import { factory } from '../../utils/factory.js';\nvar name = 'sylvester';\nvar dependencies = ['typed', 'schur', 'matrixFromColumns', 'matrix', 'multiply', 'range', 'concat', 'transpose', 'index', 'subset', 'add', 'subtract', 'identity', 'lusolve', 'abs'];\nexport var createSylvester = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n schur,\n matrixFromColumns,\n matrix,\n multiply,\n range,\n concat,\n transpose,\n index,\n subset,\n add,\n subtract,\n identity,\n lusolve,\n abs\n } = _ref;\n /**\n *\n * Solves the real-valued Sylvester equation AX+XB=C for X, where A, B and C are\n * matrices of appropriate dimensions, being A and B squared. Notice that other\n * equivalent definitions for the Sylvester equation exist and this function\n * assumes the one presented in the original publication of the the Bartels-\n * Stewart algorithm, which is implemented by this function.\n * https://en.wikipedia.org/wiki/Sylvester_equation\n *\n * Syntax:\n *\n * math.sylvester(A, B, C)\n *\n * Examples:\n *\n * const A = [[-1, -2], [1, 1]]\n * const B = [[2, -1], [1, -2]]\n * const C = [[-3, 2], [3, 0]]\n * math.sylvester(A, B, C) // returns DenseMatrix [[-0.25, 0.25], [1.5, -1.25]]\n *\n * See also:\n *\n * schur, lyap\n *\n * @param {Matrix | Array} A Matrix A\n * @param {Matrix | Array} B Matrix B\n * @param {Matrix | Array} C Matrix C\n * @return {Matrix | Array} Matrix X, solving the Sylvester equation\n */\n return typed(name, {\n 'Matrix, Matrix, Matrix': _sylvester,\n 'Array, Matrix, Matrix': function ArrayMatrixMatrix(A, B, C) {\n return _sylvester(matrix(A), B, C);\n },\n 'Array, Array, Matrix': function ArrayArrayMatrix(A, B, C) {\n return _sylvester(matrix(A), matrix(B), C);\n },\n 'Array, Matrix, Array': function ArrayMatrixArray(A, B, C) {\n return _sylvester(matrix(A), B, matrix(C));\n },\n 'Matrix, Array, Matrix': function MatrixArrayMatrix(A, B, C) {\n return _sylvester(A, matrix(B), C);\n },\n 'Matrix, Array, Array': function MatrixArrayArray(A, B, C) {\n return _sylvester(A, matrix(B), matrix(C));\n },\n 'Matrix, Matrix, Array': function MatrixMatrixArray(A, B, C) {\n return _sylvester(A, B, matrix(C));\n },\n 'Array, Array, Array': function ArrayArrayArray(A, B, C) {\n return _sylvester(matrix(A), matrix(B), matrix(C)).toArray();\n }\n });\n function _sylvester(A, B, C) {\n var n = B.size()[0];\n var m = A.size()[0];\n var sA = schur(A);\n var F = sA.T;\n var U = sA.U;\n var sB = schur(multiply(-1, B));\n var G = sB.T;\n var V = sB.U;\n var D = multiply(multiply(transpose(U), C), V);\n var all = range(0, m);\n var y = [];\n var hc = (a, b) => concat(a, b, 1);\n var vc = (a, b) => concat(a, b, 0);\n for (var k = 0; k < n; k++) {\n if (k < n - 1 && abs(subset(G, index(k + 1, k))) > 1e-5) {\n var RHS = vc(subset(D, index(all, k)), subset(D, index(all, k + 1)));\n for (var j = 0; j < k; j++) {\n RHS = add(RHS, vc(multiply(y[j], subset(G, index(j, k))), multiply(y[j], subset(G, index(j, k + 1)))));\n }\n var gkk = multiply(identity(m), multiply(-1, subset(G, index(k, k))));\n var gmk = multiply(identity(m), multiply(-1, subset(G, index(k + 1, k))));\n var gkm = multiply(identity(m), multiply(-1, subset(G, index(k, k + 1))));\n var gmm = multiply(identity(m), multiply(-1, subset(G, index(k + 1, k + 1))));\n var LHS = vc(hc(add(F, gkk), gmk), hc(gkm, add(F, gmm)));\n var yAux = lusolve(LHS, RHS);\n y[k] = yAux.subset(index(range(0, m), 0));\n y[k + 1] = yAux.subset(index(range(m, 2 * m), 0));\n k++;\n } else {\n var _RHS = subset(D, index(all, k));\n for (var _j = 0; _j < k; _j++) {\n _RHS = add(_RHS, multiply(y[_j], subset(G, index(_j, k))));\n }\n var _gkk = subset(G, index(k, k));\n var _LHS = subtract(F, multiply(_gkk, identity(m)));\n y[k] = lusolve(_LHS, _RHS);\n }\n }\n var Y = matrix(matrixFromColumns(...y));\n var X = multiply(U, multiply(Y, transpose(V)));\n return X;\n }\n});","import { factory } from '../../../utils/factory.js';\nvar name = 'schur';\nvar dependencies = ['typed', 'matrix', 'identity', 'multiply', 'qr', 'norm', 'subtract'];\nexport var createSchur = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n matrix,\n identity,\n multiply,\n qr,\n norm,\n subtract\n } = _ref;\n /**\n *\n * Performs a real Schur decomposition of the real matrix A = UTU' where U is orthogonal\n * and T is upper quasi-triangular.\n * https://en.wikipedia.org/wiki/Schur_decomposition\n *\n * Syntax:\n *\n * math.schur(A)\n *\n * Examples:\n *\n * const A = [[1, 0], [-4, 3]]\n * math.schur(A) // returns {T: [[3, 4], [0, 1]], R: [[0, 1], [-1, 0]]}\n *\n * See also:\n *\n * sylvester, lyap, qr\n *\n * @param {Array | Matrix} A Matrix A\n * @return {{U: Array | Matrix, T: Array | Matrix}} Object containing both matrix U and T of the Schur Decomposition A=UTU'\n */\n return typed(name, {\n Array: function Array(X) {\n var r = _schur(matrix(X));\n return {\n U: r.U.valueOf(),\n T: r.T.valueOf()\n };\n },\n Matrix: function Matrix(X) {\n return _schur(X);\n }\n });\n function _schur(X) {\n var n = X.size()[0];\n var A = X;\n var U = identity(n);\n var k = 0;\n var A0;\n do {\n A0 = A;\n var QR = qr(A);\n var Q = QR.Q;\n var R = QR.R;\n A = multiply(R, Q);\n U = multiply(U, Q);\n if (k++ > 100) {\n break;\n }\n } while (norm(subtract(A, A0)) > 1e-4);\n return {\n U,\n T: A\n };\n }\n});","import { factory } from '../../utils/factory.js';\nvar name = 'lyap';\nvar dependencies = ['typed', 'matrix', 'sylvester', 'multiply', 'transpose'];\nexport var createLyap = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n matrix,\n sylvester,\n multiply,\n transpose\n } = _ref;\n /**\n *\n * Solves the Continuous-time Lyapunov equation AP+PA'+Q=0 for P, where\n * Q is an input matrix. When Q is symmetric, P is also symmetric. Notice\n * that different equivalent definitions exist for the Continuous-time\n * Lyapunov equation.\n * https://en.wikipedia.org/wiki/Lyapunov_equation\n *\n * Syntax:\n *\n * math.lyap(A, Q)\n *\n * Examples:\n *\n * const A = [[-2, 0], [1, -4]]\n * const Q = [[3, 1], [1, 3]]\n * const P = math.lyap(A, Q)\n *\n * See also:\n *\n * sylvester, schur\n *\n * @param {Matrix | Array} A Matrix A\n * @param {Matrix | Array} Q Matrix Q\n * @return {Matrix | Array} Matrix P solution to the Continuous-time Lyapunov equation AP+PA'=Q\n */\n return typed(name, {\n 'Matrix, Matrix': function MatrixMatrix(A, Q) {\n return sylvester(A, transpose(A), multiply(-1, Q));\n },\n 'Array, Matrix': function ArrayMatrix(A, Q) {\n return sylvester(matrix(A), transpose(matrix(A)), multiply(-1, Q));\n },\n 'Matrix, Array': function MatrixArray(A, Q) {\n return sylvester(A, transpose(matrix(A)), matrix(multiply(-1, Q)));\n },\n 'Array, Array': function ArrayArray(A, Q) {\n return sylvester(matrix(A), transpose(matrix(A)), matrix(multiply(-1, Q))).toArray();\n }\n });\n});","import { factory } from '../../utils/factory.js';\nimport { extend } from '../../utils/object.js';\nimport { createMatAlgo11xS0s } from '../../type/matrix/utils/matAlgo11xS0s.js';\nimport { createMatAlgo14xDs } from '../../type/matrix/utils/matAlgo14xDs.js';\nvar name = 'divide';\nvar dependencies = ['typed', 'matrix', 'multiply', 'equalScalar', 'divideScalar', 'inv'];\nexport var createDivide = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n matrix,\n multiply,\n equalScalar,\n divideScalar,\n inv\n } = _ref;\n var matAlgo11xS0s = createMatAlgo11xS0s({\n typed,\n equalScalar\n });\n var matAlgo14xDs = createMatAlgo14xDs({\n typed\n });\n\n /**\n * Divide two values, `x / y`.\n * To divide matrices, `x` is multiplied with the inverse of `y`: `x * inv(y)`.\n *\n * Syntax:\n *\n * math.divide(x, y)\n *\n * Examples:\n *\n * math.divide(2, 3) // returns number 0.6666666666666666\n *\n * const a = math.complex(5, 14)\n * const b = math.complex(4, 1)\n * math.divide(a, b) // returns Complex 2 + 3i\n *\n * const c = [[7, -6], [13, -4]]\n * const d = [[1, 2], [4, 3]]\n * math.divide(c, d) // returns Array [[-9, 4], [-11, 6]]\n *\n * const e = math.unit('18 km')\n * math.divide(e, 4.5) // returns Unit 4 km\n *\n * See also:\n *\n * multiply\n *\n * @param {number | BigNumber | Fraction | Complex | Unit | Array | Matrix} x Numerator\n * @param {number | BigNumber | Fraction | Complex | Array | Matrix} y Denominator\n * @return {number | BigNumber | Fraction | Complex | Unit | Array | Matrix} Quotient, `x / y`\n */\n return typed('divide', extend({\n // we extend the signatures of divideScalar with signatures dealing with matrices\n\n 'Array | Matrix, Array | Matrix': function ArrayMatrixArrayMatrix(x, y) {\n // TODO: implement matrix right division using pseudo inverse\n // https://www.mathworks.nl/help/matlab/ref/mrdivide.html\n // https://www.gnu.org/software/octave/doc/interpreter/Arithmetic-Ops.html\n // https://stackoverflow.com/questions/12263932/how-does-gnu-octave-matrix-division-work-getting-unexpected-behaviour\n return multiply(x, inv(y));\n },\n 'DenseMatrix, any': function DenseMatrixAny(x, y) {\n return matAlgo14xDs(x, y, divideScalar, false);\n },\n 'SparseMatrix, any': function SparseMatrixAny(x, y) {\n return matAlgo11xS0s(x, y, divideScalar, false);\n },\n 'Array, any': function ArrayAny(x, y) {\n // use matrix implementation\n return matAlgo14xDs(matrix(x), y, divideScalar, false).valueOf();\n },\n 'any, Array | Matrix': function anyArrayMatrix(x, y) {\n return multiply(x, inv(y));\n }\n }, divideScalar.signatures));\n});","import { isBigNumber } from '../../utils/is.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'distance';\nvar dependencies = ['typed', 'addScalar', 'subtract', 'divideScalar', 'multiplyScalar', 'deepEqual', 'sqrt', 'abs'];\nexport var createDistance = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n addScalar,\n subtract,\n multiplyScalar,\n divideScalar,\n deepEqual,\n sqrt,\n abs\n } = _ref;\n /**\n * Calculates:\n * The eucledian distance between two points in N-dimensional spaces.\n * Distance between point and a line in 2 and 3 dimensional spaces.\n * Pairwise distance between a set of 2D or 3D points\n * NOTE:\n * When substituting coefficients of a line(a, b and c), use ax + by + c = 0 instead of ax + by = c\n * For parametric equation of a 3D line, x0, y0, z0, a, b, c are from: (x−x0, y−y0, z−z0) = t(a, b, c)\n *\n * Syntax:\n *\n * math.distance([x1,y1], [x2,y2])\n * math.distance({pointOneX, pointOneY}, {pointTwoX, pointTwoY})\n * math.distance([x1,y1,z1], [x2,y2,z2])\n * math.distance({pointOneX, pointOneY, pointOneZ}, {pointTwoX, pointTwoY, pointTwoZ})\n * math.distance([x1,y1,z1,a1], [x2,y2,z2,a2])\n * math.distance([[x1,y1], [x2,y2], [x3,y3]])\n * math.distance([[x1,y1,z1], [x2,y2,z2], [x3,y3,z3]])\n * math.distance([pointX,pointY], [a,b,c])\n * math.distance([pointX,pointY], [lineOnePtX,lineOnePtY], [lineTwoPtX,lineTwoPtY])\n * math.distance({pointX, pointY}, {lineOnePtX, lineOnePtY}, {lineTwoPtX, lineTwoPtY})\n * math.distance([pointX,pointY,pointZ], [x0, y0, z0, a, b, c])\n * math.distance({pointX, pointY, pointZ}, {x0, y0, z0, a, b, c})\n *\n * Examples:\n * math.distance([0,0], [4,4]) // Returns 5.656854249492381\n * math.distance(\n * {pointOneX: 0, pointOneY: 0},\n * {pointTwoX: 10, pointTwoY: 10}) // Returns 14.142135623730951\n * math.distance([1, 0, 1], [4, -2, 2]) // Returns 3.7416573867739413\n * math.distance(\n * {pointOneX: 4, pointOneY: 5, pointOneZ: 8},\n * {pointTwoX: 2, pointTwoY: 7, pointTwoZ: 9}) // Returns 3\n * math.distance([1, 0, 1, 0], [0, -1, 0, -1]) // Returns 2\n * math.distance([[1, 2], [1, 2], [1, 3]]) // Returns [0, 1, 1]\n * math.distance([[1,2,4], [1,2,6], [8,1,3]]) // Returns [2, 7.14142842854285, 7.681145747868608]\n * math.distance([10, 10], [8, 1, 3]) // Returns 11.535230316796387\n * math.distance([0, 0], [3, 0], [0, 4]) // Returns 2.4\n * math.distance(\n * {pointX: 0, pointY: 0},\n * {lineOnePtX: 3, lineOnePtY: 0},\n * {lineTwoPtX: 0, lineTwoPtY: 4}) // Returns 2.4\n * math.distance([2, 3, 1], [1, 1, 2, 5, 0, 1]) // Returns 2.3204774044612857\n * math.distance(\n * {pointX: 2, pointY: 3, pointZ: 1},\n * {x0: 1, y0: 1, z0: 2, a: 5, b: 0, c: 1}) // Returns 2.3204774044612857\n *\n * @param {Array | Matrix | Object} x Co-ordinates of first point\n * @param {Array | Matrix | Object} y Co-ordinates of second point\n * @return {Number | BigNumber} Returns the distance from two/three points\n */\n return typed(name, {\n 'Array, Array, Array': function ArrayArrayArray(x, y, z) {\n // Point to Line 2D (x=Point, y=LinePoint1, z=LinePoint2)\n if (x.length === 2 && y.length === 2 && z.length === 2) {\n if (!_2d(x)) {\n throw new TypeError('Array with 2 numbers or BigNumbers expected for first argument');\n }\n if (!_2d(y)) {\n throw new TypeError('Array with 2 numbers or BigNumbers expected for second argument');\n }\n if (!_2d(z)) {\n throw new TypeError('Array with 2 numbers or BigNumbers expected for third argument');\n }\n if (deepEqual(y, z)) {\n throw new TypeError('LinePoint1 should not be same with LinePoint2');\n }\n var xCoeff = subtract(z[1], y[1]);\n var yCoeff = subtract(y[0], z[0]);\n var constant = subtract(multiplyScalar(z[0], y[1]), multiplyScalar(y[0], z[1]));\n return _distancePointLine2D(x[0], x[1], xCoeff, yCoeff, constant);\n } else {\n throw new TypeError('Invalid Arguments: Try again');\n }\n },\n 'Object, Object, Object': function ObjectObjectObject(x, y, z) {\n if (Object.keys(x).length === 2 && Object.keys(y).length === 2 && Object.keys(z).length === 2) {\n if (!_2d(x)) {\n throw new TypeError('Values of pointX and pointY should be numbers or BigNumbers');\n }\n if (!_2d(y)) {\n throw new TypeError('Values of lineOnePtX and lineOnePtY should be numbers or BigNumbers');\n }\n if (!_2d(z)) {\n throw new TypeError('Values of lineTwoPtX and lineTwoPtY should be numbers or BigNumbers');\n }\n if (deepEqual(_objectToArray(y), _objectToArray(z))) {\n throw new TypeError('LinePoint1 should not be same with LinePoint2');\n }\n if ('pointX' in x && 'pointY' in x && 'lineOnePtX' in y && 'lineOnePtY' in y && 'lineTwoPtX' in z && 'lineTwoPtY' in z) {\n var xCoeff = subtract(z.lineTwoPtY, y.lineOnePtY);\n var yCoeff = subtract(y.lineOnePtX, z.lineTwoPtX);\n var constant = subtract(multiplyScalar(z.lineTwoPtX, y.lineOnePtY), multiplyScalar(y.lineOnePtX, z.lineTwoPtY));\n return _distancePointLine2D(x.pointX, x.pointY, xCoeff, yCoeff, constant);\n } else {\n throw new TypeError('Key names do not match');\n }\n } else {\n throw new TypeError('Invalid Arguments: Try again');\n }\n },\n 'Array, Array': function ArrayArray(x, y) {\n // Point to Line 2D (x=[pointX, pointY], y=[x-coeff, y-coeff, const])\n if (x.length === 2 && y.length === 3) {\n if (!_2d(x)) {\n throw new TypeError('Array with 2 numbers or BigNumbers expected for first argument');\n }\n if (!_3d(y)) {\n throw new TypeError('Array with 3 numbers or BigNumbers expected for second argument');\n }\n return _distancePointLine2D(x[0], x[1], y[0], y[1], y[2]);\n } else if (x.length === 3 && y.length === 6) {\n // Point to Line 3D\n if (!_3d(x)) {\n throw new TypeError('Array with 3 numbers or BigNumbers expected for first argument');\n }\n if (!_parametricLine(y)) {\n throw new TypeError('Array with 6 numbers or BigNumbers expected for second argument');\n }\n return _distancePointLine3D(x[0], x[1], x[2], y[0], y[1], y[2], y[3], y[4], y[5]);\n } else if (x.length === y.length && x.length > 0) {\n // Point to Point N-dimensions\n if (!_containsOnlyNumbers(x)) {\n throw new TypeError('All values of an array should be numbers or BigNumbers');\n }\n if (!_containsOnlyNumbers(y)) {\n throw new TypeError('All values of an array should be numbers or BigNumbers');\n }\n return _euclideanDistance(x, y);\n } else {\n throw new TypeError('Invalid Arguments: Try again');\n }\n },\n 'Object, Object': function ObjectObject(x, y) {\n if (Object.keys(x).length === 2 && Object.keys(y).length === 3) {\n if (!_2d(x)) {\n throw new TypeError('Values of pointX and pointY should be numbers or BigNumbers');\n }\n if (!_3d(y)) {\n throw new TypeError('Values of xCoeffLine, yCoeffLine and constant should be numbers or BigNumbers');\n }\n if ('pointX' in x && 'pointY' in x && 'xCoeffLine' in y && 'yCoeffLine' in y && 'constant' in y) {\n return _distancePointLine2D(x.pointX, x.pointY, y.xCoeffLine, y.yCoeffLine, y.constant);\n } else {\n throw new TypeError('Key names do not match');\n }\n } else if (Object.keys(x).length === 3 && Object.keys(y).length === 6) {\n // Point to Line 3D\n if (!_3d(x)) {\n throw new TypeError('Values of pointX, pointY and pointZ should be numbers or BigNumbers');\n }\n if (!_parametricLine(y)) {\n throw new TypeError('Values of x0, y0, z0, a, b and c should be numbers or BigNumbers');\n }\n if ('pointX' in x && 'pointY' in x && 'x0' in y && 'y0' in y && 'z0' in y && 'a' in y && 'b' in y && 'c' in y) {\n return _distancePointLine3D(x.pointX, x.pointY, x.pointZ, y.x0, y.y0, y.z0, y.a, y.b, y.c);\n } else {\n throw new TypeError('Key names do not match');\n }\n } else if (Object.keys(x).length === 2 && Object.keys(y).length === 2) {\n // Point to Point 2D\n if (!_2d(x)) {\n throw new TypeError('Values of pointOneX and pointOneY should be numbers or BigNumbers');\n }\n if (!_2d(y)) {\n throw new TypeError('Values of pointTwoX and pointTwoY should be numbers or BigNumbers');\n }\n if ('pointOneX' in x && 'pointOneY' in x && 'pointTwoX' in y && 'pointTwoY' in y) {\n return _euclideanDistance([x.pointOneX, x.pointOneY], [y.pointTwoX, y.pointTwoY]);\n } else {\n throw new TypeError('Key names do not match');\n }\n } else if (Object.keys(x).length === 3 && Object.keys(y).length === 3) {\n // Point to Point 3D\n if (!_3d(x)) {\n throw new TypeError('Values of pointOneX, pointOneY and pointOneZ should be numbers or BigNumbers');\n }\n if (!_3d(y)) {\n throw new TypeError('Values of pointTwoX, pointTwoY and pointTwoZ should be numbers or BigNumbers');\n }\n if ('pointOneX' in x && 'pointOneY' in x && 'pointOneZ' in x && 'pointTwoX' in y && 'pointTwoY' in y && 'pointTwoZ' in y) {\n return _euclideanDistance([x.pointOneX, x.pointOneY, x.pointOneZ], [y.pointTwoX, y.pointTwoY, y.pointTwoZ]);\n } else {\n throw new TypeError('Key names do not match');\n }\n } else {\n throw new TypeError('Invalid Arguments: Try again');\n }\n },\n Array: function Array(arr) {\n if (!_pairwise(arr)) {\n throw new TypeError('Incorrect array format entered for pairwise distance calculation');\n }\n return _distancePairwise(arr);\n }\n });\n function _isNumber(a) {\n // distance supports numbers and bignumbers\n return typeof a === 'number' || isBigNumber(a);\n }\n function _2d(a) {\n // checks if the number of arguments are correct in count and are valid (should be numbers)\n if (a.constructor !== Array) {\n a = _objectToArray(a);\n }\n return _isNumber(a[0]) && _isNumber(a[1]);\n }\n function _3d(a) {\n // checks if the number of arguments are correct in count and are valid (should be numbers)\n if (a.constructor !== Array) {\n a = _objectToArray(a);\n }\n return _isNumber(a[0]) && _isNumber(a[1]) && _isNumber(a[2]);\n }\n function _containsOnlyNumbers(a) {\n // checks if the number of arguments are correct in count and are valid (should be numbers)\n if (!Array.isArray(a)) {\n a = _objectToArray(a);\n }\n return a.every(_isNumber);\n }\n function _parametricLine(a) {\n if (a.constructor !== Array) {\n a = _objectToArray(a);\n }\n return _isNumber(a[0]) && _isNumber(a[1]) && _isNumber(a[2]) && _isNumber(a[3]) && _isNumber(a[4]) && _isNumber(a[5]);\n }\n function _objectToArray(o) {\n var keys = Object.keys(o);\n var a = [];\n for (var i = 0; i < keys.length; i++) {\n a.push(o[keys[i]]);\n }\n return a;\n }\n function _pairwise(a) {\n // checks for valid arguments passed to _distancePairwise(Array)\n if (a[0].length === 2 && _isNumber(a[0][0]) && _isNumber(a[0][1])) {\n if (a.some(aI => aI.length !== 2 || !_isNumber(aI[0]) || !_isNumber(aI[1]))) {\n return false;\n }\n } else if (a[0].length === 3 && _isNumber(a[0][0]) && _isNumber(a[0][1]) && _isNumber(a[0][2])) {\n if (a.some(aI => aI.length !== 3 || !_isNumber(aI[0]) || !_isNumber(aI[1]) || !_isNumber(aI[2]))) {\n return false;\n }\n } else {\n return false;\n }\n return true;\n }\n function _distancePointLine2D(x, y, a, b, c) {\n var num = abs(addScalar(addScalar(multiplyScalar(a, x), multiplyScalar(b, y)), c));\n var den = sqrt(addScalar(multiplyScalar(a, a), multiplyScalar(b, b)));\n return divideScalar(num, den);\n }\n function _distancePointLine3D(x, y, z, x0, y0, z0, a, b, c) {\n var num = [subtract(multiplyScalar(subtract(y0, y), c), multiplyScalar(subtract(z0, z), b)), subtract(multiplyScalar(subtract(z0, z), a), multiplyScalar(subtract(x0, x), c)), subtract(multiplyScalar(subtract(x0, x), b), multiplyScalar(subtract(y0, y), a))];\n num = sqrt(addScalar(addScalar(multiplyScalar(num[0], num[0]), multiplyScalar(num[1], num[1])), multiplyScalar(num[2], num[2])));\n var den = sqrt(addScalar(addScalar(multiplyScalar(a, a), multiplyScalar(b, b)), multiplyScalar(c, c)));\n return divideScalar(num, den);\n }\n function _euclideanDistance(x, y) {\n var vectorSize = x.length;\n var result = 0;\n var diff = 0;\n for (var i = 0; i < vectorSize; i++) {\n diff = subtract(x[i], y[i]);\n result = addScalar(multiplyScalar(diff, diff), result);\n }\n return sqrt(result);\n }\n function _distancePairwise(a) {\n var result = [];\n var pointA = [];\n var pointB = [];\n for (var i = 0; i < a.length - 1; i++) {\n for (var j = i + 1; j < a.length; j++) {\n if (a[0].length === 2) {\n pointA = [a[i][0], a[i][1]];\n pointB = [a[j][0], a[j][1]];\n } else if (a[0].length === 3) {\n pointA = [a[i][0], a[i][1], a[i][2]];\n pointB = [a[j][0], a[j][1], a[j][2]];\n }\n result.push(_euclideanDistance(pointA, pointB));\n }\n }\n return result;\n }\n});","import { factory } from '../../utils/factory.js';\nvar name = 'intersect';\nvar dependencies = ['typed', 'config', 'abs', 'add', 'addScalar', 'matrix', 'multiply', 'multiplyScalar', 'divideScalar', 'subtract', 'smaller', 'equalScalar', 'flatten', 'isZero', 'isNumeric'];\nexport var createIntersect = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n config,\n abs,\n add,\n addScalar,\n matrix,\n multiply,\n multiplyScalar,\n divideScalar,\n subtract,\n smaller,\n equalScalar,\n flatten,\n isZero,\n isNumeric\n } = _ref;\n /**\n * Calculates the point of intersection of two lines in two or three dimensions\n * and of a line and a plane in three dimensions. The inputs are in the form of\n * arrays or 1 dimensional matrices. The line intersection functions return null\n * if the lines do not meet.\n *\n * Note: Fill the plane coefficients as `x + y + z = c` and not as `x + y + z + c = 0`.\n *\n * Syntax:\n *\n * math.intersect(endPoint1Line1, endPoint2Line1, endPoint1Line2, endPoint2Line2)\n * math.intersect(endPoint1, endPoint2, planeCoefficients)\n *\n * Examples:\n *\n * math.intersect([0, 0], [10, 10], [10, 0], [0, 10]) // Returns [5, 5]\n * math.intersect([0, 0, 0], [10, 10, 0], [10, 0, 0], [0, 10, 0]) // Returns [5, 5, 0]\n * math.intersect([1, 0, 1], [4, -2, 2], [1, 1, 1, 6]) // Returns [7, -4, 3]\n *\n * @param {Array | Matrix} w Co-ordinates of first end-point of first line\n * @param {Array | Matrix} x Co-ordinates of second end-point of first line\n * @param {Array | Matrix} y Co-ordinates of first end-point of second line\n * OR Co-efficients of the plane's equation\n * @param {Array | Matrix} z Co-ordinates of second end-point of second line\n * OR undefined if the calculation is for line and plane\n * @return {Array} Returns the point of intersection of lines/lines-planes\n */\n return typed('intersect', {\n 'Array, Array, Array': _AAA,\n 'Array, Array, Array, Array': _AAAA,\n 'Matrix, Matrix, Matrix': function MatrixMatrixMatrix(x, y, plane) {\n var arr = _AAA(x.valueOf(), y.valueOf(), plane.valueOf());\n return arr === null ? null : matrix(arr);\n },\n 'Matrix, Matrix, Matrix, Matrix': function MatrixMatrixMatrixMatrix(w, x, y, z) {\n // TODO: output matrix type should match input matrix type\n var arr = _AAAA(w.valueOf(), x.valueOf(), y.valueOf(), z.valueOf());\n return arr === null ? null : matrix(arr);\n }\n });\n function _AAA(x, y, plane) {\n x = _coerceArr(x);\n y = _coerceArr(y);\n plane = _coerceArr(plane);\n if (!_3d(x)) {\n throw new TypeError('Array with 3 numbers or BigNumbers expected for first argument');\n }\n if (!_3d(y)) {\n throw new TypeError('Array with 3 numbers or BigNumbers expected for second argument');\n }\n if (!_4d(plane)) {\n throw new TypeError('Array with 4 numbers expected as third argument');\n }\n return _intersectLinePlane(x[0], x[1], x[2], y[0], y[1], y[2], plane[0], plane[1], plane[2], plane[3]);\n }\n function _AAAA(w, x, y, z) {\n w = _coerceArr(w);\n x = _coerceArr(x);\n y = _coerceArr(y);\n z = _coerceArr(z);\n if (w.length === 2) {\n if (!_2d(w)) {\n throw new TypeError('Array with 2 numbers or BigNumbers expected for first argument');\n }\n if (!_2d(x)) {\n throw new TypeError('Array with 2 numbers or BigNumbers expected for second argument');\n }\n if (!_2d(y)) {\n throw new TypeError('Array with 2 numbers or BigNumbers expected for third argument');\n }\n if (!_2d(z)) {\n throw new TypeError('Array with 2 numbers or BigNumbers expected for fourth argument');\n }\n return _intersect2d(w, x, y, z);\n } else if (w.length === 3) {\n if (!_3d(w)) {\n throw new TypeError('Array with 3 numbers or BigNumbers expected for first argument');\n }\n if (!_3d(x)) {\n throw new TypeError('Array with 3 numbers or BigNumbers expected for second argument');\n }\n if (!_3d(y)) {\n throw new TypeError('Array with 3 numbers or BigNumbers expected for third argument');\n }\n if (!_3d(z)) {\n throw new TypeError('Array with 3 numbers or BigNumbers expected for fourth argument');\n }\n return _intersect3d(w[0], w[1], w[2], x[0], x[1], x[2], y[0], y[1], y[2], z[0], z[1], z[2]);\n } else {\n throw new TypeError('Arrays with two or thee dimensional points expected');\n }\n }\n\n /** Coerce row and column 2-dim arrays to 1-dim array */\n function _coerceArr(arr) {\n // row matrix\n if (arr.length === 1) return arr[0];\n\n // column matrix\n if (arr.length > 1 && Array.isArray(arr[0])) {\n if (arr.every(el => Array.isArray(el) && el.length === 1)) return flatten(arr);\n }\n return arr;\n }\n function _2d(x) {\n return x.length === 2 && isNumeric(x[0]) && isNumeric(x[1]);\n }\n function _3d(x) {\n return x.length === 3 && isNumeric(x[0]) && isNumeric(x[1]) && isNumeric(x[2]);\n }\n function _4d(x) {\n return x.length === 4 && isNumeric(x[0]) && isNumeric(x[1]) && isNumeric(x[2]) && isNumeric(x[3]);\n }\n function _intersect2d(p1a, p1b, p2a, p2b) {\n var o1 = p1a;\n var o2 = p2a;\n var d1 = subtract(o1, p1b);\n var d2 = subtract(o2, p2b);\n var det = subtract(multiplyScalar(d1[0], d2[1]), multiplyScalar(d2[0], d1[1]));\n if (isZero(det)) return null;\n if (smaller(abs(det), config.epsilon)) {\n return null;\n }\n var d20o11 = multiplyScalar(d2[0], o1[1]);\n var d21o10 = multiplyScalar(d2[1], o1[0]);\n var d20o21 = multiplyScalar(d2[0], o2[1]);\n var d21o20 = multiplyScalar(d2[1], o2[0]);\n var t = divideScalar(addScalar(subtract(subtract(d20o11, d21o10), d20o21), d21o20), det);\n return add(multiply(d1, t), o1);\n }\n function _intersect3dHelper(a, b, c, d, e, f, g, h, i, j, k, l) {\n // (a - b)*(c - d) + (e - f)*(g - h) + (i - j)*(k - l)\n var add1 = multiplyScalar(subtract(a, b), subtract(c, d));\n var add2 = multiplyScalar(subtract(e, f), subtract(g, h));\n var add3 = multiplyScalar(subtract(i, j), subtract(k, l));\n return addScalar(addScalar(add1, add2), add3);\n }\n function _intersect3d(x1, y1, z1, x2, y2, z2, x3, y3, z3, x4, y4, z4) {\n var d1343 = _intersect3dHelper(x1, x3, x4, x3, y1, y3, y4, y3, z1, z3, z4, z3);\n var d4321 = _intersect3dHelper(x4, x3, x2, x1, y4, y3, y2, y1, z4, z3, z2, z1);\n var d1321 = _intersect3dHelper(x1, x3, x2, x1, y1, y3, y2, y1, z1, z3, z2, z1);\n var d4343 = _intersect3dHelper(x4, x3, x4, x3, y4, y3, y4, y3, z4, z3, z4, z3);\n var d2121 = _intersect3dHelper(x2, x1, x2, x1, y2, y1, y2, y1, z2, z1, z2, z1);\n var numerator = subtract(multiplyScalar(d1343, d4321), multiplyScalar(d1321, d4343));\n var denominator = subtract(multiplyScalar(d2121, d4343), multiplyScalar(d4321, d4321));\n if (isZero(denominator)) return null;\n var ta = divideScalar(numerator, denominator);\n var tb = divideScalar(addScalar(d1343, multiplyScalar(ta, d4321)), d4343);\n var pax = addScalar(x1, multiplyScalar(ta, subtract(x2, x1)));\n var pay = addScalar(y1, multiplyScalar(ta, subtract(y2, y1)));\n var paz = addScalar(z1, multiplyScalar(ta, subtract(z2, z1)));\n var pbx = addScalar(x3, multiplyScalar(tb, subtract(x4, x3)));\n var pby = addScalar(y3, multiplyScalar(tb, subtract(y4, y3)));\n var pbz = addScalar(z3, multiplyScalar(tb, subtract(z4, z3)));\n if (equalScalar(pax, pbx) && equalScalar(pay, pby) && equalScalar(paz, pbz)) {\n return [pax, pay, paz];\n } else {\n return null;\n }\n }\n function _intersectLinePlane(x1, y1, z1, x2, y2, z2, x, y, z, c) {\n var x1x = multiplyScalar(x1, x);\n var x2x = multiplyScalar(x2, x);\n var y1y = multiplyScalar(y1, y);\n var y2y = multiplyScalar(y2, y);\n var z1z = multiplyScalar(z1, z);\n var z2z = multiplyScalar(z2, z);\n var numerator = subtract(subtract(subtract(c, x1x), y1y), z1z);\n var denominator = subtract(subtract(subtract(addScalar(addScalar(x2x, y2y), z2z), x1x), y1y), z1z);\n var t = divideScalar(numerator, denominator);\n var px = addScalar(x1, multiplyScalar(t, subtract(x2, x1)));\n var py = addScalar(y1, multiplyScalar(t, subtract(y2, y1)));\n var pz = addScalar(z1, multiplyScalar(t, subtract(z2, z1)));\n return [px, py, pz];\n // TODO: Add cases when line is parallel to the plane:\n // (a) no intersection,\n // (b) line contained in plane\n }\n});","import { containsCollections, deepForEach, reduce } from '../../utils/collection.js';\nimport { factory } from '../../utils/factory.js';\nimport { improveErrorMessage } from './utils/improveErrorMessage.js';\nvar name = 'sum';\nvar dependencies = ['typed', 'config', 'add', 'numeric'];\nexport var createSum = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n config,\n add,\n numeric\n } = _ref;\n /**\n * Compute the sum of a matrix or a list with values.\n * In case of a multidimensional array or matrix, the sum of all\n * elements will be calculated.\n *\n * Syntax:\n *\n * math.sum(a, b, c, ...)\n * math.sum(A)\n * math.sum(A, dimension)\n *\n * Examples:\n *\n * math.sum(2, 1, 4, 3) // returns 10\n * math.sum([2, 1, 4, 3]) // returns 10\n * math.sum([[2, 5], [4, 3], [1, 7]]) // returns 22\n *\n * See also:\n *\n * mean, median, min, max, prod, std, variance, cumsum\n *\n * @param {... *} args A single matrix or multiple scalar values\n * @return {*} The sum of all values\n */\n return typed(name, {\n // sum([a, b, c, d, ...])\n 'Array | Matrix': _sum,\n // sum([a, b, c, d, ...], dim)\n 'Array | Matrix, number | BigNumber': _nsumDim,\n // sum(a, b, c, d, ...)\n '...': function _(args) {\n if (containsCollections(args)) {\n throw new TypeError('Scalar values expected in function sum');\n }\n return _sum(args);\n }\n });\n\n /**\n * Recursively calculate the sum of an n-dimensional array\n * @param {Array | Matrix} array\n * @return {number} sum\n * @private\n */\n function _sum(array) {\n var sum;\n deepForEach(array, function (value) {\n try {\n sum = sum === undefined ? value : add(sum, value);\n } catch (err) {\n throw improveErrorMessage(err, 'sum', value);\n }\n });\n\n // make sure returning numeric value: parse a string into a numeric value\n if (sum === undefined) {\n sum = numeric(0, config.number);\n }\n if (typeof sum === 'string') {\n sum = numeric(sum, config.number);\n }\n return sum;\n }\n function _nsumDim(array, dim) {\n try {\n var sum = reduce(array, dim, add);\n return sum;\n } catch (err) {\n throw improveErrorMessage(err, 'sum');\n }\n }\n});","import { containsCollections } from '../../utils/collection.js';\nimport { factory } from '../../utils/factory.js';\nimport { _switch } from '../../utils/switch.js';\nimport { improveErrorMessage } from './utils/improveErrorMessage.js';\nimport { arraySize } from '../../utils/array.js';\nimport { IndexError } from '../../error/IndexError.js';\nvar name = 'cumsum';\nvar dependencies = ['typed', 'add', 'unaryPlus'];\nexport var createCumSum = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n add,\n unaryPlus\n } = _ref;\n /**\n * Compute the cumulative sum of a matrix or a list with values.\n * In case of a (multi dimensional) array or matrix, the cumulative sums\n * along a specified dimension (defaulting to the first) will be calculated.\n *\n * Syntax:\n *\n * math.cumsum(a, b, c, ...)\n * math.cumsum(A)\n *\n * Examples:\n *\n * math.cumsum(2, 1, 4, 3) // returns [2, 3, 7, 10]\n * math.cumsum([2, 1, 4, 3]) // returns [2, 3, 7, 10]\n * math.cumsum([[1, 2], [3, 4]]) // returns [[1, 2], [4, 6]]\n * math.cumsum([[1, 2], [3, 4]], 0) // returns [[1, 2], [4, 6]]\n * math.cumsum([[1, 2], [3, 4]], 1) // returns [[1, 3], [3, 7]]\n * math.cumsum([[2, 5], [4, 3], [1, 7]]) // returns [[2, 5], [6, 8], [7, 15]]\n *\n * See also:\n *\n * mean, median, min, max, prod, std, variance, sum\n *\n * @param {... *} args A single matrix or or multiple scalar values\n * @return {*} The cumulative sum of all values\n */\n return typed(name, {\n // sum([a, b, c, d, ...])\n Array: _cumsum,\n Matrix: function Matrix(matrix) {\n return matrix.create(_cumsum(matrix.valueOf()));\n },\n // sum([a, b, c, d, ...], dim)\n 'Array, number | BigNumber': _ncumSumDim,\n 'Matrix, number | BigNumber': function MatrixNumberBigNumber(matrix, dim) {\n return matrix.create(_ncumSumDim(matrix.valueOf(), dim));\n },\n // cumsum(a, b, c, d, ...)\n '...': function _(args) {\n if (containsCollections(args)) {\n throw new TypeError('All values expected to be scalar in function cumsum');\n }\n return _cumsum(args);\n }\n });\n\n /**\n * Recursively calculate the cumulative sum of an n-dimensional array\n * @param {Array} array\n * @return {number} cumsum\n * @private\n */\n function _cumsum(array) {\n try {\n return _cumsummap(array);\n } catch (err) {\n throw improveErrorMessage(err, name);\n }\n }\n function _cumsummap(array) {\n if (array.length === 0) {\n return [];\n }\n var sums = [unaryPlus(array[0])]; // unaryPlus converts to number if need be\n for (var i = 1; i < array.length; ++i) {\n // Must use add below and not addScalar for the case of summing a\n // 2+-dimensional array along the 0th dimension (the row vectors,\n // or higher-d analogues, are literally added to each other).\n sums.push(add(sums[i - 1], array[i]));\n }\n return sums;\n }\n function _ncumSumDim(array, dim) {\n var size = arraySize(array);\n if (dim < 0 || dim >= size.length) {\n // TODO: would be more clear when throwing a DimensionError here\n throw new IndexError(dim, size.length);\n }\n try {\n return _cumsumDimensional(array, dim);\n } catch (err) {\n throw improveErrorMessage(err, name);\n }\n }\n\n /* Possible TODO: Refactor _reduce in collection.js to be able to work here as well */\n function _cumsumDimensional(mat, dim) {\n var i, ret, tran;\n if (dim <= 0) {\n var initialValue = mat[0][0];\n if (!Array.isArray(initialValue)) {\n return _cumsummap(mat);\n } else {\n tran = _switch(mat);\n ret = [];\n for (i = 0; i < tran.length; i++) {\n ret[i] = _cumsumDimensional(tran[i], dim - 1);\n }\n return ret;\n }\n } else {\n ret = [];\n for (i = 0; i < mat.length; i++) {\n ret[i] = _cumsumDimensional(mat[i], dim - 1);\n }\n return ret;\n }\n }\n});","import { containsCollections, deepForEach, reduce } from '../../utils/collection.js';\nimport { arraySize } from '../../utils/array.js';\nimport { factory } from '../../utils/factory.js';\nimport { improveErrorMessage } from './utils/improveErrorMessage.js';\nvar name = 'mean';\nvar dependencies = ['typed', 'add', 'divide'];\nexport var createMean = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n add,\n divide\n } = _ref;\n /**\n * Compute the mean value of matrix or a list with values.\n * In case of a multidimensional array, the mean of the flattened array\n * will be calculated. When `dim` is provided, the maximum over the selected\n * dimension will be calculated. Parameter `dim` is zero-based.\n *\n * Syntax:\n *\n * math.mean(a, b, c, ...)\n * math.mean(A)\n * math.mean(A, dimension)\n *\n * Examples:\n *\n * math.mean(2, 1, 4, 3) // returns 2.5\n * math.mean([1, 2.7, 3.2, 4]) // returns 2.725\n *\n * math.mean([[2, 5], [6, 3], [1, 7]], 0) // returns [3, 5]\n * math.mean([[2, 5], [6, 3], [1, 7]], 1) // returns [3.5, 4.5, 4]\n *\n * See also:\n *\n * median, min, max, sum, prod, std, variance\n *\n * @param {... *} args A single matrix or or multiple scalar values\n * @return {*} The mean of all values\n */\n return typed(name, {\n // mean([a, b, c, d, ...])\n 'Array | Matrix': _mean,\n // mean([a, b, c, d, ...], dim)\n 'Array | Matrix, number | BigNumber': _nmeanDim,\n // mean(a, b, c, d, ...)\n '...': function _(args) {\n if (containsCollections(args)) {\n throw new TypeError('Scalar values expected in function mean');\n }\n return _mean(args);\n }\n });\n\n /**\n * Calculate the mean value in an n-dimensional array, returning a\n * n-1 dimensional array\n * @param {Array} array\n * @param {number} dim\n * @return {number} mean\n * @private\n */\n function _nmeanDim(array, dim) {\n try {\n var sum = reduce(array, dim, add);\n var s = Array.isArray(array) ? arraySize(array) : array.size();\n return divide(sum, s[dim]);\n } catch (err) {\n throw improveErrorMessage(err, 'mean');\n }\n }\n\n /**\n * Recursively calculate the mean value in an n-dimensional array\n * @param {Array} array\n * @return {number} mean\n * @private\n */\n function _mean(array) {\n var sum;\n var num = 0;\n deepForEach(array, function (value) {\n try {\n sum = sum === undefined ? value : add(sum, value);\n num++;\n } catch (err) {\n throw improveErrorMessage(err, 'mean', value);\n }\n });\n if (num === 0) {\n throw new Error('Cannot calculate the mean of an empty array');\n }\n return divide(sum, num);\n }\n});","import { containsCollections } from '../../utils/collection.js';\nimport { flatten } from '../../utils/array.js';\nimport { factory } from '../../utils/factory.js';\nimport { improveErrorMessage } from './utils/improveErrorMessage.js';\nvar name = 'median';\nvar dependencies = ['typed', 'add', 'divide', 'compare', 'partitionSelect'];\nexport var createMedian = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n add,\n divide,\n compare,\n partitionSelect\n } = _ref;\n /**\n * Recursively calculate the median of an n-dimensional array\n * @param {Array} array\n * @return {Number} median\n * @private\n */\n function _median(array) {\n try {\n array = flatten(array.valueOf());\n var num = array.length;\n if (num === 0) {\n throw new Error('Cannot calculate median of an empty array');\n }\n if (num % 2 === 0) {\n // even: return the average of the two middle values\n var mid = num / 2 - 1;\n var right = partitionSelect(array, mid + 1);\n\n // array now partitioned at mid + 1, take max of left part\n var left = array[mid];\n for (var i = 0; i < mid; ++i) {\n if (compare(array[i], left) > 0) {\n left = array[i];\n }\n }\n return middle2(left, right);\n } else {\n // odd: return the middle value\n var m = partitionSelect(array, (num - 1) / 2);\n return middle(m);\n }\n } catch (err) {\n throw improveErrorMessage(err, 'median');\n }\n }\n\n // helper function to type check the middle value of the array\n var middle = typed({\n 'number | BigNumber | Complex | Unit': function numberBigNumberComplexUnit(value) {\n return value;\n }\n });\n\n // helper function to type check the two middle value of the array\n var middle2 = typed({\n 'number | BigNumber | Complex | Unit, number | BigNumber | Complex | Unit': function numberBigNumberComplexUnitNumberBigNumberComplexUnit(left, right) {\n return divide(add(left, right), 2);\n }\n });\n\n /**\n * Compute the median of a matrix or a list with values. The values are\n * sorted and the middle value is returned. In case of an even number of\n * values, the average of the two middle values is returned.\n * Supported types of values are: Number, BigNumber, Unit\n *\n * In case of a (multi dimensional) array or matrix, the median of all\n * elements will be calculated.\n *\n * Syntax:\n *\n * math.median(a, b, c, ...)\n * math.median(A)\n *\n * Examples:\n *\n * math.median(5, 2, 7) // returns 5\n * math.median([3, -1, 5, 7]) // returns 4\n *\n * See also:\n *\n * mean, min, max, sum, prod, std, variance, quantileSeq\n *\n * @param {... *} args A single matrix or or multiple scalar values\n * @return {*} The median\n */\n return typed(name, {\n // median([a, b, c, d, ...])\n 'Array | Matrix': _median,\n // median([a, b, c, d, ...], dim)\n 'Array | Matrix, number | BigNumber': function ArrayMatrixNumberBigNumber(array, dim) {\n // TODO: implement median(A, dim)\n throw new Error('median(A, dim) is not yet supported');\n // return reduce(arguments[0], arguments[1], ...)\n },\n\n // median(a, b, c, d, ...)\n '...': function _(args) {\n if (containsCollections(args)) {\n throw new TypeError('Scalar values expected in function median');\n }\n return _median(args);\n }\n });\n});","import { flatten } from '../../utils/array.js';\nimport { factory } from '../../utils/factory.js';\nimport { improveErrorMessage } from './utils/improveErrorMessage.js';\nvar name = 'mad';\nvar dependencies = ['typed', 'abs', 'map', 'median', 'subtract'];\nexport var createMad = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n abs,\n map,\n median,\n subtract\n } = _ref;\n /**\n * Compute the median absolute deviation of a matrix or a list with values.\n * The median absolute deviation is defined as the median of the absolute\n * deviations from the median.\n *\n * Syntax:\n *\n * math.mad(a, b, c, ...)\n * math.mad(A)\n *\n * Examples:\n *\n * math.mad(10, 20, 30) // returns 10\n * math.mad([1, 2, 3]) // returns 1\n * math.mad([[1, 2, 3], [4, 5, 6]]) // returns 1.5\n *\n * See also:\n *\n * median, mean, std, abs\n *\n * @param {Array | Matrix} array\n * A single matrix or multiple scalar values.\n * @return {*} The median absolute deviation.\n */\n return typed(name, {\n // mad([a, b, c, d, ...])\n 'Array | Matrix': _mad,\n // mad(a, b, c, d, ...)\n '...': function _(args) {\n return _mad(args);\n }\n });\n function _mad(array) {\n array = flatten(array.valueOf());\n if (array.length === 0) {\n throw new Error('Cannot calculate median absolute deviation (mad) of an empty array');\n }\n try {\n var med = median(array);\n return median(map(array, function (value) {\n return abs(subtract(value, med));\n }));\n } catch (err) {\n if (err instanceof TypeError && err.message.indexOf('median') !== -1) {\n throw new TypeError(err.message.replace('median', 'mad'));\n } else {\n throw improveErrorMessage(err, 'mad');\n }\n }\n }\n});","import { deepForEach } from '../../utils/collection.js';\nimport { isBigNumber } from '../../utils/is.js';\nimport { factory } from '../../utils/factory.js';\nimport { improveErrorMessage } from './utils/improveErrorMessage.js';\nvar DEFAULT_NORMALIZATION = 'unbiased';\nvar name = 'variance';\nvar dependencies = ['typed', 'add', 'subtract', 'multiply', 'divide', 'apply', 'isNaN'];\nexport var createVariance = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n add,\n subtract,\n multiply,\n divide,\n apply,\n isNaN\n } = _ref;\n /**\n * Compute the variance of a matrix or a list with values.\n * In case of a multidimensional array or matrix, the variance over all\n * elements will be calculated.\n *\n * Additionally, it is possible to compute the variance along the rows\n * or columns of a matrix by specifying the dimension as the second argument.\n *\n * Optionally, the type of normalization can be specified as the final\n * parameter. The parameter `normalization` can be one of the following values:\n *\n * - 'unbiased' (default) The sum of squared errors is divided by (n - 1)\n * - 'uncorrected' The sum of squared errors is divided by n\n * - 'biased' The sum of squared errors is divided by (n + 1)\n *\n *\n * Note that older browser may not like the variable name `var`. In that\n * case, the function can be called as `math['var'](...)` instead of\n * `math.var(...)`.\n *\n * Syntax:\n *\n * math.variance(a, b, c, ...)\n * math.variance(A)\n * math.variance(A, normalization)\n * math.variance(A, dimension)\n * math.variance(A, dimension, normalization)\n *\n * Examples:\n *\n * math.variance(2, 4, 6) // returns 4\n * math.variance([2, 4, 6, 8]) // returns 6.666666666666667\n * math.variance([2, 4, 6, 8], 'uncorrected') // returns 5\n * math.variance([2, 4, 6, 8], 'biased') // returns 4\n *\n * math.variance([[1, 2, 3], [4, 5, 6]]) // returns 3.5\n * math.variance([[1, 2, 3], [4, 6, 8]], 0) // returns [4.5, 8, 12.5]\n * math.variance([[1, 2, 3], [4, 6, 8]], 1) // returns [1, 4]\n * math.variance([[1, 2, 3], [4, 6, 8]], 1, 'biased') // returns [0.5, 2]\n *\n * See also:\n *\n * mean, median, max, min, prod, std, sum\n *\n * @param {Array | Matrix} array\n * A single matrix or or multiple scalar values\n * @param {string} [normalization='unbiased']\n * Determines how to normalize the variance.\n * Choose 'unbiased' (default), 'uncorrected', or 'biased'.\n * @param dimension {number | BigNumber}\n * Determines the axis to compute the variance for a matrix\n * @return {*} The variance\n */\n return typed(name, {\n // variance([a, b, c, d, ...])\n 'Array | Matrix': function ArrayMatrix(array) {\n return _var(array, DEFAULT_NORMALIZATION);\n },\n // variance([a, b, c, d, ...], normalization)\n 'Array | Matrix, string': _var,\n // variance([a, b, c, c, ...], dim)\n 'Array | Matrix, number | BigNumber': function ArrayMatrixNumberBigNumber(array, dim) {\n return _varDim(array, dim, DEFAULT_NORMALIZATION);\n },\n // variance([a, b, c, c, ...], dim, normalization)\n 'Array | Matrix, number | BigNumber, string': _varDim,\n // variance(a, b, c, d, ...)\n '...': function _(args) {\n return _var(args, DEFAULT_NORMALIZATION);\n }\n });\n\n /**\n * Recursively calculate the variance of an n-dimensional array\n * @param {Array} array\n * @param {string} normalization\n * Determines how to normalize the variance:\n * - 'unbiased' The sum of squared errors is divided by (n - 1)\n * - 'uncorrected' The sum of squared errors is divided by n\n * - 'biased' The sum of squared errors is divided by (n + 1)\n * @return {number | BigNumber} variance\n * @private\n */\n function _var(array, normalization) {\n var sum;\n var num = 0;\n if (array.length === 0) {\n throw new SyntaxError('Function variance requires one or more parameters (0 provided)');\n }\n\n // calculate the mean and number of elements\n deepForEach(array, function (value) {\n try {\n sum = sum === undefined ? value : add(sum, value);\n num++;\n } catch (err) {\n throw improveErrorMessage(err, 'variance', value);\n }\n });\n if (num === 0) throw new Error('Cannot calculate variance of an empty array');\n var mean = divide(sum, num);\n\n // calculate the variance\n sum = undefined;\n deepForEach(array, function (value) {\n var diff = subtract(value, mean);\n sum = sum === undefined ? multiply(diff, diff) : add(sum, multiply(diff, diff));\n });\n if (isNaN(sum)) {\n return sum;\n }\n switch (normalization) {\n case 'uncorrected':\n return divide(sum, num);\n case 'biased':\n return divide(sum, num + 1);\n case 'unbiased':\n {\n var zero = isBigNumber(sum) ? sum.mul(0) : 0;\n return num === 1 ? zero : divide(sum, num - 1);\n }\n default:\n throw new Error('Unknown normalization \"' + normalization + '\". ' + 'Choose \"unbiased\" (default), \"uncorrected\", or \"biased\".');\n }\n }\n function _varDim(array, dim, normalization) {\n try {\n if (array.length === 0) {\n throw new SyntaxError('Function variance requires one or more parameters (0 provided)');\n }\n return apply(array, dim, x => _var(x, normalization));\n } catch (err) {\n throw improveErrorMessage(err, 'variance');\n }\n }\n});","import { isBigNumber, isCollection, isNumber } from '../../utils/is.js';\nimport { isInteger } from '../../utils/number.js';\nimport { flatten } from '../../utils/array.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'quantileSeq';\nvar dependencies = ['typed', 'add', 'multiply', 'partitionSelect', 'compare'];\nexport var createQuantileSeq = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n add,\n multiply,\n partitionSelect,\n compare\n } = _ref;\n /**\n * Compute the prob order quantile of a matrix or a list with values.\n * The sequence is sorted and the middle value is returned.\n * Supported types of sequence values are: Number, BigNumber, Unit\n * Supported types of probability are: Number, BigNumber\n *\n * In case of a multidimensional array or matrix, the prob order quantile\n * of all elements will be calculated.\n *\n * Syntax:\n *\n * math.quantileSeq(A, prob[, sorted])\n * math.quantileSeq(A, [prob1, prob2, ...][, sorted])\n * math.quantileSeq(A, N[, sorted])\n *\n * Examples:\n *\n * math.quantileSeq([3, -1, 5, 7], 0.5) // returns 4\n * math.quantileSeq([3, -1, 5, 7], [1/3, 2/3]) // returns [3, 5]\n * math.quantileSeq([3, -1, 5, 7], 2) // returns [3, 5]\n * math.quantileSeq([-1, 3, 5, 7], 0.5, true) // returns 4\n *\n * See also:\n *\n * median, mean, min, max, sum, prod, std, variance\n *\n * @param {Array, Matrix} data A single matrix or Array\n * @param {Number, BigNumber, Array} probOrN prob is the order of the quantile, while N is\n * the amount of evenly distributed steps of\n * probabilities; only one of these options can\n * be provided\n * @param {Boolean} sorted=false is data sorted in ascending order\n * @return {Number, BigNumber, Unit, Array} Quantile(s)\n */\n function quantileSeq(data, probOrN, sorted) {\n var probArr, dataArr, one;\n if (arguments.length < 2 || arguments.length > 3) {\n throw new SyntaxError('Function quantileSeq requires two or three parameters');\n }\n if (isCollection(data)) {\n sorted = sorted || false;\n if (typeof sorted === 'boolean') {\n dataArr = data.valueOf();\n if (isNumber(probOrN)) {\n if (probOrN < 0) {\n throw new Error('N/prob must be non-negative');\n }\n if (probOrN <= 1) {\n // quantileSeq([a, b, c, d, ...], prob[,sorted])\n return _quantileSeq(dataArr, probOrN, sorted);\n }\n if (probOrN > 1) {\n // quantileSeq([a, b, c, d, ...], N[,sorted])\n if (!isInteger(probOrN)) {\n throw new Error('N must be a positive integer');\n }\n var nPlusOne = probOrN + 1;\n probArr = new Array(probOrN);\n for (var i = 0; i < probOrN;) {\n probArr[i] = _quantileSeq(dataArr, ++i / nPlusOne, sorted);\n }\n return probArr;\n }\n }\n if (isBigNumber(probOrN)) {\n var BigNumber = probOrN.constructor;\n if (probOrN.isNegative()) {\n throw new Error('N/prob must be non-negative');\n }\n one = new BigNumber(1);\n if (probOrN.lte(one)) {\n // quantileSeq([a, b, c, d, ...], prob[,sorted])\n return new BigNumber(_quantileSeq(dataArr, probOrN, sorted));\n }\n if (probOrN.gt(one)) {\n // quantileSeq([a, b, c, d, ...], N[,sorted])\n if (!probOrN.isInteger()) {\n throw new Error('N must be a positive integer');\n }\n\n // largest possible Array length is 2^32-1\n // 2^32 < 10^15, thus safe conversion guaranteed\n var intN = probOrN.toNumber();\n if (intN > 4294967295) {\n throw new Error('N must be less than or equal to 2^32-1, as that is the maximum length of an Array');\n }\n var _nPlusOne = new BigNumber(intN + 1);\n probArr = new Array(intN);\n for (var _i = 0; _i < intN;) {\n probArr[_i] = new BigNumber(_quantileSeq(dataArr, new BigNumber(++_i).div(_nPlusOne), sorted));\n }\n return probArr;\n }\n }\n if (isCollection(probOrN)) {\n // quantileSeq([a, b, c, d, ...], [prob1, prob2, ...][,sorted])\n var probOrNArr = probOrN.valueOf();\n probArr = new Array(probOrNArr.length);\n for (var _i2 = 0; _i2 < probArr.length; ++_i2) {\n var currProb = probOrNArr[_i2];\n if (isNumber(currProb)) {\n if (currProb < 0 || currProb > 1) {\n throw new Error('Probability must be between 0 and 1, inclusive');\n }\n } else if (isBigNumber(currProb)) {\n one = new currProb.constructor(1);\n if (currProb.isNegative() || currProb.gt(one)) {\n throw new Error('Probability must be between 0 and 1, inclusive');\n }\n } else {\n throw new TypeError('Unexpected type of argument in function quantileSeq'); // FIXME: becomes redundant when converted to typed-function\n }\n\n probArr[_i2] = _quantileSeq(dataArr, currProb, sorted);\n }\n return probArr;\n }\n throw new TypeError('Unexpected type of argument in function quantileSeq'); // FIXME: becomes redundant when converted to typed-function\n }\n\n throw new TypeError('Unexpected type of argument in function quantileSeq'); // FIXME: becomes redundant when converted to typed-function\n }\n\n throw new TypeError('Unexpected type of argument in function quantileSeq'); // FIXME: becomes redundant when converted to typed-function\n }\n\n /**\n * Calculate the prob order quantile of an n-dimensional array.\n *\n * @param {Array} array\n * @param {Number, BigNumber} prob\n * @param {Boolean} sorted\n * @return {Number, BigNumber, Unit} prob order quantile\n * @private\n */\n function _quantileSeq(array, prob, sorted) {\n var flat = flatten(array);\n var len = flat.length;\n if (len === 0) {\n throw new Error('Cannot calculate quantile of an empty sequence');\n }\n if (isNumber(prob)) {\n var _index = prob * (len - 1);\n var _fracPart = _index % 1;\n if (_fracPart === 0) {\n var value = sorted ? flat[_index] : partitionSelect(flat, _index);\n validate(value);\n return value;\n }\n var _integerPart = Math.floor(_index);\n var _left;\n var _right;\n if (sorted) {\n _left = flat[_integerPart];\n _right = flat[_integerPart + 1];\n } else {\n _right = partitionSelect(flat, _integerPart + 1);\n\n // max of partition is kth largest\n _left = flat[_integerPart];\n for (var i = 0; i < _integerPart; ++i) {\n if (compare(flat[i], _left) > 0) {\n _left = flat[i];\n }\n }\n }\n validate(_left);\n validate(_right);\n\n // Q(prob) = (1-f)*A[floor(index)] + f*A[floor(index)+1]\n return add(multiply(_left, 1 - _fracPart), multiply(_right, _fracPart));\n }\n\n // If prob is a BigNumber\n var index = prob.times(len - 1);\n if (index.isInteger()) {\n index = index.toNumber();\n var _value = sorted ? flat[index] : partitionSelect(flat, index);\n validate(_value);\n return _value;\n }\n var integerPart = index.floor();\n var fracPart = index.minus(integerPart);\n var integerPartNumber = integerPart.toNumber();\n var left;\n var right;\n if (sorted) {\n left = flat[integerPartNumber];\n right = flat[integerPartNumber + 1];\n } else {\n right = partitionSelect(flat, integerPartNumber + 1);\n\n // max of partition is kth largest\n left = flat[integerPartNumber];\n for (var _i3 = 0; _i3 < integerPartNumber; ++_i3) {\n if (compare(flat[_i3], left) > 0) {\n left = flat[_i3];\n }\n }\n }\n validate(left);\n validate(right);\n\n // Q(prob) = (1-f)*A[floor(index)] + f*A[floor(index)+1]\n var one = new fracPart.constructor(1);\n return add(multiply(left, one.minus(fracPart)), multiply(right, fracPart));\n }\n\n /**\n * Check if array value types are valid, throw error otherwise.\n * @param {number | BigNumber | Unit} x\n * @param {number | BigNumber | Unit} x\n * @private\n */\n var validate = typed({\n 'number | BigNumber | Unit': function numberBigNumberUnit(x) {\n return x;\n }\n });\n return quantileSeq;\n});","import { factory } from '../../utils/factory.js';\nimport { isCollection } from '../../utils/is.js';\nvar name = 'std';\nvar dependencies = ['typed', 'map', 'sqrt', 'variance'];\nexport var createStd = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n map,\n sqrt,\n variance\n } = _ref;\n /**\n * Compute the standard deviation of a matrix or a list with values.\n * The standard deviations is defined as the square root of the variance:\n * `std(A) = sqrt(variance(A))`.\n * In case of a (multi dimensional) array or matrix, the standard deviation\n * over all elements will be calculated by default, unless an axis is specified\n * in which case the standard deviation will be computed along that axis.\n *\n * Additionally, it is possible to compute the standard deviation along the rows\n * or columns of a matrix by specifying the dimension as the second argument.\n *\n * Optionally, the type of normalization can be specified as the final\n * parameter. The parameter `normalization` can be one of the following values:\n *\n * - 'unbiased' (default) The sum of squared errors is divided by (n - 1)\n * - 'uncorrected' The sum of squared errors is divided by n\n * - 'biased' The sum of squared errors is divided by (n + 1)\n *\n *\n * Syntax:\n *\n * math.std(a, b, c, ...)\n * math.std(A)\n * math.std(A, normalization)\n * math.std(A, dimension)\n * math.std(A, dimension, normalization)\n *\n * Examples:\n *\n * math.std(2, 4, 6) // returns 2\n * math.std([2, 4, 6, 8]) // returns 2.581988897471611\n * math.std([2, 4, 6, 8], 'uncorrected') // returns 2.23606797749979\n * math.std([2, 4, 6, 8], 'biased') // returns 2\n *\n * math.std([[1, 2, 3], [4, 5, 6]]) // returns 1.8708286933869707\n * math.std([[1, 2, 3], [4, 6, 8]], 0) // returns [2.1213203435596424, 2.8284271247461903, 3.5355339059327378]\n * math.std([[1, 2, 3], [4, 6, 8]], 1) // returns [1, 2]\n * math.std([[1, 2, 3], [4, 6, 8]], 1, 'biased') // returns [0.7071067811865476, 1.4142135623730951]\n *\n * See also:\n *\n * mean, median, max, min, prod, sum, variance\n *\n * @param {Array | Matrix} array\n * A single matrix or or multiple scalar values\n * @param {string} [normalization='unbiased']\n * Determines how to normalize the variance.\n * Choose 'unbiased' (default), 'uncorrected', or 'biased'.\n * @param dimension {number | BigNumber}\n * Determines the axis to compute the standard deviation for a matrix\n * @return {*} The standard deviation\n */\n return typed(name, {\n // std([a, b, c, d, ...])\n 'Array | Matrix': _std,\n // std([a, b, c, d, ...], normalization)\n 'Array | Matrix, string': _std,\n // std([a, b, c, c, ...], dim)\n 'Array | Matrix, number | BigNumber': _std,\n // std([a, b, c, c, ...], dim, normalization)\n 'Array | Matrix, number | BigNumber, string': _std,\n // std(a, b, c, d, ...)\n '...': function _(args) {\n return _std(args);\n }\n });\n function _std(array, normalization) {\n if (array.length === 0) {\n throw new SyntaxError('Function std requires one or more parameters (0 provided)');\n }\n try {\n var v = variance.apply(null, arguments);\n if (isCollection(v)) {\n return map(v, sqrt);\n } else {\n return sqrt(v);\n }\n } catch (err) {\n if (err instanceof TypeError && err.message.indexOf(' variance') !== -1) {\n throw new TypeError(err.message.replace(' variance', ' std'));\n } else {\n throw err;\n }\n }\n }\n});","import { factory } from '../../utils/factory.js';\nimport { combinationsNumber } from '../../plain/number/combinations.js';\nvar name = 'combinations';\nvar dependencies = ['typed'];\nexport var createCombinations = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed\n } = _ref;\n /**\n * Compute the number of ways of picking `k` unordered outcomes from `n`\n * possibilities.\n *\n * Combinations only takes integer arguments.\n * The following condition must be enforced: k <= n.\n *\n * Syntax:\n *\n * math.combinations(n, k)\n *\n * Examples:\n *\n * math.combinations(7, 5) // returns 21\n *\n * See also:\n *\n * combinationsWithRep, permutations, factorial\n *\n * @param {number | BigNumber} n Total number of objects in the set\n * @param {number | BigNumber} k Number of objects in the subset\n * @return {number | BigNumber} Number of possible combinations.\n */\n return typed(name, {\n 'number, number': combinationsNumber,\n 'BigNumber, BigNumber': function BigNumberBigNumber(n, k) {\n var BigNumber = n.constructor;\n var result, i;\n var nMinusk = n.minus(k);\n var one = new BigNumber(1);\n if (!isPositiveInteger(n) || !isPositiveInteger(k)) {\n throw new TypeError('Positive integer value expected in function combinations');\n }\n if (k.gt(n)) {\n throw new TypeError('k must be less than n in function combinations');\n }\n result = one;\n if (k.lt(nMinusk)) {\n for (i = one; i.lte(nMinusk); i = i.plus(one)) {\n result = result.times(k.plus(i)).dividedBy(i);\n }\n } else {\n for (i = one; i.lte(k); i = i.plus(one)) {\n result = result.times(nMinusk.plus(i)).dividedBy(i);\n }\n }\n return result;\n }\n\n // TODO: implement support for collection in combinations\n });\n});\n\n/**\n * Test whether BigNumber n is a positive integer\n * @param {BigNumber} n\n * @returns {boolean} isPositiveInteger\n */\nfunction isPositiveInteger(n) {\n return n.isInteger() && n.gte(0);\n}","import { factory } from '../../utils/factory.js';\nimport { isInteger } from '../../utils/number.js';\nimport { product } from '../../utils/product.js';\nvar name = 'combinationsWithRep';\nvar dependencies = ['typed'];\nexport var createCombinationsWithRep = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed\n } = _ref;\n /**\n * Compute the number of ways of picking `k` unordered outcomes from `n`\n * possibilities, allowing individual outcomes to be repeated more than once.\n *\n * CombinationsWithRep only takes integer arguments.\n * The following condition must be enforced: k <= n + k -1.\n *\n * Syntax:\n *\n * math.combinationsWithRep(n, k)\n *\n * Examples:\n *\n * math.combinationsWithRep(7, 5) // returns 462\n *\n * See also:\n *\n * combinations, permutations, factorial\n *\n * @param {number | BigNumber} n Total number of objects in the set\n * @param {number | BigNumber} k Number of objects in the subset\n * @return {number | BigNumber} Number of possible combinations with replacement.\n */\n return typed(name, {\n 'number, number': function numberNumber(n, k) {\n if (!isInteger(n) || n < 0) {\n throw new TypeError('Positive integer value expected in function combinationsWithRep');\n }\n if (!isInteger(k) || k < 0) {\n throw new TypeError('Positive integer value expected in function combinationsWithRep');\n }\n if (n < 1) {\n throw new TypeError('k must be less than or equal to n + k - 1');\n }\n if (k < n - 1) {\n var _prodrange = product(n, n + k - 1);\n return _prodrange / product(1, k);\n }\n var prodrange = product(k + 1, n + k - 1);\n return prodrange / product(1, n - 1);\n },\n 'BigNumber, BigNumber': function BigNumberBigNumber(n, k) {\n var BigNumber = n.constructor;\n var result, i;\n var one = new BigNumber(1);\n var nMinusOne = n.minus(one);\n if (!isPositiveInteger(n) || !isPositiveInteger(k)) {\n throw new TypeError('Positive integer value expected in function combinationsWithRep');\n }\n if (n.lt(one)) {\n throw new TypeError('k must be less than or equal to n + k - 1 in function combinationsWithRep');\n }\n result = one;\n if (k.lt(nMinusOne)) {\n for (i = one; i.lte(nMinusOne); i = i.plus(one)) {\n result = result.times(k.plus(i)).dividedBy(i);\n }\n } else {\n for (i = one; i.lte(k); i = i.plus(one)) {\n result = result.times(nMinusOne.plus(i)).dividedBy(i);\n }\n }\n return result;\n }\n });\n});\n\n/**\n * Test whether BigNumber n is a positive integer\n * @param {BigNumber} n\n * @returns {boolean} isPositiveInteger\n */\nfunction isPositiveInteger(n) {\n return n.isInteger() && n.gte(0);\n}","import { factory } from '../../utils/factory.js';\nimport { gammaG, gammaNumber, gammaP } from '../../plain/number/index.js';\nvar name = 'gamma';\nvar dependencies = ['typed', 'config', 'multiplyScalar', 'pow', 'BigNumber', 'Complex'];\nexport var createGamma = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n config,\n multiplyScalar,\n pow,\n BigNumber: _BigNumber,\n Complex\n } = _ref;\n /**\n * Compute the gamma function of a value using Lanczos approximation for\n * small values, and an extended Stirling approximation for large values.\n *\n * To avoid confusion with the matrix Gamma function, this function does\n * not apply to matrices.\n *\n * Syntax:\n *\n * math.gamma(n)\n *\n * Examples:\n *\n * math.gamma(5) // returns 24\n * math.gamma(-0.5) // returns -3.5449077018110335\n * math.gamma(math.i) // returns -0.15494982830180973 - 0.49801566811835596i\n *\n * See also:\n *\n * combinations, factorial, permutations\n *\n * @param {number | BigNumber | Complex} n A real or complex number\n * @return {number | BigNumber | Complex} The gamma of `n`\n */\n\n function gammaComplex(n) {\n if (n.im === 0) {\n return gammaNumber(n.re);\n }\n\n // Lanczos approximation doesn't work well with real part lower than 0.5\n // So reflection formula is required\n if (n.re < 0.5) {\n // Euler's reflection formula\n // gamma(1-z) * gamma(z) = PI / sin(PI * z)\n // real part of Z should not be integer [sin(PI) == 0 -> 1/0 - undefined]\n // thanks to imperfect sin implementation sin(PI * n) != 0\n // we can safely use it anyway\n var _t = new Complex(1 - n.re, -n.im);\n var r = new Complex(Math.PI * n.re, Math.PI * n.im);\n return new Complex(Math.PI).div(r.sin()).div(gammaComplex(_t));\n }\n\n // Lanczos approximation\n // z -= 1\n n = new Complex(n.re - 1, n.im);\n\n // x = gammaPval[0]\n var x = new Complex(gammaP[0], 0);\n // for (i, gammaPval) in enumerate(gammaP):\n for (var i = 1; i < gammaP.length; ++i) {\n // x += gammaPval / (z + i)\n var gammaPval = new Complex(gammaP[i], 0);\n x = x.add(gammaPval.div(n.add(i)));\n }\n // t = z + gammaG + 0.5\n var t = new Complex(n.re + gammaG + 0.5, n.im);\n\n // y = sqrt(2 * pi) * t ** (z + 0.5) * exp(-t) * x\n var twoPiSqrt = Math.sqrt(2 * Math.PI);\n var tpow = t.pow(n.add(0.5));\n var expt = t.neg().exp();\n\n // y = [x] * [sqrt(2 * pi)] * [t ** (z + 0.5)] * [exp(-t)]\n return x.mul(twoPiSqrt).mul(tpow).mul(expt);\n }\n return typed(name, {\n number: gammaNumber,\n Complex: gammaComplex,\n BigNumber: function BigNumber(n) {\n if (n.isInteger()) {\n return n.isNegative() || n.isZero() ? new _BigNumber(Infinity) : bigFactorial(n.minus(1));\n }\n if (!n.isFinite()) {\n return new _BigNumber(n.isNegative() ? NaN : Infinity);\n }\n throw new Error('Integer BigNumber expected');\n }\n });\n\n /**\n * Calculate factorial for a BigNumber\n * @param {BigNumber} n\n * @returns {BigNumber} Returns the factorial of n\n */\n function bigFactorial(n) {\n if (n < 8) {\n return new _BigNumber([1, 1, 2, 6, 24, 120, 720, 5040][n]);\n }\n var precision = config.precision + (Math.log(n.toNumber()) | 0);\n var Big = _BigNumber.clone({\n precision\n });\n if (n % 2 === 1) {\n return n.times(bigFactorial(new _BigNumber(n - 1)));\n }\n var p = n;\n var prod = new Big(n);\n var sum = n.toNumber();\n while (p > 2) {\n p -= 2;\n sum += p;\n prod = prod.times(sum);\n }\n return new _BigNumber(prod.toPrecision(_BigNumber.precision));\n }\n});","/* eslint-disable no-loss-of-precision */\n\n// References\n// ----------\n// [1] Hare, \"Computing the Principal Branch of log-Gamma\", Journal of Algorithms, 1997.\n// [2] https://math.stackexchange.com/questions/1338753/how-do-i-calculate-values-for-gamma-function-with-complex-arguments\n\nimport { lgammaNumber, lnSqrt2PI } from '../../plain/number/index.js';\nimport { factory } from '../../utils/factory.js';\nimport { copysign } from '../../utils/number.js';\nvar name = 'lgamma';\nvar dependencies = ['Complex', 'typed'];\nexport var createLgamma = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n Complex,\n typed\n } = _ref;\n // Stirling series is non-convergent, we need to use the recurrence `lgamma(z) = lgamma(z+1) - log z` to get\n // sufficient accuracy.\n //\n // These two values are copied from Scipy implementation:\n // https://github.com/scipy/scipy/blob/v1.8.0/scipy/special/_loggamma.pxd#L37\n var SMALL_RE = 7;\n var SMALL_IM = 7;\n\n /**\n * The coefficients are B[2*n]/(2*n*(2*n - 1)) where B[2*n] is the (2*n)th Bernoulli number. See (1.1) in [1].\n *\n * If you cannot access the paper, can also get these values from the formula in [2].\n *\n * 1 / 12 = 0.00833333333333333333333333333333\n * 1 / 360 = 0.00277777777777777777777777777778\n * ...\n * 3617 / 133400 = 0.02955065359477124183006535947712\n */\n var coeffs = [-2.955065359477124183e-2, 6.4102564102564102564e-3, -1.9175269175269175269e-3, 8.4175084175084175084e-4, -5.952380952380952381e-4, 7.9365079365079365079e-4, -2.7777777777777777778e-3, 8.3333333333333333333e-2];\n\n /**\n * Logarithm of the gamma function for real, positive numbers and complex numbers,\n * using Lanczos approximation for numbers and Stirling series for complex numbers.\n *\n * Syntax:\n *\n * math.lgamma(n)\n *\n * Examples:\n *\n * math.lgamma(5) // returns 3.178053830347945\n * math.lgamma(0) // returns Infinity\n * math.lgamma(-0.5) // returns NaN\n * math.lgamma(math.i) // returns -0.6509231993018536 - 1.8724366472624294i\n *\n * See also:\n *\n * gamma\n *\n * @param {number | Complex} n A real or complex number\n * @return {number | Complex} The log gamma of `n`\n */\n return typed(name, {\n number: lgammaNumber,\n Complex: lgammaComplex,\n BigNumber: function BigNumber() {\n throw new Error(\"mathjs doesn't yet provide an implementation of the algorithm lgamma for BigNumber\");\n }\n });\n function lgammaComplex(n) {\n var TWOPI = 6.2831853071795864769252842; // 2*pi\n var LOGPI = 1.1447298858494001741434262; // log(pi)\n\n var REFLECTION = 0.1;\n if (n.isNaN()) {\n return new Complex(NaN, NaN);\n } else if (n.im === 0) {\n return new Complex(lgammaNumber(n.re), 0);\n } else if (n.re >= SMALL_RE || Math.abs(n.im) >= SMALL_IM) {\n return lgammaStirling(n);\n } else if (n.re <= REFLECTION) {\n // Reflection formula. see Proposition 3.1 in [1]\n var tmp = copysign(TWOPI, n.im) * Math.floor(0.5 * n.re + 0.25);\n var a = n.mul(Math.PI).sin().log();\n var b = lgammaComplex(new Complex(1 - n.re, -n.im));\n return new Complex(LOGPI, tmp).sub(a).sub(b);\n } else if (n.im >= 0) {\n return lgammaRecurrence(n);\n } else {\n return lgammaRecurrence(n.conjugate()).conjugate();\n }\n }\n function lgammaStirling(z) {\n // formula ref in [2]\n // computation ref:\n // https://github.com/scipy/scipy/blob/v1.8.0/scipy/special/_loggamma.pxd#L101\n\n // left part\n\n // x (log(x) - 1) + 1/2 (log(2PI) - log(x))\n // => (x - 0.5) * log(x) - x + log(2PI) / 2\n var leftPart = z.sub(0.5).mul(z.log()).sub(z).add(lnSqrt2PI);\n\n // right part\n\n var rz = new Complex(1, 0).div(z);\n var rzz = rz.div(z);\n var a = coeffs[0];\n var b = coeffs[1];\n var r = 2 * rzz.re;\n var s = rzz.re * rzz.re + rzz.im * rzz.im;\n for (var i = 2; i < 8; i++) {\n var tmp = b;\n b = -s * a + coeffs[i];\n a = r * a + tmp;\n }\n var rightPart = rz.mul(rzz.mul(a).add(b));\n\n // plus left and right\n\n return leftPart.add(rightPart);\n }\n function lgammaRecurrence(z) {\n // computation ref:\n // https://github.com/scipy/scipy/blob/v1.8.0/scipy/special/_loggamma.pxd#L78\n\n var signflips = 0;\n var sb = 0;\n var shiftprod = z;\n z = z.add(1);\n while (z.re <= SMALL_RE) {\n shiftprod = shiftprod.mul(z);\n var nsb = shiftprod.im < 0 ? 1 : 0;\n if (nsb !== 0 && sb === 0) signflips++;\n sb = nsb;\n z = z.add(1);\n }\n return lgammaStirling(z).sub(shiftprod.log()).sub(new Complex(0, signflips * 2 * Math.PI * 1));\n }\n});","import { deepMap } from '../../utils/collection.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'factorial';\nvar dependencies = ['typed', 'gamma'];\nexport var createFactorial = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n gamma\n } = _ref;\n /**\n * Compute the factorial of a value\n *\n * Factorial only supports an integer value as argument.\n * For matrices, the function is evaluated element wise.\n *\n * Syntax:\n *\n * math.factorial(n)\n *\n * Examples:\n *\n * math.factorial(5) // returns 120\n * math.factorial(3) // returns 6\n *\n * See also:\n *\n * combinations, combinationsWithRep, gamma, permutations\n *\n * @param {number | BigNumber | Array | Matrix} n An integer number\n * @return {number | BigNumber | Array | Matrix} The factorial of `n`\n */\n return typed(name, {\n number: function number(n) {\n if (n < 0) {\n throw new Error('Value must be non-negative');\n }\n return gamma(n + 1);\n },\n BigNumber: function BigNumber(n) {\n if (n.isNegative()) {\n throw new Error('Value must be non-negative');\n }\n return gamma(n.plus(1));\n },\n 'Array | Matrix': typed.referToSelf(self => n => deepMap(n, self))\n });\n});","import { factory } from '../../utils/factory.js';\nvar name = 'kldivergence';\nvar dependencies = ['typed', 'matrix', 'divide', 'sum', 'multiply', 'map', 'dotDivide', 'log', 'isNumeric'];\nexport var createKldivergence = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n matrix,\n divide,\n sum,\n multiply,\n map,\n dotDivide,\n log,\n isNumeric\n } = _ref;\n /**\n * Calculate the Kullback-Leibler (KL) divergence between two distributions\n *\n * Syntax:\n *\n * math.kldivergence(x, y)\n *\n * Examples:\n *\n * math.kldivergence([0.7,0.5,0.4], [0.2,0.9,0.5]) //returns 0.24376698773121153\n *\n *\n * @param {Array | Matrix} q First vector\n * @param {Array | Matrix} p Second vector\n * @return {number} Returns distance between q and p\n */\n return typed(name, {\n 'Array, Array': function ArrayArray(q, p) {\n return _kldiv(matrix(q), matrix(p));\n },\n 'Matrix, Array': function MatrixArray(q, p) {\n return _kldiv(q, matrix(p));\n },\n 'Array, Matrix': function ArrayMatrix(q, p) {\n return _kldiv(matrix(q), p);\n },\n 'Matrix, Matrix': function MatrixMatrix(q, p) {\n return _kldiv(q, p);\n }\n });\n function _kldiv(q, p) {\n var plength = p.size().length;\n var qlength = q.size().length;\n if (plength > 1) {\n throw new Error('first object must be one dimensional');\n }\n if (qlength > 1) {\n throw new Error('second object must be one dimensional');\n }\n if (plength !== qlength) {\n throw new Error('Length of two vectors must be equal');\n }\n\n // Before calculation, apply normalization\n var sumq = sum(q);\n if (sumq === 0) {\n throw new Error('Sum of elements in first object must be non zero');\n }\n var sump = sum(p);\n if (sump === 0) {\n throw new Error('Sum of elements in second object must be non zero');\n }\n var qnorm = divide(q, sum(q));\n var pnorm = divide(p, sum(p));\n var result = sum(multiply(qnorm, map(dotDivide(qnorm, pnorm), x => log(x))));\n if (isNumeric(result)) {\n return result;\n } else {\n return Number.NaN;\n }\n }\n});","import { deepForEach } from '../../utils/collection.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'multinomial';\nvar dependencies = ['typed', 'add', 'divide', 'multiply', 'factorial', 'isInteger', 'isPositive'];\nexport var createMultinomial = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n add,\n divide,\n multiply,\n factorial,\n isInteger,\n isPositive\n } = _ref;\n /**\n * Multinomial Coefficients compute the number of ways of picking a1, a2, ..., ai unordered outcomes from `n` possibilities.\n *\n * multinomial takes one array of integers as an argument.\n * The following condition must be enforced: every ai <= 0\n *\n * Syntax:\n *\n * math.multinomial(a) // a is an array type\n *\n * Examples:\n *\n * math.multinomial([1,2,1]) // returns 12\n *\n * See also:\n *\n * combinations, factorial\n *\n * @param {number[] | BigNumber[]} a Integer numbers of objects in the subset\n * @return {Number | BigNumber} Multinomial coefficient.\n */\n return typed(name, {\n 'Array | Matrix': function ArrayMatrix(a) {\n var sum = 0;\n var denom = 1;\n deepForEach(a, function (ai) {\n if (!isInteger(ai) || !isPositive(ai)) {\n throw new TypeError('Positive integer value expected in function multinomial');\n }\n sum = add(sum, ai);\n denom = multiply(denom, factorial(ai));\n });\n return divide(factorial(sum), denom);\n }\n });\n});","import { isInteger } from '../../utils/number.js';\nimport { product } from '../../utils/product.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'permutations';\nvar dependencies = ['typed', 'factorial'];\nexport var createPermutations = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n factorial\n } = _ref;\n /**\n * Compute the number of ways of obtaining an ordered subset of `k` elements\n * from a set of `n` elements.\n *\n * Permutations only takes integer arguments.\n * The following condition must be enforced: k <= n.\n *\n * Syntax:\n *\n * math.permutations(n)\n * math.permutations(n, k)\n *\n * Examples:\n *\n * math.permutations(5) // 120\n * math.permutations(5, 3) // 60\n *\n * See also:\n *\n * combinations, combinationsWithRep, factorial\n *\n * @param {number | BigNumber} n The number of objects in total\n * @param {number | BigNumber} [k] The number of objects in the subset\n * @return {number | BigNumber} The number of permutations\n */\n return typed(name, {\n 'number | BigNumber': factorial,\n 'number, number': function numberNumber(n, k) {\n if (!isInteger(n) || n < 0) {\n throw new TypeError('Positive integer value expected in function permutations');\n }\n if (!isInteger(k) || k < 0) {\n throw new TypeError('Positive integer value expected in function permutations');\n }\n if (k > n) {\n throw new TypeError('second argument k must be less than or equal to first argument n');\n }\n // Permute n objects, k at a time\n return product(n - k + 1, n);\n },\n 'BigNumber, BigNumber': function BigNumberBigNumber(n, k) {\n var result, i;\n if (!isPositiveInteger(n) || !isPositiveInteger(k)) {\n throw new TypeError('Positive integer value expected in function permutations');\n }\n if (k.gt(n)) {\n throw new TypeError('second argument k must be less than or equal to first argument n');\n }\n var one = n.mul(0).add(1);\n result = one;\n for (i = n.minus(k).plus(1); i.lte(n); i = i.plus(1)) {\n result = result.times(i);\n }\n return result;\n }\n\n // TODO: implement support for collection in permutations\n });\n});\n\n/**\n * Test whether BigNumber n is a positive integer\n * @param {BigNumber} n\n * @returns {boolean} isPositiveInteger\n */\nfunction isPositiveInteger(n) {\n return n.isInteger() && n.gte(0);\n}","import seedrandom from 'seedrandom';\nvar singletonRandom = /* #__PURE__ */seedrandom(Date.now());\nexport function createRng(randomSeed) {\n var random;\n\n // create a new random generator with given seed\n function setSeed(seed) {\n random = seed === null ? singletonRandom : seedrandom(String(seed));\n }\n\n // initialize a seeded pseudo random number generator with config's random seed\n setSeed(randomSeed);\n\n // wrapper function so the rng can be updated via generator\n function rng() {\n return random();\n }\n return rng;\n}","import { flatten } from '../../utils/array.js';\nimport { factory } from '../../utils/factory.js';\nimport { isMatrix, isNumber } from '../../utils/is.js';\nimport { createRng } from './util/seededRNG.js';\nvar name = 'pickRandom';\nvar dependencies = ['typed', 'config', '?on'];\nexport var createPickRandom = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n config,\n on\n } = _ref;\n // seeded pseudo random number generator\n var rng = createRng(config.randomSeed);\n if (on) {\n on('config', function (curr, prev) {\n if (curr.randomSeed !== prev.randomSeed) {\n rng = createRng(curr.randomSeed);\n }\n });\n }\n\n /**\n * Random pick one or more values from a one dimensional array.\n * Array elements are picked using a random function with uniform or weighted distribution.\n *\n * Syntax:\n *\n * math.pickRandom(array)\n * math.pickRandom(array, number)\n * math.pickRandom(array, weights)\n * math.pickRandom(array, number, weights)\n * math.pickRandom(array, weights, number)\n * math.pickRandom(array, { weights, number, elementWise })\n *\n * Examples:\n *\n * math.pickRandom([3, 6, 12, 2]) // returns one of the values in the array\n * math.pickRandom([3, 6, 12, 2], 2) // returns an array of two of the values in the array\n * math.pickRandom([3, 6, 12, 2], { number: 2 }) // returns an array of two of the values in the array\n * math.pickRandom([3, 6, 12, 2], [1, 3, 2, 1]) // returns one of the values in the array with weighted distribution\n * math.pickRandom([3, 6, 12, 2], 2, [1, 3, 2, 1]) // returns an array of two of the values in the array with weighted distribution\n * math.pickRandom([3, 6, 12, 2], [1, 3, 2, 1], 2) // returns an array of two of the values in the array with weighted distribution\n *\n * math.pickRandom([{x: 1.0, y: 2.0}, {x: 1.1, y: 2.0}], { elementWise: false })\n * // returns one of the items in the array\n *\n * See also:\n *\n * random, randomInt\n *\n * @param {Array | Matrix} array A one dimensional array\n * @param {Int} number An int or float\n * @param {Array | Matrix} weights An array of ints or floats\n * @return {number | Array} Returns a single random value from array when number is 1 or undefined.\n * Returns an array with the configured number of elements when number is > 1.\n */\n return typed(name, {\n 'Array | Matrix': function ArrayMatrix(possibles) {\n return _pickRandom(possibles, {});\n },\n 'Array | Matrix, Object': function ArrayMatrixObject(possibles, options) {\n return _pickRandom(possibles, options);\n },\n 'Array | Matrix, number': function ArrayMatrixNumber(possibles, number) {\n return _pickRandom(possibles, {\n number\n });\n },\n 'Array | Matrix, Array | Matrix': function ArrayMatrixArrayMatrix(possibles, weights) {\n return _pickRandom(possibles, {\n weights\n });\n },\n 'Array | Matrix, Array | Matrix, number': function ArrayMatrixArrayMatrixNumber(possibles, weights, number) {\n return _pickRandom(possibles, {\n number,\n weights\n });\n },\n 'Array | Matrix, number, Array | Matrix': function ArrayMatrixNumberArrayMatrix(possibles, number, weights) {\n return _pickRandom(possibles, {\n number,\n weights\n });\n }\n });\n\n /**\n * @param {Array | Matrix} possibles\n * @param {{\n * number?: number,\n * weights?: Array | Matrix,\n * elementWise: boolean\n * }} options\n * @returns {number | Array}\n * @private\n */\n function _pickRandom(possibles, _ref2) {\n var {\n number,\n weights,\n elementWise = true\n } = _ref2;\n var single = typeof number === 'undefined';\n if (single) {\n number = 1;\n }\n var createMatrix = isMatrix(possibles) ? possibles.create : isMatrix(weights) ? weights.create : null;\n possibles = possibles.valueOf(); // get Array\n if (weights) {\n weights = weights.valueOf(); // get Array\n }\n\n if (elementWise === true) {\n possibles = flatten(possibles);\n weights = flatten(weights);\n }\n var totalWeights = 0;\n if (typeof weights !== 'undefined') {\n if (weights.length !== possibles.length) {\n throw new Error('Weights must have the same length as possibles');\n }\n for (var i = 0, len = weights.length; i < len; i++) {\n if (!isNumber(weights[i]) || weights[i] < 0) {\n throw new Error('Weights must be an array of positive numbers');\n }\n totalWeights += weights[i];\n }\n }\n var length = possibles.length;\n var result = [];\n var pick;\n while (result.length < number) {\n if (typeof weights === 'undefined') {\n pick = possibles[Math.floor(rng() * length)];\n } else {\n var randKey = rng() * totalWeights;\n for (var _i = 0, _len = possibles.length; _i < _len; _i++) {\n randKey -= weights[_i];\n if (randKey < 0) {\n pick = possibles[_i];\n break;\n }\n }\n }\n result.push(pick);\n }\n return single ? result[0] : createMatrix ? createMatrix(result) : result;\n }\n});","/**\n * This is a util function for generating a random matrix recursively.\n * @param {number[]} size\n * @param {function} random\n * @returns {Array}\n */\nexport function randomMatrix(size, random) {\n var data = [];\n size = size.slice(0);\n if (size.length > 1) {\n for (var i = 0, length = size.shift(); i < length; i++) {\n data.push(randomMatrix(size, random));\n }\n } else {\n for (var _i = 0, _length = size.shift(); _i < _length; _i++) {\n data.push(random());\n }\n }\n return data;\n}","import { factory } from '../../utils/factory.js';\nimport { isMatrix } from '../../utils/is.js';\nimport { createRng } from './util/seededRNG.js';\nimport { randomMatrix } from './util/randomMatrix.js';\nvar name = 'random';\nvar dependencies = ['typed', 'config', '?on'];\nexport var createRandom = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n config,\n on\n } = _ref;\n // seeded pseudo random number generator\n var rng = createRng(config.randomSeed);\n if (on) {\n on('config', function (curr, prev) {\n if (curr.randomSeed !== prev.randomSeed) {\n rng = createRng(curr.randomSeed);\n }\n });\n }\n\n /**\n * Return a random number larger or equal to `min` and smaller than `max`\n * using a uniform distribution.\n *\n * Syntax:\n *\n * math.random() // generate a random number between 0 and 1\n * math.random(max) // generate a random number between 0 and max\n * math.random(min, max) // generate a random number between min and max\n * math.random(size) // generate a matrix with random numbers between 0 and 1\n * math.random(size, max) // generate a matrix with random numbers between 0 and max\n * math.random(size, min, max) // generate a matrix with random numbers between min and max\n *\n * Examples:\n *\n * math.random() // returns a random number between 0 and 1\n * math.random(100) // returns a random number between 0 and 100\n * math.random(30, 40) // returns a random number between 30 and 40\n * math.random([2, 3]) // returns a 2x3 matrix with random numbers between 0 and 1\n *\n * See also:\n *\n * randomInt, pickRandom\n *\n * @param {Array | Matrix} [size] If provided, an array or matrix with given\n * size and filled with random values is returned\n * @param {number} [min] Minimum boundary for the random value, included\n * @param {number} [max] Maximum boundary for the random value, excluded\n * @return {number | Array | Matrix} A random number\n */\n return typed(name, {\n '': () => _random(0, 1),\n number: max => _random(0, max),\n 'number, number': (min, max) => _random(min, max),\n 'Array | Matrix': size => _randomMatrix(size, 0, 1),\n 'Array | Matrix, number': (size, max) => _randomMatrix(size, 0, max),\n 'Array | Matrix, number, number': (size, min, max) => _randomMatrix(size, min, max)\n });\n function _randomMatrix(size, min, max) {\n var res = randomMatrix(size.valueOf(), () => _random(min, max));\n return isMatrix(size) ? size.create(res) : res;\n }\n function _random(min, max) {\n return min + rng() * (max - min);\n }\n});\n\n// number only implementation of random, no matrix support\n// TODO: there is quite some duplicate code in both createRandom and createRandomNumber, can we improve that?\nexport var createRandomNumber = /* #__PURE__ */factory(name, ['typed', 'config', '?on'], _ref2 => {\n var {\n typed,\n config,\n on,\n matrix\n } = _ref2;\n // seeded pseudo random number generator1\n var rng = createRng(config.randomSeed);\n if (on) {\n on('config', function (curr, prev) {\n if (curr.randomSeed !== prev.randomSeed) {\n rng = createRng(curr.randomSeed);\n }\n });\n }\n return typed(name, {\n '': () => _random(0, 1),\n number: max => _random(0, max),\n 'number, number': (min, max) => _random(min, max)\n });\n function _random(min, max) {\n return min + rng() * (max - min);\n }\n});","import { factory } from '../../utils/factory.js';\nimport { randomMatrix } from './util/randomMatrix.js';\nimport { createRng } from './util/seededRNG.js';\nimport { isMatrix } from '../../utils/is.js';\nvar name = 'randomInt';\nvar dependencies = ['typed', 'config', '?on'];\nexport var createRandomInt = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n config,\n on\n } = _ref;\n // seeded pseudo random number generator\n var rng = createRng(config.randomSeed);\n if (on) {\n on('config', function (curr, prev) {\n if (curr.randomSeed !== prev.randomSeed) {\n rng = createRng(curr.randomSeed);\n }\n });\n }\n\n /**\n * Return a random integer number larger or equal to `min` and smaller than `max`\n * using a uniform distribution.\n *\n * Syntax:\n *\n * math.randomInt() // generate a random integer between 0 and 1\n * math.randomInt(max) // generate a random integer between 0 and max\n * math.randomInt(min, max) // generate a random integer between min and max\n * math.randomInt(size) // generate a matrix with random integer between 0 and 1\n * math.randomInt(size, max) // generate a matrix with random integer between 0 and max\n * math.randomInt(size, min, max) // generate a matrix with random integer between min and max\n *\n * Examples:\n *\n * math.randomInt(100) // returns a random integer between 0 and 100\n * math.randomInt(30, 40) // returns a random integer between 30 and 40\n * math.randomInt([2, 3]) // returns a 2x3 matrix with random integers between 0 and 1\n *\n * See also:\n *\n * random, pickRandom\n *\n * @param {Array | Matrix} [size] If provided, an array or matrix with given\n * size and filled with random values is returned\n * @param {number} [min] Minimum boundary for the random value, included\n * @param {number} [max] Maximum boundary for the random value, excluded\n * @return {number | Array | Matrix} A random integer value\n */\n return typed(name, {\n '': () => _randomInt(0, 1),\n number: max => _randomInt(0, max),\n 'number, number': (min, max) => _randomInt(min, max),\n 'Array | Matrix': size => _randomIntMatrix(size, 0, 1),\n 'Array | Matrix, number': (size, max) => _randomIntMatrix(size, 0, max),\n 'Array | Matrix, number, number': (size, min, max) => _randomIntMatrix(size, min, max)\n });\n function _randomIntMatrix(size, min, max) {\n var res = randomMatrix(size.valueOf(), () => _randomInt(min, max));\n return isMatrix(size) ? size.create(res) : res;\n }\n function _randomInt(min, max) {\n return Math.floor(min + rng() * (max - min));\n }\n});","import { factory } from '../../utils/factory.js';\nimport { isNumber } from '../../utils/is.js';\nvar name = 'stirlingS2';\nvar dependencies = ['typed', 'addScalar', 'subtract', 'multiplyScalar', 'divideScalar', 'pow', 'factorial', 'combinations', 'isNegative', 'isInteger', 'number', '?bignumber', 'larger'];\nexport var createStirlingS2 = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n addScalar,\n subtract,\n multiplyScalar,\n divideScalar,\n pow,\n factorial,\n combinations,\n isNegative,\n isInteger,\n number,\n bignumber,\n larger\n } = _ref;\n var smallCache = [];\n var bigCache = [];\n /**\n * The Stirling numbers of the second kind, counts the number of ways to partition\n * a set of n labelled objects into k nonempty unlabelled subsets.\n * stirlingS2 only takes integer arguments.\n * The following condition must be enforced: k <= n.\n *\n * If n = k or k = 1 <= n, then s(n,k) = 1\n * If k = 0 < n, then s(n,k) = 0\n *\n * Note that if either n or k is supplied as a BigNumber, the result will be\n * as well.\n *\n * Syntax:\n *\n * math.stirlingS2(n, k)\n *\n * Examples:\n *\n * math.stirlingS2(5, 3) //returns 25\n *\n * See also:\n *\n * bellNumbers\n *\n * @param {Number | BigNumber} n Total number of objects in the set\n * @param {Number | BigNumber} k Number of objects in the subset\n * @return {Number | BigNumber} S(n,k)\n */\n return typed(name, {\n 'number | BigNumber, number | BigNumber': function numberBigNumberNumberBigNumber(n, k) {\n if (!isInteger(n) || isNegative(n) || !isInteger(k) || isNegative(k)) {\n throw new TypeError('Non-negative integer value expected in function stirlingS2');\n } else if (larger(k, n)) {\n throw new TypeError('k must be less than or equal to n in function stirlingS2');\n }\n var big = !(isNumber(n) && isNumber(k));\n var cache = big ? bigCache : smallCache;\n var make = big ? bignumber : number;\n var nn = number(n);\n var nk = number(k);\n /* See if we already have the value: */\n if (cache[nn] && cache[nn].length > nk) {\n return cache[nn][nk];\n }\n /* Fill the cache */\n for (var m = 0; m <= nn; ++m) {\n if (!cache[m]) {\n cache[m] = [m === 0 ? make(1) : make(0)];\n }\n if (m === 0) continue;\n var row = cache[m];\n var prev = cache[m - 1];\n for (var i = row.length; i <= m && i <= nk; ++i) {\n if (i === m) {\n row[i] = 1;\n } else {\n row[i] = addScalar(multiplyScalar(make(i), prev[i]), prev[i - 1]);\n }\n }\n }\n return cache[nn][nk];\n }\n });\n});","import { factory } from '../../utils/factory.js';\nvar name = 'bellNumbers';\nvar dependencies = ['typed', 'addScalar', 'isNegative', 'isInteger', 'stirlingS2'];\nexport var createBellNumbers = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n addScalar,\n isNegative,\n isInteger,\n stirlingS2\n } = _ref;\n /**\n * The Bell Numbers count the number of partitions of a set. A partition is a pairwise disjoint subset of S whose union is S.\n * bellNumbers only takes integer arguments.\n * The following condition must be enforced: n >= 0\n *\n * Syntax:\n *\n * math.bellNumbers(n)\n *\n * Examples:\n *\n * math.bellNumbers(3) // returns 5\n * math.bellNumbers(8) // returns 4140\n *\n * See also:\n *\n * stirlingS2\n *\n * @param {Number | BigNumber} n Total number of objects in the set\n * @return {Number | BigNumber} B(n)\n */\n return typed(name, {\n 'number | BigNumber': function numberBigNumber(n) {\n if (!isInteger(n) || isNegative(n)) {\n throw new TypeError('Non-negative integer value expected in function bellNumbers');\n }\n\n // Sum (k=0, n) S(n,k).\n var result = 0;\n for (var i = 0; i <= n; i++) {\n result = addScalar(result, stirlingS2(n, i));\n }\n return result;\n }\n });\n});","import { factory } from '../../utils/factory.js';\nvar name = 'catalan';\nvar dependencies = ['typed', 'addScalar', 'divideScalar', 'multiplyScalar', 'combinations', 'isNegative', 'isInteger'];\nexport var createCatalan = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n addScalar,\n divideScalar,\n multiplyScalar,\n combinations,\n isNegative,\n isInteger\n } = _ref;\n /**\n * The Catalan Numbers enumerate combinatorial structures of many different types.\n * catalan only takes integer arguments.\n * The following condition must be enforced: n >= 0\n *\n * Syntax:\n *\n * math.catalan(n)\n *\n * Examples:\n *\n * math.catalan(3) // returns 5\n * math.catalan(8) // returns 1430\n *\n * See also:\n *\n * bellNumbers\n *\n * @param {Number | BigNumber} n nth Catalan number\n * @return {Number | BigNumber} Cn(n)\n */\n return typed(name, {\n 'number | BigNumber': function numberBigNumber(n) {\n if (!isInteger(n) || isNegative(n)) {\n throw new TypeError('Non-negative integer value expected in function catalan');\n }\n return divideScalar(combinations(multiplyScalar(n, 2), n), addScalar(n, 1));\n }\n });\n});","import { factory } from '../../utils/factory.js';\nvar name = 'composition';\nvar dependencies = ['typed', 'addScalar', 'combinations', 'isNegative', 'isPositive', 'isInteger', 'larger'];\nexport var createComposition = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n addScalar,\n combinations,\n isPositive,\n isNegative,\n isInteger,\n larger\n } = _ref;\n /**\n * The composition counts of n into k parts.\n *\n * composition only takes integer arguments.\n * The following condition must be enforced: k <= n.\n *\n * Syntax:\n *\n * math.composition(n, k)\n *\n * Examples:\n *\n * math.composition(5, 3) // returns 6\n *\n * See also:\n *\n * combinations\n *\n * @param {Number | BigNumber} n Total number of objects in the set\n * @param {Number | BigNumber} k Number of objects in the subset\n * @return {Number | BigNumber} Returns the composition counts of n into k parts.\n */\n return typed(name, {\n 'number | BigNumber, number | BigNumber': function numberBigNumberNumberBigNumber(n, k) {\n if (!isInteger(n) || !isPositive(n) || !isInteger(k) || !isPositive(k)) {\n throw new TypeError('Positive integer value expected in function composition');\n } else if (larger(k, n)) {\n throw new TypeError('k must be less than or equal to n in function composition');\n }\n return combinations(addScalar(n, -1), addScalar(k, -1));\n }\n });\n});","import { factory } from '../../utils/factory.js';\nvar name = 'leafCount';\nvar dependencies = ['parse', 'typed'];\nexport var createLeafCount = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n parse,\n typed\n } = _ref;\n // This does the real work, but we don't have to recurse through\n // a typed call if we separate it out\n function countLeaves(node) {\n var count = 0;\n node.forEach(n => {\n count += countLeaves(n);\n });\n return count || 1;\n }\n\n /**\n * Gives the number of \"leaf nodes\" in the parse tree of the given expression\n * A leaf node is one that has no subexpressions, essentially either a\n * symbol or a constant. Note that `5!` has just one leaf, the '5'; the\n * unary factorial operator does not add a leaf. On the other hand,\n * function symbols do add leaves, so `sin(x)/cos(x)` has four leaves.\n *\n * The `simplify()` function should generally not increase the `leafCount()`\n * of an expression, although currently there is no guarantee that it never\n * does so. In many cases, `simplify()` reduces the leaf count.\n *\n * Syntax:\n *\n * math.leafCount(expr)\n *\n * Examples:\n *\n * math.leafCount('x') // 1\n * math.leafCount(math.parse('a*d-b*c')) // 4\n * math.leafCount('[a,b;c,d][0,1]') // 6\n *\n * See also:\n *\n * simplify\n *\n * @param {Node|string} expr The expression to count the leaves of\n *\n * @return {number} The number of leaves of `expr`\n *\n */\n return typed(name, {\n Node: function Node(expr) {\n return countLeaves(expr);\n }\n });\n});","import { isConstantNode, isFunctionNode, isOperatorNode, isParenthesisNode } from '../../../utils/is.js';\nexport { isConstantNode, isSymbolNode as isVariableNode } from '../../../utils/is.js';\nexport function isNumericNode(x) {\n return isConstantNode(x) || isOperatorNode(x) && x.isUnary() && isConstantNode(x.args[0]);\n}\nexport function isConstantExpression(x) {\n if (isConstantNode(x)) {\n // Basic Constant types\n return true;\n }\n if ((isFunctionNode(x) || isOperatorNode(x)) && x.args.every(isConstantExpression)) {\n // Can be constant depending on arguments\n return true;\n }\n if (isParenthesisNode(x) && isConstantExpression(x.content)) {\n // Parenthesis are transparent\n return true;\n }\n return false; // Probably missing some edge cases\n}","import _defineProperty from \"@babel/runtime/helpers/defineProperty\";\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nimport { isFunctionNode, isOperatorNode, isParenthesisNode } from '../../../utils/is.js';\nimport { factory } from '../../../utils/factory.js';\nimport { hasOwnProperty } from '../../../utils/object.js';\nvar name = 'simplifyUtil';\nvar dependencies = ['FunctionNode', 'OperatorNode', 'SymbolNode'];\nexport var createUtil = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n FunctionNode,\n OperatorNode,\n SymbolNode\n } = _ref;\n // TODO commutative/associative properties rely on the arguments\n // e.g. multiply is not commutative for matrices\n // The properties should be calculated from an argument to simplify, or possibly something in math.config\n // the other option is for typed() to specify a return type so that we can evaluate the type of arguments\n\n /* So that properties of an operator fit on one line: */\n var T = true;\n var F = false;\n var defaultName = 'defaultF';\n var defaultContext = {\n /* */add: {\n trivial: T,\n total: T,\n commutative: T,\n associative: T\n },\n /**/unaryPlus: {\n trivial: T,\n total: T,\n commutative: T,\n associative: T\n },\n /* */subtract: {\n trivial: F,\n total: T,\n commutative: F,\n associative: F\n },\n /* */multiply: {\n trivial: T,\n total: T,\n commutative: T,\n associative: T\n },\n /* */divide: {\n trivial: F,\n total: T,\n commutative: F,\n associative: F\n },\n /* */paren: {\n trivial: T,\n total: T,\n commutative: T,\n associative: F\n },\n /* */defaultF: {\n trivial: F,\n total: T,\n commutative: F,\n associative: F\n }\n };\n var realContext = {\n divide: {\n total: F\n },\n log: {\n total: F\n }\n };\n var positiveContext = {\n subtract: {\n total: F\n },\n abs: {\n trivial: T\n },\n log: {\n total: T\n }\n };\n function hasProperty(nodeOrName, property) {\n var context = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : defaultContext;\n var name = defaultName;\n if (typeof nodeOrName === 'string') {\n name = nodeOrName;\n } else if (isOperatorNode(nodeOrName)) {\n name = nodeOrName.fn.toString();\n } else if (isFunctionNode(nodeOrName)) {\n name = nodeOrName.name;\n } else if (isParenthesisNode(nodeOrName)) {\n name = 'paren';\n }\n if (hasOwnProperty(context, name)) {\n var properties = context[name];\n if (hasOwnProperty(properties, property)) {\n return properties[property];\n }\n if (hasOwnProperty(defaultContext, name)) {\n return defaultContext[name][property];\n }\n }\n if (hasOwnProperty(context, defaultName)) {\n var _properties = context[defaultName];\n if (hasOwnProperty(_properties, property)) {\n return _properties[property];\n }\n return defaultContext[defaultName][property];\n }\n /* name not found in context and context has no global default */\n /* So use default context. */\n if (hasOwnProperty(defaultContext, name)) {\n var _properties2 = defaultContext[name];\n if (hasOwnProperty(_properties2, property)) {\n return _properties2[property];\n }\n }\n return defaultContext[defaultName][property];\n }\n function isCommutative(node) {\n var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultContext;\n return hasProperty(node, 'commutative', context);\n }\n function isAssociative(node) {\n var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultContext;\n return hasProperty(node, 'associative', context);\n }\n\n /**\n * Merge the given contexts, with primary overriding secondary\n * wherever they might conflict\n */\n function mergeContext(primary, secondary) {\n var merged = _objectSpread({}, primary);\n for (var prop in secondary) {\n if (hasOwnProperty(primary, prop)) {\n merged[prop] = _objectSpread(_objectSpread({}, secondary[prop]), primary[prop]);\n } else {\n merged[prop] = secondary[prop];\n }\n }\n return merged;\n }\n\n /**\n * Flatten all associative operators in an expression tree.\n * Assumes parentheses have already been removed.\n */\n function flatten(node, context) {\n if (!node.args || node.args.length === 0) {\n return node;\n }\n node.args = allChildren(node, context);\n for (var i = 0; i < node.args.length; i++) {\n flatten(node.args[i], context);\n }\n }\n\n /**\n * Get the children of a node as if it has been flattened.\n * TODO implement for FunctionNodes\n */\n function allChildren(node, context) {\n var op;\n var children = [];\n var findChildren = function findChildren(node) {\n for (var i = 0; i < node.args.length; i++) {\n var child = node.args[i];\n if (isOperatorNode(child) && op === child.op) {\n findChildren(child);\n } else {\n children.push(child);\n }\n }\n };\n if (isAssociative(node, context)) {\n op = node.op;\n findChildren(node);\n return children;\n } else {\n return node.args;\n }\n }\n\n /**\n * Unflatten all flattened operators to a right-heavy binary tree.\n */\n function unflattenr(node, context) {\n if (!node.args || node.args.length === 0) {\n return;\n }\n var makeNode = createMakeNodeFunction(node);\n var l = node.args.length;\n for (var i = 0; i < l; i++) {\n unflattenr(node.args[i], context);\n }\n if (l > 2 && isAssociative(node, context)) {\n var curnode = node.args.pop();\n while (node.args.length > 0) {\n curnode = makeNode([node.args.pop(), curnode]);\n }\n node.args = curnode.args;\n }\n }\n\n /**\n * Unflatten all flattened operators to a left-heavy binary tree.\n */\n function unflattenl(node, context) {\n if (!node.args || node.args.length === 0) {\n return;\n }\n var makeNode = createMakeNodeFunction(node);\n var l = node.args.length;\n for (var i = 0; i < l; i++) {\n unflattenl(node.args[i], context);\n }\n if (l > 2 && isAssociative(node, context)) {\n var curnode = node.args.shift();\n while (node.args.length > 0) {\n curnode = makeNode([curnode, node.args.shift()]);\n }\n node.args = curnode.args;\n }\n }\n function createMakeNodeFunction(node) {\n if (isOperatorNode(node)) {\n return function (args) {\n try {\n return new OperatorNode(node.op, node.fn, args, node.implicit);\n } catch (err) {\n console.error(err);\n return [];\n }\n };\n } else {\n return function (args) {\n return new FunctionNode(new SymbolNode(node.name), args);\n };\n }\n }\n return {\n createMakeNodeFunction,\n hasProperty,\n isCommutative,\n isAssociative,\n mergeContext,\n flatten,\n allChildren,\n unflattenr,\n unflattenl,\n defaultContext,\n realContext,\n positiveContext\n };\n});","import { isParenthesisNode } from '../../utils/is.js';\nimport { isConstantNode, isVariableNode, isNumericNode, isConstantExpression } from './simplify/wildcards.js';\nimport { factory } from '../../utils/factory.js';\nimport { createUtil } from './simplify/util.js';\nimport { hasOwnProperty } from '../../utils/object.js';\nimport { createEmptyMap, createMap } from '../../utils/map.js';\nvar name = 'simplify';\nvar dependencies = ['config', 'typed', 'parse', 'add', 'subtract', 'multiply', 'divide', 'pow', 'isZero', 'equal', 'resolve', 'simplifyConstant', 'simplifyCore', '?fraction', '?bignumber', 'mathWithTransform', 'matrix', 'AccessorNode', 'ArrayNode', 'ConstantNode', 'FunctionNode', 'IndexNode', 'ObjectNode', 'OperatorNode', 'ParenthesisNode', 'SymbolNode'];\nexport var createSimplify = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n config,\n typed,\n parse,\n add,\n subtract,\n multiply,\n divide,\n pow,\n isZero,\n equal,\n resolve,\n simplifyConstant,\n simplifyCore,\n fraction,\n bignumber,\n mathWithTransform,\n matrix,\n AccessorNode,\n ArrayNode,\n ConstantNode,\n FunctionNode,\n IndexNode,\n ObjectNode,\n OperatorNode,\n ParenthesisNode,\n SymbolNode\n } = _ref;\n var {\n hasProperty,\n isCommutative,\n isAssociative,\n mergeContext,\n flatten,\n unflattenr,\n unflattenl,\n createMakeNodeFunction,\n defaultContext,\n realContext,\n positiveContext\n } = createUtil({\n FunctionNode,\n OperatorNode,\n SymbolNode\n });\n\n /**\n * Simplify an expression tree.\n *\n * A list of rules are applied to an expression, repeating over the list until\n * no further changes are made.\n * It's possible to pass a custom set of rules to the function as second\n * argument. A rule can be specified as an object, string, or function:\n *\n * const rules = [\n * { l: 'n1*n3 + n2*n3', r: '(n1+n2)*n3' },\n * 'n1*n3 + n2*n3 -> (n1+n2)*n3',\n * function (node) {\n * // ... return a new node or return the node unchanged\n * return node\n * }\n * ]\n *\n * String and object rules consist of a left and right pattern. The left is\n * used to match against the expression and the right determines what matches\n * are replaced with. The main difference between a pattern and a normal\n * expression is that variables starting with the following characters are\n * interpreted as wildcards:\n *\n * - 'n' - Matches any node [Node]\n * - 'c' - Matches a constant literal (5 or 3.2) [ConstantNode]\n * - 'cl' - Matches a constant literal; same as c [ConstantNode]\n * - 'cd' - Matches a decimal literal (5 or -3.2) [ConstantNode or unaryMinus wrapping a ConstantNode]\n * - 'ce' - Matches a constant expression (-5 or √3) [Expressions consisting of only ConstantNodes, functions, and operators]\n * - 'v' - Matches a variable; anything not matched by c (-5 or x) [Node that is not a ConstantNode]\n * - 'vl' - Matches a variable literal (x or y) [SymbolNode]\n * - 'vd' - Matches a non-decimal expression; anything not matched by cd (x or √3) [Node that is not a ConstantNode or unaryMinus that is wrapping a ConstantNode]\n * - 've' - Matches a variable expression; anything not matched by ce (x or 2x) [Expressions that contain a SymbolNode or other non-constant term]\n *\n * The default list of rules is exposed on the function as `simplify.rules`\n * and can be used as a basis to built a set of custom rules. Note that since\n * the `simplifyCore` function is in the default list of rules, by default\n * simplify will convert any function calls in the expression that have\n * operator equivalents to their operator forms.\n *\n * To specify a rule as a string, separate the left and right pattern by '->'\n * When specifying a rule as an object, the following keys are meaningful:\n * - l - the left pattern\n * - r - the right pattern\n * - s - in lieu of l and r, the string form that is broken at -> to give them\n * - repeat - whether to repeat this rule until the expression stabilizes\n * - assuming - gives a context object, as in the 'context' option to\n * simplify. Every property in the context object must match the current\n * context in order, or else the rule will not be applied.\n * - imposeContext - gives a context object, as in the 'context' option to\n * simplify. Any settings specified will override the incoming context\n * for all matches of this rule.\n *\n * For more details on the theory, see:\n *\n * - [Strategies for simplifying math expressions (Stackoverflow)](https://stackoverflow.com/questions/7540227/strategies-for-simplifying-math-expressions)\n * - [Symbolic computation - Simplification (Wikipedia)](https://en.wikipedia.org/wiki/Symbolic_computation#Simplification)\n *\n * An optional `options` argument can be passed as last argument of `simplify`.\n * Currently available options (defaults in parentheses):\n * - `consoleDebug` (false): whether to write the expression being simplified\n * and any changes to it, along with the rule responsible, to console\n * - `context` (simplify.defaultContext): an object giving properties of\n * each operator, which determine what simplifications are allowed. The\n * currently meaningful properties are commutative, associative,\n * total (whether the operation is defined for all arguments), and\n * trivial (whether the operation applied to a single argument leaves\n * that argument unchanged). The default context is very permissive and\n * allows almost all simplifications. Only properties differing from\n * the default need to be specified; the default context is used as a\n * fallback. Additional contexts `simplify.realContext` and\n * `simplify.positiveContext` are supplied to cause simplify to perform\n * just simplifications guaranteed to preserve all values of the expression\n * assuming all variables and subexpressions are real numbers or\n * positive real numbers, respectively. (Note that these are in some cases\n * more restrictive than the default context; for example, the default\n * context will allow `x/x` to simplify to 1, whereas\n * `simplify.realContext` will not, as `0/0` is not equal to 1.)\n * - `exactFractions` (true): whether to try to convert all constants to\n * exact rational numbers.\n * - `fractionsLimit` (10000): when `exactFractions` is true, constants will\n * be expressed as fractions only when both numerator and denominator\n * are smaller than `fractionsLimit`.\n *\n * Syntax:\n *\n * math.simplify(expr)\n * math.simplify(expr, rules)\n * math.simplify(expr, rules)\n * math.simplify(expr, rules, scope)\n * math.simplify(expr, rules, scope, options)\n * math.simplify(expr, scope)\n * math.simplify(expr, scope, options)\n *\n * Examples:\n *\n * math.simplify('2 * 1 * x ^ (2 - 1)') // Node \"2 * x\"\n * math.simplify('2 * 3 * x', {x: 4}) // Node \"24\"\n * const f = math.parse('2 * 1 * x ^ (2 - 1)')\n * math.simplify(f) // Node \"2 * x\"\n * math.simplify('0.4 * x', {}, {exactFractions: true}) // Node \"x * 2 / 5\"\n * math.simplify('0.4 * x', {}, {exactFractions: false}) // Node \"0.4 * x\"\n *\n * See also:\n *\n * simplifyCore, derivative, evaluate, parse, rationalize, resolve\n *\n * @param {Node | string} expr\n * The expression to be simplified\n * @param {SimplifyRule[]} [rules]\n * Optional list with custom rules\n * @param {Object} [scope] Optional scope with variables\n * @param {SimplifyOptions} [options] Optional configuration settings\n * @return {Node} Returns the simplified form of `expr`\n */\n typed.addConversion({\n from: 'Object',\n to: 'Map',\n convert: createMap\n });\n var simplify = typed('simplify', {\n Node: _simplify,\n 'Node, Map': (expr, scope) => _simplify(expr, false, scope),\n 'Node, Map, Object': (expr, scope, options) => _simplify(expr, false, scope, options),\n 'Node, Array': _simplify,\n 'Node, Array, Map': _simplify,\n 'Node, Array, Map, Object': _simplify\n });\n typed.removeConversion({\n from: 'Object',\n to: 'Map',\n convert: createMap\n });\n simplify.defaultContext = defaultContext;\n simplify.realContext = realContext;\n simplify.positiveContext = positiveContext;\n function removeParens(node) {\n return node.transform(function (node, path, parent) {\n return isParenthesisNode(node) ? removeParens(node.content) : node;\n });\n }\n\n // All constants that are allowed in rules\n var SUPPORTED_CONSTANTS = {\n true: true,\n false: true,\n e: true,\n i: true,\n Infinity: true,\n LN2: true,\n LN10: true,\n LOG2E: true,\n LOG10E: true,\n NaN: true,\n phi: true,\n pi: true,\n SQRT1_2: true,\n SQRT2: true,\n tau: true\n // null: false,\n // undefined: false,\n // version: false,\n };\n\n // Array of strings, used to build the ruleSet.\n // Each l (left side) and r (right side) are parsed by\n // the expression parser into a node tree.\n // Left hand sides are matched to subtrees within the\n // expression to be parsed and replaced with the right\n // hand side.\n // TODO: Add support for constraints on constants (either in the form of a '=' expression or a callback [callback allows things like comparing symbols alphabetically])\n // To evaluate lhs constants for rhs constants, use: { l: 'c1+c2', r: 'c3', evaluate: 'c3 = c1 + c2' }. Multiple assignments are separated by ';' in block format.\n // It is possible to get into an infinite loop with conflicting rules\n simplify.rules = [simplifyCore,\n // { l: 'n+0', r: 'n' }, // simplifyCore\n // { l: 'n^0', r: '1' }, // simplifyCore\n // { l: '0*n', r: '0' }, // simplifyCore\n // { l: 'n/n', r: '1'}, // simplifyCore\n // { l: 'n^1', r: 'n' }, // simplifyCore\n // { l: '+n1', r:'n1' }, // simplifyCore\n // { l: 'n--n1', r:'n+n1' }, // simplifyCore\n {\n l: 'log(e)',\n r: '1'\n },\n // temporary rules\n // Note initially we tend constants to the right because like-term\n // collection prefers the left, and we would rather collect nonconstants\n {\n s: 'n-n1 -> n+-n1',\n // temporarily replace 'subtract' so we can further flatten the 'add' operator\n assuming: {\n subtract: {\n total: true\n }\n }\n }, {\n s: 'n-n -> 0',\n // partial alternative when we can't always subtract\n assuming: {\n subtract: {\n total: false\n }\n }\n }, {\n s: '-(cl*v) -> v * (-cl)',\n // make non-constant terms positive\n assuming: {\n multiply: {\n commutative: true\n },\n subtract: {\n total: true\n }\n }\n }, {\n s: '-(cl*v) -> (-cl) * v',\n // non-commutative version, part 1\n assuming: {\n multiply: {\n commutative: false\n },\n subtract: {\n total: true\n }\n }\n }, {\n s: '-(v*cl) -> v * (-cl)',\n // non-commutative version, part 2\n assuming: {\n multiply: {\n commutative: false\n },\n subtract: {\n total: true\n }\n }\n }, {\n l: '-(n1/n2)',\n r: '-n1/n2'\n }, {\n l: '-v',\n r: 'v * (-1)'\n },\n // finish making non-constant terms positive\n {\n l: '(n1 + n2)*(-1)',\n r: 'n1*(-1) + n2*(-1)',\n repeat: true\n },\n // expand negations to achieve as much sign cancellation as possible\n {\n l: 'n/n1^n2',\n r: 'n*n1^-n2'\n },\n // temporarily replace 'divide' so we can further flatten the 'multiply' operator\n {\n l: 'n/n1',\n r: 'n*n1^-1'\n }, {\n s: '(n1*n2)^n3 -> n1^n3 * n2^n3',\n assuming: {\n multiply: {\n commutative: true\n }\n }\n }, {\n s: '(n1*n2)^(-1) -> n2^(-1) * n1^(-1)',\n assuming: {\n multiply: {\n commutative: false\n }\n }\n },\n // expand nested exponentiation\n {\n s: '(n ^ n1) ^ n2 -> n ^ (n1 * n2)',\n assuming: {\n divide: {\n total: true\n }\n } // 1/(1/n) = n needs 1/n to exist\n },\n // collect like factors; into a sum, only do this for nonconstants\n {\n l: ' vd * ( vd * n1 + n2)',\n r: 'vd^2 * n1 + vd * n2'\n }, {\n s: ' vd * (vd^n4 * n1 + n2) -> vd^(1+n4) * n1 + vd * n2',\n assuming: {\n divide: {\n total: true\n }\n } // v*1/v = v^(1+-1) needs 1/v\n }, {\n s: 'vd^n3 * ( vd * n1 + n2) -> vd^(n3+1) * n1 + vd^n3 * n2',\n assuming: {\n divide: {\n total: true\n }\n }\n }, {\n s: 'vd^n3 * (vd^n4 * n1 + n2) -> vd^(n3+n4) * n1 + vd^n3 * n2',\n assuming: {\n divide: {\n total: true\n }\n }\n }, {\n l: 'n*n',\n r: 'n^2'\n }, {\n s: 'n * n^n1 -> n^(n1+1)',\n assuming: {\n divide: {\n total: true\n }\n } // n*1/n = n^(-1+1) needs 1/n\n }, {\n s: 'n^n1 * n^n2 -> n^(n1+n2)',\n assuming: {\n divide: {\n total: true\n }\n } // ditto for n^2*1/n^2\n },\n // Unfortunately, to deal with more complicated cancellations, it\n // becomes necessary to simplify constants twice per pass. It's not\n // terribly expensive compared to matching rules, so this should not\n // pose a performance problem.\n simplifyConstant,\n // First: before collecting like terms\n\n // collect like terms\n {\n s: 'n+n -> 2*n',\n assuming: {\n add: {\n total: true\n }\n } // 2 = 1 + 1 needs to exist\n }, {\n l: 'n+-n',\n r: '0'\n }, {\n l: 'vd*n + vd',\n r: 'vd*(n+1)'\n },\n // NOTE: leftmost position is special:\n {\n l: 'n3*n1 + n3*n2',\n r: 'n3*(n1+n2)'\n },\n // All sub-monomials tried there.\n {\n l: 'n3^(-n4)*n1 + n3 * n2',\n r: 'n3^(-n4)*(n1 + n3^(n4+1) *n2)'\n }, {\n l: 'n3^(-n4)*n1 + n3^n5 * n2',\n r: 'n3^(-n4)*(n1 + n3^(n4+n5)*n2)'\n },\n // noncommutative additional cases (term collection & factoring)\n {\n s: 'n*vd + vd -> (n+1)*vd',\n assuming: {\n multiply: {\n commutative: false\n }\n }\n }, {\n s: 'vd + n*vd -> (1+n)*vd',\n assuming: {\n multiply: {\n commutative: false\n }\n }\n }, {\n s: 'n1*n3 + n2*n3 -> (n1+n2)*n3',\n assuming: {\n multiply: {\n commutative: false\n }\n }\n }, {\n s: 'n^n1 * n -> n^(n1+1)',\n assuming: {\n divide: {\n total: true\n },\n multiply: {\n commutative: false\n }\n }\n }, {\n s: 'n1*n3^(-n4) + n2 * n3 -> (n1 + n2*n3^(n4 + 1))*n3^(-n4)',\n assuming: {\n multiply: {\n commutative: false\n }\n }\n }, {\n s: 'n1*n3^(-n4) + n2 * n3^n5 -> (n1 + n2*n3^(n4 + n5))*n3^(-n4)',\n assuming: {\n multiply: {\n commutative: false\n }\n }\n }, {\n l: 'n*cd + cd',\n r: '(n+1)*cd'\n }, {\n s: 'cd*n + cd -> cd*(n+1)',\n assuming: {\n multiply: {\n commutative: false\n }\n }\n }, {\n s: 'cd + cd*n -> cd*(1+n)',\n assuming: {\n multiply: {\n commutative: false\n }\n }\n }, simplifyConstant,\n // Second: before returning expressions to \"standard form\"\n\n // make factors positive (and undo 'make non-constant terms positive')\n {\n s: '(-n)*n1 -> -(n*n1)',\n assuming: {\n subtract: {\n total: true\n }\n }\n }, {\n s: 'n1*(-n) -> -(n1*n)',\n // in case * non-commutative\n assuming: {\n subtract: {\n total: true\n },\n multiply: {\n commutative: false\n }\n }\n },\n // final ordering of constants\n {\n s: 'ce+ve -> ve+ce',\n assuming: {\n add: {\n commutative: true\n }\n },\n imposeContext: {\n add: {\n commutative: false\n }\n }\n }, {\n s: 'vd*cd -> cd*vd',\n assuming: {\n multiply: {\n commutative: true\n }\n },\n imposeContext: {\n multiply: {\n commutative: false\n }\n }\n },\n // undo temporary rules\n // { l: '(-1) * n', r: '-n' }, // #811 added test which proved this is redundant\n {\n l: 'n+-n1',\n r: 'n-n1'\n },\n // undo replace 'subtract'\n {\n l: 'n+-(n1)',\n r: 'n-(n1)'\n }, {\n s: 'n*(n1^-1) -> n/n1',\n // undo replace 'divide'; for * commutative\n assuming: {\n multiply: {\n commutative: true\n }\n } // o.w. / not conventional\n }, {\n s: 'n*n1^-n2 -> n/n1^n2',\n assuming: {\n multiply: {\n commutative: true\n }\n } // o.w. / not conventional\n }, {\n s: 'n^-1 -> 1/n',\n assuming: {\n multiply: {\n commutative: true\n }\n } // o.w. / not conventional\n }, {\n l: 'n^1',\n r: 'n'\n },\n // can be produced by power cancellation\n {\n s: 'n*(n1/n2) -> (n*n1)/n2',\n // '*' before '/'\n assuming: {\n multiply: {\n associative: true\n }\n }\n }, {\n s: 'n-(n1+n2) -> n-n1-n2',\n // '-' before '+'\n assuming: {\n addition: {\n associative: true,\n commutative: true\n }\n }\n },\n // { l: '(n1/n2)/n3', r: 'n1/(n2*n3)' },\n // { l: '(n*n1)/(n*n2)', r: 'n1/n2' },\n\n // simplifyConstant can leave an extra factor of 1, which can always\n // be eliminated, since the identity always commutes\n {\n l: '1*n',\n r: 'n',\n imposeContext: {\n multiply: {\n commutative: true\n }\n }\n }, {\n s: 'n1/(n2/n3) -> (n1*n3)/n2',\n assuming: {\n multiply: {\n associative: true\n }\n }\n }, {\n l: 'n1/(-n2)',\n r: '-n1/n2'\n }];\n\n /**\n * Takes any rule object as allowed by the specification in simplify\n * and puts it in a standard form used by applyRule\n */\n function _canonicalizeRule(ruleObject, context) {\n var newRule = {};\n if (ruleObject.s) {\n var lr = ruleObject.s.split('->');\n if (lr.length === 2) {\n newRule.l = lr[0];\n newRule.r = lr[1];\n } else {\n throw SyntaxError('Could not parse rule: ' + ruleObject.s);\n }\n } else {\n newRule.l = ruleObject.l;\n newRule.r = ruleObject.r;\n }\n newRule.l = removeParens(parse(newRule.l));\n newRule.r = removeParens(parse(newRule.r));\n for (var prop of ['imposeContext', 'repeat', 'assuming']) {\n if (prop in ruleObject) {\n newRule[prop] = ruleObject[prop];\n }\n }\n if (ruleObject.evaluate) {\n newRule.evaluate = parse(ruleObject.evaluate);\n }\n if (isAssociative(newRule.l, context)) {\n var nonCommutative = !isCommutative(newRule.l, context);\n var leftExpandsym;\n // Gen. the LHS placeholder used in this NC-context specific expansion rules\n if (nonCommutative) leftExpandsym = _getExpandPlaceholderSymbol();\n var makeNode = createMakeNodeFunction(newRule.l);\n var expandsym = _getExpandPlaceholderSymbol();\n newRule.expanded = {};\n newRule.expanded.l = makeNode([newRule.l, expandsym]);\n // Push the expandsym into the deepest possible branch.\n // This helps to match the newRule against nodes returned from getSplits() later on.\n flatten(newRule.expanded.l, context);\n unflattenr(newRule.expanded.l, context);\n newRule.expanded.r = makeNode([newRule.r, expandsym]);\n\n // In and for a non-commutative context, attempting with yet additional expansion rules makes\n // way for more matches cases of multi-arg expressions; such that associative rules (such as\n // 'n*n -> n^2') can be applied to exprs. such as 'a * b * b' and 'a * b * b * a'.\n if (nonCommutative) {\n // 'Non-commutative' 1: LHS (placeholder) only\n newRule.expandedNC1 = {};\n newRule.expandedNC1.l = makeNode([leftExpandsym, newRule.l]);\n newRule.expandedNC1.r = makeNode([leftExpandsym, newRule.r]);\n // 'Non-commutative' 2: farmost LHS and RHS placeholders\n newRule.expandedNC2 = {};\n newRule.expandedNC2.l = makeNode([leftExpandsym, newRule.expanded.l]);\n newRule.expandedNC2.r = makeNode([leftExpandsym, newRule.expanded.r]);\n }\n }\n return newRule;\n }\n\n /**\n * Parse the string array of rules into nodes\n *\n * Example syntax for rules:\n *\n * Position constants to the left in a product:\n * { l: 'n1 * c1', r: 'c1 * n1' }\n * n1 is any Node, and c1 is a ConstantNode.\n *\n * Apply difference of squares formula:\n * { l: '(n1 - n2) * (n1 + n2)', r: 'n1^2 - n2^2' }\n * n1, n2 mean any Node.\n *\n * Short hand notation:\n * 'n1 * c1 -> c1 * n1'\n */\n function _buildRules(rules, context) {\n // Array of rules to be used to simplify expressions\n var ruleSet = [];\n for (var i = 0; i < rules.length; i++) {\n var rule = rules[i];\n var newRule = void 0;\n var ruleType = typeof rule;\n switch (ruleType) {\n case 'string':\n rule = {\n s: rule\n };\n /* falls through */\n case 'object':\n newRule = _canonicalizeRule(rule, context);\n break;\n case 'function':\n newRule = rule;\n break;\n default:\n throw TypeError('Unsupported type of rule: ' + ruleType);\n }\n // console.log('Adding rule: ' + rules[i])\n // console.log(newRule)\n ruleSet.push(newRule);\n }\n return ruleSet;\n }\n var _lastsym = 0;\n function _getExpandPlaceholderSymbol() {\n return new SymbolNode('_p' + _lastsym++);\n }\n function _simplify(expr, rules) {\n var scope = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : createEmptyMap();\n var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n var debug = options.consoleDebug;\n rules = _buildRules(rules || simplify.rules, options.context);\n var res = resolve(expr, scope);\n res = removeParens(res);\n var visited = {};\n var str = res.toString({\n parenthesis: 'all'\n });\n while (!visited[str]) {\n visited[str] = true;\n _lastsym = 0; // counter for placeholder symbols\n var laststr = str;\n if (debug) console.log('Working on: ', str);\n for (var i = 0; i < rules.length; i++) {\n var rulestr = '';\n if (typeof rules[i] === 'function') {\n res = rules[i](res, options);\n if (debug) rulestr = rules[i].name;\n } else {\n flatten(res, options.context);\n res = applyRule(res, rules[i], options.context);\n if (debug) {\n rulestr = \"\".concat(rules[i].l.toString(), \" -> \").concat(rules[i].r.toString());\n }\n }\n if (debug) {\n var newstr = res.toString({\n parenthesis: 'all'\n });\n if (newstr !== laststr) {\n console.log('Applying', rulestr, 'produced', newstr);\n laststr = newstr;\n }\n }\n /* Use left-heavy binary tree internally,\n * since custom rule functions may expect it\n */\n unflattenl(res, options.context);\n }\n str = res.toString({\n parenthesis: 'all'\n });\n }\n return res;\n }\n function mapRule(nodes, rule, context) {\n var resNodes = nodes;\n if (nodes) {\n for (var i = 0; i < nodes.length; ++i) {\n var newNode = applyRule(nodes[i], rule, context);\n if (newNode !== nodes[i]) {\n if (resNodes === nodes) {\n resNodes = nodes.slice();\n }\n resNodes[i] = newNode;\n }\n }\n }\n return resNodes;\n }\n\n /**\n * Returns a simplfied form of node, or the original node if no simplification was possible.\n *\n * @param {ConstantNode | SymbolNode | ParenthesisNode | FunctionNode | OperatorNode} node\n * @param {Object | Function} rule\n * @param {Object} context -- information about assumed properties of operators\n * @return {ConstantNode | SymbolNode | ParenthesisNode | FunctionNode | OperatorNode} The simplified form of `expr`, or the original node if no simplification was possible.\n */\n function applyRule(node, rule, context) {\n // console.log('Entering applyRule(\"', rule.l.toString({parenthesis:'all'}), '->', rule.r.toString({parenthesis:'all'}), '\",', node.toString({parenthesis:'all'}),')')\n\n // check that the assumptions for this rule are satisfied by the current\n // context:\n if (rule.assuming) {\n for (var symbol in rule.assuming) {\n for (var property in rule.assuming[symbol]) {\n if (hasProperty(symbol, property, context) !== rule.assuming[symbol][property]) {\n return node;\n }\n }\n }\n }\n var mergedContext = mergeContext(rule.imposeContext, context);\n\n // Do not clone node unless we find a match\n var res = node;\n\n // First replace our child nodes with their simplified versions\n // If a child could not be simplified, applying the rule to it\n // will have no effect since the node is returned unchanged\n if (res instanceof OperatorNode || res instanceof FunctionNode) {\n var newArgs = mapRule(res.args, rule, context);\n if (newArgs !== res.args) {\n res = res.clone();\n res.args = newArgs;\n }\n } else if (res instanceof ParenthesisNode) {\n if (res.content) {\n var newContent = applyRule(res.content, rule, context);\n if (newContent !== res.content) {\n res = new ParenthesisNode(newContent);\n }\n }\n } else if (res instanceof ArrayNode) {\n var newItems = mapRule(res.items, rule, context);\n if (newItems !== res.items) {\n res = new ArrayNode(newItems);\n }\n } else if (res instanceof AccessorNode) {\n var newObj = res.object;\n if (res.object) {\n newObj = applyRule(res.object, rule, context);\n }\n var newIndex = res.index;\n if (res.index) {\n newIndex = applyRule(res.index, rule, context);\n }\n if (newObj !== res.object || newIndex !== res.index) {\n res = new AccessorNode(newObj, newIndex);\n }\n } else if (res instanceof IndexNode) {\n var newDims = mapRule(res.dimensions, rule, context);\n if (newDims !== res.dimensions) {\n res = new IndexNode(newDims);\n }\n } else if (res instanceof ObjectNode) {\n var changed = false;\n var newProps = {};\n for (var prop in res.properties) {\n newProps[prop] = applyRule(res.properties[prop], rule, context);\n if (newProps[prop] !== res.properties[prop]) {\n changed = true;\n }\n }\n if (changed) {\n res = new ObjectNode(newProps);\n }\n }\n\n // Try to match a rule against this node\n var repl = rule.r;\n var matches = _ruleMatch(rule.l, res, mergedContext)[0];\n\n // If the rule is associative operator, we can try matching it while allowing additional terms.\n // This allows us to match rules like 'n+n' to the expression '(1+x)+x' or even 'x+1+x' if the operator is commutative.\n if (!matches && rule.expanded) {\n repl = rule.expanded.r;\n matches = _ruleMatch(rule.expanded.l, res, mergedContext)[0];\n }\n // Additional, non-commutative context expansion-rules\n if (!matches && rule.expandedNC1) {\n repl = rule.expandedNC1.r;\n matches = _ruleMatch(rule.expandedNC1.l, res, mergedContext)[0];\n if (!matches) {\n // Existence of NC1 implies NC2\n repl = rule.expandedNC2.r;\n matches = _ruleMatch(rule.expandedNC2.l, res, mergedContext)[0];\n }\n }\n if (matches) {\n // const before = res.toString({parenthesis: 'all'})\n\n // Create a new node by cloning the rhs of the matched rule\n // we keep any implicit multiplication state if relevant\n var implicit = res.implicit;\n res = repl.clone();\n if (implicit && 'implicit' in repl) {\n res.implicit = true;\n }\n\n // Replace placeholders with their respective nodes without traversing deeper into the replaced nodes\n res = res.transform(function (node) {\n if (node.isSymbolNode && hasOwnProperty(matches.placeholders, node.name)) {\n return matches.placeholders[node.name].clone();\n } else {\n return node;\n }\n });\n\n // const after = res.toString({parenthesis: 'all'})\n // console.log('Simplified ' + before + ' to ' + after)\n }\n\n if (rule.repeat && res !== node) {\n res = applyRule(res, rule, context);\n }\n return res;\n }\n\n /**\n * Get (binary) combinations of a flattened binary node\n * e.g. +(node1, node2, node3) -> [\n * +(node1, +(node2, node3)),\n * +(node2, +(node1, node3)),\n * +(node3, +(node1, node2))]\n *\n */\n function getSplits(node, context) {\n var res = [];\n var right, rightArgs;\n var makeNode = createMakeNodeFunction(node);\n if (isCommutative(node, context)) {\n for (var i = 0; i < node.args.length; i++) {\n rightArgs = node.args.slice(0);\n rightArgs.splice(i, 1);\n right = rightArgs.length === 1 ? rightArgs[0] : makeNode(rightArgs);\n res.push(makeNode([node.args[i], right]));\n }\n } else {\n // Keep order, but try all parenthesizations\n for (var _i = 1; _i < node.args.length; _i++) {\n var left = node.args[0];\n if (_i > 1) {\n left = makeNode(node.args.slice(0, _i));\n }\n rightArgs = node.args.slice(_i);\n right = rightArgs.length === 1 ? rightArgs[0] : makeNode(rightArgs);\n res.push(makeNode([left, right]));\n }\n }\n return res;\n }\n\n /**\n * Returns the set union of two match-placeholders or null if there is a conflict.\n */\n function mergeMatch(match1, match2) {\n var res = {\n placeholders: {}\n };\n\n // Some matches may not have placeholders; this is OK\n if (!match1.placeholders && !match2.placeholders) {\n return res;\n } else if (!match1.placeholders) {\n return match2;\n } else if (!match2.placeholders) {\n return match1;\n }\n\n // Placeholders with the same key must match exactly\n for (var key in match1.placeholders) {\n if (hasOwnProperty(match1.placeholders, key)) {\n res.placeholders[key] = match1.placeholders[key];\n if (hasOwnProperty(match2.placeholders, key)) {\n if (!_exactMatch(match1.placeholders[key], match2.placeholders[key])) {\n return null;\n }\n }\n }\n }\n for (var _key in match2.placeholders) {\n if (hasOwnProperty(match2.placeholders, _key)) {\n res.placeholders[_key] = match2.placeholders[_key];\n }\n }\n return res;\n }\n\n /**\n * Combine two lists of matches by applying mergeMatch to the cartesian product of two lists of matches.\n * Each list represents matches found in one child of a node.\n */\n function combineChildMatches(list1, list2) {\n var res = [];\n if (list1.length === 0 || list2.length === 0) {\n return res;\n }\n var merged;\n for (var i1 = 0; i1 < list1.length; i1++) {\n for (var i2 = 0; i2 < list2.length; i2++) {\n merged = mergeMatch(list1[i1], list2[i2]);\n if (merged) {\n res.push(merged);\n }\n }\n }\n return res;\n }\n\n /**\n * Combine multiple lists of matches by applying mergeMatch to the cartesian product of two lists of matches.\n * Each list represents matches found in one child of a node.\n * Returns a list of unique matches.\n */\n function mergeChildMatches(childMatches) {\n if (childMatches.length === 0) {\n return childMatches;\n }\n var sets = childMatches.reduce(combineChildMatches);\n var uniqueSets = [];\n var unique = {};\n for (var i = 0; i < sets.length; i++) {\n var s = JSON.stringify(sets[i]);\n if (!unique[s]) {\n unique[s] = true;\n uniqueSets.push(sets[i]);\n }\n }\n return uniqueSets;\n }\n\n /**\n * Determines whether node matches rule.\n *\n * @param {ConstantNode | SymbolNode | ParenthesisNode | FunctionNode | OperatorNode} rule\n * @param {ConstantNode | SymbolNode | ParenthesisNode | FunctionNode | OperatorNode} node\n * @param {Object} context -- provides assumed properties of operators\n * @param {Boolean} isSplit -- whether we are in process of splitting an\n * n-ary operator node into possible binary combinations.\n * Defaults to false.\n * @return {Object} Information about the match, if it exists.\n */\n function _ruleMatch(rule, node, context, isSplit) {\n // console.log('Entering _ruleMatch(' + JSON.stringify(rule) + ', ' + JSON.stringify(node) + ')')\n // console.log('rule = ' + rule)\n // console.log('node = ' + node)\n\n // console.log('Entering _ruleMatch(', rule.toString({parenthesis:'all'}), ', ', node.toString({parenthesis:'all'}), ', ', context, ')')\n var res = [{\n placeholders: {}\n }];\n if (rule instanceof OperatorNode && node instanceof OperatorNode || rule instanceof FunctionNode && node instanceof FunctionNode) {\n // If the rule is an OperatorNode or a FunctionNode, then node must match exactly\n if (rule instanceof OperatorNode) {\n if (rule.op !== node.op || rule.fn !== node.fn) {\n return [];\n }\n } else if (rule instanceof FunctionNode) {\n if (rule.name !== node.name) {\n return [];\n }\n }\n\n // rule and node match. Search the children of rule and node.\n if (node.args.length === 1 && rule.args.length === 1 || !isAssociative(node, context) && node.args.length === rule.args.length || isSplit) {\n // Expect non-associative operators to match exactly,\n // except in any order if operator is commutative\n var childMatches = [];\n for (var i = 0; i < rule.args.length; i++) {\n var childMatch = _ruleMatch(rule.args[i], node.args[i], context);\n if (childMatch.length === 0) {\n // Child did not match, so stop searching immediately\n break;\n }\n // The child matched, so add the information returned from the child to our result\n childMatches.push(childMatch);\n }\n if (childMatches.length !== rule.args.length) {\n if (!isCommutative(node, context) ||\n // exact match in order needed\n rule.args.length === 1) {\n // nothing to commute\n return [];\n }\n if (rule.args.length > 2) {\n /* Need to generate all permutations and try them.\n * It's a bit complicated, and unlikely to come up since there\n * are very few ternary or higher operators. So punt for now.\n */\n throw new Error('permuting >2 commutative non-associative rule arguments not yet implemented');\n }\n /* Exactly two arguments, try them reversed */\n var leftMatch = _ruleMatch(rule.args[0], node.args[1], context);\n if (leftMatch.length === 0) {\n return [];\n }\n var rightMatch = _ruleMatch(rule.args[1], node.args[0], context);\n if (rightMatch.length === 0) {\n return [];\n }\n childMatches = [leftMatch, rightMatch];\n }\n res = mergeChildMatches(childMatches);\n } else if (node.args.length >= 2 && rule.args.length === 2) {\n // node is flattened, rule is not\n // Associative operators/functions can be split in different ways so we check if the rule\n // matches for each of them and return their union.\n var splits = getSplits(node, context);\n var splitMatches = [];\n for (var _i2 = 0; _i2 < splits.length; _i2++) {\n var matchSet = _ruleMatch(rule, splits[_i2], context, true); // recursing at the same tree depth here\n splitMatches = splitMatches.concat(matchSet);\n }\n return splitMatches;\n } else if (rule.args.length > 2) {\n throw Error('Unexpected non-binary associative function: ' + rule.toString());\n } else {\n // Incorrect number of arguments in rule and node, so no match\n return [];\n }\n } else if (rule instanceof SymbolNode) {\n // If the rule is a SymbolNode, then it carries a special meaning\n // according to the first one or two characters of the symbol node name.\n // These meanings are expalined in the documentation for simplify()\n if (rule.name.length === 0) {\n throw new Error('Symbol in rule has 0 length...!?');\n }\n if (SUPPORTED_CONSTANTS[rule.name]) {\n // built-in constant must match exactly\n if (rule.name !== node.name) {\n return [];\n }\n } else {\n // wildcards are composed of up to two alphabetic or underscore characters\n switch (rule.name[1] >= 'a' && rule.name[1] <= 'z' ? rule.name.substring(0, 2) : rule.name[0]) {\n case 'n':\n case '_p':\n // rule matches _anything_, so assign this node to the rule.name placeholder\n // Assign node to the rule.name placeholder.\n // Our parent will check for matches among placeholders.\n res[0].placeholders[rule.name] = node;\n break;\n case 'c':\n case 'cl':\n // rule matches a ConstantNode\n if (isConstantNode(node)) {\n res[0].placeholders[rule.name] = node;\n } else {\n // mis-match: rule does not encompass current node\n return [];\n }\n break;\n case 'v':\n // rule matches anything other than a ConstantNode\n if (!isConstantNode(node)) {\n res[0].placeholders[rule.name] = node;\n } else {\n // mis-match: rule does not encompass current node\n return [];\n }\n break;\n case 'vl':\n // rule matches VariableNode\n if (isVariableNode(node)) {\n res[0].placeholders[rule.name] = node;\n } else {\n // mis-match: rule does not encompass current node\n return [];\n }\n break;\n case 'cd':\n // rule matches a ConstantNode or unaryMinus-wrapped ConstantNode\n if (isNumericNode(node)) {\n res[0].placeholders[rule.name] = node;\n } else {\n // mis-match: rule does not encompass current node\n return [];\n }\n break;\n case 'vd':\n // rule matches anything other than a ConstantNode or unaryMinus-wrapped ConstantNode\n if (!isNumericNode(node)) {\n res[0].placeholders[rule.name] = node;\n } else {\n // mis-match: rule does not encompass current node\n return [];\n }\n break;\n case 'ce':\n // rule matches expressions that have a constant value\n if (isConstantExpression(node)) {\n res[0].placeholders[rule.name] = node;\n } else {\n // mis-match: rule does not encompass current node\n return [];\n }\n break;\n case 've':\n // rule matches expressions that do not have a constant value\n if (!isConstantExpression(node)) {\n res[0].placeholders[rule.name] = node;\n } else {\n // mis-match: rule does not encompass current node\n return [];\n }\n break;\n default:\n throw new Error('Invalid symbol in rule: ' + rule.name);\n }\n }\n } else if (rule instanceof ConstantNode) {\n // Literal constant must match exactly\n if (!equal(rule.value, node.value)) {\n return [];\n }\n } else {\n // Some other node was encountered which we aren't prepared for, so no match\n return [];\n }\n\n // It's a match!\n\n // console.log('_ruleMatch(' + rule.toString() + ', ' + node.toString() + ') found a match')\n return res;\n }\n\n /**\n * Determines whether p and q (and all their children nodes) are identical.\n *\n * @param {ConstantNode | SymbolNode | ParenthesisNode | FunctionNode | OperatorNode} p\n * @param {ConstantNode | SymbolNode | ParenthesisNode | FunctionNode | OperatorNode} q\n * @return {Object} Information about the match, if it exists.\n */\n function _exactMatch(p, q) {\n if (p instanceof ConstantNode && q instanceof ConstantNode) {\n if (!equal(p.value, q.value)) {\n return false;\n }\n } else if (p instanceof SymbolNode && q instanceof SymbolNode) {\n if (p.name !== q.name) {\n return false;\n }\n } else if (p instanceof OperatorNode && q instanceof OperatorNode || p instanceof FunctionNode && q instanceof FunctionNode) {\n if (p instanceof OperatorNode) {\n if (p.op !== q.op || p.fn !== q.fn) {\n return false;\n }\n } else if (p instanceof FunctionNode) {\n if (p.name !== q.name) {\n return false;\n }\n }\n if (p.args.length !== q.args.length) {\n return false;\n }\n for (var i = 0; i < p.args.length; i++) {\n if (!_exactMatch(p.args[i], q.args[i])) {\n return false;\n }\n }\n } else {\n return false;\n }\n return true;\n }\n return simplify;\n});","import { isFraction, isMatrix, isNode, isArrayNode, isConstantNode, isIndexNode, isObjectNode, isOperatorNode } from '../../utils/is.js';\nimport { factory } from '../../utils/factory.js';\nimport { createUtil } from './simplify/util.js';\nimport { noBignumber, noFraction } from '../../utils/noop.js';\nvar name = 'simplifyConstant';\nvar dependencies = ['typed', 'config', 'mathWithTransform', 'matrix', '?fraction', '?bignumber', 'AccessorNode', 'ArrayNode', 'ConstantNode', 'FunctionNode', 'IndexNode', 'ObjectNode', 'OperatorNode', 'SymbolNode'];\nexport var createSimplifyConstant = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n config,\n mathWithTransform,\n matrix,\n fraction,\n bignumber,\n AccessorNode,\n ArrayNode,\n ConstantNode,\n FunctionNode,\n IndexNode,\n ObjectNode,\n OperatorNode,\n SymbolNode\n } = _ref;\n var {\n isCommutative,\n isAssociative,\n allChildren,\n createMakeNodeFunction\n } = createUtil({\n FunctionNode,\n OperatorNode,\n SymbolNode\n });\n\n /**\n * simplifyConstant() takes a mathjs expression (either a Node representing\n * a parse tree or a string which it parses to produce a node), and replaces\n * any subexpression of it consisting entirely of constants with the computed\n * value of that subexpression.\n *\n * Syntax:\n *\n * math.simplifyConstant(expr)\n * math.simplifyConstant(expr, options)\n *\n * Examples:\n *\n * math.simplifyConstant('x + 4*3/6') // Node \"x + 2\"\n * math.simplifyConstant('z cos(0)') // Node \"z 1\"\n * math.simplifyConstant('(5.2 + 1.08)t', {exactFractions: false}) // Node \"6.28 t\"\n *\n * See also:\n *\n * simplify, simplifyCore, resolve, derivative\n *\n * @param {Node | string} node\n * The expression to be simplified\n * @param {Object} options\n * Simplification options, as per simplify()\n * @return {Node} Returns expression with constant subexpressions evaluated\n */\n var simplifyConstant = typed('simplifyConstant', {\n Node: node => _ensureNode(foldFraction(node, {})),\n 'Node, Object': function NodeObject(expr, options) {\n return _ensureNode(foldFraction(expr, options));\n }\n });\n function _removeFractions(thing) {\n if (isFraction(thing)) {\n return thing.valueOf();\n }\n if (thing instanceof Array) {\n return thing.map(_removeFractions);\n }\n if (isMatrix(thing)) {\n return matrix(_removeFractions(thing.valueOf()));\n }\n return thing;\n }\n function _eval(fnname, args, options) {\n try {\n return mathWithTransform[fnname].apply(null, args);\n } catch (ignore) {\n // sometimes the implicit type conversion causes the evaluation to fail, so we'll try again after removing Fractions\n args = args.map(_removeFractions);\n return _toNumber(mathWithTransform[fnname].apply(null, args), options);\n }\n }\n var _toNode = typed({\n Fraction: _fractionToNode,\n number: function number(n) {\n if (n < 0) {\n return unaryMinusNode(new ConstantNode(-n));\n }\n return new ConstantNode(n);\n },\n BigNumber: function BigNumber(n) {\n if (n < 0) {\n return unaryMinusNode(new ConstantNode(-n));\n }\n return new ConstantNode(n); // old parameters: (n.toString(), 'number')\n },\n\n Complex: function Complex(s) {\n throw new Error('Cannot convert Complex number to Node');\n },\n string: function string(s) {\n return new ConstantNode(s);\n },\n Matrix: function Matrix(m) {\n return new ArrayNode(m.valueOf().map(e => _toNode(e)));\n }\n });\n function _ensureNode(thing) {\n if (isNode(thing)) {\n return thing;\n }\n return _toNode(thing);\n }\n\n // convert a number to a fraction only if it can be expressed exactly,\n // and when both numerator and denominator are small enough\n function _exactFraction(n, options) {\n var exactFractions = options && options.exactFractions !== false;\n if (exactFractions && isFinite(n) && fraction) {\n var f = fraction(n);\n var fractionsLimit = options && typeof options.fractionsLimit === 'number' ? options.fractionsLimit : Infinity; // no limit by default\n\n if (f.valueOf() === n && f.n < fractionsLimit && f.d < fractionsLimit) {\n return f;\n }\n }\n return n;\n }\n\n // Convert numbers to a preferred number type in preference order: Fraction, number, Complex\n // BigNumbers are left alone\n var _toNumber = typed({\n 'string, Object': function stringObject(s, options) {\n if (config.number === 'BigNumber') {\n if (bignumber === undefined) {\n noBignumber();\n }\n return bignumber(s);\n } else if (config.number === 'Fraction') {\n if (fraction === undefined) {\n noFraction();\n }\n return fraction(s);\n } else {\n var n = parseFloat(s);\n return _exactFraction(n, options);\n }\n },\n 'Fraction, Object': function FractionObject(s, options) {\n return s;\n },\n // we don't need options here\n\n 'BigNumber, Object': function BigNumberObject(s, options) {\n return s;\n },\n // we don't need options here\n\n 'number, Object': function numberObject(s, options) {\n return _exactFraction(s, options);\n },\n 'Complex, Object': function ComplexObject(s, options) {\n if (s.im !== 0) {\n return s;\n }\n return _exactFraction(s.re, options);\n },\n 'Matrix, Object': function MatrixObject(s, options) {\n return matrix(_exactFraction(s.valueOf()));\n },\n 'Array, Object': function ArrayObject(s, options) {\n return s.map(_exactFraction);\n }\n });\n function unaryMinusNode(n) {\n return new OperatorNode('-', 'unaryMinus', [n]);\n }\n function _fractionToNode(f) {\n var n;\n var vn = f.s * f.n;\n if (vn < 0) {\n n = new OperatorNode('-', 'unaryMinus', [new ConstantNode(-vn)]);\n } else {\n n = new ConstantNode(vn);\n }\n if (f.d === 1) {\n return n;\n }\n return new OperatorNode('/', 'divide', [n, new ConstantNode(f.d)]);\n }\n\n /* Handles constant indexing of ArrayNodes, matrices, and ObjectNodes */\n function _foldAccessor(obj, index, options) {\n if (!isIndexNode(index)) {\n // don't know what to do with that...\n return new AccessorNode(_ensureNode(obj), _ensureNode(index));\n }\n if (isArrayNode(obj) || isMatrix(obj)) {\n var remainingDims = Array.from(index.dimensions);\n /* We will resolve constant indices one at a time, looking\n * just in the first or second dimensions because (a) arrays\n * of more than two dimensions are likely rare, and (b) pulling\n * out the third or higher dimension would be pretty intricate.\n * The price is that we miss simplifying [..3d array][x,y,1]\n */\n while (remainingDims.length > 0) {\n if (isConstantNode(remainingDims[0]) && typeof remainingDims[0].value !== 'string') {\n var first = _toNumber(remainingDims.shift().value, options);\n if (isArrayNode(obj)) {\n obj = obj.items[first - 1];\n } else {\n // matrix\n obj = obj.valueOf()[first - 1];\n if (obj instanceof Array) {\n obj = matrix(obj);\n }\n }\n } else if (remainingDims.length > 1 && isConstantNode(remainingDims[1]) && typeof remainingDims[1].value !== 'string') {\n var second = _toNumber(remainingDims[1].value, options);\n var tryItems = [];\n var fromItems = isArrayNode(obj) ? obj.items : obj.valueOf();\n for (var item of fromItems) {\n if (isArrayNode(item)) {\n tryItems.push(item.items[second - 1]);\n } else if (isMatrix(obj)) {\n tryItems.push(item[second - 1]);\n } else {\n break;\n }\n }\n if (tryItems.length === fromItems.length) {\n if (isArrayNode(obj)) {\n obj = new ArrayNode(tryItems);\n } else {\n // matrix\n obj = matrix(tryItems);\n }\n remainingDims.splice(1, 1);\n } else {\n // extracting slice along 2nd dimension failed, give up\n break;\n }\n } else {\n // neither 1st or 2nd dimension is constant, give up\n break;\n }\n }\n if (remainingDims.length === index.dimensions.length) {\n /* No successful constant indexing */\n return new AccessorNode(_ensureNode(obj), index);\n }\n if (remainingDims.length > 0) {\n /* Indexed some but not all dimensions */\n index = new IndexNode(remainingDims);\n return new AccessorNode(_ensureNode(obj), index);\n }\n /* All dimensions were constant, access completely resolved */\n return obj;\n }\n if (isObjectNode(obj) && index.dimensions.length === 1 && isConstantNode(index.dimensions[0])) {\n var key = index.dimensions[0].value;\n if (key in obj.properties) {\n return obj.properties[key];\n }\n return new ConstantNode(); // undefined\n }\n /* Don't know how to index this sort of obj, at least not with this index */\n return new AccessorNode(_ensureNode(obj), index);\n }\n\n /*\n * Create a binary tree from a list of Fractions and Nodes.\n * Tries to fold Fractions by evaluating them until the first Node in the list is hit, so\n * `args` should be sorted to have the Fractions at the start (if the operator is commutative).\n * @param args - list of Fractions and Nodes\n * @param fn - evaluator for the binary operation evaluator that accepts two Fractions\n * @param makeNode - creates a binary OperatorNode/FunctionNode from a list of child Nodes\n * if args.length is 1, returns args[0]\n * @return - Either a Node representing a binary expression or Fraction\n */\n function foldOp(fn, args, makeNode, options) {\n var first = args.shift();\n\n // In the following reduction, sofar always has one of the three following\n // forms: [NODE], [CONSTANT], or [NODE, CONSTANT]\n var reduction = args.reduce((sofar, next) => {\n if (!isNode(next)) {\n var last = sofar.pop();\n if (isNode(last)) {\n return [last, next];\n }\n // Two constants in a row, try to fold them into one\n try {\n sofar.push(_eval(fn, [last, next], options));\n return sofar;\n } catch (ignoreandcontinue) {\n sofar.push(last);\n // fall through to Node case\n }\n }\n\n // Encountered a Node, or failed folding --\n // collapse everything so far into a single tree:\n sofar.push(_ensureNode(sofar.pop()));\n var newtree = sofar.length === 1 ? sofar[0] : makeNode(sofar);\n return [makeNode([newtree, _ensureNode(next)])];\n }, [first]);\n if (reduction.length === 1) {\n return reduction[0];\n }\n // Might end up with a tree and a constant at the end:\n return makeNode([reduction[0], _toNode(reduction[1])]);\n }\n\n // destroys the original node and returns a folded one\n function foldFraction(node, options) {\n switch (node.type) {\n case 'SymbolNode':\n return node;\n case 'ConstantNode':\n switch (typeof node.value) {\n case 'number':\n return _toNumber(node.value, options);\n case 'string':\n return node.value;\n default:\n if (!isNaN(node.value)) return _toNumber(node.value, options);\n }\n return node;\n case 'FunctionNode':\n if (mathWithTransform[node.name] && mathWithTransform[node.name].rawArgs) {\n return node;\n }\n {\n // Process operators as OperatorNode\n var operatorFunctions = ['add', 'multiply'];\n if (operatorFunctions.indexOf(node.name) === -1) {\n var args = node.args.map(arg => foldFraction(arg, options));\n\n // If all args are numbers\n if (!args.some(isNode)) {\n try {\n return _eval(node.name, args, options);\n } catch (ignoreandcontinue) {}\n }\n\n // Size of a matrix does not depend on entries\n if (node.name === 'size' && args.length === 1 && isArrayNode(args[0])) {\n var sz = [];\n var section = args[0];\n while (isArrayNode(section)) {\n sz.push(section.items.length);\n section = section.items[0];\n }\n return matrix(sz);\n }\n\n // Convert all args to nodes and construct a symbolic function call\n return new FunctionNode(node.name, args.map(_ensureNode));\n } else {\n // treat as operator\n }\n }\n /* falls through */\n case 'OperatorNode':\n {\n var fn = node.fn.toString();\n var _args;\n var res;\n var makeNode = createMakeNodeFunction(node);\n if (isOperatorNode(node) && node.isUnary()) {\n _args = [foldFraction(node.args[0], options)];\n if (!isNode(_args[0])) {\n res = _eval(fn, _args, options);\n } else {\n res = makeNode(_args);\n }\n } else if (isAssociative(node, options.context)) {\n _args = allChildren(node, options.context);\n _args = _args.map(arg => foldFraction(arg, options));\n if (isCommutative(fn, options.context)) {\n // commutative binary operator\n var consts = [];\n var vars = [];\n for (var i = 0; i < _args.length; i++) {\n if (!isNode(_args[i])) {\n consts.push(_args[i]);\n } else {\n vars.push(_args[i]);\n }\n }\n if (consts.length > 1) {\n res = foldOp(fn, consts, makeNode, options);\n vars.unshift(res);\n res = foldOp(fn, vars, makeNode, options);\n } else {\n // we won't change the children order since it's not neccessary\n res = foldOp(fn, _args, makeNode, options);\n }\n } else {\n // non-commutative binary operator\n res = foldOp(fn, _args, makeNode, options);\n }\n } else {\n // non-associative binary operator\n _args = node.args.map(arg => foldFraction(arg, options));\n res = foldOp(fn, _args, makeNode, options);\n }\n return res;\n }\n case 'ParenthesisNode':\n // remove the uneccessary parenthesis\n return foldFraction(node.content, options);\n case 'AccessorNode':\n return _foldAccessor(foldFraction(node.object, options), foldFraction(node.index, options), options);\n case 'ArrayNode':\n {\n var foldItems = node.items.map(item => foldFraction(item, options));\n if (foldItems.some(isNode)) {\n return new ArrayNode(foldItems.map(_ensureNode));\n }\n /* All literals -- return a Matrix so we can operate on it */\n return matrix(foldItems);\n }\n case 'IndexNode':\n {\n return new IndexNode(node.dimensions.map(n => simplifyConstant(n, options)));\n }\n case 'ObjectNode':\n {\n var foldProps = {};\n for (var prop in node.properties) {\n foldProps[prop] = simplifyConstant(node.properties[prop], options);\n }\n return new ObjectNode(foldProps);\n }\n case 'AssignmentNode':\n /* falls through */\n case 'BlockNode':\n /* falls through */\n case 'FunctionAssignmentNode':\n /* falls through */\n case 'RangeNode':\n /* falls through */\n case 'ConditionalNode':\n /* falls through */\n default:\n throw new Error(\"Unimplemented node type in simplifyConstant: \".concat(node.type));\n }\n }\n return simplifyConstant;\n});","import { isAccessorNode, isArrayNode, isConstantNode, isFunctionNode, isIndexNode, isObjectNode, isOperatorNode } from '../../utils/is.js';\nimport { getOperator } from '../../expression/operators.js';\nimport { createUtil } from './simplify/util.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'simplifyCore';\nvar dependencies = ['typed', 'parse', 'equal', 'isZero', 'add', 'subtract', 'multiply', 'divide', 'pow', 'AccessorNode', 'ArrayNode', 'ConstantNode', 'FunctionNode', 'IndexNode', 'ObjectNode', 'OperatorNode', 'ParenthesisNode', 'SymbolNode'];\nexport var createSimplifyCore = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n parse,\n equal,\n isZero,\n add,\n subtract,\n multiply,\n divide,\n pow,\n AccessorNode,\n ArrayNode,\n ConstantNode,\n FunctionNode,\n IndexNode,\n ObjectNode,\n OperatorNode,\n ParenthesisNode,\n SymbolNode\n } = _ref;\n var node0 = new ConstantNode(0);\n var node1 = new ConstantNode(1);\n var nodeT = new ConstantNode(true);\n var nodeF = new ConstantNode(false);\n // test if a node will always have a boolean value (true/false)\n // not sure if this list is complete\n function isAlwaysBoolean(node) {\n return isOperatorNode(node) && ['and', 'not', 'or'].includes(node.op);\n }\n var {\n hasProperty,\n isCommutative\n } = createUtil({\n FunctionNode,\n OperatorNode,\n SymbolNode\n });\n /**\n * simplifyCore() performs single pass simplification suitable for\n * applications requiring ultimate performance. To roughly summarize,\n * it handles cases along the lines of simplifyConstant() but where\n * knowledge of a single argument is sufficient to determine the value.\n * In contrast, simplify() extends simplifyCore() with additional passes\n * to provide deeper simplification (such as gathering like terms).\n *\n * Specifically, simplifyCore:\n *\n * * Converts all function calls with operator equivalents to their\n * operator forms.\n * * Removes operators or function calls that are guaranteed to have no\n * effect (such as unary '+').\n * * Removes double unary '-', '~', and 'not'\n * * Eliminates addition/subtraction of 0 and multiplication/division/powers\n * by 1 or 0.\n * * Converts addition of a negation into subtraction.\n * * Eliminates logical operations with constant true or false leading\n * arguments.\n * * Puts constants on the left of a product, if multiplication is\n * considered commutative by the options (which is the default)\n *\n * Syntax:\n *\n * math.simplifyCore(expr)\n * math.simplifyCore(expr, options)\n *\n * Examples:\n *\n * const f = math.parse('2 * 1 * x ^ (1 - 0)')\n * math.simplifyCore(f) // Node \"2 * x\"\n * math.simplify('2 * 1 * x ^ (1 - 0)', [math.simplifyCore]) // Node \"2 * x\"\n *\n * See also:\n *\n * simplify, simplifyConstant, resolve, derivative\n *\n * @param {Node | string} node\n * The expression to be simplified\n * @param {Object} options\n * Simplification options, as per simplify()\n * @return {Node} Returns expression with basic simplifications applied\n */\n function _simplifyCore(nodeToSimplify) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var context = options ? options.context : undefined;\n if (hasProperty(nodeToSimplify, 'trivial', context)) {\n // This node does nothing if it has only one argument, so if so,\n // return that argument simplified\n if (isFunctionNode(nodeToSimplify) && nodeToSimplify.args.length === 1) {\n return _simplifyCore(nodeToSimplify.args[0], options);\n }\n // For other node types, we try the generic methods\n var simpChild = false;\n var childCount = 0;\n nodeToSimplify.forEach(c => {\n ++childCount;\n if (childCount === 1) {\n simpChild = _simplifyCore(c, options);\n }\n });\n if (childCount === 1) {\n return simpChild;\n }\n }\n var node = nodeToSimplify;\n if (isFunctionNode(node)) {\n var op = getOperator(node.name);\n if (op) {\n // Replace FunctionNode with a new OperatorNode\n if (node.args.length > 2 && hasProperty(node, 'associative', context)) {\n // unflatten into binary operations since that's what simplifyCore handles\n while (node.args.length > 2) {\n var last = node.args.pop();\n var seclast = node.args.pop();\n node.args.push(new OperatorNode(op, node.name, [last, seclast]));\n }\n }\n node = new OperatorNode(op, node.name, node.args);\n } else {\n return new FunctionNode(_simplifyCore(node.fn), node.args.map(n => _simplifyCore(n, options)));\n }\n }\n if (isOperatorNode(node) && node.isUnary()) {\n var a0 = _simplifyCore(node.args[0], options);\n if (node.op === '~') {\n // bitwise not\n if (isOperatorNode(a0) && a0.isUnary() && a0.op === '~') {\n return a0.args[0];\n }\n }\n if (node.op === 'not') {\n // logical not\n if (isOperatorNode(a0) && a0.isUnary() && a0.op === 'not') {\n // Has the effect of turning the argument into a boolean\n // So can only eliminate the double negation if\n // the inside is already boolean\n if (isAlwaysBoolean(a0.args[0])) {\n return a0.args[0];\n }\n }\n }\n var finish = true;\n if (node.op === '-') {\n // unary minus\n if (isOperatorNode(a0)) {\n if (a0.isBinary() && a0.fn === 'subtract') {\n node = new OperatorNode('-', 'subtract', [a0.args[1], a0.args[0]]);\n finish = false; // continue to process the new binary node\n }\n\n if (a0.isUnary() && a0.op === '-') {\n return a0.args[0];\n }\n }\n }\n if (finish) return new OperatorNode(node.op, node.fn, [a0]);\n }\n if (isOperatorNode(node) && node.isBinary()) {\n var _a = _simplifyCore(node.args[0], options);\n var a1 = _simplifyCore(node.args[1], options);\n if (node.op === '+') {\n if (isConstantNode(_a) && isZero(_a.value)) {\n return a1;\n }\n if (isConstantNode(a1) && isZero(a1.value)) {\n return _a;\n }\n if (isOperatorNode(a1) && a1.isUnary() && a1.op === '-') {\n a1 = a1.args[0];\n node = new OperatorNode('-', 'subtract', [_a, a1]);\n }\n }\n if (node.op === '-') {\n if (isOperatorNode(a1) && a1.isUnary() && a1.op === '-') {\n return _simplifyCore(new OperatorNode('+', 'add', [_a, a1.args[0]]), options);\n }\n if (isConstantNode(_a) && isZero(_a.value)) {\n return _simplifyCore(new OperatorNode('-', 'unaryMinus', [a1]));\n }\n if (isConstantNode(a1) && isZero(a1.value)) {\n return _a;\n }\n return new OperatorNode(node.op, node.fn, [_a, a1]);\n }\n if (node.op === '*') {\n if (isConstantNode(_a)) {\n if (isZero(_a.value)) {\n return node0;\n } else if (equal(_a.value, 1)) {\n return a1;\n }\n }\n if (isConstantNode(a1)) {\n if (isZero(a1.value)) {\n return node0;\n } else if (equal(a1.value, 1)) {\n return _a;\n }\n if (isCommutative(node, context)) {\n return new OperatorNode(node.op, node.fn, [a1, _a], node.implicit); // constants on left\n }\n }\n\n return new OperatorNode(node.op, node.fn, [_a, a1], node.implicit);\n }\n if (node.op === '/') {\n if (isConstantNode(_a) && isZero(_a.value)) {\n return node0;\n }\n if (isConstantNode(a1) && equal(a1.value, 1)) {\n return _a;\n }\n return new OperatorNode(node.op, node.fn, [_a, a1]);\n }\n if (node.op === '^') {\n if (isConstantNode(a1)) {\n if (isZero(a1.value)) {\n return node1;\n } else if (equal(a1.value, 1)) {\n return _a;\n }\n }\n }\n if (node.op === 'and') {\n if (isConstantNode(_a)) {\n if (_a.value) {\n if (isAlwaysBoolean(a1)) return a1;\n } else {\n return nodeF;\n }\n }\n if (isConstantNode(a1)) {\n if (a1.value) {\n if (isAlwaysBoolean(_a)) return _a;\n } else {\n return nodeF;\n }\n }\n }\n if (node.op === 'or') {\n if (isConstantNode(_a)) {\n if (_a.value) {\n return nodeT;\n } else {\n if (isAlwaysBoolean(a1)) return a1;\n }\n }\n if (isConstantNode(a1)) {\n if (a1.value) {\n return nodeT;\n } else {\n if (isAlwaysBoolean(_a)) return _a;\n }\n }\n }\n return new OperatorNode(node.op, node.fn, [_a, a1]);\n }\n if (isOperatorNode(node)) {\n return new OperatorNode(node.op, node.fn, node.args.map(a => _simplifyCore(a, options)));\n }\n if (isArrayNode(node)) {\n return new ArrayNode(node.items.map(n => _simplifyCore(n, options)));\n }\n if (isAccessorNode(node)) {\n return new AccessorNode(_simplifyCore(node.object, options), _simplifyCore(node.index, options));\n }\n if (isIndexNode(node)) {\n return new IndexNode(node.dimensions.map(n => _simplifyCore(n, options)));\n }\n if (isObjectNode(node)) {\n var newProps = {};\n for (var prop in node.properties) {\n newProps[prop] = _simplifyCore(node.properties[prop], options);\n }\n return new ObjectNode(newProps);\n }\n // cannot simplify\n return node;\n }\n return typed(name, {\n Node: _simplifyCore,\n 'Node,Object': _simplifyCore\n });\n});","import { createMap } from '../../utils/map.js';\nimport { isFunctionNode, isNode, isOperatorNode, isParenthesisNode, isSymbolNode } from '../../utils/is.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'resolve';\nvar dependencies = ['typed', 'parse', 'ConstantNode', 'FunctionNode', 'OperatorNode', 'ParenthesisNode'];\nexport var createResolve = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n parse,\n ConstantNode,\n FunctionNode,\n OperatorNode,\n ParenthesisNode\n } = _ref;\n /**\n * resolve(expr, scope) replaces variable nodes with their scoped values\n *\n * Syntax:\n *\n * math.resolve(expr, scope)\n *\n * Examples:\n *\n * math.resolve('x + y', {x:1, y:2}) // Node '1 + 2'\n * math.resolve(math.parse('x+y'), {x:1, y:2}) // Node '1 + 2'\n * math.simplify('x+y', {x:2, y: math.parse('x+x')}).toString() // \"6\"\n *\n * See also:\n *\n * simplify, evaluate\n *\n * @param {Node | Node[]} node\n * The expression tree (or trees) to be simplified\n * @param {Object} scope\n * Scope specifying variables to be resolved\n * @return {Node | Node[]} Returns `node` with variables recursively substituted.\n * @throws {ReferenceError}\n * If there is a cyclic dependency among the variables in `scope`,\n * resolution is impossible and a ReferenceError is thrown.\n */\n function _resolve(node, scope) {\n var within = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : new Set();\n // note `within`:\n // `within` is not documented, since it is for internal cycle\n // detection only\n if (!scope) {\n return node;\n }\n if (isSymbolNode(node)) {\n if (within.has(node.name)) {\n var variables = Array.from(within).join(', ');\n throw new ReferenceError(\"recursive loop of variable definitions among {\".concat(variables, \"}\"));\n }\n var value = scope.get(node.name);\n if (isNode(value)) {\n var nextWithin = new Set(within);\n nextWithin.add(node.name);\n return _resolve(value, scope, nextWithin);\n } else if (typeof value === 'number') {\n return parse(String(value));\n } else if (value !== undefined) {\n return new ConstantNode(value);\n } else {\n return node;\n }\n } else if (isOperatorNode(node)) {\n var args = node.args.map(function (arg) {\n return _resolve(arg, scope, within);\n });\n return new OperatorNode(node.op, node.fn, args, node.implicit);\n } else if (isParenthesisNode(node)) {\n return new ParenthesisNode(_resolve(node.content, scope, within));\n } else if (isFunctionNode(node)) {\n var _args = node.args.map(function (arg) {\n return _resolve(arg, scope, within);\n });\n return new FunctionNode(node.name, _args);\n }\n\n // Otherwise just recursively resolve any children (might also work\n // for some of the above special cases)\n return node.map(child => _resolve(child, scope, within));\n }\n return typed('resolve', {\n Node: _resolve,\n 'Node, Map | null | undefined': _resolve,\n 'Node, Object': (n, scope) => _resolve(n, createMap(scope)),\n // For arrays and matrices, we map `self` rather than `_resolve`\n // because resolve is fairly expensive anyway, and this way\n // we get nice error messages if one entry in the array has wrong type.\n 'Array | Matrix': typed.referToSelf(self => A => A.map(n => self(n))),\n 'Array | Matrix, null | undefined': typed.referToSelf(self => A => A.map(n => self(n))),\n 'Array, Object': typed.referTo('Array,Map', selfAM => (A, scope) => selfAM(A, createMap(scope))),\n 'Matrix, Object': typed.referTo('Matrix,Map', selfMM => (A, scope) => selfMM(A, createMap(scope))),\n 'Array | Matrix, Map': typed.referToSelf(self => (A, scope) => A.map(n => self(n, scope)))\n });\n});","import { isConstantNode } from '../../utils/is.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'symbolicEqual';\nvar dependencies = ['parse', 'simplify', 'typed', 'OperatorNode'];\nexport var createSymbolicEqual = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n parse,\n simplify,\n typed,\n OperatorNode\n } = _ref;\n /**\n * Attempts to determine if two expressions are symbolically equal, i.e.\n * one is the result of valid algebraic manipulations on the other.\n * Currently, this simply checks if the difference of the two expressions\n * simplifies down to 0. So there are two important caveats:\n * 1. whether two expressions are symbolically equal depends on the\n * manipulations allowed. Therefore, this function takes an optional\n * third argument, which are the options that control the behavior\n * as documented for the `simplify()` function.\n * 2. it is in general intractable to find the minimal simplification of\n * an arbitrarily complicated expression. So while a `true` value\n * of `symbolicEqual` ensures that the two expressions can be manipulated\n * to match each other, a `false` value does not absolutely rule this out.\n *\n * Syntax:\n *\n * math.symbolicEqual(expr1, expr2)\n * math.symbolicEqual(expr1, expr2, options)\n *\n * Examples:\n *\n * math.symbolicEqual('x*y', 'y*x') // Returns true\n * math.symbolicEqual('x*y', 'y*x', {context: {multiply: {commutative: false}}}) // Returns false\n * math.symbolicEqual('x/y', '(y*x^(-1))^(-1)') // Returns true\n * math.symbolicEqual('abs(x)','x') // Returns false\n * math.symbolicEqual('abs(x)','x', simplify.positiveContext) // Returns true\n *\n * See also:\n *\n * simplify, evaluate\n *\n * @param {Node|string} expr1 The first expression to compare\n * @param {Node|string} expr2 The second expression to compare\n * @param {Object} [options] Optional option object, passed to simplify\n * @returns {boolean}\n * Returns true if a valid manipulation making the expressions equal\n * is found.\n */\n function _symbolicEqual(e1, e2) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n var diff = new OperatorNode('-', 'subtract', [e1, e2]);\n var simplified = simplify(diff, {}, options);\n return isConstantNode(simplified) && !simplified.value;\n }\n return typed(name, {\n 'Node, Node': _symbolicEqual,\n 'Node, Node, Object': _symbolicEqual\n });\n});","import { isConstantNode, typeOf } from '../../utils/is.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'derivative';\nvar dependencies = ['typed', 'config', 'parse', 'simplify', 'equal', 'isZero', 'numeric', 'ConstantNode', 'FunctionNode', 'OperatorNode', 'ParenthesisNode', 'SymbolNode'];\nexport var createDerivative = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n config,\n parse,\n simplify,\n equal,\n isZero,\n numeric,\n ConstantNode,\n FunctionNode,\n OperatorNode,\n ParenthesisNode,\n SymbolNode\n } = _ref;\n /**\n * Takes the derivative of an expression expressed in parser Nodes.\n * The derivative will be taken over the supplied variable in the\n * second parameter. If there are multiple variables in the expression,\n * it will return a partial derivative.\n *\n * This uses rules of differentiation which can be found here:\n *\n * - [Differentiation rules (Wikipedia)](https://en.wikipedia.org/wiki/Differentiation_rules)\n *\n * Syntax:\n *\n * math.derivative(expr, variable)\n * math.derivative(expr, variable, options)\n *\n * Examples:\n *\n * math.derivative('x^2', 'x') // Node '2 * x'\n * math.derivative('x^2', 'x', {simplify: false}) // Node '2 * 1 * x ^ (2 - 1)'\n * math.derivative('sin(2x)', 'x')) // Node '2 * cos(2 * x)'\n * math.derivative('2*x', 'x').evaluate() // number 2\n * math.derivative('x^2', 'x').evaluate({x: 4}) // number 8\n * const f = math.parse('x^2')\n * const x = math.parse('x')\n * math.derivative(f, x) // Node {2 * x}\n *\n * See also:\n *\n * simplify, parse, evaluate\n *\n * @param {Node | string} expr The expression to differentiate\n * @param {SymbolNode | string} variable The variable over which to differentiate\n * @param {{simplify: boolean}} [options]\n * There is one option available, `simplify`, which\n * is true by default. When false, output will not\n * be simplified.\n * @return {ConstantNode | SymbolNode | ParenthesisNode | FunctionNode | OperatorNode} The derivative of `expr`\n */\n function plainDerivative(expr, variable) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {\n simplify: true\n };\n var constNodes = {};\n constTag(constNodes, expr, variable.name);\n var res = _derivative(expr, constNodes);\n return options.simplify ? simplify(res) : res;\n }\n typed.addConversion({\n from: 'identifier',\n to: 'SymbolNode',\n convert: parse\n });\n var derivative = typed(name, {\n 'Node, SymbolNode': plainDerivative,\n 'Node, SymbolNode, Object': plainDerivative\n\n /* TODO: implement and test syntax with order of derivatives -> implement as an option {order: number}\n 'Node, SymbolNode, ConstantNode': function (expr, variable, {order}) {\n let res = expr\n for (let i = 0; i < order; i++) {\n let constNodes = {}\n constTag(constNodes, expr, variable.name)\n res = _derivative(res, constNodes)\n }\n return res\n }\n */\n });\n\n typed.removeConversion({\n from: 'identifier',\n to: 'SymbolNode',\n convert: parse\n });\n derivative._simplify = true;\n derivative.toTex = function (deriv) {\n return _derivTex.apply(null, deriv.args);\n };\n\n // FIXME: move the toTex method of derivative to latex.js. Difficulty is that it relies on parse.\n // NOTE: the optional \"order\" parameter here is currently unused\n var _derivTex = typed('_derivTex', {\n 'Node, SymbolNode': function NodeSymbolNode(expr, x) {\n if (isConstantNode(expr) && typeOf(expr.value) === 'string') {\n return _derivTex(parse(expr.value).toString(), x.toString(), 1);\n } else {\n return _derivTex(expr.toTex(), x.toString(), 1);\n }\n },\n 'Node, ConstantNode': function NodeConstantNode(expr, x) {\n if (typeOf(x.value) === 'string') {\n return _derivTex(expr, parse(x.value));\n } else {\n throw new Error(\"The second parameter to 'derivative' is a non-string constant\");\n }\n },\n 'Node, SymbolNode, ConstantNode': function NodeSymbolNodeConstantNode(expr, x, order) {\n return _derivTex(expr.toString(), x.name, order.value);\n },\n 'string, string, number': function stringStringNumber(expr, x, order) {\n var d;\n if (order === 1) {\n d = '{d\\\\over d' + x + '}';\n } else {\n d = '{d^{' + order + '}\\\\over d' + x + '^{' + order + '}}';\n }\n return d + \"\\\\left[\".concat(expr, \"\\\\right]\");\n }\n });\n\n /**\n * Does a depth-first search on the expression tree to identify what Nodes\n * are constants (e.g. 2 + 2), and stores the ones that are constants in\n * constNodes. Classification is done as follows:\n *\n * 1. ConstantNodes are constants.\n * 2. If there exists a SymbolNode, of which we are differentiating over,\n * in the subtree it is not constant.\n *\n * @param {Object} constNodes Holds the nodes that are constant\n * @param {ConstantNode | SymbolNode | ParenthesisNode | FunctionNode | OperatorNode} node\n * @param {string} varName Variable that we are differentiating\n * @return {boolean} if node is constant\n */\n // TODO: can we rewrite constTag into a pure function?\n var constTag = typed('constTag', {\n 'Object, ConstantNode, string': function ObjectConstantNodeString(constNodes, node) {\n constNodes[node] = true;\n return true;\n },\n 'Object, SymbolNode, string': function ObjectSymbolNodeString(constNodes, node, varName) {\n // Treat other variables like constants. For reasoning, see:\n // https://en.wikipedia.org/wiki/Partial_derivative\n if (node.name !== varName) {\n constNodes[node] = true;\n return true;\n }\n return false;\n },\n 'Object, ParenthesisNode, string': function ObjectParenthesisNodeString(constNodes, node, varName) {\n return constTag(constNodes, node.content, varName);\n },\n 'Object, FunctionAssignmentNode, string': function ObjectFunctionAssignmentNodeString(constNodes, node, varName) {\n if (node.params.indexOf(varName) === -1) {\n constNodes[node] = true;\n return true;\n }\n return constTag(constNodes, node.expr, varName);\n },\n 'Object, FunctionNode | OperatorNode, string': function ObjectFunctionNodeOperatorNodeString(constNodes, node, varName) {\n if (node.args.length > 0) {\n var isConst = constTag(constNodes, node.args[0], varName);\n for (var i = 1; i < node.args.length; ++i) {\n isConst = constTag(constNodes, node.args[i], varName) && isConst;\n }\n if (isConst) {\n constNodes[node] = true;\n return true;\n }\n }\n return false;\n }\n });\n\n /**\n * Applies differentiation rules.\n *\n * @param {ConstantNode | SymbolNode | ParenthesisNode | FunctionNode | OperatorNode} node\n * @param {Object} constNodes Holds the nodes that are constant\n * @return {ConstantNode | SymbolNode | ParenthesisNode | FunctionNode | OperatorNode} The derivative of `expr`\n */\n var _derivative = typed('_derivative', {\n 'ConstantNode, Object': function ConstantNodeObject(node) {\n return createConstantNode(0);\n },\n 'SymbolNode, Object': function SymbolNodeObject(node, constNodes) {\n if (constNodes[node] !== undefined) {\n return createConstantNode(0);\n }\n return createConstantNode(1);\n },\n 'ParenthesisNode, Object': function ParenthesisNodeObject(node, constNodes) {\n return new ParenthesisNode(_derivative(node.content, constNodes));\n },\n 'FunctionAssignmentNode, Object': function FunctionAssignmentNodeObject(node, constNodes) {\n if (constNodes[node] !== undefined) {\n return createConstantNode(0);\n }\n return _derivative(node.expr, constNodes);\n },\n 'FunctionNode, Object': function FunctionNodeObject(node, constNodes) {\n if (node.args.length !== 1) {\n funcArgsCheck(node);\n }\n if (constNodes[node] !== undefined) {\n return createConstantNode(0);\n }\n var arg0 = node.args[0];\n var arg1;\n var div = false; // is output a fraction?\n var negative = false; // is output negative?\n\n var funcDerivative;\n switch (node.name) {\n case 'cbrt':\n // d/dx(cbrt(x)) = 1 / (3x^(2/3))\n div = true;\n funcDerivative = new OperatorNode('*', 'multiply', [createConstantNode(3), new OperatorNode('^', 'pow', [arg0, new OperatorNode('/', 'divide', [createConstantNode(2), createConstantNode(3)])])]);\n break;\n case 'sqrt':\n case 'nthRoot':\n // d/dx(sqrt(x)) = 1 / (2*sqrt(x))\n if (node.args.length === 1) {\n div = true;\n funcDerivative = new OperatorNode('*', 'multiply', [createConstantNode(2), new FunctionNode('sqrt', [arg0])]);\n } else if (node.args.length === 2) {\n // Rearrange from nthRoot(x, a) -> x^(1/a)\n arg1 = new OperatorNode('/', 'divide', [createConstantNode(1), node.args[1]]);\n\n // Is a variable?\n constNodes[arg1] = constNodes[node.args[1]];\n return _derivative(new OperatorNode('^', 'pow', [arg0, arg1]), constNodes);\n }\n break;\n case 'log10':\n arg1 = createConstantNode(10);\n /* fall through! */\n case 'log':\n if (!arg1 && node.args.length === 1) {\n // d/dx(log(x)) = 1 / x\n funcDerivative = arg0.clone();\n div = true;\n } else if (node.args.length === 1 && arg1 || node.args.length === 2 && constNodes[node.args[1]] !== undefined) {\n // d/dx(log(x, c)) = 1 / (x*ln(c))\n funcDerivative = new OperatorNode('*', 'multiply', [arg0.clone(), new FunctionNode('log', [arg1 || node.args[1]])]);\n div = true;\n } else if (node.args.length === 2) {\n // d/dx(log(f(x), g(x))) = d/dx(log(f(x)) / log(g(x)))\n return _derivative(new OperatorNode('/', 'divide', [new FunctionNode('log', [arg0]), new FunctionNode('log', [node.args[1]])]), constNodes);\n }\n break;\n case 'pow':\n constNodes[arg1] = constNodes[node.args[1]];\n // Pass to pow operator node parser\n return _derivative(new OperatorNode('^', 'pow', [arg0, node.args[1]]), constNodes);\n case 'exp':\n // d/dx(e^x) = e^x\n funcDerivative = new FunctionNode('exp', [arg0.clone()]);\n break;\n case 'sin':\n // d/dx(sin(x)) = cos(x)\n funcDerivative = new FunctionNode('cos', [arg0.clone()]);\n break;\n case 'cos':\n // d/dx(cos(x)) = -sin(x)\n funcDerivative = new OperatorNode('-', 'unaryMinus', [new FunctionNode('sin', [arg0.clone()])]);\n break;\n case 'tan':\n // d/dx(tan(x)) = sec(x)^2\n funcDerivative = new OperatorNode('^', 'pow', [new FunctionNode('sec', [arg0.clone()]), createConstantNode(2)]);\n break;\n case 'sec':\n // d/dx(sec(x)) = sec(x)tan(x)\n funcDerivative = new OperatorNode('*', 'multiply', [node, new FunctionNode('tan', [arg0.clone()])]);\n break;\n case 'csc':\n // d/dx(csc(x)) = -csc(x)cot(x)\n negative = true;\n funcDerivative = new OperatorNode('*', 'multiply', [node, new FunctionNode('cot', [arg0.clone()])]);\n break;\n case 'cot':\n // d/dx(cot(x)) = -csc(x)^2\n negative = true;\n funcDerivative = new OperatorNode('^', 'pow', [new FunctionNode('csc', [arg0.clone()]), createConstantNode(2)]);\n break;\n case 'asin':\n // d/dx(asin(x)) = 1 / sqrt(1 - x^2)\n div = true;\n funcDerivative = new FunctionNode('sqrt', [new OperatorNode('-', 'subtract', [createConstantNode(1), new OperatorNode('^', 'pow', [arg0.clone(), createConstantNode(2)])])]);\n break;\n case 'acos':\n // d/dx(acos(x)) = -1 / sqrt(1 - x^2)\n div = true;\n negative = true;\n funcDerivative = new FunctionNode('sqrt', [new OperatorNode('-', 'subtract', [createConstantNode(1), new OperatorNode('^', 'pow', [arg0.clone(), createConstantNode(2)])])]);\n break;\n case 'atan':\n // d/dx(atan(x)) = 1 / (x^2 + 1)\n div = true;\n funcDerivative = new OperatorNode('+', 'add', [new OperatorNode('^', 'pow', [arg0.clone(), createConstantNode(2)]), createConstantNode(1)]);\n break;\n case 'asec':\n // d/dx(asec(x)) = 1 / (|x|*sqrt(x^2 - 1))\n div = true;\n funcDerivative = new OperatorNode('*', 'multiply', [new FunctionNode('abs', [arg0.clone()]), new FunctionNode('sqrt', [new OperatorNode('-', 'subtract', [new OperatorNode('^', 'pow', [arg0.clone(), createConstantNode(2)]), createConstantNode(1)])])]);\n break;\n case 'acsc':\n // d/dx(acsc(x)) = -1 / (|x|*sqrt(x^2 - 1))\n div = true;\n negative = true;\n funcDerivative = new OperatorNode('*', 'multiply', [new FunctionNode('abs', [arg0.clone()]), new FunctionNode('sqrt', [new OperatorNode('-', 'subtract', [new OperatorNode('^', 'pow', [arg0.clone(), createConstantNode(2)]), createConstantNode(1)])])]);\n break;\n case 'acot':\n // d/dx(acot(x)) = -1 / (x^2 + 1)\n div = true;\n negative = true;\n funcDerivative = new OperatorNode('+', 'add', [new OperatorNode('^', 'pow', [arg0.clone(), createConstantNode(2)]), createConstantNode(1)]);\n break;\n case 'sinh':\n // d/dx(sinh(x)) = cosh(x)\n funcDerivative = new FunctionNode('cosh', [arg0.clone()]);\n break;\n case 'cosh':\n // d/dx(cosh(x)) = sinh(x)\n funcDerivative = new FunctionNode('sinh', [arg0.clone()]);\n break;\n case 'tanh':\n // d/dx(tanh(x)) = sech(x)^2\n funcDerivative = new OperatorNode('^', 'pow', [new FunctionNode('sech', [arg0.clone()]), createConstantNode(2)]);\n break;\n case 'sech':\n // d/dx(sech(x)) = -sech(x)tanh(x)\n negative = true;\n funcDerivative = new OperatorNode('*', 'multiply', [node, new FunctionNode('tanh', [arg0.clone()])]);\n break;\n case 'csch':\n // d/dx(csch(x)) = -csch(x)coth(x)\n negative = true;\n funcDerivative = new OperatorNode('*', 'multiply', [node, new FunctionNode('coth', [arg0.clone()])]);\n break;\n case 'coth':\n // d/dx(coth(x)) = -csch(x)^2\n negative = true;\n funcDerivative = new OperatorNode('^', 'pow', [new FunctionNode('csch', [arg0.clone()]), createConstantNode(2)]);\n break;\n case 'asinh':\n // d/dx(asinh(x)) = 1 / sqrt(x^2 + 1)\n div = true;\n funcDerivative = new FunctionNode('sqrt', [new OperatorNode('+', 'add', [new OperatorNode('^', 'pow', [arg0.clone(), createConstantNode(2)]), createConstantNode(1)])]);\n break;\n case 'acosh':\n // d/dx(acosh(x)) = 1 / sqrt(x^2 - 1); XXX potentially only for x >= 1 (the real spectrum)\n div = true;\n funcDerivative = new FunctionNode('sqrt', [new OperatorNode('-', 'subtract', [new OperatorNode('^', 'pow', [arg0.clone(), createConstantNode(2)]), createConstantNode(1)])]);\n break;\n case 'atanh':\n // d/dx(atanh(x)) = 1 / (1 - x^2)\n div = true;\n funcDerivative = new OperatorNode('-', 'subtract', [createConstantNode(1), new OperatorNode('^', 'pow', [arg0.clone(), createConstantNode(2)])]);\n break;\n case 'asech':\n // d/dx(asech(x)) = -1 / (x*sqrt(1 - x^2))\n div = true;\n negative = true;\n funcDerivative = new OperatorNode('*', 'multiply', [arg0.clone(), new FunctionNode('sqrt', [new OperatorNode('-', 'subtract', [createConstantNode(1), new OperatorNode('^', 'pow', [arg0.clone(), createConstantNode(2)])])])]);\n break;\n case 'acsch':\n // d/dx(acsch(x)) = -1 / (|x|*sqrt(x^2 + 1))\n div = true;\n negative = true;\n funcDerivative = new OperatorNode('*', 'multiply', [new FunctionNode('abs', [arg0.clone()]), new FunctionNode('sqrt', [new OperatorNode('+', 'add', [new OperatorNode('^', 'pow', [arg0.clone(), createConstantNode(2)]), createConstantNode(1)])])]);\n break;\n case 'acoth':\n // d/dx(acoth(x)) = -1 / (1 - x^2)\n div = true;\n negative = true;\n funcDerivative = new OperatorNode('-', 'subtract', [createConstantNode(1), new OperatorNode('^', 'pow', [arg0.clone(), createConstantNode(2)])]);\n break;\n case 'abs':\n // d/dx(abs(x)) = abs(x)/x\n funcDerivative = new OperatorNode('/', 'divide', [new FunctionNode(new SymbolNode('abs'), [arg0.clone()]), arg0.clone()]);\n break;\n case 'gamma': // Needs digamma function, d/dx(gamma(x)) = gamma(x)digamma(x)\n default:\n throw new Error('Function \"' + node.name + '\" is not supported by derivative, or a wrong number of arguments is passed');\n }\n var op, func;\n if (div) {\n op = '/';\n func = 'divide';\n } else {\n op = '*';\n func = 'multiply';\n }\n\n /* Apply chain rule to all functions:\n F(x) = f(g(x))\n F'(x) = g'(x)*f'(g(x)) */\n var chainDerivative = _derivative(arg0, constNodes);\n if (negative) {\n chainDerivative = new OperatorNode('-', 'unaryMinus', [chainDerivative]);\n }\n return new OperatorNode(op, func, [chainDerivative, funcDerivative]);\n },\n 'OperatorNode, Object': function OperatorNodeObject(node, constNodes) {\n if (constNodes[node] !== undefined) {\n return createConstantNode(0);\n }\n if (node.op === '+') {\n // d/dx(sum(f(x)) = sum(f'(x))\n return new OperatorNode(node.op, node.fn, node.args.map(function (arg) {\n return _derivative(arg, constNodes);\n }));\n }\n if (node.op === '-') {\n // d/dx(+/-f(x)) = +/-f'(x)\n if (node.isUnary()) {\n return new OperatorNode(node.op, node.fn, [_derivative(node.args[0], constNodes)]);\n }\n\n // Linearity of differentiation, d/dx(f(x) +/- g(x)) = f'(x) +/- g'(x)\n if (node.isBinary()) {\n return new OperatorNode(node.op, node.fn, [_derivative(node.args[0], constNodes), _derivative(node.args[1], constNodes)]);\n }\n }\n if (node.op === '*') {\n // d/dx(c*f(x)) = c*f'(x)\n var constantTerms = node.args.filter(function (arg) {\n return constNodes[arg] !== undefined;\n });\n if (constantTerms.length > 0) {\n var nonConstantTerms = node.args.filter(function (arg) {\n return constNodes[arg] === undefined;\n });\n var nonConstantNode = nonConstantTerms.length === 1 ? nonConstantTerms[0] : new OperatorNode('*', 'multiply', nonConstantTerms);\n var newArgs = constantTerms.concat(_derivative(nonConstantNode, constNodes));\n return new OperatorNode('*', 'multiply', newArgs);\n }\n\n // Product Rule, d/dx(f(x)*g(x)) = f'(x)*g(x) + f(x)*g'(x)\n return new OperatorNode('+', 'add', node.args.map(function (argOuter) {\n return new OperatorNode('*', 'multiply', node.args.map(function (argInner) {\n return argInner === argOuter ? _derivative(argInner, constNodes) : argInner.clone();\n }));\n }));\n }\n if (node.op === '/' && node.isBinary()) {\n var arg0 = node.args[0];\n var arg1 = node.args[1];\n\n // d/dx(f(x) / c) = f'(x) / c\n if (constNodes[arg1] !== undefined) {\n return new OperatorNode('/', 'divide', [_derivative(arg0, constNodes), arg1]);\n }\n\n // Reciprocal Rule, d/dx(c / f(x)) = -c(f'(x)/f(x)^2)\n if (constNodes[arg0] !== undefined) {\n return new OperatorNode('*', 'multiply', [new OperatorNode('-', 'unaryMinus', [arg0]), new OperatorNode('/', 'divide', [_derivative(arg1, constNodes), new OperatorNode('^', 'pow', [arg1.clone(), createConstantNode(2)])])]);\n }\n\n // Quotient rule, d/dx(f(x) / g(x)) = (f'(x)g(x) - f(x)g'(x)) / g(x)^2\n return new OperatorNode('/', 'divide', [new OperatorNode('-', 'subtract', [new OperatorNode('*', 'multiply', [_derivative(arg0, constNodes), arg1.clone()]), new OperatorNode('*', 'multiply', [arg0.clone(), _derivative(arg1, constNodes)])]), new OperatorNode('^', 'pow', [arg1.clone(), createConstantNode(2)])]);\n }\n if (node.op === '^' && node.isBinary()) {\n var _arg = node.args[0];\n var _arg2 = node.args[1];\n if (constNodes[_arg] !== undefined) {\n // If is secretly constant; 0^f(x) = 1 (in JS), 1^f(x) = 1\n if (isConstantNode(_arg) && (isZero(_arg.value) || equal(_arg.value, 1))) {\n return createConstantNode(0);\n }\n\n // d/dx(c^f(x)) = c^f(x)*ln(c)*f'(x)\n return new OperatorNode('*', 'multiply', [node, new OperatorNode('*', 'multiply', [new FunctionNode('log', [_arg.clone()]), _derivative(_arg2.clone(), constNodes)])]);\n }\n if (constNodes[_arg2] !== undefined) {\n if (isConstantNode(_arg2)) {\n // If is secretly constant; f(x)^0 = 1 -> d/dx(1) = 0\n if (isZero(_arg2.value)) {\n return createConstantNode(0);\n }\n // Ignore exponent; f(x)^1 = f(x)\n if (equal(_arg2.value, 1)) {\n return _derivative(_arg, constNodes);\n }\n }\n\n // Elementary Power Rule, d/dx(f(x)^c) = c*f'(x)*f(x)^(c-1)\n var powMinusOne = new OperatorNode('^', 'pow', [_arg.clone(), new OperatorNode('-', 'subtract', [_arg2, createConstantNode(1)])]);\n return new OperatorNode('*', 'multiply', [_arg2.clone(), new OperatorNode('*', 'multiply', [_derivative(_arg, constNodes), powMinusOne])]);\n }\n\n // Functional Power Rule, d/dx(f^g) = f^g*[f'*(g/f) + g'ln(f)]\n return new OperatorNode('*', 'multiply', [new OperatorNode('^', 'pow', [_arg.clone(), _arg2.clone()]), new OperatorNode('+', 'add', [new OperatorNode('*', 'multiply', [_derivative(_arg, constNodes), new OperatorNode('/', 'divide', [_arg2.clone(), _arg.clone()])]), new OperatorNode('*', 'multiply', [_derivative(_arg2, constNodes), new FunctionNode('log', [_arg.clone()])])])]);\n }\n throw new Error('Operator \"' + node.op + '\" is not supported by derivative, or a wrong number of arguments is passed');\n }\n });\n\n /**\n * Ensures the number of arguments for a function are correct,\n * and will throw an error otherwise.\n *\n * @param {FunctionNode} node\n */\n function funcArgsCheck(node) {\n // TODO add min, max etc\n if ((node.name === 'log' || node.name === 'nthRoot' || node.name === 'pow') && node.args.length === 2) {\n return;\n }\n\n // There should be an incorrect number of arguments if we reach here\n\n // Change all args to constants to avoid unidentified\n // symbol error when compiling function\n for (var i = 0; i < node.args.length; ++i) {\n node.args[i] = createConstantNode(0);\n }\n node.compile().evaluate();\n throw new Error('Expected TypeError, but none found');\n }\n\n /**\n * Helper function to create a constant node with a specific type\n * (number, BigNumber, Fraction)\n * @param {number} value\n * @param {string} [valueType]\n * @return {ConstantNode}\n */\n function createConstantNode(value, valueType) {\n return new ConstantNode(numeric(value, valueType || config.number));\n }\n return derivative;\n});","import { isInteger } from '../../utils/number.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'rationalize';\nvar dependencies = ['config', 'typed', 'equal', 'isZero', 'add', 'subtract', 'multiply', 'divide', 'pow', 'parse', 'simplifyConstant', 'simplifyCore', 'simplify', '?bignumber', '?fraction', 'mathWithTransform', 'matrix', 'AccessorNode', 'ArrayNode', 'ConstantNode', 'FunctionNode', 'IndexNode', 'ObjectNode', 'OperatorNode', 'SymbolNode', 'ParenthesisNode'];\nexport var createRationalize = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n config,\n typed,\n equal,\n isZero,\n add,\n subtract,\n multiply,\n divide,\n pow,\n parse,\n simplifyConstant,\n simplifyCore,\n simplify,\n fraction,\n bignumber,\n mathWithTransform,\n matrix,\n AccessorNode,\n ArrayNode,\n ConstantNode,\n FunctionNode,\n IndexNode,\n ObjectNode,\n OperatorNode,\n SymbolNode,\n ParenthesisNode\n } = _ref;\n /**\n * Transform a rationalizable expression in a rational fraction.\n * If rational fraction is one variable polynomial then converts\n * the numerator and denominator in canonical form, with decreasing\n * exponents, returning the coefficients of numerator.\n *\n * Syntax:\n *\n * math.rationalize(expr)\n * math.rationalize(expr, detailed)\n * math.rationalize(expr, scope)\n * math.rationalize(expr, scope, detailed)\n *\n * Examples:\n *\n * math.rationalize('sin(x)+y')\n * // Error: There is an unsolved function call\n * math.rationalize('2x/y - y/(x+1)')\n * // (2*x^2-y^2+2*x)/(x*y+y)\n * math.rationalize('(2x+1)^6')\n * // 64*x^6+192*x^5+240*x^4+160*x^3+60*x^2+12*x+1\n * math.rationalize('2x/( (2x-1) / (3x+2) ) - 5x/ ( (3x+4) / (2x^2-5) ) + 3')\n * // -20*x^4+28*x^3+104*x^2+6*x-12)/(6*x^2+5*x-4)\n * math.rationalize('x/(1-x)/(x-2)/(x-3)/(x-4) + 2x/ ( (1-2x)/(2-3x) )/ ((3-4x)/(4-5x) )') =\n * // (-30*x^7+344*x^6-1506*x^5+3200*x^4-3472*x^3+1846*x^2-381*x)/\n * // (-8*x^6+90*x^5-383*x^4+780*x^3-797*x^2+390*x-72)\n *\n * math.rationalize('x+x+x+y',{y:1}) // 3*x+1\n * math.rationalize('x+x+x+y',{}) // 3*x+y\n *\n * const ret = math.rationalize('x+x+x+y',{},true)\n * // ret.expression=3*x+y, ret.variables = [\"x\",\"y\"]\n * const ret = math.rationalize('-2+5x^2',{},true)\n * // ret.expression=5*x^2-2, ret.variables = [\"x\"], ret.coefficients=[-2,0,5]\n *\n * See also:\n *\n * simplify\n *\n * @param {Node|string} expr The expression to check if is a polynomial expression\n * @param {Object|boolean} optional scope of expression or true for already evaluated rational expression at input\n * @param {Boolean} detailed optional True if return an object, false if return expression node (default)\n *\n * @return {Object | Node} The rational polynomial of `expr` or an object\n * `{expression, numerator, denominator, variables, coefficients}`, where\n * `expression` is a `Node` with the node simplified expression,\n * `numerator` is a `Node` with the simplified numerator of expression,\n * `denominator` is a `Node` or `boolean` with the simplified denominator or `false` (if there is no denominator),\n * `variables` is an array with variable names,\n * and `coefficients` is an array with coefficients of numerator sorted by increased exponent\n * {Expression Node} node simplified expression\n *\n */\n function _rationalize(expr) {\n var scope = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var detailed = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var setRules = rulesRationalize(); // Rules for change polynomial in near canonical form\n var polyRet = polynomial(expr, scope, true, setRules.firstRules); // Check if expression is a rationalizable polynomial\n var nVars = polyRet.variables.length;\n var noExactFractions = {\n exactFractions: false\n };\n var withExactFractions = {\n exactFractions: true\n };\n expr = polyRet.expression;\n if (nVars >= 1) {\n // If expression in not a constant\n expr = expandPower(expr); // First expand power of polynomials (cannot be made from rules!)\n var sBefore; // Previous expression\n var rules;\n var eDistrDiv = true;\n var redoInic = false;\n // Apply the initial rules, including succ div rules:\n expr = simplify(expr, setRules.firstRules, {}, noExactFractions);\n var s;\n while (true) {\n // Alternate applying successive division rules and distr.div.rules\n // until there are no more changes:\n rules = eDistrDiv ? setRules.distrDivRules : setRules.sucDivRules;\n expr = simplify(expr, rules, {}, withExactFractions);\n eDistrDiv = !eDistrDiv; // Swap between Distr.Div and Succ. Div. Rules\n\n s = expr.toString();\n if (s === sBefore) {\n break; // No changes : end of the loop\n }\n\n redoInic = true;\n sBefore = s;\n }\n if (redoInic) {\n // Apply first rules again without succ div rules (if there are changes)\n expr = simplify(expr, setRules.firstRulesAgain, {}, noExactFractions);\n }\n // Apply final rules:\n expr = simplify(expr, setRules.finalRules, {}, noExactFractions);\n } // NVars >= 1\n\n var coefficients = [];\n var retRationalize = {};\n if (expr.type === 'OperatorNode' && expr.isBinary() && expr.op === '/') {\n // Separate numerator from denominator\n if (nVars === 1) {\n expr.args[0] = polyToCanonical(expr.args[0], coefficients);\n expr.args[1] = polyToCanonical(expr.args[1]);\n }\n if (detailed) {\n retRationalize.numerator = expr.args[0];\n retRationalize.denominator = expr.args[1];\n }\n } else {\n if (nVars === 1) {\n expr = polyToCanonical(expr, coefficients);\n }\n if (detailed) {\n retRationalize.numerator = expr;\n retRationalize.denominator = null;\n }\n }\n // nVars\n\n if (!detailed) return expr;\n retRationalize.coefficients = coefficients;\n retRationalize.variables = polyRet.variables;\n retRationalize.expression = expr;\n return retRationalize;\n }\n return typed(name, {\n Node: _rationalize,\n 'Node, boolean': (expr, detailed) => _rationalize(expr, {}, detailed),\n 'Node, Object': _rationalize,\n 'Node, Object, boolean': _rationalize\n }); // end of typed rationalize\n\n /**\n * Function to simplify an expression using an optional scope and\n * return it if the expression is a polynomial expression, i.e.\n * an expression with one or more variables and the operators\n * +, -, *, and ^, where the exponent can only be a positive integer.\n *\n * Syntax:\n *\n * polynomial(expr,scope,extended, rules)\n *\n * @param {Node | string} expr The expression to simplify and check if is polynomial expression\n * @param {object} scope Optional scope for expression simplification\n * @param {boolean} extended Optional. Default is false. When true allows divide operator.\n * @param {array} rules Optional. Default is no rule.\n *\n *\n * @return {Object}\n * {Object} node: node simplified expression\n * {Array} variables: variable names\n */\n function polynomial(expr, scope, extended, rules) {\n var variables = [];\n var node = simplify(expr, rules, scope, {\n exactFractions: false\n }); // Resolves any variables and functions with all defined parameters\n extended = !!extended;\n var oper = '+-*' + (extended ? '/' : '');\n recPoly(node);\n var retFunc = {};\n retFunc.expression = node;\n retFunc.variables = variables;\n return retFunc;\n\n // -------------------------------------------------------------------------------------------------------\n\n /**\n * Function to simplify an expression using an optional scope and\n * return it if the expression is a polynomial expression, i.e.\n * an expression with one or more variables and the operators\n * +, -, *, and ^, where the exponent can only be a positive integer.\n *\n * Syntax:\n *\n * recPoly(node)\n *\n *\n * @param {Node} node The current sub tree expression in recursion\n *\n * @return nothing, throw an exception if error\n */\n function recPoly(node) {\n var tp = node.type; // node type\n if (tp === 'FunctionNode') {\n // No function call in polynomial expression\n throw new Error('There is an unsolved function call');\n } else if (tp === 'OperatorNode') {\n if (node.op === '^') {\n // TODO: handle negative exponents like in '1/x^(-2)'\n if (node.args[1].type !== 'ConstantNode' || !isInteger(parseFloat(node.args[1].value))) {\n throw new Error('There is a non-integer exponent');\n } else {\n recPoly(node.args[0]);\n }\n } else {\n if (oper.indexOf(node.op) === -1) {\n throw new Error('Operator ' + node.op + ' invalid in polynomial expression');\n }\n for (var i = 0; i < node.args.length; i++) {\n recPoly(node.args[i]);\n }\n } // type of operator\n } else if (tp === 'SymbolNode') {\n var _name = node.name; // variable name\n var pos = variables.indexOf(_name);\n if (pos === -1) {\n // new variable in expression\n variables.push(_name);\n }\n } else if (tp === 'ParenthesisNode') {\n recPoly(node.content);\n } else if (tp !== 'ConstantNode') {\n throw new Error('type ' + tp + ' is not allowed in polynomial expression');\n }\n } // end of recPoly\n } // end of polynomial\n\n // ---------------------------------------------------------------------------------------\n /**\n * Return a rule set to rationalize an polynomial expression in rationalize\n *\n * Syntax:\n *\n * rulesRationalize()\n *\n * @return {array} rule set to rationalize an polynomial expression\n */\n function rulesRationalize() {\n var oldRules = [simplifyCore,\n // sCore\n {\n l: 'n+n',\n r: '2*n'\n }, {\n l: 'n+-n',\n r: '0'\n }, simplifyConstant,\n // sConstant\n {\n l: 'n*(n1^-1)',\n r: 'n/n1'\n }, {\n l: 'n*n1^-n2',\n r: 'n/n1^n2'\n }, {\n l: 'n1^-1',\n r: '1/n1'\n }, {\n l: 'n*(n1/n2)',\n r: '(n*n1)/n2'\n }, {\n l: '1*n',\n r: 'n'\n }];\n var rulesFirst = [{\n l: '(-n1)/(-n2)',\n r: 'n1/n2'\n },\n // Unary division\n {\n l: '(-n1)*(-n2)',\n r: 'n1*n2'\n },\n // Unary multiplication\n {\n l: 'n1--n2',\n r: 'n1+n2'\n },\n // '--' elimination\n {\n l: 'n1-n2',\n r: 'n1+(-n2)'\n },\n // Subtraction turn into add with un�ry minus\n {\n l: '(n1+n2)*n3',\n r: '(n1*n3 + n2*n3)'\n },\n // Distributive 1\n {\n l: 'n1*(n2+n3)',\n r: '(n1*n2+n1*n3)'\n },\n // Distributive 2\n {\n l: 'c1*n + c2*n',\n r: '(c1+c2)*n'\n },\n // Joining constants\n {\n l: 'c1*n + n',\n r: '(c1+1)*n'\n },\n // Joining constants\n {\n l: 'c1*n - c2*n',\n r: '(c1-c2)*n'\n },\n // Joining constants\n {\n l: 'c1*n - n',\n r: '(c1-1)*n'\n },\n // Joining constants\n {\n l: 'v/c',\n r: '(1/c)*v'\n },\n // variable/constant (new!)\n {\n l: 'v/-c',\n r: '-(1/c)*v'\n },\n // variable/constant (new!)\n {\n l: '-v*-c',\n r: 'c*v'\n },\n // Inversion constant and variable 1\n {\n l: '-v*c',\n r: '-c*v'\n },\n // Inversion constant and variable 2\n {\n l: 'v*-c',\n r: '-c*v'\n },\n // Inversion constant and variable 3\n {\n l: 'v*c',\n r: 'c*v'\n },\n // Inversion constant and variable 4\n {\n l: '-(-n1*n2)',\n r: '(n1*n2)'\n },\n // Unary propagation\n {\n l: '-(n1*n2)',\n r: '(-n1*n2)'\n },\n // Unary propagation\n {\n l: '-(-n1+n2)',\n r: '(n1-n2)'\n },\n // Unary propagation\n {\n l: '-(n1+n2)',\n r: '(-n1-n2)'\n },\n // Unary propagation\n {\n l: '(n1^n2)^n3',\n r: '(n1^(n2*n3))'\n },\n // Power to Power\n {\n l: '-(-n1/n2)',\n r: '(n1/n2)'\n },\n // Division and Unary\n {\n l: '-(n1/n2)',\n r: '(-n1/n2)'\n }]; // Divisao and Unary\n\n var rulesDistrDiv = [{\n l: '(n1/n2 + n3/n4)',\n r: '((n1*n4 + n3*n2)/(n2*n4))'\n },\n // Sum of fractions\n {\n l: '(n1/n2 + n3)',\n r: '((n1 + n3*n2)/n2)'\n },\n // Sum fraction with number 1\n {\n l: '(n1 + n2/n3)',\n r: '((n1*n3 + n2)/n3)'\n }]; // Sum fraction with number 1\n\n var rulesSucDiv = [{\n l: '(n1/(n2/n3))',\n r: '((n1*n3)/n2)'\n },\n // Division simplification\n {\n l: '(n1/n2/n3)',\n r: '(n1/(n2*n3))'\n }];\n var setRules = {}; // rules set in 4 steps.\n\n // All rules => infinite loop\n // setRules.allRules =oldRules.concat(rulesFirst,rulesDistrDiv,rulesSucDiv)\n\n setRules.firstRules = oldRules.concat(rulesFirst, rulesSucDiv); // First rule set\n setRules.distrDivRules = rulesDistrDiv; // Just distr. div. rules\n setRules.sucDivRules = rulesSucDiv; // Jus succ. div. rules\n setRules.firstRulesAgain = oldRules.concat(rulesFirst); // Last rules set without succ. div.\n\n // Division simplification\n\n // Second rule set.\n // There is no aggregate expression with parentesis, but the only variable can be scattered.\n setRules.finalRules = [simplifyCore,\n // simplify.rules[0]\n {\n l: 'n*-n',\n r: '-n^2'\n },\n // Joining multiply with power 1\n {\n l: 'n*n',\n r: 'n^2'\n },\n // Joining multiply with power 2\n simplifyConstant,\n // simplify.rules[14] old 3rd index in oldRules\n {\n l: 'n*-n^n1',\n r: '-n^(n1+1)'\n },\n // Joining multiply with power 3\n {\n l: 'n*n^n1',\n r: 'n^(n1+1)'\n },\n // Joining multiply with power 4\n {\n l: 'n^n1*-n^n2',\n r: '-n^(n1+n2)'\n },\n // Joining multiply with power 5\n {\n l: 'n^n1*n^n2',\n r: 'n^(n1+n2)'\n },\n // Joining multiply with power 6\n {\n l: 'n^n1*-n',\n r: '-n^(n1+1)'\n },\n // Joining multiply with power 7\n {\n l: 'n^n1*n',\n r: 'n^(n1+1)'\n },\n // Joining multiply with power 8\n {\n l: 'n^n1/-n',\n r: '-n^(n1-1)'\n },\n // Joining multiply with power 8\n {\n l: 'n^n1/n',\n r: 'n^(n1-1)'\n },\n // Joining division with power 1\n {\n l: 'n/-n^n1',\n r: '-n^(1-n1)'\n },\n // Joining division with power 2\n {\n l: 'n/n^n1',\n r: 'n^(1-n1)'\n },\n // Joining division with power 3\n {\n l: 'n^n1/-n^n2',\n r: 'n^(n1-n2)'\n },\n // Joining division with power 4\n {\n l: 'n^n1/n^n2',\n r: 'n^(n1-n2)'\n },\n // Joining division with power 5\n {\n l: 'n1+(-n2*n3)',\n r: 'n1-n2*n3'\n },\n // Solving useless parenthesis 1\n {\n l: 'v*(-c)',\n r: '-c*v'\n },\n // Solving useless unary 2\n {\n l: 'n1+-n2',\n r: 'n1-n2'\n },\n // Solving +- together (new!)\n {\n l: 'v*c',\n r: 'c*v'\n },\n // inversion constant with variable\n {\n l: '(n1^n2)^n3',\n r: '(n1^(n2*n3))'\n } // Power to Power\n ];\n\n return setRules;\n } // End rulesRationalize\n\n // ---------------------------------------------------------------------------------------\n /**\n * Expand recursively a tree node for handling with expressions with exponents\n * (it's not for constants, symbols or functions with exponents)\n * PS: The other parameters are internal for recursion\n *\n * Syntax:\n *\n * expandPower(node)\n *\n * @param {Node} node Current expression node\n * @param {node} parent Parent current node inside the recursion\n * @param (int} Parent number of chid inside the rercursion\n *\n * @return {node} node expression with all powers expanded.\n */\n function expandPower(node, parent, indParent) {\n var tp = node.type;\n var internal = arguments.length > 1; // TRUE in internal calls\n\n if (tp === 'OperatorNode' && node.isBinary()) {\n var does = false;\n var val;\n if (node.op === '^') {\n // First operator: Parenthesis or UnaryMinus\n if ((node.args[0].type === 'ParenthesisNode' || node.args[0].type === 'OperatorNode') && node.args[1].type === 'ConstantNode') {\n // Second operator: Constant\n val = parseFloat(node.args[1].value);\n does = val >= 2 && isInteger(val);\n }\n }\n if (does) {\n // Exponent >= 2\n // Before:\n // operator A --> Subtree\n // parent pow\n // constant\n //\n if (val > 2) {\n // Exponent > 2,\n // AFTER: (exponent > 2)\n // operator A --> Subtree\n // parent *\n // deep clone (operator A --> Subtree\n // pow\n // constant - 1\n //\n var nEsqTopo = node.args[0];\n var nDirTopo = new OperatorNode('^', 'pow', [node.args[0].cloneDeep(), new ConstantNode(val - 1)]);\n node = new OperatorNode('*', 'multiply', [nEsqTopo, nDirTopo]);\n } else {\n // Expo = 2 - no power\n // AFTER: (exponent = 2)\n // operator A --> Subtree\n // parent oper\n // deep clone (operator A --> Subtree)\n //\n node = new OperatorNode('*', 'multiply', [node.args[0], node.args[0].cloneDeep()]);\n }\n if (internal) {\n // Change parent references in internal recursive calls\n if (indParent === 'content') {\n parent.content = node;\n } else {\n parent.args[indParent] = node;\n }\n }\n } // does\n } // binary OperatorNode\n\n if (tp === 'ParenthesisNode') {\n // Recursion\n expandPower(node.content, node, 'content');\n } else if (tp !== 'ConstantNode' && tp !== 'SymbolNode') {\n for (var i = 0; i < node.args.length; i++) {\n expandPower(node.args[i], node, i);\n }\n }\n if (!internal) {\n // return the root node\n return node;\n }\n } // End expandPower\n\n // ---------------------------------------------------------------------------------------\n /**\n * Auxilary function for rationalize\n * Convert near canonical polynomial in one variable in a canonical polynomial\n * with one term for each exponent in decreasing order\n *\n * Syntax:\n *\n * polyToCanonical(node [, coefficients])\n *\n * @param {Node | string} expr The near canonical polynomial expression to convert in a a canonical polynomial expression\n *\n * The string or tree expression needs to be at below syntax, with free spaces:\n * ( (^(-)? | [+-]? )cte (*)? var (^expo)? | cte )+\n * Where 'var' is one variable with any valid name\n * 'cte' are real numeric constants with any value. It can be omitted if equal than 1\n * 'expo' are integers greater than 0. It can be omitted if equal than 1.\n *\n * @param {array} coefficients Optional returns coefficients sorted by increased exponent\n *\n *\n * @return {node} new node tree with one variable polynomial or string error.\n */\n function polyToCanonical(node, coefficients) {\n if (coefficients === undefined) {\n coefficients = [];\n } // coefficients.\n\n coefficients[0] = 0; // index is the exponent\n var o = {};\n o.cte = 1;\n o.oper = '+';\n\n // fire: mark with * or ^ when finds * or ^ down tree, reset to \"\" with + and -.\n // It is used to deduce the exponent: 1 for *, 0 for \"\".\n o.fire = '';\n var maxExpo = 0; // maximum exponent\n var varname = ''; // variable name\n\n recurPol(node, null, o);\n maxExpo = coefficients.length - 1;\n var first = true;\n var no;\n for (var i = maxExpo; i >= 0; i--) {\n if (coefficients[i] === 0) continue;\n var n1 = new ConstantNode(first ? coefficients[i] : Math.abs(coefficients[i]));\n var op = coefficients[i] < 0 ? '-' : '+';\n if (i > 0) {\n // Is not a constant without variable\n var n2 = new SymbolNode(varname);\n if (i > 1) {\n var n3 = new ConstantNode(i);\n n2 = new OperatorNode('^', 'pow', [n2, n3]);\n }\n if (coefficients[i] === -1 && first) {\n n1 = new OperatorNode('-', 'unaryMinus', [n2]);\n } else if (Math.abs(coefficients[i]) === 1) {\n n1 = n2;\n } else {\n n1 = new OperatorNode('*', 'multiply', [n1, n2]);\n }\n }\n if (first) {\n no = n1;\n } else if (op === '+') {\n no = new OperatorNode('+', 'add', [no, n1]);\n } else {\n no = new OperatorNode('-', 'subtract', [no, n1]);\n }\n first = false;\n } // for\n\n if (first) {\n return new ConstantNode(0);\n } else {\n return no;\n }\n\n /**\n * Recursive auxilary function inside polyToCanonical for\n * converting expression in canonical form\n *\n * Syntax:\n *\n * recurPol(node, noPai, obj)\n *\n * @param {Node} node The current subpolynomial expression\n * @param {Node | Null} noPai The current parent node\n * @param {object} obj Object with many internal flags\n *\n * @return {} No return. If error, throws an exception\n */\n function recurPol(node, noPai, o) {\n var tp = node.type;\n if (tp === 'FunctionNode') {\n // ***** FunctionName *****\n // No function call in polynomial expression\n throw new Error('There is an unsolved function call');\n } else if (tp === 'OperatorNode') {\n // ***** OperatorName *****\n if ('+-*^'.indexOf(node.op) === -1) throw new Error('Operator ' + node.op + ' invalid');\n if (noPai !== null) {\n // -(unary),^ : children of *,+,-\n if ((node.fn === 'unaryMinus' || node.fn === 'pow') && noPai.fn !== 'add' && noPai.fn !== 'subtract' && noPai.fn !== 'multiply') {\n throw new Error('Invalid ' + node.op + ' placing');\n }\n\n // -,+,* : children of +,-\n if ((node.fn === 'subtract' || node.fn === 'add' || node.fn === 'multiply') && noPai.fn !== 'add' && noPai.fn !== 'subtract') {\n throw new Error('Invalid ' + node.op + ' placing');\n }\n\n // -,+ : first child\n if ((node.fn === 'subtract' || node.fn === 'add' || node.fn === 'unaryMinus') && o.noFil !== 0) {\n throw new Error('Invalid ' + node.op + ' placing');\n }\n } // Has parent\n\n // Firers: ^,* Old: ^,&,-(unary): firers\n if (node.op === '^' || node.op === '*') {\n o.fire = node.op;\n }\n for (var _i = 0; _i < node.args.length; _i++) {\n // +,-: reset fire\n if (node.fn === 'unaryMinus') o.oper = '-';\n if (node.op === '+' || node.fn === 'subtract') {\n o.fire = '';\n o.cte = 1; // default if there is no constant\n o.oper = _i === 0 ? '+' : node.op;\n }\n o.noFil = _i; // number of son\n recurPol(node.args[_i], node, o);\n } // for in children\n } else if (tp === 'SymbolNode') {\n // ***** SymbolName *****\n if (node.name !== varname && varname !== '') {\n throw new Error('There is more than one variable');\n }\n varname = node.name;\n if (noPai === null) {\n coefficients[1] = 1;\n return;\n }\n\n // ^: Symbol is First child\n if (noPai.op === '^' && o.noFil !== 0) {\n throw new Error('In power the variable should be the first parameter');\n }\n\n // *: Symbol is Second child\n if (noPai.op === '*' && o.noFil !== 1) {\n throw new Error('In multiply the variable should be the second parameter');\n }\n\n // Symbol: firers '',* => it means there is no exponent above, so it's 1 (cte * var)\n if (o.fire === '' || o.fire === '*') {\n if (maxExpo < 1) coefficients[1] = 0;\n coefficients[1] += o.cte * (o.oper === '+' ? 1 : -1);\n maxExpo = Math.max(1, maxExpo);\n }\n } else if (tp === 'ConstantNode') {\n var valor = parseFloat(node.value);\n if (noPai === null) {\n coefficients[0] = valor;\n return;\n }\n if (noPai.op === '^') {\n // cte: second child of power\n if (o.noFil !== 1) throw new Error('Constant cannot be powered');\n if (!isInteger(valor) || valor <= 0) {\n throw new Error('Non-integer exponent is not allowed');\n }\n for (var _i2 = maxExpo + 1; _i2 < valor; _i2++) coefficients[_i2] = 0;\n if (valor > maxExpo) coefficients[valor] = 0;\n coefficients[valor] += o.cte * (o.oper === '+' ? 1 : -1);\n maxExpo = Math.max(valor, maxExpo);\n return;\n }\n o.cte = valor;\n\n // Cte: firer '' => There is no exponent and no multiplication, so the exponent is 0.\n if (o.fire === '') {\n coefficients[0] += o.cte * (o.oper === '+' ? 1 : -1);\n }\n } else {\n throw new Error('Type ' + tp + ' is not allowed');\n }\n } // End of recurPol\n } // End of polyToCanonical\n});","import { factory } from '../../utils/factory.js';\nvar name = 'zpk2tf';\nvar dependencies = ['typed', 'add', 'multiply', 'Complex', 'number'];\nexport var createZpk2tf = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n add,\n multiply,\n Complex,\n number\n } = _ref;\n /**\n * Compute the transfer function of a zero-pole-gain model.\n *\n * Syntax:\n * math.zpk2tf(z, p, k)\n *\n * Examples:\n * math.zpk2tf([1, 2], [-1, -2], 1) // returns [[1, -3, 2], [1, 3, 2]]\n *\n * See also:\n * freqz\n *\n * @param {Array} z Array of zeros values\n * @param {Array} p Array of poles values\n * @param {number} k Gain value\n * @return {Array} Two dimensional array containing the numerator (first row) and denominator (second row) polynomials\n *\n */\n return typed(name, {\n 'Array,Array,number': function ArrayArrayNumber(z, p, k) {\n return _zpk2tf(z, p, k);\n },\n 'Array,Array': function ArrayArray(z, p) {\n return _zpk2tf(z, p, 1);\n },\n 'Matrix,Matrix,number': function MatrixMatrixNumber(z, p, k) {\n return _zpk2tf(z.valueOf(), p.valueOf(), k);\n },\n 'Matrix,Matrix': function MatrixMatrix(z, p) {\n return _zpk2tf(z.valueOf(), p.valueOf(), 1);\n }\n });\n function _zpk2tf(z, p, k) {\n // if z is bignumber, convert it to number\n if (z.some(el => el.type === 'BigNumber')) {\n z = z.map(el => number(el));\n }\n // if p is bignumber, convert it to number\n if (p.some(el => el.type === 'BigNumber')) {\n p = p.map(el => number(el));\n }\n var num = [Complex(1, 0)];\n var den = [Complex(1, 0)];\n for (var i = 0; i < z.length; i++) {\n var zero = z[i];\n if (typeof zero === 'number') zero = Complex(zero, 0);\n num = _multiply(num, [Complex(1, 0), Complex(-zero.re, -zero.im)]);\n }\n for (var _i = 0; _i < p.length; _i++) {\n var pole = p[_i];\n if (typeof pole === 'number') pole = Complex(pole, 0);\n den = _multiply(den, [Complex(1, 0), Complex(-pole.re, -pole.im)]);\n }\n for (var _i2 = 0; _i2 < num.length; _i2++) {\n num[_i2] = multiply(num[_i2], k);\n }\n return [num, den];\n }\n function _multiply(a, b) {\n var c = [];\n for (var i = 0; i < a.length + b.length - 1; i++) {\n c[i] = Complex(0, 0);\n for (var j = 0; j < a.length; j++) {\n if (i - j >= 0 && i - j < b.length) {\n c[i] = add(c[i], multiply(a[j], b[i - j]));\n }\n }\n }\n return c;\n }\n});","import { factory } from '../../utils/factory.js';\nvar name = 'freqz';\nvar dependencies = ['typed', 'add', 'multiply', 'Complex', 'divide', 'matrix'];\nexport var createFreqz = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n add,\n multiply,\n Complex,\n divide,\n matrix\n } = _ref;\n /**\n * Calculates the frequency response of a filter given its numerator and denominator coefficients.\n *\n * Syntax:\n * math.freqz(b, a)\n * math.freqz(b, a, w)\n *\n * Examples:\n * math.freqz([1, 2], [1, 2, 3], 4) // returns { h: [0.5 + 0i, 0.4768589245763655 + 0.2861153547458193i, 0.25000000000000006 + 0.75i, -0.770976571635189 + 0.4625859429811135i], w: [0, 0.7853981633974483, 1.5707963267948966, 2.356194490192345 ] }\n * math.freqz([1, 2], [1, 2, 3], [0, 1]) // returns { h: [0.5 + 0i, 0.45436781 + 0.38598051i], w: [0, 1] }\n *\n * See also:\n * zpk2tf\n *\n * @param {Array.} b The numerator coefficients of the filter.\n * @param {Array.} a The denominator coefficients of the filter.\n * @param {Array.} [w] A vector of frequencies (in radians/sample) at which the frequency response is to be computed or the number of points to compute (if a number is not provided, the default is 512 points)\n * @returns {Object} An object with two properties: h, a vector containing the complex frequency response, and w, a vector containing the normalized frequencies (in radians/sample) at which the response was computed.\n *\n *\n */\n return typed(name, {\n 'Array, Array': function ArrayArray(b, a) {\n var w = createBins(512);\n return _freqz(b, a, w);\n },\n 'Array, Array, Array': function ArrayArrayArray(b, a, w) {\n return _freqz(b, a, w);\n },\n 'Array, Array, number': function ArrayArrayNumber(b, a, w) {\n if (w < 0) {\n throw new Error('w must be a positive number');\n }\n var w2 = createBins(w);\n return _freqz(b, a, w2);\n },\n 'Matrix, Matrix': function MatrixMatrix(b, a) {\n // console.log('here')\n var _w = createBins(512);\n var {\n w,\n h\n } = _freqz(b.valueOf(), a.valueOf(), _w);\n return {\n w: matrix(w),\n h: matrix(h)\n };\n },\n 'Matrix, Matrix, Matrix': function MatrixMatrixMatrix(b, a, w) {\n var {\n h\n } = _freqz(b.valueOf(), a.valueOf(), w.valueOf());\n return {\n h: matrix(h),\n w: matrix(w)\n };\n },\n 'Matrix, Matrix, number': function MatrixMatrixNumber(b, a, w) {\n if (w < 0) {\n throw new Error('w must be a positive number');\n }\n var _w = createBins(w);\n var {\n h\n } = _freqz(b.valueOf(), a.valueOf(), _w);\n return {\n h: matrix(h),\n w: matrix(_w)\n };\n }\n });\n function _freqz(b, a, w) {\n var num = [];\n var den = [];\n for (var i = 0; i < w.length; i++) {\n var sumNum = Complex(0, 0);\n var sumDen = Complex(0, 0);\n for (var j = 0; j < b.length; j++) {\n sumNum = add(sumNum, multiply(b[j], Complex(Math.cos(-j * w[i]), Math.sin(-j * w[i]))));\n }\n for (var _j = 0; _j < a.length; _j++) {\n sumDen = add(sumDen, multiply(a[_j], Complex(Math.cos(-_j * w[i]), Math.sin(-_j * w[i]))));\n }\n num.push(sumNum);\n den.push(sumDen);\n }\n var h = [];\n for (var _i = 0; _i < num.length; _i++) {\n h.push(divide(num[_i], den[_i]));\n }\n return {\n h,\n w\n };\n }\n function createBins(n) {\n var bins = [];\n for (var i = 0; i < n; i++) {\n bins.push(i / n * Math.PI);\n }\n return bins;\n }\n});","import { factory } from '../utils/factory.js';\nvar name = 'reviver';\nvar dependencies = ['classes'];\nexport var createReviver = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n classes\n } = _ref;\n /**\n * Instantiate mathjs data types from their JSON representation\n * @param {string} key\n * @param {*} value\n * @returns {*} Returns the revived object\n */\n return function reviver(key, value) {\n var constructor = classes[value && value.mathjs];\n if (constructor && typeof constructor.fromJSON === 'function') {\n return constructor.fromJSON(value);\n }\n return value;\n };\n});","import { factory } from '../utils/factory.js';\nvar name = 'replacer';\nvar dependencies = [];\nexport var createReplacer = /* #__PURE__ */factory(name, dependencies, () => {\n /**\n * Stringify data types into their JSON representation.\n * Most data types can be serialized using their `.toJSON` method,\n * but not all, for example the number `Infinity`. For these cases you have\n * to use the replacer. Example usage:\n *\n * JSON.stringify([2, Infinity], math.replacer)\n *\n * @param {string} key\n * @param {*} value\n * @returns {*} Returns the replaced object\n */\n return function replacer(key, value) {\n // the numeric values Infinitiy, -Infinity, and NaN cannot be serialized to JSON\n if (typeof value === 'number' && (!isFinite(value) || isNaN(value))) {\n return {\n mathjs: 'number',\n value: String(value)\n };\n }\n return value;\n };\n});","import { factory } from './utils/factory.js';\nimport { version } from './version.js';\nimport { createBigNumberE, createBigNumberPhi, createBigNumberPi, createBigNumberTau } from './utils/bignumber/constants.js';\nimport { pi, tau, e, phi } from './plain/number/index.js';\nexport var createTrue = /* #__PURE__ */factory('true', [], () => true);\nexport var createFalse = /* #__PURE__ */factory('false', [], () => false);\nexport var createNull = /* #__PURE__ */factory('null', [], () => null);\nexport var createInfinity = /* #__PURE__ */recreateFactory('Infinity', ['config', '?BigNumber'], _ref => {\n var {\n config,\n BigNumber\n } = _ref;\n return config.number === 'BigNumber' ? new BigNumber(Infinity) : Infinity;\n});\nexport var createNaN = /* #__PURE__ */recreateFactory('NaN', ['config', '?BigNumber'], _ref2 => {\n var {\n config,\n BigNumber\n } = _ref2;\n return config.number === 'BigNumber' ? new BigNumber(NaN) : NaN;\n});\nexport var createPi = /* #__PURE__ */recreateFactory('pi', ['config', '?BigNumber'], _ref3 => {\n var {\n config,\n BigNumber\n } = _ref3;\n return config.number === 'BigNumber' ? createBigNumberPi(BigNumber) : pi;\n});\nexport var createTau = /* #__PURE__ */recreateFactory('tau', ['config', '?BigNumber'], _ref4 => {\n var {\n config,\n BigNumber\n } = _ref4;\n return config.number === 'BigNumber' ? createBigNumberTau(BigNumber) : tau;\n});\nexport var createE = /* #__PURE__ */recreateFactory('e', ['config', '?BigNumber'], _ref5 => {\n var {\n config,\n BigNumber\n } = _ref5;\n return config.number === 'BigNumber' ? createBigNumberE(BigNumber) : e;\n});\n\n// golden ratio, (1+sqrt(5))/2\nexport var createPhi = /* #__PURE__ */recreateFactory('phi', ['config', '?BigNumber'], _ref6 => {\n var {\n config,\n BigNumber\n } = _ref6;\n return config.number === 'BigNumber' ? createBigNumberPhi(BigNumber) : phi;\n});\nexport var createLN2 = /* #__PURE__ */recreateFactory('LN2', ['config', '?BigNumber'], _ref7 => {\n var {\n config,\n BigNumber\n } = _ref7;\n return config.number === 'BigNumber' ? new BigNumber(2).ln() : Math.LN2;\n});\nexport var createLN10 = /* #__PURE__ */recreateFactory('LN10', ['config', '?BigNumber'], _ref8 => {\n var {\n config,\n BigNumber\n } = _ref8;\n return config.number === 'BigNumber' ? new BigNumber(10).ln() : Math.LN10;\n});\nexport var createLOG2E = /* #__PURE__ */recreateFactory('LOG2E', ['config', '?BigNumber'], _ref9 => {\n var {\n config,\n BigNumber\n } = _ref9;\n return config.number === 'BigNumber' ? new BigNumber(1).div(new BigNumber(2).ln()) : Math.LOG2E;\n});\nexport var createLOG10E = /* #__PURE__ */recreateFactory('LOG10E', ['config', '?BigNumber'], _ref10 => {\n var {\n config,\n BigNumber\n } = _ref10;\n return config.number === 'BigNumber' ? new BigNumber(1).div(new BigNumber(10).ln()) : Math.LOG10E;\n});\nexport var createSQRT1_2 = /* #__PURE__ */recreateFactory(\n// eslint-disable-line camelcase\n'SQRT1_2', ['config', '?BigNumber'], _ref11 => {\n var {\n config,\n BigNumber\n } = _ref11;\n return config.number === 'BigNumber' ? new BigNumber('0.5').sqrt() : Math.SQRT1_2;\n});\nexport var createSQRT2 = /* #__PURE__ */recreateFactory('SQRT2', ['config', '?BigNumber'], _ref12 => {\n var {\n config,\n BigNumber\n } = _ref12;\n return config.number === 'BigNumber' ? new BigNumber(2).sqrt() : Math.SQRT2;\n});\nexport var createI = /* #__PURE__ */recreateFactory('i', ['Complex'], _ref13 => {\n var {\n Complex\n } = _ref13;\n return Complex.I;\n});\n\n// for backward compatibility with v5\nexport var createUppercasePi = /* #__PURE__ */factory('PI', ['pi'], _ref14 => {\n var {\n pi\n } = _ref14;\n return pi;\n});\nexport var createUppercaseE = /* #__PURE__ */factory('E', ['e'], _ref15 => {\n var {\n e\n } = _ref15;\n return e;\n});\nexport var createVersion = /* #__PURE__ */factory('version', [], () => version);\n\n// helper function to create a factory with a flag recreateOnConfigChange\n// idea: allow passing optional properties to be attached to the factory function as 4th argument?\nfunction recreateFactory(name, dependencies, create) {\n return factory(name, dependencies, create, {\n recreateOnConfigChange: true\n });\n}","export var version = '11.9.1';\n// Note: This file is automatically generated when building math.js.\n// Changes made in this file will be overwritten.","import { factory } from '../../utils/factory.js';\n\n// Source: https://en.wikipedia.org/wiki/Physical_constant\n\n// Universal constants\nexport var createSpeedOfLight = /* #__PURE__ */unitFactory('speedOfLight', '299792458', 'm s^-1');\nexport var createGravitationConstant = /* #__PURE__ */unitFactory('gravitationConstant', '6.67430e-11', 'm^3 kg^-1 s^-2');\nexport var createPlanckConstant = /* #__PURE__ */unitFactory('planckConstant', '6.62607015e-34', 'J s');\nexport var createReducedPlanckConstant = /* #__PURE__ */unitFactory('reducedPlanckConstant', '1.0545718176461565e-34', 'J s');\n\n// Electromagnetic constants\nexport var createMagneticConstant = /* #__PURE__ */unitFactory('magneticConstant', '1.25663706212e-6', 'N A^-2');\nexport var createElectricConstant = /* #__PURE__ */unitFactory('electricConstant', '8.8541878128e-12', 'F m^-1');\nexport var createVacuumImpedance = /* #__PURE__ */unitFactory('vacuumImpedance', '376.730313667', 'ohm');\nexport var createCoulomb = /* #__PURE__ */unitFactory('coulomb', '8.987551792261171e9', 'N m^2 C^-2');\nexport var createElementaryCharge = /* #__PURE__ */unitFactory('elementaryCharge', '1.602176634e-19', 'C');\nexport var createBohrMagneton = /* #__PURE__ */unitFactory('bohrMagneton', '9.2740100783e-24', 'J T^-1');\nexport var createConductanceQuantum = /* #__PURE__ */unitFactory('conductanceQuantum', '7.748091729863649e-5', 'S');\nexport var createInverseConductanceQuantum = /* #__PURE__ */unitFactory('inverseConductanceQuantum', '12906.403729652257', 'ohm');\nexport var createMagneticFluxQuantum = /* #__PURE__ */unitFactory('magneticFluxQuantum', '2.0678338484619295e-15', 'Wb');\nexport var createNuclearMagneton = /* #__PURE__ */unitFactory('nuclearMagneton', '5.0507837461e-27', 'J T^-1');\nexport var createKlitzing = /* #__PURE__ */unitFactory('klitzing', '25812.807459304513', 'ohm');\nexport var createJosephson = /* #__PURE__ */unitFactory('josephson', '4.835978484169836e14 Hz V', 'Hz V^-1'); // TODO: support for Hz needed\n\n// Atomic and nuclear constants\nexport var createBohrRadius = /* #__PURE__ */unitFactory('bohrRadius', '5.29177210903e-11', 'm');\nexport var createClassicalElectronRadius = /* #__PURE__ */unitFactory('classicalElectronRadius', '2.8179403262e-15', 'm');\nexport var createElectronMass = /* #__PURE__ */unitFactory('electronMass', '9.1093837015e-31', 'kg');\nexport var createFermiCoupling = /* #__PURE__ */unitFactory('fermiCoupling', '1.1663787e-5', 'GeV^-2');\nexport var createFineStructure = numberFactory('fineStructure', 7.2973525693e-3);\nexport var createHartreeEnergy = /* #__PURE__ */unitFactory('hartreeEnergy', '4.3597447222071e-18', 'J');\nexport var createProtonMass = /* #__PURE__ */unitFactory('protonMass', '1.67262192369e-27', 'kg');\nexport var createDeuteronMass = /* #__PURE__ */unitFactory('deuteronMass', '3.3435830926e-27', 'kg');\nexport var createNeutronMass = /* #__PURE__ */unitFactory('neutronMass', '1.6749271613e-27', 'kg');\nexport var createQuantumOfCirculation = /* #__PURE__ */unitFactory('quantumOfCirculation', '3.6369475516e-4', 'm^2 s^-1');\nexport var createRydberg = /* #__PURE__ */unitFactory('rydberg', '10973731.568160', 'm^-1');\nexport var createThomsonCrossSection = /* #__PURE__ */unitFactory('thomsonCrossSection', '6.6524587321e-29', 'm^2');\nexport var createWeakMixingAngle = numberFactory('weakMixingAngle', 0.22290);\nexport var createEfimovFactor = numberFactory('efimovFactor', 22.7);\n\n// Physico-chemical constants\nexport var createAtomicMass = /* #__PURE__ */unitFactory('atomicMass', '1.66053906660e-27', 'kg');\nexport var createAvogadro = /* #__PURE__ */unitFactory('avogadro', '6.02214076e23', 'mol^-1');\nexport var createBoltzmann = /* #__PURE__ */unitFactory('boltzmann', '1.380649e-23', 'J K^-1');\nexport var createFaraday = /* #__PURE__ */unitFactory('faraday', '96485.33212331001', 'C mol^-1');\nexport var createFirstRadiation = /* #__PURE__ */unitFactory('firstRadiation', '3.7417718521927573e-16', 'W m^2');\n// export const createSpectralRadiance = /* #__PURE__ */ unitFactory('spectralRadiance', '1.1910429723971881e-16', 'W m^2 sr^-1') // TODO spectralRadiance\nexport var createLoschmidt = /* #__PURE__ */unitFactory('loschmidt', '2.686780111798444e25', 'm^-3');\nexport var createGasConstant = /* #__PURE__ */unitFactory('gasConstant', '8.31446261815324', 'J K^-1 mol^-1');\nexport var createMolarPlanckConstant = /* #__PURE__ */unitFactory('molarPlanckConstant', '3.990312712893431e-10', 'J s mol^-1');\nexport var createMolarVolume = /* #__PURE__ */unitFactory('molarVolume', '0.022413969545014137', 'm^3 mol^-1');\nexport var createSackurTetrode = numberFactory('sackurTetrode', -1.16487052358);\nexport var createSecondRadiation = /* #__PURE__ */unitFactory('secondRadiation', '0.014387768775039337', 'm K');\nexport var createStefanBoltzmann = /* #__PURE__ */unitFactory('stefanBoltzmann', '5.67037441918443e-8', 'W m^-2 K^-4');\nexport var createWienDisplacement = /* #__PURE__ */unitFactory('wienDisplacement', '2.897771955e-3', 'm K');\n\n// Adopted values\nexport var createMolarMass = /* #__PURE__ */unitFactory('molarMass', '0.99999999965e-3', 'kg mol^-1');\nexport var createMolarMassC12 = /* #__PURE__ */unitFactory('molarMassC12', '11.9999999958e-3', 'kg mol^-1');\nexport var createGravity = /* #__PURE__ */unitFactory('gravity', '9.80665', 'm s^-2');\n// atm is defined in Unit.js\n\n// Natural units\nexport var createPlanckLength = /* #__PURE__ */unitFactory('planckLength', '1.616255e-35', 'm');\nexport var createPlanckMass = /* #__PURE__ */unitFactory('planckMass', '2.176435e-8', 'kg');\nexport var createPlanckTime = /* #__PURE__ */unitFactory('planckTime', '5.391245e-44', 's');\nexport var createPlanckCharge = /* #__PURE__ */unitFactory('planckCharge', '1.87554603778e-18', 'C');\nexport var createPlanckTemperature = /* #__PURE__ */unitFactory('planckTemperature', '1.416785e+32', 'K');\n\n// helper function to create a factory function which creates a physical constant,\n// a Unit with either a number value or a BigNumber value depending on the configuration\nfunction unitFactory(name, valueStr, unitStr) {\n var dependencies = ['config', 'Unit', 'BigNumber'];\n return factory(name, dependencies, _ref => {\n var {\n config,\n Unit,\n BigNumber\n } = _ref;\n // Note that we can parse into number or BigNumber.\n // We do not parse into Fractions as that doesn't make sense: we would lose precision of the values\n // Therefore we dont use Unit.parse()\n var value = config.number === 'BigNumber' ? new BigNumber(valueStr) : parseFloat(valueStr);\n var unit = new Unit(value, unitStr);\n unit.fixPrefix = true;\n return unit;\n });\n}\n\n// helper function to create a factory function which creates a numeric constant,\n// either a number or BigNumber depending on the configuration\nfunction numberFactory(name, value) {\n var dependencies = ['config', 'BigNumber'];\n return factory(name, dependencies, _ref2 => {\n var {\n config,\n BigNumber\n } = _ref2;\n return config.number === 'BigNumber' ? new BigNumber(value) : value;\n });\n}","import { errorTransform } from './utils/errorTransform.js';\nimport { factory } from '../../utils/factory.js';\nimport { createApply } from '../../function/matrix/apply.js';\nimport { isBigNumber, isNumber } from '../../utils/is.js';\nvar name = 'apply';\nvar dependencies = ['typed', 'isInteger'];\n\n/**\n * Attach a transform function to math.apply\n * Adds a property transform containing the transform function.\n *\n * This transform changed the last `dim` parameter of function apply\n * from one-based to zero based\n */\nexport var createApplyTransform = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n isInteger\n } = _ref;\n var apply = createApply({\n typed,\n isInteger\n });\n\n // @see: comment of concat itself\n return typed('apply', {\n '...any': function any(args) {\n // change dim from one-based to zero-based\n var dim = args[1];\n if (isNumber(dim)) {\n args[1] = dim - 1;\n } else if (isBigNumber(dim)) {\n args[1] = dim.minus(1);\n }\n try {\n return apply.apply(null, args);\n } catch (err) {\n throw errorTransform(err);\n }\n }\n });\n}, {\n isTransformFunction: true\n});","import { errorTransform } from './utils/errorTransform.js';\nimport { factory } from '../../utils/factory.js';\nimport { createColumn } from '../../function/matrix/column.js';\nimport { isNumber } from '../../utils/is.js';\nvar name = 'column';\nvar dependencies = ['typed', 'Index', 'matrix', 'range'];\n\n/**\n * Attach a transform function to matrix.column\n * Adds a property transform containing the transform function.\n *\n * This transform changed the last `index` parameter of function column\n * from zero-based to one-based\n */\nexport var createColumnTransform = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n Index,\n matrix,\n range\n } = _ref;\n var column = createColumn({\n typed,\n Index,\n matrix,\n range\n });\n\n // @see: comment of column itself\n return typed('column', {\n '...any': function any(args) {\n // change last argument from zero-based to one-based\n var lastIndex = args.length - 1;\n var last = args[lastIndex];\n if (isNumber(last)) {\n args[lastIndex] = last - 1;\n }\n try {\n return column.apply(null, args);\n } catch (err) {\n throw errorTransform(err);\n }\n }\n });\n}, {\n isTransformFunction: true\n});","import { isSymbolNode } from '../../../utils/is.js';\nimport { createSubScope } from '../../../utils/scope.js';\n\n/**\n * Compile an inline expression like \"x > 0\"\n * @param {Node} expression\n * @param {Object} math\n * @param {Object} scope\n * @return {function} Returns a function with one argument which fills in the\n * undefined variable (like \"x\") and evaluates the expression\n */\nexport function compileInlineExpression(expression, math, scope) {\n // find an undefined symbol\n var symbol = expression.filter(function (node) {\n return isSymbolNode(node) && !(node.name in math) && !scope.has(node.name);\n })[0];\n if (!symbol) {\n throw new Error('No undefined variable found in inline expression \"' + expression + '\"');\n }\n\n // create a test function for this equation\n var name = symbol.name; // variable name\n var subScope = createSubScope(scope);\n var eq = expression.compile();\n return function inlineExpression(x) {\n subScope.set(name, x);\n return eq.evaluate(subScope);\n };\n}","import { applyCallback } from '../../utils/applyCallback.js';\nimport { filter, filterRegExp } from '../../utils/array.js';\nimport { factory } from '../../utils/factory.js';\nimport { isFunctionAssignmentNode, isSymbolNode } from '../../utils/is.js';\nimport { compileInlineExpression } from './utils/compileInlineExpression.js';\nvar name = 'filter';\nvar dependencies = ['typed'];\nexport var createFilterTransform = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed\n } = _ref;\n /**\n * Attach a transform function to math.filter\n * Adds a property transform containing the transform function.\n *\n * This transform adds support for equations as test function for math.filter,\n * so you can do something like 'filter([3, -2, 5], x > 0)'.\n */\n function filterTransform(args, math, scope) {\n var x, callback;\n if (args[0]) {\n x = args[0].compile().evaluate(scope);\n }\n if (args[1]) {\n if (isSymbolNode(args[1]) || isFunctionAssignmentNode(args[1])) {\n // a function pointer, like filter([3, -2, 5], myTestFunction)\n callback = args[1].compile().evaluate(scope);\n } else {\n // an expression like filter([3, -2, 5], x > 0)\n callback = compileInlineExpression(args[1], math, scope);\n }\n }\n return filter(x, callback);\n }\n filterTransform.rawArgs = true;\n\n // one based version of function filter\n var filter = typed('filter', {\n 'Array, function': _filter,\n 'Matrix, function': function MatrixFunction(x, test) {\n return x.create(_filter(x.toArray(), test));\n },\n 'Array, RegExp': filterRegExp,\n 'Matrix, RegExp': function MatrixRegExp(x, test) {\n return x.create(filterRegExp(x.toArray(), test));\n }\n });\n return filterTransform;\n}, {\n isTransformFunction: true\n});\n\n/**\n * Filter values in a callback given a callback function\n *\n * !!! Passes a one-based index !!!\n *\n * @param {Array} x\n * @param {Function} callback\n * @return {Array} Returns the filtered array\n * @private\n */\nfunction _filter(x, callback) {\n return filter(x, function (value, index, array) {\n // invoke the callback function with the right number of arguments\n return applyCallback(callback, value, [index + 1], array, 'filter');\n });\n}","import { applyCallback } from '../../utils/applyCallback.js';\nimport { forEach } from '../../utils/array.js';\nimport { factory } from '../../utils/factory.js';\nimport { isFunctionAssignmentNode, isSymbolNode } from '../../utils/is.js';\nimport { compileInlineExpression } from './utils/compileInlineExpression.js';\nvar name = 'forEach';\nvar dependencies = ['typed'];\nexport var createForEachTransform = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed\n } = _ref;\n /**\n * Attach a transform function to math.forEach\n * Adds a property transform containing the transform function.\n *\n * This transform creates a one-based index instead of a zero-based index\n */\n function forEachTransform(args, math, scope) {\n var x, callback;\n if (args[0]) {\n x = args[0].compile().evaluate(scope);\n }\n if (args[1]) {\n if (isSymbolNode(args[1]) || isFunctionAssignmentNode(args[1])) {\n // a function pointer, like forEach([3, -2, 5], myTestFunction)\n callback = args[1].compile().evaluate(scope);\n } else {\n // an expression like forEach([3, -2, 5], x > 0 ? callback1(x) : callback2(x) )\n callback = compileInlineExpression(args[1], math, scope);\n }\n }\n return _forEach(x, callback);\n }\n forEachTransform.rawArgs = true;\n\n // one-based version of forEach\n var _forEach = typed('forEach', {\n 'Array | Matrix, function': function ArrayMatrixFunction(array, callback) {\n var recurse = function recurse(value, index) {\n if (Array.isArray(value)) {\n forEach(value, function (child, i) {\n // we create a copy of the index array and append the new index value\n recurse(child, index.concat(i + 1)); // one based index, hence i+1\n });\n } else {\n // invoke the callback function with the right number of arguments\n return applyCallback(callback, value, index, array, 'forEach');\n }\n };\n recurse(array.valueOf(), []); // pass Array\n }\n });\n\n return forEachTransform;\n}, {\n isTransformFunction: true\n});","import { isArray, isBigNumber, isMatrix, isNumber, isRange } from '../../utils/is.js';\nimport { factory } from '../../utils/factory.js';\nvar name = 'index';\nvar dependencies = ['Index'];\nexport var createIndexTransform = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n Index\n } = _ref;\n /**\n * Attach a transform function to math.index\n * Adds a property transform containing the transform function.\n *\n * This transform creates a one-based index instead of a zero-based index\n */\n return function indexTransform() {\n var args = [];\n for (var i = 0, ii = arguments.length; i < ii; i++) {\n var arg = arguments[i];\n\n // change from one-based to zero based, and convert BigNumber to number\n if (isRange(arg)) {\n arg.start--;\n arg.end -= arg.step > 0 ? 0 : 2;\n } else if (arg && arg.isSet === true) {\n arg = arg.map(function (v) {\n return v - 1;\n });\n } else if (isArray(arg) || isMatrix(arg)) {\n arg = arg.map(function (v) {\n return v - 1;\n });\n } else if (isNumber(arg)) {\n arg--;\n } else if (isBigNumber(arg)) {\n arg = arg.toNumber() - 1;\n } else if (typeof arg === 'string') {\n // leave as is\n } else {\n throw new TypeError('Dimension must be an Array, Matrix, number, string, or Range');\n }\n args[i] = arg;\n }\n var res = new Index();\n Index.apply(res, args);\n return res;\n };\n}, {\n isTransformFunction: true\n});","import { applyCallback } from '../../utils/applyCallback.js';\nimport { map } from '../../utils/array.js';\nimport { factory } from '../../utils/factory.js';\nimport { isFunctionAssignmentNode, isSymbolNode } from '../../utils/is.js';\nimport { compileInlineExpression } from './utils/compileInlineExpression.js';\nvar name = 'map';\nvar dependencies = ['typed'];\nexport var createMapTransform = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed\n } = _ref;\n /**\n * Attach a transform function to math.map\n * Adds a property transform containing the transform function.\n *\n * This transform creates a one-based index instead of a zero-based index\n */\n function mapTransform(args, math, scope) {\n var x, callback;\n if (args[0]) {\n x = args[0].compile().evaluate(scope);\n }\n if (args[1]) {\n if (isSymbolNode(args[1]) || isFunctionAssignmentNode(args[1])) {\n // a function pointer, like filter([3, -2, 5], myTestFunction)\n callback = args[1].compile().evaluate(scope);\n } else {\n // an expression like filter([3, -2, 5], x > 0)\n callback = compileInlineExpression(args[1], math, scope);\n }\n }\n return map(x, callback);\n }\n mapTransform.rawArgs = true;\n\n // one-based version of map function\n var map = typed('map', {\n 'Array, function': function ArrayFunction(x, callback) {\n return _map(x, callback, x);\n },\n 'Matrix, function': function MatrixFunction(x, callback) {\n return x.create(_map(x.valueOf(), callback, x));\n }\n });\n return mapTransform;\n}, {\n isTransformFunction: true\n});\n\n/**\n * Map for a multidimensional array. One-based indexes\n * @param {Array} array\n * @param {function} callback\n * @param {Array} orig\n * @return {Array}\n * @private\n */\nfunction _map(array, callback, orig) {\n function recurse(value, index) {\n if (Array.isArray(value)) {\n return map(value, function (child, i) {\n // we create a copy of the index array and append the new index value\n return recurse(child, index.concat(i + 1)); // one based index, hence i + 1\n });\n } else {\n // invoke the (typed) callback function with the right number of arguments\n return applyCallback(callback, value, index, orig, 'map');\n }\n }\n return recurse(array, []);\n}","import { isBigNumber, isCollection, isNumber } from '../../../utils/is.js';\n\n/**\n * Change last argument dim from one-based to zero-based.\n */\nexport function lastDimToZeroBase(args) {\n if (args.length === 2 && isCollection(args[0])) {\n args = args.slice();\n var dim = args[1];\n if (isNumber(dim)) {\n args[1] = dim - 1;\n } else if (isBigNumber(dim)) {\n args[1] = dim.minus(1);\n }\n }\n return args;\n}","import { factory } from '../../utils/factory.js';\nimport { errorTransform } from './utils/errorTransform.js';\nimport { createMax } from '../../function/statistics/max.js';\nimport { lastDimToZeroBase } from './utils/lastDimToZeroBase.js';\nvar name = 'max';\nvar dependencies = ['typed', 'config', 'numeric', 'larger'];\nexport var createMaxTransform = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n config,\n numeric,\n larger\n } = _ref;\n var max = createMax({\n typed,\n config,\n numeric,\n larger\n });\n\n /**\n * Attach a transform function to math.max\n * Adds a property transform containing the transform function.\n *\n * This transform changed the last `dim` parameter of function max\n * from one-based to zero based\n */\n return typed('max', {\n '...any': function any(args) {\n args = lastDimToZeroBase(args);\n try {\n return max.apply(null, args);\n } catch (err) {\n throw errorTransform(err);\n }\n }\n });\n}, {\n isTransformFunction: true\n});","import { factory } from '../../utils/factory.js';\nimport { errorTransform } from './utils/errorTransform.js';\nimport { createMean } from '../../function/statistics/mean.js';\nimport { lastDimToZeroBase } from './utils/lastDimToZeroBase.js';\nvar name = 'mean';\nvar dependencies = ['typed', 'add', 'divide'];\nexport var createMeanTransform = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n add,\n divide\n } = _ref;\n var mean = createMean({\n typed,\n add,\n divide\n });\n\n /**\n * Attach a transform function to math.mean\n * Adds a property transform containing the transform function.\n *\n * This transform changed the last `dim` parameter of function mean\n * from one-based to zero based\n */\n return typed('mean', {\n '...any': function any(args) {\n args = lastDimToZeroBase(args);\n try {\n return mean.apply(null, args);\n } catch (err) {\n throw errorTransform(err);\n }\n }\n });\n}, {\n isTransformFunction: true\n});","import { factory } from '../../utils/factory.js';\nimport { errorTransform } from './utils/errorTransform.js';\nimport { createMin } from '../../function/statistics/min.js';\nimport { lastDimToZeroBase } from './utils/lastDimToZeroBase.js';\nvar name = 'min';\nvar dependencies = ['typed', 'config', 'numeric', 'smaller'];\nexport var createMinTransform = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n config,\n numeric,\n smaller\n } = _ref;\n var min = createMin({\n typed,\n config,\n numeric,\n smaller\n });\n\n /**\n * Attach a transform function to math.min\n * Adds a property transform containing the transform function.\n *\n * This transform changed the last `dim` parameter of function min\n * from one-based to zero based\n */\n return typed('min', {\n '...any': function any(args) {\n args = lastDimToZeroBase(args);\n try {\n return min.apply(null, args);\n } catch (err) {\n throw errorTransform(err);\n }\n }\n });\n}, {\n isTransformFunction: true\n});","import { factory } from '../../utils/factory.js';\nimport { createRange } from '../../function/matrix/range.js';\nvar name = 'range';\nvar dependencies = ['typed', 'config', '?matrix', '?bignumber', 'smaller', 'smallerEq', 'larger', 'largerEq', 'add', 'isPositive'];\nexport var createRangeTransform = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n config,\n matrix,\n bignumber,\n smaller,\n smallerEq,\n larger,\n largerEq,\n add,\n isPositive\n } = _ref;\n var range = createRange({\n typed,\n config,\n matrix,\n bignumber,\n smaller,\n smallerEq,\n larger,\n largerEq,\n add,\n isPositive\n });\n\n /**\n * Attach a transform function to math.range\n * Adds a property transform containing the transform function.\n *\n * This transform creates a range which includes the end value\n */\n return typed('range', {\n '...any': function any(args) {\n var lastIndex = args.length - 1;\n var last = args[lastIndex];\n if (typeof last !== 'boolean') {\n // append a parameter includeEnd=true\n args.push(true);\n }\n return range.apply(null, args);\n }\n });\n}, {\n isTransformFunction: true\n});","import { factory } from '../../utils/factory.js';\nimport { createRow } from '../../function/matrix/row.js';\nimport { errorTransform } from './utils/errorTransform.js';\nimport { isNumber } from '../../utils/is.js';\nvar name = 'row';\nvar dependencies = ['typed', 'Index', 'matrix', 'range'];\n\n/**\n * Attach a transform function to matrix.column\n * Adds a property transform containing the transform function.\n *\n * This transform changed the last `index` parameter of function column\n * from zero-based to one-based\n */\nexport var createRowTransform = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n Index,\n matrix,\n range\n } = _ref;\n var row = createRow({\n typed,\n Index,\n matrix,\n range\n });\n\n // @see: comment of row itself\n return typed('row', {\n '...any': function any(args) {\n // change last argument from zero-based to one-based\n var lastIndex = args.length - 1;\n var last = args[lastIndex];\n if (isNumber(last)) {\n args[lastIndex] = last - 1;\n }\n try {\n return row.apply(null, args);\n } catch (err) {\n throw errorTransform(err);\n }\n }\n });\n}, {\n isTransformFunction: true\n});","import { factory } from '../../utils/factory.js';\nimport { errorTransform } from './utils/errorTransform.js';\nimport { createSubset } from '../../function/matrix/subset.js';\nvar name = 'subset';\nvar dependencies = ['typed', 'matrix'];\nexport var createSubsetTransform = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n matrix\n } = _ref;\n var subset = createSubset({\n typed,\n matrix\n });\n\n /**\n * Attach a transform function to math.subset\n * Adds a property transform containing the transform function.\n *\n * This transform creates a range which includes the end value\n */\n return typed('subset', {\n '...any': function any(args) {\n try {\n return subset.apply(null, args);\n } catch (err) {\n throw errorTransform(err);\n }\n }\n });\n}, {\n isTransformFunction: true\n});","import { isBigNumber, isNumber } from '../../utils/is.js';\nimport { errorTransform } from './utils/errorTransform.js';\nimport { factory } from '../../utils/factory.js';\nimport { createConcat } from '../../function/matrix/concat.js';\nvar name = 'concat';\nvar dependencies = ['typed', 'matrix', 'isInteger'];\nexport var createConcatTransform = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n matrix,\n isInteger\n } = _ref;\n var concat = createConcat({\n typed,\n matrix,\n isInteger\n });\n\n /**\n * Attach a transform function to math.range\n * Adds a property transform containing the transform function.\n *\n * This transform changed the last `dim` parameter of function concat\n * from one-based to zero based\n */\n return typed('concat', {\n '...any': function any(args) {\n // change last argument from one-based to zero-based\n var lastIndex = args.length - 1;\n var last = args[lastIndex];\n if (isNumber(last)) {\n args[lastIndex] = last - 1;\n } else if (isBigNumber(last)) {\n args[lastIndex] = last.minus(1);\n }\n try {\n return concat.apply(null, args);\n } catch (err) {\n throw errorTransform(err);\n }\n }\n });\n}, {\n isTransformFunction: true\n});","import { factory } from '../../utils/factory.js';\nimport { errorTransform } from './utils/errorTransform.js';\nimport { createDiff } from '../../function/matrix/diff.js';\nimport { lastDimToZeroBase } from './utils/lastDimToZeroBase.js';\nvar name = 'diff';\nvar dependencies = ['typed', 'matrix', 'subtract', 'number', 'bignumber'];\nexport var createDiffTransform = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n matrix,\n subtract,\n number,\n bignumber\n } = _ref;\n var diff = createDiff({\n typed,\n matrix,\n subtract,\n number,\n bignumber\n });\n\n /**\n * Attach a transform function to math.diff\n * Adds a property transform containing the transform function.\n *\n * This transform creates a range which includes the end value\n */\n return typed(name, {\n '...any': function any(args) {\n args = lastDimToZeroBase(args);\n try {\n return diff.apply(null, args);\n } catch (err) {\n throw errorTransform(err);\n }\n }\n });\n}, {\n isTransformFunction: true\n});","import { factory } from '../../utils/factory.js';\nimport { createStd } from '../../function/statistics/std.js';\nimport { errorTransform } from './utils/errorTransform.js';\nimport { lastDimToZeroBase } from './utils/lastDimToZeroBase.js';\nvar name = 'std';\nvar dependencies = ['typed', 'map', 'sqrt', 'variance'];\n\n/**\n * Attach a transform function to math.std\n * Adds a property transform containing the transform function.\n *\n * This transform changed the `dim` parameter of function std\n * from one-based to zero based\n */\nexport var createStdTransform = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n map,\n sqrt,\n variance\n } = _ref;\n var std = createStd({\n typed,\n map,\n sqrt,\n variance\n });\n return typed('std', {\n '...any': function any(args) {\n args = lastDimToZeroBase(args);\n try {\n return std.apply(null, args);\n } catch (err) {\n throw errorTransform(err);\n }\n }\n });\n}, {\n isTransformFunction: true\n});","import { factory } from '../../utils/factory.js';\nimport { errorTransform } from './utils/errorTransform.js';\nimport { createSum } from '../../function/statistics/sum.js';\nimport { lastDimToZeroBase } from './utils/lastDimToZeroBase.js';\n\n/**\n * Attach a transform function to math.sum\n * Adds a property transform containing the transform function.\n *\n * This transform changed the last `dim` parameter of function sum\n * from one-based to zero based\n */\nvar name = 'sum';\nvar dependencies = ['typed', 'config', 'add', 'numeric'];\nexport var createSumTransform = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n config,\n add,\n numeric\n } = _ref;\n var sum = createSum({\n typed,\n config,\n add,\n numeric\n });\n return typed(name, {\n '...any': function any(args) {\n args = lastDimToZeroBase(args);\n try {\n return sum.apply(null, args);\n } catch (err) {\n throw errorTransform(err);\n }\n }\n });\n}, {\n isTransformFunction: true\n});","import { isBigNumber, isCollection, isNumber } from '../../utils/is.js';\nimport { factory } from '../../utils/factory.js';\nimport { errorTransform } from './utils/errorTransform.js';\nimport { createCumSum } from '../../function/statistics/cumsum.js';\n\n/**\n * Attach a transform function to math.sum\n * Adds a property transform containing the transform function.\n *\n * This transform changed the last `dim` parameter of function sum\n * from one-based to zero based\n */\nvar name = 'cumsum';\nvar dependencies = ['typed', 'add', 'unaryPlus'];\nexport var createCumSumTransform = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n add,\n unaryPlus\n } = _ref;\n var cumsum = createCumSum({\n typed,\n add,\n unaryPlus\n });\n return typed(name, {\n '...any': function any(args) {\n // change last argument dim from one-based to zero-based\n if (args.length === 2 && isCollection(args[0])) {\n var dim = args[1];\n if (isNumber(dim)) {\n args[1] = dim - 1;\n } else if (isBigNumber(dim)) {\n args[1] = dim.minus(1);\n }\n }\n try {\n return cumsum.apply(null, args);\n } catch (err) {\n throw errorTransform(err);\n }\n }\n });\n}, {\n isTransformFunction: true\n});","import { factory } from '../../utils/factory.js';\nimport { errorTransform } from './utils/errorTransform.js';\nimport { createVariance } from '../../function/statistics/variance.js';\nimport { lastDimToZeroBase } from './utils/lastDimToZeroBase.js';\nvar name = 'variance';\nvar dependencies = ['typed', 'add', 'subtract', 'multiply', 'divide', 'apply', 'isNaN'];\n\n/**\n * Attach a transform function to math.var\n * Adds a property transform containing the transform function.\n *\n * This transform changed the `dim` parameter of function var\n * from one-based to zero based\n */\nexport var createVarianceTransform = /* #__PURE__ */factory(name, dependencies, _ref => {\n var {\n typed,\n add,\n subtract,\n multiply,\n divide,\n apply,\n isNaN\n } = _ref;\n var variance = createVariance({\n typed,\n add,\n subtract,\n multiply,\n divide,\n apply,\n isNaN\n });\n return typed(name, {\n '...any': function any(args) {\n args = lastDimToZeroBase(args);\n try {\n return variance.apply(null, args);\n } catch (err) {\n throw errorTransform(err);\n }\n }\n });\n}, {\n isTransformFunction: true\n});","/**\n * THIS FILE IS AUTO-GENERATED\n * DON'T MAKE CHANGES HERE\n */\nimport { config } from './configReadonly.js';\nimport { createBigNumberClass, createComplexClass, createE, createFalse, createFineStructure, createFractionClass, createI, createInfinity, createLN10, createLOG10E, createMatrixClass, createNaN, createNull, createPhi, createRangeClass, createResultSet, createSQRT1_2,\n// eslint-disable-line camelcase\ncreateSackurTetrode, createTau, createTrue, createVersion, createDenseMatrixClass, createEfimovFactor, createLN2, createPi, createReplacer, createSQRT2, createTyped, createUnaryPlus, createWeakMixingAngle, createAbs, createAcos, createAcot, createAcsc, createAddScalar, createArg, createAsech, createAsinh, createAtan, createAtanh, createBignumber, createBitNot, createBoolean, createClone, createCombinations, createComplex, createConj, createCosh, createCoth, createCsc, createCube, createEqualScalar, createErf, createExp, createExpm1, createFilter, createForEach, createFormat, createGetMatrixDataType, createHex, createIm, createIsInteger, createIsNegative, createIsPositive, createIsZero, createLOG2E, createLgamma, createLog10, createLog2, createMap, createMultiplyScalar, createNot, createNumber, createOct, createPickRandom, createPrint, createRandom, createRe, createSec, createSign, createSin, createSparseMatrixClass, createSplitUnit, createSquare, createString, createTan, createTypeOf, createAcosh, createAcsch, createApply, createAsec, createBin, createCombinationsWithRep, createCos, createCsch, createIsNaN, createIsPrime, createRandomInt, createSech, createSinh, createSparse, createSqrt, createTanh, createUnaryMinus, createAcoth, createCot, createFraction, createIsNumeric, createMatrix, createMatrixFromFunction, createMode, createNumeric, createProd, createReshape, createSize, createSqueeze, createSubset, createTranspose, createXgcd, createZeros, createAsin, createCbrt, createConcat, createCount, createCtranspose, createDiag, createDivideScalar, createDotDivide, createEqual, createFlatten, createGcd, createHasNumericValue, createIdentity, createKron, createLargerEq, createLeftShift, createMatrixFromColumns, createMod, createNthRoot, createOnes, createResize, createRightArithShift, createRound, createSmaller, createTo, createUnequal, createXor, createAdd, createBitAnd, createBitXor, createCatalan, createCompare, createCompareText, createCumSum, createDeepEqual, createDot, createEqualText, createFloor, createHypot, createImmutableDenseMatrixClass, createIndexClass, createInvmod, createLarger, createLog, createMatrixFromRows, createMin, createMultiply, createNthRoots, createOr, createPartitionSelect, createQuantileSeq, createRightLogShift, createSmallerEq, createSubtract, createTrace, createUsolve, createZpk2tf, createAnd, createBitOr, createCeil, createCompareNatural, createComposition, createCross, createDet, createDiff, createDistance, createDotMultiply, createFibonacciHeapClass, createFix, createIndex, createIntersect, createLcm, createLog1p, createLsolve, createMax, createQr, createRange, createRow, createSetCartesian, createSetDistinct, createSetIsSubset, createSetPowerset, createSlu, createSort, createSum, createUsolveAll, createAtan2, createColumn, createLsolveAll, createSetDifference, createSetMultiplicity, createSetSymDifference, createSpaClass, createInv, createLup, createPinv, createPow, createSetIntersect, createSetUnion, createSqrtm, createUnitClass, createVacuumImpedance, createWienDisplacement, createAtomicMass, createBohrMagneton, createBoltzmann, createConductanceQuantum, createCreateUnit, createDeuteronMass, createDotPow, createElectricConstant, createElementaryCharge, createExpm, createFaraday, createFft, createGamma, createGravitationConstant, createHartreeEnergy, createIfft, createKlitzing, createLoschmidt, createMagneticConstant, createMolarMass, createMolarPlanckConstant, createNeutronMass, createNuclearMagneton, createPlanckCharge, createPlanckLength, createPlanckTemperature, createProtonMass, createReducedPlanckConstant, createRydberg, createSecondRadiation, createSpeedOfLight, createStefanBoltzmann, createThomsonCrossSection, createAvogadro, createBohrRadius, createCoulomb, createDivide, createElectronMass, createFactorial, createFirstRadiation, createGravity, createInverseConductanceQuantum, createLusolve, createMagneticFluxQuantum, createMolarMassC12, createMultinomial, createPermutations, createPlanckMass, createPolynomialRoot, createSetSize, createSolveODE, createStirlingS2, createUnitFunction, createBellNumbers, createEigs, createFermiCoupling, createGasConstant, createMean, createMolarVolume, createPlanckConstant, createQuantumOfCirculation, createVariance, createClassicalElectronRadius, createMedian, createKldivergence, createMad, createStd, createFreqz, createNorm, createRotationMatrix, createPlanckTime, createSchur, createRotate, createSylvester, createLyap } from '../factoriesAny.js';\nexport var BigNumber = /* #__PURE__ */createBigNumberClass({\n config\n});\nexport var Complex = /* #__PURE__ */createComplexClass({});\nexport var e = /* #__PURE__ */createE({\n BigNumber,\n config\n});\nexport var _false = /* #__PURE__ */createFalse({});\nexport var fineStructure = /* #__PURE__ */createFineStructure({\n BigNumber,\n config\n});\nexport var Fraction = /* #__PURE__ */createFractionClass({});\nexport var i = /* #__PURE__ */createI({\n Complex\n});\nexport var _Infinity = /* #__PURE__ */createInfinity({\n BigNumber,\n config\n});\nexport var LN10 = /* #__PURE__ */createLN10({\n BigNumber,\n config\n});\nexport var LOG10E = /* #__PURE__ */createLOG10E({\n BigNumber,\n config\n});\nexport var Matrix = /* #__PURE__ */createMatrixClass({});\nexport var _NaN = /* #__PURE__ */createNaN({\n BigNumber,\n config\n});\nexport var _null = /* #__PURE__ */createNull({});\nexport var phi = /* #__PURE__ */createPhi({\n BigNumber,\n config\n});\nexport var Range = /* #__PURE__ */createRangeClass({});\nexport var ResultSet = /* #__PURE__ */createResultSet({});\nexport var SQRT1_2 = /* #__PURE__ */createSQRT1_2({\n BigNumber,\n config\n});\nexport var sackurTetrode = /* #__PURE__ */createSackurTetrode({\n BigNumber,\n config\n});\nexport var tau = /* #__PURE__ */createTau({\n BigNumber,\n config\n});\nexport var _true = /* #__PURE__ */createTrue({});\nexport var version = /* #__PURE__ */createVersion({});\nexport var DenseMatrix = /* #__PURE__ */createDenseMatrixClass({\n Matrix\n});\nexport var efimovFactor = /* #__PURE__ */createEfimovFactor({\n BigNumber,\n config\n});\nexport var LN2 = /* #__PURE__ */createLN2({\n BigNumber,\n config\n});\nexport var pi = /* #__PURE__ */createPi({\n BigNumber,\n config\n});\nexport var replacer = /* #__PURE__ */createReplacer({});\nexport var SQRT2 = /* #__PURE__ */createSQRT2({\n BigNumber,\n config\n});\nexport var typed = /* #__PURE__ */createTyped({\n BigNumber,\n Complex,\n DenseMatrix,\n Fraction\n});\nexport var unaryPlus = /* #__PURE__ */createUnaryPlus({\n BigNumber,\n config,\n typed\n});\nexport var weakMixingAngle = /* #__PURE__ */createWeakMixingAngle({\n BigNumber,\n config\n});\nexport var abs = /* #__PURE__ */createAbs({\n typed\n});\nexport var acos = /* #__PURE__ */createAcos({\n Complex,\n config,\n typed\n});\nexport var acot = /* #__PURE__ */createAcot({\n BigNumber,\n typed\n});\nexport var acsc = /* #__PURE__ */createAcsc({\n BigNumber,\n Complex,\n config,\n typed\n});\nexport var addScalar = /* #__PURE__ */createAddScalar({\n typed\n});\nexport var arg = /* #__PURE__ */createArg({\n typed\n});\nexport var asech = /* #__PURE__ */createAsech({\n BigNumber,\n Complex,\n config,\n typed\n});\nexport var asinh = /* #__PURE__ */createAsinh({\n typed\n});\nexport var atan = /* #__PURE__ */createAtan({\n typed\n});\nexport var atanh = /* #__PURE__ */createAtanh({\n Complex,\n config,\n typed\n});\nexport var bignumber = /* #__PURE__ */createBignumber({\n BigNumber,\n typed\n});\nexport var bitNot = /* #__PURE__ */createBitNot({\n typed\n});\nexport var boolean = /* #__PURE__ */createBoolean({\n typed\n});\nexport var clone = /* #__PURE__ */createClone({\n typed\n});\nexport var combinations = /* #__PURE__ */createCombinations({\n typed\n});\nexport var complex = /* #__PURE__ */createComplex({\n Complex,\n typed\n});\nexport var conj = /* #__PURE__ */createConj({\n typed\n});\nexport var cosh = /* #__PURE__ */createCosh({\n typed\n});\nexport var coth = /* #__PURE__ */createCoth({\n BigNumber,\n typed\n});\nexport var csc = /* #__PURE__ */createCsc({\n BigNumber,\n typed\n});\nexport var cube = /* #__PURE__ */createCube({\n typed\n});\nexport var equalScalar = /* #__PURE__ */createEqualScalar({\n config,\n typed\n});\nexport var erf = /* #__PURE__ */createErf({\n typed\n});\nexport var exp = /* #__PURE__ */createExp({\n typed\n});\nexport var expm1 = /* #__PURE__ */createExpm1({\n Complex,\n typed\n});\nexport var filter = /* #__PURE__ */createFilter({\n typed\n});\nexport var forEach = /* #__PURE__ */createForEach({\n typed\n});\nexport var format = /* #__PURE__ */createFormat({\n typed\n});\nexport var getMatrixDataType = /* #__PURE__ */createGetMatrixDataType({\n typed\n});\nexport var hex = /* #__PURE__ */createHex({\n format,\n typed\n});\nexport var im = /* #__PURE__ */createIm({\n typed\n});\nexport var isInteger = /* #__PURE__ */createIsInteger({\n typed\n});\nexport var isNegative = /* #__PURE__ */createIsNegative({\n typed\n});\nexport var isPositive = /* #__PURE__ */createIsPositive({\n typed\n});\nexport var isZero = /* #__PURE__ */createIsZero({\n typed\n});\nexport var LOG2E = /* #__PURE__ */createLOG2E({\n BigNumber,\n config\n});\nexport var lgamma = /* #__PURE__ */createLgamma({\n Complex,\n typed\n});\nexport var log10 = /* #__PURE__ */createLog10({\n Complex,\n config,\n typed\n});\nexport var log2 = /* #__PURE__ */createLog2({\n Complex,\n config,\n typed\n});\nexport var map = /* #__PURE__ */createMap({\n typed\n});\nexport var multiplyScalar = /* #__PURE__ */createMultiplyScalar({\n typed\n});\nexport var not = /* #__PURE__ */createNot({\n typed\n});\nexport var number = /* #__PURE__ */createNumber({\n typed\n});\nexport var oct = /* #__PURE__ */createOct({\n format,\n typed\n});\nexport var pickRandom = /* #__PURE__ */createPickRandom({\n config,\n typed\n});\nexport var print = /* #__PURE__ */createPrint({\n typed\n});\nexport var random = /* #__PURE__ */createRandom({\n config,\n typed\n});\nexport var re = /* #__PURE__ */createRe({\n typed\n});\nexport var sec = /* #__PURE__ */createSec({\n BigNumber,\n typed\n});\nexport var sign = /* #__PURE__ */createSign({\n BigNumber,\n Fraction,\n complex,\n typed\n});\nexport var sin = /* #__PURE__ */createSin({\n typed\n});\nexport var SparseMatrix = /* #__PURE__ */createSparseMatrixClass({\n Matrix,\n equalScalar,\n typed\n});\nexport var splitUnit = /* #__PURE__ */createSplitUnit({\n typed\n});\nexport var square = /* #__PURE__ */createSquare({\n typed\n});\nexport var string = /* #__PURE__ */createString({\n typed\n});\nexport var tan = /* #__PURE__ */createTan({\n typed\n});\nexport var typeOf = /* #__PURE__ */createTypeOf({\n typed\n});\nexport var acosh = /* #__PURE__ */createAcosh({\n Complex,\n config,\n typed\n});\nexport var acsch = /* #__PURE__ */createAcsch({\n BigNumber,\n typed\n});\nexport var apply = /* #__PURE__ */createApply({\n isInteger,\n typed\n});\nexport var asec = /* #__PURE__ */createAsec({\n BigNumber,\n Complex,\n config,\n typed\n});\nexport var bin = /* #__PURE__ */createBin({\n format,\n typed\n});\nexport var combinationsWithRep = /* #__PURE__ */createCombinationsWithRep({\n typed\n});\nexport var cos = /* #__PURE__ */createCos({\n typed\n});\nexport var csch = /* #__PURE__ */createCsch({\n BigNumber,\n typed\n});\nexport var isNaN = /* #__PURE__ */createIsNaN({\n typed\n});\nexport var isPrime = /* #__PURE__ */createIsPrime({\n typed\n});\nexport var randomInt = /* #__PURE__ */createRandomInt({\n config,\n typed\n});\nexport var sech = /* #__PURE__ */createSech({\n BigNumber,\n typed\n});\nexport var sinh = /* #__PURE__ */createSinh({\n typed\n});\nexport var sparse = /* #__PURE__ */createSparse({\n SparseMatrix,\n typed\n});\nexport var sqrt = /* #__PURE__ */createSqrt({\n Complex,\n config,\n typed\n});\nexport var tanh = /* #__PURE__ */createTanh({\n typed\n});\nexport var unaryMinus = /* #__PURE__ */createUnaryMinus({\n typed\n});\nexport var acoth = /* #__PURE__ */createAcoth({\n BigNumber,\n Complex,\n config,\n typed\n});\nexport var cot = /* #__PURE__ */createCot({\n BigNumber,\n typed\n});\nexport var fraction = /* #__PURE__ */createFraction({\n Fraction,\n typed\n});\nexport var isNumeric = /* #__PURE__ */createIsNumeric({\n typed\n});\nexport var matrix = /* #__PURE__ */createMatrix({\n DenseMatrix,\n Matrix,\n SparseMatrix,\n typed\n});\nexport var matrixFromFunction = /* #__PURE__ */createMatrixFromFunction({\n isZero,\n matrix,\n typed\n});\nexport var mode = /* #__PURE__ */createMode({\n isNaN,\n isNumeric,\n typed\n});\nexport var numeric = /* #__PURE__ */createNumeric({\n bignumber,\n fraction,\n number\n});\nexport var prod = /* #__PURE__ */createProd({\n config,\n multiplyScalar,\n numeric,\n typed\n});\nexport var reshape = /* #__PURE__ */createReshape({\n isInteger,\n matrix,\n typed\n});\nexport var size = /* #__PURE__ */createSize({\n matrix,\n config,\n typed\n});\nexport var squeeze = /* #__PURE__ */createSqueeze({\n matrix,\n typed\n});\nexport var subset = /* #__PURE__ */createSubset({\n matrix,\n typed\n});\nexport var transpose = /* #__PURE__ */createTranspose({\n matrix,\n typed\n});\nexport var xgcd = /* #__PURE__ */createXgcd({\n BigNumber,\n config,\n matrix,\n typed\n});\nexport var zeros = /* #__PURE__ */createZeros({\n BigNumber,\n config,\n matrix,\n typed\n});\nexport var asin = /* #__PURE__ */createAsin({\n Complex,\n config,\n typed\n});\nexport var cbrt = /* #__PURE__ */createCbrt({\n BigNumber,\n Complex,\n Fraction,\n config,\n isNegative,\n matrix,\n typed,\n unaryMinus\n});\nexport var concat = /* #__PURE__ */createConcat({\n isInteger,\n matrix,\n typed\n});\nexport var count = /* #__PURE__ */createCount({\n prod,\n size,\n typed\n});\nexport var ctranspose = /* #__PURE__ */createCtranspose({\n conj,\n transpose,\n typed\n});\nexport var diag = /* #__PURE__ */createDiag({\n DenseMatrix,\n SparseMatrix,\n matrix,\n typed\n});\nexport var divideScalar = /* #__PURE__ */createDivideScalar({\n numeric,\n typed\n});\nexport var dotDivide = /* #__PURE__ */createDotDivide({\n DenseMatrix,\n concat,\n divideScalar,\n equalScalar,\n matrix,\n typed\n});\nexport var equal = /* #__PURE__ */createEqual({\n DenseMatrix,\n concat,\n equalScalar,\n matrix,\n typed\n});\nexport var flatten = /* #__PURE__ */createFlatten({\n matrix,\n typed\n});\nexport var gcd = /* #__PURE__ */createGcd({\n BigNumber,\n DenseMatrix,\n concat,\n equalScalar,\n matrix,\n typed\n});\nexport var hasNumericValue = /* #__PURE__ */createHasNumericValue({\n isNumeric,\n typed\n});\nexport var identity = /* #__PURE__ */createIdentity({\n BigNumber,\n DenseMatrix,\n SparseMatrix,\n config,\n matrix,\n typed\n});\nexport var kron = /* #__PURE__ */createKron({\n matrix,\n multiplyScalar,\n typed\n});\nexport var largerEq = /* #__PURE__ */createLargerEq({\n DenseMatrix,\n concat,\n config,\n matrix,\n typed\n});\nexport var leftShift = /* #__PURE__ */createLeftShift({\n DenseMatrix,\n concat,\n equalScalar,\n matrix,\n typed,\n zeros\n});\nexport var matrixFromColumns = /* #__PURE__ */createMatrixFromColumns({\n flatten,\n matrix,\n size,\n typed\n});\nexport var mod = /* #__PURE__ */createMod({\n DenseMatrix,\n concat,\n equalScalar,\n matrix,\n typed\n});\nexport var nthRoot = /* #__PURE__ */createNthRoot({\n BigNumber,\n concat,\n equalScalar,\n matrix,\n typed\n});\nexport var ones = /* #__PURE__ */createOnes({\n BigNumber,\n config,\n matrix,\n typed\n});\nexport var resize = /* #__PURE__ */createResize({\n config,\n matrix\n});\nexport var rightArithShift = /* #__PURE__ */createRightArithShift({\n DenseMatrix,\n concat,\n equalScalar,\n matrix,\n typed,\n zeros\n});\nexport var round = /* #__PURE__ */createRound({\n BigNumber,\n DenseMatrix,\n equalScalar,\n matrix,\n typed,\n zeros\n});\nexport var smaller = /* #__PURE__ */createSmaller({\n DenseMatrix,\n concat,\n config,\n matrix,\n typed\n});\nexport var to = /* #__PURE__ */createTo({\n concat,\n matrix,\n typed\n});\nexport var unequal = /* #__PURE__ */createUnequal({\n DenseMatrix,\n concat,\n config,\n equalScalar,\n matrix,\n typed\n});\nexport var xor = /* #__PURE__ */createXor({\n DenseMatrix,\n concat,\n matrix,\n typed\n});\nexport var add = /* #__PURE__ */createAdd({\n DenseMatrix,\n SparseMatrix,\n addScalar,\n concat,\n equalScalar,\n matrix,\n typed\n});\nexport var bitAnd = /* #__PURE__ */createBitAnd({\n concat,\n equalScalar,\n matrix,\n typed\n});\nexport var bitXor = /* #__PURE__ */createBitXor({\n DenseMatrix,\n concat,\n matrix,\n typed\n});\nexport var catalan = /* #__PURE__ */createCatalan({\n addScalar,\n combinations,\n divideScalar,\n isInteger,\n isNegative,\n multiplyScalar,\n typed\n});\nexport var compare = /* #__PURE__ */createCompare({\n BigNumber,\n DenseMatrix,\n Fraction,\n concat,\n config,\n equalScalar,\n matrix,\n typed\n});\nexport var compareText = /* #__PURE__ */createCompareText({\n concat,\n matrix,\n typed\n});\nexport var cumsum = /* #__PURE__ */createCumSum({\n add,\n typed,\n unaryPlus\n});\nexport var deepEqual = /* #__PURE__ */createDeepEqual({\n equal,\n typed\n});\nexport var dot = /* #__PURE__ */createDot({\n addScalar,\n conj,\n multiplyScalar,\n size,\n typed\n});\nexport var equalText = /* #__PURE__ */createEqualText({\n compareText,\n isZero,\n typed\n});\nexport var floor = /* #__PURE__ */createFloor({\n DenseMatrix,\n config,\n equalScalar,\n matrix,\n round,\n typed,\n zeros\n});\nexport var hypot = /* #__PURE__ */createHypot({\n abs,\n addScalar,\n divideScalar,\n isPositive,\n multiplyScalar,\n smaller,\n sqrt,\n typed\n});\nexport var ImmutableDenseMatrix = /* #__PURE__ */createImmutableDenseMatrixClass({\n DenseMatrix,\n smaller\n});\nexport var Index = /* #__PURE__ */createIndexClass({\n ImmutableDenseMatrix\n});\nexport var invmod = /* #__PURE__ */createInvmod({\n BigNumber,\n add,\n config,\n equal,\n isInteger,\n mod,\n smaller,\n typed,\n xgcd\n});\nexport var larger = /* #__PURE__ */createLarger({\n DenseMatrix,\n concat,\n config,\n matrix,\n typed\n});\nexport var log = /* #__PURE__ */createLog({\n Complex,\n config,\n divideScalar,\n typed\n});\nexport var matrixFromRows = /* #__PURE__ */createMatrixFromRows({\n flatten,\n matrix,\n size,\n typed\n});\nexport var min = /* #__PURE__ */createMin({\n config,\n numeric,\n smaller,\n typed\n});\nexport var multiply = /* #__PURE__ */createMultiply({\n addScalar,\n dot,\n equalScalar,\n matrix,\n multiplyScalar,\n typed\n});\nexport var nthRoots = /* #__PURE__ */createNthRoots({\n Complex,\n config,\n divideScalar,\n typed\n});\nexport var or = /* #__PURE__ */createOr({\n DenseMatrix,\n concat,\n equalScalar,\n matrix,\n typed\n});\nexport var partitionSelect = /* #__PURE__ */createPartitionSelect({\n compare,\n isNaN,\n isNumeric,\n typed\n});\nexport var quantileSeq = /* #__PURE__ */createQuantileSeq({\n add,\n compare,\n multiply,\n partitionSelect,\n typed\n});\nexport var rightLogShift = /* #__PURE__ */createRightLogShift({\n DenseMatrix,\n concat,\n equalScalar,\n matrix,\n typed,\n zeros\n});\nexport var smallerEq = /* #__PURE__ */createSmallerEq({\n DenseMatrix,\n concat,\n config,\n matrix,\n typed\n});\nexport var subtract = /* #__PURE__ */createSubtract({\n DenseMatrix,\n addScalar,\n concat,\n equalScalar,\n matrix,\n typed,\n unaryMinus\n});\nexport var trace = /* #__PURE__ */createTrace({\n add,\n matrix,\n typed\n});\nexport var usolve = /* #__PURE__ */createUsolve({\n DenseMatrix,\n divideScalar,\n equalScalar,\n matrix,\n multiplyScalar,\n subtract,\n typed\n});\nexport var zpk2tf = /* #__PURE__ */createZpk2tf({\n Complex,\n add,\n multiply,\n number,\n typed\n});\nexport var and = /* #__PURE__ */createAnd({\n concat,\n equalScalar,\n matrix,\n not,\n typed,\n zeros\n});\nexport var bitOr = /* #__PURE__ */createBitOr({\n DenseMatrix,\n concat,\n equalScalar,\n matrix,\n typed\n});\nexport var ceil = /* #__PURE__ */createCeil({\n DenseMatrix,\n config,\n equalScalar,\n matrix,\n round,\n typed,\n zeros\n});\nexport var compareNatural = /* #__PURE__ */createCompareNatural({\n compare,\n typed\n});\nexport var composition = /* #__PURE__ */createComposition({\n addScalar,\n combinations,\n isInteger,\n isNegative,\n isPositive,\n larger,\n typed\n});\nexport var cross = /* #__PURE__ */createCross({\n matrix,\n multiply,\n subtract,\n typed\n});\nexport var det = /* #__PURE__ */createDet({\n divideScalar,\n isZero,\n matrix,\n multiply,\n subtract,\n typed,\n unaryMinus\n});\nexport var diff = /* #__PURE__ */createDiff({\n matrix,\n number,\n subtract,\n typed\n});\nexport var distance = /* #__PURE__ */createDistance({\n abs,\n addScalar,\n deepEqual,\n divideScalar,\n multiplyScalar,\n sqrt,\n subtract,\n typed\n});\nexport var dotMultiply = /* #__PURE__ */createDotMultiply({\n concat,\n equalScalar,\n matrix,\n multiplyScalar,\n typed\n});\nexport var FibonacciHeap = /* #__PURE__ */createFibonacciHeapClass({\n larger,\n smaller\n});\nexport var fix = /* #__PURE__ */createFix({\n Complex,\n DenseMatrix,\n ceil,\n equalScalar,\n floor,\n matrix,\n typed,\n zeros\n});\nexport var index = /* #__PURE__ */createIndex({\n Index,\n typed\n});\nexport var intersect = /* #__PURE__ */createIntersect({\n abs,\n add,\n addScalar,\n config,\n divideScalar,\n equalScalar,\n flatten,\n isNumeric,\n isZero,\n matrix,\n multiply,\n multiplyScalar,\n smaller,\n subtract,\n typed\n});\nexport var lcm = /* #__PURE__ */createLcm({\n concat,\n equalScalar,\n matrix,\n typed\n});\nexport var log1p = /* #__PURE__ */createLog1p({\n Complex,\n config,\n divideScalar,\n log,\n typed\n});\nexport var lsolve = /* #__PURE__ */createLsolve({\n DenseMatrix,\n divideScalar,\n equalScalar,\n matrix,\n multiplyScalar,\n subtract,\n typed\n});\nexport var max = /* #__PURE__ */createMax({\n config,\n larger,\n numeric,\n typed\n});\nexport var qr = /* #__PURE__ */createQr({\n addScalar,\n complex,\n conj,\n divideScalar,\n equal,\n identity,\n isZero,\n matrix,\n multiplyScalar,\n sign,\n sqrt,\n subtract,\n typed,\n unaryMinus,\n zeros\n});\nexport var range = /* #__PURE__ */createRange({\n bignumber,\n matrix,\n add,\n config,\n isPositive,\n larger,\n largerEq,\n smaller,\n smallerEq,\n typed\n});\nexport var row = /* #__PURE__ */createRow({\n Index,\n matrix,\n range,\n typed\n});\nexport var setCartesian = /* #__PURE__ */createSetCartesian({\n DenseMatrix,\n Index,\n compareNatural,\n size,\n subset,\n typed\n});\nexport var setDistinct = /* #__PURE__ */createSetDistinct({\n DenseMatrix,\n Index,\n compareNatural,\n size,\n subset,\n typed\n});\nexport var setIsSubset = /* #__PURE__ */createSetIsSubset({\n Index,\n compareNatural,\n size,\n subset,\n typed\n});\nexport var setPowerset = /* #__PURE__ */createSetPowerset({\n Index,\n compareNatural,\n size,\n subset,\n typed\n});\nexport var slu = /* #__PURE__ */createSlu({\n SparseMatrix,\n abs,\n add,\n divideScalar,\n larger,\n largerEq,\n multiply,\n subtract,\n transpose,\n typed\n});\nexport var sort = /* #__PURE__ */createSort({\n compare,\n compareNatural,\n matrix,\n typed\n});\nexport var sum = /* #__PURE__ */createSum({\n add,\n config,\n numeric,\n typed\n});\nexport var usolveAll = /* #__PURE__ */createUsolveAll({\n DenseMatrix,\n divideScalar,\n equalScalar,\n matrix,\n multiplyScalar,\n subtract,\n typed\n});\nexport var atan2 = /* #__PURE__ */createAtan2({\n BigNumber,\n DenseMatrix,\n concat,\n equalScalar,\n matrix,\n typed\n});\nexport var column = /* #__PURE__ */createColumn({\n Index,\n matrix,\n range,\n typed\n});\nexport var lsolveAll = /* #__PURE__ */createLsolveAll({\n DenseMatrix,\n divideScalar,\n equalScalar,\n matrix,\n multiplyScalar,\n subtract,\n typed\n});\nexport var setDifference = /* #__PURE__ */createSetDifference({\n DenseMatrix,\n Index,\n compareNatural,\n size,\n subset,\n typed\n});\nexport var setMultiplicity = /* #__PURE__ */createSetMultiplicity({\n Index,\n compareNatural,\n size,\n subset,\n typed\n});\nexport var setSymDifference = /* #__PURE__ */createSetSymDifference({\n Index,\n concat,\n setDifference,\n size,\n subset,\n typed\n});\nexport var Spa = /* #__PURE__ */createSpaClass({\n FibonacciHeap,\n addScalar,\n equalScalar\n});\nexport var inv = /* #__PURE__ */createInv({\n abs,\n addScalar,\n det,\n divideScalar,\n identity,\n matrix,\n multiply,\n typed,\n unaryMinus\n});\nexport var lup = /* #__PURE__ */createLup({\n DenseMatrix,\n Spa,\n SparseMatrix,\n abs,\n addScalar,\n divideScalar,\n equalScalar,\n larger,\n matrix,\n multiplyScalar,\n subtract,\n typed,\n unaryMinus\n});\nexport var pinv = /* #__PURE__ */createPinv({\n Complex,\n add,\n ctranspose,\n deepEqual,\n divideScalar,\n dot,\n dotDivide,\n equal,\n inv,\n matrix,\n multiply,\n typed\n});\nexport var pow = /* #__PURE__ */createPow({\n Complex,\n config,\n fraction,\n identity,\n inv,\n matrix,\n multiply,\n number,\n typed\n});\nexport var setIntersect = /* #__PURE__ */createSetIntersect({\n DenseMatrix,\n Index,\n compareNatural,\n size,\n subset,\n typed\n});\nexport var setUnion = /* #__PURE__ */createSetUnion({\n Index,\n concat,\n setIntersect,\n setSymDifference,\n size,\n subset,\n typed\n});\nexport var sqrtm = /* #__PURE__ */createSqrtm({\n abs,\n add,\n identity,\n inv,\n map,\n max,\n multiply,\n size,\n sqrt,\n subtract,\n typed\n});\nexport var Unit = /* #__PURE__ */createUnitClass({\n BigNumber,\n Complex,\n Fraction,\n abs,\n addScalar,\n config,\n divideScalar,\n equal,\n fix,\n format,\n isNumeric,\n multiplyScalar,\n number,\n pow,\n round,\n subtract\n});\nexport var vacuumImpedance = /* #__PURE__ */createVacuumImpedance({\n BigNumber,\n Unit,\n config\n});\nexport var wienDisplacement = /* #__PURE__ */createWienDisplacement({\n BigNumber,\n Unit,\n config\n});\nexport var atomicMass = /* #__PURE__ */createAtomicMass({\n BigNumber,\n Unit,\n config\n});\nexport var bohrMagneton = /* #__PURE__ */createBohrMagneton({\n BigNumber,\n Unit,\n config\n});\nexport var boltzmann = /* #__PURE__ */createBoltzmann({\n BigNumber,\n Unit,\n config\n});\nexport var conductanceQuantum = /* #__PURE__ */createConductanceQuantum({\n BigNumber,\n Unit,\n config\n});\nexport var createUnit = /* #__PURE__ */createCreateUnit({\n Unit,\n typed\n});\nexport var deuteronMass = /* #__PURE__ */createDeuteronMass({\n BigNumber,\n Unit,\n config\n});\nexport var dotPow = /* #__PURE__ */createDotPow({\n DenseMatrix,\n concat,\n equalScalar,\n matrix,\n pow,\n typed\n});\nexport var electricConstant = /* #__PURE__ */createElectricConstant({\n BigNumber,\n Unit,\n config\n});\nexport var elementaryCharge = /* #__PURE__ */createElementaryCharge({\n BigNumber,\n Unit,\n config\n});\nexport var expm = /* #__PURE__ */createExpm({\n abs,\n add,\n identity,\n inv,\n multiply,\n typed\n});\nexport var faraday = /* #__PURE__ */createFaraday({\n BigNumber,\n Unit,\n config\n});\nexport var fft = /* #__PURE__ */createFft({\n addScalar,\n ceil,\n conj,\n divideScalar,\n dotDivide,\n exp,\n i,\n log2,\n matrix,\n multiplyScalar,\n pow,\n tau,\n typed\n});\nexport var gamma = /* #__PURE__ */createGamma({\n BigNumber,\n Complex,\n config,\n multiplyScalar,\n pow,\n typed\n});\nexport var gravitationConstant = /* #__PURE__ */createGravitationConstant({\n BigNumber,\n Unit,\n config\n});\nexport var hartreeEnergy = /* #__PURE__ */createHartreeEnergy({\n BigNumber,\n Unit,\n config\n});\nexport var ifft = /* #__PURE__ */createIfft({\n conj,\n dotDivide,\n fft,\n typed\n});\nexport var klitzing = /* #__PURE__ */createKlitzing({\n BigNumber,\n Unit,\n config\n});\nexport var loschmidt = /* #__PURE__ */createLoschmidt({\n BigNumber,\n Unit,\n config\n});\nexport var magneticConstant = /* #__PURE__ */createMagneticConstant({\n BigNumber,\n Unit,\n config\n});\nexport var molarMass = /* #__PURE__ */createMolarMass({\n BigNumber,\n Unit,\n config\n});\nexport var molarPlanckConstant = /* #__PURE__ */createMolarPlanckConstant({\n BigNumber,\n Unit,\n config\n});\nexport var neutronMass = /* #__PURE__ */createNeutronMass({\n BigNumber,\n Unit,\n config\n});\nexport var nuclearMagneton = /* #__PURE__ */createNuclearMagneton({\n BigNumber,\n Unit,\n config\n});\nexport var planckCharge = /* #__PURE__ */createPlanckCharge({\n BigNumber,\n Unit,\n config\n});\nexport var planckLength = /* #__PURE__ */createPlanckLength({\n BigNumber,\n Unit,\n config\n});\nexport var planckTemperature = /* #__PURE__ */createPlanckTemperature({\n BigNumber,\n Unit,\n config\n});\nexport var protonMass = /* #__PURE__ */createProtonMass({\n BigNumber,\n Unit,\n config\n});\nexport var reducedPlanckConstant = /* #__PURE__ */createReducedPlanckConstant({\n BigNumber,\n Unit,\n config\n});\nexport var rydberg = /* #__PURE__ */createRydberg({\n BigNumber,\n Unit,\n config\n});\nexport var secondRadiation = /* #__PURE__ */createSecondRadiation({\n BigNumber,\n Unit,\n config\n});\nexport var speedOfLight = /* #__PURE__ */createSpeedOfLight({\n BigNumber,\n Unit,\n config\n});\nexport var stefanBoltzmann = /* #__PURE__ */createStefanBoltzmann({\n BigNumber,\n Unit,\n config\n});\nexport var thomsonCrossSection = /* #__PURE__ */createThomsonCrossSection({\n BigNumber,\n Unit,\n config\n});\nexport var avogadro = /* #__PURE__ */createAvogadro({\n BigNumber,\n Unit,\n config\n});\nexport var bohrRadius = /* #__PURE__ */createBohrRadius({\n BigNumber,\n Unit,\n config\n});\nexport var coulomb = /* #__PURE__ */createCoulomb({\n BigNumber,\n Unit,\n config\n});\nexport var divide = /* #__PURE__ */createDivide({\n divideScalar,\n equalScalar,\n inv,\n matrix,\n multiply,\n typed\n});\nexport var electronMass = /* #__PURE__ */createElectronMass({\n BigNumber,\n Unit,\n config\n});\nexport var factorial = /* #__PURE__ */createFactorial({\n gamma,\n typed\n});\nexport var firstRadiation = /* #__PURE__ */createFirstRadiation({\n BigNumber,\n Unit,\n config\n});\nexport var gravity = /* #__PURE__ */createGravity({\n BigNumber,\n Unit,\n config\n});\nexport var inverseConductanceQuantum = /* #__PURE__ */createInverseConductanceQuantum({\n BigNumber,\n Unit,\n config\n});\nexport var lusolve = /* #__PURE__ */createLusolve({\n DenseMatrix,\n lsolve,\n lup,\n matrix,\n slu,\n typed,\n usolve\n});\nexport var magneticFluxQuantum = /* #__PURE__ */createMagneticFluxQuantum({\n BigNumber,\n Unit,\n config\n});\nexport var molarMassC12 = /* #__PURE__ */createMolarMassC12({\n BigNumber,\n Unit,\n config\n});\nexport var multinomial = /* #__PURE__ */createMultinomial({\n add,\n divide,\n factorial,\n isInteger,\n isPositive,\n multiply,\n typed\n});\nexport var permutations = /* #__PURE__ */createPermutations({\n factorial,\n typed\n});\nexport var planckMass = /* #__PURE__ */createPlanckMass({\n BigNumber,\n Unit,\n config\n});\nexport var polynomialRoot = /* #__PURE__ */createPolynomialRoot({\n add,\n cbrt,\n divide,\n equalScalar,\n im,\n isZero,\n multiply,\n re,\n sqrt,\n subtract,\n typeOf,\n typed,\n unaryMinus\n});\nexport var setSize = /* #__PURE__ */createSetSize({\n compareNatural,\n typed\n});\nexport var solveODE = /* #__PURE__ */createSolveODE({\n abs,\n add,\n bignumber,\n divide,\n isNegative,\n isPositive,\n larger,\n map,\n matrix,\n max,\n multiply,\n smaller,\n subtract,\n typed,\n unaryMinus\n});\nexport var stirlingS2 = /* #__PURE__ */createStirlingS2({\n bignumber,\n addScalar,\n combinations,\n divideScalar,\n factorial,\n isInteger,\n isNegative,\n larger,\n multiplyScalar,\n number,\n pow,\n subtract,\n typed\n});\nexport var unit = /* #__PURE__ */createUnitFunction({\n Unit,\n typed\n});\nexport var bellNumbers = /* #__PURE__ */createBellNumbers({\n addScalar,\n isInteger,\n isNegative,\n stirlingS2,\n typed\n});\nexport var eigs = /* #__PURE__ */createEigs({\n abs,\n add,\n addScalar,\n atan,\n bignumber,\n column,\n complex,\n config,\n cos,\n diag,\n divideScalar,\n dot,\n equal,\n flatten,\n im,\n inv,\n larger,\n matrix,\n matrixFromColumns,\n multiply,\n multiplyScalar,\n number,\n qr,\n re,\n sin,\n smaller,\n sqrt,\n subtract,\n typed,\n usolve,\n usolveAll\n});\nexport var fermiCoupling = /* #__PURE__ */createFermiCoupling({\n BigNumber,\n Unit,\n config\n});\nexport var gasConstant = /* #__PURE__ */createGasConstant({\n BigNumber,\n Unit,\n config\n});\nexport var mean = /* #__PURE__ */createMean({\n add,\n divide,\n typed\n});\nexport var molarVolume = /* #__PURE__ */createMolarVolume({\n BigNumber,\n Unit,\n config\n});\nexport var planckConstant = /* #__PURE__ */createPlanckConstant({\n BigNumber,\n Unit,\n config\n});\nexport var quantumOfCirculation = /* #__PURE__ */createQuantumOfCirculation({\n BigNumber,\n Unit,\n config\n});\nexport var variance = /* #__PURE__ */createVariance({\n add,\n apply,\n divide,\n isNaN,\n multiply,\n subtract,\n typed\n});\nexport var classicalElectronRadius = /* #__PURE__ */createClassicalElectronRadius({\n BigNumber,\n Unit,\n config\n});\nexport var median = /* #__PURE__ */createMedian({\n add,\n compare,\n divide,\n partitionSelect,\n typed\n});\nexport var kldivergence = /* #__PURE__ */createKldivergence({\n divide,\n dotDivide,\n isNumeric,\n log,\n map,\n matrix,\n multiply,\n sum,\n typed\n});\nexport var mad = /* #__PURE__ */createMad({\n abs,\n map,\n median,\n subtract,\n typed\n});\nexport var std = /* #__PURE__ */createStd({\n map,\n sqrt,\n typed,\n variance\n});\nexport var freqz = /* #__PURE__ */createFreqz({\n Complex,\n add,\n divide,\n matrix,\n multiply,\n typed\n});\nexport var norm = /* #__PURE__ */createNorm({\n abs,\n add,\n conj,\n ctranspose,\n eigs,\n equalScalar,\n larger,\n matrix,\n multiply,\n pow,\n smaller,\n sqrt,\n typed\n});\nexport var rotationMatrix = /* #__PURE__ */createRotationMatrix({\n BigNumber,\n DenseMatrix,\n SparseMatrix,\n addScalar,\n config,\n cos,\n matrix,\n multiplyScalar,\n norm,\n sin,\n typed,\n unaryMinus\n});\nexport var planckTime = /* #__PURE__ */createPlanckTime({\n BigNumber,\n Unit,\n config\n});\nexport var schur = /* #__PURE__ */createSchur({\n identity,\n matrix,\n multiply,\n norm,\n qr,\n subtract,\n typed\n});\nexport var rotate = /* #__PURE__ */createRotate({\n multiply,\n rotationMatrix,\n typed\n});\nexport var sylvester = /* #__PURE__ */createSylvester({\n abs,\n add,\n concat,\n identity,\n index,\n lusolve,\n matrix,\n matrixFromColumns,\n multiply,\n range,\n schur,\n subset,\n subtract,\n transpose,\n typed\n});\nexport var lyap = /* #__PURE__ */createLyap({\n matrix,\n multiply,\n sylvester,\n transpose,\n typed\n});","import _extends from \"@babel/runtime/helpers/extends\";\n/**\n * THIS FILE IS AUTO-GENERATED\n * DON'T MAKE CHANGES HERE\n */\nimport { config } from './configReadonly.js';\nimport { createNode, createObjectNode, createOperatorNode, createParenthesisNode, createRelationalNode, createArrayNode, createBlockNode, createConditionalNode, createConstantNode, createRangeNode, createReviver, createChainClass, createFunctionAssignmentNode, createChain, createAccessorNode, createIndexNode, createAssignmentNode, createSymbolNode, createFunctionNode, createParse, createResolve, createSimplifyConstant, createCompile, createHelpClass, createLeafCount, createSimplifyCore, createEvaluate, createHelp, createParserClass, createSimplify, createSymbolicEqual, createDerivative, createParser, createRationalize, createFilterTransform, createForEachTransform, createMapTransform, createApplyTransform, createSubsetTransform, createConcatTransform, createMaxTransform, createSumTransform, createMinTransform, createCumSumTransform, createDiffTransform, createIndexTransform, createRangeTransform, createRowTransform, createColumnTransform, createMeanTransform, createVarianceTransform, createStdTransform } from '../factoriesAny.js';\nimport { BigNumber, Complex, e, _false, fineStructure, Fraction, i, _Infinity, LN10, LOG10E, Matrix, _NaN, _null, phi, Range, ResultSet, SQRT1_2,\n// eslint-disable-line camelcase\nsackurTetrode, tau, _true, version, DenseMatrix, efimovFactor, LN2, pi, replacer, SQRT2, typed, unaryPlus, weakMixingAngle, abs, acos, acot, acsc, addScalar, arg, asech, asinh, atan, atanh, bignumber, bitNot, boolean, clone, combinations, complex, conj, cosh, coth, csc, cube, equalScalar, erf, exp, expm1, filter, forEach, format, getMatrixDataType, hex, im, isInteger, isNegative, isPositive, isZero, LOG2E, lgamma, log10, log2, map, multiplyScalar, not, number, oct, pickRandom, print, random, re, sec, sign, sin, SparseMatrix, splitUnit, square, string, tan, typeOf, acosh, acsch, apply, asec, bin, combinationsWithRep, cos, csch, isNaN, isPrime, randomInt, sech, sinh, sparse, sqrt, tanh, unaryMinus, acoth, cot, fraction, isNumeric, matrix, matrixFromFunction, mode, numeric, prod, reshape, size, squeeze, subset, transpose, xgcd, zeros, asin, cbrt, concat, count, ctranspose, diag, divideScalar, dotDivide, equal, flatten, gcd, hasNumericValue, identity, kron, largerEq, leftShift, matrixFromColumns, mod, nthRoot, ones, resize, rightArithShift, round, smaller, to, unequal, xor, add, bitAnd, bitXor, catalan, compare, compareText, cumsum, deepEqual, dot, equalText, floor, hypot, ImmutableDenseMatrix, Index, invmod, larger, log, matrixFromRows, min, multiply, nthRoots, or, partitionSelect, quantileSeq, rightLogShift, smallerEq, subtract, trace, usolve, zpk2tf, and, bitOr, ceil, compareNatural, composition, cross, det, diff, distance, dotMultiply, FibonacciHeap, fix, index, intersect, lcm, log1p, lsolve, max, qr, range, row, setCartesian, setDistinct, setIsSubset, setPowerset, slu, sort, sum, usolveAll, atan2, column, lsolveAll, setDifference, setMultiplicity, setSymDifference, Spa, inv, lup, pinv, pow, setIntersect, setUnion, sqrtm, Unit, vacuumImpedance, wienDisplacement, atomicMass, bohrMagneton, boltzmann, conductanceQuantum, createUnit, deuteronMass, dotPow, electricConstant, elementaryCharge, expm, faraday, fft, gamma, gravitationConstant, hartreeEnergy, ifft, klitzing, loschmidt, magneticConstant, molarMass, molarPlanckConstant, neutronMass, nuclearMagneton, planckCharge, planckLength, planckTemperature, protonMass, reducedPlanckConstant, rydberg, secondRadiation, speedOfLight, stefanBoltzmann, thomsonCrossSection, avogadro, bohrRadius, coulomb, divide, electronMass, factorial, firstRadiation, gravity, inverseConductanceQuantum, lusolve, magneticFluxQuantum, molarMassC12, multinomial, permutations, planckMass, polynomialRoot, setSize, solveODE, stirlingS2, unit, bellNumbers, eigs, fermiCoupling, gasConstant, mean, molarVolume, planckConstant, quantumOfCirculation, variance, classicalElectronRadius, median, kldivergence, mad, std, freqz, norm, rotationMatrix, planckTime, schur, rotate, sylvester, lyap } from './pureFunctionsAny.generated.js';\nvar math = {}; // NOT pure!\nvar mathWithTransform = {}; // NOT pure!\nvar classes = {}; // NOT pure!\n\nexport var Node = createNode({\n mathWithTransform\n});\nexport var ObjectNode = createObjectNode({\n Node\n});\nexport var OperatorNode = createOperatorNode({\n Node\n});\nexport var ParenthesisNode = createParenthesisNode({\n Node\n});\nexport var RelationalNode = createRelationalNode({\n Node\n});\nexport var ArrayNode = createArrayNode({\n Node\n});\nexport var BlockNode = createBlockNode({\n Node,\n ResultSet\n});\nexport var ConditionalNode = createConditionalNode({\n Node\n});\nexport var ConstantNode = createConstantNode({\n Node\n});\nexport var RangeNode = createRangeNode({\n Node\n});\nexport var reviver = createReviver({\n classes\n});\nexport var Chain = createChainClass({\n math,\n typed\n});\nexport var FunctionAssignmentNode = createFunctionAssignmentNode({\n Node,\n typed\n});\nexport var chain = createChain({\n Chain,\n typed\n});\nexport var AccessorNode = createAccessorNode({\n Node,\n subset\n});\nexport var IndexNode = createIndexNode({\n Node,\n size\n});\nexport var AssignmentNode = createAssignmentNode({\n matrix,\n Node,\n subset\n});\nexport var SymbolNode = createSymbolNode({\n Unit,\n Node,\n math\n});\nexport var FunctionNode = createFunctionNode({\n Node,\n SymbolNode,\n math\n});\nexport var parse = createParse({\n AccessorNode,\n ArrayNode,\n AssignmentNode,\n BlockNode,\n ConditionalNode,\n ConstantNode,\n FunctionAssignmentNode,\n FunctionNode,\n IndexNode,\n ObjectNode,\n OperatorNode,\n ParenthesisNode,\n RangeNode,\n RelationalNode,\n SymbolNode,\n config,\n numeric,\n typed\n});\nexport var resolve = createResolve({\n ConstantNode,\n FunctionNode,\n OperatorNode,\n ParenthesisNode,\n parse,\n typed\n});\nexport var simplifyConstant = createSimplifyConstant({\n bignumber,\n fraction,\n AccessorNode,\n ArrayNode,\n ConstantNode,\n FunctionNode,\n IndexNode,\n ObjectNode,\n OperatorNode,\n SymbolNode,\n config,\n mathWithTransform,\n matrix,\n typed\n});\nexport var compile = createCompile({\n parse,\n typed\n});\nexport var Help = createHelpClass({\n parse\n});\nexport var leafCount = createLeafCount({\n parse,\n typed\n});\nexport var simplifyCore = createSimplifyCore({\n AccessorNode,\n ArrayNode,\n ConstantNode,\n FunctionNode,\n IndexNode,\n ObjectNode,\n OperatorNode,\n ParenthesisNode,\n SymbolNode,\n add,\n divide,\n equal,\n isZero,\n multiply,\n parse,\n pow,\n subtract,\n typed\n});\nexport var evaluate = createEvaluate({\n parse,\n typed\n});\nexport var help = createHelp({\n Help,\n mathWithTransform,\n typed\n});\nexport var Parser = createParserClass({\n evaluate\n});\nexport var simplify = createSimplify({\n bignumber,\n fraction,\n AccessorNode,\n ArrayNode,\n ConstantNode,\n FunctionNode,\n IndexNode,\n ObjectNode,\n OperatorNode,\n ParenthesisNode,\n SymbolNode,\n add,\n config,\n divide,\n equal,\n isZero,\n mathWithTransform,\n matrix,\n multiply,\n parse,\n pow,\n resolve,\n simplifyConstant,\n simplifyCore,\n subtract,\n typed\n});\nexport var symbolicEqual = createSymbolicEqual({\n OperatorNode,\n parse,\n simplify,\n typed\n});\nexport var derivative = createDerivative({\n ConstantNode,\n FunctionNode,\n OperatorNode,\n ParenthesisNode,\n SymbolNode,\n config,\n equal,\n isZero,\n numeric,\n parse,\n simplify,\n typed\n});\nexport var parser = createParser({\n Parser,\n typed\n});\nexport var rationalize = createRationalize({\n bignumber,\n fraction,\n AccessorNode,\n ArrayNode,\n ConstantNode,\n FunctionNode,\n IndexNode,\n ObjectNode,\n OperatorNode,\n ParenthesisNode,\n SymbolNode,\n add,\n config,\n divide,\n equal,\n isZero,\n mathWithTransform,\n matrix,\n multiply,\n parse,\n pow,\n simplify,\n simplifyConstant,\n simplifyCore,\n subtract,\n typed\n});\n_extends(math, {\n e,\n false: _false,\n fineStructure,\n i,\n Infinity: _Infinity,\n LN10,\n LOG10E,\n NaN: _NaN,\n null: _null,\n phi,\n SQRT1_2,\n sackurTetrode,\n tau,\n true: _true,\n 'E': e,\n version,\n efimovFactor,\n LN2,\n pi,\n replacer,\n reviver,\n SQRT2,\n typed,\n unaryPlus,\n 'PI': pi,\n weakMixingAngle,\n abs,\n acos,\n acot,\n acsc,\n addScalar,\n arg,\n asech,\n asinh,\n atan,\n atanh,\n bignumber,\n bitNot,\n boolean,\n clone,\n combinations,\n complex,\n conj,\n cosh,\n coth,\n csc,\n cube,\n equalScalar,\n erf,\n exp,\n expm1,\n filter,\n forEach,\n format,\n getMatrixDataType,\n hex,\n im,\n isInteger,\n isNegative,\n isPositive,\n isZero,\n LOG2E,\n lgamma,\n log10,\n log2,\n map,\n multiplyScalar,\n not,\n number,\n oct,\n pickRandom,\n print,\n random,\n re,\n sec,\n sign,\n sin,\n splitUnit,\n square,\n string,\n tan,\n typeOf,\n acosh,\n acsch,\n apply,\n asec,\n bin,\n chain,\n combinationsWithRep,\n cos,\n csch,\n isNaN,\n isPrime,\n randomInt,\n sech,\n sinh,\n sparse,\n sqrt,\n tanh,\n unaryMinus,\n acoth,\n cot,\n fraction,\n isNumeric,\n matrix,\n matrixFromFunction,\n mode,\n numeric,\n prod,\n reshape,\n size,\n squeeze,\n subset,\n transpose,\n xgcd,\n zeros,\n asin,\n cbrt,\n concat,\n count,\n ctranspose,\n diag,\n divideScalar,\n dotDivide,\n equal,\n flatten,\n gcd,\n hasNumericValue,\n identity,\n kron,\n largerEq,\n leftShift,\n matrixFromColumns,\n mod,\n nthRoot,\n ones,\n resize,\n rightArithShift,\n round,\n smaller,\n to,\n unequal,\n xor,\n add,\n bitAnd,\n bitXor,\n catalan,\n compare,\n compareText,\n cumsum,\n deepEqual,\n dot,\n equalText,\n floor,\n hypot,\n invmod,\n larger,\n log,\n matrixFromRows,\n min,\n multiply,\n nthRoots,\n or,\n partitionSelect,\n quantileSeq,\n rightLogShift,\n smallerEq,\n subtract,\n trace,\n usolve,\n zpk2tf,\n and,\n bitOr,\n ceil,\n compareNatural,\n composition,\n cross,\n det,\n diff,\n distance,\n dotMultiply,\n fix,\n index,\n intersect,\n lcm,\n log1p,\n lsolve,\n max,\n qr,\n range,\n row,\n setCartesian,\n setDistinct,\n setIsSubset,\n setPowerset,\n slu,\n sort,\n sum,\n usolveAll,\n atan2,\n column,\n lsolveAll,\n setDifference,\n setMultiplicity,\n setSymDifference,\n inv,\n lup,\n pinv,\n pow,\n setIntersect,\n setUnion,\n sqrtm,\n vacuumImpedance,\n wienDisplacement,\n atomicMass,\n bohrMagneton,\n boltzmann,\n conductanceQuantum,\n createUnit,\n deuteronMass,\n dotPow,\n electricConstant,\n elementaryCharge,\n expm,\n faraday,\n fft,\n gamma,\n gravitationConstant,\n hartreeEnergy,\n ifft,\n klitzing,\n loschmidt,\n magneticConstant,\n molarMass,\n molarPlanckConstant,\n neutronMass,\n nuclearMagneton,\n planckCharge,\n planckLength,\n planckTemperature,\n protonMass,\n reducedPlanckConstant,\n rydberg,\n secondRadiation,\n speedOfLight,\n stefanBoltzmann,\n thomsonCrossSection,\n avogadro,\n bohrRadius,\n coulomb,\n divide,\n electronMass,\n factorial,\n firstRadiation,\n gravity,\n inverseConductanceQuantum,\n lusolve,\n magneticFluxQuantum,\n molarMassC12,\n multinomial,\n parse,\n permutations,\n planckMass,\n polynomialRoot,\n resolve,\n setSize,\n simplifyConstant,\n solveODE,\n stirlingS2,\n unit,\n bellNumbers,\n compile,\n eigs,\n fermiCoupling,\n gasConstant,\n leafCount,\n mean,\n molarVolume,\n planckConstant,\n quantumOfCirculation,\n simplifyCore,\n variance,\n classicalElectronRadius,\n evaluate,\n help,\n median,\n simplify,\n symbolicEqual,\n derivative,\n kldivergence,\n mad,\n parser,\n rationalize,\n std,\n freqz,\n norm,\n rotationMatrix,\n planckTime,\n schur,\n rotate,\n sylvester,\n lyap,\n config\n});\n_extends(mathWithTransform, math, {\n filter: createFilterTransform({\n typed\n }),\n forEach: createForEachTransform({\n typed\n }),\n map: createMapTransform({\n typed\n }),\n apply: createApplyTransform({\n isInteger,\n typed\n }),\n subset: createSubsetTransform({\n matrix,\n typed\n }),\n concat: createConcatTransform({\n isInteger,\n matrix,\n typed\n }),\n max: createMaxTransform({\n config,\n larger,\n numeric,\n typed\n }),\n sum: createSumTransform({\n add,\n config,\n numeric,\n typed\n }),\n min: createMinTransform({\n config,\n numeric,\n smaller,\n typed\n }),\n cumsum: createCumSumTransform({\n add,\n typed,\n unaryPlus\n }),\n diff: createDiffTransform({\n bignumber,\n matrix,\n number,\n subtract,\n typed\n }),\n index: createIndexTransform({\n Index\n }),\n range: createRangeTransform({\n bignumber,\n matrix,\n add,\n config,\n isPositive,\n larger,\n largerEq,\n smaller,\n smallerEq,\n typed\n }),\n row: createRowTransform({\n Index,\n matrix,\n range,\n typed\n }),\n column: createColumnTransform({\n Index,\n matrix,\n range,\n typed\n }),\n mean: createMeanTransform({\n add,\n divide,\n typed\n }),\n variance: createVarianceTransform({\n add,\n apply,\n divide,\n isNaN,\n multiply,\n subtract,\n typed\n }),\n std: createStdTransform({\n map,\n sqrt,\n typed,\n variance\n })\n});\n_extends(classes, {\n BigNumber,\n Complex,\n Fraction,\n Matrix,\n Node,\n ObjectNode,\n OperatorNode,\n ParenthesisNode,\n Range,\n RelationalNode,\n ResultSet,\n ArrayNode,\n BlockNode,\n ConditionalNode,\n ConstantNode,\n DenseMatrix,\n RangeNode,\n Chain,\n FunctionAssignmentNode,\n SparseMatrix,\n AccessorNode,\n IndexNode,\n AssignmentNode,\n ImmutableDenseMatrix,\n Index,\n FibonacciHeap,\n Spa,\n Unit,\n SymbolNode,\n FunctionNode,\n Help,\n Parser\n});\nChain.createProxy(math);\nexport { embeddedDocs as docs } from '../expression/embeddedDocs/embeddedDocs.js';"],"names":["root","cosh","Math","x","abs","exp","sinh","parser_exit","SyntaxError","logHypot","a","b","_a","_b","log","LN2","Complex","this","z","undefined","Number","isFinite","cos","sin","length","tokens","match","plus","minus","i","c","isNaN","parseFloat","parse","prototype","t","d","pow","arg","atan2","loh","re","im","r","sqrt","tmp","expm1","PI","xx","cosm1","y","t1","t2","Infinity","atan","acos","asin","res","noIM","oneMinus","onePlus","temp","atanh","asinh","acosh","places","ceil","floor","round","ret","E","NaN","_extends","Object","assign","target","arguments","source","key","hasOwnProperty","call","defaultEscapes","$","_","formatEscapes","defaultEscapeMapFn","module","exports","str","_ref","_ref$preserveFormatti","preserveFormatting","_ref$escapeMapFn","escapeMapFn","runningStr","String","result","escapes","escapeKeys","keys","_loop","specialCharFound","forEach","index","slice","P","n","s","parseInt","Fraction","newFraction","f","create","gcd","factorize","num","factors","p1","p2","M","v","w","A","B","C","D","N","LN10","Error","k","eps","thisABS","cont","valueOf","excludeWhole","whole","push","dec","cycLen","rem","cycleLen","cycOff","len","rem1","rem2","e","m","modpow","cycleStart","naturalSort","oFxNcL","oFyNcL","sre","dre","hre","ore","insensitive","toLowerCase","replace","xN","split","yN","xD","Date","yD","cLoc","numS","max","on","name","callback","ctx","fn","once","self","listener","off","apply","emit","data","evtArr","evts","liveEvents","TinyEmitter","epsilon","matrix","number","precision","predictable","randomSeed","constructor","isBigNumber","isDecimal","getPrototypeOf","isComplex","isFraction","isUnit","Array","isArray","isMatrix","isDenseMatrix","isSparseMatrix","isRange","isIndex","isResultSet","isHelp","RegExp","isAccessorNode","isNode","isArrayNode","isAssignmentNode","isBlockNode","isConditionalNode","isConstantNode","rule2Node","node","args","includes","op","isFunctionAssignmentNode","isFunctionNode","isIndexNode","isObjectNode","isOperatorNode","isParenthesisNode","isRangeNode","isRelationalNode","isSymbolNode","isChain","typeOf","type","clone","map","value","TypeError","object","extend","prop","deepStrictEqual","property","MATRIX_OPTIONS","NUMBER_OPTIONS","config","options","freeze","_createForOfIteratorHelper","o","allowArrayLike","it","Symbol","iterator","minLen","_arrayLikeToArray","toString","from","test","_unsupportedIterableToArray","F","done","_e","err","normalCompletion","didErr","step","next","_e2","return","arr","arr2","_typeof","obj","ok","notOk","undef","NOT_TYPED_FUNCTION","isPlainObject","typeMap","typeList","_types","anyType","isAny","nConversions","typed","createCount","findType","typeName","get","otherName","_step","message","_iterator","addTypes","types","beforeSpec","beforeIndex","newTypes","has","set","conversionsTo","affectedTypes","concat","_i","clear","Map","findTypeNames","matches","filter","isTypedFunction","entity","findSignature","signature","exact","params","parseSignature","join","canonicalSignature","stringifyParams","signatures","_typedFunctionData","signatureMap","remainingSignatures","candidate","nParams","_step3","want","filteredSignatures","possibility","_iterator3","have","getParamAtIndex","restParam","hasAny","haveTypes","paramTypeSet","some","wtype","_step4","_iterator4","separator","p","parseParam","param","indexOf","typeDefs","trim","paramName","typeIndex","conversion","conversionIndex","hasConversion","expandParam","matchingConversions","typeNames","sort","knownTypes","Set","_step8","newMatch","_iterator8","add","availableConversions","newName","convertibleTypes","typeSet","rawSignature","rawParams","parsedParam","hasRestParam","last","compileTest","test0","test1","tests","compileTests","varIndex","initial","lastTest","testRestParam","getTypeSetAtIndex","isExactType","mergeExpectedParams","_step5","_iterator5","createError","expected","_name","matchingSignatures","nextMatchingDefs","actualTypes","category","actual","_ret2","lengths","min","maxLength","expectedLength","argTypes","getLowestTypeIndex","getLowestConversionIndex","compareParams","param1","param2","typeDiff","convDiff","compareSignatures","signature1","signature2","pars1","pars2","last1","last2","hasRest1","hasRest2","par","_step6","any1","conv1","_iterator6","_step7","any2","conv2","_iterator7","lengthCriterion","comparisons","tc","thisComparison","_i2","_comparisons","compileArgsPreprocessing","fnConvert","compiledConversions","compileArgConversion","fnPreprocess","offset","conversion0","conversion1","conversions","convert","splitParams","_splitParams","paramsSoFar","resultingParams","exactTypes","nextParam","collectResolutions","references","functionList","reference","_step10","resolvedReferences","_iterator10","resolution","resolveReferences","resolvedFunctions","isReferToSelf","referToSelf","isReferTo","makeReferTo","referTo","clearResolutions","isResolved","fill","leftUnresolved","nothingResolved","createTypedFunction","rawSignaturesMap","warnAgainstDeprecatedThis","signaturesMap","deprecatedThisRegex","validateDeprecatedThis","parsedParams","originalFunctions","preliminarySignatures","_loop2","pp","params1","params2","ii","_step9","typeSet1","overlap","_iterator9","len1","len2","restParam1","restParam2","conflicting","functionIndex","_step11","sp","_iterator11","spName","every","theTypedFn","internalSignatureMap","_i3","_preliminarySignature","ok0","ok1","ok2","ok3","ok4","ok5","allOk","test00","test10","test20","test30","test40","test50","test01","test11","test21","test31","test41","test51","_i4","implementation","fn0","fn1","fn2","fn3","fn4","fn5","len0","len3","len4","len5","iStart","iEnd","fns","generic","_i5","onMismatch","arg0","arg1","defineProperty","_onMismatch","start","end","objectOrFn","checkName","nameSoFar","getObjectName","mergeSignatures","dest","sourceFunction","destFunction","saveTyped","_validateConversion","to","maybeName","named","allSignatures","item","theseSignatures","thisName","argument","throwMismatchError","clearConversions","_step2","_iterator2","_findType","find","addType","beforeObjectTest","before","addConversion","other","addConversions","removeConversion","existingConversion","findInArray","splice","resolve","tf","argList","sigs","isInteger","sign","log2","log10","log1p","cbrt","negate","formatNumberToBase","base","size","prefix","suffix","format","wordSize","notation","toFixed","toExponential","splitNumber","rounded","roundDigits","exponent","coefficients","newExp","missingZeros","expDiff","decimalIdx","decimals","decimalVal","toEngineering","lowerExp","upperExp","zeros","dot","toPrecision","digits","splitValue","first","shift","unshift","pop","DBL_EPSILON","EPSILON","nearlyEqual","diff","tanh","formatBigNumberToBase","big2","BigNumberCtor","greaterThan","sub","lessThan","mul","toBinary","toOctal","toHexadecimal","gt","valueWithoutExp","valueStr","BigNumber","isZero","toSignificantDigits","endsWith","text","search","substring","looksLikeFraction","fraction","formatArray","syntax","_format","truncate","stringify","escaped","charAt","array","compareText","relation","stack","arraySize","_validate","dim","dimNext","child","validate","validateIndex","defaultValue","_resize","elem","oldLen","newLen","reshape","sizes","flatArray","flatten","currentLength","newLength","product","processSizesWildcard","tmpArray2","tmpArray","sizeIndex","_reshape","processedSizes","wildCardIndex","reduce","prev","curr","squeeze","dims","_squeeze","unsqueeze","outer","_unsqueeze","flat","filterRegExp","regexp","entry","identify","count","identifier","generalize","getArrayDataType","itemType","dependencies","meta","assertAndCreate","scope","deps","properties","copy","pickShallow","allDefined","dependency","isOptionalDependency","missingDependencies","assertDependencies","isFactory","getSafeProperty","isSafeProperty","isSafeMethod","setSafeProperty","safeNativeProperties","Function","method","safeNativeMethods","RangeError","isDimensionError","isIndexError","toLocaleString","ObjectWrappingMap","wrappedObject","createEmptyMap","createMap","mapOrObject","isMap","_len","objects","_key","_key2","_createTyped2","createTyped","DenseMatrix","throwNoBignumber","throwNoComplex","toNumber","throwNoFraction","throwNoMatrix","usualError","sig","inexact","quadrant","createResultSet","ResultSet","entries","toJSON","mathjs","fromJSON","json","isClass","EXP_LIMIT","MAX_DIGITS","NUMERALS","DEFAULTS","rounding","modulo","toExpNeg","toExpPos","minE","maxE","crypto","external","decimalError","invalidArgument","precisionLimitExceeded","cryptoUnavailable","tag","mathfloor","mathpow","isBinary","isHex","isOctal","BASE","LOG_BASE","LN10_PRECISION","PI_PRECISION","toStringTag","digitsToString","ws","indexOfLastWord","getZeroString","checkInt32","checkRoundingDigits","rm","repeating","di","rd","convertBase","baseIn","baseOut","j","arrL","strL","reverse","absoluteValue","finalise","clampedTo","clamp","Ctor","cmp","comparedTo","xdL","ydL","xd","yd","xs","ys","cosine","pr","sd","tinyPow","taylorSeries","times","cos2x","toLessThanHalfPi","neg","cubeRoot","rep","t3","t3plusx","divide","eq","decimalPlaces","dp","dividedBy","div","dividedToIntegerBy","divToInt","equals","greaterThanOrEqualTo","gte","hyperbolicCosine","one","cosh2_x","d8","hyperbolicSine","sinh2_x","d5","d16","d20","hyperbolicTangent","inverseCosine","halfPi","isNeg","getPi","inverseHyperbolicCosine","lte","ln","inverseHyperbolicSine","inverseHyperbolicTangent","wpr","xsd","inverseSine","inverseTangent","px","x2","isInt","isNegative","isPositive","isPos","lt","lessThanOrEqualTo","logarithm","isBase10","denominator","inf","naturalLogarithm","getLn10","xe","xLTy","getBase10Exponent","mod","q","naturalExponential","negated","carry","getPrecision","sine","sin2_x","squareRoot","tangent","tan","rL","toStringBinary","toDecimalPlaces","toDP","finiteToString","toFraction","maxD","d0","d1","d2","n0","n1","toHex","toNearest","toPower","yn","intPow","toSD","truncated","trunc","multiplyInteger","compare","aL","bL","subtract","logBase","more","prod","prodL","qd","remL","rem0","xi","xL","yd0","yL","yz","isTruncated","roundUp","xdi","out","isExp","nonFiniteToString","zs","isOdd","maxOrMin","ltgt","guard","sum","c0","numerator","x1","parseDecimal","charCodeAt","parseOther","divisor","isFloat","Decimal","isHyperbolic","u","pi","useDefaults","defaults","ps","getRandomValues","randomBytes","hypot","isDecimalInstance","random","Uint32Array","for","ROUND_UP","ROUND_DOWN","ROUND_CEIL","ROUND_FLOOR","ROUND_HALF_UP","ROUND_HALF_DOWN","ROUND_HALF_EVEN","ROUND_HALF_CEIL","ROUND_HALF_FLOOR","EUCLID","createBigNumberClass","createComplexClass","toPolar","phi","strRe","strIm","hasBase","createFractionClass","createRangeClass","Range","hasStart","hasEnd","hasStep","nums","toArray","createMatrixClass","Matrix","storage","datatype","subset","replacement","resize","skipZeros","lruQueue","limit","queue","del","id","oldIndex","hit","nuIndex","delete","memoize","hasher","POSITIVE_INFINITY","JSON","cache","values","lru","hash","newVal","maxArgumentCount","createDenseMatrixClass","_data","_size","_datatype","preprocess","_getSubmatrix","range","dimension","_setSubmatrix","submatrix","dataIndex","subIndex","_fit","newSize","changed","createDenseMatrix","getDataType","isScalar","_get","sSize","iSize","_set","indexI","sizeArray","me","recurse","rows","row","columns","_this","col","diagonal","kSuper","kSub","_value","ms","swapRows","_swapRows","vi","createClone","any","_switch","mat","I","J","containsCollections","deepForEach","deepMap","_reduce","val","tran","scatter","mark","cindex","inverse","update","k0","k1","avalues","_values","aindex","_index","aptr","_ptr","createIsInteger","n2","absNumber","addNumber","multiplyNumber","unaryMinusNumber","unaryPlusNumber","cbrtNumber","cubeNumber","expNumber","expm1Number","gcdNumber","lcmNumber","log10Number","log2Number","modNumber","inv","signNumber","squareNumber","xgcdNumber","lastx","lasty","powNumber","roundNumber","bitAndNumber","bitNotNumber","bitOrNumber","bitXorNumber","leftShiftNumber","rightArithShiftNumber","rightLogShiftNumber","half","combinationsNumber","nMinusk","answer","nextdivisor","lastdivisor","nextnumerator","tau","notNumber","orNumber","xorNumber","andNumber","gammaNumber","twoN","threeN","fourN","fiveN","gammaP","gammaG","lnSqrt2PI","lgammaSeries","lgammaNumber","lgammaN","acoshNumber","acotNumber","acothNumber","acscNumber","acschNumber","xInv","asecNumber","asechNumber","asinhNumber","atanhNumber","cotNumber","cothNumber","cscNumber","cschNumber","secNumber","sechNumber","sinhNumber","isNegativeNumber","isPositiveNumber","isZeroNumber","isNaNNumber","createIsNegative","Unit","valueType","createIsNumeric","createHasNumericValue","isNumeric","boolean","string","createIsPositive","createIsZero","createIsNaN","createTypeOf","createCompareUnits","equalBase","createEqualScalar","compareUnits","complexEquals","createSparseMatrixClass","_ref2","equalScalar","SparseMatrix","_createFromArray","_createFromMatrix","ptr","zero","_getValueIndex","top","bottom","_insert","ins","_toArray","createSparseMatrix","density","idx","kk","mvalues","mindex","mptr","pv","_getsubset","firstDimensionRange","secondDimensionRange","firstDataIndex","firstSubIndex","secondDataIndex","secondSubIndex","_setsubset","_remove","colIndex","rowIndex","r1","c1","h","_j","minRow","maxRow","minColumn","maxColumn","invoke","_k","_map","_k2","_i7","_forEachRow","kx","ky","vx","vy","createNumber","input","nonDecimalWithRadixMatch","nonDecimalNumberParts","radix","integerPart","fractionalPart","parts","makeNumberFromNonDecimalParts","wordSizeSuffixMatch","null","unit","valuelessUnit","createString","createBoolean","lcase","createBignumber","twoPowSize","twoPowSizeSubOne","createComplex","ZERO","createFraction","createMatrix","_create","createMatrixFromFunction","createMatrixFromRows","_createArray","checkVectorTypeAndReturnLength","rowLength","vec","createMatrixFromColumns","colLength","createSplitUnit","splitUnit","createUnaryMinus","createUnaryPlus","createAbs","createApply","_apply","createAddScalar","fixPrefix","createCbrt","unaryMinus","_cbrtComplex","third","_result","allRoots","arg3","principal","all","createMatAlgo11xS0s","asize","adt","dt","cf","cvalues","cptr","createMatAlgo12xSfs","cdata","createMatAlgo14xDs","adata","_iterate","level","av","bv","cv","createCeilNumber","createCeil","matAlgo11xS0s","matAlgo12xSfs","matAlgo14xDs","ceilNumber","createCube","createExp","createExpm1","_Complex","createFixNumber","createFix","fixNumber","bn","createFloorNumber","createFloor","floorNumber","createMatAlgo01xDSid","denseMatrix","sparseMatrix","bvalues","bindex","bptr","bsize","bdt","createMatAlgo04xSidSid","xa","xb","wa","wb","createMatAlgo10xSids","createMatAlgo13xDD","bdata","csize","createBroadcast","sizeA","_padLeft","sizeB","sizeMax","_dim","_checkRules","AA","BB","_dim2","_stretch","shape","filler","arrayToStretch","sizeToStretch","dimToStretch","createMatrixAlgorithmSuite","matAlgo13xDD","broadcast","matrixSignatures","elop","SD","DS","SS","scalar","Ds","Ss","sS","isArgumentsError","gcdTypes","gcdManyTypesSignature","is1d","element","createGcd","matAlgo01xDSid","matAlgo04xSidSid","matAlgo10xSids","matrixAlgorithmSuite","createMatAlgo02xDS0","cij","createMatAlgo06xS0S0","createLcm","matAlgo02xDS0","matAlgo06xS0S0","lcmTypes","lcmManySignature","lcm","createLog10","createLog2","_log2Complex","newX","createMatAlgo03xDSf","createMatAlgo05xSfSf","wai","wbi","vc","createMod","matAlgo03xDSf","matAlgo05xSfSf","createMultiplyScalar","multiply","createMultiply","addScalar","multiplyScalar","_validateMatrixDimensions","size1","size2","_multiplyVectorMatrix","alength","bcolumns","af","mf","_multiplyVectorDenseMatrix","_multiplyMatrixVector","arows","acolumns","brows","ib","vbi","ka0","ka1","ka","ia","ic","_multiplyMatrixMatrix","jb","kb0","kb1","kb","vbij","p0","selfMM","xsize","ysize","_multiplyVectorVector","rest","createNthRoot","_BigNumber","complexErr","_bigNthRoot","selfDn","selfSn","selfDS","Big","createSign","complex","_Fraction","_isDerived","units","createSqrt","_sqrtNumber","createSquare","createSubtract","createXgcd","createInvmod","xgcd","equal","smaller","invmod","createMatAlgo09xS0Sf","vb","createDotMultiply","matAlgo09xS0Sf","bitAndBigNumber","bitwise","bitNotBigNumber","prevPrec","bitOrBigNumber","negOne","func","xBits","yBits","minBits","maxBits","minSign","xSign","ySign","decCoefficientToBinaryString","shortLen","longLen","expFuncVal","outVal","twoPower","two","bitXor","leftShiftBigNumber","rightArithShiftBigNumber","createBitAnd","createBitNot","createBitOr","createMatAlgo07xSSf","_scatter","va","createBitXor","matAlgo07xSSf","createArg","createConj","conjugate","createIm","createRe","createNot","createOr","createXor","createConcat","prevDim","asMatrix","matrices","_concat","concatDim","createColumn","Index","_column","column","rowRange","createCross","_cross","highestDimension","xSize","ySize","createDiag","_diag","l","_createDiagonalMatrix","dm","vector","_getDiagonal","applyCallback","mappingFnName","args3","signature3","tryWithArgs","args2","args1","_err$data","argsDesc","createFilter","_filterCallback","createFlatten","createForEach","_forEach","createGetMatrixDataType","createIdentity","_identity","cols","_identityVector","minimum","createKron","_kron","createDiff","_diff","_recursive","selfAn","selfMn","_ElementDiff","obj1","obj2","obj1IsArray","obj2IsArray","arr1","_ArrayDiff","createOnes","_ones","hasBigNumbers","_normalize","noBignumber","noFraction","noMatrix","createRange","bignumber","smallerEq","larger","largerEq","_strRange","_out","_range","includeEnd","_parse","ongoing","createReshape","createResize","defaultChar","_resizeString","createRotate","rotationMatrix","theta","_validateSize","expectedSize","actualSize","createRotationMatrix","norm","_rotationMatrix2x2","matrixV","_validateVector","_rotationMatrix3x3","storageType","minusOne","cosTheta","sinTheta","_convertToFormat","_mul","normV","vz","oneMinusC","createRow","_row","columnRange","createSize","createSqueeze","createSubset","_getObjectProperty","_getSubstring","_setSubstring","_setObjectProperty","strLen","substr","chars","updated","createTranspose","transposeMatrix","transposedRow","transposed","_denseTranspose","_sparseTranspose","createCtranspose","transpose","conj","createZeros","_zeros","createFft","divideScalar","dotDivide","_ndFft","_fft","_1dFft","_transpose","chirp","N2","xp","ichirp","fftXp","fftIchirp","fftProduct","ifftProduct","_czt","createIfft","fft","acc","ownKeys","enumerableOnly","getOwnPropertySymbols","symbols","sym","getOwnPropertyDescriptor","enumerable","createSolveODE","_rk","butcherTableau","tspan","y0","isNumOrBig","t0","isForwards","firstStep","maxStep","minStep","timeVars","tol","minDelta","maxDelta","maxIter","bp","deltaB","iter","_createOngoing","trimStep","outOfBounds","_createTrimStep","TE","X","delta","_rk23","_rk45","_solveODE","opt","methods","RK23","RK45","toUpperCase","methodOptions","getOwnPropertyDescriptors","defineProperties","_objectSpread","methodsWithQuotes","availableMethodsString","_matrixSolveODE","T","sol","Y","createErf","MAX_NUM","THRESH","ysq","xnum","xden","Q","erf1","erfc2","SQRPI","erfc3","createMode","_mode","mode","improveErrorMessage","fnName","details","createProd","numeric","_prod","createFormat","createBin","createOct","createHex","createPrint","_print","template","original","createTo","createIsPrime","modPow","modulus","accumulator","bases","adn","_x","createNumeric","_number","validInputTypes","validOutputTypes","outputType","inputType","createDivideScalar","divideInto","createPow","identity","_pow","_powArray","_powMatrix","yFrac","yNum","ex","error","NO_INT","createRound","_n","createLog","logNumber","createLog1p","_log1pComplex","xRe1p","createNthRoots","_calculateExactResult","_nthComplexRoots","aIsNumeric","roots","halfPiFactor","createDotPow","powScalarSignatures","powScalar","createDotDivide","createSolveValidation","mSize","bSize","createLsolve","solveValidation","bj","vjj","jValues","jIndices","firstIndex","lastIndex","xj","_sparseForwardSubstitution","_denseForwardSubstitution","mdata","createUsolve","_lastIndex","_sparseBackwardSubstitution","_denseBackwardSubstitution","createLsolveAll","b_","L","iValues","iIndices","Mii","bNew","_j3","_lastIndex2","_J2","_j2","_J","createUsolveAll","createMatAlgo08xS0Sid","createUseMatrixForArrayScalar","selfDB","selfnD","selfBD","createLeftShift","matAlgo08xS0Sid","useMatrixForArrayScalar","createRightArithShift","createRightLogShift","createAnd","not","createCompare","createCompareNumber","createCompareNatural","compareBooleans","_compareNatural","typeX","typeY","matTypes","compareMatricesAndArrays","compareComplexNumbers","compareArrays","formatUnits","compareNatural","keysX","keysY","compareObjects","createCompareText","createEqual","createEqualNumber","createEqualText","createSmaller","createSmallerNumber","createSmallerEq","createSmallerEqNumber","createLarger","createLargerNumber","createLargerEq","createLargerEqNumber","createDeepEqual","_deepEqual","createUnequal","createUnequalNumber","createPartitionSelect","asc","desc","_partitionSelect","quickSelect","pivot","createSort","compareAsc","compareDesc","_arrayIsVector","_matrixIsVector","_comparator","order","createMax","_max","_largest","createMin","_min","_smallest","createImmutableDenseMatrixClass","ImmutableDenseMatrix","isImmutableDenseMatrix","createIndexClass","ranges","_dimensions","_isScalar","_createImmutableMatrix","isObjectProperty","getObjectProperty","strings","dimensions","createFibonacciHeapClass","oneOverLogPhi","FibonacciHeap","_minimum","_cut","parent","left","right","degree","_cascadingCut","isFibonacciHeap","insert","isEmpty","extractMinimum","numberOfChildren","tempRight","numRoots","_linkNodes","_findMinimumNode","remove","_decreaseKey","createSpaClass","Spa","_heap","isSpa","accumulate","heap","nodes","swap","nodei","nodej","createBigNumberE","createBigNumberPhi","createBigNumberPi","createBigNumberTau","createUnitClass","fix","skipAutomaticSimplification","BASE_DIMENSIONS","skipWhitespace","isDigit","revert","parseNumber","isDigitDot","tentativeNumber","tentativeIndex","parseUnit","unitName","isValidAlpha","firstC","parseCharacter","toFind","powerMultiplierCurrent","expectingUnit","powerMultiplierStack","powerMultiplierStackProduct","uStr","oldC","_findUnit","power","baseDim","UNIT_SYSTEMS","auto","allowNoUnits","_getNumberConverter","unitValue","unitPrefixValue","unitPower","_denormalize","prefixValue","UNITS","prefixes","_unit","prefixLen","prefixName","_prefix","getNumericIfUnitless","BASE_UNITS","NONE","isValuelessUnit","_other","inverted","valThis","valOther","_numberConverter","nominalOffset","unitOffset","W","thisUnitValue","thisNominalOffset","thisUnitOffset","otherUnitValue","otherNominalOffset","otherUnitOffset","toNumeric","simplify","matchingBase","matchingUnit","proposedUnitList","currentUnitSystem","missingBaseDim","toSI","si","strNum","strDen","nNum","nDen","simp","isImaginary","VAR","VA","_bestPrefix","unitStr","absValue","absUnitValue","bestPrefix","bestDiff","scientific","xNumeric","xRounded","testSum","PREFIXES","SHORT","da","G","Z","LONG","deca","hecto","kilo","mega","giga","tera","peta","exa","zetta","yotta","deci","centi","milli","micro","nano","pico","femto","atto","zepto","yocto","SQUARED","CUBIC","BINARY_SHORT_SI","BINARY_SHORT_IEC","Ki","Mi","Gi","Ti","Pi","Ei","Zi","Yi","BINARY_LONG_SI","BINARY_LONG_IEC","kibi","mebi","gibi","tebi","pebi","exi","zebi","yobi","BTU","MM","SHORTLONG","BINARY_SHORT","BINARY_LONG","MASS","LENGTH","TIME","CURRENT","TEMPERATURE","LUMINOUS_INTENSITY","AMOUNT_OF_SUBSTANCE","FORCE","SURFACE","VOLUME","ENERGY","POWER","PRESSURE","ELECTRIC_CHARGE","ELECTRIC_CAPACITANCE","ELECTRIC_POTENTIAL","ELECTRIC_RESISTANCE","ELECTRIC_INDUCTANCE","ELECTRIC_CONDUCTANCE","MAGNETIC_FLUX","MAGNETIC_FLUX_DENSITY","FREQUENCY","ANGLE","BIT","UNIT_NONE","meter","inch","foot","yard","mile","link","rod","chain","angstrom","in","ft","mi","li","ch","mil","m2","sqin","sqft","sqyd","sqmi","sqrd","sqch","sqmil","acre","hectare","m3","litre","cuin","cuft","cuyd","teaspoon","tablespoon","drop","gtt","minim","fluiddram","fluidounce","gill","cc","cup","pint","quart","gallon","beerbarrel","oilbarrel","hogshead","fldr","floz","gi","cp","pt","qt","gal","bbl","obl","g","gram","ton","tonne","grain","dram","ounce","poundmass","hundredweight","stick","stone","gr","dr","oz","lbm","cwt","second","sec","minute","hour","day","week","month","year","decade","century","millennium","hertz","reciprocal","Hz","rad","radian","deg","grad","gradian","cycle","arcsec","arcmin","ampere","K","degC","degF","degR","kelvin","celsius","fahrenheit","rankine","mol","mole","cd","candela","newton","dyn","dyne","lbf","poundforce","kip","kilogramforce","joule","erg","Wh","eV","electronvolt","watt","hp","Pa","psi","atm","bar","torr","mmHg","mmH2O","cmH2O","coulomb","farad","volt","V","ohm","henry","H","siemens","S","weber","Wb","tesla","bits","bytes","ALIASES","meters","inches","feet","yards","miles","links","rods","chains","angstroms","litres","liter","liters","teaspoons","tablespoons","minims","fluiddrams","fluidounces","gills","cups","pints","quarts","gallons","beerbarrels","oilbarrels","hogsheads","gtts","grams","tons","tonnes","grains","drams","ounces","poundmasses","hundredweights","sticks","lb","lbs","kips","kgf","acres","hectares","sqfeet","sqyard","sqmile","sqmiles","mmhg","mmh2o","cmh2o","seconds","secs","minutes","mins","hours","hr","hrs","days","weeks","months","years","decades","centuries","millennia","radians","degrees","gradians","cycles","arcsecond","arcseconds","arcminute","arcminutes","BTUs","watts","joules","amperes","amps","amp","coulombs","volts","ohms","farads","webers","teslas","electronvolts","moles","bit","byte","calculateAngleValues","cgs","us","setUnitSystem","getUnitSystem","typeConverters","_name2","_unit2","alias","_key3","createUnit","override","_key4","deleteUnit","aliases","lastUnit","_key5","createUnitSingle","assertUnitNameIsValid","definition","baseName","defUnit","newUnit","anyMatch","_newBaseUnit","newBaseUnit","_i6","_i8","aliasName","_alias","_key6","createUnitFunction","createSparse","createCreateUnit","def","createAcos","createAcosh","createAcot","acot","createAcoth","acoth","createAcsc","acsc","createAcsch","acsch","createAsec","asec","createAsech","asech","createAsin","createAsinh","createAtan","createAtan2","createAtanh","createTrigUnit","createCos","trigUnit","createCosh","createCot","cot","createCoth","coth","createCsc","csc","createCsch","csch","createSec","createSech","sech","createSin","createSinh","createTan","createTanh","createSetCartesian","a1","a2","b1","b2","createSetDifference","inb2","createSetDistinct","createSetIntersect","createSetIsSubset","createSetMultiplicity","createSetPowerset","_subset","_sort","bitarray","createSetSize","unique","createSetSymDifference","setDifference","createSetUnion","setIntersect","setSymDifference","createAdd","createHypot","_hypot","largest","createNorm","ctranspose","eigs","_norm","_vectorNorm","pinf","_vectorNormPlusInfinity","NEGATIVE_INFINITY","ninf","_vectorNormMinusInfinity","_matrixNorm","maxc","cj","_matrixNormOne","maxr","ri","_matrixNormInfinity","fro","_matrixNormFrobenius","sizeX","tx","squaredX","eigenVals","rho","_matrixNormTwo","createDot","_validateDim","aIsColumn","bIsColumn","_c","_c2","_c3","xindex","xvalues","yindex","yvalues","xLen","yLen","createTrace","_denseTrace","createIndex","keywords","createNode","mathWithTransform","evaluate","compile","expr","_compile","symbol","_validateScope","math","argNames","_ifNode","traverse","_traverse","path","transform","_transform","cloneDeep","customString","_getCustomString","_toString","toHTML","toTex","_toTex","handler","getIdentifier","getContent","errorTransform","accessFactory","createAccessorNode","Node","access","needParenthesis","AccessorNode","super","evalObject","evalIndex","context","createArrayNode","ArrayNode","items","evalItems","evalItem","itemsToTex","nested","mixedItems","itemsFormRow","itemSep","itemsTex","AssignmentNode","FunctionAssignmentNode","ConditionalNode","latexLeftParens","latexRightParens","latexParens","associativity","associativeWith","RelationalNode","RangeNode","unwrapParen","_node","parenthesis","content","getPrecedence","implicit","precedence","leftArg","getAssociativity","isAssociativeWith","nodeA","nodeB","identifierA","identifierB","createAssignmentNode","assignFactory","exprPrecedence","evalValue","childObject","evalParentObject","parentProp","evalParentIndex","parentIndex","createBlockNode","BlockNode","blocks","block","visible","evalBlocks","results","createConditionalNode","condition","trueExpr","falseExpr","evalCondition","evalTrueExpr","evalFalseExpr","testCondition","conditionPrecedence","truePrecedence","falsePrecedence","latexSymbols","Alpha","alpha","Beta","beta","Gamma","gamma","Delta","Epsilon","varepsilon","Zeta","zeta","Eta","eta","Theta","vartheta","Iota","iota","Kappa","kappa","varkappa","Lambda","lambda","Mu","mu","Nu","nu","Xi","Omicron","omicron","varpi","Rho","varrho","Sigma","sigma","varsigma","Tau","Upsilon","upsilon","Phi","varphi","Chi","chi","Psi","Omega","omega","true","false","Inf","infinity","oo","lim","latexOperators","factorial","dotPow","unaryPlus","bitNot","dotMultiply","leftShift","rightArithShift","rightLogShift","unequal","bitAnd","bitOr","and","xor","or","latexFunctions","cube","nthRoot","nthRoots","square","bellNumbers","catalan","stirlingS2","cross","det","expm","pinv","sqrtm","trace","combinations","combinationsWithRep","lgamma","erf","variance","sparse","latexUnits","escapeLatex","toSymbol","createConstantNode","ConstantNode","toLatex","createFunctionAssignmentNode","paramNames","childArgNames","evalExpr","childArgs","createIndexNode","IndexNode","dotNotation","evalDimensions","_evalDimension","evalDimension","createObjectNode","ObjectNode","evalEntries","stringifiedKey","parsedKey","createOperatorNode","startsWithConstant","curNode","calculateNecessaryParentheses","latex","operandPrecedence","operandIdentifier","rootIdentifier","lhsParens","rhsParens","lhsPrecedence","assocWithLhs","_rootIdentifier","lhsIdentifier","rhsIdentifier","rhsPrecedence","assocWithRhs","argPrecedence","assocWithArg","argAssociativity","OperatorNode","isPercentage","evalArgs","evalArg0","_evalArg","evalArg1","evalArg","isUnary","parens","assoc","operand","opIsNamed","lhs","rhs","stringifiedArgs","lhsTex","rhsTex","texifiedArgs","createParenthesisNode","ParenthesisNode","createRangeNode","startPrecedence","stepPrecedence","endPrecedence","needsEnd","evalStart","evalEnd","evalStep","createRelationalNode","operatorMap","conditionals","compiled","evalLhs","evalRhs","condFn","paramStrings","paramPrecedence","createSymbolNode","SymbolNode","onUndefinedSymbol","createSubScope","parentScope","createFunctionNode","strin","expandTemplate","regex","inputPos","exec","ReferenceError","FunctionNode","_rawArgs2","getSafeMethod","rawArgs","fnExpr","evalFn","_rawArgs3","_rawArgs","isRaw","resolveFn","onUndefinedFunction","customTex","latexConverter","customToTex","createParse","expression","parseStart","expressions","parseMultiple","extraNodes","TOKENTYPE","NULL","DELIMITER","NUMBER","SYMBOL","UNKNOWN","DELIMITERS","NAMED_DELIMITERS","CONSTANTS","NUMERIC_CONSTANTS","currentString","state","currentCharacter","prevCharacter","nextCharacter","getToken","tokenType","token","comment","isWhitespace","nestingLevel","c2","c3","isHexDigit","isDecimalMark","createSyntaxError","isAlpha","getTokenSkipNewline","openParams","closeParams","conditionalLevel","parseAssignment","parseBlock","valid","parseLogicalXor","parseLogicalOr","parseConditional","parseLogicalAnd","parseBitwiseOr","parseBitwiseXor","parseBitwiseAnd","parseRelational","parseShift","operators","cond","parseConversion","parseRange","parseAddSubtract","parseMultiplyDivide","rightNode","parseImplicitMultiplication","parseRule2","parsePercentage","tokenStates","parseUnary","CustomNode","parseAccessors","parseDoubleQuotesStringToken","parseSingleQuotesStringToken","parseRow","numberStr","parseEnd","parseParentheses","parseObject","parseMatrix","parseSingleQuotesString","parseDoubleQuotesString","parseSymbol","parseCustomNodes","parseLeftHandOperators","parsePow","char","cPrev","cNext","isValidLatinOrGreek","isValidMathSymbol","high","low","createCompile","createEvaluate","createParserClass","Parser","writable","isParser","getAll","toObject","getAllAsMap","createParser","createLup","_denseLUP","_sparseLUP","U","ldata","lsize","udata","usize","pabsv","absv","vij","lvalues","lindex","lptr","uvalues","uindex","uptr","pvCo","pvOc","spa","vkj","vik","createQr","_denseQR","_sparseQR","R","_denseQRimpl","Qdata","Rdata","sgn","conjSgn","alphaSquared","u1","csTdfs","head","post","csFlip","createCsAmd","lemax","dense","cm","at","tindex","tptr","_createTargetMatrix","nz","csFkeep","k2","pj","nvi","pk","eln","pn","cnz","nv","elen","hhead","_wclear","_initializeQuotientGraph","nel","_initializeDegreeLists","mindeg","elenk","nvk","dk","pk1","pk2","wnvi","dext","p3","p4","nvj","jlast","csLeaf","maxfirst","prevleaf","ancestor","sparent","jleaf","jprev","createCsCounts","ata","colcount","createCsSqr","csAmd","csCounts","qr","csPermute","inext","csEtree","csPost","leftmost","tail","nque","lnz","pa","_vcount","unz","csMarked","csMark","csUnflip","csDfs","jnew","createCsSpsolve","lo","gvalues","gindex","gptr","gsize","csReach","createCsLu","csSpsolve","ipiv","xabs","createSlu","csSqr","csLu","threshold","csIpvec","createLusolve","lup","slu","usolve","lsolve","_lusolve","_toMatrix","createPolynomialRoot","constant","restCoeffs","coeffs","denom","discriminant","_denom","D0_1","D0_2","D1_1","D1_2","Ccubed","Delta0","Delta1","discriminant1","discriminant2","createHelpClass","Help","doc","description","examples","mayThrow","seealso","createChainClass","Chain","createLazyProxy","resolver","valueResolver","_uninitialized","chainify","configurable","sigObject","createProxy","excludedNames","docs","classes","eDocs","piDocs","embeddedDocs","LOG2E","LOG10E","SQRT1_2","SQRT2","version","speedOfLight","gravitationConstant","planckConstant","reducedPlanckConstant","magneticConstant","electricConstant","vacuumImpedance","elementaryCharge","bohrMagneton","conductanceQuantum","inverseConductanceQuantum","magneticFluxQuantum","nuclearMagneton","klitzing","bohrRadius","classicalElectronRadius","electronMass","fermiCoupling","fineStructure","hartreeEnergy","protonMass","deuteronMass","neutronMass","quantumOfCirculation","rydberg","thomsonCrossSection","weakMixingAngle","efimovFactor","atomicMass","avogadro","boltzmann","faraday","firstRadiation","loschmidt","gasConstant","molarPlanckConstant","molarVolume","sackurTetrode","secondRadiation","stefanBoltzmann","wienDisplacement","molarMass","molarMassC12","gravity","planckLength","planckMass","planckTime","planckCharge","planckTemperature","derivative","lsolveAll","lusolve","leafCount","polynomialRoot","simplifyConstant","simplifyCore","symbolicEqual","rationalize","usolveAll","composition","import","help","distance","intersect","diag","getMatrixDataType","kron","matrixFromFunction","matrixFromRows","matrixFromColumns","ones","partitionSelect","rotate","ifft","sylvester","schur","lyap","solveODE","kldivergence","multinomial","permutations","pickRandom","randomInt","deepEqual","equalText","setCartesian","setDistinct","setIsSubset","setMultiplicity","setPowerset","setSize","setUnion","zpk2tf","freqz","cumsum","mad","mean","median","quantileSeq","std","bin","oct","hex","hasNumericValue","isPrime","print","createHelp","searchName","searchText","createChain","createDet","rowIndices","k_","piv","piv_","i_","_det","createInv","_inv","ABig","rBig","Ac","Bc","Ar","Br","createPinv","_isZeros","_pinv","rref","lead","_isZero","_rref","_rankFact","Cpinv","Fpinv","createComplexEigs","eigenvalues2x2","trA","detA","jordanBase2x2","l1","l2","prec","big","cplx","na","nb","nc","nd","inflateMatrix","el","inverseIterate","orthog","largeNum","randomOrthogonalVector","orthogonalComplement","normalize","findVectors","Rdiag","realzero","realone","radixSq","colNorm","rowNorm","rowDivRadix","rowMulRadix","balance","maxIndex","tmp1","tmp2","tmp3","reduceToHessenberg","vectors","lambdas","Sdiag","Qtotal","Qpartial","lastConvergenceBefore","ll","blockDiag","iterateUntilTriangular","Cinv","uniqueValues","multiplicities","failedLambdas","solutions","approxVec","correction","findEigenvectors","createRealSymmetric","getTheta","aii","ajj","aij","getThetaBig","Sij1","Sij","Ski","createArray","Skj","Sij1Big","x1Big","Hij","s2","Aki","Akj","csHij","Aii","Ajj","_k3","_k4","getAij","Mij","maxMij","maxIJ","getAijBig","sorting","minID","_k5","e0","Vab","diagBig","createEigs","doRealSymetric","doComplexEigs","computeValuesAndVectors","isReal","coerceReal","isSymmetric","_type","coerceTypes","hasNumber","hasBig","hasComplex","console","warn","createExpm","infNorm","rowSum","infinityNorm","maxSearchSize","errorEstimate","findParams","Apos","factor","AposToI","alternate","qfac","twoqfac","twoqp1fac","createSqrtm","_tolerance","_denmanBeavers","iterations","Yk","createSylvester","_sylvester","sA","sB","hc","RHS","gkk","gmk","gkm","gmm","LHS","yAux","_RHS","_gkk","_LHS","createSchur","_schur","A0","QR","createLyap","createDivide","createDistance","_2d","xCoeff","yCoeff","_distancePointLine2D","_objectToArray","lineTwoPtY","lineOnePtY","lineOnePtX","lineTwoPtX","pointX","pointY","_3d","_parametricLine","_distancePointLine3D","_containsOnlyNumbers","_euclideanDistance","xCoeffLine","yCoeffLine","pointZ","x0","z0","pointOneX","pointOneY","pointTwoX","pointTwoY","pointOneZ","pointTwoZ","_isNumber","aI","_pairwise","pointA","pointB","_distancePairwise","den","vectorSize","createIntersect","_AAA","_AAAA","plane","_coerceArr","_4d","y1","z1","y2","z2","x1x","x2x","y1y","y2y","z1z","z2z","py","pz","_intersectLinePlane","p1a","p1b","p2a","p2b","o1","o2","d20o11","d21o10","d20o21","d21o20","_intersect2d","x3","y3","z3","x4","y4","z4","d1343","_intersect3dHelper","d4321","d1321","d4343","d2121","ta","tb","pax","pay","paz","pbx","pby","pbz","_intersect3d","add1","add2","add3","createSum","_sum","createCumSum","_cumsum","_ncumSumDim","_cumsummap","sums","_cumsumDimensional","initialValue","createMean","_mean","createMedian","_median","mid","middle2","middle","createMad","_mad","med","DEFAULT_NORMALIZATION","createVariance","_var","_varDim","normalization","createQuantileSeq","_quantileSeq","prob","sorted","_fracPart","_left","_right","_integerPart","fracPart","integerPartNumber","probOrN","probArr","dataArr","nPlusOne","intN","_nPlusOne","probOrNArr","currProb","createStd","_std","createCombinations","isPositiveInteger","createCombinationsWithRep","nMinusOne","createGamma","gammaComplex","_t","gammaPval","twoPiSqrt","tpow","expt","bigFactorial","createLgamma","SMALL_RE","lgammaComplex","lgammaStirling","lgammaRecurrence","leftPart","rz","rzz","rightPart","signflips","sb","shiftprod","nsb","createFactorial","createKldivergence","_kldiv","plength","qlength","qnorm","pnorm","createMultinomial","ai","createPermutations","singletonRandom","seedrandom","now","seed","createPickRandom","rng","possibles","_pickRandom","weights","elementWise","single","totalWeights","pick","randKey","randomMatrix","_length","createRandom","_random","_randomMatrix","createRandomInt","_randomInt","_randomIntMatrix","createStirlingS2","smallCache","bigCache","make","nn","nk","createBellNumbers","createCatalan","createComposition","createLeafCount","countLeaves","isNumericNode","isConstantExpression","createUtil","defaultName","defaultContext","trivial","total","commutative","associative","paren","defaultF","hasProperty","nodeOrName","_properties","_properties2","isAssociative","allChildren","children","findChildren","createMakeNodeFunction","isCommutative","mergeContext","primary","secondary","merged","unflattenr","makeNode","curnode","unflattenl","realContext","positiveContext","createSimplify","_simplify","removeParens","SUPPORTED_CONSTANTS","_canonicalizeRule","ruleObject","newRule","lr","leftExpandsym","nonCommutative","_getExpandPlaceholderSymbol","expandsym","expanded","expandedNC1","expandedNC2","rules","assuming","repeat","imposeContext","addition","_lastsym","debug","consoleDebug","ruleSet","rule","ruleType","_buildRules","visited","laststr","rulestr","applyRule","newstr","mapRule","resNodes","newNode","mergedContext","newArgs","newContent","newItems","newObj","newIndex","newDims","newProps","repl","_ruleMatch","placeholders","mergeMatch","match1","match2","_exactMatch","combineChildMatches","list1","list2","i1","i2","isSplit","splits","rightArgs","getSplits","splitMatches","matchSet","childMatches","childMatch","leftMatch","rightMatch","sets","uniqueSets","mergeChildMatches","createSimplifyConstant","_ensureNode","foldFraction","_removeFractions","thing","_eval","fnname","ignore","_toNumber","_toNode","vn","unaryMinusNode","_exactFraction","exactFractions","fractionsLimit","foldOp","reduction","sofar","ignoreandcontinue","newtree","sz","section","_args","consts","vars","remainingDims","tryItems","fromItems","_foldAccessor","foldItems","foldProps","createSimplifyCore","node0","node1","nodeT","nodeF","isAlwaysBoolean","_simplifyCore","nodeToSimplify","simpChild","childCount","group","getOperator","seclast","a0","finish","createResolve","_resolve","within","variables","nextWithin","selfAM","createSymbolicEqual","_symbolicEqual","e1","e2","simplified","createDerivative","plainDerivative","variable","constNodes","constTag","_derivative","deriv","_derivTex","varName","isConst","funcArgsCheck","funcDerivative","negative","chainDerivative","constantTerms","nonConstantTerms","nonConstantNode","argOuter","argInner","_arg","_arg2","powMinusOne","createRationalize","_rationalize","detailed","setRules","oldRules","rulesFirst","rulesDistrDiv","rulesSucDiv","firstRules","distrDivRules","sucDivRules","firstRulesAgain","finalRules","rulesRationalize","polyRet","extended","oper","recPoly","retFunc","tp","polynomial","nVars","noExactFractions","withExactFractions","sBefore","expandPower","eDistrDiv","redoInic","retRationalize","polyToCanonical","indParent","internal","does","nEsqTopo","nDirTopo","maxExpo","varname","recurPol","noPai","noFil","fire","cte","valor","no","n3","createZpk2tf","_zpk2tf","_multiply","pole","createFreqz","_freqz","createBins","_w","sumNum","sumDen","bins","createReviver","createReplacer","createTrue","createFalse","createNull","createInfinity","recreateFactory","createNaN","createPi","_ref3","createTau","_ref4","createE","_ref5","createPhi","_ref6","createLN2","_ref7","createLN10","_ref8","createLOG2E","_ref9","createLOG10E","_ref10","createSQRT1_2","_ref11","createSQRT2","_ref12","createI","_ref13","createVersion","recreateOnConfigChange","createSpeedOfLight","unitFactory","createGravitationConstant","createPlanckConstant","createReducedPlanckConstant","createMagneticConstant","createElectricConstant","createVacuumImpedance","createCoulomb","createElementaryCharge","createBohrMagneton","createConductanceQuantum","createInverseConductanceQuantum","createMagneticFluxQuantum","createNuclearMagneton","createKlitzing","createBohrRadius","createClassicalElectronRadius","createElectronMass","createFermiCoupling","createFineStructure","numberFactory","createHartreeEnergy","createProtonMass","createDeuteronMass","createNeutronMass","createQuantumOfCirculation","createRydberg","createThomsonCrossSection","createWeakMixingAngle","createEfimovFactor","createAtomicMass","createAvogadro","createBoltzmann","createFaraday","createFirstRadiation","createLoschmidt","createGasConstant","createMolarPlanckConstant","createMolarVolume","createSackurTetrode","createSecondRadiation","createStefanBoltzmann","createWienDisplacement","createMolarMass","createMolarMassC12","createGravity","createPlanckLength","createPlanckMass","createPlanckTime","createPlanckCharge","createPlanckTemperature","createApplyTransform","isTransformFunction","createColumnTransform","compileInlineExpression","subScope","createFilterTransform","filterTransform","_filter","createForEachTransform","forEachTransform","createIndexTransform","isSet","createMapTransform","mapTransform","orig","lastDimToZeroBase","createMaxTransform","createMeanTransform","createMinTransform","createRangeTransform","createRowTransform","createSubsetTransform","createConcatTransform","createDiffTransform","createStdTransform","createSumTransform","createCumSumTransform","createVarianceTransform","_false","_Infinity","_NaN","_null","_true","replacer","reviver","parser"],"sourceRoot":""} \ No newline at end of file diff --git a/resources/221.bundle.d903e046b5d45ed1fd7a.js b/resources/221.bundle.d903e046b5d45ed1fd7a.js new file mode 100644 index 0000000..27af777 --- /dev/null +++ b/resources/221.bundle.d903e046b5d45ed1fd7a.js @@ -0,0 +1,2 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[221,579],{9943:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>K});const a=JSON.parse('{"u2":"@ohif/extension-cornerstone-dicom-seg"}').u2,o=`${a}.sopClassHandlerModule.dicom-seg`;var r=n(43001),i=n(71771),s=n(3743),l=n(91202),c=n(67540);const d=["1.2.840.10008.5.1.4.1.1.66.4"];let g={};function m(e,t,n){const a=e[0],{StudyInstanceUID:r,SeriesInstanceUID:m,SOPInstanceUID:S,SeriesDescription:u,SeriesNumber:p,SeriesDate:v,SOPClassUID:E,wadoRoot:h,wadoUri:I,wadoUriRoot:R}=a,y={Modality:"SEG",loading:!1,isReconstructable:!0,displaySetInstanceUID:i.utils.guid(),SeriesDescription:u,SeriesNumber:p,SeriesDate:v,SOPInstanceUID:S,SeriesInstanceUID:m,StudyInstanceUID:r,SOPClassHandlerId:o,SOPClassUID:E,referencedImages:null,referencedSeriesInstanceUID:null,referencedDisplaySetInstanceUID:null,isDerivedDisplaySet:!0,isLoaded:!1,isHydrated:!1,segments:{},sopClassUids:d,instance:a,instances:[a],wadoRoot:h,wadoUriRoot:R,wadoUri:I,isOverlayDisplaySet:!0},C=a.ReferencedSeriesSequence;if(!C)return void console.error("ReferencedSeriesSequence is missing for the SEG");const T=C[0]||C;return y.referencedImages=a.ReferencedSeriesSequence.ReferencedInstanceSequence,y.referencedSeriesInstanceUID=T.SeriesInstanceUID,y.getReferenceDisplaySet=()=>{const{displaySetService:e}=t.services,n=e.getDisplaySetsForSeries(y.referencedSeriesInstanceUID);if(!n||0===n.length)throw new Error("Referenced DisplaySet is missing for the SEG");const a=n[0];y.referencedDisplaySetInstanceUID=a.displaySetInstanceUID,y.referencedVolumeURI=a.displaySetInstanceUID;const o=`cornerstoneStreamingImageVolume:${y.referencedVolumeURI}`;return y.referencedVolumeId=o,a},y.load=async e=>{let{headers:a}=e;return await function(e,t,n,a){const{SOPInstanceUID:o}=e,{segmentationService:r}=t.services;if((e.loading||e.isLoaded)&&g[o]&&function(e,t){return t.getSegmentation(e.displaySetInstanceUID)}(e,r))return g[o];return e.loading=!0,g[o]=new Promise((async(o,i)=>{e.segments&&0!==Object.keys(e.segments).length||await async function(e){let{extensionManager:t,servicesManager:n,segDisplaySet:a,headers:o}=e;const r=t.getModuleEntry("@ohif/extension-cornerstone.utilityModule.common"),{segmentationService:i}=n.services,{dicomLoaderService:d}=r.exports,g=await d.findDicomDataPromise(a,null,o),m=s.cache.getVolume(a.referencedVolumeId);if(!m)throw new Error("Referenced Volume is missing for the SEG, and stack viewport SEG is not supported yet");const{imageIds:S}=m,u=.001,p=!0;s.eventTarget.addEventListener(l.Y.Events.SEGMENTATION_LOAD_PROGRESS,(e=>{const{percentComplete:t}=e.detail;i._broadcastEvent(i.EVENTS.SEGMENT_LOADING_COMPLETE,{percentComplete:t})}));const v=await l.adaptersSEG.Cornerstone3D.Segmentation.generateToolState(S,g,s.metaData,{skipOverlapping:p,tolerance:u,eventTarget:s.eventTarget,triggerEvent:s.triggerEvent});v.segMetadata.data.forEach(((e,t)=>{var n;t>0&&(e.rgba=(n=e.RecommendedDisplayCIELabValue,c.default.data.Colors.dicomlab2RGB(n).map((e=>Math.round(255*e)))))})),Object.assign(a,v)}({extensionManager:n,servicesManager:t,segDisplaySet:e,headers:a});const d=!0;r.createSegmentationForSEGDisplaySet(e,null,d).then((()=>{e.loading=!1,o()})).catch((t=>{e.loading=!1,i(t)}))})),g[o]}(y,t,n,a)},[y]}const S=function(e){let{servicesManager:t,extensionManager:n}=e;return[{name:"dicom-seg",sopClassUids:d,getDisplaySetsFromSeries:e=>m(e,t,n)}]},u={id:"@ohif/seg",name:"Segmentations",protocolMatchingRules:[],toolGroupIds:["default"],numberOfPriorsReferenced:0,defaultViewport:{viewportOptions:{viewportType:"stack",toolGroupId:"default",allowUnmatchedView:!0},displaySets:[{id:"segDisplaySetId",matchedDisplaySetsIndex:-1}]},displaySetSelectors:{segDisplaySetId:{seriesMatchingRules:[{attribute:"Modality",constraint:{equals:"SEG"}}]}},stages:[{name:"Segmentations",viewportStructure:{layoutType:"grid",properties:{rows:1,columns:1}},viewports:[{viewportOptions:{allowUnmatchedView:!0},displaySets:[{id:"segDisplaySetId"}]}]}]};const p=function(){return[{name:u.id,protocol:u}]};var v=n(62657),E=n(56342),h=n(3827),I=n.n(h),R=n(71783);const y=function(e,t,n){const a="enter-segment-label",o=t=>{let{action:o,value:r}=t;switch(o.id){case"save":n(r.label,o.id);break;case"cancel":n("",o.id)}e.dismiss({id:a})};e&&e.create({id:a,centralize:!0,isDraggable:!1,showOverlay:!0,content:R.Vq,contentProps:{title:"Segment",value:{label:t},noCloseButton:!0,onClose:()=>e.dismiss({id:a}),actions:[{id:"cancel",text:"Cancel",type:R.LZ.dt.secondary},{id:"save",text:"Confirm",type:R.LZ.dt.primary}],onSubmit:o,body:e=>{let{value:t,setValue:n}=e;return r.createElement(R.II,{label:"Enter the segment label",labelClassName:"text-white text-[14px] leading-[1.2]",autoFocus:!0,className:"border-primary-main bg-black",type:"text",value:t.label,onChange:e=>{e.persist(),n((t=>({...t,label:e.target.value})))},onKeyPress:e=>{"Enter"===e.key&&o({value:t,action:{id:"save"}})}})}}})};var C=n(22831);const T=function(e,t,n){const a="pick-color",o=t=>{let{action:o,value:r}=t;switch(o.id){case"save":n(r.rgbaColor,o.id);break;case"cancel":n("",o.id)}e.dismiss({id:a})};e&&e.create({id:a,centralize:!0,isDraggable:!1,showOverlay:!0,content:R.Vq,contentProps:{title:"Segment Color",value:{rgbaColor:t},noCloseButton:!0,onClose:()=>e.dismiss({id:a}),actions:[{id:"cancel",text:"Cancel",type:"primary"},{id:"save",text:"Save",type:"secondary"}],onSubmit:o,body:e=>{let{value:t,setValue:n}=e;return r.createElement(C.AI,{color:t.rgbaColor,onChange:e=>{n({rgbaColor:e.rgb})},presetColors:[],width:300})}}})};var b=n(69190);function w(e){let{servicesManager:t,commandsManager:n,extensionManager:a,configuration:o}=e;const{segmentationService:i,viewportGridService:s,uiDialogService:l}=t.services,{t:c}=(0,b.$G)("PanelSegmentation"),[d,g]=(0,r.useState)(null),[m,S]=(0,r.useState)(i.getConfiguration()),[u,p]=(0,r.useState)((()=>i.getSegmentations()));(0,r.useEffect)((()=>{const e=i.EVENTS.SEGMENTATION_ADDED,t=i.EVENTS.SEGMENTATION_UPDATED,n=i.EVENTS.SEGMENTATION_REMOVED,a=[];return[e,t,n].forEach((e=>{const{unsubscribe:t}=i.subscribe(e,(()=>{const e=i.getSegmentations();p(e),S(i.getConfiguration())}));a.push(t)})),()=>{a.forEach((e=>{e()}))}}),[]);const v=e=>i.getToolGroupIdsWithSegmentation(e),h=(0,r.useCallback)(((e,t,n)=>{i.setConfiguration({segmentationId:e,[t]:n})}),[i]);return r.createElement(r.Fragment,null,r.createElement("div",{className:"ohif-scrollbar flex min-h-0 flex-auto select-none flex-col justify-between overflow-auto"},r.createElement(R.cX,{title:c("Segmentations"),segmentations:u,disableEditing:o.disableEditing,activeSegmentationId:d||"",onSegmentationAdd:async()=>{n.runCommand("createEmptySegmentationForViewport")},onSegmentationClick:e=>{i.setActiveSegmentationForToolGroup(e)},onSegmentationDelete:e=>{i.remove(e)},onSegmentationDownload:e=>{n.runCommand("downloadSegmentation",{segmentationId:e})},onSegmentationDownloadRTSS:e=>{n.runCommand("downloadRTSS",{segmentationId:e})},storeSegmentation:async e=>{const o=a.getActiveDataSource(),r=await(0,E.createReportAsync)({servicesManager:t,getReport:()=>n.runCommand("storeSegmentation",{segmentationId:e,dataSource:o[0]}),reportType:"Segmentation"});r&&(i.remove(e),s.setDisplaySetsForViewport({viewportId:s.getActiveViewportId(),displaySetInstanceUIDs:r}))},onSegmentationEdit:e=>{const t=i.getSegmentation(e),{label:n}=t;y(l,n,((t,n)=>{""!==t&&i.addOrUpdateSegmentation({id:e,label:t},!1,!0)}))},onSegmentClick:(e,t)=>{i.setActiveSegment(e,t);v(e).forEach((n=>{i.setActiveSegmentationForToolGroup(e,n),i.jumpToSegmentCenter(e,t,n)}))},onSegmentEdit:(e,t)=>{const n=i.getSegmentation(e).segments[t],{label:a}=n;y(l,a,((n,a)=>{""!==n&&i.setSegmentLabel(e,t,n)}))},onSegmentAdd:e=>{i.addSegment(e)},onSegmentColorClick:(e,t)=>{const n=i.getSegmentation(e).segments[t],{color:a,opacity:o}=n,r={r:a[0],g:a[1],b:a[2],a:o/255};T(l,r,((n,a)=>{"cancel"!==a&&i.setSegmentRGBAColor(e,t,[n.r,n.g,n.b,255*n.a])}))},onSegmentDelete:(e,t)=>{i.removeSegment(e,t)},onToggleSegmentVisibility:(e,t)=>{const n=!i.getSegmentation(e).segments[t].isVisible;v(e).forEach((a=>{i.setSegmentVisibility(e,t,n,a)}))},onToggleSegmentLock:(e,t)=>{i.toggleSegmentLocked(e,t)},onToggleSegmentationVisibility:e=>{i.toggleSegmentationVisibility(e)},showDeleteSegment:!0,segmentationConfig:{initialConfig:m},setRenderOutline:e=>h(d,"renderOutline",e),setOutlineOpacityActive:e=>h(d,"outlineOpacity",e),setRenderFill:e=>h(d,"renderFill",e),setRenderInactiveSegmentations:e=>h(d,"renderInactiveSegmentations",e),setOutlineWidthActive:e=>h(d,"outlineWidthActive",e),setFillAlpha:e=>h(d,"fillAlpha",e),setFillAlphaInactive:e=>h(d,"fillAlphaInactive",e)})))}w.propTypes={commandsManager:I().shape({runCommand:I().func.isRequired}),servicesManager:I().shape({services:I().shape({segmentationService:I().shape({getSegmentation:I().func.isRequired,getSegmentations:I().func.isRequired,toggleSegmentationVisibility:I().func.isRequired,subscribe:I().func.isRequired,EVENTS:I().object.isRequired}).isRequired}).isRequired}).isRequired};var f=n(14957);const{segmentation:D}=f.utilities,O={CIRCULAR_BRUSH:"CircularBrush",SPHERE_BRUSH:"SphereBrush",CIRCULAR_ERASER:"CircularEraser",SPHERE_ERASER:"SphereEraser",CIRCLE_SHAPE:"CircleScissor",RECTANGLE_SHAPE:"RectangleScissor",SPHERE_SHAPE:"SphereScissor",THRESHOLD_CIRCULAR_BRUSH:"ThresholdCircularBrush",THRESHOLD_SPHERE_BRUSH:"ThresholdSphereBrush"},M={SET_TOOL_CONFIG:"SET_TOOL_CONFIG",SET_ACTIVE_TOOL:"SET_ACTIVE_TOOL"},U={Brush:{brushSize:15,mode:"CircularBrush"},Eraser:{brushSize:15,mode:"CircularEraser"},Shapes:{brushSize:15,mode:"CircleScissor"},ThresholdBrush:{brushSize:15,thresholdRange:[-500,500]},activeTool:null};function A(e,t){switch(t.type){case M.SET_TOOL_CONFIG:const{tool:n,config:a}=t.payload;return{...e,[n]:{...e[n],...a}};case M.SET_ACTIVE_TOOL:return{...e,activeTool:t.payload};default:return e}}function _(e){let t=[];switch(e){case"Brush":t=["CircularBrush","SphereBrush"];break;case"Eraser":t=["CircularEraser","SphereEraser"];break;case"ThresholdBrush":t=["ThresholdCircularBrush","ThresholdSphereBrush"]}return t}const V=function(e){let{servicesManager:t,extensionManager:n}=e;const{toolbarService:a,segmentationService:o,toolGroupService:i}=t.services,[s]=(0,R.O_)(),{viewports:l,activeViewportId:c}=s,[d,g]=(0,r.useState)(!1),[m,S]=(0,r.useReducer)(A,U),u=(0,r.useCallback)((()=>{if(!l?.size||void 0===c)return;const e=l.get(c);e&&S({type:M.SET_ACTIVE_TOOL,payload:i.getActiveToolForViewport(e.viewportId)})}),[c,l,i,S]),p=(0,r.useCallback)((e=>{a.recordInteraction({interactionType:"tool",commands:[{commandName:"setToolActive",commandOptions:{toolName:e}}]}),S({type:M.SET_ACTIVE_TOOL,payload:e})}),[a,S]);(0,r.useEffect)((()=>{const e=[o.EVENTS.SEGMENTATION_ADDED,o.EVENTS.SEGMENTATION_UPDATED,o.EVENTS.SEGMENTATION_REMOVED],t=[];return e.forEach((e=>{const{unsubscribe:n}=o.subscribe(e,(()=>{const e=o.getSegmentations(),t=e?.find((e=>e.isActive));g(t?.segmentCount>0)}));t.push(n)})),u(),()=>{t.forEach((e=>e()))}}),[c,l,o,u]),(0,r.useEffect)((()=>{const{unsubscribe:e}=a.subscribe(a.EVENTS.TOOL_BAR_STATE_MODIFIED,(()=>{u()}));return()=>{e()}}),[a,u]),(0,r.useEffect)((()=>{Object.values(O).includes(m.activeTool)&&(d||p("WindowLevel"))}),[d,m.activeTool,p]);const v=(0,r.useCallback)(((e,t)=>{i.getToolGroupIds()?.forEach((n=>{D.setBrushSizeForToolGroup(n,t,e)}))}),[i]),E=(0,r.useCallback)(((e,t)=>{const n=Number(e);_(t).forEach((e=>{v(e,n)})),S({type:M.SET_TOOL_CONFIG,payload:{tool:t,config:{brushSize:n}}})}),[i,S]),h=(0,r.useCallback)((e=>{if(e[0]===m.ThresholdBrush.thresholdRange[0]&&e[1]===m.ThresholdBrush.thresholdRange[1])return;_("ThresholdBrush").forEach((t=>{i.getToolGroupIds()?.forEach((n=>{i.getToolGroup(n).setToolConfiguration(t,{strategySpecificConfiguration:{THRESHOLD_INSIDE_CIRCLE:{threshold:e}}})}))})),S({type:M.SET_TOOL_CONFIG,payload:{tool:"ThresholdBrush",config:{thresholdRange:e}}})}),[i,S,m.ThresholdBrush.thresholdRange]);return r.createElement(R.bY,{title:"Segmentation Tools",items:[{name:"Brush",icon:"icon-tool-brush",disabled:!d,active:m.activeTool===O.CIRCULAR_BRUSH||m.activeTool===O.SPHERE_BRUSH,onClick:()=>p(O.CIRCULAR_BRUSH),options:[{name:"Radius (mm)",id:"brush-radius",type:"range",min:.5,max:99.5,value:m.Brush.brushSize,step:.5,onChange:e=>E(e,"Brush")},{name:"Mode",type:"radio",id:"brush-mode",value:m.Brush.mode,values:[{value:O.CIRCULAR_BRUSH,label:"Circle"},{value:O.SPHERE_BRUSH,label:"Sphere"}],onChange:e=>p(e)}]},{name:"Eraser",icon:"icon-tool-eraser",disabled:!d,active:m.activeTool===O.CIRCULAR_ERASER||m.activeTool===O.SPHERE_ERASER,onClick:()=>p(O.CIRCULAR_ERASER),options:[{name:"Radius (mm)",type:"range",id:"eraser-radius",min:.5,max:99.5,value:m.Eraser.brushSize,step:.5,onChange:e=>E(e,"Eraser")},{name:"Mode",type:"radio",id:"eraser-mode",value:m.Eraser.mode,values:[{value:O.CIRCULAR_ERASER,label:"Circle"},{value:O.SPHERE_ERASER,label:"Sphere"}],onChange:e=>p(e)}]},{name:"Shapes",icon:"icon-tool-shape",disabled:!d,active:m.activeTool===O.CIRCLE_SHAPE||m.activeTool===O.RECTANGLE_SHAPE||m.activeTool===O.SPHERE_SHAPE,onClick:()=>p(O.CIRCLE_SHAPE),options:[{name:"Mode",type:"radio",value:m.Shapes.mode,id:"shape-mode",values:[{value:O.CIRCLE_SHAPE,label:"Circle"},{value:O.RECTANGLE_SHAPE,label:"Rectangle"},{value:O.SPHERE_SHAPE,label:"Sphere"}],onChange:e=>p(e)}]},{name:"Threshold Tool",icon:"icon-tool-threshold",disabled:!d,active:m.activeTool===O.THRESHOLD_CIRCULAR_BRUSH||m.activeTool===O.THRESHOLD_SPHERE_BRUSH,onClick:()=>p(O.THRESHOLD_CIRCULAR_BRUSH),options:[{name:"Radius (mm)",id:"threshold-radius",type:"range",min:.5,max:99.5,value:m.ThresholdBrush.brushSize,step:.5,onChange:e=>E(e,"ThresholdBrush")},{name:"Mode",type:"radio",id:"threshold-mode",value:m.activeTool,values:[{value:O.THRESHOLD_CIRCULAR_BRUSH,label:"Circle"},{value:O.THRESHOLD_SPHERE_BRUSH,label:"Sphere"}],onChange:e=>p(e)},{type:"custom",id:"segmentation-threshold-range",children:()=>r.createElement("div",null,r.createElement("div",{className:"bg-secondary-light h-[1px]"}),r.createElement("div",{className:"mt-1 text-[13px] text-white"},"Threshold"),r.createElement(R.R0,{values:m.ThresholdBrush.thresholdRange,onChange:h,minValue:-1e3,maxValue:1e3,step:1,showLabel:!0,allowNumberEdit:!0,showAdjustmentArrows:!1}))}]}]})},L=e=>{let{commandsManager:t,servicesManager:n,extensionManager:a,configuration:o}=e;const{customizationService:i}=n.services;return[{name:"panelSegmentation",iconName:"tab-segmentation",iconLabel:"Segmentation",label:"Segmentation",component:e=>{const[o]=(0,v.M)(),s=i.get("segmentation.disableEditing");return r.createElement(w,{commandsManager:t,servicesManager:n,extensionManager:a,configuration:{...e,disableEditing:o.disableEditing||s?.value}})}},{name:"panelSegmentationWithTools",iconName:"tab-segmentation",iconLabel:"Segmentation",label:"Segmentation",component:e=>{const[o]=(0,v.M)();return r.createElement(r.Fragment,null,r.createElement(V,{commandsManager:t,servicesManager:n,extensionManager:a,configuration:{...e}}),r.createElement(w,{commandsManager:t,servicesManager:n,extensionManager:a,configuration:{...e}}))}}]};var H=n(49399),G=n(54131),F=n(96372);async function N(e){let{viewportId:t,loadFn:n,servicesManager:a,referencedDisplaySetInstanceUID:o}=e;const{cornerstoneViewportService:r,segmentationService:i,viewportGridService:l}=a.services,c=P({viewportId:t,viewportGridService:l}),d=c.viewportOptions.viewportId;o=o||c?.displaySetInstanceUIDs[0];const g=B({servicesManager:a,viewportId:t,referencedDisplaySetInstanceUID:o}),m=async()=>{const e=await n();i.hydrateSegmentation(e)},S=Array.from(s.cache._volumeCache.keys()).some((e=>e.includes(o)));return g.forEach((async e=>{e.viewportOptions={...e.viewportOptions,viewportType:"volume",needsRerendering:!0};const t=e.viewportId,n=r.getCornerstoneViewport(t),a=n.getCamera();if(S&&t===d)return void await m();const i=async e=>{const n=e.detail.volumeActors?.find((e=>e.uid.includes(o))),l=r.getCornerstoneViewport(t);l.setCamera(a),l.element.removeEventListener(s.Enums.Events.VOLUME_VIEWPORT_NEW_VOLUME,i),n&&t===d&&await m()};n.element.addEventListener(s.Enums.Events.VOLUME_VIEWPORT_NEW_VOLUME,i)})),l.setDisplaySetsForViewports(g),!0}const P=e=>{let{viewportId:t,viewportGridService:n}=e;const{viewports:a,activeViewportId:o}=n.getState(),r=t||o;return a.get(r)};function B(e){let{viewportId:t,servicesManager:n,referencedDisplaySetInstanceUID:a}=e;const{hangingProtocolService:o,displaySetService:r,segmentationService:i,viewportGridService:s}=n.services,{viewports:l}=s.getState(),c=P({viewportId:t,viewportGridService:s}).viewportOptions.viewportId,d=l.get(c).displaySetInstanceUIDs,g=a||d[0],m=r.getDisplaySetByUID(g).instances[0].FrameOfReferenceUID,S=o.getViewportsRequireUpdate(c,g);return l.forEach(((e,t)=>{if(c===t||S.find((e=>e.viewportId===t)))return;i.shouldRenderSegmentation(e.displaySetInstanceUIDs,m)&&S.push({viewportId:t,displaySetInstanceUIDs:e.displaySetInstanceUIDs,viewportOptions:{viewportType:"volume",needsRerendering:!0}})})),S}const{datasetToBlob:x}=c.default.data,{Cornerstone3D:{Segmentation:{generateLabelMaps2DFrom3D:k,generateSegmentation:q}}}=l.adaptersSEG,{Cornerstone3D:{RTSS:{generateRTSSFromSegmentations:z}}}=l.adaptersRT,{downloadDICOMData:j}=l.helpers,W=e=>{let{servicesManager:t,extensionManager:n}=e;const{uiNotificationService:a,segmentationService:o,uiDialogService:r,displaySetService:l,viewportGridService:d}=t.services,g={getUpdatedViewportsForSegmentation:B,createEmptySegmentationForViewport:async e=>{let{viewportId:n}=e;const r=P({viewportId:n,viewportGridService:d}),i=r.displaySetInstanceUIDs[0];l.getDisplaySetByUID(i).isReconstructable?N({viewportId:n,servicesManager:t,loadFn:async()=>{const e=o.getSegmentations(),t=await o.createSegmentationForDisplaySet(i,{label:`Segmentation ${e.length+1}`}),n=r.viewportOptions.toolGroupId;return await o.addSegmentationRepresentationToToolGroup(n,t),o.addSegment(t,{toolGroupId:n,segmentIndex:1,properties:{label:"Segment 1"}}),t}}):a.show({title:"Segmentation",message:"Segmentation is not supported for non-reconstructible displaysets yet",type:"error"})},loadSegmentationsForViewport:async e=>{let{segmentations:n,viewportId:a}=e;N({viewportId:a,servicesManager:t,loadFn:async()=>{const e=P({viewportId:a,viewportGridService:d}),t=e.displaySetInstanceUIDs[0],r=n[0],i=r.id,s=r.label,l=r.segments;if(delete r.segments,await o.createSegmentationForDisplaySet(t,{segmentationId:i,label:s}),r.scalarData){o.getLabelmapVolume(i).scalarData.set(r.scalarData)}o.addOrUpdateSegmentation(r);const c=e.viewportOptions.toolGroupId;return await o.addSegmentationRepresentationToToolGroup(c,i),l.forEach((e=>{null!==e&&o.addSegment(i,{segmentIndex:e.segmentIndex,toolGroupId:c,properties:{color:e.color,label:e.label,opacity:e.opacity,isLocked:e.isLocked,visibility:e.isVisible,active:r.activeSegmentIndex===e.segmentIndex}})})),r.centroidsIJK&&o.setCentroids(r.id,r.centroidsIJK),i}})},loadSegmentationDisplaySetsForViewport:async e=>{let{viewportId:n,displaySets:a}=e;const r=a[0];N({viewportId:n,servicesManager:t,referencedDisplaySetInstanceUID:r.referencedDisplaySetInstanceUID,loadFn:async()=>{const e=r,t="SEG"===e.Modality?"createSegmentationForSEGDisplaySet":"createSegmentationForRTDisplaySet",n=o[t].bind(o);return await n(e,null,!1)}})},generateSegmentation:e=>{let{segmentationId:t,options:n={}}=e;const a=f.segmentation.state.getSegmentation(t),{referencedVolumeId:r}=a.representationData.LABELMAP,i=s.cache.getVolume(t),l=s.cache.getVolume(r).getCornerstoneImages(),d=k(i);d.metadata=[];const g=o.getSegmentation(t);d.segmentsOnLabelmap.forEach((e=>{const t=g?.segments[e],{label:n,color:a}=t,o=c.default.data.Colors.rgb2DICOMLAB(a.slice(0,3).map((e=>e/255))).map((e=>Math.round(e))),r={SegmentNumber:e.toString(),SegmentLabel:n,SegmentAlgorithmType:"MANUAL",SegmentAlgorithmName:"OHIF Brush",RecommendedDisplayCIELabValue:o,SegmentedPropertyCategoryCodeSequence:{CodeValue:"T-D0050",CodingSchemeDesignator:"SRT",CodeMeaning:"Tissue"},SegmentedPropertyTypeCodeSequence:{CodeValue:"T-D0050",CodingSchemeDesignator:"SRT",CodeMeaning:"Tissue"}};d.metadata[e]=r}));return q(l,d,s.metaData,n)},downloadSegmentation:e=>{let{segmentationId:t}=e;const n=o.getSegmentation(t),a=g.generateSegmentation({segmentationId:t});j(a.dataset,`${n.label}`)},storeSegmentation:async e=>{let{segmentationId:t,dataSource:a}=e;const s=await(0,E.createReportDialogPrompt)(r,{extensionManager:n});if(1!==s.action&&s.value)return;const l=o.getSegmentation(t);if(!l)throw new Error("No segmentation found");const{label:c}=l,d=s.value||c||"Research Derived Series",m=g.generateSegmentation({segmentationId:t,options:{SeriesDescription:d}});if(!m||!m.dataset)throw new Error("Error during segmentation generation");const{dataset:S}=m;return await a.store.dicom(S),S.wadoRoot=a.getConfig().wadoRoot,i.DicomMetadataStore.addInstances([S],!0),S},downloadRTSS:e=>{let{segmentationId:t}=e;const n=o.getSegmentation(t),a={vtkImageMarchingSquares:H.ZP,vtkDataArray:G.ZP,vtkImageData:F.ZP},r=z(n,i.classes.MetadataProvider,i.DicomMetadataStore,s.cache,f.Enums,a);try{const e=x(r),t=URL.createObjectURL(e);window.location.assign(t)}catch(e){console.warn(e)}}},m={getUpdatedViewportsForSegmentation:{commandFn:g.getUpdatedViewportsForSegmentation},loadSegmentationDisplaySetsForViewport:{commandFn:g.loadSegmentationDisplaySetsForViewport},loadSegmentationsForViewport:{commandFn:g.loadSegmentationsForViewport},createEmptySegmentationForViewport:{commandFn:g.createEmptySegmentationForViewport},generateSegmentation:{commandFn:g.generateSegmentation},downloadSegmentation:{commandFn:g.downloadSegmentation},storeSegmentation:{commandFn:g.storeSegmentation},downloadRTSS:{commandFn:g.downloadRTSS}};return{actions:g,definitions:m}};function Z(){return Z=Object.assign?Object.assign.bind():function(e){for(var t=1;tn.e(451).then(n.bind(n,4451)))),J=e=>r.createElement(r.Suspense,{fallback:r.createElement("div",null,"Loading...")},r.createElement($,e)),K={id:a,preRegistration:function(e){let{configuration:t={}}=e;(0,f.addTool)(f.BrushTool)},getPanelModule:L,getCommandsModule:W,getViewportModule(e){let{servicesManager:t,extensionManager:n}=e;return[{name:"dicom-seg",component:e=>r.createElement(J,Z({servicesManager:t,extensionManager:n,commandsManager},e))}]},getSopClassHandlerModule:S,getHangingProtocolModule:p}},78753:()=>{}}]); +//# sourceMappingURL=221.bundle.d903e046b5d45ed1fd7a.js.map \ No newline at end of file diff --git a/resources/221.bundle.d903e046b5d45ed1fd7a.js.map b/resources/221.bundle.d903e046b5d45ed1fd7a.js.map new file mode 100644 index 0000000..0635a23 --- /dev/null +++ b/resources/221.bundle.d903e046b5d45ed1fd7a.js.map @@ -0,0 +1 @@ +{"version":3,"file":"221.bundle.d903e046b5d45ed1fd7a.js","mappings":"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","sources":["webpack:///../../../extensions/cornerstone-dicom-seg/src/id.js","webpack:///../../../extensions/cornerstone-dicom-seg/src/getSopClassHandlerModule.js","webpack:///../../../extensions/cornerstone-dicom-seg/src/utils/dicomlabToRGB.ts","webpack:///../../../extensions/cornerstone-dicom-seg/src/getHangingProtocolModule.ts","webpack:///../../../extensions/cornerstone-dicom-seg/src/panels/callInputDialog.tsx","webpack:///../../../extensions/cornerstone-dicom-seg/src/panels/colorPickerDialog.tsx","webpack:///../../../extensions/cornerstone-dicom-seg/src/panels/PanelSegmentation.tsx","webpack:///../../../extensions/cornerstone-dicom-seg/src/panels/SegmentationToolbox.tsx","webpack:///../../../extensions/cornerstone-dicom-seg/src/getPanelModule.tsx","webpack:///../../../extensions/cornerstone-dicom-seg/src/utils/hydrationUtils.ts","webpack:///../../../extensions/cornerstone-dicom-seg/src/commandsModule.ts","webpack:///../../../extensions/cornerstone-dicom-seg/src/index.tsx","webpack:///../../../extensions/cornerstone-dicom-seg/src/init.ts"],"sourcesContent":["import packageJson from '../package.json';\r\n\r\nconst id = packageJson.name;\r\nconst SOPClassHandlerName = 'dicom-seg';\r\nconst SOPClassHandlerId = `${id}.sopClassHandlerModule.${SOPClassHandlerName}`;\r\n\r\nexport { id, SOPClassHandlerId, SOPClassHandlerName };\r\n","import { utils } from '@ohif/core';\r\nimport { metaData, cache, triggerEvent, eventTarget } from '@cornerstonejs/core';\r\nimport { adaptersSEG, Enums } from '@cornerstonejs/adapters';\r\n\r\nimport { SOPClassHandlerId } from './id';\r\nimport { dicomlabToRGB } from './utils/dicomlabToRGB';\r\n\r\nconst sopClassUids = ['1.2.840.10008.5.1.4.1.1.66.4'];\r\n\r\nlet loadPromises = {};\r\n\r\nfunction _getDisplaySetsFromSeries(instances, servicesManager, extensionManager) {\r\n const instance = instances[0];\r\n\r\n const {\r\n StudyInstanceUID,\r\n SeriesInstanceUID,\r\n SOPInstanceUID,\r\n SeriesDescription,\r\n SeriesNumber,\r\n SeriesDate,\r\n SOPClassUID,\r\n wadoRoot,\r\n wadoUri,\r\n wadoUriRoot,\r\n } = instance;\r\n\r\n const displaySet = {\r\n Modality: 'SEG',\r\n loading: false,\r\n isReconstructable: true, // by default for now since it is a volumetric SEG currently\r\n displaySetInstanceUID: utils.guid(),\r\n SeriesDescription,\r\n SeriesNumber,\r\n SeriesDate,\r\n SOPInstanceUID,\r\n SeriesInstanceUID,\r\n StudyInstanceUID,\r\n SOPClassHandlerId,\r\n SOPClassUID,\r\n referencedImages: null,\r\n referencedSeriesInstanceUID: null,\r\n referencedDisplaySetInstanceUID: null,\r\n isDerivedDisplaySet: true,\r\n isLoaded: false,\r\n isHydrated: false,\r\n segments: {},\r\n sopClassUids,\r\n instance,\r\n instances: [instance],\r\n wadoRoot,\r\n wadoUriRoot,\r\n wadoUri,\r\n isOverlayDisplaySet: true,\r\n };\r\n\r\n const referencedSeriesSequence = instance.ReferencedSeriesSequence;\r\n\r\n if (!referencedSeriesSequence) {\r\n console.error('ReferencedSeriesSequence is missing for the SEG');\r\n return;\r\n }\r\n\r\n const referencedSeries = referencedSeriesSequence[0] || referencedSeriesSequence;\r\n\r\n displaySet.referencedImages = instance.ReferencedSeriesSequence.ReferencedInstanceSequence;\r\n displaySet.referencedSeriesInstanceUID = referencedSeries.SeriesInstanceUID;\r\n\r\n displaySet.getReferenceDisplaySet = () => {\r\n const { displaySetService } = servicesManager.services;\r\n const referencedDisplaySets = displaySetService.getDisplaySetsForSeries(\r\n displaySet.referencedSeriesInstanceUID\r\n );\r\n\r\n if (!referencedDisplaySets || referencedDisplaySets.length === 0) {\r\n throw new Error('Referenced DisplaySet is missing for the SEG');\r\n }\r\n\r\n const referencedDisplaySet = referencedDisplaySets[0];\r\n\r\n displaySet.referencedDisplaySetInstanceUID = referencedDisplaySet.displaySetInstanceUID;\r\n\r\n // Todo: this needs to be able to work with other reference volumes (other than streaming) such as nifti, etc.\r\n displaySet.referencedVolumeURI = referencedDisplaySet.displaySetInstanceUID;\r\n const referencedVolumeId = `cornerstoneStreamingImageVolume:${displaySet.referencedVolumeURI}`;\r\n displaySet.referencedVolumeId = referencedVolumeId;\r\n\r\n return referencedDisplaySet;\r\n };\r\n\r\n displaySet.load = async ({ headers }) =>\r\n await _load(displaySet, servicesManager, extensionManager, headers);\r\n\r\n return [displaySet];\r\n}\r\n\r\nfunction _load(segDisplaySet, servicesManager, extensionManager, headers) {\r\n const { SOPInstanceUID } = segDisplaySet;\r\n const { segmentationService } = servicesManager.services;\r\n\r\n if (\r\n (segDisplaySet.loading || segDisplaySet.isLoaded) &&\r\n loadPromises[SOPInstanceUID] &&\r\n _segmentationExists(segDisplaySet, segmentationService)\r\n ) {\r\n return loadPromises[SOPInstanceUID];\r\n }\r\n\r\n segDisplaySet.loading = true;\r\n\r\n // We don't want to fire multiple loads, so we'll wait for the first to finish\r\n // and also return the same promise to any other callers.\r\n loadPromises[SOPInstanceUID] = new Promise(async (resolve, reject) => {\r\n if (!segDisplaySet.segments || Object.keys(segDisplaySet.segments).length === 0) {\r\n await _loadSegments({\r\n extensionManager,\r\n servicesManager,\r\n segDisplaySet,\r\n headers,\r\n });\r\n }\r\n\r\n const suppressEvents = true;\r\n segmentationService\r\n .createSegmentationForSEGDisplaySet(segDisplaySet, null, suppressEvents)\r\n .then(() => {\r\n segDisplaySet.loading = false;\r\n resolve();\r\n })\r\n .catch(error => {\r\n segDisplaySet.loading = false;\r\n reject(error);\r\n });\r\n });\r\n\r\n return loadPromises[SOPInstanceUID];\r\n}\r\n\r\nasync function _loadSegments({ extensionManager, servicesManager, segDisplaySet, headers }) {\r\n const utilityModule = extensionManager.getModuleEntry(\r\n '@ohif/extension-cornerstone.utilityModule.common'\r\n );\r\n\r\n const { segmentationService } = servicesManager.services;\r\n\r\n const { dicomLoaderService } = utilityModule.exports;\r\n const arrayBuffer = await dicomLoaderService.findDicomDataPromise(segDisplaySet, null, headers);\r\n\r\n const cachedReferencedVolume = cache.getVolume(segDisplaySet.referencedVolumeId);\r\n\r\n if (!cachedReferencedVolume) {\r\n throw new Error(\r\n 'Referenced Volume is missing for the SEG, and stack viewport SEG is not supported yet'\r\n );\r\n }\r\n\r\n const { imageIds } = cachedReferencedVolume;\r\n\r\n // Todo: what should be defaults here\r\n const tolerance = 0.001;\r\n const skipOverlapping = true;\r\n\r\n eventTarget.addEventListener(Enums.Events.SEGMENTATION_LOAD_PROGRESS, evt => {\r\n const { percentComplete } = evt.detail;\r\n segmentationService._broadcastEvent(segmentationService.EVENTS.SEGMENT_LOADING_COMPLETE, {\r\n percentComplete,\r\n });\r\n });\r\n\r\n const results = await adaptersSEG.Cornerstone3D.Segmentation.generateToolState(\r\n imageIds,\r\n arrayBuffer,\r\n metaData,\r\n { skipOverlapping, tolerance, eventTarget, triggerEvent }\r\n );\r\n\r\n results.segMetadata.data.forEach((data, i) => {\r\n if (i > 0) {\r\n data.rgba = dicomlabToRGB(data.RecommendedDisplayCIELabValue);\r\n }\r\n });\r\n\r\n Object.assign(segDisplaySet, results);\r\n}\r\n\r\nfunction _segmentationExists(segDisplaySet, segmentationService) {\r\n // This should be abstracted with the CornerstoneCacheService\r\n return segmentationService.getSegmentation(segDisplaySet.displaySetInstanceUID);\r\n}\r\n\r\nfunction getSopClassHandlerModule({ servicesManager, extensionManager }) {\r\n const getDisplaySetsFromSeries = instances => {\r\n return _getDisplaySetsFromSeries(instances, servicesManager, extensionManager);\r\n };\r\n\r\n return [\r\n {\r\n name: 'dicom-seg',\r\n sopClassUids,\r\n getDisplaySetsFromSeries,\r\n },\r\n ];\r\n}\r\n\r\nexport default getSopClassHandlerModule;\r\n","import dcmjs from 'dcmjs';\r\n\r\n/**\r\n * Converts a CIELAB color to an RGB color using the dcmjs library.\r\n * @param cielab - The CIELAB color to convert.\r\n * @returns The RGB color as an array of three integers between 0 and 255.\r\n */\r\nfunction dicomlabToRGB(cielab: number[]): number[] {\r\n const rgb = dcmjs.data.Colors.dicomlab2RGB(cielab).map(x => Math.round(x * 255));\r\n\r\n return rgb;\r\n}\r\n\r\nexport { dicomlabToRGB };\r\n","import { Types } from '@ohif/core';\r\n\r\nconst segProtocol: Types.HangingProtocol.Protocol = {\r\n id: '@ohif/seg',\r\n // Don't store this hanging protocol as it applies to the currently active\r\n // display set by default\r\n // cacheId: null,\r\n name: 'Segmentations',\r\n // Just apply this one when specifically listed\r\n protocolMatchingRules: [],\r\n toolGroupIds: ['default'],\r\n // -1 would be used to indicate active only, whereas other values are\r\n // the number of required priors referenced - so 0 means active with\r\n // 0 or more priors.\r\n numberOfPriorsReferenced: 0,\r\n // Default viewport is used to define the viewport when\r\n // additional viewports are added using the layout tool\r\n defaultViewport: {\r\n viewportOptions: {\r\n viewportType: 'stack',\r\n toolGroupId: 'default',\r\n allowUnmatchedView: true,\r\n },\r\n displaySets: [\r\n {\r\n id: 'segDisplaySetId',\r\n matchedDisplaySetsIndex: -1,\r\n },\r\n ],\r\n },\r\n displaySetSelectors: {\r\n segDisplaySetId: {\r\n seriesMatchingRules: [\r\n {\r\n attribute: 'Modality',\r\n constraint: {\r\n equals: 'SEG',\r\n },\r\n },\r\n ],\r\n },\r\n },\r\n stages: [\r\n {\r\n name: 'Segmentations',\r\n viewportStructure: {\r\n layoutType: 'grid',\r\n properties: {\r\n rows: 1,\r\n columns: 1,\r\n },\r\n },\r\n viewports: [\r\n {\r\n viewportOptions: { allowUnmatchedView: true },\r\n displaySets: [\r\n {\r\n id: 'segDisplaySetId',\r\n },\r\n ],\r\n },\r\n ],\r\n },\r\n ],\r\n};\r\n\r\nfunction getHangingProtocolModule() {\r\n return [\r\n {\r\n name: segProtocol.id,\r\n protocol: segProtocol,\r\n },\r\n ];\r\n}\r\n\r\nexport default getHangingProtocolModule;\r\nexport { segProtocol };\r\n","import React from 'react';\r\nimport { Input, Dialog, ButtonEnums } from '@ohif/ui';\r\n\r\nfunction callInputDialog(uiDialogService, label, callback) {\r\n const dialogId = 'enter-segment-label';\r\n\r\n const onSubmitHandler = ({ action, value }) => {\r\n switch (action.id) {\r\n case 'save':\r\n callback(value.label, action.id);\r\n break;\r\n case 'cancel':\r\n callback('', action.id);\r\n break;\r\n }\r\n uiDialogService.dismiss({ id: dialogId });\r\n };\r\n\r\n if (uiDialogService) {\r\n uiDialogService.create({\r\n id: dialogId,\r\n centralize: true,\r\n isDraggable: false,\r\n showOverlay: true,\r\n content: Dialog,\r\n contentProps: {\r\n title: 'Segment',\r\n value: { label },\r\n noCloseButton: true,\r\n onClose: () => uiDialogService.dismiss({ id: dialogId }),\r\n actions: [\r\n { id: 'cancel', text: 'Cancel', type: ButtonEnums.type.secondary },\r\n { id: 'save', text: 'Confirm', type: ButtonEnums.type.primary },\r\n ],\r\n onSubmit: onSubmitHandler,\r\n body: ({ value, setValue }) => {\r\n return (\r\n {\r\n event.persist();\r\n setValue(value => ({ ...value, label: event.target.value }));\r\n }}\r\n onKeyPress={event => {\r\n if (event.key === 'Enter') {\r\n onSubmitHandler({ value, action: { id: 'save' } });\r\n }\r\n }}\r\n />\r\n );\r\n },\r\n },\r\n });\r\n }\r\n}\r\n\r\nexport default callInputDialog;\r\n","import React from 'react';\r\nimport { Dialog } from '@ohif/ui';\r\nimport { ChromePicker } from 'react-color';\r\n\r\nimport './colorPickerDialog.css';\r\n\r\nfunction callColorPickerDialog(uiDialogService, rgbaColor, callback) {\r\n const dialogId = 'pick-color';\r\n\r\n const onSubmitHandler = ({ action, value }) => {\r\n switch (action.id) {\r\n case 'save':\r\n callback(value.rgbaColor, action.id);\r\n break;\r\n case 'cancel':\r\n callback('', action.id);\r\n break;\r\n }\r\n uiDialogService.dismiss({ id: dialogId });\r\n };\r\n\r\n if (uiDialogService) {\r\n uiDialogService.create({\r\n id: dialogId,\r\n centralize: true,\r\n isDraggable: false,\r\n showOverlay: true,\r\n content: Dialog,\r\n contentProps: {\r\n title: 'Segment Color',\r\n value: { rgbaColor },\r\n noCloseButton: true,\r\n onClose: () => uiDialogService.dismiss({ id: dialogId }),\r\n actions: [\r\n { id: 'cancel', text: 'Cancel', type: 'primary' },\r\n { id: 'save', text: 'Save', type: 'secondary' },\r\n ],\r\n onSubmit: onSubmitHandler,\r\n body: ({ value, setValue }) => {\r\n const handleChange = color => {\r\n setValue({ rgbaColor: color.rgb });\r\n };\r\n\r\n return (\r\n \r\n );\r\n },\r\n },\r\n });\r\n }\r\n}\r\n\r\nexport default callColorPickerDialog;\r\n","import { createReportAsync } from '@ohif/extension-default';\r\nimport React, { useEffect, useState, useCallback } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { SegmentationGroupTable, LegacyButtonGroup, LegacyButton } from '@ohif/ui';\r\n\r\nimport callInputDialog from './callInputDialog';\r\nimport callColorPickerDialog from './colorPickerDialog';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nexport default function PanelSegmentation({\r\n servicesManager,\r\n commandsManager,\r\n extensionManager,\r\n configuration,\r\n}) {\r\n const { segmentationService, viewportGridService, uiDialogService } = servicesManager.services;\r\n\r\n const { t } = useTranslation('PanelSegmentation');\r\n\r\n const [selectedSegmentationId, setSelectedSegmentationId] = useState(null);\r\n const [segmentationConfiguration, setSegmentationConfiguration] = useState(\r\n segmentationService.getConfiguration()\r\n );\r\n\r\n const [segmentations, setSegmentations] = useState(() => segmentationService.getSegmentations());\r\n\r\n useEffect(() => {\r\n // ~~ Subscription\r\n const added = segmentationService.EVENTS.SEGMENTATION_ADDED;\r\n const updated = segmentationService.EVENTS.SEGMENTATION_UPDATED;\r\n const removed = segmentationService.EVENTS.SEGMENTATION_REMOVED;\r\n const subscriptions = [];\r\n\r\n [added, updated, removed].forEach(evt => {\r\n const { unsubscribe } = segmentationService.subscribe(evt, () => {\r\n const segmentations = segmentationService.getSegmentations();\r\n setSegmentations(segmentations);\r\n setSegmentationConfiguration(segmentationService.getConfiguration());\r\n });\r\n subscriptions.push(unsubscribe);\r\n });\r\n\r\n return () => {\r\n subscriptions.forEach(unsub => {\r\n unsub();\r\n });\r\n };\r\n }, []);\r\n\r\n const getToolGroupIds = segmentationId => {\r\n const toolGroupIds = segmentationService.getToolGroupIdsWithSegmentation(segmentationId);\r\n\r\n return toolGroupIds;\r\n };\r\n\r\n const onSegmentationAdd = async () => {\r\n commandsManager.runCommand('createEmptySegmentationForViewport');\r\n };\r\n\r\n const onSegmentationClick = (segmentationId: string) => {\r\n segmentationService.setActiveSegmentationForToolGroup(segmentationId);\r\n };\r\n\r\n const onSegmentationDelete = (segmentationId: string) => {\r\n segmentationService.remove(segmentationId);\r\n };\r\n\r\n const onSegmentAdd = segmentationId => {\r\n segmentationService.addSegment(segmentationId);\r\n };\r\n\r\n const onSegmentClick = (segmentationId, segmentIndex) => {\r\n segmentationService.setActiveSegment(segmentationId, segmentIndex);\r\n\r\n const toolGroupIds = getToolGroupIds(segmentationId);\r\n\r\n toolGroupIds.forEach(toolGroupId => {\r\n // const toolGroupId =\r\n segmentationService.setActiveSegmentationForToolGroup(segmentationId, toolGroupId);\r\n segmentationService.jumpToSegmentCenter(segmentationId, segmentIndex, toolGroupId);\r\n });\r\n };\r\n\r\n const onSegmentEdit = (segmentationId, segmentIndex) => {\r\n const segmentation = segmentationService.getSegmentation(segmentationId);\r\n\r\n const segment = segmentation.segments[segmentIndex];\r\n const { label } = segment;\r\n\r\n callInputDialog(uiDialogService, label, (label, actionId) => {\r\n if (label === '') {\r\n return;\r\n }\r\n\r\n segmentationService.setSegmentLabel(segmentationId, segmentIndex, label);\r\n });\r\n };\r\n\r\n const onSegmentationEdit = segmentationId => {\r\n const segmentation = segmentationService.getSegmentation(segmentationId);\r\n const { label } = segmentation;\r\n\r\n callInputDialog(uiDialogService, label, (label, actionId) => {\r\n if (label === '') {\r\n return;\r\n }\r\n\r\n segmentationService.addOrUpdateSegmentation(\r\n {\r\n id: segmentationId,\r\n label,\r\n },\r\n false, // suppress event\r\n true // notYetUpdatedAtSource\r\n );\r\n });\r\n };\r\n\r\n const onSegmentColorClick = (segmentationId, segmentIndex) => {\r\n const segmentation = segmentationService.getSegmentation(segmentationId);\r\n\r\n const segment = segmentation.segments[segmentIndex];\r\n const { color, opacity } = segment;\r\n\r\n const rgbaColor = {\r\n r: color[0],\r\n g: color[1],\r\n b: color[2],\r\n a: opacity / 255.0,\r\n };\r\n\r\n callColorPickerDialog(uiDialogService, rgbaColor, (newRgbaColor, actionId) => {\r\n if (actionId === 'cancel') {\r\n return;\r\n }\r\n\r\n segmentationService.setSegmentRGBAColor(segmentationId, segmentIndex, [\r\n newRgbaColor.r,\r\n newRgbaColor.g,\r\n newRgbaColor.b,\r\n newRgbaColor.a * 255.0,\r\n ]);\r\n });\r\n };\r\n\r\n const onSegmentDelete = (segmentationId, segmentIndex) => {\r\n segmentationService.removeSegment(segmentationId, segmentIndex);\r\n };\r\n\r\n const onToggleSegmentVisibility = (segmentationId, segmentIndex) => {\r\n const segmentation = segmentationService.getSegmentation(segmentationId);\r\n const segmentInfo = segmentation.segments[segmentIndex];\r\n const isVisible = !segmentInfo.isVisible;\r\n const toolGroupIds = getToolGroupIds(segmentationId);\r\n\r\n // Todo: right now we apply the visibility to all tool groups\r\n toolGroupIds.forEach(toolGroupId => {\r\n segmentationService.setSegmentVisibility(\r\n segmentationId,\r\n segmentIndex,\r\n isVisible,\r\n toolGroupId\r\n );\r\n });\r\n };\r\n\r\n const onToggleSegmentLock = (segmentationId, segmentIndex) => {\r\n segmentationService.toggleSegmentLocked(segmentationId, segmentIndex);\r\n };\r\n\r\n const onToggleSegmentationVisibility = segmentationId => {\r\n segmentationService.toggleSegmentationVisibility(segmentationId);\r\n };\r\n\r\n const _setSegmentationConfiguration = useCallback(\r\n (segmentationId, key, value) => {\r\n segmentationService.setConfiguration({\r\n segmentationId,\r\n [key]: value,\r\n });\r\n },\r\n [segmentationService]\r\n );\r\n\r\n const onSegmentationDownload = segmentationId => {\r\n commandsManager.runCommand('downloadSegmentation', {\r\n segmentationId,\r\n });\r\n };\r\n\r\n const storeSegmentation = async segmentationId => {\r\n const datasources = extensionManager.getActiveDataSource();\r\n\r\n const displaySetInstanceUIDs = await createReportAsync({\r\n servicesManager,\r\n getReport: () =>\r\n commandsManager.runCommand('storeSegmentation', {\r\n segmentationId,\r\n dataSource: datasources[0],\r\n }),\r\n reportType: 'Segmentation',\r\n });\r\n\r\n // Show the exported report in the active viewport as read only (similar to SR)\r\n if (displaySetInstanceUIDs) {\r\n // clear the segmentation that we exported, similar to the storeMeasurement\r\n // where we remove the measurements and prompt again the user if they would like\r\n // to re-read the measurements in a SR read only viewport\r\n segmentationService.remove(segmentationId);\r\n\r\n viewportGridService.setDisplaySetsForViewport({\r\n viewportId: viewportGridService.getActiveViewportId(),\r\n displaySetInstanceUIDs,\r\n });\r\n }\r\n };\r\n\r\n const onSegmentationDownloadRTSS = segmentationId => {\r\n commandsManager.runCommand('downloadRTSS', {\r\n segmentationId,\r\n });\r\n };\r\n\r\n return (\r\n <>\r\n
\r\n \r\n _setSegmentationConfiguration(selectedSegmentationId, 'renderOutline', value)\r\n }\r\n setOutlineOpacityActive={value =>\r\n _setSegmentationConfiguration(selectedSegmentationId, 'outlineOpacity', value)\r\n }\r\n setRenderFill={value =>\r\n _setSegmentationConfiguration(selectedSegmentationId, 'renderFill', value)\r\n }\r\n setRenderInactiveSegmentations={value =>\r\n _setSegmentationConfiguration(\r\n selectedSegmentationId,\r\n 'renderInactiveSegmentations',\r\n value\r\n )\r\n }\r\n setOutlineWidthActive={value =>\r\n _setSegmentationConfiguration(selectedSegmentationId, 'outlineWidthActive', value)\r\n }\r\n setFillAlpha={value =>\r\n _setSegmentationConfiguration(selectedSegmentationId, 'fillAlpha', value)\r\n }\r\n setFillAlphaInactive={value =>\r\n _setSegmentationConfiguration(selectedSegmentationId, 'fillAlphaInactive', value)\r\n }\r\n />\r\n
\r\n \r\n );\r\n}\r\n\r\nPanelSegmentation.propTypes = {\r\n commandsManager: PropTypes.shape({\r\n runCommand: PropTypes.func.isRequired,\r\n }),\r\n servicesManager: PropTypes.shape({\r\n services: PropTypes.shape({\r\n segmentationService: PropTypes.shape({\r\n getSegmentation: PropTypes.func.isRequired,\r\n getSegmentations: PropTypes.func.isRequired,\r\n toggleSegmentationVisibility: PropTypes.func.isRequired,\r\n subscribe: PropTypes.func.isRequired,\r\n EVENTS: PropTypes.object.isRequired,\r\n }).isRequired,\r\n }).isRequired,\r\n }).isRequired,\r\n};\r\n","import React, { useCallback, useEffect, useState, useReducer } from 'react';\r\nimport { AdvancedToolbox, InputDoubleRange, useViewportGrid } from '@ohif/ui';\r\nimport { Types } from '@ohif/extension-cornerstone';\r\nimport { utilities } from '@cornerstonejs/tools';\r\n\r\nconst { segmentation: segmentationUtils } = utilities;\r\n\r\nconst TOOL_TYPES = {\r\n CIRCULAR_BRUSH: 'CircularBrush',\r\n SPHERE_BRUSH: 'SphereBrush',\r\n CIRCULAR_ERASER: 'CircularEraser',\r\n SPHERE_ERASER: 'SphereEraser',\r\n CIRCLE_SHAPE: 'CircleScissor',\r\n RECTANGLE_SHAPE: 'RectangleScissor',\r\n SPHERE_SHAPE: 'SphereScissor',\r\n THRESHOLD_CIRCULAR_BRUSH: 'ThresholdCircularBrush',\r\n THRESHOLD_SPHERE_BRUSH: 'ThresholdSphereBrush',\r\n};\r\n\r\nconst ACTIONS = {\r\n SET_TOOL_CONFIG: 'SET_TOOL_CONFIG',\r\n SET_ACTIVE_TOOL: 'SET_ACTIVE_TOOL',\r\n};\r\n\r\nconst initialState = {\r\n Brush: {\r\n brushSize: 15,\r\n mode: 'CircularBrush', // Can be 'CircularBrush' or 'SphereBrush'\r\n },\r\n Eraser: {\r\n brushSize: 15,\r\n mode: 'CircularEraser', // Can be 'CircularEraser' or 'SphereEraser'\r\n },\r\n Shapes: {\r\n brushSize: 15,\r\n mode: 'CircleScissor', // E.g., 'CircleScissor', 'RectangleScissor', or 'SphereScissor'\r\n },\r\n ThresholdBrush: {\r\n brushSize: 15,\r\n thresholdRange: [-500, 500],\r\n },\r\n activeTool: null,\r\n};\r\n\r\nfunction toolboxReducer(state, action) {\r\n switch (action.type) {\r\n case ACTIONS.SET_TOOL_CONFIG:\r\n const { tool, config } = action.payload;\r\n return {\r\n ...state,\r\n [tool]: {\r\n ...state[tool],\r\n ...config,\r\n },\r\n };\r\n case ACTIONS.SET_ACTIVE_TOOL:\r\n return { ...state, activeTool: action.payload };\r\n default:\r\n return state;\r\n }\r\n}\r\n\r\nfunction SegmentationToolbox({ servicesManager, extensionManager }) {\r\n const { toolbarService, segmentationService, toolGroupService } =\r\n servicesManager.services as Types.CornerstoneServices;\r\n\r\n const [viewportGrid] = useViewportGrid();\r\n const { viewports, activeViewportId } = viewportGrid;\r\n\r\n const [toolsEnabled, setToolsEnabled] = useState(false);\r\n const [state, dispatch] = useReducer(toolboxReducer, initialState);\r\n\r\n const updateActiveTool = useCallback(() => {\r\n if (!viewports?.size || activeViewportId === undefined) {\r\n return;\r\n }\r\n const viewport = viewports.get(activeViewportId);\r\n\r\n if (!viewport) {\r\n return;\r\n }\r\n\r\n dispatch({\r\n type: ACTIONS.SET_ACTIVE_TOOL,\r\n payload: toolGroupService.getActiveToolForViewport(viewport.viewportId),\r\n });\r\n }, [activeViewportId, viewports, toolGroupService, dispatch]);\r\n\r\n const setToolActive = useCallback(\r\n toolName => {\r\n toolbarService.recordInteraction({\r\n interactionType: 'tool',\r\n commands: [\r\n {\r\n commandName: 'setToolActive',\r\n commandOptions: {\r\n toolName,\r\n },\r\n },\r\n ],\r\n });\r\n\r\n dispatch({ type: ACTIONS.SET_ACTIVE_TOOL, payload: toolName });\r\n },\r\n [toolbarService, dispatch]\r\n );\r\n\r\n /**\r\n * sets the tools enabled IF there are segmentations\r\n */\r\n useEffect(() => {\r\n const events = [\r\n segmentationService.EVENTS.SEGMENTATION_ADDED,\r\n segmentationService.EVENTS.SEGMENTATION_UPDATED,\r\n segmentationService.EVENTS.SEGMENTATION_REMOVED,\r\n ];\r\n\r\n const unsubscriptions = [];\r\n\r\n events.forEach(event => {\r\n const { unsubscribe } = segmentationService.subscribe(event, () => {\r\n const segmentations = segmentationService.getSegmentations();\r\n\r\n const activeSegmentation = segmentations?.find(seg => seg.isActive);\r\n\r\n setToolsEnabled(activeSegmentation?.segmentCount > 0);\r\n });\r\n\r\n unsubscriptions.push(unsubscribe);\r\n });\r\n\r\n updateActiveTool();\r\n\r\n return () => {\r\n unsubscriptions.forEach(unsubscribe => unsubscribe());\r\n };\r\n }, [activeViewportId, viewports, segmentationService, updateActiveTool]);\r\n\r\n /**\r\n * Update the active tool when the toolbar state changes\r\n */\r\n useEffect(() => {\r\n const { unsubscribe } = toolbarService.subscribe(\r\n toolbarService.EVENTS.TOOL_BAR_STATE_MODIFIED,\r\n () => {\r\n updateActiveTool();\r\n }\r\n );\r\n\r\n return () => {\r\n unsubscribe();\r\n };\r\n }, [toolbarService, updateActiveTool]);\r\n\r\n useEffect(() => {\r\n // if the active tool is not a brush tool then do nothing\r\n if (!Object.values(TOOL_TYPES).includes(state.activeTool)) {\r\n return;\r\n }\r\n\r\n // if the tool is Segmentation and it is enabled then do nothing\r\n if (toolsEnabled) {\r\n return;\r\n }\r\n\r\n // if the tool is Segmentation and it is disabled, then switch\r\n // back to the window level tool to not confuse the user when no\r\n // segmentation is active or when there is no segment in the segmentation\r\n setToolActive('WindowLevel');\r\n }, [toolsEnabled, state.activeTool, setToolActive]);\r\n\r\n const updateBrushSize = useCallback(\r\n (toolName, brushSize) => {\r\n toolGroupService.getToolGroupIds()?.forEach(toolGroupId => {\r\n segmentationUtils.setBrushSizeForToolGroup(toolGroupId, brushSize, toolName);\r\n });\r\n },\r\n [toolGroupService]\r\n );\r\n\r\n const onBrushSizeChange = useCallback(\r\n (valueAsStringOrNumber, toolCategory) => {\r\n const value = Number(valueAsStringOrNumber);\r\n\r\n _getToolNamesFromCategory(toolCategory).forEach(toolName => {\r\n updateBrushSize(toolName, value);\r\n });\r\n\r\n dispatch({\r\n type: ACTIONS.SET_TOOL_CONFIG,\r\n payload: {\r\n tool: toolCategory,\r\n config: { brushSize: value },\r\n },\r\n });\r\n },\r\n [toolGroupService, dispatch]\r\n );\r\n\r\n const handleRangeChange = useCallback(\r\n newRange => {\r\n if (\r\n newRange[0] === state.ThresholdBrush.thresholdRange[0] &&\r\n newRange[1] === state.ThresholdBrush.thresholdRange[1]\r\n ) {\r\n return;\r\n }\r\n\r\n const toolNames = _getToolNamesFromCategory('ThresholdBrush');\r\n\r\n toolNames.forEach(toolName => {\r\n toolGroupService.getToolGroupIds()?.forEach(toolGroupId => {\r\n const toolGroup = toolGroupService.getToolGroup(toolGroupId);\r\n toolGroup.setToolConfiguration(toolName, {\r\n strategySpecificConfiguration: {\r\n THRESHOLD_INSIDE_CIRCLE: {\r\n threshold: newRange,\r\n },\r\n },\r\n });\r\n });\r\n });\r\n\r\n dispatch({\r\n type: ACTIONS.SET_TOOL_CONFIG,\r\n payload: {\r\n tool: 'ThresholdBrush',\r\n config: { thresholdRange: newRange },\r\n },\r\n });\r\n },\r\n [toolGroupService, dispatch, state.ThresholdBrush.thresholdRange]\r\n );\r\n\r\n return (\r\n setToolActive(TOOL_TYPES.CIRCULAR_BRUSH),\r\n options: [\r\n {\r\n name: 'Radius (mm)',\r\n id: 'brush-radius',\r\n type: 'range',\r\n min: 0.5,\r\n max: 99.5,\r\n value: state.Brush.brushSize,\r\n step: 0.5,\r\n onChange: value => onBrushSizeChange(value, 'Brush'),\r\n },\r\n {\r\n name: 'Mode',\r\n type: 'radio',\r\n id: 'brush-mode',\r\n value: state.Brush.mode,\r\n values: [\r\n { value: TOOL_TYPES.CIRCULAR_BRUSH, label: 'Circle' },\r\n { value: TOOL_TYPES.SPHERE_BRUSH, label: 'Sphere' },\r\n ],\r\n onChange: value => setToolActive(value),\r\n },\r\n ],\r\n },\r\n {\r\n name: 'Eraser',\r\n icon: 'icon-tool-eraser',\r\n disabled: !toolsEnabled,\r\n active:\r\n state.activeTool === TOOL_TYPES.CIRCULAR_ERASER ||\r\n state.activeTool === TOOL_TYPES.SPHERE_ERASER,\r\n onClick: () => setToolActive(TOOL_TYPES.CIRCULAR_ERASER),\r\n options: [\r\n {\r\n name: 'Radius (mm)',\r\n type: 'range',\r\n id: 'eraser-radius',\r\n min: 0.5,\r\n max: 99.5,\r\n value: state.Eraser.brushSize,\r\n step: 0.5,\r\n onChange: value => onBrushSizeChange(value, 'Eraser'),\r\n },\r\n {\r\n name: 'Mode',\r\n type: 'radio',\r\n id: 'eraser-mode',\r\n value: state.Eraser.mode,\r\n values: [\r\n { value: TOOL_TYPES.CIRCULAR_ERASER, label: 'Circle' },\r\n { value: TOOL_TYPES.SPHERE_ERASER, label: 'Sphere' },\r\n ],\r\n onChange: value => setToolActive(value),\r\n },\r\n ],\r\n },\r\n {\r\n name: 'Shapes',\r\n icon: 'icon-tool-shape',\r\n disabled: !toolsEnabled,\r\n active:\r\n state.activeTool === TOOL_TYPES.CIRCLE_SHAPE ||\r\n state.activeTool === TOOL_TYPES.RECTANGLE_SHAPE ||\r\n state.activeTool === TOOL_TYPES.SPHERE_SHAPE,\r\n onClick: () => setToolActive(TOOL_TYPES.CIRCLE_SHAPE),\r\n options: [\r\n {\r\n name: 'Mode',\r\n type: 'radio',\r\n value: state.Shapes.mode,\r\n id: 'shape-mode',\r\n values: [\r\n { value: TOOL_TYPES.CIRCLE_SHAPE, label: 'Circle' },\r\n { value: TOOL_TYPES.RECTANGLE_SHAPE, label: 'Rectangle' },\r\n { value: TOOL_TYPES.SPHERE_SHAPE, label: 'Sphere' },\r\n ],\r\n onChange: value => setToolActive(value),\r\n },\r\n ],\r\n },\r\n {\r\n name: 'Threshold Tool',\r\n icon: 'icon-tool-threshold',\r\n disabled: !toolsEnabled,\r\n active:\r\n state.activeTool === TOOL_TYPES.THRESHOLD_CIRCULAR_BRUSH ||\r\n state.activeTool === TOOL_TYPES.THRESHOLD_SPHERE_BRUSH,\r\n onClick: () => setToolActive(TOOL_TYPES.THRESHOLD_CIRCULAR_BRUSH),\r\n options: [\r\n {\r\n name: 'Radius (mm)',\r\n id: 'threshold-radius',\r\n type: 'range',\r\n min: 0.5,\r\n max: 99.5,\r\n value: state.ThresholdBrush.brushSize,\r\n step: 0.5,\r\n onChange: value => onBrushSizeChange(value, 'ThresholdBrush'),\r\n },\r\n {\r\n name: 'Mode',\r\n type: 'radio',\r\n id: 'threshold-mode',\r\n value: state.activeTool,\r\n values: [\r\n { value: TOOL_TYPES.THRESHOLD_CIRCULAR_BRUSH, label: 'Circle' },\r\n { value: TOOL_TYPES.THRESHOLD_SPHERE_BRUSH, label: 'Sphere' },\r\n ],\r\n onChange: value => setToolActive(value),\r\n },\r\n {\r\n type: 'custom',\r\n id: 'segmentation-threshold-range',\r\n children: () => {\r\n return (\r\n
\r\n
\r\n
Threshold
\r\n \r\n
\r\n );\r\n },\r\n },\r\n ],\r\n },\r\n ]}\r\n />\r\n );\r\n}\r\n\r\nfunction _getToolNamesFromCategory(category) {\r\n let toolNames = [];\r\n switch (category) {\r\n case 'Brush':\r\n toolNames = ['CircularBrush', 'SphereBrush'];\r\n break;\r\n case 'Eraser':\r\n toolNames = ['CircularEraser', 'SphereEraser'];\r\n break;\r\n case 'ThresholdBrush':\r\n toolNames = ['ThresholdCircularBrush', 'ThresholdSphereBrush'];\r\n break;\r\n default:\r\n break;\r\n }\r\n\r\n return toolNames;\r\n}\r\n\r\nexport default SegmentationToolbox;\r\n","import React from 'react';\r\n\r\nimport { useAppConfig } from '@state';\r\nimport PanelSegmentation from './panels/PanelSegmentation';\r\nimport SegmentationToolbox from './panels/SegmentationToolbox';\r\n\r\nconst getPanelModule = ({ commandsManager, servicesManager, extensionManager, configuration }) => {\r\n const { customizationService } = servicesManager.services;\r\n\r\n const wrappedPanelSegmentation = configuration => {\r\n const [appConfig] = useAppConfig();\r\n\r\n const disableEditingForMode = customizationService.get('segmentation.disableEditing');\r\n\r\n return (\r\n \r\n );\r\n };\r\n\r\n const wrappedPanelSegmentationWithTools = configuration => {\r\n const [appConfig] = useAppConfig();\r\n return (\r\n <>\r\n \r\n \r\n \r\n );\r\n };\r\n\r\n return [\r\n {\r\n name: 'panelSegmentation',\r\n iconName: 'tab-segmentation',\r\n iconLabel: 'Segmentation',\r\n label: 'Segmentation',\r\n component: wrappedPanelSegmentation,\r\n },\r\n {\r\n name: 'panelSegmentationWithTools',\r\n iconName: 'tab-segmentation',\r\n iconLabel: 'Segmentation',\r\n label: 'Segmentation',\r\n component: wrappedPanelSegmentationWithTools,\r\n },\r\n ];\r\n};\r\n\r\nexport default getPanelModule;\r\n","import { Enums, cache } from '@cornerstonejs/core';\r\n\r\n/**\r\n * Updates the viewports in preparation for rendering segmentations.\r\n * Evaluates each viewport to determine which need modifications,\r\n * then for those viewports, changes them to a volume type and ensures\r\n * they are ready for segmentation rendering.\r\n *\r\n * @param {Object} params - Parameters for the function.\r\n * @param params.viewportId - ID of the viewport to be updated.\r\n * @param params.loadFn - Function to load the segmentation data.\r\n * @param params.servicesManager - The services manager.\r\n * @param params.referencedDisplaySetInstanceUID - Optional UID for the referenced display set instance.\r\n *\r\n * @returns Returns true upon successful update of viewports for segmentation rendering.\r\n */\r\nasync function updateViewportsForSegmentationRendering({\r\n viewportId,\r\n loadFn,\r\n servicesManager,\r\n referencedDisplaySetInstanceUID,\r\n}: {\r\n viewportId: string;\r\n loadFn: () => Promise;\r\n servicesManager: any;\r\n referencedDisplaySetInstanceUID?: string;\r\n}) {\r\n const { cornerstoneViewportService, segmentationService, viewportGridService } =\r\n servicesManager.services;\r\n\r\n const viewport = getTargetViewport({ viewportId, viewportGridService });\r\n const targetViewportId = viewport.viewportOptions.viewportId;\r\n\r\n referencedDisplaySetInstanceUID =\r\n referencedDisplaySetInstanceUID || viewport?.displaySetInstanceUIDs[0];\r\n\r\n const updatedViewports = getUpdatedViewportsForSegmentation({\r\n servicesManager,\r\n viewportId,\r\n referencedDisplaySetInstanceUID,\r\n });\r\n\r\n // create Segmentation callback which needs to be waited until\r\n // the volume is created (if coming from stack)\r\n const createSegmentationForVolume = async () => {\r\n const segmentationId = await loadFn();\r\n segmentationService.hydrateSegmentation(segmentationId);\r\n };\r\n\r\n // the reference volume that is used to draw the segmentation. so check if the\r\n // volume exists in the cache (the target Viewport is already a volume viewport)\r\n const volumeExists = Array.from(cache._volumeCache.keys()).some(volumeId =>\r\n volumeId.includes(referencedDisplaySetInstanceUID)\r\n );\r\n\r\n updatedViewports.forEach(async viewport => {\r\n viewport.viewportOptions = {\r\n ...viewport.viewportOptions,\r\n viewportType: 'volume',\r\n needsRerendering: true,\r\n };\r\n const viewportId = viewport.viewportId;\r\n\r\n const csViewport = cornerstoneViewportService.getCornerstoneViewport(viewportId);\r\n const prevCamera = csViewport.getCamera();\r\n\r\n // only run the createSegmentationForVolume for the targetViewportId\r\n // since the rest will get handled by cornerstoneViewportService\r\n if (volumeExists && viewportId === targetViewportId) {\r\n await createSegmentationForVolume();\r\n return;\r\n }\r\n\r\n const createNewSegmentationWhenVolumeMounts = async evt => {\r\n const isTheActiveViewportVolumeMounted = evt.detail.volumeActors?.find(ac =>\r\n ac.uid.includes(referencedDisplaySetInstanceUID)\r\n );\r\n\r\n // Note: make sure to re-grab the viewport since it might have changed\r\n // during the time it took for the volume to be mounted, for instance\r\n // the stack viewport has been changed to a volume viewport\r\n const volumeViewport = cornerstoneViewportService.getCornerstoneViewport(viewportId);\r\n volumeViewport.setCamera(prevCamera);\r\n\r\n volumeViewport.element.removeEventListener(\r\n Enums.Events.VOLUME_VIEWPORT_NEW_VOLUME,\r\n createNewSegmentationWhenVolumeMounts\r\n );\r\n\r\n if (!isTheActiveViewportVolumeMounted) {\r\n // it means it is one of those other updated viewports so just update the camera\r\n return;\r\n }\r\n\r\n if (viewportId === targetViewportId) {\r\n await createSegmentationForVolume();\r\n }\r\n };\r\n\r\n csViewport.element.addEventListener(\r\n Enums.Events.VOLUME_VIEWPORT_NEW_VOLUME,\r\n createNewSegmentationWhenVolumeMounts\r\n );\r\n });\r\n\r\n // Set the displaySets for the viewports that require to be updated\r\n viewportGridService.setDisplaySetsForViewports(updatedViewports);\r\n\r\n return true;\r\n}\r\n\r\nconst getTargetViewport = ({ viewportId, viewportGridService }) => {\r\n const { viewports, activeViewportId } = viewportGridService.getState();\r\n const targetViewportId = viewportId || activeViewportId;\r\n\r\n const viewport = viewports.get(targetViewportId);\r\n\r\n return viewport;\r\n};\r\n\r\n/**\r\n * Retrieves a list of viewports that require updates in preparation for segmentation rendering.\r\n * This function evaluates viewports based on their compatibility with the provided segmentation's\r\n * frame of reference UID and appends them to the updated list if they should render the segmentation.\r\n *\r\n * @param {Object} params - Parameters for the function.\r\n * @param params.viewportId - the ID of the viewport to be updated.\r\n * @param params.servicesManager - The services manager\r\n * @param params.referencedDisplaySetInstanceUID - Optional UID for the referenced display set instance.\r\n *\r\n * @returns {Array} Returns an array of viewports that require updates for segmentation rendering.\r\n */\r\nfunction getUpdatedViewportsForSegmentation({\r\n viewportId,\r\n servicesManager,\r\n referencedDisplaySetInstanceUID,\r\n}) {\r\n const { hangingProtocolService, displaySetService, segmentationService, viewportGridService } =\r\n servicesManager.services;\r\n\r\n const { viewports } = viewportGridService.getState();\r\n\r\n const viewport = getTargetViewport({ viewportId, viewportGridService });\r\n const targetViewportId = viewport.viewportOptions.viewportId;\r\n\r\n const displaySetInstanceUIDs = viewports.get(targetViewportId).displaySetInstanceUIDs;\r\n\r\n const referenceDisplaySetInstanceUID =\r\n referencedDisplaySetInstanceUID || displaySetInstanceUIDs[0];\r\n\r\n const referencedDisplaySet = displaySetService.getDisplaySetByUID(referenceDisplaySetInstanceUID);\r\n const segmentationFrameOfReferenceUID = referencedDisplaySet.instances[0].FrameOfReferenceUID;\r\n\r\n const updatedViewports = hangingProtocolService.getViewportsRequireUpdate(\r\n targetViewportId,\r\n referenceDisplaySetInstanceUID\r\n );\r\n\r\n viewports.forEach((viewport, viewportId) => {\r\n if (\r\n targetViewportId === viewportId ||\r\n updatedViewports.find(v => v.viewportId === viewportId)\r\n ) {\r\n return;\r\n }\r\n\r\n const shouldDisplaySeg = segmentationService.shouldRenderSegmentation(\r\n viewport.displaySetInstanceUIDs,\r\n segmentationFrameOfReferenceUID\r\n );\r\n\r\n if (shouldDisplaySeg) {\r\n updatedViewports.push({\r\n viewportId,\r\n displaySetInstanceUIDs: viewport.displaySetInstanceUIDs,\r\n viewportOptions: {\r\n viewportType: 'volume',\r\n needsRerendering: true,\r\n },\r\n });\r\n }\r\n });\r\n return updatedViewports;\r\n}\r\n\r\nexport {\r\n updateViewportsForSegmentationRendering,\r\n getUpdatedViewportsForSegmentation,\r\n getTargetViewport,\r\n};\r\n","import dcmjs from 'dcmjs';\r\nimport { createReportDialogPrompt } from '@ohif/extension-default';\r\nimport { ServicesManager, Types } from '@ohif/core';\r\nimport { cache, metaData } from '@cornerstonejs/core';\r\nimport {\r\n segmentation as cornerstoneToolsSegmentation,\r\n Enums as cornerstoneToolsEnums,\r\n} from '@cornerstonejs/tools';\r\nimport { adaptersRT, helpers, adaptersSEG } from '@cornerstonejs/adapters';\r\nimport { classes, DicomMetadataStore } from '@ohif/core';\r\n\r\nimport vtkImageMarchingSquares from '@kitware/vtk.js/Filters/General/ImageMarchingSquares';\r\nimport vtkDataArray from '@kitware/vtk.js/Common/Core/DataArray';\r\nimport vtkImageData from '@kitware/vtk.js/Common/DataModel/ImageData';\r\n\r\nimport {\r\n updateViewportsForSegmentationRendering,\r\n getUpdatedViewportsForSegmentation,\r\n getTargetViewport,\r\n} from './utils/hydrationUtils';\r\n\r\nconst { datasetToBlob } = dcmjs.data;\r\n\r\nconst {\r\n Cornerstone3D: {\r\n Segmentation: { generateLabelMaps2DFrom3D, generateSegmentation },\r\n },\r\n} = adaptersSEG;\r\n\r\nconst {\r\n Cornerstone3D: {\r\n RTSS: { generateRTSSFromSegmentations },\r\n },\r\n} = adaptersRT;\r\n\r\nconst { downloadDICOMData } = helpers;\r\n\r\nconst commandsModule = ({\r\n servicesManager,\r\n extensionManager,\r\n}: Types.Extensions.ExtensionParams): Types.Extensions.CommandsModule => {\r\n const {\r\n uiNotificationService,\r\n segmentationService,\r\n uiDialogService,\r\n displaySetService,\r\n viewportGridService,\r\n } = (servicesManager as ServicesManager).services;\r\n\r\n const actions = {\r\n /**\r\n * Retrieves a list of viewports that require updates in preparation for segmentation rendering.\r\n * This function evaluates viewports based on their compatibility with the provided segmentation's\r\n * frame of reference UID and appends them to the updated list if they should render the segmentation.\r\n *\r\n * @param {Object} params - Parameters for the function.\r\n * @param params.viewportId - the ID of the viewport to be updated.\r\n * @param params.servicesManager - The services manager\r\n * @param params.referencedDisplaySetInstanceUID - Optional UID for the referenced display set instance.\r\n *\r\n * @returns {Array} Returns an array of viewports that require updates for segmentation rendering.\r\n */\r\n getUpdatedViewportsForSegmentation,\r\n /**\r\n * Creates an empty segmentation for a specified viewport.\r\n * It first checks if the display set associated with the viewport is reconstructable.\r\n * If not, it raises a notification error. Otherwise, it creates a new segmentation\r\n * for the display set after handling the necessary steps for making the viewport\r\n * a volume viewport first\r\n *\r\n * @param {Object} params - Parameters for the function.\r\n * @param params.viewportId - the target viewport ID.\r\n *\r\n */\r\n createEmptySegmentationForViewport: async ({ viewportId }) => {\r\n const viewport = getTargetViewport({ viewportId, viewportGridService });\r\n // Todo: add support for multiple display sets\r\n const displaySetInstanceUID = viewport.displaySetInstanceUIDs[0];\r\n\r\n const displaySet = displaySetService.getDisplaySetByUID(displaySetInstanceUID);\r\n\r\n if (!displaySet.isReconstructable) {\r\n uiNotificationService.show({\r\n title: 'Segmentation',\r\n message: 'Segmentation is not supported for non-reconstructible displaysets yet',\r\n type: 'error',\r\n });\r\n return;\r\n }\r\n\r\n updateViewportsForSegmentationRendering({\r\n viewportId,\r\n servicesManager,\r\n loadFn: async () => {\r\n const currentSegmentations = segmentationService.getSegmentations();\r\n const segmentationId = await segmentationService.createSegmentationForDisplaySet(\r\n displaySetInstanceUID,\r\n { label: `Segmentation ${currentSegmentations.length + 1}` }\r\n );\r\n\r\n const toolGroupId = viewport.viewportOptions.toolGroupId;\r\n\r\n await segmentationService.addSegmentationRepresentationToToolGroup(\r\n toolGroupId,\r\n segmentationId\r\n );\r\n\r\n // Add only one segment for now\r\n segmentationService.addSegment(segmentationId, {\r\n toolGroupId,\r\n segmentIndex: 1,\r\n properties: {\r\n label: 'Segment 1',\r\n },\r\n });\r\n\r\n return segmentationId;\r\n },\r\n });\r\n },\r\n /**\r\n * Loads segmentations for a specified viewport.\r\n * The function prepares the viewport for rendering, then loads the segmentation details.\r\n * Additionally, if the segmentation has scalar data, it is set for the corresponding label map volume.\r\n *\r\n * @param {Object} params - Parameters for the function.\r\n * @param params.segmentations - Array of segmentations to be loaded.\r\n * @param params.viewportId - the target viewport ID.\r\n *\r\n */\r\n loadSegmentationsForViewport: async ({ segmentations, viewportId }) => {\r\n updateViewportsForSegmentationRendering({\r\n viewportId,\r\n servicesManager,\r\n loadFn: async () => {\r\n // Todo: handle adding more than one segmentation\r\n const viewport = getTargetViewport({ viewportId, viewportGridService });\r\n const displaySetInstanceUID = viewport.displaySetInstanceUIDs[0];\r\n\r\n const segmentation = segmentations[0];\r\n const segmentationId = segmentation.id;\r\n const label = segmentation.label;\r\n const segments = segmentation.segments;\r\n\r\n delete segmentation.segments;\r\n\r\n await segmentationService.createSegmentationForDisplaySet(displaySetInstanceUID, {\r\n segmentationId,\r\n label,\r\n });\r\n\r\n if (segmentation.scalarData) {\r\n const labelmapVolume = segmentationService.getLabelmapVolume(segmentationId);\r\n labelmapVolume.scalarData.set(segmentation.scalarData);\r\n }\r\n\r\n segmentationService.addOrUpdateSegmentation(segmentation);\r\n\r\n const toolGroupId = viewport.viewportOptions.toolGroupId;\r\n await segmentationService.addSegmentationRepresentationToToolGroup(\r\n toolGroupId,\r\n segmentationId\r\n );\r\n\r\n segments.forEach(segment => {\r\n if (segment === null) {\r\n return;\r\n }\r\n segmentationService.addSegment(segmentationId, {\r\n segmentIndex: segment.segmentIndex,\r\n toolGroupId,\r\n properties: {\r\n color: segment.color,\r\n label: segment.label,\r\n opacity: segment.opacity,\r\n isLocked: segment.isLocked,\r\n visibility: segment.isVisible,\r\n active: segmentation.activeSegmentIndex === segment.segmentIndex,\r\n },\r\n });\r\n });\r\n\r\n if (segmentation.centroidsIJK) {\r\n segmentationService.setCentroids(segmentation.id, segmentation.centroidsIJK);\r\n }\r\n\r\n return segmentationId;\r\n },\r\n });\r\n },\r\n /**\r\n * Loads segmentation display sets for a specified viewport.\r\n * Depending on the modality of the display set (SEG or RTSTRUCT),\r\n * it chooses the appropriate service function to create\r\n * the segmentation for the display set.\r\n * The function then prepares the viewport for rendering segmentation.\r\n *\r\n * @param {Object} params - Parameters for the function.\r\n * @param params.viewportId - ID of the viewport where the segmentation display sets should be loaded.\r\n * @param params.displaySets - Array of display sets to be loaded for segmentation.\r\n *\r\n */\r\n loadSegmentationDisplaySetsForViewport: async ({ viewportId, displaySets }) => {\r\n // Todo: handle adding more than one segmentation\r\n const displaySet = displaySets[0];\r\n\r\n updateViewportsForSegmentationRendering({\r\n viewportId,\r\n servicesManager,\r\n referencedDisplaySetInstanceUID: displaySet.referencedDisplaySetInstanceUID,\r\n loadFn: async () => {\r\n const segDisplaySet = displaySet;\r\n const suppressEvents = false;\r\n const serviceFunction =\r\n segDisplaySet.Modality === 'SEG'\r\n ? 'createSegmentationForSEGDisplaySet'\r\n : 'createSegmentationForRTDisplaySet';\r\n\r\n const boundFn = segmentationService[serviceFunction].bind(segmentationService);\r\n const segmentationId = await boundFn(segDisplaySet, null, suppressEvents);\r\n\r\n return segmentationId;\r\n },\r\n });\r\n },\r\n /**\r\n * Generates a segmentation from a given segmentation ID.\r\n * This function retrieves the associated segmentation and\r\n * its referenced volume, extracts label maps from the\r\n * segmentation volume, and produces segmentation data\r\n * alongside associated metadata.\r\n *\r\n * @param {Object} params - Parameters for the function.\r\n * @param params.segmentationId - ID of the segmentation to be generated.\r\n * @param params.options - Optional configuration for the generation process.\r\n *\r\n * @returns Returns the generated segmentation data.\r\n */\r\n generateSegmentation: ({ segmentationId, options = {} }) => {\r\n const segmentation = cornerstoneToolsSegmentation.state.getSegmentation(segmentationId);\r\n\r\n const { referencedVolumeId } = segmentation.representationData.LABELMAP;\r\n\r\n const segmentationVolume = cache.getVolume(segmentationId);\r\n const referencedVolume = cache.getVolume(referencedVolumeId);\r\n const referencedImages = referencedVolume.getCornerstoneImages();\r\n\r\n const labelmapObj = generateLabelMaps2DFrom3D(segmentationVolume);\r\n\r\n // Generate fake metadata as an example\r\n labelmapObj.metadata = [];\r\n\r\n const segmentationInOHIF = segmentationService.getSegmentation(segmentationId);\r\n labelmapObj.segmentsOnLabelmap.forEach(segmentIndex => {\r\n // segmentation service already has a color for each segment\r\n const segment = segmentationInOHIF?.segments[segmentIndex];\r\n const { label, color } = segment;\r\n\r\n const RecommendedDisplayCIELabValue = dcmjs.data.Colors.rgb2DICOMLAB(\r\n color.slice(0, 3).map(value => value / 255)\r\n ).map(value => Math.round(value));\r\n\r\n const segmentMetadata = {\r\n SegmentNumber: segmentIndex.toString(),\r\n SegmentLabel: label,\r\n SegmentAlgorithmType: 'MANUAL',\r\n SegmentAlgorithmName: 'OHIF Brush',\r\n RecommendedDisplayCIELabValue,\r\n SegmentedPropertyCategoryCodeSequence: {\r\n CodeValue: 'T-D0050',\r\n CodingSchemeDesignator: 'SRT',\r\n CodeMeaning: 'Tissue',\r\n },\r\n SegmentedPropertyTypeCodeSequence: {\r\n CodeValue: 'T-D0050',\r\n CodingSchemeDesignator: 'SRT',\r\n CodeMeaning: 'Tissue',\r\n },\r\n };\r\n labelmapObj.metadata[segmentIndex] = segmentMetadata;\r\n });\r\n\r\n const generatedSegmentation = generateSegmentation(\r\n referencedImages,\r\n labelmapObj,\r\n metaData,\r\n options\r\n );\r\n\r\n return generatedSegmentation;\r\n },\r\n /**\r\n * Downloads a segmentation based on the provided segmentation ID.\r\n * This function retrieves the associated segmentation and\r\n * uses it to generate the corresponding DICOM dataset, which\r\n * is then downloaded with an appropriate filename.\r\n *\r\n * @param {Object} params - Parameters for the function.\r\n * @param params.segmentationId - ID of the segmentation to be downloaded.\r\n *\r\n */\r\n downloadSegmentation: ({ segmentationId }) => {\r\n const segmentationInOHIF = segmentationService.getSegmentation(segmentationId);\r\n const generatedSegmentation = actions.generateSegmentation({\r\n segmentationId,\r\n });\r\n\r\n downloadDICOMData(generatedSegmentation.dataset, `${segmentationInOHIF.label}`);\r\n },\r\n /**\r\n * Stores a segmentation based on the provided segmentationId into a specified data source.\r\n * The SeriesDescription is derived from user input or defaults to the segmentation label,\r\n * and in its absence, defaults to 'Research Derived Series'.\r\n *\r\n * @param {Object} params - Parameters for the function.\r\n * @param params.segmentationId - ID of the segmentation to be stored.\r\n * @param params.dataSource - Data source where the generated segmentation will be stored.\r\n *\r\n * @returns {Object|void} Returns the naturalized report if successfully stored,\r\n * otherwise throws an error.\r\n */\r\n storeSegmentation: async ({ segmentationId, dataSource }) => {\r\n const promptResult = await createReportDialogPrompt(uiDialogService, {\r\n extensionManager,\r\n });\r\n\r\n if (promptResult.action !== 1 && promptResult.value) {\r\n return;\r\n }\r\n\r\n const segmentation = segmentationService.getSegmentation(segmentationId);\r\n\r\n if (!segmentation) {\r\n throw new Error('No segmentation found');\r\n }\r\n\r\n const { label } = segmentation;\r\n const SeriesDescription = promptResult.value || label || 'Research Derived Series';\r\n\r\n const generatedData = actions.generateSegmentation({\r\n segmentationId,\r\n options: {\r\n SeriesDescription,\r\n },\r\n });\r\n\r\n if (!generatedData || !generatedData.dataset) {\r\n throw new Error('Error during segmentation generation');\r\n }\r\n\r\n const { dataset: naturalizedReport } = generatedData;\r\n\r\n await dataSource.store.dicom(naturalizedReport);\r\n\r\n // The \"Mode\" route listens for DicomMetadataStore changes\r\n // When a new instance is added, it listens and\r\n // automatically calls makeDisplaySets\r\n\r\n // add the information for where we stored it to the instance as well\r\n naturalizedReport.wadoRoot = dataSource.getConfig().wadoRoot;\r\n\r\n DicomMetadataStore.addInstances([naturalizedReport], true);\r\n\r\n return naturalizedReport;\r\n },\r\n /**\r\n * Converts segmentations into RTSS for download.\r\n * This sample function retrieves all segentations and passes to\r\n * cornerstone tool adapter to convert to DICOM RTSS format. It then\r\n * converts dataset to downloadable blob.\r\n *\r\n */\r\n downloadRTSS: ({ segmentationId }) => {\r\n const segmentations = segmentationService.getSegmentation(segmentationId);\r\n const vtkUtils = {\r\n vtkImageMarchingSquares,\r\n vtkDataArray,\r\n vtkImageData,\r\n };\r\n\r\n const RTSS = generateRTSSFromSegmentations(\r\n segmentations,\r\n classes.MetadataProvider,\r\n DicomMetadataStore,\r\n cache,\r\n cornerstoneToolsEnums,\r\n vtkUtils\r\n );\r\n\r\n try {\r\n const reportBlob = datasetToBlob(RTSS);\r\n\r\n //Create a URL for the binary.\r\n const objectUrl = URL.createObjectURL(reportBlob);\r\n window.location.assign(objectUrl);\r\n } catch (e) {\r\n console.warn(e);\r\n }\r\n },\r\n };\r\n\r\n const definitions = {\r\n getUpdatedViewportsForSegmentation: {\r\n commandFn: actions.getUpdatedViewportsForSegmentation,\r\n },\r\n loadSegmentationDisplaySetsForViewport: {\r\n commandFn: actions.loadSegmentationDisplaySetsForViewport,\r\n },\r\n loadSegmentationsForViewport: {\r\n commandFn: actions.loadSegmentationsForViewport,\r\n },\r\n createEmptySegmentationForViewport: {\r\n commandFn: actions.createEmptySegmentationForViewport,\r\n },\r\n generateSegmentation: {\r\n commandFn: actions.generateSegmentation,\r\n },\r\n downloadSegmentation: {\r\n commandFn: actions.downloadSegmentation,\r\n },\r\n storeSegmentation: {\r\n commandFn: actions.storeSegmentation,\r\n },\r\n downloadRTSS: {\r\n commandFn: actions.downloadRTSS,\r\n },\r\n };\r\n\r\n return {\r\n actions,\r\n definitions,\r\n };\r\n};\r\n\r\nexport default commandsModule;\r\n","import { id } from './id';\r\nimport React from 'react';\r\n\r\nimport getSopClassHandlerModule from './getSopClassHandlerModule';\r\nimport getHangingProtocolModule from './getHangingProtocolModule';\r\nimport getPanelModule from './getPanelModule';\r\nimport getCommandsModule from './commandsModule';\r\nimport preRegistration from './init';\r\n\r\nconst Component = React.lazy(() => {\r\n return import(/* webpackPrefetch: true */ './viewports/OHIFCornerstoneSEGViewport');\r\n});\r\n\r\nconst OHIFCornerstoneSEGViewport = props => {\r\n return (\r\n Loading...}>\r\n \r\n \r\n );\r\n};\r\n\r\n/**\r\n * You can remove any of the following modules if you don't need them.\r\n */\r\nconst extension = {\r\n /**\r\n * Only required property. Should be a unique value across all extensions.\r\n * You ID can be anything you want, but it should be unique.\r\n */\r\n id,\r\n preRegistration,\r\n\r\n /**\r\n * PanelModule should provide a list of panels that will be available in OHIF\r\n * for Modes to consume and render. Each panel is defined by a {name,\r\n * iconName, iconLabel, label, component} object. Example of a panel module\r\n * is the StudyBrowserPanel that is provided by the default extension in OHIF.\r\n */\r\n getPanelModule,\r\n getCommandsModule,\r\n\r\n getViewportModule({ servicesManager, extensionManager }) {\r\n const ExtendedOHIFCornerstoneSEGViewport = props => {\r\n return (\r\n \r\n );\r\n };\r\n\r\n return [{ name: 'dicom-seg', component: ExtendedOHIFCornerstoneSEGViewport }];\r\n },\r\n /**\r\n * SopClassHandlerModule should provide a list of sop class handlers that will be\r\n * available in OHIF for Modes to consume and use to create displaySets from Series.\r\n * Each sop class handler is defined by a { name, sopClassUids, getDisplaySetsFromSeries}.\r\n * Examples include the default sop class handler provided by the default extension\r\n */\r\n getSopClassHandlerModule,\r\n getHangingProtocolModule,\r\n};\r\n\r\nexport default extension;\r\n","import { addTool, BrushTool } from '@cornerstonejs/tools';\r\n\r\nexport default function init({ configuration = {} }): void {\r\n addTool(BrushTool);\r\n}\r\n"],"names":["id","packageJson","SOPClassHandlerId","sopClassUids","loadPromises","_getDisplaySetsFromSeries","instances","servicesManager","extensionManager","instance","StudyInstanceUID","SeriesInstanceUID","SOPInstanceUID","SeriesDescription","SeriesNumber","SeriesDate","SOPClassUID","wadoRoot","wadoUri","wadoUriRoot","displaySet","Modality","loading","isReconstructable","displaySetInstanceUID","utils","guid","referencedImages","referencedSeriesInstanceUID","referencedDisplaySetInstanceUID","isDerivedDisplaySet","isLoaded","isHydrated","segments","isOverlayDisplaySet","referencedSeriesSequence","ReferencedSeriesSequence","console","error","referencedSeries","ReferencedInstanceSequence","getReferenceDisplaySet","displaySetService","services","referencedDisplaySets","getDisplaySetsForSeries","length","Error","referencedDisplaySet","referencedVolumeURI","referencedVolumeId","load","async","headers","_ref","segDisplaySet","segmentationService","getSegmentation","_segmentationExists","Promise","resolve","reject","Object","keys","_ref2","utilityModule","getModuleEntry","dicomLoaderService","exports","arrayBuffer","findDicomDataPromise","cachedReferencedVolume","cache","getVolume","imageIds","tolerance","skipOverlapping","eventTarget","addEventListener","Enums","Events","SEGMENTATION_LOAD_PROGRESS","evt","percentComplete","detail","_broadcastEvent","EVENTS","SEGMENT_LOADING_COMPLETE","results","adaptersSEG","Cornerstone3D","Segmentation","generateToolState","metaData","triggerEvent","segMetadata","data","forEach","i","cielab","rgba","RecommendedDisplayCIELabValue","dcmjs","Colors","dicomlab2RGB","map","x","Math","round","assign","_loadSegments","suppressEvents","createSegmentationForSEGDisplaySet","then","catch","_load","_ref3","name","getDisplaySetsFromSeries","segProtocol","protocolMatchingRules","toolGroupIds","numberOfPriorsReferenced","defaultViewport","viewportOptions","viewportType","toolGroupId","allowUnmatchedView","displaySets","matchedDisplaySetsIndex","displaySetSelectors","segDisplaySetId","seriesMatchingRules","attribute","constraint","equals","stages","viewportStructure","layoutType","properties","rows","columns","viewports","protocol","uiDialogService","label","callback","dialogId","onSubmitHandler","action","value","dismiss","create","centralize","isDraggable","showOverlay","content","Dialog","contentProps","title","noCloseButton","onClose","actions","text","type","ButtonEnums","secondary","primary","onSubmit","body","setValue","React","Input","labelClassName","autoFocus","className","onChange","event","persist","target","onKeyPress","key","rgbaColor","ChromePicker","color","rgb","presetColors","width","PanelSegmentation","commandsManager","configuration","viewportGridService","t","useTranslation","selectedSegmentationId","setSelectedSegmentationId","useState","segmentationConfiguration","setSegmentationConfiguration","getConfiguration","segmentations","setSegmentations","getSegmentations","useEffect","added","SEGMENTATION_ADDED","updated","SEGMENTATION_UPDATED","removed","SEGMENTATION_REMOVED","subscriptions","unsubscribe","subscribe","push","unsub","getToolGroupIds","segmentationId","getToolGroupIdsWithSegmentation","_setSegmentationConfiguration","useCallback","setConfiguration","SegmentationGroupTable","disableEditing","activeSegmentationId","onSegmentationAdd","runCommand","onSegmentationClick","setActiveSegmentationForToolGroup","onSegmentationDelete","remove","onSegmentationDownload","onSegmentationDownloadRTSS","storeSegmentation","datasources","getActiveDataSource","displaySetInstanceUIDs","createReportAsync","getReport","dataSource","reportType","setDisplaySetsForViewport","viewportId","getActiveViewportId","onSegmentationEdit","segmentation","callInputDialog","actionId","addOrUpdateSegmentation","onSegmentClick","segmentIndex","setActiveSegment","jumpToSegmentCenter","onSegmentEdit","segment","setSegmentLabel","onSegmentAdd","addSegment","onSegmentColorClick","opacity","r","g","b","a","callColorPickerDialog","newRgbaColor","setSegmentRGBAColor","onSegmentDelete","removeSegment","onToggleSegmentVisibility","isVisible","setSegmentVisibility","onToggleSegmentLock","toggleSegmentLocked","onToggleSegmentationVisibility","toggleSegmentationVisibility","showDeleteSegment","segmentationConfig","initialConfig","setRenderOutline","setOutlineOpacityActive","setRenderFill","setRenderInactiveSegmentations","setOutlineWidthActive","setFillAlpha","setFillAlphaInactive","propTypes","PropTypes","isRequired","segmentationUtils","utilities","TOOL_TYPES","CIRCULAR_BRUSH","SPHERE_BRUSH","CIRCULAR_ERASER","SPHERE_ERASER","CIRCLE_SHAPE","RECTANGLE_SHAPE","SPHERE_SHAPE","THRESHOLD_CIRCULAR_BRUSH","THRESHOLD_SPHERE_BRUSH","ACTIONS","SET_TOOL_CONFIG","SET_ACTIVE_TOOL","initialState","Brush","brushSize","mode","Eraser","Shapes","ThresholdBrush","thresholdRange","activeTool","toolboxReducer","state","tool","config","payload","_getToolNamesFromCategory","category","toolNames","toolbarService","toolGroupService","viewportGrid","useViewportGrid","activeViewportId","toolsEnabled","setToolsEnabled","dispatch","useReducer","updateActiveTool","size","undefined","viewport","get","getActiveToolForViewport","setToolActive","toolName","recordInteraction","interactionType","commands","commandName","commandOptions","events","unsubscriptions","activeSegmentation","find","seg","isActive","segmentCount","TOOL_BAR_STATE_MODIFIED","values","includes","updateBrushSize","setBrushSizeForToolGroup","onBrushSizeChange","valueAsStringOrNumber","toolCategory","Number","handleRangeChange","newRange","getToolGroup","setToolConfiguration","strategySpecificConfiguration","THRESHOLD_INSIDE_CIRCLE","threshold","AdvancedToolbox","items","icon","disabled","active","onClick","options","min","max","step","children","InputDoubleRange","minValue","maxValue","showLabel","allowNumberEdit","showAdjustmentArrows","customizationService","iconName","iconLabel","component","appConfig","useAppConfig","disableEditingForMode","SegmentationToolbox","updateViewportsForSegmentationRendering","loadFn","cornerstoneViewportService","getTargetViewport","targetViewportId","updatedViewports","getUpdatedViewportsForSegmentation","createSegmentationForVolume","hydrateSegmentation","volumeExists","Array","from","_volumeCache","some","volumeId","needsRerendering","csViewport","getCornerstoneViewport","prevCamera","getCamera","createNewSegmentationWhenVolumeMounts","isTheActiveViewportVolumeMounted","volumeActors","ac","uid","volumeViewport","setCamera","element","removeEventListener","VOLUME_VIEWPORT_NEW_VOLUME","setDisplaySetsForViewports","getState","hangingProtocolService","referenceDisplaySetInstanceUID","segmentationFrameOfReferenceUID","getDisplaySetByUID","FrameOfReferenceUID","getViewportsRequireUpdate","v","shouldRenderSegmentation","datasetToBlob","generateLabelMaps2DFrom3D","generateSegmentation","RTSS","generateRTSSFromSegmentations","adaptersRT","downloadDICOMData","helpers","uiNotificationService","createEmptySegmentationForViewport","currentSegmentations","createSegmentationForDisplaySet","addSegmentationRepresentationToToolGroup","show","message","loadSegmentationsForViewport","scalarData","getLabelmapVolume","set","isLocked","visibility","activeSegmentIndex","centroidsIJK","setCentroids","loadSegmentationDisplaySetsForViewport","_ref4","serviceFunction","boundFn","bind","_ref5","cornerstoneToolsSegmentation","representationData","LABELMAP","segmentationVolume","getCornerstoneImages","labelmapObj","metadata","segmentationInOHIF","segmentsOnLabelmap","rgb2DICOMLAB","slice","segmentMetadata","SegmentNumber","toString","SegmentLabel","SegmentAlgorithmType","SegmentAlgorithmName","SegmentedPropertyCategoryCodeSequence","CodeValue","CodingSchemeDesignator","CodeMeaning","SegmentedPropertyTypeCodeSequence","downloadSegmentation","_ref6","generatedSegmentation","dataset","_ref7","promptResult","createReportDialogPrompt","generatedData","naturalizedReport","store","dicom","getConfig","DicomMetadataStore","addInstances","downloadRTSS","_ref8","vtkUtils","vtkImageMarchingSquares","vtkDataArray","vtkImageData","classes","MetadataProvider","cornerstoneToolsEnums","reportBlob","objectUrl","URL","createObjectURL","window","location","e","warn","definitions","commandFn","Component","OHIFCornerstoneSEGViewport","props","fallback","preRegistration","addTool","BrushTool","getPanelModule","getCommandsModule","getViewportModule","_extends","getSopClassHandlerModule","getHangingProtocolModule"],"sourceRoot":""} \ No newline at end of file diff --git a/resources/221.css b/resources/221.css new file mode 100644 index 0000000..1aef881 --- /dev/null +++ b/resources/221.css @@ -0,0 +1,4 @@ +.dicom-tag-browser-table{margin-left:auto;margin-right:auto}.dicom-tag-browser-table-wrapper{overflow-x:scroll}.dicom-tag-browser-table tr{border-top:1px solid #ddd;color:#fff;padding-left:10px;padding-right:10px;white-space:nowrap}.stick{overflow:clip;position:sticky}.dicom-tag-browser-content{overflow:hidden;padding-bottom:50px;width:100%}.dicom-tag-browser-instance-range .range{height:20px}.dicom-tag-browser-instance-range{padding:20px 0}.dicom-tag-browser-table td.dicom-tag-browser-table-center{text-align:center}.dicom-tag-browser-table th{color:"#20A5D6";padding-left:10px;padding-right:10px;text-align:center}.dicom-tag-browser-table th.dicom-tag-browser-table-left{text-align:left} +.chrome-picker{background:#090c29!important} + +/*# sourceMappingURL=221.css.map*/ \ No newline at end of file diff --git a/resources/221.css.map b/resources/221.css.map new file mode 100644 index 0000000..2151250 --- /dev/null +++ b/resources/221.css.map @@ -0,0 +1 @@ +{"version":3,"file":"221.css","mappings":"AAAA,yBAEE,gBAAiB,CADjB,iBAEF,CAEA,iCAGE,iBACF,CAEA,4BAIE,yBAA0B,CAD1B,UAAc,CAFd,iBAAkB,CAClB,kBAAmB,CAGnB,kBACF,CAEA,OAEE,aAAc,CADd,eAEF,CAEA,2BACE,eAAgB,CAEhB,mBAAoB,CADpB,UAGF,CAEA,yCACE,WACF,CAEA,kCACE,cACF,CAEA,2DACE,iBACF,CAEA,4BAIE,eAAgB,CAHhB,iBAAkB,CAClB,kBAAmB,CACnB,iBAEF,CAEA,yDACE,eACF,C;ACpDA,eACE,4BACF,C","sources":["webpack:///../../../extensions/default/src/DicomTagBrowser/DicomTagBrowser.css","webpack:///../../../extensions/cornerstone-dicom-seg/src/panels/colorPickerDialog.css"],"sourcesContent":[".dicom-tag-browser-table {\r\n margin-right: auto;\r\n margin-left: auto;\r\n}\r\n\r\n.dicom-tag-browser-table-wrapper {\r\n /* height: 500px;*/\r\n /*overflow-y: scroll;*/\r\n overflow-x: scroll;\r\n}\r\n\r\n.dicom-tag-browser-table tr {\r\n padding-left: 10px;\r\n padding-right: 10px;\r\n color: #ffffff;\r\n border-top: 1px solid #ddd;\r\n white-space: nowrap;\r\n}\r\n\r\n.stick {\r\n position: sticky;\r\n overflow: clip;\r\n}\r\n\r\n.dicom-tag-browser-content {\r\n overflow: hidden;\r\n width: 100%;\r\n padding-bottom: 50px;\r\n /*height: 500px;*/\r\n}\r\n\r\n.dicom-tag-browser-instance-range .range {\r\n height: 20px;\r\n}\r\n\r\n.dicom-tag-browser-instance-range {\r\n padding: 20px 0 20px 0;\r\n}\r\n\r\n.dicom-tag-browser-table td.dicom-tag-browser-table-center {\r\n text-align: center;\r\n}\r\n\r\n.dicom-tag-browser-table th {\r\n padding-left: 10px;\r\n padding-right: 10px;\r\n text-align: center;\r\n color: '#20A5D6';\r\n}\r\n\r\n.dicom-tag-browser-table th.dicom-tag-browser-table-left {\r\n text-align: left;\r\n}\r\n",".chrome-picker {\r\n background: #090c29 !important;\r\n}\r\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/resources/23.bundle.8fdf916770f44e0ecae2.js b/resources/23.bundle.8fdf916770f44e0ecae2.js new file mode 100644 index 0000000..272dfe8 --- /dev/null +++ b/resources/23.bundle.8fdf916770f44e0ecae2.js @@ -0,0 +1,2 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[23],{7023:(e,t,n)=>{n.d(t,{ZP:()=>Y});var r=n(43001),i=n(14347),o=function(e,t){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},o(e,t)};function c(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function n(){this.constructor=e}o(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}function a(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var i=0;for(r=Object.getOwnPropertySymbols(e);i=t||n<0||s&&e-f>=o}function v(){var e=U();if(h(e))return y(e);a=setTimeout(v,function(e){var n=t-(e-u);return s?I(n,o-(e-f)):n}(e))}function y(e){return a=void 0,d&&r?p(e):(r=i=void 0,c)}function b(){var e=U(),n=h(e);if(r=arguments,i=this,u=e,n){if(void 0===a)return function(e){return f=e,a=setTimeout(v,t),l?p(e):c}(u);if(s)return clearTimeout(a),a=setTimeout(v,t),p(u)}return void 0===a&&(a=setTimeout(v,t)),c}return t=$(t)||0,F(n)&&(l=!!n.leading,o=(s="maxWait"in n)?q($(n.maxWait)||0,t):o,d="trailing"in n?!!n.trailing:d),b.cancel=function(){void 0!==a&&clearTimeout(a),f=0,r=u=i=a=void 0},b.flush=function(){return void 0===a?c:y(U())},b},V=L,Z=f;var B=function(e,t,n){var r=!0,i=!0;if("function"!=typeof e)throw new TypeError("Expected a function");return Z(n)&&(r="leading"in n?!!n.leading:r,i="trailing"in n?!!n.trailing:i),V(e,t,{leading:r,maxWait:t,trailing:i})},G=function(e,t,n,r){switch(t){case"debounce":return L(e,n,r);case"throttle":return B(e,n,r);default:return e}},J=function(e){return"function"==typeof e},K=function(){return"undefined"==typeof window},Q=function(e){return e instanceof Element||e instanceof HTMLDocument},X=function(e,t,n,r){return function(i){var o=i.width,c=i.height;t((function(t){return t.width===o&&t.height===c||t.width===o&&!r||t.height===c&&!n?t:(e&&J(e)&&e(o,c),{width:o,height:c})}))}},Y=function(e){function t(t){var n=e.call(this,t)||this;n.cancelHandler=function(){n.resizeHandler&&n.resizeHandler.cancel&&(n.resizeHandler.cancel(),n.resizeHandler=null)},n.attachObserver=function(){var e=n.props,t=e.targetRef,r=e.observerOptions;if(!K()){t&&t.current&&(n.targetRef.current=t.current);var i=n.getElement();i&&(n.observableElement&&n.observableElement===i||(n.observableElement=i,n.resizeObserver.observe(i,r)))}},n.getElement=function(){var e=n.props,t=e.querySelector,r=e.targetDomEl;if(K())return null;if(t)return document.querySelector(t);if(r&&Q(r))return r;if(n.targetRef&&Q(n.targetRef.current))return n.targetRef.current;var o=(0,i.findDOMNode)(n);if(!o)return null;switch(n.getRenderType()){case"renderProp":case"childFunction":case"child":case"childArray":return o;default:return o.parentElement}},n.createResizeHandler=function(e){var t=n.props,r=t.handleWidth,i=void 0===r||r,o=t.handleHeight,c=void 0===o||o,a=t.onResize;if(i||c){var u=X(a,n.setState.bind(n),i,c);e.forEach((function(e){var t=e&&e.contentRect||{},r=t.width,i=t.height;!n.skipOnMount&&!K()&&u({width:r,height:i}),n.skipOnMount=!1}))}},n.getRenderType=function(){var e=n.props,t=e.render,i=e.children;return J(t)?"renderProp":J(i)?"childFunction":(0,r.isValidElement)(i)?"child":Array.isArray(i)?"childArray":"parent"};var o=t.skipOnMount,c=t.refreshMode,a=t.refreshRate,u=void 0===a?1e3:a,f=t.refreshOptions;return n.state={width:void 0,height:void 0},n.skipOnMount=o,n.targetRef=(0,r.createRef)(),n.observableElement=null,K()||(n.resizeHandler=G(n.createResizeHandler,c,u,f),n.resizeObserver=new window.ResizeObserver(n.resizeHandler)),n}return c(t,e),t.prototype.componentDidMount=function(){this.attachObserver()},t.prototype.componentDidUpdate=function(){this.attachObserver()},t.prototype.componentWillUnmount=function(){K()||(this.resizeObserver.disconnect(),this.cancelHandler())},t.prototype.render=function(){var e,t=this.props,n=t.render,i=t.children,o=t.nodeType,c=void 0===o?"div":o,u=this.state,f={width:u.width,height:u.height,targetRef:this.targetRef};switch(this.getRenderType()){case"renderProp":return n&&n(f);case"childFunction":return(e=i)(f);case"child":if((e=i).type&&"string"==typeof e.type){var l=a(f,["targetRef"]);return(0,r.cloneElement)(e,l)}return(0,r.cloneElement)(e,f);case"childArray":return(e=i).map((function(e){return!!e&&(0,r.cloneElement)(e,f)}));default:return r.createElement(c,null)}},t}(r.PureComponent);K()?r.useEffect:r.useLayoutEffect}}]); +//# sourceMappingURL=23.bundle.8fdf916770f44e0ecae2.js.map \ No newline at end of file diff --git a/resources/23.bundle.8fdf916770f44e0ecae2.js.map b/resources/23.bundle.8fdf916770f44e0ecae2.js.map new file mode 100644 index 0000000..587be35 --- /dev/null +++ b/resources/23.bundle.8fdf916770f44e0ecae2.js.map @@ -0,0 +1 @@ +{"version":3,"file":"23.bundle.8fdf916770f44e0ecae2.js","mappings":"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","sources":["webpack:///../../../node_modules/react-resize-detector/node_modules/tslib/tslib.es6.js","webpack:///../../../node_modules/react-resize-detector/node_modules/lodash/isObject.js","webpack:///../../../node_modules/react-resize-detector/node_modules/lodash/_root.js","webpack:///../../../node_modules/react-resize-detector/node_modules/lodash/_freeGlobal.js","webpack:///../../../node_modules/react-resize-detector/node_modules/lodash/now.js","webpack:///../../../node_modules/react-resize-detector/node_modules/lodash/_trimmedEndIndex.js","webpack:///../../../node_modules/react-resize-detector/node_modules/lodash/_baseTrim.js","webpack:///../../../node_modules/react-resize-detector/node_modules/lodash/_Symbol.js","webpack:///../../../node_modules/react-resize-detector/node_modules/lodash/_getRawTag.js","webpack:///../../../node_modules/react-resize-detector/node_modules/lodash/_objectToString.js","webpack:///../../../node_modules/react-resize-detector/node_modules/lodash/_baseGetTag.js","webpack:///../../../node_modules/react-resize-detector/node_modules/lodash/isSymbol.js","webpack:///../../../node_modules/react-resize-detector/node_modules/lodash/isObjectLike.js","webpack:///../../../node_modules/react-resize-detector/node_modules/lodash/toNumber.js","webpack:///../../../node_modules/react-resize-detector/node_modules/lodash/debounce.js","webpack:///../../../node_modules/react-resize-detector/node_modules/lodash/throttle.js","webpack:///../../../node_modules/react-resize-detector/src/utils.ts","webpack:///../../../node_modules/react-resize-detector/src/ResizeDetector.tsx","webpack:///../../../node_modules/react-resize-detector/src/useResizeDetector.ts"],"sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n","var root = require('./_root');\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\nmodule.exports = now;\n","/** Used to match a single whitespace character. */\nvar reWhitespace = /\\s/;\n\n/**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n * character of `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the index of the last non-whitespace character.\n */\nfunction trimmedEndIndex(string) {\n var index = string.length;\n\n while (index-- && reWhitespace.test(string.charAt(index))) {}\n return index;\n}\n\nmodule.exports = trimmedEndIndex;\n","var trimmedEndIndex = require('./_trimmedEndIndex');\n\n/** Used to match leading whitespace. */\nvar reTrimStart = /^\\s+/;\n\n/**\n * The base implementation of `_.trim`.\n *\n * @private\n * @param {string} string The string to trim.\n * @returns {string} Returns the trimmed string.\n */\nfunction baseTrim(string) {\n return string\n ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n : string;\n}\n\nmodule.exports = baseTrim;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n","var Symbol = require('./_Symbol');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nmodule.exports = getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n","var Symbol = require('./_Symbol'),\n getRawTag = require('./_getRawTag'),\n objectToString = require('./_objectToString');\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n","var baseTrim = require('./_baseTrim'),\n isObject = require('./isObject'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = baseTrim(value);\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = toNumber;\n","var isObject = require('./isObject'),\n now = require('./now'),\n toNumber = require('./toNumber');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n timeWaiting = wait - timeSinceLastCall;\n\n return maxing\n ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n : timeWaiting;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n clearTimeout(timerId);\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\nmodule.exports = debounce;\n","var debounce = require('./debounce'),\n isObject = require('./isObject');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a throttled function that only invokes `func` at most once per\n * every `wait` milliseconds. The throttled function comes with a `cancel`\n * method to cancel delayed `func` invocations and a `flush` method to\n * immediately invoke them. Provide `options` to indicate whether `func`\n * should be invoked on the leading and/or trailing edge of the `wait`\n * timeout. The `func` is invoked with the last arguments provided to the\n * throttled function. Subsequent calls to the throttled function return the\n * result of the last `func` invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the throttled function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.throttle` and `_.debounce`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to throttle.\n * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=true]\n * Specify invoking on the leading edge of the timeout.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new throttled function.\n * @example\n *\n * // Avoid excessively updating the position while scrolling.\n * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n *\n * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\n * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n * jQuery(element).on('click', throttled);\n *\n * // Cancel the trailing throttled invocation.\n * jQuery(window).on('popstate', throttled.cancel);\n */\nfunction throttle(func, wait, options) {\n var leading = true,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n if (isObject(options)) {\n leading = 'leading' in options ? !!options.leading : leading;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n return debounce(func, wait, {\n 'leading': leading,\n 'maxWait': wait,\n 'trailing': trailing\n });\n}\n\nmodule.exports = throttle;\n","import debounce from 'lodash/debounce';\nimport throttle from 'lodash/throttle';\n\nimport { Props, ReactResizeDetectorDimensions } from './ResizeDetector';\n\nexport type patchResizeHandlerType = ReturnType | ReturnType | ResizeObserverCallback;\n\nexport const patchResizeHandler = (\n resizeCallback: ResizeObserverCallback,\n refreshMode: Props['refreshMode'],\n refreshRate: Props['refreshRate'],\n refreshOptions: Props['refreshOptions']\n): patchResizeHandlerType => {\n switch (refreshMode) {\n case 'debounce':\n return debounce(resizeCallback, refreshRate, refreshOptions);\n case 'throttle':\n return throttle(resizeCallback, refreshRate, refreshOptions);\n default:\n return resizeCallback;\n }\n};\n\nexport const isFunction = (fn: any): boolean => typeof fn === 'function';\n\nexport const isSSR = (): boolean => typeof window === 'undefined';\n\nexport const isDOMElement = (element: any): boolean => element instanceof Element || element instanceof HTMLDocument;\n\nexport const createNotifier =\n (\n onResize: Props['onResize'],\n setSize: React.Dispatch>,\n handleWidth: boolean,\n handleHeight: boolean\n ) =>\n ({ width, height }: ReactResizeDetectorDimensions): void => {\n setSize(prev => {\n if (prev.width === width && prev.height === height) {\n // skip if dimensions haven't changed\n return prev;\n }\n\n if ((prev.width === width && !handleHeight) || (prev.height === height && !handleWidth)) {\n // process `handleHeight/handleWidth` props\n return prev;\n }\n\n if (onResize && isFunction(onResize)) {\n onResize(width, height);\n }\n\n return { width, height };\n });\n };\n","import * as React from 'react';\nimport { PureComponent, isValidElement, cloneElement, createRef, ReactNode, ReactElement, RefObject } from 'react';\nimport { findDOMNode } from 'react-dom';\n\nimport { patchResizeHandler, isFunction, isSSR, isDOMElement, createNotifier } from './utils';\n\nexport interface ReactResizeDetectorDimensions {\n height?: number;\n width?: number;\n}\n\ninterface ChildFunctionProps extends ReactResizeDetectorDimensions {\n targetRef?: RefObject;\n}\n\nexport interface Props {\n /**\n * Function that will be invoked with observable element's width and height.\n * Default: undefined\n */\n onResize?: (width?: number, height?: number) => void;\n /**\n * Trigger update on height change.\n * Default: true\n */\n handleHeight?: boolean;\n /**\n * Trigger onResize on width change.\n * Default: true\n */\n handleWidth?: boolean;\n /**\n * Do not trigger update when a component mounts.\n * Default: false\n */\n skipOnMount?: boolean;\n /**\n * Changes the update strategy. Possible values: \"throttle\" and \"debounce\".\n * See `lodash` docs for more information https://lodash.com/docs/\n * undefined - callback will be fired for every frame.\n * Default: undefined\n */\n refreshMode?: 'throttle' | 'debounce';\n /**\n * Set the timeout/interval for `refreshMode` strategy\n * Default: undefined\n */\n refreshRate?: number;\n /**\n * Pass additional params to `refreshMode` according to lodash docs\n * Default: undefined\n */\n refreshOptions?: { leading?: boolean; trailing?: boolean };\n /**\n * These options will be used as a second parameter of `resizeObserver.observe` method\n * @see https://developer.mozilla.org/en-US/docs/Web/API/ResizeObserver/observe\n * Default: undefined\n */\n observerOptions?: ResizeObserverOptions;\n}\n\nexport interface ComponentsProps extends Props {\n /**\n * A selector of an element to observe.\n * You can use this property to attach resize-observer to any DOM element.\n * Please refer to the querySelector docs.\n * Default: undefined\n * @deprecated since version 5.0.0. It will be removed in version 7.0.0.\n * Use targetRef instead\n */\n querySelector?: string;\n /**\n * Valid only for a callback-pattern.\n * Ignored for other render types.\n * Set resize-detector's node type.\n * You can pass any valid React node: string with node's name or element.\n * Can be useful when you need to handle table's or paragraph's resizes.\n * Default: \"div\"\n * @deprecated since version 5.0.0. It will be removed in version 7.0.0.\n * Use targetRef instead\n */\n nodeType?: keyof JSX.IntrinsicElements; // will be passed to React.createElement()\n /**\n * A DOM element to observe.\n * By default it's a parent element in relation to the ReactResizeDetector component.\n * But you can pass any DOM element to observe.\n * This property is omitted when you pass querySelector.\n * Default: undefined\n * @deprecated since version 5.0.0. It will be removed in version 6.0.0.\n * Use targetRef instead\n */\n targetDomEl?: ElementT;\n /**\n * A React reference of the element to observe.\n * Pass a reference to the element you want to attach resize handlers to.\n * It must be an instance of React.useRef or React.createRef functions\n * Default: undefined\n */\n targetRef?: RefObject;\n\n render?: (props: ReactResizeDetectorDimensions) => ReactNode;\n\n children?: ReactNode | ((props: ChildFunctionProps) => ReactNode);\n}\n\nclass ResizeDetector extends PureComponent<\n ComponentsProps,\n ReactResizeDetectorDimensions\n> {\n skipOnMount: boolean | undefined;\n targetRef;\n observableElement;\n resizeHandler;\n resizeObserver;\n constructor(props: ComponentsProps) {\n super(props);\n\n const { skipOnMount, refreshMode, refreshRate = 1000, refreshOptions } = props;\n\n this.state = {\n width: undefined,\n height: undefined\n };\n\n this.skipOnMount = skipOnMount;\n this.targetRef = createRef();\n this.observableElement = null;\n\n if (isSSR()) {\n return;\n }\n\n this.resizeHandler = patchResizeHandler(this.createResizeHandler, refreshMode, refreshRate, refreshOptions);\n this.resizeObserver = new window.ResizeObserver(this.resizeHandler);\n }\n\n componentDidMount(): void {\n this.attachObserver();\n }\n\n componentDidUpdate(): void {\n this.attachObserver();\n }\n\n componentWillUnmount(): void {\n if (isSSR()) {\n return;\n }\n this.resizeObserver.disconnect();\n this.cancelHandler();\n }\n\n cancelHandler = (): void => {\n if (this.resizeHandler && this.resizeHandler.cancel) {\n // cancel debounced handler\n this.resizeHandler.cancel();\n this.resizeHandler = null;\n }\n };\n\n attachObserver = (): void => {\n const { targetRef, observerOptions } = this.props;\n\n if (isSSR()) {\n return;\n }\n\n if (targetRef && targetRef.current) {\n this.targetRef.current = targetRef.current;\n }\n\n const element = this.getElement();\n if (!element) {\n // can't find element to observe\n return;\n }\n\n if (this.observableElement && this.observableElement === element) {\n // element is already observed\n return;\n }\n\n this.observableElement = element;\n this.resizeObserver.observe(element, observerOptions);\n };\n\n getElement = (): Element | Text | null => {\n const { querySelector, targetDomEl } = this.props;\n\n if (isSSR()) return null;\n\n // in case we pass a querySelector\n if (querySelector) return document.querySelector(querySelector);\n // in case we pass a DOM element\n if (targetDomEl && isDOMElement(targetDomEl)) return targetDomEl;\n // in case we pass a React ref using React.createRef()\n if (this.targetRef && isDOMElement(this.targetRef.current)) return this.targetRef.current;\n\n // the worse case when we don't receive any information from the parent and the library doesn't add any wrappers\n // we have to use a deprecated `findDOMNode` method in order to find a DOM element to attach to\n const currentElement = findDOMNode(this);\n\n if (!currentElement) return null;\n\n const renderType = this.getRenderType();\n switch (renderType) {\n case 'renderProp':\n return currentElement;\n case 'childFunction':\n return currentElement;\n case 'child':\n return currentElement;\n case 'childArray':\n return currentElement;\n default:\n return currentElement.parentElement;\n }\n };\n\n createResizeHandler: ResizeObserverCallback = (entries): void => {\n const { handleWidth = true, handleHeight = true, onResize } = this.props;\n\n if (!handleWidth && !handleHeight) return;\n\n const notifyResize = createNotifier(onResize, this.setState.bind(this), handleWidth, handleHeight);\n\n entries.forEach(entry => {\n const { width, height } = (entry && entry.contentRect) || {};\n\n const shouldSetSize = !this.skipOnMount && !isSSR();\n if (shouldSetSize) {\n notifyResize({ width, height });\n }\n\n this.skipOnMount = false;\n });\n };\n\n getRenderType = (): string => {\n const { render, children } = this.props;\n if (isFunction(render)) {\n // DEPRECATED. Use `Child Function Pattern` instead\n return 'renderProp';\n }\n\n if (isFunction(children)) {\n return 'childFunction';\n }\n\n if (isValidElement(children)) {\n return 'child';\n }\n\n if (Array.isArray(children)) {\n // DEPRECATED. Wrap children with a single parent\n return 'childArray';\n }\n\n // DEPRECATED. Use `Child Function Pattern` instead\n return 'parent';\n };\n\n render() {\n const { render, children, nodeType: WrapperTag = 'div' } = this.props;\n const { width, height } = this.state;\n\n const childProps = { width, height, targetRef: this.targetRef };\n const renderType = this.getRenderType();\n\n let typedChildren: any;\n\n switch (renderType) {\n case 'renderProp':\n return render && render(childProps);\n case 'childFunction':\n typedChildren = children as (props: ChildFunctionProps) => ReactNode;\n return typedChildren(childProps);\n case 'child':\n // @TODO bug prone logic\n typedChildren = children as ReactElement;\n if (typedChildren.type && typeof typedChildren.type === 'string') {\n // child is a native DOM elements such as div, span etc\n const { targetRef, ...nativeProps } = childProps;\n return cloneElement(typedChildren, nativeProps);\n }\n // class or functional component otherwise\n return cloneElement(typedChildren, childProps);\n case 'childArray':\n typedChildren = children as [ReactElement];\n return typedChildren.map((el: ReactElement) => !!el && cloneElement(el, childProps));\n default:\n return ;\n }\n }\n}\n\nexport default ResizeDetector;\n","import { useLayoutEffect, useEffect, useState, useRef, MutableRefObject } from 'react';\n\nimport { patchResizeHandler, createNotifier, isSSR } from './utils';\n\nimport { Props, ReactResizeDetectorDimensions } from './ResizeDetector';\n\nconst useEnhancedEffect = isSSR() ? useEffect : useLayoutEffect;\n\ninterface FunctionProps extends Props {\n targetRef?: ReturnType;\n}\n\nfunction useResizeDetector(props: FunctionProps = {}): UseResizeDetectorReturn {\n const {\n skipOnMount = false,\n refreshMode,\n refreshRate = 1000,\n refreshOptions,\n handleWidth = true,\n handleHeight = true,\n targetRef,\n observerOptions,\n onResize\n } = props;\n\n const skipResize: MutableRefObject = useRef(skipOnMount);\n const localRef = useRef(null);\n const ref = (targetRef ?? localRef) as MutableRefObject;\n const resizeHandler = useRef();\n\n const [size, setSize] = useState({\n width: undefined,\n height: undefined\n });\n\n useEnhancedEffect(() => {\n if (isSSR()) {\n return;\n }\n\n const notifyResize = createNotifier(onResize, setSize, handleWidth, handleHeight);\n\n const resizeCallback: ResizeObserverCallback = entries => {\n if (!handleWidth && !handleHeight) return;\n\n entries.forEach(entry => {\n const { width, height } = (entry && entry.contentRect) || {};\n\n const shouldSetSize = !skipResize.current && !isSSR();\n if (shouldSetSize) {\n notifyResize({ width, height });\n }\n\n skipResize.current = false;\n });\n };\n\n resizeHandler.current = patchResizeHandler(resizeCallback, refreshMode, refreshRate, refreshOptions);\n\n const resizeObserver = new window.ResizeObserver(resizeHandler.current as ResizeObserverCallback);\n\n if (ref.current) {\n // Something wrong with typings here...\n resizeObserver.observe(ref.current as any, observerOptions);\n }\n\n return () => {\n resizeObserver.disconnect();\n const patchedResizeHandler = resizeHandler.current as any;\n if (patchedResizeHandler && patchedResizeHandler.cancel) {\n patchedResizeHandler.cancel();\n }\n };\n }, [refreshMode, refreshRate, refreshOptions, handleWidth, handleHeight, onResize, observerOptions, ref.current]);\n\n return { ref, ...size };\n}\n\nexport default useResizeDetector;\n\nexport interface UseResizeDetectorReturn extends ReactResizeDetectorDimensions {\n ref: MutableRefObject;\n}\n"],"names":["extendStatics","d","b","Object","setPrototypeOf","__proto__","Array","p","prototype","hasOwnProperty","call","__extends","TypeError","String","__","this","constructor","create","__rest","s","e","t","indexOf","getOwnPropertySymbols","i","length","propertyIsEnumerable","value","type","freeGlobal","global","freeSelf","self","root","Function","Date","now","reWhitespace","trimmedEndIndex","string","index","test","charAt","reTrimStart","slice","replace","Symbol","require$$0","objectProto","nativeObjectToString","toString","symToStringTag","toStringTag","undefined","isOwn","tag","unmasked","result","getRawTag","require$$1","objectToString","baseGetTag","isObjectLike","baseTrim","isObject","isSymbol","reIsBadHex","reIsBinary","reIsOctal","freeParseInt","parseInt","toNumber","other","valueOf","isBinary","nativeMax","Math","max","nativeMin","min","func","wait","options","lastArgs","lastThis","maxWait","timerId","lastCallTime","lastInvokeTime","leading","maxing","trailing","invokeFunc","time","args","thisArg","apply","shouldInvoke","timeSinceLastCall","timerExpired","trailingEdge","setTimeout","timeWaiting","remainingWait","debounced","isInvoking","arguments","leadingEdge","clearTimeout","cancel","flush","debounce","patchResizeHandler","resizeCallback","refreshMode","refreshRate","refreshOptions","throttle","isFunction","fn","isSSR","window","isDOMElement","element","Element","HTMLDocument","createNotifier","onResize","setSize","handleWidth","handleHeight","width","height","prev","props","cancelHandler","resizeHandler","attachObserver","targetRef","observerOptions","current","getElement","observableElement","resizeObserver","observe","querySelector","targetDomEl","document","currentElement","findDOMNode","getRenderType","parentElement","createResizeHandler","entries","notifyResize","setState","bind","forEach","entry","contentRect","skipOnMount","render","children","isValidElement","isArray","state","createRef","ResizeObserver","componentDidMount","componentDidUpdate","componentWillUnmount","disconnect","typedChildren","nodeType","WrapperTag","childProps","nativeProps","cloneElement","map","el","PureComponent","useEffect","useLayoutEffect"],"sourceRoot":""} \ No newline at end of file diff --git a/resources/236.bundle.5c7a2732831ec4bc80eb.js b/resources/236.bundle.5c7a2732831ec4bc80eb.js new file mode 100644 index 0000000..e896f0e --- /dev/null +++ b/resources/236.bundle.5c7a2732831ec4bc80eb.js @@ -0,0 +1,2 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[236],{80965:(e,t,i)=>{"use strict";i.r(t),i.d(t,{default:()=>Z});const n=JSON.parse('{"u2":"@ohif/extension-dicom-microscopy"}').u2;var o=i(43001),s=i(71783),r=i(71771),a=i(69190),c=i(55220);function d(e,t){let i=!1;Array.isArray(e[0])||(e=[e],i=!0);const n=t[t.length-1],o=n.ImageOrientationSlide,s=function(e){if(e.PixelSpacing)return e.PixelSpacing;const t=e.SharedFunctionalGroupsSequence[0];return t.PixelMeasuresSequence[0].PixelSpacing}(n),r=n.TotalPixelMatrixOriginSequence[0],a=[Number(r.XOffsetInSlideCoordinateSystem),Number(r.YOffsetInSlideCoordinateSystem)];return e=e.map((e=>{const t=[e[0],e[1]],i=function(e){if(!("offset"in e))throw new Error('Option "offset" is required.');if(!Array.isArray(e.offset))throw new Error('Option "offset" must be an array.');if(2!==e.offset.length)throw new Error('Option "offset" must be an array with 2 elements.');const t=e.offset;if(!("orientation"in e))throw new Error('Option "orientation" is required.');if(!Array.isArray(e.orientation))throw new Error('Option "orientation" must be an array.');if(6!==e.orientation.length)throw new Error('Option "orientation" must be an array with 6 elements.');const i=e.orientation;if(!("spacing"in e))throw new Error('Option "spacing" is required.');if(!Array.isArray(e.spacing))throw new Error('Option "spacing" must be an array.');if(2!==e.spacing.length)throw new Error('Option "spacing" must be an array with 2 elements.');const n=e.spacing;if(!("point"in e))throw new Error('Option "point" is required.');if(!Array.isArray(e.point))throw new Error('Option "point" must be an array.');if(2!==e.point.length)throw new Error('Option "point" must be an array with 2 elements.');const o=e.point,s=[[i[0]*n[1],i[3]*n[0],t[0]],[i[1]*n[1],i[4]*n[0],t[1]],[0,0,1]],r=(0,c.JBn)(s),a=[[o[0]],[o[1]],[1]],d=(0,c.JpY)(r,a),l=Number(d[1][0].toFixed(4));return[Number(d[0][0].toFixed(4)),l]}({offset:a,orientation:o,spacing:s,point:t});return[i[0],-(i[1]+1),0]})),i?e[0]:e}const l={color:"rgba(255,255,255,0.4)"},u={color:"rgba(255,255,255,0.0)"},h={color:"rgb(0,255,0)",width:1.5},m={color:"rgb(255,255,0)",width:1.5},p={active:{image:{circle:{fill:l,stroke:m,radius:5}},fill:l,stroke:m},default:{image:{circle:{fill:u,stroke:h,radius:5}},fill:u,stroke:h}},g={ROI_ADDED:"dicommicroscopyviewer_roi_added",ROI_MODIFIED:"dicommicroscopyviewer_roi_modified",ROI_REMOVED:"dicommicroscopyviewer_roi_removed",ROI_DRAWN:"dicommicroscopyviewer_roi_drawn",ROI_SELECTED:"dicommicroscopyviewer_roi_selected",MOVE_STARTED:"dicommicroscopyviewer_move_started",MOVE_ENDED:"dicommicroscopyviewer_move_ended",LOADING_STARTED:"dicommicroscopyviewer_loading_started",LOADING_ENDED:"dicommicroscopyviewer_loading_ended",LOADING_ERROR:"dicommicroscopyviewer_loading_error",FRAME_LOADING_STARTED:"dicommicroscopyviewer_frame_loading_started",FRAME_LOADING_ENDED:"dicommicroscopyviewer_frame_loading_ended",FRAME_LOADING_ERROR:"dicommicroscopyviewer_frame_loading_ended"},I={ADDED:"added",MODIFIED:"modified",REMOVED:"removed",UPDATED:"updated",SELECTED:"selected"};class f extends r.hC{constructor(e,t,i,n,o){super(I),this.viewer=e,this.viewportId=t,this.container=i,this.studyInstanceUID=n,this.seriesInstanceUID=o,this.onRoiAdded=this.roiAddedHandler.bind(this),this.onRoiModified=this.roiModifiedHandler.bind(this),this.onRoiRemoved=this.roiRemovedHandler.bind(this),this.onRoiSelected=this.roiSelectedHandler.bind(this),this.contextMenuCallback=()=>{};const s=Object.getOwnPropertySymbols(this.viewer);this._drawingSource=s.find((e=>"drawingSource"===e.description)),this._pyramid=s.find((e=>"pyramid"===e.description)),this._map=s.find((e=>"map"===e.description)),this._affine=s.find((e=>"affine"===e.description)),this.registerEvents(),this.activateDefaultInteractions()}addContextMenuCallback(e){this.contextMenuCallback=e}destroy(){this.unregisterEvents()}publish(e,t){this._broadcastEvent(e,{roiGraphic:t,managedViewer:this})}registerEvents(){this.container.addEventListener(g.ROI_ADDED,this.onRoiAdded),this.container.addEventListener(g.ROI_MODIFIED,this.onRoiModified),this.container.addEventListener(g.ROI_REMOVED,this.onRoiRemoved),this.container.addEventListener(g.ROI_SELECTED,this.onRoiSelected)}unregisterEvents(){this.container.removeEventListener(g.ROI_ADDED,this.onRoiAdded),this.container.removeEventListener(g.ROI_MODIFIED,this.onRoiModified),this.container.removeEventListener(g.ROI_REMOVED,this.onRoiRemoved),this.container.removeEventListener(g.ROI_SELECTED,this.onRoiSelected)}roiAddedHandler(e){const t=e.detail.payload;this.publish(I.ADDED,t),this.publish(I.UPDATED,t)}roiModifiedHandler(e){const t=e.detail.payload;this.publish(I.MODIFIED,t),this.publish(I.UPDATED,t)}roiRemovedHandler(e){const t=e.detail.payload;this.publish(I.REMOVED,t),this.publish(I.UPDATED,t)}roiSelectedHandler(e){const t=e.detail.payload;this.publish(I.SELECTED,t)}runSilently(e){this.unregisterEvents(),e(),this.registerEvents()}clearRoiGraphics(){this.runSilently((()=>this.viewer.removeAllROIs()))}showROIs(){this.viewer.showROIs()}hideROIs(){this.viewer.hideROIs()}addRoiGraphic(e){this.runSilently((()=>this.viewer.addROI(e,p.default)))}addRoiGraphicWithLabel(e,t){this.runSilently((()=>this.viewer.addROI(e,p.default))),this._broadcastEvent(I.ADDED,{roiGraphic:e,managedViewer:this,label:t})}setROIStyle(e,t){this.viewer.setROIStyle(e,t)}removeRoiGraphic(e){this.viewer.removeROI(e)}updateROIProperties(e){let{uid:t,properties:i}=e;this.viewer.updateROI({uid:t,properties:i})}toggleOverviewMap(){this.viewer.toggleOverviewMap()}activateDefaultInteractions(){document.querySelector(".DicomMicroscopyViewer").addEventListener("contextmenu",(e=>{e.preventDefault()}),!1);this.activateInteractions([["dragPan",{bindings:{mouseButtons:["middle"]}}],["dragZoom",{bindings:{mouseButtons:["right"]}}],["modify",{}]])}activateInteractions(e){const t={draw:e=>e?"activateDrawInteraction":"deactivateDrawInteraction",modify:e=>e?"activateModifyInteraction":"deactivateModifyInteraction",translate:e=>e?"activateTranslateInteraction":"deactivateTranslateInteraction",snap:e=>e?"activateSnapInteraction":"deactivateSnapInteraction",dragPan:e=>e?"activateDragPanInteraction":"deactivateDragPanInteraction",dragZoom:e=>e?"activateDragZoomInteraction":"deactivateDragZoomInteraction",select:e=>e?"activateSelectInteraction":"deactivateSelectInteraction"};Object.keys(t).forEach((i=>{const n=e.find((e=>e[0]===i));if(n){const[e,i]=n,o=t[e](!0);this.viewer[o](i)}else{const e=t[i](!1);this.viewer[e]()}}))}_getMapView(){return this._getMap().getView()}_getMap(){const e=Object.getOwnPropertySymbols(this.viewer).find((e=>"Symbol(map)"===String(e)));return window.map=this.viewer[e],this.viewer[e]}getViewState(){const e=this._getMapView();return{center:e.getCenter(),resolution:e.getResolution(),zoom:e.getZoom()}}setViewState(e){const t=this._getMapView();t.setZoom(e.zoom),t.setResolution(e.resolution),t.setCenter(e.center)}setViewStateByExtent(e){const t=e.getCoordinates();Array.isArray(t[0])&&!t[2]?this._jumpToPolyline(t):Array.isArray(t[0])?this._jumpToPolygonOrEllipse(t):this._jumpToPoint(t)}_jumpToPoint(e){const t=d(e,this.viewer[this._pyramid].metadata);this._getMapView().setCenter(t)}_jumpToPolyline(e){const t=d(e,this.viewer[this._pyramid].metadata),i=this._getMapView(),n=t[0],o=t[1],s=[(n[0]+o[0])/2,(n[1]+o[1])/2];i.setCenter(s)}_jumpToPolygonOrEllipse(e){const t=this.viewer[this._pyramid].metadata;let i=1/0,n=-1/0,o=1/0,s=-1/0;e.forEach((e=>{let r=d(e,t);const[a,c]=r;an&&(n=a),cs&&(s=c)}));const r=n-i,a=s-o;i-=.5*r,n+=.5*r,o-=.5*a,s+=.5*a;const c=this._getMap();c.getView().fit([i,o,n,s],c.getSize())}}const S=f;const E={LABEL_UPDATED:"labelUpdated",GRAPHIC_UPDATED:"graphicUpdated",VIEW_UPDATED:"viewUpdated",REMOVED:"removed"};class v extends r.hC{constructor(e,t,i){let n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"",o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:null;super(E),this.uid=e.uid,this.roiGraphic=e,this.studyInstanceUID=t,this.seriesInstanceUID=i,this.label=n,this.viewState=o,this.setMeasurements(e)}getScoord3d(){const e=this.roiGraphic;return e[Object.getOwnPropertySymbols(e).find((e=>"Symbol(scoord3d)"===String(e)))]}getCoordinates(){const e=this.getScoord3d();return e[Object.getOwnPropertySymbols(e).find((e=>"Symbol(coordinates)"===String(e)))]}destroy(){this._broadcastEvent(E.REMOVED,this)}setRoiGraphic(e){this.roiGraphic=e,this.setMeasurements(),this._broadcastEvent(E.GRAPHIC_UPDATED,this)}setMeasurements(){const e=this.roiGraphic.scoord3d.graphicType,t=this.roiGraphic.scoord3d.graphicData;switch(e){case"ELLIPSE":const e=t[0],i=t[1];let n=i[0]-e[0],o=i[1]-e[1];n*=n,o*=o;const s=Math.sqrt(n+o)/2,r=Math.PI*s*s;this._area=r,this._length=void 0;break;case"POLYGON":const a=function(e){const t=e.length;let i=0,n=t-1;for(let o=0;oe.destroy())),this.managedViewers.clear();for(const e in this.annotations)delete this.annotations[e];this.roiUids.clear(),this.selectedAnnotation=null,this.pendingFocus=!1}clearAnnotations(){Object.keys(this.annotations).forEach((e=>{this.removeAnnotation(this.annotations[e])}))}_onRoiAdded(e){const{roiGraphic:t,managedViewer:i,label:n}=e,{studyInstanceUID:o,seriesInstanceUID:s}=i,r=i.getViewState(),a=new D(t,o,s,"",r);if(this.roiUids.add(t.uid),this.annotations[t.uid]=a,a.subscribe(E.LABEL_UPDATED,(()=>{this._broadcastEvent(b.ANNOTATION_UPDATED,a)})),void 0!==n)a.setLabel(n);else{const e=e=>i.updateROIProperties({uid:t.uid,properties:{label:e.label,finding:e.finding}});this.triggerRelabel(a,!0,e)}}_onRoiModified(e){const{roiGraphic:t,managedViewer:i}=e,n=this.getAnnotation(t.uid);n&&(n.setRoiGraphic(t),n.setViewState(i.getViewState()))}_onRoiRemoved(e){const{roiGraphic:t}=e;this.roiUids.delete(t.uid),this.annotations[t.uid].destroy(),delete this.annotations[t.uid],this._broadcastEvent(b.ANNOTATION_REMOVED,t)}_onRoiUpdated(e){const{roiGraphic:t,managedViewer:i}=e;this.synchronizeViewers(i),this._broadcastEvent(b.ANNOTATION_UPDATED,this.getAnnotation(t.uid))}_onRoiSelected(e){const{roiGraphic:t}=e,i=this.getAnnotation(t.uid);i&&i!==this.getSelectedAnnotation()&&(this.selectedAnnotation&&this.clearSelection(),this.selectedAnnotation=i,this._broadcastEvent(b.ANNOTATION_SELECTED,i))}_addManagedViewerSubscriptions(e){e._roiAddedSubscription=e.subscribe(I.ADDED,this._onRoiAdded),e._roiModifiedSubscription=e.subscribe(I.MODIFIED,this._onRoiModified),e._roiRemovedSubscription=e.subscribe(I.REMOVED,this._onRoiRemoved),e._roiUpdatedSubscription=e.subscribe(I.UPDATED,this._onRoiUpdated),e._roiSelectedSubscription=e.subscribe(I.UPDATED,this._onRoiSelected)}_removeManagedViewerSubscriptions(e){e._roiAddedSubscription&&e._roiAddedSubscription.unsubscribe(),e._roiModifiedSubscription&&e._roiModifiedSubscription.unsubscribe(),e._roiRemovedSubscription&&e._roiRemovedSubscription.unsubscribe(),e._roiUpdatedSubscription&&e._roiUpdatedSubscription.unsubscribe(),e._roiSelectedSubscription&&e._roiSelectedSubscription.unsubscribe(),e._roiAddedSubscription=null,e._roiModifiedSubscription=null,e._roiRemovedSubscription=null,e._roiUpdatedSubscription=null,e._roiSelectedSubscription=null}_getManagedViewersForSeries(e,t){return Array.from(this.managedViewers).filter((i=>i.studyInstanceUID===e&&i.seriesInstanceUID===t))}getManagedViewersForStudy(e){return Array.from(this.managedViewers).filter((t=>t.studyInstanceUID===e))}_restoreAnnotations(e){const{studyInstanceUID:t,seriesInstanceUID:i}=e;this.getAnnotationsForSeries(t,i).forEach((t=>{e.addRoiGraphic(t.roiGraphic)}))}addViewer(e,t,i,n,o){const s=new S(e,t,i,n,o);return this._restoreAnnotations(s),e._manager=s,this.managedViewers.add(s),this._addManagedViewerSubscriptions(s),this.pendingFocus&&(this.pendingFocus=!1,this.focusAnnotation(this.selectedAnnotation,t)),s}_potentiallyLoadSR(e,t){const i=r.DicomMetadataStore.getStudy(e),n=t.find((e=>"SM"===e.Modality)),{FrameOfReferenceUID:o,othersFrameOfReferenceUID:s}=n;if(!i)return;let a=o?t.filter((e=>e.ReferencedFrameOfReferenceUID===o||s.includes(e.ReferencedFrameOfReferenceUID))):[];if(!a.length)return;if(a=a.filter((e=>"SR"===e.Modality)),a.some((e=>!0===e.isLoaded)))return;let c=0,d=a[0];a.forEach((e=>{const t=Number(`${e.SeriesDate}${e.SeriesTime}`);t>c&&(c=t,d=e)})),d.isLoading=!0,d.load(n)}removeViewer(e){const t=e._manager;this._removeManagedViewerSubscriptions(t),t.destroy(),this.managedViewers.delete(t)}toggleROIsVisibility(){this.isROIsVisible?this.hideROIs():this.showROIs,this.isROIsVisible=!this.isROIsVisible}hideROIs(){this.managedViewers.forEach((e=>e.hideROIs()))}showROIs(){this.managedViewers.forEach((e=>e.showROIs()))}getAnnotation(e){return this.annotations[e]}getAnnotations(){const e=[];return Object.keys(this.annotations).forEach((t=>{e.push(this.getAnnotation(t))})),e}getAnnotationsForStudy(e){return this.getAnnotations().filter((t=>t.studyInstanceUID===e))}getAnnotationsForSeries(e,t){return this.getAnnotations().filter((i=>i.studyInstanceUID===e&&i.seriesInstanceUID===t))}getSelectedAnnotation(){return this.selectedAnnotation}clearSelection(){this.selectedAnnotation&&this.setROIStyle(this.selectedAnnotation.uid,{stroke:{color:"#00ff00"}}),this.selectedAnnotation=null}selectAnnotation(e){this.selectedAnnotation&&this.clearSelection(),this.selectedAnnotation=e,this._broadcastEvent(b.ANNOTATION_SELECTED,e),this.setROIStyle(e.uid,p.active)}toggleOverviewMap(e){const t=Array.from(this.managedViewers).find((t=>t.viewportId===e));t&&t.toggleOverviewMap()}removeAnnotation(e){const{uid:t,studyInstanceUID:i,seriesInstanceUID:n}=e;Array.from(this.managedViewers).filter((e=>e.studyInstanceUID===i&&e.seriesInstanceUID===n)).forEach((e=>e.removeRoiGraphic(t))),this.annotations[t]&&(this.roiUids.delete(t),this.annotations[t].destroy(),delete this.annotations[t],this._broadcastEvent(b.ANNOTATION_REMOVED,e))}focusAnnotation(e,t){const i=Array.from(this.managedViewers).find((e=>e.viewportId===t));i?i.setViewStateByExtent(e):this.pendingFocus=!0}synchronizeViewers(e){const{studyInstanceUID:t,seriesInstanceUID:i}=e,n=this._getManagedViewersForSeries(t,i);n.forEach((e=>this._removeManagedViewerSubscriptions(e))),n.forEach((n=>{if(n===e)return;const o=this.getAnnotationsForSeries(t,i);n.clearRoiGraphics(),o.forEach((e=>{n.addRoiGraphic(e.roiGraphic)}))})),n.forEach((e=>this._addManagedViewerSubscriptions(e)))}activateInteractions(e){this.managedViewers.forEach((t=>t.activateInteractions(e))),this.activeInteractions=e}triggerRelabel(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=arguments.length>2?arguments[2]:void 0;i||(i=t=>{let{label:i}=t;return this.managedViewers.forEach((t=>t.updateROIProperties({uid:e.uid,properties:{label:i}})))}),this._broadcastEvent(b.RELABEL,{roiAnnotation:e,deleteCallback:()=>this.removeAnnotation(e),successCallback:i,newAnnotation:t})}triggerDelete(e){this._broadcastEvent(b.DELETE,e)}setROIStyle(e,t){this.managedViewers.forEach((i=>i.setROIStyle(e,t)))}}y.REGISTRATION=e=>({name:"microscopyService",altName:"MicroscopyService",create:t=>{let{configuration:i={}}=t;return new y(e)}});var O=i(67540);function w(e){let{uiDialogService:t,title:i="Annotation",defaultValue:n="",callback:r=((e,t)=>{})}=e;const a="microscopy-input-dialog",c=e=>{let{action:i,value:n}=e;switch(i.id){case"save":r(n.value,i.id);break;case"cancel":r("",i.id)}t.dismiss({id:a})};t&&t.create({id:a,centralize:!0,isDraggable:!1,showOverlay:!0,content:s.Vq,contentProps:{title:i,value:{value:n},noCloseButton:!0,onClose:()=>t.dismiss({id:a}),actions:[{id:"cancel",text:"Cancel",type:s.LZ.dt.secondary},{id:"save",text:"Save",type:s.LZ.dt.primary}],onSubmit:c,body:e=>{let{value:t,setValue:i}=e;return o.createElement(s.II,{label:"Enter your annotation",labelClassName:"text-white text-[14px] leading-[1.2]",autoFocus:!0,className:"border-primary-main bg-black",type:"text",value:t.defaultValue,onChange:e=>{e.persist(),i((t=>({...t,value:e.target.value})))},onKeyPress:e=>{"Enter"===e.key&&c({value:t,action:{id:"save"}})}})}}})}const{datasetToBuffer:R}=O.default.data,A=(e,t)=>{let i=1;if("km"==t||!t&&e>1e6)t="km",i=1e-6;else if("m"==t||!t&&e>1e3)t="m",i=.001;else if("μm"==t||!t&&e<1)t="μm",i=1e3;else{if(t&&"mm"!=t)throw new Error(`Unknown length unit ${t}`);t="mm"}return`${(e*i).toFixed(2)} ${t}`};const _=(0,a.Zh)(["MicroscopyTable","Common"])((function(e){const{microscopyService:t}=e.servicesManager.services,[i,n]=(0,o.useState)(null),[r,a]=(0,o.useState)([]),[c,d]=(0,o.useState)(null),{servicesManager:l,extensionManager:u}=e,{uiDialogService:h,displaySetService:m}=l.services;(0,o.useEffect)((()=>{const t=e.viewports.get(e.activeViewportId);if(t?.displaySetInstanceUIDs[0]){const e=m.getDisplaySetByUID(t.displaySetInstanceUIDs[0]);e&&n(e.StudyInstanceUID)}}),[e.viewports,e.activeViewportId]),(0,o.useEffect)((()=>{const e=()=>{const e=t.getAnnotationsForStudy(i);a(e)},n=()=>{const e=t.getSelectedAnnotation();d(e)},{unsubscribe:o}=t.subscribe(b.ANNOTATION_UPDATED,e),{unsubscribe:s}=t.subscribe(b.ANNOTATION_SELECTED,n),{unsubscribe:r}=t.subscribe(b.ANNOTATION_REMOVED,(()=>{e()}));return e(),n(),()=>{o(),s(),r()}}),[i]);const p=r.map(((e,t)=>{const i=e.getDetailedLabel(),n=e.getArea(),o=e.getLength(),s=e.roiGraphic.properties.shortAxisLength,r=c===e,{uid:a}=e,d=[];return void 0!==n?d.push((e=>{let t=1,i="mm";return e>1e6?(i="m",t=1e-6):e<1&&(i="μm",t=1e6),`${(e*t).toFixed(2)} ${i}²`})(n)):void 0!==o&&d.push(s?`${A(o,"μm")} x ${A(s,"μm")}`:`${A(o,"μm")}`),{uid:a,index:t,label:i,isActive:r,displayText:d,roiAnnotation:e}}));return p.length,o.createElement(o.Fragment,null,o.createElement("div",{className:"ohif-scrollbar overflow-y-auto overflow-x-hidden","data-cy":"measurements-panel"},o.createElement(s.wt,{title:"Measurements",servicesManager:e.servicesManager,data:p,onClick:i=>{let{uid:n}=i;const o=t.getAnnotation(n);t.selectAnnotation(o),t.focusAnnotation(o,e.activeViewportId)},onEdit:t=>{let{uid:i,isActive:n}=t;e.commandsManager.runCommand("setLabel",{uid:i},"MICROSCOPY")}})))})),M=_;const{utils:C}=r.default,U="1.2.840.10008.5.1.4.1.1.77.1.6",N="@ohif/extension-dicom-microscopy.sopClassHandlerModule.DicomMicroscopySopClassHandler";function T(e){let{servicesManager:t,extensionManager:i}=e;return{name:"DicomMicroscopySopClassHandler",sopClassUids:[U],getDisplaySetsFromSeries:e=>function(e,t,i){if(!e||!e.length)throw new Error("No instances were provided");const n=e[0];let o=n,s=+o.NumberOfFrames||1;for(const t of e){const e=+t.NumberOfFrames||1;e(e.FrameOfReferenceUID=n.FrameOfReferenceUID,e)))).filter((e=>e)).map((e=>e.FrameOfReferenceUID)).filter(((e,t,i)=>i.indexOf(e)===t));return I.length>1&&console.warn("Expected FrameOfReferenceUID of difference instances within a series to be the same, found multiple different values",I),[{plugin:"microscopy",Modality:"SM",altImageText:"Microscopy",displaySetInstanceUID:C.guid(),SOPInstanceUID:p,SeriesInstanceUID:m,StudyInstanceUID:h,FrameOfReferenceUID:a,SOPClassHandlerId:N,SOPClassUID:g,SeriesDescription:c||"Microscopy Data",SeriesDate:d,SeriesTime:l,SeriesNumber:u,firstInstance:o,instance:n,numImageFrames:0,numInstances:1,imageIdForThumbnail:r,others:e,othersFrameOfReferenceUID:I}]}(e,0,i)}}const V={IMAGING_MEASUREMENTS:"126010",MEASUREMENT_GROUP:"125007",IMAGE_REGION:"111030",FINDING:"121071",TRACKING_UNIQUE_IDENTIFIER:"112039",LENGTH:"410668003",AREA:"42798000",SHORT_AXIS:"G-A186",LONG_AXIS:"G-A185",ELLIPSE_AREA:"G-D7FE"};function P(e){return Array.isArray(e)?e:[e]}const L=O.default.adapters.DICOMMicroscopyViewer.MeasurementReport;async function F(e,t,n){const o=t.metadata,{StudyInstanceUID:s,FrameOfReferenceUID:r}=n,a=e.getManagedViewersForStudy(s);if(!a||!a.length)return;t.isLoaded=!0;const{rois:c,labels:d}=await async function(e,t){const n=L.generateToolState(e),o=Object.getOwnPropertyNames(n),s=await i.e(18).then(i.t.bind(i,42613,23)),r=function(e){const{ContentSequence:t}=e,i=P(t.find((e=>e.ConceptNameCodeSequence.CodeValue===V.IMAGING_MEASUREMENTS)).ContentSequence).filter((e=>e.ConceptNameCodeSequence.CodeValue===V.MEASUREMENT_GROUP));return i}(e),a=[],c=[];return o.forEach((e=>{const i=n[e];let o;const d=e.toUpperCase(),l=r.filter((e=>P(e.ContentSequence).find((e=>e.ConceptNameCodeSequence.CodeValue===V.IMAGE_REGION)).GraphicType===d));i.forEach(((i,n)=>{const r={},d={coordinates:i,frameOfReferenceUID:t};if("Polygon"===e)o=new s.scoord3d.Polygon(d);else if("Polyline"===e)o=new s.scoord3d.Polyline(d);else if("Point"===e)o=new s.scoord3d.Point(d);else{if("Ellipse"!==e)throw new Error("Unsupported tool type");o=new s.scoord3d.Ellipse(d)}const u=l[n],h=P(u.ContentSequence).find((e=>e.ConceptNameCodeSequence.CodeValue===V.FINDING)),m=P(u.ContentSequence).find((e=>e.ConceptNameCodeSequence.CodeValue===V.TRACKING_UNIQUE_IDENTIFIER));if(m){const e=/\(([^)]+)\)/.exec(m.TextValue);e&&e[1]&&(r.presentationState=JSON.parse(e[1]),r.marker=r.presentationState.marker)}let p=P(u.ContentSequence).filter((e=>[V.LENGTH,V.AREA,V.SHORT_AXIS,V.LONG_AXIS,V.ELLIPSE_AREA].includes(e.ConceptNameCodeSequence.CodeValue))),g=P(u.ContentSequence).filter((e=>[V.TRACKING_UNIQUE_IDENTIFIER].includes(e.ConceptNameCodeSequence.CodeValue)));g=g.map((e=>{const t={...e};return t.ConceptNameCodeSequence=P(t.ConceptNameCodeSequence),t})),p=p.map((e=>{const t={...e};return t.ConceptNameCodeSequence=P(t.ConceptNameCodeSequence),t})),p&&p.length&&(r.measurements=p,console.log("[SR] retrieving measurements...",p)),g&&g.length&&(r.evaluations=g,console.log("[SR] retrieving evaluations...",g));const I=new s.roi.ROI({scoord3d:o,properties:r});a.push(I),h?c.push(h.ConceptCodeSequence.CodeValue):c.push("")}))})),{rois:a,labels:c}}(o,r),l=a[0];for(let e=0;e"properties"===e.description))].evaluations=[],l.addRoiGraphicWithLabel(t,d[e])}}const{utils:G}=r.default,x="1.2.840.10008.5.1.4.1.1.88.34",q="@ohif/extension-dicom-microscopy.sopClassHandlerModule.DicomMicroscopySRSopClassHandler";function k(e,t,i){if(!e||!e.length)throw new Error("No instances were provided");const{displaySetService:n,microscopyService:o}=t.services,s=e[0],a=r.DicomMetadataStore.getSeries(s.StudyInstanceUID,s.SeriesInstanceUID).instances[0],c=function(e){const{ContentSequence:t}=e,i=P(t.find((e=>e.ConceptNameCodeSequence.CodeValue===V.IMAGING_MEASUREMENTS)).ContentSequence).find((e=>e.ConceptNameCodeSequence.CodeValue===V.MEASUREMENT_GROUP));return P(i.ContentSequence).find((e=>e.ConceptNameCodeSequence.CodeValue===V.IMAGE_REGION)).ReferencedFrameOfReferenceUID}(a),{FrameOfReferenceUID:d,SeriesDescription:l,ContentDate:u,ContentTime:h,SeriesNumber:m,StudyInstanceUID:p,SeriesInstanceUID:g,SOPInstanceUID:I,SOPClassUID:f}=s,S={plugin:"microscopy",Modality:"SR",altImageText:"Microscopy SR",displaySetInstanceUID:G.guid(),SOPInstanceUID:I,SeriesInstanceUID:g,StudyInstanceUID:p,ReferencedFrameOfReferenceUID:c,SOPClassHandlerId:q,SOPClassUID:f,SeriesDescription:l,SeriesDate:u,SeriesTime:h,SeriesNumber:m,instance:s,metadata:a,isDerived:!0,isLoading:!1,isLoaded:!1,loadError:!1,load:function(e){return F(o,S,e).catch((e=>{throw S.isLoaded=!1,S.loadError=!0,new Error(e)}))}};return S.getSourceDisplaySet=function(){let e=[];return r.DicomMetadataStore.getStudy(p).series.forEach((t=>{const i=n.getDisplaySetsForSeries(t.SeriesInstanceUID);e=e.concat(i)})),function(e,t){const{ReferencedFrameOfReferenceUID:i}=t,n=e.filter((e=>e.displaySetInstanceUID!==t.displaySetInstanceUID)),o=n.find((e=>"SM"===e.Modality&&(e.FrameOfReferenceUID===i||e.othersFrameOfReferenceUID.includes(i))));return!o&&n.length>=1?(console.warn("No display set with FrameOfReferenceUID",i,"single series, assuming data error, defaulting to only series."),n.find((e=>"SM"===e.Modality))):o}(e,S)},[S]}function H(e){let{servicesManager:t,extensionManager:i}=e;return{name:"DicomMicroscopySRSopClassHandler",sopClassUids:[x],getDisplaySetsFromSeries:e=>k(e,t)}}function j(){return j=Object.assign?Object.assign.bind():function(e){for(var t=1;tPromise.all([i.e(743),i.e(604),i.e(417),i.e(23),i.e(342),i.e(250)]).then(i.bind(i,76516)))),$=e=>o.createElement(o.Suspense,{fallback:o.createElement("div",null,"Loading...")},o.createElement(B,e)),Z={id:n,async preRegistration(e){let{servicesManager:t,commandsManager:i,configuration:n={},appConfig:o}=e;t.registerService(y.REGISTRATION(t))},getViewportModule(e){let{servicesManager:t,extensionManager:i,commandsManager:n}=e;return[{name:"microscopy-dicom",component:e=>{const{viewportOptions:r}=e,[a,c]=(0,s.O_)(),{activeViewportId:d}=a;return o.createElement($,j({servicesManager:t,extensionManager:i,commandsManager:n,activeViewportId:d,setViewportActive:e=>{c.setActiveViewportId(e)},viewportData:r},e))}}]},getSopClassHandlerModule(e){let{servicesManager:t,commandsManager:i,extensionManager:n}=e;return[T({servicesManager:t,extensionManager:n}),H({servicesManager:t,extensionManager:n})]},getPanelModule:function(e){let{commandsManager:t,extensionManager:i,servicesManager:n}=e;return[{name:"measure",iconName:"tab-linear",iconLabel:"Measure",label:"Measurements",secondaryLabel:"Measurements",component:()=>{const[{activeViewportId:e,viewports:r}]=(0,s.O_)();return o.createElement(M,{viewports:r,activeViewportId:e,onSaveComplete:()=>{},onRejectComplete:()=>{},commandsManager:t,servicesManager:n,extensionManager:i})}}]},getCommandsModule:function(e){let{servicesManager:t,commandsManager:i,extensionManager:n}=e;const{viewportGridService:o,uiDialogService:s,microscopyService:r}=t.services,a={deleteMeasurement:e=>{let{uid:t}=e;if(t){const e=r.getAnnotation(t);e&&r.removeAnnotation(e)}},setLabel:e=>{let{uid:t}=e;const i=r.getAnnotation(t);w({uiDialogService:s,defaultValue:"",callback:(e,t)=>{if("save"===t)i.setLabel(e),r.triggerRelabel(i)}})},setToolActive:e=>{let{toolName:t,toolGroupId:i="MICROSCOPY"}=e;const n=["dragPan",{bindings:{mouseButtons:["middle"]}}],o=["dragZoom",{bindings:{mouseButtons:["right"]}}];if(["line","box","circle","point","polygon","freehandpolygon","freehandline"].indexOf(t)>=0){const e={geometryType:t,vertexEnabled:!0,styleOptions:p.default,bindings:{mouseButtons:["left"]}};"line"===t?(e.minPoints=2,e.maxPoints=2):"point"===t&&(delete e.styleOptions,delete e.vertexEnabled),r.activateInteractions([["draw",e],n,o])}else"dragPan"==t?r.activateInteractions([["dragPan",{bindings:{mouseButtons:["left","middle"]}}],o]):r.activateInteractions([[t,{bindings:{mouseButtons:["left"]}}],n,o])},toggleOverlays:()=>{const e=document.getElementsByClassName("microscopy-viewport-overlay");let t=!1;for(let i=0;i{r.toggleROIsVisibility()}};return{actions:a,definitions:{deleteMeasurement:{commandFn:a.deleteMeasurement,storeContexts:[],options:{}},setLabel:{commandFn:a.setLabel,storeContexts:[],options:{}},setToolActive:{commandFn:a.setToolActive,storeContexts:[],options:{}},toggleOverlays:{commandFn:a.toggleOverlays,storeContexts:[],options:{}},toggleAnnotations:{commandFn:a.toggleAnnotations,storeContexts:[],options:{}}},defaultContext:"MICROSCOPY"}}}},78753:()=>{}}]); +//# sourceMappingURL=236.bundle.5c7a2732831ec4bc80eb.js.map \ No newline at end of file diff --git a/resources/236.bundle.5c7a2732831ec4bc80eb.js.map b/resources/236.bundle.5c7a2732831ec4bc80eb.js.map new file mode 100644 index 0000000..1a1d7f1 --- /dev/null +++ b/resources/236.bundle.5c7a2732831ec4bc80eb.js.map @@ -0,0 +1 @@ +{"version":3,"file":"236.bundle.5c7a2732831ec4bc80eb.js","mappings":"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","sources":["webpack:///../../../extensions/dicom-microscopy/src/id.js","webpack:///../../../extensions/dicom-microscopy/src/utils/coordinateFormatScoord3d2Geometry.js","webpack:///../../../extensions/dicom-microscopy/src/utils/styles.js","webpack:///../../../extensions/dicom-microscopy/src/tools/viewerManager.js","webpack:///../../../extensions/dicom-microscopy/src/utils/RoiAnnotation.js","webpack:///../../../extensions/dicom-microscopy/src/utils/areaOfPolygon.js","webpack:///../../../extensions/dicom-microscopy/src/services/MicroscopyService.ts","webpack:///../../../extensions/dicom-microscopy/src/utils/callInputDialog.tsx","webpack:///../../../extensions/dicom-microscopy/src/components/MicroscopyPanel/MicroscopyPanel.tsx","webpack:///../../../extensions/dicom-microscopy/src/DicomMicroscopySopClassHandler.js","webpack:///../../../extensions/dicom-microscopy/src/utils/dcmCodeValues.js","webpack:///../../../extensions/dicom-microscopy/src/utils/toArray.js","webpack:///../../../extensions/dicom-microscopy/src/utils/loadSR.js","webpack:///../../../extensions/dicom-microscopy/src/DicomMicroscopySRSopClassHandler.js","webpack:///../../../extensions/dicom-microscopy/src/utils/getSourceDisplaySet.js","webpack:///../../../extensions/dicom-microscopy/src/index.tsx","webpack:///../../../extensions/dicom-microscopy/src/getPanelModule.tsx","webpack:///../../../extensions/dicom-microscopy/src/getCommandsModule.ts"],"sourcesContent":["import packageJson from '../package.json';\r\n\r\nconst id = packageJson.name;\r\n\r\nexport { id };\r\n","import { inv, multiply } from 'mathjs';\r\n\r\n// TODO -> This is pulled out of some internal logic from Dicom Microscopy Viewer,\r\n// We should likely just expose this there.\r\n\r\nexport default function coordinateFormatScoord3d2Geometry(coordinates, pyramid) {\r\n let transform = false;\r\n if (!Array.isArray(coordinates[0])) {\r\n coordinates = [coordinates];\r\n transform = true;\r\n }\r\n const metadata = pyramid[pyramid.length - 1];\r\n const orientation = metadata.ImageOrientationSlide;\r\n const spacing = _getPixelSpacing(metadata);\r\n const origin = metadata.TotalPixelMatrixOriginSequence[0];\r\n const offset = [\r\n Number(origin.XOffsetInSlideCoordinateSystem),\r\n Number(origin.YOffsetInSlideCoordinateSystem),\r\n ];\r\n\r\n coordinates = coordinates.map(c => {\r\n const slideCoord = [c[0], c[1]];\r\n const pixelCoord = mapSlideCoord2PixelCoord({\r\n offset,\r\n orientation,\r\n spacing,\r\n point: slideCoord,\r\n });\r\n return [pixelCoord[0], -(pixelCoord[1] + 1), 0];\r\n });\r\n if (transform) {\r\n return coordinates[0];\r\n }\r\n return coordinates;\r\n}\r\n\r\nfunction _getPixelSpacing(metadata) {\r\n if (metadata.PixelSpacing) {\r\n return metadata.PixelSpacing;\r\n }\r\n const functionalGroup = metadata.SharedFunctionalGroupsSequence[0];\r\n const pixelMeasures = functionalGroup.PixelMeasuresSequence[0];\r\n return pixelMeasures.PixelSpacing;\r\n}\r\n\r\nfunction mapSlideCoord2PixelCoord(options) {\r\n // X and Y Offset in Slide Coordinate System\r\n if (!('offset' in options)) {\r\n throw new Error('Option \"offset\" is required.');\r\n }\r\n if (!Array.isArray(options.offset)) {\r\n throw new Error('Option \"offset\" must be an array.');\r\n }\r\n if (options.offset.length !== 2) {\r\n throw new Error('Option \"offset\" must be an array with 2 elements.');\r\n }\r\n const offset = options.offset;\r\n\r\n // Image Orientation Slide with direction cosines for Row and Column direction\r\n if (!('orientation' in options)) {\r\n throw new Error('Option \"orientation\" is required.');\r\n }\r\n if (!Array.isArray(options.orientation)) {\r\n throw new Error('Option \"orientation\" must be an array.');\r\n }\r\n if (options.orientation.length !== 6) {\r\n throw new Error('Option \"orientation\" must be an array with 6 elements.');\r\n }\r\n const orientation = options.orientation;\r\n\r\n // Pixel Spacing along the Row and Column direction\r\n if (!('spacing' in options)) {\r\n throw new Error('Option \"spacing\" is required.');\r\n }\r\n if (!Array.isArray(options.spacing)) {\r\n throw new Error('Option \"spacing\" must be an array.');\r\n }\r\n if (options.spacing.length !== 2) {\r\n throw new Error('Option \"spacing\" must be an array with 2 elements.');\r\n }\r\n const spacing = options.spacing;\r\n\r\n // X and Y coordinate in the Slide Coordinate System\r\n if (!('point' in options)) {\r\n throw new Error('Option \"point\" is required.');\r\n }\r\n if (!Array.isArray(options.point)) {\r\n throw new Error('Option \"point\" must be an array.');\r\n }\r\n if (options.point.length !== 2) {\r\n throw new Error('Option \"point\" must be an array with 2 elements.');\r\n }\r\n const point = options.point;\r\n\r\n const m = [\r\n [orientation[0] * spacing[1], orientation[3] * spacing[0], offset[0]],\r\n [orientation[1] * spacing[1], orientation[4] * spacing[0], offset[1]],\r\n [0, 0, 1],\r\n ];\r\n const mInverted = inv(m);\r\n\r\n const vSlide = [[point[0]], [point[1]], [1]];\r\n\r\n const vImage = multiply(mInverted, vSlide);\r\n\r\n const row = Number(vImage[1][0].toFixed(4));\r\n const col = Number(vImage[0][0].toFixed(4));\r\n return [col, row];\r\n}\r\n","const defaultFill = {\r\n color: 'rgba(255,255,255,0.4)',\r\n};\r\n\r\nconst emptyFill = {\r\n color: 'rgba(255,255,255,0.0)',\r\n};\r\n\r\nconst defaultStroke = {\r\n color: 'rgb(0,255,0)',\r\n width: 1.5,\r\n};\r\n\r\nconst activeStroke = {\r\n color: 'rgb(255,255,0)',\r\n width: 1.5,\r\n};\r\n\r\nconst defaultStyle = {\r\n image: {\r\n circle: {\r\n fill: defaultFill,\r\n stroke: activeStroke,\r\n radius: 5,\r\n },\r\n },\r\n fill: defaultFill,\r\n stroke: activeStroke,\r\n};\r\n\r\nconst emptyStyle = {\r\n image: {\r\n circle: {\r\n fill: emptyFill,\r\n stroke: defaultStroke,\r\n radius: 5,\r\n },\r\n },\r\n fill: emptyFill,\r\n stroke: defaultStroke,\r\n};\r\n\r\nconst styles = {\r\n active: defaultStyle,\r\n default: emptyStyle,\r\n};\r\n\r\nexport default styles;\r\n","import coordinateFormatScoord3d2Geometry from '../utils/coordinateFormatScoord3d2Geometry';\r\nimport styles from '../utils/styles';\r\n\r\nimport { PubSubService } from '@ohif/core';\r\n\r\n// Events from the third-party viewer\r\nconst ApiEvents = {\r\n /** Triggered when a ROI was added. */\r\n ROI_ADDED: 'dicommicroscopyviewer_roi_added',\r\n /** Triggered when a ROI was modified. */\r\n ROI_MODIFIED: 'dicommicroscopyviewer_roi_modified',\r\n /** Triggered when a ROI was removed. */\r\n ROI_REMOVED: 'dicommicroscopyviewer_roi_removed',\r\n /** Triggered when a ROI was drawn. */\r\n ROI_DRAWN: `dicommicroscopyviewer_roi_drawn`,\r\n /** Triggered when a ROI was selected. */\r\n ROI_SELECTED: `dicommicroscopyviewer_roi_selected`,\r\n /** Triggered when a viewport move has started. */\r\n MOVE_STARTED: `dicommicroscopyviewer_move_started`,\r\n /** Triggered when a viewport move has ended. */\r\n MOVE_ENDED: `dicommicroscopyviewer_move_ended`,\r\n /** Triggered when a loading of data has started. */\r\n LOADING_STARTED: `dicommicroscopyviewer_loading_started`,\r\n /** Triggered when a loading of data has ended. */\r\n LOADING_ENDED: `dicommicroscopyviewer_loading_ended`,\r\n /** Triggered when an error occurs during loading of data. */\r\n LOADING_ERROR: `dicommicroscopyviewer_loading_error`,\r\n /* Triggered when the loading of an image tile has started. */\r\n FRAME_LOADING_STARTED: `dicommicroscopyviewer_frame_loading_started`,\r\n /* Triggered when the loading of an image tile has ended. */\r\n FRAME_LOADING_ENDED: `dicommicroscopyviewer_frame_loading_ended`,\r\n /* Triggered when the error occurs during loading of an image tile. */\r\n FRAME_LOADING_ERROR: `dicommicroscopyviewer_frame_loading_ended`,\r\n};\r\n\r\nconst EVENTS = {\r\n ADDED: 'added',\r\n MODIFIED: 'modified',\r\n REMOVED: 'removed',\r\n UPDATED: 'updated',\r\n SELECTED: 'selected',\r\n};\r\n\r\n/**\r\n * ViewerManager encapsulates the complexity of the third-party viewer and\r\n * expose only the features/behaviors that are relevant to the application\r\n */\r\nclass ViewerManager extends PubSubService {\r\n constructor(viewer, viewportId, container, studyInstanceUID, seriesInstanceUID) {\r\n super(EVENTS);\r\n this.viewer = viewer;\r\n this.viewportId = viewportId;\r\n this.container = container;\r\n this.studyInstanceUID = studyInstanceUID;\r\n this.seriesInstanceUID = seriesInstanceUID;\r\n\r\n this.onRoiAdded = this.roiAddedHandler.bind(this);\r\n this.onRoiModified = this.roiModifiedHandler.bind(this);\r\n this.onRoiRemoved = this.roiRemovedHandler.bind(this);\r\n this.onRoiSelected = this.roiSelectedHandler.bind(this);\r\n this.contextMenuCallback = () => {};\r\n\r\n // init symbols\r\n const symbols = Object.getOwnPropertySymbols(this.viewer);\r\n this._drawingSource = symbols.find(p => p.description === 'drawingSource');\r\n this._pyramid = symbols.find(p => p.description === 'pyramid');\r\n this._map = symbols.find(p => p.description === 'map');\r\n this._affine = symbols.find(p => p.description === 'affine');\r\n\r\n this.registerEvents();\r\n this.activateDefaultInteractions();\r\n }\r\n\r\n addContextMenuCallback(callback) {\r\n this.contextMenuCallback = callback;\r\n }\r\n\r\n /**\r\n * Destroys this managed viewer instance, clearing all the event handlers\r\n */\r\n destroy() {\r\n this.unregisterEvents();\r\n }\r\n\r\n /**\r\n * This is to overrides the _broadcastEvent method of PubSubService and always\r\n * send the ROI graphic object and this managed viewer instance.\r\n * Due to the way that PubSubService is written, the same name override of the\r\n * function doesn't work.\r\n *\r\n * @param {String} key key Subscription key\r\n * @param {Object} roiGraphic ROI graphic object created by the third-party API\r\n */\r\n publish(key, roiGraphic) {\r\n this._broadcastEvent(key, {\r\n roiGraphic,\r\n managedViewer: this,\r\n });\r\n }\r\n\r\n /**\r\n * Registers all the relevant event handlers for the third-party API\r\n */\r\n registerEvents() {\r\n this.container.addEventListener(ApiEvents.ROI_ADDED, this.onRoiAdded);\r\n this.container.addEventListener(ApiEvents.ROI_MODIFIED, this.onRoiModified);\r\n this.container.addEventListener(ApiEvents.ROI_REMOVED, this.onRoiRemoved);\r\n this.container.addEventListener(ApiEvents.ROI_SELECTED, this.onRoiSelected);\r\n }\r\n\r\n /**\r\n * Clears all the relevant event handlers for the third-party API\r\n */\r\n unregisterEvents() {\r\n this.container.removeEventListener(ApiEvents.ROI_ADDED, this.onRoiAdded);\r\n this.container.removeEventListener(ApiEvents.ROI_MODIFIED, this.onRoiModified);\r\n this.container.removeEventListener(ApiEvents.ROI_REMOVED, this.onRoiRemoved);\r\n this.container.removeEventListener(ApiEvents.ROI_SELECTED, this.onRoiSelected);\r\n }\r\n\r\n /**\r\n * Handles the ROI_ADDED event triggered by the third-party API\r\n *\r\n * @param {Event} event Event triggered by the third-party API\r\n */\r\n roiAddedHandler(event) {\r\n const roiGraphic = event.detail.payload;\r\n this.publish(EVENTS.ADDED, roiGraphic);\r\n this.publish(EVENTS.UPDATED, roiGraphic);\r\n }\r\n\r\n /**\r\n * Handles the ROI_MODIFIED event triggered by the third-party API\r\n *\r\n * @param {Event} event Event triggered by the third-party API\r\n */\r\n roiModifiedHandler(event) {\r\n const roiGraphic = event.detail.payload;\r\n this.publish(EVENTS.MODIFIED, roiGraphic);\r\n this.publish(EVENTS.UPDATED, roiGraphic);\r\n }\r\n\r\n /**\r\n * Handles the ROI_REMOVED event triggered by the third-party API\r\n *\r\n * @param {Event} event Event triggered by the third-party API\r\n */\r\n roiRemovedHandler(event) {\r\n const roiGraphic = event.detail.payload;\r\n this.publish(EVENTS.REMOVED, roiGraphic);\r\n this.publish(EVENTS.UPDATED, roiGraphic);\r\n }\r\n\r\n /**\r\n * Handles the ROI_SELECTED event triggered by the third-party API\r\n *\r\n * @param {Event} event Event triggered by the third-party API\r\n */\r\n roiSelectedHandler(event) {\r\n const roiGraphic = event.detail.payload;\r\n this.publish(EVENTS.SELECTED, roiGraphic);\r\n }\r\n\r\n /**\r\n * Run the given callback operation without triggering any events for this\r\n * instance, so subscribers will not be affected\r\n *\r\n * @param {Function} callback Callback that will run sinlently\r\n */\r\n runSilently(callback) {\r\n this.unregisterEvents();\r\n callback();\r\n this.registerEvents();\r\n }\r\n\r\n /**\r\n * Removes all the ROI graphics from the third-party API\r\n */\r\n clearRoiGraphics() {\r\n this.runSilently(() => this.viewer.removeAllROIs());\r\n }\r\n\r\n showROIs() {\r\n this.viewer.showROIs();\r\n }\r\n\r\n hideROIs() {\r\n this.viewer.hideROIs();\r\n }\r\n\r\n /**\r\n * Adds the given ROI graphic into the third-party API\r\n *\r\n * @param {Object} roiGraphic ROI graphic object to be added\r\n */\r\n addRoiGraphic(roiGraphic) {\r\n this.runSilently(() => this.viewer.addROI(roiGraphic, styles.default));\r\n }\r\n\r\n /**\r\n * Adds the given ROI graphic into the third-party API, and also add a label.\r\n * Used for importing from SR.\r\n *\r\n * @param {Object} roiGraphic ROI graphic object to be added.\r\n * @param {String} label The label of the annotation.\r\n */\r\n addRoiGraphicWithLabel(roiGraphic, label) {\r\n // NOTE: Dicom Microscopy Viewer will override styles for \"Text\" evaluations\r\n // to hide all other geometries, we are not going to use its label.\r\n // if (label) {\r\n // if (!roiGraphic.properties) roiGraphic.properties = {};\r\n // roiGraphic.properties.label = label;\r\n // }\r\n this.runSilently(() => this.viewer.addROI(roiGraphic, styles.default));\r\n\r\n this._broadcastEvent(EVENTS.ADDED, {\r\n roiGraphic,\r\n managedViewer: this,\r\n label,\r\n });\r\n }\r\n\r\n /**\r\n * Sets ROI style\r\n *\r\n * @param {String} uid ROI graphic UID to be styled\r\n * @param {object} styleOptions - Style options\r\n * @param {object} styleOptions.stroke - Style options for the outline of the geometry\r\n * @param {number[]} styleOptions.stroke.color - RGBA color of the outline\r\n * @param {number} styleOptions.stroke.width - Width of the outline\r\n * @param {object} styleOptions.fill - Style options for body the geometry\r\n * @param {number[]} styleOptions.fill.color - RGBA color of the body\r\n * @param {object} styleOptions.image - Style options for image\r\n */\r\n setROIStyle(uid, styleOptions) {\r\n this.viewer.setROIStyle(uid, styleOptions);\r\n }\r\n\r\n /**\r\n * Removes the ROI graphic with the given UID from the third-party API\r\n *\r\n * @param {String} uid ROI graphic UID to be removed\r\n */\r\n removeRoiGraphic(uid) {\r\n this.viewer.removeROI(uid);\r\n }\r\n\r\n /**\r\n * Update properties of regions of interest.\r\n *\r\n * @param {object} roi - ROI to be updated\r\n * @param {string} roi.uid - Unique identifier of the region of interest\r\n * @param {object} roi.properties - ROI properties\r\n * @returns {void}\r\n */\r\n updateROIProperties({ uid, properties }) {\r\n this.viewer.updateROI({ uid, properties });\r\n }\r\n\r\n /**\r\n * Toggles overview map\r\n *\r\n * @returns {void}\r\n */\r\n toggleOverviewMap() {\r\n this.viewer.toggleOverviewMap();\r\n }\r\n\r\n /**\r\n * Activates the viewer default interactions\r\n * @returns {void}\r\n */\r\n activateDefaultInteractions() {\r\n /** Disable browser's native context menu inside the canvas */\r\n document.querySelector('.DicomMicroscopyViewer').addEventListener(\r\n 'contextmenu',\r\n event => {\r\n event.preventDefault();\r\n // comment out when context menu for microscopy is enabled\r\n // if (typeof this.contextMenuCallback === 'function') {\r\n // this.contextMenuCallback(event);\r\n // }\r\n },\r\n false\r\n );\r\n const defaultInteractions = [\r\n [\r\n 'dragPan',\r\n {\r\n bindings: {\r\n mouseButtons: ['middle'],\r\n },\r\n },\r\n ],\r\n [\r\n 'dragZoom',\r\n {\r\n bindings: {\r\n mouseButtons: ['right'],\r\n },\r\n },\r\n ],\r\n ['modify', {}],\r\n ];\r\n this.activateInteractions(defaultInteractions);\r\n }\r\n\r\n /**\r\n * Activates interactions\r\n * @param {Array} interactions Interactions to be activated\r\n * @returns {void}\r\n */\r\n activateInteractions(interactions) {\r\n const interactionsMap = {\r\n draw: activate => (activate ? 'activateDrawInteraction' : 'deactivateDrawInteraction'),\r\n modify: activate => (activate ? 'activateModifyInteraction' : 'deactivateModifyInteraction'),\r\n translate: activate =>\r\n activate ? 'activateTranslateInteraction' : 'deactivateTranslateInteraction',\r\n snap: activate => (activate ? 'activateSnapInteraction' : 'deactivateSnapInteraction'),\r\n dragPan: activate =>\r\n activate ? 'activateDragPanInteraction' : 'deactivateDragPanInteraction',\r\n dragZoom: activate =>\r\n activate ? 'activateDragZoomInteraction' : 'deactivateDragZoomInteraction',\r\n select: activate => (activate ? 'activateSelectInteraction' : 'deactivateSelectInteraction'),\r\n };\r\n\r\n const availableInteractionsName = Object.keys(interactionsMap);\r\n availableInteractionsName.forEach(availableInteractionName => {\r\n const interaction = interactions.find(\r\n interaction => interaction[0] === availableInteractionName\r\n );\r\n if (!interaction) {\r\n const deactivateInteractionMethod = interactionsMap[availableInteractionName](false);\r\n this.viewer[deactivateInteractionMethod]();\r\n } else {\r\n const [name, config] = interaction;\r\n const activateInteractionMethod = interactionsMap[name](true);\r\n this.viewer[activateInteractionMethod](config);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Accesses the internals of third-party API and returns the OpenLayers Map\r\n *\r\n * @returns {Object} OpenLayers Map component instance\r\n */\r\n _getMapView() {\r\n const map = this._getMap();\r\n return map.getView();\r\n }\r\n\r\n _getMap() {\r\n const symbols = Object.getOwnPropertySymbols(this.viewer);\r\n const _map = symbols.find(s => String(s) === 'Symbol(map)');\r\n window['map'] = this.viewer[_map];\r\n return this.viewer[_map];\r\n }\r\n\r\n /**\r\n * Returns the current state for the OpenLayers View\r\n *\r\n * @returns {Object} Current view state\r\n */\r\n getViewState() {\r\n const view = this._getMapView();\r\n return {\r\n center: view.getCenter(),\r\n resolution: view.getResolution(),\r\n zoom: view.getZoom(),\r\n };\r\n }\r\n\r\n /**\r\n * Sets the current state for the OpenLayers View\r\n *\r\n * @param {Object} viewState View state to be applied\r\n */\r\n setViewState(viewState) {\r\n const view = this._getMapView();\r\n\r\n view.setZoom(viewState.zoom);\r\n view.setResolution(viewState.resolution);\r\n view.setCenter(viewState.center);\r\n }\r\n\r\n setViewStateByExtent(roiAnnotation) {\r\n const coordinates = roiAnnotation.getCoordinates();\r\n\r\n if (Array.isArray(coordinates[0]) && !coordinates[2]) {\r\n this._jumpToPolyline(coordinates);\r\n } else if (Array.isArray(coordinates[0])) {\r\n this._jumpToPolygonOrEllipse(coordinates);\r\n } else {\r\n this._jumpToPoint(coordinates);\r\n }\r\n }\r\n\r\n _jumpToPoint(coord) {\r\n const pyramid = this.viewer[this._pyramid].metadata;\r\n\r\n const mappedCoord = coordinateFormatScoord3d2Geometry(coord, pyramid);\r\n const view = this._getMapView();\r\n\r\n view.setCenter(mappedCoord);\r\n }\r\n\r\n _jumpToPolyline(coord) {\r\n const pyramid = this.viewer[this._pyramid].metadata;\r\n\r\n const mappedCoord = coordinateFormatScoord3d2Geometry(coord, pyramid);\r\n const view = this._getMapView();\r\n\r\n const x = mappedCoord[0];\r\n const y = mappedCoord[1];\r\n\r\n const xab = (x[0] + y[0]) / 2;\r\n const yab = (x[1] + y[1]) / 2;\r\n const midpoint = [xab, yab];\r\n\r\n view.setCenter(midpoint);\r\n }\r\n\r\n _jumpToPolygonOrEllipse(coordinates) {\r\n const pyramid = this.viewer[this._pyramid].metadata;\r\n\r\n let minX = Infinity;\r\n let maxX = -Infinity;\r\n let minY = Infinity;\r\n let maxY = -Infinity;\r\n\r\n coordinates.forEach(coord => {\r\n let mappedCoord = coordinateFormatScoord3d2Geometry(coord, pyramid);\r\n\r\n const [x, y] = mappedCoord;\r\n if (x < minX) {\r\n minX = x;\r\n } else if (x > maxX) {\r\n maxX = x;\r\n }\r\n\r\n if (y < minY) {\r\n minY = y;\r\n } else if (y > maxY) {\r\n maxY = y;\r\n }\r\n });\r\n\r\n const width = maxX - minX;\r\n const height = maxY - minY;\r\n\r\n minX -= 0.5 * width;\r\n maxX += 0.5 * width;\r\n minY -= 0.5 * height;\r\n maxY += 0.5 * height;\r\n\r\n const map = this._getMap();\r\n map.getView().fit([minX, minY, maxX, maxY], map.getSize());\r\n }\r\n}\r\n\r\nexport { EVENTS };\r\n\r\nexport default ViewerManager;\r\n","import areaOfPolygon from './areaOfPolygon';\r\n\r\nimport { PubSubService } from '@ohif/core';\r\n\r\nconst EVENTS = {\r\n LABEL_UPDATED: 'labelUpdated',\r\n GRAPHIC_UPDATED: 'graphicUpdated',\r\n VIEW_UPDATED: 'viewUpdated',\r\n REMOVED: 'removed',\r\n};\r\n\r\n/**\r\n * Represents a single annotation for the Microscopy Viewer\r\n */\r\nclass RoiAnnotation extends PubSubService {\r\n constructor(roiGraphic, studyInstanceUID, seriesInstanceUID, label = '', viewState = null) {\r\n super(EVENTS);\r\n this.uid = roiGraphic.uid;\r\n this.roiGraphic = roiGraphic;\r\n this.studyInstanceUID = studyInstanceUID;\r\n this.seriesInstanceUID = seriesInstanceUID;\r\n this.label = label;\r\n this.viewState = viewState;\r\n this.setMeasurements(roiGraphic);\r\n }\r\n\r\n getScoord3d() {\r\n const roiGraphic = this.roiGraphic;\r\n\r\n const roiGraphicSymbols = Object.getOwnPropertySymbols(roiGraphic);\r\n const _scoord3d = roiGraphicSymbols.find(s => String(s) === 'Symbol(scoord3d)');\r\n\r\n return roiGraphic[_scoord3d];\r\n }\r\n\r\n getCoordinates() {\r\n const scoord3d = this.getScoord3d();\r\n const scoord3dSymbols = Object.getOwnPropertySymbols(scoord3d);\r\n\r\n const _coordinates = scoord3dSymbols.find(s => String(s) === 'Symbol(coordinates)');\r\n\r\n const coordinates = scoord3d[_coordinates];\r\n return coordinates;\r\n }\r\n\r\n /**\r\n * When called will trigger the REMOVED event\r\n */\r\n destroy() {\r\n this._broadcastEvent(EVENTS.REMOVED, this);\r\n }\r\n\r\n /**\r\n * Updates the ROI graphic for the annotation and triggers the GRAPHIC_UPDATED\r\n * event\r\n *\r\n * @param {Object} roiGraphic\r\n */\r\n setRoiGraphic(roiGraphic) {\r\n this.roiGraphic = roiGraphic;\r\n this.setMeasurements();\r\n this._broadcastEvent(EVENTS.GRAPHIC_UPDATED, this);\r\n }\r\n\r\n /**\r\n * Update ROI measurement values based on its scoord3d coordinates.\r\n *\r\n * @returns {void}\r\n */\r\n setMeasurements() {\r\n const type = this.roiGraphic.scoord3d.graphicType;\r\n const coordinates = this.roiGraphic.scoord3d.graphicData;\r\n\r\n switch (type) {\r\n case 'ELLIPSE':\r\n // This is a circle so only need one side\r\n const point1 = coordinates[0];\r\n const point2 = coordinates[1];\r\n\r\n let xLength2 = point2[0] - point1[0];\r\n let yLength2 = point2[1] - point1[1];\r\n\r\n xLength2 *= xLength2;\r\n yLength2 *= yLength2;\r\n\r\n const length = Math.sqrt(xLength2 + yLength2);\r\n const radius = length / 2;\r\n\r\n const areaEllipse = Math.PI * radius * radius;\r\n this._area = areaEllipse;\r\n this._length = undefined;\r\n break;\r\n\r\n case 'POLYGON':\r\n const areaPolygon = areaOfPolygon(coordinates);\r\n this._area = areaPolygon;\r\n this._length = undefined;\r\n break;\r\n\r\n case 'POINT':\r\n this._area = undefined;\r\n this._length = undefined;\r\n break;\r\n\r\n case 'POLYLINE':\r\n let len = 0;\r\n for (let i = 1; i < coordinates.length; i++) {\r\n const p1 = coordinates[i - 1];\r\n const p2 = coordinates[i];\r\n\r\n let xLen = p2[0] - p1[0];\r\n let yLen = p2[1] - p1[1];\r\n\r\n xLen *= xLen;\r\n yLen *= yLen;\r\n len += Math.sqrt(xLen + yLen);\r\n }\r\n\r\n this._area = undefined;\r\n this._length = len;\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * Update the OpenLayer Map's view state for the annotation and triggers the\r\n * VIEW_UPDATED event\r\n *\r\n * @param {Object} viewState The new view state for the annotation\r\n */\r\n setViewState(viewState) {\r\n this.viewState = viewState;\r\n this._broadcastEvent(EVENTS.VIEW_UPDATED, this);\r\n }\r\n\r\n /**\r\n * Update the label for the annotation and triggers the LABEL_UPDATED event\r\n *\r\n * @param {String} label New label for the annotation\r\n */\r\n setLabel(label, finding) {\r\n this.label = label || (finding && finding.CodeMeaning);\r\n this.finding = finding || {\r\n CodingSchemeDesignator: '@ohif/extension-dicom-microscopy',\r\n CodeValue: label,\r\n CodeMeaning: label,\r\n };\r\n this._broadcastEvent(EVENTS.LABEL_UPDATED, this);\r\n }\r\n\r\n /**\r\n * Returns the geometry type of the annotation concatenated with the label\r\n * defined for the annotation.\r\n * Difference with getDetailedLabel() is that this will return empty string for empty\r\n * label.\r\n *\r\n * @returns {String} Text with geometry type and label\r\n */\r\n getLabel() {\r\n const label = this.label ? `${this.label}` : '';\r\n return label;\r\n }\r\n\r\n /**\r\n * Returns the geometry type of the annotation concatenated with the label\r\n * defined for the annotation\r\n *\r\n * @returns {String} Text with geometry type and label\r\n */\r\n getDetailedLabel() {\r\n const label = this.label ? `${this.label}` : '(empty)';\r\n return label;\r\n }\r\n\r\n getLength() {\r\n return this._length;\r\n }\r\n\r\n getArea() {\r\n return this._area;\r\n }\r\n}\r\n\r\nexport { EVENTS };\r\n\r\nexport default RoiAnnotation;\r\n","export default function areaOfPolygon(coordinates) {\r\n // Shoelace algorithm.\r\n const n = coordinates.length;\r\n let area = 0.0;\r\n let j = n - 1;\r\n\r\n for (let i = 0; i < n; i++) {\r\n area += (coordinates[j][0] + coordinates[i][0]) * (coordinates[j][1] - coordinates[i][1]);\r\n j = i; // j is previous vertex to i\r\n }\r\n\r\n // Return absolute value of half the sum\r\n // (The value is halved as we are summing up triangles, not rectangles).\r\n return Math.abs(area / 2.0);\r\n}\r\n","import ViewerManager, { EVENTS as ViewerEvents } from '../tools/viewerManager';\r\nimport RoiAnnotation, { EVENTS as AnnotationEvents } from '../utils/RoiAnnotation';\r\nimport styles from '../utils/styles';\r\nimport { DicomMetadataStore, PubSubService } from '@ohif/core';\r\n\r\nconst EVENTS = {\r\n ANNOTATION_UPDATED: 'annotationUpdated',\r\n ANNOTATION_SELECTED: 'annotationSelected',\r\n ANNOTATION_REMOVED: 'annotationRemoved',\r\n RELABEL: 'relabel',\r\n DELETE: 'delete',\r\n};\r\n\r\n/**\r\n * MicroscopyService is responsible to manage multiple third-party API's\r\n * microscopy viewers expose methods to manage the interaction with these\r\n * viewers and handle their ROI graphics to create, remove and modify the\r\n * ROI annotations relevant to the application\r\n */\r\nexport default class MicroscopyService extends PubSubService {\r\n public static REGISTRATION = serviceManager => {\r\n return {\r\n name: 'microscopyService',\r\n altName: 'MicroscopyService',\r\n create: ({ configuration = {} }) => {\r\n return new MicroscopyService(serviceManager);\r\n },\r\n };\r\n };\r\n\r\n serviceManager: any;\r\n\r\n managedViewers = new Set();\r\n roiUids = new Set();\r\n annotations = {};\r\n selectedAnnotation = null;\r\n pendingFocus = false;\r\n\r\n constructor(serviceManager) {\r\n super(EVENTS);\r\n this.serviceManager = serviceManager;\r\n this._onRoiAdded = this._onRoiAdded.bind(this);\r\n this._onRoiModified = this._onRoiModified.bind(this);\r\n this._onRoiRemoved = this._onRoiRemoved.bind(this);\r\n this._onRoiUpdated = this._onRoiUpdated.bind(this);\r\n this._onRoiSelected = this._onRoiSelected.bind(this);\r\n this.isROIsVisible = true;\r\n }\r\n\r\n /**\r\n * Clears all the annotations and managed viewers, setting the manager state\r\n * to its initial state\r\n */\r\n clear() {\r\n this.managedViewers.forEach(managedViewer => managedViewer.destroy());\r\n this.managedViewers.clear();\r\n for (const key in this.annotations) {\r\n delete this.annotations[key];\r\n }\r\n\r\n this.roiUids.clear();\r\n this.selectedAnnotation = null;\r\n this.pendingFocus = false;\r\n }\r\n\r\n clearAnnotations() {\r\n Object.keys(this.annotations).forEach(uid => {\r\n this.removeAnnotation(this.annotations[uid]);\r\n });\r\n }\r\n\r\n /**\r\n * Observes when a ROI graphic is added, creating the correspondent annotation\r\n * with the current graphic and view state.\r\n * Creates a subscription for label updating for the created annotation and\r\n * publishes an ANNOTATION_UPDATED event when it happens.\r\n * Also triggers the relabel process after the graphic is placed.\r\n *\r\n * @param {Object} data The published data\r\n * @param {Object} data.roiGraphic The added ROI graphic object\r\n * @param {ViewerManager} data.managedViewer The origin viewer for the event\r\n */\r\n _onRoiAdded(data) {\r\n const { roiGraphic, managedViewer, label } = data;\r\n const { studyInstanceUID, seriesInstanceUID } = managedViewer;\r\n const viewState = managedViewer.getViewState();\r\n\r\n const roiAnnotation = new RoiAnnotation(\r\n roiGraphic,\r\n studyInstanceUID,\r\n seriesInstanceUID,\r\n '',\r\n viewState\r\n );\r\n\r\n this.roiUids.add(roiGraphic.uid);\r\n this.annotations[roiGraphic.uid] = roiAnnotation;\r\n\r\n roiAnnotation.subscribe(AnnotationEvents.LABEL_UPDATED, () => {\r\n this._broadcastEvent(EVENTS.ANNOTATION_UPDATED, roiAnnotation);\r\n });\r\n\r\n if (label !== undefined) {\r\n roiAnnotation.setLabel(label);\r\n } else {\r\n const onRelabel = item =>\r\n managedViewer.updateROIProperties({\r\n uid: roiGraphic.uid,\r\n properties: { label: item.label, finding: item.finding },\r\n });\r\n this.triggerRelabel(roiAnnotation, true, onRelabel);\r\n }\r\n }\r\n\r\n /**\r\n * Observes when a ROI graphic is modified, updating the correspondent\r\n * annotation with the current graphic and view state.\r\n *\r\n * @param {Object} data The published data\r\n * @param {Object} data.roiGraphic The modified ROI graphic object\r\n */\r\n _onRoiModified(data) {\r\n const { roiGraphic, managedViewer } = data;\r\n const roiAnnotation = this.getAnnotation(roiGraphic.uid);\r\n if (!roiAnnotation) {\r\n return;\r\n }\r\n roiAnnotation.setRoiGraphic(roiGraphic);\r\n roiAnnotation.setViewState(managedViewer.getViewState());\r\n }\r\n\r\n /**\r\n * Observes when a ROI graphic is removed, reflecting the removal in the\r\n * annotations' state.\r\n *\r\n * @param {Object} data The published data\r\n * @param {Object} data.roiGraphic The removed ROI graphic object\r\n */\r\n _onRoiRemoved(data) {\r\n const { roiGraphic } = data;\r\n this.roiUids.delete(roiGraphic.uid);\r\n this.annotations[roiGraphic.uid].destroy();\r\n delete this.annotations[roiGraphic.uid];\r\n this._broadcastEvent(EVENTS.ANNOTATION_REMOVED, roiGraphic);\r\n }\r\n\r\n /**\r\n * Observes any changes on ROI graphics and synchronize all the managed\r\n * viewers to reflect those changes.\r\n * Also publishes an ANNOTATION_UPDATED event to notify the subscribers.\r\n *\r\n * @param {Object} data The published data\r\n * @param {Object} data.roiGraphic The added ROI graphic object\r\n * @param {ViewerManager} data.managedViewer The origin viewer for the event\r\n */\r\n _onRoiUpdated(data) {\r\n const { roiGraphic, managedViewer } = data;\r\n this.synchronizeViewers(managedViewer);\r\n this._broadcastEvent(EVENTS.ANNOTATION_UPDATED, this.getAnnotation(roiGraphic.uid));\r\n }\r\n\r\n /**\r\n * Observes when an ROI is selected.\r\n * Also publishes an ANNOTATION_SELECTED event to notify the subscribers.\r\n *\r\n * @param {Object} data The published data\r\n * @param {Object} data.roiGraphic The added ROI graphic object\r\n * @param {ViewerManager} data.managedViewer The origin viewer for the event\r\n */\r\n _onRoiSelected(data) {\r\n const { roiGraphic } = data;\r\n const selectedAnnotation = this.getAnnotation(roiGraphic.uid);\r\n if (selectedAnnotation && selectedAnnotation !== this.getSelectedAnnotation()) {\r\n if (this.selectedAnnotation) {\r\n this.clearSelection();\r\n }\r\n this.selectedAnnotation = selectedAnnotation;\r\n this._broadcastEvent(EVENTS.ANNOTATION_SELECTED, selectedAnnotation);\r\n }\r\n }\r\n\r\n /**\r\n * Creates the subscriptions for the managed viewer being added\r\n *\r\n * @param {ViewerManager} managedViewer The viewer being added\r\n */\r\n _addManagedViewerSubscriptions(managedViewer) {\r\n managedViewer._roiAddedSubscription = managedViewer.subscribe(\r\n ViewerEvents.ADDED,\r\n this._onRoiAdded\r\n );\r\n managedViewer._roiModifiedSubscription = managedViewer.subscribe(\r\n ViewerEvents.MODIFIED,\r\n this._onRoiModified\r\n );\r\n managedViewer._roiRemovedSubscription = managedViewer.subscribe(\r\n ViewerEvents.REMOVED,\r\n this._onRoiRemoved\r\n );\r\n managedViewer._roiUpdatedSubscription = managedViewer.subscribe(\r\n ViewerEvents.UPDATED,\r\n this._onRoiUpdated\r\n );\r\n managedViewer._roiSelectedSubscription = managedViewer.subscribe(\r\n ViewerEvents.UPDATED,\r\n this._onRoiSelected\r\n );\r\n }\r\n\r\n /**\r\n * Removes the subscriptions for the managed viewer being removed\r\n *\r\n * @param {ViewerManager} managedViewer The viewer being removed\r\n */\r\n _removeManagedViewerSubscriptions(managedViewer) {\r\n managedViewer._roiAddedSubscription && managedViewer._roiAddedSubscription.unsubscribe();\r\n managedViewer._roiModifiedSubscription && managedViewer._roiModifiedSubscription.unsubscribe();\r\n managedViewer._roiRemovedSubscription && managedViewer._roiRemovedSubscription.unsubscribe();\r\n managedViewer._roiUpdatedSubscription && managedViewer._roiUpdatedSubscription.unsubscribe();\r\n managedViewer._roiSelectedSubscription && managedViewer._roiSelectedSubscription.unsubscribe();\r\n\r\n managedViewer._roiAddedSubscription = null;\r\n managedViewer._roiModifiedSubscription = null;\r\n managedViewer._roiRemovedSubscription = null;\r\n managedViewer._roiUpdatedSubscription = null;\r\n managedViewer._roiSelectedSubscription = null;\r\n }\r\n\r\n /**\r\n * Returns the managed viewers that are displaying the image with the given\r\n * study and series UIDs\r\n *\r\n * @param {String} studyInstanceUID UID for the study\r\n * @param {String} seriesInstanceUID UID for the series\r\n *\r\n * @returns {Array} The managed viewers for the given series UID\r\n */\r\n _getManagedViewersForSeries(studyInstanceUID, seriesInstanceUID) {\r\n const filter = managedViewer =>\r\n managedViewer.studyInstanceUID === studyInstanceUID &&\r\n managedViewer.seriesInstanceUID === seriesInstanceUID;\r\n return Array.from(this.managedViewers).filter(filter);\r\n }\r\n\r\n /**\r\n * Returns the managed viewers that are displaying the image with the given\r\n * study UID\r\n *\r\n * @param {String} studyInstanceUID UID for the study\r\n *\r\n * @returns {Array} The managed viewers for the given series UID\r\n */\r\n getManagedViewersForStudy(studyInstanceUID) {\r\n const filter = managedViewer => managedViewer.studyInstanceUID === studyInstanceUID;\r\n return Array.from(this.managedViewers).filter(filter);\r\n }\r\n\r\n /**\r\n * Restores the created annotations for the viewer being added\r\n *\r\n * @param {ViewerManager} managedViewer The viewer being added\r\n */\r\n _restoreAnnotations(managedViewer) {\r\n const { studyInstanceUID, seriesInstanceUID } = managedViewer;\r\n const annotations = this.getAnnotationsForSeries(studyInstanceUID, seriesInstanceUID);\r\n annotations.forEach(roiAnnotation => {\r\n managedViewer.addRoiGraphic(roiAnnotation.roiGraphic);\r\n });\r\n }\r\n\r\n /**\r\n * Creates a managed viewer instance for the given third-party API's viewer.\r\n * Restores existing annotations for the given study/series.\r\n * Adds event subscriptions for the viewer being added.\r\n * Focuses the selected annotation when the viewer is being loaded into the\r\n * active viewport.\r\n *\r\n * @param viewer - Third-party viewer API's object to be managed\r\n * @param viewportId - The viewport Id where the viewer will be loaded\r\n * @param container - The DOM element where it will be rendered\r\n * @param studyInstanceUID - The study UID of the loaded image\r\n * @param seriesInstanceUID - The series UID of the loaded image\r\n * @param displaySets - All displaySets related to the same StudyInstanceUID\r\n *\r\n * @returns {ViewerManager} managed viewer\r\n */\r\n addViewer(viewer, viewportId, container, studyInstanceUID, seriesInstanceUID) {\r\n const managedViewer = new ViewerManager(\r\n viewer,\r\n viewportId,\r\n container,\r\n studyInstanceUID,\r\n seriesInstanceUID\r\n );\r\n\r\n this._restoreAnnotations(managedViewer);\r\n viewer._manager = managedViewer;\r\n this.managedViewers.add(managedViewer);\r\n\r\n // this._potentiallyLoadSR(studyInstanceUID, displaySets);\r\n this._addManagedViewerSubscriptions(managedViewer);\r\n\r\n if (this.pendingFocus) {\r\n this.pendingFocus = false;\r\n this.focusAnnotation(this.selectedAnnotation, viewportId);\r\n }\r\n\r\n return managedViewer;\r\n }\r\n\r\n _potentiallyLoadSR(StudyInstanceUID, displaySets) {\r\n const studyMetadata = DicomMetadataStore.getStudy(StudyInstanceUID);\r\n const smDisplaySet = displaySets.find(ds => ds.Modality === 'SM');\r\n\r\n const { FrameOfReferenceUID, othersFrameOfReferenceUID } = smDisplaySet;\r\n\r\n if (!studyMetadata) {\r\n return;\r\n }\r\n\r\n let derivedDisplaySets = FrameOfReferenceUID\r\n ? displaySets.filter(\r\n ds =>\r\n ds.ReferencedFrameOfReferenceUID === FrameOfReferenceUID ||\r\n // sometimes each depth instance has the different FrameOfReferenceID\r\n othersFrameOfReferenceUID.includes(ds.ReferencedFrameOfReferenceUID)\r\n )\r\n : [];\r\n\r\n if (!derivedDisplaySets.length) {\r\n return;\r\n }\r\n\r\n derivedDisplaySets = derivedDisplaySets.filter(ds => ds.Modality === 'SR');\r\n\r\n if (derivedDisplaySets.some(ds => ds.isLoaded === true)) {\r\n // Don't auto load\r\n return;\r\n }\r\n\r\n // find most recent and load it.\r\n let recentDateTime = 0;\r\n let recentDisplaySet = derivedDisplaySets[0];\r\n\r\n derivedDisplaySets.forEach(ds => {\r\n const dateTime = Number(`${ds.SeriesDate}${ds.SeriesTime}`);\r\n if (dateTime > recentDateTime) {\r\n recentDateTime = dateTime;\r\n recentDisplaySet = ds;\r\n }\r\n });\r\n\r\n recentDisplaySet.isLoading = true;\r\n\r\n recentDisplaySet.load(smDisplaySet);\r\n }\r\n\r\n /**\r\n * Removes the given third-party viewer API's object from the managed viewers\r\n * and clears all its event subscriptions\r\n *\r\n * @param {Object} viewer Third-party viewer API's object to be removed\r\n */\r\n removeViewer(viewer) {\r\n const managedViewer = viewer._manager;\r\n\r\n this._removeManagedViewerSubscriptions(managedViewer);\r\n managedViewer.destroy();\r\n this.managedViewers.delete(managedViewer);\r\n }\r\n\r\n /**\r\n * Toggle ROIs visibility\r\n */\r\n toggleROIsVisibility() {\r\n this.isROIsVisible ? this.hideROIs() : this.showROIs;\r\n this.isROIsVisible = !this.isROIsVisible;\r\n }\r\n\r\n /**\r\n * Hide all ROIs\r\n */\r\n hideROIs() {\r\n this.managedViewers.forEach(mv => mv.hideROIs());\r\n }\r\n\r\n /** Show all ROIs */\r\n showROIs() {\r\n this.managedViewers.forEach(mv => mv.showROIs());\r\n }\r\n\r\n /**\r\n * Returns a RoiAnnotation instance for the given ROI UID\r\n *\r\n * @param {String} uid UID of the annotation\r\n *\r\n * @returns {RoiAnnotation} The RoiAnnotation instance found for the given UID\r\n */\r\n getAnnotation(uid) {\r\n return this.annotations[uid];\r\n }\r\n\r\n /**\r\n * Returns all the RoiAnnotation instances being managed\r\n *\r\n * @returns {Array} All RoiAnnotation instances\r\n */\r\n getAnnotations() {\r\n const annotations = [];\r\n Object.keys(this.annotations).forEach(uid => {\r\n annotations.push(this.getAnnotation(uid));\r\n });\r\n return annotations;\r\n }\r\n\r\n /**\r\n * Returns the RoiAnnotation instances registered with the given study UID\r\n *\r\n * @param {String} studyInstanceUID UID for the study\r\n */\r\n getAnnotationsForStudy(studyInstanceUID) {\r\n const filter = a => a.studyInstanceUID === studyInstanceUID;\r\n return this.getAnnotations().filter(filter);\r\n }\r\n\r\n /**\r\n * Returns the RoiAnnotation instances registered with the given study and\r\n * series UIDs\r\n *\r\n * @param {String} studyInstanceUID UID for the study\r\n * @param {String} seriesInstanceUID UID for the series\r\n */\r\n getAnnotationsForSeries(studyInstanceUID, seriesInstanceUID) {\r\n const filter = annotation =>\r\n annotation.studyInstanceUID === studyInstanceUID &&\r\n annotation.seriesInstanceUID === seriesInstanceUID;\r\n return this.getAnnotations().filter(filter);\r\n }\r\n\r\n /**\r\n * Returns the selected RoiAnnotation instance or null if none is selected\r\n *\r\n * @returns {RoiAnnotation} The selected RoiAnnotation instance\r\n */\r\n getSelectedAnnotation() {\r\n return this.selectedAnnotation;\r\n }\r\n\r\n /**\r\n * Clear current RoiAnnotation selection\r\n */\r\n clearSelection() {\r\n if (this.selectedAnnotation) {\r\n this.setROIStyle(this.selectedAnnotation.uid, {\r\n stroke: {\r\n color: '#00ff00',\r\n },\r\n });\r\n }\r\n this.selectedAnnotation = null;\r\n }\r\n\r\n /**\r\n * Selects the given RoiAnnotation instance, publishing an ANNOTATION_SELECTED\r\n * event to notify all the subscribers\r\n *\r\n * @param {RoiAnnotation} roiAnnotation The instance to be selected\r\n */\r\n selectAnnotation(roiAnnotation) {\r\n if (this.selectedAnnotation) {\r\n this.clearSelection();\r\n }\r\n\r\n this.selectedAnnotation = roiAnnotation;\r\n this._broadcastEvent(EVENTS.ANNOTATION_SELECTED, roiAnnotation);\r\n this.setROIStyle(roiAnnotation.uid, styles.active);\r\n }\r\n\r\n /**\r\n * Toggles overview map\r\n *\r\n * @param viewportId The active viewport index\r\n * @returns {void}\r\n */\r\n toggleOverviewMap(viewportId) {\r\n const managedViewers = Array.from(this.managedViewers);\r\n const managedViewer = managedViewers.find(mv => mv.viewportId === viewportId);\r\n if (managedViewer) {\r\n managedViewer.toggleOverviewMap();\r\n }\r\n }\r\n\r\n /**\r\n * Removes a RoiAnnotation instance from the managed annotations and reflects\r\n * its removal on all third-party viewers being managed\r\n *\r\n * @param {RoiAnnotation} roiAnnotation The instance to be removed\r\n */\r\n removeAnnotation(roiAnnotation) {\r\n const { uid, studyInstanceUID, seriesInstanceUID } = roiAnnotation;\r\n const filter = managedViewer =>\r\n managedViewer.studyInstanceUID === studyInstanceUID &&\r\n managedViewer.seriesInstanceUID === seriesInstanceUID;\r\n\r\n const managedViewers = Array.from(this.managedViewers).filter(filter);\r\n\r\n managedViewers.forEach(managedViewer => managedViewer.removeRoiGraphic(uid));\r\n\r\n if (this.annotations[uid]) {\r\n this.roiUids.delete(uid);\r\n this.annotations[uid].destroy();\r\n delete this.annotations[uid];\r\n\r\n this._broadcastEvent(EVENTS.ANNOTATION_REMOVED, roiAnnotation);\r\n }\r\n }\r\n\r\n /**\r\n * Focus the given RoiAnnotation instance by changing the OpenLayers' Map view\r\n * state of the managed viewer with the given viewport index.\r\n * If the image for the given annotation is not yet loaded into the viewport,\r\n * it will set a pendingFocus flag to true in order to perform the focus when\r\n * the managed viewer instance is created.\r\n *\r\n * @param {RoiAnnotation} roiAnnotation RoiAnnotation instance to be focused\r\n * @param {string} viewportId Index of the viewport to focus\r\n */\r\n focusAnnotation(roiAnnotation, viewportId) {\r\n const filter = mv => mv.viewportId === viewportId;\r\n const managedViewer = Array.from(this.managedViewers).find(filter);\r\n if (managedViewer) {\r\n managedViewer.setViewStateByExtent(roiAnnotation);\r\n } else {\r\n this.pendingFocus = true;\r\n }\r\n }\r\n\r\n /**\r\n * Synchronize the ROI graphics for all the managed viewers that has the same\r\n * series UID of the given managed viewer\r\n *\r\n * @param {ViewerManager} baseManagedViewer Reference managed viewer\r\n */\r\n synchronizeViewers(baseManagedViewer) {\r\n const { studyInstanceUID, seriesInstanceUID } = baseManagedViewer;\r\n const managedViewers = this._getManagedViewersForSeries(studyInstanceUID, seriesInstanceUID);\r\n\r\n // Prevent infinite loops arrising from updates.\r\n managedViewers.forEach(managedViewer => this._removeManagedViewerSubscriptions(managedViewer));\r\n\r\n managedViewers.forEach(managedViewer => {\r\n if (managedViewer === baseManagedViewer) {\r\n return;\r\n }\r\n\r\n const annotations = this.getAnnotationsForSeries(studyInstanceUID, seriesInstanceUID);\r\n managedViewer.clearRoiGraphics();\r\n annotations.forEach(roiAnnotation => {\r\n managedViewer.addRoiGraphic(roiAnnotation.roiGraphic);\r\n });\r\n });\r\n\r\n managedViewers.forEach(managedViewer => this._addManagedViewerSubscriptions(managedViewer));\r\n }\r\n\r\n /**\r\n * Activates interactions across all the viewers being managed\r\n *\r\n * @param {Array} interactions interactions\r\n */\r\n activateInteractions(interactions) {\r\n this.managedViewers.forEach(mv => mv.activateInteractions(interactions));\r\n this.activeInteractions = interactions;\r\n }\r\n\r\n /**\r\n * Triggers the relabelling process for the given RoiAnnotation instance, by\r\n * publishing the RELABEL event to notify the subscribers\r\n *\r\n * @param {RoiAnnotation} roiAnnotation The instance to be relabelled\r\n * @param {boolean} newAnnotation Whether the annotation is newly drawn (so it deletes on cancel).\r\n */\r\n triggerRelabel(roiAnnotation, newAnnotation = false, onRelabel) {\r\n if (!onRelabel) {\r\n onRelabel = ({ label }) =>\r\n this.managedViewers.forEach(mv =>\r\n mv.updateROIProperties({\r\n uid: roiAnnotation.uid,\r\n properties: { label },\r\n })\r\n );\r\n }\r\n\r\n this._broadcastEvent(EVENTS.RELABEL, {\r\n roiAnnotation,\r\n deleteCallback: () => this.removeAnnotation(roiAnnotation),\r\n successCallback: onRelabel,\r\n newAnnotation,\r\n });\r\n }\r\n\r\n /**\r\n * Triggers the deletion process for the given RoiAnnotation instance, by\r\n * publishing the DELETE event to notify the subscribers\r\n *\r\n * @param {RoiAnnotation} roiAnnotation The instance to be deleted\r\n */\r\n triggerDelete(roiAnnotation) {\r\n this._broadcastEvent(EVENTS.DELETE, roiAnnotation);\r\n }\r\n\r\n /**\r\n * Set ROI style for all managed viewers\r\n *\r\n * @param {string} uid The ROI uid that will be styled\r\n * @param {object} styleOptions - Style options\r\n * @param {object*} styleOptions.stroke - Style options for the outline of the geometry\r\n * @param {number[]} styleOptions.stroke.color - RGBA color of the outline\r\n * @param {number} styleOptions.stroke.width - Width of the outline\r\n * @param {object*} styleOptions.fill - Style options for body the geometry\r\n * @param {number[]} styleOptions.fill.color - RGBA color of the body\r\n * @param {object*} styleOptions.image - Style options for image\r\n */\r\n setROIStyle(uid, styleOptions) {\r\n this.managedViewers.forEach(mv => mv.setROIStyle(uid, styleOptions));\r\n }\r\n}\r\n\r\nexport { EVENTS };\r\n","import React from 'react';\r\nimport { Input, Dialog, ButtonEnums } from '@ohif/ui';\r\n\r\n/**\r\n *\r\n * @param {*} data\r\n * @param {*} data.text\r\n * @param {*} data.label\r\n * @param {*} event\r\n * @param {func} callback\r\n * @param {*} isArrowAnnotateInputDialog\r\n */\r\nexport default function callInputDialog({\r\n uiDialogService,\r\n title = 'Annotation',\r\n defaultValue = '',\r\n callback = (value: string, action: string) => {},\r\n}) {\r\n const dialogId = 'microscopy-input-dialog';\r\n\r\n const onSubmitHandler = ({ action, value }) => {\r\n switch (action.id) {\r\n case 'save':\r\n callback(value.value, action.id);\r\n break;\r\n case 'cancel':\r\n callback('', action.id);\r\n break;\r\n }\r\n uiDialogService.dismiss({ id: dialogId });\r\n };\r\n\r\n if (uiDialogService) {\r\n uiDialogService.create({\r\n id: dialogId,\r\n centralize: true,\r\n isDraggable: false,\r\n showOverlay: true,\r\n content: Dialog,\r\n contentProps: {\r\n title: title,\r\n value: { value: defaultValue },\r\n noCloseButton: true,\r\n onClose: () => uiDialogService.dismiss({ id: dialogId }),\r\n actions: [\r\n { id: 'cancel', text: 'Cancel', type: ButtonEnums.type.secondary },\r\n { id: 'save', text: 'Save', type: ButtonEnums.type.primary },\r\n ],\r\n onSubmit: onSubmitHandler,\r\n body: ({ value, setValue }) => {\r\n return (\r\n {\r\n event.persist();\r\n setValue(value => ({ ...value, value: event.target.value }));\r\n }}\r\n onKeyPress={event => {\r\n if (event.key === 'Enter') {\r\n onSubmitHandler({ value, action: { id: 'save' } });\r\n }\r\n }}\r\n />\r\n );\r\n },\r\n },\r\n });\r\n }\r\n}\r\n","import React, { useState, useEffect } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { ServicesManager, ExtensionManager, CommandsManager, DicomMetadataStore } from '@ohif/core';\r\nimport { MeasurementTable, Icon, ButtonGroup, Button } from '@ohif/ui';\r\nimport { withTranslation, WithTranslation } from 'react-i18next';\r\nimport { EVENTS as MicroscopyEvents } from '../../services/MicroscopyService';\r\nimport dcmjs from 'dcmjs';\r\nimport styles from '../../utils/styles';\r\nimport callInputDialog from '../../utils/callInputDialog';\r\nimport constructSR from '../../utils/constructSR';\r\nimport { saveByteArray } from '../../utils/saveByteArray';\r\n\r\nlet saving = false;\r\nconst { datasetToBuffer } = dcmjs.data;\r\n\r\nconst formatArea = area => {\r\n let mult = 1;\r\n let unit = 'mm';\r\n if (area > 1000000) {\r\n unit = 'm';\r\n mult = 1 / 1000000;\r\n } else if (area < 1) {\r\n unit = 'μm';\r\n mult = 1000000;\r\n }\r\n return `${(area * mult).toFixed(2)} ${unit}²`;\r\n};\r\n\r\nconst formatLength = (length, unit) => {\r\n let mult = 1;\r\n if (unit == 'km' || (!unit && length > 1000000)) {\r\n unit = 'km';\r\n mult = 1 / 1000000;\r\n } else if (unit == 'm' || (!unit && length > 1000)) {\r\n unit = 'm';\r\n mult = 1 / 1000;\r\n } else if (unit == 'μm' || (!unit && length < 1)) {\r\n unit = 'μm';\r\n mult = 1000;\r\n } else if (unit && unit != 'mm') {\r\n throw new Error(`Unknown length unit ${unit}`);\r\n } else {\r\n unit = 'mm';\r\n }\r\n return `${(length * mult).toFixed(2)} ${unit}`;\r\n};\r\n\r\ninterface IMicroscopyPanelProps extends WithTranslation {\r\n viewports: PropTypes.array;\r\n activeViewportId: PropTypes.string;\r\n\r\n //\r\n onSaveComplete?: PropTypes.func; // callback when successfully saved annotations\r\n onRejectComplete?: PropTypes.func; // callback when rejected annotations\r\n\r\n //\r\n servicesManager: ServicesManager;\r\n extensionManager: ExtensionManager;\r\n commandsManager: CommandsManager;\r\n}\r\n\r\n/**\r\n * Microscopy Measurements Panel Component\r\n *\r\n * @param props\r\n * @returns\r\n */\r\nfunction MicroscopyPanel(props: IMicroscopyPanelProps) {\r\n const { microscopyService } = props.servicesManager.services;\r\n\r\n const [studyInstanceUID, setStudyInstanceUID] = useState(null as string | null);\r\n const [roiAnnotations, setRoiAnnotations] = useState([] as any[]);\r\n const [selectedAnnotation, setSelectedAnnotation] = useState(null as any);\r\n const { servicesManager, extensionManager } = props;\r\n\r\n const { uiDialogService, displaySetService } = servicesManager.services;\r\n\r\n useEffect(() => {\r\n const viewport = props.viewports.get(props.activeViewportId);\r\n if (viewport?.displaySetInstanceUIDs[0]) {\r\n const displaySet = displaySetService.getDisplaySetByUID(viewport.displaySetInstanceUIDs[0]);\r\n if (displaySet) {\r\n setStudyInstanceUID(displaySet.StudyInstanceUID);\r\n }\r\n }\r\n }, [props.viewports, props.activeViewportId]);\r\n\r\n useEffect(() => {\r\n const onAnnotationUpdated = () => {\r\n const roiAnnotations = microscopyService.getAnnotationsForStudy(studyInstanceUID);\r\n setRoiAnnotations(roiAnnotations);\r\n };\r\n\r\n const onAnnotationSelected = () => {\r\n const selectedAnnotation = microscopyService.getSelectedAnnotation();\r\n setSelectedAnnotation(selectedAnnotation);\r\n };\r\n\r\n const onAnnotationRemoved = () => {\r\n onAnnotationUpdated();\r\n };\r\n\r\n const { unsubscribe: unsubscribeAnnotationUpdated } = microscopyService.subscribe(\r\n MicroscopyEvents.ANNOTATION_UPDATED,\r\n onAnnotationUpdated\r\n );\r\n const { unsubscribe: unsubscribeAnnotationSelected } = microscopyService.subscribe(\r\n MicroscopyEvents.ANNOTATION_SELECTED,\r\n onAnnotationSelected\r\n );\r\n const { unsubscribe: unsubscribeAnnotationRemoved } = microscopyService.subscribe(\r\n MicroscopyEvents.ANNOTATION_REMOVED,\r\n onAnnotationRemoved\r\n );\r\n onAnnotationUpdated();\r\n onAnnotationSelected();\r\n\r\n // on unload unsubscribe from events\r\n return () => {\r\n unsubscribeAnnotationUpdated();\r\n unsubscribeAnnotationSelected();\r\n unsubscribeAnnotationRemoved();\r\n };\r\n }, [studyInstanceUID]);\r\n\r\n /**\r\n * On clicking \"Save Annotations\" button, prompt an input modal for the\r\n * new series' description, and continue to save.\r\n *\r\n * @returns\r\n */\r\n const promptSave = () => {\r\n const annotations = microscopyService.getAnnotationsForStudy(studyInstanceUID);\r\n\r\n if (!annotations || saving) {\r\n return;\r\n }\r\n\r\n callInputDialog({\r\n uiDialogService,\r\n title: 'Enter description of the Series',\r\n defaultValue: '',\r\n callback: (value: string, action: string) => {\r\n switch (action) {\r\n case 'save': {\r\n saveFunction(value);\r\n }\r\n }\r\n },\r\n });\r\n };\r\n\r\n const getAllDisplaySets = (studyMetadata: any) => {\r\n let allDisplaySets = [] as any[];\r\n studyMetadata.series.forEach((series: any) => {\r\n const displaySets = displaySetService.getDisplaySetsForSeries(series.SeriesInstanceUID);\r\n allDisplaySets = allDisplaySets.concat(displaySets);\r\n });\r\n return allDisplaySets;\r\n };\r\n\r\n /**\r\n * Save annotations as a series\r\n *\r\n * @param SeriesDescription - series description\r\n * @returns\r\n */\r\n const saveFunction = async (SeriesDescription: string) => {\r\n const dataSource = extensionManager.getActiveDataSource()[0];\r\n const { onSaveComplete } = props;\r\n const annotations = microscopyService.getAnnotationsForStudy(studyInstanceUID);\r\n\r\n saving = true;\r\n\r\n // There is only one viewer possible for one study,\r\n // Since once study contains multiple resolution levels (series) of one whole\r\n // Slide image.\r\n\r\n const studyMetadata = DicomMetadataStore.getStudy(studyInstanceUID);\r\n const displaySets = getAllDisplaySets(studyMetadata);\r\n const smDisplaySet = displaySets.find(ds => ds.Modality === 'SM');\r\n\r\n // Get the next available series number after 4700.\r\n\r\n const dsWithMetadata = displaySets.filter(\r\n ds => ds.metadata && ds.metadata.SeriesNumber && typeof ds.metadata.SeriesNumber === 'number'\r\n );\r\n\r\n // Generate next series number\r\n const seriesNumbers = dsWithMetadata.map(ds => ds.metadata.SeriesNumber);\r\n const maxSeriesNumber = Math.max(...seriesNumbers, 4700);\r\n const SeriesNumber = maxSeriesNumber + 1;\r\n\r\n const { instance: metadata } = smDisplaySet;\r\n\r\n // construct SR dataset\r\n const dataset = constructSR(metadata, { SeriesDescription, SeriesNumber }, annotations);\r\n\r\n // Save in DICOM format\r\n try {\r\n if (dataSource) {\r\n if (dataSource.wadoRoot == 'saveDicom') {\r\n // download as DICOM file\r\n const part10Buffer = datasetToBuffer(dataset);\r\n saveByteArray(part10Buffer, `sr-microscopy.dcm`);\r\n } else {\r\n // Save into Web Data source\r\n const { StudyInstanceUID } = dataset;\r\n await dataSource.store.dicom(dataset);\r\n if (StudyInstanceUID) {\r\n dataSource.deleteStudyMetadataPromise(StudyInstanceUID);\r\n }\r\n }\r\n onSaveComplete({\r\n title: 'SR Saved',\r\n message: 'Measurements downloaded successfully',\r\n type: 'success',\r\n });\r\n } else {\r\n console.error('Server unspecified');\r\n }\r\n } catch (error) {\r\n onSaveComplete({\r\n title: 'SR Save Failed',\r\n message: error.message || error.toString(),\r\n type: 'error',\r\n });\r\n } finally {\r\n saving = false;\r\n }\r\n };\r\n\r\n /**\r\n * On clicking \"Reject annotations\" button\r\n */\r\n const onDeleteCurrentSRHandler = async () => {\r\n try {\r\n const activeViewport = props.viewports[props.activeViewportId];\r\n const { StudyInstanceUID } = activeViewport;\r\n\r\n // TODO: studies?\r\n const study = DicomMetadataStore.getStudy(StudyInstanceUID);\r\n\r\n const lastDerivedDisplaySet = study.derivedDisplaySets.sort((ds1: any, ds2: any) => {\r\n const dateTime1 = Number(`${ds1.SeriesDate}${ds1.SeriesTime}`);\r\n const dateTime2 = Number(`${ds2.SeriesDate}${ds2.SeriesTime}`);\r\n return dateTime1 > dateTime2;\r\n })[study.derivedDisplaySets.length - 1];\r\n\r\n // TODO: use dataSource.reject.dicom()\r\n // await DICOMSR.rejectMeasurements(\r\n // study.wadoRoot,\r\n // lastDerivedDisplaySet.StudyInstanceUID,\r\n // lastDerivedDisplaySet.SeriesInstanceUID\r\n // );\r\n props.onRejectComplete({\r\n title: 'Report rejected',\r\n message: 'Latest report rejected successfully',\r\n type: 'success',\r\n });\r\n } catch (error) {\r\n props.onRejectComplete({\r\n title: 'Failed to reject report',\r\n message: error.message,\r\n type: 'error',\r\n });\r\n }\r\n };\r\n\r\n /**\r\n * Handler for clicking event of an annotation item.\r\n *\r\n * @param param0\r\n */\r\n const onMeasurementItemClickHandler = ({ uid }: { uid: string }) => {\r\n const roiAnnotation = microscopyService.getAnnotation(uid);\r\n microscopyService.selectAnnotation(roiAnnotation);\r\n microscopyService.focusAnnotation(roiAnnotation, props.activeViewportId);\r\n };\r\n\r\n /**\r\n * Handler for \"Edit\" action of an annotation item\r\n * @param param0\r\n */\r\n const onMeasurementItemEditHandler = ({ uid, isActive }: { uid: string; isActive: boolean }) => {\r\n props.commandsManager.runCommand('setLabel', { uid }, 'MICROSCOPY');\r\n };\r\n\r\n // Convert ROI annotations managed by microscopyService into our\r\n // own format for display\r\n const data = roiAnnotations.map((roiAnnotation, index) => {\r\n const label = roiAnnotation.getDetailedLabel();\r\n const area = roiAnnotation.getArea();\r\n const length = roiAnnotation.getLength();\r\n const shortAxisLength = roiAnnotation.roiGraphic.properties.shortAxisLength;\r\n const isSelected: boolean = selectedAnnotation === roiAnnotation;\r\n\r\n // other events\r\n const { uid } = roiAnnotation;\r\n\r\n // display text\r\n const displayText = [];\r\n\r\n if (area !== undefined) {\r\n displayText.push(formatArea(area));\r\n } else if (length !== undefined) {\r\n displayText.push(\r\n shortAxisLength\r\n ? `${formatLength(length, 'μm')} x ${formatLength(shortAxisLength, 'μm')}`\r\n : `${formatLength(length, 'μm')}`\r\n );\r\n }\r\n\r\n // convert to measurementItem format compatible with component\r\n return {\r\n uid,\r\n index,\r\n label,\r\n isActive: isSelected,\r\n displayText,\r\n roiAnnotation,\r\n };\r\n });\r\n\r\n const disabled = data.length === 0;\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nconst connectedMicroscopyPanel = withTranslation(['MicroscopyTable', 'Common'])(MicroscopyPanel);\r\n\r\nexport default connectedMicroscopyPanel;\r\n","import OHIF from '@ohif/core';\r\n\r\nconst { utils } = OHIF;\r\n\r\nconst SOP_CLASS_UIDS = {\r\n VL_WHOLE_SLIDE_MICROSCOPY_IMAGE_STORAGE: '1.2.840.10008.5.1.4.1.1.77.1.6',\r\n};\r\n\r\nconst SOPClassHandlerId =\r\n '@ohif/extension-dicom-microscopy.sopClassHandlerModule.DicomMicroscopySopClassHandler';\r\n\r\nfunction _getDisplaySetsFromSeries(instances, servicesManager, extensionManager) {\r\n // If the series has no instances, stop here\r\n if (!instances || !instances.length) {\r\n throw new Error('No instances were provided');\r\n }\r\n\r\n const instance = instances[0];\r\n\r\n let singleFrameInstance = instance;\r\n let currentFrames = +singleFrameInstance.NumberOfFrames || 1;\r\n for (const instanceI of instances) {\r\n const framesI = +instanceI.NumberOfFrames || 1;\r\n if (framesI < currentFrames) {\r\n singleFrameInstance = instanceI;\r\n currentFrames = framesI;\r\n }\r\n }\r\n let imageIdForThumbnail = null;\r\n if (singleFrameInstance) {\r\n if (currentFrames == 1) {\r\n // Not all DICOM server implementations support thumbnail service,\r\n // So if we have a single-frame image, we will prefer it.\r\n imageIdForThumbnail = singleFrameInstance.imageId;\r\n }\r\n if (!imageIdForThumbnail) {\r\n // use the thumbnail service provided by DICOM server\r\n const dataSource = extensionManager.getActiveDataSource()[0];\r\n imageIdForThumbnail = dataSource.getImageIdsForInstance({\r\n instance: singleFrameInstance,\r\n thumbnail: true,\r\n });\r\n }\r\n }\r\n\r\n const {\r\n FrameOfReferenceUID,\r\n SeriesDescription,\r\n ContentDate,\r\n ContentTime,\r\n SeriesNumber,\r\n StudyInstanceUID,\r\n SeriesInstanceUID,\r\n SOPInstanceUID,\r\n SOPClassUID,\r\n } = instance;\r\n\r\n instances = instances.map(inst => {\r\n // NOTE: According to DICOM standard a series should have a FrameOfReferenceUID\r\n // When the Microscopy file was built by certain tool from multiple image files,\r\n // each instance's FrameOfReferenceUID is sometimes different.\r\n // Even though this means the file was not well formatted DICOM VL Whole Slide Microscopy Image,\r\n // the case is so often, so let's override this value manually here.\r\n //\r\n // https://dicom.nema.org/medical/dicom/current/output/chtml/part03/sect_C.7.4.html#sect_C.7.4.1.1.1\r\n\r\n inst.FrameOfReferenceUID = instance.FrameOfReferenceUID;\r\n\r\n return inst;\r\n });\r\n\r\n const othersFrameOfReferenceUID = instances\r\n .filter(v => v)\r\n .map(inst => inst.FrameOfReferenceUID)\r\n .filter((value, index, array) => array.indexOf(value) === index);\r\n if (othersFrameOfReferenceUID.length > 1) {\r\n console.warn(\r\n 'Expected FrameOfReferenceUID of difference instances within a series to be the same, found multiple different values',\r\n othersFrameOfReferenceUID\r\n );\r\n }\r\n\r\n const displaySet = {\r\n plugin: 'microscopy',\r\n Modality: 'SM',\r\n altImageText: 'Microscopy',\r\n displaySetInstanceUID: utils.guid(),\r\n SOPInstanceUID,\r\n SeriesInstanceUID,\r\n StudyInstanceUID,\r\n FrameOfReferenceUID,\r\n SOPClassHandlerId,\r\n SOPClassUID,\r\n SeriesDescription: SeriesDescription || 'Microscopy Data',\r\n // Map ContentDate/Time to SeriesTime for series list sorting.\r\n SeriesDate: ContentDate,\r\n SeriesTime: ContentTime,\r\n SeriesNumber,\r\n firstInstance: singleFrameInstance, // top level instance in the image Pyramid\r\n instance,\r\n numImageFrames: 0,\r\n numInstances: 1,\r\n imageIdForThumbnail, // thumbnail image\r\n others: instances, // all other level instances in the image Pyramid\r\n othersFrameOfReferenceUID,\r\n };\r\n\r\n return [displaySet];\r\n}\r\n\r\nexport default function getDicomMicroscopySopClassHandler({ servicesManager, extensionManager }) {\r\n const getDisplaySetsFromSeries = instances => {\r\n return _getDisplaySetsFromSeries(instances, servicesManager, extensionManager);\r\n };\r\n\r\n return {\r\n name: 'DicomMicroscopySopClassHandler',\r\n sopClassUids: [SOP_CLASS_UIDS.VL_WHOLE_SLIDE_MICROSCOPY_IMAGE_STORAGE],\r\n getDisplaySetsFromSeries,\r\n };\r\n}\r\n","const DCM_CODE_VALUES = {\r\n IMAGING_MEASUREMENTS: '126010',\r\n MEASUREMENT_GROUP: '125007',\r\n IMAGE_REGION: '111030',\r\n FINDING: '121071',\r\n TRACKING_UNIQUE_IDENTIFIER: '112039',\r\n LENGTH: '410668003',\r\n AREA: '42798000',\r\n SHORT_AXIS: 'G-A186',\r\n LONG_AXIS: 'G-A185',\r\n ELLIPSE_AREA: 'G-D7FE', // TODO: Remove this\r\n};\r\n\r\nexport default DCM_CODE_VALUES;\r\n","export default function toArray(item) {\r\n return Array.isArray(item) ? item : [item];\r\n}\r\n","import dcmjs from 'dcmjs';\r\n\r\nimport DCM_CODE_VALUES from './dcmCodeValues';\r\nimport toArray from './toArray';\r\n\r\nconst MeasurementReport = dcmjs.adapters.DICOMMicroscopyViewer.MeasurementReport;\r\n\r\n// Define as async so that it returns a promise, expected by the ViewportGrid\r\nexport default async function loadSR(\r\n microscopyService,\r\n microscopySRDisplaySet,\r\n referencedDisplaySet\r\n) {\r\n const naturalizedDataset = microscopySRDisplaySet.metadata;\r\n\r\n const { StudyInstanceUID, FrameOfReferenceUID } = referencedDisplaySet;\r\n\r\n const managedViewers = microscopyService.getManagedViewersForStudy(StudyInstanceUID);\r\n\r\n if (!managedViewers || !managedViewers.length) {\r\n return;\r\n }\r\n\r\n microscopySRDisplaySet.isLoaded = true;\r\n\r\n const { rois, labels } = await _getROIsFromToolState(naturalizedDataset, FrameOfReferenceUID);\r\n\r\n const managedViewer = managedViewers[0];\r\n\r\n for (let i = 0; i < rois.length; i++) {\r\n // NOTE: When saving Microscopy SR, we are attaching identifier property\r\n // to each ROI, and when read for display, it is coming in as \"TEXT\"\r\n // evaluation.\r\n // As the Dicom Microscopy Viewer will override styles for \"Text\" evaluations\r\n // to hide all other geometries, we are going to manually remove that\r\n // evaluation item.\r\n const roi = rois[i];\r\n const roiSymbols = Object.getOwnPropertySymbols(roi);\r\n const _properties = roiSymbols.find(s => s.description === 'properties');\r\n const properties = roi[_properties];\r\n properties['evaluations'] = [];\r\n\r\n managedViewer.addRoiGraphicWithLabel(roi, labels[i]);\r\n }\r\n}\r\n\r\nasync function _getROIsFromToolState(naturalizedDataset, FrameOfReferenceUID) {\r\n const toolState = MeasurementReport.generateToolState(naturalizedDataset);\r\n const tools = Object.getOwnPropertyNames(toolState);\r\n\r\n const DICOMMicroscopyViewer = await import(\r\n /* webpackChunkName: \"dicom-microscopy-viewer\" */ 'dicom-microscopy-viewer'\r\n );\r\n\r\n const measurementGroupContentItems = _getMeasurementGroups(naturalizedDataset);\r\n\r\n const rois = [];\r\n const labels = [];\r\n\r\n tools.forEach(t => {\r\n const toolSpecificToolState = toolState[t];\r\n let scoord3d;\r\n\r\n const capsToolType = t.toUpperCase();\r\n\r\n const measurementGroupContentItemsForTool = measurementGroupContentItems.filter(mg => {\r\n const imageRegionContentItem = toArray(mg.ContentSequence).find(\r\n ci => ci.ConceptNameCodeSequence.CodeValue === DCM_CODE_VALUES.IMAGE_REGION\r\n );\r\n\r\n return imageRegionContentItem.GraphicType === capsToolType;\r\n });\r\n\r\n toolSpecificToolState.forEach((coordinates, index) => {\r\n const properties = {};\r\n\r\n const options = {\r\n coordinates,\r\n frameOfReferenceUID: FrameOfReferenceUID,\r\n };\r\n\r\n if (t === 'Polygon') {\r\n scoord3d = new DICOMMicroscopyViewer.scoord3d.Polygon(options);\r\n } else if (t === 'Polyline') {\r\n scoord3d = new DICOMMicroscopyViewer.scoord3d.Polyline(options);\r\n } else if (t === 'Point') {\r\n scoord3d = new DICOMMicroscopyViewer.scoord3d.Point(options);\r\n } else if (t === 'Ellipse') {\r\n scoord3d = new DICOMMicroscopyViewer.scoord3d.Ellipse(options);\r\n } else {\r\n throw new Error('Unsupported tool type');\r\n }\r\n\r\n const measurementGroup = measurementGroupContentItemsForTool[index];\r\n const findingGroup = toArray(measurementGroup.ContentSequence).find(\r\n ci => ci.ConceptNameCodeSequence.CodeValue === DCM_CODE_VALUES.FINDING\r\n );\r\n\r\n const trackingGroup = toArray(measurementGroup.ContentSequence).find(\r\n ci => ci.ConceptNameCodeSequence.CodeValue === DCM_CODE_VALUES.TRACKING_UNIQUE_IDENTIFIER\r\n );\r\n\r\n /**\r\n * Extract presentation state from tracking identifier.\r\n * Currently is stored in SR but should be stored in its tags.\r\n */\r\n if (trackingGroup) {\r\n const regExp = /\\(([^)]+)\\)/;\r\n const matches = regExp.exec(trackingGroup.TextValue);\r\n if (matches && matches[1]) {\r\n properties.presentationState = JSON.parse(matches[1]);\r\n properties.marker = properties.presentationState.marker;\r\n }\r\n }\r\n\r\n let measurements = toArray(measurementGroup.ContentSequence).filter(ci =>\r\n [\r\n DCM_CODE_VALUES.LENGTH,\r\n DCM_CODE_VALUES.AREA,\r\n DCM_CODE_VALUES.SHORT_AXIS,\r\n DCM_CODE_VALUES.LONG_AXIS,\r\n DCM_CODE_VALUES.ELLIPSE_AREA,\r\n ].includes(ci.ConceptNameCodeSequence.CodeValue)\r\n );\r\n\r\n let evaluations = toArray(measurementGroup.ContentSequence).filter(ci =>\r\n [DCM_CODE_VALUES.TRACKING_UNIQUE_IDENTIFIER].includes(ci.ConceptNameCodeSequence.CodeValue)\r\n );\r\n\r\n /**\r\n * TODO: Resolve bug in DCMJS.\r\n * ConceptNameCodeSequence should be a sequence with only one item.\r\n */\r\n evaluations = evaluations.map(evaluation => {\r\n const e = { ...evaluation };\r\n e.ConceptNameCodeSequence = toArray(e.ConceptNameCodeSequence);\r\n return e;\r\n });\r\n\r\n /**\r\n * TODO: Resolve bug in DCMJS.\r\n * ConceptNameCodeSequence should be a sequence with only one item.\r\n */\r\n measurements = measurements.map(measurement => {\r\n const m = { ...measurement };\r\n m.ConceptNameCodeSequence = toArray(m.ConceptNameCodeSequence);\r\n return m;\r\n });\r\n\r\n if (measurements && measurements.length) {\r\n properties.measurements = measurements;\r\n console.log('[SR] retrieving measurements...', measurements);\r\n }\r\n\r\n if (evaluations && evaluations.length) {\r\n properties.evaluations = evaluations;\r\n console.log('[SR] retrieving evaluations...', evaluations);\r\n }\r\n\r\n const roi = new DICOMMicroscopyViewer.roi.ROI({ scoord3d, properties });\r\n rois.push(roi);\r\n\r\n if (findingGroup) {\r\n labels.push(findingGroup.ConceptCodeSequence.CodeValue);\r\n } else {\r\n labels.push('');\r\n }\r\n });\r\n });\r\n\r\n return { rois, labels };\r\n}\r\n\r\nfunction _getMeasurementGroups(naturalizedDataset) {\r\n const { ContentSequence } = naturalizedDataset;\r\n\r\n const imagingMeasurementsContentItem = ContentSequence.find(\r\n ci => ci.ConceptNameCodeSequence.CodeValue === DCM_CODE_VALUES.IMAGING_MEASUREMENTS\r\n );\r\n\r\n const measurementGroupContentItems = toArray(\r\n imagingMeasurementsContentItem.ContentSequence\r\n ).filter(ci => ci.ConceptNameCodeSequence.CodeValue === DCM_CODE_VALUES.MEASUREMENT_GROUP);\r\n\r\n return measurementGroupContentItems;\r\n}\r\n","import OHIF, { DicomMetadataStore } from '@ohif/core';\r\nimport loadSR from './utils/loadSR';\r\nimport toArray from './utils/toArray';\r\nimport DCM_CODE_VALUES from './utils/dcmCodeValues';\r\nimport getSourceDisplaySet from './utils/getSourceDisplaySet';\r\n\r\nconst { utils } = OHIF;\r\n\r\nconst SOP_CLASS_UIDS = {\r\n COMPREHENSIVE_3D_SR: '1.2.840.10008.5.1.4.1.1.88.34',\r\n};\r\n\r\nconst SOPClassHandlerId =\r\n '@ohif/extension-dicom-microscopy.sopClassHandlerModule.DicomMicroscopySRSopClassHandler';\r\n\r\nfunction _getReferencedFrameOfReferenceUID(naturalizedDataset) {\r\n const { ContentSequence } = naturalizedDataset;\r\n\r\n const imagingMeasurementsContentItem = ContentSequence.find(\r\n ci => ci.ConceptNameCodeSequence.CodeValue === DCM_CODE_VALUES.IMAGING_MEASUREMENTS\r\n );\r\n\r\n const firstMeasurementGroupContentItem = toArray(\r\n imagingMeasurementsContentItem.ContentSequence\r\n ).find(ci => ci.ConceptNameCodeSequence.CodeValue === DCM_CODE_VALUES.MEASUREMENT_GROUP);\r\n\r\n const imageRegionContentItem = toArray(firstMeasurementGroupContentItem.ContentSequence).find(\r\n ci => ci.ConceptNameCodeSequence.CodeValue === DCM_CODE_VALUES.IMAGE_REGION\r\n );\r\n\r\n return imageRegionContentItem.ReferencedFrameOfReferenceUID;\r\n}\r\n\r\nfunction _getDisplaySetsFromSeries(instances, servicesManager, extensionManager) {\r\n // If the series has no instances, stop here\r\n if (!instances || !instances.length) {\r\n throw new Error('No instances were provided');\r\n }\r\n\r\n const { displaySetService, microscopyService } = servicesManager.services;\r\n\r\n const instance = instances[0];\r\n\r\n // TODO ! Consumption of DICOMMicroscopySRSOPClassHandler to a derived dataset or normal dataset?\r\n // TODO -> Easy to swap this to a \"non-derived\" displaySet, but unfortunately need to put it in a different extension.\r\n const naturalizedDataset = DicomMetadataStore.getSeries(\r\n instance.StudyInstanceUID,\r\n instance.SeriesInstanceUID\r\n ).instances[0];\r\n const ReferencedFrameOfReferenceUID = _getReferencedFrameOfReferenceUID(naturalizedDataset);\r\n\r\n const {\r\n FrameOfReferenceUID,\r\n SeriesDescription,\r\n ContentDate,\r\n ContentTime,\r\n SeriesNumber,\r\n StudyInstanceUID,\r\n SeriesInstanceUID,\r\n SOPInstanceUID,\r\n SOPClassUID,\r\n } = instance;\r\n\r\n const displaySet = {\r\n plugin: 'microscopy',\r\n Modality: 'SR',\r\n altImageText: 'Microscopy SR',\r\n displaySetInstanceUID: utils.guid(),\r\n SOPInstanceUID,\r\n SeriesInstanceUID,\r\n StudyInstanceUID,\r\n ReferencedFrameOfReferenceUID,\r\n SOPClassHandlerId,\r\n SOPClassUID,\r\n SeriesDescription,\r\n // Map the content date/time to the series date/time, these are only used for filtering.\r\n SeriesDate: ContentDate,\r\n SeriesTime: ContentTime,\r\n SeriesNumber,\r\n instance,\r\n metadata: naturalizedDataset,\r\n isDerived: true,\r\n isLoading: false,\r\n isLoaded: false,\r\n loadError: false,\r\n };\r\n\r\n displaySet.load = function (referencedDisplaySet) {\r\n return loadSR(microscopyService, displaySet, referencedDisplaySet).catch(error => {\r\n displaySet.isLoaded = false;\r\n displaySet.loadError = true;\r\n throw new Error(error);\r\n });\r\n };\r\n\r\n displaySet.getSourceDisplaySet = function () {\r\n let allDisplaySets = [];\r\n const studyMetadata = DicomMetadataStore.getStudy(StudyInstanceUID);\r\n studyMetadata.series.forEach(series => {\r\n const displaySets = displaySetService.getDisplaySetsForSeries(series.SeriesInstanceUID);\r\n allDisplaySets = allDisplaySets.concat(displaySets);\r\n });\r\n return getSourceDisplaySet(allDisplaySets, displaySet);\r\n };\r\n\r\n return [displaySet];\r\n}\r\n\r\nexport default function getDicomMicroscopySRSopClassHandler({ servicesManager, extensionManager }) {\r\n const getDisplaySetsFromSeries = instances => {\r\n return _getDisplaySetsFromSeries(instances, servicesManager, extensionManager);\r\n };\r\n\r\n return {\r\n name: 'DicomMicroscopySRSopClassHandler',\r\n sopClassUids: [SOP_CLASS_UIDS.COMPREHENSIVE_3D_SR],\r\n getDisplaySetsFromSeries,\r\n };\r\n}\r\n","/**\r\n * Get referenced SM displaySet from SR displaySet\r\n *\r\n * @param {*} allDisplaySets\r\n * @param {*} microscopySRDisplaySet\r\n * @returns\r\n */\r\nexport default function getSourceDisplaySet(allDisplaySets, microscopySRDisplaySet) {\r\n const { ReferencedFrameOfReferenceUID } = microscopySRDisplaySet;\r\n\r\n const otherDisplaySets = allDisplaySets.filter(\r\n ds => ds.displaySetInstanceUID !== microscopySRDisplaySet.displaySetInstanceUID\r\n );\r\n const referencedDisplaySet = otherDisplaySets.find(\r\n displaySet =>\r\n displaySet.Modality === 'SM' &&\r\n (displaySet.FrameOfReferenceUID === ReferencedFrameOfReferenceUID ||\r\n // sometimes each depth instance has the different FrameOfReferenceID\r\n displaySet.othersFrameOfReferenceUID.includes(ReferencedFrameOfReferenceUID))\r\n );\r\n\r\n if (!referencedDisplaySet && otherDisplaySets.length >= 1) {\r\n console.warn(\r\n 'No display set with FrameOfReferenceUID',\r\n ReferencedFrameOfReferenceUID,\r\n 'single series, assuming data error, defaulting to only series.'\r\n );\r\n return otherDisplaySets.find(displaySet => displaySet.Modality === 'SM');\r\n }\r\n\r\n return referencedDisplaySet;\r\n}\r\n","import { id } from './id';\r\nimport React, { Suspense } from 'react';\r\nimport getPanelModule from './getPanelModule';\r\nimport getCommandsModule from './getCommandsModule';\r\n\r\nimport { useViewportGrid } from '@ohif/ui';\r\nimport getDicomMicroscopySopClassHandler from './DicomMicroscopySopClassHandler';\r\nimport getDicomMicroscopySRSopClassHandler from './DicomMicroscopySRSopClassHandler';\r\nimport MicroscopyService from './services/MicroscopyService';\r\n\r\nconst Component = React.lazy(() => {\r\n return import('./DicomMicroscopyViewport');\r\n});\r\n\r\nconst MicroscopyViewport = props => {\r\n return (\r\n Loading...}>\r\n \r\n \r\n );\r\n};\r\n\r\n/**\r\n * You can remove any of the following modules if you don't need them.\r\n */\r\nexport default {\r\n /**\r\n * Only required property. Should be a unique value across all extensions.\r\n * You ID can be anything you want, but it should be unique.\r\n */\r\n id,\r\n\r\n async preRegistration({ servicesManager, commandsManager, configuration = {}, appConfig }) {\r\n servicesManager.registerService(MicroscopyService.REGISTRATION(servicesManager));\r\n },\r\n\r\n /**\r\n * ViewportModule should provide a list of viewports that will be available in OHIF\r\n * for Modes to consume and use in the viewports. Each viewport is defined by\r\n * {name, component} object. Example of a viewport module is the CornerstoneViewport\r\n * that is provided by the Cornerstone extension in OHIF.\r\n */\r\n getViewportModule({ servicesManager, extensionManager, commandsManager }) {\r\n /**\r\n *\r\n * @param props {*}\r\n * @param props.displaySets\r\n * @param props.viewportId\r\n * @param props.viewportLabel\r\n * @param props.dataSource\r\n * @param props.viewportOptions\r\n * @param props.displaySetOptions\r\n * @returns\r\n */\r\n const ExtendedMicroscopyViewport = props => {\r\n const { viewportOptions } = props;\r\n\r\n const [viewportGrid, viewportGridService] = useViewportGrid();\r\n const { activeViewportId } = viewportGrid;\r\n\r\n return (\r\n {\r\n viewportGridService.setActiveViewportId(viewportId);\r\n }}\r\n viewportData={viewportOptions}\r\n {...props}\r\n />\r\n );\r\n };\r\n\r\n return [\r\n {\r\n name: 'microscopy-dicom',\r\n component: ExtendedMicroscopyViewport,\r\n },\r\n ];\r\n },\r\n\r\n /**\r\n * SopClassHandlerModule should provide a list of sop class handlers that will be\r\n * available in OHIF for Modes to consume and use to create displaySets from Series.\r\n * Each sop class handler is defined by a { name, sopClassUids, getDisplaySetsFromSeries}.\r\n * Examples include the default sop class handler provided by the default extension\r\n */\r\n getSopClassHandlerModule({ servicesManager, commandsManager, extensionManager }) {\r\n return [\r\n getDicomMicroscopySopClassHandler({\r\n servicesManager,\r\n extensionManager,\r\n }),\r\n getDicomMicroscopySRSopClassHandler({\r\n servicesManager,\r\n extensionManager,\r\n }),\r\n ];\r\n },\r\n\r\n getPanelModule,\r\n\r\n getCommandsModule,\r\n};\r\n","import React from 'react';\r\nimport { ServicesManager, CommandsManager, ExtensionManager } from '@ohif/core';\r\nimport { useViewportGrid } from '@ohif/ui';\r\nimport MicroscopyPanel from './components/MicroscopyPanel/MicroscopyPanel';\r\n\r\n// TODO:\r\n// - No loading UI exists yet\r\n// - cancel promises when component is destroyed\r\n// - show errors in UI for thumbnails if promise fails\r\n\r\nexport default function getPanelModule({\r\n commandsManager,\r\n extensionManager,\r\n servicesManager,\r\n}: {\r\n servicesManager: ServicesManager;\r\n commandsManager: CommandsManager;\r\n extensionManager: ExtensionManager;\r\n}) {\r\n const wrappedMeasurementPanel = () => {\r\n const [{ activeViewportId, viewports }] = useViewportGrid();\r\n\r\n return (\r\n {}}\r\n onRejectComplete={() => {}}\r\n commandsManager={commandsManager}\r\n servicesManager={servicesManager}\r\n extensionManager={extensionManager}\r\n />\r\n );\r\n };\r\n\r\n return [\r\n {\r\n name: 'measure',\r\n iconName: 'tab-linear',\r\n iconLabel: 'Measure',\r\n label: 'Measurements',\r\n secondaryLabel: 'Measurements',\r\n component: wrappedMeasurementPanel,\r\n },\r\n ];\r\n}\r\n","import { ServicesManager, CommandsManager, ExtensionManager } from '@ohif/core';\r\nimport styles from './utils/styles';\r\nimport callInputDialog from './utils/callInputDialog';\r\n\r\nexport default function getCommandsModule({\r\n servicesManager,\r\n commandsManager,\r\n extensionManager,\r\n}: {\r\n servicesManager: ServicesManager;\r\n commandsManager: CommandsManager;\r\n extensionManager: ExtensionManager;\r\n}) {\r\n const { viewportGridService, uiDialogService, microscopyService } = servicesManager.services;\r\n\r\n const actions = {\r\n // Measurement tool commands:\r\n deleteMeasurement: ({ uid }) => {\r\n if (uid) {\r\n const roiAnnotation = microscopyService.getAnnotation(uid);\r\n if (roiAnnotation) {\r\n microscopyService.removeAnnotation(roiAnnotation);\r\n }\r\n }\r\n },\r\n\r\n setLabel: ({ uid }) => {\r\n const roiAnnotation = microscopyService.getAnnotation(uid);\r\n\r\n callInputDialog({\r\n uiDialogService,\r\n defaultValue: '',\r\n callback: (value: string, action: string) => {\r\n switch (action) {\r\n case 'save': {\r\n roiAnnotation.setLabel(value);\r\n microscopyService.triggerRelabel(roiAnnotation);\r\n }\r\n }\r\n },\r\n });\r\n },\r\n\r\n setToolActive: ({ toolName, toolGroupId = 'MICROSCOPY' }) => {\r\n const dragPanOnMiddle = [\r\n 'dragPan',\r\n {\r\n bindings: {\r\n mouseButtons: ['middle'],\r\n },\r\n },\r\n ];\r\n const dragZoomOnRight = [\r\n 'dragZoom',\r\n {\r\n bindings: {\r\n mouseButtons: ['right'],\r\n },\r\n },\r\n ];\r\n if (\r\n ['line', 'box', 'circle', 'point', 'polygon', 'freehandpolygon', 'freehandline'].indexOf(\r\n toolName\r\n ) >= 0\r\n ) {\r\n // TODO: read from configuration\r\n const options = {\r\n geometryType: toolName,\r\n vertexEnabled: true,\r\n styleOptions: styles.default,\r\n bindings: {\r\n mouseButtons: ['left'],\r\n },\r\n } as any;\r\n if ('line' === toolName) {\r\n options.minPoints = 2;\r\n options.maxPoints = 2;\r\n } else if ('point' === toolName) {\r\n delete options.styleOptions;\r\n delete options.vertexEnabled;\r\n }\r\n\r\n microscopyService.activateInteractions([\r\n ['draw', options],\r\n dragPanOnMiddle,\r\n dragZoomOnRight,\r\n ]);\r\n } else if (toolName == 'dragPan') {\r\n microscopyService.activateInteractions([\r\n [\r\n 'dragPan',\r\n {\r\n bindings: {\r\n mouseButtons: ['left', 'middle'],\r\n },\r\n },\r\n ],\r\n dragZoomOnRight,\r\n ]);\r\n } else {\r\n microscopyService.activateInteractions([\r\n [\r\n toolName,\r\n {\r\n bindings: {\r\n mouseButtons: ['left'],\r\n },\r\n },\r\n ],\r\n dragPanOnMiddle,\r\n dragZoomOnRight,\r\n ]);\r\n }\r\n },\r\n toggleOverlays: () => {\r\n // overlay\r\n const overlays = document.getElementsByClassName('microscopy-viewport-overlay');\r\n let onoff = false; // true if this will toggle on\r\n for (let i = 0; i < overlays.length; i++) {\r\n if (i === 0) {\r\n onoff = overlays.item(0).classList.contains('hidden');\r\n }\r\n overlays.item(i).classList.toggle('hidden');\r\n }\r\n\r\n // overview\r\n const { activeViewportId, viewports } = viewportGridService.getState();\r\n microscopyService.toggleOverviewMap(activeViewportId);\r\n },\r\n toggleAnnotations: () => {\r\n microscopyService.toggleROIsVisibility();\r\n },\r\n };\r\n\r\n const definitions = {\r\n deleteMeasurement: {\r\n commandFn: actions.deleteMeasurement,\r\n storeContexts: [] as any[],\r\n options: {},\r\n },\r\n setLabel: {\r\n commandFn: actions.setLabel,\r\n storeContexts: [] as any[],\r\n options: {},\r\n },\r\n setToolActive: {\r\n commandFn: actions.setToolActive,\r\n storeContexts: [] as any[],\r\n options: {},\r\n },\r\n toggleOverlays: {\r\n commandFn: actions.toggleOverlays,\r\n storeContexts: [] as any[],\r\n options: {},\r\n },\r\n toggleAnnotations: {\r\n commandFn: actions.toggleAnnotations,\r\n storeContexts: [] as any[],\r\n options: {},\r\n },\r\n };\r\n\r\n return {\r\n actions,\r\n definitions,\r\n defaultContext: 'MICROSCOPY',\r\n };\r\n}\r\n"],"names":["id","packageJson","coordinateFormatScoord3d2Geometry","coordinates","pyramid","transform","Array","isArray","metadata","length","orientation","ImageOrientationSlide","spacing","PixelSpacing","functionalGroup","SharedFunctionalGroupsSequence","PixelMeasuresSequence","_getPixelSpacing","origin","TotalPixelMatrixOriginSequence","offset","Number","XOffsetInSlideCoordinateSystem","YOffsetInSlideCoordinateSystem","map","c","slideCoord","pixelCoord","options","Error","point","m","mInverted","inv","vSlide","vImage","multiply","row","toFixed","mapSlideCoord2PixelCoord","defaultFill","color","emptyFill","defaultStroke","width","activeStroke","active","image","circle","fill","stroke","radius","default","ApiEvents","ROI_ADDED","ROI_MODIFIED","ROI_REMOVED","ROI_DRAWN","ROI_SELECTED","MOVE_STARTED","MOVE_ENDED","LOADING_STARTED","LOADING_ENDED","LOADING_ERROR","FRAME_LOADING_STARTED","FRAME_LOADING_ENDED","FRAME_LOADING_ERROR","EVENTS","ADDED","MODIFIED","REMOVED","UPDATED","SELECTED","ViewerManager","PubSubService","constructor","viewer","viewportId","container","studyInstanceUID","seriesInstanceUID","super","this","onRoiAdded","roiAddedHandler","bind","onRoiModified","roiModifiedHandler","onRoiRemoved","roiRemovedHandler","onRoiSelected","roiSelectedHandler","contextMenuCallback","symbols","Object","getOwnPropertySymbols","_drawingSource","find","p","description","_pyramid","_map","_affine","registerEvents","activateDefaultInteractions","addContextMenuCallback","callback","destroy","unregisterEvents","publish","key","roiGraphic","_broadcastEvent","managedViewer","addEventListener","removeEventListener","event","detail","payload","runSilently","clearRoiGraphics","removeAllROIs","showROIs","hideROIs","addRoiGraphic","addROI","styles","addRoiGraphicWithLabel","label","setROIStyle","uid","styleOptions","removeRoiGraphic","removeROI","updateROIProperties","_ref","properties","updateROI","toggleOverviewMap","document","querySelector","preventDefault","activateInteractions","bindings","mouseButtons","interactions","interactionsMap","draw","activate","modify","translate","snap","dragPan","dragZoom","select","keys","forEach","availableInteractionName","interaction","name","config","activateInteractionMethod","deactivateInteractionMethod","_getMapView","_getMap","getView","s","String","window","getViewState","view","center","getCenter","resolution","getResolution","zoom","getZoom","setViewState","viewState","setZoom","setResolution","setCenter","setViewStateByExtent","roiAnnotation","getCoordinates","_jumpToPolyline","_jumpToPolygonOrEllipse","_jumpToPoint","coord","mappedCoord","x","y","midpoint","minX","Infinity","maxX","minY","maxY","height","fit","getSize","LABEL_UPDATED","GRAPHIC_UPDATED","VIEW_UPDATED","RoiAnnotation","arguments","undefined","setMeasurements","getScoord3d","scoord3d","setRoiGraphic","type","graphicType","graphicData","point1","point2","xLength2","yLength2","Math","sqrt","areaEllipse","PI","_area","_length","areaPolygon","n","area","j","i","abs","areaOfPolygon","len","p1","p2","xLen","yLen","setLabel","finding","CodeMeaning","CodingSchemeDesignator","CodeValue","getLabel","getDetailedLabel","getLength","getArea","ANNOTATION_UPDATED","ANNOTATION_SELECTED","ANNOTATION_REMOVED","RELABEL","DELETE","MicroscopyService","serviceManager","managedViewers","Set","roiUids","annotations","selectedAnnotation","pendingFocus","_onRoiAdded","_onRoiModified","_onRoiRemoved","_onRoiUpdated","_onRoiSelected","isROIsVisible","clear","clearAnnotations","removeAnnotation","data","add","subscribe","AnnotationEvents","onRelabel","item","triggerRelabel","getAnnotation","delete","synchronizeViewers","getSelectedAnnotation","clearSelection","_addManagedViewerSubscriptions","_roiAddedSubscription","ViewerEvents","_roiModifiedSubscription","_roiRemovedSubscription","_roiUpdatedSubscription","_roiSelectedSubscription","_removeManagedViewerSubscriptions","unsubscribe","_getManagedViewersForSeries","from","filter","getManagedViewersForStudy","_restoreAnnotations","getAnnotationsForSeries","addViewer","_manager","focusAnnotation","_potentiallyLoadSR","StudyInstanceUID","displaySets","studyMetadata","DicomMetadataStore","getStudy","smDisplaySet","ds","Modality","FrameOfReferenceUID","othersFrameOfReferenceUID","derivedDisplaySets","ReferencedFrameOfReferenceUID","includes","some","isLoaded","recentDateTime","recentDisplaySet","dateTime","SeriesDate","SeriesTime","isLoading","load","removeViewer","toggleROIsVisibility","mv","getAnnotations","push","getAnnotationsForStudy","a","annotation","selectAnnotation","baseManagedViewer","activeInteractions","newAnnotation","deleteCallback","successCallback","triggerDelete","REGISTRATION","altName","create","_ref2","configuration","callInputDialog","uiDialogService","title","defaultValue","value","action","dialogId","onSubmitHandler","dismiss","centralize","isDraggable","showOverlay","content","Dialog","contentProps","noCloseButton","onClose","actions","text","ButtonEnums","secondary","primary","onSubmit","body","_ref3","setValue","React","Input","labelClassName","autoFocus","className","onChange","persist","target","onKeyPress","datasetToBuffer","dcmjs","formatLength","unit","mult","connectedMicroscopyPanel","withTranslation","props","microscopyService","servicesManager","services","setStudyInstanceUID","useState","roiAnnotations","setRoiAnnotations","setSelectedAnnotation","extensionManager","displaySetService","useEffect","viewport","viewports","get","activeViewportId","displaySetInstanceUIDs","displaySet","getDisplaySetByUID","onAnnotationUpdated","onAnnotationSelected","unsubscribeAnnotationUpdated","MicroscopyEvents","unsubscribeAnnotationSelected","unsubscribeAnnotationRemoved","onAnnotationRemoved","index","shortAxisLength","isSelected","displayText","formatArea","isActive","MeasurementTable","onClick","onEdit","commandsManager","runCommand","utils","OHIF","SOP_CLASS_UIDS","SOPClassHandlerId","getDicomMicroscopySopClassHandler","sopClassUids","getDisplaySetsFromSeries","instances","instance","singleFrameInstance","currentFrames","NumberOfFrames","instanceI","framesI","imageIdForThumbnail","imageId","getActiveDataSource","getImageIdsForInstance","thumbnail","SeriesDescription","ContentDate","ContentTime","SeriesNumber","SeriesInstanceUID","SOPInstanceUID","SOPClassUID","inst","v","array","indexOf","console","warn","plugin","altImageText","displaySetInstanceUID","guid","firstInstance","numImageFrames","numInstances","others","_getDisplaySetsFromSeries","IMAGING_MEASUREMENTS","MEASUREMENT_GROUP","IMAGE_REGION","FINDING","TRACKING_UNIQUE_IDENTIFIER","LENGTH","AREA","SHORT_AXIS","LONG_AXIS","ELLIPSE_AREA","toArray","MeasurementReport","DICOMMicroscopyViewer","async","loadSR","microscopySRDisplaySet","referencedDisplaySet","naturalizedDataset","rois","labels","toolState","generateToolState","tools","getOwnPropertyNames","measurementGroupContentItems","ContentSequence","ci","ConceptNameCodeSequence","DCM_CODE_VALUES","_getMeasurementGroups","t","toolSpecificToolState","capsToolType","toUpperCase","measurementGroupContentItemsForTool","mg","GraphicType","frameOfReferenceUID","Polygon","Polyline","Point","Ellipse","measurementGroup","findingGroup","trackingGroup","matches","exec","TextValue","presentationState","JSON","parse","marker","measurements","evaluations","evaluation","e","measurement","log","roi","ROI","ConceptCodeSequence","_getROIsFromToolState","getSeries","firstMeasurementGroupContentItem","_getReferencedFrameOfReferenceUID","isDerived","loadError","catch","error","getSourceDisplaySet","allDisplaySets","series","getDisplaySetsForSeries","concat","otherDisplaySets","getDicomMicroscopySRSopClassHandler","Component","MicroscopyViewport","Suspense","fallback","preRegistration","appConfig","registerService","getViewportModule","component","viewportOptions","viewportGrid","viewportGridService","useViewportGrid","_extends","setViewportActive","setActiveViewportId","viewportData","getSopClassHandlerModule","getPanelModule","iconName","iconLabel","secondaryLabel","wrappedMeasurementPanel","MicroscopyPanel","onSaveComplete","onRejectComplete","getCommandsModule","deleteMeasurement","setToolActive","_ref4","toolName","toolGroupId","dragPanOnMiddle","dragZoomOnRight","geometryType","vertexEnabled","minPoints","maxPoints","toggleOverlays","overlays","getElementsByClassName","onoff","classList","contains","toggle","getState","toggleAnnotations","definitions","commandFn","storeContexts","defaultContext"],"sourceRoot":""} \ No newline at end of file diff --git a/resources/250.bundle.a0cf445a5802ef69d2fa.js b/resources/250.bundle.a0cf445a5802ef69d2fa.js new file mode 100644 index 0000000..34e5125 --- /dev/null +++ b/resources/250.bundle.a0cf445a5802ef69d2fa.js @@ -0,0 +1,2 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[250,579],{76516:(e,t,r)=>{r.r(t),r.d(t,{default:()=>b});var i=r(43001),a=r(7023),s=r(3827),n=r.n(s),o=r(8324),c=r.n(o),l=r(71783),d=r(44921),p=r.n(d);const m=e=>{const{list:t,itemGenerator:r}=e;if(t)return t.map((t=>{if(!t)return;const i=t.generator||r;if(!i)throw new Error(`No generator for ${t}`);return i({...e,item:t})}))};r(71271),r(3743);const v=(e=>{let{topLeft:t=[],topRight:r=[],bottomLeft:a=[],bottomRight:s=[],itemGenerator:n=(()=>{})}=e;return e=>{const o="absolute pointer-events-none microscopy-viewport-overlay";return i.createElement(i.Fragment,null,t&&t.length>0&&i.createElement("div",{"data-cy":"viewport-overlay-top-left",className:p()(o,"top-viewport left-viewport text-primary-light")},m({...e,list:t,itemGenerator:n})),r&&r.length>0&&i.createElement("div",{"data-cy":"viewport-overlay-top-right",className:p()(o,"top-viewport right-viewport-scrollbar text-primary-light")},m({...e,list:r,itemGenerator:n})),s&&s.length>0&&i.createElement("div",{"data-cy":"viewport-overlay-bottom-right",className:p()(o,"bottom-viewport right-viewport-scrollbar text-primary-light")},m({...e,list:s,itemGenerator:n})),a&&a.length>0&&i.createElement("div",{"data-cy":"viewport-overlay-bottom-left",className:p()(o,"bottom-viewport left-viewport text-primary-light")},m({...e,list:a,itemGenerator:n})))}})({});var h=r(97604),u=r(71771);const{DICOMwebClient:y}=h.api;y._buildMultipartAcceptHeaderFieldValue=()=>"*/*";var w=r(67540),g=r(56342);function f(e){return!("object"==typeof e||Array.isArray(e))}const I=["DS","FL","FD","IS","OD","OF","OL","OV","SL","SS","SV","UL","US","UV"];function S(e,t){if(Array.isArray(e)){return e.map((e=>f(e)?e:S(e,t)))}return f(e)||Object.keys(e).forEach((r=>{null===e[r].Value&&e[r].vr?delete e[r].Value:Array.isArray(e[r].Value)&&e[r].vr&&(1===e[r].Value.length&&e[r].Value[0].BulkDataURI?(g.dicomWebUtils.fixBulkDataURI(e[r].Value[0],t,t.dataSourceConfig),e[r].BulkDataURI=e[r].Value[0].BulkDataURI,"https:"===window.location.protocol&&e[r].BulkDataURI.startsWith("http:")&&(e[r].BulkDataURI=e[r].BulkDataURI.replace("http:","https:")),delete e[r].Value):I.includes(e[r].vr)?e[r].Value=e[r].Value.map((e=>+e)):e[r].Value=e[r].Value.map((e=>S(e,t))))})),e}class D extends i.Component{constructor(e){super(e),this.state={error:null,isLoaded:!1},this.microscopyService=void 0,this.viewer=null,this.managedViewer=null,this.container=i.createRef(),this.overlayElement=i.createRef(),this.debouncedResize=void 0,this.setViewportActiveHandler=()=>{const{setViewportActive:e,viewportId:t,activeViewportId:r}=this.props;t!==r&&e(t)},this.onWindowResize=()=>{this.debouncedResize()};const{microscopyService:t}=this.props.servicesManager.services;this.microscopyService=t,this.debouncedResize=c()((()=>{this.viewer&&this.viewer.resize()}),100)}getNearbyROI(e){let t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];const r=Object.getOwnPropertySymbols(this.viewer),i=r.find((e=>"drawingSource"===e.description)),a=r.find((e=>"pyramid"===e.description)),s=r.find((e=>"map"===e.description)),n=r.find((e=>"affine"===e.description)),o=this.viewer[i].getClosestFeatureToCoordinate(this.viewer[s].getEventCoordinate(e));if(!o)return null;const c=this.viewer._getROIFromFeature(o,this.viewer[a].metadata,this.viewer[n]);return c&&t&&this.microscopyService.selectAnnotation(c),c}async installOpenLayersRenderer(e,t){this.microscopyService.clearAnnotations();let i=t;"SR"===t.Modality&&(i=t.getSourceDisplaySet()),console.log("Loading viewer metadata",i),await(async i=>{const{viewer:a,metadata:s}=await r.e(18).then(r.t.bind(r,42613,23)),n=a.VolumeImageViewer,o=function(e){let{extensionManager:t,servicesManager:r}=e;const i=window.config.dataSources.find((e=>e.sourceName===t.activeDataSource)),{userAuthenticationService:a}=r.services,{wadoRoot:s,staticWado:n,singlepart:o}=i.configuration,c={url:s||"/dicomlocal",staticWado:n,singlepart:o,headers:a.getAuthorizationHeader(),errorInterceptor:u.Po.getHTTPErrorHandler()},l=new h.api.DICOMwebClient(c);return l.wadoURL=c.url,"dicomlocal"===t.activeDataSource&&(l.retrieveInstanceFrames=async e=>{if(!("studyInstanceUID"in e))throw new Error("Study Instance UID is required for retrieval of instance frames");if(!("seriesInstanceUID"in e))throw new Error("Series Instance UID is required for retrieval of instance frames");if(!("sopInstanceUID"in e))throw new Error("SOP Instance UID is required for retrieval of instance frames");if(!("frameNumbers"in e))throw new Error("frame numbers are required for retrieval of instance frames");console.log(`retrieve frames ${e.frameNumbers.toString()} of instance ${e.sopInstanceUID}`);const t=u.DicomMetadataStore.getInstance(e.studyInstanceUID,e.seriesInstanceUID,e.sopInstanceUID);return(Array.isArray(e.frameNumbers)?e.frameNumbers:e.frameNumbers.split(",")).map((e=>Array.isArray(t.PixelData)?t.PixelData[+e-1]:t.PixelData))}),l}({extensionManager:this.props.extensionManager,servicesManager:this.props.servicesManager}),c=[];i.forEach((e=>{e.ImageType="string"==typeof e.ImageType?e.ImageType.split("\\"):e.ImageType;const t=S(w.default.data.DicomMetaDictionary.denaturalizeDataset(e),{StudyInstanceUID:e.StudyInstanceUID,SeriesInstanceUID:e.SeriesInstanceUID,dataSourceConfig:this.props.dataSource.getConfig()});t["00480105"]||(t["00480105"]={vr:"SQ",Value:[{"00480106":{vr:"SH",Value:["1"]}}]});const r=new s.VLWholeSlideMicroscopyImage({metadata:t}),i=r.ImageType[2];"VOLUME"!==i&&"THUMBNAIL"!==i||c.push(r)}));const l={client:o,metadata:c,retrieveRendered:!1,controls:["overview","position"]};this.viewer=new n(l),this.overlayElement&&this.overlayElement.current&&this.viewer.addViewportOverlay&&this.viewer.addViewportOverlay({element:this.overlayElement.current,coordinates:[0,0],navigate:!0,className:"OpenLayersOverlay"}),this.viewer.render({container:e});const{StudyInstanceUID:d,SeriesInstanceUID:p}=t;this.managedViewer=this.microscopyService.addViewer(this.viewer,this.props.viewportId,e,d,p),this.managedViewer.addContextMenuCallback((e=>{}))})(i.others),"SR"===t.Modality&&t.load(i)}componentDidMount(){const{displaySets:e,viewportOptions:t}=this.props,{viewportId:r}=t,i=e[0];this.installOpenLayersRenderer(this.container.current,i).then((()=>{this.setState({isLoaded:!0})}))}componentDidUpdate(e,t,r){if(this.managedViewer&&e.displaySets!==this.props.displaySets){const{displaySets:e}=this.props,t=e[0];if(this.microscopyService.clearAnnotations(),"SR"===t.Modality){const e=t.getSourceDisplaySet();t.load(e)}}}componentWillUnmount(){this.microscopyService.removeViewer(this.viewer)}render(){const e={width:"100%",height:"100%"},t=this.props.displaySets[0],r=t.firstInstance||t.instance;return i.createElement("div",{className:"DicomMicroscopyViewer",style:e,onClick:this.setViewportActiveHandler},i.createElement("div",{style:{...e,display:"none"}},i.createElement("div",{style:{...e},ref:this.overlayElement},i.createElement("div",{style:{position:"relative",height:"100%",width:"100%"}},t&&r.imageId&&i.createElement(v,{displaySet:t,instance:t.instance,metadata:t.metadata})))),a.ZP&&i.createElement(a.ZP,{handleWidth:!0,handleHeight:!0,onResize:this.onWindowResize}),this.state.error?i.createElement("h2",null,JSON.stringify(this.state.error)):i.createElement("div",{style:e,ref:this.container}),this.state.isLoaded?null:i.createElement(l.LE,{className:"h-full w-full bg-black"}))}}D.propTypes={viewportData:n().object,activeViewportId:n().string,setViewportActive:n().func,displaySets:n().array,viewportId:n().string,viewportLabel:n().string,dataSource:n().object,viewportOptions:n().object,displaySetOptions:n().array,servicesManager:n().object,extensionManager:n().object,commandsManager:n().object};const b=D}}]); +//# sourceMappingURL=250.bundle.a0cf445a5802ef69d2fa.js.map \ No newline at end of file diff --git a/resources/250.bundle.a0cf445a5802ef69d2fa.js.map b/resources/250.bundle.a0cf445a5802ef69d2fa.js.map new file mode 100644 index 0000000..c5ca796 --- /dev/null +++ b/resources/250.bundle.a0cf445a5802ef69d2fa.js.map @@ -0,0 +1 @@ +{"version":3,"file":"250.bundle.a0cf445a5802ef69d2fa.js","mappings":"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","sources":["webpack:///../../../extensions/dicom-microscopy/src/components/ViewportOverlay/listComponentGenerator.tsx","webpack:///../../../extensions/dicom-microscopy/src/components/ViewportOverlay/index.tsx","webpack:///../../../extensions/dicom-microscopy/src/utils/dicomWebClient.ts","webpack:///../../../extensions/dicom-microscopy/src/utils/cleanDenaturalizedDataset.ts","webpack:///../../../extensions/dicom-microscopy/src/DicomMicroscopyViewport.tsx"],"sourcesContent":["const listComponentGenerator = props => {\r\n const { list, itemGenerator } = props;\r\n if (!list) {\r\n return;\r\n }\r\n return list.map(item => {\r\n if (!item) {\r\n return;\r\n }\r\n const generator = item.generator || itemGenerator;\r\n if (!generator) {\r\n throw new Error(`No generator for ${item}`);\r\n }\r\n return generator({ ...props, item });\r\n });\r\n};\r\n\r\nexport default listComponentGenerator;\r\n","import React from 'react';\r\nimport classnames from 'classnames';\r\n\r\nimport listComponentGenerator from './listComponentGenerator';\r\nimport './ViewportOverlay.css';\r\nimport { formatDICOMDate, formatDICOMTime, formatNumberPrecision, formatPN } from './utils';\r\n\r\ninterface OverlayItem {\r\n id: string;\r\n title: string;\r\n value?: (props: any) => string;\r\n condition?: (props: any) => boolean;\r\n contents?: (props: any) => { className: string; value: any };\r\n generator?: (props: any) => any;\r\n}\r\n\r\n/**\r\n *\r\n * @param {*} config is a configuration object that defines four lists of elements,\r\n * one topLeft, topRight, bottomLeft, bottomRight contents.\r\n * @param {*} extensionManager is used to load the image data.\r\n * @returns\r\n */\r\nexport const generateFromConfig = ({\r\n topLeft = [],\r\n topRight = [],\r\n bottomLeft = [],\r\n bottomRight = [],\r\n itemGenerator = () => {},\r\n}: {\r\n topLeft?: OverlayItem[];\r\n topRight?: OverlayItem[];\r\n bottomLeft?: OverlayItem[];\r\n bottomRight?: OverlayItem[];\r\n itemGenerator?: (props: any) => any;\r\n}) => {\r\n return (props: any) => {\r\n const topLeftClass = 'top-viewport left-viewport text-primary-light';\r\n const topRightClass = 'top-viewport right-viewport-scrollbar text-primary-light';\r\n const bottomRightClass = 'bottom-viewport right-viewport-scrollbar text-primary-light';\r\n const bottomLeftClass = 'bottom-viewport left-viewport text-primary-light';\r\n const overlay = 'absolute pointer-events-none microscopy-viewport-overlay';\r\n\r\n return (\r\n <>\r\n {topLeft && topLeft.length > 0 && (\r\n
\r\n {listComponentGenerator({ ...props, list: topLeft, itemGenerator })}\r\n
\r\n )}\r\n {topRight && topRight.length > 0 && (\r\n \r\n {listComponentGenerator({\r\n ...props,\r\n list: topRight,\r\n itemGenerator,\r\n })}\r\n \r\n )}\r\n {bottomRight && bottomRight.length > 0 && (\r\n \r\n {listComponentGenerator({\r\n ...props,\r\n list: bottomRight,\r\n itemGenerator,\r\n })}\r\n \r\n )}\r\n {bottomLeft && bottomLeft.length > 0 && (\r\n \r\n {listComponentGenerator({\r\n ...props,\r\n list: bottomLeft,\r\n itemGenerator,\r\n })}\r\n \r\n )}\r\n \r\n );\r\n };\r\n};\r\n\r\nconst itemGenerator = (props: any) => {\r\n const { item } = props;\r\n const { title, value: valueFunc, condition, contents } = item;\r\n props.image = { ...props.image, ...props.metadata };\r\n props.formatDate = formatDICOMDate;\r\n props.formatTime = formatDICOMTime;\r\n props.formatPN = formatPN;\r\n props.formatNumberPrecision = formatNumberPrecision;\r\n if (condition && !condition(props)) {\r\n return null;\r\n }\r\n if (!contents && !valueFunc) {\r\n return null;\r\n }\r\n const value = valueFunc && valueFunc(props);\r\n const contentsValue = (contents && contents(props)) || [\r\n { className: 'mr-1', value: title },\r\n { classname: 'mr-1 font-light', value },\r\n ];\r\n\r\n return (\r\n
\r\n {contentsValue.map((content, idx) => (\r\n \r\n {content.value}\r\n \r\n ))}\r\n
\r\n );\r\n};\r\n\r\nexport default generateFromConfig({});\r\n","import { api } from 'dicomweb-client';\r\nimport { errorHandler, DicomMetadataStore } from '@ohif/core';\r\n\r\nconst { DICOMwebClient } = api;\r\n\r\nDICOMwebClient._buildMultipartAcceptHeaderFieldValue = () => {\r\n return '*/*';\r\n};\r\n\r\n/**\r\n * create a DICOMwebClient object to be used by Dicom Microscopy Viewer\r\n *\r\n * Referenced the code from `/extensions/default/src/DicomWebDataSource/index.js`\r\n *\r\n * @param param0\r\n * @returns\r\n */\r\nexport default function getDicomWebClient({ extensionManager, servicesManager }) {\r\n const dataSourceConfig = window.config.dataSources.find(\r\n ds => ds.sourceName === extensionManager.activeDataSource\r\n );\r\n const { userAuthenticationService } = servicesManager.services;\r\n\r\n const { wadoRoot, staticWado, singlepart } = dataSourceConfig.configuration;\r\n\r\n const wadoConfig = {\r\n url: wadoRoot || '/dicomlocal',\r\n staticWado,\r\n singlepart,\r\n headers: userAuthenticationService.getAuthorizationHeader(),\r\n errorInterceptor: errorHandler.getHTTPErrorHandler(),\r\n };\r\n\r\n const client = new api.DICOMwebClient(wadoConfig);\r\n client.wadoURL = wadoConfig.url;\r\n\r\n if (extensionManager.activeDataSource === 'dicomlocal') {\r\n /**\r\n * For local data source, override the retrieveInstanceFrames() method of the\r\n * dicomweb-client to retrieve image data from memory cached metadata.\r\n * Other methods of the client doesn't matter, as we are feeding the DMV\r\n * with the series metadata already.\r\n *\r\n * @param {Object} options\r\n * @param {String} options.studyInstanceUID - Study Instance UID\r\n * @param {String} options.seriesInstanceUID - Series Instance UID\r\n * @param {String} options.sopInstanceUID - SOP Instance UID\r\n * @param {String} options.frameNumbers - One-based indices of Frame Items\r\n * @param {Object} [options.queryParams] - HTTP query parameters\r\n * @returns {ArrayBuffer[]} Rendered Frame Items as byte arrays\r\n */\r\n //\r\n client.retrieveInstanceFrames = async options => {\r\n if (!('studyInstanceUID' in options)) {\r\n throw new Error('Study Instance UID is required for retrieval of instance frames');\r\n }\r\n if (!('seriesInstanceUID' in options)) {\r\n throw new Error('Series Instance UID is required for retrieval of instance frames');\r\n }\r\n if (!('sopInstanceUID' in options)) {\r\n throw new Error('SOP Instance UID is required for retrieval of instance frames');\r\n }\r\n if (!('frameNumbers' in options)) {\r\n throw new Error('frame numbers are required for retrieval of instance frames');\r\n }\r\n console.log(\r\n `retrieve frames ${options.frameNumbers.toString()} of instance ${options.sopInstanceUID}`\r\n );\r\n\r\n const instance = DicomMetadataStore.getInstance(\r\n options.studyInstanceUID,\r\n options.seriesInstanceUID,\r\n options.sopInstanceUID\r\n );\r\n\r\n const frameNumbers = Array.isArray(options.frameNumbers)\r\n ? options.frameNumbers\r\n : options.frameNumbers.split(',');\r\n\r\n return frameNumbers.map(fr =>\r\n Array.isArray(instance.PixelData) ? instance.PixelData[+fr - 1] : instance.PixelData\r\n );\r\n };\r\n }\r\n\r\n return client;\r\n}\r\n","import { dicomWebUtils } from '@ohif/extension-default';\r\n\r\nfunction isPrimitive(v: any) {\r\n return !(typeof v == 'object' || Array.isArray(v));\r\n}\r\n\r\nconst vrNumerics = [\r\n 'DS',\r\n 'FL',\r\n 'FD',\r\n 'IS',\r\n 'OD',\r\n 'OF',\r\n 'OL',\r\n 'OV',\r\n 'SL',\r\n 'SS',\r\n 'SV',\r\n 'UL',\r\n 'US',\r\n 'UV',\r\n];\r\n\r\n/**\r\n * Specialized for DICOM JSON format dataset cleaning.\r\n * @param obj\r\n * @returns\r\n */\r\nexport default function cleanDenaturalizedDataset(\r\n obj: any,\r\n options: {\r\n StudyInstanceUID: string;\r\n SeriesInstanceUID: string;\r\n dataSourceConfig: unknown;\r\n }\r\n): any {\r\n if (Array.isArray(obj)) {\r\n const newAry = obj.map(o => (isPrimitive(o) ? o : cleanDenaturalizedDataset(o, options)));\r\n return newAry;\r\n } else if (isPrimitive(obj)) {\r\n return obj;\r\n } else {\r\n Object.keys(obj).forEach(key => {\r\n if (obj[key].Value === null && obj[key].vr) {\r\n delete obj[key].Value;\r\n } else if (Array.isArray(obj[key].Value) && obj[key].vr) {\r\n if (obj[key].Value.length === 1 && obj[key].Value[0].BulkDataURI) {\r\n dicomWebUtils.fixBulkDataURI(obj[key].Value[0], options, options.dataSourceConfig);\r\n\r\n obj[key].BulkDataURI = obj[key].Value[0].BulkDataURI;\r\n\r\n // prevent mixed-content blockage\r\n if (window.location.protocol === 'https:' && obj[key].BulkDataURI.startsWith('http:')) {\r\n obj[key].BulkDataURI = obj[key].BulkDataURI.replace('http:', 'https:');\r\n }\r\n delete obj[key].Value;\r\n } else if (vrNumerics.includes(obj[key].vr)) {\r\n obj[key].Value = obj[key].Value.map(v => +v);\r\n } else {\r\n obj[key].Value = obj[key].Value.map(entry => cleanDenaturalizedDataset(entry, options));\r\n }\r\n }\r\n });\r\n return obj;\r\n }\r\n}\r\n","import React, { Component } from 'react';\r\nimport ReactResizeDetector from 'react-resize-detector';\r\nimport PropTypes from 'prop-types';\r\nimport debounce from 'lodash.debounce';\r\nimport { LoadingIndicatorProgress } from '@ohif/ui';\r\n\r\nimport './DicomMicroscopyViewport.css';\r\nimport ViewportOverlay from './components/ViewportOverlay';\r\nimport getDicomWebClient from './utils/dicomWebClient';\r\nimport dcmjs from 'dcmjs';\r\nimport cleanDenaturalizedDataset from './utils/cleanDenaturalizedDataset';\r\nimport MicroscopyService from './services/MicroscopyService';\r\n\r\nfunction transformImageTypeUnnaturalized(entry) {\r\n if (entry.vr === 'CS') {\r\n return {\r\n vr: 'US',\r\n Value: entry.Value[0].split('\\\\'),\r\n };\r\n }\r\n return entry;\r\n}\r\n\r\nclass DicomMicroscopyViewport extends Component {\r\n state = {\r\n error: null as any,\r\n isLoaded: false,\r\n };\r\n\r\n microscopyService: MicroscopyService;\r\n viewer: any = null; // dicom-microscopy-viewer instance\r\n managedViewer: any = null; // managed wrapper of microscopy-dicom extension\r\n\r\n container = React.createRef();\r\n overlayElement = React.createRef();\r\n debouncedResize: () => any;\r\n\r\n constructor(props: any) {\r\n super(props);\r\n\r\n const { microscopyService } = this.props.servicesManager.services;\r\n this.microscopyService = microscopyService;\r\n this.debouncedResize = debounce(() => {\r\n if (this.viewer) {\r\n this.viewer.resize();\r\n }\r\n }, 100);\r\n }\r\n\r\n static propTypes = {\r\n viewportData: PropTypes.object,\r\n activeViewportId: PropTypes.string,\r\n setViewportActive: PropTypes.func,\r\n\r\n // props from OHIF Viewport Grid\r\n displaySets: PropTypes.array,\r\n viewportId: PropTypes.string,\r\n viewportLabel: PropTypes.string,\r\n dataSource: PropTypes.object,\r\n viewportOptions: PropTypes.object,\r\n displaySetOptions: PropTypes.array,\r\n\r\n // other props from wrapping component\r\n servicesManager: PropTypes.object,\r\n extensionManager: PropTypes.object,\r\n commandsManager: PropTypes.object,\r\n };\r\n\r\n /**\r\n * Get the nearest ROI from the mouse click point\r\n *\r\n * @param event\r\n * @param autoselect\r\n * @returns\r\n */\r\n getNearbyROI(event: Event, autoselect = true) {\r\n const symbols = Object.getOwnPropertySymbols(this.viewer);\r\n const _drawingSource = symbols.find(p => p.description === 'drawingSource');\r\n const _pyramid = symbols.find(p => p.description === 'pyramid');\r\n const _map = symbols.find(p => p.description === 'map');\r\n const _affine = symbols.find(p => p.description === 'affine');\r\n\r\n const feature = this.viewer[_drawingSource].getClosestFeatureToCoordinate(\r\n this.viewer[_map].getEventCoordinate(event)\r\n );\r\n\r\n if (!feature) {\r\n return null;\r\n }\r\n\r\n const roiAnnotation = this.viewer._getROIFromFeature(\r\n feature,\r\n this.viewer[_pyramid].metadata,\r\n this.viewer[_affine]\r\n );\r\n if (roiAnnotation && autoselect) {\r\n this.microscopyService.selectAnnotation(roiAnnotation);\r\n }\r\n return roiAnnotation;\r\n }\r\n\r\n // install the microscopy renderer into the web page.\r\n // you should only do this once.\r\n async installOpenLayersRenderer(container, displaySet) {\r\n const loadViewer = async metadata => {\r\n const { viewer: DicomMicroscopyViewer, metadata: metadataUtils } = await import(\r\n /* webpackChunkName: \"dicom-microscopy-viewer\" */ 'dicom-microscopy-viewer'\r\n );\r\n const microscopyViewer = DicomMicroscopyViewer.VolumeImageViewer;\r\n\r\n const client = getDicomWebClient({\r\n extensionManager: this.props.extensionManager,\r\n servicesManager: this.props.servicesManager,\r\n });\r\n\r\n // Parse, format, and filter metadata\r\n const volumeImages: any[] = [];\r\n\r\n /**\r\n * This block of code is the original way of loading DICOM into dicom-microscopy-viewer\r\n * as in their documentation.\r\n * But we have the metadata already loaded by our loaders.\r\n * As the metadata for microscopy DIOM files tends to be big and we don't\r\n * want to double load it, below we have the mechanism to reconstruct the\r\n * DICOM JSON structure (denaturalized) from naturalized metadata.\r\n * (NOTE: Our loaders cache only naturalized metadata, not the denaturalized.)\r\n */\r\n // {\r\n // const retrieveOptions = {\r\n // studyInstanceUID: metadata[0].StudyInstanceUID,\r\n // seriesInstanceUID: metadata[0].SeriesInstanceUID,\r\n // };\r\n // metadata = await client.retrieveSeriesMetadata(retrieveOptions);\r\n // // Parse, format, and filter metadata\r\n // metadata.forEach(m => {\r\n // if (\r\n // volumeImages.length > 0 &&\r\n // m['00200052'].Value[0] != volumeImages[0].FrameOfReferenceUID\r\n // ) {\r\n // console.warn(\r\n // 'Expected FrameOfReferenceUID of difference instances within a series to be the same, found multiple different values',\r\n // m['00200052'].Value[0]\r\n // );\r\n // m['00200052'].Value[0] = volumeImages[0].FrameOfReferenceUID;\r\n // }\r\n // NOTE: depending on different data source, image.ImageType sometimes\r\n // is a string, not a string array.\r\n // m['00080008'] = transformImageTypeUnnaturalized(m['00080008']);\r\n\r\n // const image = new metadataUtils.VLWholeSlideMicroscopyImage({\r\n // metadata: m,\r\n // });\r\n // const imageFlavor = image.ImageType[2];\r\n // if (imageFlavor === 'VOLUME' || imageFlavor === 'THUMBNAIL') {\r\n // volumeImages.push(image);\r\n // }\r\n // });\r\n // }\r\n\r\n metadata.forEach(m => {\r\n // NOTE: depending on different data source, image.ImageType sometimes\r\n // is a string, not a string array.\r\n m.ImageType = typeof m.ImageType === 'string' ? m.ImageType.split('\\\\') : m.ImageType;\r\n\r\n const inst = cleanDenaturalizedDataset(\r\n dcmjs.data.DicomMetaDictionary.denaturalizeDataset(m),\r\n {\r\n StudyInstanceUID: m.StudyInstanceUID,\r\n SeriesInstanceUID: m.SeriesInstanceUID,\r\n dataSourceConfig: this.props.dataSource.getConfig(),\r\n }\r\n );\r\n if (!inst['00480105']) {\r\n // Optical Path Sequence, no OpticalPathIdentifier?\r\n // NOTE: this is actually a not-well formatted DICOM VL Whole Slide Microscopy Image.\r\n inst['00480105'] = {\r\n vr: 'SQ',\r\n Value: [\r\n {\r\n '00480106': {\r\n vr: 'SH',\r\n Value: ['1'],\r\n },\r\n },\r\n ],\r\n };\r\n }\r\n const image = new metadataUtils.VLWholeSlideMicroscopyImage({\r\n metadata: inst,\r\n });\r\n\r\n const imageFlavor = image.ImageType[2];\r\n if (imageFlavor === 'VOLUME' || imageFlavor === 'THUMBNAIL') {\r\n volumeImages.push(image);\r\n }\r\n });\r\n\r\n // format metadata for microscopy-viewer\r\n const options = {\r\n client,\r\n metadata: volumeImages,\r\n retrieveRendered: false,\r\n controls: ['overview', 'position'],\r\n };\r\n\r\n this.viewer = new microscopyViewer(options);\r\n\r\n if (this.overlayElement && this.overlayElement.current && this.viewer.addViewportOverlay) {\r\n this.viewer.addViewportOverlay({\r\n element: this.overlayElement.current,\r\n coordinates: [0, 0], // TODO: dicom-microscopy-viewer documentation says this can be false to be automatically, but it is not.\r\n navigate: true,\r\n className: 'OpenLayersOverlay',\r\n });\r\n }\r\n\r\n this.viewer.render({ container });\r\n\r\n const { StudyInstanceUID, SeriesInstanceUID } = displaySet;\r\n\r\n this.managedViewer = this.microscopyService.addViewer(\r\n this.viewer,\r\n this.props.viewportId,\r\n container,\r\n StudyInstanceUID,\r\n SeriesInstanceUID\r\n );\r\n\r\n this.managedViewer.addContextMenuCallback((event: Event) => {\r\n // TODO: refactor this after Bill's changes on ContextMenu feature get merged\r\n // const roiAnnotationNearBy = this.getNearbyROI(event);\r\n });\r\n };\r\n\r\n this.microscopyService.clearAnnotations();\r\n\r\n let smDisplaySet = displaySet;\r\n if (displaySet.Modality === 'SR') {\r\n // for SR displaySet, let's load the actual image displaySet\r\n smDisplaySet = displaySet.getSourceDisplaySet();\r\n }\r\n console.log('Loading viewer metadata', smDisplaySet);\r\n\r\n await loadViewer(smDisplaySet.others);\r\n\r\n if (displaySet.Modality === 'SR') {\r\n displaySet.load(smDisplaySet);\r\n }\r\n }\r\n\r\n componentDidMount() {\r\n const { displaySets, viewportOptions } = this.props;\r\n const { viewportId } = viewportOptions;\r\n // Todo-rename: this is always getting the 0\r\n const displaySet = displaySets[0];\r\n this.installOpenLayersRenderer(this.container.current, displaySet).then(() => {\r\n this.setState({ isLoaded: true });\r\n });\r\n }\r\n\r\n componentDidUpdate(prevProps: Readonly<{}>, prevState: Readonly<{}>, snapshot?: any): void {\r\n if (this.managedViewer && prevProps.displaySets !== this.props.displaySets) {\r\n const { displaySets } = this.props;\r\n const displaySet = displaySets[0];\r\n\r\n this.microscopyService.clearAnnotations();\r\n\r\n // loading SR\r\n if (displaySet.Modality === 'SR') {\r\n const referencedDisplaySet = displaySet.getSourceDisplaySet();\r\n displaySet.load(referencedDisplaySet);\r\n }\r\n }\r\n }\r\n\r\n componentWillUnmount() {\r\n this.microscopyService.removeViewer(this.viewer);\r\n }\r\n\r\n setViewportActiveHandler = () => {\r\n const { setViewportActive, viewportId, activeViewportId } = this.props;\r\n\r\n if (viewportId !== activeViewportId) {\r\n setViewportActive(viewportId);\r\n }\r\n };\r\n\r\n render() {\r\n const style = { width: '100%', height: '100%' };\r\n const displaySet = this.props.displaySets[0];\r\n const firstInstance = displaySet.firstInstance || displaySet.instance;\r\n\r\n return (\r\n \r\n
\r\n
\r\n
\r\n {displaySet && firstInstance.imageId && (\r\n \r\n )}\r\n
\r\n
\r\n
\r\n {ReactResizeDetector && (\r\n \r\n )}\r\n {this.state.error ? (\r\n

{JSON.stringify(this.state.error)}

\r\n ) : (\r\n
\r\n )}\r\n {this.state.isLoaded ? null : (\r\n \r\n )}\r\n
\r\n );\r\n }\r\n\r\n onWindowResize = () => {\r\n this.debouncedResize();\r\n };\r\n}\r\n\r\nexport default DicomMicroscopyViewport;\r\n"],"names":["props","list","itemGenerator","map","item","generator","Error","_ref","topLeft","topRight","bottomLeft","bottomRight","overlay","React","length","className","classnames","listComponentGenerator","DICOMwebClient","api","_buildMultipartAcceptHeaderFieldValue","isPrimitive","v","Array","isArray","vrNumerics","cleanDenaturalizedDataset","obj","options","o","Object","keys","forEach","key","Value","vr","BulkDataURI","dicomWebUtils","dataSourceConfig","window","location","protocol","startsWith","replace","includes","entry","DicomMicroscopyViewport","Component","constructor","super","state","error","isLoaded","microscopyService","viewer","managedViewer","container","overlayElement","debouncedResize","setViewportActiveHandler","setViewportActive","viewportId","activeViewportId","this","onWindowResize","servicesManager","services","debounce","resize","getNearbyROI","event","autoselect","arguments","undefined","symbols","getOwnPropertySymbols","_drawingSource","find","p","description","_pyramid","_map","_affine","feature","getClosestFeatureToCoordinate","getEventCoordinate","roiAnnotation","_getROIFromFeature","metadata","selectAnnotation","installOpenLayersRenderer","displaySet","clearAnnotations","smDisplaySet","Modality","getSourceDisplaySet","console","log","async","DicomMicroscopyViewer","metadataUtils","microscopyViewer","VolumeImageViewer","client","extensionManager","config","dataSources","ds","sourceName","activeDataSource","userAuthenticationService","wadoRoot","staticWado","singlepart","configuration","wadoConfig","url","headers","getAuthorizationHeader","errorInterceptor","errorHandler","getHTTPErrorHandler","wadoURL","retrieveInstanceFrames","frameNumbers","toString","sopInstanceUID","instance","DicomMetadataStore","getInstance","studyInstanceUID","seriesInstanceUID","split","fr","PixelData","getDicomWebClient","volumeImages","m","ImageType","inst","dcmjs","DicomMetaDictionary","denaturalizeDataset","StudyInstanceUID","SeriesInstanceUID","dataSource","getConfig","image","VLWholeSlideMicroscopyImage","imageFlavor","push","retrieveRendered","controls","current","addViewportOverlay","element","coordinates","navigate","render","addViewer","addContextMenuCallback","loadViewer","others","load","componentDidMount","displaySets","viewportOptions","then","setState","componentDidUpdate","prevProps","prevState","snapshot","referencedDisplaySet","componentWillUnmount","removeViewer","style","width","height","firstInstance","onClick","display","ref","position","imageId","ViewportOverlay","ReactResizeDetector","handleWidth","handleHeight","onResize","JSON","stringify","LoadingIndicatorProgress","propTypes","viewportData","PropTypes","viewportLabel","displaySetOptions","commandsManager"],"sourceRoot":""} \ No newline at end of file diff --git a/resources/250.css b/resources/250.css new file mode 100644 index 0000000..8ed4766 --- /dev/null +++ b/resources/250.css @@ -0,0 +1,5 @@ +.DicomMicroscopyViewer{--ol-partial-background-color:#7f7f7fb3;--ol-foreground-color:#000;--ol-subtle-foreground-color:#000;--ol-subtle-background-color:#4e4e4e80}.DicomMicroscopyViewer .ol-box{background-color:var(--ol-partial-background-color);border:1.5px solid var(--ol-background-color);border-radius:2px;-webkit-box-sizing:border-box;box-sizing:border-box}.DicomMicroscopyViewer .ol-mouse-position{position:absolute;right:8px;top:8px}.DicomMicroscopyViewer .ol-scale-line{background:var(--ol-partial-background-color);border-radius:4px;bottom:8px;left:8px;padding:2px;position:absolute}.DicomMicroscopyViewer .ol-scale-line-inner{border:1px solid var(--ol-subtle-foreground-color);border-top:none;color:var(--ol-foreground-color);font-size:10px;margin:1px;text-align:center;-webkit-transition:all .25s;transition:all .25s;will-change:contents,width}.DicomMicroscopyViewer .ol-scale-bar{bottom:8px;left:8px;position:absolute}.DicomMicroscopyViewer .ol-scale-bar-inner{display:-webkit-box;display:-ms-flexbox;display:flex}.DicomMicroscopyViewer .ol-scale-step-marker{background-color:var(--ol-foreground-color);float:right;height:15px;width:1px;z-index:10}.DicomMicroscopyViewer .ol-scale-step-text{bottom:-5px;font-size:10px;z-index:11}.DicomMicroscopyViewer .ol-scale-step-text,.DicomMicroscopyViewer .ol-scale-text{color:var(--ol-foreground-color);position:absolute;text-shadow:-1.5px 0 var(--ol-partial-background-color),0 1.5px var(--ol-partial-background-color),1.5px 0 var(--ol-partial-background-color),0 -1.5px var(--ol-partial-background-color)}.DicomMicroscopyViewer .ol-scale-text{bottom:25px;font-size:12px;text-align:center}.DicomMicroscopyViewer .ol-scale-singlebar{border:1px solid var(--ol-foreground-color);-webkit-box-sizing:border-box;box-sizing:border-box;height:10px;position:relative;z-index:9}.DicomMicroscopyViewer .ol-scale-singlebar-even{background-color:var(--ol-subtle-foreground-color)}.DicomMicroscopyViewer .ol-scale-singlebar-odd{background-color:var(--ol-background-color)}.DicomMicroscopyViewer .ol-unsupported{display:none}.DicomMicroscopyViewer .ol-unselectable,.DicomMicroscopyViewer .ol-viewport{-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent;-webkit-user-select:none;-moz-user-select:none; -ms-user-select:none; user-select:none}.DicomMicroscopyViewer .ol-viewport canvas{all:unset}.DicomMicroscopyViewer .ol-selectable{-webkit-touch-callout:default;-webkit-user-select:text;-moz-user-select:text; -ms-user-select:text; user-select:text}.DicomMicroscopyViewer .ol-grabbing{cursor:-webkit-grabbing;cursor:grabbing}.DicomMicroscopyViewer .ol-grab{cursor:move;cursor:-webkit-grab;cursor:grab}.DicomMicroscopyViewer .ol-control{background-color:var(--ol-subtle-background-color);border-radius:4px;position:absolute}.DicomMicroscopyViewer .ol-zoom{left:.5em;top:.5em}.DicomMicroscopyViewer .ol-rotate{right:.5em;top:.5em;-webkit-transition:opacity .25s linear,visibility 0s linear;transition:opacity .25s linear,visibility 0s linear}.DicomMicroscopyViewer .ol-rotate.ol-hidden{opacity:0;-webkit-transition:opacity .25s linear,visibility 0s linear .25s;transition:opacity .25s linear,visibility 0s linear .25s;visibility:hidden}.DicomMicroscopyViewer .ol-zoom-extent{left:.5em;top:4.643em}.DicomMicroscopyViewer .ol-full-screen{right:.5em;top:.5em}.DicomMicroscopyViewer .ol-control button{background-color:var(--ol-background-color);border:none;border-radius:2px;color:var(--ol-subtle-foreground-color);display:block;font-size:inherit;font-weight:700;height:1.375em;line-height:.4em;margin:1px;padding:0;text-align:center;text-decoration:none;width:1.375em}.DicomMicroscopyViewer .ol-control button::-moz-focus-inner{border:none;padding:0}.DicomMicroscopyViewer .ol-zoom-extent button{line-height:1.4em}.DicomMicroscopyViewer .ol-compass{display:block;font-weight:400;will-change:transform}.DicomMicroscopyViewer .ol-touch .ol-control button{font-size:1.5em}.DicomMicroscopyViewer .ol-touch .ol-zoom-extent{top:5.5em}.DicomMicroscopyViewer .ol-control button:focus,.DicomMicroscopyViewer .ol-control button:hover{color:var(--ol-foreground-color);outline:1px solid var(--ol-subtle-foreground-color);text-decoration:none}.DicomMicroscopyViewer .ol-zoom .ol-zoom-in{border-radius:2px 2px 0 0}.DicomMicroscopyViewer .ol-zoom .ol-zoom-out{border-radius:0 0 2px 2px}.DicomMicroscopyViewer .ol-attribution{-webkit-box-align:center;-ms-flex-align:center;align-items:center;bottom:.5em;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-flow:row-reverse;flex-flow:row-reverse;max-width:calc(100% - 1.3em);right:.5em;text-align:right}.DicomMicroscopyViewer .ol-attribution a{color:var(--ol-subtle-foreground-color);text-decoration:none}.DicomMicroscopyViewer .ol-attribution ul{color:var(--ol-foreground-color);font-size:12px;margin:0;padding:1px .5em;text-shadow:0 0 2px var(--ol-background-color)}.DicomMicroscopyViewer .ol-attribution li{display:inline;list-style:none}.DicomMicroscopyViewer .ol-attribution li:not(:last-child):after{content:" "}.DicomMicroscopyViewer .ol-attribution img{max-height:2em;max-width:inherit;vertical-align:middle}.DicomMicroscopyViewer .ol-attribution button{-ms-flex-negative:0;flex-shrink:0}.DicomMicroscopyViewer .ol-attribution.ol-collapsed ul{display:none}.DicomMicroscopyViewer .ol-attribution:not(.ol-collapsed){background:var(--ol-partial-background-color)}.DicomMicroscopyViewer .ol-attribution.ol-uncollapsible{border-radius:4px 0 0;bottom:0;right:0}.DicomMicroscopyViewer .ol-attribution.ol-uncollapsible img{margin-top:-.2em;max-height:1.6em}.DicomMicroscopyViewer .ol-attribution.ol-uncollapsible button{display:none}.DicomMicroscopyViewer .ol-zoomslider{height:200px;left:.5em;top:4.5em}.DicomMicroscopyViewer .ol-zoomslider button{height:10px;position:relative}.DicomMicroscopyViewer .ol-touch .ol-zoomslider{top:5.5em}.DicomMicroscopyViewer .ol-overviewmap{bottom:.5em;left:.5em}.DicomMicroscopyViewer .ol-overviewmap.ol-uncollapsible{border-radius:0 4px 0 0;bottom:0;left:0}.DicomMicroscopyViewer .ol-overviewmap .ol-overviewmap-map,.DicomMicroscopyViewer .ol-overviewmap button{display:block}.DicomMicroscopyViewer .ol-overviewmap .ol-overviewmap-map{border:1px solid var(--ol-subtle-foreground-color);height:150px;width:150px}.DicomMicroscopyViewer .ol-overviewmap:not(.ol-collapsed) button{bottom:0;left:0;position:absolute}.DicomMicroscopyViewer .ol-overviewmap.ol-collapsed .ol-overviewmap-map,.DicomMicroscopyViewer .ol-overviewmap.ol-uncollapsible button{display:none}.DicomMicroscopyViewer .ol-overviewmap:not(.ol-collapsed){background:var(--ol-subtle-background-color)}.DicomMicroscopyViewer .ol-overviewmap-box{border:.5px dotted var(--ol-subtle-foreground-color)}.DicomMicroscopyViewer .ol-overviewmap .ol-overviewmap-box:hover{cursor:move}@layout-header-background: #007ea3;@primary-color: #007ea3;@processing-color: #8cb8c6;@success-color: #3f9c35;@warning-color: #eeaf30;@error-color: #96172e;@font-size-base: 14px;.DicomMicroscopyViewer .ol-tooltip{font-size:16px!important} +.DicomMicroscopyViewer .OpenLayersOverlay{display:block!important;height:100%;pointer-events:none!important;width:100%}.DicomMicroscopyViewer .text-primary-light{color:#ff0;font-size:14px;font-weight:400}.DicomMicroscopyViewer .text-primary-light span{max-width:300px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.DicomMicroscopyViewer .absolute{position:absolute}.DicomMicroscopyViewer .flex{display:-webkit-box;display:-ms-flexbox;display:flex}.DicomMicroscopyViewer .flex-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.DicomMicroscopyViewer .flex-col{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.DicomMicroscopyViewer .pointer-events-none{pointer-events:none}.DicomMicroscopyViewer .left-viewport-scrollbar{left:.5rem}.DicomMicroscopyViewer .right-viewport-scrollbar{right:1.3rem}.DicomMicroscopyViewer .top-viewport{top:.5rem}.DicomMicroscopyViewer .bottom-viewport{bottom:.5rem}.DicomMicroscopyViewer .bottom-viewport.left-viewport{bottom:.5rem;left:calc(.5rem + 250px)}.DicomMicroscopyViewer .right-viewport-scrollbar .flex{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:end}.DicomMicroscopyViewer .microscopy-viewport-overlay{background:#00000080;max-width:40%;padding:.5rem 1rem}.DicomMicroscopyViewer .microscopy-viewport-overlay .flex{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.DicomMicroscopyViewer .top-viewport .flex span:not(.font-light){-ms-flex-negative:0;flex-shrink:0} +.dicom-tag-browser-table{margin-left:auto;margin-right:auto}.dicom-tag-browser-table-wrapper{overflow-x:scroll}.dicom-tag-browser-table tr{border-top:1px solid #ddd;color:#fff;padding-left:10px;padding-right:10px;white-space:nowrap}.stick{overflow:clip;position:sticky}.dicom-tag-browser-content{overflow:hidden;padding-bottom:50px;width:100%}.dicom-tag-browser-instance-range .range{height:20px}.dicom-tag-browser-instance-range{padding:20px 0}.dicom-tag-browser-table td.dicom-tag-browser-table-center{text-align:center}.dicom-tag-browser-table th{color:"#20A5D6";padding-left:10px;padding-right:10px;text-align:center}.dicom-tag-browser-table th.dicom-tag-browser-table-left{text-align:left} + +/*# sourceMappingURL=250.css.map*/ \ No newline at end of file diff --git a/resources/250.css.map b/resources/250.css.map new file mode 100644 index 0000000..6559244 --- /dev/null +++ b/resources/250.css.map @@ -0,0 +1 @@ +{"version":3,"file":"250.css","mappings":"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","sources":["webpack:///../../../extensions/dicom-microscopy/src/DicomMicroscopyViewport.css","webpack:///../../../extensions/dicom-microscopy/src/components/ViewportOverlay/ViewportOverlay.css","webpack:///../../../extensions/default/src/DicomTagBrowser/DicomTagBrowser.css"],"sourcesContent":[".DicomMicroscopyViewer {\r\n --ol-partial-background-color: rgba(127, 127, 127, 0.7);\r\n --ol-foreground-color: #000000;\r\n --ol-subtle-foreground-color: #000;\r\n --ol-subtle-background-color: rgba(78, 78, 78, 0.5);\r\n}\r\n\r\n.DicomMicroscopyViewer .ol-box {\r\n box-sizing: border-box;\r\n border-radius: 2px;\r\n border: 1.5px solid var(--ol-background-color);\r\n background-color: var(--ol-partial-background-color);\r\n}\r\n\r\n.DicomMicroscopyViewer .ol-mouse-position {\r\n top: 8px;\r\n right: 8px;\r\n position: absolute;\r\n}\r\n\r\n.DicomMicroscopyViewer .ol-scale-line {\r\n background: var(--ol-partial-background-color);\r\n border-radius: 4px;\r\n bottom: 8px;\r\n left: 8px;\r\n padding: 2px;\r\n position: absolute;\r\n}\r\n\r\n.DicomMicroscopyViewer .ol-scale-line-inner {\r\n border: 1px solid var(--ol-subtle-foreground-color);\r\n border-top: none;\r\n color: var(--ol-foreground-color);\r\n font-size: 10px;\r\n text-align: center;\r\n margin: 1px;\r\n will-change: contents, width;\r\n transition: all 0.25s;\r\n}\r\n\r\n.DicomMicroscopyViewer .ol-scale-bar {\r\n position: absolute;\r\n bottom: 8px;\r\n left: 8px;\r\n}\r\n\r\n.DicomMicroscopyViewer .ol-scale-bar-inner {\r\n display: flex;\r\n}\r\n\r\n.DicomMicroscopyViewer .ol-scale-step-marker {\r\n width: 1px;\r\n height: 15px;\r\n background-color: var(--ol-foreground-color);\r\n float: right;\r\n z-index: 10;\r\n}\r\n\r\n.DicomMicroscopyViewer .ol-scale-step-text {\r\n position: absolute;\r\n bottom: -5px;\r\n font-size: 10px;\r\n z-index: 11;\r\n color: var(--ol-foreground-color);\r\n text-shadow:\r\n -1.5px 0 var(--ol-partial-background-color),\r\n 0 1.5px var(--ol-partial-background-color),\r\n 1.5px 0 var(--ol-partial-background-color),\r\n 0 -1.5px var(--ol-partial-background-color);\r\n}\r\n\r\n.DicomMicroscopyViewer .ol-scale-text {\r\n position: absolute;\r\n font-size: 12px;\r\n text-align: center;\r\n bottom: 25px;\r\n color: var(--ol-foreground-color);\r\n text-shadow:\r\n -1.5px 0 var(--ol-partial-background-color),\r\n 0 1.5px var(--ol-partial-background-color),\r\n 1.5px 0 var(--ol-partial-background-color),\r\n 0 -1.5px var(--ol-partial-background-color);\r\n}\r\n\r\n.DicomMicroscopyViewer .ol-scale-singlebar {\r\n position: relative;\r\n height: 10px;\r\n z-index: 9;\r\n box-sizing: border-box;\r\n border: 1px solid var(--ol-foreground-color);\r\n}\r\n\r\n.DicomMicroscopyViewer .ol-scale-singlebar-even {\r\n background-color: var(--ol-subtle-foreground-color);\r\n}\r\n\r\n.DicomMicroscopyViewer .ol-scale-singlebar-odd {\r\n background-color: var(--ol-background-color);\r\n}\r\n\r\n.DicomMicroscopyViewer .ol-unsupported {\r\n display: none;\r\n}\r\n\r\n.DicomMicroscopyViewer .ol-viewport,\r\n.DicomMicroscopyViewer .ol-unselectable {\r\n -webkit-touch-callout: none;\r\n -webkit-user-select: none;\r\n -moz-user-select: none;\r\n user-select: none;\r\n -webkit-tap-highlight-color: transparent;\r\n}\r\n\r\n.DicomMicroscopyViewer .ol-viewport canvas {\r\n all: unset;\r\n}\r\n\r\n.DicomMicroscopyViewer .ol-selectable {\r\n -webkit-touch-callout: default;\r\n -webkit-user-select: text;\r\n -moz-user-select: text;\r\n user-select: text;\r\n}\r\n\r\n.DicomMicroscopyViewer .ol-grabbing {\r\n cursor: -webkit-grabbing;\r\n cursor: -moz-grabbing;\r\n cursor: grabbing;\r\n}\r\n\r\n.DicomMicroscopyViewer .ol-grab {\r\n cursor: move;\r\n cursor: -webkit-grab;\r\n cursor: -moz-grab;\r\n cursor: grab;\r\n}\r\n\r\n.DicomMicroscopyViewer .ol-control {\r\n position: absolute;\r\n background-color: var(--ol-subtle-background-color);\r\n border-radius: 4px;\r\n}\r\n\r\n.DicomMicroscopyViewer .ol-zoom {\r\n top: 0.5em;\r\n left: 0.5em;\r\n}\r\n\r\n.DicomMicroscopyViewer .ol-rotate {\r\n top: 0.5em;\r\n right: 0.5em;\r\n transition:\r\n opacity 0.25s linear,\r\n visibility 0s linear;\r\n}\r\n\r\n.DicomMicroscopyViewer .ol-rotate.ol-hidden {\r\n opacity: 0;\r\n visibility: hidden;\r\n transition:\r\n opacity 0.25s linear,\r\n visibility 0s linear 0.25s;\r\n}\r\n\r\n.DicomMicroscopyViewer .ol-zoom-extent {\r\n top: 4.643em;\r\n left: 0.5em;\r\n}\r\n\r\n.DicomMicroscopyViewer .ol-full-screen {\r\n right: 0.5em;\r\n top: 0.5em;\r\n}\r\n\r\n.DicomMicroscopyViewer .ol-control button {\r\n display: block;\r\n margin: 1px;\r\n padding: 0;\r\n color: var(--ol-subtle-foreground-color);\r\n font-weight: bold;\r\n text-decoration: none;\r\n font-size: inherit;\r\n text-align: center;\r\n height: 1.375em;\r\n width: 1.375em;\r\n line-height: 0.4em;\r\n background-color: var(--ol-background-color);\r\n border: none;\r\n border-radius: 2px;\r\n}\r\n\r\n.DicomMicroscopyViewer .ol-control button::-moz-focus-inner {\r\n border: none;\r\n padding: 0;\r\n}\r\n\r\n.DicomMicroscopyViewer .ol-zoom-extent button {\r\n line-height: 1.4em;\r\n}\r\n\r\n.DicomMicroscopyViewer .ol-compass {\r\n display: block;\r\n font-weight: normal;\r\n will-change: transform;\r\n}\r\n\r\n.DicomMicroscopyViewer .ol-touch .ol-control button {\r\n font-size: 1.5em;\r\n}\r\n\r\n.DicomMicroscopyViewer .ol-touch .ol-zoom-extent {\r\n top: 5.5em;\r\n}\r\n\r\n.DicomMicroscopyViewer .ol-control button:hover,\r\n.DicomMicroscopyViewer .ol-control button:focus {\r\n text-decoration: none;\r\n outline: 1px solid var(--ol-subtle-foreground-color);\r\n color: var(--ol-foreground-color);\r\n}\r\n\r\n.DicomMicroscopyViewer .ol-zoom .ol-zoom-in {\r\n border-radius: 2px 2px 0 0;\r\n}\r\n\r\n.DicomMicroscopyViewer .ol-zoom .ol-zoom-out {\r\n border-radius: 0 0 2px 2px;\r\n}\r\n\r\n.DicomMicroscopyViewer .ol-attribution {\r\n text-align: right;\r\n bottom: 0.5em;\r\n right: 0.5em;\r\n max-width: calc(100% - 1.3em);\r\n display: flex;\r\n flex-flow: row-reverse;\r\n align-items: center;\r\n}\r\n\r\n.DicomMicroscopyViewer .ol-attribution a {\r\n color: var(--ol-subtle-foreground-color);\r\n text-decoration: none;\r\n}\r\n\r\n.DicomMicroscopyViewer .ol-attribution ul {\r\n margin: 0;\r\n padding: 1px 0.5em;\r\n color: var(--ol-foreground-color);\r\n text-shadow: 0 0 2px var(--ol-background-color);\r\n font-size: 12px;\r\n}\r\n\r\n.DicomMicroscopyViewer .ol-attribution li {\r\n display: inline;\r\n list-style: none;\r\n}\r\n\r\n.DicomMicroscopyViewer .ol-attribution li:not(:last-child):after {\r\n content: ' ';\r\n}\r\n\r\n.DicomMicroscopyViewer .ol-attribution img {\r\n max-height: 2em;\r\n max-width: inherit;\r\n vertical-align: middle;\r\n}\r\n\r\n.DicomMicroscopyViewer .ol-attribution button {\r\n flex-shrink: 0;\r\n}\r\n\r\n.DicomMicroscopyViewer .ol-attribution.ol-collapsed ul {\r\n display: none;\r\n}\r\n\r\n.DicomMicroscopyViewer .ol-attribution:not(.ol-collapsed) {\r\n background: var(--ol-partial-background-color);\r\n}\r\n\r\n.DicomMicroscopyViewer .ol-attribution.ol-uncollapsible {\r\n bottom: 0;\r\n right: 0;\r\n border-radius: 4px 0 0;\r\n}\r\n\r\n.DicomMicroscopyViewer .ol-attribution.ol-uncollapsible img {\r\n margin-top: -0.2em;\r\n max-height: 1.6em;\r\n}\r\n\r\n.DicomMicroscopyViewer .ol-attribution.ol-uncollapsible button {\r\n display: none;\r\n}\r\n\r\n.DicomMicroscopyViewer .ol-zoomslider {\r\n top: 4.5em;\r\n left: 0.5em;\r\n height: 200px;\r\n}\r\n\r\n.DicomMicroscopyViewer .ol-zoomslider button {\r\n position: relative;\r\n height: 10px;\r\n}\r\n\r\n.DicomMicroscopyViewer .ol-touch .ol-zoomslider {\r\n top: 5.5em;\r\n}\r\n\r\n.DicomMicroscopyViewer .ol-overviewmap {\r\n left: 0.5em;\r\n bottom: 0.5em;\r\n}\r\n\r\n.DicomMicroscopyViewer .ol-overviewmap.ol-uncollapsible {\r\n bottom: 0;\r\n left: 0;\r\n border-radius: 0 4px 0 0;\r\n}\r\n\r\n.DicomMicroscopyViewer .ol-overviewmap .ol-overviewmap-map,\r\n.DicomMicroscopyViewer .ol-overviewmap button {\r\n display: block;\r\n}\r\n\r\n.DicomMicroscopyViewer .ol-overviewmap .ol-overviewmap-map {\r\n border: 1px solid var(--ol-subtle-foreground-color);\r\n height: 150px;\r\n width: 150px;\r\n}\r\n\r\n.DicomMicroscopyViewer .ol-overviewmap:not(.ol-collapsed) button {\r\n bottom: 0;\r\n left: 0;\r\n position: absolute;\r\n}\r\n\r\n.DicomMicroscopyViewer .ol-overviewmap.ol-collapsed .ol-overviewmap-map,\r\n.DicomMicroscopyViewer .ol-overviewmap.ol-uncollapsible button {\r\n display: none;\r\n}\r\n\r\n.DicomMicroscopyViewer .ol-overviewmap:not(.ol-collapsed) {\r\n background: var(--ol-subtle-background-color);\r\n}\r\n\r\n.DicomMicroscopyViewer .ol-overviewmap-box {\r\n border: 0.5px dotted var(--ol-subtle-foreground-color);\r\n}\r\n\r\n.DicomMicroscopyViewer .ol-overviewmap .ol-overviewmap-box:hover {\r\n cursor: move;\r\n}\r\n\r\n@layout-header-background: #007ea3;\r\n@primary-color: #007ea3;\r\n@processing-color: #8cb8c6;\r\n@success-color: #3f9c35;\r\n@warning-color: #eeaf30;\r\n@error-color: #96172e;\r\n@font-size-base: 14px;\r\n\r\n.DicomMicroscopyViewer .ol-tooltip {\r\n font-size: 16px !important;\r\n}\r\n",".DicomMicroscopyViewer .OpenLayersOverlay {\r\n height: 100%;\r\n width: 100%;\r\n display: block !important;\r\n pointer-events: none !important;\r\n}\r\n\r\n.DicomMicroscopyViewer .text-primary-light {\r\n font-size: 14px;\r\n color: yellow;\r\n font-weight: normal;\r\n}\r\n\r\n.DicomMicroscopyViewer .text-primary-light span {\r\n overflow: hidden;\r\n white-space: nowrap;\r\n text-overflow: ellipsis;\r\n max-width: 300px;\r\n /* text-shadow: 0px 1px 1px rgba(225, 225, 225, 0.6),\r\n 0px 1px 1px rgba(225, 225, 225, 0.6),\r\n 1px 1px 3px rgba(225, 225, 225, 0.9),\r\n 1px 1px 3px rgba(225, 225, 225, 0.9),\r\n 1px 1px 3px rgba(225, 225, 225, 0.9),\r\n 1px 1px 3px rgba(225, 225, 225, 0.9); */\r\n}\r\n\r\n.DicomMicroscopyViewer .absolute {\r\n position: absolute;\r\n}\r\n\r\n.DicomMicroscopyViewer .flex {\r\n display: flex;\r\n}\r\n\r\n.DicomMicroscopyViewer .flex-row {\r\n flex-direction: row;\r\n}\r\n\r\n.DicomMicroscopyViewer .flex-col {\r\n flex-direction: column;\r\n}\r\n\r\n.DicomMicroscopyViewer .pointer-events-none {\r\n pointer-events: none;\r\n}\r\n\r\n.DicomMicroscopyViewer .left-viewport-scrollbar {\r\n left: 0.5rem;\r\n}\r\n\r\n.DicomMicroscopyViewer .right-viewport-scrollbar {\r\n right: 1.3rem;\r\n}\r\n\r\n.DicomMicroscopyViewer .top-viewport {\r\n top: 0.5rem;\r\n}\r\n\r\n.DicomMicroscopyViewer .bottom-viewport {\r\n bottom: 0.5rem;\r\n}\r\n\r\n.DicomMicroscopyViewer .bottom-viewport.left-viewport {\r\n bottom: 0.5rem;\r\n left: calc(0.5rem + 250px);\r\n}\r\n\r\n.DicomMicroscopyViewer .right-viewport-scrollbar .flex {\r\n justify-content: end;\r\n}\r\n\r\n.DicomMicroscopyViewer .microscopy-viewport-overlay {\r\n padding: 0.5rem 1rem;\r\n background: rgba(0, 0, 0, 0.5);\r\n max-width: 40%;\r\n}\r\n\r\n.DicomMicroscopyViewer .microscopy-viewport-overlay .flex {\r\n max-width: 100%;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n.DicomMicroscopyViewer .top-viewport .flex span:not(.font-light) {\r\n flex-shrink: 0;\r\n}\r\n",".dicom-tag-browser-table {\r\n margin-right: auto;\r\n margin-left: auto;\r\n}\r\n\r\n.dicom-tag-browser-table-wrapper {\r\n /* height: 500px;*/\r\n /*overflow-y: scroll;*/\r\n overflow-x: scroll;\r\n}\r\n\r\n.dicom-tag-browser-table tr {\r\n padding-left: 10px;\r\n padding-right: 10px;\r\n color: #ffffff;\r\n border-top: 1px solid #ddd;\r\n white-space: nowrap;\r\n}\r\n\r\n.stick {\r\n position: sticky;\r\n overflow: clip;\r\n}\r\n\r\n.dicom-tag-browser-content {\r\n overflow: hidden;\r\n width: 100%;\r\n padding-bottom: 50px;\r\n /*height: 500px;*/\r\n}\r\n\r\n.dicom-tag-browser-instance-range .range {\r\n height: 20px;\r\n}\r\n\r\n.dicom-tag-browser-instance-range {\r\n padding: 20px 0 20px 0;\r\n}\r\n\r\n.dicom-tag-browser-table td.dicom-tag-browser-table-center {\r\n text-align: center;\r\n}\r\n\r\n.dicom-tag-browser-table th {\r\n padding-left: 10px;\r\n padding-right: 10px;\r\n text-align: center;\r\n color: '#20A5D6';\r\n}\r\n\r\n.dicom-tag-browser-table th.dicom-tag-browser-table-left {\r\n text-align: left;\r\n}\r\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/resources/281.bundle.17478b3e1d9df5f9a026.js b/resources/281.bundle.17478b3e1d9df5f9a026.js new file mode 100644 index 0000000..ff8c73a --- /dev/null +++ b/resources/281.bundle.17478b3e1d9df5f9a026.js @@ -0,0 +1,2 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[281],{42281:(o,e,n)=>{n.r(e),n.d(e,{cornerstone:()=>m,default:()=>M});var i=n(71771);const t=JSON.parse('{"u2":"@ohif/mode-microscopy"}').u2;function s(o,e,n,i,t,s){return{id:e,icon:n,label:i,type:o,commands:t,tooltip:s}}s.bind(null,"action"),s.bind(null,"toggle");const l=s.bind(null,"tool"),a=[{id:"MeasurementTools",type:"ohif.splitButton",props:{groupId:"MeasurementTools",isRadio:!0,primary:l("line","tool-length","Line",[{commandName:"setToolActive",commandOptions:{toolName:"line"},context:"MICROSCOPY"}],"Line"),secondary:{icon:"chevron-down",label:"",isActive:!0,tooltip:"More Measure Tools"},items:[l("line","tool-length","Line",[{commandName:"setToolActive",commandOptions:{toolName:"line"},context:"MICROSCOPY"}],"Line Tool"),l("point","tool-point","Point",[{commandName:"setToolActive",commandOptions:{toolName:"point"},context:"MICROSCOPY"}],"Point Tool"),l("polygon","tool-polygon","Polygon",[{commandName:"setToolActive",commandOptions:{toolName:"polygon"},context:"MICROSCOPY"}],"Polygon Tool"),l("circle","tool-circle","Circle",[{commandName:"setToolActive",commandOptions:{toolName:"circle"},context:"MICROSCOPY"}],"Circle Tool"),l("box","tool-rectangle","Box",[{commandName:"setToolActive",commandOptions:{toolName:"box"},context:"MICROSCOPY"}],"Box Tool"),l("freehandpolygon","tool-freehand-polygon","Freehand Polygon",[{commandName:"setToolActive",commandOptions:{toolName:"freehandpolygon"},context:"MICROSCOPY"}],"Freehand Polygon Tool"),l("freehandline","tool-freehand-line","Freehand Line",[{commandName:"setToolActive",commandOptions:{toolName:"freehandline"},context:"MICROSCOPY"}],"Freehand Line Tool")]}},{id:"dragPan",type:"ohif.radioGroup",props:{type:"tool",icon:"tool-move",label:"Pan",commands:[{commandName:"setToolActive",commandOptions:{toolName:"dragPan"},context:"MICROSCOPY"}]}}],c="@ohif/extension-default.layoutTemplateModule.viewerLayout",d="@ohif/extension-default.hangingProtocolModule.default",r="@ohif/extension-default.panelModule.seriesList",m={viewport:"@ohif/extension-cornerstone.viewportModule.cornerstone"},p="@ohif/extension-dicom-video.sopClassHandlerModule.dicom-video",u="@ohif/extension-dicom-video.viewportModule.dicom-video",f="@ohif/extension-dicom-pdf.sopClassHandlerModule.dicom-pdf",h="@ohif/extension-dicom-pdf.viewportModule.dicom-pdf",y={"@ohif/extension-default":"^3.0.0","@ohif/extension-cornerstone":"^3.0.0","@ohif/extension-cornerstone-dicom-sr":"^3.0.0","@ohif/extension-dicom-pdf":"^3.0.1","@ohif/extension-dicom-video":"^3.0.1","@ohif/extension-dicom-microscopy":"^3.0.0"};const M={id:t,modeFactory:function(o){let{modeConfiguration:e}=o;return{id:t,routeName:"microscopy",displayName:"Microscopy",onModeEnter:o=>{let{servicesManager:e,extensionManager:n,commandsManager:i}=o;const{toolbarService:t}=e.services;t.init(n),t.addButtons(a),t.createButtonSection("primary",["MeasurementTools","dragPan"])},onModeExit:o=>{let{servicesManager:e}=o;const{toolbarService:n}=e.services;n.reset()},validationTags:{study:[],series:[]},isValidMode:o=>{let{modalities:e}=o;return e.split("\\").includes("SM")},routes:[{path:"microscopy",layoutTemplate:o=>{let{location:e,servicesManager:n}=o;return{id:c,props:{leftPanels:[r],leftPanelDefaultClosed:!0,rightPanelDefaultClosed:!0,rightPanels:["@ohif/extension-dicom-microscopy.panelModule.measure"],viewports:[{namespace:"@ohif/extension-dicom-microscopy.viewportModule.microscopy-dicom",displaySetsToDisplay:["@ohif/extension-dicom-microscopy.sopClassHandlerModule.DicomMicroscopySopClassHandler","@ohif/extension-dicom-microscopy.sopClassHandlerModule.DicomMicroscopySRSopClassHandler"]},{namespace:u,displaySetsToDisplay:[p]},{namespace:h,displaySetsToDisplay:[f]}]}}}}],extensions:y,hangingProtocols:[d],hangingProtocol:["default"],sopClassHandlers:["@ohif/extension-dicom-microscopy.sopClassHandlerModule.DicomMicroscopySopClassHandler","@ohif/extension-dicom-microscopy.sopClassHandlerModule.DicomMicroscopySRSopClassHandler",p,f],hotkeys:[...i.dD.defaults.hotkeyBindings],...e}},extensionDependencies:y}}}]); +//# sourceMappingURL=281.bundle.17478b3e1d9df5f9a026.js.map \ No newline at end of file diff --git a/resources/281.bundle.17478b3e1d9df5f9a026.js.map b/resources/281.bundle.17478b3e1d9df5f9a026.js.map new file mode 100644 index 0000000..2c6c678 --- /dev/null +++ b/resources/281.bundle.17478b3e1d9df5f9a026.js.map @@ -0,0 +1 @@ +{"version":3,"file":"281.bundle.17478b3e1d9df5f9a026.js","mappings":"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","sources":["webpack:///../../../modes/microscopy/src/id.js","webpack:///../../../modes/microscopy/src/toolbarButtons.js","webpack:///../../../modes/microscopy/src/index.tsx"],"sourcesContent":["import packageJson from '../package.json';\r\n\r\nconst id = packageJson.name;\r\n\r\nexport { id };\r\n","// TODO: torn, can either bake this here; or have to create a whole new button type\r\n/**\r\n *\r\n * @param {*} type - 'tool' | 'action' | 'toggle'\r\n * @param {*} id\r\n * @param {*} icon\r\n * @param {*} label\r\n */\r\nfunction _createButton(type, id, icon, label, commands, tooltip) {\r\n return {\r\n id,\r\n icon,\r\n label,\r\n type,\r\n commands,\r\n tooltip,\r\n };\r\n}\r\n\r\nconst _createActionButton = _createButton.bind(null, 'action');\r\nconst _createToggleButton = _createButton.bind(null, 'toggle');\r\nconst _createToolButton = _createButton.bind(null, 'tool');\r\n\r\nconst toolbarButtons = [\r\n // Measurement\r\n {\r\n id: 'MeasurementTools',\r\n type: 'ohif.splitButton',\r\n props: {\r\n groupId: 'MeasurementTools',\r\n isRadio: true, // ?\r\n // Switch?\r\n primary: _createToolButton(\r\n 'line',\r\n 'tool-length',\r\n 'Line',\r\n [\r\n {\r\n commandName: 'setToolActive',\r\n commandOptions: {\r\n toolName: 'line',\r\n },\r\n context: 'MICROSCOPY',\r\n },\r\n ],\r\n 'Line'\r\n ),\r\n secondary: {\r\n icon: 'chevron-down',\r\n label: '',\r\n isActive: true,\r\n tooltip: 'More Measure Tools',\r\n },\r\n items: [\r\n _createToolButton(\r\n 'line',\r\n 'tool-length',\r\n 'Line',\r\n [\r\n {\r\n commandName: 'setToolActive',\r\n commandOptions: {\r\n toolName: 'line',\r\n },\r\n context: 'MICROSCOPY',\r\n },\r\n ],\r\n 'Line Tool'\r\n ),\r\n _createToolButton(\r\n 'point',\r\n 'tool-point',\r\n 'Point',\r\n [\r\n {\r\n commandName: 'setToolActive',\r\n commandOptions: {\r\n toolName: 'point',\r\n },\r\n context: 'MICROSCOPY',\r\n },\r\n ],\r\n 'Point Tool'\r\n ),\r\n _createToolButton(\r\n 'polygon',\r\n 'tool-polygon',\r\n 'Polygon',\r\n [\r\n {\r\n commandName: 'setToolActive',\r\n commandOptions: {\r\n toolName: 'polygon',\r\n },\r\n context: 'MICROSCOPY',\r\n },\r\n ],\r\n 'Polygon Tool'\r\n ),\r\n _createToolButton(\r\n 'circle',\r\n 'tool-circle',\r\n 'Circle',\r\n [\r\n {\r\n commandName: 'setToolActive',\r\n commandOptions: {\r\n toolName: 'circle',\r\n },\r\n context: 'MICROSCOPY',\r\n },\r\n ],\r\n 'Circle Tool'\r\n ),\r\n _createToolButton(\r\n 'box',\r\n 'tool-rectangle',\r\n 'Box',\r\n [\r\n {\r\n commandName: 'setToolActive',\r\n commandOptions: {\r\n toolName: 'box',\r\n },\r\n context: 'MICROSCOPY',\r\n },\r\n ],\r\n 'Box Tool'\r\n ),\r\n _createToolButton(\r\n 'freehandpolygon',\r\n 'tool-freehand-polygon',\r\n 'Freehand Polygon',\r\n [\r\n {\r\n commandName: 'setToolActive',\r\n commandOptions: {\r\n toolName: 'freehandpolygon',\r\n },\r\n context: 'MICROSCOPY',\r\n },\r\n ],\r\n 'Freehand Polygon Tool'\r\n ),\r\n _createToolButton(\r\n 'freehandline',\r\n 'tool-freehand-line',\r\n 'Freehand Line',\r\n [\r\n {\r\n commandName: 'setToolActive',\r\n commandOptions: {\r\n toolName: 'freehandline',\r\n },\r\n context: 'MICROSCOPY',\r\n },\r\n ],\r\n 'Freehand Line Tool'\r\n ),\r\n ],\r\n },\r\n },\r\n // Pan...\r\n {\r\n id: 'dragPan',\r\n type: 'ohif.radioGroup',\r\n props: {\r\n type: 'tool',\r\n icon: 'tool-move',\r\n label: 'Pan',\r\n commands: [\r\n {\r\n commandName: 'setToolActive',\r\n commandOptions: {\r\n toolName: 'dragPan',\r\n },\r\n context: 'MICROSCOPY',\r\n },\r\n ],\r\n },\r\n },\r\n];\r\n\r\nexport default toolbarButtons;\r\n","import { hotkeys } from '@ohif/core';\r\n\r\nimport { id } from './id';\r\nimport toolbarButtons from './toolbarButtons';\r\n\r\nconst ohif = {\r\n layout: '@ohif/extension-default.layoutTemplateModule.viewerLayout',\r\n sopClassHandler: '@ohif/extension-default.sopClassHandlerModule.stack',\r\n hangingProtocols: '@ohif/extension-default.hangingProtocolModule.default',\r\n leftPanel: '@ohif/extension-default.panelModule.seriesList',\r\n rightPanel: '@ohif/extension-default.panelModule.measure',\r\n};\r\n\r\nexport const cornerstone = {\r\n viewport: '@ohif/extension-cornerstone.viewportModule.cornerstone',\r\n};\r\n\r\nconst dicomvideo = {\r\n sopClassHandler: '@ohif/extension-dicom-video.sopClassHandlerModule.dicom-video',\r\n viewport: '@ohif/extension-dicom-video.viewportModule.dicom-video',\r\n};\r\n\r\nconst dicompdf = {\r\n sopClassHandler: '@ohif/extension-dicom-pdf.sopClassHandlerModule.dicom-pdf',\r\n viewport: '@ohif/extension-dicom-pdf.viewportModule.dicom-pdf',\r\n};\r\n\r\nconst extensionDependencies = {\r\n // Can derive the versions at least process.env.from npm_package_version\r\n '@ohif/extension-default': '^3.0.0',\r\n '@ohif/extension-cornerstone': '^3.0.0',\r\n '@ohif/extension-cornerstone-dicom-sr': '^3.0.0',\r\n '@ohif/extension-dicom-pdf': '^3.0.1',\r\n '@ohif/extension-dicom-video': '^3.0.1',\r\n '@ohif/extension-dicom-microscopy': '^3.0.0',\r\n};\r\n\r\nfunction modeFactory({ modeConfiguration }) {\r\n return {\r\n // TODO: We're using this as a route segment\r\n // We should not be.\r\n id,\r\n routeName: 'microscopy',\r\n displayName: 'Microscopy',\r\n\r\n /**\r\n * Lifecycle hooks\r\n */\r\n onModeEnter: ({ servicesManager, extensionManager, commandsManager }) => {\r\n const { toolbarService } = servicesManager.services;\r\n\r\n toolbarService.init(extensionManager);\r\n toolbarService.addButtons(toolbarButtons);\r\n toolbarService.createButtonSection('primary', ['MeasurementTools', 'dragPan']);\r\n },\r\n\r\n onModeExit: ({ servicesManager }) => {\r\n const { toolbarService } = servicesManager.services;\r\n\r\n toolbarService.reset();\r\n },\r\n\r\n validationTags: {\r\n study: [],\r\n series: [],\r\n },\r\n\r\n isValidMode: ({ modalities }) => {\r\n const modalities_list = modalities.split('\\\\');\r\n\r\n // Slide Microscopy and ECG modality not supported by basic mode yet\r\n return modalities_list.includes('SM');\r\n },\r\n\r\n routes: [\r\n {\r\n path: 'microscopy',\r\n /*init: ({ servicesManager, extensionManager }) => {\r\n //defaultViewerRouteInit\r\n },*/\r\n layoutTemplate: ({ location, servicesManager }) => {\r\n return {\r\n id: ohif.layout,\r\n props: {\r\n leftPanels: [ohif.leftPanel],\r\n leftPanelDefaultClosed: true, // we have problem with rendering thumbnails for microscopy images\r\n rightPanelDefaultClosed: true, // we do not have the save microscopy measurements yet\r\n rightPanels: ['@ohif/extension-dicom-microscopy.panelModule.measure'],\r\n viewports: [\r\n {\r\n namespace: '@ohif/extension-dicom-microscopy.viewportModule.microscopy-dicom',\r\n displaySetsToDisplay: [\r\n '@ohif/extension-dicom-microscopy.sopClassHandlerModule.DicomMicroscopySopClassHandler',\r\n '@ohif/extension-dicom-microscopy.sopClassHandlerModule.DicomMicroscopySRSopClassHandler',\r\n ],\r\n },\r\n {\r\n namespace: dicomvideo.viewport,\r\n displaySetsToDisplay: [dicomvideo.sopClassHandler],\r\n },\r\n {\r\n namespace: dicompdf.viewport,\r\n displaySetsToDisplay: [dicompdf.sopClassHandler],\r\n },\r\n ],\r\n },\r\n };\r\n },\r\n },\r\n ],\r\n extensions: extensionDependencies,\r\n hangingProtocols: [ohif.hangingProtocols],\r\n hangingProtocol: ['default'],\r\n\r\n // Order is important in sop class handlers when two handlers both use\r\n // the same sop class under different situations. In that case, the more\r\n // general handler needs to come last. For this case, the dicomvideo must\r\n // come first to remove video transfer syntax before ohif uses images\r\n sopClassHandlers: [\r\n '@ohif/extension-dicom-microscopy.sopClassHandlerModule.DicomMicroscopySopClassHandler',\r\n '@ohif/extension-dicom-microscopy.sopClassHandlerModule.DicomMicroscopySRSopClassHandler',\r\n dicomvideo.sopClassHandler,\r\n dicompdf.sopClassHandler,\r\n ],\r\n hotkeys: [...hotkeys.defaults.hotkeyBindings],\r\n ...modeConfiguration,\r\n };\r\n}\r\n\r\nconst mode = {\r\n id,\r\n modeFactory,\r\n extensionDependencies,\r\n};\r\n\r\nexport default mode;\r\n"],"names":["id","packageJson","_createButton","type","icon","label","commands","tooltip","bind","_createToolButton","props","groupId","isRadio","primary","commandName","commandOptions","toolName","context","secondary","isActive","items","ohif","cornerstone","viewport","dicomvideo","dicompdf","extensionDependencies","modeFactory","_ref","modeConfiguration","routeName","displayName","onModeEnter","_ref2","servicesManager","extensionManager","commandsManager","toolbarService","services","init","addButtons","toolbarButtons","createButtonSection","onModeExit","_ref3","reset","validationTags","study","series","isValidMode","_ref4","modalities","split","includes","routes","path","layoutTemplate","_ref5","location","leftPanels","leftPanelDefaultClosed","rightPanelDefaultClosed","rightPanels","viewports","namespace","displaySetsToDisplay","extensions","hangingProtocols","hangingProtocol","sopClassHandlers","hotkeys","defaults","hotkeyBindings"],"sourceRoot":""} \ No newline at end of file diff --git a/resources/342.bundle.352b0a5b0103bd979889.js b/resources/342.bundle.352b0a5b0103bd979889.js new file mode 100644 index 0000000..3590361 --- /dev/null +++ b/resources/342.bundle.352b0a5b0103bd979889.js @@ -0,0 +1,2 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[342],{56342:(e,t,a)=>{a.r(t),a.d(t,{ContextMenuController:()=>ht,CustomizableContextMenuTypes:()=>n,createReportAsync:()=>Ae,createReportDialogPrompt:()=>Te,default:()=>ua,dicomWebUtils:()=>s,getStudiesForPatientByMRN:()=>be});var n={};a.r(n);var s={};a.r(s),a.d(s,{fixBulkDataURI:()=>x});var r=a(97604),o=a(71771),i=a(62971);const{getString:c,getName:l,getModalities:u}=o.DICOMWeb;function d(e){if(!e||!e.length)return[];const t=[];return e.forEach((e=>t.push({studyInstanceUid:c(e["0020000D"]),date:c(e["00080020"]),time:c(e["00080030"]),accession:c(e["00080050"])||"",mrn:c(e["00100020"])||"",patientName:o.utils.formatPN(l(e["00100010"]))||"",instances:Number(c(e["00201208"]))||0,description:c(e["00081030"])||"",modalities:c(u(e["00080060"],e["00080061"]))||""}))),t}async function m(e,t,a,n){return await e.searchForStudies({studyInstanceUid:void 0,queryParams:n})}function p(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!e)return;const a=["00081030","00080060"].join(","),{supportsWildcard:n}=t,s=e=>n&&e?`*${e}*`:e,r={PatientName:s(e.patientName),"00100020":s(e.patientId),AccessionNumber:s(e.accessionNumber),StudyDescription:s(e.studyDescription),ModalitiesInStudy:e.modalitiesInStudy,limit:e.limit||101,offset:e.offset||0,fuzzymatching:!0===t.supportsFuzzyMatching,includefield:a};if(e.startDate&&e.endDate)r.StudyDate=`${e.startDate}-${e.endDate}`;else if(e.startDate){const t=new Date,a=String(t.getDate()).padStart(2,"0"),n=String(t.getMonth()+1).padStart(2,"0"),s=`${t.getFullYear()}${n}${a}`;r.StudyDate=`${e.startDate}-${s}`}else if(e.endDate){const t="19700102";r.StudyDate=`${t}-${e.endDate}`}if(e.studyInstanceUid){let t=e.studyInstanceUid;t=Array.isArray(t)?t.join():t,t=t.replace(/[^0-9.]+/g,"\\"),r.StudyInstanceUID=t}const o={};return Object.keys(r).forEach((e=>{void 0!==r[e]&&""!==r[e]&&(o[e]=r[e])})),o}function g(e){let{instance:t,frame:a,config:n,thumbnail:s=!1}=e;if(!t)return;if(t.url)return t.url;const r=s?"thumbnailRendering":"imageRendering";if(n[r]&&"wadouri"!==n[r])return function(e,t,a){const n=function(e,t,a){const n=function(e,t){const{StudyInstanceUID:a,SeriesInstanceUID:n,SOPInstanceUID:s}=e;return`${t.wadoRoot}/studies/${a}/series/${n}/instances/${s}`}(e,t);return`${n}/frames/${a=a||1}`}(e,t,a);if(n)return`wadors:${n}`}(t,n,a);{const e=function(e,t){const{StudyInstanceUID:a,SeriesInstanceUID:n,SOPInstanceUID:s}=t,r=[];r.push("requestType=WADO"),r.push(`studyUID=${a}`),r.push(`seriesUID=${n}`),r.push(`objectUID=${s}`),r.push("contentType=application/dicom"),r.push("transferSyntax=*");const o=r.join("&");return`${e.wadoUriRoot}?${o}`}(n,t);let s="dicomweb:"+e;return void 0!==a&&(s+="&frame="+a),s}}var f=a(67540);class I{constructor(e,t){let a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},n=arguments.length>3?arguments[3]:void 0,s=arguments.length>4?arguments[4]:void 0;this.client=e,this.studyInstanceUID=t,this.filters=a,this.sortCriteria=n,this.sortFunction=s}async execLoad(){const e=await this.preLoad(),t=await this.load(e);return await this.posLoad(t)}async runLoaders(e){let t;for(const a of e)try{if(t=await a(),t&&t.length)break}catch(e){throw e}if(e.next().done&&!t)throw new Error("RetrieveMetadataLoader failed");return t}async configLoad(){}async preLoad(){}async load(e){}async posLoad(e){}}class y extends I{getOptions(){const{studyInstanceUID:e,filters:t}=this,a={studyInstanceUID:e},{seriesInstanceUID:n}=t;return n&&(a.seriesInstanceUID=n),a}*getLoaders(){const e=[],{studyInstanceUID:t,filters:{seriesInstanceUID:a}={},client:n}=this;a&&e.push(n.retrieveSeriesMetadata.bind(n,{studyInstanceUID:t,seriesInstanceUID:a})),e.push(n.retrieveStudyMetadata.bind(n,{studyInstanceUID:t})),yield*e}async load(e){const t=this.getLoaders();return this.runLoaders(t)}async posLoad(e){return e}}class S extends I{*getPreLoaders(){const e=[],{studyInstanceUID:t,filters:{seriesInstanceUID:a}={},client:n}=this;if(a){const s={studyInstanceUID:t,queryParams:{SeriesInstanceUID:a}};e.push(n.searchForSeries.bind(n,s))}e.push(n.searchForSeries.bind(n,{studyInstanceUID:t})),yield*e}async preLoad(){const e=this.getPreLoaders(),t=await this.runLoaders(e),a=this.sortCriteria,n=this.sortFunction,{naturalizeDataset:s}=f.default.data.DicomMetaDictionary,r=t.map(s);return(0,i.IO)(r,a||i.S1.seriesSortCriteria.seriesInfoSortingCriteria,n)}async load(e){const{client:t,studyInstanceUID:a}=this,n=function(e,t,a){return Object.freeze({hasNext:()=>a.length>0,async next(){const n=a.shift();return e.retrieveSeriesMetadata({studyInstanceUID:t,seriesInstanceUID:n})}})}(t,a,e.map((e=>e.SeriesInstanceUID))),s=[];for(;n.hasNext();)s.push(n.next());return{preLoadData:e,promises:s}}async posLoad(e){let{preLoadData:t,promises:a}=e;return{preLoadData:t,promises:a}}}const h=async function(e,t,a){const n=new(!1!==a?S:y)(e,t,arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},arguments.length>4?arguments[4]:void 0,arguments.length>5?arguments[5]:void 0);return await n.execLoad()},v="RetrieveStudyMetadata",D=new Map;function w(e,t,a,n,s,r){if(!e)throw new Error(`${v}: Required 'dicomWebClient' parameter not provided.`);if(!t)throw new Error(`${v}: Required 'StudyInstanceUID' parameter not provided.`);if(D.has(t))return D.get(t);const o=new Promise(((o,i)=>{h(e,t,a,n,s,r).then((function(e){o(e)}),i)}));return D.set(t,o),o}function b(e){D.has(e)&&D.delete(e)}class E extends r.api.DICOMwebClient{constructor(e){super(e),this.staticWado=e.staticWado}async searchForStudies(e){if(!this.staticWado)return super.searchForStudies(e);const t=await super.searchForStudies(e),{queryParams:a}=e;if(!a)return t;const n=this.toLowerParams(a);return t.filter((e=>{for(const t of Object.keys(E.studyFilterKeys))if(!this.filterItem(t,n,e,E.studyFilterKeys))return!1;return!0}))}async searchForSeries(e){if(!this.staticWado)return super.searchForSeries(e);const t=await super.searchForSeries(e),{queryParams:a}=e;if(!a)return t;const n=this.toLowerParams(a);return t.filter((e=>{for(const t of Object.keys(E.seriesFilterKeys))if(!this.filterItem(t,n,e,E.seriesFilterKeys))return!1;return!0}))}compareValues(e,t){if(Array.isArray(e))return e.find((e=>this.compareValues(e,t)));if(Array.isArray(t))return t.find((t=>this.compareValues(e,t)));if(t?.Alphabetic&&(t=t.Alphabetic),"string"==typeof t){if(0===t.length)return!0;if(0===e.length||"*"===e)return!0;if("*"===e[0]&&"*"===e[e.length-1])return-1!=t.indexOf(e.substring(1,e.length-1));if("*"===e[e.length-1])return-1!=t.indexOf(e.substring(0,e.length-1));if("*"===e[0])return t.indexOf(e.substring(1))===t.length-e.length+1}return e===t}compareDateRange(e,t){if(!t)return!0;const a=e.indexOf("-");if(-1===a)return this.compareValues(e,t);const n=e.substring(0,a),s=e.substring(a+1);return(!n||t>=n)&&(!s||t<=s)}filterItem(e,t,a,n){const s=n[e]||e;if(!t)return!0;const r=t[e]||t[s];if(!r)return!0;const o=a[e]||a[s];if(!o)return!1;if("DA"===o.vr&&o.Value?.[0])return this.compareDateRange(r,o.Value[0]);const i=o.Value;return this.compareValues(r,i)}toLowerParams(e){const t={};return Object.entries(e).forEach((e=>{let[a,n]=e;t[a.toLowerCase()]=n})),t}}E.studyFilterKeys={studyinstanceuid:"0020000D",patientname:"00100010","00100020":"mrn",studydescription:"00081030",studydate:"00080020",modalitiesinstudy:"00080061",accessionnumber:"00080050"},E.seriesFilterKeys={seriesinstanceuid:"0020000E",seriesnumber:"00200011",modality:"00080060"};const M=(e,t)=>{const{wadoRoot:a,singlepart:n}=e,{instance:s,tag:r="PixelData",defaultPath:i="/pixeldata",defaultType:c="video/mp4",singlepart:l="video"}=t,u=s[r];if(!u)return;if(u.DirectRetrieveURL)return u.DirectRetrieveURL;if(u.InlineBinary){const e=o.utils.b64toBlob(u.InlineBinary,c);return u.DirectRetrieveURL=URL.createObjectURL(e),u.DirectRetrieveURL}if(!n||!0!==n&&-1===n.indexOf(l))return u.retrieveBulkData?u.retrieveBulkData().then((e=>(u.DirectRetrieveURL=URL.createObjectURL(new Blob([e],{type:c})),u.DirectRetrieveURL))):void console.warn("Unable to retrieve",r,"from",s);const{StudyInstanceUID:d,SeriesInstanceUID:m,SOPInstanceUID:p}=s,g=u&&u.BulkDataURI||`series/${m}/instances/${p}${i}`,f=-1!==g.indexOf("?"),I=-1!==g.indexOf("accept=");return"PixelData"===r||"EncapsulatedDocument"===r?`${a}/studies/${d}/series/${m}/instances/${p}/rendered`:g+(I?"":(f?"&":"?")+`accept=${c}`)};function x(e,t,a){if(e.BulkDataURI.startsWith("http")||e.BulkDataURI.startsWith("/")){if("/"===e.BulkDataURI[0]&&a.wadoRoot.startsWith("http")){const t=new URL(a.wadoRoot);e.BulkDataURI=`${t.origin}${e.BulkDataURI}`}}else"studies"===a.bulkDataURI?.relativeResolution?e.BulkDataURI=`${a.wadoRoot}/studies/${t.StudyInstanceUID}/${e.BulkDataURI}`:"series"!==a.bulkDataURI?.relativeResolution&&a.bulkDataURI?.relativeResolution||(e.BulkDataURI=`${a.wadoRoot}/studies/${t.StudyInstanceUID}/series/${t.SeriesInstanceUID}/${e.BulkDataURI}`)}const{DicomMetaDictionary:U,DicomDict:R}=f.default.data,{naturalizeDataset:N,denaturalizeDataset:C}=U,P="2.25.270695996825855179949881587723571202391.2.0.0",T="OHIF-VIEWER-2.0.0",O="1.2.840.10008.1.2.1",A=o.classes.MetadataProvider;function L(e,t){let a,n,s,l,u,f,I;const y={initialize:i=>{let{params:c,query:d}=i;e.onConfiguration&&"function"==typeof e.onConfiguration&&(e=e.onConfiguration(e,{params:c,query:d})),a=JSON.parse(JSON.stringify(e)),f=()=>{const e={},a=t.getAuthorizationHeader();return a&&a.Authorization&&(e.Authorization=a.Authorization),e},I=()=>({...f(),Accept:o.utils.generateAcceptHeader(e.acceptHeader,e.requestTransferSyntaxUID,e.omitQuotationForMultipartRequest)}),n={url:e.qidoRoot,staticWado:e.staticWado,singlepart:e.singlepart,headers:t.getAuthorizationHeader(),errorInterceptor:o.Po.getHTTPErrorHandler()},s={url:e.wadoRoot,staticWado:e.staticWado,singlepart:e.singlepart,headers:t.getAuthorizationHeader(),errorInterceptor:o.Po.getHTTPErrorHandler()},l=e.staticWado?new E(n):new r.api.DICOMwebClient(n),u=e.staticWado?new E(s):new r.api.DICOMwebClient(s)},query:{studies:{mapParams:p.bind(),search:async function(t){l.headers=f();const{studyInstanceUid:a,seriesInstanceUid:n,...s}=p(t,{supportsFuzzyMatching:e.supportsFuzzyMatching,supportsWildcard:e.supportsWildcard})||{};return d(await m(l,0,0,s))},processResults:d.bind()},series:{search:async function(e){l.headers=f();return function(e){const t=[];return e&&e.length&&e.forEach((e=>t.push({studyInstanceUid:c(e["0020000D"]),seriesInstanceUid:c(e["0020000E"]),modality:c(e["00080060"]),seriesNumber:c(e["00200011"]),seriesDate:o.utils.formatDate(c(e["00080021"])),numSeriesInstances:Number(c(e["00201209"])),description:c(e["0008103E"])}))),(0,i.IO)(t),t}(await function(e,t){const a={includefield:["0008103E","00080021"].join(",")};return e.searchForSeries({studyInstanceUID:t,queryParams:a})}(l,e))}},instances:{search:(e,t)=>{l.headers=f(),m.call(void 0,l,e,null,t)}}},retrieve:{directURL:t=>M({wadoRoot:e.wadoRoot,singlepart:e.singlepart},t),bulkDataURI:async e=>{let{StudyInstanceUID:t,BulkDataURI:a}=e;l.headers=f();const n={multipart:!1,BulkDataURI:a,StudyInstanceUID:t};return l.retrieveBulkData(n).then((e=>e&&e[0]||void 0))},series:{metadata:async function(){let{StudyInstanceUID:t,filters:a,sortCriteria:n,sortFunction:s,madeInClient:r=!1}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(!t)throw new Error("Unable to query for SeriesMetadata without StudyInstanceUID");return e.enableStudyLazyLoad?y._retrieveSeriesMetadataAsync(t,a,n,s,r):y._retrieveSeriesMetadataSync(t,a,n,s,r)}}},store:{dicom:async(e,t)=>{if(u.headers=f(),e instanceof ArrayBuffer){const a={datasets:[e],request:t};await u.storeInstances(a)}else{const a={FileMetaInformationVersion:e._meta?.FileMetaInformationVersion?.Value,MediaStorageSOPClassUID:e.SOPClassUID,MediaStorageSOPInstanceUID:e.SOPInstanceUID,TransferSyntaxUID:O,ImplementationClassUID:P,ImplementationVersionName:T},n=C(a),s=new R(n);s.dict=C(e);const r={datasets:[s.write()],request:t};await u.storeInstances(r)}}},_retrieveSeriesMetadataSync:async(t,a,n,s,r)=>{u.headers=I();const i=(await w(u,t,!1,a,n,s)).map(N),c={},l={};i.forEach((a=>{c[a.SeriesInstanceUID]||(c[a.SeriesInstanceUID]={StudyInstanceUID:a.StudyInstanceUID,StudyDescription:a.StudyDescription,SeriesInstanceUID:a.SeriesInstanceUID,SeriesDescription:a.SeriesDescription,SeriesNumber:a.SeriesNumber,SeriesTime:a.SeriesTime,SOPClassUID:a.SOPClassUID,ProtocolName:a.ProtocolName,Modality:a.Modality}),l[a.SeriesInstanceUID]||(l[a.SeriesInstanceUID]=[]);const n=y.getImageIdsForInstance({instance:a});a.imageId=n,a.wadoRoot=e.wadoRoot,a.wadoUri=e.wadoUri,A.addImageIdToUIDs(n,{StudyInstanceUID:t,SeriesInstanceUID:a.SeriesInstanceUID,SOPInstanceUID:a.SOPInstanceUID}),l[a.SeriesInstanceUID].push(a)}));const d=Object.values(c);o.DicomMetadataStore.addSeriesMetadata(d,r),Object.keys(l).forEach((e=>o.DicomMetadataStore.addInstances(l[e],r)))},_retrieveSeriesMetadataAsync:async function(t,a,n,s){let r=arguments.length>4&&void 0!==arguments[4]&&arguments[4];u.headers=I();const{preLoadData:i,promises:c}=await w(u,t,!0,a,n,s),d=t=>{const a=N(t);return e.bulkDataURI?.enabled?(Object.keys(a).forEach((t=>{const n=a[t];n&&n.BulkDataURI&&!n.Value&&(n.retrieveBulkData=()=>{x(n,a,e);const t={multipart:!1,BulkDataURI:n.BulkDataURI,StudyInstanceUID:a.StudyInstanceUID};return l.retrieveBulkData(t).then((e=>{const t=e instanceof Array&&e.find((e=>e?.byteLength))||void 0;return n.Value=t,t}))})})),a):a};i.forEach((e=>{e.StudyInstanceUID=t})),o.DicomMetadataStore.addSeriesMetadata(i,r);const m=c.map((a=>a.then((a=>{!function(a){const n=a.map(d);n.forEach(((a,n)=>{a.wadoRoot=e.wadoRoot,a.wadoUri=e.wadoUri;const s=y.getImageIdsForInstance({instance:a});a.imageId=s,A.addImageIdToUIDs(s,{StudyInstanceUID:t,SeriesInstanceUID:a.SeriesInstanceUID,SOPInstanceUID:a.SOPInstanceUID})})),o.DicomMetadataStore.addInstances(n,r)}(a)}))));await Promise.all(m),o.DicomMetadataStore.getStudy(t,r).isLoaded=!0},deleteStudyMetadataPromise:b,getImageIdsForDisplaySet(e){const t=e.images,a=[];return t?(e.images.forEach((e=>{const t=e.NumberOfFrames;if(t>1)for(let n=1;n<=t;n++){const t=this.getImageIdsForInstance({instance:e,frame:n});a.push(t)}else{const t=this.getImageIdsForInstance({instance:e});a.push(t)}})),a):a},getImageIdsForInstance(t){let{instance:a,frame:n}=t;return g({instance:a,frame:n,config:e})},getConfig:()=>a,getStudyInstanceUIDs(e){let{params:t,query:a}=e;const{StudyInstanceUIDs:n}=t,s=o.utils.splitComma(a.getAll("StudyInstanceUIDs")),r=s.length&&s||n;return r&&Array.isArray(r)?r:[r]}};var S;return e.supportsReject&&(y.reject=(S=e.wadoRoot,{series:(e,t)=>new Promise(((a,n)=>{const s=`${S}/studies/${e}/series/${t}/reject/113001%5EDCM`,r=new XMLHttpRequest;r.open("POST",s,!0),console.log(r),r.onreadystatechange=function(){if(4==r.readyState)switch(r.status){case 204:a(r.responseText);break;case 404:n("Your dataSource does not support reject functionality")}},r.send()}))})),o.Is.create(y)}const k=o.default.classes.MetadataProvider,F={studyInstanceUid:"StudyInstanceUID",patientId:"PatientID"};let V={urls:[],studyInstanceUIDMap:new Map};const $=e=>V.urls.find((t=>t.url===e)),q=(e,t)=>{let a=[];return V.urls.map((n=>{n.studies.map((n=>{n[e]===t&&a.push(n)}))})),a};function _(e){const{wadoRoot:t}=e,a={initialize:async e=>{let{query:t,url:a}=e;a||(a=t.get("url"));let n=$(a);if(n)return n.studies.map((e=>e.StudyInstanceUID));const s=await fetch(a),r=await s.json();let o,i;r.studies.forEach((e=>{o=e.StudyInstanceUID,e.series.forEach((e=>{i=e.SeriesInstanceUID,e.instances.forEach((e=>{const{url:t,metadata:a}=e;k.addImageIdToUIDs(t,{StudyInstanceUID:o,SeriesInstanceUID:i,SOPInstanceUID:a.SOPInstanceUID})}))}))})),V.urls.push({url:a,studies:[...r.studies]}),V.studyInstanceUIDMap.set(a,r.studies.map((e=>e.StudyInstanceUID)))},query:{studies:{mapParams:()=>{},search:async e=>{const[t,a]=Object.entries(e)[0],n=F[t];return q(n,a).map((e=>({accession:e.AccessionNumber,date:e.StudyDate,description:e.StudyDescription,instances:e.NumInstances,modalities:e.Modalities,mrn:e.PatientID,patientName:e.PatientName,studyInstanceUid:e.StudyInstanceUID,NumInstances:e.NumInstances,time:e.StudyTime})))},processResults:()=>{console.warn(" DICOMJson QUERY processResults not implemented")}},series:{search:()=>{console.warn(" DICOMJson QUERY SERIES SEARCH not implemented")}},instances:{search:()=>{console.warn(" DICOMJson QUERY instances SEARCH not implemented")}}},retrieve:{directURL:e=>M(t,e),series:{metadata:async function(){let{StudyInstanceUID:e,madeInClient:t=!1,customSort:a}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(!e)throw new Error("Unable to query for SeriesMetadata without StudyInstanceUID");const n=q("StudyInstanceUID",e)[0];let s;s=a?a(n.series):n.series;const r=s.map((e=>{const t={StudyInstanceUID:n.StudyInstanceUID,...e};return delete t.instances,t}));o.DicomMetadataStore.addSeriesMetadata(r,t);const i=s.length;s.forEach(((a,s)=>{const r=a.instances.map((e=>{const t={...e.metadata,url:e.url,imageId:e.url,...a,...n};return delete t.instances,delete t.series,t}));var c;c=r,o.DicomMetadataStore.addInstances(c,t),s===i-1&&(o.DicomMetadataStore.getStudy(e,t).isLoaded=!0)}))}}},store:{dicom:()=>{console.warn(" DICOMJson store dicom not implemented")}},getImageIdsForDisplaySet(t){const a=t.images,n=[];return a?(t.images.forEach((t=>{const a=t.NumberOfFrames;if(a>1)for(let s=0;s{let{params:t,query:a}=e;const n=a.get("url");return V.studyInstanceUIDMap.get(n)}};return o.Is.create(a)}const j=o.default.classes.MetadataProvider,{EVENTS:B}=o.DicomMetadataStore,Z={SR:!0,SEG:!0,DOC:!0},H=function(e,t){return e===t?arguments.length>2&&void 0!==arguments[2]?arguments[2]:0:e{const a=e.instances[0],n=t.instances[0],s=a.Modality,r=n.Modality,o=Z[s],i=Z[r];return o&&i?H(a.SeriesNumber,n.SeriesNumber):o||i?o?-1:1:H(n.SeriesNumber,a.SeriesNumber)};function z(e){const{name:t}=e,a={initialize:e=>{let{params:t,query:a}=e},query:{studies:{mapParams:()=>{},search:e=>o.DicomMetadataStore.getStudyInstanceUIDs().map((e=>{let t=0;const a=new Set,n=o.DicomMetadataStore.getStudy(e);n.series.forEach((e=>{t+=e.instances.length,a.add(e.instances[0].Modality)}));const s=n?.series[0]?.instances[0];if(s)return{accession:s.AccessionNumber,date:s.StudyDate,description:s.StudyDescription,mrn:s.PatientID,patientName:o.utils.formatPN(s.PatientName),studyInstanceUid:s.StudyInstanceUID,time:s.StudyTime,instances:t,modalities:Array.from(a).join("/"),NumInstances:t}})),processResults:()=>{console.warn(" DICOMLocal QUERY processResults not implemented")}},series:{search:e=>o.DicomMetadataStore.getStudy(e).series.map((t=>{const a=t?.instances[0];return{studyInstanceUid:e,seriesInstanceUid:a.SeriesInstanceUID,modality:a.Modality,seriesNumber:a.SeriesNumber,seriesDate:a.SeriesDate,numSeriesInstances:t.instances.length,description:a.SeriesDescription}}))},instances:{search:()=>{console.warn(" DICOMLocal QUERY instances SEARCH not implemented")}}},retrieve:{directURL:e=>{const{instance:t,tag:a,defaultType:n}=e,s=t[a];if(s instanceof Array&&s[0]instanceof ArrayBuffer)return URL.createObjectURL(new Blob([s[0]],{type:n}))},series:{metadata:async function(){let{StudyInstanceUID:e,madeInClient:t=!1}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(!e)throw new Error("Unable to query for SeriesMetadata without StudyInstanceUID");const a=o.DicomMetadataStore.getStudy(e,t);o.DicomMetadataStore._broadcastEvent(B.SERIES_ADDED,{StudyInstanceUID:e,madeInClient:t}),a.series.forEach((a=>{const{SeriesInstanceUID:n}=a,s=a.instances[0].NumberOfFrames>1;a.instances.forEach(((e,t)=>{const{url:a,StudyInstanceUID:n,SeriesInstanceUID:r,SOPInstanceUID:o}=e;e.imageId=a,j.addImageIdToUIDs(a,{StudyInstanceUID:n,SeriesInstanceUID:r,SOPInstanceUID:o,frameIndex:s?t:1})})),o.DicomMetadataStore._broadcastEvent(B.INSTANCES_ADDED,{StudyInstanceUID:e,SeriesInstanceUID:n,madeInClient:t})}))}}},store:{dicom:e=>{const t=f.default.data.datasetToBlob(e);var a=URL.createObjectURL(t);window.location.assign(a)}},getImageIdsForDisplaySet(e){const t=e.images,a=[];return t?(e.images.forEach((e=>{const t=e.NumberOfFrames;if(t>1)for(let n=1;n<=t;n++){const t=this.getImageIdsForInstance({instance:e,frame:n});a.push(t)}else{const t=this.getImageIdsForInstance({instance:e});a.push(t)}})),a):a},getImageIdsForInstance(e){let{instance:t,frame:a}=e;const{StudyInstanceUID:n,SeriesInstanceUID:s,SOPInstanceUID:r}=t;let i=o.DicomMetadataStore.getInstance(n,s,r).url;return void 0!==a&&(i+=`&frame=${a}`),i},deleteStudyMetadataPromise(){console.log("deleteStudyMetadataPromise not implemented")},getStudyInstanceUIDs:e=>{let{params:t,query:a}=e;const{StudyInstanceUIDs:n}=t,s=a.getAll("StudyInstanceUIDs")||n,r=s&&Array.isArray(s)?s:[s];let i=!1;return r.forEach((e=>{const t=o.DicomMetadataStore.getStudy(e);t&&(t.series=t.series.sort(G),i=!0)})),i?r:[]}};return o.Is.create(a)}function W(e,t){const{name:a}=e;let n;const s={initialize:async e=>{let{params:s,query:r}=e;const o=r.get("url");if(!o)throw new Error(`No url for '${a}'`);{const e=await fetch(o);let a=await e.json();if(!a.servers?.dicomWeb?.[0])throw new Error("Invalid configuration returned by url");n=L(a.servers.dicomWeb[0].configuration,t),n.initialize({params:s,query:r})}},query:{studies:{search:e=>n.query.studies.search(e)},series:{search:function(){return n.query.series.search(...arguments)}},instances:{search:(e,t)=>n.query.instances.search(e,t)}},retrieve:{directURL:function(){return n.retrieve.directURL(...arguments)},series:{metadata:async function(){return n.retrieve.series.metadata(...arguments)}}},store:{dicom:function(){return n.store(...arguments)}},deleteStudyMetadataPromise:function(){return n.deleteStudyMetadataPromise(...arguments)},getImageIdsForDisplaySet:function(){return n.getImageIdsForDisplaySet(...arguments)},getImageIdsForInstance:function(){return n.getImageIdsForInstance(...arguments)},getStudyInstanceUIDs(e){let{params:t,query:n}=e,s=[];const r=n.get("studyInstanceUIDs")||n.get("studyInstanceUids");if(!r)throw new Error(`No studyInstanceUids in request for '${a}'`);return s=r.split(";"),s}};return o.Is.create(s)}const X=function(){return[{name:"dicomweb",type:"webApi",createDataSource:L},{name:"dicomwebproxy",type:"webApi",createDataSource:W},{name:"dicomjson",type:"jsonApi",createDataSource:_},{name:"dicomlocal",type:"localApi",createDataSource:z}]};var Y=a(43001),J=a(3827),K=a.n(J),Q=a(71783),ee=a(62657),te=a(62474),ae=a(69190),ne=a(85066),se=a(50376),re=a(44921),oe=a.n(re);function ie(){return ie=Object.assign?Object.assign.bind():function(e){for(var t=1;t{const{unsubscribe:e}=a.subscribe(a.EVENTS.TOOL_BAR_MODIFIED,(()=>s(a.getButtonSection("primary"))));return()=>{e()}}),[a]);const r=(0,Y.useCallback)((e=>a.recordInteraction(e)),[a]);return Y.createElement(Y.Fragment,null,n.map((e=>{const{id:a,Component:n,componentProps:s}=e;return Y.createElement("div",{key:a,className:oe()("mr-1")},Y.createElement(n,ie({id:a},s,{onInteraction:r,servicesManager:t})))})))}const{availableLanguages:le,defaultLanguage:ue,currentLanguage:de}=se.default;const me=function(e){let{hotkeysManager:t,extensionManager:a,servicesManager:n}=e;const[s]=(0,ee.M)(),r=(0,te.s0)(),i=(0,ne.TH)(),{t:c}=(0,ae.$G)(),{show:l,hide:u}=(0,Q.dd)(),{hotkeyDefinitions:d,hotkeyDefaults:m}=t,p=[{title:c("Header:About"),icon:"info",onClick:()=>l({content:Q.tk,title:"About OHIF Viewer",contentProps:{versionNumber:"3.7.0",commitHash:"5ddf8a16027255d28dc01c1740099cf85bbcf458"}})},{title:c("Header:Preferences"),icon:"settings",onClick:()=>l({title:c("UserPreferencesModal:User Preferences"),content:Q.i1,contentProps:{hotkeyDefaults:t.getValidHotkeyDefinitions(m),hotkeyDefinitions:d,currentLanguage:de(),availableLanguages:le,defaultLanguage:ue,onCancel:()=>{o.dD.stopRecord(),o.dD.unpause(),u()},onSubmit:e=>{let{hotkeyDefinitions:a,language:n}=e;n.value!==de().value&&se.default.changeLanguage(n.value),t.setHotkeys(a),u()},onReset:()=>t.restoreDefaultBindings(),hotkeysModule:o.dD}})}];return s.oidc&&p.push({title:c("Header:Logout"),icon:"power-off",onClick:async()=>{r(`/logout?redirect_uri=${encodeURIComponent(window.location.href)}`)}}),Y.createElement(Q.h4,{menuOptions:p,isReturnEnabled:!!s.showStudyList,onClickReturnButton:()=>{const{pathname:e}=i,t=e.indexOf("/",1),n=new URLSearchParams(window.location.search).get("configUrl"),s=e.substring(t+1),o=a.getDataSources(s),c=new URLSearchParams;-1!==t&&o&&c.append("datasources",e.substring(t+1)),n&&c.append("configUrl",n),r({pathname:"/",search:decodeURIComponent(c.toString())})},WhiteLabeling:s.whiteLabeling},Y.createElement(Q.SV,{context:"Primary Toolbar"},Y.createElement("div",{className:"relative flex justify-center"},Y.createElement(ce,{servicesManager:n}))))},pe=e=>{let{servicesManager:t,side:a,className:n,activeTabIndex:s,tabs:r}=e;const o=t?.services?.panelService,[i,c]=(0,Y.useState)(!1),[l,u]=(0,Y.useState)(s);return(0,Y.useEffect)((()=>{if(o){const e=o.subscribe(o.EVENTS.ACTIVATE_PANEL,(e=>{if(!i||e.forceActive){const t=r.findIndex((t=>t.id===e.panelId));-1!==t&&u(t)}}));return()=>{e.unsubscribe()}}}),[r,i,o]),Y.createElement(Q.hs,{side:a,className:n,activeTabIndex:l,tabs:r,onOpen:()=>{c(!0)}})};function ge(e){let{extensionManager:t,servicesManager:a,hotkeysManager:n,commandsManager:s,viewports:r,ViewportGridComp:i,leftPanels:c=[],rightPanels:l=[],leftPanelDefaultClosed:u=!1,rightPanelDefaultClosed:d=!1}=e;const[m]=(0,ee.M)(),{hangingProtocolService:p}=a.services,[g,f]=(0,Y.useState)(m.showLoadingIndicator);(0,Y.useEffect)((()=>(document.body.classList.add("bg-black"),document.body.classList.add("overflow-hidden"),()=>{document.body.classList.remove("bg-black"),document.body.classList.remove("overflow-hidden")})),[]);const I=e=>{const a=t.getModuleEntry(e);if(!a)throw new Error(`${e} is not valid for an extension module. Please verify your configuration or ensure that the extension is properly registered. It's also possible that your mode is utilizing a module from an extension that hasn't been included in its dependencies (add the extension to the "extensionDependencies" array in your mode's index.js file)`);let n;if(!a||!a.component)throw new Error(`No component found from extension ${e}. Check the reference string to the extension in your Mode configuration`);return n=a.component,{entry:a,content:n}},y=e=>{const{content:t,entry:a}=I(e);return{id:a.id,iconName:a.iconName,iconLabel:a.iconLabel,label:a.label,name:a.name,content:t}};(0,Y.useEffect)((()=>{const{unsubscribe:e}=p.subscribe(o.hy.EVENTS.PROTOCOL_CHANGED,(()=>{f(!1)}));return()=>{e()}}),[p]);const S=c.map(y),h=l.map(y),v=r.map((e=>{const{entry:t}=I(e.namespace);return{component:t.component,displaySetsToDisplay:e.displaySetsToDisplay}}));return Y.createElement("div",null,Y.createElement(me,{hotkeysManager:n,extensionManager:t,servicesManager:a}),Y.createElement("div",{className:"relative flex w-full flex-row flex-nowrap items-stretch overflow-hidden bg-black",style:{height:"calc(100vh - 52px"}},Y.createElement(Y.Fragment,null,g&&Y.createElement(Q.LE,{className:"h-full w-full bg-black"}),S.length?Y.createElement(Q.SV,{context:"Left Panel"},Y.createElement(pe,{side:"left",activeTabIndex:u?null:0,tabs:S,servicesManager:a})):null,Y.createElement("div",{className:"flex h-full flex-1 flex-col"},Y.createElement("div",{className:"relative flex h-full flex-1 items-center justify-center overflow-hidden bg-black"},Y.createElement(Q.SV,{context:"Grid"},Y.createElement(i,{servicesManager:a,viewportComponents:v,commandsManager:s})))),h.length?Y.createElement(Q.SV,{context:"Right Panel"},Y.createElement(pe,{side:"right",activeTabIndex:d?null:0,tabs:h,servicesManager:a})):null)))}ge.propTypes={extensionManager:K().shape({getModuleEntry:K().func.isRequired}).isRequired,commandsManager:K().instanceOf(o.HQ),servicesManager:K().instanceOf(o.Xw),leftPanels:K().array,rightPanels:K().array,leftPanelDefaultClosed:K().bool.isRequired,rightPanelDefaultClosed:K().bool.isRequired,children:K().oneOfType([K().node,K().func]).isRequired,viewports:K().array};const fe=ge;const{sortStudyInstances:Ie,formatDate:ye}=o.utils;function Se(e){let{servicesManager:t,getImageSrc:a,getStudiesForPatientByMRN:n,requestDisplaySetCreationForStudy:s,dataSource:r}=e;const{hangingProtocolService:o,displaySetService:i,uiNotificationService:c}=t.services,l=(0,te.s0)(),{StudyInstanceUIDs:u}=(0,Q.zG)(),[{activeViewportId:d,viewports:m},p]=(0,Q.O_)(),[g,f]=(0,Y.useState)("primary"),[I,y]=(0,Y.useState)([...u]),[S,h]=(0,Y.useState)([]),[v,D]=(0,Y.useState)([]),[w,b]=(0,Y.useState)({});(0,Y.useEffect)((()=>{u.forEach((e=>async function(e){const t=await r.query.studies.search({studyInstanceUid:e});if(!t?.length)throw l("/notfoundstudy","_self"),new Error("Invalid study URL");let a=t;try{a=await n(t)}catch(e){console.warn(e)}const s=a.map((e=>({AccessionNumber:e.accession,StudyDate:e.date,StudyDescription:e.description,NumInstances:e.instances,ModalitiesInStudy:e.modalities,PatientID:e.mrn,PatientName:e.patientName,StudyInstanceUID:e.studyInstanceUid,StudyTime:e.time}))).map((e=>({studyInstanceUid:e.StudyInstanceUID,date:ye(e.StudyDate),description:e.StudyDescription,modalities:e.ModalitiesInStudy,numInstances:e.NumInstances})));h((e=>{const t=[...e];for(const a of s)e.find((e=>e.studyInstanceUid===a.studyInstanceUid))||t.push(a);return t}))}(e)))}),[u,r,n,l]),(0,Y.useEffect)((()=>{i.activeDisplaySets.forEach((async e=>{const t={},n=i.getDisplaySetByUID(e.displaySetInstanceUID),s=r.getImageIdsForDisplaySet(n),o=s[Math.floor(s.length/2)];o&&!n?.unsupported&&(t[e.displaySetInstanceUID]=await a(o),b((e=>({...e,...t}))))}))}),[u,r,i,a]),(0,Y.useEffect)((()=>{const e=ve(i.activeDisplaySets,w);Ie(e),D(e)}),[u,w,i]),(0,Y.useEffect)((()=>{const e=i.subscribe(i.EVENTS.DISPLAY_SETS_ADDED,(e=>{const{displaySetsAdded:t,options:n}=e;t.forEach((async e=>{const t={},n=i.getDisplaySetByUID(e.displaySetInstanceUID);if(n?.unsupported)return;const s=r.getImageIdsForDisplaySet(n),o=s[Math.floor(s.length/2)];o&&(t[e.displaySetInstanceUID]=await a(o,e.initialViewport),b((e=>({...e,...t}))))}))}));return()=>{e.unsubscribe()}}),[a,r,i]),(0,Y.useEffect)((()=>{const e=i.subscribe(i.EVENTS.DISPLAY_SETS_CHANGED,(e=>{const t=ve(e,w);D(t)})),t=i.subscribe(i.EVENTS.DISPLAY_SET_SERIES_METADATA_INVALIDATED,(()=>{const e=ve(i.getActiveDisplaySets(),w);D(e)}));return()=>{e.unsubscribe(),t.unsubscribe()}}),[u,w,i]);const E=function(e,t,a){const n=[],s=[],r=[];t.forEach((t=>{const o=a.filter((e=>e.StudyInstanceUID===t.studyInstanceUid)),i=Object.assign({},t,{displaySets:o});e.includes(t.studyInstanceUid)?n.push(i):(s.push(i),r.push(i))}));const o=[{name:"primary",label:"Primary",studies:n},{name:"recent",label:"Recent",studies:s},{name:"all",label:"All",studies:r}];return o}(u,S,v);const M=m.get(d)?.displaySetInstanceUIDs;return Y.createElement(Q.eX,{tabs:E,servicesManager:t,activeTabName:g,onDoubleClickThumbnail:e=>{let t=[];const a=d;try{t=o.getViewportsRequireUpdate(a,e)}catch(e){console.warn(e),c.show({title:"Thumbnail Double Click",message:"The selected display sets could not be added to the viewport.",type:"info",duration:3e3})}p.setDisplaySetsForViewports(t)},activeDisplaySetInstanceUIDs:M,expandedStudyInstanceUIDs:I,onClickStudy:function(e){const t=I.includes(e),a=t?[...I.filter((t=>t!==e))]:[...I,e];if(y(a),!t){s(i,e,!0)}},onClickTab:e=>{f(e)}})}Se.propTypes={servicesManager:K().object.isRequired,dataSource:K().shape({getImageIdsForDisplaySet:K().func.isRequired}).isRequired,getImageSrc:K().func.isRequired,getStudiesForPatientByMRN:K().func.isRequired,requestDisplaySetCreationForStudy:K().func.isRequired};const he=Se;function ve(e,t){const a=[],n=[];return e.filter((e=>!e.excludeFromThumbnailBrowser)).forEach((e=>{const s=t[e.displaySetInstanceUID],r=function(e){if(De.includes(e.Modality)||e?.unsupported)return"thumbnailNoImage";return"thumbnail"}(e);("thumbnail"===r?a:n).push({displaySetInstanceUID:e.displaySetInstanceUID,description:e.SeriesDescription||"",seriesNumber:e.SeriesNumber,modality:e.Modality,seriesDate:e.SeriesDate,seriesTime:e.SeriesTime,numInstances:e.numImageFrames,countIcon:e.countIcon,StudyInstanceUID:e.StudyInstanceUID,messages:e.messages,componentType:r,imageSrc:s,dragData:{type:"displayset",displaySetInstanceUID:e.displaySetInstanceUID},isHydratedForDerivedDisplaySet:e.isHydrated})})),[...a,...n]}const De=["SR","SEG","SM","RTSTRUCT","RTPLAN","RTDOSE"];const we=function(e,t){return new Promise(((a,n)=>{const s=document.createElement("canvas");e.utilities.loadImageToCanvas({canvas:s,imageId:t}).then((e=>{a(s.toDataURL())})).catch(n)}))};const be=async function(e,t){return t&&t.length&&t[0].mrn?e.query.studies.search({patientId:t[0].mrn}):(console.log("No mrn found for",t),t)};const Ee=function(e,t,a,n){t.activeDisplaySets.some((e=>e.StudyInstanceUID===a))||e.retrieve.series.metadata({StudyInstanceUID:a,madeInClient:n})};function Me(e){let{commandsManager:t,extensionManager:a,servicesManager:n}=e;const s=a.getDataSources()[0],r=be.bind(null,s),o=function(e){const t=e.getModuleEntry("@ohif/extension-cornerstone.utilityModule.common");try{const{cornerstone:e}=t.exports.getCornerstoneLibraries();return we.bind(null,e)}catch(e){throw new Error("Required command not found")}}(a),i=Ee.bind(null,s);return Y.createElement(he,{servicesManager:n,dataSource:s,getImageSrc:o,getStudiesForPatientByMRN:r,requestDisplaySetCreationForStudy:i})}Me.propTypes={commandsManager:K().object.isRequired,extensionManager:K().object.isRequired,servicesManager:K().object.isRequired};const xe=Me;function Ue(e){let{onExportClick:t,onCreateReportClick:a}=e;const{t:n}=(0,ae.$G)("MeasurementTable");return Y.createElement(Y.Fragment,null,Y.createElement(Q.HO,{color:"black",size:"inherit"},Y.createElement(Q.mN,{className:"px-2 py-2 text-base",onClick:t},n("Export CSV")),Y.createElement(Q.mN,{className:"px-2 py-2 text-base",onClick:a},n("Create Report"))))}Ue.propTypes={onExportClick:K().func,onCreateReportClick:K().func},Ue.defaultProps={onExportClick:()=>alert("Export"),onCreateReportClick:()=>alert("Create Report")};const Re=Ue;var Ne=a(8324),Ce=a.n(Ne);const Pe={CANCEL:0,CREATE_REPORT:1};function Te(e,t){let{extensionManager:a}=t;return new Promise((function(t,n){let s;const r=Object.keys(a.dataSourceMap).filter((e=>{const t=a.dataSourceDefs[e]?.configuration;return t?.supportsStow??t?.wadoRoot})).map((e=>({value:e,label:e,placeHolder:e})));s=e.create({centralize:!0,isDraggable:!1,content:Q.Vq,useLastPosition:!1,showOverlay:!0,contentProps:{title:"Create Report",value:{label:"",dataSourceName:a.activeDataSource},noCloseButton:!0,onClose:()=>{e.dismiss({id:s}),t({action:Pe.CANCEL,value:void 0,dataSourceName:void 0})},actions:[{id:"cancel",text:"Cancel",type:Q.LZ.dt.secondary},{id:"save",text:"Save",type:Q.LZ.dt.primary}],onSubmit:a=>{let{action:n,value:r}=a;switch(e.dismiss({id:s}),n.id){case"save":t({action:Pe.CREATE_REPORT,value:r.label,dataSourceName:r.dataSourceName});break;case"cancel":t({action:Pe.CANCEL,value:void 0,dataSourceName:void 0})}},body:a=>{let{value:n,setValue:o}=a;return Y.createElement(Y.Fragment,null,r.length>1&&window.config?.allowMultiSelectExport&&Y.createElement("div",null,Y.createElement("label",{className:"text-[14px] leading-[1.2] text-white"},"Data Source"),Y.createElement(Q.Ph,{closeMenuOnSelect:!0,className:"border-primary-main mt-2 bg-black",options:r,placeholder:r.find((e=>e.value===n.dataSourceName)).placeHolder,value:n.dataSourceName,onChange:e=>{o((t=>({...t,dataSourceName:e.value})))},isClearable:!1})),Y.createElement("div",{className:"mt-3"},Y.createElement(Q.II,{autoFocus:!0,label:"Enter the report name",labelClassName:"text-white text-[14px] leading-[1.2]",className:"border-primary-main bg-black",type:"text",value:n.label,onChange:e=>{e.persist(),o((t=>({...t,label:e.target.value})))},onKeyPress:a=>{"Enter"===a.key&&(e.dismiss({id:s}),t({action:Pe.CREATE_REPORT,value:n.label}))},required:!0})))}}})}))}function Oe(){return Y.createElement("div",{className:"text-primary-active"},"Loading...")}const Ae=async function(e){let{servicesManager:t,getReport:a,reportType:n="measurement"}=e;const{displaySetService:s,uiNotificationService:r,uiDialogService:i}=t.services,c=i.create({showOverlay:!0,isDraggable:!1,centralize:!0,content:Oe});try{const e=await a();o.DicomMetadataStore.addInstances([e],!0);const t=s.getMostRecentDisplaySet().displaySetInstanceUID;return r.show({title:"Create Report",message:`${n} saved successfully`,type:"success"}),[t]}catch(e){r.show({title:"Create Report",message:e.message||`Failed to store ${n}`,type:"error"})}finally{i.dismiss({id:c})}},Le=4700;function ke(e,t){const a=t.getActiveDisplaySets().filter((e=>"SR"===e.Modality)).find((t=>t.SeriesDescription===e));if(a){console.log("Storing to same series",a);const{instance:e}=a,{SeriesInstanceUID:t,SeriesDescription:n,SeriesDate:s,SeriesTime:r,SeriesNumber:o,Modality:i}=e;return{SeriesInstanceUID:t,SeriesDescription:n,SeriesDate:s,SeriesTime:r,SeriesNumber:o,Modality:i,InstanceNumber:a.instances.length+1}}const n=function(e){const t=e.getActiveDisplaySets().filter((e=>"SR"===e.Modality)).map((e=>e.SeriesNumber));return Math.max(...t,Le)+1}(t);return{SeriesDescription:e,SeriesNumber:n}}const{downloadCSVReport:Fe}=o.utils;function Ve(e){let{servicesManager:t,commandsManager:a,extensionManager:n}=e;const[s,r]=(0,Q.O_)(),{activeViewportId:o,viewports:i}=s,{measurementService:c,uiDialogService:l,uiNotificationService:u,displaySetService:d}=t.services,[m,p]=(0,Y.useState)([]);(0,Y.useEffect)((()=>{const e=Ce()(p,100);p($e(c));const t=c.EVENTS.MEASUREMENT_ADDED,a=c.EVENTS.RAW_MEASUREMENT_ADDED,n=c.EVENTS.MEASUREMENT_UPDATED,s=c.EVENTS.MEASUREMENT_REMOVED,r=c.EVENTS.MEASUREMENTS_CLEARED,o=[];return[t,a,n,s,r].forEach((t=>{o.push(c.subscribe(t,(()=>{e($e(c))})).unsubscribe)})),()=>{o.forEach((e=>{e()})),e.cancel()}}),[]);const g=e=>{let{uid:t,isActive:a}=e;if(!a){const e=[...m],a=e.find((e=>e.uid===t));e.forEach((e=>e.isActive=e.uid===t)),a.isActive=!0,p(e)}};return Y.createElement(Y.Fragment,null,Y.createElement("div",{className:"ohif-scrollbar overflow-y-auto overflow-x-hidden","data-cy":"measurements-panel"},Y.createElement(Q.wt,{title:"Measurements",servicesManager:t,data:m,onClick:e=>{let{uid:t,isActive:a}=e;c.jumpToMeasurement(s.activeViewportId,t),g({uid:t,isActive:a})},onEdit:e=>{let{uid:t,isActive:a}=e;const n=c.getMeasurement(t),s=e=>{let{action:a,value:s}=e;if("save"===a.id)c.update(t,{...n,...s},!0);l.dismiss({id:"enter-annotation"})};l.create({id:"enter-annotation",centralize:!0,isDraggable:!1,showOverlay:!0,content:Q.Vq,contentProps:{title:"Annotation",noCloseButton:!0,value:{label:n.label||""},body:e=>{let{value:t,setValue:a}=e;return Y.createElement(Q.II,{label:"Enter your annotation",labelClassName:"text-white text-[14px] leading-[1.2]",autoFocus:!0,id:"annotation",className:"border-primary-main bg-black",type:"text",value:t.label,onChange:e=>{e.persist(),a((t=>({...t,label:e.target.value})))},onKeyPress:e=>{"Enter"===e.key&&s({value:t,action:{id:"save"}})}})},actions:[{id:"cancel",text:"Cancel",type:Q.LZ.dt.secondary},{id:"save",text:"Save",type:Q.LZ.dt.primary}],onSubmit:s}})}})),Y.createElement("div",{className:"flex justify-center p-4"},Y.createElement(Re,{onExportClick:async function(){const e=c.getMeasurements();Fe(e,c)},onClearMeasurementsClick:async function(){c.clearMeasurements()},onCreateReportClick:async function(){const e=i.get(o),s=c.getMeasurements(),r=d.getDisplaySetByUID(e.displaySetInstanceUIDs[0]),m=s.filter((e=>r.StudyInstanceUID===e.referenceStudyUID));if(m.length<=0)return void u.show({title:"No Measurements",message:"No Measurements are added to the current Study.",type:"info",duration:3e3});const p=await Te(l,{extensionManager:n});if(p.action===Pe.CREATE_REPORT){const e=n.getDataSources(p.dataSourceName)[0],s=ke(void 0===p.value||""===p.value?"Research Derived Series":p.value,d);return Ae({servicesManager:t,getReport:async()=>a.runCommand("storeMeasurements",{measurementData:m,dataSource:e,additionalFindingTypes:["ArrowAnnotate"],options:s},"CORNERSTONE_STRUCTURED_REPORT")})}}})))}function $e(e){return e.getMeasurements().map(((t,a)=>function(e,t,a){const{displayText:n,uid:s,label:r,type:o,selected:i,findingSites:c,finding:l}=e,u=c?.[0],d=r||l?.text||u?.text||"(empty)";let m=n||[];if(c){const e=[];c.forEach((t=>{t?.text!==d&&e.push(t.text)})),m=[...e,...m]}l&&l?.text!==d&&(m=[l.text,...m]);return{uid:s,label:d,baseLabel:r,measurementType:o,displayText:m,baseDisplayText:n,isActive:i,finding:l,findingSites:c}}(t,0,e.VALUE_TYPES)))}Ve.propTypes={servicesManager:K().instanceOf(o.Xw).isRequired};const qe=function(e){let{commandsManager:t,extensionManager:a,servicesManager:n}=e;return[{name:"seriesList",iconName:"tab-studies",iconLabel:"Studies",label:"Studies",component:xe.bind(null,{commandsManager:t,extensionManager:a,servicesManager:n})},{name:"measure",iconName:"tab-linear",iconLabel:"Measure",label:"Measurements",secondaryLabel:"Measurements",component:()=>Y.createElement(Ve,{commandsManager:t,servicesManager:n,extensionManager:a})}]};var _e=a(11835),je=a(24369),Be=a(13950),Ze=a(89359);const He=JSON.parse('{"u2":"@ohif/extension-default"}').u2;var Ge=a(87425);var ze=a(94972);var We=a(45451);function Xe(e,t,a,n){const s=We.R3.scaleAndAdd(We.R3.create(),e,a,n);return We.R3.distance(t,s)>n}function Ye(e){if(!e?.length)return!1;const t=(0,ze.Z)(e[0].ImageOrientationPatient);if(!t)return!1;const a=function(e){const t=We.R3.fromValues(e[0],e[1],e[2]),a=We.R3.fromValues(e[3],e[4],e[5]);return We.R3.cross(We.R3.create(),t,a)}(t),n=(0,ze.Z)(e[0].ImagePositionPatient),s=(0,ze.Z)(e[e.length-1].ImagePositionPatient),r=(0,Ze.Xn)(n,s)/(e.length-1);let o=n;for(let t=1;t2&&(function(e){if(!e?.length)return!1;const t=e[0],a=(0,ze.Z)(t.Rows),n=(0,ze.Z)(t.Columns);for(let t=1;t1)break}r=c}}(e,t))}function Ke(e,t){const a=new o.iK;if(!e.length)return void a.addMessage(o.Lt.CODES.NO_VALID_INSTANCES);const n=e[0],{Modality:s,ImageType:r,NumberOfFrames:i}=n;if(r?.includes("LOCALIZER"))return a;if(!Ze.M6.includes(s))return a;const c=i>1;c||e.every((e=>e.ImagePositionPatient))||a.addMessage(o.Lt.CODES.NO_POSITION_INFORMATION);const l=(0,Ge.Z)(e);return c?function(e,t){(0,Ze.hu)(e)||t.addMessage(o.Lt.CODES.MULTIFRAME_NO_PIXEL_MEASUREMENTS),(0,Ze.sb)(e)||t.addMessage(o.Lt.CODES.MULTIFRAME_NO_ORIENTATION),(0,Ze.kN)(e)||t.addMessage(o.Lt.CODES.MULTIFRAME_NO_POSITION_INFORMATION)}(l[0],a):Je(l,a),t||a.addMessage(o.Lt.CODES.NOT_RECONSTRUCTABLE),a}function Qe(e){const t=new Be.Z(e),a=new o.iK;a.addMessage(o.Lt.CODES.UNSUPPORTED_DISPLAYSET);const n=e[0];return t.setAttributes({displaySetInstanceUID:t.uid,SeriesDate:n.SeriesDate,SeriesTime:n.SeriesTime,SeriesInstanceUID:n.SeriesInstanceUID,StudyInstanceUID:n.StudyInstanceUID,SeriesNumber:n.SeriesNumber||0,FrameRate:n.FrameTime,SOPClassUID:n.SOPClassUID,SeriesDescription:n.SeriesDescription||"",Modality:n.Modality,numImageFrames:e.length,unsupported:!0,SOPClassHandlerId:"unsupported",isReconstructable:!1,messages:a}),[t]}const et="stack",tt=e=>e.NumberOfFrames>1,at=e=>{const t=e[0],a=new Be.Z(e),{value:n,averageSpacingBetweenFrames:s}=(0,Ze.ZP)(e),r=Ke(e,n);a.setAttributes({displaySetInstanceUID:a.uid,SeriesDate:t.SeriesDate,SeriesTime:t.SeriesTime,SeriesInstanceUID:t.SeriesInstanceUID,StudyInstanceUID:t.StudyInstanceUID,SeriesNumber:t.SeriesNumber||0,FrameRate:t.FrameTime,SOPClassUID:t.SOPClassUID,SeriesDescription:t.SeriesDescription||"",Modality:t.Modality,isMultiFrame:tt(t),countIcon:n?"icon-mpr":void 0,numImageFrames:e.length,SOPClassHandlerId:`${He}.sopClassHandlerModule.${et}`,isReconstructable:n,messages:r,averageSpacingBetweenFrames:s||null});return a.sortBy(((e,t)=>(parseInt(e.InstanceNumber)||0)-(parseInt(t.InstanceNumber)||0))),a},nt=e=>"CR"===e||"MG"===e||"DX"===e;function st(e){if(!e||!e.length)throw new Error("No instances were provided");const t=[],a=function(e){const t=new Set;return e.forEach((e=>{t.add(e.SOPClassUID)})),Array.from(t)}(e),n=[];if(e.forEach((e=>{if(!(0,_e.O)(e.SOPClassUID)&&!e.Rows)return;let s;tt(e)?(s=at([e]),s.setAttributes({sopClassUids:a,isClip:!0,numImageFrames:e.NumberOfFrames,instanceNumber:e.InstanceNumber,acquisitionDatetime:e.AcquisitionDateTime}),t.push(s)):nt(e.Modality)?(s=at([e]),s.setAttributes({sopClassUids:a,instanceNumber:e.InstanceNumber,acquisitionDatetime:e.AcquisitionDateTime}),t.push(s)):n.push(e)})),n.length){const s=at(n);s.setAttribute("studyInstanceUid",e[0].StudyInstanceUID),s.setAttributes({sopClassUids:a}),t.push(s)}return t}const rt=[je.Z.ComputedRadiographyImageStorage,je.Z.DigitalXRayImageStorageForPresentation,je.Z.DigitalXRayImageStorageForProcessing,je.Z.DigitalMammographyXRayImageStorageForPresentation,je.Z.DigitalMammographyXRayImageStorageForProcessing,je.Z.DigitalIntraOralXRayImageStorageForPresentation,je.Z.DigitalIntraOralXRayImageStorageForProcessing,je.Z.CTImageStorage,je.Z.EnhancedCTImageStorage,je.Z.LegacyConvertedEnhancedCTImageStorage,je.Z.UltrasoundMultiframeImageStorage,je.Z.MRImageStorage,je.Z.EnhancedMRImageStorage,je.Z.EnhancedMRColorImageStorage,je.Z.LegacyConvertedEnhancedMRImageStorage,je.Z.UltrasoundImageStorage,je.Z.UltrasoundImageStorageRET,je.Z.SecondaryCaptureImageStorage,je.Z.MultiframeSingleBitSecondaryCaptureImageStorage,je.Z.MultiframeGrayscaleByteSecondaryCaptureImageStorage,je.Z.MultiframeGrayscaleWordSecondaryCaptureImageStorage,je.Z.MultiframeTrueColorSecondaryCaptureImageStorage,je.Z.XRayAngiographicImageStorage,je.Z.EnhancedXAImageStorage,je.Z.XRayRadiofluoroscopicImageStorage,je.Z.EnhancedXRFImageStorage,je.Z.XRay3DAngiographicImageStorage,je.Z.XRay3DCraniofacialImageStorage,je.Z.BreastTomosynthesisImageStorage,je.Z.BreastProjectionXRayImageStorageForPresentation,je.Z.BreastProjectionXRayImageStorageForProcessing,je.Z.IntravascularOpticalCoherenceTomographyImageStorageForPresentation,je.Z.IntravascularOpticalCoherenceTomographyImageStorageForProcessing,je.Z.NuclearMedicineImageStorage,je.Z.VLEndoscopicImageStorage,je.Z.VideoEndoscopicImageStorage,je.Z.VLMicroscopicImageStorage,je.Z.VideoMicroscopicImageStorage,je.Z.VLSlideCoordinatesMicroscopicImageStorage,je.Z.VLPhotographicImageStorage,je.Z.VideoPhotographicImageStorage,je.Z.OphthalmicPhotography8BitImageStorage,je.Z.OphthalmicPhotography16BitImageStorage,je.Z.OphthalmicTomographyImageStorage,je.Z.VLWholeSlideMicroscopyImageStorage,je.Z.PositronEmissionTomographyImageStorage,je.Z.EnhancedPETImageStorage,je.Z.LegacyConvertedEnhancedPETImageStorage,je.Z.RTImageStorage,je.Z.EnhancedUSVolumeStorage];const ot=function(){return[{name:et,sopClassUids:rt,getDisplaySetsFromSeries:st},{name:"not-supported-display-sets-handler",sopClassUids:[],getDisplaySetsFromSeries:Qe}]};function it(){return Y.createElement("span",{className:"border-common-dark mx-2 h-8 w-4 self-center border-l"})}function ct(){return ct=Object.assign?Object.assign.bind():function(e){for(var t=1;t{o&&i(!1)};(0,Y.useEffect)((()=>(window.addEventListener("click",c),()=>{window.removeEventListener("click",c)})),[o]);const l=o?Q.OF:null;return Y.createElement(Q.hA,{id:"Layout",label:"Grid Layout",icon:"tool-layout",onInteraction:()=>i(!o),className:n,rounded:r.rounded,dropdownContent:null!==l&&Y.createElement(l,{rows:t,columns:a,onSelection:s}),isActive:o,type:"toggle"})}lt.propTypes={rows:K().number,columns:K().number,onLayoutChange:K().func,servicesManager:K().instanceOf(o.Xw)},lt.defaultProps={rows:3,columns:3,onLayoutChange:()=>{}};const ut=function(e){let{servicesManager:t,...a}=e;const{toolbarService:n}=t.services,s=(0,Y.useCallback)((e=>{n.recordInteraction({interactionType:"action",commands:[{commandName:"setViewportGridLayout",commandOptions:{...e},context:"DEFAULT"}]})}),[n]);return Y.createElement(lt,ct({},a,{onSelection:s}))};function dt(){return dt=Object.assign?Object.assign.bind():function(e){for(var t=1;t{const{id:r,type:i,commands:l}=e;c({groupId:n,itemId:r,interactionType:i,commands:l}),I((n=>({...n,primary:!a&&t?{...e,index:s}:n.primary,isExpanded:!1,items:m(o).filter((e=>!(t&&!a)||e.index!==s))})))},m=e=>e.map(((e,t)=>({...e,index:t,onClick:()=>d(e,t)}))),[p,g]=(0,Y.useState)({primaryToolId:"",toggles:{},groups:{}}),[f,I]=(0,Y.useState)({primary:s,items:m(o).filter((e=>!(t&&!a)||e.id!==s.id))}),{primaryToolId:y,toggles:S}=p,h="toggle"===f.primary.type,v="tool"===f.primary.type&&y===f.primary.id||h&&!0===S[f.primary.id],D=u?.getButtonComponentForUIType(f.primary.uiType)??Q.hA;(0,Y.useEffect)((()=>{const{unsubscribe:e}=u.subscribe(u.EVENTS.TOOL_BAR_STATE_MODIFIED,(e=>{g({...e})}));return()=>{e()}}),[u]);const w=f.items.map((e=>{const t="tool"===e.type&&y===e.id;return{...e,isActive:t}})),b=i||(e=>{let{type:t,icon:a,label:n,t:s,id:r}=e;const o="toggle"===t&&!0===S[r];return Y.createElement("div",{className:oe()("hover:bg-primary-dark flex h-8 w-full flex-row items-center p-3","whitespace-pre text-base",o&&"bg-primary-dark",o?"text-[#348CFD]":"text-common-bright hover:bg-primary-dark hover:text-primary-light")},a&&Y.createElement("span",{className:"mr-4"},Y.createElement(Q.JO,{name:a,className:"h-5 w-5"})),Y.createElement("span",{className:"mr-5"},s(n)))});return Y.createElement(Q.aW,{isRadio:t,isAction:a,primary:f.primary,secondary:r,items:w,groupId:n,renderer:b,isActive:v||w.some((e=>e.isActive)),isToggle:h,onInteraction:c,Component:e=>Y.createElement(D,dt({},e,{servicesManager:l}))})}mt.propTypes={isRadio:K().bool,isAction:K().bool,groupId:K().string,primary:K().shape({id:K().string.isRequired,type:K().oneOf(["tool","action","toggle"]).isRequired,uiType:K().string}),secondary:K().shape({id:K().string,icon:K().string.isRequired,label:K().string,tooltip:K().string.isRequired,isActive:K().bool}),items:K().arrayOf(K().shape({id:K().string.isRequired,type:K().oneOf(["tool","action","toggle"]).isRequired,icon:K().string,label:K().string,tooltip:K().string})),renderer:K().func,onInteraction:K().func.isRequired,servicesManager:K().shape({services:K().shape({toolbarService:K().object})})},mt.defaultProps={isRadio:!1,isAction:!1};const pt=mt;function gt(){return gt=Object.assign?Object.assign.bind():function(e){for(var t=1;t{const{unsubscribe:e}=i.subscribe(i.EVENTS.TOOL_BAR_STATE_MODIFIED,(e=>{l({...e})}));return()=>{e()}}),[i]),Y.createElement(Q.hA,gt({commands:n,id:t,type:a,isActive:d,onInteraction:s},o))}ft.propTypes={id:K().string.isRequired,type:K().oneOf(["tool","action","toggle"]).isRequired,commands:K().arrayOf(K().shape({commandName:K().string.isRequired,context:K().string})),onInteraction:K().func.isRequired,servicesManager:K().shape({services:K().shape({toolbarService:K().shape({subscribe:K().func.isRequired,state:K().shape({primaryToolId:K().string,toggles:K().objectOf(K().bool),groups:K().objectOf(K().object)}).isRequired}).isRequired}).isRequired}).isRequired};const It=ft;function yt(e,t,a,n){const s={selectorProps:e,event:t},r=function(e,t,a){const{subMenu:n}=t,s=function*(){yield function(e,t){if(t)return e.find((e=>e.id===t))}(e,a||n),yield function(e,t){return e?e.find((e=>!e.selector||e.selector(t.selectorProps))):null}(e,t)}();let r=s.next(),o=r.value;for(;!r.done;)o=r.value,o&&s.return(),r=s.next();return console.log("Menu chosen",o?.id||"NONE"),o}(a,s,n);if(!r)return;if(!r.items)return console.warn("Must define items in menu",r),[];let o=[];return r.items.forEach((n=>{const{delegating:r,selector:i,subMenu:c}=n;if(!i||i(e))if(r)o=[...o,...yt(e,t,a,c)];else{const e=function(e,t){const a={...e,value:t.selectorProps?.value};"ShowSubMenu"!==e.actionType||a.iconRight||(a.iconRight="chevron-menu");e.action||(a.action=(e,n)=>{const{event:s={}}=n,{detail:r={}}=s;a.element=r.element,n.onClose();const o=n[`on${e.actionType||"Default"}`];o?o.call(n,a,e,t):console.warn("No action defined for",e)});return a}(n,s);o.push(e)}})),o}var St=a(5638);class ht{constructor(e,t){this.commandsManager=void 0,this.services=void 0,this.menuItems=void 0,this.services=e.services,this.commandsManager=t}closeContextMenu(){this.services.uiDialogService.dismiss({id:"context-menu"})}showContextMenu(e,t,a){if(!this.services.uiDialogService)return void console.warn("Unable to show dialog; no UI Dialog Service available.");const{event:n,subMenu:s,menuId:r,menus:o,selectorProps:i}=e;console.log("Getting items from",o);const c=yt(i||e,n,o,r);this.services.uiDialogService.dismiss({id:"context-menu"}),this.services.uiDialogService.create({id:"context-menu",isDraggable:!1,preservePosition:!1,preventCutOf:!0,defaultPosition:ht._getDefaultPosition(a,n?.detail,t),event:n,content:St.Z,onClickOutside:()=>this.services.uiDialogService.dismiss({id:"context-menu"}),contentProps:{items:c,selectorProps:i,menus:o,event:n,subMenu:s,eventData:n?.detail,onClose:()=>{this.services.uiDialogService.dismiss({id:"context-menu"})},onShowSubMenu:(n,s,r)=>{s.subMenu?this.showContextMenu({...e,menuId:s.subMenu},t,a):console.warn("No submenu defined for",n,s,r)},onDefault:(e,t,a)=>{this.commandsManager.run(e,{...i,...t,subProps:a})}}})}}ht.getDefaultPosition=()=>({x:0,y:0}),ht._getEventDefaultPosition=e=>({x:e&&e.currentPoints.client[0],y:e&&e.currentPoints.client[1]}),ht._getElementDefaultPosition=e=>{if(e){const t=e.getBoundingClientRect();return{x:t.x,y:t.y}}return{x:void 0,y:void 0}},ht._getCanvasPointsPosition=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1?arguments[1]:void 0;const a=ht._getElementDefaultPosition(t);for(let t=0;te&&"number"==typeof e.x&&"number"==typeof e.y,ht._getDefaultPosition=(e,t,a)=>{const n=function*(){yield ht._getCanvasPointsPosition(e,a),yield ht._getEventDefaultPosition(t),yield ht._getElementDefaultPosition(a),yield ht.getDefaultPosition()}();let s=n.next(),r=s.value;for(;!s.done;)r=s.value,ht._isValidPosition(r)&&n.return(),s=n.next();return r};const vt={id:"measurementsContextMenu",customizationType:"ohif.contextMenu",menus:[{id:"forExistingMeasurement",selector:e=>{let{nearbyToolData:t}=e;return!!t},items:[{label:"Delete measurement",commands:[{commandName:"deleteMeasurement"}]},{label:"Add Label",commands:[{commandName:"setMeasurementLabel"}]}]}]};var Dt=a(71271),wt=a.n(Dt),bt=a(94614);const Et={padding:"10px 0"},Mt={borderBottomWidth:"1px",...Et};function xt(e){let{tagRef:t,vrRef:a,keywordRef:n,valueRef:s}=e;return Y.createElement("div",{className:oe()("bg-secondary-dark ohif-scrollbar flex w-full flex-row overflow-y-scroll"),style:Et},Y.createElement("div",{className:"w-4/24 px-3"},Y.createElement("label",{ref:t,className:"flex flex-1 select-none flex-col pl-1 text-lg text-white"},Y.createElement("span",{className:"flex flex-row items-center focus:outline-none"},"Tag"))),Y.createElement("div",{className:"w-2/24 px-3"},Y.createElement("label",{ref:a,className:"flex flex-1 select-none flex-col pl-1 text-lg text-white"},Y.createElement("span",{className:"flex flex-row items-center focus:outline-none"},"VR"))),Y.createElement("div",{className:"w-6/24 px-3"},Y.createElement("label",{ref:n,className:"flex flex-1 select-none flex-col pl-1 text-lg text-white"},Y.createElement("span",{className:"flex flex-row items-center focus:outline-none"},"Keyword"))),Y.createElement("div",{className:"w-5/24 grow px-3"},Y.createElement("label",{ref:s,className:"flex flex-1 select-none flex-col pl-1 text-lg text-white"},Y.createElement("span",{className:"flex flex-row items-center focus:outline-none"},"Value"))))}const Ut=function(e){let{rows:t}=e;const a=(0,Y.useRef)(),n=(0,Y.useRef)(),[s,r]=(0,Y.useState)(null),[o,i]=(0,Y.useState)(null),[c,l]=(0,Y.useState)(null),[u,d]=(0,Y.useState)(null);(0,Y.useEffect)((()=>{a?.current&&(a.current.scrollTo(0),a.current.resetAfterIndex(0))}),[t]),(0,Y.useEffect)((()=>{const e=Ce()((()=>a.current.resetAfterIndex(0)),100);return window.addEventListener("resize",e),()=>{e.cancel(),window.removeEventListener("resize",e)}}),[]);const m=(0,Y.useCallback)((e=>{let{index:a,style:n}=e;const s=t[a];return Y.createElement("div",{style:{...n,...Mt},className:oe()("hover:bg-secondary-main border-secondary-light flex w-full flex-row items-center break-all bg-black text-base transition duration-300","leading-[20px]"),key:`DICOMTagRow-${a}`},Y.createElement("div",{className:"w-4/24 px-3"},s[0]),Y.createElement("div",{className:"w-2/24 px-3"},s[1]),Y.createElement("div",{className:"w-6/24 px-3"},s[2]),Y.createElement("div",{className:"w-5/24 grow px-3"},s[3]))}),[t]),p=(0,Y.useCallback)((()=>null!==s),[s]),g=(0,Y.useCallback)((e=>{const a=[s.offsetWidth,o.offsetWidth,c.offsetWidth,u.offsetWidth],r=n.current.getContext("2d");return r.font=getComputedStyle(n.current).font,t[e].map(((e,t)=>{const n=r.measureText(e).width;return 20*Math.ceil(n/a[t])+20+1})).reduce(((e,t)=>Math.max(e,t)))}),[t,c,s,u,o]);return Y.createElement("div",null,Y.createElement("canvas",{style:{visibility:"hidden",position:"absolute"},className:"text-base",ref:n}),Y.createElement(xt,{tagRef:e=>{e&&r(e)},vrRef:e=>{e&&i(e)},keywordRef:e=>{e&&l(e)},valueRef:e=>{e&&d(e)}}),Y.createElement("div",{className:"relative m-auto border-2 border-black bg-black",style:{height:"32rem"}},p()&&Y.createElement(bt.S_,{ref:a,height:500,itemCount:t.length,itemSize:g,width:"100%",className:"ohif-scrollbar"},m)))},{ImageSet:Rt}=o.classes,{DicomMetaDictionary:Nt}=f.default.data,{nameMap:Ct}=Nt;function Pt(e,t){const a=[];return e.forEach((e=>{if("SQ"===e.vr){a.push([`${e.tagIndent}${e.tag}`,e.vr,e.keyword,""]);const{values:n}=e;n.forEach(((e,n)=>{const s=Pt(e,t);a.push([`${e[0].tagIndent}(FFFE,E000)`,"",`Item #${n}`,""]),a.push(...s)}))}else{if("xs"===e.vr)try{const a=f.default.data.Tag.fromPString(e.tag).toCleanString(),n=t[a];e.vr=n.vr}catch(t){console.error(`Failed to parse value representation for tag '${e.keyword}'`)}a.push([`${e.tagIndent}${e.tag}`,e.vr,e.keyword,e.value])}})),a}function Tt(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;const a=Object.keys(e);let n="";for(let e=0;e";t>0&&(n+=" ");const s=[];for(let o=0;o{const n=Tt(e,t+1);n.length&&(Ot(n),a.values.push(n))}))}else if(Array.isArray(l)&&l.length>0&&"object"!=typeof l[0]&&(l=l.join("\\")),"number"==typeof l&&(l=l.toString()),"string"!=typeof l&&(null===l?l=" ":"object"==typeof l?l.InlineBinary?l="Inline Binary":l.BulkDataURI?l="Bulk Data URI":l.Alphabetic?l=l.Alphabetic:(console.warn(`Unrecognised Value: ${l} for ${i}:`),console.warn(l),l=" "):(console.warn(`Unrecognised Value: ${l} for ${i}:`),l=" ")),i=i.replace("RETIRED_",""),c)s.push({tag:c.tag,tagIndent:n,vr:c.vr,keyword:i,value:l});else{const e=/[0-9A-Fa-f]{6}/g;if(i.match(e)){const e=`(${i.substring(0,4)},${i.substring(4,8)})`;s.push({tag:e,tagIndent:n,vr:"",keyword:"Private Tag",value:l})}}}var r;return s}function Ot(e){e.sort(((e,t)=>e.tag{let{displaySets:t,displaySetInstanceUID:a}=e;const n=new Set([1]),[s,r]=(0,Y.useState)(a),[o,i]=(0,Y.useState)(1),[c,l]=(0,Y.useState)(""),u=t.find((e=>e.displaySetInstanceUID===s)),d=u instanceof Rt;const m=d&&u.images.length>1,p=(0,Y.useMemo)((()=>(t.sort(((e,t)=>e.SeriesNumber-t.SeriesNumber)),t.map((e=>{const{displaySetInstanceUID:t,SeriesDate:a,SeriesTime:n,SeriesNumber:s,SeriesDescription:r,Modality:o}=e,i=`${a}:${n}`.split(".")[0];return{value:t,label:`${s} (${o}): ${r}`,description:wt()(i,"YYYYMMDD:HHmmss").format("ddd, MMM Do YYYY")}})))),[t]),g=(0,Y.useMemo)((()=>{let e;e=d?u.images[o-1]:u.instance||u;const t=function(e){const t=Tt(e);return Ot(t),t}(e);return Pt(t,e)}),[o,s]),f=(0,Y.useMemo)((()=>{if(!c)return g;const e=c.toLowerCase();return g.filter((t=>t.reduce(((t,a,s)=>t||(n.has(s)?t:t||a.toLowerCase().includes(e))),!1)))}),[g,c]),I=(0,Y.useMemo)((()=>Ce()(l,200)),[]);return(0,Y.useEffect)((()=>()=>{I?.cancel()}),[]),Y.createElement("div",{className:"dicom-tag-browser-content"},Y.createElement("div",{className:"mb-6 flex flex-row items-center pl-1"},Y.createElement("div",{className:"flex w-1/2 flex-row items-center"},Y.createElement(Q.ZT,{variant:"subtitle",className:"mr-4"},"Series"),Y.createElement("div",{className:"mr-8 grow"},Y.createElement(Q.Ph,{id:"display-set-selector",isClearable:!1,onChange:e=>{r(e.value),i(1)},options:p,value:p.find((e=>e.value===s)),className:"text-white"}))),Y.createElement("div",{className:"flex w-1/2 flex-row items-center"},m&&Y.createElement(Q.ZT,{variant:"subtitle",className:"mr-4"},"Instance Number"),m&&Y.createElement("div",{className:"grow"},Y.createElement(Q.OX,{value:o,key:s,onChange:e=>{i(parseInt(e))},minValue:1,maxValue:u.images.length,step:1,inputClassName:"w-full",labelPosition:"left",trackColor:"#3a3f99"})))),Y.createElement("div",{className:"h-1 w-full bg-black"}),Y.createElement("div",{className:"my-3 flex w-1/2 flex-row"},Y.createElement(Q.Xe,{className:"mr-8 block w-full",placeholder:"Search metadata...",onDebounceChange:l})),Y.createElement(Ut,{rows:f}))},Lt=(e,t,a)=>{const{activeViewportId:n}=e,{protocol:s}=t.getActiveProtocol(),r=t.getState(),{protocolId:o,stageIndex:i,activeStudyUID:c}=r,l=a.getState(),u={...l.viewportGridStore},d={...l.displaySetSelectorMap},m=s.stages[i],p=`${c}:${o}:${i}`,g=`${c}:${o}`,f={...l.hangingProtocolStageIndexMap},{rows:I,columns:y}=m.viewportStructure.properties,S=m.viewports.length!==e.viewports.size||e.layout.numRows!==I||e.layout.numCols!==y;return f[g]=r,p&&S&&(u[p]={...e}),e.viewports.forEach(((e,t)=>{const{displaySetOptions:a,displaySetInstanceUIDs:s}=e;if(a)for(let e=0;e{const r=t?.[n];if(r)return{...r};const{protocolId:o,stageIndex:i}=e.getState();s.inDisplay||(s.inDisplay=[...t.initialInDisplay]);const c=e.getMissingViewport(o,i,s);if(c){const e=c.displaySetsInfo.map((e=>e.displaySetInstanceUID));return s.inDisplay.push(...e),{displaySetInstanceUIDs:e,displaySetOptions:c.displaySetsInfo.map((e=>e.displaySetOptions)),viewportOptions:{...c.viewportOptions}}}return{}},Ft=(e,t,a)=>{let{numRows:n,numCols:s}=t;const{viewports:r}=e,o={...a.getState().viewportsByPosition},i=[];r.forEach((e=>{if(e.positionId){const t={...e,viewportOptions:{...e.viewportOptions}};o[e.positionId]=t}}));for(let e=0;ee&&("setHangingProtocol"===e.commandName||"toggleHangingProtocol"===e.commandName),_t=e=>{let{servicesManager:t,commandsManager:a}=e;const{customizationService:n,measurementService:s,hangingProtocolService:r,uiNotificationService:o,viewportGridService:i,displaySetService:c,stateSyncService:l,toolbarService:u}=t.services,d=new ht(t,a),m={showContextMenu:e=>{const{menuCustomizationId:t,element:a,event:s,selectorProps:o,defaultPointsPosition:i=[]}=e,c={...e};t&&Object.assign(c,n.get(t,vt));const{protocol:l,stage:u}=r.getActiveProtocol();c.selectorProps={event:s,protocol:l,stage:u,...o},d.showContextMenu(c,a,i)},closeContextMenu:()=>{d.closeContextMenu()},displayNotification:e=>{let{text:t,title:a,type:n}=e;o.show({title:a,message:t,type:n})},clearMeasurements:()=>{s.clear()},toggleHpTools:()=>{const{protocol:e,stageIndex:t,stage:a}=r.getActiveProtocol(),n=s=>{if(!s.id)return;const{commands:r,items:o}=s.props||s;o&&o.forEach(n);const i=r?.find?.(qt);if(!i)return;const{protocolId:c,stageIndex:l,stageId:d}=i.commandOptions,m=!(c&&c!==e.id||void 0!==l&&l!==t||d&&d!==a.id);u.setToggled(s.id,m)};Object.values(u.getButtons()).forEach(n)},setHangingProtocol:e=>{let{activeStudyUID:t="",protocolId:n,stageId:s,stageIndex:c,reset:d=!1}=e;const p=u.getActivePrimaryTool();try{const e=i.getState(),o=r.getState(),{protocol:g}=r.getActiveProtocol(),f=Lt(e,r,l),{hangingProtocolStageIndexMap:I,viewportGridStore:y,displaySetSelectorMap:S}=f;if(n){if(void 0===c&&void 0===s){const e=`${t||o.activeStudyUID}:${n}`;c=I[e]?.stageIndex}}else n=o.protocolId,void 0===s&&void 0===c&&(c=o.stageIndex);const h=c??r.getStageIndex(n,{stageId:s,stageIndex:c});t&&r.setActiveStudyUID(t);const v=`${r.getState().activeStudyUID}:${n}:${h||0}`,D=!d&&y[v];n!==o.protocolId||h!==o.stageIndex||t?(r.setProtocol(n,{displaySetSelectorMap:S,stageId:s,stageIndex:h,restoreProtocol:D}),D&&i.set(y[v])):r.setProtocol(n,{stageId:s,stageIndex:h}),delete S[`${t||o.activeStudyUID}:activeDisplaySet:0`],l.store(f);const{protocol:w}=r.getActiveProtocol();m.toggleHpTools();const b=u.getButton(p);if(b){let e=b.props?.interactionType;if(!e&&b.props?.items){const t=b.props.items[0];e=t.props?.interactionType||t.props?.type}e&&u.recordInteraction({interactionType:e,...b.props})}return n!==o.protocolId&&a.run(g.callbacks?.onProtocolExit),a.run(w.callbacks?.onProtocolEnter),!0}catch(e){return console.error(e),m.toggleHpTools(),o.show({title:"Apply Hanging Protocol",message:"The hanging protocol could not be applied.",type:"error",duration:3e3}),!1}},toggleHangingProtocol:e=>{let{protocolId:t,stageIndex:a}=e;const{protocol:n,stageIndex:s,activeStudy:o}=r.getActiveProtocol(),{toggleHangingProtocol:i}=l.getState(),c=`${o.StudyInstanceUID}:${t}:${0|a}`;if(n.id!==t||void 0!==a&&a!==s)return l.store({toggleHangingProtocol:{...i,[c]:{protocolId:n.id,stageIndex:s}}}),m.setHangingProtocol({protocolId:t,stageIndex:a,reset:!0});{const e=i[c]||{protocolId:"default"};return m.setHangingProtocol(e)}},deltaStage:e=>{let{direction:t}=e;const{protocolId:a,stageIndex:n}=r.getState(),{protocol:s}=r.getActiveProtocol();for(let e=n+t;e>=0&&e{let{numRows:t,numCols:n}=e;const{protocol:s}=r.getActiveProtocol(),o=s.callbacks?.onLayoutChange;if(!1===a.run(o,{numRows:t,numCols:n}))return void console.log("setViewportGridLayout running",o,t,n);window.setTimeout((()=>{const e=i.getState(),a=Ft(e,{numRows:t,numCols:n},l),s=kt.bind(null,r,a.viewportsByPosition);i.setLayout({numRows:t,numCols:n,findOrCreateViewport:s}),l.store(a)}),0)},toggleOneUp(){const e=i.getState(),{activeViewportId:t,viewports:a,layout:n}=e,{displaySetInstanceUIDs:s,displaySetOptions:o,viewportOptions:c}=a.get(t);if(1===n.numCols&&1===n.numRows){const{toggleOneUpViewportGridStore:e}=l.getState();if(!e.layout)return;const t=e.activeViewportId,a=s.length>1?[]:s.map((e=>r.getViewportsRequireUpdate(t,e))).flat(),n=(t,n)=>{const s=Array.from(e.viewports.values()).find((e=>e.positionId===n)),r=a.find((e=>e.viewportId===s.viewportId));return r?{viewportOptions:c,displaySetOptions:o,...r}:s},u=i.getLayoutOptionsFromState(e);i.setLayout({numRows:e.layout.numRows,numCols:e.layout.numCols,activeViewportId:t,layoutOptions:u,findOrCreateViewport:n})}else{l.store({toggleOneUpViewportGridStore:e});const t=()=>({displaySetInstanceUIDs:s,displaySetOptions:o,viewportOptions:c});i.setLayout({numRows:1,numCols:1,findOrCreateViewport:t});$t(i,(()=>{l.store({toggleOneUpViewportGridStore:{}})}))}},navigateHistory(e){Vt.m.navigate(e.to,e.options)},openDICOMTagViewer(){const{activeViewportId:e,viewports:a}=i.getState(),n=a.get(e),{displaySetInstanceUIDs:s}=n,r=c.activeDisplaySets,{UIModalService:o}=t.services,l=s[0];o.show({content:At,contentProps:{displaySets:r,displaySetInstanceUID:l,onClose:o.hide},title:"DICOM Tag Browser"})},toggleOverlays:()=>{const e=document.getElementsByClassName("viewport-overlay");for(let t=0;t{const{activeViewportId:e,viewports:t}=i.getState(),a=t.get(e).displaySetInstanceUIDs[0],n=document.querySelector("#ohif-thumbnail-list");if(!n)return;const s=n.getBoundingClientRect(),r=document.querySelector(`#thumbnail-${a}`);if(!r)return;const o=r.getBoundingClientRect();o.top>=s.top&&o.top<=s.bottom||r.scrollIntoView({behavior:"smooth"})},updateViewportDisplaySet:e=>{let{direction:t,excludeNonImageModalities:a}=e;const n=["SR","SEG","SM","RTSTRUCT","RTPLAN","RTDOSE"],s=r.getDisplaySetSortFunction(),l=[...c.activeDisplaySets];l.sort(s);const{activeViewportId:u,viewports:d}=i.getState(),{displaySetInstanceUIDs:p}=d.get(u);let g;for(g=l.findIndex((e=>p.includes(e.displaySetInstanceUID)))+t;g>-1&&g=l.length)return;const{displaySetInstanceUID:f}=l[g];let I=[];try{I=r.getViewportsRequireUpdate(u,f)}catch(e){console.warn(e),o.show({title:"Navigate Viewport Display Set",message:"The requested display sets could not be added to the viewport due to a mismatch in the Hanging Protocol rules.",type:"info",duration:3e3})}i.setDisplaySetsForViewports(I),setTimeout((()=>m.scrollActiveThumbnailIntoView()),0)}},p={showContextMenu:{commandFn:m.showContextMenu},closeContextMenu:{commandFn:m.closeContextMenu},clearMeasurements:{commandFn:m.clearMeasurements,storeContexts:[],options:{}},displayNotification:{commandFn:m.displayNotification,storeContexts:[],options:{}},setHangingProtocol:{commandFn:m.setHangingProtocol,storeContexts:[],options:{}},toggleHangingProtocol:{commandFn:m.toggleHangingProtocol,storeContexts:[],options:{}},navigateHistory:{commandFn:m.navigateHistory,storeContexts:[],options:{}},nextStage:{commandFn:m.deltaStage,storeContexts:[],options:{direction:1}},previousStage:{commandFn:m.deltaStage,storeContexts:[],options:{direction:-1}},setViewportGridLayout:{commandFn:m.setViewportGridLayout,storeContexts:[],options:{}},toggleOneUp:{commandFn:m.toggleOneUp,storeContexts:[],options:{}},openDICOMTagViewer:{commandFn:m.openDICOMTagViewer},updateViewportDisplaySet:{commandFn:m.updateViewportDisplaySet,storeContexts:[],options:{}}};return{actions:m,definitions:p,defaultContext:"DEFAULT"}},jt={id:"@ohif/mnGrid",description:"Has various hanging protocol grid layouts",name:"2x2",protocolMatchingRules:[{id:"OneOrMoreSeries",weight:25,attribute:"numberOfDisplaySetsWithImages",constraint:{greaterThan:0}}],toolGroupIds:["default"],displaySetSelectors:{defaultDisplaySetId:{seriesMatchingRules:[{attribute:"numImageFrames",constraint:{greaterThan:{value:0}},required:!0},{attribute:"isDisplaySetFromUrl",weight:10,constraint:{equals:!0}}]}},defaultViewport:{viewportOptions:{viewportType:"stack",toolGroupId:"default",allowUnmatchedView:!0},displaySets:[{id:"defaultDisplaySetId",matchedDisplaySetsIndex:-1}]},stages:[{id:"2x2",stageActivation:{enabled:{minViewportsMatched:4}},viewportStructure:{layoutType:"grid",properties:{rows:2,columns:2}},viewports:[{viewportOptions:{toolGroupId:"default",allowUnmatchedView:!0},displaySets:[{id:"defaultDisplaySetId"}]},{viewportOptions:{toolGroupId:"default",allowUnmatchedView:!0},displaySets:[{matchedDisplaySetsIndex:1,id:"defaultDisplaySetId"}]},{viewportOptions:{toolGroupId:"default",allowUnmatchedView:!0},displaySets:[{matchedDisplaySetsIndex:2,id:"defaultDisplaySetId"}]},{viewportOptions:{toolGroupId:"default",allowUnmatchedView:!0},displaySets:[{matchedDisplaySetsIndex:3,id:"defaultDisplaySetId"}]}]},{id:"3x1",requiredViewports:1,preferredViewports:3,stageActivation:{enabled:{minViewportsMatched:3}},viewportStructure:{layoutType:"grid",properties:{rows:1,columns:3}},viewports:[{viewportOptions:{toolGroupId:"default",allowUnmatchedView:!0},displaySets:[{id:"defaultDisplaySetId"}]},{viewportOptions:{toolGroupId:"default",allowUnmatchedView:!0},displaySets:[{id:"defaultDisplaySetId",matchedDisplaySetsIndex:1}]},{viewportOptions:{toolGroupId:"default",allowUnmatchedView:!0},displaySets:[{id:"defaultDisplaySetId",matchedDisplaySetsIndex:2}]}]},{id:"2x1",requiredViewports:1,preferredViewports:2,stageActivation:{enabled:{minViewportsMatched:2}},viewportStructure:{layoutType:"grid",properties:{rows:1,columns:2}},viewports:[{viewportOptions:{toolGroupId:"default",allowUnmatchedView:!0},displaySets:[{id:"defaultDisplaySetId"}]},{viewportOptions:{toolGroupId:"default",allowUnmatchedView:!0},displaySets:[{matchedDisplaySetsIndex:1,id:"defaultDisplaySetId"}]}]},{id:"1x1",requiredViewports:1,preferredViewports:1,stageActivation:{enabled:{minViewportsMatched:1}},viewportStructure:{layoutType:"grid",properties:{rows:1,columns:1}},viewports:[{viewportOptions:{toolGroupId:"default",allowUnmatchedView:!0},displaySets:[{id:"defaultDisplaySetId"}]}]}],numberOfPriorsReferenced:-1},Bt={id:"defaultDisplaySetId"},Zt={id:"priorDisplaySetId"},Ht={viewportOptions:{toolGroupId:"default",allowUnmatchedView:!0},displaySets:[Bt]},Gt={...Ht,displaySets:[{...Bt,matchedDisplaySetsIndex:1}]},zt={...Ht,displaySets:[Zt]},Wt={id:"@ohif/hpCompare",description:"Compare two studies in various layouts",name:"Compare Two Studies",numberOfPriorsReferenced:1,protocolMatchingRules:[{id:"Two Studies",weight:1e3,attribute:"StudyInstanceUID",from:"prior",required:!0,constraint:{notNull:!0}}],toolGroupIds:["default"],displaySetSelectors:{defaultDisplaySetId:{studyMatchingRules:[{attribute:"studyInstanceUIDsIndex",from:"options",required:!0,constraint:{equals:{value:0}}}],seriesMatchingRules:[{attribute:"numImageFrames",constraint:{greaterThan:{value:0}}},{attribute:"isDisplaySetFromUrl",weight:10,constraint:{equals:!0}}]},priorDisplaySetId:{studyMatchingRules:[{attribute:"studyInstanceUIDsIndex",from:"options",required:!0,constraint:{equals:{value:1}}}],seriesMatchingRules:[{attribute:"numImageFrames",constraint:{greaterThan:{value:0}}},{attribute:"isDisplaySetFromUrl",weight:10,constraint:{equals:!0}}]}},defaultViewport:{viewportOptions:{viewportType:"stack",toolGroupId:"default",allowUnmatchedView:!0},displaySets:[{id:"defaultDisplaySetId",matchedDisplaySetsIndex:-1}]},stages:[{name:"2x2",stageActivation:{enabled:{minViewportsMatched:4}},viewportStructure:{layoutType:"grid",properties:{rows:2,columns:2}},viewports:[Ht,zt,Gt,{...zt,displaySets:[{...Zt,matchedDisplaySetsIndex:1}]}]},{name:"2x1",stageActivation:{enabled:{minViewportsMatched:2}},viewportStructure:{layoutType:"grid",properties:{rows:1,columns:2}},viewports:[Ht,zt]}]},Xt={id:"default",locked:!0,name:"Default",createdDate:"2021-02-23T19:22:08.894Z",modifiedDate:"2023-04-01",availableTo:{},editableBy:{},protocolMatchingRules:[],toolGroupIds:["default"],numberOfPriorsReferenced:0,defaultViewport:{viewportOptions:{viewportType:"stack",toolGroupId:"default",allowUnmatchedView:!0},displaySets:[{id:"defaultDisplaySetId",matchedDisplaySetsIndex:-1}]},displaySetSelectors:{defaultDisplaySetId:{seriesMatchingRules:[{attribute:"numImageFrames",constraint:{greaterThan:{value:0}}},{attribute:"isDisplaySetFromUrl",weight:10,constraint:{equals:!0}}]}},stages:[{name:"default",viewportStructure:{layoutType:"grid",properties:{rows:1,columns:1}},viewports:[{viewportOptions:{viewportType:"stack",viewportId:"default",toolGroupId:"default",initialImageOptions:{custom:"sopInstanceLocation"}},displaySets:[{id:"defaultDisplaySetId"}]}],createdDate:"2021-02-23T18:32:42.850Z"}]};const Yt=function(){return[{name:Xt.id,protocol:Xt},{name:jt.id,protocol:jt},{name:Wt.id,protocol:Wt}]};const Jt=function(){const[e]=(0,ee.M)(),t=(0,te.s0)(),a=e.dataSources;return Y.createElement("div",{style:{width:"100%",height:"100%"}},Y.createElement("div",{className:"flex h-screen w-screen items-center justify-center "},Y.createElement("div",{className:"bg-secondary-dark mx-auto space-y-2 rounded-lg py-8 px-8 drop-shadow-md"},Y.createElement("img",{className:"mx-auto block h-14",src:"./ohif-logo.svg",alt:"OHIF"}),Y.createElement("div",{className:"space-y-2 pt-4 text-center"},a.filter((e=>"dicomjson"!==e.sourceName&&"dicomlocal"!==e.sourceName)).map((e=>Y.createElement("div",{key:e.sourceName},Y.createElement("h1",{className:"text-white"},e.configuration?.friendlyName||e.friendlyName),Y.createElement(Q.zx,{type:Q.LZ.dt.primary,className:oe()("ml-2"),onClick:()=>{t({pathname:"/",search:`datasources=${e.sourceName}`})}},e.sourceName),Y.createElement("br",null))))))))};const Kt=function(e){let{itemLabel:t,itemList:a,onItemClicked:n}=e;const{t:s}=(0,ae.$G)("DataSourceConfiguration"),[r,o]=(0,Y.useState)("");return(0,Y.useEffect)((()=>{o("")}),[a]),Y.createElement("div",{className:"flex min-h-[1px] grow flex-col gap-4"},Y.createElement("div",{className:"flex items-center justify-between"},Y.createElement("div",{className:"text-primary-light text-[20px]"},s(`Select ${t}`)),Y.createElement(Q.Xe,{className:"max-w-[40%] grow",value:r,onDebounceChange:o,placeholder:s(`Search ${t} list`)})),Y.createElement("div",{className:"relative flex min-h-[1px] grow flex-col bg-black text-[14px]"},null==a?Y.createElement(Q.LE,{className:"h-full w-full"}):0===a.length?Y.createElement("div",{className:"text-primary-light flex h-full flex-col items-center justify-center px-6 py-4"},Y.createElement(Q.JO,{name:"magnifier",className:"mb-4"}),Y.createElement("span",null,s(`No ${t} available`))):Y.createElement(Y.Fragment,null,Y.createElement("div",{className:"bg-secondary-dark px-3 py-1.5 text-white"},s(t)),Y.createElement("div",{className:"ohif-scrollbar overflow-auto"},a.filter((e=>!r||e.name.toLowerCase().includes(r.toLowerCase()))).map((e=>Y.createElement("div",{className:oe()("hover:text-primary-light hover:bg-primary-dark group mx-2 flex items-center justify-between px-6 py-2","rounded border-transparent border-b-secondary-light border-[1px] hover:border-primary-light"),key:e.id},Y.createElement("div",null,e.name),Y.createElement(Q.zx,{onClick:()=>n(e),className:"invisible group-hover:visible",endIcon:Y.createElement(Q.JO,{name:"arrow-left"})},s("Select")))))))))},Qt="text-ellipsis whitespace-nowrap overflow-hidden";const ea=function(e){let{configurationAPI:t,configuredItems:a,onHide:n}=e;const{t:s}=(0,ae.$G)("DataSourceConfiguration"),[r,o]=(0,Y.useState)(),[i,c]=(0,Y.useState)(a),[l,u]=(0,Y.useState)(),[d]=(0,Y.useState)(t.getItemLabels()),[m,p]=(0,Y.useState)(d.length===a.length),g=m?i.length-2:i.length-1;(0,Y.useEffect)((()=>{let e=!0;return u(null),o(null),0===i.length?t.initialize().then((t=>{e&&o(t)})).catch((e=>u(e.message))):m||i.length!==d.length?t.setCurrentItem(i[g]).then((t=>{e&&o(t)})).catch((e=>u(e.message))):(t.setCurrentItem(i[i.length-1]),n()),()=>{e=!1}}),[i,t,n,d,m,g]);const f=e=>ee===g+1?oe()("border-2","border-solid","border-primary-light"):ee<=i.length?"text-primary-light":"text-primary-active";return Y.createElement("div",{className:"flex h-[calc(100vh-300px)] select-none flex-col gap-4 pt-0.5"},Y.createElement("div",{className:"flex gap-4"},d.map(((e,t)=>{return Y.createElement("div",{key:e,className:oe()("flex min-w-[1px] shrink basis-[200px] flex-col gap-1 rounded-md p-3.5",(a=t,a!==d.length-1&&a{p(!1),c((e=>e.slice(0,t)))}:void 0},Y.createElement("div",{className:"text- flex items-center gap-2"},t{p(!1),c((t=>[...t.slice(0,g+1),e]))}}))};const ta=function(e){let{servicesManager:t,extensionManager:a}=e;const{t:n}=(0,ae.$G)("DataSourceConfiguration"),{show:s,hide:r}=(0,Q.dd)(),{customizationService:o}=t.services,[i,c]=(0,Y.useState)(),[l,u]=(0,Y.useState)();(0,Y.useEffect)((()=>{let e=!0;const t=async()=>{const t=a.getActiveDataSourceDefinition();if(!t.configuration.configurationAPI)return;const{factory:n}=o.get(t.configuration.configurationAPI)??{};if(!n)return;const s=n(t.sourceName);c(s),u(null),s.getConfiguredItems().then((t=>{e&&u(t)}))},n=a.subscribe(a.EVENTS.ACTIVE_DATA_SOURCE_CHANGED,t);return t(),()=>{e=!1,n.unsubscribe()}}),[]);const d=(0,Y.useCallback)((()=>{s({content:ea,title:n("Configure Data Source"),contentProps:{configurationAPI:i,configuredItems:l,onHide:r}})}),[i,l]);return(0,Y.useEffect)((()=>{i&&l&&l.length!==i.getItemLabels().length&&d()}),[i,l,d]),l?Y.createElement("div",{className:"text-aqua-pale flex items-center overflow-hidden"},Y.createElement(Q.JO,{name:"settings",className:"mr-2.5 h-3.5 w-3.5 shrink-0 cursor-pointer",onClick:d}),l.map(((e,t)=>Y.createElement("div",{key:t,className:"flex overflow-hidden"},Y.createElement("div",{key:t,className:"overflow-hidden text-ellipsis whitespace-nowrap"},e.name),t!==l.length-1&&Y.createElement("div",{className:"px-2.5"},"|"))))):Y.createElement(Y.Fragment,null)};var aa=function(e){return e[e.projects=0]="projects",e[e.locations=1]="locations",e[e.datasets=2]="datasets",e[e.dicomStores=3]="dicomStores",e}(aa||{});const na="https://cloudresourcemanager.googleapis.com/v1",sa="https://healthcare.googleapis.com/v1";class ra{constructor(e,t,a){this._extensionManager=void 0,this._fetchOptions=void 0,this._dataSourceName=void 0,this.getItemLabels=()=>["Project","Location","Data set","DICOM store"],this._dataSourceName=e,this._extensionManager=a;const n=t.services.userAuthenticationService;this._fetchOptions={method:"GET",headers:n.getAuthorizationHeader()}}async initialize(){const e=`${na}/projects`,t=await ra._doFetch(e,aa.projects,this._fetchOptions);if(!t?.length)return[];return t.map((e=>({id:e.projectId,name:e.name,itemType:aa.projects,url:`${sa}/projects/${e.projectId}`})))}async setCurrentItem(e){const t=e;if(t.itemType===aa.dicomStores){const e=`${t.url}/dicomWeb`,a=JSON.parse(JSON.stringify(this._extensionManager.getDataSourceDefinition(this._dataSourceName)));return a.configuration={...a.configuration,wadoUriRoot:e,qidoRoot:e,wadoRoot:e},this._extensionManager.updateDataSourceConfiguration(a.sourceName,a.configuration),[]}const a=t.itemType+1,n=`${aa[a]}`,s=`${t.url}/${n}`,r=await ra._doFetch(s,a,this._fetchOptions);if(!r?.length)return[];return r.map((e=>{const t=e.name.split("/");return{id:e.name,name:t[t.length-1],itemType:a,url:`${sa}/${e.name}`}}))}async getConfiguredItems(){const e=this._extensionManager.getDataSourceDefinition(this._dataSourceName).configuration.wadoUriRoot,t=e.indexOf("projects"),a=e.substring(t).split("/"),n=[];for(let e=0;e<4&&2*(e+1)2&&void 0!==arguments[2]?arguments[2]:{},n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};try{const s=new URL(e);s.search=new URLSearchParams(n).toString();const r=await fetch(s,a),o=await r.json();if(r.status>=200&&r.status<300&&null!=o){if(null!=o.nextPageToken){n.pageToken=o.nextPageToken;const s=await this._doFetch(e,t,a,n);o[aa[t]]=o[aa[t]].concat(s)}return o[aa[t]]?o[aa[t]]:o.name?[o]:[]}{const e=o?.error?.message||`Error returned from Google Cloud Healthcare: ${r.status} - ${r.statusText}`;throw new Error(e)}}catch(e){throw new Error(e?.message||"Error occurred during fetch request.")}}}var oa=a(15747);const ia=o.default.classes.MetadataProvider;const ca=o.classes.MetadataProvider;const la=e=>{let{SeriesInstanceUID:t,StudyInstanceUID:a}=e;const{instances:n}=o.DicomMetadataStore.getSeries(a,t);if("PT"!==n[0].Modality)return;const s=n.map((e=>e.imageId)),r=[];if(s.forEach((e=>{const t=function(e){const t=ia.get("instance",e);if(!t)throw new Error("dicom metadata are required");if(void 0===t.SeriesDate||void 0===t.SeriesTime||void 0===t.CorrectedImage||void 0===t.Units||!t.RadiopharmaceuticalInformationSequence||void 0===t.RadiopharmaceuticalInformationSequence[0].RadionuclideHalfLife||void 0===t.RadiopharmaceuticalInformationSequence[0].RadionuclideTotalDose||void 0===t.DecayCorrection||void 0===t.AcquisitionDate||void 0===t.AcquisitionTime||void 0===t.RadiopharmaceuticalInformationSequence[0].RadiopharmaceuticalStartDateTime&&void 0===t.RadiopharmaceuticalInformationSequence[0].RadiopharmaceuticalStartTime)throw new Error("required metadata are missing");void 0===t.PatientWeight&&console.warn("PatientWeight missing from PT instance metadata");const a={CorrectedImage:t.CorrectedImage,Units:t.Units,RadionuclideHalfLife:t.RadiopharmaceuticalInformationSequence[0].RadionuclideHalfLife,RadionuclideTotalDose:t.RadiopharmaceuticalInformationSequence[0].RadionuclideTotalDose,RadiopharmaceuticalStartDateTime:t.RadiopharmaceuticalInformationSequence[0].RadiopharmaceuticalStartDateTime,RadiopharmaceuticalStartTime:t.RadiopharmaceuticalInformationSequence[0].RadiopharmaceuticalStartTime,DecayCorrection:t.DecayCorrection,PatientWeight:t.PatientWeight,SeriesDate:t.SeriesDate,SeriesTime:t.SeriesTime,AcquisitionDate:t.AcquisitionDate,AcquisitionTime:t.AcquisitionTime};if(t[70531e3]||void 0!==t[70531e3]||t[70531009]||void 0!==t[70531009]){const e={SUVScaleFactor:t[70531e3],ActivityConcentrationScaleFactor:t[70531009]};a.PhilipsPETPrivateGroup=e}return t["0009100d"]&&void 0!==t["0009100d"]&&(a.GEPrivatePostInjectionDateTime=t["0009100d"]),t.FrameReferenceTime&&void 0!==t.FrameReferenceTime&&(a.FrameReferenceTime=t.FrameReferenceTime),t.ActualFrameDuration&&void 0!==t.ActualFrameDuration&&(a.ActualFrameDuration=t.ActualFrameDuration),t.PatientSex&&void 0!==t.PatientSex&&(a.PatientSex=t.PatientSex),t.PatientSize&&void 0!==t.PatientSize&&(a.PatientSize=t.PatientSize),a}(e);t&&r.push(t)})),!r.length)return;let i;try{i=(0,oa.d)(r)}catch(e){console.log(e)}i&&r.forEach(((e,t)=>{ca.addCustomMetadata(s[t],"scalingModule",i[t])}))},ua={id:He,preRegistration:function(e){let{servicesManager:t,configuration:a={}}=e;const{stateSyncService:n}=t.services;o.DicomMetadataStore.subscribe(o.DicomMetadataStore.EVENTS.INSTANCES_ADDED,la),o.DicomMetadataStore.subscribe(o.DicomMetadataStore.EVENTS.SERIES_UPDATED,la),n.register("viewportGridStore",{clearOnModeExit:!0}),n.register("displaySetSelectorMap",{clearOnModeExit:!0}),n.register("hangingProtocolStageIndexMap",{clearOnModeExit:!0}),n.register("toggleHangingProtocol",{clearOnModeExit:!0}),n.register("viewportsByPosition",{clearOnModeExit:!0})},getDataSourcesModule:X,getLayoutTemplateModule:function(e){let{servicesManager:t,extensionManager:a,commandsManager:n,hotkeysManager:s}=e;return[{name:"viewerLayout",id:"viewerLayout",component:function(e){return fe({servicesManager:t,extensionManager:a,commandsManager:n,hotkeysManager:s,...e})}}]},getPanelModule:qe,getHangingProtocolModule:Yt,getSopClassHandlerModule:ot,getToolbarModule:function(e){let{commandsManager:t,servicesManager:a}=e;return[{name:"ohif.divider",defaultComponent:it,clickHandler:()=>{}},{name:"ohif.action",defaultComponent:It,clickHandler:()=>{}},{name:"ohif.radioGroup",defaultComponent:It,clickHandler:()=>{}},{name:"ohif.splitButton",defaultComponent:pt,clickHandler:()=>{}},{name:"ohif.layoutSelector",defaultComponent:ut,clickHandler:(e,t,a)=>{}},{name:"ohif.toggle",defaultComponent:It,clickHandler:()=>{}}]},getCommandsModule:_t,getUtilityModule(e){let{servicesManager:t}=e;return[{name:"common",exports:{getStudiesForPatientByMRN:be}}]},getCustomizationModule:function(e){let{servicesManager:t,extensionManager:a}=e;return[{name:"helloPage",value:{id:"customRoutes",routes:[{path:"/custom",children:()=>Y.createElement("h1",{style:{color:"white"}},"Hello Custom Route")}]}},{name:"datasources",value:{id:"customRoutes",routes:[{path:"/datasources",children:Jt}]}},{name:"default",value:[{id:"ohif.overlayItem",content:function(e){if(this.condition&&!this.condition(e))return null;const{instance:t}=e,a=t&&this.attribute?t[this.attribute]:this.contentF&&"function"==typeof this.contentF?this.contentF(e):null;return a?Y.createElement("span",{className:"overlay-item flex flex-row",style:{color:this.color||void 0},title:this.title||""},this.label&&Y.createElement("span",{className:"mr-1 shrink-0"},this.label),Y.createElement("span",{className:"font-light"},a)):null}},{id:"ohif.contextMenu",transform:function(e){const t={...this};t.menus=this.menus.map((e=>({...e})));for(const a of t.menus){const{items:t}=a;a.items=[];for(const n of t)a.items.push(e.transform(n))}return t}},{id:"ohif.dataSourceConfigurationComponent",component:ta.bind(null,{servicesManager:t,extensionManager:a})},{id:"ohif.dataSourceConfigurationAPI.google",factory:e=>new ra(e,t,a)}]}]}}}}]); +//# sourceMappingURL=342.bundle.352b0a5b0103bd979889.js.map \ No newline at end of file diff --git a/resources/342.bundle.352b0a5b0103bd979889.js.map b/resources/342.bundle.352b0a5b0103bd979889.js.map new file mode 100644 index 0000000..794da88 --- /dev/null +++ b/resources/342.bundle.352b0a5b0103bd979889.js.map @@ -0,0 +1 @@ +{"version":3,"file":"342.bundle.352b0a5b0103bd979889.js","mappings":"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","sources":["webpack:///../../../extensions/default/src/DicomWebDataSource/qido.js","webpack:///../../../extensions/default/src/DicomWebDataSource/utils/getImageId.js","webpack:///../../../extensions/default/src/DicomWebDataSource/utils/getWADORSImageId.js","webpack:///../../../extensions/default/src/DicomWebDataSource/wado/retrieveMetadataLoader.js","webpack:///../../../extensions/default/src/DicomWebDataSource/wado/retrieveMetadataLoaderSync.js","webpack:///../../../extensions/default/src/DicomWebDataSource/wado/retrieveMetadataLoaderAsync.js","webpack:///../../../extensions/default/src/DicomWebDataSource/wado/retrieveMetadata.js","webpack:///../../../extensions/default/src/DicomWebDataSource/retrieveStudyMetadata.js","webpack:///../../../extensions/default/src/DicomWebDataSource/utils/StaticWadoClient.ts","webpack:///../../../extensions/default/src/utils/getDirectURL.js","webpack:///../../../extensions/default/src/DicomWebDataSource/utils/fixBulkDataURI.ts","webpack:///../../../extensions/default/src/DicomWebDataSource/index.js","webpack:///../../../extensions/default/src/DicomWebDataSource/dcm4cheeReject.js","webpack:///../../../extensions/default/src/DicomJSONDataSource/index.js","webpack:///../../../extensions/default/src/DicomLocalDataSource/index.js","webpack:///../../../extensions/default/src/DicomWebProxyDataSource/index.js","webpack:///../../../extensions/default/src/getDataSourcesModule.js","webpack:///../../../extensions/default/src/Toolbar/Toolbar.tsx","webpack:///../../../extensions/default/src/ViewerLayout/ViewerHeader.tsx","webpack:///../../../extensions/default/src/Components/SidePanelWithServices.tsx","webpack:///../../../extensions/default/src/ViewerLayout/index.tsx","webpack:///../../../extensions/default/src/Panels/PanelStudyBrowser.tsx","webpack:///../../../extensions/default/src/Panels/getImageSrcFromImageId.js","webpack:///../../../extensions/default/src/Panels/getStudiesForPatientByMRN.js","webpack:///../../../extensions/default/src/Panels/requestDisplaySetCreationForStudy.js","webpack:///../../../extensions/default/src/Panels/WrappedPanelStudyBrowser.tsx","webpack:///../../../extensions/default/src/Panels/ActionButtons.tsx","webpack:///../../../extensions/default/src/Panels/createReportDialogPrompt.tsx","webpack:///../../../extensions/default/src/Actions/createReportAsync.tsx","webpack:///../../../extensions/default/src/utils/getNextSRSeriesNumber.js","webpack:///../../../extensions/default/src/utils/findSRWithSameSeriesDescription.ts","webpack:///../../../extensions/default/src/Panels/PanelMeasurementTable.tsx","webpack:///../../../extensions/default/src/getPanelModule.tsx","webpack:///../../../extensions/default/src/id.js","webpack:///../../../extensions/default/src/utils/validations/areAllImagePositionsEqual.ts","webpack:///../../../extensions/default/src/utils/calculateScanAxisNormal.ts","webpack:///../../../extensions/default/src/utils/validations/checkSingleFrames.ts","webpack:///../../../extensions/default/src/utils/validations/areAllImageDimensionsEqual.ts","webpack:///../../../extensions/default/src/utils/validations/areAllImageComponentsEqual.ts","webpack:///../../../extensions/default/src/utils/validations/areAllImageOrientationsEqual.ts","webpack:///../../../extensions/default/src/utils/validations/areAllImageSpacingEqual.ts","webpack:///../../../extensions/default/src/getDisplaySetMessages.ts","webpack:///../../../extensions/default/src/utils/validations/checkMultiframe.ts","webpack:///../../../extensions/default/src/getDisplaySetsFromUnsupportedSeries.js","webpack:///../../../extensions/default/src/getSopClassHandlerModule.js","webpack:///../../../extensions/default/src/Toolbar/ToolbarDivider.tsx","webpack:///../../../extensions/default/src/Toolbar/ToolbarLayoutSelector.tsx","webpack:///../../../extensions/default/src/Toolbar/ToolbarSplitButtonWithServices.tsx","webpack:///../../../extensions/default/src/Toolbar/ToolbarButtonWithServices.tsx","webpack:///../../../extensions/default/src/CustomizableContextMenu/ContextMenuItemsBuilder.ts","webpack:///../../../extensions/default/src/CustomizableContextMenu/ContextMenuController.tsx","webpack:///../../../extensions/default/src/CustomizableContextMenu/defaultContextMenu.ts","webpack:///../../../extensions/default/src/DicomTagBrowser/DicomTagTable.tsx","webpack:///../../../extensions/default/src/DicomTagBrowser/DicomTagBrowser.tsx","webpack:///../../../extensions/default/src/utils/reuseCachedLayouts.ts","webpack:///../../../extensions/default/src/findViewportsByPosition.ts","webpack:///../../../extensions/default/src/commandsModule.ts","webpack:///../../../extensions/default/src/hpMNGrid.ts","webpack:///../../../extensions/default/src/hpCompare.ts","webpack:///../../../extensions/default/src/getHangingProtocolModule.js","webpack:///../../../extensions/default/src/Panels/DataSourceSelector.tsx","webpack:///../../../extensions/default/src/Components/ItemListComponent.tsx","webpack:///../../../extensions/default/src/Components/DataSourceConfigurationModalComponent.tsx","webpack:///../../../extensions/default/src/Components/DataSourceConfigurationComponent.tsx","webpack:///../../../extensions/default/src/DataSourceConfigurationAPI/GoogleCloudDataSourceConfigurationAPI.ts","webpack:///../../../extensions/default/src/getPTImageIdInstanceMetadata.ts","webpack:///../../../extensions/default/src/init.ts","webpack:///../../../extensions/default/src/index.ts","webpack:///../../../extensions/default/src/getLayoutTemplateModule.js","webpack:///../../../extensions/default/src/getToolbarModule.tsx","webpack:///../../../extensions/default/src/getCustomizationModule.tsx"],"sourcesContent":["/**\r\n * QIDO - Query based on ID for DICOM Objects\r\n * search for studies, series and instances by patient ID, and receive their\r\n * unique identifiers for further usage.\r\n *\r\n * Quick: https://www.dicomstandard.org/dicomweb/query-qido-rs/\r\n * Standard: http://dicom.nema.org/medical/dicom/current/output/html/part18.html#sect_10.6\r\n *\r\n * Routes:\r\n * ==========\r\n * /studies?\r\n * /studies/{studyInstanceUid}/series?\r\n * /studies/{studyInstanceUid}/series/{seriesInstanceUid}/instances?\r\n *\r\n * Query Parameters:\r\n * ================\r\n * | KEY | VALUE |\r\n * |------------------|--------------------|\r\n * | {attributeId} | {value} |\r\n * | includeField | {attribute} or all |\r\n * | fuzzymatching | true OR false |\r\n * | limit | {number} |\r\n * | offset | {number} |\r\n */\r\nimport { DICOMWeb, utils } from '@ohif/core';\r\nimport { sortStudySeries } from '@ohif/core/src/utils/sortStudy';\r\n\r\nconst { getString, getName, getModalities } = DICOMWeb;\r\n\r\n/**\r\n * Parses resulting data from a QIDO call into a set of Study MetaData\r\n *\r\n * @param {Array} qidoStudies - An array of study objects. Each object contains a keys for DICOM tags.\r\n * @param {object} qidoStudies[0].qidoStudy - An object where each key is the DICOM Tag group+element\r\n * @param {object} qidoStudies[0].qidoStudy[dicomTag] - Optional object that represents DICOM Tag\r\n * @param {string} qidoStudies[0].qidoStudy[dicomTag].vr - Value Representation\r\n * @param {string[]} qidoStudies[0].qidoStudy[dicomTag].Value - Optional string array representation of the DICOM Tag's value\r\n * @returns {Array} An array of Study MetaData objects\r\n */\r\nfunction processResults(qidoStudies) {\r\n if (!qidoStudies || !qidoStudies.length) {\r\n return [];\r\n }\r\n\r\n const studies = [];\r\n\r\n qidoStudies.forEach(qidoStudy =>\r\n studies.push({\r\n studyInstanceUid: getString(qidoStudy['0020000D']),\r\n date: getString(qidoStudy['00080020']), // YYYYMMDD\r\n time: getString(qidoStudy['00080030']), // HHmmss.SSS (24-hour, minutes, seconds, fractional seconds)\r\n accession: getString(qidoStudy['00080050']) || '', // short string, probably a number?\r\n mrn: getString(qidoStudy['00100020']) || '', // medicalRecordNumber\r\n patientName: utils.formatPN(getName(qidoStudy['00100010'])) || '',\r\n instances: Number(getString(qidoStudy['00201208'])) || 0, // number\r\n description: getString(qidoStudy['00081030']) || '',\r\n modalities: getString(getModalities(qidoStudy['00080060'], qidoStudy['00080061'])) || '',\r\n })\r\n );\r\n\r\n return studies;\r\n}\r\n\r\n/**\r\n * Parses resulting data from a QIDO call into a set of Study MetaData\r\n *\r\n * @param {Array} qidoSeries - An array of study objects. Each object contains a keys for DICOM tags.\r\n * @param {object} qidoSeries[0].qidoSeries - An object where each key is the DICOM Tag group+element\r\n * @param {object} qidoSeries[0].qidoSeries[dicomTag] - Optional object that represents DICOM Tag\r\n * @param {string} qidoSeries[0].qidoSeries[dicomTag].vr - Value Representation\r\n * @param {string[]} qidoSeries[0].qidoSeries[dicomTag].Value - Optional string array representation of the DICOM Tag's value\r\n * @returns {Array} An array of Study MetaData objects\r\n */\r\nexport function processSeriesResults(qidoSeries) {\r\n const series = [];\r\n\r\n if (qidoSeries && qidoSeries.length) {\r\n qidoSeries.forEach(qidoSeries =>\r\n series.push({\r\n studyInstanceUid: getString(qidoSeries['0020000D']),\r\n seriesInstanceUid: getString(qidoSeries['0020000E']),\r\n modality: getString(qidoSeries['00080060']),\r\n seriesNumber: getString(qidoSeries['00200011']),\r\n seriesDate: utils.formatDate(getString(qidoSeries['00080021'])),\r\n numSeriesInstances: Number(getString(qidoSeries['00201209'])),\r\n description: getString(qidoSeries['0008103E']),\r\n })\r\n );\r\n }\r\n\r\n sortStudySeries(series);\r\n\r\n return series;\r\n}\r\n\r\n/**\r\n *\r\n * @param {object} dicomWebClient - Client similar to what's provided by `dicomweb-client` library\r\n * @param {function} dicomWebClient.searchForStudies -\r\n * @param {string} [studyInstanceUid]\r\n * @param {string} [seriesInstanceUid]\r\n * @param {string} [queryParamaters]\r\n * @returns {Promise} - Promise that resolves results\r\n */\r\nasync function search(dicomWebClient, studyInstanceUid, seriesInstanceUid, queryParameters) {\r\n let searchResult = await dicomWebClient.searchForStudies({\r\n studyInstanceUid: undefined,\r\n queryParams: queryParameters,\r\n });\r\n\r\n return searchResult;\r\n}\r\n\r\n/**\r\n *\r\n * @param {string} studyInstanceUID - ID of study to return a list of series for\r\n * @returns {Promise} - Resolves SeriesMetadata[] in study\r\n */\r\nexport function seriesInStudy(dicomWebClient, studyInstanceUID) {\r\n // Series Description\r\n // Already included?\r\n const commaSeparatedFields = ['0008103E', '00080021'].join(',');\r\n const queryParams = {\r\n includefield: commaSeparatedFields,\r\n };\r\n\r\n return dicomWebClient.searchForSeries({ studyInstanceUID, queryParams });\r\n}\r\n\r\nexport default function searchStudies(server, filter) {\r\n const queryParams = getQIDOQueryParams(filter, server.qidoSupportsIncludeField);\r\n const options = {\r\n queryParams,\r\n };\r\n\r\n return dicomWeb.searchForStudies(options).then(resultDataToStudies);\r\n}\r\n\r\n/**\r\n * Produces a QIDO URL given server details and a set of specified search filter\r\n * items\r\n *\r\n * @param filter\r\n * @param serverSupportsQIDOIncludeField\r\n * @returns {string} The URL with encoded filter query data\r\n */\r\nfunction mapParams(params, options = {}) {\r\n if (!params) {\r\n return;\r\n }\r\n const commaSeparatedFields = [\r\n '00081030', // Study Description\r\n '00080060', // Modality\r\n // Add more fields here if you want them in the result\r\n ].join(',');\r\n\r\n const { supportsWildcard } = options;\r\n const withWildcard = value => {\r\n return supportsWildcard && value ? `*${value}*` : value;\r\n };\r\n\r\n const parameters = {\r\n // Named\r\n PatientName: withWildcard(params.patientName),\r\n //PatientID: withWildcard(params.patientId),\r\n '00100020': withWildcard(params.patientId), // Temporarily to make the tests pass with dicomweb-server.. Apparently it's broken?\r\n AccessionNumber: withWildcard(params.accessionNumber),\r\n StudyDescription: withWildcard(params.studyDescription),\r\n ModalitiesInStudy: params.modalitiesInStudy,\r\n // Other\r\n limit: params.limit || 101,\r\n offset: params.offset || 0,\r\n fuzzymatching: options.supportsFuzzyMatching === true,\r\n includefield: commaSeparatedFields, // serverSupportsQIDOIncludeField ? commaSeparatedFields : 'all',\r\n };\r\n\r\n // build the StudyDate range parameter\r\n if (params.startDate && params.endDate) {\r\n parameters.StudyDate = `${params.startDate}-${params.endDate}`;\r\n } else if (params.startDate) {\r\n const today = new Date();\r\n const DD = String(today.getDate()).padStart(2, '0');\r\n const MM = String(today.getMonth() + 1).padStart(2, '0'); //January is 0!\r\n const YYYY = today.getFullYear();\r\n const todayStr = `${YYYY}${MM}${DD}`;\r\n\r\n parameters.StudyDate = `${params.startDate}-${todayStr}`;\r\n } else if (params.endDate) {\r\n const oldDateStr = `19700102`;\r\n\r\n parameters.StudyDate = `${oldDateStr}-${params.endDate}`;\r\n }\r\n\r\n // Build the StudyInstanceUID parameter\r\n if (params.studyInstanceUid) {\r\n let studyUids = params.studyInstanceUid;\r\n studyUids = Array.isArray(studyUids) ? studyUids.join() : studyUids;\r\n studyUids = studyUids.replace(/[^0-9.]+/g, '\\\\');\r\n parameters.StudyInstanceUID = studyUids;\r\n }\r\n\r\n // Clean query params of undefined values.\r\n const final = {};\r\n Object.keys(parameters).forEach(key => {\r\n if (parameters[key] !== undefined && parameters[key] !== '') {\r\n final[key] = parameters[key];\r\n }\r\n });\r\n\r\n return final;\r\n}\r\n\r\nexport { mapParams, search, processResults };\r\n","import getWADORSImageId from './getWADORSImageId';\r\n\r\nfunction buildInstanceWadoUrl(config, instance) {\r\n const { StudyInstanceUID, SeriesInstanceUID, SOPInstanceUID } = instance;\r\n const params = [];\r\n\r\n params.push('requestType=WADO');\r\n params.push(`studyUID=${StudyInstanceUID}`);\r\n params.push(`seriesUID=${SeriesInstanceUID}`);\r\n params.push(`objectUID=${SOPInstanceUID}`);\r\n params.push('contentType=application/dicom');\r\n params.push('transferSyntax=*');\r\n\r\n const paramString = params.join('&');\r\n\r\n return `${config.wadoUriRoot}?${paramString}`;\r\n}\r\n\r\n/**\r\n * Obtain an imageId for Cornerstone from an image instance\r\n *\r\n * @param instance\r\n * @param frame\r\n * @param thumbnail\r\n * @returns {string} The imageId to be used by Cornerstone\r\n */\r\nexport default function getImageId({ instance, frame, config, thumbnail = false }) {\r\n if (!instance) {\r\n return;\r\n }\r\n\r\n if (instance.url) {\r\n return instance.url;\r\n }\r\n\r\n const renderingAttr = thumbnail ? 'thumbnailRendering' : 'imageRendering';\r\n\r\n if (!config[renderingAttr] || config[renderingAttr] === 'wadouri') {\r\n const wadouri = buildInstanceWadoUrl(config, instance);\r\n\r\n let imageId = 'dicomweb:' + wadouri;\r\n if (frame !== undefined) {\r\n imageId += '&frame=' + frame;\r\n }\r\n\r\n return imageId;\r\n } else {\r\n return getWADORSImageId(instance, config, frame); // WADO-RS Retrieve Frame\r\n }\r\n}\r\n","function buildInstanceWadoRsUri(instance, config) {\r\n const { StudyInstanceUID, SeriesInstanceUID, SOPInstanceUID } = instance;\r\n return `${config.wadoRoot}/studies/${StudyInstanceUID}/series/${SeriesInstanceUID}/instances/${SOPInstanceUID}`;\r\n}\r\n\r\nfunction buildInstanceFrameWadoRsUri(instance, config, frame) {\r\n const baseWadoRsUri = buildInstanceWadoRsUri(instance, config);\r\n\r\n frame = frame || 1;\r\n\r\n return `${baseWadoRsUri}/frames/${frame}`;\r\n}\r\n\r\n// function getWADORSImageUrl(instance, frame) {\r\n// const wadorsuri = buildInstanceFrameWadoRsUri(instance, config, frame);\r\n\r\n// if (!wadorsuri) {\r\n// return;\r\n// }\r\n\r\n// // Use null to obtain an imageId which represents the instance\r\n// if (frame === null) {\r\n// wadorsuri = wadorsuri.replace(/frames\\/(\\d+)/, '');\r\n// } else {\r\n// // We need to sum 1 because WADO-RS frame number is 1-based\r\n// frame = frame ? parseInt(frame) + 1 : 1;\r\n\r\n// // Replaces /frame/1 by /frame/{frame}\r\n// wadorsuri = wadorsuri.replace(/frames\\/(\\d+)/, `frames/${frame}`);\r\n// }\r\n\r\n// return wadorsuri;\r\n// }\r\n\r\n/**\r\n * Obtain an imageId for Cornerstone based on the WADO-RS scheme\r\n *\r\n * @param {object} instanceMetada metadata object (InstanceMetadata)\r\n * @param {(string\\|number)} [frame] the frame number\r\n * @returns {string} The imageId to be used by Cornerstone\r\n */\r\nexport default function getWADORSImageId(instance, config, frame) {\r\n //const uri = getWADORSImageUrl(instance, frame);\r\n const uri = buildInstanceFrameWadoRsUri(instance, config, frame);\r\n\r\n if (!uri) {\r\n return;\r\n }\r\n\r\n return `wadors:${uri}`;\r\n}\r\n","/**\r\n * Class to define inheritance of load retrieve strategy.\r\n * The process can be async load (lazy) or sync load\r\n *\r\n * There are methods that must be implemented at consumer level\r\n * To retrieve study call execLoad\r\n */\r\nexport default class RetrieveMetadataLoader {\r\n /**\r\n * @constructor\r\n * @param {Object} client The dicomweb-client.\r\n * @param {Array} studyInstanceUID Study instance ui to be retrieved\r\n * @param {Object} [filters] - Object containing filters to be applied on retrieve metadata process\r\n * @param {string} [filter.seriesInstanceUID] - series instance uid to filter results against\r\n * @param {Function} [sortSeries] - Custom sort function for series\r\n */\r\n constructor(client, studyInstanceUID, filters = {}, sortCriteria, sortFunction) {\r\n this.client = client;\r\n this.studyInstanceUID = studyInstanceUID;\r\n this.filters = filters;\r\n this.sortCriteria = sortCriteria;\r\n this.sortFunction = sortFunction;\r\n }\r\n\r\n async execLoad() {\r\n const preLoadData = await this.preLoad();\r\n const loadData = await this.load(preLoadData);\r\n const postLoadData = await this.posLoad(loadData);\r\n\r\n return postLoadData;\r\n }\r\n\r\n /**\r\n * It iterates over given loaders running each one. Loaders parameters must be bind when getting it.\r\n * @param {Array} loaders - array of loader to retrieve data.\r\n */\r\n async runLoaders(loaders) {\r\n let result;\r\n for (const loader of loaders) {\r\n try {\r\n result = await loader();\r\n if (result && result.length) {\r\n break; // closes iterator in case data is retrieved successfully\r\n }\r\n } catch (e) {\r\n throw e;\r\n }\r\n }\r\n\r\n if (loaders.next().done && !result) {\r\n throw new Error('RetrieveMetadataLoader failed');\r\n }\r\n\r\n return result;\r\n }\r\n\r\n // Methods to be overwrite\r\n async configLoad() {}\r\n async preLoad() {}\r\n async load(preLoadData) {}\r\n async posLoad(loadData) {}\r\n}\r\n","// import { api } from 'dicomweb-client';\r\n// import DICOMWeb from '../../../DICOMWeb/';\r\nimport { createStudyFromSOPInstanceList } from './studyInstanceHelpers';\r\nimport RetrieveMetadataLoader from './retrieveMetadataLoader';\r\n\r\n/**\r\n * Class for sync load of study metadata.\r\n * It inherits from RetrieveMetadataLoader\r\n *\r\n * A list of loaders (getLoaders) can be created so, it will be applied a fallback load strategy.\r\n * I.e Retrieve metadata using all loaders possibilities.\r\n */\r\nexport default class RetrieveMetadataLoaderSync extends RetrieveMetadataLoader {\r\n getOptions() {\r\n const { studyInstanceUID, filters } = this;\r\n\r\n const options = {\r\n studyInstanceUID,\r\n };\r\n\r\n const { seriesInstanceUID } = filters;\r\n if (seriesInstanceUID) {\r\n options['seriesInstanceUID'] = seriesInstanceUID;\r\n }\r\n\r\n return options;\r\n }\r\n\r\n /**\r\n * @returns {Array} Array of loaders. To be consumed as queue\r\n */\r\n *getLoaders() {\r\n const loaders = [];\r\n const { studyInstanceUID, filters: { seriesInstanceUID } = {}, client } = this;\r\n\r\n if (seriesInstanceUID) {\r\n loaders.push(\r\n client.retrieveSeriesMetadata.bind(client, {\r\n studyInstanceUID,\r\n seriesInstanceUID,\r\n })\r\n );\r\n }\r\n\r\n loaders.push(client.retrieveStudyMetadata.bind(client, { studyInstanceUID }));\r\n\r\n yield* loaders;\r\n }\r\n\r\n async load(preLoadData) {\r\n const loaders = this.getLoaders();\r\n const result = this.runLoaders(loaders);\r\n return result;\r\n }\r\n\r\n async posLoad(loadData) {\r\n return loadData;\r\n }\r\n}\r\n","import dcmjs from 'dcmjs';\r\nimport { sortStudySeries, sortingCriteria } from '@ohif/core/src/utils/sortStudy';\r\nimport RetrieveMetadataLoader from './retrieveMetadataLoader';\r\n\r\n/**\r\n * Creates an immutable series loader object which loads each series sequentially using the iterator interface\r\n * @param {DICOMWebClient} dicomWebClient The DICOMWebClient instance to be used for series load\r\n * @param {string} studyInstanceUID The Study Instance UID from which series will be loaded\r\n * @param {Array} seriesInstanceUIDList A list of Series Instance UIDs\r\n * @returns {Object} Returns an object which supports loading of instances from each of given Series Instance UID\r\n */\r\nfunction makeSeriesAsyncLoader(client, studyInstanceUID, seriesInstanceUIDList) {\r\n return Object.freeze({\r\n hasNext() {\r\n return seriesInstanceUIDList.length > 0;\r\n },\r\n async next() {\r\n const seriesInstanceUID = seriesInstanceUIDList.shift();\r\n return client.retrieveSeriesMetadata({\r\n studyInstanceUID,\r\n seriesInstanceUID,\r\n });\r\n },\r\n });\r\n}\r\n\r\n/**\r\n * Class for async load of study metadata.\r\n * It inherits from RetrieveMetadataLoader\r\n *\r\n * It loads the one series and then append to seriesLoader the others to be consumed/loaded\r\n */\r\nexport default class RetrieveMetadataLoaderAsync extends RetrieveMetadataLoader {\r\n /**\r\n * @returns {Array} Array of preLoaders. To be consumed as queue\r\n */\r\n *getPreLoaders() {\r\n const preLoaders = [];\r\n const { studyInstanceUID, filters: { seriesInstanceUID } = {}, client } = this;\r\n\r\n if (seriesInstanceUID) {\r\n const options = {\r\n studyInstanceUID,\r\n queryParams: { SeriesInstanceUID: seriesInstanceUID },\r\n };\r\n preLoaders.push(client.searchForSeries.bind(client, options));\r\n }\r\n // Fallback preloader\r\n preLoaders.push(client.searchForSeries.bind(client, { studyInstanceUID }));\r\n\r\n yield* preLoaders;\r\n }\r\n\r\n async preLoad() {\r\n const preLoaders = this.getPreLoaders();\r\n const result = await this.runLoaders(preLoaders);\r\n const sortCriteria = this.sortCriteria;\r\n const sortFunction = this.sortFunction;\r\n\r\n const { naturalizeDataset } = dcmjs.data.DicomMetaDictionary;\r\n const naturalized = result.map(naturalizeDataset);\r\n\r\n return sortStudySeries(\r\n naturalized,\r\n sortCriteria || sortingCriteria.seriesSortCriteria.seriesInfoSortingCriteria,\r\n sortFunction\r\n );\r\n }\r\n\r\n async load(preLoadData) {\r\n const { client, studyInstanceUID } = this;\r\n\r\n const seriesInstanceUIDs = preLoadData.map(s => s.SeriesInstanceUID);\r\n\r\n const seriesAsyncLoader = makeSeriesAsyncLoader(client, studyInstanceUID, seriesInstanceUIDs);\r\n\r\n const promises = [];\r\n\r\n while (seriesAsyncLoader.hasNext()) {\r\n promises.push(seriesAsyncLoader.next());\r\n }\r\n\r\n return {\r\n preLoadData,\r\n promises,\r\n };\r\n }\r\n\r\n async posLoad({ preLoadData, promises }) {\r\n return {\r\n preLoadData,\r\n promises,\r\n };\r\n }\r\n}\r\n","import RetrieveMetadataLoaderSync from './retrieveMetadataLoaderSync';\r\nimport RetrieveMetadataLoaderAsync from './retrieveMetadataLoaderAsync';\r\n\r\n/**\r\n * Retrieve Study metadata from a DICOM server. If the server is configured to use lazy load, only the first series\r\n * will be loaded and the property \"studyLoader\" will be set to let consumer load remaining series as needed.\r\n *\r\n * @param {Object} dicomWebClient The dicomweb-client.\r\n * @param {string} studyInstanceUid The Study Instance UID of the study which needs to be loaded\r\n * @param {Object} [filters] - Object containing filters to be applied on retrieve metadata process\r\n * @param {string} [filter.seriesInstanceUID] - series instance uid to filter results against\r\n * @returns {Object} A study descriptor object\r\n */\r\nasync function RetrieveMetadata(\r\n dicomWebClient,\r\n studyInstanceUid,\r\n enableStudyLazyLoad,\r\n filters = {},\r\n sortCriteria,\r\n sortFunction\r\n) {\r\n const RetrieveMetadataLoader =\r\n enableStudyLazyLoad !== false ? RetrieveMetadataLoaderAsync : RetrieveMetadataLoaderSync;\r\n\r\n const retrieveMetadataLoader = new RetrieveMetadataLoader(\r\n dicomWebClient,\r\n studyInstanceUid,\r\n filters,\r\n sortCriteria,\r\n sortFunction\r\n );\r\n const data = await retrieveMetadataLoader.execLoad();\r\n\r\n return data;\r\n}\r\n\r\nexport default RetrieveMetadata;\r\n","import RetrieveMetadata from './wado/retrieveMetadata.js';\r\n\r\nconst moduleName = 'RetrieveStudyMetadata';\r\n// Cache for promises. Prevents unnecessary subsequent calls to the server\r\nconst StudyMetaDataPromises = new Map();\r\n\r\n/**\r\n * Retrieves study metadata\r\n *\r\n * @param {Object} server Object with server configuration parameters\r\n * @param {string} StudyInstanceUID The UID of the Study to be retrieved\r\n * @param {boolean} enabledStudyLazyLoad Whether the study metadata should be loaded asynchronously.\r\n * @param {function} storeInstancesCallback A callback used to store the retrieved instance metadata.\r\n * @param {Object} [filters] - Object containing filters to be applied on retrieve metadata process\r\n * @param {string} [filter.seriesInstanceUID] - series instance uid to filter results against\r\n * @returns {Promise} that will be resolved with the metadata or rejected with the error\r\n */\r\nexport function retrieveStudyMetadata(\r\n dicomWebClient,\r\n StudyInstanceUID,\r\n enableStudyLazyLoad,\r\n filters,\r\n sortCriteria,\r\n sortFunction\r\n) {\r\n // @TODO: Whenever a study metadata request has failed, its related promise will be rejected once and for all\r\n // and further requests for that metadata will always fail. On failure, we probably need to remove the\r\n // corresponding promise from the \"StudyMetaDataPromises\" map...\r\n\r\n if (!dicomWebClient) {\r\n throw new Error(`${moduleName}: Required 'dicomWebClient' parameter not provided.`);\r\n }\r\n if (!StudyInstanceUID) {\r\n throw new Error(`${moduleName}: Required 'StudyInstanceUID' parameter not provided.`);\r\n }\r\n\r\n // Already waiting on result? Return cached promise\r\n if (StudyMetaDataPromises.has(StudyInstanceUID)) {\r\n return StudyMetaDataPromises.get(StudyInstanceUID);\r\n }\r\n\r\n // Create a promise to handle the data retrieval\r\n const promise = new Promise((resolve, reject) => {\r\n RetrieveMetadata(\r\n dicomWebClient,\r\n StudyInstanceUID,\r\n enableStudyLazyLoad,\r\n filters,\r\n sortCriteria,\r\n sortFunction\r\n ).then(function (data) {\r\n resolve(data);\r\n }, reject);\r\n });\r\n\r\n // Store the promise in cache\r\n StudyMetaDataPromises.set(StudyInstanceUID, promise);\r\n\r\n return promise;\r\n}\r\n\r\n/**\r\n * Delete the cached study metadata retrieval promise to ensure that the browser will\r\n * re-retrieve the study metadata when it is next requested\r\n *\r\n * @param {String} StudyInstanceUID The UID of the Study to be removed from cache\r\n *\r\n */\r\nexport function deleteStudyMetadataPromise(StudyInstanceUID) {\r\n if (StudyMetaDataPromises.has(StudyInstanceUID)) {\r\n StudyMetaDataPromises.delete(StudyInstanceUID);\r\n }\r\n}\r\n","import { api } from 'dicomweb-client';\r\n\r\n/**\r\n * An implementation of the static wado client, that fetches data from\r\n * a static response rather than actually doing real queries. This allows\r\n * fast encoding of test data, but because it is static, anything actually\r\n * performing searches doesn't work. This version fixes the query issue\r\n * by manually implementing a query option.\r\n */\r\nexport default class StaticWadoClient extends api.DICOMwebClient {\r\n static studyFilterKeys = {\r\n studyinstanceuid: '0020000D',\r\n patientname: '00100010',\r\n '00100020': 'mrn',\r\n studydescription: '00081030',\r\n studydate: '00080020',\r\n modalitiesinstudy: '00080061',\r\n accessionnumber: '00080050',\r\n };\r\n\r\n static seriesFilterKeys = {\r\n seriesinstanceuid: '0020000E',\r\n seriesnumber: '00200011',\r\n modality: '00080060',\r\n };\r\n\r\n constructor(qidoConfig) {\r\n super(qidoConfig);\r\n this.staticWado = qidoConfig.staticWado;\r\n }\r\n\r\n /**\r\n * Replace the search for studies remote query with a local version which\r\n * retrieves a complete query list and then sub-selects from it locally.\r\n * @param {*} options\r\n * @returns\r\n */\r\n async searchForStudies(options) {\r\n if (!this.staticWado) {\r\n return super.searchForStudies(options);\r\n }\r\n\r\n const searchResult = await super.searchForStudies(options);\r\n const { queryParams } = options;\r\n\r\n if (!queryParams) {\r\n return searchResult;\r\n }\r\n\r\n const lowerParams = this.toLowerParams(queryParams);\r\n const filtered = searchResult.filter(study => {\r\n for (const key of Object.keys(StaticWadoClient.studyFilterKeys)) {\r\n if (!this.filterItem(key, lowerParams, study, StaticWadoClient.studyFilterKeys)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n });\r\n return filtered;\r\n }\r\n\r\n async searchForSeries(options) {\r\n if (!this.staticWado) {\r\n return super.searchForSeries(options);\r\n }\r\n\r\n const searchResult = await super.searchForSeries(options);\r\n const { queryParams } = options;\r\n if (!queryParams) {\r\n return searchResult;\r\n }\r\n const lowerParams = this.toLowerParams(queryParams);\r\n\r\n const filtered = searchResult.filter(series => {\r\n for (const key of Object.keys(StaticWadoClient.seriesFilterKeys)) {\r\n if (!this.filterItem(key, lowerParams, series, StaticWadoClient.seriesFilterKeys)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n });\r\n\r\n return filtered;\r\n }\r\n\r\n /**\r\n * Compares values, matching any instance of desired to any instance of\r\n * actual by recursively go through the paired set of values. That is,\r\n * this is O(m*n) where m is how many items in desired and n is the length of actual\r\n * Then, at the individual item node, compares the Alphabetic name if present,\r\n * and does a sub-string matching on string values, and otherwise does an\r\n * exact match comparison.\r\n *\r\n * @param {*} desired\r\n * @param {*} actual\r\n * @returns true if the values match\r\n */\r\n compareValues(desired, actual) {\r\n if (Array.isArray(desired)) {\r\n return desired.find(item => this.compareValues(item, actual));\r\n }\r\n if (Array.isArray(actual)) {\r\n return actual.find(actualItem => this.compareValues(desired, actualItem));\r\n }\r\n if (actual?.Alphabetic) {\r\n actual = actual.Alphabetic;\r\n }\r\n if (typeof actual == 'string') {\r\n if (actual.length === 0) {\r\n return true;\r\n }\r\n if (desired.length === 0 || desired === '*') {\r\n return true;\r\n }\r\n if (desired[0] === '*' && desired[desired.length - 1] === '*') {\r\n // console.log(`Comparing ${actual} to ${desired.substring(1, desired.length - 1)}`)\r\n return actual.indexOf(desired.substring(1, desired.length - 1)) != -1;\r\n } else if (desired[desired.length - 1] === '*') {\r\n return actual.indexOf(desired.substring(0, desired.length - 1)) != -1;\r\n } else if (desired[0] === '*') {\r\n return actual.indexOf(desired.substring(1)) === actual.length - desired.length + 1;\r\n }\r\n }\r\n return desired === actual;\r\n }\r\n\r\n /** Compares a pair of dates to see if the value is within the range */\r\n compareDateRange(range, value) {\r\n if (!value) {\r\n return true;\r\n }\r\n const dash = range.indexOf('-');\r\n if (dash === -1) {\r\n return this.compareValues(range, value);\r\n }\r\n const start = range.substring(0, dash);\r\n const end = range.substring(dash + 1);\r\n return (!start || value >= start) && (!end || value <= end);\r\n }\r\n\r\n /**\r\n * Filters the return list by the query parameters.\r\n *\r\n * @param anyCaseKey - a possible search key\r\n * @param queryParams -\r\n * @param {*} study\r\n * @param {*} sourceFilterMap\r\n * @returns\r\n */\r\n filterItem(key: string, queryParams, study, sourceFilterMap) {\r\n const altKey = sourceFilterMap[key] || key;\r\n if (!queryParams) {\r\n return true;\r\n }\r\n const testValue = queryParams[key] || queryParams[altKey];\r\n if (!testValue) {\r\n return true;\r\n }\r\n const valueElem = study[key] || study[altKey];\r\n if (!valueElem) {\r\n return false;\r\n }\r\n if (valueElem.vr === 'DA' && valueElem.Value?.[0]) {\r\n return this.compareDateRange(testValue, valueElem.Value[0]);\r\n }\r\n const value = valueElem.Value;\r\n return this.compareValues(testValue, value);\r\n }\r\n\r\n /** Converts the query parameters to lower case query parameters */\r\n toLowerParams(queryParams: Record): Record {\r\n const lowerParams = {};\r\n Object.entries(queryParams).forEach(([key, value]) => {\r\n lowerParams[key.toLowerCase()] = value;\r\n });\r\n return lowerParams;\r\n }\r\n}\r\n","import { utils } from '@ohif/core';\r\n\r\n/**\r\n * Generates a URL that can be used for direct retrieve of the bulkdata\r\n *\r\n * @param {object} params\r\n * @param {string} params.tag is the tag name of the URL to retrieve\r\n * @param {string} params.defaultPath path for the pixel data url\r\n * @param {object} params.instance is the instance object that the tag is in\r\n * @param {string} params.defaultType is the mime type of the response\r\n * @param {string} params.singlepart is the type of the part to retrieve\r\n * @param {string} params.fetchPart unknown?\r\n * @returns an absolute URL to the resource, if the absolute URL can be retrieved as singlepart,\r\n * or is already retrieved, or a promise to a URL for such use if a BulkDataURI\r\n */\r\nconst getDirectURL = (config, params) => {\r\n const { wadoRoot, singlepart } = config;\r\n const {\r\n instance,\r\n tag = 'PixelData',\r\n defaultPath = '/pixeldata',\r\n defaultType = 'video/mp4',\r\n singlepart: fetchPart = 'video',\r\n } = params;\r\n const value = instance[tag];\r\n if (!value) {\r\n return undefined;\r\n }\r\n\r\n if (value.DirectRetrieveURL) {\r\n return value.DirectRetrieveURL;\r\n }\r\n if (value.InlineBinary) {\r\n const blob = utils.b64toBlob(value.InlineBinary, defaultType);\r\n value.DirectRetrieveURL = URL.createObjectURL(blob);\r\n return value.DirectRetrieveURL;\r\n }\r\n if (!singlepart || (singlepart !== true && singlepart.indexOf(fetchPart) === -1)) {\r\n if (value.retrieveBulkData) {\r\n return value.retrieveBulkData().then(arr => {\r\n value.DirectRetrieveURL = URL.createObjectURL(new Blob([arr], { type: defaultType }));\r\n return value.DirectRetrieveURL;\r\n });\r\n }\r\n console.warn('Unable to retrieve', tag, 'from', instance);\r\n return undefined;\r\n }\r\n\r\n const { StudyInstanceUID, SeriesInstanceUID, SOPInstanceUID } = instance;\r\n const BulkDataURI =\r\n (value && value.BulkDataURI) ||\r\n `series/${SeriesInstanceUID}/instances/${SOPInstanceUID}${defaultPath}`;\r\n const hasQuery = BulkDataURI.indexOf('?') !== -1;\r\n const hasAccept = BulkDataURI.indexOf('accept=') !== -1;\r\n const acceptUri =\r\n BulkDataURI + (hasAccept ? '' : (hasQuery ? '&' : '?') + `accept=${defaultType}`);\r\n\r\n if (tag === 'PixelData' || tag === 'EncapsulatedDocument') {\r\n return `${wadoRoot}/studies/${StudyInstanceUID}/series/${SeriesInstanceUID}/instances/${SOPInstanceUID}/rendered`;\r\n }\r\n\r\n // The DICOMweb standard states that the default is multipart related, and then\r\n // separately states that the accept parameter is the URL parameter equivalent of the accept header.\r\n return acceptUri;\r\n};\r\n\r\nexport default getDirectURL;\r\n","/**\r\n * Modifies a bulkDataURI to ensure it is absolute based on the DICOMWeb configuration and\r\n * instance data. The modification is in-place.\r\n *\r\n * If the bulkDataURI is relative to the series or study (according to the DICOM standard),\r\n * it is made absolute by prepending the relevant paths.\r\n *\r\n * In scenarios where the bulkDataURI is a server-relative path (starting with '/'), the function\r\n * handles two cases:\r\n *\r\n * 1. If the wado root is absolute (starts with 'http'), it prepends the wado root to the bulkDataURI.\r\n * 2. If the wado root is relative, no changes are needed as the bulkDataURI is already correctly relative to the server root.\r\n *\r\n * @param value - The object containing BulkDataURI to be fixed.\r\n * @param instance - The object (DICOM instance data) containing StudyInstanceUID and SeriesInstanceUID.\r\n * @param dicomWebConfig - The DICOMWeb configuration object, containing wadoRoot and potentially bulkDataURI.relativeResolution.\r\n * @returns The function modifies `value` in-place, it does not return a value.\r\n */\r\nfunction fixBulkDataURI(value, instance, dicomWebConfig) {\r\n // in case of the relative path, make it absolute. The current DICOM standard says\r\n // the bulkdataURI is relative to the series. However, there are situations where\r\n // it can be relative to the study too\r\n if (!value.BulkDataURI.startsWith('http') && !value.BulkDataURI.startsWith('/')) {\r\n if (dicomWebConfig.bulkDataURI?.relativeResolution === 'studies') {\r\n value.BulkDataURI = `${dicomWebConfig.wadoRoot}/studies/${instance.StudyInstanceUID}/${value.BulkDataURI}`;\r\n } else if (\r\n dicomWebConfig.bulkDataURI?.relativeResolution === 'series' ||\r\n !dicomWebConfig.bulkDataURI?.relativeResolution\r\n ) {\r\n value.BulkDataURI = `${dicomWebConfig.wadoRoot}/studies/${instance.StudyInstanceUID}/series/${instance.SeriesInstanceUID}/${value.BulkDataURI}`;\r\n }\r\n\r\n return;\r\n }\r\n\r\n // in case it is relative path but starts at the server (e.g., /bulk/1e, note the missing http\r\n // in the beginning and the first character is /) There are two scenarios, whether the wado root\r\n // is absolute or relative. In case of absolute, we need to prepend the wado root to the bulkdata\r\n // uri (e.g., bulkData: /bulk/1e, wado root: http://myserver.com/dicomweb, output: http://myserver.com/bulk/1e)\r\n // and in case of relative wado root, we need to prepend the bulkdata uri to the wado root (e.g,. bulkData: /bulk/1e\r\n // wado root: /dicomweb, output: /bulk/1e)\r\n if (value.BulkDataURI[0] === '/') {\r\n if (dicomWebConfig.wadoRoot.startsWith('http')) {\r\n // Absolute wado root\r\n const url = new URL(dicomWebConfig.wadoRoot);\r\n value.BulkDataURI = `${url.origin}${value.BulkDataURI}`;\r\n } else {\r\n // Relative wado root, we don't need to do anything, bulkdata uri is already correct\r\n }\r\n }\r\n}\r\n\r\nexport { fixBulkDataURI };\r\n","import { api } from 'dicomweb-client';\r\nimport { DicomMetadataStore, IWebApiDataSource, utils, errorHandler, classes } from '@ohif/core';\r\n\r\nimport {\r\n mapParams,\r\n search as qidoSearch,\r\n seriesInStudy,\r\n processResults,\r\n processSeriesResults,\r\n} from './qido.js';\r\nimport dcm4cheeReject from './dcm4cheeReject';\r\n\r\nimport getImageId from './utils/getImageId';\r\nimport dcmjs from 'dcmjs';\r\nimport { retrieveStudyMetadata, deleteStudyMetadataPromise } from './retrieveStudyMetadata.js';\r\nimport StaticWadoClient from './utils/StaticWadoClient';\r\nimport getDirectURL from '../utils/getDirectURL';\r\nimport { fixBulkDataURI } from './utils/fixBulkDataURI';\r\n\r\nconst { DicomMetaDictionary, DicomDict } = dcmjs.data;\r\n\r\nconst { naturalizeDataset, denaturalizeDataset } = DicomMetaDictionary;\r\n\r\nconst ImplementationClassUID = '2.25.270695996825855179949881587723571202391.2.0.0';\r\nconst ImplementationVersionName = 'OHIF-VIEWER-2.0.0';\r\nconst EXPLICIT_VR_LITTLE_ENDIAN = '1.2.840.10008.1.2.1';\r\n\r\nconst metadataProvider = classes.MetadataProvider;\r\n\r\n/**\r\n *\r\n * @param {string} name - Data source name\r\n * @param {string} wadoUriRoot - Legacy? (potentially unused/replaced)\r\n * @param {string} qidoRoot - Base URL to use for QIDO requests\r\n * @param {string} wadoRoot - Base URL to use for WADO requests\r\n * @param {boolean} qidoSupportsIncludeField - Whether QIDO supports the \"Include\" option to request additional fields in response\r\n * @param {string} imageRengering - wadors | ? (unsure of where/how this is used)\r\n * @param {string} thumbnailRendering - wadors | ? (unsure of where/how this is used)\r\n * @param {bool} supportsReject - Whether the server supports reject calls (i.e. DCM4CHEE)\r\n * @param {bool} lazyLoadStudy - \"enableStudyLazyLoad\"; Request series meta async instead of blocking\r\n * @param {string|bool} singlepart - indicates of the retrieves can fetch singlepart. Options are bulkdata, video, image or boolean true\r\n */\r\nfunction createDicomWebApi(dicomWebConfig, userAuthenticationService) {\r\n let dicomWebConfigCopy,\r\n qidoConfig,\r\n wadoConfig,\r\n qidoDicomWebClient,\r\n wadoDicomWebClient,\r\n getAuthrorizationHeader,\r\n generateWadoHeader;\r\n\r\n const implementation = {\r\n initialize: ({ params, query }) => {\r\n if (dicomWebConfig.onConfiguration && typeof dicomWebConfig.onConfiguration === 'function') {\r\n dicomWebConfig = dicomWebConfig.onConfiguration(dicomWebConfig, {\r\n params,\r\n query,\r\n });\r\n }\r\n\r\n dicomWebConfigCopy = JSON.parse(JSON.stringify(dicomWebConfig));\r\n\r\n getAuthrorizationHeader = () => {\r\n const xhrRequestHeaders = {};\r\n const authHeaders = userAuthenticationService.getAuthorizationHeader();\r\n if (authHeaders && authHeaders.Authorization) {\r\n xhrRequestHeaders.Authorization = authHeaders.Authorization;\r\n }\r\n return xhrRequestHeaders;\r\n };\r\n\r\n generateWadoHeader = () => {\r\n let authorizationHeader = getAuthrorizationHeader();\r\n //Generate accept header depending on config params\r\n let formattedAcceptHeader = utils.generateAcceptHeader(\r\n dicomWebConfig.acceptHeader,\r\n dicomWebConfig.requestTransferSyntaxUID,\r\n dicomWebConfig.omitQuotationForMultipartRequest\r\n );\r\n\r\n return {\r\n ...authorizationHeader,\r\n Accept: formattedAcceptHeader,\r\n };\r\n };\r\n\r\n qidoConfig = {\r\n url: dicomWebConfig.qidoRoot,\r\n staticWado: dicomWebConfig.staticWado,\r\n singlepart: dicomWebConfig.singlepart,\r\n headers: userAuthenticationService.getAuthorizationHeader(),\r\n errorInterceptor: errorHandler.getHTTPErrorHandler(),\r\n };\r\n\r\n wadoConfig = {\r\n url: dicomWebConfig.wadoRoot,\r\n staticWado: dicomWebConfig.staticWado,\r\n singlepart: dicomWebConfig.singlepart,\r\n headers: userAuthenticationService.getAuthorizationHeader(),\r\n errorInterceptor: errorHandler.getHTTPErrorHandler(),\r\n };\r\n\r\n // TODO -> Two clients sucks, but its better than 1000.\r\n // TODO -> We'll need to merge auth later.\r\n qidoDicomWebClient = dicomWebConfig.staticWado\r\n ? new StaticWadoClient(qidoConfig)\r\n : new api.DICOMwebClient(qidoConfig);\r\n\r\n wadoDicomWebClient = dicomWebConfig.staticWado\r\n ? new StaticWadoClient(wadoConfig)\r\n : new api.DICOMwebClient(wadoConfig);\r\n },\r\n query: {\r\n studies: {\r\n mapParams: mapParams.bind(),\r\n search: async function (origParams) {\r\n qidoDicomWebClient.headers = getAuthrorizationHeader();\r\n const { studyInstanceUid, seriesInstanceUid, ...mappedParams } =\r\n mapParams(origParams, {\r\n supportsFuzzyMatching: dicomWebConfig.supportsFuzzyMatching,\r\n supportsWildcard: dicomWebConfig.supportsWildcard,\r\n }) || {};\r\n\r\n const results = await qidoSearch(qidoDicomWebClient, undefined, undefined, mappedParams);\r\n\r\n return processResults(results);\r\n },\r\n processResults: processResults.bind(),\r\n },\r\n series: {\r\n // mapParams: mapParams.bind(),\r\n search: async function (studyInstanceUid) {\r\n qidoDicomWebClient.headers = getAuthrorizationHeader();\r\n const results = await seriesInStudy(qidoDicomWebClient, studyInstanceUid);\r\n\r\n return processSeriesResults(results);\r\n },\r\n // processResults: processResults.bind(),\r\n },\r\n instances: {\r\n search: (studyInstanceUid, queryParameters) => {\r\n qidoDicomWebClient.headers = getAuthrorizationHeader();\r\n qidoSearch.call(undefined, qidoDicomWebClient, studyInstanceUid, null, queryParameters);\r\n },\r\n },\r\n },\r\n retrieve: {\r\n /**\r\n * Generates a URL that can be used for direct retrieve of the bulkdata\r\n *\r\n * @param {object} params\r\n * @param {string} params.tag is the tag name of the URL to retrieve\r\n * @param {object} params.instance is the instance object that the tag is in\r\n * @param {string} params.defaultType is the mime type of the response\r\n * @param {string} params.singlepart is the type of the part to retrieve\r\n * @returns an absolute URL to the resource, if the absolute URL can be retrieved as singlepart,\r\n * or is already retrieved, or a promise to a URL for such use if a BulkDataURI\r\n */\r\n directURL: params => {\r\n return getDirectURL(\r\n {\r\n wadoRoot: dicomWebConfig.wadoRoot,\r\n singlepart: dicomWebConfig.singlepart,\r\n },\r\n params\r\n );\r\n },\r\n bulkDataURI: async ({ StudyInstanceUID, BulkDataURI }) => {\r\n qidoDicomWebClient.headers = getAuthrorizationHeader();\r\n const options = {\r\n multipart: false,\r\n BulkDataURI,\r\n StudyInstanceUID,\r\n };\r\n return qidoDicomWebClient.retrieveBulkData(options).then(val => {\r\n const ret = (val && val[0]) || undefined;\r\n return ret;\r\n });\r\n },\r\n series: {\r\n metadata: async ({\r\n StudyInstanceUID,\r\n filters,\r\n sortCriteria,\r\n sortFunction,\r\n madeInClient = false,\r\n } = {}) => {\r\n if (!StudyInstanceUID) {\r\n throw new Error('Unable to query for SeriesMetadata without StudyInstanceUID');\r\n }\r\n\r\n if (dicomWebConfig.enableStudyLazyLoad) {\r\n return implementation._retrieveSeriesMetadataAsync(\r\n StudyInstanceUID,\r\n filters,\r\n sortCriteria,\r\n sortFunction,\r\n madeInClient\r\n );\r\n }\r\n\r\n return implementation._retrieveSeriesMetadataSync(\r\n StudyInstanceUID,\r\n filters,\r\n sortCriteria,\r\n sortFunction,\r\n madeInClient\r\n );\r\n },\r\n },\r\n },\r\n\r\n store: {\r\n dicom: async (dataset, request) => {\r\n wadoDicomWebClient.headers = getAuthrorizationHeader();\r\n if (dataset instanceof ArrayBuffer) {\r\n const options = {\r\n datasets: [dataset],\r\n request,\r\n };\r\n await wadoDicomWebClient.storeInstances(options);\r\n } else {\r\n const meta = {\r\n FileMetaInformationVersion: dataset._meta?.FileMetaInformationVersion?.Value,\r\n MediaStorageSOPClassUID: dataset.SOPClassUID,\r\n MediaStorageSOPInstanceUID: dataset.SOPInstanceUID,\r\n TransferSyntaxUID: EXPLICIT_VR_LITTLE_ENDIAN,\r\n ImplementationClassUID,\r\n ImplementationVersionName,\r\n };\r\n\r\n const denaturalized = denaturalizeDataset(meta);\r\n const dicomDict = new DicomDict(denaturalized);\r\n\r\n dicomDict.dict = denaturalizeDataset(dataset);\r\n\r\n const part10Buffer = dicomDict.write();\r\n\r\n const options = {\r\n datasets: [part10Buffer],\r\n request,\r\n };\r\n\r\n await wadoDicomWebClient.storeInstances(options);\r\n }\r\n },\r\n },\r\n\r\n _retrieveSeriesMetadataSync: async (\r\n StudyInstanceUID,\r\n filters,\r\n sortCriteria,\r\n sortFunction,\r\n madeInClient\r\n ) => {\r\n const enableStudyLazyLoad = false;\r\n wadoDicomWebClient.headers = generateWadoHeader();\r\n // data is all SOPInstanceUIDs\r\n const data = await retrieveStudyMetadata(\r\n wadoDicomWebClient,\r\n StudyInstanceUID,\r\n enableStudyLazyLoad,\r\n filters,\r\n sortCriteria,\r\n sortFunction\r\n );\r\n\r\n // first naturalize the data\r\n const naturalizedInstancesMetadata = data.map(naturalizeDataset);\r\n\r\n const seriesSummaryMetadata = {};\r\n const instancesPerSeries = {};\r\n\r\n naturalizedInstancesMetadata.forEach(instance => {\r\n if (!seriesSummaryMetadata[instance.SeriesInstanceUID]) {\r\n seriesSummaryMetadata[instance.SeriesInstanceUID] = {\r\n StudyInstanceUID: instance.StudyInstanceUID,\r\n StudyDescription: instance.StudyDescription,\r\n SeriesInstanceUID: instance.SeriesInstanceUID,\r\n SeriesDescription: instance.SeriesDescription,\r\n SeriesNumber: instance.SeriesNumber,\r\n SeriesTime: instance.SeriesTime,\r\n SOPClassUID: instance.SOPClassUID,\r\n ProtocolName: instance.ProtocolName,\r\n Modality: instance.Modality,\r\n };\r\n }\r\n\r\n if (!instancesPerSeries[instance.SeriesInstanceUID]) {\r\n instancesPerSeries[instance.SeriesInstanceUID] = [];\r\n }\r\n\r\n const imageId = implementation.getImageIdsForInstance({\r\n instance,\r\n });\r\n\r\n instance.imageId = imageId;\r\n instance.wadoRoot = dicomWebConfig.wadoRoot;\r\n instance.wadoUri = dicomWebConfig.wadoUri;\r\n\r\n metadataProvider.addImageIdToUIDs(imageId, {\r\n StudyInstanceUID,\r\n SeriesInstanceUID: instance.SeriesInstanceUID,\r\n SOPInstanceUID: instance.SOPInstanceUID,\r\n });\r\n\r\n instancesPerSeries[instance.SeriesInstanceUID].push(instance);\r\n });\r\n\r\n // grab all the series metadata\r\n const seriesMetadata = Object.values(seriesSummaryMetadata);\r\n DicomMetadataStore.addSeriesMetadata(seriesMetadata, madeInClient);\r\n\r\n Object.keys(instancesPerSeries).forEach(seriesInstanceUID =>\r\n DicomMetadataStore.addInstances(instancesPerSeries[seriesInstanceUID], madeInClient)\r\n );\r\n },\r\n\r\n _retrieveSeriesMetadataAsync: async (\r\n StudyInstanceUID,\r\n filters,\r\n sortCriteria,\r\n sortFunction,\r\n madeInClient = false\r\n ) => {\r\n const enableStudyLazyLoad = true;\r\n wadoDicomWebClient.headers = generateWadoHeader();\r\n // Get Series\r\n const { preLoadData: seriesSummaryMetadata, promises: seriesPromises } =\r\n await retrieveStudyMetadata(\r\n wadoDicomWebClient,\r\n StudyInstanceUID,\r\n enableStudyLazyLoad,\r\n filters,\r\n sortCriteria,\r\n sortFunction\r\n );\r\n\r\n /**\r\n * naturalizes the dataset, and adds a retrieve bulkdata method\r\n * to any values containing BulkDataURI.\r\n * @param {*} instance\r\n * @returns naturalized dataset, with retrieveBulkData methods\r\n */\r\n const addRetrieveBulkData = instance => {\r\n const naturalized = naturalizeDataset(instance);\r\n\r\n // if we know the server doesn't use bulkDataURI, then don't\r\n if (!dicomWebConfig.bulkDataURI?.enabled) {\r\n return naturalized;\r\n }\r\n\r\n Object.keys(naturalized).forEach(key => {\r\n const value = naturalized[key];\r\n\r\n // The value.Value will be set with the bulkdata read value\r\n // in which case it isn't necessary to re-read this.\r\n if (value && value.BulkDataURI && !value.Value) {\r\n // Provide a method to fetch bulkdata\r\n value.retrieveBulkData = () => {\r\n // handle the scenarios where bulkDataURI is relative path\r\n fixBulkDataURI(value, naturalized, dicomWebConfig);\r\n\r\n const options = {\r\n // The bulkdata fetches work with either multipart or\r\n // singlepart, so set multipart to false to let the server\r\n // decide which type to respond with.\r\n multipart: false,\r\n BulkDataURI: value.BulkDataURI,\r\n // The study instance UID is required if the bulkdata uri\r\n // is relative - that isn't disallowed by DICOMweb, but\r\n // isn't well specified in the standard, but is needed in\r\n // any implementation that stores static copies of the metadata\r\n StudyInstanceUID: naturalized.StudyInstanceUID,\r\n };\r\n // Todo: this needs to be from wado dicom web client\r\n return qidoDicomWebClient.retrieveBulkData(options).then(val => {\r\n // There are DICOM PDF cases where the first ArrayBuffer in the array is\r\n // the bulk data and DICOM video cases where the second ArrayBuffer is\r\n // the bulk data. Here we play it safe and do a find.\r\n const ret =\r\n (val instanceof Array && val.find(arrayBuffer => arrayBuffer?.byteLength)) ||\r\n undefined;\r\n value.Value = ret;\r\n return ret;\r\n });\r\n };\r\n }\r\n });\r\n return naturalized;\r\n };\r\n\r\n // Async load series, store as retrieved\r\n function storeInstances(instances) {\r\n const naturalizedInstances = instances.map(addRetrieveBulkData);\r\n\r\n // Adding instanceMetadata to OHIF MetadataProvider\r\n naturalizedInstances.forEach((instance, index) => {\r\n instance.wadoRoot = dicomWebConfig.wadoRoot;\r\n instance.wadoUri = dicomWebConfig.wadoUri;\r\n\r\n const imageId = implementation.getImageIdsForInstance({\r\n instance,\r\n });\r\n\r\n // Adding imageId to each instance\r\n // Todo: This is not the best way I can think of to let external\r\n // metadata handlers know about the imageId that is stored in the store\r\n instance.imageId = imageId;\r\n\r\n // Adding UIDs to metadataProvider\r\n // Note: storing imageURI in metadataProvider since stack viewports\r\n // will use the same imageURI\r\n metadataProvider.addImageIdToUIDs(imageId, {\r\n StudyInstanceUID,\r\n SeriesInstanceUID: instance.SeriesInstanceUID,\r\n SOPInstanceUID: instance.SOPInstanceUID,\r\n });\r\n });\r\n\r\n DicomMetadataStore.addInstances(naturalizedInstances, madeInClient);\r\n }\r\n\r\n function setSuccessFlag() {\r\n const study = DicomMetadataStore.getStudy(StudyInstanceUID, madeInClient);\r\n study.isLoaded = true;\r\n }\r\n\r\n // Google Cloud Healthcare doesn't return StudyInstanceUID, so we need to add\r\n // it manually here\r\n seriesSummaryMetadata.forEach(aSeries => {\r\n aSeries.StudyInstanceUID = StudyInstanceUID;\r\n });\r\n\r\n DicomMetadataStore.addSeriesMetadata(seriesSummaryMetadata, madeInClient);\r\n\r\n const seriesDeliveredPromises = seriesPromises.map(promise =>\r\n promise.then(instances => {\r\n storeInstances(instances);\r\n })\r\n );\r\n await Promise.all(seriesDeliveredPromises);\r\n setSuccessFlag();\r\n },\r\n deleteStudyMetadataPromise,\r\n getImageIdsForDisplaySet(displaySet) {\r\n const images = displaySet.images;\r\n const imageIds = [];\r\n\r\n if (!images) {\r\n return imageIds;\r\n }\r\n\r\n displaySet.images.forEach(instance => {\r\n const NumberOfFrames = instance.NumberOfFrames;\r\n\r\n if (NumberOfFrames > 1) {\r\n for (let frame = 1; frame <= NumberOfFrames; frame++) {\r\n const imageId = this.getImageIdsForInstance({\r\n instance,\r\n frame,\r\n });\r\n imageIds.push(imageId);\r\n }\r\n } else {\r\n const imageId = this.getImageIdsForInstance({ instance });\r\n imageIds.push(imageId);\r\n }\r\n });\r\n\r\n return imageIds;\r\n },\r\n getImageIdsForInstance({ instance, frame }) {\r\n const imageIds = getImageId({\r\n instance,\r\n frame,\r\n config: dicomWebConfig,\r\n });\r\n return imageIds;\r\n },\r\n getConfig() {\r\n return dicomWebConfigCopy;\r\n },\r\n getStudyInstanceUIDs({ params, query }) {\r\n const { StudyInstanceUIDs: paramsStudyInstanceUIDs } = params;\r\n const queryStudyInstanceUIDs = utils.splitComma(query.getAll('StudyInstanceUIDs'));\r\n\r\n const StudyInstanceUIDs =\r\n (queryStudyInstanceUIDs.length && queryStudyInstanceUIDs) || paramsStudyInstanceUIDs;\r\n const StudyInstanceUIDsAsArray =\r\n StudyInstanceUIDs && Array.isArray(StudyInstanceUIDs)\r\n ? StudyInstanceUIDs\r\n : [StudyInstanceUIDs];\r\n\r\n return StudyInstanceUIDsAsArray;\r\n },\r\n };\r\n\r\n if (dicomWebConfig.supportsReject) {\r\n implementation.reject = dcm4cheeReject(dicomWebConfig.wadoRoot);\r\n }\r\n\r\n return IWebApiDataSource.create(implementation);\r\n}\r\n\r\nexport { createDicomWebApi };\r\n","export default function (wadoRoot) {\r\n return {\r\n series: (StudyInstanceUID, SeriesInstanceUID) => {\r\n return new Promise((resolve, reject) => {\r\n // Reject because of Quality. (Seems the most sensible out of the options)\r\n const CodeValueAndCodeSchemeDesignator = `113001%5EDCM`;\r\n\r\n const url = `${wadoRoot}/studies/${StudyInstanceUID}/series/${SeriesInstanceUID}/reject/${CodeValueAndCodeSchemeDesignator}`;\r\n\r\n const xhr = new XMLHttpRequest();\r\n xhr.open('POST', url, true);\r\n\r\n //Send the proper header information along with the request\r\n // TODO -> Auth when we re-add authorization.\r\n\r\n console.log(xhr);\r\n\r\n xhr.onreadystatechange = function () {\r\n //Call a function when the state changes.\r\n if (xhr.readyState == 4) {\r\n switch (xhr.status) {\r\n case 204:\r\n resolve(xhr.responseText);\r\n\r\n break;\r\n case 404:\r\n reject('Your dataSource does not support reject functionality');\r\n }\r\n }\r\n };\r\n xhr.send();\r\n });\r\n },\r\n };\r\n}\r\n","import { DicomMetadataStore, IWebApiDataSource } from '@ohif/core';\r\nimport OHIF from '@ohif/core';\r\n\r\nimport getImageId from '../DicomWebDataSource/utils/getImageId';\r\nimport getDirectURL from '../utils/getDirectURL';\r\n\r\nconst metadataProvider = OHIF.classes.MetadataProvider;\r\n\r\nconst mappings = {\r\n studyInstanceUid: 'StudyInstanceUID',\r\n patientId: 'PatientID',\r\n};\r\n\r\nlet _store = {\r\n urls: [],\r\n studyInstanceUIDMap: new Map(), // map of urls to array of study instance UIDs\r\n // {\r\n // url: url1\r\n // studies: [Study1, Study2], // if multiple studies\r\n // }\r\n // {\r\n // url: url2\r\n // studies: [Study1],\r\n // }\r\n // }\r\n};\r\n\r\nconst getMetaDataByURL = url => {\r\n return _store.urls.find(metaData => metaData.url === url);\r\n};\r\n\r\nconst findStudies = (key, value) => {\r\n let studies = [];\r\n _store.urls.map(metaData => {\r\n metaData.studies.map(aStudy => {\r\n if (aStudy[key] === value) {\r\n studies.push(aStudy);\r\n }\r\n });\r\n });\r\n return studies;\r\n};\r\n\r\nfunction createDicomJSONApi(dicomJsonConfig) {\r\n const { wadoRoot } = dicomJsonConfig;\r\n\r\n const implementation = {\r\n initialize: async ({ query, url }) => {\r\n if (!url) {\r\n url = query.get('url');\r\n }\r\n let metaData = getMetaDataByURL(url);\r\n\r\n // if we have already cached the data from this specific url\r\n // We are only handling one StudyInstanceUID to run; however,\r\n // all studies for patientID will be put in the correct tab\r\n if (metaData) {\r\n return metaData.studies.map(aStudy => {\r\n return aStudy.StudyInstanceUID;\r\n });\r\n }\r\n\r\n const response = await fetch(url);\r\n const data = await response.json();\r\n\r\n let StudyInstanceUID;\r\n let SeriesInstanceUID;\r\n data.studies.forEach(study => {\r\n StudyInstanceUID = study.StudyInstanceUID;\r\n\r\n study.series.forEach(series => {\r\n SeriesInstanceUID = series.SeriesInstanceUID;\r\n\r\n series.instances.forEach(instance => {\r\n const { url: imageId, metadata: naturalizedDicom } = instance;\r\n\r\n // Add imageId specific mapping to this data as the URL isn't necessarliy WADO-URI.\r\n metadataProvider.addImageIdToUIDs(imageId, {\r\n StudyInstanceUID,\r\n SeriesInstanceUID,\r\n SOPInstanceUID: naturalizedDicom.SOPInstanceUID,\r\n });\r\n });\r\n });\r\n });\r\n\r\n _store.urls.push({\r\n url,\r\n studies: [...data.studies],\r\n });\r\n _store.studyInstanceUIDMap.set(\r\n url,\r\n data.studies.map(study => study.StudyInstanceUID)\r\n );\r\n },\r\n query: {\r\n studies: {\r\n mapParams: () => {},\r\n search: async param => {\r\n const [key, value] = Object.entries(param)[0];\r\n const mappedParam = mappings[key];\r\n\r\n // todo: should fetch from dicomMetadataStore\r\n const studies = findStudies(mappedParam, value);\r\n\r\n return studies.map(aStudy => {\r\n return {\r\n accession: aStudy.AccessionNumber,\r\n date: aStudy.StudyDate,\r\n description: aStudy.StudyDescription,\r\n instances: aStudy.NumInstances,\r\n modalities: aStudy.Modalities,\r\n mrn: aStudy.PatientID,\r\n patientName: aStudy.PatientName,\r\n studyInstanceUid: aStudy.StudyInstanceUID,\r\n NumInstances: aStudy.NumInstances,\r\n time: aStudy.StudyTime,\r\n };\r\n });\r\n },\r\n processResults: () => {\r\n console.warn(' DICOMJson QUERY processResults not implemented');\r\n },\r\n },\r\n series: {\r\n // mapParams: mapParams.bind(),\r\n search: () => {\r\n console.warn(' DICOMJson QUERY SERIES SEARCH not implemented');\r\n },\r\n },\r\n instances: {\r\n search: () => {\r\n console.warn(' DICOMJson QUERY instances SEARCH not implemented');\r\n },\r\n },\r\n },\r\n retrieve: {\r\n /**\r\n * Generates a URL that can be used for direct retrieve of the bulkdata\r\n *\r\n * @param {object} params\r\n * @param {string} params.tag is the tag name of the URL to retrieve\r\n * @param {string} params.defaultPath path for the pixel data url\r\n * @param {object} params.instance is the instance object that the tag is in\r\n * @param {string} params.defaultType is the mime type of the response\r\n * @param {string} params.singlepart is the type of the part to retrieve\r\n * @param {string} params.fetchPart unknown?\r\n * @returns an absolute URL to the resource, if the absolute URL can be retrieved as singlepart,\r\n * or is already retrieved, or a promise to a URL for such use if a BulkDataURI\r\n */\r\n directURL: params => {\r\n return getDirectURL(wadoRoot, params);\r\n },\r\n series: {\r\n metadata: async ({ StudyInstanceUID, madeInClient = false, customSort } = {}) => {\r\n if (!StudyInstanceUID) {\r\n throw new Error('Unable to query for SeriesMetadata without StudyInstanceUID');\r\n }\r\n\r\n const study = findStudies('StudyInstanceUID', StudyInstanceUID)[0];\r\n let series;\r\n\r\n if (customSort) {\r\n series = customSort(study.series);\r\n } else {\r\n series = study.series;\r\n }\r\n\r\n const seriesSummaryMetadata = series.map(series => {\r\n const seriesSummary = {\r\n StudyInstanceUID: study.StudyInstanceUID,\r\n ...series,\r\n };\r\n delete seriesSummary.instances;\r\n return seriesSummary;\r\n });\r\n\r\n // Async load series, store as retrieved\r\n function storeInstances(naturalizedInstances) {\r\n DicomMetadataStore.addInstances(naturalizedInstances, madeInClient);\r\n }\r\n\r\n DicomMetadataStore.addSeriesMetadata(seriesSummaryMetadata, madeInClient);\r\n\r\n function setSuccessFlag() {\r\n const study = DicomMetadataStore.getStudy(StudyInstanceUID, madeInClient);\r\n study.isLoaded = true;\r\n }\r\n\r\n const numberOfSeries = series.length;\r\n series.forEach((series, index) => {\r\n const instances = series.instances.map(instance => {\r\n const obj = {\r\n ...instance.metadata,\r\n url: instance.url,\r\n imageId: instance.url,\r\n ...series,\r\n ...study,\r\n };\r\n delete obj.instances;\r\n delete obj.series;\r\n return obj;\r\n });\r\n storeInstances(instances);\r\n if (index === numberOfSeries - 1) {\r\n setSuccessFlag();\r\n }\r\n });\r\n },\r\n },\r\n },\r\n store: {\r\n dicom: () => {\r\n console.warn(' DICOMJson store dicom not implemented');\r\n },\r\n },\r\n getImageIdsForDisplaySet(displaySet) {\r\n const images = displaySet.images;\r\n const imageIds = [];\r\n\r\n if (!images) {\r\n return imageIds;\r\n }\r\n\r\n displaySet.images.forEach(instance => {\r\n const NumberOfFrames = instance.NumberOfFrames;\r\n\r\n if (NumberOfFrames > 1) {\r\n for (let i = 0; i < NumberOfFrames; i++) {\r\n const imageId = getImageId({\r\n instance,\r\n frame: i,\r\n config: dicomJsonConfig,\r\n });\r\n imageIds.push(imageId);\r\n }\r\n } else {\r\n const imageId = getImageId({ instance, config: dicomJsonConfig });\r\n imageIds.push(imageId);\r\n }\r\n });\r\n\r\n return imageIds;\r\n },\r\n getImageIdsForInstance({ instance, frame }) {\r\n const imageIds = getImageId({ instance, frame });\r\n return imageIds;\r\n },\r\n getStudyInstanceUIDs: ({ params, query }) => {\r\n const url = query.get('url');\r\n return _store.studyInstanceUIDMap.get(url);\r\n },\r\n };\r\n return IWebApiDataSource.create(implementation);\r\n}\r\n\r\nexport { createDicomJSONApi };\r\n","import { DicomMetadataStore, IWebApiDataSource, utils } from '@ohif/core';\r\nimport OHIF from '@ohif/core';\r\nimport dcmjs from 'dcmjs';\r\n\r\nconst metadataProvider = OHIF.classes.MetadataProvider;\r\nconst { EVENTS } = DicomMetadataStore;\r\n\r\nconst END_MODALITIES = {\r\n SR: true,\r\n SEG: true,\r\n DOC: true,\r\n};\r\n\r\nconst compareValue = (v1, v2, def = 0) => {\r\n if (v1 === v2) {\r\n return def;\r\n }\r\n if (v1 < v2) {\r\n return -1;\r\n }\r\n return 1;\r\n};\r\n\r\n// Sorting SR modalities to be at the end of series list\r\nconst customSort = (seriesA, seriesB) => {\r\n const instanceA = seriesA.instances[0];\r\n const instanceB = seriesB.instances[0];\r\n const modalityA = instanceA.Modality;\r\n const modalityB = instanceB.Modality;\r\n\r\n const isEndA = END_MODALITIES[modalityA];\r\n const isEndB = END_MODALITIES[modalityB];\r\n\r\n if (isEndA && isEndB) {\r\n // Compare by series date\r\n return compareValue(instanceA.SeriesNumber, instanceB.SeriesNumber);\r\n }\r\n if (!isEndA && !isEndB) {\r\n return compareValue(instanceB.SeriesNumber, instanceA.SeriesNumber);\r\n }\r\n return isEndA ? -1 : 1;\r\n};\r\n\r\nfunction createDicomLocalApi(dicomLocalConfig) {\r\n const { name } = dicomLocalConfig;\r\n\r\n const implementation = {\r\n initialize: ({ params, query }) => {},\r\n query: {\r\n studies: {\r\n mapParams: () => {},\r\n search: params => {\r\n const studyUIDs = DicomMetadataStore.getStudyInstanceUIDs();\r\n\r\n return studyUIDs.map(StudyInstanceUID => {\r\n let numInstances = 0;\r\n const modalities = new Set();\r\n\r\n // Calculating the number of instances in the study and modalities\r\n // present in the study\r\n const study = DicomMetadataStore.getStudy(StudyInstanceUID);\r\n study.series.forEach(aSeries => {\r\n numInstances += aSeries.instances.length;\r\n modalities.add(aSeries.instances[0].Modality);\r\n });\r\n\r\n // first instance in the first series\r\n const firstInstance = study?.series[0]?.instances[0];\r\n\r\n if (firstInstance) {\r\n return {\r\n accession: firstInstance.AccessionNumber,\r\n date: firstInstance.StudyDate,\r\n description: firstInstance.StudyDescription,\r\n mrn: firstInstance.PatientID,\r\n patientName: utils.formatPN(firstInstance.PatientName),\r\n studyInstanceUid: firstInstance.StudyInstanceUID,\r\n time: firstInstance.StudyTime,\r\n //\r\n instances: numInstances,\r\n modalities: Array.from(modalities).join('/'),\r\n NumInstances: numInstances,\r\n };\r\n }\r\n });\r\n },\r\n processResults: () => {\r\n console.warn(' DICOMLocal QUERY processResults not implemented');\r\n },\r\n },\r\n series: {\r\n search: studyInstanceUID => {\r\n const study = DicomMetadataStore.getStudy(studyInstanceUID);\r\n return study.series.map(aSeries => {\r\n const firstInstance = aSeries?.instances[0];\r\n return {\r\n studyInstanceUid: studyInstanceUID,\r\n seriesInstanceUid: firstInstance.SeriesInstanceUID,\r\n modality: firstInstance.Modality,\r\n seriesNumber: firstInstance.SeriesNumber,\r\n seriesDate: firstInstance.SeriesDate,\r\n numSeriesInstances: aSeries.instances.length,\r\n description: firstInstance.SeriesDescription,\r\n };\r\n });\r\n },\r\n },\r\n instances: {\r\n search: () => {\r\n console.warn(' DICOMLocal QUERY instances SEARCH not implemented');\r\n },\r\n },\r\n },\r\n retrieve: {\r\n directURL: params => {\r\n const { instance, tag, defaultType } = params;\r\n\r\n const value = instance[tag];\r\n if (value instanceof Array && value[0] instanceof ArrayBuffer) {\r\n return URL.createObjectURL(\r\n new Blob([value[0]], {\r\n type: defaultType,\r\n })\r\n );\r\n }\r\n },\r\n series: {\r\n metadata: async ({ StudyInstanceUID, madeInClient = false } = {}) => {\r\n if (!StudyInstanceUID) {\r\n throw new Error('Unable to query for SeriesMetadata without StudyInstanceUID');\r\n }\r\n\r\n // Instances metadata already added via local upload\r\n const study = DicomMetadataStore.getStudy(StudyInstanceUID, madeInClient);\r\n\r\n // Series metadata already added via local upload\r\n DicomMetadataStore._broadcastEvent(EVENTS.SERIES_ADDED, {\r\n StudyInstanceUID,\r\n madeInClient,\r\n });\r\n\r\n study.series.forEach(aSeries => {\r\n const { SeriesInstanceUID } = aSeries;\r\n\r\n const isMultiframe = aSeries.instances[0].NumberOfFrames > 1;\r\n\r\n aSeries.instances.forEach((instance, index) => {\r\n const {\r\n url: imageId,\r\n StudyInstanceUID,\r\n SeriesInstanceUID,\r\n SOPInstanceUID,\r\n } = instance;\r\n\r\n instance.imageId = imageId;\r\n\r\n // Add imageId specific mapping to this data as the URL isn't necessarily WADO-URI.\r\n metadataProvider.addImageIdToUIDs(imageId, {\r\n StudyInstanceUID,\r\n SeriesInstanceUID,\r\n SOPInstanceUID,\r\n frameIndex: isMultiframe ? index : 1,\r\n });\r\n });\r\n\r\n DicomMetadataStore._broadcastEvent(EVENTS.INSTANCES_ADDED, {\r\n StudyInstanceUID,\r\n SeriesInstanceUID,\r\n madeInClient,\r\n });\r\n });\r\n },\r\n },\r\n },\r\n store: {\r\n dicom: naturalizedReport => {\r\n const reportBlob = dcmjs.data.datasetToBlob(naturalizedReport);\r\n\r\n //Create a URL for the binary.\r\n var objectUrl = URL.createObjectURL(reportBlob);\r\n window.location.assign(objectUrl);\r\n },\r\n },\r\n getImageIdsForDisplaySet(displaySet) {\r\n const images = displaySet.images;\r\n const imageIds = [];\r\n\r\n if (!images) {\r\n return imageIds;\r\n }\r\n\r\n displaySet.images.forEach(instance => {\r\n const NumberOfFrames = instance.NumberOfFrames;\r\n if (NumberOfFrames > 1) {\r\n // in multiframe we start at frame 1\r\n for (let i = 1; i <= NumberOfFrames; i++) {\r\n const imageId = this.getImageIdsForInstance({\r\n instance,\r\n frame: i,\r\n });\r\n imageIds.push(imageId);\r\n }\r\n } else {\r\n const imageId = this.getImageIdsForInstance({ instance });\r\n imageIds.push(imageId);\r\n }\r\n });\r\n\r\n return imageIds;\r\n },\r\n getImageIdsForInstance({ instance, frame }) {\r\n const { StudyInstanceUID, SeriesInstanceUID, SOPInstanceUID } = instance;\r\n const storedInstance = DicomMetadataStore.getInstance(\r\n StudyInstanceUID,\r\n SeriesInstanceUID,\r\n SOPInstanceUID\r\n );\r\n\r\n let imageId = storedInstance.url;\r\n\r\n if (frame !== undefined) {\r\n imageId += `&frame=${frame}`;\r\n }\r\n\r\n return imageId;\r\n },\r\n deleteStudyMetadataPromise() {\r\n console.log('deleteStudyMetadataPromise not implemented');\r\n },\r\n getStudyInstanceUIDs: ({ params, query }) => {\r\n const { StudyInstanceUIDs: paramsStudyInstanceUIDs } = params;\r\n const queryStudyInstanceUIDs = query.getAll('StudyInstanceUIDs');\r\n\r\n const StudyInstanceUIDs = queryStudyInstanceUIDs || paramsStudyInstanceUIDs;\r\n const StudyInstanceUIDsAsArray =\r\n StudyInstanceUIDs && Array.isArray(StudyInstanceUIDs)\r\n ? StudyInstanceUIDs\r\n : [StudyInstanceUIDs];\r\n\r\n // Put SRs at the end of series list to make sure images are loaded first\r\n let isStudyInCache = false;\r\n StudyInstanceUIDsAsArray.forEach(StudyInstanceUID => {\r\n const study = DicomMetadataStore.getStudy(StudyInstanceUID);\r\n if (study) {\r\n study.series = study.series.sort(customSort);\r\n isStudyInCache = true;\r\n }\r\n });\r\n\r\n return isStudyInCache ? StudyInstanceUIDsAsArray : [];\r\n },\r\n };\r\n return IWebApiDataSource.create(implementation);\r\n}\r\n\r\nexport { createDicomLocalApi };\r\n","import { IWebApiDataSource } from '@ohif/core';\r\nimport { createDicomWebApi } from '../DicomWebDataSource/index';\r\n\r\n/**\r\n * This datasource is initialized with a url that returns a JSON object with a\r\n * dicomWeb datasource configuration array present in a \"servers\" object.\r\n *\r\n * Only the first array item is parsed, if there are multiple items in the\r\n * dicomWeb configuration array\r\n *\r\n */\r\nfunction createDicomWebProxyApi(dicomWebProxyConfig, UserAuthenticationService) {\r\n const { name } = dicomWebProxyConfig;\r\n let dicomWebDelegate = undefined;\r\n\r\n const implementation = {\r\n initialize: async ({ params, query }) => {\r\n const url = query.get('url');\r\n\r\n if (!url) {\r\n throw new Error(`No url for '${name}'`);\r\n } else {\r\n const response = await fetch(url);\r\n let data = await response.json();\r\n if (!data.servers?.dicomWeb?.[0]) {\r\n throw new Error('Invalid configuration returned by url');\r\n }\r\n\r\n dicomWebDelegate = createDicomWebApi(\r\n data.servers.dicomWeb[0].configuration,\r\n UserAuthenticationService\r\n );\r\n dicomWebDelegate.initialize({ params, query });\r\n }\r\n },\r\n query: {\r\n studies: {\r\n search: params => dicomWebDelegate.query.studies.search(params),\r\n },\r\n series: {\r\n search: (...args) => dicomWebDelegate.query.series.search(...args),\r\n },\r\n instances: {\r\n search: (studyInstanceUid, queryParameters) =>\r\n dicomWebDelegate.query.instances.search(studyInstanceUid, queryParameters),\r\n },\r\n },\r\n retrieve: {\r\n directURL: (...args) => dicomWebDelegate.retrieve.directURL(...args),\r\n series: {\r\n metadata: async (...args) => dicomWebDelegate.retrieve.series.metadata(...args),\r\n },\r\n },\r\n store: {\r\n dicom: (...args) => dicomWebDelegate.store(...args),\r\n },\r\n deleteStudyMetadataPromise: (...args) => dicomWebDelegate.deleteStudyMetadataPromise(...args),\r\n getImageIdsForDisplaySet: (...args) => dicomWebDelegate.getImageIdsForDisplaySet(...args),\r\n getImageIdsForInstance: (...args) => dicomWebDelegate.getImageIdsForInstance(...args),\r\n getStudyInstanceUIDs({ params, query }) {\r\n let studyInstanceUIDs = [];\r\n\r\n // there seem to be a couple of variations of the case for this parameter\r\n const queryStudyInstanceUIDs =\r\n query.get('studyInstanceUIDs') || query.get('studyInstanceUids');\r\n if (!queryStudyInstanceUIDs) {\r\n throw new Error(`No studyInstanceUids in request for '${name}'`);\r\n }\r\n studyInstanceUIDs = queryStudyInstanceUIDs.split(';');\r\n return studyInstanceUIDs;\r\n },\r\n };\r\n return IWebApiDataSource.create(implementation);\r\n}\r\n\r\nexport { createDicomWebProxyApi };\r\n","// TODO: Pull in IWebClientApi from @ohif/core\r\n// TODO: Use constructor to create an instance of IWebClientApi\r\n// TODO: Use existing DICOMWeb configuration (previously, appConfig, to configure instance)\r\n\r\nimport { createDicomWebApi } from './DicomWebDataSource/index.js';\r\nimport { createDicomJSONApi } from './DicomJSONDataSource/index.js';\r\nimport { createDicomLocalApi } from './DicomLocalDataSource/index.js';\r\nimport { createDicomWebProxyApi } from './DicomWebProxyDataSource/index.js';\r\n\r\n/**\r\n *\r\n */\r\nfunction getDataSourcesModule() {\r\n return [\r\n {\r\n name: 'dicomweb',\r\n type: 'webApi',\r\n createDataSource: createDicomWebApi,\r\n },\r\n {\r\n name: 'dicomwebproxy',\r\n type: 'webApi',\r\n createDataSource: createDicomWebProxyApi,\r\n },\r\n {\r\n name: 'dicomjson',\r\n type: 'jsonApi',\r\n createDataSource: createDicomJSONApi,\r\n },\r\n {\r\n name: 'dicomlocal',\r\n type: 'localApi',\r\n createDataSource: createDicomLocalApi,\r\n },\r\n ];\r\n}\r\n\r\nexport default getDataSourcesModule;\r\n","import React, { useEffect, useState, useCallback } from 'react';\r\nimport classnames from 'classnames';\r\n\r\nexport default function Toolbar({ servicesManager }) {\r\n const { toolbarService } = servicesManager.services;\r\n const [toolbarButtons, setToolbarButtons] = useState([]);\r\n\r\n useEffect(() => {\r\n const { unsubscribe } = toolbarService.subscribe(toolbarService.EVENTS.TOOL_BAR_MODIFIED, () =>\r\n setToolbarButtons(toolbarService.getButtonSection('primary'))\r\n );\r\n\r\n return () => {\r\n unsubscribe();\r\n };\r\n }, [toolbarService]);\r\n\r\n const onInteraction = useCallback(\r\n args => toolbarService.recordInteraction(args),\r\n [toolbarService]\r\n );\r\n\r\n return (\r\n <>\r\n {toolbarButtons.map(toolDef => {\r\n const { id, Component, componentProps } = toolDef;\r\n return (\r\n // The margin for separating the tools on the toolbar should go here and NOT in each individual component (button) item.\r\n // This allows for the individual items to be included in other UI components where perhaps alternative margins are desired.\r\n \r\n \r\n \r\n );\r\n })}\r\n \r\n );\r\n}\r\n","import React from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useLocation } from 'react-router';\r\n\r\nimport { ErrorBoundary, UserPreferences, AboutModal, Header, useModal } from '@ohif/ui';\r\nimport i18n from '@ohif/i18n';\r\nimport { hotkeys } from '@ohif/core';\r\nimport { useAppConfig } from '@state';\r\nimport Toolbar from '../Toolbar/Toolbar';\r\n\r\nconst { availableLanguages, defaultLanguage, currentLanguage } = i18n;\r\n\r\nfunction ViewerHeader({ hotkeysManager, extensionManager, servicesManager }) {\r\n const [appConfig] = useAppConfig();\r\n const navigate = useNavigate();\r\n const location = useLocation();\r\n\r\n const onClickReturnButton = () => {\r\n const { pathname } = location;\r\n const dataSourceIdx = pathname.indexOf('/', 1);\r\n const query = new URLSearchParams(window.location.search);\r\n const configUrl = query.get('configUrl');\r\n\r\n const dataSourceName = pathname.substring(dataSourceIdx + 1);\r\n const existingDataSource = extensionManager.getDataSources(dataSourceName);\r\n\r\n const searchQuery = new URLSearchParams();\r\n if (dataSourceIdx !== -1 && existingDataSource) {\r\n searchQuery.append('datasources', pathname.substring(dataSourceIdx + 1));\r\n }\r\n\r\n if (configUrl) {\r\n searchQuery.append('configUrl', configUrl);\r\n }\r\n\r\n navigate({\r\n pathname: '/',\r\n search: decodeURIComponent(searchQuery.toString()),\r\n });\r\n };\r\n\r\n const { t } = useTranslation();\r\n const { show, hide } = useModal();\r\n const { hotkeyDefinitions, hotkeyDefaults } = hotkeysManager;\r\n const versionNumber = process.env.VERSION_NUMBER;\r\n const commitHash = process.env.COMMIT_HASH;\r\n\r\n const menuOptions = [\r\n {\r\n title: t('Header:About'),\r\n icon: 'info',\r\n onClick: () =>\r\n show({\r\n content: AboutModal,\r\n title: 'About OHIF Viewer',\r\n contentProps: { versionNumber, commitHash },\r\n }),\r\n },\r\n {\r\n title: t('Header:Preferences'),\r\n icon: 'settings',\r\n onClick: () =>\r\n show({\r\n title: t('UserPreferencesModal:User Preferences'),\r\n content: UserPreferences,\r\n contentProps: {\r\n hotkeyDefaults: hotkeysManager.getValidHotkeyDefinitions(hotkeyDefaults),\r\n hotkeyDefinitions,\r\n currentLanguage: currentLanguage(),\r\n availableLanguages,\r\n defaultLanguage,\r\n onCancel: () => {\r\n hotkeys.stopRecord();\r\n hotkeys.unpause();\r\n hide();\r\n },\r\n onSubmit: ({ hotkeyDefinitions, language }) => {\r\n if (language.value !== currentLanguage().value) {\r\n i18n.changeLanguage(language.value);\r\n }\r\n hotkeysManager.setHotkeys(hotkeyDefinitions);\r\n hide();\r\n },\r\n onReset: () => hotkeysManager.restoreDefaultBindings(),\r\n hotkeysModule: hotkeys,\r\n },\r\n }),\r\n },\r\n ];\r\n\r\n if (appConfig.oidc) {\r\n menuOptions.push({\r\n title: t('Header:Logout'),\r\n icon: 'power-off',\r\n onClick: async () => {\r\n navigate(`/logout?redirect_uri=${encodeURIComponent(window.location.href)}`);\r\n },\r\n });\r\n }\r\n\r\n return (\r\n \r\n \r\n
\r\n \r\n
\r\n
\r\n \r\n );\r\n}\r\n\r\nexport default ViewerHeader;\r\n","import React, { useEffect, useState } from 'react';\r\nimport { SidePanel } from '@ohif/ui';\r\nimport { PanelService, ServicesManager } from '@ohif/core';\r\n\r\nexport type SidePanelWithServicesProps = {\r\n servicesManager: ServicesManager;\r\n side: 'left' | 'right';\r\n className: string;\r\n activeTabIndex: number;\r\n tabs: any;\r\n};\r\n\r\nconst SidePanelWithServices = ({\r\n servicesManager,\r\n side,\r\n className,\r\n activeTabIndex: activeTabIndexProp,\r\n tabs,\r\n}) => {\r\n const panelService: PanelService = servicesManager?.services?.panelService;\r\n\r\n // Tracks whether this SidePanel has been opened at least once since this SidePanel was inserted into the DOM.\r\n // Thus going to the Study List page and back to the viewer resets this flag for a SidePanel.\r\n const [hasBeenOpened, setHasBeenOpened] = useState(false);\r\n const [activeTabIndex, setActiveTabIndex] = useState(activeTabIndexProp);\r\n\r\n useEffect(() => {\r\n if (panelService) {\r\n const activatePanelSubscription = panelService.subscribe(\r\n panelService.EVENTS.ACTIVATE_PANEL,\r\n (activatePanelEvent: Types.ActivatePanelEvent) => {\r\n if (!hasBeenOpened || activatePanelEvent.forceActive) {\r\n const tabIndex = tabs.findIndex(tab => tab.id === activatePanelEvent.panelId);\r\n if (tabIndex !== -1) {\r\n setActiveTabIndex(tabIndex);\r\n }\r\n }\r\n }\r\n );\r\n\r\n return () => {\r\n activatePanelSubscription.unsubscribe();\r\n };\r\n }\r\n }, [tabs, hasBeenOpened, panelService]);\r\n\r\n return (\r\n {\r\n setHasBeenOpened(true);\r\n }}\r\n >\r\n );\r\n};\r\n\r\nexport default SidePanelWithServices;\r\n","import React, { useEffect, useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport { SidePanel, ErrorBoundary, LoadingIndicatorProgress } from '@ohif/ui';\r\nimport { ServicesManager, HangingProtocolService, CommandsManager } from '@ohif/core';\r\nimport { useAppConfig } from '@state';\r\nimport ViewerHeader from './ViewerHeader';\r\nimport SidePanelWithServices from '../Components/SidePanelWithServices';\r\n\r\nfunction ViewerLayout({\r\n // From Extension Module Params\r\n extensionManager,\r\n servicesManager,\r\n hotkeysManager,\r\n commandsManager,\r\n // From Modes\r\n viewports,\r\n ViewportGridComp,\r\n leftPanels = [],\r\n rightPanels = [],\r\n leftPanelDefaultClosed = false,\r\n rightPanelDefaultClosed = false,\r\n}): React.FunctionComponent {\r\n const [appConfig] = useAppConfig();\r\n\r\n const { hangingProtocolService } = servicesManager.services;\r\n const [showLoadingIndicator, setShowLoadingIndicator] = useState(appConfig.showLoadingIndicator);\r\n\r\n /**\r\n * Set body classes (tailwindcss) that don't allow vertical\r\n * or horizontal overflow (no scrolling). Also guarantee window\r\n * is sized to our viewport.\r\n */\r\n useEffect(() => {\r\n document.body.classList.add('bg-black');\r\n document.body.classList.add('overflow-hidden');\r\n return () => {\r\n document.body.classList.remove('bg-black');\r\n document.body.classList.remove('overflow-hidden');\r\n };\r\n }, []);\r\n\r\n const getComponent = id => {\r\n const entry = extensionManager.getModuleEntry(id);\r\n\r\n if (!entry) {\r\n throw new Error(\r\n `${id} is not valid for an extension module. Please verify your configuration or ensure that the extension is properly registered. It's also possible that your mode is utilizing a module from an extension that hasn't been included in its dependencies (add the extension to the \"extensionDependencies\" array in your mode's index.js file)`\r\n );\r\n }\r\n\r\n let content;\r\n if (entry && entry.component) {\r\n content = entry.component;\r\n } else {\r\n throw new Error(\r\n `No component found from extension ${id}. Check the reference string to the extension in your Mode configuration`\r\n );\r\n }\r\n\r\n return { entry, content };\r\n };\r\n\r\n const getPanelData = id => {\r\n const { content, entry } = getComponent(id);\r\n\r\n return {\r\n id: entry.id,\r\n iconName: entry.iconName,\r\n iconLabel: entry.iconLabel,\r\n label: entry.label,\r\n name: entry.name,\r\n content,\r\n };\r\n };\r\n\r\n useEffect(() => {\r\n const { unsubscribe } = hangingProtocolService.subscribe(\r\n HangingProtocolService.EVENTS.PROTOCOL_CHANGED,\r\n\r\n // Todo: right now to set the loading indicator to false, we need to wait for the\r\n // hangingProtocolService to finish applying the viewport matching to each viewport,\r\n // however, this might not be the only approach to set the loading indicator to false. we need to explore this further.\r\n () => {\r\n setShowLoadingIndicator(false);\r\n }\r\n );\r\n\r\n return () => {\r\n unsubscribe();\r\n };\r\n }, [hangingProtocolService]);\r\n\r\n const getViewportComponentData = viewportComponent => {\r\n const { entry } = getComponent(viewportComponent.namespace);\r\n\r\n return {\r\n component: entry.component,\r\n displaySetsToDisplay: viewportComponent.displaySetsToDisplay,\r\n };\r\n };\r\n\r\n const leftPanelComponents = leftPanels.map(getPanelData);\r\n const rightPanelComponents = rightPanels.map(getPanelData);\r\n const viewportComponents = viewports.map(getViewportComponentData);\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n {showLoadingIndicator && }\r\n {/* LEFT SIDEPANELS */}\r\n {leftPanelComponents.length ? (\r\n \r\n \r\n \r\n ) : null}\r\n {/* TOOLBAR + GRID */}\r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n {rightPanelComponents.length ? (\r\n \r\n \r\n \r\n ) : null}\r\n
\r\n
\r\n \r\n );\r\n}\r\n\r\nViewerLayout.propTypes = {\r\n // From extension module params\r\n extensionManager: PropTypes.shape({\r\n getModuleEntry: PropTypes.func.isRequired,\r\n }).isRequired,\r\n commandsManager: PropTypes.instanceOf(CommandsManager),\r\n servicesManager: PropTypes.instanceOf(ServicesManager),\r\n // From modes\r\n leftPanels: PropTypes.array,\r\n rightPanels: PropTypes.array,\r\n leftPanelDefaultClosed: PropTypes.bool.isRequired,\r\n rightPanelDefaultClosed: PropTypes.bool.isRequired,\r\n /** Responsible for rendering our grid of viewports; provided by consuming application */\r\n children: PropTypes.oneOfType([PropTypes.node, PropTypes.func]).isRequired,\r\n viewports: PropTypes.array,\r\n};\r\n\r\nexport default ViewerLayout;\r\n","import React, { useState, useEffect, useRef } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { StudyBrowser, useImageViewer, useViewportGrid } from '@ohif/ui';\r\nimport { utils } from '@ohif/core';\r\nimport { useNavigate } from 'react-router-dom';\r\n\r\nconst { sortStudyInstances, formatDate } = utils;\r\n\r\n/**\r\n *\r\n * @param {*} param0\r\n */\r\nfunction PanelStudyBrowser({\r\n servicesManager,\r\n getImageSrc,\r\n getStudiesForPatientByMRN,\r\n requestDisplaySetCreationForStudy,\r\n dataSource,\r\n}) {\r\n const { hangingProtocolService, displaySetService, uiNotificationService } =\r\n servicesManager.services;\r\n const navigate = useNavigate();\r\n\r\n // Normally you nest the components so the tree isn't so deep, and the data\r\n // doesn't have to have such an intense shape. This works well enough for now.\r\n // Tabs --> Studies --> DisplaySets --> Thumbnails\r\n const { StudyInstanceUIDs } = useImageViewer();\r\n const [{ activeViewportId, viewports }, viewportGridService] = useViewportGrid();\r\n const [activeTabName, setActiveTabName] = useState('primary');\r\n const [expandedStudyInstanceUIDs, setExpandedStudyInstanceUIDs] = useState([\r\n ...StudyInstanceUIDs,\r\n ]);\r\n const [studyDisplayList, setStudyDisplayList] = useState([]);\r\n const [displaySets, setDisplaySets] = useState([]);\r\n const [thumbnailImageSrcMap, setThumbnailImageSrcMap] = useState({});\r\n\r\n const onDoubleClickThumbnailHandler = displaySetInstanceUID => {\r\n let updatedViewports = [];\r\n const viewportId = activeViewportId;\r\n try {\r\n updatedViewports = hangingProtocolService.getViewportsRequireUpdate(\r\n viewportId,\r\n displaySetInstanceUID\r\n );\r\n } catch (error) {\r\n console.warn(error);\r\n uiNotificationService.show({\r\n title: 'Thumbnail Double Click',\r\n message: 'The selected display sets could not be added to the viewport.',\r\n type: 'info',\r\n duration: 3000,\r\n });\r\n }\r\n\r\n viewportGridService.setDisplaySetsForViewports(updatedViewports);\r\n };\r\n\r\n // ~~ studyDisplayList\r\n useEffect(() => {\r\n // Fetch all studies for the patient in each primary study\r\n async function fetchStudiesForPatient(StudyInstanceUID) {\r\n // current study qido\r\n const qidoForStudyUID = await dataSource.query.studies.search({\r\n studyInstanceUid: StudyInstanceUID,\r\n });\r\n\r\n if (!qidoForStudyUID?.length) {\r\n navigate('/notfoundstudy', '_self');\r\n throw new Error('Invalid study URL');\r\n }\r\n\r\n let qidoStudiesForPatient = qidoForStudyUID;\r\n\r\n // try to fetch the prior studies based on the patientID if the\r\n // server can respond.\r\n try {\r\n qidoStudiesForPatient = await getStudiesForPatientByMRN(qidoForStudyUID);\r\n } catch (error) {\r\n console.warn(error);\r\n }\r\n\r\n const mappedStudies = _mapDataSourceStudies(qidoStudiesForPatient);\r\n const actuallyMappedStudies = mappedStudies.map(qidoStudy => {\r\n return {\r\n studyInstanceUid: qidoStudy.StudyInstanceUID,\r\n date: formatDate(qidoStudy.StudyDate),\r\n description: qidoStudy.StudyDescription,\r\n modalities: qidoStudy.ModalitiesInStudy,\r\n numInstances: qidoStudy.NumInstances,\r\n };\r\n });\r\n\r\n setStudyDisplayList(prevArray => {\r\n const ret = [...prevArray];\r\n for (const study of actuallyMappedStudies) {\r\n if (!prevArray.find(it => it.studyInstanceUid === study.studyInstanceUid)) {\r\n ret.push(study);\r\n }\r\n }\r\n return ret;\r\n });\r\n }\r\n\r\n StudyInstanceUIDs.forEach(sid => fetchStudiesForPatient(sid));\r\n }, [StudyInstanceUIDs, dataSource, getStudiesForPatientByMRN, navigate]);\r\n\r\n // // ~~ Initial Thumbnails\r\n useEffect(() => {\r\n const currentDisplaySets = displaySetService.activeDisplaySets;\r\n currentDisplaySets.forEach(async dSet => {\r\n const newImageSrcEntry = {};\r\n const displaySet = displaySetService.getDisplaySetByUID(dSet.displaySetInstanceUID);\r\n const imageIds = dataSource.getImageIdsForDisplaySet(displaySet);\r\n const imageId = imageIds[Math.floor(imageIds.length / 2)];\r\n\r\n // TODO: Is it okay that imageIds are not returned here for SR displaySets?\r\n if (!imageId || displaySet?.unsupported) {\r\n return;\r\n }\r\n // When the image arrives, render it and store the result in the thumbnailImgSrcMap\r\n newImageSrcEntry[dSet.displaySetInstanceUID] = await getImageSrc(imageId);\r\n\r\n setThumbnailImageSrcMap(prevState => {\r\n return { ...prevState, ...newImageSrcEntry };\r\n });\r\n });\r\n }, [StudyInstanceUIDs, dataSource, displaySetService, getImageSrc]);\r\n\r\n // ~~ displaySets\r\n useEffect(() => {\r\n // TODO: Are we sure `activeDisplaySets` will always be accurate?\r\n const currentDisplaySets = displaySetService.activeDisplaySets;\r\n const mappedDisplaySets = _mapDisplaySets(currentDisplaySets, thumbnailImageSrcMap);\r\n sortStudyInstances(mappedDisplaySets);\r\n\r\n setDisplaySets(mappedDisplaySets);\r\n }, [StudyInstanceUIDs, thumbnailImageSrcMap, displaySetService]);\r\n\r\n // ~~ subscriptions --> displaySets\r\n useEffect(() => {\r\n // DISPLAY_SETS_ADDED returns an array of DisplaySets that were added\r\n const SubscriptionDisplaySetsAdded = displaySetService.subscribe(\r\n displaySetService.EVENTS.DISPLAY_SETS_ADDED,\r\n data => {\r\n const { displaySetsAdded, options } = data;\r\n displaySetsAdded.forEach(async dSet => {\r\n const newImageSrcEntry = {};\r\n const displaySet = displaySetService.getDisplaySetByUID(dSet.displaySetInstanceUID);\r\n if (displaySet?.unsupported) {\r\n return;\r\n }\r\n\r\n const imageIds = dataSource.getImageIdsForDisplaySet(displaySet);\r\n const imageId = imageIds[Math.floor(imageIds.length / 2)];\r\n\r\n // TODO: Is it okay that imageIds are not returned here for SR displaysets?\r\n if (!imageId) {\r\n return;\r\n }\r\n // When the image arrives, render it and store the result in the thumbnailImgSrcMap\r\n newImageSrcEntry[dSet.displaySetInstanceUID] = await getImageSrc(\r\n imageId,\r\n dSet.initialViewport\r\n );\r\n\r\n setThumbnailImageSrcMap(prevState => {\r\n return { ...prevState, ...newImageSrcEntry };\r\n });\r\n });\r\n }\r\n );\r\n\r\n return () => {\r\n SubscriptionDisplaySetsAdded.unsubscribe();\r\n };\r\n }, [getImageSrc, dataSource, displaySetService]);\r\n\r\n useEffect(() => {\r\n // TODO: Will this always hold _all_ the displaySets we care about?\r\n // DISPLAY_SETS_CHANGED returns `DisplaySerService.activeDisplaySets`\r\n const SubscriptionDisplaySetsChanged = displaySetService.subscribe(\r\n displaySetService.EVENTS.DISPLAY_SETS_CHANGED,\r\n changedDisplaySets => {\r\n const mappedDisplaySets = _mapDisplaySets(changedDisplaySets, thumbnailImageSrcMap);\r\n setDisplaySets(mappedDisplaySets);\r\n }\r\n );\r\n\r\n const SubscriptionDisplaySetMetaDataInvalidated = displaySetService.subscribe(\r\n displaySetService.EVENTS.DISPLAY_SET_SERIES_METADATA_INVALIDATED,\r\n () => {\r\n const mappedDisplaySets = _mapDisplaySets(\r\n displaySetService.getActiveDisplaySets(),\r\n thumbnailImageSrcMap\r\n );\r\n\r\n setDisplaySets(mappedDisplaySets);\r\n }\r\n );\r\n\r\n return () => {\r\n SubscriptionDisplaySetsChanged.unsubscribe();\r\n SubscriptionDisplaySetMetaDataInvalidated.unsubscribe();\r\n };\r\n }, [StudyInstanceUIDs, thumbnailImageSrcMap, displaySetService]);\r\n\r\n const tabs = _createStudyBrowserTabs(StudyInstanceUIDs, studyDisplayList, displaySets);\r\n\r\n // TODO: Should not fire this on \"close\"\r\n function _handleStudyClick(StudyInstanceUID) {\r\n const shouldCollapseStudy = expandedStudyInstanceUIDs.includes(StudyInstanceUID);\r\n const updatedExpandedStudyInstanceUIDs = shouldCollapseStudy\r\n ? // eslint-disable-next-line prettier/prettier\r\n [...expandedStudyInstanceUIDs.filter(stdyUid => stdyUid !== StudyInstanceUID)]\r\n : [...expandedStudyInstanceUIDs, StudyInstanceUID];\r\n\r\n setExpandedStudyInstanceUIDs(updatedExpandedStudyInstanceUIDs);\r\n\r\n if (!shouldCollapseStudy) {\r\n const madeInClient = true;\r\n requestDisplaySetCreationForStudy(displaySetService, StudyInstanceUID, madeInClient);\r\n }\r\n }\r\n\r\n const activeDisplaySetInstanceUIDs = viewports.get(activeViewportId)?.displaySetInstanceUIDs;\r\n\r\n return (\r\n {\r\n setActiveTabName(clickedTabName);\r\n }}\r\n />\r\n );\r\n}\r\n\r\nPanelStudyBrowser.propTypes = {\r\n servicesManager: PropTypes.object.isRequired,\r\n dataSource: PropTypes.shape({\r\n getImageIdsForDisplaySet: PropTypes.func.isRequired,\r\n }).isRequired,\r\n getImageSrc: PropTypes.func.isRequired,\r\n getStudiesForPatientByMRN: PropTypes.func.isRequired,\r\n requestDisplaySetCreationForStudy: PropTypes.func.isRequired,\r\n};\r\n\r\nexport default PanelStudyBrowser;\r\n\r\n/**\r\n * Maps from the DataSource's format to a naturalized object\r\n *\r\n * @param {*} studies\r\n */\r\nfunction _mapDataSourceStudies(studies) {\r\n return studies.map(study => {\r\n // TODO: Why does the data source return in this format?\r\n return {\r\n AccessionNumber: study.accession,\r\n StudyDate: study.date,\r\n StudyDescription: study.description,\r\n NumInstances: study.instances,\r\n ModalitiesInStudy: study.modalities,\r\n PatientID: study.mrn,\r\n PatientName: study.patientName,\r\n StudyInstanceUID: study.studyInstanceUid,\r\n StudyTime: study.time,\r\n };\r\n });\r\n}\r\n\r\nfunction _mapDisplaySets(displaySets, thumbnailImageSrcMap) {\r\n const thumbnailDisplaySets = [];\r\n const thumbnailNoImageDisplaySets = [];\r\n\r\n displaySets\r\n .filter(ds => !ds.excludeFromThumbnailBrowser)\r\n .forEach(ds => {\r\n const imageSrc = thumbnailImageSrcMap[ds.displaySetInstanceUID];\r\n const componentType = _getComponentType(ds);\r\n\r\n const array =\r\n componentType === 'thumbnail' ? thumbnailDisplaySets : thumbnailNoImageDisplaySets;\r\n\r\n array.push({\r\n displaySetInstanceUID: ds.displaySetInstanceUID,\r\n description: ds.SeriesDescription || '',\r\n seriesNumber: ds.SeriesNumber,\r\n modality: ds.Modality,\r\n seriesDate: ds.SeriesDate,\r\n seriesTime: ds.SeriesTime,\r\n numInstances: ds.numImageFrames,\r\n countIcon: ds.countIcon,\r\n StudyInstanceUID: ds.StudyInstanceUID,\r\n messages: ds.messages,\r\n componentType,\r\n imageSrc,\r\n dragData: {\r\n type: 'displayset',\r\n displaySetInstanceUID: ds.displaySetInstanceUID,\r\n // .. Any other data to pass\r\n },\r\n isHydratedForDerivedDisplaySet: ds.isHydrated,\r\n });\r\n });\r\n\r\n return [...thumbnailDisplaySets, ...thumbnailNoImageDisplaySets];\r\n}\r\n\r\nconst thumbnailNoImageModalities = ['SR', 'SEG', 'SM', 'RTSTRUCT', 'RTPLAN', 'RTDOSE'];\r\n\r\nfunction _getComponentType(ds) {\r\n if (thumbnailNoImageModalities.includes(ds.Modality) || ds?.unsupported) {\r\n // TODO probably others.\r\n return 'thumbnailNoImage';\r\n }\r\n\r\n return 'thumbnail';\r\n}\r\n\r\n/**\r\n *\r\n * @param {string[]} primaryStudyInstanceUIDs\r\n * @param {object[]} studyDisplayList\r\n * @param {string} studyDisplayList.studyInstanceUid\r\n * @param {string} studyDisplayList.date\r\n * @param {string} studyDisplayList.description\r\n * @param {string} studyDisplayList.modalities\r\n * @param {number} studyDisplayList.numInstances\r\n * @param {object[]} displaySets\r\n * @returns tabs - The prop object expected by the StudyBrowser component\r\n */\r\nfunction _createStudyBrowserTabs(primaryStudyInstanceUIDs, studyDisplayList, displaySets) {\r\n const primaryStudies = [];\r\n const recentStudies = [];\r\n const allStudies = [];\r\n\r\n studyDisplayList.forEach(study => {\r\n const displaySetsForStudy = displaySets.filter(\r\n ds => ds.StudyInstanceUID === study.studyInstanceUid\r\n );\r\n const tabStudy = Object.assign({}, study, {\r\n displaySets: displaySetsForStudy,\r\n });\r\n\r\n if (primaryStudyInstanceUIDs.includes(study.studyInstanceUid)) {\r\n primaryStudies.push(tabStudy);\r\n } else {\r\n // TODO: Filter allStudies to dates within one year of current date\r\n recentStudies.push(tabStudy);\r\n allStudies.push(tabStudy);\r\n }\r\n });\r\n\r\n const tabs = [\r\n {\r\n name: 'primary',\r\n label: 'Primary',\r\n studies: primaryStudies,\r\n },\r\n {\r\n name: 'recent',\r\n label: 'Recent',\r\n studies: recentStudies,\r\n },\r\n {\r\n name: 'all',\r\n label: 'All',\r\n studies: allStudies,\r\n },\r\n ];\r\n\r\n return tabs;\r\n}\r\n","/**\r\n * @param {*} cornerstone\r\n * @param {*} imageId\r\n */\r\nfunction getImageSrcFromImageId(cornerstone, imageId) {\r\n return new Promise((resolve, reject) => {\r\n const canvas = document.createElement('canvas');\r\n cornerstone.utilities\r\n .loadImageToCanvas({ canvas, imageId })\r\n .then(imageId => {\r\n resolve(canvas.toDataURL());\r\n })\r\n .catch(reject);\r\n });\r\n}\r\nexport default getImageSrcFromImageId;\r\n","async function getStudiesForPatientByMRN(dataSource, qidoForStudyUID) {\r\n if (qidoForStudyUID && qidoForStudyUID.length && qidoForStudyUID[0].mrn) {\r\n return dataSource.query.studies.search({\r\n patientId: qidoForStudyUID[0].mrn,\r\n });\r\n }\r\n console.log('No mrn found for', qidoForStudyUID);\r\n return qidoForStudyUID;\r\n}\r\n\r\nexport default getStudiesForPatientByMRN;\r\n","function requestDisplaySetCreationForStudy(\r\n dataSource,\r\n displaySetService,\r\n StudyInstanceUID,\r\n madeInClient\r\n) {\r\n // TODO: is this already short-circuited by the map of Retrieve promises?\r\n if (\r\n displaySetService.activeDisplaySets.some(\r\n displaySet => displaySet.StudyInstanceUID === StudyInstanceUID\r\n )\r\n ) {\r\n return;\r\n }\r\n\r\n dataSource.retrieve.series.metadata({ StudyInstanceUID, madeInClient });\r\n}\r\n\r\nexport default requestDisplaySetCreationForStudy;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\n//\r\nimport PanelStudyBrowser from './PanelStudyBrowser';\r\nimport getImageSrcFromImageId from './getImageSrcFromImageId';\r\nimport getStudiesForPatientByMRN from './getStudiesForPatientByMRN';\r\nimport requestDisplaySetCreationForStudy from './requestDisplaySetCreationForStudy';\r\n\r\n/**\r\n * Wraps the PanelStudyBrowser and provides features afforded by managers/services\r\n *\r\n * @param {object} params\r\n * @param {object} commandsManager\r\n * @param {object} extensionManager\r\n */\r\nfunction WrappedPanelStudyBrowser({ commandsManager, extensionManager, servicesManager }) {\r\n // TODO: This should be made available a different way; route should have\r\n // already determined our datasource\r\n const dataSource = extensionManager.getDataSources()[0];\r\n const _getStudiesForPatientByMRN = getStudiesForPatientByMRN.bind(null, dataSource);\r\n const _getImageSrcFromImageId = _createGetImageSrcFromImageIdFn(extensionManager);\r\n const _requestDisplaySetCreationForStudy = requestDisplaySetCreationForStudy.bind(\r\n null,\r\n dataSource\r\n );\r\n\r\n return (\r\n \r\n );\r\n}\r\n\r\n/**\r\n * Grabs cornerstone library reference using a dependent command from\r\n * the @ohif/extension-cornerstone extension. Then creates a helper function\r\n * that can take an imageId and return an image src.\r\n *\r\n * @param {func} getCommand - CommandManager's getCommand method\r\n * @returns {func} getImageSrcFromImageId - A utility function powered by\r\n * cornerstone\r\n */\r\nfunction _createGetImageSrcFromImageIdFn(extensionManager) {\r\n const utilities = extensionManager.getModuleEntry(\r\n '@ohif/extension-cornerstone.utilityModule.common'\r\n );\r\n\r\n try {\r\n const { cornerstone } = utilities.exports.getCornerstoneLibraries();\r\n return getImageSrcFromImageId.bind(null, cornerstone);\r\n } catch (ex) {\r\n throw new Error('Required command not found');\r\n }\r\n}\r\n\r\nWrappedPanelStudyBrowser.propTypes = {\r\n commandsManager: PropTypes.object.isRequired,\r\n extensionManager: PropTypes.object.isRequired,\r\n servicesManager: PropTypes.object.isRequired,\r\n};\r\n\r\nexport default WrappedPanelStudyBrowser;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nimport { LegacyButton, LegacyButtonGroup } from '@ohif/ui';\r\n\r\nfunction ActionButtons({ onExportClick, onCreateReportClick }) {\r\n const { t } = useTranslation('MeasurementTable');\r\n\r\n return (\r\n \r\n \r\n {/* TODO Revisit design of LegacyButtonGroup later - for now use LegacyButton for its children.*/}\r\n \r\n {t('Export CSV')}\r\n \r\n \r\n {t('Create Report')}\r\n \r\n \r\n \r\n );\r\n}\r\n\r\nActionButtons.propTypes = {\r\n onExportClick: PropTypes.func,\r\n onCreateReportClick: PropTypes.func,\r\n};\r\n\r\nActionButtons.defaultProps = {\r\n onExportClick: () => alert('Export'),\r\n onCreateReportClick: () => alert('Create Report'),\r\n};\r\n\r\nexport default ActionButtons;\r\n","import React from 'react';\r\n\r\nimport { ButtonEnums, Dialog, Input, Select } from '@ohif/ui';\r\n\r\nexport const CREATE_REPORT_DIALOG_RESPONSE = {\r\n CANCEL: 0,\r\n CREATE_REPORT: 1,\r\n};\r\n\r\nexport default function CreateReportDialogPrompt(uiDialogService, { extensionManager }) {\r\n return new Promise(function (resolve, reject) {\r\n let dialogId = undefined;\r\n\r\n const _handleClose = () => {\r\n // Dismiss dialog\r\n uiDialogService.dismiss({ id: dialogId });\r\n // Notify of cancel action\r\n resolve({\r\n action: CREATE_REPORT_DIALOG_RESPONSE.CANCEL,\r\n value: undefined,\r\n dataSourceName: undefined,\r\n });\r\n };\r\n\r\n /**\r\n *\r\n * @param {string} param0.action - value of action performed\r\n * @param {string} param0.value - value from input field\r\n */\r\n const _handleFormSubmit = ({ action, value }) => {\r\n uiDialogService.dismiss({ id: dialogId });\r\n switch (action.id) {\r\n case 'save':\r\n resolve({\r\n action: CREATE_REPORT_DIALOG_RESPONSE.CREATE_REPORT,\r\n value: value.label,\r\n dataSourceName: value.dataSourceName,\r\n });\r\n break;\r\n case 'cancel':\r\n resolve({\r\n action: CREATE_REPORT_DIALOG_RESPONSE.CANCEL,\r\n value: undefined,\r\n dataSourceName: undefined,\r\n });\r\n break;\r\n }\r\n };\r\n\r\n const dataSourcesOpts = Object.keys(extensionManager.dataSourceMap)\r\n .filter(ds => {\r\n const configuration = extensionManager.dataSourceDefs[ds]?.configuration;\r\n const supportsStow = configuration?.supportsStow ?? configuration?.wadoRoot;\r\n return supportsStow;\r\n })\r\n .map(ds => {\r\n return {\r\n value: ds,\r\n label: ds,\r\n placeHolder: ds,\r\n };\r\n });\r\n\r\n dialogId = uiDialogService.create({\r\n centralize: true,\r\n isDraggable: false,\r\n content: Dialog,\r\n useLastPosition: false,\r\n showOverlay: true,\r\n contentProps: {\r\n title: 'Create Report',\r\n value: {\r\n label: '',\r\n dataSourceName: extensionManager.activeDataSource,\r\n },\r\n noCloseButton: true,\r\n onClose: _handleClose,\r\n actions: [\r\n { id: 'cancel', text: 'Cancel', type: ButtonEnums.type.secondary },\r\n { id: 'save', text: 'Save', type: ButtonEnums.type.primary },\r\n ],\r\n // TODO: Should be on button press...\r\n onSubmit: _handleFormSubmit,\r\n body: ({ value, setValue }) => {\r\n const onChangeHandler = event => {\r\n event.persist();\r\n setValue(value => ({ ...value, label: event.target.value }));\r\n };\r\n const onKeyPressHandler = event => {\r\n if (event.key === 'Enter') {\r\n uiDialogService.dismiss({ id: dialogId });\r\n resolve({\r\n action: CREATE_REPORT_DIALOG_RESPONSE.CREATE_REPORT,\r\n value: value.label,\r\n });\r\n }\r\n };\r\n return (\r\n <>\r\n {dataSourcesOpts.length > 1 && window.config?.allowMultiSelectExport && (\r\n
\r\n \r\n option.value === value.dataSourceName)\r\n .placeHolder\r\n }\r\n value={value.dataSourceName}\r\n onChange={evt => {\r\n setValue(v => ({ ...v, dataSourceName: evt.value }));\r\n }}\r\n isClearable={false}\r\n />\r\n
\r\n )}\r\n
\r\n \r\n
\r\n \r\n );\r\n },\r\n },\r\n });\r\n });\r\n}\r\n","import React from 'react';\r\nimport { DicomMetadataStore } from '@ohif/core';\r\n\r\n/**\r\n *\r\n * @param {*} servicesManager\r\n */\r\nasync function createReportAsync({ servicesManager, getReport, reportType = 'measurement' }) {\r\n const { displaySetService, uiNotificationService, uiDialogService } = servicesManager.services;\r\n const loadingDialogId = uiDialogService.create({\r\n showOverlay: true,\r\n isDraggable: false,\r\n centralize: true,\r\n content: Loading,\r\n });\r\n\r\n try {\r\n const naturalizedReport = await getReport();\r\n\r\n // The \"Mode\" route listens for DicomMetadataStore changes\r\n // When a new instance is added, it listens and\r\n // automatically calls makeDisplaySets\r\n DicomMetadataStore.addInstances([naturalizedReport], true);\r\n\r\n const displaySet = displaySetService.getMostRecentDisplaySet();\r\n\r\n const displaySetInstanceUID = displaySet.displaySetInstanceUID;\r\n\r\n uiNotificationService.show({\r\n title: 'Create Report',\r\n message: `${reportType} saved successfully`,\r\n type: 'success',\r\n });\r\n\r\n return [displaySetInstanceUID];\r\n } catch (error) {\r\n uiNotificationService.show({\r\n title: 'Create Report',\r\n message: error.message || `Failed to store ${reportType}`,\r\n type: 'error',\r\n });\r\n } finally {\r\n uiDialogService.dismiss({ id: loadingDialogId });\r\n }\r\n}\r\n\r\nfunction Loading() {\r\n return
Loading...
;\r\n}\r\n\r\nexport default createReportAsync;\r\n","const MIN_SR_SERIES_NUMBER = 4700;\r\n\r\nexport default function getNextSRSeriesNumber(displaySetService) {\r\n const activeDisplaySets = displaySetService.getActiveDisplaySets();\r\n const srDisplaySets = activeDisplaySets.filter(ds => ds.Modality === 'SR');\r\n const srSeriesNumbers = srDisplaySets.map(ds => ds.SeriesNumber);\r\n const maxSeriesNumber = Math.max(...srSeriesNumbers, MIN_SR_SERIES_NUMBER);\r\n\r\n return maxSeriesNumber + 1;\r\n}\r\n","import { DisplaySetService, Types } from '@ohif/core';\r\n\r\nimport getNextSRSeriesNumber from './getNextSRSeriesNumber';\r\n\r\n/**\r\n * Find an SR having the same series description.\r\n * This is used by the store service in order to store DICOM SR's having the\r\n * same Series Description into a single series under consecutive instance numbers\r\n * That way, they are all organized as a set and could have tools to view\r\n * \"prior\" SR instances.\r\n *\r\n * @param SeriesDescription - is the description to look for\r\n * @param displaySetService - the display sets to search for DICOM SR in\r\n * @returns SeriesMetadata from a DICOM SR having the same series description\r\n */\r\nexport default function findSRWithSameSeriesDescription(\r\n SeriesDescription: string,\r\n displaySetService: DisplaySetService\r\n): Types.SeriesMetadata {\r\n const activeDisplaySets = displaySetService.getActiveDisplaySets();\r\n const srDisplaySets = activeDisplaySets.filter(ds => ds.Modality === 'SR');\r\n const sameSeries = srDisplaySets.find(ds => ds.SeriesDescription === SeriesDescription);\r\n if (sameSeries) {\r\n console.log('Storing to same series', sameSeries);\r\n const { instance } = sameSeries;\r\n const { SeriesInstanceUID, SeriesDescription, SeriesDate, SeriesTime, SeriesNumber, Modality } =\r\n instance;\r\n return {\r\n SeriesInstanceUID,\r\n SeriesDescription,\r\n SeriesDate,\r\n SeriesTime,\r\n SeriesNumber,\r\n Modality,\r\n InstanceNumber: sameSeries.instances.length + 1,\r\n };\r\n }\r\n\r\n const SeriesNumber = getNextSRSeriesNumber(displaySetService);\r\n return { SeriesDescription, SeriesNumber };\r\n}\r\n","import React, { useEffect, useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { utils, ServicesManager } from '@ohif/core';\r\nimport { MeasurementTable, Dialog, Input, useViewportGrid, ButtonEnums } from '@ohif/ui';\r\nimport ActionButtons from './ActionButtons';\r\nimport debounce from 'lodash.debounce';\r\n\r\nimport createReportDialogPrompt, {\r\n CREATE_REPORT_DIALOG_RESPONSE,\r\n} from './createReportDialogPrompt';\r\nimport createReportAsync from '../Actions/createReportAsync';\r\nimport findSRWithSameSeriesDescription from '../utils/findSRWithSameSeriesDescription';\r\n\r\nconst { downloadCSVReport } = utils;\r\n\r\nexport default function PanelMeasurementTable({\r\n servicesManager,\r\n commandsManager,\r\n extensionManager,\r\n}): React.FunctionComponent {\r\n const [viewportGrid, viewportGridService] = useViewportGrid();\r\n const { activeViewportId, viewports } = viewportGrid;\r\n const { measurementService, uiDialogService, uiNotificationService, displaySetService } = (\r\n servicesManager as ServicesManager\r\n ).services;\r\n const [displayMeasurements, setDisplayMeasurements] = useState([]);\r\n\r\n useEffect(() => {\r\n const debouncedSetDisplayMeasurements = debounce(setDisplayMeasurements, 100);\r\n // ~~ Initial\r\n setDisplayMeasurements(_getMappedMeasurements(measurementService));\r\n\r\n // ~~ Subscription\r\n const added = measurementService.EVENTS.MEASUREMENT_ADDED;\r\n const addedRaw = measurementService.EVENTS.RAW_MEASUREMENT_ADDED;\r\n const updated = measurementService.EVENTS.MEASUREMENT_UPDATED;\r\n const removed = measurementService.EVENTS.MEASUREMENT_REMOVED;\r\n const cleared = measurementService.EVENTS.MEASUREMENTS_CLEARED;\r\n const subscriptions = [];\r\n\r\n [added, addedRaw, updated, removed, cleared].forEach(evt => {\r\n subscriptions.push(\r\n measurementService.subscribe(evt, () => {\r\n debouncedSetDisplayMeasurements(_getMappedMeasurements(measurementService));\r\n }).unsubscribe\r\n );\r\n });\r\n\r\n return () => {\r\n subscriptions.forEach(unsub => {\r\n unsub();\r\n });\r\n debouncedSetDisplayMeasurements.cancel();\r\n };\r\n }, []);\r\n\r\n async function exportReport() {\r\n const measurements = measurementService.getMeasurements();\r\n\r\n downloadCSVReport(measurements, measurementService);\r\n }\r\n\r\n async function clearMeasurements() {\r\n measurementService.clearMeasurements();\r\n }\r\n\r\n async function createReport(): Promise {\r\n // filter measurements that are added to the active study\r\n const activeViewport = viewports.get(activeViewportId);\r\n const measurements = measurementService.getMeasurements();\r\n const displaySet = displaySetService.getDisplaySetByUID(\r\n activeViewport.displaySetInstanceUIDs[0]\r\n );\r\n const trackedMeasurements = measurements.filter(\r\n m => displaySet.StudyInstanceUID === m.referenceStudyUID\r\n );\r\n\r\n if (trackedMeasurements.length <= 0) {\r\n uiNotificationService.show({\r\n title: 'No Measurements',\r\n message: 'No Measurements are added to the current Study.',\r\n type: 'info',\r\n duration: 3000,\r\n });\r\n return;\r\n }\r\n\r\n const promptResult = await createReportDialogPrompt(uiDialogService, {\r\n extensionManager,\r\n });\r\n\r\n if (promptResult.action === CREATE_REPORT_DIALOG_RESPONSE.CREATE_REPORT) {\r\n const dataSources = extensionManager.getDataSources(promptResult.dataSourceName);\r\n const dataSource = dataSources[0];\r\n\r\n const SeriesDescription =\r\n // isUndefinedOrEmpty\r\n promptResult.value === undefined || promptResult.value === ''\r\n ? 'Research Derived Series' // default\r\n : promptResult.value; // provided value\r\n\r\n // Reuse an existing series having the same series description to avoid\r\n // creating too many series instances.\r\n const options = findSRWithSameSeriesDescription(SeriesDescription, displaySetService);\r\n\r\n const getReport = async () => {\r\n return commandsManager.runCommand(\r\n 'storeMeasurements',\r\n {\r\n measurementData: trackedMeasurements,\r\n dataSource,\r\n additionalFindingTypes: ['ArrowAnnotate'],\r\n options,\r\n },\r\n 'CORNERSTONE_STRUCTURED_REPORT'\r\n );\r\n };\r\n\r\n return createReportAsync({ servicesManager, getReport });\r\n }\r\n }\r\n\r\n const jumpToImage = ({ uid, isActive }) => {\r\n measurementService.jumpToMeasurement(viewportGrid.activeViewportId, uid);\r\n\r\n onMeasurementItemClickHandler({ uid, isActive });\r\n };\r\n\r\n const onMeasurementItemEditHandler = ({ uid, isActive }) => {\r\n const measurement = measurementService.getMeasurement(uid);\r\n //Todo: why we are jumping to image?\r\n // jumpToImage({ id, isActive });\r\n\r\n const onSubmitHandler = ({ action, value }) => {\r\n switch (action.id) {\r\n case 'save': {\r\n measurementService.update(\r\n uid,\r\n {\r\n ...measurement,\r\n ...value,\r\n },\r\n true\r\n );\r\n }\r\n }\r\n uiDialogService.dismiss({ id: 'enter-annotation' });\r\n };\r\n\r\n uiDialogService.create({\r\n id: 'enter-annotation',\r\n centralize: true,\r\n isDraggable: false,\r\n showOverlay: true,\r\n content: Dialog,\r\n contentProps: {\r\n title: 'Annotation',\r\n noCloseButton: true,\r\n value: { label: measurement.label || '' },\r\n body: ({ value, setValue }) => {\r\n const onChangeHandler = event => {\r\n event.persist();\r\n setValue(value => ({ ...value, label: event.target.value }));\r\n };\r\n\r\n const onKeyPressHandler = event => {\r\n if (event.key === 'Enter') {\r\n onSubmitHandler({ value, action: { id: 'save' } });\r\n }\r\n };\r\n return (\r\n \r\n );\r\n },\r\n actions: [\r\n { id: 'cancel', text: 'Cancel', type: ButtonEnums.type.secondary },\r\n { id: 'save', text: 'Save', type: ButtonEnums.type.primary },\r\n ],\r\n onSubmit: onSubmitHandler,\r\n },\r\n });\r\n };\r\n\r\n const onMeasurementItemClickHandler = ({ uid, isActive }) => {\r\n if (!isActive) {\r\n const measurements = [...displayMeasurements];\r\n const measurement = measurements.find(m => m.uid === uid);\r\n\r\n measurements.forEach(m => (m.isActive = m.uid !== uid ? false : true));\r\n measurement.isActive = true;\r\n setDisplayMeasurements(measurements);\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n
\r\n \r\n
\r\n \r\n );\r\n}\r\n\r\nPanelMeasurementTable.propTypes = {\r\n servicesManager: PropTypes.instanceOf(ServicesManager).isRequired,\r\n};\r\n\r\nfunction _getMappedMeasurements(measurementService) {\r\n const measurements = measurementService.getMeasurements();\r\n\r\n const mappedMeasurements = measurements.map((m, index) =>\r\n _mapMeasurementToDisplay(m, index, measurementService.VALUE_TYPES)\r\n );\r\n\r\n return mappedMeasurements;\r\n}\r\n\r\n/**\r\n * Map the measurements to the display text.\r\n * Adds finding and site information to the displayText and/or label,\r\n * and provides as 'displayText' and 'label', while providing the original\r\n * values as baseDisplayText and baseLabel\r\n */\r\nfunction _mapMeasurementToDisplay(measurement, index, types) {\r\n const {\r\n displayText: baseDisplayText,\r\n uid,\r\n label: baseLabel,\r\n type,\r\n selected,\r\n findingSites,\r\n finding,\r\n } = measurement;\r\n\r\n const firstSite = findingSites?.[0];\r\n const label = baseLabel || finding?.text || firstSite?.text || '(empty)';\r\n let displayText = baseDisplayText || [];\r\n if (findingSites) {\r\n const siteText = [];\r\n findingSites.forEach(site => {\r\n if (site?.text !== label) {\r\n siteText.push(site.text);\r\n }\r\n });\r\n displayText = [...siteText, ...displayText];\r\n }\r\n if (finding && finding?.text !== label) {\r\n displayText = [finding.text, ...displayText];\r\n }\r\n\r\n return {\r\n uid,\r\n label,\r\n baseLabel,\r\n measurementType: type,\r\n displayText,\r\n baseDisplayText,\r\n isActive: selected,\r\n finding,\r\n findingSites,\r\n };\r\n}\r\n","import React from 'react';\r\nimport { WrappedPanelStudyBrowser, PanelMeasurementTable } from './Panels';\r\n\r\n// TODO:\r\n// - No loading UI exists yet\r\n// - cancel promises when component is destroyed\r\n// - show errors in UI for thumbnails if promise fails\r\n\r\nfunction getPanelModule({ commandsManager, extensionManager, servicesManager }) {\r\n const wrappedMeasurementPanel = () => {\r\n return (\r\n \r\n );\r\n };\r\n\r\n return [\r\n {\r\n name: 'seriesList',\r\n iconName: 'tab-studies',\r\n iconLabel: 'Studies',\r\n label: 'Studies',\r\n component: WrappedPanelStudyBrowser.bind(null, {\r\n commandsManager,\r\n extensionManager,\r\n servicesManager,\r\n }),\r\n },\r\n {\r\n name: 'measure',\r\n iconName: 'tab-linear',\r\n iconLabel: 'Measure',\r\n label: 'Measurements',\r\n secondaryLabel: 'Measurements',\r\n component: wrappedMeasurementPanel,\r\n },\r\n ];\r\n}\r\n\r\nexport default getPanelModule;\r\n","import packageJson from '../package.json';\r\n\r\nconst id = packageJson.name;\r\n\r\nexport { id };\r\n","import { vec3 } from 'gl-matrix';\r\nimport toNumber from '@ohif/core/src/utils/toNumber';\r\nimport { _getPerpendicularDistance } from '@ohif/core/src/utils/isDisplaySetReconstructable';\r\nimport calculateScanAxisNormal from '../calculateScanAxisNormal';\r\n\r\n/**\r\n * Checks if there is a position shift between consecutive frames\r\n * @param {*} previousPosition\r\n * @param {*} actualPosition\r\n * @param {*} scanAxisNormal\r\n * @param {*} averageSpacingBetweenFrames\r\n * @returns\r\n */\r\nfunction _checkSeriesPositionShift(\r\n previousPosition,\r\n actualPosition,\r\n scanAxisNormal,\r\n averageSpacingBetweenFrames\r\n) {\r\n // predicted position should be the previous position added by the multiplication\r\n // of the scanAxisNormal and the average spacing between frames\r\n const predictedPosition = vec3.scaleAndAdd(\r\n vec3.create(),\r\n previousPosition,\r\n scanAxisNormal,\r\n averageSpacingBetweenFrames\r\n );\r\n return vec3.distance(actualPosition, predictedPosition) > averageSpacingBetweenFrames;\r\n}\r\n\r\n/**\r\n * Checks if a series has position shifts between consecutive frames\r\n * @param {*} instances\r\n * @returns\r\n */\r\nexport default function areAllImagePositionsEqual(instances: Array): boolean {\r\n if (!instances?.length) {\r\n return false;\r\n }\r\n const firstImageOrientationPatient = toNumber(instances[0].ImageOrientationPatient);\r\n if (!firstImageOrientationPatient) {\r\n return false;\r\n }\r\n const scanAxisNormal = calculateScanAxisNormal(firstImageOrientationPatient);\r\n const firstImagePositionPatient = toNumber(instances[0].ImagePositionPatient);\r\n const lastIpp = toNumber(instances[instances.length - 1].ImagePositionPatient);\r\n\r\n const averageSpacingBetweenFrames =\r\n _getPerpendicularDistance(firstImagePositionPatient, lastIpp) / (instances.length - 1);\r\n\r\n let previousImagePositionPatient = firstImagePositionPatient;\r\n for (let i = 1; i < instances.length; i++) {\r\n const instance = instances[i];\r\n const imagePositionPatient = toNumber(instance.ImagePositionPatient);\r\n\r\n if (\r\n _checkSeriesPositionShift(\r\n previousImagePositionPatient,\r\n imagePositionPatient,\r\n scanAxisNormal,\r\n averageSpacingBetweenFrames\r\n )\r\n ) {\r\n return false;\r\n }\r\n previousImagePositionPatient = imagePositionPatient;\r\n }\r\n return true;\r\n}\r\n","import { vec3 } from 'gl-matrix';\r\n\r\n/**\r\n * Calculates the scanAxisNormal based on a image orientation vector extract from a frame\r\n * @param {*} imageOrientation\r\n * @returns\r\n */\r\nexport default function calculateScanAxisNormal(imageOrientation) {\r\n const rowCosineVec = vec3.fromValues(\r\n imageOrientation[0],\r\n imageOrientation[1],\r\n imageOrientation[2]\r\n );\r\n const colCosineVec = vec3.fromValues(\r\n imageOrientation[3],\r\n imageOrientation[4],\r\n imageOrientation[5]\r\n );\r\n return vec3.cross(vec3.create(), rowCosineVec, colCosineVec);\r\n}\r\n","import areAllImageDimensionsEqual from './areAllImageDimensionsEqual';\r\nimport areAllImageComponentsEqual from './areAllImageComponentsEqual';\r\nimport areAllImageOrientationsEqual from './areAllImageOrientationsEqual';\r\nimport areAllImagePositionsEqual from './areAllImagePositionsEqual';\r\nimport areAllImageSpacingEqual from './areAllImageSpacingEqual';\r\nimport { DisplaySetMessage, DisplaySetMessageList } from '@ohif/core';\r\n\r\n/**\r\n * Runs various checks in a single frame series\r\n * @param {*} instances\r\n * @param {*} warnings\r\n */\r\nexport default function checkSingleFrames(\r\n instances: Array,\r\n messages: DisplaySetMessageList\r\n): void {\r\n if (instances.length > 2) {\r\n if (!areAllImageDimensionsEqual(instances)) {\r\n messages.addMessage(DisplaySetMessage.CODES.INCONSISTENT_DIMENSIONS);\r\n }\r\n\r\n if (!areAllImageComponentsEqual(instances)) {\r\n messages.addMessage(DisplaySetMessage.CODES.INCONSISTENT_COMPONENTS);\r\n }\r\n\r\n if (!areAllImageOrientationsEqual(instances)) {\r\n messages.addMessage(DisplaySetMessage.CODES.INCONSISTENT_ORIENTATIONS);\r\n }\r\n\r\n if (!areAllImagePositionsEqual(instances)) {\r\n messages.addMessage(DisplaySetMessage.CODES.INCONSISTENT_POSITION_INFORMATION);\r\n }\r\n areAllImageSpacingEqual(instances, messages);\r\n }\r\n}\r\n","import toNumber from '@ohif/core/src/utils/toNumber';\r\n\r\n/**\r\n * Check if the frames in a series has different dimensions\r\n * @param {*} instances\r\n * @returns\r\n */\r\nexport default function areAllImageDimensionsEqual(instances: Array): boolean {\r\n if (!instances?.length) {\r\n return false;\r\n }\r\n const firstImage = instances[0];\r\n const firstImageRows = toNumber(firstImage.Rows);\r\n const firstImageColumns = toNumber(firstImage.Columns);\r\n\r\n for (let i = 1; i < instances.length; i++) {\r\n const instance = instances[i];\r\n const { Rows, Columns } = instance;\r\n\r\n if (Rows !== firstImageRows || Columns !== firstImageColumns) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\r\n","import toNumber from '@ohif/core/src/utils/toNumber';\r\n\r\n/**\r\n * Check if all voxels in series images has same number of components (samplesPerPixel)\r\n * @param {*} instances\r\n * @returns\r\n */\r\nexport default function areAllImageComponentsEqual(instances: Array): boolean {\r\n if (!instances?.length) {\r\n return false;\r\n }\r\n const firstImage = instances[0];\r\n const firstImageSamplesPerPixel = toNumber(firstImage.SamplesPerPixel);\r\n\r\n for (let i = 1; i < instances.length; i++) {\r\n const instance = instances[i];\r\n const { SamplesPerPixel } = instance;\r\n\r\n if (SamplesPerPixel !== firstImageSamplesPerPixel) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\r\n","import toNumber from '@ohif/core/src/utils/toNumber';\r\nimport { _isSameOrientation } from '@ohif/core/src/utils/isDisplaySetReconstructable';\r\n\r\n/**\r\n * Check is the series has frames with different orientations\r\n * @param {*} instances\r\n * @returns\r\n */\r\nexport default function areAllImageOrientationsEqual(instances: Array): boolean {\r\n if (!instances?.length) {\r\n return false;\r\n }\r\n const firstImage = instances[0];\r\n const firstImageOrientationPatient = toNumber(firstImage.ImageOrientationPatient);\r\n\r\n for (let i = 1; i < instances.length; i++) {\r\n const instance = instances[i];\r\n const imageOrientationPatient = toNumber(instance.ImageOrientationPatient);\r\n\r\n if (!_isSameOrientation(imageOrientationPatient, firstImageOrientationPatient)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\r\n","import {\r\n _getPerpendicularDistance,\r\n _getSpacingIssue,\r\n reconstructionIssues,\r\n} from '@ohif/core/src/utils/isDisplaySetReconstructable';\r\nimport { DisplaySetMessage } from '@ohif/core';\r\nimport toNumber from '@ohif/core/src/utils/toNumber';\r\nimport { DisplaySetMessageList } from '@ohif/core';\r\n\r\n/**\r\n * Checks if series has spacing issues\r\n * @param {*} instances\r\n * @param {*} warnings\r\n */\r\nexport default function areAllImageSpacingEqual(\r\n instances: Array,\r\n messages: DisplaySetMessageList\r\n): void {\r\n if (!instances?.length) {\r\n return;\r\n }\r\n const firstImagePositionPatient = toNumber(instances[0].ImagePositionPatient);\r\n if (!firstImagePositionPatient) {\r\n return;\r\n }\r\n const lastIpp = toNumber(instances[instances.length - 1].ImagePositionPatient);\r\n\r\n const averageSpacingBetweenFrames =\r\n _getPerpendicularDistance(firstImagePositionPatient, lastIpp) / (instances.length - 1);\r\n\r\n let previousImagePositionPatient = firstImagePositionPatient;\r\n\r\n const issuesFound = [];\r\n for (let i = 1; i < instances.length; i++) {\r\n const instance = instances[i];\r\n const imagePositionPatient = toNumber(instance.ImagePositionPatient);\r\n\r\n const spacingBetweenFrames = _getPerpendicularDistance(\r\n imagePositionPatient,\r\n previousImagePositionPatient\r\n );\r\n\r\n const spacingIssue = _getSpacingIssue(spacingBetweenFrames, averageSpacingBetweenFrames);\r\n\r\n if (spacingIssue) {\r\n const issue = spacingIssue.issue;\r\n\r\n // avoid multiple warning of the same thing\r\n if (!issuesFound.includes(issue)) {\r\n issuesFound.push(issue);\r\n if (issue === reconstructionIssues.MISSING_FRAMES) {\r\n messages.addMessage(DisplaySetMessage.CODES.MISSING_FRAMES);\r\n } else if (issue === reconstructionIssues.IRREGULAR_SPACING) {\r\n messages.addMessage(DisplaySetMessage.CODES.IRREGULAR_SPACING);\r\n }\r\n }\r\n // we just want to find issues not how many\r\n if (issuesFound.length > 1) {\r\n break;\r\n }\r\n }\r\n previousImagePositionPatient = imagePositionPatient;\r\n }\r\n}\r\n","import sortInstancesByPosition from '@ohif/core/src/utils/sortInstancesByPosition';\r\nimport { constructableModalities } from '@ohif/core/src/utils/isDisplaySetReconstructable';\r\nimport { DisplaySetMessage, DisplaySetMessageList } from '@ohif/core';\r\nimport checkMultiFrame from './utils/validations/checkMultiframe';\r\nimport checkSingleFrames from './utils/validations/checkSingleFrames';\r\n/**\r\n * Checks if a series is reconstructable to a 3D volume.\r\n *\r\n * @param {Object[]} instances An array of `OHIFInstanceMetadata` objects.\r\n */\r\nexport default function getDisplaySetMessages(\r\n instances: Array,\r\n isReconstructable: boolean\r\n): DisplaySetMessageList {\r\n const messages = new DisplaySetMessageList();\r\n if (!instances.length) {\r\n messages.addMessage(DisplaySetMessage.CODES.NO_VALID_INSTANCES);\r\n return;\r\n }\r\n\r\n const firstInstance = instances[0];\r\n const { Modality, ImageType, NumberOfFrames } = firstInstance;\r\n // Due to current requirements, LOCALIZER series doesn't have any messages\r\n if (ImageType?.includes('LOCALIZER')) {\r\n return messages;\r\n }\r\n\r\n if (!constructableModalities.includes(Modality)) {\r\n return messages;\r\n }\r\n\r\n const isMultiframe = NumberOfFrames > 1;\r\n // Can't reconstruct if all instances don't have the ImagePositionPatient.\r\n if (!isMultiframe && !instances.every(instance => instance.ImagePositionPatient)) {\r\n messages.addMessage(DisplaySetMessage.CODES.NO_POSITION_INFORMATION);\r\n }\r\n\r\n const sortedInstances = sortInstancesByPosition(instances);\r\n\r\n isMultiframe\r\n ? checkMultiFrame(sortedInstances[0], messages)\r\n : checkSingleFrames(sortedInstances, messages);\r\n\r\n if (!isReconstructable) {\r\n messages.addMessage(DisplaySetMessage.CODES.NOT_RECONSTRUCTABLE);\r\n }\r\n return messages;\r\n}\r\n","import {\r\n hasPixelMeasurements,\r\n hasOrientation,\r\n hasPosition,\r\n} from '@ohif/core/src/utils/isDisplaySetReconstructable';\r\nimport { DisplaySetMessage, DisplaySetMessageList } from '@ohif/core';\r\n\r\n/**\r\n * Check various multi frame issues. It calls OHIF core functions\r\n * @param {*} multiFrameInstance\r\n * @param {*} warnings\r\n */\r\nexport default function checkMultiFrame(multiFrameInstance, messages: DisplaySetMessageList): void {\r\n if (!hasPixelMeasurements(multiFrameInstance)) {\r\n messages.addMessage(DisplaySetMessage.CODES.MULTIFRAME_NO_PIXEL_MEASUREMENTS);\r\n }\r\n\r\n if (!hasOrientation(multiFrameInstance)) {\r\n messages.addMessage(DisplaySetMessage.CODES.MULTIFRAME_NO_ORIENTATION);\r\n }\r\n\r\n if (!hasPosition(multiFrameInstance)) {\r\n messages.addMessage(DisplaySetMessage.CODES.MULTIFRAME_NO_POSITION_INFORMATION);\r\n }\r\n}\r\n","import ImageSet from '@ohif/core/src/classes/ImageSet';\r\nimport { DisplaySetMessage, DisplaySetMessageList } from '@ohif/core';\r\n/**\r\n * Default handler for a instance list with an unsupported sopClassUID\r\n */\r\nexport default function getDisplaySetsFromUnsupportedSeries(instances) {\r\n const imageSet = new ImageSet(instances);\r\n const messages = new DisplaySetMessageList();\r\n messages.addMessage(DisplaySetMessage.CODES.UNSUPPORTED_DISPLAYSET);\r\n const instance = instances[0];\r\n\r\n imageSet.setAttributes({\r\n displaySetInstanceUID: imageSet.uid, // create a local alias for the imageSet UID\r\n SeriesDate: instance.SeriesDate,\r\n SeriesTime: instance.SeriesTime,\r\n SeriesInstanceUID: instance.SeriesInstanceUID,\r\n StudyInstanceUID: instance.StudyInstanceUID,\r\n SeriesNumber: instance.SeriesNumber || 0,\r\n FrameRate: instance.FrameTime,\r\n SOPClassUID: instance.SOPClassUID,\r\n SeriesDescription: instance.SeriesDescription || '',\r\n Modality: instance.Modality,\r\n numImageFrames: instances.length,\r\n unsupported: true,\r\n SOPClassHandlerId: 'unsupported',\r\n isReconstructable: false,\r\n messages,\r\n });\r\n return [imageSet];\r\n}\r\n","import { isImage } from '@ohif/core/src/utils/isImage';\r\nimport sopClassDictionary from '@ohif/core/src/utils/sopClassDictionary';\r\nimport ImageSet from '@ohif/core/src/classes/ImageSet';\r\nimport isDisplaySetReconstructable from '@ohif/core/src/utils/isDisplaySetReconstructable';\r\nimport { id } from './id';\r\nimport getDisplaySetMessages from './getDisplaySetMessages';\r\nimport getDisplaySetsFromUnsupportedSeries from './getDisplaySetsFromUnsupportedSeries';\r\n\r\nconst sopClassHandlerName = 'stack';\r\n\r\nconst isMultiFrame = instance => {\r\n return instance.NumberOfFrames > 1;\r\n};\r\n\r\nconst makeDisplaySet = instances => {\r\n const instance = instances[0];\r\n const imageSet = new ImageSet(instances);\r\n\r\n const { value: isReconstructable, averageSpacingBetweenFrames } =\r\n isDisplaySetReconstructable(instances);\r\n // set appropriate attributes to image set...\r\n const messages = getDisplaySetMessages(instances, isReconstructable);\r\n\r\n imageSet.setAttributes({\r\n displaySetInstanceUID: imageSet.uid, // create a local alias for the imageSet UID\r\n SeriesDate: instance.SeriesDate,\r\n SeriesTime: instance.SeriesTime,\r\n SeriesInstanceUID: instance.SeriesInstanceUID,\r\n StudyInstanceUID: instance.StudyInstanceUID,\r\n SeriesNumber: instance.SeriesNumber || 0,\r\n FrameRate: instance.FrameTime,\r\n SOPClassUID: instance.SOPClassUID,\r\n SeriesDescription: instance.SeriesDescription || '',\r\n Modality: instance.Modality,\r\n isMultiFrame: isMultiFrame(instance),\r\n countIcon: isReconstructable ? 'icon-mpr' : undefined,\r\n numImageFrames: instances.length,\r\n SOPClassHandlerId: `${id}.sopClassHandlerModule.${sopClassHandlerName}`,\r\n isReconstructable,\r\n messages,\r\n averageSpacingBetweenFrames: averageSpacingBetweenFrames || null,\r\n });\r\n\r\n // Sort the images in this series if needed\r\n const shallSort = true; //!OHIF.utils.ObjectPath.get(Meteor, 'settings.public.ui.sortSeriesByIncomingOrder');\r\n if (shallSort) {\r\n imageSet.sortBy((a, b) => {\r\n // Sort by InstanceNumber (0020,0013)\r\n return (parseInt(a.InstanceNumber) || 0) - (parseInt(b.InstanceNumber) || 0);\r\n });\r\n }\r\n\r\n // Include the first image instance number (after sorted)\r\n /*imageSet.setAttribute(\r\n 'instanceNumber',\r\n imageSet.getImage(0).InstanceNumber\r\n );*/\r\n\r\n /*const isReconstructable = isDisplaySetReconstructable(series, instances);\r\n\r\n imageSet.isReconstructable = isReconstructable.value;\r\n\r\n if (isReconstructable.missingFrames) {\r\n // TODO -> This is currently unused, but may be used for reconstructing\r\n // Volumes with gaps later on.\r\n imageSet.missingFrames = isReconstructable.missingFrames;\r\n }*/\r\n\r\n return imageSet;\r\n};\r\n\r\nconst isSingleImageModality = modality => {\r\n return modality === 'CR' || modality === 'MG' || modality === 'DX';\r\n};\r\n\r\nfunction getSopClassUids(instances) {\r\n const uniqueSopClassUidsInSeries = new Set();\r\n instances.forEach(instance => {\r\n uniqueSopClassUidsInSeries.add(instance.SOPClassUID);\r\n });\r\n const sopClassUids = Array.from(uniqueSopClassUidsInSeries);\r\n\r\n return sopClassUids;\r\n}\r\n\r\n/**\r\n * Basic SOPClassHandler:\r\n * - For all Image types that are stackable, create\r\n * a displaySet with a stack of images\r\n *\r\n * @param {Array} sopClassHandlerModules List of SOP Class Modules\r\n * @param {SeriesMetadata} series The series metadata object from which the display sets will be created\r\n * @returns {Array} The list of display sets created for the given series object\r\n */\r\nfunction getDisplaySetsFromSeries(instances) {\r\n // If the series has no instances, stop here\r\n if (!instances || !instances.length) {\r\n throw new Error('No instances were provided');\r\n }\r\n\r\n const displaySets = [];\r\n const sopClassUids = getSopClassUids(instances);\r\n\r\n // Search through the instances (InstanceMetadata object) of this series\r\n // Split Multi-frame instances and Single-image modalities\r\n // into their own specific display sets. Place the rest of each\r\n // series into another display set.\r\n const stackableInstances = [];\r\n instances.forEach(instance => {\r\n // All imaging modalities must have a valid value for sopClassUid (x00080016) or rows (x00280010)\r\n if (!isImage(instance.SOPClassUID) && !instance.Rows) {\r\n return;\r\n }\r\n\r\n let displaySet;\r\n\r\n if (isMultiFrame(instance)) {\r\n displaySet = makeDisplaySet([instance]);\r\n\r\n displaySet.setAttributes({\r\n sopClassUids,\r\n isClip: true,\r\n numImageFrames: instance.NumberOfFrames,\r\n instanceNumber: instance.InstanceNumber,\r\n acquisitionDatetime: instance.AcquisitionDateTime,\r\n });\r\n displaySets.push(displaySet);\r\n } else if (isSingleImageModality(instance.Modality)) {\r\n displaySet = makeDisplaySet([instance]);\r\n displaySet.setAttributes({\r\n sopClassUids,\r\n instanceNumber: instance.InstanceNumber,\r\n acquisitionDatetime: instance.AcquisitionDateTime,\r\n });\r\n displaySets.push(displaySet);\r\n } else {\r\n stackableInstances.push(instance);\r\n }\r\n });\r\n\r\n if (stackableInstances.length) {\r\n const displaySet = makeDisplaySet(stackableInstances);\r\n displaySet.setAttribute('studyInstanceUid', instances[0].StudyInstanceUID);\r\n displaySet.setAttributes({\r\n sopClassUids,\r\n });\r\n displaySets.push(displaySet);\r\n }\r\n\r\n return displaySets;\r\n}\r\n\r\nconst sopClassUids = [\r\n sopClassDictionary.ComputedRadiographyImageStorage,\r\n sopClassDictionary.DigitalXRayImageStorageForPresentation,\r\n sopClassDictionary.DigitalXRayImageStorageForProcessing,\r\n sopClassDictionary.DigitalMammographyXRayImageStorageForPresentation,\r\n sopClassDictionary.DigitalMammographyXRayImageStorageForProcessing,\r\n sopClassDictionary.DigitalIntraOralXRayImageStorageForPresentation,\r\n sopClassDictionary.DigitalIntraOralXRayImageStorageForProcessing,\r\n sopClassDictionary.CTImageStorage,\r\n sopClassDictionary.EnhancedCTImageStorage,\r\n sopClassDictionary.LegacyConvertedEnhancedCTImageStorage,\r\n sopClassDictionary.UltrasoundMultiframeImageStorage,\r\n sopClassDictionary.MRImageStorage,\r\n sopClassDictionary.EnhancedMRImageStorage,\r\n sopClassDictionary.EnhancedMRColorImageStorage,\r\n sopClassDictionary.LegacyConvertedEnhancedMRImageStorage,\r\n sopClassDictionary.UltrasoundImageStorage,\r\n sopClassDictionary.UltrasoundImageStorageRET,\r\n sopClassDictionary.SecondaryCaptureImageStorage,\r\n sopClassDictionary.MultiframeSingleBitSecondaryCaptureImageStorage,\r\n sopClassDictionary.MultiframeGrayscaleByteSecondaryCaptureImageStorage,\r\n sopClassDictionary.MultiframeGrayscaleWordSecondaryCaptureImageStorage,\r\n sopClassDictionary.MultiframeTrueColorSecondaryCaptureImageStorage,\r\n sopClassDictionary.XRayAngiographicImageStorage,\r\n sopClassDictionary.EnhancedXAImageStorage,\r\n sopClassDictionary.XRayRadiofluoroscopicImageStorage,\r\n sopClassDictionary.EnhancedXRFImageStorage,\r\n sopClassDictionary.XRay3DAngiographicImageStorage,\r\n sopClassDictionary.XRay3DCraniofacialImageStorage,\r\n sopClassDictionary.BreastTomosynthesisImageStorage,\r\n sopClassDictionary.BreastProjectionXRayImageStorageForPresentation,\r\n sopClassDictionary.BreastProjectionXRayImageStorageForProcessing,\r\n sopClassDictionary.IntravascularOpticalCoherenceTomographyImageStorageForPresentation,\r\n sopClassDictionary.IntravascularOpticalCoherenceTomographyImageStorageForProcessing,\r\n sopClassDictionary.NuclearMedicineImageStorage,\r\n sopClassDictionary.VLEndoscopicImageStorage,\r\n sopClassDictionary.VideoEndoscopicImageStorage,\r\n sopClassDictionary.VLMicroscopicImageStorage,\r\n sopClassDictionary.VideoMicroscopicImageStorage,\r\n sopClassDictionary.VLSlideCoordinatesMicroscopicImageStorage,\r\n sopClassDictionary.VLPhotographicImageStorage,\r\n sopClassDictionary.VideoPhotographicImageStorage,\r\n sopClassDictionary.OphthalmicPhotography8BitImageStorage,\r\n sopClassDictionary.OphthalmicPhotography16BitImageStorage,\r\n sopClassDictionary.OphthalmicTomographyImageStorage,\r\n sopClassDictionary.VLWholeSlideMicroscopyImageStorage,\r\n sopClassDictionary.PositronEmissionTomographyImageStorage,\r\n sopClassDictionary.EnhancedPETImageStorage,\r\n sopClassDictionary.LegacyConvertedEnhancedPETImageStorage,\r\n sopClassDictionary.RTImageStorage,\r\n sopClassDictionary.EnhancedUSVolumeStorage,\r\n];\r\n\r\nfunction getSopClassHandlerModule() {\r\n return [\r\n {\r\n name: sopClassHandlerName,\r\n sopClassUids,\r\n getDisplaySetsFromSeries,\r\n },\r\n {\r\n name: 'not-supported-display-sets-handler',\r\n sopClassUids: [],\r\n getDisplaySetsFromSeries: getDisplaySetsFromUnsupportedSeries,\r\n },\r\n ];\r\n}\r\n\r\nexport default getSopClassHandlerModule;\r\n","import React from 'react';\r\n\r\nexport default function ToolbarDivider() {\r\n return ;\r\n}\r\n","import React, { useEffect, useState, useCallback } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { LayoutSelector as OHIFLayoutSelector, ToolbarButton } from '@ohif/ui';\r\nimport { ServicesManager } from '@ohif/core';\r\n\r\nfunction ToolbarLayoutSelectorWithServices({ servicesManager, ...props }) {\r\n const { toolbarService } = servicesManager.services;\r\n\r\n const onSelection = useCallback(\r\n props => {\r\n toolbarService.recordInteraction({\r\n interactionType: 'action',\r\n commands: [\r\n {\r\n commandName: 'setViewportGridLayout',\r\n commandOptions: { ...props },\r\n context: 'DEFAULT',\r\n },\r\n ],\r\n });\r\n },\r\n [toolbarService]\r\n );\r\n\r\n return (\r\n \r\n );\r\n}\r\n\r\nfunction LayoutSelector({ rows, columns, className, onSelection, ...rest }) {\r\n const [isOpen, setIsOpen] = useState(false);\r\n\r\n const closeOnOutsideClick = () => {\r\n if (isOpen) {\r\n setIsOpen(false);\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n window.addEventListener('click', closeOnOutsideClick);\r\n return () => {\r\n window.removeEventListener('click', closeOnOutsideClick);\r\n };\r\n }, [isOpen]);\r\n\r\n const onInteractionHandler = () => setIsOpen(!isOpen);\r\n const DropdownContent = isOpen ? OHIFLayoutSelector : null;\r\n\r\n return (\r\n \r\n )\r\n }\r\n isActive={isOpen}\r\n type=\"toggle\"\r\n />\r\n );\r\n}\r\n\r\nLayoutSelector.propTypes = {\r\n rows: PropTypes.number,\r\n columns: PropTypes.number,\r\n onLayoutChange: PropTypes.func,\r\n servicesManager: PropTypes.instanceOf(ServicesManager),\r\n};\r\n\r\nLayoutSelector.defaultProps = {\r\n rows: 3,\r\n columns: 3,\r\n onLayoutChange: () => {},\r\n};\r\n\r\nexport default ToolbarLayoutSelectorWithServices;\r\n","import { SplitButton, Icon, ToolbarButton } from '@ohif/ui';\r\nimport React, { useEffect, useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport classNames from 'classnames';\r\n\r\nfunction ToolbarSplitButtonWithServices({\r\n isRadio,\r\n isAction,\r\n groupId,\r\n primary,\r\n secondary,\r\n items,\r\n renderer,\r\n onInteraction,\r\n servicesManager,\r\n}) {\r\n const { toolbarService } = servicesManager?.services;\r\n\r\n const handleItemClick = (item, index) => {\r\n const { id, type, commands } = item;\r\n onInteraction({\r\n groupId,\r\n itemId: id,\r\n interactionType: type,\r\n commands,\r\n });\r\n\r\n setState(state => ({\r\n ...state,\r\n primary: !isAction && isRadio ? { ...item, index } : state.primary,\r\n isExpanded: false,\r\n items: getSplitButtonItems(items).filter(item =>\r\n isRadio && !isAction ? item.index !== index : true\r\n ),\r\n }));\r\n };\r\n\r\n /* Bubbles up individual item clicks */\r\n const getSplitButtonItems = items =>\r\n items.map((item, index) => ({\r\n ...item,\r\n index,\r\n onClick: () => handleItemClick(item, index),\r\n }));\r\n\r\n const [buttonsState, setButtonState] = useState({\r\n primaryToolId: '',\r\n toggles: {},\r\n groups: {},\r\n });\r\n\r\n const [state, setState] = useState({\r\n primary,\r\n items: getSplitButtonItems(items).filter(item =>\r\n isRadio && !isAction ? item.id !== primary.id : true\r\n ),\r\n });\r\n\r\n const { primaryToolId, toggles } = buttonsState;\r\n\r\n const isPrimaryToggle = state.primary.type === 'toggle';\r\n\r\n const isPrimaryActive =\r\n (state.primary.type === 'tool' && primaryToolId === state.primary.id) ||\r\n (isPrimaryToggle && toggles[state.primary.id] === true);\r\n\r\n const PrimaryButtonComponent =\r\n toolbarService?.getButtonComponentForUIType(state.primary.uiType) ?? ToolbarButton;\r\n\r\n useEffect(() => {\r\n const { unsubscribe } = toolbarService.subscribe(\r\n toolbarService.EVENTS.TOOL_BAR_STATE_MODIFIED,\r\n state => {\r\n setButtonState({ ...state });\r\n }\r\n );\r\n\r\n return () => {\r\n unsubscribe();\r\n };\r\n }, [toolbarService]);\r\n\r\n const updatedItems = state.items.map(item => {\r\n const isActive = item.type === 'tool' && primaryToolId === item.id;\r\n\r\n // We could have added the\r\n // item.type === 'toggle' && toggles[item.id] === true\r\n // too but that makes the button active when the toggle is active under it\r\n // which feels weird\r\n return {\r\n ...item,\r\n isActive,\r\n };\r\n });\r\n\r\n const DefaultListItemRenderer = ({ type, icon, label, t, id }) => {\r\n const isActive = type === 'toggle' && toggles[id] === true;\r\n\r\n return (\r\n \r\n {icon && (\r\n \r\n \r\n \r\n )}\r\n {t(label)}\r\n \r\n );\r\n };\r\n\r\n const listItemRenderer = renderer || DefaultListItemRenderer;\r\n\r\n return (\r\n item.isActive)}\r\n isToggle={isPrimaryToggle}\r\n onInteraction={onInteraction}\r\n Component={props => (\r\n \r\n )}\r\n />\r\n );\r\n}\r\n\r\nToolbarSplitButtonWithServices.propTypes = {\r\n isRadio: PropTypes.bool,\r\n isAction: PropTypes.bool,\r\n groupId: PropTypes.string,\r\n primary: PropTypes.shape({\r\n id: PropTypes.string.isRequired,\r\n type: PropTypes.oneOf(['tool', 'action', 'toggle']).isRequired,\r\n uiType: PropTypes.string,\r\n }),\r\n secondary: PropTypes.shape({\r\n id: PropTypes.string,\r\n icon: PropTypes.string.isRequired,\r\n label: PropTypes.string,\r\n tooltip: PropTypes.string.isRequired,\r\n isActive: PropTypes.bool,\r\n }),\r\n items: PropTypes.arrayOf(\r\n PropTypes.shape({\r\n id: PropTypes.string.isRequired,\r\n type: PropTypes.oneOf(['tool', 'action', 'toggle']).isRequired,\r\n icon: PropTypes.string,\r\n label: PropTypes.string,\r\n tooltip: PropTypes.string,\r\n })\r\n ),\r\n renderer: PropTypes.func,\r\n onInteraction: PropTypes.func.isRequired,\r\n servicesManager: PropTypes.shape({\r\n services: PropTypes.shape({\r\n toolbarService: PropTypes.object,\r\n }),\r\n }),\r\n};\r\n\r\nToolbarSplitButtonWithServices.defaultProps = {\r\n isRadio: false,\r\n isAction: false,\r\n};\r\n\r\nexport default ToolbarSplitButtonWithServices;\r\n","import { ToolbarButton } from '@ohif/ui';\r\nimport React, { useEffect, useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nfunction ToolbarButtonWithServices({\r\n id,\r\n type,\r\n commands,\r\n onInteraction,\r\n servicesManager,\r\n ...props\r\n}) {\r\n const { toolbarService } = servicesManager?.services || {};\r\n\r\n const [buttonsState, setButtonState] = useState({\r\n primaryToolId: '',\r\n toggles: {},\r\n groups: {},\r\n });\r\n const { primaryToolId } = buttonsState;\r\n\r\n const isActive =\r\n (type === 'tool' && id === primaryToolId) ||\r\n (type === 'toggle' && buttonsState.toggles[id] === true);\r\n\r\n useEffect(() => {\r\n const { unsubscribe } = toolbarService.subscribe(\r\n toolbarService.EVENTS.TOOL_BAR_STATE_MODIFIED,\r\n state => {\r\n setButtonState({ ...state });\r\n }\r\n );\r\n\r\n return () => {\r\n unsubscribe();\r\n };\r\n }, [toolbarService]);\r\n\r\n return (\r\n \r\n );\r\n}\r\n\r\nToolbarButtonWithServices.propTypes = {\r\n id: PropTypes.string.isRequired,\r\n type: PropTypes.oneOf(['tool', 'action', 'toggle']).isRequired,\r\n commands: PropTypes.arrayOf(\r\n PropTypes.shape({\r\n commandName: PropTypes.string.isRequired,\r\n context: PropTypes.string,\r\n })\r\n ),\r\n onInteraction: PropTypes.func.isRequired,\r\n servicesManager: PropTypes.shape({\r\n services: PropTypes.shape({\r\n toolbarService: PropTypes.shape({\r\n subscribe: PropTypes.func.isRequired,\r\n state: PropTypes.shape({\r\n primaryToolId: PropTypes.string,\r\n toggles: PropTypes.objectOf(PropTypes.bool),\r\n groups: PropTypes.objectOf(PropTypes.object),\r\n }).isRequired,\r\n }).isRequired,\r\n }).isRequired,\r\n }).isRequired,\r\n};\r\n\r\nexport default ToolbarButtonWithServices;\r\n","import { Types } from '@ohif/ui';\r\nimport { Menu, SelectorProps, MenuItem, ContextMenuProps } from './types';\r\n\r\ntype ContextMenuItem = Types.ContextMenuItem;\r\n\r\n/**\r\n * Finds menu by menu id\r\n *\r\n * @returns Menu having the menuId\r\n */\r\nexport function findMenuById(menus: Menu[], menuId?: string): Menu {\r\n if (!menuId) {\r\n return;\r\n }\r\n\r\n return menus.find(menu => menu.id === menuId);\r\n}\r\n\r\n/**\r\n * Default finding menu method. This method will go through\r\n * the list of menus until it finds the first one which\r\n * has no selector, OR has the selector, when applied to the\r\n * check props, return true.\r\n * The selectorProps are a set of provided properties which can be\r\n * passed into the selector function to determine when to display a menu.\r\n * For example, a selector function of:\r\n * `({displayset}) => displaySet?.SeriesDescription?.indexOf?.('Left')!==-1\r\n * would match series descriptions containing 'Left'.\r\n *\r\n * @param {Object[]} menus List of menus\r\n * @param {*} subProps\r\n * @returns\r\n */\r\nexport function findMenuDefault(menus: Menu[], subProps: Record): Menu {\r\n if (!menus) {\r\n return null;\r\n }\r\n return menus.find(menu => !menu.selector || menu.selector(subProps.selectorProps));\r\n}\r\n\r\n/**\r\n * Finds the menu to be used for different scenarios:\r\n * This will first look for a subMenu with the specified subMenuId\r\n * Next it will look for the first menu whose selector returns true.\r\n *\r\n * @param menus - List of menus\r\n * @param props - root props\r\n * @param menuIdFilter - menu id identifier (to be considered on selection)\r\n * This is intended to support other types of filtering in the future.\r\n */\r\nexport function findMenu(menus: Menu[], props?: Types.IProps, menuIdFilter?: string) {\r\n const { subMenu } = props;\r\n\r\n function* findMenuIterator() {\r\n yield findMenuById(menus, menuIdFilter || subMenu);\r\n yield findMenuDefault(menus, props);\r\n }\r\n\r\n const findIt = findMenuIterator();\r\n\r\n let current = findIt.next();\r\n let menu = current.value;\r\n\r\n while (!current.done) {\r\n menu = current.value;\r\n\r\n if (menu) {\r\n findIt.return();\r\n }\r\n current = findIt.next();\r\n }\r\n\r\n console.log('Menu chosen', menu?.id || 'NONE');\r\n\r\n return menu;\r\n}\r\n\r\n/**\r\n * Returns the menu from a list of possible menus, based on the actual state of component props and tool data nearby.\r\n * This uses the findMenu command above to first find the appropriate\r\n * menu, and then it chooses the actual contents of that menu.\r\n * A menu item can be optional by implementing the 'selector',\r\n * which will be called with the selectorProps, and if it does not return true,\r\n * then the item is excluded.\r\n *\r\n * Other menus can be delegated to by setting the delegating value to\r\n * a string id for another menu. That menu's content will replace the\r\n * current menu item (only if the item would be included).\r\n *\r\n * This allows single id menus to be chosen by id, but have varying contents\r\n * based on the delegated menus.\r\n *\r\n * Finally, for each item, the adaptItem call is made. This allows\r\n * items to modify themselves before being displayed, such as\r\n * incorporating additional information from translation sources.\r\n * See the `test-mode` examples for details.\r\n *\r\n * @param selectorProps\r\n * @param {*} event event that originates the context menu\r\n * @param {*} menus List of menus\r\n * @param {*} menuIdFilter\r\n * @returns\r\n */\r\nexport function getMenuItems(\r\n selectorProps: SelectorProps,\r\n event: Event,\r\n menus: Menu[],\r\n menuIdFilter?: string\r\n): MenuItem[] | void {\r\n // Include both the check props and the ...check props as one is used\r\n // by the child menu and the other used by the selector function\r\n const subProps = { selectorProps, event };\r\n\r\n const menu = findMenu(menus, subProps, menuIdFilter);\r\n\r\n if (!menu) {\r\n return undefined;\r\n }\r\n\r\n if (!menu.items) {\r\n console.warn('Must define items in menu', menu);\r\n return [];\r\n }\r\n\r\n let menuItems = [];\r\n menu.items.forEach(item => {\r\n const { delegating, selector, subMenu } = item;\r\n\r\n if (!selector || selector(selectorProps)) {\r\n if (delegating) {\r\n menuItems = [...menuItems, ...getMenuItems(selectorProps, event, menus, subMenu)];\r\n } else {\r\n const toAdd = adaptItem(item, subProps);\r\n menuItems.push(toAdd);\r\n }\r\n }\r\n });\r\n\r\n return menuItems;\r\n}\r\n\r\n/**\r\n * Returns item adapted to be consumed by ContextMenu component\r\n * and then goes through the item to add action behaviour for clicking the item,\r\n * making it compatible with the default ContextMenu display.\r\n *\r\n * @param {Object} item\r\n * @param {Object} subProps\r\n * @returns a MenuItem that is compatible with the base ContextMenu\r\n * This requires having a label and set of actions to be called.\r\n */\r\nexport function adaptItem(item: MenuItem, subProps: ContextMenuProps): ContextMenuItem {\r\n const newItem: ContextMenuItem = {\r\n ...item,\r\n value: subProps.selectorProps?.value,\r\n };\r\n\r\n if (item.actionType === 'ShowSubMenu' && !newItem.iconRight) {\r\n newItem.iconRight = 'chevron-menu';\r\n }\r\n if (!item.action) {\r\n newItem.action = (itemRef, componentProps) => {\r\n const { event = {} } = componentProps;\r\n const { detail = {} } = event;\r\n newItem.element = detail.element;\r\n\r\n componentProps.onClose();\r\n const action = componentProps[`on${itemRef.actionType || 'Default'}`];\r\n if (action) {\r\n action.call(componentProps, newItem, itemRef, subProps);\r\n } else {\r\n console.warn('No action defined for', itemRef);\r\n }\r\n };\r\n }\r\n\r\n return newItem;\r\n}\r\n","import * as ContextMenuItemsBuilder from './ContextMenuItemsBuilder';\r\nimport ContextMenu from '../../../../platform/ui/src/components/ContextMenu/ContextMenu';\r\nimport { CommandsManager, ServicesManager, Types } from '@ohif/core';\r\nimport { Menu, MenuItem, Point, ContextMenuProps } from './types';\r\n\r\n/**\r\n * The context menu controller is a helper class that knows how\r\n * to manage context menus based on the UI Customization Service.\r\n * There are a few parts to this:\r\n * 1. Basic controls to manage displaying and hiding context menus\r\n * 2. Menu selection services, which use the UI customization service\r\n * to choose which menu to display\r\n * 3. Menu item adapter services to convert menu items into displayable and actionable items.\r\n *\r\n * The format for a menu is defined in the exported type MenuItem\r\n */\r\nexport default class ContextMenuController {\r\n commandsManager: CommandsManager;\r\n services: Types.Services;\r\n menuItems: Menu[] | MenuItem[];\r\n\r\n constructor(servicesManager: ServicesManager, commandsManager: CommandsManager) {\r\n this.services = servicesManager.services as Obj;\r\n this.commandsManager = commandsManager;\r\n }\r\n\r\n closeContextMenu() {\r\n this.services.uiDialogService.dismiss({ id: 'context-menu' });\r\n }\r\n\r\n /**\r\n * Figures out which context menu is appropriate to display and shows it.\r\n *\r\n * @param contextMenuProps - the context menu properties, see ./types.ts\r\n * @param viewportElement - the DOM element this context menu is related to\r\n * @param defaultPointsPosition - a default position to show the context menu\r\n */\r\n showContextMenu(\r\n contextMenuProps: ContextMenuProps,\r\n viewportElement,\r\n defaultPointsPosition\r\n ): void {\r\n if (!this.services.uiDialogService) {\r\n console.warn('Unable to show dialog; no UI Dialog Service available.');\r\n return;\r\n }\r\n\r\n const { event, subMenu, menuId, menus, selectorProps } = contextMenuProps;\r\n\r\n console.log('Getting items from', menus);\r\n const items = ContextMenuItemsBuilder.getMenuItems(\r\n selectorProps || contextMenuProps,\r\n event,\r\n menus,\r\n menuId\r\n );\r\n\r\n this.services.uiDialogService.dismiss({ id: 'context-menu' });\r\n this.services.uiDialogService.create({\r\n id: 'context-menu',\r\n isDraggable: false,\r\n preservePosition: false,\r\n preventCutOf: true,\r\n defaultPosition: ContextMenuController._getDefaultPosition(\r\n defaultPointsPosition,\r\n event?.detail,\r\n viewportElement\r\n ),\r\n event,\r\n content: ContextMenu,\r\n\r\n // This naming is part of the uiDialogService convention\r\n // Clicking outside simply closes the dialog box.\r\n onClickOutside: () => this.services.uiDialogService.dismiss({ id: 'context-menu' }),\r\n\r\n contentProps: {\r\n items,\r\n selectorProps,\r\n menus,\r\n event,\r\n subMenu,\r\n eventData: event?.detail,\r\n\r\n onClose: () => {\r\n this.services.uiDialogService.dismiss({ id: 'context-menu' });\r\n },\r\n\r\n /**\r\n * Displays a sub-menu, removing this menu\r\n * @param {*} item\r\n * @param {*} itemRef\r\n * @param {*} subProps\r\n */\r\n onShowSubMenu: (item, itemRef, subProps) => {\r\n if (!itemRef.subMenu) {\r\n console.warn('No submenu defined for', item, itemRef, subProps);\r\n return;\r\n }\r\n this.showContextMenu(\r\n {\r\n ...contextMenuProps,\r\n menuId: itemRef.subMenu,\r\n },\r\n viewportElement,\r\n defaultPointsPosition\r\n );\r\n },\r\n\r\n // Default is to run the specified commands.\r\n onDefault: (item, itemRef, subProps) => {\r\n this.commandsManager.run(item, {\r\n ...selectorProps,\r\n ...itemRef,\r\n subProps,\r\n });\r\n },\r\n },\r\n });\r\n }\r\n\r\n static getDefaultPosition = (): Point => {\r\n return {\r\n x: 0,\r\n y: 0,\r\n };\r\n };\r\n\r\n static _getEventDefaultPosition = eventDetail => ({\r\n x: eventDetail && eventDetail.currentPoints.client[0],\r\n y: eventDetail && eventDetail.currentPoints.client[1],\r\n });\r\n\r\n static _getElementDefaultPosition = element => {\r\n if (element) {\r\n const boundingClientRect = element.getBoundingClientRect();\r\n return {\r\n x: boundingClientRect.x,\r\n y: boundingClientRect.y,\r\n };\r\n }\r\n\r\n return {\r\n x: undefined,\r\n y: undefined,\r\n };\r\n };\r\n\r\n static _getCanvasPointsPosition = (points = [], element) => {\r\n const viewerPos = ContextMenuController._getElementDefaultPosition(element);\r\n\r\n for (let pointIndex = 0; pointIndex < points.length; pointIndex++) {\r\n const point = {\r\n x: points[pointIndex][0] || points[pointIndex]['x'],\r\n y: points[pointIndex][1] || points[pointIndex]['y'],\r\n };\r\n if (\r\n ContextMenuController._isValidPosition(point) &&\r\n ContextMenuController._isValidPosition(viewerPos)\r\n ) {\r\n return {\r\n x: point.x + viewerPos.x,\r\n y: point.y + viewerPos.y,\r\n };\r\n }\r\n }\r\n };\r\n\r\n static _isValidPosition = (source): boolean => {\r\n return source && typeof source.x === 'number' && typeof source.y === 'number';\r\n };\r\n\r\n /**\r\n * Returns the context menu default position. It look for the positions of: canvasPoints (got from selected), event that triggers it, current viewport element\r\n */\r\n static _getDefaultPosition = (canvasPoints, eventDetail, viewerElement) => {\r\n function* getPositionIterator() {\r\n yield ContextMenuController._getCanvasPointsPosition(canvasPoints, viewerElement);\r\n yield ContextMenuController._getEventDefaultPosition(eventDetail);\r\n yield ContextMenuController._getElementDefaultPosition(viewerElement);\r\n yield ContextMenuController.getDefaultPosition();\r\n }\r\n\r\n const positionIterator = getPositionIterator();\r\n\r\n let current = positionIterator.next();\r\n let position = current.value;\r\n\r\n while (!current.done) {\r\n position = current.value;\r\n\r\n if (ContextMenuController._isValidPosition(position)) {\r\n positionIterator.return();\r\n }\r\n current = positionIterator.next();\r\n }\r\n\r\n return position;\r\n };\r\n}\r\n","const defaultContextMenu = {\r\n id: 'measurementsContextMenu',\r\n customizationType: 'ohif.contextMenu',\r\n menus: [\r\n // Get the items from the UI Customization for the menu name (and have a custom name)\r\n {\r\n id: 'forExistingMeasurement',\r\n selector: ({ nearbyToolData }) => !!nearbyToolData,\r\n items: [\r\n {\r\n label: 'Delete measurement',\r\n commands: [\r\n {\r\n commandName: 'deleteMeasurement',\r\n },\r\n ],\r\n },\r\n {\r\n label: 'Add Label',\r\n commands: [\r\n {\r\n commandName: 'setMeasurementLabel',\r\n },\r\n ],\r\n },\r\n ],\r\n },\r\n ],\r\n};\r\n\r\nexport default defaultContextMenu;\r\n","import React, { useCallback, useEffect, useRef, useState } from 'react';\r\nimport { VariableSizeList as List } from 'react-window';\r\nimport classNames from 'classnames';\r\nimport debounce from 'lodash.debounce';\r\n\r\nconst lineHeightPx = 20;\r\nconst lineHeightClassName = `leading-[${lineHeightPx}px]`;\r\nconst rowVerticalPaddingPx = 10;\r\nconst rowBottomBorderPx = 1;\r\nconst rowVerticalPaddingStyle = { padding: `${rowVerticalPaddingPx}px 0` };\r\nconst rowStyle = {\r\n borderBottomWidth: `${rowBottomBorderPx}px`,\r\n ...rowVerticalPaddingStyle,\r\n};\r\n\r\nfunction ColumnHeaders({ tagRef, vrRef, keywordRef, valueRef }) {\r\n return (\r\n \r\n
\r\n \r\n Tag\r\n \r\n
\r\n
\r\n \r\n VR\r\n \r\n
\r\n
\r\n \r\n Keyword\r\n \r\n
\r\n
\r\n \r\n Value\r\n \r\n
\r\n \r\n );\r\n}\r\n\r\nfunction DicomTagTable({ rows }) {\r\n const listRef = useRef();\r\n const canvasRef = useRef();\r\n\r\n const [tagHeaderElem, setTagHeaderElem] = useState(null);\r\n const [vrHeaderElem, setVrHeaderElem] = useState(null);\r\n const [keywordHeaderElem, setKeywordHeaderElem] = useState(null);\r\n const [valueHeaderElem, setValueHeaderElem] = useState(null);\r\n\r\n // Here the refs are inturn stored in state to trigger a render of the table.\r\n // This virtualized table does NOT render until the header is rendered because the header column widths are used to determine the row heights in the table.\r\n // Therefore whenever the refs change (in particular the first time the refs are set), we want to trigger a render of the table.\r\n const tagRef = elem => {\r\n if (elem) {\r\n setTagHeaderElem(elem);\r\n }\r\n };\r\n const vrRef = elem => {\r\n if (elem) {\r\n setVrHeaderElem(elem);\r\n }\r\n };\r\n const keywordRef = elem => {\r\n if (elem) {\r\n setKeywordHeaderElem(elem);\r\n }\r\n };\r\n const valueRef = elem => {\r\n if (elem) {\r\n setValueHeaderElem(elem);\r\n }\r\n };\r\n\r\n /**\r\n * When new rows are set, scroll to the top and reset the virtualization.\r\n */\r\n useEffect(() => {\r\n if (!listRef?.current) {\r\n return;\r\n }\r\n\r\n listRef.current.scrollTo(0);\r\n listRef.current.resetAfterIndex(0);\r\n }, [rows]);\r\n\r\n /**\r\n * When the browser window resizes, update the row virtualization (i.e. row heights)\r\n */\r\n useEffect(() => {\r\n const debouncedResize = debounce(() => listRef.current.resetAfterIndex(0), 100);\r\n\r\n window.addEventListener('resize', debouncedResize);\r\n\r\n return () => {\r\n debouncedResize.cancel();\r\n window.removeEventListener('resize', debouncedResize);\r\n };\r\n }, []);\r\n\r\n const Row = useCallback(\r\n ({ index, style }) => {\r\n const row = rows[index];\r\n\r\n return (\r\n \r\n
{row[0]}
\r\n
{row[1]}
\r\n
{row[2]}
\r\n
{row[3]}
\r\n \r\n );\r\n },\r\n [rows]\r\n );\r\n\r\n /**\r\n * Whenever any one of the column headers is set, then the header is rendered.\r\n * Here we chose the tag header.\r\n */\r\n const isHeaderRendered = useCallback(() => tagHeaderElem !== null, [tagHeaderElem]);\r\n\r\n /**\r\n * Get the item/row size. We use the header column widths to calculate the various row heights.\r\n * @param index the row index\r\n * @returns the row height\r\n */\r\n const getItemSize = useCallback(\r\n index => {\r\n const headerWidths = [\r\n tagHeaderElem.offsetWidth,\r\n vrHeaderElem.offsetWidth,\r\n keywordHeaderElem.offsetWidth,\r\n valueHeaderElem.offsetWidth,\r\n ];\r\n\r\n const context = canvasRef.current.getContext('2d');\r\n context.font = getComputedStyle(canvasRef.current).font;\r\n\r\n return rows[index]\r\n .map((colText, index) => {\r\n const colOneLineWidth = context.measureText(colText).width;\r\n const numLines = Math.ceil(colOneLineWidth / headerWidths[index]);\r\n return numLines * lineHeightPx + 2 * rowVerticalPaddingPx + rowBottomBorderPx;\r\n })\r\n .reduce((maxHeight, colHeight) => Math.max(maxHeight, colHeight));\r\n },\r\n [rows, keywordHeaderElem, tagHeaderElem, valueHeaderElem, vrHeaderElem]\r\n );\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n {isHeaderRendered() && (\r\n \r\n {Row}\r\n \r\n )}\r\n
\r\n \r\n );\r\n}\r\n\r\nexport default DicomTagTable;\r\n","import dcmjs from 'dcmjs';\r\nimport moment from 'moment';\r\nimport React, { useState, useMemo, useEffect } from 'react';\r\nimport { classes } from '@ohif/core';\r\nimport { InputRange, Select, Typography, InputFilterText } from '@ohif/ui';\r\nimport debounce from 'lodash.debounce';\r\n\r\nimport DicomTagTable from './DicomTagTable';\r\nimport './DicomTagBrowser.css';\r\n\r\nconst { ImageSet } = classes;\r\nconst { DicomMetaDictionary } = dcmjs.data;\r\nconst { nameMap } = DicomMetaDictionary;\r\n\r\nconst DicomTagBrowser = ({ displaySets, displaySetInstanceUID }) => {\r\n // The column indices that are to be excluded during a filter of the table.\r\n // At present the column indices are:\r\n // 0: DICOM tag\r\n // 1: VR\r\n // 2: Keyword\r\n // 3: Value\r\n const excludedColumnIndicesForFilter: Set = new Set([1]);\r\n\r\n const [selectedDisplaySetInstanceUID, setSelectedDisplaySetInstanceUID] =\r\n useState(displaySetInstanceUID);\r\n const [instanceNumber, setInstanceNumber] = useState(1);\r\n const [filterValue, setFilterValue] = useState('');\r\n\r\n const onSelectChange = value => {\r\n setSelectedDisplaySetInstanceUID(value.value);\r\n setInstanceNumber(1);\r\n };\r\n\r\n const activeDisplaySet = displaySets.find(\r\n ds => ds.displaySetInstanceUID === selectedDisplaySetInstanceUID\r\n );\r\n\r\n const isImageStack = _isImageStack(activeDisplaySet);\r\n const showInstanceList = isImageStack && activeDisplaySet.images.length > 1;\r\n\r\n const displaySetList = useMemo(() => {\r\n displaySets.sort((a, b) => a.SeriesNumber - b.SeriesNumber);\r\n return displaySets.map(displaySet => {\r\n const {\r\n displaySetInstanceUID,\r\n SeriesDate,\r\n SeriesTime,\r\n SeriesNumber,\r\n SeriesDescription,\r\n Modality,\r\n } = displaySet;\r\n\r\n /* Map to display representation */\r\n const dateStr = `${SeriesDate}:${SeriesTime}`.split('.')[0];\r\n const date = moment(dateStr, 'YYYYMMDD:HHmmss');\r\n const displayDate = date.format('ddd, MMM Do YYYY');\r\n\r\n return {\r\n value: displaySetInstanceUID,\r\n label: `${SeriesNumber} (${Modality}): ${SeriesDescription}`,\r\n description: displayDate,\r\n };\r\n });\r\n }, [displaySets]);\r\n\r\n const rows = useMemo(() => {\r\n let metadata;\r\n if (isImageStack) {\r\n metadata = activeDisplaySet.images[instanceNumber - 1];\r\n } else {\r\n metadata = activeDisplaySet.instance || activeDisplaySet;\r\n }\r\n const tags = getSortedTags(metadata);\r\n return getFormattedRowsFromTags(tags, metadata);\r\n }, [instanceNumber, selectedDisplaySetInstanceUID]);\r\n\r\n const filteredRows = useMemo(() => {\r\n if (!filterValue) {\r\n return rows;\r\n }\r\n\r\n const filterValueLowerCase = filterValue.toLowerCase();\r\n return rows.filter(row => {\r\n return row.reduce((keepRow, col, colIndex) => {\r\n if (keepRow) {\r\n // We are already keeping the row, why do more work so return now.\r\n return keepRow;\r\n }\r\n\r\n if (excludedColumnIndicesForFilter.has(colIndex)) {\r\n return keepRow;\r\n }\r\n\r\n return keepRow || col.toLowerCase().includes(filterValueLowerCase);\r\n }, false);\r\n });\r\n }, [rows, filterValue]);\r\n\r\n const debouncedSetFilterValue = useMemo(() => {\r\n return debounce(setFilterValue, 200);\r\n }, []);\r\n\r\n useEffect(() => {\r\n return () => {\r\n debouncedSetFilterValue?.cancel();\r\n };\r\n }, []);\r\n\r\n return (\r\n
\r\n
\r\n
\r\n \r\n Series\r\n \r\n
\r\n ds.value === selectedDisplaySetInstanceUID)}\r\n className=\"text-white\"\r\n />\r\n
\r\n
\r\n
\r\n {showInstanceList && (\r\n \r\n Instance Number\r\n \r\n )}\r\n {showInstanceList && (\r\n
\r\n {\r\n setInstanceNumber(parseInt(value));\r\n }}\r\n minValue={1}\r\n maxValue={activeDisplaySet.images.length}\r\n step={1}\r\n inputClassName=\"w-full\"\r\n labelPosition=\"left\"\r\n trackColor={'#3a3f99'}\r\n />\r\n
\r\n )}\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n \r\n
\r\n );\r\n};\r\n\r\nfunction getFormattedRowsFromTags(tags, metadata) {\r\n const rows = [];\r\n\r\n tags.forEach(tagInfo => {\r\n if (tagInfo.vr === 'SQ') {\r\n rows.push([`${tagInfo.tagIndent}${tagInfo.tag}`, tagInfo.vr, tagInfo.keyword, '']);\r\n\r\n const { values } = tagInfo;\r\n\r\n values.forEach((item, index) => {\r\n const formatedRowsFromTags = getFormattedRowsFromTags(item, metadata);\r\n\r\n rows.push([`${item[0].tagIndent}(FFFE,E000)`, '', `Item #${index}`, '']);\r\n\r\n rows.push(...formatedRowsFromTags);\r\n });\r\n } else {\r\n if (tagInfo.vr === 'xs') {\r\n try {\r\n const tag = dcmjs.data.Tag.fromPString(tagInfo.tag).toCleanString();\r\n const originalTagInfo = metadata[tag];\r\n tagInfo.vr = originalTagInfo.vr;\r\n } catch (error) {\r\n console.error(`Failed to parse value representation for tag '${tagInfo.keyword}'`);\r\n }\r\n }\r\n rows.push([`${tagInfo.tagIndent}${tagInfo.tag}`, tagInfo.vr, tagInfo.keyword, tagInfo.value]);\r\n }\r\n });\r\n\r\n return rows;\r\n}\r\n\r\nfunction getSortedTags(metadata) {\r\n const tagList = getRows(metadata);\r\n\r\n // Sort top level tags, sequence groups are sorted when created.\r\n _sortTagList(tagList);\r\n\r\n return tagList;\r\n}\r\n\r\nfunction getRows(metadata, depth = 0) {\r\n // Tag, Type, Value, Keyword\r\n\r\n const keywords = Object.keys(metadata);\r\n\r\n let tagIndent = '';\r\n\r\n for (let i = 0; i < depth; i++) {\r\n tagIndent += '>';\r\n }\r\n\r\n if (depth > 0) {\r\n tagIndent += ' '; // If indented, add a space after the indents.\r\n }\r\n\r\n const rows = [];\r\n for (let i = 0; i < keywords.length; i++) {\r\n let keyword = keywords[i];\r\n\r\n if (keyword === '_vrMap') {\r\n continue;\r\n }\r\n\r\n const tagInfo = nameMap[keyword];\r\n\r\n let value = metadata[keyword];\r\n\r\n if (tagInfo && tagInfo.vr === 'SQ') {\r\n const sequenceAsArray = toArray(value);\r\n\r\n // Push line defining the sequence\r\n\r\n const sequence = {\r\n tag: tagInfo.tag,\r\n tagIndent,\r\n vr: tagInfo.vr,\r\n keyword,\r\n values: [],\r\n };\r\n\r\n rows.push(sequence);\r\n\r\n if (value === null) {\r\n // Type 2 Sequence\r\n continue;\r\n }\r\n\r\n sequenceAsArray.forEach(item => {\r\n const sequenceRows = getRows(item, depth + 1);\r\n\r\n if (sequenceRows.length) {\r\n // Sort the sequence group.\r\n _sortTagList(sequenceRows);\r\n sequence.values.push(sequenceRows);\r\n }\r\n });\r\n\r\n continue;\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n if (value.length > 0 && typeof value[0] != 'object') {\r\n value = value.join('\\\\');\r\n }\r\n }\r\n\r\n if (typeof value === 'number') {\r\n value = value.toString();\r\n }\r\n\r\n if (typeof value !== 'string') {\r\n if (value === null) {\r\n value = ' ';\r\n } else {\r\n if (typeof value === 'object') {\r\n if (value.InlineBinary) {\r\n value = 'Inline Binary';\r\n } else if (value.BulkDataURI) {\r\n value = `Bulk Data URI`; //: ${value.BulkDataURI}`;\r\n } else if (value.Alphabetic) {\r\n value = value.Alphabetic;\r\n } else {\r\n console.warn(`Unrecognised Value: ${value} for ${keyword}:`);\r\n console.warn(value);\r\n value = ' ';\r\n }\r\n } else {\r\n console.warn(`Unrecognised Value: ${value} for ${keyword}:`);\r\n value = ' ';\r\n }\r\n }\r\n }\r\n\r\n // tag / vr/ keyword/ value\r\n\r\n // Remove retired tags\r\n keyword = keyword.replace('RETIRED_', '');\r\n if (tagInfo) {\r\n rows.push({\r\n tag: tagInfo.tag,\r\n tagIndent,\r\n vr: tagInfo.vr,\r\n keyword,\r\n value,\r\n });\r\n } else {\r\n // skip properties without hex tag numbers\r\n const regex = /[0-9A-Fa-f]{6}/g;\r\n if (keyword.match(regex)) {\r\n const tag = `(${keyword.substring(0, 4)},${keyword.substring(4, 8)})`;\r\n rows.push({\r\n tag,\r\n tagIndent,\r\n vr: '',\r\n keyword: 'Private Tag',\r\n value,\r\n });\r\n }\r\n }\r\n }\r\n\r\n return rows;\r\n}\r\n\r\nfunction _isImageStack(displaySet) {\r\n return displaySet instanceof ImageSet;\r\n}\r\n\r\nfunction toArray(objectOrArray) {\r\n return Array.isArray(objectOrArray) ? objectOrArray : [objectOrArray];\r\n}\r\n\r\nfunction _sortTagList(tagList) {\r\n tagList.sort((a, b) => {\r\n if (a.tag < b.tag) {\r\n return -1;\r\n }\r\n\r\n return 1;\r\n });\r\n}\r\n\r\nexport default DicomTagBrowser;\r\n","import { HangingProtocolService, StateSyncService, Types } from '@ohif/core';\r\n\r\nexport type ReturnType = {\r\n hangingProtocolStageIndexMap: Record;\r\n viewportGridStore: Record;\r\n displaySetSelectorMap: Record;\r\n};\r\n\r\n/**\r\n * Calculates a set of state information for hanging protocols and viewport grid\r\n * which defines the currently applied hanging protocol state.\r\n * @param state is the viewport grid state\r\n * @param syncService is the state sync service to use for getting existing state\r\n * @returns Set of states that can be applied to the state sync to remember\r\n * the current view state.\r\n */\r\nconst reuseCachedLayout = (\r\n state,\r\n hangingProtocolService: HangingProtocolService,\r\n syncService: StateSyncService\r\n): ReturnType => {\r\n const { activeViewportId } = state;\r\n const { protocol } = hangingProtocolService.getActiveProtocol();\r\n const hpInfo = hangingProtocolService.getState();\r\n const { protocolId, stageIndex, activeStudyUID } = hpInfo;\r\n\r\n const syncState = syncService.getState();\r\n const viewportGridStore = { ...syncState.viewportGridStore };\r\n const displaySetSelectorMap = { ...syncState.displaySetSelectorMap };\r\n\r\n const stage = protocol.stages[stageIndex];\r\n const storeId = `${activeStudyUID}:${protocolId}:${stageIndex}`;\r\n const cacheId = `${activeStudyUID}:${protocolId}`;\r\n const hangingProtocolStageIndexMap = {\r\n ...syncState.hangingProtocolStageIndexMap,\r\n };\r\n const { rows, columns } = stage.viewportStructure.properties;\r\n const custom =\r\n stage.viewports.length !== state.viewports.size ||\r\n state.layout.numRows !== rows ||\r\n state.layout.numCols !== columns;\r\n\r\n hangingProtocolStageIndexMap[cacheId] = hpInfo;\r\n\r\n if (storeId && custom) {\r\n viewportGridStore[storeId] = { ...state };\r\n }\r\n\r\n state.viewports.forEach((viewport, viewportId) => {\r\n const { displaySetOptions, displaySetInstanceUIDs } = viewport;\r\n if (!displaySetOptions) {\r\n return;\r\n }\r\n for (let i = 0; i < displaySetOptions.length; i++) {\r\n const displaySetUID = displaySetInstanceUIDs[i];\r\n if (!displaySetUID) {\r\n continue;\r\n }\r\n if (viewportId === activeViewportId && i === 0) {\r\n displaySetSelectorMap[`${activeStudyUID}:activeDisplaySet:0`] = displaySetUID;\r\n }\r\n if (displaySetOptions[i]?.id) {\r\n displaySetSelectorMap[\r\n `${activeStudyUID}:${displaySetOptions[i].id}:${\r\n displaySetOptions[i].matchedDisplaySetsIndex || 0\r\n }`\r\n ] = displaySetUID;\r\n }\r\n }\r\n });\r\n\r\n return {\r\n hangingProtocolStageIndexMap,\r\n viewportGridStore,\r\n displaySetSelectorMap,\r\n };\r\n};\r\n\r\nexport default reuseCachedLayout;\r\n","import { StateSyncService } from '@ohif/core';\r\n\r\n/**\r\n * This find or create viewport is paired with the reduce results from\r\n * below, and the action of this viewport is to look for previously filled\r\n * viewports, and to reuse by position id. If there is no filled viewport,\r\n * then one can be re-used from the display set if it isn't going to be displayed.\r\n * @param hangingProtocolService - bound parameter supplied before using this\r\n * @param viewportsByPosition - bound parameter supplied before using this\r\n * @param position - the position in the grid to retrieve\r\n * @param positionId - the current position on screen to retrieve\r\n * @param options - the set of options used, so that subsequent calls can\r\n * store state that is reset by the setLayout.\r\n * This class uses the options to store the already viewed\r\n * display sets, filling it initially with the pre-existing viewports.\r\n */\r\nexport const findOrCreateViewport = (\r\n hangingProtocolService,\r\n viewportsByPosition,\r\n position: number,\r\n positionId: string,\r\n options: Record\r\n) => {\r\n const byPositionViewport = viewportsByPosition?.[positionId];\r\n if (byPositionViewport) {\r\n return { ...byPositionViewport };\r\n }\r\n const { protocolId, stageIndex } = hangingProtocolService.getState();\r\n\r\n // Setup the initial in display correctly for initial view/select\r\n if (!options.inDisplay) {\r\n options.inDisplay = [...viewportsByPosition.initialInDisplay];\r\n }\r\n // See if there is a default viewport for new views.\r\n const missing = hangingProtocolService.getMissingViewport(protocolId, stageIndex, options);\r\n if (missing) {\r\n const displaySetInstanceUIDs = missing.displaySetsInfo.map(it => it.displaySetInstanceUID);\r\n options.inDisplay.push(...displaySetInstanceUIDs);\r\n return {\r\n displaySetInstanceUIDs,\r\n displaySetOptions: missing.displaySetsInfo.map(it => it.displaySetOptions),\r\n viewportOptions: {\r\n ...missing.viewportOptions,\r\n },\r\n };\r\n }\r\n return {};\r\n};\r\n\r\n/**\r\n * Records the information on what viewports are displayed in which position.\r\n * Also records what instances from the existing positions are going to be in\r\n * view initially.\r\n * @param state is the viewport grid state\r\n * @param syncService is the state sync service to use for getting existing state\r\n * @returns Set of states that can be applied to the state sync to remember\r\n * the current view state.\r\n */\r\nconst findViewportsByPosition = (\r\n state,\r\n { numRows, numCols },\r\n syncService: StateSyncService\r\n): Record> => {\r\n const { viewports } = state;\r\n const syncState = syncService.getState();\r\n const viewportsByPosition = { ...syncState.viewportsByPosition };\r\n const initialInDisplay = [];\r\n\r\n viewports.forEach(viewport => {\r\n if (viewport.positionId) {\r\n const storedViewport = {\r\n ...viewport,\r\n viewportOptions: { ...viewport.viewportOptions },\r\n };\r\n viewportsByPosition[viewport.positionId] = storedViewport;\r\n }\r\n });\r\n\r\n for (let row = 0; row < numRows; row++) {\r\n for (let col = 0; col < numCols; col++) {\r\n const positionId = `${col}-${row}`;\r\n const viewport = viewportsByPosition[positionId];\r\n if (viewport?.displaySetInstanceUIDs) {\r\n initialInDisplay.push(...viewport.displaySetInstanceUIDs);\r\n }\r\n }\r\n }\r\n\r\n // Store the initially displayed elements\r\n viewportsByPosition.initialInDisplay = initialInDisplay;\r\n\r\n return { viewportsByPosition };\r\n};\r\n\r\nexport default findViewportsByPosition;\r\n","import { ServicesManager, utils, Types } from '@ohif/core';\r\n\r\nimport { ContextMenuController, defaultContextMenu } from './CustomizableContextMenu';\r\nimport DicomTagBrowser from './DicomTagBrowser/DicomTagBrowser';\r\nimport reuseCachedLayouts from './utils/reuseCachedLayouts';\r\nimport findViewportsByPosition, {\r\n findOrCreateViewport as layoutFindOrCreate,\r\n} from './findViewportsByPosition';\r\n\r\nimport { ContextMenuProps } from './CustomizableContextMenu/types';\r\nimport { NavigateHistory } from './types/commandModuleTypes';\r\nimport { history } from '@ohif/app';\r\n\r\nconst { subscribeToNextViewportGridChange } = utils;\r\n\r\nexport type HangingProtocolParams = {\r\n protocolId?: string;\r\n stageIndex?: number;\r\n activeStudyUID?: string;\r\n stageId?: string;\r\n};\r\n\r\nexport type UpdateViewportDisplaySetParams = {\r\n direction: number;\r\n excludeNonImageModalities?: boolean;\r\n};\r\n\r\n/**\r\n * Determine if a command is a hanging protocol one.\r\n * For now, just use the two hanging protocol commands that are in this\r\n * commands module, but if others get added elsewhere this may need enhancing.\r\n */\r\nconst isHangingProtocolCommand = command =>\r\n command &&\r\n (command.commandName === 'setHangingProtocol' || command.commandName === 'toggleHangingProtocol');\r\n\r\nconst commandsModule = ({\r\n servicesManager,\r\n commandsManager,\r\n}: Types.Extensions.ExtensionParams): Types.Extensions.CommandsModule => {\r\n const {\r\n customizationService,\r\n measurementService,\r\n hangingProtocolService,\r\n uiNotificationService,\r\n viewportGridService,\r\n displaySetService,\r\n stateSyncService,\r\n toolbarService,\r\n } = (servicesManager as ServicesManager).services;\r\n\r\n // Define a context menu controller for use with any context menus\r\n const contextMenuController = new ContextMenuController(servicesManager, commandsManager);\r\n\r\n const actions = {\r\n /**\r\n * Show the context menu.\r\n * @param options.menuId defines the menu name to lookup, from customizationService\r\n * @param options.defaultMenu contains the default menu set to use\r\n * @param options.element is the element to show the menu within\r\n * @param options.event is the event that caused the context menu\r\n * @param options.selectorProps is the set of selection properties to use\r\n */\r\n showContextMenu: (options: ContextMenuProps) => {\r\n const {\r\n menuCustomizationId,\r\n element,\r\n event,\r\n selectorProps,\r\n defaultPointsPosition = [],\r\n } = options;\r\n\r\n const optionsToUse = { ...options };\r\n\r\n if (menuCustomizationId) {\r\n Object.assign(\r\n optionsToUse,\r\n customizationService.get(menuCustomizationId, defaultContextMenu)\r\n );\r\n }\r\n\r\n // TODO - make the selectorProps richer by including the study metadata and display set.\r\n const { protocol, stage } = hangingProtocolService.getActiveProtocol();\r\n optionsToUse.selectorProps = {\r\n event,\r\n protocol,\r\n stage,\r\n ...selectorProps,\r\n };\r\n\r\n contextMenuController.showContextMenu(optionsToUse, element, defaultPointsPosition);\r\n },\r\n\r\n /** Close a context menu currently displayed */\r\n closeContextMenu: () => {\r\n contextMenuController.closeContextMenu();\r\n },\r\n\r\n displayNotification: ({ text, title, type }) => {\r\n uiNotificationService.show({\r\n title: title,\r\n message: text,\r\n type: type,\r\n });\r\n },\r\n clearMeasurements: () => {\r\n measurementService.clear();\r\n },\r\n\r\n /**\r\n * Toggles off all tools which contain a commandName of setHangingProtocol\r\n * or toggleHangingProtocol, and which match/don't match the protocol id/stage\r\n */\r\n toggleHpTools: () => {\r\n const {\r\n protocol,\r\n stageIndex: toggleStageIndex,\r\n stage,\r\n } = hangingProtocolService.getActiveProtocol();\r\n const enableListener = button => {\r\n if (!button.id) {\r\n return;\r\n }\r\n const { commands, items } = button.props || button;\r\n if (items) {\r\n items.forEach(enableListener);\r\n }\r\n const hpCommand = commands?.find?.(isHangingProtocolCommand);\r\n if (!hpCommand) {\r\n return;\r\n }\r\n const { protocolId, stageIndex, stageId } = hpCommand.commandOptions;\r\n const isActive =\r\n (!protocolId || protocolId === protocol.id) &&\r\n (stageIndex === undefined || stageIndex === toggleStageIndex) &&\r\n (!stageId || stageId === stage.id);\r\n toolbarService.setToggled(button.id, isActive);\r\n };\r\n Object.values(toolbarService.getButtons()).forEach(enableListener);\r\n },\r\n\r\n /**\r\n * Sets the specified protocol\r\n * 1. Records any existing state using the viewport grid service\r\n * 2. Finds the destination state - this can be one of:\r\n * a. The specified protocol stage\r\n * b. An alternate (toggled or restored) protocol stage\r\n * c. A restored custom layout\r\n * 3. Finds the parameters for the specified state\r\n * a. Gets the displaySetSelectorMap\r\n * b. Gets the map by position\r\n * c. Gets any toggle mapping to map position to/from current view\r\n * 4. If restore, then sets layout\r\n * a. Maps viewport position by currently displayed viewport map id\r\n * b. Uses toggle information to map display set id\r\n * 5. Else applies the hanging protocol\r\n * a. HP Service is provided displaySetSelectorMap\r\n * b. HP Service will throw an exception if it isn't applicable\r\n * @param options - contains information on the HP to apply\r\n * @param options.activeStudyUID - the updated study to apply the HP to\r\n * @param options.protocolId - the protocol ID to change to\r\n * @param options.stageId - the stageId to apply\r\n * @param options.stageIndex - the index of the stage to go to.\r\n * @param options.reset - flag to indicate if the HP should be reset to its original and not restored to a previous state\r\n */\r\n setHangingProtocol: ({\r\n activeStudyUID = '',\r\n protocolId,\r\n stageId,\r\n stageIndex,\r\n reset = false,\r\n }: HangingProtocolParams): boolean => {\r\n const primaryToolBeforeHPChange = toolbarService.getActivePrimaryTool();\r\n try {\r\n // Stores in the state the display set selector id to displaySetUID mapping\r\n // Pass in viewportId for the active viewport. This item will get set as\r\n // the activeViewportId\r\n const state = viewportGridService.getState();\r\n const hpInfo = hangingProtocolService.getState();\r\n const { protocol: oldProtocol } = hangingProtocolService.getActiveProtocol();\r\n const stateSyncReduce = reuseCachedLayouts(state, hangingProtocolService, stateSyncService);\r\n const { hangingProtocolStageIndexMap, viewportGridStore, displaySetSelectorMap } =\r\n stateSyncReduce;\r\n\r\n if (!protocolId) {\r\n // Reuse the previous protocol id, and optionally stage\r\n protocolId = hpInfo.protocolId;\r\n if (stageId === undefined && stageIndex === undefined) {\r\n stageIndex = hpInfo.stageIndex;\r\n }\r\n } else if (stageIndex === undefined && stageId === undefined) {\r\n // Re-set the same stage as was previously used\r\n const hangingId = `${activeStudyUID || hpInfo.activeStudyUID}:${protocolId}`;\r\n stageIndex = hangingProtocolStageIndexMap[hangingId]?.stageIndex;\r\n }\r\n\r\n const useStageIdx =\r\n stageIndex ??\r\n hangingProtocolService.getStageIndex(protocolId, {\r\n stageId,\r\n stageIndex,\r\n });\r\n\r\n if (activeStudyUID) {\r\n hangingProtocolService.setActiveStudyUID(activeStudyUID);\r\n }\r\n\r\n const storedHanging = `${hangingProtocolService.getState().activeStudyUID}:${protocolId}:${\r\n useStageIdx || 0\r\n }`;\r\n\r\n const restoreProtocol = !reset && viewportGridStore[storedHanging];\r\n\r\n if (\r\n protocolId === hpInfo.protocolId &&\r\n useStageIdx === hpInfo.stageIndex &&\r\n !activeStudyUID\r\n ) {\r\n // Clear the HP setting to reset them\r\n hangingProtocolService.setProtocol(protocolId, {\r\n stageId,\r\n stageIndex: useStageIdx,\r\n });\r\n } else {\r\n hangingProtocolService.setProtocol(protocolId, {\r\n displaySetSelectorMap,\r\n stageId,\r\n stageIndex: useStageIdx,\r\n restoreProtocol,\r\n });\r\n if (restoreProtocol) {\r\n viewportGridService.set(viewportGridStore[storedHanging]);\r\n }\r\n }\r\n // Do this after successfully applying the update\r\n // Note, don't store the active display set - it is only needed while\r\n // changing display sets. This causes jump to measurement to fail on\r\n // multi-study display.\r\n delete displaySetSelectorMap[\r\n `${activeStudyUID || hpInfo.activeStudyUID}:activeDisplaySet:0`\r\n ];\r\n stateSyncService.store(stateSyncReduce);\r\n // This is a default action applied\r\n const { protocol } = hangingProtocolService.getActiveProtocol();\r\n actions.toggleHpTools();\r\n\r\n // try to use the same tool in the new hanging protocol stage\r\n const primaryButton = toolbarService.getButton(primaryToolBeforeHPChange);\r\n if (primaryButton) {\r\n // is there any type of interaction on this button, if not it might be in the\r\n // items. This is a bit of a hack, but it works for now.\r\n\r\n let interactionType = primaryButton.props?.interactionType;\r\n\r\n if (!interactionType && primaryButton.props?.items) {\r\n const firstItem = primaryButton.props.items[0];\r\n interactionType = firstItem.props?.interactionType || firstItem.props?.type;\r\n }\r\n\r\n if (interactionType) {\r\n toolbarService.recordInteraction({\r\n interactionType,\r\n ...primaryButton.props,\r\n });\r\n }\r\n }\r\n\r\n // Send the notification about updating the state\r\n if (protocolId !== hpInfo.protocolId) {\r\n // The old protocol callbacks are used for turning off things\r\n // like crosshairs when moving to the new HP\r\n commandsManager.run(oldProtocol.callbacks?.onProtocolExit);\r\n // The new protocol callback is used for things like\r\n // activating modes etc.\r\n }\r\n commandsManager.run(protocol.callbacks?.onProtocolEnter);\r\n return true;\r\n } catch (e) {\r\n console.error(e);\r\n actions.toggleHpTools();\r\n uiNotificationService.show({\r\n title: 'Apply Hanging Protocol',\r\n message: 'The hanging protocol could not be applied.',\r\n type: 'error',\r\n duration: 3000,\r\n });\r\n return false;\r\n }\r\n },\r\n\r\n toggleHangingProtocol: ({ protocolId, stageIndex }: HangingProtocolParams): boolean => {\r\n const {\r\n protocol,\r\n stageIndex: desiredStageIndex,\r\n activeStudy,\r\n } = hangingProtocolService.getActiveProtocol();\r\n const { toggleHangingProtocol } = stateSyncService.getState();\r\n const storedHanging = `${activeStudy.StudyInstanceUID}:${protocolId}:${stageIndex | 0}`;\r\n if (\r\n protocol.id === protocolId &&\r\n (stageIndex === undefined || stageIndex === desiredStageIndex)\r\n ) {\r\n // Toggling off - restore to previous state\r\n const previousState = toggleHangingProtocol[storedHanging] || {\r\n protocolId: 'default',\r\n };\r\n return actions.setHangingProtocol(previousState);\r\n } else {\r\n stateSyncService.store({\r\n toggleHangingProtocol: {\r\n ...toggleHangingProtocol,\r\n [storedHanging]: {\r\n protocolId: protocol.id,\r\n stageIndex: desiredStageIndex,\r\n },\r\n },\r\n });\r\n return actions.setHangingProtocol({\r\n protocolId,\r\n stageIndex,\r\n reset: true,\r\n });\r\n }\r\n },\r\n\r\n deltaStage: ({ direction }) => {\r\n const { protocolId, stageIndex: oldStageIndex } = hangingProtocolService.getState();\r\n const { protocol } = hangingProtocolService.getActiveProtocol();\r\n for (\r\n let stageIndex = oldStageIndex + direction;\r\n stageIndex >= 0 && stageIndex < protocol.stages.length;\r\n stageIndex += direction\r\n ) {\r\n if (protocol.stages[stageIndex].status !== 'disabled') {\r\n return actions.setHangingProtocol({\r\n protocolId,\r\n stageIndex,\r\n });\r\n }\r\n }\r\n uiNotificationService.show({\r\n title: 'Change Stage',\r\n message: 'The hanging protocol has no more applicable stages',\r\n type: 'info',\r\n duration: 3000,\r\n });\r\n },\r\n\r\n /**\r\n * Changes the viewport grid layout in terms of the MxN layout.\r\n */\r\n setViewportGridLayout: ({ numRows, numCols }) => {\r\n const { protocol } = hangingProtocolService.getActiveProtocol();\r\n const onLayoutChange = protocol.callbacks?.onLayoutChange;\r\n if (commandsManager.run(onLayoutChange, { numRows, numCols }) === false) {\r\n console.log('setViewportGridLayout running', onLayoutChange, numRows, numCols);\r\n // Don't apply the layout if the run command returns false\r\n return;\r\n }\r\n\r\n const completeLayout = () => {\r\n const state = viewportGridService.getState();\r\n const stateReduce = findViewportsByPosition(state, { numRows, numCols }, stateSyncService);\r\n const findOrCreateViewport = layoutFindOrCreate.bind(\r\n null,\r\n hangingProtocolService,\r\n stateReduce.viewportsByPosition\r\n );\r\n\r\n viewportGridService.setLayout({\r\n numRows,\r\n numCols,\r\n findOrCreateViewport,\r\n });\r\n stateSyncService.store(stateReduce);\r\n };\r\n // Need to finish any work in the callback\r\n window.setTimeout(completeLayout, 0);\r\n },\r\n\r\n toggleOneUp() {\r\n const viewportGridState = viewportGridService.getState();\r\n const { activeViewportId, viewports, layout } = viewportGridState;\r\n const { displaySetInstanceUIDs, displaySetOptions, viewportOptions } =\r\n viewports.get(activeViewportId);\r\n\r\n if (layout.numCols === 1 && layout.numRows === 1) {\r\n // The viewer is in one-up. Check if there is a state to restore/toggle back to.\r\n const { toggleOneUpViewportGridStore } = stateSyncService.getState();\r\n\r\n if (!toggleOneUpViewportGridStore.layout) {\r\n return;\r\n }\r\n // There is a state to toggle back to. The viewport that was\r\n // originally toggled to one up was the former active viewport.\r\n const viewportIdToUpdate = toggleOneUpViewportGridStore.activeViewportId;\r\n\r\n // We are restoring the previous layout but taking into the account that\r\n // the current one up viewport might have a new displaySet dragged and dropped on it.\r\n // updatedViewportsViaHP below contains the viewports applicable to the HP that existed\r\n // prior to the toggle to one-up - including the updated viewports if a display\r\n // set swap were to have occurred.\r\n const updatedViewportsViaHP =\r\n displaySetInstanceUIDs.length > 1\r\n ? []\r\n : displaySetInstanceUIDs\r\n .map(displaySetInstanceUID =>\r\n hangingProtocolService.getViewportsRequireUpdate(\r\n viewportIdToUpdate,\r\n displaySetInstanceUID\r\n )\r\n )\r\n .flat();\r\n\r\n // findOrCreateViewport returns either one of the updatedViewportsViaHP\r\n // returned from the HP service OR if there is not one from the HP service then\r\n // simply returns what was in the previous state for a given position in the layout.\r\n const findOrCreateViewport = (position: number, positionId: string) => {\r\n // Find the viewport for the given position prior to the toggle to one-up.\r\n const preOneUpViewport = Array.from(toggleOneUpViewportGridStore.viewports.values()).find(\r\n viewport => viewport.positionId === positionId\r\n );\r\n\r\n // Use the viewport id from before the toggle to one-up to find any updates to the viewport.\r\n const viewport = updatedViewportsViaHP.find(\r\n viewport => viewport.viewportId === preOneUpViewport.viewportId\r\n );\r\n\r\n return viewport\r\n ? // Use the applicable viewport from the HP updated viewports\r\n { viewportOptions, displaySetOptions, ...viewport }\r\n : // Use the previous viewport for the given position\r\n preOneUpViewport;\r\n };\r\n\r\n const layoutOptions = viewportGridService.getLayoutOptionsFromState(\r\n toggleOneUpViewportGridStore\r\n );\r\n\r\n // Restore the previous layout including the active viewport.\r\n viewportGridService.setLayout({\r\n numRows: toggleOneUpViewportGridStore.layout.numRows,\r\n numCols: toggleOneUpViewportGridStore.layout.numCols,\r\n activeViewportId: viewportIdToUpdate,\r\n layoutOptions,\r\n findOrCreateViewport,\r\n });\r\n } else {\r\n // We are not in one-up, so toggle to one up.\r\n\r\n // Store the current viewport grid state so we can toggle it back later.\r\n stateSyncService.store({\r\n toggleOneUpViewportGridStore: viewportGridState,\r\n });\r\n\r\n // This findOrCreateViewport only return one viewport - the active\r\n // one being toggled to one up.\r\n const findOrCreateViewport = () => {\r\n return {\r\n displaySetInstanceUIDs,\r\n displaySetOptions,\r\n viewportOptions,\r\n };\r\n };\r\n\r\n // Set the layout to be 1x1/one-up.\r\n viewportGridService.setLayout({\r\n numRows: 1,\r\n numCols: 1,\r\n findOrCreateViewport,\r\n });\r\n\r\n // Subscribe to ANY (i.e. manual and hanging protocol) layout changes so that\r\n // any grid layout state to toggle to from one up is cleared. This is performed on\r\n // a timeout to avoid clearing the state for the actual to one up change.\r\n // Whenever the next layout change event is fired, the subscriptions are unsubscribed.\r\n const clearToggleOneUpViewportGridStore = () => {\r\n const toggleOneUpViewportGridStore = {};\r\n stateSyncService.store({\r\n toggleOneUpViewportGridStore,\r\n });\r\n };\r\n\r\n subscribeToNextViewportGridChange(viewportGridService, clearToggleOneUpViewportGridStore);\r\n }\r\n },\r\n\r\n /**\r\n * Exposes the browser history navigation used by OHIF. This command can be used to either replace or\r\n * push a new entry into the browser history. For example, the following will replace the current\r\n * browser history entry with the specified relative URL which changes the study displayed to the\r\n * study with study instance UID 1.2.3. Note that as a result of using `options.replace = true`, the\r\n * page prior to invoking this command cannot be returned to via the browser back button.\r\n *\r\n * navigateHistory({\r\n * to: 'viewer?StudyInstanceUIDs=1.2.3',\r\n * options: { replace: true },\r\n * });\r\n *\r\n * @param historyArgs - arguments for the history function;\r\n * the `to` property is the URL;\r\n * the `options.replace` is a boolean indicating if the current browser history entry\r\n * should be replaced or a new entry pushed onto the history (stack); the default value\r\n * for `replace` is false\r\n */\r\n navigateHistory(historyArgs: NavigateHistory) {\r\n history.navigate(historyArgs.to, historyArgs.options);\r\n },\r\n\r\n openDICOMTagViewer() {\r\n const { activeViewportId, viewports } = viewportGridService.getState();\r\n const activeViewportSpecificData = viewports.get(activeViewportId);\r\n const { displaySetInstanceUIDs } = activeViewportSpecificData;\r\n\r\n const displaySets = displaySetService.activeDisplaySets;\r\n const { UIModalService } = servicesManager.services;\r\n\r\n const displaySetInstanceUID = displaySetInstanceUIDs[0];\r\n UIModalService.show({\r\n content: DicomTagBrowser,\r\n contentProps: {\r\n displaySets,\r\n displaySetInstanceUID,\r\n onClose: UIModalService.hide,\r\n },\r\n title: 'DICOM Tag Browser',\r\n });\r\n },\r\n\r\n /**\r\n * Toggle viewport overlay (the information panel shown on the four corners\r\n * of the viewport)\r\n * @see ViewportOverlay and CustomizableViewportOverlay components\r\n */\r\n toggleOverlays: () => {\r\n const overlays = document.getElementsByClassName('viewport-overlay');\r\n for (let i = 0; i < overlays.length; i++) {\r\n overlays.item(i).classList.toggle('hidden');\r\n }\r\n },\r\n\r\n scrollActiveThumbnailIntoView: () => {\r\n const { activeViewportId, viewports } = viewportGridService.getState();\r\n\r\n const activeViewport = viewports.get(activeViewportId);\r\n const activeDisplaySetInstanceUID = activeViewport.displaySetInstanceUIDs[0];\r\n\r\n const thumbnailList = document.querySelector('#ohif-thumbnail-list');\r\n\r\n if (!thumbnailList) {\r\n return;\r\n }\r\n\r\n const thumbnailListBounds = thumbnailList.getBoundingClientRect();\r\n\r\n const thumbnail = document.querySelector(`#thumbnail-${activeDisplaySetInstanceUID}`);\r\n\r\n if (!thumbnail) {\r\n return;\r\n }\r\n\r\n const thumbnailBounds = thumbnail.getBoundingClientRect();\r\n\r\n // This only handles a vertical thumbnail list.\r\n if (\r\n thumbnailBounds.top >= thumbnailListBounds.top &&\r\n thumbnailBounds.top <= thumbnailListBounds.bottom\r\n ) {\r\n return;\r\n }\r\n\r\n thumbnail.scrollIntoView({ behavior: 'smooth' });\r\n },\r\n\r\n updateViewportDisplaySet: ({\r\n direction,\r\n excludeNonImageModalities,\r\n }: UpdateViewportDisplaySetParams) => {\r\n const nonImageModalities = ['SR', 'SEG', 'SM', 'RTSTRUCT', 'RTPLAN', 'RTDOSE'];\r\n\r\n // Sort the display sets as per the hanging protocol service viewport/display set scoring system.\r\n // The thumbnail list uses the same sorting.\r\n const dsSortFn = hangingProtocolService.getDisplaySetSortFunction();\r\n const currentDisplaySets = [...displaySetService.activeDisplaySets];\r\n\r\n currentDisplaySets.sort(dsSortFn);\r\n\r\n const { activeViewportId, viewports } = viewportGridService.getState();\r\n\r\n const { displaySetInstanceUIDs } = viewports.get(activeViewportId);\r\n\r\n const activeDisplaySetIndex = currentDisplaySets.findIndex(displaySet =>\r\n displaySetInstanceUIDs.includes(displaySet.displaySetInstanceUID)\r\n );\r\n\r\n let displaySetIndexToShow: number;\r\n\r\n for (\r\n displaySetIndexToShow = activeDisplaySetIndex + direction;\r\n displaySetIndexToShow > -1 && displaySetIndexToShow < currentDisplaySets.length;\r\n displaySetIndexToShow += direction\r\n ) {\r\n if (\r\n !excludeNonImageModalities ||\r\n !nonImageModalities.includes(currentDisplaySets[displaySetIndexToShow].Modality)\r\n ) {\r\n break;\r\n }\r\n }\r\n\r\n if (displaySetIndexToShow < 0 || displaySetIndexToShow >= currentDisplaySets.length) {\r\n return;\r\n }\r\n\r\n const { displaySetInstanceUID } = currentDisplaySets[displaySetIndexToShow];\r\n\r\n let updatedViewports = [];\r\n\r\n try {\r\n updatedViewports = hangingProtocolService.getViewportsRequireUpdate(\r\n activeViewportId,\r\n displaySetInstanceUID\r\n );\r\n } catch (error) {\r\n console.warn(error);\r\n uiNotificationService.show({\r\n title: 'Navigate Viewport Display Set',\r\n message:\r\n 'The requested display sets could not be added to the viewport due to a mismatch in the Hanging Protocol rules.',\r\n type: 'info',\r\n duration: 3000,\r\n });\r\n }\r\n\r\n viewportGridService.setDisplaySetsForViewports(updatedViewports);\r\n\r\n setTimeout(() => actions.scrollActiveThumbnailIntoView(), 0);\r\n },\r\n };\r\n\r\n const definitions = {\r\n showContextMenu: {\r\n commandFn: actions.showContextMenu,\r\n },\r\n closeContextMenu: {\r\n commandFn: actions.closeContextMenu,\r\n },\r\n clearMeasurements: {\r\n commandFn: actions.clearMeasurements,\r\n storeContexts: [],\r\n options: {},\r\n },\r\n displayNotification: {\r\n commandFn: actions.displayNotification,\r\n storeContexts: [],\r\n options: {},\r\n },\r\n setHangingProtocol: {\r\n commandFn: actions.setHangingProtocol,\r\n storeContexts: [],\r\n options: {},\r\n },\r\n toggleHangingProtocol: {\r\n commandFn: actions.toggleHangingProtocol,\r\n storeContexts: [],\r\n options: {},\r\n },\r\n navigateHistory: {\r\n commandFn: actions.navigateHistory,\r\n storeContexts: [],\r\n options: {},\r\n },\r\n nextStage: {\r\n commandFn: actions.deltaStage,\r\n storeContexts: [],\r\n options: { direction: 1 },\r\n },\r\n previousStage: {\r\n commandFn: actions.deltaStage,\r\n storeContexts: [],\r\n options: { direction: -1 },\r\n },\r\n setViewportGridLayout: {\r\n commandFn: actions.setViewportGridLayout,\r\n storeContexts: [],\r\n options: {},\r\n },\r\n toggleOneUp: {\r\n commandFn: actions.toggleOneUp,\r\n storeContexts: [],\r\n options: {},\r\n },\r\n openDICOMTagViewer: {\r\n commandFn: actions.openDICOMTagViewer,\r\n },\r\n updateViewportDisplaySet: {\r\n commandFn: actions.updateViewportDisplaySet,\r\n storeContexts: [],\r\n options: {},\r\n },\r\n };\r\n\r\n return {\r\n actions,\r\n definitions,\r\n defaultContext: 'DEFAULT',\r\n };\r\n};\r\n\r\nexport default commandsModule;\r\n","import { Types } from '@ohif/core';\r\n\r\n/**\r\n * This hanging protocol can be activated on the primary mode by directly\r\n * referencing it in a URL or by directly including it within a mode, e.g.:\r\n * `&hangingProtocolId=@ohif/mnGrid` added to the viewer URL\r\n * It is not included in the viewer mode by default.\r\n */\r\nconst hpMN: Types.HangingProtocol.Protocol = {\r\n id: '@ohif/mnGrid',\r\n description: 'Has various hanging protocol grid layouts',\r\n name: '2x2',\r\n protocolMatchingRules: [\r\n {\r\n id: 'OneOrMoreSeries',\r\n weight: 25,\r\n attribute: 'numberOfDisplaySetsWithImages',\r\n constraint: {\r\n greaterThan: 0,\r\n },\r\n },\r\n ],\r\n toolGroupIds: ['default'],\r\n displaySetSelectors: {\r\n defaultDisplaySetId: {\r\n seriesMatchingRules: [\r\n {\r\n attribute: 'numImageFrames',\r\n constraint: {\r\n greaterThan: { value: 0 },\r\n },\r\n required: true,\r\n },\r\n // This display set will select the specified items by preference\r\n // It has no affect if nothing is specified in the URL.\r\n {\r\n attribute: 'isDisplaySetFromUrl',\r\n weight: 10,\r\n constraint: {\r\n equals: true,\r\n },\r\n },\r\n ],\r\n },\r\n },\r\n defaultViewport: {\r\n viewportOptions: {\r\n viewportType: 'stack',\r\n toolGroupId: 'default',\r\n allowUnmatchedView: true,\r\n },\r\n displaySets: [\r\n {\r\n id: 'defaultDisplaySetId',\r\n matchedDisplaySetsIndex: -1,\r\n },\r\n ],\r\n },\r\n stages: [\r\n {\r\n id: '2x2',\r\n stageActivation: {\r\n enabled: {\r\n minViewportsMatched: 4,\r\n },\r\n },\r\n viewportStructure: {\r\n layoutType: 'grid',\r\n properties: {\r\n rows: 2,\r\n columns: 2,\r\n },\r\n },\r\n viewports: [\r\n {\r\n viewportOptions: {\r\n toolGroupId: 'default',\r\n allowUnmatchedView: true,\r\n },\r\n displaySets: [\r\n {\r\n id: 'defaultDisplaySetId',\r\n },\r\n ],\r\n },\r\n {\r\n viewportOptions: {\r\n toolGroupId: 'default',\r\n allowUnmatchedView: true,\r\n },\r\n displaySets: [\r\n {\r\n matchedDisplaySetsIndex: 1,\r\n id: 'defaultDisplaySetId',\r\n },\r\n ],\r\n },\r\n {\r\n viewportOptions: {\r\n toolGroupId: 'default',\r\n allowUnmatchedView: true,\r\n },\r\n displaySets: [\r\n {\r\n matchedDisplaySetsIndex: 2,\r\n id: 'defaultDisplaySetId',\r\n },\r\n ],\r\n },\r\n {\r\n viewportOptions: {\r\n toolGroupId: 'default',\r\n allowUnmatchedView: true,\r\n },\r\n displaySets: [\r\n {\r\n matchedDisplaySetsIndex: 3,\r\n id: 'defaultDisplaySetId',\r\n },\r\n ],\r\n },\r\n ],\r\n },\r\n\r\n // 3x1 stage\r\n {\r\n id: '3x1',\r\n // Obsolete settings:\r\n requiredViewports: 1,\r\n preferredViewports: 3,\r\n // New equivalent:\r\n stageActivation: {\r\n enabled: {\r\n minViewportsMatched: 3,\r\n },\r\n },\r\n viewportStructure: {\r\n layoutType: 'grid',\r\n properties: {\r\n rows: 1,\r\n columns: 3,\r\n },\r\n },\r\n viewports: [\r\n {\r\n viewportOptions: {\r\n toolGroupId: 'default',\r\n allowUnmatchedView: true,\r\n },\r\n displaySets: [\r\n {\r\n id: 'defaultDisplaySetId',\r\n },\r\n ],\r\n },\r\n {\r\n viewportOptions: {\r\n toolGroupId: 'default',\r\n allowUnmatchedView: true,\r\n },\r\n displaySets: [\r\n {\r\n id: 'defaultDisplaySetId',\r\n matchedDisplaySetsIndex: 1,\r\n },\r\n ],\r\n },\r\n {\r\n viewportOptions: {\r\n toolGroupId: 'default',\r\n allowUnmatchedView: true,\r\n },\r\n displaySets: [\r\n {\r\n id: 'defaultDisplaySetId',\r\n matchedDisplaySetsIndex: 2,\r\n },\r\n ],\r\n },\r\n ],\r\n },\r\n\r\n // A 2x1 stage\r\n {\r\n id: '2x1',\r\n requiredViewports: 1,\r\n preferredViewports: 2,\r\n stageActivation: {\r\n enabled: {\r\n minViewportsMatched: 2,\r\n },\r\n },\r\n viewportStructure: {\r\n layoutType: 'grid',\r\n properties: {\r\n rows: 1,\r\n columns: 2,\r\n },\r\n },\r\n viewports: [\r\n {\r\n viewportOptions: {\r\n toolGroupId: 'default',\r\n allowUnmatchedView: true,\r\n },\r\n displaySets: [\r\n {\r\n id: 'defaultDisplaySetId',\r\n },\r\n ],\r\n },\r\n {\r\n viewportOptions: {\r\n toolGroupId: 'default',\r\n allowUnmatchedView: true,\r\n },\r\n displaySets: [\r\n {\r\n matchedDisplaySetsIndex: 1,\r\n id: 'defaultDisplaySetId',\r\n },\r\n ],\r\n },\r\n ],\r\n },\r\n\r\n // A 1x1 stage - should be automatically activated if there is only 1 viewable instance\r\n {\r\n id: '1x1',\r\n requiredViewports: 1,\r\n preferredViewports: 1,\r\n stageActivation: {\r\n enabled: {\r\n minViewportsMatched: 1,\r\n },\r\n },\r\n viewportStructure: {\r\n layoutType: 'grid',\r\n properties: {\r\n rows: 1,\r\n columns: 1,\r\n },\r\n },\r\n viewports: [\r\n {\r\n viewportOptions: {\r\n toolGroupId: 'default',\r\n allowUnmatchedView: true,\r\n },\r\n displaySets: [\r\n {\r\n id: 'defaultDisplaySetId',\r\n },\r\n ],\r\n },\r\n ],\r\n },\r\n ],\r\n numberOfPriorsReferenced: -1,\r\n};\r\n\r\nexport default hpMN;\r\n","import { Types } from '@ohif/core';\r\n\r\nconst defaultDisplaySetSelector = {\r\n studyMatchingRules: [\r\n {\r\n // The priorInstance is a study counter that indicates what position this study is in\r\n // and the value comes from the options parameter.\r\n attribute: 'studyInstanceUIDsIndex',\r\n from: 'options',\r\n required: true,\r\n constraint: {\r\n equals: { value: 0 },\r\n },\r\n },\r\n ],\r\n seriesMatchingRules: [\r\n {\r\n attribute: 'numImageFrames',\r\n constraint: {\r\n greaterThan: { value: 0 },\r\n },\r\n },\r\n // This display set will select the specified items by preference\r\n // It has no affect if nothing is specified in the URL.\r\n {\r\n attribute: 'isDisplaySetFromUrl',\r\n weight: 10,\r\n constraint: {\r\n equals: true,\r\n },\r\n },\r\n ],\r\n};\r\n\r\nconst priorDisplaySetSelector = {\r\n studyMatchingRules: [\r\n {\r\n // The priorInstance is a study counter that indicates what position this study is in\r\n // and the value comes from the options parameter.\r\n attribute: 'studyInstanceUIDsIndex',\r\n from: 'options',\r\n required: true,\r\n constraint: {\r\n equals: { value: 1 },\r\n },\r\n },\r\n ],\r\n seriesMatchingRules: [\r\n {\r\n attribute: 'numImageFrames',\r\n constraint: {\r\n greaterThan: { value: 0 },\r\n },\r\n },\r\n // This display set will select the specified items by preference\r\n // It has no affect if nothing is specified in the URL.\r\n {\r\n attribute: 'isDisplaySetFromUrl',\r\n weight: 10,\r\n constraint: {\r\n equals: true,\r\n },\r\n },\r\n ],\r\n};\r\n\r\nconst currentDisplaySet = {\r\n id: 'defaultDisplaySetId',\r\n};\r\n\r\nconst priorDisplaySet = {\r\n id: 'priorDisplaySetId',\r\n};\r\n\r\nconst currentViewport0 = {\r\n viewportOptions: {\r\n toolGroupId: 'default',\r\n allowUnmatchedView: true,\r\n },\r\n displaySets: [currentDisplaySet],\r\n};\r\n\r\nconst currentViewport1 = {\r\n ...currentViewport0,\r\n displaySets: [\r\n {\r\n ...currentDisplaySet,\r\n matchedDisplaySetsIndex: 1,\r\n },\r\n ],\r\n};\r\n\r\nconst priorViewport0 = {\r\n ...currentViewport0,\r\n displaySets: [priorDisplaySet],\r\n};\r\n\r\nconst priorViewport1 = {\r\n ...priorViewport0,\r\n displaySets: [\r\n {\r\n ...priorDisplaySet,\r\n matchedDisplaySetsIndex: 1,\r\n },\r\n ],\r\n};\r\n\r\n/**\r\n * This hanging protocol can be activated on the primary mode by directly\r\n * referencing it in a URL or by directly including it within a mode, e.g.:\r\n * `&hangingProtocolId=@ohif/mnGrid` added to the viewer URL\r\n * It is not included in the viewer mode by default.\r\n */\r\nconst hpMNCompare: Types.HangingProtocol.Protocol = {\r\n id: '@ohif/hpCompare',\r\n description: 'Compare two studies in various layouts',\r\n name: 'Compare Two Studies',\r\n numberOfPriorsReferenced: 1,\r\n protocolMatchingRules: [\r\n {\r\n id: 'Two Studies',\r\n weight: 1000,\r\n attribute: 'StudyInstanceUID',\r\n // The 'from' attribute says where to get the 'attribute' value from. In this case\r\n // prior means the second study in the study list.\r\n from: 'prior',\r\n required: true,\r\n constraint: {\r\n notNull: true,\r\n },\r\n },\r\n ],\r\n toolGroupIds: ['default'],\r\n displaySetSelectors: {\r\n defaultDisplaySetId: defaultDisplaySetSelector,\r\n priorDisplaySetId: priorDisplaySetSelector,\r\n },\r\n defaultViewport: {\r\n viewportOptions: {\r\n viewportType: 'stack',\r\n toolGroupId: 'default',\r\n allowUnmatchedView: true,\r\n },\r\n displaySets: [\r\n {\r\n id: 'defaultDisplaySetId',\r\n matchedDisplaySetsIndex: -1,\r\n },\r\n ],\r\n },\r\n stages: [\r\n {\r\n name: '2x2',\r\n stageActivation: {\r\n enabled: {\r\n minViewportsMatched: 4,\r\n },\r\n },\r\n viewportStructure: {\r\n layoutType: 'grid',\r\n properties: {\r\n rows: 2,\r\n columns: 2,\r\n },\r\n },\r\n viewports: [currentViewport0, priorViewport0, currentViewport1, priorViewport1],\r\n },\r\n\r\n {\r\n name: '2x1',\r\n stageActivation: {\r\n enabled: {\r\n minViewportsMatched: 2,\r\n },\r\n },\r\n viewportStructure: {\r\n layoutType: 'grid',\r\n properties: {\r\n rows: 1,\r\n columns: 2,\r\n },\r\n },\r\n viewports: [currentViewport0, priorViewport0],\r\n },\r\n ],\r\n};\r\n\r\nexport default hpMNCompare;\r\n","import hpMNGrid from './hpMNGrid';\r\nimport hpMNCompare from './hpCompare';\r\n\r\nconst defaultProtocol = {\r\n id: 'default',\r\n locked: true,\r\n // Don't store this hanging protocol as it applies to the currently active\r\n // display set by default\r\n // cacheId: null,\r\n name: 'Default',\r\n createdDate: '2021-02-23T19:22:08.894Z',\r\n modifiedDate: '2023-04-01',\r\n availableTo: {},\r\n editableBy: {},\r\n protocolMatchingRules: [],\r\n toolGroupIds: ['default'],\r\n // -1 would be used to indicate active only, whereas other values are\r\n // the number of required priors referenced - so 0 means active with\r\n // 0 or more priors.\r\n numberOfPriorsReferenced: 0,\r\n // Default viewport is used to define the viewport when\r\n // additional viewports are added using the layout tool\r\n defaultViewport: {\r\n viewportOptions: {\r\n viewportType: 'stack',\r\n toolGroupId: 'default',\r\n allowUnmatchedView: true,\r\n },\r\n displaySets: [\r\n {\r\n id: 'defaultDisplaySetId',\r\n matchedDisplaySetsIndex: -1,\r\n },\r\n ],\r\n },\r\n displaySetSelectors: {\r\n defaultDisplaySetId: {\r\n // Matches displaysets, NOT series\r\n seriesMatchingRules: [\r\n // Try to match series with images by default, to prevent weird display\r\n // on SEG/SR containing studies\r\n {\r\n attribute: 'numImageFrames',\r\n constraint: {\r\n greaterThan: { value: 0 },\r\n },\r\n },\r\n // This display set will select the specified items by preference\r\n // It has no affect if nothing is specified in the URL.\r\n {\r\n attribute: 'isDisplaySetFromUrl',\r\n weight: 10,\r\n constraint: {\r\n equals: true,\r\n },\r\n },\r\n ],\r\n // Can be used to select matching studies\r\n // studyMatchingRules: [],\r\n },\r\n },\r\n stages: [\r\n {\r\n name: 'default',\r\n viewportStructure: {\r\n layoutType: 'grid',\r\n properties: {\r\n rows: 1,\r\n columns: 1,\r\n },\r\n },\r\n viewports: [\r\n {\r\n viewportOptions: {\r\n viewportType: 'stack',\r\n viewportId: 'default',\r\n toolGroupId: 'default',\r\n // This will specify the initial image options index if it matches in the URL\r\n // and will otherwise not specify anything.\r\n initialImageOptions: {\r\n custom: 'sopInstanceLocation',\r\n },\r\n // Other options for initialImageOptions, which can be included in the default\r\n // custom attribute, or can be provided directly.\r\n // index: 180,\r\n // preset: 'middle', // 'first', 'last', 'middle'\r\n // },\r\n },\r\n displaySets: [\r\n {\r\n id: 'defaultDisplaySetId',\r\n },\r\n ],\r\n },\r\n ],\r\n createdDate: '2021-02-23T18:32:42.850Z',\r\n },\r\n ],\r\n};\r\n\r\nfunction getHangingProtocolModule() {\r\n return [\r\n {\r\n name: defaultProtocol.id,\r\n protocol: defaultProtocol,\r\n },\r\n // Create a MxN hanging protocol available by default\r\n {\r\n name: hpMNGrid.id,\r\n protocol: hpMNGrid,\r\n },\r\n // Create a MxN comparison hanging protocol available by default\r\n {\r\n name: hpMNCompare.id,\r\n protocol: hpMNCompare,\r\n },\r\n ];\r\n}\r\n\r\nexport default getHangingProtocolModule;\r\n","import React from 'react';\r\nimport classnames from 'classnames';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { useAppConfig } from '@state';\r\n\r\nimport { Button, ButtonEnums } from '@ohif/ui';\r\n\r\nfunction DataSourceSelector() {\r\n const [appConfig] = useAppConfig();\r\n const navigate = useNavigate();\r\n\r\n // This is frowned upon, but the raw config is needed here to provide\r\n // the selector\r\n const dsConfigs = appConfig.dataSources;\r\n\r\n return (\r\n
\r\n
\r\n
\r\n \r\n
\r\n {dsConfigs\r\n .filter(it => it.sourceName !== 'dicomjson' && it.sourceName !== 'dicomlocal')\r\n .map(ds => (\r\n
\r\n

\r\n {ds.configuration?.friendlyName || ds.friendlyName}\r\n

\r\n {\r\n navigate({\r\n pathname: '/',\r\n search: `datasources=${ds.sourceName}`,\r\n });\r\n }}\r\n >\r\n {ds.sourceName}\r\n \r\n
\r\n
\r\n ))}\r\n
\r\n
\r\n
\r\n
\r\n );\r\n}\r\n\r\nexport default DataSourceSelector;\r\n","import classNames from 'classnames';\r\nimport React, { ReactElement, useEffect, useState } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Button, Icon, InputFilterText, LoadingIndicatorProgress } from '@ohif/ui';\r\nimport { Types } from '@ohif/core';\r\n\r\ntype ItemListComponentProps = {\r\n itemLabel: string;\r\n itemList: Array;\r\n onItemClicked: (item: Types.BaseDataSourceConfigurationAPIItem) => void;\r\n};\r\n\r\nfunction ItemListComponent({\r\n itemLabel,\r\n itemList,\r\n onItemClicked,\r\n}: ItemListComponentProps): ReactElement {\r\n const { t } = useTranslation('DataSourceConfiguration');\r\n const [filterValue, setFilterValue] = useState('');\r\n\r\n useEffect(() => {\r\n setFilterValue('');\r\n }, [itemList]);\r\n\r\n return (\r\n
\r\n
\r\n
{t(`Select ${itemLabel}`)}
\r\n \r\n
\r\n
\r\n {itemList == null ? (\r\n \r\n ) : itemList.length === 0 ? (\r\n
\r\n \r\n {t(`No ${itemLabel} available`)}\r\n
\r\n ) : (\r\n <>\r\n
{t(itemLabel)}
\r\n
\r\n {itemList\r\n .filter(\r\n item =>\r\n !filterValue || item.name.toLowerCase().includes(filterValue.toLowerCase())\r\n )\r\n .map(item => {\r\n const border =\r\n 'rounded border-transparent border-b-secondary-light border-[1px] hover:border-primary-light';\r\n return (\r\n \r\n
{item.name}
\r\n onItemClicked(item)}\r\n className=\"invisible group-hover:visible\"\r\n endIcon={}\r\n >\r\n {t('Select')}\r\n \r\n
\r\n );\r\n })}\r\n
\r\n \r\n )}\r\n
\r\n \r\n );\r\n}\r\n\r\nexport default ItemListComponent;\r\n","import classNames from 'classnames';\r\nimport React, { ReactElement, useEffect, useState } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Icon } from '@ohif/ui';\r\nimport { Types } from '@ohif/core';\r\nimport ItemListComponent from './ItemListComponent';\r\n\r\nconst NO_WRAP_ELLIPSIS_CLASS_NAMES = 'text-ellipsis whitespace-nowrap overflow-hidden';\r\n\r\ntype DataSourceConfigurationModalComponentProps = {\r\n configurationAPI: Types.BaseDataSourceConfigurationAPI;\r\n configuredItems: Array;\r\n onHide: () => void;\r\n};\r\n\r\nfunction DataSourceConfigurationModalComponent({\r\n configurationAPI,\r\n configuredItems,\r\n onHide,\r\n}: DataSourceConfigurationModalComponentProps) {\r\n const { t } = useTranslation('DataSourceConfiguration');\r\n\r\n const [itemList, setItemList] = useState>();\r\n\r\n const [selectedItems, setSelectedItems] = useState(configuredItems);\r\n\r\n const [errorMessage, setErrorMessage] = useState();\r\n\r\n const [itemLabels] = useState(configurationAPI.getItemLabels());\r\n\r\n // Determines whether to show the full/existing configuration for the data source.\r\n // A full or complete configuration is one where the data source (path) has the\r\n // maximum/required number of path items. Anything less is considered not complete and\r\n // the configuration starts from scratch (i.e. as if no items are configured at all).\r\n // TODO: consider configuration starting from a partial (i.e. non-empty) configuration\r\n const [showFullConfig, setShowFullConfig] = useState(\r\n itemLabels.length === configuredItems.length\r\n );\r\n\r\n /**\r\n * The index of the selected item that is considered current and for which\r\n * its sub-items should be displayed in the items list component. When the\r\n * full/existing configuration for a data source is to be shown, the current\r\n * selected item is the second to last in the `selectedItems` list.\r\n */\r\n const currentSelectedItemIndex = showFullConfig\r\n ? selectedItems.length - 2\r\n : selectedItems.length - 1;\r\n\r\n useEffect(() => {\r\n let shouldUpdate = true;\r\n\r\n setErrorMessage(null);\r\n\r\n // Clear out the former/old list while we fetch the next sub item list.\r\n setItemList(null);\r\n\r\n if (selectedItems.length === 0) {\r\n configurationAPI\r\n .initialize()\r\n .then(items => {\r\n if (shouldUpdate) {\r\n setItemList(items);\r\n }\r\n })\r\n .catch(error => setErrorMessage(error.message));\r\n } else if (!showFullConfig && selectedItems.length === itemLabels.length) {\r\n // The last item to configure the data source (path) has been selected.\r\n configurationAPI.setCurrentItem(selectedItems[selectedItems.length - 1]);\r\n // We can hide the modal dialog now.\r\n onHide();\r\n } else {\r\n configurationAPI\r\n .setCurrentItem(selectedItems[currentSelectedItemIndex])\r\n .then(items => {\r\n if (shouldUpdate) {\r\n setItemList(items);\r\n }\r\n })\r\n .catch(error => setErrorMessage(error.message));\r\n }\r\n\r\n return () => {\r\n shouldUpdate = false;\r\n };\r\n }, [\r\n selectedItems,\r\n configurationAPI,\r\n onHide,\r\n itemLabels,\r\n showFullConfig,\r\n currentSelectedItemIndex,\r\n ]);\r\n\r\n const getSelectedItemCursorClasses = itemIndex =>\r\n itemIndex !== itemLabels.length - 1 && itemIndex < selectedItems.length\r\n ? 'cursor-pointer'\r\n : 'cursor-auto';\r\n\r\n const getSelectedItemBackgroundClasses = itemIndex =>\r\n itemIndex < selectedItems.length\r\n ? classNames(\r\n 'bg-black/[.4]',\r\n itemIndex !== itemLabels.length - 1 ? 'hover:bg-transparent active:bg-secondary-dark' : ''\r\n )\r\n : 'bg-transparent';\r\n\r\n const getSelectedItemBorderClasses = itemIndex =>\r\n itemIndex === currentSelectedItemIndex + 1\r\n ? classNames('border-2', 'border-solid', 'border-primary-light')\r\n : itemIndex < selectedItems.length\r\n ? 'border border-solid border-primary-active hover:border-primary-light active:border-white'\r\n : 'border border-dashed border-secondary-light';\r\n\r\n const getSelectedItemTextClasses = itemIndex =>\r\n itemIndex <= selectedItems.length ? 'text-primary-light' : 'text-primary-active';\r\n\r\n const getErrorComponent = (): ReactElement => {\r\n return (\r\n
\r\n
\r\n {t(`Error fetching ${itemLabels[selectedItems.length]} list`)}\r\n
\r\n
{errorMessage}
\r\n
\r\n );\r\n };\r\n\r\n const getSelectedItemsComponent = (): ReactElement => {\r\n return (\r\n
\r\n {itemLabels.map((itemLabel, itemLabelIndex) => {\r\n return (\r\n {\r\n setShowFullConfig(false);\r\n setSelectedItems(theList => theList.slice(0, itemLabelIndex));\r\n }\r\n : undefined\r\n }\r\n >\r\n
\r\n {itemLabelIndex < selectedItems.length ? (\r\n \r\n ) : (\r\n \r\n )}\r\n
{t(itemLabel)}
\r\n
\r\n {itemLabelIndex < selectedItems.length ? (\r\n
\r\n {selectedItems[itemLabelIndex].name}\r\n
\r\n ) : (\r\n

\r\n )}\r\n
\r\n );\r\n })}\r\n \r\n );\r\n };\r\n\r\n return (\r\n
\r\n {getSelectedItemsComponent()}\r\n
\r\n {errorMessage ? (\r\n getErrorComponent()\r\n ) : (\r\n {\r\n setShowFullConfig(false);\r\n setSelectedItems(theList => [...theList.slice(0, currentSelectedItemIndex + 1), item]);\r\n }}\r\n >\r\n )}\r\n
\r\n );\r\n}\r\n\r\nexport default DataSourceConfigurationModalComponent;\r\n","import React, { ReactElement, useCallback, useEffect, useState } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Icon, useModal } from '@ohif/ui';\r\nimport { ExtensionManager, ServicesManager, Types } from '@ohif/core';\r\nimport DataSourceConfigurationModalComponent from './DataSourceConfigurationModalComponent';\r\n\r\ntype DataSourceConfigurationComponentProps = {\r\n servicesManager: ServicesManager;\r\n extensionManager: ExtensionManager;\r\n};\r\n\r\nfunction DataSourceConfigurationComponent({\r\n servicesManager,\r\n extensionManager,\r\n}: DataSourceConfigurationComponentProps): ReactElement {\r\n const { t } = useTranslation('DataSourceConfiguration');\r\n const { show, hide } = useModal();\r\n\r\n const { customizationService } = servicesManager.services;\r\n\r\n const [configurationAPI, setConfigurationAPI] = useState();\r\n\r\n const [configuredItems, setConfiguredItems] =\r\n useState>();\r\n\r\n useEffect(() => {\r\n let shouldUpdate = true;\r\n\r\n const dataSourceChangedCallback = async () => {\r\n const activeDataSourceDef = extensionManager.getActiveDataSourceDefinition();\r\n\r\n if (!activeDataSourceDef.configuration.configurationAPI) {\r\n return;\r\n }\r\n\r\n const { factory: configurationAPIFactory } =\r\n customizationService.get(activeDataSourceDef.configuration.configurationAPI) ?? {};\r\n\r\n if (!configurationAPIFactory) {\r\n return;\r\n }\r\n\r\n const configAPI = configurationAPIFactory(activeDataSourceDef.sourceName);\r\n setConfigurationAPI(configAPI);\r\n\r\n // New configuration API means that the existing configured items must be cleared.\r\n setConfiguredItems(null);\r\n\r\n configAPI.getConfiguredItems().then(list => {\r\n if (shouldUpdate) {\r\n setConfiguredItems(list);\r\n }\r\n });\r\n };\r\n\r\n const sub = extensionManager.subscribe(\r\n extensionManager.EVENTS.ACTIVE_DATA_SOURCE_CHANGED,\r\n dataSourceChangedCallback\r\n );\r\n\r\n dataSourceChangedCallback();\r\n\r\n return () => {\r\n shouldUpdate = false;\r\n sub.unsubscribe();\r\n };\r\n }, []);\r\n\r\n const showConfigurationModal = useCallback(() => {\r\n show({\r\n content: DataSourceConfigurationModalComponent,\r\n title: t('Configure Data Source'),\r\n contentProps: {\r\n configurationAPI,\r\n configuredItems,\r\n onHide: hide,\r\n },\r\n });\r\n }, [configurationAPI, configuredItems]);\r\n\r\n useEffect(() => {\r\n if (!configurationAPI || !configuredItems) {\r\n return;\r\n }\r\n\r\n if (configuredItems.length !== configurationAPI.getItemLabels().length) {\r\n // Not the correct number of configured items, so show the modal to configure the data source.\r\n showConfigurationModal();\r\n }\r\n }, [configurationAPI, configuredItems, showConfigurationModal]);\r\n\r\n return configuredItems ? (\r\n
\r\n \r\n {configuredItems.map((item, itemIndex) => {\r\n return (\r\n \r\n \r\n {item.name}\r\n
\r\n {itemIndex !== configuredItems.length - 1 &&
|
}\r\n \r\n );\r\n })}\r\n \r\n ) : (\r\n <>\r\n );\r\n}\r\n\r\nexport default DataSourceConfigurationComponent;\r\n","import { ExtensionManager, Types } from '@ohif/core';\r\n\r\n/**\r\n * This file contains the implementations of BaseDataSourceConfigurationAPIItem\r\n * and BaseDataSourceConfigurationAPI for the Google cloud healthcare API. To\r\n * better understand this implementation and/or to implement custom implementations,\r\n * see the platform\\core\\src\\types\\DataSourceConfigurationAPI.ts and its JS doc\r\n * comments as a guide.\r\n */\r\n\r\n/**\r\n * The various Google Cloud Healthcare path item types.\r\n */\r\nenum ItemType {\r\n projects = 0,\r\n locations = 1,\r\n datasets = 2,\r\n dicomStores = 3,\r\n}\r\n\r\ninterface NamedItem {\r\n name: string;\r\n}\r\ninterface Project extends NamedItem {\r\n projectId: string;\r\n}\r\n\r\nconst initialUrl = 'https://cloudresourcemanager.googleapis.com/v1';\r\nconst baseHealthcareUrl = 'https://healthcare.googleapis.com/v1';\r\n\r\nclass GoogleCloudDataSourceConfigurationAPIItem\r\n implements Types.BaseDataSourceConfigurationAPIItem\r\n{\r\n id: string;\r\n name: string;\r\n url: string;\r\n itemType: ItemType;\r\n}\r\n\r\nclass GoogleCloudDataSourceConfigurationAPI implements Types.BaseDataSourceConfigurationAPI {\r\n private _extensionManager: ExtensionManager;\r\n private _fetchOptions: { method: string; headers: unknown };\r\n private _dataSourceName: string;\r\n\r\n constructor(dataSourceName, servicesManager, extensionManager) {\r\n this._dataSourceName = dataSourceName;\r\n this._extensionManager = extensionManager;\r\n const userAuthenticationService = servicesManager.services.userAuthenticationService;\r\n this._fetchOptions = {\r\n method: 'GET',\r\n headers: userAuthenticationService.getAuthorizationHeader(),\r\n };\r\n }\r\n\r\n getItemLabels = () => ['Project', 'Location', 'Data set', 'DICOM store'];\r\n\r\n async initialize(): Promise {\r\n const url = `${initialUrl}/projects`;\r\n\r\n const projects = (await GoogleCloudDataSourceConfigurationAPI._doFetch(\r\n url,\r\n ItemType.projects,\r\n this._fetchOptions\r\n )) as Array;\r\n\r\n if (!projects?.length) {\r\n return [];\r\n }\r\n\r\n const projectItems = projects.map(project => {\r\n return {\r\n id: project.projectId,\r\n name: project.name,\r\n itemType: ItemType.projects,\r\n url: `${baseHealthcareUrl}/projects/${project.projectId}`,\r\n };\r\n });\r\n\r\n return projectItems;\r\n }\r\n\r\n async setCurrentItem(\r\n anItem: Types.BaseDataSourceConfigurationAPIItem\r\n ): Promise {\r\n const googleCloudItem = anItem as GoogleCloudDataSourceConfigurationAPIItem;\r\n\r\n if (googleCloudItem.itemType === ItemType.dicomStores) {\r\n // Last configurable item, so update the data source configuration.\r\n const url = `${googleCloudItem.url}/dicomWeb`;\r\n const dataSourceDefCopy = JSON.parse(\r\n JSON.stringify(this._extensionManager.getDataSourceDefinition(this._dataSourceName))\r\n );\r\n dataSourceDefCopy.configuration = {\r\n ...dataSourceDefCopy.configuration,\r\n wadoUriRoot: url,\r\n qidoRoot: url,\r\n wadoRoot: url,\r\n };\r\n\r\n this._extensionManager.updateDataSourceConfiguration(\r\n dataSourceDefCopy.sourceName,\r\n dataSourceDefCopy.configuration\r\n );\r\n\r\n return [];\r\n }\r\n\r\n const subItemType = googleCloudItem.itemType + 1;\r\n const subItemField = `${ItemType[subItemType]}`;\r\n\r\n const url = `${googleCloudItem.url}/${subItemField}`;\r\n\r\n const fetchedSubItems = await GoogleCloudDataSourceConfigurationAPI._doFetch(\r\n url,\r\n subItemType,\r\n this._fetchOptions\r\n );\r\n\r\n if (!fetchedSubItems?.length) {\r\n return [];\r\n }\r\n\r\n const subItems = fetchedSubItems.map(subItem => {\r\n const nameSplit = subItem.name.split('/');\r\n return {\r\n id: subItem.name,\r\n name: nameSplit[nameSplit.length - 1],\r\n itemType: subItemType,\r\n url: `${baseHealthcareUrl}/${subItem.name}`,\r\n };\r\n });\r\n\r\n return subItems;\r\n }\r\n\r\n async getConfiguredItems(): Promise> {\r\n const dataSourceDefinition = this._extensionManager.getDataSourceDefinition(\r\n this._dataSourceName\r\n );\r\n\r\n const url = dataSourceDefinition.configuration.wadoUriRoot;\r\n const projectsIndex = url.indexOf('projects');\r\n // Split the configured URL into (essentially) pairs (i.e. item type followed by item)\r\n // Explicitly: ['projects','aProject','locations','aLocation','datasets','aDataSet','dicomStores','aDicomStore']\r\n // Note that a partial configuration will have a subset of the above.\r\n const urlSplit = url.substring(projectsIndex).split('/');\r\n\r\n const configuredItems = [];\r\n\r\n for (\r\n let itemType = 0;\r\n // the number of configured items is either the max (4) or the number extracted from the url split\r\n itemType < 4 && (itemType + 1) * 2 < urlSplit.length;\r\n itemType += 1\r\n ) {\r\n if (itemType === ItemType.projects) {\r\n const projectId = urlSplit[1];\r\n const projectUrl = `${initialUrl}/projects/${projectId}`;\r\n const data = await GoogleCloudDataSourceConfigurationAPI._doFetch(\r\n projectUrl,\r\n ItemType.projects,\r\n this._fetchOptions\r\n );\r\n const project = data[0] as Project;\r\n configuredItems.push({\r\n id: project.projectId,\r\n name: project.name,\r\n itemType: itemType,\r\n url: `${baseHealthcareUrl}/projects/${project.projectId}`,\r\n });\r\n } else {\r\n const relativePath = urlSplit.slice(0, itemType * 2 + 2).join('/');\r\n configuredItems.push({\r\n id: relativePath,\r\n name: urlSplit[itemType * 2 + 1],\r\n itemType: itemType,\r\n url: `${baseHealthcareUrl}/${relativePath}`,\r\n });\r\n }\r\n }\r\n\r\n return configuredItems;\r\n }\r\n\r\n /**\r\n * Fetches an array of items the specified item type.\r\n * @param urlStr the fetch url\r\n * @param fetchItemType the type to fetch\r\n * @param fetchOptions the header options for the fetch (e.g. authorization header)\r\n * @param fetchSearchParams any search query params; currently only used for paging results\r\n * @returns an array of items of the specified type\r\n */\r\n private static async _doFetch(\r\n urlStr: string,\r\n fetchItemType: ItemType,\r\n fetchOptions = {},\r\n fetchSearchParams: Record = {}\r\n ): Promise | Array> {\r\n try {\r\n const url = new URL(urlStr);\r\n url.search = new URLSearchParams(fetchSearchParams).toString();\r\n\r\n const response = await fetch(url, fetchOptions);\r\n const data = await response.json();\r\n if (response.status >= 200 && response.status < 300 && data != null) {\r\n if (data.nextPageToken != null) {\r\n fetchSearchParams.pageToken = data.nextPageToken;\r\n const subPageData = await this._doFetch(\r\n urlStr,\r\n fetchItemType,\r\n fetchOptions,\r\n fetchSearchParams\r\n );\r\n data[ItemType[fetchItemType]] = data[ItemType[fetchItemType]].concat(subPageData);\r\n }\r\n if (data[ItemType[fetchItemType]]) {\r\n return data[ItemType[fetchItemType]];\r\n } else if (data.name) {\r\n return [data];\r\n } else {\r\n return [];\r\n }\r\n } else {\r\n const message =\r\n data?.error?.message ||\r\n `Error returned from Google Cloud Healthcare: ${response.status} - ${response.statusText}`;\r\n throw new Error(message);\r\n }\r\n } catch (err) {\r\n const message = err?.message || 'Error occurred during fetch request.';\r\n throw new Error(message);\r\n }\r\n }\r\n}\r\n\r\nexport { GoogleCloudDataSourceConfigurationAPI };\r\n","import OHIF from '@ohif/core';\r\n\r\nimport { InstanceMetadata, PhilipsPETPrivateGroup } from '@cornerstonejs/calculate-suv/src/types';\r\n\r\nconst metadataProvider = OHIF.classes.MetadataProvider;\r\n\r\nexport default function getPTImageIdInstanceMetadata(imageId: string): InstanceMetadata {\r\n const dicomMetaData = metadataProvider.get('instance', imageId);\r\n\r\n if (!dicomMetaData) {\r\n throw new Error('dicom metadata are required');\r\n }\r\n\r\n if (\r\n dicomMetaData.SeriesDate === undefined ||\r\n dicomMetaData.SeriesTime === undefined ||\r\n dicomMetaData.CorrectedImage === undefined ||\r\n dicomMetaData.Units === undefined ||\r\n !dicomMetaData.RadiopharmaceuticalInformationSequence ||\r\n dicomMetaData.RadiopharmaceuticalInformationSequence[0].RadionuclideHalfLife === undefined ||\r\n dicomMetaData.RadiopharmaceuticalInformationSequence[0].RadionuclideTotalDose === undefined ||\r\n dicomMetaData.DecayCorrection === undefined ||\r\n dicomMetaData.AcquisitionDate === undefined ||\r\n dicomMetaData.AcquisitionTime === undefined ||\r\n (dicomMetaData.RadiopharmaceuticalInformationSequence[0].RadiopharmaceuticalStartDateTime ===\r\n undefined &&\r\n dicomMetaData.RadiopharmaceuticalInformationSequence[0].RadiopharmaceuticalStartTime ===\r\n undefined)\r\n ) {\r\n throw new Error('required metadata are missing');\r\n }\r\n\r\n if (dicomMetaData.PatientWeight === undefined) {\r\n console.warn('PatientWeight missing from PT instance metadata');\r\n }\r\n\r\n const instanceMetadata: InstanceMetadata = {\r\n CorrectedImage: dicomMetaData.CorrectedImage,\r\n Units: dicomMetaData.Units,\r\n RadionuclideHalfLife:\r\n dicomMetaData.RadiopharmaceuticalInformationSequence[0].RadionuclideHalfLife,\r\n RadionuclideTotalDose:\r\n dicomMetaData.RadiopharmaceuticalInformationSequence[0].RadionuclideTotalDose,\r\n RadiopharmaceuticalStartDateTime:\r\n dicomMetaData.RadiopharmaceuticalInformationSequence[0].RadiopharmaceuticalStartDateTime,\r\n RadiopharmaceuticalStartTime:\r\n dicomMetaData.RadiopharmaceuticalInformationSequence[0].RadiopharmaceuticalStartTime,\r\n DecayCorrection: dicomMetaData.DecayCorrection,\r\n PatientWeight: dicomMetaData.PatientWeight,\r\n SeriesDate: dicomMetaData.SeriesDate,\r\n SeriesTime: dicomMetaData.SeriesTime,\r\n AcquisitionDate: dicomMetaData.AcquisitionDate,\r\n AcquisitionTime: dicomMetaData.AcquisitionTime,\r\n };\r\n\r\n if (\r\n dicomMetaData['70531000'] ||\r\n dicomMetaData['70531000'] !== undefined ||\r\n dicomMetaData['70531009'] ||\r\n dicomMetaData['70531009'] !== undefined\r\n ) {\r\n const philipsPETPrivateGroup: PhilipsPETPrivateGroup = {\r\n SUVScaleFactor: dicomMetaData['70531000'],\r\n ActivityConcentrationScaleFactor: dicomMetaData['70531009'],\r\n };\r\n instanceMetadata.PhilipsPETPrivateGroup = philipsPETPrivateGroup;\r\n }\r\n\r\n if (dicomMetaData['0009100d'] && dicomMetaData['0009100d'] !== undefined) {\r\n instanceMetadata.GEPrivatePostInjectionDateTime = dicomMetaData['0009100d'];\r\n }\r\n\r\n if (dicomMetaData.FrameReferenceTime && dicomMetaData.FrameReferenceTime !== undefined) {\r\n instanceMetadata.FrameReferenceTime = dicomMetaData.FrameReferenceTime;\r\n }\r\n\r\n if (dicomMetaData.ActualFrameDuration && dicomMetaData.ActualFrameDuration !== undefined) {\r\n instanceMetadata.ActualFrameDuration = dicomMetaData.ActualFrameDuration;\r\n }\r\n\r\n if (dicomMetaData.PatientSex && dicomMetaData.PatientSex !== undefined) {\r\n instanceMetadata.PatientSex = dicomMetaData.PatientSex;\r\n }\r\n\r\n if (dicomMetaData.PatientSize && dicomMetaData.PatientSize !== undefined) {\r\n instanceMetadata.PatientSize = dicomMetaData.PatientSize;\r\n }\r\n\r\n return instanceMetadata;\r\n}\r\n\r\nfunction convertInterfaceTimeToString(time): string {\r\n const hours = `${time.hours || '00'}`.padStart(2, '0');\r\n const minutes = `${time.minutes || '00'}`.padStart(2, '0');\r\n const seconds = `${time.seconds || '00'}`.padStart(2, '0');\r\n\r\n const fractionalSeconds = `${time.fractionalSeconds || '000000'}`.padEnd(6, '0');\r\n\r\n const timeString = `${hours}${minutes}${seconds}.${fractionalSeconds}`;\r\n return timeString;\r\n}\r\n\r\nfunction convertInterfaceDateToString(date): string {\r\n const month = `${date.month}`.padStart(2, '0');\r\n const day = `${date.day}`.padStart(2, '0');\r\n const dateString = `${date.year}${month}${day}`;\r\n return dateString;\r\n}\r\n\r\nexport { getPTImageIdInstanceMetadata };\r\n","import { DicomMetadataStore, classes } from '@ohif/core';\r\nimport { calculateSUVScalingFactors } from '@cornerstonejs/calculate-suv';\r\n\r\nimport getPTImageIdInstanceMetadata from './getPTImageIdInstanceMetadata';\r\n\r\nconst metadataProvider = classes.MetadataProvider;\r\n\r\n/**\r\n *\r\n * @param {Object} servicesManager\r\n * @param {Object} configuration\r\n */\r\nexport default function init({ servicesManager, configuration = {} }): void {\r\n const { stateSyncService } = servicesManager.services;\r\n // Add\r\n DicomMetadataStore.subscribe(DicomMetadataStore.EVENTS.INSTANCES_ADDED, handlePETImageMetadata);\r\n\r\n // If the metadata for PET has changed by the user (e.g. manually changing the PatientWeight)\r\n // we need to recalculate the SUV Scaling Factors\r\n DicomMetadataStore.subscribe(DicomMetadataStore.EVENTS.SERIES_UPDATED, handlePETImageMetadata);\r\n\r\n // viewportGridStore is a sync state which stores the entire\r\n // ViewportGridService getState, by the keys `::`\r\n // Used to recover manual changes to the layout of a stage.\r\n stateSyncService.register('viewportGridStore', { clearOnModeExit: true });\r\n\r\n // displaySetSelectorMap stores a map from\r\n // `::` to\r\n // a displaySetInstanceUID, used to display named display sets in\r\n // specific spots within a hanging protocol and be able to remember what the\r\n // user did with those named spots between stages and protocols.\r\n stateSyncService.register('displaySetSelectorMap', { clearOnModeExit: true });\r\n\r\n // Stores a map from `:${protocolId}` to the getHPInfo results\r\n // in order to recover the correct stage when returning to a Hanging Protocol.\r\n stateSyncService.register('hangingProtocolStageIndexMap', {\r\n clearOnModeExit: true,\r\n });\r\n\r\n // Stores a map from the to be applied hanging protocols `:`\r\n // to the previously applied hanging protolStageIndexMap key, in order to toggle\r\n // off the applied protocol and remember the old state.\r\n stateSyncService.register('toggleHangingProtocol', { clearOnModeExit: true });\r\n\r\n // Stores the viewports by `rows-cols` position so that when the layout\r\n // changes numRows and numCols, the viewports can be remembers and then replaced\r\n // afterwards.\r\n stateSyncService.register('viewportsByPosition', { clearOnModeExit: true });\r\n}\r\n\r\nconst handlePETImageMetadata = ({ SeriesInstanceUID, StudyInstanceUID }) => {\r\n const { instances } = DicomMetadataStore.getSeries(StudyInstanceUID, SeriesInstanceUID);\r\n\r\n const modality = instances[0].Modality;\r\n if (modality !== 'PT') {\r\n return;\r\n }\r\n const imageIds = instances.map(instance => instance.imageId);\r\n const instanceMetadataArray = [];\r\n imageIds.forEach(imageId => {\r\n const instanceMetadata = getPTImageIdInstanceMetadata(imageId);\r\n if (instanceMetadata) {\r\n instanceMetadataArray.push(instanceMetadata);\r\n }\r\n });\r\n\r\n if (!instanceMetadataArray.length) {\r\n return;\r\n }\r\n\r\n // try except block to prevent errors when the metadata is not correct\r\n let suvScalingFactors;\r\n try {\r\n suvScalingFactors = calculateSUVScalingFactors(instanceMetadataArray);\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n\r\n if (!suvScalingFactors) {\r\n return;\r\n }\r\n\r\n instanceMetadataArray.forEach((instanceMetadata, index) => {\r\n metadataProvider.addCustomMetadata(imageIds[index], 'scalingModule', suvScalingFactors[index]);\r\n });\r\n};\r\n","import { Types } from '@ohif/core';\r\n\r\nimport getDataSourcesModule from './getDataSourcesModule.js';\r\nimport getLayoutTemplateModule from './getLayoutTemplateModule.js';\r\nimport getPanelModule from './getPanelModule';\r\nimport getSopClassHandlerModule from './getSopClassHandlerModule.js';\r\nimport getToolbarModule from './getToolbarModule';\r\nimport getCommandsModule from './commandsModule';\r\nimport getHangingProtocolModule from './getHangingProtocolModule';\r\nimport getStudiesForPatientByMRN from './Panels/getStudiesForPatientByMRN';\r\nimport getCustomizationModule from './getCustomizationModule';\r\nimport { id } from './id.js';\r\nimport preRegistration from './init';\r\nimport { ContextMenuController, CustomizableContextMenuTypes } from './CustomizableContextMenu';\r\nimport * as dicomWebUtils from './DicomWebDataSource/utils';\r\nimport { createReportDialogPrompt } from './Panels';\r\nimport createReportAsync from './Actions/createReportAsync';\r\n\r\nconst defaultExtension: Types.Extensions.Extension = {\r\n /**\r\n * Only required property. Should be a unique value across all extensions.\r\n */\r\n id,\r\n preRegistration,\r\n getDataSourcesModule,\r\n getLayoutTemplateModule,\r\n getPanelModule,\r\n getHangingProtocolModule,\r\n getSopClassHandlerModule,\r\n getToolbarModule,\r\n getCommandsModule,\r\n getUtilityModule({ servicesManager }) {\r\n return [\r\n {\r\n name: 'common',\r\n exports: {\r\n getStudiesForPatientByMRN,\r\n },\r\n },\r\n ];\r\n },\r\n\r\n getCustomizationModule,\r\n};\r\n\r\nexport default defaultExtension;\r\n\r\nexport {\r\n ContextMenuController,\r\n CustomizableContextMenuTypes,\r\n getStudiesForPatientByMRN,\r\n dicomWebUtils,\r\n createReportDialogPrompt,\r\n createReportAsync,\r\n};\r\n","import ViewerLayout from './ViewerLayout';\r\n/*\r\n- Define layout for the viewer in mode configuration.\r\n- Pass in the viewport types that can populate the viewer.\r\n- Init layout based on the displaySets and the objects.\r\n*/\r\n\r\nexport default function ({ servicesManager, extensionManager, commandsManager, hotkeysManager }) {\r\n function ViewerLayoutWithServices(props) {\r\n return ViewerLayout({\r\n servicesManager,\r\n extensionManager,\r\n commandsManager,\r\n hotkeysManager,\r\n ...props,\r\n });\r\n }\r\n\r\n return [\r\n // Layout Template Definition\r\n // TODO: this is weird naming\r\n {\r\n name: 'viewerLayout',\r\n id: 'viewerLayout',\r\n component: ViewerLayoutWithServices,\r\n },\r\n ];\r\n}\r\n","import ToolbarDivider from './Toolbar/ToolbarDivider';\r\nimport ToolbarLayoutSelectorWithServices from './Toolbar/ToolbarLayoutSelector';\r\nimport ToolbarSplitButtonWithServices from './Toolbar/ToolbarSplitButtonWithServices';\r\nimport ToolbarButtonWithServices from './Toolbar/ToolbarButtonWithServices';\r\n\r\nexport default function getToolbarModule({ commandsManager, servicesManager }) {\r\n return [\r\n {\r\n name: 'ohif.divider',\r\n defaultComponent: ToolbarDivider,\r\n clickHandler: () => {},\r\n },\r\n {\r\n name: 'ohif.action',\r\n defaultComponent: ToolbarButtonWithServices,\r\n clickHandler: () => {},\r\n },\r\n {\r\n name: 'ohif.radioGroup',\r\n defaultComponent: ToolbarButtonWithServices,\r\n clickHandler: () => {},\r\n },\r\n {\r\n name: 'ohif.splitButton',\r\n defaultComponent: ToolbarSplitButtonWithServices,\r\n clickHandler: () => {},\r\n },\r\n {\r\n name: 'ohif.layoutSelector',\r\n defaultComponent: ToolbarLayoutSelectorWithServices,\r\n clickHandler: (evt, clickedBtn, btnSectionName) => {},\r\n },\r\n {\r\n name: 'ohif.toggle',\r\n defaultComponent: ToolbarButtonWithServices,\r\n clickHandler: () => {},\r\n },\r\n ];\r\n}\r\n","import { CustomizationService } from '@ohif/core';\r\nimport React from 'react';\r\nimport DataSourceSelector from './Panels/DataSourceSelector';\r\nimport DataSourceConfigurationComponent from './Components/DataSourceConfigurationComponent';\r\nimport { GoogleCloudDataSourceConfigurationAPI } from './DataSourceConfigurationAPI/GoogleCloudDataSourceConfigurationAPI';\r\n\r\n/**\r\n *\r\n * Note: this is an example of how the customization module can be used\r\n * using the customization module. Below, we are adding a new custom route\r\n * to the application at the path /custom and rendering a custom component\r\n * Real world use cases of the having a custom route would be to add a\r\n * custom page for the user to view their profile, or to add a custom\r\n * page for login etc.\r\n */\r\nexport default function getCustomizationModule({ servicesManager, extensionManager }) {\r\n return [\r\n {\r\n name: 'helloPage',\r\n value: {\r\n id: 'customRoutes',\r\n routes: [\r\n {\r\n path: '/custom',\r\n children: () =>

Hello Custom Route

,\r\n },\r\n ],\r\n },\r\n },\r\n\r\n // Example customization to list a set of datasources\r\n {\r\n name: 'datasources',\r\n value: {\r\n id: 'customRoutes',\r\n routes: [\r\n {\r\n path: '/datasources',\r\n children: DataSourceSelector,\r\n },\r\n ],\r\n },\r\n },\r\n\r\n {\r\n name: 'default',\r\n value: [\r\n /**\r\n * Customization Component Type definition for overlay items.\r\n * Overlay items are texts (or other components) that will be displayed\r\n * on a Viewport Overlay, which contains the information panels on the\r\n * four corners of a viewport.\r\n *\r\n * @definition of a overlay item using this type\r\n * The value to be displayed is defined by\r\n * - setting DICOM image instance's property to this field,\r\n * - or defining contentF()\r\n *\r\n * {\r\n * id: string - unique id for the overlay item\r\n * customizationType: string - indicates customization type definition to this\r\n * label: string - Label, to be displayed for the item\r\n * title: string - Tooltip, for the item\r\n * color: string - Color of the text\r\n * condition: ({ instance }) => boolean - decides whether to display the overlay item or not\r\n * attribute: string - property name of the DICOM image instance\r\n * contentF: ({ instance, formatters }) => string | component,\r\n * }\r\n *\r\n * @example\r\n * {\r\n * id: 'PatientNameOverlay',\r\n * customizationType: 'ohif.overlayItem',\r\n * label: 'PN:',\r\n * title: 'Patient Name',\r\n * color: 'yellow',\r\n * condition: ({ instance }) => instance && instance.PatientName && instance.PatientName.Alphabetic,\r\n * attribute: 'PatientName',\r\n * contentF: ({ instance, formatters: { formatPN } }) => `${formatPN(instance.PatientName.Alphabetic)} ${(instance.PatientSex ? '(' + instance.PatientSex + ')' : '')}`,\r\n * },\r\n *\r\n * @see CustomizableViewportOverlay\r\n */\r\n {\r\n id: 'ohif.overlayItem',\r\n content: function (props) {\r\n if (this.condition && !this.condition(props)) {\r\n return null;\r\n }\r\n\r\n const { instance } = props;\r\n const value =\r\n instance && this.attribute\r\n ? instance[this.attribute]\r\n : this.contentF && typeof this.contentF === 'function'\r\n ? this.contentF(props)\r\n : null;\r\n if (!value) {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n {this.label && {this.label}}\r\n {value}\r\n
\r\n );\r\n },\r\n },\r\n\r\n {\r\n id: 'ohif.contextMenu',\r\n\r\n /** Applies the customizationType to all the menu items.\r\n * This function clones the object and child objects to prevent\r\n * changes to the original customization object.\r\n */\r\n transform: function (customizationService: CustomizationService) {\r\n // Don't modify the children, as those are copied by reference\r\n const clonedObject = { ...this };\r\n clonedObject.menus = this.menus.map(menu => ({ ...menu }));\r\n\r\n for (const menu of clonedObject.menus) {\r\n const { items: originalItems } = menu;\r\n menu.items = [];\r\n for (const item of originalItems) {\r\n menu.items.push(customizationService.transform(item));\r\n }\r\n }\r\n return clonedObject;\r\n },\r\n },\r\n\r\n {\r\n // the generic GUI component to configure a data source using an instance of a BaseDataSourceConfigurationAPI\r\n id: 'ohif.dataSourceConfigurationComponent',\r\n component: DataSourceConfigurationComponent.bind(null, {\r\n servicesManager,\r\n extensionManager,\r\n }),\r\n },\r\n\r\n {\r\n // The factory for creating an instance of a BaseDataSourceConfigurationAPI for Google Cloud Healthcare\r\n id: 'ohif.dataSourceConfigurationAPI.google',\r\n factory: (dataSourceName: string) =>\r\n new GoogleCloudDataSourceConfigurationAPI(\r\n dataSourceName,\r\n servicesManager,\r\n extensionManager\r\n ),\r\n },\r\n ],\r\n },\r\n ];\r\n}\r\n"],"names":["getString","getName","getModalities","DICOMWeb","processResults","qidoStudies","length","studies","forEach","qidoStudy","push","studyInstanceUid","date","time","accession","mrn","patientName","utils","formatPN","instances","Number","description","modalities","async","search","dicomWebClient","seriesInstanceUid","queryParameters","searchForStudies","undefined","queryParams","mapParams","params","options","arguments","commaSeparatedFields","join","supportsWildcard","withWildcard","value","parameters","PatientName","patientId","AccessionNumber","accessionNumber","StudyDescription","studyDescription","ModalitiesInStudy","modalitiesInStudy","limit","offset","fuzzymatching","supportsFuzzyMatching","includefield","startDate","endDate","StudyDate","today","Date","DD","String","getDate","padStart","MM","getMonth","todayStr","getFullYear","oldDateStr","studyUids","Array","isArray","replace","StudyInstanceUID","final","Object","keys","key","getImageId","_ref","instance","frame","config","thumbnail","url","renderingAttr","uri","baseWadoRsUri","SeriesInstanceUID","SOPInstanceUID","wadoRoot","buildInstanceWadoRsUri","buildInstanceFrameWadoRsUri","getWADORSImageId","wadouri","paramString","wadoUriRoot","buildInstanceWadoUrl","imageId","RetrieveMetadataLoader","constructor","client","studyInstanceUID","filters","sortCriteria","sortFunction","this","execLoad","preLoadData","preLoad","loadData","load","posLoad","runLoaders","loaders","result","loader","e","next","done","Error","configLoad","RetrieveMetadataLoaderSync","getOptions","seriesInstanceUID","getLoaders","retrieveSeriesMetadata","bind","retrieveStudyMetadata","RetrieveMetadataLoaderAsync","getPreLoaders","preLoaders","searchForSeries","naturalizeDataset","dcmjs","DicomMetaDictionary","naturalized","map","sortStudySeries","sortingCriteria","seriesSortCriteria","seriesInfoSortingCriteria","seriesAsyncLoader","seriesInstanceUIDList","freeze","hasNext","shift","makeSeriesAsyncLoader","s","promises","enableStudyLazyLoad","retrieveMetadataLoader","moduleName","StudyMetaDataPromises","Map","has","get","promise","Promise","resolve","reject","RetrieveMetadata","then","data","set","deleteStudyMetadataPromise","delete","StaticWadoClient","api","DICOMwebClient","qidoConfig","super","staticWado","searchResult","lowerParams","toLowerParams","filter","study","studyFilterKeys","filterItem","series","seriesFilterKeys","compareValues","desired","actual","find","item","actualItem","Alphabetic","indexOf","substring","compareDateRange","range","dash","start","end","sourceFilterMap","altKey","testValue","valueElem","vr","Value","entries","toLowerCase","studyinstanceuid","patientname","studydescription","studydate","modalitiesinstudy","accessionnumber","seriesinstanceuid","seriesnumber","modality","getDirectURL","singlepart","tag","defaultPath","defaultType","fetchPart","DirectRetrieveURL","InlineBinary","blob","b64toBlob","URL","createObjectURL","retrieveBulkData","arr","Blob","type","console","warn","BulkDataURI","hasQuery","hasAccept","fixBulkDataURI","dicomWebConfig","startsWith","origin","bulkDataURI","relativeResolution","DicomDict","denaturalizeDataset","ImplementationClassUID","ImplementationVersionName","EXPLICIT_VR_LITTLE_ENDIAN","metadataProvider","classes","MetadataProvider","createDicomWebApi","userAuthenticationService","dicomWebConfigCopy","wadoConfig","qidoDicomWebClient","wadoDicomWebClient","getAuthrorizationHeader","generateWadoHeader","implementation","initialize","query","onConfiguration","JSON","parse","stringify","xhrRequestHeaders","authHeaders","getAuthorizationHeader","Authorization","Accept","generateAcceptHeader","acceptHeader","requestTransferSyntaxUID","omitQuotationForMultipartRequest","qidoRoot","headers","errorInterceptor","errorHandler","getHTTPErrorHandler","origParams","mappedParams","qidoSearch","qidoSeries","seriesNumber","seriesDate","formatDate","numSeriesInstances","processSeriesResults","seriesInStudy","call","retrieve","directURL","_ref2","multipart","val","metadata","madeInClient","_retrieveSeriesMetadataAsync","_retrieveSeriesMetadataSync","store","dicom","dataset","request","ArrayBuffer","datasets","storeInstances","meta","FileMetaInformationVersion","_meta","MediaStorageSOPClassUID","SOPClassUID","MediaStorageSOPInstanceUID","TransferSyntaxUID","denaturalized","dicomDict","dict","write","naturalizedInstancesMetadata","seriesSummaryMetadata","instancesPerSeries","SeriesDescription","SeriesNumber","SeriesTime","ProtocolName","Modality","getImageIdsForInstance","wadoUri","addImageIdToUIDs","seriesMetadata","values","DicomMetadataStore","addSeriesMetadata","addInstances","seriesPromises","addRetrieveBulkData","enabled","ret","arrayBuffer","byteLength","aSeries","seriesDeliveredPromises","naturalizedInstances","index","all","getStudy","isLoaded","getImageIdsForDisplaySet","displaySet","images","imageIds","NumberOfFrames","_ref3","getConfig","getStudyInstanceUIDs","_ref4","StudyInstanceUIDs","paramsStudyInstanceUIDs","queryStudyInstanceUIDs","splitComma","getAll","supportsReject","xhr","XMLHttpRequest","open","log","onreadystatechange","readyState","status","responseText","send","IWebApiDataSource","create","OHIF","mappings","_store","urls","studyInstanceUIDMap","getMetaDataByURL","metaData","findStudies","aStudy","createDicomJSONApi","dicomJsonConfig","response","fetch","json","naturalizedDicom","param","mappedParam","NumInstances","Modalities","PatientID","StudyTime","customSort","seriesSummary","numberOfSeries","obj","i","EVENTS","END_MODALITIES","SR","SEG","DOC","compareValue","v1","v2","seriesA","seriesB","instanceA","instanceB","modalityA","modalityB","isEndA","isEndB","createDicomLocalApi","dicomLocalConfig","name","numInstances","Set","add","firstInstance","from","SeriesDate","_broadcastEvent","SERIES_ADDED","isMultiframe","frameIndex","INSTANCES_ADDED","naturalizedReport","reportBlob","datasetToBlob","objectUrl","window","location","assign","getInstance","StudyInstanceUIDsAsArray","isStudyInCache","sort","createDicomWebProxyApi","dicomWebProxyConfig","UserAuthenticationService","dicomWebDelegate","servers","dicomWeb","configuration","studyInstanceUIDs","split","createDataSource","Toolbar","servicesManager","toolbarService","services","toolbarButtons","setToolbarButtons","useState","useEffect","unsubscribe","subscribe","TOOL_BAR_MODIFIED","getButtonSection","onInteraction","useCallback","args","recordInteraction","React","toolDef","id","Component","componentProps","className","classnames","_extends","availableLanguages","defaultLanguage","currentLanguage","i18n","hotkeysManager","extensionManager","appConfig","useAppConfig","navigate","useNavigate","useLocation","t","useTranslation","show","hide","useModal","hotkeyDefinitions","hotkeyDefaults","menuOptions","title","icon","onClick","content","AboutModal","contentProps","versionNumber","process","commitHash","UserPreferences","getValidHotkeyDefinitions","onCancel","hotkeys","stopRecord","unpause","onSubmit","language","changeLanguage","setHotkeys","onReset","restoreDefaultBindings","hotkeysModule","oidc","encodeURIComponent","href","Header","isReturnEnabled","showStudyList","onClickReturnButton","pathname","dataSourceIdx","configUrl","URLSearchParams","dataSourceName","existingDataSource","getDataSources","searchQuery","append","decodeURIComponent","toString","WhiteLabeling","whiteLabeling","ErrorBoundary","context","side","activeTabIndex","activeTabIndexProp","tabs","panelService","hasBeenOpened","setHasBeenOpened","setActiveTabIndex","activatePanelSubscription","ACTIVATE_PANEL","activatePanelEvent","forceActive","tabIndex","findIndex","tab","panelId","SidePanel","onOpen","ViewerLayout","commandsManager","viewports","ViewportGridComp","leftPanels","rightPanels","leftPanelDefaultClosed","rightPanelDefaultClosed","hangingProtocolService","showLoadingIndicator","setShowLoadingIndicator","document","body","classList","remove","getComponent","entry","getModuleEntry","component","getPanelData","iconName","iconLabel","label","HangingProtocolService","PROTOCOL_CHANGED","leftPanelComponents","rightPanelComponents","viewportComponents","viewportComponent","namespace","displaySetsToDisplay","ViewerHeader","style","height","LoadingIndicatorProgress","SidePanelWithServices","propTypes","PropTypes","isRequired","CommandsManager","ServicesManager","children","sortStudyInstances","PanelStudyBrowser","getImageSrc","getStudiesForPatientByMRN","requestDisplaySetCreationForStudy","dataSource","displaySetService","uiNotificationService","useImageViewer","activeViewportId","viewportGridService","useViewportGrid","activeTabName","setActiveTabName","expandedStudyInstanceUIDs","setExpandedStudyInstanceUIDs","studyDisplayList","setStudyDisplayList","displaySets","setDisplaySets","thumbnailImageSrcMap","setThumbnailImageSrcMap","sid","qidoForStudyUID","qidoStudiesForPatient","error","actuallyMappedStudies","prevArray","it","fetchStudiesForPatient","activeDisplaySets","newImageSrcEntry","getDisplaySetByUID","dSet","displaySetInstanceUID","Math","floor","unsupported","prevState","mappedDisplaySets","_mapDisplaySets","SubscriptionDisplaySetsAdded","DISPLAY_SETS_ADDED","displaySetsAdded","initialViewport","SubscriptionDisplaySetsChanged","DISPLAY_SETS_CHANGED","changedDisplaySets","SubscriptionDisplaySetMetaDataInvalidated","DISPLAY_SET_SERIES_METADATA_INVALIDATED","getActiveDisplaySets","primaryStudyInstanceUIDs","primaryStudies","recentStudies","allStudies","displaySetsForStudy","ds","tabStudy","includes","_createStudyBrowserTabs","activeDisplaySetInstanceUIDs","displaySetInstanceUIDs","StudyBrowser","onDoubleClickThumbnail","updatedViewports","viewportId","getViewportsRequireUpdate","message","duration","setDisplaySetsForViewports","onClickStudy","shouldCollapseStudy","updatedExpandedStudyInstanceUIDs","stdyUid","onClickTab","clickedTabName","thumbnailDisplaySets","thumbnailNoImageDisplaySets","excludeFromThumbnailBrowser","imageSrc","componentType","thumbnailNoImageModalities","_getComponentType","seriesTime","numImageFrames","countIcon","messages","dragData","isHydratedForDerivedDisplaySet","isHydrated","cornerstone","canvas","createElement","utilities","loadImageToCanvas","toDataURL","catch","some","WrappedPanelStudyBrowser","_getStudiesForPatientByMRN","_getImageSrcFromImageId","exports","getCornerstoneLibraries","getImageSrcFromImageId","ex","_createGetImageSrcFromImageIdFn","_requestDisplaySetCreationForStudy","ActionButtons","onExportClick","onCreateReportClick","LegacyButtonGroup","color","size","LegacyButton","defaultProps","alert","CREATE_REPORT_DIALOG_RESPONSE","CANCEL","CREATE_REPORT","CreateReportDialogPrompt","uiDialogService","dialogId","dataSourcesOpts","dataSourceMap","dataSourceDefs","supportsStow","placeHolder","centralize","isDraggable","Dialog","useLastPosition","showOverlay","activeDataSource","noCloseButton","onClose","_handleClose","dismiss","action","actions","text","ButtonEnums","secondary","primary","setValue","allowMultiSelectExport","Select","closeMenuOnSelect","placeholder","option","onChange","evt","v","isClearable","Input","autoFocus","labelClassName","event","persist","target","onKeyPress","required","Loading","getReport","reportType","loadingDialogId","getMostRecentDisplaySet","MIN_SR_SERIES_NUMBER","findSRWithSameSeriesDescription","sameSeries","InstanceNumber","srSeriesNumbers","max","getNextSRSeriesNumber","downloadCSVReport","PanelMeasurementTable","viewportGrid","measurementService","displayMeasurements","setDisplayMeasurements","debouncedSetDisplayMeasurements","debounce","_getMappedMeasurements","added","MEASUREMENT_ADDED","addedRaw","RAW_MEASUREMENT_ADDED","updated","MEASUREMENT_UPDATED","removed","MEASUREMENT_REMOVED","cleared","MEASUREMENTS_CLEARED","subscriptions","unsub","cancel","onMeasurementItemClickHandler","_ref6","uid","isActive","measurements","measurement","m","MeasurementTable","jumpToMeasurement","onEdit","getMeasurement","onSubmitHandler","update","_ref5","getMeasurements","onClearMeasurementsClick","clearMeasurements","activeViewport","trackedMeasurements","referenceStudyUID","promptResult","createReportDialogPrompt","createReportAsync","runCommand","measurementData","additionalFindingTypes","types","displayText","baseDisplayText","baseLabel","selected","findingSites","finding","firstSite","siteText","site","measurementType","_mapMeasurementToDisplay","VALUE_TYPES","secondaryLabel","wrappedMeasurementPanel","packageJson","_checkSeriesPositionShift","previousPosition","actualPosition","scanAxisNormal","averageSpacingBetweenFrames","predictedPosition","vec3","areAllImagePositionsEqual","firstImageOrientationPatient","toNumber","ImageOrientationPatient","imageOrientation","rowCosineVec","colCosineVec","calculateScanAxisNormal","firstImagePositionPatient","ImagePositionPatient","lastIpp","_getPerpendicularDistance","previousImagePositionPatient","imagePositionPatient","checkSingleFrames","firstImage","firstImageRows","Rows","firstImageColumns","Columns","areAllImageDimensionsEqual","addMessage","DisplaySetMessage","CODES","INCONSISTENT_DIMENSIONS","firstImageSamplesPerPixel","SamplesPerPixel","areAllImageComponentsEqual","INCONSISTENT_COMPONENTS","imageOrientationPatient","_isSameOrientation","areAllImageOrientationsEqual","INCONSISTENT_ORIENTATIONS","INCONSISTENT_POSITION_INFORMATION","issuesFound","spacingBetweenFrames","spacingIssue","_getSpacingIssue","issue","reconstructionIssues","MISSING_FRAMES","IRREGULAR_SPACING","areAllImageSpacingEqual","getDisplaySetMessages","isReconstructable","DisplaySetMessageList","NO_VALID_INSTANCES","ImageType","constructableModalities","every","NO_POSITION_INFORMATION","sortedInstances","sortInstancesByPosition","multiFrameInstance","hasPixelMeasurements","MULTIFRAME_NO_PIXEL_MEASUREMENTS","hasOrientation","MULTIFRAME_NO_ORIENTATION","hasPosition","MULTIFRAME_NO_POSITION_INFORMATION","checkMultiFrame","NOT_RECONSTRUCTABLE","getDisplaySetsFromUnsupportedSeries","imageSet","ImageSet","UNSUPPORTED_DISPLAYSET","setAttributes","FrameRate","FrameTime","SOPClassHandlerId","sopClassHandlerName","isMultiFrame","makeDisplaySet","isDisplaySetReconstructable","sortBy","a","b","parseInt","isSingleImageModality","getDisplaySetsFromSeries","sopClassUids","uniqueSopClassUidsInSeries","getSopClassUids","stackableInstances","isImage","isClip","instanceNumber","acquisitionDatetime","AcquisitionDateTime","setAttribute","sopClassDictionary","ComputedRadiographyImageStorage","DigitalXRayImageStorageForPresentation","DigitalXRayImageStorageForProcessing","DigitalMammographyXRayImageStorageForPresentation","DigitalMammographyXRayImageStorageForProcessing","DigitalIntraOralXRayImageStorageForPresentation","DigitalIntraOralXRayImageStorageForProcessing","CTImageStorage","EnhancedCTImageStorage","LegacyConvertedEnhancedCTImageStorage","UltrasoundMultiframeImageStorage","MRImageStorage","EnhancedMRImageStorage","EnhancedMRColorImageStorage","LegacyConvertedEnhancedMRImageStorage","UltrasoundImageStorage","UltrasoundImageStorageRET","SecondaryCaptureImageStorage","MultiframeSingleBitSecondaryCaptureImageStorage","MultiframeGrayscaleByteSecondaryCaptureImageStorage","MultiframeGrayscaleWordSecondaryCaptureImageStorage","MultiframeTrueColorSecondaryCaptureImageStorage","XRayAngiographicImageStorage","EnhancedXAImageStorage","XRayRadiofluoroscopicImageStorage","EnhancedXRFImageStorage","XRay3DAngiographicImageStorage","XRay3DCraniofacialImageStorage","BreastTomosynthesisImageStorage","BreastProjectionXRayImageStorageForPresentation","BreastProjectionXRayImageStorageForProcessing","IntravascularOpticalCoherenceTomographyImageStorageForPresentation","IntravascularOpticalCoherenceTomographyImageStorageForProcessing","NuclearMedicineImageStorage","VLEndoscopicImageStorage","VideoEndoscopicImageStorage","VLMicroscopicImageStorage","VideoMicroscopicImageStorage","VLSlideCoordinatesMicroscopicImageStorage","VLPhotographicImageStorage","VideoPhotographicImageStorage","OphthalmicPhotography8BitImageStorage","OphthalmicPhotography16BitImageStorage","OphthalmicTomographyImageStorage","VLWholeSlideMicroscopyImageStorage","PositronEmissionTomographyImageStorage","EnhancedPETImageStorage","LegacyConvertedEnhancedPETImageStorage","RTImageStorage","EnhancedUSVolumeStorage","ToolbarDivider","LayoutSelector","rows","columns","onSelection","rest","isOpen","setIsOpen","closeOnOutsideClick","addEventListener","removeEventListener","DropdownContent","OHIFLayoutSelector","ToolbarButton","onInteractionHandler","rounded","dropdownContent","onLayoutChange","props","interactionType","commands","commandName","commandOptions","ToolbarSplitButtonWithServices","isRadio","isAction","groupId","items","renderer","handleItemClick","itemId","setState","state","isExpanded","getSplitButtonItems","buttonsState","setButtonState","primaryToolId","toggles","groups","isPrimaryToggle","isPrimaryActive","PrimaryButtonComponent","getButtonComponentForUIType","uiType","TOOL_BAR_STATE_MODIFIED","updatedItems","listItemRenderer","classNames","Icon","SplitButton","isToggle","tooltip","ToolbarButtonWithServices","getMenuItems","selectorProps","menus","menuIdFilter","subProps","menu","subMenu","findIt","menuId","findMenuById","selector","findMenuDefault","findMenuIterator","current","return","findMenu","menuItems","delegating","toAdd","newItem","actionType","iconRight","itemRef","detail","element","adaptItem","ContextMenuController","closeContextMenu","showContextMenu","contextMenuProps","viewportElement","defaultPointsPosition","ContextMenuItemsBuilder","preservePosition","preventCutOf","defaultPosition","_getDefaultPosition","ContextMenu","onClickOutside","eventData","onShowSubMenu","onDefault","run","getDefaultPosition","x","y","_getEventDefaultPosition","eventDetail","currentPoints","_getElementDefaultPosition","boundingClientRect","getBoundingClientRect","_getCanvasPointsPosition","points","viewerPos","pointIndex","point","_isValidPosition","source","canvasPoints","viewerElement","positionIterator","getPositionIterator","position","customizationType","nearbyToolData","rowVerticalPaddingStyle","padding","rowStyle","borderBottomWidth","ColumnHeaders","tagRef","vrRef","keywordRef","valueRef","ref","listRef","useRef","canvasRef","tagHeaderElem","setTagHeaderElem","vrHeaderElem","setVrHeaderElem","keywordHeaderElem","setKeywordHeaderElem","valueHeaderElem","setValueHeaderElem","scrollTo","resetAfterIndex","debouncedResize","Row","row","isHeaderRendered","getItemSize","headerWidths","offsetWidth","getContext","font","getComputedStyle","colText","colOneLineWidth","measureText","width","ceil","reduce","maxHeight","colHeight","visibility","elem","List","itemCount","itemSize","nameMap","getFormattedRowsFromTags","tags","tagInfo","tagIndent","keyword","formatedRowsFromTags","Tag","fromPString","toCleanString","originalTagInfo","getRows","depth","keywords","sequenceAsArray","objectOrArray","sequence","sequenceRows","_sortTagList","regex","match","tagList","excludedColumnIndicesForFilter","selectedDisplaySetInstanceUID","setSelectedDisplaySetInstanceUID","setInstanceNumber","filterValue","setFilterValue","activeDisplaySet","isImageStack","showInstanceList","displaySetList","useMemo","dateStr","moment","format","getSortedTags","filteredRows","filterValueLowerCase","keepRow","col","colIndex","debouncedSetFilterValue","Typography","variant","InputRange","minValue","maxValue","step","inputClassName","labelPosition","trackColor","InputFilterText","onDebounceChange","DicomTagTable","reuseCachedLayout","syncService","protocol","getActiveProtocol","hpInfo","getState","protocolId","stageIndex","activeStudyUID","syncState","viewportGridStore","displaySetSelectorMap","stage","stages","storeId","cacheId","hangingProtocolStageIndexMap","viewportStructure","properties","custom","layout","numRows","numCols","viewport","displaySetOptions","displaySetUID","matchedDisplaySetsIndex","findOrCreateViewport","viewportsByPosition","positionId","byPositionViewport","inDisplay","initialInDisplay","missing","getMissingViewport","displaySetsInfo","viewportOptions","findViewportsByPosition","storedViewport","subscribeToNextViewportGridChange","isHangingProtocolCommand","command","customizationService","stateSyncService","contextMenuController","menuCustomizationId","optionsToUse","defaultContextMenu","displayNotification","clear","toggleHpTools","toggleStageIndex","enableListener","button","hpCommand","stageId","setToggled","getButtons","setHangingProtocol","reset","primaryToolBeforeHPChange","getActivePrimaryTool","oldProtocol","stateSyncReduce","reuseCachedLayouts","hangingId","useStageIdx","getStageIndex","setActiveStudyUID","storedHanging","restoreProtocol","setProtocol","primaryButton","getButton","firstItem","callbacks","onProtocolExit","onProtocolEnter","toggleHangingProtocol","desiredStageIndex","activeStudy","previousState","deltaStage","direction","oldStageIndex","setViewportGridLayout","setTimeout","completeLayout","stateReduce","layoutFindOrCreate","setLayout","toggleOneUp","viewportGridState","toggleOneUpViewportGridStore","viewportIdToUpdate","updatedViewportsViaHP","flat","preOneUpViewport","layoutOptions","getLayoutOptionsFromState","clearToggleOneUpViewportGridStore","navigateHistory","historyArgs","history","to","openDICOMTagViewer","activeViewportSpecificData","UIModalService","DicomTagBrowser","toggleOverlays","overlays","getElementsByClassName","toggle","scrollActiveThumbnailIntoView","activeDisplaySetInstanceUID","thumbnailList","querySelector","thumbnailListBounds","thumbnailBounds","top","bottom","scrollIntoView","behavior","updateViewportDisplaySet","_ref7","excludeNonImageModalities","nonImageModalities","dsSortFn","getDisplaySetSortFunction","currentDisplaySets","displaySetIndexToShow","definitions","commandFn","storeContexts","nextStage","previousStage","defaultContext","protocolMatchingRules","weight","attribute","constraint","greaterThan","toolGroupIds","displaySetSelectors","defaultDisplaySetId","seriesMatchingRules","equals","defaultViewport","viewportType","toolGroupId","allowUnmatchedView","stageActivation","minViewportsMatched","layoutType","requiredViewports","preferredViewports","numberOfPriorsReferenced","currentDisplaySet","priorDisplaySet","currentViewport0","currentViewport1","priorViewport0","notNull","studyMatchingRules","priorDisplaySetId","defaultProtocol","locked","createdDate","modifiedDate","availableTo","editableBy","initialImageOptions","hpMNGrid","hpMNCompare","dsConfigs","dataSources","src","alt","sourceName","friendlyName","Button","itemLabel","itemList","onItemClicked","endIcon","NO_WRAP_ELLIPSIS_CLASS_NAMES","configurationAPI","configuredItems","onHide","setItemList","selectedItems","setSelectedItems","errorMessage","setErrorMessage","itemLabels","getItemLabels","showFullConfig","setShowFullConfig","currentSelectedItemIndex","shouldUpdate","setCurrentItem","getSelectedItemBackgroundClasses","itemIndex","getSelectedItemBorderClasses","getSelectedItemTextClasses","itemLabelIndex","theList","slice","ItemListComponent","setConfigurationAPI","setConfiguredItems","dataSourceChangedCallback","activeDataSourceDef","getActiveDataSourceDefinition","factory","configurationAPIFactory","configAPI","getConfiguredItems","list","sub","ACTIVE_DATA_SOURCE_CHANGED","showConfigurationModal","DataSourceConfigurationModalComponent","ItemType","initialUrl","baseHealthcareUrl","GoogleCloudDataSourceConfigurationAPI","_extensionManager","_fetchOptions","_dataSourceName","method","projects","_doFetch","project","projectId","itemType","anItem","googleCloudItem","dicomStores","dataSourceDefCopy","getDataSourceDefinition","updateDataSourceConfiguration","subItemType","subItemField","fetchedSubItems","subItem","nameSplit","projectsIndex","urlSplit","projectUrl","relativePath","urlStr","fetchItemType","fetchOptions","fetchSearchParams","nextPageToken","pageToken","subPageData","concat","statusText","err","handlePETImageMetadata","getSeries","instanceMetadataArray","instanceMetadata","dicomMetaData","CorrectedImage","Units","RadiopharmaceuticalInformationSequence","RadionuclideHalfLife","RadionuclideTotalDose","DecayCorrection","AcquisitionDate","AcquisitionTime","RadiopharmaceuticalStartDateTime","RadiopharmaceuticalStartTime","PatientWeight","philipsPETPrivateGroup","SUVScaleFactor","ActivityConcentrationScaleFactor","PhilipsPETPrivateGroup","GEPrivatePostInjectionDateTime","FrameReferenceTime","ActualFrameDuration","PatientSex","PatientSize","getPTImageIdInstanceMetadata","suvScalingFactors","calculateSUVScalingFactors","addCustomMetadata","preRegistration","SERIES_UPDATED","register","clearOnModeExit","getDataSourcesModule","getLayoutTemplateModule","getPanelModule","getHangingProtocolModule","getSopClassHandlerModule","getToolbarModule","defaultComponent","clickHandler","ToolbarLayoutSelectorWithServices","clickedBtn","btnSectionName","getCommandsModule","getUtilityModule","getCustomizationModule","routes","path","DataSourceSelector","condition","contentF","transform","clonedObject","originalItems","DataSourceConfigurationComponent"],"sourceRoot":""} \ No newline at end of file diff --git a/resources/359.bundle.e32228f9015077353eac.js b/resources/359.bundle.e32228f9015077353eac.js new file mode 100644 index 0000000..4ce6efb --- /dev/null +++ b/resources/359.bundle.e32228f9015077353eac.js @@ -0,0 +1,2 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[359],{22359:(o,e,t)=>{t.r(e),t.d(e,{default:()=>N});var n=t(71771),i=t(71783);const s={CT:"ctToolGroup",PT:"ptToolGroup",Fusion:"fusionToolGroup",MIP:"mipToolGroup",default:"default"};const l=function(o,e,t,n){!function(o,e,t,n){const i={active:[{toolName:o.WindowLevel,bindings:[{mouseButton:e.MouseBindings.Primary}]},{toolName:o.Pan,bindings:[{mouseButton:e.MouseBindings.Auxiliary}]},{toolName:o.Zoom,bindings:[{mouseButton:e.MouseBindings.Secondary}]},{toolName:o.StackScrollMouseWheel,bindings:[]}],passive:[{toolName:o.Length},{toolName:o.ArrowAnnotate,configuration:{getTextCallback:(o,e)=>{n.runCommand("arrowTextCallback",{callback:o,eventDetails:e})},changeTextCallback:(o,e,t)=>n.runCommand("arrowTextCallback",{callback:t,data:o,eventDetails:e})}},{toolName:o.Bidirectional},{toolName:o.DragProbe},{toolName:o.Probe},{toolName:o.EllipticalROI},{toolName:o.RectangleROI},{toolName:o.StackScroll},{toolName:o.Angle},{toolName:o.CobbAngle},{toolName:o.Magnify}],enabled:[{toolName:o.SegmentationDisplay}],disabled:[{toolName:o.Crosshairs,configuration:{viewportIndicators:!1,autoPan:{enabled:!1,panSize:10}}}]};t.createToolGroupAndAddTools(s.CT,i),t.createToolGroupAndAddTools(s.PT,{active:i.active,passive:[...i.passive,{toolName:"RectangleROIStartEndThreshold"}],enabled:i.enabled,disabled:i.disabled}),t.createToolGroupAndAddTools(s.Fusion,i),t.createToolGroupAndAddTools(s.default,i);const l={active:[{toolName:o.VolumeRotateMouseWheel,configuration:{rotateIncrementDegrees:.1}},{toolName:o.MipJumpToClick,configuration:{toolGroupId:s.PT},bindings:[{mouseButton:e.MouseBindings.Primary}]}],enabled:[{toolName:o.SegmentationDisplay}]};t.createToolGroupAndAddTools(s.MIP,l)}(o,e,t,n)},{windowLevelPresets:a}=n.defaults;function r(o,e,t,n,i,s){return{id:e,icon:t,label:n,type:o,commands:i,tooltip:s}}function d(o,e){return{id:o,label:o,type:"action",commands:[{commandName:"setFusionPTColormap",commandOptions:{toolGroupId:s.Fusion,colormap:e}}]}}r.bind(null,"action"),r.bind(null,"toggle");const c=r.bind(null,"tool");function u(o,e,t){return{id:o.toString(),title:e,subtitle:t,type:"action",commands:[{commandName:"setWindowLevel",commandOptions:{...a[o]},context:"CORNERSTONE"}]}}function m(o,e,t){return t.map((t=>({commandName:o,commandOptions:{toolName:e,toolGroupId:t},context:"CORNERSTONE"})))}const p=[{id:"MeasurementTools",type:"ohif.splitButton",props:{groupId:"MeasurementTools",isRadio:!0,primary:c("Length","tool-length","Length",[...m("setToolActive","Length",[s.CT,s.PT,s.Fusion])],"Length"),secondary:{icon:"chevron-down",label:"",isActive:!0,tooltip:"More Measure Tools"},items:[c("Length","tool-length","Length",[...m("setToolActive","Length",[s.CT,s.PT,s.Fusion])],"Length Tool"),c("Bidirectional","tool-bidirectional","Bidirectional",[...m("setToolActive","Bidirectional",[s.CT,s.PT,s.Fusion])],"Bidirectional Tool"),c("ArrowAnnotate","tool-annotate","Annotation",[...m("setToolActive","ArrowAnnotate",[s.CT,s.PT,s.Fusion])],"Arrow Annotate"),c("EllipticalROI","tool-elipse","Ellipse",[...m("setToolActive","EllipticalROI",[s.CT,s.PT,s.Fusion])],"Ellipse Tool")]}},{id:"Zoom",type:"ohif.radioGroup",props:{type:"tool",icon:"tool-zoom",label:"Zoom",commands:[...m("setToolActive","Zoom",[s.CT,s.PT,s.Fusion])]}},{id:"MPR",type:"ohif.action",props:{type:"toggle",icon:"icon-mpr",label:"MPR",commands:[{commandName:"toggleHangingProtocol",commandOptions:{protocolId:"mpr"},context:"DEFAULT"}]}},{id:"WindowLevel",type:"ohif.splitButton",props:{groupId:"WindowLevel",primary:c("WindowLevel","tool-window-level","Window Level",[...m("setToolActive","WindowLevel",[s.CT,s.PT,s.Fusion])],"Window Level"),secondary:{icon:"chevron-down",label:"W/L Manual",isActive:!0,tooltip:"W/L Presets"},isAction:!0,renderer:i.eJ,items:[u(1,"Soft tissue","400 / 40"),u(2,"Lung","1500 / -600"),u(3,"Liver","150 / 90"),u(4,"Bone","2500 / 480"),u(5,"Brain","80 / 40")]}},{id:"Crosshairs",type:"ohif.radioGroup",props:{type:"tool",icon:"tool-crosshair",label:"Crosshairs",commands:[...m("setToolActive","Crosshairs",[s.CT,s.PT,s.Fusion])]}},{id:"Pan",type:"ohif.radioGroup",props:{type:"tool",icon:"tool-move",label:"Pan",commands:[...m("setToolActive","Pan",[s.CT,s.PT,s.Fusion])]}},{id:"RectangleROIStartEndThreshold",type:"ohif.radioGroup",props:{type:"tool",icon:"tool-create-threshold",label:"Rectangle ROI Threshold",commands:[...m("setToolActive","RectangleROIStartEndThreshold",[s.PT]),{commandName:"displayNotification",commandOptions:{title:"RectangleROI Threshold Tip",text:"RectangleROI Threshold tool should be used on PT Axial Viewport",type:"info"}},{commandName:"setViewportActive",commandOptions:{viewportId:"ptAXIAL"}}]}},{id:"fusionPTColormap",type:"ohif.splitButton",props:{groupId:"fusionPTColormap",primary:c("fusionPTColormap","tool-fusion-color","Fusion PT Colormap",[],"Fusion PT Colormap"),secondary:{icon:"chevron-down",label:"PT Colormap",isActive:!0,tooltip:"PET Image Colormap"},isAction:!0,items:[d("HSV","hsv"),d("Hot Iron","hot_iron"),d("S PET","s_pet"),d("Red Hot","red_hot"),d("Perfusion","perfusion"),d("Rainbow","rainbow_2"),d("SUV","suv"),d("GE 256","ge_256"),d("GE","ge"),d("Siemens","siemens")]}}],T=JSON.parse('{"u2":"@ohif/mode-tmtv"}').u2;const{MetadataProvider:g}=n.classes,h="@ohif/extension-default.layoutTemplateModule.viewerLayout",v="@ohif/extension-default.sopClassHandlerModule.stack",f="@ohif/extension-default.panelModule.seriesList",y="@ohif/extension-cornerstone.viewportModule.cornerstone",C="@ohif/extension-tmtv.hangingProtocolModule.ptCT",P="@ohif/extension-tmtv.panelModule.petSUV",b="@ohif/extension-tmtv.panelModule.ROIThresholdSeg",S={"@ohif/extension-default":"^3.0.0","@ohif/extension-cornerstone":"^3.0.0","@ohif/extension-tmtv":"^3.0.0"};let I=[];const N={id:T,modeFactory:function(o){let{modeConfiguration:e}=o;return{id:T,routeName:"tmtv",displayName:"Total Metabolic Tumor Volume",onModeEnter:o=>{let{servicesManager:e,extensionManager:t,commandsManager:n}=o;const{toolbarService:i,toolGroupService:a,hangingProtocolService:r,displaySetService:d}=e.services,c=t.getModuleEntry("@ohif/extension-cornerstone.utilityModule.tools"),{toolNames:u,Enums:m}=c.exports;l(u,m,a,n);const{unsubscribe:T}=a.subscribe(a.EVENTS.VIEWPORT_ADDED,(()=>{const{displaySetMatchDetails:o}=r.getMatchDetails();!function(o,e,t,n){const i=o.get("ctDisplaySet");if(!i)return;const{SeriesInstanceUID:l}=i,a=n.getDisplaySetsForSeries(l),r={...t.getToolConfiguration(s.Fusion,e.Crosshairs),filterActorUIDsToSetSlabThickness:[a[0].displaySetInstanceUID]};t.setToolConfiguration(s.Fusion,e.Crosshairs,r)}(o,u,a,d),function(o,e,t,n){const i=o.get("ptDisplaySet");if(!i)return;const{SeriesInstanceUID:l}=i,a=n.getDisplaySetsForSeries(l);if(!a||0===a.length)return;const r=t.getToolConfiguration(s.Fusion,e.WindowLevel),d=t.getToolConfiguration(s.Fusion,e.EllipticalROI),c=`cornerstoneStreamingImageVolume:${a[0].displaySetInstanceUID}`,u={...r,volumeId:c},m={...d,volumeId:c};t.setToolConfiguration(s.Fusion,e.WindowLevel,u),t.setToolConfiguration(s.Fusion,e.EllipticalROI,m)}(o,u,a,d),i.recordInteraction({groupId:"WindowLevel",interactionType:"tool",commands:[{commandName:"setToolActive",commandOptions:{toolName:u.WindowLevel,toolGroupId:s.CT},context:"CORNERSTONE"},{commandName:"setToolActive",commandOptions:{toolName:u.WindowLevel,toolGroupId:s.PT},context:"CORNERSTONE"},{commandName:"setToolActive",commandOptions:{toolName:u.WindowLevel,toolGroupId:s.Fusion},context:"CORNERSTONE"}]})}));I.push(T),i.init(t),i.addButtons(p),i.createButtonSection("primary",["MeasurementTools","Zoom","WindowLevel","Crosshairs","Pan","RectangleROIStartEndThreshold","fusionPTColormap"]),r.addCustomAttribute("getPTVOIRange","get PT VOI based on corrected or not",(o=>{const e=o.find((o=>"PT"===o.Modality));if(!e)return;const{imageId:t}=e.images[0],n=g.get("scalingModule",t);return n&&n.suvbw?{windowWidth:5,windowCenter:2.5}:void 0}))},onModeExit:o=>{let{servicesManager:e}=o;const{toolGroupService:t,syncGroupService:n,segmentationService:i,cornerstoneViewportService:s}=e.services;I.forEach((o=>o())),t.destroy(),n.destroy(),i.destroy(),s.destroy()},validationTags:{study:[],series:[]},isValidMode:o=>{let{modalities:e,study:t}=o;const n=e.split("\\");return n.includes("CT")&&n.includes("PT")&&!["SM"].some((o=>n.includes(o)))&&"1.3.6.1.4.1.12842.1.1.14.3.20220915.105557.468.2963630849"!==t.studyInstanceUid},routes:[{path:"tmtv",layoutTemplate:o=>{let{location:e,servicesManager:t}=o;return{id:h,props:{leftPanels:[f],leftPanelDefaultClosed:!0,rightPanels:[b,P],viewports:[{namespace:y,displaySetsToDisplay:[v]}]}}}}],extensions:S,hangingProtocol:C,sopClassHandlers:[v],hotkeys:[...n.dD.defaults.hotkeyBindings],...e}},extensionDependencies:S}}}]); +//# sourceMappingURL=359.bundle.e32228f9015077353eac.js.map \ No newline at end of file diff --git a/resources/359.bundle.e32228f9015077353eac.js.map b/resources/359.bundle.e32228f9015077353eac.js.map new file mode 100644 index 0000000..85383ce --- /dev/null +++ b/resources/359.bundle.e32228f9015077353eac.js.map @@ -0,0 +1 @@ +{"version":3,"file":"359.bundle.e32228f9015077353eac.js","mappings":"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","sources":["webpack:///../../../modes/tmtv/src/initToolGroups.js","webpack:///../../../modes/tmtv/src/toolbarButtons.js","webpack:///../../../modes/tmtv/src/id.js","webpack:///../../../modes/tmtv/src/index.js","webpack:///../../../modes/tmtv/src/utils/setCrosshairsConfiguration.js","webpack:///../../../modes/tmtv/src/utils/setFusionActiveVolume.js"],"sourcesContent":["export const toolGroupIds = {\r\n CT: 'ctToolGroup',\r\n PT: 'ptToolGroup',\r\n Fusion: 'fusionToolGroup',\r\n MIP: 'mipToolGroup',\r\n default: 'default',\r\n // MPR: 'mpr',\r\n};\r\n\r\nfunction _initToolGroups(toolNames, Enums, toolGroupService, commandsManager) {\r\n const tools = {\r\n active: [\r\n {\r\n toolName: toolNames.WindowLevel,\r\n bindings: [{ mouseButton: Enums.MouseBindings.Primary }],\r\n },\r\n {\r\n toolName: toolNames.Pan,\r\n bindings: [{ mouseButton: Enums.MouseBindings.Auxiliary }],\r\n },\r\n {\r\n toolName: toolNames.Zoom,\r\n bindings: [{ mouseButton: Enums.MouseBindings.Secondary }],\r\n },\r\n { toolName: toolNames.StackScrollMouseWheel, bindings: [] },\r\n ],\r\n passive: [\r\n { toolName: toolNames.Length },\r\n {\r\n toolName: toolNames.ArrowAnnotate,\r\n configuration: {\r\n getTextCallback: (callback, eventDetails) => {\r\n commandsManager.runCommand('arrowTextCallback', {\r\n callback,\r\n eventDetails,\r\n });\r\n },\r\n\r\n changeTextCallback: (data, eventDetails, callback) =>\r\n commandsManager.runCommand('arrowTextCallback', {\r\n callback,\r\n data,\r\n eventDetails,\r\n }),\r\n },\r\n },\r\n { toolName: toolNames.Bidirectional },\r\n { toolName: toolNames.DragProbe },\r\n { toolName: toolNames.Probe },\r\n { toolName: toolNames.EllipticalROI },\r\n { toolName: toolNames.RectangleROI },\r\n { toolName: toolNames.StackScroll },\r\n { toolName: toolNames.Angle },\r\n { toolName: toolNames.CobbAngle },\r\n { toolName: toolNames.Magnify },\r\n ],\r\n enabled: [{ toolName: toolNames.SegmentationDisplay }],\r\n disabled: [\r\n {\r\n toolName: toolNames.Crosshairs,\r\n configuration: {\r\n viewportIndicators: false,\r\n autoPan: {\r\n enabled: false,\r\n panSize: 10,\r\n },\r\n },\r\n },\r\n ],\r\n };\r\n\r\n toolGroupService.createToolGroupAndAddTools(toolGroupIds.CT, tools);\r\n toolGroupService.createToolGroupAndAddTools(toolGroupIds.PT, {\r\n active: tools.active,\r\n passive: [...tools.passive, { toolName: 'RectangleROIStartEndThreshold' }],\r\n enabled: tools.enabled,\r\n disabled: tools.disabled,\r\n });\r\n toolGroupService.createToolGroupAndAddTools(toolGroupIds.Fusion, tools);\r\n toolGroupService.createToolGroupAndAddTools(toolGroupIds.default, tools);\r\n\r\n const mipTools = {\r\n active: [\r\n {\r\n toolName: toolNames.VolumeRotateMouseWheel,\r\n configuration: {\r\n rotateIncrementDegrees: 0.1,\r\n },\r\n },\r\n {\r\n toolName: toolNames.MipJumpToClick,\r\n configuration: {\r\n toolGroupId: toolGroupIds.PT,\r\n },\r\n bindings: [{ mouseButton: Enums.MouseBindings.Primary }],\r\n },\r\n ],\r\n enabled: [{ toolName: toolNames.SegmentationDisplay }],\r\n };\r\n\r\n toolGroupService.createToolGroupAndAddTools(toolGroupIds.MIP, mipTools);\r\n}\r\n\r\nfunction initToolGroups(toolNames, Enums, toolGroupService, commandsManager) {\r\n _initToolGroups(toolNames, Enums, toolGroupService, commandsManager);\r\n}\r\n\r\nexport default initToolGroups;\r\n","// TODO: torn, can either bake this here; or have to create a whole new button type\r\n// Only ways that you can pass in a custom React component for render :l\r\nimport { WindowLevelMenuItem } from '@ohif/ui';\r\nimport { defaults } from '@ohif/core';\r\nimport { toolGroupIds } from './initToolGroups';\r\nconst { windowLevelPresets } = defaults;\r\n/**\r\n *\r\n * @param {*} type - 'tool' | 'action' | 'toggle'\r\n * @param {*} id\r\n * @param {*} icon\r\n * @param {*} label\r\n */\r\nfunction _createButton(type, id, icon, label, commands, tooltip) {\r\n return {\r\n id,\r\n icon,\r\n label,\r\n type,\r\n commands,\r\n tooltip,\r\n };\r\n}\r\n\r\nfunction _createColormap(label, colormap) {\r\n return {\r\n id: label,\r\n label,\r\n type: 'action',\r\n commands: [\r\n {\r\n commandName: 'setFusionPTColormap',\r\n commandOptions: {\r\n toolGroupId: toolGroupIds.Fusion,\r\n colormap,\r\n },\r\n },\r\n ],\r\n };\r\n}\r\n\r\nconst _createActionButton = _createButton.bind(null, 'action');\r\nconst _createToggleButton = _createButton.bind(null, 'toggle');\r\nconst _createToolButton = _createButton.bind(null, 'tool');\r\n\r\n/**\r\n *\r\n * @param {*} preset - preset number (from above import)\r\n * @param {*} title\r\n * @param {*} subtitle\r\n */\r\nfunction _createWwwcPreset(preset, title, subtitle) {\r\n return {\r\n id: preset.toString(),\r\n title,\r\n subtitle,\r\n type: 'action',\r\n commands: [\r\n {\r\n commandName: 'setWindowLevel',\r\n commandOptions: {\r\n ...windowLevelPresets[preset],\r\n },\r\n context: 'CORNERSTONE',\r\n },\r\n ],\r\n };\r\n}\r\n\r\nfunction _createCommands(commandName, toolName, toolGroupIds) {\r\n return toolGroupIds.map(toolGroupId => ({\r\n /* It's a command that is being run when the button is clicked. */\r\n commandName,\r\n commandOptions: {\r\n toolName,\r\n toolGroupId,\r\n },\r\n context: 'CORNERSTONE',\r\n }));\r\n}\r\n\r\nconst toolbarButtons = [\r\n // Measurement\r\n {\r\n id: 'MeasurementTools',\r\n type: 'ohif.splitButton',\r\n props: {\r\n groupId: 'MeasurementTools',\r\n isRadio: true, // ?\r\n // Switch?\r\n primary: _createToolButton(\r\n 'Length',\r\n 'tool-length',\r\n 'Length',\r\n [\r\n ..._createCommands('setToolActive', 'Length', [\r\n toolGroupIds.CT,\r\n toolGroupIds.PT,\r\n toolGroupIds.Fusion,\r\n // toolGroupIds.MPR,\r\n ]),\r\n ],\r\n 'Length'\r\n ),\r\n secondary: {\r\n icon: 'chevron-down',\r\n label: '',\r\n isActive: true,\r\n tooltip: 'More Measure Tools',\r\n },\r\n items: [\r\n _createToolButton(\r\n 'Length',\r\n 'tool-length',\r\n 'Length',\r\n [\r\n ..._createCommands('setToolActive', 'Length', [\r\n toolGroupIds.CT,\r\n toolGroupIds.PT,\r\n toolGroupIds.Fusion,\r\n // toolGroupIds.MPR,\r\n ]),\r\n ],\r\n 'Length Tool'\r\n ),\r\n _createToolButton(\r\n 'Bidirectional',\r\n 'tool-bidirectional',\r\n 'Bidirectional',\r\n [\r\n ..._createCommands('setToolActive', 'Bidirectional', [\r\n toolGroupIds.CT,\r\n toolGroupIds.PT,\r\n toolGroupIds.Fusion,\r\n // toolGroupIds.MPR,\r\n ]),\r\n ],\r\n 'Bidirectional Tool'\r\n ),\r\n _createToolButton(\r\n 'ArrowAnnotate',\r\n 'tool-annotate',\r\n 'Annotation',\r\n [\r\n ..._createCommands('setToolActive', 'ArrowAnnotate', [\r\n toolGroupIds.CT,\r\n toolGroupIds.PT,\r\n toolGroupIds.Fusion,\r\n // toolGroupIds.MPR,\r\n ]),\r\n ],\r\n 'Arrow Annotate'\r\n ),\r\n _createToolButton(\r\n 'EllipticalROI',\r\n 'tool-elipse',\r\n 'Ellipse',\r\n [\r\n ..._createCommands('setToolActive', 'EllipticalROI', [\r\n toolGroupIds.CT,\r\n toolGroupIds.PT,\r\n toolGroupIds.Fusion,\r\n // toolGroupIds.MPR,\r\n ]),\r\n ],\r\n 'Ellipse Tool'\r\n ),\r\n ],\r\n },\r\n },\r\n // Zoom..\r\n {\r\n id: 'Zoom',\r\n type: 'ohif.radioGroup',\r\n props: {\r\n type: 'tool',\r\n icon: 'tool-zoom',\r\n label: 'Zoom',\r\n commands: [\r\n ..._createCommands('setToolActive', 'Zoom', [\r\n toolGroupIds.CT,\r\n toolGroupIds.PT,\r\n toolGroupIds.Fusion,\r\n // toolGroupIds.MPR,\r\n ]),\r\n ],\r\n },\r\n },\r\n {\r\n id: 'MPR',\r\n type: 'ohif.action',\r\n props: {\r\n type: 'toggle',\r\n icon: 'icon-mpr',\r\n label: 'MPR',\r\n commands: [\r\n {\r\n commandName: 'toggleHangingProtocol',\r\n commandOptions: {\r\n protocolId: 'mpr',\r\n },\r\n context: 'DEFAULT',\r\n },\r\n ],\r\n },\r\n },\r\n // Window Level + Presets...\r\n {\r\n id: 'WindowLevel',\r\n type: 'ohif.splitButton',\r\n props: {\r\n groupId: 'WindowLevel',\r\n primary: _createToolButton(\r\n 'WindowLevel',\r\n 'tool-window-level',\r\n 'Window Level',\r\n [\r\n ..._createCommands('setToolActive', 'WindowLevel', [\r\n toolGroupIds.CT,\r\n toolGroupIds.PT,\r\n toolGroupIds.Fusion,\r\n // toolGroupIds.MPR,\r\n ]),\r\n ],\r\n 'Window Level'\r\n ),\r\n secondary: {\r\n icon: 'chevron-down',\r\n label: 'W/L Manual',\r\n isActive: true,\r\n tooltip: 'W/L Presets',\r\n },\r\n isAction: true, // ?\r\n renderer: WindowLevelMenuItem,\r\n items: [\r\n _createWwwcPreset(1, 'Soft tissue', '400 / 40'),\r\n _createWwwcPreset(2, 'Lung', '1500 / -600'),\r\n _createWwwcPreset(3, 'Liver', '150 / 90'),\r\n _createWwwcPreset(4, 'Bone', '2500 / 480'),\r\n _createWwwcPreset(5, 'Brain', '80 / 40'),\r\n ],\r\n },\r\n },\r\n {\r\n id: 'Crosshairs',\r\n type: 'ohif.radioGroup',\r\n props: {\r\n type: 'tool',\r\n icon: 'tool-crosshair',\r\n label: 'Crosshairs',\r\n commands: [\r\n ..._createCommands('setToolActive', 'Crosshairs', [\r\n toolGroupIds.CT,\r\n toolGroupIds.PT,\r\n toolGroupIds.Fusion,\r\n // toolGroupIds.MPR,\r\n ]),\r\n ],\r\n },\r\n },\r\n // Pan...\r\n {\r\n id: 'Pan',\r\n type: 'ohif.radioGroup',\r\n props: {\r\n type: 'tool',\r\n icon: 'tool-move',\r\n label: 'Pan',\r\n commands: [\r\n ..._createCommands('setToolActive', 'Pan', [\r\n toolGroupIds.CT,\r\n toolGroupIds.PT,\r\n toolGroupIds.Fusion,\r\n // toolGroupIds.MPR,\r\n ]),\r\n ],\r\n },\r\n },\r\n {\r\n id: 'RectangleROIStartEndThreshold',\r\n type: 'ohif.radioGroup',\r\n props: {\r\n type: 'tool',\r\n icon: 'tool-create-threshold',\r\n label: 'Rectangle ROI Threshold',\r\n commands: [\r\n ..._createCommands('setToolActive', 'RectangleROIStartEndThreshold', [toolGroupIds.PT]),\r\n {\r\n commandName: 'displayNotification',\r\n commandOptions: {\r\n title: 'RectangleROI Threshold Tip',\r\n text: 'RectangleROI Threshold tool should be used on PT Axial Viewport',\r\n type: 'info',\r\n },\r\n },\r\n {\r\n commandName: 'setViewportActive',\r\n commandOptions: {\r\n viewportId: 'ptAXIAL',\r\n },\r\n },\r\n ],\r\n },\r\n },\r\n {\r\n id: 'fusionPTColormap',\r\n type: 'ohif.splitButton',\r\n props: {\r\n groupId: 'fusionPTColormap',\r\n primary: _createToolButton(\r\n 'fusionPTColormap',\r\n 'tool-fusion-color',\r\n 'Fusion PT Colormap',\r\n [],\r\n 'Fusion PT Colormap'\r\n ),\r\n secondary: {\r\n icon: 'chevron-down',\r\n label: 'PT Colormap',\r\n isActive: true,\r\n tooltip: 'PET Image Colormap',\r\n },\r\n isAction: true, // ?\r\n items: [\r\n _createColormap('HSV', 'hsv'),\r\n _createColormap('Hot Iron', 'hot_iron'),\r\n _createColormap('S PET', 's_pet'),\r\n _createColormap('Red Hot', 'red_hot'),\r\n _createColormap('Perfusion', 'perfusion'),\r\n _createColormap('Rainbow', 'rainbow_2'),\r\n _createColormap('SUV', 'suv'),\r\n _createColormap('GE 256', 'ge_256'),\r\n _createColormap('GE', 'ge'),\r\n _createColormap('Siemens', 'siemens'),\r\n ],\r\n },\r\n },\r\n];\r\n\r\nexport default toolbarButtons;\r\n","import packageJson from '../package.json';\r\n\r\nconst id = packageJson.name;\r\n\r\nexport { id };\r\n","import { hotkeys, classes } from '@ohif/core';\r\nimport toolbarButtons from './toolbarButtons.js';\r\nimport { id } from './id.js';\r\nimport initToolGroups, { toolGroupIds } from './initToolGroups.js';\r\nimport setCrosshairsConfiguration from './utils/setCrosshairsConfiguration.js';\r\nimport setFusionActiveVolume from './utils/setFusionActiveVolume.js';\r\n\r\nconst { MetadataProvider } = classes;\r\n\r\nconst ohif = {\r\n layout: '@ohif/extension-default.layoutTemplateModule.viewerLayout',\r\n sopClassHandler: '@ohif/extension-default.sopClassHandlerModule.stack',\r\n measurements: '@ohif/extension-default.panelModule.measure',\r\n thumbnailList: '@ohif/extension-default.panelModule.seriesList',\r\n};\r\n\r\nconst cs3d = {\r\n viewport: '@ohif/extension-cornerstone.viewportModule.cornerstone',\r\n};\r\n\r\nconst tmtv = {\r\n hangingProtocol: '@ohif/extension-tmtv.hangingProtocolModule.ptCT',\r\n petSUV: '@ohif/extension-tmtv.panelModule.petSUV',\r\n ROIThresholdPanel: '@ohif/extension-tmtv.panelModule.ROIThresholdSeg',\r\n};\r\n\r\nconst extensionDependencies = {\r\n // Can derive the versions at least process.env.from npm_package_version\r\n '@ohif/extension-default': '^3.0.0',\r\n '@ohif/extension-cornerstone': '^3.0.0',\r\n '@ohif/extension-tmtv': '^3.0.0',\r\n};\r\n\r\nlet unsubscriptions = [];\r\nfunction modeFactory({ modeConfiguration }) {\r\n return {\r\n // TODO: We're using this as a route segment\r\n // We should not be.\r\n id,\r\n routeName: 'tmtv',\r\n displayName: 'Total Metabolic Tumor Volume',\r\n /**\r\n * Lifecycle hooks\r\n */\r\n onModeEnter: ({ servicesManager, extensionManager, commandsManager }) => {\r\n const { toolbarService, toolGroupService, hangingProtocolService, displaySetService } =\r\n servicesManager.services;\r\n\r\n const utilityModule = extensionManager.getModuleEntry(\r\n '@ohif/extension-cornerstone.utilityModule.tools'\r\n );\r\n\r\n const { toolNames, Enums } = utilityModule.exports;\r\n\r\n // Init Default and SR ToolGroups\r\n initToolGroups(toolNames, Enums, toolGroupService, commandsManager);\r\n\r\n const setWindowLevelActive = () => {\r\n toolbarService.recordInteraction({\r\n groupId: 'WindowLevel',\r\n interactionType: 'tool',\r\n commands: [\r\n {\r\n commandName: 'setToolActive',\r\n commandOptions: {\r\n toolName: toolNames.WindowLevel,\r\n toolGroupId: toolGroupIds.CT,\r\n },\r\n context: 'CORNERSTONE',\r\n },\r\n {\r\n commandName: 'setToolActive',\r\n commandOptions: {\r\n toolName: toolNames.WindowLevel,\r\n toolGroupId: toolGroupIds.PT,\r\n },\r\n context: 'CORNERSTONE',\r\n },\r\n {\r\n commandName: 'setToolActive',\r\n commandOptions: {\r\n toolName: toolNames.WindowLevel,\r\n toolGroupId: toolGroupIds.Fusion,\r\n },\r\n context: 'CORNERSTONE',\r\n },\r\n ],\r\n });\r\n };\r\n\r\n const { unsubscribe } = toolGroupService.subscribe(\r\n toolGroupService.EVENTS.VIEWPORT_ADDED,\r\n () => {\r\n // For fusion toolGroup we need to add the volumeIds for the crosshairs\r\n // since in the fusion viewport we don't want both PT and CT to render MIP\r\n // when slabThickness is modified\r\n const { displaySetMatchDetails } = hangingProtocolService.getMatchDetails();\r\n\r\n setCrosshairsConfiguration(\r\n displaySetMatchDetails,\r\n toolNames,\r\n toolGroupService,\r\n displaySetService\r\n );\r\n\r\n setFusionActiveVolume(\r\n displaySetMatchDetails,\r\n toolNames,\r\n toolGroupService,\r\n displaySetService\r\n );\r\n\r\n setWindowLevelActive();\r\n }\r\n );\r\n\r\n unsubscriptions.push(unsubscribe);\r\n toolbarService.init(extensionManager);\r\n toolbarService.addButtons(toolbarButtons);\r\n toolbarService.createButtonSection('primary', [\r\n 'MeasurementTools',\r\n 'Zoom',\r\n 'WindowLevel',\r\n 'Crosshairs',\r\n 'Pan',\r\n 'RectangleROIStartEndThreshold',\r\n 'fusionPTColormap',\r\n ]);\r\n\r\n // For the hanging protocol we need to decide on the window level\r\n // based on whether the SUV is corrected or not, hence we can't hard\r\n // code the window level in the hanging protocol but we add a custom\r\n // attribute to the hanging protocol that will be used to get the\r\n // window level based on the metadata\r\n hangingProtocolService.addCustomAttribute(\r\n 'getPTVOIRange',\r\n 'get PT VOI based on corrected or not',\r\n props => {\r\n const ptDisplaySet = props.find(imageSet => imageSet.Modality === 'PT');\r\n\r\n if (!ptDisplaySet) {\r\n return;\r\n }\r\n\r\n const { imageId } = ptDisplaySet.images[0];\r\n const imageIdScalingFactor = MetadataProvider.get('scalingModule', imageId);\r\n\r\n const isSUVAvailable = imageIdScalingFactor && imageIdScalingFactor.suvbw;\r\n\r\n if (isSUVAvailable) {\r\n return {\r\n windowWidth: 5,\r\n windowCenter: 2.5,\r\n };\r\n }\r\n\r\n return;\r\n }\r\n );\r\n },\r\n onModeExit: ({ servicesManager }) => {\r\n const {\r\n toolGroupService,\r\n syncGroupService,\r\n segmentationService,\r\n cornerstoneViewportService,\r\n } = servicesManager.services;\r\n\r\n unsubscriptions.forEach(unsubscribe => unsubscribe());\r\n toolGroupService.destroy();\r\n syncGroupService.destroy();\r\n segmentationService.destroy();\r\n cornerstoneViewportService.destroy();\r\n },\r\n validationTags: {\r\n study: [],\r\n series: [],\r\n },\r\n isValidMode: ({ modalities, study }) => {\r\n const modalities_list = modalities.split('\\\\');\r\n const invalidModalities = ['SM'];\r\n\r\n const isValid =\r\n modalities_list.includes('CT') &&\r\n modalities_list.includes('PT') &&\r\n !invalidModalities.some(modality => modalities_list.includes(modality)) &&\r\n // This is study is a 4D study with PT and CT and not a 3D study for the tmtv\r\n // mode, until we have a better way to identify 4D studies we will use the\r\n // StudyInstanceUID to identify the study\r\n // Todo: when we add the 4D mode which comes with a mechanism to identify\r\n // 4D studies we can use that\r\n study.studyInstanceUid !== '1.3.6.1.4.1.12842.1.1.14.3.20220915.105557.468.2963630849';\r\n\r\n // there should be both CT and PT modalities and the modality should not be SM\r\n return isValid;\r\n },\r\n routes: [\r\n {\r\n path: 'tmtv',\r\n /*init: ({ servicesManager, extensionManager }) => {\r\n //defaultViewerRouteInit\r\n },*/\r\n layoutTemplate: ({ location, servicesManager }) => {\r\n return {\r\n id: ohif.layout,\r\n props: {\r\n leftPanels: [ohif.thumbnailList],\r\n leftPanelDefaultClosed: true,\r\n rightPanels: [tmtv.ROIThresholdPanel, tmtv.petSUV],\r\n viewports: [\r\n {\r\n namespace: cs3d.viewport,\r\n displaySetsToDisplay: [ohif.sopClassHandler],\r\n },\r\n ],\r\n },\r\n };\r\n },\r\n },\r\n ],\r\n extensions: extensionDependencies,\r\n hangingProtocol: tmtv.hangingProtocol,\r\n sopClassHandlers: [ohif.sopClassHandler],\r\n hotkeys: [...hotkeys.defaults.hotkeyBindings],\r\n ...modeConfiguration,\r\n };\r\n}\r\n\r\nconst mode = {\r\n id,\r\n modeFactory,\r\n extensionDependencies,\r\n};\r\n\r\nexport default mode;\r\n","import { toolGroupIds } from '../initToolGroups';\r\n\r\nexport default function setCrosshairsConfiguration(\r\n matches,\r\n toolNames,\r\n toolGroupService,\r\n displaySetService\r\n) {\r\n const matchDetails = matches.get('ctDisplaySet');\r\n\r\n if (!matchDetails) {\r\n return;\r\n }\r\n\r\n const { SeriesInstanceUID } = matchDetails;\r\n const displaySets = displaySetService.getDisplaySetsForSeries(SeriesInstanceUID);\r\n\r\n const toolConfig = toolGroupService.getToolConfiguration(\r\n toolGroupIds.Fusion,\r\n toolNames.Crosshairs\r\n );\r\n\r\n const crosshairsConfig = {\r\n ...toolConfig,\r\n filterActorUIDsToSetSlabThickness: [displaySets[0].displaySetInstanceUID],\r\n };\r\n\r\n toolGroupService.setToolConfiguration(\r\n toolGroupIds.Fusion,\r\n toolNames.Crosshairs,\r\n crosshairsConfig\r\n );\r\n}\r\n","import { toolGroupIds } from '../initToolGroups';\r\n\r\nexport default function setFusionActiveVolume(\r\n matches,\r\n toolNames,\r\n toolGroupService,\r\n displaySetService\r\n) {\r\n const matchDetails = matches.get('ptDisplaySet');\r\n\r\n if (!matchDetails) {\r\n return;\r\n }\r\n\r\n const { SeriesInstanceUID } = matchDetails;\r\n\r\n const displaySets = displaySetService.getDisplaySetsForSeries(SeriesInstanceUID);\r\n\r\n if (!displaySets || displaySets.length === 0) {\r\n return;\r\n }\r\n\r\n const wlToolConfig = toolGroupService.getToolConfiguration(\r\n toolGroupIds.Fusion,\r\n toolNames.WindowLevel\r\n );\r\n\r\n const ellipticalToolConfig = toolGroupService.getToolConfiguration(\r\n toolGroupIds.Fusion,\r\n toolNames.EllipticalROI\r\n );\r\n\r\n // Todo: this should not take into account the loader id\r\n const volumeId = `cornerstoneStreamingImageVolume:${displaySets[0].displaySetInstanceUID}`;\r\n\r\n const windowLevelConfig = {\r\n ...wlToolConfig,\r\n volumeId,\r\n };\r\n\r\n const ellipticalROIConfig = {\r\n ...ellipticalToolConfig,\r\n volumeId,\r\n };\r\n\r\n toolGroupService.setToolConfiguration(\r\n toolGroupIds.Fusion,\r\n toolNames.WindowLevel,\r\n windowLevelConfig\r\n );\r\n\r\n toolGroupService.setToolConfiguration(\r\n toolGroupIds.Fusion,\r\n toolNames.EllipticalROI,\r\n ellipticalROIConfig\r\n );\r\n}\r\n"],"names":["toolGroupIds","CT","PT","Fusion","MIP","default","toolNames","Enums","toolGroupService","commandsManager","tools","active","toolName","WindowLevel","bindings","mouseButton","MouseBindings","Primary","Pan","Auxiliary","Zoom","Secondary","StackScrollMouseWheel","passive","Length","ArrowAnnotate","configuration","getTextCallback","callback","eventDetails","runCommand","changeTextCallback","data","Bidirectional","DragProbe","Probe","EllipticalROI","RectangleROI","StackScroll","Angle","CobbAngle","Magnify","enabled","SegmentationDisplay","disabled","Crosshairs","viewportIndicators","autoPan","panSize","createToolGroupAndAddTools","mipTools","VolumeRotateMouseWheel","rotateIncrementDegrees","MipJumpToClick","toolGroupId","_initToolGroups","windowLevelPresets","defaults","_createButton","type","id","icon","label","commands","tooltip","_createColormap","colormap","commandName","commandOptions","bind","_createToolButton","_createWwwcPreset","preset","title","subtitle","toString","context","_createCommands","map","props","groupId","isRadio","primary","secondary","isActive","items","protocolId","isAction","renderer","WindowLevelMenuItem","text","viewportId","packageJson","MetadataProvider","classes","ohif","cs3d","tmtv","extensionDependencies","unsubscriptions","modeFactory","_ref","modeConfiguration","routeName","displayName","onModeEnter","_ref2","servicesManager","extensionManager","toolbarService","hangingProtocolService","displaySetService","services","utilityModule","getModuleEntry","exports","initToolGroups","unsubscribe","subscribe","EVENTS","VIEWPORT_ADDED","displaySetMatchDetails","getMatchDetails","matches","matchDetails","get","SeriesInstanceUID","displaySets","getDisplaySetsForSeries","crosshairsConfig","getToolConfiguration","filterActorUIDsToSetSlabThickness","displaySetInstanceUID","setToolConfiguration","setCrosshairsConfiguration","length","wlToolConfig","ellipticalToolConfig","volumeId","windowLevelConfig","ellipticalROIConfig","setFusionActiveVolume","recordInteraction","interactionType","push","init","addButtons","toolbarButtons","createButtonSection","addCustomAttribute","ptDisplaySet","find","imageSet","Modality","imageId","images","imageIdScalingFactor","suvbw","windowWidth","windowCenter","onModeExit","_ref3","syncGroupService","segmentationService","cornerstoneViewportService","forEach","destroy","validationTags","study","series","isValidMode","_ref4","modalities","modalities_list","split","includes","some","modality","studyInstanceUid","routes","path","layoutTemplate","_ref5","location","leftPanels","leftPanelDefaultClosed","rightPanels","viewports","namespace","displaySetsToDisplay","extensions","hangingProtocol","sopClassHandlers","hotkeys","hotkeyBindings"],"sourceRoot":""} \ No newline at end of file diff --git a/resources/36785fbd89b0e17f6099.wasm b/resources/36785fbd89b0e17f6099.wasm new file mode 100644 index 0000000..069fac9 Binary files /dev/null and b/resources/36785fbd89b0e17f6099.wasm differ diff --git a/resources/370.bundle.42f05adb02eaf4f41567.js b/resources/370.bundle.42f05adb02eaf4f41567.js new file mode 100644 index 0000000..7b8f5a3 --- /dev/null +++ b/resources/370.bundle.42f05adb02eaf4f41567.js @@ -0,0 +1,2 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[370],{71522:(o,e,t)=>{"use strict";t.r(e),t.d(e,{default:()=>P,initToolGroups:()=>R,toolbarButtons:()=>N});var n=t(71771),i=t(71783),a=t(3743);const{windowLevelPresets:l}=n.defaults,s=n.Ok._createButton.bind(null,"action"),r=n.Ok._createButton.bind(null,"toggle"),m=n.Ok._createButton.bind(null,"tool");function c(o,e,t){return{id:o.toString(),title:e,subtitle:t,type:"action",commands:[{commandName:"setWindowLevel",commandOptions:{...l[o]},context:"CORNERSTONE"}]}}const d=["default","mpr","SRToolGroup"];function p(o){return d.map((e=>({commandName:"setToolActive",commandOptions:{toolGroupId:e,toolName:o},context:"CORNERSTONE"})))}const u=[{commandName:"setSourceViewportForReferenceLinesTool",context:"CORNERSTONE"},{commandName:"setToolActive",commandOptions:{toolName:"ReferenceLines"},context:"CORNERSTONE"}],N=[{id:"MeasurementTools",type:"ohif.splitButton",props:{groupId:"MeasurementTools",isRadio:!0,primary:m("Length","tool-length","Length",[{commandName:"setToolActive",commandOptions:{toolName:"Length"},context:"CORNERSTONE"},{commandName:"setToolActive",commandOptions:{toolName:"SRLength",toolGroupId:"SRToolGroup"},context:"CORNERSTONE"}],"Length"),secondary:{icon:"chevron-down",label:"",isActive:!0,tooltip:"More Measure Tools"},items:[m("Length","tool-length","Length",[{commandName:"setToolActive",commandOptions:{toolName:"Length"},context:"CORNERSTONE"},{commandName:"setToolActive",commandOptions:{toolName:"SRLength",toolGroupId:"SRToolGroup"},context:"CORNERSTONE"}],"Length Tool"),m("Bidirectional","tool-bidirectional","Bidirectional",[{commandName:"setToolActive",commandOptions:{toolName:"Bidirectional"},context:"CORNERSTONE"},{commandName:"setToolActive",commandOptions:{toolName:"SRBidirectional",toolGroupId:"SRToolGroup"},context:"CORNERSTONE"}],"Bidirectional Tool"),m("ArrowAnnotate","tool-annotate","Annotation",[{commandName:"setToolActive",commandOptions:{toolName:"ArrowAnnotate"},context:"CORNERSTONE"},{commandName:"setToolActive",commandOptions:{toolName:"SRArrowAnnotate",toolGroupId:"SRToolGroup"},context:"CORNERSTONE"}],"Arrow Annotate"),m("EllipticalROI","tool-elipse","Ellipse",[{commandName:"setToolActive",commandOptions:{toolName:"EllipticalROI"},context:"CORNERSTONE"},{commandName:"setToolActive",commandOptions:{toolName:"SREllipticalROI",toolGroupId:"SRToolGroup"},context:"CORNERSTONE"}],"Ellipse Tool"),m("CircleROI","tool-circle","Circle",[{commandName:"setToolActive",commandOptions:{toolName:"CircleROI"},context:"CORNERSTONE"},{commandName:"setToolActive",commandOptions:{toolName:"SRCircleROI",toolGroupId:"SRToolGroup"},context:"CORNERSTONE"}],"Circle Tool")]}},{id:"Zoom",type:"ohif.radioGroup",props:{type:"tool",icon:"tool-zoom",label:"Zoom",commands:p("Zoom")}},{id:"WindowLevel",type:"ohif.splitButton",props:{groupId:"WindowLevel",primary:m("WindowLevel","tool-window-level","Window Level",[{commandName:"setToolActive",commandOptions:{toolName:"WindowLevel"},context:"CORNERSTONE"}],"Window Level"),secondary:{icon:"chevron-down",label:"W/L Manual",isActive:!0,tooltip:"W/L Presets"},isAction:!0,renderer:i.eJ,items:[c(1,"Soft tissue","400 / 40"),c(2,"Lung","1500 / -600"),c(3,"Liver","150 / 90"),c(4,"Bone","2500 / 480"),c(5,"Brain","80 / 40")]}},{id:"Pan",type:"ohif.radioGroup",props:{type:"tool",icon:"tool-move",label:"Pan",commands:p("Pan")}},{id:"Capture",type:"ohif.action",props:{icon:"tool-capture",label:"Capture",type:"action",commands:[{commandName:"showDownloadViewportModal",commandOptions:{},context:"CORNERSTONE"}]}},{id:"Layout",type:"ohif.layoutSelector",props:{rows:3,columns:3}},{id:"MPR",type:"ohif.action",props:{type:"toggle",icon:"icon-mpr",label:"MPR",commands:[{commandName:"toggleHangingProtocol",commandOptions:{protocolId:"mpr"},context:"DEFAULT"}]}},{id:"Crosshairs",type:"ohif.radioGroup",props:{type:"tool",icon:"tool-crosshair",label:"Crosshairs",commands:[{commandName:"setToolActive",commandOptions:{toolName:"Crosshairs",toolGroupId:"mpr"},context:"CORNERSTONE"}]}},{id:"MoreTools",type:"ohif.splitButton",props:{isRadio:!0,groupId:"MoreTools",primary:s("Reset","tool-reset","Reset View",[{commandName:"resetViewport",commandOptions:{},context:"CORNERSTONE"}],"Reset"),secondary:{icon:"chevron-down",label:"",isActive:!0,tooltip:"More Tools"},items:[s("Reset","tool-reset","Reset View",[{commandName:"resetViewport",commandOptions:{},context:"CORNERSTONE"}],"Reset"),s("rotate-right","tool-rotate-right","Rotate Right",[{commandName:"rotateViewportCW",commandOptions:{},context:"CORNERSTONE"}],"Rotate +90"),s("flip-horizontal","tool-flip-horizontal","Flip Horizontally",[{commandName:"flipViewportHorizontal",commandOptions:{},context:"CORNERSTONE"}],"Flip Horizontal"),r("StackImageSync","link","Stack Image Sync",[{commandName:"toggleStackImageSync"}],"Enable position synchronization on stack viewports",{listeners:{[a.EVENTS.STACK_VIEWPORT_NEW_STACK]:{commandName:"toggleStackImageSync",commandOptions:{toggledState:!0}}}}),r("ReferenceLines","tool-referenceLines","Reference Lines",u,"Show Reference Lines",{listeners:{[a.EVENTS.STACK_VIEWPORT_NEW_STACK]:u,[a.EVENTS.ACTIVE_VIEWPORT_ID_CHANGED]:u}}),r("ImageOverlayViewer","toggle-dicom-overlay","Image Overlay",[{commandName:"setToolActive",commandOptions:{toolName:"ImageOverlayViewer"},context:"CORNERSTONE"}],"Image Overlay",{isActive:!0}),m("StackScroll","tool-stack-scroll","Stack Scroll",[{commandName:"setToolActive",commandOptions:{toolName:"StackScroll"},context:"CORNERSTONE"}],"Stack Scroll"),s("invert","tool-invert","Invert",[{commandName:"invertViewport",commandOptions:{},context:"CORNERSTONE"}],"Invert Colors"),m("Probe","tool-probe","Probe",[{commandName:"setToolActive",commandOptions:{toolName:"DragProbe"},context:"CORNERSTONE"}],"Probe"),r("cine","tool-cine","Cine",[{commandName:"toggleCine",context:"CORNERSTONE"}],"Cine"),m("Angle","tool-angle","Angle",[{commandName:"setToolActive",commandOptions:{toolName:"Angle"},context:"CORNERSTONE"}],"Angle"),m("Magnify","tool-magnify","Magnify",[{commandName:"setToolActive",commandOptions:{toolName:"Magnify"},context:"CORNERSTONE"}],"Magnify"),m("Rectangle","tool-rectangle","Rectangle",[{commandName:"setToolActive",commandOptions:{toolName:"RectangleROI"},context:"CORNERSTONE"}],"Rectangle"),m("CalibrationLine","tool-calibration","Calibration",[{commandName:"setToolActive",commandOptions:{toolName:"CalibrationLine"},context:"CORNERSTONE"}],"Calibration Line"),s("TagBrowser","list-bullets","Dicom Tag Browser",[{commandName:"openDICOMTagViewer",commandOptions:{},context:"DEFAULT"}],"Dicom Tag Browser")]}}],g=JSON.parse('{"u2":"@ohif/mode-longitudinal"}').u2;const R=function(o,e,t){!function(o,e,t,n){const i=o.getModuleEntry("@ohif/extension-cornerstone.utilityModule.tools"),{toolNames:a,Enums:l}=i.exports,s={active:[{toolName:a.WindowLevel,bindings:[{mouseButton:l.MouseBindings.Primary}]},{toolName:a.Pan,bindings:[{mouseButton:l.MouseBindings.Auxiliary}]},{toolName:a.Zoom,bindings:[{mouseButton:l.MouseBindings.Secondary}]},{toolName:a.StackScrollMouseWheel,bindings:[]}],passive:[{toolName:a.Length},{toolName:a.ArrowAnnotate,configuration:{getTextCallback:(o,e)=>t.runCommand("arrowTextCallback",{callback:o,eventDetails:e}),changeTextCallback:(o,e,n)=>t.runCommand("arrowTextCallback",{callback:n,data:o,eventDetails:e})}},{toolName:a.Bidirectional},{toolName:a.DragProbe},{toolName:a.EllipticalROI},{toolName:a.CircleROI},{toolName:a.RectangleROI},{toolName:a.StackScroll},{toolName:a.Angle},{toolName:a.CobbAngle},{toolName:a.PlanarFreehandROI},{toolName:a.Magnify},{toolName:a.SegmentationDisplay},{toolName:a.CalibrationLine}],enabled:[{toolName:a.ImageOverlayViewer}],disabled:[{toolName:a.ReferenceLines}]};e.createToolGroupAndAddTools(n,s)}(o,e,t,"default"),function(o,e,t){const n=o.getModuleEntry("@ohif/extension-cornerstone-dicom-sr.utilityModule.tools");if(!n)return;const i=o.getModuleEntry("@ohif/extension-cornerstone.utilityModule.tools"),{toolNames:a}=n.exports,{toolNames:l,Enums:s}=i.exports,r={active:[{toolName:l.WindowLevel,bindings:[{mouseButton:s.MouseBindings.Primary}]},{toolName:l.Pan,bindings:[{mouseButton:s.MouseBindings.Auxiliary}]},{toolName:l.Zoom,bindings:[{mouseButton:s.MouseBindings.Secondary}]},{toolName:l.StackScrollMouseWheel,bindings:[]}],passive:[{toolName:a.SRLength},{toolName:a.SRArrowAnnotate},{toolName:a.SRBidirectional},{toolName:a.SREllipticalROI},{toolName:a.SRCircleROI}],enabled:[{toolName:a.DICOMSRDisplay,bindings:[]}]};e.createToolGroupAndAddTools("SRToolGroup",r)}(o,e),function(o,e,t){const n=o.getModuleEntry("@ohif/extension-cornerstone.utilityModule.tools"),{toolNames:i,Enums:a}=n.exports,l={active:[{toolName:i.WindowLevel,bindings:[{mouseButton:a.MouseBindings.Primary}]},{toolName:i.Pan,bindings:[{mouseButton:a.MouseBindings.Auxiliary}]},{toolName:i.Zoom,bindings:[{mouseButton:a.MouseBindings.Secondary}]},{toolName:i.StackScrollMouseWheel,bindings:[]}],passive:[{toolName:i.Length},{toolName:i.ArrowAnnotate,configuration:{getTextCallback:(o,e)=>t.runCommand("arrowTextCallback",{callback:o,eventDetails:e}),changeTextCallback:(o,e,n)=>t.runCommand("arrowTextCallback",{callback:n,data:o,eventDetails:e})}},{toolName:i.Bidirectional},{toolName:i.DragProbe},{toolName:i.EllipticalROI},{toolName:i.CircleROI},{toolName:i.RectangleROI},{toolName:i.StackScroll},{toolName:i.Angle},{toolName:i.CobbAngle},{toolName:i.PlanarFreehandROI},{toolName:i.SegmentationDisplay}],disabled:[{toolName:i.Crosshairs,configuration:{viewportIndicators:!1,autoPan:{enabled:!1,panSize:10}}},{toolName:i.ReferenceLines}]};e.createToolGroupAndAddTools("mpr",l)}(o,e,t),function(o,e){const t=o.getModuleEntry("@ohif/extension-cornerstone.utilityModule.tools"),{toolNames:n,Enums:i}=t.exports,a={active:[{toolName:n.TrackballRotateTool,bindings:[{mouseButton:i.MouseBindings.Primary}]},{toolName:n.Zoom,bindings:[{mouseButton:i.MouseBindings.Secondary}]},{toolName:n.Pan,bindings:[{mouseButton:i.MouseBindings.Auxiliary}]}]};e.createToolGroupAndAddTools("volume3d",a)}(o,e)},O=["SM","ECG","SR","SEG","RTSTRUCT"],T="@ohif/extension-default.layoutTemplateModule.viewerLayout",S="@ohif/extension-default.sopClassHandlerModule.stack",E="@ohif/extension-measurement-tracking.panelModule.trackedMeasurements",v="@ohif/extension-measurement-tracking.panelModule.seriesList",C="@ohif/extension-measurement-tracking.viewportModule.cornerstone-tracked",y="@ohif/extension-cornerstone-dicom-sr.sopClassHandlerModule.dicom-sr",f="@ohif/extension-cornerstone-dicom-sr.viewportModule.dicom-sr",h="@ohif/extension-dicom-video.sopClassHandlerModule.dicom-video",x="@ohif/extension-dicom-video.viewportModule.dicom-video",b="@ohif/extension-dicom-pdf.sopClassHandlerModule.dicom-pdf",A="@ohif/extension-dicom-pdf.viewportModule.dicom-pdf",M="@ohif/extension-cornerstone-dicom-seg.sopClassHandlerModule.dicom-seg",w="@ohif/extension-cornerstone-dicom-seg.viewportModule.dicom-seg",I="@ohif/extension-cornerstone-dicom-seg.panelModule.panelSegmentation",L="@ohif/extension-cornerstone-dicom-rt.viewportModule.dicom-rt",B="@ohif/extension-cornerstone-dicom-rt.sopClassHandlerModule.dicom-rt",k={"@ohif/extension-default":"^3.0.0","@ohif/extension-cornerstone":"^3.0.0","@ohif/extension-measurement-tracking":"^3.0.0","@ohif/extension-cornerstone-dicom-sr":"^3.0.0","@ohif/extension-cornerstone-dicom-seg":"^3.0.0","@ohif/extension-cornerstone-dicom-rt":"^3.0.0","@ohif/extension-dicom-pdf":"^3.0.1","@ohif/extension-dicom-video":"^3.0.1"};const P={id:g,modeFactory:function(o){let{modeConfiguration:e}=o,t=[];return{id:g,routeName:"viewer",displayName:"Basic Viewer",onModeEnter:o=>{let{servicesManager:e,extensionManager:t,commandsManager:n}=o;const{measurementService:i,toolbarService:a,toolGroupService:l,panelService:s,customizationService:r}=e.services;let m;i.clearMeasurements(),R(t,l,n);({unsubscribe:m}=l.subscribe(l.EVENTS.VIEWPORT_ADDED,(()=>{a.recordInteraction({groupId:"WindowLevel",interactionType:"tool",commands:[{commandName:"setToolActive",commandOptions:{toolName:"WindowLevel"},context:"CORNERSTONE"}]}),m()}))),a.init(t),a.addButtons(N),a.createButtonSection("primary",["MeasurementTools","Zoom","WindowLevel","Pan","Capture","Layout","MPR","Crosshairs","MoreTools"]),r.addModeCustomizations([{id:"segmentation.disableEditing",value:!0}])},onModeExit:o=>{let{servicesManager:e}=o;const{toolGroupService:n,syncGroupService:i,toolbarService:a,segmentationService:l,cornerstoneViewportService:s}=e.services;t.forEach((o=>o.unsubscribe())),t=[],n.destroy(),i.destroy(),l.destroy(),s.destroy()},validationTags:{study:[],series:[]},isValidMode:function(o){let{modalities:e}=o;return!!e.split("\\").filter((o=>-1===O.indexOf(o))).length},routes:[{path:"longitudinal",layoutTemplate:()=>({id:T,props:{leftPanels:[v],rightPanels:[I,E],rightPanelDefaultClosed:!0,viewports:[{namespace:C,displaySetsToDisplay:[S]},{namespace:f,displaySetsToDisplay:[y]},{namespace:x,displaySetsToDisplay:[h]},{namespace:A,displaySetsToDisplay:[b]},{namespace:w,displaySetsToDisplay:[M]},{namespace:L,displaySetsToDisplay:[B]}]}})}],extensions:k,hangingProtocol:"default",sopClassHandlers:[h,M,S,b,y,B],hotkeys:[...n.dD.defaults.hotkeyBindings],...e}},extensionDependencies:k}},78753:()=>{}}]); +//# sourceMappingURL=370.bundle.42f05adb02eaf4f41567.js.map \ No newline at end of file diff --git a/resources/370.bundle.42f05adb02eaf4f41567.js.map b/resources/370.bundle.42f05adb02eaf4f41567.js.map new file mode 100644 index 0000000..4957036 --- /dev/null +++ b/resources/370.bundle.42f05adb02eaf4f41567.js.map @@ -0,0 +1 @@ +{"version":3,"file":"370.bundle.42f05adb02eaf4f41567.js","mappings":"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","sources":["webpack:///../../../modes/longitudinal/src/toolbarButtons.ts","webpack:///../../../modes/longitudinal/src/id.js","webpack:///../../../modes/longitudinal/src/initToolGroups.js","webpack:///../../../modes/longitudinal/src/index.js"],"sourcesContent":["// TODO: torn, can either bake this here; or have to create a whole new button type\r\n// Only ways that you can pass in a custom React component for render :l\r\nimport {\r\n // ExpandableToolbarButton,\r\n // ListMenu,\r\n WindowLevelMenuItem,\r\n} from '@ohif/ui';\r\nimport { defaults, ToolbarService } from '@ohif/core';\r\nimport type { Button, RunCommand } from '@ohif/core/types';\r\nimport { EVENTS } from '@cornerstonejs/core';\r\n\r\nconst { windowLevelPresets } = defaults;\r\n\r\nconst _createActionButton = ToolbarService._createButton.bind(null, 'action');\r\nconst _createToggleButton = ToolbarService._createButton.bind(null, 'toggle');\r\nconst _createToolButton = ToolbarService._createButton.bind(null, 'tool');\r\n\r\n/**\r\n *\r\n * @param {*} preset - preset number (from above import)\r\n * @param {*} title\r\n * @param {*} subtitle\r\n */\r\nfunction _createWwwcPreset(preset, title, subtitle) {\r\n return {\r\n id: preset.toString(),\r\n title,\r\n subtitle,\r\n type: 'action',\r\n commands: [\r\n {\r\n commandName: 'setWindowLevel',\r\n commandOptions: {\r\n ...windowLevelPresets[preset],\r\n },\r\n context: 'CORNERSTONE',\r\n },\r\n ],\r\n };\r\n}\r\n\r\nconst toolGroupIds = ['default', 'mpr', 'SRToolGroup'];\r\n\r\n/**\r\n * Creates an array of 'setToolActive' commands for the given toolName - one for\r\n * each toolGroupId specified in toolGroupIds.\r\n * @param {string} toolName\r\n * @returns {Array} an array of 'setToolActive' commands\r\n */\r\nfunction _createSetToolActiveCommands(toolName) {\r\n const temp = toolGroupIds.map(toolGroupId => ({\r\n commandName: 'setToolActive',\r\n commandOptions: {\r\n toolGroupId,\r\n toolName,\r\n },\r\n context: 'CORNERSTONE',\r\n }));\r\n return temp;\r\n}\r\n\r\nconst ReferenceLinesCommands: RunCommand = [\r\n {\r\n commandName: 'setSourceViewportForReferenceLinesTool',\r\n context: 'CORNERSTONE',\r\n },\r\n {\r\n commandName: 'setToolActive',\r\n commandOptions: {\r\n toolName: 'ReferenceLines',\r\n },\r\n context: 'CORNERSTONE',\r\n },\r\n];\r\n\r\nconst toolbarButtons: Button[] = [\r\n // Measurement\r\n {\r\n id: 'MeasurementTools',\r\n type: 'ohif.splitButton',\r\n props: {\r\n groupId: 'MeasurementTools',\r\n isRadio: true, // ?\r\n // Switch?\r\n primary: _createToolButton(\r\n 'Length',\r\n 'tool-length',\r\n 'Length',\r\n [\r\n {\r\n commandName: 'setToolActive',\r\n commandOptions: {\r\n toolName: 'Length',\r\n },\r\n context: 'CORNERSTONE',\r\n },\r\n {\r\n commandName: 'setToolActive',\r\n commandOptions: {\r\n toolName: 'SRLength',\r\n toolGroupId: 'SRToolGroup',\r\n },\r\n // we can use the setToolActive command for this from Cornerstone commandsModule\r\n context: 'CORNERSTONE',\r\n },\r\n ],\r\n 'Length'\r\n ),\r\n secondary: {\r\n icon: 'chevron-down',\r\n label: '',\r\n isActive: true,\r\n tooltip: 'More Measure Tools',\r\n },\r\n items: [\r\n _createToolButton(\r\n 'Length',\r\n 'tool-length',\r\n 'Length',\r\n [\r\n {\r\n commandName: 'setToolActive',\r\n commandOptions: {\r\n toolName: 'Length',\r\n },\r\n context: 'CORNERSTONE',\r\n },\r\n {\r\n commandName: 'setToolActive',\r\n commandOptions: {\r\n toolName: 'SRLength',\r\n toolGroupId: 'SRToolGroup',\r\n },\r\n // we can use the setToolActive command for this from Cornerstone commandsModule\r\n context: 'CORNERSTONE',\r\n },\r\n ],\r\n 'Length Tool'\r\n ),\r\n _createToolButton(\r\n 'Bidirectional',\r\n 'tool-bidirectional',\r\n 'Bidirectional',\r\n [\r\n {\r\n commandName: 'setToolActive',\r\n commandOptions: {\r\n toolName: 'Bidirectional',\r\n },\r\n context: 'CORNERSTONE',\r\n },\r\n {\r\n commandName: 'setToolActive',\r\n commandOptions: {\r\n toolName: 'SRBidirectional',\r\n toolGroupId: 'SRToolGroup',\r\n },\r\n context: 'CORNERSTONE',\r\n },\r\n ],\r\n 'Bidirectional Tool'\r\n ),\r\n _createToolButton(\r\n 'ArrowAnnotate',\r\n 'tool-annotate',\r\n 'Annotation',\r\n [\r\n {\r\n commandName: 'setToolActive',\r\n commandOptions: {\r\n toolName: 'ArrowAnnotate',\r\n },\r\n context: 'CORNERSTONE',\r\n },\r\n {\r\n commandName: 'setToolActive',\r\n commandOptions: {\r\n toolName: 'SRArrowAnnotate',\r\n toolGroupId: 'SRToolGroup',\r\n },\r\n context: 'CORNERSTONE',\r\n },\r\n ],\r\n 'Arrow Annotate'\r\n ),\r\n _createToolButton(\r\n 'EllipticalROI',\r\n 'tool-elipse',\r\n 'Ellipse',\r\n [\r\n {\r\n commandName: 'setToolActive',\r\n commandOptions: {\r\n toolName: 'EllipticalROI',\r\n },\r\n context: 'CORNERSTONE',\r\n },\r\n {\r\n commandName: 'setToolActive',\r\n commandOptions: {\r\n toolName: 'SREllipticalROI',\r\n toolGroupId: 'SRToolGroup',\r\n },\r\n context: 'CORNERSTONE',\r\n },\r\n ],\r\n 'Ellipse Tool'\r\n ),\r\n _createToolButton(\r\n 'CircleROI',\r\n 'tool-circle',\r\n 'Circle',\r\n [\r\n {\r\n commandName: 'setToolActive',\r\n commandOptions: {\r\n toolName: 'CircleROI',\r\n },\r\n context: 'CORNERSTONE',\r\n },\r\n {\r\n commandName: 'setToolActive',\r\n commandOptions: {\r\n toolName: 'SRCircleROI',\r\n toolGroupId: 'SRToolGroup',\r\n },\r\n context: 'CORNERSTONE',\r\n },\r\n ],\r\n 'Circle Tool'\r\n ),\r\n ],\r\n },\r\n },\r\n // Zoom..\r\n {\r\n id: 'Zoom',\r\n type: 'ohif.radioGroup',\r\n props: {\r\n type: 'tool',\r\n icon: 'tool-zoom',\r\n label: 'Zoom',\r\n commands: _createSetToolActiveCommands('Zoom'),\r\n },\r\n },\r\n // Window Level + Presets...\r\n {\r\n id: 'WindowLevel',\r\n type: 'ohif.splitButton',\r\n props: {\r\n groupId: 'WindowLevel',\r\n primary: _createToolButton(\r\n 'WindowLevel',\r\n 'tool-window-level',\r\n 'Window Level',\r\n [\r\n {\r\n commandName: 'setToolActive',\r\n commandOptions: {\r\n toolName: 'WindowLevel',\r\n },\r\n context: 'CORNERSTONE',\r\n },\r\n ],\r\n 'Window Level'\r\n ),\r\n secondary: {\r\n icon: 'chevron-down',\r\n label: 'W/L Manual',\r\n isActive: true,\r\n tooltip: 'W/L Presets',\r\n },\r\n isAction: true, // ?\r\n renderer: WindowLevelMenuItem,\r\n items: [\r\n _createWwwcPreset(1, 'Soft tissue', '400 / 40'),\r\n _createWwwcPreset(2, 'Lung', '1500 / -600'),\r\n _createWwwcPreset(3, 'Liver', '150 / 90'),\r\n _createWwwcPreset(4, 'Bone', '2500 / 480'),\r\n _createWwwcPreset(5, 'Brain', '80 / 40'),\r\n ],\r\n },\r\n },\r\n // Pan...\r\n {\r\n id: 'Pan',\r\n type: 'ohif.radioGroup',\r\n props: {\r\n type: 'tool',\r\n icon: 'tool-move',\r\n label: 'Pan',\r\n commands: _createSetToolActiveCommands('Pan'),\r\n },\r\n },\r\n {\r\n id: 'Capture',\r\n type: 'ohif.action',\r\n props: {\r\n icon: 'tool-capture',\r\n label: 'Capture',\r\n type: 'action',\r\n commands: [\r\n {\r\n commandName: 'showDownloadViewportModal',\r\n commandOptions: {},\r\n context: 'CORNERSTONE',\r\n },\r\n ],\r\n },\r\n },\r\n {\r\n id: 'Layout',\r\n type: 'ohif.layoutSelector',\r\n props: {\r\n rows: 3,\r\n columns: 3,\r\n },\r\n },\r\n {\r\n id: 'MPR',\r\n type: 'ohif.action',\r\n props: {\r\n type: 'toggle',\r\n icon: 'icon-mpr',\r\n label: 'MPR',\r\n commands: [\r\n {\r\n commandName: 'toggleHangingProtocol',\r\n commandOptions: {\r\n protocolId: 'mpr',\r\n },\r\n context: 'DEFAULT',\r\n },\r\n ],\r\n },\r\n },\r\n {\r\n id: 'Crosshairs',\r\n type: 'ohif.radioGroup',\r\n props: {\r\n type: 'tool',\r\n icon: 'tool-crosshair',\r\n label: 'Crosshairs',\r\n commands: [\r\n {\r\n commandName: 'setToolActive',\r\n commandOptions: {\r\n toolName: 'Crosshairs',\r\n toolGroupId: 'mpr',\r\n },\r\n context: 'CORNERSTONE',\r\n },\r\n ],\r\n },\r\n },\r\n // More...\r\n {\r\n id: 'MoreTools',\r\n type: 'ohif.splitButton',\r\n props: {\r\n isRadio: true, // ?\r\n groupId: 'MoreTools',\r\n primary: _createActionButton(\r\n 'Reset',\r\n 'tool-reset',\r\n 'Reset View',\r\n [\r\n {\r\n commandName: 'resetViewport',\r\n commandOptions: {},\r\n context: 'CORNERSTONE',\r\n },\r\n ],\r\n 'Reset'\r\n ),\r\n secondary: {\r\n icon: 'chevron-down',\r\n label: '',\r\n isActive: true,\r\n tooltip: 'More Tools',\r\n },\r\n items: [\r\n _createActionButton(\r\n 'Reset',\r\n 'tool-reset',\r\n 'Reset View',\r\n [\r\n {\r\n commandName: 'resetViewport',\r\n commandOptions: {},\r\n context: 'CORNERSTONE',\r\n },\r\n ],\r\n 'Reset'\r\n ),\r\n _createActionButton(\r\n 'rotate-right',\r\n 'tool-rotate-right',\r\n 'Rotate Right',\r\n [\r\n {\r\n commandName: 'rotateViewportCW',\r\n commandOptions: {},\r\n context: 'CORNERSTONE',\r\n },\r\n ],\r\n 'Rotate +90'\r\n ),\r\n _createActionButton(\r\n 'flip-horizontal',\r\n 'tool-flip-horizontal',\r\n 'Flip Horizontally',\r\n [\r\n {\r\n commandName: 'flipViewportHorizontal',\r\n commandOptions: {},\r\n context: 'CORNERSTONE',\r\n },\r\n ],\r\n 'Flip Horizontal'\r\n ),\r\n _createToggleButton(\r\n 'StackImageSync',\r\n 'link',\r\n 'Stack Image Sync',\r\n [\r\n {\r\n commandName: 'toggleStackImageSync',\r\n },\r\n ],\r\n 'Enable position synchronization on stack viewports',\r\n {\r\n listeners: {\r\n [EVENTS.STACK_VIEWPORT_NEW_STACK]: {\r\n commandName: 'toggleStackImageSync',\r\n commandOptions: { toggledState: true },\r\n },\r\n },\r\n }\r\n ),\r\n _createToggleButton(\r\n 'ReferenceLines',\r\n 'tool-referenceLines', // change this with the new icon\r\n 'Reference Lines',\r\n ReferenceLinesCommands,\r\n 'Show Reference Lines',\r\n {\r\n listeners: {\r\n [EVENTS.STACK_VIEWPORT_NEW_STACK]: ReferenceLinesCommands,\r\n [EVENTS.ACTIVE_VIEWPORT_ID_CHANGED]: ReferenceLinesCommands,\r\n },\r\n }\r\n ),\r\n _createToggleButton(\r\n 'ImageOverlayViewer',\r\n 'toggle-dicom-overlay',\r\n 'Image Overlay',\r\n [\r\n {\r\n commandName: 'setToolActive',\r\n commandOptions: {\r\n toolName: 'ImageOverlayViewer',\r\n },\r\n context: 'CORNERSTONE',\r\n },\r\n ],\r\n 'Image Overlay',\r\n { isActive: true }\r\n ),\r\n _createToolButton(\r\n 'StackScroll',\r\n 'tool-stack-scroll',\r\n 'Stack Scroll',\r\n [\r\n {\r\n commandName: 'setToolActive',\r\n commandOptions: {\r\n toolName: 'StackScroll',\r\n },\r\n context: 'CORNERSTONE',\r\n },\r\n ],\r\n 'Stack Scroll'\r\n ),\r\n _createActionButton(\r\n 'invert',\r\n 'tool-invert',\r\n 'Invert',\r\n [\r\n {\r\n commandName: 'invertViewport',\r\n commandOptions: {},\r\n context: 'CORNERSTONE',\r\n },\r\n ],\r\n 'Invert Colors'\r\n ),\r\n _createToolButton(\r\n 'Probe',\r\n 'tool-probe',\r\n 'Probe',\r\n [\r\n {\r\n commandName: 'setToolActive',\r\n commandOptions: {\r\n toolName: 'DragProbe',\r\n },\r\n context: 'CORNERSTONE',\r\n },\r\n ],\r\n 'Probe'\r\n ),\r\n _createToggleButton(\r\n 'cine',\r\n 'tool-cine',\r\n 'Cine',\r\n [\r\n {\r\n commandName: 'toggleCine',\r\n context: 'CORNERSTONE',\r\n },\r\n ],\r\n 'Cine'\r\n ),\r\n _createToolButton(\r\n 'Angle',\r\n 'tool-angle',\r\n 'Angle',\r\n [\r\n {\r\n commandName: 'setToolActive',\r\n commandOptions: {\r\n toolName: 'Angle',\r\n },\r\n context: 'CORNERSTONE',\r\n },\r\n ],\r\n 'Angle'\r\n ),\r\n\r\n // Next two tools can be added once icons are added\r\n // _createToolButton(\r\n // 'Cobb Angle',\r\n // 'tool-cobb-angle',\r\n // 'Cobb Angle',\r\n // [\r\n // {\r\n // commandName: 'setToolActive',\r\n // commandOptions: {\r\n // toolName: 'CobbAngle',\r\n // },\r\n // context: 'CORNERSTONE',\r\n // },\r\n // ],\r\n // 'Cobb Angle'\r\n // ),\r\n // _createToolButton(\r\n // 'Planar Freehand ROI',\r\n // 'tool-freehand',\r\n // 'PlanarFreehandROI',\r\n // [\r\n // {\r\n // commandName: 'setToolActive',\r\n // commandOptions: {\r\n // toolName: 'PlanarFreehandROI',\r\n // },\r\n // context: 'CORNERSTONE',\r\n // },\r\n // ],\r\n // 'Planar Freehand ROI'\r\n // ),\r\n _createToolButton(\r\n 'Magnify',\r\n 'tool-magnify',\r\n 'Magnify',\r\n [\r\n {\r\n commandName: 'setToolActive',\r\n commandOptions: {\r\n toolName: 'Magnify',\r\n },\r\n context: 'CORNERSTONE',\r\n },\r\n ],\r\n 'Magnify'\r\n ),\r\n _createToolButton(\r\n 'Rectangle',\r\n 'tool-rectangle',\r\n 'Rectangle',\r\n [\r\n {\r\n commandName: 'setToolActive',\r\n commandOptions: {\r\n toolName: 'RectangleROI',\r\n },\r\n context: 'CORNERSTONE',\r\n },\r\n ],\r\n 'Rectangle'\r\n ),\r\n _createToolButton(\r\n 'CalibrationLine',\r\n 'tool-calibration',\r\n 'Calibration',\r\n [\r\n {\r\n commandName: 'setToolActive',\r\n commandOptions: {\r\n toolName: 'CalibrationLine',\r\n },\r\n context: 'CORNERSTONE',\r\n },\r\n ],\r\n 'Calibration Line'\r\n ),\r\n _createActionButton(\r\n 'TagBrowser',\r\n 'list-bullets',\r\n 'Dicom Tag Browser',\r\n [\r\n {\r\n commandName: 'openDICOMTagViewer',\r\n commandOptions: {},\r\n context: 'DEFAULT',\r\n },\r\n ],\r\n 'Dicom Tag Browser'\r\n ),\r\n ],\r\n },\r\n },\r\n];\r\n\r\nexport default toolbarButtons;\r\n","import packageJson from '../package.json';\r\n\r\nconst id = packageJson.name;\r\n\r\nexport { id };\r\n","function initDefaultToolGroup(extensionManager, toolGroupService, commandsManager, toolGroupId) {\r\n const utilityModule = extensionManager.getModuleEntry(\r\n '@ohif/extension-cornerstone.utilityModule.tools'\r\n );\r\n\r\n const { toolNames, Enums } = utilityModule.exports;\r\n\r\n const tools = {\r\n active: [\r\n {\r\n toolName: toolNames.WindowLevel,\r\n bindings: [{ mouseButton: Enums.MouseBindings.Primary }],\r\n },\r\n {\r\n toolName: toolNames.Pan,\r\n bindings: [{ mouseButton: Enums.MouseBindings.Auxiliary }],\r\n },\r\n {\r\n toolName: toolNames.Zoom,\r\n bindings: [{ mouseButton: Enums.MouseBindings.Secondary }],\r\n },\r\n { toolName: toolNames.StackScrollMouseWheel, bindings: [] },\r\n ],\r\n passive: [\r\n { toolName: toolNames.Length },\r\n {\r\n toolName: toolNames.ArrowAnnotate,\r\n configuration: {\r\n getTextCallback: (callback, eventDetails) =>\r\n commandsManager.runCommand('arrowTextCallback', {\r\n callback,\r\n eventDetails,\r\n }),\r\n\r\n changeTextCallback: (data, eventDetails, callback) =>\r\n commandsManager.runCommand('arrowTextCallback', {\r\n callback,\r\n data,\r\n eventDetails,\r\n }),\r\n },\r\n },\r\n { toolName: toolNames.Bidirectional },\r\n { toolName: toolNames.DragProbe },\r\n { toolName: toolNames.EllipticalROI },\r\n { toolName: toolNames.CircleROI },\r\n { toolName: toolNames.RectangleROI },\r\n { toolName: toolNames.StackScroll },\r\n { toolName: toolNames.Angle },\r\n { toolName: toolNames.CobbAngle },\r\n { toolName: toolNames.PlanarFreehandROI },\r\n { toolName: toolNames.Magnify },\r\n { toolName: toolNames.SegmentationDisplay },\r\n { toolName: toolNames.CalibrationLine },\r\n ],\r\n // enabled\r\n enabled: [{ toolName: toolNames.ImageOverlayViewer }],\r\n // disabled\r\n disabled: [{ toolName: toolNames.ReferenceLines }],\r\n };\r\n\r\n toolGroupService.createToolGroupAndAddTools(toolGroupId, tools);\r\n}\r\n\r\nfunction initSRToolGroup(extensionManager, toolGroupService, commandsManager) {\r\n const SRUtilityModule = extensionManager.getModuleEntry(\r\n '@ohif/extension-cornerstone-dicom-sr.utilityModule.tools'\r\n );\r\n\r\n if (!SRUtilityModule) {\r\n return;\r\n }\r\n\r\n const CS3DUtilityModule = extensionManager.getModuleEntry(\r\n '@ohif/extension-cornerstone.utilityModule.tools'\r\n );\r\n\r\n const { toolNames: SRToolNames } = SRUtilityModule.exports;\r\n const { toolNames, Enums } = CS3DUtilityModule.exports;\r\n const tools = {\r\n active: [\r\n {\r\n toolName: toolNames.WindowLevel,\r\n bindings: [\r\n {\r\n mouseButton: Enums.MouseBindings.Primary,\r\n },\r\n ],\r\n },\r\n {\r\n toolName: toolNames.Pan,\r\n bindings: [\r\n {\r\n mouseButton: Enums.MouseBindings.Auxiliary,\r\n },\r\n ],\r\n },\r\n {\r\n toolName: toolNames.Zoom,\r\n bindings: [\r\n {\r\n mouseButton: Enums.MouseBindings.Secondary,\r\n },\r\n ],\r\n },\r\n {\r\n toolName: toolNames.StackScrollMouseWheel,\r\n bindings: [],\r\n },\r\n ],\r\n passive: [\r\n { toolName: SRToolNames.SRLength },\r\n { toolName: SRToolNames.SRArrowAnnotate },\r\n { toolName: SRToolNames.SRBidirectional },\r\n { toolName: SRToolNames.SREllipticalROI },\r\n { toolName: SRToolNames.SRCircleROI },\r\n ],\r\n enabled: [\r\n {\r\n toolName: SRToolNames.DICOMSRDisplay,\r\n bindings: [],\r\n },\r\n ],\r\n // disabled\r\n };\r\n\r\n const toolGroupId = 'SRToolGroup';\r\n toolGroupService.createToolGroupAndAddTools(toolGroupId, tools);\r\n}\r\n\r\nfunction initMPRToolGroup(extensionManager, toolGroupService, commandsManager) {\r\n const utilityModule = extensionManager.getModuleEntry(\r\n '@ohif/extension-cornerstone.utilityModule.tools'\r\n );\r\n\r\n const { toolNames, Enums } = utilityModule.exports;\r\n\r\n const tools = {\r\n active: [\r\n {\r\n toolName: toolNames.WindowLevel,\r\n bindings: [{ mouseButton: Enums.MouseBindings.Primary }],\r\n },\r\n {\r\n toolName: toolNames.Pan,\r\n bindings: [{ mouseButton: Enums.MouseBindings.Auxiliary }],\r\n },\r\n {\r\n toolName: toolNames.Zoom,\r\n bindings: [{ mouseButton: Enums.MouseBindings.Secondary }],\r\n },\r\n { toolName: toolNames.StackScrollMouseWheel, bindings: [] },\r\n ],\r\n passive: [\r\n { toolName: toolNames.Length },\r\n {\r\n toolName: toolNames.ArrowAnnotate,\r\n configuration: {\r\n getTextCallback: (callback, eventDetails) =>\r\n commandsManager.runCommand('arrowTextCallback', {\r\n callback,\r\n eventDetails,\r\n }),\r\n\r\n changeTextCallback: (data, eventDetails, callback) =>\r\n commandsManager.runCommand('arrowTextCallback', {\r\n callback,\r\n data,\r\n eventDetails,\r\n }),\r\n },\r\n },\r\n { toolName: toolNames.Bidirectional },\r\n { toolName: toolNames.DragProbe },\r\n { toolName: toolNames.EllipticalROI },\r\n { toolName: toolNames.CircleROI },\r\n { toolName: toolNames.RectangleROI },\r\n { toolName: toolNames.StackScroll },\r\n { toolName: toolNames.Angle },\r\n { toolName: toolNames.CobbAngle },\r\n { toolName: toolNames.PlanarFreehandROI },\r\n { toolName: toolNames.SegmentationDisplay },\r\n ],\r\n disabled: [\r\n {\r\n toolName: toolNames.Crosshairs,\r\n configuration: {\r\n viewportIndicators: false,\r\n autoPan: {\r\n enabled: false,\r\n panSize: 10,\r\n },\r\n },\r\n },\r\n { toolName: toolNames.ReferenceLines },\r\n ],\r\n\r\n // enabled\r\n // disabled\r\n };\r\n\r\n toolGroupService.createToolGroupAndAddTools('mpr', tools);\r\n}\r\nfunction initVolume3DToolGroup(extensionManager, toolGroupService) {\r\n const utilityModule = extensionManager.getModuleEntry(\r\n '@ohif/extension-cornerstone.utilityModule.tools'\r\n );\r\n\r\n const { toolNames, Enums } = utilityModule.exports;\r\n\r\n const tools = {\r\n active: [\r\n {\r\n toolName: toolNames.TrackballRotateTool,\r\n bindings: [{ mouseButton: Enums.MouseBindings.Primary }],\r\n },\r\n {\r\n toolName: toolNames.Zoom,\r\n bindings: [{ mouseButton: Enums.MouseBindings.Secondary }],\r\n },\r\n {\r\n toolName: toolNames.Pan,\r\n bindings: [{ mouseButton: Enums.MouseBindings.Auxiliary }],\r\n },\r\n ],\r\n };\r\n\r\n toolGroupService.createToolGroupAndAddTools('volume3d', tools);\r\n}\r\n\r\nfunction initToolGroups(extensionManager, toolGroupService, commandsManager) {\r\n initDefaultToolGroup(extensionManager, toolGroupService, commandsManager, 'default');\r\n initSRToolGroup(extensionManager, toolGroupService, commandsManager);\r\n initMPRToolGroup(extensionManager, toolGroupService, commandsManager);\r\n initVolume3DToolGroup(extensionManager, toolGroupService);\r\n}\r\n\r\nexport default initToolGroups;\r\n","import { hotkeys } from '@ohif/core';\r\nimport toolbarButtons from './toolbarButtons';\r\nimport { id } from './id';\r\nimport initToolGroups from './initToolGroups';\r\n\r\n// Allow this mode by excluding non-imaging modalities such as SR, SEG\r\n// Also, SM is not a simple imaging modalities, so exclude it.\r\nconst NON_IMAGE_MODALITIES = ['SM', 'ECG', 'SR', 'SEG', 'RTSTRUCT'];\r\n\r\nconst ohif = {\r\n layout: '@ohif/extension-default.layoutTemplateModule.viewerLayout',\r\n sopClassHandler: '@ohif/extension-default.sopClassHandlerModule.stack',\r\n thumbnailList: '@ohif/extension-default.panelModule.seriesList',\r\n};\r\n\r\nconst tracked = {\r\n measurements: '@ohif/extension-measurement-tracking.panelModule.trackedMeasurements',\r\n thumbnailList: '@ohif/extension-measurement-tracking.panelModule.seriesList',\r\n viewport: '@ohif/extension-measurement-tracking.viewportModule.cornerstone-tracked',\r\n};\r\n\r\nconst dicomsr = {\r\n sopClassHandler: '@ohif/extension-cornerstone-dicom-sr.sopClassHandlerModule.dicom-sr',\r\n viewport: '@ohif/extension-cornerstone-dicom-sr.viewportModule.dicom-sr',\r\n};\r\n\r\nconst dicomvideo = {\r\n sopClassHandler: '@ohif/extension-dicom-video.sopClassHandlerModule.dicom-video',\r\n viewport: '@ohif/extension-dicom-video.viewportModule.dicom-video',\r\n};\r\n\r\nconst dicompdf = {\r\n sopClassHandler: '@ohif/extension-dicom-pdf.sopClassHandlerModule.dicom-pdf',\r\n viewport: '@ohif/extension-dicom-pdf.viewportModule.dicom-pdf',\r\n};\r\n\r\nconst dicomSeg = {\r\n sopClassHandler: '@ohif/extension-cornerstone-dicom-seg.sopClassHandlerModule.dicom-seg',\r\n viewport: '@ohif/extension-cornerstone-dicom-seg.viewportModule.dicom-seg',\r\n panel: '@ohif/extension-cornerstone-dicom-seg.panelModule.panelSegmentation',\r\n};\r\n\r\nconst dicomRT = {\r\n viewport: '@ohif/extension-cornerstone-dicom-rt.viewportModule.dicom-rt',\r\n sopClassHandler: '@ohif/extension-cornerstone-dicom-rt.sopClassHandlerModule.dicom-rt',\r\n};\r\n\r\nconst extensionDependencies = {\r\n // Can derive the versions at least process.env.from npm_package_version\r\n '@ohif/extension-default': '^3.0.0',\r\n '@ohif/extension-cornerstone': '^3.0.0',\r\n '@ohif/extension-measurement-tracking': '^3.0.0',\r\n '@ohif/extension-cornerstone-dicom-sr': '^3.0.0',\r\n '@ohif/extension-cornerstone-dicom-seg': '^3.0.0',\r\n '@ohif/extension-cornerstone-dicom-rt': '^3.0.0',\r\n '@ohif/extension-dicom-pdf': '^3.0.1',\r\n '@ohif/extension-dicom-video': '^3.0.1',\r\n};\r\n\r\nfunction modeFactory({ modeConfiguration }) {\r\n let _activatePanelTriggersSubscriptions = [];\r\n return {\r\n // TODO: We're using this as a route segment\r\n // We should not be.\r\n id,\r\n routeName: 'viewer',\r\n displayName: 'Basic Viewer',\r\n /**\r\n * Lifecycle hooks\r\n */\r\n onModeEnter: ({ servicesManager, extensionManager, commandsManager }) => {\r\n const {\r\n measurementService,\r\n toolbarService,\r\n toolGroupService,\r\n panelService,\r\n customizationService,\r\n } = servicesManager.services;\r\n\r\n measurementService.clearMeasurements();\r\n\r\n // Init Default and SR ToolGroups\r\n initToolGroups(extensionManager, toolGroupService, commandsManager);\r\n\r\n let unsubscribe;\r\n\r\n const activateTool = () => {\r\n toolbarService.recordInteraction({\r\n groupId: 'WindowLevel',\r\n interactionType: 'tool',\r\n commands: [\r\n {\r\n commandName: 'setToolActive',\r\n commandOptions: {\r\n toolName: 'WindowLevel',\r\n },\r\n context: 'CORNERSTONE',\r\n },\r\n ],\r\n });\r\n\r\n // We don't need to reset the active tool whenever a viewport is getting\r\n // added to the toolGroup.\r\n unsubscribe();\r\n };\r\n\r\n // Since we only have one viewport for the basic cs3d mode and it has\r\n // only one hanging protocol, we can just use the first viewport\r\n ({ unsubscribe } = toolGroupService.subscribe(\r\n toolGroupService.EVENTS.VIEWPORT_ADDED,\r\n activateTool\r\n ));\r\n\r\n toolbarService.init(extensionManager);\r\n toolbarService.addButtons(toolbarButtons);\r\n toolbarService.createButtonSection('primary', [\r\n 'MeasurementTools',\r\n 'Zoom',\r\n 'WindowLevel',\r\n 'Pan',\r\n 'Capture',\r\n 'Layout',\r\n 'MPR',\r\n 'Crosshairs',\r\n 'MoreTools',\r\n ]);\r\n\r\n customizationService.addModeCustomizations([\r\n {\r\n id: 'segmentation.disableEditing',\r\n value: true,\r\n },\r\n ]);\r\n\r\n // // ActivatePanel event trigger for when a segmentation or measurement is added.\r\n // // Do not force activation so as to respect the state the user may have left the UI in.\r\n // _activatePanelTriggersSubscriptions = [\r\n // ...panelService.addActivatePanelTriggers(dicomSeg.panel, [\r\n // {\r\n // sourcePubSubService: segmentationService,\r\n // sourceEvents: [\r\n // segmentationService.EVENTS.SEGMENTATION_PIXEL_DATA_CREATED,\r\n // ],\r\n // },\r\n // ]),\r\n // ...panelService.addActivatePanelTriggers(tracked.measurements, [\r\n // {\r\n // sourcePubSubService: measurementService,\r\n // sourceEvents: [\r\n // measurementService.EVENTS.MEASUREMENT_ADDED,\r\n // measurementService.EVENTS.RAW_MEASUREMENT_ADDED,\r\n // ],\r\n // },\r\n // ]),\r\n // ];\r\n },\r\n onModeExit: ({ servicesManager }) => {\r\n const {\r\n toolGroupService,\r\n syncGroupService,\r\n toolbarService,\r\n segmentationService,\r\n cornerstoneViewportService,\r\n } = servicesManager.services;\r\n\r\n _activatePanelTriggersSubscriptions.forEach(sub => sub.unsubscribe());\r\n _activatePanelTriggersSubscriptions = [];\r\n\r\n toolGroupService.destroy();\r\n syncGroupService.destroy();\r\n segmentationService.destroy();\r\n cornerstoneViewportService.destroy();\r\n },\r\n validationTags: {\r\n study: [],\r\n series: [],\r\n },\r\n\r\n isValidMode: function ({ modalities }) {\r\n const modalities_list = modalities.split('\\\\');\r\n\r\n // Exclude non-image modalities\r\n return !!modalities_list.filter(modality => NON_IMAGE_MODALITIES.indexOf(modality) === -1)\r\n .length;\r\n },\r\n routes: [\r\n {\r\n path: 'longitudinal',\r\n /*init: ({ servicesManager, extensionManager }) => {\r\n //defaultViewerRouteInit\r\n },*/\r\n layoutTemplate: () => {\r\n return {\r\n id: ohif.layout,\r\n props: {\r\n leftPanels: [tracked.thumbnailList],\r\n rightPanels: [dicomSeg.panel, tracked.measurements],\r\n rightPanelDefaultClosed: true,\r\n viewports: [\r\n {\r\n namespace: tracked.viewport,\r\n displaySetsToDisplay: [ohif.sopClassHandler],\r\n },\r\n {\r\n namespace: dicomsr.viewport,\r\n displaySetsToDisplay: [dicomsr.sopClassHandler],\r\n },\r\n {\r\n namespace: dicomvideo.viewport,\r\n displaySetsToDisplay: [dicomvideo.sopClassHandler],\r\n },\r\n {\r\n namespace: dicompdf.viewport,\r\n displaySetsToDisplay: [dicompdf.sopClassHandler],\r\n },\r\n {\r\n namespace: dicomSeg.viewport,\r\n displaySetsToDisplay: [dicomSeg.sopClassHandler],\r\n },\r\n {\r\n namespace: dicomRT.viewport,\r\n displaySetsToDisplay: [dicomRT.sopClassHandler],\r\n },\r\n ],\r\n },\r\n };\r\n },\r\n },\r\n ],\r\n extensions: extensionDependencies,\r\n // Default protocol gets self-registered by default in the init\r\n hangingProtocol: 'default',\r\n // Order is important in sop class handlers when two handlers both use\r\n // the same sop class under different situations. In that case, the more\r\n // general handler needs to come last. For this case, the dicomvideo must\r\n // come first to remove video transfer syntax before ohif uses images\r\n sopClassHandlers: [\r\n dicomvideo.sopClassHandler,\r\n dicomSeg.sopClassHandler,\r\n ohif.sopClassHandler,\r\n dicompdf.sopClassHandler,\r\n dicomsr.sopClassHandler,\r\n dicomRT.sopClassHandler,\r\n ],\r\n hotkeys: [...hotkeys.defaults.hotkeyBindings],\r\n ...modeConfiguration,\r\n };\r\n}\r\n\r\nconst mode = {\r\n id,\r\n modeFactory,\r\n extensionDependencies,\r\n};\r\n\r\nexport default mode;\r\nexport { initToolGroups, toolbarButtons };\r\n"],"names":["windowLevelPresets","defaults","_createActionButton","ToolbarService","_createButton","bind","_createToggleButton","_createToolButton","_createWwwcPreset","preset","title","subtitle","id","toString","type","commands","commandName","commandOptions","context","toolGroupIds","_createSetToolActiveCommands","toolName","map","toolGroupId","ReferenceLinesCommands","props","groupId","isRadio","primary","secondary","icon","label","isActive","tooltip","items","isAction","renderer","WindowLevelMenuItem","rows","columns","protocolId","listeners","EVENTS","STACK_VIEWPORT_NEW_STACK","toggledState","ACTIVE_VIEWPORT_ID_CHANGED","packageJson","extensionManager","toolGroupService","commandsManager","utilityModule","getModuleEntry","toolNames","Enums","exports","tools","active","WindowLevel","bindings","mouseButton","MouseBindings","Primary","Pan","Auxiliary","Zoom","Secondary","StackScrollMouseWheel","passive","Length","ArrowAnnotate","configuration","getTextCallback","callback","eventDetails","runCommand","changeTextCallback","data","Bidirectional","DragProbe","EllipticalROI","CircleROI","RectangleROI","StackScroll","Angle","CobbAngle","PlanarFreehandROI","Magnify","SegmentationDisplay","CalibrationLine","enabled","ImageOverlayViewer","disabled","ReferenceLines","createToolGroupAndAddTools","initDefaultToolGroup","SRUtilityModule","CS3DUtilityModule","SRToolNames","SRLength","SRArrowAnnotate","SRBidirectional","SREllipticalROI","SRCircleROI","DICOMSRDisplay","initSRToolGroup","Crosshairs","viewportIndicators","autoPan","panSize","initMPRToolGroup","TrackballRotateTool","initVolume3DToolGroup","NON_IMAGE_MODALITIES","ohif","tracked","dicomsr","dicomvideo","dicompdf","dicomSeg","dicomRT","extensionDependencies","modeFactory","_ref","modeConfiguration","_activatePanelTriggersSubscriptions","routeName","displayName","onModeEnter","_ref2","servicesManager","measurementService","toolbarService","panelService","customizationService","services","unsubscribe","clearMeasurements","initToolGroups","subscribe","VIEWPORT_ADDED","activateTool","recordInteraction","interactionType","init","addButtons","toolbarButtons","createButtonSection","addModeCustomizations","value","onModeExit","_ref3","syncGroupService","segmentationService","cornerstoneViewportService","forEach","sub","destroy","validationTags","study","series","isValidMode","_ref4","modalities","split","filter","modality","indexOf","length","routes","path","layoutTemplate","leftPanels","rightPanels","rightPanelDefaultClosed","viewports","namespace","displaySetsToDisplay","extensions","hangingProtocol","sopClassHandlers","hotkeys","hotkeyBindings"],"sourceRoot":""} \ No newline at end of file diff --git a/resources/410.bundle.efb50f7d564a9474c3d3.js b/resources/410.bundle.efb50f7d564a9474c3d3.js new file mode 100644 index 0000000..f15b429 --- /dev/null +++ b/resources/410.bundle.efb50f7d564a9474c3d3.js @@ -0,0 +1,2 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[410],{15410:(o,e,t)=>{t.r(e),t.d(e,{default:()=>y});var i=t(71783),n=t(71771);const{windowLevelPresets:l}=n.defaults;function a(o,e,t,i,n,l){return{id:e,icon:t,label:i,type:o,commands:n,tooltip:l}}const s=a.bind(null,"action"),r=(a.bind(null,"toggle"),a.bind(null,"tool"));function c(o,e,t){return{id:o.toString(),title:e,subtitle:t,type:"action",commands:[{commandName:"setWindowLevel",commandOptions:{...l[o]},context:"CORNERSTONE"}]}}const d=[{id:"MeasurementTools",type:"ohif.splitButton",props:{groupId:"MeasurementTools",isRadio:!0,primary:r("Length","tool-length","Length",[{commandName:"setToolActive",commandOptions:{toolName:"Length"},context:"CORNERSTONE"}],"Length"),secondary:{icon:"chevron-down",label:"",isActive:!0,tooltip:"More Measure Tools"},items:[r("Length","tool-length","Length",[{commandName:"setToolActive",commandOptions:{toolName:"Length"},context:"CORNERSTONE"}],"Length Tool"),r("Bidirectional","tool-bidirectional","Bidirectional",[{commandName:"setToolActive",commandOptions:{toolName:"Bidirectional"},context:"CORNERSTONE"}],"Bidirectional Tool"),r("EllipticalROI","tool-elipse","Ellipse",[{commandName:"setToolActive",commandOptions:{toolName:"EllipticalROI"},context:"CORNERSTONE"}],"Ellipse Tool"),r("CircleROI","tool-circle","Circle",[{commandName:"setToolActive",commandOptions:{toolName:"CircleROI"},context:"CORNERSTONE"}],"Circle Tool")]}},{id:"Zoom",type:"ohif.radioGroup",props:{type:"tool",icon:"tool-zoom",label:"Zoom",commands:[{commandName:"setToolActive",commandOptions:{toolName:"Zoom"},context:"CORNERSTONE"}]}},{id:"WindowLevel",type:"ohif.splitButton",props:{groupId:"WindowLevel",primary:r("WindowLevel","tool-window-level","Window Level",[{commandName:"setToolActive",commandOptions:{toolName:"WindowLevel"},context:"CORNERSTONE"}],"Window Level"),secondary:{icon:"chevron-down",label:"W/L Manual",isActive:!0,tooltip:"W/L Presets"},isAction:!0,renderer:i.eJ,items:[c(1,"Soft tissue","400 / 40"),c(2,"Lung","1500 / -600"),c(3,"Liver","150 / 90"),c(4,"Bone","2500 / 480"),c(5,"Brain","80 / 40")]}},{id:"Pan",type:"ohif.radioGroup",props:{type:"tool",icon:"tool-move",label:"Pan",commands:[{commandName:"setToolActive",commandOptions:{toolName:"Pan"},context:"CORNERSTONE"}]}},{id:"Capture",type:"ohif.action",props:{icon:"tool-capture",label:"Capture",type:"action",commands:[{commandName:"showDownloadViewportModal",commandOptions:{},context:"CORNERSTONE"}]}},{id:"Layout",type:"ohif.layoutSelector"},{id:"MoreTools",type:"ohif.splitButton",props:{isRadio:!0,groupId:"MoreTools",primary:s("Reset","tool-reset","Reset View",[{commandName:"resetViewport",commandOptions:{},context:"CORNERSTONE"}],"Reset"),secondary:{icon:"chevron-down",label:"",isActive:!0,tooltip:"More Tools"},items:[s("Reset","tool-reset","Reset View",[{commandName:"resetViewport",commandOptions:{},context:"CORNERSTONE"}],"Reset"),s("rotate-right","tool-rotate-right","Rotate Right",[{commandName:"rotateViewportCW",commandOptions:{},context:"CORNERSTONE"}],"Rotate +90"),s("flip-horizontal","tool-flip-horizontal","Flip Horizontally",[{commandName:"flipViewportHorizontal",commandOptions:{},context:"CORNERSTONE"}],"Flip Horizontal"),r("StackScroll","tool-stack-scroll","Stack Scroll",[{commandName:"setToolActive",commandOptions:{toolName:"StackScroll"},context:"CORNERSTONE"}],"Stack Scroll"),s("invert","tool-invert","Invert",[{commandName:"invertViewport",commandOptions:{},context:"CORNERSTONE"}],"Invert Colors"),r("CalibrationLine","tool-calibration","Calibration",[{commandName:"setToolActive",commandOptions:{toolName:"CalibrationLine"},context:"CORNERSTONE"}],"Calibration Line")]}}],m=JSON.parse('{"u2":"@ohif/mode-basic-dev-mode"}').u2,p="@ohif/extension-default.layoutTemplateModule.viewerLayout",u="@ohif/extension-default.sopClassHandlerModule.stack",N="@ohif/extension-default.panelModule.measure",v="@ohif/extension-default.panelModule.seriesList",O="@ohif/extension-cornerstone.viewportModule.cornerstone",R="@ohif/extension-cornerstone-dicom-sr.sopClassHandlerModule.dicom-sr",h="@ohif/extension-dicom-video.sopClassHandlerModule.dicom-video",T="@ohif/extension-dicom-video.viewportModule.dicom-video",f="@ohif/extension-dicom-pdf.sopClassHandlerModule.dicom-pdf",E="@ohif/extension-dicom-pdf.viewportModule.dicom-pdf",S={"@ohif/extension-default":"^3.0.0","@ohif/extension-cornerstone":"^3.0.0","@ohif/extension-cornerstone-dicom-sr":"^3.0.0","@ohif/extension-dicom-pdf":"^3.0.1","@ohif/extension-dicom-video":"^3.0.1"};const y={id:m,modeFactory:function(o){let{modeConfiguration:e}=o;return{id:m,routeName:"dev",displayName:"Basic Dev Viewer",onModeEnter:o=>{let{servicesManager:e,extensionManager:t}=o;const{toolbarService:i,toolGroupService:n}=e.services,l=t.getModuleEntry("@ohif/extension-cornerstone.utilityModule.tools"),{toolNames:a,Enums:s}=l.exports,r={active:[{toolName:a.WindowLevel,bindings:[{mouseButton:s.MouseBindings.Primary}]},{toolName:a.Pan,bindings:[{mouseButton:s.MouseBindings.Auxiliary}]},{toolName:a.Zoom,bindings:[{mouseButton:s.MouseBindings.Secondary}]},{toolName:a.StackScrollMouseWheel,bindings:[]}],passive:[{toolName:a.Length},{toolName:a.Bidirectional},{toolName:a.Probe},{toolName:a.EllipticalROI},{toolName:a.CircleROI},{toolName:a.RectangleROI},{toolName:a.StackScroll},{toolName:a.CalibrationLine}],enabled:[{toolName:a.ImageOverlayViewer}]};let c;n.createToolGroupAndAddTools("default",r);({unsubscribe:c}=n.subscribe(n.EVENTS.VIEWPORT_ADDED,(()=>{i.recordInteraction({groupId:"WindowLevel",interactionType:"tool",commands:[{commandName:"setToolActive",commandOptions:{toolName:"WindowLevel"},context:"CORNERSTONE"}]}),c()}))),i.init(t),i.addButtons(d),i.createButtonSection("primary",["MeasurementTools","Zoom","WindowLevel","Pan","Layout","MoreTools"])},onModeExit:o=>{let{servicesManager:e}=o;const{toolGroupService:t,measurementService:i,toolbarService:n}=e.services;t.destroy()},validationTags:{study:[],series:[]},isValidMode:o=>{let{modalities:e}=o;return!e.split("\\").includes("SM")},routes:[{path:"viewer-cs3d",layoutTemplate:o=>{let{location:e,servicesManager:t}=o;return{id:p,props:{leftPanels:[v],rightPanels:[N],viewports:[{namespace:O,displaySetsToDisplay:[u]},{namespace:T,displaySetsToDisplay:[h]},{namespace:E,displaySetsToDisplay:[f]}]}}}}],extensions:S,hangingProtocol:"default",sopClassHandlers:[h,u,f,R],hotkeys:[...n.dD.defaults.hotkeyBindings]}},extensionDependencies:S}}}]); +//# sourceMappingURL=410.bundle.efb50f7d564a9474c3d3.js.map \ No newline at end of file diff --git a/resources/410.bundle.efb50f7d564a9474c3d3.js.map b/resources/410.bundle.efb50f7d564a9474c3d3.js.map new file mode 100644 index 0000000..277b554 --- /dev/null +++ b/resources/410.bundle.efb50f7d564a9474c3d3.js.map @@ -0,0 +1 @@ +{"version":3,"file":"410.bundle.efb50f7d564a9474c3d3.js","mappings":"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","sources":["webpack:///../../../modes/basic-dev-mode/src/toolbarButtons.js","webpack:///../../../modes/basic-dev-mode/src/id.js","webpack:///../../../modes/basic-dev-mode/src/index.js"],"sourcesContent":["// TODO: torn, can either bake this here; or have to create a whole new button type\r\n// Only ways that you can pass in a custom React component for render :l\r\nimport {\r\n // ExpandableToolbarButton,\r\n // ListMenu,\r\n WindowLevelMenuItem,\r\n} from '@ohif/ui';\r\nimport { defaults } from '@ohif/core';\r\n\r\nconst { windowLevelPresets } = defaults;\r\n/**\r\n *\r\n * @param {*} type - 'tool' | 'action' | 'toggle'\r\n * @param {*} id\r\n * @param {*} icon\r\n * @param {*} label\r\n */\r\nfunction _createButton(type, id, icon, label, commands, tooltip) {\r\n return {\r\n id,\r\n icon,\r\n label,\r\n type,\r\n commands,\r\n tooltip,\r\n };\r\n}\r\n\r\nconst _createActionButton = _createButton.bind(null, 'action');\r\nconst _createToggleButton = _createButton.bind(null, 'toggle');\r\nconst _createToolButton = _createButton.bind(null, 'tool');\r\n\r\n/**\r\n *\r\n * @param {*} preset - preset number (from above import)\r\n * @param {*} title\r\n * @param {*} subtitle\r\n */\r\nfunction _createWwwcPreset(preset, title, subtitle) {\r\n return {\r\n id: preset.toString(),\r\n title,\r\n subtitle,\r\n type: 'action',\r\n commands: [\r\n {\r\n commandName: 'setWindowLevel',\r\n commandOptions: {\r\n ...windowLevelPresets[preset],\r\n },\r\n context: 'CORNERSTONE',\r\n },\r\n ],\r\n };\r\n}\r\n\r\nconst toolbarButtons = [\r\n // Measurement\r\n {\r\n id: 'MeasurementTools',\r\n type: 'ohif.splitButton',\r\n props: {\r\n groupId: 'MeasurementTools',\r\n isRadio: true, // ?\r\n // Switch?\r\n primary: _createToolButton(\r\n 'Length',\r\n 'tool-length',\r\n 'Length',\r\n [\r\n {\r\n commandName: 'setToolActive',\r\n commandOptions: {\r\n toolName: 'Length',\r\n },\r\n context: 'CORNERSTONE',\r\n },\r\n ],\r\n 'Length'\r\n ),\r\n secondary: {\r\n icon: 'chevron-down',\r\n label: '',\r\n isActive: true,\r\n tooltip: 'More Measure Tools',\r\n },\r\n items: [\r\n _createToolButton(\r\n 'Length',\r\n 'tool-length',\r\n 'Length',\r\n [\r\n {\r\n commandName: 'setToolActive',\r\n commandOptions: {\r\n toolName: 'Length',\r\n },\r\n context: 'CORNERSTONE',\r\n },\r\n ],\r\n 'Length Tool'\r\n ),\r\n _createToolButton(\r\n 'Bidirectional',\r\n 'tool-bidirectional',\r\n 'Bidirectional',\r\n [\r\n {\r\n commandName: 'setToolActive',\r\n commandOptions: {\r\n toolName: 'Bidirectional',\r\n },\r\n context: 'CORNERSTONE',\r\n },\r\n ],\r\n 'Bidirectional Tool'\r\n ),\r\n _createToolButton(\r\n 'EllipticalROI',\r\n 'tool-elipse',\r\n 'Ellipse',\r\n [\r\n {\r\n commandName: 'setToolActive',\r\n commandOptions: {\r\n toolName: 'EllipticalROI',\r\n },\r\n context: 'CORNERSTONE',\r\n },\r\n ],\r\n 'Ellipse Tool'\r\n ),\r\n _createToolButton(\r\n 'CircleROI',\r\n 'tool-circle',\r\n 'Circle',\r\n [\r\n {\r\n commandName: 'setToolActive',\r\n commandOptions: {\r\n toolName: 'CircleROI',\r\n },\r\n context: 'CORNERSTONE',\r\n },\r\n ],\r\n 'Circle Tool'\r\n ),\r\n ],\r\n },\r\n },\r\n // Zoom..\r\n {\r\n id: 'Zoom',\r\n type: 'ohif.radioGroup',\r\n props: {\r\n type: 'tool',\r\n icon: 'tool-zoom',\r\n label: 'Zoom',\r\n commands: [\r\n {\r\n commandName: 'setToolActive',\r\n commandOptions: {\r\n toolName: 'Zoom',\r\n },\r\n context: 'CORNERSTONE',\r\n },\r\n ],\r\n },\r\n },\r\n // Window Level + Presets...\r\n {\r\n id: 'WindowLevel',\r\n type: 'ohif.splitButton',\r\n props: {\r\n groupId: 'WindowLevel',\r\n primary: _createToolButton(\r\n 'WindowLevel',\r\n 'tool-window-level',\r\n 'Window Level',\r\n [\r\n {\r\n commandName: 'setToolActive',\r\n commandOptions: {\r\n toolName: 'WindowLevel',\r\n },\r\n context: 'CORNERSTONE',\r\n },\r\n ],\r\n 'Window Level'\r\n ),\r\n secondary: {\r\n icon: 'chevron-down',\r\n label: 'W/L Manual',\r\n isActive: true,\r\n tooltip: 'W/L Presets',\r\n },\r\n isAction: true, // ?\r\n renderer: WindowLevelMenuItem,\r\n items: [\r\n _createWwwcPreset(1, 'Soft tissue', '400 / 40'),\r\n _createWwwcPreset(2, 'Lung', '1500 / -600'),\r\n _createWwwcPreset(3, 'Liver', '150 / 90'),\r\n _createWwwcPreset(4, 'Bone', '2500 / 480'),\r\n _createWwwcPreset(5, 'Brain', '80 / 40'),\r\n ],\r\n },\r\n },\r\n // Pan...\r\n {\r\n id: 'Pan',\r\n type: 'ohif.radioGroup',\r\n props: {\r\n type: 'tool',\r\n icon: 'tool-move',\r\n label: 'Pan',\r\n commands: [\r\n {\r\n commandName: 'setToolActive',\r\n commandOptions: {\r\n toolName: 'Pan',\r\n },\r\n context: 'CORNERSTONE',\r\n },\r\n ],\r\n },\r\n },\r\n {\r\n id: 'Capture',\r\n type: 'ohif.action',\r\n props: {\r\n icon: 'tool-capture',\r\n label: 'Capture',\r\n type: 'action',\r\n commands: [\r\n {\r\n commandName: 'showDownloadViewportModal',\r\n commandOptions: {},\r\n context: 'CORNERSTONE',\r\n },\r\n ],\r\n },\r\n },\r\n {\r\n id: 'Layout',\r\n type: 'ohif.layoutSelector',\r\n },\r\n // More...\r\n {\r\n id: 'MoreTools',\r\n type: 'ohif.splitButton',\r\n props: {\r\n isRadio: true, // ?\r\n groupId: 'MoreTools',\r\n primary: _createActionButton(\r\n 'Reset',\r\n 'tool-reset',\r\n 'Reset View',\r\n [\r\n {\r\n commandName: 'resetViewport',\r\n commandOptions: {},\r\n context: 'CORNERSTONE',\r\n },\r\n ],\r\n 'Reset'\r\n ),\r\n secondary: {\r\n icon: 'chevron-down',\r\n label: '',\r\n isActive: true,\r\n tooltip: 'More Tools',\r\n },\r\n items: [\r\n _createActionButton(\r\n 'Reset',\r\n 'tool-reset',\r\n 'Reset View',\r\n [\r\n {\r\n commandName: 'resetViewport',\r\n commandOptions: {},\r\n context: 'CORNERSTONE',\r\n },\r\n ],\r\n 'Reset'\r\n ),\r\n _createActionButton(\r\n 'rotate-right',\r\n 'tool-rotate-right',\r\n 'Rotate Right',\r\n [\r\n {\r\n commandName: 'rotateViewportCW',\r\n commandOptions: {},\r\n context: 'CORNERSTONE',\r\n },\r\n ],\r\n 'Rotate +90'\r\n ),\r\n _createActionButton(\r\n 'flip-horizontal',\r\n 'tool-flip-horizontal',\r\n 'Flip Horizontally',\r\n [\r\n {\r\n commandName: 'flipViewportHorizontal',\r\n commandOptions: {},\r\n context: 'CORNERSTONE',\r\n },\r\n ],\r\n 'Flip Horizontal'\r\n ),\r\n _createToolButton(\r\n 'StackScroll',\r\n 'tool-stack-scroll',\r\n 'Stack Scroll',\r\n [\r\n {\r\n commandName: 'setToolActive',\r\n commandOptions: {\r\n toolName: 'StackScroll',\r\n },\r\n context: 'CORNERSTONE',\r\n },\r\n ],\r\n 'Stack Scroll'\r\n ),\r\n _createActionButton(\r\n 'invert',\r\n 'tool-invert',\r\n 'Invert',\r\n [\r\n {\r\n commandName: 'invertViewport',\r\n commandOptions: {},\r\n context: 'CORNERSTONE',\r\n },\r\n ],\r\n 'Invert Colors'\r\n ),\r\n _createToolButton(\r\n 'CalibrationLine',\r\n 'tool-calibration',\r\n 'Calibration',\r\n [\r\n {\r\n commandName: 'setToolActive',\r\n commandOptions: {\r\n toolName: 'CalibrationLine',\r\n },\r\n context: 'CORNERSTONE',\r\n },\r\n ],\r\n 'Calibration Line'\r\n ),\r\n ],\r\n },\r\n },\r\n];\r\n\r\nexport default toolbarButtons;\r\n","import packageJson from '../package.json';\r\n\r\nconst id = packageJson.name;\r\n\r\nexport { id };\r\n","import toolbarButtons from './toolbarButtons.js';\r\nimport { hotkeys } from '@ohif/core';\r\nimport { id } from './id';\r\n\r\nconst configs = {\r\n Length: {},\r\n //\r\n};\r\n\r\nconst ohif = {\r\n layout: '@ohif/extension-default.layoutTemplateModule.viewerLayout',\r\n sopClassHandler: '@ohif/extension-default.sopClassHandlerModule.stack',\r\n measurements: '@ohif/extension-default.panelModule.measure',\r\n thumbnailList: '@ohif/extension-default.panelModule.seriesList',\r\n};\r\n\r\nconst cs3d = {\r\n viewport: '@ohif/extension-cornerstone.viewportModule.cornerstone',\r\n};\r\n\r\nconst dicomsr = {\r\n sopClassHandler: '@ohif/extension-cornerstone-dicom-sr.sopClassHandlerModule.dicom-sr',\r\n viewport: '@ohif/extension-cornerstone-dicom-sr.viewportModule.dicom-sr',\r\n};\r\n\r\nconst dicomvideo = {\r\n sopClassHandler: '@ohif/extension-dicom-video.sopClassHandlerModule.dicom-video',\r\n viewport: '@ohif/extension-dicom-video.viewportModule.dicom-video',\r\n};\r\n\r\nconst dicompdf = {\r\n sopClassHandler: '@ohif/extension-dicom-pdf.sopClassHandlerModule.dicom-pdf',\r\n viewport: '@ohif/extension-dicom-pdf.viewportModule.dicom-pdf',\r\n};\r\n\r\nconst extensionDependencies = {\r\n '@ohif/extension-default': '^3.0.0',\r\n '@ohif/extension-cornerstone': '^3.0.0',\r\n '@ohif/extension-cornerstone-dicom-sr': '^3.0.0',\r\n '@ohif/extension-dicom-pdf': '^3.0.1',\r\n '@ohif/extension-dicom-video': '^3.0.1',\r\n};\r\n\r\nfunction modeFactory({ modeConfiguration }) {\r\n return {\r\n id,\r\n routeName: 'dev',\r\n displayName: 'Basic Dev Viewer',\r\n /**\r\n * Lifecycle hooks\r\n */\r\n onModeEnter: ({ servicesManager, extensionManager }) => {\r\n const { toolbarService, toolGroupService } = servicesManager.services;\r\n const utilityModule = extensionManager.getModuleEntry(\r\n '@ohif/extension-cornerstone.utilityModule.tools'\r\n );\r\n\r\n const { toolNames, Enums } = utilityModule.exports;\r\n\r\n const tools = {\r\n active: [\r\n {\r\n toolName: toolNames.WindowLevel,\r\n bindings: [{ mouseButton: Enums.MouseBindings.Primary }],\r\n },\r\n {\r\n toolName: toolNames.Pan,\r\n bindings: [{ mouseButton: Enums.MouseBindings.Auxiliary }],\r\n },\r\n {\r\n toolName: toolNames.Zoom,\r\n bindings: [{ mouseButton: Enums.MouseBindings.Secondary }],\r\n },\r\n { toolName: toolNames.StackScrollMouseWheel, bindings: [] },\r\n ],\r\n passive: [\r\n { toolName: toolNames.Length },\r\n { toolName: toolNames.Bidirectional },\r\n { toolName: toolNames.Probe },\r\n { toolName: toolNames.EllipticalROI },\r\n { toolName: toolNames.CircleROI },\r\n { toolName: toolNames.RectangleROI },\r\n { toolName: toolNames.StackScroll },\r\n { toolName: toolNames.CalibrationLine },\r\n ],\r\n // enabled\r\n enabled: [{ toolName: toolNames.ImageOverlayViewer }],\r\n // disabled\r\n };\r\n\r\n const toolGroupId = 'default';\r\n toolGroupService.createToolGroupAndAddTools(toolGroupId, tools);\r\n\r\n let unsubscribe;\r\n\r\n const activateTool = () => {\r\n toolbarService.recordInteraction({\r\n groupId: 'WindowLevel',\r\n interactionType: 'tool',\r\n commands: [\r\n {\r\n commandName: 'setToolActive',\r\n commandOptions: {\r\n toolName: 'WindowLevel',\r\n },\r\n context: 'CORNERSTONE',\r\n },\r\n ],\r\n });\r\n\r\n // We don't need to reset the active tool whenever a viewport is getting\r\n // added to the toolGroup.\r\n unsubscribe();\r\n };\r\n\r\n // Since we only have one viewport for the basic cs3d mode and it has\r\n // only one hanging protocol, we can just use the first viewport\r\n ({ unsubscribe } = toolGroupService.subscribe(\r\n toolGroupService.EVENTS.VIEWPORT_ADDED,\r\n activateTool\r\n ));\r\n\r\n toolbarService.init(extensionManager);\r\n toolbarService.addButtons(toolbarButtons);\r\n toolbarService.createButtonSection('primary', [\r\n 'MeasurementTools',\r\n 'Zoom',\r\n 'WindowLevel',\r\n 'Pan',\r\n 'Layout',\r\n 'MoreTools',\r\n ]);\r\n },\r\n onModeExit: ({ servicesManager }) => {\r\n const { toolGroupService, measurementService, toolbarService } = servicesManager.services;\r\n\r\n toolGroupService.destroy();\r\n },\r\n validationTags: {\r\n study: [],\r\n series: [],\r\n },\r\n isValidMode: ({ modalities }) => {\r\n const modalities_list = modalities.split('\\\\');\r\n\r\n // Slide Microscopy modality not supported by basic mode yet\r\n return !modalities_list.includes('SM');\r\n },\r\n routes: [\r\n {\r\n path: 'viewer-cs3d',\r\n /*init: ({ servicesManager, extensionManager }) => {\r\n //defaultViewerRouteInit\r\n },*/\r\n layoutTemplate: ({ location, servicesManager }) => {\r\n return {\r\n id: ohif.layout,\r\n props: {\r\n // TODO: Should be optional, or required to pass empty array for slots?\r\n leftPanels: [ohif.thumbnailList],\r\n rightPanels: [ohif.measurements],\r\n viewports: [\r\n {\r\n namespace: cs3d.viewport,\r\n displaySetsToDisplay: [ohif.sopClassHandler],\r\n },\r\n {\r\n namespace: dicomvideo.viewport,\r\n displaySetsToDisplay: [dicomvideo.sopClassHandler],\r\n },\r\n {\r\n namespace: dicompdf.viewport,\r\n displaySetsToDisplay: [dicompdf.sopClassHandler],\r\n },\r\n ],\r\n },\r\n };\r\n },\r\n },\r\n ],\r\n extensions: extensionDependencies,\r\n hangingProtocol: 'default',\r\n sopClassHandlers: [\r\n dicomvideo.sopClassHandler,\r\n ohif.sopClassHandler,\r\n dicompdf.sopClassHandler,\r\n dicomsr.sopClassHandler,\r\n ],\r\n hotkeys: [...hotkeys.defaults.hotkeyBindings],\r\n };\r\n}\r\n\r\nconst mode = {\r\n id,\r\n modeFactory,\r\n extensionDependencies,\r\n};\r\n\r\nexport default mode;\r\n"],"names":["windowLevelPresets","defaults","_createButton","type","id","icon","label","commands","tooltip","_createActionButton","bind","_createToolButton","_createWwwcPreset","preset","title","subtitle","toString","commandName","commandOptions","context","props","groupId","isRadio","primary","toolName","secondary","isActive","items","isAction","renderer","WindowLevelMenuItem","packageJson","ohif","cs3d","dicomsr","dicomvideo","dicompdf","extensionDependencies","modeFactory","_ref","modeConfiguration","routeName","displayName","onModeEnter","_ref2","servicesManager","extensionManager","toolbarService","toolGroupService","services","utilityModule","getModuleEntry","toolNames","Enums","exports","tools","active","WindowLevel","bindings","mouseButton","MouseBindings","Primary","Pan","Auxiliary","Zoom","Secondary","StackScrollMouseWheel","passive","Length","Bidirectional","Probe","EllipticalROI","CircleROI","RectangleROI","StackScroll","CalibrationLine","enabled","ImageOverlayViewer","unsubscribe","createToolGroupAndAddTools","subscribe","EVENTS","VIEWPORT_ADDED","activateTool","recordInteraction","interactionType","init","addButtons","toolbarButtons","createButtonSection","onModeExit","_ref3","measurementService","destroy","validationTags","study","series","isValidMode","_ref4","modalities","split","includes","routes","path","layoutTemplate","_ref5","location","leftPanels","rightPanels","viewports","namespace","displaySetsToDisplay","extensions","hangingProtocol","sopClassHandlers","hotkeys","hotkeyBindings"],"sourceRoot":""} \ No newline at end of file diff --git a/resources/417.bundle.0ec0dae1d39259a03193.js b/resources/417.bundle.0ec0dae1d39259a03193.js new file mode 100644 index 0000000..777b634 --- /dev/null +++ b/resources/417.bundle.0ec0dae1d39259a03193.js @@ -0,0 +1,2 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[417],{15747:(e,t,i)=>{i.d(t,{d:()=>u});class r{constructor(e){this.fullDate=e}getTimeInSec(){const e=this.fullDate.substring(0,10),t=this.fullDate.substring(11,28),i=parseInt(e.substring(0,4),10),r=e.length>=7?parseInt(e.substring(5,7),10):void 0,n=e.length>=10?parseInt(e.substring(8,10),10):void 0;if(isNaN(i)||void 0!==r&&isNaN(r)||void 0!==n&&isNaN(n)||i>3e3||r&&(r<1||r>12)||n&&(n<1||n>31))throw new Error(`invalid date '${e}'`);const o=new Date(`${e}T00:00:00.000000Z`),a=parseInt(t.substring(0,2),10),s=t.length>=5?parseInt(t.substring(3,5),10):void 0,l=t.length>=8?parseInt(t.substring(6,8),10):void 0,c=t.substring(9,15),u=c?parseInt(c,10)*Math.pow(10,-c.length):void 0;if(isNaN(a)||void 0!==s&&isNaN(s)||void 0!==l&&isNaN(l)||void 0!==u&&isNaN(u)||a<0||a>23||s&&(s<0||s>59)||l&&(l<0||l>59)||u&&(u<0||u>999999))throw new Error(`invalid time '${t}'`);let d=o.getTime()/1e3;return d+=3600*a,void 0!==s&&(d+=60*s),void 0!==l&&(d+=l),void 0!==u&&(d+=u),d}getTimeInMicroSec(){return 1e6*this.getTimeInSec()}}function n(e,t){const i=`${t.hours||"00"}`.padStart(2,"0"),n=`${t.minutes||"00"}`.padStart(2,"0"),o=`${t.seconds||"00"}`.padStart(2,"0"),a=`${e.month}`.padStart(2,"0"),s=`${e.day}`.padStart(2,"0"),l=`${t.fractionalSeconds||"000000"}`.padEnd(6,"0"),c=`${e.year}-${a}-${s}`;return new r(`${c}${`T${i}:${n}:${o}.${l}Z`}`)}function o(e){if(null==e||8!==e.length||"string"!=typeof e)throw new Error(`invalid DA '${e}'`);const t=parseInt(e.substring(0,4),10),i=parseInt(e.substring(4,6),10),r=parseInt(e.substring(6,8),10);if(!0!=(n=r,o=i,a=t,!isNaN(a)&&o>0&&o<=12&&n>0&&n<=function(e,t){switch(e){case 2:return t%4==0&&t%100||t%400==0?29:28;case 9:case 4:case 6:case 11:return 30;default:return 31}}(o,a)))throw new Error(`invalid DA '${e}'`);var n,o,a;return{year:t,month:i,day:r}}function a(e){if(null==e||e.length<2||"string"!=typeof e)throw new Error(`invalid TM '${e}'`);const t=parseInt(e.substring(0,2),10),i=e.length>=4?parseInt(e.substring(2,4),10):void 0,r=e.length>=6?parseInt(e.substring(4,6),10):void 0,n=e.length>=8?e.substring(7,13):void 0,o=n?parseInt(n,10)*Math.pow(10,6-n.length):void 0;if(isNaN(t)||void 0!==i&&isNaN(i)||void 0!==r&&isNaN(r)||void 0!==o&&isNaN(o)||t<0||t>23||i&&(i<0||i>59)||r&&(r<0||r>59)||o&&(o<0||o>999999))throw new Error(`invalid TM '${e}'`);return{hours:t,minutes:i,seconds:r,fractionalSeconds:o}}function s(e){if(null==e)throw new Error("dateTimeToFullDateInterface : dateTime not defined.");return n(o(e.substring(0,8)),a(e.substring(8)))}function l(e){const{RadionuclideTotalDose:t,RadionuclideHalfLife:i,RadiopharmaceuticalStartDateTime:l,RadiopharmaceuticalStartTime:c,SeriesDate:u}=e[0];if(null==t)throw new Error("calculateDecayCorrection : RadionuclideTotalDose value not found.");if(null==i)throw new Error("calculateDecayCorrection : RadionuclideHalfLife value not found.");const d=function(e){const{SeriesDate:t,SeriesTime:i,GEPrivatePostInjectionDateTime:l}=e[0],c=new Array(e.length),u=n(o(t),a(i));let d=new r("3000-01-01T00:00:00.000000Z"),f=d.getTimeInSec();if(e.forEach((e=>{const{AcquisitionDate:t,AcquisitionTime:i}=e,r=n(o(t),a(i));d=d.getTimeInSec()>=f||r.getTimeInSec()=f)throw new Error("Earliest acquisition time or date could not be parsed.");return u.getTimeInSec()<=d.getTimeInSec()?c.fill(u):l?c.fill(s(l)):c.fill(d)}(e),f=function(e){const{RadiopharmaceuticalStartDateTime:t,RadiopharmaceuticalStartTime:i,SeriesDate:r}=e;let l,c;if(t)return s(t);if(i&&r)return l=a(i),c=o(r),n(c,l);throw new Error(`Invalid input: ${e}`)}({RadiopharmaceuticalStartDateTime:l,RadiopharmaceuticalStartTime:c,SeriesDate:u});return e.map(((e,r)=>{const n=d[r].getTimeInSec()-f.getTimeInSec();if(n<0)throw new Error("Decay time cannot be less than zero");return 1/(t*Math.pow(2,-n/i))}))}const c=(e,t)=>e===t||Array.isArray(e)&&Array.isArray(t)&&e.length===t.length&&e.every(((e,i)=>e===t[i]));function u(e){const{CorrectedImage:t,Units:i,PhilipsPETPrivateGroup:r,PatientWeight:n,PatientSex:o,PatientSize:a}=e[0];if(!t.includes("ATTN")||!t.includes("DECY"))throw new Error(`CorrectedImage must contain "ATTN" and "DECY": ${t}`);if(!e.every((r=>r.Units===i&&c(r.CorrectedImage,t)&&r.PatientWeight===n&&r.PatientSex===o&&r.PatientSize===a&&r.RadionuclideHalfLife===e[0].RadionuclideHalfLife&&r.RadionuclideTotalDose===e[0].RadionuclideTotalDose&&r.DecayCorrection===e[0].DecayCorrection&&r.SeriesDate===e[0].SeriesDate&&r.SeriesTime===e[0].SeriesTime)))throw new Error("The set of instances does not appear to come from one Series. Every instance must have identical values for series-level metadata properties");if(!n)throw new Error("PatientWeight value is missing. It is not possible to calculate the SUV factors");let s=new Array(e.length);s=l(e);let u=new Array(e.length);const d=1e3*n;if("BQML"===i)u=s.map((function(e){return e*d}));else if("CNTS"===i){const t=e.every((e=>{var t,i,r;return e.PhilipsPETPrivateGroup&&null!==(null===(t=e.PhilipsPETPrivateGroup)||void 0===t?void 0:t.SUVScaleFactor)&&void 0!==(null===(i=e.PhilipsPETPrivateGroup)||void 0===i?void 0:i.SUVScaleFactor)&&0!==(null===(r=e.PhilipsPETPrivateGroup)||void 0===r?void 0:r.SUVScaleFactor)})),i=e.every((e=>{var t,i,r;return e.PhilipsPETPrivateGroup&&!(null!==(t=e.PhilipsPETPrivateGroup)&&void 0!==t&&t.SUVScaleFactor)&&void 0!==(null===(i=e.PhilipsPETPrivateGroup)||void 0===i?void 0:i.ActivityConcentrationScaleFactor)&&0!==(null===(r=e.PhilipsPETPrivateGroup)||void 0===r?void 0:r.ActivityConcentrationScaleFactor)}));if(t)u=e.map((e=>e.PhilipsPETPrivateGroup.SUVScaleFactor));else{if(!i)throw new Error(`Units are in CNTS, but PhilipsPETPrivateGroup has invalid values: ${JSON.stringify(r)}`);u=e.map(((e,t)=>e.PhilipsPETPrivateGroup.ActivityConcentrationScaleFactor*s[t]*d))}}else{if("GML"!==i)throw new Error(`Units has an invalid value: ${i}`);u.fill(1)}let f,h,p;if(null==a)console.warn("PatientSize value is missing. It is not possible to calculate the SUV bsa factors");else{f=function(e){const{PatientWeight:t,PatientSize:i}=e;return Math.pow(t,.425)*Math.pow(100*i,.725)*71.84}({PatientWeight:n,PatientSize:a})}if(null==a)console.warn("PatientSize value is missing. It is not possible to calculate the SUV lbm factors");else if(null==o)console.warn("PatientSex value is missing. It is not possible to calculate the SUV lbm factors");else{const e={PatientWeight:n,PatientSex:o,PatientSize:a};h=function(e){const{PatientSex:t,PatientWeight:i,PatientSize:r}=e;let n;const o=Math.pow(i/(100*r),2);if("F"===t)n=1.07*i-148*o;else{if("M"!==t)throw new Error(`PatientSex is an invalid value: ${t}`);n=1.1*i-120*o}return 1e3*n}(e),p=function(e){const{PatientSex:t,PatientWeight:i,PatientSize:r}=e;let n;const o=i/Math.pow(r,2);if("F"===t)n=9270*i/(8780+244*o);else{if("M"!==t)throw new Error(`PatientSex is an invalid value: ${t}`);n=9270*i/(6680+216*o)}return 1e3*n}(e)}return u.map((function(e,t){const i={suvbw:e};return f&&(i.suvbsa=s[t]*f),h&&(i.suvlbm=s[t]*h),p&&(i.suvlbmJanma=s[t]*p),i}))}},94614:(e,t,i)=>{i.d(t,{S_:()=>T});var r=i(76805),n=i(80107),o=i(84067),a=i(25539),s=i(43001),l=(i(8339),"object"==typeof performance&&"function"==typeof performance.now?function(){return performance.now()}:function(){return Date.now()});function c(e){cancelAnimationFrame(e.id)}function u(e,t){var i=l();var r={id:requestAnimationFrame((function n(){l()-i>=t?e.call(null):r.id=requestAnimationFrame(n)}))};return r}var d=-1;function f(e){if(void 0===e&&(e=!1),-1===d||e){var t=document.createElement("div"),i=t.style;i.width="50px",i.height="50px",i.overflow="scroll",document.body.appendChild(t),d=t.offsetWidth-t.clientWidth,document.body.removeChild(t)}return d}var h=null;function p(e){if(void 0===e&&(e=!1),null===h||e){var t=document.createElement("div"),i=t.style;i.width="50px",i.height="50px",i.overflow="scroll",i.direction="rtl";var r=document.createElement("div"),n=r.style;return n.width="100px",n.height="100px",t.appendChild(r),document.body.appendChild(t),t.scrollLeft>0?h="positive-descending":(t.scrollLeft=1,h=0===t.scrollLeft?"negative":"positive-ascending"),document.body.removeChild(t),h}return h}var v=function(e,t){return e};function m(e){var t,i=e.getItemOffset,l=e.getEstimatedTotalSize,d=e.getItemSize,h=e.getOffsetForIndexAndAlignment,m=e.getStartIndexForOffset,S=e.getStopIndexForStartIndex,I=e.initInstanceProps,w=e.shouldResetStyleCacheOnItemSizeChange,P=e.validateProps;return t=function(e){function t(t){var r;return(r=e.call(this,t)||this)._instanceProps=I(r.props,(0,n.Z)(r)),r._outerRef=void 0,r._resetIsScrollingTimeoutId=null,r.state={instance:(0,n.Z)(r),isScrolling:!1,scrollDirection:"forward",scrollOffset:"number"==typeof r.props.initialScrollOffset?r.props.initialScrollOffset:0,scrollUpdateWasRequested:!1},r._callOnItemsRendered=void 0,r._callOnItemsRendered=(0,a.Z)((function(e,t,i,n){return r.props.onItemsRendered({overscanStartIndex:e,overscanStopIndex:t,visibleStartIndex:i,visibleStopIndex:n})})),r._callOnScroll=void 0,r._callOnScroll=(0,a.Z)((function(e,t,i){return r.props.onScroll({scrollDirection:e,scrollOffset:t,scrollUpdateWasRequested:i})})),r._getItemStyle=void 0,r._getItemStyle=function(e){var t,n=r.props,o=n.direction,a=n.itemSize,s=n.layout,l=r._getItemStyleCache(w&&a,w&&s,w&&o);if(l.hasOwnProperty(e))t=l[e];else{var c=i(r.props,e,r._instanceProps),u=d(r.props,e,r._instanceProps),f="horizontal"===o||"horizontal"===s,h="rtl"===o,p=f?c:0;l[e]=t={position:"absolute",left:h?void 0:p,right:h?p:void 0,top:f?0:c,height:f?"100%":u,width:f?u:"100%"}}return t},r._getItemStyleCache=void 0,r._getItemStyleCache=(0,a.Z)((function(e,t,i){return{}})),r._onScrollHorizontal=function(e){var t=e.currentTarget,i=t.clientWidth,n=t.scrollLeft,o=t.scrollWidth;r.setState((function(e){if(e.scrollOffset===n)return null;var t=r.props.direction,a=n;if("rtl"===t)switch(p()){case"negative":a=-n;break;case"positive-descending":a=o-i-n}return a=Math.max(0,Math.min(a,o-i)),{isScrolling:!0,scrollDirection:e.scrollOffsets.clientWidth?f():0:s.scrollHeight>s.clientHeight?f():0}this.scrollTo(h(this.props,e,t,o,this._instanceProps,a))},T.componentDidMount=function(){var e=this.props,t=e.direction,i=e.initialScrollOffset,r=e.layout;if("number"==typeof i&&null!=this._outerRef){var n=this._outerRef;"horizontal"===t||"horizontal"===r?n.scrollLeft=i:n.scrollTop=i}this._callPropsCallbacks()},T.componentDidUpdate=function(){var e=this.props,t=e.direction,i=e.layout,r=this.state,n=r.scrollOffset;if(r.scrollUpdateWasRequested&&null!=this._outerRef){var o=this._outerRef;if("horizontal"===t||"horizontal"===i)if("rtl"===t)switch(p()){case"negative":o.scrollLeft=-n;break;case"positive-ascending":o.scrollLeft=n;break;default:var a=o.clientWidth,s=o.scrollWidth;o.scrollLeft=s-a-n}else o.scrollLeft=n;else o.scrollTop=n}this._callPropsCallbacks()},T.componentWillUnmount=function(){null!==this._resetIsScrollingTimeoutId&&c(this._resetIsScrollingTimeoutId)},T.render=function(){var e=this.props,t=e.children,i=e.className,n=e.direction,o=e.height,a=e.innerRef,c=e.innerElementType,u=e.innerTagName,d=e.itemCount,f=e.itemData,h=e.itemKey,p=void 0===h?v:h,m=e.layout,g=e.outerElementType,S=e.outerTagName,I=e.style,w=e.useIsScrolling,P=e.width,T=this.state.isScrolling,y="horizontal"===n||"horizontal"===m,b=y?this._onScrollHorizontal:this._onScrollVertical,_=this._getRangeToRender(),M=_[0],E=_[1],x=[];if(d>0)for(var D=M;D<=E;D++)x.push((0,s.createElement)(t,{data:f,key:p(D,f),index:D,isScrolling:w?T:void 0,style:this._getItemStyle(D)}));var R=l(this.props,this._instanceProps);return(0,s.createElement)(g||S||"div",{className:i,onScroll:b,ref:this._outerRefSetter,style:(0,r.Z)({position:"relative",height:o,width:P,overflow:"auto",WebkitOverflowScrolling:"touch",willChange:"transform",direction:n},I)},(0,s.createElement)(c||u||"div",{children:x,ref:a,style:{height:y?"100%":R,pointerEvents:T?"none":void 0,width:y?R:"100%"}}))},T._callPropsCallbacks=function(){if("function"==typeof this.props.onItemsRendered&&this.props.itemCount>0){var e=this._getRangeToRender(),t=e[0],i=e[1],r=e[2],n=e[3];this._callOnItemsRendered(t,i,r,n)}if("function"==typeof this.props.onScroll){var o=this.state,a=o.scrollDirection,s=o.scrollOffset,l=o.scrollUpdateWasRequested;this._callOnScroll(a,s,l)}},T._getRangeToRender=function(){var e=this.props,t=e.itemCount,i=e.overscanCount,r=this.state,n=r.isScrolling,o=r.scrollDirection,a=r.scrollOffset;if(0===t)return[0,0,0,0];var s=m(this.props,a,this._instanceProps),l=S(this.props,s,a,this._instanceProps),c=n&&"backward"!==o?1:Math.max(1,i),u=n&&"forward"!==o?1:Math.max(1,i);return[Math.max(0,s-c),Math.max(0,Math.min(t-1,l+u)),s,l]},t}(s.PureComponent),t.defaultProps={direction:"ltr",itemData:void 0,layout:"vertical",overscanCount:2,useIsScrolling:!1},t}var g=function(e,t){e.children,e.direction,e.height,e.layout,e.innerTagName,e.outerTagName,e.width,t.instance},S=function(e,t,i){var r=e.itemSize,n=i.itemMetadataMap,o=i.lastMeasuredIndex;if(t>o){var a=0;if(o>=0){var s=n[o];a=s.offset+s.size}for(var l=o+1;l<=t;l++){var c=r(l);n[l]={offset:a,size:c},a+=c}i.lastMeasuredIndex=t}return n[t]},I=function(e,t,i,r,n){for(;r<=i;){var o=r+Math.floor((i-r)/2),a=S(e,o,t).offset;if(a===n)return o;an&&(i=o-1)}return r>0?r-1:0},w=function(e,t,i,r){for(var n=e.itemCount,o=1;i=i&&(o=i-1),o>=0){var s=r[o];a=s.offset+s.size}return a+(i-o-1)*n},T=m({getItemOffset:function(e,t,i){return S(e,t,i).offset},getItemSize:function(e,t,i){return i.itemMetadataMap[t].size},getEstimatedTotalSize:P,getOffsetForIndexAndAlignment:function(e,t,i,r,n,o){var a=e.direction,s=e.height,l=e.layout,c=e.width,u="horizontal"===a||"horizontal"===l?c:s,d=S(e,t,n),f=P(e,n),h=Math.max(0,Math.min(f-u,d.offset)),p=Math.max(0,d.offset-u+d.size+o);switch("smart"===i&&(i=r>=p-u&&r<=h+u?"auto":"center"),i){case"start":return h;case"end":return p;case"center":return Math.round(p+(h-p)/2);default:return r>=p&&r<=h?r:r0?r[n].offset:0)>=i?I(e,t,n,0,i):w(e,t,Math.max(0,n),i)}(e,i,t)},getStopIndexForStartIndex:function(e,t,i,r){for(var n=e.direction,o=e.height,a=e.itemCount,s=e.layout,l=e.width,c="horizontal"===n||"horizontal"===s?l:o,u=S(e,t,r),d=i+c,f=u.offset+u.size,h=t;h= 7\n ? parseInt(dateString.substring(5, 7), 10)\n : undefined;\n const dd =\n dateString.length >= 10\n ? parseInt(dateString.substring(8, 10), 10)\n : undefined;\n\n if (\n isNaN(yyyy) ||\n (mm !== undefined && isNaN(mm)) ||\n (dd !== undefined && isNaN(dd)) ||\n yyyy > 3000 ||\n (mm && (mm < 1 || mm > 12)) ||\n (dd && (dd < 1 || dd > 31))\n ) {\n throw new Error(`invalid date '${dateString}'`);\n }\n\n const dateJS = new Date(`${dateString}T00:00:00.000000Z`);\n\n // HHMMSS.FFFFFF\n const HH = parseInt(timeString.substring(0, 2), 10);\n const MM =\n timeString.length >= 5\n ? parseInt(timeString.substring(3, 5), 10)\n : undefined;\n const SS =\n timeString.length >= 8\n ? parseInt(timeString.substring(6, 8), 10)\n : undefined;\n const fractionalStr = timeString.substring(9, 15);\n const FFFFFF = fractionalStr\n ? parseInt(fractionalStr, 10) * Math.pow(10, -fractionalStr.length)\n : undefined;\n\n if (\n isNaN(HH) ||\n (MM !== undefined && isNaN(MM)) ||\n (SS !== undefined && isNaN(SS)) ||\n (FFFFFF !== undefined && isNaN(FFFFFF)) ||\n HH < 0 ||\n HH > 23 ||\n (MM && (MM < 0 || MM > 59)) ||\n (SS && (SS < 0 || SS > 59)) ||\n (FFFFFF && (FFFFFF < 0 || FFFFFF > 999999))\n ) {\n throw new Error(`invalid time '${timeString}'`);\n }\n\n let timeInSec = dateJS.getTime() / 1000;\n\n timeInSec += HH * 3600;\n if (MM !== undefined) {\n timeInSec += MM * 60;\n }\n if (SS !== undefined) {\n timeInSec += SS;\n }\n if (FFFFFF !== undefined) {\n timeInSec += FFFFFF;\n }\n\n return timeInSec;\n }\n\n /**\n * returns time since 1 january 1970\n *\n * @returns {number} time in microsec\n * @memberof FullDateInterface\n */\n getTimeInMicroSec(): number {\n const timeInMicroSec = this.getTimeInSec() * 1e6;\n return timeInMicroSec;\n }\n}\n\nexport interface FullDateInterface {\n date: string;\n}\n\n/**\n * Combines two javascript objects containing the date and time information\n *\n * @export\n * @param {DateInterface} date\n * @param {TimeInterface} time\n * @returns {FullDateInterface}\n */\nexport default function combineDateTime(\n date: DateInterface,\n time: TimeInterface\n): FullDateInterface {\n const hours = `${time.hours || '00'}`.padStart(2, '0');\n const minutes = `${time.minutes || '00'}`.padStart(2, '0');\n const seconds = `${time.seconds || '00'}`.padStart(2, '0');\n const month = `${date.month}`.padStart(2, '0');\n const day = `${date.day}`.padStart(2, '0');\n const fractionalSeconds = `${time.fractionalSeconds || '000000'}`.padEnd(\n 6,\n '0'\n );\n const dateString = `${date.year}-${month}-${day}`;\n const timeString = `T${hours}:${minutes}:${seconds}.${fractionalSeconds}Z`;\n const fullDateString = `${dateString}${timeString}`;\n\n return new FullDateInterface(fullDateString);\n}\n\nexport { combineDateTime };\n","/**\n * Check the number of days for a picked month and year\n * algorithm based on http://stackoverflow.com/questions/1433030/validate-number-of-days-in-a-given-month\n *\n * @param {number} m\n * @param {number} y\n * @returns {number} number of days\n */\nfunction daysInMonth(m: number, y: number): number {\n // m is 0 indexed: 0-11\n switch (m) {\n case 2:\n return (y % 4 === 0 && y % 100) || y % 400 === 0 ? 29 : 28;\n case 9:\n case 4:\n case 6:\n case 11:\n return 30;\n default:\n return 31;\n }\n}\n\n/**\n * Check if the date is valid\n *\n * @param {number} d\n * @param {number} m\n * @param {number} y\n * @returns {boolean} boolean result\n */\nfunction isValidDate(d: number, m: number, y: number): boolean {\n // make year is a number\n if (isNaN(y)) {\n return false;\n }\n\n return m > 0 && m <= 12 && d > 0 && d <= daysInMonth(m, y);\n}\n\n/**\n * Javascript object with properties year, month and day\n *\n * @export\n * @interface DateInterface\n */\nexport interface DateInterface {\n year: number;\n month: number;\n day: number;\n}\n\n/**\n * Parses a DA formatted string into a Javascript object\n * @param {string} date a string in the DA VR format\n * @param {boolean} [validate] - true if an exception should be thrown if the date is invalid\n * @returns {DateInterface} Javascript object with properties year, month and day or undefined if not present or not 8 bytes long\n */\nexport default function parseDA(date: string): DateInterface {\n if (\n date === undefined ||\n date === null ||\n date.length !== 8 ||\n typeof date !== 'string'\n ) {\n throw new Error(`invalid DA '${date}'`);\n }\n\n const yyyy = parseInt(date.substring(0, 4), 10);\n const mm = parseInt(date.substring(4, 6), 10);\n const dd = parseInt(date.substring(6, 8), 10);\n\n if (isValidDate(dd, mm, yyyy) !== true) {\n throw new Error(`invalid DA '${date}'`);\n }\n\n return {\n year: yyyy,\n month: mm,\n day: dd,\n };\n}\n\nexport { parseDA };\n","/**\n * Javascript object with properties for hours, minutes, seconds and fractionalSeconds\n *\n * @export\n * @interface TimeInterface\n */\nexport interface TimeInterface {\n hours?: number;\n minutes?: number;\n seconds?: number;\n fractionalSeconds?: number;\n}\n\n/**\n * Parses a TM formatted string into a javascript object with properties for hours, minutes, seconds and fractionalSeconds\n * @param {string} time - a string in the TM VR format\n * @returns {string} javascript object with properties for hours, minutes, seconds and fractionalSeconds or undefined if no element or data. Missing fields are set to undefined\n */\nexport default function parseTM(time: string): TimeInterface {\n if (\n time === null ||\n time === undefined ||\n time.length < 2 ||\n typeof time !== 'string'\n ) {\n // must at least have HH\n throw new Error(`invalid TM '${time}'`);\n }\n\n // 0123456789\n // HHMMSS.FFFFFF\n const hh = parseInt(time.substring(0, 2), 10);\n const mm = time.length >= 4 ? parseInt(time.substring(2, 4), 10) : undefined;\n const ss = time.length >= 6 ? parseInt(time.substring(4, 6), 10) : undefined;\n const fractionalStr = time.length >= 8 ? time.substring(7, 13) : undefined;\n const ffffff = fractionalStr\n ? parseInt(fractionalStr, 10) * Math.pow(10, 6 - fractionalStr.length)\n : undefined;\n\n if (\n isNaN(hh) ||\n (mm !== undefined && isNaN(mm)) ||\n (ss !== undefined && isNaN(ss)) ||\n (ffffff !== undefined && isNaN(ffffff)) ||\n hh < 0 ||\n hh > 23 ||\n (mm && (mm < 0 || mm > 59)) ||\n (ss && (ss < 0 || ss > 59)) ||\n (ffffff && (ffffff < 0 || ffffff > 999999))\n ) {\n throw new Error(`invalid TM '${time}'`);\n }\n\n return {\n hours: hh,\n minutes: mm,\n seconds: ss,\n fractionalSeconds: ffffff,\n };\n}\n\nexport { parseTM };\n","import combineDateTime, { FullDateInterface } from './combineDateTime';\nimport parseDA from './parseDA';\nimport parseTM from './parseTM';\n\n/**\n * Utility to create a FullDateInterface object given a string formatted as yyyy-mm-ddTHH:MM:SS.FFFFFFZ\n *\n * @export\n * @param {string} dateTime\n * @returns {FullDateInterface}\n */\nexport default function dateTimeToFullDateInterface(\n dateTime: string\n): FullDateInterface {\n if (dateTime === undefined || dateTime === null) {\n throw new Error('dateTimeToFullDateInterface : dateTime not defined.');\n }\n\n const date = parseDA(dateTime.substring(0, 8));\n const time = parseTM(dateTime.substring(8));\n return combineDateTime(date, time);\n}\n\nexport { dateTimeToFullDateInterface };\n","import { FullDateInterface } from './combineDateTime';\nimport { calculateScanTimes } from './calculateScanTimes';\nimport {\n calculateSUVlbmJanmahasatianScalingFactor,\n calculateSUVlbmScalingFactor,\n SUVlbmScalingFactorInput,\n} from './calculateSUVlbmScalingFactor';\nimport {\n calculateSUVbsaScalingFactor,\n SUVbsaScalingFactorInput,\n} from './calculateSUVbsaScalingFactor';\nimport { calculateStartTime } from './calculateStartTime';\nimport { InstanceMetadata } from './types';\n\n/**\n * Javascript object containing the SUV and SUL factors.\n * TODO, the result property names may changes\n *\n * @interface ScalingFactorResult\n */\ninterface ScalingFactorResult {\n suvbw: number;\n suvlbm?: number;\n suvlbmJanma?: number;\n suvbsa?: number;\n}\n\n/**\n * The injected dose used to calculate SUV is corrected for the\n * decay that occurs between the time of injection and the start of the scan\n *\n * @param {InstanceMetadata[]} instances\n * @returns {number[]}\n */\nfunction calculateDecayCorrection(instances: InstanceMetadata[]): number[] {\n const {\n RadionuclideTotalDose,\n RadionuclideHalfLife,\n RadiopharmaceuticalStartDateTime,\n RadiopharmaceuticalStartTime,\n SeriesDate,\n } = instances[0];\n\n if (RadionuclideTotalDose === undefined || RadionuclideTotalDose === null) {\n throw new Error(\n 'calculateDecayCorrection : RadionuclideTotalDose value not found.'\n );\n }\n\n if (RadionuclideHalfLife === undefined || RadionuclideHalfLife === null) {\n throw new Error(\n 'calculateDecayCorrection : RadionuclideHalfLife value not found.'\n );\n }\n\n const scanTimes: FullDateInterface[] = calculateScanTimes(instances);\n const startTime: FullDateInterface = calculateStartTime({\n RadiopharmaceuticalStartDateTime,\n RadiopharmaceuticalStartTime,\n SeriesDate,\n });\n\n return instances.map((_, index) => {\n const scanTime = scanTimes[index];\n const decayTimeInSec: number =\n scanTime.getTimeInSec() - startTime.getTimeInSec();\n if (decayTimeInSec < 0) {\n throw new Error('Decay time cannot be less than zero');\n }\n\n const decayedDose: number =\n RadionuclideTotalDose *\n Math.pow(2, -decayTimeInSec / RadionuclideHalfLife);\n\n return 1 / decayedDose;\n });\n}\n\n/**\n *\n * @param a Simple value or array of simple values\n * @param b Simple value or array of simple values\n * @returns boolean true if the values are equal.\n */\nconst deepEquals = (\n a: string | number | any[],\n b: string | number | any[]\n): boolean => {\n return (\n a === b ||\n (Array.isArray(a) &&\n Array.isArray(b) &&\n a.length === b.length &&\n a.every((val, index) => val === b[index]))\n );\n};\n\n/**\n * Calculate the SUV factor\n *\n * Note: Rescale Slope / Intercept must still be applied. These must be applied\n * on a per-Frame basis, since some scanners may have different values per Frame.\n *\n * @export\n * @param {InstanceMetadata[]} instances\n * @returns {ScalingFactorResult[]}\n */\nexport default function calculateSUVScalingFactors(\n instances: InstanceMetadata[]\n): ScalingFactorResult[] {\n const {\n CorrectedImage,\n Units,\n PhilipsPETPrivateGroup,\n PatientWeight,\n PatientSex,\n PatientSize,\n } = instances[0];\n\n if (!CorrectedImage.includes('ATTN') || !CorrectedImage.includes('DECY')) {\n throw new Error(\n `CorrectedImage must contain \"ATTN\" and \"DECY\": ${CorrectedImage}`\n );\n }\n\n // Sanity check that every instance provided has identical\n // values for series-level metadata. If not, the provided\n // data is invalid.\n const isSingleSeries = instances.every(instance => {\n return (\n instance.Units === Units &&\n deepEquals(instance.CorrectedImage, CorrectedImage) &&\n instance.PatientWeight === PatientWeight &&\n instance.PatientSex === PatientSex &&\n instance.PatientSize === PatientSize &&\n instance.RadionuclideHalfLife === instances[0].RadionuclideHalfLife &&\n instance.RadionuclideTotalDose === instances[0].RadionuclideTotalDose &&\n instance.DecayCorrection === instances[0].DecayCorrection &&\n instance.SeriesDate === instances[0].SeriesDate &&\n instance.SeriesTime === instances[0].SeriesTime\n );\n });\n\n if (!isSingleSeries) {\n throw new Error(\n 'The set of instances does not appear to come from one Series. Every instance must have identical values for series-level metadata properties'\n );\n }\n\n // Treat null, undefined and zero as a missing PatientWeight.\n if (!PatientWeight) {\n throw new Error(\n 'PatientWeight value is missing. It is not possible to calculate the SUV factors'\n );\n }\n\n let decayCorrectionArray: number[] = new Array(instances.length);\n decayCorrectionArray = calculateDecayCorrection(instances);\n\n let results: number[] = new Array(instances.length);\n const weightInGrams: number = PatientWeight * 1000;\n\n if (Units === 'BQML') {\n results = decayCorrectionArray.map(function(value) {\n return value * weightInGrams;\n });\n } else if (Units === 'CNTS') {\n const hasValidSUVScaleFactor: boolean = instances.every(instance => {\n return (\n instance.PhilipsPETPrivateGroup &&\n instance.PhilipsPETPrivateGroup?.SUVScaleFactor !== null &&\n instance.PhilipsPETPrivateGroup?.SUVScaleFactor !== undefined &&\n instance.PhilipsPETPrivateGroup?.SUVScaleFactor !== 0\n );\n });\n\n const hasValidActivityConcentrationScaleFactor: boolean = instances.every(\n instance => {\n return (\n instance.PhilipsPETPrivateGroup &&\n !instance.PhilipsPETPrivateGroup?.SUVScaleFactor &&\n instance.PhilipsPETPrivateGroup?.ActivityConcentrationScaleFactor !==\n undefined &&\n instance.PhilipsPETPrivateGroup?.ActivityConcentrationScaleFactor !==\n 0\n );\n }\n );\n\n //console.log(`hasValidSUVScaleFactor: ${hasValidSUVScaleFactor}`);\n //console.log(`hasValidActivityConcentrationScaleFactor: ${hasValidActivityConcentrationScaleFactor}`);\n\n if (hasValidSUVScaleFactor) {\n results = instances.map(\n // Added ! to tell Typescript that this can't be undefined, since we are testing it\n // in the .every loop above.\n instance => instance.PhilipsPETPrivateGroup!.SUVScaleFactor!\n );\n } else if (hasValidActivityConcentrationScaleFactor) {\n // if (0x7053,0x1000) not present, but (0x7053,0x1009) is present, then (0x7053,0x1009) * Rescale Slope,\n // scales pixels to Bq/ml, and proceed as if Units are BQML\n results = instances.map((instance, index) => {\n // Added ! to tell Typescript that this can't be undefined, since we are testing it\n // in the .every loop above.\n return (\n instance.PhilipsPETPrivateGroup!.ActivityConcentrationScaleFactor! *\n decayCorrectionArray[index] *\n weightInGrams\n );\n });\n } else {\n throw new Error(\n `Units are in CNTS, but PhilipsPETPrivateGroup has invalid values: ${JSON.stringify(\n PhilipsPETPrivateGroup\n )}`\n );\n }\n } else if (Units === 'GML') {\n // assumes that GML indicates SUVbw instead of SUVlbm\n results.fill(1);\n } else {\n throw new Error(`Units has an invalid value: ${Units}`);\n }\n\n // get BSA\n let suvbsaFactor: number | undefined;\n if (PatientSize === null || PatientSize === undefined) {\n console.warn(\n 'PatientSize value is missing. It is not possible to calculate the SUV bsa factors'\n );\n } else {\n const sulInputs: SUVbsaScalingFactorInput = {\n PatientWeight,\n PatientSize,\n };\n\n suvbsaFactor = calculateSUVbsaScalingFactor(sulInputs);\n }\n\n // get LBM\n let suvlbmFactor: number | undefined;\n let suvlbmJenmaFactor: number | undefined;\n if (PatientSize === null || PatientSize === undefined) {\n console.warn(\n 'PatientSize value is missing. It is not possible to calculate the SUV lbm factors'\n );\n } else if (PatientSex === null || PatientSex === undefined) {\n console.warn(\n 'PatientSex value is missing. It is not possible to calculate the SUV lbm factors'\n );\n } else {\n const suvlbmInputs: SUVlbmScalingFactorInput = {\n PatientWeight,\n PatientSex,\n PatientSize,\n };\n\n suvlbmFactor = calculateSUVlbmScalingFactor(suvlbmInputs);\n suvlbmJenmaFactor = calculateSUVlbmJanmahasatianScalingFactor(suvlbmInputs);\n }\n\n return results.map(function(result, index) {\n const factors: ScalingFactorResult = {\n suvbw: result,\n };\n\n if (suvbsaFactor) {\n // multiply for BSA\n factors.suvbsa = decayCorrectionArray[index] * suvbsaFactor;\n }\n\n if (suvlbmFactor) {\n // multiply for LBM\n factors.suvlbm = decayCorrectionArray[index] * suvlbmFactor;\n }\n\n if (suvlbmJenmaFactor) {\n factors.suvlbmJanma = decayCorrectionArray[index] * suvlbmJenmaFactor;\n }\n\n // factor formulaes taken from:\n // https://www.medicalconnections.co.uk/kb/calculating-suv-from-pet-images/\n\n return factors;\n });\n}\n\nexport { calculateSUVScalingFactors };\n","import combineDateTime, { FullDateInterface } from './combineDateTime';\nimport parseDA, { DateInterface } from './parseDA';\nimport parseTM, { TimeInterface } from './parseTM';\nimport dateTimeToFullDateInterface from './dateTimeToFullDateInterface';\n\n/**\n * Javascript object with scan properties\n *\n * @interface InstanceMetadataForScanTimes\n */\ninterface InstanceMetadataForScanTimes {\n SeriesDate: string;\n SeriesTime: string;\n AcquisitionDate: string;\n AcquisitionTime: string;\n\n GEPrivatePostInjectionDateTime?: string;\n\n // Only used in Siemens case\n RadionuclideHalfLife?: number; // \tRadionuclideHalfLife(0x0018,0x1075)\tin\tRadiopharmaceutical\tInformation\tSequence(0x0054,0x0016)\n RadionuclideTotalDose?: number;\n FrameReferenceTime?: number;\n ActualFrameDuration?: number;\n}\n\n/**\n * Calculate the scan times\n *\n * @export\n * @param {InstanceMetadataForScanTimes[]} instances\n * @returns {FullDateInterface[]}\n */\nexport default function calculateScanTimes(\n instances: InstanceMetadataForScanTimes[]\n): FullDateInterface[] {\n const {\n SeriesDate,\n SeriesTime,\n GEPrivatePostInjectionDateTime,\n } = instances[0];\n const results = new Array(instances.length);\n const seriesDate: DateInterface = parseDA(SeriesDate);\n const seriesTime: TimeInterface = parseTM(SeriesTime);\n const seriesDateTime: FullDateInterface = combineDateTime(\n seriesDate,\n seriesTime\n );\n\n let earliestAcquisitionDateTime = new FullDateInterface(\n `3000-01-01T00:00:00.000000Z`\n );\n let timeError = earliestAcquisitionDateTime.getTimeInSec();\n instances.forEach(instance => {\n const { AcquisitionDate, AcquisitionTime } = instance;\n\n const acquisitionDate: DateInterface = parseDA(AcquisitionDate);\n const acquisitionTime: TimeInterface = parseTM(AcquisitionTime);\n const acquisitionDateTime: FullDateInterface = combineDateTime(\n acquisitionDate,\n acquisitionTime\n );\n\n if (earliestAcquisitionDateTime.getTimeInSec() >= timeError) {\n earliestAcquisitionDateTime = acquisitionDateTime;\n } else {\n earliestAcquisitionDateTime =\n acquisitionDateTime.getTimeInSec() <\n earliestAcquisitionDateTime.getTimeInSec()\n ? acquisitionDateTime\n : earliestAcquisitionDateTime;\n }\n });\n\n if (earliestAcquisitionDateTime.getTimeInSec() >= timeError) {\n throw new Error('Earliest acquisition time or date could not be parsed.');\n }\n\n if (\n seriesDateTime.getTimeInSec() <= earliestAcquisitionDateTime.getTimeInSec()\n ) {\n return results.fill(seriesDateTime);\n } else {\n if (GEPrivatePostInjectionDateTime) {\n // GE Private scan\n return results.fill(\n dateTimeToFullDateInterface(GEPrivatePostInjectionDateTime)\n );\n } else {\n /*const hasValidFrameTimes = instances.every(instance => {\n return (\n instance.FrameReferenceTime &&\n instance.FrameReferenceTime > 0 &&\n instance.ActualFrameDuration &&\n instance.ActualFrameDuration > 0\n );\n });*/\n\n // TODO: Temporarily commented out the checks and logic below to\n // investigate the BQML_AC_DT_lessThan_S_DT_SIEMENS-instances case\n //if (!hasValidFrameTimes) {\n return results.fill(earliestAcquisitionDateTime);\n //}\n\n /* Siemens PETsyngo\t3.x\tmulti-injection logic\n - backcompute\tfrom\tcenter\t(average\tcount\trate\t)\tof\ttime\twindow\tfor\tbed\tposition\t(frame)\tin\tseries (reliable\tin\tall\tcases)\n - Acquisition\tDate\t(0x0008,0x0022)\tand\tTime\t(0x0008,0x0032) are\tthe\tstart\tof\tthe\tbed\tposition\t(frame)\n - Frame\tReference\tTime\t(0x0054,0x1300) is\tthe\toffset\t(ms)\tfrom\tthe\tscan\tDate\tand\tTime we\twant\tto\tthe\taverage\tcount\trate\ttime\n */\n /*return instances.map(instance => {\n const {\n FrameReferenceTime,\n ActualFrameDuration,\n RadionuclideHalfLife,\n AcquisitionDate,\n AcquisitionTime,\n } = instance;\n // Some of these checks are only here because the compiler is complaining\n // We could potentially use the ! operator instead\n if (!FrameReferenceTime || FrameReferenceTime <= 0) {\n throw new Error(\n `FrameReferenceTime is invalid: ${FrameReferenceTime}`\n );\n }\n\n if (!ActualFrameDuration || ActualFrameDuration <= 0) {\n throw new Error(\n `ActualFrameDuration is invalid: ${ActualFrameDuration}`\n );\n }\n\n if (!RadionuclideHalfLife) {\n throw new Error('RadionuclideHalfLife is required');\n }\n\n if (!AcquisitionDate) {\n throw new Error('AcquisitionDate is required');\n }\n\n if (!AcquisitionTime) {\n throw new Error('AcquisitionTime is required');\n }\n\n const acquisitionDate: DateInterface = parseDA(AcquisitionDate);\n const acquisitionTime: TimeInterface = parseTM(AcquisitionTime);\n const acquisitionDateTime: FullDateInterface = combineDateTime(\n acquisitionDate,\n acquisitionTime\n );\n\n const frameDurationInSec = ActualFrameDuration / 1000;\n const decayConstant = Math.log(2) / RadionuclideHalfLife;\n const decayDuringFrame = decayConstant * frameDurationInSec;\n // TODO: double check this is correctly copied from QIBA pseudocode\n const averageCountRateTimeWithinFrameInSec =\n (1 / decayConstant) *\n Math.log(decayDuringFrame / (1 - Math.exp(-decayConstant)));\n const scanDateTimeAsNumber =\n Number(acquisitionDateTime) -\n FrameReferenceTime / 1000 +\n averageCountRateTimeWithinFrameInSec;\n\n const scanDate = new Date(scanDateTimeAsNumber);\n console.log('SIEMENS PATH');\n console.log(new Date(scanDateTimeAsNumber));\n return scanDate;\n });*/\n }\n }\n}\n\nexport { calculateScanTimes };\n","import combineDateTime, { FullDateInterface } from './combineDateTime';\nimport { parseDA, DateInterface } from './parseDA';\nimport { parseTM, TimeInterface } from './parseTM';\nimport dateTimeToFullDateInterface from './dateTimeToFullDateInterface';\n\n/**\n * Calculate start time\n *\n * @export\n * @param {{\n * RadiopharmaceuticalStartDateTime?: string;\n * RadiopharmaceuticalStartTime?: string;\n * SeriesDate?: string;\n * }} input\n * @returns {FullDateInterface}\n */\nexport default function calculateStartTime(input: {\n RadiopharmaceuticalStartDateTime?: string;\n RadiopharmaceuticalStartTime?: string;\n SeriesDate?: string;\n}): FullDateInterface {\n const {\n RadiopharmaceuticalStartDateTime,\n RadiopharmaceuticalStartTime,\n SeriesDate,\n } = input;\n\n let time: TimeInterface;\n let date: DateInterface;\n if (RadiopharmaceuticalStartDateTime) {\n return dateTimeToFullDateInterface(RadiopharmaceuticalStartDateTime);\n } else if (RadiopharmaceuticalStartTime && SeriesDate) {\n // start Date\tis not explicit - assume\tsame as\tSeries Date;\n // but consider\tspanning midnight\n // TODO: do we need some logic to check if the scan went over midnight?\n time = parseTM(RadiopharmaceuticalStartTime);\n date = parseDA(SeriesDate);\n\n return combineDateTime(date, time);\n }\n\n throw new Error(`Invalid input: ${input}`);\n}\n\nexport { calculateStartTime };\n","/**\n * Javascript object with patient properties size, sez, weight\n *\n * @export\n * @interface SUVbsaScalingFactorInput\n */\ninterface SUVbsaScalingFactorInput {\n PatientSize: number;\n PatientWeight: number;\n}\n\nfunction calculateSUVbsaScalingFactor(\n inputs: SUVbsaScalingFactorInput\n): number {\n const { PatientWeight, PatientSize } = inputs;\n\n let BSA =\n Math.pow(PatientWeight, 0.425) * Math.pow(PatientSize * 100, 0.725) * 71.84;\n\n return BSA;\n}\n\nexport { calculateSUVbsaScalingFactor, SUVbsaScalingFactorInput };\n","/**\n * Javascript object with patient properties size, sez, weight\n *\n * @export\n * @interface SUVlbmScalingFactorInput\n */\ninterface SUVlbmScalingFactorInput {\n PatientSize: number; // m\n PatientSex: string; //'M' | 'F' | 'O';\n PatientWeight: number; // Kg\n}\n\nfunction calculateSUVlbmScalingFactor(\n inputs: SUVlbmScalingFactorInput\n): number {\n const { PatientSex, PatientWeight, PatientSize } = inputs;\n\n let LBM;\n const weightSizeFactor = Math.pow(PatientWeight / (PatientSize * 100), 2);\n // reference: https://www.medicalconnections.co.uk/kb/calculating-suv-from-pet-images/\n if (PatientSex === 'F') {\n LBM = 1.07 * PatientWeight - 148 * weightSizeFactor;\n } else if (PatientSex === 'M') {\n LBM = 1.1 * PatientWeight - 120 * weightSizeFactor;\n } else {\n throw new Error(`PatientSex is an invalid value: ${PatientSex}`);\n }\n\n return LBM * 1000; // convert in gr\n}\n\n/**\n * From https://link.springer.com/article/10.1007/s00259-014-2961-x\n * and https://link.springer.com/article/10.2165/00003088-200544100-00004\n * and\n * @param inputs\n * @returns\n */\nfunction calculateSUVlbmJanmahasatianScalingFactor(\n inputs: SUVlbmScalingFactorInput\n): number {\n const { PatientSex, PatientWeight, PatientSize } = inputs;\n\n let LBM;\n const bodyMassIndex = PatientWeight / Math.pow(PatientSize, 2);\n\n if (PatientSex === 'F') {\n LBM = (9270 * PatientWeight) / (8780 + 244 * bodyMassIndex);\n } else if (PatientSex === 'M') {\n LBM = (9270 * PatientWeight) / (6680 + 216 * bodyMassIndex);\n } else {\n throw new Error(`PatientSex is an invalid value: ${PatientSex}`);\n }\n return LBM * 1000; // convert in gr\n}\n\nexport {\n calculateSUVlbmScalingFactor,\n calculateSUVlbmJanmahasatianScalingFactor,\n SUVlbmScalingFactorInput,\n};\n","// @flow\n\n// Animation frame based implementation of setTimeout.\n// Inspired by Joe Lambert, https://gist.github.com/joelambert/1002116#file-requesttimeout-js\n\nconst hasNativePerformanceNow =\n typeof performance === 'object' && typeof performance.now === 'function';\n\nconst now = hasNativePerformanceNow\n ? () => performance.now()\n : () => Date.now();\n\nexport type TimeoutID = {|\n id: AnimationFrameID,\n|};\n\nexport function cancelTimeout(timeoutID: TimeoutID) {\n cancelAnimationFrame(timeoutID.id);\n}\n\nexport function requestTimeout(callback: Function, delay: number): TimeoutID {\n const start = now();\n\n function tick() {\n if (now() - start >= delay) {\n callback.call(null);\n } else {\n timeoutID.id = requestAnimationFrame(tick);\n }\n }\n\n const timeoutID: TimeoutID = {\n id: requestAnimationFrame(tick),\n };\n\n return timeoutID;\n}\n","// @flow\n\nlet size: number = -1;\n\n// This utility copied from \"dom-helpers\" package.\nexport function getScrollbarSize(recalculate?: boolean = false): number {\n if (size === -1 || recalculate) {\n const div = document.createElement('div');\n const style = div.style;\n style.width = '50px';\n style.height = '50px';\n style.overflow = 'scroll';\n\n ((document.body: any): HTMLBodyElement).appendChild(div);\n\n size = div.offsetWidth - div.clientWidth;\n\n ((document.body: any): HTMLBodyElement).removeChild(div);\n }\n\n return size;\n}\n\nexport type RTLOffsetType =\n | 'negative'\n | 'positive-descending'\n | 'positive-ascending';\n\nlet cachedRTLResult: RTLOffsetType | null = null;\n\n// TRICKY According to the spec, scrollLeft should be negative for RTL aligned elements.\n// Chrome does not seem to adhere; its scrollLeft values are positive (measured relative to the left).\n// Safari's elastic bounce makes detecting this even more complicated wrt potential false positives.\n// The safest way to check this is to intentionally set a negative offset,\n// and then verify that the subsequent \"scroll\" event matches the negative offset.\n// If it does not match, then we can assume a non-standard RTL scroll implementation.\nexport function getRTLOffsetType(recalculate?: boolean = false): RTLOffsetType {\n if (cachedRTLResult === null || recalculate) {\n const outerDiv = document.createElement('div');\n const outerStyle = outerDiv.style;\n outerStyle.width = '50px';\n outerStyle.height = '50px';\n outerStyle.overflow = 'scroll';\n outerStyle.direction = 'rtl';\n\n const innerDiv = document.createElement('div');\n const innerStyle = innerDiv.style;\n innerStyle.width = '100px';\n innerStyle.height = '100px';\n\n outerDiv.appendChild(innerDiv);\n\n ((document.body: any): HTMLBodyElement).appendChild(outerDiv);\n\n if (outerDiv.scrollLeft > 0) {\n cachedRTLResult = 'positive-descending';\n } else {\n outerDiv.scrollLeft = 1;\n if (outerDiv.scrollLeft === 0) {\n cachedRTLResult = 'negative';\n } else {\n cachedRTLResult = 'positive-ascending';\n }\n }\n\n ((document.body: any): HTMLBodyElement).removeChild(outerDiv);\n\n return cachedRTLResult;\n }\n\n return cachedRTLResult;\n}\n","// @flow\n\nimport memoizeOne from 'memoize-one';\nimport { createElement, PureComponent } from 'react';\nimport { cancelTimeout, requestTimeout } from './timer';\nimport { getScrollbarSize, getRTLOffsetType } from './domHelpers';\n\nimport type { TimeoutID } from './timer';\n\ntype Direction = 'ltr' | 'rtl';\nexport type ScrollToAlign = 'auto' | 'smart' | 'center' | 'start' | 'end';\n\ntype itemSize = number | ((index: number) => number);\n\ntype RenderComponentProps = {|\n columnIndex: number,\n data: T,\n isScrolling?: boolean,\n rowIndex: number,\n style: Object,\n|};\nexport type RenderComponent = React$ComponentType<\n $Shape>\n>;\n\ntype ScrollDirection = 'forward' | 'backward';\n\ntype OnItemsRenderedCallback = ({\n overscanColumnStartIndex: number,\n overscanColumnStopIndex: number,\n overscanRowStartIndex: number,\n overscanRowStopIndex: number,\n visibleColumnStartIndex: number,\n visibleColumnStopIndex: number,\n visibleRowStartIndex: number,\n visibleRowStopIndex: number,\n}) => void;\ntype OnScrollCallback = ({\n horizontalScrollDirection: ScrollDirection,\n scrollLeft: number,\n scrollTop: number,\n scrollUpdateWasRequested: boolean,\n verticalScrollDirection: ScrollDirection,\n}) => void;\n\ntype ScrollEvent = SyntheticEvent;\ntype ItemStyleCache = { [key: string]: Object };\n\ntype OuterProps = {|\n children: React$Node,\n className: string | void,\n onScroll: ScrollEvent => void,\n style: {\n [string]: mixed,\n },\n|};\n\ntype InnerProps = {|\n children: React$Node,\n style: {\n [string]: mixed,\n },\n|};\n\nexport type Props = {|\n children: RenderComponent,\n className?: string,\n columnCount: number,\n columnWidth: itemSize,\n direction: Direction,\n height: number,\n initialScrollLeft?: number,\n initialScrollTop?: number,\n innerRef?: any,\n innerElementType?: string | React$AbstractComponent,\n innerTagName?: string, // deprecated\n itemData: T,\n itemKey?: (params: {|\n columnIndex: number,\n data: T,\n rowIndex: number,\n |}) => any,\n onItemsRendered?: OnItemsRenderedCallback,\n onScroll?: OnScrollCallback,\n outerRef?: any,\n outerElementType?: string | React$AbstractComponent,\n outerTagName?: string, // deprecated\n overscanColumnCount?: number,\n overscanColumnsCount?: number, // deprecated\n overscanCount?: number, // deprecated\n overscanRowCount?: number,\n overscanRowsCount?: number, // deprecated\n rowCount: number,\n rowHeight: itemSize,\n style?: Object,\n useIsScrolling: boolean,\n width: number,\n|};\n\ntype State = {|\n instance: any,\n isScrolling: boolean,\n horizontalScrollDirection: ScrollDirection,\n scrollLeft: number,\n scrollTop: number,\n scrollUpdateWasRequested: boolean,\n verticalScrollDirection: ScrollDirection,\n|};\n\ntype getItemOffset = (\n props: Props,\n index: number,\n instanceProps: any\n) => number;\ntype getItemSize = (\n props: Props,\n index: number,\n instanceProps: any\n) => number;\ntype getEstimatedTotalSize = (props: Props, instanceProps: any) => number;\ntype GetOffsetForItemAndAlignment = (\n props: Props,\n index: number,\n align: ScrollToAlign,\n scrollOffset: number,\n instanceProps: any,\n scrollbarSize: number\n) => number;\ntype GetStartIndexForOffset = (\n props: Props,\n offset: number,\n instanceProps: any\n) => number;\ntype GetStopIndexForStartIndex = (\n props: Props,\n startIndex: number,\n scrollOffset: number,\n instanceProps: any\n) => number;\ntype InitInstanceProps = (props: Props, instance: any) => any;\ntype ValidateProps = (props: Props) => void;\n\nconst IS_SCROLLING_DEBOUNCE_INTERVAL = 150;\n\nconst defaultItemKey = ({ columnIndex, data, rowIndex }) =>\n `${rowIndex}:${columnIndex}`;\n\n// In DEV mode, this Set helps us only log a warning once per component instance.\n// This avoids spamming the console every time a render happens.\nlet devWarningsOverscanCount = null;\nlet devWarningsOverscanRowsColumnsCount = null;\nlet devWarningsTagName = null;\nif (process.env.NODE_ENV !== 'production') {\n if (typeof window !== 'undefined' && typeof window.WeakSet !== 'undefined') {\n devWarningsOverscanCount = new WeakSet();\n devWarningsOverscanRowsColumnsCount = new WeakSet();\n devWarningsTagName = new WeakSet();\n }\n}\n\nexport default function createGridComponent({\n getColumnOffset,\n getColumnStartIndexForOffset,\n getColumnStopIndexForStartIndex,\n getColumnWidth,\n getEstimatedTotalHeight,\n getEstimatedTotalWidth,\n getOffsetForColumnAndAlignment,\n getOffsetForRowAndAlignment,\n getRowHeight,\n getRowOffset,\n getRowStartIndexForOffset,\n getRowStopIndexForStartIndex,\n initInstanceProps,\n shouldResetStyleCacheOnItemSizeChange,\n validateProps,\n}: {|\n getColumnOffset: getItemOffset,\n getColumnStartIndexForOffset: GetStartIndexForOffset,\n getColumnStopIndexForStartIndex: GetStopIndexForStartIndex,\n getColumnWidth: getItemSize,\n getEstimatedTotalHeight: getEstimatedTotalSize,\n getEstimatedTotalWidth: getEstimatedTotalSize,\n getOffsetForColumnAndAlignment: GetOffsetForItemAndAlignment,\n getOffsetForRowAndAlignment: GetOffsetForItemAndAlignment,\n getRowOffset: getItemOffset,\n getRowHeight: getItemSize,\n getRowStartIndexForOffset: GetStartIndexForOffset,\n getRowStopIndexForStartIndex: GetStopIndexForStartIndex,\n initInstanceProps: InitInstanceProps,\n shouldResetStyleCacheOnItemSizeChange: boolean,\n validateProps: ValidateProps,\n|}) {\n return class Grid extends PureComponent, State> {\n _instanceProps: any = initInstanceProps(this.props, this);\n _resetIsScrollingTimeoutId: TimeoutID | null = null;\n _outerRef: ?HTMLDivElement;\n\n static defaultProps = {\n direction: 'ltr',\n itemData: undefined,\n useIsScrolling: false,\n };\n\n state: State = {\n instance: this,\n isScrolling: false,\n horizontalScrollDirection: 'forward',\n scrollLeft:\n typeof this.props.initialScrollLeft === 'number'\n ? this.props.initialScrollLeft\n : 0,\n scrollTop:\n typeof this.props.initialScrollTop === 'number'\n ? this.props.initialScrollTop\n : 0,\n scrollUpdateWasRequested: false,\n verticalScrollDirection: 'forward',\n };\n\n // Always use explicit constructor for React components.\n // It produces less code after transpilation. (#26)\n // eslint-disable-next-line no-useless-constructor\n constructor(props: Props) {\n super(props);\n }\n\n static getDerivedStateFromProps(\n nextProps: Props,\n prevState: State\n ): $Shape | null {\n validateSharedProps(nextProps, prevState);\n validateProps(nextProps);\n return null;\n }\n\n scrollTo({\n scrollLeft,\n scrollTop,\n }: {\n scrollLeft: number,\n scrollTop: number,\n }): void {\n if (scrollLeft !== undefined) {\n scrollLeft = Math.max(0, scrollLeft);\n }\n if (scrollTop !== undefined) {\n scrollTop = Math.max(0, scrollTop);\n }\n\n this.setState(prevState => {\n if (scrollLeft === undefined) {\n scrollLeft = prevState.scrollLeft;\n }\n if (scrollTop === undefined) {\n scrollTop = prevState.scrollTop;\n }\n\n if (\n prevState.scrollLeft === scrollLeft &&\n prevState.scrollTop === scrollTop\n ) {\n return null;\n }\n\n return {\n horizontalScrollDirection:\n prevState.scrollLeft < scrollLeft ? 'forward' : 'backward',\n scrollLeft: scrollLeft,\n scrollTop: scrollTop,\n scrollUpdateWasRequested: true,\n verticalScrollDirection:\n prevState.scrollTop < scrollTop ? 'forward' : 'backward',\n };\n }, this._resetIsScrollingDebounced);\n }\n\n scrollToItem({\n align = 'auto',\n columnIndex,\n rowIndex,\n }: {\n align: ScrollToAlign,\n columnIndex?: number,\n rowIndex?: number,\n }): void {\n const { columnCount, height, rowCount, width } = this.props;\n const { scrollLeft, scrollTop } = this.state;\n const scrollbarSize = getScrollbarSize();\n\n if (columnIndex !== undefined) {\n columnIndex = Math.max(0, Math.min(columnIndex, columnCount - 1));\n }\n if (rowIndex !== undefined) {\n rowIndex = Math.max(0, Math.min(rowIndex, rowCount - 1));\n }\n\n const estimatedTotalHeight = getEstimatedTotalHeight(\n this.props,\n this._instanceProps\n );\n const estimatedTotalWidth = getEstimatedTotalWidth(\n this.props,\n this._instanceProps\n );\n\n // The scrollbar size should be considered when scrolling an item into view,\n // to ensure it's fully visible.\n // But we only need to account for its size when it's actually visible.\n const horizontalScrollbarSize =\n estimatedTotalWidth > width ? scrollbarSize : 0;\n const verticalScrollbarSize =\n estimatedTotalHeight > height ? scrollbarSize : 0;\n\n this.scrollTo({\n scrollLeft:\n columnIndex !== undefined\n ? getOffsetForColumnAndAlignment(\n this.props,\n columnIndex,\n align,\n scrollLeft,\n this._instanceProps,\n verticalScrollbarSize\n )\n : scrollLeft,\n scrollTop:\n rowIndex !== undefined\n ? getOffsetForRowAndAlignment(\n this.props,\n rowIndex,\n align,\n scrollTop,\n this._instanceProps,\n horizontalScrollbarSize\n )\n : scrollTop,\n });\n }\n\n componentDidMount() {\n const { initialScrollLeft, initialScrollTop } = this.props;\n\n if (this._outerRef != null) {\n const outerRef = ((this._outerRef: any): HTMLElement);\n if (typeof initialScrollLeft === 'number') {\n outerRef.scrollLeft = initialScrollLeft;\n }\n if (typeof initialScrollTop === 'number') {\n outerRef.scrollTop = initialScrollTop;\n }\n }\n\n this._callPropsCallbacks();\n }\n\n componentDidUpdate() {\n const { direction } = this.props;\n const { scrollLeft, scrollTop, scrollUpdateWasRequested } = this.state;\n\n if (scrollUpdateWasRequested && this._outerRef != null) {\n // TRICKY According to the spec, scrollLeft should be negative for RTL aligned elements.\n // This is not the case for all browsers though (e.g. Chrome reports values as positive, measured relative to the left).\n // So we need to determine which browser behavior we're dealing with, and mimic it.\n const outerRef = ((this._outerRef: any): HTMLElement);\n if (direction === 'rtl') {\n switch (getRTLOffsetType()) {\n case 'negative':\n outerRef.scrollLeft = -scrollLeft;\n break;\n case 'positive-ascending':\n outerRef.scrollLeft = scrollLeft;\n break;\n default:\n const { clientWidth, scrollWidth } = outerRef;\n outerRef.scrollLeft = scrollWidth - clientWidth - scrollLeft;\n break;\n }\n } else {\n outerRef.scrollLeft = Math.max(0, scrollLeft);\n }\n\n outerRef.scrollTop = Math.max(0, scrollTop);\n }\n\n this._callPropsCallbacks();\n }\n\n componentWillUnmount() {\n if (this._resetIsScrollingTimeoutId !== null) {\n cancelTimeout(this._resetIsScrollingTimeoutId);\n }\n }\n\n render() {\n const {\n children,\n className,\n columnCount,\n direction,\n height,\n innerRef,\n innerElementType,\n innerTagName,\n itemData,\n itemKey = defaultItemKey,\n outerElementType,\n outerTagName,\n rowCount,\n style,\n useIsScrolling,\n width,\n } = this.props;\n const { isScrolling } = this.state;\n\n const [\n columnStartIndex,\n columnStopIndex,\n ] = this._getHorizontalRangeToRender();\n const [rowStartIndex, rowStopIndex] = this._getVerticalRangeToRender();\n\n const items = [];\n if (columnCount > 0 && rowCount) {\n for (\n let rowIndex = rowStartIndex;\n rowIndex <= rowStopIndex;\n rowIndex++\n ) {\n for (\n let columnIndex = columnStartIndex;\n columnIndex <= columnStopIndex;\n columnIndex++\n ) {\n items.push(\n createElement(children, {\n columnIndex,\n data: itemData,\n isScrolling: useIsScrolling ? isScrolling : undefined,\n key: itemKey({ columnIndex, data: itemData, rowIndex }),\n rowIndex,\n style: this._getItemStyle(rowIndex, columnIndex),\n })\n );\n }\n }\n }\n\n // Read this value AFTER items have been created,\n // So their actual sizes (if variable) are taken into consideration.\n const estimatedTotalHeight = getEstimatedTotalHeight(\n this.props,\n this._instanceProps\n );\n const estimatedTotalWidth = getEstimatedTotalWidth(\n this.props,\n this._instanceProps\n );\n\n return createElement(\n outerElementType || outerTagName || 'div',\n {\n className,\n onScroll: this._onScroll,\n ref: this._outerRefSetter,\n style: {\n position: 'relative',\n height,\n width,\n overflow: 'auto',\n WebkitOverflowScrolling: 'touch',\n willChange: 'transform',\n direction,\n ...style,\n },\n },\n createElement(innerElementType || innerTagName || 'div', {\n children: items,\n ref: innerRef,\n style: {\n height: estimatedTotalHeight,\n pointerEvents: isScrolling ? 'none' : undefined,\n width: estimatedTotalWidth,\n },\n })\n );\n }\n\n _callOnItemsRendered: (\n overscanColumnStartIndex: number,\n overscanColumnStopIndex: number,\n overscanRowStartIndex: number,\n overscanRowStopIndex: number,\n visibleColumnStartIndex: number,\n visibleColumnStopIndex: number,\n visibleRowStartIndex: number,\n visibleRowStopIndex: number\n ) => void;\n _callOnItemsRendered = memoizeOne(\n (\n overscanColumnStartIndex: number,\n overscanColumnStopIndex: number,\n overscanRowStartIndex: number,\n overscanRowStopIndex: number,\n visibleColumnStartIndex: number,\n visibleColumnStopIndex: number,\n visibleRowStartIndex: number,\n visibleRowStopIndex: number\n ) =>\n ((this.props.onItemsRendered: any): OnItemsRenderedCallback)({\n overscanColumnStartIndex,\n overscanColumnStopIndex,\n overscanRowStartIndex,\n overscanRowStopIndex,\n visibleColumnStartIndex,\n visibleColumnStopIndex,\n visibleRowStartIndex,\n visibleRowStopIndex,\n })\n );\n\n _callOnScroll: (\n scrollLeft: number,\n scrollTop: number,\n horizontalScrollDirection: ScrollDirection,\n verticalScrollDirection: ScrollDirection,\n scrollUpdateWasRequested: boolean\n ) => void;\n _callOnScroll = memoizeOne(\n (\n scrollLeft: number,\n scrollTop: number,\n horizontalScrollDirection: ScrollDirection,\n verticalScrollDirection: ScrollDirection,\n scrollUpdateWasRequested: boolean\n ) =>\n ((this.props.onScroll: any): OnScrollCallback)({\n horizontalScrollDirection,\n scrollLeft,\n scrollTop,\n verticalScrollDirection,\n scrollUpdateWasRequested,\n })\n );\n\n _callPropsCallbacks() {\n const { columnCount, onItemsRendered, onScroll, rowCount } = this.props;\n\n if (typeof onItemsRendered === 'function') {\n if (columnCount > 0 && rowCount > 0) {\n const [\n overscanColumnStartIndex,\n overscanColumnStopIndex,\n visibleColumnStartIndex,\n visibleColumnStopIndex,\n ] = this._getHorizontalRangeToRender();\n const [\n overscanRowStartIndex,\n overscanRowStopIndex,\n visibleRowStartIndex,\n visibleRowStopIndex,\n ] = this._getVerticalRangeToRender();\n this._callOnItemsRendered(\n overscanColumnStartIndex,\n overscanColumnStopIndex,\n overscanRowStartIndex,\n overscanRowStopIndex,\n visibleColumnStartIndex,\n visibleColumnStopIndex,\n visibleRowStartIndex,\n visibleRowStopIndex\n );\n }\n }\n\n if (typeof onScroll === 'function') {\n const {\n horizontalScrollDirection,\n scrollLeft,\n scrollTop,\n scrollUpdateWasRequested,\n verticalScrollDirection,\n } = this.state;\n this._callOnScroll(\n scrollLeft,\n scrollTop,\n horizontalScrollDirection,\n verticalScrollDirection,\n scrollUpdateWasRequested\n );\n }\n }\n\n // Lazily create and cache item styles while scrolling,\n // So that pure component sCU will prevent re-renders.\n // We maintain this cache, and pass a style prop rather than index,\n // So that List can clear cached styles and force item re-render if necessary.\n _getItemStyle: (rowIndex: number, columnIndex: number) => Object;\n _getItemStyle = (rowIndex: number, columnIndex: number): Object => {\n const { columnWidth, direction, rowHeight } = this.props;\n\n const itemStyleCache = this._getItemStyleCache(\n shouldResetStyleCacheOnItemSizeChange && columnWidth,\n shouldResetStyleCacheOnItemSizeChange && direction,\n shouldResetStyleCacheOnItemSizeChange && rowHeight\n );\n\n const key = `${rowIndex}:${columnIndex}`;\n\n let style;\n if (itemStyleCache.hasOwnProperty(key)) {\n style = itemStyleCache[key];\n } else {\n const offset = getColumnOffset(\n this.props,\n columnIndex,\n this._instanceProps\n );\n const isRtl = direction === 'rtl';\n itemStyleCache[key] = style = {\n position: 'absolute',\n left: isRtl ? undefined : offset,\n right: isRtl ? offset : undefined,\n top: getRowOffset(this.props, rowIndex, this._instanceProps),\n height: getRowHeight(this.props, rowIndex, this._instanceProps),\n width: getColumnWidth(this.props, columnIndex, this._instanceProps),\n };\n }\n\n return style;\n };\n\n _getItemStyleCache: (_: any, __: any, ___: any) => ItemStyleCache;\n _getItemStyleCache = memoizeOne((_: any, __: any, ___: any) => ({}));\n\n _getHorizontalRangeToRender(): [number, number, number, number] {\n const {\n columnCount,\n overscanColumnCount,\n overscanColumnsCount,\n overscanCount,\n rowCount,\n } = this.props;\n const { horizontalScrollDirection, isScrolling, scrollLeft } = this.state;\n\n const overscanCountResolved: number =\n overscanColumnCount || overscanColumnsCount || overscanCount || 1;\n\n if (columnCount === 0 || rowCount === 0) {\n return [0, 0, 0, 0];\n }\n\n const startIndex = getColumnStartIndexForOffset(\n this.props,\n scrollLeft,\n this._instanceProps\n );\n const stopIndex = getColumnStopIndexForStartIndex(\n this.props,\n startIndex,\n scrollLeft,\n this._instanceProps\n );\n\n // Overscan by one item in each direction so that tab/focus works.\n // If there isn't at least one extra item, tab loops back around.\n const overscanBackward =\n !isScrolling || horizontalScrollDirection === 'backward'\n ? Math.max(1, overscanCountResolved)\n : 1;\n const overscanForward =\n !isScrolling || horizontalScrollDirection === 'forward'\n ? Math.max(1, overscanCountResolved)\n : 1;\n\n return [\n Math.max(0, startIndex - overscanBackward),\n Math.max(0, Math.min(columnCount - 1, stopIndex + overscanForward)),\n startIndex,\n stopIndex,\n ];\n }\n\n _getVerticalRangeToRender(): [number, number, number, number] {\n const {\n columnCount,\n overscanCount,\n overscanRowCount,\n overscanRowsCount,\n rowCount,\n } = this.props;\n const { isScrolling, verticalScrollDirection, scrollTop } = this.state;\n\n const overscanCountResolved: number =\n overscanRowCount || overscanRowsCount || overscanCount || 1;\n\n if (columnCount === 0 || rowCount === 0) {\n return [0, 0, 0, 0];\n }\n\n const startIndex = getRowStartIndexForOffset(\n this.props,\n scrollTop,\n this._instanceProps\n );\n const stopIndex = getRowStopIndexForStartIndex(\n this.props,\n startIndex,\n scrollTop,\n this._instanceProps\n );\n\n // Overscan by one item in each direction so that tab/focus works.\n // If there isn't at least one extra item, tab loops back around.\n const overscanBackward =\n !isScrolling || verticalScrollDirection === 'backward'\n ? Math.max(1, overscanCountResolved)\n : 1;\n const overscanForward =\n !isScrolling || verticalScrollDirection === 'forward'\n ? Math.max(1, overscanCountResolved)\n : 1;\n\n return [\n Math.max(0, startIndex - overscanBackward),\n Math.max(0, Math.min(rowCount - 1, stopIndex + overscanForward)),\n startIndex,\n stopIndex,\n ];\n }\n\n _onScroll = (event: ScrollEvent): void => {\n const {\n clientHeight,\n clientWidth,\n scrollLeft,\n scrollTop,\n scrollHeight,\n scrollWidth,\n } = event.currentTarget;\n this.setState(prevState => {\n if (\n prevState.scrollLeft === scrollLeft &&\n prevState.scrollTop === scrollTop\n ) {\n // Scroll position may have been updated by cDM/cDU,\n // In which case we don't need to trigger another render,\n // And we don't want to update state.isScrolling.\n return null;\n }\n\n const { direction } = this.props;\n\n // TRICKY According to the spec, scrollLeft should be negative for RTL aligned elements.\n // This is not the case for all browsers though (e.g. Chrome reports values as positive, measured relative to the left).\n // It's also easier for this component if we convert offsets to the same format as they would be in for ltr.\n // So the simplest solution is to determine which browser behavior we're dealing with, and convert based on it.\n let calculatedScrollLeft = scrollLeft;\n if (direction === 'rtl') {\n switch (getRTLOffsetType()) {\n case 'negative':\n calculatedScrollLeft = -scrollLeft;\n break;\n case 'positive-descending':\n calculatedScrollLeft = scrollWidth - clientWidth - scrollLeft;\n break;\n }\n }\n\n // Prevent Safari's elastic scrolling from causing visual shaking when scrolling past bounds.\n calculatedScrollLeft = Math.max(\n 0,\n Math.min(calculatedScrollLeft, scrollWidth - clientWidth)\n );\n const calculatedScrollTop = Math.max(\n 0,\n Math.min(scrollTop, scrollHeight - clientHeight)\n );\n\n return {\n isScrolling: true,\n horizontalScrollDirection:\n prevState.scrollLeft < scrollLeft ? 'forward' : 'backward',\n scrollLeft: calculatedScrollLeft,\n scrollTop: calculatedScrollTop,\n verticalScrollDirection:\n prevState.scrollTop < scrollTop ? 'forward' : 'backward',\n scrollUpdateWasRequested: false,\n };\n }, this._resetIsScrollingDebounced);\n };\n\n _outerRefSetter = (ref: any): void => {\n const { outerRef } = this.props;\n\n this._outerRef = ((ref: any): HTMLDivElement);\n\n if (typeof outerRef === 'function') {\n outerRef(ref);\n } else if (\n outerRef != null &&\n typeof outerRef === 'object' &&\n outerRef.hasOwnProperty('current')\n ) {\n outerRef.current = ref;\n }\n };\n\n _resetIsScrollingDebounced = () => {\n if (this._resetIsScrollingTimeoutId !== null) {\n cancelTimeout(this._resetIsScrollingTimeoutId);\n }\n\n this._resetIsScrollingTimeoutId = requestTimeout(\n this._resetIsScrolling,\n IS_SCROLLING_DEBOUNCE_INTERVAL\n );\n };\n\n _resetIsScrolling = () => {\n this._resetIsScrollingTimeoutId = null;\n\n this.setState({ isScrolling: false }, () => {\n // Clear style cache after state update has been committed.\n // This way we don't break pure sCU for items that don't use isScrolling param.\n this._getItemStyleCache(-1);\n });\n };\n };\n}\n\nconst validateSharedProps = (\n {\n children,\n direction,\n height,\n innerTagName,\n outerTagName,\n overscanColumnsCount,\n overscanCount,\n overscanRowsCount,\n width,\n }: Props,\n { instance }: State\n): void => {\n if (process.env.NODE_ENV !== 'production') {\n if (typeof overscanCount === 'number') {\n if (devWarningsOverscanCount && !devWarningsOverscanCount.has(instance)) {\n devWarningsOverscanCount.add(instance);\n console.warn(\n 'The overscanCount prop has been deprecated. ' +\n 'Please use the overscanColumnCount and overscanRowCount props instead.'\n );\n }\n }\n\n if (\n typeof overscanColumnsCount === 'number' ||\n typeof overscanRowsCount === 'number'\n ) {\n if (\n devWarningsOverscanRowsColumnsCount &&\n !devWarningsOverscanRowsColumnsCount.has(instance)\n ) {\n devWarningsOverscanRowsColumnsCount.add(instance);\n console.warn(\n 'The overscanColumnsCount and overscanRowsCount props have been deprecated. ' +\n 'Please use the overscanColumnCount and overscanRowCount props instead.'\n );\n }\n }\n\n if (innerTagName != null || outerTagName != null) {\n if (devWarningsTagName && !devWarningsTagName.has(instance)) {\n devWarningsTagName.add(instance);\n console.warn(\n 'The innerTagName and outerTagName props have been deprecated. ' +\n 'Please use the innerElementType and outerElementType props instead.'\n );\n }\n }\n\n if (children == null) {\n throw Error(\n 'An invalid \"children\" prop has been specified. ' +\n 'Value should be a React component. ' +\n `\"${children === null ? 'null' : typeof children}\" was specified.`\n );\n }\n\n switch (direction) {\n case 'ltr':\n case 'rtl':\n // Valid values\n break;\n default:\n throw Error(\n 'An invalid \"direction\" prop has been specified. ' +\n 'Value should be either \"ltr\" or \"rtl\". ' +\n `\"${direction}\" was specified.`\n );\n }\n\n if (typeof width !== 'number') {\n throw Error(\n 'An invalid \"width\" prop has been specified. ' +\n 'Grids must specify a number for width. ' +\n `\"${width === null ? 'null' : typeof width}\" was specified.`\n );\n }\n\n if (typeof height !== 'number') {\n throw Error(\n 'An invalid \"height\" prop has been specified. ' +\n 'Grids must specify a number for height. ' +\n `\"${height === null ? 'null' : typeof height}\" was specified.`\n );\n }\n }\n};\n","// @flow\n\nimport memoizeOne from 'memoize-one';\nimport { createElement, PureComponent } from 'react';\nimport { cancelTimeout, requestTimeout } from './timer';\nimport { getScrollbarSize, getRTLOffsetType } from './domHelpers';\n\nimport type { TimeoutID } from './timer';\n\nexport type ScrollToAlign = 'auto' | 'smart' | 'center' | 'start' | 'end';\n\ntype itemSize = number | ((index: number) => number);\n// TODO Deprecate directions \"horizontal\" and \"vertical\"\ntype Direction = 'ltr' | 'rtl' | 'horizontal' | 'vertical';\ntype Layout = 'horizontal' | 'vertical';\n\ntype RenderComponentProps = {|\n data: T,\n index: number,\n isScrolling?: boolean,\n style: Object,\n|};\ntype RenderComponent = React$ComponentType<$Shape>>;\n\ntype ScrollDirection = 'forward' | 'backward';\n\ntype onItemsRenderedCallback = ({\n overscanStartIndex: number,\n overscanStopIndex: number,\n visibleStartIndex: number,\n visibleStopIndex: number,\n}) => void;\ntype onScrollCallback = ({\n scrollDirection: ScrollDirection,\n scrollOffset: number,\n scrollUpdateWasRequested: boolean,\n}) => void;\n\ntype ScrollEvent = SyntheticEvent;\ntype ItemStyleCache = { [index: number]: Object };\n\ntype OuterProps = {|\n children: React$Node,\n className: string | void,\n onScroll: ScrollEvent => void,\n style: {\n [string]: mixed,\n },\n|};\n\ntype InnerProps = {|\n children: React$Node,\n style: {\n [string]: mixed,\n },\n|};\n\nexport type Props = {|\n children: RenderComponent,\n className?: string,\n direction: Direction,\n height: number | string,\n initialScrollOffset?: number,\n innerRef?: any,\n innerElementType?: string | React$AbstractComponent,\n innerTagName?: string, // deprecated\n itemCount: number,\n itemData: T,\n itemKey?: (index: number, data: T) => any,\n itemSize: itemSize,\n layout: Layout,\n onItemsRendered?: onItemsRenderedCallback,\n onScroll?: onScrollCallback,\n outerRef?: any,\n outerElementType?: string | React$AbstractComponent,\n outerTagName?: string, // deprecated\n overscanCount: number,\n style?: Object,\n useIsScrolling: boolean,\n width: number | string,\n|};\n\ntype State = {|\n instance: any,\n isScrolling: boolean,\n scrollDirection: ScrollDirection,\n scrollOffset: number,\n scrollUpdateWasRequested: boolean,\n|};\n\ntype GetItemOffset = (\n props: Props,\n index: number,\n instanceProps: any\n) => number;\ntype GetItemSize = (\n props: Props,\n index: number,\n instanceProps: any\n) => number;\ntype GetEstimatedTotalSize = (props: Props, instanceProps: any) => number;\ntype GetOffsetForIndexAndAlignment = (\n props: Props,\n index: number,\n align: ScrollToAlign,\n scrollOffset: number,\n instanceProps: any\n) => number;\ntype GetStartIndexForOffset = (\n props: Props,\n offset: number,\n instanceProps: any\n) => number;\ntype GetStopIndexForStartIndex = (\n props: Props,\n startIndex: number,\n scrollOffset: number,\n instanceProps: any\n) => number;\ntype InitInstanceProps = (props: Props, instance: any) => any;\ntype ValidateProps = (props: Props) => void;\n\nconst IS_SCROLLING_DEBOUNCE_INTERVAL = 150;\n\nconst defaultItemKey = (index: number, data: any) => index;\n\n// In DEV mode, this Set helps us only log a warning once per component instance.\n// This avoids spamming the console every time a render happens.\nlet devWarningsDirection = null;\nlet devWarningsTagName = null;\nif (process.env.NODE_ENV !== 'production') {\n if (typeof window !== 'undefined' && typeof window.WeakSet !== 'undefined') {\n devWarningsDirection = new WeakSet();\n devWarningsTagName = new WeakSet();\n }\n}\n\nexport default function createListComponent({\n getItemOffset,\n getEstimatedTotalSize,\n getItemSize,\n getOffsetForIndexAndAlignment,\n getStartIndexForOffset,\n getStopIndexForStartIndex,\n initInstanceProps,\n shouldResetStyleCacheOnItemSizeChange,\n validateProps,\n}: {|\n getItemOffset: GetItemOffset,\n getEstimatedTotalSize: GetEstimatedTotalSize,\n getItemSize: GetItemSize,\n getOffsetForIndexAndAlignment: GetOffsetForIndexAndAlignment,\n getStartIndexForOffset: GetStartIndexForOffset,\n getStopIndexForStartIndex: GetStopIndexForStartIndex,\n initInstanceProps: InitInstanceProps,\n shouldResetStyleCacheOnItemSizeChange: boolean,\n validateProps: ValidateProps,\n|}) {\n return class List extends PureComponent, State> {\n _instanceProps: any = initInstanceProps(this.props, this);\n _outerRef: ?HTMLDivElement;\n _resetIsScrollingTimeoutId: TimeoutID | null = null;\n\n static defaultProps = {\n direction: 'ltr',\n itemData: undefined,\n layout: 'vertical',\n overscanCount: 2,\n useIsScrolling: false,\n };\n\n state: State = {\n instance: this,\n isScrolling: false,\n scrollDirection: 'forward',\n scrollOffset:\n typeof this.props.initialScrollOffset === 'number'\n ? this.props.initialScrollOffset\n : 0,\n scrollUpdateWasRequested: false,\n };\n\n // Always use explicit constructor for React components.\n // It produces less code after transpilation. (#26)\n // eslint-disable-next-line no-useless-constructor\n constructor(props: Props) {\n super(props);\n }\n\n static getDerivedStateFromProps(\n nextProps: Props,\n prevState: State\n ): $Shape | null {\n validateSharedProps(nextProps, prevState);\n validateProps(nextProps);\n return null;\n }\n\n scrollTo(scrollOffset: number): void {\n scrollOffset = Math.max(0, scrollOffset);\n\n this.setState(prevState => {\n if (prevState.scrollOffset === scrollOffset) {\n return null;\n }\n return {\n scrollDirection:\n prevState.scrollOffset < scrollOffset ? 'forward' : 'backward',\n scrollOffset: scrollOffset,\n scrollUpdateWasRequested: true,\n };\n }, this._resetIsScrollingDebounced);\n }\n\n scrollToItem(index: number, align: ScrollToAlign = 'auto'): void {\n const { itemCount, layout } = this.props;\n const { scrollOffset } = this.state;\n\n index = Math.max(0, Math.min(index, itemCount - 1));\n\n // The scrollbar size should be considered when scrolling an item into view, to ensure it's fully visible.\n // But we only need to account for its size when it's actually visible.\n // This is an edge case for lists; normally they only scroll in the dominant direction.\n let scrollbarSize = 0;\n if (this._outerRef) {\n const outerRef = ((this._outerRef: any): HTMLElement);\n if (layout === 'vertical') {\n scrollbarSize =\n outerRef.scrollWidth > outerRef.clientWidth\n ? getScrollbarSize()\n : 0;\n } else {\n scrollbarSize =\n outerRef.scrollHeight > outerRef.clientHeight\n ? getScrollbarSize()\n : 0;\n }\n }\n\n this.scrollTo(\n getOffsetForIndexAndAlignment(\n this.props,\n index,\n align,\n scrollOffset,\n this._instanceProps,\n scrollbarSize\n )\n );\n }\n\n componentDidMount() {\n const { direction, initialScrollOffset, layout } = this.props;\n\n if (typeof initialScrollOffset === 'number' && this._outerRef != null) {\n const outerRef = ((this._outerRef: any): HTMLElement);\n // TODO Deprecate direction \"horizontal\"\n if (direction === 'horizontal' || layout === 'horizontal') {\n outerRef.scrollLeft = initialScrollOffset;\n } else {\n outerRef.scrollTop = initialScrollOffset;\n }\n }\n\n this._callPropsCallbacks();\n }\n\n componentDidUpdate() {\n const { direction, layout } = this.props;\n const { scrollOffset, scrollUpdateWasRequested } = this.state;\n\n if (scrollUpdateWasRequested && this._outerRef != null) {\n const outerRef = ((this._outerRef: any): HTMLElement);\n\n // TODO Deprecate direction \"horizontal\"\n if (direction === 'horizontal' || layout === 'horizontal') {\n if (direction === 'rtl') {\n // TRICKY According to the spec, scrollLeft should be negative for RTL aligned elements.\n // This is not the case for all browsers though (e.g. Chrome reports values as positive, measured relative to the left).\n // So we need to determine which browser behavior we're dealing with, and mimic it.\n switch (getRTLOffsetType()) {\n case 'negative':\n outerRef.scrollLeft = -scrollOffset;\n break;\n case 'positive-ascending':\n outerRef.scrollLeft = scrollOffset;\n break;\n default:\n const { clientWidth, scrollWidth } = outerRef;\n outerRef.scrollLeft = scrollWidth - clientWidth - scrollOffset;\n break;\n }\n } else {\n outerRef.scrollLeft = scrollOffset;\n }\n } else {\n outerRef.scrollTop = scrollOffset;\n }\n }\n\n this._callPropsCallbacks();\n }\n\n componentWillUnmount() {\n if (this._resetIsScrollingTimeoutId !== null) {\n cancelTimeout(this._resetIsScrollingTimeoutId);\n }\n }\n\n render() {\n const {\n children,\n className,\n direction,\n height,\n innerRef,\n innerElementType,\n innerTagName,\n itemCount,\n itemData,\n itemKey = defaultItemKey,\n layout,\n outerElementType,\n outerTagName,\n style,\n useIsScrolling,\n width,\n } = this.props;\n const { isScrolling } = this.state;\n\n // TODO Deprecate direction \"horizontal\"\n const isHorizontal =\n direction === 'horizontal' || layout === 'horizontal';\n\n const onScroll = isHorizontal\n ? this._onScrollHorizontal\n : this._onScrollVertical;\n\n const [startIndex, stopIndex] = this._getRangeToRender();\n\n const items = [];\n if (itemCount > 0) {\n for (let index = startIndex; index <= stopIndex; index++) {\n items.push(\n createElement(children, {\n data: itemData,\n key: itemKey(index, itemData),\n index,\n isScrolling: useIsScrolling ? isScrolling : undefined,\n style: this._getItemStyle(index),\n })\n );\n }\n }\n\n // Read this value AFTER items have been created,\n // So their actual sizes (if variable) are taken into consideration.\n const estimatedTotalSize = getEstimatedTotalSize(\n this.props,\n this._instanceProps\n );\n\n return createElement(\n outerElementType || outerTagName || 'div',\n {\n className,\n onScroll,\n ref: this._outerRefSetter,\n style: {\n position: 'relative',\n height,\n width,\n overflow: 'auto',\n WebkitOverflowScrolling: 'touch',\n willChange: 'transform',\n direction,\n ...style,\n },\n },\n createElement(innerElementType || innerTagName || 'div', {\n children: items,\n ref: innerRef,\n style: {\n height: isHorizontal ? '100%' : estimatedTotalSize,\n pointerEvents: isScrolling ? 'none' : undefined,\n width: isHorizontal ? estimatedTotalSize : '100%',\n },\n })\n );\n }\n\n _callOnItemsRendered: (\n overscanStartIndex: number,\n overscanStopIndex: number,\n visibleStartIndex: number,\n visibleStopIndex: number\n ) => void;\n _callOnItemsRendered = memoizeOne(\n (\n overscanStartIndex: number,\n overscanStopIndex: number,\n visibleStartIndex: number,\n visibleStopIndex: number\n ) =>\n ((this.props.onItemsRendered: any): onItemsRenderedCallback)({\n overscanStartIndex,\n overscanStopIndex,\n visibleStartIndex,\n visibleStopIndex,\n })\n );\n\n _callOnScroll: (\n scrollDirection: ScrollDirection,\n scrollOffset: number,\n scrollUpdateWasRequested: boolean\n ) => void;\n _callOnScroll = memoizeOne(\n (\n scrollDirection: ScrollDirection,\n scrollOffset: number,\n scrollUpdateWasRequested: boolean\n ) =>\n ((this.props.onScroll: any): onScrollCallback)({\n scrollDirection,\n scrollOffset,\n scrollUpdateWasRequested,\n })\n );\n\n _callPropsCallbacks() {\n if (typeof this.props.onItemsRendered === 'function') {\n const { itemCount } = this.props;\n if (itemCount > 0) {\n const [\n overscanStartIndex,\n overscanStopIndex,\n visibleStartIndex,\n visibleStopIndex,\n ] = this._getRangeToRender();\n this._callOnItemsRendered(\n overscanStartIndex,\n overscanStopIndex,\n visibleStartIndex,\n visibleStopIndex\n );\n }\n }\n\n if (typeof this.props.onScroll === 'function') {\n const {\n scrollDirection,\n scrollOffset,\n scrollUpdateWasRequested,\n } = this.state;\n this._callOnScroll(\n scrollDirection,\n scrollOffset,\n scrollUpdateWasRequested\n );\n }\n }\n\n // Lazily create and cache item styles while scrolling,\n // So that pure component sCU will prevent re-renders.\n // We maintain this cache, and pass a style prop rather than index,\n // So that List can clear cached styles and force item re-render if necessary.\n _getItemStyle: (index: number) => Object;\n _getItemStyle = (index: number): Object => {\n const { direction, itemSize, layout } = this.props;\n\n const itemStyleCache = this._getItemStyleCache(\n shouldResetStyleCacheOnItemSizeChange && itemSize,\n shouldResetStyleCacheOnItemSizeChange && layout,\n shouldResetStyleCacheOnItemSizeChange && direction\n );\n\n let style;\n if (itemStyleCache.hasOwnProperty(index)) {\n style = itemStyleCache[index];\n } else {\n const offset = getItemOffset(this.props, index, this._instanceProps);\n const size = getItemSize(this.props, index, this._instanceProps);\n\n // TODO Deprecate direction \"horizontal\"\n const isHorizontal =\n direction === 'horizontal' || layout === 'horizontal';\n\n const isRtl = direction === 'rtl';\n const offsetHorizontal = isHorizontal ? offset : 0;\n itemStyleCache[index] = style = {\n position: 'absolute',\n left: isRtl ? undefined : offsetHorizontal,\n right: isRtl ? offsetHorizontal : undefined,\n top: !isHorizontal ? offset : 0,\n height: !isHorizontal ? size : '100%',\n width: isHorizontal ? size : '100%',\n };\n }\n\n return style;\n };\n\n _getItemStyleCache: (_: any, __: any, ___: any) => ItemStyleCache;\n _getItemStyleCache = memoizeOne((_: any, __: any, ___: any) => ({}));\n\n _getRangeToRender(): [number, number, number, number] {\n const { itemCount, overscanCount } = this.props;\n const { isScrolling, scrollDirection, scrollOffset } = this.state;\n\n if (itemCount === 0) {\n return [0, 0, 0, 0];\n }\n\n const startIndex = getStartIndexForOffset(\n this.props,\n scrollOffset,\n this._instanceProps\n );\n const stopIndex = getStopIndexForStartIndex(\n this.props,\n startIndex,\n scrollOffset,\n this._instanceProps\n );\n\n // Overscan by one item in each direction so that tab/focus works.\n // If there isn't at least one extra item, tab loops back around.\n const overscanBackward =\n !isScrolling || scrollDirection === 'backward'\n ? Math.max(1, overscanCount)\n : 1;\n const overscanForward =\n !isScrolling || scrollDirection === 'forward'\n ? Math.max(1, overscanCount)\n : 1;\n\n return [\n Math.max(0, startIndex - overscanBackward),\n Math.max(0, Math.min(itemCount - 1, stopIndex + overscanForward)),\n startIndex,\n stopIndex,\n ];\n }\n\n _onScrollHorizontal = (event: ScrollEvent): void => {\n const { clientWidth, scrollLeft, scrollWidth } = event.currentTarget;\n this.setState(prevState => {\n if (prevState.scrollOffset === scrollLeft) {\n // Scroll position may have been updated by cDM/cDU,\n // In which case we don't need to trigger another render,\n // And we don't want to update state.isScrolling.\n return null;\n }\n\n const { direction } = this.props;\n\n let scrollOffset = scrollLeft;\n if (direction === 'rtl') {\n // TRICKY According to the spec, scrollLeft should be negative for RTL aligned elements.\n // This is not the case for all browsers though (e.g. Chrome reports values as positive, measured relative to the left).\n // It's also easier for this component if we convert offsets to the same format as they would be in for ltr.\n // So the simplest solution is to determine which browser behavior we're dealing with, and convert based on it.\n switch (getRTLOffsetType()) {\n case 'negative':\n scrollOffset = -scrollLeft;\n break;\n case 'positive-descending':\n scrollOffset = scrollWidth - clientWidth - scrollLeft;\n break;\n }\n }\n\n // Prevent Safari's elastic scrolling from causing visual shaking when scrolling past bounds.\n scrollOffset = Math.max(\n 0,\n Math.min(scrollOffset, scrollWidth - clientWidth)\n );\n\n return {\n isScrolling: true,\n scrollDirection:\n prevState.scrollOffset < scrollLeft ? 'forward' : 'backward',\n scrollOffset,\n scrollUpdateWasRequested: false,\n };\n }, this._resetIsScrollingDebounced);\n };\n\n _onScrollVertical = (event: ScrollEvent): void => {\n const { clientHeight, scrollHeight, scrollTop } = event.currentTarget;\n this.setState(prevState => {\n if (prevState.scrollOffset === scrollTop) {\n // Scroll position may have been updated by cDM/cDU,\n // In which case we don't need to trigger another render,\n // And we don't want to update state.isScrolling.\n return null;\n }\n\n // Prevent Safari's elastic scrolling from causing visual shaking when scrolling past bounds.\n const scrollOffset = Math.max(\n 0,\n Math.min(scrollTop, scrollHeight - clientHeight)\n );\n\n return {\n isScrolling: true,\n scrollDirection:\n prevState.scrollOffset < scrollOffset ? 'forward' : 'backward',\n scrollOffset,\n scrollUpdateWasRequested: false,\n };\n }, this._resetIsScrollingDebounced);\n };\n\n _outerRefSetter = (ref: any): void => {\n const { outerRef } = this.props;\n\n this._outerRef = ((ref: any): HTMLDivElement);\n\n if (typeof outerRef === 'function') {\n outerRef(ref);\n } else if (\n outerRef != null &&\n typeof outerRef === 'object' &&\n outerRef.hasOwnProperty('current')\n ) {\n outerRef.current = ref;\n }\n };\n\n _resetIsScrollingDebounced = () => {\n if (this._resetIsScrollingTimeoutId !== null) {\n cancelTimeout(this._resetIsScrollingTimeoutId);\n }\n\n this._resetIsScrollingTimeoutId = requestTimeout(\n this._resetIsScrolling,\n IS_SCROLLING_DEBOUNCE_INTERVAL\n );\n };\n\n _resetIsScrolling = () => {\n this._resetIsScrollingTimeoutId = null;\n\n this.setState({ isScrolling: false }, () => {\n // Clear style cache after state update has been committed.\n // This way we don't break pure sCU for items that don't use isScrolling param.\n this._getItemStyleCache(-1, null);\n });\n };\n };\n}\n\n// NOTE: I considered further wrapping individual items with a pure ListItem component.\n// This would avoid ever calling the render function for the same index more than once,\n// But it would also add the overhead of a lot of components/fibers.\n// I assume people already do this (render function returning a class component),\n// So my doing it would just unnecessarily double the wrappers.\n\nconst validateSharedProps = (\n {\n children,\n direction,\n height,\n layout,\n innerTagName,\n outerTagName,\n width,\n }: Props,\n { instance }: State\n): void => {\n if (process.env.NODE_ENV !== 'production') {\n if (innerTagName != null || outerTagName != null) {\n if (devWarningsTagName && !devWarningsTagName.has(instance)) {\n devWarningsTagName.add(instance);\n console.warn(\n 'The innerTagName and outerTagName props have been deprecated. ' +\n 'Please use the innerElementType and outerElementType props instead.'\n );\n }\n }\n\n // TODO Deprecate direction \"horizontal\"\n const isHorizontal = direction === 'horizontal' || layout === 'horizontal';\n\n switch (direction) {\n case 'horizontal':\n case 'vertical':\n if (devWarningsDirection && !devWarningsDirection.has(instance)) {\n devWarningsDirection.add(instance);\n console.warn(\n 'The direction prop should be either \"ltr\" (default) or \"rtl\". ' +\n 'Please use the layout prop to specify \"vertical\" (default) or \"horizontal\" orientation.'\n );\n }\n break;\n case 'ltr':\n case 'rtl':\n // Valid values\n break;\n default:\n throw Error(\n 'An invalid \"direction\" prop has been specified. ' +\n 'Value should be either \"ltr\" or \"rtl\". ' +\n `\"${direction}\" was specified.`\n );\n }\n\n switch (layout) {\n case 'horizontal':\n case 'vertical':\n // Valid values\n break;\n default:\n throw Error(\n 'An invalid \"layout\" prop has been specified. ' +\n 'Value should be either \"horizontal\" or \"vertical\". ' +\n `\"${layout}\" was specified.`\n );\n }\n\n if (children == null) {\n throw Error(\n 'An invalid \"children\" prop has been specified. ' +\n 'Value should be a React component. ' +\n `\"${children === null ? 'null' : typeof children}\" was specified.`\n );\n }\n\n if (isHorizontal && typeof width !== 'number') {\n throw Error(\n 'An invalid \"width\" prop has been specified. ' +\n 'Horizontal lists must specify a number for width. ' +\n `\"${width === null ? 'null' : typeof width}\" was specified.`\n );\n } else if (!isHorizontal && typeof height !== 'number') {\n throw Error(\n 'An invalid \"height\" prop has been specified. ' +\n 'Vertical lists must specify a number for height. ' +\n `\"${height === null ? 'null' : typeof height}\" was specified.`\n );\n }\n }\n};\n","// @flow\n\nimport createListComponent from './createListComponent';\n\nimport type { Props, ScrollToAlign } from './createListComponent';\n\nconst DEFAULT_ESTIMATED_ITEM_SIZE = 50;\n\ntype VariableSizeProps = {|\n estimatedItemSize: number,\n ...Props,\n|};\n\ntype itemSizeGetter = (index: number) => number;\n\ntype ItemMetadata = {|\n offset: number,\n size: number,\n|};\ntype InstanceProps = {|\n itemMetadataMap: { [index: number]: ItemMetadata },\n estimatedItemSize: number,\n lastMeasuredIndex: number,\n|};\n\nconst getItemMetadata = (\n props: Props,\n index: number,\n instanceProps: InstanceProps\n): ItemMetadata => {\n const { itemSize } = ((props: any): VariableSizeProps);\n const { itemMetadataMap, lastMeasuredIndex } = instanceProps;\n\n if (index > lastMeasuredIndex) {\n let offset = 0;\n if (lastMeasuredIndex >= 0) {\n const itemMetadata = itemMetadataMap[lastMeasuredIndex];\n offset = itemMetadata.offset + itemMetadata.size;\n }\n\n for (let i = lastMeasuredIndex + 1; i <= index; i++) {\n let size = ((itemSize: any): itemSizeGetter)(i);\n\n itemMetadataMap[i] = {\n offset,\n size,\n };\n\n offset += size;\n }\n\n instanceProps.lastMeasuredIndex = index;\n }\n\n return itemMetadataMap[index];\n};\n\nconst findNearestItem = (\n props: Props,\n instanceProps: InstanceProps,\n offset: number\n) => {\n const { itemMetadataMap, lastMeasuredIndex } = instanceProps;\n\n const lastMeasuredItemOffset =\n lastMeasuredIndex > 0 ? itemMetadataMap[lastMeasuredIndex].offset : 0;\n\n if (lastMeasuredItemOffset >= offset) {\n // If we've already measured items within this range just use a binary search as it's faster.\n return findNearestItemBinarySearch(\n props,\n instanceProps,\n lastMeasuredIndex,\n 0,\n offset\n );\n } else {\n // If we haven't yet measured this high, fallback to an exponential search with an inner binary search.\n // The exponential search avoids pre-computing sizes for the full set of items as a binary search would.\n // The overall complexity for this approach is O(log n).\n return findNearestItemExponentialSearch(\n props,\n instanceProps,\n Math.max(0, lastMeasuredIndex),\n offset\n );\n }\n};\n\nconst findNearestItemBinarySearch = (\n props: Props,\n instanceProps: InstanceProps,\n high: number,\n low: number,\n offset: number\n): number => {\n while (low <= high) {\n const middle = low + Math.floor((high - low) / 2);\n const currentOffset = getItemMetadata(props, middle, instanceProps).offset;\n\n if (currentOffset === offset) {\n return middle;\n } else if (currentOffset < offset) {\n low = middle + 1;\n } else if (currentOffset > offset) {\n high = middle - 1;\n }\n }\n\n if (low > 0) {\n return low - 1;\n } else {\n return 0;\n }\n};\n\nconst findNearestItemExponentialSearch = (\n props: Props,\n instanceProps: InstanceProps,\n index: number,\n offset: number\n): number => {\n const { itemCount } = props;\n let interval = 1;\n\n while (\n index < itemCount &&\n getItemMetadata(props, index, instanceProps).offset < offset\n ) {\n index += interval;\n interval *= 2;\n }\n\n return findNearestItemBinarySearch(\n props,\n instanceProps,\n Math.min(index, itemCount - 1),\n Math.floor(index / 2),\n offset\n );\n};\n\nconst getEstimatedTotalSize = (\n { itemCount }: Props,\n { itemMetadataMap, estimatedItemSize, lastMeasuredIndex }: InstanceProps\n) => {\n let totalSizeOfMeasuredItems = 0;\n\n // Edge case check for when the number of items decreases while a scroll is in progress.\n // https://github.com/bvaughn/react-window/pull/138\n if (lastMeasuredIndex >= itemCount) {\n lastMeasuredIndex = itemCount - 1;\n }\n\n if (lastMeasuredIndex >= 0) {\n const itemMetadata = itemMetadataMap[lastMeasuredIndex];\n totalSizeOfMeasuredItems = itemMetadata.offset + itemMetadata.size;\n }\n\n const numUnmeasuredItems = itemCount - lastMeasuredIndex - 1;\n const totalSizeOfUnmeasuredItems = numUnmeasuredItems * estimatedItemSize;\n\n return totalSizeOfMeasuredItems + totalSizeOfUnmeasuredItems;\n};\n\nconst VariableSizeList = createListComponent({\n getItemOffset: (\n props: Props,\n index: number,\n instanceProps: InstanceProps\n ): number => getItemMetadata(props, index, instanceProps).offset,\n\n getItemSize: (\n props: Props,\n index: number,\n instanceProps: InstanceProps\n ): number => instanceProps.itemMetadataMap[index].size,\n\n getEstimatedTotalSize,\n\n getOffsetForIndexAndAlignment: (\n props: Props,\n index: number,\n align: ScrollToAlign,\n scrollOffset: number,\n instanceProps: InstanceProps,\n scrollbarSize: number\n ): number => {\n const { direction, height, layout, width } = props;\n\n // TODO Deprecate direction \"horizontal\"\n const isHorizontal = direction === 'horizontal' || layout === 'horizontal';\n const size = (((isHorizontal ? width : height): any): number);\n const itemMetadata = getItemMetadata(props, index, instanceProps);\n\n // Get estimated total size after ItemMetadata is computed,\n // To ensure it reflects actual measurements instead of just estimates.\n const estimatedTotalSize = getEstimatedTotalSize(props, instanceProps);\n\n const maxOffset = Math.max(\n 0,\n Math.min(estimatedTotalSize - size, itemMetadata.offset)\n );\n const minOffset = Math.max(\n 0,\n itemMetadata.offset - size + itemMetadata.size + scrollbarSize\n );\n\n if (align === 'smart') {\n if (\n scrollOffset >= minOffset - size &&\n scrollOffset <= maxOffset + size\n ) {\n align = 'auto';\n } else {\n align = 'center';\n }\n }\n\n switch (align) {\n case 'start':\n return maxOffset;\n case 'end':\n return minOffset;\n case 'center':\n return Math.round(minOffset + (maxOffset - minOffset) / 2);\n case 'auto':\n default:\n if (scrollOffset >= minOffset && scrollOffset <= maxOffset) {\n return scrollOffset;\n } else if (scrollOffset < minOffset) {\n return minOffset;\n } else {\n return maxOffset;\n }\n }\n },\n\n getStartIndexForOffset: (\n props: Props,\n offset: number,\n instanceProps: InstanceProps\n ): number => findNearestItem(props, instanceProps, offset),\n\n getStopIndexForStartIndex: (\n props: Props,\n startIndex: number,\n scrollOffset: number,\n instanceProps: InstanceProps\n ): number => {\n const { direction, height, itemCount, layout, width } = props;\n\n // TODO Deprecate direction \"horizontal\"\n const isHorizontal = direction === 'horizontal' || layout === 'horizontal';\n const size = (((isHorizontal ? width : height): any): number);\n const itemMetadata = getItemMetadata(props, startIndex, instanceProps);\n const maxOffset = scrollOffset + size;\n\n let offset = itemMetadata.offset + itemMetadata.size;\n let stopIndex = startIndex;\n\n while (stopIndex < itemCount - 1 && offset < maxOffset) {\n stopIndex++;\n offset += getItemMetadata(props, stopIndex, instanceProps).size;\n }\n\n return stopIndex;\n },\n\n initInstanceProps(props: Props, instance: any): InstanceProps {\n const { estimatedItemSize } = ((props: any): VariableSizeProps);\n\n const instanceProps = {\n itemMetadataMap: {},\n estimatedItemSize: estimatedItemSize || DEFAULT_ESTIMATED_ITEM_SIZE,\n lastMeasuredIndex: -1,\n };\n\n instance.resetAfterIndex = (\n index: number,\n shouldForceUpdate?: boolean = true\n ) => {\n instanceProps.lastMeasuredIndex = Math.min(\n instanceProps.lastMeasuredIndex,\n index - 1\n );\n\n // We could potentially optimize further by only evicting styles after this index,\n // But since styles are only cached while scrolling is in progress-\n // It seems an unnecessary optimization.\n // It's unlikely that resetAfterIndex() will be called while a user is scrolling.\n instance._getItemStyleCache(-1);\n\n if (shouldForceUpdate) {\n instance.forceUpdate();\n }\n };\n\n return instanceProps;\n },\n\n shouldResetStyleCacheOnItemSizeChange: false,\n\n validateProps: ({ itemSize }: Props): void => {\n if (process.env.NODE_ENV !== 'production') {\n if (typeof itemSize !== 'function') {\n throw Error(\n 'An invalid \"itemSize\" prop has been specified. ' +\n 'Value should be a function. ' +\n `\"${itemSize === null ? 'null' : typeof itemSize}\" was specified.`\n );\n }\n }\n },\n});\n\nexport default VariableSizeList;\n"],"names":["FullDateInterface","constructor","date","this","fullDate","getTimeInSec","dateString","substring","timeString","yyyy","parseInt","mm","length","undefined","dd","isNaN","Error","dateJS","Date","HH","MM","SS","fractionalStr","FFFFFF","Math","pow","timeInSec","getTime","getTimeInMicroSec","combineDateTime","time","hours","padStart","minutes","seconds","month","day","fractionalSeconds","padEnd","year","parseDA","d","m","y","daysInMonth","parseTM","hh","ss","ffffff","dateTimeToFullDateInterface","dateTime","calculateDecayCorrection","instances","RadionuclideTotalDose","RadionuclideHalfLife","RadiopharmaceuticalStartDateTime","RadiopharmaceuticalStartTime","SeriesDate","scanTimes","SeriesTime","GEPrivatePostInjectionDateTime","results","Array","seriesDateTime","earliestAcquisitionDateTime","timeError","forEach","instance","AcquisitionDate","AcquisitionTime","acquisitionDateTime","fill","calculateScanTimes","startTime","input","calculateStartTime","map","_","index","decayTimeInSec","deepEquals","a","b","isArray","every","val","calculateSUVScalingFactors","CorrectedImage","Units","PhilipsPETPrivateGroup","PatientWeight","PatientSex","PatientSize","includes","DecayCorrection","decayCorrectionArray","weightInGrams","value","hasValidSUVScaleFactor","SUVScaleFactor","hasValidActivityConcentrationScaleFactor","ActivityConcentrationScaleFactor","JSON","stringify","suvbsaFactor","suvlbmFactor","suvlbmJenmaFactor","console","warn","inputs","calculateSUVbsaScalingFactor","suvlbmInputs","LBM","weightSizeFactor","calculateSUVlbmScalingFactor","bodyMassIndex","calculateSUVlbmJanmahasatianScalingFactor","result","factors","suvbw","suvbsa","suvlbm","suvlbmJanma","now","performance","cancelTimeout","timeoutID","cancelAnimationFrame","id","requestTimeout","callback","delay","start","requestAnimationFrame","tick","call","size","getScrollbarSize","recalculate","div","document","createElement","style","width","height","overflow","body","appendChild","offsetWidth","clientWidth","removeChild","cachedRTLResult","getRTLOffsetType","outerDiv","outerStyle","direction","innerDiv","innerStyle","scrollLeft","defaultItemKey","data","createListComponent","getItemOffset","getEstimatedTotalSize","getItemSize","getOffsetForIndexAndAlignment","getStartIndexForOffset","getStopIndexForStartIndex","initInstanceProps","shouldResetStyleCacheOnItemSizeChange","validateProps","props","_instanceProps","_outerRef","_resetIsScrollingTimeoutId","state","isScrolling","scrollDirection","scrollOffset","initialScrollOffset","scrollUpdateWasRequested","_callOnItemsRendered","memoizeOne","overscanStartIndex","overscanStopIndex","visibleStartIndex","visibleStopIndex","onItemsRendered","_callOnScroll","onScroll","_getItemStyle","itemSize","layout","itemStyleCache","_getItemStyleCache","hasOwnProperty","offset","isHorizontal","isRtl","offsetHorizontal","position","left","right","top","__","___","_onScrollHorizontal","event","currentTarget","scrollWidth","setState","prevState","max","min","_resetIsScrollingDebounced","_onScrollVertical","clientHeight","scrollHeight","scrollTop","_outerRefSetter","ref","outerRef","current","_resetIsScrolling","getDerivedStateFromProps","nextProps","validateSharedProps","scrollTo","scrollToItem","align","itemCount","scrollbarSize","componentDidMount","_callPropsCallbacks","componentDidUpdate","componentWillUnmount","render","children","className","innerRef","innerElementType","innerTagName","itemData","itemKey","outerElementType","outerTagName","useIsScrolling","_getRangeToRender","startIndex","stopIndex","items","push","key","estimatedTotalSize","WebkitOverflowScrolling","willChange","pointerEvents","overscanCount","overscanBackward","overscanForward","PureComponent","defaultProps","getItemMetadata","instanceProps","itemMetadataMap","lastMeasuredIndex","itemMetadata","i","findNearestItemBinarySearch","high","low","middle","floor","currentOffset","findNearestItemExponentialSearch","interval","estimatedItemSize","totalSizeOfMeasuredItems","VariableSizeList","maxOffset","minOffset","round","findNearestItem","resetAfterIndex","shouldForceUpdate","forceUpdate"],"sourceRoot":""} \ No newline at end of file diff --git a/resources/451.bundle.44a0aaa91f1e65ee8fa2.js b/resources/451.bundle.44a0aaa91f1e65ee8fa2.js new file mode 100644 index 0000000..e2118dc --- /dev/null +++ b/resources/451.bundle.44a0aaa91f1e65ee8fa2.js @@ -0,0 +1,2 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[451],{4451:(e,t,n)=>{n.r(t),n.d(t,{default:()=>g});var a=n(3827),s=n.n(a),r=n(43001),i=n(69190),o=n(71771),l=n(71783);const c=function(e,t,n){const{tools:a}=t.get("cornerstone.overlayViewportTools")??{};return e.createToolGroupAndAddTools(n,a)},u={NO_NEVER:-1,CANCEL:0,HYDRATE_SEG:5};const p=function(e){let{servicesManager:t,segDisplaySet:n,viewportId:a,preHydrateCallbacks:s,hydrateSEGDisplaySet:r}=e;const{uiViewportDialogService:i}=t.services;return new Promise((async function(e,t){const o=await function(e,t){return new Promise((function(n,a){const s="Do you want to open this Segmentation?",r=[{type:l.LZ.dt.secondary,text:"No",value:u.CANCEL},{type:l.LZ.dt.primary,text:"Yes",value:u.HYDRATE_SEG}],i=t=>{e.hide(),n(t)};e.show({viewportId:t,type:"info",message:s,actions:r,onSubmit:i,onOutsideClick:()=>{e.hide(),n(u.CANCEL)}})}))}(i,a);if(o===u.HYDRATE_SEG){s?.forEach((e=>{e()}));e(await r({segDisplaySet:n,viewportId:a}))}}))};function d(){return d=Object.assign?Object.assign.bind():function(e){for(var t=1;t1)throw new Error("SEG viewport should only have a single display set");const I=n[0],[N,C]=(0,l.O_)(),[T,k]=(0,r.useState)(1),[G,A]=(0,r.useState)(I.isHydrated),[P,O]=(0,r.useState)(!I.isLoaded),[x,M]=(0,r.useState)(null),[L,U]=(0,r.useState)({percentComplete:null,totalSegments:null}),V=(0,r.useRef)(null),{viewports:R,activeViewportId:_}=N,H=I.getReferenceDisplaySet(),j=function(e,t){const{SharedFunctionalGroupsSequence:n}=t.instance,a=Array.isArray(n)?n[0]:n,{PixelMeasuresSequence:s}=a,r=Array.isArray(s)?s[0]:s,{SpacingBetweenSlices:i,SliceThickness:o}=r,l=e.images[0],c={PatientID:l.PatientID,PatientName:l.PatientName,PatientSex:l.PatientSex,PatientAge:l.PatientAge,SliceThickness:l.SliceThickness||o,StudyDate:l.StudyDate,SeriesDescription:l.SeriesDescription,SeriesInstanceUID:l.SeriesInstanceUID,SeriesNumber:l.SeriesNumber,ManufacturerModelName:l.ManufacturerModelName,SpacingBetweenSlices:l.SpacingBetweenSlices||i};return c}(H,I);V.current={displaySet:H,metadata:j};const F=e=>{M(e.detail.element)},Y=()=>{M(null)},q=(0,r.useCallback)((()=>{N?.viewports.forEach((e=>{let{viewportId:t}=e;g.runCommand("storePresentation",{viewportId:t})}))}),[N]),B=(0,r.useCallback)((()=>{const{component:t}=S.getModuleEntry("@ohif/extension-cornerstone.viewportModule.cornerstone"),{displaySet:n}=V.current;return r.createElement(t,d({},e,{displaySets:[n,I],viewportOptions:{viewportType:"volume",toolGroupId:h,orientation:a.orientation,viewportId:a.viewportId},onElementEnabled:F,onElementDisabled:Y}))}),[E,I,h]),$=(0,r.useCallback)((e=>{e="left"===e?-1:1;const t=I.displaySetInstanceUID,n=w.getSegmentation(t),{segments:a}=n,s=Object.keys(a).length;let r=T+e;r>s-1?r=1:0===r&&(r=s-1),w.jumpToSegmentCenter(t,r,h),k(r)}),[T]);(0,r.useEffect)((()=>{P||p({servicesManager:u,viewportId:E,segDisplaySet:I,preHydrateCallbacks:[q],hydrateSEGDisplaySet:ae}).then((e=>{e&&A(!0)}))}),[u,E,I,P]),(0,r.useEffect)((()=>{const{unsubscribe:e}=w.subscribe(w.EVENTS.SEGMENTATION_LOADING_COMPLETE,(e=>{e.segDisplaySet.displaySetInstanceUID===I.displaySetInstanceUID&&O(!1),e.overlappingSegments&&D.show({title:"Overlapping Segments",message:"Overlapping segments detected which is not currently supported",type:"warning"})}));return()=>{e()}}),[I]),(0,r.useEffect)((()=>{const{unsubscribe:e}=w.subscribe(w.EVENTS.SEGMENT_LOADING_COMPLETE,(e=>{let{percentComplete:t,numSegments:n}=e;U({percentComplete:t,totalSegments:n})}));return()=>{e()}}),[I]),(0,r.useEffect)((()=>{const e=v.subscribe(v.EVENTS.DISPLAY_SETS_REMOVED,(e=>{let{displaySetInstanceUIDs:t}=e;const n=R.get(_);t.includes(n.displaySetInstanceUID)&&C.setDisplaySetsForViewport({viewportId:_,displaySetInstanceUIDs:[]})}));return()=>{e.unsubscribe()}}),[]),(0,r.useEffect)((()=>{let e=f.getToolGroup(h);if(!e)return e=c(f,b,h),()=>{w.removeSegmentationRepresentationFromToolGroup(h),f.destroyToolGroup(h)}}),[]),(0,r.useEffect)((()=>(A(I.isHydrated),()=>{w.removeSegmentationRepresentationFromToolGroup(h),V.current=null})),[I]);let J=null;if(!V.current||H.displaySetInstanceUID!==V.current.displaySet.displaySetInstanceUID)return null;t&&t.length&&(J=t.map(((e,t)=>e&&r.cloneElement(e,{viewportId:E,key:t}))));const{PatientID:Z,PatientName:z,PatientSex:K,PatientAge:Q,SliceThickness:W,ManufacturerModelName:X,StudyDate:ee,SeriesDescription:te,SpacingBetweenSlices:ne}=V.current.metadata,ae=e=>{let{segDisplaySet:t,viewportId:n}=e;g.runCommand("loadSegmentationDisplaySetsForViewport",{displaySets:[t],viewportId:n})},se=async()=>{q();const e=await ae({segDisplaySet:I,viewportId:E});A(e)};return r.createElement(r.Fragment,null,r.createElement(l.uY,{onDoubleClick:e=>{e.stopPropagation(),e.preventDefault()},onArrowsClick:$,getStatusComponent:()=>function(e){let{isHydrated:t,onStatusClick:n}=e,a=null,s=null;const{t:o}=(0,i.$G)("Common"),c=o("LOAD");switch(t){case!0:s=()=>r.createElement(l.JO,{name:"status-alert"}),a=()=>r.createElement("div",null,"This Segmentation is loaded in the segmentation panel");break;case!1:s=()=>r.createElement(l.JO,{className:"text-aqua-pale",name:"status-untracked"}),a=()=>r.createElement("div",null,"Click LOAD to load segmentation.")}const u=()=>r.createElement("div",{className:"flex h-6 cursor-default text-sm leading-6 text-white"},r.createElement("div",{className:"bg-customgray-100 flex min-w-[45px] items-center rounded-l-xl rounded-r p-1"},r.createElement(s,null),r.createElement("span",{className:"ml-1"},"SEG")),!t&&r.createElement("div",{className:"bg-primary-main hover:bg-primary-light ml-1 cursor-pointer rounded px-1.5 hover:text-black",onMouseUp:n},c));return r.createElement(r.Fragment,null,a&&r.createElement(l.u,{content:r.createElement(a,null),position:"bottom-left"},r.createElement(u,null)),!a&&r.createElement(u,null))}({isHydrated:G,onStatusClick:se}),studyData:{label:s,useAltStyling:!0,studyDate:m(ee),seriesDescription:`SEG Viewport ${te}`,patientInformation:{patientName:z?o.default.utils.formatPN(z.Alphabetic):"",patientSex:K||"",patientAge:Q||"",MRN:Z||"",thickness:W?o.utils.roundNumber(W,2):"",thicknessUnits:void 0!==W?"mm":"",spacing:void 0!==ne?o.utils.roundNumber(ne,2):"",scanner:X||""}}}),r.createElement("div",{className:"relative flex h-full w-full flex-row overflow-hidden"},P&&r.createElement(l.bk,{className:"h-full w-full",totalNumbers:L.totalSegments,percentComplete:L.percentComplete,loadingText:"Loading SEG..."}),B(),J))}S.propTypes={displaySets:s().arrayOf(s().object),viewportId:s().string.isRequired,dataSource:s().object,children:s().node,customProps:s().object},S.defaultProps={customProps:{}};const g=S}}]); +//# sourceMappingURL=451.bundle.44a0aaa91f1e65ee8fa2.js.map \ No newline at end of file diff --git a/resources/451.bundle.44a0aaa91f1e65ee8fa2.js.map b/resources/451.bundle.44a0aaa91f1e65ee8fa2.js.map new file mode 100644 index 0000000..3b5ded6 --- /dev/null +++ b/resources/451.bundle.44a0aaa91f1e65ee8fa2.js.map @@ -0,0 +1 @@ +{"version":3,"file":"451.bundle.44a0aaa91f1e65ee8fa2.js","mappings":"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","sources":["webpack:///../../../extensions/cornerstone-dicom-seg/src/utils/initSEGToolGroup.ts","webpack:///../../../extensions/cornerstone-dicom-seg/src/utils/promptHydrateSEG.ts","webpack:///../../../extensions/cornerstone-dicom-seg/src/viewports/OHIFCornerstoneSEGViewport.tsx","webpack:///../../../extensions/cornerstone-dicom-seg/src/viewports/_getStatusComponent.tsx"],"sourcesContent":["function createSEGToolGroupAndAddTools(ToolGroupService, customizationService, toolGroupId) {\r\n const { tools } = customizationService.get('cornerstone.overlayViewportTools') ?? {};\r\n\r\n return ToolGroupService.createToolGroupAndAddTools(toolGroupId, tools);\r\n}\r\n\r\nexport default createSEGToolGroupAndAddTools;\r\n","import { ButtonEnums } from '@ohif/ui';\r\n\r\nconst RESPONSE = {\r\n NO_NEVER: -1,\r\n CANCEL: 0,\r\n HYDRATE_SEG: 5,\r\n};\r\n\r\nfunction promptHydrateSEG({\r\n servicesManager,\r\n segDisplaySet,\r\n viewportId,\r\n preHydrateCallbacks,\r\n hydrateSEGDisplaySet,\r\n}) {\r\n const { uiViewportDialogService } = servicesManager.services;\r\n\r\n return new Promise(async function (resolve, reject) {\r\n const promptResult = await _askHydrate(uiViewportDialogService, viewportId);\r\n\r\n if (promptResult === RESPONSE.HYDRATE_SEG) {\r\n preHydrateCallbacks?.forEach(callback => {\r\n callback();\r\n });\r\n\r\n const isHydrated = await hydrateSEGDisplaySet({\r\n segDisplaySet,\r\n viewportId,\r\n });\r\n\r\n resolve(isHydrated);\r\n }\r\n });\r\n}\r\n\r\nfunction _askHydrate(uiViewportDialogService, viewportId) {\r\n return new Promise(function (resolve, reject) {\r\n const message = 'Do you want to open this Segmentation?';\r\n const actions = [\r\n {\r\n type: ButtonEnums.type.secondary,\r\n text: 'No',\r\n value: RESPONSE.CANCEL,\r\n },\r\n {\r\n type: ButtonEnums.type.primary,\r\n text: 'Yes',\r\n value: RESPONSE.HYDRATE_SEG,\r\n },\r\n ];\r\n const onSubmit = result => {\r\n uiViewportDialogService.hide();\r\n resolve(result);\r\n };\r\n\r\n uiViewportDialogService.show({\r\n viewportId,\r\n type: 'info',\r\n message,\r\n actions,\r\n onSubmit,\r\n onOutsideClick: () => {\r\n uiViewportDialogService.hide();\r\n resolve(RESPONSE.CANCEL);\r\n },\r\n });\r\n });\r\n}\r\n\r\nexport default promptHydrateSEG;\r\n","import PropTypes from 'prop-types';\r\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport OHIF, { utils } from '@ohif/core';\r\nimport { LoadingIndicatorTotalPercent, useViewportGrid, ViewportActionBar } from '@ohif/ui';\r\nimport createSEGToolGroupAndAddTools from '../utils/initSEGToolGroup';\r\nimport promptHydrateSEG from '../utils/promptHydrateSEG';\r\nimport _getStatusComponent from './_getStatusComponent';\r\n\r\nconst { formatDate } = utils;\r\nconst SEG_TOOLGROUP_BASE_NAME = 'SEGToolGroup';\r\n\r\nfunction OHIFCornerstoneSEGViewport(props) {\r\n const {\r\n children,\r\n displaySets,\r\n viewportOptions,\r\n viewportLabel,\r\n servicesManager,\r\n extensionManager,\r\n commandsManager,\r\n } = props;\r\n\r\n const { t } = useTranslation('SEGViewport');\r\n const viewportId = viewportOptions.viewportId;\r\n\r\n const {\r\n displaySetService,\r\n toolGroupService,\r\n segmentationService,\r\n uiNotificationService,\r\n customizationService,\r\n } = servicesManager.services;\r\n\r\n const toolGroupId = `${SEG_TOOLGROUP_BASE_NAME}-${viewportId}`;\r\n\r\n // SEG viewport will always have a single display set\r\n if (displaySets.length > 1) {\r\n throw new Error('SEG viewport should only have a single display set');\r\n }\r\n\r\n const segDisplaySet = displaySets[0];\r\n\r\n const [viewportGrid, viewportGridService] = useViewportGrid();\r\n\r\n // States\r\n const [selectedSegment, setSelectedSegment] = useState(1);\r\n\r\n // Hydration means that the SEG is opened and segments are loaded into the\r\n // segmentation panel, and SEG is also rendered on any viewport that is in the\r\n // same frameOfReferenceUID as the referencedSeriesUID of the SEG. However,\r\n // loading basically means SEG loading over network and bit unpacking of the\r\n // SEG data.\r\n const [isHydrated, setIsHydrated] = useState(segDisplaySet.isHydrated);\r\n const [segIsLoading, setSegIsLoading] = useState(!segDisplaySet.isLoaded);\r\n const [element, setElement] = useState(null);\r\n const [processingProgress, setProcessingProgress] = useState({\r\n percentComplete: null,\r\n totalSegments: null,\r\n });\r\n\r\n // refs\r\n const referencedDisplaySetRef = useRef(null);\r\n\r\n const { viewports, activeViewportId } = viewportGrid;\r\n\r\n const referencedDisplaySet = segDisplaySet.getReferenceDisplaySet();\r\n const referencedDisplaySetMetadata = _getReferencedDisplaySetMetadata(\r\n referencedDisplaySet,\r\n segDisplaySet\r\n );\r\n\r\n referencedDisplaySetRef.current = {\r\n displaySet: referencedDisplaySet,\r\n metadata: referencedDisplaySetMetadata,\r\n };\r\n /**\r\n * OnElementEnabled callback which is called after the cornerstoneExtension\r\n * has enabled the element. Note: we delegate all the image rendering to\r\n * cornerstoneExtension, so we don't need to do anything here regarding\r\n * the image rendering, element enabling etc.\r\n */\r\n const onElementEnabled = evt => {\r\n setElement(evt.detail.element);\r\n };\r\n\r\n const onElementDisabled = () => {\r\n setElement(null);\r\n };\r\n\r\n const storePresentationState = useCallback(() => {\r\n viewportGrid?.viewports.forEach(({ viewportId }) => {\r\n commandsManager.runCommand('storePresentation', {\r\n viewportId,\r\n });\r\n });\r\n }, [viewportGrid]);\r\n\r\n const getCornerstoneViewport = useCallback(() => {\r\n const { component: Component } = extensionManager.getModuleEntry(\r\n '@ohif/extension-cornerstone.viewportModule.cornerstone'\r\n );\r\n\r\n const { displaySet: referencedDisplaySet } = referencedDisplaySetRef.current;\r\n\r\n // Todo: jump to the center of the first segment\r\n return (\r\n \r\n );\r\n }, [viewportId, segDisplaySet, toolGroupId]);\r\n\r\n const onSegmentChange = useCallback(\r\n direction => {\r\n direction = direction === 'left' ? -1 : 1;\r\n const segmentationId = segDisplaySet.displaySetInstanceUID;\r\n const segmentation = segmentationService.getSegmentation(segmentationId);\r\n\r\n const { segments } = segmentation;\r\n\r\n const numberOfSegments = Object.keys(segments).length;\r\n\r\n let newSelectedSegmentIndex = selectedSegment + direction;\r\n\r\n // Segment 0 is always background\r\n\r\n if (newSelectedSegmentIndex > numberOfSegments - 1) {\r\n newSelectedSegmentIndex = 1;\r\n } else if (newSelectedSegmentIndex === 0) {\r\n newSelectedSegmentIndex = numberOfSegments - 1;\r\n }\r\n\r\n segmentationService.jumpToSegmentCenter(segmentationId, newSelectedSegmentIndex, toolGroupId);\r\n setSelectedSegment(newSelectedSegmentIndex);\r\n },\r\n [selectedSegment]\r\n );\r\n\r\n useEffect(() => {\r\n if (segIsLoading) {\r\n return;\r\n }\r\n\r\n promptHydrateSEG({\r\n servicesManager,\r\n viewportId,\r\n segDisplaySet,\r\n preHydrateCallbacks: [storePresentationState],\r\n hydrateSEGDisplaySet,\r\n }).then(isHydrated => {\r\n if (isHydrated) {\r\n setIsHydrated(true);\r\n }\r\n });\r\n }, [servicesManager, viewportId, segDisplaySet, segIsLoading]);\r\n\r\n useEffect(() => {\r\n const { unsubscribe } = segmentationService.subscribe(\r\n segmentationService.EVENTS.SEGMENTATION_LOADING_COMPLETE,\r\n evt => {\r\n if (evt.segDisplaySet.displaySetInstanceUID === segDisplaySet.displaySetInstanceUID) {\r\n setSegIsLoading(false);\r\n }\r\n\r\n if (evt.overlappingSegments) {\r\n uiNotificationService.show({\r\n title: 'Overlapping Segments',\r\n message: 'Overlapping segments detected which is not currently supported',\r\n type: 'warning',\r\n });\r\n }\r\n }\r\n );\r\n\r\n return () => {\r\n unsubscribe();\r\n };\r\n }, [segDisplaySet]);\r\n\r\n useEffect(() => {\r\n const { unsubscribe } = segmentationService.subscribe(\r\n segmentationService.EVENTS.SEGMENT_LOADING_COMPLETE,\r\n ({ percentComplete, numSegments }) => {\r\n setProcessingProgress({\r\n percentComplete,\r\n totalSegments: numSegments,\r\n });\r\n }\r\n );\r\n\r\n return () => {\r\n unsubscribe();\r\n };\r\n }, [segDisplaySet]);\r\n\r\n /**\r\n Cleanup the SEG viewport when the viewport is destroyed\r\n */\r\n useEffect(() => {\r\n const onDisplaySetsRemovedSubscription = displaySetService.subscribe(\r\n displaySetService.EVENTS.DISPLAY_SETS_REMOVED,\r\n ({ displaySetInstanceUIDs }) => {\r\n const activeViewport = viewports.get(activeViewportId);\r\n if (displaySetInstanceUIDs.includes(activeViewport.displaySetInstanceUID)) {\r\n viewportGridService.setDisplaySetsForViewport({\r\n viewportId: activeViewportId,\r\n displaySetInstanceUIDs: [],\r\n });\r\n }\r\n }\r\n );\r\n\r\n return () => {\r\n onDisplaySetsRemovedSubscription.unsubscribe();\r\n };\r\n }, []);\r\n\r\n useEffect(() => {\r\n let toolGroup = toolGroupService.getToolGroup(toolGroupId);\r\n\r\n if (toolGroup) {\r\n return;\r\n }\r\n\r\n // This creates a custom tool group which has the lifetime of this view\r\n // only, and does NOT interfere with currently displayed segmentations.\r\n toolGroup = createSEGToolGroupAndAddTools(toolGroupService, customizationService, toolGroupId);\r\n\r\n return () => {\r\n // remove the segmentation representations if seg displayset changed\r\n segmentationService.removeSegmentationRepresentationFromToolGroup(toolGroupId);\r\n\r\n // Only destroy the viewport specific implementation\r\n toolGroupService.destroyToolGroup(toolGroupId);\r\n };\r\n }, []);\r\n\r\n useEffect(() => {\r\n setIsHydrated(segDisplaySet.isHydrated);\r\n\r\n return () => {\r\n // remove the segmentation representations if seg displayset changed\r\n segmentationService.removeSegmentationRepresentationFromToolGroup(toolGroupId);\r\n referencedDisplaySetRef.current = null;\r\n };\r\n }, [segDisplaySet]);\r\n\r\n // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r\n let childrenWithProps = null;\r\n\r\n if (\r\n !referencedDisplaySetRef.current ||\r\n referencedDisplaySet.displaySetInstanceUID !==\r\n referencedDisplaySetRef.current.displaySet.displaySetInstanceUID\r\n ) {\r\n return null;\r\n }\r\n\r\n if (children && children.length) {\r\n childrenWithProps = children.map((child, index) => {\r\n return (\r\n child &&\r\n React.cloneElement(child, {\r\n viewportId,\r\n key: index,\r\n })\r\n );\r\n });\r\n }\r\n\r\n const {\r\n PatientID,\r\n PatientName,\r\n PatientSex,\r\n PatientAge,\r\n SliceThickness,\r\n ManufacturerModelName,\r\n StudyDate,\r\n SeriesDescription,\r\n SpacingBetweenSlices,\r\n } = referencedDisplaySetRef.current.metadata;\r\n\r\n const hydrateSEGDisplaySet = ({ segDisplaySet, viewportId }) => {\r\n commandsManager.runCommand('loadSegmentationDisplaySetsForViewport', {\r\n displaySets: [segDisplaySet],\r\n viewportId,\r\n });\r\n };\r\n\r\n const onStatusClick = async () => {\r\n // Before hydrating a SEG and make it added to all viewports in the grid\r\n // that share the same frameOfReferenceUID, we need to store the viewport grid\r\n // presentation state, so that we can restore it after hydrating the SEG. This is\r\n // required if the user has changed the viewport (other viewport than SEG viewport)\r\n // presentation state (w/l and invert) and then opens the SEG. If we don't store\r\n // the presentation state, the viewport will be reset to the default presentation\r\n storePresentationState();\r\n const isHydrated = await hydrateSEGDisplaySet({\r\n segDisplaySet,\r\n viewportId,\r\n });\r\n\r\n setIsHydrated(isHydrated);\r\n };\r\n return (\r\n <>\r\n {\r\n evt.stopPropagation();\r\n evt.preventDefault();\r\n }}\r\n onArrowsClick={onSegmentChange}\r\n getStatusComponent={() => {\r\n return _getStatusComponent({\r\n isHydrated,\r\n onStatusClick,\r\n });\r\n }}\r\n studyData={{\r\n label: viewportLabel,\r\n useAltStyling: true,\r\n studyDate: formatDate(StudyDate),\r\n seriesDescription: `SEG Viewport ${SeriesDescription}`,\r\n patientInformation: {\r\n patientName: PatientName ? OHIF.utils.formatPN(PatientName.Alphabetic) : '',\r\n patientSex: PatientSex || '',\r\n patientAge: PatientAge || '',\r\n MRN: PatientID || '',\r\n thickness: SliceThickness ? utils.roundNumber(SliceThickness, 2) : '',\r\n thicknessUnits: SliceThickness !== undefined ? 'mm' : '',\r\n spacing:\r\n SpacingBetweenSlices !== undefined ? utils.roundNumber(SpacingBetweenSlices, 2) : '',\r\n scanner: ManufacturerModelName || '',\r\n },\r\n }}\r\n />\r\n\r\n
\r\n {segIsLoading && (\r\n \r\n )}\r\n {getCornerstoneViewport()}\r\n {childrenWithProps}\r\n
\r\n \r\n );\r\n}\r\n\r\nOHIFCornerstoneSEGViewport.propTypes = {\r\n displaySets: PropTypes.arrayOf(PropTypes.object),\r\n viewportId: PropTypes.string.isRequired,\r\n dataSource: PropTypes.object,\r\n children: PropTypes.node,\r\n customProps: PropTypes.object,\r\n};\r\n\r\nOHIFCornerstoneSEGViewport.defaultProps = {\r\n customProps: {},\r\n};\r\n\r\nfunction _getReferencedDisplaySetMetadata(referencedDisplaySet, segDisplaySet) {\r\n const { SharedFunctionalGroupsSequence } = segDisplaySet.instance;\r\n\r\n const SharedFunctionalGroup = Array.isArray(SharedFunctionalGroupsSequence)\r\n ? SharedFunctionalGroupsSequence[0]\r\n : SharedFunctionalGroupsSequence;\r\n\r\n const { PixelMeasuresSequence } = SharedFunctionalGroup;\r\n\r\n const PixelMeasures = Array.isArray(PixelMeasuresSequence)\r\n ? PixelMeasuresSequence[0]\r\n : PixelMeasuresSequence;\r\n\r\n const { SpacingBetweenSlices, SliceThickness } = PixelMeasures;\r\n\r\n const image0 = referencedDisplaySet.images[0];\r\n const referencedDisplaySetMetadata = {\r\n PatientID: image0.PatientID,\r\n PatientName: image0.PatientName,\r\n PatientSex: image0.PatientSex,\r\n PatientAge: image0.PatientAge,\r\n SliceThickness: image0.SliceThickness || SliceThickness,\r\n StudyDate: image0.StudyDate,\r\n SeriesDescription: image0.SeriesDescription,\r\n SeriesInstanceUID: image0.SeriesInstanceUID,\r\n SeriesNumber: image0.SeriesNumber,\r\n ManufacturerModelName: image0.ManufacturerModelName,\r\n SpacingBetweenSlices: image0.SpacingBetweenSlices || SpacingBetweenSlices,\r\n };\r\n\r\n return referencedDisplaySetMetadata;\r\n}\r\n\r\nexport default OHIFCornerstoneSEGViewport;\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Icon, Tooltip } from '@ohif/ui';\r\n\r\nexport default function _getStatusComponent({ isHydrated, onStatusClick }) {\r\n let ToolTipMessage = null;\r\n let StatusIcon = null;\r\n\r\n const { t } = useTranslation('Common');\r\n const loadStr = t('LOAD');\r\n\r\n switch (isHydrated) {\r\n case true:\r\n StatusIcon = () => ;\r\n\r\n ToolTipMessage = () =>
This Segmentation is loaded in the segmentation panel
;\r\n break;\r\n case false:\r\n StatusIcon = () => (\r\n \r\n );\r\n\r\n ToolTipMessage = () =>
Click LOAD to load segmentation.
;\r\n }\r\n\r\n const StatusArea = () => (\r\n
\r\n
\r\n \r\n SEG\r\n
\r\n {!isHydrated && (\r\n \r\n {loadStr}\r\n
\r\n )}\r\n \r\n );\r\n\r\n return (\r\n <>\r\n {ToolTipMessage && (\r\n }\r\n position=\"bottom-left\"\r\n >\r\n \r\n \r\n )}\r\n {!ToolTipMessage && }\r\n \r\n );\r\n}\r\n"],"names":["ToolGroupService","customizationService","toolGroupId","tools","get","createToolGroupAndAddTools","RESPONSE","NO_NEVER","CANCEL","HYDRATE_SEG","_ref","servicesManager","segDisplaySet","viewportId","preHydrateCallbacks","hydrateSEGDisplaySet","uiViewportDialogService","services","Promise","async","resolve","reject","promptResult","message","actions","type","ButtonEnums","secondary","text","value","primary","onSubmit","result","hide","show","onOutsideClick","_askHydrate","forEach","callback","formatDate","utils","OHIFCornerstoneSEGViewport","props","children","displaySets","viewportOptions","viewportLabel","extensionManager","commandsManager","t","useTranslation","displaySetService","toolGroupService","segmentationService","uiNotificationService","length","Error","viewportGrid","viewportGridService","useViewportGrid","selectedSegment","setSelectedSegment","useState","isHydrated","setIsHydrated","segIsLoading","setSegIsLoading","isLoaded","element","setElement","processingProgress","setProcessingProgress","percentComplete","totalSegments","referencedDisplaySetRef","useRef","viewports","activeViewportId","referencedDisplaySet","getReferenceDisplaySet","referencedDisplaySetMetadata","SharedFunctionalGroupsSequence","instance","SharedFunctionalGroup","Array","isArray","PixelMeasuresSequence","PixelMeasures","SpacingBetweenSlices","SliceThickness","image0","images","PatientID","PatientName","PatientSex","PatientAge","StudyDate","SeriesDescription","SeriesInstanceUID","SeriesNumber","ManufacturerModelName","_getReferencedDisplaySetMetadata","current","displaySet","metadata","onElementEnabled","evt","detail","onElementDisabled","storePresentationState","useCallback","runCommand","getCornerstoneViewport","component","Component","getModuleEntry","React","_extends","viewportType","orientation","onSegmentChange","direction","segmentationId","displaySetInstanceUID","segmentation","getSegmentation","segments","numberOfSegments","Object","keys","newSelectedSegmentIndex","jumpToSegmentCenter","useEffect","promptHydrateSEG","then","unsubscribe","subscribe","EVENTS","SEGMENTATION_LOADING_COMPLETE","overlappingSegments","title","SEGMENT_LOADING_COMPLETE","_ref2","numSegments","onDisplaySetsRemovedSubscription","DISPLAY_SETS_REMOVED","_ref3","displaySetInstanceUIDs","activeViewport","includes","setDisplaySetsForViewport","toolGroup","getToolGroup","createSEGToolGroupAndAddTools","removeSegmentationRepresentationFromToolGroup","destroyToolGroup","childrenWithProps","map","child","index","key","_ref4","onStatusClick","ViewportActionBar","onDoubleClick","stopPropagation","preventDefault","onArrowsClick","getStatusComponent","ToolTipMessage","StatusIcon","loadStr","Icon","name","className","StatusArea","onMouseUp","Tooltip","content","position","_getStatusComponent","studyData","label","useAltStyling","studyDate","seriesDescription","patientInformation","patientName","OHIF","formatPN","Alphabetic","patientSex","patientAge","MRN","thickness","roundNumber","thicknessUnits","undefined","spacing","scanner","LoadingIndicatorTotalPercent","totalNumbers","loadingText","propTypes","PropTypes","isRequired","dataSource","customProps","defaultProps"],"sourceRoot":""} \ No newline at end of file diff --git a/resources/471.bundle.bafce1ad27e0bc5c8db5.js b/resources/471.bundle.bafce1ad27e0bc5c8db5.js new file mode 100644 index 0000000..f3c4cef --- /dev/null +++ b/resources/471.bundle.bafce1ad27e0bc5c8db5.js @@ -0,0 +1,2 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[471],{56471:(e,t,n)=>{n.r(t),n.d(t,{default:()=>y});var a=n(43001),r=n(3827),s=n.n(r),o=n(71771),i=n(71783);const l={NO_NEVER:-1,CANCEL:0,HYDRATE_SEG:5};const c=function(e){let{servicesManager:t,rtDisplaySet:n,viewportId:a,toolGroupId:r="default",preHydrateCallbacks:s,hydrateRTDisplaySet:o}=e;const{uiViewportDialogService:c}=t.services;return new Promise((async function(e,u){const p=await function(e,t){return new Promise((function(n,a){const r="Do you want to open this Segmentation?",s=[{type:i.LZ.dt.secondary,text:"No",value:l.CANCEL},{type:i.LZ.dt.primary,text:"Yes",value:l.HYDRATE_SEG}],o=t=>{e.hide(),n(t)};e.show({viewportId:t,type:"info",message:r,actions:s,onSubmit:o,onOutsideClick:()=>{e.hide(),n(l.CANCEL)}})}))}(c,a);if(p===l.HYDRATE_SEG){s?.forEach((e=>{e()}));e(await o({rtDisplaySet:n,viewportId:a,toolGroupId:r,servicesManager:t}))}}))};var u=n(69190);const p=function(e,t,n){const{tools:a}=t.get("cornerstone.overlayViewportTools")??{};return e.createToolGroupAndAddTools(n,a)};function d(){return d=Object.assign?Object.assign.bind():function(e){for(var t=1;t1)throw new Error("RT viewport should only have a single display set");const b=n[0],[h,T]=(0,i.O_)(),[N,C]=(0,a.useState)(!1),[k,P]=(0,a.useState)(1),[O,x]=(0,a.useState)(b.isHydrated),[R,A]=(0,a.useState)(!b.isLoaded),[M,G]=(0,a.useState)(null),[L,U]=(0,a.useState)({percentComplete:null,totalSegments:null}),V=(0,a.useRef)(null),{viewports:_,activeViewportId:H}=h,j=b.getReferenceDisplaySet(),F=function(e){const t=e.images[0],n={PatientID:t.PatientID,PatientName:t.PatientName,PatientSex:t.PatientSex,PatientAge:t.PatientAge,SliceThickness:t.SliceThickness,StudyDate:t.StudyDate,SeriesDescription:t.SeriesDescription,SeriesInstanceUID:t.SeriesInstanceUID,SeriesNumber:t.SeriesNumber,ManufacturerModelName:t.ManufacturerModelName,SpacingBetweenSlices:t.SpacingBetweenSlices};return n}(j);V.current={displaySet:j,metadata:F};const Y=e=>{G(e.detail.element)},$=()=>{G(null)},B=(0,a.useCallback)((()=>{h?.viewports.forEach((e=>{let{viewportId:t}=e;y.runCommand("storePresentation",{viewportId:t})}))}),[h]),q=e=>{let{rtDisplaySet:t,viewportId:n}=e;y.runCommand("loadSegmentationDisplaySetsForViewport",{displaySets:[t],viewportId:n})},J=(0,a.useCallback)((()=>{const{component:t}=S.getModuleEntry("@ohif/extension-cornerstone.viewportModule.cornerstone"),{displaySet:n}=V.current;return a.createElement(t,d({},e,{displaySets:[n,b],viewportOptions:{viewportType:"volume",toolGroupId:I,orientation:r.orientation,viewportId:r.viewportId},onElementEnabled:Y,onElementDisabled:$}))}),[D,b,I]),Z=(0,a.useCallback)((e=>{e="left"===e?-1:1;const t=b.displaySetInstanceUID,n=f.getSegmentation(t),{segments:a}=n,r=Object.keys(a).length;let s=k+e;s>=r-1?s=1:0===s&&(s=r-1),f.jumpToSegmentCenter(t,s,I),P(s)}),[k]);(0,a.useEffect)((()=>{R||c({servicesManager:l,viewportId:D,rtDisplaySet:b,preHydrateCallbacks:[B],hydrateRTDisplaySet:q}).then((e=>{e&&x(!0)}))}),[l,D,b,R]),(0,a.useEffect)((()=>{const{unsubscribe:e}=f.subscribe(f.EVENTS.SEGMENTATION_LOADING_COMPLETE,(e=>{e.rtDisplaySet.displaySetInstanceUID===b.displaySetInstanceUID&&A(!1),e.overlappingSegments&&E.show({title:"Overlapping Segments",message:"Overlapping segments detected which is not currently supported",type:"warning"})}));return()=>{e()}}),[b]),(0,a.useEffect)((()=>{const{unsubscribe:e}=f.subscribe(f.EVENTS.SEGMENT_LOADING_COMPLETE,(e=>{let{percentComplete:t,numSegments:n}=e;U({percentComplete:t,totalSegments:n})}));return()=>{e()}}),[b]),(0,a.useEffect)((()=>{const e=g.subscribe(g.EVENTS.DISPLAY_SETS_REMOVED,(e=>{let{displaySetInstanceUIDs:t}=e;const n=_.get(H);t.includes(n.displaySetInstanceUID)&&T.setDisplaySetsForViewport({viewportId:H,displaySetInstanceUIDs:[]})}));return()=>{e.unsubscribe()}}),[]),(0,a.useEffect)((()=>{let e=v.getToolGroup(I);if(!e)return e=p(v,w,I),C(!0),()=>{f.removeSegmentationRepresentationFromToolGroup(I),v.destroyToolGroup(I)}}),[]),(0,a.useEffect)((()=>(x(b.isHydrated),()=>{f.removeSegmentationRepresentationFromToolGroup(I),V.current=null})),[b]);let z=null;if(!V.current||j.displaySetInstanceUID!==V.current.displaySet.displaySetInstanceUID)return null;t&&t.length&&(z=t.map(((e,t)=>e&&a.cloneElement(e,{viewportId:D,key:t}))));const{PatientID:K,PatientName:Q,PatientSex:W,PatientAge:X,SliceThickness:ee,ManufacturerModelName:te,StudyDate:ne,SeriesDescription:ae,SpacingBetweenSlices:re,SeriesNumber:se}=V.current.metadata,oe=async()=>{B();const e=await q({rtDisplaySet:b,viewportId:D});x(e)};return a.createElement(a.Fragment,null,a.createElement(i.uY,{onDoubleClick:e=>{e.stopPropagation(),e.preventDefault()},onArrowsClick:Z,getStatusComponent:()=>function(e){let{isHydrated:t,onStatusClick:n}=e,r=null,s=null;const{t:o}=(0,u.$G)("Common"),l=o("LOAD");switch(t){case!0:s=()=>a.createElement(i.JO,{name:"status-alert"}),r=()=>a.createElement("div",null,"This Segmentation is loaded in the segmentation panel");break;case!1:s=()=>a.createElement(i.JO,{className:"text-aqua-pale",name:"status-untracked"}),r=()=>a.createElement("div",null,"Click LOAD to load RTSTRUCT.")}const c=()=>a.createElement("div",{className:"flex h-6 cursor-default text-sm leading-6 text-white"},a.createElement("div",{className:"bg-customgray-100 flex min-w-[45px] items-center rounded-l-xl rounded-r p-1"},a.createElement(s,null),a.createElement("span",{className:"ml-1"},"RTSTRUCT")),!t&&a.createElement("div",{className:"bg-primary-main hover:bg-primary-light ml-1 cursor-pointer rounded px-1.5 hover:text-black",onMouseUp:n},l));return a.createElement(a.Fragment,null,r&&a.createElement(i.u,{content:a.createElement(r,null),position:"bottom-left"},a.createElement(c,null)),!r&&a.createElement(c,null))}({isHydrated:O,onStatusClick:oe}),studyData:{label:s,useAltStyling:!0,studyDate:m(ne),currentSeries:se,seriesDescription:`RT Viewport ${ae}`,patientInformation:{patientName:Q?o.default.utils.formatPN(Q.Alphabetic):"",patientSex:W||"",patientAge:X||"",MRN:K||"",thickness:ee?`${ee.toFixed(2)}mm`:"",spacing:void 0!==re?`${re.toFixed(2)}mm`:"",scanner:te||""}}}),a.createElement("div",{className:"relative flex h-full w-full flex-row overflow-hidden"},R&&a.createElement(i.bk,{className:"h-full w-full",totalNumbers:L.totalSegments,percentComplete:L.percentComplete,loadingText:"Loading RTSTRUCT..."}),J(),z))}S.propTypes={displaySets:s().arrayOf(s().object),viewportId:s().string.isRequired,dataSource:s().object,children:s().node,customProps:s().object},S.defaultProps={customProps:{}};const y=S}}]); +//# sourceMappingURL=471.bundle.bafce1ad27e0bc5c8db5.js.map \ No newline at end of file diff --git a/resources/471.bundle.bafce1ad27e0bc5c8db5.js.map b/resources/471.bundle.bafce1ad27e0bc5c8db5.js.map new file mode 100644 index 0000000..b68fde1 --- /dev/null +++ b/resources/471.bundle.bafce1ad27e0bc5c8db5.js.map @@ -0,0 +1 @@ +{"version":3,"file":"471.bundle.bafce1ad27e0bc5c8db5.js","mappings":"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","sources":["webpack:///../../../extensions/cornerstone-dicom-rt/src/utils/promptHydrateRT.ts","webpack:///../../../extensions/cornerstone-dicom-rt/src/utils/initRTToolGroup.ts","webpack:///../../../extensions/cornerstone-dicom-rt/src/viewports/OHIFCornerstoneRTViewport.tsx","webpack:///../../../extensions/cornerstone-dicom-rt/src/viewports/_getStatusComponent.tsx"],"sourcesContent":["import { ButtonEnums } from '@ohif/ui';\r\n\r\nconst RESPONSE = {\r\n NO_NEVER: -1,\r\n CANCEL: 0,\r\n HYDRATE_SEG: 5,\r\n};\r\n\r\nfunction promptHydrateRT({\r\n servicesManager,\r\n rtDisplaySet,\r\n viewportId,\r\n toolGroupId = 'default',\r\n preHydrateCallbacks,\r\n hydrateRTDisplaySet,\r\n}) {\r\n const { uiViewportDialogService } = servicesManager.services;\r\n\r\n return new Promise(async function (resolve, reject) {\r\n const promptResult = await _askHydrate(uiViewportDialogService, viewportId);\r\n\r\n if (promptResult === RESPONSE.HYDRATE_SEG) {\r\n preHydrateCallbacks?.forEach(callback => {\r\n callback();\r\n });\r\n\r\n const isHydrated = await hydrateRTDisplaySet({\r\n rtDisplaySet,\r\n viewportId,\r\n toolGroupId,\r\n servicesManager,\r\n });\r\n\r\n resolve(isHydrated);\r\n }\r\n });\r\n}\r\n\r\nfunction _askHydrate(uiViewportDialogService, viewportId) {\r\n return new Promise(function (resolve, reject) {\r\n const message = 'Do you want to open this Segmentation?';\r\n const actions = [\r\n {\r\n type: ButtonEnums.type.secondary,\r\n text: 'No',\r\n value: RESPONSE.CANCEL,\r\n },\r\n {\r\n type: ButtonEnums.type.primary,\r\n text: 'Yes',\r\n value: RESPONSE.HYDRATE_SEG,\r\n },\r\n ];\r\n const onSubmit = result => {\r\n uiViewportDialogService.hide();\r\n resolve(result);\r\n };\r\n\r\n uiViewportDialogService.show({\r\n viewportId,\r\n type: 'info',\r\n message,\r\n actions,\r\n onSubmit,\r\n onOutsideClick: () => {\r\n uiViewportDialogService.hide();\r\n resolve(RESPONSE.CANCEL);\r\n },\r\n });\r\n });\r\n}\r\n\r\nexport default promptHydrateRT;\r\n","function createRTToolGroupAndAddTools(ToolGroupService, customizationService, toolGroupId) {\r\n const { tools } = customizationService.get('cornerstone.overlayViewportTools') ?? {};\r\n\r\n return ToolGroupService.createToolGroupAndAddTools(toolGroupId, tools);\r\n}\r\n\r\nexport default createRTToolGroupAndAddTools;\r\n","import React, { useCallback, useEffect, useRef, useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport OHIF, { utils } from '@ohif/core';\r\nimport { ViewportActionBar, useViewportGrid, LoadingIndicatorTotalPercent } from '@ohif/ui';\r\n\r\nimport promptHydrateRT from '../utils/promptHydrateRT';\r\nimport _getStatusComponent from './_getStatusComponent';\r\nimport createRTToolGroupAndAddTools from '../utils/initRTToolGroup';\r\n\r\nconst { formatDate } = utils;\r\nconst RT_TOOLGROUP_BASE_NAME = 'RTToolGroup';\r\n\r\nfunction OHIFCornerstoneRTViewport(props) {\r\n const {\r\n children,\r\n displaySets,\r\n viewportOptions,\r\n viewportLabel,\r\n servicesManager,\r\n extensionManager,\r\n commandsManager,\r\n } = props;\r\n\r\n const {\r\n displaySetService,\r\n toolGroupService,\r\n segmentationService,\r\n uiNotificationService,\r\n customizationService,\r\n } = servicesManager.services;\r\n\r\n const viewportId = viewportOptions.viewportId;\r\n\r\n const toolGroupId = `${RT_TOOLGROUP_BASE_NAME}-${viewportId}`;\r\n\r\n // RT viewport will always have a single display set\r\n if (displaySets.length > 1) {\r\n throw new Error('RT viewport should only have a single display set');\r\n }\r\n\r\n const rtDisplaySet = displaySets[0];\r\n\r\n const [viewportGrid, viewportGridService] = useViewportGrid();\r\n\r\n // States\r\n const [isToolGroupCreated, setToolGroupCreated] = useState(false);\r\n const [selectedSegment, setSelectedSegment] = useState(1);\r\n\r\n // Hydration means that the RT is opened and segments are loaded into the\r\n // segmentation panel, and RT is also rendered on any viewport that is in the\r\n // same frameOfReferenceUID as the referencedSeriesUID of the RT. However,\r\n // loading basically means RT loading over network and bit unpacking of the\r\n // RT data.\r\n const [isHydrated, setIsHydrated] = useState(rtDisplaySet.isHydrated);\r\n const [rtIsLoading, setRtIsLoading] = useState(!rtDisplaySet.isLoaded);\r\n const [element, setElement] = useState(null);\r\n const [processingProgress, setProcessingProgress] = useState({\r\n percentComplete: null,\r\n totalSegments: null,\r\n });\r\n\r\n // refs\r\n const referencedDisplaySetRef = useRef(null);\r\n\r\n const { viewports, activeViewportId } = viewportGrid;\r\n\r\n const referencedDisplaySet = rtDisplaySet.getReferenceDisplaySet();\r\n const referencedDisplaySetMetadata = _getReferencedDisplaySetMetadata(referencedDisplaySet);\r\n\r\n referencedDisplaySetRef.current = {\r\n displaySet: referencedDisplaySet,\r\n metadata: referencedDisplaySetMetadata,\r\n };\r\n /**\r\n * OnElementEnabled callback which is called after the cornerstoneExtension\r\n * has enabled the element. Note: we delegate all the image rendering to\r\n * cornerstoneExtension, so we don't need to do anything here regarding\r\n * the image rendering, element enabling etc.\r\n */\r\n const onElementEnabled = evt => {\r\n setElement(evt.detail.element);\r\n };\r\n\r\n const onElementDisabled = () => {\r\n setElement(null);\r\n };\r\n\r\n const storePresentationState = useCallback(() => {\r\n viewportGrid?.viewports.forEach(({ viewportId }) => {\r\n commandsManager.runCommand('storePresentation', {\r\n viewportId,\r\n });\r\n });\r\n }, [viewportGrid]);\r\n\r\n const hydrateRTDisplaySet = ({ rtDisplaySet, viewportId }) => {\r\n commandsManager.runCommand('loadSegmentationDisplaySetsForViewport', {\r\n displaySets: [rtDisplaySet],\r\n viewportId,\r\n });\r\n };\r\n\r\n const getCornerstoneViewport = useCallback(() => {\r\n const { component: Component } = extensionManager.getModuleEntry(\r\n '@ohif/extension-cornerstone.viewportModule.cornerstone'\r\n );\r\n\r\n const { displaySet: referencedDisplaySet } = referencedDisplaySetRef.current;\r\n\r\n // Todo: jump to the center of the first segment\r\n return (\r\n \r\n );\r\n }, [viewportId, rtDisplaySet, toolGroupId]);\r\n\r\n const onSegmentChange = useCallback(\r\n direction => {\r\n direction = direction === 'left' ? -1 : 1;\r\n const segmentationId = rtDisplaySet.displaySetInstanceUID;\r\n const segmentation = segmentationService.getSegmentation(segmentationId);\r\n\r\n const { segments } = segmentation;\r\n\r\n const numberOfSegments = Object.keys(segments).length;\r\n\r\n let newSelectedSegmentIndex = selectedSegment + direction;\r\n\r\n // Segment 0 is always background\r\n if (newSelectedSegmentIndex >= numberOfSegments - 1) {\r\n newSelectedSegmentIndex = 1;\r\n } else if (newSelectedSegmentIndex === 0) {\r\n newSelectedSegmentIndex = numberOfSegments - 1;\r\n }\r\n\r\n segmentationService.jumpToSegmentCenter(segmentationId, newSelectedSegmentIndex, toolGroupId);\r\n setSelectedSegment(newSelectedSegmentIndex);\r\n },\r\n [selectedSegment]\r\n );\r\n\r\n useEffect(() => {\r\n if (rtIsLoading) {\r\n return;\r\n }\r\n\r\n promptHydrateRT({\r\n servicesManager,\r\n viewportId,\r\n rtDisplaySet,\r\n preHydrateCallbacks: [storePresentationState],\r\n hydrateRTDisplaySet,\r\n }).then(isHydrated => {\r\n if (isHydrated) {\r\n setIsHydrated(true);\r\n }\r\n });\r\n }, [servicesManager, viewportId, rtDisplaySet, rtIsLoading]);\r\n\r\n useEffect(() => {\r\n const { unsubscribe } = segmentationService.subscribe(\r\n segmentationService.EVENTS.SEGMENTATION_LOADING_COMPLETE,\r\n evt => {\r\n if (evt.rtDisplaySet.displaySetInstanceUID === rtDisplaySet.displaySetInstanceUID) {\r\n setRtIsLoading(false);\r\n }\r\n\r\n if (evt.overlappingSegments) {\r\n uiNotificationService.show({\r\n title: 'Overlapping Segments',\r\n message: 'Overlapping segments detected which is not currently supported',\r\n type: 'warning',\r\n });\r\n }\r\n }\r\n );\r\n\r\n return () => {\r\n unsubscribe();\r\n };\r\n }, [rtDisplaySet]);\r\n\r\n useEffect(() => {\r\n const { unsubscribe } = segmentationService.subscribe(\r\n segmentationService.EVENTS.SEGMENT_LOADING_COMPLETE,\r\n ({ percentComplete, numSegments }) => {\r\n setProcessingProgress({\r\n percentComplete,\r\n totalSegments: numSegments,\r\n });\r\n }\r\n );\r\n\r\n return () => {\r\n unsubscribe();\r\n };\r\n }, [rtDisplaySet]);\r\n\r\n /**\r\n Cleanup the SEG viewport when the viewport is destroyed\r\n */\r\n useEffect(() => {\r\n const onDisplaySetsRemovedSubscription = displaySetService.subscribe(\r\n displaySetService.EVENTS.DISPLAY_SETS_REMOVED,\r\n ({ displaySetInstanceUIDs }) => {\r\n const activeViewport = viewports.get(activeViewportId);\r\n if (displaySetInstanceUIDs.includes(activeViewport.displaySetInstanceUID)) {\r\n viewportGridService.setDisplaySetsForViewport({\r\n viewportId: activeViewportId,\r\n displaySetInstanceUIDs: [],\r\n });\r\n }\r\n }\r\n );\r\n\r\n return () => {\r\n onDisplaySetsRemovedSubscription.unsubscribe();\r\n };\r\n }, []);\r\n\r\n useEffect(() => {\r\n let toolGroup = toolGroupService.getToolGroup(toolGroupId);\r\n\r\n if (toolGroup) {\r\n return;\r\n }\r\n\r\n toolGroup = createRTToolGroupAndAddTools(toolGroupService, customizationService, toolGroupId);\r\n\r\n setToolGroupCreated(true);\r\n\r\n return () => {\r\n // remove the segmentation representations if seg displayset changed\r\n segmentationService.removeSegmentationRepresentationFromToolGroup(toolGroupId);\r\n\r\n toolGroupService.destroyToolGroup(toolGroupId);\r\n };\r\n }, []);\r\n\r\n useEffect(() => {\r\n setIsHydrated(rtDisplaySet.isHydrated);\r\n\r\n return () => {\r\n // remove the segmentation representations if seg displayset changed\r\n segmentationService.removeSegmentationRepresentationFromToolGroup(toolGroupId);\r\n referencedDisplaySetRef.current = null;\r\n };\r\n }, [rtDisplaySet]);\r\n\r\n // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r\n let childrenWithProps = null;\r\n\r\n if (\r\n !referencedDisplaySetRef.current ||\r\n referencedDisplaySet.displaySetInstanceUID !==\r\n referencedDisplaySetRef.current.displaySet.displaySetInstanceUID\r\n ) {\r\n return null;\r\n }\r\n\r\n if (children && children.length) {\r\n childrenWithProps = children.map((child, index) => {\r\n return (\r\n child &&\r\n React.cloneElement(child, {\r\n viewportId,\r\n key: index,\r\n })\r\n );\r\n });\r\n }\r\n\r\n const {\r\n PatientID,\r\n PatientName,\r\n PatientSex,\r\n PatientAge,\r\n SliceThickness,\r\n ManufacturerModelName,\r\n StudyDate,\r\n SeriesDescription,\r\n SpacingBetweenSlices,\r\n SeriesNumber,\r\n } = referencedDisplaySetRef.current.metadata;\r\n\r\n const onStatusClick = async () => {\r\n // Before hydrating a RT and make it added to all viewports in the grid\r\n // that share the same frameOfReferenceUID, we need to store the viewport grid\r\n // presentation state, so that we can restore it after hydrating the RT. This is\r\n // required if the user has changed the viewport (other viewport than RT viewport)\r\n // presentation state (w/l and invert) and then opens the RT. If we don't store\r\n // the presentation state, the viewport will be reset to the default presentation\r\n storePresentationState();\r\n const isHydrated = await hydrateRTDisplaySet({\r\n rtDisplaySet,\r\n viewportId,\r\n });\r\n\r\n setIsHydrated(isHydrated);\r\n };\r\n\r\n return (\r\n <>\r\n {\r\n evt.stopPropagation();\r\n evt.preventDefault();\r\n }}\r\n onArrowsClick={onSegmentChange}\r\n getStatusComponent={() => {\r\n return _getStatusComponent({\r\n isHydrated,\r\n onStatusClick,\r\n });\r\n }}\r\n studyData={{\r\n label: viewportLabel,\r\n useAltStyling: true,\r\n studyDate: formatDate(StudyDate),\r\n currentSeries: SeriesNumber,\r\n seriesDescription: `RT Viewport ${SeriesDescription}`,\r\n patientInformation: {\r\n patientName: PatientName ? OHIF.utils.formatPN(PatientName.Alphabetic) : '',\r\n patientSex: PatientSex || '',\r\n patientAge: PatientAge || '',\r\n MRN: PatientID || '',\r\n thickness: SliceThickness ? `${SliceThickness.toFixed(2)}mm` : '',\r\n spacing:\r\n SpacingBetweenSlices !== undefined ? `${SpacingBetweenSlices.toFixed(2)}mm` : '',\r\n scanner: ManufacturerModelName || '',\r\n },\r\n }}\r\n />\r\n\r\n
\r\n {rtIsLoading && (\r\n \r\n )}\r\n {getCornerstoneViewport()}\r\n {childrenWithProps}\r\n
\r\n \r\n );\r\n}\r\n\r\nOHIFCornerstoneRTViewport.propTypes = {\r\n displaySets: PropTypes.arrayOf(PropTypes.object),\r\n viewportId: PropTypes.string.isRequired,\r\n dataSource: PropTypes.object,\r\n children: PropTypes.node,\r\n customProps: PropTypes.object,\r\n};\r\n\r\nOHIFCornerstoneRTViewport.defaultProps = {\r\n customProps: {},\r\n};\r\n\r\nfunction _getReferencedDisplaySetMetadata(referencedDisplaySet) {\r\n const image0 = referencedDisplaySet.images[0];\r\n const referencedDisplaySetMetadata = {\r\n PatientID: image0.PatientID,\r\n PatientName: image0.PatientName,\r\n PatientSex: image0.PatientSex,\r\n PatientAge: image0.PatientAge,\r\n SliceThickness: image0.SliceThickness,\r\n StudyDate: image0.StudyDate,\r\n SeriesDescription: image0.SeriesDescription,\r\n SeriesInstanceUID: image0.SeriesInstanceUID,\r\n SeriesNumber: image0.SeriesNumber,\r\n ManufacturerModelName: image0.ManufacturerModelName,\r\n SpacingBetweenSlices: image0.SpacingBetweenSlices,\r\n };\r\n\r\n return referencedDisplaySetMetadata;\r\n}\r\n\r\nexport default OHIFCornerstoneRTViewport;\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Icon, Tooltip } from '@ohif/ui';\r\n\r\nexport default function _getStatusComponent({ isHydrated, onStatusClick }) {\r\n let ToolTipMessage = null;\r\n let StatusIcon = null;\r\n\r\n const { t } = useTranslation('Common');\r\n const loadStr = t('LOAD');\r\n\r\n switch (isHydrated) {\r\n case true:\r\n StatusIcon = () => ;\r\n\r\n ToolTipMessage = () =>
This Segmentation is loaded in the segmentation panel
;\r\n break;\r\n case false:\r\n StatusIcon = () => (\r\n \r\n );\r\n\r\n ToolTipMessage = () =>
Click LOAD to load RTSTRUCT.
;\r\n }\r\n\r\n const StatusArea = () => (\r\n
\r\n
\r\n \r\n RTSTRUCT\r\n
\r\n {!isHydrated && (\r\n \r\n {loadStr}\r\n
\r\n )}\r\n \r\n );\r\n\r\n return (\r\n <>\r\n {ToolTipMessage && (\r\n }\r\n position=\"bottom-left\"\r\n >\r\n \r\n \r\n )}\r\n {!ToolTipMessage && }\r\n \r\n );\r\n}\r\n"],"names":["RESPONSE","NO_NEVER","CANCEL","HYDRATE_SEG","_ref","servicesManager","rtDisplaySet","viewportId","toolGroupId","preHydrateCallbacks","hydrateRTDisplaySet","uiViewportDialogService","services","Promise","async","resolve","reject","promptResult","message","actions","type","ButtonEnums","secondary","text","value","primary","onSubmit","result","hide","show","onOutsideClick","_askHydrate","forEach","callback","ToolGroupService","customizationService","tools","get","createToolGroupAndAddTools","formatDate","utils","OHIFCornerstoneRTViewport","props","children","displaySets","viewportOptions","viewportLabel","extensionManager","commandsManager","displaySetService","toolGroupService","segmentationService","uiNotificationService","length","Error","viewportGrid","viewportGridService","useViewportGrid","isToolGroupCreated","setToolGroupCreated","useState","selectedSegment","setSelectedSegment","isHydrated","setIsHydrated","rtIsLoading","setRtIsLoading","isLoaded","element","setElement","processingProgress","setProcessingProgress","percentComplete","totalSegments","referencedDisplaySetRef","useRef","viewports","activeViewportId","referencedDisplaySet","getReferenceDisplaySet","referencedDisplaySetMetadata","image0","images","PatientID","PatientName","PatientSex","PatientAge","SliceThickness","StudyDate","SeriesDescription","SeriesInstanceUID","SeriesNumber","ManufacturerModelName","SpacingBetweenSlices","_getReferencedDisplaySetMetadata","current","displaySet","metadata","onElementEnabled","evt","detail","onElementDisabled","storePresentationState","useCallback","runCommand","_ref2","getCornerstoneViewport","component","Component","getModuleEntry","React","_extends","viewportType","orientation","onSegmentChange","direction","segmentationId","displaySetInstanceUID","segmentation","getSegmentation","segments","numberOfSegments","Object","keys","newSelectedSegmentIndex","jumpToSegmentCenter","useEffect","promptHydrateRT","then","unsubscribe","subscribe","EVENTS","SEGMENTATION_LOADING_COMPLETE","overlappingSegments","title","SEGMENT_LOADING_COMPLETE","_ref3","numSegments","onDisplaySetsRemovedSubscription","DISPLAY_SETS_REMOVED","_ref4","displaySetInstanceUIDs","activeViewport","includes","setDisplaySetsForViewport","toolGroup","getToolGroup","createRTToolGroupAndAddTools","removeSegmentationRepresentationFromToolGroup","destroyToolGroup","childrenWithProps","map","child","index","key","onStatusClick","ViewportActionBar","onDoubleClick","stopPropagation","preventDefault","onArrowsClick","getStatusComponent","ToolTipMessage","StatusIcon","t","useTranslation","loadStr","Icon","name","className","StatusArea","onMouseUp","Tooltip","content","position","_getStatusComponent","studyData","label","useAltStyling","studyDate","currentSeries","seriesDescription","patientInformation","patientName","OHIF","formatPN","Alphabetic","patientSex","patientAge","MRN","thickness","toFixed","spacing","undefined","scanner","LoadingIndicatorTotalPercent","totalNumbers","loadingText","propTypes","PropTypes","isRequired","dataSource","customProps","defaultProps"],"sourceRoot":""} \ No newline at end of file diff --git a/resources/5004fdc02f329ce53b69.wasm b/resources/5004fdc02f329ce53b69.wasm new file mode 100644 index 0000000..1502e49 Binary files /dev/null and b/resources/5004fdc02f329ce53b69.wasm differ diff --git a/resources/506.bundle.e497ce6e8958ced779c8.js b/resources/506.bundle.e497ce6e8958ced779c8.js new file mode 100644 index 0000000..3eb3ca1 --- /dev/null +++ b/resources/506.bundle.e497ce6e8958ced779c8.js @@ -0,0 +1,2 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[506],{53506:(e,n,t)=>{t.r(n),t.d(n,{default:()=>y});const r=JSON.parse('{"u2":"@ohif/extension-cornerstone-dicom-rt"}').u2,s=`${r}.sopClassHandlerModule.dicom-rt`;var o=t(43001),a=t(71771),c=t(67540);const{DicomMessage:i,DicomMetaDictionary:u}=c.default.data,l=c.default.data.Colors.dicomlab2RGB;async function I(e,n,t,r){const s=e.getModuleEntry("@ohif/extension-cornerstone.utilityModule.common"),o=e.getActiveDataSource()[0],{bulkDataURI:a}=o.getConfig?.()||{},{dicomLoaderService:c}=s.exports;!function(e){e.images.map((e=>({imageId:e.imageId,sopInstanceUID:e.SOPInstanceUID})))}(t);n.isLoaded=!0;let l=n.instance;if(a&&a.enabled)await async function(e,n){if(!e||!e.ROIContourSequence)return Promise.reject("Invalid instance object or ROIContourSequence");const t=new Map;for(const r of e.ROIContourSequence){const s=r.ReferencedROINumber;if(r&&r.ContourSequence)for(const o of r.ContourSequence){if(!o||!o.ContourData)return Promise.reject("Invalid Contour or ContourData");const r=o.ContourData;if(Array.isArray(r))t.has(s)?t.get(s).push(Promise.resolve(r)):t.set(s,[Promise.resolve(r)]);else{if(!r||!r.BulkDataURI)return Promise.reject(`Invalid ContourData: ${r}`);{const o=r.BulkDataURI;if(!n||!n.retrieve||!n.retrieve.bulkDataURI)return Promise.reject("Invalid datasource object or retrieve function");const a=n.retrieve.bulkDataURI({BulkDataURI:o,StudyInstanceUID:e.StudyInstanceUID,SeriesInstanceUID:e.SeriesInstanceUID,SOPInstanceUID:e.SOPInstanceUID});t.has(s)?t.get(s).push(a):t.set(s,[a])}}}else t.set(s,[Promise.resolve([])])}const r=new Map;for(const[e,n]of t.entries())r.set(e,await Promise.allSettled(n));e.ROIContourSequence.forEach((e=>{try{const n=e.ReferencedROINumber,t=r.get(n);e.ContourSequence&&e.ContourSequence.forEach(((e,n)=>{const r=t[n];if("fulfilled"===r.status)if(Array.isArray(r.value)&&r.value.every(Number.isFinite))e.ContourData=r.value;else{const n=new Uint8Array(r.value),t=(new TextDecoder).decode(n);"string"==typeof t&&t.includes("\\")?e.ContourData=t.split("\\").map(parseFloat):e.ContourData=[]}else console.error(r.reason)}))}catch(e){console.error(e)}}))}(l,o);else{const e=await c.findDicomDataPromise(n,null,r),t=i.readFile(e),s=u.naturalizeDataset(t.dict);s._meta=u.namifyDataset(t.meta),l=s}const{StructureSetROISequence:I,ROIContourSequence:S,RTROIObservationsSequence:f}=l,R={StructureSetLabel:l.StructureSetLabel,SeriesInstanceUID:l.SeriesInstanceUID,ROIContours:[],visible:!0};for(let e=0;ee.ROINumber===r.ReferencedROINumber)),c={ROINumber:a.ROINumber,ROIName:a.ROIName,ROIGenerationAlgorithm:a.ROIGenerationAlgorithm,ROIDescription:a.ROIDescription,isSupported:o,contourPoints:s,visible:!0};!function(e,n){let{ROIDisplayColor:t,RecommendedDisplayCIELabValue:r}=e;!t&&r&&(t=l(r));t&&(n.colorArray=[...t])}(r,c),t&&function(e,n,t){const r=n.find((e=>e.ReferencedROINumber===t));if(r){const{ObservationNumber:n,ROIObservationDescription:t,RTROIInterpretedType:s,ROIInterpreter:o}=r;e.RTROIObservations={ObservationNumber:n,ROIObservationDescription:t,RTROIInterpretedType:s,ROIInterpreter:o}}}(c,t,r.ReferencedROINumber),e.ROIContours.push(c)}const S=["1.2.840.10008.5.1.4.1.1.481.3"];let f={};function R(e,n,t){const r=e[0],{StudyInstanceUID:o,SeriesInstanceUID:c,SOPInstanceUID:i,SeriesDescription:u,SeriesNumber:l,SeriesDate:d,SOPClassUID:R,wadoRoot:D,wadoUri:m,wadoUriRoot:p}=r,O={Modality:"RTSTRUCT",loading:!1,isReconstructable:!1,displaySetInstanceUID:a.utils.guid(),SeriesDescription:u,SeriesNumber:l,SeriesDate:d,SOPInstanceUID:i,SeriesInstanceUID:c,StudyInstanceUID:o,SOPClassHandlerId:s,SOPClassUID:R,referencedImages:null,referencedSeriesInstanceUID:null,referencedDisplaySetInstanceUID:null,isDerivedDisplaySet:!0,isLoaded:!1,isHydrated:!1,structureSet:null,sopClassUids:S,instance:r,wadoRoot:D,wadoUriRoot:p,wadoUri:m,isOverlayDisplaySet:!0};let y=r.ReferencedSeriesSequence;if(r.ReferencedFrameOfReferenceSequence&&!r.ReferencedSeriesSequence&&(r.ReferencedSeriesSequence=function(e){const n=[];return e.forEach((e=>{const{RTReferencedStudySequence:t}=e;t.forEach((e=>{const{RTReferencedSeriesSequence:t}=e;t.forEach((e=>{const t=[],{ContourImageSequence:r,SeriesInstanceUID:s}=e;r.forEach((e=>{t.push({ReferencedSOPInstanceUID:e.ReferencedSOPInstanceUID,ReferencedSOPClassUID:e.ReferencedSOPClassUID})}));const o={SeriesInstanceUID:s,ReferencedInstanceSequence:t};n.push(o)}))}))})),n}(r.ReferencedFrameOfReferenceSequence),y=r.ReferencedSeriesSequence),!y)throw new Error("ReferencedSeriesSequence is missing for the RTSTRUCT");const g=y[0];return O.referencedImages=r.ReferencedSeriesSequence.ReferencedInstanceSequence,O.referencedSeriesInstanceUID=g.SeriesInstanceUID,O.getReferenceDisplaySet=()=>{const{DisplaySetService:e}=n.services,t=e.getDisplaySetsForSeries(O.referencedSeriesInstanceUID);if(!t||0===t.length)throw new Error("Referenced DisplaySet is missing for the RT");const r=t[0];return O.referencedDisplaySetInstanceUID=r.displaySetInstanceUID,r},O.load=e=>{let{headers:r}=e;return function(e,n,t,r){const{SOPInstanceUID:s}=e,{segmentationService:o}=n.services;(e.loading||e.isLoaded)&&f[s],0;return e.loading=!0,f[s]=new Promise((async(n,s)=>{if(!e.structureSet){const n=await I(t,e,e.getReferenceDisplaySet(),r);e.structureSet=n}const a=!0;o.createSegmentationForRTDisplaySet(e,null,a).then((()=>{e.loading=!1,n()})).catch((n=>{e.loading=!1,s(n)}))})),f[s]}(O,n,t,r)},[O]}const D=function(e){let{servicesManager:n,extensionManager:t}=e;return[{name:"dicom-rt",sopClassUids:S,getDisplaySetsFromSeries:e=>R(e,n,t)}]};function m(){return m=Object.assign?Object.assign.bind():function(e){for(var n=1;nt.e(471).then(t.bind(t,56471)))),O=e=>o.createElement(o.Suspense,{fallback:o.createElement("div",null,"Loading...")},o.createElement(p,e)),y={id:r,getViewportModule(e){let{servicesManager:n,extensionManager:t,commandsManager:r}=e;return[{name:"dicom-rt",component:e=>o.createElement(O,m({servicesManager:n,extensionManager:t,commandsManager:r},e))}]},getSopClassHandlerModule:D}}}]); +//# sourceMappingURL=506.bundle.e497ce6e8958ced779c8.js.map \ No newline at end of file diff --git a/resources/506.bundle.e497ce6e8958ced779c8.js.map b/resources/506.bundle.e497ce6e8958ced779c8.js.map new file mode 100644 index 0000000..6ed4542 --- /dev/null +++ b/resources/506.bundle.e497ce6e8958ced779c8.js.map @@ -0,0 +1 @@ +{"version":3,"file":"506.bundle.e497ce6e8958ced779c8.js","mappings":"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","sources":["webpack:///../../../extensions/cornerstone-dicom-rt/src/id.js","webpack:///../../../extensions/cornerstone-dicom-rt/src/loadRTStruct.js","webpack:///../../../extensions/cornerstone-dicom-rt/src/getSopClassHandlerModule.js","webpack:///../../../extensions/cornerstone-dicom-rt/src/index.tsx"],"sourcesContent":["import packageJson from '../package.json';\r\n\r\nconst id = packageJson.name;\r\nconst SOPClassHandlerName = 'dicom-rt';\r\nconst SOPClassHandlerId = `${id}.sopClassHandlerModule.${SOPClassHandlerName}`;\r\n\r\nexport { id, SOPClassHandlerId, SOPClassHandlerName };\r\n","import dcmjs from 'dcmjs';\r\nconst { DicomMessage, DicomMetaDictionary } = dcmjs.data;\r\nconst dicomlab2RGB = dcmjs.data.Colors.dicomlab2RGB;\r\n\r\nasync function checkAndLoadContourData(instance, datasource) {\r\n if (!instance || !instance.ROIContourSequence) {\r\n return Promise.reject('Invalid instance object or ROIContourSequence');\r\n }\r\n\r\n const promisesMap = new Map();\r\n\r\n for (const ROIContour of instance.ROIContourSequence) {\r\n const referencedROINumber = ROIContour.ReferencedROINumber;\r\n if (!ROIContour || !ROIContour.ContourSequence) {\r\n promisesMap.set(referencedROINumber, [Promise.resolve([])]);\r\n continue;\r\n }\r\n\r\n for (const Contour of ROIContour.ContourSequence) {\r\n if (!Contour || !Contour.ContourData) {\r\n return Promise.reject('Invalid Contour or ContourData');\r\n }\r\n\r\n const contourData = Contour.ContourData;\r\n\r\n if (Array.isArray(contourData)) {\r\n promisesMap.has(referencedROINumber)\r\n ? promisesMap.get(referencedROINumber).push(Promise.resolve(contourData))\r\n : promisesMap.set(referencedROINumber, [Promise.resolve(contourData)]);\r\n } else if (contourData && contourData.BulkDataURI) {\r\n const bulkDataURI = contourData.BulkDataURI;\r\n\r\n if (!datasource || !datasource.retrieve || !datasource.retrieve.bulkDataURI) {\r\n return Promise.reject('Invalid datasource object or retrieve function');\r\n }\r\n\r\n const bulkDataPromise = datasource.retrieve.bulkDataURI({\r\n BulkDataURI: bulkDataURI,\r\n StudyInstanceUID: instance.StudyInstanceUID,\r\n SeriesInstanceUID: instance.SeriesInstanceUID,\r\n SOPInstanceUID: instance.SOPInstanceUID,\r\n });\r\n\r\n promisesMap.has(referencedROINumber)\r\n ? promisesMap.get(referencedROINumber).push(bulkDataPromise)\r\n : promisesMap.set(referencedROINumber, [bulkDataPromise]);\r\n } else {\r\n return Promise.reject(`Invalid ContourData: ${contourData}`);\r\n }\r\n }\r\n }\r\n\r\n const resolvedPromisesMap = new Map();\r\n for (const [key, promiseArray] of promisesMap.entries()) {\r\n resolvedPromisesMap.set(key, await Promise.allSettled(promiseArray));\r\n }\r\n\r\n instance.ROIContourSequence.forEach(ROIContour => {\r\n try {\r\n const referencedROINumber = ROIContour.ReferencedROINumber;\r\n const resolvedPromises = resolvedPromisesMap.get(referencedROINumber);\r\n\r\n if (ROIContour.ContourSequence) {\r\n ROIContour.ContourSequence.forEach((Contour, index) => {\r\n const promise = resolvedPromises[index];\r\n if (promise.status === 'fulfilled') {\r\n if (Array.isArray(promise.value) && promise.value.every(Number.isFinite)) {\r\n // If promise.value is already an array of numbers, use it directly\r\n Contour.ContourData = promise.value;\r\n } else {\r\n // If the resolved promise value is a byte array (Blob), it needs to be decoded\r\n const uint8Array = new Uint8Array(promise.value);\r\n const textDecoder = new TextDecoder();\r\n const dataUint8Array = textDecoder.decode(uint8Array);\r\n if (typeof dataUint8Array === 'string' && dataUint8Array.includes('\\\\')) {\r\n Contour.ContourData = dataUint8Array.split('\\\\').map(parseFloat);\r\n } else {\r\n Contour.ContourData = [];\r\n }\r\n }\r\n } else {\r\n console.error(promise.reason);\r\n }\r\n });\r\n }\r\n } catch (error) {\r\n console.error(error);\r\n }\r\n });\r\n}\r\n\r\nexport default async function loadRTStruct(\r\n extensionManager,\r\n rtStructDisplaySet,\r\n referencedDisplaySet,\r\n headers\r\n) {\r\n const utilityModule = extensionManager.getModuleEntry(\r\n '@ohif/extension-cornerstone.utilityModule.common'\r\n );\r\n const dataSource = extensionManager.getActiveDataSource()[0];\r\n const { bulkDataURI } = dataSource.getConfig?.() || {};\r\n\r\n const { dicomLoaderService } = utilityModule.exports;\r\n const imageIdSopInstanceUidPairs =\r\n _getImageIdSopInstanceUidPairsForDisplaySet(referencedDisplaySet);\r\n\r\n // Set here is loading is asynchronous.\r\n // If this function throws its set back to false.\r\n rtStructDisplaySet.isLoaded = true;\r\n let instance = rtStructDisplaySet.instance;\r\n\r\n if (!bulkDataURI || !bulkDataURI.enabled) {\r\n const segArrayBuffer = await dicomLoaderService.findDicomDataPromise(\r\n rtStructDisplaySet,\r\n null,\r\n headers\r\n );\r\n\r\n const dicomData = DicomMessage.readFile(segArrayBuffer);\r\n const rtStructDataset = DicomMetaDictionary.naturalizeDataset(dicomData.dict);\r\n rtStructDataset._meta = DicomMetaDictionary.namifyDataset(dicomData.meta);\r\n instance = rtStructDataset;\r\n } else {\r\n await checkAndLoadContourData(instance, dataSource);\r\n }\r\n\r\n const { StructureSetROISequence, ROIContourSequence, RTROIObservationsSequence } = instance;\r\n\r\n // Define our structure set entry and add it to the rtstruct module state.\r\n const structureSet = {\r\n StructureSetLabel: instance.StructureSetLabel,\r\n SeriesInstanceUID: instance.SeriesInstanceUID,\r\n ROIContours: [],\r\n visible: true,\r\n };\r\n\r\n for (let i = 0; i < ROIContourSequence.length; i++) {\r\n const ROIContour = ROIContourSequence[i];\r\n const { ContourSequence } = ROIContour;\r\n\r\n if (!ContourSequence) {\r\n continue;\r\n }\r\n\r\n const isSupported = false;\r\n\r\n const ContourSequenceArray = _toArray(ContourSequence);\r\n\r\n const contourPoints = [];\r\n for (let c = 0; c < ContourSequenceArray.length; c++) {\r\n const { ContourImageSequence, ContourData, NumberOfContourPoints, ContourGeometricType } =\r\n ContourSequenceArray[c];\r\n\r\n let isSupported = false;\r\n\r\n const points = [];\r\n for (let p = 0; p < NumberOfContourPoints * 3; p += 3) {\r\n points.push({\r\n x: ContourData[p],\r\n y: ContourData[p + 1],\r\n z: ContourData[p + 2],\r\n });\r\n }\r\n\r\n switch (ContourGeometricType) {\r\n case 'CLOSED_PLANAR':\r\n case 'OPEN_PLANAR':\r\n case 'POINT':\r\n isSupported = true;\r\n\r\n break;\r\n default:\r\n continue;\r\n }\r\n\r\n contourPoints.push({\r\n numberOfPoints: NumberOfContourPoints,\r\n points,\r\n type: ContourGeometricType,\r\n isSupported,\r\n });\r\n }\r\n\r\n _setROIContourMetadata(\r\n structureSet,\r\n StructureSetROISequence,\r\n RTROIObservationsSequence,\r\n ROIContour,\r\n contourPoints,\r\n isSupported\r\n );\r\n }\r\n return structureSet;\r\n}\r\n\r\nconst _getImageId = (imageIdSopInstanceUidPairs, sopInstanceUID) => {\r\n const imageIdSopInstanceUidPairsEntry = imageIdSopInstanceUidPairs.find(\r\n imageIdSopInstanceUidPairsEntry =>\r\n imageIdSopInstanceUidPairsEntry.sopInstanceUID === sopInstanceUID\r\n );\r\n\r\n return imageIdSopInstanceUidPairsEntry ? imageIdSopInstanceUidPairsEntry.imageId : null;\r\n};\r\n\r\nfunction _getImageIdSopInstanceUidPairsForDisplaySet(referencedDisplaySet) {\r\n return referencedDisplaySet.images.map(image => {\r\n return {\r\n imageId: image.imageId,\r\n sopInstanceUID: image.SOPInstanceUID,\r\n };\r\n });\r\n}\r\n\r\nfunction _setROIContourMetadata(\r\n structureSet,\r\n StructureSetROISequence,\r\n RTROIObservationsSequence,\r\n ROIContour,\r\n contourPoints,\r\n isSupported\r\n) {\r\n const StructureSetROI = StructureSetROISequence.find(\r\n structureSetROI => structureSetROI.ROINumber === ROIContour.ReferencedROINumber\r\n );\r\n\r\n const ROIContourData = {\r\n ROINumber: StructureSetROI.ROINumber,\r\n ROIName: StructureSetROI.ROIName,\r\n ROIGenerationAlgorithm: StructureSetROI.ROIGenerationAlgorithm,\r\n ROIDescription: StructureSetROI.ROIDescription,\r\n isSupported,\r\n contourPoints,\r\n visible: true,\r\n };\r\n\r\n _setROIContourDataColor(ROIContour, ROIContourData);\r\n\r\n if (RTROIObservationsSequence) {\r\n // If present, add additional RTROIObservations metadata.\r\n _setROIContourRTROIObservations(\r\n ROIContourData,\r\n RTROIObservationsSequence,\r\n ROIContour.ReferencedROINumber\r\n );\r\n }\r\n\r\n structureSet.ROIContours.push(ROIContourData);\r\n}\r\n\r\nfunction _setROIContourDataColor(ROIContour, ROIContourData) {\r\n let { ROIDisplayColor, RecommendedDisplayCIELabValue } = ROIContour;\r\n\r\n if (!ROIDisplayColor && RecommendedDisplayCIELabValue) {\r\n // If ROIDisplayColor is absent, try using the RecommendedDisplayCIELabValue color.\r\n ROIDisplayColor = dicomlab2RGB(RecommendedDisplayCIELabValue);\r\n }\r\n\r\n if (ROIDisplayColor) {\r\n ROIContourData.colorArray = [...ROIDisplayColor];\r\n }\r\n}\r\n\r\nfunction _setROIContourRTROIObservations(ROIContourData, RTROIObservationsSequence, ROINumber) {\r\n const RTROIObservations = RTROIObservationsSequence.find(\r\n RTROIObservations => RTROIObservations.ReferencedROINumber === ROINumber\r\n );\r\n\r\n if (RTROIObservations) {\r\n // Deep copy so we don't keep the reference to the dcmjs dataset entry.\r\n const { ObservationNumber, ROIObservationDescription, RTROIInterpretedType, ROIInterpreter } =\r\n RTROIObservations;\r\n\r\n ROIContourData.RTROIObservations = {\r\n ObservationNumber,\r\n ROIObservationDescription,\r\n RTROIInterpretedType,\r\n ROIInterpreter,\r\n };\r\n }\r\n}\r\n\r\nfunction _toArray(objOrArray) {\r\n return Array.isArray(objOrArray) ? objOrArray : [objOrArray];\r\n}\r\n","import { utils } from '@ohif/core';\r\n\r\nimport { SOPClassHandlerId } from './id';\r\nimport loadRTStruct from './loadRTStruct';\r\n\r\nconst sopClassUids = ['1.2.840.10008.5.1.4.1.1.481.3'];\r\n\r\nlet loadPromises = {};\r\n\r\nfunction _getDisplaySetsFromSeries(instances, servicesManager, extensionManager) {\r\n const instance = instances[0];\r\n\r\n const {\r\n StudyInstanceUID,\r\n SeriesInstanceUID,\r\n SOPInstanceUID,\r\n SeriesDescription,\r\n SeriesNumber,\r\n SeriesDate,\r\n SOPClassUID,\r\n wadoRoot,\r\n wadoUri,\r\n wadoUriRoot,\r\n } = instance;\r\n\r\n const displaySet = {\r\n Modality: 'RTSTRUCT',\r\n loading: false,\r\n isReconstructable: false, // by default for now since it is a volumetric SEG currently\r\n displaySetInstanceUID: utils.guid(),\r\n SeriesDescription,\r\n SeriesNumber,\r\n SeriesDate,\r\n SOPInstanceUID,\r\n SeriesInstanceUID,\r\n StudyInstanceUID,\r\n SOPClassHandlerId,\r\n SOPClassUID,\r\n referencedImages: null,\r\n referencedSeriesInstanceUID: null,\r\n referencedDisplaySetInstanceUID: null,\r\n isDerivedDisplaySet: true,\r\n isLoaded: false,\r\n isHydrated: false,\r\n structureSet: null,\r\n sopClassUids,\r\n instance,\r\n wadoRoot,\r\n wadoUriRoot,\r\n wadoUri,\r\n isOverlayDisplaySet: true,\r\n };\r\n\r\n let referencedSeriesSequence = instance.ReferencedSeriesSequence;\r\n if (instance.ReferencedFrameOfReferenceSequence && !instance.ReferencedSeriesSequence) {\r\n instance.ReferencedSeriesSequence = _deriveReferencedSeriesSequenceFromFrameOfReferenceSequence(\r\n instance.ReferencedFrameOfReferenceSequence\r\n );\r\n referencedSeriesSequence = instance.ReferencedSeriesSequence;\r\n }\r\n\r\n if (!referencedSeriesSequence) {\r\n throw new Error('ReferencedSeriesSequence is missing for the RTSTRUCT');\r\n }\r\n\r\n const referencedSeries = referencedSeriesSequence[0];\r\n\r\n displaySet.referencedImages = instance.ReferencedSeriesSequence.ReferencedInstanceSequence;\r\n displaySet.referencedSeriesInstanceUID = referencedSeries.SeriesInstanceUID;\r\n\r\n displaySet.getReferenceDisplaySet = () => {\r\n const { DisplaySetService } = servicesManager.services;\r\n const referencedDisplaySets = DisplaySetService.getDisplaySetsForSeries(\r\n displaySet.referencedSeriesInstanceUID\r\n );\r\n\r\n if (!referencedDisplaySets || referencedDisplaySets.length === 0) {\r\n throw new Error('Referenced DisplaySet is missing for the RT');\r\n }\r\n\r\n const referencedDisplaySet = referencedDisplaySets[0];\r\n\r\n displaySet.referencedDisplaySetInstanceUID = referencedDisplaySet.displaySetInstanceUID;\r\n\r\n return referencedDisplaySet;\r\n };\r\n\r\n displaySet.load = ({ headers }) => _load(displaySet, servicesManager, extensionManager, headers);\r\n\r\n return [displaySet];\r\n}\r\n\r\nfunction _load(rtDisplaySet, servicesManager, extensionManager, headers) {\r\n const { SOPInstanceUID } = rtDisplaySet;\r\n const { segmentationService } = servicesManager.services;\r\n if (\r\n (rtDisplaySet.loading || rtDisplaySet.isLoaded) &&\r\n loadPromises[SOPInstanceUID] &&\r\n _segmentationExistsInCache(rtDisplaySet, segmentationService)\r\n ) {\r\n return loadPromises[SOPInstanceUID];\r\n }\r\n\r\n rtDisplaySet.loading = true;\r\n\r\n // We don't want to fire multiple loads, so we'll wait for the first to finish\r\n // and also return the same promise to any other callers.\r\n loadPromises[SOPInstanceUID] = new Promise(async (resolve, reject) => {\r\n if (!rtDisplaySet.structureSet) {\r\n const structureSet = await loadRTStruct(\r\n extensionManager,\r\n rtDisplaySet,\r\n rtDisplaySet.getReferenceDisplaySet(),\r\n headers\r\n );\r\n\r\n rtDisplaySet.structureSet = structureSet;\r\n }\r\n\r\n const suppressEvents = true;\r\n segmentationService\r\n .createSegmentationForRTDisplaySet(rtDisplaySet, null, suppressEvents)\r\n .then(() => {\r\n rtDisplaySet.loading = false;\r\n resolve();\r\n })\r\n .catch(error => {\r\n rtDisplaySet.loading = false;\r\n reject(error);\r\n });\r\n });\r\n\r\n return loadPromises[SOPInstanceUID];\r\n}\r\n\r\nfunction _deriveReferencedSeriesSequenceFromFrameOfReferenceSequence(\r\n ReferencedFrameOfReferenceSequence\r\n) {\r\n const ReferencedSeriesSequence = [];\r\n\r\n ReferencedFrameOfReferenceSequence.forEach(referencedFrameOfReference => {\r\n const { RTReferencedStudySequence } = referencedFrameOfReference;\r\n\r\n RTReferencedStudySequence.forEach(rtReferencedStudy => {\r\n const { RTReferencedSeriesSequence } = rtReferencedStudy;\r\n\r\n RTReferencedSeriesSequence.forEach(rtReferencedSeries => {\r\n const ReferencedInstanceSequence = [];\r\n const { ContourImageSequence, SeriesInstanceUID } = rtReferencedSeries;\r\n\r\n ContourImageSequence.forEach(contourImage => {\r\n ReferencedInstanceSequence.push({\r\n ReferencedSOPInstanceUID: contourImage.ReferencedSOPInstanceUID,\r\n ReferencedSOPClassUID: contourImage.ReferencedSOPClassUID,\r\n });\r\n });\r\n\r\n const referencedSeries = {\r\n SeriesInstanceUID,\r\n ReferencedInstanceSequence,\r\n };\r\n\r\n ReferencedSeriesSequence.push(referencedSeries);\r\n });\r\n });\r\n });\r\n\r\n return ReferencedSeriesSequence;\r\n}\r\n\r\nfunction _segmentationExistsInCache(rtDisplaySet, segmentationService) {\r\n // Todo: fix this\r\n return false;\r\n // This should be abstracted with the CornerstoneCacheService\r\n const rtContourId = rtDisplaySet.displaySetInstanceUID;\r\n const contour = segmentationService.getContour(rtContourId);\r\n\r\n return contour !== undefined;\r\n}\r\n\r\nfunction getSopClassHandlerModule({ servicesManager, extensionManager }) {\r\n return [\r\n {\r\n name: 'dicom-rt',\r\n sopClassUids,\r\n getDisplaySetsFromSeries: instances => {\r\n return _getDisplaySetsFromSeries(instances, servicesManager, extensionManager);\r\n },\r\n },\r\n ];\r\n}\r\n\r\nexport default getSopClassHandlerModule;\r\n","import { id } from './id';\r\nimport React from 'react';\r\nimport { Types } from '@ohif/core';\r\nimport getSopClassHandlerModule from './getSopClassHandlerModule';\r\n\r\nconst Component = React.lazy(() => {\r\n return import(/* webpackPrefetch: true */ './viewports/OHIFCornerstoneRTViewport');\r\n});\r\n\r\nconst OHIFCornerstoneRTViewport = props => {\r\n return (\r\n Loading...}>\r\n \r\n \r\n );\r\n};\r\n\r\n/**\r\n * You can remove any of the following modules if you don't need them.\r\n */\r\nconst extension: Types.Extensions.Extension = {\r\n /**\r\n * Only required property. Should be a unique value across all extensions.\r\n * You ID can be anything you want, but it should be unique.\r\n */\r\n id,\r\n\r\n /**\r\n * PanelModule should provide a list of panels that will be available in OHIF\r\n * for Modes to consume and render. Each panel is defined by a {name,\r\n * iconName, iconLabel, label, component} object. Example of a panel module\r\n * is the StudyBrowserPanel that is provided by the default extension in OHIF.\r\n */\r\n getViewportModule({\r\n servicesManager,\r\n extensionManager,\r\n commandsManager,\r\n }: Types.Extensions.ExtensionParams) {\r\n const ExtendedOHIFCornerstoneRTViewport = props => {\r\n return (\r\n \r\n );\r\n };\r\n\r\n return [{ name: 'dicom-rt', component: ExtendedOHIFCornerstoneRTViewport }];\r\n },\r\n /**\r\n * SopClassHandlerModule should provide a list of sop class handlers that will be\r\n * available in OHIF for Modes to consume and use to create displaySets from Series.\r\n * Each sop class handler is defined by a { name, sopClassUids, getDisplaySetsFromSeries}.\r\n * Examples include the default sop class handler provided by the default extension\r\n */\r\n getSopClassHandlerModule,\r\n};\r\n\r\nexport default extension;\r\n"],"names":["id","packageJson","SOPClassHandlerId","DicomMessage","DicomMetaDictionary","dcmjs","dicomlab2RGB","Colors","async","loadRTStruct","extensionManager","rtStructDisplaySet","referencedDisplaySet","headers","utilityModule","getModuleEntry","dataSource","getActiveDataSource","bulkDataURI","getConfig","dicomLoaderService","exports","images","map","image","imageId","sopInstanceUID","SOPInstanceUID","_getImageIdSopInstanceUidPairsForDisplaySet","isLoaded","instance","enabled","datasource","ROIContourSequence","Promise","reject","promisesMap","Map","ROIContour","referencedROINumber","ReferencedROINumber","ContourSequence","Contour","ContourData","contourData","Array","isArray","has","get","push","resolve","set","BulkDataURI","retrieve","bulkDataPromise","StudyInstanceUID","SeriesInstanceUID","resolvedPromisesMap","key","promiseArray","entries","allSettled","forEach","resolvedPromises","index","promise","status","value","every","Number","isFinite","uint8Array","Uint8Array","dataUint8Array","TextDecoder","decode","includes","split","parseFloat","console","error","reason","checkAndLoadContourData","segArrayBuffer","findDicomDataPromise","dicomData","readFile","rtStructDataset","naturalizeDataset","dict","_meta","namifyDataset","meta","StructureSetROISequence","RTROIObservationsSequence","structureSet","StructureSetLabel","ROIContours","visible","i","length","isSupported","ContourSequenceArray","objOrArray","contourPoints","c","ContourImageSequence","NumberOfContourPoints","ContourGeometricType","points","p","x","y","z","numberOfPoints","type","_setROIContourMetadata","StructureSetROI","find","structureSetROI","ROINumber","ROIContourData","ROIName","ROIGenerationAlgorithm","ROIDescription","ROIDisplayColor","RecommendedDisplayCIELabValue","colorArray","_setROIContourDataColor","RTROIObservations","ObservationNumber","ROIObservationDescription","RTROIInterpretedType","ROIInterpreter","_setROIContourRTROIObservations","sopClassUids","loadPromises","_getDisplaySetsFromSeries","instances","servicesManager","SeriesDescription","SeriesNumber","SeriesDate","SOPClassUID","wadoRoot","wadoUri","wadoUriRoot","displaySet","Modality","loading","isReconstructable","displaySetInstanceUID","utils","guid","referencedImages","referencedSeriesInstanceUID","referencedDisplaySetInstanceUID","isDerivedDisplaySet","isHydrated","isOverlayDisplaySet","referencedSeriesSequence","ReferencedSeriesSequence","ReferencedFrameOfReferenceSequence","referencedFrameOfReference","RTReferencedStudySequence","rtReferencedStudy","RTReferencedSeriesSequence","rtReferencedSeries","ReferencedInstanceSequence","contourImage","ReferencedSOPInstanceUID","ReferencedSOPClassUID","referencedSeries","_deriveReferencedSeriesSequenceFromFrameOfReferenceSequence","Error","getReferenceDisplaySet","DisplaySetService","services","referencedDisplaySets","getDisplaySetsForSeries","load","_ref","rtDisplaySet","segmentationService","suppressEvents","createSegmentationForRTDisplaySet","then","catch","_load","_ref2","name","getDisplaySetsFromSeries","Component","React","OHIFCornerstoneRTViewport","props","fallback","getViewportModule","commandsManager","component","_extends","getSopClassHandlerModule"],"sourceRoot":""} \ No newline at end of file diff --git a/resources/530.bundle.b5e992d674170dee581a.js b/resources/530.bundle.b5e992d674170dee581a.js new file mode 100644 index 0000000..03df877 --- /dev/null +++ b/resources/530.bundle.b5e992d674170dee581a.js @@ -0,0 +1,3 @@ +/*! For license information please see 530.bundle.b5e992d674170dee581a.js.LICENSE.txt */ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[530],{44530:(t,e,n)=>{n.d(e,{eO:()=>d});var i=n(43001),r=n(56901),o=n(261),a=n(89067);function s(t){var e=i.useRef();return e.current||(e.current={v:t()}),e.current.v}var c=function(){return c=Object.assign||function(t){for(var e,n=1,i=arguments.length;n0)&&!(i=o.next()).done;)a.push(i.value)}catch(t){r={error:t}}finally{try{i&&!i.done&&(n=o.return)&&n.call(o)}finally{if(r)throw r.error}}return a};function l(t){return t}function d(t){for(var e=[],n=1;n0||"boolean"==typeof e.changed);return!(n.changed||i)}(c,t,e)}),[c]),v=(0,i.useCallback)((function(t){return c.subscribe(t).unsubscribe}),[c]),p=(0,r.useSyncExternalStoreWithSelector)(v,u,u,l,d);return(0,i.useEffect)((function(){var t=s.state;return c.start(t?o.ZM.create(t):void 0),function(){c.stop(),c.status=o.TM.NotStarted}}),[]),[p,c.send,c]}},17145:(t,e,n)=>{var i=n(43001);var r="function"==typeof Object.is?Object.is:function(t,e){return t===e&&(0!==t||1/t==1/e)||t!=t&&e!=e},o=i.useState,a=i.useEffect,s=i.useLayoutEffect,c=i.useDebugValue;function u(t){var e=t.getSnapshot;t=t.value;try{var n=e();return!r(t,n)}catch(t){return!0}}var h="undefined"==typeof window||void 0===window.document||void 0===window.document.createElement?function(t,e){return e()}:function(t,e){var n=e(),i=o({inst:{value:n,getSnapshot:e}}),r=i[0].inst,h=i[1];return s((function(){r.value=n,r.getSnapshot=e,u(r)&&h({inst:r})}),[t,n,e]),a((function(){return u(r)&&h({inst:r}),t((function(){u(r)&&h({inst:r})}))}),[t]),c(n),n};e.useSyncExternalStore=void 0!==i.useSyncExternalStore?i.useSyncExternalStore:h},1594:(t,e,n)=>{var i=n(43001),r=n(75011);var o="function"==typeof Object.is?Object.is:function(t,e){return t===e&&(0!==t||1/t==1/e)||t!=t&&e!=e},a=r.useSyncExternalStore,s=i.useRef,c=i.useEffect,u=i.useMemo,h=i.useDebugValue;e.useSyncExternalStoreWithSelector=function(t,e,n,i,r){var f=s(null);if(null===f.current){var l={hasValue:!1,value:null};f.current=l}else l=f.current;f=u((function(){function t(t){if(!c){if(c=!0,a=t,t=i(t),void 0!==r&&l.hasValue){var e=l.value;if(r(e,t))return s=e}return s=t}if(e=s,o(a,t))return e;var n=i(t);return void 0!==r&&r(e,n)?e:(a=t,s=n)}var a,s,c=!1,u=void 0===n?null:n;return[function(){return t(e())},null===u?void 0:function(){return t(u())}]}),[e,n,i,r]);var d=a(t,f[0],f[1]);return c((function(){l.hasValue=!0,l.value=d}),[d]),h(d),d}},75011:(t,e,n)=>{t.exports=n(17145)},56901:(t,e,n)=>{t.exports=n(1594)},261:(t,e,n)=>{n.d(e,{TM:()=>$t,J:()=>ne,ZM:()=>Vt,f0:()=>ie,kJ:()=>Zt});var i,r,o=function(){return o=Object.assign||function(t){for(var e,n=1,i=arguments.length;n=t.length&&(t=void 0),{value:t&&t[i++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")}function c(t,e){var n="function"==typeof Symbol&&t[Symbol.iterator];if(!n)return t;var i,r,o=n.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(i=o.next()).done;)a.push(i.value)}catch(t){r={error:t}}finally{try{i&&!i.done&&(n=o.return)&&n.call(o)}finally{if(r)throw r.error}}return a}function u(t,e,n){if(n||2===arguments.length)for(var i,r=0,o=e.length;r0;){var e=r.shift();n=t.transition(n,e,c),i.forEach((function(t){return t.next(n)}))}a=!1}}()},getSnapshot:function(){return n},subscribe:function(t,e,r){var o=it(t,e,r);return i.add(o),o.next(n),{unsubscribe:function(){i.delete(o)}}}}),c={parent:e.parent,self:s,id:e.id||"anonymous",observers:i};return n=t.start?t.start(c):n,s}var $t,Xt={sync:!1,autoForward:!1};!function(t){t[t.NotStarted=0]="NotStarted",t[t.Running=1]="Running",t[t.Stopped=2]="Stopped"}($t||($t={}));var Qt=function(){function t(e,n){void 0===n&&(n=t.defaultOptions);var a=this;this.machine=e,this.delayedEventsMap={},this.listeners=new Set,this.contextListeners=new Set,this.stopListeners=new Set,this.doneListeners=new Set,this.eventListeners=new Set,this.sendListeners=new Set,this.initialized=!1,this.status=$t.NotStarted,this.children=new Map,this.forwardTo=new Set,this._outgoingQueue=[],this.init=this.start,this.send=function(t,e){if(X(t))return a.batch(t),a.state;var n=Y(K(t,e));if(a.status===$t.Stopped)return N||$(!1,'Event "'.concat(n.name,'" was sent to stopped service "').concat(a.machine.id,'". This service has already reached its final state, and will not transition.\nEvent: ').concat(JSON.stringify(n.data))),a.state;if(a.status!==$t.Running&&!a.options.deferEvents)throw new Error('Event "'.concat(n.name,'" was sent to uninitialized service "').concat(a.machine.id,'". Make sure .start() is called for this service, or set { deferEvents: true } in the service options.\nEvent: ').concat(JSON.stringify(n.data)));return a.scheduler.schedule((function(){a.forward(n);var t=a._nextState(n);a.update(t,n)})),a._state},this.sendTo=function(t,e,n){var i,s=a.parent&&(e===r.Parent||a.parent.id===e),c=s?a.parent:Z(e)?e===r.Internal?a:a.children.get(e)||zt(e):(i=e)&&"function"==typeof i.send?e:void 0;if(c)if("machine"in c){if(a.status!==$t.Stopped||a.parent!==c||a.state.done){var u=o(o({},t),{name:t.name===w?"".concat(vt(a.id)):t.name,origin:a.sessionId});!n&&a.machine.config.predictableActionArguments?a._outgoingQueue.push([c,u]):c.send(u)}}else!n&&a.machine.config.predictableActionArguments?a._outgoingQueue.push([c,t.data]):c.send(t.data);else{if(!s)throw new Error("Unable to send event to child '".concat(e,"' from service '").concat(a.id,"'."));N||$(!1,"Service '".concat(a.id,"' has no parent: unable to send event ").concat(t.type))}},this._exec=function(t,e,n,r){void 0===r&&(r=a.machine.options.actions);var o=t.exec||st(t.type,r),s=Q(o)?o:o?o.exec:t.exec;if(s)try{return s(e,n.data,a.machine.config.predictableActionArguments?{action:t,_event:n}:{action:t,state:a.state,_event:n})}catch(t){throw a.parent&&a.parent.send({type:"xstate.error",data:t}),t}switch(t.type){case d:var c=t;a.defer(c);break;case v:var u=t;if("number"==typeof u.delay)return void a.defer(u);u.to?a.sendTo(u._event,u.to,n===at):a.send(u._event);break;case p:a.cancel(t.sendId);break;case f:if(a.status!==$t.Running)return;var h=t.activity;if(!a.machine.config.predictableActionArguments&&!a.state.activities[h.id||h.type])break;if(h.type===i.Invoke){var y=nt(h.src),g=a.machine.options.services?a.machine.options.services[y.type]:void 0,b=h.id,x=h.data;N||$(!("forward"in h),"`forward` property is deprecated (found in invocation of '".concat(h.src,"' in in machine '").concat(a.machine.id,"'). ")+"Please use `autoForward` instead.");var S="autoForward"in h?h.autoForward:!!h.forward;if(!g)return void(N||$(!1,"No service found for invocation '".concat(h.src,"' in machine '").concat(a.machine.id,"'.")));var w=x?B(x,e,n):void 0;if("string"==typeof g)return;var _=Q(g)?g(e,n.data,{data:w,src:y,meta:h.meta}):g;if(!_)return;var E=void 0;G(_)&&(_=w?_.withContext(w):_,E={autoForward:S}),a.spawn(_,b,E)}else a.spawnActivity(h);break;case l:a.stopChild(t.activity.id);break;case m:var O=t,k=O.label,j=O.value;k?a.logger(k,j):a.logger(j);break;default:N||$(!1,"No implementation found for action type '".concat(t.type,"'"))}};var s=o(o({},t.defaultOptions),n),c=s.clock,u=s.logger,h=s.parent,y=s.id,g=void 0!==y?y:e.id;this.id=g,this.logger=u,this.clock=c,this.parent=h,this.options=s,this.scheduler=new It({deferEvents:this.options.deferEvents}),this.sessionId=Rt()}return Object.defineProperty(t.prototype,"initialState",{get:function(){var t=this;return this._initialState?this._initialState:gt(this,(function(){return t._initialState=t.machine.initialState,t._initialState}))},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"state",{get:function(){return N||$(this.status!==$t.NotStarted,"Attempted to read state from uninitialized service '".concat(this.id,"'. Make sure the service is started first.")),this._state},enumerable:!1,configurable:!0}),t.prototype.execute=function(t,e){var n,i;try{for(var r=s(t.actions),o=r.next();!o.done;o=r.next()){var a=o.value;this.exec(a,t,e)}}catch(t){n={error:t}}finally{try{o&&!o.done&&(i=r.return)&&i.call(r)}finally{if(n)throw n.error}}},t.prototype.update=function(t,e){var n,i,r,o,a,c,u,h,f=this;if(t._sessionid=this.sessionId,this._state=t,this.machine.config.predictableActionArguments&&e!==at||!this.options.execute)for(var l=void 0;l=this._outgoingQueue.shift();)l[0].send(l[1]);else this.execute(this.state);if(this.children.forEach((function(t){f.state.children[t.id]=t})),this.devTools&&this.devTools.send(e.data,t),t.event)try{for(var d=s(this.eventListeners),v=d.next();!v.done;v=d.next()){(0,v.value)(t.event)}}catch(t){n={error:t}}finally{try{v&&!v.done&&(i=d.return)&&i.call(d)}finally{if(n)throw n.error}}try{for(var p=s(this.listeners),y=p.next();!y.done;y=p.next()){(0,y.value)(t,t.event)}}catch(t){r={error:t}}finally{try{y&&!y.done&&(o=p.return)&&o.call(p)}finally{if(r)throw r.error}}try{for(var g=s(this.contextListeners),m=g.next();!m.done;m=g.next()){(0,m.value)(this.state.context,this.state.history?this.state.history.context:void 0)}}catch(t){a={error:t}}finally{try{m&&!m.done&&(c=g.return)&&c.call(g)}finally{if(a)throw a.error}}if(this.state.done){var b=t.configuration.find((function(t){return"final"===t.type&&t.parent===f.machine})),x=b&&b.doneData?B(b.doneData,t.context,e):void 0;this._doneEvent=dt(this.id,x);try{for(var S=s(this.doneListeners),w=S.next();!w.done;w=S.next()){(0,w.value)(this._doneEvent)}}catch(t){u={error:t}}finally{try{w&&!w.done&&(h=S.return)&&h.call(S)}finally{if(u)throw u.error}}this._stop(),this._stopChildren(),Bt(this.sessionId)}},t.prototype.onTransition=function(t){return this.listeners.add(t),this.status===$t.Running&&t(this.state,this.state.event),this},t.prototype.subscribe=function(t,e,n){var i=this,r=it(t,e,n);this.listeners.add(r.next),this.status!==$t.NotStarted&&r.next(this.state);var o=function(){i.doneListeners.delete(o),i.stopListeners.delete(o),r.complete()};return this.status===$t.Stopped?r.complete():(this.onDone(o),this.onStop(o)),{unsubscribe:function(){i.listeners.delete(r.next),i.doneListeners.delete(o),i.stopListeners.delete(o)}}},t.prototype.onEvent=function(t){return this.eventListeners.add(t),this},t.prototype.onSend=function(t){return this.sendListeners.add(t),this},t.prototype.onChange=function(t){return this.contextListeners.add(t),this},t.prototype.onStop=function(t){return this.stopListeners.add(t),this},t.prototype.onDone=function(t){return this.status===$t.Stopped&&this._doneEvent?t(this._doneEvent):this.doneListeners.add(t),this},t.prototype.off=function(t){return this.listeners.delete(t),this.eventListeners.delete(t),this.sendListeners.delete(t),this.stopListeners.delete(t),this.doneListeners.delete(t),this.contextListeners.delete(t),this},t.prototype.start=function(t){var e=this;if(this.status===$t.Running)return this;this.machine._init(),Jt(this.sessionId,this),this.initialized=!0,this.status=$t.Running;var n=void 0===t?this.initialState:gt(this,(function(){return Ct(t)?e.machine.resolveState(t):e.machine.resolveState(Vt.from(t,e.machine.context))}));return this.options.devTools&&this.attachDev(),this.scheduler.initialize((function(){e.update(n,at)})),this},t.prototype._stopChildren=function(){this.children.forEach((function(t){Q(t.stop)&&t.stop()})),this.children.clear()},t.prototype._stop=function(){var t,e,n,i,r,o,a,c,u,h;try{for(var f=s(this.listeners),l=f.next();!l.done;l=f.next()){var d=l.value;this.listeners.delete(d)}}catch(e){t={error:e}}finally{try{l&&!l.done&&(e=f.return)&&e.call(f)}finally{if(t)throw t.error}}try{for(var v=s(this.stopListeners),p=v.next();!p.done;p=v.next()){(d=p.value)(),this.stopListeners.delete(d)}}catch(t){n={error:t}}finally{try{p&&!p.done&&(i=v.return)&&i.call(v)}finally{if(n)throw n.error}}try{for(var y=s(this.contextListeners),g=y.next();!g.done;g=y.next()){d=g.value;this.contextListeners.delete(d)}}catch(t){r={error:t}}finally{try{g&&!g.done&&(o=y.return)&&o.call(y)}finally{if(r)throw r.error}}try{for(var m=s(this.doneListeners),b=m.next();!b.done;b=m.next()){d=b.value;this.doneListeners.delete(d)}}catch(t){a={error:t}}finally{try{b&&!b.done&&(c=m.return)&&c.call(m)}finally{if(a)throw a.error}}if(!this.initialized)return this;this.initialized=!1,this.status=$t.Stopped,this._initialState=void 0;try{for(var x=s(Object.keys(this.delayedEventsMap)),S=x.next();!S.done;S=x.next()){var w=S.value;this.clock.clearTimeout(this.delayedEventsMap[w])}}catch(t){u={error:t}}finally{try{S&&!S.done&&(h=x.return)&&h.call(x)}finally{if(u)throw u.error}}this.scheduler.clear(),this.scheduler=new It({deferEvents:this.options.deferEvents})},t.prototype.stop=function(){var t=this,e=this.scheduler;return this._stop(),e.schedule((function(){var e=Y({type:"xstate.stop"}),n=gt(t,(function(){var n=R(u([],c(t.state.configuration),!1).sort((function(t,e){return e.order-t.order})).map((function(e){return ut(e.onExit,t.machine.options.actions)}))),i=c(pt(t.machine,t.state,t.state.context,e,[{type:"exit",actions:n}],t.machine.config.predictableActionArguments?t._exec:void 0,t.machine.config.predictableActionArguments||t.machine.config.preserveActionOrder),2),r=i[0],o=i[1],a=new Vt({value:t.state.value,context:o,_event:e,_sessionid:t.sessionId,historyValue:void 0,history:t.state,actions:r.filter((function(t){return!ot(t)})),activities:{},events:[],configuration:[],transitions:[],children:{},done:t.state.done,tags:t.state.tags,machine:t.machine});return a.changed=!0,a}));t.update(n,e),t._stopChildren(),Bt(t.sessionId)})),this},t.prototype.batch=function(t){var e=this;if(this.status===$t.NotStarted&&this.options.deferEvents)N||$(!1,"".concat(t.length,' event(s) were sent to uninitialized service "').concat(this.machine.id,'" and are deferred. Make sure .start() is called for this service.\nEvent: ').concat(JSON.stringify(event)));else if(this.status!==$t.Running)throw new Error("".concat(t.length,' event(s) were sent to uninitialized service "').concat(this.machine.id,'". Make sure .start() is called for this service, or set { deferEvents: true } in the service options.'));if(t.length){var n=!!this.machine.config.predictableActionArguments&&this._exec;this.scheduler.schedule((function(){var i,r,a=e.state,h=!1,f=[],l=function(t){var i=Y(t);e.forward(i),a=gt(e,(function(){return e.machine.transition(a,i,void 0,n||void 0)})),f.push.apply(f,u([],c(e.machine.config.predictableActionArguments?a.actions:a.actions.map((function(t){return function(t,e){var n=t.exec;return o(o({},t),{exec:void 0!==n?function(){return n(e.context,e.event,{action:t,state:e,_event:e._event})}:void 0})}(t,a)}))),!1)),h=h||!!a.changed};try{for(var d=s(t),v=d.next();!v.done;v=d.next()){l(v.value)}}catch(t){i={error:t}}finally{try{v&&!v.done&&(r=d.return)&&r.call(d)}finally{if(i)throw i.error}}a.changed=h,a.actions=f,e.update(a,Y(t[t.length-1]))}))}},t.prototype.sender=function(t){return this.send.bind(this,t)},t.prototype._nextState=function(t,e){var n=this;void 0===e&&(e=!!this.machine.config.predictableActionArguments&&this._exec);var i=Y(t);if(0===i.name.indexOf(S)&&!this.state.nextEvents.some((function(t){return 0===t.indexOf(S)})))throw i.data.data;return gt(this,(function(){return n.machine.transition(n.state,i,void 0,e||void 0)}))},t.prototype.nextState=function(t){return this._nextState(t,!1)},t.prototype.forward=function(t){var e,n;try{for(var i=s(this.forwardTo),r=i.next();!r.done;r=i.next()){var o=r.value,a=this.children.get(o);if(!a)throw new Error("Unable to forward event '".concat(t,"' from interpreter '").concat(this.id,"' to nonexistant child '").concat(o,"'."));a.send(t)}}catch(t){e={error:t}}finally{try{r&&!r.done&&(n=i.return)&&n.call(i)}finally{if(e)throw e.error}}},t.prototype.defer=function(t){var e=this,n=this.clock.setTimeout((function(){"to"in t&&t.to?e.sendTo(t._event,t.to,!0):e.send(t._event)}),t.delay);t.id&&(this.delayedEventsMap[t.id]=n)},t.prototype.cancel=function(t){this.clock.clearTimeout(this.delayedEventsMap[t]),delete this.delayedEventsMap[t]},t.prototype.exec=function(t,e,n){void 0===n&&(n=this.machine.options.actions),this._exec(t,e.context,e._event,n)},t.prototype.removeChild=function(t){var e;this.children.delete(t),this.forwardTo.delete(t),null===(e=this.state)||void 0===e||delete e.children[t]},t.prototype.stopChild=function(t){var e=this.children.get(t);e&&(this.removeChild(t),Q(e.stop)&&e.stop())},t.prototype.spawn=function(t,e,n){if(this.status!==$t.Running)return bt(t,e);if(F(t))return this.spawnPromise(Promise.resolve(t),e);if(Q(t))return this.spawnCallback(t,e);if(function(t){try{return"function"==typeof t.send}catch(t){return!1}}(r=t)&&"id"in r)return this.spawnActor(t,e);if(function(t){try{return"subscribe"in t&&Q(t.subscribe)}catch(t){return!1}}(t))return this.spawnObservable(t,e);if(G(t))return this.spawnMachine(t,o(o({},n),{id:e}));if(null!==(i=t)&&"object"==typeof i&&"transition"in i&&"function"==typeof i.transition)return this.spawnBehavior(t,e);throw new Error('Unable to spawn entity "'.concat(e,'" of type "').concat(typeof t,'".'));var i,r},t.prototype.spawnMachine=function(e,n){var i=this;void 0===n&&(n={});var r=new t(e,o(o({},this.options),{parent:this,id:n.id||e.id})),a=o(o({},Xt),n);a.sync&&r.onTransition((function(t){i.send(_,{state:t,id:r.id})}));var s=r;return this.children.set(r.id,s),a.autoForward&&this.forwardTo.add(r.id),r.onDone((function(t){i.removeChild(r.id),i.send(Y(t,{origin:r.id}))})).start(),s},t.prototype.spawnBehavior=function(t,e){var n=qt(t,{id:e,parent:this});return this.children.set(e,n),n},t.prototype.spawnPromise=function(t,e){var n,i,r=this,o=!1;t.then((function(t){o||(i=t,r.removeChild(e),r.send(Y(dt(e,t),{origin:e})))}),(function(t){if(!o){r.removeChild(e);var n=vt(e,t);try{r.send(Y(n,{origin:e}))}catch(i){!function(t,e,n){if(!N){var i=t.stack?" Stacktrace was '".concat(t.stack,"'"):"";if(t===e)console.error("Missing onError handler for invocation '".concat(n,"', error was '").concat(t,"'.").concat(i));else{var r=e.stack?" Stacktrace was '".concat(e.stack,"'"):"";console.error("Missing onError handler and/or unhandled exception/promise rejection for invocation '".concat(n,"'. ")+"Original error: '".concat(t,"'. ").concat(i," Current error is '").concat(e,"'.").concat(r))}}}(t,i,e),r.devTools&&r.devTools.send(n,r.state),r.machine.strict&&r.stop()}}}));var a=((n={id:e,send:function(){},subscribe:function(e,n,i){var r=it(e,n,i),o=!1;return t.then((function(t){o||(r.next(t),o||r.complete())}),(function(t){o||r.error(t)})),{unsubscribe:function(){return o=!0}}},stop:function(){o=!0},toJSON:function(){return{id:e}},getSnapshot:function(){return i}})[W]=function(){return this},n);return this.children.set(e,a),a},t.prototype.spawnCallback=function(t,e){var n,i,r,o=this,a=!1,s=new Set,c=new Set;try{r=t((function(t){i=t,c.forEach((function(e){return e(t)})),a||o.send(Y(t,{origin:e}))}),(function(t){s.add(t)}))}catch(t){this.send(vt(e,t))}if(F(r))return this.spawnPromise(r,e);var u=((n={id:e,send:function(t){return s.forEach((function(e){return e(t)}))},subscribe:function(t){var e=it(t);return c.add(e.next),{unsubscribe:function(){c.delete(e.next)}}},stop:function(){a=!0,Q(r)&&r()},toJSON:function(){return{id:e}},getSnapshot:function(){return i}})[W]=function(){return this},n);return this.children.set(e,u),u},t.prototype.spawnObservable=function(t,e){var n,i,r=this,o=t.subscribe((function(t){i=t,r.send(Y(t,{origin:e}))}),(function(t){r.removeChild(e),r.send(Y(vt(e,t),{origin:e}))}),(function(){r.removeChild(e),r.send(Y(dt(e),{origin:e}))})),a=((n={id:e,send:function(){},subscribe:function(e,n,i){return t.subscribe(e,n,i)},stop:function(){return o.unsubscribe()},getSnapshot:function(){return i},toJSON:function(){return{id:e}}})[W]=function(){return this},n);return this.children.set(e,a),a},t.prototype.spawnActor=function(t,e){return this.children.set(e,t),t},t.prototype.spawnActivity=function(t){var e=this.machine.options&&this.machine.options.activities?this.machine.options.activities[t.type]:void 0;if(e){var n=e(this.state.context,t);this.spawnEffect(t.id,n)}else N||$(!1,"No implementation found for activity '".concat(t.type,"'"))},t.prototype.spawnEffect=function(t,e){var n;this.children.set(t,((n={id:t,send:function(){},subscribe:function(){return{unsubscribe:function(){}}},stop:e||void 0,getSnapshot:function(){},toJSON:function(){return{id:t}}})[W]=function(){return this},n))},t.prototype.attachDev=function(){var t=Ft();if(this.options.devTools&&t){if(t.__REDUX_DEVTOOLS_EXTENSION__){var e="object"==typeof this.options.devTools?this.options.devTools:void 0;this.devTools=t.__REDUX_DEVTOOLS_EXTENSION__.connect(o(o({name:this.id,autoPause:!0,stateSanitizer:function(t){return{value:t.value,context:t.context,actions:t.actions}}},e),{features:o({jump:!1,skip:!1},e?e.features:void 0)}),this.machine),this.devTools.init(this.state)}Ut(this)}},t.prototype.toJSON=function(){return{id:this.id}},t.prototype[W]=function(){return this},t.prototype.getSnapshot=function(){return this.status===$t.NotStarted?this.initialState:this._state},t.defaultOptions={execute:!0,deferEvents:!0,clock:{setTimeout:function(t,e){return setTimeout(t,e)},clearTimeout:function(t){return clearTimeout(t)}},logger:console.log.bind(console),devTools:!1},t.interpret=Zt,t}();function Zt(t,e){return new Qt(t,e)}function Ht(t){if("string"==typeof t){var e={type:t,toString:function(){return t}};return e}return t}function Wt(t){return o(o({type:x},t),{toJSON:function(){t.onDone,t.onError;var e=a(t,["onDone","onError"]);return o(o({},e),{type:x,src:Ht(t.src)})}})}var Gt="",Kt="*",Yt={},te=function(t){return"#"===t[0]},ee=function(){function t(e,n,i,r){void 0===i&&(i="context"in e?e.context:void 0);var a,h=this;this.config=e,this._context=i,this.order=-1,this.__xstatenode=!0,this.__cache={events:void 0,relativeValue:new Map,initialStateValue:void 0,initialState:void 0,on:void 0,transitions:void 0,candidates:{},delayedTransitions:void 0},this.idMap={},this.tags=[],this.options=Object.assign({actions:{},guards:{},services:{},activities:{},delays:{}},n),this.parent=null==r?void 0:r.parent,this.key=this.config.key||(null==r?void 0:r.key)||this.config.id||"(machine)",this.machine=this.parent?this.parent.machine:this,this.path=this.parent?this.parent.path.concat(this.key):[],this.delimiter=this.config.delimiter||(this.parent?this.parent.delimiter:"."),this.id=this.config.id||u([this.machine.key],c(this.path),!1).join(this.delimiter),this.version=this.parent?this.parent.version:this.config.version,this.type=this.config.type||(this.config.parallel?"parallel":this.config.states&&Object.keys(this.config.states).length?"compound":this.config.history?"history":"atomic"),this.schema=this.parent?this.machine.schema:null!==(a=this.config.schema)&&void 0!==a?a:{},this.description=this.config.description,N||$(!("parallel"in this.config),'The "parallel" property is deprecated and will be removed in version 4.1. '.concat(this.config.parallel?"Replace with `type: 'parallel'`":"Use `type: '".concat(this.type,"'`")," in the config for state node '").concat(this.id,"' instead.")),this.initial=this.config.initial,this.states=this.config.states?D(this.config.states,(function(e,n){var i,r=new t(e,{},void 0,{parent:h,key:n});return Object.assign(h.idMap,o(((i={})[r.id]=r,i),r.idMap)),r})):Yt;var f=0;!function t(e){var n,i;e.order=f++;try{for(var r=s(St(e)),o=r.next();!o.done;o=r.next()){t(o.value)}}catch(t){n={error:t}}finally{try{o&&!o.done&&(i=r.return)&&i.call(r)}finally{if(n)throw n.error}}}(this),this.history=!0===this.config.history?"shallow":this.config.history||!1,this._transient=!!this.config.always||!!this.config.on&&(Array.isArray(this.config.on)?this.config.on.some((function(t){return t.event===Gt})):Gt in this.config.on),this.strict=!!this.config.strict,this.onEntry=z(this.config.entry||this.config.onEntry).map((function(t){return ct(t)})),this.onExit=z(this.config.exit||this.config.onExit).map((function(t){return ct(t)})),this.meta=this.config.meta,this.doneData="final"===this.type?this.config.data:void 0,this.invoke=z(this.config.invoke).map((function(t,e){var n,i;if(G(t)){var r=rt(h.id,e);return h.machine.options.services=o(((n={})[r]=t,n),h.machine.options.services),Wt({src:r,id:r})}if(Z(t.src)){r=t.id||rt(h.id,e);return Wt(o(o({},t),{id:r,src:t.src}))}if(G(t.src)||Q(t.src)){r=t.id||rt(h.id,e);return h.machine.options.services=o(((i={})[r]=t.src,i),h.machine.options.services),Wt(o(o({id:r},t),{src:r}))}var a=t.src;return Wt(o(o({id:rt(h.id,e)},t),{src:a}))})),this.activities=z(this.config.activities).concat(this.invoke).map((function(t){return ht(t)})),this.transition=this.transition.bind(this),this.tags=z(this.config.tags)}return t.prototype._init=function(){this.__cache.transitions||_t(this).forEach((function(t){return t.on}))},t.prototype.withConfig=function(e,n){var i=this.options,r=i.actions,a=i.activities,s=i.guards,c=i.services,u=i.delays;return new t(this.config,{actions:o(o({},r),e.actions),activities:o(o({},a),e.activities),guards:o(o({},s),e.guards),services:o(o({},c),e.services),delays:o(o({},u),e.delays)},null!=n?n:this.context)},t.prototype.withContext=function(e){return new t(this.config,this.options,e)},Object.defineProperty(t.prototype,"context",{get:function(){return Q(this._context)?this._context():this._context},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"definition",{get:function(){return{id:this.id,key:this.key,version:this.version,context:this.context,type:this.type,initial:this.initial,history:this.history,states:D(this.states,(function(t){return t.definition})),on:this.on,transitions:this.transitions,entry:this.onEntry,exit:this.onExit,activities:this.activities||[],meta:this.meta,order:this.order||-1,data:this.doneData,invoke:this.invoke,description:this.description,tags:this.tags}},enumerable:!1,configurable:!0}),t.prototype.toJSON=function(){return this.definition},Object.defineProperty(t.prototype,"on",{get:function(){if(this.__cache.on)return this.__cache.on;var t=this.transitions;return this.__cache.on=t.reduce((function(t,e){return t[e.eventType]=t[e.eventType]||[],t[e.eventType].push(e),t}),{})},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"after",{get:function(){return this.__cache.delayedTransitions||(this.__cache.delayedTransitions=this.getDelayedTransitions(),this.__cache.delayedTransitions)},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"transitions",{get:function(){return this.__cache.transitions||(this.__cache.transitions=this.formatTransitions(),this.__cache.transitions)},enumerable:!1,configurable:!0}),t.prototype.getCandidates=function(t){if(this.__cache.candidates[t])return this.__cache.candidates[t];var e=t===Gt,n=this.transitions.filter((function(n){var i=n.eventType===t;return e?i:i||n.eventType===Kt}));return this.__cache.candidates[t]=n,n},t.prototype.getDelayedTransitions=function(){var t=this,e=this.config.after;if(!e)return[];var n=function(e,n){var r=function(t,e){var n=e?"#".concat(e):"";return"".concat(i.After,"(").concat(t,")").concat(n)}(Q(e)?"".concat(t.id,":delay[").concat(n,"]"):e,t.id);return t.onEntry.push(ft(r,{delay:e})),t.onExit.push({type:p,sendId:r}),r};return(X(e)?e.map((function(t,e){var i=n(t.delay,e);return o(o({},t),{event:i})})):R(Object.keys(e).map((function(t,i){var r=e[t],a=Z(r)?{target:r}:r,s=isNaN(+t)?t:+t,c=n(s,i);return z(a).map((function(t){return o(o({},t),{event:c,delay:s})}))})))).map((function(e){var n=e.delay;return o(o({},t.formatTransition(e)),{delay:n})}))},t.prototype.getStateNodes=function(t){var e,n=this;if(!t)return[];var i=t instanceof Vt?t.value:C(t,this.delimiter);if(Z(i)){var r=this.getStateNode(i).initial;return void 0!==r?this.getStateNodes(((e={})[i]=r,e)):[this,this.states[i]]}var o=Object.keys(i),a=[this];return a.push.apply(a,u([],c(R(o.map((function(t){return n.getStateNode(t).getStateNodes(i[t])})))),!1)),a},t.prototype.handles=function(t){var e=A(t);return this.events.includes(e)},t.prototype.resolveState=function(t){var e=t instanceof Vt?t:Vt.create(t),n=Array.from(Et([],this.getStateNodes(e.value)));return new Vt(o(o({},e),{value:this.resolve(e.value),configuration:n,done:Tt(n,this),tags:At(n),machine:this.machine}))},t.prototype.transitionLeafNode=function(t,e,n){var i=this.getStateNode(t).next(e,n);return i&&i.transitions.length?i:this.next(e,n)},t.prototype.transitionCompoundNode=function(t,e,n){var i=Object.keys(t),r=this.getStateNode(i[0])._transition(t[i[0]],e,n);return r&&r.transitions.length?r:this.next(e,n)},t.prototype.transitionParallelNode=function(t,e,n){var i,r,o={};try{for(var a=s(Object.keys(t)),c=a.next();!c.done;c=a.next()){var u=c.value,h=t[u];if(h){var f=this.getStateNode(u)._transition(h,e,n);f&&(o[u]=f)}}}catch(t){i={error:t}}finally{try{c&&!c.done&&(r=a.return)&&r.call(a)}finally{if(i)throw i.error}}var l=Object.keys(o).map((function(t){return o[t]})),d=R(l.map((function(t){return t.transitions})));if(!l.some((function(t){return t.transitions.length>0})))return this.next(e,n);var v=R(Object.keys(o).map((function(t){return o[t].configuration})));return{transitions:d,exitSet:R(l.map((function(t){return t.exitSet}))),configuration:v,source:e,actions:R(Object.keys(o).map((function(t){return o[t].actions})))}},t.prototype._transition=function(t,e,n){return Z(t)?this.transitionLeafNode(t,e,n):1===Object.keys(t).length?this.transitionCompoundNode(t,e,n):this.transitionParallelNode(t,e,n)},t.prototype.getTransitionData=function(t,e){return this._transition(t.value,t,Y(e))},t.prototype.next=function(t,e){var n,i,r,o=this,a=e.name,h=[],f=[];try{for(var l=s(this.getCandidates(a)),d=l.next();!d.done;d=l.next()){var v=d.value,p=v.cond,y=v.in,g=t.context,m=!y||(Z(y)&&te(y)?t.matches(C(this.getStateNodeById(y).path,this.delimiter)):T(C(y,this.delimiter),L(this.path.slice(0,-2))(t.value))),b=!1;try{b=!p||et(this.machine,p,g,e,t)}catch(t){throw new Error("Unable to evaluate guard '".concat(p.name||p.type,"' in transition for event '").concat(a,"' in state node '").concat(this.id,"':\n").concat(t.message))}if(b&&m){void 0!==v.target&&(f=v.target),h.push.apply(h,u([],c(v.actions),!1)),r=v;break}}}catch(t){n={error:t}}finally{try{d&&!d.done&&(i=l.return)&&i.call(l)}finally{if(n)throw n.error}}if(r){if(!f.length)return{transitions:[r],exitSet:[],configuration:t.value?[this]:[],source:t,actions:h};var x=R(f.map((function(e){return o.getRelativeStateNodes(e,t.historyValue)})));return{transitions:[r],exitSet:!!r.internal?[]:R(f.map((function(t){return o.getPotentiallyReenteringNodes(t)}))),configuration:x,source:t,actions:h}}},t.prototype.getPotentiallyReenteringNodes=function(t){if(this.order0,m=g?t.configuration:e?e.configuration:[],b=Tt(m,this),S=g?jt(this.machine,p):void 0,w=e?e.historyValue?e.historyValue:t.source?this.machine.historyValue(e.value):void 0:void 0,E=this.getActions(new Set(m),b,t,n,r,e,i),O=e?o({},e.activities):{};try{for(var k=s(E),j=k.next();!j.done;j=k.next()){var N=j.value;try{for(var T=(h=void 0,s(N.actions)),A=T.next();!A.done;A=T.next()){var P=A.value;P.type===f?O[P.activity.id||P.activity.type]=P:P.type===l&&(O[P.activity.id||P.activity.type]=!1)}}catch(t){h={error:t}}finally{try{A&&!A.done&&(d=T.return)&&d.call(T)}finally{if(h)throw h.error}}}}catch(t){a={error:t}}finally{try{j&&!j.done&&(u=k.return)&&u.call(k)}finally{if(a)throw a.error}}var C,V,D=c(pt(this,e,n,r,E,i,this.machine.config.predictableActionArguments||this.machine.config.preserveActionOrder),2),I=D[0],L=D[1],M=c(function(t,e){var n,i,r=c([[],[]],2),o=r[0],a=r[1];try{for(var u=s(t),h=u.next();!h.done;h=u.next()){var f=h.value;e(f)?o.push(f):a.push(f)}}catch(t){n={error:t}}finally{try{h&&!h.done&&(i=u.return)&&i.call(u)}finally{if(n)throw n.error}}return[o,a]}(I,ot),2),R=M[0],J=M[1],z=I.filter((function(t){var e;return t.type===f&&(null===(e=t.activity)||void 0===e?void 0:e.type)===x})),F=z.reduce((function(t,e){return t[e.activity.id]=function(t,e,n,i){var r,o=nt(t.src),a=null===(r=null==e?void 0:e.options.services)||void 0===r?void 0:r[o.type],s=t.data?B(t.data,n,i):void 0,c=a?bt(a,t.id,s):mt(t.id);return c.meta=t,c}(e.activity,v.machine,L,r),t}),e?o({},e.children):{}),q=new Vt({value:S||e.value,context:L,_event:r,_sessionid:e?e._sessionid:null,historyValue:S?w?(C=w,V=S,{current:V,states:U(C,V)}):void 0:e?e.historyValue:void 0,history:!S||t.source?e:void 0,actions:S?J:[],activities:S?O:e?e.activities:{},events:[],configuration:m,transitions:t.transitions,children:F,done:b,tags:At(m),machine:this}),$=n!==L;q.changed=r.name===_||$;var X=q.history;X&&delete X.history;var Q=!b&&(this._transient||p.some((function(t){return t._transient})));if(!(g||Q&&r.name!==Gt))return q;var Z=q;if(!b)for(Q&&(Z=this.resolveRaisedTransition(Z,{type:y},r,i));R.length;){var H=R.shift();Z=this.resolveRaisedTransition(Z,H._event,r,i)}var W=Z.changed||(X?!!Z.actions.length||$||typeof X.value!=typeof Z.value||!Pt(Z.value,X.value):void 0);return Z.changed=W,Z.history=X,Z},t.prototype.getStateNode=function(t){if(te(t))return this.machine.getStateNodeById(t);if(!this.states)throw new Error("Unable to retrieve child state '".concat(t,"' from '").concat(this.id,"'; no child states exist."));var e=this.states[t];if(!e)throw new Error("Child state '".concat(t,"' does not exist on '").concat(this.id,"'"));return e},t.prototype.getStateNodeById=function(t){var e=te(t)?t.slice(1):t;if(e===this.id)return this;var n=this.machine.idMap[e];if(!n)throw new Error("Child state node '#".concat(e,"' does not exist on machine '").concat(this.id,"'"));return n},t.prototype.getStateNodeByPath=function(t){if("string"==typeof t&&te(t))try{return this.getStateNodeById(t.slice(1))}catch(t){}for(var e=P(t,this.delimiter).slice(),n=this;e.length;){var i=e.shift();if(!i.length)break;n=n.getStateNode(i)}return n},t.prototype.resolve=function(t){var e,n=this;if(!t)return this.initialStateValue||Yt;switch(this.type){case"parallel":return D(this.initialStateValue,(function(e,i){return e?n.getStateNode(i).resolve(t[i]||e):Yt}));case"compound":if(Z(t)){var i=this.getStateNode(t);return"parallel"===i.type||"compound"===i.type?((e={})[t]=i.initialStateValue,e):t}return Object.keys(t).length?D(t,(function(t,e){return t?n.getStateNode(e).resolve(t):Yt})):this.initialStateValue||{};default:return t||Yt}},t.prototype.getResolvedPath=function(t){if(te(t)){var e=this.machine.idMap[t.slice(1)];if(!e)throw new Error("Unable to find state node '".concat(t,"'"));return e.path}return P(t,this.delimiter)},Object.defineProperty(t.prototype,"initialStateValue",{get:function(){var t,e;if(this.__cache.initialStateValue)return this.__cache.initialStateValue;if("parallel"===this.type)e=I(this.states,(function(t){return t.initialStateValue||Yt}),(function(t){return!("history"===t.type)}));else if(void 0!==this.initial){if(!this.states[this.initial])throw new Error("Initial state '".concat(this.initial,"' not found on '").concat(this.key,"'"));e=xt(this.states[this.initial])?this.initial:((t={})[this.initial]=this.states[this.initial].initialStateValue,t)}else e={};return this.__cache.initialStateValue=e,this.__cache.initialStateValue},enumerable:!1,configurable:!0}),t.prototype.getInitialState=function(t,e){this._init();var n=this.getStateNodes(t);return this.resolveTransition({configuration:n,exitSet:[],transitions:[],source:void 0,actions:[]},void 0,null!=e?e:this.machine.context,void 0)},Object.defineProperty(t.prototype,"initialState",{get:function(){var t=this.initialStateValue;if(!t)throw new Error("Cannot retrieve initial state from simple state '".concat(this.id,"'."));return this.getInitialState(t)},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"target",{get:function(){var t;if("history"===this.type){var e=this.config;t=Z(e.target)&&te(e.target)?V(this.machine.getStateNodeById(e.target).path.slice(this.path.length-1)):e.target}return t},enumerable:!1,configurable:!0}),t.prototype.getRelativeStateNodes=function(t,e,n){return void 0===n&&(n=!0),n?"history"===t.type?t.resolveHistory(e):t.initialStateNodes:[t]},Object.defineProperty(t.prototype,"initialStateNodes",{get:function(){var t=this;return xt(this)?[this]:"compound"!==this.type||this.initial?R(M(this.initialStateValue).map((function(e){return t.getFromRelativePath(e)}))):(N||$(!1,"Compound state node '".concat(this.id,"' has no initial state.")),[this])},enumerable:!1,configurable:!0}),t.prototype.getFromRelativePath=function(t){if(!t.length)return[this];var e=c(t),n=e[0],i=e.slice(1);if(!this.states)throw new Error("Cannot retrieve subPath '".concat(n,"' from node with no states"));var r=this.getStateNode(n);if("history"===r.type)return r.resolveHistory();if(!this.states[n])throw new Error("Child state '".concat(n,"' does not exist on '").concat(this.id,"'"));return this.states[n].getFromRelativePath(i)},t.prototype.historyValue=function(t){if(Object.keys(this.states).length)return{current:t||this.initialStateValue,states:I(this.states,(function(e,n){if(!t)return e.historyValue();var i=Z(t)?void 0:t[n];return e.historyValue(i||e.initialStateValue)}),(function(t){return!t.history}))}},t.prototype.resolveHistory=function(t){var e=this;if("history"!==this.type)return[this];var n=this.parent;if(!t){var i=this.target;return i?R(M(i).map((function(t){return n.getFromRelativePath(t)}))):n.initialStateNodes}var r,o,a=(r=n.path,o="states",function(t){var e,n,i=t;try{for(var a=s(r),c=a.next();!c.done;c=a.next()){var u=c.value;i=i[o][u]}}catch(t){e={error:t}}finally{try{c&&!c.done&&(n=a.return)&&n.call(a)}finally{if(e)throw e.error}}return i})(t).current;return Z(a)?[n.getStateNode(a)]:R(M(a).map((function(t){return"deep"===e.history?n.getFromRelativePath(t):[n.states[t[0]]]})))},Object.defineProperty(t.prototype,"stateIds",{get:function(){var t=this,e=R(Object.keys(this.states).map((function(e){return t.states[e].stateIds})));return[this.id].concat(e)},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"events",{get:function(){var t,e,n,i;if(this.__cache.events)return this.__cache.events;var r=this.states,o=new Set(this.ownEvents);if(r)try{for(var a=s(Object.keys(r)),c=a.next();!c.done;c=a.next()){var u=r[c.value];if(u.states)try{for(var h=(n=void 0,s(u.events)),f=h.next();!f.done;f=h.next()){var l=f.value;o.add("".concat(l))}}catch(t){n={error:t}}finally{try{f&&!f.done&&(i=h.return)&&i.call(h)}finally{if(n)throw n.error}}}}catch(e){t={error:e}}finally{try{c&&!c.done&&(e=a.return)&&e.call(a)}finally{if(t)throw t.error}}return this.__cache.events=Array.from(o)},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"ownEvents",{get:function(){var t=new Set(this.transitions.filter((function(t){return!(!t.target&&!t.actions.length&&t.internal)})).map((function(t){return t.eventType})));return Array.from(t)},enumerable:!1,configurable:!0}),t.prototype.resolveTarget=function(t){var e=this;if(void 0!==t)return t.map((function(t){if(!Z(t))return t;var n=t[0]===e.delimiter;if(n&&!e.parent)return e.getStateNodeByPath(t.slice(1));var i=n?e.key+t:t;if(!e.parent)return e.getStateNodeByPath(i);try{return e.parent.getStateNodeByPath(i)}catch(t){throw new Error("Invalid transition definition for state node '".concat(e.id,"':\n").concat(t.message))}}))},t.prototype.formatTransition=function(t){var e=this,n=function(t){if(void 0!==t&&""!==t)return z(t)}(t.target),i="internal"in t?t.internal:!n||n.some((function(t){return Z(t)&&t[0]===e.delimiter})),r=this.machine.options.guards,a=this.resolveTarget(n),s=o(o({},t),{actions:ut(z(t.actions)),cond:H(t.cond,r),target:a,source:this,internal:i,eventType:t.event,toJSON:function(){return o(o({},s),{target:s.target?s.target.map((function(t){return"#".concat(t.id)})):void 0,source:"#".concat(e.id)})}});return s},t.prototype.formatTransitions=function(){var t,e,n,i=this;if(this.config.on)if(Array.isArray(this.config.on))n=this.config.on;else{var r=this.config.on,o=Kt,h=r[o],f=void 0===h?[]:h,l=a(r,["*"]);n=R(Object.keys(l).map((function(t){N||t!==Gt||$(!1,"Empty string transition configs (e.g., `{ on: { '': ... }}`) for transient transitions are deprecated. Specify the transition in the `{ always: ... }` property instead. "+'Please check the `on` configuration for "#'.concat(i.id,'".'));var e=tt(t,l[t]);return N||function(t,e,n){var i=n.slice(0,-1).some((function(t){return!("cond"in t)&&!("in"in t)&&(Z(t.target)||G(t.target))})),r=e===Gt?"the transient event":"event '".concat(e,"'");$(!i,"One or more transitions for ".concat(r," on state '").concat(t.id,"' are unreachable. ")+"Make sure that the default transition is the last one defined.")}(i,t,e),e})).concat(tt(Kt,f)))}else n=[];var d=this.config.always?tt("",this.config.always):[],v=this.config.onDone?tt(String(lt(this.id)),this.config.onDone):[];N||$(!(this.config.onDone&&!this.parent),'Root nodes cannot have an ".onDone" transition. Please check the config of "'.concat(this.id,'".'));var p=R(this.invoke.map((function(t){var e=[];return t.onDone&&e.push.apply(e,u([],c(tt(String(dt(t.id)),t.onDone)),!1)),t.onError&&e.push.apply(e,u([],c(tt(String(vt(t.id)),t.onError)),!1)),e}))),y=this.after,g=R(u(u(u(u([],c(v),!1),c(p),!1),c(n),!1),c(d),!1).map((function(t){return z(t).map((function(t){return i.formatTransition(t)}))})));try{for(var m=s(y),b=m.next();!b.done;b=m.next()){var x=b.value;g.push(x)}}catch(e){t={error:e}}finally{try{b&&!b.done&&(e=m.return)&&e.call(m)}finally{if(t)throw t.error}}return g},t}();function ne(t,e,n){return void 0===n&&(n=t.context),new ee(t,e,n)}var ie=function(t){return{type:g,assignment:t}}}}]); +//# sourceMappingURL=530.bundle.b5e992d674170dee581a.js.map \ No newline at end of file diff --git a/resources/530.bundle.b5e992d674170dee581a.js.LICENSE.txt b/resources/530.bundle.b5e992d674170dee581a.js.LICENSE.txt new file mode 100644 index 0000000..e80e55b --- /dev/null +++ b/resources/530.bundle.b5e992d674170dee581a.js.LICENSE.txt @@ -0,0 +1,34 @@ +/*! ***************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */ + +/** + * @license React + * use-sync-external-store-shim.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** + * @license React + * use-sync-external-store-shim/with-selector.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ diff --git a/resources/530.bundle.b5e992d674170dee581a.js.map b/resources/530.bundle.b5e992d674170dee581a.js.map new file mode 100644 index 0000000..0fa9e8b --- /dev/null +++ b/resources/530.bundle.b5e992d674170dee581a.js.map @@ -0,0 +1 @@ +{"version":3,"file":"530.bundle.b5e992d674170dee581a.js","mappings":"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","sources":["webpack:///../../../node_modules/@xstate/react/es/useConstant.js","webpack:///../../../node_modules/@xstate/react/es/useInterpret.js","webpack:///../../../node_modules/@xstate/react/es/useMachine.js","webpack:///../../../node_modules/@xstate/react/es/utils.js","webpack:///../../../node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.min.js","webpack:///../../../node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.min.js","webpack:///../../../node_modules/use-sync-external-store/shim/index.js","webpack:///../../../node_modules/use-sync-external-store/shim/with-selector.js","webpack:///../../../node_modules/xstate/es/_virtual/_tslib.js","webpack:///../../../node_modules/xstate/es/types.js","webpack:///../../../node_modules/xstate/es/actionTypes.js","webpack:///../../../node_modules/xstate/es/utils.js","webpack:///../../../node_modules/xstate/es/constants.js","webpack:///../../../node_modules/xstate/es/environment.js","webpack:///../../../node_modules/xstate/es/actions.js","webpack:///../../../node_modules/xstate/es/serviceScope.js","webpack:///../../../node_modules/xstate/es/Actor.js","webpack:///../../../node_modules/xstate/es/stateUtils.js","webpack:///../../../node_modules/xstate/es/State.js","webpack:///../../../node_modules/xstate/es/scheduler.js","webpack:///../../../node_modules/xstate/es/registry.js","webpack:///../../../node_modules/xstate/es/devTools.js","webpack:///../../../node_modules/xstate/es/behaviors.js","webpack:///../../../node_modules/xstate/es/interpreter.js","webpack:///../../../node_modules/xstate/es/invokeUtils.js","webpack:///../../../node_modules/xstate/es/StateNode.js","webpack:///../../../node_modules/xstate/es/Machine.js","webpack:///../../../node_modules/xstate/es/schema.js","webpack:///../../../node_modules/xstate/es/index.js"],"sourcesContent":["import * as React from 'react';\nexport default function useConstant(fn) {\n var ref = React.useRef();\n if (!ref.current) {\n ref.current = { v: fn() };\n }\n return ref.current.v;\n}\n","var __assign = (this && this.__assign) || function () {\n __assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return __assign.apply(this, arguments);\n};\nvar __rest = (this && this.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nvar __read = (this && this.__read) || function (o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n};\nimport { useEffect, useState } from 'react';\nimport useIsomorphicLayoutEffect from 'use-isomorphic-layout-effect';\nimport { interpret, InterpreterStatus, State, toObserver } from 'xstate';\nimport useConstant from './useConstant';\nexport function useIdleInterpreter(getMachine, options) {\n var machine = useConstant(function () {\n return typeof getMachine === 'function' ? getMachine() : getMachine;\n });\n if (process.env.NODE_ENV !== 'production' &&\n typeof getMachine !== 'function') {\n var _a = __read(useState(machine), 1), initialMachine = _a[0];\n if (getMachine !== initialMachine) {\n console.warn('Machine given to `useMachine` has changed between renders. This is not supported and might lead to unexpected results.\\n' +\n 'Please make sure that you pass the same Machine as argument each time.');\n }\n }\n var context = options.context, guards = options.guards, actions = options.actions, activities = options.activities, services = options.services, delays = options.delays, rehydratedState = options.state, interpreterOptions = __rest(options, [\"context\", \"guards\", \"actions\", \"activities\", \"services\", \"delays\", \"state\"]);\n var service = useConstant(function () {\n var machineConfig = {\n context: context,\n guards: guards,\n actions: actions,\n activities: activities,\n services: services,\n delays: delays\n };\n var machineWithConfig = machine.withConfig(machineConfig, function () { return (__assign(__assign({}, machine.context), context)); });\n return interpret(machineWithConfig, interpreterOptions);\n });\n // Make sure options are kept updated when they change.\n // This mutation assignment is safe because the service instance is only used\n // in one place -- this hook's caller.\n useIsomorphicLayoutEffect(function () {\n Object.assign(service.machine.options.actions, actions);\n Object.assign(service.machine.options.guards, guards);\n Object.assign(service.machine.options.activities, activities);\n Object.assign(service.machine.options.services, services);\n Object.assign(service.machine.options.delays, delays);\n }, [actions, guards, activities, services, delays]);\n return service;\n}\nexport function useInterpret(getMachine) {\n var _a = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n _a[_i - 1] = arguments[_i];\n }\n var _b = __read(_a, 2), _c = _b[0], options = _c === void 0 ? {} : _c, observerOrListener = _b[1];\n var service = useIdleInterpreter(getMachine, options);\n useEffect(function () {\n if (!observerOrListener) {\n return;\n }\n var sub = service.subscribe(toObserver(observerOrListener));\n return function () {\n sub.unsubscribe();\n };\n }, [observerOrListener]);\n useEffect(function () {\n var rehydratedState = options.state;\n service.start(rehydratedState ? State.create(rehydratedState) : undefined);\n return function () {\n service.stop();\n service.status = InterpreterStatus.NotStarted;\n };\n }, []);\n return service;\n}\n","var __read = (this && this.__read) || function (o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n};\nimport { useCallback, useEffect } from 'react';\nimport { useSyncExternalStoreWithSelector } from 'use-sync-external-store/shim/with-selector';\nimport { InterpreterStatus, State } from 'xstate';\nimport { useIdleInterpreter } from './useInterpret';\nimport { isInterpreterStateEqual } from './utils';\nfunction identity(a) {\n return a;\n}\nexport function useMachine(getMachine) {\n var _a = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n _a[_i - 1] = arguments[_i];\n }\n var _b = __read(_a, 1), _c = _b[0], options = _c === void 0 ? {} : _c;\n // using `useIdleInterpreter` allows us to subscribe to the service *before* we start it\n // so we don't miss any notifications\n var service = useIdleInterpreter(getMachine, options);\n var getSnapshot = useCallback(function () {\n if (service.status === InterpreterStatus.NotStarted) {\n return (options.state\n ? State.create(options.state)\n : service.machine.initialState);\n }\n return service.getSnapshot();\n }, [service]);\n var isEqual = useCallback(function (prevState, nextState) {\n return isInterpreterStateEqual(service, prevState, nextState);\n }, [service]);\n var subscribe = useCallback(function (handleStoreChange) {\n var unsubscribe = service.subscribe(handleStoreChange).unsubscribe;\n return unsubscribe;\n }, [service]);\n var storeSnapshot = useSyncExternalStoreWithSelector(subscribe, getSnapshot, getSnapshot, identity, isEqual);\n useEffect(function () {\n var rehydratedState = options.state;\n service.start(rehydratedState ? State.create(rehydratedState) : undefined);\n return function () {\n service.stop();\n service.status = InterpreterStatus.NotStarted;\n };\n }, []);\n return [storeSnapshot, service.send, service];\n}\n","var __read = (this && this.__read) || function (o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n};\nvar __values = (this && this.__values) || function(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n};\nimport { InterpreterStatus } from 'xstate';\nexport function partition(items, predicate) {\n var e_1, _a;\n var _b = __read([[], []], 2), truthy = _b[0], falsy = _b[1];\n try {\n for (var items_1 = __values(items), items_1_1 = items_1.next(); !items_1_1.done; items_1_1 = items_1.next()) {\n var item = items_1_1.value;\n if (predicate(item)) {\n truthy.push(item);\n }\n else {\n falsy.push(item);\n }\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (items_1_1 && !items_1_1.done && (_a = items_1.return)) _a.call(items_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n return [truthy, falsy];\n}\nexport function getServiceSnapshot(service) {\n return service.status !== 0\n ? service.getSnapshot()\n : service.machine.initialState;\n}\n// From https://github.com/reduxjs/react-redux/blob/master/src/utils/shallowEqual.ts\nfunction is(x, y) {\n if (x === y) {\n return x !== 0 || y !== 0 || 1 / x === 1 / y;\n }\n else {\n return x !== x && y !== y;\n }\n}\nexport function shallowEqual(objA, objB) {\n if (is(objA, objB))\n return true;\n if (typeof objA !== 'object' ||\n objA === null ||\n typeof objB !== 'object' ||\n objB === null) {\n return false;\n }\n var keysA = Object.keys(objA);\n var keysB = Object.keys(objB);\n if (keysA.length !== keysB.length)\n return false;\n for (var i = 0; i < keysA.length; i++) {\n if (!Object.prototype.hasOwnProperty.call(objB, keysA[i]) ||\n !is(objA[keysA[i]], objB[keysA[i]])) {\n return false;\n }\n }\n return true;\n}\nexport function isService(actor) {\n return 'state' in actor && 'machine' in actor;\n}\nexport function isInterpreterStateEqual(service, prevState, nextState) {\n if (service.status === InterpreterStatus.NotStarted) {\n return true;\n }\n // Only change the current state if:\n // - the incoming state is the \"live\" initial state (since it might have new actors)\n // - OR the incoming state actually changed.\n //\n // The \"live\" initial state will have .changed === undefined.\n var initialStateChanged = nextState.changed === undefined &&\n (Object.keys(nextState.children).length > 0 ||\n typeof prevState.changed === 'boolean');\n return !(nextState.changed || initialStateChanged);\n}\n","/**\n * @license React\n * use-sync-external-store-shim.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var e=require(\"react\");function h(a,b){return a===b&&(0!==a||1/a===1/b)||a!==a&&b!==b}var k=\"function\"===typeof Object.is?Object.is:h,l=e.useState,m=e.useEffect,n=e.useLayoutEffect,p=e.useDebugValue;function q(a,b){var d=b(),f=l({inst:{value:d,getSnapshot:b}}),c=f[0].inst,g=f[1];n(function(){c.value=d;c.getSnapshot=b;r(c)&&g({inst:c})},[a,d,b]);m(function(){r(c)&&g({inst:c});return a(function(){r(c)&&g({inst:c})})},[a]);p(d);return d}\nfunction r(a){var b=a.getSnapshot;a=a.value;try{var d=b();return!k(a,d)}catch(f){return!0}}function t(a,b){return b()}var u=\"undefined\"===typeof window||\"undefined\"===typeof window.document||\"undefined\"===typeof window.document.createElement?t:q;exports.useSyncExternalStore=void 0!==e.useSyncExternalStore?e.useSyncExternalStore:u;\n","/**\n * @license React\n * use-sync-external-store-shim/with-selector.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var h=require(\"react\"),n=require(\"use-sync-external-store/shim\");function p(a,b){return a===b&&(0!==a||1/a===1/b)||a!==a&&b!==b}var q=\"function\"===typeof Object.is?Object.is:p,r=n.useSyncExternalStore,t=h.useRef,u=h.useEffect,v=h.useMemo,w=h.useDebugValue;\nexports.useSyncExternalStoreWithSelector=function(a,b,e,l,g){var c=t(null);if(null===c.current){var f={hasValue:!1,value:null};c.current=f}else f=c.current;c=v(function(){function a(a){if(!c){c=!0;d=a;a=l(a);if(void 0!==g&&f.hasValue){var b=f.value;if(g(b,a))return k=b}return k=a}b=k;if(q(d,a))return b;var e=l(a);if(void 0!==g&&g(b,e))return b;d=a;return k=e}var c=!1,d,k,m=void 0===e?null:e;return[function(){return a(b())},null===m?void 0:function(){return a(m())}]},[b,e,l,g]);var d=r(a,c[0],c[1]);\nu(function(){f.hasValue=!0;f.value=d},[d]);w(d);return d};\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('../cjs/use-sync-external-store-shim.production.min.js');\n} else {\n module.exports = require('../cjs/use-sync-external-store-shim.development.js');\n}\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('../cjs/use-sync-external-store-shim/with-selector.production.min.js');\n} else {\n module.exports = require('../cjs/use-sync-external-store-shim/with-selector.development.js');\n}\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n\r\nvar __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n };\r\n return __assign.apply(this, arguments);\r\n};\r\n\r\nfunction __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nfunction __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nfunction __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nfunction __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\n\nexport { __assign, __read, __rest, __spreadArray, __values };\n","var ActionTypes;\n\n(function (ActionTypes) {\n ActionTypes[\"Start\"] = \"xstate.start\";\n ActionTypes[\"Stop\"] = \"xstate.stop\";\n ActionTypes[\"Raise\"] = \"xstate.raise\";\n ActionTypes[\"Send\"] = \"xstate.send\";\n ActionTypes[\"Cancel\"] = \"xstate.cancel\";\n ActionTypes[\"NullEvent\"] = \"\";\n ActionTypes[\"Assign\"] = \"xstate.assign\";\n ActionTypes[\"After\"] = \"xstate.after\";\n ActionTypes[\"DoneState\"] = \"done.state\";\n ActionTypes[\"DoneInvoke\"] = \"done.invoke\";\n ActionTypes[\"Log\"] = \"xstate.log\";\n ActionTypes[\"Init\"] = \"xstate.init\";\n ActionTypes[\"Invoke\"] = \"xstate.invoke\";\n ActionTypes[\"ErrorExecution\"] = \"error.execution\";\n ActionTypes[\"ErrorCommunication\"] = \"error.communication\";\n ActionTypes[\"ErrorPlatform\"] = \"error.platform\";\n ActionTypes[\"ErrorCustom\"] = \"xstate.error\";\n ActionTypes[\"Update\"] = \"xstate.update\";\n ActionTypes[\"Pure\"] = \"xstate.pure\";\n ActionTypes[\"Choose\"] = \"xstate.choose\";\n})(ActionTypes || (ActionTypes = {}));\n\nvar SpecialTargets;\n\n(function (SpecialTargets) {\n SpecialTargets[\"Parent\"] = \"#_parent\";\n SpecialTargets[\"Internal\"] = \"#_internal\";\n})(SpecialTargets || (SpecialTargets = {}));\n\nexport { ActionTypes, SpecialTargets };\n","import { ActionTypes } from './types.js';\n\nvar start = ActionTypes.Start;\nvar stop = ActionTypes.Stop;\nvar raise = ActionTypes.Raise;\nvar send = ActionTypes.Send;\nvar cancel = ActionTypes.Cancel;\nvar nullEvent = ActionTypes.NullEvent;\nvar assign = ActionTypes.Assign;\nvar after = ActionTypes.After;\nvar doneState = ActionTypes.DoneState;\nvar log = ActionTypes.Log;\nvar init = ActionTypes.Init;\nvar invoke = ActionTypes.Invoke;\nvar errorExecution = ActionTypes.ErrorExecution;\nvar errorPlatform = ActionTypes.ErrorPlatform;\nvar error = ActionTypes.ErrorCustom;\nvar update = ActionTypes.Update;\nvar choose = ActionTypes.Choose;\nvar pure = ActionTypes.Pure;\n\nexport { after, assign, cancel, choose, doneState, error, errorExecution, errorPlatform, init, invoke, log, nullEvent, pure, raise, send, start, stop, update };\n","import { __values, __spreadArray, __read, __assign } from './_virtual/_tslib.js';\nimport { SpecialTargets } from './types.js';\nimport { raise, send } from './actionTypes.js';\nimport { DEFAULT_GUARD_TYPE, TARGETLESS_KEY, STATE_DELIMITER } from './constants.js';\nimport { IS_PRODUCTION } from './environment.js';\n\nvar _a;\nfunction keys(value) {\n return Object.keys(value);\n}\nfunction matchesState(parentStateId, childStateId, delimiter) {\n if (delimiter === void 0) {\n delimiter = STATE_DELIMITER;\n }\n\n var parentStateValue = toStateValue(parentStateId, delimiter);\n var childStateValue = toStateValue(childStateId, delimiter);\n\n if (isString(childStateValue)) {\n if (isString(parentStateValue)) {\n return childStateValue === parentStateValue;\n } // Parent more specific than child\n\n\n return false;\n }\n\n if (isString(parentStateValue)) {\n return parentStateValue in childStateValue;\n }\n\n return Object.keys(parentStateValue).every(function (key) {\n if (!(key in childStateValue)) {\n return false;\n }\n\n return matchesState(parentStateValue[key], childStateValue[key]);\n });\n}\nfunction getEventType(event) {\n try {\n return isString(event) || typeof event === 'number' ? \"\".concat(event) : event.type;\n } catch (e) {\n throw new Error('Events must be strings or objects with a string event.type property.');\n }\n}\nfunction getActionType(action) {\n try {\n return isString(action) || typeof action === 'number' ? \"\".concat(action) : isFunction(action) ? action.name : action.type;\n } catch (e) {\n throw new Error('Actions must be strings or objects with a string action.type property.');\n }\n}\nfunction toStatePath(stateId, delimiter) {\n try {\n if (isArray(stateId)) {\n return stateId;\n }\n\n return stateId.toString().split(delimiter);\n } catch (e) {\n throw new Error(\"'\".concat(stateId, \"' is not a valid state path.\"));\n }\n}\nfunction isStateLike(state) {\n return typeof state === 'object' && 'value' in state && 'context' in state && 'event' in state && '_event' in state;\n}\nfunction toStateValue(stateValue, delimiter) {\n if (isStateLike(stateValue)) {\n return stateValue.value;\n }\n\n if (isArray(stateValue)) {\n return pathToStateValue(stateValue);\n }\n\n if (typeof stateValue !== 'string') {\n return stateValue;\n }\n\n var statePath = toStatePath(stateValue, delimiter);\n return pathToStateValue(statePath);\n}\nfunction pathToStateValue(statePath) {\n if (statePath.length === 1) {\n return statePath[0];\n }\n\n var value = {};\n var marker = value;\n\n for (var i = 0; i < statePath.length - 1; i++) {\n if (i === statePath.length - 2) {\n marker[statePath[i]] = statePath[i + 1];\n } else {\n marker[statePath[i]] = {};\n marker = marker[statePath[i]];\n }\n }\n\n return value;\n}\nfunction mapValues(collection, iteratee) {\n var result = {};\n var collectionKeys = Object.keys(collection);\n\n for (var i = 0; i < collectionKeys.length; i++) {\n var key = collectionKeys[i];\n result[key] = iteratee(collection[key], key, collection, i);\n }\n\n return result;\n}\nfunction mapFilterValues(collection, iteratee, predicate) {\n var e_1, _a;\n\n var result = {};\n\n try {\n for (var _b = __values(Object.keys(collection)), _c = _b.next(); !_c.done; _c = _b.next()) {\n var key = _c.value;\n var item = collection[key];\n\n if (!predicate(item)) {\n continue;\n }\n\n result[key] = iteratee(item, key, collection);\n }\n } catch (e_1_1) {\n e_1 = {\n error: e_1_1\n };\n } finally {\n try {\n if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n } finally {\n if (e_1) throw e_1.error;\n }\n }\n\n return result;\n}\n/**\r\n * Retrieves a value at the given path.\r\n * @param props The deep path to the prop of the desired value\r\n */\n\nvar path = function (props) {\n return function (object) {\n var e_2, _a;\n\n var result = object;\n\n try {\n for (var props_1 = __values(props), props_1_1 = props_1.next(); !props_1_1.done; props_1_1 = props_1.next()) {\n var prop = props_1_1.value;\n result = result[prop];\n }\n } catch (e_2_1) {\n e_2 = {\n error: e_2_1\n };\n } finally {\n try {\n if (props_1_1 && !props_1_1.done && (_a = props_1.return)) _a.call(props_1);\n } finally {\n if (e_2) throw e_2.error;\n }\n }\n\n return result;\n };\n};\n/**\r\n * Retrieves a value at the given path via the nested accessor prop.\r\n * @param props The deep path to the prop of the desired value\r\n */\n\nfunction nestedPath(props, accessorProp) {\n return function (object) {\n var e_3, _a;\n\n var result = object;\n\n try {\n for (var props_2 = __values(props), props_2_1 = props_2.next(); !props_2_1.done; props_2_1 = props_2.next()) {\n var prop = props_2_1.value;\n result = result[accessorProp][prop];\n }\n } catch (e_3_1) {\n e_3 = {\n error: e_3_1\n };\n } finally {\n try {\n if (props_2_1 && !props_2_1.done && (_a = props_2.return)) _a.call(props_2);\n } finally {\n if (e_3) throw e_3.error;\n }\n }\n\n return result;\n };\n}\nfunction toStatePaths(stateValue) {\n if (!stateValue) {\n return [[]];\n }\n\n if (isString(stateValue)) {\n return [[stateValue]];\n }\n\n var result = flatten(Object.keys(stateValue).map(function (key) {\n var subStateValue = stateValue[key];\n\n if (typeof subStateValue !== 'string' && (!subStateValue || !Object.keys(subStateValue).length)) {\n return [[key]];\n }\n\n return toStatePaths(stateValue[key]).map(function (subPath) {\n return [key].concat(subPath);\n });\n }));\n return result;\n}\nfunction pathsToStateValue(paths) {\n var e_4, _a;\n\n var result = {};\n\n if (paths && paths.length === 1 && paths[0].length === 1) {\n return paths[0][0];\n }\n\n try {\n for (var paths_1 = __values(paths), paths_1_1 = paths_1.next(); !paths_1_1.done; paths_1_1 = paths_1.next()) {\n var currentPath = paths_1_1.value;\n var marker = result; // tslint:disable-next-line:prefer-for-of\n\n for (var i = 0; i < currentPath.length; i++) {\n var subPath = currentPath[i];\n\n if (i === currentPath.length - 2) {\n marker[subPath] = currentPath[i + 1];\n break;\n }\n\n marker[subPath] = marker[subPath] || {};\n marker = marker[subPath];\n }\n }\n } catch (e_4_1) {\n e_4 = {\n error: e_4_1\n };\n } finally {\n try {\n if (paths_1_1 && !paths_1_1.done && (_a = paths_1.return)) _a.call(paths_1);\n } finally {\n if (e_4) throw e_4.error;\n }\n }\n\n return result;\n}\nfunction flatten(array) {\n var _a;\n\n return (_a = []).concat.apply(_a, __spreadArray([], __read(array), false));\n}\nfunction toArrayStrict(value) {\n if (isArray(value)) {\n return value;\n }\n\n return [value];\n}\nfunction toArray(value) {\n if (value === undefined) {\n return [];\n }\n\n return toArrayStrict(value);\n}\nfunction mapContext(mapper, context, _event) {\n var e_5, _a;\n\n if (isFunction(mapper)) {\n return mapper(context, _event.data);\n }\n\n var result = {};\n\n try {\n for (var _b = __values(Object.keys(mapper)), _c = _b.next(); !_c.done; _c = _b.next()) {\n var key = _c.value;\n var subMapper = mapper[key];\n\n if (isFunction(subMapper)) {\n result[key] = subMapper(context, _event.data);\n } else {\n result[key] = subMapper;\n }\n }\n } catch (e_5_1) {\n e_5 = {\n error: e_5_1\n };\n } finally {\n try {\n if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n } finally {\n if (e_5) throw e_5.error;\n }\n }\n\n return result;\n}\nfunction isBuiltInEvent(eventType) {\n return /^(done|error)\\./.test(eventType);\n}\nfunction isPromiseLike(value) {\n if (value instanceof Promise) {\n return true;\n } // Check if shape matches the Promise/A+ specification for a \"thenable\".\n\n\n if (value !== null && (isFunction(value) || typeof value === 'object') && isFunction(value.then)) {\n return true;\n }\n\n return false;\n}\nfunction isBehavior(value) {\n return value !== null && typeof value === 'object' && 'transition' in value && typeof value.transition === 'function';\n}\nfunction partition(items, predicate) {\n var e_6, _a;\n\n var _b = __read([[], []], 2),\n truthy = _b[0],\n falsy = _b[1];\n\n try {\n for (var items_1 = __values(items), items_1_1 = items_1.next(); !items_1_1.done; items_1_1 = items_1.next()) {\n var item = items_1_1.value;\n\n if (predicate(item)) {\n truthy.push(item);\n } else {\n falsy.push(item);\n }\n }\n } catch (e_6_1) {\n e_6 = {\n error: e_6_1\n };\n } finally {\n try {\n if (items_1_1 && !items_1_1.done && (_a = items_1.return)) _a.call(items_1);\n } finally {\n if (e_6) throw e_6.error;\n }\n }\n\n return [truthy, falsy];\n}\nfunction updateHistoryStates(hist, stateValue) {\n return mapValues(hist.states, function (subHist, key) {\n if (!subHist) {\n return undefined;\n }\n\n var subStateValue = (isString(stateValue) ? undefined : stateValue[key]) || (subHist ? subHist.current : undefined);\n\n if (!subStateValue) {\n return undefined;\n }\n\n return {\n current: subStateValue,\n states: updateHistoryStates(subHist, subStateValue)\n };\n });\n}\nfunction updateHistoryValue(hist, stateValue) {\n return {\n current: stateValue,\n states: updateHistoryStates(hist, stateValue)\n };\n}\nfunction updateContext(context, _event, assignActions, state) {\n if (!IS_PRODUCTION) {\n warn(!!context, 'Attempting to update undefined context');\n }\n\n var updatedContext = context ? assignActions.reduce(function (acc, assignAction) {\n var e_7, _a;\n\n var assignment = assignAction.assignment;\n var meta = {\n state: state,\n action: assignAction,\n _event: _event\n };\n var partialUpdate = {};\n\n if (isFunction(assignment)) {\n partialUpdate = assignment(acc, _event.data, meta);\n } else {\n try {\n for (var _b = __values(Object.keys(assignment)), _c = _b.next(); !_c.done; _c = _b.next()) {\n var key = _c.value;\n var propAssignment = assignment[key];\n partialUpdate[key] = isFunction(propAssignment) ? propAssignment(acc, _event.data, meta) : propAssignment;\n }\n } catch (e_7_1) {\n e_7 = {\n error: e_7_1\n };\n } finally {\n try {\n if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n } finally {\n if (e_7) throw e_7.error;\n }\n }\n }\n\n return Object.assign({}, acc, partialUpdate);\n }, context) : context;\n return updatedContext;\n} // tslint:disable-next-line:no-empty\n\nvar warn = function () {};\n\nif (!IS_PRODUCTION) {\n warn = function (condition, message) {\n var error = condition instanceof Error ? condition : undefined;\n\n if (!error && condition) {\n return;\n }\n\n if (console !== undefined) {\n var args = [\"Warning: \".concat(message)];\n\n if (error) {\n args.push(error);\n } // tslint:disable-next-line:no-console\n\n\n console.warn.apply(console, args);\n }\n };\n}\nfunction isArray(value) {\n return Array.isArray(value);\n} // tslint:disable-next-line:ban-types\n\nfunction isFunction(value) {\n return typeof value === 'function';\n}\nfunction isString(value) {\n return typeof value === 'string';\n}\nfunction toGuard(condition, guardMap) {\n if (!condition) {\n return undefined;\n }\n\n if (isString(condition)) {\n return {\n type: DEFAULT_GUARD_TYPE,\n name: condition,\n predicate: guardMap ? guardMap[condition] : undefined\n };\n }\n\n if (isFunction(condition)) {\n return {\n type: DEFAULT_GUARD_TYPE,\n name: condition.name,\n predicate: condition\n };\n }\n\n return condition;\n}\nfunction isObservable(value) {\n try {\n return 'subscribe' in value && isFunction(value.subscribe);\n } catch (e) {\n return false;\n }\n}\nvar symbolObservable = /*#__PURE__*/function () {\n return typeof Symbol === 'function' && Symbol.observable || '@@observable';\n}(); // TODO: to be removed in v5, left it out just to minimize the scope of the change and maintain compatibility with older versions of integration paackages\n\nvar interopSymbols = (_a = {}, _a[symbolObservable] = function () {\n return this;\n}, _a[Symbol.observable] = function () {\n return this;\n}, _a);\nfunction isMachine(value) {\n return !!value && '__xstatenode' in value;\n}\nfunction isActor(value) {\n return !!value && typeof value.send === 'function';\n}\nvar uniqueId = /*#__PURE__*/function () {\n var currentId = 0;\n return function () {\n currentId++;\n return currentId.toString(16);\n };\n}();\nfunction toEventObject(event, payload // id?: TEvent['type']\n) {\n if (isString(event) || typeof event === 'number') {\n return __assign({\n type: event\n }, payload);\n }\n\n return event;\n}\nfunction toSCXMLEvent(event, scxmlEvent) {\n if (!isString(event) && '$$type' in event && event.$$type === 'scxml') {\n return event;\n }\n\n var eventObject = toEventObject(event);\n return __assign({\n name: eventObject.type,\n data: eventObject,\n $$type: 'scxml',\n type: 'external'\n }, scxmlEvent);\n}\nfunction toTransitionConfigArray(event, configLike) {\n var transitions = toArrayStrict(configLike).map(function (transitionLike) {\n if (typeof transitionLike === 'undefined' || typeof transitionLike === 'string' || isMachine(transitionLike)) {\n return {\n target: transitionLike,\n event: event\n };\n }\n\n return __assign(__assign({}, transitionLike), {\n event: event\n });\n });\n return transitions;\n}\nfunction normalizeTarget(target) {\n if (target === undefined || target === TARGETLESS_KEY) {\n return undefined;\n }\n\n return toArray(target);\n}\nfunction reportUnhandledExceptionOnInvocation(originalError, currentError, id) {\n if (!IS_PRODUCTION) {\n var originalStackTrace = originalError.stack ? \" Stacktrace was '\".concat(originalError.stack, \"'\") : '';\n\n if (originalError === currentError) {\n // tslint:disable-next-line:no-console\n console.error(\"Missing onError handler for invocation '\".concat(id, \"', error was '\").concat(originalError, \"'.\").concat(originalStackTrace));\n } else {\n var stackTrace = currentError.stack ? \" Stacktrace was '\".concat(currentError.stack, \"'\") : ''; // tslint:disable-next-line:no-console\n\n console.error(\"Missing onError handler and/or unhandled exception/promise rejection for invocation '\".concat(id, \"'. \") + \"Original error: '\".concat(originalError, \"'. \").concat(originalStackTrace, \" Current error is '\").concat(currentError, \"'.\").concat(stackTrace));\n }\n }\n}\nfunction evaluateGuard(machine, guard, context, _event, state) {\n var guards = machine.options.guards;\n var guardMeta = {\n state: state,\n cond: guard,\n _event: _event\n }; // TODO: do not hardcode!\n\n if (guard.type === DEFAULT_GUARD_TYPE) {\n return ((guards === null || guards === void 0 ? void 0 : guards[guard.name]) || guard.predicate)(context, _event.data, guardMeta);\n }\n\n var condFn = guards === null || guards === void 0 ? void 0 : guards[guard.type];\n\n if (!condFn) {\n throw new Error(\"Guard '\".concat(guard.type, \"' is not implemented on machine '\").concat(machine.id, \"'.\"));\n }\n\n return condFn(context, _event.data, guardMeta);\n}\nfunction toInvokeSource(src) {\n if (typeof src === 'string') {\n return {\n type: src\n };\n }\n\n return src;\n}\nfunction toObserver(nextHandler, errorHandler, completionHandler) {\n var noop = function () {};\n\n var isObserver = typeof nextHandler === 'object';\n var self = isObserver ? nextHandler : null;\n return {\n next: ((isObserver ? nextHandler.next : nextHandler) || noop).bind(self),\n error: ((isObserver ? nextHandler.error : errorHandler) || noop).bind(self),\n complete: ((isObserver ? nextHandler.complete : completionHandler) || noop).bind(self)\n };\n}\nfunction createInvokeId(stateNodeId, index) {\n return \"\".concat(stateNodeId, \":invocation[\").concat(index, \"]\");\n}\nfunction isRaisableAction(action) {\n return (action.type === raise || action.type === send && action.to === SpecialTargets.Internal) && typeof action.delay !== 'number';\n}\n\nexport { createInvokeId, evaluateGuard, flatten, getActionType, getEventType, interopSymbols, isActor, isArray, isBehavior, isBuiltInEvent, isFunction, isMachine, isObservable, isPromiseLike, isRaisableAction, isStateLike, isString, keys, mapContext, mapFilterValues, mapValues, matchesState, nestedPath, normalizeTarget, partition, path, pathToStateValue, pathsToStateValue, reportUnhandledExceptionOnInvocation, symbolObservable, toArray, toArrayStrict, toEventObject, toGuard, toInvokeSource, toObserver, toSCXMLEvent, toStatePath, toStatePaths, toStateValue, toTransitionConfigArray, uniqueId, updateContext, updateHistoryStates, updateHistoryValue, warn };\n","var STATE_DELIMITER = '.';\nvar EMPTY_ACTIVITY_MAP = {};\nvar DEFAULT_GUARD_TYPE = 'xstate.guard';\nvar TARGETLESS_KEY = '';\n\nexport { DEFAULT_GUARD_TYPE, EMPTY_ACTIVITY_MAP, STATE_DELIMITER, TARGETLESS_KEY };\n","var IS_PRODUCTION = process.env.NODE_ENV === 'production';\n\nexport { IS_PRODUCTION };\n","import { __assign, __spreadArray, __read, __values } from './_virtual/_tslib.js';\nimport { SpecialTargets, ActionTypes } from './types.js';\nimport { init, raise as raise$1, send as send$1, update, log as log$1, cancel as cancel$1, assign as assign$1, error as error$1, stop as stop$1, pure as pure$1, choose as choose$1 } from './actionTypes.js';\nimport * as actionTypes from './actionTypes.js';\nexport { actionTypes };\nimport { toSCXMLEvent, isString, isFunction, toEventObject, getEventType, updateContext, flatten, isArray, toArray, toGuard, evaluateGuard, warn } from './utils.js';\nimport { IS_PRODUCTION } from './environment.js';\n\nvar initEvent = /*#__PURE__*/toSCXMLEvent({\n type: init\n});\nfunction getActionFunction(actionType, actionFunctionMap) {\n return actionFunctionMap ? actionFunctionMap[actionType] || undefined : undefined;\n}\nfunction toActionObject(action, actionFunctionMap) {\n var actionObject;\n\n if (isString(action) || typeof action === 'number') {\n var exec = getActionFunction(action, actionFunctionMap);\n\n if (isFunction(exec)) {\n actionObject = {\n type: action,\n exec: exec\n };\n } else if (exec) {\n actionObject = exec;\n } else {\n actionObject = {\n type: action,\n exec: undefined\n };\n }\n } else if (isFunction(action)) {\n actionObject = {\n // Convert action to string if unnamed\n type: action.name || action.toString(),\n exec: action\n };\n } else {\n var exec = getActionFunction(action.type, actionFunctionMap);\n\n if (isFunction(exec)) {\n actionObject = __assign(__assign({}, action), {\n exec: exec\n });\n } else if (exec) {\n var actionType = exec.type || action.type;\n actionObject = __assign(__assign(__assign({}, exec), action), {\n type: actionType\n });\n } else {\n actionObject = action;\n }\n }\n\n return actionObject;\n}\nvar toActionObjects = function (action, actionFunctionMap) {\n if (!action) {\n return [];\n }\n\n var actions = isArray(action) ? action : [action];\n return actions.map(function (subAction) {\n return toActionObject(subAction, actionFunctionMap);\n });\n};\nfunction toActivityDefinition(action) {\n var actionObject = toActionObject(action);\n return __assign(__assign({\n id: isString(action) ? action : actionObject.id\n }, actionObject), {\n type: actionObject.type\n });\n}\n/**\r\n * Raises an event. This places the event in the internal event queue, so that\r\n * the event is immediately consumed by the machine in the current step.\r\n *\r\n * @param eventType The event to raise.\r\n */\n\nfunction raise(event, options) {\n return {\n type: raise$1,\n event: typeof event === 'function' ? event : toEventObject(event),\n delay: options ? options.delay : undefined,\n id: options === null || options === void 0 ? void 0 : options.id\n };\n}\nfunction resolveRaise(action, ctx, _event, delaysMap) {\n var meta = {\n _event: _event\n };\n var resolvedEvent = toSCXMLEvent(isFunction(action.event) ? action.event(ctx, _event.data, meta) : action.event);\n var resolvedDelay;\n\n if (isString(action.delay)) {\n var configDelay = delaysMap && delaysMap[action.delay];\n resolvedDelay = isFunction(configDelay) ? configDelay(ctx, _event.data, meta) : configDelay;\n } else {\n resolvedDelay = isFunction(action.delay) ? action.delay(ctx, _event.data, meta) : action.delay;\n }\n\n return __assign(__assign({}, action), {\n type: raise$1,\n _event: resolvedEvent,\n delay: resolvedDelay\n });\n}\n/**\r\n * Sends an event. This returns an action that will be read by an interpreter to\r\n * send the event in the next step, after the current step is finished executing.\r\n *\r\n * @deprecated Use the `sendTo(...)` action creator instead.\r\n *\r\n * @param event The event to send.\r\n * @param options Options to pass into the send event:\r\n * - `id` - The unique send event identifier (used with `cancel()`).\r\n * - `delay` - The number of milliseconds to delay the sending of the event.\r\n * - `to` - The target of this event (by default, the machine the event was sent from).\r\n */\n\nfunction send(event, options) {\n return {\n to: options ? options.to : undefined,\n type: send$1,\n event: isFunction(event) ? event : toEventObject(event),\n delay: options ? options.delay : undefined,\n // TODO: don't auto-generate IDs here like that\n // there is too big chance of the ID collision\n id: options && options.id !== undefined ? options.id : isFunction(event) ? event.name : getEventType(event)\n };\n}\nfunction resolveSend(action, ctx, _event, delaysMap) {\n var meta = {\n _event: _event\n }; // TODO: helper function for resolving Expr\n\n var resolvedEvent = toSCXMLEvent(isFunction(action.event) ? action.event(ctx, _event.data, meta) : action.event);\n var resolvedDelay;\n\n if (isString(action.delay)) {\n var configDelay = delaysMap && delaysMap[action.delay];\n resolvedDelay = isFunction(configDelay) ? configDelay(ctx, _event.data, meta) : configDelay;\n } else {\n resolvedDelay = isFunction(action.delay) ? action.delay(ctx, _event.data, meta) : action.delay;\n }\n\n var resolvedTarget = isFunction(action.to) ? action.to(ctx, _event.data, meta) : action.to;\n return __assign(__assign({}, action), {\n to: resolvedTarget,\n _event: resolvedEvent,\n event: resolvedEvent.data,\n delay: resolvedDelay\n });\n}\n/**\r\n * Sends an event to this machine's parent.\r\n *\r\n * @param event The event to send to the parent machine.\r\n * @param options Options to pass into the send event.\r\n */\n\nfunction sendParent(event, options) {\n return send(event, __assign(__assign({}, options), {\n to: SpecialTargets.Parent\n }));\n}\n/**\r\n * Sends an event to an actor.\r\n *\r\n * @param actor The `ActorRef` to send the event to.\r\n * @param event The event to send, or an expression that evaluates to the event to send\r\n * @param options Send action options\r\n * @returns An XState send action object\r\n */\n\nfunction sendTo(actor, event, options) {\n return send(event, __assign(__assign({}, options), {\n to: actor\n }));\n}\n/**\r\n * Sends an update event to this machine's parent.\r\n */\n\nfunction sendUpdate() {\n return sendParent(update);\n}\n/**\r\n * Sends an event back to the sender of the original event.\r\n *\r\n * @param event The event to send back to the sender\r\n * @param options Options to pass into the send event\r\n */\n\nfunction respond(event, options) {\n return send(event, __assign(__assign({}, options), {\n to: function (_, __, _a) {\n var _event = _a._event;\n return _event.origin; // TODO: handle when _event.origin is undefined\n }\n }));\n}\n\nvar defaultLogExpr = function (context, event) {\n return {\n context: context,\n event: event\n };\n};\n/**\r\n *\r\n * @param expr The expression function to evaluate which will be logged.\r\n * Takes in 2 arguments:\r\n * - `ctx` - the current state context\r\n * - `event` - the event that caused this action to be executed.\r\n * @param label The label to give to the logged expression.\r\n */\n\n\nfunction log(expr, label) {\n if (expr === void 0) {\n expr = defaultLogExpr;\n }\n\n return {\n type: log$1,\n label: label,\n expr: expr\n };\n}\nvar resolveLog = function (action, ctx, _event) {\n return __assign(__assign({}, action), {\n value: isString(action.expr) ? action.expr : action.expr(ctx, _event.data, {\n _event: _event\n })\n });\n};\n/**\r\n * Cancels an in-flight `send(...)` action. A canceled sent action will not\r\n * be executed, nor will its event be sent, unless it has already been sent\r\n * (e.g., if `cancel(...)` is called after the `send(...)` action's `delay`).\r\n *\r\n * @param sendId The `id` of the `send(...)` action to cancel.\r\n */\n\nvar cancel = function (sendId) {\n return {\n type: cancel$1,\n sendId: sendId\n };\n};\n/**\r\n * Starts an activity.\r\n *\r\n * @param activity The activity to start.\r\n */\n\nfunction start(activity) {\n var activityDef = toActivityDefinition(activity);\n return {\n type: ActionTypes.Start,\n activity: activityDef,\n exec: undefined\n };\n}\n/**\r\n * Stops an activity.\r\n *\r\n * @param actorRef The activity to stop.\r\n */\n\nfunction stop(actorRef) {\n var activity = isFunction(actorRef) ? actorRef : toActivityDefinition(actorRef);\n return {\n type: ActionTypes.Stop,\n activity: activity,\n exec: undefined\n };\n}\nfunction resolveStop(action, context, _event) {\n var actorRefOrString = isFunction(action.activity) ? action.activity(context, _event.data) : action.activity;\n var resolvedActorRef = typeof actorRefOrString === 'string' ? {\n id: actorRefOrString\n } : actorRefOrString;\n var actionObject = {\n type: ActionTypes.Stop,\n activity: resolvedActorRef\n };\n return actionObject;\n}\n/**\r\n * Updates the current context of the machine.\r\n *\r\n * @param assignment An object that represents the partial context to update.\r\n */\n\nvar assign = function (assignment) {\n return {\n type: assign$1,\n assignment: assignment\n };\n};\nfunction isActionObject(action) {\n return typeof action === 'object' && 'type' in action;\n}\n/**\r\n * Returns an event type that represents an implicit event that\r\n * is sent after the specified `delay`.\r\n *\r\n * @param delayRef The delay in milliseconds\r\n * @param id The state node ID where this event is handled\r\n */\n\nfunction after(delayRef, id) {\n var idSuffix = id ? \"#\".concat(id) : '';\n return \"\".concat(ActionTypes.After, \"(\").concat(delayRef, \")\").concat(idSuffix);\n}\n/**\r\n * Returns an event that represents that a final state node\r\n * has been reached in the parent state node.\r\n *\r\n * @param id The final state node's parent state node `id`\r\n * @param data The data to pass into the event\r\n */\n\nfunction done(id, data) {\n var type = \"\".concat(ActionTypes.DoneState, \".\").concat(id);\n var eventObject = {\n type: type,\n data: data\n };\n\n eventObject.toString = function () {\n return type;\n };\n\n return eventObject;\n}\n/**\r\n * Returns an event that represents that an invoked service has terminated.\r\n *\r\n * An invoked service is terminated when it has reached a top-level final state node,\r\n * but not when it is canceled.\r\n *\r\n * @param id The final state node ID\r\n * @param data The data to pass into the event\r\n */\n\nfunction doneInvoke(id, data) {\n var type = \"\".concat(ActionTypes.DoneInvoke, \".\").concat(id);\n var eventObject = {\n type: type,\n data: data\n };\n\n eventObject.toString = function () {\n return type;\n };\n\n return eventObject;\n}\nfunction error(id, data) {\n var type = \"\".concat(ActionTypes.ErrorPlatform, \".\").concat(id);\n var eventObject = {\n type: type,\n data: data\n };\n\n eventObject.toString = function () {\n return type;\n };\n\n return eventObject;\n}\nfunction pure(getActions) {\n return {\n type: ActionTypes.Pure,\n get: getActions\n };\n}\n/**\r\n * Forwards (sends) an event to a specified service.\r\n *\r\n * @param target The target service to forward the event to.\r\n * @param options Options to pass into the send action creator.\r\n */\n\nfunction forwardTo(target, options) {\n if (!IS_PRODUCTION && (!target || typeof target === 'function')) {\n var originalTarget_1 = target;\n\n target = function () {\n var args = [];\n\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n\n var resolvedTarget = typeof originalTarget_1 === 'function' ? originalTarget_1.apply(void 0, __spreadArray([], __read(args), false)) : originalTarget_1;\n\n if (!resolvedTarget) {\n throw new Error(\"Attempted to forward event to undefined actor. This risks an infinite loop in the sender.\");\n }\n\n return resolvedTarget;\n };\n }\n\n return send(function (_, event) {\n return event;\n }, __assign(__assign({}, options), {\n to: target\n }));\n}\n/**\r\n * Escalates an error by sending it as an event to this machine's parent.\r\n *\r\n * @param errorData The error data to send, or the expression function that\r\n * takes in the `context`, `event`, and `meta`, and returns the error data to send.\r\n * @param options Options to pass into the send action creator.\r\n */\n\nfunction escalate(errorData, options) {\n return sendParent(function (context, event, meta) {\n return {\n type: error$1,\n data: isFunction(errorData) ? errorData(context, event, meta) : errorData\n };\n }, __assign(__assign({}, options), {\n to: SpecialTargets.Parent\n }));\n}\nfunction choose(conds) {\n return {\n type: ActionTypes.Choose,\n conds: conds\n };\n}\n\nvar pluckAssigns = function (actionBlocks) {\n var e_1, _a;\n\n var assignActions = [];\n\n try {\n for (var actionBlocks_1 = __values(actionBlocks), actionBlocks_1_1 = actionBlocks_1.next(); !actionBlocks_1_1.done; actionBlocks_1_1 = actionBlocks_1.next()) {\n var block = actionBlocks_1_1.value;\n var i = 0;\n\n while (i < block.actions.length) {\n if (block.actions[i].type === assign$1) {\n assignActions.push(block.actions[i]);\n block.actions.splice(i, 1);\n continue;\n }\n\n i++;\n }\n }\n } catch (e_1_1) {\n e_1 = {\n error: e_1_1\n };\n } finally {\n try {\n if (actionBlocks_1_1 && !actionBlocks_1_1.done && (_a = actionBlocks_1.return)) _a.call(actionBlocks_1);\n } finally {\n if (e_1) throw e_1.error;\n }\n }\n\n return assignActions;\n};\n\nfunction resolveActions(machine, currentState, currentContext, _event, actionBlocks, predictableExec, preserveActionOrder) {\n if (preserveActionOrder === void 0) {\n preserveActionOrder = false;\n }\n\n var assignActions = preserveActionOrder ? [] : pluckAssigns(actionBlocks);\n var updatedContext = assignActions.length ? updateContext(currentContext, _event, assignActions, currentState) : currentContext;\n var preservedContexts = preserveActionOrder ? [currentContext] : undefined;\n var deferredToBlockEnd = [];\n\n function handleAction(blockType, actionObject) {\n var _a;\n\n switch (actionObject.type) {\n case raise$1:\n {\n var raisedAction = resolveRaise(actionObject, updatedContext, _event, machine.options.delays);\n\n if (predictableExec && typeof raisedAction.delay === 'number') {\n predictableExec(raisedAction, updatedContext, _event);\n }\n\n return raisedAction;\n }\n\n case send$1:\n var sendAction = resolveSend(actionObject, updatedContext, _event, machine.options.delays); // TODO: fix ActionTypes.Init\n\n if (!IS_PRODUCTION) {\n var configuredDelay = actionObject.delay; // warn after resolving as we can create better contextual message here\n\n warn(!isString(configuredDelay) || typeof sendAction.delay === 'number', // tslint:disable-next-line:max-line-length\n \"No delay reference for delay expression '\".concat(configuredDelay, \"' was found on machine '\").concat(machine.id, \"'\"));\n }\n\n if (predictableExec && sendAction.to !== SpecialTargets.Internal) {\n if (blockType === 'entry') {\n deferredToBlockEnd.push(sendAction);\n } else {\n predictableExec(sendAction, updatedContext, _event);\n }\n }\n\n return sendAction;\n\n case log$1:\n {\n var resolved = resolveLog(actionObject, updatedContext, _event);\n predictableExec === null || predictableExec === void 0 ? void 0 : predictableExec(resolved, updatedContext, _event);\n return resolved;\n }\n\n case choose$1:\n {\n var chooseAction = actionObject;\n var matchedActions = (_a = chooseAction.conds.find(function (condition) {\n var guard = toGuard(condition.cond, machine.options.guards);\n return !guard || evaluateGuard(machine, guard, updatedContext, _event, !predictableExec ? currentState : undefined);\n })) === null || _a === void 0 ? void 0 : _a.actions;\n\n if (!matchedActions) {\n return [];\n }\n\n var _b = __read(resolveActions(machine, currentState, updatedContext, _event, [{\n type: blockType,\n actions: toActionObjects(toArray(matchedActions), machine.options.actions)\n }], predictableExec, preserveActionOrder), 2),\n resolvedActionsFromChoose = _b[0],\n resolvedContextFromChoose = _b[1];\n\n updatedContext = resolvedContextFromChoose;\n preservedContexts === null || preservedContexts === void 0 ? void 0 : preservedContexts.push(updatedContext);\n return resolvedActionsFromChoose;\n }\n\n case pure$1:\n {\n var matchedActions = actionObject.get(updatedContext, _event.data);\n\n if (!matchedActions) {\n return [];\n }\n\n var _c = __read(resolveActions(machine, currentState, updatedContext, _event, [{\n type: blockType,\n actions: toActionObjects(toArray(matchedActions), machine.options.actions)\n }], predictableExec, preserveActionOrder), 2),\n resolvedActionsFromPure = _c[0],\n resolvedContext = _c[1];\n\n updatedContext = resolvedContext;\n preservedContexts === null || preservedContexts === void 0 ? void 0 : preservedContexts.push(updatedContext);\n return resolvedActionsFromPure;\n }\n\n case stop$1:\n {\n var resolved = resolveStop(actionObject, updatedContext, _event);\n predictableExec === null || predictableExec === void 0 ? void 0 : predictableExec(resolved, currentContext, _event);\n return resolved;\n }\n\n case assign$1:\n {\n updatedContext = updateContext(updatedContext, _event, [actionObject], !predictableExec ? currentState : undefined);\n preservedContexts === null || preservedContexts === void 0 ? void 0 : preservedContexts.push(updatedContext);\n break;\n }\n\n default:\n var resolvedActionObject = toActionObject(actionObject, machine.options.actions);\n var exec_1 = resolvedActionObject.exec;\n\n if (predictableExec) {\n predictableExec(resolvedActionObject, updatedContext, _event);\n } else if (exec_1 && preservedContexts) {\n var contextIndex_1 = preservedContexts.length - 1;\n\n var wrapped = __assign(__assign({}, resolvedActionObject), {\n exec: function (_ctx) {\n var args = [];\n\n for (var _i = 1; _i < arguments.length; _i++) {\n args[_i - 1] = arguments[_i];\n }\n\n exec_1.apply(void 0, __spreadArray([preservedContexts[contextIndex_1]], __read(args), false));\n }\n });\n\n resolvedActionObject = wrapped;\n }\n\n return resolvedActionObject;\n }\n }\n\n function processBlock(block) {\n var e_2, _a;\n\n var resolvedActions = [];\n\n try {\n for (var _b = __values(block.actions), _c = _b.next(); !_c.done; _c = _b.next()) {\n var action = _c.value;\n var resolved = handleAction(block.type, action);\n\n if (resolved) {\n resolvedActions = resolvedActions.concat(resolved);\n }\n }\n } catch (e_2_1) {\n e_2 = {\n error: e_2_1\n };\n } finally {\n try {\n if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n } finally {\n if (e_2) throw e_2.error;\n }\n }\n\n deferredToBlockEnd.forEach(function (action) {\n predictableExec(action, updatedContext, _event);\n });\n deferredToBlockEnd.length = 0;\n return resolvedActions;\n }\n\n var resolvedActions = flatten(actionBlocks.map(processBlock));\n return [resolvedActions, updatedContext];\n}\n\nexport { after, assign, cancel, choose, done, doneInvoke, error, escalate, forwardTo, getActionFunction, initEvent, isActionObject, log, pure, raise, resolveActions, resolveLog, resolveRaise, resolveSend, resolveStop, respond, send, sendParent, sendTo, sendUpdate, start, stop, toActionObject, toActionObjects, toActivityDefinition };\n","/**\r\n * Maintains a stack of the current service in scope.\r\n * This is used to provide the correct service to spawn().\r\n */\nvar serviceStack = [];\nvar provide = function (service, fn) {\n serviceStack.push(service);\n var result = fn(service);\n serviceStack.pop();\n return result;\n};\nvar consume = function (fn) {\n return fn(serviceStack[serviceStack.length - 1]);\n};\n\nexport { consume, provide };\n","import { __assign } from './_virtual/_tslib.js';\nimport { symbolObservable, toInvokeSource, mapContext, isMachine } from './utils.js';\nimport { provide } from './serviceScope.js';\n\nfunction createNullActor(id) {\n var _a;\n\n return _a = {\n id: id,\n send: function () {\n return void 0;\n },\n subscribe: function () {\n return {\n unsubscribe: function () {\n return void 0;\n }\n };\n },\n getSnapshot: function () {\n return undefined;\n },\n toJSON: function () {\n return {\n id: id\n };\n }\n }, _a[symbolObservable] = function () {\n return this;\n }, _a;\n}\n/**\r\n * Creates a deferred actor that is able to be invoked given the provided\r\n * invocation information in its `.meta` value.\r\n *\r\n * @param invokeDefinition The meta information needed to invoke the actor.\r\n */\n\nfunction createInvocableActor(invokeDefinition, machine, context, _event) {\n var _a;\n\n var invokeSrc = toInvokeSource(invokeDefinition.src);\n var serviceCreator = (_a = machine === null || machine === void 0 ? void 0 : machine.options.services) === null || _a === void 0 ? void 0 : _a[invokeSrc.type];\n var resolvedData = invokeDefinition.data ? mapContext(invokeDefinition.data, context, _event) : undefined;\n var tempActor = serviceCreator ? createDeferredActor(serviceCreator, invokeDefinition.id, resolvedData) : createNullActor(invokeDefinition.id); // @ts-ignore\n\n tempActor.meta = invokeDefinition;\n return tempActor;\n}\nfunction createDeferredActor(entity, id, data) {\n var tempActor = createNullActor(id); // @ts-ignore\n\n tempActor.deferred = true;\n\n if (isMachine(entity)) {\n // \"mute\" the existing service scope so potential spawned actors within the `.initialState` stay deferred here\n var initialState_1 = tempActor.state = provide(undefined, function () {\n return (data ? entity.withContext(data) : entity).initialState;\n });\n\n tempActor.getSnapshot = function () {\n return initialState_1;\n };\n }\n\n return tempActor;\n}\nfunction isActor(item) {\n try {\n return typeof item.send === 'function';\n } catch (e) {\n return false;\n }\n}\nfunction isSpawnedActor(item) {\n return isActor(item) && 'id' in item;\n} // TODO: refactor the return type, this could be written in a better way but it's best to avoid unneccessary breaking changes now\n\nfunction toActorRef(actorRefLike) {\n var _a;\n\n return __assign((_a = {\n subscribe: function () {\n return {\n unsubscribe: function () {\n return void 0;\n }\n };\n },\n id: 'anonymous',\n getSnapshot: function () {\n return undefined;\n }\n }, _a[symbolObservable] = function () {\n return this;\n }, _a), actorRefLike);\n}\n\nexport { createDeferredActor, createInvocableActor, createNullActor, isActor, isSpawnedActor, toActorRef };\n","import { __values, __spreadArray, __read } from './_virtual/_tslib.js';\nimport { flatten } from './utils.js';\n\nvar isLeafNode = function (stateNode) {\n return stateNode.type === 'atomic' || stateNode.type === 'final';\n};\nfunction getAllChildren(stateNode) {\n return Object.keys(stateNode.states).map(function (key) {\n return stateNode.states[key];\n });\n}\nfunction getChildren(stateNode) {\n return getAllChildren(stateNode).filter(function (sn) {\n return sn.type !== 'history';\n });\n}\nfunction getAllStateNodes(stateNode) {\n var stateNodes = [stateNode];\n\n if (isLeafNode(stateNode)) {\n return stateNodes;\n }\n\n return stateNodes.concat(flatten(getChildren(stateNode).map(getAllStateNodes)));\n}\nfunction getConfiguration(prevStateNodes, stateNodes) {\n var e_1, _a, e_2, _b, e_3, _c, e_4, _d;\n\n var prevConfiguration = new Set(prevStateNodes);\n var prevAdjList = getAdjList(prevConfiguration);\n var configuration = new Set(stateNodes);\n\n try {\n // add all ancestors\n for (var configuration_1 = __values(configuration), configuration_1_1 = configuration_1.next(); !configuration_1_1.done; configuration_1_1 = configuration_1.next()) {\n var s = configuration_1_1.value;\n var m = s.parent;\n\n while (m && !configuration.has(m)) {\n configuration.add(m);\n m = m.parent;\n }\n }\n } catch (e_1_1) {\n e_1 = {\n error: e_1_1\n };\n } finally {\n try {\n if (configuration_1_1 && !configuration_1_1.done && (_a = configuration_1.return)) _a.call(configuration_1);\n } finally {\n if (e_1) throw e_1.error;\n }\n }\n\n var adjList = getAdjList(configuration);\n\n try {\n // add descendants\n for (var configuration_2 = __values(configuration), configuration_2_1 = configuration_2.next(); !configuration_2_1.done; configuration_2_1 = configuration_2.next()) {\n var s = configuration_2_1.value; // if previously active, add existing child nodes\n\n if (s.type === 'compound' && (!adjList.get(s) || !adjList.get(s).length)) {\n if (prevAdjList.get(s)) {\n prevAdjList.get(s).forEach(function (sn) {\n return configuration.add(sn);\n });\n } else {\n s.initialStateNodes.forEach(function (sn) {\n return configuration.add(sn);\n });\n }\n } else {\n if (s.type === 'parallel') {\n try {\n for (var _e = (e_3 = void 0, __values(getChildren(s))), _f = _e.next(); !_f.done; _f = _e.next()) {\n var child = _f.value;\n\n if (!configuration.has(child)) {\n configuration.add(child);\n\n if (prevAdjList.get(child)) {\n prevAdjList.get(child).forEach(function (sn) {\n return configuration.add(sn);\n });\n } else {\n child.initialStateNodes.forEach(function (sn) {\n return configuration.add(sn);\n });\n }\n }\n }\n } catch (e_3_1) {\n e_3 = {\n error: e_3_1\n };\n } finally {\n try {\n if (_f && !_f.done && (_c = _e.return)) _c.call(_e);\n } finally {\n if (e_3) throw e_3.error;\n }\n }\n }\n }\n }\n } catch (e_2_1) {\n e_2 = {\n error: e_2_1\n };\n } finally {\n try {\n if (configuration_2_1 && !configuration_2_1.done && (_b = configuration_2.return)) _b.call(configuration_2);\n } finally {\n if (e_2) throw e_2.error;\n }\n }\n\n try {\n // add all ancestors\n for (var configuration_3 = __values(configuration), configuration_3_1 = configuration_3.next(); !configuration_3_1.done; configuration_3_1 = configuration_3.next()) {\n var s = configuration_3_1.value;\n var m = s.parent;\n\n while (m && !configuration.has(m)) {\n configuration.add(m);\n m = m.parent;\n }\n }\n } catch (e_4_1) {\n e_4 = {\n error: e_4_1\n };\n } finally {\n try {\n if (configuration_3_1 && !configuration_3_1.done && (_d = configuration_3.return)) _d.call(configuration_3);\n } finally {\n if (e_4) throw e_4.error;\n }\n }\n\n return configuration;\n}\n\nfunction getValueFromAdj(baseNode, adjList) {\n var childStateNodes = adjList.get(baseNode);\n\n if (!childStateNodes) {\n return {}; // todo: fix?\n }\n\n if (baseNode.type === 'compound') {\n var childStateNode = childStateNodes[0];\n\n if (childStateNode) {\n if (isLeafNode(childStateNode)) {\n return childStateNode.key;\n }\n } else {\n return {};\n }\n }\n\n var stateValue = {};\n childStateNodes.forEach(function (csn) {\n stateValue[csn.key] = getValueFromAdj(csn, adjList);\n });\n return stateValue;\n}\n\nfunction getAdjList(configuration) {\n var e_5, _a;\n\n var adjList = new Map();\n\n try {\n for (var configuration_4 = __values(configuration), configuration_4_1 = configuration_4.next(); !configuration_4_1.done; configuration_4_1 = configuration_4.next()) {\n var s = configuration_4_1.value;\n\n if (!adjList.has(s)) {\n adjList.set(s, []);\n }\n\n if (s.parent) {\n if (!adjList.has(s.parent)) {\n adjList.set(s.parent, []);\n }\n\n adjList.get(s.parent).push(s);\n }\n }\n } catch (e_5_1) {\n e_5 = {\n error: e_5_1\n };\n } finally {\n try {\n if (configuration_4_1 && !configuration_4_1.done && (_a = configuration_4.return)) _a.call(configuration_4);\n } finally {\n if (e_5) throw e_5.error;\n }\n }\n\n return adjList;\n}\nfunction getValue(rootNode, configuration) {\n var config = getConfiguration([rootNode], configuration);\n return getValueFromAdj(rootNode, getAdjList(config));\n}\nfunction has(iterable, item) {\n if (Array.isArray(iterable)) {\n return iterable.some(function (member) {\n return member === item;\n });\n }\n\n if (iterable instanceof Set) {\n return iterable.has(item);\n }\n\n return false; // TODO: fix\n}\nfunction nextEvents(configuration) {\n return __spreadArray([], __read(new Set(flatten(__spreadArray([], __read(configuration.map(function (sn) {\n return sn.ownEvents;\n })), false)))), false);\n}\nfunction isInFinalState(configuration, stateNode) {\n if (stateNode.type === 'compound') {\n return getChildren(stateNode).some(function (s) {\n return s.type === 'final' && has(configuration, s);\n });\n }\n\n if (stateNode.type === 'parallel') {\n return getChildren(stateNode).every(function (sn) {\n return isInFinalState(configuration, sn);\n });\n }\n\n return false;\n}\nfunction getMeta(configuration) {\n if (configuration === void 0) {\n configuration = [];\n }\n\n return configuration.reduce(function (acc, stateNode) {\n if (stateNode.meta !== undefined) {\n acc[stateNode.id] = stateNode.meta;\n }\n\n return acc;\n }, {});\n}\nfunction getTagsFromConfiguration(configuration) {\n return new Set(flatten(configuration.map(function (sn) {\n return sn.tags;\n })));\n}\n\nexport { getAdjList, getAllChildren, getAllStateNodes, getChildren, getConfiguration, getMeta, getTagsFromConfiguration, getValue, has, isInFinalState, isLeafNode, nextEvents };\n","import { __assign, __spreadArray, __read, __rest } from './_virtual/_tslib.js';\nimport { EMPTY_ACTIVITY_MAP } from './constants.js';\nimport { isString, matchesState, warn } from './utils.js';\nimport { getMeta, nextEvents } from './stateUtils.js';\nimport { initEvent } from './actions.js';\nimport { IS_PRODUCTION } from './environment.js';\n\nfunction stateValuesEqual(a, b) {\n if (a === b) {\n return true;\n }\n\n if (a === undefined || b === undefined) {\n return false;\n }\n\n if (isString(a) || isString(b)) {\n return a === b;\n }\n\n var aKeys = Object.keys(a);\n var bKeys = Object.keys(b);\n return aKeys.length === bKeys.length && aKeys.every(function (key) {\n return stateValuesEqual(a[key], b[key]);\n });\n}\nfunction isStateConfig(state) {\n if (typeof state !== 'object' || state === null) {\n return false;\n }\n\n return 'value' in state && '_event' in state;\n}\n/**\r\n * @deprecated Use `isStateConfig(object)` or `state instanceof State` instead.\r\n */\n\nvar isState = isStateConfig;\nfunction bindActionToState(action, state) {\n var exec = action.exec;\n\n var boundAction = __assign(__assign({}, action), {\n exec: exec !== undefined ? function () {\n return exec(state.context, state.event, {\n action: action,\n state: state,\n _event: state._event\n });\n } : undefined\n });\n\n return boundAction;\n}\n\nvar State =\n/*#__PURE__*/\n\n/** @class */\nfunction () {\n /**\r\n * Creates a new State instance.\r\n * @param value The state value\r\n * @param context The extended state\r\n * @param historyValue The tree representing historical values of the state nodes\r\n * @param history The previous state\r\n * @param actions An array of action objects to execute as side-effects\r\n * @param activities A mapping of activities and whether they are started (`true`) or stopped (`false`).\r\n * @param meta\r\n * @param events Internal event queue. Should be empty with run-to-completion semantics.\r\n * @param configuration\r\n */\n function State(config) {\n var _this = this;\n\n var _a;\n\n this.actions = [];\n this.activities = EMPTY_ACTIVITY_MAP;\n this.meta = {};\n this.events = [];\n this.value = config.value;\n this.context = config.context;\n this._event = config._event;\n this._sessionid = config._sessionid;\n this.event = this._event.data;\n this.historyValue = config.historyValue;\n this.history = config.history;\n this.actions = config.actions || [];\n this.activities = config.activities || EMPTY_ACTIVITY_MAP;\n this.meta = getMeta(config.configuration);\n this.events = config.events || [];\n this.matches = this.matches.bind(this);\n this.toStrings = this.toStrings.bind(this);\n this.configuration = config.configuration;\n this.transitions = config.transitions;\n this.children = config.children;\n this.done = !!config.done;\n this.tags = (_a = Array.isArray(config.tags) ? new Set(config.tags) : config.tags) !== null && _a !== void 0 ? _a : new Set();\n this.machine = config.machine;\n Object.defineProperty(this, 'nextEvents', {\n get: function () {\n return nextEvents(_this.configuration);\n }\n });\n }\n /**\r\n * Creates a new State instance for the given `stateValue` and `context`.\r\n * @param stateValue\r\n * @param context\r\n */\n\n\n State.from = function (stateValue, context) {\n if (stateValue instanceof State) {\n if (stateValue.context !== context) {\n return new State({\n value: stateValue.value,\n context: context,\n _event: stateValue._event,\n _sessionid: null,\n historyValue: stateValue.historyValue,\n history: stateValue.history,\n actions: [],\n activities: stateValue.activities,\n meta: {},\n events: [],\n configuration: [],\n transitions: [],\n children: {}\n });\n }\n\n return stateValue;\n }\n\n var _event = initEvent;\n return new State({\n value: stateValue,\n context: context,\n _event: _event,\n _sessionid: null,\n historyValue: undefined,\n history: undefined,\n actions: [],\n activities: undefined,\n meta: undefined,\n events: [],\n configuration: [],\n transitions: [],\n children: {}\n });\n };\n /**\r\n * Creates a new State instance for the given `config`.\r\n * @param config The state config\r\n */\n\n\n State.create = function (config) {\n return new State(config);\n };\n /**\r\n * Creates a new `State` instance for the given `stateValue` and `context` with no actions (side-effects).\r\n * @param stateValue\r\n * @param context\r\n */\n\n\n State.inert = function (stateValue, context) {\n if (stateValue instanceof State) {\n if (!stateValue.actions.length) {\n return stateValue;\n }\n\n var _event = initEvent;\n return new State({\n value: stateValue.value,\n context: context,\n _event: _event,\n _sessionid: null,\n historyValue: stateValue.historyValue,\n history: stateValue.history,\n activities: stateValue.activities,\n configuration: stateValue.configuration,\n transitions: [],\n children: {}\n });\n }\n\n return State.from(stateValue, context);\n };\n /**\r\n * Returns an array of all the string leaf state node paths.\r\n * @param stateValue\r\n * @param delimiter The character(s) that separate each subpath in the string state node path.\r\n */\n\n\n State.prototype.toStrings = function (stateValue, delimiter) {\n var _this = this;\n\n if (stateValue === void 0) {\n stateValue = this.value;\n }\n\n if (delimiter === void 0) {\n delimiter = '.';\n }\n\n if (isString(stateValue)) {\n return [stateValue];\n }\n\n var valueKeys = Object.keys(stateValue);\n return valueKeys.concat.apply(valueKeys, __spreadArray([], __read(valueKeys.map(function (key) {\n return _this.toStrings(stateValue[key], delimiter).map(function (s) {\n return key + delimiter + s;\n });\n })), false));\n };\n\n State.prototype.toJSON = function () {\n var _a = this;\n _a.configuration;\n _a.transitions;\n var tags = _a.tags;\n _a.machine;\n var jsonValues = __rest(_a, [\"configuration\", \"transitions\", \"tags\", \"machine\"]);\n\n return __assign(__assign({}, jsonValues), {\n tags: Array.from(tags)\n });\n };\n\n State.prototype.matches = function (parentStateValue) {\n return matchesState(parentStateValue, this.value);\n };\n /**\r\n * Whether the current state configuration has a state node with the specified `tag`.\r\n * @param tag\r\n */\n\n\n State.prototype.hasTag = function (tag) {\n return this.tags.has(tag);\n };\n /**\r\n * Determines whether sending the `event` will cause a non-forbidden transition\r\n * to be selected, even if the transitions have no actions nor\r\n * change the state value.\r\n *\r\n * @param event The event to test\r\n * @returns Whether the event will cause a transition\r\n */\n\n\n State.prototype.can = function (event) {\n var _a;\n\n if (IS_PRODUCTION) {\n warn(!!this.machine, \"state.can(...) used outside of a machine-created State object; this will always return false.\");\n }\n\n var transitionData = (_a = this.machine) === null || _a === void 0 ? void 0 : _a.getTransitionData(this, event);\n return !!(transitionData === null || transitionData === void 0 ? void 0 : transitionData.transitions.length) && // Check that at least one transition is not forbidden\n transitionData.transitions.some(function (t) {\n return t.target !== undefined || t.actions.length;\n });\n };\n\n return State;\n}();\n\nexport { State, bindActionToState, isState, isStateConfig, stateValuesEqual };\n","import { __assign } from './_virtual/_tslib.js';\n\nvar defaultOptions = {\n deferEvents: false\n};\n\nvar Scheduler =\n/*#__PURE__*/\n\n/** @class */\nfunction () {\n function Scheduler(options) {\n this.processingEvent = false;\n this.queue = [];\n this.initialized = false;\n this.options = __assign(__assign({}, defaultOptions), options);\n }\n\n Scheduler.prototype.initialize = function (callback) {\n this.initialized = true;\n\n if (callback) {\n if (!this.options.deferEvents) {\n this.schedule(callback);\n return;\n }\n\n this.process(callback);\n }\n\n this.flushEvents();\n };\n\n Scheduler.prototype.schedule = function (task) {\n if (!this.initialized || this.processingEvent) {\n this.queue.push(task);\n return;\n }\n\n if (this.queue.length !== 0) {\n throw new Error('Event queue should be empty when it is not processing events');\n }\n\n this.process(task);\n this.flushEvents();\n };\n\n Scheduler.prototype.clear = function () {\n this.queue = [];\n };\n\n Scheduler.prototype.flushEvents = function () {\n var nextCallback = this.queue.shift();\n\n while (nextCallback) {\n this.process(nextCallback);\n nextCallback = this.queue.shift();\n }\n };\n\n Scheduler.prototype.process = function (callback) {\n this.processingEvent = true;\n\n try {\n callback();\n } catch (e) {\n // there is no use to keep the future events\n // as the situation is not anymore the same\n this.clear();\n throw e;\n } finally {\n this.processingEvent = false;\n }\n };\n\n return Scheduler;\n}();\n\nexport { Scheduler };\n","var children = /*#__PURE__*/new Map();\nvar sessionIdIndex = 0;\nvar registry = {\n bookId: function () {\n return \"x:\".concat(sessionIdIndex++);\n },\n register: function (id, actor) {\n children.set(id, actor);\n return id;\n },\n get: function (id) {\n return children.get(id);\n },\n free: function (id) {\n children.delete(id);\n }\n};\n\nexport { registry };\n","import { IS_PRODUCTION } from './environment.js';\n\nfunction getGlobal() {\n if (typeof globalThis !== 'undefined') {\n return globalThis;\n }\n\n if (typeof self !== 'undefined') {\n return self;\n }\n\n if (typeof window !== 'undefined') {\n return window;\n }\n\n if (typeof global !== 'undefined') {\n return global;\n }\n\n if (!IS_PRODUCTION) {\n console.warn('XState could not find a global object in this environment. Please let the maintainers know and raise an issue here: https://github.com/statelyai/xstate/issues');\n }\n}\n\nfunction getDevTools() {\n var global = getGlobal();\n\n if (global && '__xstate__' in global) {\n return global.__xstate__;\n }\n\n return undefined;\n}\n\nfunction registerService(service) {\n if (!getGlobal()) {\n return;\n }\n\n var devTools = getDevTools();\n\n if (devTools) {\n devTools.register(service);\n }\n}\n\nexport { getGlobal, registerService };\n","import { error, doneInvoke } from './actions.js';\nimport { toActorRef } from './Actor.js';\nimport { toObserver } from './utils.js';\n\n/**\r\n * Returns an actor behavior from a reducer and its initial state.\r\n *\r\n * @param transition The pure reducer that returns the next state given the current state and event.\r\n * @param initialState The initial state of the reducer.\r\n * @returns An actor behavior\r\n */\n\nfunction fromReducer(transition, initialState) {\n return {\n transition: transition,\n initialState: initialState\n };\n}\nfunction fromPromise(promiseFn) {\n var initialState = {\n error: undefined,\n data: undefined,\n status: 'pending'\n };\n return {\n transition: function (state, event, _a) {\n var parent = _a.parent,\n id = _a.id,\n observers = _a.observers;\n\n switch (event.type) {\n case 'fulfill':\n parent === null || parent === void 0 ? void 0 : parent.send(doneInvoke(id, event.data));\n return {\n error: undefined,\n data: event.data,\n status: 'fulfilled'\n };\n\n case 'reject':\n parent === null || parent === void 0 ? void 0 : parent.send(error(id, event.error));\n observers.forEach(function (observer) {\n observer.error(event.error);\n });\n return {\n error: event.error,\n data: undefined,\n status: 'rejected'\n };\n\n default:\n return state;\n }\n },\n initialState: initialState,\n start: function (_a) {\n var self = _a.self;\n promiseFn().then(function (data) {\n self.send({\n type: 'fulfill',\n data: data\n });\n }, function (reason) {\n self.send({\n type: 'reject',\n error: reason\n });\n });\n return initialState;\n }\n };\n}\nfunction spawnBehavior(behavior, options) {\n if (options === void 0) {\n options = {};\n }\n\n var state = behavior.initialState;\n var observers = new Set();\n var mailbox = [];\n var flushing = false;\n\n var flush = function () {\n if (flushing) {\n return;\n }\n\n flushing = true;\n\n while (mailbox.length > 0) {\n var event_1 = mailbox.shift();\n state = behavior.transition(state, event_1, actorCtx);\n observers.forEach(function (observer) {\n return observer.next(state);\n });\n }\n\n flushing = false;\n };\n\n var actor = toActorRef({\n id: options.id,\n send: function (event) {\n mailbox.push(event);\n flush();\n },\n getSnapshot: function () {\n return state;\n },\n subscribe: function (next, handleError, complete) {\n var observer = toObserver(next, handleError, complete);\n observers.add(observer);\n observer.next(state);\n return {\n unsubscribe: function () {\n observers.delete(observer);\n }\n };\n }\n });\n var actorCtx = {\n parent: options.parent,\n self: actor,\n id: options.id || 'anonymous',\n observers: observers\n };\n state = behavior.start ? behavior.start(actorCtx) : state;\n return actor;\n}\n\nexport { fromPromise, fromReducer, spawnBehavior };\n","import { __values, __spreadArray, __read, __assign } from './_virtual/_tslib.js';\nimport { SpecialTargets, ActionTypes } from './types.js';\nimport { isStateConfig, State, bindActionToState } from './State.js';\nimport { errorPlatform, update, error as error$1, log, stop, start, cancel, send, raise } from './actionTypes.js';\nimport { initEvent, doneInvoke, toActionObjects, resolveActions, error, getActionFunction } from './actions.js';\nimport { IS_PRODUCTION } from './environment.js';\nimport { warn, mapContext, toObserver, isFunction, toSCXMLEvent, flatten, isRaisableAction, isPromiseLike, isObservable, isMachine, isBehavior, reportUnhandledExceptionOnInvocation, symbolObservable, isArray, toEventObject, isString, isActor, toInvokeSource, uniqueId } from './utils.js';\nimport { Scheduler } from './scheduler.js';\nimport { createDeferredActor, isSpawnedActor } from './Actor.js';\nimport { registry } from './registry.js';\nimport { getGlobal, registerService } from './devTools.js';\nimport { provide, consume } from './serviceScope.js';\nimport { spawnBehavior } from './behaviors.js';\n\nvar DEFAULT_SPAWN_OPTIONS = {\n sync: false,\n autoForward: false\n};\nvar InterpreterStatus;\n\n(function (InterpreterStatus) {\n InterpreterStatus[InterpreterStatus[\"NotStarted\"] = 0] = \"NotStarted\";\n InterpreterStatus[InterpreterStatus[\"Running\"] = 1] = \"Running\";\n InterpreterStatus[InterpreterStatus[\"Stopped\"] = 2] = \"Stopped\";\n})(InterpreterStatus || (InterpreterStatus = {}));\n\nvar Interpreter =\n/*#__PURE__*/\n\n/** @class */\nfunction () {\n /**\r\n * Creates a new Interpreter instance (i.e., service) for the given machine with the provided options, if any.\r\n *\r\n * @param machine The machine to be interpreted\r\n * @param options Interpreter options\r\n */\n function Interpreter(machine, options) {\n if (options === void 0) {\n options = Interpreter.defaultOptions;\n }\n\n var _this = this;\n\n this.machine = machine;\n this.delayedEventsMap = {};\n this.listeners = new Set();\n this.contextListeners = new Set();\n this.stopListeners = new Set();\n this.doneListeners = new Set();\n this.eventListeners = new Set();\n this.sendListeners = new Set();\n /**\r\n * Whether the service is started.\r\n */\n\n this.initialized = false;\n this.status = InterpreterStatus.NotStarted;\n this.children = new Map();\n this.forwardTo = new Set();\n this._outgoingQueue = [];\n /**\r\n * Alias for Interpreter.prototype.start\r\n */\n\n this.init = this.start;\n /**\r\n * Sends an event to the running interpreter to trigger a transition.\r\n *\r\n * An array of events (batched) can be sent as well, which will send all\r\n * batched events to the running interpreter. The listeners will be\r\n * notified only **once** when all events are processed.\r\n *\r\n * @param event The event(s) to send\r\n */\n\n this.send = function (event, payload) {\n if (isArray(event)) {\n _this.batch(event);\n\n return _this.state;\n }\n\n var _event = toSCXMLEvent(toEventObject(event, payload));\n\n if (_this.status === InterpreterStatus.Stopped) {\n // do nothing\n if (!IS_PRODUCTION) {\n warn(false, \"Event \\\"\".concat(_event.name, \"\\\" was sent to stopped service \\\"\").concat(_this.machine.id, \"\\\". This service has already reached its final state, and will not transition.\\nEvent: \").concat(JSON.stringify(_event.data)));\n }\n\n return _this.state;\n }\n\n if (_this.status !== InterpreterStatus.Running && !_this.options.deferEvents) {\n throw new Error(\"Event \\\"\".concat(_event.name, \"\\\" was sent to uninitialized service \\\"\").concat(_this.machine.id // tslint:disable-next-line:max-line-length\n , \"\\\". Make sure .start() is called for this service, or set { deferEvents: true } in the service options.\\nEvent: \").concat(JSON.stringify(_event.data)));\n }\n\n _this.scheduler.schedule(function () {\n // Forward copy of event to child actors\n _this.forward(_event);\n\n var nextState = _this._nextState(_event);\n\n _this.update(nextState, _event);\n });\n\n return _this._state; // TODO: deprecate (should return void)\n // tslint:disable-next-line:semicolon\n };\n\n this.sendTo = function (event, to, immediate) {\n var isParent = _this.parent && (to === SpecialTargets.Parent || _this.parent.id === to);\n var target = isParent ? _this.parent : isString(to) ? to === SpecialTargets.Internal ? _this : _this.children.get(to) || registry.get(to) : isActor(to) ? to : undefined;\n\n if (!target) {\n if (!isParent) {\n throw new Error(\"Unable to send event to child '\".concat(to, \"' from service '\").concat(_this.id, \"'.\"));\n } // tslint:disable-next-line:no-console\n\n\n if (!IS_PRODUCTION) {\n warn(false, \"Service '\".concat(_this.id, \"' has no parent: unable to send event \").concat(event.type));\n }\n\n return;\n }\n\n if ('machine' in target) {\n // perhaps those events should be rejected in the parent\n // but atm it doesn't have easy access to all of the information that is required to do it reliably\n if (_this.status !== InterpreterStatus.Stopped || _this.parent !== target || // we need to send events to the parent from exit handlers of a machine that reached its final state\n _this.state.done) {\n // Send SCXML events to machines\n var scxmlEvent = __assign(__assign({}, event), {\n name: event.name === error$1 ? \"\".concat(error(_this.id)) : event.name,\n origin: _this.sessionId\n });\n\n if (!immediate && _this.machine.config.predictableActionArguments) {\n _this._outgoingQueue.push([target, scxmlEvent]);\n } else {\n target.send(scxmlEvent);\n }\n }\n } else {\n // Send normal events to other targets\n if (!immediate && _this.machine.config.predictableActionArguments) {\n _this._outgoingQueue.push([target, event.data]);\n } else {\n target.send(event.data);\n }\n }\n };\n\n this._exec = function (action, context, _event, actionFunctionMap) {\n if (actionFunctionMap === void 0) {\n actionFunctionMap = _this.machine.options.actions;\n }\n\n var actionOrExec = action.exec || getActionFunction(action.type, actionFunctionMap);\n var exec = isFunction(actionOrExec) ? actionOrExec : actionOrExec ? actionOrExec.exec : action.exec;\n\n if (exec) {\n try {\n return exec(context, _event.data, !_this.machine.config.predictableActionArguments ? {\n action: action,\n state: _this.state,\n _event: _event\n } : {\n action: action,\n _event: _event\n });\n } catch (err) {\n if (_this.parent) {\n _this.parent.send({\n type: 'xstate.error',\n data: err\n });\n }\n\n throw err;\n }\n }\n\n switch (action.type) {\n case raise:\n {\n // if raise action reached the interpreter then it's a delayed one\n var sendAction_1 = action;\n\n _this.defer(sendAction_1);\n\n break;\n }\n\n case send:\n var sendAction = action;\n\n if (typeof sendAction.delay === 'number') {\n _this.defer(sendAction);\n\n return;\n } else {\n if (sendAction.to) {\n _this.sendTo(sendAction._event, sendAction.to, _event === initEvent);\n } else {\n _this.send(sendAction._event);\n }\n }\n\n break;\n\n case cancel:\n _this.cancel(action.sendId);\n\n break;\n\n case start:\n {\n if (_this.status !== InterpreterStatus.Running) {\n return;\n }\n\n var activity = action.activity; // If the activity will be stopped right after it's started\n // (such as in transient states)\n // don't bother starting the activity.\n\n if ( // in v4 with `predictableActionArguments` invokes are called eagerly when the `this.state` still points to the previous state\n !_this.machine.config.predictableActionArguments && !_this.state.activities[activity.id || activity.type]) {\n break;\n } // Invoked services\n\n\n if (activity.type === ActionTypes.Invoke) {\n var invokeSource = toInvokeSource(activity.src);\n var serviceCreator = _this.machine.options.services ? _this.machine.options.services[invokeSource.type] : undefined;\n var id = activity.id,\n data = activity.data;\n\n if (!IS_PRODUCTION) {\n warn(!('forward' in activity), // tslint:disable-next-line:max-line-length\n \"`forward` property is deprecated (found in invocation of '\".concat(activity.src, \"' in in machine '\").concat(_this.machine.id, \"'). \") + \"Please use `autoForward` instead.\");\n }\n\n var autoForward = 'autoForward' in activity ? activity.autoForward : !!activity.forward;\n\n if (!serviceCreator) {\n // tslint:disable-next-line:no-console\n if (!IS_PRODUCTION) {\n warn(false, \"No service found for invocation '\".concat(activity.src, \"' in machine '\").concat(_this.machine.id, \"'.\"));\n }\n\n return;\n }\n\n var resolvedData = data ? mapContext(data, context, _event) : undefined;\n\n if (typeof serviceCreator === 'string') {\n // TODO: warn\n return;\n }\n\n var source = isFunction(serviceCreator) ? serviceCreator(context, _event.data, {\n data: resolvedData,\n src: invokeSource,\n meta: activity.meta\n }) : serviceCreator;\n\n if (!source) {\n // TODO: warn?\n return;\n }\n\n var options = void 0;\n\n if (isMachine(source)) {\n source = resolvedData ? source.withContext(resolvedData) : source;\n options = {\n autoForward: autoForward\n };\n }\n\n _this.spawn(source, id, options);\n } else {\n _this.spawnActivity(activity);\n }\n\n break;\n }\n\n case stop:\n {\n _this.stopChild(action.activity.id);\n\n break;\n }\n\n case log:\n var _a = action,\n label = _a.label,\n value = _a.value;\n\n if (label) {\n _this.logger(label, value);\n } else {\n _this.logger(value);\n }\n\n break;\n\n default:\n if (!IS_PRODUCTION) {\n warn(false, \"No implementation found for action type '\".concat(action.type, \"'\"));\n }\n\n break;\n }\n };\n\n var resolvedOptions = __assign(__assign({}, Interpreter.defaultOptions), options);\n\n var clock = resolvedOptions.clock,\n logger = resolvedOptions.logger,\n parent = resolvedOptions.parent,\n id = resolvedOptions.id;\n var resolvedId = id !== undefined ? id : machine.id;\n this.id = resolvedId;\n this.logger = logger;\n this.clock = clock;\n this.parent = parent;\n this.options = resolvedOptions;\n this.scheduler = new Scheduler({\n deferEvents: this.options.deferEvents\n });\n this.sessionId = registry.bookId();\n }\n\n Object.defineProperty(Interpreter.prototype, \"initialState\", {\n get: function () {\n var _this = this;\n\n if (this._initialState) {\n return this._initialState;\n }\n\n return provide(this, function () {\n _this._initialState = _this.machine.initialState;\n return _this._initialState;\n });\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Interpreter.prototype, \"state\", {\n /**\r\n * @deprecated Use `.getSnapshot()` instead.\r\n */\n get: function () {\n if (!IS_PRODUCTION) {\n warn(this.status !== InterpreterStatus.NotStarted, \"Attempted to read state from uninitialized service '\".concat(this.id, \"'. Make sure the service is started first.\"));\n }\n\n return this._state;\n },\n enumerable: false,\n configurable: true\n });\n /**\r\n * Executes the actions of the given state, with that state's `context` and `event`.\r\n *\r\n * @param state The state whose actions will be executed\r\n * @param actionsConfig The action implementations to use\r\n */\n\n Interpreter.prototype.execute = function (state, actionsConfig) {\n var e_1, _a;\n\n try {\n for (var _b = __values(state.actions), _c = _b.next(); !_c.done; _c = _b.next()) {\n var action = _c.value;\n this.exec(action, state, actionsConfig);\n }\n } catch (e_1_1) {\n e_1 = {\n error: e_1_1\n };\n } finally {\n try {\n if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n } finally {\n if (e_1) throw e_1.error;\n }\n }\n };\n\n Interpreter.prototype.update = function (state, _event) {\n var e_2, _a, e_3, _b, e_4, _c, e_5, _d;\n\n var _this = this; // Attach session ID to state\n\n\n state._sessionid = this.sessionId; // Update state\n\n this._state = state; // Execute actions\n\n if ((!this.machine.config.predictableActionArguments || // this is currently required to execute initial actions as the `initialState` gets cached\n // we can't just recompute it (and execute actions while doing so) because we try to preserve identity of actors created within initial assigns\n _event === initEvent) && this.options.execute) {\n this.execute(this.state);\n } else {\n var item = void 0;\n\n while (item = this._outgoingQueue.shift()) {\n item[0].send(item[1]);\n }\n } // Update children\n\n\n this.children.forEach(function (child) {\n _this.state.children[child.id] = child;\n }); // Dev tools\n\n if (this.devTools) {\n this.devTools.send(_event.data, state);\n } // Execute listeners\n\n\n if (state.event) {\n try {\n for (var _e = __values(this.eventListeners), _f = _e.next(); !_f.done; _f = _e.next()) {\n var listener = _f.value;\n listener(state.event);\n }\n } catch (e_2_1) {\n e_2 = {\n error: e_2_1\n };\n } finally {\n try {\n if (_f && !_f.done && (_a = _e.return)) _a.call(_e);\n } finally {\n if (e_2) throw e_2.error;\n }\n }\n }\n\n try {\n for (var _g = __values(this.listeners), _h = _g.next(); !_h.done; _h = _g.next()) {\n var listener = _h.value;\n listener(state, state.event);\n }\n } catch (e_3_1) {\n e_3 = {\n error: e_3_1\n };\n } finally {\n try {\n if (_h && !_h.done && (_b = _g.return)) _b.call(_g);\n } finally {\n if (e_3) throw e_3.error;\n }\n }\n\n try {\n for (var _j = __values(this.contextListeners), _k = _j.next(); !_k.done; _k = _j.next()) {\n var contextListener = _k.value;\n contextListener(this.state.context, this.state.history ? this.state.history.context : undefined);\n }\n } catch (e_4_1) {\n e_4 = {\n error: e_4_1\n };\n } finally {\n try {\n if (_k && !_k.done && (_c = _j.return)) _c.call(_j);\n } finally {\n if (e_4) throw e_4.error;\n }\n }\n\n if (this.state.done) {\n // get final child state node\n var finalChildStateNode = state.configuration.find(function (sn) {\n return sn.type === 'final' && sn.parent === _this.machine;\n });\n var doneData = finalChildStateNode && finalChildStateNode.doneData ? mapContext(finalChildStateNode.doneData, state.context, _event) : undefined;\n this._doneEvent = doneInvoke(this.id, doneData);\n\n try {\n for (var _l = __values(this.doneListeners), _m = _l.next(); !_m.done; _m = _l.next()) {\n var listener = _m.value;\n listener(this._doneEvent);\n }\n } catch (e_5_1) {\n e_5 = {\n error: e_5_1\n };\n } finally {\n try {\n if (_m && !_m.done && (_d = _l.return)) _d.call(_l);\n } finally {\n if (e_5) throw e_5.error;\n }\n }\n\n this._stop();\n\n this._stopChildren();\n\n registry.free(this.sessionId);\n }\n };\n /*\r\n * Adds a listener that is notified whenever a state transition happens. The listener is called with\r\n * the next state and the event object that caused the state transition.\r\n *\r\n * @param listener The state listener\r\n */\n\n\n Interpreter.prototype.onTransition = function (listener) {\n this.listeners.add(listener); // Send current state to listener\n\n if (this.status === InterpreterStatus.Running) {\n listener(this.state, this.state.event);\n }\n\n return this;\n };\n\n Interpreter.prototype.subscribe = function (nextListenerOrObserver, _, // TODO: error listener\n completeListener) {\n var _this = this;\n\n var observer = toObserver(nextListenerOrObserver, _, completeListener);\n this.listeners.add(observer.next); // Send current state to listener\n\n if (this.status !== InterpreterStatus.NotStarted) {\n observer.next(this.state);\n }\n\n var completeOnce = function () {\n _this.doneListeners.delete(completeOnce);\n\n _this.stopListeners.delete(completeOnce);\n\n observer.complete();\n };\n\n if (this.status === InterpreterStatus.Stopped) {\n observer.complete();\n } else {\n this.onDone(completeOnce);\n this.onStop(completeOnce);\n }\n\n return {\n unsubscribe: function () {\n _this.listeners.delete(observer.next);\n\n _this.doneListeners.delete(completeOnce);\n\n _this.stopListeners.delete(completeOnce);\n }\n };\n };\n /**\r\n * Adds an event listener that is notified whenever an event is sent to the running interpreter.\r\n * @param listener The event listener\r\n */\n\n\n Interpreter.prototype.onEvent = function (listener) {\n this.eventListeners.add(listener);\n return this;\n };\n /**\r\n * Adds an event listener that is notified whenever a `send` event occurs.\r\n * @param listener The event listener\r\n */\n\n\n Interpreter.prototype.onSend = function (listener) {\n this.sendListeners.add(listener);\n return this;\n };\n /**\r\n * Adds a context listener that is notified whenever the state context changes.\r\n * @param listener The context listener\r\n */\n\n\n Interpreter.prototype.onChange = function (listener) {\n this.contextListeners.add(listener);\n return this;\n };\n /**\r\n * Adds a listener that is notified when the machine is stopped.\r\n * @param listener The listener\r\n */\n\n\n Interpreter.prototype.onStop = function (listener) {\n this.stopListeners.add(listener);\n return this;\n };\n /**\r\n * Adds a state listener that is notified when the statechart has reached its final state.\r\n * @param listener The state listener\r\n */\n\n\n Interpreter.prototype.onDone = function (listener) {\n if (this.status === InterpreterStatus.Stopped && this._doneEvent) {\n listener(this._doneEvent);\n } else {\n this.doneListeners.add(listener);\n }\n\n return this;\n };\n /**\r\n * Removes a listener.\r\n * @param listener The listener to remove\r\n */\n\n\n Interpreter.prototype.off = function (listener) {\n this.listeners.delete(listener);\n this.eventListeners.delete(listener);\n this.sendListeners.delete(listener);\n this.stopListeners.delete(listener);\n this.doneListeners.delete(listener);\n this.contextListeners.delete(listener);\n return this;\n };\n /**\r\n * Starts the interpreter from the given state, or the initial state.\r\n * @param initialState The state to start the statechart from\r\n */\n\n\n Interpreter.prototype.start = function (initialState) {\n var _this = this;\n\n if (this.status === InterpreterStatus.Running) {\n // Do not restart the service if it is already started\n return this;\n } // yes, it's a hack but we need the related cache to be populated for some things to work (like delayed transitions)\n // this is usually called by `machine.getInitialState` but if we rehydrate from a state we might bypass this call\n // we also don't want to call this method here as it resolves the full initial state which might involve calling assign actions\n // and that could potentially lead to some unwanted side-effects (even such as creating some rogue actors)\n\n\n this.machine._init();\n\n registry.register(this.sessionId, this);\n this.initialized = true;\n this.status = InterpreterStatus.Running;\n var resolvedState = initialState === undefined ? this.initialState : provide(this, function () {\n return isStateConfig(initialState) ? _this.machine.resolveState(initialState) : _this.machine.resolveState(State.from(initialState, _this.machine.context));\n });\n\n if (this.options.devTools) {\n this.attachDev();\n }\n\n this.scheduler.initialize(function () {\n _this.update(resolvedState, initEvent);\n });\n return this;\n };\n\n Interpreter.prototype._stopChildren = function () {\n // TODO: think about converting those to actions\n this.children.forEach(function (child) {\n if (isFunction(child.stop)) {\n child.stop();\n }\n });\n this.children.clear();\n };\n\n Interpreter.prototype._stop = function () {\n var e_6, _a, e_7, _b, e_8, _c, e_9, _d, e_10, _e;\n\n try {\n for (var _f = __values(this.listeners), _g = _f.next(); !_g.done; _g = _f.next()) {\n var listener = _g.value;\n this.listeners.delete(listener);\n }\n } catch (e_6_1) {\n e_6 = {\n error: e_6_1\n };\n } finally {\n try {\n if (_g && !_g.done && (_a = _f.return)) _a.call(_f);\n } finally {\n if (e_6) throw e_6.error;\n }\n }\n\n try {\n for (var _h = __values(this.stopListeners), _j = _h.next(); !_j.done; _j = _h.next()) {\n var listener = _j.value; // call listener, then remove\n\n listener();\n this.stopListeners.delete(listener);\n }\n } catch (e_7_1) {\n e_7 = {\n error: e_7_1\n };\n } finally {\n try {\n if (_j && !_j.done && (_b = _h.return)) _b.call(_h);\n } finally {\n if (e_7) throw e_7.error;\n }\n }\n\n try {\n for (var _k = __values(this.contextListeners), _l = _k.next(); !_l.done; _l = _k.next()) {\n var listener = _l.value;\n this.contextListeners.delete(listener);\n }\n } catch (e_8_1) {\n e_8 = {\n error: e_8_1\n };\n } finally {\n try {\n if (_l && !_l.done && (_c = _k.return)) _c.call(_k);\n } finally {\n if (e_8) throw e_8.error;\n }\n }\n\n try {\n for (var _m = __values(this.doneListeners), _o = _m.next(); !_o.done; _o = _m.next()) {\n var listener = _o.value;\n this.doneListeners.delete(listener);\n }\n } catch (e_9_1) {\n e_9 = {\n error: e_9_1\n };\n } finally {\n try {\n if (_o && !_o.done && (_d = _m.return)) _d.call(_m);\n } finally {\n if (e_9) throw e_9.error;\n }\n }\n\n if (!this.initialized) {\n // Interpreter already stopped; do nothing\n return this;\n }\n\n this.initialized = false;\n this.status = InterpreterStatus.Stopped;\n this._initialState = undefined;\n\n try {\n // we are going to stop within the current sync frame\n // so we can safely just cancel this here as nothing async should be fired anyway\n for (var _p = __values(Object.keys(this.delayedEventsMap)), _q = _p.next(); !_q.done; _q = _p.next()) {\n var key = _q.value;\n this.clock.clearTimeout(this.delayedEventsMap[key]);\n }\n } catch (e_10_1) {\n e_10 = {\n error: e_10_1\n };\n } finally {\n try {\n if (_q && !_q.done && (_e = _p.return)) _e.call(_p);\n } finally {\n if (e_10) throw e_10.error;\n }\n } // clear everything that might be enqueued\n\n\n this.scheduler.clear();\n this.scheduler = new Scheduler({\n deferEvents: this.options.deferEvents\n });\n };\n /**\r\n * Stops the interpreter and unsubscribe all listeners.\r\n *\r\n * This will also notify the `onStop` listeners.\r\n */\n\n\n Interpreter.prototype.stop = function () {\n // TODO: add warning for stopping non-root interpreters\n var _this = this; // grab the current scheduler as it will be replaced in _stop\n\n\n var scheduler = this.scheduler;\n\n this._stop(); // let what is currently processed to be finished\n\n\n scheduler.schedule(function () {\n // it feels weird to handle this here but we need to handle this even slightly \"out of band\"\n var _event = toSCXMLEvent({\n type: 'xstate.stop'\n });\n\n var nextState = provide(_this, function () {\n var exitActions = flatten(__spreadArray([], __read(_this.state.configuration), false).sort(function (a, b) {\n return b.order - a.order;\n }).map(function (stateNode) {\n return toActionObjects(stateNode.onExit, _this.machine.options.actions);\n }));\n\n var _a = __read(resolveActions(_this.machine, _this.state, _this.state.context, _event, [{\n type: 'exit',\n actions: exitActions\n }], _this.machine.config.predictableActionArguments ? _this._exec : undefined, _this.machine.config.predictableActionArguments || _this.machine.config.preserveActionOrder), 2),\n resolvedActions = _a[0],\n updatedContext = _a[1];\n\n var newState = new State({\n value: _this.state.value,\n context: updatedContext,\n _event: _event,\n _sessionid: _this.sessionId,\n historyValue: undefined,\n history: _this.state,\n actions: resolvedActions.filter(function (action) {\n return !isRaisableAction(action);\n }),\n activities: {},\n events: [],\n configuration: [],\n transitions: [],\n children: {},\n done: _this.state.done,\n tags: _this.state.tags,\n machine: _this.machine\n });\n newState.changed = true;\n return newState;\n });\n\n _this.update(nextState, _event);\n\n _this._stopChildren();\n\n registry.free(_this.sessionId);\n });\n return this;\n };\n\n Interpreter.prototype.batch = function (events) {\n var _this = this;\n\n if (this.status === InterpreterStatus.NotStarted && this.options.deferEvents) {\n // tslint:disable-next-line:no-console\n if (!IS_PRODUCTION) {\n warn(false, \"\".concat(events.length, \" event(s) were sent to uninitialized service \\\"\").concat(this.machine.id, \"\\\" and are deferred. Make sure .start() is called for this service.\\nEvent: \").concat(JSON.stringify(event)));\n }\n } else if (this.status !== InterpreterStatus.Running) {\n throw new Error( // tslint:disable-next-line:max-line-length\n \"\".concat(events.length, \" event(s) were sent to uninitialized service \\\"\").concat(this.machine.id, \"\\\". Make sure .start() is called for this service, or set { deferEvents: true } in the service options.\"));\n }\n\n if (!events.length) {\n return;\n }\n\n var exec = !!this.machine.config.predictableActionArguments && this._exec;\n this.scheduler.schedule(function () {\n var e_11, _a;\n\n var nextState = _this.state;\n var batchChanged = false;\n var batchedActions = [];\n\n var _loop_1 = function (event_1) {\n var _event = toSCXMLEvent(event_1);\n\n _this.forward(_event);\n\n nextState = provide(_this, function () {\n return _this.machine.transition(nextState, _event, undefined, exec || undefined);\n });\n batchedActions.push.apply(batchedActions, __spreadArray([], __read(_this.machine.config.predictableActionArguments ? nextState.actions : nextState.actions.map(function (a) {\n return bindActionToState(a, nextState);\n })), false));\n batchChanged = batchChanged || !!nextState.changed;\n };\n\n try {\n for (var events_1 = __values(events), events_1_1 = events_1.next(); !events_1_1.done; events_1_1 = events_1.next()) {\n var event_1 = events_1_1.value;\n\n _loop_1(event_1);\n }\n } catch (e_11_1) {\n e_11 = {\n error: e_11_1\n };\n } finally {\n try {\n if (events_1_1 && !events_1_1.done && (_a = events_1.return)) _a.call(events_1);\n } finally {\n if (e_11) throw e_11.error;\n }\n }\n\n nextState.changed = batchChanged;\n nextState.actions = batchedActions;\n\n _this.update(nextState, toSCXMLEvent(events[events.length - 1]));\n });\n };\n /**\r\n * Returns a send function bound to this interpreter instance.\r\n *\r\n * @param event The event to be sent by the sender.\r\n */\n\n\n Interpreter.prototype.sender = function (event) {\n return this.send.bind(this, event);\n };\n\n Interpreter.prototype._nextState = function (event, exec) {\n var _this = this;\n\n if (exec === void 0) {\n exec = !!this.machine.config.predictableActionArguments && this._exec;\n }\n\n var _event = toSCXMLEvent(event);\n\n if (_event.name.indexOf(errorPlatform) === 0 && !this.state.nextEvents.some(function (nextEvent) {\n return nextEvent.indexOf(errorPlatform) === 0;\n })) {\n throw _event.data.data;\n }\n\n var nextState = provide(this, function () {\n return _this.machine.transition(_this.state, _event, undefined, exec || undefined);\n });\n return nextState;\n };\n /**\r\n * Returns the next state given the interpreter's current state and the event.\r\n *\r\n * This is a pure method that does _not_ update the interpreter's state.\r\n *\r\n * @param event The event to determine the next state\r\n */\n\n\n Interpreter.prototype.nextState = function (event) {\n return this._nextState(event, false);\n };\n\n Interpreter.prototype.forward = function (event) {\n var e_12, _a;\n\n try {\n for (var _b = __values(this.forwardTo), _c = _b.next(); !_c.done; _c = _b.next()) {\n var id = _c.value;\n var child = this.children.get(id);\n\n if (!child) {\n throw new Error(\"Unable to forward event '\".concat(event, \"' from interpreter '\").concat(this.id, \"' to nonexistant child '\").concat(id, \"'.\"));\n }\n\n child.send(event);\n }\n } catch (e_12_1) {\n e_12 = {\n error: e_12_1\n };\n } finally {\n try {\n if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n } finally {\n if (e_12) throw e_12.error;\n }\n }\n };\n\n Interpreter.prototype.defer = function (sendAction) {\n var _this = this;\n\n var timerId = this.clock.setTimeout(function () {\n if ('to' in sendAction && sendAction.to) {\n _this.sendTo(sendAction._event, sendAction.to, true);\n } else {\n _this.send(sendAction._event);\n }\n }, sendAction.delay);\n\n if (sendAction.id) {\n this.delayedEventsMap[sendAction.id] = timerId;\n }\n };\n\n Interpreter.prototype.cancel = function (sendId) {\n this.clock.clearTimeout(this.delayedEventsMap[sendId]);\n delete this.delayedEventsMap[sendId];\n };\n\n Interpreter.prototype.exec = function (action, state, actionFunctionMap) {\n if (actionFunctionMap === void 0) {\n actionFunctionMap = this.machine.options.actions;\n }\n\n this._exec(action, state.context, state._event, actionFunctionMap);\n };\n\n Interpreter.prototype.removeChild = function (childId) {\n var _a;\n\n this.children.delete(childId);\n this.forwardTo.delete(childId); // this.state might not exist at the time this is called,\n // such as when a child is added then removed while initializing the state\n\n (_a = this.state) === null || _a === void 0 ? true : delete _a.children[childId];\n };\n\n Interpreter.prototype.stopChild = function (childId) {\n var child = this.children.get(childId);\n\n if (!child) {\n return;\n }\n\n this.removeChild(childId);\n\n if (isFunction(child.stop)) {\n child.stop();\n }\n };\n\n Interpreter.prototype.spawn = function (entity, name, options) {\n if (this.status !== InterpreterStatus.Running) {\n return createDeferredActor(entity, name);\n }\n\n if (isPromiseLike(entity)) {\n return this.spawnPromise(Promise.resolve(entity), name);\n } else if (isFunction(entity)) {\n return this.spawnCallback(entity, name);\n } else if (isSpawnedActor(entity)) {\n return this.spawnActor(entity, name);\n } else if (isObservable(entity)) {\n return this.spawnObservable(entity, name);\n } else if (isMachine(entity)) {\n return this.spawnMachine(entity, __assign(__assign({}, options), {\n id: name\n }));\n } else if (isBehavior(entity)) {\n return this.spawnBehavior(entity, name);\n } else {\n throw new Error(\"Unable to spawn entity \\\"\".concat(name, \"\\\" of type \\\"\").concat(typeof entity, \"\\\".\"));\n }\n };\n\n Interpreter.prototype.spawnMachine = function (machine, options) {\n var _this = this;\n\n if (options === void 0) {\n options = {};\n }\n\n var childService = new Interpreter(machine, __assign(__assign({}, this.options), {\n parent: this,\n id: options.id || machine.id\n }));\n\n var resolvedOptions = __assign(__assign({}, DEFAULT_SPAWN_OPTIONS), options);\n\n if (resolvedOptions.sync) {\n childService.onTransition(function (state) {\n _this.send(update, {\n state: state,\n id: childService.id\n });\n });\n }\n\n var actor = childService;\n this.children.set(childService.id, actor);\n\n if (resolvedOptions.autoForward) {\n this.forwardTo.add(childService.id);\n }\n\n childService.onDone(function (doneEvent) {\n _this.removeChild(childService.id);\n\n _this.send(toSCXMLEvent(doneEvent, {\n origin: childService.id\n }));\n }).start();\n return actor;\n };\n\n Interpreter.prototype.spawnBehavior = function (behavior, id) {\n var actorRef = spawnBehavior(behavior, {\n id: id,\n parent: this\n });\n this.children.set(id, actorRef);\n return actorRef;\n };\n\n Interpreter.prototype.spawnPromise = function (promise, id) {\n var _a;\n\n var _this = this;\n\n var canceled = false;\n var resolvedData;\n promise.then(function (response) {\n if (!canceled) {\n resolvedData = response;\n\n _this.removeChild(id);\n\n _this.send(toSCXMLEvent(doneInvoke(id, response), {\n origin: id\n }));\n }\n }, function (errorData) {\n if (!canceled) {\n _this.removeChild(id);\n\n var errorEvent = error(id, errorData);\n\n try {\n // Send \"error.platform.id\" to this (parent).\n _this.send(toSCXMLEvent(errorEvent, {\n origin: id\n }));\n } catch (error) {\n reportUnhandledExceptionOnInvocation(errorData, error, id);\n\n if (_this.devTools) {\n _this.devTools.send(errorEvent, _this.state);\n }\n\n if (_this.machine.strict) {\n // it would be better to always stop the state machine if unhandled\n // exception/promise rejection happens but because we don't want to\n // break existing code so enforce it on strict mode only especially so\n // because documentation says that onError is optional\n _this.stop();\n }\n }\n }\n });\n var actor = (_a = {\n id: id,\n send: function () {\n return void 0;\n },\n subscribe: function (next, handleError, complete) {\n var observer = toObserver(next, handleError, complete);\n var unsubscribed = false;\n promise.then(function (response) {\n if (unsubscribed) {\n return;\n }\n\n observer.next(response);\n\n if (unsubscribed) {\n return;\n }\n\n observer.complete();\n }, function (err) {\n if (unsubscribed) {\n return;\n }\n\n observer.error(err);\n });\n return {\n unsubscribe: function () {\n return unsubscribed = true;\n }\n };\n },\n stop: function () {\n canceled = true;\n },\n toJSON: function () {\n return {\n id: id\n };\n },\n getSnapshot: function () {\n return resolvedData;\n }\n }, _a[symbolObservable] = function () {\n return this;\n }, _a);\n this.children.set(id, actor);\n return actor;\n };\n\n Interpreter.prototype.spawnCallback = function (callback, id) {\n var _a;\n\n var _this = this;\n\n var canceled = false;\n var receivers = new Set();\n var listeners = new Set();\n var emitted;\n\n var receive = function (e) {\n emitted = e;\n listeners.forEach(function (listener) {\n return listener(e);\n });\n\n if (canceled) {\n return;\n }\n\n _this.send(toSCXMLEvent(e, {\n origin: id\n }));\n };\n\n var callbackStop;\n\n try {\n callbackStop = callback(receive, function (newListener) {\n receivers.add(newListener);\n });\n } catch (err) {\n this.send(error(id, err));\n }\n\n if (isPromiseLike(callbackStop)) {\n // it turned out to be an async function, can't reliably check this before calling `callback`\n // because transpiled async functions are not recognizable\n return this.spawnPromise(callbackStop, id);\n }\n\n var actor = (_a = {\n id: id,\n send: function (event) {\n return receivers.forEach(function (receiver) {\n return receiver(event);\n });\n },\n subscribe: function (next) {\n var observer = toObserver(next);\n listeners.add(observer.next);\n return {\n unsubscribe: function () {\n listeners.delete(observer.next);\n }\n };\n },\n stop: function () {\n canceled = true;\n\n if (isFunction(callbackStop)) {\n callbackStop();\n }\n },\n toJSON: function () {\n return {\n id: id\n };\n },\n getSnapshot: function () {\n return emitted;\n }\n }, _a[symbolObservable] = function () {\n return this;\n }, _a);\n this.children.set(id, actor);\n return actor;\n };\n\n Interpreter.prototype.spawnObservable = function (source, id) {\n var _a;\n\n var _this = this;\n\n var emitted;\n var subscription = source.subscribe(function (value) {\n emitted = value;\n\n _this.send(toSCXMLEvent(value, {\n origin: id\n }));\n }, function (err) {\n _this.removeChild(id);\n\n _this.send(toSCXMLEvent(error(id, err), {\n origin: id\n }));\n }, function () {\n _this.removeChild(id);\n\n _this.send(toSCXMLEvent(doneInvoke(id), {\n origin: id\n }));\n });\n var actor = (_a = {\n id: id,\n send: function () {\n return void 0;\n },\n subscribe: function (next, handleError, complete) {\n return source.subscribe(next, handleError, complete);\n },\n stop: function () {\n return subscription.unsubscribe();\n },\n getSnapshot: function () {\n return emitted;\n },\n toJSON: function () {\n return {\n id: id\n };\n }\n }, _a[symbolObservable] = function () {\n return this;\n }, _a);\n this.children.set(id, actor);\n return actor;\n };\n\n Interpreter.prototype.spawnActor = function (actor, name) {\n this.children.set(name, actor);\n return actor;\n };\n\n Interpreter.prototype.spawnActivity = function (activity) {\n var implementation = this.machine.options && this.machine.options.activities ? this.machine.options.activities[activity.type] : undefined;\n\n if (!implementation) {\n if (!IS_PRODUCTION) {\n warn(false, \"No implementation found for activity '\".concat(activity.type, \"'\"));\n } // tslint:disable-next-line:no-console\n\n\n return;\n } // Start implementation\n\n\n var dispose = implementation(this.state.context, activity);\n this.spawnEffect(activity.id, dispose);\n };\n\n Interpreter.prototype.spawnEffect = function (id, dispose) {\n var _a;\n\n this.children.set(id, (_a = {\n id: id,\n send: function () {\n return void 0;\n },\n subscribe: function () {\n return {\n unsubscribe: function () {\n return void 0;\n }\n };\n },\n stop: dispose || undefined,\n getSnapshot: function () {\n return undefined;\n },\n toJSON: function () {\n return {\n id: id\n };\n }\n }, _a[symbolObservable] = function () {\n return this;\n }, _a));\n };\n\n Interpreter.prototype.attachDev = function () {\n var global = getGlobal();\n\n if (this.options.devTools && global) {\n if (global.__REDUX_DEVTOOLS_EXTENSION__) {\n var devToolsOptions = typeof this.options.devTools === 'object' ? this.options.devTools : undefined;\n this.devTools = global.__REDUX_DEVTOOLS_EXTENSION__.connect(__assign(__assign({\n name: this.id,\n autoPause: true,\n stateSanitizer: function (state) {\n return {\n value: state.value,\n context: state.context,\n actions: state.actions\n };\n }\n }, devToolsOptions), {\n features: __assign({\n jump: false,\n skip: false\n }, devToolsOptions ? devToolsOptions.features : undefined)\n }), this.machine);\n this.devTools.init(this.state);\n } // add XState-specific dev tooling hook\n\n\n registerService(this);\n }\n };\n\n Interpreter.prototype.toJSON = function () {\n return {\n id: this.id\n };\n };\n\n Interpreter.prototype[symbolObservable] = function () {\n return this;\n };\n\n Interpreter.prototype.getSnapshot = function () {\n if (this.status === InterpreterStatus.NotStarted) {\n return this.initialState;\n }\n\n return this._state;\n };\n /**\r\n * The default interpreter options:\r\n *\r\n * - `clock` uses the global `setTimeout` and `clearTimeout` functions\r\n * - `logger` uses the global `console.log()` method\r\n */\n\n\n Interpreter.defaultOptions = {\n execute: true,\n deferEvents: true,\n clock: {\n setTimeout: function (fn, ms) {\n return setTimeout(fn, ms);\n },\n clearTimeout: function (id) {\n return clearTimeout(id);\n }\n },\n logger: /*#__PURE__*/console.log.bind(console),\n devTools: false\n };\n Interpreter.interpret = interpret;\n return Interpreter;\n}();\n\nvar resolveSpawnOptions = function (nameOrOptions) {\n if (isString(nameOrOptions)) {\n return __assign(__assign({}, DEFAULT_SPAWN_OPTIONS), {\n name: nameOrOptions\n });\n }\n\n return __assign(__assign(__assign({}, DEFAULT_SPAWN_OPTIONS), {\n name: uniqueId()\n }), nameOrOptions);\n};\n\nfunction spawn(entity, nameOrOptions) {\n var resolvedOptions = resolveSpawnOptions(nameOrOptions);\n return consume(function (service) {\n if (!IS_PRODUCTION) {\n var isLazyEntity = isMachine(entity) || isFunction(entity);\n warn(!!service || isLazyEntity, \"Attempted to spawn an Actor (ID: \\\"\".concat(isMachine(entity) ? entity.id : 'undefined', \"\\\") outside of a service. This will have no effect.\"));\n }\n\n if (service) {\n return service.spawn(entity, resolvedOptions.name, resolvedOptions);\n } else {\n return createDeferredActor(entity, resolvedOptions.name);\n }\n });\n}\n/**\r\n * Creates a new Interpreter instance for the given machine with the provided options, if any.\r\n *\r\n * @param machine The machine to interpret\r\n * @param options Interpreter options\r\n */\n\nfunction interpret(machine, options) {\n var interpreter = new Interpreter(machine, options);\n return interpreter;\n}\n\nexport { Interpreter, InterpreterStatus, interpret, spawn };\n","import { __assign, __rest } from './_virtual/_tslib.js';\nimport './types.js';\nimport { invoke } from './actionTypes.js';\nimport './utils.js';\nimport './environment.js';\n\nfunction toInvokeSource(src) {\n if (typeof src === 'string') {\n var simpleSrc = {\n type: src\n };\n\n simpleSrc.toString = function () {\n return src;\n }; // v4 compat - TODO: remove in v5\n\n\n return simpleSrc;\n }\n\n return src;\n}\nfunction toInvokeDefinition(invokeConfig) {\n return __assign(__assign({\n type: invoke\n }, invokeConfig), {\n toJSON: function () {\n invokeConfig.onDone;\n invokeConfig.onError;\n var invokeDef = __rest(invokeConfig, [\"onDone\", \"onError\"]);\n\n return __assign(__assign({}, invokeDef), {\n type: invoke,\n src: toInvokeSource(invokeConfig.src)\n });\n }\n });\n}\n\nexport { toInvokeDefinition, toInvokeSource };\n","import { __assign, __spreadArray, __read, __values, __rest } from './_virtual/_tslib.js';\nimport { isFunction, mapValues, isArray, flatten, toArray, toStateValue, isString, getEventType, toSCXMLEvent, matchesState, path, evaluateGuard, mapContext, isRaisableAction, pathToStateValue, isBuiltInEvent, partition, updateHistoryValue, toStatePath, mapFilterValues, warn, toStatePaths, nestedPath, normalizeTarget, toGuard, toTransitionConfigArray, isMachine, createInvokeId } from './utils.js';\nimport { State, stateValuesEqual } from './State.js';\nimport { start as start$1, stop as stop$1, invoke, update, nullEvent } from './actionTypes.js';\nimport { done, start, toActionObjects, raise, stop, resolveActions, doneInvoke, error, toActionObject, toActivityDefinition, after, send, cancel, initEvent } from './actions.js';\nimport { IS_PRODUCTION } from './environment.js';\nimport { STATE_DELIMITER } from './constants.js';\nimport { getAllStateNodes, getConfiguration, isInFinalState, getTagsFromConfiguration, has, getChildren, getValue, isLeafNode, getAllChildren } from './stateUtils.js';\nimport { createInvocableActor } from './Actor.js';\nimport { toInvokeDefinition } from './invokeUtils.js';\n\nvar NULL_EVENT = '';\nvar STATE_IDENTIFIER = '#';\nvar WILDCARD = '*';\nvar EMPTY_OBJECT = {};\n\nvar isStateId = function (str) {\n return str[0] === STATE_IDENTIFIER;\n};\n\nvar createDefaultOptions = function () {\n return {\n actions: {},\n guards: {},\n services: {},\n activities: {},\n delays: {}\n };\n};\n\nvar validateArrayifiedTransitions = function (stateNode, event, transitions) {\n var hasNonLastUnguardedTarget = transitions.slice(0, -1).some(function (transition) {\n return !('cond' in transition) && !('in' in transition) && (isString(transition.target) || isMachine(transition.target));\n });\n var eventText = event === NULL_EVENT ? 'the transient event' : \"event '\".concat(event, \"'\");\n warn(!hasNonLastUnguardedTarget, \"One or more transitions for \".concat(eventText, \" on state '\").concat(stateNode.id, \"' are unreachable. \") + \"Make sure that the default transition is the last one defined.\");\n};\n\nvar StateNode =\n/*#__PURE__*/\n\n/** @class */\nfunction () {\n function StateNode(\n /**\r\n * The raw config used to create the machine.\r\n */\n config, options,\n /**\r\n * The initial extended state\r\n */\n _context, // TODO: this is unsafe, but we're removing it in v5 anyway\n _stateInfo) {\n if (_context === void 0) {\n _context = 'context' in config ? config.context : undefined;\n }\n\n var _this = this;\n\n var _a;\n\n this.config = config;\n this._context = _context;\n /**\r\n * The order this state node appears. Corresponds to the implicit SCXML document order.\r\n */\n\n this.order = -1;\n this.__xstatenode = true;\n this.__cache = {\n events: undefined,\n relativeValue: new Map(),\n initialStateValue: undefined,\n initialState: undefined,\n on: undefined,\n transitions: undefined,\n candidates: {},\n delayedTransitions: undefined\n };\n this.idMap = {};\n this.tags = [];\n this.options = Object.assign(createDefaultOptions(), options);\n this.parent = _stateInfo === null || _stateInfo === void 0 ? void 0 : _stateInfo.parent;\n this.key = this.config.key || (_stateInfo === null || _stateInfo === void 0 ? void 0 : _stateInfo.key) || this.config.id || '(machine)';\n this.machine = this.parent ? this.parent.machine : this;\n this.path = this.parent ? this.parent.path.concat(this.key) : [];\n this.delimiter = this.config.delimiter || (this.parent ? this.parent.delimiter : STATE_DELIMITER);\n this.id = this.config.id || __spreadArray([this.machine.key], __read(this.path), false).join(this.delimiter);\n this.version = this.parent ? this.parent.version : this.config.version;\n this.type = this.config.type || (this.config.parallel ? 'parallel' : this.config.states && Object.keys(this.config.states).length ? 'compound' : this.config.history ? 'history' : 'atomic');\n this.schema = this.parent ? this.machine.schema : (_a = this.config.schema) !== null && _a !== void 0 ? _a : {};\n this.description = this.config.description;\n\n if (!IS_PRODUCTION) {\n warn(!('parallel' in this.config), \"The \\\"parallel\\\" property is deprecated and will be removed in version 4.1. \".concat(this.config.parallel ? \"Replace with `type: 'parallel'`\" : \"Use `type: '\".concat(this.type, \"'`\"), \" in the config for state node '\").concat(this.id, \"' instead.\"));\n }\n\n this.initial = this.config.initial;\n this.states = this.config.states ? mapValues(this.config.states, function (stateConfig, key) {\n var _a;\n\n var stateNode = new StateNode(stateConfig, {}, undefined, {\n parent: _this,\n key: key\n });\n Object.assign(_this.idMap, __assign((_a = {}, _a[stateNode.id] = stateNode, _a), stateNode.idMap));\n return stateNode;\n }) : EMPTY_OBJECT; // Document order\n\n var order = 0;\n\n function dfs(stateNode) {\n var e_1, _a;\n\n stateNode.order = order++;\n\n try {\n for (var _b = __values(getAllChildren(stateNode)), _c = _b.next(); !_c.done; _c = _b.next()) {\n var child = _c.value;\n dfs(child);\n }\n } catch (e_1_1) {\n e_1 = {\n error: e_1_1\n };\n } finally {\n try {\n if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n } finally {\n if (e_1) throw e_1.error;\n }\n }\n }\n\n dfs(this); // History config\n\n this.history = this.config.history === true ? 'shallow' : this.config.history || false;\n this._transient = !!this.config.always || (!this.config.on ? false : Array.isArray(this.config.on) ? this.config.on.some(function (_a) {\n var event = _a.event;\n return event === NULL_EVENT;\n }) : NULL_EVENT in this.config.on);\n this.strict = !!this.config.strict; // TODO: deprecate (entry)\n\n this.onEntry = toArray(this.config.entry || this.config.onEntry).map(function (action) {\n return toActionObject(action);\n }); // TODO: deprecate (exit)\n\n this.onExit = toArray(this.config.exit || this.config.onExit).map(function (action) {\n return toActionObject(action);\n });\n this.meta = this.config.meta;\n this.doneData = this.type === 'final' ? this.config.data : undefined;\n this.invoke = toArray(this.config.invoke).map(function (invokeConfig, i) {\n var _a, _b;\n\n if (isMachine(invokeConfig)) {\n var invokeId = createInvokeId(_this.id, i);\n _this.machine.options.services = __assign((_a = {}, _a[invokeId] = invokeConfig, _a), _this.machine.options.services);\n return toInvokeDefinition({\n src: invokeId,\n id: invokeId\n });\n } else if (isString(invokeConfig.src)) {\n var invokeId = invokeConfig.id || createInvokeId(_this.id, i);\n return toInvokeDefinition(__assign(__assign({}, invokeConfig), {\n id: invokeId,\n src: invokeConfig.src\n }));\n } else if (isMachine(invokeConfig.src) || isFunction(invokeConfig.src)) {\n var invokeId = invokeConfig.id || createInvokeId(_this.id, i);\n _this.machine.options.services = __assign((_b = {}, _b[invokeId] = invokeConfig.src, _b), _this.machine.options.services);\n return toInvokeDefinition(__assign(__assign({\n id: invokeId\n }, invokeConfig), {\n src: invokeId\n }));\n } else {\n var invokeSource = invokeConfig.src;\n return toInvokeDefinition(__assign(__assign({\n id: createInvokeId(_this.id, i)\n }, invokeConfig), {\n src: invokeSource\n }));\n }\n });\n this.activities = toArray(this.config.activities).concat(this.invoke).map(function (activity) {\n return toActivityDefinition(activity);\n });\n this.transition = this.transition.bind(this);\n this.tags = toArray(this.config.tags); // TODO: this is the real fix for initialization once\n // state node getters are deprecated\n // if (!this.parent) {\n // this._init();\n // }\n }\n\n StateNode.prototype._init = function () {\n if (this.__cache.transitions) {\n return;\n }\n\n getAllStateNodes(this).forEach(function (stateNode) {\n return stateNode.on;\n });\n };\n /**\r\n * Clones this state machine with custom options and context.\r\n *\r\n * @param options Options (actions, guards, activities, services) to recursively merge with the existing options.\r\n * @param context Custom context (will override predefined context)\r\n */\n\n\n StateNode.prototype.withConfig = function (options, context) {\n var _a = this.options,\n actions = _a.actions,\n activities = _a.activities,\n guards = _a.guards,\n services = _a.services,\n delays = _a.delays;\n return new StateNode(this.config, {\n actions: __assign(__assign({}, actions), options.actions),\n activities: __assign(__assign({}, activities), options.activities),\n guards: __assign(__assign({}, guards), options.guards),\n services: __assign(__assign({}, services), options.services),\n delays: __assign(__assign({}, delays), options.delays)\n }, context !== null && context !== void 0 ? context : this.context);\n };\n /**\r\n * Clones this state machine with custom context.\r\n *\r\n * @param context Custom context (will override predefined context, not recursive)\r\n */\n\n\n StateNode.prototype.withContext = function (context) {\n return new StateNode(this.config, this.options, context);\n };\n\n Object.defineProperty(StateNode.prototype, \"context\", {\n get: function () {\n return isFunction(this._context) ? this._context() : this._context;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(StateNode.prototype, \"definition\", {\n /**\r\n * The well-structured state node definition.\r\n */\n get: function () {\n return {\n id: this.id,\n key: this.key,\n version: this.version,\n context: this.context,\n type: this.type,\n initial: this.initial,\n history: this.history,\n states: mapValues(this.states, function (state) {\n return state.definition;\n }),\n on: this.on,\n transitions: this.transitions,\n entry: this.onEntry,\n exit: this.onExit,\n activities: this.activities || [],\n meta: this.meta,\n order: this.order || -1,\n data: this.doneData,\n invoke: this.invoke,\n description: this.description,\n tags: this.tags\n };\n },\n enumerable: false,\n configurable: true\n });\n\n StateNode.prototype.toJSON = function () {\n return this.definition;\n };\n\n Object.defineProperty(StateNode.prototype, \"on\", {\n /**\r\n * The mapping of events to transitions.\r\n */\n get: function () {\n if (this.__cache.on) {\n return this.__cache.on;\n }\n\n var transitions = this.transitions;\n return this.__cache.on = transitions.reduce(function (map, transition) {\n map[transition.eventType] = map[transition.eventType] || [];\n map[transition.eventType].push(transition);\n return map;\n }, {});\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(StateNode.prototype, \"after\", {\n get: function () {\n return this.__cache.delayedTransitions || (this.__cache.delayedTransitions = this.getDelayedTransitions(), this.__cache.delayedTransitions);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(StateNode.prototype, \"transitions\", {\n /**\r\n * All the transitions that can be taken from this state node.\r\n */\n get: function () {\n return this.__cache.transitions || (this.__cache.transitions = this.formatTransitions(), this.__cache.transitions);\n },\n enumerable: false,\n configurable: true\n });\n\n StateNode.prototype.getCandidates = function (eventName) {\n if (this.__cache.candidates[eventName]) {\n return this.__cache.candidates[eventName];\n }\n\n var transient = eventName === NULL_EVENT;\n var candidates = this.transitions.filter(function (transition) {\n var sameEventType = transition.eventType === eventName; // null events should only match against eventless transitions\n\n return transient ? sameEventType : sameEventType || transition.eventType === WILDCARD;\n });\n this.__cache.candidates[eventName] = candidates;\n return candidates;\n };\n /**\r\n * All delayed transitions from the config.\r\n */\n\n\n StateNode.prototype.getDelayedTransitions = function () {\n var _this = this;\n\n var afterConfig = this.config.after;\n\n if (!afterConfig) {\n return [];\n }\n\n var mutateEntryExit = function (delay, i) {\n var delayRef = isFunction(delay) ? \"\".concat(_this.id, \":delay[\").concat(i, \"]\") : delay;\n var eventType = after(delayRef, _this.id);\n\n _this.onEntry.push(send(eventType, {\n delay: delay\n }));\n\n _this.onExit.push(cancel(eventType));\n\n return eventType;\n };\n\n var delayedTransitions = isArray(afterConfig) ? afterConfig.map(function (transition, i) {\n var eventType = mutateEntryExit(transition.delay, i);\n return __assign(__assign({}, transition), {\n event: eventType\n });\n }) : flatten(Object.keys(afterConfig).map(function (delay, i) {\n var configTransition = afterConfig[delay];\n var resolvedTransition = isString(configTransition) ? {\n target: configTransition\n } : configTransition;\n var resolvedDelay = !isNaN(+delay) ? +delay : delay;\n var eventType = mutateEntryExit(resolvedDelay, i);\n return toArray(resolvedTransition).map(function (transition) {\n return __assign(__assign({}, transition), {\n event: eventType,\n delay: resolvedDelay\n });\n });\n }));\n return delayedTransitions.map(function (delayedTransition) {\n var delay = delayedTransition.delay;\n return __assign(__assign({}, _this.formatTransition(delayedTransition)), {\n delay: delay\n });\n });\n };\n /**\r\n * Returns the state nodes represented by the current state value.\r\n *\r\n * @param state The state value or State instance\r\n */\n\n\n StateNode.prototype.getStateNodes = function (state) {\n var _a;\n\n var _this = this;\n\n if (!state) {\n return [];\n }\n\n var stateValue = state instanceof State ? state.value : toStateValue(state, this.delimiter);\n\n if (isString(stateValue)) {\n var initialStateValue = this.getStateNode(stateValue).initial;\n return initialStateValue !== undefined ? this.getStateNodes((_a = {}, _a[stateValue] = initialStateValue, _a)) : [this, this.states[stateValue]];\n }\n\n var subStateKeys = Object.keys(stateValue);\n var subStateNodes = [this];\n subStateNodes.push.apply(subStateNodes, __spreadArray([], __read(flatten(subStateKeys.map(function (subStateKey) {\n return _this.getStateNode(subStateKey).getStateNodes(stateValue[subStateKey]);\n }))), false));\n return subStateNodes;\n };\n /**\r\n * Returns `true` if this state node explicitly handles the given event.\r\n *\r\n * @param event The event in question\r\n */\n\n\n StateNode.prototype.handles = function (event) {\n var eventType = getEventType(event);\n return this.events.includes(eventType);\n };\n /**\r\n * Resolves the given `state` to a new `State` instance relative to this machine.\r\n *\r\n * This ensures that `.events` and `.nextEvents` represent the correct values.\r\n *\r\n * @param state The state to resolve\r\n */\n\n\n StateNode.prototype.resolveState = function (state) {\n var stateFromConfig = state instanceof State ? state : State.create(state);\n var configuration = Array.from(getConfiguration([], this.getStateNodes(stateFromConfig.value)));\n return new State(__assign(__assign({}, stateFromConfig), {\n value: this.resolve(stateFromConfig.value),\n configuration: configuration,\n done: isInFinalState(configuration, this),\n tags: getTagsFromConfiguration(configuration),\n machine: this.machine\n }));\n };\n\n StateNode.prototype.transitionLeafNode = function (stateValue, state, _event) {\n var stateNode = this.getStateNode(stateValue);\n var next = stateNode.next(state, _event);\n\n if (!next || !next.transitions.length) {\n return this.next(state, _event);\n }\n\n return next;\n };\n\n StateNode.prototype.transitionCompoundNode = function (stateValue, state, _event) {\n var subStateKeys = Object.keys(stateValue);\n var stateNode = this.getStateNode(subStateKeys[0]);\n\n var next = stateNode._transition(stateValue[subStateKeys[0]], state, _event);\n\n if (!next || !next.transitions.length) {\n return this.next(state, _event);\n }\n\n return next;\n };\n\n StateNode.prototype.transitionParallelNode = function (stateValue, state, _event) {\n var e_2, _a;\n\n var transitionMap = {};\n\n try {\n for (var _b = __values(Object.keys(stateValue)), _c = _b.next(); !_c.done; _c = _b.next()) {\n var subStateKey = _c.value;\n var subStateValue = stateValue[subStateKey];\n\n if (!subStateValue) {\n continue;\n }\n\n var subStateNode = this.getStateNode(subStateKey);\n\n var next = subStateNode._transition(subStateValue, state, _event);\n\n if (next) {\n transitionMap[subStateKey] = next;\n }\n }\n } catch (e_2_1) {\n e_2 = {\n error: e_2_1\n };\n } finally {\n try {\n if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n } finally {\n if (e_2) throw e_2.error;\n }\n }\n\n var stateTransitions = Object.keys(transitionMap).map(function (key) {\n return transitionMap[key];\n });\n var enabledTransitions = flatten(stateTransitions.map(function (st) {\n return st.transitions;\n }));\n var willTransition = stateTransitions.some(function (st) {\n return st.transitions.length > 0;\n });\n\n if (!willTransition) {\n return this.next(state, _event);\n }\n\n var configuration = flatten(Object.keys(transitionMap).map(function (key) {\n return transitionMap[key].configuration;\n }));\n return {\n transitions: enabledTransitions,\n exitSet: flatten(stateTransitions.map(function (t) {\n return t.exitSet;\n })),\n configuration: configuration,\n source: state,\n actions: flatten(Object.keys(transitionMap).map(function (key) {\n return transitionMap[key].actions;\n }))\n };\n };\n\n StateNode.prototype._transition = function (stateValue, state, _event) {\n // leaf node\n if (isString(stateValue)) {\n return this.transitionLeafNode(stateValue, state, _event);\n } // hierarchical node\n\n\n if (Object.keys(stateValue).length === 1) {\n return this.transitionCompoundNode(stateValue, state, _event);\n } // orthogonal node\n\n\n return this.transitionParallelNode(stateValue, state, _event);\n };\n\n StateNode.prototype.getTransitionData = function (state, event) {\n return this._transition(state.value, state, toSCXMLEvent(event));\n };\n\n StateNode.prototype.next = function (state, _event) {\n var e_3, _a;\n\n var _this = this;\n\n var eventName = _event.name;\n var actions = [];\n var nextStateNodes = [];\n var selectedTransition;\n\n try {\n for (var _b = __values(this.getCandidates(eventName)), _c = _b.next(); !_c.done; _c = _b.next()) {\n var candidate = _c.value;\n var cond = candidate.cond,\n stateIn = candidate.in;\n var resolvedContext = state.context;\n var isInState = stateIn ? isString(stateIn) && isStateId(stateIn) ? // Check if in state by ID\n state.matches(toStateValue(this.getStateNodeById(stateIn).path, this.delimiter)) : // Check if in state by relative grandparent\n matchesState(toStateValue(stateIn, this.delimiter), path(this.path.slice(0, -2))(state.value)) : true;\n var guardPassed = false;\n\n try {\n guardPassed = !cond || evaluateGuard(this.machine, cond, resolvedContext, _event, state);\n } catch (err) {\n throw new Error(\"Unable to evaluate guard '\".concat(cond.name || cond.type, \"' in transition for event '\").concat(eventName, \"' in state node '\").concat(this.id, \"':\\n\").concat(err.message));\n }\n\n if (guardPassed && isInState) {\n if (candidate.target !== undefined) {\n nextStateNodes = candidate.target;\n }\n\n actions.push.apply(actions, __spreadArray([], __read(candidate.actions), false));\n selectedTransition = candidate;\n break;\n }\n }\n } catch (e_3_1) {\n e_3 = {\n error: e_3_1\n };\n } finally {\n try {\n if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n } finally {\n if (e_3) throw e_3.error;\n }\n }\n\n if (!selectedTransition) {\n return undefined;\n }\n\n if (!nextStateNodes.length) {\n return {\n transitions: [selectedTransition],\n exitSet: [],\n configuration: state.value ? [this] : [],\n source: state,\n actions: actions\n };\n }\n\n var allNextStateNodes = flatten(nextStateNodes.map(function (stateNode) {\n return _this.getRelativeStateNodes(stateNode, state.historyValue);\n }));\n var isInternal = !!selectedTransition.internal;\n return {\n transitions: [selectedTransition],\n exitSet: isInternal ? [] : flatten(nextStateNodes.map(function (targetNode) {\n return _this.getPotentiallyReenteringNodes(targetNode);\n })),\n configuration: allNextStateNodes,\n source: state,\n actions: actions\n };\n }; // even though the name of this function mentions reentry nodes\n // we are pushing its result into `exitSet`\n // that's because what we exit might be reentered (it's an invariant of reentrancy)\n\n\n StateNode.prototype.getPotentiallyReenteringNodes = function (targetNode) {\n if (this.order < targetNode.order) {\n return [this];\n }\n\n var nodes = [];\n var marker = this;\n var possibleAncestor = targetNode;\n\n while (marker && marker !== possibleAncestor) {\n nodes.push(marker);\n marker = marker.parent;\n }\n\n if (marker !== possibleAncestor) {\n // we never got to `possibleAncestor`, therefore the initial `marker` \"escapes\" it\n // it's in a different part of the tree so no states will be reentered for such an external transition\n return [];\n }\n\n nodes.push(possibleAncestor);\n return nodes;\n };\n\n StateNode.prototype.getActions = function (resolvedConfig, isDone, transition, currentContext, _event, prevState, predictableExec) {\n var e_4, _a, e_5, _b;\n\n var _this = this;\n\n var prevConfig = prevState ? getConfiguration([], this.getStateNodes(prevState.value)) : [];\n var entrySet = new Set();\n\n try {\n for (var _c = __values(Array.from(resolvedConfig).sort(function (a, b) {\n return a.order - b.order;\n })), _d = _c.next(); !_d.done; _d = _c.next()) {\n var sn = _d.value;\n\n if (!has(prevConfig, sn) || has(transition.exitSet, sn) || sn.parent && entrySet.has(sn.parent)) {\n entrySet.add(sn);\n }\n }\n } catch (e_4_1) {\n e_4 = {\n error: e_4_1\n };\n } finally {\n try {\n if (_d && !_d.done && (_a = _c.return)) _a.call(_c);\n } finally {\n if (e_4) throw e_4.error;\n }\n }\n\n try {\n for (var prevConfig_1 = __values(prevConfig), prevConfig_1_1 = prevConfig_1.next(); !prevConfig_1_1.done; prevConfig_1_1 = prevConfig_1.next()) {\n var sn = prevConfig_1_1.value;\n\n if (!has(resolvedConfig, sn) || has(transition.exitSet, sn.parent)) {\n transition.exitSet.push(sn);\n }\n }\n } catch (e_5_1) {\n e_5 = {\n error: e_5_1\n };\n } finally {\n try {\n if (prevConfig_1_1 && !prevConfig_1_1.done && (_b = prevConfig_1.return)) _b.call(prevConfig_1);\n } finally {\n if (e_5) throw e_5.error;\n }\n }\n\n transition.exitSet.sort(function (a, b) {\n return b.order - a.order;\n });\n var entryStates = Array.from(entrySet).sort(function (a, b) {\n return a.order - b.order;\n });\n var exitStates = new Set(transition.exitSet);\n var doneEvents = flatten(entryStates.map(function (sn) {\n var events = [];\n\n if (sn.type !== 'final') {\n return events;\n }\n\n var parent = sn.parent;\n\n if (!parent.parent) {\n return events;\n }\n\n events.push(done(sn.id, sn.doneData), // TODO: deprecate - final states should not emit done events for their own state.\n done(parent.id, sn.doneData ? mapContext(sn.doneData, currentContext, _event) : undefined));\n var grandparent = parent.parent;\n\n if (grandparent.type === 'parallel') {\n if (getChildren(grandparent).every(function (parentNode) {\n return isInFinalState(transition.configuration, parentNode);\n })) {\n events.push(done(grandparent.id));\n }\n }\n\n return events;\n }));\n var entryActions = entryStates.map(function (stateNode) {\n var entryActions = stateNode.onEntry;\n var invokeActions = stateNode.activities.map(function (activity) {\n return start(activity);\n });\n return {\n type: 'entry',\n actions: toActionObjects(predictableExec ? __spreadArray(__spreadArray([], __read(entryActions), false), __read(invokeActions), false) : __spreadArray(__spreadArray([], __read(invokeActions), false), __read(entryActions), false), _this.machine.options.actions)\n };\n }).concat({\n type: 'state_done',\n actions: doneEvents.map(function (event) {\n return raise(event);\n })\n });\n var exitActions = Array.from(exitStates).map(function (stateNode) {\n return {\n type: 'exit',\n actions: toActionObjects(__spreadArray(__spreadArray([], __read(stateNode.onExit), false), __read(stateNode.activities.map(function (activity) {\n return stop(activity);\n })), false), _this.machine.options.actions)\n };\n });\n var actions = exitActions.concat({\n type: 'transition',\n actions: toActionObjects(transition.actions, this.machine.options.actions)\n }).concat(entryActions);\n\n if (isDone) {\n var stopActions = toActionObjects(flatten(__spreadArray([], __read(resolvedConfig), false).sort(function (a, b) {\n return b.order - a.order;\n }).map(function (stateNode) {\n return stateNode.onExit;\n })), this.machine.options.actions).filter(function (action) {\n return !isRaisableAction(action);\n });\n return actions.concat({\n type: 'stop',\n actions: stopActions\n });\n }\n\n return actions;\n };\n /**\r\n * Determines the next state given the current `state` and sent `event`.\r\n *\r\n * @param state The current State instance or state value\r\n * @param event The event that was sent at the current state\r\n * @param context The current context (extended state) of the current state\r\n */\n\n\n StateNode.prototype.transition = function (state, event, context, exec) {\n if (state === void 0) {\n state = this.initialState;\n }\n\n var _event = toSCXMLEvent(event);\n\n var currentState;\n\n if (state instanceof State) {\n currentState = context === undefined ? state : this.resolveState(State.from(state, context));\n } else {\n var resolvedStateValue = isString(state) ? this.resolve(pathToStateValue(this.getResolvedPath(state))) : this.resolve(state);\n var resolvedContext = context !== null && context !== void 0 ? context : this.machine.context;\n currentState = this.resolveState(State.from(resolvedStateValue, resolvedContext));\n }\n\n if (!IS_PRODUCTION && _event.name === WILDCARD) {\n throw new Error(\"An event cannot have the wildcard type ('\".concat(WILDCARD, \"')\"));\n }\n\n if (this.strict) {\n if (!this.events.includes(_event.name) && !isBuiltInEvent(_event.name)) {\n throw new Error(\"Machine '\".concat(this.id, \"' does not accept event '\").concat(_event.name, \"'\"));\n }\n }\n\n var stateTransition = this._transition(currentState.value, currentState, _event) || {\n transitions: [],\n configuration: [],\n exitSet: [],\n source: currentState,\n actions: []\n };\n var prevConfig = getConfiguration([], this.getStateNodes(currentState.value));\n var resolvedConfig = stateTransition.configuration.length ? getConfiguration(prevConfig, stateTransition.configuration) : prevConfig;\n stateTransition.configuration = __spreadArray([], __read(resolvedConfig), false);\n return this.resolveTransition(stateTransition, currentState, currentState.context, exec, _event);\n };\n\n StateNode.prototype.resolveRaisedTransition = function (state, _event, originalEvent, predictableExec) {\n var _a;\n\n var currentActions = state.actions;\n state = this.transition(state, _event, undefined, predictableExec); // Save original event to state\n // TODO: this should be the raised event! Delete in V5 (breaking)\n\n state._event = originalEvent;\n state.event = originalEvent.data;\n\n (_a = state.actions).unshift.apply(_a, __spreadArray([], __read(currentActions), false));\n\n return state;\n };\n\n StateNode.prototype.resolveTransition = function (stateTransition, currentState, context, predictableExec, _event) {\n var e_6, _a, e_7, _b;\n\n var _this = this;\n\n if (_event === void 0) {\n _event = initEvent;\n }\n\n var configuration = stateTransition.configuration; // Transition will \"apply\" if:\n // - this is the initial state (there is no current state)\n // - OR there are transitions\n\n var willTransition = !currentState || stateTransition.transitions.length > 0;\n var resolvedConfiguration = willTransition ? stateTransition.configuration : currentState ? currentState.configuration : [];\n var isDone = isInFinalState(resolvedConfiguration, this);\n var resolvedStateValue = willTransition ? getValue(this.machine, configuration) : undefined;\n var historyValue = currentState ? currentState.historyValue ? currentState.historyValue : stateTransition.source ? this.machine.historyValue(currentState.value) : undefined : undefined;\n var actionBlocks = this.getActions(new Set(resolvedConfiguration), isDone, stateTransition, context, _event, currentState, predictableExec);\n var activities = currentState ? __assign({}, currentState.activities) : {};\n\n try {\n for (var actionBlocks_1 = __values(actionBlocks), actionBlocks_1_1 = actionBlocks_1.next(); !actionBlocks_1_1.done; actionBlocks_1_1 = actionBlocks_1.next()) {\n var block = actionBlocks_1_1.value;\n\n try {\n for (var _c = (e_7 = void 0, __values(block.actions)), _d = _c.next(); !_d.done; _d = _c.next()) {\n var action = _d.value;\n\n if (action.type === start$1) {\n activities[action.activity.id || action.activity.type] = action;\n } else if (action.type === stop$1) {\n activities[action.activity.id || action.activity.type] = false;\n }\n }\n } catch (e_7_1) {\n e_7 = {\n error: e_7_1\n };\n } finally {\n try {\n if (_d && !_d.done && (_b = _c.return)) _b.call(_c);\n } finally {\n if (e_7) throw e_7.error;\n }\n }\n }\n } catch (e_6_1) {\n e_6 = {\n error: e_6_1\n };\n } finally {\n try {\n if (actionBlocks_1_1 && !actionBlocks_1_1.done && (_a = actionBlocks_1.return)) _a.call(actionBlocks_1);\n } finally {\n if (e_6) throw e_6.error;\n }\n }\n\n var _e = __read(resolveActions(this, currentState, context, _event, actionBlocks, predictableExec, this.machine.config.predictableActionArguments || this.machine.config.preserveActionOrder), 2),\n resolvedActions = _e[0],\n updatedContext = _e[1];\n\n var _f = __read(partition(resolvedActions, isRaisableAction), 2),\n raisedEvents = _f[0],\n nonRaisedActions = _f[1];\n\n var invokeActions = resolvedActions.filter(function (action) {\n var _a;\n\n return action.type === start$1 && ((_a = action.activity) === null || _a === void 0 ? void 0 : _a.type) === invoke;\n });\n var children = invokeActions.reduce(function (acc, action) {\n acc[action.activity.id] = createInvocableActor(action.activity, _this.machine, updatedContext, _event);\n return acc;\n }, currentState ? __assign({}, currentState.children) : {});\n var nextState = new State({\n value: resolvedStateValue || currentState.value,\n context: updatedContext,\n _event: _event,\n // Persist _sessionid between states\n _sessionid: currentState ? currentState._sessionid : null,\n historyValue: resolvedStateValue ? historyValue ? updateHistoryValue(historyValue, resolvedStateValue) : undefined : currentState ? currentState.historyValue : undefined,\n history: !resolvedStateValue || stateTransition.source ? currentState : undefined,\n actions: resolvedStateValue ? nonRaisedActions : [],\n activities: resolvedStateValue ? activities : currentState ? currentState.activities : {},\n events: [],\n configuration: resolvedConfiguration,\n transitions: stateTransition.transitions,\n children: children,\n done: isDone,\n tags: getTagsFromConfiguration(resolvedConfiguration),\n machine: this\n });\n var didUpdateContext = context !== updatedContext;\n nextState.changed = _event.name === update || didUpdateContext; // Dispose of penultimate histories to prevent memory leaks\n\n var history = nextState.history;\n\n if (history) {\n delete history.history;\n } // There are transient transitions if the machine is not in a final state\n // and if some of the state nodes have transient (\"always\") transitions.\n\n\n var hasAlwaysTransitions = !isDone && (this._transient || configuration.some(function (stateNode) {\n return stateNode._transient;\n })); // If there are no enabled transitions, check if there are transient transitions.\n // If there are transient transitions, continue checking for more transitions\n // because an transient transition should be triggered even if there are no\n // enabled transitions.\n //\n // If we're already working on an transient transition then stop to prevent an infinite loop.\n //\n // Otherwise, if there are no enabled nor transient transitions, we are done.\n\n if (!willTransition && (!hasAlwaysTransitions || _event.name === NULL_EVENT)) {\n return nextState;\n }\n\n var maybeNextState = nextState;\n\n if (!isDone) {\n if (hasAlwaysTransitions) {\n maybeNextState = this.resolveRaisedTransition(maybeNextState, {\n type: nullEvent\n }, _event, predictableExec);\n }\n\n while (raisedEvents.length) {\n var raisedEvent = raisedEvents.shift();\n maybeNextState = this.resolveRaisedTransition(maybeNextState, raisedEvent._event, _event, predictableExec);\n }\n } // Detect if state changed\n\n\n var changed = maybeNextState.changed || (history ? !!maybeNextState.actions.length || didUpdateContext || typeof history.value !== typeof maybeNextState.value || !stateValuesEqual(maybeNextState.value, history.value) : undefined);\n maybeNextState.changed = changed; // Preserve original history after raised events\n\n maybeNextState.history = history;\n return maybeNextState;\n };\n /**\r\n * Returns the child state node from its relative `stateKey`, or throws.\r\n */\n\n\n StateNode.prototype.getStateNode = function (stateKey) {\n if (isStateId(stateKey)) {\n return this.machine.getStateNodeById(stateKey);\n }\n\n if (!this.states) {\n throw new Error(\"Unable to retrieve child state '\".concat(stateKey, \"' from '\").concat(this.id, \"'; no child states exist.\"));\n }\n\n var result = this.states[stateKey];\n\n if (!result) {\n throw new Error(\"Child state '\".concat(stateKey, \"' does not exist on '\").concat(this.id, \"'\"));\n }\n\n return result;\n };\n /**\r\n * Returns the state node with the given `stateId`, or throws.\r\n *\r\n * @param stateId The state ID. The prefix \"#\" is removed.\r\n */\n\n\n StateNode.prototype.getStateNodeById = function (stateId) {\n var resolvedStateId = isStateId(stateId) ? stateId.slice(STATE_IDENTIFIER.length) : stateId;\n\n if (resolvedStateId === this.id) {\n return this;\n }\n\n var stateNode = this.machine.idMap[resolvedStateId];\n\n if (!stateNode) {\n throw new Error(\"Child state node '#\".concat(resolvedStateId, \"' does not exist on machine '\").concat(this.id, \"'\"));\n }\n\n return stateNode;\n };\n /**\r\n * Returns the relative state node from the given `statePath`, or throws.\r\n *\r\n * @param statePath The string or string array relative path to the state node.\r\n */\n\n\n StateNode.prototype.getStateNodeByPath = function (statePath) {\n if (typeof statePath === 'string' && isStateId(statePath)) {\n try {\n return this.getStateNodeById(statePath.slice(1));\n } catch (e) {// try individual paths\n // throw e;\n }\n }\n\n var arrayStatePath = toStatePath(statePath, this.delimiter).slice();\n var currentStateNode = this;\n\n while (arrayStatePath.length) {\n var key = arrayStatePath.shift();\n\n if (!key.length) {\n break;\n }\n\n currentStateNode = currentStateNode.getStateNode(key);\n }\n\n return currentStateNode;\n };\n /**\r\n * Resolves a partial state value with its full representation in this machine.\r\n *\r\n * @param stateValue The partial state value to resolve.\r\n */\n\n\n StateNode.prototype.resolve = function (stateValue) {\n var _a;\n\n var _this = this;\n\n if (!stateValue) {\n return this.initialStateValue || EMPTY_OBJECT; // TODO: type-specific properties\n }\n\n switch (this.type) {\n case 'parallel':\n return mapValues(this.initialStateValue, function (subStateValue, subStateKey) {\n return subStateValue ? _this.getStateNode(subStateKey).resolve(stateValue[subStateKey] || subStateValue) : EMPTY_OBJECT;\n });\n\n case 'compound':\n if (isString(stateValue)) {\n var subStateNode = this.getStateNode(stateValue);\n\n if (subStateNode.type === 'parallel' || subStateNode.type === 'compound') {\n return _a = {}, _a[stateValue] = subStateNode.initialStateValue, _a;\n }\n\n return stateValue;\n }\n\n if (!Object.keys(stateValue).length) {\n return this.initialStateValue || {};\n }\n\n return mapValues(stateValue, function (subStateValue, subStateKey) {\n return subStateValue ? _this.getStateNode(subStateKey).resolve(subStateValue) : EMPTY_OBJECT;\n });\n\n default:\n return stateValue || EMPTY_OBJECT;\n }\n };\n\n StateNode.prototype.getResolvedPath = function (stateIdentifier) {\n if (isStateId(stateIdentifier)) {\n var stateNode = this.machine.idMap[stateIdentifier.slice(STATE_IDENTIFIER.length)];\n\n if (!stateNode) {\n throw new Error(\"Unable to find state node '\".concat(stateIdentifier, \"'\"));\n }\n\n return stateNode.path;\n }\n\n return toStatePath(stateIdentifier, this.delimiter);\n };\n\n Object.defineProperty(StateNode.prototype, \"initialStateValue\", {\n get: function () {\n var _a;\n\n if (this.__cache.initialStateValue) {\n return this.__cache.initialStateValue;\n }\n\n var initialStateValue;\n\n if (this.type === 'parallel') {\n initialStateValue = mapFilterValues(this.states, function (state) {\n return state.initialStateValue || EMPTY_OBJECT;\n }, function (stateNode) {\n return !(stateNode.type === 'history');\n });\n } else if (this.initial !== undefined) {\n if (!this.states[this.initial]) {\n throw new Error(\"Initial state '\".concat(this.initial, \"' not found on '\").concat(this.key, \"'\"));\n }\n\n initialStateValue = isLeafNode(this.states[this.initial]) ? this.initial : (_a = {}, _a[this.initial] = this.states[this.initial].initialStateValue, _a);\n } else {\n // The finite state value of a machine without child states is just an empty object\n initialStateValue = {};\n }\n\n this.__cache.initialStateValue = initialStateValue;\n return this.__cache.initialStateValue;\n },\n enumerable: false,\n configurable: true\n });\n\n StateNode.prototype.getInitialState = function (stateValue, context) {\n this._init(); // TODO: this should be in the constructor (see note in constructor)\n\n\n var configuration = this.getStateNodes(stateValue);\n return this.resolveTransition({\n configuration: configuration,\n exitSet: [],\n transitions: [],\n source: undefined,\n actions: []\n }, undefined, context !== null && context !== void 0 ? context : this.machine.context, undefined);\n };\n\n Object.defineProperty(StateNode.prototype, \"initialState\", {\n /**\r\n * The initial State instance, which includes all actions to be executed from\r\n * entering the initial state.\r\n */\n get: function () {\n var initialStateValue = this.initialStateValue;\n\n if (!initialStateValue) {\n throw new Error(\"Cannot retrieve initial state from simple state '\".concat(this.id, \"'.\"));\n }\n\n return this.getInitialState(initialStateValue);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(StateNode.prototype, \"target\", {\n /**\r\n * The target state value of the history state node, if it exists. This represents the\r\n * default state value to transition to if no history value exists yet.\r\n */\n get: function () {\n var target;\n\n if (this.type === 'history') {\n var historyConfig = this.config;\n\n if (isString(historyConfig.target)) {\n target = isStateId(historyConfig.target) ? pathToStateValue(this.machine.getStateNodeById(historyConfig.target).path.slice(this.path.length - 1)) : historyConfig.target;\n } else {\n target = historyConfig.target;\n }\n }\n\n return target;\n },\n enumerable: false,\n configurable: true\n });\n /**\r\n * Returns the leaf nodes from a state path relative to this state node.\r\n *\r\n * @param relativeStateId The relative state path to retrieve the state nodes\r\n * @param history The previous state to retrieve history\r\n * @param resolve Whether state nodes should resolve to initial child state nodes\r\n */\n\n StateNode.prototype.getRelativeStateNodes = function (relativeStateId, historyValue, resolve) {\n if (resolve === void 0) {\n resolve = true;\n }\n\n return resolve ? relativeStateId.type === 'history' ? relativeStateId.resolveHistory(historyValue) : relativeStateId.initialStateNodes : [relativeStateId];\n };\n\n Object.defineProperty(StateNode.prototype, \"initialStateNodes\", {\n get: function () {\n var _this = this;\n\n if (isLeafNode(this)) {\n return [this];\n } // Case when state node is compound but no initial state is defined\n\n\n if (this.type === 'compound' && !this.initial) {\n if (!IS_PRODUCTION) {\n warn(false, \"Compound state node '\".concat(this.id, \"' has no initial state.\"));\n }\n\n return [this];\n }\n\n var initialStateNodePaths = toStatePaths(this.initialStateValue);\n return flatten(initialStateNodePaths.map(function (initialPath) {\n return _this.getFromRelativePath(initialPath);\n }));\n },\n enumerable: false,\n configurable: true\n });\n /**\r\n * Retrieves state nodes from a relative path to this state node.\r\n *\r\n * @param relativePath The relative path from this state node\r\n * @param historyValue\r\n */\n\n StateNode.prototype.getFromRelativePath = function (relativePath) {\n if (!relativePath.length) {\n return [this];\n }\n\n var _a = __read(relativePath),\n stateKey = _a[0],\n childStatePath = _a.slice(1);\n\n if (!this.states) {\n throw new Error(\"Cannot retrieve subPath '\".concat(stateKey, \"' from node with no states\"));\n }\n\n var childStateNode = this.getStateNode(stateKey);\n\n if (childStateNode.type === 'history') {\n return childStateNode.resolveHistory();\n }\n\n if (!this.states[stateKey]) {\n throw new Error(\"Child state '\".concat(stateKey, \"' does not exist on '\").concat(this.id, \"'\"));\n }\n\n return this.states[stateKey].getFromRelativePath(childStatePath);\n };\n\n StateNode.prototype.historyValue = function (relativeStateValue) {\n if (!Object.keys(this.states).length) {\n return undefined;\n }\n\n return {\n current: relativeStateValue || this.initialStateValue,\n states: mapFilterValues(this.states, function (stateNode, key) {\n if (!relativeStateValue) {\n return stateNode.historyValue();\n }\n\n var subStateValue = isString(relativeStateValue) ? undefined : relativeStateValue[key];\n return stateNode.historyValue(subStateValue || stateNode.initialStateValue);\n }, function (stateNode) {\n return !stateNode.history;\n })\n };\n };\n /**\r\n * Resolves to the historical value(s) of the parent state node,\r\n * represented by state nodes.\r\n *\r\n * @param historyValue\r\n */\n\n\n StateNode.prototype.resolveHistory = function (historyValue) {\n var _this = this;\n\n if (this.type !== 'history') {\n return [this];\n }\n\n var parent = this.parent;\n\n if (!historyValue) {\n var historyTarget = this.target;\n return historyTarget ? flatten(toStatePaths(historyTarget).map(function (relativeChildPath) {\n return parent.getFromRelativePath(relativeChildPath);\n })) : parent.initialStateNodes;\n }\n\n var subHistoryValue = nestedPath(parent.path, 'states')(historyValue).current;\n\n if (isString(subHistoryValue)) {\n return [parent.getStateNode(subHistoryValue)];\n }\n\n return flatten(toStatePaths(subHistoryValue).map(function (subStatePath) {\n return _this.history === 'deep' ? parent.getFromRelativePath(subStatePath) : [parent.states[subStatePath[0]]];\n }));\n };\n\n Object.defineProperty(StateNode.prototype, \"stateIds\", {\n /**\r\n * All the state node IDs of this state node and its descendant state nodes.\r\n */\n get: function () {\n var _this = this;\n\n var childStateIds = flatten(Object.keys(this.states).map(function (stateKey) {\n return _this.states[stateKey].stateIds;\n }));\n return [this.id].concat(childStateIds);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(StateNode.prototype, \"events\", {\n /**\r\n * All the event types accepted by this state node and its descendants.\r\n */\n get: function () {\n var e_8, _a, e_9, _b;\n\n if (this.__cache.events) {\n return this.__cache.events;\n }\n\n var states = this.states;\n var events = new Set(this.ownEvents);\n\n if (states) {\n try {\n for (var _c = __values(Object.keys(states)), _d = _c.next(); !_d.done; _d = _c.next()) {\n var stateId = _d.value;\n var state = states[stateId];\n\n if (state.states) {\n try {\n for (var _e = (e_9 = void 0, __values(state.events)), _f = _e.next(); !_f.done; _f = _e.next()) {\n var event_1 = _f.value;\n events.add(\"\".concat(event_1));\n }\n } catch (e_9_1) {\n e_9 = {\n error: e_9_1\n };\n } finally {\n try {\n if (_f && !_f.done && (_b = _e.return)) _b.call(_e);\n } finally {\n if (e_9) throw e_9.error;\n }\n }\n }\n }\n } catch (e_8_1) {\n e_8 = {\n error: e_8_1\n };\n } finally {\n try {\n if (_d && !_d.done && (_a = _c.return)) _a.call(_c);\n } finally {\n if (e_8) throw e_8.error;\n }\n }\n }\n\n return this.__cache.events = Array.from(events);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(StateNode.prototype, \"ownEvents\", {\n /**\r\n * All the events that have transitions directly from this state node.\r\n *\r\n * Excludes any inert events.\r\n */\n get: function () {\n var events = new Set(this.transitions.filter(function (transition) {\n return !(!transition.target && !transition.actions.length && transition.internal);\n }).map(function (transition) {\n return transition.eventType;\n }));\n return Array.from(events);\n },\n enumerable: false,\n configurable: true\n });\n\n StateNode.prototype.resolveTarget = function (_target) {\n var _this = this;\n\n if (_target === undefined) {\n // an undefined target signals that the state node should not transition from that state when receiving that event\n return undefined;\n }\n\n return _target.map(function (target) {\n if (!isString(target)) {\n return target;\n }\n\n var isInternalTarget = target[0] === _this.delimiter; // If internal target is defined on machine,\n // do not include machine key on target\n\n if (isInternalTarget && !_this.parent) {\n return _this.getStateNodeByPath(target.slice(1));\n }\n\n var resolvedTarget = isInternalTarget ? _this.key + target : target;\n\n if (_this.parent) {\n try {\n var targetStateNode = _this.parent.getStateNodeByPath(resolvedTarget);\n\n return targetStateNode;\n } catch (err) {\n throw new Error(\"Invalid transition definition for state node '\".concat(_this.id, \"':\\n\").concat(err.message));\n }\n } else {\n return _this.getStateNodeByPath(resolvedTarget);\n }\n });\n };\n\n StateNode.prototype.formatTransition = function (transitionConfig) {\n var _this = this;\n\n var normalizedTarget = normalizeTarget(transitionConfig.target);\n var internal = 'internal' in transitionConfig ? transitionConfig.internal : normalizedTarget ? normalizedTarget.some(function (_target) {\n return isString(_target) && _target[0] === _this.delimiter;\n }) : true;\n var guards = this.machine.options.guards;\n var target = this.resolveTarget(normalizedTarget);\n\n var transition = __assign(__assign({}, transitionConfig), {\n actions: toActionObjects(toArray(transitionConfig.actions)),\n cond: toGuard(transitionConfig.cond, guards),\n target: target,\n source: this,\n internal: internal,\n eventType: transitionConfig.event,\n toJSON: function () {\n return __assign(__assign({}, transition), {\n target: transition.target ? transition.target.map(function (t) {\n return \"#\".concat(t.id);\n }) : undefined,\n source: \"#\".concat(_this.id)\n });\n }\n });\n\n return transition;\n };\n\n StateNode.prototype.formatTransitions = function () {\n var e_10, _a;\n\n var _this = this;\n\n var onConfig;\n\n if (!this.config.on) {\n onConfig = [];\n } else if (Array.isArray(this.config.on)) {\n onConfig = this.config.on;\n } else {\n var _b = this.config.on,\n _c = WILDCARD,\n _d = _b[_c],\n wildcardConfigs = _d === void 0 ? [] : _d,\n strictTransitionConfigs_1 = __rest(_b, [typeof _c === \"symbol\" ? _c : _c + \"\"]);\n\n onConfig = flatten(Object.keys(strictTransitionConfigs_1).map(function (key) {\n if (!IS_PRODUCTION && key === NULL_EVENT) {\n warn(false, \"Empty string transition configs (e.g., `{ on: { '': ... }}`) for transient transitions are deprecated. Specify the transition in the `{ always: ... }` property instead. \" + \"Please check the `on` configuration for \\\"#\".concat(_this.id, \"\\\".\"));\n }\n\n var transitionConfigArray = toTransitionConfigArray(key, strictTransitionConfigs_1[key]);\n\n if (!IS_PRODUCTION) {\n validateArrayifiedTransitions(_this, key, transitionConfigArray);\n }\n\n return transitionConfigArray;\n }).concat(toTransitionConfigArray(WILDCARD, wildcardConfigs)));\n }\n\n var eventlessConfig = this.config.always ? toTransitionConfigArray('', this.config.always) : [];\n var doneConfig = this.config.onDone ? toTransitionConfigArray(String(done(this.id)), this.config.onDone) : [];\n\n if (!IS_PRODUCTION) {\n warn(!(this.config.onDone && !this.parent), \"Root nodes cannot have an \\\".onDone\\\" transition. Please check the config of \\\"\".concat(this.id, \"\\\".\"));\n }\n\n var invokeConfig = flatten(this.invoke.map(function (invokeDef) {\n var settleTransitions = [];\n\n if (invokeDef.onDone) {\n settleTransitions.push.apply(settleTransitions, __spreadArray([], __read(toTransitionConfigArray(String(doneInvoke(invokeDef.id)), invokeDef.onDone)), false));\n }\n\n if (invokeDef.onError) {\n settleTransitions.push.apply(settleTransitions, __spreadArray([], __read(toTransitionConfigArray(String(error(invokeDef.id)), invokeDef.onError)), false));\n }\n\n return settleTransitions;\n }));\n var delayedTransitions = this.after;\n var formattedTransitions = flatten(__spreadArray(__spreadArray(__spreadArray(__spreadArray([], __read(doneConfig), false), __read(invokeConfig), false), __read(onConfig), false), __read(eventlessConfig), false).map(function (transitionConfig) {\n return toArray(transitionConfig).map(function (transition) {\n return _this.formatTransition(transition);\n });\n }));\n\n try {\n for (var delayedTransitions_1 = __values(delayedTransitions), delayedTransitions_1_1 = delayedTransitions_1.next(); !delayedTransitions_1_1.done; delayedTransitions_1_1 = delayedTransitions_1.next()) {\n var delayedTransition = delayedTransitions_1_1.value;\n formattedTransitions.push(delayedTransition);\n }\n } catch (e_10_1) {\n e_10 = {\n error: e_10_1\n };\n } finally {\n try {\n if (delayedTransitions_1_1 && !delayedTransitions_1_1.done && (_a = delayedTransitions_1.return)) _a.call(delayedTransitions_1);\n } finally {\n if (e_10) throw e_10.error;\n }\n }\n\n return formattedTransitions;\n };\n\n return StateNode;\n}();\n\nexport { StateNode };\n","import { StateNode } from './StateNode.js';\nimport { IS_PRODUCTION } from './environment.js';\n\nvar warned = false;\nfunction Machine(config, options, initialContext) {\n if (initialContext === void 0) {\n initialContext = config.context;\n }\n\n return new StateNode(config, options, initialContext);\n}\nfunction createMachine(config, options) {\n if (!IS_PRODUCTION && !('predictableActionArguments' in config) && !warned) {\n warned = true;\n console.warn('It is highly recommended to set `predictableActionArguments` to `true` when using `createMachine`. https://xstate.js.org/docs/guides/actions.html');\n }\n\n return new StateNode(config, options);\n}\n\nexport { Machine, createMachine };\n","function createSchema(schema) {\n return schema;\n}\nvar t = createSchema;\n\nexport { createSchema, t };\n","import { assign as assign$1, send as send$1, sendTo as sendTo$1, sendParent as sendParent$1, sendUpdate as sendUpdate$1, forwardTo as forwardTo$1, doneInvoke as doneInvoke$1, raise as raise$1, log as log$1, pure as pure$1, choose as choose$1, stop as stop$1 } from './actions.js';\nimport * as actions from './actions.js';\nexport { actions };\nexport { toActorRef } from './Actor.js';\nexport { Interpreter, InterpreterStatus, interpret, spawn } from './interpreter.js';\nexport { Machine, createMachine } from './Machine.js';\nexport { mapState } from './mapState.js';\nexport { matchState } from './match.js';\nexport { createSchema, t } from './schema.js';\nexport { State } from './State.js';\nexport { StateNode } from './StateNode.js';\nexport { spawnBehavior } from './behaviors.js';\nexport { ActionTypes, SpecialTargets } from './types.js';\nexport { matchesState, toEventObject, toObserver, toSCXMLEvent } from './utils.js';\n\nvar assign = assign$1,\n send = send$1,\n sendTo = sendTo$1,\n sendParent = sendParent$1,\n sendUpdate = sendUpdate$1,\n forwardTo = forwardTo$1,\n doneInvoke = doneInvoke$1,\n raise = raise$1,\n log = log$1,\n pure = pure$1,\n choose = choose$1,\n stop = stop$1;\n\nexport { assign, choose, doneInvoke, forwardTo, log, pure, raise, send, sendParent, sendTo, sendUpdate, stop };\n"],"names":["fn","ref","current","v","__assign","Object","assign","t","s","i","n","arguments","length","p","prototype","hasOwnProperty","call","apply","this","__rest","e","indexOf","getOwnPropertySymbols","propertyIsEnumerable","useIdleInterpreter","getMachine","options","machine","context","guards","actions","activities","services","delays","interpreterOptions","state","service","machineConfig","machineWithConfig","withConfig","o","m","Symbol","iterator","r","ar","next","done","push","value","error","identity","a","useMachine","_a","_i","_c","getSnapshot","useCallback","status","NotStarted","create","initialState","isEqual","prevState","nextState","initialStateChanged","undefined","changed","keys","children","subscribe","handleStoreChange","unsubscribe","storeSnapshot","useSyncExternalStoreWithSelector","useEffect","rehydratedState","start","stop","send","k","is","b","l","useState","useLayoutEffect","useDebugValue","d","f","u","window","document","createElement","inst","c","g","exports","useSyncExternalStore","h","q","useRef","useMemo","w","hasValue","module","TypeError","to","from","pack","Array","slice","concat","ActionTypes","SpecialTargets","Start","Stop","raise","Raise","Send","cancel","Cancel","nullEvent","NullEvent","Assign","log","After","DoneState","Log","init","Init","invoke","Invoke","errorPlatform","ErrorExecution","ErrorPlatform","ErrorCustom","Update","choose","Choose","pure","Pure","EMPTY_ACTIVITY_MAP","DEFAULT_GUARD_TYPE","parentStateId","childStateId","delimiter","parentStateValue","toStateValue","childStateValue","every","key","getEventType","event","type","Error","toStatePath","stateId","isArray","toString","split","stateValue","pathToStateValue","statePath","marker","mapValues","collection","iteratee","result","collectionKeys","mapFilterValues","predicate","e_1","_b","item","e_1_1","return","path","props","object","e_2","props_1","props_1_1","e_2_1","toStatePaths","flatten","map","subStateValue","subPath","array","toArrayStrict","toArray","mapContext","mapper","_event","e_5","data","subMapper","e_5_1","isPromiseLike","Promise","then","updateHistoryStates","hist","states","subHist","updateContext","assignActions","updatedContext","reduce","acc","assignAction","e_7","assignment","meta","action","partialUpdate","propAssignment","e_7_1","toGuard","condition","guardMap","name","message","console","args","warn","symbolObservable","observable","toEventObject","payload","toSCXMLEvent","scxmlEvent","$$type","eventObject","toTransitionConfigArray","configLike","transitionLike","target","evaluateGuard","guard","guardMeta","cond","condFn","id","toInvokeSource","src","toObserver","nextHandler","errorHandler","completionHandler","noop","isObserver","self","bind","complete","createInvokeId","stateNodeId","index","isRaisableAction","Internal","delay","initEvent","getActionFunction","actionType","actionFunctionMap","toActionObject","actionObject","exec","toActionObjects","subAction","toActivityDefinition","DoneInvoke","resolveActions","currentState","currentContext","actionBlocks","predictableExec","preserveActionOrder","actionBlocks_1","actionBlocks_1_1","block","splice","pluckAssigns","preservedContexts","deferredToBlockEnd","handleAction","blockType","raisedAction","ctx","delaysMap","resolvedDelay","resolvedEvent","configDelay","resolveRaise","sendAction","resolvedTarget","resolveSend","configuredDelay","resolved","expr","resolveLog","matchedActions","conds","find","resolvedActionsFromChoose","resolvedContextFromChoose","get","resolvedActionsFromPure","resolvedContext","actorRefOrString","activity","resolvedActorRef","resolveStop","resolvedActionObject","exec_1","contextIndex_1","wrapped","_ctx","resolvedActions","forEach","serviceStack","provide","pop","createNullActor","toJSON","entity","tempActor","deferred","initialState_1","withContext","isLeafNode","stateNode","getAllChildren","getChildren","filter","sn","getAllStateNodes","stateNodes","getConfiguration","prevStateNodes","e_3","e_4","_d","prevAdjList","getAdjList","Set","configuration","configuration_1","configuration_1_1","parent","has","add","adjList","configuration_2","configuration_2_1","_e","_f","child","initialStateNodes","e_3_1","configuration_3","configuration_3_1","e_4_1","getValueFromAdj","baseNode","childStateNodes","childStateNode","csn","Map","configuration_4","configuration_4_1","set","getValue","rootNode","iterable","some","member","isInFinalState","getTagsFromConfiguration","tags","stateValuesEqual","aKeys","bKeys","isStateConfig","State","config","_this","events","_sessionid","historyValue","history","matches","toStrings","transitions","defineProperty","ownEvents","nextEvents","inert","valueKeys","jsonValues","hasTag","tag","can","transitionData","getTransitionData","defaultOptions","deferEvents","Scheduler","processingEvent","queue","initialized","initialize","callback","schedule","process","flushEvents","task","clear","nextCallback","shift","sessionIdIndex","registry","actor","delete","getGlobal","globalThis","registerService","devTools","global","__xstate__","getDevTools","register","spawnBehavior","behavior","observers","mailbox","flushing","actorRefLike","toActorRef","event_1","transition","actorCtx","observer","flush","handleError","InterpreterStatus","DEFAULT_SPAWN_OPTIONS","sync","autoForward","Interpreter","delayedEventsMap","listeners","contextListeners","stopListeners","doneListeners","eventListeners","sendListeners","forwardTo","_outgoingQueue","batch","Stopped","JSON","stringify","Running","scheduler","forward","_nextState","update","_state","sendTo","immediate","isParent","Parent","origin","sessionId","predictableActionArguments","_exec","actionOrExec","err","sendAction_1","defer","sendId","invokeSource","serviceCreator","resolvedData","source","spawn","spawnActivity","stopChild","label","logger","resolvedOptions","clock","resolvedId","_initialState","enumerable","configurable","execute","actionsConfig","listener","_g","_h","_j","_k","contextListener","finalChildStateNode","doneData","_doneEvent","_l","_m","_stop","_stopChildren","onTransition","nextListenerOrObserver","_","completeListener","completeOnce","onDone","onStop","onEvent","onSend","onChange","off","_init","resolvedState","resolveState","attachDev","e_6","e_8","e_9","e_10","e_6_1","e_8_1","_o","e_9_1","_p","_q","clearTimeout","e_10_1","exitActions","sort","order","onExit","newState","e_11","batchChanged","batchedActions","_loop_1","bindActionToState","events_1","events_1_1","e_11_1","sender","nextEvent","e_12","e_12_1","timerId","setTimeout","removeChild","childId","spawnPromise","resolve","spawnCallback","spawnActor","isObservable","spawnObservable","spawnMachine","childService","doneEvent","actorRef","promise","canceled","response","errorData","errorEvent","originalError","currentError","originalStackTrace","stack","stackTrace","reportUnhandledExceptionOnInvocation","strict","unsubscribed","emitted","callbackStop","receivers","newListener","receiver","subscription","implementation","dispose","spawnEffect","__REDUX_DEVTOOLS_EXTENSION__","devToolsOptions","connect","autoPause","stateSanitizer","features","jump","skip","ms","interpret","simpleSrc","toInvokeDefinition","invokeConfig","onError","invokeDef","NULL_EVENT","WILDCARD","EMPTY_OBJECT","isStateId","str","StateNode","_context","_stateInfo","__xstatenode","__cache","relativeValue","initialStateValue","on","candidates","delayedTransitions","idMap","join","version","parallel","schema","description","initial","stateConfig","dfs","_transient","always","onEntry","entry","exit","invokeId","definition","eventType","getDelayedTransitions","formatTransitions","getCandidates","eventName","transient","sameEventType","afterConfig","after","mutateEntryExit","delayRef","idSuffix","configTransition","resolvedTransition","isNaN","delayedTransition","formatTransition","getStateNodes","getStateNode","subStateKeys","subStateNodes","subStateKey","handles","includes","stateFromConfig","transitionLeafNode","transitionCompoundNode","_transition","transitionParallelNode","transitionMap","stateTransitions","enabledTransitions","st","exitSet","selectedTransition","nextStateNodes","candidate","stateIn","in","isInState","getStateNodeById","guardPassed","allNextStateNodes","getRelativeStateNodes","internal","targetNode","getPotentiallyReenteringNodes","nodes","possibleAncestor","getActions","resolvedConfig","isDone","prevConfig","entrySet","prevConfig_1","prevConfig_1_1","entryStates","exitStates","doneEvents","grandparent","parentNode","entryActions","invokeActions","activityDef","stopActions","resolvedStateValue","getResolvedPath","test","stateTransition","resolveTransition","resolveRaisedTransition","originalEvent","currentActions","unshift","willTransition","resolvedConfiguration","items","truthy","falsy","items_1","items_1_1","partition","raisedEvents","nonRaisedActions","invokeDefinition","invokeSrc","createInvocableActor","didUpdateContext","hasAlwaysTransitions","maybeNextState","raisedEvent","stateKey","resolvedStateId","STATE_IDENTIFIER","getStateNodeByPath","arrayStatePath","currentStateNode","subStateNode","stateIdentifier","getInitialState","historyConfig","relativeStateId","resolveHistory","initialPath","getFromRelativePath","relativePath","childStatePath","relativeStateValue","historyTarget","relativeChildPath","accessorProp","subHistoryValue","props_2","props_2_1","prop","subStatePath","childStateIds","stateIds","resolveTarget","_target","isInternalTarget","transitionConfig","normalizedTarget","normalizeTarget","onConfig","wildcardConfigs","strictTransitionConfigs_1","transitionConfigArray","hasNonLastUnguardedTarget","eventText","validateArrayifiedTransitions","eventlessConfig","doneConfig","String","settleTransitions","formattedTransitions","delayedTransitions_1","delayedTransitions_1_1","Machine","initialContext"],"sourceRoot":""} \ No newline at end of file diff --git a/resources/579.css b/resources/579.css new file mode 100644 index 0000000..296f0cb --- /dev/null +++ b/resources/579.css @@ -0,0 +1,3 @@ +.dicom-tag-browser-table{margin-left:auto;margin-right:auto}.dicom-tag-browser-table-wrapper{overflow-x:scroll}.dicom-tag-browser-table tr{border-top:1px solid #ddd;color:#fff;padding-left:10px;padding-right:10px;white-space:nowrap}.stick{overflow:clip;position:sticky}.dicom-tag-browser-content{overflow:hidden;padding-bottom:50px;width:100%}.dicom-tag-browser-instance-range .range{height:20px}.dicom-tag-browser-instance-range{padding:20px 0}.dicom-tag-browser-table td.dicom-tag-browser-table-center{text-align:center}.dicom-tag-browser-table th{color:"#20A5D6";padding-left:10px;padding-right:10px;text-align:center}.dicom-tag-browser-table th.dicom-tag-browser-table-left{text-align:left} + +/*# sourceMappingURL=579.css.map*/ \ No newline at end of file diff --git a/resources/579.css.map b/resources/579.css.map new file mode 100644 index 0000000..1f8663f --- /dev/null +++ b/resources/579.css.map @@ -0,0 +1 @@ +{"version":3,"file":"579.css","mappings":"AAAA,yBAEE,gBAAiB,CADjB,iBAEF,CAEA,iCAGE,iBACF,CAEA,4BAIE,yBAA0B,CAD1B,UAAc,CAFd,iBAAkB,CAClB,kBAAmB,CAGnB,kBACF,CAEA,OAEE,aAAc,CADd,eAEF,CAEA,2BACE,eAAgB,CAEhB,mBAAoB,CADpB,UAGF,CAEA,yCACE,WACF,CAEA,kCACE,cACF,CAEA,2DACE,iBACF,CAEA,4BAIE,eAAgB,CAHhB,iBAAkB,CAClB,kBAAmB,CACnB,iBAEF,CAEA,yDACE,eACF,C","sources":["webpack:///../../../extensions/default/src/DicomTagBrowser/DicomTagBrowser.css"],"sourcesContent":[".dicom-tag-browser-table {\r\n margin-right: auto;\r\n margin-left: auto;\r\n}\r\n\r\n.dicom-tag-browser-table-wrapper {\r\n /* height: 500px;*/\r\n /*overflow-y: scroll;*/\r\n overflow-x: scroll;\r\n}\r\n\r\n.dicom-tag-browser-table tr {\r\n padding-left: 10px;\r\n padding-right: 10px;\r\n color: #ffffff;\r\n border-top: 1px solid #ddd;\r\n white-space: nowrap;\r\n}\r\n\r\n.stick {\r\n position: sticky;\r\n overflow: clip;\r\n}\r\n\r\n.dicom-tag-browser-content {\r\n overflow: hidden;\r\n width: 100%;\r\n padding-bottom: 50px;\r\n /*height: 500px;*/\r\n}\r\n\r\n.dicom-tag-browser-instance-range .range {\r\n height: 20px;\r\n}\r\n\r\n.dicom-tag-browser-instance-range {\r\n padding: 20px 0 20px 0;\r\n}\r\n\r\n.dicom-tag-browser-table td.dicom-tag-browser-table-center {\r\n text-align: center;\r\n}\r\n\r\n.dicom-tag-browser-table th {\r\n padding-left: 10px;\r\n padding-right: 10px;\r\n text-align: center;\r\n color: '#20A5D6';\r\n}\r\n\r\n.dicom-tag-browser-table th.dicom-tag-browser-table-left {\r\n text-align: left;\r\n}\r\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/resources/604.bundle.9477bed4d89c962cb3df.js b/resources/604.bundle.9477bed4d89c962cb3df.js new file mode 100644 index 0000000..df96bfd --- /dev/null +++ b/resources/604.bundle.9477bed4d89c962cb3df.js @@ -0,0 +1,2 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[604],{97604:(e,t,r)=>{function n(e){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},n(e)}function a(e,t){for(var r=0;r2&&void 0!==arguments[2]?arguments[2]:0;if(r+t.length>e.length)return!1;for(var n=r,a=0;a2&&void 0!==arguments[2]?arguments[2]:0,n=arguments.length>3?arguments[3]:void 0,a=e.length;n&&(a=Math.min(r+n,e.length));for(var i=r;i1&&void 0!==arguments[1]?arguments[1]:function(){function e(){return Math.floor(65536*(1+Math.random())).toString(16).substring(1)}return"".concat(e()+e(),"-").concat(e(),"-").concat(e(),"-").concat(e(),"-").concat(e()).concat(e()).concat(e())}(),r="Content-Type: ".concat(arguments.length>2&&void 0!==arguments[2]?arguments[2]:"application/dicom"),n="\r\n--".concat(t,"\r\n").concat(r,"\r\n\r\n"),a="\r\n--".concat(t,"--"),s=i(n),o=i(a),c=s.length,u=o.length,d=0,l=e.map((function(e){var t=new Uint8Array(e),r=t.length;return d+=c+r+u,t})),p=new Uint8Array(d);p.set(s,0);var f=0;return l.forEach((function(e){p.set(s,f),p.set(e,f+c),f+=c+e.length})),p.set(o,f),{data:p.buffer,boundary:t}}function u(e){var t=new Uint8Array(e),r=i("\r\n\r\n"),n=o(t,r,0,1e3);if(-1===n)throw new Error("Response message has no multipart mime header");var a=function(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,r=(arguments.length>2?arguments[2]:void 0)||e.length-t,n="",a=t;am});var p=function(e){return e[0]},f="application/dicom",h="application/dicom+json",v="application/octet-stream",y="application/pdf";var m={DICOMwebClient:function(){function e(t){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.baseURL=t.url,this.baseURL||console.error("no DICOMweb base url provided - calls that require a URL will fail"),"username"in t&&(this.username=t.username,"password"in t||console.error("no password provided to authenticate with DICOMweb service"),this.password=t.password),"qidoURLPrefix"in t?(console.log("use URL prefix for QIDO-RS: ".concat(t.qidoURLPrefix)),this.qidoURL="".concat(this.baseURL,"/").concat(t.qidoURLPrefix)):this.qidoURL=this.baseURL,"wadoURLPrefix"in t?(console.log("use URL prefix for WADO-RS: ".concat(t.wadoURLPrefix)),this.wadoURL="".concat(this.baseURL,"/").concat(t.wadoURLPrefix)):this.wadoURL=this.baseURL,"stowURLPrefix"in t?(console.log("use URL prefix for STOW-RS: ".concat(t.stowURLPrefix)),this.stowURL="".concat(this.baseURL,"/").concat(t.stowURLPrefix)):this.stowURL=this.baseURL,"requestHooks"in t&&(this.requestHooks=t.requestHooks),this.headers=t.headers||{},this.errorInterceptor=t.errorInterceptor||function(){},this.verbose=!1!==t.verbose}var t,r,i;return t=e,r=[{key:"setVerbose",value:function(e){this.verbose=e}},{key:"getVerbose",value:function(){return this.verbose}},{key:"_httpRequest",value:function(e,t){var r=this,a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},s=this.errorInterceptor,o=this.requestHooks;return new Promise((function(c,u){var d=i.request?i.request:new XMLHttpRequest;d.open(t,e,!0),"responseType"in i&&(d.responseType=i.responseType),"object"===n(a)&&Object.keys(a).forEach((function(e){d.setRequestHeader(e,a[e])}));var l,p=r.headers;if(Object.keys(p).forEach((function(e){d.setRequestHeader(e,p[e])})),d.onloadstart=function(){},d.onloadend=function(){},d.onreadystatechange=function(){if(4===d.readyState)if(200===d.status)c(d.response);else if(202===d.status)r.verbose&&console.warn("some resources already existed: ",d),c(d.response);else if(204===d.status)r.verbose&&console.warn("empty response for request: ",d),c([]);else{var e=new Error("request failed");e.request=d,e.response=d.response,e.status=d.status,r.verbose&&(console.error("request failed: ",d),console.error(e),console.error(e.response)),s(e),u(e)}},"progressCallback"in i&&"function"==typeof i.progressCallback&&(d.onprogress=i.progressCallback),o&&function(e){var t=Array.isArray(e)&&e.every((function(e){return"function"==typeof e&&2===e.length}));return t||console.warn("Request hooks should have the following signature: function requestHook(request, metadata) { return request; }"),t}(o)){var f=Object.assign({},a,r.headers),h={method:t,url:e,headers:f},v=(l=o,function(e){return l.reduce((function(e,t){return t(e,h)}),e)});d=v(d)}"withCredentials"in i&&i.withCredentials&&(d.withCredentials=!0),"data"in i?d.send(i.data):d.send()}))}},{key:"_httpGet",value:function(e,t,r,n,a){return this._httpRequest(e,"get",t,{responseType:r,progressCallback:n,withCredentials:a})}},{key:"_httpGetApplicationJson",value:function(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},a=arguments.length>2?arguments[2]:void 0,i=arguments.length>3?arguments[3]:void 0,s=t;"object"===n(r)&&(l(r)||(s+=e._parseQueryParameters(r)));var o={Accept:h};return this._httpGet(s,o,"json",a,i)}},{key:"_httpGetApplicationPdf",value:function(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},a=arguments.length>2?arguments[2]:void 0,i=arguments.length>3?arguments[3]:void 0,s=t;"object"===n(r)&&(l(r)||(s+=e._parseQueryParameters(r)));var o={Accept:y};return this._httpGet(s,o,"json",a,i)}},{key:"_httpGetImage",value:function(t,r){var a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},i=arguments.length>3?arguments[3]:void 0,s=arguments.length>4?arguments[4]:void 0,o=t;"object"===n(a)&&(l(a)||(o+=e._parseQueryParameters(a)));var c={Accept:e._buildAcceptHeaderFieldValue(r,["image/","image/*","image/jpeg","image/jp2","image/gif","image/png"])};return this._httpGet(o,c,"arraybuffer",i,s)}},{key:"_httpGetText",value:function(t,r){var a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},i=arguments.length>3?arguments[3]:void 0,s=arguments.length>4?arguments[4]:void 0,o=t;"object"===n(a)&&(l(a)||(o+=e._parseQueryParameters(a)));var c={Accept:e._buildAcceptHeaderFieldValue(r,["text/","text/*","text/html","text/plain","text/rtf","text/xml"])};return this._httpGet(o,c,"arraybuffer",i,s)}},{key:"_httpGetVideo",value:function(t,r){var a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},i=arguments.length>3?arguments[3]:void 0,s=arguments.length>4?arguments[4]:void 0,o=t;"object"===n(a)&&(l(a)||(o+=e._parseQueryParameters(a)));var c={Accept:e._buildAcceptHeaderFieldValue(r,["video/","video/*","video/mpeg","video/mp4","video/H265"])};return this._httpGet(o,c,"arraybuffer",i,s)}},{key:"_httpGetMultipartImage",value:function(t,r,n,a){var i,s=arguments.length>5?arguments[5]:void 0,o=arguments.length>6?arguments[6]:void 0,c={};return arguments.length>4&&void 0!==arguments[4]&&arguments[4]?i=["image/jpeg","image/gif","image/png","image/jp2"]:(i={"1.2.840.10008.1.2.5":["image/x-dicom-rle"],"1.2.840.10008.1.2.4.50":["image/jpeg"],"1.2.840.10008.1.2.4.51":["image/jpeg"],"1.2.840.10008.1.2.4.57":["image/jpeg"],"1.2.840.10008.1.2.4.70":["image/jpeg"],"1.2.840.10008.1.2.4.80":["image/x-jls","image/jls"],"1.2.840.10008.1.2.4.81":["image/x-jls","image/jls"],"1.2.840.10008.1.2.4.90":["image/jp2"],"1.2.840.10008.1.2.4.91":["image/jp2"],"1.2.840.10008.1.2.4.92":["image/jpx"],"1.2.840.10008.1.2.4.93":["image/jpx"]},n&&(c.Range=e._buildRangeHeaderFieldValue(n))),c.Accept=e._buildMultipartAcceptHeaderFieldValue(r,i),this._httpGet(t,c,"arraybuffer",s,o).then(u)}},{key:"_httpGetMultipartVideo",value:function(t,r,n,a){var i,s=arguments.length>5?arguments[5]:void 0,o=arguments.length>6?arguments[6]:void 0,c={};return arguments.length>4&&void 0!==arguments[4]&&arguments[4]?i=["video/","video/*","video/mpeg2","video/mp4","video/H265"]:(i={"1.2.840.10008.1.2.4.100":["video/mpeg2"],"1.2.840.10008.1.2.4.101":["video/mpeg2"],"1.2.840.10008.1.2.4.102":["video/mp4"],"1.2.840.10008.1.2.4.103":["video/mp4"],"1.2.840.10008.1.2.4.104":["video/mp4"],"1.2.840.10008.1.2.4.105":["video/mp4"],"1.2.840.10008.1.2.4.106":["video/mp4"]},n&&(c.Range=e._buildRangeHeaderFieldValue(n))),c.Accept=e._buildMultipartAcceptHeaderFieldValue(r,i),this._httpGet(t,c,"arraybuffer",s,o).then(u)}},{key:"_httpGetMultipartApplicationDicom",value:function(t,r,n,a,i){var s={},o="application/dicom",c={"1.2.840.10008.1.2.1":[o],"1.2.840.10008.1.2.5":[o],"1.2.840.10008.1.2.4.50":[o],"1.2.840.10008.1.2.4.51":[o],"1.2.840.10008.1.2.4.57":[o],"1.2.840.10008.1.2.4.70":[o],"1.2.840.10008.1.2.4.80":[o],"1.2.840.10008.1.2.4.81":[o],"1.2.840.10008.1.2.4.90":[o],"1.2.840.10008.1.2.4.91":[o],"1.2.840.10008.1.2.4.92":[o],"1.2.840.10008.1.2.4.93":[o],"1.2.840.10008.1.2.4.100":[o],"1.2.840.10008.1.2.4.101":[o],"1.2.840.10008.1.2.4.102":[o],"1.2.840.10008.1.2.4.103":[o],"1.2.840.10008.1.2.4.104":[o],"1.2.840.10008.1.2.4.105":[o],"1.2.840.10008.1.2.4.106":[o]},d=r;return r||(d=[{mediaType:o}]),s.Accept=e._buildMultipartAcceptHeaderFieldValue(d,c),this._httpGet(t,s,"arraybuffer",a,i).then(u)}},{key:"_httpGetMultipartApplicationOctetStream",value:function(t,r,n,a,i,s){var o={},c="application/octet-stream",d={"1.2.840.10008.1.2.1":[c]},l=r;return r||(l=[{mediaType:c}]),n&&(o.Range=e._buildRangeHeaderFieldValue(n)),o.Accept=e._buildMultipartAcceptHeaderFieldValue(l,d),this._httpGet(t,o,"arraybuffer",i,s).then(u)}},{key:"_httpPost",value:function(e,t,r,n,a,i){return this._httpRequest(e,"post",t,{data:r,progressCallback:n,withCredentials:a,request:i})}},{key:"_httpPostApplicationJson",value:function(e,t,r,n){var a={"Content-Type":h};return this._httpPost(e,a,t,r,n)}},{key:"searchForStudies",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};console.log("search for studies");var r=!1,n="".concat(this.qidoURL,"/studies");return"queryParams"in t&&(n+=e._parseQueryParameters(t.queryParams)),"withCredentials"in t&&t.withCredentials&&(r=t.withCredentials),this._httpGetApplicationJson(n,{},!1,r)}},{key:"retrieveStudyMetadata",value:function(e){if(!("studyInstanceUID"in e))throw new Error("Study Instance UID is required for retrieval of study metadata");console.log("retrieve metadata of study ".concat(e.studyInstanceUID));var t="".concat(this.wadoURL,"/studies/").concat(e.studyInstanceUID,"/metadata"),r=!1;return"withCredentials"in e&&e.withCredentials&&(r=e.withCredentials),this._httpGetApplicationJson(t,{},!1,r)}},{key:"searchForSeries",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=this.qidoURL;"studyInstanceUID"in t&&(console.log("search series of study ".concat(t.studyInstanceUID)),r+="/studies/".concat(t.studyInstanceUID)),r+="/series","queryParams"in t&&(r+=e._parseQueryParameters(t.queryParams));var n=!1;return"withCredentials"in t&&t.withCredentials&&(n=t.withCredentials),this._httpGetApplicationJson(r,{},!1,n)}},{key:"retrieveSeriesMetadata",value:function(e){if(!("studyInstanceUID"in e))throw new Error("Study Instance UID is required for retrieval of series metadata");if(!("seriesInstanceUID"in e))throw new Error("Series Instance UID is required for retrieval of series metadata");console.log("retrieve metadata of series ".concat(e.seriesInstanceUID));var t="".concat(this.wadoURL,"/studies/").concat(e.studyInstanceUID,"/series/").concat(e.seriesInstanceUID,"/metadata"),r=!1;return"withCredentials"in e&&e.withCredentials&&(r=e.withCredentials),this._httpGetApplicationJson(t,{},!1,r)}},{key:"searchForInstances",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=this.qidoURL,n=!1;return"studyInstanceUID"in t?(r+="/studies/".concat(t.studyInstanceUID),"seriesInstanceUID"in t?(console.log("search for instances of series ".concat(t.seriesInstanceUID)),r+="/series/".concat(t.seriesInstanceUID)):console.log("search for instances of study ".concat(t.studyInstanceUID))):console.log("search for instances"),r+="/instances","queryParams"in t&&(r+=e._parseQueryParameters(t.queryParams)),"withCredentials"in t&&t.withCredentials&&(n=t.withCredentials),this._httpGetApplicationJson(r,{},!1,n)}},{key:"buildInstanceWadoURIUrl",value:function(e){if(!("studyInstanceUID"in e))throw new Error("Study Instance UID is required.");if(!("seriesInstanceUID"in e))throw new Error("Series Instance UID is required.");if(!("sopInstanceUID"in e))throw new Error("SOP Instance UID is required.");var t=e.contentType||f,r=e.transferSyntax||"*",n=[];n.push("requestType=WADO"),n.push("studyUID=".concat(e.studyInstanceUID)),n.push("seriesUID=".concat(e.seriesInstanceUID)),n.push("objectUID=".concat(e.sopInstanceUID)),n.push("contentType=".concat(t)),n.push("transferSyntax=".concat(r));var a=n.join("&");return"".concat(this.wadoURL,"?").concat(a)}},{key:"retrieveInstanceMetadata",value:function(e){if(!("studyInstanceUID"in e))throw new Error("Study Instance UID is required for retrieval of instance metadata");if(!("seriesInstanceUID"in e))throw new Error("Series Instance UID is required for retrieval of instance metadata");if(!("sopInstanceUID"in e))throw new Error("SOP Instance UID is required for retrieval of instance metadata");console.log("retrieve metadata of instance ".concat(e.sopInstanceUID));var t="".concat(this.wadoURL,"/studies/").concat(e.studyInstanceUID,"/series/").concat(e.seriesInstanceUID,"/instances/").concat(e.sopInstanceUID,"/metadata"),r=!1;return"withCredentials"in e&&e.withCredentials&&(r=e.withCredentials),this._httpGetApplicationJson(t,{},!1,r)}},{key:"retrieveInstanceFrames",value:function(t){if(!("studyInstanceUID"in t))throw new Error("Study Instance UID is required for retrieval of instance frames");if(!("seriesInstanceUID"in t))throw new Error("Series Instance UID is required for retrieval of instance frames");if(!("sopInstanceUID"in t))throw new Error("SOP Instance UID is required for retrieval of instance frames");if(!("frameNumbers"in t))throw new Error("frame numbers are required for retrieval of instance frames");console.log("retrieve frames ".concat(t.frameNumbers.toString()," of instance ").concat(t.sopInstanceUID));var r="".concat(this.wadoURL,"/studies/").concat(t.studyInstanceUID,"/series/").concat(t.seriesInstanceUID,"/instances/").concat(t.sopInstanceUID,"/frames/").concat(t.frameNumbers.toString()),n=t.mediaTypes,a=!1;"withCredentials"in t&&t.withCredentials&&(a=t.withCredentials);var i=!1;if("progressCallback"in t&&(i=t.progressCallback),!n)return this._httpGetMultipartApplicationOctetStream(r,!1,!1,!1,i,a);if(e._getSharedMediaTypes(n).length>1){var s={Accept:e._buildMultipartAcceptHeaderFieldValue(n,{"1.2.840.10008.1.2.1":["application/octet-stream"],"1.2.840.10008.1.2.5":["image/x-dicom-rle"],"1.2.840.10008.1.2.4.50":["image/jpeg"],"1.2.840.10008.1.2.4.51":["image/jpeg"],"1.2.840.10008.1.2.4.57":["image/jpeg"],"1.2.840.10008.1.2.4.70":["image/jpeg"],"1.2.840.10008.1.2.4.80":["image/x-jls","image/jls"],"1.2.840.10008.1.2.4.81":["image/x-jls","image/jls"],"1.2.840.10008.1.2.4.90":["image/jp2"],"1.2.840.10008.1.2.4.91":["image/jp2"],"1.2.840.10008.1.2.4.92":["image/jpx"],"1.2.840.10008.1.2.4.93":["image/jpx"]})};return this._httpGet(r,s,"arraybuffer",i,a).then(u)}var o=e._getCommonMediaType(n);if(o.startsWith("application"))return this._httpGetMultipartApplicationOctetStream(r,n,!1,!1,i,a);if(o.startsWith("image"))return this._httpGetMultipartImage(r,n,!1,!1,!1,i,a);if(o.startsWith("video"))return this._httpGetMultipartVideo(r,n,!1,!1,!1,i,a);throw new Error("Media type ".concat(o," is not supported for retrieval of frames."))}},{key:"retrieveInstanceRendered",value:function(t){if(!("studyInstanceUID"in t))throw new Error("Study Instance UID is required for retrieval of rendered instance");if(!("seriesInstanceUID"in t))throw new Error("Series Instance UID is required for retrieval of rendered instance");if(!("sopInstanceUID"in t))throw new Error("SOP Instance UID is required for retrieval of rendered instance");var r="".concat(this.wadoURL,"/studies/").concat(t.studyInstanceUID,"/series/").concat(t.seriesInstanceUID,"/instances/").concat(t.sopInstanceUID,"/rendered"),n=t.mediaTypes,a=t.queryParams,i=!1;"withCredentials"in t&&t.withCredentials&&(i=t.withCredentials);var s=!1;if("progressCallback"in t&&(s=t.progressCallback),!n)return a&&(r+=e._parseQueryParameters(a)),this._httpGet(r,{},"arraybuffer",s,i);var o=e._getCommonMediaType(n);if(o.startsWith("image"))return this._httpGetImage(r,n,a,s,i);if(o.startsWith("video"))return this._httpGetVideo(r,n,a,s,i);if(o.startsWith("text"))return this._httpGetText(r,n,a,s,i);if(o===y)return this._httpGetApplicationPdf(r,a,s,i);throw new Error("Media type ".concat(o," is not supported ")+"for retrieval of rendered instance.")}},{key:"retrieveInstanceThumbnail",value:function(t){if(!("studyInstanceUID"in t))throw new Error("Study Instance UID is required for retrieval of rendered instance");if(!("seriesInstanceUID"in t))throw new Error("Series Instance UID is required for retrieval of rendered instance");if(!("sopInstanceUID"in t))throw new Error("SOP Instance UID is required for retrieval of rendered instance");var r="".concat(this.wadoURL,"/studies/").concat(t.studyInstanceUID,"/series/").concat(t.seriesInstanceUID,"/instances/").concat(t.sopInstanceUID,"/thumbnail"),n=t.mediaTypes,a=t.queryParams,i=!1;"withCredentials"in t&&t.withCredentials&&(i=t.withCredentials);var s=!1;if("progressCallback"in t&&(s=t.progressCallback),!n)return a&&(r+=e._parseQueryParameters(a)),this._httpGet(r,{},"arraybuffer",s,i);var o=e._getCommonMediaType(n);if(o.startsWith("image"))return this._httpGetImage(r,n,a,s,i);throw new Error("Media type ".concat(o," is not supported ")+"for retrieval of rendered instance.")}},{key:"retrieveInstanceFramesRendered",value:function(t){if(!("studyInstanceUID"in t))throw new Error("Study Instance UID is required for retrieval of rendered instance frames");if(!("seriesInstanceUID"in t))throw new Error("Series Instance UID is required for retrieval of rendered instance frames");if(!("sopInstanceUID"in t))throw new Error("SOP Instance UID is required for retrieval of rendered instance frames");if(!("frameNumbers"in t))throw new Error("frame numbers are required for retrieval of rendered instance frames");console.debug("retrieve rendered frames ".concat(t.frameNumbers.toString()," of instance ").concat(t.sopInstanceUID));var r="".concat(this.wadoURL,"/studies/").concat(t.studyInstanceUID,"/series/").concat(t.seriesInstanceUID,"/instances/").concat(t.sopInstanceUID,"/frames/").concat(t.frameNumbers.toString(),"/rendered"),n=t.mediaTypes,a=t.queryParams,i=!1;"withCredentials"in t&&t.withCredentials&&(i=t.withCredentials);var s=!1;if("progressCallback"in t&&(s=t.progressCallback),!n)return a&&(r+=e._parseQueryParameters(a)),this._httpGet(r,{},"arraybuffer",!1,i);var o=e._getCommonMediaType(n);if(o.startsWith("image"))return this._httpGetImage(r,n,a,s,i);if(o.startsWith("video"))return this._httpGetVideo(r,n,a,s,i);throw new Error("Media type ".concat(o," is not supported ")+"for retrieval of rendered frame.")}},{key:"retrieveInstanceFramesThumbnail",value:function(t){if(!("studyInstanceUID"in t))throw new Error("Study Instance UID is required for retrieval of rendered instance frames");if(!("seriesInstanceUID"in t))throw new Error("Series Instance UID is required for retrieval of rendered instance frames");if(!("sopInstanceUID"in t))throw new Error("SOP Instance UID is required for retrieval of rendered instance frames");if(!("frameNumbers"in t))throw new Error("frame numbers are required for retrieval of rendered instance frames");console.debug("retrieve rendered frames ".concat(t.frameNumbers.toString()," of instance ").concat(t.sopInstanceUID));var r="".concat(this.wadoURL,"/studies/").concat(t.studyInstanceUID,"/series/").concat(t.seriesInstanceUID,"/instances/").concat(t.sopInstanceUID,"/frames/").concat(t.frameNumbers.toString(),"/thumbnail"),n=t.mediaTypes,a=t.queryParams,i=!1;"withCredentials"in t&&t.withCredentials&&(i=t.withCredentials);var s=!1;if("progressCallback"in t&&(s=t.progressCallback),!n)return a&&(r+=e._parseQueryParameters(a)),this._httpGet(r,{},"arraybuffer",s,i);var o=e._getCommonMediaType(n);if(o.startsWith("image"))return this._httpGetImage(r,n,a,s,i);throw new Error("Media type ".concat(o," is not supported ")+"for retrieval of rendered frame.")}},{key:"retrieveInstance",value:function(t){if(!("studyInstanceUID"in t))throw new Error("Study Instance UID is required");if(!("seriesInstanceUID"in t))throw new Error("Series Instance UID is required");if(!("sopInstanceUID"in t))throw new Error("SOP Instance UID is required");var r="".concat(this.wadoURL,"/studies/").concat(t.studyInstanceUID,"/series/").concat(t.seriesInstanceUID,"/instances/").concat(t.sopInstanceUID),n=t.mediaTypes,a=t.withCredentials,i=void 0!==a&&a,s=t.progressCallback,o=void 0!==s&&s;if(!n)return this._httpGetMultipartApplicationDicom(r,!1,!1,o,i).then(p);var c=e._getCommonMediaType(n);if(c===f)return this._httpGetMultipartApplicationDicom(r,n,!1,o,i).then(p);throw new Error("Media type ".concat(c," is not supported for retrieval of instance."))}},{key:"retrieveSeries",value:function(t){if(!("studyInstanceUID"in t))throw new Error("Study Instance UID is required");if(!("seriesInstanceUID"in t))throw new Error("Series Instance UID is required");var r="".concat(this.wadoURL,"/studies/").concat(t.studyInstanceUID,"/series/").concat(t.seriesInstanceUID),n=t.mediaTypes,a=!1;"withCredentials"in t&&t.withCredentials&&(a=t.withCredentials);var i=!1;if("progressCallback"in t&&(i=t.progressCallback),!n)return this._httpGetMultipartApplicationDicom(r,!1,!1,i,a);var s=e._getCommonMediaType(n);if(s===f)return this._httpGetMultipartApplicationDicom(r,n,!1,i,a);throw new Error("Media type ".concat(s," is not supported for retrieval of series."))}},{key:"retrieveStudy",value:function(t){if(!("studyInstanceUID"in t))throw new Error("Study Instance UID is required");var r="".concat(this.wadoURL,"/studies/").concat(t.studyInstanceUID),n=t.mediaTypes,a=t.withCredentials,i=void 0!==a&&a,s=t.progressCallback,o=void 0!==s&&s;if(!n)return this._httpGetMultipartApplicationDicom(r,!1,!1,o,i);var c=e._getCommonMediaType(n);if(c===f)return this._httpGetMultipartApplicationDicom(r,n,!1,o,i);throw new Error("Media type ".concat(c," is not supported for retrieval of study."))}},{key:"retrieveBulkData",value:function(t){if(!("BulkDataURI"in t))throw new Error("BulkDataURI is required.");var r=t.BulkDataURI,n=t.mediaTypes,a=t.byteRange,i=t.withCredentials,s=void 0!==i&&i,o=t.progressCallback,c=void 0!==o&&o;if(!n)return this._httpGetMultipartApplicationOctetStream(r,n,a,!1,!1,s);var u=e._getCommonMediaType(n);if(u===v)return this._httpGetMultipartApplicationOctetStream(r,n,a,!1,c,s);if(u.startsWith("image"))return this._httpGetMultipartImage(r,n,a,!1,!1,c,s);throw new Error("Media type ".concat(u," is not supported for retrieval of bulk data."))}},{key:"storeInstances",value:function(e){if(!("datasets"in e))throw new Error("datasets are required for storing");var t="".concat(this.stowURL,"/studies");"studyInstanceUID"in e&&(t+="/".concat(e.studyInstanceUID));var r=c(e.datasets),n=r.data,a=r.boundary,i={"Content-Type":'multipart/related; type="application/dicom"; boundary="'.concat(a,'"')},s=e.withCredentials,o=void 0!==s&&s;return this._httpPost(t,i,n,e.progressCallback,o,e.request)}}],i=[{key:"_parseQueryParameters",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t="?";return Object.keys(e).forEach((function(r,n){0!==n&&(t+="&"),t+="".concat(r,"=").concat(encodeURIComponent(e[r]))})),t}},{key:"_assertMediaTypeIsValid",value:function(e){if(!e)throw new Error("Not a valid media type: ".concat(e));var t=e.indexOf("/");if(-1===t)throw new Error("Not a valid media type: ".concat(e));var r=e.slice(0,t);if(!["application","image","text","video"].includes(r))throw new Error("Not a valid media type: ".concat(e));if(e.slice(t+1).includes("/"))throw new Error("Not a valid media type: ".concat(e))}},{key:"_parseMediaType",value:function(t){return e._assertMediaTypeIsValid(t),t.split("/")}},{key:"_buildAcceptHeaderFieldValue",value:function(t,r){if(!Array.isArray(t))throw new Error("Acceptable media types must be provided as an Array");return t.map((function(t){var n=t.mediaType;if(e._assertMediaTypeIsValid(n),!r.includes(n))throw new Error("Media type ".concat(n," is not supported for requested resource"));return n})).join(", ")}},{key:"_buildMultipartAcceptHeaderFieldValue",value:function(t,r){if(!Array.isArray(t))throw new Error("Acceptable media types must be provided as an Array");if(!Array.isArray(r)&&!d(r))throw new Error("Supported media types must be provided as an Array or an Object");var n=[];return t.forEach((function(t){var a=t.transferSyntaxUID,i=t.mediaType;e._assertMediaTypeIsValid(i);var s='multipart/related; type="'.concat(i,'"');if(d(r)){if(!(Object.values(r).flat(1).includes(i)||i.endsWith("/*")&&i.endsWith("/")))throw new Error("Media type ".concat(i," is not supported for requested resource"));if(a){if("*"!==a){if(!Object.keys(r).includes(a))throw new Error("Transfer syntax ".concat(a," is not supported for requested resource"));var o=r[a];if(!o.includes(i)){var c=e._parseMediaType(i)[0];o.map((function(t){var r=e._parseMediaType(t)[0];if(c!==r||!i.endsWith("/*")&&!i.endsWith("/"))throw new Error("Transfer syntax ".concat(a," is not supported for requested resource"))}))}}s+="; transfer-syntax=".concat(a)}}else if(Array.isArray(r)&&!r.includes(i))throw new Error("Media type ".concat(i," is not supported for requested resource"));n.push(s)})),n.join(", ")}},{key:"_buildRangeHeaderFieldValue",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return 1===e.length?"bytes=".concat(e[0],"-"):2===e.length?"bytes=".concat(e[0],"-").concat(e[1]):"bytes=0-"}},{key:"_getSharedMediaTypes",value:function(t){var r=new Set;return t&&t.length?(t.forEach((function(t){var n=t.mediaType,a=e._parseMediaType(n)[0];r.add("".concat(a,"/"))})),Array.from(r)):r}},{key:"_getCommonMediaType",value:function(t){if(!t||!t.length)throw new Error("No acceptable media types provided");var r=e._getSharedMediaTypes(t);if(0===r.length)throw new Error("No common acceptable media type could be identified.");if(r.length>1)throw new Error("Acceptable media types must have the same type.");return r[0]}}],r&&a(t.prototype,r),i&&a(t,i),Object.defineProperty(t,"prototype",{writable:!1}),e}()}}}]); +//# sourceMappingURL=604.bundle.9477bed4d89c962cb3df.js.map \ No newline at end of file diff --git a/resources/604.bundle.9477bed4d89c962cb3df.js.map b/resources/604.bundle.9477bed4d89c962cb3df.js.map new file mode 100644 index 0000000..5295769 --- /dev/null +++ b/resources/604.bundle.9477bed4d89c962cb3df.js.map @@ -0,0 +1 @@ +{"version":3,"file":"604.bundle.9477bed4d89c962cb3df.js","mappings":"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","sources":["webpack:///../../../node_modules/dicomweb-client/src/message.js","webpack:///../../../node_modules/dicomweb-client/src/api.js","webpack:///../../../node_modules/dicomweb-client/src/version.js","webpack:///../../../node_modules/dicomweb-client/src/dicomweb-client.js"],"sourcesContent":["/**\n * Converts a Uint8Array to a String.\n * @param {Uint8Array} array that should be converted\n * @param {Number} offset array offset in case only subset of array items should\n be extracted (default: 0)\n * @param {Number} limit maximum number of array items that should be extracted\n (defaults to length of array)\n * @returns {String}\n */\nfunction uint8ArrayToString(arr, offset = 0, limit) {\n const itemLimit = limit || arr.length - offset;\n let str = '';\n for (let i = offset; i < offset + itemLimit; i++) {\n str += String.fromCharCode(arr[i]);\n }\n return str;\n}\n\n/**\n * Converts a String to a Uint8Array.\n * @param {String} str string that should be converted\n * @returns {Uint8Array}\n */\nfunction stringToUint8Array(str) {\n const arr = new Uint8Array(str.length);\n for (let i = 0, j = str.length; i < j; i++) {\n arr[i] = str.charCodeAt(i);\n }\n return arr;\n}\n\n/**\n * Identifies the boundary in a multipart/related message header.\n * @param {String} header message header\n * @returns {String} boundary\n */\nfunction identifyBoundary(header) {\n const parts = header.split('\\r\\n');\n\n for (let i = 0; i < parts.length; i++) {\n if (parts[i].substr(0, 2) === '--') {\n return parts[i];\n }\n }\n\n return null;\n}\n\n/**\n * Checks whether a given token is contained by a message at a given offset.\n * @param {Uint8Array} message message content\n * @param {Uint8Array} token substring that should be present\n * @param {Number} offset offset in message content from where search should start\n * @returns {Boolean} whether message contains token at offset\n */\nfunction containsToken(message, token, offset = 0) {\n if (offset + token.length > message.length) {\n return false;\n }\n\n let index = offset;\n for (let i = 0; i < token.length; i++) {\n if (token[i] !== message[index]) {\n return false;\n }\n\n index += 1;\n }\n return true;\n}\n\n/**\n * Finds a given token in a message at a given offset.\n * @param {Uint8Array} message message content\n * @param {Uint8Array} token substring that should be found\n * @param {String} offset message body offset from where search should start\n * @returns {Boolean} whether message has a part at given offset or not\n */\nfunction findToken(message, token, offset = 0, maxSearchLength) {\n let searchLength = message.length;\n if (maxSearchLength) {\n searchLength = Math.min(offset + maxSearchLength, message.length);\n }\n\n for (let i = offset; i < searchLength; i++) {\n // If the first value of the message matches\n // the first value of the token, check if\n // this is the full token.\n if (message[i] === token[0]) {\n if (containsToken(message, token, i)) {\n return i;\n }\n }\n }\n\n return -1;\n}\n\n/**\n * Create a random GUID\n *\n * @return {string}\n */\nfunction guid() {\n function s4() {\n return Math.floor((1 + Math.random()) * 0x10000)\n .toString(16)\n .substring(1);\n }\n return `${s4() + s4()}-${s4()}-${s4()}-${s4()}-${s4()}${s4()}${s4()}`;\n}\n\n/**\n * @typedef {Object} MultipartEncodedData\n * @property {ArrayBuffer} data The encoded Multipart Data\n * @property {String} boundary The boundary used to divide pieces of the encoded data\n */\n\n/**\n * Encode one or more DICOM datasets into a single body so it can be\n * sent using the Multipart Content-Type.\n *\n * @param {ArrayBuffer[]} datasets Array containing each file to be encoded in the\n multipart body, passed as ArrayBuffers.\n * @param {String} [boundary] Optional string to define a boundary between each part\n of the multipart body. If this is not specified, a random\n GUID will be generated.\n * @return {MultipartEncodedData} The Multipart encoded data returned as an Object. This\n contains both the data itself, and the boundary string\n used to divide it.\n */\nfunction multipartEncode(\n datasets,\n boundary = guid(),\n contentType = 'application/dicom',\n) {\n const contentTypeString = `Content-Type: ${contentType}`;\n const header = `\\r\\n--${boundary}\\r\\n${contentTypeString}\\r\\n\\r\\n`;\n const footer = `\\r\\n--${boundary}--`;\n const headerArray = stringToUint8Array(header);\n const footerArray = stringToUint8Array(footer);\n const headerLength = headerArray.length;\n const footerLength = footerArray.length;\n\n let length = 0;\n\n // Calculate the total length for the final array\n const contentArrays = datasets.map(datasetBuffer => {\n const contentArray = new Uint8Array(datasetBuffer);\n const contentLength = contentArray.length;\n\n length += headerLength + contentLength + footerLength;\n\n return contentArray;\n });\n\n // Allocate the array\n const multipartArray = new Uint8Array(length);\n\n // Set the initial header\n multipartArray.set(headerArray, 0);\n\n // Write each dataset into the multipart array\n let position = 0;\n contentArrays.forEach(contentArray => {\n multipartArray.set(headerArray, position);\n multipartArray.set(contentArray, position + headerLength);\n\n position += headerLength + contentArray.length;\n });\n\n multipartArray.set(footerArray, position);\n\n return {\n data: multipartArray.buffer,\n boundary,\n };\n}\n\n/**\n * Decode a Multipart encoded ArrayBuffer and return the components as an Array.\n *\n * @param {ArrayBuffer} response Data encoded as a 'multipart/related' message\n * @returns {Array} The content\n */\nfunction multipartDecode(response) {\n const message = new Uint8Array(response);\n\n /* Set a maximum length to search for the header boundaries, otherwise\n findToken can run for a long time\n */\n const maxSearchLength = 1000;\n\n // First look for the multipart mime header\n const separator = stringToUint8Array('\\r\\n\\r\\n');\n const headerIndex = findToken(message, separator, 0, maxSearchLength);\n if (headerIndex === -1) {\n throw new Error('Response message has no multipart mime header');\n }\n\n const header = uint8ArrayToString(message, 0, headerIndex);\n const boundaryString = identifyBoundary(header);\n if (!boundaryString) {\n throw new Error('Header of response message does not specify boundary');\n }\n\n const boundary = stringToUint8Array(boundaryString);\n const boundaryLength = boundary.length;\n const components = [];\n\n let offset = boundaryLength;\n\n // Loop until we cannot find any more boundaries\n let boundaryIndex;\n\n while (boundaryIndex !== -1) {\n // Search for the next boundary in the message, starting\n // from the current offset position\n boundaryIndex = findToken(message, boundary, offset);\n\n // If no further boundaries are found, stop here.\n if (boundaryIndex === -1) {\n break;\n }\n\n const headerTokenIndex = findToken(\n message,\n separator,\n offset,\n maxSearchLength,\n );\n if (headerTokenIndex === -1) {\n throw new Error('Response message part has no mime header');\n }\n offset = headerTokenIndex + separator.length;\n\n // Extract data from response message, excluding \"\\r\\n\"\n const spacingLength = 2;\n const data = response.slice(offset, boundaryIndex - spacingLength);\n\n // Add the data to the array of results\n components.push(data);\n\n // Move the offset to the end of the current section,\n // plus the identified boundary\n offset = boundaryIndex + boundaryLength;\n }\n\n return components;\n}\n\nexport {\n containsToken,\n findToken,\n identifyBoundary,\n uint8ArrayToString,\n stringToUint8Array,\n multipartEncode,\n multipartDecode,\n guid,\n};\n","import { multipartEncode, multipartDecode } from './message.js';\n\nfunction isObject(obj) {\n return typeof obj === 'object' && obj !== null;\n}\n\nfunction isEmptyObject(obj) {\n return Object.keys(obj).length === 0 && obj.constructor === Object;\n}\n\nfunction areValidRequestHooks(requestHooks) {\n const isValid =\n Array.isArray(requestHooks) &&\n requestHooks.every(\n requestHook =>\n typeof requestHook === 'function' && requestHook.length === 2,\n );\n\n if (!isValid) {\n console.warn(\n 'Request hooks should have the following signature: ' +\n 'function requestHook(request, metadata) { return request; }',\n );\n }\n\n return isValid;\n}\n\nconst getFirstResult = result => result[0];\n\nconst MEDIATYPES = {\n DICOM: 'application/dicom',\n DICOM_JSON: 'application/dicom+json',\n OCTET_STREAM: 'application/octet-stream',\n PDF: 'application/pdf',\n JPEG: 'image/jpeg',\n PNG: 'image/png',\n};\n\n/**\n * @typedef { import(\"../types/types\").InstanceMetadata } InstanceMetadata\n */\n\n/**\n * A callback with the request instance and metadata information\n * of the currently request being executed that should necessarily\n * return the given request optionally modified.\n * @typedef {function} RequestHook\n * @param {XMLHttpRequest} request - The original XMLHttpRequest instance.\n * @param {object} metadata - The metadata used by the request.\n */\n\n/**\n * Class for interacting with DICOMweb RESTful services.\n */\nclass DICOMwebClient {\n /**\n * @constructor\n * @param {Object} options\n * @param {String} options.url - URL of the DICOMweb RESTful Service endpoint\n * @param {String=} options.qidoURLPrefix - URL path prefix for QIDO-RS\n * @param {String=} options.wadoURLPrefix - URL path prefix for WADO-RS\n * @param {String=} options.stowURLPrefix - URL path prefix for STOW-RS\n * @param {String=} options.username - Username\n * @param {String=} options.password - Password\n * @param {Object=} options.headers - HTTP headers\n * @param {Array.=} options.requestHooks - Request hooks.\n * @param {Object=} options.verbose - print to console request warnings and errors, default true\n */\n constructor(options) {\n this.baseURL = options.url;\n if (!this.baseURL) {\n console.error('no DICOMweb base url provided - calls that require a URL will fail');\n }\n\n if ('username' in options) {\n this.username = options.username;\n if (!('password' in options)) {\n console.error(\n 'no password provided to authenticate with DICOMweb service',\n );\n }\n this.password = options.password;\n }\n\n if ('qidoURLPrefix' in options) {\n console.log(`use URL prefix for QIDO-RS: ${options.qidoURLPrefix}`);\n this.qidoURL = `${this.baseURL}/${options.qidoURLPrefix}`;\n } else {\n this.qidoURL = this.baseURL;\n }\n\n if ('wadoURLPrefix' in options) {\n console.log(`use URL prefix for WADO-RS: ${options.wadoURLPrefix}`);\n this.wadoURL = `${this.baseURL}/${options.wadoURLPrefix}`;\n } else {\n this.wadoURL = this.baseURL;\n }\n\n if ('stowURLPrefix' in options) {\n console.log(`use URL prefix for STOW-RS: ${options.stowURLPrefix}`);\n this.stowURL = `${this.baseURL}/${options.stowURLPrefix}`;\n } else {\n this.stowURL = this.baseURL;\n }\n\n if ('requestHooks' in options) {\n this.requestHooks = options.requestHooks;\n }\n\n // Headers to pass to requests.\n this.headers = options.headers || {};\n\n // Optional error interceptor callback to handle any failed request.\n this.errorInterceptor = options.errorInterceptor || (() => undefined);\n\n // Verbose - print to console request warnings and errors, default true\n this.verbose = options.verbose !== false;\n }\n\n /**\n * Sets verbose flag.\n *\n * @param {Boolean} verbose\n */\n setVerbose(verbose) {\n this.verbose = verbose;\n }\n\n /**\n * Gets verbose flag.\n *\n * @return {Boolean} verbose\n */\n getVerbose() {\n return this.verbose;\n }\n\n static _parseQueryParameters(params = {}) {\n let queryString = '?';\n Object.keys(params).forEach((key, index) => {\n if (index !== 0) {\n queryString += '&';\n }\n queryString += `${key}=${encodeURIComponent(params[key])}`;\n });\n return queryString;\n }\n\n /**\n * Performs an HTTP request.\n *\n * @param {String} url\n * @param {String} method\n * @param {Object} headers\n * @param {Object} options\n * @param {Array.} options.requestHooks - Request hooks.\n * @param {XMLHttpRequest} [options.request] - if specified, the request to use, otherwise one will be created; useful for adding custom upload and abort listeners/objects\n * @return {*}\n * @private\n */\n _httpRequest(url, method, headers = {}, options = {}) {\n const { errorInterceptor, requestHooks } = this;\n\n return new Promise((resolve, reject) => {\n let request = options.request ? options.request : new XMLHttpRequest();\n\n request.open(method, url, true);\n if ('responseType' in options) {\n request.responseType = options.responseType;\n }\n\n if (typeof headers === 'object') {\n Object.keys(headers).forEach(key => {\n request.setRequestHeader(key, headers[key]);\n });\n }\n\n // now add custom headers from the user\n // (e.g. access tokens)\n const userHeaders = this.headers;\n Object.keys(userHeaders).forEach(key => {\n request.setRequestHeader(key, userHeaders[key]);\n });\n\n // Event triggered when upload starts\n request.onloadstart = function onloadstart() {\n // console.log('upload started: ', url)\n };\n\n // Event triggered when upload ends\n request.onloadend = function onloadend() {\n // console.log('upload finished')\n };\n\n // Handle response message\n request.onreadystatechange = () => {\n if (request.readyState === 4) {\n if (request.status === 200) {\n resolve(request.response);\n } else if (request.status === 202) {\n if (this.verbose) {\n console.warn('some resources already existed: ', request);\n }\n resolve(request.response);\n } else if (request.status === 204) {\n if (this.verbose) {\n console.warn('empty response for request: ', request);\n }\n resolve([]);\n } else {\n const error = new Error('request failed');\n error.request = request;\n error.response = request.response;\n error.status = request.status;\n if (this.verbose) {\n console.error('request failed: ', request);\n console.error(error);\n console.error(error.response);\n }\n\n errorInterceptor(error);\n\n reject(error);\n }\n }\n };\n\n // Event triggered while download progresses\n if ('progressCallback' in options) {\n if (typeof options.progressCallback === 'function') {\n request.onprogress = options.progressCallback;\n }\n }\n\n if (requestHooks && areValidRequestHooks(requestHooks)) {\n const combinedHeaders = Object.assign({}, headers, this.headers);\n const metadata = { method, url, headers: combinedHeaders };\n const pipeRequestHooks = functions => args =>\n functions.reduce((props, fn) => fn(props, metadata), args);\n const pipedRequest = pipeRequestHooks(requestHooks);\n request = pipedRequest(request);\n }\n\n // Add withCredentials to request if needed\n if ('withCredentials' in options) {\n if (options.withCredentials) {\n request.withCredentials = true;\n }\n }\n\n if ('data' in options) {\n request.send(options.data);\n } else {\n request.send();\n }\n });\n }\n\n /**\n * Performs an HTTP GET request.\n *\n * @param {String} url\n * @param {Object} headers\n * @param {Object} responseType\n * @param {Function} progressCallback\n * @return {*}\n * @private\n */\n _httpGet(url, headers, responseType, progressCallback, withCredentials) {\n return this._httpRequest(url, 'get', headers, {\n responseType,\n progressCallback,\n withCredentials,\n });\n }\n\n /**\n * Performs an HTTP GET request that accepts a message with application/json\n * media type.\n *\n * @param {String} url\n * @param {Object} params\n * @param {Function} progressCallback\n * @return {*}\n * @private\n */\n _httpGetApplicationJson(url, params = {}, progressCallback, withCredentials) {\n let urlWithQueryParams = url;\n\n if (typeof params === 'object') {\n if (!isEmptyObject(params)) {\n urlWithQueryParams += DICOMwebClient._parseQueryParameters(params);\n }\n }\n const headers = { Accept: MEDIATYPES.DICOM_JSON };\n const responseType = 'json';\n return this._httpGet(\n urlWithQueryParams,\n headers,\n responseType,\n progressCallback,\n withCredentials,\n );\n }\n\n /**\n * Performs an HTTP GET request that accepts a message with application/pdf\n * media type.\n *\n * @param {String} url\n * @param {Object} params\n * @param {Function} progressCallback\n * @return {*}\n * @private\n */\n _httpGetApplicationPdf(url, params = {}, progressCallback, withCredentials) {\n let urlWithQueryParams = url;\n\n if (typeof params === 'object') {\n if (!isEmptyObject(params)) {\n urlWithQueryParams += DICOMwebClient._parseQueryParameters(params);\n }\n }\n const headers = { Accept: MEDIATYPES.PDF };\n const responseType = 'json';\n return this._httpGet(\n urlWithQueryParams,\n headers,\n responseType,\n progressCallback,\n withCredentials,\n );\n }\n\n /**\n * Performs an HTTP GET request that accepts a message with an image\n media type.\n *\n * @param {String} url\n * @param {Object[]} mediaTypes\n * @param {Object} params\n * @param {Function} progressCallback\n * @return {*}\n * @private\n */\n _httpGetImage(\n url,\n mediaTypes,\n params = {},\n progressCallback,\n withCredentials,\n ) {\n let urlWithQueryParams = url;\n\n if (typeof params === 'object') {\n if (!isEmptyObject(params)) {\n urlWithQueryParams += DICOMwebClient._parseQueryParameters(params);\n }\n }\n\n const supportedMediaTypes = [\n 'image/',\n 'image/*',\n 'image/jpeg',\n 'image/jp2',\n 'image/gif',\n 'image/png',\n ];\n\n const acceptHeaderFieldValue = DICOMwebClient._buildAcceptHeaderFieldValue(\n mediaTypes,\n supportedMediaTypes,\n );\n const headers = { Accept: acceptHeaderFieldValue };\n const responseType = 'arraybuffer';\n return this._httpGet(\n urlWithQueryParams,\n headers,\n responseType,\n progressCallback,\n withCredentials,\n );\n }\n\n /**\n * Performs an HTTP GET request that accepts a message with a text\n media type.\n *\n * @param {String} url\n * @param {Object[]} mediaTypes\n * @param {Object} params\n * @param {Function} progressCallback\n * @return {*}\n * @private\n */\n _httpGetText(\n url,\n mediaTypes,\n params = {},\n progressCallback,\n withCredentials,\n ) {\n let urlWithQueryParams = url;\n\n if (typeof params === 'object') {\n if (!isEmptyObject(params)) {\n urlWithQueryParams += DICOMwebClient._parseQueryParameters(params);\n }\n }\n\n const supportedMediaTypes = [\n 'text/',\n 'text/*',\n 'text/html',\n 'text/plain',\n 'text/rtf',\n 'text/xml',\n ];\n\n const acceptHeaderFieldValue = DICOMwebClient._buildAcceptHeaderFieldValue(\n mediaTypes,\n supportedMediaTypes,\n );\n const headers = { Accept: acceptHeaderFieldValue };\n const responseType = 'arraybuffer';\n return this._httpGet(\n urlWithQueryParams,\n headers,\n responseType,\n progressCallback,\n withCredentials,\n );\n }\n\n /**\n * Performs an HTTP GET request that accepts a message with a video\n media type.\n *\n * @param {String} url\n * @param {Object[]} mediaTypes\n * @param {Object} params\n * @param {Function} progressCallback\n * @return {*}\n * @private\n */\n _httpGetVideo(\n url,\n mediaTypes,\n params = {},\n progressCallback,\n withCredentials,\n ) {\n let urlWithQueryParams = url;\n\n if (typeof params === 'object') {\n if (!isEmptyObject(params)) {\n urlWithQueryParams += DICOMwebClient._parseQueryParameters(params);\n }\n }\n\n const supportedMediaTypes = [\n 'video/',\n 'video/*',\n 'video/mpeg',\n 'video/mp4',\n 'video/H265',\n ];\n\n const acceptHeaderFieldValue = DICOMwebClient._buildAcceptHeaderFieldValue(\n mediaTypes,\n supportedMediaTypes,\n );\n const headers = { Accept: acceptHeaderFieldValue };\n const responseType = 'arraybuffer';\n return this._httpGet(\n urlWithQueryParams,\n headers,\n responseType,\n progressCallback,\n withCredentials,\n );\n }\n\n /**\n * Asserts that a given media type is valid.\n *\n * @params {String} mediaType media type\n */\n static _assertMediaTypeIsValid(mediaType) {\n if (!mediaType) {\n throw new Error(`Not a valid media type: ${mediaType}`);\n }\n\n const sepIndex = mediaType.indexOf('/');\n if (sepIndex === -1) {\n throw new Error(`Not a valid media type: ${mediaType}`);\n }\n\n const mediaTypeType = mediaType.slice(0, sepIndex);\n const types = ['application', 'image', 'text', 'video'];\n if (!types.includes(mediaTypeType)) {\n throw new Error(`Not a valid media type: ${mediaType}`);\n }\n\n if (mediaType.slice(sepIndex + 1).includes('/')) {\n throw new Error(`Not a valid media type: ${mediaType}`);\n }\n }\n\n /**\n * Performs an HTTP GET request that accepts a multipart message with an image media type.\n *\n * @param {String} url - Unique resource locator\n * @param {Object[]} mediaTypes - Acceptable media types and optionally the UIDs of the\n corresponding transfer syntaxes\n * @param {Array} byteRange - Start and end of byte range\n * @param {Object} params - Additional HTTP GET query parameters\n * @param {Boolean} rendered - Whether resource should be requested using rendered media types\n * @param {Function} progressCallback\n * @private\n * @returns {Promise} Content of HTTP message body parts\n */\n _httpGetMultipartImage(\n url,\n mediaTypes,\n byteRange,\n params,\n rendered = false,\n progressCallback,\n withCredentials,\n ) {\n const headers = {};\n let supportedMediaTypes;\n if (rendered) {\n supportedMediaTypes = [\n 'image/jpeg',\n 'image/gif',\n 'image/png',\n 'image/jp2',\n ];\n } else {\n supportedMediaTypes = {\n '1.2.840.10008.1.2.5': ['image/x-dicom-rle'],\n '1.2.840.10008.1.2.4.50': ['image/jpeg'],\n '1.2.840.10008.1.2.4.51': ['image/jpeg'],\n '1.2.840.10008.1.2.4.57': ['image/jpeg'],\n '1.2.840.10008.1.2.4.70': ['image/jpeg'],\n '1.2.840.10008.1.2.4.80': ['image/x-jls', 'image/jls'],\n '1.2.840.10008.1.2.4.81': ['image/x-jls', 'image/jls'],\n '1.2.840.10008.1.2.4.90': ['image/jp2'],\n '1.2.840.10008.1.2.4.91': ['image/jp2'],\n '1.2.840.10008.1.2.4.92': ['image/jpx'],\n '1.2.840.10008.1.2.4.93': ['image/jpx'],\n };\n\n if (byteRange) {\n headers.Range = DICOMwebClient._buildRangeHeaderFieldValue(byteRange);\n }\n }\n\n headers.Accept = DICOMwebClient._buildMultipartAcceptHeaderFieldValue(\n mediaTypes,\n supportedMediaTypes,\n );\n\n return this._httpGet(\n url,\n headers,\n 'arraybuffer',\n progressCallback,\n withCredentials,\n ).then(multipartDecode);\n }\n\n /**\n * Performs an HTTP GET request that accepts a multipart message with a video media type.\n *\n * @param {String} url - Unique resource locator\n * @param {Object[]} mediaTypes - Acceptable media types and optionally the UIDs of the\n corresponding transfer syntaxes\n * @param {Array} byteRange - Start and end of byte range\n * @param {Object} params - Additional HTTP GET query parameters\n * @param {Boolean} rendered - Whether resource should be requested using rendered media types\n * @param {Function} progressCallback\n * @private\n * @returns {Promise} Content of HTTP message body parts\n */\n _httpGetMultipartVideo(\n url,\n mediaTypes,\n byteRange,\n params,\n rendered = false,\n progressCallback,\n withCredentials,\n ) {\n const headers = {};\n let supportedMediaTypes;\n if (rendered) {\n supportedMediaTypes = [\n 'video/',\n 'video/*',\n 'video/mpeg2',\n 'video/mp4',\n 'video/H265',\n ];\n } else {\n supportedMediaTypes = {\n '1.2.840.10008.1.2.4.100': ['video/mpeg2'],\n '1.2.840.10008.1.2.4.101': ['video/mpeg2'],\n '1.2.840.10008.1.2.4.102': ['video/mp4'],\n '1.2.840.10008.1.2.4.103': ['video/mp4'],\n '1.2.840.10008.1.2.4.104': ['video/mp4'],\n '1.2.840.10008.1.2.4.105': ['video/mp4'],\n '1.2.840.10008.1.2.4.106': ['video/mp4'],\n };\n\n if (byteRange) {\n headers.Range = DICOMwebClient._buildRangeHeaderFieldValue(byteRange);\n }\n }\n\n headers.Accept = DICOMwebClient._buildMultipartAcceptHeaderFieldValue(\n mediaTypes,\n supportedMediaTypes,\n );\n\n return this._httpGet(\n url,\n headers,\n 'arraybuffer',\n progressCallback,\n withCredentials,\n ).then(multipartDecode);\n }\n\n /**\n * Performs an HTTP GET request that accepts a multipart message\n * with a application/dicom media type.\n *\n * @param {String} url - Unique resource locator\n * @param {Object[]} mediaTypes - Acceptable media types and optionally the UIDs of the\n corresponding transfer syntaxes\n * @param {Object} params - Additional HTTP GET query parameters\n * @param {Function} progressCallback\n * @private\n * @returns {Promise} Content of HTTP message body parts\n */\n _httpGetMultipartApplicationDicom(\n url,\n mediaTypes,\n params,\n progressCallback,\n withCredentials,\n ) {\n const headers = {};\n const defaultMediaType = 'application/dicom';\n const supportedMediaTypes = {\n '1.2.840.10008.1.2.1': [defaultMediaType],\n '1.2.840.10008.1.2.5': [defaultMediaType],\n '1.2.840.10008.1.2.4.50': [defaultMediaType],\n '1.2.840.10008.1.2.4.51': [defaultMediaType],\n '1.2.840.10008.1.2.4.57': [defaultMediaType],\n '1.2.840.10008.1.2.4.70': [defaultMediaType],\n '1.2.840.10008.1.2.4.80': [defaultMediaType],\n '1.2.840.10008.1.2.4.81': [defaultMediaType],\n '1.2.840.10008.1.2.4.90': [defaultMediaType],\n '1.2.840.10008.1.2.4.91': [defaultMediaType],\n '1.2.840.10008.1.2.4.92': [defaultMediaType],\n '1.2.840.10008.1.2.4.93': [defaultMediaType],\n '1.2.840.10008.1.2.4.100': [defaultMediaType],\n '1.2.840.10008.1.2.4.101': [defaultMediaType],\n '1.2.840.10008.1.2.4.102': [defaultMediaType],\n '1.2.840.10008.1.2.4.103': [defaultMediaType],\n '1.2.840.10008.1.2.4.104': [defaultMediaType],\n '1.2.840.10008.1.2.4.105': [defaultMediaType],\n '1.2.840.10008.1.2.4.106': [defaultMediaType],\n };\n\n let acceptableMediaTypes = mediaTypes;\n if (!mediaTypes) {\n acceptableMediaTypes = [{ mediaType: defaultMediaType }];\n }\n\n headers.Accept = DICOMwebClient._buildMultipartAcceptHeaderFieldValue(\n acceptableMediaTypes,\n supportedMediaTypes,\n );\n\n return this._httpGet(\n url,\n headers,\n 'arraybuffer',\n progressCallback,\n withCredentials,\n ).then(multipartDecode);\n }\n\n /**\n * Performs an HTTP GET request that accepts a multipart message\n * with a application/octet-stream media type.\n *\n * @param {String} url - Unique resource locator\n * @param {Object[]} mediaTypes - Acceptable media types and optionally the UIDs of the\n corresponding transfer syntaxes\n * @param {Array} byteRange start and end of byte range\n * @param {Object} params - Additional HTTP GET query parameters\n * @param {Function} progressCallback\n * @private\n * @returns {Promise} Content of HTTP message body parts\n */\n _httpGetMultipartApplicationOctetStream(\n url,\n mediaTypes,\n byteRange,\n params,\n progressCallback,\n withCredentials,\n ) {\n const headers = {};\n const defaultMediaType = 'application/octet-stream';\n const supportedMediaTypes = {\n '1.2.840.10008.1.2.1': [defaultMediaType],\n };\n\n let acceptableMediaTypes = mediaTypes;\n if (!mediaTypes) {\n acceptableMediaTypes = [{ mediaType: defaultMediaType }];\n }\n\n if (byteRange) {\n headers.Range = DICOMwebClient._buildRangeHeaderFieldValue(byteRange);\n }\n\n headers.Accept = DICOMwebClient._buildMultipartAcceptHeaderFieldValue(\n acceptableMediaTypes,\n supportedMediaTypes,\n );\n\n return this._httpGet(\n url,\n headers,\n 'arraybuffer',\n progressCallback,\n withCredentials,\n ).then(multipartDecode);\n }\n\n /**\n * Performs an HTTP POST request.\n *\n * @param {String} url - Unique resource locator\n * @param {Object} headers - HTTP header fields\n * @param {Array} data - Data that should be stored\n * @param {Function} progressCallback\n * @param {Function} progressCallback\n * @param {XMLHttpRequest} request - if specified, the request to use, otherwise one will be created; useful for adding custom upload and abort listeners/objects\n * @private\n * @returns {Promise} Response\n */\n _httpPost(url, headers, data, progressCallback, withCredentials, request) {\n return this._httpRequest(url, 'post', headers, {\n data,\n progressCallback,\n withCredentials,\n request,\n });\n }\n\n /**\n * Performs an HTTP POST request with content-type application/dicom+json.\n *\n * @param {String} url - Unique resource locator\n * @param {Object} headers - HTTP header fields\n * @param {Array} data - Data that should be stored\n * @param {Function} progressCallback\n * @private\n * @returns {Promise} Response\n */\n _httpPostApplicationJson(url, data, progressCallback, withCredentials) {\n const headers = { 'Content-Type': MEDIATYPES.DICOM_JSON };\n return this._httpPost(\n url,\n headers,\n data,\n progressCallback,\n withCredentials,\n );\n }\n\n /**\n * Parses media type and extracts its type and subtype.\n *\n * @param {String} mediaType - HTTP media type (e.g. image/jpeg)\n * @private\n * @returns {String[]} Media type and subtype\n */\n static _parseMediaType(mediaType) {\n DICOMwebClient._assertMediaTypeIsValid(mediaType);\n\n return mediaType.split('/');\n }\n\n /**\n * Builds an accept header field value for HTTP GET request messages.\n *\n * @param {Object[]} mediaTypes - Acceptable media types\n * @param {Object[]} supportedMediaTypes - Supported media types\n * @return {*}\n * @private\n */\n static _buildAcceptHeaderFieldValue(mediaTypes, supportedMediaTypes) {\n if (!Array.isArray(mediaTypes)) {\n throw new Error('Acceptable media types must be provided as an Array');\n }\n\n const fieldValueParts = mediaTypes.map(item => {\n const { mediaType } = item;\n\n DICOMwebClient._assertMediaTypeIsValid(mediaType);\n if (!supportedMediaTypes.includes(mediaType)) {\n throw new Error(\n `Media type ${mediaType} is not supported for requested resource`,\n );\n }\n\n return mediaType;\n });\n\n return fieldValueParts.join(', ');\n }\n\n /**\n * Builds an accept header field value for HTTP GET multipart request\n messages.\n *\n * @param {Object[]} mediaTypes - Acceptable media types\n * @param {Object[]} supportedMediaTypes - Supported media types\n * @private\n */\n static _buildMultipartAcceptHeaderFieldValue(\n mediaTypes,\n supportedMediaTypes,\n ) {\n if (!Array.isArray(mediaTypes)) {\n throw new Error('Acceptable media types must be provided as an Array');\n }\n\n if (!Array.isArray(supportedMediaTypes) && !isObject(supportedMediaTypes)) {\n throw new Error(\n 'Supported media types must be provided as an Array or an Object',\n );\n }\n\n const fieldValueParts = [];\n\n mediaTypes.forEach(item => {\n const { transferSyntaxUID, mediaType } = item;\n DICOMwebClient._assertMediaTypeIsValid(mediaType);\n let fieldValue = `multipart/related; type=\"${mediaType}\"`;\n\n if (isObject(supportedMediaTypes)) {\n // SupportedMediaTypes is a lookup table that maps Transfer Syntax UID\n // to one or more Media Types\n if (\n !Object.values(supportedMediaTypes)\n .flat(1)\n .includes(mediaType)\n ) {\n if (!mediaType.endsWith('/*') || !mediaType.endsWith('/')) {\n throw new Error(\n `Media type ${mediaType} is not supported for requested resource`,\n );\n }\n }\n\n if (transferSyntaxUID) {\n if (transferSyntaxUID !== '*') {\n if (!Object.keys(supportedMediaTypes).includes(transferSyntaxUID)) {\n throw new Error(\n `Transfer syntax ${transferSyntaxUID} is not supported for requested resource`,\n );\n }\n\n const expectedMediaTypes = supportedMediaTypes[transferSyntaxUID];\n\n if (!expectedMediaTypes.includes(mediaType)) {\n const actualType = DICOMwebClient._parseMediaType(mediaType)[0];\n expectedMediaTypes.map(expectedMediaType => {\n const expectedType = DICOMwebClient._parseMediaType(\n expectedMediaType,\n )[0];\n const haveSameType = actualType === expectedType;\n\n if (\n haveSameType &&\n (mediaType.endsWith('/*') || mediaType.endsWith('/'))\n ) {\n return;\n }\n\n throw new Error(\n `Transfer syntax ${transferSyntaxUID} is not supported for requested resource`,\n );\n });\n }\n }\n\n fieldValue += `; transfer-syntax=${transferSyntaxUID}`;\n }\n } else if (\n Array.isArray(supportedMediaTypes) &&\n !supportedMediaTypes.includes(mediaType)\n ) {\n throw new Error(\n `Media type ${mediaType} is not supported for requested resource`,\n );\n }\n\n fieldValueParts.push(fieldValue);\n });\n\n return fieldValueParts.join(', ');\n }\n\n /**\n * Builds a range header field value for HTTP GET request messages.\n *\n * @param {Array} byteRange - Start and end of byte range\n * @returns {String} Range header field value\n * @private\n */\n static _buildRangeHeaderFieldValue(byteRange = []) {\n if (byteRange.length === 1) {\n return `bytes=${byteRange[0]}-`;\n }\n if (byteRange.length === 2) {\n return `bytes=${byteRange[0]}-${byteRange[1]}`;\n }\n\n return 'bytes=0-';\n }\n\n /**\n * Gets types that are shared among acceptable media types.\n *\n * @param {Object[]} mediaTypes - Acceptable media types and optionally the UIDs of the\n corresponding transfer syntaxes\n * @private\n * @returns {String[]} Types that are shared among acceptable media types\n */\n static _getSharedMediaTypes(mediaTypes) {\n const types = new Set();\n\n if (!mediaTypes || !mediaTypes.length) {\n return types;\n }\n\n mediaTypes.forEach(item => {\n const { mediaType } = item;\n const type = DICOMwebClient._parseMediaType(mediaType)[0];\n types.add(`${type}/`);\n });\n\n return Array.from(types);\n }\n\n /**\n * Gets common type of acceptable media types and asserts that only\n one type is specified. For example, ``(\"image/jpeg\", \"image/jp2\")``\n will pass, but ``(\"image/jpeg\", \"video/mpeg2\")`` will raise an\n exception.\n *\n * @param {Object[]} mediaTypes - Acceptable media types and optionally the UIDs of the\n corresponding transfer syntaxes\n * @private\n * @returns {String[]} Common media type\n */\n static _getCommonMediaType(mediaTypes) {\n if (!mediaTypes || !mediaTypes.length) {\n throw new Error('No acceptable media types provided');\n }\n\n const sharedMediaTypes = DICOMwebClient._getSharedMediaTypes(mediaTypes);\n if (sharedMediaTypes.length === 0) {\n throw new Error('No common acceptable media type could be identified.');\n } else if (sharedMediaTypes.length > 1) {\n throw new Error('Acceptable media types must have the same type.');\n }\n\n return sharedMediaTypes[0];\n }\n\n /**\n * Searches for DICOM studies.\n *\n * @param {Object} options\n * @param {Object} [options.queryParams] - HTTP query parameters\n * @return {Object[]} Study representations (http://dicom.nema.org/medical/dicom/current/output/chtml/part18/sect_6.7.html#table_6.7.1-2)\n */\n searchForStudies(options = {}) {\n console.log('search for studies');\n let withCredentials = false;\n let url = `${this.qidoURL}/studies`;\n if ('queryParams' in options) {\n url += DICOMwebClient._parseQueryParameters(options.queryParams);\n }\n if ('withCredentials' in options) {\n if (options.withCredentials) {\n withCredentials = options.withCredentials;\n }\n }\n return this._httpGetApplicationJson(url, {}, false, withCredentials);\n }\n\n /**\n * Retrieves metadata for a DICOM study.\n *\n * @param {Object} options\n * @param {String} options.studyInstanceUID - Study Instance UID\n * @returns {Promise} Metadata elements in DICOM JSON format for each instance\n belonging to the study\n */\n retrieveStudyMetadata(options) {\n if (!('studyInstanceUID' in options)) {\n throw new Error(\n 'Study Instance UID is required for retrieval of study metadata',\n );\n }\n console.log(`retrieve metadata of study ${options.studyInstanceUID}`);\n const url = `${this.wadoURL}/studies/${options.studyInstanceUID}/metadata`;\n let withCredentials = false;\n if ('withCredentials' in options) {\n if (options.withCredentials) {\n withCredentials = options.withCredentials;\n }\n }\n return this._httpGetApplicationJson(url, {}, false, withCredentials);\n }\n\n /**\n * Searches for DICOM series.\n *\n * @param {Object} options\n * @param {Object} [options.studyInstanceUID] - Study Instance UID\n * @param {Object} [options.queryParams] - HTTP query parameters\n * @returns {Object[]} Series representations (http://dicom.nema.org/medical/dicom/current/output/chtml/part18/sect_6.7.html#table_6.7.1-2a)\n */\n searchForSeries(options = {}) {\n let url = this.qidoURL;\n if ('studyInstanceUID' in options) {\n console.log(`search series of study ${options.studyInstanceUID}`);\n url += `/studies/${options.studyInstanceUID}`;\n }\n url += '/series';\n if ('queryParams' in options) {\n url += DICOMwebClient._parseQueryParameters(options.queryParams);\n }\n let withCredentials = false;\n if ('withCredentials' in options) {\n if (options.withCredentials) {\n withCredentials = options.withCredentials;\n }\n }\n return this._httpGetApplicationJson(url, {}, false, withCredentials);\n }\n\n /**\n * Retrieves metadata for a DICOM series.\n *\n * @param {Object} options\n * @param {String} options.studyInstanceUID - Study Instance UID\n * @param {String} options.seriesInstanceUID - Series Instance UID\n * @returns {Promise} Metadata elements in DICOM JSON format for each instance\n belonging to the series\n */\n retrieveSeriesMetadata(options) {\n if (!('studyInstanceUID' in options)) {\n throw new Error(\n 'Study Instance UID is required for retrieval of series metadata',\n );\n }\n if (!('seriesInstanceUID' in options)) {\n throw new Error(\n 'Series Instance UID is required for retrieval of series metadata',\n );\n }\n\n console.log(`retrieve metadata of series ${options.seriesInstanceUID}`);\n const url = `${this.wadoURL}/studies/${options.studyInstanceUID}/series/${options.seriesInstanceUID}/metadata`;\n let withCredentials = false;\n if ('withCredentials' in options) {\n if (options.withCredentials) {\n withCredentials = options.withCredentials;\n }\n }\n return this._httpGetApplicationJson(url, {}, false, withCredentials);\n }\n\n /**\n * Searches for DICOM Instances.\n *\n * @param {Object} options\n * @param {String} [options.studyInstanceUID] - Study Instance UID\n * @param {String} [options.seriesInstanceUID] - Series Instance UID\n * @param {Object} [options.queryParams] - HTTP query parameters\n * @returns {Object[]} Instance representations (http://dicom.nema.org/medical/dicom/current/output/chtml/part18/sect_6.7.html#table_6.7.1-2b)\n */\n searchForInstances(options = {}) {\n let url = this.qidoURL;\n let withCredentials = false;\n if ('studyInstanceUID' in options) {\n url += `/studies/${options.studyInstanceUID}`;\n if ('seriesInstanceUID' in options) {\n console.log(\n `search for instances of series ${options.seriesInstanceUID}`,\n );\n url += `/series/${options.seriesInstanceUID}`;\n } else {\n console.log(\n `search for instances of study ${options.studyInstanceUID}`,\n );\n }\n } else {\n console.log('search for instances');\n }\n url += '/instances';\n if ('queryParams' in options) {\n url += DICOMwebClient._parseQueryParameters(options.queryParams);\n }\n if ('withCredentials' in options) {\n if (options.withCredentials) {\n withCredentials = options.withCredentials;\n }\n }\n return this._httpGetApplicationJson(url, {}, false, withCredentials);\n }\n\n /** Returns a WADO-URI URL for an instance\n *\n * @param {Object} options\n * @param {String} options.studyInstanceUID - Study Instance UID\n * @param {String} options.seriesInstanceUID - Series Instance UID\n * @param {String} options.sopInstanceUID - SOP Instance UID\n * @returns {String} WADO-URI URL\n */\n buildInstanceWadoURIUrl(options) {\n if (!('studyInstanceUID' in options)) {\n throw new Error('Study Instance UID is required.');\n }\n if (!('seriesInstanceUID' in options)) {\n throw new Error('Series Instance UID is required.');\n }\n if (!('sopInstanceUID' in options)) {\n throw new Error('SOP Instance UID is required.');\n }\n\n const contentType = options.contentType || MEDIATYPES.DICOM;\n const transferSyntax = options.transferSyntax || '*';\n const params = [];\n\n params.push('requestType=WADO');\n params.push(`studyUID=${options.studyInstanceUID}`);\n params.push(`seriesUID=${options.seriesInstanceUID}`);\n params.push(`objectUID=${options.sopInstanceUID}`);\n params.push(`contentType=${contentType}`);\n params.push(`transferSyntax=${transferSyntax}`);\n\n const paramString = params.join('&');\n\n return `${this.wadoURL}?${paramString}`;\n }\n\n /**\n * Retrieves metadata for a DICOM Instance.\n *\n * @param {Object} options object\n * @param {String} options.studyInstanceUID - Study Instance UID\n * @param {String} options.seriesInstanceUID - Series Instance UID\n * @param {String} options.sopInstanceUID - SOP Instance UID\n * @returns {Promise} metadata elements in DICOM JSON format\n */\n retrieveInstanceMetadata(options) {\n if (!('studyInstanceUID' in options)) {\n throw new Error(\n 'Study Instance UID is required for retrieval of instance metadata',\n );\n }\n if (!('seriesInstanceUID' in options)) {\n throw new Error(\n 'Series Instance UID is required for retrieval of instance metadata',\n );\n }\n if (!('sopInstanceUID' in options)) {\n throw new Error(\n 'SOP Instance UID is required for retrieval of instance metadata',\n );\n }\n console.log(`retrieve metadata of instance ${options.sopInstanceUID}`);\n const url = `${this.wadoURL}/studies/${options.studyInstanceUID}/series/${options.seriesInstanceUID}/instances/${options.sopInstanceUID}/metadata`;\n let withCredentials = false;\n if ('withCredentials' in options) {\n if (options.withCredentials) {\n withCredentials = options.withCredentials;\n }\n }\n return this._httpGetApplicationJson(url, {}, false, withCredentials);\n }\n\n /**\n * Retrieves frames for a DICOM Instance.\n * @param {Object} options options object\n * @param {String} options.studyInstanceUID - Study Instance UID\n * @param {String} options.seriesInstanceUID - Series Instance UID\n * @param {String} options.sopInstanceUID - SOP Instance UID\n * @param {String} options.frameNumbers - One-based indices of Frame Items\n * @returns {Array} frame items as byte arrays of the pixel data element\n */\n retrieveInstanceFrames(options) {\n if (!('studyInstanceUID' in options)) {\n throw new Error(\n 'Study Instance UID is required for retrieval of instance frames',\n );\n }\n if (!('seriesInstanceUID' in options)) {\n throw new Error(\n 'Series Instance UID is required for retrieval of instance frames',\n );\n }\n if (!('sopInstanceUID' in options)) {\n throw new Error(\n 'SOP Instance UID is required for retrieval of instance frames',\n );\n }\n if (!('frameNumbers' in options)) {\n throw new Error(\n 'frame numbers are required for retrieval of instance frames',\n );\n }\n console.log(\n `retrieve frames ${options.frameNumbers.toString()} of instance ${\n options.sopInstanceUID\n }`,\n );\n const url = `${this.wadoURL}/studies/${options.studyInstanceUID}/series/${\n options.seriesInstanceUID\n }/instances/${\n options.sopInstanceUID\n }/frames/${options.frameNumbers.toString()}`;\n\n const { mediaTypes } = options;\n let withCredentials = false;\n if ('withCredentials' in options) {\n if (options.withCredentials) {\n withCredentials = options.withCredentials;\n }\n }\n\n let progressCallback = false;\n if ('progressCallback' in options) {\n progressCallback = options.progressCallback;\n }\n\n if (!mediaTypes) {\n return this._httpGetMultipartApplicationOctetStream(\n url,\n false,\n false,\n false,\n progressCallback,\n withCredentials,\n );\n }\n\n const sharedMediaTypes = DICOMwebClient._getSharedMediaTypes(mediaTypes);\n if (sharedMediaTypes.length > 1) {\n /**\n * Enable request of frames that are stored either compressed\n * (image/* media type) or uncompressed (application/octet-stream\n * media type).\n */\n const supportedMediaTypes = {\n '1.2.840.10008.1.2.1': ['application/octet-stream'],\n '1.2.840.10008.1.2.5': ['image/x-dicom-rle'],\n '1.2.840.10008.1.2.4.50': ['image/jpeg'],\n '1.2.840.10008.1.2.4.51': ['image/jpeg'],\n '1.2.840.10008.1.2.4.57': ['image/jpeg'],\n '1.2.840.10008.1.2.4.70': ['image/jpeg'],\n '1.2.840.10008.1.2.4.80': ['image/x-jls', 'image/jls'],\n '1.2.840.10008.1.2.4.81': ['image/x-jls', 'image/jls'],\n '1.2.840.10008.1.2.4.90': ['image/jp2'],\n '1.2.840.10008.1.2.4.91': ['image/jp2'],\n '1.2.840.10008.1.2.4.92': ['image/jpx'],\n '1.2.840.10008.1.2.4.93': ['image/jpx'],\n };\n\n const headers = {\n Accept: DICOMwebClient._buildMultipartAcceptHeaderFieldValue(\n mediaTypes,\n supportedMediaTypes,\n ),\n };\n return this._httpGet(\n url,\n headers,\n 'arraybuffer',\n progressCallback,\n withCredentials,\n ).then(multipartDecode);\n }\n\n const commonMediaType = DICOMwebClient._getCommonMediaType(mediaTypes);\n\n if (commonMediaType.startsWith('application')) {\n return this._httpGetMultipartApplicationOctetStream(\n url,\n mediaTypes,\n false,\n false,\n progressCallback,\n withCredentials,\n );\n }\n if (commonMediaType.startsWith('image')) {\n return this._httpGetMultipartImage(\n url,\n mediaTypes,\n false,\n false,\n false,\n progressCallback,\n withCredentials,\n );\n }\n if (commonMediaType.startsWith('video')) {\n return this._httpGetMultipartVideo(\n url,\n mediaTypes,\n false,\n false,\n false,\n progressCallback,\n withCredentials,\n );\n }\n\n throw new Error(\n `Media type ${commonMediaType} is not supported for retrieval of frames.`,\n );\n }\n\n /**\n * Retrieves an individual, server-side rendered DICOM Instance.\n *\n * @param {Object} options\n * @param {String} options.studyInstanceUID - Study Instance UID\n * @param {String} options.seriesInstanceUID - Series Instance UID\n * @param {String} options.sopInstanceUID - SOP Instance UID\n * @param {String[]} [options.mediaType] - Acceptable HTTP media types\n * @param {Object} [options.queryParams] - HTTP query parameters\n * @returns {Promise} Rendered DICOM Instance\n */\n retrieveInstanceRendered(options) {\n if (!('studyInstanceUID' in options)) {\n throw new Error(\n 'Study Instance UID is required for retrieval of rendered instance',\n );\n }\n if (!('seriesInstanceUID' in options)) {\n throw new Error(\n 'Series Instance UID is required for retrieval of rendered instance',\n );\n }\n if (!('sopInstanceUID' in options)) {\n throw new Error(\n 'SOP Instance UID is required for retrieval of rendered instance',\n );\n }\n\n let url = `${this.wadoURL}/studies/${options.studyInstanceUID}/series/${options.seriesInstanceUID}/instances/${options.sopInstanceUID}/rendered`;\n\n const { mediaTypes, queryParams } = options;\n const headers = {};\n let withCredentials = false;\n if ('withCredentials' in options) {\n if (options.withCredentials) {\n withCredentials = options.withCredentials;\n }\n }\n\n let progressCallback = false;\n if ('progressCallback' in options) {\n progressCallback = options.progressCallback;\n }\n\n if (!mediaTypes) {\n const responseType = 'arraybuffer';\n if (queryParams) {\n url += DICOMwebClient._parseQueryParameters(queryParams);\n }\n return this._httpGet(\n url,\n headers,\n responseType,\n progressCallback,\n withCredentials,\n );\n }\n\n const commonMediaType = DICOMwebClient._getCommonMediaType(mediaTypes);\n if (commonMediaType.startsWith('image')) {\n return this._httpGetImage(\n url,\n mediaTypes,\n queryParams,\n progressCallback,\n withCredentials,\n );\n }\n if (commonMediaType.startsWith('video')) {\n return this._httpGetVideo(\n url,\n mediaTypes,\n queryParams,\n progressCallback,\n withCredentials,\n );\n }\n if (commonMediaType.startsWith('text')) {\n return this._httpGetText(\n url,\n mediaTypes,\n queryParams,\n progressCallback,\n withCredentials,\n );\n }\n if (commonMediaType === MEDIATYPES.PDF) {\n return this._httpGetApplicationPdf(\n url,\n queryParams,\n progressCallback,\n withCredentials,\n );\n }\n\n throw new Error(\n `Media type ${commonMediaType} is not supported ` +\n 'for retrieval of rendered instance.',\n );\n }\n\n /**\n * Retrieves a thumbnail of an DICOM Instance.\n *\n * @param {Object} options\n * @param {String} options.studyInstanceUID - Study Instance UID\n * @param {String} options.seriesInstanceUID - Series Instance UID\n * @param {String} options.sopInstanceUID - SOP Instance UID\n * @param {String[]} [options.mediaType] - Acceptable HTTP media types\n * @param {Object} [options.queryParams] - HTTP query parameters\n * @returns {ArrayBuffer} Thumbnail\n */\n retrieveInstanceThumbnail(options) {\n if (!('studyInstanceUID' in options)) {\n throw new Error(\n 'Study Instance UID is required for retrieval of rendered instance',\n );\n }\n if (!('seriesInstanceUID' in options)) {\n throw new Error(\n 'Series Instance UID is required for retrieval of rendered instance',\n );\n }\n if (!('sopInstanceUID' in options)) {\n throw new Error(\n 'SOP Instance UID is required for retrieval of rendered instance',\n );\n }\n\n let url = `${this.wadoURL}/studies/${options.studyInstanceUID}/series/${options.seriesInstanceUID}/instances/${options.sopInstanceUID}/thumbnail`;\n\n const { mediaTypes, queryParams } = options;\n const headers = {};\n let withCredentials = false;\n if ('withCredentials' in options) {\n if (options.withCredentials) {\n withCredentials = options.withCredentials;\n }\n }\n\n let progressCallback = false;\n if ('progressCallback' in options) {\n progressCallback = options.progressCallback;\n }\n\n if (!mediaTypes) {\n const responseType = 'arraybuffer';\n if (queryParams) {\n url += DICOMwebClient._parseQueryParameters(queryParams);\n }\n return this._httpGet(\n url,\n headers,\n responseType,\n progressCallback,\n withCredentials,\n );\n }\n\n const commonMediaType = DICOMwebClient._getCommonMediaType(mediaTypes);\n if (commonMediaType.startsWith('image')) {\n return this._httpGetImage(\n url,\n mediaTypes,\n queryParams,\n progressCallback,\n withCredentials,\n );\n }\n\n throw new Error(\n `Media type ${commonMediaType} is not supported ` +\n 'for retrieval of rendered instance.',\n );\n }\n\n /**\n * Retrieves rendered frames for a DICOM Instance.\n *\n * @param {Object} options\n * @param {String} options.studyInstanceUID - Study Instance UID\n * @param {String} options.seriesInstanceUID - Series Instance UID\n * @param {String} options.sopInstanceUID - SOP Instance UID\n * @param {String} options.frameNumbers - One-based indices of Frame Items\n * @param {String[]} [options.mediaType] - Acceptable HTTP media types\n * @param {Object} [options.queryParams] - HTTP query parameters\n * @returns {ArrayBuffer[]} Rendered Frame Items as byte arrays\n */\n retrieveInstanceFramesRendered(options) {\n if (!('studyInstanceUID' in options)) {\n throw new Error(\n 'Study Instance UID is required for retrieval of rendered instance frames',\n );\n }\n if (!('seriesInstanceUID' in options)) {\n throw new Error(\n 'Series Instance UID is required for retrieval of rendered instance frames',\n );\n }\n if (!('sopInstanceUID' in options)) {\n throw new Error(\n 'SOP Instance UID is required for retrieval of rendered instance frames',\n );\n }\n if (!('frameNumbers' in options)) {\n throw new Error(\n 'frame numbers are required for retrieval of rendered instance frames',\n );\n }\n\n console.debug(\n `retrieve rendered frames ${options.frameNumbers.toString()} of instance ${\n options.sopInstanceUID\n }`,\n );\n let url = `${this.wadoURL}/studies/${options.studyInstanceUID}/series/${\n options.seriesInstanceUID\n }/instances/${\n options.sopInstanceUID\n }/frames/${options.frameNumbers.toString()}/rendered`;\n\n const { mediaTypes, queryParams } = options;\n const headers = {};\n let withCredentials = false;\n if ('withCredentials' in options) {\n if (options.withCredentials) {\n withCredentials = options.withCredentials;\n }\n }\n let progressCallback = false;\n if ('progressCallback' in options) {\n progressCallback = options.progressCallback;\n }\n\n if (!mediaTypes) {\n const responseType = 'arraybuffer';\n if (queryParams) {\n url += DICOMwebClient._parseQueryParameters(queryParams);\n }\n return this._httpGet(url, headers, responseType, false, withCredentials);\n }\n\n const commonMediaType = DICOMwebClient._getCommonMediaType(mediaTypes);\n if (commonMediaType.startsWith('image')) {\n return this._httpGetImage(\n url,\n mediaTypes,\n queryParams,\n progressCallback,\n withCredentials,\n );\n }\n if (commonMediaType.startsWith('video')) {\n return this._httpGetVideo(\n url,\n mediaTypes,\n queryParams,\n progressCallback,\n withCredentials,\n );\n }\n\n throw new Error(\n `Media type ${commonMediaType} is not supported ` +\n 'for retrieval of rendered frame.',\n );\n }\n\n /**\n * Retrieves thumbnail of frames for a DICOM Instance.\n *\n * @param {Object} options\n * @param {String} options.studyInstanceUID - Study Instance UID\n * @param {String} options.seriesInstanceUID - Series Instance UID\n * @param {String} options.sopInstanceUID - SOP Instance UID\n * @param {String} options.frameNumbers - One-based indices of Frame Items\n * @param {Object} [options.queryParams] - HTTP query parameters\n * @returns {ArrayBuffer[]} Rendered Frame Items as byte arrays\n */\n retrieveInstanceFramesThumbnail(options) {\n if (!('studyInstanceUID' in options)) {\n throw new Error(\n 'Study Instance UID is required for retrieval of rendered instance frames',\n );\n }\n if (!('seriesInstanceUID' in options)) {\n throw new Error(\n 'Series Instance UID is required for retrieval of rendered instance frames',\n );\n }\n if (!('sopInstanceUID' in options)) {\n throw new Error(\n 'SOP Instance UID is required for retrieval of rendered instance frames',\n );\n }\n if (!('frameNumbers' in options)) {\n throw new Error(\n 'frame numbers are required for retrieval of rendered instance frames',\n );\n }\n\n console.debug(\n `retrieve rendered frames ${options.frameNumbers.toString()} of instance ${\n options.sopInstanceUID\n }`,\n );\n let url = `${this.wadoURL}/studies/${options.studyInstanceUID}/series/${\n options.seriesInstanceUID\n }/instances/${\n options.sopInstanceUID\n }/frames/${options.frameNumbers.toString()}/thumbnail`;\n\n const { mediaTypes, queryParams } = options;\n const headers = {};\n let withCredentials = false;\n if ('withCredentials' in options) {\n if (options.withCredentials) {\n withCredentials = options.withCredentials;\n }\n }\n\n let progressCallback = false;\n if ('progressCallback' in options) {\n progressCallback = options.progressCallback;\n }\n\n if (!mediaTypes) {\n const responseType = 'arraybuffer';\n if (queryParams) {\n url += DICOMwebClient._parseQueryParameters(queryParams);\n }\n return this._httpGet(\n url,\n headers,\n responseType,\n progressCallback,\n withCredentials,\n );\n }\n\n const commonMediaType = DICOMwebClient._getCommonMediaType(mediaTypes);\n if (commonMediaType.startsWith('image')) {\n return this._httpGetImage(\n url,\n mediaTypes,\n queryParams,\n progressCallback,\n withCredentials,\n );\n }\n\n throw new Error(\n `Media type ${commonMediaType} is not supported ` +\n 'for retrieval of rendered frame.',\n );\n }\n\n /**\n * Retrieves a DICOM Instance.\n *\n * @param {Object} options\n * @param {String} options.studyInstanceUID - Study Instance UID\n * @param {String} options.seriesInstanceUID - Series Instance UID\n * @param {String} options.sopInstanceUID - SOP Instance UID\n * @returns {Promise} DICOM Part 10 file as Arraybuffer\n */\n retrieveInstance(options) {\n if (!('studyInstanceUID' in options)) {\n throw new Error('Study Instance UID is required');\n }\n if (!('seriesInstanceUID' in options)) {\n throw new Error('Series Instance UID is required');\n }\n if (!('sopInstanceUID' in options)) {\n throw new Error('SOP Instance UID is required');\n }\n const url = `${this.wadoURL}/studies/${options.studyInstanceUID}/series/${options.seriesInstanceUID}/instances/${options.sopInstanceUID}`;\n\n const { mediaTypes } = options;\n const { withCredentials = false } = options;\n const { progressCallback = false } = options;\n\n if (!mediaTypes) {\n return this._httpGetMultipartApplicationDicom(\n url,\n false,\n false,\n progressCallback,\n withCredentials,\n ).then(getFirstResult);\n }\n\n const commonMediaType = DICOMwebClient._getCommonMediaType(mediaTypes);\n if (commonMediaType === MEDIATYPES.DICOM) {\n return this._httpGetMultipartApplicationDicom(\n url,\n mediaTypes,\n false,\n progressCallback,\n withCredentials,\n ).then(getFirstResult);\n }\n\n throw new Error(\n `Media type ${commonMediaType} is not supported for retrieval of instance.`,\n );\n }\n\n /**\n * Retrieves all DICOM Instances of a Series.\n *\n * @param {Object} options\n * @param {String} options.studyInstanceUID - Study Instance UID\n * @param {String} options.seriesInstanceUID - Series Instance UID\n * @param {Function} options.progressCallback\n * @returns {Promise} DICOM Instances\n */\n retrieveSeries(options) {\n if (!('studyInstanceUID' in options)) {\n throw new Error('Study Instance UID is required');\n }\n if (!('seriesInstanceUID' in options)) {\n throw new Error('Series Instance UID is required');\n }\n\n const url = `${this.wadoURL}/studies/${options.studyInstanceUID}/series/${options.seriesInstanceUID}`;\n\n const { mediaTypes } = options;\n let withCredentials = false;\n if ('withCredentials' in options) {\n if (options.withCredentials) {\n withCredentials = options.withCredentials;\n }\n }\n\n let progressCallback = false;\n if ('progressCallback' in options) {\n progressCallback = options.progressCallback;\n }\n\n if (!mediaTypes) {\n return this._httpGetMultipartApplicationDicom(\n url,\n false,\n false,\n progressCallback,\n withCredentials,\n );\n }\n\n const commonMediaType = DICOMwebClient._getCommonMediaType(mediaTypes);\n if (commonMediaType === MEDIATYPES.DICOM) {\n return this._httpGetMultipartApplicationDicom(\n url,\n mediaTypes,\n false,\n progressCallback,\n withCredentials,\n );\n }\n\n throw new Error(\n `Media type ${commonMediaType} is not supported for retrieval of series.`,\n );\n }\n\n /**\n * Retrieves all DICOM Instances of a Study.\n *\n * @param {Object} options\n * @param {String} options.studyInstanceUID - Study Instance UID\n * @returns {ArrayBuffer[]} DICOM Instances\n */\n retrieveStudy(options) {\n if (!('studyInstanceUID' in options)) {\n throw new Error('Study Instance UID is required');\n }\n\n const url = `${this.wadoURL}/studies/${options.studyInstanceUID}`;\n\n const { mediaTypes } = options;\n const { withCredentials = false } = options;\n const { progressCallback = false } = options;\n\n if (!mediaTypes) {\n return this._httpGetMultipartApplicationDicom(\n url,\n false,\n false,\n progressCallback,\n withCredentials,\n );\n }\n\n const commonMediaType = DICOMwebClient._getCommonMediaType(mediaTypes);\n if (commonMediaType === MEDIATYPES.DICOM) {\n return this._httpGetMultipartApplicationDicom(\n url,\n mediaTypes,\n false,\n progressCallback,\n withCredentials,\n );\n }\n\n throw new Error(\n `Media type ${commonMediaType} is not supported for retrieval of study.`,\n );\n }\n\n /**\n * Retrieves and parses BulkData from a BulkDataURI location.\n * Decodes the multipart encoded data and returns the resulting data\n * as an ArrayBuffer.\n *\n * See http://dicom.nema.org/medical/dicom/current/output/chtml/part18/sect_6.5.5.html\n *\n * @param {Object} options\n * @param {String} BulkDataURI - URI for retrieval of bulkdata\n * @returns {Promise} Bulkdata parts\n */\n retrieveBulkData(options) {\n if (!('BulkDataURI' in options)) {\n throw new Error('BulkDataURI is required.');\n }\n\n const url = options.BulkDataURI;\n const { mediaTypes, byteRange } = options;\n const { withCredentials = false } = options;\n const { progressCallback = false } = options;\n\n if (!mediaTypes) {\n return this._httpGetMultipartApplicationOctetStream(\n url,\n mediaTypes,\n byteRange,\n false,\n false,\n withCredentials,\n );\n }\n\n const commonMediaType = DICOMwebClient._getCommonMediaType(mediaTypes);\n\n if (commonMediaType === MEDIATYPES.OCTET_STREAM) {\n return this._httpGetMultipartApplicationOctetStream(\n url,\n mediaTypes,\n byteRange,\n false,\n progressCallback,\n withCredentials,\n );\n }\n if (commonMediaType.startsWith('image')) {\n return this._httpGetMultipartImage(\n url,\n mediaTypes,\n byteRange,\n false,\n false,\n progressCallback,\n withCredentials,\n );\n }\n\n throw new Error(\n `Media type ${commonMediaType} is not supported for retrieval of bulk data.`,\n );\n }\n\n /**\n * Stores DICOM Instances.\n *\n * @param {Object} options\n * @param {ArrayBuffer[]} options.datasets - DICOM Instances in PS3.10 format\n * @param {String} [options.studyInstanceUID] - Study Instance UID\n * @param {XMLHttpRequest} [options.request] - if specified, the request to use, otherwise one will be created; useful for adding custom upload and abort listeners/objects\n * @returns {Promise} Response message\n */\n storeInstances(options) {\n if (!('datasets' in options)) {\n throw new Error('datasets are required for storing');\n }\n\n let url = `${this.stowURL}/studies`;\n if ('studyInstanceUID' in options) {\n url += `/${options.studyInstanceUID}`;\n }\n\n const { data, boundary } = multipartEncode(options.datasets);\n const headers = {\n 'Content-Type': `multipart/related; type=\"application/dicom\"; boundary=\"${boundary}\"`,\n };\n const { withCredentials = false } = options;\n return this._httpPost(\n url,\n headers,\n data,\n options.progressCallback,\n withCredentials,\n options.request,\n );\n }\n}\n\n\nexport { DICOMwebClient };\nexport default DICOMwebClient;\n","export default '0.5.2';\n","import { DICOMwebClient } from './api.js';\nimport {\n getStudyInstanceUIDFromUri,\n getSeriesInstanceUIDFromUri,\n getSOPInstanceUIDFromUri,\n getFrameNumbersFromUri,\n} from './utils.js';\n\nconst api = {\n DICOMwebClient,\n};\nconst utils = {\n getStudyInstanceUIDFromUri,\n getSeriesInstanceUIDFromUri,\n getSOPInstanceUIDFromUri,\n getFrameNumbersFromUri,\n};\n\nexport { default as version } from './version.js';\n\nexport { api, utils };\n"],"names":["stringToUint8Array","str","arr","Uint8Array","length","i","j","charCodeAt","containsToken","message","token","offset","index","findToken","maxSearchLength","searchLength","Math","min","multipartEncode","datasets","boundary","s4","floor","random","toString","substring","guid","contentTypeString","header","footer","headerArray","footerArray","headerLength","footerLength","contentArrays","map","datasetBuffer","contentArray","contentLength","multipartArray","set","position","forEach","data","buffer","multipartDecode","response","separator","headerIndex","Error","itemLimit","String","fromCharCode","uint8ArrayToString","boundaryString","parts","split","substr","identifyBoundary","boundaryIndex","boundaryLength","components","headerTokenIndex","slice","push","isObject","obj","isEmptyObject","Object","keys","constructor","getFirstResult","result","MEDIATYPES","api","DICOMwebClient","options","this","baseURL","url","console","error","username","password","log","qidoURLPrefix","qidoURL","wadoURLPrefix","wadoURL","stowURLPrefix","stowURL","requestHooks","headers","errorInterceptor","verbose","method","Promise","resolve","reject","request","XMLHttpRequest","open","responseType","key","setRequestHeader","functions","userHeaders","onloadstart","onloadend","onreadystatechange","readyState","status","warn","progressCallback","onprogress","isValid","Array","isArray","every","requestHook","areValidRequestHooks","combinedHeaders","assign","metadata","pipedRequest","args","reduce","props","fn","withCredentials","send","_httpRequest","params","urlWithQueryParams","_parseQueryParameters","Accept","_httpGet","mediaTypes","_buildAcceptHeaderFieldValue","byteRange","supportedMediaTypes","Range","_buildRangeHeaderFieldValue","_buildMultipartAcceptHeaderFieldValue","then","defaultMediaType","acceptableMediaTypes","mediaType","_httpPost","queryParams","_httpGetApplicationJson","studyInstanceUID","seriesInstanceUID","contentType","transferSyntax","sopInstanceUID","paramString","join","frameNumbers","_httpGetMultipartApplicationOctetStream","_getSharedMediaTypes","commonMediaType","_getCommonMediaType","startsWith","_httpGetMultipartImage","_httpGetMultipartVideo","_httpGetImage","_httpGetVideo","_httpGetText","_httpGetApplicationPdf","debug","_httpGetMultipartApplicationDicom","BulkDataURI","queryString","encodeURIComponent","sepIndex","indexOf","mediaTypeType","includes","_assertMediaTypeIsValid","item","fieldValueParts","transferSyntaxUID","fieldValue","values","flat","endsWith","expectedMediaTypes","actualType","_parseMediaType","expectedMediaType","expectedType","types","Set","type","add","from","sharedMediaTypes"],"sourceRoot":""} \ No newline at end of file diff --git a/resources/610.min.worker.js b/resources/610.min.worker.js new file mode 100644 index 0000000..b483699 --- /dev/null +++ b/resources/610.min.worker.js @@ -0,0 +1 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[610],{610:function(s,e){!function(t){"object"==typeof e&&void 0!==s?s.exports=t():"function"==typeof define&&define.amd?define([],t):("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).jpeg=t()}((function(){return function s(e,t,o){function r(a,l){if(!t[a]){if(!e[a]){var n="function"==typeof require&&require;if(!l&&n)return n(a,!0);if(i)return i(a,!0);var h=new Error("Cannot find module '"+a+"'");throw h.code="MODULE_NOT_FOUND",h}var c=t[a]={exports:{}};e[a][0].call(c.exports,(function(s){return r(e[a][1][s]||s)}),c,c.exports,s,e,t,o)}return t[a].exports}for(var i="function"==typeof require&&require,a=0;a>4!=4092||65476===i;){switch(i){case 65476:this.huffTable.read(this.stream,this.HuffTab);break;case 65484:throw new Error("Program doesn't support arithmetic coding. (format throw new IOException)");case 65499:this.quantTable.read(this.stream,r.lossless.Decoder.TABLE);break;case 65501:this.restartInterval=this.readNumber();break;case 65504:case 65505:case 65506:case 65507:case 65508:case 65509:case 65510:case 65511:case 65512:case 65513:case 65514:case 65515:case 65516:case 65517:case 65518:case 65519:this.readApp();break;case 65534:this.readComment();break;default:if(i>>8!=255)throw new Error("ERROR: format throw new IOException! (decode)")}i=this.stream.get16()}if(i<65472||i>65479)throw new Error("ERROR: could not handle arithmetic code!");this.frame.read(this.stream),i=this.stream.get16();do{for(;65498!==i;){switch(i){case 65476:this.huffTable.read(this.stream,this.HuffTab);break;case 65484:throw new Error("Program doesn't support arithmetic coding. (format throw new IOException)");case 65499:this.quantTable.read(this.stream,r.lossless.Decoder.TABLE);break;case 65501:this.restartInterval=this.readNumber();break;case 65504:case 65505:case 65506:case 65507:case 65508:case 65509:case 65510:case 65511:case 65512:case 65513:case 65514:case 65515:case 65516:case 65517:case 65518:case 65519:this.readApp();break;case 65534:this.readComment();break;default:if(i>>8!=255)throw new Error("ERROR: format throw new IOException! (Parser.decode)")}i=this.stream.get16()}switch(this.precision=this.frame.precision,this.components=this.frame.components,this.numBytes||(this.numBytes=parseInt(Math.ceil(this.precision/8))),1==this.numBytes?this.mask=255:this.mask=65535,this.scan.read(this.stream),this.numComp=this.scan.numComp,this.selection=this.scan.selection,1===this.numBytes?3===this.numComp?(this.getter=this.getValueRGB,this.setter=this.setValueRGB,this.output=this.outputRGB):(this.getter=this.getValue8,this.setter=this.setValue8,this.output=this.outputSingle):(this.getter=this.getValue16,this.setter=this.setValue16,this.output=this.outputSingle),this.selection){case 2:this.selector=this.select2;break;case 3:this.selector=this.select3;break;case 4:this.selector=this.select4;break;case 5:this.selector=this.select5;break;case 6:this.selector=this.select6;break;case 7:this.selector=this.select7;break;default:this.selector=this.select1}for(this.scanComps=this.scan.components,this.quantTables=this.quantTable.quantTables,a=0;a=r.lossless.Decoder.RESTART_MARKER_BEGIN&&i<=r.lossless.Decoder.RESTART_MARKER_END))break}65500===i&&1===h&&(this.readNumber(),i=this.stream.get16())}while(65497!==i&&this.xLoc>1)},r.lossless.Decoder.prototype.select6=function(s){return this.getPreviousY(s)+(this.getPreviousX(s)-this.getPreviousXY(s)>>1)},r.lossless.Decoder.prototype.select7=function(s){return(this.getPreviousX(s)+this.getPreviousY(s))/2},r.lossless.Decoder.prototype.decodeRGB=function(s,e,t){var o,i,a,l,n,h,c,u;for(s[0]=this.selector(0),s[1]=this.selector(1),s[2]=this.selector(2),n=0;n=65280)return o;for(s[n]=this.IDCT_Source[0]=s[n]+this.getn(t,o,e,t),this.IDCT_Source[0]*=l[0],u=1;u<64;u+=1){if((o=this.getHuffmanValue(i,e,t))>=65280)return o;if(u+=o>>4,0==(15&o)){if(o>>4==0)break}else this.IDCT_Source[r.lossless.Decoder.IDCT_P[u]]=this.getn(t,15&o,e,t)*l[u]}}return 0},r.lossless.Decoder.prototype.decodeSingle=function(s,e,t){var o,i,a,l;for(this.restarting?(this.restarting=!1,s[0]=1<=65280)return o;if((l=(a=this.getn(s,o,e,t))>>8)>=r.lossless.Decoder.RESTART_MARKER_BEGIN&&l<=r.lossless.Decoder.RESTART_MARKER_END)return l;s[0]+=a}return 0},r.lossless.Decoder.prototype.getHuffmanValue=function(s,e,t){var o,i;if(t[0]<8?(e[0]<<=8,255===(i=this.stream.get8())&&(this.marker=this.stream.get8(),0!==this.marker&&(this.markerIndex=9)),e[0]|=i):t[0]-=8,0!=((o=s[e[0]>>t[0]])&r.lossless.Decoder.MSB)){if(0!==this.markerIndex)return this.markerIndex=0,65280|this.marker;e[0]&=65535>>16-t[0],e[0]<<=8,255===(i=this.stream.get8())&&(this.marker=this.stream.get8(),0!==this.marker&&(this.markerIndex=9)),e[0]|=i,o=s[256*(255&o)+(e[0]>>t[0])],t[0]+=8}if(t[0]+=8-(o>>8),t[0]<0)throw new Error(`index=${t[0]} temp=${e[0]} code=${o} in HuffmanValue()`);return t[0]>16-t[0],255&o)},r.lossless.Decoder.prototype.getn=function(s,e,t,o){var r,i;if(0===e)return 0;if(16===e)return s[0]>=0?-32768:32768;if(o[0]-=e,o[0]>=0){if(o[0]>o[0],t[0]&=65535>>16-o[0]}else{if(t[0]<<=8,255===(i=this.stream.get8())&&(this.marker=this.stream.get8(),0!==this.marker&&(this.markerIndex=9)),t[0]|=i,o[0]+=8,o[0]<0){if(0!==this.markerIndex)return this.markerIndex=0,(65280|this.marker)<<8;t[0]<<=8,255===(i=this.stream.get8())&&(this.marker=this.stream.get8(),0!==this.marker&&(this.markerIndex=9)),t[0]|=i,o[0]+=8}if(o[0]<0)throw new Error(`index=${o[0]} in getn()`);if(o[0]>o[0],t[0]&=65535>>16-o[0]}return r<1<0?this.getter(this.yLoc*this.xDim+this.xLoc-1,s):this.yLoc>0?this.getPreviousY(s):1<0&&this.yLoc>0?this.getter((this.yLoc-1)*this.xDim+this.xLoc-1,s):this.getPreviousY(s)},r.lossless.Decoder.prototype.getPreviousY=function(s){return this.yLoc>0?this.getter((this.yLoc-1)*this.xDim+this.xLoc,s):this.getPreviousX(s)},r.lossless.Decoder.prototype.isLastPixel=function(){return this.xLoc===this.xDim-1&&this.yLoc===this.yDim-1},r.lossless.Decoder.prototype.outputSingle=function(s){this.xLoc=this.xDim&&(this.yLoc+=1,this.xLoc=0))},r.lossless.Decoder.prototype.outputRGB=function(s){var e=this.yLoc*this.xDim+this.xLoc;this.xLoc=this.xDim&&(this.yLoc+=1,this.xLoc=0))},r.lossless.Decoder.prototype.setValue8=function(s,e){this.outputData[s]=e},r.lossless.Decoder.prototype.getValue8=function(s){return this.outputData[s]},o=new ArrayBuffer(2),new DataView(o).setInt16(0,256,!0),256===new Int16Array(o)[0]?(r.lossless.Decoder.prototype.setValue16=r.lossless.Decoder.prototype.setValue8,r.lossless.Decoder.prototype.getValue16=r.lossless.Decoder.prototype.getValue8):(r.lossless.Decoder.prototype.setValue16=function(s,e){this.outputData[s]=(255&e)<<8|e>>8&255},r.lossless.Decoder.prototype.getValue16=function(s){var e=this.outputData[s];return(255&e)<<8|e>>8&255}),r.lossless.Decoder.prototype.setValueRGB=function(s,e,t){this.outputData[3*s+t]=e},r.lossless.Decoder.prototype.getValueRGB=function(s,e){return this.outputData[3*s+e]},r.lossless.Decoder.prototype.readApp=function(){var s=0,e=this.stream.get16();for(s+=2;se)throw new Error("ERROR: frame format error");if(r=s.get8(),(a+=1)>=e)throw new Error("ERROR: frame format error [c>=Lf]");i=s.get8(),a+=1,this.components[r]||(this.components[r]=new o.lossless.ComponentSpec),this.components[r].hSamp=i>>4,this.components[r].vSamp=15&i,this.components[r].quantTableSel=s.get8(),a+=1}if(a!==e)throw new Error("ERROR: frame format error [Lf!=count]");return 1},void 0!==e&&e.exports&&(e.exports=o.lossless.FrameHeader)},{"./component-spec.js":1,"./data-stream.js":2}],5:[function(s,e,t){var o=o||{};o.lossless=o.lossless||{},o.lossless.DataStream=o.lossless.DataStream||(void 0!==s?s("./data-stream.js"):null),o.lossless.Utils=o.lossless.Utils||(void 0!==s?s("./utils.js"):null),o.lossless.HuffmanTable=o.lossless.HuffmanTable||function(){this.l=o.lossless.Utils.createArray(4,2,16),this.th=[],this.v=o.lossless.Utils.createArray(4,2,16,200),this.tc=o.lossless.Utils.createArray(4,2),this.tc[0][0]=0,this.tc[1][0]=0,this.tc[2][0]=0,this.tc[3][0]=0,this.tc[0][1]=0,this.tc[1][1]=0,this.tc[2][1]=0,this.tc[3][1]=0,this.th[0]=0,this.th[1]=0,this.th[2]=0,this.th[3]=0},o.lossless.HuffmanTable.MSB=2147483648,o.lossless.HuffmanTable.prototype.read=function(s,e){var t,o,r,i,a,l,n=0;for(t=s.get16(),n+=2;n3)throw new Error("ERROR: Huffman table ID > 3");if((i=o>>4)>2)throw new Error("ERROR: Huffman table [Table class > 2 ]");for(this.th[r]=1,this.tc[r][i]=1,a=0;a<16;a+=1)this.l[r][i][a]=s.get8(),n+=1;for(a=0;a<16;a+=1)for(l=0;lt)throw new Error("ERROR: Huffman table format error [count>Lh]");this.v[r][i][a][l]=s.get8(),n+=1}}if(n!==t)throw new Error("ERROR: Huffman table format error [count!=Lf]");for(a=0;a<4;a+=1)for(l=0;l<2;l+=1)0!==this.tc[a][l]&&this.buildHuffTable(e[a][l],this.l[a][l],this.v[a][l]);return 1},o.lossless.HuffmanTable.prototype.buildHuffTable=function(s,e,t){var r,i,a,l,n;for(i=0,a=0;a<8;a+=1)for(l=0;l>a+1;n+=1)s[i]=t[a][l]|a+1<<8,i+=1;for(a=1;i<256;a+=1,i+=1)s[i]=a|o.lossless.HuffmanTable.MSB;for(r=1,i=0,a=8;a<16;a+=1)for(l=0;l>a-7;n+=1)s[256*r+i]=t[a][l]|a+1<<8,i+=1;if(i>=256){if(i>256)throw new Error("ERROR: Huffman table error(1)!");i=0,r+=1}}},void 0!==e&&e.exports&&(e.exports=o.lossless.HuffmanTable)},{"./data-stream.js":2,"./utils.js":10}],6:[function(s,e,t){var o=o||{};o.lossless=o.lossless||{},o.lossless.ComponentSpec=o.lossless.ComponentSpec||(void 0!==s?s("./component-spec.js"):null),o.lossless.DataStream=o.lossless.DataStream||(void 0!==s?s("./data-stream.js"):null),o.lossless.Decoder=o.lossless.Decoder||(void 0!==s?s("./decoder.js"):null),o.lossless.FrameHeader=o.lossless.FrameHeader||(void 0!==s?s("./frame-header.js"):null),o.lossless.HuffmanTable=o.lossless.HuffmanTable||(void 0!==s?s("./huffman-table.js"):null),o.lossless.QuantizationTable=o.lossless.QuantizationTable||(void 0!==s?s("./quantization-table.js"):null),o.lossless.ScanComponent=o.lossless.ScanComponent||(void 0!==s?s("./scan-component.js"):null),o.lossless.ScanHeader=o.lossless.ScanHeader||(void 0!==s?s("./scan-header.js"):null),o.lossless.Utils=o.lossless.Utils||(void 0!==s?s("./utils.js"):null),void 0!==e&&e.exports&&(e.exports=o)},{"./component-spec.js":1,"./data-stream.js":2,"./decoder.js":3,"./frame-header.js":4,"./huffman-table.js":5,"./quantization-table.js":7,"./scan-component.js":8,"./scan-header.js":9,"./utils.js":10}],7:[function(s,e,t){var o=o||{};o.lossless=o.lossless||{},o.lossless.DataStream=o.lossless.DataStream||(void 0!==s?s("./data-stream.js"):null),o.lossless.Utils=o.lossless.Utils||(void 0!==s?s("./utils.js"):null),o.lossless.QuantizationTable=o.lossless.QuantizationTable||function(){this.precision=[],this.tq=[],this.quantTables=o.lossless.Utils.createArray(4,64),this.tq[0]=0,this.tq[1]=0,this.tq[2]=0,this.tq[3]=0},o.lossless.QuantizationTable.enhanceQuantizationTable=function(s,e){var t;for(t=0;t<8;t+=1)s[e[0+t]]*=90,s[e[32+t]]*=90,s[e[16+t]]*=118,s[e[48+t]]*=49,s[e[40+t]]*=71,s[e[8+t]]*=126,s[e[56+t]]*=25,s[e[24+t]]*=106;for(t=0;t<8;t+=1)s[e[0+8*t]]*=90,s[e[4+8*t]]*=90,s[e[2+8*t]]*=118,s[e[6+8*t]]*=49,s[e[5+8*t]]*=71,s[e[1+8*t]]*=126,s[e[7+8*t]]*=25,s[e[3+8*t]]*=106;for(t=0;t<64;t+=1)s[t]>>=6},o.lossless.QuantizationTable.prototype.read=function(s,e){var t,r,i,a,l=0;for(t=s.get16(),l+=2;l3)throw new Error("ERROR: Quantization table ID > 3");if(this.precision[i]=r>>4,0===this.precision[i])this.precision[i]=8;else{if(1!==this.precision[i])throw new Error("ERROR: Quantization table precision error");this.precision[i]=16}if(this.tq[i]=1,8===this.precision[i]){for(a=0;a<64;a+=1){if(l>t)throw new Error("ERROR: Quantization table format error");this.quantTables[i][a]=s.get8(),l+=1}o.lossless.QuantizationTable.enhanceQuantizationTable(this.quantTables[i],e)}else{for(a=0;a<64;a+=1){if(l>t)throw new Error("ERROR: Quantization table format error");this.quantTables[i][a]=s.get16(),l+=2}o.lossless.QuantizationTable.enhanceQuantizationTable(this.quantTables[i],e)}}if(l!==t)throw new Error("ERROR: Quantization table error [count!=Lq]");return 1},void 0!==e&&e.exports&&(e.exports=o.lossless.QuantizationTable)},{"./data-stream.js":2,"./utils.js":10}],8:[function(s,e,t){var o=o||{};o.lossless=o.lossless||{},o.lossless.ScanComponent=o.lossless.ScanComponent||function(){this.acTabSel=0,this.dcTabSel=0,this.scanCompSel=0},void 0!==e&&e.exports&&(e.exports=o.lossless.ScanComponent)},{}],9:[function(s,e,t){var o=o||{};o.lossless=o.lossless||{},o.lossless.DataStream=o.lossless.DataStream||(void 0!==s?s("./data-stream.js"):null),o.lossless.ScanComponent=o.lossless.ScanComponent||(void 0!==s?s("./scan-component.js"):null),o.lossless.ScanHeader=o.lossless.ScanHeader||function(){this.ah=0,this.al=0,this.numComp=0,this.selection=0,this.spectralEnd=0,this.components=[]},o.lossless.ScanHeader.prototype.read=function(s){var e,t,r,i=0;for(e=s.get16(),i+=2,this.numComp=s.get8(),i+=1,t=0;te)throw new Error("ERROR: scan header format error");this.components[t].scanCompSel=s.get8(),i+=1,r=s.get8(),i+=1,this.components[t].dcTabSel=r>>4,this.components[t].acTabSel=15&r}if(this.selection=s.get8(),i+=1,this.spectralEnd=s.get8(),i+=1,r=s.get8(),this.ah=r>>4,this.al=15&r,(i+=1)!==e)throw new Error("ERROR: scan header format error [count!=Ns]");return 1},void 0!==e&&e.exports&&(e.exports=o.lossless.ScanHeader)},{"./data-stream.js":2,"./scan-component.js":8}],10:[function(s,e,t){var o=o||{};o.lossless=o.lossless||{},o.lossless.Utils=o.lossless.Utils||{},o.lossless.Utils.createArray=function(s){var e=new Array(s||0),t=s;if(arguments.length>1)for(var r=Array.prototype.slice.call(arguments,1);t--;)e[s-1-t]=o.lossless.Utils.createArray.apply(this,r);return e},o.lossless.Utils.makeCRCTable=function(){for(var s,e=[],t=0;t<256;t++){s=t;for(var o=0;o<8;o++)s=1&s?3988292384^s>>>1:s>>>1;e[t]=s}return e},o.lossless.Utils.crc32=function(s){for(var e=new Uint8Array(s.buffer),t=o.lossless.Utils.crcTable||(o.lossless.Utils.crcTable=o.lossless.Utils.makeCRCTable()),r=-1,i=0;i>>8^t[255&(r^e[i])];return(-1^r)>>>0},void 0!==e&&e.exports&&(e.exports=o.lossless.Utils)},{}]},{},[6])(6)}))}}]); \ No newline at end of file diff --git a/resources/610.min.worker.js.map b/resources/610.min.worker.js.map new file mode 100644 index 0000000..c3e6db3 --- /dev/null +++ b/resources/610.min.worker.js.map @@ -0,0 +1 @@ +{"version":3,"file":"610.min.worker.js","mappings":"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","sources":["webpack:///../codecs/jpegLossless.js"],"sourcesContent":["/* eslint-disable */\n\n(function (f) {\n if (typeof exports === 'object' && typeof module !== 'undefined') {\n module.exports = f();\n } else if (typeof define === 'function' && define.amd) {\n define([], f);\n } else {\n var g;\n\n if (typeof window !== 'undefined') {\n g = window;\n } else if (typeof global !== 'undefined') {\n g = global;\n } else if (typeof self !== 'undefined') {\n g = self;\n } else {\n g = this;\n }\n g.jpeg = f();\n }\n})(function () {\n var define, module, exports;\n\n return (function e(t, n, r) {\n function s(o, u) {\n if (!n[o]) {\n if (!t[o]) {\n var a = typeof require === 'function' && require;\n\n if (!u && a) {\n return a(o, !0);\n }\n if (i) {\n return i(o, !0);\n }\n var f = new Error(\"Cannot find module '\" + o + \"'\");\n\n throw ((f.code = 'MODULE_NOT_FOUND'), f);\n }\n var l = (n[o] = { exports: {} });\n\n t[o][0].call(\n l.exports,\n function (e) {\n var n = t[o][1][e];\n\n return s(n ? n : e);\n },\n l,\n l.exports,\n e,\n t,\n n,\n r\n );\n }\n\n return n[o].exports;\n }\n var i = typeof require === 'function' && require;\n\n for (var o = 0; o < r.length; o++) {\n s(r[o]);\n }\n\n return s;\n })(\n {\n 1: [\n function (require, module, exports) {\n /*\n * Copyright (C) 2015 Michael Martinez\n * Changes: Added support for selection values 2-7, fixed minor bugs &\n * warnings, split into multiple class files, and general clean up.\n *\n * 08-25-2015: Helmut Dersch agreed to a license change from LGPL to MIT.\n */\n\n /*\n * Copyright (C) Helmut Dersch\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 /*jslint browser: true, node: true */\n /*global require, module */\n\n /*** Imports ***/\n var jpeg = jpeg || {};\n\n jpeg.lossless = jpeg.lossless || {};\n\n /*** Constructor ***/\n jpeg.lossless.ComponentSpec =\n jpeg.lossless.ComponentSpec ||\n function () {\n this.hSamp = 0; // Horizontal sampling factor\n this.quantTableSel = 0; // Quantization table destination selector\n this.vSamp = 0; // Vertical\n };\n\n /*** Exports ***/\n\n var moduleType = typeof module;\n\n if (moduleType !== 'undefined' && module.exports) {\n module.exports = jpeg.lossless.ComponentSpec;\n }\n },\n {},\n ],\n 2: [\n function (require, module, exports) {\n /*\n * Copyright (C) 2015 Michael Martinez\n * Changes: Added support for selection values 2-7, fixed minor bugs &\n * warnings, split into multiple class files, and general clean up.\n *\n * 08-25-2015: Helmut Dersch agreed to a license change from LGPL to MIT.\n */\n\n /*\n * Copyright (C) Helmut Dersch\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 /*jslint browser: true, node: true */\n /*global require, module */\n /*** Imports ***/\n var jpeg = jpeg || {};\n\n jpeg.lossless = jpeg.lossless || {};\n\n /*** Constructor ***/\n jpeg.lossless.DataStream =\n jpeg.lossless.DataStream ||\n function (data, offset, length) {\n // Note: DataView is much slower than Int8Array\n // this.buffer = new DataView(data, offset, length);\n this.buffer = new Uint8Array(data, offset, length);\n this.index = 0;\n };\n jpeg.lossless.DataStream.prototype.get16 = function () {\n // var value = this.buffer.getUint16(this.index, false);\n var value =\n (this.buffer[this.index] << 8) + this.buffer[this.index + 1]; // DataView is big-endian by default\n\n this.index += 2;\n\n return value;\n };\n jpeg.lossless.DataStream.prototype.get8 = function () {\n // var value = this.buffer.getUint8(this.index);\n var value = this.buffer[this.index];\n\n this.index += 1;\n\n return value;\n };\n\n /*** Exports ***/\n\n var moduleType = typeof module;\n\n if (moduleType !== 'undefined' && module.exports) {\n module.exports = jpeg.lossless.DataStream;\n }\n },\n {},\n ],\n 3: [\n function (require, module, exports) {\n /*\n * Copyright (C) 2015 Michael Martinez\n * Changes: Added support for selection values 2-7, fixed minor bugs &\n * warnings, split into multiple class files, and general clean up.\n *\n * 08-25-2015: Helmut Dersch agreed to a license change from LGPL to MIT.\n */\n\n /*\n * Copyright (C) Helmut Dersch\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 /*jslint browser: true, node: true */\n /*global require, module */\n /*** Imports ***/\n var jpeg = jpeg || {};\n\n jpeg.lossless = jpeg.lossless || {};\n jpeg.lossless.DataStream =\n jpeg.lossless.DataStream ||\n (typeof require !== 'undefined'\n ? require('./data-stream.js')\n : null);\n jpeg.lossless.HuffmanTable =\n jpeg.lossless.HuffmanTable ||\n (typeof require !== 'undefined'\n ? require('./huffman-table.js')\n : null);\n jpeg.lossless.QuantizationTable =\n jpeg.lossless.QuantizationTable ||\n (typeof require !== 'undefined'\n ? require('./quantization-table.js')\n : null);\n jpeg.lossless.ScanHeader =\n jpeg.lossless.ScanHeader ||\n (typeof require !== 'undefined'\n ? require('./scan-header.js')\n : null);\n jpeg.lossless.FrameHeader =\n jpeg.lossless.FrameHeader ||\n (typeof require !== 'undefined'\n ? require('./frame-header.js')\n : null);\n jpeg.lossless.Utils =\n jpeg.lossless.Utils ||\n (typeof require !== 'undefined' ? require('./utils.js') : null);\n\n /*** Constructor ***/\n\n /**\n * The Decoder constructor.\n * @property {number} xDim - size of x dimension\n * @property {number} yDim - size of y dimension\n * @property {number} numComp - number of components\n * @property {number} numBytes - number of bytes per component\n * @type {Function}\n */\n jpeg.lossless.Decoder =\n jpeg.lossless.Decoder ||\n function (buffer, numBytes) {\n this.buffer = buffer;\n this.frame = new jpeg.lossless.FrameHeader();\n this.huffTable = new jpeg.lossless.HuffmanTable();\n this.quantTable = new jpeg.lossless.QuantizationTable();\n this.scan = new jpeg.lossless.ScanHeader();\n this.DU = jpeg.lossless.Utils.createArray(10, 4, 64); // at most 10 data units in a MCU, at most 4 data units in one component\n this.HuffTab = jpeg.lossless.Utils.createArray(4, 2, 50 * 256);\n this.IDCT_Source = [];\n this.nBlock = []; // number of blocks in the i-th Comp in a scan\n this.acTab = jpeg.lossless.Utils.createArray(10, 1); // ac HuffTab for the i-th Comp in a scan\n this.dcTab = jpeg.lossless.Utils.createArray(10, 1); // dc HuffTab for the i-th Comp in a scan\n this.qTab = jpeg.lossless.Utils.createArray(10, 1); // quantization table for the i-th Comp in a scan\n this.marker = 0;\n this.markerIndex = 0;\n this.numComp = 0;\n this.restartInterval = 0;\n this.selection = 0;\n this.xDim = 0;\n this.yDim = 0;\n this.xLoc = 0;\n this.yLoc = 0;\n this.numBytes = 0;\n this.outputData = null;\n this.restarting = false;\n this.mask = 0;\n\n if (typeof numBytes !== 'undefined') {\n this.numBytes = numBytes;\n }\n };\n\n /*** Static Pseudo-constants ***/\n\n jpeg.lossless.Decoder.IDCT_P = [\n 0, 5, 40, 16, 45, 2, 7, 42, 21, 56, 8, 61, 18, 47, 1, 4, 41, 23, 58,\n 13, 32, 24, 37, 10, 63, 17, 44, 3, 6, 43, 20, 57, 15, 34, 29, 48,\n 53, 26, 39, 9, 60, 19, 46, 22, 59, 12, 33, 31, 50, 55, 25, 36, 11,\n 62, 14, 35, 28, 49, 52, 27, 38, 30, 51, 54,\n ];\n jpeg.lossless.Decoder.TABLE = [\n 0, 1, 5, 6, 14, 15, 27, 28, 2, 4, 7, 13, 16, 26, 29, 42, 3, 8, 12,\n 17, 25, 30, 41, 43, 9, 11, 18, 24, 31, 40, 44, 53, 10, 19, 23, 32,\n 39, 45, 52, 54, 20, 22, 33, 38, 46, 51, 55, 60, 21, 34, 37, 47, 50,\n 56, 59, 61, 35, 36, 48, 49, 57, 58, 62, 63,\n ];\n jpeg.lossless.Decoder.MAX_HUFFMAN_SUBTREE = 50;\n jpeg.lossless.Decoder.MSB = 0x80000000;\n jpeg.lossless.Decoder.RESTART_MARKER_BEGIN = 0xffd0;\n jpeg.lossless.Decoder.RESTART_MARKER_END = 0xffd7;\n\n /*** Prototype Methods ***/\n\n /**\n * Returns decompressed data.\n * @param {ArrayBuffer} buffer\n * @param {number} [offset]\n * @param {number} [length]\n * @returns {ArrayBufer}\n */\n jpeg.lossless.Decoder.prototype.decompress = function (\n buffer,\n offset,\n length\n ) {\n return this.decode(buffer, offset, length).buffer;\n };\n jpeg.lossless.Decoder.prototype.decode = function (\n buffer,\n offset,\n length,\n numBytes\n ) {\n /*jslint bitwise: true */\n\n var current,\n scanNum = 0,\n pred = [],\n i,\n compN,\n temp = [],\n index = [],\n mcuNum;\n\n if (typeof buffer !== 'undefined') {\n this.buffer = buffer;\n }\n\n if (typeof numBytes !== 'undefined') {\n this.numBytes = numBytes;\n }\n\n this.stream = new jpeg.lossless.DataStream(\n this.buffer,\n offset,\n length\n );\n this.buffer = null;\n\n this.xLoc = 0;\n this.yLoc = 0;\n current = this.stream.get16();\n\n if (current !== 0xffd8) {\n // SOI\n throw new Error('Not a JPEG file');\n }\n\n current = this.stream.get16();\n\n while (current >> 4 !== 0x0ffc || current === 0xffc4) {\n // SOF 0~15\n switch (current) {\n case 0xffc4: // DHT\n this.huffTable.read(this.stream, this.HuffTab);\n break;\n case 0xffcc: // DAC\n throw new Error(\n \"Program doesn't support arithmetic coding. (format throw new IOException)\"\n );\n case 0xffdb:\n this.quantTable.read(\n this.stream,\n jpeg.lossless.Decoder.TABLE\n );\n break;\n case 0xffdd:\n this.restartInterval = this.readNumber();\n break;\n case 0xffe0:\n case 0xffe1:\n case 0xffe2:\n case 0xffe3:\n case 0xffe4:\n case 0xffe5:\n case 0xffe6:\n case 0xffe7:\n case 0xffe8:\n case 0xffe9:\n case 0xffea:\n case 0xffeb:\n case 0xffec:\n case 0xffed:\n case 0xffee:\n case 0xffef:\n this.readApp();\n break;\n case 0xfffe:\n this.readComment();\n break;\n default:\n if (current >> 8 !== 0xff) {\n throw new Error(\n 'ERROR: format throw new IOException! (decode)'\n );\n }\n }\n\n current = this.stream.get16();\n }\n\n if (current < 0xffc0 || current > 0xffc7) {\n throw new Error('ERROR: could not handle arithmetic code!');\n }\n\n this.frame.read(this.stream);\n current = this.stream.get16();\n\n do {\n while (current !== 0x0ffda) {\n // SOS\n switch (current) {\n case 0xffc4: // DHT\n this.huffTable.read(this.stream, this.HuffTab);\n break;\n case 0xffcc: // DAC\n throw new Error(\n \"Program doesn't support arithmetic coding. (format throw new IOException)\"\n );\n case 0xffdb:\n this.quantTable.read(\n this.stream,\n jpeg.lossless.Decoder.TABLE\n );\n break;\n case 0xffdd:\n this.restartInterval = this.readNumber();\n break;\n case 0xffe0:\n case 0xffe1:\n case 0xffe2:\n case 0xffe3:\n case 0xffe4:\n case 0xffe5:\n case 0xffe6:\n case 0xffe7:\n case 0xffe8:\n case 0xffe9:\n case 0xffea:\n case 0xffeb:\n case 0xffec:\n case 0xffed:\n case 0xffee:\n case 0xffef:\n this.readApp();\n break;\n case 0xfffe:\n this.readComment();\n break;\n default:\n if (current >> 8 !== 0xff) {\n throw new Error(\n 'ERROR: format throw new IOException! (Parser.decode)'\n );\n }\n }\n\n current = this.stream.get16();\n }\n\n this.precision = this.frame.precision;\n this.components = this.frame.components;\n\n if (!this.numBytes) {\n this.numBytes = parseInt(Math.ceil(this.precision / 8));\n }\n\n if (this.numBytes == 1) {\n this.mask = 0xff;\n } else {\n this.mask = 0xffff;\n }\n\n this.scan.read(this.stream);\n this.numComp = this.scan.numComp;\n this.selection = this.scan.selection;\n\n if (this.numBytes === 1) {\n if (this.numComp === 3) {\n this.getter = this.getValueRGB;\n this.setter = this.setValueRGB;\n this.output = this.outputRGB;\n } else {\n this.getter = this.getValue8;\n this.setter = this.setValue8;\n this.output = this.outputSingle;\n }\n } else {\n this.getter = this.getValue16;\n this.setter = this.setValue16;\n this.output = this.outputSingle;\n }\n\n switch (this.selection) {\n case 2:\n this.selector = this.select2;\n break;\n case 3:\n this.selector = this.select3;\n break;\n case 4:\n this.selector = this.select4;\n break;\n case 5:\n this.selector = this.select5;\n break;\n case 6:\n this.selector = this.select6;\n break;\n case 7:\n this.selector = this.select7;\n break;\n default:\n this.selector = this.select1;\n break;\n }\n\n this.scanComps = this.scan.components;\n this.quantTables = this.quantTable.quantTables;\n\n for (i = 0; i < this.numComp; i += 1) {\n compN = this.scanComps[i].scanCompSel;\n this.qTab[i] =\n this.quantTables[this.components[compN].quantTableSel];\n this.nBlock[i] =\n this.components[compN].vSamp * this.components[compN].hSamp;\n this.dcTab[i] = this.HuffTab[this.scanComps[i].dcTabSel][0];\n this.acTab[i] = this.HuffTab[this.scanComps[i].acTabSel][1];\n }\n\n this.xDim = this.frame.dimX;\n this.yDim = this.frame.dimY;\n if (this.numBytes == 1) {\n this.outputData = new Uint8Array(\n new ArrayBuffer(\n this.xDim * this.yDim * this.numBytes * this.numComp\n )\n );\n } else {\n this.outputData = new Uint16Array(\n new ArrayBuffer(\n this.xDim * this.yDim * this.numBytes * this.numComp\n )\n );\n }\n\n scanNum += 1;\n\n while (true) {\n // Decode one scan\n temp[0] = 0;\n index[0] = 0;\n\n for (i = 0; i < 10; i += 1) {\n pred[i] = 1 << (this.precision - 1);\n }\n\n if (this.restartInterval === 0) {\n current = this.decodeUnit(pred, temp, index);\n\n while (\n current === 0 &&\n this.xLoc < this.xDim &&\n this.yLoc < this.yDim\n ) {\n this.output(pred);\n current = this.decodeUnit(pred, temp, index);\n }\n\n break; //current=MARKER\n }\n\n for (mcuNum = 0; mcuNum < this.restartInterval; mcuNum += 1) {\n this.restarting = mcuNum == 0;\n current = this.decodeUnit(pred, temp, index);\n this.output(pred);\n\n if (current !== 0) {\n break;\n }\n }\n\n if (current === 0) {\n if (this.markerIndex !== 0) {\n current = 0xff00 | this.marker;\n this.markerIndex = 0;\n } else {\n current = this.stream.get16();\n }\n }\n\n if (\n !(\n current >= jpeg.lossless.Decoder.RESTART_MARKER_BEGIN &&\n current <= jpeg.lossless.Decoder.RESTART_MARKER_END\n )\n ) {\n break; //current=MARKER\n }\n }\n\n if (current === 0xffdc && scanNum === 1) {\n //DNL\n this.readNumber();\n current = this.stream.get16();\n }\n } while (\n current !== 0xffd9 &&\n this.xLoc < this.xDim &&\n this.yLoc < this.yDim &&\n scanNum === 0\n );\n\n return this.outputData;\n };\n jpeg.lossless.Decoder.prototype.decodeUnit = function (\n prev,\n temp,\n index\n ) {\n if (this.numComp == 1) {\n return this.decodeSingle(prev, temp, index);\n } else if (this.numComp == 3) {\n return this.decodeRGB(prev, temp, index);\n }\n\n return -1;\n };\n jpeg.lossless.Decoder.prototype.select1 = function (compOffset) {\n return this.getPreviousX(compOffset);\n };\n jpeg.lossless.Decoder.prototype.select2 = function (compOffset) {\n return this.getPreviousY(compOffset);\n };\n jpeg.lossless.Decoder.prototype.select3 = function (compOffset) {\n return this.getPreviousXY(compOffset);\n };\n jpeg.lossless.Decoder.prototype.select4 = function (compOffset) {\n return (\n this.getPreviousX(compOffset) +\n this.getPreviousY(compOffset) -\n this.getPreviousXY(compOffset)\n );\n };\n jpeg.lossless.Decoder.prototype.select5 = function (compOffset) {\n return (\n this.getPreviousX(compOffset) +\n ((this.getPreviousY(compOffset) -\n this.getPreviousXY(compOffset)) >>\n 1)\n );\n };\n jpeg.lossless.Decoder.prototype.select6 = function (compOffset) {\n return (\n this.getPreviousY(compOffset) +\n ((this.getPreviousX(compOffset) -\n this.getPreviousXY(compOffset)) >>\n 1)\n );\n };\n jpeg.lossless.Decoder.prototype.select7 = function (compOffset) {\n return (\n (this.getPreviousX(compOffset) + this.getPreviousY(compOffset)) /\n 2\n );\n };\n jpeg.lossless.Decoder.prototype.decodeRGB = function (\n prev,\n temp,\n index\n ) {\n /*jslint bitwise: true */\n\n var value, actab, dctab, qtab, ctrC, i, k, j;\n\n prev[0] = this.selector(0);\n prev[1] = this.selector(1);\n prev[2] = this.selector(2);\n\n for (ctrC = 0; ctrC < this.numComp; ctrC += 1) {\n qtab = this.qTab[ctrC];\n actab = this.acTab[ctrC];\n dctab = this.dcTab[ctrC];\n for (i = 0; i < this.nBlock[ctrC]; i += 1) {\n for (k = 0; k < this.IDCT_Source.length; k += 1) {\n this.IDCT_Source[k] = 0;\n }\n\n value = this.getHuffmanValue(dctab, temp, index);\n\n if (value >= 0xff00) {\n return value;\n }\n\n prev[ctrC] = this.IDCT_Source[0] =\n prev[ctrC] + this.getn(index, value, temp, index);\n this.IDCT_Source[0] *= qtab[0];\n\n for (j = 1; j < 64; j += 1) {\n value = this.getHuffmanValue(actab, temp, index);\n\n if (value >= 0xff00) {\n return value;\n }\n\n j += value >> 4;\n\n if ((value & 0x0f) === 0) {\n if (value >> 4 === 0) {\n break;\n }\n } else {\n this.IDCT_Source[jpeg.lossless.Decoder.IDCT_P[j]] =\n this.getn(index, value & 0x0f, temp, index) * qtab[j];\n }\n }\n }\n }\n\n return 0;\n };\n jpeg.lossless.Decoder.prototype.decodeSingle = function (\n prev,\n temp,\n index\n ) {\n /*jslint bitwise: true */\n\n var value, i, n, nRestart;\n\n if (this.restarting) {\n this.restarting = false;\n prev[0] = 1 << (this.frame.precision - 1);\n } else {\n prev[0] = this.selector();\n }\n\n for (i = 0; i < this.nBlock[0]; i += 1) {\n value = this.getHuffmanValue(this.dcTab[0], temp, index);\n if (value >= 0xff00) {\n return value;\n }\n\n n = this.getn(prev, value, temp, index);\n nRestart = n >> 8;\n\n if (\n nRestart >= jpeg.lossless.Decoder.RESTART_MARKER_BEGIN &&\n nRestart <= jpeg.lossless.Decoder.RESTART_MARKER_END\n ) {\n return nRestart;\n }\n\n prev[0] += n;\n }\n\n return 0;\n };\n // Huffman table for fast search: (HuffTab) 8-bit Look up table 2-layer search architecture, 1st-layer represent 256 node (8 bits) if codeword-length > 8\n // bits, then the entry of 1st-layer = (# of 2nd-layer table) | MSB and it is stored in the 2nd-layer Size of tables in each layer are 256.\n // HuffTab[*][*][0-256] is always the only 1st-layer table.\n //\n // An entry can be: (1) (# of 2nd-layer table) | MSB , for code length > 8 in 1st-layer (2) (Code length) << 8 | HuffVal\n //\n // HuffmanValue(table HuffTab[x][y] (ex) HuffmanValue(HuffTab[1][0],...)\n // ):\n // return: Huffman Value of table\n // 0xFF?? if it receives a MARKER\n // Parameter: table HuffTab[x][y] (ex) HuffmanValue(HuffTab[1][0],...)\n // temp temp storage for remainded bits\n // index index to bit of temp\n // in FILE pointer\n // Effect:\n // temp store new remainded bits\n // index change to new index\n // in change to new position\n // NOTE:\n // Initial by temp=0; index=0;\n // NOTE: (explain temp and index)\n // temp: is always in the form at calling time or returning time\n // | byte 4 | byte 3 | byte 2 | byte 1 |\n // | 0 | 0 | 00000000 | 00000??? | if not a MARKER\n // ^index=3 (from 0 to 15)\n // 321\n // NOTE (marker and marker_index):\n // If get a MARKER from 'in', marker=the low-byte of the MARKER\n // and marker_index=9\n // If marker_index=9 then index is always > 8, or HuffmanValue()\n // will not be called\n jpeg.lossless.Decoder.prototype.getHuffmanValue = function (\n table,\n temp,\n index\n ) {\n /*jslint bitwise: true */\n\n var code, input, mask;\n\n mask = 0xffff;\n\n if (index[0] < 8) {\n temp[0] <<= 8;\n input = this.stream.get8();\n if (input === 0xff) {\n this.marker = this.stream.get8();\n if (this.marker !== 0) {\n this.markerIndex = 9;\n }\n }\n temp[0] |= input;\n } else {\n index[0] -= 8;\n }\n\n code = table[temp[0] >> index[0]];\n\n if ((code & jpeg.lossless.Decoder.MSB) !== 0) {\n if (this.markerIndex !== 0) {\n this.markerIndex = 0;\n\n return 0xff00 | this.marker;\n }\n\n temp[0] &= mask >> (16 - index[0]);\n temp[0] <<= 8;\n input = this.stream.get8();\n\n if (input === 0xff) {\n this.marker = this.stream.get8();\n if (this.marker !== 0) {\n this.markerIndex = 9;\n }\n }\n\n temp[0] |= input;\n code = table[(code & 0xff) * 256 + (temp[0] >> index[0])];\n index[0] += 8;\n }\n\n index[0] += 8 - (code >> 8);\n\n if (index[0] < 0) {\n throw new Error(\n `index=${index[0]} temp=${temp[0]} code=${code} in HuffmanValue()`\n );\n }\n\n if (index[0] < this.markerIndex) {\n this.markerIndex = 0;\n\n return 0xff00 | this.marker;\n }\n\n temp[0] &= mask >> (16 - index[0]);\n\n return code & 0xff;\n };\n jpeg.lossless.Decoder.prototype.getn = function (\n PRED,\n n,\n temp,\n index\n ) {\n /*jslint bitwise: true */\n\n var result, one, n_one, mask, input;\n\n one = 1;\n n_one = -1;\n mask = 0xffff;\n\n if (n === 0) {\n return 0;\n }\n\n if (n === 16) {\n if (PRED[0] >= 0) {\n return -32768;\n }\n\n return 32768;\n }\n\n index[0] -= n;\n\n if (index[0] >= 0) {\n if (index[0] < this.markerIndex && !this.isLastPixel()) {\n // this was corrupting the last pixel in some cases\n this.markerIndex = 0;\n\n return (0xff00 | this.marker) << 8;\n }\n\n result = temp[0] >> index[0];\n temp[0] &= mask >> (16 - index[0]);\n } else {\n temp[0] <<= 8;\n input = this.stream.get8();\n\n if (input === 0xff) {\n this.marker = this.stream.get8();\n if (this.marker !== 0) {\n this.markerIndex = 9;\n }\n }\n\n temp[0] |= input;\n index[0] += 8;\n\n if (index[0] < 0) {\n if (this.markerIndex !== 0) {\n this.markerIndex = 0;\n\n return (0xff00 | this.marker) << 8;\n }\n\n temp[0] <<= 8;\n input = this.stream.get8();\n\n if (input === 0xff) {\n this.marker = this.stream.get8();\n if (this.marker !== 0) {\n this.markerIndex = 9;\n }\n }\n\n temp[0] |= input;\n index[0] += 8;\n }\n\n if (index[0] < 0) {\n throw new Error(`index=${index[0]} in getn()`);\n }\n\n if (index[0] < this.markerIndex) {\n this.markerIndex = 0;\n\n return (0xff00 | this.marker) << 8;\n }\n\n result = temp[0] >> index[0];\n temp[0] &= mask >> (16 - index[0]);\n }\n\n if (result < one << (n - 1)) {\n result += (n_one << n) + 1;\n }\n\n return result;\n };\n jpeg.lossless.Decoder.prototype.getPreviousX = function (compOffset) {\n /*jslint bitwise: true */\n\n if (this.xLoc > 0) {\n return this.getter(\n this.yLoc * this.xDim + this.xLoc - 1,\n compOffset\n );\n } else if (this.yLoc > 0) {\n return this.getPreviousY(compOffset);\n }\n\n return 1 << (this.frame.precision - 1);\n };\n\n jpeg.lossless.Decoder.prototype.getPreviousXY = function (\n compOffset\n ) {\n /*jslint bitwise: true */\n\n if (this.xLoc > 0 && this.yLoc > 0) {\n return this.getter(\n (this.yLoc - 1) * this.xDim + this.xLoc - 1,\n compOffset\n );\n }\n\n return this.getPreviousY(compOffset);\n };\n jpeg.lossless.Decoder.prototype.getPreviousY = function (compOffset) {\n /*jslint bitwise: true */\n\n if (this.yLoc > 0) {\n return this.getter(\n (this.yLoc - 1) * this.xDim + this.xLoc,\n compOffset\n );\n }\n\n return this.getPreviousX(compOffset);\n };\n jpeg.lossless.Decoder.prototype.isLastPixel = function () {\n return this.xLoc === this.xDim - 1 && this.yLoc === this.yDim - 1;\n };\n jpeg.lossless.Decoder.prototype.outputSingle = function (PRED) {\n if (this.xLoc < this.xDim && this.yLoc < this.yDim) {\n this.setter(\n this.yLoc * this.xDim + this.xLoc,\n this.mask & PRED[0]\n );\n\n this.xLoc += 1;\n\n if (this.xLoc >= this.xDim) {\n this.yLoc += 1;\n this.xLoc = 0;\n }\n }\n };\n jpeg.lossless.Decoder.prototype.outputRGB = function (PRED) {\n var offset = this.yLoc * this.xDim + this.xLoc;\n\n if (this.xLoc < this.xDim && this.yLoc < this.yDim) {\n this.setter(offset, PRED[0], 0);\n this.setter(offset, PRED[1], 1);\n this.setter(offset, PRED[2], 2);\n\n this.xLoc += 1;\n\n if (this.xLoc >= this.xDim) {\n this.yLoc += 1;\n this.xLoc = 0;\n }\n }\n };\n\n jpeg.lossless.Decoder.prototype.setValue8 = function (index, val) {\n this.outputData[index] = val;\n };\n\n jpeg.lossless.Decoder.prototype.getValue8 = function (index) {\n return this.outputData[index]; // mask should not be necessary because outputData is either Int8Array or Int16Array\n };\n\n var littleEndian = (function () {\n var buffer = new ArrayBuffer(2);\n\n new DataView(buffer).setInt16(0, 256, true /* littleEndian */);\n // Int16Array uses the platform's endianness.\n return new Int16Array(buffer)[0] === 256;\n })();\n\n if (littleEndian) {\n // just reading from an array is fine then. Int16Array will use platform endianness.\n jpeg.lossless.Decoder.prototype.setValue16 =\n jpeg.lossless.Decoder.prototype.setValue8;\n jpeg.lossless.Decoder.prototype.getValue16 =\n jpeg.lossless.Decoder.prototype.getValue8;\n } else {\n // If platform is big-endian, we will need to convert to little-endian\n jpeg.lossless.Decoder.prototype.setValue16 = function (index, val) {\n this.outputData[index] =\n ((val & 0xff) << 8) | ((val >> 8) & 0xff);\n };\n\n jpeg.lossless.Decoder.prototype.getValue16 = function (index) {\n var val = this.outputData[index];\n\n return ((val & 0xff) << 8) | ((val >> 8) & 0xff);\n };\n }\n\n jpeg.lossless.Decoder.prototype.setValueRGB = function (\n index,\n val,\n compOffset\n ) {\n // this.outputData.setUint8(index * 3 + compOffset, val);\n this.outputData[index * 3 + compOffset] = val;\n };\n\n jpeg.lossless.Decoder.prototype.getValueRGB = function (\n index,\n compOffset\n ) {\n // return this.outputData.getUint8(index * 3 + compOffset);\n return this.outputData[index * 3 + compOffset];\n };\n jpeg.lossless.Decoder.prototype.readApp = function () {\n var count = 0,\n length = this.stream.get16();\n\n count += 2;\n\n while (count < length) {\n this.stream.get8();\n count += 1;\n }\n\n return length;\n };\n jpeg.lossless.Decoder.prototype.readComment = function () {\n var sb = '',\n count = 0,\n length;\n\n length = this.stream.get16();\n count += 2;\n\n while (count < length) {\n sb += this.stream.get8();\n count += 1;\n }\n\n return sb;\n };\n jpeg.lossless.Decoder.prototype.readNumber = function () {\n var Ld = this.stream.get16();\n\n if (Ld !== 4) {\n throw new Error(\n 'ERROR: Define number format throw new IOException [Ld!=4]'\n );\n }\n\n return this.stream.get16();\n };\n /*** Exports ***/\n\n var moduleType = typeof module;\n\n if (moduleType !== 'undefined' && module.exports) {\n module.exports = jpeg.lossless.Decoder;\n }\n },\n {\n './data-stream.js': 2,\n './frame-header.js': 4,\n './huffman-table.js': 5,\n './quantization-table.js': 7,\n './scan-header.js': 9,\n './utils.js': 10,\n },\n ],\n 4: [\n function (require, module, exports) {\n /*\n * Copyright (C) 2015 Michael Martinez\n * Changes: Added support for selection values 2-7, fixed minor bugs &\n * warnings, split into multiple class files, and general clean up.\n *\n * 08-25-2015: Helmut Dersch agreed to a license change from LGPL to MIT.\n */\n\n /*\n * Copyright (C) Helmut Dersch\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 /*jslint browser: true, node: true */\n /*global require, module */\n /*** Imports ***/\n var jpeg = jpeg || {};\n\n jpeg.lossless = jpeg.lossless || {};\n jpeg.lossless.ComponentSpec =\n jpeg.lossless.ComponentSpec ||\n (typeof require !== 'undefined'\n ? require('./component-spec.js')\n : null);\n jpeg.lossless.DataStream =\n jpeg.lossless.DataStream ||\n (typeof require !== 'undefined'\n ? require('./data-stream.js')\n : null);\n\n /*** Constructor ***/\n jpeg.lossless.FrameHeader =\n jpeg.lossless.FrameHeader ||\n function () {\n this.components = []; // Components\n this.dimX = 0; // Number of samples per line\n this.dimY = 0; // Number of lines\n this.numComp = 0; // Number of component in the frame\n this.precision = 0; // Sample Precision (from the original image)\n };\n /*** Prototype Methods ***/\n\n jpeg.lossless.FrameHeader.prototype.read = function (data) {\n /*jslint bitwise: true */\n\n var count = 0,\n length,\n i,\n c,\n temp;\n\n length = data.get16();\n count += 2;\n\n this.precision = data.get8();\n count += 1;\n\n this.dimY = data.get16();\n count += 2;\n\n this.dimX = data.get16();\n count += 2;\n\n this.numComp = data.get8();\n count += 1;\n for (i = 1; i <= this.numComp; i += 1) {\n if (count > length) {\n throw new Error('ERROR: frame format error');\n }\n\n c = data.get8();\n count += 1;\n\n if (count >= length) {\n throw new Error('ERROR: frame format error [c>=Lf]');\n }\n\n temp = data.get8();\n count += 1;\n\n if (!this.components[c]) {\n this.components[c] = new jpeg.lossless.ComponentSpec();\n }\n\n this.components[c].hSamp = temp >> 4;\n this.components[c].vSamp = temp & 0x0f;\n this.components[c].quantTableSel = data.get8();\n count += 1;\n }\n\n if (count !== length) {\n throw new Error('ERROR: frame format error [Lf!=count]');\n }\n\n return 1;\n };\n\n /*** Exports ***/\n\n var moduleType = typeof module;\n\n if (moduleType !== 'undefined' && module.exports) {\n module.exports = jpeg.lossless.FrameHeader;\n }\n },\n { './component-spec.js': 1, './data-stream.js': 2 },\n ],\n 5: [\n function (require, module, exports) {\n /*\n * Copyright (C) 2015 Michael Martinez\n * Changes: Added support for selection values 2-7, fixed minor bugs &\n * warnings, split into multiple class files, and general clean up.\n *\n * 08-25-2015: Helmut Dersch agreed to a license change from LGPL to MIT.\n */\n\n /*\n * Copyright (C) Helmut Dersch\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 /*jslint browser: true, node: true */\n /*global require, module */\n\n /*** Imports ***/\n var jpeg = jpeg || {};\n\n jpeg.lossless = jpeg.lossless || {};\n jpeg.lossless.DataStream =\n jpeg.lossless.DataStream ||\n (typeof require !== 'undefined'\n ? require('./data-stream.js')\n : null);\n jpeg.lossless.Utils =\n jpeg.lossless.Utils ||\n (typeof require !== 'undefined' ? require('./utils.js') : null);\n\n /*** Constructor ***/\n jpeg.lossless.HuffmanTable =\n jpeg.lossless.HuffmanTable ||\n function () {\n this.l = jpeg.lossless.Utils.createArray(4, 2, 16);\n this.th = [];\n this.v = jpeg.lossless.Utils.createArray(4, 2, 16, 200);\n this.tc = jpeg.lossless.Utils.createArray(4, 2);\n\n this.tc[0][0] = 0;\n this.tc[1][0] = 0;\n this.tc[2][0] = 0;\n this.tc[3][0] = 0;\n this.tc[0][1] = 0;\n this.tc[1][1] = 0;\n this.tc[2][1] = 0;\n this.tc[3][1] = 0;\n this.th[0] = 0;\n this.th[1] = 0;\n this.th[2] = 0;\n this.th[3] = 0;\n };\n /*** Static Pseudo-constants ***/\n\n jpeg.lossless.HuffmanTable.MSB = 0x80000000;\n\n /*** Prototype Methods ***/\n\n jpeg.lossless.HuffmanTable.prototype.read = function (data, HuffTab) {\n /*jslint bitwise: true */\n\n var count = 0,\n length,\n temp,\n t,\n c,\n i,\n j;\n\n length = data.get16();\n count += 2;\n\n while (count < length) {\n temp = data.get8();\n count += 1;\n t = temp & 0x0f;\n if (t > 3) {\n throw new Error('ERROR: Huffman table ID > 3');\n }\n\n c = temp >> 4;\n if (c > 2) {\n throw new Error('ERROR: Huffman table [Table class > 2 ]');\n }\n\n this.th[t] = 1;\n this.tc[t][c] = 1;\n\n for (i = 0; i < 16; i += 1) {\n this.l[t][c][i] = data.get8();\n count += 1;\n }\n\n for (i = 0; i < 16; i += 1) {\n for (j = 0; j < this.l[t][c][i]; j += 1) {\n if (count > length) {\n throw new Error(\n 'ERROR: Huffman table format error [count>Lh]'\n );\n }\n\n this.v[t][c][i][j] = data.get8();\n count += 1;\n }\n }\n }\n\n if (count !== length) {\n throw new Error('ERROR: Huffman table format error [count!=Lf]');\n }\n\n for (i = 0; i < 4; i += 1) {\n for (j = 0; j < 2; j += 1) {\n if (this.tc[i][j] !== 0) {\n this.buildHuffTable(\n HuffTab[i][j],\n this.l[i][j],\n this.v[i][j]\n );\n }\n }\n }\n\n return 1;\n };\n // Build_HuffTab()\n // Parameter: t table ID\n // c table class ( 0 for DC, 1 for AC )\n // L[i] # of codewords which length is i\n // V[i][j] Huffman Value (length=i)\n // Effect:\n // build up HuffTab[t][c] using L and V.\n jpeg.lossless.HuffmanTable.prototype.buildHuffTable = function (\n tab,\n L,\n V\n ) {\n /*jslint bitwise: true */\n\n var currentTable, temp, k, i, j, n;\n\n temp = 256;\n k = 0;\n\n for (i = 0; i < 8; i += 1) {\n // i+1 is Code length\n for (j = 0; j < L[i]; j += 1) {\n for (n = 0; n < temp >> (i + 1); n += 1) {\n tab[k] = V[i][j] | ((i + 1) << 8);\n k += 1;\n }\n }\n }\n\n for (i = 1; k < 256; i += 1, k += 1) {\n tab[k] = i | jpeg.lossless.HuffmanTable.MSB;\n }\n\n currentTable = 1;\n k = 0;\n\n for (i = 8; i < 16; i += 1) {\n // i+1 is Code length\n for (j = 0; j < L[i]; j += 1) {\n for (n = 0; n < temp >> (i - 7); n += 1) {\n tab[currentTable * 256 + k] = V[i][j] | ((i + 1) << 8);\n k += 1;\n }\n\n if (k >= 256) {\n if (k > 256) {\n throw new Error('ERROR: Huffman table error(1)!');\n }\n\n k = 0;\n currentTable += 1;\n }\n }\n }\n };\n\n /*** Exports ***/\n\n var moduleType = typeof module;\n\n if (moduleType !== 'undefined' && module.exports) {\n module.exports = jpeg.lossless.HuffmanTable;\n }\n },\n { './data-stream.js': 2, './utils.js': 10 },\n ],\n 6: [\n function (require, module, exports) {\n /*jslint browser: true, node: true */\n /*global require, module */\n\n /*** Imports ****/\n\n /**\n * jpeg\n * @type {*|{}}\n */\n var jpeg = jpeg || {};\n\n /**\n * jpeg.lossless\n * @type {*|{}}\n */\n jpeg.lossless = jpeg.lossless || {};\n\n jpeg.lossless.ComponentSpec =\n jpeg.lossless.ComponentSpec ||\n (typeof require !== 'undefined'\n ? require('./component-spec.js')\n : null);\n jpeg.lossless.DataStream =\n jpeg.lossless.DataStream ||\n (typeof require !== 'undefined'\n ? require('./data-stream.js')\n : null);\n jpeg.lossless.Decoder =\n jpeg.lossless.Decoder ||\n (typeof require !== 'undefined' ? require('./decoder.js') : null);\n jpeg.lossless.FrameHeader =\n jpeg.lossless.FrameHeader ||\n (typeof require !== 'undefined'\n ? require('./frame-header.js')\n : null);\n jpeg.lossless.HuffmanTable =\n jpeg.lossless.HuffmanTable ||\n (typeof require !== 'undefined'\n ? require('./huffman-table.js')\n : null);\n jpeg.lossless.QuantizationTable =\n jpeg.lossless.QuantizationTable ||\n (typeof require !== 'undefined'\n ? require('./quantization-table.js')\n : null);\n jpeg.lossless.ScanComponent =\n jpeg.lossless.ScanComponent ||\n (typeof require !== 'undefined'\n ? require('./scan-component.js')\n : null);\n jpeg.lossless.ScanHeader =\n jpeg.lossless.ScanHeader ||\n (typeof require !== 'undefined'\n ? require('./scan-header.js')\n : null);\n jpeg.lossless.Utils =\n jpeg.lossless.Utils ||\n (typeof require !== 'undefined' ? require('./utils.js') : null);\n\n /*** Exports ***/\n var moduleType = typeof module;\n\n if (moduleType !== 'undefined' && module.exports) {\n module.exports = jpeg;\n }\n },\n {\n './component-spec.js': 1,\n './data-stream.js': 2,\n './decoder.js': 3,\n './frame-header.js': 4,\n './huffman-table.js': 5,\n './quantization-table.js': 7,\n './scan-component.js': 8,\n './scan-header.js': 9,\n './utils.js': 10,\n },\n ],\n 7: [\n function (require, module, exports) {\n /*\n * Copyright (C) 2015 Michael Martinez\n * Changes: Added support for selection values 2-7, fixed minor bugs &\n * warnings, split into multiple class files, and general clean up.\n *\n * 08-25-2015: Helmut Dersch agreed to a license change from LGPL to MIT.\n */\n\n /*\n * Copyright (C) Helmut Dersch\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 /*jslint browser: true, node: true */\n /*global require, module */\n /*** Imports ***/\n var jpeg = jpeg || {};\n\n jpeg.lossless = jpeg.lossless || {};\n jpeg.lossless.DataStream =\n jpeg.lossless.DataStream ||\n (typeof require !== 'undefined'\n ? require('./data-stream.js')\n : null);\n jpeg.lossless.Utils =\n jpeg.lossless.Utils ||\n (typeof require !== 'undefined' ? require('./utils.js') : null);\n\n /*** Constructor ***/\n jpeg.lossless.QuantizationTable =\n jpeg.lossless.QuantizationTable ||\n function () {\n this.precision = []; // Quantization precision 8 or 16\n this.tq = []; // 1: this table is presented\n this.quantTables = jpeg.lossless.Utils.createArray(4, 64); // Tables\n\n this.tq[0] = 0;\n this.tq[1] = 0;\n this.tq[2] = 0;\n this.tq[3] = 0;\n };\n /*** Static Methods ***/\n\n jpeg.lossless.QuantizationTable.enhanceQuantizationTable = function (\n qtab,\n table\n ) {\n /*jslint bitwise: true */\n\n var i;\n\n for (i = 0; i < 8; i += 1) {\n qtab[table[0 * 8 + i]] *= 90;\n qtab[table[4 * 8 + i]] *= 90;\n qtab[table[2 * 8 + i]] *= 118;\n qtab[table[6 * 8 + i]] *= 49;\n qtab[table[5 * 8 + i]] *= 71;\n qtab[table[1 * 8 + i]] *= 126;\n qtab[table[7 * 8 + i]] *= 25;\n qtab[table[3 * 8 + i]] *= 106;\n }\n\n for (i = 0; i < 8; i += 1) {\n qtab[table[0 + 8 * i]] *= 90;\n qtab[table[4 + 8 * i]] *= 90;\n qtab[table[2 + 8 * i]] *= 118;\n qtab[table[6 + 8 * i]] *= 49;\n qtab[table[5 + 8 * i]] *= 71;\n qtab[table[1 + 8 * i]] *= 126;\n qtab[table[7 + 8 * i]] *= 25;\n qtab[table[3 + 8 * i]] *= 106;\n }\n\n for (i = 0; i < 64; i += 1) {\n qtab[i] >>= 6;\n }\n };\n\n /*** Prototype Methods ***/\n\n jpeg.lossless.QuantizationTable.prototype.read = function (\n data,\n table\n ) {\n /*jslint bitwise: true */\n\n var count = 0,\n length,\n temp,\n t,\n i;\n\n length = data.get16();\n count += 2;\n\n while (count < length) {\n temp = data.get8();\n count += 1;\n t = temp & 0x0f;\n\n if (t > 3) {\n throw new Error('ERROR: Quantization table ID > 3');\n }\n\n this.precision[t] = temp >> 4;\n\n if (this.precision[t] === 0) {\n this.precision[t] = 8;\n } else if (this.precision[t] === 1) {\n this.precision[t] = 16;\n } else {\n throw new Error('ERROR: Quantization table precision error');\n }\n\n this.tq[t] = 1;\n\n if (this.precision[t] === 8) {\n for (i = 0; i < 64; i += 1) {\n if (count > length) {\n throw new Error('ERROR: Quantization table format error');\n }\n\n this.quantTables[t][i] = data.get8();\n count += 1;\n }\n\n jpeg.lossless.QuantizationTable.enhanceQuantizationTable(\n this.quantTables[t],\n table\n );\n } else {\n for (i = 0; i < 64; i += 1) {\n if (count > length) {\n throw new Error('ERROR: Quantization table format error');\n }\n\n this.quantTables[t][i] = data.get16();\n count += 2;\n }\n\n jpeg.lossless.QuantizationTable.enhanceQuantizationTable(\n this.quantTables[t],\n table\n );\n }\n }\n\n if (count !== length) {\n throw new Error('ERROR: Quantization table error [count!=Lq]');\n }\n\n return 1;\n };\n /*** Exports ***/\n\n var moduleType = typeof module;\n\n if (moduleType !== 'undefined' && module.exports) {\n module.exports = jpeg.lossless.QuantizationTable;\n }\n },\n { './data-stream.js': 2, './utils.js': 10 },\n ],\n 8: [\n function (require, module, exports) {\n /*\n * Copyright (C) 2015 Michael Martinez\n * Changes: Added support for selection values 2-7, fixed minor bugs &\n * warnings, split into multiple class files, and general clean up.\n *\n * 08-25-2015: Helmut Dersch agreed to a license change from LGPL to MIT.\n */\n\n /*\n * Copyright (C) Helmut Dersch\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 /*jslint browser: true, node: true */\n /*global require, module */\n /*** Imports ***/\n var jpeg = jpeg || {};\n\n jpeg.lossless = jpeg.lossless || {};\n\n /*** Constructor ***/\n jpeg.lossless.ScanComponent =\n jpeg.lossless.ScanComponent ||\n function () {\n this.acTabSel = 0; // AC table selector\n this.dcTabSel = 0; // DC table selector\n this.scanCompSel = 0; // Scan component selector\n };\n /*** Exports ***/\n\n var moduleType = typeof module;\n\n if (moduleType !== 'undefined' && module.exports) {\n module.exports = jpeg.lossless.ScanComponent;\n }\n },\n {},\n ],\n 9: [\n function (require, module, exports) {\n /*\n * Copyright (C) 2015 Michael Martinez\n * Changes: Added support for selection values 2-7, fixed minor bugs &\n * warnings, split into multiple class files, and general clean up.\n *\n * 08-25-2015: Helmut Dersch agreed to a license change from LGPL to MIT.\n */\n\n /*\n * Copyright (C) Helmut Dersch\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 /*jslint browser: true, node: true */\n /*global require, module */\n /*** Imports ***/\n var jpeg = jpeg || {};\n\n jpeg.lossless = jpeg.lossless || {};\n jpeg.lossless.DataStream =\n jpeg.lossless.DataStream ||\n (typeof require !== 'undefined'\n ? require('./data-stream.js')\n : null);\n jpeg.lossless.ScanComponent =\n jpeg.lossless.ScanComponent ||\n (typeof require !== 'undefined'\n ? require('./scan-component.js')\n : null);\n\n /*** Constructor ***/\n jpeg.lossless.ScanHeader =\n jpeg.lossless.ScanHeader ||\n function () {\n this.ah = 0;\n this.al = 0;\n this.numComp = 0; // Number of components in the scan\n this.selection = 0; // Start of spectral or predictor selection\n this.spectralEnd = 0; // End of spectral selection\n this.components = [];\n };\n\n /*** Prototype Methods ***/\n\n jpeg.lossless.ScanHeader.prototype.read = function (data) {\n /*jslint bitwise: true */\n\n var count = 0,\n length,\n i,\n temp;\n\n length = data.get16();\n count += 2;\n\n this.numComp = data.get8();\n count += 1;\n\n for (i = 0; i < this.numComp; i += 1) {\n this.components[i] = new jpeg.lossless.ScanComponent();\n\n if (count > length) {\n throw new Error('ERROR: scan header format error');\n }\n\n this.components[i].scanCompSel = data.get8();\n count += 1;\n\n temp = data.get8();\n count += 1;\n\n this.components[i].dcTabSel = temp >> 4;\n this.components[i].acTabSel = temp & 0x0f;\n }\n\n this.selection = data.get8();\n count += 1;\n\n this.spectralEnd = data.get8();\n count += 1;\n\n temp = data.get8();\n this.ah = temp >> 4;\n this.al = temp & 0x0f;\n count += 1;\n\n if (count !== length) {\n throw new Error('ERROR: scan header format error [count!=Ns]');\n }\n\n return 1;\n };\n /*** Exports ***/\n\n var moduleType = typeof module;\n\n if (moduleType !== 'undefined' && module.exports) {\n module.exports = jpeg.lossless.ScanHeader;\n }\n },\n { './data-stream.js': 2, './scan-component.js': 8 },\n ],\n 10: [\n function (require, module, exports) {\n /*\n * Copyright (C) 2015 Michael Martinez\n * Changes: Added support for selection values 2-7, fixed minor bugs &\n * warnings, split into multiple class files, and general clean up.\n *\n * 08-25-2015: Helmut Dersch agreed to a license change from LGPL to MIT.\n */\n\n /*\n * Copyright (C) Helmut Dersch\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 /*jslint browser: true, node: true */\n /*global require, module */\n /*** Imports ***/\n var jpeg = jpeg || {};\n\n jpeg.lossless = jpeg.lossless || {};\n\n /*** Constructor ***/\n jpeg.lossless.Utils = jpeg.lossless.Utils || {};\n\n /*** Static methods ***/\n\n // http://stackoverflow.com/questions/966225/how-can-i-create-a-two-dimensional-array-in-javascript\n jpeg.lossless.Utils.createArray = function (length) {\n var arr = new Array(length || 0),\n i = length;\n\n if (arguments.length > 1) {\n var args = Array.prototype.slice.call(arguments, 1);\n\n while (i--) {\n arr[length - 1 - i] = jpeg.lossless.Utils.createArray.apply(\n this,\n args\n );\n }\n }\n\n return arr;\n };\n\n // http://stackoverflow.com/questions/18638900/javascript-crc32\n jpeg.lossless.Utils.makeCRCTable = function () {\n var c;\n var crcTable = [];\n\n for (var n = 0; n < 256; n++) {\n c = n;\n for (var k = 0; k < 8; k++) {\n c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;\n }\n crcTable[n] = c;\n }\n\n return crcTable;\n };\n\n jpeg.lossless.Utils.crc32 = function (dataView) {\n var uint8view = new Uint8Array(dataView.buffer);\n var crcTable =\n jpeg.lossless.Utils.crcTable ||\n (jpeg.lossless.Utils.crcTable =\n jpeg.lossless.Utils.makeCRCTable());\n var crc = 0 ^ -1;\n\n for (var i = 0; i < uint8view.length; i++) {\n crc = (crc >>> 8) ^ crcTable[(crc ^ uint8view[i]) & 0xff];\n }\n\n return (crc ^ -1) >>> 0;\n };\n\n /*** Exports ***/\n\n var moduleType = typeof module;\n\n if (moduleType !== 'undefined' && module.exports) {\n module.exports = jpeg.lossless.Utils;\n }\n },\n {},\n ],\n },\n {},\n [6]\n )(6);\n});\n"],"names":["f","exports","module","define","amd","window","global","self","this","jpeg","e","t","n","r","s","o","u","a","require","i","Error","code","l","call","length","lossless","ComponentSpec","hSamp","quantTableSel","vSamp","DataStream","data","offset","buffer","Uint8Array","index","prototype","get16","value","get8","HuffmanTable","QuantizationTable","ScanHeader","FrameHeader","Utils","Decoder","numBytes","frame","huffTable","quantTable","scan","DU","createArray","HuffTab","IDCT_Source","nBlock","acTab","dcTab","qTab","marker","markerIndex","numComp","restartInterval","selection","xDim","yDim","xLoc","yLoc","outputData","restarting","mask","IDCT_P","TABLE","MAX_HUFFMAN_SUBTREE","MSB","RESTART_MARKER_BEGIN","RESTART_MARKER_END","decompress","decode","current","compN","mcuNum","scanNum","pred","temp","stream","read","readNumber","readApp","readComment","precision","components","parseInt","Math","ceil","getter","getValueRGB","setter","setValueRGB","output","outputRGB","getValue8","setValue8","outputSingle","getValue16","setValue16","selector","select2","select3","select4","select5","select6","select7","select1","scanComps","quantTables","scanCompSel","dcTabSel","acTabSel","dimX","dimY","ArrayBuffer","Uint16Array","decodeUnit","prev","decodeSingle","decodeRGB","compOffset","getPreviousX","getPreviousY","getPreviousXY","actab","dctab","qtab","ctrC","k","j","getHuffmanValue","getn","nRestart","table","input","PRED","result","isLastPixel","val","DataView","setInt16","Int16Array","count","sb","c","th","v","tc","buildHuffTable","tab","L","V","currentTable","ScanComponent","tq","enhanceQuantizationTable","ah","al","spectralEnd","arr","Array","arguments","args","slice","apply","makeCRCTable","crcTable","crc32","dataView","uint8view","crc"],"sourceRoot":""} \ No newline at end of file diff --git a/resources/613.bundle.5804a80c89dddd4251d0.js b/resources/613.bundle.5804a80c89dddd4251d0.js new file mode 100644 index 0000000..c96e7a5 --- /dev/null +++ b/resources/613.bundle.5804a80c89dddd4251d0.js @@ -0,0 +1,2 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[613],{32613:(o,e,t)=>{t.r(e),t.d(e,{default:()=>M});var n=t(71771);const i=JSON.parse('{"u2":"@ohif/mode-segmentation"}').u2;var r=t(71783);const{windowLevelPresets:s}=n.defaults;function a(o,e,t,n,i,r,s){return{id:e,icon:t,label:n,type:o,commands:i,tooltip:r,uiType:s}}const l=a.bind(null,"action"),c=a.bind(null,"toggle"),m=a.bind(null,"tool");function d(o,e,t){return{id:o.toString(),title:e,subtitle:t,type:"action",commands:[{commandName:"setWindowLevel",commandOptions:{...s[o]},context:"CORNERSTONE"}]}}const p=["default","mpr","SRToolGroup"];function u(o){return p.map((e=>({commandName:"setToolActive",commandOptions:{toolGroupId:e,toolName:o},context:"CORNERSTONE"})))}const N=[{id:"Zoom",type:"ohif.radioGroup",props:{type:"tool",icon:"tool-zoom",label:"Zoom",commands:u("Zoom")}},{id:"WindowLevel",type:"ohif.splitButton",props:{groupId:"WindowLevel",primary:m("WindowLevel","tool-window-level","Window Level",[{commandName:"setToolActive",commandOptions:{toolName:"WindowLevel"},context:"CORNERSTONE"}],"Window Level"),secondary:{icon:"chevron-down",label:"W/L Manual",isActive:!0,tooltip:"W/L Presets"},isAction:!0,renderer:r.eJ,items:[d(1,"Soft tissue","400 / 40"),d(2,"Lung","1500 / -600"),d(3,"Liver","150 / 90"),d(4,"Bone","2500 / 480"),d(5,"Brain","80 / 40")]}},{id:"Pan",type:"ohif.radioGroup",props:{type:"tool",icon:"tool-move",label:"Pan",commands:u("Pan")}},{id:"Capture",type:"ohif.action",props:{icon:"tool-capture",label:"Capture",type:"action",commands:[{commandName:"showDownloadViewportModal",commandOptions:{},context:"CORNERSTONE"}]}},{id:"Layout",type:"ohif.layoutSelector",props:{rows:3,columns:3}},{id:"MPR",type:"ohif.action",props:{type:"toggle",icon:"icon-mpr",label:"MPR",commands:[{commandName:"toggleHangingProtocol",commandOptions:{protocolId:"mpr"},context:"DEFAULT"}]}},{id:"Crosshairs",type:"ohif.radioGroup",props:{type:"tool",icon:"tool-crosshair",label:"Crosshairs",commands:[{commandName:"setToolActive",commandOptions:{toolName:"Crosshairs",toolGroupId:"mpr"},context:"CORNERSTONE"}]}},{id:"MoreTools",type:"ohif.splitButton",props:{isRadio:!0,groupId:"MoreTools",primary:l("Reset","tool-reset","Reset View",[{commandName:"resetViewport",commandOptions:{},context:"CORNERSTONE"}],"Reset"),secondary:{icon:"chevron-down",label:"",isActive:!0,tooltip:"More Tools"},items:[l("Reset","tool-reset","Reset View",[{commandName:"resetViewport",commandOptions:{},context:"CORNERSTONE"}],"Reset"),l("rotate-right","tool-rotate-right","Rotate Right",[{commandName:"rotateViewportCW",commandOptions:{},context:"CORNERSTONE"}],"Rotate +90"),l("flip-horizontal","tool-flip-horizontal","Flip Horizontally",[{commandName:"flipViewportHorizontal",commandOptions:{},context:"CORNERSTONE"}],"Flip Horizontal"),c("StackImageSync","link","Stack Image Sync",[{commandName:"toggleStackImageSync",commandOptions:{},context:"CORNERSTONE"}]),c("ReferenceLines","tool-referenceLines","Reference Lines",[{commandName:"toggleReferenceLines",commandOptions:{},context:"CORNERSTONE"}]),m("StackScroll","tool-stack-scroll","Stack Scroll",[{commandName:"setToolActive",commandOptions:{toolName:"StackScroll"},context:"CORNERSTONE"}],"Stack Scroll"),l("invert","tool-invert","Invert",[{commandName:"invertViewport",commandOptions:{},context:"CORNERSTONE"}],"Invert Colors"),c("cine","tool-cine","Cine",[{commandName:"toggleCine",context:"CORNERSTONE"}],"Cine"),m("Magnify","tool-magnify","Magnify",[{commandName:"setToolActive",commandOptions:{toolName:"Magnify"},context:"CORNERSTONE"}],"Magnify"),l("TagBrowser","list-bullets","Dicom Tag Browser",[{commandName:"openDICOMTagViewer",commandOptions:{},context:"DEFAULT"}],"Dicom Tag Browser")]}}],S={CircularBrush:"CircularBrush",CircularEraser:"CircularEraser",SphereBrush:"SphereBrush",SphereEraser:"SphereEraser",ThresholdCircularBrush:"ThresholdCircularBrush",ThresholdSphereBrush:"ThresholdSphereBrush"},h={CircularBrush:"FILL_INSIDE_CIRCLE",CircularEraser:"ERASE_INSIDE_CIRCLE",SphereBrush:"FILL_INSIDE_SPHERE",SphereEraser:"ERASE_INSIDE_SPHERE",ThresholdCircularBrush:"THRESHOLD_INSIDE_CIRCLE",ThresholdSphereBrush:"THRESHOLD_INSIDE_SPHERE"};function E(o){const{toolNames:e,Enums:t}=o.exports;return{active:[{toolName:e.WindowLevel,bindings:[{mouseButton:t.MouseBindings.Primary}]},{toolName:e.Pan,bindings:[{mouseButton:t.MouseBindings.Auxiliary}]},{toolName:e.Zoom,bindings:[{mouseButton:t.MouseBindings.Secondary}]},{toolName:e.StackScrollMouseWheel,bindings:[]}],passive:Object.keys(S).map((o=>({toolName:o,parentTool:"Brush",configuration:{activeStrategy:h[o]}}))).concat([{toolName:e.CircleScissors},{toolName:e.RectangleScissors},{toolName:e.SphereScissors},{toolName:e.StackScroll},{toolName:e.Magnify},{toolName:e.SegmentationDisplay}]),disabled:[{toolName:e.ReferenceLines}]}}const g=function(o,e,t){!function(o,e,t,n){const i=E(o.getModuleEntry("@ohif/extension-cornerstone.utilityModule.tools"));e.createToolGroupAndAddTools(n,i)}(o,e,0,"default"),function(o,e,t){const n=o.getModuleEntry("@ohif/extension-cornerstone.utilityModule.tools"),i=E(n);i.disabled.push({toolName:n.exports.toolNames.Crosshairs,configuration:{viewportIndicators:!1,autoPan:{enabled:!1,panSize:10}}},{toolName:n.exports.toolNames.ReferenceLines}),e.createToolGroupAndAddTools("mpr",i)}(o,e)},R="@ohif/extension-default.layoutTemplateModule.viewerLayout",y="@ohif/extension-default.sopClassHandlerModule.stack",f="@ohif/extension-default.panelModule.seriesList",T="@ohif/extension-cornerstone.viewportModule.cornerstone",O="@ohif/extension-cornerstone-dicom-seg.panelModule.panelSegmentationWithTools",v="@ohif/extension-cornerstone-dicom-seg.sopClassHandlerModule.dicom-seg",C="@ohif/extension-cornerstone-dicom-seg.viewportModule.dicom-seg",w={"@ohif/extension-default":"^3.0.0","@ohif/extension-cornerstone":"^3.0.0","@ohif/extension-cornerstone-dicom-seg":"^3.0.0"};const M={id:i,modeFactory:function(o){let{modeConfiguration:e}=o;return{id:i,routeName:"segmentation",displayName:"Segmentation",onModeEnter:o=>{let{servicesManager:e,extensionManager:t,commandsManager:n}=o;const{measurementService:i,toolbarService:r,toolGroupService:s}=e.services;let a;i.clearMeasurements(),g(t,s,n);({unsubscribe:a}=s.subscribe(s.EVENTS.VIEWPORT_ADDED,(()=>{r.recordInteraction({groupId:"WindowLevel",interactionType:"tool",commands:[{commandName:"setToolActive",commandOptions:{toolName:"WindowLevel"},context:"CORNERSTONE"}]}),a()}))),r.init(t),r.addButtons(N),r.createButtonSection("primary",["Zoom","WindowLevel","Pan","Capture","Layout","MPR","Crosshairs","MoreTools"])},onModeExit:o=>{let{servicesManager:e}=o;const{toolGroupService:t,syncGroupService:n,toolbarService:i,segmentationService:r,cornerstoneViewportService:s}=e.services;t.destroy(),n.destroy(),r.destroy(),s.destroy()},validationTags:{study:[],series:[]},isValidMode:o=>{let{modalities:e}=o;return!0},routes:[{path:"template",layoutTemplate:o=>{let{location:e,servicesManager:t}=o;return{id:R,props:{leftPanels:[f],rightPanels:[O],viewports:[{namespace:T,displaySetsToDisplay:[y]},{namespace:C,displaySetsToDisplay:[v]}]}}}}],extensions:w,sopClassHandlers:[y,v],hotkeys:[...n.dD.defaults.hotkeyBindings]}},extensionDependencies:w}}}]); +//# sourceMappingURL=613.bundle.5804a80c89dddd4251d0.js.map \ No newline at end of file diff --git a/resources/613.bundle.5804a80c89dddd4251d0.js.map b/resources/613.bundle.5804a80c89dddd4251d0.js.map new file mode 100644 index 0000000..2ebb870 --- /dev/null +++ b/resources/613.bundle.5804a80c89dddd4251d0.js.map @@ -0,0 +1 @@ +{"version":3,"file":"613.bundle.5804a80c89dddd4251d0.js","mappings":"uIAEMA,E,+CAAKC,G,eCKX,MAAM,mBAAEC,GAAuBC,EAAAA,SAQ/B,SAASC,EAAcC,EAAML,EAAIM,EAAMC,EAAOC,EAAUC,EAASC,GAC/D,MAAO,CACLV,KACAM,OACAC,QACAF,OACAG,WACAC,UACAC,SAEJ,CAEA,MAAMC,EAAsBP,EAAcQ,KAAK,KAAM,UAC/CC,EAAsBT,EAAcQ,KAAK,KAAM,UAC/CE,EAAoBV,EAAcQ,KAAK,KAAM,QAQnD,SAASG,EAAkBC,EAAQC,EAAOC,GACxC,MAAO,CACLlB,GAAIgB,EAAOG,WACXF,QACAC,WACAb,KAAM,SACNG,SAAU,CACR,CACEY,YAAa,iBACbC,eAAgB,IACXnB,EAAmBc,IAExBM,QAAS,gBAIjB,CAEA,MAAMC,EAAe,CAAC,UAAW,MAAO,eAQxC,SAASC,EAA6BC,GASpC,OARaF,EAAaG,KAAIC,IAAe,CAC3CP,YAAa,gBACbC,eAAgB,CACdM,cACAF,YAEFH,QAAS,iBAGb,CAEA,MAwRA,EAxRuB,CAErB,CACEtB,GAAI,OACJK,KAAM,kBACNuB,MAAO,CACLvB,KAAM,OACNC,KAAM,YACNC,MAAO,OACPC,SAAUgB,EAA6B,UAI3C,CACExB,GAAI,cACJK,KAAM,mBACNuB,MAAO,CACLC,QAAS,cACTC,QAAShB,EACP,cACA,oBACA,eACA,CACE,CACEM,YAAa,gBACbC,eAAgB,CACdI,SAAU,eAEZH,QAAS,gBAGb,gBAEFS,UAAW,CACTzB,KAAM,eACNC,MAAO,aACPyB,UAAU,EACVvB,QAAS,eAEXwB,UAAU,EACVC,SAAUC,EAAAA,GACVC,MAAO,CACLrB,EAAkB,EAAG,cAAe,YACpCA,EAAkB,EAAG,OAAQ,eAC7BA,EAAkB,EAAG,QAAS,YAC9BA,EAAkB,EAAG,OAAQ,cAC7BA,EAAkB,EAAG,QAAS,cAKpC,CACEf,GAAI,MACJK,KAAM,kBACNuB,MAAO,CACLvB,KAAM,OACNC,KAAM,YACNC,MAAO,MACPC,SAAUgB,EAA6B,SAG3C,CACExB,GAAI,UACJK,KAAM,cACNuB,MAAO,CACLtB,KAAM,eACNC,MAAO,UACPF,KAAM,SACNG,SAAU,CACR,CACEY,YAAa,4BACbC,eAAgB,CAAC,EACjBC,QAAS,kBAKjB,CACEtB,GAAI,SACJK,KAAM,sBACNuB,MAAO,CACLS,KAAM,EACNC,QAAS,IAGb,CACEtC,GAAI,MACJK,KAAM,cACNuB,MAAO,CACLvB,KAAM,SACNC,KAAM,WACNC,MAAO,MACPC,SAAU,CACR,CACEY,YAAa,wBACbC,eAAgB,CACdkB,WAAY,OAEdjB,QAAS,cAKjB,CACEtB,GAAI,aACJK,KAAM,kBACNuB,MAAO,CACLvB,KAAM,OACNC,KAAM,iBACNC,MAAO,aACPC,SAAU,CACR,CACEY,YAAa,gBACbC,eAAgB,CACdI,SAAU,aACVE,YAAa,OAEfL,QAAS,kBAMjB,CACEtB,GAAI,YACJK,KAAM,mBACNuB,MAAO,CACLY,SAAS,EACTX,QAAS,YACTC,QAASnB,EACP,QACA,aACA,aACA,CACE,CACES,YAAa,gBACbC,eAAgB,CAAC,EACjBC,QAAS,gBAGb,SAEFS,UAAW,CACTzB,KAAM,eACNC,MAAO,GACPyB,UAAU,EACVvB,QAAS,cAEX2B,MAAO,CACLzB,EACE,QACA,aACA,aACA,CACE,CACES,YAAa,gBACbC,eAAgB,CAAC,EACjBC,QAAS,gBAGb,SAEFX,EACE,eACA,oBACA,eACA,CACE,CACES,YAAa,mBACbC,eAAgB,CAAC,EACjBC,QAAS,gBAGb,cAEFX,EACE,kBACA,uBACA,oBACA,CACE,CACES,YAAa,yBACbC,eAAgB,CAAC,EACjBC,QAAS,gBAGb,mBAEFT,EAAoB,iBAAkB,OAAQ,mBAAoB,CAChE,CACEO,YAAa,uBACbC,eAAgB,CAAC,EACjBC,QAAS,iBAGbT,EACE,iBACA,sBACA,kBACA,CACE,CACEO,YAAa,uBACbC,eAAgB,CAAC,EACjBC,QAAS,iBAIfR,EACE,cACA,oBACA,eACA,CACE,CACEM,YAAa,gBACbC,eAAgB,CACdI,SAAU,eAEZH,QAAS,gBAGb,gBAEFX,EACE,SACA,cACA,SACA,CACE,CACES,YAAa,iBACbC,eAAgB,CAAC,EACjBC,QAAS,gBAGb,iBAEFT,EACE,OACA,YACA,OACA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","sources":["webpack:///../../../modes/segmentation/src/id.js","webpack:///../../../modes/segmentation/src/toolbarButtons.ts","webpack:///../../../modes/segmentation/src/initToolGroups.ts","webpack:///../../../modes/segmentation/src/index.tsx"],"sourcesContent":["import packageJson from '../package.json';\r\n\r\nconst id = packageJson.name;\r\n\r\nexport { id };\r\n","import {\r\n // ExpandableToolbarButton,\r\n // ListMenu,\r\n WindowLevelMenuItem,\r\n} from '@ohif/ui';\r\nimport { defaults } from '@ohif/core';\r\n\r\nconst { windowLevelPresets } = defaults;\r\n/**\r\n *\r\n * @param {*} type - 'tool' | 'action' | 'toggle'\r\n * @param {*} id\r\n * @param {*} icon\r\n * @param {*} label\r\n */\r\nfunction _createButton(type, id, icon, label, commands, tooltip, uiType) {\r\n return {\r\n id,\r\n icon,\r\n label,\r\n type,\r\n commands,\r\n tooltip,\r\n uiType,\r\n };\r\n}\r\n\r\nconst _createActionButton = _createButton.bind(null, 'action');\r\nconst _createToggleButton = _createButton.bind(null, 'toggle');\r\nconst _createToolButton = _createButton.bind(null, 'tool');\r\n\r\n/**\r\n *\r\n * @param {*} preset - preset number (from above import)\r\n * @param {*} title\r\n * @param {*} subtitle\r\n */\r\nfunction _createWwwcPreset(preset, title, subtitle) {\r\n return {\r\n id: preset.toString(),\r\n title,\r\n subtitle,\r\n type: 'action',\r\n commands: [\r\n {\r\n commandName: 'setWindowLevel',\r\n commandOptions: {\r\n ...windowLevelPresets[preset],\r\n },\r\n context: 'CORNERSTONE',\r\n },\r\n ],\r\n };\r\n}\r\n\r\nconst toolGroupIds = ['default', 'mpr', 'SRToolGroup'];\r\n\r\n/**\r\n * Creates an array of 'setToolActive' commands for the given toolName - one for\r\n * each toolGroupId specified in toolGroupIds.\r\n * @param {string} toolName\r\n * @returns {Array} an array of 'setToolActive' commands\r\n */\r\nfunction _createSetToolActiveCommands(toolName) {\r\n const temp = toolGroupIds.map(toolGroupId => ({\r\n commandName: 'setToolActive',\r\n commandOptions: {\r\n toolGroupId,\r\n toolName,\r\n },\r\n context: 'CORNERSTONE',\r\n }));\r\n return temp;\r\n}\r\n\r\nconst toolbarButtons = [\r\n // Zoom..\r\n {\r\n id: 'Zoom',\r\n type: 'ohif.radioGroup',\r\n props: {\r\n type: 'tool',\r\n icon: 'tool-zoom',\r\n label: 'Zoom',\r\n commands: _createSetToolActiveCommands('Zoom'),\r\n },\r\n },\r\n // Window Level + Presets...\r\n {\r\n id: 'WindowLevel',\r\n type: 'ohif.splitButton',\r\n props: {\r\n groupId: 'WindowLevel',\r\n primary: _createToolButton(\r\n 'WindowLevel',\r\n 'tool-window-level',\r\n 'Window Level',\r\n [\r\n {\r\n commandName: 'setToolActive',\r\n commandOptions: {\r\n toolName: 'WindowLevel',\r\n },\r\n context: 'CORNERSTONE',\r\n },\r\n ],\r\n 'Window Level'\r\n ),\r\n secondary: {\r\n icon: 'chevron-down',\r\n label: 'W/L Manual',\r\n isActive: true,\r\n tooltip: 'W/L Presets',\r\n },\r\n isAction: true, // ?\r\n renderer: WindowLevelMenuItem,\r\n items: [\r\n _createWwwcPreset(1, 'Soft tissue', '400 / 40'),\r\n _createWwwcPreset(2, 'Lung', '1500 / -600'),\r\n _createWwwcPreset(3, 'Liver', '150 / 90'),\r\n _createWwwcPreset(4, 'Bone', '2500 / 480'),\r\n _createWwwcPreset(5, 'Brain', '80 / 40'),\r\n ],\r\n },\r\n },\r\n // Pan...\r\n {\r\n id: 'Pan',\r\n type: 'ohif.radioGroup',\r\n props: {\r\n type: 'tool',\r\n icon: 'tool-move',\r\n label: 'Pan',\r\n commands: _createSetToolActiveCommands('Pan'),\r\n },\r\n },\r\n {\r\n id: 'Capture',\r\n type: 'ohif.action',\r\n props: {\r\n icon: 'tool-capture',\r\n label: 'Capture',\r\n type: 'action',\r\n commands: [\r\n {\r\n commandName: 'showDownloadViewportModal',\r\n commandOptions: {},\r\n context: 'CORNERSTONE',\r\n },\r\n ],\r\n },\r\n },\r\n {\r\n id: 'Layout',\r\n type: 'ohif.layoutSelector',\r\n props: {\r\n rows: 3,\r\n columns: 3,\r\n },\r\n },\r\n {\r\n id: 'MPR',\r\n type: 'ohif.action',\r\n props: {\r\n type: 'toggle',\r\n icon: 'icon-mpr',\r\n label: 'MPR',\r\n commands: [\r\n {\r\n commandName: 'toggleHangingProtocol',\r\n commandOptions: {\r\n protocolId: 'mpr',\r\n },\r\n context: 'DEFAULT',\r\n },\r\n ],\r\n },\r\n },\r\n {\r\n id: 'Crosshairs',\r\n type: 'ohif.radioGroup',\r\n props: {\r\n type: 'tool',\r\n icon: 'tool-crosshair',\r\n label: 'Crosshairs',\r\n commands: [\r\n {\r\n commandName: 'setToolActive',\r\n commandOptions: {\r\n toolName: 'Crosshairs',\r\n toolGroupId: 'mpr',\r\n },\r\n context: 'CORNERSTONE',\r\n },\r\n ],\r\n },\r\n },\r\n // More...\r\n {\r\n id: 'MoreTools',\r\n type: 'ohif.splitButton',\r\n props: {\r\n isRadio: true, // ?\r\n groupId: 'MoreTools',\r\n primary: _createActionButton(\r\n 'Reset',\r\n 'tool-reset',\r\n 'Reset View',\r\n [\r\n {\r\n commandName: 'resetViewport',\r\n commandOptions: {},\r\n context: 'CORNERSTONE',\r\n },\r\n ],\r\n 'Reset'\r\n ),\r\n secondary: {\r\n icon: 'chevron-down',\r\n label: '',\r\n isActive: true,\r\n tooltip: 'More Tools',\r\n },\r\n items: [\r\n _createActionButton(\r\n 'Reset',\r\n 'tool-reset',\r\n 'Reset View',\r\n [\r\n {\r\n commandName: 'resetViewport',\r\n commandOptions: {},\r\n context: 'CORNERSTONE',\r\n },\r\n ],\r\n 'Reset'\r\n ),\r\n _createActionButton(\r\n 'rotate-right',\r\n 'tool-rotate-right',\r\n 'Rotate Right',\r\n [\r\n {\r\n commandName: 'rotateViewportCW',\r\n commandOptions: {},\r\n context: 'CORNERSTONE',\r\n },\r\n ],\r\n 'Rotate +90'\r\n ),\r\n _createActionButton(\r\n 'flip-horizontal',\r\n 'tool-flip-horizontal',\r\n 'Flip Horizontally',\r\n [\r\n {\r\n commandName: 'flipViewportHorizontal',\r\n commandOptions: {},\r\n context: 'CORNERSTONE',\r\n },\r\n ],\r\n 'Flip Horizontal'\r\n ),\r\n _createToggleButton('StackImageSync', 'link', 'Stack Image Sync', [\r\n {\r\n commandName: 'toggleStackImageSync',\r\n commandOptions: {},\r\n context: 'CORNERSTONE',\r\n },\r\n ]),\r\n _createToggleButton(\r\n 'ReferenceLines',\r\n 'tool-referenceLines', // change this with the new icon\r\n 'Reference Lines',\r\n [\r\n {\r\n commandName: 'toggleReferenceLines',\r\n commandOptions: {},\r\n context: 'CORNERSTONE',\r\n },\r\n ]\r\n ),\r\n _createToolButton(\r\n 'StackScroll',\r\n 'tool-stack-scroll',\r\n 'Stack Scroll',\r\n [\r\n {\r\n commandName: 'setToolActive',\r\n commandOptions: {\r\n toolName: 'StackScroll',\r\n },\r\n context: 'CORNERSTONE',\r\n },\r\n ],\r\n 'Stack Scroll'\r\n ),\r\n _createActionButton(\r\n 'invert',\r\n 'tool-invert',\r\n 'Invert',\r\n [\r\n {\r\n commandName: 'invertViewport',\r\n commandOptions: {},\r\n context: 'CORNERSTONE',\r\n },\r\n ],\r\n 'Invert Colors'\r\n ),\r\n _createToggleButton(\r\n 'cine',\r\n 'tool-cine',\r\n 'Cine',\r\n [\r\n {\r\n commandName: 'toggleCine',\r\n context: 'CORNERSTONE',\r\n },\r\n ],\r\n 'Cine'\r\n ),\r\n _createToolButton(\r\n 'Magnify',\r\n 'tool-magnify',\r\n 'Magnify',\r\n [\r\n {\r\n commandName: 'setToolActive',\r\n commandOptions: {\r\n toolName: 'Magnify',\r\n },\r\n context: 'CORNERSTONE',\r\n },\r\n ],\r\n 'Magnify'\r\n ),\r\n _createActionButton(\r\n 'TagBrowser',\r\n 'list-bullets',\r\n 'Dicom Tag Browser',\r\n [\r\n {\r\n commandName: 'openDICOMTagViewer',\r\n commandOptions: {},\r\n context: 'DEFAULT',\r\n },\r\n ],\r\n 'Dicom Tag Browser'\r\n ),\r\n ],\r\n },\r\n },\r\n];\r\n\r\nexport default toolbarButtons;\r\n","const brushInstanceNames = {\r\n CircularBrush: 'CircularBrush',\r\n CircularEraser: 'CircularEraser',\r\n SphereBrush: 'SphereBrush',\r\n SphereEraser: 'SphereEraser',\r\n ThresholdCircularBrush: 'ThresholdCircularBrush',\r\n ThresholdSphereBrush: 'ThresholdSphereBrush',\r\n};\r\n\r\nconst brushStrategies = {\r\n CircularBrush: 'FILL_INSIDE_CIRCLE',\r\n CircularEraser: 'ERASE_INSIDE_CIRCLE',\r\n SphereBrush: 'FILL_INSIDE_SPHERE',\r\n SphereEraser: 'ERASE_INSIDE_SPHERE',\r\n ThresholdCircularBrush: 'THRESHOLD_INSIDE_CIRCLE',\r\n ThresholdSphereBrush: 'THRESHOLD_INSIDE_SPHERE',\r\n};\r\n\r\nfunction createTools(utilityModule) {\r\n const { toolNames, Enums } = utilityModule.exports;\r\n return {\r\n active: [\r\n { toolName: toolNames.WindowLevel, bindings: [{ mouseButton: Enums.MouseBindings.Primary }] },\r\n { toolName: toolNames.Pan, bindings: [{ mouseButton: Enums.MouseBindings.Auxiliary }] },\r\n { toolName: toolNames.Zoom, bindings: [{ mouseButton: Enums.MouseBindings.Secondary }] },\r\n { toolName: toolNames.StackScrollMouseWheel, bindings: [] },\r\n ],\r\n passive: Object.keys(brushInstanceNames)\r\n .map(brushName => ({\r\n toolName: brushName,\r\n parentTool: 'Brush',\r\n configuration: {\r\n activeStrategy: brushStrategies[brushName],\r\n },\r\n }))\r\n .concat([\r\n { toolName: toolNames.CircleScissors },\r\n { toolName: toolNames.RectangleScissors },\r\n { toolName: toolNames.SphereScissors },\r\n { toolName: toolNames.StackScroll },\r\n { toolName: toolNames.Magnify },\r\n { toolName: toolNames.SegmentationDisplay },\r\n ]),\r\n disabled: [{ toolName: toolNames.ReferenceLines }],\r\n };\r\n}\r\n\r\nfunction initDefaultToolGroup(extensionManager, toolGroupService, commandsManager, toolGroupId) {\r\n const utilityModule = extensionManager.getModuleEntry(\r\n '@ohif/extension-cornerstone.utilityModule.tools'\r\n );\r\n const tools = createTools(utilityModule);\r\n toolGroupService.createToolGroupAndAddTools(toolGroupId, tools);\r\n}\r\n\r\nfunction initMPRToolGroup(extensionManager, toolGroupService, commandsManager) {\r\n const utilityModule = extensionManager.getModuleEntry(\r\n '@ohif/extension-cornerstone.utilityModule.tools'\r\n );\r\n const tools = createTools(utilityModule);\r\n tools.disabled.push(\r\n {\r\n toolName: utilityModule.exports.toolNames.Crosshairs,\r\n configuration: {\r\n viewportIndicators: false,\r\n autoPan: {\r\n enabled: false,\r\n panSize: 10,\r\n },\r\n },\r\n },\r\n { toolName: utilityModule.exports.toolNames.ReferenceLines }\r\n );\r\n toolGroupService.createToolGroupAndAddTools('mpr', tools);\r\n}\r\n\r\nfunction initToolGroups(extensionManager, toolGroupService, commandsManager) {\r\n initDefaultToolGroup(extensionManager, toolGroupService, commandsManager, 'default');\r\n initMPRToolGroup(extensionManager, toolGroupService, commandsManager);\r\n}\r\n\r\nexport default initToolGroups;\r\n","import { hotkeys } from '@ohif/core';\r\nimport { id } from './id';\r\nimport toolbarButtons from './toolbarButtons';\r\nimport initToolGroups from './initToolGroups';\r\n\r\nconst ohif = {\r\n layout: '@ohif/extension-default.layoutTemplateModule.viewerLayout',\r\n sopClassHandler: '@ohif/extension-default.sopClassHandlerModule.stack',\r\n hangingProtocol: '@ohif/extension-default.hangingProtocolModule.default',\r\n leftPanel: '@ohif/extension-default.panelModule.seriesList',\r\n rightPanel: '@ohif/extension-default.panelModule.measure',\r\n};\r\n\r\nconst cornerstone = {\r\n viewport: '@ohif/extension-cornerstone.viewportModule.cornerstone',\r\n};\r\n\r\nconst segmentation = {\r\n panel: '@ohif/extension-cornerstone-dicom-seg.panelModule.panelSegmentation',\r\n panelTool: '@ohif/extension-cornerstone-dicom-seg.panelModule.panelSegmentationWithTools',\r\n sopClassHandler: '@ohif/extension-cornerstone-dicom-seg.sopClassHandlerModule.dicom-seg',\r\n viewport: '@ohif/extension-cornerstone-dicom-seg.viewportModule.dicom-seg',\r\n};\r\n\r\n/**\r\n * Just two dependencies to be able to render a viewport with panels in order\r\n * to make sure that the mode is working.\r\n */\r\nconst extensionDependencies = {\r\n '@ohif/extension-default': '^3.0.0',\r\n '@ohif/extension-cornerstone': '^3.0.0',\r\n '@ohif/extension-cornerstone-dicom-seg': '^3.0.0',\r\n};\r\n\r\nfunction modeFactory({ modeConfiguration }) {\r\n return {\r\n /**\r\n * Mode ID, which should be unique among modes used by the viewer. This ID\r\n * is used to identify the mode in the viewer's state.\r\n */\r\n id,\r\n routeName: 'segmentation',\r\n /**\r\n * Mode name, which is displayed in the viewer's UI in the workList, for the\r\n * user to select the mode.\r\n */\r\n displayName: 'Segmentation',\r\n /**\r\n * Runs when the Mode Route is mounted to the DOM. Usually used to initialize\r\n * Services and other resources.\r\n */\r\n onModeEnter: ({ servicesManager, extensionManager, commandsManager }) => {\r\n const { measurementService, toolbarService, toolGroupService } = servicesManager.services;\r\n\r\n measurementService.clearMeasurements();\r\n\r\n // Init Default and SR ToolGroups\r\n initToolGroups(extensionManager, toolGroupService, commandsManager);\r\n\r\n let unsubscribe;\r\n\r\n const activateTool = () => {\r\n toolbarService.recordInteraction({\r\n groupId: 'WindowLevel',\r\n interactionType: 'tool',\r\n commands: [\r\n {\r\n commandName: 'setToolActive',\r\n commandOptions: {\r\n toolName: 'WindowLevel',\r\n },\r\n context: 'CORNERSTONE',\r\n },\r\n ],\r\n });\r\n\r\n // We don't need to reset the active tool whenever a viewport is getting\r\n // added to the toolGroup.\r\n unsubscribe();\r\n };\r\n\r\n // Since we only have one viewport for the basic cs3d mode and it has\r\n // only one hanging protocol, we can just use the first viewport\r\n ({ unsubscribe } = toolGroupService.subscribe(\r\n toolGroupService.EVENTS.VIEWPORT_ADDED,\r\n activateTool\r\n ));\r\n\r\n toolbarService.init(extensionManager);\r\n toolbarService.addButtons(toolbarButtons);\r\n toolbarService.createButtonSection('primary', [\r\n 'Zoom',\r\n 'WindowLevel',\r\n 'Pan',\r\n 'Capture',\r\n 'Layout',\r\n 'MPR',\r\n 'Crosshairs',\r\n 'MoreTools',\r\n ]);\r\n },\r\n onModeExit: ({ servicesManager }) => {\r\n const {\r\n toolGroupService,\r\n syncGroupService,\r\n toolbarService,\r\n segmentationService,\r\n cornerstoneViewportService,\r\n } = servicesManager.services;\r\n\r\n toolGroupService.destroy();\r\n syncGroupService.destroy();\r\n segmentationService.destroy();\r\n cornerstoneViewportService.destroy();\r\n },\r\n /** */\r\n validationTags: {\r\n study: [],\r\n series: [],\r\n },\r\n /**\r\n * A boolean return value that indicates whether the mode is valid for the\r\n * modalities of the selected studies. For instance a PET/CT mode should be\r\n */\r\n isValidMode: ({ modalities }) => true,\r\n /**\r\n * Mode Routes are used to define the mode's behavior. A list of Mode Route\r\n * that includes the mode's path and the layout to be used. The layout will\r\n * include the components that are used in the layout. For instance, if the\r\n * default layoutTemplate is used (id: '@ohif/extension-default.layoutTemplateModule.viewerLayout')\r\n * it will include the leftPanels, rightPanels, and viewports. However, if\r\n * you define another layoutTemplate that includes a Footer for instance,\r\n * you should provide the Footer component here too. Note: We use Strings\r\n * to reference the component's ID as they are registered in the internal\r\n * ExtensionManager. The template for the string is:\r\n * `${extensionId}.{moduleType}.${componentId}`.\r\n */\r\n routes: [\r\n {\r\n path: 'template',\r\n layoutTemplate: ({ location, servicesManager }) => {\r\n return {\r\n id: ohif.layout,\r\n props: {\r\n leftPanels: [ohif.leftPanel],\r\n rightPanels: [segmentation.panelTool],\r\n viewports: [\r\n {\r\n namespace: cornerstone.viewport,\r\n displaySetsToDisplay: [ohif.sopClassHandler],\r\n },\r\n {\r\n namespace: segmentation.viewport,\r\n displaySetsToDisplay: [segmentation.sopClassHandler],\r\n },\r\n ],\r\n },\r\n };\r\n },\r\n },\r\n ],\r\n /** List of extensions that are used by the mode */\r\n extensions: extensionDependencies,\r\n /** HangingProtocol used by the mode */\r\n // hangingProtocol: [''],\r\n /** SopClassHandlers used by the mode */\r\n sopClassHandlers: [ohif.sopClassHandler, segmentation.sopClassHandler],\r\n /** hotkeys for mode */\r\n hotkeys: [...hotkeys.defaults.hotkeyBindings],\r\n };\r\n}\r\n\r\nconst mode = {\r\n id,\r\n modeFactory,\r\n extensionDependencies,\r\n};\r\n\r\nexport default mode;\r\n"],"names":["id","packageJson","windowLevelPresets","defaults","_createButton","type","icon","label","commands","tooltip","uiType","_createActionButton","bind","_createToggleButton","_createToolButton","_createWwwcPreset","preset","title","subtitle","toString","commandName","commandOptions","context","toolGroupIds","_createSetToolActiveCommands","toolName","map","toolGroupId","props","groupId","primary","secondary","isActive","isAction","renderer","WindowLevelMenuItem","items","rows","columns","protocolId","isRadio","brushInstanceNames","CircularBrush","CircularEraser","SphereBrush","SphereEraser","ThresholdCircularBrush","ThresholdSphereBrush","brushStrategies","createTools","utilityModule","toolNames","Enums","exports","active","WindowLevel","bindings","mouseButton","MouseBindings","Primary","Pan","Auxiliary","Zoom","Secondary","StackScrollMouseWheel","passive","Object","keys","brushName","parentTool","configuration","activeStrategy","concat","CircleScissors","RectangleScissors","SphereScissors","StackScroll","Magnify","SegmentationDisplay","disabled","ReferenceLines","extensionManager","toolGroupService","commandsManager","tools","getModuleEntry","createToolGroupAndAddTools","initDefaultToolGroup","push","Crosshairs","viewportIndicators","autoPan","enabled","panSize","initMPRToolGroup","ohif","cornerstone","segmentation","extensionDependencies","modeFactory","_ref","modeConfiguration","routeName","displayName","onModeEnter","_ref2","servicesManager","measurementService","toolbarService","services","unsubscribe","clearMeasurements","initToolGroups","subscribe","EVENTS","VIEWPORT_ADDED","activateTool","recordInteraction","interactionType","init","addButtons","toolbarButtons","createButtonSection","onModeExit","_ref3","syncGroupService","segmentationService","cornerstoneViewportService","destroy","validationTags","study","series","isValidMode","_ref4","modalities","routes","path","layoutTemplate","_ref5","location","leftPanels","rightPanels","viewports","namespace","displaySetsToDisplay","extensions","sopClassHandlers","hotkeys","hotkeyBindings"],"sourceRoot":""} \ No newline at end of file diff --git a/resources/62ab5d58a2bea7b5a1dc.wasm b/resources/62ab5d58a2bea7b5a1dc.wasm new file mode 100644 index 0000000..aab6671 Binary files /dev/null and b/resources/62ab5d58a2bea7b5a1dc.wasm differ diff --git a/resources/65916ef3def695744bda.wasm b/resources/65916ef3def695744bda.wasm new file mode 100644 index 0000000..1bb4172 Binary files /dev/null and b/resources/65916ef3def695744bda.wasm differ diff --git a/resources/663.bundle.28bd520531024fa11845.js b/resources/663.bundle.28bd520531024fa11845.js new file mode 100644 index 0000000..4f4cd80 --- /dev/null +++ b/resources/663.bundle.28bd520531024fa11845.js @@ -0,0 +1,2 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[663],{42170:(e,n,t)=>{"use strict";t.r(n),t.d(n,{createReferencedImageDisplaySet:()=>ee,default:()=>ae,hydrateStructuredReport:()=>J.Z,srProtocol:()=>_});var o=t(43001);const a=JSON.parse('{"u2":"@ohif/extension-cornerstone-dicom-sr"}').u2,r="dicom-sr",s=`${a}.sopClassHandlerModule.${r}`;var i=t(71771),c=t(45451),d=t(14957),l=t(3743),u=t(64035);const S={POINT:"POINT",MULTIPOINT:"MULTIPOINT",POLYLINE:"POLYLINE",CIRCLE:"CIRCLE",ELLIPSE:"ELLIPSE"};class g extends d.AnnotationTool{constructor(){super(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},arguments.length>1&&void 0!==arguments[1]?arguments[1]:{configuration:{}}),this.isPointNearTool=()=>null,this.getHandleNearImagePoint=()=>null,this.renderAnnotation=(e,n)=>{const{viewport:t}=e,{element:o}=t;let a=d.annotation.state.getAnnotations(this.getToolName(),o);if(!a?.length)return;if(a=this.filterInteractableAnnotationsForElement(o,a),!a?.length)return;const r=(0,u.yR)(o),{activeIndex:s,trackingUniqueIdentifiers:i}=r,c=i[s],l=a.filter((e=>i.includes(e.data?.cachedStats?.TrackingUniqueIdentifier)));if(!t._actors?.size)return;const g={toolGroupId:this.toolGroupId,toolName:this.getToolName(),viewportId:e.viewport.id};for(let e=0;e{const s=r[e];let c,l;switch(e){case S.POINT:c=this.renderPoint;break;case S.MULTIPOINT:c=this.renderMultipoint;break;case S.POLYLINE:c=this.renderPolyLine;break;case S.CIRCLE:c=this.renderEllipse;break;case S.ELLIPSE:c=this.renderEllipse,l=d.utilities.math.ellipse.getCanvasEllipseCorners;break;default:throw new Error(`Unsupported GraphicType: ${e}`)}const u=c(n,t,s,a,i,m);this.renderTextBox(n,t,u,l,o,g,m)}))}}}_getTextBoxLinesFromLabels(e){const n=Math.min(e.length,3),t=[];for(let o=0;o{const r=t.map((e=>n.worldToCanvas(e))),c=`${a}`;2===r.length?d.drawing.drawLine(e,o,c,r[0],r[1],s):d.drawing.drawPolyline(e,o,c,r,s),i=i.concat(r)})),i}renderMultipoint(e,n,t,o,a,r){let s;t.map(((t,a)=>{s=t.map((e=>n.worldToCanvas(e)));d.drawing.drawHandles(e,o,"0",s,{color:r.color})}))}renderPoint(e,n,t,o,a,r){const s=[];return t.map(((t,i)=>{const c=t[0];s.push(n.worldToCanvas(c));const u=l.metaData.get("imagePixelModule",a);let S=10,g=10;if(u){const{columns:e,rows:n}=u;S=e/10,g=n/10}const f=l.utilities.worldToImageCoords(a,c),m=l.utilities.imageToWorldCoords(a,[f[0]+S,f[1]+g]);s.push(n.worldToCanvas(m));const I=`${i}`;d.drawing.drawArrow(e,o,I,s[1],s[0],{color:r.color,width:r.lineWidth})})),s}renderEllipse(e,n,t,o,a,r){let s;return t.map(((t,a)=>{if(0===t.length)return;const i=t,c=n.getRotation();let l;s=i.map((e=>n.worldToCanvas(e))),l=90==c||270==c?d.utilities.math.ellipse.getCanvasEllipseCorners([s[2],s[3],s[0],s[1]]):d.utilities.math.ellipse.getCanvasEllipseCorners(s);const u=`${a}`;d.drawing.drawEllipse(e,o,u,l[0],l[1],{color:r.color,width:r.lineWidth})})),s}renderTextBox(e,n,t,o,a,r){let s=arguments.length>6&&void 0!==arguments[6]?arguments[6]:{};if(!t||!a)return;const{annotationUID:i,data:c={}}=a,{label:l}=c,{color:u}=s;let S=t;"function"==typeof o&&(S=o(t));const g=this._getTextBoxLinesFromLabels(l),f=d.utilities.drawing.getTextBoxCoordsCanvas(S);a.data.handles.textBox.worldPosition=n.canvasToWorld(f);const m=n.worldToCanvas(a.data.handles.textBox.worldPosition),I=this.getLinkedTextBoxStyle(r,a),p=d.drawing.drawLinkedTextBox(e,i,"1",g,m,t,{},{...I,color:u}),{x:h,y:R,width:C,height:T}=p;a.data.handles.textBox.worldBoundingBox={topLeft:n.canvasToWorld([h,R]),topRight:n.canvasToWorld([h+C,R]),bottomLeft:n.canvasToWorld([h,R+T]),bottomRight:n.canvasToWorld([h+C,R+T])}}}g.toolName="DICOMSRDisplay";const f={"Short Axis":"W: ","Long Axis":"L: ",AREA:"Area: ",Length:"",CORNERSTONEFREETEXT:""};function m(e){const n=f[e];return void 0!==n?n:e}const I={DICOMSRDisplay:g.toolName,SRLength:"SRLength",SRBidirectional:"SRBidirectional",SREllipticalROI:"SREllipticalROI",SRCircleROI:"SRCircleROI",SRArrowAnnotate:"SRArrowAnnotate",SRAngle:"SRAngle",SRCobbAngle:"SRCobbAngle",SRRectangleROI:"SRRectangleROI",SRPlanarFreehandROI:"SRPlanarFreehandROI"},p=1e-4;function h(e,n,t){const o=I.DICOMSRDisplay,a={TrackingUniqueIdentifier:e.TrackingUniqueIdentifier,renderableData:{},labels:e.labels,imageId:n};e.coords.forEach((t=>{const{GraphicType:o,GraphicData:r}=t;void 0===a.renderableData[o]&&(a.renderableData[o]=[]),a.renderableData[o].push(function(e,n,t,o){const[a,r]=o.split(":");let s;switch(e){case S.POINT:case S.MULTIPOINT:case S.POLYLINE:s=[];for(let e=0;e{n.forEach((n=>{if(n.StudyInstanceUID!==e)throw console.warn("Not all instances have the same UID",e,n),new Error(`Instances ${n.SOPInstanceUID} does not belong to ${e}`)}))},M={ImagingMeasurementReport:"126000",ImageLibrary:"111028",ImagingMeasurements:"126010",MeasurementGroup:"125007",ImageLibraryGroup:"126200",TrackingUniqueIdentifier:"112040",TrackingIdentifier:"112039",Finding:"121071",FindingSite:"G-C0E3",CornerstoneFreeText:D.codeValues.CORNERSTONEFREETEXT},v={SRT:"SRT",CornerstoneCodeSchemes:[D.CodingSchemeDesignator,"CST4"]},P={INFERRED_FROM:"INFERRED FROM",CONTAINS:"CONTAINS"},q="CORNERSTONEFREETEXT";function A(e,n){return this.instances.push(...e),i.utils.sortStudyInstances(this.instances),this.instance=this.instances[this.instances.length-1],this.isLoaded=!1,this}function L(e,n,t){if(!e||!e.length)throw new Error("No instances were provided");i.utils.sortStudyInstances(e);const o=e[e.length-1],{StudyInstanceUID:a,SeriesInstanceUID:r,SOPInstanceUID:c,SeriesDescription:d,SeriesNumber:l,SeriesDate:u,ConceptNameCodeSequence:S,SOPClassUID:g}=o;if(w(o.StudyInstanceUID,e),!S||S.CodeValue!==M.ImagingMeasurementReport)return n.services.uiNotificationService.show({title:"DICOM SR",message:"OHIF only supports TID1500 Imaging Measurement Report Structured Reports. The SR you’re trying to view is not supported.",type:"warning",duration:6e3}),[];const f={Modality:"SR",displaySetInstanceUID:i.utils.guid(),SeriesDescription:d,SeriesNumber:l,SeriesDate:u,SOPInstanceUID:c,SeriesInstanceUID:r,StudyInstanceUID:a,SOPClassHandlerId:s,SOPClassUID:g,instances:e,referencedImages:null,measurements:null,isDerivedDisplaySet:!0,isLoaded:!1,sopClassUids:b,instance:o,addInstances:A};return f.load=()=>function(e,n,t){const{displaySetService:o,measurementService:a}=n.services,r=t.getDataSources(),s=r[0],{ContentSequence:i}=e.instance;e.referencedImages=function(e){const n=B(e.find((e=>e.ConceptNameCodeSequence.CodeValue===M.ImageLibrary)).ContentSequence).find((e=>e.ConceptNameCodeSequence.CodeValue===M.ImageLibraryGroup)),t=[];return B(n.ContentSequence).forEach((e=>{const{ReferencedSOPSequence:n}=e;if(n)for(const e of B(n))if(e.ReferencedSOPClassUID){const{ReferencedSOPClassUID:n,ReferencedSOPInstanceUID:o}=e;t.push({ReferencedSOPClassUID:n,ReferencedSOPInstanceUID:o})}})),t}(i),e.measurements=function(e){const n=e.find((e=>e.ConceptNameCodeSequence.CodeValue===M.ImagingMeasurements)),t=function(e){const n={};return e.forEach((e=>{const t=B(e.ContentSequence),o=t.find((e=>e.ConceptNameCodeSequence.CodeValue===M.TrackingUniqueIdentifier));o||console.warn("No Tracking Unique Identifier, skipping ambiguous measurement.");const a=o.UID;void 0===n[a]?n[a]=[...t]:t.forEach((e=>{e.ConceptNameCodeSequence.CodeValue!==M.TrackingUniqueIdentifier&&n[a].push(e)}))})),n}(B(n.ContentSequence).filter((e=>e.ConceptNameCodeSequence.CodeValue===M.MeasurementGroup))),o=[];return Object.keys(t).forEach((e=>{const n=function(e){if(e.some((e=>"SCOORD"===e.ValueType||"SCOORD3D"===e.ValueType)))return function(e){const n=e.find((e=>"SCOORD"===e.ValueType)),t=e.find((e=>"UIDREF"===e.ValueType)),o=e.find((e=>e.ConceptNameCodeSequence.CodeValue===M.TrackingIdentifier));if(!n)return void console.warn(`graphic ValueType ${n.ValueType} not currently supported, skipping annotation.`);const a=e.filter((e=>"NUM"===e.ValueType)),r={loaded:!1,labels:[],coords:[F(n)],TrackingUniqueIdentifier:t.UID,TrackingIdentifier:o.TextValue};return a.forEach((e=>{const{ConceptNameCodeSequence:n,MeasuredValueSequence:t}=e;t&&r.labels.push(x(n,t))})),r}(e);return function(e){const n=e.filter((e=>"NUM"===e.ValueType)),t=e.find((e=>"UIDREF"===e.ValueType)),o=e.find((e=>e.ConceptNameCodeSequence.CodeValue===M.TrackingIdentifier)),a=e.find((e=>e.ConceptNameCodeSequence.CodeValue===M.Finding)),r=e.filter((e=>e.ConceptNameCodeSequence.CodingSchemeDesignator===v.SRT&&e.ConceptNameCodeSequence.CodeValue===M.FindingSite)),s={loaded:!1,labels:[],coords:[],TrackingUniqueIdentifier:t.UID,TrackingIdentifier:o.TextValue};a&&v.CornerstoneCodeSchemes.includes(a.ConceptCodeSequence.CodingSchemeDesignator)&&a.ConceptCodeSequence.CodeValue===M.CornerstoneFreeText&&s.labels.push({label:q,value:a.ConceptCodeSequence.CodeMeaning});if(r.length){const e=r.find((e=>v.CornerstoneCodeSchemes.includes(e.ConceptCodeSequence.CodingSchemeDesignator)&&e.ConceptCodeSequence.CodeValue===M.CornerstoneFreeText));e&&s.labels.push({label:q,value:e.ConceptCodeSequence.CodeMeaning})}return n.forEach((e=>{const{ConceptNameCodeSequence:n,ContentSequence:t,MeasuredValueSequence:o}=e,{ValueType:a}=t;if("SCOORD"===!a)return void console.warn(`Graphic ${a} not currently supported, skipping annotation.`);const r=F(t);r&&s.coords.push(r),o&&s.labels.push(x(n,o))})),s}(e)}(t[e]);n&&o.push(n)})),o}(i);const c=a.getSourceMappings(N,U);e.isHydrated=!1,e.isRehydratable=function(e,n){if(!n||!n.length)return!1;const t=n.map((e=>e.annotationType)),{measurements:o}=e,a=Object.keys(C).filter((e=>"function"==typeof C[e].isValidCornerstoneTrackingIdentifier)),r=[];a.forEach((e=>{t.includes(e)&&r.push(C[e])}));for(let e=0;e{let[t,o]=n.split(":");T.includes(t)&&(t=O);const a=`${t}:${o}`;return e.isValidCornerstoneTrackingIdentifier(a)})))return!0;console.log("Measurement is not rehydratable",n,o[e])}return console.log("No measurements found which were rehydratable"),!1}(e,c),e.isLoaded=!0,o.activeDisplaySets.forEach((n=>{k(e,n,s)})),o.subscribe(o.EVENTS.DISPLAY_SETS_ADDED,(n=>{const{displaySetsAdded:t}=n;t.forEach((n=>{k(e,n,s)}))}))}(f,n,t),[f]}function k(e,n,t){let o=e.measurements.filter((e=>!1===e.loaded));if(0===o.length)return;if(!n instanceof E)return;const{sopClassUids:a,images:r}=n;if(o=o.filter((e=>e.coords.some((e=>a.includes(e.ReferencedSOPSequence.ReferencedSOPClassUID))))),0===o.length)return;const s=[];o.forEach((e=>{const{coords:n}=e;n.forEach((e=>{const n=e.ReferencedSOPSequence.ReferencedSOPInstanceUID;s.includes(n)||s.push(n)}))}));const i=t.getImageIdsForDisplaySet(n);for(const e of i){if(!o.length)return;const{SOPInstanceUID:t,frameNumber:a}=y.getUIDsFromImageID(e);if(s.includes(t))for(let r=o.length-1;r>=0;r--){const s=o[r];V(s,t,a)&&(h(s,e,n.displaySetInstanceUID),o.splice(r,1))}}}function V(e,n,t){const{coords:o}=e,a=e.coords[0].ReferencedSOPSequence&&e.coords[0].ReferencedSOPSequence[0]?.ReferencedFrameNumber||1;if(t&&Number(t)!==Number(a))return!1;for(let e=0;eL(e,n,t)}]},_={id:"@ohif/sr",name:"SR Key Images",protocolMatchingRules:[],toolGroupIds:["default"],numberOfPriorsReferenced:0,defaultViewport:{viewportOptions:{viewportType:"stack",toolGroupId:"default",allowUnmatchedView:!0},displaySets:[{id:"srDisplaySetId",matchedDisplaySetsIndex:-1}]},displaySetSelectors:{srDisplaySetId:{seriesMatchingRules:[{attribute:"Modality",constraint:{equals:"SR"}}]}},stages:[{name:"SR Key Images",viewportStructure:{layoutType:"grid",properties:{rows:1,columns:1}},viewports:[{viewportOptions:{allowUnmatchedView:!0},displaySets:[{id:"srDisplaySetId"}]}]}]};var G=t(67540);const{log:W}=i.default;const j=function(e,n){const t={};function o(o,a){if(!o.metadata?.referencedImageId)return void W.warn(`[DICOMSR] No referencedImageId found for ${a} ${o.id}`);const r=o.metadata.referencedImageId;t[r]||(t[r]={});const s=t[r];s[a]||(s[a]={data:[]});const i=e.find((e=>e.uid===o.annotationUID)),c=s[a].data;let{finding:d}=i;const l=[];i.label&&(n.includes(a)?d={CodeValue:"CORNERSTONEFREETEXT",CodingSchemeDesignator:"CORNERSTONEJS",CodeMeaning:i.label}:l.push({CodeValue:"CORNERSTONEFREETEXT",CodingSchemeDesignator:"CORNERSTONEJS",CodeMeaning:i.label})),i.findingSites&&l.push(...i.findingSites);const u=Object.assign({},o,{finding:d,findingSites:l});c.push(u)}const a=e.map((e=>e.uid)).slice(),r=d.annotation.state.getAnnotationManager(),s=r.getFramesOfReference();for(let e=0;ee===s.annotationUID));if(-1!==i&&(o(s,n),a.splice(i,1),!a.length))return t}}}return t},{MeasurementReport:H}=R.adaptersSR.Cornerstone3D,{log:Y}=i.default,z=e=>{let{}=e;const n={downloadReport:e=>{let{measurementData:t,additionalFindingTypes:o,options:a={}}=e;const r=n.generateReport(t,o,a),s=G.default.data.datasetToBlob(r);var i=URL.createObjectURL(s);window.location.assign(i)},storeMeasurements:async e=>{let{measurementData:n,dataSource:t,additionalFindingTypes:o,options:a={}}=e;if(Y.info("[DICOMSR] storeMeasurements"),!t||!t.store||!t.store.dicom)return Y.error("[DICOMSR] datasource has no dataSource.store.dicom endpoint!"),Promise.reject({});try{const e=function(e,n){let t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};const o=j(e,n),a=H.generateReport(o,l.metaData,l.utilities.worldToImageCoords,t),{dataset:r}=a;return void 0===r.SpecificCharacterSet&&(r.SpecificCharacterSet="ISO_IR 192"),r}(n,o,a),{StudyInstanceUID:r,ContentSequence:s}=e;if(!s?.[4].ContentSequence?.length)throw console.log("naturalizedReport missing imaging content",e),new Error("Invalid report, no content");return await t.store.dicom(e),r&&t.deleteStudyMetadataPromise(r),i.DicomMetadataStore.addInstances([e],!0),e}catch(e){throw console.warn(e),Y.error(`[DICOMSR] Error while saving the measurements: ${e.message}`),new Error(e.message||"Error while saving the measurements.")}}},t={downloadReport:{commandFn:n.downloadReport,storeContexts:[],options:{}},storeMeasurements:{commandFn:n.storeMeasurements,storeContexts:[],options:{}}};return{actions:n,definitions:t,defaultContext:"CORNERSTONE_STRUCTURED_REPORT"}};function X(e,n,t){class o extends n{}o.toolName=e,(0,d.addTool)(o)}var J=t(38965);const K=i.classes.ImageSet,Z=(e,n)=>{const{displaySetInstanceUID:t,ReferencedSOPInstanceUID:o}=e,a=n.getDisplaySetByUID(t);if(a.images)return a.images.find((e=>e.SOPInstanceUID===o))},Q=(e,n)=>{const t=[],o={};for(const a of n.measurements){const{imageId:n}=a;if(!n)continue;if(o[n])continue;const r=Z(a,e);r?(o[n]=r,t.push(r)):console.log("Measurement",a,"had no instances found")}return t},ee=(e,n)=>{const t=Q(e,n),o=new K(t),a=t[0];return o.setAttributes({displaySetInstanceUID:o.uid,SeriesDate:a.SeriesDate,SeriesTime:a.SeriesTime,SeriesInstanceUID:o.uid,StudyInstanceUID:a.StudyInstanceUID,SeriesNumber:a.SeriesNumber||0,SOPClassUID:a.SOPClassUID,SeriesDescription:`${n.SeriesDescription} KO ${n.instance.SeriesNumber}`,Modality:"KO",isMultiFrame:!1,numImageFrames:t.length,SOPClassHandlerId:"@ohif/extension-default.sopClassHandlerModule.stack",isReconstructable:!1,isCompositeStack:!0,madeInClient:!0,excludeFromThumbnailBrowser:!0,updateInstances:function(){this.images.splice(0,this.images.length,...Q(e,n)),this.numImageFrames=this.images.length}}),e.addDisplaySets(o),o};function ne(){return ne=Object.assign?Object.assign.bind():function(e){for(var n=1;nt.e(886).then(t.bind(t,48886)))),oe=e=>o.createElement(o.Suspense,{fallback:o.createElement("div",null,"Loading...")},o.createElement(te,e)),ae={id:a,onModeEnter:function(e){let{servicesManager:n}=e;const{displaySetService:t}=n.services;[...t.getDisplaySetCache().values()].filter((e=>e.SOPClassHandlerId===s)).forEach((e=>{e.isHydrated=!1}))},preRegistration:function(e){let{configuration:n={}}=e;(0,d.addTool)(g),X(I.SRLength,d.LengthTool),X(I.SRBidirectional,d.BidirectionalTool),X(I.SREllipticalROI,d.EllipticalROITool),X(I.SRCircleROI,d.CircleROITool),X(I.SRArrowAnnotate,d.ArrowAnnotateTool),X(I.SRAngle,d.AngleTool),X(I.SRCobbAngle,d.CobbAngleTool),X(I.SRPlanarFreehandROI,d.PlanarFreehandROITool);const t={lineDash:"4,4"};d.annotation.config.style.setToolGroupToolStyles("SRToolGroup",{SRLength:t,SRBidirectional:t,SREllipticalROI:t,SRCircleROI:t,SRArrowAnnotate:t,SRCobbAngle:t,SRAngle:t,SRPlanarFreehandROI:t,global:{}})},getViewportModule(e){let{servicesManager:n,extensionManager:t}=e;return[{name:"dicom-sr",component:e=>o.createElement(oe,ne({servicesManager:n,extensionManager:t},e))}]},getCommandsModule:z,getSopClassHandlerModule:$,getUtilityModule(e){let{servicesManager:n}=e;return[{name:"tools",exports:{toolNames:I}}]}}},64035:(e,n,t)=>{"use strict";t.d(n,{l2:()=>r,yR:()=>s});var o=t(3743);const a={TrackingUniqueIdentifier:null,trackingIdentifiersByViewportId:{}};function r(e,n){let t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0;const r=(0,o.getEnabledElement)(e),{viewport:s}=r;a.trackingIdentifiersByViewportId[s.id]={trackingUniqueIdentifiers:n,activeIndex:t}}function s(e){const n=(0,o.getEnabledElement)(e),{viewport:t}=n;return a.trackingIdentifiersByViewportId[t.id]?a.trackingIdentifiersByViewportId[t.id]:{trackingUniqueIdentifiers:[]}}},38965:(e,n,t)=>{"use strict";t.d(n,{Z:()=>I});var o=t(3743),a=t(71771);var r=t(91202),s=t(14957);const{locking:i}=s.annotation,{guid:c}=a.default.utils,{MeasurementReport:d,CORNERSTONE_3D_TAG:l}=r.adaptersSR.Cornerstone3D,u="Cornerstone3DTools",S="0.1",g=["cornerstoneTools@^4.0.0"],f=(e,n)=>{if(!n||"CORNERSTONEJS"===n.CodingSchemeDesignator)return;const t=`${n.CodingSchemeDesignator}:${n.CodeValue}`;return{...e[t],ref:t,...n,text:n.CodeMeaning}},m=(e,n)=>{if(!n||!n.length)return;const t=[];for(let o=0;o{const{ReferencedSOPInstanceUID:n,imageId:t,frameNumber:o}=e;w[n]||(w[n]=t,M[n]=[]),M[n][o]||(M[n][o]=t)}));const v=function(e){const n="Imaging Measurements",t="Measurement Group",o="Tracking Identifier",a=p(e.ContentSequence).find(h(n)),r=p(a.ContentSequence).filter(h(t)),s={},i=d.CORNERSTONE_TOOL_CLASSES_BY_UTILITY_TYPE,c=[];return Object.keys(i).forEach((e=>{c.push(i[e]),s[e]=[]})),r.forEach(((e,n)=>{const t=p(e.ContentSequence).find((e=>e.ConceptNameCodeSequence.CodeMeaning===o)),a=t.TextValue;let[r,s]=a.split(":");g.includes(r)&&(r=l);const i=`${r}:${s}`;t.TextValue=i})),e}(U),P=d.generateToolState(v,w,o.utilities.imageToWorldCoords,o.metaData),q=N.map((e=>e.annotationType)),A={};Object.keys(P).forEach((e=>{q.includes(e)&&(A[e]=P[e])}));const L=[];let k;Object.keys(A).forEach((e=>{A[e].forEach((e=>{const n=e.annotation.data&&e.annotation.data.frameNumber||1,t=M[e.sopInstanceUid][n]||w[e.sopInstanceUid];L.includes(t)||L.push(t)}))}));const V=[];for(let e=0;e{A[e].forEach((n=>{const t=n.annotation.data&&n.annotation.data.frameNumber||1,a=M[n.sopInstanceUid][t]||w[n.sopInstanceUid];n.uid=c();const r=o.metaData.get("instance",a),{FrameOfReferenceUID:s}=r,d={annotationUID:n.annotation.annotationUID,data:n.annotation.data,metadata:{toolName:e,referencedImageId:a,FrameOfReferenceUID:s}},l=O.getSource(u,S);d.data.label=function(e){const{findingSites:n=[],finding:t}=e;let o=n.find((e=>"CORNERSTONEFREETEXT"===e.CodeValue));return o?o.CodeMeaning:t&&"CORNERSTONEFREETEXT"===t.CodeValue?t.CodeMeaning:void 0}(n),d.data.finding=f(y,n.finding?.[0]),d.data.findingSites=m(y,n.findingSites),d.data.site=d.data.findingSites?.[0];const g=N.find((n=>n.annotationType===e)),I=O.addRawMeasurement(l,e,{annotation:d},g.toMeasurementSchema,T);if(C){const e=R.getAnnotation(I);i.setAnnotationLocked(e,!0)}L.includes(a)||L.push(a)}))})),b.isHydrated=!0,{StudyInstanceUID:k,SeriesInstanceUIDs:V}}const p=function(e){return Array.isArray(e)?e:[e]},h=e=>n=>n.ConceptNameCodeSequence.CodeMeaning===e},78753:()=>{}}]); +//# sourceMappingURL=663.bundle.28bd520531024fa11845.js.map \ No newline at end of file diff --git a/resources/663.bundle.28bd520531024fa11845.js.map b/resources/663.bundle.28bd520531024fa11845.js.map new file mode 100644 index 0000000..4a33466 --- /dev/null +++ b/resources/663.bundle.28bd520531024fa11845.js.map @@ -0,0 +1 @@ +{"version":3,"file":"663.bundle.28bd520531024fa11845.js","mappings":"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","sources":["webpack:///../../../extensions/cornerstone-dicom-sr/src/id.js","webpack:///../../../extensions/cornerstone-dicom-sr/src/constants/scoordTypes.js","webpack:///../../../extensions/cornerstone-dicom-sr/src/tools/DICOMSRDisplayTool.ts","webpack:///../../../extensions/cornerstone-dicom-sr/src/tools/toolNames.ts","webpack:///../../../extensions/cornerstone-dicom-sr/src/utils/addMeasurement.ts","webpack:///../../../extensions/cornerstone-dicom-sr/src/utils/isRehydratable.js","webpack:///../../../extensions/cornerstone-dicom-sr/src/getSopClassHandlerModule.ts","webpack:///../../../extensions/cornerstone-dicom-sr/src/getHangingProtocolModule.ts","webpack:///../../../extensions/cornerstone-dicom-sr/src/utils/getFilteredCornerstoneToolState.ts","webpack:///../../../extensions/cornerstone-dicom-sr/src/commandsModule.js","webpack:///../../../extensions/cornerstone-dicom-sr/src/utils/addToolInstance.ts","webpack:///../../../extensions/cornerstone-dicom-sr/src/utils/createReferencedImageDisplaySet.ts","webpack:///../../../extensions/cornerstone-dicom-sr/src/index.tsx","webpack:///../../../extensions/cornerstone-dicom-sr/src/onModeEnter.js","webpack:///../../../extensions/cornerstone-dicom-sr/src/init.ts","webpack:///../../../extensions/cornerstone-dicom-sr/src/tools/modules/dicomSRModule.js","webpack:///../../../extensions/cornerstone-dicom-sr/src/utils/hydrateStructuredReport.js","webpack:///../../../extensions/cornerstone-dicom-sr/src/utils/getLabelFromDCMJSImportedToolData.js"],"sourcesContent":["import packageJson from '../package.json';\r\n\r\nconst id = packageJson.name;\r\n\r\nconst SOPClassHandlerName = 'dicom-sr';\r\nconst SOPClassHandlerId = `${id}.sopClassHandlerModule.${SOPClassHandlerName}`;\r\n\r\nexport { SOPClassHandlerName, SOPClassHandlerId, id };\r\n","export default {\r\n POINT: 'POINT',\r\n MULTIPOINT: 'MULTIPOINT',\r\n POLYLINE: 'POLYLINE',\r\n CIRCLE: 'CIRCLE',\r\n ELLIPSE: 'ELLIPSE',\r\n};\r\n","import { Types, metaData, utilities as csUtils } from '@cornerstonejs/core';\r\nimport {\r\n AnnotationTool,\r\n annotation,\r\n drawing,\r\n utilities,\r\n Types as cs3DToolsTypes,\r\n} from '@cornerstonejs/tools';\r\nimport { getTrackingUniqueIdentifiersForElement } from './modules/dicomSRModule';\r\nimport SCOORD_TYPES from '../constants/scoordTypes';\r\n\r\nexport default class DICOMSRDisplayTool extends AnnotationTool {\r\n static toolName = 'DICOMSRDisplay';\r\n\r\n constructor(\r\n toolProps = {},\r\n defaultToolProps = {\r\n configuration: {},\r\n }\r\n ) {\r\n super(toolProps, defaultToolProps);\r\n }\r\n\r\n _getTextBoxLinesFromLabels(labels) {\r\n // TODO -> max 3 for now (label + shortAxis + longAxis), need a generic solution for this!\r\n\r\n const labelLength = Math.min(labels.length, 3);\r\n const lines = [];\r\n\r\n for (let i = 0; i < labelLength; i++) {\r\n const labelEntry = labels[i];\r\n lines.push(`${_labelToShorthand(labelEntry.label)}${labelEntry.value}`);\r\n }\r\n\r\n return lines;\r\n }\r\n\r\n // This tool should not inherit from AnnotationTool and we should not need\r\n // to add the following lines.\r\n isPointNearTool = () => null;\r\n getHandleNearImagePoint = () => null;\r\n\r\n renderAnnotation = (enabledElement: Types.IEnabledElement, svgDrawingHelper: any): void => {\r\n const { viewport } = enabledElement;\r\n const { element } = viewport;\r\n\r\n let annotations = annotation.state.getAnnotations(this.getToolName(), element);\r\n\r\n // Todo: We don't need this anymore, filtering happens in triggerAnnotationRender\r\n if (!annotations?.length) {\r\n return;\r\n }\r\n\r\n annotations = this.filterInteractableAnnotationsForElement(element, annotations);\r\n\r\n if (!annotations?.length) {\r\n return;\r\n }\r\n\r\n const trackingUniqueIdentifiersForElement = getTrackingUniqueIdentifiersForElement(element);\r\n\r\n const { activeIndex, trackingUniqueIdentifiers } = trackingUniqueIdentifiersForElement;\r\n\r\n const activeTrackingUniqueIdentifier = trackingUniqueIdentifiers[activeIndex];\r\n\r\n // Filter toolData to only render the data for the active SR.\r\n const filteredAnnotations = annotations.filter(annotation =>\r\n trackingUniqueIdentifiers.includes(annotation.data?.cachedStats?.TrackingUniqueIdentifier)\r\n );\r\n\r\n if (!viewport._actors?.size) {\r\n return;\r\n }\r\n\r\n const styleSpecifier: cs3DToolsTypes.AnnotationStyle.StyleSpecifier = {\r\n toolGroupId: this.toolGroupId,\r\n toolName: this.getToolName(),\r\n viewportId: enabledElement.viewport.id,\r\n };\r\n\r\n for (let i = 0; i < filteredAnnotations.length; i++) {\r\n const annotation = filteredAnnotations[i];\r\n const annotationUID = annotation.annotationUID;\r\n const { renderableData } = annotation.data.cachedStats;\r\n const { cachedStats } = annotation.data;\r\n const { referencedImageId } = annotation.metadata;\r\n\r\n styleSpecifier.annotationUID = annotationUID;\r\n\r\n const lineWidth = this.getStyle('lineWidth', styleSpecifier, annotation);\r\n const lineDash = this.getStyle('lineDash', styleSpecifier, annotation);\r\n const color =\r\n cachedStats.TrackingUniqueIdentifier === activeTrackingUniqueIdentifier\r\n ? 'rgb(0, 255, 0)'\r\n : this.getStyle('color', styleSpecifier, annotation);\r\n\r\n const options = {\r\n color,\r\n lineDash,\r\n lineWidth,\r\n };\r\n\r\n Object.keys(renderableData).forEach(GraphicType => {\r\n const renderableDataForGraphicType = renderableData[GraphicType];\r\n\r\n let renderMethod;\r\n let canvasCoordinatesAdapter;\r\n\r\n switch (GraphicType) {\r\n case SCOORD_TYPES.POINT:\r\n renderMethod = this.renderPoint;\r\n break;\r\n case SCOORD_TYPES.MULTIPOINT:\r\n renderMethod = this.renderMultipoint;\r\n break;\r\n case SCOORD_TYPES.POLYLINE:\r\n renderMethod = this.renderPolyLine;\r\n break;\r\n case SCOORD_TYPES.CIRCLE:\r\n renderMethod = this.renderEllipse;\r\n break;\r\n case SCOORD_TYPES.ELLIPSE:\r\n renderMethod = this.renderEllipse;\r\n canvasCoordinatesAdapter = utilities.math.ellipse.getCanvasEllipseCorners;\r\n break;\r\n default:\r\n throw new Error(`Unsupported GraphicType: ${GraphicType}`);\r\n }\r\n\r\n const canvasCoordinates = renderMethod(\r\n svgDrawingHelper,\r\n viewport,\r\n renderableDataForGraphicType,\r\n annotationUID,\r\n referencedImageId,\r\n options\r\n );\r\n\r\n this.renderTextBox(\r\n svgDrawingHelper,\r\n viewport,\r\n canvasCoordinates,\r\n canvasCoordinatesAdapter,\r\n annotation,\r\n styleSpecifier,\r\n options\r\n );\r\n });\r\n }\r\n };\r\n\r\n renderPolyLine(\r\n svgDrawingHelper,\r\n viewport,\r\n renderableData,\r\n annotationUID,\r\n referencedImageId,\r\n options\r\n ) {\r\n const drawingOptions = {\r\n color: options.color,\r\n width: options.lineWidth,\r\n };\r\n let allCanvasCoordinates = [];\r\n renderableData.map((data, index) => {\r\n const canvasCoordinates = data.map(p => viewport.worldToCanvas(p));\r\n const lineUID = `${index}`;\r\n\r\n if (canvasCoordinates.length === 2) {\r\n drawing.drawLine(\r\n svgDrawingHelper,\r\n annotationUID,\r\n lineUID,\r\n canvasCoordinates[0],\r\n canvasCoordinates[1],\r\n drawingOptions\r\n );\r\n } else {\r\n drawing.drawPolyline(\r\n svgDrawingHelper,\r\n annotationUID,\r\n lineUID,\r\n canvasCoordinates,\r\n drawingOptions\r\n );\r\n }\r\n\r\n allCanvasCoordinates = allCanvasCoordinates.concat(canvasCoordinates);\r\n });\r\n\r\n return allCanvasCoordinates; // used for drawing textBox\r\n }\r\n\r\n renderMultipoint(\r\n svgDrawingHelper,\r\n viewport,\r\n renderableData,\r\n annotationUID,\r\n referencedImageId,\r\n options\r\n ) {\r\n let canvasCoordinates;\r\n renderableData.map((data, index) => {\r\n canvasCoordinates = data.map(p => viewport.worldToCanvas(p));\r\n const handleGroupUID = '0';\r\n drawing.drawHandles(svgDrawingHelper, annotationUID, handleGroupUID, canvasCoordinates, {\r\n color: options.color,\r\n });\r\n });\r\n }\r\n\r\n renderPoint(\r\n svgDrawingHelper,\r\n viewport,\r\n renderableData,\r\n annotationUID,\r\n referencedImageId,\r\n options\r\n ) {\r\n const canvasCoordinates = [];\r\n renderableData.map((data, index) => {\r\n const point = data[0];\r\n // This gives us one point for arrow\r\n canvasCoordinates.push(viewport.worldToCanvas(point));\r\n\r\n // We get the other point for the arrow by using the image size\r\n const imagePixelModule = metaData.get('imagePixelModule', referencedImageId);\r\n\r\n let xOffset = 10;\r\n let yOffset = 10;\r\n\r\n if (imagePixelModule) {\r\n const { columns, rows } = imagePixelModule;\r\n xOffset = columns / 10;\r\n yOffset = rows / 10;\r\n }\r\n\r\n const imagePoint = csUtils.worldToImageCoords(referencedImageId, point);\r\n const arrowEnd = csUtils.imageToWorldCoords(referencedImageId, [\r\n imagePoint[0] + xOffset,\r\n imagePoint[1] + yOffset,\r\n ]);\r\n\r\n canvasCoordinates.push(viewport.worldToCanvas(arrowEnd));\r\n\r\n const arrowUID = `${index}`;\r\n\r\n // Todo: handle drawing probe as probe, currently we are drawing it as an arrow\r\n drawing.drawArrow(\r\n svgDrawingHelper,\r\n annotationUID,\r\n arrowUID,\r\n canvasCoordinates[1],\r\n canvasCoordinates[0],\r\n {\r\n color: options.color,\r\n width: options.lineWidth,\r\n }\r\n );\r\n });\r\n\r\n return canvasCoordinates; // used for drawing textBox\r\n }\r\n\r\n renderEllipse(\r\n svgDrawingHelper,\r\n viewport,\r\n renderableData,\r\n annotationUID,\r\n referencedImageId,\r\n options\r\n ) {\r\n let canvasCoordinates;\r\n renderableData.map((data, index) => {\r\n if (data.length === 0) {\r\n // since oblique ellipse is not supported for hydration right now\r\n // we just return\r\n return;\r\n }\r\n\r\n const ellipsePointsWorld = data;\r\n\r\n const rotation = viewport.getRotation();\r\n\r\n canvasCoordinates = ellipsePointsWorld.map(p => viewport.worldToCanvas(p));\r\n let canvasCorners;\r\n if (rotation == 90 || rotation == 270) {\r\n canvasCorners = utilities.math.ellipse.getCanvasEllipseCorners([\r\n canvasCoordinates[2],\r\n canvasCoordinates[3],\r\n canvasCoordinates[0],\r\n canvasCoordinates[1],\r\n ]) as Array;\r\n } else {\r\n canvasCorners = utilities.math.ellipse.getCanvasEllipseCorners(\r\n canvasCoordinates\r\n ) as Array;\r\n }\r\n\r\n const lineUID = `${index}`;\r\n drawing.drawEllipse(\r\n svgDrawingHelper,\r\n annotationUID,\r\n lineUID,\r\n canvasCorners[0],\r\n canvasCorners[1],\r\n {\r\n color: options.color,\r\n width: options.lineWidth,\r\n }\r\n );\r\n });\r\n\r\n return canvasCoordinates;\r\n }\r\n\r\n renderTextBox(\r\n svgDrawingHelper,\r\n viewport,\r\n canvasCoordinates,\r\n canvasCoordinatesAdapter,\r\n annotation,\r\n styleSpecifier,\r\n options = {}\r\n ) {\r\n if (!canvasCoordinates || !annotation) {\r\n return;\r\n }\r\n\r\n const { annotationUID, data = {} } = annotation;\r\n const { label } = data;\r\n const { color } = options;\r\n\r\n let adaptedCanvasCoordinates = canvasCoordinates;\r\n // adapt coordinates if there is an adapter\r\n if (typeof canvasCoordinatesAdapter === 'function') {\r\n adaptedCanvasCoordinates = canvasCoordinatesAdapter(canvasCoordinates);\r\n }\r\n const textLines = this._getTextBoxLinesFromLabels(label);\r\n const canvasTextBoxCoords = utilities.drawing.getTextBoxCoordsCanvas(adaptedCanvasCoordinates);\r\n\r\n annotation.data.handles.textBox.worldPosition = viewport.canvasToWorld(canvasTextBoxCoords);\r\n\r\n const textBoxPosition = viewport.worldToCanvas(annotation.data.handles.textBox.worldPosition);\r\n\r\n const textBoxUID = '1';\r\n const textBoxOptions = this.getLinkedTextBoxStyle(styleSpecifier, annotation);\r\n\r\n const boundingBox = drawing.drawLinkedTextBox(\r\n svgDrawingHelper,\r\n annotationUID,\r\n textBoxUID,\r\n textLines,\r\n textBoxPosition,\r\n canvasCoordinates,\r\n {},\r\n {\r\n ...textBoxOptions,\r\n color,\r\n }\r\n );\r\n\r\n const { x: left, y: top, width, height } = boundingBox;\r\n\r\n annotation.data.handles.textBox.worldBoundingBox = {\r\n topLeft: viewport.canvasToWorld([left, top]),\r\n topRight: viewport.canvasToWorld([left + width, top]),\r\n bottomLeft: viewport.canvasToWorld([left, top + height]),\r\n bottomRight: viewport.canvasToWorld([left + width, top + height]),\r\n };\r\n }\r\n}\r\n\r\nconst SHORT_HAND_MAP = {\r\n 'Short Axis': 'W: ',\r\n 'Long Axis': 'L: ',\r\n AREA: 'Area: ',\r\n Length: '',\r\n CORNERSTONEFREETEXT: '',\r\n};\r\n\r\nfunction _labelToShorthand(label) {\r\n const shortHand = SHORT_HAND_MAP[label];\r\n\r\n if (shortHand !== undefined) {\r\n return shortHand;\r\n }\r\n\r\n return label;\r\n}\r\n","import DICOMSRDisplayTool from './DICOMSRDisplayTool';\r\n\r\nconst toolNames = {\r\n DICOMSRDisplay: DICOMSRDisplayTool.toolName,\r\n SRLength: 'SRLength',\r\n SRBidirectional: 'SRBidirectional',\r\n SREllipticalROI: 'SREllipticalROI',\r\n SRCircleROI: 'SRCircleROI',\r\n SRArrowAnnotate: 'SRArrowAnnotate',\r\n SRAngle: 'SRAngle',\r\n SRCobbAngle: 'SRCobbAngle',\r\n SRRectangleROI: 'SRRectangleROI',\r\n SRPlanarFreehandROI: 'SRPlanarFreehandROI',\r\n};\r\n\r\nexport default toolNames;\r\n","import { vec3 } from 'gl-matrix';\r\nimport { Types, annotation } from '@cornerstonejs/tools';\r\nimport { metaData, utilities, Types as csTypes } from '@cornerstonejs/core';\r\nimport toolNames from '../tools/toolNames';\r\nimport SCOORD_TYPES from '../constants/scoordTypes';\r\n\r\nconst EPSILON = 1e-4;\r\n\r\nconst supportedLegacyCornerstoneTags = ['cornerstoneTools@^4.0.0'];\r\n\r\nexport default function addMeasurement(measurement, imageId, displaySetInstanceUID) {\r\n // TODO -> Render rotated ellipse .\r\n const toolName = toolNames.DICOMSRDisplay;\r\n\r\n const measurementData = {\r\n TrackingUniqueIdentifier: measurement.TrackingUniqueIdentifier,\r\n renderableData: {},\r\n labels: measurement.labels,\r\n imageId,\r\n };\r\n\r\n measurement.coords.forEach(coord => {\r\n const { GraphicType, GraphicData } = coord;\r\n\r\n if (measurementData.renderableData[GraphicType] === undefined) {\r\n measurementData.renderableData[GraphicType] = [];\r\n }\r\n\r\n measurementData.renderableData[GraphicType].push(\r\n _getRenderableData(GraphicType, GraphicData, imageId, measurement.TrackingIdentifier)\r\n );\r\n });\r\n\r\n // Use the metadata provider to grab its imagePlaneModule metadata\r\n const imagePlaneModule = metaData.get('imagePlaneModule', imageId);\r\n\r\n const annotationManager = annotation.state.getAnnotationManager();\r\n\r\n // Create Cornerstone3D Annotation from measurement\r\n const frameNumber =\r\n (measurement.coords[0].ReferencedSOPSequence &&\r\n measurement.coords[0].ReferencedSOPSequence[0]?.ReferencedFrameNumber) ||\r\n 1;\r\n\r\n const SRAnnotation: Types.Annotation = {\r\n annotationUID: measurement.TrackingUniqueIdentifier,\r\n metadata: {\r\n FrameOfReferenceUID: imagePlaneModule.frameOfReferenceUID,\r\n toolName: toolName,\r\n referencedImageId: imageId,\r\n },\r\n data: {\r\n label: measurement.labels,\r\n handles: {\r\n textBox: {},\r\n },\r\n cachedStats: {\r\n TrackingUniqueIdentifier: measurementData.TrackingUniqueIdentifier,\r\n renderableData: measurementData.renderableData,\r\n },\r\n frameNumber: frameNumber,\r\n },\r\n };\r\n\r\n annotationManager.addAnnotation(SRAnnotation);\r\n\r\n measurement.loaded = true;\r\n measurement.imageId = imageId;\r\n measurement.displaySetInstanceUID = displaySetInstanceUID;\r\n\r\n // Remove the unneeded coord now its processed, but keep the SOPInstanceUID.\r\n // NOTE: We assume that each SCOORD in the MeasurementGroup maps onto one frame,\r\n // It'd be super weird if it didn't anyway as a SCOORD.\r\n measurement.ReferencedSOPInstanceUID =\r\n measurement.coords[0].ReferencedSOPSequence.ReferencedSOPInstanceUID;\r\n measurement.frameNumber = frameNumber;\r\n delete measurement.coords;\r\n}\r\n\r\nfunction _getRenderableData(GraphicType, GraphicData, imageId, TrackingIdentifier) {\r\n const [cornerstoneTag, toolName] = TrackingIdentifier.split(':');\r\n\r\n let renderableData: csTypes.Point3[];\r\n\r\n switch (GraphicType) {\r\n case SCOORD_TYPES.POINT:\r\n case SCOORD_TYPES.MULTIPOINT:\r\n case SCOORD_TYPES.POLYLINE:\r\n renderableData = [];\r\n\r\n for (let i = 0; i < GraphicData.length; i += 2) {\r\n const worldPos = utilities.imageToWorldCoords(imageId, [\r\n GraphicData[i],\r\n GraphicData[i + 1],\r\n ]);\r\n\r\n renderableData.push(worldPos);\r\n }\r\n\r\n break;\r\n case SCOORD_TYPES.CIRCLE: {\r\n const pointsWorld = [];\r\n for (let i = 0; i < GraphicData.length; i += 2) {\r\n const worldPos = utilities.imageToWorldCoords(imageId, [\r\n GraphicData[i],\r\n GraphicData[i + 1],\r\n ]);\r\n\r\n pointsWorld.push(worldPos);\r\n }\r\n\r\n // We do not have an explicit draw circle svg helper in Cornerstone3D at\r\n // this time, but we can use the ellipse svg helper to draw a circle, so\r\n // here we reshape the data for that purpose.\r\n const center = pointsWorld[0];\r\n const onPerimeter = pointsWorld[1];\r\n\r\n const radius = vec3.distance(center, onPerimeter);\r\n\r\n const imagePlaneModule = metaData.get('imagePlaneModule', imageId);\r\n\r\n if (!imagePlaneModule) {\r\n throw new Error('No imagePlaneModule found');\r\n }\r\n\r\n const {\r\n columnCosines,\r\n rowCosines,\r\n }: {\r\n columnCosines: csTypes.Point3;\r\n rowCosines: csTypes.Point3;\r\n } = imagePlaneModule;\r\n\r\n // we need to get major/minor axis (which are both the same size major = minor)\r\n\r\n // first axisStart\r\n const firstAxisStart = vec3.create();\r\n vec3.scaleAndAdd(firstAxisStart, center, columnCosines, radius);\r\n\r\n const firstAxisEnd = vec3.create();\r\n vec3.scaleAndAdd(firstAxisEnd, center, columnCosines, -radius);\r\n\r\n // second axisStart\r\n const secondAxisStart = vec3.create();\r\n vec3.scaleAndAdd(secondAxisStart, center, rowCosines, radius);\r\n\r\n const secondAxisEnd = vec3.create();\r\n vec3.scaleAndAdd(secondAxisEnd, center, rowCosines, -radius);\r\n\r\n renderableData = [\r\n firstAxisStart as csTypes.Point3,\r\n firstAxisEnd as csTypes.Point3,\r\n secondAxisStart as csTypes.Point3,\r\n secondAxisEnd as csTypes.Point3,\r\n ];\r\n\r\n break;\r\n }\r\n case SCOORD_TYPES.ELLIPSE: {\r\n // GraphicData is ordered as [majorAxisStartX, majorAxisStartY, majorAxisEndX, majorAxisEndY, minorAxisStartX, minorAxisStartY, minorAxisEndX, minorAxisEndY]\r\n // But Cornerstone3D points are ordered as top, bottom, left, right for the\r\n // ellipse so we need to identify if the majorAxis is horizontal or vertical\r\n // and then choose the correct points to use for the ellipse.\r\n\r\n const pointsWorld: csTypes.Point3[] = [];\r\n for (let i = 0; i < GraphicData.length; i += 2) {\r\n const worldPos = utilities.imageToWorldCoords(imageId, [\r\n GraphicData[i],\r\n GraphicData[i + 1],\r\n ]);\r\n\r\n pointsWorld.push(worldPos);\r\n }\r\n\r\n const majorAxisStart = vec3.fromValues(...pointsWorld[0]);\r\n const majorAxisEnd = vec3.fromValues(...pointsWorld[1]);\r\n const minorAxisStart = vec3.fromValues(...pointsWorld[2]);\r\n const minorAxisEnd = vec3.fromValues(...pointsWorld[3]);\r\n\r\n const majorAxisVec = vec3.create();\r\n vec3.sub(majorAxisVec, majorAxisEnd, majorAxisStart);\r\n\r\n // normalize majorAxisVec to avoid scaling issues\r\n vec3.normalize(majorAxisVec, majorAxisVec);\r\n\r\n const minorAxisVec = vec3.create();\r\n vec3.sub(minorAxisVec, minorAxisEnd, minorAxisStart);\r\n vec3.normalize(minorAxisVec, minorAxisVec);\r\n\r\n const imagePlaneModule = metaData.get('imagePlaneModule', imageId);\r\n\r\n if (!imagePlaneModule) {\r\n throw new Error('imageId does not have imagePlaneModule metadata');\r\n }\r\n\r\n const { columnCosines }: { columnCosines: csTypes.Point3 } = imagePlaneModule;\r\n\r\n // find which axis is parallel to the columnCosines\r\n const columnCosinesVec = vec3.fromValues(...columnCosines);\r\n\r\n const projectedMajorAxisOnColVec = Math.abs(vec3.dot(columnCosinesVec, majorAxisVec));\r\n const projectedMinorAxisOnColVec = Math.abs(vec3.dot(columnCosinesVec, minorAxisVec));\r\n\r\n const absoluteOfMajorDotProduct = Math.abs(projectedMajorAxisOnColVec);\r\n const absoluteOfMinorDotProduct = Math.abs(projectedMinorAxisOnColVec);\r\n\r\n renderableData = [];\r\n if (Math.abs(absoluteOfMajorDotProduct - 1) < EPSILON) {\r\n renderableData = [pointsWorld[0], pointsWorld[1], pointsWorld[2], pointsWorld[3]];\r\n } else if (Math.abs(absoluteOfMinorDotProduct - 1) < EPSILON) {\r\n renderableData = [pointsWorld[2], pointsWorld[3], pointsWorld[0], pointsWorld[1]];\r\n } else {\r\n console.warn('OBLIQUE ELLIPSE NOT YET SUPPORTED');\r\n }\r\n break;\r\n }\r\n default:\r\n console.warn('Unsupported GraphicType:', GraphicType);\r\n }\r\n\r\n return renderableData;\r\n}\r\n","import { adaptersSR } from '@cornerstonejs/adapters';\r\n\r\nconst cornerstoneAdapters =\r\n adaptersSR.Cornerstone3D.MeasurementReport.CORNERSTONE_TOOL_CLASSES_BY_UTILITY_TYPE;\r\n\r\nconst supportedLegacyCornerstoneTags = ['cornerstoneTools@^4.0.0'];\r\nconst CORNERSTONE_3D_TAG = cornerstoneAdapters.CORNERSTONE_3D_TAG;\r\n\r\n/**\r\n * Checks if the given `displaySet`can be rehydrated into the `measurementService`.\r\n *\r\n * @param {object} displaySet The SR `displaySet` to check.\r\n * @param {object[]} mappings The CornerstoneTools 4 mappings to the `measurementService`.\r\n * @returns {boolean} True if the SR can be rehydrated into the `measurementService`.\r\n */\r\nexport default function isRehydratable(displaySet, mappings) {\r\n if (!mappings || !mappings.length) {\r\n return false;\r\n }\r\n\r\n const mappingDefinitions = mappings.map(m => m.annotationType);\r\n const { measurements } = displaySet;\r\n\r\n const adapterKeys = Object.keys(cornerstoneAdapters).filter(\r\n adapterKey =>\r\n typeof cornerstoneAdapters[adapterKey].isValidCornerstoneTrackingIdentifier === 'function'\r\n );\r\n\r\n const adapters = [];\r\n\r\n adapterKeys.forEach(key => {\r\n if (mappingDefinitions.includes(key)) {\r\n // Must have both a dcmjs adapter and a measurementService\r\n // Definition in order to be a candidate for import.\r\n adapters.push(cornerstoneAdapters[key]);\r\n }\r\n });\r\n\r\n for (let i = 0; i < measurements.length; i++) {\r\n const { TrackingIdentifier } = measurements[i] || {};\r\n const hydratable = adapters.some(adapter => {\r\n let [cornerstoneTag, toolName] = TrackingIdentifier.split(':');\r\n if (supportedLegacyCornerstoneTags.includes(cornerstoneTag)) {\r\n cornerstoneTag = CORNERSTONE_3D_TAG;\r\n }\r\n\r\n const mappedTrackingIdentifier = `${cornerstoneTag}:${toolName}`;\r\n\r\n return adapter.isValidCornerstoneTrackingIdentifier(mappedTrackingIdentifier);\r\n });\r\n\r\n if (hydratable) {\r\n return true;\r\n }\r\n console.log('Measurement is not rehydratable', TrackingIdentifier, measurements[i]);\r\n }\r\n\r\n console.log('No measurements found which were rehydratable');\r\n return false;\r\n}\r\n","import { SOPClassHandlerName, SOPClassHandlerId } from './id';\r\nimport { utils, classes, DisplaySetService, Types } from '@ohif/core';\r\nimport addMeasurement from './utils/addMeasurement';\r\nimport isRehydratable from './utils/isRehydratable';\r\nimport { adaptersSR } from '@cornerstonejs/adapters';\r\n\r\ntype InstanceMetadata = Types.InstanceMetadata;\r\n\r\nconst { CodeScheme: Cornerstone3DCodeScheme } = adaptersSR.Cornerstone3D;\r\n\r\nconst { ImageSet, MetadataProvider: metadataProvider } = classes;\r\n\r\n// TODO ->\r\n// Add SR thumbnail\r\n// Make viewport\r\n// Get stacks from referenced displayInstanceUID and load into wrapped CornerStone viewport.\r\n\r\nconst sopClassUids = [\r\n '1.2.840.10008.5.1.4.1.1.88.11', //BASIC_TEXT_SR:\r\n '1.2.840.10008.5.1.4.1.1.88.22', //ENHANCED_SR:\r\n '1.2.840.10008.5.1.4.1.1.88.33', //COMPREHENSIVE_SR:\r\n '1.2.840.10008.5.1.4.1.1.88.34', //COMPREHENSIVE_3D_SR:\r\n];\r\n\r\nconst CORNERSTONE_3D_TOOLS_SOURCE_NAME = 'Cornerstone3DTools';\r\nconst CORNERSTONE_3D_TOOLS_SOURCE_VERSION = '0.1';\r\n\r\nconst validateSameStudyUID = (uid: string, instances): void => {\r\n instances.forEach(it => {\r\n if (it.StudyInstanceUID !== uid) {\r\n console.warn('Not all instances have the same UID', uid, it);\r\n throw new Error(`Instances ${it.SOPInstanceUID} does not belong to ${uid}`);\r\n }\r\n });\r\n};\r\n\r\nconst CodeNameCodeSequenceValues = {\r\n ImagingMeasurementReport: '126000',\r\n ImageLibrary: '111028',\r\n ImagingMeasurements: '126010',\r\n MeasurementGroup: '125007',\r\n ImageLibraryGroup: '126200',\r\n TrackingUniqueIdentifier: '112040',\r\n TrackingIdentifier: '112039',\r\n Finding: '121071',\r\n FindingSite: 'G-C0E3', // SRT\r\n CornerstoneFreeText: Cornerstone3DCodeScheme.codeValues.CORNERSTONEFREETEXT, //\r\n};\r\n\r\nconst CodingSchemeDesignators = {\r\n SRT: 'SRT',\r\n CornerstoneCodeSchemes: [Cornerstone3DCodeScheme.CodingSchemeDesignator, 'CST4'],\r\n};\r\n\r\nconst RELATIONSHIP_TYPE = {\r\n INFERRED_FROM: 'INFERRED FROM',\r\n CONTAINS: 'CONTAINS',\r\n};\r\n\r\nconst CORNERSTONE_FREETEXT_CODE_VALUE = 'CORNERSTONEFREETEXT';\r\n\r\n/**\r\n * Adds instances to the DICOM SR series, rather than creating a new\r\n * series, so that as SR's are saved, they append to the series, and the\r\n * key image display set gets updated as well, containing just the new series.\r\n * @param instances is a list of instances from THIS series that are not\r\n * in this DICOM SR Display Set already.\r\n */\r\nfunction addInstances(instances: InstanceMetadata[], displaySetService: DisplaySetService) {\r\n this.instances.push(...instances);\r\n utils.sortStudyInstances(this.instances);\r\n // The last instance is the newest one, so is the one most interesting.\r\n // Eventually, the SR viewer should have the ability to choose which SR\r\n // gets loaded, and to navigate among them.\r\n this.instance = this.instances[this.instances.length - 1];\r\n this.isLoaded = false;\r\n return this;\r\n}\r\n\r\n/**\r\n * DICOM SR SOP Class Handler\r\n * For all referenced images in the TID 1500/300 sections, add an image to the\r\n * display.\r\n * @param instances is a set of instances all from the same series\r\n * @param servicesManager is the services that can be used for creating\r\n * @returns The list of display sets created for the given instances object\r\n */\r\nfunction _getDisplaySetsFromSeries(instances, servicesManager, extensionManager) {\r\n // If the series has no instances, stop here\r\n if (!instances || !instances.length) {\r\n throw new Error('No instances were provided');\r\n }\r\n\r\n utils.sortStudyInstances(instances);\r\n // The last instance is the newest one, so is the one most interesting.\r\n // Eventually, the SR viewer should have the ability to choose which SR\r\n // gets loaded, and to navigate among them.\r\n const instance = instances[instances.length - 1];\r\n\r\n const {\r\n StudyInstanceUID,\r\n SeriesInstanceUID,\r\n SOPInstanceUID,\r\n SeriesDescription,\r\n SeriesNumber,\r\n SeriesDate,\r\n ConceptNameCodeSequence,\r\n SOPClassUID,\r\n } = instance;\r\n validateSameStudyUID(instance.StudyInstanceUID, instances);\r\n\r\n if (\r\n !ConceptNameCodeSequence ||\r\n ConceptNameCodeSequence.CodeValue !== CodeNameCodeSequenceValues.ImagingMeasurementReport\r\n ) {\r\n servicesManager.services.uiNotificationService.show({\r\n title: 'DICOM SR',\r\n message:\r\n 'OHIF only supports TID1500 Imaging Measurement Report Structured Reports. The SR you’re trying to view is not supported.',\r\n type: 'warning',\r\n duration: 6000,\r\n });\r\n return [];\r\n }\r\n\r\n const displaySet = {\r\n //plugin: id,\r\n Modality: 'SR',\r\n displaySetInstanceUID: utils.guid(),\r\n SeriesDescription,\r\n SeriesNumber,\r\n SeriesDate,\r\n SOPInstanceUID,\r\n SeriesInstanceUID,\r\n StudyInstanceUID,\r\n SOPClassHandlerId,\r\n SOPClassUID,\r\n instances,\r\n referencedImages: null,\r\n measurements: null,\r\n isDerivedDisplaySet: true,\r\n isLoaded: false,\r\n sopClassUids,\r\n instance,\r\n addInstances,\r\n };\r\n\r\n displaySet.load = () => _load(displaySet, servicesManager, extensionManager);\r\n\r\n return [displaySet];\r\n}\r\n\r\nfunction _load(displaySet, servicesManager, extensionManager) {\r\n const { displaySetService, measurementService } = servicesManager.services;\r\n const dataSources = extensionManager.getDataSources();\r\n const dataSource = dataSources[0];\r\n\r\n const { ContentSequence } = displaySet.instance;\r\n\r\n displaySet.referencedImages = _getReferencedImagesList(ContentSequence);\r\n displaySet.measurements = _getMeasurements(ContentSequence);\r\n\r\n const mappings = measurementService.getSourceMappings(\r\n CORNERSTONE_3D_TOOLS_SOURCE_NAME,\r\n CORNERSTONE_3D_TOOLS_SOURCE_VERSION\r\n );\r\n\r\n displaySet.isHydrated = false;\r\n displaySet.isRehydratable = isRehydratable(displaySet, mappings);\r\n displaySet.isLoaded = true;\r\n\r\n // Check currently added displaySets and add measurements if the sources exist.\r\n displaySetService.activeDisplaySets.forEach(activeDisplaySet => {\r\n _checkIfCanAddMeasurementsToDisplaySet(displaySet, activeDisplaySet, dataSource);\r\n });\r\n\r\n // Subscribe to new displaySets as the source may come in after.\r\n displaySetService.subscribe(displaySetService.EVENTS.DISPLAY_SETS_ADDED, data => {\r\n const { displaySetsAdded } = data;\r\n // If there are still some measurements that have not yet been loaded into cornerstone,\r\n // See if we can load them onto any of the new displaySets.\r\n displaySetsAdded.forEach(newDisplaySet => {\r\n _checkIfCanAddMeasurementsToDisplaySet(displaySet, newDisplaySet, dataSource);\r\n });\r\n });\r\n}\r\n\r\nfunction _checkIfCanAddMeasurementsToDisplaySet(srDisplaySet, newDisplaySet, dataSource) {\r\n let unloadedMeasurements = srDisplaySet.measurements.filter(\r\n measurement => measurement.loaded === false\r\n );\r\n\r\n if (unloadedMeasurements.length === 0) {\r\n // All already loaded!\r\n return;\r\n }\r\n\r\n if (!newDisplaySet instanceof ImageSet) {\r\n // This also filters out _this_ displaySet, as it is not an ImageSet.\r\n return;\r\n }\r\n\r\n const { sopClassUids, images } = newDisplaySet;\r\n\r\n // Check if any have the newDisplaySet is the correct SOPClass.\r\n unloadedMeasurements = unloadedMeasurements.filter(measurement =>\r\n measurement.coords.some(coord =>\r\n sopClassUids.includes(coord.ReferencedSOPSequence.ReferencedSOPClassUID)\r\n )\r\n );\r\n\r\n if (unloadedMeasurements.length === 0) {\r\n // New displaySet isn't the correct SOPClass, so can't contain the referenced images.\r\n return;\r\n }\r\n\r\n const SOPInstanceUIDs = [];\r\n\r\n unloadedMeasurements.forEach(measurement => {\r\n const { coords } = measurement;\r\n\r\n coords.forEach(coord => {\r\n const SOPInstanceUID = coord.ReferencedSOPSequence.ReferencedSOPInstanceUID;\r\n\r\n if (!SOPInstanceUIDs.includes(SOPInstanceUID)) {\r\n SOPInstanceUIDs.push(SOPInstanceUID);\r\n }\r\n });\r\n });\r\n\r\n const imageIdsForDisplaySet = dataSource.getImageIdsForDisplaySet(newDisplaySet);\r\n\r\n for (const imageId of imageIdsForDisplaySet) {\r\n if (!unloadedMeasurements.length) {\r\n // All measurements loaded.\r\n return;\r\n }\r\n\r\n const { SOPInstanceUID, frameNumber } = metadataProvider.getUIDsFromImageID(imageId);\r\n\r\n if (SOPInstanceUIDs.includes(SOPInstanceUID)) {\r\n for (let j = unloadedMeasurements.length - 1; j >= 0; j--) {\r\n const measurement = unloadedMeasurements[j];\r\n if (_measurementReferencesSOPInstanceUID(measurement, SOPInstanceUID, frameNumber)) {\r\n addMeasurement(measurement, imageId, newDisplaySet.displaySetInstanceUID);\r\n\r\n unloadedMeasurements.splice(j, 1);\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction _measurementReferencesSOPInstanceUID(measurement, SOPInstanceUID, frameNumber) {\r\n const { coords } = measurement;\r\n\r\n // NOTE: The ReferencedFrameNumber can be multiple values according to the DICOM\r\n // Standard. But for now, we will support only one ReferenceFrameNumber.\r\n const ReferencedFrameNumber =\r\n (measurement.coords[0].ReferencedSOPSequence &&\r\n measurement.coords[0].ReferencedSOPSequence[0]?.ReferencedFrameNumber) ||\r\n 1;\r\n\r\n if (frameNumber && Number(frameNumber) !== Number(ReferencedFrameNumber)) {\r\n return false;\r\n }\r\n\r\n for (let j = 0; j < coords.length; j++) {\r\n const coord = coords[j];\r\n const { ReferencedSOPInstanceUID } = coord.ReferencedSOPSequence;\r\n\r\n if (ReferencedSOPInstanceUID === SOPInstanceUID) {\r\n return true;\r\n }\r\n }\r\n}\r\n\r\nfunction getSopClassHandlerModule({ servicesManager, extensionManager }) {\r\n const getDisplaySetsFromSeries = instances => {\r\n return _getDisplaySetsFromSeries(instances, servicesManager, extensionManager);\r\n };\r\n\r\n return [\r\n {\r\n name: SOPClassHandlerName,\r\n sopClassUids,\r\n getDisplaySetsFromSeries,\r\n },\r\n ];\r\n}\r\n\r\nfunction _getMeasurements(ImagingMeasurementReportContentSequence) {\r\n const ImagingMeasurements = ImagingMeasurementReportContentSequence.find(\r\n item =>\r\n item.ConceptNameCodeSequence.CodeValue === CodeNameCodeSequenceValues.ImagingMeasurements\r\n );\r\n\r\n const MeasurementGroups = _getSequenceAsArray(ImagingMeasurements.ContentSequence).filter(\r\n item => item.ConceptNameCodeSequence.CodeValue === CodeNameCodeSequenceValues.MeasurementGroup\r\n );\r\n\r\n const mergedContentSequencesByTrackingUniqueIdentifiers =\r\n _getMergedContentSequencesByTrackingUniqueIdentifiers(MeasurementGroups);\r\n\r\n const measurements = [];\r\n\r\n Object.keys(mergedContentSequencesByTrackingUniqueIdentifiers).forEach(\r\n trackingUniqueIdentifier => {\r\n const mergedContentSequence =\r\n mergedContentSequencesByTrackingUniqueIdentifiers[trackingUniqueIdentifier];\r\n\r\n const measurement = _processMeasurement(mergedContentSequence);\r\n\r\n if (measurement) {\r\n measurements.push(measurement);\r\n }\r\n }\r\n );\r\n\r\n return measurements;\r\n}\r\n\r\nfunction _getMergedContentSequencesByTrackingUniqueIdentifiers(MeasurementGroups) {\r\n const mergedContentSequencesByTrackingUniqueIdentifiers = {};\r\n\r\n MeasurementGroups.forEach(MeasurementGroup => {\r\n const ContentSequence = _getSequenceAsArray(MeasurementGroup.ContentSequence);\r\n\r\n const TrackingUniqueIdentifierItem = ContentSequence.find(\r\n item =>\r\n item.ConceptNameCodeSequence.CodeValue ===\r\n CodeNameCodeSequenceValues.TrackingUniqueIdentifier\r\n );\r\n\r\n if (!TrackingUniqueIdentifierItem) {\r\n console.warn('No Tracking Unique Identifier, skipping ambiguous measurement.');\r\n }\r\n\r\n const trackingUniqueIdentifier = TrackingUniqueIdentifierItem.UID;\r\n\r\n if (mergedContentSequencesByTrackingUniqueIdentifiers[trackingUniqueIdentifier] === undefined) {\r\n // Add the full ContentSequence\r\n mergedContentSequencesByTrackingUniqueIdentifiers[trackingUniqueIdentifier] = [\r\n ...ContentSequence,\r\n ];\r\n } else {\r\n // Add the ContentSequence minus the tracking identifier, as we have this\r\n // Information in the merged ContentSequence anyway.\r\n ContentSequence.forEach(item => {\r\n if (\r\n item.ConceptNameCodeSequence.CodeValue !==\r\n CodeNameCodeSequenceValues.TrackingUniqueIdentifier\r\n ) {\r\n mergedContentSequencesByTrackingUniqueIdentifiers[trackingUniqueIdentifier].push(item);\r\n }\r\n });\r\n }\r\n });\r\n\r\n return mergedContentSequencesByTrackingUniqueIdentifiers;\r\n}\r\n\r\nfunction _processMeasurement(mergedContentSequence) {\r\n if (\r\n mergedContentSequence.some(\r\n group => group.ValueType === 'SCOORD' || group.ValueType === 'SCOORD3D'\r\n )\r\n ) {\r\n return _processTID1410Measurement(mergedContentSequence);\r\n }\r\n\r\n return _processNonGeometricallyDefinedMeasurement(mergedContentSequence);\r\n}\r\n\r\nfunction _processTID1410Measurement(mergedContentSequence) {\r\n // Need to deal with TID 1410 style measurements, which will have a SCOORD or SCOORD3D at the top level,\r\n // And non-geometric representations where each NUM has \"INFERRED FROM\" SCOORD/SCOORD3D\r\n\r\n const graphicItem = mergedContentSequence.find(group => group.ValueType === 'SCOORD');\r\n\r\n const UIDREFContentItem = mergedContentSequence.find(group => group.ValueType === 'UIDREF');\r\n\r\n const TrackingIdentifierContentItem = mergedContentSequence.find(\r\n item => item.ConceptNameCodeSequence.CodeValue === CodeNameCodeSequenceValues.TrackingIdentifier\r\n );\r\n\r\n if (!graphicItem) {\r\n console.warn(\r\n `graphic ValueType ${graphicItem.ValueType} not currently supported, skipping annotation.`\r\n );\r\n return;\r\n }\r\n\r\n const NUMContentItems = mergedContentSequence.filter(group => group.ValueType === 'NUM');\r\n\r\n const measurement = {\r\n loaded: false,\r\n labels: [],\r\n coords: [_getCoordsFromSCOORDOrSCOORD3D(graphicItem)],\r\n TrackingUniqueIdentifier: UIDREFContentItem.UID,\r\n TrackingIdentifier: TrackingIdentifierContentItem.TextValue,\r\n };\r\n\r\n NUMContentItems.forEach(item => {\r\n const { ConceptNameCodeSequence, MeasuredValueSequence } = item;\r\n\r\n if (MeasuredValueSequence) {\r\n measurement.labels.push(\r\n _getLabelFromMeasuredValueSequence(ConceptNameCodeSequence, MeasuredValueSequence)\r\n );\r\n }\r\n });\r\n\r\n return measurement;\r\n}\r\n\r\nfunction _processNonGeometricallyDefinedMeasurement(mergedContentSequence) {\r\n const NUMContentItems = mergedContentSequence.filter(group => group.ValueType === 'NUM');\r\n\r\n const UIDREFContentItem = mergedContentSequence.find(group => group.ValueType === 'UIDREF');\r\n\r\n const TrackingIdentifierContentItem = mergedContentSequence.find(\r\n item => item.ConceptNameCodeSequence.CodeValue === CodeNameCodeSequenceValues.TrackingIdentifier\r\n );\r\n\r\n const finding = mergedContentSequence.find(\r\n item => item.ConceptNameCodeSequence.CodeValue === CodeNameCodeSequenceValues.Finding\r\n );\r\n\r\n const findingSites = mergedContentSequence.filter(\r\n item =>\r\n item.ConceptNameCodeSequence.CodingSchemeDesignator === CodingSchemeDesignators.SRT &&\r\n item.ConceptNameCodeSequence.CodeValue === CodeNameCodeSequenceValues.FindingSite\r\n );\r\n\r\n const measurement = {\r\n loaded: false,\r\n labels: [],\r\n coords: [],\r\n TrackingUniqueIdentifier: UIDREFContentItem.UID,\r\n TrackingIdentifier: TrackingIdentifierContentItem.TextValue,\r\n };\r\n\r\n if (\r\n finding &&\r\n CodingSchemeDesignators.CornerstoneCodeSchemes.includes(\r\n finding.ConceptCodeSequence.CodingSchemeDesignator\r\n ) &&\r\n finding.ConceptCodeSequence.CodeValue === CodeNameCodeSequenceValues.CornerstoneFreeText\r\n ) {\r\n measurement.labels.push({\r\n label: CORNERSTONE_FREETEXT_CODE_VALUE,\r\n value: finding.ConceptCodeSequence.CodeMeaning,\r\n });\r\n }\r\n\r\n // TODO -> Eventually hopefully support SNOMED or some proper code library, just free text for now.\r\n if (findingSites.length) {\r\n const cornerstoneFreeTextFindingSite = findingSites.find(\r\n FindingSite =>\r\n CodingSchemeDesignators.CornerstoneCodeSchemes.includes(\r\n FindingSite.ConceptCodeSequence.CodingSchemeDesignator\r\n ) &&\r\n FindingSite.ConceptCodeSequence.CodeValue === CodeNameCodeSequenceValues.CornerstoneFreeText\r\n );\r\n\r\n if (cornerstoneFreeTextFindingSite) {\r\n measurement.labels.push({\r\n label: CORNERSTONE_FREETEXT_CODE_VALUE,\r\n value: cornerstoneFreeTextFindingSite.ConceptCodeSequence.CodeMeaning,\r\n });\r\n }\r\n }\r\n\r\n NUMContentItems.forEach(item => {\r\n const { ConceptNameCodeSequence, ContentSequence, MeasuredValueSequence } = item;\r\n\r\n const { ValueType } = ContentSequence;\r\n\r\n if (!ValueType === 'SCOORD') {\r\n console.warn(`Graphic ${ValueType} not currently supported, skipping annotation.`);\r\n\r\n return;\r\n }\r\n\r\n const coords = _getCoordsFromSCOORDOrSCOORD3D(ContentSequence);\r\n\r\n if (coords) {\r\n measurement.coords.push(coords);\r\n }\r\n\r\n if (MeasuredValueSequence) {\r\n measurement.labels.push(\r\n _getLabelFromMeasuredValueSequence(ConceptNameCodeSequence, MeasuredValueSequence)\r\n );\r\n }\r\n });\r\n\r\n return measurement;\r\n}\r\n\r\nfunction _getCoordsFromSCOORDOrSCOORD3D(item) {\r\n const { ValueType, RelationshipType, GraphicType, GraphicData } = item;\r\n\r\n if (\r\n !(\r\n RelationshipType == RELATIONSHIP_TYPE.INFERRED_FROM ||\r\n RelationshipType == RELATIONSHIP_TYPE.CONTAINS\r\n )\r\n ) {\r\n console.warn(\r\n `Relationshiptype === ${RelationshipType}. Cannot deal with NON TID-1400 SCOORD group with RelationshipType !== \"INFERRED FROM\" or \"CONTAINS\"`\r\n );\r\n\r\n return;\r\n }\r\n\r\n const coords = { ValueType, GraphicType, GraphicData };\r\n\r\n // ContentSequence has length of 1 as RelationshipType === 'INFERRED FROM'\r\n if (ValueType === 'SCOORD') {\r\n const { ReferencedSOPSequence } = item.ContentSequence;\r\n\r\n coords.ReferencedSOPSequence = ReferencedSOPSequence;\r\n } else if (ValueType === 'SCOORD3D') {\r\n const { ReferencedFrameOfReferenceSequence } = item.ContentSequence;\r\n\r\n coords.ReferencedFrameOfReferenceSequence = ReferencedFrameOfReferenceSequence;\r\n }\r\n\r\n return coords;\r\n}\r\n\r\nfunction _getLabelFromMeasuredValueSequence(ConceptNameCodeSequence, MeasuredValueSequence) {\r\n const { CodeMeaning } = ConceptNameCodeSequence;\r\n const { NumericValue, MeasurementUnitsCodeSequence } = MeasuredValueSequence;\r\n const { CodeValue } = MeasurementUnitsCodeSequence;\r\n\r\n const formatedNumericValue = NumericValue ? Number(NumericValue).toFixed(2) : '';\r\n\r\n return {\r\n label: CodeMeaning,\r\n value: `${formatedNumericValue} ${CodeValue}`,\r\n }; // E.g. Long Axis: 31.0 mm\r\n}\r\n\r\nfunction _getReferencedImagesList(ImagingMeasurementReportContentSequence) {\r\n const ImageLibrary = ImagingMeasurementReportContentSequence.find(\r\n item => item.ConceptNameCodeSequence.CodeValue === CodeNameCodeSequenceValues.ImageLibrary\r\n );\r\n\r\n const ImageLibraryGroup = _getSequenceAsArray(ImageLibrary.ContentSequence).find(\r\n item => item.ConceptNameCodeSequence.CodeValue === CodeNameCodeSequenceValues.ImageLibraryGroup\r\n );\r\n\r\n const referencedImages = [];\r\n\r\n _getSequenceAsArray(ImageLibraryGroup.ContentSequence).forEach(item => {\r\n const { ReferencedSOPSequence } = item;\r\n if (!ReferencedSOPSequence) {\r\n return;\r\n }\r\n for (const ref of _getSequenceAsArray(ReferencedSOPSequence)) {\r\n if (ref.ReferencedSOPClassUID) {\r\n const { ReferencedSOPClassUID, ReferencedSOPInstanceUID } = ref;\r\n\r\n referencedImages.push({\r\n ReferencedSOPClassUID,\r\n ReferencedSOPInstanceUID,\r\n });\r\n }\r\n }\r\n });\r\n\r\n return referencedImages;\r\n}\r\n\r\nfunction _getSequenceAsArray(sequence) {\r\n if (!sequence) {\r\n return [];\r\n }\r\n return Array.isArray(sequence) ? sequence : [sequence];\r\n}\r\n\r\nexport default getSopClassHandlerModule;\r\n","import { Types } from '@ohif/core';\r\n\r\nconst srProtocol: Types.HangingProtocol.Protocol = {\r\n id: '@ohif/sr',\r\n // Don't store this hanging protocol as it applies to the currently active\r\n // display set by default\r\n // cacheId: null,\r\n name: 'SR Key Images',\r\n // Just apply this one when specifically listed\r\n protocolMatchingRules: [],\r\n toolGroupIds: ['default'],\r\n // -1 would be used to indicate active only, whereas other values are\r\n // the number of required priors referenced - so 0 means active with\r\n // 0 or more priors.\r\n numberOfPriorsReferenced: 0,\r\n // Default viewport is used to define the viewport when\r\n // additional viewports are added using the layout tool\r\n defaultViewport: {\r\n viewportOptions: {\r\n viewportType: 'stack',\r\n toolGroupId: 'default',\r\n allowUnmatchedView: true,\r\n },\r\n displaySets: [\r\n {\r\n id: 'srDisplaySetId',\r\n matchedDisplaySetsIndex: -1,\r\n },\r\n ],\r\n },\r\n displaySetSelectors: {\r\n srDisplaySetId: {\r\n seriesMatchingRules: [\r\n {\r\n attribute: 'Modality',\r\n constraint: {\r\n equals: 'SR',\r\n },\r\n },\r\n ],\r\n },\r\n },\r\n stages: [\r\n {\r\n name: 'SR Key Images',\r\n viewportStructure: {\r\n layoutType: 'grid',\r\n properties: {\r\n rows: 1,\r\n columns: 1,\r\n },\r\n },\r\n viewports: [\r\n {\r\n viewportOptions: { allowUnmatchedView: true },\r\n displaySets: [\r\n {\r\n id: 'srDisplaySetId',\r\n },\r\n ],\r\n },\r\n ],\r\n },\r\n ],\r\n};\r\n\r\nfunction getHangingProtocolModule() {\r\n return [\r\n {\r\n name: srProtocol.id,\r\n protocol: srProtocol,\r\n },\r\n ];\r\n}\r\n\r\nexport default getHangingProtocolModule;\r\nexport { srProtocol };\r\n","import OHIF from '@ohif/core';\r\nimport { annotation } from '@cornerstonejs/tools';\r\nconst { log } = OHIF;\r\n\r\nfunction getFilteredCornerstoneToolState(measurementData, additionalFindingTypes) {\r\n const filteredToolState = {};\r\n\r\n function addToFilteredToolState(annotation, toolType) {\r\n if (!annotation.metadata?.referencedImageId) {\r\n log.warn(`[DICOMSR] No referencedImageId found for ${toolType} ${annotation.id}`);\r\n return;\r\n }\r\n\r\n const imageId = annotation.metadata.referencedImageId;\r\n\r\n if (!filteredToolState[imageId]) {\r\n filteredToolState[imageId] = {};\r\n }\r\n\r\n const imageIdSpecificToolState = filteredToolState[imageId];\r\n\r\n if (!imageIdSpecificToolState[toolType]) {\r\n imageIdSpecificToolState[toolType] = {\r\n data: [],\r\n };\r\n }\r\n\r\n const measurementDataI = measurementData.find(md => md.uid === annotation.annotationUID);\r\n const toolData = imageIdSpecificToolState[toolType].data;\r\n\r\n let { finding } = measurementDataI;\r\n const findingSites = [];\r\n\r\n // NOTE -> We use the CORNERSTONEJS coding schemeDesignator which we have\r\n // defined in the @cornerstonejs/adapters\r\n if (measurementDataI.label) {\r\n if (additionalFindingTypes.includes(toolType)) {\r\n finding = {\r\n CodeValue: 'CORNERSTONEFREETEXT',\r\n CodingSchemeDesignator: 'CORNERSTONEJS',\r\n CodeMeaning: measurementDataI.label,\r\n };\r\n } else {\r\n findingSites.push({\r\n CodeValue: 'CORNERSTONEFREETEXT',\r\n CodingSchemeDesignator: 'CORNERSTONEJS',\r\n CodeMeaning: measurementDataI.label,\r\n });\r\n }\r\n }\r\n\r\n if (measurementDataI.findingSites) {\r\n findingSites.push(...measurementDataI.findingSites);\r\n }\r\n\r\n const measurement = Object.assign({}, annotation, {\r\n finding,\r\n findingSites,\r\n });\r\n\r\n toolData.push(measurement);\r\n }\r\n\r\n const uidFilter = measurementData.map(md => md.uid);\r\n const uids = uidFilter.slice();\r\n\r\n const annotationManager = annotation.state.getAnnotationManager();\r\n const framesOfReference = annotationManager.getFramesOfReference();\r\n\r\n for (let i = 0; i < framesOfReference.length; i++) {\r\n const frameOfReference = framesOfReference[i];\r\n\r\n const frameOfReferenceAnnotations = annotationManager.getAnnotations(frameOfReference);\r\n\r\n const toolTypes = Object.keys(frameOfReferenceAnnotations);\r\n\r\n for (let j = 0; j < toolTypes.length; j++) {\r\n const toolType = toolTypes[j];\r\n\r\n const annotations = frameOfReferenceAnnotations[toolType];\r\n\r\n if (annotations) {\r\n for (let k = 0; k < annotations.length; k++) {\r\n const annotation = annotations[k];\r\n const uidIndex = uids.findIndex(uid => uid === annotation.annotationUID);\r\n\r\n if (uidIndex !== -1) {\r\n addToFilteredToolState(annotation, toolType);\r\n uids.splice(uidIndex, 1);\r\n\r\n if (!uids.length) {\r\n return filteredToolState;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n return filteredToolState;\r\n}\r\n\r\nexport default getFilteredCornerstoneToolState;\r\n","import { metaData, utilities } from '@cornerstonejs/core';\r\n\r\nimport OHIF, { DicomMetadataStore } from '@ohif/core';\r\nimport dcmjs from 'dcmjs';\r\nimport { adaptersSR } from '@cornerstonejs/adapters';\r\n\r\nimport getFilteredCornerstoneToolState from './utils/getFilteredCornerstoneToolState';\r\n\r\nconst { MeasurementReport } = adaptersSR.Cornerstone3D;\r\nconst { log } = OHIF;\r\n\r\n/**\r\n *\r\n * @param measurementData An array of measurements from the measurements service\r\n * that you wish to serialize.\r\n * @param additionalFindingTypes toolTypes that should be stored with labels as Findings\r\n * @param options Naturalized DICOM JSON headers to merge into the displaySet.\r\n *\r\n */\r\nconst _generateReport = (measurementData, additionalFindingTypes, options = {}) => {\r\n const filteredToolState = getFilteredCornerstoneToolState(\r\n measurementData,\r\n additionalFindingTypes\r\n );\r\n\r\n const report = MeasurementReport.generateReport(\r\n filteredToolState,\r\n metaData,\r\n utilities.worldToImageCoords,\r\n options\r\n );\r\n\r\n const { dataset } = report;\r\n\r\n // Set the default character set as UTF-8\r\n // https://dicom.innolitics.com/ciods/nm-image/sop-common/00080005\r\n if (typeof dataset.SpecificCharacterSet === 'undefined') {\r\n dataset.SpecificCharacterSet = 'ISO_IR 192';\r\n }\r\n return dataset;\r\n};\r\n\r\nconst commandsModule = ({}) => {\r\n const actions = {\r\n /**\r\n *\r\n * @param measurementData An array of measurements from the measurements service\r\n * @param additionalFindingTypes toolTypes that should be stored with labels as Findings\r\n * @param options Naturalized DICOM JSON headers to merge into the displaySet.\r\n * as opposed to Finding Sites.\r\n * that you wish to serialize.\r\n */\r\n downloadReport: ({ measurementData, additionalFindingTypes, options = {} }) => {\r\n const srDataset = actions.generateReport(measurementData, additionalFindingTypes, options);\r\n const reportBlob = dcmjs.data.datasetToBlob(srDataset);\r\n\r\n //Create a URL for the binary.\r\n var objectUrl = URL.createObjectURL(reportBlob);\r\n window.location.assign(objectUrl);\r\n },\r\n\r\n /**\r\n *\r\n * @param measurementData An array of measurements from the measurements service\r\n * that you wish to serialize.\r\n * @param dataSource The dataSource that you wish to use to persist the data.\r\n * @param additionalFindingTypes toolTypes that should be stored with labels as Findings\r\n * @param options Naturalized DICOM JSON headers to merge into the displaySet.\r\n * @return The naturalized report\r\n */\r\n storeMeasurements: async ({\r\n measurementData,\r\n dataSource,\r\n additionalFindingTypes,\r\n options = {},\r\n }) => {\r\n // Use the @cornerstonejs adapter for converting to/from DICOM\r\n // But it is good enough for now whilst we only have cornerstone as a datasource.\r\n log.info('[DICOMSR] storeMeasurements');\r\n\r\n if (!dataSource || !dataSource.store || !dataSource.store.dicom) {\r\n log.error('[DICOMSR] datasource has no dataSource.store.dicom endpoint!');\r\n return Promise.reject({});\r\n }\r\n\r\n try {\r\n const naturalizedReport = _generateReport(measurementData, additionalFindingTypes, options);\r\n\r\n const { StudyInstanceUID, ContentSequence } = naturalizedReport;\r\n // The content sequence has 5 or more elements, of which\r\n // the `[4]` element contains the annotation data, so this is\r\n // checking that there is some annotation data present.\r\n if (!ContentSequence?.[4].ContentSequence?.length) {\r\n console.log('naturalizedReport missing imaging content', naturalizedReport);\r\n throw new Error('Invalid report, no content');\r\n }\r\n\r\n await dataSource.store.dicom(naturalizedReport);\r\n\r\n if (StudyInstanceUID) {\r\n dataSource.deleteStudyMetadataPromise(StudyInstanceUID);\r\n }\r\n\r\n // The \"Mode\" route listens for DicomMetadataStore changes\r\n // When a new instance is added, it listens and\r\n // automatically calls makeDisplaySets\r\n DicomMetadataStore.addInstances([naturalizedReport], true);\r\n\r\n return naturalizedReport;\r\n } catch (error) {\r\n console.warn(error);\r\n log.error(`[DICOMSR] Error while saving the measurements: ${error.message}`);\r\n throw new Error(error.message || 'Error while saving the measurements.');\r\n }\r\n },\r\n };\r\n\r\n const definitions = {\r\n downloadReport: {\r\n commandFn: actions.downloadReport,\r\n storeContexts: [],\r\n options: {},\r\n },\r\n storeMeasurements: {\r\n commandFn: actions.storeMeasurements,\r\n storeContexts: [],\r\n options: {},\r\n },\r\n };\r\n\r\n return {\r\n actions,\r\n definitions,\r\n defaultContext: 'CORNERSTONE_STRUCTURED_REPORT',\r\n };\r\n};\r\n\r\nexport default commandsModule;\r\n","import { addTool } from '@cornerstonejs/tools';\r\n\r\nexport default function addToolInstance(name: string, toolClass, configuration?): void {\r\n class InstanceClass extends toolClass {\r\n static toolName = name;\r\n }\r\n addTool(InstanceClass);\r\n}\r\n","import { DisplaySetService, classes } from '@ohif/core';\r\n\r\nconst ImageSet = classes.ImageSet;\r\n\r\nconst findInstance = (measurement, displaySetService: DisplaySetService) => {\r\n const { displaySetInstanceUID, ReferencedSOPInstanceUID: sopUid } = measurement;\r\n const referencedDisplaySet = displaySetService.getDisplaySetByUID(displaySetInstanceUID);\r\n if (!referencedDisplaySet.images) {\r\n return;\r\n }\r\n return referencedDisplaySet.images.find(it => it.SOPInstanceUID === sopUid);\r\n};\r\n\r\n/** Finds references to display sets inside the measurements\r\n * contained within the provided display set.\r\n * @return an array of instances referenced.\r\n */\r\nconst findReferencedInstances = (displaySetService: DisplaySetService, displaySet) => {\r\n const instances = [];\r\n const instanceById = {};\r\n for (const measurement of displaySet.measurements) {\r\n const { imageId } = measurement;\r\n if (!imageId) {\r\n continue;\r\n }\r\n if (instanceById[imageId]) {\r\n continue;\r\n }\r\n\r\n const instance = findInstance(measurement, displaySetService);\r\n if (!instance) {\r\n console.log('Measurement', measurement, 'had no instances found');\r\n continue;\r\n }\r\n\r\n instanceById[imageId] = instance;\r\n instances.push(instance);\r\n }\r\n return instances;\r\n};\r\n\r\n/**\r\n * Creates a new display set containing a single image instance for each\r\n * referenced image.\r\n *\r\n * @param displaySetService\r\n * @param displaySet - containing measurements referencing images.\r\n * @returns A new (registered/active) display set containing the referenced images\r\n */\r\nconst createReferencedImageDisplaySet = (displaySetService, displaySet) => {\r\n const instances = findReferencedInstances(displaySetService, displaySet);\r\n // This will be a member function of the created image set\r\n const updateInstances = function () {\r\n this.images.splice(\r\n 0,\r\n this.images.length,\r\n ...findReferencedInstances(displaySetService, displaySet)\r\n );\r\n this.numImageFrames = this.images.length;\r\n };\r\n\r\n const imageSet = new ImageSet(instances);\r\n const instance = instances[0];\r\n imageSet.setAttributes({\r\n displaySetInstanceUID: imageSet.uid, // create a local alias for the imageSet UID\r\n SeriesDate: instance.SeriesDate,\r\n SeriesTime: instance.SeriesTime,\r\n SeriesInstanceUID: imageSet.uid,\r\n StudyInstanceUID: instance.StudyInstanceUID,\r\n SeriesNumber: instance.SeriesNumber || 0,\r\n SOPClassUID: instance.SOPClassUID,\r\n SeriesDescription: `${displaySet.SeriesDescription} KO ${displaySet.instance.SeriesNumber}`,\r\n Modality: 'KO',\r\n isMultiFrame: false,\r\n numImageFrames: instances.length,\r\n SOPClassHandlerId: `@ohif/extension-default.sopClassHandlerModule.stack`,\r\n isReconstructable: false,\r\n // This object is made of multiple instances from other series\r\n isCompositeStack: true,\r\n madeInClient: true,\r\n excludeFromThumbnailBrowser: true,\r\n updateInstances,\r\n });\r\n\r\n displaySetService.addDisplaySets(imageSet);\r\n\r\n return imageSet;\r\n};\r\n\r\nexport default createReferencedImageDisplaySet;\r\n","import React from 'react';\r\nimport getSopClassHandlerModule from './getSopClassHandlerModule';\r\nimport getHangingProtocolModule, { srProtocol } from './getHangingProtocolModule';\r\nimport onModeEnter from './onModeEnter';\r\nimport getCommandsModule from './commandsModule';\r\nimport preRegistration from './init';\r\nimport { id } from './id.js';\r\nimport toolNames from './tools/toolNames';\r\nimport hydrateStructuredReport from './utils/hydrateStructuredReport';\r\nimport createReferencedImageDisplaySet from './utils/createReferencedImageDisplaySet';\r\n\r\nconst Component = React.lazy(() => {\r\n return import(/* webpackPrefetch: true */ './viewports/OHIFCornerstoneSRViewport');\r\n});\r\n\r\nconst OHIFCornerstoneSRViewport = props => {\r\n return (\r\n Loading...}>\r\n \r\n \r\n );\r\n};\r\n\r\n/**\r\n *\r\n */\r\nconst dicomSRExtension = {\r\n /**\r\n * Only required property. Should be a unique value across all extensions.\r\n */\r\n id,\r\n onModeEnter,\r\n\r\n preRegistration,\r\n\r\n /**\r\n *\r\n *\r\n * @param {object} [configuration={}]\r\n * @param {object|array} [configuration.csToolsConfig] - Passed directly to `initCornerstoneTools`\r\n */\r\n getViewportModule({ servicesManager, extensionManager }) {\r\n const ExtendedOHIFCornerstoneSRViewport = props => {\r\n return (\r\n \r\n );\r\n };\r\n\r\n return [{ name: 'dicom-sr', component: ExtendedOHIFCornerstoneSRViewport }];\r\n },\r\n getCommandsModule,\r\n getSopClassHandlerModule,\r\n // Include dynamically computed values such as toolNames not known till instantiation\r\n getUtilityModule({ servicesManager }) {\r\n return [\r\n {\r\n name: 'tools',\r\n exports: {\r\n toolNames,\r\n },\r\n },\r\n ];\r\n },\r\n};\r\n\r\nexport default dicomSRExtension;\r\n\r\n// Put static exports here so they can be type checked\r\nexport { hydrateStructuredReport, createReferencedImageDisplaySet, srProtocol };\r\n","import { SOPClassHandlerId } from './id';\r\n\r\nexport default function onModeEnter({ servicesManager }) {\r\n const { displaySetService } = servicesManager.services;\r\n const displaySetCache = displaySetService.getDisplaySetCache();\r\n\r\n const srDisplaySets = [...displaySetCache.values()].filter(\r\n ds => ds.SOPClassHandlerId === SOPClassHandlerId\r\n );\r\n\r\n srDisplaySets.forEach(ds => {\r\n // New mode route, allow SRs to be hydrated again\r\n ds.isHydrated = false;\r\n });\r\n}\r\n","import {\r\n addTool,\r\n AngleTool,\r\n annotation,\r\n ArrowAnnotateTool,\r\n BidirectionalTool,\r\n CobbAngleTool,\r\n EllipticalROITool,\r\n CircleROITool,\r\n LengthTool,\r\n PlanarFreehandROITool,\r\n} from '@cornerstonejs/tools';\r\nimport DICOMSRDisplayTool from './tools/DICOMSRDisplayTool';\r\nimport addToolInstance from './utils/addToolInstance';\r\nimport { Types } from '@ohif/core';\r\nimport toolNames from './tools/toolNames';\r\n\r\n/**\r\n * @param {object} configuration\r\n */\r\nexport default function init({ configuration = {} }: Types.Extensions.ExtensionParams): void {\r\n addTool(DICOMSRDisplayTool);\r\n addToolInstance(toolNames.SRLength, LengthTool, {});\r\n addToolInstance(toolNames.SRBidirectional, BidirectionalTool);\r\n addToolInstance(toolNames.SREllipticalROI, EllipticalROITool);\r\n addToolInstance(toolNames.SRCircleROI, CircleROITool);\r\n addToolInstance(toolNames.SRArrowAnnotate, ArrowAnnotateTool);\r\n addToolInstance(toolNames.SRAngle, AngleTool);\r\n // TODO - fix the SR display of Cobb Angle, as it joins the two lines\r\n addToolInstance(toolNames.SRCobbAngle, CobbAngleTool);\r\n // TODO - fix the rehydration of Freehand, as it throws an exception\r\n // on a missing polyline. The fix is probably in CS3D\r\n addToolInstance(toolNames.SRPlanarFreehandROI, PlanarFreehandROITool);\r\n\r\n // Modify annotation tools to use dashed lines on SR\r\n const dashedLine = {\r\n lineDash: '4,4',\r\n };\r\n annotation.config.style.setToolGroupToolStyles('SRToolGroup', {\r\n SRLength: dashedLine,\r\n SRBidirectional: dashedLine,\r\n SREllipticalROI: dashedLine,\r\n SRCircleROI: dashedLine,\r\n SRArrowAnnotate: dashedLine,\r\n SRCobbAngle: dashedLine,\r\n SRAngle: dashedLine,\r\n SRPlanarFreehandROI: dashedLine,\r\n global: {},\r\n });\r\n}\r\n","import { getEnabledElement } from '@cornerstonejs/core';\r\n\r\nconst state = {\r\n TrackingUniqueIdentifier: null,\r\n trackingIdentifiersByViewportId: {},\r\n};\r\n\r\n/**\r\n * This file is being used to store the per-viewport state of the SR tools,\r\n * Since, all the toolStates are added to the cornerstoneTools, when displaying the SRTools,\r\n * if there are two viewports rendering the same imageId, we don't want to show\r\n * the same SR annotation twice on irrelevant viewport, hence, we are storing the state\r\n * of the SR tools in state here, so that we can filter them later.\r\n */\r\n\r\nfunction setTrackingUniqueIdentifiersForElement(\r\n element,\r\n trackingUniqueIdentifiers,\r\n activeIndex = 0\r\n) {\r\n const enabledElement = getEnabledElement(element);\r\n const { viewport } = enabledElement;\r\n\r\n state.trackingIdentifiersByViewportId[viewport.id] = {\r\n trackingUniqueIdentifiers,\r\n activeIndex,\r\n };\r\n}\r\n\r\nfunction setActiveTrackingUniqueIdentifierForElement(element, TrackingUniqueIdentifier) {\r\n const enabledElement = getEnabledElement(element);\r\n const { viewport } = enabledElement;\r\n\r\n const trackingIdentifiersForElement = state.trackingIdentifiersByViewportId[viewport.id];\r\n\r\n if (trackingIdentifiersForElement) {\r\n const activeIndex = trackingIdentifiersForElement.trackingUniqueIdentifiers.findIndex(\r\n tuid => tuid === TrackingUniqueIdentifier\r\n );\r\n\r\n trackingIdentifiersForElement.activeIndex = activeIndex;\r\n }\r\n}\r\n\r\nfunction getTrackingUniqueIdentifiersForElement(element) {\r\n const enabledElement = getEnabledElement(element);\r\n const { viewport } = enabledElement;\r\n\r\n if (state.trackingIdentifiersByViewportId[viewport.id]) {\r\n return state.trackingIdentifiersByViewportId[viewport.id];\r\n }\r\n\r\n return { trackingUniqueIdentifiers: [] };\r\n}\r\n\r\nexport {\r\n setTrackingUniqueIdentifiersForElement,\r\n setActiveTrackingUniqueIdentifierForElement,\r\n getTrackingUniqueIdentifiersForElement,\r\n};\r\n","import { utilities, metaData } from '@cornerstonejs/core';\r\nimport OHIF, { DicomMetadataStore } from '@ohif/core';\r\nimport getLabelFromDCMJSImportedToolData from './getLabelFromDCMJSImportedToolData';\r\nimport { adaptersSR } from '@cornerstonejs/adapters';\r\nimport { annotation as CsAnnotation } from '@cornerstonejs/tools';\r\nconst { locking } = CsAnnotation;\r\n\r\nconst { guid } = OHIF.utils;\r\nconst { MeasurementReport, CORNERSTONE_3D_TAG } = adaptersSR.Cornerstone3D;\r\n\r\nconst CORNERSTONE_3D_TOOLS_SOURCE_NAME = 'Cornerstone3DTools';\r\nconst CORNERSTONE_3D_TOOLS_SOURCE_VERSION = '0.1';\r\n\r\nconst supportedLegacyCornerstoneTags = ['cornerstoneTools@^4.0.0'];\r\n\r\nconst convertCode = (codingValues, code) => {\r\n if (!code || code.CodingSchemeDesignator === 'CORNERSTONEJS') {\r\n return;\r\n }\r\n const ref = `${code.CodingSchemeDesignator}:${code.CodeValue}`;\r\n const ret = { ...codingValues[ref], ref, ...code, text: code.CodeMeaning };\r\n return ret;\r\n};\r\n\r\nconst convertSites = (codingValues, sites) => {\r\n if (!sites || !sites.length) {\r\n return;\r\n }\r\n const ret = [];\r\n // Do as a loop to convert away from Proxy instances\r\n for (let i = 0; i < sites.length; i++) {\r\n // Deal with irregular conversion from dcmjs\r\n const site = convertCode(codingValues, sites[i][0] || sites[i]);\r\n if (site) {\r\n ret.push(site);\r\n }\r\n }\r\n return (ret.length && ret) || undefined;\r\n};\r\n\r\n/**\r\n * Hydrates a structured report, for default viewports.\r\n *\r\n */\r\nexport default function hydrateStructuredReport(\r\n { servicesManager, extensionManager, appConfig },\r\n displaySetInstanceUID\r\n) {\r\n const annotationManager = CsAnnotation.state.getAnnotationManager();\r\n const disableEditing = appConfig?.disableEditing;\r\n const dataSource = extensionManager.getActiveDataSource()[0];\r\n const { measurementService, displaySetService, customizationService } = servicesManager.services;\r\n\r\n const codingValues = customizationService.getCustomization('codingValues', {});\r\n const displaySet = displaySetService.getDisplaySetByUID(displaySetInstanceUID);\r\n\r\n // TODO -> We should define a strict versioning somewhere.\r\n const mappings = measurementService.getSourceMappings(\r\n CORNERSTONE_3D_TOOLS_SOURCE_NAME,\r\n CORNERSTONE_3D_TOOLS_SOURCE_VERSION\r\n );\r\n\r\n if (!mappings || !mappings.length) {\r\n throw new Error(\r\n `Attempting to hydrate measurements service when no mappings present. This shouldn't be reached.`\r\n );\r\n }\r\n\r\n const instance = DicomMetadataStore.getInstance(\r\n displaySet.StudyInstanceUID,\r\n displaySet.SeriesInstanceUID,\r\n displaySet.SOPInstanceUID\r\n );\r\n\r\n const sopInstanceUIDToImageId = {};\r\n const imageIdsForToolState = {};\r\n\r\n displaySet.measurements.forEach(measurement => {\r\n const { ReferencedSOPInstanceUID, imageId, frameNumber } = measurement;\r\n\r\n if (!sopInstanceUIDToImageId[ReferencedSOPInstanceUID]) {\r\n sopInstanceUIDToImageId[ReferencedSOPInstanceUID] = imageId;\r\n imageIdsForToolState[ReferencedSOPInstanceUID] = [];\r\n }\r\n if (!imageIdsForToolState[ReferencedSOPInstanceUID][frameNumber]) {\r\n imageIdsForToolState[ReferencedSOPInstanceUID][frameNumber] = imageId;\r\n }\r\n });\r\n\r\n const datasetToUse = _mapLegacyDataSet(instance);\r\n\r\n // Use dcmjs to generate toolState.\r\n const storedMeasurementByAnnotationType = MeasurementReport.generateToolState(\r\n datasetToUse,\r\n // NOTE: we need to pass in the imageIds to dcmjs since the we use them\r\n // for the imageToWorld transformation. The following assumes that the order\r\n // that measurements were added to the display set are the same order as\r\n // the measurementGroups in the instance.\r\n sopInstanceUIDToImageId,\r\n utilities.imageToWorldCoords,\r\n metaData\r\n );\r\n\r\n // Filter what is found by DICOM SR to measurements we support.\r\n const mappingDefinitions = mappings.map(m => m.annotationType);\r\n const hydratableMeasurementsInSR = {};\r\n\r\n Object.keys(storedMeasurementByAnnotationType).forEach(key => {\r\n if (mappingDefinitions.includes(key)) {\r\n hydratableMeasurementsInSR[key] = storedMeasurementByAnnotationType[key];\r\n }\r\n });\r\n\r\n // Set the series touched as tracked.\r\n const imageIds = [];\r\n\r\n // TODO: notification if no hydratable?\r\n Object.keys(hydratableMeasurementsInSR).forEach(annotationType => {\r\n const toolDataForAnnotationType = hydratableMeasurementsInSR[annotationType];\r\n\r\n toolDataForAnnotationType.forEach(toolData => {\r\n // Add the measurement to toolState\r\n // dcmjs and Cornerstone3D has structural defect in supporting multi-frame\r\n // files, and looking up the imageId from sopInstanceUIDToImageId results\r\n // in the wrong value.\r\n const frameNumber = (toolData.annotation.data && toolData.annotation.data.frameNumber) || 1;\r\n const imageId =\r\n imageIdsForToolState[toolData.sopInstanceUid][frameNumber] ||\r\n sopInstanceUIDToImageId[toolData.sopInstanceUid];\r\n\r\n if (!imageIds.includes(imageId)) {\r\n imageIds.push(imageId);\r\n }\r\n });\r\n });\r\n\r\n let targetStudyInstanceUID;\r\n const SeriesInstanceUIDs = [];\r\n\r\n for (let i = 0; i < imageIds.length; i++) {\r\n const imageId = imageIds[i];\r\n const { SeriesInstanceUID, StudyInstanceUID } = metaData.get('instance', imageId);\r\n\r\n if (!SeriesInstanceUIDs.includes(SeriesInstanceUID)) {\r\n SeriesInstanceUIDs.push(SeriesInstanceUID);\r\n }\r\n\r\n if (!targetStudyInstanceUID) {\r\n targetStudyInstanceUID = StudyInstanceUID;\r\n } else if (targetStudyInstanceUID !== StudyInstanceUID) {\r\n console.warn('NO SUPPORT FOR SRs THAT HAVE MEASUREMENTS FROM MULTIPLE STUDIES.');\r\n }\r\n }\r\n\r\n Object.keys(hydratableMeasurementsInSR).forEach(annotationType => {\r\n const toolDataForAnnotationType = hydratableMeasurementsInSR[annotationType];\r\n\r\n toolDataForAnnotationType.forEach(toolData => {\r\n // Add the measurement to toolState\r\n // dcmjs and Cornerstone3D has structural defect in supporting multi-frame\r\n // files, and looking up the imageId from sopInstanceUIDToImageId results\r\n // in the wrong value.\r\n const frameNumber = (toolData.annotation.data && toolData.annotation.data.frameNumber) || 1;\r\n const imageId =\r\n imageIdsForToolState[toolData.sopInstanceUid][frameNumber] ||\r\n sopInstanceUIDToImageId[toolData.sopInstanceUid];\r\n\r\n toolData.uid = guid();\r\n\r\n const instance = metaData.get('instance', imageId);\r\n const {\r\n FrameOfReferenceUID,\r\n // SOPInstanceUID,\r\n // SeriesInstanceUID,\r\n // StudyInstanceUID,\r\n } = instance;\r\n\r\n const annotation = {\r\n annotationUID: toolData.annotation.annotationUID,\r\n data: toolData.annotation.data,\r\n metadata: {\r\n toolName: annotationType,\r\n referencedImageId: imageId,\r\n FrameOfReferenceUID,\r\n },\r\n };\r\n\r\n const source = measurementService.getSource(\r\n CORNERSTONE_3D_TOOLS_SOURCE_NAME,\r\n CORNERSTONE_3D_TOOLS_SOURCE_VERSION\r\n );\r\n annotation.data.label = getLabelFromDCMJSImportedToolData(toolData);\r\n annotation.data.finding = convertCode(codingValues, toolData.finding?.[0]);\r\n annotation.data.findingSites = convertSites(codingValues, toolData.findingSites);\r\n annotation.data.site = annotation.data.findingSites?.[0];\r\n\r\n const matchingMapping = mappings.find(m => m.annotationType === annotationType);\r\n\r\n const newAnnotationUID = measurementService.addRawMeasurement(\r\n source,\r\n annotationType,\r\n { annotation },\r\n matchingMapping.toMeasurementSchema,\r\n dataSource\r\n );\r\n\r\n if (disableEditing) {\r\n const addedAnnotation = annotationManager.getAnnotation(newAnnotationUID);\r\n locking.setAnnotationLocked(addedAnnotation, true);\r\n }\r\n\r\n if (!imageIds.includes(imageId)) {\r\n imageIds.push(imageId);\r\n }\r\n });\r\n });\r\n\r\n displaySet.isHydrated = true;\r\n\r\n return {\r\n StudyInstanceUID: targetStudyInstanceUID,\r\n SeriesInstanceUIDs,\r\n };\r\n}\r\n\r\nfunction _mapLegacyDataSet(dataset) {\r\n const REPORT = 'Imaging Measurements';\r\n const GROUP = 'Measurement Group';\r\n const TRACKING_IDENTIFIER = 'Tracking Identifier';\r\n\r\n // Identify the Imaging Measurements\r\n const imagingMeasurementContent = toArray(dataset.ContentSequence).find(\r\n codeMeaningEquals(REPORT)\r\n );\r\n\r\n // Retrieve the Measurements themselves\r\n const measurementGroups = toArray(imagingMeasurementContent.ContentSequence).filter(\r\n codeMeaningEquals(GROUP)\r\n );\r\n\r\n // For each of the supported measurement types, compute the measurement data\r\n const measurementData = {};\r\n\r\n const cornerstoneToolClasses = MeasurementReport.CORNERSTONE_TOOL_CLASSES_BY_UTILITY_TYPE;\r\n\r\n const registeredToolClasses = [];\r\n\r\n Object.keys(cornerstoneToolClasses).forEach(key => {\r\n registeredToolClasses.push(cornerstoneToolClasses[key]);\r\n measurementData[key] = [];\r\n });\r\n\r\n measurementGroups.forEach((measurementGroup, index) => {\r\n const measurementGroupContentSequence = toArray(measurementGroup.ContentSequence);\r\n\r\n const TrackingIdentifierGroup = measurementGroupContentSequence.find(\r\n contentItem => contentItem.ConceptNameCodeSequence.CodeMeaning === TRACKING_IDENTIFIER\r\n );\r\n\r\n const TrackingIdentifier = TrackingIdentifierGroup.TextValue;\r\n\r\n let [cornerstoneTag, toolName] = TrackingIdentifier.split(':');\r\n if (supportedLegacyCornerstoneTags.includes(cornerstoneTag)) {\r\n cornerstoneTag = CORNERSTONE_3D_TAG;\r\n }\r\n\r\n const mappedTrackingIdentifier = `${cornerstoneTag}:${toolName}`;\r\n\r\n TrackingIdentifierGroup.TextValue = mappedTrackingIdentifier;\r\n });\r\n\r\n return dataset;\r\n}\r\n\r\nconst toArray = function (x) {\r\n return Array.isArray(x) ? x : [x];\r\n};\r\n\r\nconst codeMeaningEquals = codeMeaningName => {\r\n return contentItem => {\r\n return contentItem.ConceptNameCodeSequence.CodeMeaning === codeMeaningName;\r\n };\r\n};\r\n","/**\r\n * Extracts the label from the toolData imported from dcmjs. We need to do this\r\n * as dcmjs does not depeend on OHIF/the measurementService, it just produces data for cornestoneTools.\r\n * This optional data is available for the consumer to process if they wish to.\r\n * @param {object} toolData The tooldata relating to the\r\n *\r\n * @returns {string} The extracted label.\r\n */\r\nexport default function getLabelFromDCMJSImportedToolData(toolData) {\r\n const { findingSites = [], finding } = toolData;\r\n\r\n let freeTextLabel = findingSites.find(fs => fs.CodeValue === 'CORNERSTONEFREETEXT');\r\n\r\n if (freeTextLabel) {\r\n return freeTextLabel.CodeMeaning;\r\n }\r\n\r\n if (finding && finding.CodeValue === 'CORNERSTONEFREETEXT') {\r\n return finding.CodeMeaning;\r\n }\r\n}\r\n"],"names":["id","packageJson","SOPClassHandlerName","SOPClassHandlerId","POINT","MULTIPOINT","POLYLINE","CIRCLE","ELLIPSE","DICOMSRDisplayTool","AnnotationTool","constructor","super","arguments","length","undefined","configuration","isPointNearTool","getHandleNearImagePoint","renderAnnotation","enabledElement","svgDrawingHelper","viewport","element","annotations","annotation","this","getToolName","filterInteractableAnnotationsForElement","trackingUniqueIdentifiersForElement","getTrackingUniqueIdentifiersForElement","activeIndex","trackingUniqueIdentifiers","activeTrackingUniqueIdentifier","filteredAnnotations","filter","includes","data","cachedStats","TrackingUniqueIdentifier","_actors","size","styleSpecifier","toolGroupId","toolName","viewportId","i","annotationUID","renderableData","referencedImageId","metadata","lineWidth","getStyle","lineDash","options","color","Object","keys","forEach","GraphicType","renderableDataForGraphicType","renderMethod","canvasCoordinatesAdapter","SCOORD_TYPES","renderPoint","renderMultipoint","renderPolyLine","renderEllipse","utilities","Error","canvasCoordinates","renderTextBox","_getTextBoxLinesFromLabels","labels","labelLength","Math","min","lines","labelEntry","push","_labelToShorthand","label","value","drawingOptions","width","allCanvasCoordinates","map","index","p","worldToCanvas","lineUID","drawing","concat","point","imagePixelModule","metaData","xOffset","yOffset","columns","rows","imagePoint","csUtils","arrowEnd","arrowUID","ellipsePointsWorld","rotation","getRotation","canvasCorners","adaptedCanvasCoordinates","textLines","canvasTextBoxCoords","handles","textBox","worldPosition","canvasToWorld","textBoxPosition","textBoxOptions","getLinkedTextBoxStyle","boundingBox","x","left","y","top","height","worldBoundingBox","topLeft","topRight","bottomLeft","bottomRight","SHORT_HAND_MAP","AREA","Length","CORNERSTONEFREETEXT","shortHand","DICOMSRDisplay","SRLength","SRBidirectional","SREllipticalROI","SRCircleROI","SRArrowAnnotate","SRAngle","SRCobbAngle","SRRectangleROI","SRPlanarFreehandROI","EPSILON","addMeasurement","measurement","imageId","displaySetInstanceUID","toolNames","measurementData","coords","coord","GraphicData","TrackingIdentifier","cornerstoneTag","split","worldPos","pointsWorld","center","onPerimeter","radius","vec3","imagePlaneModule","columnCosines","rowCosines","firstAxisStart","firstAxisEnd","secondAxisStart","secondAxisEnd","majorAxisStart","majorAxisEnd","minorAxisStart","minorAxisEnd","majorAxisVec","minorAxisVec","columnCosinesVec","projectedMajorAxisOnColVec","abs","projectedMinorAxisOnColVec","absoluteOfMajorDotProduct","absoluteOfMinorDotProduct","console","warn","_getRenderableData","annotationManager","frameNumber","ReferencedSOPSequence","ReferencedFrameNumber","SRAnnotation","FrameOfReferenceUID","frameOfReferenceUID","addAnnotation","loaded","ReferencedSOPInstanceUID","cornerstoneAdapters","adaptersSR","Cornerstone3D","MeasurementReport","CORNERSTONE_TOOL_CLASSES_BY_UTILITY_TYPE","supportedLegacyCornerstoneTags","CORNERSTONE_3D_TAG","CodeScheme","Cornerstone3DCodeScheme","ImageSet","MetadataProvider","metadataProvider","classes","sopClassUids","CORNERSTONE_3D_TOOLS_SOURCE_NAME","CORNERSTONE_3D_TOOLS_SOURCE_VERSION","validateSameStudyUID","uid","instances","it","StudyInstanceUID","SOPInstanceUID","CodeNameCodeSequenceValues","ImagingMeasurementReport","ImageLibrary","ImagingMeasurements","MeasurementGroup","ImageLibraryGroup","Finding","FindingSite","CornerstoneFreeText","codeValues","CodingSchemeDesignators","SRT","CornerstoneCodeSchemes","CodingSchemeDesignator","RELATIONSHIP_TYPE","INFERRED_FROM","CONTAINS","CORNERSTONE_FREETEXT_CODE_VALUE","addInstances","displaySetService","utils","sortStudyInstances","instance","isLoaded","_getDisplaySetsFromSeries","servicesManager","extensionManager","SeriesInstanceUID","SeriesDescription","SeriesNumber","SeriesDate","ConceptNameCodeSequence","SOPClassUID","CodeValue","services","uiNotificationService","show","title","message","type","duration","displaySet","Modality","guid","referencedImages","measurements","isDerivedDisplaySet","load","measurementService","dataSources","getDataSources","dataSource","ContentSequence","ImagingMeasurementReportContentSequence","_getSequenceAsArray","find","item","ref","ReferencedSOPClassUID","_getReferencedImagesList","mergedContentSequencesByTrackingUniqueIdentifiers","MeasurementGroups","TrackingUniqueIdentifierItem","trackingUniqueIdentifier","UID","_getMergedContentSequencesByTrackingUniqueIdentifiers","mergedContentSequence","some","group","ValueType","graphicItem","UIDREFContentItem","TrackingIdentifierContentItem","NUMContentItems","_getCoordsFromSCOORDOrSCOORD3D","TextValue","MeasuredValueSequence","_getLabelFromMeasuredValueSequence","_processTID1410Measurement","finding","findingSites","ConceptCodeSequence","CodeMeaning","cornerstoneFreeTextFindingSite","_processNonGeometricallyDefinedMeasurement","_processMeasurement","_getMeasurements","mappings","getSourceMappings","isHydrated","isRehydratable","mappingDefinitions","m","annotationType","adapterKeys","adapterKey","isValidCornerstoneTrackingIdentifier","adapters","key","adapter","mappedTrackingIdentifier","log","activeDisplaySets","activeDisplaySet","_checkIfCanAddMeasurementsToDisplaySet","subscribe","EVENTS","DISPLAY_SETS_ADDED","displaySetsAdded","newDisplaySet","_load","srDisplaySet","unloadedMeasurements","images","SOPInstanceUIDs","imageIdsForDisplaySet","getImageIdsForDisplaySet","getUIDsFromImageID","j","_measurementReferencesSOPInstanceUID","splice","Number","RelationshipType","ReferencedFrameOfReferenceSequence","NumericValue","MeasurementUnitsCodeSequence","toFixed","sequence","Array","isArray","_ref","name","getDisplaySetsFromSeries","srProtocol","protocolMatchingRules","toolGroupIds","numberOfPriorsReferenced","defaultViewport","viewportOptions","viewportType","allowUnmatchedView","displaySets","matchedDisplaySetsIndex","displaySetSelectors","srDisplaySetId","seriesMatchingRules","attribute","constraint","equals","stages","viewportStructure","layoutType","properties","viewports","OHIF","additionalFindingTypes","filteredToolState","addToFilteredToolState","toolType","imageIdSpecificToolState","measurementDataI","md","toolData","assign","uids","slice","framesOfReference","getFramesOfReference","frameOfReference","frameOfReferenceAnnotations","getAnnotations","toolTypes","k","uidIndex","findIndex","actions","downloadReport","_ref2","srDataset","generateReport","reportBlob","dcmjs","datasetToBlob","objectUrl","URL","createObjectURL","window","location","storeMeasurements","async","_ref3","info","store","dicom","error","Promise","reject","naturalizedReport","getFilteredCornerstoneToolState","report","dataset","SpecificCharacterSet","_generateReport","deleteStudyMetadataPromise","DicomMetadataStore","definitions","commandFn","storeContexts","defaultContext","addToolInstance","toolClass","InstanceClass","addTool","findInstance","sopUid","referencedDisplaySet","getDisplaySetByUID","findReferencedInstances","instanceById","createReferencedImageDisplaySet","imageSet","setAttributes","SeriesTime","isMultiFrame","numImageFrames","isReconstructable","isCompositeStack","madeInClient","excludeFromThumbnailBrowser","updateInstances","addDisplaySets","Component","React","OHIFCornerstoneSRViewport","props","fallback","onModeEnter","getDisplaySetCache","values","ds","preRegistration","LengthTool","BidirectionalTool","EllipticalROITool","CircleROITool","ArrowAnnotateTool","AngleTool","CobbAngleTool","PlanarFreehandROITool","dashedLine","setToolGroupToolStyles","global","getViewportModule","component","_extends","getCommandsModule","getSopClassHandlerModule","getUtilityModule","exports","state","trackingIdentifiersByViewportId","setTrackingUniqueIdentifiersForElement","getEnabledElement","locking","CsAnnotation","convertCode","codingValues","code","text","convertSites","sites","ret","site","hydrateStructuredReport","appConfig","disableEditing","getActiveDataSource","customizationService","getCustomization","getInstance","sopInstanceUIDToImageId","imageIdsForToolState","datasetToUse","REPORT","GROUP","TRACKING_IDENTIFIER","imagingMeasurementContent","toArray","codeMeaningEquals","measurementGroups","cornerstoneToolClasses","registeredToolClasses","measurementGroup","TrackingIdentifierGroup","contentItem","_mapLegacyDataSet","storedMeasurementByAnnotationType","generateToolState","hydratableMeasurementsInSR","imageIds","targetStudyInstanceUID","sopInstanceUid","SeriesInstanceUIDs","source","getSource","freeTextLabel","fs","getLabelFromDCMJSImportedToolData","matchingMapping","newAnnotationUID","addRawMeasurement","toMeasurementSchema","addedAnnotation","getAnnotation","setAnnotationLocked","codeMeaningName"],"sourceRoot":""} \ No newline at end of file diff --git a/resources/686.bundle.9b93df830edb822372a0.js b/resources/686.bundle.9b93df830edb822372a0.js new file mode 100644 index 0000000..a991bac --- /dev/null +++ b/resources/686.bundle.9b93df830edb822372a0.js @@ -0,0 +1,2 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[686],{39686:(e,t,r)=>{r.r(t),r.d(t,{default:()=>a});var o=r(43001),s=r(3827),l=r.n(s);function n(e){let{displaySets:t}=e;if(t&&t.length>1)throw new Error("OHIFCornerstoneVideoViewport: only one display set is supported for dicom video right now");const{videoUrl:r}=t[0],s="video/mp4",[l,n]=(0,o.useState)(null);return(0,o.useEffect)((()=>{(async()=>{n(await r)})()}),[r]),o.createElement("div",{className:"bg-primary-black h-full w-full"},o.createElement("video",{src:l,controls:!0,controlsList:"nodownload",preload:"auto",className:"h-full w-full",crossOrigin:"anonymous"},o.createElement("source",{src:l,type:s}),o.createElement("source",{src:l,type:s}),"Video src/type not supported:"," ",o.createElement("a",{href:l},l," of type ",s)))}n.propTypes={displaySets:l().arrayOf(l().object).isRequired};const a=n}}]); +//# sourceMappingURL=686.bundle.9b93df830edb822372a0.js.map \ No newline at end of file diff --git a/resources/686.bundle.9b93df830edb822372a0.js.map b/resources/686.bundle.9b93df830edb822372a0.js.map new file mode 100644 index 0000000..ed9af21 --- /dev/null +++ b/resources/686.bundle.9b93df830edb822372a0.js.map @@ -0,0 +1 @@ +{"version":3,"file":"686.bundle.9b93df830edb822372a0.js","mappings":"oJAGA,SAASA,EAA4BC,GAAkB,IAAjB,YAAEC,GAAaD,EACnD,GAAIC,GAAeA,EAAYC,OAAS,EACtC,MAAM,IAAIC,MACR,6FAIJ,MAAM,SAAEC,GAAaH,EAAY,GAC3BI,EAAW,aACVC,EAAKC,IAAUC,EAAAA,EAAAA,UAAS,MAW/B,OATAC,EAAAA,EAAAA,YAAU,KACKC,WACXH,QAAaH,EAAS,EAGxBO,EAAM,GACL,CAACP,IAIFQ,EAAAA,cAAA,OAAKC,UAAU,kCACbD,EAAAA,cAAA,SACEE,IAAKR,EACLS,UAAQ,EACRC,aAAa,aACbC,QAAQ,OACRJ,UAAU,gBACVK,YAAY,aAEZN,EAAAA,cAAA,UACEE,IAAKR,EACLa,KAAMd,IAERO,EAAAA,cAAA,UACEE,IAAKR,EACLa,KAAMd,IACN,gCAC4B,IAC9BO,EAAAA,cAAA,KAAGQ,KAAMd,GACNA,EAAI,YAAUD,IAKzB,CAEAN,EAA6BsB,UAAY,CACvCpB,YAAaqB,IAAAA,QAAkBA,IAAAA,QAAkBC,YAGnD,S","sources":["webpack:///../../../extensions/dicom-video/src/viewports/OHIFCornerstoneVideoViewport.tsx"],"sourcesContent":["import React, { useEffect, useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nfunction OHIFCornerstoneVideoViewport({ displaySets }) {\r\n if (displaySets && displaySets.length > 1) {\r\n throw new Error(\r\n 'OHIFCornerstoneVideoViewport: only one display set is supported for dicom video right now'\r\n );\r\n }\r\n\r\n const { videoUrl } = displaySets[0];\r\n const mimeType = 'video/mp4';\r\n const [url, setUrl] = useState(null);\r\n\r\n useEffect(() => {\r\n const load = async () => {\r\n setUrl(await videoUrl);\r\n };\r\n\r\n load();\r\n }, [videoUrl]);\r\n\r\n // Need to copies of the source to fix a firefox bug\r\n return (\r\n
\r\n \r\n \r\n \r\n Video src/type not supported:{' '}\r\n \r\n {url} of type {mimeType}\r\n \r\n \r\n
\r\n );\r\n}\r\n\r\nOHIFCornerstoneVideoViewport.propTypes = {\r\n displaySets: PropTypes.arrayOf(PropTypes.object).isRequired,\r\n};\r\n\r\nexport default OHIFCornerstoneVideoViewport;\r\n"],"names":["OHIFCornerstoneVideoViewport","_ref","displaySets","length","Error","videoUrl","mimeType","url","setUrl","useState","useEffect","async","load","React","className","src","controls","controlsList","preload","crossOrigin","type","href","propTypes","PropTypes","isRequired"],"sourceRoot":""} \ No newline at end of file diff --git a/resources/687.bundle.fcd0488536d96bb682e5.js b/resources/687.bundle.fcd0488536d96bb682e5.js new file mode 100644 index 0000000..5805404 --- /dev/null +++ b/resources/687.bundle.fcd0488536d96bb682e5.js @@ -0,0 +1,2 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[687],{78687:(e,t,o)=>{o.r(t),o.d(t,{default:()=>b});const i=JSON.parse('{"u2":"@ohif/extension-test"}').u2,a={viewportOptions:{viewportId:"viewportA",toolGroupId:"default",allowUnmatchedView:!0},displaySets:[{id:"defaultDisplaySetId"}]},n={viewportOptions:{viewportId:"viewportB",toolGroupId:"default",allowUnmatchedView:!0},displaySets:[{matchedDisplaySetsIndex:1,id:"defaultDisplaySetId"}]},s={viewportOptions:{viewportId:"viewportC",toolGroupId:"default",allowUnmatchedView:!0},displaySets:[{matchedDisplaySetsIndex:2,id:"defaultDisplaySetId"}]},d={viewportOptions:{viewportId:"viewportD",toolGroupId:"default",allowUnmatchedView:!0},displaySets:[{matchedDisplaySetsIndex:3,id:"defaultDisplaySetId"}]},r={viewportOptions:{viewportId:"viewportA",toolGroupId:"default",allowUnmatchedView:!0},displaySets:[{matchedDisplaySetsIndex:3,id:"defaultDisplaySetId"}]},l={viewportOptions:{viewportId:"viewportB",toolGroupId:"default",allowUnmatchedView:!0},displaySets:[{matchedDisplaySetsIndex:2,id:"defaultDisplaySetId"}]},u={viewportOptions:{viewportId:"viewportC",toolGroupId:"default",allowUnmatchedView:!0},displaySets:[{matchedDisplaySetsIndex:1,id:"defaultDisplaySetId"}]},p={viewportOptions:{viewportId:"viewportD",toolGroupId:"default",allowUnmatchedView:!0},displaySets:[{matchedDisplaySetsIndex:0,id:"defaultDisplaySetId"}]},c={layoutType:"grid",properties:{rows:2,columns:2}},m={hasUpdatedPriorsInformation:!1,id:"@ohif/mnTestSwitch",description:"Has various hanging protocol grid layouts",name:"Test Switch",protocolMatchingRules:[{id:"OneOrMoreSeries",weight:25,attribute:"numberOfDisplaySetsWithImages",constraint:{greaterThan:0}}],toolGroupIds:["default"],displaySetSelectors:{defaultDisplaySetId:{seriesMatchingRules:[{attribute:"numImageFrames",constraint:{greaterThan:{value:0}}},{attribute:"isDisplaySetFromUrl",weight:10,constraint:{equals:!0}}]}},defaultViewport:{viewportOptions:{viewportType:"stack",toolGroupId:"default",allowUnmatchedView:!0},displaySets:[{id:"defaultDisplaySetId",matchedDisplaySetsIndex:-1}]},stages:[{name:"2x2 0a1b2c3d",viewportStructure:c,viewports:[a,n,s,d]},{name:"3x2 0a1b4e2c3d5f",viewportStructure:{layoutType:"grid",properties:{rows:2,columns:3}},viewports:[a,n,{viewportOptions:{viewportId:"viewportE",toolGroupId:"default",allowUnmatchedView:!0},displaySets:[{matchedDisplaySetsIndex:4,id:"defaultDisplaySetId"}]},s,d,{viewportOptions:{viewportId:"viewportF",toolGroupId:"default",allowUnmatchedView:!0},displaySets:[{matchedDisplaySetsIndex:5,id:"defaultDisplaySetId"}]}]},{name:"2x2 1c0d3a2b",viewportStructure:c,viewports:[u,p,r,l]},{name:"2x2 3a2b1c0d",viewportStructure:c,viewports:[r,l,u,p]}],numberOfPriorsReferenced:-1},S={id:"codingValues","SCT:69536005":{text:"Head",type:"site"},"SCT:45048000":{text:"Neck",type:"site"},"SCT:818981001":{text:"Abdomen",type:"site"},"SCT:816092008":{text:"Pelvis",type:"site"},"SCT:371861004":{text:"Mild intimal coronary irregularities",color:"green"},"SCT:194983005":{text:"Aortic insufficiency",color:"darkred"},"SCT:399232001":{text:"2-chamber"},"SCT:103340004":{text:"SAX"},"SCT:91134007":{text:"MV"},"SCT:122972007":{text:"PV"},"SCT:24422004":{text:"Axial",color:"#000000",type:"orientation"},"SCT:81654009":{text:"Coronal",color:"#000000",type:"orientation"},"SCT:30730003":{text:"Sagittal",color:"#000000",type:"orientation"}},y={id:"@ohif/contextMenuAnnotationCode",transform:function(e){const{code:t}=this;if(!t)throw new Error(`item ${this} has no code ref`);const o=e.get("codingValues")[t];return{...this,codeRef:t,code:{ref:t,...o},label:o.text,commands:[{commandName:"updateMeasurement"}]}}},w={id:"measurementsContextMenu",customizationType:"ohif.contextMenu",menus:[{id:"forExistingMeasurement",selector:e=>{let{nearbyToolData:t}=e;return!!t},items:[{customizationType:"ohif.contextSubMenu",label:"Site",actionType:"ShowSubMenu",subMenu:"siteSelectionSubMenu"},{customizationType:"ohif.contextSubMenu",label:"Finding",actionType:"ShowSubMenu",subMenu:"findingSelectionSubMenu"},{label:"Delete Measurement",commands:[{commandName:"deleteMeasurement"}]},{label:"Add Label",commands:[{commandName:"setMeasurementLabel"}]},{label:"IncludeSubMenu",selector:e=>{let{protocol:t}=e;return"@ohif/mnGrid"===t?.id},delegating:!0,subMenu:"orientationSelectionSubMenu"}]},{id:"orientationSelectionSubMenu",selector:e=>{let{nearbyToolData:t}=e;return!1},items:[{customizationType:"@ohif/contextMenuAnnotationCode",code:"SCT:24422004"},{customizationType:"@ohif/contextMenuAnnotationCode",code:"SCT:81654009"}]},{id:"findingSelectionSubMenu",selector:e=>{let{nearbyToolData:t}=e;return!1},items:[{customizationType:"@ohif/contextMenuAnnotationCode",code:"SCT:371861004"},{customizationType:"@ohif/contextMenuAnnotationCode",code:"SCT:194983005"}]},{id:"siteSelectionSubMenu",selector:e=>{let{nearbyToolData:t}=e;return!!t},items:[{customizationType:"@ohif/contextMenuAnnotationCode",code:"SCT:69536005"},{customizationType:"@ohif/contextMenuAnnotationCode",code:"SCT:45048000"}]}]};function f(e,t){const{sameAttribute:o,sameDisplaySetId:i}=this;if(!o)return console.log("sameAttribute not defined in",this),`sameAttribute not defined in ${this.id}`;if(!i)return console.log("sameDisplaySetId not defined in",this),`sameDisplaySetId not defined in ${this.id}`;const{displaySetMatchDetails:a,displaySets:n}=t,s=a.get(i);if(!s)return console.log("No match for display set",i),!1;const{displaySetInstanceUID:d}=s,r=n.find((e=>e.displaySetInstanceUID==d));if(!r)return console.log("No display set found with",d,"in",n),!1;return r[o]===e[o]}const h=(e,t)=>t?.displaySets?.length,I=(e,t)=>Math.max(...t?.displaySets?.map?.((e=>e.numImageFrames??0))||[0]),b={id:i,preRegistration:e=>{let{servicesManager:t}=e;const{hangingProtocolService:o}=t.services;o.addCustomAttribute("numberOfDisplaySets","Number of displays sets",h),o.addCustomAttribute("maxNumImageFrames","Maximum of number of image frames",I),o.addCustomAttribute("sameAs","Match an attribute in an existing display set",f)},getCustomizationModule:function(){return[{name:"custom-context-menu",value:[S,y,w]}]},getHangingProtocolModule:()=>[{name:m.id,protocol:m}]}}}]); +//# sourceMappingURL=687.bundle.fcd0488536d96bb682e5.js.map \ No newline at end of file diff --git a/resources/687.bundle.fcd0488536d96bb682e5.js.map b/resources/687.bundle.fcd0488536d96bb682e5.js.map new file mode 100644 index 0000000..b96d457 --- /dev/null +++ b/resources/687.bundle.fcd0488536d96bb682e5.js.map @@ -0,0 +1 @@ +{"version":3,"file":"687.bundle.fcd0488536d96bb682e5.js","mappings":"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","sources":["webpack:///../../../extensions/test-extension/src/id.js","webpack:///../../../extensions/test-extension/src/hpTestSwitch.ts","webpack:///../../../extensions/test-extension/src/custom-context-menu/codingValues.ts","webpack:///../../../extensions/test-extension/src/custom-context-menu/contextMenuCodeItem.ts","webpack:///../../../extensions/test-extension/src/custom-context-menu/findingsContextMenu.ts","webpack:///../../../extensions/test-extension/src/custom-attribute/sameAs.ts","webpack:///../../../extensions/test-extension/src/custom-attribute/numberOfDisplaySets.ts","webpack:///../../../extensions/test-extension/src/custom-attribute/maxNumImageFrames.ts","webpack:///../../../extensions/test-extension/src/index.tsx","webpack:///../../../extensions/test-extension/src/getCustomizationModule.ts"],"sourcesContent":["import packageJson from '../package.json';\r\n\r\nconst id = packageJson.name;\r\n\r\nexport { id };\r\n","import { Types } from '@ohif/core';\r\n\r\nconst viewport0a = {\r\n viewportOptions: {\r\n viewportId: 'viewportA',\r\n toolGroupId: 'default',\r\n allowUnmatchedView: true,\r\n },\r\n displaySets: [\r\n {\r\n id: 'defaultDisplaySetId',\r\n },\r\n ],\r\n};\r\n\r\nconst viewport1b = {\r\n viewportOptions: {\r\n viewportId: 'viewportB',\r\n toolGroupId: 'default',\r\n allowUnmatchedView: true,\r\n },\r\n displaySets: [\r\n {\r\n matchedDisplaySetsIndex: 1,\r\n id: 'defaultDisplaySetId',\r\n },\r\n ],\r\n};\r\n\r\nconst viewport2c = {\r\n viewportOptions: {\r\n viewportId: 'viewportC',\r\n toolGroupId: 'default',\r\n allowUnmatchedView: true,\r\n },\r\n displaySets: [\r\n {\r\n matchedDisplaySetsIndex: 2,\r\n id: 'defaultDisplaySetId',\r\n },\r\n ],\r\n};\r\n\r\nconst viewport3d = {\r\n viewportOptions: {\r\n viewportId: 'viewportD',\r\n toolGroupId: 'default',\r\n allowUnmatchedView: true,\r\n },\r\n displaySets: [\r\n {\r\n matchedDisplaySetsIndex: 3,\r\n id: 'defaultDisplaySetId',\r\n },\r\n ],\r\n};\r\n\r\nconst viewport4e = {\r\n viewportOptions: {\r\n viewportId: 'viewportE',\r\n toolGroupId: 'default',\r\n allowUnmatchedView: true,\r\n },\r\n displaySets: [\r\n {\r\n matchedDisplaySetsIndex: 4,\r\n id: 'defaultDisplaySetId',\r\n },\r\n ],\r\n};\r\n\r\nconst viewport5f = {\r\n viewportOptions: {\r\n viewportId: 'viewportF',\r\n toolGroupId: 'default',\r\n allowUnmatchedView: true,\r\n },\r\n displaySets: [\r\n {\r\n matchedDisplaySetsIndex: 5,\r\n id: 'defaultDisplaySetId',\r\n },\r\n ],\r\n};\r\n\r\nconst viewport3a = {\r\n viewportOptions: {\r\n viewportId: 'viewportA',\r\n toolGroupId: 'default',\r\n allowUnmatchedView: true,\r\n },\r\n displaySets: [\r\n {\r\n matchedDisplaySetsIndex: 3,\r\n id: 'defaultDisplaySetId',\r\n },\r\n ],\r\n};\r\n\r\nconst viewport2b = {\r\n viewportOptions: {\r\n viewportId: 'viewportB',\r\n toolGroupId: 'default',\r\n allowUnmatchedView: true,\r\n },\r\n displaySets: [\r\n {\r\n matchedDisplaySetsIndex: 2,\r\n id: 'defaultDisplaySetId',\r\n },\r\n ],\r\n};\r\n\r\nconst viewport1c = {\r\n viewportOptions: {\r\n viewportId: 'viewportC',\r\n toolGroupId: 'default',\r\n allowUnmatchedView: true,\r\n },\r\n displaySets: [\r\n {\r\n matchedDisplaySetsIndex: 1,\r\n id: 'defaultDisplaySetId',\r\n },\r\n ],\r\n};\r\nconst viewport0d = {\r\n viewportOptions: {\r\n viewportId: 'viewportD',\r\n toolGroupId: 'default',\r\n allowUnmatchedView: true,\r\n },\r\n displaySets: [\r\n {\r\n matchedDisplaySetsIndex: 0,\r\n id: 'defaultDisplaySetId',\r\n },\r\n ],\r\n};\r\n\r\nconst viewportStructure = {\r\n layoutType: 'grid',\r\n properties: {\r\n rows: 2,\r\n columns: 2,\r\n },\r\n};\r\n\r\nconst viewportStructure32 = {\r\n layoutType: 'grid',\r\n properties: {\r\n rows: 2,\r\n columns: 3,\r\n },\r\n};\r\n\r\n/**\r\n * This hanging protocol is a test hanging protocol used to apply various\r\n * layouts in different positions for display, re-using earlier names in\r\n * various orders.\r\n */\r\nconst hpTestSwitch: Types.HangingProtocol.Protocol = {\r\n hasUpdatedPriorsInformation: false,\r\n id: '@ohif/mnTestSwitch',\r\n description: 'Has various hanging protocol grid layouts',\r\n name: 'Test Switch',\r\n protocolMatchingRules: [\r\n {\r\n id: 'OneOrMoreSeries',\r\n weight: 25,\r\n attribute: 'numberOfDisplaySetsWithImages',\r\n constraint: {\r\n greaterThan: 0,\r\n },\r\n },\r\n ],\r\n toolGroupIds: ['default'],\r\n displaySetSelectors: {\r\n defaultDisplaySetId: {\r\n seriesMatchingRules: [\r\n {\r\n attribute: 'numImageFrames',\r\n constraint: {\r\n greaterThan: { value: 0 },\r\n },\r\n },\r\n // This display set will select the specified items by preference\r\n // It has no affect if nothing is specified in the URL.\r\n {\r\n attribute: 'isDisplaySetFromUrl',\r\n weight: 10,\r\n constraint: {\r\n equals: true,\r\n },\r\n },\r\n ],\r\n },\r\n },\r\n defaultViewport: {\r\n viewportOptions: {\r\n viewportType: 'stack',\r\n toolGroupId: 'default',\r\n allowUnmatchedView: true,\r\n },\r\n displaySets: [\r\n {\r\n id: 'defaultDisplaySetId',\r\n matchedDisplaySetsIndex: -1,\r\n },\r\n ],\r\n },\r\n stages: [\r\n {\r\n name: '2x2 0a1b2c3d',\r\n viewportStructure,\r\n viewports: [viewport0a, viewport1b, viewport2c, viewport3d],\r\n },\r\n {\r\n name: '3x2 0a1b4e2c3d5f',\r\n viewportStructure: viewportStructure32,\r\n // Note the following structure simply preserves the viewportId for\r\n // a given screen position\r\n viewports: [viewport0a, viewport1b, viewport4e, viewport2c, viewport3d, viewport5f],\r\n },\r\n {\r\n name: '2x2 1c0d3a2b',\r\n viewportStructure,\r\n viewports: [viewport1c, viewport0d, viewport3a, viewport2b],\r\n },\r\n {\r\n name: '2x2 3a2b1c0d',\r\n viewportStructure,\r\n viewports: [viewport3a, viewport2b, viewport1c, viewport0d],\r\n },\r\n ],\r\n numberOfPriorsReferenced: -1,\r\n};\r\n\r\nexport default hpTestSwitch;\r\n","/**\r\n * Coding values is a map of simple string coding values to a set of\r\n * attributes associated with the coding value.\r\n *\r\n * The simple string is in the format `:`\r\n * That allows extracting the DICOM attributes from the designator/value, and\r\n * allows for passing around the simple string.\r\n * The additional attributes contained in the object include:\r\n * * text - this is the coding scheme text display value, and may be language specific\r\n * * type - this defines a named type, typically 'site'. Different names can be used\r\n * to allow setting different findingSites values in order to define a hierarchy.\r\n * * color - used to apply annotation color\r\n * It is also possible to define additional attributes here, used by custom\r\n * extensions.\r\n *\r\n * See https://dicom.nema.org/medical/dicom/current/output/html/part16.html\r\n * for definitions of SCT and other code values.\r\n */\r\nconst codingValues = {\r\n id: 'codingValues',\r\n\r\n // Sites\r\n 'SCT:69536005': {\r\n text: 'Head',\r\n type: 'site',\r\n },\r\n 'SCT:45048000': {\r\n text: 'Neck',\r\n type: 'site',\r\n },\r\n 'SCT:818981001': {\r\n text: 'Abdomen',\r\n type: 'site',\r\n },\r\n 'SCT:816092008': {\r\n text: 'Pelvis',\r\n type: 'site',\r\n },\r\n\r\n // Findings\r\n 'SCT:371861004': {\r\n text: 'Mild intimal coronary irregularities',\r\n color: 'green',\r\n },\r\n 'SCT:194983005': {\r\n text: 'Aortic insufficiency',\r\n color: 'darkred',\r\n },\r\n 'SCT:399232001': {\r\n text: '2-chamber',\r\n },\r\n 'SCT:103340004': {\r\n text: 'SAX',\r\n },\r\n 'SCT:91134007': {\r\n text: 'MV',\r\n },\r\n 'SCT:122972007': {\r\n text: 'PV',\r\n },\r\n\r\n // Orientations\r\n 'SCT:24422004': {\r\n text: 'Axial',\r\n color: '#000000',\r\n type: 'orientation',\r\n },\r\n 'SCT:81654009': {\r\n text: 'Coronal',\r\n color: '#000000',\r\n type: 'orientation',\r\n },\r\n 'SCT:30730003': {\r\n text: 'Sagittal',\r\n color: '#000000',\r\n type: 'orientation',\r\n },\r\n};\r\n\r\nexport default codingValues;\r\n","const codeMenuItem = {\r\n id: '@ohif/contextMenuAnnotationCode',\r\n\r\n /** Applies the code value setup for this item */\r\n transform: function (customizationService) {\r\n const { code: codeRef } = this;\r\n if (!codeRef) {\r\n throw new Error(`item ${this} has no code ref`);\r\n }\r\n const codingValues = customizationService.get('codingValues');\r\n const code = codingValues[codeRef];\r\n return {\r\n ...this,\r\n codeRef,\r\n code: { ref: codeRef, ...code },\r\n label: code.text,\r\n commands: [\r\n {\r\n commandName: 'updateMeasurement',\r\n },\r\n ],\r\n };\r\n },\r\n};\r\n\r\nexport default codeMenuItem;\r\n","const findingsContextMenu = {\r\n id: 'measurementsContextMenu',\r\n customizationType: 'ohif.contextMenu',\r\n menus: [\r\n {\r\n id: 'forExistingMeasurement',\r\n // selector restricts context menu to when there is nearbyToolData\r\n selector: ({ nearbyToolData }) => !!nearbyToolData,\r\n items: [\r\n {\r\n customizationType: 'ohif.contextSubMenu',\r\n label: 'Site',\r\n actionType: 'ShowSubMenu',\r\n subMenu: 'siteSelectionSubMenu',\r\n },\r\n {\r\n customizationType: 'ohif.contextSubMenu',\r\n label: 'Finding',\r\n actionType: 'ShowSubMenu',\r\n subMenu: 'findingSelectionSubMenu',\r\n },\r\n {\r\n // customizationType is implicit here in the configuration setup\r\n label: 'Delete Measurement',\r\n commands: [\r\n {\r\n commandName: 'deleteMeasurement',\r\n },\r\n ],\r\n },\r\n {\r\n label: 'Add Label',\r\n commands: [\r\n {\r\n commandName: 'setMeasurementLabel',\r\n },\r\n ],\r\n },\r\n\r\n // The example below shows how to include a delegating sub-menu,\r\n // Only available on the @ohif/mnGrid hanging protocol\r\n // To demonstrate, select the 3x1 layout from the protocol menu\r\n // and right click on a measurement.\r\n {\r\n label: 'IncludeSubMenu',\r\n selector: ({ protocol }) => protocol?.id === '@ohif/mnGrid',\r\n delegating: true,\r\n subMenu: 'orientationSelectionSubMenu',\r\n },\r\n ],\r\n },\r\n\r\n {\r\n id: 'orientationSelectionSubMenu',\r\n selector: ({ nearbyToolData }) => false,\r\n items: [\r\n {\r\n customizationType: '@ohif/contextMenuAnnotationCode',\r\n code: 'SCT:24422004',\r\n },\r\n {\r\n customizationType: '@ohif/contextMenuAnnotationCode',\r\n code: 'SCT:81654009',\r\n },\r\n ],\r\n },\r\n\r\n {\r\n id: 'findingSelectionSubMenu',\r\n selector: ({ nearbyToolData }) => false,\r\n items: [\r\n {\r\n customizationType: '@ohif/contextMenuAnnotationCode',\r\n code: 'SCT:371861004',\r\n },\r\n {\r\n customizationType: '@ohif/contextMenuAnnotationCode',\r\n code: 'SCT:194983005',\r\n },\r\n ],\r\n },\r\n\r\n {\r\n id: 'siteSelectionSubMenu',\r\n selector: ({ nearbyToolData }) => !!nearbyToolData,\r\n items: [\r\n {\r\n customizationType: '@ohif/contextMenuAnnotationCode',\r\n code: 'SCT:69536005',\r\n },\r\n {\r\n customizationType: '@ohif/contextMenuAnnotationCode',\r\n code: 'SCT:45048000',\r\n },\r\n ],\r\n },\r\n ],\r\n};\r\n\r\nexport default findingsContextMenu;\r\n","/**\r\n * This function extracts an attribute from the already matched display sets, and\r\n * compares it to the attribute in the current display set, and indicates if they match.\r\n * From 'this', it uses:\r\n * `sameAttribute` as the attribute name to look for\r\n * `sameDisplaySetId` as the display set id to look for\r\n * From `options`, it looks for\r\n */\r\nexport default function (displaySet, options) {\r\n const { sameAttribute, sameDisplaySetId } = this;\r\n if (!sameAttribute) {\r\n console.log('sameAttribute not defined in', this);\r\n return `sameAttribute not defined in ${this.id}`;\r\n }\r\n if (!sameDisplaySetId) {\r\n console.log('sameDisplaySetId not defined in', this);\r\n return `sameDisplaySetId not defined in ${this.id}`;\r\n }\r\n const { displaySetMatchDetails, displaySets } = options;\r\n const match = displaySetMatchDetails.get(sameDisplaySetId);\r\n if (!match) {\r\n console.log('No match for display set', sameDisplaySetId);\r\n return false;\r\n }\r\n const { displaySetInstanceUID } = match;\r\n const altDisplaySet = displaySets.find(it => it.displaySetInstanceUID == displaySetInstanceUID);\r\n if (!altDisplaySet) {\r\n console.log('No display set found with', displaySetInstanceUID, 'in', displaySets);\r\n return false;\r\n }\r\n const testValue = altDisplaySet[sameAttribute];\r\n return testValue === displaySet[sameAttribute];\r\n}\r\n","export default (study, extraData) => extraData?.displaySets?.length;\r\n","export default (study, extraData) =>\r\n Math.max(...(extraData?.displaySets?.map?.(ds => ds.numImageFrames ?? 0) || [0]));\r\n","import { Types } from '@ohif/core';\r\n\r\nimport { id } from './id';\r\n\r\nimport hpTestSwitch from './hpTestSwitch';\r\n\r\nimport getCustomizationModule from './getCustomizationModule';\r\n// import {setViewportZoomPan, storeViewportZoomPan } from './custom-viewport/setViewportZoomPan';\r\nimport sameAs from './custom-attribute/sameAs';\r\nimport numberOfDisplaySets from './custom-attribute/numberOfDisplaySets';\r\nimport maxNumImageFrames from './custom-attribute/maxNumImageFrames';\r\n\r\n/**\r\n * The test extension provides additional behaviour for testing various\r\n * customizations and settings for OHIF.\r\n */\r\nconst testExtension: Types.Extensions.Extension = {\r\n /**\r\n * Only required property. Should be a unique value across all extensions.\r\n */\r\n id,\r\n\r\n /** Register additional behaviour:\r\n * * HP custom attribute seriesDescriptions to retrieve an array of all series descriptions\r\n * * HP custom attribute numberOfDisplaySets to retrieve the number of display sets\r\n * * HP custom attribute numberOfDisplaySetsWithImages to retrieve the number of display sets containing images\r\n * * HP custom attribute to return a boolean true, when the attribute sameAttribute has the same\r\n * value as another series description in an already matched display set selector named with the value\r\n * in `sameDisplaySetId`\r\n */\r\n preRegistration: ({ servicesManager }: Types.Extensions.ExtensionParams) => {\r\n const { hangingProtocolService } = servicesManager.services;\r\n hangingProtocolService.addCustomAttribute(\r\n 'numberOfDisplaySets',\r\n 'Number of displays sets',\r\n numberOfDisplaySets\r\n );\r\n hangingProtocolService.addCustomAttribute(\r\n 'maxNumImageFrames',\r\n 'Maximum of number of image frames',\r\n maxNumImageFrames\r\n );\r\n hangingProtocolService.addCustomAttribute(\r\n 'sameAs',\r\n 'Match an attribute in an existing display set',\r\n sameAs\r\n );\r\n },\r\n\r\n /** Registers some customizations */\r\n getCustomizationModule,\r\n\r\n getHangingProtocolModule: () => {\r\n return [\r\n // Create a MxN hanging protocol available by default\r\n {\r\n name: hpTestSwitch.id,\r\n protocol: hpTestSwitch,\r\n },\r\n ];\r\n },\r\n};\r\n\r\nexport default testExtension;\r\n","import { codingValues, contextMenuCodeItem, findingsContextMenu } from './custom-context-menu';\r\n\r\nexport default function getCustomizationModule() {\r\n return [\r\n {\r\n name: 'custom-context-menu',\r\n value: [codingValues, contextMenuCodeItem, findingsContextMenu],\r\n },\r\n ];\r\n}\r\n"],"names":["id","packageJson","viewport0a","viewportOptions","viewportId","toolGroupId","allowUnmatchedView","displaySets","viewport1b","matchedDisplaySetsIndex","viewport2c","viewport3d","viewport3a","viewport2b","viewport1c","viewport0d","viewportStructure","layoutType","properties","rows","columns","hasUpdatedPriorsInformation","description","name","protocolMatchingRules","weight","attribute","constraint","greaterThan","toolGroupIds","displaySetSelectors","defaultDisplaySetId","seriesMatchingRules","value","equals","defaultViewport","viewportType","stages","viewports","numberOfPriorsReferenced","text","type","color","transform","customizationService","code","codeRef","this","Error","get","ref","label","commands","commandName","customizationType","menus","selector","_ref","nearbyToolData","items","actionType","subMenu","_ref2","protocol","delegating","_ref3","_ref4","_ref5","displaySet","options","sameAttribute","sameDisplaySetId","console","log","displaySetMatchDetails","match","displaySetInstanceUID","altDisplaySet","find","it","study","extraData","length","Math","max","map","ds","numImageFrames","preRegistration","servicesManager","hangingProtocolService","services","addCustomAttribute","numberOfDisplaySets","maxNumImageFrames","sameAs","getCustomizationModule","codingValues","contextMenuCodeItem","findingsContextMenu","getHangingProtocolModule","hpTestSwitch"],"sourceRoot":""} \ No newline at end of file diff --git a/resources/743.bundle.58a76ef98d0f4120f602.js b/resources/743.bundle.58a76ef98d0f4120f602.js new file mode 100644 index 0000000..cd92647 --- /dev/null +++ b/resources/743.bundle.58a76ef98d0f4120f602.js @@ -0,0 +1,3 @@ +/*! For license information please see 743.bundle.58a76ef98d0f4120f602.js.LICENSE.txt */ +(self.webpackChunk=self.webpackChunk||[]).push([[743],{3743:(e,t,r)=>{"use strict";r.r(t),r.d(t,{BaseVolumeViewport:()=>Pf,CONSTANTS:()=>a,EVENTS:()=>g,Enums:()=>n,ImageVolume:()=>Fc,RenderingEngine:()=>ip,Settings:()=>pp,StackViewport:()=>tp,Viewport:()=>Sf,VolumeViewport:()=>wf,VolumeViewport3D:()=>rp,addVolumesToViewports:()=>Tf,cache:()=>qd,createVolumeActor:()=>yf,createVolumeMapper:()=>gf,eventTarget:()=>J,geometryLoader:()=>p,getConfiguration:()=>Qe,getEnabledElement:()=>_d,getEnabledElementByIds:()=>Nd,getEnabledElements:()=>Bd,getOrCreateCanvas:()=>Cu,getRenderingEngine:()=>Le,getRenderingEngines:()=>_e,getShouldUseCPURendering:()=>Ze,getShouldUseSharedArrayBuffer:()=>Ye,imageLoadPoolManager:()=>iu,imageLoader:()=>s,imageRetrievalPoolManager:()=>lp,init:()=>ze,isCornerstoneInitialized:()=>$e,metaData:()=>o,registerImageLoader:()=>hu,requestPoolManager:()=>iu,resetUseCPURendering:()=>Ke,resetUseSharedArrayBuffer:()=>qe,setConfiguration:()=>Je,setPreferSizeOverAccuracy:()=>He,setUseCPURendering:()=>je,setUseSharedArrayBuffer:()=>Xe,setVolumesForViewports:()=>bf,triggerEvent:()=>se,utilities:()=>d,volumeLoader:()=>i});var n={};r.r(n),r.d(n,{BlendModes:()=>w,CalibrationTypes:()=>U,ContourType:()=>V,DynamicOperatorType:()=>B,Events:()=>g,GeometryType:()=>M,InterpolationType:()=>T,OrientationAxis:()=>I,RequestType:()=>h,SharedArrayBufferModes:()=>R,VOILUTFunctionType:()=>_,ViewportStatus:()=>G,ViewportType:()=>y});var a={};r.r(a),r.d(a,{CPU_COLORMAPS:()=>W,EPSILON:()=>H,MPR_CAMERA_VALUES:()=>Z,RENDERING_DEFAULTS:()=>j,VIEWPORT_PRESETS:()=>X});var o={};r.r(o),r.d(o,{addProvider:()=>st,get:()=>ut,removeAllProviders:()=>ct,removeProvider:()=>lt});var i={};r.r(i),r.d(i,{createAndCacheDerivedVolume:()=>Hc,createAndCacheVolume:()=>jc,createLocalVolume:()=>Kc,getVolumeLoaderSchemes:()=>Xc,loadVolume:()=>zc,registerUnknownVolumeLoader:()=>qc,registerVolumeLoader:()=>Zc});var s={};r.r(s),r.d(s,{cancelLoadAll:()=>mu,cancelLoadImage:()=>pu,cancelLoadImages:()=>gu,loadAndCacheImage:()=>du,loadAndCacheImages:()=>fu,loadImage:()=>uu,registerImageLoader:()=>hu,registerUnknownImageLoader:()=>vu,unregisterAllImageLoaders:()=>yu});var l={};r.r(l),r.d(l,{linePlaneIntersection:()=>Ud,planeDistanceToPoint:()=>Wd,planeEquation:()=>kd,threePlaneIntersection:()=>Gd});var c={};r.r(c),r.d(c,{toLowHighRange:()=>jd,toWindowLevel:()=>zd});var u={};r.r(u),r.d(u,{getColormap:()=>Zd,getColormapNames:()=>Xd,registerColormap:()=>Kd});var d={};r.r(d),r.d(d,{actorIsA:()=>vd,applyPreset:()=>Id,calculateViewportsSpatialRegistration:()=>Sd,calibratedPixelSpacingMetadataProvider:()=>ve,colormap:()=>u,createFloat32SharedArray:()=>rt,createInt16SharedArray:()=>at,createLinearRGBTransferFunction:()=>oe,createSigmoidRGBTransferFunction:()=>ne,createUint16SharedArray:()=>nt,createUint8SharedArray:()=>tt,deepMerge:()=>Dd,getClosestImageId:()=>ft,getClosestStackImageIndexForPoint:()=>bd,getImageLegacy:()=>Fd,getImageSliceDataForVolumeViewport:()=>md,getMinMax:()=>ce,getRuntimeId:()=>ge,getScalarDataType:()=>Ld,getScalingParameters:()=>Vd,getSliceRange:()=>dd,getSpacingInNormalDirection:()=>dt,getTargetVolumeAndSpacingInNormalDir:()=>Qc,getViewportImageCornersInWorld:()=>Pd,getViewportsWithImageURI:()=>yd,getViewportsWithVolumeId:()=>ru,getVoiFromSigmoidRGBTransferFunction:()=>ae,getVolumeActorCorners:()=>Jc,getVolumeSliceRangeInfo:()=>fd,getVolumeViewportScrollInfo:()=>pd,getVolumeViewportsContainingSameVolumes:()=>tu,hasNaNValues:()=>Od,imageIdToURI:()=>me,imageToWorldCoords:()=>od,indexWithinDimensions:()=>eu,invertRgbTransferFunction:()=>ee,isEqual:()=>Ce,isImageActor:()=>hd,isOpposite:()=>xe,isPTPrescaledWithSUV:()=>xu,loadImageToCanvas:()=>nd,planar:()=>l,renderToCanvasCPU:()=>rd,renderToCanvasGPU:()=>Su,scaleRgbTransferFunction:()=>ie,snapFocalPointToSlice:()=>gd,spatialRegistrationMetadataProvider:()=>xd,transformWorldToIndex:()=>nu,triggerEvent:()=>se,uuidv4:()=>le,windowLevel:()=>c,worldToImageCoords:()=>ad});var f,p={};r.r(p),r.d(p,{createAndCacheGeometry:()=>$v}),function(e){e.CACHE_SIZE_EXCEEDED="CACHE_SIZE_EXCEEDED",e.IMAGE_LOAD_ERROR="IMAGE_LOAD_ERROR",e.CAMERA_MODIFIED="CORNERSTONE_CAMERA_MODIFIED",e.CAMERA_RESET="CORNERSTONE_CAMERA_RESET",e.VOI_MODIFIED="CORNERSTONE_VOI_MODIFIED",e.DISPLAY_AREA_MODIFIED="CORNERSTONE_DISPLAY_AREA_MODIFIED",e.ELEMENT_DISABLED="CORNERSTONE_ELEMENT_DISABLED",e.ELEMENT_ENABLED="CORNERSTONE_ELEMENT_ENABLED",e.IMAGE_RENDERED="CORNERSTONE_IMAGE_RENDERED",e.IMAGE_VOLUME_MODIFIED="CORNERSTONE_IMAGE_VOLUME_MODIFIED",e.IMAGE_VOLUME_LOADING_COMPLETED="CORNERSTONE_IMAGE_VOLUME_LOADING_COMPLETED",e.IMAGE_LOADED="CORNERSTONE_IMAGE_LOADED",e.IMAGE_LOAD_FAILED="CORNERSTONE_IMAGE_LOAD_FAILED",e.VOLUME_VIEWPORT_NEW_VOLUME="CORNERSTONE_VOLUME_VIEWPORT_NEW_VOLUME",e.VOLUME_LOADED="CORNERSTONE_VOLUME_LOADED",e.VOLUME_LOADED_FAILED="CORNERSTONE_VOLUME_LOADED_FAILED",e.IMAGE_CACHE_IMAGE_ADDED="CORNERSTONE_IMAGE_CACHE_IMAGE_ADDED",e.IMAGE_CACHE_IMAGE_REMOVED="CORNERSTONE_IMAGE_CACHE_IMAGE_REMOVED",e.VOLUME_CACHE_VOLUME_ADDED="CORNERSTONE_VOLUME_CACHE_VOLUME_ADDED",e.VOLUME_CACHE_VOLUME_REMOVED="CORNERSTONE_VOLUME_CACHE_VOLUME_REMOVED",e.STACK_NEW_IMAGE="CORNERSTONE_STACK_NEW_IMAGE",e.VOLUME_NEW_IMAGE="CORNERSTONE_VOLUME_NEW_IMAGE",e.PRE_STACK_NEW_IMAGE="CORNERSTONE_PRE_STACK_NEW_IMAGE",e.IMAGE_SPACING_CALIBRATED="CORNERSTONE_IMAGE_SPACING_CALIBRATED",e.IMAGE_LOAD_PROGRESS="CORNERSTONE_IMAGE_LOAD_PROGRESS",e.STACK_VIEWPORT_NEW_STACK="CORNERSTONE_STACK_VIEWPORT_NEW_STACK",e.STACK_VIEWPORT_SCROLL="CORNERSTONE_STACK_VIEWPORT_SCROLL",e.GEOMETRY_CACHE_GEOMETRY_ADDED="CORNERSTONE_GEOMETRY_CACHE_GEOMETRY_ADDED",e.VOLUME_SCROLL_OUT_OF_BOUNDS="CORNERSTONE_VOLUME_SCROLL_OUT_OF_BOUNDS"}(f||(f={}));const g=f;var m;!function(e){e.Interaction="interaction",e.Thumbnail="thumbnail",e.Prefetch="prefetch"}(m||(m={}));const h=m;var v;!function(e){e.STACK="stack",e.ORTHOGRAPHIC="orthographic",e.PERSPECTIVE="perspective",e.VOLUME_3D="volume3d"}(v||(v={}));const y=v;var b;!function(e){e[e.NEAREST=0]="NEAREST",e[e.LINEAR=1]="LINEAR",e[e.FAST_LINEAR=2]="FAST_LINEAR"}(b||(b={}));const T=b;var C={COMPOSITE_BLEND:0,MAXIMUM_INTENSITY_BLEND:1,MINIMUM_INTENSITY_BLEND:2,AVERAGE_INTENSITY_BLEND:3,ADDITIVE_INTENSITY_BLEND:4,RADON_TRANSFORM_BLEND:5},x={BlendMode:C,FilterMode:{OFF:0,NORMALIZED:1,RAW:2}};const{BlendMode:S}=x;var P;!function(e){e[e.COMPOSITE=0]="COMPOSITE",e[e.MAXIMUM_INTENSITY_BLEND=1]="MAXIMUM_INTENSITY_BLEND",e[e.MINIMUM_INTENSITY_BLEND=2]="MINIMUM_INTENSITY_BLEND",e[e.AVERAGE_INTENSITY_BLEND=3]="AVERAGE_INTENSITY_BLEND"}(P||(P={}));const w=P;var O;!function(e){e.AXIAL="axial",e.CORONAL="coronal",e.SAGITTAL="sagittal",e.ACQUISITION="acquisition"}(O||(O={}));const I=O;var A;!function(e){e.TRUE="true",e.FALSE="false",e.AUTO="auto"}(A||(A={}));const R=A;var E;!function(e){e.CONTOUR="contour"}(E||(E={}));const M=E;var D;!function(e){e.CLOSED_PLANAR="CLOSED_PLANAR",e.OPEN_PLANAR="OPEN_PLANAR"}(D||(D={}));const V=D;var L;!function(e){e.LINEAR="LINEAR",e.SAMPLED_SIGMOID="SIGMOID"}(L||(L={}));const _=L;var N;!function(e){e.SUM="SUM",e.AVERAGE="AVERAGE",e.SUBTRACT="SUBTRACT"}(N||(N={}));const B=N;var F;!function(e){e.NOT_APPLICABLE="",e.ERMF="ERMF",e.USER="User",e.PROJECTION="Proj",e.REGION="Region",e.ERROR="Error",e.UNCALIBRATED="Uncalibrated"}(F||(F={}));const U=F;var k;!function(e){e.NO_DATA="noData",e.LOADING="loading",e.PRE_RENDER="preRender",e.RESIZE="resize",e.RENDERED="rendered"}(k||(k={}));const G=k,W={hotIron:{name:"Hot Iron",numOfColors:256,colors:[[0,0,0,255],[2,0,0,255],[4,0,0,255],[6,0,0,255],[8,0,0,255],[10,0,0,255],[12,0,0,255],[14,0,0,255],[16,0,0,255],[18,0,0,255],[20,0,0,255],[22,0,0,255],[24,0,0,255],[26,0,0,255],[28,0,0,255],[30,0,0,255],[32,0,0,255],[34,0,0,255],[36,0,0,255],[38,0,0,255],[40,0,0,255],[42,0,0,255],[44,0,0,255],[46,0,0,255],[48,0,0,255],[50,0,0,255],[52,0,0,255],[54,0,0,255],[56,0,0,255],[58,0,0,255],[60,0,0,255],[62,0,0,255],[64,0,0,255],[66,0,0,255],[68,0,0,255],[70,0,0,255],[72,0,0,255],[74,0,0,255],[76,0,0,255],[78,0,0,255],[80,0,0,255],[82,0,0,255],[84,0,0,255],[86,0,0,255],[88,0,0,255],[90,0,0,255],[92,0,0,255],[94,0,0,255],[96,0,0,255],[98,0,0,255],[100,0,0,255],[102,0,0,255],[104,0,0,255],[106,0,0,255],[108,0,0,255],[110,0,0,255],[112,0,0,255],[114,0,0,255],[116,0,0,255],[118,0,0,255],[120,0,0,255],[122,0,0,255],[124,0,0,255],[126,0,0,255],[128,0,0,255],[130,0,0,255],[132,0,0,255],[134,0,0,255],[136,0,0,255],[138,0,0,255],[140,0,0,255],[142,0,0,255],[144,0,0,255],[146,0,0,255],[148,0,0,255],[150,0,0,255],[152,0,0,255],[154,0,0,255],[156,0,0,255],[158,0,0,255],[160,0,0,255],[162,0,0,255],[164,0,0,255],[166,0,0,255],[168,0,0,255],[170,0,0,255],[172,0,0,255],[174,0,0,255],[176,0,0,255],[178,0,0,255],[180,0,0,255],[182,0,0,255],[184,0,0,255],[186,0,0,255],[188,0,0,255],[190,0,0,255],[192,0,0,255],[194,0,0,255],[196,0,0,255],[198,0,0,255],[200,0,0,255],[202,0,0,255],[204,0,0,255],[206,0,0,255],[208,0,0,255],[210,0,0,255],[212,0,0,255],[214,0,0,255],[216,0,0,255],[218,0,0,255],[220,0,0,255],[222,0,0,255],[224,0,0,255],[226,0,0,255],[228,0,0,255],[230,0,0,255],[232,0,0,255],[234,0,0,255],[236,0,0,255],[238,0,0,255],[240,0,0,255],[242,0,0,255],[244,0,0,255],[246,0,0,255],[248,0,0,255],[250,0,0,255],[252,0,0,255],[254,0,0,255],[255,0,0,255],[255,2,0,255],[255,4,0,255],[255,6,0,255],[255,8,0,255],[255,10,0,255],[255,12,0,255],[255,14,0,255],[255,16,0,255],[255,18,0,255],[255,20,0,255],[255,22,0,255],[255,24,0,255],[255,26,0,255],[255,28,0,255],[255,30,0,255],[255,32,0,255],[255,34,0,255],[255,36,0,255],[255,38,0,255],[255,40,0,255],[255,42,0,255],[255,44,0,255],[255,46,0,255],[255,48,0,255],[255,50,0,255],[255,52,0,255],[255,54,0,255],[255,56,0,255],[255,58,0,255],[255,60,0,255],[255,62,0,255],[255,64,0,255],[255,66,0,255],[255,68,0,255],[255,70,0,255],[255,72,0,255],[255,74,0,255],[255,76,0,255],[255,78,0,255],[255,80,0,255],[255,82,0,255],[255,84,0,255],[255,86,0,255],[255,88,0,255],[255,90,0,255],[255,92,0,255],[255,94,0,255],[255,96,0,255],[255,98,0,255],[255,100,0,255],[255,102,0,255],[255,104,0,255],[255,106,0,255],[255,108,0,255],[255,110,0,255],[255,112,0,255],[255,114,0,255],[255,116,0,255],[255,118,0,255],[255,120,0,255],[255,122,0,255],[255,124,0,255],[255,126,0,255],[255,128,4,255],[255,130,8,255],[255,132,12,255],[255,134,16,255],[255,136,20,255],[255,138,24,255],[255,140,28,255],[255,142,32,255],[255,144,36,255],[255,146,40,255],[255,148,44,255],[255,150,48,255],[255,152,52,255],[255,154,56,255],[255,156,60,255],[255,158,64,255],[255,160,68,255],[255,162,72,255],[255,164,76,255],[255,166,80,255],[255,168,84,255],[255,170,88,255],[255,172,92,255],[255,174,96,255],[255,176,100,255],[255,178,104,255],[255,180,108,255],[255,182,112,255],[255,184,116,255],[255,186,120,255],[255,188,124,255],[255,190,128,255],[255,192,132,255],[255,194,136,255],[255,196,140,255],[255,198,144,255],[255,200,148,255],[255,202,152,255],[255,204,156,255],[255,206,160,255],[255,208,164,255],[255,210,168,255],[255,212,172,255],[255,214,176,255],[255,216,180,255],[255,218,184,255],[255,220,188,255],[255,222,192,255],[255,224,196,255],[255,226,200,255],[255,228,204,255],[255,230,208,255],[255,232,212,255],[255,234,216,255],[255,236,220,255],[255,238,224,255],[255,240,228,255],[255,242,232,255],[255,244,236,255],[255,246,240,255],[255,248,244,255],[255,250,248,255],[255,252,252,255],[255,255,255,255]]},pet:{name:"PET",numColors:256,colors:[[0,0,0,255],[0,2,1,255],[0,4,3,255],[0,6,5,255],[0,8,7,255],[0,10,9,255],[0,12,11,255],[0,14,13,255],[0,16,15,255],[0,18,17,255],[0,20,19,255],[0,22,21,255],[0,24,23,255],[0,26,25,255],[0,28,27,255],[0,30,29,255],[0,32,31,255],[0,34,33,255],[0,36,35,255],[0,38,37,255],[0,40,39,255],[0,42,41,255],[0,44,43,255],[0,46,45,255],[0,48,47,255],[0,50,49,255],[0,52,51,255],[0,54,53,255],[0,56,55,255],[0,58,57,255],[0,60,59,255],[0,62,61,255],[0,65,63,255],[0,67,65,255],[0,69,67,255],[0,71,69,255],[0,73,71,255],[0,75,73,255],[0,77,75,255],[0,79,77,255],[0,81,79,255],[0,83,81,255],[0,85,83,255],[0,87,85,255],[0,89,87,255],[0,91,89,255],[0,93,91,255],[0,95,93,255],[0,97,95,255],[0,99,97,255],[0,101,99,255],[0,103,101,255],[0,105,103,255],[0,107,105,255],[0,109,107,255],[0,111,109,255],[0,113,111,255],[0,115,113,255],[0,117,115,255],[0,119,117,255],[0,121,119,255],[0,123,121,255],[0,125,123,255],[0,128,125,255],[1,126,127,255],[3,124,129,255],[5,122,131,255],[7,120,133,255],[9,118,135,255],[11,116,137,255],[13,114,139,255],[15,112,141,255],[17,110,143,255],[19,108,145,255],[21,106,147,255],[23,104,149,255],[25,102,151,255],[27,100,153,255],[29,98,155,255],[31,96,157,255],[33,94,159,255],[35,92,161,255],[37,90,163,255],[39,88,165,255],[41,86,167,255],[43,84,169,255],[45,82,171,255],[47,80,173,255],[49,78,175,255],[51,76,177,255],[53,74,179,255],[55,72,181,255],[57,70,183,255],[59,68,185,255],[61,66,187,255],[63,64,189,255],[65,63,191,255],[67,61,193,255],[69,59,195,255],[71,57,197,255],[73,55,199,255],[75,53,201,255],[77,51,203,255],[79,49,205,255],[81,47,207,255],[83,45,209,255],[85,43,211,255],[86,41,213,255],[88,39,215,255],[90,37,217,255],[92,35,219,255],[94,33,221,255],[96,31,223,255],[98,29,225,255],[100,27,227,255],[102,25,229,255],[104,23,231,255],[106,21,233,255],[108,19,235,255],[110,17,237,255],[112,15,239,255],[114,13,241,255],[116,11,243,255],[118,9,245,255],[120,7,247,255],[122,5,249,255],[124,3,251,255],[126,1,253,255],[128,0,255,255],[130,2,252,255],[132,4,248,255],[134,6,244,255],[136,8,240,255],[138,10,236,255],[140,12,232,255],[142,14,228,255],[144,16,224,255],[146,18,220,255],[148,20,216,255],[150,22,212,255],[152,24,208,255],[154,26,204,255],[156,28,200,255],[158,30,196,255],[160,32,192,255],[162,34,188,255],[164,36,184,255],[166,38,180,255],[168,40,176,255],[170,42,172,255],[171,44,168,255],[173,46,164,255],[175,48,160,255],[177,50,156,255],[179,52,152,255],[181,54,148,255],[183,56,144,255],[185,58,140,255],[187,60,136,255],[189,62,132,255],[191,64,128,255],[193,66,124,255],[195,68,120,255],[197,70,116,255],[199,72,112,255],[201,74,108,255],[203,76,104,255],[205,78,100,255],[207,80,96,255],[209,82,92,255],[211,84,88,255],[213,86,84,255],[215,88,80,255],[217,90,76,255],[219,92,72,255],[221,94,68,255],[223,96,64,255],[225,98,60,255],[227,100,56,255],[229,102,52,255],[231,104,48,255],[233,106,44,255],[235,108,40,255],[237,110,36,255],[239,112,32,255],[241,114,28,255],[243,116,24,255],[245,118,20,255],[247,120,16,255],[249,122,12,255],[251,124,8,255],[253,126,4,255],[255,128,0,255],[255,130,4,255],[255,132,8,255],[255,134,12,255],[255,136,16,255],[255,138,20,255],[255,140,24,255],[255,142,28,255],[255,144,32,255],[255,146,36,255],[255,148,40,255],[255,150,44,255],[255,152,48,255],[255,154,52,255],[255,156,56,255],[255,158,60,255],[255,160,64,255],[255,162,68,255],[255,164,72,255],[255,166,76,255],[255,168,80,255],[255,170,85,255],[255,172,89,255],[255,174,93,255],[255,176,97,255],[255,178,101,255],[255,180,105,255],[255,182,109,255],[255,184,113,255],[255,186,117,255],[255,188,121,255],[255,190,125,255],[255,192,129,255],[255,194,133,255],[255,196,137,255],[255,198,141,255],[255,200,145,255],[255,202,149,255],[255,204,153,255],[255,206,157,255],[255,208,161,255],[255,210,165,255],[255,212,170,255],[255,214,174,255],[255,216,178,255],[255,218,182,255],[255,220,186,255],[255,222,190,255],[255,224,194,255],[255,226,198,255],[255,228,202,255],[255,230,206,255],[255,232,210,255],[255,234,214,255],[255,236,218,255],[255,238,222,255],[255,240,226,255],[255,242,230,255],[255,244,234,255],[255,246,238,255],[255,248,242,255],[255,250,246,255],[255,252,250,255],[255,255,255,255]]},hotMetalBlue:{name:"Hot Metal Blue",numColors:256,colors:[[0,0,0,255],[0,0,2,255],[0,0,4,255],[0,0,6,255],[0,0,8,255],[0,0,10,255],[0,0,12,255],[0,0,14,255],[0,0,16,255],[0,0,17,255],[0,0,19,255],[0,0,21,255],[0,0,23,255],[0,0,25,255],[0,0,27,255],[0,0,29,255],[0,0,31,255],[0,0,33,255],[0,0,35,255],[0,0,37,255],[0,0,39,255],[0,0,41,255],[0,0,43,255],[0,0,45,255],[0,0,47,255],[0,0,49,255],[0,0,51,255],[0,0,53,255],[0,0,55,255],[0,0,57,255],[0,0,59,255],[0,0,61,255],[0,0,63,255],[0,0,65,255],[0,0,67,255],[0,0,69,255],[0,0,71,255],[0,0,73,255],[0,0,75,255],[0,0,77,255],[0,0,79,255],[0,0,81,255],[0,0,83,255],[0,0,84,255],[0,0,86,255],[0,0,88,255],[0,0,90,255],[0,0,92,255],[0,0,94,255],[0,0,96,255],[0,0,98,255],[0,0,100,255],[0,0,102,255],[0,0,104,255],[0,0,106,255],[0,0,108,255],[0,0,110,255],[0,0,112,255],[0,0,114,255],[0,0,116,255],[0,0,117,255],[0,0,119,255],[0,0,121,255],[0,0,123,255],[0,0,125,255],[0,0,127,255],[0,0,129,255],[0,0,131,255],[0,0,133,255],[0,0,135,255],[0,0,137,255],[0,0,139,255],[0,0,141,255],[0,0,143,255],[0,0,145,255],[0,0,147,255],[0,0,149,255],[0,0,151,255],[0,0,153,255],[0,0,155,255],[0,0,157,255],[0,0,159,255],[0,0,161,255],[0,0,163,255],[0,0,165,255],[0,0,167,255],[3,0,169,255],[6,0,171,255],[9,0,173,255],[12,0,175,255],[15,0,177,255],[18,0,179,255],[21,0,181,255],[24,0,183,255],[26,0,184,255],[29,0,186,255],[32,0,188,255],[35,0,190,255],[38,0,192,255],[41,0,194,255],[44,0,196,255],[47,0,198,255],[50,0,200,255],[52,0,197,255],[55,0,194,255],[57,0,191,255],[59,0,188,255],[62,0,185,255],[64,0,182,255],[66,0,179,255],[69,0,176,255],[71,0,174,255],[74,0,171,255],[76,0,168,255],[78,0,165,255],[81,0,162,255],[83,0,159,255],[85,0,156,255],[88,0,153,255],[90,0,150,255],[93,2,144,255],[96,4,138,255],[99,6,132,255],[102,8,126,255],[105,9,121,255],[108,11,115,255],[111,13,109,255],[114,15,103,255],[116,17,97,255],[119,19,91,255],[122,21,85,255],[125,23,79,255],[128,24,74,255],[131,26,68,255],[134,28,62,255],[137,30,56,255],[140,32,50,255],[143,34,47,255],[146,36,44,255],[149,38,41,255],[152,40,38,255],[155,41,35,255],[158,43,32,255],[161,45,29,255],[164,47,26,255],[166,49,24,255],[169,51,21,255],[172,53,18,255],[175,55,15,255],[178,56,12,255],[181,58,9,255],[184,60,6,255],[187,62,3,255],[190,64,0,255],[194,66,0,255],[198,68,0,255],[201,70,0,255],[205,72,0,255],[209,73,0,255],[213,75,0,255],[217,77,0,255],[221,79,0,255],[224,81,0,255],[228,83,0,255],[232,85,0,255],[236,87,0,255],[240,88,0,255],[244,90,0,255],[247,92,0,255],[251,94,0,255],[255,96,0,255],[255,98,3,255],[255,100,6,255],[255,102,9,255],[255,104,12,255],[255,105,15,255],[255,107,18,255],[255,109,21,255],[255,111,24,255],[255,113,26,255],[255,115,29,255],[255,117,32,255],[255,119,35,255],[255,120,38,255],[255,122,41,255],[255,124,44,255],[255,126,47,255],[255,128,50,255],[255,130,53,255],[255,132,56,255],[255,134,59,255],[255,136,62,255],[255,137,65,255],[255,139,68,255],[255,141,71,255],[255,143,74,255],[255,145,76,255],[255,147,79,255],[255,149,82,255],[255,151,85,255],[255,152,88,255],[255,154,91,255],[255,156,94,255],[255,158,97,255],[255,160,100,255],[255,162,103,255],[255,164,106,255],[255,166,109,255],[255,168,112,255],[255,169,115,255],[255,171,118,255],[255,173,121,255],[255,175,124,255],[255,177,126,255],[255,179,129,255],[255,181,132,255],[255,183,135,255],[255,184,138,255],[255,186,141,255],[255,188,144,255],[255,190,147,255],[255,192,150,255],[255,194,153,255],[255,196,156,255],[255,198,159,255],[255,200,162,255],[255,201,165,255],[255,203,168,255],[255,205,171,255],[255,207,174,255],[255,209,176,255],[255,211,179,255],[255,213,182,255],[255,215,185,255],[255,216,188,255],[255,218,191,255],[255,220,194,255],[255,222,197,255],[255,224,200,255],[255,226,203,255],[255,228,206,255],[255,229,210,255],[255,231,213,255],[255,233,216,255],[255,235,219,255],[255,237,223,255],[255,239,226,255],[255,240,229,255],[255,242,232,255],[255,244,236,255],[255,246,239,255],[255,248,242,255],[255,250,245,255],[255,251,249,255],[255,253,252,255],[255,255,255,255]]},pet20Step:{name:"PET 20 Step",numColors:256,colors:[[0,0,0,255],[0,0,0,255],[0,0,0,255],[0,0,0,255],[0,0,0,255],[0,0,0,255],[0,0,0,255],[0,0,0,255],[0,0,0,255],[0,0,0,255],[0,0,0,255],[0,0,0,255],[0,0,0,255],[96,0,80,255],[96,0,80,255],[96,0,80,255],[96,0,80,255],[96,0,80,255],[96,0,80,255],[96,0,80,255],[96,0,80,255],[96,0,80,255],[96,0,80,255],[96,0,80,255],[96,0,80,255],[96,0,80,255],[48,48,80,255],[48,48,80,255],[48,48,80,255],[48,48,80,255],[48,48,80,255],[48,48,80,255],[48,48,80,255],[48,48,80,255],[48,48,80,255],[48,48,80,255],[48,48,80,255],[48,48,80,255],[48,48,80,255],[48,48,112,255],[48,48,112,255],[48,48,112,255],[48,48,112,255],[48,48,112,255],[48,48,112,255],[48,48,112,255],[48,48,112,255],[48,48,112,255],[48,48,112,255],[48,48,112,255],[48,48,112,255],[80,80,128,255],[80,80,128,255],[80,80,128,255],[80,80,128,255],[80,80,128,255],[80,80,128,255],[80,80,128,255],[80,80,128,255],[80,80,128,255],[80,80,128,255],[80,80,128,255],[80,80,128,255],[80,80,128,255],[96,96,176,255],[96,96,176,255],[96,96,176,255],[96,96,176,255],[96,96,176,255],[96,96,176,255],[96,96,176,255],[96,96,176,255],[96,96,176,255],[96,96,176,255],[96,96,176,255],[96,96,176,255],[96,96,176,255],[112,112,192,255],[112,112,192,255],[112,112,192,255],[112,112,192,255],[112,112,192,255],[112,112,192,255],[112,112,192,255],[112,112,192,255],[112,112,192,255],[112,112,192,255],[112,112,192,255],[112,112,192,255],[112,112,192,255],[128,128,224,255],[128,128,224,255],[128,128,224,255],[128,128,224,255],[128,128,224,255],[128,128,224,255],[128,128,224,255],[128,128,224,255],[128,128,224,255],[128,128,224,255],[128,128,224,255],[128,128,224,255],[48,96,48,255],[48,96,48,255],[48,96,48,255],[48,96,48,255],[48,96,48,255],[48,96,48,255],[48,96,48,255],[48,96,48,255],[48,96,48,255],[48,96,48,255],[48,96,48,255],[48,96,48,255],[48,96,48,255],[48,144,48,255],[48,144,48,255],[48,144,48,255],[48,144,48,255],[48,144,48,255],[48,144,48,255],[48,144,48,255],[48,144,48,255],[48,144,48,255],[48,144,48,255],[48,144,48,255],[48,144,48,255],[48,144,48,255],[80,192,80,255],[80,192,80,255],[80,192,80,255],[80,192,80,255],[80,192,80,255],[80,192,80,255],[80,192,80,255],[80,192,80,255],[80,192,80,255],[80,192,80,255],[80,192,80,255],[80,192,80,255],[80,192,80,255],[64,224,64,255],[64,224,64,255],[64,224,64,255],[64,224,64,255],[64,224,64,255],[64,224,64,255],[64,224,64,255],[64,224,64,255],[64,224,64,255],[64,224,64,255],[64,224,64,255],[64,224,64,255],[224,224,80,255],[224,224,80,255],[224,224,80,255],[224,224,80,255],[224,224,80,255],[224,224,80,255],[224,224,80,255],[224,224,80,255],[224,224,80,255],[224,224,80,255],[224,224,80,255],[224,224,80,255],[224,224,80,255],[208,208,96,255],[208,208,96,255],[208,208,96,255],[208,208,96,255],[208,208,96,255],[208,208,96,255],[208,208,96,255],[208,208,96,255],[208,208,96,255],[208,208,96,255],[208,208,96,255],[208,208,96,255],[208,208,96,255],[208,176,64,255],[208,176,64,255],[208,176,64,255],[208,176,64,255],[208,176,64,255],[208,176,64,255],[208,176,64,255],[208,176,64,255],[208,176,64,255],[208,176,64,255],[208,176,64,255],[208,176,64,255],[208,176,64,255],[208,144,0,255],[208,144,0,255],[208,144,0,255],[208,144,0,255],[208,144,0,255],[208,144,0,255],[208,144,0,255],[208,144,0,255],[208,144,0,255],[208,144,0,255],[208,144,0,255],[208,144,0,255],[192,96,0,255],[192,96,0,255],[192,96,0,255],[192,96,0,255],[192,96,0,255],[192,96,0,255],[192,96,0,255],[192,96,0,255],[192,96,0,255],[192,96,0,255],[192,96,0,255],[192,96,0,255],[192,96,0,255],[176,48,0,255],[176,48,0,255],[176,48,0,255],[176,48,0,255],[176,48,0,255],[176,48,0,255],[176,48,0,255],[176,48,0,255],[176,48,0,255],[176,48,0,255],[176,48,0,255],[176,48,0,255],[176,48,0,255],[255,0,0,255],[255,0,0,255],[255,0,0,255],[255,0,0,255],[255,0,0,255],[255,0,0,255],[255,0,0,255],[255,0,0,255],[255,0,0,255],[255,0,0,255],[255,0,0,255],[255,0,0,255],[255,0,0,255],[255,255,255,255],[255,255,255,255],[255,255,255,255],[255,255,255,255],[255,255,255,255],[255,255,255,255],[255,255,255,255],[255,255,255,255],[255,255,255,255],[255,255,255,255],[255,255,255,255],[255,255,255,255],[255,255,255,255]]},gray:{name:"Gray",numColors:256,gamma:1,segmentedData:{red:[[0,0,0],[1,1,1]],green:[[0,0,0],[1,1,1]],blue:[[0,0,0],[1,1,1]]}},jet:{name:"Jet",numColors:256,gamma:1,segmentedData:{red:[[0,0,0],[.35,0,0],[.66,1,1],[.89,1,1],[1,.5,.5]],green:[[0,0,0],[.125,0,0],[.375,1,1],[.64,1,1],[.91,0,0],[1,0,0]],blue:[[0,.5,.5],[.11,1,1],[.34,1,1],[.65,0,0],[1,0,0]]}},hsv:{name:"HSV",numColors:256,gamma:1,segmentedData:{red:[[0,1,1],[.15873,1,1],[.174603,.96875,.96875],[.333333,.03125,.03125],[.349206,0,0],[.666667,0,0],[.68254,.03125,.03125],[.84127,.96875,.96875],[.857143,1,1],[1,1,1]],green:[[0,0,0],[.15873,.9375,.9375],[.174603,1,1],[.507937,1,1],[.666667,.0625,.0625],[.68254,0,0],[1,0,0]],blue:[[0,0,0],[.333333,0,0],[.349206,.0625,.0625],[.507937,1,1],[.84127,1,1],[.857143,.9375,.9375],[1,.09375,.09375]]}},hot:{name:"Hot",numColors:256,gamma:1,segmentedData:{red:[[0,.0416,.0416],[.365079,1,1],[1,1,1]],green:[[0,0,0],[.365079,0,0],[.746032,1,1],[1,1,1]],blue:[[0,0,0],[.746032,0,0],[1,1,1]]}},cool:{name:"Cool",numColors:256,gamma:1,segmentedData:{red:[[0,0,0],[1,1,1]],green:[[0,1,1],[1,0,0]],blue:[[0,1,1],[1,1,1]]}},spring:{name:"Spring",numColors:256,gamma:1,segmentedData:{red:[[0,1,1],[1,1,1]],green:[[0,0,0],[1,1,1]],blue:[[0,1,1],[1,0,0]]}},summer:{name:"Summer",numColors:256,gamma:1,segmentedData:{red:[[0,0,0],[1,1,1]],green:[[0,.5,.5],[1,1,1]],blue:[[0,.4,.4],[1,.4,.4]]}},autumn:{name:"Autumn",numColors:256,gamma:1,segmentedData:{red:[[0,1,1],[1,1,1]],green:[[0,0,0],[1,1,1]],blue:[[0,0,0],[1,0,0]]}},winter:{name:"Winter",numColors:256,gamma:1,segmentedData:{red:[[0,0,0],[1,0,0]],green:[[0,0,0],[1,1,1]],blue:[[0,1,1],[1,.5,.5]]}},bone:{name:"Bone",numColors:256,gamma:1,segmentedData:{red:[[0,0,0],[.746032,.652778,.652778],[1,1,1]],green:[[0,0,0],[.365079,.319444,.319444],[.746032,.777778,.777778],[1,1,1]],blue:[[0,0,0],[.365079,.444444,.444444],[1,1,1]]}},copper:{name:"Copper",numColors:256,gamma:1,segmentedData:{red:[[0,0,0],[.809524,1,1],[1,1,1]],green:[[0,0,0],[1,.7812,.7812]],blue:[[0,0,0],[1,.4975,.4975]]}},spectral:{name:"Spectral",numColors:256,gamma:1,segmentedData:{red:[[0,0,0],[.05,.4667,.4667],[.1,.5333,.5333],[.15,0,0],[.2,0,0],[.25,0,0],[.3,0,0],[.35,0,0],[.4,0,0],[.45,0,0],[.5,0,0],[.55,0,0],[.6,0,0],[.65,.7333,.7333],[.7,.9333,.9333],[.75,1,1],[.8,1,1],[.85,1,1],[.9,.8667,.8667],[.95,.8,.8],[1,.8,.8]],green:[[0,0,0],[.05,0,0],[.1,0,0],[.15,0,0],[.2,0,0],[.25,.4667,.4667],[.3,.6,.6],[.35,.6667,.6667],[.4,.6667,.6667],[.45,.6,.6],[.5,.7333,.7333],[.55,.8667,.8667],[.6,1,1],[.65,1,1],[.7,.9333,.9333],[.75,.8,.8],[.8,.6,.6],[.85,0,0],[.9,0,0],[.95,0,0],[1,.8,.8]],blue:[[0,0,0],[.05,.5333,.5333],[.1,.6,.6],[.15,.6667,.6667],[.2,.8667,.8667],[.25,.8667,.8667],[.3,.8667,.8667],[.35,.6667,.6667],[.4,.5333,.5333],[.45,0,0],[.5,0,0],[.55,0,0],[.6,0,0],[.65,0,0],[.7,0,0],[.75,0,0],[.8,0,0],[.85,0,0],[.9,0,0],[.95,0,0],[1,.8,.8]]}},coolwarm:{name:"CoolWarm",numColors:256,gamma:1,segmentedData:{red:[[0,.2298057,.2298057],[.03125,.26623388,.26623388],[.0625,.30386891,.30386891],[.09375,.342804478,.342804478],[.125,.38301334,.38301334],[.15625,.424369608,.424369608],[.1875,.46666708,.46666708],[.21875,.509635204,.509635204],[.25,.552953156,.552953156],[.28125,.596262162,.596262162],[.3125,.639176211,.639176211],[.34375,.681291281,.681291281],[.375,.722193294,.722193294],[.40625,.761464949,.761464949],[.4375,.798691636,.798691636],[.46875,.833466556,.833466556],[.5,.865395197,.865395197],[.53125,.897787179,.897787179],[.5625,.924127593,.924127593],[.59375,.944468518,.944468518],[.625,.958852946,.958852946],[.65625,.96732803,.96732803],[.6875,.969954137,.969954137],[.71875,.966811177,.966811177],[.75,.958003065,.958003065],[.78125,.943660866,.943660866],[.8125,.923944917,.923944917],[.84375,.89904617,.89904617],[.875,.869186849,.869186849],[.90625,.834620542,.834620542],[.9375,.795631745,.795631745],[.96875,.752534934,.752534934],[1,.705673158,.705673158]],green:[[0,.298717966,.298717966],[.03125,.353094838,.353094838],[.0625,.406535296,.406535296],[.09375,.458757618,.458757618],[.125,.50941904,.50941904],[.15625,.558148092,.558148092],[.1875,.604562568,.604562568],[.21875,.648280772,.648280772],[.25,.688929332,.688929332],[.28125,.726149107,.726149107],[.3125,.759599947,.759599947],[.34375,.788964712,.788964712],[.375,.813952739,.813952739],[.40625,.834302879,.834302879],[.4375,.849786142,.849786142],[.46875,.860207984,.860207984],[.5,.86541021,.86541021],[.53125,.848937047,.848937047],[.5625,.827384882,.827384882],[.59375,.800927443,.800927443],[.625,.769767752,.769767752],[.65625,.734132809,.734132809],[.6875,.694266682,.694266682],[.71875,.650421156,.650421156],[.75,.602842431,.602842431],[.78125,.551750968,.551750968],[.8125,.49730856,.49730856],[.84375,.439559467,.439559467],[.875,.378313092,.378313092],[.90625,.312874446,.312874446],[.9375,.24128379,.24128379],[.96875,.157246067,.157246067],[1,.01555616,.01555616]],blue:[[0,.753683153,.753683153],[.03125,.801466763,.801466763],[.0625,.84495867,.84495867],[.09375,.883725899,.883725899],[.125,.917387822,.917387822],[.15625,.945619588,.945619588],[.1875,.968154911,.968154911],[.21875,.98478814,.98478814],[.25,.995375608,.995375608],[.28125,.999836203,.999836203],[.3125,.998151185,.998151185],[.34375,.990363227,.990363227],[.375,.976574709,.976574709],[.40625,.956945269,.956945269],[.4375,.931688648,.931688648],[.46875,.901068838,.901068838],[.5,.865395561,.865395561],[.53125,.820880546,.820880546],[.5625,.774508472,.774508472],[.59375,.726736146,.726736146],[.625,.678007945,.678007945],[.65625,.628751763,.628751763],[.6875,.579375448,.579375448],[.71875,.530263762,.530263762],[.75,.481775914,.481775914],[.78125,.434243684,.434243684],[.8125,.387970225,.387970225],[.84375,.343229596,.343229596],[.875,.300267182,.300267182],[.90625,.259301199,.259301199],[.9375,.220525627,.220525627],[.96875,.184115123,.184115123],[1,.150232812,.150232812]]}},blues:{name:"Blues",numColors:256,gamma:1,segmentedData:{red:[[0,.9686274528503418,.9686274528503418],[.125,.8705882430076599,.8705882430076599],[.25,.7764706015586853,.7764706015586853],[.375,.6196078658103943,.6196078658103943],[.5,.41960784792900085,.41960784792900085],[.625,.25882354378700256,.25882354378700256],[.75,.12941177189350128,.12941177189350128],[.875,.0313725508749485,.0313725508749485],[1,.0313725508749485,.0313725508749485]],green:[[0,.9843137264251709,.9843137264251709],[.125,.9215686321258545,.9215686321258545],[.25,.8588235378265381,.8588235378265381],[.375,.7921568751335144,.7921568751335144],[.5,.6823529601097107,.6823529601097107],[.625,.572549045085907,.572549045085907],[.75,.4431372582912445,.4431372582912445],[.875,.3176470696926117,.3176470696926117],[1,.1882352977991104,.1882352977991104]],blue:[[0,1,1],[.125,.9686274528503418,.9686274528503418],[.25,.9372549057006836,.9372549057006836],[.375,.8823529481887817,.8823529481887817],[.5,.8392156958580017,.8392156958580017],[.625,.7764706015586853,.7764706015586853],[.75,.7098039388656616,.7098039388656616],[.875,.6117647290229797,.6117647290229797],[1,.41960784792900085,.41960784792900085]]}}},z={MINIMUM_SLAB_THICKNESS:.05,MAXIMUM_RAY_DISTANCE:1e6};Object.freeze(z);const j=z,H=.001;const K=function e(t){const r=Object.getOwnPropertyNames(t);for(const n of r){const r=t[n];r&&"object"==typeof r&&e(r)}return Object.freeze(t)},Z=K({axial:{viewPlaneNormal:[0,0,-1],viewUp:[0,-1,0]},sagittal:{viewPlaneNormal:[1,0,0],viewUp:[0,0,1]},coronal:{viewPlaneNormal:[0,-1,0],viewUp:[0,0,1]}}),X=[{name:"CT-AAA",gradientOpacity:"4 0 1 255 1",specularPower:"10",scalarOpacity:"12 -3024 0 143.556 0 166.222 0.686275 214.389 0.696078 419.736 0.833333 3071 0.803922",specular:"0.2",shade:"1",ambient:"0.1",colorTransfer:"24 -3024 0 0 0 143.556 0.615686 0.356863 0.184314 166.222 0.882353 0.603922 0.290196 214.389 1 1 1 419.736 1 0.937033 0.954531 3071 0.827451 0.658824 1",diffuse:"0.9",interpolation:"1"},{name:"CT-AAA2",gradientOpacity:"4 0 1 255 1",specularPower:"10",scalarOpacity:"16 -3024 0 129.542 0 145.244 0.166667 157.02 0.5 169.918 0.627451 395.575 0.8125 1578.73 0.8125 3071 0.8125",specular:"0.2",shade:"1",ambient:"0.1",colorTransfer:"32 -3024 0 0 0 129.542 0.54902 0.25098 0.14902 145.244 0.6 0.627451 0.843137 157.02 0.890196 0.47451 0.6 169.918 0.992157 0.870588 0.392157 395.575 1 0.886275 0.658824 1578.73 1 0.829256 0.957922 3071 0.827451 0.658824 1",diffuse:"0.9",interpolation:"1"},{name:"CT-Bone",gradientOpacity:"4 0 1 255 1",specularPower:"10",scalarOpacity:"8 -3024 0 -16.4458 0 641.385 0.715686 3071 0.705882",specular:"0.2",shade:"1",ambient:"0.1",colorTransfer:"16 -3024 0 0 0 -16.4458 0.729412 0.254902 0.301961 641.385 0.905882 0.815686 0.552941 3071 1 1 1",diffuse:"0.9",interpolation:"1"},{name:"CT-Bones",gradientOpacity:"4 0 1 985.12 1",specularPower:"1",scalarOpacity:"8 -1000 0 152.19 0 278.93 0.190476 952 0.2",specular:"0",shade:"1",ambient:"0.2",colorTransfer:"20 -1000 0.3 0.3 1 -488 0.3 1 0.3 463.28 1 0 0 659.15 1 0.912535 0.0374849 953 1 0.3 0.3",diffuse:"1",interpolation:"1"},{name:"CT-Cardiac",gradientOpacity:"4 0 1 255 1",specularPower:"10",scalarOpacity:"12 -3024 0 -77.6875 0 94.9518 0.285714 179.052 0.553571 260.439 0.848214 3071 0.875",specular:"0.2",shade:"1",ambient:"0.1",colorTransfer:"24 -3024 0 0 0 -77.6875 0.54902 0.25098 0.14902 94.9518 0.882353 0.603922 0.290196 179.052 1 0.937033 0.954531 260.439 0.615686 0 0 3071 0.827451 0.658824 1",diffuse:"0.9",interpolation:"1"},{name:"CT-Cardiac2",gradientOpacity:"4 0 1 255 1",specularPower:"10",scalarOpacity:"12 -3024 0 42.8964 0 163.488 0.428571 277.642 0.776786 1587 0.754902 3071 0.754902",specular:"0.2",shade:"1",ambient:"0.1",colorTransfer:"24 -3024 0 0 0 42.8964 0.54902 0.25098 0.14902 163.488 0.917647 0.639216 0.0588235 277.642 1 0.878431 0.623529 1587 1 1 1 3071 0.827451 0.658824 1",diffuse:"0.9",interpolation:"1"},{name:"CT-Cardiac3",gradientOpacity:"4 0 1 255 1",specularPower:"10",scalarOpacity:"14 -3024 0 -86.9767 0 45.3791 0.169643 139.919 0.589286 347.907 0.607143 1224.16 0.607143 3071 0.616071",specular:"0.2",shade:"1",ambient:"0.1",colorTransfer:"28 -3024 0 0 0 -86.9767 0 0.25098 1 45.3791 1 0 0 139.919 1 0.894893 0.894893 347.907 1 1 0.25098 1224.16 1 1 1 3071 0.827451 0.658824 1",diffuse:"0.9",interpolation:"1"},{name:"CT-Chest-Contrast-Enhanced",gradientOpacity:"4 0 1 255 1",specularPower:"10",scalarOpacity:"10 -3024 0 67.0106 0 251.105 0.446429 439.291 0.625 3071 0.616071",specular:"0.2",shade:"1",ambient:"0.1",colorTransfer:"20 -3024 0 0 0 67.0106 0.54902 0.25098 0.14902 251.105 0.882353 0.603922 0.290196 439.291 1 0.937033 0.954531 3071 0.827451 0.658824 1",diffuse:"0.9",interpolation:"1"},{name:"CT-Chest-Vessels",gradientOpacity:"4 0 1 255 1",specularPower:"1",scalarOpacity:"10 -3024 0 -1278.35 0 22.8277 0.428571 439.291 0.625 3071 0.616071",specular:"0",shade:"1",ambient:"0.2",colorTransfer:"20 -3024 0 0 0 -1278.35 0.54902 0.25098 0.14902 22.8277 0.882353 0.603922 0.290196 439.291 1 0.937033 0.954531 3071 0.827451 0.658824 1",diffuse:"1",interpolation:"1"},{name:"CT-Coronary-Arteries",gradientOpacity:"4 0 1 255 1",specularPower:"1",scalarOpacity:"12 -2048 0 136.47 0 159.215 0.258929 318.43 0.571429 478.693 0.776786 3661 1",specular:"0",shade:"0",ambient:"0.2",colorTransfer:"24 -2048 0 0 0 136.47 0 0 0 159.215 0.159804 0.159804 0.159804 318.43 0.764706 0.764706 0.764706 478.693 1 1 1 3661 1 1 1",diffuse:"1",interpolation:"1"},{name:"CT-Coronary-Arteries-2",gradientOpacity:"4 0 1 255 1",specularPower:"1",scalarOpacity:"14 -2048 0 142.677 0 145.016 0.116071 192.174 0.5625 217.24 0.776786 384.347 0.830357 3661 0.830357",specular:"0",shade:"1",ambient:"0.2",colorTransfer:"28 -2048 0 0 0 142.677 0 0 0 145.016 0.615686 0 0.0156863 192.174 0.909804 0.454902 0 217.24 0.972549 0.807843 0.611765 384.347 0.909804 0.909804 1 3661 1 1 1",diffuse:"1",interpolation:"1"},{name:"CT-Coronary-Arteries-3",gradientOpacity:"4 0 1 255 1",specularPower:"10",scalarOpacity:"14 -2048 0 128.643 0 129.982 0.0982143 173.636 0.669643 255.884 0.857143 584.878 0.866071 3661 1",specular:"0.2",shade:"1",ambient:"0.1",colorTransfer:"28 -2048 0 0 0 128.643 0 0 0 129.982 0.615686 0 0.0156863 173.636 0.909804 0.454902 0 255.884 0.886275 0.886275 0.886275 584.878 0.968627 0.968627 0.968627 3661 1 1 1",diffuse:"0.9",interpolation:"1"},{name:"CT-Cropped-Volume-Bone",gradientOpacity:"4 0 1 255 1",specularPower:"1",scalarOpacity:"10 -2048 0 -451 0 -450 1 1050 1 3661 1",specular:"0",shade:"0",ambient:"0.2",colorTransfer:"20 -2048 0 0 0 -451 0 0 0 -450 0.0556356 0.0556356 0.0556356 1050 1 1 1 3661 1 1 1",diffuse:"1",interpolation:"1"},{name:"CT-Fat",gradientOpacity:"6 0 1 985.12 1 988 1",specularPower:"1",scalarOpacity:"14 -1000 0 -100 0 -99 0.15 -60 0.15 -59 0 101.2 0 952 0",specular:"0",shade:"0",ambient:"0.2",colorTransfer:"36 -1000 0.3 0.3 1 -497.5 0.3 1 0.3 -99 0 0 1 -76.946 0 1 0 -65.481 0.835431 0.888889 0.0165387 83.89 1 0 0 463.28 1 0 0 659.15 1 0.912535 0.0374849 2952 1 0.300267 0.299886",diffuse:"1",interpolation:"1"},{name:"CT-Liver-Vasculature",gradientOpacity:"4 0 1 255 1",specularPower:"1",scalarOpacity:"14 -2048 0 149.113 0 157.884 0.482143 339.96 0.660714 388.526 0.830357 1197.95 0.839286 3661 0.848214",specular:"0",shade:"0",ambient:"0.2",colorTransfer:"28 -2048 0 0 0 149.113 0 0 0 157.884 0.501961 0.25098 0 339.96 0.695386 0.59603 0.36886 388.526 0.854902 0.85098 0.827451 1197.95 1 1 1 3661 1 1 1",diffuse:"1",interpolation:"1"},{name:"CT-Lung",gradientOpacity:"6 0 1 985.12 1 988 1",specularPower:"1",scalarOpacity:"12 -1000 0 -600 0 -599 0.15 -400 0.15 -399 0 2952 0",specular:"0",shade:"1",ambient:"0.2",colorTransfer:"24 -1000 0.3 0.3 1 -600 0 0 1 -530 0.134704 0.781726 0.0724558 -460 0.929244 1 0.109473 -400 0.888889 0.254949 0.0240258 2952 1 0.3 0.3",diffuse:"1",interpolation:"1"},{name:"CT-MIP",gradientOpacity:"4 0 1 255 1",specularPower:"10",scalarOpacity:"8 -3024 0 -637.62 0 700 1 3071 1",specular:"0.2",shade:"1",ambient:"0.1",colorTransfer:"16 -3024 0 0 0 -637.62 1 1 1 700 1 1 1 3071 1 1 1",diffuse:"0.9",interpolation:"1"},{name:"CT-Muscle",gradientOpacity:"4 0 1 255 1",specularPower:"10",scalarOpacity:"10 -3024 0 -155.407 0 217.641 0.676471 419.736 0.833333 3071 0.803922",specular:"0.2",shade:"1",ambient:"0.1",colorTransfer:"20 -3024 0 0 0 -155.407 0.54902 0.25098 0.14902 217.641 0.882353 0.603922 0.290196 419.736 1 0.937033 0.954531 3071 0.827451 0.658824 1",diffuse:"0.9",interpolation:"1"},{name:"CT-Pulmonary-Arteries",gradientOpacity:"4 0 1 255 1",specularPower:"1",scalarOpacity:"14 -2048 0 -568.625 0 -364.081 0.0714286 -244.813 0.401786 18.2775 0.607143 447.798 0.830357 3592.73 0.839286",specular:"0",shade:"1",ambient:"0.2",colorTransfer:"28 -2048 0 0 0 -568.625 0 0 0 -364.081 0.396078 0.301961 0.180392 -244.813 0.611765 0.352941 0.0705882 18.2775 0.843137 0.0156863 0.156863 447.798 0.752941 0.752941 0.752941 3592.73 1 1 1",diffuse:"1",interpolation:"1"},{name:"CT-Soft-Tissue",gradientOpacity:"4 0 1 255 1",specularPower:"1",scalarOpacity:"10 -2048 0 -167.01 0 -160 1 240 1 3661 1",specular:"0",shade:"0",ambient:"0.2",colorTransfer:"20 -2048 0 0 0 -167.01 0 0 0 -160 0.0556356 0.0556356 0.0556356 240 1 1 1 3661 1 1 1",diffuse:"1",interpolation:"1"},{name:"CT-Air",gradientOpacity:"4 0 1 255 1",specularPower:"10",scalarOpacity:"8 -3024 0.705882 -900.0 0.715686 -500.0 0 3071 0",specular:"0.2",shade:"1",ambient:"0.1",colorTransfer:"16 -3024 1 1 1 -900.0 0.2 1.0 1.0 -500.0 0.3 0.3 1.0 3071 0 0 0 ",diffuse:"0.9",interpolation:"1"},{name:"MR-Angio",gradientOpacity:"4 0 1 255 1",specularPower:"1",scalarOpacity:"12 -2048 0 151.354 0 158.279 0.4375 190.112 0.580357 200.873 0.732143 3661 0.741071",specular:"0",shade:"1",ambient:"0.2",colorTransfer:"24 -2048 0 0 0 151.354 0 0 0 158.279 0.74902 0.376471 0 190.112 1 0.866667 0.733333 200.873 0.937255 0.937255 0.937255 3661 1 1 1",diffuse:"1",interpolation:"1"},{name:"MR-Default",gradientOpacity:"4 0 1 255 1",specularPower:"1",scalarOpacity:"12 0 0 20 0 40 0.15 120 0.3 220 0.375 1024 0.5",specular:"0",shade:"1",ambient:"0.2",colorTransfer:"24 0 0 0 0 20 0.168627 0 0 40 0.403922 0.145098 0.0784314 120 0.780392 0.607843 0.380392 220 0.847059 0.835294 0.788235 1024 1 1 1",diffuse:"1",interpolation:"1"},{name:"MR-MIP",gradientOpacity:"4 0 1 255 1",specularPower:"1",scalarOpacity:"8 0 0 98.3725 0 416.637 1 2800 1",specular:"0",shade:"0",ambient:"0.2",colorTransfer:"16 0 1 1 1 98.3725 1 1 1 416.637 1 1 1 2800 1 1 1",diffuse:"1",interpolation:"1"},{name:"MR-T2-Brain",gradientOpacity:"4 0 1 160.25 1",specularPower:"40",scalarOpacity:"10 0 0 36.05 0 218.302 0.171429 412.406 1 641 1",specular:"0.5",shade:"1",ambient:"0.3",colorTransfer:"16 0 0 0 0 98.7223 0.956863 0.839216 0.192157 412.406 0 0.592157 0.807843 641 1 1 1",diffuse:"0.6",interpolation:"1"},{name:"DTI-FA-Brain",gradientOpacity:"4 0 1 0.9950 1",specularPower:"40",scalarOpacity:"16 0 0 0 0 0.3501 0.0158 0.49379 0.7619 0.6419 1 0.9920 1 0.9950 0 0.9950 0",specular:"0.5",shade:"1",ambient:"0.3",colorTransfer:"28 0 1 0 0 0 1 0 0 0.24974 0.4941 1 0 0.49949 0 0.9882 1 0.7492 0.51764 0 1 0.9950 1 0 0 0.9950 1 0 0",diffuse:"0.9",interpolation:"1"}],q={},Y={get:e=>q[e],set:e=>{const t=e.id;q[t]=e},delete:e=>delete q[e],getAll:()=>{const e=Object.keys(q).map((e=>q[e]));return e.sort(((e,t)=>"_"===e.id[0]&&"_"!==t.id[0]?1:"_"!==e.id[0]&&"_"===t.id[0]?-1:0)),e}},$=Y;const Q=new class{constructor(){this.listeners={}}reset(){this.listeners={}}addEventListener(e,t){this.listeners[e]||(this.listeners[e]=[]),-1===this.listeners[e].indexOf(t)&&this.listeners[e].push(t)}removeEventListener(e,t){if(!this.listeners[e])return;const r=this.listeners[e],n=r.length;for(let e=0;ee/(t+2))).slice(1,-1).reduce(((e,t)=>{const a=((e,t,r)=>t-r/4*Math.log((1-e)/e))(t,n,r);return e.concat(a,t,t,t,.5,0)}),[]),o=te.ZP.newInstance();return o.buildFunctionFromArray(re.ZP.newInstance({values:a,numberOfComponents:6})),o}function ae(e){let t=[];const[r,n]=e.getRange();e.getTable(r,n,1024,t),t=t.filter(((e,t)=>t%3==0));const a=[...Array(1024).keys()].map(((e,t)=>r+(n-r)/1023*t)),o=t[256],i=Math.log((1-o)/o),s=a[256],l=t[768],c=Math.log((1-l)/l),u=a[768],d=Math.round(4*(u-s)/(i-c)),f=Math.round(s+d*i/4);return[Math.round(f-d/2),Math.round(f+d/2)]}function oe(e){const t=te.ZP.newInstance();let r=0,n=1024;return e&&void 0!==e.lower&&void 0!==e.upper&&(r=e.lower,n=e.upper),t.addRGBPoint(r,0,0,0),t.addRGBPoint(n,1,1,1),t}function ie(e,t){const r=e.getSize();for(let n=0;n(e^crypto.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)))}function ce(e){let t,r=e[0],n=e[0];const a=e.length;for(let o=1;o0?r:fe)>>>0).join("string"==typeof t?t:pe)}function me(e){const t=e.indexOf(":");return e.substring(t+1)}const he={},ve={add:(e,t)=>{const r=me(e);he[r]=t},get:(e,t)=>{if("calibratedPixelSpacing"===e){const e=me(t);return he[e]}}};function ye(e,t,r){return Math.abs(e-t)<=r}function be(e){return"number"==typeof e}function Te(e){return"length"in e&&"number"==typeof e[0]}function Ce(e,t,r=1e-5){return typeof e==typeof t&&null!==e&&null!==t&&(be(e)&&be(t)?ye(e,t,r):!(!Te(e)||!Te(t))&&function(e,t,r=1e-5){if(e.length!==t.length)return!1;for(let n=0;n{if(Oe)return;const{userAgent:e,platform:t,maxTouchPoints:r}=window.navigator,n=/(iphone|ipod|ipad)/i.test(e),a="iPad"===t||"MacIntel"===t&&r>0&&!window.MSStream;return{isIpad:a,isMobile:/android/i.test(e)||n||a,isSafari12:/Version\/12.+Safari/.test(e)}})();const Ae=[],Re=[];function Ee(e,t){if(e===t)return 0;const r=e;e.length>t.length&&(e=t,t=r);let n=e.length,a=t.length;for(;n>0&&e.charCodeAt(~-n)===t.charCodeAt(~-a);)n--,a--;let o,i=0;for(;ic?l>c?c+1:l:l>s?s+1:l;return c}function Me(e){return null!=e}class De extends Error{constructor(e){super(e),Object.setPrototypeOf(this,new.target.prototype)}}const Ve=({mobileTiers:e=[0,15,30,60],desktopTiers:t=[0,15,30,60],override:r={},glContext:n,failIfMajorPerformanceCaveat:a=!1,benchmarksURL:o="https://unpkg.com/detect-gpu@4.0.50/dist/benchmarks"}={})=>Se(void 0,void 0,void 0,(function*(){const i={};if(Oe)return{tier:0,type:"SSR"};const{isIpad:s=!!(null==Ie?void 0:Ie.isIpad),isMobile:l=!!(null==Ie?void 0:Ie.isMobile),screenSize:c=window.screen,loadBenchmarks:u=(e=>Se(void 0,void 0,void 0,(function*(){const t=yield fetch(`${o}/${e}`).then((e=>e.json()));if(parseInt(t.shift().split(".")[0],10)<4)throw new De("Detect GPU benchmark data is out of date. Please update to version 4x");return t})))}=r;let{renderer:d}=r;const f=(e,t,r,n,a)=>({device:a,fps:n,gpu:r,isMobile:l,tier:e,type:t});let p,g="";if(d)d=we(d),p=[d];else{const e=n||function(e,t=!1){const r={alpha:!1,antialias:!1,depth:!1,failIfMajorPerformanceCaveat:t,powerPreference:"high-performance",stencil:!1};e&&delete r.powerPreference;const n=window.document.createElement("canvas"),a=n.getContext("webgl",r)||n.getContext("experimental-webgl",r);return null!=a?a:void 0}(null==Ie?void 0:Ie.isSafari12,a);if(!e)return f(0,"WEBGL_UNSUPPORTED");const t=e.getExtension("WEBGL_debug_renderer_info");if(t&&(d=e.getParameter(t.UNMASKED_RENDERER_WEBGL)),!d)return f(1,"FALLBACK");g=d,d=we(d),p=function(e,t,r){return"apple gpu"===t?function(e,t,r){if(!r)return[t];const n=function(e){const t=e.createShader(35633),r=e.createShader(35632),n=e.createProgram();if(!(r&&t&&n))return;e.shaderSource(t,"\n precision highp float;\n attribute vec3 aPosition;\n varying float vvv;\n void main() {\n vvv = 0.31622776601683794;\n gl_Position = vec4(aPosition, 1.0);\n }\n "),e.shaderSource(r,"\n precision highp float;\n varying float vvv;\n void main() {\n vec4 enc = vec4(1.0, 255.0, 65025.0, 16581375.0) * vvv;\n enc = fract(enc);\n enc -= enc.yzww * vec4(1.0 / 255.0, 1.0 / 255.0, 1.0 / 255.0, 0.0);\n gl_FragColor = enc;\n }\n "),e.compileShader(t),e.compileShader(r),e.attachShader(n,t),e.attachShader(n,r),e.linkProgram(n),e.detachShader(n,t),e.detachShader(n,r),e.deleteShader(t),e.deleteShader(r),e.useProgram(n);const a=e.createBuffer();e.bindBuffer(34962,a),e.bufferData(34962,new Float32Array([-1,-1,0,3,-1,0,-1,3,0]),35044);const o=e.getAttribLocation(n,"aPosition");e.vertexAttribPointer(o,3,5126,!1,0,0),e.enableVertexAttribArray(o),e.clearColor(1,1,1,1),e.clear(16384),e.viewport(0,0,1,1),e.drawArrays(4,0,3);const i=new Uint8Array(4);return e.readPixels(0,0,1,1,6408,5121,i),e.deleteProgram(n),e.deleteBuffer(a),i.join("")}(e),a="801621810",o="8016218135",i="80162181161",s=(null==Ie?void 0:Ie.isIpad)?[["a7",i,12],["a8",o,15],["a8x",o,15],["a9",o,15],["a9x",o,15],["a10",o,15],["a10x",o,15],["a12",a,15],["a12x",a,15],["a12z",a,15],["a14",a,15],["m1",a,15]]:[["a7",i,12],["a8",o,12],["a9",o,15],["a10",o,15],["a11",a,15],["a12",a,15],["a13",a,15],["a14",a,15]];let l;return"80162181255"===n?l=s.filter((([,,e])=>e>=14)):(l=s.filter((([,e])=>e===n)),l.length||(l=s)),l.map((([e])=>`apple ${e} gpu`))}(e,t,r):[t]}(e,d,l)}const m=(yield Promise.all(p.map((function(e){var t;return Se(this,void 0,void 0,(function*(){const r=(e=>{const t=l?["adreno","apple","mali-t","mali","nvidia","powervr"]:["intel","apple","amd","radeon","nvidia","geforce"];for(const r of t)if(e.includes(r))return r})(e);if(!r)return;const n=`${l?"m":"d"}-${r}${s?"-ipad":""}.json`,a=i[n]=null!==(t=i[n])&&void 0!==t?t:u(n);let o;try{o=yield a}catch(r){if(r instanceof De)throw r;return}const d=function(e){var t;const r=(e=e.replace(/\([^)]+\)/,"")).match(/\d+/)||e.match(/(\W|^)([A-Za-z]{1,3})(\W|$)/g);return null!==(t=null==r?void 0:r.join("").replace(/\W|amd/g,""))&&void 0!==t?t:""}(e);let f=o.filter((([,e])=>e===d));f.length||(f=o.filter((([t])=>t.includes(e))));const p=f.length;if(0===p)return;let g,[m,,,h]=p>1?f.map((t=>[t,Ee(e,t[0])])).sort((([,e],[,t])=>e-t))[0][0]:f[0],v=Number.MAX_VALUE;const{devicePixelRatio:y}=window,b=c.width*y*c.height*y;for(const e of h){const[t,r]=e,n=t*r,a=Math.abs(b-n);ae===r?t-n:e-r));if(!m.length){const e=Pe.find((e=>d.includes(e)));return e?f(0,"BLOCKLISTED",e):f(1,"FALLBACK",`${d} (${g})`)}const[,h,v,y]=m[0];if(-1===h)return f(0,"BLOCKLISTED",v,h,y);const b=l?e:t;let T=0;for(let e=0;e=b[e]&&(T=e);return f(T,"BENCHMARK",v,h,y)}));function Le(e){return $.get(e)}function _e(){return $.getAll()}const Ne=Le;let Be=!1,Fe=!0,Ue=R.TRUE;const ke={gpuTier:void 0,detectGPUConfig:{},rendering:{useCPURendering:!1,preferSizeOverAccuracy:!1,useNorm16Texture:!1,strictZSpacingForVolumeViewport:!0}};let Ge={gpuTier:void 0,detectGPUConfig:{},rendering:{useCPURendering:!1,preferSizeOverAccuracy:!1,useNorm16Texture:!1,strictZSpacingForVolumeViewport:!0}};function We(){const e=function(){const e=document.createElement("canvas");return e.getContext("webgl2")||e.getContext("webgl")||e.getContext("experimental-webgl")}();return e instanceof WebGLRenderingContext||e instanceof WebGL2RenderingContext}async function ze(e=Ge){if(Be)return Be;Ge=Dd(ke,e);return We()?(Ge.gpuTier=Ge.gpuTier||await Ve(Ge.detectGPUConfig),console.log("CornerstoneRender: Using detect-gpu to get the GPU benchmark:",Ge.gpuTier),Ge.gpuTier.tier<1?(console.log("CornerstoneRender: GPU is not powerful enough, using CPU rendering"),Ge.rendering.useCPURendering=!0):console.log("CornerstoneRender: using GPU rendering")):(console.log("CornerstoneRender: GPU not detected, using CPU rendering"),Ge.rendering.useCPURendering=!0),Xe(Ue),Be=!0,Be}function je(e){Ge.rendering.useCPURendering=e,Be=!0,et()}function He(e){Ge.rendering.preferSizeOverAccuracy=e,Be=!0,et()}function Ke(){Ge.rendering.useCPURendering=!We(),et()}function Ze(){return Ge.rendering.useCPURendering}function Xe(e){if(e!=R.AUTO)return e==R.TRUE||1==e?(Ue=R.TRUE,void(Fe=!0)):e==R.FALSE||0==e?(Ue=R.FALSE,void(Fe=!1)):void 0;Ue=R.AUTO;(function(){try{return!!new SharedArrayBuffer(0)}catch{return!1}})()?(Fe=!0,console.log("CornerstoneRender: using SharedArrayBuffer")):(Fe=!1,console.warn("CornerstoneRender: SharedArray Buffer not allowed, performance may be slower.\n Try ensuring page is cross-origin isolated to enable SharedArrayBuffer."))}function qe(){Xe(Ue)}function Ye(){return Fe}function $e(){return Be}function Qe(){return Ge}function Je(e){Ge=e,et()}function et(){_e().forEach((e=>e.getViewports().forEach((e=>e.updateRenderingPipeline?.()))))}const tt=function(e){if(!Ye())throw new Error("Your page is NOT cross-origin isolated, see https://developer.mozilla.org/en-US/docs/Web/API/crossOriginIsolated");if(void 0===window.SharedArrayBuffer)throw new Error("SharedArrayBuffer is NOT supported in your browser see https://developer.chrome.com/blog/enabling-shared-array-buffer/");const t=new SharedArrayBuffer(e);return new Uint8Array(t)};const rt=function(e){if(!Ye())throw new Error("Your page is NOT cross-origin isolated, see https://developer.mozilla.org/en-US/docs/Web/API/crossOriginIsolated");if(void 0===window.SharedArrayBuffer)throw new Error("SharedArrayBuffer is NOT supported in your browser see https://developer.chrome.com/blog/enabling-shared-array-buffer/");const t=new SharedArrayBuffer(4*e);return new Float32Array(t)};const nt=function(e){if(!window.crossOriginIsolated)throw new Error("Your page is NOT cross-origin isolated, see https://developer.mozilla.org/en-US/docs/Web/API/crossOriginIsolated");if(void 0===window.SharedArrayBuffer)throw new Error("SharedArrayBuffer is NOT supported in your browser see https://developer.chrome.com/blog/enabling-shared-array-buffer/");const t=new SharedArrayBuffer(2*e);return new Uint16Array(t)};const at=function(e){if(!window.crossOriginIsolated)throw new Error("Your page is NOT cross-origin isolated, see https://developer.mozilla.org/en-US/docs/Web/API/crossOriginIsolated");if(void 0===window.SharedArrayBuffer)throw new Error("SharedArrayBuffer is NOT supported in your browser see https://developer.chrome.com/blog/enabling-shared-array-buffer/");const t=new SharedArrayBuffer(2*e);return new Int16Array(t)};var ot=r(45451);const it=[];function st(e,t=0){let r;for(r=0;r0;)it.pop()}function ut(e,t){for(let r=0;r{if(!e||"number"!=typeof e){const e=`New max cacheSize ${this._maxCacheSize} should be defined and should be a number.`;throw new Error(e)}this._maxCacheSize=e},this.isCacheable=e=>{if(e>this._maxInstanceSize)return!1;return this.getBytesAvailable()+this._imageCacheSize>e},this.getMaxCacheSize=()=>this._maxCacheSize,this.getMaxInstanceSize=()=>this._maxInstanceSize,this.getCacheSize=()=>this._imageCacheSize+this._volumeCacheSize,this._decacheImage=e=>{const{imageLoadObject:t}=this._imageCache.get(e);t.cancelFn&&t.cancelFn(),t.decache&&t.decache(),this._imageCache.delete(e)},this._decacheVolume=e=>{const t=this._volumeCache.get(e),{volumeLoadObject:r,volume:n}=t;n.cancelLoading&&n.cancelLoading(),n.imageData&&n.imageData.delete(),r.cancelFn&&r.cancelFn(),r.decache&&r.decache(),this._volumeCache.delete(e)},this.purgeCache=()=>{const e=this._imageCache.keys();for(;;){const{value:t,done:r}=e.next();if(r)break;this.removeImageLoadObject(t),se(J,g.IMAGE_CACHE_IMAGE_REMOVED,{imageId:t})}this.purgeVolumeCache()},this.purgeVolumeCache=()=>{const e=this._volumeCache.keys();for(;;){const{value:t,done:r}=e.next();if(r)break;this.removeVolumeLoadObject(t),se(J,g.VOLUME_CACHE_VOLUME_REMOVED,{volumeId:t})}},this.getVolumeLoadObject=e=>{if(void 0===e)throw new Error("getVolumeLoadObject: volumeId must not be undefined");const t=this._volumeCache.get(e);if(void 0!==t)return t.timeStamp=Date.now(),t.volumeLoadObject},this.getGeometry=e=>{if(null==e)throw new Error("getGeometry: geometryId must not be undefined");const t=this._geometryCache.get(e);if(void 0!==t)return t.timeStamp=Date.now(),t.geometry},this.getVolume=e=>{if(void 0===e)throw new Error("getVolume: volumeId must not be undefined");const t=this._volumeCache.get(e);if(void 0!==t)return t.timeStamp=Date.now(),t.volume},this.removeImageLoadObject=e=>{if(void 0===e)throw new Error("removeImageLoadObject: imageId must not be undefined");const t=this._imageCache.get(e);if(void 0===t)throw new Error("removeImageLoadObject: imageId was not present in imageCache");this._incrementImageCacheSize(-t.sizeInBytes);const r={imageId:e};se(J,g.IMAGE_CACHE_IMAGE_REMOVED,r),this._decacheImage(e)},this.removeVolumeLoadObject=e=>{if(void 0===e)throw new Error("removeVolumeLoadObject: volumeId must not be undefined");const t=this._volumeCache.get(e);if(void 0===t)throw new Error("removeVolumeLoadObject: volumeId was not present in volumeCache");this._incrementVolumeCacheSize(-t.sizeInBytes);const r={volume:t,volumeId:e};se(J,g.VOLUME_CACHE_VOLUME_REMOVED,r),this._decacheVolume(e)},this.putGeometryLoadObject=(e,t)=>{if(null==e)throw new Error("putGeometryLoadObject: geometryId must not be undefined");if(this._geometryCache.has(e))throw new Error("putGeometryLoadObject: geometryId already present in geometryCache");const r={geometryId:e,geometryLoadObject:t,loaded:!1,timeStamp:Date.now(),sizeInBytes:0};return this._geometryCache.set(e,r),t.promise.then((t=>{if(!this._geometryCache.has(e))return void console.warn("putGeometryLoadObject: geometryId was removed from geometryCache");if(Number.isNaN(t.sizeInBytes))throw new Error("putGeometryLoadObject: geometry.sizeInBytes is not a number");r.loaded=!0,r.geometry=t,r.sizeInBytes=t.sizeInBytes;const n={geometry:t,geometryId:e};se(J,g.GEOMETRY_CACHE_GEOMETRY_ADDED,n)})).catch((t=>{throw this._geometryCache.delete(e),t}))},this._incrementImageCacheSize=e=>{this._imageCacheSize+=e},this._incrementVolumeCacheSize=e=>{this._volumeCacheSize+=e},this._geometryCache=new Map}getBytesAvailable(){return this.getMaxCacheSize()-this.getCacheSize()}decacheIfNecessaryUntilBytesAvailable(e,t){let r=this.getBytesAvailable();if(r>=e)return r;let n=Array.from(this._imageCache.values());n.sort((function(e,t){return e.timeStamp>t.timeStamp?1:e.timeStampe.imageId)),o=a;t&&(o=a.filter((e=>!t.includes(e))));for(const t of o)if(this.removeImageLoadObject(t),se(J,g.IMAGE_CACHE_IMAGE_REMOVED,{imageId:t}),r=this.getBytesAvailable(),r>=e)return r;n=Array.from(this._imageCache.values()),a=n.map((e=>e.imageId));for(const t of a)if(this.removeImageLoadObject(t),se(J,g.IMAGE_CACHE_IMAGE_REMOVED,{imageId:t}),r=this.getBytesAvailable(),r>=e)return r}putImageLoadObject(e,t){if(void 0===e)throw new Error("putImageLoadObject: imageId must not be undefined");if(void 0===t.promise)throw new Error("putImageLoadObject: imageLoadObject.promise must not be undefined");if(this._imageCache.has(e))throw new Error("putImageLoadObject: imageId already in cache");if(t.cancelFn&&"function"!=typeof t.cancelFn)throw new Error("putImageLoadObject: imageLoadObject.cancel must be a function");const r={loaded:!1,imageId:e,sharedCacheKey:void 0,imageLoadObject:t,timeStamp:Date.now(),sizeInBytes:0};return this._imageCache.set(e,r),t.promise.then((t=>{if(!this._imageCache.get(e))return void console.warn("The image was purged from the cache before it completed loading.");if(Number.isNaN(t.sizeInBytes))throw new Error("putImageLoadObject: image.sizeInBytes must not be undefined");if(void 0===t.sizeInBytes.toFixed)throw new Error("putImageLoadObject: image.sizeInBytes is not a number");if(!this.isCacheable(t.sizeInBytes))throw new Error(g.CACHE_SIZE_EXCEEDED);this.decacheIfNecessaryUntilBytesAvailable(t.sizeInBytes),r.loaded=!0,r.image=t,r.sizeInBytes=t.sizeInBytes,this._incrementImageCacheSize(r.sizeInBytes);const n={image:r};se(J,g.IMAGE_CACHE_IMAGE_ADDED,n),r.sharedCacheKey=t.sharedCacheKey})).catch((t=>{throw this._imageCache.delete(e),t}))}getImageLoadObject(e){if(void 0===e)throw new Error("getImageLoadObject: imageId must not be undefined");const t=this._imageCache.get(e);if(void 0!==t)return t.timeStamp=Date.now(),t.imageLoadObject}isLoaded(e){const t=this._imageCache.get(e);return!!t&&t.loaded}getVolumeContainingImageId(e){const t=Array.from(this._volumeCache.keys()),r=me(e);for(const e of t){const t=this._volumeCache.get(e),{volume:n}=t;if(!n?.imageIds?.length)return;const a=n.getImageURIIndex(r);if(a>-1)return{volume:n,imageIdIndex:a}}}getCachedImageBasedOnImageURI(e){const t=me(e),r=Array.from(this._imageCache.keys()).find((e=>me(e)===t));if(r)return this._imageCache.get(r)}putVolumeLoadObject(e,t){if(void 0===e)throw new Error("putVolumeLoadObject: volumeId must not be undefined");if(void 0===t.promise)throw new Error("putVolumeLoadObject: volumeLoadObject.promise must not be undefined");if(this._volumeCache.has(e))throw new Error(`putVolumeLoadObject: volumeId:${e} already in cache`);if(t.cancelFn&&"function"!=typeof t.cancelFn)throw new Error("putVolumeLoadObject: volumeLoadObject.cancel must be a function");const r={loaded:!1,volumeId:e,volumeLoadObject:t,timeStamp:Date.now(),sizeInBytes:0};return this._volumeCache.set(e,r),t.promise.then((t=>{if(!this._volumeCache.get(e))return void console.warn("The image was purged from the cache before it completed loading.");if(Number.isNaN(t.sizeInBytes))throw new Error("putVolumeLoadObject: volume.sizeInBytes must not be undefined");if(void 0===t.sizeInBytes.toFixed)throw new Error("putVolumeLoadObject: volume.sizeInBytes is not a number");this.decacheIfNecessaryUntilBytesAvailable(t.sizeInBytes,t.imageIds),r.volume=t,r.sizeInBytes=t.sizeInBytes,this._incrementVolumeCacheSize(r.sizeInBytes);const n={volume:r};se(J,g.VOLUME_CACHE_VOLUME_ADDED,n)})).catch((t=>{throw this._volumeCache.delete(e),t}))}},mt=gt;var ht=r(41168),vt=ht.default.vtkErrorMacro;var yt={renderable:null,myFactory:null,children:[],visited:!1};function bt(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,yt,r),ht.default.obj(e,t),ht.default.event(e,t,"event"),t._renderableChildMap=new Map,ht.default.get(e,t,["visited"]),ht.default.setGet(e,t,["_parent","renderable","myFactory"]),ht.default.getArray(e,t,["children"]),ht.default.moveToProtected(e,t,["parent"]),function(e,t){t.classHierarchy.push("vtkViewNode"),e.build=function(e){},e.render=function(e){},e.traverse=function(r){var n=r.getTraverseOperation(),a=e[n];if(a)a(r);else{e.apply(r,!0);for(var o=0;o2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,Ct,r),ht.default.obj(e,t),function(e,t){t.overrides||(t.overrides={}),t.classHierarchy.push("vtkViewNodeFactory"),e.createNode=function(r){if(r.isDeleted())return null;for(var n=0,a=r.getClassName(n++),o=!1,i=Object.keys(t.overrides);a&&!o;)-1!==i.indexOf(a)?o=!0:a=r.getClassName(n++);if(!o)return null;var s=t.overrides[a]();return s.setMyFactory(e),s},e.registerOverride=function(e,r){t.overrides[e]=r}}(e,t)}var St={newInstance:ht.default.newInstance(xt,"vtkViewNodeFactory"),extend:xt},Pt=Object.create(null);function wt(e,t){Pt[e]=t}var Ot={};function It(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,Ot,r),t.overrides=Pt,St.extend(e,t,r),function(e,t){t.classHierarchy.push("vtkOpenGLViewNodeFactory")}(0,t)}var At={newInstance:ht.default.newInstance(It,"vtkOpenGLViewNodeFactory"),extend:It};var Rt={context:null,lastRenderer:null,keyMatrixTime:null,keyMatrices:null};function Et(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,Rt,r),Tt.extend(e,t,r),t.keyMatrixTime={},(0,ht.j6)(t.keyMatrixTime),t.keyMatrices={normalMatrix:new Float64Array(9),vcpc:new Float64Array(16),wcvc:new Float64Array(16),wcpc:new Float64Array(16)},(0,ht.g2)(e,t,["context","keyMatrixTime"]),function(e,t){t.classHierarchy.push("vtkOpenGLCamera"),e.buildPass=function(r){r&&(t._openGLRenderer=e.getFirstAncestorOfType("vtkOpenGLRenderer"),t._openGLRenderWindow=t._openGLRenderer.getParent(),t.context=t._openGLRenderWindow.getContext())},e.opaquePass=function(e){if(e){var r=t._openGLRenderer.getTiledSizeAndOrigin();t.context.viewport(r.lowerLeftU,r.lowerLeftV,r.usize,r.vsize),t.context.scissor(r.lowerLeftU,r.lowerLeftV,r.usize,r.vsize)}},e.translucentPass=e.opaquePass,e.zBufferPass=e.opaquePass,e.opaqueZBufferPass=e.opaquePass,e.volumePass=e.opaquePass,e.getKeyMatrices=function(r){if(r!==t.lastRenderer||t._openGLRenderWindow.getMTime()>t.keyMatrixTime.getMTime()||e.getMTime()>t.keyMatrixTime.getMTime()||r.getMTime()>t.keyMatrixTime.getMTime()||t.renderable.getMTime()>t.keyMatrixTime.getMTime()){ot._E.copy(t.keyMatrices.wcvc,t.renderable.getViewMatrix()),ot.wO.fromMat4(t.keyMatrices.normalMatrix,t.keyMatrices.wcvc),ot.wO.invert(t.keyMatrices.normalMatrix,t.keyMatrices.normalMatrix),ot._E.transpose(t.keyMatrices.wcvc,t.keyMatrices.wcvc);var n=t._openGLRenderer.getAspectRatio();ot._E.copy(t.keyMatrices.vcpc,t.renderable.getProjectionMatrix(n,-1,1)),ot._E.transpose(t.keyMatrices.vcpc,t.keyMatrices.vcpc),ot._E.multiply(t.keyMatrices.wcpc,t.keyMatrices.vcpc,t.keyMatrices.wcvc),t.keyMatrixTime.modified(),t.lastRenderer=r}return t.keyMatrices}}(e,t)}var Mt=(0,ht.WL)(Et),Dt={newInstance:Mt,extend:Et};wt("vtkCamera",Mt);var Vt=ht.eR;var Lt={context:null,selector:null};function _t(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,Lt,r),Tt.extend(e,t,r),(0,ht.U2)(e,t,["shaderCache"]),(0,ht.g2)(e,t,["selector"]),(0,ht.B6)(e,t,["openGLRenderWindow"]),function(e,t){t.classHierarchy.push("vtkOpenGLRenderer"),e.buildPass=function(r){if(r){if(!t.renderable)return;e.updateLights(),e.prepareNodes(),e.addMissingNode(t.renderable.getActiveCamera()),e.addMissingNodes(t.renderable.getViewPropsWithNestedProps()),e.removeUnusedNodes()}},e.updateLights=function(){for(var e=0,r=t.renderable.getLightsByReference(),n=0;n0&&e++;return e||(Vt("No lights are on, creating one."),t.renderable.createLight()),e},e.zBufferPass=function(r){if(r){var n=0,a=t.context;t.renderable.getTransparent()||(t.context.clearColor(1,0,0,1),n|=a.COLOR_BUFFER_BIT),t.renderable.getPreserveDepthBuffer()||(a.clearDepth(1),n|=a.DEPTH_BUFFER_BIT,t.context.depthMask(!0));var o=e.getTiledSizeAndOrigin();a.enable(a.SCISSOR_TEST),a.scissor(o.lowerLeftU,o.lowerLeftV,o.usize,o.vsize),a.viewport(o.lowerLeftU,o.lowerLeftV,o.usize,o.vsize),a.colorMask(!0,!0,!0,!0),n&&a.clear(n),a.enable(a.DEPTH_TEST)}},e.opaqueZBufferPass=function(t){return e.zBufferPass(t)},e.cameraPass=function(t){t&&e.clear()},e.getAspectRatio=function(){var e=t._parent.getSizeByReference(),r=t.renderable.getViewportByReference();return e[0]*(r[2]-r[0])/((r[3]-r[1])*e[1])},e.getTiledSizeAndOrigin=function(){var e=t.renderable.getViewportByReference(),r=[0,0,1,1],n=e[0]-r[0],a=e[1]-r[1],o=t._parent.normalizedDisplayToDisplay(n,a),i=Math.round(o[0]),s=Math.round(o[1]),l=e[2]-r[0],c=e[3]-r[1],u=t._parent.normalizedDisplayToDisplay(l,c),d=Math.round(u[0])-i,f=Math.round(u[1])-s;return d<0&&(d=0),f<0&&(f=0),{usize:d,vsize:f,lowerLeftU:i,lowerLeftV:s}},e.clear=function(){var r=0,n=t.context;if(!t.renderable.getTransparent()){var a=t.renderable.getBackgroundByReference();t.context.clearColor(a[0],a[1],a[2],a[3]),r|=n.COLOR_BUFFER_BIT}t.renderable.getPreserveDepthBuffer()||(n.clearDepth(1),r|=n.DEPTH_BUFFER_BIT,t.context.depthMask(!0)),n.colorMask(!0,!0,!0,!0);var o=e.getTiledSizeAndOrigin();n.enable(n.SCISSOR_TEST),n.scissor(o.lowerLeftU,o.lowerLeftV,o.usize,o.vsize),n.viewport(o.lowerLeftU,o.lowerLeftV,o.usize,o.vsize),r&&n.clear(r),n.enable(n.DEPTH_TEST)},e.releaseGraphicsResources=function(){null!==t.selector&&t.selector.releaseGraphicsResources()},e.setOpenGLRenderWindow=function(r){t._openGLRenderWindow!==r&&(e.releaseGraphicsResources(),t._openGLRenderWindow=r,t.context=null,r&&(t.context=t._openGLRenderWindow.getContext()))}}(e,t)}var Nt=(0,ht.WL)(_t,"vtkOpenGLRenderer"),Bt={newInstance:Nt,extend:_t};wt("vtkRenderer",Nt);var Ft=r(16976),Ut=r(72688),kt=r(75755),Gt=r(17197),Wt=r(1299),zt=ht.default.vtkErrorMacro,jt=function(){function e(){(0,Ut.Z)(this,e),this.segmentMapping={},this.segments=[null],this.faces=[]}return(0,kt.Z)(e,[{key:"addSegment",value:function(e){var t=e[0],r=e[e.length-1];if(!(t===r||e.length<2)){var n=this.segmentMapping[t],a=this.segmentMapping[r];if(void 0!==n&&void 0!==a)if(Math.abs(n)===Math.abs(a)){var o=n0)for(var s=1;s0){for(var p=this.segments[n],g=1;g0){for(var v=this.segments[a],y=1;y2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,Ht,r),ht.default.obj(e,t),ht.default.algo(e,t,1,1),function(e,t){t.classHierarchy.push("vtkClosedPolyLineToSurfaceFilter"),e.requestData=function(e,t){var r=e[0];if(r){var n=Wt.ZP.newInstance();n.shallowCopy(r);for(var a=new jt,o=r.getLines().getData(),i=0;i=t.length&&n.stripIdx>=r.length,e}};return n}(e);!g.done;){var m=g.next();if(!(m.length<=2)){for(var h=[],v=void 0,y=0;y0,T=!0,C=1;C0!==b){T=!1;break}}if(!T){for(var x=[],S=0;S0;if(h[P]>0!==w){var O=S,I=P,A=h[I]-h[O];A<=0&&(O=P,I=S,A*=-1);var R=0;0!==A&&(R=(t.cutValue-h[O])/A);var E=m[O],M=m[I];f[0]=a[3*E],f[1]=a[3*E+1],f[2]=a[3*E+2],p[0]=a[3*M],p[1]=a[3*M+1],p[2]=a[3*M+2];var D=[f[0]+R*(p[0]-f[0]),f[1]+R*(p[1]-f[1]),f[2]+R*(p[2]-f[2])];x.push({pointEdge1:E,pointEdge2:M,intersectedPoint:D,newPointID:-1})}}for(var V=0;V2&&(l.push(k),x.forEach((function(e){l.push(e.newPointID)})))}}}r.getPoints().setData((0,ht.MR)(n.getDataType(),i),3),0!==s.length&&r.getLines().setData(Uint16Array.from(s)),0!==l.length&&r.getPolys().setData(Uint16Array.from(l))}e.getMTime=function(){var e=r.getMTime();return t.cutFunction?e=Math.max(e,t.cutFunction.getMTime()):e},e.requestData=function(e,r){var a=e[0];if(a)if(t.cutFunction){var o=Wt.ZP.newInstance();n(a,o),r[0]=o}else $t("Missing cut function");else $t("Invalid or missing input")}}var Jt={cutFunction:null,cutScalars:null,cutValue:0};function er(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,Jt,r),(0,ht.j6)(e,t),(0,ht.Uw)(e,t,1,1),(0,ht.g2)(e,t,["cutFunction","cutValue"]),Qt(e,t)}var tr={newInstance:(0,ht.WL)(er,"vtkCutter"),extend:er},rr={ARRAY_BUFFER:0,ELEMENT_ARRAY_BUFFER:1,TEXTURE_BUFFER:2},nr={ObjectType:rr};function ar(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function or(e){for(var t=1;t2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,sr,r),ht.default.obj(e,t),ht.default.get(e,t,["_openGLRenderWindow"]),ht.default.moveToProtected(e,t,["openGLRenderWindow"]),function(e,t){function r(e){switch(e){case ir.ELEMENT_ARRAY_BUFFER:return t.context.ELEMENT_ARRAY_BUFFER;case ir.TEXTURE_BUFFER:if("TEXTURE_BUFFER"in t.context)return t.context.TEXTURE_BUFFER;case ir.ARRAY_BUFFER:default:return t.context.ARRAY_BUFFER}}t.classHierarchy.push("vtkOpenGLBufferObject");var n=null,a=null,o=!0,i="";e.getType=function(){return n},e.setType=function(e){n=e},e.getHandle=function(){return a},e.isReady=function(){return!1===o},e.generateBuffer=function(e){var o=r(e);return null===a&&(a=t.context.createBuffer(),n=e),r(n)===o},e.upload=function(s,l){return e.generateBuffer(l)?(t.context.bindBuffer(r(n),a),t.context.bufferData(r(n),s,t.context.STATIC_DRAW),o=!1,!0):(i="Trying to upload array buffer to incompatible buffer.",!1)},e.bind=function(){return!!a&&(t.context.bindBuffer(r(n),a),!0)},e.release=function(){return!!a&&(t.context.bindBuffer(r(n),null),!0)},e.releaseGraphicsResources=function(){null!==a&&(t.context.bindBuffer(r(n),null),t.context.deleteBuffer(a),a=null)},e.setOpenGLRenderWindow=function(r){t._openGLRenderWindow!==r&&(e.releaseGraphicsResources(),t._openGLRenderWindow=r,t.context=null,r&&(t.context=t._openGLRenderWindow.getContext()))},e.getError=function(){return i}}(e,t)}var cr=or(or({newInstance:ht.default.newInstance(lr),extend:lr},{}),nr),ur=r(42695),dr=ht.default.vtkErrorMacro;function fr(e,t){t.classHierarchy.push("vtkOpenGLCellArrayBufferObject"),e.setType(rr.ARRAY_BUFFER),e.createVBO=function(r,n,a,o){var i=arguments.length>4&&void 0!==arguments[4]?arguments[4]:null;if(!r.getData()||!r.getData().length)return t.elementCount=0,0;t.blockSize=3,t.vertexOffset=0,t.normalOffset=0,t.tCoordOffset=0,t.tCoordComponents=0,t.colorComponents=0,t.colorOffset=0,t.customData=[];var s=o.points.getData(),l=null,c=null,u=null,d=o.colors?o.colors.getNumberOfComponents():0,f=o.tcoords?o.tcoords.getNumberOfComponents():0;o.normals&&(t.normalOffset=4*t.blockSize,t.blockSize+=3,l=o.normals.getData()),o.customAttributes&&o.customAttributes.forEach((function(e){e&&(t.customData.push({data:e.getData(),offset:4*t.blockSize,components:e.getNumberOfComponents(),name:e.getName()}),t.blockSize+=e.getNumberOfComponents())})),o.tcoords&&(t.tCoordOffset=4*t.blockSize,t.tCoordComponents=f,t.blockSize+=f,c=o.tcoords.getData()),o.colors?(t.colorComponents=o.colors.getNumberOfComponents(),t.colorOffset=0,u=o.colors.getData(),t.colorBO||(t.colorBO=cr.newInstance()),t.colorBO.setOpenGLRenderWindow(t._openGLRenderWindow)):t.colorBO=null,t.stride=4*t.blockSize;var p,g=0,m=0,h=0,v=0,y=0,b=0,T={anythingToPoints:function(e,t,r){for(var n=0;n2)for(var n=0;n2){for(var n=0;n1?2*(e-1):0},polysToWireframe:function(e,t){return e>2?2*e:0},stripsToWireframe:function(e,t){return e>2?4*e-6:0},polysToSurface:function(e,t){return e>2?3*(e-2):0},stripsToSurface:function(e,t,r){return e>2?3*(e-2):0}},x=null,S=null;a===ur.hX.POINTS||"verts"===n?(x=T.anythingToPoints,S=C.anythingToPoints):a===ur.hX.WIREFRAME||"lines"===n?(x=T["".concat(n,"ToWireframe")],S=C["".concat(n,"ToWireframe")]):(x=T["".concat(n,"ToSurface")],S=C["".concat(n,"ToSurface")]);for(var P=r.getData(),w=P.length,O=0,I=0;I0&&(Math.abs(V)/D>1e6||Math.abs(Math.log10(D))>3||0===D&&V>1e6)){for(var F=new Float64Array(3),U=new Float64Array(3),k=0;k<3;++k){var G=o.points.getRange(k),W=G[1]-G[0];F[k]=.5*(G[1]+G[0]),U[k]=W>0?1/W:1}e.setCoordShiftAndScale(F,U)}else!0===t.coordShiftAndScaleEnabled&&e.setCoordShiftAndScale(null,null);if(i)if(i.points||i.cells){var z=new Int32Array(O+i.points.length);z.set(i.points),i.points=z;var j=new Int32Array(O+i.cells.length);j.set(i.cells),i.cells=j}else i.points=new Int32Array(O),i.cells=new Int32Array(O);var H=o.vertexOffset;p=function(e){if(i&&(i.points[H]=e,i.cells[H]=b+o.cellOffset),++H,g=3*e,t.coordShiftAndScaleEnabled?(R[E++]=(s[g++]-t.coordShift[0])*t.coordScale[0],R[E++]=(s[g++]-t.coordShift[1])*t.coordScale[1],R[E++]=(s[g++]-t.coordShift[2])*t.coordScale[2]):(R[E++]=s[g++],R[E++]=s[g++],R[E++]=s[g++]),null!==l&&(m=o.haveCellNormals?3*(b+o.cellOffset):3*e,R[E++]=l[m++],R[E++]=l[m++],R[E++]=l[m++]),t.customData.forEach((function(t){y=e*t.components;for(var r=0;r2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,pr,r),cr.extend(e,t,r),ht.default.setGet(e,t,["colorBO","elementCount","stride","colorBOStride","vertexOffset","normalOffset","tCoordOffset","tCoordComponents","colorOffset","colorComponents","customData"]),ht.default.get(e,t,["coordShift","coordScale","coordShiftAndScaleEnabled","inverseShiftAndScaleMatrix"]),fr(e,t)}var mr={newInstance:ht.default.newInstance(gr),extend:gr},hr=ht.default.vtkErrorMacro;var vr={shaderType:"Unknown",source:"",error:"",handle:0,dirty:!1,context:null};function yr(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,vr,r),ht.default.obj(e,t),ht.default.setGet(e,t,["shaderType","source","error","handle","context"]),function(e,t){t.classHierarchy.push("vtkShader"),e.compile=function(){var e=t.context.VERTEX_SHADER;if(!t.source||!t.source.length||"Unknown"===t.shaderType)return!1;if(0!==t.handle&&(t.context.deleteShader(t.handle),t.handle=0),e="Fragment"===t.shaderType?t.context.FRAGMENT_SHADER:t.context.VERTEX_SHADER,t.handle=t.context.createShader(e),t.context.shaderSource(t.handle,t.source),t.context.compileShader(t.handle),!t.context.getShaderParameter(t.handle,t.context.COMPILE_STATUS)){var r=t.context.getShaderInfoLog(t.handle);return hr("Error compiling shader '".concat(t.source,"': ").concat(r)),t.context.deleteShader(t.handle),t.handle=0,!1}return!0},e.cleanup=function(){"Unknown"!==t.shaderType&&0!==t.handle&&(t.context.deleteShader(t.handle),t.handle=0,t.dirty=!0)}}(e,t)}var br={newInstance:ht.default.newInstance(yr,"vtkShader"),extend:yr},Tr=ht.default.vtkErrorMacro;var Cr={vertexShaderHandle:0,fragmentShaderHandle:0,geometryShaderHandle:0,vertexShader:null,fragmentShader:null,geometryShader:null,linked:!1,bound:!1,compiled:!1,error:"",handle:0,numberOfOutputs:0,attributesLocs:null,uniformLocs:null,md5Hash:0,context:null,lastCameraMTime:null};function xr(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,Cr,r),t.attributesLocs={},t.uniformLocs={},t.vertexShader=br.newInstance(),t.vertexShader.setShaderType("Vertex"),t.fragmentShader=br.newInstance(),t.fragmentShader.setShaderType("Fragment"),t.geometryShader=br.newInstance(),t.geometryShader.setShaderType("Geometry"),ht.default.obj(e,t),ht.default.get(e,t,["lastCameraMTime"]),ht.default.setGet(e,t,["error","handle","compiled","bound","md5Hash","vertexShader","fragmentShader","geometryShader","linked"]),function(e,t){t.classHierarchy.push("vtkShaderProgram"),e.compileShader=function(){return t.vertexShader.compile()?t.fragmentShader.compile()?e.attachShader(t.vertexShader)&&e.attachShader(t.fragmentShader)?e.link()?(e.setCompiled(!0),1):(Tr("Links failed: ".concat(t.error)),0):(Tr(t.error),0):(Tr(t.fragmentShader.getSource().split("\n").map((function(e,t){return"".concat(t,": ").concat(e)})).join("\n")),Tr(t.fragmentShader.getError()),0):(Tr(t.vertexShader.getSource().split("\n").map((function(e,t){return"".concat(t,": ").concat(e)})).join("\n")),Tr(t.vertexShader.getError()),0)},e.cleanup=function(){"Unknown"!==t.shaderType&&0!==t.handle&&(t.context.deleteShader(t.handle),t.handle=0)},e.bind=function(){return!(!t.linked&&!e.link()||(t.context.useProgram(t.handle),e.setBound(!0),0))},e.isBound=function(){return!!t.bound},e.release=function(){t.context.useProgram(null),e.setBound(!1)},e.setContext=function(e){t.vertexShader.setContext(e),t.fragmentShader.setContext(e),t.geometryShader.setContext(e)},e.link=function(){if(t.linked)return!0;if(0===t.handle)return t.error="Program has not been initialized, and/or does not have shaders.",!1;if(t.uniformLocs={},t.context.linkProgram(t.handle),!t.context.getProgramParameter(t.handle,t.context.LINK_STATUS)){var r=t.context.getProgramInfoLog(t.handle);return Tr("Error linking shader ".concat(r)),t.handle=0,!1}return e.setLinked(!0),t.attributeLocs={},!0},e.setUniformMatrix=function(r,n){var a=e.findUniform(r);if(-1===a)return t.error="Could not set uniform ".concat(r," . No such uniform."),!1;var o=new Float32Array(n);return t.context.uniformMatrix4fv(a,!1,o),!0},e.setUniformMatrix3x3=function(r,n){var a=e.findUniform(r);if(-1===a)return t.error="Could not set uniform ".concat(r," . No such uniform."),!1;var o=new Float32Array(n);return t.context.uniformMatrix3fv(a,!1,o),!0},e.setUniformf=function(r,n){var a=e.findUniform(r);return-1===a?(t.error="Could not set uniform ".concat(r," . No such uniform."),!1):(t.context.uniform1f(a,n),!0)},e.setUniformfv=function(r,n){var a=e.findUniform(r);return-1===a?(t.error="Could not set uniform ".concat(r," . No such uniform."),!1):(t.context.uniform1fv(a,n),!0)},e.setUniformi=function(r,n){var a=e.findUniform(r);return-1===a?(t.error="Could not set uniform ".concat(r," . No such uniform."),!1):(t.context.uniform1i(a,n),!0)},e.setUniformiv=function(r,n){var a=e.findUniform(r);return-1===a?(t.error="Could not set uniform ".concat(r," . No such uniform."),!1):(t.context.uniform1iv(a,n),!0)},e.setUniform2f=function(r,n,a){var o=e.findUniform(r);if(-1===o)return t.error="Could not set uniform ".concat(r," . No such uniform."),!1;if(void 0===a)throw new RangeError("Invalid number of values for array");return t.context.uniform2f(o,n,a),!0},e.setUniform2fv=function(r,n){var a=e.findUniform(r);return-1===a?(t.error="Could not set uniform ".concat(r," . No such uniform."),!1):(t.context.uniform2fv(a,n),!0)},e.setUniform2i=function(r,n,a){var o=e.findUniform(r);if(-1===o)return t.error="Could not set uniform ".concat(r," . No such uniform."),!1;if(void 0===a)throw new RangeError("Invalid number of values for array");return t.context.uniform2i(o,n,a),!0},e.setUniform2iv=function(r,n){var a=e.findUniform(r);return-1===a?(t.error="Could not set uniform ".concat(r," . No such uniform."),!1):(t.context.uniform2iv(a,n),!0)},e.setUniform3f=function(r,n,a,o){var i=e.findUniform(r);if(-1===i)return t.error="Could not set uniform ".concat(r," . No such uniform."),!1;if(void 0===o)throw new RangeError("Invalid number of values for array");return t.context.uniform3f(i,n,a,o),!0},e.setUniform3fArray=function(r,n){var a=e.findUniform(r);if(-1===a)return t.error="Could not set uniform ".concat(r," . No such uniform."),!1;if(!Array.isArray(n)||3!==n.length)throw new RangeError("Invalid number of values for array");return t.context.uniform3f(a,n[0],n[1],n[2]),!0},e.setUniform3fv=function(r,n){var a=e.findUniform(r);return-1===a?(t.error="Could not set uniform ".concat(r," . No such uniform."),!1):(t.context.uniform3fv(a,n),!0)},e.setUniform3i=function(r){var n=e.findUniform(r);if(-1===n)return t.error="Could not set uniform ".concat(r," . No such uniform."),!1;for(var a=arguments.length,o=new Array(a>1?a-1:0),i=1;i1?a-1:0),i=1;i1?a-1:0),i=1;i2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,Pr,r),t.buffers=[],ht.default.obj(e,t),ht.default.get(e,t,["supported"]),ht.default.setGet(e,t,["forceEmulation"]),function(e,t){t.classHierarchy.push("vtkOpenGLVertexArrayObject"),e.exposedMethod=function(){},e.initialize=function(){t.instancingExtension=null,t._openGLRenderWindow.getWebgl2()||(t.instancingExtension=t.context.getExtension("ANGLE_instanced_arrays")),!t.forceEmulation&&t._openGLRenderWindow&&t._openGLRenderWindow.getWebgl2()?(t.extension=null,t.supported=!0,t.handleVAO=t.context.createVertexArray()):(t.extension=t.context.getExtension("OES_vertex_array_object"),!t.forceEmulation&&t.extension?(t.supported=!0,t.handleVAO=t.extension.createVertexArrayOES()):t.supported=!1)},e.isReady=function(){return 0!==t.handleVAO||!1===t.supported},e.bind=function(){if(e.isReady()||e.initialize(),e.isReady()&&t.supported)t.extension?t.extension.bindVertexArrayOES(t.handleVAO):t.context.bindVertexArray(t.handleVAO);else if(e.isReady())for(var r=t.context,n=0;n0&&(t.instancingExtension?t.instancingExtension.vertexAttribDivisorANGLE(i.index+l,1):r.vertexAttribDivisor(i.index+l,1))}},e.release=function(){if(e.isReady()&&t.supported)t.extension?t.extension.bindVertexArrayOES(null):t.context.bindVertexArray(null);else if(e.isReady())for(var r=t.context,n=0;n0&&(t.instancingExtension?t.instancingExtension.vertexAttribDivisorANGLE(i.index+l,0):r.vertexAttribDivisor(i.index+l,0)),r.disableVertexAttribArray(i.index+l)}},e.shaderProgramChanged=function(){e.release(),t.handleVAO&&(t.extension?t.extension.deleteVertexArrayOES(t.handleVAO):t.context.deleteVertexArray(t.handleVAO)),t.handleVAO=0,t.handleProgram=0},e.releaseGraphicsResources=function(){e.shaderProgramChanged(),t.handleVAO&&(t.extension?t.extension.deleteVertexArrayOES(t.handleVAO):t.context.deleteVertexArray(t.handleVAO)),t.handleVAO=0,t.supported=!0,t.handleProgram=0},e.addAttributeArray=function(t,r,n,a,o,i,s,l){return e.addAttributeArrayWithDivisor(t,r,n,a,o,i,s,l,0,!1)},e.addAttributeArrayWithDivisor=function(r,n,a,o,i,s,l,c,u,d){if(!r)return!1;if(!r.isBound()||0===n.getHandle()||n.getType()!==rr.ARRAY_BUFFER)return!1;if(0===t.handleProgram&&(t.handleProgram=r.getHandle()),e.isReady()||e.initialize(),!e.isReady()||t.handleProgram!==r.getHandle())return!1;var f=t.context,p={};if(p.name=a,p.index=f.getAttribLocation(t.handleProgram,a),p.offset=o,p.stride=i,p.type=s,p.size=l,p.normalize=c,p.isMatrix=d,p.divisor=u,-1===p.Index)return!1;if(n.bind(),f.enableVertexAttribArray(p.index),f.vertexAttribPointer(p.index,p.size,p.type,p.normalize,p.stride,p.offset),u>0&&(t.instancingExtension?t.instancingExtension.vertexAttribDivisorANGLE(p.index,1):f.vertexAttribDivisor(p.index,1)),p.buffer=n.getHandle(),!t.supported){for(var g=!1,m=0;m0&&(t.instancingExtension?t.instancingExtension.vertexAttribDivisorANGLE(p+g,1):f.vertexAttribDivisor(p+g,1));return!0},e.removeAttributeArray=function(r){if(!e.isReady()||0===t.handleProgram)return!1;if(!t.supported)for(var n=0;n2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,Ar,r),ht.default.obj(e,t),t.shaderSourceTime={},ht.default.obj(t.shaderSourceTime),t.attributeUpdateTime={},ht.default.obj(t.attributeUpdateTime),ht.default.setGet(e,t,["program","shaderSourceTime","VAO","attributeUpdateTime","CABO","primitiveType","pointPicking"]),t.program=Sr.newInstance(),t.VAO=Or.newInstance(),t.CABO=mr.newInstance(),function(e,t){t.classHierarchy.push("vtkOpenGLHelper"),e.setOpenGLRenderWindow=function(e){t.context=e.getContext(),t.program.setContext(t.context),t.VAO.setOpenGLRenderWindow(e),t.CABO.setOpenGLRenderWindow(e)},e.releaseGraphicsResources=function(e){t.VAO.releaseGraphicsResources(),t.CABO.releaseGraphicsResources(),t.CABO.setElementCount(0)},e.drawArrays=function(r,n,a,o){if(t.CABO.getElementCount()){var i=e.getOpenGLMode(a),s=e.haveWideLines(r,n),l=t.context,c=l.getParameter(l.DEPTH_WRITEMASK);t.pointPicking&&l.depthMask(!1),i===l.LINES&&s?(e.updateShaders(r,n,o),l.drawArraysInstanced(i,0,t.CABO.getElementCount(),2*Math.ceil(n.getProperty().getLineWidth()))):(l.lineWidth(n.getProperty().getLineWidth()),e.updateShaders(r,n,o),l.drawArrays(i,0,t.CABO.getElementCount()),l.lineWidth(1));var u=(i===l.POINTS?1:0)||(i===l.LINES?2:3);return t.pointPicking&&l.depthMask(c),t.CABO.getElementCount()/u}return 0},e.getOpenGLMode=function(e){if(t.pointPicking)return t.context.POINTS;var r=t.primitiveType;return e===ur.hX.POINTS||r===Ir.Points?t.context.POINTS:e===ur.hX.WIREFRAME||r===Ir.Lines||r===Ir.TrisEdges||r===Ir.TriStripsEdges?t.context.LINES:t.context.TRIANGLES},e.haveWideLines=function(e,r){return r.getProperty().getLineWidth()>1&&!(t.CABO.getOpenGLRenderWindow()&&t.CABO.getOpenGLRenderWindow().getHardwareMaximumLineWidth()>=r.getProperty().getLineWidth())},e.getNeedToRebuildShaders=function(t,r,n){return!!(n.getNeedToRebuildShaders(e,t,r)||0===e.getProgram()||e.getShaderSourceTime().getMTime() 0.0)"," {"," float offset = float(gl_InstanceID / 2) * lineWidthStepSize - halfLineWidth;"," vec4 tmpPos = gl_Position;"," vec3 tmpPos2 = tmpPos.xyz / tmpPos.w;"," tmpPos2.x = tmpPos2.x + 2.0 * mod(float(gl_InstanceID), 2.0) * offset / viewportSize[0];"," tmpPos2.y = tmpPos2.y + 2.0 * mod(float(gl_InstanceID + 1), 2.0) * offset / viewportSize[1];"," gl_Position = vec4(tmpPos2.xyz * tmpPos.w, tmpPos.w);"," }"]).result),r.Vertex=o},e.getPointPickingPrimitiveSize=function(){return t.primitiveType===Ir.Points?2:t.primitiveType===Ir.Lines?4:6}}(e,t)}var Er={newInstance:ht.default.newInstance(Rr),extend:Rr,primTypes:Ir},Mr=r(59474),Dr={CLAMP_TO_EDGE:0,REPEAT:1,MIRRORED_REPEAT:2},Vr={NEAREST:0,LINEAR:1,NEAREST_MIPMAP_NEAREST:2,NEAREST_MIPMAP_LINEAR:3,LINEAR_MIPMAP_NEAREST:4,LINEAR_MIPMAP_LINEAR:5},Lr={Wrap:Dr,Filter:Vr},_r=new Float32Array(1),Nr=new Int32Array(_r.buffer);var Br={fromHalf:function(e){var t=(32768&e)>>15,r=(31744&e)>>10,n=1023&e;return 0===r?(t?-1:1)*Math.pow(2,-14)*(n/Math.pow(2,10)):31===r?n?NaN:1/0*(t?-1:1):(t?-1:1)*Math.pow(2,r-15)*(1+n/Math.pow(2,10))},toHalf:function(e){_r[0]=e;var t=Nr[0],r=t>>16&32768,n=t>>12&2047,a=t>>23&255;return a<103?r:a>142?(r|=31744,r|=(255===a?0:1)&&8388607&t):a<113?r|=((n|=2048)>>114-a)+(n>>113-a&1):(r|=a-112<<10|n>>1,r+=1&n)}};function Fr(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}var Ur=Lr.Wrap,kr=Lr.Filter,Gr=re.ZP.VtkDataTypes,Wr=ht.eR,zr=ht.E0,jr=ht.t7,Hr=Br.toHalf;function Kr(e,t){function r(e,r){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],a=[],o=t.width*t.height*t.components;if(n&&(o*=t.depth),e!==Gr.FLOAT&&t.openGLDataType===t.context.FLOAT)for(var i=0;io?r[i].subarray(0,o):r[i];a.push(new Float32Array(s))}else a.push(null);if(e!==Gr.UNSIGNED_CHAR&&t.openGLDataType===t.context.UNSIGNED_BYTE)for(var l=0;lo?r[l].subarray(0,o):r[l];a.push(new Uint8Array(c))}else a.push(null);var u=!1;if(t._openGLRenderWindow.getWebgl2())u=t.openGLDataType===t.context.HALF_FLOAT;else{var d=t.context.getExtension("OES_texture_half_float");u=d&&t.openGLDataType===d.HALF_FLOAT_OES}if(u)for(var f=0;f=a&&(b=a-1);var T=v-y,C=1-T;y=y*n*o,b=b*n*o;for(var x=0;x=n&&(O=n-1);var I=P-w;w*=o,O*=o;for(var A=0;A2048||a<-2048||a>2048)return!1}return!0}(n,a)||o);t.useHalfFloat=l}(o,g.offset,g.scale,n),t.useHalfFloat||e.getOpenGLDataType(o,!0),{numComps:a,dataType:o,data:i,scaleOffsets:g}}t.classHierarchy.push("vtkOpenGLTexture"),e.render=function(){var r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;if(r?t._openGLRenderWindow=r:(t._openGLRenderer=e.getFirstAncestorOfType("vtkOpenGLRenderer"),t._openGLRenderWindow=t._openGLRenderer.getParent()),t.context=t._openGLRenderWindow.getContext(),t.renderable.getInterpolate()?(t.generateMipmap?e.setMinificationFilter(kr.LINEAR_MIPMAP_LINEAR):e.setMinificationFilter(kr.LINEAR),e.setMagnificationFilter(kr.LINEAR)):(e.setMinificationFilter(kr.NEAREST),e.setMagnificationFilter(kr.NEAREST)),t.renderable.getRepeat()&&(e.setWrapR(Ur.REPEAT),e.setWrapS(Ur.REPEAT),e.setWrapT(Ur.REPEAT)),t.renderable.getInputData()&&t.renderable.setImage(null),!t.handle||t.renderable.getMTime()>t.textureBuildTime.getMTime()){if(null!==t.renderable.getImage()&&(t.renderable.getInterpolate()&&(t.generateMipmap=!0,e.setMinificationFilter(kr.LINEAR_MIPMAP_LINEAR)),t.renderable.getImage()&&t.renderable.getImageLoaded()&&(e.create2DFromImage(t.renderable.getImage()),e.activate(),e.sendParameters(),t.textureBuildTime.modified())),null!==t.renderable.getCanvas()){t.renderable.getInterpolate()&&(t.generateMipmap=!0,e.setMinificationFilter(kr.LINEAR_MIPMAP_LINEAR));var n=t.renderable.getCanvas();e.create2DFromRaw(n.width,n.height,4,Gr.UNSIGNED_CHAR,n,!0),e.activate(),e.sendParameters(),t.textureBuildTime.modified()}if(null!==t.renderable.getJsImageData()){var a=t.renderable.getJsImageData();t.renderable.getInterpolate()&&(t.generateMipmap=!0,e.setMinificationFilter(kr.LINEAR_MIPMAP_LINEAR)),e.create2DFromRaw(a.width,a.height,4,Gr.UNSIGNED_CHAR,a.data,!0),e.activate(),e.sendParameters(),t.textureBuildTime.modified()}var o=t.renderable.getInputData(0);if(o&&o.getPointData().getScalars()){for(var i=o.getExtent(),s=o.getPointData().getScalars(),l=[],c=0;ct.sendParametersTime.getMTime()&&e.sendParameters()},e.isBound=function(){var e=!1;if(t.context&&t.handle){var r=0;if(t.target===t.context.TEXTURE_2D)r=t.context.TEXTURE_BINDING_2D;else jr("impossible case");e=t.context.getIntegerv(r)===t.handle}return e},e.sendParameters=function(){t.context.texParameteri(t.target,t.context.TEXTURE_WRAP_S,e.getOpenGLWrapMode(t.wrapS)),t.context.texParameteri(t.target,t.context.TEXTURE_WRAP_T,e.getOpenGLWrapMode(t.wrapT)),t._openGLRenderWindow.getWebgl2()&&t.context.texParameteri(t.target,t.context.TEXTURE_WRAP_R,e.getOpenGLWrapMode(t.wrapR)),t.context.texParameteri(t.target,t.context.TEXTURE_MIN_FILTER,e.getOpenGLFilterMode(t.minificationFilter)),t.context.texParameteri(t.target,t.context.TEXTURE_MAG_FILTER,e.getOpenGLFilterMode(t.magnificationFilter)),t._openGLRenderWindow.getWebgl2()&&(t.context.texParameteri(t.target,t.context.TEXTURE_BASE_LEVEL,t.baseLevel),t.context.texParameteri(t.target,t.context.TEXTURE_MAX_LEVEL,t.maxLevel)),t.sendParametersTime.modified()},e.getInternalFormat=function(r,n){return t._forceInternalFormat||(t.internalFormat=e.getDefaultInternalFormat(r,n)),t.internalFormat||Wr("Unable to find suitable internal format for T=".concat(r," NC= ").concat(n)),t.internalFormat},e.getDefaultInternalFormat=function(e,r){var n;return(n=t._openGLRenderWindow.getDefaultTextureInternalFormat(e,r,t.oglNorm16Ext,t.useHalfFloat))||n||(Wr("Unsupported internal texture type!"),Wr("Unable to find suitable internal format for T=".concat(e," NC= ").concat(r))),n},e.setInternalFormat=function(r){t._forceInternalFormat=!0,r!==t.internalFormat&&(t.internalFormat=r,e.modified())},e.getFormat=function(r,n){return t.format=e.getDefaultFormat(r,n),t.format},e.getDefaultFormat=function(e,r){if(t._openGLRenderWindow.getWebgl2())switch(r){case 1:return t.context.RED;case 2:return t.context.RG;case 3:default:return t.context.RGB;case 4:return t.context.RGBA}else switch(r){case 1:return t.context.LUMINANCE;case 2:return t.context.LUMINANCE_ALPHA;case 3:default:return t.context.RGB;case 4:return t.context.RGBA}},e.resetFormatAndType=function(){t.format=0,t.internalFormat=0,t._forceInternalFormat=!1,t.openGLDataType=0},e.getDefaultDataType=function(e){if(t._openGLRenderWindow.getWebgl2())switch(e){case Gr.UNSIGNED_CHAR:return t.context.UNSIGNED_BYTE;case t.oglNorm16Ext&&!t.useHalfFloat&&Gr.SHORT:return t.context.SHORT;case t.oglNorm16Ext&&!t.useHalfFloat&&Gr.UNSIGNED_SHORT:return t.context.UNSIGNED_SHORT;case t.useHalfFloat&&Gr.SHORT:case t.useHalfFloat&&Gr.UNSIGNED_SHORT:return t.context.HALF_FLOAT;case Gr.FLOAT:case Gr.VOID:default:return t.context.FLOAT}switch(e){case Gr.UNSIGNED_CHAR:return t.context.UNSIGNED_BYTE;case Gr.FLOAT:case Gr.VOID:default:if(t.context.getExtension("OES_texture_float")&&t.context.getExtension("OES_texture_float_linear"))return t.context.FLOAT;var r=t.context.getExtension("OES_texture_half_float");return r&&t.context.getExtension("OES_texture_half_float_linear")?r.HALF_FLOAT_OES:t.context.UNSIGNED_BYTE}},e.getOpenGLDataType=function(r){var n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return t.openGLDataType&&!n||(t.openGLDataType=e.getDefaultDataType(r)),t.openGLDataType},e.getShiftAndScale=function(){var e=0,r=1;switch(t.openGLDataType){case t.context.BYTE:e=(r=127.5)-128;break;case t.context.UNSIGNED_BYTE:r=255,e=0;break;case t.context.SHORT:e=(r=32767.5)-32768;break;case t.context.UNSIGNED_SHORT:r=65536,e=0;break;case t.context.INT:e=(r=2147483647.5)-2147483648;break;case t.context.UNSIGNED_INT:r=4294967295,e=0;case t.context.FLOAT:}return{shift:e,scale:r}},e.getOpenGLFilterMode=function(e){switch(e){case kr.NEAREST:return t.context.NEAREST;case kr.LINEAR:return t.context.LINEAR;case kr.NEAREST_MIPMAP_NEAREST:return t.context.NEAREST_MIPMAP_NEAREST;case kr.NEAREST_MIPMAP_LINEAR:return t.context.NEAREST_MIPMAP_LINEAR;case kr.LINEAR_MIPMAP_NEAREST:return t.context.LINEAR_MIPMAP_NEAREST;case kr.LINEAR_MIPMAP_LINEAR:return t.context.LINEAR_MIPMAP_LINEAR;default:return t.context.NEAREST}},e.getOpenGLWrapMode=function(e){switch(e){case Ur.CLAMP_TO_EDGE:return t.context.CLAMP_TO_EDGE;case Ur.REPEAT:return t.context.REPEAT;case Ur.MIRRORED_REPEAT:return t.context.MIRRORED_REPEAT;default:return t.context.CLAMP_TO_EDGE}},e.create2DFromRaw=function(o,i,s,l,c){var u=arguments.length>5&&void 0!==arguments[5]&&arguments[5];if(e.getOpenGLDataType(l,!0),e.getInternalFormat(l,s),e.getFormat(l,s),!t.internalFormat||!t.format||!t.openGLDataType)return zr("Failed to determine texture parameters."),!1;t.target=t.context.TEXTURE_2D,t.components=s,t.width=o,t.height=i,t.depth=1,t.numberOfDimensions=2,t._openGLRenderWindow.activateTexture(e),e.createTexture(),e.bind();var d=n(r(l,[c]));return t.context.pixelStorei(t.context.UNPACK_FLIP_Y_WEBGL,u),t.context.pixelStorei(t.context.UNPACK_ALIGNMENT,1),a(l)?(t.context.texStorage2D(t.target,1,t.internalFormat,t.width,t.height),null!=d[0]&&t.context.texSubImage2D(t.target,0,0,0,t.width,t.height,t.format,t.openGLDataType,d[0])):t.context.texImage2D(t.target,0,t.internalFormat,t.width,t.height,0,t.format,t.openGLDataType,d[0]),t.generateMipmap&&t.context.generateMipmap(t.target),u&&t.context.pixelStorei(t.context.UNPACK_FLIP_Y_WEBGL,!1),e.deactivate(),!0},e.createCubeFromRaw=function(o,i,s,l,c){if(e.getOpenGLDataType(l),e.getInternalFormat(l,s),e.getFormat(l,s),!t.internalFormat||!t.format||!t.openGLDataType)return zr("Failed to determine texture parameters."),!1;t.target=t.context.TEXTURE_CUBE_MAP,t.components=s,t.width=o,t.height=i,t.depth=1,t.numberOfDimensions=2,t._openGLRenderWindow.activateTexture(e),t.maxLevel=c.length/6-1,e.createTexture(),e.bind();for(var u=n(r(l,c)),d=[],f=t.width,p=t.height,g=0;g=1&&C>=1;){var x=null;b<=t.maxLevel&&(x=d[6*b+y]),a(l)?null!=x&&t.context.texSubImage2D(t.context.TEXTURE_CUBE_MAP_POSITIVE_X+y,b,0,0,T,C,t.format,t.openGLDataType,x):t.context.texImage2D(t.context.TEXTURE_CUBE_MAP_POSITIVE_X+y,b,t.internalFormat,T,C,0,t.format,t.openGLDataType,x),b++,T/=2,C/=2}return e.deactivate(),!0},e.createDepthFromRaw=function(r,n,o,i){return e.getOpenGLDataType(o),t.format=t.context.DEPTH_COMPONENT,t._openGLRenderWindow.getWebgl2()?o===Gr.FLOAT?t.internalFormat=t.context.DEPTH_COMPONENT32F:t.internalFormat=t.context.DEPTH_COMPONENT16:t.internalFormat=t.context.DEPTH_COMPONENT,t.internalFormat&&t.format&&t.openGLDataType?(t.target=t.context.TEXTURE_2D,t.components=1,t.width=r,t.height=n,t.depth=1,t.numberOfDimensions=2,t._openGLRenderWindow.activateTexture(e),e.createTexture(),e.bind(),t.context.pixelStorei(t.context.UNPACK_ALIGNMENT,1),a(o)?(t.context.texStorage2D(t.target,1,t.internalFormat,t.width,t.height),null!=i&&t.context.texSubImage2D(t.target,0,0,0,t.width,t.height,t.format,t.openGLDataType,i)):t.context.texImage2D(t.target,0,t.internalFormat,t.width,t.height,0,t.format,t.openGLDataType,i),t.generateMipmap&&t.context.generateMipmap(t.target),e.deactivate(),!0):(zr("Failed to determine texture parameters."),!1)},e.create2DFromImage=function(r){if(e.getOpenGLDataType(Gr.UNSIGNED_CHAR),e.getInternalFormat(Gr.UNSIGNED_CHAR,4),e.getFormat(Gr.UNSIGNED_CHAR,4),!t.internalFormat||!t.format||!t.openGLDataType)return zr("Failed to determine texture parameters."),!1;t.target=t.context.TEXTURE_2D,t.components=4,t.depth=1,t.numberOfDimensions=2,t._openGLRenderWindow.activateTexture(e),e.createTexture(),e.bind(),t.context.pixelStorei(t.context.UNPACK_ALIGNMENT,1);var n=!(t._openGLRenderWindow.getWebgl2()||(0,Mr.Q)(r.width)&&(0,Mr.Q)(r.height)),o=document.createElement("canvas");o.width=n?(0,Mr.M)(r.width):r.width,o.height=n?(0,Mr.M)(r.height):r.height,t.width=o.width,t.height=o.height;var i=o.getContext("2d");i.translate(0,o.height),i.scale(1,-1),i.drawImage(r,0,0,r.width,r.height,0,0,o.width,o.height);var s=o;return a(Gr.UNSIGNED_CHAR)?(t.context.texStorage2D(t.target,1,t.internalFormat,t.width,t.height),null!=s&&t.context.texSubImage2D(t.target,0,0,0,t.width,t.height,t.format,t.openGLDataType,s)):t.context.texImage2D(t.target,0,t.internalFormat,t.width,t.height,0,t.format,t.openGLDataType,s),t.generateMipmap&&t.context.generateMipmap(t.target),e.deactivate(),!0},e.create2DFilterableFromRaw=function(t,r,n,a,o){var i=arguments.length>5&&void 0!==arguments[5]&&arguments[5];return e.create2DFilterableFromDataArray(t,r,re.ZP.newInstance({numberOfComponents:n,dataType:a,values:o}),i)},e.create2DFilterableFromDataArray=function(t,r,n){var a=o(n,arguments.length>3&&void 0!==arguments[3]&&arguments[3]),i=a.numComps,s=a.dataType,l=a.data;e.create2DFromRaw(t,r,i,s,l)},e.create3DFromRaw=function(o,i,s,l,c,u){if(e.getOpenGLDataType(c),e.getInternalFormat(c,l),e.getFormat(c,l),!t.internalFormat||!t.format||!t.openGLDataType)return zr("Failed to determine texture parameters."),!1;t.target=t.context.TEXTURE_3D,t.components=l,t.width=o,t.height=i,t.depth=s,t.numberOfDimensions=3,t._openGLRenderWindow.activateTexture(e),e.createTexture(),e.bind();var d=n(r(c,[u],!0));return t.context.pixelStorei(t.context.UNPACK_ALIGNMENT,1),a(c)?(t.context.texStorage3D(t.target,1,t.internalFormat,t.width,t.height,t.depth),null!=d[0]&&t.context.texSubImage3D(t.target,0,0,0,0,t.width,t.height,t.depth,t.format,t.openGLDataType,d[0])):t.context.texImage3D(t.target,0,t.internalFormat,t.width,t.height,t.depth,0,t.format,t.openGLDataType,d[0]),t.generateMipmap&&t.context.generateMipmap(t.target),e.deactivate(),!0},e.create3DFilterableFromRaw=function(t,r,n,a,o,i){var s=arguments.length>6&&void 0!==arguments[6]&&arguments[6];return e.create3DFilterableFromDataArray(t,r,n,re.ZP.newInstance({numberOfComponents:a,dataType:o,values:i}),s)},e.create3DFilterableFromDataArray=function(r,n,i,s){for(var l=o(s,arguments.length>4&&void 0!==arguments[4]&&arguments[4]),c=l.numComps,u=l.dataType,d=l.data,f=l.scaleOffsets,p=r*n*i,g=[],m=[],h=0;h4096&&(I===Gr.FLOAT||c>=3)&&(R=4096);var E=1,M=1;p>R*R&&(M=E=Math.ceil(Math.sqrt(p/(R*R))));var D=Math.sqrt(p)/E;D=(0,Mr.M)(D);var V,L=Math.floor(D*E/r),_=Math.ceil(i/L),N=(0,Mr.M)(n*_/M);t.width=D,t.height=N,t._openGLRenderWindow.activateTexture(e),e.createTexture(),e.bind(),t.volumeInfo.xreps=L,t.volumeInfo.yreps=_,t.volumeInfo.xstride=E,t.volumeInfo.ystride=M,t.volumeInfo.offset=v.offset,t.volumeInfo.scale=v.scale;var B=D*N*c;V=I===Gr.FLOAT?new Float32Array(B):new Uint8Array(B);for(var F=0,U=Math.floor(r/E),k=Math.floor(n/M),G=0;G<_;G++)for(var W=Math.min(L,i-G*L),z=c*(t.width-W*Math.floor(r/E)),j=0;j2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,Zr,r),Tt.extend(e,t,r),t.sendParametersTime={},(0,ht.j6)(t.sendParametersTime,{mtime:0}),t.textureBuildTime={},(0,ht.j6)(t.textureBuildTime,{mtime:0}),(0,ht.t8)(e,t,["format","openGLDataType"]),(0,ht.g2)(e,t,["keyMatrixTime","minificationFilter","magnificationFilter","wrapS","wrapT","wrapR","generateMipmap","oglNorm16Ext"]),(0,ht.U2)(e,t,["width","height","volumeInfo","components","handle","target"]),(0,ht.B6)(e,t,["openGLRenderWindow"]),Kr(e,t)}var qr=(0,ht.WL)(Xr,"vtkOpenGLTexture"),Yr=function(e){for(var t=1;t0){var F=t.resliceGeom.getPointData().getNormals();F?B.normals=F:an("Slab mode requested without normals")}t.tris.getCABO().createVBO(N,"polys",ur.hX.SURFACE,B)}t.VBOBuildString=L,t.VBOBuildTime.modified()}}},e.updateShaders=function(r,n,a){if(t.lastBoundBO=r,e.getNeedToRebuildShaders(r,n,a)){var o={Vertex:null,Fragment:null,Geometry:null};e.buildShaders(o,n,a);var i=t._openGLRenderWindow.getShaderCache().readyShaderProgramArray(o.Vertex,o.Fragment,o.Geometry);i!==r.getProgram()&&(r.setProgram(i),r.getVAO().releaseGraphicsResources()),r.getShaderSourceTime().modified()}else t._openGLRenderWindow.getShaderCache().readyShaderProgram(r.getProgram());r.getVAO().bind(),e.setMapperShaderParameters(r,n,a),e.setCameraShaderParameters(r,n,a),e.setPropertyShaderParameters(r,n,a)},e.setMapperShaderParameters=function(r,n,a){var o=r.getProgram();if(r.getCABO().getElementCount()&&(t.VBOBuildTime.getMTime()>r.getAttributeUpdateTime().getMTime()||r.getShaderSourceTime().getMTime()>r.getAttributeUpdateTime().getMTime())){o.isUniformUsed("texture1")&&o.setUniformi("texture1",t.openGLTexture.getTextureUnit()),o.isAttributeUsed("vertexWC")&&(r.getVAO().addAttributeArray(o,r.getCABO(),"vertexWC",r.getCABO().getVertexOffset(),r.getCABO().getStride(),t.context.FLOAT,3,t.context.FALSE)||an("Error setting vertexWC in shader VAO.")),o.isAttributeUsed("normalWC")&&(r.getVAO().addAttributeArray(o,r.getCABO(),"normalWC",r.getCABO().getNormalOffset(),r.getCABO().getStride(),t.context.FLOAT,3,t.context.FALSE)||an("Error setting normalWC in shader VAO.")),o.isUniformUsed("slabThickness")&&o.setUniformf("slabThickness",t.renderable.getSlabThickness()),o.isUniformUsed("spacing")&&o.setUniform3fv("spacing",t.currentInput.getSpacing()),o.isUniformUsed("slabType")&&o.setUniformi("slabType",t.renderable.getSlabType()),o.isUniformUsed("slabType")&&o.setUniformi("slabType",t.renderable.getSlabType()),o.isUniformUsed("slabTrapezoid")&&o.setUniformi("slabTrapezoid",t.renderable.getSlabTrapezoidIntegration());var i=r.getCABO().getCoordShiftAndScaleEnabled()?r.getCABO().getInverseShiftAndScaleMatrix():null;if(o.isUniformUsed("WCTCMatrix")){var s=t.currentInput;ot._E.identity(t.tmpMat4);var l=s.getBounds(),c=[l[1]-l[0],l[3]-l[2],l[5]-l[4]],u=[l[0],l[2],l[4]];ot._E.fromRotationTranslationScale(t.tmpMat4,[0,0,0,1],u,c),ot._E.invert(t.tmpMat4,t.tmpMat4),i&&ot._E.multiply(t.tmpMat4,t.tmpMat4,i),o.setUniformMatrix("WCTCMatrix",t.tmpMat4)}r.getAttributeUpdateTime().modified()}if(t.haveSeenDepthRequest&&r.getProgram().setUniformi("depthRequest",t.renderDepth?1:0),r.getProgram().isUniformUsed("coffset")){var d=e.getCoincidentParameters(n,a);r.getProgram().setUniformf("coffset",d.offset),r.getProgram().isUniformUsed("cfactor")&&r.getProgram().setUniformf("cfactor",d.factor)}},e.setCameraShaderParameters=function(e,r,n){var a=t._openGLCamera.getKeyMatrices(r),o=t._openGLImageSlice.getKeyMatrices(),i=e.getCABO().getCoordShiftAndScaleEnabled()?e.getCABO().getInverseShiftAndScaleMatrix():null,s=e.getProgram();s.isUniformUsed("MCPCMatrix")&&(ot._E.identity(t.tmpMat4),s.setUniformMatrix("MCPCMatrix",sn([a.wcpc,o.mcwc,i],ot._E,t.tmpMat4))),s.isUniformUsed("MCVCMatrix")&&(ot._E.identity(t.tmpMat4),s.setUniformMatrix("MCVCMatrix",sn([a.wcvc,o.mcwc,i],ot._E,t.tmpMat4)))},e.setPropertyShaderParameters=function(e,r,n){var a=e.getProgram(),o=n.getProperty(),i=o.getOpacity();a.setUniformf("opacity",i);var s=t.openGLTexture.getComponents(),l=o.getIndependentComponents();if(l)for(var c=0;c0&&(u=(u=u.concat(["uniform vec3 spacing;","uniform float slabThickness;","uniform int slabType;","uniform int slabTrapezoid;"])).concat(["vec4 compositeValue(vec4 currVal, vec4 valToComp, int trapezoid)","{"," vec4 retVal = vec4(1.0);"," if (slabType == 0) // min"," {"," retVal = min(currVal, valToComp);"," }"," else if (slabType == 1) // max"," {"," retVal = max(currVal, valToComp);"," }"," else if (slabType == 3) // sum"," {"," retVal = currVal + (trapezoid > 0 ? 0.5 * valToComp : valToComp); "," }"," else // mean"," {"," retVal = currVal + (trapezoid > 0 ? 0.5 * valToComp : valToComp); "," }"," return retVal;","}"])),i=Sr.substitute(i,"//VTK::TCoord::Dec",u).result;var f=["if (any(greaterThan(fragTexCoord, vec3(1.0))) || any(lessThan(fragTexCoord, vec3(0.0))))","{"," // set the background color and exit"," gl_FragData[0] = backgroundColor;"," return;","}","vec4 tvalue = texture(texture1, fragTexCoord);"];if(s>0&&(f=f.concat(["// Get the first and last samples","int numSlices = 1;","vec3 normalxspacing = normalWCVSOutput * spacing * 0.5;","float distTraveled = length(normalxspacing);","int trapezoid = 0;","while (distTraveled < slabThickness * 0.5)","{"," distTraveled += length(normalxspacing);"," float fnumSlices = float(numSlices);"," if (distTraveled > slabThickness * 0.5)"," {"," // Before stepping outside the slab, sample at the boundaries"," normalxspacing = normalWCVSOutput * slabThickness * 0.5 / fnumSlices;"," trapezoid = slabTrapezoid;"," }"," vec3 fragTCoordNeg = (WCTCMatrix * vec4(vertexWCVSOutput.xyz - fnumSlices * normalxspacing, 1.0)).xyz;"," if (!any(greaterThan(fragTCoordNeg, vec3(1.0))) && !any(lessThan(fragTCoordNeg, vec3(0.0))))"," {"," vec4 newVal = texture(texture1, fragTCoordNeg);"," tvalue = compositeValue(tvalue, newVal, trapezoid);"," numSlices += 1;"," }"," vec3 fragTCoordPos = (WCTCMatrix * vec4(vertexWCVSOutput.xyz + fnumSlices * normalxspacing, 1.0)).xyz;"," if (!any(greaterThan(fragTCoordNeg, vec3(1.0))) && !any(lessThan(fragTCoordNeg, vec3(0.0))))"," {"," vec4 newVal = texture(texture1, fragTCoordPos);"," tvalue = compositeValue(tvalue, newVal, trapezoid);"," numSlices += 1;"," }","}","// Finally, if slab type is *mean*, divide the sum by the numSlices","if (slabType == 2)","{"," tvalue = tvalue / float(numSlices);","}"])),c){for(var p=["r","g","b","a"],g=0;g0&&(c=c.concat(["attribute vec3 normalWC;","varying vec3 normalWCVSOutput;","varying vec4 vertexWCVSOutput;"])),o=Sr.substitute(o,"//VTK::PositionVC::Dec",c).result;var u=["gl_Position = MCPCMatrix * vertexWC;"];l>0&&(u=u.concat(["normalWCVSOutput = normalWC;","vertexWCVSOutput = vertexWC;"])),o=Sr.substitute(o,"//VTK::PositionVC::Impl",u).result,o=Sr.substitute(o,"//VTK::Camera::Dec",["uniform mat4 MCPCMatrix;","uniform mat4 MCVCMatrix;"]).result;var d=[];l>0&&(d=d.concat(["varying vec3 normalWCVSOutput;","varying vec4 vertexWCVSOutput;"])),s=Sr.substitute(s,"//VTK::PositionVC::Dec",d).result,r.Vertex=o,r.Geometry=i,r.Fragment=s},e.updateResliceGeometry=function(){var e="",r=t.currentInput,n=null==r?void 0:r.getBounds(),a=!0,o=2;if(t.renderable.getSlicePolyData())e=e.concat("PolyData".concat(t.renderable.getSlicePolyData().getMTime()));else if(t.renderable.getSlicePlane()){e=e.concat("Plane".concat(t.renderable.getSlicePlane().getMTime())),r&&(e=e.concat("Image".concat(r.getMTime())));var i=function(e){Mr.f.normalize(e);for(var t=[0,0,0],r=0;r<3;++r){ot.R3.zero(t),t[r]=1;var n=Mr.f.dot(e,t);if(n<-.999||n>.999)return[!0,r]}return[!1,2]}(t.renderable.getSlicePlane().getNormal()),s=(0,Ft.Z)(i,2);a=s[0],o=s[1]}else{var l,c=$r.ZP.newInstance();c.setNormal(0,0,1);var u=[0,1,0,1,0,1];r&&(u=n),c.setOrigin(u[0],u[2],.5*(u[5]+u[4])),t.renderable.setSlicePlane(c),e=e.concat("Plane".concat(null===(l=t.renderable.getSlicePlane())||void 0===l?void 0:l.getMTime())),r&&(e=e.concat("Image".concat(r.getMTime())))}if(!t.resliceGeom||t.resliceGeomUpdateString!==e){if(t.renderable.getSlicePolyData())t.resliceGeom=t.renderable.getSlicePolyData();else if(t.renderable.getSlicePlane()){var d=r?n:[0,1,0,1,0,1];if(a){for(var f=new Float32Array(12),p=t.renderable.getSlicePlane().getOrigin(),g=[(o+1)%3,(o+2)%3].sort(),m=0,h=0;h<2;++h)for(var v=0;v<2;++v)f[m+o]=p[o],f[m+g[0]]=d[2*g[0]+v],f[m+g[1]]=d[2*g[1]+h],m+=3;var y=new Uint16Array(8);y[0]=3,y[1]=0,y[2]=1,y[3]=3,y[4]=3,y[5]=0,y[6]=3,y[7]=2;var b=t.renderable.getSlicePlane().getNormal();Mr.f.normalize(b);for(var T=new Float32Array(12),C=0;C<4;++C)T[3*C]=b[0],T[3*C+1]=b[1],T[3*C+2]=b[2];t.resliceGeom||(t.resliceGeom=Wt.ZP.newInstance()),t.resliceGeom.getPoints().setData(f,3),t.resliceGeom.getPolys().setData(y,1);var x=re.ZP.newInstance({numberOfComponents:3,values:T,name:"Normals"});t.resliceGeom.getPointData().setNormals(x),t.resliceGeom.modified()}else{var S=Xt.ZP.newInstance();S.setCenter(.5*(d[0]+d[1]),.5*(d[2]+d[3]),.5*(d[4]+d[5])),S.setXLength(d[1]-d[0]),S.setYLength(d[3]-d[2]),S.setZLength(d[5]-d[4]);var P=tr.newInstance();P.setInputConnection(S.getOutputPort()),P.setCutFunction(t.renderable.getSlicePlane());var w=Zt.newInstance();w.setInputConnection(P.getOutputPort()),w.update(),t.resliceGeom=w.getOutputData();var O=t.renderable.getSlicePlane().getNormal(),I=t.resliceGeom.getNumberOfPoints();Mr.f.normalize(O);for(var A=new Float32Array(3*I),R=0;R2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,cn,r),Tt.extend(e,t,r),Qr.implementReplaceShaderCoincidentOffset(e,t,r),Qr.implementBuildShadersWithReplacements(e,t,r),t.tris=Er.newInstance(),t.openGLTexture=Yr.newInstance(),t.colorTexture=Yr.newInstance(),t.pwfTexture=Yr.newInstance(),t.VBOBuildTime={},(0,ht.j6)(t.VBOBuildTime),t.tmpMat4=ot._E.identity(new Float64Array(16)),(0,ht.U2)(e,t,["openGLTexture"]),ln(e,t)}var dn=(0,ht.WL)(un,"vtkOpenGLImageResliceMapper");wt("vtkImageResliceMapper",dn);var fn={SlicingMode:{NONE:-1,I:0,J:1,K:2,X:3,Y:4,Z:5}},pn="//VTK::System::Dec\n\n/*=========================================================================\n\n Program: Visualization Toolkit\n Module: vtkPolyDataVS.glsl\n\n Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen\n All rights reserved.\n See Copyright.txt or http://www.kitware.com/Copyright.htm for details.\n\n This software is distributed WITHOUT ANY WARRANTY; without even\n the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR\n PURPOSE. See the above copyright notice for more information.\n\n=========================================================================*/\n\nattribute vec4 vertexMC;\n\n// frag position in VC\n//VTK::PositionVC::Dec\n\n// optional normal declaration\n//VTK::Normal::Dec\n\n// extra lighting parameters\n//VTK::Light::Dec\n\n// Texture coordinates\n//VTK::TCoord::Dec\n\n// material property values\n//VTK::Color::Dec\n\n// clipping plane vars\n//VTK::Clip::Dec\n\n// camera and actor matrix values\n//VTK::Camera::Dec\n\n// Apple Bug\n//VTK::PrimID::Dec\n\n// picking support\n//VTK::Picking::Dec\n\nvoid main()\n{\n //VTK::Color::Impl\n\n //VTK::Normal::Impl\n\n //VTK::TCoord::Impl\n\n //VTK::Clip::Impl\n\n //VTK::PrimID::Impl\n\n //VTK::PositionVC::Impl\n\n //VTK::Light::Impl\n\n //VTK::Picking::Impl\n}\n",gn="//VTK::System::Dec\n\n/*=========================================================================\n\n Program: Visualization Toolkit\n Module: vtkPolyDataFS.glsl\n\n Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen\n All rights reserved.\n See Copyright.txt or http://www.kitware.com/Copyright.htm for details.\n\n This software is distributed WITHOUT ANY WARRANTY; without even\n the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR\n PURPOSE. See the above copyright notice for more information.\n\n=========================================================================*/\n// Template for the polydata mappers fragment shader\n\nuniform int PrimitiveIDOffset;\n\n// VC position of this fragment\n//VTK::PositionVC::Dec\n\n// optional color passed in from the vertex shader, vertexColor\n//VTK::Color::Dec\n\n// optional surface normal declaration\n//VTK::Normal::Dec\n\n// extra lighting parameters\n//VTK::Light::Dec\n\n// Texture coordinates\n//VTK::TCoord::Dec\n\n// picking support\n//VTK::Picking::Dec\n\n// Depth Peeling Support\n//VTK::DepthPeeling::Dec\n\n// clipping plane vars\n//VTK::Clip::Dec\n\n// the output of this shader\n//VTK::Output::Dec\n\n// Apple Bug\n//VTK::PrimID::Dec\n\n// handle coincident offsets\n//VTK::Coincident::Dec\n\n//VTK::ZBuffer::Dec\n\nvoid main()\n{\n // VC position of this fragment. This should not branch/return/discard.\n //VTK::PositionVC::Impl\n\n // Place any calls that require uniform flow (e.g. dFdx) here.\n //VTK::UniformFlow::Impl\n\n // Set gl_FragDepth here (gl_FragCoord.z by default)\n //VTK::Depth::Impl\n\n // Early depth peeling abort:\n //VTK::DepthPeeling::PreColor\n\n // Apple Bug\n //VTK::PrimID::Impl\n\n //VTK::Clip::Impl\n\n //VTK::Color::Impl\n\n // Generate the normal if we are not passed in one\n //VTK::Normal::Impl\n\n //VTK::TCoord::Impl\n\n //VTK::Light::Impl\n\n if (gl_FragData[0].a <= 0.0)\n {\n discard;\n }\n\n //VTK::DepthPeeling::Impl\n\n //VTK::Picking::Impl\n\n // handle coincident offsets\n //VTK::Coincident::Impl\n\n //VTK::ZBuffer::Impl\n\n //VTK::RenderPassFragmentShader::Impl\n}\n",mn=ht.E0,hn=fn.SlicingMode;function vn(e,t,r){if(t.apply(e)){var n=e.getIndependentComponents();return"".concat(e.getMTime(),"-").concat(n,"-").concat(r)}return"0"}var yn={VBOBuildTime:0,VBOBuildString:null,openGLTexture:null,tris:null,imagemat:null,imagematinv:null,colorTexture:null,pwfTexture:null,lastHaveSeenDepthRequest:!1,haveSeenDepthRequest:!1,lastTextureComponents:0};function bn(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,yn,r),Tt.extend(e,t,r),Qr.implementReplaceShaderCoincidentOffset(e,t,r),Qr.implementBuildShadersWithReplacements(e,t,r),t.tris=Er.newInstance(),t.openGLTexture=Yr.newInstance({resizable:!0}),t.colorTexture=Yr.newInstance({resizable:!0}),t.pwfTexture=Yr.newInstance({resizable:!0}),t.imagemat=ot._E.identity(new Float64Array(16)),t.imagematinv=ot._E.identity(new Float64Array(16)),(0,ht.g2)(e,t,[]),t.VBOBuildTime={},(0,ht.j6)(t.VBOBuildTime),function(e,t){t.classHierarchy.push("vtkOpenGLImageMapper"),e.buildPass=function(r){if(r){t.currentRenderPass=null,t.openGLImageSlice=e.getFirstAncestorOfType("vtkOpenGLImageSlice"),t._openGLRenderer=e.getFirstAncestorOfType("vtkOpenGLRenderer"),t._openGLRenderWindow=t._openGLRenderer.getParent(),t.context=t._openGLRenderWindow.getContext(),t.tris.setOpenGLRenderWindow(t._openGLRenderWindow),t.openGLTexture.setOpenGLRenderWindow(t._openGLRenderWindow),t.colorTexture.setOpenGLRenderWindow(t._openGLRenderWindow),t.pwfTexture.setOpenGLRenderWindow(t._openGLRenderWindow);var n=t._openGLRenderer.getRenderable();t.openGLCamera=t._openGLRenderer.getViewNodeFor(n.getActiveCamera()),t.renderable.isA("vtkImageMapper")&&t.renderable.getSliceAtFocalPoint()&&t.renderable.setSliceFromCamera(n.getActiveCamera())}},e.translucentPass=function(r,n){r&&(t.currentRenderPass=n,e.render())},e.zBufferPass=function(r){r&&(t.haveSeenDepthRequest=!0,t.renderDepth=!0,e.render(),t.renderDepth=!1)},e.opaqueZBufferPass=function(t){return e.zBufferPass(t)},e.opaquePass=function(t){t&&e.render()},e.getCoincidentParameters=function(e,r){return t.renderable.getResolveCoincidentTopology()?t.renderable.getCoincidentTopologyPolygonOffsetParameters():null},e.render=function(){var r=t.openGLImageSlice.getRenderable(),n=t._openGLRenderer.getRenderable();e.renderPiece(n,r)},e.getShaderTemplate=function(e,t,r){e.Vertex=pn,e.Fragment=gn,e.Geometry=""},e.replaceShaderValues=function(r,n,a){var o=r.Vertex,i=r.Fragment;o=Sr.substitute(o,"//VTK::Camera::Dec",["uniform mat4 MCPCMatrix;"]).result,o=Sr.substitute(o,"//VTK::PositionVC::Impl",[" gl_Position = MCPCMatrix * vertexMC;"]).result,o=Sr.substitute(o,"//VTK::TCoord::Impl","tcoordVCVSOutput = tcoordMC;").result,o=Sr.substitute(o,"//VTK::TCoord::Dec","attribute vec2 tcoordMC; varying vec2 tcoordVCVSOutput;").result;var s=t.openGLTexture.getComponents(),l=a.getProperty().getIndependentComponents(),c=["varying vec2 tcoordVCVSOutput;","uniform float cshift0;","uniform float cscale0;","uniform float pwfshift0;","uniform float pwfscale0;","uniform sampler2D texture1;","uniform sampler2D colorTexture1;","uniform sampler2D pwfTexture1;","uniform float opacity;"];if(l){for(var u=1;u6&&((0,ht.E0)("OpenGL has a limit of 6 clipping planes"),i=6),a=Sr.substitute(a,"//VTK::Clip::Dec",["uniform int numClipPlanes;","uniform vec4 clipPlanes[6];","varying float clipDistancesVSOutput[6];"]).result,a=Sr.substitute(a,"//VTK::Clip::Impl",["for (int planeNum = 0; planeNum < 6; planeNum++)"," {"," if (planeNum >= numClipPlanes)"," {"," break;"," }"," clipDistancesVSOutput[planeNum] = dot(clipPlanes[planeNum], vertexMC);"," }"]).result,o=Sr.substitute(o,"//VTK::Clip::Dec",["uniform int numClipPlanes;","varying float clipDistancesVSOutput[6];"]).result,o=Sr.substitute(o,"//VTK::Clip::Impl",["for (int planeNum = 0; planeNum < 6; planeNum++)"," {"," if (planeNum >= numClipPlanes)"," {"," break;"," }"," if (clipDistancesVSOutput[planeNum] < 0.0) discard;"," }"]).result}e.Vertex=a,e.Fragment=o},e.getNeedToRebuildShaders=function(e,r,n){var a=t.openGLTexture.getComponents(),o=n.getProperty().getIndependentComponents(),i=!1;return(!t.currentRenderPass&&t.lastRenderPassShaderReplacement||t.currentRenderPass&&t.currentRenderPass.getShaderReplacement()!==t.lastRenderPassShaderReplacement)&&(i=!0),!(!i&&t.lastHaveSeenDepthRequest===t.haveSeenDepthRequest&&0!==e.getProgram()&&t.lastTextureComponents===a&&t.lastIndependentComponents===o||(t.lastHaveSeenDepthRequest=t.haveSeenDepthRequest,t.lastTextureComponents=a,t.lastIndependentComponents=o,0))},e.updateShaders=function(r,n,a){if(t.lastBoundBO=r,e.getNeedToRebuildShaders(r,n,a)){var o={Vertex:null,Fragment:null,Geometry:null};e.buildShaders(o,n,a);var i=t._openGLRenderWindow.getShaderCache().readyShaderProgramArray(o.Vertex,o.Fragment,o.Geometry);i!==r.getProgram()&&(r.setProgram(i),r.getVAO().releaseGraphicsResources()),r.getShaderSourceTime().modified()}else t._openGLRenderWindow.getShaderCache().readyShaderProgram(r.getProgram());r.getVAO().bind(),e.setMapperShaderParameters(r,n,a),e.setCameraShaderParameters(r,n,a),e.setPropertyShaderParameters(r,n,a)},e.setMapperShaderParameters=function(r,n,a){r.getCABO().getElementCount()&&(t.VBOBuildTime>r.getAttributeUpdateTime().getMTime()||r.getShaderSourceTime().getMTime()>r.getAttributeUpdateTime().getMTime())&&(r.getProgram().isAttributeUsed("vertexMC")&&(r.getVAO().addAttributeArray(r.getProgram(),r.getCABO(),"vertexMC",r.getCABO().getVertexOffset(),r.getCABO().getStride(),t.context.FLOAT,3,t.context.FALSE)||mn("Error setting vertexMC in shader VAO.")),r.getProgram().isAttributeUsed("tcoordMC")&&r.getCABO().getTCoordOffset()&&(r.getVAO().addAttributeArray(r.getProgram(),r.getCABO(),"tcoordMC",r.getCABO().getTCoordOffset(),r.getCABO().getStride(),t.context.FLOAT,r.getCABO().getTCoordComponents(),t.context.FALSE)||mn("Error setting tcoordMC in shader VAO.")),r.getAttributeUpdateTime().modified());var o=t.openGLTexture.getTextureUnit();r.getProgram().setUniformi("texture1",o);var i=t.openGLTexture.getComponents(),s=a.getProperty().getIndependentComponents();if(s)for(var l=0;l6&&((0,ht.E0)("OpenGL has a limit of 6 clipping planes"),R=6);var E=r.getCABO().getCoordShiftAndScaleEnabled()?r.getCABO().getInverseShiftAndScaleMatrix():null,M=E?ot._E.copy(t.imagematinv,a.getMatrix()):a.getMatrix();E&&(ot._E.transpose(M,M),ot._E.multiply(M,M,E),ot._E.transpose(M,M)),ot._E.transpose(t.imagemat,t.currentInput.getIndexToWorld()),ot._E.multiply(t.imagematinv,M,t.imagemat);for(var D=[],V=0;V1?1:0;var Z=[hn.X,hn.Y,hn.Z].includes(t.renderable.getSlicingMode())?_:B,X=a.getSpatialExtent(),q=o.getData(),Y=null;if(L===hn.I){Y=new q.constructor(W[2]*W[1]*s);for(var $=0,Q=0;Q2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,xn,r),Tt.extend(e,t,r),t.keyMatrixTime={},(0,ht.j6)(t.keyMatrixTime,{mtime:0}),t.keyMatrices={mcwc:ot._E.identity(new Float64Array(16))},(0,ht.g2)(e,t,["context"]),function(e,t){t.classHierarchy.push("vtkOpenGLImageSlice"),e.buildPass=function(r){if(t.renderable&&t.renderable.getVisibility()&&r){if(!t.renderable)return;t._openGLRenderWindow=e.getFirstAncestorOfType("vtkOpenGLRenderWindow"),t._openGLRenderer=e.getFirstAncestorOfType("vtkOpenGLRenderer"),t.context=t._openGLRenderWindow.getContext(),e.prepareNodes(),e.addMissingNode(t.renderable.getMapper()),e.removeUnusedNodes()}},e.traverseZBufferPass=function(r){t.renderable&&t.renderable.getNestedVisibility()&&(!t._openGLRenderer.getSelector()||t.renderable.getNestedPickable())&&(e.apply(r,!0),t.children.forEach((function(e){e.traverse(r)})),e.apply(r,!1))},e.traverseOpaqueZBufferPass=function(t){return e.traverseOpaquePass(t)},e.traverseOpaquePass=function(r){t.renderable&&t.renderable.getNestedVisibility()&&t.renderable.getIsOpaque()&&(!t._openGLRenderer.getSelector()||t.renderable.getNestedPickable())&&(e.apply(r,!0),t.children.forEach((function(e){e.traverse(r)})),e.apply(r,!1))},e.traverseTranslucentPass=function(r){!t.renderable||!t.renderable.getNestedVisibility()||t.renderable.getIsOpaque()||t._openGLRenderer.getSelector()&&!t.renderable.getNestedPickable()||(e.apply(r,!0),t.children.forEach((function(e){e.traverse(r)})),e.apply(r,!1))},e.queryPass=function(e,r){if(e){if(!t.renderable||!t.renderable.getVisibility())return;t.renderable.getIsOpaque()?r.incrementOpaqueActorCount():r.incrementTranslucentActorCount()}},e.zBufferPass=function(t,r){return e.opaquePass(t,r)},e.opaqueZBufferPass=function(t,r){return e.opaquePass(t,r)},e.opaquePass=function(e,r){e&&t.context.depthMask(!0)},e.translucentPass=function(e,r){t.context.depthMask(!e)},e.getKeyMatrices=function(){return t.renderable.getMTime()>t.keyMatrixTime.getMTime()&&(ot._E.copy(t.keyMatrices.mcwc,t.renderable.getMatrix()),ot._E.transpose(t.keyMatrices.mcwc,t.keyMatrices.mcwc),t.keyMatrixTime.modified()),t.keyMatrices}}(e,t)}var Pn=(0,ht.WL)(Sn,"vtkOpenGLImageSlice"),wn={newInstance:Pn,extend:Sn};wt("vtkImageSlice",Pn);var On={};function In(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,On,r),Tt.extend(e,t,r),t.keyMatrixTime={},(0,ht.j6)(t.keyMatrixTime,{mtime:0}),t.normalMatrix=new Float64Array(9),t.MCWCMatrix=new Float64Array(16),(0,ht.g2)(e,t,["context"]),function(e,t){t.classHierarchy.push("vtkOpenGLVolume"),e.buildPass=function(r){t.renderable&&t.renderable.getVisibility()&&r&&(t._openGLRenderWindow=e.getFirstAncestorOfType("vtkOpenGLRenderWindow"),t._openGLRenderer=e.getFirstAncestorOfType("vtkOpenGLRenderer"),t.context=t._openGLRenderWindow.getContext(),e.prepareNodes(),e.addMissingNode(t.renderable.getMapper()),e.removeUnusedNodes())},e.queryPass=function(e,r){if(e){if(!t.renderable||!t.renderable.getVisibility())return;r.incrementVolumeCount()}},e.traverseVolumePass=function(r){t.renderable&&t.renderable.getNestedVisibility()&&(!t._openGLRenderer.getSelector()||t.renderable.getNestedPickable())&&(e.apply(r,!0),t.children[0].traverse(r),e.apply(r,!1))},e.volumePass=function(e){t.renderable&&t.renderable.getVisibility()&&t.context.depthMask(!e)},e.getKeyMatrices=function(){return t.renderable.getMTime()>t.keyMatrixTime.getMTime()&&(t.renderable.computeMatrix(),ot._E.copy(t.MCWCMatrix,t.renderable.getMatrix()),ot._E.transpose(t.MCWCMatrix,t.MCWCMatrix),t.renderable.getIsIdentity()?ot.wO.identity(t.normalMatrix):(ot.wO.fromMat4(t.normalMatrix,t.MCWCMatrix),ot.wO.invert(t.normalMatrix,t.normalMatrix)),t.keyMatrixTime.modified()),{mcwc:t.MCWCMatrix,normalMatrix:t.normalMatrix}}}(e,t)}var An=(0,ht.WL)(In,"vtkOpenGLVolume"),Rn={newInstance:An,extend:In};wt("vtkVolume",An);var En={glFramebuffer:null,colorBuffers:null,depthTexture:null,previousDrawBinding:0,previousReadBinding:0,previousDrawBuffer:0,previousReadBuffer:0,previousActiveFramebuffer:null};function Mn(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,En,r),(0,ht.j6)(e,t),t.colorBuffers&&(0,ht.E0)("you cannot initialize colorBuffers through the constructor. You should call setColorBuffer() instead."),t.colorBuffers=[],(0,ht.c$)(e,t,["colorBuffers"]),function(e,t){t.classHierarchy.push("vtkFramebuffer"),e.getBothMode=function(){return t.context.FRAMEBUFFER},e.saveCurrentBindingsAndBuffers=function(t){var r=void 0!==t?t:e.getBothMode();e.saveCurrentBindings(r),e.saveCurrentBuffers(r)},e.saveCurrentBindings=function(e){if(t.context){var r=t.context;t.previousDrawBinding=r.getParameter(t.context.FRAMEBUFFER_BINDING),t.previousActiveFramebuffer=t._openGLRenderWindow.getActiveFramebuffer()}else(0,ht.E0)("you must set the OpenGLRenderWindow before calling saveCurrentBindings")},e.saveCurrentBuffers=function(e){},e.restorePreviousBindingsAndBuffers=function(t){var r=void 0!==t?t:e.getBothMode();e.restorePreviousBindings(r),e.restorePreviousBuffers(r)},e.restorePreviousBindings=function(e){if(t.context){var r=t.context;r.bindFramebuffer(r.FRAMEBUFFER,t.previousDrawBinding),t._openGLRenderWindow.setActiveFramebuffer(t.previousActiveFramebuffer)}else(0,ht.E0)("you must set the OpenGLRenderWindow before calling restorePreviousBindings")},e.restorePreviousBuffers=function(e){},e.bind=function(){var r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;null===r&&(r=t.context.FRAMEBUFFER),t.context.bindFramebuffer(r,t.glFramebuffer);for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:0,n=t.context;if(n){var a=n.COLOR_ATTACHMENT0;if(r>0){if(!t._openGLRenderWindow.getWebgl2())return void(0,ht.E0)("Using multiple framebuffer attachments requires WebGL 2");a+=r}t.colorBuffers[r]=e,n.framebufferTexture2D(n.FRAMEBUFFER,a,n.TEXTURE_2D,e.getHandle(),0)}else(0,ht.E0)("you must set the OpenGLRenderWindow before calling setColorBuffer")},e.removeColorBuffer=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,r=t.context;if(r){var n=r.COLOR_ATTACHMENT0;if(e>0){if(!t._openGLRenderWindow.getWebgl2())return void(0,ht.E0)("Using multiple framebuffer attachments requires WebGL 2");n+=e}r.framebufferTexture2D(r.FRAMEBUFFER,n,r.TEXTURE_2D,null,0),t.colorBuffers=t.colorBuffers.splice(e,1)}else(0,ht.E0)("you must set the OpenGLRenderWindow before calling removeColorBuffer")},e.setDepthBuffer=function(e){if(t.context)if(t._openGLRenderWindow.getWebgl2()){var r=t.context;r.framebufferTexture2D(r.FRAMEBUFFER,r.DEPTH_ATTACHMENT,r.TEXTURE_2D,e.getHandle(),0)}else(0,ht.E0)("Attaching depth buffer textures to fbo requires WebGL 2");else(0,ht.E0)("you must set the OpenGLRenderWindow before calling setDepthBuffer")},e.removeDepthBuffer=function(){if(t.context)if(t._openGLRenderWindow.getWebgl2()){var e=t.context;e.framebufferTexture2D(e.FRAMEBUFFER,e.DEPTH_ATTACHMENT,e.TEXTURE_2D,null,0)}else(0,ht.E0)("Attaching depth buffer textures to framebuffers requires WebGL 2");else(0,ht.E0)("you must set the OpenGLRenderWindow before calling removeDepthBuffer")},e.getGLFramebuffer=function(){return t.glFramebuffer},e.setOpenGLRenderWindow=function(r){t._openGLRenderWindow!==r&&(e.releaseGraphicsResources(),t._openGLRenderWindow=r,t.context=null,r&&(t.context=t._openGLRenderWindow.getContext()))},e.releaseGraphicsResources=function(){t.glFramebuffer&&t.context.deleteFramebuffer(t.glFramebuffer)},e.getSize=function(){var e=[0,0];return null!==t.glFramebuffer&&(e[0]=t.glFramebuffer.width,e[1]=t.glFramebuffer.height),e},e.populateFramebuffer=function(){if(t.context){e.bind();var r=t.context,n=Yr.newInstance();n.setOpenGLRenderWindow(t._openGLRenderWindow),n.setMinificationFilter(Vr.LINEAR),n.setMagnificationFilter(Vr.LINEAR),n.create2DFromRaw(t.glFramebuffer.width,t.glFramebuffer.height,4,nn.Tu.UNSIGNED_CHAR,null),e.setColorBuffer(n),t.depthTexture=r.createRenderbuffer(),r.bindRenderbuffer(r.RENDERBUFFER,t.depthTexture),r.renderbufferStorage(r.RENDERBUFFER,r.DEPTH_COMPONENT16,t.glFramebuffer.width,t.glFramebuffer.height),r.framebufferRenderbuffer(r.FRAMEBUFFER,r.DEPTH_ATTACHMENT,r.RENDERBUFFER,t.depthTexture)}else(0,ht.E0)("you must set the OpenGLRenderWindow before calling populateFrameBuffer")},e.getColorTexture=function(){return t.colorBuffers[0]}}(e,t)}var Dn={newInstance:(0,ht.WL)(Mn,"vtkFramebuffer"),extend:Mn},Vn={NEAREST:0,LINEAR:1,FAST_LINEAR:2},Ln={FRACTIONAL:0,PROPORTIONAL:1},_n={InterpolationType:Vn,OpacityMode:Ln},Nn="//VTK::System::Dec\n\n/*=========================================================================\n\n Program: Visualization Toolkit\n Module: vtkPolyDataVS.glsl\n\n Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen\n All rights reserved.\n See Copyright.txt or http://www.kitware.com/Copyright.htm for details.\n\n This software is distributed WITHOUT ANY WARRANTY; without even\n the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR\n PURPOSE. See the above copyright notice for more information.\n\n=========================================================================*/\n\nattribute vec4 vertexDC;\n\nvarying vec3 vertexVCVSOutput;\nuniform mat4 PCVCMatrix;\n\nuniform float dcxmin;\nuniform float dcxmax;\nuniform float dcymin;\nuniform float dcymax;\n\nvoid main()\n{\n // dcsmall is the device coords reduced to the\n // x y area covered by the volume\n vec4 dcsmall = vec4(\n dcxmin + 0.5 * (vertexDC.x + 1.0) * (dcxmax - dcxmin),\n dcymin + 0.5 * (vertexDC.y + 1.0) * (dcymax - dcymin),\n vertexDC.z,\n vertexDC.w);\n vec4 vcpos = PCVCMatrix * dcsmall;\n vertexVCVSOutput = vcpos.xyz/vcpos.w;\n gl_Position = dcsmall;\n}\n",Bn="//VTK::System::Dec\n\n/*=========================================================================\n\n Program: Visualization Toolkit\n Module: vtkVolumeFS.glsl\n\n Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen\n All rights reserved.\n See Copyright.txt or http://www.kitware.com/Copyright.htm for details.\n\n This software is distributed WITHOUT ANY WARRANTY; without even\n the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR\n PURPOSE. See the above copyright notice for more information.\n\n=========================================================================*/\n// Template for the volume mappers fragment shader\n\n// the output of this shader\n//VTK::Output::Dec\n\nvarying vec3 vertexVCVSOutput;\n\n// first declare the settings from the mapper\n// that impact the code paths in here\n\n// always set vtkNumComponents 1,2,3,4\n//VTK::NumComponents\n\n// possibly define vtkTrilinearOn\n//VTK::TrilinearOn\n\n// possibly define vtkIndependentComponents\n//VTK::IndependentComponentsOn\n\n// possibly define any \"proportional\" components\n//VTK::vtkProportionalComponents\n\n// Define the blend mode to use\n#define vtkBlendMode //VTK::BlendMode\n\n// Possibly define vtkImageLabelOutlineOn\n//VTK::ImageLabelOutlineOn\n\n#ifdef vtkImageLabelOutlineOn\nuniform int outlineThickness;\nuniform float outlineOpacity;\nuniform float vpWidth;\nuniform float vpHeight;\nuniform float vpOffsetX;\nuniform float vpOffsetY;\nuniform mat4 PCWCMatrix;\nuniform mat4 vWCtoIDX;\n#endif\n\n// define vtkLightComplexity\n//VTK::LightComplexity\n#if vtkLightComplexity > 0\nuniform float vSpecularPower;\nuniform float vAmbient;\nuniform float vDiffuse;\nuniform float vSpecular;\n//VTK::Light::Dec\n#endif\n\n//VTK::VolumeShadowOn\n//VTK::SurfaceShadowOn\n//VTK::localAmbientOcclusionOn\n//VTK::LAO::Dec\n//VTK::VolumeShadow::Dec\n\n// define vtkComputeNormalFromOpacity\n//VTK::vtkComputeNormalFromOpacity\n\n// possibly define vtkGradientOpacityOn\n//VTK::GradientOpacityOn\n#ifdef vtkGradientOpacityOn\nuniform float goscale0;\nuniform float goshift0;\nuniform float gomin0;\nuniform float gomax0;\n#if defined(vtkIndependentComponentsOn) && (vtkNumComponents > 1)\nuniform float goscale1;\nuniform float goshift1;\nuniform float gomin1;\nuniform float gomax1;\n#if vtkNumComponents >= 3\nuniform float goscale2;\nuniform float goshift2;\nuniform float gomin2;\nuniform float gomax2;\n#endif\n#if vtkNumComponents >= 4\nuniform float goscale3;\nuniform float goshift3;\nuniform float gomin3;\nuniform float gomax3;\n#endif\n#endif\n#endif\n\n// if you want to see the raw tiled\n// data in webgl1 uncomment the following line\n// #define debugtile\n\n// camera values\nuniform float camThick;\nuniform float camNear;\nuniform float camFar;\nuniform int cameraParallel;\n\n// values describing the volume geometry\nuniform vec3 vOriginVC;\nuniform vec3 vSpacing;\nuniform ivec3 volumeDimensions; // 3d texture dimensions\nuniform vec3 vPlaneNormal0;\nuniform float vPlaneDistance0;\nuniform vec3 vPlaneNormal1;\nuniform float vPlaneDistance1;\nuniform vec3 vPlaneNormal2;\nuniform float vPlaneDistance2;\nuniform vec3 vPlaneNormal3;\nuniform float vPlaneDistance3;\nuniform vec3 vPlaneNormal4;\nuniform float vPlaneDistance4;\nuniform vec3 vPlaneNormal5;\nuniform float vPlaneDistance5;\n\n//VTK::ClipPlane::Dec\n\n// opacity and color textures\nuniform sampler2D otexture;\nuniform float oshift0;\nuniform float oscale0;\nuniform sampler2D ctexture;\nuniform float cshift0;\nuniform float cscale0;\n\n// jitter texture\nuniform sampler2D jtexture;\n\n// some 3D texture values\nuniform float sampleDistance;\nuniform vec3 vVCToIJK;\n\n// the heights defined below are the locations\n// for the up to four components of the tfuns\n// the tfuns have a height of 2XnumComps pixels so the\n// values are computed to hit the middle of the two rows\n// for that component\n#ifdef vtkIndependentComponentsOn\n#if vtkNumComponents == 2\nuniform float mix0;\nuniform float mix1;\n#define height0 0.25\n#define height1 0.75\n#endif\n#if vtkNumComponents == 3\nuniform float mix0;\nuniform float mix1;\nuniform float mix2;\n#define height0 0.17\n#define height1 0.5\n#define height2 0.83\n#endif\n#if vtkNumComponents == 4\nuniform float mix0;\nuniform float mix1;\nuniform float mix2;\nuniform float mix3;\n#define height0 0.125\n#define height1 0.375\n#define height2 0.625\n#define height3 0.875\n#endif\n#endif\n\n#if vtkNumComponents >= 2\nuniform float oshift1;\nuniform float oscale1;\nuniform float cshift1;\nuniform float cscale1;\n#endif\n#if vtkNumComponents >= 3\nuniform float oshift2;\nuniform float oscale2;\nuniform float cshift2;\nuniform float cscale2;\n#endif\n#if vtkNumComponents >= 4\nuniform float oshift3;\nuniform float oscale3;\nuniform float cshift3;\nuniform float cscale3;\n#endif\n\nuniform vec4 ipScalarRangeMin;\nuniform vec4 ipScalarRangeMax;\n\n// declaration for intermixed geometry\n//VTK::ZBuffer::Dec\n\n//=======================================================================\n// global and custom variables (a temporary section before photorealistics rendering module is complete)\nvec3 rayDirVC;\nfloat sampleDistanceISVS;\nfloat sampleDistanceIS;\n\n#define SQRT3 1.7321\n#define INV4PI 0.0796\n#define EPSILON 0.001\n#define PI 3.1415\n#define PI2 9.8696\n\n//=======================================================================\n// Webgl2 specific version of functions\n#if __VERSION__ == 300\n\nuniform highp sampler3D texture1;\n\nvec4 getTextureValue(vec3 pos)\n{\n vec4 tmp = texture(texture1, pos);\n#if vtkNumComponents == 1\n tmp.a = tmp.r;\n#endif\n#if vtkNumComponents == 2\n tmp.a = tmp.g;\n#endif\n#if vtkNumComponents == 3\n tmp.a = length(tmp.rgb);\n#endif\n return tmp;\n}\n\n//=======================================================================\n// WebGL1 specific version of functions\n#else\n\nuniform sampler2D texture1;\n\nuniform float texWidth;\nuniform float texHeight;\nuniform int xreps;\nuniform int xstride;\nuniform int ystride;\n\n// if computing trilinear values from multiple z slices\n#ifdef vtkTrilinearOn\nvec4 getTextureValue(vec3 ijk)\n{\n float zoff = 1.0/float(volumeDimensions.z);\n vec4 val1 = getOneTextureValue(ijk);\n vec4 val2 = getOneTextureValue(vec3(ijk.xy, ijk.z + zoff));\n\n float indexZ = float(volumeDimensions)*ijk.z;\n float zmix = indexZ - floor(indexZ);\n\n return mix(val1, val2, zmix);\n}\n\nvec4 getOneTextureValue(vec3 ijk)\n#else // nearest or fast linear\nvec4 getTextureValue(vec3 ijk)\n#endif\n{\n vec3 tdims = vec3(volumeDimensions);\n\n#ifdef debugtile\n vec2 tpos = vec2(ijk.x, ijk.y);\n vec4 tmp = texture2D(texture1, tpos);\n tmp.a = 1.0;\n\n#else\n int z = int(ijk.z * tdims.z);\n int yz = z / xreps;\n int xz = z - yz*xreps;\n\n int tileWidth = volumeDimensions.x/xstride;\n int tileHeight = volumeDimensions.y/ystride;\n\n xz *= tileWidth;\n yz *= tileHeight;\n\n float ni = float(xz) + (ijk.x*float(tileWidth));\n float nj = float(yz) + (ijk.y*float(tileHeight));\n\n vec2 tpos = vec2(ni/texWidth, nj/texHeight);\n\n vec4 tmp = texture2D(texture1, tpos);\n\n#if vtkNumComponents == 1\n tmp.a = tmp.r;\n#endif\n#if vtkNumComponents == 2\n tmp.g = tmp.a;\n#endif\n#if vtkNumComponents == 3\n tmp.a = length(tmp.rgb);\n#endif\n#endif\n\n return tmp;\n}\n\n// End of Webgl1 specific code\n//=======================================================================\n#endif\n\n//=======================================================================\n// transformation between VC and IS space\n\n// convert vector position from idx to vc\n#if vtkLightComplexity > 0\nvec3 IStoVC(vec3 posIS){\n vec3 posVC = posIS / vVCToIJK;\n return posVC.x * vPlaneNormal0 +\n posVC.y * vPlaneNormal2 +\n posVC.z * vPlaneNormal4 +\n vOriginVC;\n}\n\n// convert vector position from vc to idx\nvec3 VCtoIS(vec3 posVC){\n posVC = posVC - vOriginVC;\n posVC = vec3(\n dot(posVC, vPlaneNormal0),\n dot(posVC, vPlaneNormal2),\n dot(posVC, vPlaneNormal4));\n return posVC * vVCToIJK;\n}\n#endif\n\n//Rotate vector to view coordinate\n#if (vtkLightComplexity > 0) || (defined vtkGradientOpacityOn)\nvoid rotateToViewCoord(inout vec3 dirIS){\n dirIS.xyz =\n dirIS.x * vPlaneNormal0 +\n dirIS.y * vPlaneNormal2 +\n dirIS.z * vPlaneNormal4;\n}\n\n//Rotate vector to idx coordinate\nvec3 rotateToIDX(vec3 dirVC){\n vec3 dirIS;\n dirIS.xyz = vec3(\n dot(dirVC, vPlaneNormal0),\n dot(dirVC, vPlaneNormal2),\n dot(dirVC, vPlaneNormal4));\n return dirIS;\n}\n#endif\n\n//=======================================================================\n// Given a normal compute the gradient opacity factors\nfloat computeGradientOpacityFactor(\n float normalMag, float goscale, float goshift, float gomin, float gomax)\n{\n#if defined(vtkGradientOpacityOn)\n return clamp(normalMag * goscale + goshift, gomin, gomax);\n#else\n return 1.0;\n#endif\n}\n\n//=======================================================================\n// compute the normal and gradient magnitude for a position, uses forward difference\n#if (vtkLightComplexity > 0) || (defined vtkGradientOpacityOn)\n #ifdef vtkComputeNormalFromOpacity\n #ifdef vtkGradientOpacityOn\n vec4 computeNormalForDensity(vec3 pos, float scalar, vec3 tstep, out mat3 scalarInterp, out vec3 secondaryGradientMag)\n {\n vec4 result;\n scalarInterp[0][0] = getTextureValue(pos + vec3(tstep.x, 0.0, 0.0)).a;\n scalarInterp[0][1] = getTextureValue(pos + vec3(0.0, tstep.y, 0.0)).a;\n scalarInterp[0][2] = getTextureValue(pos + vec3(0.0, 0.0, tstep.z)).a;\n // look up scalar values for computing secondary gradient\n scalarInterp[1][0] = getTextureValue(pos + vec3(2.0*tstep.x, 0.0, 0.0)).a;\n scalarInterp[1][1] = getTextureValue(pos + vec3(0.0, 2.0*tstep.y, 0.0)).a;\n scalarInterp[1][2] = getTextureValue(pos + vec3(0.0, 0.0, 2.0*tstep.z)).a;\n scalarInterp[2][0] = getTextureValue(pos + vec3(tstep.x, tstep.y, 0.0)).a;\n scalarInterp[2][1] = getTextureValue(pos + vec3(tstep.x, 0.0, tstep.z)).a;\n scalarInterp[2][2] = getTextureValue(pos + vec3(0.0, tstep.y, tstep.z)).a;\n result.x = scalarInterp[0][0] - scalar;\n result.y = scalarInterp[0][1] - scalar;\n result.z = scalarInterp[0][2] - scalar;\n // divide by spacing\n result.xyz /= vSpacing;\n result.w = length(result.xyz);\n rotateToViewCoord(result.xyz);\n secondaryGradientMag.x = length(vec3(scalarInterp[1][0] - scalarInterp[0][0],\n scalarInterp[2][0] - scalarInterp[0][0],\n scalarInterp[2][1] - scalarInterp[0][0]) / vSpacing);\n secondaryGradientMag.y = length(vec3(scalarInterp[2][0] - scalarInterp[0][1],\n scalarInterp[1][1] - scalarInterp[0][1],\n scalarInterp[2][2] - scalarInterp[0][1]) / vSpacing);\n secondaryGradientMag.z = length(vec3(scalarInterp[2][1] - scalarInterp[0][2],\n scalarInterp[2][2] - scalarInterp[0][2],\n scalarInterp[1][2] - scalarInterp[0][2]) / vSpacing);\n if (length(result.xyz) > 0.0) {\n return vec4(normalize(result.xyz),result.w);\n } else {\n return vec4(0.0);\n }\n }\n\n vec4 computeDensityNormal(float scalar, float gradientMag, mat3 scalarInterp, vec3 secondaryGradientMag)\n {\n vec4 opacityG;\n vec3 opacityInterp = vec3(0.0);\n float opacity = texture2D(otexture, vec2(scalar * oscale0 + oshift0, 0.5)).r;\n if (gradientMag >= 0.0){\n opacity *= computeGradientOpacityFactor(gradientMag, goscale0, goshift0, gomin0, gomax0);\n }\n opacityInterp.x = texture2D(otexture, vec2(scalarInterp[0][0] * oscale0 + oshift0, 0.5)).r;\n if (secondaryGradientMag.x >= 0.0){\n opacityInterp.x *= computeGradientOpacityFactor(secondaryGradientMag.x, goscale0, goshift0, gomin0, gomax0);\n }\n\n opacityInterp.y = texture2D(otexture, vec2(scalarInterp[0][1] * oscale0 + oshift0, 0.5)).r;\n if (secondaryGradientMag.y >= 0.0){\n opacityInterp.y *= computeGradientOpacityFactor(secondaryGradientMag.y, goscale0, goshift0, gomin0, gomax0);\n }\n\n opacityInterp.z = texture2D(otexture, vec2(scalarInterp[0][2] * oscale0 + oshift0, 0.5)).r;\n if (secondaryGradientMag.z >= 0.0){\n opacityInterp.z *= computeGradientOpacityFactor(secondaryGradientMag.z, goscale0, goshift0, gomin0, gomax0);\n }\n\n opacityG.xyz = opacityInterp - vec3(opacity,opacity,opacity);\n // divide by spacing\n opacityG.xyz /= vSpacing;\n opacityG.w = length(opacityG.xyz);\n rotateToViewCoord(opacityG.xyz);\n if (length(opacityG.xyz) > 0.0) {\n return vec4(normalize(opacityG.xyz),opacityG.w);\n } else {\n return vec4(0.0);\n }\n }\n\n #else\n //if gradient opacity not on but using density gradient\n vec4 computeDensityNormal(float scalar, vec3 scalarInterp)\n {\n vec4 opacityG;\n float opacity = texture2D(otexture, vec2(scalar * oscale0 + oshift0, 0.5)).r;\n opacityG.x = texture2D(otexture, vec2(scalarInterp.x * oscale0 + oshift0, 0.5)).r - opacity;\n opacityG.y = texture2D(otexture, vec2(scalarInterp.y * oscale0 + oshift0, 0.5)).r - opacity;\n opacityG.z = texture2D(otexture, vec2(scalarInterp.z * oscale0 + oshift0, 0.5)).r - opacity;\n // divide by spacing\n opacityG.xyz /= vSpacing;\n opacityG.w = length(opacityG.xyz);\n // rotate to View Coords\n rotateToViewCoord(opacityG.xyz);\n if (length(opacityG.xyz) > 0.0) {\n return vec4(normalize(opacityG.xyz),opacityG.w);\n } else {\n return vec4(0.0);\n }\n }\n vec4 computeNormalForDensity(vec3 pos, float scalar, vec3 tstep, out vec3 scalarInterp)\n {\n vec4 result;\n scalarInterp.x = getTextureValue(pos + vec3(tstep.x, 0.0, 0.0)).a;\n scalarInterp.y = getTextureValue(pos + vec3(0.0, tstep.y, 0.0)).a;\n scalarInterp.z = getTextureValue(pos + vec3(0.0, 0.0, tstep.z)).a;\n result.x = scalarInterp.x - scalar;\n result.y = scalarInterp.y - scalar;\n result.z = scalarInterp.z - scalar;\n // divide by spacing\n result.xyz /= vSpacing;\n result.w = length(result.xyz);\n // rotate to View Coords\n rotateToViewCoord(result.xyz);\n if (length(result.xyz) > 0.0) {\n return vec4(normalize(result.xyz),result.w);\n } else {\n return vec4(0.0);\n }\n }\n #endif\n #endif\n // compute scalar density\n vec4 computeNormal(vec3 pos, float scalar, vec3 tstep)\n {\n vec4 result;\n result.x = getTextureValue(pos + vec3(tstep.x, 0.0, 0.0)).a - scalar;\n result.y = getTextureValue(pos + vec3(0.0, tstep.y, 0.0)).a - scalar;\n result.z = getTextureValue(pos + vec3(0.0, 0.0, tstep.z)).a - scalar;\n // divide by spacing\n result.xyz /= vSpacing;\n result.w = length(result.xyz);\n if (result.w > 0.0){\n // rotate to View Coords\n rotateToViewCoord(result.xyz);\n return vec4(normalize(result.xyz),result.w);\n } else {\n return vec4(0.0);\n }\n }\n#endif\n\n#ifdef vtkImageLabelOutlineOn\nvec3 fragCoordToIndexSpace(vec4 fragCoord) {\n vec4 pcPos = vec4(\n (fragCoord.x / vpWidth - vpOffsetX - 0.5) * 2.0,\n (fragCoord.y / vpHeight - vpOffsetY - 0.5) * 2.0,\n (fragCoord.z - 0.5) * 2.0,\n 1.0);\n\n vec4 worldCoord = PCWCMatrix * pcPos;\n vec4 vertex = (worldCoord/worldCoord.w);\n\n vec3 index = (vWCtoIDX * vertex).xyz;\n\n // half voxel fix for labelmapOutline\n return (index + vec3(0.5)) / vec3(volumeDimensions);\n}\n#endif\n\n//=======================================================================\n// compute the normals and gradient magnitudes for a position\n// for independent components\nmat4 computeMat4Normal(vec3 pos, vec4 tValue, vec3 tstep)\n{\n mat4 result;\n vec4 distX = getTextureValue(pos + vec3(tstep.x, 0.0, 0.0)) - tValue;\n vec4 distY = getTextureValue(pos + vec3(0.0, tstep.y, 0.0)) - tValue;\n vec4 distZ = getTextureValue(pos + vec3(0.0, 0.0, tstep.z)) - tValue;\n\n // divide by spacing\n distX /= vSpacing.x;\n distY /= vSpacing.y;\n distZ /= vSpacing.z;\n\n mat3 rot;\n rot[0] = vPlaneNormal0;\n rot[1] = vPlaneNormal2;\n rot[2] = vPlaneNormal4;\n\n#if !defined(vtkComponent0Proportional)\n result[0].xyz = vec3(distX.r, distY.r, distZ.r);\n result[0].a = length(result[0].xyz);\n result[0].xyz *= rot;\n if (result[0].w > 0.0)\n {\n result[0].xyz /= result[0].w;\n }\n#endif\n\n// optionally compute the 2nd component\n#if vtkNumComponents >= 2 && !defined(vtkComponent1Proportional)\n result[1].xyz = vec3(distX.g, distY.g, distZ.g);\n result[1].a = length(result[1].xyz);\n result[1].xyz *= rot;\n if (result[1].w > 0.0)\n {\n result[1].xyz /= result[1].w;\n }\n#endif\n\n// optionally compute the 3rd component\n#if vtkNumComponents >= 3 && !defined(vtkComponent2Proportional)\n result[2].xyz = vec3(distX.b, distY.b, distZ.b);\n result[2].a = length(result[2].xyz);\n result[2].xyz *= rot;\n if (result[2].w > 0.0)\n {\n result[2].xyz /= result[2].w;\n }\n#endif\n\n// optionally compute the 4th component\n#if vtkNumComponents >= 4 && !defined(vtkComponent3Proportional)\n result[3].xyz = vec3(distX.a, distY.a, distZ.a);\n result[3].a = length(result[3].xyz);\n result[3].xyz *= rot;\n if (result[3].w > 0.0)\n {\n result[3].xyz /= result[3].w;\n }\n#endif\n\n return result;\n}\n\n//=======================================================================\n// global shadow - secondary ray\n#if defined(VolumeShadowOn) || defined(localAmbientOcclusionOn)\nfloat random()\n{\n float rand = fract(sin(dot(gl_FragCoord.xy,vec2(12.9898,78.233)))*43758.5453123);\n float jitter=texture2D(jtexture,gl_FragCoord.xy/32.).r;\n uint pcg_state = floatBitsToUint(jitter);\n uint state = pcg_state;\n pcg_state = pcg_state * uint(747796405) + uint(2891336453);\n uint word = ((state >> ((state >> uint(28)) + uint(4))) ^ state) * uint(277803737);\n return (float((((word >> uint(22)) ^ word) >> 1 ))/float(2147483647) + rand)/2.0;\n}\n#endif\n\n#ifdef VolumeShadowOn\n// henyey greenstein phase function\nfloat phase_function(float cos_angle)\n{\n // divide by 2.0 instead of 4pi to increase intensity\n return ((1.0-anisotropy2)/pow(1.0+anisotropy2-2.0*anisotropy*cos_angle, 1.5))/2.0;\n}\n\n// Computes the intersection between a ray and a box\nstruct Hit\n{\n float tmin;\n float tmax;\n};\n\nstruct Ray\n{\n vec3 origin;\n vec3 dir;\n vec3 invDir;\n};\n\nbool BBoxIntersect(vec3 boundMin, vec3 boundMax, const Ray r, out Hit hit)\n{\n vec3 tbot = r.invDir * (boundMin - r.origin);\n vec3 ttop = r.invDir * (boundMax - r.origin);\n vec3 tmin = min(ttop, tbot);\n vec3 tmax = max(ttop, tbot);\n vec2 t = max(tmin.xx, tmin.yz);\n float t0 = max(t.x, t.y);\n t = min(tmax.xx, tmax.yz);\n float t1 = min(t.x, t.y);\n hit.tmin = t0;\n hit.tmax = t1;\n return t1 > max(t0,0.0);\n}\n\n// As BBoxIntersect requires the inverse of the ray coords,\n// this function is used to avoid numerical issues\nvoid safe_0_vector(inout Ray ray)\n{\n if(abs(ray.dir.x) < EPSILON) ray.dir.x = sign(ray.dir.x) * EPSILON;\n if(abs(ray.dir.y) < EPSILON) ray.dir.y = sign(ray.dir.y) * EPSILON;\n if(abs(ray.dir.z) < EPSILON) ray.dir.z = sign(ray.dir.z) * EPSILON;\n}\n\nfloat volume_shadow(vec3 posIS, vec3 lightDirNormIS)\n{\n float shadow = 1.0;\n float opacity = 0.0;\n\n // modify sample distance with a random number between 1.5 and 3.0\n float sampleDistanceISVS_jitter = sampleDistanceISVS * mix(1.5, 3.0, random());\n float opacityPrev = texture2D(otexture, vec2(getTextureValue(posIS).r * oscale0 + oshift0, 0.5)).r;\n\n // in case the first sample near surface has a very tiled light ray, we need to offset start position\n posIS += sampleDistanceISVS_jitter * lightDirNormIS;\n\n // compute the start and end points for the ray\n Ray ray;\n Hit hit;\n ray.origin = posIS;\n ray.dir = lightDirNormIS;\n safe_0_vector(ray);\n ray.invDir = 1.0/ray.dir;\n\n if(!BBoxIntersect(vec3(0.0),vec3(1.0), ray, hit))\n {\n return 1.0;\n }\n float maxdist = hit.tmax;\n\n // interpolate shadow ray length between: 1 unit of sample distance in IS to SQRT3, based on globalIlluminationReach\n float maxgi = mix(sampleDistanceISVS_jitter,SQRT3,giReach);\n maxdist = min(maxdist,maxgi);\n if(maxdist < EPSILON) {\n return 1.0;\n }\n\n // support gradient opacity\n #ifdef vtkGradientOpacityOn\n vec4 normal;\n #endif\n\n float current_dist = 0.0;\n float current_step = length(sampleDistanceISVS_jitter * lightDirNormIS);\n float clamped_step = 0.0;\n\n vec4 scalar = vec4(0.0);\n while(current_dist < maxdist)\n {\n scalar = getTextureValue(posIS);\n opacity = texture2D(otexture, vec2(scalar.r * oscale0 + oshift0, 0.5)).r;\n #ifdef vtkGradientOpacityOn\n normal = computeNormal(posIS, scalar.a, vec3(1.0/vec3(volumeDimensions)));\n opacity *= computeGradientOpacityFactor(normal.w, goscale0, goshift0, gomin0, gomax0);\n #endif\n shadow *= 1.0 - opacity;\n\n // optimization: early termination\n if (shadow < EPSILON){\n return 0.0;\n }\n\n clamped_step = min(maxdist - current_dist, current_step);\n posIS += clamped_step * lightDirNormIS;\n current_dist += current_step;\n }\n\n return shadow;\n}\n\nvec3 applyShadowRay(vec3 tColor, vec3 posIS, vec3 viewDirectionVC)\n{\n vec3 vertLight = vec3(0.0);\n vec3 secondary_contrib = vec3(0.0);\n // here we assume only positional light, no effect of cones\n for (int i = 0; i < lightNum; i++)\n {\n #if(vtkLightComplexity==3)\n if (lightPositional[i] == 1){\n vertLight = lightPositionVC[i] - IStoVC(posIS);\n }else{\n vertLight = - lightDirectionVC[i];\n }\n #else\n vertLight = - lightDirectionVC[i];\n #endif\n // here we assume achromatic light, only intensity\n float dDotL = dot(viewDirectionVC, normalize(vertLight));\n // isotropic scatter returns 0.5 instead of 1/4pi to increase intensity\n float phase_attenuation = 0.5;\n if (abs(anisotropy) > EPSILON){\n phase_attenuation = phase_function(dDotL);\n }\n float vol_shadow = volume_shadow(posIS, normalize(rotateToIDX(vertLight)));\n secondary_contrib += tColor * vDiffuse * lightColor[i] * vol_shadow * phase_attenuation;\n secondary_contrib += tColor * vAmbient;\n }\n return secondary_contrib;\n}\n#endif\n\n//=======================================================================\n// local ambient occlusion\n#ifdef localAmbientOcclusionOn\nvec3 sample_direction_uniform(int i)\n{\n float rand = random() * 0.5;\n float theta = PI2 * (kernelSample[i][0] + rand);\n float phi = acos(2.0 * (kernelSample[i][1] + rand) -1.0) / 2.5;\n return normalize(vec3(cos(theta)*sin(phi), sin(theta)*sin(phi), cos(phi)));\n}\n\n// return a matrix that transform startDir into z axis; startDir should be normalized\nmat3 zBaseRotationalMatrix(vec3 startDir){\n vec3 axis = cross(startDir, vec3(0.0,0.0,1.0));\n float cosA = startDir.z;\n float k = 1.0 / (1.0 + cosA);\n mat3 matrix = mat3((axis.x * axis.x * k) + cosA, (axis.y * axis.x * k) - axis.z, (axis.z * axis.x * k) + axis.y,\n (axis.x * axis.y * k) + axis.z, (axis.y * axis.y * k) + cosA, (axis.z * axis.y * k) - axis.x,\n (axis.x * axis.z * k) - axis.y, (axis.y * axis.z * k) + axis.x, (axis.z * axis.z * k) + cosA);\n return matrix;\n}\n\nfloat computeLAO(vec3 posIS, float op, vec3 lightDir, vec4 normal){\n // apply LAO only at selected locations, otherwise return full brightness\n if (normal.w > 0.0 && op > 0.05){\n float total_transmittance = 0.0;\n mat3 inverseRotateBasis = inverse(zBaseRotationalMatrix(normalize(-normal.xyz)));\n vec3 currPos, randomDirStep;\n float weight, transmittance, opacity;\n for (int i = 0; i < kernelSize; i++)\n {\n randomDirStep = inverseRotateBasis * sample_direction_uniform(i) * sampleDistanceIS;\n weight = 1.0 - dot(normalize(lightDir), normalize(randomDirStep));\n currPos = posIS;\n transmittance = 1.0;\n for (int j = 0; j < kernelRadius ; j++){\n currPos += randomDirStep;\n // check if it's at clipping plane, if so return full brightness\n if (all(greaterThan(currPos, vec3(EPSILON))) && all(lessThan(currPos,vec3(1.0-EPSILON)))){\n opacity = texture2D(otexture, vec2(getTextureValue(currPos).r * oscale0 + oshift0, 0.5)).r;\n #ifdef vtkGradientOpacityOn\n opacity *= computeGradientOpacityFactor(normal.w, goscale0, goshift0, gomin0, gomax0);\n #endif\n transmittance *= 1.0 - opacity;\n }\n else{\n break;\n }\n }\n total_transmittance += transmittance / float(kernelRadius) * weight;\n\n // early termination if fully translucent\n if (total_transmittance > 1.0 - EPSILON){\n return 1.0;\n }\n }\n // average transmittance and reduce variance\n return clamp(total_transmittance / float(kernelSize), 0.3, 1.0);\n } else {\n return 1.0;\n }\n}\n#endif\n\n//=======================================================================\n// surface light contribution\n#if vtkLightComplexity > 0\n void applyLighting(inout vec3 tColor, vec4 normal)\n {\n vec3 diffuse = vec3(0.0, 0.0, 0.0);\n vec3 specular = vec3(0.0, 0.0, 0.0);\n float df, sf = 0.0;\n for (int i = 0; i < lightNum; i++){\n df = abs(dot(normal.rgb, -lightDirectionVC[i]));\n diffuse += df * lightColor[i];\n sf = pow( abs(dot(lightHalfAngleVC[i],normal.rgb)), vSpecularPower);\n specular += sf * lightColor[i];\n }\n tColor.rgb = tColor.rgb*(diffuse*vDiffuse + vAmbient) + specular*vSpecular;\n }\n #ifdef SurfaceShadowOn\n #if vtkLightComplexity < 3\n vec3 applyLightingDirectional(vec3 posIS, vec4 tColor, vec4 normal)\n {\n // everything in VC\n vec3 diffuse = vec3(0.0);\n vec3 specular = vec3(0.0);\n #ifdef localAmbientOcclusionOn\n vec3 ambient = vec3(0.0);\n #endif\n vec3 vertLightDirection;\n for (int i = 0; i < lightNum; i++){\n float ndotL,vdotR;\n vertLightDirection = lightDirectionVC[i];\n ndotL = dot(normal.xyz, vertLightDirection);\n if (ndotL < 0.0 && twoSidedLighting)\n {\n ndotL = -ndotL;\n }\n if (ndotL > 0.0)\n {\n diffuse += ndotL * lightColor[i];\n //specular\n vdotR = dot(-rayDirVC, normalize(2.0 * ndotL * -normal.xyz + vertLightDirection));\n if (vdotR > 0.0)\n {\n specular += pow(vdotR, vSpecularPower) * lightColor[i];\n }\n }\n #ifdef localAmbientOcclusionOn\n ambient += computeLAO(posIS, tColor.a, vertLightDirection, normal);\n #endif\n }\n #ifdef localAmbientOcclusionOn\n return tColor.rgb * (diffuse * vDiffuse + vAmbient * ambient) + specular*vSpecular;\n #else\n return tColor.rgb * (diffuse * vDiffuse + vAmbient) + specular*vSpecular;\n #endif\n }\n #else\n vec3 applyLightingPositional(vec3 posIS, vec4 tColor, vec4 normal, vec3 posVC)\n {\n // everything in VC\n vec3 diffuse = vec3(0.0);\n vec3 specular = vec3(0.0);\n #ifdef localAmbientOcclusionOn\n vec3 ambient = vec3(0.0);\n #endif\n vec3 vertLightDirection;\n for (int i = 0; i < lightNum; i++){\n float distance,attenuation,ndotL,vdotR;\n vec3 lightDir;\n if (lightPositional[i] == 1){\n lightDir = lightDirectionVC[i];\n vertLightDirection = posVC - lightPositionVC[i];\n distance = length(vertLightDirection);\n vertLightDirection = normalize(vertLightDirection);\n attenuation = 1.0 / (lightAttenuation[i].x\n + lightAttenuation[i].y * distance\n + lightAttenuation[i].z * distance * distance);\n // per OpenGL standard cone angle is 90 or less for a spot light\n if (lightConeAngle[i] <= 90.0){\n float coneDot = dot(vertLightDirection, lightDir);\n if (coneDot >= cos(radians(lightConeAngle[i]))){ // if inside cone\n attenuation = attenuation * pow(coneDot, lightExponent[i]);\n }\n else {\n attenuation = 0.0;\n }\n }\n ndotL = dot(normal.xyz, vertLightDirection);\n if (ndotL < 0.0 && twoSidedLighting)\n {\n ndotL = -ndotL;\n }\n if (ndotL > 0.0)\n {\n diffuse += ndotL * attenuation * lightColor[i];\n //specular\n vdotR = dot(-rayDirVC, normalize(2.0 * ndotL * -normal.xyz + vertLightDirection));\n if (vdotR > 0.0)\n {\n specular += pow(vdotR, vSpecularPower) * attenuation * lightColor[i];\n }\n }\n #ifdef localAmbientOcclusionOn\n ambient += computeLAO(posIS, tColor.a, vertLightDirection, normal);\n #endif\n } else {\n vertLightDirection = lightDirectionVC[i];\n ndotL = dot(normal.xyz, vertLightDirection);\n if (ndotL < 0.0 && twoSidedLighting)\n {\n ndotL = -ndotL;\n }\n if (ndotL > 0.0)\n {\n diffuse += ndotL * lightColor[i];\n //specular\n vdotR = dot(-rayDirVC, normalize(2.0 * ndotL * -normal.xyz + vertLightDirection));\n if (vdotR > 0.0)\n {\n specular += pow(vdotR, vSpecularPower) * lightColor[i];\n }\n }\n #ifdef localAmbientOcclusionOn\n ambient += computeLAO(posIS, tColor.a, vertLightDirection, normal);\n #endif\n }\n }\n #ifdef localAmbientOcclusionOn\n return tColor.rgb * (diffuse * vDiffuse + vAmbient * ambient) + specular*vSpecular;\n #else\n return tColor.rgb * (diffuse * vDiffuse + vAmbient) + specular*vSpecular;\n #endif\n }\n #endif\n #endif\n#endif\n\n//=======================================================================\n// Given a texture value compute the color and opacity\n//\nvec4 getColorForValue(vec4 tValue, vec3 posIS, vec3 tstep)\n{\n#ifdef vtkImageLabelOutlineOn\n vec3 centerPosIS = fragCoordToIndexSpace(gl_FragCoord); // pos in texture space\n vec4 centerValue = getTextureValue(centerPosIS);\n bool pixelOnBorder = false;\n vec4 tColor = texture2D(ctexture, vec2(centerValue.r * cscale0 + cshift0, 0.5));\n\n // Get alpha of segment from opacity function.\n tColor.a = texture2D(otexture, vec2(centerValue.r * oscale0 + oshift0, 0.5)).r;\n\n // Only perform outline check on fragments rendering voxels that aren't invisible.\n // Saves a bunch of needless checks on the background.\n // TODO define epsilon when building shader?\n if (float(tColor.a) > 0.01) {\n for (int i = -outlineThickness; i <= outlineThickness; i++) {\n for (int j = -outlineThickness; j <= outlineThickness; j++) {\n if (i == 0 || j == 0) {\n continue;\n }\n\n vec4 neighborPixelCoord = vec4(gl_FragCoord.x + float(i),\n gl_FragCoord.y + float(j),\n gl_FragCoord.z, gl_FragCoord.w);\n\n vec3 neighborPosIS = fragCoordToIndexSpace(neighborPixelCoord);\n vec4 value = getTextureValue(neighborPosIS);\n\n // If any of my neighbours are not the same value as I\n // am, this means I am on the border of the segment.\n // We can break the loops\n if (any(notEqual(value, centerValue))) {\n pixelOnBorder = true;\n break;\n }\n }\n\n if (pixelOnBorder == true) {\n break;\n }\n }\n\n // If I am on the border, I am displayed at full opacity\n if (pixelOnBorder == true) {\n tColor.a = outlineOpacity;\n }\n }\n\n#else\n // compute the normal and gradient magnitude if needed\n // We compute it as a vec4 if possible otherwise a mat4\n //\n vec4 goFactor = vec4(1.0,1.0,1.0,1.0);\n\n // compute the normal vectors as needed\n #if (vtkLightComplexity > 0) || defined(vtkGradientOpacityOn)\n #if defined(vtkIndependentComponentsOn) && (vtkNumComponents > 1)\n mat4 normalMat = computeMat4Normal(posIS, tValue, tstep);\n #if !defined(vtkComponent0Proportional)\n vec4 normal0 = normalMat[0];\n #endif\n #if !defined(vtkComponent1Proportional)\n vec4 normal1 = normalMat[1];\n #endif\n #if vtkNumComponents > 2\n #if !defined(vtkComponent2Proportional)\n vec4 normal2 = normalMat[2];\n #endif\n #if vtkNumComponents > 3\n #if !defined(vtkComponent3Proportional)\n vec4 normal3 = normalMat[3];\n #endif\n #endif\n #endif\n #else\n vec4 normalLight;\n #ifdef vtkComputeNormalFromOpacity\n #ifdef vtkGradientOpacityOn\n mat3 scalarInterp;\n vec3 secondaryGradientMag;\n vec4 normal0 = computeNormalForDensity(posIS, tValue.a, tstep, scalarInterp, secondaryGradientMag);\n normalLight = computeDensityNormal(tValue.a, normal0.w, scalarInterp,secondaryGradientMag);\n if (length(normalLight) == 0.0){\n normalLight = normal0;\n }\n #else\n vec3 scalarInterp;\n vec4 normal0 = computeNormalForDensity(posIS, tValue.a, tstep, scalarInterp);\n if (length(normal0)>0.0){\n normalLight = computeDensityNormal(tValue.a,scalarInterp);\n if (length(normalLight)==0.0){\n normalLight = normal0;\n }\n }\n #endif\n #else\n vec4 normal0 = computeNormal(posIS, tValue.a, tstep);\n normalLight = normal0;\n #endif\n #endif\n #endif\n\n // compute gradient opacity factors as needed\n #if defined(vtkGradientOpacityOn)\n #if !defined(vtkComponent0Proportional)\n goFactor.x =\n computeGradientOpacityFactor(normal0.a, goscale0, goshift0, gomin0, gomax0);\n #endif\n #if defined(vtkIndependentComponentsOn) && (vtkNumComponents > 1)\n #if !defined(vtkComponent1Proportional)\n goFactor.y =\n computeGradientOpacityFactor(normal1.a, goscale1, goshift1, gomin1, gomax1);\n #endif\n #if vtkNumComponents > 2\n #if !defined(vtkComponent2Proportional)\n goFactor.z =\n computeGradientOpacityFactor(normal2.a, goscale2, goshift2, gomin2, gomax2);\n #endif\n #if vtkNumComponents > 3\n #if !defined(vtkComponent3Proportional)\n goFactor.w =\n computeGradientOpacityFactor(normal3.a, goscale3, goshift3, gomin3, gomax3);\n #endif\n #endif\n #endif\n #endif\n #endif\n\n // single component is always independent\n #if vtkNumComponents == 1\n vec4 tColor = texture2D(ctexture, vec2(tValue.r * cscale0 + cshift0, 0.5));\n tColor.a = goFactor.x*texture2D(otexture, vec2(tValue.r * oscale0 + oshift0, 0.5)).r;\n if (tColor.a < EPSILON){\n return vec4(0.0);\n }\n #endif\n\n #if defined(vtkIndependentComponentsOn) && vtkNumComponents >= 2\n vec4 tColor = mix0*texture2D(ctexture, vec2(tValue.r * cscale0 + cshift0, height0));\n #if !defined(vtkComponent0Proportional)\n tColor.a = goFactor.x*mix0*texture2D(otexture, vec2(tValue.r * oscale0 + oshift0, height0)).r;\n #else\n float pwfValue = texture2D(otexture, vec2(tValue.r * oscale0 + oshift0, height0)).r;\n tColor *= pwfValue;\n tColor.a *= mix(pwfValue, 1.0, (1.0 - mix0));\n #endif\n\n vec3 tColor1 = mix1*texture2D(ctexture, vec2(tValue.g * cscale1 + cshift1, height1)).rgb;\n #if !defined(vtkComponent1Proportional)\n tColor.a += goFactor.y*mix1*texture2D(otexture, vec2(tValue.g * oscale1 + oshift1, height1)).r;\n #else\n float pwfValue = texture2D(otexture, vec2(tValue.g * oscale1 + oshift1, height1)).r;\n tColor1 *= pwfValue;\n tColor.a *= mix(pwfValue, 1.0, (1.0 - mix1));\n #endif\n\n #if vtkNumComponents >= 3\n vec3 tColor2 = mix2*texture2D(ctexture, vec2(tValue.b * cscale2 + cshift2, height2)).rgb;\n #if !defined(vtkComponent2Proportional)\n tColor.a += goFactor.z*mix2*texture2D(otexture, vec2(tValue.b * oscale2 + oshift2, height2)).r;\n #else\n float pwfValue = texture2D(otexture, vec2(tValue.b * oscale2 + oshift2, height2)).r;\n tColor2 *= pwfValue;\n tColor.a *= mix(pwfValue, 1.0, (1.0 - mix2));\n #endif\n\n #if vtkNumComponents >= 4\n vec3 tColor3 = mix3*texture2D(ctexture, vec2(tValue.a * cscale3 + cshift3, height3)).rgb;\n #if !defined(vtkComponent3Proportional)\n tColor.a += goFactor.w*mix3*texture2D(otexture, vec2(tValue.a * oscale3 + oshift3, height3)).r;\n #else\n float pwfValue = texture2D(otexture, vec2(tValue.a * oscale3 + oshift3, height3)).r;\n tColor3 *= pwfValue;\n tColor.a *= mix(pwfValue, 1.0, (1.0 - mix3));\n #endif\n #endif\n #endif\n #else // then not independent\n\n #if vtkNumComponents == 2\n float lum = tValue.r * cscale0 + cshift0;\n float alpha = goFactor.x*texture2D(otexture, vec2(tValue.a * oscale1 + oshift1, 0.5)).r;\n vec4 tColor = vec4(lum, lum, lum, alpha);\n #endif\n #if vtkNumComponents == 3\n vec4 tColor;\n tColor.r = tValue.r * cscale0 + cshift0;\n tColor.g = tValue.g * cscale1 + cshift1;\n tColor.b = tValue.b * cscale2 + cshift2;\n tColor.a = goFactor.x*texture2D(otexture, vec2(tValue.a * oscale0 + oshift0, 0.5)).r;\n #endif\n #if vtkNumComponents == 4\n vec4 tColor;\n tColor.r = tValue.r * cscale0 + cshift0;\n tColor.g = tValue.g * cscale1 + cshift1;\n tColor.b = tValue.b * cscale2 + cshift2;\n tColor.a = goFactor.x*texture2D(otexture, vec2(tValue.a * oscale3 + oshift3, 0.5)).r;\n #endif\n #endif // dependent\n\n // apply lighting if requested as appropriate\n #if vtkLightComplexity > 0\n #if !defined(vtkComponent0Proportional)\n #if vtkNumComponents == 1\n #ifdef SurfaceShadowOn\n #if vtkLightComplexity < 3\n vec3 tColorS = applyLightingDirectional(posIS, tColor, normalLight);\n #else\n vec3 tColorS = applyLightingPositional(posIS, tColor, normalLight, IStoVC(posIS));\n #endif\n #endif\n\n #ifdef VolumeShadowOn\n vec3 tColorVS = applyShadowRay(tColor.rgb, posIS, rayDirVC);\n #ifdef SurfaceShadowOn\n float vol_coef = volumetricScatteringBlending * (1.0 - tColor.a / 2.0) * (1.0 - atan(normalLight.w) * INV4PI);\n tColor.rgb = (1.0-vol_coef) * tColorS + vol_coef * tColorVS;\n #else\n tColor.rgb = tColorVS;\n #endif\n #else\n tColor.rgb = tColorS;\n #endif\n\n #else\n applyLighting(tColor.rgb, normal0);\n #endif\n #endif\n\n #if defined(vtkIndependentComponentsOn) && vtkNumComponents >= 2\n #if !defined(vtkComponent1Proportional)\n applyLighting(tColor1, normal1);\n #endif\n #if vtkNumComponents >= 3\n #if !defined(vtkComponent2Proportional)\n applyLighting(tColor2, normal2);\n #endif\n #if vtkNumComponents >= 4\n #if !defined(vtkComponent3Proportional)\n applyLighting(tColor3, normal3);\n #endif\n #endif\n #endif\n #endif\n #endif\n\n// perform final independent blend as needed\n#if defined(vtkIndependentComponentsOn) && vtkNumComponents >= 2\n tColor.rgb += tColor1;\n#if vtkNumComponents >= 3\n tColor.rgb += tColor2;\n#if vtkNumComponents >= 4\n tColor.rgb += tColor3;\n#endif\n#endif\n#endif\n\n#endif\nreturn tColor;\n}\n\nbool valueWithinScalarRange(vec4 val, vec4 min, vec4 max) {\n bool withinRange = false;\n #if vtkNumComponents == 1\n if (val.r >= min.r && val.r <= max.r) {\n withinRange = true;\n }\n #endif\n #if defined(vtkIndependentComponentsOn) && vtkNumComponents == 2\n if (val.r >= min.r && val.r <= max.r &&\n val.g >= min.g && val.g <= max.g) {\n withinRange = true;\n }\n #endif\n #if defined(vtkIndependentComponentsOn) && vtkNumComponents >= 3\n if (all(greaterThanEqual(val, ipScalarRangeMin)) &&\n all(lessThanEqual(val, ipScalarRangeMax))) {\n withinRange = true;\n }\n #endif\n return withinRange;\n}\n\n//=======================================================================\n// Apply the specified blend mode operation along the ray's path.\n//\nvoid applyBlend(vec3 posIS, vec3 endIS, vec3 tdims)\n{\n vec3 tstep = 1.0/tdims;\n\n // start slightly inside and apply some jitter\n vec3 delta = endIS - posIS;\n vec3 stepIS = normalize(delta)*sampleDistanceIS;\n float raySteps = length(delta)/sampleDistanceIS;\n\n // avoid 0.0 jitter\n float jitter = 0.01 + 0.99*texture2D(jtexture, gl_FragCoord.xy/32.0).r;\n float stepsTraveled = jitter;\n\n // local vars for the loop\n vec4 color = vec4(0.0, 0.0, 0.0, 0.0);\n vec4 tValue;\n vec4 tColor;\n\n // if we have less than one step then pick the middle point\n // as our value\n // if (raySteps <= 1.0)\n // {\n // posIS = (posIS + endIS)*0.5;\n // }\n\n // Perform initial step at the volume boundary\n // compute the scalar\n tValue = getTextureValue(posIS);\n\n #if vtkBlendMode == 0 // COMPOSITE_BLEND\n // now map through opacity and color\n tColor = getColorForValue(tValue, posIS, tstep);\n\n // handle very thin volumes\n if (raySteps <= 1.0)\n {\n tColor.a = 1.0 - pow(1.0 - tColor.a, raySteps);\n gl_FragData[0] = tColor;\n return;\n }\n\n tColor.a = 1.0 - pow(1.0 - tColor.a, jitter);\n color = vec4(tColor.rgb*tColor.a, tColor.a);\n posIS += (jitter*stepIS);\n\n for (int i = 0; i < //VTK::MaximumSamplesValue ; ++i)\n {\n if (stepsTraveled + 1.0 >= raySteps) { break; }\n\n // compute the scalar\n tValue = getTextureValue(posIS);\n\n // now map through opacity and color\n tColor = getColorForValue(tValue, posIS, tstep);\n\n float mix = (1.0 - color.a);\n\n // this line should not be needed but nvidia seems to not handle\n // the break correctly on windows/chrome 58 angle\n //mix = mix * sign(max(raySteps - stepsTraveled - 1.0, 0.0));\n\n color = color + vec4(tColor.rgb*tColor.a, tColor.a)*mix;\n stepsTraveled++;\n posIS += stepIS;\n if (color.a > 0.99) { color.a = 1.0; break; }\n }\n\n if (color.a < 0.99 && (raySteps - stepsTraveled) > 0.0)\n {\n posIS = endIS;\n\n // compute the scalar\n tValue = getTextureValue(posIS);\n\n // now map through opacity and color\n tColor = getColorForValue(tValue, posIS, tstep);\n tColor.a = 1.0 - pow(1.0 - tColor.a, raySteps - stepsTraveled);\n\n float mix = (1.0 - color.a);\n color = color + vec4(tColor.rgb*tColor.a, tColor.a)*mix;\n }\n\n gl_FragData[0] = vec4(color.rgb/color.a, color.a);\n #endif\n #if vtkBlendMode == 1 || vtkBlendMode == 2\n // MAXIMUM_INTENSITY_BLEND || MINIMUM_INTENSITY_BLEND\n // Find maximum/minimum intensity along the ray.\n\n // Define the operation we will use (min or max)\n #if vtkBlendMode == 1\n #define OP max\n #else\n #define OP min\n #endif\n\n // If the clipping range is shorter than the sample distance\n // we can skip the sampling loop along the ray.\n if (raySteps <= 1.0)\n {\n gl_FragData[0] = getColorForValue(tValue, posIS, tstep);\n return;\n }\n\n vec4 value = tValue;\n posIS += (jitter*stepIS);\n\n // Sample along the ray until MaximumSamplesValue,\n // ending slightly inside the total distance\n for (int i = 0; i < //VTK::MaximumSamplesValue ; ++i)\n {\n // If we have reached the last step, break\n if (stepsTraveled + 1.0 >= raySteps) { break; }\n\n // compute the scalar\n tValue = getTextureValue(posIS);\n\n // Update the maximum value if necessary\n value = OP(tValue, value);\n\n // Otherwise, continue along the ray\n stepsTraveled++;\n posIS += stepIS;\n }\n\n // Perform the last step along the ray using the\n // residual distance\n posIS = endIS;\n tValue = getTextureValue(posIS);\n value = OP(tValue, value);\n\n // Now map through opacity and color\n gl_FragData[0] = getColorForValue(value, posIS, tstep);\n #endif\n #if vtkBlendMode == 3 || vtkBlendMode == 4 //AVERAGE_INTENSITY_BLEND || ADDITIVE_BLEND\n vec4 sum = vec4(0.);\n\n if (valueWithinScalarRange(tValue, ipScalarRangeMin, ipScalarRangeMax)) {\n sum += tValue;\n }\n\n if (raySteps <= 1.0) {\n gl_FragData[0] = getColorForValue(sum, posIS, tstep);\n return;\n }\n\n posIS += (jitter*stepIS);\n\n // Sample along the ray until MaximumSamplesValue,\n // ending slightly inside the total distance\n for (int i = 0; i < //VTK::MaximumSamplesValue ; ++i)\n {\n // If we have reached the last step, break\n if (stepsTraveled + 1.0 >= raySteps) { break; }\n\n // compute the scalar\n tValue = getTextureValue(posIS);\n\n // One can control the scalar range by setting the AverageIPScalarRange to disregard scalar values, not in the range of interest, from the average computation.\n // Notes:\n // - We are comparing all values in the texture to see if any of them\n // are outside of the scalar range. In the future we might want to allow\n // scalar ranges for each component.\n if (valueWithinScalarRange(tValue, ipScalarRangeMin, ipScalarRangeMax)) {\n // Sum the values across each step in the path\n sum += tValue;\n }\n stepsTraveled++;\n posIS += stepIS;\n }\n\n // Perform the last step along the ray using the\n // residual distance\n posIS = endIS;\n\n // compute the scalar\n tValue = getTextureValue(posIS);\n\n // One can control the scalar range by setting the IPScalarRange to disregard scalar values, not in the range of interest, from the average computation\n if (valueWithinScalarRange(tValue, ipScalarRangeMin, ipScalarRangeMax)) {\n sum += tValue;\n\n stepsTraveled++;\n }\n\n #if vtkBlendMode == 3 // Average\n sum /= vec4(stepsTraveled, stepsTraveled, stepsTraveled, 1.0);\n #endif\n\n gl_FragData[0] = getColorForValue(sum, posIS, tstep);\n #endif\n #if vtkBlendMode == 5 // RADON\n float normalizedRayIntensity = 1.0;\n\n // handle very thin volumes\n if (raySteps <= 1.0)\n {\n tValue = getTextureValue(posIS);\n normalizedRayIntensity = normalizedRayIntensity - sampleDistance*texture2D(otexture, vec2(tValue.r * oscale0 + oshift0, 0.5)).r;\n gl_FragData[0] = texture2D(ctexture, vec2(normalizedRayIntensity, 0.5));\n return;\n }\n\n posIS += (jitter*stepIS);\n\n for (int i = 0; i < //VTK::MaximumSamplesValue ; ++i)\n {\n if (stepsTraveled + 1.0 >= raySteps) { break; }\n\n // compute the scalar value\n tValue = getTextureValue(posIS);\n\n // Convert scalar value to normalizedRayIntensity coefficient and accumulate normalizedRayIntensity\n normalizedRayIntensity = normalizedRayIntensity - sampleDistance*texture2D(otexture, vec2(tValue.r * oscale0 + oshift0, 0.5)).r;\n\n posIS += stepIS;\n stepsTraveled++;\n }\n\n // map normalizedRayIntensity to color\n gl_FragData[0] = texture2D(ctexture, vec2(normalizedRayIntensity , 0.5));\n\n #endif\n}\n\n//=======================================================================\n// Compute a new start and end point for a given ray based\n// on the provided bounded clipping plane (aka a rectangle)\nvoid getRayPointIntersectionBounds(\n vec3 rayPos, vec3 rayDir,\n vec3 planeDir, float planeDist,\n inout vec2 tbounds, vec3 vPlaneX, vec3 vPlaneY,\n float vSize1, float vSize2)\n{\n float result = dot(rayDir, planeDir);\n if (abs(result) < 1e-6)\n {\n return;\n }\n result = -1.0 * (dot(rayPos, planeDir) + planeDist) / result;\n vec3 xposVC = rayPos + rayDir*result;\n vec3 vxpos = xposVC - vOriginVC;\n vec2 vpos = vec2(\n dot(vxpos, vPlaneX),\n dot(vxpos, vPlaneY));\n\n // on some apple nvidia systems this does not work\n // if (vpos.x < 0.0 || vpos.x > vSize1 ||\n // vpos.y < 0.0 || vpos.y > vSize2)\n // even just\n // if (vpos.x < 0.0 || vpos.y < 0.0)\n // fails\n // so instead we compute a value that represents in and out\n //and then compute the return using this value\n float xcheck = max(0.0, vpos.x * (vpos.x - vSize1)); // 0 means in bounds\n float check = sign(max(xcheck, vpos.y * (vpos.y - vSize2))); // 0 means in bounds, 1 = out\n\n tbounds = mix(\n vec2(min(tbounds.x, result), max(tbounds.y, result)), // in value\n tbounds, // out value\n check); // 0 in 1 out\n}\n\n//=======================================================================\n// given a\n// - ray direction (rayDir)\n// - starting point (vertexVCVSOutput)\n// - bounding planes of the volume\n// - optionally depth buffer values\n// - far clipping plane\n// compute the start/end distances of the ray we need to cast\nvec2 computeRayDistances(vec3 rayDir, vec3 tdims)\n{\n vec2 dists = vec2(100.0*camFar, -1.0);\n\n vec3 vSize = vSpacing*tdims;\n\n // all this is in View Coordinates\n getRayPointIntersectionBounds(vertexVCVSOutput, rayDir,\n vPlaneNormal0, vPlaneDistance0, dists, vPlaneNormal2, vPlaneNormal4,\n vSize.y, vSize.z);\n getRayPointIntersectionBounds(vertexVCVSOutput, rayDir,\n vPlaneNormal1, vPlaneDistance1, dists, vPlaneNormal2, vPlaneNormal4,\n vSize.y, vSize.z);\n getRayPointIntersectionBounds(vertexVCVSOutput, rayDir,\n vPlaneNormal2, vPlaneDistance2, dists, vPlaneNormal0, vPlaneNormal4,\n vSize.x, vSize.z);\n getRayPointIntersectionBounds(vertexVCVSOutput, rayDir,\n vPlaneNormal3, vPlaneDistance3, dists, vPlaneNormal0, vPlaneNormal4,\n vSize.x, vSize.z);\n getRayPointIntersectionBounds(vertexVCVSOutput, rayDir,\n vPlaneNormal4, vPlaneDistance4, dists, vPlaneNormal0, vPlaneNormal2,\n vSize.x, vSize.y);\n getRayPointIntersectionBounds(vertexVCVSOutput, rayDir,\n vPlaneNormal5, vPlaneDistance5, dists, vPlaneNormal0, vPlaneNormal2,\n vSize.x, vSize.y);\n\n //VTK::ClipPlane::Impl\n\n // do not go behind front clipping plane\n dists.x = max(0.0,dists.x);\n\n // do not go PAST far clipping plane\n float farDist = -camThick/rayDir.z;\n dists.y = min(farDist,dists.y);\n\n // Do not go past the zbuffer value if set\n // This is used for intermixing opaque geometry\n //VTK::ZBuffer::Impl\n\n return dists;\n}\n\n//=======================================================================\n// Compute the index space starting position (pos) and end\n// position\n//\nvoid computeIndexSpaceValues(out vec3 pos, out vec3 endPos, vec3 rayDir, vec2 dists)\n{\n // compute starting and ending values in volume space\n pos = vertexVCVSOutput + dists.x*rayDir;\n pos = pos - vOriginVC;\n // convert to volume basis and origin\n pos = vec3(\n dot(pos, vPlaneNormal0),\n dot(pos, vPlaneNormal2),\n dot(pos, vPlaneNormal4));\n\n endPos = vertexVCVSOutput + dists.y*rayDir;\n endPos = endPos - vOriginVC;\n endPos = vec3(\n dot(endPos, vPlaneNormal0),\n dot(endPos, vPlaneNormal2),\n dot(endPos, vPlaneNormal4));\n\n float delta = length(endPos - pos);\n\n pos *= vVCToIJK;\n endPos *= vVCToIJK;\n\n float delta2 = length(endPos - pos);\n sampleDistanceIS = sampleDistance*delta2/delta;\n #ifdef VolumeShadowOn\n sampleDistanceISVS = sampleDistanceIS * volumeShadowSamplingDistFactor;\n #endif\n}\n\nvoid main()\n{\n\n if (cameraParallel == 1)\n {\n // Camera is parallel, so the rayDir is just the direction of the camera.\n rayDirVC = vec3(0.0, 0.0, -1.0);\n } else {\n // camera is at 0,0,0 so rayDir for perspective is just the vc coord\n rayDirVC = normalize(vertexVCVSOutput);\n }\n\n vec3 tdims = vec3(volumeDimensions);\n\n // compute the start and end points for the ray\n vec2 rayStartEndDistancesVC = computeRayDistances(rayDirVC, tdims);\n\n // do we need to composite? aka does the ray have any length\n // If not, bail out early\n if (rayStartEndDistancesVC.y <= rayStartEndDistancesVC.x)\n {\n discard;\n }\n\n // IS = Index Space\n vec3 posIS;\n vec3 endIS;\n computeIndexSpaceValues(posIS, endIS, rayDirVC, rayStartEndDistancesVC);\n\n // Perform the blending operation along the ray\n applyBlend(posIS, endIS, tdims);\n}\n";function Fn(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}var Un=ht.t7,kn=ht.E0;function Gn(e,t){t.classHierarchy.push("vtkOpenGLVolumeMapper"),e.buildPass=function(){t.zBufferTexture=null},e.zBufferPass=function(e,r){if(e){var n=r.getZBufferTexture();n!==t.zBufferTexture&&(t.zBufferTexture=n)}},e.opaqueZBufferPass=function(t,r){return e.zBufferPass(t,r)},e.volumePass=function(r,n){if(r){t._openGLRenderWindow=e.getFirstAncestorOfType("vtkOpenGLRenderWindow"),t.context=t._openGLRenderWindow.getContext(),t.tris.setOpenGLRenderWindow(t._openGLRenderWindow),t.jitterTexture.setOpenGLRenderWindow(t._openGLRenderWindow),t.framebuffer.setOpenGLRenderWindow(t._openGLRenderWindow),t.scalarTexture.setOpenGLRenderWindow(t._openGLRenderWindow),t.colorTexture.setOpenGLRenderWindow(t._openGLRenderWindow),t.opacityTexture.setOpenGLRenderWindow(t._openGLRenderWindow),t.openGLVolume=e.getFirstAncestorOfType("vtkOpenGLVolume");var a=t.openGLVolume.getRenderable();t._openGLRenderer=e.getFirstAncestorOfType("vtkOpenGLRenderer");var o=t._openGLRenderer.getRenderable();t.openGLCamera=t._openGLRenderer.getViewNodeFor(o.getActiveCamera()),e.renderPiece(o,a)}},e.buildShaders=function(t,r,n){e.getShaderTemplate(t,r,n),e.replaceShaderValues(t,r,n)},e.getShaderTemplate=function(e,t,r){e.Vertex=Nn,e.Fragment=Bn,e.Geometry=""},e.replaceShaderValues=function(r,n,a){var o=r.Fragment;a.getProperty().getInterpolationType()===Vn.LINEAR&&(o=Sr.substitute(o,"//VTK::TrilinearOn","#define vtkTrilinearOn").result),!0===a.getProperty().getUseLabelOutline()&&(o=Sr.substitute(o,"//VTK::ImageLabelOutlineOn","#define vtkImageLabelOutlineOn").result);var i=t.scalarTexture.getComponents();o=Sr.substitute(o,"//VTK::NumComponents","#define vtkNumComponents ".concat(i)).result;var s=a.getProperty().getIndependentComponents();if(s){o=Sr.substitute(o,"//VTK::IndependentComponentsOn","#define vtkIndependentComponentsOn").result;for(var l=[],c=0;c0&&(o=Sr.substitute(o,"//VTK::vtkProportionalComponents",l.join("\n")).result)}var u=t.currentInput.getSpatialExtent(),d=t.currentInput.getSpacing(),f=new Float64Array(3);ot.R3.set(f,(u[1]-u[0])*d[0],(u[3]-u[2])*d[1],(u[5]-u[4])*d[2]);var p=ot.R3.length(f)/t.renderable.getSampleDistance();o=Sr.substitute(o,"//VTK::MaximumSamplesValue","".concat(Math.ceil(p))).result,o=Sr.substitute(o,"//VTK::LightComplexity","#define vtkLightComplexity ".concat(t.lastLightComplexity)).result,t.lastLightComplexity>0&&(t.renderable.getVolumetricScatteringBlending()>0&&(o=Sr.substitute(o,"//VTK::VolumeShadowOn","#define VolumeShadowOn").result),t.renderable.getVolumetricScatteringBlending()<1&&(o=Sr.substitute(o,"//VTK::SurfaceShadowOn","#define SurfaceShadowOn").result),t.renderable.getLocalAmbientOcclusion()&&a.getProperty().getAmbient()>0&&(o=Sr.substitute(o,"//VTK::localAmbientOcclusionOn","#define localAmbientOcclusionOn").result)),t.gopacity=a.getProperty().getUseGradientOpacity(0);for(var g=1;s&&!t.gopacity&&g0&&(a=Sr.substitute(a,"//VTK::VolumeShadow::Dec",["uniform float volumetricScatteringBlending;","uniform float giReach;","uniform float volumeShadowSamplingDistFactor;","uniform float anisotropy;","uniform float anisotropy2;"],!1).result),t.renderable.getLocalAmbientOcclusion()&&n.getProperty().getAmbient()>0&&(a=Sr.substitute(a,"//VTK::LAO::Dec",["uniform int kernelRadius;","uniform vec2 kernelSample[".concat(t.renderable.getLAOKernelRadius(),"];"),"uniform int kernelSize;"],!1).result),e.Fragment=a}},e.replaceShaderClippingPlane=function(e,r,n){var a=e.Fragment;if(t.renderable.getClippingPlanes().length>0){var o=t.renderable.getClippingPlanes().length;a=Sr.substitute(a,"//VTK::ClipPlane::Dec",["uniform vec3 vClipPlaneNormals[6];","uniform float vClipPlaneDistances[6];","//VTK::ClipPlane::Dec"],!1).result,a=Sr.substitute(a,"//VTK::ClipPlane::Impl",["for(int i = 0; i < ".concat(o,"; i++) {")," float rayDirRatio = dot(rayDir, vClipPlaneNormals[i]);"," float equationResult = dot(vertexVCVSOutput, vClipPlaneNormals[i]) + vClipPlaneDistances[i];"," if (rayDirRatio == 0.0)"," {"," if (equationResult < 0.0) dists.x = dists.y;"," continue;"," }"," float result = -1.0 * equationResult / rayDirRatio;"," if (rayDirRatio < 0.0) dists.y = min(dists.y, result);"," else dists.x = max(dists.x, result);","}","//VTK::ClipPlane::Impl"],!1).result}e.Fragment=a},e.getNeedToRebuildShaders=function(r,n,a){var o=0;a.getProperty().getShade()&&t.renderable.getBlendMode()===C.COMPOSITE_BLEND&&(o=0,t.numberOfLights=0,n.getLights().forEach((function(e){e.getSwitch()>0&&(t.numberOfLights++,0===o&&(o=1)),1===o&&(t.numberOfLights>1||1!==e.getIntensity()||!e.lightTypeIsHeadLight())&&(o=2),o<3&&e.getPositional()&&(o=3)})));var i=!1;t.lastLightComplexity!==o&&(t.lastLightComplexity=o,i=!0);var s=t.scalarTexture.getComponents(),l=a.getProperty().getIndependentComponents(),c=!1,u=[];if(l){for(var d=0;d0&&(c=!0)}var f=t.currentInput.getSpatialExtent(),p=t.currentInput.getSpacing(),g=new Float64Array(3);ot.R3.set(g,(f[1]-f[0])*p[0],(f[3]-f[2])*p[1],(f[5]-f[4])*p[2]);var m=ot.R3.length(g)/t.renderable.getSampleDistance(),h={interpolationType:a.getProperty().getInterpolationType(),useLabelOutline:a.getProperty().getUseLabelOutline(),numComp:s,usesProportionalComponents:c,iComps:l,maxSamples:m,useGradientOpacity:a.getProperty().getUseGradientOpacity(0),blendMode:t.renderable.getBlendMode(),proportionalComponents:u};return t.previousState&&t.previousState.interpolationType===h.interpolationType&&t.previousState.useLabelOutline===h.useLabelOutline&&t.previousState.numComp===h.numComp&&t.previousState.usesProportionalComponents===h.usesProportionalComponents&&t.previousState.iComps===h.iComps&&t.previousState.maxSamples===h.maxSamples&&t.previousState.useGradientOpacity===h.useGradientOpacity&&t.previousState.blendMode===h.blendMode&&function(e,t){if(e.length!==t.length)return!1;for(var r=0;re.getAttributeUpdateTime().getMTime()||e.getShaderSourceTime().getMTime()>e.getAttributeUpdateTime().getMTime())&&(a.isAttributeUsed("vertexDC")&&(e.getVAO().addAttributeArray(a,e.getCABO(),"vertexDC",e.getCABO().getVertexOffset(),e.getCABO().getStride(),t.context.FLOAT,3,t.context.FALSE)||kn("Error setting vertexDC in shader VAO.")),e.getAttributeUpdateTime().modified()),a.setUniformi("texture1",t.scalarTexture.getTextureUnit()),a.setUniformf("sampleDistance",t.renderable.getSampleDistance());for(var o=t.scalarTexture.getVolumeInfo(),i=t.renderable.getIpScalarRange(),s=[],l=[],c=0;c<4;c++)s[c]=i[0]*o.dataComputedScale[c]+o.dataComputedOffset[c],l[c]=i[1]*o.dataComputedScale[c]+o.dataComputedOffset[c],s[c]=(s[c]-o.offset[c])/o.scale[c],l[c]=(l[c]-o.offset[c])/o.scale[c];if(a.setUniform4f("ipScalarRangeMin",s[0],s[1],s[2],s[3]),a.setUniform4f("ipScalarRangeMax",l[0],l[1],l[2],l[3]),null!==t.zBufferTexture){a.setUniformi("zBufferTexture",t.zBufferTexture.getTextureUnit());var u=t._useSmallViewport?[t._smallViewportWidth,t._smallViewportHeight]:t._openGLRenderWindow.getFramebufferSize();a.setUniformf("vpWidth",u[0]),a.setUniformf("vpHeight",u[1])}},e.setCameraShaderParameters=function(r,n,a){var o=t.openGLCamera.getKeyMatrices(n),i=t.openGLVolume.getKeyMatrices();ot._E.multiply(t.modelToView,o.wcvc,i.mcwc);var s=r.getProgram(),l=t.openGLCamera.getRenderable(),c=l.getClippingRange();s.setUniformf("camThick",c[1]-c[0]),s.setUniformf("camNear",c[0]),s.setUniformf("camFar",c[1]);for(var u=t.currentInput.getBounds(),d=t.currentInput.getDimensions(),f=new Float64Array(3),p=new Float64Array(3),g=1,m=-1,h=1,v=-1,y=0;y<8;++y){if(ot.R3.set(f,u[y%2],u[2+Math.floor(y/2)%2],u[4+Math.floor(y/4)]),ot.R3.transformMat4(f,f,t.modelToView),!l.getParallelProjection()){ot.R3.normalize(p,f);var b=-c[0]/f[2];ot.R3.scale(f,p,b)}ot.R3.transformMat4(f,f,o.vcpc),g=Math.min(f[0],g),m=Math.max(f[0],m),h=Math.min(f[1],h),v=Math.max(f[1],v)}s.setUniformf("dcxmin",g),s.setUniformf("dcxmax",m),s.setUniformf("dcymin",h),s.setUniformf("dcymax",v),s.isUniformUsed("cameraParallel")&&s.setUniformi("cameraParallel",l.getParallelProjection());var T=t.currentInput.getSpatialExtent(),C=t.currentInput.getSpacing(),x=new Float64Array(3);ot.R3.set(x,(T[1]-T[0])*C[0],(T[3]-T[2])*C[1],(T[5]-T[4])*C[2]),s.setUniform3f("vSpacing",C[0],C[1],C[2]),ot.R3.set(f,T[0],T[2],T[4]),t.currentInput.indexToWorldVec3(f,f),ot.R3.transformMat4(f,f,t.modelToView),s.setUniform3f("vOriginVC",f[0],f[1],f[2]);var S=t.currentInput.getIndexToWorld();ot._E.multiply(t.idxToView,t.modelToView,S),ot.wO.multiply(t.idxNormalMatrix,o.normalMatrix,i.normalMatrix),ot.wO.multiply(t.idxNormalMatrix,t.idxNormalMatrix,t.currentInput.getDirectionByReference());var P=ot.R3.length(x)/t.renderable.getSampleDistance();P>t.renderable.getMaximumSamplesPerRay()&&Un("The number of steps required ".concat(Math.ceil(P)," is larger than the\n specified maximum number of steps ").concat(t.renderable.getMaximumSamplesPerRay(),".\n Please either change the\n volumeMapper sampleDistance or its maximum number of samples."));var w=new Float64Array(3);if(ot.R3.set(w,1,1,1),ot.R3.divide(w,w,x),s.setUniform3f("vVCToIJK",w[0],w[1],w[2]),s.setUniform3i("volumeDimensions",d[0],d[1],d[2]),!t._openGLRenderWindow.getWebgl2()){var O=t.scalarTexture.getVolumeInfo();s.setUniformf("texWidth",t.scalarTexture.getWidth()),s.setUniformf("texHeight",t.scalarTexture.getHeight()),s.setUniformi("xreps",O.xreps),s.setUniformi("xstride",O.xstride),s.setUniformi("ystride",O.ystride)}for(var I=new Float64Array(3),A=new Float64Array(3),R=0;R<6;++R){switch(R){case 1:ot.R3.set(I,-1,0,0),ot.R3.set(A,T[0],T[2],T[4]);break;case 2:ot.R3.set(I,0,1,0),ot.R3.set(A,T[1],T[3],T[5]);break;case 3:ot.R3.set(I,0,-1,0),ot.R3.set(A,T[0],T[2],T[4]);break;case 4:ot.R3.set(I,0,0,1),ot.R3.set(A,T[1],T[3],T[5]);break;case 5:ot.R3.set(I,0,0,-1),ot.R3.set(A,T[0],T[2],T[4]);break;default:ot.R3.set(I,1,0,0),ot.R3.set(A,T[1],T[3],T[5])}ot.R3.transformMat3(I,I,t.idxNormalMatrix),ot.R3.transformMat4(A,A,t.idxToView);var E=-1*ot.R3.dot(A,I);s.setUniform3f("vPlaneNormal".concat(R),I[0],I[1],I[2]),s.setUniformf("vPlaneDistance".concat(R),E)}if(a.getProperty().getUseLabelOutline()){var M=t.currentInput.getWorldToIndex();s.setUniformMatrix("vWCtoIDX",M);var D=n.getActiveCamera(),V=D.getClippingRange(),L=(0,Ft.Z)(V,2),_=L[0],N=L[1],B=D.getDistance();D.setClippingRange(B,B+.1);var F=t.openGLCamera.getKeyMatrices(n);ot._E.invert(t.projectionToWorld,F.wcpc),D.setClippingRange(_,N),t.openGLCamera.getKeyMatrices(n),s.setUniformMatrix("PCWCMatrix",t.projectionToWorld);var U=e.getRenderTargetSize();s.setUniformf("vpWidth",U[0]),s.setUniformf("vpHeight",U[1]);var k=e.getRenderTargetOffset();s.setUniformf("vpOffsetX",k[0]/U[0]),s.setUniformf("vpOffsetY",k[1]/U[1])}if(ot._E.invert(t.projectionToView,o.vcpc),s.setUniformMatrix("PCVCMatrix",t.projectionToView),0!==t.lastLightComplexity){var G=0,W=[],z=[],j=[];if(n.getLights().forEach((function(e){if(e.getSwitch()>0){var t=e.getColor(),r=e.getIntensity();W[0+3*G]=t[0]*r,W[1+3*G]=t[1]*r,W[2+3*G]=t[2]*r;var n=e.getDirection();ot.R3.set(I,n[0],n[1],n[2]),ot.R3.transformMat3(I,I,o.normalMatrix),ot.R3.normalize(I,I),z[0+3*G]=I[0],z[1+3*G]=I[1],z[2+3*G]=I[2],j[0+3*G]=-.5*I[0],j[1+3*G]=-.5*I[1],j[2+3*G]=-.5*(I[2]-1),G++}})),s.setUniformi("twoSidedLighting",n.getTwoSidedLighting()),s.setUniformi("lightNum",G),s.setUniform3fv("lightColor",W),s.setUniform3fv("lightDirectionVC",z),s.setUniform3fv("lightHalfAngleVC",j),3===t.lastLightComplexity){G=0;var H=[],K=[],Z=[],X=[],q=[];n.getLights().forEach((function(e){if(e.getSwitch()>0){var r=e.getAttenuationValues();K[0+3*G]=r[0],K[1+3*G]=r[1],K[2+3*G]=r[2],X[G]=e.getExponent(),Z[G]=e.getConeAngle(),q[G]=e.getPositional();var n=e.getTransformedPosition();ot.R3.transformMat4(n,n,t.modelToView),H[0+3*G]=n[0],H[1+3*G]=n[1],H[2+3*G]=n[2],G+=1}})),s.setUniform3fv("lightPositionVC",H),s.setUniform3fv("lightAttenuation",K),s.setUniformfv("lightConeAngle",Z),s.setUniformfv("lightExponent",X),s.setUniformiv("lightPositional",q)}if(t.renderable.getVolumetricScatteringBlending()>0&&(s.setUniformf("giReach",t.renderable.getGlobalIlluminationReach()),s.setUniformf("volumetricScatteringBlending",t.renderable.getVolumetricScatteringBlending()),s.setUniformf("volumeShadowSamplingDistFactor",t.renderable.getVolumeShadowSamplingDistFactor()),s.setUniformf("anisotropy",t.renderable.getAnisotropy()),s.setUniformf("anisotropy2",Math.pow(t.renderable.getAnisotropy(),2))),t.renderable.getLocalAmbientOcclusion()&&a.getProperty().getAmbient()>0){var Y=t.renderable.getLAOKernelSize();s.setUniformi("kernelSize",Y);for(var $=[],Q=0;Q=2)for(var c=0;c0&&(a.setUniformf("vAmbient",i.getAmbient()),a.setUniformf("vDiffuse",i.getDiffuse()),a.setUniformf("vSpecular",i.getSpecular()),a.setUniformf("vSpecularPower",i.getSpecularPower()))},e.getClippingPlaneShaderParameters=function(e,r,n){if(t.renderable.getClippingPlanes().length>0){for(var a=t.openGLCamera.getKeyMatrices(r),o=[],i=[],s=t.renderable.getClippingPlanes(),l=s.length,c=0;c1.5&&(t._useSmallViewport=!0),t._animationRateSubscription||(t._animationRateSubscription=a.onAnimationFrameRateUpdate((function(){if(t.renderable.getAutoAdjustSampleDistances()){var e=a.getRecentAnimationFrameRate(),r=a.getDesiredUpdateRate()/e;(r>1.15||r<.85)&&(t._lastScale*=r),t._lastScale>400&&(t._lastScale=400),t._lastScale<1.5&&(t._lastScale=1.5)}else t._lastScale=t.renderable.getImageSampleDistance()*t.renderable.getImageSampleDistance();var n=t._openGLRenderWindow.getFramebufferSize();t._smallViewportWidth=Math.ceil(n[0]/Math.sqrt(t._lastScale)),t._smallViewportHeight=Math.ceil(n[1]/Math.sqrt(t._lastScale))}))),t._useSmallViewport){var o=t._openGLRenderWindow.getFramebufferSize();if(t._smallViewportHeight>o[1]&&(t._smallViewportHeight=o[1]),t._smallViewportWidth>o[0]&&(t._smallViewportWidth=o[0]),t.framebuffer.saveCurrentBindingsAndBuffers(),null===t.framebuffer.getGLFramebuffer())t.framebuffer.create(o[0],o[1]),t.framebuffer.populateFramebuffer();else{var i=t.framebuffer.getSize();i[0]===o[0]&&i[1]===o[1]||(t.framebuffer.create(o[0],o[1]),t.framebuffer.populateFramebuffer())}t.framebuffer.bind();var s=t.context;s.clearColor(0,0,0,0),s.colorMask(!0,!0,!0,!0),s.clear(s.COLOR_BUFFER_BIT),s.viewport(0,0,t._smallViewportWidth,t._smallViewportHeight),t.fvp=[t._smallViewportWidth/o[0],t._smallViewportHeight/o[1]]}t.context.disable(t.context.DEPTH_TEST),e.updateBufferObjects(r,n),n.getProperty().getInterpolationType()===Vn.NEAREST?(t.scalarTexture.setMinificationFilter(Vr.NEAREST),t.scalarTexture.setMagnificationFilter(Vr.NEAREST)):(t.scalarTexture.setMinificationFilter(Vr.LINEAR),t.scalarTexture.setMagnificationFilter(Vr.LINEAR)),t.lastBoundBO=null,null!==t.zBufferTexture&&t.zBufferTexture.activate()},e.renderPieceDraw=function(r,n){var a=t.context;t.scalarTexture.activate(),t.opacityTexture.activate(),t.colorTexture.activate(),t.jitterTexture.activate(),e.updateShaders(t.tris,r,n),a.drawArrays(a.TRIANGLES,0,t.tris.getCABO().getElementCount()),t.tris.getVAO().release(),t.scalarTexture.deactivate(),t.colorTexture.deactivate(),t.opacityTexture.deactivate(),t.jitterTexture.deactivate()},e.renderPieceFinish=function(e,r){if(null!==t.zBufferTexture&&t.zBufferTexture.deactivate(),t._useSmallViewport){if(t.framebuffer.restorePreviousBindingsAndBuffers(),null===t.copyShader){t.copyShader=t._openGLRenderWindow.getShaderCache().readyShaderProgramArray(["//VTK::System::Dec","attribute vec4 vertexDC;","uniform vec2 tfactor;","varying vec2 tcoord;","void main() { tcoord = vec2(vertexDC.x*0.5 + 0.5, vertexDC.y*0.5 + 0.5) * tfactor; gl_Position = vertexDC; }"].join("\n"),["//VTK::System::Dec","//VTK::Output::Dec","uniform sampler2D texture1;","varying vec2 tcoord;","void main() { gl_FragData[0] = texture2D(texture1,tcoord); }"].join("\n"),"");var n=t.copyShader;t.copyVAO=Or.newInstance(),t.copyVAO.setOpenGLRenderWindow(t._openGLRenderWindow),t.tris.getCABO().bind(),t.copyVAO.addAttributeArray(n,t.tris.getCABO(),"vertexDC",t.tris.getCABO().getVertexOffset(),t.tris.getCABO().getStride(),t.context.FLOAT,3,t.context.FALSE)||kn("Error setting vertexDC in copy shader VAO.")}else t._openGLRenderWindow.getShaderCache().readyShaderProgram(t.copyShader);var a=t._openGLRenderWindow.getFramebufferSize();t.context.viewport(0,0,a[0],a[1]);var o=t.framebuffer.getColorTexture();o.activate(),t.copyShader.setUniformi("texture",o.getTextureUnit()),t.copyShader.setUniform2f("tfactor",t.fvp[0],t.fvp[1]);var i=t.context;i.blendFuncSeparate(i.ONE,i.ONE_MINUS_SRC_ALPHA,i.ONE,i.ONE_MINUS_SRC_ALPHA),t.context.drawArrays(t.context.TRIANGLES,0,t.tris.getCABO().getElementCount()),o.deactivate(),i.blendFuncSeparate(i.SRC_ALPHA,i.ONE_MINUS_SRC_ALPHA,i.ONE,i.ONE_MINUS_SRC_ALPHA)}},e.renderPiece=function(r,n){e.invokeEvent({type:"StartEvent"}),t.renderable.update(),t.currentInput=t.renderable.getInputData(),e.invokeEvent({type:"EndEvent"}),t.currentInput?(e.renderPieceStart(r,n),e.renderPieceDraw(r,n),e.renderPieceFinish(r,n)):kn("No input!")},e.computeBounds=function(r,n){e.getInput()?t.bounds=e.getInput().getBounds():(0,Mr.u)(t.Bounds)},e.updateBufferObjects=function(t,r){e.getNeedToRebuildBufferObjects(t,r)&&e.buildBufferObjects(t,r)},e.getNeedToRebuildBufferObjects=function(r,n){return t.VBOBuildTime.getMTime()1?1:-1,E[3*M+2]=-1;var D=new Uint16Array(8);D[0]=3,D[1]=0,D[2]=1,D[3]=3,D[4]=3,D[5]=0,D[6]=3,D[7]=2;var V=re.ZP.newInstance({numberOfComponents:3,values:E});V.setName("points");var L=re.ZP.newInstance({numberOfComponents:1,values:D});t.tris.getCABO().createVBO(L,"polys",ur.hX.SURFACE,{points:V,cellOffset:0})}t.VBOBuildTime.modified()}}}}var Wn={context:null,VBOBuildTime:null,scalarTexture:null,scalarTextureString:null,opacityTexture:null,opacityTextureString:null,colorTexture:null,colorTextureString:null,jitterTexture:null,tris:null,framebuffer:null,copyShader:null,copyVAO:null,lastXYF:1,targetXYF:1,zBufferTexture:null,lastZBufferTexture:null,lastLightComplexity:0,fullViewportTime:1,idxToView:null,idxNormalMatrix:null,modelToView:null,projectionToView:null,avgWindowArea:0,avgFrameTime:0};function zn(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,Wn,r),Tt.extend(e,t,r),t.VBOBuildTime={},(0,ht.j6)(t.VBOBuildTime,{mtime:0}),t.tris=Er.newInstance(),t.scalarTexture=Yr.newInstance(),t.opacityTexture=Yr.newInstance(),t.colorTexture=Yr.newInstance(),t.jitterTexture=Yr.newInstance(),t.jitterTexture.setWrapS(Dr.REPEAT),t.jitterTexture.setWrapT(Dr.REPEAT),t.framebuffer=Dn.newInstance(),t.idxToView=ot._E.identity(new Float64Array(16)),t.idxNormalMatrix=ot.wO.identity(new Float64Array(9)),t.modelToView=ot._E.identity(new Float64Array(16)),t.projectionToView=ot._E.identity(new Float64Array(16)),t.projectionToWorld=ot._E.identity(new Float64Array(16)),t._lastScale=1,(0,ht.g2)(e,t,["context"]),Gn(e,t)}var jn=(0,ht.WL)(zn,"vtkOpenGLVolumeMapper"),Hn={newInstance:jn,extend:zn};wt("vtkVolumeMapper",jn);var Kn=ht.eR;var Zn={};function Xn(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,Zn,r),Tt.extend(e,t,r),function(e,t){t.classHierarchy.push("vtkOpenGLPixelSpaceCallbackMapper"),e.opaquePass=function(r,n){t._openGLRenderer=e.getFirstAncestorOfType("vtkOpenGLRenderer"),t._openGLRenderWindow=t._openGLRenderer.getParent();var a=t._openGLRenderer.getAspectRatio(),o=t._openGLRenderer?t._openGLRenderer.getRenderable().getActiveCamera():null,i=t._openGLRenderer.getTiledSizeAndOrigin(),s=null;if(t.renderable.getUseZValues()){var l=n.getZBufferTexture(),c=Math.floor(l.getWidth()),u=Math.floor(l.getHeight()),d=t._openGLRenderWindow.getContext();l.bind();var f=n.getFramebuffer();f?f.saveCurrentBindingsAndBuffers():Kn("No framebuffer to save/restore");var p=d.createFramebuffer();d.bindFramebuffer(d.FRAMEBUFFER,p),d.framebufferTexture2D(d.FRAMEBUFFER,d.COLOR_ATTACHMENT0,d.TEXTURE_2D,l.getHandle(),0),d.checkFramebufferStatus(d.FRAMEBUFFER)===d.FRAMEBUFFER_COMPLETE&&(s=new Uint8Array(c*u*4),d.viewport(0,0,c,u),d.readPixels(0,0,c,u,d.RGBA,d.UNSIGNED_BYTE,s)),f&&f.restorePreviousBindingsAndBuffers(),d.deleteFramebuffer(p)}t.renderable.invokeCallback(t.renderable.getInputData(),o,a,i,s)},e.queryPass=function(e,r){e&&t.renderable.getUseZValues()&&r.requestDepth()}}(e,t)}var qn=(0,ht.WL)(Xn,"vtkOpenGLPixelSpaceCallbackMapper"),Yn={newInstance:qn,extend:Xn};wt("vtkPixelSpaceCallbackMapper",qn);var $n=Object.create(null);function Qn(e,t){$n[e]=t}var Jn={};function ea(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,Jn,r),t.overrides=$n,St.extend(e,t,r),function(e,t){t.classHierarchy.push("vtkWebGPUViewNodeFactory")}(0,t)}ht.default.newInstance(ea,"vtkWebGPUViewNodeFactory");var ta={keyMatrixTime:null,keyMatrices:null};function ra(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,ta,r),Tt.extend(e,t,r),t.keyMatrixTime={},ht.default.obj(t.keyMatrixTime),t.keyMatrices={normalMatrix:new Float64Array(16),vcpc:new Float64Array(16),pcsc:new Float64Array(16),wcvc:new Float64Array(16),scpc:new Float64Array(16),scvc:new Float64Array(16)},ht.default.setGet(e,t,["keyMatrixTime"]),function(e,t){t.classHierarchy.push("vtkWebGPUCamera"),e.getProjectionMatrix=function(e,r,n,a){if(ot._E.identity(e),t.renderable.getParallelProjection()){var o=t.renderable.getParallelScale(),i=o*r,s=o,l=(a[0]-1)*i,c=(a[0]+1)*i,u=(a[1]-1)*s,d=(a[1]+1)*s,f=1/(c-l),p=1/(d-u);e[0]=2*f,e[5]=2*p,e[10]=1/(n[1]-n[0]),e[12]=(c+l)*f,e[13]=(d+u)*p,e[14]=n[1]/(n[1]-n[0])}else{var g,m,h=Math.tan(Math.PI*t.renderable.getViewAngle()/360);!0===t.renderable.getUseHorizontalViewAngle()?(g=n[0]*h,m=n[0]*h/r):(g=n[0]*h*r,m=n[0]*h);var v=(a[0]-1)*g,y=(a[0]+1)*g,b=(a[1]-1)*m,T=(a[1]+1)*m;e[0]=2*n[0]/(y-v),e[5]=2*n[0]/(T-b),e[12]=(v+y)/(y-v),e[13]=(b+T)/(T-b),e[10]=0,e[14]=n[0],e[11]=-1,e[15]=0}},e.convertToOpenGLDepth=function(e){if(t.renderable.getParallelProjection())return 1-e;var r=t.renderable.getClippingRangeByReference(),n=-r[0]/e;return.5*(n=(r[0]+r[1])/(r[1]-r[0])+2*r[0]*r[1]/(n*(r[1]-r[0])))+.5},e.getKeyMatrices=function(r){var n=r.getRenderable(),a=r.getParent();if(Math.max(a.getMTime(),e.getMTime(),n.getMTime(),t.renderable.getMTime(),r.getStabilizedTime())>t.keyMatrixTime.getMTime()){var o=t.renderable.getViewMatrix();ot._E.copy(t.keyMatrices.normalMatrix,o),t.keyMatrices.normalMatrix[3]=0,t.keyMatrices.normalMatrix[7]=0,t.keyMatrices.normalMatrix[11]=0,ot._E.invert(t.keyMatrices.normalMatrix,t.keyMatrices.normalMatrix),ot._E.transpose(t.keyMatrices.wcvc,o);var i=r.getStabilizedCenterByReference();ot._E.translate(t.keyMatrices.scvc,t.keyMatrices.wcvc,i);var s=r.getAspectRatio(),l=t.renderable.getClippingRangeByReference();e.getProjectionMatrix(t.keyMatrices.vcpc,s,l,t.renderable.getWindowCenterByReference()),ot._E.multiply(t.keyMatrices.scpc,t.keyMatrices.vcpc,t.keyMatrices.scvc),ot._E.invert(t.keyMatrices.pcsc,t.keyMatrices.scpc),t.keyMatrixTime.modified()}return t.keyMatrices}}(e,t)}var na=ht.default.newInstance(ra);Qn("vtkCamera",na);var aa={device:null,handle:null,label:null};function oa(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,aa,r),ht.default.obj(e,t),t.bindables=[],t.bindGroupTime={},ht.default.obj(t.bindGroupTime,{mtime:0}),ht.default.get(e,t,["bindGroupTime","handle","sizeInBytes","usage"]),ht.default.setGet(e,t,["label","device","arrayInformation"]),function(e,t){t.classHierarchy.push("vtkWebGPUBindGroup"),e.setBindables=function(r){if(t.bindables.length===r.length){for(var n=!0,a=0;an?o:n}if(n2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,sa,r),ht.default.obj(e,t),ht.default.get(e,t,["lastCameraMTime"]),ht.default.setGet(e,t,["device","handle"]),function(e,t){t.classHierarchy.push("vtkWebGPUShaderModule"),e.initialize=function(e,r){t.device=e,t.handle=t.device.getHandle().createShaderModule({code:r.getCode()})}}(e,t)}var ca={newInstance:ht.default.newInstance(la,"vtkWebGPUShaderModule"),extend:la};var ua={shaderModules:null,device:null,window:null};function da(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,ua,r),t._shaderModules=new Map,ht.default.obj(e,t),ht.default.setGet(e,t,["device","window"]),function(e,t){t.classHierarchy.push("vtkWebGPUShaderCache"),e.getShaderModule=function(e){for(var r=e.getType(),n=e.getHash(),a=t._shaderModules.keys(),o=0;o3&&void 0!==arguments[3])||arguments[3],a=Array.isArray(r)?r.join("\n"):r,o=!1;-1!==e.search(t)&&(o=!0);var i="";n&&(i="g");var s=new RegExp(t,i);return{replace:o,result:e.replace(s,a)}}},pa=r(78826);var ga={handle:null,layouts:null,renderEncoder:null,shaderDescriptions:null,vertexState:null,topology:null,pipelineDescription:null};function ma(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,ga,r),(0,ht.j6)(e,t),t.layouts=[],t.shaderDescriptions=[],(0,ht.U2)(e,t,["handle","pipelineDescription"]),(0,ht.g2)(e,t,["device","renderEncoder","topology","vertexState"]),function(e,t){t.classHierarchy.push("vtkWebGPUPipeline"),e.getShaderDescriptions=function(){return t.shaderDescriptions},e.initialize=function(e,r){t.pipelineDescription=t.renderEncoder.getPipelineSettings(),t.pipelineDescription.primitive.topology=t.topology,t.pipelineDescription.vertex=t.vertexState,t.pipelineDescription.label=r;for(var n=[],a=0;a2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,va,r),t.outputNames=[],t.outputTypes=[],t.outputInterpolations=[],t.builtinOutputNames=[],t.builtinOutputTypes=[],t.builtinInputNames=[],t.builtinInputTypes=[],ht.default.obj(e,t),ht.default.setGet(e,t,["type","hash","code"]),ht.default.getArray(e,t,["outputTypes","outputNames","outputInterpolations"]),function(e,t){t.classHierarchy.push("vtkWebGPUShaderDescription"),e.hasOutput=function(e){return t.outputNames.includes(e)},e.addOutput=function(e,r){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0;t.outputTypes.push(e),t.outputNames.push(r),t.outputInterpolations.push(n)},e.addBuiltinOutput=function(e,r){t.builtinOutputTypes.push(e),t.builtinOutputNames.push(r)},e.addBuiltinInput=function(e,r){t.builtinInputTypes.push(e),t.builtinInputNames.push(r)},e.replaceShaderCode=function(e,r){var n=[],a=[];if(r&&n.push(r.getShaderCode()),e||t.builtinInputNames.length){var o=[];if(o.push("struct ".concat(t.type,"Input\n{")),e)for(var i=e.getOutputNamesByReference(),s=e.getOutputTypesByReference(),l=e.getOutputInterpolationsByReference(),c=0;c1&&(o.push("};"),a=o,n[n.length-1]+=",",n.push("input: ".concat(t.type,"Input")))}if(n.length&&(t.code=fa.substitute(t.code,"//VTK::IOStructs::Input",n).result),t.outputNames.length+t.builtinOutputNames.length){for(var d=["struct ".concat(t.type,"Output\n{")],f=0;f ".concat(t.type,"Output")]).result}t.code=fa.substitute(t.code,"//VTK::IOStructs::Dec",a).result}}(e,t)}var ba={newInstance:ht.default.newInstance(ya,"vtkWebGPUShaderDescription"),extend:ya},Ta={r8unorm:{numComponents:1,nativeType:Uint8Array,stride:1,elementSize:1,sampleType:"float"},r8snorm:{numComponents:1,nativeType:Int8Array,stride:1,elementSize:1,sampleType:"float"},r8uint:{numComponents:1,nativeType:Uint8Array,stride:1,elementSize:1,sampleType:"uint"},r8sint:{numComponents:1,nativeType:Int8Array,stride:1,elementSize:1,sampleType:"sint"},r16uint:{numComponents:1,nativeType:Uint16Array,stride:2,elementSize:2,sampleType:"uint"},r16sint:{numComponents:1,nativeType:Int16Array,stride:2,elementSize:2,sampleType:"sint"},r16float:{numComponents:1,nativeType:Float32Array,stride:2,elementSize:2,sampleType:"float"},rg8unorm:{numComponents:2,nativeType:Uint8Array,stride:2,elementSize:1,sampleType:"float"},rg8snorm:{numComponents:2,nativeType:Int8Array,stride:2,elementSize:1,sampleType:"float"},rg8uint:{numComponents:2,nativeType:Uint8Array,stride:2,elementSize:1,sampleType:"uint"},rg8sint:{numComponents:2,nativeType:Int8Array,stride:2,elementSize:1,sampleType:"sint"},r32uint:{numComponents:1,nativeType:Uint32Array,stride:4,elementSize:4,sampleType:"uint"},r32sint:{numComponents:1,nativeType:Int32Array,stride:4,elementSize:4,sampleType:"sint"},r32float:{numComponents:1,nativeType:Float32Array,stride:4,elementSize:4,sampleType:"unfilterable-float"},rg16uint:{numComponents:2,nativeType:Uint16Array,stride:4,elementSize:2,sampleType:"uint"},rg16sint:{numComponents:2,nativeType:Int16Array,stride:4,elementSize:2,sampleType:"sint"},rg16float:{numComponents:2,nativeType:Float32Array,stride:4,elementSize:2,sampleType:"float"},rgba8unorm:{numComponents:4,nativeType:Uint8Array,stride:4,elementSize:1,sampleType:"float"},"rgba8unorm-srgb":{numComponents:4,nativeType:Uint8Array,stride:4,elementSize:1,sampleType:"float"},rgba8snorm:{numComponents:4,nativeType:Int8Array,stride:4,elementSize:1,sampleType:"float"},rgba8uint:{numComponents:4,nativeType:Uint8Array,stride:4,elementSize:1,sampleType:"uint"},rgba8sint:{numComponents:4,nativeType:Int8Array,stride:4,elementSize:1,sampleType:"sint"},bgra8unorm:{numComponents:4,nativeType:Uint8Array,stride:4,elementSize:1,sampleType:"float"},"bgra8unorm-srgb":{numComponents:4,nativeType:Uint8Array,stride:4,elementSize:1,sampleType:"float"},rgb9e5ufloat:{numComponents:4,nativeType:Uint32Array,stride:4,sampleType:"float"},rgb10a2unorm:{numComponents:4,nativeType:Uint32Array,stride:4,sampleType:"float"},rg11b10ufloat:{numComponents:4,nativeType:Float32Array,stride:4,sampleType:"float"},rg32uint:{numComponents:2,nativeType:Uint32Array,stride:8,elementSize:4,sampleType:"uint"},rg32sint:{numComponents:2,nativeType:Int32Array,stride:8,elementSize:4,sampleType:"sint"},rg32float:{numComponents:2,nativeType:Float32Array,stride:8,elementSize:4,sampleType:"unfilterable-float"},rgba16uint:{numComponents:4,nativeType:Uint16Array,stride:8,elementSize:2,sampleType:"uint"},rgba16sint:{numComponents:4,nativeType:Int16Array,stride:8,elementSize:2,sampleType:"sint"},rgba16float:{numComponents:4,nativeType:Float32Array,stride:8,elementSize:2,sampleType:"float"},rgba32uint:{numComponents:4,nativeType:Uint32Array,stride:16,elementSize:4,sampleType:"uint"},rgba32sint:{numComponents:4,nativeType:Int32Array,stride:16,elementSize:4,sampleType:"sint"},rgba32float:{numComponents:4,nativeType:Float32Array,stride:16,elementSize:4,sampleType:"unfilterable-float"},stencil8:{numComponents:1,nativeType:Uint8Array,stride:1,elementSize:1,sampleType:"uint"},depth16unorm:{numComponents:1,nativeType:Uint16Array,stride:2,elementSize:2,sampleType:"depth"},depth24plus:{numComponents:1,nativeType:Uint32Array,stride:4,elementSize:3,sampleType:"depth"},"depth24plus-stencil8":{numComponents:2,nativeType:Uint32Array,stride:4,sampleType:"mixed"},depth32float:{numComponents:1,nativeType:Float32Array,stride:4,elementSize:4,sampleType:"depth"}};var Ca={getDetailsFromTextureFormat:function(e){return!e||e.length<6?0:e in Ta==!0?Ta[e]:((0,ht.E0)("unknown format ".concat(e)),null)},getByteStrideFromBufferFormat:function(e){if(!e||e.length<5)return 0;var t=1;"x"===e[e.length-2]&&(t=Number(e[e.length-1]));var r=1===t?e.length-1:e.length-3,n=Number(e[r]);return Number.isNaN(n)?((0,ht.E0)("unknown format ".concat(e)),0):t*(5-n/2)},getNumberOfComponentsFromBufferFormat:function(e){if(!e||e.length<5)return 0;var t=1;return"x"===e[e.length-2]&&(t=Number(e[e.length-1])),t},getNativeTypeFromBufferFormat:function(e){if(!e||e.length<5)return 0;var t;if("f"===e[0])t="Float";else if("s"===e[0])t="Int";else{if("u"!==e[0])return void(0,ht.E0)("unknown format ".concat(e));t="Uint"}var r=e.split("x")[0],n=Number(r[r.length-1]);if(!Number.isNaN(n))return t+=8*(5-n/2),t+="Array";(0,ht.E0)("unknown format ".concat(e))},getShaderTypeFromBufferFormat:function(e){var t;if("f"===e[0]||"n"===e[1])t="f32";else if("s"===e[0]&&"i"===e[1])t="i32";else{if("u"!==e[0]||"i"!==e[1])return void(0,ht.E0)("unknown format ".concat(e));t="u32"}var r=1;return"x"===e[e.length-2]&&(r=Number(e[e.length-1])),4===r?"vec4<".concat(t,">"):3===r?"vec3<".concat(t,">"):2===r?"vec2<".concat(t,">"):t},getByteStrideFromShaderFormat:function(e){if(!e)return 0;var t=1;return"vec"===e.substring(0,3)?t=Number(e[3]):"mat"===e.substring(0,3)&&(t=e[3]*e[5]),4*t},getNativeTypeFromShaderFormat:function(e){if(e)return e.includes("f32")?"Float32Array":e.includes("i32")?"Int32Array":e.includes("u32")?"Uint32Array":void(0,ht.E0)("unknown format ".concat(e))}};function xa(e,t){if(e===t)return!0;if(null==e||null==t)return!1;if(e.length!==t.length)return!1;for(var r=0;r2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,Sa,r),(0,ht.j6)(e,t),t.bindingDescriptions=[],t.attributeDescriptions=[],t.inputs=[],(0,ht.g2)(e,t,["created","device","handle","indexBuffer"]),function(e,t){t.classHierarchy.push("vtkWebGPUVertexInput"),e.addBuffer=function(e,r){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"vertex",a=r;Array.isArray(a)||(a=[a]);for(var o=0;ot.names[0]?1:0}))},e.removeBufferIfPresent=function(e){for(var r=0;r0&&(e+=",\n"),e="".concat(e," @location(").concat(r,") ").concat(t.inputs[n].names[a]," : ").concat(i),r++}return e},e.getVertexInputInformation=function(){var e={};if(t.inputs.length){for(var r=[],n=0,a=0;a2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,Oa,r),Tt.extend(e,t,r),t.textureViews=[],t.vertexInput=wa.newInstance(),t.bindGroup=ia.newInstance({label:"mapperBG"}),t.additionalBindables=[],t.fragmentShaderTemplate=t.fragmentShaderTemplate||"\n//VTK::Renderer::Dec\n\n//VTK::Color::Dec\n\n//VTK::Normal::Dec\n\n//VTK::TCoord::Dec\n\n//VTK::Select::Dec\n\n//VTK::RenderEncoder::Dec\n\n//VTK::Mapper::Dec\n\n//VTK::IOStructs::Dec\n\n@fragment\nfn main(\n//VTK::IOStructs::Input\n)\n//VTK::IOStructs::Output\n{\n var output : fragmentOutput;\n\n //VTK::Color::Impl\n\n //VTK::Normal::Impl\n\n //VTK::Light::Impl\n\n //VTK::TCoord::Impl\n\n //VTK::Select::Impl\n\n // var computedColor:vec4 = vec4(1.0,0.5,0.5,1.0);\n\n //VTK::RenderEncoder::Impl\n return output;\n}\n",t.vertexShaderTemplate=t.vertexShaderTemplate||"\n//VTK::Renderer::Dec\n\n//VTK::Color::Dec\n\n//VTK::Normal::Dec\n\n//VTK::TCoord::Dec\n\n//VTK::Select::Dec\n\n//VTK::Mapper::Dec\n\n//VTK::IOStructs::Dec\n\n@vertex\nfn main(\n//VTK::IOStructs::Input\n)\n//VTK::IOStructs::Output\n{\n var output : vertexOutput;\n\n // var vertex: vec4 = vertexBC;\n\n //VTK::Color::Impl\n\n //VTK::Normal::Impl\n\n //VTK::TCoord::Impl\n\n //VTK::Select::Impl\n\n //VTK::Position::Impl\n\n return output;\n}\n",t.shaderReplacements=new Map,ht.default.get(e,t,["pipeline","vertexInput"]),ht.default.setGet(e,t,["additionalBindables","device","fragmentShaderTemplate","interpolate","numberOfInstances","numberOfVertices","pipelineHash","shaderReplacements","SSBO","textureViews","topology","UBO","vertexShaderTemplate","WebGPURenderer"]),function(e,t){t.classHierarchy.push("vtkWebGPUSimpleMapper"),e.generateShaderDescriptions=function(r,n,a){var o=ba.newInstance({type:"vertex",hash:r,code:t.vertexShaderTemplate}),i=ba.newInstance({type:"fragment",hash:r,code:t.fragmentShaderTemplate}),s=n.getShaderDescriptions();s.push(o),s.push(i);for(var l=t.vertexShaderTemplate+t.fragmentShaderTemplate,c=new RegExp("//VTK::[^:]*::","g"),u=l.match(c).filter((function(e,t,r){return r.indexOf(e)===t})),d=u.map((function(e){return"replaceShader".concat(e.substring(7,e.length-2))})),f=0;f","@builtin(position) Position");var a=n.getCode();a=fa.substitute(a,"//VTK::Position::Impl",[" output.Position = rendererUBO.SCPCMatrix*vertexBC;"]).result,n.setCode(a)},t.shaderReplacements.set("replaceShaderPosition",e.replaceShaderPosition),e.replaceShaderTCoord=function(e,t,r){t.getShaderDescription("vertex").addOutput("vec2","tcoordVS")},t.shaderReplacements.set("replaceShaderTCoord",e.replaceShaderTCoord),e.addTextureView=function(e){t.textureViews.includes(e)||t.textureViews.push(e)},e.prepareToDraw=function(r){t.renderEncoder=r,e.updateInput(),e.updateBuffers(),e.updateBindings(),e.updatePipeline()},e.updateInput=function(){},e.updateBuffers=function(){},e.updateBindings=function(){t.bindGroup.setBindables(e.getBindables())},e.computePipelineHash=function(){},e.registerDrawCallback=function(r){r.registerDrawCallback(t.pipeline,e.draw)},e.prepareAndDraw=function(r){e.prepareToDraw(r),r.setPipeline(t.pipeline),e.draw(r)},e.draw=function(e){var r=e.getBoundPipeline();e.activateBindGroup(t.bindGroup),t.WebGPURenderer&&t.WebGPURenderer.bindUBO(e),r.bindVertexInput(e,t.vertexInput);var n=t.vertexInput.getIndexBuffer();n?e.drawIndexed(n.getIndexCount(),t.numberOfInstances,0,0,0):e.draw(t.numberOfVertices,t.numberOfInstances,0,0)},e.getBindables=function(){var e=(0,pa.Z)(t.additionalBindables);t.UBO&&e.push(t.UBO),t.SSBO&&e.push(t.SSBO);for(var r=0;r2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,Ra,r),Aa.extend(e,t,r),function(e,t){t.classHierarchy.push("vtkWebGPUFullScreenQuad"),e.replaceShaderPosition=function(e,t,r){var n=t.getShaderDescription("vertex");n.addBuiltinOutput("vec4","@builtin(position) Position"),n.addOutput("vec4","vertexVC");var a=n.getCode();a=fa.substitute(a,"//VTK::Position::Impl",["output.tcoordVS = vec2(vertexBC.x * 0.5 + 0.5, 1.0 - vertexBC.y * 0.5 - 0.5);","output.Position = vec4(vertexBC, 1.0);","output.vertexVC = vec4(vertexBC, 1);"]).result,n.setCode(a)},t.shaderReplacements.set("replaceShaderPosition",e.replaceShaderPosition),e.updateBuffers=function(){var e=t.device.getBufferManager().getFullScreenQuadBuffer();t.vertexInput.addBuffer(e,["vertexBC"]),t.numberOfVertices=6}}(e,t)}var Ma={newInstance:ht.default.newInstance(Ea,"vtkWebGPUFullScreenQuad"),extend:Ea},Da={BufferUsage:{Verts:0,Lines:1,Triangles:2,Strips:3,LinesFromStrips:4,LinesFromTriangles:5,Points:6,UniformArray:7,PointArray:8,NormalsFromPoints:9,Texture:10,RawVertex:11,Storage:12,Index:13},PrimitiveTypes:{Start:0,Points:0,Lines:1,Triangles:2,TriangleStrips:3,TriangleEdges:4,TriangleStripEdges:5,End:6}};function Va(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}var La=["getMappedRange","mapAsync","unmap"];function _a(e,t){t.classHierarchy.push("vtkWebGPUBuffer"),e.create=function(e,r){t.handle=t.device.getHandle().createBuffer({size:e,usage:r,label:t.label}),t.sizeInBytes=e,t.usage=r},e.write=function(e){!function(e,t,r,n){var a=n.byteLength,o=e.createBuffer({size:a,usage:GPUBufferUsage.COPY_SRC,mappedAtCreation:!0}),i=o.getMappedRange(0,a);new Uint8Array(i).set(new Uint8Array(n)),o.unmap();var s=e.createCommandEncoder();s.copyBufferToBuffer(o,0,t,r,a);var l=s.finish();e.queue.submit([l]),o.destroy()}(t.device.getHandle(),t.handle,0,e.buffer)},e.createAndWrite=function(e,r){t.handle=t.device.getHandle().createBuffer({size:e.byteLength,usage:r,mappedAtCreation:!0,label:t.label}),t.sizeInBytes=e.byteLength,t.usage=r,new Uint8Array(t.handle.getMappedRange()).set(new Uint8Array(e.buffer)),t.handle.unmap()};for(var r=function(r){e[La[r]]=function(){var e;return(e=t.handle)[La[r]].apply(e,arguments)}},n=0;n2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,Na,r),ht.default.obj(e,t),ht.default.get(e,t,["handle","sizeInBytes","usage"]),ht.default.setGet(e,t,["strideInBytes","device","arrayInformation","label","sourceTime"]),_a(e,t)}var Fa=function(e){for(var t=1;t2)for(var o=0;o2){for(var o=0;o2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,Ja,r),Fa.extend(e,t,r),ht.default.setGet(e,t,["flatIdToPointId","flatIdToCellId","flatSize","indexCount"]),Qa(e,t)}var to=function(e){for(var t=1;t2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,uo,r),(0,ht.j6)(e,t),(0,ht.g2)(e,t,["device"]),co(e,t)}var po=no(no({newInstance:(0,ht.WL)(fo),extend:fo},{}),Da),go=po.BufferUsage,mo=ht.default.vtkErrorMacro;var ho={bufferEntries:null,bufferEntryNames:null,sizeInBytes:0,label:null,numberOfInstances:1};function vo(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,ho,r),ht.default.obj(e,t),t._bufferEntryNames=new Map,t.bufferEntries=[],t._sendTime={},ht.default.obj(t._sendTime,{mtime:0}),t.bindGroupTime={},ht.default.obj(t.bindGroupTime,{mtime:0}),t.bindGroupLayoutEntry=t.bindGroupLayoutEntry||{buffer:{type:"read-only-storage"}},ht.default.get(e,t,["bindGroupTime"]),ht.default.setGet(e,t,["device","bindGroupLayoutEntry","label","numberOfInstances","sizeInBytes"]),function(e,t){t.classHierarchy.push("vtkWebGPUStorageBuffer"),e.addEntry=function(e,r){if(t._bufferEntryNames.has(e))mo("entry named ".concat(e," already exists"));else{t._bufferEntryNames.set(e,t.bufferEntries.length);var n=Ca.getByteStrideFromShaderFormat(r);t.bufferEntries.push({name:e,type:r,sizeInBytes:n,offset:t.sizeInBytes,nativeType:Ca.getNativeTypeFromShaderFormat(r)}),t.sizeInBytes+=n}},e.send=function(e){if(!t._buffer){var r={nativeArray:t.Float32Array,usage:go.Storage,label:t.label};return t._buffer=e.getBufferManager().getBuffer(r),t.bindGroupTime.modified(),void t._sendTime.modified()}e.getHandle().queue.writeBuffer(t._buffer.getHandle(),0,t.arrayBuffer,0,t.sizeInBytes*t.numberOfInstances),t._sendTime.modified()},e.createView=function(e){e in t==0&&(t.arrayBuffer||(t.arrayBuffer=new ArrayBuffer(t.sizeInBytes*t.numberOfInstances)),t[e]=ht.default.newTypedArray(e,t.arrayBuffer))},e.setValue=function(r,n,a){var o=t._bufferEntryNames.get(r);if(void 0!==o){var i=t.bufferEntries[o];e.createView(i.nativeType);var s=t[i.nativeType];s[(i.offset+n*t.sizeInBytes)/s.BYTES_PER_ELEMENT]=a}else mo("entry named ".concat(r," not found in UBO"))},e.setArray=function(r,n,a){var o=t._bufferEntryNames.get(r);if(void 0!==o){var i=t.bufferEntries[o];e.createView(i.nativeType);for(var s=t[i.nativeType],l=(i.offset+n*t.sizeInBytes)/s.BYTES_PER_ELEMENT,c=0;c,\n};\n@binding(").concat(e,") @group(").concat(r,") var ").concat(t.label,": ").concat(t.label,"Struct;\n")),n.join("\n")},e.getBindGroupEntry=function(){return{resource:{buffer:t._buffer.getHandle()}}},e.clearData=function(){t.numberOfInstances=0,t.sizeInBytes=0,t.bufferEntries=[],t._bufferEntryNames=new Map,t._buffer=null,delete t.arrayBuffer,delete t.Float32Array}}(e,t)}var yo={newInstance:ht.default.newInstance(vo,"vtkWebGPUStorageBuffer"),extend:vo},bo=po.BufferUsage,To=ht.default.vtkErrorMacro;var Co={bufferEntries:null,bufferEntryNames:null,sizeInBytes:0,label:null,bindGroupLayoutEntry:null,bindGroupEntry:null};function xo(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,Co,r),ht.default.obj(e,t),t._bufferEntryNames=new Map,t.bufferEntries=[],t.bindGroupLayoutEntry=t.bindGroupLayoutEntry||{buffer:{type:"uniform"}},t.sendTime={},ht.default.obj(t.sendTime,{mtime:0}),t.bindGroupTime={},ht.default.obj(t.bindGroupTime,{mtime:0}),t.sendDirty=!0,t.sortDirty=!0,ht.default.get(e,t,["binding","bindGroupTime"]),ht.default.setGet(e,t,["bindGroupLayoutEntry","device","label","sizeInBytes"]),function(e,t){t.classHierarchy.push("vtkWebGPUUniformBuffer"),e.addEntry=function(e,r){t._bufferEntryNames.has(e)?To("entry named ".concat(e," already exists")):(t.sortDirty=!0,t._bufferEntryNames.set(e,t.bufferEntries.length),t.bufferEntries.push({name:e,type:r,sizeInBytes:Ca.getByteStrideFromShaderFormat(r),offset:-1,nativeType:Ca.getNativeTypeFromShaderFormat(r),packed:!1}))},e.sortBufferEntries=function(){if(t.sortDirty){for(var e=0,r=[],n=4,a=0;a4&&(P.packed=!0,P.offset=e,r.push(P),e+=P.sizeInBytes)}for(var w=0;w ").concat(t.label,": ").concat(t.label,"Struct;")),a.join("\n")}}(e,t)}var So={newInstance:ht.default.newInstance(xo,"vtkWebGPUUniformBuffer"),extend:xo},Po=ht.eR,wo="\n//VTK::Renderer::Dec\n\n//VTK::Mapper::Dec\n\n//VTK::TCoord::Dec\n\n//VTK::RenderEncoder::Dec\n\n//VTK::IOStructs::Dec\n\n@fragment\nfn main(\n//VTK::IOStructs::Input\n)\n//VTK::IOStructs::Output\n{\n var output: fragmentOutput;\n\n var computedColor: vec4 = mapperUBO.BackgroundColor;\n\n //VTK::RenderEncoder::Impl\n return output;\n}\n",Oo="\nfn vecToRectCoord(dir: vec3) -> vec2 {\n var tau: f32 = 6.28318530718;\n var pi: f32 = 3.14159265359;\n var out: vec2 = vec2(0.0);\n\n out.x = atan2(dir.z, dir.x) / tau;\n out.x += 0.5;\n\n var phix: f32 = length(vec2(dir.x, dir.z));\n out.y = atan2(dir.y, phix) / pi + 0.5;\n\n return out;\n}\n\n//VTK::Renderer::Dec\n\n//VTK::Mapper::Dec\n\n//VTK::TCoord::Dec\n\n//VTK::RenderEncoder::Dec\n\n//VTK::IOStructs::Dec\n\n@fragment\nfn main(\n//VTK::IOStructs::Input\n)\n//VTK::IOStructs::Output\n{\n var output: fragmentOutput;\n\n var tcoord: vec4 = vec4(input.vertexVC.xy, -1, 1);\n var V: vec4 = normalize(mapperUBO.FSQMatrix * tcoord); // vec2((input.tcoordVS.x - 0.5) * 2, -(input.tcoordVS.y - 0.5) * 2);\n // textureSampleLevel gets rid of some ugly artifacts\n var background = textureSampleLevel(EnvironmentTexture, EnvironmentTextureSampler, vecToRectCoord(V.xyz), 0);\n var computedColor: vec4 = vec4(background.rgb, 1);\n\n //VTK::RenderEncoder::Impl\n return output;\n}\n",Io=new Float64Array(16),Ao=new Float64Array(16);var Ro={bindGroup:null,selector:null,renderEncoder:null,recenterThreshold:20,suppressClear:!1,stabilizedCenter:[0,0,0]};function Eo(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,Ro,r),Tt.extend(e,t,r),t.UBO=So.newInstance({label:"rendererUBO"}),t.UBO.addEntry("WCVCMatrix","mat4x4"),t.UBO.addEntry("SCPCMatrix","mat4x4"),t.UBO.addEntry("PCSCMatrix","mat4x4"),t.UBO.addEntry("SCVCMatrix","mat4x4"),t.UBO.addEntry("VCPCMatrix","mat4x4"),t.UBO.addEntry("WCVCNormals","mat4x4"),t.UBO.addEntry("viewportSize","vec2"),t.UBO.addEntry("LightCount","i32"),t.UBO.addEntry("MaxEnvironmentMipLevel","f32"),t.UBO.addEntry("BackgroundDiffuseStrength","f32"),t.UBO.addEntry("BackgroundSpecularStrength","f32"),t.UBO.addEntry("cameraParallel","u32"),t.SSBO=yo.newInstance({label:"rendererLightSSBO"}),t.lightTimeString="",t.bindGroup=ia.newInstance({label:"rendererBG"}),t.bindGroup.setBindables([t.UBO,t.SSBO]),t.tmpMat4=ot._E.identity(new Float64Array(16)),t.stabilizedTime={},(0,ht.j6)(t.stabilizedTime,{mtime:0}),(0,ht.U2)(e,t,["bindGroup","stabilizedTime"]),(0,ht.c$)(e,t,["stabilizedCenter"]),(0,ht.g2)(e,t,["renderEncoder","selector","suppressClear","UBO"]),function(e,t){t.classHierarchy.push("vtkWebGPURenderer"),e.buildPass=function(r){if(r){if(!t.renderable)return;t.camera=t.renderable.getActiveCamera(),e.updateLights(),e.prepareNodes(),e.addMissingNode(t.camera),e.addMissingNodes(t.renderable.getViewPropsWithNestedProps()),e.removeUnusedNodes(),t.webgpuCamera=e.getViewNodeFor(t.camera),e.updateStabilizedMatrix()}},e.updateStabilizedMatrix=function(){var e=t.camera.getClippingRange(),r=t.camera.getPositionByReference(),n=t.camera.getDirectionOfProjectionByReference(),a=[],o=[];ot.R3.scale(o,n,.5*(e[0]+e[1])),ot.R3.add(a,r,o),ot.R3.sub(o,a,t.stabilizedCenter),ot.R3.len(o)/(e[1]-e[0])>t.recenterThreshold&&(t.stabilizedCenter=a,t.stabilizedTime.modified())},e.updateLights=function(){for(var e=0,r=t.renderable.getLightsByReference(),n=0;n0&&e++;return e||(Po("No lights are on, creating one."),t.renderable.createLight()),e},e.updateUBO=function(){var r=t.UBO.getSendTime();if(t._parent.getMTime()>r||e.getMTime()>r||t.camera.getMTime()>r||t.renderable.getMTime()>r){var n,a=t.webgpuCamera.getKeyMatrices(e);t.UBO.setArray("WCVCMatrix",a.wcvc),t.UBO.setArray("SCPCMatrix",a.scpc),t.UBO.setArray("PCSCMatrix",a.pcsc),t.UBO.setArray("SCVCMatrix",a.scvc),t.UBO.setArray("VCPCMatrix",a.vcpc),t.UBO.setArray("WCVCNormals",a.normalMatrix),t.UBO.setValue("LightCount",t.renderable.getLights().length),t.UBO.setValue("MaxEnvironmentMipLevel",null===(n=t.renderable.getEnvironmentTexture())||void 0===n?void 0:n.getMipLevel()),t.UBO.setValue("BackgroundDiffuseStrength",t.renderable.getEnvironmentTextureDiffuseStrength()),t.UBO.setValue("BackgroundSpecularStrength",t.renderable.getEnvironmentTextureSpecularStrength());var o=e.getYInvertedTiledSizeAndOrigin();t.UBO.setArray("viewportSize",[o.usize,o.vsize]),t.UBO.setValue("cameraParallel",t.camera.getParallelProjection());var i=t._parent.getDevice();t.UBO.sendIfNeeded(i)}},e.updateSSBO=function(){for(var r,n=t.renderable.getLights(),a=t.webgpuCamera.getKeyMatrices(e),o="".concat(t.renderable.getMTime()),i=0;i=90?0:2:1,u[f+1]=Math.cos((0,Mr.r)(n[d].getConeAngle())),u[f+2]=Math.cos((0,Mr.r)(n[d].getConeAngle()+n[d].getConeFalloff())),u[f+3]=0}t.SSBO.clearData(),t.SSBO.setNumberOfInstances(n.length),t.SSBO.addEntry("LightPos","vec4"),t.SSBO.addEntry("LightDir","vec4"),t.SSBO.addEntry("LightColor","vec4"),t.SSBO.addEntry("LightData","vec4"),t.SSBO.setAllInstancesFromArray("LightPos",s),t.SSBO.setAllInstancesFromArray("LightDir",l),t.SSBO.setAllInstancesFromArray("LightColor",c),t.SSBO.setAllInstancesFromArray("LightData",u);var g=t._parent.getDevice();t.SSBO.send(g)}t.lightTimeString=o},e.scissorAndViewport=function(t){var r=e.getYInvertedTiledSizeAndOrigin();t.getHandle().setViewport(r.lowerLeftU,r.lowerLeftV,r.usize,r.vsize,0,1),t.getHandle().setScissorRect(r.lowerLeftU,r.lowerLeftV,r.usize,r.vsize)},e.bindUBO=function(e){e.activateBindGroup(t.bindGroup)},e.opaquePass=function(r){r?(t.renderEncoder.begin(t._parent.getCommandEncoder()),e.updateUBO(),e.updateSSBO()):(e.scissorAndViewport(t.renderEncoder),e.clear(),t.renderEncoder.end())},e.clear=function(){var r;if(!t.renderable.getTransparent()&&!t.suppressClear){var n=t._parent.getDevice();if(!t.clearFSQ){t.clearFSQ=Ma.newInstance(),t.clearFSQ.setDevice(n),t.clearFSQ.setPipelineHash("clearfsq"),t.clearFSQ.setFragmentShaderTemplate(wo);var a=So.newInstance({label:"mapperUBO"});a.addEntry("FSQMatrix","mat4x4"),a.addEntry("BackgroundColor","vec4"),t.clearFSQ.setUBO(a),t.backgroundTex=t.renderable.getEnvironmentTexture()}if("clearfsqwithtexture"!==t.clearFSQ.getPipelineHash()&&t.renderable.getUseEnvironmentTextureAsBackground()&&null!==(r=t.backgroundTex)&&void 0!==r&&r.getImageLoaded()){t.clearFSQ.setFragmentShaderTemplate(Oo);var o=So.newInstance({label:"mapperUBO"});o.addEntry("FSQMatrix","mat4x4"),o.addEntry("BackgroundColor","vec4"),t.clearFSQ.setUBO(o);var i=n.getTextureManager().getTextureForVTKTexture(t.backgroundTex);if(i.getReady()){var s=i.createView("EnvironmentTexture");t.clearFSQ.setTextureViews([s]),t.backgroundTexLoaded=!0;var l=t.backgroundTex.getInterpolate()?"linear":"nearest";s.addSampler(n,{addressModeU:"repeat",addressModeV:"clamp-to-edge",addressModeW:"repeat",minFilter:l,magFilter:l,mipmapFilter:"linear"})}t.clearFSQ.setPipelineHash("clearfsqwithtexture")}else if("clearfsqwithtexture"===t.clearFSQ.getPipelineHash()&&!t.renderable.getUseEnvironmentTextureAsBackground()){t.clearFSQ=Ma.newInstance(),t.clearFSQ.setDevice(n),t.clearFSQ.setPipelineHash("clearfsq"),t.clearFSQ.setFragmentShaderTemplate(wo);var c=So.newInstance({label:"mapperUBO"});c.addEntry("FSQMatrix","mat4x4"),c.addEntry("BackgroundColor","vec4"),t.clearFSQ.setUBO(c)}var u=t.webgpuCamera.getKeyMatrices(e),d=t.renderable.getBackgroundByReference();t.clearFSQ.getUBO().setArray("BackgroundColor",d),ot._E.transpose(Ao,u.normalMatrix),ot._E.mul(Io,u.scvc,u.pcsc),ot._E.mul(Io,Ao,Io),t.clearFSQ.getUBO().setArray("FSQMatrix",Io),t.clearFSQ.getUBO().sendIfNeeded(n),t.clearFSQ.prepareAndDraw(t.renderEncoder)}},e.translucentPass=function(r){r?t.renderEncoder.begin(t._parent.getCommandEncoder()):(e.scissorAndViewport(t.renderEncoder),t.renderEncoder.end())},e.volumeDepthRangePass=function(r){r?t.renderEncoder.begin(t._parent.getCommandEncoder()):(e.scissorAndViewport(t.renderEncoder),t.renderEncoder.end())},e.getAspectRatio=function(){var e=t._parent.getSizeByReference(),r=t.renderable.getViewportByReference();return e[0]*(r[2]-r[0])/((r[3]-r[1])*e[1])},e.convertToOpenGLDepth=function(e){return t.webgpuCamera.convertToOpenGLDepth(e)},e.getYInvertedTiledSizeAndOrigin=function(){var r=e.getTiledSizeAndOrigin(),n=t._parent.getSizeByReference();return r.lowerLeftV=n[1]-r.vsize-r.lowerLeftV,r},e.getTiledSizeAndOrigin=function(){var e=t.renderable.getViewportByReference(),r=[0,0,1,1],n=e[0]-r[0],a=e[1]-r[1],o=t._parent.normalizedDisplayToDisplay(n,a),i=Math.round(o[0]),s=Math.round(o[1]),l=e[2]-r[0],c=e[3]-r[1],u=t._parent.normalizedDisplayToDisplay(l,c),d=Math.round(u[0])-i,f=Math.round(u[1])-s;return d<0&&(d=0),f<0&&(f=0),{usize:d,vsize:f,lowerLeftU:i,lowerLeftV:s}},e.getPropFromID=function(e){for(var r=0;r2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,Do,r),ht.default.obj(e,t),t.options={},t.bindGroupLayoutEntry={visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,sampler:{}},t.bindGroupTime={},ht.default.obj(t.bindGroupTime,{mtime:0}),ht.default.get(e,t,["bindGroupTime","handle","options"]),ht.default.setGet(e,t,["bindGroupLayoutEntry","device","label"]),function(e,t){t.classHierarchy.push("vtkWebGPUSampler"),e.create=function(e){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};t.device=e,t.options.addressModeU=r.addressModeU?r.addressModeU:"clamp-to-edge",t.options.addressModeV=r.addressModeV?r.addressModeV:"clamp-to-edge",t.options.addressModeW=r.addressModeW?r.addressModeW:"clamp-to-edge",t.options.magFilter=r.magFilter?r.magFilter:"nearest",t.options.minFilter=r.minFilter?r.minFilter:"nearest",t.options.mipmapFilter=r.mipmapFilter?r.mipmapFilter:"nearest",t.options.label=t.label,t.handle=t.device.getHandle().createSampler(t.options),t.bindGroupTime.modified()},e.getShaderCode=function(e,r){return"@binding(".concat(e,") @group(").concat(r,") var ").concat(t.label,": sampler;")},e.getBindGroupEntry=function(){return{resource:t.handle}}}(e,t)}var Lo={newInstance:ht.default.newInstance(Vo),extend:Vo},_o=fn.SlicingMode;var No=new Float64Array(16),Bo=new Float64Array(16),Fo=new Float64Array(16),Uo=new Float64Array(4),ko=new Float64Array(4);var Go={rowLength:1024};function Wo(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,Go,r),Ma.extend(e,t,r),e.setFragmentShaderTemplate("\n//VTK::Renderer::Dec\n\n//VTK::Mapper::Dec\n\n//VTK::TCoord::Dec\n\n//VTK::Image::Dec\n\n//VTK::RenderEncoder::Dec\n\n//VTK::IOStructs::Dec\n\n@fragment\nfn main(\n//VTK::IOStructs::Input\n)\n//VTK::IOStructs::Output\n{\n var output: fragmentOutput;\n\n //VTK::Image::Sample\n\n // var computedColor: vec4 = vec4(1.0,0.7, 0.5, 1.0);\n\n//VTK::RenderEncoder::Impl\n\n return output;\n}\n"),t.UBO=So.newInstance({label:"mapperUBO"}),t.UBO.addEntry("SCTCMatrix","mat4x4"),t.UBO.addEntry("Origin","vec4"),t.UBO.addEntry("Axis2","vec4"),t.UBO.addEntry("Axis1","vec4"),t.UBO.addEntry("cScale","vec4"),t.UBO.addEntry("cShift","vec4"),t.lutBuildTime={},(0,ht.j6)(t.lutBuildTime,{mtime:0}),t.imagemat=ot._E.identity(new Float64Array(16)),t.imagematinv=ot._E.identity(new Float64Array(16)),t.VBOBuildTime={},(0,ht.j6)(t.VBOBuildTime),function(e,t){t.classHierarchy.push("vtkWebGPUImageMapper"),e.buildPass=function(r){if(r){t.WebGPUImageSlice=e.getFirstAncestorOfType("vtkWebGPUImageSlice"),t.WebGPURenderer=t.WebGPUImageSlice.getFirstAncestorOfType("vtkWebGPURenderer"),t.WebGPURenderWindow=t.WebGPURenderer.getParent(),t.device=t.WebGPURenderWindow.getDevice();var n=t.WebGPURenderer.getRenderable();t.renderable.getSliceAtFocalPoint()&&t.renderable.setSliceFromCamera(n.getActiveCamera())}},e.translucentPass=function(t){t&&e.render()},e.opaquePass=function(t){t&&e.render()},e.render=function(){t.renderable.update(),t.currentInput=t.renderable.getInputData(),e.prepareToDraw(t.WebGPURenderer.getRenderEncoder()),t.renderEncoder.registerDrawCallback(t.pipeline,e.draw)},e.computePipelineHash=function(){var e=t.currentInput.getExtent();e[0]===e[1]||e[2]===e[3]||e[4]===e[5]?(t.dimensions=2,t.pipelineHash="img2"):(t.dimensions=3,t.pipelineHash="img3")},e.updateUBO=function(){var r=t.UBO.getSendTime(),n=t.WebGPUImageSlice.getRenderable(),a=n.getMapper();if(e.getMTime()>r||t.renderable.getMTime()>r||n.getProperty().getMTime()>r){var o=a.getInputData(),i=t.WebGPURenderer.getStabilizedCenterByReference();ot._E.identity(No),ot._E.translate(No,No,i);var s=n.getMatrix();ot._E.transpose(Bo,s),ot._E.invert(Bo,Bo),ot._E.multiply(No,Bo,No);var l=o.getWorldToIndex();ot._E.multiply(No,l,No),ot._E.invert(Fo,No),ot._E.fromTranslation(Bo,[.5,.5,.5]),ot._E.multiply(No,Bo,No);var c=o.getDimensions();ot._E.identity(Bo),ot._E.scale(Bo,Bo,[1/c[0],1/c[1],1/c[2]]),ot._E.multiply(No,Bo,No),t.UBO.setArray("SCTCMatrix",No);var u=t.currentInput.getExtent(),d=t.renderable.getClosestIJKAxis().ijkMode,f=t.renderable.getSlice();d!==t.renderable.getSlicingMode()&&(f=t.renderable.getSliceAtPosition(f));var p=2,g=0,m=1;d===_o.I?(p=0,g=1,m=2):d===_o.J&&(p=1,g=2,m=0),Uo[p]=f,Uo[g]=u[2*g]-.5,Uo[m]=u[2*m]-.5,Uo[3]=1,ot.vh.transformMat4(Uo,Uo,Fo),t.UBO.setArray("Origin",Uo),ko[p]=f,ko[g]=u[2*g+1]+.5,ko[m]=u[2*m]-.5,ko[3]=1,ot.vh.transformMat4(ko,ko,Fo),ot.vh.subtract(ko,ko,Uo),ko[3]=1,t.UBO.setArray("Axis1",ko),ko[p]=f,ko[g]=u[2*g]-.5,ko[m]=u[2*m+1]+.5,ko[3]=1,ot.vh.transformMat4(ko,ko,Fo),ot.vh.subtract(ko,ko,Uo),ko[3]=1,t.UBO.setArray("Axis2",ko);for(var h=[1,1,1,1],v=[0,0,0,0],y=t.textureViews[0],b=y.getTexture().getScale(),T=y.getTexture().getNumberOfComponents(),C=0;C","@builtin(position) Position");var o=a.getCode(),i=["var pos: vec4 = mapperUBO.Origin +"," (vertexBC.x * 0.5 + 0.5) * mapperUBO.Axis1 + (vertexBC.y * 0.5 + 0.5) * mapperUBO.Axis2;","pos.w = 1.0;"];2===t.dimensions?i.push("var tcoord : vec2 = (mapperUBO.SCTCMatrix * pos).xy;"):i.push("var tcoord : vec3 = (mapperUBO.SCTCMatrix * pos).xyz;"),i.push("output.tcoordVS = tcoord;","output.Position = rendererUBO.SCPCMatrix * pos;"),o=fa.substitute(o,"//VTK::Position::Impl",i).result,a.setCode(o)},n.set("replaceShaderPosition",e.replaceShaderPosition),e.replaceShaderTCoord=function(e,r,n){var a=r.getShaderDescription("vertex");2===t.dimensions?a.addOutput("vec2","tcoordVS"):a.addOutput("vec3","tcoordVS")},n.set("replaceShaderTCoord",e.replaceShaderTCoord),e.replaceShaderImage=function(e,r,n){var a=r.getShaderDescription("fragment"),o=a.getCode();t.dimensions,o=fa.substitute(o,"//VTK::Image::Sample",[" var computedColor: vec4 ="," textureSampleLevel(imgTexture, clampSampler, input.tcoordVS, 0.0);","//VTK::Image::Sample"]).result,o=fa.substitute(o,"//VTK::Image::Sample",[" var coord: vec2 ="," vec2(computedColor.r * mapperUBO.cScale.r + mapperUBO.cShift.r, 0.5);"," computedColor = textureSampleLevel(tfunTexture, clampSampler, coord, 0.0);"]).result,a.setCode(o)},n.set("replaceShaderImage",e.replaceShaderImage)}(e,t)}var zo=(0,ht.WL)(Wo,"vtkWebGPUImageMapper");Qn("vtkImageMapper",zo);var jo={bufferShift:void 0,keyMatrixTime:null,keyMatrices:null,propID:void 0};function Ho(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,jo,r),Tt.extend(e,t,r),t.keyMatricesTime={},(0,ht.j6)(t.keyMatricesTime,{mtime:0}),t.keyMatrices={normalMatrix:new Float64Array(16),bcwc:new Float64Array(16),bcsc:new Float64Array(16)},t.keyMatrixTime={},(0,ht.j6)(t.keyMatrixTime,{mtime:0}),t.keyMatrices={mcwc:ot._E.identity(new Float64Array(16))},t.bufferShift=[0,0,0,0],(0,ht.U2)(e,t,["propID","keyMatricesTime"]),function(e,t){t.classHierarchy.push("vtkWebGPUImageSlice"),e.buildPass=function(r){if(t.renderable&&t.renderable.getVisibility()&&r){if(!t.renderable)return;t.WebGPURenderer=e.getFirstAncestorOfType("vtkWebGPURenderer"),t.WebGPURenderWindow=t.WebGPURenderer.getFirstAncestorOfType("vtkWebGPURenderWindow"),void 0===t.propID&&(t.propID=t.WebGPURenderWindow.getUniquePropID()),e.prepareNodes(),e.addMissingNode(t.renderable.getMapper()),e.removeUnusedNodes()}},e.traverseOpaquePass=function(r){t.renderable&&t.renderable.getNestedVisibility()&&t.renderable.getIsOpaque()&&(!t.WebGPURenderer.getSelector()||t.renderable.getNestedPickable())&&(e.apply(r,!0),t.children.forEach((function(e){e.traverse(r)})),e.apply(r,!1))},e.traverseTranslucentPass=function(r){!t.renderable||!t.renderable.getNestedVisibility()||t.renderable.getIsOpaque()||t.WebGPURenderer.getSelector()&&!t.renderable.getNestedPickable()||(e.apply(r,!0),t.children.forEach((function(e){e.traverse(r)})),e.apply(r,!1))},e.queryPass=function(e,r){if(e){if(!t.renderable||!t.renderable.getVisibility())return;t.renderable.getIsOpaque()?r.incrementOpaqueActorCount():r.incrementTranslucentActorCount()}},e.getBufferShift=function(r){return e.getKeyMatrices(r),t.bufferShift},e.getKeyMatrices=function(e){if(Math.max(t.renderable.getMTime(),e.getStabilizedTime())>t.keyMatricesTime.getMTime()){t.renderable.computeMatrix();var r=t.renderable.getMatrix(),n=e.getStabilizedCenterByReference();t.bufferShift[0]=r[3]-n[0],t.bufferShift[1]=r[7]-n[1],t.bufferShift[2]=r[11]-n[2],ot._E.transpose(t.keyMatrices.bcwc,r),t.renderable.getIsIdentity()?ot._E.identity(t.keyMatrices.normalMatrix):(ot._E.copy(t.keyMatrices.normalMatrix,t.keyMatrices.bcwc),t.keyMatrices.normalMatrix[3]=0,t.keyMatrices.normalMatrix[7]=0,t.keyMatrices.normalMatrix[11]=0,ot._E.invert(t.keyMatrices.normalMatrix,t.keyMatrices.normalMatrix),ot._E.transpose(t.keyMatrices.normalMatrix,t.keyMatrices.normalMatrix)),ot._E.translate(t.keyMatrices.bcwc,t.keyMatrices.bcwc,[-t.bufferShift[0],-t.bufferShift[1],-t.bufferShift[2]]),ot._E.translate(t.keyMatrices.bcsc,t.keyMatrices.bcwc,[-n[0],-n[1],-n[2]]),t.keyMatricesTime.modified()}return t.keyMatrices}}(e,t)}var Ko=(0,ht.WL)(Ho,"vtkWebGPUImageSlice");Qn("vtkImageSlice",Ko);var Zo={propID:void 0,keyMatricesTime:null};function Xo(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,Zo,r),Tt.extend(e,t,r),t.keyMatricesTime={},ht.default.obj(t.keyMatricesTime,{mtime:0}),t.keyMatrices={bcwc:new Float64Array(16),bcsc:new Float64Array(16)},ht.default.get(e,t,["propID","keyMatricesTime"]),function(e,t){t.classHierarchy.push("vtkWebGPUVolume"),e.buildPass=function(r){t.renderable&&t.renderable.getVisibility()&&r&&(t.WebGPURenderer=e.getFirstAncestorOfType("vtkWebGPURenderer"),t.WebGPURenderWindow=t.WebGPURenderer.getFirstAncestorOfType("vtkWebGPURenderWindow"),void 0===t.propID&&(t.propID=t.WebGPURenderWindow.getUniquePropID()),t.renderable.getMapper().update())},e.queryPass=function(r,n){if(r){if(!t.renderable||!t.renderable.getVisibility())return;var a=t.renderable.getMapper().getBounds();if(!a||6!==a.length||a[0]>a[1])return;n.addVolume(e)}};var r=new Float64Array(3),n=new Float64Array(3);e.getBoundingCubePoints=function(e,a){var o=t.renderable.getMapper().getInputData();if(o)for(var i=o.getExtent(),s=t.renderable.getMatrix(),l=0,c=4;c<6;c++){r[2]=i[c];for(var u=2;u<4;u++){r[1]=i[u];for(var d=0;d<2;d++){r[0]=i[d],o.indexToWorld(r,n);var f=a+3*l;e[f++]=s[0]*n[0]+s[1]*n[1]+s[2]*n[2]+s[3],e[f++]=s[4]*n[0]+s[5]*n[1]+s[6]*n[2]+s[7],e[f++]=s[8]*n[0]+s[9]*n[1]+s[10]*n[2]+s[11],l++}}}},e.getKeyMatrices=function(e){if(Math.max(t.renderable.getMTime(),e.getStabilizedTime())>t.keyMatricesTime.getMTime()){t.renderable.computeMatrix();var r=t.renderable.getMatrix(),n=e.getStabilizedCenterByReference();ot._E.transpose(t.keyMatrices.bcwc,r),ot._E.translate(t.keyMatrices.bcsc,t.keyMatrices.bcwc,[-n[0],-n[1],-n[2]]),t.keyMatricesTime.modified()}return t.keyMatrices}}(e,t)}var qo=ht.default.newInstance(Xo,"vtkWebGPUVolume");Qn("vtkVolume",qo);var Yo={};function $o(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,Yo,r),Tt.extend(e,t,r),function(e,t){t.classHierarchy.push("vtkWebGPUPixelSpaceCallbackMapper"),e.opaquePass=function(r,n){t.WebGPURenderer=e.getFirstAncestorOfType("vtkWebGPURenderer"),t.WebGPURenderWindow=t.WebGPURenderer.getParent();var a=t.WebGPURenderer.getAspectRatio(),o=t.WebGPURenderer?t.WebGPURenderer.getRenderable().getActiveCamera():null,i=t.WebGPURenderer.getTiledSizeAndOrigin();t.renderable.getUseZValues(),t.renderable.invokeCallback(t.renderable.getInputData(),o,a,i,null)}}(e,t)}var Qo=ht.default.newInstance($o,"vtkWebGPUPixelSpaceCallbackMapper");Qn("vtkPixelSpaceCallbackMapper",Qo);var Jo=r(96372),ei=r(11677),ti=r.n(ei);function ri(e,t,r,n,a,o,i){try{var s=e[o](i),l=s.value}catch(e){return void r(e)}s.done?t(l):Promise.resolve(l).then(n,a)}function ni(e){return function(){var t=this,r=arguments;return new Promise((function(n,a){var o=e.apply(t,r);function i(e){ri(o,n,a,i,s,"next",e)}function s(e){ri(o,n,a,i,s,"throw",e)}i(void 0)}))}}var ai=r(75882),oi=r.n(ai),ii=navigator.gpu?"WebGPU":"WebGL",si=Object.create(null);function li(e,t){si[e]=t}function ci(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return si[e]&&si[e](t)}var ui={defaultViewAPI:ii,renderers:[],views:[],interactor:null,neverRendered:!0,numberOfLayers:1};function di(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,ui,r),ht.default.obj(e,t),ht.default.setGet(e,t,["interactor","numberOfLayers","_views","defaultViewAPI"]),ht.default.get(e,t,["neverRendered"]),ht.default.getArray(e,t,["renderers"]),ht.default.moveToProtected(e,t,["views"]),ht.default.event(e,t,"completion"),function(e,t){t.classHierarchy.push("vtkRenderWindow"),e.addRenderer=function(r){e.hasRenderer(r)||(r.setRenderWindow(e),t.renderers.push(r),e.modified())},e.removeRenderer=function(r){t.renderers=t.renderers.filter((function(e){return e!==r})),e.modified()},e.hasRenderer=function(e){return-1!==t.renderers.indexOf(e)},e.newAPISpecificView=function(e){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return ci(e||t.defaultViewAPI,r)},e.addView=function(r){e.hasView(r)||(r.setRenderable(e),t._views.push(r),e.modified())},e.removeView=function(r){t._views=t._views.filter((function(e){return e!==r})),e.modified()},e.hasView=function(e){return-1!==t._views.indexOf(e)},e.preRender=function(){t.renderers.forEach((function(e){e.isActiveCameraCreated()||e.resetCamera()}))},e.render=function(){e.preRender(),t.interactor?t.interactor.render():t._views.forEach((function(e){return e.traverseAllPasses()}))},e.getStatistics=function(){var e={propCount:0,invisiblePropCount:0};return t.renderers.forEach((function(t){t.getViewProps().forEach((function(t){if(t.getVisibility()){e.propCount+=1;var r=t.getMapper&&t.getMapper();if(r&&r.getPrimitiveCount){var n=r.getPrimitiveCount();Object.keys(n).forEach((function(t){e[t]||(e[t]=0),e[t]+=n[t]}))}}else e.invisiblePropCount+=1}))})),e.str=Object.keys(e).map((function(t){return"".concat(t,": ").concat(e[t])})).join("\n"),e},e.captureImages=function(){var r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"image/png",n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return ht.default.setImmediate(e.render),t._views.map((function(e){return e.captureNextImage?e.captureNextImage(r,n):void 0})).filter((function(e){return!!e}))}}(e,t)}var fi={newInstance:ht.default.newInstance(di,"vtkRenderWindow"),extend:di,registerViewConstructor:li,listViewAPIs:function(){return Object.keys(si)},newAPISpecificView:ci};var pi={delegates:[],currentOperation:null,preDelegateOperations:[],postDelegateOperations:[],currentParent:null};function gi(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,pi,r),ht.default.obj(e,t),ht.default.get(e,t,["currentOperation"]),ht.default.setGet(e,t,["delegates","_currentParent","preDelegateOperations","postDelegateOperations"]),ht.default.moveToProtected(e,t,["currentParent"]),function(e,t){t.classHierarchy.push("vtkRenderPass"),e.getOperation=function(){return t.currentOperation},e.setCurrentOperation=function(e){t.currentOperation=e,t.currentTraverseOperation="traverse".concat(ht.default.capitalize(t.currentOperation))},e.getTraverseOperation=function(){return t.currentTraverseOperation},e.traverse=function(r){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;t.deleted||(t._currentParent=n,t.preDelegateOperations.forEach((function(t){e.setCurrentOperation(t),r.traverse(e)})),t.delegates.forEach((function(t){t.traverse(r,e)})),t.postDelegateOperations.forEach((function(t){e.setCurrentOperation(t),r.traverse(e)})))}}(e,t)}var mi={newInstance:ht.default.newInstance(gi,"vtkRenderPass"),extend:gi},hi=Ua.ZP.Representation,vi=ht.default.vtkErrorMacro;function yi(e){var t=Sr.substitute(e.Fragment,"//VTK::RenderPassFragmentShader::Impl","\n float weight = gl_FragData[0].a * pow(max(1.1 - gl_FragCoord.z, 0.0), 2.0);\n gl_FragData[0] = vec4(gl_FragData[0].rgb*weight, gl_FragData[0].a);\n gl_FragData[1].r = weight;\n ",!1);e.Fragment=t.result}var bi="//VTK::System::Dec\n\nin vec2 tcoord;\n\nuniform sampler2D translucentRTexture;\nuniform sampler2D translucentRGBATexture;\n\n// the output of this shader\n//VTK::Output::Dec\n\nvoid main()\n{\n vec4 t1Color = texture(translucentRGBATexture, tcoord);\n float t2Color = texture(translucentRTexture, tcoord).r;\n gl_FragData[0] = vec4(t1Color.rgb/max(t2Color,0.01), 1.0 - t1Color.a);\n}\n";var Ti={framebuffer:null,copyShader:null,tris:null};function Ci(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,Ti,r),mi.extend(e,t,r),t.VBOBuildTime={},ht.default.obj(t.VBOBuildTime,{mtime:0}),t.tris=Er.newInstance(),ht.default.get(e,t,["framebuffer"]),function(e,t){t.classHierarchy.push("vtkOpenGLOrderIndependentTranslucentPass"),e.createVertexBuffer=function(){var e=new Float32Array([-1,-1,-1,1,-1,-1,-1,1,-1,1,1,-1]),r=new Float32Array([0,0,1,0,0,1,1,1]),n=new Uint16Array([4,0,1,3,2]),a=re.ZP.newInstance({numberOfComponents:3,values:e});a.setName("points");var o=re.ZP.newInstance({numberOfComponents:2,values:r});o.setName("tcoords");var i=re.ZP.newInstance({numberOfComponents:1,values:n});t.tris.getCABO().createVBO(i,"polys",hi.SURFACE,{points:a,tcoords:o,cellOffset:0}),t.VBOBuildTime.modified()},e.createFramebuffer=function(e){var r,n=e.getSize(),a=e.getContext();t.framebuffer=Dn.newInstance(),t.framebuffer.setOpenGLRenderWindow(e),(r=t.framebuffer).create.apply(r,(0,pa.Z)(n)),t.framebuffer.saveCurrentBindingsAndBuffers(),t.framebuffer.bind(),t.translucentRGBATexture=Yr.newInstance(),t.translucentRGBATexture.setInternalFormat(a.RGBA16F),t.translucentRGBATexture.setFormat(a.RGBA),t.translucentRGBATexture.setOpenGLDataType(a.HALF_FLOAT),t.translucentRGBATexture.setOpenGLRenderWindow(e),t.translucentRGBATexture.create2DFromRaw(n[0],n[1],4,"Float32Array",null),t.translucentRTexture=Yr.newInstance(),t.translucentRTexture.setInternalFormat(a.R16F),t.translucentRTexture.setFormat(a.RED),t.translucentRTexture.setOpenGLDataType(a.HALF_FLOAT),t.translucentRTexture.setOpenGLRenderWindow(e),t.translucentRTexture.create2DFromRaw(n[0],n[1],1,"Float32Array",null),t.translucentZTexture=Yr.newInstance(),t.translucentZTexture.setOpenGLRenderWindow(e),t.translucentZTexture.createDepthFromRaw(n[0],n[1],"Float32Array",null),t.framebuffer.setColorBuffer(t.translucentRGBATexture,0),t.framebuffer.setColorBuffer(t.translucentRTexture,1),t.framebuffer.setDepthBuffer(t.translucentZTexture)},e.createCopyShader=function(e){t.copyShader=e.getShaderCache().readyShaderProgramArray(["//VTK::System::Dec","attribute vec4 vertexDC;","attribute vec2 tcoordTC;","varying vec2 tcoord;","void main() { tcoord = tcoordTC; gl_Position = vertexDC; }"].join("\n"),bi,"")},e.createVBO=function(r){var n=r.getContext();t.tris.setOpenGLRenderWindow(r),e.createVertexBuffer();var a=t.copyShader;t.tris.getCABO().bind(),t.copyVAO.addAttributeArray(a,t.tris.getCABO(),"vertexDC",t.tris.getCABO().getVertexOffset(),t.tris.getCABO().getStride(),n.FLOAT,3,n.FALSE)||vi("Error setting vertexDC in copy shader VAO."),t.copyVAO.addAttributeArray(a,t.tris.getCABO(),"tcoordTC",t.tris.getCABO().getTCoordOffset(),t.tris.getCABO().getStride(),n.FLOAT,2,n.FALSE)||vi("Error setting vertexDC in copy shader VAO.")},e.traverse=function(r,n,a){if(!t.deleted){var o=r.getSize(),i=r.getContext();if(t._supported=!1,n.getSelector()||!i||!r.getWebgl2()||!i.getExtension("EXT_color_buffer_half_float")&&!i.getExtension("EXT_color_buffer_float"))return e.setCurrentOperation("translucentPass"),void n.traverse(e);if(t._supported=!0,null===t.framebuffer)e.createFramebuffer(r);else{var s=t.framebuffer.getSize();null===s||s[0]!==o[0]||s[1]!==o[1]?(t.framebuffer.releaseGraphicsResources(),t.translucentRGBATexture.releaseGraphicsResources(r),t.translucentRTexture.releaseGraphicsResources(r),t.translucentZTexture.releaseGraphicsResources(r),e.createFramebuffer(r)):(t.framebuffer.saveCurrentBindingsAndBuffers(),t.framebuffer.bind())}i.drawBuffers([i.COLOR_ATTACHMENT0]),i.clearBufferfv(i.COLOR,0,[0,0,0,0]),i.clearBufferfv(i.DEPTH,0,[1]),i.colorMask(!1,!1,!1,!1),a.getOpaqueActorCount()>0&&(a.setCurrentOperation("opaqueZBufferPass"),n.traverse(a)),i.colorMask(!0,!0,!0,!0),i.drawBuffers([i.COLOR_ATTACHMENT0,i.COLOR_ATTACHMENT1]),i.viewport(0,0,o[0],o[1]),i.scissor(0,0,o[0],o[1]),i.clearBufferfv(i.COLOR,0,[0,0,0,1]),i.clearBufferfv(i.COLOR,1,[0,0,0,0]),i.enable(i.DEPTH_TEST),i.enable(i.BLEND),i.blendFuncSeparate(i.ONE,i.ONE,i.ZERO,i.ONE_MINUS_SRC_ALPHA),e.setCurrentOperation("translucentPass"),n.traverse(e),i.drawBuffers([i.NONE]),t.framebuffer.restorePreviousBindingsAndBuffers(),null===t.copyShader?e.createCopyShader(r):r.getShaderCache().readyShaderProgram(t.copyShader),t.copyVAO||(t.copyVAO=Or.newInstance(),t.copyVAO.setOpenGLRenderWindow(r)),t.copyVAO.bind(),t.VBOBuildTime.getMTime()2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,Si,r),mi.extend(e,t,r),ht.default.get(e,t,["framebuffer","opaqueActorCount","translucentActorCount","volumeCount"]),function(e,t){t.classHierarchy.push("vtkForwardPass"),e.traverse=function(r){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;if(!t.deleted){t._currentParent=n,e.setCurrentOperation("buildPass"),r.traverse(e);for(var a=r.getRenderable().getNumberOfLayers(),o=r.getChildren(),i=0;i0||t.translucentActorCount>0)&&t.volumeCount>0||t.depthRequested){var u=r.getFramebufferSize();null===t.framebuffer&&(t.framebuffer=Dn.newInstance()),t.framebuffer.setOpenGLRenderWindow(r),t.framebuffer.saveCurrentBindingsAndBuffers();var d=t.framebuffer.getSize();null!==d&&d[0]===u[0]&&d[1]===u[1]||(t.framebuffer.create(u[0],u[1]),t.framebuffer.populateFramebuffer()),t.framebuffer.bind(),e.setCurrentOperation("zBufferPass"),l.traverse(e),t.framebuffer.restorePreviousBindingsAndBuffers(),t.depthRequested=!1}e.setCurrentOperation("cameraPass"),l.traverse(e),t.opaqueActorCount>0&&(e.setCurrentOperation("opaquePass"),l.traverse(e)),t.translucentActorCount>0&&(t.translucentPass||(t.translucentPass=xi.newInstance()),t.translucentPass.traverse(r,l,e)),t.volumeCount>0&&(e.setCurrentOperation("volumePass"),l.traverse(e)),t.overlayActorCount>0&&(e.setCurrentOperation("overlayPass"),l.traverse(e))}}}},e.getZBufferTexture=function(){return t.framebuffer?t.framebuffer.getColorTexture():null},e.requestDepth=function(){t.depthRequested=!0},e.incrementOpaqueActorCount=function(){return t.opaqueActorCount++},e.incrementTranslucentActorCount=function(){return t.translucentActorCount++},e.incrementVolumeCount=function(){return t.volumeCount++},e.incrementOverlayActorCount=function(){return t.overlayActorCount++}}(e,t)}var wi={newInstance:ht.default.newInstance(Pi,"vtkForwardPass"),extend:Pi},Oi=r(18603),Ii=r(14418);var Ai={fieldAssociation:Ii.ZP.FieldAssociations.FIELD_ASSOCIATION_CELLS,captureZValues:!1};function Ri(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,Ai,r),ht.default.obj(e,t),ht.default.setGet(e,t,["fieldAssociation","captureZValues"]),function(e,t){t.classHierarchy.push("vtkHardwareSelector"),e.getSourceDataAsync=function(){var e=ni(oi().mark((function e(t,r,n,a,o){return oi().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:case"end":return e.stop()}}),e)})));return function(t,r,n,a,o){return e.apply(this,arguments)}}(),e.selectAsync=function(){var t=ni(oi().mark((function t(r,n,a,o,i){var s;return oi().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,e.getSourceDataAsync(r,n,a,o,i);case 2:if(!(s=t.sent)){t.next=5;break}return t.abrupt("return",s.generateSelection(n,a,o,i));case 5:return t.abrupt("return",[]);case 6:case"end":return t.stop()}}),t)})));return function(e,r,n,a,o){return t.apply(this,arguments)}}()}(e,t)}var Ei={newInstance:ht.default.newInstance(Ri,"vtkHardwareSelector"),extend:Ri},Mi={SelectionContent:{GLOBALIDS:0,PEDIGREEIDS:1,VALUES:2,INDICES:3,FRUSTUM:4,LOCATIONS:5,THRESHOLDS:6,BLOCKS:7,QUERY:8},SelectionField:{CELL:0,POINT:1,FIELD:2,VERTEX:3,EDGE:4,ROW:5}};function Di(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}var Vi={contentType:-1,fieldType:-1,properties:null,selectionList:[]};function Li(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,Vi,r),ht.default.obj(e,t),t.properties={},ht.default.setGet(e,t,["contentType","fieldType","properties","selectionList"]),function(e,t){t.classHierarchy.push("vtkSelectionNode"),e.getBounds=function(){return t.points.getBounds()}}(e,t)}var _i=function(e){for(var t=1;te.area[2]||t[1]e.area[3])return null;var o=[t[0]-e.area[0],t[1]-e.area[1]],i=Hi(o[0],o[1],e.pixBuffer[Bi.ACTOR_PASS],e.area);if(i<=0||i-Wi>=e.props.length)return null;var s={valid:!0};s.propID=i-Wi,s.prop=e.props[s.propID];var l=Hi(o[0],o[1],e.pixBuffer[Bi.COMPOSITE_INDEX_PASS],e.area);if((l<0||l>16777215)&&(l=0),s.compositeID=l-Wi,e.captureZValues){var c=4*(o[1]*(e.area[2]-e.area[0]+1)+o[0]);s.zValue=(256*e.zBuffer[c]+e.zBuffer[c+1])/65535,s.displayPosition=t}if(e.pixBuffer[Bi.ID_LOW24]&&0===ji(o[0],o[1],e.pixBuffer[Bi.ID_LOW24],e.area))return s;var u=Hi(o[0],o[1],e.pixBuffer[Bi.ID_LOW24],e.area),d=Hi(o[0],o[1],e.pixBuffer[Bi.ID_HIGH24],e.area);return s.attributeID=Ki(u,d),s}var f=[t[0],t[1]],p=[0,0],g=Zi(e,t,0,n);if(g&&g.valid)return g;for(var m=1;mm?f[1]-m:0;h<=f[1]+m;++h){if(p[1]=h,f[0]>=m&&(p[0]=f[0]-m,(g=Zi(e,p,0,n))&&g.valid))return g;if(p[0]=f[0]+m,(g=Zi(e,p,0,n))&&g.valid)return g}for(var v=f[0]>=m?f[0]-(m-1):0;v<=f[0]+(m-1);++v){if(p[0]=v,f[1]>=m&&(p[1]=f[1]-m,(g=Zi(e,p,0,n))&&g.valid))return g;if(p[1]=f[1]+m,(g=Zi(e,p,0,n))&&g.valid)return g}}return n[0]=t[0],n[1]=t[1],null}function Xi(e,t,r,n,a){var o=[],i=0;return t.forEach((function(t,s){var l=_i.newInstance();switch(l.setContentType(Fi.INDICES),e){case ki.FIELD_ASSOCIATION_CELLS:l.setFieldType(Ui.CELL);break;case ki.FIELD_ASSOCIATION_POINTS:l.setFieldType(Ui.POINT);break;default:Gi("Unknown field association")}l.getProperties().propID=t.info.propID,l.getProperties().prop=t.info.prop,l.getProperties().compositeID=t.info.compositeID,l.getProperties().attributeID=t.info.attributeID,l.getProperties().pixelCount=t.pixelCount,r&&(l.getProperties().displayPosition=[t.info.displayPosition[0],t.info.displayPosition[1],t.info.zValue],l.getProperties().worldPosition=a.displayToWorld(t.info.displayPosition[0],t.info.displayPosition[1],t.info.zValue,n)),l.setSelectionList(t.attributeIDs),o[i]=l,i++})),o}function qi(e,t,r,n,a){for(var o=Math.floor(t),i=Math.floor(r),s=Math.floor(n),l=Math.floor(a),c=new Map,u=[0,0],d=i;d<=l;d++)for(var f=o;f<=s;f++){var p=Zi(e,[f,d],0,u);if(p&&p.valid){var g=zi(p);if(c.has(g)){var m=c.get(g);m.pixelCount++,e.captureZValues&&p.zValue2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,Yi,r),Ei.extend(e,t,r),t.propColorValue=[0,0,0],t.props=[],t.area||(t.area=[0,0,0,0]),ht.default.setGetArray(e,t,["area"],4),ht.default.setGet(e,t,["_renderer","currentPass","_openGLRenderWindow","maximumPointId","maximumCellId"]),ht.default.setGetArray(e,t,["propColorValue"],3),ht.default.moveToProtected(e,t,["renderer","openGLRenderWindow"]),ht.default.event(e,t,"event"),function(e,t){t.classHierarchy.push("vtkOpenGLHardwareSelector"),e.releasePixBuffers=function(){t.rawPixBuffer=[],t.pixBuffer=[],t.zBuffer=null},e.beginSelection=function(){t._openGLRenderer=t._openGLRenderWindow.getViewNodeFor(t._renderer),t.maxAttributeId=0;var r=t._openGLRenderWindow.getSize();if(t.framebuffer){t.framebuffer.setOpenGLRenderWindow(t._openGLRenderWindow),t.framebuffer.saveCurrentBindingsAndBuffers();var n=t.framebuffer.getSize();n[0]!==r[0]||n[1]!==r[1]?(t.framebuffer.create(r[0],r[1]),t.framebuffer.populateFramebuffer()):t.framebuffer.bind()}else t.framebuffer=Dn.newInstance(),t.framebuffer.setOpenGLRenderWindow(t._openGLRenderWindow),t.framebuffer.saveCurrentBindingsAndBuffers(),t.framebuffer.create(r[0],r[1]),t.framebuffer.populateFramebuffer();if(t._openGLRenderer.clear(),t._openGLRenderer.setSelector(e),t.hitProps={},t.propPixels={},t.props=[],e.releasePixBuffers(),t.fieldAssociation===ki.FIELD_ASSOCIATION_POINTS){var a=t._openGLRenderWindow.getContext(),o=a.isEnabled(a.BLEND);a.disable(a.BLEND),t._openGLRenderWindow.traverseAllPasses(),o&&a.enable(a.BLEND)}},e.endSelection=function(){t.hitProps={},t._openGLRenderer.setSelector(null),t.framebuffer.restorePreviousBindingsAndBuffers()},e.preCapturePass=function(){var e=t._openGLRenderWindow.getContext();t.originalBlending=e.isEnabled(e.BLEND),e.disable(e.BLEND)},e.postCapturePass=function(){var e=t._openGLRenderWindow.getContext();t.originalBlending&&e.enable(e.BLEND)},e.select=function(){var r=null;return e.captureBuffers()&&(r=e.generateSelection(t.area[0],t.area[1],t.area[2],t.area[3]),e.releasePixBuffers()),r},e.getSourceDataAsync=function(){var r=ni(oi().mark((function r(n,a,o,i,s){var l,c;return oi().wrap((function(r){for(;;)switch(r.prev=r.next){case 0:if(t._renderer=n,void 0===a?(l=t._openGLRenderWindow.getSize(),e.setArea(0,0,l[0]-1,l[1]-1)):e.setArea(a,o,i,s),e.captureBuffers()){r.next=4;break}return r.abrupt("return",!1);case 4:return(c={area:(0,pa.Z)(t.area),pixBuffer:(0,pa.Z)(t.pixBuffer),captureZValues:t.captureZValues,zBuffer:t.zBuffer,props:(0,pa.Z)(t.props),fieldAssociation:t.fieldAssociation,renderer:n,openGLRenderWindow:t._openGLRenderWindow}).generateSelection=function(){for(var e=arguments.length,t=new Array(e),r=0;r16777215;if(t.fieldAssociation===ki.FIELD_ASSOCIATION_CELLS)return t.maximumCellId>16777215}return!0},e.savePixelBuffer=function(r){if(t.pixBuffer[r]=t._openGLRenderWindow.getPixelData(t.area[0],t.area[1],t.area[2],t.area[3]),!t.rawPixBuffer[r]){var n=(t.area[2]-t.area[0]+1)*(t.area[3]-t.area[1]+1)*4;t.rawPixBuffer[r]=new Uint8Array(n),t.rawPixBuffer[r].set(t.pixBuffer[r])}if(r===Bi.ACTOR_PASS){if(t.captureZValues){var a=t._openGLRenderWindow.getRenderPasses();if("function"==typeof a[0].requestDepth&&"function"==typeof a[0].getFramebuffer){var o=a[0].getFramebuffer();o.saveCurrentBindingsAndBuffers(),o.bind(),t.zBuffer=t._openGLRenderWindow.getPixelData(t.area[0],t.area[1],t.area[2],t.area[3]),o.restorePreviousBindingsAndBuffers()}}e.buildPropHitList(t.rawPixBuffer[r])}},e.buildPropHitList=function(e){for(var r=0,n=0;n<=t.area[3]-t.area[1];n++)for(var a=0;a<=t.area[2]-t.area[0];a++){var o=Hi(a,n,e,t.area);o>0&&(--o in t.hitProps||(t.hitProps[o]=!0,t.propPixels[o]=[]),t.propPixels[o].push(4*r)),++r}},e.renderProp=function(r){t.currentPass===Bi.ACTOR_PASS&&(e.setPropColorValueFromInt(t.props.length+Wi),t.props.push(r))},e.renderCompositeIndex=function(r){t.currentPass===Bi.COMPOSITE_INDEX_PASS&&e.setPropColorValueFromInt(r+Wi)},e.renderAttributeId=function(e){e<0||(t.maxAttributeId=e>t.maxAttributeId?e:t.maxAttributeId)},e.passTypeToString=function(e){return ht.default.enumToString(Bi,e)},e.isPropHit=function(e){return Boolean(t.hitProps[e])},e.setPropColorValueFromInt=function(e){t.propColorValue[0]=e%256/255,t.propColorValue[1]=Math.floor(e/256)%256/255,t.propColorValue[2]=Math.floor(e/65536)%256/255},e.getPixelInformation=function(r,n,a){var o=n<0?0:n;if(0===o){if(a[0]=r[0],a[1]=r[1],r[0]t.area[2]||r[1]t.area[3])return null;var i=[r[0]-t.area[0],r[1]-t.area[1]],s=Hi(i[0],i[1],t.pixBuffer[Bi.ACTOR_PASS],t.area);if(s<=0||s-Wi>=t.props.length)return null;var l={valid:!0};l.propID=s-Wi,l.prop=t.props[l.propID];var c=Hi(i[0],i[1],t.pixBuffer[Bi.COMPOSITE_INDEX_PASS],t.area);if((c<0||c>16777215)&&(c=0),l.compositeID=c-Wi,t.captureZValues){var u=4*(i[1]*(t.area[2]-t.area[0]+1)+i[0]);l.zValue=(256*t.zBuffer[u]+t.zBuffer[u+1])/65535,l.displayPosition=r}if(t.pixBuffer[Bi.ID_LOW24]&&0===ji(i[0],i[1],t.pixBuffer[Bi.ID_LOW24],t.area))return l;var d=Hi(i[0],i[1],t.pixBuffer[Bi.ID_LOW24],t.area),f=Hi(i[0],i[1],t.pixBuffer[Bi.ID_HIGH24],t.area);return l.attributeID=Ki(d,f),l}var p=[r[0],r[1]],g=[0,0],m=e.getPixelInformation(r,0,a);if(m&&m.valid)return m;for(var h=1;hh?p[1]-h:0;v<=p[1]+h;++v){if(g[1]=v,p[0]>=h&&(g[0]=p[0]-h,(m=e.getPixelInformation(g,0,a))&&m.valid))return m;if(g[0]=p[0]+h,(m=e.getPixelInformation(g,0,a))&&m.valid)return m}for(var y=p[0]>=h?p[0]-(h-1):0;y<=p[0]+(h-1);++y){if(g[0]=y,p[1]>=h&&(g[1]=p[1]-h,(m=e.getPixelInformation(g,0,a))&&m.valid))return m;if(g[1]=p[1]+h,(m=e.getPixelInformation(g,0,a))&&m.valid)return m}}return a[0]=r[0],a[1]=r[1],null},e.generateSelection=function(r,n,a,o){for(var i=Math.floor(r),s=Math.floor(n),l=Math.floor(a),c=Math.floor(o),u=new Map,d=[0,0],f=s;f<=c;f++)for(var p=i;p<=l;p++){var g=[p,f],m=e.getPixelInformation(g,0,d);if(m&&m.valid){var h=zi(m);if(u.has(h)){var v=u.get(h);v.pixelCount++,t.captureZValues&&m.zValue2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,rs,r),t.shaderPrograms={},ht.default.obj(e,t),ht.default.setGet(e,t,ts),ht.default.moveToProtected(e,t,["openGLRenderWindow"]),function(e,t){t.classHierarchy.push("vtkShaderCache"),e.replaceShaderValues=function(e,r,n){var a=r;n.length>0&&(a=Sr.substitute(a,"VSOut","GSOut").result);var o=t._openGLRenderWindow.getWebgl2(),i="\n",s="#version 100\n";o?s="#version 300 es\n#define attribute in\n#define textureCube texture\n#define texture2D texture\n#define textureCubeLod textureLod\n#define texture2DLod textureLod\n":(t.context.getExtension("OES_standard_derivatives"),t.context.getExtension("EXT_frag_depth")&&(i="#extension GL_EXT_frag_depth : enable\n"),t.context.getExtension("EXT_shader_texture_lod")&&(i+="#extension GL_EXT_shader_texture_lod : enable\n#define textureCubeLod textureCubeLodEXT\n#define texture2DLod texture2DLodEXT")),a=Sr.substitute(a,"//VTK::System::Dec",["".concat(s,"\n"),o?"":"#extension GL_OES_standard_derivatives : enable\n",i,"#ifdef GL_FRAGMENT_PRECISION_HIGH","precision highp float;","precision highp int;","#else","precision mediump float;","precision mediump int;","#endif"]).result;var l=Sr.substitute(e,"//VTK::System::Dec",["".concat(s,"\n"),"#ifdef GL_FRAGMENT_PRECISION_HIGH","precision highp float;","precision highp int;","#else","precision mediump float;","precision mediump int;","#endif"]).result;if(o){l=Sr.substitute(l,"varying","out").result,a=Sr.substitute(a,"varying","in").result;for(var c="",u=0;a.includes("gl_FragData[".concat(u,"]"));)a=Sr.substitute(a,"gl_FragData\\[".concat(u,"\\]"),"fragOutput".concat(u)).result,c+="layout(location = ".concat(u,") out vec4 fragOutput").concat(u,";\n"),u++;a=Sr.substitute(a,"//VTK::Output::Dec",c).result}return{VSSource:l,FSSource:a,GSSource:Sr.substitute(n,"//VTK::System::Dec",s).result}},e.readyShaderProgramArray=function(t,r,n){var a=e.replaceShaderValues(t,r,n),o=e.getShaderProgram(a.VSSource,a.FSSource,a.GSSource);return e.readyShaderProgram(o)},e.readyShaderProgram=function(t){return t&&(t.getCompiled()||t.compileShader())&&e.bindShader(t)?t:null},e.getShaderProgram=function(e,r,n){var a="".concat(e).concat(r).concat(n),o=es().hash(a);if(!(o in t.shaderPrograms)){var i=Sr.newInstance();return i.setContext(t.context),i.getVertexShader().setSource(e),i.getFragmentShader().setSource(r),n&&i.getGeometryShader().setSource(n),i.setMd5Hash(o),t.shaderPrograms[o]=i,i}return t.shaderPrograms[o]},e.releaseGraphicsResources=function(r){e.releaseCurrentShader(),Object.keys(t.shaderPrograms).map((function(e){return t.shaderPrograms[e]})).forEach((function(e){return e.releaseGraphicsResources(r)}))},e.releaseGraphicsResources=function(){t.astShaderBound&&(t.lastShaderBound.release(),t.lastShaderBound=null)},e.bindShader=function(e){return t.lastShaderBound===e||(t.lastShaderBound&&t.lastShaderBound.release(),e.bind(),t.lastShaderBound=e),1}}(e,t)}var as={newInstance:ht.default.newInstance(ns,"vtkShaderCache"),extend:ns},os=ht.default.vtkErrorMacro;var is={context:null,numberOfTextureUnits:0,textureUnits:0};function ss(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,is,r),ht.default.obj(e,t),t.textureUnits=[],ht.default.get(e,t,["numberOfTextureUnits"]),ht.default.setGet(e,t,["context"]),function(e,t){t.classHierarchy.push("vtkOpenGLTextureUnitManager"),e.deleteTable=function(){for(var e=0;e2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,cs,r),t.size||(t.size=[300,300]),ht.default.getArray(e,t,["size"],2),ht.default.get(e,t,["selector"]),Tt.extend(e,t,r),function(e,t){t.classHierarchy.push("vtkRenderWindowViewNode"),e.getViewNodeFactory=function(){return null},e.getAspectRatio=function(){return t.size[0]/t.size[1]},e.getAspectRatioForRenderer=function(e){var r=e.getViewportByReference();return t.size[0]*(r[2]-r[0])/((r[3]-r[1])*t.size[1])},e.isInViewport=function(t,r,n){var a=n.getViewportByReference(),o=e.getFramebufferSize();return a[0]*o[0]<=t&&a[2]*o[0]>=t&&a[1]*o[1]<=r&&a[3]*o[1]>=r},e.getViewportSize=function(t){var r=t.getViewportByReference(),n=e.getFramebufferSize();return[(r[2]-r[0])*n[0],(r[3]-r[1])*n[1]]},e.getViewportCenter=function(t){var r=e.getViewportSize(t);return[.5*r[0],.5*r[1]]},e.displayToNormalizedDisplay=function(t,r,n){var a=e.getFramebufferSize();return[t/a[0],r/a[1],n]},e.normalizedDisplayToDisplay=function(t,r,n){var a=e.getFramebufferSize();return[t*a[0],r*a[1],n]},e.worldToView=function(e,t,r,n){return n.worldToView(e,t,r)},e.viewToWorld=function(e,t,r,n){return n.viewToWorld(e,t,r)},e.worldToDisplay=function(t,r,n,a){var o=a.worldToView(t,r,n),i=e.getViewportSize(a),s=a.viewToProjection(o[0],o[1],o[2],i[0]/i[1]),l=a.projectionToNormalizedDisplay(s[0],s[1],s[2]);return e.normalizedDisplayToDisplay(l[0],l[1],l[2])},e.displayToWorld=function(t,r,n,a){var o=e.displayToNormalizedDisplay(t,r,n),i=a.normalizedDisplayToProjection(o[0],o[1],o[2]),s=e.getViewportSize(a),l=a.projectionToView(i[0],i[1],i[2],s[0]/s[1]);return a.viewToWorld(l[0],l[1],l[2])},e.normalizedDisplayToViewport=function(t,r,n,a){var o=a.getViewportByReference();o=e.normalizedDisplayToDisplay(o[0],o[1],0);var i=e.normalizedDisplayToDisplay(t,r,n);return[i[0]-o[0]-.5,i[1]-o[1]-.5,n]},e.viewportToNormalizedViewport=function(t,r,n,a){var o=e.getViewportSize(a);return o&&0!==o[0]&&0!==o[1]?[t/(o[0]-1),r/(o[1]-1),n]:[t,r,n]},e.normalizedViewportToViewport=function(t,r,n,a){var o=e.getViewportSize(a);return[t*(o[0]-1),r*(o[1]-1),n]},e.displayToLocalDisplay=function(t,r,n){return[t,e.getFramebufferSize()[1]-r-1,n]},e.viewportToNormalizedDisplay=function(t,r,n,a){var o=a.getViewportByReference(),i=t+(o=e.normalizedDisplayToDisplay(o[0],o[1],0))[0]+.5,s=r+o[1]+.5;return e.displayToNormalizedDisplay(i,s,n)},e.getComputedDevicePixelRatio=function(){return t.size[0]/e.getContainerSize()[0]},e.getContainerSize=function(){ht.default.vtkErrorMacro("not implemented")},e.getPixelData=function(e,t,r,n){ht.default.vtkErrorMacro("not implemented")},e.createSelector=function(){ht.default.vtkErrorMacro("not implemented")}}(e,t)}var ds={newInstance:ht.default.newInstance(us,"vtkRenderWindowViewNode"),extend:us},fs={HmdVR:0,MobileAR:1,LookingGlassVR:2},ps="__getUnderlyingContext";function gs(){var e=new Map,t={apply:function(t,r,n){return e.has(n[0])?e.get(n[0]):t.apply(r,n)}};var r=Object.create(null);return r.getParameter=function(e,r,n,a){return new Proxy(a.bind(e),t)},r.depthMask=function(t,r,n,a){return new Proxy(a.bind(t),(o=t.DEPTH_WRITEMASK,{apply:function(t,r,n){return e.set(o,n[0]),t.apply(r,n)}}));var o},{get:function(e,t,n){if(t===ps)return function(){return e};var a=Reflect.get(e,t,e);a instanceof Function&&(a=a.bind(e));var o=r[t];return o?o(e,t,n,a):a}}}var ms=ht.default.vtkDebugMacro,hs=ht.default.vtkErrorMacro,vs=fs,ys={position:"absolute",top:0,left:0,width:"100%",height:"100%"},bs={vr:{rescaleFactor:1,translateZ:-.7},ar:{rescaleFactor:.25,translateZ:-.5}};function Ts(e,t,r){var n=e.createFramebuffer(),a=e.createTexture();e.bindTexture(e.TEXTURE_2D,a),e.texImage2D(e.TEXTURE_2D,0,t,2,2,0,t,r,null),e.bindFramebuffer(e.FRAMEBUFFER,n),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,a,0);var o=e.checkFramebufferStatus(e.FRAMEBUFFER);return e.bindFramebuffer(e.FRAMEBUFFER,null),e.bindTexture(e.TEXTURE_2D,null),o===e.FRAMEBUFFER_COMPLETE}var Cs=0,xs=[];function Ss(){Cs--,xs.forEach((function(e){return e(Cs)}))}function Ps(e){e.preventDefault()}function ws(e,t){t.classHierarchy.push("vtkOpenGLRenderWindow");var n=gs();e.getViewNodeFactory=function(){return t.myFactory},t.canvas.addEventListener("webglcontextlost",Ps,!1),t.canvas.addEventListener("webglcontextrestored",e.restoreContext,!1);var a,o=void 0!==navigator.xr&&navigator.xr.isSessionSupported("immersive-vr"),i=[0,0];e.onModified((function(){t.renderable&&(t.size[0]===i[0]&&t.size[1]===i[1]||(i[0]=t.size[0],i[1]=t.size[1],t.canvas.setAttribute("width",t.size[0]),t.canvas.setAttribute("height",t.size[1]))),t.viewStream&&t.viewStream.setSize(t.size[0],t.size[1]),t.canvas.style.display=t.useOffScreen?"none":"block",t.el&&(t.el.style.cursor=t.cursorVisibility?t.cursor:"none"),t.containerSize=null})),e.buildPass=function(r){if(r){if(!t.renderable)return;e.prepareNodes(),e.addMissingNodes(t.renderable.getRenderersByReference()),e.removeUnusedNodes(),e.initialize(),t.children.forEach((function(t){t.setOpenGLRenderWindow(e)}))}},e.initialize=function(){if(!t.initialized){t.context=e.get3DContext(),t.textureUnitManager=ls.newInstance(),t.textureUnitManager.setContext(t.context),t.shaderCache.setContext(t.context);var r=t.context;r.blendFuncSeparate(r.SRC_ALPHA,r.ONE_MINUS_SRC_ALPHA,r.ONE,r.ONE_MINUS_SRC_ALPHA),r.depthFunc(r.LEQUAL),r.enable(r.BLEND),t.initialized=!0}},e.makeCurrent=function(){t.context.makeCurrent()},e.setContainer=function(r){t.el&&t.el!==r&&(t.canvas.parentNode!==t.el&&hs("Error: canvas parent node does not match container"),t.el.removeChild(t.canvas),t.el.contains(t.bgImage)&&t.el.removeChild(t.bgImage)),t.el!==r&&(t.el=r,t.el&&(t.el.appendChild(t.canvas),t.useBackgroundImage&&t.el.appendChild(t.bgImage)),e.modified())},e.getContainer=function(){return t.el},e.getContainerSize=function(){if(!t.containerSize&&t.el){var e=t.el.getBoundingClientRect(),r=e.width,n=e.height;t.containerSize=[r,n]}return t.containerSize||t.size},e.getFramebufferSize=function(){return t.activeFramebuffer?t.activeFramebuffer.getSize():t.size},e.getPixelData=function(e,r,n,a){var o=new Uint8Array((n-e+1)*(a-r+1)*4);return t.context.readPixels(e,r,n-e+1,a-r+1,t.context.RGBA,t.context.UNSIGNED_BYTE,o),o},e.get3DContext=function(){var r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{preserveDrawingBuffer:!1,depth:!0,alpha:!0,powerPreference:"high-performance"},a=null;o&&e.invokeHaveVRDisplay();var i="undefined"!=typeof WebGL2RenderingContext;return t.webgl2=!1,t.defaultToWebgl2&&i&&(a=t.canvas.getContext("webgl2",r))&&(t.webgl2=!0,ms("using webgl2")),a||(ms("using webgl1"),a=t.canvas.getContext("webgl",r)||t.canvas.getContext("experimental-webgl",r)),new Proxy(a,n)},e.startXR=function(r){if(void 0===navigator.xr)throw new Error("WebXR is not available");t.xrSessionType=void 0!==r?r:vs.HmdVR;var n=r===vs.MobileAR,a=n?"immersive-ar":"immersive-vr";if(!navigator.xr.isSessionSupported(a))throw n?new Error("Device does not support AR session"):new Error("VR display is not available");if(null!==t.xrSession)throw new Error("XR Session already exists!");navigator.xr.requestSession(a).then(e.enterXR,(function(){throw new Error("Failed to create XR session!")}))},e.enterXR=function(){var n=ni(oi().mark((function n(a){var o,i;return oi().wrap((function(n){for(;;)switch(n.prev=n.next){case 0:if(t.xrSession=a,t.oldCanvasSize=t.size.slice(),null===t.xrSession){n.next=15;break}return o=e.get3DContext(),n.next=6,o.makeXRCompatible();case 6:i=new r.g.XRWebGLLayer(t.xrSession,o[ps]()),e.setSize(i.framebufferWidth,i.framebufferHeight),t.xrSession.updateRenderState({baseLayer:i}),t.xrSession.requestReferenceSpace("local").then((function(e){t.xrReferenceSpace=e})),e.resetXRScene(),t.renderable.getInteractor().switchToXRAnimation(),t.xrSceneFrame=t.xrSession.requestAnimationFrame(e.xrRender),n.next=16;break;case 15:throw new Error("Failed to enter VR with a null xrSession.");case 16:case"end":return n.stop()}}),n)})));return function(e){return n.apply(this,arguments)}}(),e.resetXRScene=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:bs.vr.rescaleFactor,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:bs.vr.translateZ,n=t.xrSessionType===vs.MobileAR;n&&e===bs.vr.rescaleFactor&&(e=bs.ar.rescaleFactor),n&&r===bs.vr.translateZ&&(r=bs.ar.translateZ);var a=t.renderable.getRenderers()[0];a.resetCamera();var o=a.getActiveCamera(),i=o.getPhysicalScale(),s=o.getPhysicalTranslation();r*=i/=e,s[2]+=r,o.setPhysicalScale(i),o.setPhysicalTranslation(s),o.setClippingRange(.1*i,100*i)},e.stopXR=ni(oi().mark((function r(){var n,a;return oi().wrap((function(r){for(;;)switch(r.prev=r.next){case 0:if(void 0!==navigator.xr){r.next=2;break}return r.abrupt("return");case 2:if(null===t.xrSession){r.next=10;break}return t.xrSession.cancelAnimationFrame(t.xrSceneFrame),t.renderable.getInteractor().returnFromXRAnimation(),(n=e.get3DContext()).bindFramebuffer(n.FRAMEBUFFER,null),r.next=9,t.xrSession.end().catch((function(e){if(!(e instanceof DOMException))throw e}));case 9:t.xrSession=null;case 10:void 0!==t.oldCanvasSize&&e.setSize.apply(e,(0,pa.Z)(t.oldCanvasSize)),(a=t.renderable.getRenderers()[0]).getActiveCamera().setProjectionMatrix(null),a.resetCamera(),a.setViewport(0,0,1,1),e.traverseAllPasses();case 16:case"end":return r.stop()}}),r)}))),e.xrRender=function(){var r=ni(oi().mark((function r(n,a){var o,i,s,l,c;return oi().wrap((function(r){for(;;)switch(r.prev=r.next){case 0:o=a.session,t.renderable.getInteractor().updateXRGamepads(o,a,t.xrReferenceSpace),t.xrSceneFrame=t.xrSession.requestAnimationFrame(e.xrRender),(i=a.getViewerPose(t.xrReferenceSpace))&&(s=e.get3DContext(),t.xrSessionType===vs.MobileAR&&void 0!==t.oldCanvasSize&&(s.canvas.width=t.oldCanvasSize[0],s.canvas.height=t.oldCanvasSize[1]),l=o.renderState.baseLayer,s.bindFramebuffer(s.FRAMEBUFFER,l.framebuffer),s.clear(s.COLOR_BUFFER_BIT),s.clear(s.DEPTH_BUFFER_BIT),e.setSize(l.framebufferWidth,l.framebufferHeight),c=t.renderable.getRenderers()[0],i.views.forEach((function(r,n){var a=l.getViewport(r);if(t.xrSessionType===vs.HmdVR)if("left"===r.eye)c.setViewport(0,0,.5,1);else{if("right"!==r.eye)return;c.setViewport(.5,0,1,1)}else if(t.xrSessionType===vs.LookingGlassVR){var o=a.x/l.framebufferWidth,i=a.y/l.framebufferHeight,s=(a.x+a.width)/l.framebufferWidth,u=(a.y+a.height)/l.framebufferHeight;c.setViewport(o,i,s,u)}else c.setViewport(0,0,1,1);c.getActiveCamera().computeViewParametersFromPhysicalMatrix(r.transform.inverse.matrix),c.getActiveCamera().setProjectionMatrix(r.projectionMatrix),e.traverseAllPasses()})),s.scissor(0,0,l.framebufferWidth,l.framebufferHeight),s.disable(s.SCISSOR_TEST));case 5:case"end":return r.stop()}}),r)})));return function(e,t){return r.apply(this,arguments)}}(),e.restoreContext=function(){var t=mi.newInstance();t.setCurrentOperation("Release"),t.traverse(e,null)},e.activateTexture=function(r){var n=t._textureResourceIds.get(r);if(void 0===n){var a=e.getTextureUnitManager().allocate();a<0?hs("Hardware does not support the number of textures defined."):(t._textureResourceIds.set(r,a),t.context.activeTexture(t.context.TEXTURE0+a))}else t.context.activeTexture(t.context.TEXTURE0+n)},e.deactivateTexture=function(r){var n=t._textureResourceIds.get(r);void 0!==n&&(e.getTextureUnitManager().free(n),t._textureResourceIds.delete(r))},e.getTextureUnitForTexture=function(e){var r=t._textureResourceIds.get(e);return void 0!==r?r:-1},e.getDefaultTextureInternalFormat=function(e,r){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,a=arguments.length>3&&void 0!==arguments[3]&&arguments[3];if(t.webgl2)switch(e){case nn.Tu.UNSIGNED_CHAR:switch(r){case 1:return t.context.R8;case 2:return t.context.RG8;case 3:return t.context.RGB8;default:return t.context.RGBA8}case n&&!a&&nn.Tu.UNSIGNED_SHORT:switch(r){case 1:return n.R16_EXT;case 2:return n.RG16_EXT;case 3:return n.RGB16_EXT;default:return n.RGBA16_EXT}case n&&!a&&nn.Tu.SHORT:switch(r){case 1:return n.R16_SNORM_EXT;case 2:return n.RG16_SNORM_EXT;case 3:return n.RGB16_SNORM_EXT;default:return n.RGBA16_SNORM_EXT}case nn.Tu.FLOAT:default:switch(r){case 1:return t.context.R16F;case 2:return t.context.RG16F;case 3:return t.context.RGB16F;default:return t.context.RGBA16F}}switch(r){case 1:return t.context.LUMINANCE;case 2:return t.context.LUMINANCE_ALPHA;case 3:return t.context.RGB;default:return t.context.RGBA}},e.setBackgroundImage=function(e){t.bgImage.src=e.src},e.setUseBackgroundImage=function(e){t.useBackgroundImage=e,t.useBackgroundImage&&!t.el.contains(t.bgImage)?t.el.appendChild(t.bgImage):!t.useBackgroundImage&&t.el.contains(t.bgImage)&&t.el.removeChild(t.bgImage)},e.captureNextImage=function(){var r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"image/png",n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},a=n.resetCamera,o=void 0!==a&&a,i=n.size,s=void 0===i?null:i,l=n.scale,c=void 0===l?1:l;if(t.deleted)return null;t.imageFormat=r;var u=t.notifyStartCaptureImage;return t.notifyStartCaptureImage=!0,t._screenshot={size:s||1!==c?s||t.size.map((function(e){return e*c})):null},new Promise((function(r,n){var a=e.onImageReady((function(n){if(null===t._screenshot.size)t.notifyStartCaptureImage=u,a.unsubscribe(),t._screenshot.placeHolder&&(t.size=t._screenshot.originalSize,e.modified(),t._screenshot.cameras&&t._screenshot.cameras.forEach((function(e){return(0,e.restoreParamsFn)(e.arg)})),e.traverseAllPasses(),t.el.removeChild(t._screenshot.placeHolder),t._screenshot.placeHolder.remove(),t._screenshot=null),r(n);else{var i=document.createElement("img");if(i.style=ys,i.src=n,t._screenshot.placeHolder=t.el.appendChild(i),t.canvas.style.display="none",t._screenshot.originalSize=t.size,t.size=t._screenshot.size,t._screenshot.size=null,e.modified(),o){var s=!0!==o;t._screenshot.cameras=t.renderable.getRenderers().map((function(e){var t=e.getActiveCamera(),r=t.get("focalPoint","position","parallelScale");return{resetCameraArgs:s?{renderer:e}:void 0,resetCameraFn:s?o:e.resetCamera,restoreParamsFn:t.set,arg:JSON.parse(JSON.stringify(r))}})),t._screenshot.cameras.forEach((function(e){return(0,e.resetCameraFn)(e.resetCameraArgs)}))}e.traverseAllPasses()}}))}))},e.getHardwareMaximumLineWidth=function(){if(null!=a)return a;var t=e.get3DContext(),r=t.getParameter(t.ALIASED_LINE_WIDTH_RANGE);return a=r[1],r[1]},e.getGLInformations=function(){for(var r=e.get3DContext(),n=r.getExtension("OES_texture_float"),a=r.getExtension("OES_texture_half_float"),o=r.getExtension("WEBGL_debug_renderer_info"),i=r.getExtension("WEBGL_draw_buffers"),s=r.getExtension("EXT_texture_filter_anisotropic")||r.getExtension("WEBKIT_EXT_texture_filter_anisotropic"),l=[["Max Vertex Attributes","MAX_VERTEX_ATTRIBS",r.getParameter(r.MAX_VERTEX_ATTRIBS)],["Max Varying Vectors","MAX_VARYING_VECTORS",r.getParameter(r.MAX_VARYING_VECTORS)],["Max Vertex Uniform Vectors","MAX_VERTEX_UNIFORM_VECTORS",r.getParameter(r.MAX_VERTEX_UNIFORM_VECTORS)],["Max Fragment Uniform Vectors","MAX_FRAGMENT_UNIFORM_VECTORS",r.getParameter(r.MAX_FRAGMENT_UNIFORM_VECTORS)],["Max Fragment Texture Image Units","MAX_TEXTURE_IMAGE_UNITS",r.getParameter(r.MAX_TEXTURE_IMAGE_UNITS)],["Max Vertex Texture Image Units","MAX_VERTEX_TEXTURE_IMAGE_UNITS",r.getParameter(r.MAX_VERTEX_TEXTURE_IMAGE_UNITS)],["Max Combined Texture Image Units","MAX_COMBINED_TEXTURE_IMAGE_UNITS",r.getParameter(r.MAX_COMBINED_TEXTURE_IMAGE_UNITS)],["Max 2D Texture Size","MAX_TEXTURE_SIZE",r.getParameter(r.MAX_TEXTURE_SIZE)],["Max Cube Texture Size","MAX_CUBE_MAP_TEXTURE_SIZE",r.getParameter(r.MAX_CUBE_MAP_TEXTURE_SIZE)],["Max Texture Anisotropy","MAX_TEXTURE_MAX_ANISOTROPY_EXT",s&&r.getParameter(s.MAX_TEXTURE_MAX_ANISOTROPY_EXT)],["Point Size Range","ALIASED_POINT_SIZE_RANGE",r.getParameter(r.ALIASED_POINT_SIZE_RANGE).join(" - ")],["Line Width Range","ALIASED_LINE_WIDTH_RANGE",r.getParameter(r.ALIASED_LINE_WIDTH_RANGE).join(" - ")],["Max Viewport Dimensions","MAX_VIEWPORT_DIMS",r.getParameter(r.MAX_VIEWPORT_DIMS).join(" - ")],["Max Renderbuffer Size","MAX_RENDERBUFFER_SIZE",r.getParameter(r.MAX_RENDERBUFFER_SIZE)],["Framebuffer Red Bits","RED_BITS",r.getParameter(r.RED_BITS)],["Framebuffer Green Bits","GREEN_BITS",r.getParameter(r.GREEN_BITS)],["Framebuffer Blue Bits","BLUE_BITS",r.getParameter(r.BLUE_BITS)],["Framebuffer Alpha Bits","ALPHA_BITS",r.getParameter(r.ALPHA_BITS)],["Framebuffer Depth Bits","DEPTH_BITS",r.getParameter(r.DEPTH_BITS)],["Framebuffer Stencil Bits","STENCIL_BITS",r.getParameter(r.STENCIL_BITS)],["Framebuffer Subpixel Bits","SUBPIXEL_BITS",r.getParameter(r.SUBPIXEL_BITS)],["MSAA Samples","SAMPLES",r.getParameter(r.SAMPLES)],["MSAA Sample Buffers","SAMPLE_BUFFERS",r.getParameter(r.SAMPLE_BUFFERS)],["Supported Formats for UByte Render Targets ","UNSIGNED_BYTE RENDER TARGET FORMATS",[n&&Ts(r,r.RGBA,r.UNSIGNED_BYTE)?"RGBA":"",n&&Ts(r,r.RGB,r.UNSIGNED_BYTE)?"RGB":"",n&&Ts(r,r.LUMINANCE,r.UNSIGNED_BYTE)?"LUMINANCE":"",n&&Ts(r,r.ALPHA,r.UNSIGNED_BYTE)?"ALPHA":"",n&&Ts(r,r.LUMINANCE_ALPHA,r.UNSIGNED_BYTE)?"LUMINANCE_ALPHA":""].join(" ")],["Supported Formats for Half Float Render Targets","HALF FLOAT RENDER TARGET FORMATS",[a&&Ts(r,r.RGBA,a.HALF_FLOAT_OES)?"RGBA":"",a&&Ts(r,r.RGB,a.HALF_FLOAT_OES)?"RGB":"",a&&Ts(r,r.LUMINANCE,a.HALF_FLOAT_OES)?"LUMINANCE":"",a&&Ts(r,r.ALPHA,a.HALF_FLOAT_OES)?"ALPHA":"",a&&Ts(r,r.LUMINANCE_ALPHA,a.HALF_FLOAT_OES)?"LUMINANCE_ALPHA":""].join(" ")],["Supported Formats for Full Float Render Targets","FLOAT RENDER TARGET FORMATS",[n&&Ts(r,r.RGBA,r.FLOAT)?"RGBA":"",n&&Ts(r,r.RGB,r.FLOAT)?"RGB":"",n&&Ts(r,r.LUMINANCE,r.FLOAT)?"LUMINANCE":"",n&&Ts(r,r.ALPHA,r.FLOAT)?"ALPHA":"",n&&Ts(r,r.LUMINANCE_ALPHA,r.FLOAT)?"LUMINANCE_ALPHA":""].join(" ")],["Max Multiple Render Targets Buffers","MAX_DRAW_BUFFERS_WEBGL",i?r.getParameter(i.MAX_DRAW_BUFFERS_WEBGL):0],["High Float Precision in Vertex Shader","HIGH_FLOAT VERTEX_SHADER",[r.getShaderPrecisionFormat(r.VERTEX_SHADER,r.HIGH_FLOAT).precision," (-2",r.getShaderPrecisionFormat(r.VERTEX_SHADER,r.HIGH_FLOAT).rangeMin," - 2",r.getShaderPrecisionFormat(r.VERTEX_SHADER,r.HIGH_FLOAT).rangeMax,")"].join("")],["Medium Float Precision in Vertex Shader","MEDIUM_FLOAT VERTEX_SHADER",[r.getShaderPrecisionFormat(r.VERTEX_SHADER,r.MEDIUM_FLOAT).precision," (-2",r.getShaderPrecisionFormat(r.VERTEX_SHADER,r.MEDIUM_FLOAT).rangeMin," - 2",r.getShaderPrecisionFormat(r.VERTEX_SHADER,r.MEDIUM_FLOAT).rangeMax,")"].join("")],["Low Float Precision in Vertex Shader","LOW_FLOAT VERTEX_SHADER",[r.getShaderPrecisionFormat(r.VERTEX_SHADER,r.LOW_FLOAT).precision," (-2",r.getShaderPrecisionFormat(r.VERTEX_SHADER,r.LOW_FLOAT).rangeMin," - 2",r.getShaderPrecisionFormat(r.VERTEX_SHADER,r.LOW_FLOAT).rangeMax,")"].join("")],["High Float Precision in Fragment Shader","HIGH_FLOAT FRAGMENT_SHADER",[r.getShaderPrecisionFormat(r.FRAGMENT_SHADER,r.HIGH_FLOAT).precision," (-2",r.getShaderPrecisionFormat(r.FRAGMENT_SHADER,r.HIGH_FLOAT).rangeMin," - 2",r.getShaderPrecisionFormat(r.FRAGMENT_SHADER,r.HIGH_FLOAT).rangeMax,")"].join("")],["Medium Float Precision in Fragment Shader","MEDIUM_FLOAT FRAGMENT_SHADER",[r.getShaderPrecisionFormat(r.FRAGMENT_SHADER,r.MEDIUM_FLOAT).precision," (-2",r.getShaderPrecisionFormat(r.FRAGMENT_SHADER,r.MEDIUM_FLOAT).rangeMin," - 2",r.getShaderPrecisionFormat(r.FRAGMENT_SHADER,r.MEDIUM_FLOAT).rangeMax,")"].join("")],["Low Float Precision in Fragment Shader","LOW_FLOAT FRAGMENT_SHADER",[r.getShaderPrecisionFormat(r.FRAGMENT_SHADER,r.LOW_FLOAT).precision," (-2",r.getShaderPrecisionFormat(r.FRAGMENT_SHADER,r.LOW_FLOAT).rangeMin," - 2",r.getShaderPrecisionFormat(r.FRAGMENT_SHADER,r.LOW_FLOAT).rangeMax,")"].join("")],["High Int Precision in Vertex Shader","HIGH_INT VERTEX_SHADER",[r.getShaderPrecisionFormat(r.VERTEX_SHADER,r.HIGH_INT).precision," (-2",r.getShaderPrecisionFormat(r.VERTEX_SHADER,r.HIGH_INT).rangeMin," - 2",r.getShaderPrecisionFormat(r.VERTEX_SHADER,r.HIGH_INT).rangeMax,")"].join("")],["Medium Int Precision in Vertex Shader","MEDIUM_INT VERTEX_SHADER",[r.getShaderPrecisionFormat(r.VERTEX_SHADER,r.MEDIUM_INT).precision," (-2",r.getShaderPrecisionFormat(r.VERTEX_SHADER,r.MEDIUM_INT).rangeMin," - 2",r.getShaderPrecisionFormat(r.VERTEX_SHADER,r.MEDIUM_INT).rangeMax,")"].join("")],["Low Int Precision in Vertex Shader","LOW_INT VERTEX_SHADER",[r.getShaderPrecisionFormat(r.VERTEX_SHADER,r.LOW_INT).precision," (-2",r.getShaderPrecisionFormat(r.VERTEX_SHADER,r.LOW_INT).rangeMin," - 2",r.getShaderPrecisionFormat(r.VERTEX_SHADER,r.LOW_INT).rangeMax,")"].join("")],["High Int Precision in Fragment Shader","HIGH_INT FRAGMENT_SHADER",[r.getShaderPrecisionFormat(r.FRAGMENT_SHADER,r.HIGH_INT).precision," (-2",r.getShaderPrecisionFormat(r.FRAGMENT_SHADER,r.HIGH_INT).rangeMin," - 2",r.getShaderPrecisionFormat(r.FRAGMENT_SHADER,r.HIGH_INT).rangeMax,")"].join("")],["Medium Int Precision in Fragment Shader","MEDIUM_INT FRAGMENT_SHADER",[r.getShaderPrecisionFormat(r.FRAGMENT_SHADER,r.MEDIUM_INT).precision," (-2",r.getShaderPrecisionFormat(r.FRAGMENT_SHADER,r.MEDIUM_INT).rangeMin," - 2",r.getShaderPrecisionFormat(r.FRAGMENT_SHADER,r.MEDIUM_INT).rangeMax,")"].join("")],["Low Int Precision in Fragment Shader","LOW_INT FRAGMENT_SHADER",[r.getShaderPrecisionFormat(r.FRAGMENT_SHADER,r.LOW_INT).precision," (-2",r.getShaderPrecisionFormat(r.FRAGMENT_SHADER,r.LOW_INT).rangeMin," - 2",r.getShaderPrecisionFormat(r.FRAGMENT_SHADER,r.LOW_INT).rangeMax,")"].join("")],["Supported Extensions","EXTENSIONS",r.getSupportedExtensions().join("
\t\t\t\t\t ")],["WebGL Renderer","RENDERER",r.getParameter(r.RENDERER)],["WebGL Vendor","VENDOR",r.getParameter(r.VENDOR)],["WebGL Version","VERSION",r.getParameter(r.VERSION)],["Shading Language Version","SHADING_LANGUAGE_VERSION",r.getParameter(r.SHADING_LANGUAGE_VERSION)],["Unmasked Renderer","UNMASKED_RENDERER",o&&r.getParameter(o.UNMASKED_RENDERER_WEBGL)],["Unmasked Vendor","UNMASKED_VENDOR",o&&r.getParameter(o.UNMASKED_VENDOR_WEBGL)],["WebGL Version","WEBGL_VERSION",t.webgl2?2:1]],c={};l.length;){var u=l.pop(),d=(0,Ft.Z)(u,3),f=d[0],p=d[1],g=d[2];p&&(c[p]={label:f,value:g})}return c},e.traverseAllPasses=function(){if(t.renderPasses)for(var r=0;r0&&void 0!==arguments[0]?arguments[0]:t.imageFormat,n=document.createElement("canvas"),a=n.getContext("2d");n.width=t.canvas.width,n.height=t.canvas.height,a.drawImage(t.canvas,0,0);var o=t.canvas.getBoundingClientRect();t.renderable.getRenderers().forEach((function(e){e.getViewProps().forEach((function(e){if(e.getContainer)for(var t=e.getContainer().getElementsByTagName("canvas"),r=0;r2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,Os,r),ds.extend(e,t,r),t.canvas=document.createElement("canvas"),t.canvas.style.width="100%",Cs++,xs.forEach((function(e){return e(Cs)})),t.selector||(t.selector=Qi.newInstance(),t.selector.setOpenGLRenderWindow(e)),t.bgImage=new Image,t.bgImage.style.position="absolute",t.bgImage.style.left="0",t.bgImage.style.top="0",t.bgImage.style.width="100%",t.bgImage.style.height="100%",t.bgImage.style.zIndex="-1",t._textureResourceIds=new Map,t.myFactory=At.newInstance(),t.myFactory.registerOverride("vtkRenderWindow",As),t.shaderCache=as.newInstance(),t.shaderCache.setOpenGLRenderWindow(e),t.renderPasses[0]=wi.newInstance(),ht.default.event(e,t,"imageReady"),ht.default.event(e,t,"haveVRDisplay"),ht.default.get(e,t,["shaderCache","textureUnitManager","webgl2","vrDisplay","useBackgroundImage","xrSupported","activeFramebuffer"]),ht.default.setGet(e,t,["initialized","context","canvas","renderPasses","notifyStartCaptureImage","defaultToWebgl2","cursor","useOffScreen"]),ht.default.setGetArray(e,t,["size"],2),ht.default.event(e,t,"windowResizeEvent"),ws(e,t)}var As=ht.default.newInstance(Is,"vtkOpenGLRenderWindow");li("WebGL",As);var Rs={newInstance:As,extend:Is,pushMonitorGLContextCount:function(e){xs.push(e)},popMonitorGLContextCount:function(e){return xs.pop()}};var Es={context:null,keyMatrixTime:null,keyMatrices:null,activeTextures:null};function Ms(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,Es,r),Tt.extend(e,t,r),t.keyMatrixTime={},(0,ht.j6)(t.keyMatrixTime,{mtime:0}),t.keyMatrices={normalMatrix:ot.wO.identity(new Float64Array(9)),mcwc:ot._E.identity(new Float64Array(16))},(0,ht.g2)(e,t,["context"]),(0,ht.U2)(e,t,["activeTextures"]),function(e,t){t.classHierarchy.push("vtkOpenGLActor"),e.buildPass=function(r){if(r){t._openGLRenderWindow=e.getFirstAncestorOfType("vtkOpenGLRenderWindow"),t._openGLRenderer=e.getFirstAncestorOfType("vtkOpenGLRenderer"),t.context=t._openGLRenderWindow.getContext(),e.prepareNodes(),e.addMissingNodes(t.renderable.getTextures()),e.addMissingNode(t.renderable.getMapper()),e.removeUnusedNodes(),t.ogltextures=null,t.activeTextures=null;for(var n=0;nt.keyMatrixTime.getMTime()&&(t.renderable.computeMatrix(),ot._E.copy(t.keyMatrices.mcwc,t.renderable.getMatrix()),ot._E.transpose(t.keyMatrices.mcwc,t.keyMatrices.mcwc),t.renderable.getIsIdentity()?ot.wO.identity(t.keyMatrices.normalMatrix):(ot.wO.fromMat4(t.keyMatrices.normalMatrix,t.keyMatrices.mcwc),ot.wO.invert(t.keyMatrices.normalMatrix,t.keyMatrices.normalMatrix),ot.wO.transpose(t.keyMatrices.normalMatrix,t.keyMatrices.normalMatrix)),t.keyMatrixTime.modified()),t.keyMatrices}}(e,t)}var Ds=(0,ht.WL)(Ms),Vs={newInstance:Ds,extend:Ms};wt("vtkActor",Ds);var Ls={context:null,activeTextures:null};function _s(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,Ls,r),Tt.extend(e,t,r),(0,ht.g2)(e,t,["context"]),(0,ht.U2)(e,t,["activeTextures"]),function(e,t){t.classHierarchy.push("vtkOpenGLActor2D"),e.buildPass=function(r){if(r){if(!t.renderable)return;t._openGLRenderWindow=e.getFirstAncestorOfType("vtkOpenGLRenderWindow"),t._openGLRenderer=e.getFirstAncestorOfType("vtkOpenGLRenderer"),t.context=t._openGLRenderWindow.getContext(),e.prepareNodes(),e.addMissingNodes(t.renderable.getTextures()),e.addMissingNode(t.renderable.getMapper()),e.removeUnusedNodes(),t.ogltextures=null,t.activeTextures=null;for(var n=0;n= cos(radians(lightConeAngle".concat(d,")))")," {"," attenuation = attenuation * pow(coneDot, lightExponent".concat(d,");")," }"," else"," {"," attenuation = 0.0;"," }"," }"," }"," df = max(0.0, attenuation*dot(normalVCVSOutput, -vertLightDirectionVC));"," diffuseL += ((df".concat("",") * lightColor").concat(d,");")," if (dot(normalVCVSOutput, vertLightDirectionVC) < 0.0)"," {"," float sf = attenuation*pow( max(0.0, dot(lightHalfAngleVC".concat(d,",normalVCVSOutput)), specularPower);")," specularL += ((sf".concat("",") * lightColor").concat(d,");")," }"]);s=s.concat([" diffuseL = diffuseL * diffuseColor;"," specularL = specularL * specularColor;"," gl_FragData[0] = vec4(ambientColor * ambient + diffuseL * diffuse + specularL * specular, opacity);"," //VTK::Light::Impl"]),a=Sr.substitute(a,"//VTK::Light::Impl",s,!1).result;break;default:qs("bad light complexity")}e.Fragment=a},e.replaceShaderNormal=function(e,r,n){if(t.lastBoundBO.getReferenceByName("lastLightComplexity")>0){var a=e.Vertex,o=e.Geometry,i=e.Fragment;t.lastBoundBO.getCABO().getNormalOffset()?(a=Sr.substitute(a,"//VTK::Normal::Dec",["attribute vec3 normalMC;","uniform mat3 normalMatrix;","varying vec3 normalVCVSOutput;"]).result,a=Sr.substitute(a,"//VTK::Normal::Impl",["normalVCVSOutput = normalMatrix * normalMC;"]).result,o=Sr.substitute(o,"//VTK::Normal::Dec",["in vec3 normalVCVSOutput[];","out vec3 normalVCGSOutput;"]).result,o=Sr.substitute(o,"//VTK::Normal::Impl",["normalVCGSOutput = normalVCVSOutput[i];"]).result,i=Sr.substitute(i,"//VTK::Normal::Dec",["varying vec3 normalVCVSOutput;"]).result,i=Sr.substitute(i,"//VTK::Normal::Impl",["vec3 normalVCVSOutput = normalize(normalVCVSOutput);"," if (gl_FrontFacing == false) { normalVCVSOutput = -normalVCVSOutput; }"]).result):t.haveCellNormals?(i=Sr.substitute(i,"//VTK::Normal::Dec",["uniform mat3 normalMatrix;","uniform samplerBuffer textureN;"]).result,i=Sr.substitute(i,"//VTK::Normal::Impl",["vec3 normalVCVSOutput = normalize(normalMatrix *"," texelFetchBuffer(textureN, gl_PrimitiveID + PrimitiveIDOffset).xyz);"," if (gl_FrontFacing == false) { normalVCVSOutput = -normalVCVSOutput; }"]).result):t.lastBoundBO.getOpenGLMode(n.getProperty().getRepresentation())===t.context.LINES?(i=Sr.substitute(i,"//VTK::UniformFlow::Impl",[" vec3 fdx = dFdx(vertexVC.xyz);"," vec3 fdy = dFdy(vertexVC.xyz);"," //VTK::UniformFlow::Impl"]).result,i=Sr.substitute(i,"//VTK::Normal::Impl",["vec3 normalVCVSOutput;"," if (abs(fdx.x) > 0.0)"," { fdx = normalize(fdx); normalVCVSOutput = normalize(cross(vec3(fdx.y, -fdx.x, 0.0), fdx)); }"," else { fdy = normalize(fdy); normalVCVSOutput = normalize(cross(vec3(fdy.y, -fdy.x, 0.0), fdy));}"]).result):(i=Sr.substitute(i,"//VTK::Normal::Dec",["uniform int cameraParallel;"]).result,i=Sr.substitute(i,"//VTK::UniformFlow::Impl",[" vec3 fdx = dFdx(vertexVC.xyz);"," vec3 fdy = dFdy(vertexVC.xyz);"," //VTK::UniformFlow::Impl"]).result,i=Sr.substitute(i,"//VTK::Normal::Impl",[" fdx = normalize(fdx);"," fdy = normalize(fdy);"," vec3 normalVCVSOutput = normalize(cross(fdx,fdy));"," if (cameraParallel == 1 && normalVCVSOutput.z < 0.0) { normalVCVSOutput = -1.0*normalVCVSOutput; }"," if (cameraParallel == 0 && dot(normalVCVSOutput,vertexVC.xyz) > 0.0) { normalVCVSOutput = -1.0*normalVCVSOutput; }"]).result),e.Vertex=a,e.Geometry=o,e.Fragment=i}},e.replaceShaderPositionVC=function(e,r,n){t.lastBoundBO.replaceShaderPositionVC(e,r,n);var a=e.Vertex,o=e.Geometry,i=e.Fragment;t.lastBoundBO.getReferenceByName("lastLightComplexity")>0?(a=Sr.substitute(a,"//VTK::PositionVC::Dec",["varying vec4 vertexVCVSOutput;"]).result,a=Sr.substitute(a,"//VTK::PositionVC::Impl",["vertexVCVSOutput = MCVCMatrix * vertexMC;"," gl_Position = MCPCMatrix * vertexMC;"]).result,a=Sr.substitute(a,"//VTK::Camera::Dec",["uniform mat4 MCPCMatrix;","uniform mat4 MCVCMatrix;"]).result,o=Sr.substitute(o,"//VTK::PositionVC::Dec",["in vec4 vertexVCVSOutput[];","out vec4 vertexVCGSOutput;"]).result,o=Sr.substitute(o,"//VTK::PositionVC::Impl",["vertexVCGSOutput = vertexVCVSOutput[i];"]).result,i=Sr.substitute(i,"//VTK::PositionVC::Dec",["varying vec4 vertexVCVSOutput;"]).result,i=Sr.substitute(i,"//VTK::PositionVC::Impl",["vec4 vertexVC = vertexVCVSOutput;"]).result):(a=Sr.substitute(a,"//VTK::Camera::Dec",["uniform mat4 MCPCMatrix;"]).result,a=Sr.substitute(a,"//VTK::PositionVC::Impl",[" gl_Position = MCPCMatrix * vertexMC;"]).result),e.Vertex=a,e.Geometry=o,e.Fragment=i},e.replaceShaderTCoord=function(e,r,n){if(t.lastBoundBO.getCABO().getTCoordOffset()){var a=e.Vertex,o=e.Geometry,i=e.Fragment;if(t.drawingEdges)return;a=Sr.substitute(a,"//VTK::TCoord::Impl","tcoordVCVSOutput = tcoordMC;").result;var s=t.openGLActor.getActiveTextures(),l=2,c=2;if(s&&s.length>0&&(l=s[0].getComponents(),s[0].getTarget()===t.context.TEXTURE_CUBE_MAP&&(c=3)),t.renderable.getColorTextureMap()&&(l=t.renderable.getColorTextureMap().getPointData().getScalars().getNumberOfComponents(),c=2),2===c){if(a=Sr.substitute(a,"//VTK::TCoord::Dec","attribute vec2 tcoordMC; varying vec2 tcoordVCVSOutput;").result,o=Sr.substitute(o,"//VTK::TCoord::Dec",["in vec2 tcoordVCVSOutput[];","out vec2 tcoordVCGSOutput;"]).result,o=Sr.substitute(o,"//VTK::TCoord::Impl","tcoordVCGSOutput = tcoordVCVSOutput[i];").result,i=Sr.substitute(i,"//VTK::TCoord::Dec",["varying vec2 tcoordVCVSOutput;","uniform sampler2D texture1;"]).result,s&&s.length>=1)switch(l){case 1:i=Sr.substitute(i,"//VTK::TCoord::Impl",[" vec4 tcolor = texture2D(texture1, tcoordVCVSOutput);"," ambientColor = ambientColor*tcolor.r;"," diffuseColor = diffuseColor*tcolor.r;"]).result;break;case 2:i=Sr.substitute(i,"//VTK::TCoord::Impl",[" vec4 tcolor = texture2D(texture1, tcoordVCVSOutput);"," ambientColor = ambientColor*tcolor.r;"," diffuseColor = diffuseColor*tcolor.r;"," opacity = opacity * tcolor.g;"]).result;break;default:i=Sr.substitute(i,"//VTK::TCoord::Impl",[" vec4 tcolor = texture2D(texture1, tcoordVCVSOutput);"," ambientColor = ambientColor*tcolor.rgb;"," diffuseColor = diffuseColor*tcolor.rgb;"," opacity = opacity * tcolor.a;"]).result}}else switch(a=Sr.substitute(a,"//VTK::TCoord::Dec","attribute vec3 tcoordMC; varying vec3 tcoordVCVSOutput;").result,o=Sr.substitute(o,"//VTK::TCoord::Dec",["in vec3 tcoordVCVSOutput[];","out vec3 tcoordVCGSOutput;"]).result,o=Sr.substitute(o,"//VTK::TCoord::Impl","tcoordVCGSOutput = tcoordVCVSOutput[i];").result,i=Sr.substitute(i,"//VTK::TCoord::Dec",["varying vec3 tcoordVCVSOutput;","uniform samplerCube texture1;"]).result,l){case 1:i=Sr.substitute(i,"//VTK::TCoord::Impl",[" vec4 tcolor = textureCube(texture1, tcoordVCVSOutput);"," ambientColor = ambientColor*tcolor.r;"," diffuseColor = diffuseColor*tcolor.r;"]).result;break;case 2:i=Sr.substitute(i,"//VTK::TCoord::Impl",[" vec4 tcolor = textureCube(texture1, tcoordVCVSOutput);"," ambientColor = ambientColor*tcolor.r;"," diffuseColor = diffuseColor*tcolor.r;"," opacity = opacity * tcolor.g;"]).result;break;default:i=Sr.substitute(i,"//VTK::TCoord::Impl",[" vec4 tcolor = textureCube(texture1, tcoordVCVSOutput);"," ambientColor = ambientColor*tcolor.rgb;"," diffuseColor = diffuseColor*tcolor.rgb;"," opacity = opacity * tcolor.a;"]).result}e.Vertex=a,e.Geometry=o,e.Fragment=i}},e.replaceShaderClip=function(e,r,n){var a=e.Vertex,o=e.Fragment;if(t.renderable.getNumberOfClippingPlanes()){var i=t.renderable.getNumberOfClippingPlanes();a=Sr.substitute(a,"//VTK::Clip::Dec",["uniform int numClipPlanes;","uniform vec4 clipPlanes[".concat(i,"];"),"varying float clipDistancesVSOutput[".concat(i,"];")]).result,a=Sr.substitute(a,"//VTK::Clip::Impl",["for (int planeNum = 0; planeNum < ".concat(i,"; planeNum++)")," {"," if (planeNum >= numClipPlanes)"," {"," break;"," }"," clipDistancesVSOutput[planeNum] = dot(clipPlanes[planeNum], vertexMC);"," }"]).result,o=Sr.substitute(o,"//VTK::Clip::Dec",["uniform int numClipPlanes;","varying float clipDistancesVSOutput[".concat(i,"];")]).result,o=Sr.substitute(o,"//VTK::Clip::Impl",["for (int planeNum = 0; planeNum < ".concat(i,"; planeNum++)")," {"," if (planeNum >= numClipPlanes)"," {"," break;"," }"," if (clipDistancesVSOutput[planeNum] < 0.0) discard;"," }"]).result}e.Vertex=a,e.Fragment=o},e.getCoincidentParameters=function(e,r){var n={factor:0,offset:0},a=r.getProperty();if(t.renderable.getResolveCoincidentTopology()||a.getEdgeVisibility()&&a.getRepresentation()===js.SURFACE){var o=t.lastBoundBO.getPrimitiveType();o===zs.Points||a.getRepresentation()===js.POINTS?n=t.renderable.getCoincidentTopologyPointOffsetParameter():o===zs.Lines||a.getRepresentation()===js.WIREFRAME?n=t.renderable.getCoincidentTopologyLineOffsetParameters():o!==zs.Tris&&o!==zs.TriStrips||(n=t.renderable.getCoincidentTopologyPolygonOffsetParameters()),o!==zs.TrisEdges&&o!==zs.TriStripsEdges||((n=t.renderable.getCoincidentTopologyPolygonOffsetParameters()).factor/=2,n.offset/=2)}var i=t._openGLRenderer.getSelector();return i&&i.getFieldAssociation()===Ws.FIELD_ASSOCIATION_POINTS&&(n.offset-=2),n},e.replaceShaderPicking=function(e,r,n){var a=e.Fragment,o=e.Vertex;if(a=Sr.substitute(a,"//VTK::Picking::Dec",["uniform int picking;","//VTK::Picking::Dec"]).result,t._openGLRenderer.getSelector()){switch(t.lastSelectionState!==Oi.X.ID_LOW24&&t.lastSelectionState!==Oi.X.ID_HIGH24||(o=Sr.substitute(o,"//VTK::Picking::Dec",["flat out int vertexIDVSOutput;\n","uniform int VertexIDOffset;\n"]).result,o=Sr.substitute(o,"//VTK::Picking::Impl"," vertexIDVSOutput = gl_VertexID + VertexIDOffset;\n").result,a=Sr.substitute(a,"//VTK::Picking::Dec","flat in int vertexIDVSOutput;\n").result,a=Sr.substitute(a,"//VTK::Picking::Impl",[" int idx = vertexIDVSOutput;","//VTK::Picking::Impl"]).result),t.lastSelectionState){case Oi.X.ID_LOW24:a=Sr.substitute(a,"//VTK::Picking::Impl"," gl_FragData[0] = vec4(float(idx%256)/255.0, float((idx/256)%256)/255.0, float((idx/65536)%256)/255.0, 1.0);").result;break;case Oi.X.ID_HIGH24:a=Sr.substitute(a,"//VTK::Picking::Impl"," gl_FragData[0] = vec4(float(idx)/255.0, 0.0, 0.0, 1.0);").result;break;default:a=Sr.substitute(a,"//VTK::Picking::Dec","uniform vec3 mapperIndex;").result,a=Sr.substitute(a,"//VTK::Picking::Impl"," gl_FragData[0] = picking != 0 ? vec4(mapperIndex,1.0) : gl_FragData[0];").result}e.Fragment=a,e.Vertex=o}},e.replaceShaderValues=function(r,n,a){if(e.replaceShaderColor(r,n,a),e.replaceShaderNormal(r,n,a),e.replaceShaderLight(r,n,a),e.replaceShaderTCoord(r,n,a),e.replaceShaderPicking(r,n,a),e.replaceShaderClip(r,n,a),e.replaceShaderCoincidentOffset(r,n,a),e.replaceShaderPositionVC(r,n,a),t.haveSeenDepthRequest){var o=r.Fragment;o=Sr.substitute(o,"//VTK::ZBuffer::Dec","uniform int depthRequest;").result,o=Sr.substitute(o,"//VTK::ZBuffer::Impl",["if (depthRequest == 1) {","float iz = floor(gl_FragCoord.z*65535.0 + 0.1);","float rf = floor(iz/256.0)/255.0;","float gf = mod(iz,256.0)/255.0;","gl_FragData[0] = vec4(rf, gf, 0.0, 1.0); }"]).result,r.Fragment=o}},e.getNeedToRebuildShaders=function(e,r,n){var a=0,o=0,i=e.getPrimitiveType(),s=t.currentInput,l=!1,c=s.getPointData().getNormals(),u=s.getCellData().getNormals(),d=n.getProperty().getInterpolation()===Hs.FLAT,f=n.getProperty().getRepresentation(),p=e.getOpenGLMode(f,i);if(p===t.context.TRIANGLES||u&&!c||!d&&c?l=!0:d||p!==t.context.LINES||(l=!0),n.getProperty().getLighting()&&l){a=0;for(var g=r.getLightsByReference(),m=0;m0&&(o++,0===a&&(a=1)),1===a&&(o>1||1!==h.getIntensity()||!h.lightTypeIsHeadLight())&&(a=2),a<3&&h.getPositional()&&(a=3)}}var v=!1,y=t.lastBoundBO.getReferenceByName("lastLightComplexity"),b=t.lastBoundBO.getReferenceByName("lastLightCount");return y===a&&b===o||(t.lastBoundBO.set({lastLightComplexity:a},!0),t.lastBoundBO.set({lastLightCount:o},!0),v=!0),(!t.currentRenderPass&&t.lastRenderPassShaderReplacement||t.currentRenderPass&&t.currentRenderPass.getShaderReplacement()!==t.lastRenderPassShaderReplacement)&&(v=!0),!!(t.lastHaveSeenDepthRequest!==t.haveSeenDepthRequest||e.getShaderSourceTime().getMTime()r.getAttributeUpdateTime().getMTime()||r.getShaderSourceTime().getMTime()>r.getAttributeUpdateTime().getMTime())){var o=t.lastBoundBO.getReferenceByName("lastLightComplexity");r.getProgram().isAttributeUsed("vertexMC")&&(r.getVAO().addAttributeArray(r.getProgram(),r.getCABO(),"vertexMC",r.getCABO().getVertexOffset(),r.getCABO().getStride(),t.context.FLOAT,3,!1)||qs("Error setting vertexMC in shader VAO.")),r.getProgram().isAttributeUsed("normalMC")&&r.getCABO().getNormalOffset()&&o>0?r.getVAO().addAttributeArray(r.getProgram(),r.getCABO(),"normalMC",r.getCABO().getNormalOffset(),r.getCABO().getStride(),t.context.FLOAT,3,!1)||qs("Error setting normalMC in shader VAO."):r.getVAO().removeAttributeArray("normalMC"),t.renderable.getCustomShaderAttributes().forEach((function(e,n){r.getProgram().isAttributeUsed("".concat(e,"MC"))&&(r.getVAO().addAttributeArray(r.getProgram(),r.getCABO(),"".concat(e,"MC"),r.getCABO().getCustomData()[n].offset,r.getCABO().getStride(),t.context.FLOAT,r.getCABO().getCustomData()[n].components,!1)||qs("Error setting ".concat(e,"MC in shader VAO.")))})),r.getProgram().isAttributeUsed("tcoordMC")&&r.getCABO().getTCoordOffset()?r.getVAO().addAttributeArray(r.getProgram(),r.getCABO(),"tcoordMC",r.getCABO().getTCoordOffset(),r.getCABO().getStride(),t.context.FLOAT,r.getCABO().getTCoordComponents(),!1)||qs("Error setting tcoordMC in shader VAO."):r.getVAO().removeAttributeArray("tcoordMC"),r.getProgram().isAttributeUsed("scalarColor")&&r.getCABO().getColorComponents()?r.getVAO().addAttributeArray(r.getProgram(),r.getCABO().getColorBO(),"scalarColor",r.getCABO().getColorOffset(),r.getCABO().getColorBOStride(),t.context.UNSIGNED_BYTE,4,!0)||qs("Error setting scalarColor in shader VAO."):r.getVAO().removeAttributeArray("scalarColor"),r.getAttributeUpdateTime().modified()}if(t.renderable.getNumberOfClippingPlanes()){var i=t.renderable.getNumberOfClippingPlanes(),s=[],l=r.getCABO().getCoordShiftAndScaleEnabled()?r.getCABO().getInverseShiftAndScaleMatrix():null,c=l?ot._E.copy(t.tmpMat4,a.getMatrix()):a.getMatrix();l&&(ot._E.transpose(c,c),ot._E.multiply(c,c,l),ot._E.transpose(c,c));for(var u=0;u0){var u=c.getColorByReference(),d=c.getIntensity();t.lightColor[0]=u[0]*d,t.lightColor[1]=u[1]*d,t.lightColor[2]=u[2]*d;var f=c.getDirection(),p=r.getActiveCamera().getViewMatrix(),g=(0,pa.Z)(f);c.lightTypeIsSceneLight()&&(g[0]=p[0]*f[0]+p[1]*f[1]+p[2]*f[2],g[1]=p[4]*f[0]+p[5]*f[1]+p[6]*f[2],g[2]=p[8]*f[0]+p[9]*f[1]+p[10]*f[2],(0,Mr.l)(g)),t.lightDirection[0]=g[0],t.lightDirection[1]=g[1],t.lightDirection[2]=g[2],t.lightHalfAngle[0]=-t.lightDirection[0],t.lightHalfAngle[1]=-t.lightDirection[1],t.lightHalfAngle[2]=1-t.lightDirection[2],(0,Mr.l)(t.lightDirection),o.setUniform3fArray("lightColor".concat(i),t.lightColor),o.setUniform3fArray("lightDirectionVC".concat(i),t.lightDirection),o.setUniform3fArray("lightHalfAngleVC".concat(i),t.lightHalfAngle),i++}}if(!(a<3)){var m=r.getActiveCamera().getViewMatrix();ot._E.transpose(m,m),i=0;for(var h=0;h0){var y=v.getTransformedPosition(),b=new Float64Array(3);ot.R3.transformMat4(b,y,m),o.setUniform3fArray("lightAttenuation".concat(i),v.getAttenuationValuesByReference()),o.setUniformi("lightPositional".concat(i),v.getPositional()),o.setUniformf("lightExponent".concat(i),v.getExponent()),o.setUniformf("lightConeAngle".concat(i),v.getConeAngle()),o.setUniform3fArray("lightPositionVC".concat(i),[b[0],b[1],b[2]]),i++}}}}},e.setCameraShaderParameters=function(e,n,a){var o=e.getProgram(),i=t.openGLCamera.getKeyMatrices(n),s=n.getActiveCamera(),l=t.openGLCamera.getKeyMatrixTime().getMTime(),c=o.getLastCameraMTime(),u=e.getCABO().getCoordShiftAndScaleEnabled()?e.getCABO().getInverseShiftAndScaleMatrix():null,d=a.getIsIdentity(),f=d?{mcwc:null,normalMatrix:null}:t.openGLActor.getKeyMatrices();if(a.getCoordinateSystem()===Qs.DISPLAY){var p=t._openGLRenderer.getTiledSizeAndOrigin();ot._E.identity(t.tmpMat4),t.tmpMat4[0]=2/p.usize,t.tmpMat4[12]=-1,t.tmpMat4[5]=2/p.vsize,t.tmpMat4[13]=-1,ot._E.multiply(t.tmpMat4,t.tmpMat4,u),o.setUniformMatrix("MCPCMatrix",t.tmpMat4)}else o.setUniformMatrix("MCPCMatrix",r([i.wcpc,f.mcwc,u],ot._E,t.tmpMat4));o.isUniformUsed("MCVCMatrix")&&o.setUniformMatrix("MCVCMatrix",r([i.wcvc,f.mcwc,u],ot._E,t.tmpMat4)),o.isUniformUsed("normalMatrix")&&o.setUniformMatrix3x3("normalMatrix",r([i.normalMatrix,f.normalMatrix],ot.wO,t.tmpMat3)),c!==l&&(o.isUniformUsed("cameraParallel")&&o.setUniformi("cameraParallel",s.getParallelProjection()),o.setLastCameraMTime(l)),d||o.setLastCameraMTime(0)},e.setPropertyShaderParameters=function(e,r,n){var a=e.getProgram(),o=n.getProperty(),i=o.getOpacity(),s=t.drawingEdges?o.getEdgeColorByReference():o.getAmbientColorByReference(),l=t.drawingEdges?o.getEdgeColorByReference():o.getDiffuseColorByReference(),c=t.drawingEdges?1:o.getAmbient(),u=t.drawingEdges?0:o.getDiffuse(),d=t.drawingEdges?0:o.getSpecular(),f=o.getSpecularPower();a.setUniformf("opacityUniform",i),a.setUniform3fArray("ambientColorUniform",s),a.setUniform3fArray("diffuseColorUniform",l),a.setUniformf("ambient",c),a.setUniformf("diffuse",u);var p=t.lastBoundBO.getReferenceByName("lastLightComplexity");if(!(p<1)){var g=o.getSpecularColorByReference();if(a.setUniform3fArray("specularColorUniform",g),a.setUniformf("specularPowerUniform",f),a.setUniformf("specular",d),a.isUniformUsed("ambientIntensityBF")){if(i=(o=n.getBackfaceProperty()).getOpacity(),s=o.getAmbientColor(),c=o.getAmbient(),l=o.getDiffuseColor(),u=o.getDiffuse(),g=o.getSpecularColor(),d=o.getSpecular(),a.setUniformf("ambientIntensityBF",c),a.setUniformf("diffuseIntensityBF",u),a.setUniformf("opacityUniformBF",i),a.setUniform3fArray("ambientColorUniformBF",s),a.setUniform3fArray("diffuseColorUniformBF",l),p<1)return;a.setUniformf("specularIntensityBF",d),a.setUniform3fArray("specularColorUniformBF",g),a.setUniformf("specularPowerUniformBF",f)}}},e.updateMaximumPointCellIds=function(e,r){var n,a,o,i,s=t._openGLRenderer.getSelector();if(s){if(null!==(n=t.selectionWebGLIdsToVTKIds)&&void 0!==n&&null!==(a=n.points)&&void 0!==a&&a.length){var l=t.selectionWebGLIdsToVTKIds.points.length;s.setMaximumPointId(l-1)}if(null!==(o=t.selectionWebGLIdsToVTKIds)&&void 0!==o&&null!==(i=o.cells)&&void 0!==i&&i.length){var c=t.selectionWebGLIdsToVTKIds.cells.length;s.setMaximumCellId(c-1)}s.getFieldAssociation()===Ws.FIELD_ASSOCIATION_POINTS&&(t.pointPicking=!0)}},e.renderPieceStart=function(r,n){t.primitiveIDOffset=0,t.vertexIDOffset=0;var a,o,i=(a=t._openGLRenderer,(o=a.getSelector())?o.getCurrentPass():Oi.X.MIN_KNOWN_PASS-1);t.lastSelectionState!==i&&(t.selectionStateChanged.modified(),t.lastSelectionState=i),t._openGLRenderer.getSelector()&&t._openGLRenderer.getSelector().renderProp(n),e.updateBufferObjects(r,n),t.renderable.getColorTextureMap()&&t.internalColorTexture.activate(),t.lastBoundBO=null},e.renderPieceDraw=function(r,n){for(var a=n.getProperty().getRepresentation(),o=n.getProperty().getEdgeVisibility()&&a===js.SURFACE,i=t._openGLRenderer.getSelector(),s=i&&i.getFieldAssociation()===Ws.FIELD_ASSOCIATION_POINTS&&(t.lastSelectionState===Oi.X.ID_LOW24||t.lastSelectionState===Oi.X.ID_HIGH24),l=zs.Start;l=0)||(t.lastBoundBO=t.primitives[l],t.primitiveIDOffset+=t.primitives[l].drawArrays(r,n,a,e),t.vertexIDOffset+=t.primitives[l].getCABO().getElementCount()))}},e.renderPieceFinish=function(e,r){t.LastBoundBO&&t.LastBoundBO.getVAO().release(),t.renderable.getColorTextureMap()&&t.internalColorTexture.deactivate()},e.renderPiece=function(r,n){if(e.invokeEvent(Ys),t.renderable.getStatic()||t.renderable.update(),t.currentInput=t.renderable.getInputData(),e.invokeEvent($s),t.currentInput){if(t.currentInput.getPoints&&t.currentInput.getPoints().getNumberOfValues()){var a=t.context,o=n.getProperty().getBackfaceCulling(),i=n.getProperty().getFrontfaceCulling();o||i?i?(t._openGLRenderWindow.enableCullFace(),a.cullFace(a.FRONT)):(t._openGLRenderWindow.enableCullFace(),a.cullFace(a.BACK)):t._openGLRenderWindow.disableCullFace(),e.renderPieceStart(r,n),e.renderPieceDraw(r,n),e.renderPieceFinish(r,n)}}else qs("No input!")},e.computeBounds=function(r,n){e.getInput()?t.bounds=e.getInput().getBounds():(0,Mr.u)(t.bounds)},e.updateBufferObjects=function(t,r){e.getNeedToRebuildBufferObjects(t,r)&&e.buildBufferObjects(t,r)},e.getNeedToRebuildBufferObjects=function(r,n){var a=t.VBOBuildTime.getMTime();return a2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,el,r),Tt.extend(e,t,r),Qr.implementReplaceShaderCoincidentOffset(e,t,r),Qr.implementBuildShadersWithReplacements(e,t,r),t.primitives=[],t.primTypes=zs,t.tmpMat3=ot.wO.identity(new Float64Array(9)),t.tmpMat4=ot._E.identity(new Float64Array(16));for(var n=zs.Start;n0){var o=e.Vertex;t.lastBoundBO.getCABO().getNormalOffset()&&(o=Sr.substitute(o,"//VTK::Normal::Dec",["attribute vec3 normalMC;","attribute mat3 gNormal;","uniform mat3 normalMatrix;","varying vec3 normalVCVSOutput;"]).result,o=Sr.substitute(o,"//VTK::Normal::Impl",["normalVCVSOutput = normalMatrix * gNormal * normalMC;"]).result),e.Vertex=o}r.replaceShaderNormal(e,n,a)},e.replaceShaderColor=function(e,n,a){if(t.hardwareSupport&&t.renderable.getColorArray()){var o=e.Vertex,i=e.Geometry,s=e.Fragment,l=t.lastBoundBO.getReferenceByName("lastLightComplexity"),c=["uniform float ambient;","uniform float diffuse;","uniform float specular;","uniform float opacityUniform; // the fragment opacity"];l&&(c=c.concat(["uniform vec3 specularColorUniform;","uniform float specularPowerUniform;"]));var u=["vec3 ambientColor;"," vec3 diffuseColor;"," float opacity;"];l&&(u=u.concat([" vec3 specularColor;"," float specularPower;"])),u=u.concat([" opacity = opacityUniform;"]),l&&(u=u.concat([" specularColor = specularColorUniform;"," specularPower = specularPowerUniform;"])),t.drawingEdges||(c=c.concat(["varying vec4 vertexColorVSOutput;"]),o=Sr.substitute(o,"//VTK::Color::Dec",["attribute vec4 gColor;","varying vec4 vertexColorVSOutput;"]).result,o=Sr.substitute(o,"//VTK::Color::Impl",["vertexColorVSOutput = gColor;"]).result,i=Sr.substitute(i,"//VTK::Color::Dec",["in vec4 vertexColorVSOutput[];","out vec4 vertexColorGSOutput;"]).result,i=Sr.substitute(i,"//VTK::Color::Impl",["vertexColorGSOutput = vertexColorVSOutput[i];"]).result,u=u.concat([" diffuseColor = vertexColorVSOutput.rgb;"," ambientColor = vertexColorVSOutput.rgb;"," opacity = opacity*vertexColorVSOutput.a;"])),s=Sr.substitute(s,"//VTK::Color::Impl",u).result,s=Sr.substitute(s,"//VTK::Color::Dec",c).result,e.Vertex=o,e.Geometry=i,e.Fragment=s}r.replaceShaderColor(e,n,a)},e.replaceShaderPositionVC=function(e,n,a){if(t.hardwareSupport){var o=e.Vertex;t.lastBoundBO.getReferenceByName("lastLightComplexity")>0?(o=Sr.substitute(o,"//VTK::PositionVC::Impl",["vec4 gVertexMC = gMatrix * vertexMC;","vertexVCVSOutput = MCVCMatrix * gVertexMC;"," gl_Position = MCPCMatrix * gVertexMC;"]).result,o=Sr.substitute(o,"//VTK::Camera::Dec",["attribute mat4 gMatrix;","uniform mat4 MCPCMatrix;","uniform mat4 MCVCMatrix;"]).result):(o=Sr.substitute(o,"//VTK::Camera::Dec",["attribute mat4 gMatrix;","uniform mat4 MCPCMatrix;"]).result,o=Sr.substitute(o,"//VTK::PositionVC::Impl",["vec4 gVertexMC = gMatrix * vertexMC;"," gl_Position = MCPCMatrix * gVertexMC;"]).result),e.Vertex=o}r.replaceShaderPositionVC(e,n,a)},e.replaceShaderPicking=function(e,n,a){if(t.hardwareSupport){var o=e.Fragment,i=e.Vertex;i=Sr.substitute(i,"//VTK::Picking::Dec",["attribute vec3 mapperIndexVS;","varying vec3 mapperIndexVSOutput;"]).result,i=Sr.substitute(i,"//VTK::Picking::Impl"," mapperIndexVSOutput = mapperIndexVS;").result,e.Vertex=i,o=Sr.substitute(o,"//VTK::Picking::Dec",["varying vec3 mapperIndexVSOutput;","uniform vec3 mapperIndex;","uniform int picking;"]).result,o=Sr.substitute(o,"//VTK::Picking::Impl",[" vec4 pickColor = picking == 2 ? vec4(mapperIndexVSOutput,1.0) : vec4(mapperIndex,1.0);"," gl_FragData[0] = picking != 0 ? pickColor : gl_FragData[0];"]).result,e.Fragment=o}else r.replaceShaderPicking(e,n,a)},e.updateGlyphShaderParameters=function(r,n,a,o,i,s,l,c){var u=a.getProgram();if(r){var d=t.normalMatrix,f=s,p=9*l,g=t.tmpMat3,m=d[0],h=d[1],v=d[2],y=d[3],b=d[4],T=d[5],C=d[6],x=d[7],S=d[8],P=f[p],w=f[p+1],O=f[p+2],I=f[p+3],A=f[p+4],R=f[p+5],E=f[p+6],M=f[p+7],D=f[p+8];g[0]=P*m+w*y+O*C,g[1]=P*h+w*b+O*x,g[2]=P*v+w*T+O*S,g[3]=I*m+A*y+R*C,g[4]=I*h+A*b+R*x,g[5]=I*v+A*T+R*S,g[6]=E*m+M*y+D*C,g[7]=E*h+M*b+D*x,g[8]=E*v+M*T+D*S,u.setUniformMatrix3x3("normalMatrix",t.tmpMat3)}if(e.multiply4x4WithOffset(t.tmpMat4,t.mcpcMatrix,i,16*l),u.setUniformMatrix("MCPCMatrix",t.tmpMat4),n&&(e.multiply4x4WithOffset(t.tmpMat4,t.mcvcMatrix,i,16*l),u.setUniformMatrix("MCVCMatrix",t.tmpMat4)),o){var V=o.getData();t.tmpColor[0]=V[4*l]/255,t.tmpColor[1]=V[4*l+1]/255,t.tmpColor[2]=V[4*l+2]/255,u.setUniform3fArray("ambientColorUniform",t.tmpColor),u.setUniform3fArray("diffuseColorUniform",t.tmpColor)}c&&u.setUniform3fArray("mapperIndex",c.getPropColorValue())},e.renderPieceDraw=function(r,n){var a=n.getProperty().getRepresentation(),o=t.context,i=n.getProperty().getEdgeVisibility()&&a===il.SURFACE,s=t.openGLCamera.getKeyMatrices(r),l=t.openGLActor.getKeyMatrices();ot.wO.multiply(t.normalMatrix,s.normalMatrix,l.normalMatrix),ot._E.multiply(t.mcpcMatrix,s.wcpc,l.mcwc),ot._E.multiply(t.mcvcMatrix,s.wcvc,l.mcwc);var c=t.renderable.getMatrixArray(),u=t.renderable.getNormalArray(),d=t.renderable.getColorArray(),f=c.length/16,p=!1;t._openGLRenderer.getSelector()&&t._openGLRenderer.getSelector().getCurrentPass()===ll.COMPOSITE_INDEX_PASS&&(p=!0);for(var g=t.primTypes.Start;ge.getAttributeUpdateTime().getMTime()||e.getShaderSourceTime().getMTime()>e.getAttributeUpdateTime().getMTime()))return e.getProgram().isAttributeUsed("gMatrix")?e.getVAO().addAttributeMatrixWithDivisor(e.getProgram(),t.matrixBuffer,"gMatrix",0,64,t.context.FLOAT,4,!1,1)||ol("Error setting gMatrix in shader VAO."):e.getVAO().removeAttributeArray("gMatrix"),e.getProgram().isAttributeUsed("gNormal")?e.getVAO().addAttributeMatrixWithDivisor(e.getProgram(),t.normalBuffer,"gNormal",0,36,t.context.FLOAT,3,!1,1)||ol("Error setting gNormal in shader VAO."):e.getVAO().removeAttributeArray("gNormal"),e.getProgram().isAttributeUsed("gColor")?e.getVAO().addAttributeArrayWithDivisor(e.getProgram(),t.colorBuffer,"gColor",0,4,t.context.UNSIGNED_BYTE,4,!0,1,!1)||ol("Error setting gColor in shader VAO."):e.getVAO().removeAttributeArray("gColor"),e.getProgram().isAttributeUsed("mapperIndexVS")?e.getVAO().addAttributeArrayWithDivisor(e.getProgram(),t.pickBuffer,"mapperIndexVS",0,4,t.context.UNSIGNED_BYTE,4,!0,1,!1)||ol("Error setting mapperIndexVS in shader VAO."):e.getVAO().removeAttributeArray("mapperIndexVS"),r.setMapperShaderParameters(e,n,a),void e.getAttributeUpdateTime().modified();r.setMapperShaderParameters(e,n,a)},e.getNeedToRebuildBufferObjects=function(e,n){return t.renderable.buildArrays(),t.VBOBuildTime.getMTime()t.glyphBOBuildTime.getMTime()){t.matrixBuffer.upload(a,sl.ARRAY_BUFFER),t.normalBuffer.upload(o,sl.ARRAY_BUFFER),i?t.colorBuffer.upload(i.getData(),sl.ARRAY_BUFFER):t.colorBuffer.releaseGraphicsResources();for(var s=a.length/16,l=new Uint8Array(4*s),c=0;c2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,fl,r),nl.extend(e,t,r),t.tmpMat3=ot.wO.identity(new Float64Array(9)),t.normalMatrix=ot.wO.identity(new Float64Array(9)),t.mcpcMatrix=ot._E.identity(new Float64Array(16)),t.mcvcMatrix=ot._E.identity(new Float64Array(16)),t.tmpColor=[],t.glyphBOBuildTime={},(0,ht.j6)(t.glyphBOBuildTime,{mtime:0}),dl(e,t)}var gl=(0,ht.WL)(pl,"vtkOpenGLGlyph3DMapper"),ml={newInstance:gl,extend:pl};wt("vtkGlyph3DMapper",gl);var hl=ht.E0;var vl={context:null};function yl(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,vl,r),Tt.extend(e,t,r),t.openGLTexture=Yr.newInstance(),t.tris=Er.newInstance(),t.keyMatrixTime={},(0,ht.j6)(t.keyMatrixTime,{mtime:0}),t.keyMatrices={normalMatrix:ot.wO.identity(new Float64Array(9)),mcwc:ot._E.identity(new Float64Array(16))},(0,ht.g2)(e,t,["context"]),(0,ht.U2)(e,t,["activeTextures"]),function(e,t){t.classHierarchy.push("vtkOpenGLSkybox"),e.buildPass=function(r){if(r){t._openGLRenderer=e.getFirstAncestorOfType("vtkOpenGLRenderer"),t._openGLRenderWindow=t._openGLRenderer.getParent(),t.context=t._openGLRenderWindow.getContext(),t.tris.setOpenGLRenderWindow(t._openGLRenderWindow),t.openGLTexture.setOpenGLRenderWindow(t._openGLRenderWindow);var n=t._openGLRenderer.getRenderable();t.openGLCamera=t._openGLRenderer.getViewNodeFor(n.getActiveCamera())}},e.queryPass=function(e,r){if(e){if(!t.renderable||!t.renderable.getVisibility())return;r.incrementOpaqueActorCount()}},e.opaquePass=function(r,n){if(r&&!t._openGLRenderer.getSelector()){e.updateBufferObjects(),t.context.depthMask(!0),t._openGLRenderWindow.getShaderCache().readyShaderProgram(t.tris.getProgram()),t.openGLTexture.render(t._openGLRenderWindow);var a=t.openGLTexture.getTextureUnit();t.tris.getProgram().setUniformi("sbtexture",a);var o=t._openGLRenderer.getRenderable(),i=t.openGLCamera.getKeyMatrices(o),s=new Float64Array(16);if(ot._E.invert(s,i.wcpc),t.tris.getProgram().setUniformMatrix("IMCPCMatrix",s),"box"===t.lastFormat){var l=o.getActiveCamera().getPosition();t.tris.getProgram().setUniform3f("camPos",l[0],l[1],l[2])}t.tris.getVAO().bind(),t.context.drawArrays(t.context.TRIANGLES,0,t.tris.getCABO().getElementCount()),t.tris.getVAO().release(),t.openGLTexture.deactivate()}},e.updateBufferObjects=function(){if(!t.tris.getCABO().getElementCount()){for(var e=new Float32Array(12),r=0;r<4;r++)e[3*r]=r%2*2-1,e[3*r+1]=r>1?1:-1,e[3*r+2]=1;var n=re.ZP.newInstance({numberOfComponents:3,values:e});n.setName("points");var a=new Uint16Array(8);a[0]=3,a[1]=0,a[2]=1,a[3]=3,a[4]=3,a[5]=0,a[6]=3,a[7]=2;var o=re.ZP.newInstance({numberOfComponents:1,values:a});t.tris.getCABO().createVBO(o,"polys",ur.hX.SURFACE,{points:n,cellOffset:0})}t.renderable.getFormat()!==t.lastFormat&&(t.lastFormat=t.renderable.getFormat(),"box"===t.lastFormat&&t.tris.setProgram(t._openGLRenderWindow.getShaderCache().readyShaderProgramArray("//VTK::System::Dec\n attribute vec3 vertexMC;\n uniform mat4 IMCPCMatrix;\n varying vec3 TexCoords;\n void main () {\n gl_Position = vec4(vertexMC.xyz, 1.0);\n vec4 wpos = IMCPCMatrix * gl_Position;\n TexCoords = wpos.xyz/wpos.w;\n }","//VTK::System::Dec\n //VTK::Output::Dec\n varying vec3 TexCoords;\n uniform samplerCube sbtexture;\n uniform vec3 camPos;\n void main () {\n // skybox looks from inside out\n // which means we have to adjust\n // our tcoords. Otherwise text would\n // be flipped\n vec3 tc = normalize(TexCoords - camPos);\n if (abs(tc.z) < max(abs(tc.x),abs(tc.y)))\n {\n tc = vec3(1.0, 1.0, -1.0) * tc;\n }\n else\n {\n tc = vec3(-1.0, 1.0, 1.0) * tc;\n }\n gl_FragData[0] = textureCube(sbtexture, tc);\n }","")),"background"===t.lastFormat&&t.tris.setProgram(t._openGLRenderWindow.getShaderCache().readyShaderProgramArray("//VTK::System::Dec\n attribute vec3 vertexMC;\n uniform mat4 IMCPCMatrix;\n varying vec2 TexCoords;\n void main () {\n gl_Position = vec4(vertexMC.xyz, 1.0);\n vec4 wpos = IMCPCMatrix * gl_Position;\n TexCoords = vec2(vertexMC.x, vertexMC.y)*0.5 + 0.5;\n }","//VTK::System::Dec\n //VTK::Output::Dec\n varying vec2 TexCoords;\n uniform sampler2D sbtexture;\n void main () {\n gl_FragData[0] = texture2D(sbtexture, TexCoords);\n }","")),t.tris.getShaderSourceTime().modified(),t.tris.getVAO().bind(),t.tris.getVAO().addAttributeArray(t.tris.getProgram(),t.tris.getCABO(),"vertexMC",t.tris.getCABO().getVertexOffset(),t.tris.getCABO().getStride(),t.context.FLOAT,3,t.context.FALSE)||hl("Error setting vertexMC in shader VAO."));var i=t.renderable.getTextures();i.length||hl("vtkSkybox requires a texture map"),t.openGLTexture.getRenderable()!==i[0]&&(t.openGLTexture.releaseGraphicsResources(t._openGLRenderWindow),t.openGLTexture.setRenderable(i[0]))}}(e,t)}var bl=(0,ht.WL)(yl),Tl={newInstance:bl,extend:yl};wt("vtkSkybox",bl);var Cl="//VTK::System::Dec\n\n/*=========================================================================\n\n Program: Visualization Toolkit\n Module: vtkSphereMapperVS.glsl\n\n Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen\n All rights reserved.\n See Copyright.txt or http://www.kitware.com/Copyright.htm for details.\n\n This software is distributed WITHOUT ANY WARRANTY; without even\n the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR\n PURPOSE. See the above copyright notice for more information.\n\n=========================================================================*/\n// this shader implements imposters in OpenGL for Spheres\n\nattribute vec4 vertexMC;\nattribute vec2 offsetMC;\n\n// optional normal declaration\n//VTK::Normal::Dec\n\n//VTK::Picking::Dec\n\n// Texture coordinates\n//VTK::TCoord::Dec\n\nuniform mat3 normalMatrix; // transform model coordinate directions to view coordinates\n\n// material property values\n//VTK::Color::Dec\n\n// clipping plane vars\n//VTK::Clip::Dec\n\n// camera and actor matrix values\n//VTK::Camera::Dec\n\nvarying vec4 vertexVCVSOutput;\nvarying float radiusVCVSOutput;\nvarying vec3 centerVCVSOutput;\n\nuniform int cameraParallel;\nuniform float scaleFactor;\n\nvoid main()\n{\n //VTK::Picking::Impl\n\n //VTK::Color::Impl\n\n //VTK::Normal::Impl\n\n //VTK::TCoord::Impl\n\n //VTK::Clip::Impl\n\n // compute the projected vertex position\n vec2 scaledOffsetMC = scaleFactor * offsetMC;\n vertexVCVSOutput = MCVCMatrix * vertexMC;\n centerVCVSOutput = vertexVCVSOutput.xyz;\n radiusVCVSOutput = length(scaledOffsetMC)*0.5;\n\n // make the triangle face the camera\n if (cameraParallel == 0)\n {\n vec3 dir = normalize(-vertexVCVSOutput.xyz);\n vec3 base2 = normalize(cross(dir,vec3(1.0,0.0,0.0)));\n vec3 base1 = cross(base2,dir);\n vertexVCVSOutput.xyz = vertexVCVSOutput.xyz + scaledOffsetMC.x*base1 + scaledOffsetMC.y*base2;\n }\n else\n {\n // add in the offset\n vertexVCVSOutput.xy = vertexVCVSOutput.xy + scaledOffsetMC;\n }\n\n gl_Position = VCPCMatrix * vertexVCVSOutput;\n}\n";function xl(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}var Sl=ht.E0;function Pl(e,t){t.classHierarchy.push("vtkOpenGLSphereMapper");var r=function(e){for(var t=1;t radiusVCVSOutput*3.0) {\n"," EyePos = vertexVC.xyz - EyeDir*3.0*radiusVCVSOutput; }\n"," }\n"," EyePos = EyePos - centerVCVSOutput;\n"," EyePos = EyePos/radiusVCVSOutput;\n"," float b = 2.0*dot(EyePos,EyeDir);\n"," float c = dot(EyePos,EyePos) - 1.0;\n"," float d = b*b - 4.0*c;\n"," vec3 normalVCVSOutput = vec3(0.0,0.0,1.0);\n"," if (d < 0.0) { discard; }\n"," else {\n"," float t = (-b - invertedDepth*sqrt(d))*0.5;\n"," normalVCVSOutput = invertedDepth*normalize(EyePos + t*EyeDir);\n"," vertexVC.xyz = normalVCVSOutput*radiusVCVSOutput + centerVCVSOutput;\n"," }\n"," vec4 pos = VCPCMatrix * vertexVC;\n",s]).result,i=Sr.substitute(i,"//VTK::Normal::Impl","").result,t.haveSeenDepthRequest&&(i=Sr.substitute(i,"//VTK::ZBuffer::Impl",["if (depthRequest == 1) {","float computedZ = (pos.z / pos.w + 1.0) / 2.0;","float iz = floor(computedZ * 65535.0 + 0.1);","float rf = floor(iz/256.0)/255.0;","float gf = mod(iz,256.0)/255.0;","gl_FragData[0] = vec4(rf, gf, 0.0, 1.0); }"]).result),e.Vertex=o,e.Fragment=i,r.replaceShaderValues(e,n,a)},e.setMapperShaderParameters=function(e,n,a){if(e.getCABO().getElementCount()&&(t.VBOBuildTime>e.getAttributeUpdateTime().getMTime()||e.getShaderSourceTime().getMTime()>e.getAttributeUpdateTime().getMTime())&&e.getProgram().isAttributeUsed("offsetMC")&&(e.getVAO().addAttributeArray(e.getProgram(),e.getCABO(),"offsetMC",12,e.getCABO().getStride(),t.context.FLOAT,2,!1)||Sl("Error setting 'offsetMC' in shader VAO.")),e.getProgram().isUniformUsed("invertedDepth")&&e.getProgram().setUniformf("invertedDepth",t.invert?-1:1),e.getProgram().isUniformUsed("scaleFactor")){var o=t.currentInput.getPointData();null!=t.renderable.getScaleArray()&&o.hasArray(t.renderable.getScaleArray())?e.getProgram().setUniformf("scaleFactor",t.renderable.getScaleFactor()):e.getProgram().setUniformf("scaleFactor",1)}r.setMapperShaderParameters(e,n,a)},e.setCameraShaderParameters=function(e,r,n){var a=e.getProgram(),o=r.getActiveCamera(),i=t.openGLCamera.getKeyMatrices(r);if(a.isUniformUsed("VCPCMatrix")&&a.setUniformMatrix("VCPCMatrix",i.vcpc),a.isUniformUsed("MCVCMatrix"))if(n.getIsIdentity())a.setUniformMatrix("MCVCMatrix",i.wcvc);else{var s=t.openGLActor.getKeyMatrices(),l=new Float64Array(16);ot._E.multiply(l,i.wcvc,s.mcwc),a.setUniformMatrix("MCVCMatrix",l)}a.isUniformUsed("cameraParallel")&&e.getProgram().setUniformi("cameraParallel",o.getParallelProjection())},e.getOpenGLMode=function(e,r){return t.context.TRIANGLES},e.buildBufferObjects=function(e,r){var n=t.currentInput;if(null!==n){t.renderable.mapScalars(n,1);var a=t.renderable.getColorMapColors(),o=t.primitives[t.primTypes.Tris].getCABO(),i=n.getPointData(),s=n.getPoints(),l=s.getNumberOfPoints(),c=s.getData(),u=null;null!=t.renderable.getScaleArray()&&i.hasArray(t.renderable.getScaleArray())&&(u=i.getArray(t.renderable.getScaleArray()).getData());var d=null,f=0,p=null;a?(f=a.getNumberOfComponents(),o.setColorOffset(0),o.setColorBOStride(4),d=a.getData(),p=new Uint8Array(3*l*4),o.getColorBO()||o.setColorBO(cr.newInstance()),o.getColorBO().setOpenGLRenderWindow(t._openGLRenderWindow)):o.getColorBO()&&o.setColorBO(null),o.setColorComponents(f);var g=new Float32Array(5*l*3);o.setStride(20);for(var m=Math.cos((0,Mr.r)(30)),h=0,v=0,y=0,b=0,T=0;T2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,wl,r),nl.extend(e,t,r),Pl(e,t)}var Il=(0,ht.WL)(Ol,"vtkOpenGLSphereMapper"),Al={newInstance:Il,extend:Ol};wt("vtkSphereMapper",Il);var Rl="//VTK::System::Dec\n\n/*=========================================================================\n\n Program: Visualization Toolkit\n Module: vtkStickMapperVS.glsl\n\n Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen\n All rights reserved.\n See Copyright.txt or http://www.kitware.com/Copyright.htm for details.\n\n This software is distributed WITHOUT ANY WARRANTY; without even\n the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR\n PURPOSE. See the above copyright notice for more information.\n\n=========================================================================*/\n// this shader implements imposters in OpenGL for Sticks\n\nattribute vec4 vertexMC;\nattribute vec3 orientMC;\nattribute vec4 offsetMC;\nattribute float radiusMC;\n\n// optional normal declaration\n//VTK::Normal::Dec\n\n//VTK::Picking::Dec\n\n// Texture coordinates\n//VTK::TCoord::Dec\n\nuniform mat3 normalMatrix; // transform model coordinate directions to view coordinates\n\n// material property values\n//VTK::Color::Dec\n\n// clipping plane vars\n//VTK::Clip::Dec\n\n// camera and actor matrix values\n//VTK::Camera::Dec\n\nvarying vec4 vertexVCVSOutput;\nvarying float radiusVCVSOutput;\nvarying float lengthVCVSOutput;\nvarying vec3 centerVCVSOutput;\nvarying vec3 orientVCVSOutput;\n\nuniform int cameraParallel;\n\nvoid main()\n{\n //VTK::Picking::Impl\n\n //VTK::Color::Impl\n\n //VTK::Normal::Impl\n\n //VTK::TCoord::Impl\n\n //VTK::Clip::Impl\n\n vertexVCVSOutput = MCVCMatrix * vertexMC;\n centerVCVSOutput = vertexVCVSOutput.xyz;\n radiusVCVSOutput = radiusMC;\n lengthVCVSOutput = length(orientMC);\n orientVCVSOutput = normalMatrix * normalize(orientMC);\n\n // make sure it is pointing out of the screen\n if (orientVCVSOutput.z < 0.0)\n {\n orientVCVSOutput = -orientVCVSOutput;\n }\n\n // make the basis\n vec3 xbase;\n vec3 ybase;\n vec3 dir = vec3(0.0,0.0,1.0);\n if (cameraParallel == 0)\n {\n dir = normalize(-vertexVCVSOutput.xyz);\n }\n if (abs(dot(dir,orientVCVSOutput)) == 1.0)\n {\n xbase = normalize(cross(vec3(0.0,1.0,0.0),orientVCVSOutput));\n ybase = cross(xbase,orientVCVSOutput);\n }\n else\n {\n xbase = normalize(cross(orientVCVSOutput,dir));\n ybase = cross(orientVCVSOutput,xbase);\n }\n\n vec3 offsets = offsetMC.xyz*2.0-1.0;\n vertexVCVSOutput.xyz = vertexVCVSOutput.xyz +\n radiusVCVSOutput*offsets.x*xbase +\n radiusVCVSOutput*offsets.y*ybase +\n 0.5*lengthVCVSOutput*offsets.z*orientVCVSOutput;\n\n gl_Position = VCPCMatrix * vertexVCVSOutput;\n}\n";function El(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}var Ml=ht.E0;function Dl(e,t){t.classHierarchy.push("vtkOpenGLStickMapper");var r=function(e){for(var t=1;t radiusVCVSOutput*3.0) {\n"," EyePos = vertexVC.xyz - EyeDir*3.0*radiusVCVSOutput; }\n"," }\n"," EyePos = EyePos - centerVCVSOutput;\n"," vec3 base1;\n"," if (abs(orientVCVSOutput.z) < 0.99) {\n"," base1 = normalize(cross(orientVCVSOutput,vec3(0.0,0.0,1.0))); }\n"," else {\n"," base1 = normalize(cross(orientVCVSOutput,vec3(0.0,1.0,0.0))); }\n"," vec3 base2 = cross(orientVCVSOutput,base1);\n"," EyePos = vec3(dot(EyePos,base1),dot(EyePos,base2),dot(EyePos,orientVCVSOutput));\n"," EyeDir = vec3(dot(EyeDir,base1),dot(EyeDir,base2),dot(EyeDir,orientVCVSOutput));\n"," EyePos = EyePos/radiusVCVSOutput;\n"," float a = EyeDir.x*EyeDir.x + EyeDir.y*EyeDir.y;\n"," float b = 2.0*(EyePos.x*EyeDir.x + EyePos.y*EyeDir.y);\n"," float c = EyePos.x*EyePos.x + EyePos.y*EyePos.y - 1.0;\n"," float d = b*b - 4.0*a*c;\n"," vec3 normalVCVSOutput = vec3(0.0,0.0,1.0);\n"," if (d < 0.0) { discard; }\n"," else {\n"," float t = (-b - sqrt(d))/(2.0*a);\n"," float tz = EyePos.z + t*EyeDir.z;\n"," vec3 iPoint = EyePos + t*EyeDir;\n"," if (abs(iPoint.z)*radiusVCVSOutput > lengthVCVSOutput*0.5) {\n"," float t2 = (-b + sqrt(d))/(2.0*a);\n"," float tz2 = EyePos.z + t2*EyeDir.z;\n"," if (tz2*radiusVCVSOutput > lengthVCVSOutput*0.5 || tz*radiusVCVSOutput < -0.5*lengthVCVSOutput) { discard; }\n"," else {\n"," normalVCVSOutput = orientVCVSOutput;\n"," float t3 = (lengthVCVSOutput*0.5/radiusVCVSOutput - EyePos.z)/EyeDir.z;\n"," iPoint = EyePos + t3*EyeDir;\n"," vertexVC.xyz = radiusVCVSOutput*(iPoint.x*base1 + iPoint.y*base2 + iPoint.z*orientVCVSOutput) + centerVCVSOutput;\n"," }\n"," }\n"," else {\n"," normalVCVSOutput = iPoint.x*base1 + iPoint.y*base2;\n"," vertexVC.xyz = radiusVCVSOutput*(normalVCVSOutput + iPoint.z*orientVCVSOutput) + centerVCVSOutput;\n"," }\n"," }\n"," vec4 pos = VCPCMatrix * vertexVC;\n",s]).result,i=Sr.substitute(i,"//VTK::Normal::Impl","").result,t.haveSeenDepthRequest&&(i=Sr.substitute(i,"//VTK::ZBuffer::Impl",["if (depthRequest == 1) {","float computedZ = (pos.z / pos.w + 1.0) / 2.0;","float iz = floor(computedZ * 65535.0 + 0.1);","float rf = floor(iz/256.0)/255.0;","float gf = mod(iz,256.0)/255.0;","gl_FragData[0] = vec4(rf, gf, 0.0, 1.0); }"]).result),e.Vertex=o,e.Fragment=i,r.replaceShaderValues(e,n,a)},e.setMapperShaderParameters=function(e,n,a){e.getCABO().getElementCount()&&(t.VBOBuildTime>e.getAttributeUpdateTime().getMTime()||e.getShaderSourceTime().getMTime()>e.getAttributeUpdateTime().getMTime())&&(e.getProgram().isAttributeUsed("orientMC")&&(e.getVAO().addAttributeArray(e.getProgram(),e.getCABO(),"orientMC",12,e.getCABO().getStride(),t.context.FLOAT,3,!1)||Ml("Error setting 'orientMC' in shader VAO.")),e.getProgram().isAttributeUsed("offsetMC")&&(e.getVAO().addAttributeArray(e.getProgram(),e.getCABO().getColorBO(),"offsetMC",0,e.getCABO().getColorBOStride(),t.context.UNSIGNED_BYTE,3,!0)||Ml("Error setting 'offsetMC' in shader VAO.")),e.getProgram().isAttributeUsed("radiusMC")&&(e.getVAO().addAttributeArray(e.getProgram(),e.getCABO(),"radiusMC",24,e.getCABO().getStride(),t.context.FLOAT,1,!1)||Ml("Error setting 'radiusMC' in shader VAO."))),r.setMapperShaderParameters(e,n,a)},e.setCameraShaderParameters=function(e,r,n){var a=e.getProgram(),o=r.getActiveCamera(),i=t.openGLCamera.getKeyMatrices(r);if(a.isUniformUsed("VCPCMatrix")&&a.setUniformMatrix("VCPCMatrix",i.vcpc),n.getIsIdentity())a.isUniformUsed("MCVCMatrix")&&a.setUniformMatrix("MCVCMatrix",i.wcvc),a.isUniformUsed("normalMatrix")&&a.setUniformMatrix3x3("normalMatrix",i.normalMatrix);else{var s=t.openGLActor.getKeyMatrices();if(a.isUniformUsed("MCVCMatrix")){var l=new Float64Array(16);ot._E.multiply(l,i.wcvc,s.mcwc),a.setUniformMatrix("MCVCMatrix",l)}if(a.isUniformUsed("normalMatrix")){var c=new Float64Array(9);ot.wO.multiply(c,i.normalMatrix,s.normalMatrix),a.setUniformMatrix3x3("normalMatrix",c)}}a.isUniformUsed("cameraParallel")&&e.getProgram().setUniformi("cameraParallel",o.getParallelProjection())},e.getOpenGLMode=function(e,r){return t.context.TRIANGLES},e.buildBufferObjects=function(e,r){var n=t.currentInput;if(null!==n){t.renderable.mapScalars(n,1);var a=t.renderable.getColorMapColors(),o=t.primitives[t.primTypes.Tris].getCABO(),i=n.getPointData(),s=n.getPoints(),l=s.getNumberOfPoints(),c=s.getData();4;var u=null,d=0;o.setColorBOStride(4),o.getColorBO()||o.setColorBO(cr.newInstance()),o.getColorBO().setOpenGLRenderWindow(t._openGLRenderWindow),a&&(d=a.getNumberOfComponents(),o.setColorOffset(4),u=a.getData(),o.setColorBOStride(8)),o.setColorComponents(d),o.setStride(28);var f=new Float32Array(7*l*12),p=new Uint8Array(12*l*(u?8:4)),g=null,m=null;null!=t.renderable.getScaleArray()&&i.hasArray(t.renderable.getScaleArray())&&(g=i.getArray(t.renderable.getScaleArray()).getData()),null!=t.renderable.getOrientationArray()&&i.hasArray(t.renderable.getOrientationArray())?m=i.getArray(t.renderable.getOrientationArray()).getData():Ml(["Error setting orientationArray.\n","You have to specify the stick orientation"]);for(var h=[0,1,3,0,3,2,2,3,5,2,5,4],v=0,y=0,b=0,T=0,C=0;C=4?255:0,p[T++]=h[P]>=2?255:0,p[T++]=255,y=C*d,u&&(p[T++]=u[y],p[T++]=u[y+1],p[T++]=u[y+2],p[T++]=u[y+3])}o.setElementCount(b/7),o.upload(f,rr.ARRAY_BUFFER),o.getColorBO().upload(p,rr.ARRAY_BUFFER),t.VBOBuildTime.modified()}}}var Vl={};function Ll(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,Vl,r),nl.extend(e,t,r),Dl(e,t)}var _l=(0,ht.WL)(Ll,"vtkOpenGLStickMapper"),Nl={newInstance:_l,extend:Ll};wt("vtkStickMapper",_l);const{vtkWarningMacro:Bl}=ht.default;const Fl={};function Ul(e,t,r={}){Object.assign(t,Fl,r),Hn.extend(e,t,r),t.scalarTexture=r.scalarTexture,t.previousState={},function(e,t){t.classHierarchy.push("vtkStreamingOpenGLVolumeMapper"),e.buildBufferObjects=(e,r)=>{const n=t.currentInput;if(!n)return;const a=n.getPointData()&&n.getPointData().getScalars();if(!a)return;const o=r.getProperty();if(!t.jitterTexture.getHandle()){const e=new Uint8Array(1024);for(let t=0;t<1024;++t)e[t]=255*Math.random();t.jitterTexture.setMinificationFilter(Vr.LINEAR),t.jitterTexture.setMagnificationFilter(Vr.LINEAR),t.jitterTexture.create2DFromRaw(32,32,1,nn.Tu.UNSIGNED_CHAR,e)}const i=a.getNumberOfComponents(),s=o.getIndependentComponents()?i:1;let l=`${o.getMTime()}`;if(t.opacityTextureString!==l){const e=1024,r=2*e*s,n=new Float32Array(r),a=new Float32Array(e);for(let r=0;r1?1:-1,e[3*t+2]=-1;const r=new Uint16Array(8);r[0]=3,r[1]=0,r[2]=1,r[3]=3,r[4]=3,r[5]=0,r[6]=3,r[7]=2;const n=re.ZP.newInstance({numberOfComponents:3,values:e});n.setName("points");const a=re.ZP.newInstance({numberOfComponents:1,values:r});t.tris.getCABO().createVBO(a,"polys",ur.hX.SURFACE,{points:n,cellOffset:0})}t.VBOBuildTime.modified()},e.getRenderTargetSize=()=>{if(t._useSmallViewport)return[t._smallViewportWidth,t._smallViewportHeight];const{usize:e,vsize:r}=t._openGLRenderer.getTiledSizeAndOrigin();return[e,r]},e.getRenderTargetOffset=()=>{const{lowerLeftU:e,lowerLeftV:r}=t._openGLRenderer.getTiledSizeAndOrigin();return[e,r]}}(e,t)}const kl={newInstance:ht.default.newInstance(Ul,"vtkStreamingOpenGLVolumeMapper"),extend:Ul};const Gl={};function Wl(e,t,r={}){Object.assign(t,Gl,r),St.extend(e,t,r),function(e,t){t.classHierarchy.push("vtkStreamingOpenGLViewNodeFactory"),e.createNode=r=>{if(r.isDeleted())return null;let n=0,a=r.getClassName(n++),o=!1;const i=Object.keys(t.overrides);for(;a&&!o;)-1!==i.indexOf(a)?o=!0:a=r.getClassName(n++);if(!o)return null;const s=t.getModelInitialValues(r),l=t.overrides[a](s);return l.setMyFactory(e),l},t.getModelInitialValues=e=>{const t={};return"vtkSharedVolumeMapper"===e.getClassName()&&(t.scalarTexture=e.getScalarTexture()),t}}(e,t),e.registerOverride("vtkActor",Vs.newInstance),e.registerOverride("vtkActor2D",Bs.newInstance),e.registerOverride("vtkCamera",Dt.newInstance),e.registerOverride("vtkGlyph3DMapper",ml.newInstance),e.registerOverride("vtkImageMapper",Cn.newInstance),e.registerOverride("vtkImageSlice",wn.newInstance),e.registerOverride("vtkMapper",nl.newInstance),e.registerOverride("vtkPixelSpaceCallbackMapper",Yn.newInstance),e.registerOverride("vtkRenderer",Bt.newInstance),e.registerOverride("vtkSkybox",Tl.newInstance),e.registerOverride("vtkSphereMapper",Al.newInstance),e.registerOverride("vtkStickMapper",Nl.newInstance),e.registerOverride("vtkTexture",Yr.newInstance),e.registerOverride("vtkVolume",Rn.newInstance),e.registerOverride("vtkVolumeMapper",Hn.newInstance),e.registerOverride("vtkSharedVolumeMapper",kl.newInstance)}const zl={newInstance:ht.default.newInstance(Wl,"vtkStreamingOpenGLViewNodeFactory"),extend:Wl};function jl(e,t,r={}){Object.assign(t,r),Rs.extend(e,t,r),t.myFactory=zl.newInstance(),t.myFactory.registerOverride("vtkRenderWindow",Hl),function(e,t){t.classHierarchy.push("vtkStreamingOpenGLRenderWindow")}(0,t)}const Hl=ht.default.newInstance(jl,"vtkStreamingOpenGLRenderWindow"),Kl={newInstance:Hl,extend:jl};var Zl=r(32198),Xl={Device:{Unknown:0,LeftController:1,RightController:2},Input:{Unknown:0,Trigger:1,TrackPad:2,Grip:3,Thumbstick:4,A:5,B:6,ApplicationMenu:7},Axis:{Unknown:0,TouchpadX:1,TouchpadY:2,ThumbstickX:3,ThumbstickY:4}};function ql(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function Yl(e){for(var t=1;t2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,lc,r),ht.default.obj(e,t),t._animationExtendedEnd=0,ht.default.event(e,t,"RenderEvent"),oc.forEach((function(r){return ht.default.event(e,t,r)})),ht.default.get(e,t,["initialized","container","interactorStyle","lastFrameTime","recentAnimationFrameRate","_view"]),ht.default.setGet(e,t,["lightFollowCamera","enabled","enableRender","recognizeGestures","desiredUpdateRate","stillUpdateRate","picker","preventDefaultOnPointerDown","preventDefaultOnPointerUp","mouseScrollDebounceByPass"]),ht.default.moveToProtected(e,t,["view"]),function(e,t){t.classHierarchy.push("vtkRenderWindowInteractor");var r=new Set,n=new Map,a=1;function o(r,n){t._forcedRenderer||(t.currentRenderer=e.findPokedRenderer(r,n))}function i(e){var r=t._view.getCanvas(),a=r.getBoundingClientRect(),i=r.width/a.width,s=r.height/a.height,l={x:i*(e.clientX-a.left),y:s*(a.height-e.clientY+a.top),z:0};return(n.size<=1||!t.currentRenderer)&&o(l.x,l.y),l}function s(e){return{controlKey:e.ctrlKey,altKey:e.altKey,shiftKey:e.shiftKey}}function l(e){var t=s(e);return Yl({key:e.key,keyCode:e.charCode},t)}function c(e){return e.pointerType||""}function u(){t._view&&t.enabled&&t.enableRender&&(t.inRender=!0,t._view.traverseAllPasses(),t.inRender=!1),e.invokeRenderEvent()}e.start=function(){(t.initialized||(e.initialize(),t.initialized))&&e.startEventLoop()},e.setRenderWindow=function(e){ec("you want to call setView(view) instead of setRenderWindow on a vtk.js interactor")},e.setInteractorStyle=function(r){t.interactorStyle!==r&&(null!=t.interactorStyle&&t.interactorStyle.setInteractor(null),t.interactorStyle=r,null!=t.interactorStyle&&t.interactorStyle.getInteractor()!==e&&t.interactorStyle.setInteractor(e))},e.initialize=function(){t.initialized=!0,e.enable(),e.render()},e.enable=function(){return e.setEnabled(!0)},e.disable=function(){return e.setEnabled(!1)},e.startEventLoop=function(){return Jl("empty event loop")},e.getCurrentRenderer=function(){return t.currentRenderer||o(0,0),t.currentRenderer},e.bindEvents=function(r){t.container=r,r.addEventListener("contextmenu",ic),r.addEventListener("wheel",e.handleWheel),r.addEventListener("DOMMouseScroll",e.handleWheel),r.addEventListener("pointerenter",e.handlePointerEnter),r.addEventListener("pointerleave",e.handlePointerLeave),r.addEventListener("pointermove",e.handlePointerMove,{passive:!1}),r.addEventListener("pointerdown",e.handlePointerDown,{passive:!1}),r.addEventListener("pointerup",e.handlePointerUp),r.addEventListener("pointercancel",e.handlePointerCancel),document.addEventListener("keypress",e.handleKeyPress),document.addEventListener("keydown",e.handleKeyDown),document.addEventListener("keyup",e.handleKeyUp),document.addEventListener("pointerlockchange",e.handlePointerLockChange),r.style.touchAction="none",r.style.userSelect="none",r.style.webkitTapHighlightColor="rgba(0,0,0,0)"},e.unbindEvents=function(){var r=t.container;r.removeEventListener("contextmenu",ic),r.removeEventListener("wheel",e.handleWheel),r.removeEventListener("DOMMouseScroll",e.handleWheel),r.removeEventListener("pointerenter",e.handlePointerEnter),r.removeEventListener("pointerleave",e.handlePointerLeave),r.removeEventListener("pointermove",e.handlePointerMove,{passive:!1}),r.removeEventListener("pointerdown",e.handlePointerDown,{passive:!1}),r.removeEventListener("pointerup",e.handlePointerUp),r.removeEventListener("pointercancel",e.handlePointerCancel),document.removeEventListener("keypress",e.handleKeyPress),document.removeEventListener("keydown",e.handleKeyDown),document.removeEventListener("keyup",e.handleKeyUp),document.removeEventListener("pointerlockchange",e.handlePointerLockChange),t.container=null,n.clear()},e.handleKeyPress=function(t){var r=l(t);e.keyPressEvent(r)},e.handleKeyDown=function(t){var r=l(t);e.keyDownEvent(r)},e.handleKeyUp=function(t){var r=l(t);e.keyUpEvent(r)},e.handlePointerEnter=function(t){var r=Yl(Yl({},s(t)),{},{position:i(t),deviceType:c(t)});e.pointerEnterEvent(r),"mouse"===r.deviceType&&e.mouseEnterEvent(r)},e.handlePointerLeave=function(t){var r=Yl(Yl({},s(t)),{},{position:i(t),deviceType:c(t)});e.pointerLeaveEvent(r),"mouse"===r.deviceType&&e.mouseLeaveEvent(r)},e.handlePointerDown=function(r){if(!(r.button>2||e.isPointerLocked()))switch(t.preventDefaultOnPointerDown&&ic(r),r.target.hasPointerCapture(r.pointerId)&&r.target.releasePointerCapture(r.pointerId),t.container.setPointerCapture(r.pointerId),n.has(r.pointerId)&&Jl("[RenderWindowInteractor] duplicate pointerId detected"),n.set(r.pointerId,{pointerId:r.pointerId,position:i(r)}),r.pointerType){case"pen":case"touch":e.handleTouchStart(r);break;default:e.handleMouseDown(r)}},e.handlePointerUp=function(r){if(n.has(r.pointerId))switch(t.preventDefaultOnPointerUp&&ic(r),n.delete(r.pointerId),t.container.releasePointerCapture(r.pointerId),r.pointerType){case"pen":case"touch":e.handleTouchEnd(r);break;default:e.handleMouseUp(r)}},e.handlePointerCancel=function(t){if(n.has(t.pointerId))switch(n.delete(t.pointerId),t.pointerType){case"pen":case"touch":e.handleTouchEnd(t);break;default:e.handleMouseUp(t)}},e.handlePointerMove=function(t){switch(n.has(t.pointerId)&&(n.get(t.pointerId).position=i(t)),t.pointerType){case"pen":case"touch":e.handleTouchMove(t);break;default:e.handleMouseMove(t)}},e.handleMouseDown=function(t){var r=Yl(Yl({},s(t)),{},{position:i(t),deviceType:c(t)});switch(t.button){case 0:e.leftButtonPressEvent(r);break;case 1:e.middleButtonPressEvent(r);break;case 2:e.rightButtonPressEvent(r);break;default:ec("Unknown mouse button pressed: ".concat(t.button))}},e.requestPointerLock=function(){t.container&&t.container.requestPointerLock()},e.exitPointerLock=function(){return document.exitPointerLock()},e.isPointerLocked=function(){return!!t.container&&document.pointerLockElement===t.container},e.handlePointerLockChange=function(){e.isPointerLocked()?e.startPointerLockEvent():e.endPointerLockEvent()},e.requestAnimation=function(n){void 0!==n?r.has(n)?Jl("requester is already registered for animating"):(r.add(n),t.animationRequest||1!==r.size||t.xrAnimation||(t._animationStartTime=Date.now(),t._animationFrameCount=0,t.animationRequest=requestAnimationFrame(e.handleAnimation),e.startAnimationEvent())):ec("undefined requester, can not start animating")},e.extendAnimation=function(n){var a=Date.now()+n;t._animationExtendedEnd=Math.max(t._animationExtendedEnd,a),t.animationRequest||0!==r.size||t.xrAnimation||(t._animationStartTime=Date.now(),t._animationFrameCount=0,t.animationRequest=requestAnimationFrame(e.handleAnimation),e.startAnimationEvent())},e.isAnimating=function(){return t.xrAnimation||null!==t.animationRequest},e.cancelAnimation=function(n){var a=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(r.has(n))r.delete(n),t.animationRequest&&0===r.size&&Date.now()>t._animationExtendedEnd&&(cancelAnimationFrame(t.animationRequest),t.animationRequest=null,e.endAnimationEvent(),e.render());else if(!a){var o=n&&n.getClassName?n.getClassName():n;Jl("".concat(o," did not request an animation"))}},e.switchToXRAnimation=function(){t.animationRequest&&(cancelAnimationFrame(t.animationRequest),t.animationRequest=null),t.xrAnimation=!0},e.returnFromXRAnimation=function(){t.xrAnimation=!1,0!==r.size&&(t.recentAnimationFrameRate=10,t.animationRequest=requestAnimationFrame(e.handleAnimation))},e.updateXRGamepads=function(r,n,a){r.inputSources.forEach((function(r){var o=null==r.gripSpace?null:n.getPose(r.gripSpace,a),i=r.gamepad,s=r.handedness;if(i){i.index in t.lastGamepadValues||(t.lastGamepadValues[i.index]={left:{buttons:{}},right:{buttons:{}},none:{buttons:{}}});for(var l=0;l1e3&&t._animationFrameCount>1&&(t.recentAnimationFrameRate=1e3*(t._animationFrameCount-1)/(n-t._animationStartTime),t.lastFrameTime=1/t.recentAnimationFrameRate,e.animationFrameRateUpdateEvent(),t._animationStartTime=n,t._animationFrameCount=1),e.animationEvent(),u(),r.size>0||Date.now()=.3?Math.abs(n.spinY):1),n.spinY/=a,0===t.wheelTimeoutID?(e.startMouseWheelEvent(n),e.mouseWheelEvent(n)):(e.mouseWheelEvent(n),clearTimeout(t.wheelTimeoutID)),t.mouseScrollDebounceByPass?(e.extendAnimation(600),e.endMouseWheelEvent(),t.wheelTimeoutID=0):t.wheelTimeoutID=setTimeout((function(){e.extendAnimation(600),e.endMouseWheelEvent(),t.wheelTimeoutID=0}),200)},e.handleMouseUp=function(t){var r=Yl(Yl({},s(t)),{},{position:i(t),deviceType:c(t)});switch(t.button){case 0:e.leftButtonReleaseEvent(r);break;case 1:e.middleButtonReleaseEvent(r);break;case 2:e.rightButtonReleaseEvent(r);break;default:ec("Unknown mouse button released: ".concat(t.button))}},e.handleTouchStart=function(r){var a=(0,pa.Z)(n.values());if(t.recognizeGestures&&a.length>1){var o=sc(n);if(2===a.length){var l=Yl(Yl({},s(nc)),{},{position:a[0].position,deviceType:c(r)});e.leftButtonReleaseEvent(l)}e.recognizeGesture("TouchStart",o)}else if(1===a.length){var u=Yl(Yl({},s(nc)),{},{position:i(r),deviceType:c(r)});e.leftButtonPressEvent(u)}},e.handleTouchMove=function(r){var a=(0,pa.Z)(n.values());if(t.recognizeGestures&&a.length>1){var o=sc(n);e.recognizeGesture("TouchMove",o)}else if(1===a.length){var i=Yl(Yl({},s(nc)),{},{position:a[0].position,deviceType:c(r)});e.mouseMoveEvent(i)}},e.handleTouchEnd=function(r){var a=(0,pa.Z)(n.values());if(t.recognizeGestures)if(0===a.length){var o=Yl(Yl({},s(nc)),{},{position:i(r),deviceType:c(r)});e.leftButtonReleaseEvent(o)}else if(1===a.length){var l=sc(n);e.recognizeGesture("TouchEnd",l);var u=Yl(Yl({},s(nc)),{},{position:a[0].position,deviceType:c(r)});e.leftButtonPressEvent(u)}else{var d=sc(n);e.recognizeGesture("TouchMove",d)}else if(1===a.length){var f=Yl(Yl({},s(nc)),{},{position:a[0].position,deviceType:c(r)});e.leftButtonReleaseEvent(f)}},e.setView=function(r){t._view!==r&&(t._view=r,t._view.getRenderable().setInteractor(e),e.modified())},e.getFirstRenderer=function(){var e,r,n;return null===(e=t._view)||void 0===e||null===(r=e.getRenderable())||void 0===r||null===(n=r.getRenderersByReference())||void 0===n?void 0:n[0]},e.findPokedRenderer=function(){var e,r,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;if(!t._view)return null;var o=null===(e=t._view)||void 0===e||null===(r=e.getRenderable())||void 0===r?void 0:r.getRenderers();if(!o||0===o.length)return null;o.sort((function(e,t){return e.getLayer()-t.getLayer()}));for(var i=null,s=null,l=null,c=o.length;c--;){var u=o[c];if(t._view.isInViewport(n,a,u)&&u.getInteractive()){l=u;break}null===i&&u.getInteractive()&&(i=u),null===s&&t._view.isInViewport(n,a,u)&&(s=u)}return null===l&&(l=i),null===l&&(l=s),null==l&&(l=o[0]),l},e.render=function(){e.isAnimating()||t.inRender||u()},oc.forEach((function(r){var n=r.charAt(0).toLowerCase()+r.slice(1);e["".concat(n,"Event")]=function(n){if(t.enabled)if(e.getCurrentRenderer()){var a=Yl({type:r,pokedRenderer:t.currentRenderer,firstRenderer:e.getFirstRenderer()},n);e["invoke".concat(r)](a)}else rc("\n Can not forward events without a current renderer on the interactor.\n ")}})),e.recognizeGesture=function(r,n){if(!(Object.keys(n).length>2)){if(t.startingEventPositions||(t.startingEventPositions={}),"TouchStart"===r)return Object.keys(n).forEach((function(e){t.startingEventPositions[e]=n[e]})),void(t.currentGesture="Start");if("TouchEnd"===r)return"Pinch"===t.currentGesture&&(e.render(),e.endPinchEvent()),"Rotate"===t.currentGesture&&(e.render(),e.endRotateEvent()),"Pan"===t.currentGesture&&(e.render(),e.endPanEvent()),t.currentGesture="Start",void(t.startingEventPositions={});var a=0,o=[],i=[];Object.keys(n).forEach((function(e){o[a]=n[e],i[a]=t.startingEventPositions[e],a++}));var s=Math.sqrt((i[0].x-i[1].x)*(i[0].x-i[1].x)+(i[0].y-i[1].y)*(i[0].y-i[1].y)),l=Math.sqrt((o[0].x-o[1].x)*(o[0].x-o[1].x)+(o[0].y-o[1].y)*(o[0].y-o[1].y)),c=(0,Mr.A)(Math.atan2(i[1].y-i[0].y,i[1].x-i[0].x)),u=(0,Mr.A)(Math.atan2(o[1].y-o[0].y,o[1].x-o[0].x)),d=u-c;u=u+180>=360?u-180:u+180,c=c+180>=360?c-180:c+180,Math.abs(u-c)p&&g>m&&g>h){t.currentGesture="Pinch";var v={scale:1,touches:n};e.startPinchEvent(v)}else if(m>p&&m>h){t.currentGesture="Rotate";var y={rotation:0,touches:n};e.startRotateEvent(y)}else if(h>p){t.currentGesture="Pan";var b={translation:[0,0],touches:n};e.startPanEvent(b)}}else{if("Rotate"===t.currentGesture){var T={rotation:d,touches:n};e.rotateEvent(T)}if("Pinch"===t.currentGesture){var C={scale:l/s,touches:n};e.pinchEvent(C)}if("Pan"===t.currentGesture){var x={translation:f,touches:n};e.panEvent(x)}}}},e.handleVisibilityChange=function(){t._animationStartTime=Date.now(),t._animationFrameCount=0},e.setCurrentRenderer=function(e){t._forcedRenderer=!!e,t.currentRenderer=e};var d=e.delete;e.delete=function(){for(;r.size;)e.cancelAnimation(r.values().next().value);void 0!==document.hidden&&document.removeEventListener("visibilitychange",e.handleVisibilityChange),t.container&&e.unbindEvents(),d()},void 0!==document.hidden&&document.addEventListener("visibilitychange",e.handleVisibilityChange,!1)}(e,t)}var uc=Yl({newInstance:ht.default.newInstance(cc,"vtkRenderWindowInteractor"),extend:cc,handledEvents:oc},Xl),dc=r(23834),fc=r(16623);const pc={background:[0,0,0],container:null};function gc(e,t,r={}){Object.assign(t,pc,r),ht.default.obj(e,t),ht.default.get(e,t,["renderWindow","openGLRenderWindow","interactor","container"]),ht.default.event(e,t,"resize"),function(e,t){const r=e.invokeResize;delete e.invokeResize,t.renderWindow=fi.newInstance(),t.rendererMap={},t.openGLRenderWindow=Kl.newInstance(),t.renderWindow.addView(t.openGLRenderWindow),t.interactor=uc.newInstance(),t.interactor.setView(t.openGLRenderWindow),t.interactor.initialize(),e.addRenderer=({viewport:e,id:r,background:n})=>{const a=Zl.ZP.newInstance({viewport:e,background:n||t.background});t.renderWindow.addRenderer(a),t.rendererMap[r]=a},e.destroy=()=>{t.renderWindow.getInteractor().delete()},e.removeRenderer=r=>{const n=e.getRenderer(r);t.renderWindow.removeRenderer(n),n.delete(),delete t.rendererMap[r]},e.getRenderer=e=>t.rendererMap[e],e.getRenderers=()=>{const{rendererMap:e}=t;return Object.keys(e).map((t=>({id:t,renderer:e[t]})))},e.resize=()=>{if(t.container){const{width:e,height:n}=t.container;t.openGLRenderWindow.setSize(Math.floor(e),Math.floor(n)),r(),t.renderWindow.render()}},e.setContainer=e=>{t.container=e,t.openGLRenderWindow.setContainer(t.container)},e.delete=ht.default.chain(e.setContainer,e.destroy,t.openGLRenderWindow.delete,e.delete),e.resize()}(e,t)}const mc={newInstance:ht.default.newInstance(gc),extend:gc};var hc=r(16595),vc=r(44031);function yc(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function bc(e){for(var t=1;t2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,Sc,r),hc.Z.extend(e,t,r),ht.default.setGet(e,t,["sampleDistance","imageSampleDistance","maximumSamplesPerRay","autoAdjustSampleDistances","blendMode","filterMode","preferSizeOverAccuracy","computeNormalFromOpacity","volumetricScatteringBlending","globalIlluminationReach","volumeShadowSamplingDistFactor","anisotropy","localAmbientOcclusion","LAOKernelSize","LAOKernelRadius"]),ht.default.setGetArray(e,t,["ipScalarRange"],2),ht.default.event(e,t,"lightingActivated"),function(e,t){t.classHierarchy.push("vtkVolumeMapper");var r=bc({},e);e.getBounds=function(){var r=e.getInputData();return r?(t.static||e.update(),t.bounds=r.getBounds()):t.bounds=(0,Mr.N)(),t.bounds},e.update=function(){e.getInputData()},e.setBlendModeToComposite=function(){e.setBlendMode(Tc.COMPOSITE_BLEND)},e.setBlendModeToMaximumIntensity=function(){e.setBlendMode(Tc.MAXIMUM_INTENSITY_BLEND)},e.setBlendModeToMinimumIntensity=function(){e.setBlendMode(Tc.MINIMUM_INTENSITY_BLEND)},e.setBlendModeToAverageIntensity=function(){e.setBlendMode(Tc.AVERAGE_INTENSITY_BLEND)},e.setBlendModeToAdditiveIntensity=function(){e.setBlendMode(Tc.ADDITIVE_INTENSITY_BLEND)},e.setBlendModeToRadonTransform=function(){e.setBlendMode(Tc.RADON_TRANSFORM_BLEND)},e.getBlendModeAsString=function(){return ht.default.enumToString(Tc,t.blendMode)},e.setAverageIPScalarRange=function(t,r){console.warn("setAverageIPScalarRange is deprecated use setIpScalarRange"),e.setIpScalarRange(t,r)},e.getFilterModeAsString=function(){return ht.default.enumToString(Cc,t.filterMode)},e.setFilterModeToOff=function(){e.setFilterMode(Cc.OFF)},e.setFilterModeToNormalized=function(){e.setFilterMode(Cc.NORMALIZED)},e.setFilterModeToRaw=function(){e.setFilterMode(Cc.RAW)},e.setGlobalIlluminationReach=function(e){return r.setGlobalIlluminationReach((0,Mr.C)(e,0,1))},e.setVolumetricScatteringBlending=function(e){return r.setVolumetricScatteringBlending((0,Mr.C)(e,0,1))},e.setVolumeShadowSamplingDistFactor=function(e){return r.setVolumeShadowSamplingDistFactor(e>=1?e:1)},e.setAnisotropy=function(e){return r.setAnisotropy((0,Mr.C)(e,-.99,.99))},e.setLAOKernelSize=function(e){return r.setLAOKernelSize((0,Mr.J)((0,Mr.C)(e,1,32)))},e.setLAOKernelRadius=function(e){return r.setLAOKernelRadius(e>=1?e:1)}}(e,t)}var wc=bc({newInstance:ht.default.newInstance(Pc,"vtkVolumeMapper"),extend:Pc},xc);const Oc={scalarTexture:null};function Ic(e,t,r={}){Object.assign(t,Oc,r),wc.extend(e,t,r),ht.default.setGet(e,t,["scalarTexture"]),function(e,t){t.classHierarchy.push("vtkSharedVolumeMapper");const r=e.delete;e.delete=()=>{t.scalarTexture=null,r()}}(e,t)}const Ac={newInstance:ht.default.newInstance(Ic,"vtkSharedVolumeMapper"),extend:Ic};const Rc={updatedFrames:[]};function Ec(e,t,r={}){Object.assign(t,Rc,r),Yr.extend(e,t,r),function(e,t){t.classHierarchy.push("vtkStreamingOpenGLTexture");const r=e.create3DFilterableFromRaw;e.create3DFilterableFromRaw=(e,n,a,o,i,s,l)=>{t.inputDataType=i,t.inputNumComps=o,r(e,n,a,o,i,s,l)},e.update3DFromRaw=r=>{const{updatedFrames:n}=t;if(!n.length)return;let a,o;if(t._openGLRenderWindow.activateTexture(e),e.createTexture(),e.bind(),r instanceof Uint8Array)a=1,o=Uint8Array;else if(r instanceof Int16Array)a=2,o=Int16Array;else if(r instanceof Uint16Array)a=2,o=Uint16Array;else{if(!(r instanceof Float32Array))throw new Error("No support for given TypedArray.");a=4,o=Float32Array}for(let e=0;e{const o=e.buffer,i=r*(t.width*t.height*t.components*n),s=t.width*t.components,l=t.context,c=l.getParameter(l.MAX_TEXTURE_SIZE);let u=Math.floor(n*c/t.width);u=Math.min(u,t.height);const{useNorm16Texture:d,preferSizeOverAccuracy:f}=Qe().rendering;d&&!f&&(u=1);const p=s*u,g=p*n,m=Math.floor(t.height/u),h=t.height%u,v=s*h;for(let e=0;e({width:t.width,height:t.height,depth:t.depth,numComps:t.inputNumComps,dataType:t.inputDataType}),e.setUpdatedFrame=e=>{t.updatedFrames[e]=!0}}(e,t)}const Mc={newInstance:ht.default.newInstance(Ec,"vtkStreamingOpenGLTexture"),extend:Ec};var Dc=r(34535),Vc=r(32899);const Lc={isPerformingCoordinateTransformation:!1};function _c(e,t,r={}){Object.assign(t,Lc,r),Dc.ZP.extend(e,t,r),ht.default.setGet(e,t,["isPerformingCoordinateTransformation"]),function(e,t){t.classHierarchy.push("vtkSlabCamera");const r=ot._E.identity(new Float64Array(16)),n=new Float64Array(3);e.getProjectionMatrix=(e,a,o)=>{const i=ot._E.create();if(t.projectionMatrix){const e=1/t.physicalScale;return ot.R3.set(n,e,e,e),ot._E.copy(i,t.projectionMatrix),ot._E.scale(i,i,n),ot._E.transpose(i,i),i}ot._E.identity(r);let s=t.clippingRange[0],l=t.clippingRange[1];t.isPerformingCoordinateTransformation&&(s=t.distance,l=t.distance+.1);const c=l-s,u=[s+(a+1)*c/2,s+(o+1)*c/2];if(t.parallelProjection){const n=t.parallelScale*e,a=t.parallelScale,o=(t.windowCenter[0]-1)*n,i=(t.windowCenter[0]+1)*n,s=(t.windowCenter[1]-1)*a,l=(t.windowCenter[1]+1)*a;ot._E.ortho(r,o,i,s,l,u[0],u[1]),ot._E.transpose(r,r)}else{if(t.useOffAxisProjection)throw new Error("Off-Axis projection is not supported at this time");{const n=Math.tan(Vc.ZP.radiansFromDegrees(t.viewAngle)/2);let a,o;!0===t.useHorizontalViewAngle?(a=s*n,o=s*n/e):(a=s*n*e,o=s*n);const i=(t.windowCenter[0]-1)*a,l=(t.windowCenter[0]+1)*a,c=(t.windowCenter[1]-1)*o,d=(t.windowCenter[1]+1)*o,f=u[0],p=u[1];r[0]=2*f/(l-i),r[5]=2*f/(d-c),r[2]=(i+l)/(l-i),r[6]=(c+d)/(d-c),r[10]=-(f+p)/(p-f),r[14]=-1,r[11]=-2*f*p/(p-f),r[15]=0}}return ot._E.copy(i,r),i}}(e,t)}const Nc={newInstance:ht.default.newInstance(_c,"vtkSlabCamera"),extend:_c};class Bc{constructor(e){this._imageIdsIndexMap=new Map,this._imageURIsIndexMap=new Map,this.isPreScaled=!1,this.volumeId=e.volumeId,this.metadata=e.metadata,this.dimensions=e.dimensions,this.spacing=e.spacing,this.origin=e.origin,this.direction=e.direction,this.imageData=e.imageData,this.scalarData=e.scalarData,this.sizeInBytes=e.sizeInBytes,this.vtkOpenGLTexture=Mc.newInstance(),this.numVoxels=this.dimensions[0]*this.dimensions[1]*this.dimensions[2],e.scaling&&(this.scaling=e.scaling),e.referencedVolumeId&&(this.referencedVolumeId=e.referencedVolumeId)}get imageIds(){return this._imageIds}set imageIds(e){this._imageIds=e,this._reprocessImageIds()}_reprocessImageIds(){this._imageIdsIndexMap.clear(),this._imageURIsIndexMap.clear(),this._imageIds.forEach(((e,t)=>{const r=me(e);this._imageIdsIndexMap.set(e,t),this._imageURIsIndexMap.set(r,t)}))}isDynamicVolume(){return!1}getScalarData(){if((e=this.scalarData)instanceof Int8Array||e instanceof Uint8Array||e instanceof Uint8ClampedArray||e instanceof Int16Array||e instanceof Uint16Array||e instanceof Int32Array||e instanceof Uint32Array||e instanceof Float32Array||e instanceof Float64Array)return this.scalarData;var e;throw new Error("Unknow scalar data type")}getImageIdIndex(e){return this._imageIdsIndexMap.get(e)}getImageURIIndex(e){return this._imageURIsIndexMap.get(e)}destroy(){this.imageData.delete(),this.imageData=null,this.scalarData=null,this.vtkOpenGLTexture.releaseGraphicsResources(),this.vtkOpenGLTexture.delete()}}const Fc=Bc;function Uc(e){const{dimensions:t,metadata:r,spacing:n,direction:a,origin:o}=e,{PhotometricInterpretation:i}=r;let s=1;"RGB"===i&&(s=3);const l=Jo.ZP.newInstance(),c={numberOfComponents:s};if(l.setDimensions(t),l.setSpacing(n),l.setDirection(a),l.setOrigin(o),e.isDynamicVolume()){!function(e,t,r){t.forEach(((t,n)=>{const a=re.ZP.newInstance({name:`timePoint-${n}`,values:t,...r});e.getPointData().addArray(a)})),e.getPointData().setActiveScalars("timePoint-0")}(l,e.getScalarDataArrays(),c)}else{!function(e,t,r){const n=re.ZP.newInstance({name:"Pixels",values:t,...r});e.getPointData().setScalars(n)}(l,e.getScalarData(),c)}return l}const kc={};let Gc;function Wc(e,t){const r=e.indexOf(":"),n=e.substring(0,r),a=kc[n];if(null==a){if(void 0!==Gc)return Gc(e,t);throw new Error("loadVolumeFromVolumeLoader: no volume loader for volumeId")}const o=a(e,t);return o.promise.then((function(e){se(J,g.VOLUME_LOADED,{volume:e})}),(function(t){const r={volumeId:e,error:t};se(J,g.VOLUME_LOADED_FAILED,r)})),o}function zc(e,t={imageIds:[]}){if(void 0===e)throw new Error("loadVolume: parameter volumeId must not be undefined");let r=mt.getVolumeLoadObject(e);return void 0!==r?r.promise:(r=Wc(e,t),r.promise.then((e=>(e.imageData=Uc(e),e))))}async function jc(e,t){if(void 0===e)throw new Error("createAndCacheVolume: parameter volumeId must not be undefined");let r=mt.getVolumeLoadObject(e);return void 0!==r||(r=Wc(e,t),r.promise.then((e=>{e.imageData=Uc(e)})),mt.putVolumeLoadObject(e,r).catch((e=>{throw e}))),r.promise}async function Hc(e,t){const r=mt.getVolume(e);if(!r)throw new Error(`Cannot created derived volume: Referenced volume with id ${e} does not exist.`);let{volumeId:n}=t;const{targetBuffer:a}=t;void 0===n&&(n=le());const{metadata:o,dimensions:i,spacing:s,origin:l,direction:c}=r,u=r.getScalarData().length;let d,f;const{useNorm16Texture:p}=Qe().rendering;if(a)if("Float32Array"===a.type)d=4*u,f=Float32Array;else if("Uint8Array"===a.type)d=u,f=Uint8Array;else if(p&&"Uint16Array"===a.type)d=2*u,f=Uint16Array;else{if(!p||"Int16Array"!==a.type)throw new Error("TargetBuffer should be Float32Array or Uint8Array");d=2*u,f=Uint16Array}else d=4*u,f=Float32Array;if(!mt.isCacheable(d))throw new Error(g.CACHE_SIZE_EXCEEDED);let m;if(a?.sharedArrayBuffer){m=new f(new SharedArrayBuffer(d))}else m=new f(u);const h=re.ZP.newInstance({name:"Pixels",numberOfComponents:1,values:m}),v=Jo.ZP.newInstance();v.setDimensions(i),v.setSpacing(s),v.setDirection(c),v.setOrigin(l),v.getPointData().setScalars(h);const y=new Bc({volumeId:n,metadata:ti()(o),dimensions:[i[0],i[1],i[2]],spacing:s,origin:l,direction:c,imageData:v,scalarData:m,sizeInBytes:d,referencedVolumeId:e}),b={promise:Promise.resolve(y)};return await mt.putVolumeLoadObject(n,b),y}function Kc(e,t,r=!1){const{scalarData:n,metadata:a,dimensions:o,spacing:i,origin:s,direction:l}=e;if(!n||!(n instanceof Uint8Array||n instanceof Float32Array||n instanceof Uint16Array||n instanceof Int16Array))throw new Error("To use createLocalVolume you should pass scalarData of type Uint8Array, Uint16Array, Int16Array or Float32Array");void 0===t&&(t=le());const c=mt.getVolume(t);if(c)return c;const u=o[0]*o[1]*o[2],d=n?n.buffer.byteLength:4*u;if(!mt.isCacheable(d))throw new Error(g.CACHE_SIZE_EXCEEDED);const f=re.ZP.newInstance({name:"Pixels",numberOfComponents:1,values:n}),p=Jo.ZP.newInstance();p.setDimensions(o),p.setSpacing(i),p.setDirection(l),p.setOrigin(s),p.getPointData().setScalars(f);const m=new Bc({volumeId:t,metadata:ti()(a),dimensions:[o[0],o[1],o[2]],spacing:i,origin:s,direction:l,imageData:p,scalarData:n,sizeInBytes:d});if(r)return m;const h={promise:Promise.resolve(m)};return mt.putVolumeLoadObject(t,h),m}function Zc(e,t){kc[e]=t}function Xc(){return Object.keys(kc)}function qc(e){const t=Gc;return Gc=e,t}const Yc=1+H,$c=e=>!!Xc().find((t=>{return r=e.volumeId,(n=t)===r.substring(0,Math.min(r.length,n.length));var r,n}));function Qc(e,t,r){const{viewPlaneNormal:n}=t,a=e.getActors();if(!a||!a.length)return{spacingInNormalDirection:null,imageVolume:null,actorUID:null};const o=a.map((e=>{const t=e.referenceId??e.uid;return mt.getVolume(t)})).filter((e=>!!e));if(r){const e=o.findIndex((e=>e.volumeId===r)),t=o[e],{uid:i}=a[e];return{imageVolume:t,spacingInNormalDirection:dt(t,n),actorUID:i}}if(!o.length)return{spacingInNormalDirection:null,imageVolume:null,actorUID:null};const i={spacingInNormalDirection:1/0,imageVolume:null,actorUID:null},s=o.find($c);for(let e=0;e=t[0]||e[1]<0||e[1]>=t[1]||e[2]<0||e[2]>=t[2])}const tu=function(e,t){let r;r=t?[Le(t)]:_e();const n=[];return r.forEach((t=>{const r=e.getActors(),a=t.getVolumeViewports();for(const e of a){const t=e.getActors();if(t.length!==r.length)continue;r.every((({uid:e})=>t.find((t=>e===t.uid))))&&n.push(e)}})),n};const ru=function(e,t){let r;r=t?[Le(t)]:_e();const n=[];return r.forEach((t=>{const r=t.getVolumeViewports().filter((t=>t.hasVolumeId(e)));n.push(...r)})),n};function nu(e,t){return e.worldToIndex(t).map(Math.round)}class au{constructor(e){this.numRequests={interaction:0,thumbnail:0,prefetch:0},this.id=e||le(),this.requestPool={interaction:{0:[]},thumbnail:{0:[]},prefetch:{0:[]}},this.grabDelay=5,this.awake=!1,this.numRequests={interaction:0,thumbnail:0,prefetch:0},this.maxNumRequests={interaction:6,thumbnail:6,prefetch:5}}setMaxSimultaneousRequests(e,t){this.maxNumRequests[e]=t}getMaxSimultaneousRequests(e){return this.maxNumRequests[e]}destroy(){this.timeoutHandle&&window.clearTimeout(this.timeoutHandle)}addRequest(e,t,r,n=0){const a={requestFn:e,type:t,additionalDetails:r};void 0===this.requestPool[t][n]&&(this.requestPool[t][n]=[]),this.requestPool[t][n].push(a),this.awake?t===h.Interaction&&this.startGrabbing():(this.awake=!0,this.startGrabbing())}filterRequests(e){Object.keys(this.requestPool).forEach((t=>{const r=this.requestPool[t];Object.keys(r).forEach((t=>{r[t]=r[t].filter((t=>e(t)))}))}))}clearRequestStack(e){if(!this.requestPool[e])throw new Error(`No category for the type ${e} found`);this.requestPool[e]={0:[]}}sendRequests(e){const t=this.maxNumRequests[e]-this.numRequests[e];for(let r=0;r{this.numRequests[e]--,this.startAgain()})))}return!0}getNextRequest(e){const t=this.getSortedPriorityGroups(e);for(const r of t)if(this.requestPool[e][r].length)return this.requestPool[e][r].shift();return null}startGrabbing(){const e=this.sendRequests(h.Interaction),t=this.sendRequests(h.Thumbnail),r=this.sendRequests(h.Prefetch);e||t||r||(this.awake=!1)}startAgain(){this.awake&&(void 0!==this.grabDelay?this.timeoutHandle||(this.timeoutHandle=window.setTimeout((()=>{this.timeoutHandle=null,this.startGrabbing()}),this.grabDelay)):this.startGrabbing())}getSortedPriorityGroups(e){const t=Object.keys(this.requestPool[e]).map(Number).filter((t=>this.requestPool[e][t].length)).sort(((e,t)=>e-t));return t}getRequestPool(){return this.requestPool}}new au;const ou=new au("imageLoadPool");ou.grabDelay=0,ou.setMaxSimultaneousRequests(h.Interaction,1e3),ou.setMaxSimultaneousRequests(h.Thumbnail,1e3),ou.setMaxSimultaneousRequests(h.Prefetch,1e3);const iu=ou,su={};let lu;function cu(e,t){let r=mt.getImageLoadObject(e);if(void 0!==r)return r;const n=mt.getVolumeContainingImageId(e);if(n&&n.volume.loadStatus.loaded){const{volume:t,imageIdIndex:a}=n;return r=t.convertToCornerstoneImage(e,a),r}const a=mt.getCachedImageBasedOnImageURI(e);return a?(r=a.imageLoadObject,r):(r=function(e,t){const r=e.indexOf(":"),n=e.substring(0,r),a=su[n];if(null==a){if(void 0!==lu)return lu(e);throw new Error("loadImageFromImageLoader: no image loader for imageId")}const o=a(e,t);return o.promise.then((function(e){se(J,g.IMAGE_LOADED,{image:e})}),(function(t){const r={imageId:e,error:t};se(J,g.IMAGE_LOAD_FAILED,r)})),o}(e,t),r)}function uu(e,t={priority:0,requestType:"prefetch"}){if(void 0===e)throw new Error("loadImage: parameter imageId must not be undefined");return cu(e,t).promise}function du(e,t={priority:0,requestType:"prefetch"}){if(void 0===e)throw new Error("loadAndCacheImage: parameter imageId must not be undefined");const r=cu(e,t);return mt.getImageLoadObject(e)||mt.putImageLoadObject(e,r).catch((e=>{console.warn(e)})),r.promise}function fu(e,t={priority:0,requestType:"prefetch"}){if(!e||0===e.length)throw new Error("loadAndCacheImages: parameter imageIds must be list of image Ids");return e.map((e=>du(e,t)))}function pu(e){iu.filterRequests((({additionalDetails:t})=>!t.imageId||t.imageId!==e));const t=mt.getImageLoadObject(e);t&&t.cancelFn()}function gu(e){e.forEach((e=>pu(e)))}function mu(){const e=iu.getRequestPool();Object.keys(e).forEach((t=>{const r=e[t];Object.keys(r).forEach((e=>{const t=r[e].pop(),{imageId:n,volumeId:a}=t.additionalDetails;let o;n?o=mt.getImageLoadObject(n):a&&(o=mt.getVolumeLoadObject(a)),o&&o.cancel()})),iu.clearRequestStack(t)}))}function hu(e,t){su[e]=t}function vu(e){const t=lu;return lu=e,t}function yu(){Object.keys(su).forEach((e=>delete su[e])),lu=void 0}const bu="viewport-element",Tu="cornerstone-canvas";function Cu(e){const t=`canvas.${Tu}`,r=`div.${bu}`,n=e.querySelector(r)||function(e){const t=document.createElement("div");return t.style.position="relative",t.style.width="100%",t.style.height="100%",t.classList.add(bu),e.appendChild(t),t}(e);return n.querySelector(t)||function(e){const t=document.createElement("canvas");return t.style.position="absolute",t.style.width="100%",t.style.height="100%",t.classList.add(Tu),e.appendChild(t),t}(n)}const xu=e=>e.preScale?.scaled&&e.preScale.scalingParameters?.suvbw;function Su(e,t,r=void 0,n="_thumbnails"){if(!(e&&e instanceof HTMLCanvasElement))throw new Error("canvas element is required");const a=`renderGPUViewport-${t.imageId}`,o=t.imageId,i=document.createElement("div");i.style.width=`${e.width}px`,i.style.height=`${e.height}px`,i.style.visibility="hidden",i.style.position="absolute";const s=window.devicePixelRatio||1,l=e.width,c=e.height;e.width=l*s,e.height=c*s,e.style.width=`${l}px`,e.style.height=`${c}px`,document.body.appendChild(i);const u=a.split(":").join("-");i.setAttribute("viewport-id-for-remove",u);const d=Le(n)||new ip(n);let f=d.getViewport(a);if(!f){const e={viewportId:a,type:y.STACK,element:i,defaultOptions:{suppressEvents:!0}};d.enableElement(e),f=d.getViewport(a)}return new Promise((n=>{let s=!1;const l=t=>{if(s)return;const r=Cu(i);e.getContext("2d").drawImage(r,0,0,r.width,r.height,0,0,e.width,e.height),s=!0,i.removeEventListener(g.IMAGE_RENDERED,l),setTimeout((()=>{d.disableElement(a);document.querySelectorAll(`[viewport-id-for-remove="${u}"]`).forEach((e=>{e.remove()}))}),0),n(o)};i.addEventListener(g.IMAGE_RENDERED,l),f.renderImageObject(t),f.resetCamera(),"PT"!==r||xu(t)||f.setProperties({voiRange:{lower:t.minPixelValue,upper:t.maxPixelValue}}),f.render()}))}const Pu={viewport:{}};function wu(e,t){if(null==e)throw new Error(t)}function Ou(e,t=null){return wu(e,"getImageSize: parameter image must not be undefined"),wu(e.width,"getImageSize: parameter image must have width"),wu(e.height,"getImageSize: parameter image must have height"),function(e){return!(null==e||0===e||180===e)}(t)?{height:e.width,width:e.height}:{width:e.width,height:e.height}}function Iu(e,t,r=null){wu(e,"getImageScale: parameter canvas must not be undefined"),wu(t,"getImageScale: parameter image must not be undefined");const n=Ou(t,r),a=t.rowPixelSpacing||1,o=t.columnPixelSpacing||1;let i=1,s=1;a>t,n=e.lut[e.lut.length-1]>>t,a=e.firstValueMapped+e.lut.length-1;return function(o){return o=a?n:e.lut[o-e.firstValueMapped]>>t}}(r):function(e,t){return function(r){const n=255*((r-(t-.5))/(e-1)+.5);return Math.min(Math.max(n,0),255)}}(e,t)}function Vu(e,t,r){if(void 0===e)throw new Error("setToPixelCoordinateSystem: parameter enabledElement must not be undefined");if(void 0===t)throw new Error("setToPixelCoordinateSystem: parameter context must not be undefined");const n=Eu(e,r).getMatrix();t.setTransform(n[0],n[1],n[2],n[3],n[4],n[5])}function Lu(e,t){const r=e.renderingTools.lastRenderedImageId,n=e.renderingTools.lastRenderedViewport;return t.imageId!==r||!n||n.windowCenter!==e.viewport.voi.windowCenter||n.windowWidth!==e.viewport.voi.windowWidth||n.invert!==e.viewport.invert||n.rotation!==e.viewport.rotation||n.hflip!==e.viewport.hflip||n.vflip!==e.viewport.vflip||n.modalityLUT!==e.viewport.modalityLUT||n.voiLUT!==e.viewport.voiLUT||n.colormap!==e.viewport.colormap}function _u(e,t){const r=e.renderingTools.renderCanvas;r.width=t.width,r.height=t.height;const n=r.getContext("2d");n.fillStyle="white",n.fillRect(0,0,r.width,r.height);const a=n.getImageData(0,0,t.width,t.height);e.renderingTools.renderCanvasContext=n,e.renderingTools.renderCanvasData=a}function Nu(e){const t=e.image.imageId,r=e.viewport,n=e.image.color;return e.renderingTools.lastRenderedImageId=t,e.renderingTools.lastRenderedIsColor=n,e.renderingTools.lastRenderedViewport={windowCenter:r.voi.windowCenter,windowWidth:r.voi.windowWidth,invert:r.invert,rotation:r.rotation,hflip:r.hflip,vflip:r.vflip,modalityLUT:r.modalityLUT,voiLUT:r.voiLUT,colormap:r.colormap},e.renderingTools}function Bu(e,t){return void 0!==e.cachedLut&&e.cachedLut.windowCenter===t.voi.windowCenter&&e.cachedLut.windowWidth===t.voi.windowWidth&&e.cachedLut.invert===t.invert||(function(e,t,r,n,a){const o=e.maxPixelValue,i=e.minPixelValue,s=Math.min(i,0);if(void 0===e.cachedLut){const t=o-s+1;e.cachedLut={},e.cachedLut.lutArray=new Uint8ClampedArray(t)}const l=e.cachedLut.lutArray,c=Du(Array.isArray(t)?t[0]:t,Array.isArray(r)?r[0]:r,a);if(!0===n)for(let e=i;e<=o;e++)l[e+-s]=255-c(e);else for(let e=i;e<=o;e++)l[e+-s]=c(e)}(e,t.voi.windowWidth,t.voi.windowCenter,t.invert),e.cachedLut.windowWidth=t.voi.windowWidth,e.cachedLut.windowCenter=t.voi.windowCenter,e.cachedLut.invert=t.invert),e.cachedLut.lutArray}function Fu(e,t,r){const n=!0===e.renderingTools.lastRenderedIsColor;e.renderingTools.renderCanvas&&n||(e.renderingTools.renderCanvas=document.createElement("canvas"));const a=e.renderingTools.renderCanvas,{windowWidth:o,windowCenter:i}=e.viewport.voi;if((256===o||255===o)&&(128===i||127===i)&&!1===e.viewport.invert&&t.getCanvas&&t.getCanvas())return t.getCanvas();if(!1===Lu(e,t)&&!0!==r)return a;a.width===t.width&&a.height===t.height||_u(e,t);let s=Mu();const l=Bu(t,e.viewport);t.stats=t.stats||{},t.stats.lastLutGenerateTime=Mu()-s;const c=e.renderingTools.renderCanvasData,u=e.renderingTools.renderCanvasContext;return t.rgba?function(e,t,r){let n=Mu();const a=e.getPixelData();e.stats.lastGetPixelDataTime=Mu()-n;const o=e.minPixelValue;let i=0,s=0;const l=a.length;if(n=Mu(),o<0)for(;s0;return t||void 0!==e.voi.windowWidth&&void 0!==e.voi.windowCenter}(e))return;const r=t.maxPixelValue*t.slope+t.intercept,n=t.minPixelValue*t.slope+t.intercept,a=r-n,o=(r+n)/2;void 0===e.voi?e.voi={windowWidth:a,windowCenter:o}:(e.voi.windowWidth=a,e.voi.windowCenter=o)}function Gu(e,t){return!e&&!t||!(!e||!t)&&e.id===t.id}function Wu(e,t,r){return void 0!==e.cachedLut&&e.cachedLut.windowCenter===t.voi.windowCenter&&e.cachedLut.windowWidth===t.voi.windowWidth&&Gu(e.cachedLut.modalityLUT,t.modalityLUT)&&Gu(e.cachedLut.voiLUT,t.voiLUT)&&e.cachedLut.invert===t.invert&&!0!==r||(ku(t,e),function(e,t,r,n,a,o){const i=e.maxPixelValue,s=e.minPixelValue,l=Math.min(s,0);if(void 0===e.cachedLut){const t=i-l+1;e.cachedLut={},e.cachedLut.lutArray=new Uint8ClampedArray(t)}const c=e.cachedLut.lutArray,u=function(e,t,r){return r?function(e){const t=e.lut[0],r=e.lut[e.lut.length-1],n=e.firstValueMapped+e.lut.length;return a=>a=n?r:e.lut[a]}(r):function(e,t){return r=>r*e+t}(e,t)}(e.slope,e.intercept,a),d=Du(t,r,o);if(e.isPreScaled)if(!0===n)for(let e=s;e<=i;e++)c[e+-l]=255-d(e);else for(let e=s;e<=i;e++)c[e+-l]=d(e);else if(!0===n)for(let e=s;e<=i;e++)c[e+-l]=255-d(u(e));else for(let e=s;e<=i;e++)c[e+-l]=d(u(e))}(e,t.voi.windowWidth,t.voi.windowCenter,t.invert,t.modalityLUT,t.voiLUT),e.cachedLut.windowWidth=t.voi.windowWidth,e.cachedLut.windowCenter=t.voi.windowCenter,e.cachedLut.invert=t.invert,e.cachedLut.voiLUT=t.voiLUT,e.cachedLut.modalityLUT=t.modalityLUT),e.cachedLut.lutArray}function zu(e,t,r,n=!0){const a=!0===e.renderingTools.lastRenderedIsColor;e.renderingTools.renderCanvas&&!a||(e.renderingTools.renderCanvas=document.createElement("canvas"),_u(e,t));const o=e.renderingTools.renderCanvas;if(!1===Lu(e,t)&&!0!==r)return o;o.width===t.width&&o.height===t.height||_u(e,t),t.stats=t.stats||{};const i=e.renderingTools.renderCanvasData,s=e.renderingTools.renderCanvasContext;let l=Mu();t.stats.lastLutGenerateTime=Mu()-l;const{viewport:c}=e;if("PT"===c.modality&&t.isPreScaled){const{windowWidth:e,windowCenter:r}=c.voi,n=r-e/2,a=255/(r+e/2-n);let o;o=c.invert?e=>255-(e-n)*a:e=>(e-n)*a,function(e,t,r){let n=Mu();const a=e.getPixelData();e.stats.lastGetPixelDataTime=Mu()-n;const o=a.length;let i=3,s=0;for(n=Mu();s1)throw new Error("HSVToRGB expects hue < 1");const n=[];if(0===t)return n[0]=r,n[1]=r,n[2]=r,n;const a=Math.floor(6*e),o=6*e-a,i=r*(1-t),s=r*(1-t*o),l=r*(1-t*(1-o));switch(a){case 0:case 6:n[0]=r,n[1]=l,n[2]=i;break;case 1:n[0]=s,n[1]=r,n[2]=i;break;case 2:n[0]=i,n[1]=r,n[2]=l;break;case 3:n[0]=i,n[1]=s,n[2]=r;break;case 4:n[0]=l,n[1]=i,n[2]=r;break;case 5:n[0]=r,n[1]=i,n[2]=s}return n}const Ku=class{constructor(){this.NumberOfColors=256,this.Ramp="linear",this.TableRange=[0,255],this.HueRange=[0,.66667],this.SaturationRange=[1,1],this.ValueRange=[1,1],this.AlphaRange=[1,1],this.NaNColor=[128,0,0,255],this.BelowRangeColor=[0,0,0,255],this.UseBelowRangeColor=!0,this.AboveRangeColor=[255,255,255,255],this.UseAboveRangeColor=!0,this.InputRange=[0,255],this.Table=[]}setNumberOfTableValues(e){this.NumberOfColors=e}setRamp(e){this.Ramp=e}setTableRange(e,t){this.TableRange[0]=e,this.TableRange[1]=t}setHueRange(e,t){this.HueRange[0]=e,this.HueRange[1]=t}setSaturationRange(e,t){this.SaturationRange[0]=e,this.SaturationRange[1]=t}setValueRange(e,t){this.ValueRange[0]=e,this.ValueRange[1]=t}setRange(e,t){this.InputRange[0]=e,this.InputRange[1]=t}setAlphaRange(e,t){this.AlphaRange[0]=e,this.AlphaRange[1]=t}getColor(e){return this.mapValue(e)}build(e){if(this.Table.length>1&&!e)return;this.Table=[];const t=this.NumberOfColors-1;let r,n,a,o;t?(r=(this.HueRange[1]-this.HueRange[0])/t,n=(this.SaturationRange[1]-this.SaturationRange[0])/t,a=(this.ValueRange[1]-this.ValueRange[0])/t,o=(this.AlphaRange[1]-this.AlphaRange[0])/t):r=n=a=o=0;for(let e=0;e<=t;e++){const t=this.HueRange[0]+e*r,i=this.SaturationRange[0]+e*n,s=this.ValueRange[0]+e*a,l=this.AlphaRange[0]+e*o,c=Hu(t,i,s),u=[0,0,0,0];switch(this.Ramp){case"scurve":u[0]=Math.floor(127.5*(1+Math.cos((1-c[0])*Math.PI))),u[1]=Math.floor(127.5*(1+Math.cos((1-c[1])*Math.PI))),u[2]=Math.floor(127.5*(1+Math.cos((1-c[2])*Math.PI))),u[3]=Math.floor(255*l);break;case"linear":u[0]=Math.floor(255*c[0]+.5),u[1]=Math.floor(255*c[1]+.5),u[2]=Math.floor(255*c[2]+.5),u[3]=Math.floor(255*l+.5);break;case"sqrt":u[0]=Math.floor(255*Math.sqrt(c[0])+.5),u[1]=Math.floor(255*Math.sqrt(c[1])+.5),u[2]=Math.floor(255*Math.sqrt(c[2])+.5),u[3]=Math.floor(255*Math.sqrt(l)+.5);break;default:throw new Error(`Invalid Ramp value (${this.Ramp})`)}this.Table.push(u)}this.buildSpecialColors()}buildSpecialColors(){const e=this.NumberOfColors,t=e+0,r=e+1,n=e+2;this.UseBelowRangeColor||0===e?this.Table[t]=this.BelowRangeColor:this.Table[t]=this.Table[0],this.UseAboveRangeColor||0===e?this.Table[r]=this.AboveRangeColor:this.Table[r]=this.Table[e-1],this.Table[n]=this.NaNColor}mapValue(e){const t=this.getIndex(e);if(t<0)return this.NaNColor;if(0===t){if(this.UseBelowRangeColor&&ethis.TableRange[1])return this.AboveRangeColor;return this.Table[t]}getIndex(e){const t={Range:[],MaxIndex:this.NumberOfColors-1,Shift:-this.TableRange[0],Scale:1};if(this.TableRange[1]<=this.TableRange[0]?t.Scale=Number.MAX_VALUE:t.Scale=t.MaxIndex/(this.TableRange[1]-this.TableRange[0]),t.Range[0]=this.TableRange[0],t.Range[1]=this.TableRange[1],isNaN(e))return-1;let r=function(e,t){let r;return r=et.Range[1]?t.MaxIndex+1+1.5:(e+t.Shift)*t.Scale,Math.floor(r)}(e,t);return r===this.NumberOfColors+0?r=0:r===this.NumberOfColors+1&&(r=this.NumberOfColors-1),r}setTableValue(e,t){if(5===arguments.length&&(t=Array.prototype.slice.call(arguments,1)),e<0)throw new Error(`Can't set the table value for negative index (${e})`);e>=this.NumberOfColors&&new Error(`Index ${e} is greater than the number of colors ${this.NumberOfColors}`),this.Table[e]=t,0!==e&&e!==this.NumberOfColors-1||this.buildSpecialColors()}},Zu=[0,0,0,0];function Xu(e,t){let r=0,n=e.length-1;for(;r<=n;){const a=r+Math.floor((n-r)/2),o=e[a];if(o===t)return a;t0;)a.push(e),e+=n;return a[a.length-1]=t,a}(0,1,e);for(n=0;ne,getColorSchemeName:()=>r.name,setColorSchemeName(e){r.name=e},getNumberOfColors:()=>r.colors.length,setNumberOfColors(e){for(;r.colors.lengthe>=0&&eJu(Math.floor(255-(e-n)*a),0,255):e=>Ju(Math.floor((e-n)*a),0,255),Qu(t,o,u,s.data)}else{const n=Wu(t,e.viewport,r);t.stats=t.stats||{},t.stats.lastLutGenerateTime=Mu()-i,$u(t,n,u,s.data)}return i=Mu(),l.putImageData(s,0,0),t.stats.lastPutImageDataTime=Mu()-i,n}(e,r,t),o=e.viewport.displayedArea.tlhc.x-1,i=e.viewport.displayedArea.tlhc.y-1,s=e.viewport.displayedArea.brhc.x-o,l=e.viewport.displayedArea.brhc.y-i;n.drawImage(a,o,i,s,l,0,0,s,l),e.renderingTools=Nu(e)}function td(e,t){const r=e.image;if(!e.canvas||!e.image)return;const n=Mu();if(r.stats={lastGetPixelDataTime:-1,lastStoredPixelDataToCanvasImageDataTime:-1,lastPutImageDataTime:-1,lastRenderTime:-1,lastLutGenerateTime:-1},r){let n=r.render;n||(n=e.viewport.colormap?ed:r.color?Uu:ju),n(e,t)}const a=Mu()-n;r.stats.lastRenderTime=a,e.invalid=!1,e.needsRedraw=!1}function rd(e,t,r,n){const a={canvas:e,viewport:Au(e,t,r),image:t,renderingTools:{}};a.transform=Eu(a);return new Promise(((e,r)=>{td(a,true),e(t.imageId)}))}function nd(e){const{canvas:t,imageId:r,requestType:n=h.Thumbnail,priority:a=-5,renderingEngineId:o="_thumbnails",useCPURendering:i=!1}=e,s=i?rd:Su;return new Promise(((e,l)=>{function c(r,n){const{modality:a}=ut("generalSeriesModule",n)||{};r.isPreScaled=r.isPreScaled||r.preScale?.scaled,s(t,r,a,o).then((()=>{e(n)}))}function u(e,t){console.error(e,t),l(e)}const{useNorm16Texture:d}=Qe().rendering,f={targetBuffer:{type:d?void 0:"Float32Array"},preScale:{enabled:!0},useRGBA:!!i,requestType:n};iu.addRequest(function(e,t,r){return du(e,r).then((t=>{c.call(this,t,e)}),(t=>{u.call(this,t,e)}))}.bind(null,r,null,f),n,{imageId:r},a)}))}const ad=function(e,t){const r=ut("imagePlaneModule",e);if(!r)throw new Error(`No imagePlaneModule found for imageId: ${e}`);const{columnCosines:n,rowCosines:a,imagePositionPatient:o}=r;let{columnPixelSpacing:i,rowPixelSpacing:s}=r;i||=1,s||=1;const l=ot.R3.create();ot.R3.scaleAndAdd(l,o,n,-i/2),ot.R3.scaleAndAdd(l,l,a,-s/2);const c=ot.R3.create();return ot.R3.sub(c,t,l),[ot.R3.dot(c,a)/s,ot.R3.dot(c,n)/i]};function od(e,t){const r=ut("imagePlaneModule",e);if(!r)throw new Error(`No imagePlaneModule found for imageId: ${e}`);const{columnCosines:n,rowCosines:a,imagePositionPatient:o}=r;let{columnPixelSpacing:i,rowPixelSpacing:s}=r;i||=1,s||=1;const l=ot.R3.create();return ot.R3.scaleAndAdd(l,o,a,s*(t[0]-.5)),ot.R3.scaleAndAdd(l,l,n,i*(t[1]-.5)),Array.from(l)}var id=r(45802);const sd=H*H,ld=e=>Math.abs(Math.abs(e)-1)ld(e[t])||ld(e[t+1])||ld(e[t+2]),ud=e=>cd(e,0)&&cd(e,3)&&cd(e,6);function dd(e,t,r){const n=e.getMapper().getInputData();let a;const o=n.getDirection();if(ud(o))a=Jc(e);else{const[e,t,r]=n.getDimensions();a=[[0,0,0],[e-1,0,0],[0,t-1,0],[e-1,t-1,0],[0,0,r-1],[e-1,0,r-1],[0,t-1,r-1],[e-1,t-1,r-1]].map((e=>n.indexToWorld(e)))}const i=id.Z.buildFromDegree().identity().rotateFromDirections(t,[1,0,0]);a.forEach((e=>i.apply(e)));const s=[...r];i.apply(s);const l=s[0];let c=1/0,u=-1/0;for(let e=0;e<8;e++){const t=a[e][0];t>u&&(u=t),tu?f=u:f<0&&(f=0);const g=f*a;p=[p[0]+n[0]*g,p[1]+n[1]*g,p[2]+n[2]*g];return{newFocalPoint:p,newPosition:[p[0]+c[0],p[1]+c[1],p[2]+c[2]]}}const md=function(e){const t=e.getCamera(),{spacingInNormalDirection:r,imageVolume:n}=Qc(e,t);if(!n)return;const{viewPlaneNormal:a,focalPoint:o}=t,i=e.getActors().find((e=>e.referenceId===n.volumeId||e.uid===n.volumeId));i||console.warn("No actor found for with actorUID of",n.volumeId);const s=dd(i.actor,a,o),{min:l,max:c,current:u}=s,d=Math.round((c-l)/r)+1;let f=(u-l)/(c-l)*d;return f=Math.floor(f),f>d-1?f=d-1:f<0&&(f=0),{numberOfSlices:d,imageIndex:f}};function hd(e){return vd(e,"vtkVolume")||vd(e,"vtkImageSlice")}function vd(e,t){return!!e.actor.isA(t)}function yd(e,t){let r;r=t?[Ne(t)]:_e();const n=[];return r.forEach((t=>{const r=t.getStackViewports().filter((t=>t.hasImageURI(e))),a=t.getVolumeViewports().filter((t=>t.hasImageURI(e)));n.push(...r,...a)})),n}function bd(e,t){const r=function(e,t){const r=t.getImageIds(),n=t.getCurrentImageIdIndex();if(0===r.length)return null;const a=t=>{const r=function(e){const t=ut("imagePlaneModule",e);if(!(t&&t.rowCosines instanceof Array&&3===t.rowCosines.length&&t.columnCosines instanceof Array&&3===t.columnCosines.length&&t.imagePositionPatient instanceof Array&&3===t.imagePositionPatient.length))return null;const{rowCosines:r,columnCosines:n,imagePositionPatient:a}=t,o=ot.R3.set(ot.R3.create(),...r),i=ot.R3.set(ot.R3.create(),...n),s=ot.R3.cross(ot.R3.create(),o,i);return{rowCosines:r,columnCosines:n,imagePositionPatient:a,planeNormal:s}}(t);if(!r)return null;return Wd(kd(r.planeNormal,r.imagePositionPatient),e)},o={distance:a(r[n])??1/0,index:n},i=r.slice(n+1);for(let e=0;e=0;e--){const t=a(s[e]);if(null!==t&&t!==o.distance){if(!(t{const[r,n]=e,a=`${r}_${n}`;Td[a]||(Td[a]={}),Td[a]=t},get:(e,t)=>{if("spatialRegistrationModule"!==e)return;const[r,n]=t,a=`${r}_${n}`;if(Td[a])return Td[a];const o=`${n}_${r}`;return Td[o]?ot._E.invert(ot._E.create(),Td[o]):void 0}};st(Cd.get.bind(Cd));const xd=Cd;const Sd=function(e,t){const r=e.getCurrentImageId(),n=t.getCurrentImageId(),a=ut("imagePlaneModule",r),o=ut("imagePlaneModule",n);if(!a||!o)return void console.log("Viewport spatial registration requires image plane module");const{imageOrientationPatient:i}=o,s=a.imageOrientationPatient.every(((e,t)=>Math.abs(e-i[t])<.05));if(!s)return void console.log("Viewport spatial registration only supported for same orientation (hence translation only) for now",a?.imageOrientationPatient,o?.imageOrientationPatient);const l=a.imagePositionPatient,c=o.imagePositionPatient,u=ot.R3.subtract(ot.R3.create(),l,c),d=ot._E.fromTranslation(ot._E.create(),u);xd.add([e.id,t.id],d)};function Pd(e){const{imageData:t,dimensions:r}=e.getImageData(),{canvas:n}=e,a=[n.width,0],o=[n.width,n.height],i=[0,n.height],s=e.canvasToWorld([0,0]),l=e.canvasToWorld(a),c=e.canvasToWorld(o),u=e.canvasToWorld(i),d=t.worldToIndex(s),f=t.worldToIndex(l),p=t.worldToIndex(c),g=t.worldToIndex(u);return function({dimensions:e,imageData:t,topLeftImage:r,topRightImage:n,bottomRightImage:a,bottomLeftImage:o,topLeftWorld:i,topRightWorld:s,bottomRightWorld:l,bottomLeftWorld:c}){const u=wd(r,e)?i:t.indexToWorld([0,0,0]),d=wd(n,e)?s:t.indexToWorld([e[0]-1,0,0]),f=wd(a,e)?l:t.indexToWorld([e[0]-1,e[1]-1,0]),p=wd(o,e)?c:t.indexToWorld([0,e[1]-1,0]);return[u,d,p,f]}({dimensions:r,imageData:t,topLeftImage:d,topRightImage:f,bottomRightImage:p,bottomLeftImage:g,topLeftWorld:s,topRightWorld:l,bottomRightWorld:c,bottomLeftWorld:u})}function wd(e,t){return e[0]>0||e[0]0||e[1]0||e[2]Number.isNaN(e))):Number.isNaN(e)}function Id(e,t){const r=t.colorTransfer.split(" ").splice(1).map(parseFloat),{shiftRange:n}=function(e){let t=1/0,r=-1/0;for(let n=0;n[e*n+t[0],r,a,o]));r.removeAllPoints(),a.forEach((([e,t,n,a])=>r.addRGBPoint(e,t,n,a)))}(s,n,i),e.getProperty().setRGBTransferFunction(0,i);const l=t.scalarOpacity.split(" ").splice(1).map(parseFloat),c=vc.ZP.newInstance(),u=[];for(let e=0;e[e*n+t[0],r]));r.removeAllPoints(),a.forEach((([e,t])=>r.addPoint(e,t)))}(u,n,c),e.getProperty().setScalarOpacity(0,c);const[d,f,p,g]=t.gradientOpacity.split(" ").splice(1).map(parseFloat);e.getProperty().setUseGradientOpacity(0,!0),e.getProperty().setGradientOpacityMinimumValue(0,d),e.getProperty().setGradientOpacityMinimumOpacity(0,f),e.getProperty().setGradientOpacityMaximumValue(0,p),e.getProperty().setGradientOpacityMaximumOpacity(0,g),"1"===t.interpolation&&e.getProperty().setInterpolationTypeToFastLinear();const m=parseFloat(t.ambient),h=parseFloat(t.diffuse),v=parseFloat(t.specular),y=parseFloat(t.specularPower);e.getProperty().setAmbient(m),e.getProperty().setDiffuse(h),e.getProperty().setSpecular(v),e.getProperty().setSpecularPower(y)}const Ad=e=>e&&"object"==typeof e&&"[object RegExp]"!==Object.prototype.toString.call(e)&&"[object Date]"!==Object.prototype.toString.call(e),Rd=(e,t)=>{return t&&!0===t.clone&&Ad(e)?Md((r=e,Array.isArray(r)?[]:{}),e,t):e;var r},Ed=(e,t,r)=>{const n=e.slice();return t.forEach((function(t,a){void 0===n[a]?n[a]=Rd(t,r):Ad(t)?n[a]=Md(e[a],t,r):-1===e.indexOf(t)&&n.push(Rd(t,r))})),n},Md=(e={},t={},r=void 0)=>{const n=Array.isArray(t),a=(r||{arrayMerge:Ed}).arrayMerge||Ed;return n?Array.isArray(e)?a(e,t,r):Rd(t,r):((e,t,r)=>{const n={};return Ad(e)&&Object.keys(e).forEach((function(t){n[t]=Rd(e[t],r)})),Object.keys(t).forEach((function(a){Ad(t[a])&&e[a]?n[a]=Md(e[a],t[a],r):n[a]=Rd(t[a],r)})),n})(e,t,r)},Dd=Md;function Vd(e){const t=ut("modalityLutModule",e)||{},r=ut("generalSeriesModule",e)||{},{modality:n}=r,a={rescaleSlope:t.rescaleSlope,rescaleIntercept:t.rescaleIntercept,modality:n},o=ut("scalingModule",e)||{};return{...a,..."PT"===n&&{suvbw:o.suvbw,suvbsa:o.suvbsa,suvlbm:o.suvlbm}}}function Ld(e,t){let r;if(t&&t instanceof Uint8Array)r="Uint8Array";else if(t instanceof Float32Array)r="Float32Array";else if(t instanceof Int16Array)r="Int16Array";else{if(!(t instanceof Uint16Array))throw new Error("Unsupported array type");r="Uint16Array"}return r}function _d(e){if(!e)return;const{viewportUid:t,renderingEngineUid:r}=e.dataset;return Nd(t,r)}function Nd(e,t){if(!t||!e)return;const r=Ne(t);if(!r||r.hasBeenDestroyed)return;const n=r.getViewport(e);if(!n)return;const a=n.getFrameOfReferenceUID();return{viewport:n,renderingEngine:r,viewportId:e,renderingEngineId:t,FrameOfReferenceUID:a}}function Bd(){const e=[];return _e().forEach((t=>{t.getViewports().forEach((({element:t})=>{e.push(_d(t))}))})),e}const Fd=function(e){const t=_d(e);if(!t)return;const{viewport:r}=t;if(!(r instanceof tp))throw new Error(`An image can only be fetched for a stack viewport and not for a viewport of type: ${r.type}`);return r.getCornerstoneImage()};function Ud(e,t,r){const[n,a,o]=e,[i,s,l]=t,[c,u,d,f]=r,p=i-n,g=s-a,m=l-o,h=-1*(c*n+u*a+d*o-f)/(c*p+u*g+d*m);return[p*h+n,g*h+a,m*h+o]}function kd(e,t){const[r,n,a]=e;return[r,n,a,r*t[0]+n*t[1]+a*t[2]]}function Gd(e,t,r){const[n,a,o,i]=e,[s,l,c,u]=t,[d,f,p,g]=r,m=ot.wO.fromValues(n,s,d,a,l,f,o,c,p),h=ot.wO.fromValues(i,u,g,a,l,f,o,c,p),v=ot.wO.fromValues(n,s,d,i,u,g,o,c,p),y=ot.wO.fromValues(n,s,d,a,l,f,i,u,g);return[ot.wO.determinant(h)/ot.wO.determinant(m),ot.wO.determinant(v)/ot.wO.determinant(m),ot.wO.determinant(y)/ot.wO.determinant(m)]}function Wd(e,t,r=!1){const[n,a,o,i]=e,[s,l,c]=t,u=n*s+a*l+o*c-i,d=Math.abs(u)/Math.sqrt(n*n+a*a+o*o);return(r?Math.sign(u):1)*d}function zd(e,t){return{windowWidth:Math.abs(t-e)+1,windowCenter:(e+t+1)/2}}function jd(e,t){return{lower:t-.5-(e-1)/2,upper:t-.5+(e-1)/2}}const Hd=new Map;function Kd(e){Hd.set(e.Name,e)}function Zd(e){return Hd.get(e)}function Xd(){return Array.from(Hd.keys())}const qd=mt;var Yd=Object.create(null);[{Name:"KAAMS",IndexedColors:[1,1,1,1,0,0,0,1,0,0,0,1,1,1,0,1,0,1,0,1,1,.63,.63,1,.67,.5,.33,1,.5,.75,.53,.35,.7,1,.75,.5],Annotations:[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11]},{ColorSpace:"Diverging",Name:"Cool to Warm",NanColor:[1,1,0],RGBPoints:[0,.23137254902,.298039215686,.752941176471,.5,.865,.865,.865,1,.705882352941,.0156862745098,.149019607843]},{ColorSpace:"Lab",Creator:"Francesca Samsel",Name:"Cool to Warm (Extended)",NanColor:[.25,0,0],RGBPoints:[0,0,0,.34902,.03125,.039216,.062745,.380392,.0625,.062745,.117647,.411765,.09375,.090196,.184314,.45098,.125,.12549,.262745,.501961,.15625,.160784,.337255,.541176,.1875,.2,.396078,.568627,.21875,.239216,.454902,.6,.25,.286275,.521569,.65098,.28125,.337255,.592157,.701961,.3125,.388235,.654902,.74902,.34375,.466667,.737255,.819608,.375,.572549,.819608,.878431,.40625,.654902,.866667,.909804,.4375,.752941,.917647,.941176,.46875,.823529,.956863,.968627,.5,.988235,.960784,.901961,.5,.941176,.984314,.988235,.52,.988235,.945098,.85098,.54,.980392,.898039,.784314,.5625,.968627,.835294,.698039,.59375,.94902,.733333,.588235,.625,.929412,.65098,.509804,.65625,.909804,.564706,.435294,.6875,.878431,.458824,.352941,.71875,.839216,.388235,.286275,.75,.760784,.294118,.211765,.78125,.701961,.211765,.168627,.8125,.65098,.156863,.129412,.84375,.6,.094118,.094118,.875,.54902,.066667,.098039,.90625,.501961,.05098,.12549,.9375,.45098,.054902,.172549,.96875,.4,.054902,.192157,1,.34902,.070588,.211765]},{ColorSpace:"Diverging",Name:"Warm to Cool",NanColor:[1,1,0],RGBPoints:[0,.705882352941,.0156862745098,.149019607843,.5,.865,.865,.865,1,.23137254902,.298039215686,.752941176471]},{ColorSpace:"Lab",Creator:"Francesca Samsel",Name:"Warm to Cool (Extended)",NanColor:[.250004,0,0],RGBPoints:[0,.34902,0,.129412,.025,.4,.00392157,.101961,.05,.470588,.0156863,.0901961,.075,.54902,.027451,.0705882,.1,.619608,.0627451,.0431373,.125,.690196,.12549,.0627451,.15,.741176,.184314,.0745098,.175,.788235,.266667,.0941176,.2,.811765,.345098,.113725,.225,.831373,.411765,.133333,.25,.85098,.47451,.145098,.275,.870588,.54902,.156863,.3,.878431,.619608,.168627,.325,.890196,.658824,.196078,.35,.909804,.717647,.235294,.375,.929412,.776471,.278431,.395522,.94902,.823529,.321569,.418905,.968627,.87451,.407843,.444278,.980392,.917647,.509804,.470149,.988235,.956863,.643137,.483582,.992157,.964706,.713725,.499,.988235,.980392,.870588,.5,1,1,1,.501,.913725,.988235,.937255,.516418,.827451,.980392,.886275,.531343,.764706,.980392,.866667,.546766,.658824,.980392,.843137,.564179,.572549,.964706,.835294,.587562,.423529,.941176,.87451,.60597,.262745,.901961,.862745,.629851,.0705882,.854902,.870588,.651741,.0509804,.8,.85098,.681592,.0235294,.709804,.831373,.712935,.0313725,.615686,.811765,.75,.0313725,.537255,.788235,.775,.0392157,.466667,.768627,.8,.0509804,.396078,.741176,.825,.054902,.317647,.709804,.85,.054902,.243137,.678431,.875,.0431373,.164706,.639216,.9,.0313725,.0980392,.6,.925,.0392157,.0392157,.560784,.95,.105882,.0509804,.509804,.975,.113725,.0235294,.45098,1,.12549,0,.380392]},{ColorSpace:"RGB",Name:"Rainbow Desaturated",NanColor:[1,1,0],RGBPoints:[0,.278431372549,.278431372549,.858823529412,.143,0,0,.360784313725,.285,0,1,1,.429,0,.501960784314,0,.571,1,1,0,.714,1,.380392156863,0,.857,.419607843137,0,0,1,.878431372549,.301960784314,.301960784314]},{ColorSpace:"RGB",Name:"Cold and Hot",NanColor:[1,1,0],RGBPoints:[0,0,1,1,.45,0,0,1,.5,0,0,.501960784314,.55,1,0,0,1,1,1,0]},{ColorSpace:"RGB",Name:"Black-Body Radiation",NanColor:[0,.498039215686,1],RGBPoints:[0,0,0,0,.4,.901960784314,0,0,.8,.901960784314,.901960784314,0,1,1,1,1]},{ColorSpace:"RGB",Name:"X Ray",NanColor:[1,0,0],RGBPoints:[0,1,1,1,1,0,0,0]},{ColorSpace:"RGB",Name:"Grayscale",NanColor:[1,0,0],RGBPoints:[0,0,0,0,1,1,1,1]},{ColorSpace:"RGB",Name:"BkRd",NanColor:[0,1,1],RGBPoints:[0,0,0,0,1,1,0,0]},{ColorSpace:"RGB",Name:"BkGn",NanColor:[1,0,1],RGBPoints:[0,0,0,0,1,0,1,0]},{ColorSpace:"RGB",Name:"BkBu",NanColor:[1,1,0],RGBPoints:[0,0,0,0,1,0,0,1]},{ColorSpace:"RGB",Name:"BkMa",NanColor:[0,1,0],RGBPoints:[0,0,0,0,1,1,0,1]},{ColorSpace:"RGB",Name:"BkCy",NanColor:[0,1,1],RGBPoints:[0,0,0,0,1,0,1,1]},{ColorSpace:"RGB",Name:"Black, Blue and White",NanColor:[1,1,0],RGBPoints:[0,0,0,0,.333,0,0,.501960784314,.666,0,.501960784314,1,1,1,1,1]},{ColorSpace:"RGB",Name:"Black, Orange and White",NanColor:[1,1,0],RGBPoints:[0,0,0,0,.333,.501960784314,0,0,.666,1,.501960784314,0,1,1,1,1]},{ColorSpace:"Lab",Creator:"Francesca Samsel",Name:"Linear YGB 1211g",NanColor:[.25,0,0],RGBPoints:[0,1,.988235,.968627,.02,1,.952941,.878431,.05,.968627,.905882,.776471,.1,.94902,.898039,.647059,.15,.901961,.878431,.556863,.2,.847059,.858824,.482353,.25,.690196,.819608,.435294,.3,.513725,.768627,.384314,.35,.337255,.721569,.337255,.4,.278431,.658824,.392157,.45,.231373,.639216,.435294,.5,.203922,.6,.486275,.55,.172549,.568627,.537255,.6,.141176,.517647,.54902,.65,.133333,.458824,.541176,.7,.12549,.396078,.529412,.75,.117647,.321569,.521569,.8,.121569,.258824,.509804,.85,.133333,.227451,.501961,.9,.145098,.192157,.490196,.95,.188235,.164706,.470588,1,.258824,.196078,.439216]},{ColorSpace:"CIELAB",Creator:"Francesca Samsel",Name:"Linear Green (Gr4L)",NanColor:[.25,0,0],RGBPoints:[0,.054902,.109804,.121569,.05,.07451,.172549,.180392,.1,.086275,.231373,.219608,.15,.094118,.278431,.25098,.2,.109804,.34902,.278431,.25,.113725,.4,.278431,.3,.117647,.45098,.270588,.35,.117647,.490196,.243137,.4,.113725,.521569,.203922,.45,.109804,.54902,.152941,.5,.082353,.588235,.082353,.55,.109804,.631373,.05098,.6,.211765,.678431,.082353,.65,.317647,.721569,.113725,.7,.431373,.760784,.160784,.75,.556863,.8,.239216,.8,.666667,.839216,.294118,.85,.784314,.878431,.396078,.9,.886275,.921569,.533333,.95,.960784,.94902,.670588,1,1,.984314,.901961]},{ColorSpace:"Lab",Creator:"Francesca Samsel",Name:"Linear Blue (8_31f)",NanColor:[.25,0,0],RGBPoints:[0,.960784,1,.980392,.05,.815686,.960784,.913725,.1,.670588,.929412,.870588,.15,.556863,.901961,.843137,.2,.478431,.870588,.823529,.25,.439216,.831373,.803922,.3,.4,.8,.788235,.35,.376471,.768627,.768627,.4,.34902,.709804,.729412,.45,.32549,.654902,.690196,.5,.301961,.607843,.658824,.55,.247059,.545098,.619608,.6,.239216,.494118,.580392,.65,.227451,.439216,.541176,.7,.227451,.403922,.521569,.75,.231373,.368627,.501961,.8,.227451,.321569,.470588,.85,.219608,.282353,.439216,.9,.192157,.235294,.4,.95,.160784,.184314,.34902,1,.133333,.12549,.301961]},{ColorSpace:"HSV",Name:"Blue to Red Rainbow",NanColor:[.498039215686,.498039215686,.498039215686],RGBPoints:[0,0,0,1,1,1,0,0]},{ColorSpace:"HSV",Name:"Red to Blue Rainbow",NanColor:[.498039215686,.498039215686,.498039215686],RGBPoints:[0,1,0,0,1,0,0,1]},{ColorSpace:"RGB",Name:"Rainbow Blended White",NanColor:[1,1,0],RGBPoints:[0,1,1,1,.17,0,0,1,.34,0,1,1,.5,0,1,0,.67,1,1,0,.84,1,0,0,1,.878431372549,0,1]},{ColorSpace:"RGB",Name:"Rainbow Blended Grey",NanColor:[1,1,0],RGBPoints:[0,.317647058824,.341176470588,.43137254902,.17,0,0,1,.34,0,1,1,.5,0,1,0,.67,1,1,0,.84,1,0,0,1,.878431372549,0,1]},{ColorSpace:"RGB",Name:"Rainbow Blended Black",NanColor:[1,1,0],RGBPoints:[0,0,0,0,.17,0,0,1,.34,0,1,1,.5,0,1,0,.67,1,1,0,.84,1,0,0,1,.878431372549,0,1]},{ColorSpace:"RGB",Name:"Blue to Yellow",NanColor:[1,0,0],RGBPoints:[0,.0392156862745,.0392156862745,.949019607843,1,.949019607843,.949019607843,.0392156862745]},{ColorSpace:"HSV",Name:"blot",RGBPoints:[0,0,0,1,.166,0,0,1,.167,1,0,1,.332,1,0,1,.333,0,1,1,.5,0,1,1,.501,0,1,0,.666,0,1,0,.667,1,1,0,.832,1,1,0,.833,1,0,0,1,1,0,0]},{ColorSpace:"Lab",Name:"CIELab Blue to Red",NanColor:[1,1,0],RGBPoints:[0,0,.6,.749019607843,1,.76862745098,.466666666667,.341176470588]},{ColorSpace:"RGB",Name:"jet",RGBPoints:[-1,0,0,.5625,-.777778,0,0,1,-.269841,0,1,1,-.015873,.5,1,.5,.238095,1,1,0,.746032,1,0,0,1,.5,0,0]},{ColorSpace:"RGB",Name:"rainbow",RGBPoints:[-1,0,0,1,-.5,0,1,1,0,0,1,0,.5,1,1,0,1,1,0,0]},{ColorSpace:"Lab",Name:"erdc_rainbow_bright",RGBPoints:[-1,.32549,.14902,.960784,-.866221,.297047,.375586,.963836,-.732441,.180302,.536818,.964627,-.598662,.1302,.649207,.929647,-.464883,.0445143,.749654,.855998,-.331104,.0271325,.830713,.721527,-.197324,.259504,.866145,.543555,-.0635452,.428364,.890725,.329819,.0702341,.568503,.898508,.187623,.204013,.738259,.890317,.0825461,.337793,.84546,.86136,.0147555,.471572,.912191,.808018,0,.605351,.962848,.710445,0,.73913,.999469,.600258,.0176284,.87291,.994156,.445975,.193912,1,.980407,.247105,.262699]},{ColorSpace:"Lab",Name:"erdc_rainbow_dark",RGBPoints:[-1,0,0,.423499,-.866221,0,.119346,.529237,-.732441,0,.238691,.634976,-.598662,0,.346852,.68788,-.464883,0,.45022,.718141,-.331104,0,.553554,.664839,-.197324,0,.651082,.519303,-.0635452,.115841,.72479,.352857,.0702341,.326771,.781195,.140187,.204013,.522765,.798524,.0284624,.337793,.703162,.788685,.00885756,.471572,.845118,.751133,0,.605351,.955734,.690825,0,.73913,.995402,.567916,.0618524,.87291,.987712,.403398,.164851,1,.980407,.247105,.262699]},{ColorSpace:"Lab",Name:"nic_CubicL",RGBPoints:[-1,.479965,.0118108,.5307,-.87451,.522213,.0551282,.706919,-.74902,.50839,.237278,.867764,-.623529,.451617,.373834,.987255,-.498039,.39365,.497255,.97506,-.372549,.328631,.599639,.891843,-.247059,.250043,.690286,.778553,-.121569,.249656,.764905,.645857,.00392157,.297954,.821466,.50449,.129412,.337509,.872595,.358447,.254902,.430011,.913789,.297079,.380392,.587191,.931381,.333353,.505882,.727937,.93591,.353742,.631373,.826403,.921081,.365066,.756863,.893201,.846317,.372662,.882353,.965347,.73884,.378506,1,.983235,.597451,.366856]},{ColorSpace:"Lab",Name:"nic_CubicYF",RGBPoints:[-1,.5151,.0482,.6697,-.87451,.520711,.168955,.800574,-.74902,.493694,.278596,.911824,-.623529,.440026,.369475,.984978,-.498039,.398932,.457593,.987053,-.372549,.350651,.540644,.929608,-.247059,.298827,.615625,.857729,-.121569,.239928,.685061,.769531,.00392157,.228832,.739349,.673287,.129412,.263297,.78608,.569988,.254902,.298107,.828337,.460214,.380392,.33092,.864071,.352674,.505882,.38306,.898169,.287309,.631373,.49023,.917481,.307961,.756863,.62372,.926026,.332309,.882353,.717458,.92527,.342476,1,.8,.9255,.3529]},{ColorSpace:"Lab",Name:"gist_earth",RGBPoints:[-1,0,0,0,-.87451,.239216,.027451,.415686,-.74902,.0901961,.254902,.556863,-.623529,.0941176,.352941,.54902,-.498039,.105882,.435294,.533333,-.372549,.12549,.52549,.501961,-.247059,.156863,.596078,.443137,-.121569,.196078,.65098,.380392,.00392157,.282353,.717647,.301961,.129412,.466667,.772549,.27451,.254902,.678431,.784314,.309804,.380392,.901961,.756863,.376471,.505882,.992157,.705882,.521569,.631373,1,.721569,.701961,.756863,1,.784314,.784314,.882353,1,.866667,.866667,1,1,1,1]},{ColorSpace:"Lab",Name:"2hot",RGBPoints:[-1,.0416667,0,0,-.873016,.208333,0,0,-.746032,.375,0,0,-.619048,.541667,0,0,-.492063,.708333,0,0,-.365079,.854137,0,0,-.238095,.937488,.039062,0,-.111111,1,.208333,0,.015873,1,.375,0,.142857,1,.541667,0,.269841,1,.708333,0,.396825,1,.858805,.03125,.52381,1,.947392,.15625,.650794,1,1,.3125,.777778,1,1,.5625,.904762,1,1,.8125,1,1,1,1]},{ColorSpace:"Lab",Name:"erdc_red2yellow_BW",RGBPoints:[-1,7.54296e-7,0,109827e-10,-.87451,.18285,.0264094,0,-.74902,.3066,0,0,-.623529,.422841,0,0,-.498039,.522945,0,0,-.372549,.605721,0,0,-.247059,.672502,.14168,0,-.121569,.728167,.244025,0,.00392157,.781215,.333454,0,.129412,.825,.423586,0,.254902,.855893,.516793,0,.380392,.880491,.608846,0,.505882,.910305,.695505,0,.631373,.94109,.779067,.223528,.756863,.967873,.858572,.473521,.882353,.986815,.933211,.751583,1,1,1,.999997]},{ColorSpace:"Lab",Name:"erdc_marine2gold_BW",RGBPoints:[-1,1.11641e-7,0,162551e-11,-.87451,.0413146,.0619808,.209857,-.74902,.0185557,.101341,.350684,-.623529,.00486405,.149847,.461054,-.498039,.0836345,.210845,.517906,-.372549,.173222,.276134,.541793,-.247059,.259857,.343877,.535869,-.121569,.362299,.408124,.504293,.00392157,.468266,.468276,.468257,.129412,.582781,.527545,.374914,.254902,.691591,.585251,.274266,.380392,.784454,.645091,.247332,.505882,.862299,.710383,.27518,.631373,.920863,.782923,.351563,.756863,.955792,.859699,.533541,.882353,.976162,.93433,.780671,1,1,1,.999983]},{ColorSpace:"Lab",Name:"erdc_blue2gold_BW",RGBPoints:[-1,0,0,0,-.87451,.0742735,.0440331,.230013,-.74902,.125276,.0258685,.415826,-.623529,.143879,.0163031,.591346,-.498039,.212261,.0627855,.705239,-.372549,.306048,.141178,.763636,-.247059,.391537,.232286,.773263,-.121569,.461734,.336633,.708321,.00392157,.54209,.427581,.590007,.129412,.61704,.508623,.460978,.254902,.702703,.579586,.309117,.380392,.790336,.644811,.170397,.505882,.870173,.710733,.117134,.631373,.93656,.781991,.157144,.756863,.965672,.862068,.409836,.882353,.985751,.936296,.714162,1,1,1,.999999]},{ColorSpace:"Lab",Name:"erdc_sapphire2gold_BW",RGBPoints:[-1,.107704,.107708,.107694,-.87451,.1851,.112354,.308554,-.74902,.236782,.114233,.48788,-.623529,.28296,.126187,.639464,-.498039,.344787,.171643,.739713,-.372549,.413325,.242371,.76913,-.247059,.481863,.3131,.719841,-.121569,.550402,.383829,.612222,.00392157,.61894,.454558,.51126,.129412,.687478,.525287,.39993,.254902,.756017,.596016,.289923,.380392,.824555,.666745,.255498,.505882,.892979,.736822,.27696,.631373,.938851,.804966,.351734,.756863,.966491,.874853,.53572,.882353,.982105,.94153,.782579,1,1,1,.999986]},{ColorSpace:"Lab",Name:"erdc_red2purple_BW",RGBPoints:[-1,0,0,0,-.87451,.167793,.0166271,.0431278,-.74902,.262608,.0107595,.0791181,-.623529,.351902,.0101858,.100926,-.498039,.441257,.0160835,.131919,-.372549,.5221,.0555972,.195625,-.247059,.593852,.104294,.310234,-.121569,.654628,.158115,.448486,.00392157,.707443,.220914,.570253,.129412,.749504,.293268,.67897,.254902,.781587,.370517,.779269,.380392,.809951,.451099,.855831,.505882,.84424,.531462,.900451,.631373,.865174,.620901,.91606,.756863,.875041,.714054,.910284,.882353,.880764,.80554,.896276,1,.887572,.887591,.887556]},{ColorSpace:"Lab",Name:"erdc_purple2pink_BW",RGBPoints:[-1,0,0,0,-.87451,.117562,.0291202,.175876,-.74902,.178368,.0458476,.285454,-.623529,.237731,.0680173,.387717,-.498039,.300877,.0956291,.484802,-.372549,.370929,.136858,.554985,-.247059,.449033,.189273,.58863,-.121569,.529971,.245796,.598587,.00392157,.609914,.300643,.610244,.129412,.697079,.351286,.616371,.254902,.785858,.401991,.617376,.380392,.862517,.45745,.64463,.505882,.91359,.525462,.705336,.631373,.932583,.61064,.767412,.756863,.922478,.706966,.817522,.882353,.901302,.803071,.856311,1,.887571,.887591,.887549]},{ColorSpace:"Lab",Name:"erdc_pbj_lin",RGBPoints:[-1,0,0,0,-.87451,.091821,.0611476,.10617,-.74902,.160311,.0900022,.192713,-.623529,.22484,.12126,.272128,-.498039,.291263,.157469,.340828,-.372549,.360015,.200388,.388903,-.247059,.437497,.250058,.387201,-.121569,.512636,.304969,.355955,.00392157,.582603,.360874,.33488,.129412,.655126,.416374,.306351,.254902,.725889,.473329,.279051,.380392,.778125,.537928,.302697,.505882,.815894,.606931,.382431,.631373,.839159,.679308,.497608,.756863,.854748,.751666,.631792,.882353,.869483,.822508,.768592,1,.887572,.887589,.887565]},{ColorSpace:"Lab",Name:"erdc_blue2green_muted",RGBPoints:[-1,.107704,.107708,.107695,-.87451,.141522,.13066,.270741,-.74902,.180123,.146119,.42308,-.623529,.210161,.169674,.551795,-.498039,.239701,.212939,.634969,-.372549,.253916,.282947,.653641,-.247059,.242791,.366933,.608521,-.121569,.226302,.446776,.52693,.00392157,.236237,.514689,.458798,.129412,.274641,.577589,.376069,.254902,.349625,.633993,.288131,.380392,.4437,.683677,.260497,.505882,.536247,.731214,.285424,.631373,.628472,.777128,.349151,.756863,.718259,.819287,.496825,.882353,.804768,.856164,.703299,1,.887571,.887591,.887548]},{ColorSpace:"Lab",Name:"erdc_blue2green_BW",RGBPoints:[-1,3.63578e-7,0,529374e-11,-.87451,.0539915,.0577948,.212806,-.74902,.0620393,.0758942,.388959,-.623529,.0697499,.102032,.54177,-.498039,.113295,.156156,.64334,-.372549,.152047,.243196,.670283,-.247059,.158096,.344084,.622864,-.121569,.151142,.43922,.532767,.00392157,.17155,.521588,.457719,.129412,.225861,.599141,.363997,.254902,.32328,.67007,.259083,.380392,.442344,.733697,.223754,.505882,.558409,.794941,.257411,.631373,.673875,.854344,.340822,.756863,.787244,.909326,.524717,.882353,.896483,.958063,.775914,1,1,1,.999982]},{ColorSpace:"Lab",Name:"GREEN-WHITE_LINEAR",RGBPoints:[-1,0,0,0,-.87451,0,.062745,0,-.74902,0,.12549,0,-.623529,0,.188235,0,-.498039,0,.25098,0,-.372549,0,.313725,0,-.247059,0,.376471,0,-.121569,.094118,.439216,0,.00392157,.196078,.501961,0,.129412,.294118,.564706,0,.254902,.396078,.627451,0,.380392,.498039,.690196,0,.505882,.6,.752941,.145098,.631373,.701961,.815686,.364706,.756863,.8,.878431,.580392,.882353,.901961,.941176,.796078,1,1,1,1]},{ColorSpace:"Lab",Name:"erdc_green2yellow_BW",RGBPoints:[-1,0,0,0,-.87451,0,.105542,.0603919,-.74902,0,.159454,.104148,-.623529,0,.219502,.15542,-.498039,0,.282276,.203811,-.372549,0,.346331,.235652,-.247059,0,.411765,.235428,-.121569,0,.477177,.217977,.00392157,.0593644,.541635,.21361,.129412,.233081,.604722,.210591,.254902,.369803,.664942,.226536,.380392,.498446,.722367,.288237,.505882,.601929,.782244,.380815,.631373,.703207,.840497,.512134,.756863,.803186,.896433,.674462,.882353,.903834,.950266,.846715,1,1,1,.999981]},{ColorSpace:"Lab",Name:"blue2cyan",RGBPoints:[-1,0,0,0,-.87451,0,.152941,.364706,-.74902,0,.254902,.470588,-.623529,0,.34902,.572549,-.498039,0,.443137,.670588,-.372549,0,.537255,.772549,-.247059,0,.627451,.870588,-.121569,0,.717647,.964706,.00392157,.0784314,.772549,1,.129412,.207843,.858824,1,.254902,.32549,.941176,1,.380392,.45098,1,1,.505882,.560784,1,1,.631373,.662745,1,1,.756863,.760784,1,1,.882353,.870588,1,1,1,1,1,1]},{ColorSpace:"Lab",Name:"erdc_blue2cyan_BW",RGBPoints:[-1,4.05298e-7,0,59012e-10,-.87451,.0207526,.0740933,.18093,-.74902,0,.121033,.30343,-.623529,0,.166892,.416095,-.498039,0,.216768,.524796,-.372549,.0164769,.275471,.608585,-.247059,.0544527,.344824,.659267,-.121569,.0880643,.419118,.688675,.00392157,.127938,.492556,.720256,.129412,.149476,.566946,.756918,.254902,.188961,.641333,.792122,.380392,.245482,.715336,.827609,.505882,.329216,.786235,.874761,.631373,.453558,.852803,.918466,.756863,.626281,.910493,.954,.882353,.82257,.958709,.980146,1,1,1,.999989]},{ColorSpace:"Lab",Name:"erdc_blue_BW",RGBPoints:[-1,0,0,0,-.87451,.0425591,.0763529,.150682,-.74902,.0569472,.119154,.275403,-.623529,.0635978,.164772,.395427,-.498039,.0774342,.213851,.510014,-.372549,.106815,.267034,.615102,-.247059,.122093,.324649,.720068,-.121569,.160851,.387068,.806956,.00392157,.213754,.453516,.878012,.129412,.26722,.524656,.932436,.254902,.326844,.599279,.968038,.380392,.403403,.674712,.984784,.505882,.499703,.745519,1,.631373,.615055,.813983,1,.756863,.74405,.879228,1,.882353,.877909,.941913,1,1,1,1,.999996]},{ColorSpace:"Lab",Name:"BLUE-WHITE",RGBPoints:[-1,0,0,0,-.87451,0,0,.082353,-.74902,0,0,.168627,-.623529,0,0,.254902,-.498039,0,0,.337255,-.372549,0,0,.423529,-.247059,0,0,.509804,-.121569,0,.101961,.592157,.00392157,0,.203922,.678431,.129412,0,.301961,.764706,.254902,0,.403922,.85098,.380392,0,.505882,.933333,.505882,0,.603922,1,.631373,.254902,.705882,1,.756863,.509804,.807843,1,.882353,.764706,.905882,1,1,1,1,1]},{ColorSpace:"Lab",Name:"erdc_purple_BW",RGBPoints:[-1,4.264e-8,0,6.20844e-7,-.87451,.100579,.0593111,.145666,-.74902,.167794,.0889224,.254953,-.623529,.231446,.123339,.360511,-.498039,.296699,.163027,.461278,-.372549,.363211,.209286,.55306,-.247059,.431136,.260776,.637195,-.121569,.498202,.320012,.705799,.00392157,.567456,.380459,.778091,.129412,.629381,.445284,.8448,.254902,.688373,.517374,.895694,.380392,.74891,.590906,.93976,.505882,.805017,.667956,.977626,.631373,.850914,.752618,.992396,.756863,.89724,.838454,.994093,.882353,.948461,.922603,.994449,1,1,1,.999967]},{ColorSpace:"Lab",Name:"erdc_magenta_BW",RGBPoints:[-1,0,0,254023e-10,-.87451,.128696,.0456782,.11635,-.74902,.228133,.0476299,.201452,-.623529,.327273,.0374065,.282107,-.498039,.420953,.0408166,.35709,-.372549,.511562,.0642203,.430511,-.247059,.599552,.102686,.504257,-.121569,.684646,.150536,.579429,.00392157,.765817,.205978,.656062,.129412,.839176,.27229,.731807,.254902,.89536,.357594,.797309,.380392,.930238,.457825,.846984,.505882,.945921,.564536,.880571,.631373,.948995,.670753,.902279,.756863,.947124,.772819,.918171,.882353,.947265,.869424,.934352,1,.954719,.95475,.954726]},{ColorSpace:"Lab",Name:"magenta",RGBPoints:[-1,0,0,0,-.87451,.364706,0,.152941,-.74902,.470588,0,.254902,-.623529,.572549,0,.34902,-.498039,.670588,0,.443137,-.372549,.772549,0,.537255,-.247059,.870588,0,.627451,-.121569,.964706,0,.717647,.00392157,1,.0784314,.772549,.129412,1,.207843,.858824,.254902,1,.32549,.941176,.380392,1,.45098,1,.505882,1,.560784,1,.631373,1,.662745,1,.756863,1,.760784,1,.882353,1,.870588,1,1,1,1,1]},{ColorSpace:"Lab",Name:"RED-PURPLE",RGBPoints:[-1,0,0,0,-.87451,.188235,0,.007843,-.74902,.345098,0,.035294,-.623529,.439216,0,.098039,-.498039,.533333,0,.152941,-.372549,.627451,.015686,.211765,-.247059,.721569,.031373,.266667,-.121569,.8,.047059,.329412,.00392157,.862745,.047059,.403922,.129412,.941176,.062745,.466667,.254902,.988235,.078431,.54902,.380392,.988235,.141176,.643137,.505882,.988235,.25098,.729412,.631373,.988235,.376471,.811765,.756863,.988235,.54902,.886275,.882353,.988235,.752941,.952941,1,.996078,.996078,.996078]},{ColorSpace:"Lab",Name:"erdc_red_BW",RGBPoints:[-1,0,0,0,-.87451,.147204,.0480135,.0401815,-.74902,.253411,.0617478,.0301333,-.623529,.356059,.0746331,.0446897,-.498039,.457731,.0934935,.0636931,-.372549,.557199,.122714,.0860013,-.247059,.665179,.144238,.105585,-.121569,.763833,.187056,.138326,.00392157,.847035,.254558,.189407,.129412,.905663,.345937,.258215,.254902,.941431,.447111,.346277,.380392,.962608,.546927,.457571,.505882,.987833,.637276,.569944,.631373,.994202,.732176,.687958,.756863,.993304,.826268,.800567,.882353,.994413,.917205,.906393,1,1,1,.999979]},{ColorSpace:"Lab",Name:"RED_TEMPERATURE",RGBPoints:[-1,0,0,0,-.87451,.090196,0,0,-.74902,.180392,0,0,-.623529,.270588,0,0,-.498039,.360784,0,0,-.372549,.45098,0,0,-.247059,.545098,0,0,-.121569,.635294,0,0,.00392157,.72549,.058824,0,.129412,.815686,.176471,0,.254902,.905882,.294118,0,.380392,1,.411765,0,.505882,1,.533333,.027451,.631373,1,.65098,.27451,.756863,1,.768627,.521569,.882353,1,.886275,.768627,1,1,1,1]},{ColorSpace:"Lab",Name:"erdc_orange_BW",RGBPoints:[-1,0,0,253806e-10,-.87451,.135871,.0593824,0,-.74902,.224328,.0907216,0,-.623529,.318083,.119647,0,-.498039,.414443,.150246,0,-.372549,.511077,.184884,0,-.247059,.605501,.226033,0,-.121569,.695274,.275491,0,.00392157,.777826,.334445,0,.129412,.851498,.402441,0,.254902,.915899,.47759,602975e-9,.380392,.971984,.557882,.0361443,.505882,1,.641287,.135967,.631373,1,.725198,.27997,.756863,1,.808205,.438135,.882353,1,.89306,.587036,1,1,.977928,.721599]},{ColorSpace:"Lab",Name:"heated_object",RGBPoints:[-1,0,0,0,-.87451,.34902,.0862745,0,-.74902,.45098,.172549,0,-.623529,.52549,.231373,0,-.498039,.580392,.278431,0,-.372549,.623529,.313725,0,-.247059,.670588,.352941,0,-.121569,.717647,.392157,0,.00392157,.772549,.439216,0,.129412,.839216,.494118,0,.254902,.901961,.541176,0,.380392,.968627,.6,0,.505882,1,.658824,0,.631373,1,.721569,0,.756863,1,.827451,.298039,.882353,1,.976471,.72549,1,1,1,1]},{ColorSpace:"Lab",Name:"erdc_gold_BW",RGBPoints:[-1,0,0,190933e-10,-.87451,.128363,.0636265,0,-.74902,.193795,.111057,0,-.623529,.25976,.15987,0,-.498039,.328546,.210589,0,-.372549,.399726,.26332,0,-.247059,.472969,.318261,0,-.121569,.546245,.375827,0,.00392157,.61745,.436719,0,.129412,.685545,.501113,0,.254902,.749578,.568799,0,.380392,.80962,.6394,0,.505882,.865572,.712699,.10257,.631373,.917709,.787569,.233665,.756863,.966914,.863138,.369608,.882353,1,.939405,.496104,1,.999225,1,.612275]},{ColorSpace:"Lab",Name:"erdc_brown_BW",RGBPoints:[-1,3.3216e-7,0,483629e-11,-.87451,.14693,.0518172,0,-.74902,.225806,.0814996,0,-.623529,.301681,.111452,0,-.498039,.370487,.150664,0,-.372549,.43108,.199477,0,-.247059,.4849,.255107,0,-.121569,.536798,.313486,0,.00392157,.59286,.371167,0,.129412,.653119,.428135,0,.254902,.714589,.485917,.0379541,.380392,.774667,.54565,.116634,.505882,.831222,.608047,.183895,.631373,.880305,.674199,.260298,.756863,.922314,.742472,.367086,.882353,.959408,.811222,.497258,1,.993548,.875183,.622093]},{ColorSpace:"Lab",Name:"copper_Matlab",RGBPoints:[-1,0,0,0,-.87451,.0784314,.0501961,.0313725,-.74902,.156863,.100392,.0627451,-.623529,.235294,.150588,.0941176,-.498039,.313725,.200784,.12549,-.372549,.392157,.25098,.156863,-.247059,.470588,.301176,.188235,-.121569,.54902,.351373,.219608,.00392157,.627451,.401569,.25098,.129412,.705882,.451765,.282353,.254902,.784314,.501961,.313725,.380392,.862745,.552157,.345098,.505882,.941176,.602353,.376471,.631373,1,.652549,.407843,.756863,1,.702745,.439216,.882353,1,.752941,.470588,1,1,.8,.5]},{ColorSpace:"Lab",Name:"pink_Matlab",RGBPoints:[-1,0,0,0,-.87451,.312416,.204524,.204524,-.74902,.441822,.289241,.289241,-.623529,.54112,.354246,.354246,-.498039,.624831,.409048,.409048,-.372549,.698582,.45733,.45733,-.247059,.764404,.502282,.500979,-.121569,.791292,.591516,.54112,.00392157,.817297,.66895,.578481,.129412,.842499,.738308,.613572,.254902,.866968,.801687,.646762,.380392,.890766,.86041,.678329,.505882,.913944,.913944,.711254,.631373,.936549,.936549,.79459,.756863,.958621,.958621,.869979,.882353,.980196,.980196,.939336,1,1,1,1]},{ColorSpace:"Lab",Name:"bone_Matlab",RGBPoints:[-1,0,0,0,-.87451,.054902,.054902,.075817,-.74902,.109804,.109804,.151634,-.623529,.164706,.164706,.227451,-.498039,.219608,.219608,.303268,-.372549,.27451,.27451,.379085,-.247059,.329412,.329902,.454412,-.121569,.384314,.405719,.509314,.00392157,.439216,.481536,.564216,.129412,.494118,.557353,.619118,.254902,.54902,.63317,.67402,.380392,.603922,.708987,.728922,.505882,.660294,.783824,.783824,.631373,.746569,.838725,.838725,.756863,.832843,.893627,.893627,.882353,.919118,.948529,.948529,1,1,1,1]},{ColorSpace:"Lab",Name:"gray_Matlab",RGBPoints:[-1,0,0,0,-.87451,.0627451,.0627451,.0627451,-.74902,.12549,.12549,.12549,-.623529,.188235,.188235,.188235,-.498039,.25098,.25098,.25098,-.372549,.313725,.313725,.313725,-.247059,.376471,.376471,.376471,-.121569,.439216,.439216,.439216,.00392157,.501961,.501961,.501961,.129412,.564706,.564706,.564706,.254902,.627451,.627451,.627451,.380392,.690196,.690196,.690196,.505882,.752941,.752941,.752941,.631373,.815686,.815686,.815686,.756863,.878431,.878431,.878431,.882353,.941176,.941176,.941176,1,1,1,1]},{ColorSpace:"Lab",Name:"Purples",RGBPoints:[-1,.247059,0,.490196,-.87451,.288397,.07677,.525629,-.74902,.32975,.153587,.561092,-.623529,.373057,.236263,.600461,-.498039,.416363,.319,.639923,-.372549,.459669,.405613,.685198,-.247059,.503345,.491534,.730058,-.121569,.562399,.54862,.757616,.00392157,.621453,.606075,.785544,.129412,.680508,.674971,.824914,.254902,.739562,.743406,.863899,.380392,.798616,.800492,.893426,.505882,.85684,.856655,.922491,.631373,.898178,.894056,.942176,.756863,.938654,.930919,.961646,.882353,.964245,.958478,.977393,1,.988235,.984314,.992157]},{ColorSpace:"Lab",Name:"Blues",RGBPoints:[-1,.031373,.188235,.419608,-.87451,.031373,.253195,.516063,-.74902,.031757,.318139,.612149,-.623529,.080969,.38113,.661361,-.498039,.130427,.444152,.710327,-.372549,.195386,.509112,.743791,-.247059,.260715,.573841,.777209,-.121569,.341423,.628958,.808704,.00392157,.422745,.684075,.839892,.129412,.523137,.739193,.861546,.254902,.622684,.793464,.883429,.380392,.701423,.826928,.910988,.505882,.778685,.8603,.937993,.631373,.825928,.891795,.953741,.756863,.87328,.923291,.969489,.882353,.922491,.954787,.985236,1,.968627,.984314,1]},{ColorSpace:"Lab",Name:"Greens",RGBPoints:[-1,0,.266667,.105882,-.87451,0,.347374,.139346,-.74902,538e-6,.427912,.172933,-.623529,.069435,.486967,.222145,-.498039,.138178,.546082,.271326,-.372549,.197232,.609073,.31857,-.247059,.257255,.671742,.365859,-.121569,.357647,.720953,.415071,.00392157,.45767,.769919,.465021,.129412,.546251,.811257,.537855,.254902,.634295,.852211,.610688,.380392,.709097,.883706,.683522,.505882,.78316,.914833,.755894,.631373,.842215,.938454,.818885,.756863,.899977,.961538,.880692,.882353,.935409,.975317,.92203,1,.968627,.988235,.960784]},{ColorSpace:"Lab",Name:"PuBu",RGBPoints:[-1,.301961,0,.294118,-.87451,.404321,.029527,.390573,-.74902,.50599,.059592,.486782,-.623529,.519769,.158016,.551742,-.498039,.533456,.256194,.616301,-.372549,.54133,.33887,.655671,-.247059,.54902,.421592,.695087,-.121569,.54902,.506236,.736424,.00392157,.550127,.590573,.777701,.129412,.585559,.665375,.81707,.254902,.622145,.739023,.855825,.380392,.687105,.784298,.879446,.505882,.752065,.829758,.903253,.631373,.817024,.87897,.930811,.756863,.880907,.927213,.957832,.882353,.926182,.958708,.975548,1,.968627,.988235,.992157]},{ColorSpace:"Lab",Name:"BuPu",RGBPoints:[-1,.007843,.219608,.345098,-.87451,.01178,.286536,.449427,-.74902,.015702,.35328,.553479,-.623529,.01767,.396586,.622376,-.498039,.021115,.4402,.690688,-.372549,.11757,.503191,.722184,-.247059,.214625,.565859,.753633,-.121569,.336671,.615071,.78316,.00392157,.457978,.663975,.812503,.129412,.556401,.703345,.836125,.254902,.65421,.742714,.859669,.380392,.736886,.782084,.881323,.505882,.81827,.821638,.903068,.631373,.873387,.864944,.92669,.756863,.927536,.907605,.949988,.882353,.964937,.9391,.967705,1,1,.968627,.984314]},{ColorSpace:"Lab",Name:"BuGn",RGBPoints:[-1,.031373,.25098,.505882,-.87451,.031373,.329719,.590527,-.74902,.031911,.408397,.674787,-.623529,.100807,.479262,.710219,-.498039,.169704,.550219,.745744,-.372549,.238601,.62699,.787082,-.247059,.307958,.703114,.826759,-.121569,.39654,.752326,.797232,.00392157,.485121,.801046,.767705,.129412,.573702,.83451,.738178,.254902,.661592,.867743,.711034,.380392,.732457,.895302,.74253,.505882,.801845,.922307,.774579,.631373,.841215,.938055,.817885,.756863,.880907,.95391,.861084,.882353,.926182,.971626,.902422,1,.968627,.988235,.941176]},{ColorSpace:"Lab",Name:"GnBu",RGBPoints:[-1,0,.266667,.105882,-.87451,0,.347374,.139346,-.74902,538e-6,.427912,.172933,-.623529,.069435,.486967,.222145,-.498039,.138178,.546175,.272095,-.372549,.197232,.615071,.368551,-.247059,.256609,.683276,.464867,-.121569,.329443,.722645,.555417,.00392157,.403137,.762138,.645413,.129412,.503529,.805444,.718247,.254902,.603922,.848597,.790465,.380392,.704314,.887966,.847551,.505882,.802307,.926321,.903714,.631373,.851519,.944037,.941115,.756863,.899977,.961538,.976901,.882353,.935409,.975317,.984775,1,.968627,.988235,.992157]},{ColorSpace:"Lab",Name:"GnBuPu",RGBPoints:[-1,.003922,.27451,.211765,-.87451,.003922,.349312,.280661,-.74902,.003937,.423852,.349773,-.623529,.005905,.46519,.446228,-.498039,.009443,.506344,.542837,-.372549,.111803,.535871,.649135,-.247059,.214025,.565859,.753633,-.121569,.310481,.615071,.78316,.00392157,.407797,.663975,.812503,.129412,.531811,.703345,.836125,.254902,.65421,.742714,.859669,.380392,.736886,.782084,.881323,.505882,.81827,.821176,.902884,.631373,.873387,.854641,.922568,.756863,.927536,.888535,.942361,.882353,.964937,.929873,.964014,1,1,.968627,.984314]},{ColorSpace:"Lab",Name:"BuGnYl",RGBPoints:[-1,.031373,.113725,.345098,-.87451,.088458,.159,.463206,-.74902,.145052,.204567,.5807,-.623529,.139146,.287243,.620069,-.498039,.13318,.370196,.659562,-.372549,.123337,.470588,.706805,-.247059,.115386,.570335,.753126,-.121569,.186251,.643168,.761,.00392157,.258716,.71514,.768074,.129412,.380761,.760415,.750358,.254902,.503576,.806075,.732795,.380392,.645306,.861192,.719016,.505882,.783899,.91511,.705606,.631373,.858701,.944637,.6997,.756863,.931349,.973303,.698424,.882353,.966782,.987082,.777163,1,1,1,.85098]},{ColorSpace:"Lab",Name:"PuRd",RGBPoints:[-1,.286275,0,.415686,-.87451,.38273,.001968,.441276,-.74902,.479231,.003922,.466774,-.623529,.581592,.003922,.480554,-.498039,.683799,.00549,.494887,-.372549,.776317,.105882,.544098,-.247059,.867866,.206321,.592618,-.121569,.919047,.308681,.612303,.00392157,.968812,.411226,.632603,.129412,.974717,.519493,.671972,.254902,.980546,.626451,.71065,.380392,.984483,.701253,.732303,.505882,.988328,.77504,.755617,.631373,.990296,.828189,.812703,.756863,.992372,.880907,.869035,.882353,.996309,.926182,.912341,1,1,.968627,.952941]},{ColorSpace:"Lab",Name:"RdPu",RGBPoints:[-1,.403922,0,.121569,-.87451,.500377,0,.192434,-.74902,.596909,277e-6,.263037,-.623529,.703206,.035709,.300438,-.498039,.808612,.071296,.338854,-.372549,.857824,.116571,.441215,-.247059,.905513,.163552,.54293,-.121569,.889765,.281661,.617732,.00392157,.873156,.39897,.691611,.129412,.82985,.491488,.736886,.254902,.789081,.583237,.781853,.380392,.810734,.656071,.819254,.505882,.833126,.729181,.85684,.631373,.870527,.80792,.898178,.756863,.907605,.884398,.938331,.882353,.9391,.921799,.958016,1,.968627,.956863,.976471]},{ColorSpace:"Lab",Name:"Oranges",RGBPoints:[-1,.498039,.152941,.015686,-.87451,.57481,.182468,.013718,-.74902,.651765,.212042,.011734,-.623529,.752157,.247474,.007797,-.498039,.851719,.283368,.004475,-.372549,.898962,.348328,.039908,-.247059,.945652,.413426,.076401,-.121569,.969273,.484291,.157109,.00392157,.992157,.554971,.238185,.129412,.992157,.619931,.330704,.254902,.992157,.684967,.423837,.380392,.992157,.751895,.532103,.505882,.992249,.817716,.639354,.631373,.994218,.861023,.725967,.756863,.996186,.903576,.810965,.882353,.998155,.933103,.868051,1,1,.960784,.921569]},{ColorSpace:"Lab",Name:"Reds",RGBPoints:[-1,.403922,0,.05098,-.87451,.525967,.029527,.066728,-.74902,.647643,.058962,.082476,-.623529,.722445,.076678,.098224,-.498039,.797186,.095194,.114187,-.372549,.868051,.164091,.143714,-.247059,.937809,.233541,.173933,-.121569,.96143,.326059,.232987,.00392157,.984375,.418147,.292657,.129412,.986344,.496886,.371396,.254902,.988235,.575702,.450673,.380392,.988235,.656409,.543191,.505882,.98842,.736747,.635894,.631373,.992357,.809581,.732349,.756863,.996186,.880692,.826759,.882353,.998155,.92203,.885813,1,1,.960784,.941176]},{ColorSpace:"Lab",Name:"RdOr",RGBPoints:[-1,.498039,0,0,-.87451,.6004,0,0,-.74902,.702514,738e-6,477e-6,-.623529,.773379,.095225,.061499,-.498039,.843875,.189865,.12283,-.372549,.891119,.294195,.203537,-.247059,.937855,.397924,.283137,-.121569,.963445,.476663,.316601,.00392157,.988297,.555771,.351665,.129412,.990265,.646321,.436309,.254902,.992157,.735256,.519646,.380392,.992157,.784468,.570827,.505882,.992249,.833218,.623483,.631373,.994218,.872587,.706159,.756863,.996186,.911419,.788189,.882353,.998155,.940946,.859054,1,1,.968627,.92549]},{ColorSpace:"Lab",Name:"BrOrYl",RGBPoints:[-1,.4,.145098,.023529,-.87451,.500392,.174625,.019592,-.74902,.600784,.204291,.015656,-.623529,.701176,.251534,.011719,-.498039,.800984,.299146,.008397,-.372549,.863975,.370012,.043829,-.247059,.926321,.441107,.0794,-.121569,.961753,.521815,.120738,.00392157,.996078,.602645,.163122,.129412,.996078,.68729,.237924,.254902,.996078,.771011,.314879,.380392,.996078,.832034,.444798,.505882,.996171,.892042,.572595,.631373,.998139,.931411,.65724,.756863,1,.969489,.741669,.882353,1,.985236,.822376,1,1,1,.898039]},{ColorSpace:"Lab",Name:"RdOrYl",RGBPoints:[-1,.501961,0,.14902,-.87451,.622038,0,.14902,-.74902,.741761,4e-4,.148866,-.623529,.816563,.05158,.129181,-.498039,.890965,.10356,.110235,-.372549,.940177,.205921,.137793,-.247059,.988281,.308789,.165536,-.121569,.99025,.432803,.200969,.00392157,.992218,.555217,.236278,.129412,.994187,.628051,.267774,.254902,.996078,.701038,.301269,.380392,.996078,.777809,.383945,.505882,.996171,.852826,.466621,.631373,.998139,.892195,.549296,.756863,1,.931349,.632188,.882353,1,.966782,.7188,1,1,1,.8]},{ColorSpace:"Lab",Name:"CIELab_blue2red",RGBPoints:[-1,0,.6,.74902,1,.76863,.46667,.34118]},{ColorSpace:"Lab",Name:"blue2yellow",RGBPoints:[-1,0,0,1,0,.5,.5,.5,1,1,1,0]},{ColorSpace:"Lab",Name:"erdc_blue2gold",RGBPoints:[-1,.175119,.0438468,1,-.874016,.22383,.159771,.94557,-.748031,.27254,.233611,.891216,-.622047,.321251,.296526,.836857,-.496063,.369962,.354296,.782359,-.370079,.418672,.409139,.72754,-.244094,.467383,.462152,.672148,-.11811,.51609,.51396,.615825,.00787402,.572863,.55452,.559172,.133858,.630269,.593822,.517729,.259843,.689588,.624668,.47446,.385827,.745394,.656113,.428638,.511811,.798624,.688104,.379105,.637795,.849926,.720593,.323834,.76378,.899765,.753543,.258657,.889764,.948487,.78692,.171778,1,.990413,.816451,.00729848]},{ColorSpace:"Lab",Name:"erdc_blue2yellow",RGBPoints:[-1,.0830122,0,.495617,-.87451,.141973,.0551288,.57363,-.74902,.193048,.110258,.604561,-.623529,.234231,.165386,.57643,-.498039,.275413,.220515,.548299,-.372549,.316596,.275644,.520169,-.247059,.357778,.330773,.492038,-.121569,.398961,.385901,.463908,.00392157,.449929,.438487,.426815,.129412,.511572,.488299,.379944,.254902,.581222,.53603,.325741,.380392,.650871,.583761,.271538,.505882,.720521,.631493,.217335,.631373,.79017,.679224,.163132,.756863,.85982,.726955,.108929,.882353,.910254,.774159,.14112,1,.927513,.81759,.306289]},{ColorSpace:"Lab",Name:"erdc_cyan2orange",RGBPoints:[-1,.0471513,.213874,.414329,-.87451,.0674702,.256648,.439027,-.74902,.0959957,.299331,.462089,-.623529,.132428,.341872,.483212,-.498039,.188743,.38277,.500597,-.372549,.268511,.420229,.512179,-.247059,.352945,.455602,.519101,-.121569,.43893,.489368,.521538,.00392157,.522445,.522495,.522436,.129412,.600089,.555682,.53205,.254902,.67988,.587981,.539163,.380392,.761011,.619586,.544439,.505882,.84278,.650741,.548567,.631373,.910713,.687347,.557822,.756863,.952232,.734972,.577775,.882353,.975642,.789858,.604868,1,.990752,.843643,.632857]},{ColorSpace:"Lab",Name:"erdc_purple2green",RGBPoints:[-1,.235006,.0483128,.530899,-.87451,.302968,.108419,.552391,-.74902,.360241,.166059,.569502,-.623529,.406746,.226782,.579373,-.498039,.444073,.28964,.582094,-.372549,.473648,.353774,.577947,-.247059,.497636,.418154,.567911,-.121569,.519086,.481741,.553968,.00392157,.542884,.542914,.542875,.129412,.566303,.603989,.527499,.254902,.595218,.662965,.516857,.380392,.628641,.720701,.510673,.505882,.665373,.777849,.508165,.631373,.704182,.834921,.508303,.756863,.743846,.892328,.50999,.882353,.783158,.950422,.512181,1,.818617,1,.513888]},{ColorSpace:"Lab",Name:"erdc_purple2green_dark",RGBPoints:[-1,.107656,0,.428682,-.87451,.1924,0,.449799,-.74902,.255118,.0648939,.466726,-.623529,.304256,.133066,.476703,-.498039,.343202,.19716,.479793,-.372549,.373876,.260353,.476241,-.247059,.398497,.322872,.466953,-.121569,.420016,.384252,.453785,.00392157,.44319,.443216,.443186,.129412,.465553,.502139,.428233,.254902,.492959,.559151,.417591,.380392,.524654,.615092,.411016,.505882,.55959,.670583,.40779,.631373,.596614,.726102,.406948,.756863,.634544,.782032,.407439,.882353,.672183,.838703,.408237,1,.706131,.892759,.408452]},{ColorSpace:"Lab",Name:"coolwarm",RGBPoints:[-1,.229806,.298718,.753683,-.875,.303869,.406535,.844959,-.75,.383013,.509419,.917388,-.625,.466667,.604563,.968155,-.5,.552953,.688929,.995376,-.375,.639176,.7596,.998151,-.25,.722193,.813953,.976575,-.125,.798692,.849786,.931689,0,.865395,.86541,.865396,.125,.924128,.827385,.774508,.25,.958853,.769768,.678008,.375,.969954,.694267,.579375,.5,.958003,.602842,.481776,.625,.923945,.497309,.38797,.75,.869187,.378313,.300267,.875,.795632,.241284,.220526,1,.705673,.0155562,.150233]},{ColorSpace:"Lab",Name:"BuRd",RGBPoints:[-1,.019608,.188235,.380392,-.87451,.088504,.321107,.564937,-.74902,.163399,.444983,.697501,-.623529,.247059,.555709,.754095,-.498039,.420684,.676432,.818685,-.372549,.606459,.789773,.880277,-.247059,.761476,.868512,.924567,-.121569,.878047,.925721,.951942,.00392157,.969089,.966474,.964937,.129412,.983852,.897578,.846828,.254902,.982468,.800692,.706113,.380392,.960323,.66782,.536332,.505882,.894579,.503806,.399769,.631373,.81707,.33218,.281046,.756863,.728489,.155017,.197386,.882353,.576932,.055363,.14925,1,.403922,0,.121569]},{ColorSpace:"Lab",Name:"Spectral_lowBlue",RGBPoints:[-1,.368627,.309804,.635294,-.87451,.260361,.450058,.70173,-.74902,.248058,.591311,.717186,-.623529,.376009,.734025,.658132,-.498039,.537947,.814764,.64506,-.372549,.702345,.879585,.636678,-.247059,.84752,.938639,.607151,-.121569,.940408,.976163,.656055,.00392157,.999923,.997616,.745021,.129412,.997463,.921338,.61707,.254902,.995002,.824606,.499885,.380392,.992541,.701576,.39654,.505882,.973472,.547405,.318108,.631373,.937793,.398539,.270127,.756863,.861515,.282891,.299654,.882353,.746482,.144637,.288812,1,.619608,.003922,.258824]},{ColorSpace:"Lab",Name:"GnRP",RGBPoints:[-1,0,.266667,.105882,-.87451,.066436,.394617,.174779,-.74902,.168858,.524567,.25767,-.623529,.323875,.657439,.361015,-.498039,.504883,.772318,.506344,-.372549,.678431,.870127,.654902,-.247059,.803922,.921799,.780392,-.121569,.897116,.951942,.882814,.00392157,.967397,.965936,.967474,.129412,.928028,.879815,.930565,.254902,.866052,.780777,.882891,.380392,.77501,.665129,.821376,.505882,.675663,.537024,.737024,.631373,.57847,.396155,.645982,.756863,.492349,.223914,.547559,.882353,.375548,.096886,.423299,1,.25098,0,.294118]},{ColorSpace:"Lab",Name:"GYPi",RGBPoints:[-1,.152941,.392157,.098039,-.87451,.246444,.505344,.117724,-.74902,.351942,.614533,.161399,-.623529,.474971,.717878,.240138,-.498039,.611995,.811226,.392849,-.372549,.746328,.893118,.565321,-.247059,.859516,.94233,.747405,-.121569,.928105,.96386,.875663,.00392157,.969089,.966859,.968012,.129412,.983852,.910265,.948328,.254902,.979239,.833218,.914648,.380392,.949712,.729873,.862976,.505882,.905652,.58293,.763552,.631373,.85521,.410073,.652211,.756863,.793695,.183699,.531642,.882353,.683737,.063899,.420761,1,.556863,.003922,.321569]},{ColorSpace:"Lab",Name:"GnYlRd",RGBPoints:[-1,0,.407843,.215686,-.87451,.063975,.525952,.277201,-.74902,.177932,.633064,.332718,-.623529,.364937,.724106,.379469,-.498039,.527951,.797155,.40223,-.372549,.678431,.862822,.433449,-.247059,.803922,.916955,.514648,-.121569,.909419,.961861,.625067,.00392157,.999923,.997616,.745021,.129412,.997463,.921338,.61707,.254902,.995002,.824606,.499885,.380392,.992541,.701576,.39654,.505882,.973472,.547405,.318108,.631373,.939023,.389927,.245521,.756863,.867666,.239831,.176624,.882353,.762399,.110727,.151326,1,.647059,0,.14902]},{ColorSpace:"Lab",Name:"GBBr",RGBPoints:[-1,0,.235294,.188235,-.87451,.002461,.338639,.301423,-.74902,.055902,.448981,.417609,-.623529,.183852,.56955,.538178,-.498039,.357785,.700115,.660746,-.372549,.540177,.819531,.77624,-.247059,.714879,.890888,.864821,-.121569,.851134,.934564,.922645,.00392157,.960861,.959785,.95694,.129412,.963322,.927797,.83391,.254902,.939946,.868897,.68935,.380392,.883353,.775394,.517109,.505882,.808074,.625836,.324106,.631373,.717647,.476355,.15494,.756863,.592157,.358247,.06882,.882353,.458593,.26436,.031142,1,.329412,.188235,.019608]},{ColorSpace:"Lab",Name:"PuOr",RGBPoints:[-1,.498039,.231373,.031373,-.87451,.62599,.30273,.026451,-.74902,.746943,.387082,.037524,-.623529,.85767,.490427,.071972,-.498039,.936409,.617762,.236371,-.372549,.992695,.743099,.43291,-.247059,.995156,.841523,.63714,-.121569,.985313,.913802,.813687,.00392157,.966244,.966398,.967705,.129412,.889965,.89504,.938178,.254902,.806151,.804306,.894656,.380392,.712649,.688658,.833141,.505882,.594233,.554325,.744637,.631373,.474894,.404229,.652364,.756863,.366628,.217224,.563783,.882353,.266436,.089965,.434833,1,.176471,0,.294118]},{ColorSpace:"Lab",Name:"PRGn",RGBPoints:[-1,.25098,0,.294118,-.87451,.383852,.103345,.431911,-.74902,.497732,.234679,.55371,-.623529,.583852,.40692,.652134,-.498039,.681968,.545175,.742561,-.372549,.7807,.672357,.825221,-.247059,.871742,.788005,.886736,-.121569,.930488,.885198,.932872,.00392157,.966321,.968089,.965859,.129412,.892503,.950865,.877278,.254902,.796078,.91857,.772549,.380392,.670588,.866897,.647059,.505882,.493195,.765398,.496655,.631373,.314187,.649135,.354556,.756863,.15917,.516263,.251211,.882353,.062284,.386621,.170473,1,0,.266667,.105882]},{ColorSpace:"Lab",Name:"PiYG",RGBPoints:[-1,.556863,.003922,.321569,-.87451,.692195,.067897,.427374,-.74902,.797539,.197847,.539177,-.623529,.859054,.424221,.659746,-.498039,.908574,.592618,.770319,-.372549,.951557,.736332,.866205,-.247059,.981084,.839677,.917878,-.121569,.98293,.913802,.949558,.00392157,.96732,.968474,.965629,.129412,.92549,.963552,.869666,.254902,.852441,.939254,.736025,.380392,.739254,.890042,.553941,.505882,.60323,.805536,.382238,.631373,.467282,.711419,.235217,.756863,.344252,.608074,.156478,.882353,.2406,.49827,.116494,1,.152941,.392157,.098039]},{ColorSpace:"Lab",Name:"OrPu",RGBPoints:[-1,.176471,0,.294118,-.87451,.272434,.095963,.444214,-.74902,.373395,.228912,.56932,-.623529,.481661,.415917,.657901,-.498039,.601922,.562937,.750481,-.372549,.718493,.695886,.836986,-.247059,.811995,.811534,.898501,-.121569,.894733,.8995,.940023,.00392157,.969166,.966859,.963629,.129412,.98639,.910265,.803691,.254902,.995002,.835371,.624375,.380392,.992541,.736947,.420146,.505882,.931949,.609458,.224221,.631373,.85075,.483968,.069819,.756863,.740023,.380623,.035371,.882353,.617993,.29827,.026759,1,.498039,.231373,.031373]},{ColorSpace:"Lab",Name:"BrBG",RGBPoints:[-1,.329412,.188235,.019608,-.87451,.467205,.269435,.031911,-.74902,.6,.365629,.074202,-.623529,.72549,.483737,.160323,-.498039,.812995,.635832,.336409,-.372549,.88689,.781238,.527874,-.247059,.943483,.87474,.700115,-.121569,.963168,.929796,.841599,.00392157,.957247,.959938,.959554,.129412,.84406,.932872,.920185,.254902,.70396,.886428,.859285,.380392,.529258,.815071,.770704,.505882,.346251,.691811,.653057,.631373,.175855,.562015,.530642,.756863,.047905,.441446,.410073,.882353,.002307,.33218,.294348,1,0,.235294,.188235]},{ColorSpace:"Lab",Name:"GyRd",RGBPoints:[-1,.101961,.101961,.101961,-.87451,.227451,.227451,.227451,-.74902,.359939,.359939,.359939,-.623529,.502653,.502653,.502653,-.498039,.631373,.631373,.631373,-.372549,.749865,.749865,.749865,-.247059,.843368,.843368,.843368,-.121569,.926105,.926105,.926105,.00392157,.999846,.997232,.995694,.129412,.994925,.908651,.857901,.254902,.982468,.800692,.706113,.380392,.960323,.66782,.536332,.505882,.894579,.503806,.399769,.631373,.81707,.33218,.281046,.756863,.728489,.155017,.197386,.882353,.576932,.055363,.14925,1,.403922,0,.121569]},{ColorSpace:"Lab",Name:"erdc_divHi_purpleGreen",RGBPoints:[-1,.297553,0,.489074,-.87451,.40259,.151146,.567754,-.74902,.516038,.284843,.658231,-.623529,.629783,.423646,.750938,-.498039,.735198,.563697,.835956,-.372549,.82408,.695541,.903582,-.247059,.889091,.807454,.944862,-.121569,.92334,.886917,.951839,.00392157,.921045,.921084,.921003,.129412,.877324,.907455,.845381,.254902,.797649,.849713,.734695,.380392,.691646,.75964,.600532,.505882,.568981,.649159,.453807,.631373,.438945,.529756,.304259,.756863,.30973,.412001,.158303,.882353,.187078,.305111,.00251458,1,.101655,.220836,0]},{ColorSpace:"Lab",Name:"erdc_divHi_purpleGreen_dim",RGBPoints:[-1,.404088,.131038,.592767,-.87451,.486469,.230957,.651243,-.74902,.575165,.339335,.717723,-.623529,.662741,.454332,.784263,-.498039,.742071,.570213,.842918,-.372549,.806935,.678992,.886227,-.247059,.852219,.771315,.90763,-.121569,.873345,.837327,.901572,.00392157,.866783,.86682,.866745,.129412,.82839,.858225,.796812,.254902,.762578,.814287,.700202,.380392,.676429,.744229,.585735,.505882,.577033,.65732,.461526,.631373,.47128,.562476,.33476,.756863,.365461,.467957,.21076,.882353,.264758,.381138,.0878313,1,.182591,.312249,0]},{ColorSpace:"Lab",Name:"erdc_divLow_icePeach",RGBPoints:[-1,.480048,.817441,.998056,-.87451,.425898,.726921,.883187,-.74902,.366682,.629445,.761936,-.623529,.308756,.531002,.640217,-.498039,.258021,.43705,.523433,-.372549,.219244,.352381,.416348,-.247059,.195127,.281032,.322979,-.121569,.186286,.22627,.246525,.00392157,.192352,.19236,.192364,.129412,.255927,.214469,.191756,.254902,.340459,.254426,.206666,.380392,.444655,.309315,.234029,.505882,.565353,.376004,.270969,.631373,.697917,.450748,.314293,.756863,.836657,.529064,.360227,.882353,.972695,.614884,.413123,1,1,.705904,.472699]},{ColorSpace:"Lab",Name:"erdc_divLow_purpleGreen",RGBPoints:[-1,.956034,.666487,.952663,-.87451,.874457,.572698,.936352,-.74902,.753465,.488253,.909063,-.623529,.63309,.413507,.763833,-.498039,.514491,.345878,.620015,-.372549,.405008,.288141,.484376,-.247059,.311388,.241986,.363556,-.121569,.238722,.209044,.263449,.00392157,.192352,.192366,.192362,.129412,.200379,.233201,.168618,.254902,.230151,.291737,.165227,.380392,.279481,.366076,.178607,.505882,.344927,.453267,.205703,.631373,.421554,.549449,.242643,.756863,.503334,.649999,.284377,.882353,.583497,.749672,.324969,1,.650705,.837228,.356264]},{ColorSpace:"Lab",Name:"Haze_green",RGBPoints:[-1,1,.835294,.886275,-.87451,.937255,.756863,.870443,-.74902,.875817,.666376,.857807,-.623529,.778359,.583007,.808134,-.498039,.676253,.494118,.745098,-.372549,.561365,.390123,.682353,-.247059,.438344,.262745,.621496,-.121569,.321133,.141031,.558751,.00392157,.203922,.0217865,.495861,.129412,.265505,.129412,.433261,.254902,.311692,.255338,.37008,.380392,.356282,.377342,.310821,.505882,.39971,.488889,.258243,.631373,.442556,.604357,.205519,.756863,.48671,.71968,.152941,.882353,.529847,.830356,.100944,1,.572549,.933333,.054902]},{ColorSpace:"Lab",Name:"Haze_lime",RGBPoints:[-1,.704034,.784196,1,-.87451,.633111,.691418,.956078,-.74902,.564021,.600606,.912157,-.623529,.496827,.51189,.868235,-.498039,.43157,.425416,.824314,-.372549,.368248,.341347,.780392,-.247059,.306767,.259855,.736471,-.121569,.246862,.181069,.692549,.00392157,.191619,.109542,.648627,.129412,.257404,.194031,.604706,.254902,.321794,.278775,.560784,.380392,.387909,.364617,.516863,.505882,.456569,.451881,.472941,.631373,.527424,.540773,.42902,.756863,.599759,.631427,.385098,.882353,.673065,.723898,.341176,1,.742751,.812252,.3]},{ColorSpace:"RGB",Name:"Haze",RGBPoints:[-1,1,.835294,.996078,-.00392157,.023529,.141176,.498039,.00392157,.015686,.137255,.494118,1,.984314,.764706,0]},{ColorSpace:"Lab",Name:"Haze_cyan",RGBPoints:[-1,.956863,1,.835294,-.87451,.933188,.921714,.760784,-.74902,.870588,.803486,.671605,-.623529,.807843,.684096,.583297,-.498039,.745098,.569208,.494118,-.372549,.682353,.437763,.390123,-.247059,.621496,.288163,.262745,-.121569,.558751,.144517,.141031,.00392157,.495861,.0217865,.0413943,.129412,.433261,.137255,.129412,.254902,.37008,.263181,.255338,.380392,.306318,.381845,.372694,.505882,.243137,.503994,.494263,.631373,.180392,.629484,.619753,.756863,.117647,.754975,.747131,.882353,.054902,.876398,.866812,1,0,.988235,.976471]},{ColorSpace:"Lab",Name:"nic_Edge",RGBPoints:[-1,.191208,.191208,.191208,-.87451,.239484,.00545035,.614821,-.74902,.220593,.0617459,.863547,-.623529,.17509,.278988,.97794,-.498039,.143526,.576069,.998553,-.372549,.166456,.871883,.96594,-.247059,.376202,.993555,.981833,-.121569,.681996,.991297,.999239,.00392157,.954172,.952734,.94374,.129412,.999735,.99301,.662896,.254902,.979399,.991466,.357973,.380392,.968771,.854967,.162659,.505882,.999245,.556697,.144323,.631373,.973959,.26223,.177946,.756863,.852358,.0526707,.222974,.882353,.593889,.00912724,.238855,1,.191208,.191208,.191208]},{ColorSpace:"Lab",Name:"erdc_iceFire_H",RGBPoints:[-1,4.05432e-7,0,590122e-11,-.87451,0,.120401,.302675,-.74902,0,.216583,.524574,-.623529,.0552475,.345025,.6595,-.498039,.128047,.492588,.720288,-.372549,.188955,.641309,.792092,-.247059,.327673,.784935,.873434,-.121569,.60824,.892164,.935547,.00392157,.881371,.912178,.818099,.129412,.951407,.835621,.449279,.254902,.904481,.690489,0,.380392,.85407,.510864,0,.505882,.777093,.33018,88199e-8,.631373,.672862,.139087,.00269398,.756863,.508815,0,0,.882353,.299417,366289e-9,547829e-9,1,.0157519,.00332021,4.55569e-8]},{ColorSpace:"Lab",Name:"erdc_iceFire_L",RGBPoints:[-1,.870485,.913768,.832905,-.87451,.586919,.887865,.934003,-.74902,.31583,.776442,.867858,-.623529,.18302,.632034,.787722,-.498039,.117909,.484134,.713825,-.372549,.0507239,.335979,.654741,-.247059,0,.209874,.511832,-.121569,0,.114689,.28935,.00392157,.0157519,.00332021,4.55569e-8,.129412,.312914,0,0,.254902,.520865,0,0,.380392,.680105,.15255,.0025996,.505882,.785109,.339479,797922e-9,.631373,.857354,.522494,0,.756863,.910974,.699774,0,.882353,.951921,.842817,.478545,1,.881371,.912178,.818099]},{ColorSpace:"RGB",Name:"hsv",RGBPoints:[-1,1,0,0,-.666666,1,0,1,-.333333,0,0,1,0,0,1,1,.33333,0,1,0,.66666,1,1,0,1,1,0,0]},{ColorSpace:"Lab",Name:"hue_L60",RGBPoints:[-1,.964784,.400592,.349549,-.87451,.964915,.372498,.53785,-.74902,.892353,.401039,.759569,-.623529,.79263,.446956,.903017,-.498039,.682208,.49954,.966673,-.372549,.56392,.553082,.968836,-.247059,.442031,.606396,.901601,-.121569,.305499,.65701,.765784,.00392157,.197251,.687914,.620914,.129412,.193882,.701887,.472654,.254902,.249866,.706123,.320005,.380392,.35132,.697417,.202919,.505882,.498097,.669467,.125232,.631373,.637477,.626239,.107431,.756863,.762115,.56872,.155812,.882353,.889434,.481116,.240445,1,.964784,.400592,.349549]},{IndexedColors:[0,0,0,.8941176470588236,.1019607843137255,.1098039215686274,.2156862745098039,.4941176470588236,.7215686274509804,.3019607843137255,.6862745098039216,.2901960784313726,.596078431372549,.3058823529411765,.6392156862745098,1,.4980392156862745,0,.6509803921568628,.3372549019607843,.1568627450980392],Name:"Spectrum",NanColor:[.6509803921568628,.3372549019607843,.1568627450980392]},{IndexedColors:[.4745098039215686,.09019607843137255,.09019607843137255,.7098039215686275,.00392156862745098,.00392156862745098,.9372549019607843,.2784313725490196,.09803921568627451,.9764705882352941,.5137254901960784,.1411764705882353,1,.7058823529411765,0,1,.8980392156862745,.02352941176470588],Name:"Warm",NanColor:[1,.8980392156862745,.02352941176470588]},{IndexedColors:[.4588235294117647,.6941176470588235,.00392156862745098,.3450980392156863,.5019607843137255,.1607843137254902,.3137254901960784,.8431372549019608,.7490196078431373,.1098039215686274,.5843137254901961,.803921568627451,.2313725490196079,.407843137254902,.6705882352941176,.6039215686274509,.407843137254902,1,.3725490196078431,.2,.5019607843137255],Name:"Cool",NanColor:[.3725490196078431,.2,.5019607843137255]},{IndexedColors:[.2313725490196079,.407843137254902,.6705882352941176,.1098039215686274,.5843137254901961,.803921568627451,.3058823529411765,.8509803921568627,.9176470588235294,.4509803921568628,.6039215686274509,.8352941176470589,.2588235294117647,.2392156862745098,.6627450980392157,.3137254901960784,.3294117647058823,.5294117647058824,.06274509803921569,.1647058823529412,.3215686274509804],Name:"Blues",NanColor:[.06274509803921569,.1647058823529412,.3215686274509804]},{IndexedColors:[.1098039215686274,.5843137254901961,.803921568627451,.2313725490196079,.407843137254902,.6705882352941176,.4,.2431372549019608,.7176470588235294,.6352941176470588,.3294117647058823,.8117647058823529,.8705882352941177,.3803921568627451,.807843137254902,.8627450980392157,.3803921568627451,.5843137254901961,.2392156862745098,.06274509803921569,.3215686274509804],Name:"Wild Flower",NanColor:[.2392156862745098,.06274509803921569,.3215686274509804]},{IndexedColors:[.396078431372549,.4862745098039216,.2156862745098039,.4588235294117647,.6941176470588235,.00392156862745098,.6980392156862745,.7294117647058823,.1882352941176471,1,.8980392156862745,.02352941176470588,1,.7058823529411765,0,.9764705882352941,.5137254901960784,.1411764705882353],Name:"Citrus",NanColor:[.9764705882352941,.5137254901960784,.1411764705882353]},{IndexedColors:[.4980392156862745,.2313725490196079,.03137254901960784,.7019607843137254,.3450980392156863,.02352941176470588,.8784313725490196,.5098039215686274,.0784313725490196,.9921568627450981,.7215686274509804,.3882352941176471,.996078431372549,.8784313725490196,.7137254901960784,.9686274509803922,.9686274509803922,.9686274509803922,.8470588235294118,.8549019607843137,.9215686274509803,.6980392156862745,.6705882352941176,.8235294117647058,.5019607843137255,.4509803921568628,.6745098039215687,.3294117647058823,.1529411764705882,.5333333333333333,.1764705882352941,0,.2941176470588235],Name:"Brewer Diverging Purple-Orange (11)",NanColor:[.1764705882352941,0,.2941176470588235]},{IndexedColors:[.4980392156862745,.2313725490196079,.03137254901960784,.7019607843137254,.3450980392156863,.02352941176470588,.8784313725490196,.5098039215686274,.0784313725490196,.9921568627450981,.7215686274509804,.3882352941176471,.996078431372549,.8784313725490196,.7137254901960784,.8470588235294118,.8549019607843137,.9215686274509803,.6980392156862745,.6705882352941176,.8235294117647058,.5019607843137255,.4509803921568628,.6745098039215687,.3294117647058823,.1529411764705882,.5333333333333333,.1764705882352941,0,.2941176470588235],Name:"Brewer Diverging Purple-Orange (10)",NanColor:[.1764705882352941,0,.2941176470588235]},{IndexedColors:[.7019607843137254,.3450980392156863,.02352941176470588,.8784313725490196,.5098039215686274,.0784313725490196,.9921568627450981,.7215686274509804,.3882352941176471,.996078431372549,.8784313725490196,.7137254901960784,.9686274509803922,.9686274509803922,.9686274509803922,.8470588235294118,.8549019607843137,.9215686274509803,.6980392156862745,.6705882352941176,.8235294117647058,.5019607843137255,.4509803921568628,.6745098039215687,.3294117647058823,.1529411764705882,.5333333333333333],Name:"Brewer Diverging Purple-Orange (9)",NanColor:[.3294117647058823,.1529411764705882,.5333333333333333]},{IndexedColors:[.7019607843137254,.3450980392156863,.02352941176470588,.8784313725490196,.5098039215686274,.0784313725490196,.9921568627450981,.7215686274509804,.3882352941176471,.996078431372549,.8784313725490196,.7137254901960784,.8470588235294118,.8549019607843137,.9215686274509803,.6980392156862745,.6705882352941176,.8235294117647058,.5019607843137255,.4509803921568628,.6745098039215687,.3294117647058823,.1529411764705882,.5333333333333333],Name:"Brewer Diverging Purple-Orange (8)",NanColor:[.3294117647058823,.1529411764705882,.5333333333333333]},{IndexedColors:[.7019607843137254,.3450980392156863,.02352941176470588,.9450980392156862,.6392156862745098,.2509803921568627,.996078431372549,.8784313725490196,.7137254901960784,.9686274509803922,.9686274509803922,.9686274509803922,.8470588235294118,.8549019607843137,.9215686274509803,.6,.5568627450980392,.7647058823529411,.3294117647058823,.1529411764705882,.5333333333333333],Name:"Brewer Diverging Purple-Orange (7)",NanColor:[.3294117647058823,.1529411764705882,.5333333333333333]},{IndexedColors:[.7019607843137254,.3450980392156863,.02352941176470588,.9450980392156862,.6392156862745098,.2509803921568627,.996078431372549,.8784313725490196,.7137254901960784,.8470588235294118,.8549019607843137,.9215686274509803,.6,.5568627450980392,.7647058823529411,.3294117647058823,.1529411764705882,.5333333333333333],Name:"Brewer Diverging Purple-Orange (6)",NanColor:[.3294117647058823,.1529411764705882,.5333333333333333]},{IndexedColors:[.9019607843137255,.3803921568627451,.00392156862745098,.9921568627450981,.7215686274509804,.3882352941176471,.9686274509803922,.9686274509803922,.9686274509803922,.6980392156862745,.6705882352941176,.8235294117647058,.3686274509803922,.2352941176470588,.6],Name:"Brewer Diverging Purple-Orange (5)",NanColor:[.3686274509803922,.2352941176470588,.6]},{IndexedColors:[.9019607843137255,.3803921568627451,.00392156862745098,.9921568627450981,.7215686274509804,.3882352941176471,.6980392156862745,.6705882352941176,.8235294117647058,.3686274509803922,.2352941176470588,.6],Name:"Brewer Diverging Purple-Orange (4)",NanColor:[.3686274509803922,.2352941176470588,.6]},{IndexedColors:[.9450980392156862,.6392156862745098,.2509803921568627,.9686274509803922,.9686274509803922,.9686274509803922,.6,.5568627450980392,.7647058823529411],Name:"Brewer Diverging Purple-Orange (3)",NanColor:[.6,.5568627450980392,.7647058823529411]},{IndexedColors:[.6196078431372549,.00392156862745098,.2588235294117647,.8352941176470589,.2431372549019608,.3098039215686275,.9568627450980393,.4274509803921568,.2627450980392157,.9921568627450981,.6823529411764706,.3803921568627451,.996078431372549,.8784313725490196,.5450980392156862,1,1,.7490196078431373,.9019607843137255,.9607843137254902,.596078431372549,.6705882352941176,.8666666666666667,.6431372549019608,.4,.7607843137254902,.6470588235294118,.196078431372549,.5333333333333333,.7411764705882353,.3686274509803922,.3098039215686275,.6352941176470588],Name:"Brewer Diverging Spectral (11)",NanColor:[.3686274509803922,.3098039215686275,.6352941176470588]},{IndexedColors:[.6196078431372549,.00392156862745098,.2588235294117647,.8352941176470589,.2431372549019608,.3098039215686275,.9568627450980393,.4274509803921568,.2627450980392157,.9921568627450981,.6823529411764706,.3803921568627451,.996078431372549,.8784313725490196,.5450980392156862,.9019607843137255,.9607843137254902,.596078431372549,.6705882352941176,.8666666666666667,.6431372549019608,.4,.7607843137254902,.6470588235294118,.196078431372549,.5333333333333333,.7411764705882353,.3686274509803922,.3098039215686275,.6352941176470588],Name:"Brewer Diverging Spectral (10)",NanColor:[.3686274509803922,.3098039215686275,.6352941176470588]},{IndexedColors:[.8352941176470589,.2431372549019608,.3098039215686275,.9568627450980393,.4274509803921568,.2627450980392157,.9921568627450981,.6823529411764706,.3803921568627451,.996078431372549,.8784313725490196,.5450980392156862,1,1,.7490196078431373,.9019607843137255,.9607843137254902,.596078431372549,.6705882352941176,.8666666666666667,.6431372549019608,.4,.7607843137254902,.6470588235294118,.196078431372549,.5333333333333333,.7411764705882353],Name:"Brewer Diverging Spectral (9)",NanColor:[.196078431372549,.5333333333333333,.7411764705882353]},{IndexedColors:[.8352941176470589,.2431372549019608,.3098039215686275,.9568627450980393,.4274509803921568,.2627450980392157,.9921568627450981,.6823529411764706,.3803921568627451,.996078431372549,.8784313725490196,.5450980392156862,.9019607843137255,.9607843137254902,.596078431372549,.6705882352941176,.8666666666666667,.6431372549019608,.4,.7607843137254902,.6470588235294118,.196078431372549,.5333333333333333,.7411764705882353],Name:"Brewer Diverging Spectral (8)",NanColor:[.196078431372549,.5333333333333333,.7411764705882353]},{IndexedColors:[.8352941176470589,.2431372549019608,.3098039215686275,.9882352941176471,.5529411764705883,.3490196078431372,.996078431372549,.8784313725490196,.5450980392156862,1,1,.7490196078431373,.9019607843137255,.9607843137254902,.596078431372549,.6,.8352941176470589,.5803921568627451,.196078431372549,.5333333333333333,.7411764705882353],Name:"Brewer Diverging Spectral (7)",NanColor:[.196078431372549,.5333333333333333,.7411764705882353]},{IndexedColors:[.8352941176470589,.2431372549019608,.3098039215686275,.9882352941176471,.5529411764705883,.3490196078431372,.996078431372549,.8784313725490196,.5450980392156862,.9019607843137255,.9607843137254902,.596078431372549,.6,.8352941176470589,.5803921568627451,.196078431372549,.5333333333333333,.7411764705882353],Name:"Brewer Diverging Spectral (6)",NanColor:[.196078431372549,.5333333333333333,.7411764705882353]},{IndexedColors:[.8431372549019608,.09803921568627451,.1098039215686274,.9921568627450981,.6823529411764706,.3803921568627451,1,1,.7490196078431373,.6705882352941176,.8666666666666667,.6431372549019608,.1686274509803922,.5137254901960784,.7294117647058823],Name:"Brewer Diverging Spectral (5)",NanColor:[.1686274509803922,.5137254901960784,.7294117647058823]},{IndexedColors:[.8431372549019608,.09803921568627451,.1098039215686274,.9921568627450981,.6823529411764706,.3803921568627451,.6705882352941176,.8666666666666667,.6431372549019608,.1686274509803922,.5137254901960784,.7294117647058823],Name:"Brewer Diverging Spectral (4)",NanColor:[.1686274509803922,.5137254901960784,.7294117647058823]},{IndexedColors:[.9882352941176471,.5529411764705883,.3490196078431372,1,1,.7490196078431373,.6,.8352941176470589,.5803921568627451],Name:"Brewer Diverging Spectral (3)",NanColor:[.6,.8352941176470589,.5803921568627451]},{IndexedColors:[.3294117647058823,.1882352941176471,.0196078431372549,.5490196078431373,.3176470588235294,.0392156862745098,.7490196078431373,.5058823529411764,.1764705882352941,.8745098039215686,.7607843137254902,.4901960784313725,.9647058823529412,.9098039215686274,.7647058823529411,.9607843137254902,.9607843137254902,.9607843137254902,.7803921568627451,.9176470588235294,.8980392156862745,.5019607843137255,.803921568627451,.7568627450980392,.207843137254902,.592156862745098,.5607843137254902,.00392156862745098,.4,.3686274509803922,0,.2352941176470588,.1882352941176471],Name:"Brewer Diverging Brown-Blue-Green (11)",NanColor:[0,.2352941176470588,.1882352941176471]},{IndexedColors:[.3294117647058823,.1882352941176471,.0196078431372549,.5490196078431373,.3176470588235294,.0392156862745098,.7490196078431373,.5058823529411764,.1764705882352941,.8745098039215686,.7607843137254902,.4901960784313725,.9647058823529412,.9098039215686274,.7647058823529411,.7803921568627451,.9176470588235294,.8980392156862745,.5019607843137255,.803921568627451,.7568627450980392,.207843137254902,.592156862745098,.5607843137254902,.00392156862745098,.4,.3686274509803922,0,.2352941176470588,.1882352941176471],Name:"Brewer Diverging Brown-Blue-Green (10)",NanColor:[0,.2352941176470588,.1882352941176471]},{IndexedColors:[.5490196078431373,.3176470588235294,.0392156862745098,.7490196078431373,.5058823529411764,.1764705882352941,.8745098039215686,.7607843137254902,.4901960784313725,.9647058823529412,.9098039215686274,.7647058823529411,.9607843137254902,.9607843137254902,.9607843137254902,.7803921568627451,.9176470588235294,.8980392156862745,.5019607843137255,.803921568627451,.7568627450980392,.207843137254902,.592156862745098,.5607843137254902,.00392156862745098,.4,.3686274509803922],Name:"Brewer Diverging Brown-Blue-Green (9)",NanColor:[.00392156862745098,.4,.3686274509803922]},{IndexedColors:[.5490196078431373,.3176470588235294,.0392156862745098,.7490196078431373,.5058823529411764,.1764705882352941,.8745098039215686,.7607843137254902,.4901960784313725,.9647058823529412,.9098039215686274,.7647058823529411,.7803921568627451,.9176470588235294,.8980392156862745,.5019607843137255,.803921568627451,.7568627450980392,.207843137254902,.592156862745098,.5607843137254902,.00392156862745098,.4,.3686274509803922],Name:"Brewer Diverging Brown-Blue-Green (8)",NanColor:[.00392156862745098,.4,.3686274509803922]},{IndexedColors:[.5490196078431373,.3176470588235294,.0392156862745098,.8470588235294118,.7019607843137254,.396078431372549,.9647058823529412,.9098039215686274,.7647058823529411,.9607843137254902,.9607843137254902,.9607843137254902,.7803921568627451,.9176470588235294,.8980392156862745,.3529411764705883,.7058823529411765,.6745098039215687,.00392156862745098,.4,.3686274509803922],Name:"Brewer Diverging Brown-Blue-Green (7)",NanColor:[.00392156862745098,.4,.3686274509803922]},{IndexedColors:[.5490196078431373,.3176470588235294,.0392156862745098,.8470588235294118,.7019607843137254,.396078431372549,.9647058823529412,.9098039215686274,.7647058823529411,.7803921568627451,.9176470588235294,.8980392156862745,.3529411764705883,.7058823529411765,.6745098039215687,.00392156862745098,.4,.3686274509803922],Name:"Brewer Diverging Brown-Blue-Green (6)",NanColor:[.00392156862745098,.4,.3686274509803922]},{IndexedColors:[.6509803921568628,.3803921568627451,.1019607843137255,.8745098039215686,.7607843137254902,.4901960784313725,.9607843137254902,.9607843137254902,.9607843137254902,.5019607843137255,.803921568627451,.7568627450980392,.00392156862745098,.5215686274509804,.4431372549019608],Name:"Brewer Diverging Brown-Blue-Green (5)",NanColor:[.00392156862745098,.5215686274509804,.4431372549019608]},{IndexedColors:[.6509803921568628,.3803921568627451,.1019607843137255,.8745098039215686,.7607843137254902,.4901960784313725,.5019607843137255,.803921568627451,.7568627450980392,.00392156862745098,.5215686274509804,.4431372549019608],Name:"Brewer Diverging Brown-Blue-Green (4)",NanColor:[.00392156862745098,.5215686274509804,.4431372549019608]},{IndexedColors:[.8470588235294118,.7019607843137254,.396078431372549,.9607843137254902,.9607843137254902,.9607843137254902,.3529411764705883,.7058823529411765,.6745098039215687],Name:"Brewer Diverging Brown-Blue-Green (3)",NanColor:[.3529411764705883,.7058823529411765,.6745098039215687]},{IndexedColors:[.9686274509803922,.9882352941176471,.9921568627450981,.8980392156862745,.9607843137254902,.9764705882352941,.8,.9254901960784314,.9019607843137255,.6,.8470588235294118,.788235294117647,.4,.7607843137254902,.6431372549019608,.2549019607843137,.6823529411764706,.4627450980392157,.1372549019607843,.5450980392156862,.2705882352941176,0,.4274509803921568,.1725490196078431,0,.2666666666666667,.1058823529411765],Name:"Brewer Sequential Blue-Green (9)",NanColor:[0,.2666666666666667,.1058823529411765]},{IndexedColors:[.9686274509803922,.9882352941176471,.9921568627450981,.8980392156862745,.9607843137254902,.9764705882352941,.8,.9254901960784314,.9019607843137255,.6,.8470588235294118,.788235294117647,.4,.7607843137254902,.6431372549019608,.2549019607843137,.6823529411764706,.4627450980392157,.1372549019607843,.5450980392156862,.2705882352941176,0,.3450980392156863,.1411764705882353],Name:"Brewer Sequential Blue-Green (8)",NanColor:[0,.3450980392156863,.1411764705882353]},{IndexedColors:[.9294117647058824,.9725490196078431,.984313725490196,.8,.9254901960784314,.9019607843137255,.8,.9254901960784314,.9019607843137255,.4,.7607843137254902,.6431372549019608,.2549019607843137,.6823529411764706,.4627450980392157,.1372549019607843,.5450980392156862,.2705882352941176,0,.3450980392156863,.1411764705882353],Name:"Brewer Sequential Blue-Green (7)",NanColor:[0,.3450980392156863,.1411764705882353]},{IndexedColors:[.9294117647058824,.9725490196078431,.984313725490196,.8,.9254901960784314,.9019607843137255,.6,.8470588235294118,.788235294117647,.4,.7607843137254902,.6431372549019608,.1725490196078431,.6352941176470588,.3725490196078431,0,.4274509803921568,.1725490196078431],Name:"Brewer Sequential Blue-Green (6)",NanColor:[0,.4274509803921568,.1725490196078431]},{IndexedColors:[.9294117647058824,.9725490196078431,.984313725490196,.6980392156862745,.8862745098039215,.8862745098039215,.4,.7607843137254902,.6431372549019608,.1725490196078431,.6352941176470588,.3725490196078431,0,.4274509803921568,.1725490196078431],Name:"Brewer Sequential Blue-Green (5)",NanColor:[0,.4274509803921568,.1725490196078431]},{IndexedColors:[.9294117647058824,.9725490196078431,.984313725490196,.6980392156862745,.8862745098039215,.8862745098039215,.4,.7607843137254902,.6431372549019608,.1372549019607843,.5450980392156862,.2705882352941176],Name:"Brewer Sequential Blue-Green (4)",NanColor:[.1372549019607843,.5450980392156862,.2705882352941176]},{IndexedColors:[.8980392156862745,.9607843137254902,.9764705882352941,.6,.8470588235294118,.788235294117647,.1725490196078431,.6352941176470588,.3725490196078431],Name:"Brewer Sequential Blue-Green (3)",NanColor:[.1725490196078431,.6352941176470588,.3725490196078431]},{IndexedColors:[1,1,.8980392156862745,1,.9686274509803922,.7372549019607844,.996078431372549,.8901960784313725,.5686274509803921,.996078431372549,.7686274509803922,.3098039215686275,.996078431372549,.6,.1607843137254902,.9254901960784314,.4392156862745098,.0784313725490196,.8,.2980392156862745,.00784313725490196,.6,.203921568627451,.01568627450980392,.4,.1450980392156863,.02352941176470588],Name:"Brewer Sequential Yellow-Orange-Brown (9)",NanColor:[.4,.1450980392156863,.02352941176470588]},{IndexedColors:[1,1,.8980392156862745,1,.9686274509803922,.7372549019607844,.996078431372549,.8901960784313725,.5686274509803921,.996078431372549,.7686274509803922,.3098039215686275,.996078431372549,.6,.1607843137254902,.9254901960784314,.4392156862745098,.0784313725490196,.8,.2980392156862745,.00784313725490196,.5490196078431373,.1764705882352941,.01568627450980392],Name:"Brewer Sequential Yellow-Orange-Brown (8)",NanColor:[.5490196078431373,.1764705882352941,.01568627450980392]},{IndexedColors:[1,1,.8313725490196079,.996078431372549,.8901960784313725,.5686274509803921,.996078431372549,.7686274509803922,.3098039215686275,.996078431372549,.6,.1607843137254902,.9254901960784314,.4392156862745098,.0784313725490196,.8,.2980392156862745,.00784313725490196,.5490196078431373,.1764705882352941,.01568627450980392],Name:"Brewer Sequential Yellow-Orange-Brown (7)",NanColor:[.5490196078431373,.1764705882352941,.01568627450980392]},{IndexedColors:[1,1,.8313725490196079,.996078431372549,.8901960784313725,.5686274509803921,.996078431372549,.7686274509803922,.3098039215686275,.996078431372549,.6,.1607843137254902,.8509803921568627,.3725490196078431,.05490196078431372,.6,.203921568627451,.01568627450980392],Name:"Brewer Sequential Yellow-Orange-Brown (6)",NanColor:[.6,.203921568627451,.01568627450980392]},{IndexedColors:[1,1,.8313725490196079,.996078431372549,.8509803921568627,.5568627450980392,.996078431372549,.6,.1607843137254902,.8509803921568627,.3725490196078431,.05490196078431372,.6,.203921568627451,.01568627450980392],Name:"Brewer Sequential Yellow-Orange-Brown (5)",NanColor:[.6,.203921568627451,.01568627450980392]},{IndexedColors:[1,1,.8313725490196079,.996078431372549,.8509803921568627,.5568627450980392,.996078431372549,.6,.1607843137254902,.8,.2980392156862745,.00784313725490196],Name:"Brewer Sequential Yellow-Orange-Brown (4)",NanColor:[.8,.2980392156862745,.00784313725490196]},{IndexedColors:[1,.9686274509803922,.7372549019607844,.996078431372549,.7686274509803922,.3098039215686275,.8509803921568627,.3725490196078431,.05490196078431372],Name:"Brewer Sequential Yellow-Orange-Brown (3)",NanColor:[.8509803921568627,.3725490196078431,.05490196078431372]},{IndexedColors:[.9686274509803922,.9882352941176471,.9921568627450981,.8784313725490196,.9254901960784314,.9568627450980393,.7490196078431373,.8274509803921568,.9019607843137255,.6196078431372549,.7372549019607844,.8549019607843137,.5490196078431373,.5882352941176471,.7764705882352941,.5490196078431373,.4196078431372549,.6941176470588235,.5333333333333333,.2549019607843137,.615686274509804,.5058823529411764,.05882352941176471,.4862745098039216,.3019607843137255,0,.2941176470588235],Name:"Brewer Sequential Blue-Purple (9)",NanColor:[.3019607843137255,0,.2941176470588235]},{IndexedColors:[.9686274509803922,.9882352941176471,.9921568627450981,.8784313725490196,.9254901960784314,.9568627450980393,.7490196078431373,.8274509803921568,.9019607843137255,.6196078431372549,.7372549019607844,.8549019607843137,.5490196078431373,.5882352941176471,.7764705882352941,.5490196078431373,.4196078431372549,.6941176470588235,.5333333333333333,.2549019607843137,.615686274509804,.4313725490196079,.00392156862745098,.4196078431372549],Name:"Brewer Sequential Blue-Purple (8)",NanColor:[.4313725490196079,.00392156862745098,.4196078431372549]},{IndexedColors:[.9294117647058824,.9725490196078431,.984313725490196,.7490196078431373,.8274509803921568,.9019607843137255,.6196078431372549,.7372549019607844,.8549019607843137,.5490196078431373,.5882352941176471,.7764705882352941,.5490196078431373,.4196078431372549,.6941176470588235,.5333333333333333,.2549019607843137,.615686274509804,.4313725490196079,.00392156862745098,.4196078431372549],Name:"Brewer Sequential Blue-Purple (7)",NanColor:[.4313725490196079,.00392156862745098,.4196078431372549]},{IndexedColors:[.9294117647058824,.9725490196078431,.984313725490196,.7490196078431373,.8274509803921568,.9019607843137255,.6196078431372549,.7372549019607844,.8549019607843137,.5490196078431373,.5882352941176471,.7764705882352941,.5333333333333333,.3372549019607843,.6549019607843137,.5058823529411764,.05882352941176471,.4862745098039216],Name:"Brewer Sequential Blue-Purple (6)",NanColor:[.5058823529411764,.05882352941176471,.4862745098039216]},{IndexedColors:[.9294117647058824,.9725490196078431,.984313725490196,.7019607843137254,.803921568627451,.8901960784313725,.5490196078431373,.5882352941176471,.7764705882352941,.5333333333333333,.3372549019607843,.6549019607843137,.5058823529411764,.05882352941176471,.4862745098039216],Name:"Brewer Sequential Blue-Purple (5)",NanColor:[.5058823529411764,.05882352941176471,.4862745098039216]},{IndexedColors:[.9294117647058824,.9725490196078431,.984313725490196,.7019607843137254,.803921568627451,.8901960784313725,.5490196078431373,.5882352941176471,.7764705882352941,.5333333333333333,.2549019607843137,.615686274509804],Name:"Brewer Sequential Blue-Purple (4)",NanColor:[.5333333333333333,.2549019607843137,.615686274509804]},{IndexedColors:[.8784313725490196,.9254901960784314,.9568627450980393,.6196078431372549,.7372549019607844,.8549019607843137,.5333333333333333,.3372549019607843,.6549019607843137],Name:"Brewer Sequential Blue-Purple (3)",NanColor:[.5333333333333333,.3372549019607843,.6549019607843137]},{IndexedColors:[.4980392156862745,.788235294117647,.4980392156862745,.7450980392156863,.6823529411764706,.8313725490196079,.9921568627450981,.7529411764705882,.5254901960784314,1,1,.6,.2196078431372549,.4235294117647059,.6901960784313725,.9411764705882353,.00784313725490196,.4980392156862745,.7490196078431373,.3568627450980392,.09019607843137255,.4,.4,.4],Name:"Brewer Qualitative Accent",NanColor:[.4,.4,.4]},{IndexedColors:[.1058823529411765,.6196078431372549,.4666666666666667,.8509803921568627,.3725490196078431,.00784313725490196,.4588235294117647,.4392156862745098,.7019607843137254,.9058823529411765,.1607843137254902,.5411764705882353,.4,.6509803921568628,.1176470588235294,.9019607843137255,.6705882352941176,.00784313725490196,.6509803921568628,.4627450980392157,.1137254901960784,.4,.4,.4],Name:"Brewer Qualitative Dark2",NanColor:[.4,.4,.4]},{IndexedColors:[.4,.7607843137254902,.6470588235294118,.9882352941176471,.5529411764705883,.3843137254901961,.5529411764705883,.6274509803921569,.796078431372549,.9058823529411765,.5411764705882353,.7647058823529411,.6509803921568628,.8470588235294118,.3294117647058823,1,.8509803921568627,.1843137254901961,.8980392156862745,.7686274509803922,.5803921568627451,.7019607843137254,.7019607843137254,.7019607843137254],Name:"Brewer Qualitative Set2",NanColor:[.7019607843137254,.7019607843137254,.7019607843137254]},{IndexedColors:[.7019607843137254,.8862745098039215,.803921568627451,.9921568627450981,.803921568627451,.6745098039215687,.796078431372549,.8352941176470589,.9098039215686274,.9568627450980393,.792156862745098,.8941176470588236,.9019607843137255,.9607843137254902,.788235294117647,1,.9490196078431372,.6823529411764706,.9450980392156862,.8862745098039215,.8,.8,.8,.8],Name:"Brewer Qualitative Pastel2",NanColor:[.8,.8,.8]},{IndexedColors:[.984313725490196,.7058823529411765,.6823529411764706,.7019607843137254,.803921568627451,.8901960784313725,.8,.9215686274509803,.7725490196078432,.8705882352941177,.796078431372549,.8941176470588236,.996078431372549,.8509803921568627,.6509803921568628,1,1,.8,.8980392156862745,.8470588235294118,.7411764705882353,.9921568627450981,.8549019607843137,.9254901960784314,.9490196078431372,.9490196078431372,.9490196078431372],Name:"Brewer Qualitative Pastel1",NanColor:[.9490196078431372,.9490196078431372,.9490196078431372]},{IndexedColors:[.8941176470588236,.1019607843137255,.1098039215686274,.2156862745098039,.4941176470588236,.7215686274509804,.3019607843137255,.6862745098039216,.2901960784313726,.596078431372549,.3058823529411765,.6392156862745098,1,.4980392156862745,0,1,1,.2,.6509803921568628,.3372549019607843,.1568627450980392,.9686274509803922,.5058823529411764,.7490196078431373,.6,.6,.6],Name:"Brewer Qualitative Set1",NanColor:[.6,.6,.6]},{IndexedColors:[.6509803921568628,.807843137254902,.8901960784313725,.1215686274509804,.4705882352941176,.7058823529411765,.6980392156862745,.8745098039215686,.5411764705882353,.2,.6274509803921569,.1725490196078431,.984313725490196,.6039215686274509,.6,.8901960784313725,.1019607843137255,.1098039215686274,.9921568627450981,.7490196078431373,.4352941176470588,1,.4980392156862745,0,.792156862745098,.6980392156862745,.8392156862745098,.4156862745098039,.2392156862745098,.6039215686274509,1,1,.6],Name:"Brewer Qualitative Paired",NanColor:[1,1,.6]},{IndexedColors:[.5529411764705883,.8274509803921568,.7803921568627451,1,1,.7019607843137254,.7450980392156863,.7294117647058823,.8549019607843137,.984313725490196,.5019607843137255,.4470588235294118,.5019607843137255,.6941176470588235,.8274509803921568,.9921568627450981,.7058823529411765,.3843137254901961,.7019607843137254,.8705882352941177,.4117647058823529,.9882352941176471,.803921568627451,.8980392156862745,.8509803921568627,.8509803921568627,.8509803921568627,.7372549019607844,.5019607843137255,.7411764705882353,.8,.9215686274509803,.7725490196078432,1,.9294117647058824,.4352941176470588],Name:"Brewer Qualitative Set3",NanColor:[1,.9294117647058824,.4352941176470588]},{IndexedColors:[1,0,0,1,.862745,0,0,.695201,0],Name:"Traffic Lights",NanColor:[.803922,0,.803922]},{IndexedColors:[.908659,.604013,.581857,1,.862745,0,0,.695201,0],Name:"Traffic Lights For Deuteranopes",NanColor:[.803922,0,.803922]},{IndexedColors:[.4196078431372549,0,.07058823529411765,.9019607843137255,.9411764705882353,.0196078431372549,.01568627450980392,.6196078431372549,.00784313725490196],Name:"Traffic Lights For Deuteranopes 2",NanColor:[.803922,0,.803922]},{ColorSpace:"Lab",Creator:"Francesca Samsel",Name:"Muted Blue-Green",NanColor:[.25,0,0],RGBPoints:[0,.109804,.27451,.301961,.02,.129412,.309804,.341176,.05,.14902,.341176,.380392,.1,.188235,.403922,.458824,.15,.227451,.447059,.521569,.2,.290196,.494118,.588235,.25,.368627,.552941,.670588,.3,.458824,.619608,.74902,.35,.588235,.713725,.85098,.4,.72549,.815686,.941176,.45,.831373,.882353,.980392,.475,.909804,.933333,1,.5,.980392,.984314,1,.5,.996078,1,.94902,.5,1,1,.980392,.5,.980392,.984314,1,.525,.972549,.988235,.890196,.55,.917647,.960784,.835294,.6,.835294,.921569,.772549,.65,.768627,.901961,.737255,.7,.670588,.831373,.654902,.75,.576471,.760784,.584314,.8,.498039,.678431,.521569,.85,.392157,.560784,.427451,.9,.294118,.45098,.333333,.95,.211765,.34902,.254902,1,.152941,.278431,.196078]},{ColorSpace:"Lab",Creator:"Francesca Samsel",Name:"Green-Blue Asymmetric Divergent (62Blbc)",NanColor:[.25,0,0],RGBPoints:[0,.121569,.2,.145098,.05,.196078,.301961,.223529,.1,.258824,.4,.278431,.2,.341176,.54902,.341176,.25,.419608,.619608,.376471,.3,.545098,.701961,.392157,.35,.643137,.780392,.403922,.4,.729412,.819608,.45098,.45,.811765,.870588,.521569,.5,.898039,.909804,.564706,.55,.941176,.92549,.686275,.6,.960784,.94902,.776471,.64,1,1,1,.65,.890196,.988235,.972549,.7,.721569,.894118,.901961,.75,.631373,.823529,.839216,.8,.517647,.662745,.701961,.85,.384314,.494118,.54902,.9,.298039,.360784,.45098,.95,.223529,.25098,.34902,.99,.156863,.172549,.25098,1,.137255,.137255,.188235]},{ColorSpace:"Lab",Creator:"Francesca Samsel",Name:"Asymmtrical Earth Tones (6_21b)",NanColor:[.25,0,0],RGBPoints:[0,.141176,.14902,.2,.05,.215686,.258824,.321569,.1,.243137,.368627,.380392,.15,.27451,.439216,.4,.2,.32549,.501961,.384314,.25,.403922,.6,.419608,.3,.486275,.701961,.454902,.35,.556863,.74902,.494118,.4,.670588,.8,.545098,.5,.854902,.901961,.631373,.55,.92549,.941176,.694118,.6,.960784,.94902,.776471,.65,.988235,.968627,.909804,.7,.839216,.815686,.772549,.75,.701961,.662745,.615686,.8,.6,.529412,.478431,.85,.501961,.403922,.360784,.9,.439216,.313725,.290196,1,.301961,.164706,.176471]},{ColorSpace:"Lab",Creator:"Francesca Samsel",Name:"Yellow 15",NanColor:[.25,0,0],RGBPoints:[0,1,1,.988235,.002,1,1,.988235,.05,.984314,.988235,.843137,.1,.988235,.988235,.741176,.15,.980392,.968627,.654902,.2,.980392,.945098,.576471,.25,.968627,.905882,.486275,.3,.968627,.862745,.388235,.35,.960784,.803922,.286275,.4,.94902,.741176,.219608,.45,.941176,.678431,.14902,.5,.929412,.607843,.094118,.55,.921569,.545098,.054902,.6,.909804,.486275,.035294,.65,.890196,.411765,.019608,.7,.8,.305882,0,.75,.760784,.239216,0,.8,.678431,.180392,.011765,.85,.6,.121569,.023529,.9,.501961,.054902,.031373,.95,.4,.039216,.058824,1,.301961,.047059,.090196]},{ColorSpace:"Diverging",Name:"Magma (matplotlib)",NanColor:[0,1,0],Source:"https://github.com/BIDS/colormap/blob/master/colormaps.py",License:"CC0",Creator:"Nathaniel J. Smith & Stefan van der Walt",RGBPoints:[0,.001462,466e-6,.013866,.003922,.002258,.001295,.018331,.007843,.003279,.002305,.023708,.011765,.004512,.00349,.029965,.015686,.00595,.004843,.03713,.019608,.007588,.006356,.044973,.023529,.009426,.008022,.052844,.027451,.011465,.009828,.06075,.031373,.013708,.011771,.068667,.035294,.016156,.01384,.076603,.039216,.018815,.016026,.084584,.043137,.021692,.01832,.09261,.047059,.024792,.020715,.100676,.05098,.028123,.023201,.108787,.054902,.031696,.025765,.116965,.058824,.03552,.028397,.125209,.062745,.039608,.03109,.133515,.066667,.04383,.03383,.141886,.070588,.048062,.036607,.150327,.07451,.05232,.039407,.158841,.078431,.056615,.04216,.167446,.082353,.060949,.044794,.176129,.086275,.06533,.047318,.184892,.090196,.069764,.049726,.193735,.094118,.074257,.052017,.20266,.098039,.078815,.054184,.211667,.101961,.083446,.056225,.220755,.105882,.088155,.058133,.229922,.109804,.092949,.059904,.239164,.113725,.097833,.061531,.248477,.117647,.102815,.06301,.257854,.121569,.107899,.064335,.267289,.12549,.113094,.065492,.276784,.129412,.118405,.066479,.286321,.133333,.123833,.067295,.295879,.137255,.12938,.067935,.305443,.141176,.135053,.068391,.315,.145098,.140858,.068654,.324538,.14902,.146785,.068738,.334011,.152941,.152839,.068637,.343404,.156863,.159018,.068354,.352688,.160784,.165308,.067911,.361816,.164706,.171713,.067305,.370771,.168627,.178212,.066576,.379497,.172549,.184801,.065732,.387973,.176471,.19146,.064818,.396152,.180392,.198177,.063862,.404009,.184314,.204935,.062907,.411514,.188235,.211718,.061992,.418647,.192157,.218512,.061158,.425392,.196078,.225302,.060445,.431742,.2,.232077,.059889,.437695,.203922,.238826,.059517,.443256,.207843,.245543,.059352,.448436,.211765,.25222,.059415,.453248,.215686,.258857,.059706,.45771,.219608,.265447,.060237,.46184,.223529,.271994,.060994,.46566,.227451,.278493,.061978,.46919,.231373,.284951,.063168,.472451,.235294,.291366,.064553,.475462,.239216,.29774,.066117,.478243,.243137,.304081,.067835,.480812,.247059,.310382,.069702,.483186,.25098,.316654,.07169,.48538,.254902,.322899,.073782,.487408,.258824,.329114,.075972,.489287,.262745,.335308,.078236,.491024,.266667,.341482,.080564,.492631,.270588,.347636,.082946,.494121,.27451,.353773,.085373,.495501,.278431,.359898,.087831,.496778,.282353,.366012,.090314,.49796,.286275,.372116,.092816,.499053,.290196,.378211,.095332,.500067,.294118,.384299,.097855,.501002,.298039,.390384,.100379,.501864,.301961,.396467,.102902,.502658,.305882,.402548,.10542,.503386,.309804,.408629,.10793,.504052,.313725,.414709,.110431,.504662,.317647,.420791,.11292,.505215,.321569,.426877,.115395,.505714,.32549,.432967,.117855,.50616,.329412,.439062,.120298,.506555,.333333,.445163,.122724,.506901,.337255,.451271,.125132,.507198,.341176,.457386,.127522,.507448,.345098,.463508,.129893,.507652,.34902,.46964,.132245,.507809,.352941,.47578,.134577,.507921,.356863,.481929,.136891,.507989,.360784,.488088,.139186,.508011,.364706,.494258,.141462,.507988,.368627,.500438,.143719,.50792,.372549,.506629,.145958,.507806,.376471,.512831,.148179,.507648,.380392,.519045,.150383,.507443,.384314,.52527,.152569,.507192,.388235,.531507,.154739,.506895,.392157,.537755,.156894,.506551,.396078,.544015,.159033,.506159,.4,.550287,.161158,.505719,.403922,.556571,.163269,.50523,.407843,.562866,.165368,.504692,.411765,.569172,.167454,.504105,.415686,.57549,.16953,.503466,.419608,.581819,.171596,.502777,.423529,.588158,.173652,.502035,.427451,.594508,.175701,.501241,.431373,.600868,.177743,.500394,.435294,.607238,.179779,.499492,.439216,.613617,.181811,.498536,.443137,.620005,.18384,.497524,.447059,.626401,.185867,.496456,.45098,.632805,.187893,.495332,.454902,.639216,.189921,.49415,.458824,.645633,.191952,.49291,.462745,.652056,.193986,.491611,.466667,.658483,.196027,.490253,.470588,.664915,.198075,.488836,.47451,.671349,.200133,.487358,.478431,.677786,.202203,.485819,.482353,.684224,.204286,.484219,.486275,.690661,.206384,.482558,.490196,.697098,.208501,.480835,.494118,.703532,.210638,.479049,.498039,.709962,.212797,.477201,.501961,.716387,.214982,.47529,.505882,.722805,.217194,.473316,.509804,.729216,.219437,.471279,.513725,.735616,.221713,.46918,.517647,.742004,.224025,.467018,.521569,.748378,.226377,.464794,.52549,.754737,.228772,.462509,.529412,.761077,.231214,.460162,.533333,.767398,.233705,.457755,.537255,.773695,.236249,.455289,.541176,.779968,.238851,.452765,.545098,.786212,.241514,.450184,.54902,.792427,.244242,.447543,.552941,.798608,.24704,.444848,.556863,.804752,.249911,.442102,.560784,.810855,.252861,.439305,.564706,.816914,.255895,.436461,.568627,.822926,.259016,.433573,.572549,.828886,.262229,.430644,.576471,.834791,.26554,.427671,.580392,.840636,.268953,.424666,.584314,.846416,.272473,.421631,.588235,.852126,.276106,.418573,.592157,.857763,.279857,.415496,.596078,.86332,.283729,.412403,.6,.868793,.287728,.409303,.603922,.874176,.291859,.406205,.607843,.879464,.296125,.403118,.611765,.884651,.30053,.400047,.615686,.889731,.305079,.397002,.619608,.8947,.309773,.393995,.623529,.899552,.314616,.391037,.627451,.904281,.31961,.388137,.631373,.908884,.324755,.385308,.635294,.913354,.330052,.382563,.639216,.917689,.3355,.379915,.643137,.921884,.341098,.377376,.647059,.925937,.346844,.374959,.65098,.929845,.352734,.372677,.654902,.933606,.358764,.370541,.658824,.937221,.364929,.368567,.662745,.940687,.371224,.366762,.666667,.944006,.377643,.365136,.670588,.94718,.384178,.363701,.67451,.95021,.39082,.362468,.678431,.953099,.397563,.361438,.682353,.955849,.4044,.360619,.686275,.958464,.411324,.360014,.690196,.960949,.418323,.35963,.694118,.96331,.42539,.359469,.698039,.965549,.432519,.359529,.701961,.967671,.439703,.35981,.705882,.96968,.446936,.360311,.709804,.971582,.45421,.36103,.713725,.973381,.46152,.361965,.717647,.975082,.468861,.363111,.721569,.97669,.476226,.364466,.72549,.97821,.483612,.366025,.729412,.979645,.491014,.367783,.733333,.981,.498428,.369734,.737255,.982279,.505851,.371874,.741176,.983485,.51328,.374198,.745098,.984622,.520713,.376698,.74902,.985693,.528148,.379371,.752941,.9867,.535582,.38221,.756863,.987646,.543015,.38521,.760784,.988533,.550446,.388365,.764706,.989363,.557873,.391671,.768627,.990138,.565296,.395122,.772549,.990871,.572706,.398714,.776471,.991558,.580107,.402441,.780392,.992196,.587502,.406299,.784314,.992785,.594891,.410283,.788235,.993326,.602275,.41439,.792157,.993834,.609644,.418613,.796078,.994309,.616999,.42295,.8,.994738,.62435,.427397,.803922,.995122,.631696,.431951,.807843,.99548,.639027,.436607,.811765,.99581,.646344,.441361,.815686,.996096,.653659,.446213,.819608,.996341,.660969,.45116,.823529,.99658,.668256,.456192,.827451,.996775,.675541,.461314,.831373,.996925,.682828,.466526,.835294,.997077,.690088,.471811,.839216,.997186,.697349,.477182,.843137,.997254,.704611,.482635,.847059,.997325,.711848,.488154,.85098,.997351,.719089,.493755,.854902,.997351,.726324,.499428,.858824,.997341,.733545,.505167,.862745,.997285,.740772,.510983,.866667,.997228,.747981,.516859,.870588,.997138,.75519,.522806,.87451,.997019,.762398,.528821,.878431,.996898,.769591,.534892,.882353,.996727,.776795,.541039,.886275,.996571,.783977,.547233,.890196,.996369,.791167,.553499,.894118,.996162,.798348,.55982,.898039,.995932,.805527,.566202,.901961,.99568,.812706,.572645,.905882,.995424,.819875,.57914,.909804,.995131,.827052,.585701,.913725,.994851,.834213,.592307,.917647,.994524,.841387,.598983,.921569,.994222,.84854,.605696,.92549,.993866,.855711,.612482,.929412,.993545,.862859,.619299,.933333,.99317,.870024,.626189,.937255,.992831,.877168,.633109,.941176,.99244,.88433,.640099,.945098,.992089,.89147,.647116,.94902,.991688,.898627,.654202,.952941,.991332,.905763,.661309,.956863,.99093,.912915,.668481,.960784,.99057,.920049,.675675,.964706,.990175,.927196,.682926,.968627,.989815,.934329,.690198,.972549,.989434,.94147,.697519,.976471,.989077,.948604,.704863,.980392,.988717,.955742,.712242,.984314,.988367,.962878,.719649,.988235,.988033,.970012,.727077,.992157,.987691,.977154,.734536,.996078,.987387,.984288,.742002,1,.987053,.991438,.749504]},{ColorSpace:"Diverging",Name:"Inferno (matplotlib)",NanColor:[0,1,0],Source:"https://github.com/BIDS/colormap/blob/master/colormaps.py",License:"CC0",Creator:"Nathaniel J. Smith & Stefan van der Walt",RGBPoints:[0,.001462,466e-6,.013866,.003922,.002267,.00127,.01857,.007843,.003299,.002249,.024239,.011765,.004547,.003392,.030909,.015686,.006006,.004692,.038558,.019608,.007676,.006136,.046836,.023529,.009561,.007713,.055143,.027451,.011663,.009417,.06346,.031373,.013995,.011225,.071862,.035294,.016561,.013136,.080282,.039216,.019373,.015133,.088767,.043137,.022447,.017199,.097327,.047059,.025793,.019331,.10593,.05098,.029432,.021503,.114621,.054902,.033385,.023702,.123397,.058824,.037668,.025921,.132232,.062745,.042253,.028139,.141141,.066667,.046915,.030324,.150164,.070588,.051644,.032474,.159254,.07451,.056449,.034569,.168414,.078431,.06134,.03659,.177642,.082353,.066331,.038504,.186962,.086275,.071429,.040294,.196354,.090196,.076637,.041905,.205799,.094118,.081962,.043328,.215289,.098039,.087411,.044556,.224813,.101961,.09299,.045583,.234358,.105882,.098702,.046402,.243904,.109804,.104551,.047008,.25343,.113725,.110536,.047399,.262912,.117647,.116656,.047574,.272321,.121569,.122908,.047536,.281624,.12549,.129285,.047293,.290788,.129412,.135778,.046856,.299776,.133333,.142378,.046242,.308553,.137255,.149073,.045468,.317085,.141176,.15585,.044559,.325338,.145098,.162689,.043554,.333277,.14902,.169575,.042489,.340874,.152941,.176493,.041402,.348111,.156863,.183429,.040329,.354971,.160784,.190367,.039309,.361447,.164706,.197297,.0384,.367535,.168627,.204209,.037632,.373238,.172549,.211095,.03703,.378563,.176471,.217949,.036615,.383522,.180392,.224763,.036405,.388129,.184314,.231538,.036405,.3924,.188235,.238273,.036621,.396353,.192157,.244967,.037055,.400007,.196078,.25162,.037705,.403378,.2,.258234,.038571,.406485,.203922,.26481,.039647,.409345,.207843,.271347,.040922,.411976,.211765,.27785,.042353,.414392,.215686,.284321,.043933,.416608,.219608,.290763,.045644,.418637,.223529,.297178,.04747,.420491,.227451,.303568,.049396,.422182,.231373,.309935,.051407,.423721,.235294,.316282,.05349,.425116,.239216,.32261,.055634,.426377,.243137,.328921,.057827,.427511,.247059,.335217,.06006,.428524,.25098,.3415,.062325,.429425,.254902,.347771,.064616,.430217,.258824,.354032,.066925,.430906,.262745,.360284,.069247,.431497,.266667,.366529,.071579,.431994,.270588,.372768,.073915,.4324,.27451,.379001,.076253,.432719,.278431,.385228,.078591,.432955,.282353,.391453,.080927,.433109,.286275,.397674,.083257,.433183,.290196,.403894,.08558,.433179,.294118,.410113,.087896,.433098,.298039,.416331,.090203,.432943,.301961,.422549,.092501,.432714,.305882,.428768,.09479,.432412,.309804,.434987,.097069,.432039,.313725,.441207,.099338,.431594,.317647,.447428,.101597,.43108,.321569,.453651,.103848,.430498,.32549,.459875,.106089,.429846,.329412,.4661,.108322,.429125,.333333,.472328,.110547,.428334,.337255,.478558,.112764,.427475,.341176,.484789,.114974,.426548,.345098,.491022,.117179,.425552,.34902,.497257,.119379,.424488,.352941,.503493,.121575,.423356,.356863,.50973,.123769,.422156,.360784,.515967,.12596,.420887,.364706,.522206,.12815,.419549,.368627,.528444,.130341,.418142,.372549,.534683,.132534,.416667,.376471,.54092,.134729,.415123,.380392,.547157,.136929,.413511,.384314,.553392,.139134,.411829,.388235,.559624,.141346,.410078,.392157,.565854,.143567,.408258,.396078,.572081,.145797,.406369,.4,.578304,.148039,.404411,.403922,.584521,.150294,.402385,.407843,.590734,.152563,.40029,.411765,.59694,.154848,.398125,.415686,.603139,.157151,.395891,.419608,.60933,.159474,.393589,.423529,.615513,.161817,.391219,.427451,.621685,.164184,.388781,.431373,.627847,.166575,.386276,.435294,.633998,.168992,.383704,.439216,.640135,.171438,.381065,.443137,.64626,.173914,.378359,.447059,.652369,.176421,.375586,.45098,.658463,.178962,.372748,.454902,.66454,.181539,.369846,.458824,.670599,.184153,.366879,.462745,.676638,.186807,.363849,.466667,.682656,.189501,.360757,.470588,.688653,.192239,.357603,.47451,.694627,.195021,.354388,.478431,.700576,.197851,.351113,.482353,.7065,.200728,.347777,.486275,.712396,.203656,.344383,.490196,.718264,.206636,.340931,.494118,.724103,.20967,.337424,.498039,.729909,.212759,.333861,.501961,.735683,.215906,.330245,.505882,.741423,.219112,.326576,.509804,.747127,.222378,.322856,.513725,.752794,.225706,.319085,.517647,.758422,.229097,.315266,.521569,.76401,.232554,.311399,.52549,.769556,.236077,.307485,.529412,.775059,.239667,.303526,.533333,.780517,.243327,.299523,.537255,.785929,.247056,.295477,.541176,.791293,.250856,.29139,.545098,.796607,.254728,.287264,.54902,.801871,.258674,.283099,.552941,.807082,.262692,.278898,.556863,.812239,.266786,.274661,.560784,.817341,.270954,.27039,.564706,.822386,.275197,.266085,.568627,.827372,.279517,.26175,.572549,.832299,.283913,.257383,.576471,.837165,.288385,.252988,.580392,.841969,.292933,.248564,.584314,.846709,.297559,.244113,.588235,.851384,.30226,.239636,.592157,.855992,.307038,.235133,.596078,.860533,.311892,.230606,.6,.865006,.316822,.226055,.603922,.869409,.321827,.221482,.607843,.873741,.326906,.216886,.611765,.878001,.33206,.212268,.615686,.882188,.337287,.207628,.619608,.886302,.342586,.202968,.623529,.890341,.347957,.198286,.627451,.894305,.353399,.193584,.631373,.898192,.358911,.18886,.635294,.902003,.364492,.184116,.639216,.905735,.37014,.17935,.643137,.90939,.375856,.174563,.647059,.912966,.381636,.169755,.65098,.916462,.387481,.164924,.654902,.919879,.393389,.16007,.658824,.923215,.399359,.155193,.662745,.92647,.405389,.150292,.666667,.929644,.411479,.145367,.670588,.932737,.417627,.140417,.67451,.935747,.423831,.13544,.678431,.938675,.430091,.130438,.682353,.941521,.436405,.125409,.686275,.944285,.442772,.120354,.690196,.946965,.449191,.115272,.694118,.949562,.45566,.110164,.698039,.952075,.462178,.105031,.701961,.954506,.468744,.099874,.705882,.956852,.475356,.094695,.709804,.959114,.482014,.089499,.713725,.961293,.488716,.084289,.717647,.963387,.495462,.079073,.721569,.965397,.502249,.073859,.72549,.967322,.509078,.068659,.729412,.969163,.515946,.063488,.733333,.970919,.522853,.058367,.737255,.97259,.529798,.053324,.741176,.974176,.53678,.048392,.745098,.975677,.543798,.043618,.74902,.977092,.55085,.03905,.752941,.978422,.557937,.034931,.756863,.979666,.565057,.031409,.760784,.980824,.572209,.028508,.764706,.981895,.579392,.02625,.768627,.982881,.586606,.024661,.772549,.983779,.593849,.02377,.776471,.984591,.601122,.023606,.780392,.985315,.608422,.024202,.784314,.985952,.61575,.025592,.788235,.986502,.623105,.027814,.792157,.986964,.630485,.030908,.796078,.987337,.63789,.034916,.8,.987622,.64532,.039886,.803922,.987819,.652773,.045581,.807843,.987926,.66025,.05175,.811765,.987945,.667748,.058329,.815686,.987874,.675267,.065257,.819608,.987714,.682807,.072489,.823529,.987464,.690366,.07999,.827451,.987124,.697944,.087731,.831373,.986694,.70554,.095694,.835294,.986175,.713153,.103863,.839216,.985566,.720782,.112229,.843137,.984865,.728427,.120785,.847059,.984075,.736087,.129527,.85098,.983196,.743758,.138453,.854902,.982228,.751442,.147565,.858824,.981173,.759135,.156863,.862745,.980032,.766837,.166353,.866667,.978806,.774545,.176037,.870588,.977497,.782258,.185923,.87451,.976108,.789974,.196018,.878431,.974638,.797692,.206332,.882353,.973088,.805409,.216877,.886275,.971468,.813122,.227658,.890196,.969783,.820825,.238686,.894118,.968041,.828515,.249972,.898039,.966243,.836191,.261534,.901961,.964394,.843848,.273391,.905882,.962517,.851476,.285546,.909804,.960626,.859069,.29801,.913725,.95872,.866624,.31082,.917647,.956834,.874129,.323974,.921569,.954997,.881569,.337475,.92549,.953215,.888942,.351369,.929412,.951546,.896226,.365627,.933333,.950018,.903409,.380271,.937255,.948683,.910473,.395289,.941176,.947594,.917399,.410665,.945098,.946809,.924168,.426373,.94902,.946392,.930761,.442367,.952941,.946403,.937159,.458592,.956863,.946903,.943348,.47497,.960784,.947937,.949318,.491426,.964706,.949545,.955063,.50786,.968627,.95174,.960587,.524203,.972549,.954529,.965896,.540361,.976471,.957896,.971003,.556275,.980392,.961812,.975924,.571925,.984314,.966249,.980678,.587206,.988235,.971162,.985282,.602154,.992157,.976511,.989753,.61676,.996078,.982257,.994109,.631017,1,.988362,.998364,.644924]},{ColorSpace:"Diverging",Name:"Plasma (matplotlib)",NanColor:[0,1,0],Source:"https://github.com/BIDS/colormap/blob/master/colormaps.py",License:"CC0",Creator:"Nathaniel J. Smith & Stefan van der Walt",RGBPoints:[0,.050383,.029803,.527975,.003922,.063536,.028426,.533124,.007843,.075353,.027206,.538007,.011765,.086222,.026125,.542658,.015686,.096379,.025165,.547103,.019608,.10598,.024309,.551368,.023529,.115124,.023556,.555468,.027451,.123903,.022878,.559423,.031373,.132381,.022258,.56325,.035294,.140603,.021687,.566959,.039216,.148607,.021154,.570562,.043137,.156421,.020651,.574065,.047059,.16407,.020171,.577478,.05098,.171574,.019706,.580806,.054902,.17895,.019252,.584054,.058824,.186213,.018803,.587228,.062745,.193374,.018354,.59033,.066667,.200445,.017902,.593364,.070588,.207435,.017442,.596333,.07451,.21435,.016973,.599239,.078431,.221197,.016497,.602083,.082353,.227983,.016007,.604867,.086275,.234715,.015502,.607592,.090196,.241396,.014979,.610259,.094118,.248032,.014439,.612868,.098039,.254627,.013882,.615419,.101961,.261183,.013308,.617911,.105882,.267703,.012716,.620346,.109804,.274191,.012109,.622722,.113725,.280648,.011488,.625038,.117647,.287076,.010855,.627295,.121569,.293478,.010213,.62949,.12549,.299855,.009561,.631624,.129412,.30621,.008902,.633694,.133333,.312543,.008239,.6357,.137255,.318856,.007576,.63764,.141176,.32515,.006915,.639512,.145098,.331426,.006261,.641316,.14902,.337683,.005618,.643049,.152941,.343925,.004991,.64471,.156863,.35015,.004382,.646298,.160784,.356359,.003798,.64781,.164706,.362553,.003243,.649245,.168627,.368733,.002724,.650601,.172549,.374897,.002245,.651876,.176471,.381047,.001814,.653068,.180392,.387183,.001434,.654177,.184314,.393304,.001114,.655199,.188235,.399411,859e-6,.656133,.192157,.405503,678e-6,.656977,.196078,.41158,577e-6,.65773,.2,.417642,564e-6,.65839,.203922,.423689,646e-6,.658956,.207843,.429719,831e-6,.659425,.211765,.435734,.001127,.659797,.215686,.441732,.00154,.660069,.219608,.447714,.00208,.66024,.223529,.453677,.002755,.66031,.227451,.459623,.003574,.660277,.231373,.46555,.004545,.660139,.235294,.471457,.005678,.659897,.239216,.477344,.00698,.659549,.243137,.48321,.00846,.659095,.247059,.489055,.010127,.658534,.25098,.494877,.01199,.657865,.254902,.500678,.014055,.657088,.258824,.506454,.016333,.656202,.262745,.512206,.018833,.655209,.266667,.517933,.021563,.654109,.270588,.523633,.024532,.652901,.27451,.529306,.027747,.651586,.278431,.534952,.031217,.650165,.282353,.54057,.03495,.64864,.286275,.546157,.038954,.64701,.290196,.551715,.043136,.645277,.294118,.557243,.047331,.643443,.298039,.562738,.051545,.641509,.301961,.568201,.055778,.639477,.305882,.573632,.060028,.637349,.309804,.579029,.064296,.635126,.313725,.584391,.068579,.632812,.317647,.589719,.072878,.630408,.321569,.595011,.07719,.627917,.32549,.600266,.081516,.625342,.329412,.605485,.085854,.622686,.333333,.610667,.090204,.619951,.337255,.615812,.094564,.61714,.341176,.620919,.098934,.614257,.345098,.625987,.103312,.611305,.34902,.631017,.107699,.608287,.352941,.636008,.112092,.605205,.356863,.640959,.116492,.602065,.360784,.645872,.120898,.598867,.364706,.650746,.125309,.595617,.368627,.65558,.129725,.592317,.372549,.660374,.134144,.588971,.376471,.665129,.138566,.585582,.380392,.669845,.142992,.582154,.384314,.674522,.147419,.578688,.388235,.67916,.151848,.575189,.392157,.683758,.156278,.57166,.396078,.688318,.160709,.568103,.4,.69284,.165141,.564522,.403922,.697324,.169573,.560919,.407843,.701769,.174005,.557296,.411765,.706178,.178437,.553657,.415686,.710549,.182868,.550004,.419608,.714883,.187299,.546338,.423529,.719181,.191729,.542663,.427451,.723444,.196158,.538981,.431373,.72767,.200586,.535293,.435294,.731862,.205013,.531601,.439216,.736019,.209439,.527908,.443137,.740143,.213864,.524216,.447059,.744232,.218288,.520524,.45098,.748289,.222711,.516834,.454902,.752312,.227133,.513149,.458824,.756304,.231555,.509468,.462745,.760264,.235976,.505794,.466667,.764193,.240396,.502126,.470588,.76809,.244817,.498465,.47451,.771958,.249237,.494813,.478431,.775796,.253658,.491171,.482353,.779604,.258078,.487539,.486275,.783383,.2625,.483918,.490196,.787133,.266922,.480307,.494118,.790855,.271345,.476706,.498039,.794549,.27577,.473117,.501961,.798216,.280197,.469538,.505882,.801855,.284626,.465971,.509804,.805467,.289057,.462415,.513725,.809052,.293491,.45887,.517647,.812612,.297928,.455338,.521569,.816144,.302368,.451816,.52549,.819651,.306812,.448306,.529412,.823132,.311261,.444806,.533333,.826588,.315714,.441316,.537255,.830018,.320172,.437836,.541176,.833422,.324635,.434366,.545098,.836801,.329105,.430905,.54902,.840155,.33358,.427455,.552941,.843484,.338062,.424013,.556863,.846788,.342551,.420579,.560784,.850066,.347048,.417153,.564706,.853319,.351553,.413734,.568627,.856547,.356066,.410322,.572549,.85975,.360588,.406917,.576471,.862927,.365119,.403519,.580392,.866078,.36966,.400126,.584314,.869203,.374212,.396738,.588235,.872303,.378774,.393355,.592157,.875376,.383347,.389976,.596078,.878423,.387932,.3866,.6,.881443,.392529,.383229,.603922,.884436,.397139,.37986,.607843,.887402,.401762,.376494,.611765,.89034,.406398,.37313,.615686,.89325,.411048,.369768,.619608,.896131,.415712,.366407,.623529,.898984,.420392,.363047,.627451,.901807,.425087,.359688,.631373,.904601,.429797,.356329,.635294,.907365,.434524,.35297,.639216,.910098,.439268,.34961,.643137,.9128,.444029,.346251,.647059,.915471,.448807,.34289,.65098,.918109,.453603,.339529,.654902,.920714,.458417,.336166,.658824,.923287,.463251,.332801,.662745,.925825,.468103,.329435,.666667,.928329,.472975,.326067,.670588,.930798,.477867,.322697,.67451,.933232,.48278,.319325,.678431,.93563,.487712,.315952,.682353,.93799,.492667,.312575,.686275,.940313,.497642,.309197,.690196,.942598,.502639,.305816,.694118,.944844,.507658,.302433,.698039,.947051,.512699,.299049,.701961,.949217,.517763,.295662,.705882,.951344,.52285,.292275,.709804,.953428,.52796,.288883,.713725,.95547,.533093,.28549,.717647,.957469,.53825,.282096,.721569,.959424,.543431,.278701,.72549,.961336,.548636,.275305,.729412,.963203,.553865,.271909,.733333,.965024,.559118,.268513,.737255,.966798,.564396,.265118,.741176,.968526,.5697,.261721,.745098,.970205,.575028,.258325,.74902,.971835,.580382,.254931,.752941,.973416,.585761,.25154,.756863,.974947,.591165,.248151,.760784,.976428,.596595,.244767,.764706,.977856,.602051,.241387,.768627,.979233,.607532,.238013,.772549,.980556,.613039,.234646,.776471,.981826,.618572,.231287,.780392,.983041,.624131,.227937,.784314,.984199,.629718,.224595,.788235,.985301,.63533,.221265,.792157,.986345,.640969,.217948,.796078,.987332,.646633,.214648,.8,.98826,.652325,.211364,.803922,.989128,.658043,.2081,.807843,.989935,.663787,.204859,.811765,.990681,.669558,.201642,.815686,.991365,.675355,.198453,.819608,.991985,.681179,.195295,.823529,.992541,.68703,.19217,.827451,.993032,.692907,.189084,.831373,.993456,.69881,.186041,.835294,.993814,.704741,.183043,.839216,.994103,.710698,.180097,.843137,.994324,.716681,.177208,.847059,.994474,.722691,.174381,.85098,.994553,.728728,.171622,.854902,.994561,.734791,.168938,.858824,.994495,.74088,.166335,.862745,.994355,.746995,.163821,.866667,.994141,.753137,.161404,.870588,.993851,.759304,.159092,.87451,.993482,.765499,.156891,.878431,.993033,.77172,.154808,.882353,.992505,.777967,.152855,.886275,.991897,.784239,.151042,.890196,.991209,.790537,.149377,.894118,.990439,.796859,.14787,.898039,.989587,.803205,.146529,.901961,.988648,.809579,.145357,.905882,.987621,.815978,.144363,.909804,.986509,.822401,.143557,.913725,.985314,.828846,.142945,.917647,.984031,.835315,.142528,.921569,.982653,.841812,.142303,.92549,.98119,.848329,.142279,.929412,.979644,.854866,.142453,.933333,.977995,.861432,.142808,.937255,.976265,.868016,.143351,.941176,.974443,.874622,.144061,.945098,.97253,.88125,.144923,.94902,.970533,.887896,.145919,.952941,.968443,.894564,.147014,.956863,.966271,.901249,.14818,.960784,.964021,.90795,.14937,.964706,.961681,.914672,.15052,.968627,.959276,.921407,.151566,.972549,.956808,.928152,.152409,.976471,.954287,.934908,.152921,.980392,.951726,.941671,.152925,.984314,.949151,.948435,.152178,.988235,.946602,.95519,.150328,.992157,.944152,.961916,.146861,.996078,.941896,.96859,.140956,1,.940015,.975158,.131326]},{ColorSpace:"Diverging",Name:"Viridis (matplotlib)",NanColor:[1,0,0],Source:"https://github.com/BIDS/colormap/blob/master/colormaps.py",License:"CC0",Creator:"Eric Firing",RGBPoints:[0,.267004,.004874,.329415,.003922,.26851,.009605,.335427,.007843,.269944,.014625,.341379,.011765,.271305,.019942,.347269,.015686,.272594,.025563,.353093,.019608,.273809,.031497,.358853,.023529,.274952,.037752,.364543,.027451,.276022,.044167,.370164,.031373,.277018,.050344,.375715,.035294,.277941,.056324,.381191,.039216,.278791,.062145,.386592,.043137,.279566,.067836,.391917,.047059,.280267,.073417,.397163,.05098,.280894,.078907,.402329,.054902,.281446,.08432,.407414,.058824,.281924,.089666,.412415,.062745,.282327,.094955,.417331,.066667,.282656,.100196,.42216,.070588,.28291,.105393,.426902,.07451,.283091,.110553,.431554,.078431,.283197,.11568,.436115,.082353,.283229,.120777,.440584,.086275,.283187,.125848,.44496,.090196,.283072,.130895,.449241,.094118,.282884,.13592,.453427,.098039,.282623,.140926,.457517,.101961,.28229,.145912,.46151,.105882,.281887,.150881,.465405,.109804,.281412,.155834,.469201,.113725,.280868,.160771,.472899,.117647,.280255,.165693,.476498,.121569,.279574,.170599,.479997,.12549,.278826,.17549,.483397,.129412,.278012,.180367,.486697,.133333,.277134,.185228,.489898,.137255,.276194,.190074,.493001,.141176,.275191,.194905,.496005,.145098,.274128,.199721,.498911,.14902,.273006,.20452,.501721,.152941,.271828,.209303,.504434,.156863,.270595,.214069,.507052,.160784,.269308,.218818,.509577,.164706,.267968,.223549,.512008,.168627,.26658,.228262,.514349,.172549,.265145,.232956,.516599,.176471,.263663,.237631,.518762,.180392,.262138,.242286,.520837,.184314,.260571,.246922,.522828,.188235,.258965,.251537,.524736,.192157,.257322,.25613,.526563,.196078,.255645,.260703,.528312,.2,.253935,.265254,.529983,.203922,.252194,.269783,.531579,.207843,.250425,.27429,.533103,.211765,.248629,.278775,.534556,.215686,.246811,.283237,.535941,.219608,.244972,.287675,.53726,.223529,.243113,.292092,.538516,.227451,.241237,.296485,.539709,.231373,.239346,.300855,.540844,.235294,.237441,.305202,.541921,.239216,.235526,.309527,.542944,.243137,.233603,.313828,.543914,.247059,.231674,.318106,.544834,.25098,.229739,.322361,.545706,.254902,.227802,.326594,.546532,.258824,.225863,.330805,.547314,.262745,.223925,.334994,.548053,.266667,.221989,.339161,.548752,.270588,.220057,.343307,.549413,.27451,.21813,.347432,.550038,.278431,.21621,.351535,.550627,.282353,.214298,.355619,.551184,.286275,.212395,.359683,.55171,.290196,.210503,.363727,.552206,.294118,.208623,.367752,.552675,.298039,.206756,.371758,.553117,.301961,.204903,.375746,.553533,.305882,.203063,.379716,.553925,.309804,.201239,.38367,.554294,.313725,.19943,.387607,.554642,.317647,.197636,.391528,.554969,.321569,.19586,.395433,.555276,.32549,.1941,.399323,.555565,.329412,.192357,.403199,.555836,.333333,.190631,.407061,.556089,.337255,.188923,.41091,.556326,.341176,.187231,.414746,.556547,.345098,.185556,.41857,.556753,.34902,.183898,.422383,.556944,.352941,.182256,.426184,.55712,.356863,.180629,.429975,.557282,.360784,.179019,.433756,.55743,.364706,.177423,.437527,.557565,.368627,.175841,.44129,.557685,.372549,.174274,.445044,.557792,.376471,.172719,.448791,.557885,.380392,.171176,.45253,.557965,.384314,.169646,.456262,.55803,.388235,.168126,.459988,.558082,.392157,.166617,.463708,.558119,.396078,.165117,.467423,.558141,.4,.163625,.471133,.558148,.403922,.162142,.474838,.55814,.407843,.160665,.47854,.558115,.411765,.159194,.482237,.558073,.415686,.157729,.485932,.558013,.419608,.15627,.489624,.557936,.423529,.154815,.493313,.55784,.427451,.153364,.497,.557724,.431373,.151918,.500685,.557587,.435294,.150476,.504369,.55743,.439216,.149039,.508051,.55725,.443137,.147607,.511733,.557049,.447059,.14618,.515413,.556823,.45098,.144759,.519093,.556572,.454902,.143343,.522773,.556295,.458824,.141935,.526453,.555991,.462745,.140536,.530132,.555659,.466667,.139147,.533812,.555298,.470588,.13777,.537492,.554906,.47451,.136408,.541173,.554483,.478431,.135066,.544853,.554029,.482353,.133743,.548535,.553541,.486275,.132444,.552216,.553018,.490196,.131172,.555899,.552459,.494118,.129933,.559582,.551864,.498039,.128729,.563265,.551229,.501961,.127568,.566949,.550556,.505882,.126453,.570633,.549841,.509804,.125394,.574318,.549086,.513725,.124395,.578002,.548287,.517647,.123463,.581687,.547445,.521569,.122606,.585371,.546557,.52549,.121831,.589055,.545623,.529412,.121148,.592739,.544641,.533333,.120565,.596422,.543611,.537255,.120092,.600104,.54253,.541176,.119738,.603785,.5414,.545098,.119512,.607464,.540218,.54902,.119423,.611141,.538982,.552941,.119483,.614817,.537692,.556863,.119699,.61849,.536347,.560784,.120081,.622161,.534946,.564706,.120638,.625828,.533488,.568627,.12138,.629492,.531973,.572549,.122312,.633153,.530398,.576471,.123444,.636809,.528763,.580392,.12478,.640461,.527068,.584314,.126326,.644107,.525311,.588235,.128087,.647749,.523491,.592157,.130067,.651384,.521608,.596078,.132268,.655014,.519661,.6,.134692,.658636,.517649,.603922,.137339,.662252,.515571,.607843,.14021,.665859,.513427,.611765,.143303,.669459,.511215,.615686,.146616,.67305,.508936,.619608,.150148,.676631,.506589,.623529,.153894,.680203,.504172,.627451,.157851,.683765,.501686,.631373,.162016,.687316,.499129,.635294,.166383,.690856,.496502,.639216,.170948,.694384,.493803,.643137,.175707,.6979,.491033,.647059,.180653,.701402,.488189,.65098,.185783,.704891,.485273,.654902,.19109,.708366,.482284,.658824,.196571,.711827,.479221,.662745,.202219,.715272,.476084,.666667,.20803,.718701,.472873,.670588,.214,.722114,.469588,.67451,.220124,.725509,.466226,.678431,.226397,.728888,.462789,.682353,.232815,.732247,.459277,.686275,.239374,.735588,.455688,.690196,.24607,.73891,.452024,.694118,.252899,.742211,.448284,.698039,.259857,.745492,.444467,.701961,.266941,.748751,.440573,.705882,.274149,.751988,.436601,.709804,.281477,.755203,.432552,.713725,.288921,.758394,.428426,.717647,.296479,.761561,.424223,.721569,.304148,.764704,.419943,.72549,.311925,.767822,.415586,.729412,.319809,.770914,.411152,.733333,.327796,.77398,.40664,.737255,.335885,.777018,.402049,.741176,.344074,.780029,.397381,.745098,.35236,.783011,.392636,.74902,.360741,.785964,.387814,.752941,.369214,.788888,.382914,.756863,.377779,.791781,.377939,.760784,.386433,.794644,.372886,.764706,.395174,.797475,.367757,.768627,.404001,.800275,.362552,.772549,.412913,.803041,.357269,.776471,.421908,.805774,.35191,.780392,.430983,.808473,.346476,.784314,.440137,.811138,.340967,.788235,.449368,.813768,.335384,.792157,.458674,.816363,.329727,.796078,.468053,.818921,.323998,.8,.477504,.821444,.318195,.803922,.487026,.823929,.312321,.807843,.496615,.826376,.306377,.811765,.506271,.828786,.300362,.815686,.515992,.831158,.294279,.819608,.525776,.833491,.288127,.823529,.535621,.835785,.281908,.827451,.545524,.838039,.275626,.831373,.555484,.840254,.269281,.835294,.565498,.84243,.262877,.839216,.575563,.844566,.256415,.843137,.585678,.846661,.249897,.847059,.595839,.848717,.243329,.85098,.606045,.850733,.236712,.854902,.616293,.852709,.230052,.858824,.626579,.854645,.223353,.862745,.636902,.856542,.21662,.866667,.647257,.8584,.209861,.870588,.657642,.860219,.203082,.87451,.668054,.861999,.196293,.878431,.678489,.863742,.189503,.882353,.688944,.865448,.182725,.886275,.699415,.867117,.175971,.890196,.709898,.868751,.169257,.894118,.720391,.87035,.162603,.898039,.730889,.871916,.156029,.901961,.741388,.873449,.149561,.905882,.751884,.874951,.143228,.909804,.762373,.876424,.137064,.913725,.772852,.877868,.131109,.917647,.783315,.879285,.125405,.921569,.79376,.880678,.120005,.92549,.804182,.882046,.114965,.929412,.814576,.883393,.110347,.933333,.82494,.88472,.106217,.937255,.83527,.886029,.102646,.941176,.845561,.887322,.099702,.945098,.85581,.888601,.097452,.94902,.866013,.889868,.095953,.952941,.876168,.891125,.09525,.956863,.886271,.892374,.095374,.960784,.89632,.893616,.096335,.964706,.906311,.894855,.098125,.968627,.916242,.896091,.100717,.972549,.926106,.89733,.104071,.976471,.935904,.89857,.108131,.980392,.945636,.899815,.112838,.984314,.9553,.901065,.118128,.988235,.964894,.902323,.123941,.992157,.974417,.90359,.130215,.996078,.983868,.904867,.136897,1,.993248,.906157,.143936]},{ShowIndexedColorActiveValues:1,IndexedColors:[.07,.5,.7,1,1,1,.85,1,1,.8,.5,1,.76,1,0,1,.71,.71,.5,.5,.5,.05,.05,1,1,.05,.05,.7,1,1,.7,.89,.96,.67,.36,.95,.54,1,0,.75,.65,.65,.5,.6,.6,1,.5,0,1,1,.19,.12,.94,.12,.5,.82,.89,.56,.25,.83,.24,1,0,.9,.9,.9,.75,.76,.78,.65,.65,.67,.54,.6,.78,.61,.48,.78,.5,.48,.78,.44,.48,.78,.36,.48,.76,1,.48,.38,.49,.5,.69,.76,.56,.56,.4,.56,.56,.74,.5,.89,1,.63,0,.65,.16,.16,.36,.72,.82,.44,.18,.69,0,1,0,.58,1,1,.58,.88,.88,.45,.76,.79,.33,.71,.71,.23,.62,.62,.14,.56,.56,.04,.49,.55,0,.41,.52,.88,.88,1,1,.85,.56,.65,.46,.45,.4,.5,.5,.62,.39,.71,.83,.48,0,.58,0,.58,.26,.62,.69,.34,.09,.56,0,.79,0,.44,.83,1,1,1,.78,.85,1,.78,.78,1,.78,.64,1,.78,.56,1,.78,.38,1,.78,.27,1,.78,.19,1,.78,.12,1,.78,0,1,.61,0,.9,.46,0,.83,.32,0,.75,.22,0,.67,.14,.3,.76,1,.3,.65,1,.13,.58,.84,.15,.49,.67,.15,.4,.59,.09,.33,.53,.96,.93,.82,.8,.82,.12,.71,.71,.76,.65,.33,.3,.34,.35,.38,.62,.31,.71,.67,.36,0,.46,.31,.27,.26,.51,.59,.26,0,.4,0,.49,0,.44,.67,.98,0,.73,1,0,.63,1,0,.56,1,0,.5,1,0,.42,1,.33,.36,.95,.47,.36,.89,.54,.31,.89,.63,.21,.83,.7,.12,.83,.7,.12,.73,.7,.05,.65,.74,.05,.53,.78,0,.4,.8,0,.35,.82,0,.31,.85,0,.27,.88,0,.22,.9,0,.18,.91,0,.15,.92,0,.14,.93,0,.13,.94,0,.12,.95,0,.11,.96,0,.1,.97,0,.09,.98,0,.08,.99,0,.07,1,0,.06],Annotations:[0,"Xx",1,"H",2,"He",3,"Li",4,"Be",5,"B",6,"C",7,"N",8,"O",9,"F",10,"Ne",11,"Na",12,"Mg",13,"Al",14,"Si",15,"P",16,"S",17,"Cl",18,"Ar",19,"K",20,"Ca",21,"Sc",22,"Ti",23,"V",24,"Cr",25,"Mn",26,"Fe",27,"Co",28,"Ni",29,"Cu",30,"Zn",31,"Ga",32,"Ge",33,"As",34,"Se",35,"Br",36,"Kr",37,"Rb",38,"Sr",39,"Y",40,"Zr",41,"Nb",42,"Mo",43,"Tc",44,"Ru",45,"Rh",46,"Pd",47,"Ag",48,"Cd",49,"In",50,"Sn",51,"Sb",52,"Te",53,"I",54,"Xe",55,"Cs",56,"Ba",57,"La",58,"Ce",59,"Pr",60,"Nd",61,"Pm",62,"Sm",63,"Eu",64,"Gd",65,"Tb",66,"Dy",67,"Ho",68,"Er",69,"Tm",70,"Yb",71,"Lu",72,"Hf",73,"Ta",74,"W",75,"Re",76,"Os",77,"Ir",78,"Pt",79,"Au",80,"Hg",81,"Tl",82,"Pb",83,"Bi",84,"Po",85,"At",86,"Rn",87,"Fr",88,"Ra",89,"Ac",90,"Th",91,"Pa",92,"U",93,"Np",94,"Pu",95,"Am",96,"Cm",97,"Bk",98,"Cf",99,"Es",100,"Fm",101,"Md",102,"No",103,"Lr",104,"Rf",105,"Db",106,"Sg",107,"Bh",108,"Hs",109,"Mt",110,"Ds",111,"Rg",112,"Cn",113,"Uut",114,"Uuq",115,"Uup",116,"Uuh",117,"Uus",118,"Uuo"],Name:"BlueObeliskElements"}].filter((function(e){return e.RGBPoints})).filter((function(e){return"CIELAB"!==e.ColorSpace})).forEach((function(e){Yd[e.Name]=e}));var $d=Object.keys(Yd);$d.sort();var Qd={addPreset:function(e){e.RGBPoints&&"CIELAB"!==e.ColorSpace&&(Yd[e.Name]||($d.push(e.Name),$d.sort()),Yd[e.Name]=e)},removePresetByName:function(e){var t=$d.indexOf(e);t>-1&&$d.splice(t,1),delete Yd[e]},getPresetByName:function(e){return Yd[e]},rgbPresetNames:$d},Jd=r(91382),ef=r(49445);function tf(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}var rf=_n.InterpolationType,nf=_n.OpacityMode,af=ht.default.vtkErrorMacro,of=4;var sf={independentComponents:!0,interpolationType:rf.FAST_LINEAR,shade:!1,ambient:.1,diffuse:.7,specular:.2,specularPower:10,useLabelOutline:!1,labelOutlineThickness:1,labelOutlineOpacity:1};function lf(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(Object.assign(t,sf,r),ht.default.obj(e,t),!t.componentData){t.componentData=[];for(var n=0;n(e=t.componentData[n].grayTransferFunction.getMTime())?r:e):3===t.componentData[n].colorChannels&&t.componentData[n].rGBTransferFunction&&(r=r>(e=t.componentData[n].rGBTransferFunction.getMTime())?r:e),t.componentData[n].scalarOpacity&&(r=r>(e=t.componentData[n].scalarOpacity.getMTime())?r:e),t.componentData[n].gradientOpacity&&(t.componentData[n].disableGradientOpacity||(r=r>(e=t.componentData[n].gradientOpacity.getMTime())?r:e));return r},e.getColorChannels=function(e){return e<0||e>3?(af("Bad index - must be between 0 and 3"),0):t.componentData[e].colorChannels},e.setGrayTransferFunction=function(r,n){var a=!1;return t.componentData[r].grayTransferFunction!==n&&(t.componentData[r].grayTransferFunction=n,a=!0),1!==t.componentData[r].colorChannels&&(t.componentData[r].colorChannels=1,a=!0),a&&e.modified(),a},e.getGrayTransferFunction=function(r){return null===t.componentData[r].grayTransferFunction&&(t.componentData[r].grayTransferFunction=vc.ZP.newInstance(),t.componentData[r].grayTransferFunction.addPoint(0,0),t.componentData[r].grayTransferFunction.addPoint(1024,1),1!==t.componentData[r].colorChannels&&(t.componentData[r].colorChannels=1),e.modified()),t.componentData[r].grayTransferFunction},e.setRGBTransferFunction=function(r,n){var a=!1;return t.componentData[r].rGBTransferFunction!==n&&(t.componentData[r].rGBTransferFunction=n,a=!0),3!==t.componentData[r].colorChannels&&(t.componentData[r].colorChannels=3,a=!0),a&&e.modified(),a},e.getRGBTransferFunction=function(r){return null===t.componentData[r].rGBTransferFunction&&(t.componentData[r].rGBTransferFunction=te.ZP.newInstance(),t.componentData[r].rGBTransferFunction.addRGBPoint(0,0,0,0),t.componentData[r].rGBTransferFunction.addRGBPoint(1024,1,1,1),3!==t.componentData[r].colorChannels&&(t.componentData[r].colorChannels=3),e.modified()),t.componentData[r].rGBTransferFunction},e.setScalarOpacity=function(r,n){return t.componentData[r].scalarOpacity!==n&&(t.componentData[r].scalarOpacity=n,e.modified(),!0)},e.getScalarOpacity=function(r){return null===t.componentData[r].scalarOpacity&&(t.componentData[r].scalarOpacity=vc.ZP.newInstance(),t.componentData[r].scalarOpacity.addPoint(0,1),t.componentData[r].scalarOpacity.addPoint(1024,1),e.modified()),t.componentData[r].scalarOpacity},e.setComponentWeight=function(r,n){if(r<0||r>=of)return af("Invalid index"),!1;var a=Math.min(1,Math.max(0,n));return t.componentData[r].componentWeight!==a&&(t.componentData[r].componentWeight=a,e.modified(),!0)},e.getComponentWeight=function(e){return e<0||e>=of?(af("Invalid index"),0):t.componentData[e].componentWeight},e.setInterpolationTypeToNearest=function(){return e.setInterpolationType(rf.NEAREST)},e.setInterpolationTypeToLinear=function(){return e.setInterpolationType(rf.LINEAR)},e.setInterpolationTypeToFastLinear=function(){return e.setInterpolationType(rf.FAST_LINEAR)},e.getInterpolationTypeAsString=function(){return ht.default.enumToString(rf,t.interpolationType)},["useGradientOpacity","scalarOpacityUnitDistance","gradientOpacityMinimumValue","gradientOpacityMinimumOpacity","gradientOpacityMaximumValue","gradientOpacityMaximumOpacity","opacityMode"].forEach((function(r){var n=ht.default.capitalize(r);e["set".concat(n)]=function(n,a){return t.componentData[n]["".concat(r)]!==a&&(t.componentData[n]["".concat(r)]=a,e.modified(),!0)}})),["useGradientOpacity","scalarOpacityUnitDistance","gradientOpacityMinimumValue","gradientOpacityMinimumOpacity","gradientOpacityMaximumValue","gradientOpacityMaximumOpacity","opacityMode"].forEach((function(r){var n=ht.default.capitalize(r);e["get".concat(n)]=function(e){return t.componentData[e]["".concat(r)]}}))}(e,t)}var cf=function(e){for(var t=1;t2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,df,r),ef.ZP.extend(e,t,r),t.boundsMTime={},ht.default.obj(t.boundsMTime),ht.default.set(e,t,["property"]),ht.default.setGet(e,t,["mapper"]),ht.default.getArray(e,t,["bounds"],6),function(e,t){t.classHierarchy.push("vtkVolume"),e.getVolumes=function(){return e},e.makeProperty=cf.newInstance,e.getProperty=function(){return null===t.property&&(t.property=e.makeProperty()),t.property},e.getBounds=function(){if(null===t.mapper)return t.bounds;var r,n=t.mapper.getBounds();if(!n||6!==n.length)return n;if(n[0]>n[1])return t.mapperBounds=n.concat(),t.bounds=[1,-1,1,-1,1,-1],t.boundsMTime.modified(),n;if(!t.mapperBounds||!(r=[n,t.mapperBounds],r[0].map((function(e,t){return r.map((function(e){return e[t]}))}))).reduce((function(e,t){return e&&t[0]===t[1]}),!0)||e.getMTime()>t.boundsMTime.getMTime()){uf("Recomputing bounds..."),t.mapperBounds=n.map((function(e){return e}));var a=[];Jd.ZP.getCorners(n,a),e.computeMatrix();var o=new Float64Array(16);ot._E.transpose(o,t.matrix),a.forEach((function(e){return ot.R3.transformMat4(e,e,o)})),t.bounds[0]=t.bounds[2]=t.bounds[4]=Number.MAX_VALUE,t.bounds[1]=t.bounds[3]=t.bounds[5]=-Number.MAX_VALUE,t.bounds=t.bounds.map((function(e,t){return t%2==0?a.reduce((function(e,r){return e>r[t/2]?r[t/2]:e}),e):a.reduce((function(e,r){return ee?r:e}return e},e.getRedrawMTime=function(){var e=t.mtime;if(null!==t.mapper){var r=t.mapper.getMTime();e=r>e?r:e,null!==t.mapper.getInput()&&(t.mapper.getInputAlgorithm().update(),e=(r=t.mapper.getInput().getMTime())>e?r:e)}return e}}(e,t)}var pf={newInstance:ht.default.newInstance(ff,"vtkVolume"),extend:ff};function gf(e,t){const r=Ac.newInstance();Qe().rendering.preferSizeOverAccuracy&&r.setPreferSizeOverAccuracy(!0),r.setInputData(e);const n=e.getSpacing(),a=(n[0]+n[1]+n[2])/6;return r.setMaximumSamplesPerRay(4e3),r.setSampleDistance(a),r.setScalarTexture(t),r}const mf=0,hf=h.Prefetch;const vf=async function(e,t,r){let n=function(e){const{imageIds:t}=e,r=Math.floor(t.length/2),n=ut("voiLutModule",t[r]);if(n&&n.windowWidth&&n.windowCenter){const{windowWidth:e,windowCenter:t}=n,r={windowWidth:Array.isArray(e)?e[0]:e,windowCenter:Array.isArray(t)?t[0]:t},{lower:a,upper:o}=jd(Number(r.windowWidth),Number(r.windowCenter));return{lower:a,upper:o}}}(t);if(n||(n=await async function(e,t){const{imageIds:r}=e,n=e.getScalarData(),a=Math.floor(r.length/2),o=e.imageIds[a],i=ut("generalSeriesModule",o)||{},{modality:s}=i,l=ut("modalityLutModule",o)||{},c=r.length,u=n.byteLength/c,d=n.length/c,f=n.BYTES_PER_ELEMENT,p={rescaleSlope:l.rescaleSlope,rescaleIntercept:l.rescaleIntercept,modality:s};let g;if("PT"===s){const e=ut("scalingModule",o);e&&(g={...p,suvbw:e.suvbw})}const m=a*u,h={targetBuffer:{type:t?void 0:"Float32Array"},priority:mf,requestType:hf,preScale:{enabled:!0,scalingParameters:g}},v=await du(o,h);let y;y=v?v.getPixelData():function(e,t,r,n){const{scalarData:a}=e,{volumeBuffer:o}=a;a.BYTES_PER_ELEMENT!==r&&(t*=a.BYTES_PER_ELEMENT/r);const i=a.constructor,s=new i(n),l=new i(o,t,n);return s.set(l),s}(e,m,f,d);const{min:b,max:T}=ce(y);return{lower:b,upper:T}}(t,r)),!n||void 0===n.lower||void 0===n.upper)throw new Error("Could not get VOI from metadata, nor from the min max of the image middle slice");n=function(e,t){const r=e.imageIds,n=Math.floor(r.length/2),a=r[n];if(function(e,t){if("PT"!==e||!t.isPreScaled)return!1;if(!t.scaling?.PT.suvbw)return!1;return!0}((ut("generalSeriesModule",a)||{}).modality,e))return{lower:0,upper:5};return t}(t,n);const{lower:a,upper:o}=n;e.getProperty().getRGBTransferFunction(0).setMappingRange(a,o)};const yf=async function(e,t,r,n=!1,a=!1){const{volumeId:o,callback:i,blendMode:s}=e,l=await zc(o);if(!l)throw new Error(`imageVolume with id: ${l.volumeId} does not exist`);const{imageData:c,vtkOpenGLTexture:u}=l,d=gf(c,u);s&&d.setBlendMode(s);const f=pf.newInstance();return f.setMapper(d),3===c.getPointData().getScalars().getNumberOfComponents()&&f.getProperty().setIndependentComponents(!1),l.imageIds&&await vf(f,l,a),i&&i({volumeActor:f,volumeId:o}),n||function(e,t,r,n){const a=r.getProperty().getRGBTransferFunction(0).getRange(),o={viewportId:t,range:{lower:a[0],upper:a[1]},volumeId:n};se(e,g.VOI_MODIFIED,o)}(t,r,f,o),f};const bf=async function(e,t,r,n=!1,a=!1){r.forEach((t=>{const r=e.getViewport(t);if(!r)throw new Error(`Viewport with Id ${t} does not exist`);if(!(r instanceof Pf))throw new Error("setVolumesForViewports only supports VolumeViewport and VolumeViewport3D")}));const o=r.map((async r=>{const o=e.getViewport(r);await o.setVolumes(t,n,a)}));await Promise.all(o)};const Tf=async function(e,t,r,n=!1,a=!1){for(const t of r){const r=e.getViewport(t);if(!r)throw new Error(`Viewport with Id ${t} does not exist`);if(!(r instanceof Pf))return void console.warn(`Viewport with Id ${t} is not a BaseVolumeViewport. Cannot add volume to this viewport.`)}const o=r.map((async r=>{const o=e.getViewport(r);await o.addVolumes(t,n,a)}));await Promise.all(o)},Cf={};const xf=function(e){const{renderingEngineId:t,viewportId:r}=e.detail,n=Le(t).getViewport(r);if(!(n instanceof Pf))throw new Error("volumeNewImageEventDispatcher: viewport is not a BaseVolumeViewport");void 0===Cf[n.id]&&(Cf[n.id]=0);const a=md(n);if(!a)return void console.warn(`volumeNewImageEventDispatcher: sliceData is undefined for viewport ${n.id}`);const{numberOfSlices:o,imageIndex:i}=a;if(Cf[n.id]===i)return;Cf[n.id]=i;const s={imageIndex:i,viewportId:r,renderingEngineId:t,numberOfSlices:o};se(n.element,g.VOLUME_NEW_IMAGE,s)};const Sf=class{constructor(e){this.flipHorizontal=!1,this.flipVertical=!1,this.viewportStatus=G.NO_DATA,this._suppressCameraModifiedEvents=!1,this.hasPixelSpacing=!0,this.id=e.id,this.renderingEngineId=e.renderingEngineId,this.type=e.type,this.element=e.element,this.canvas=e.canvas,this.sx=e.sx,this.sy=e.sy,this.sWidth=e.sWidth,this.sHeight=e.sHeight,this._actors=new Map,this.element.setAttribute("data-viewport-uid",this.id),this.element.setAttribute("data-rendering-engine-uid",this.renderingEngineId),this.defaultOptions=ti()(e.defaultOptions),this.suppressEvents=!!e.defaultOptions.suppressEvents&&e.defaultOptions.suppressEvents,this.options=ti()(e.defaultOptions),this.isDisabled=!1}static get useCustomRenderingPipeline(){return!1}setRendered(){this.viewportStatus!==G.NO_DATA&&this.viewportStatus!==G.LOADING&&(this.viewportStatus=G.RENDERED)}getRenderingEngine(){return $.get(this.renderingEngineId)}getRenderer(){const e=this.getRenderingEngine();if(!e||e.hasBeenDestroyed)throw new Error("Rendering engine has been destroyed");return e.offscreenMultiRenderWindow.getRenderer(this.id)}render(){this.getRenderingEngine().renderViewport(this.id)}setOptions(e,t=!1){this.options=ti()(e),this.options?.displayArea&&this.setDisplayArea(this.options?.displayArea),t&&this.render()}reset(e=!1){this.options=ti()(this.defaultOptions),e&&this.render()}flip({flipHorizontal:e,flipVertical:t}){const r=this.getDefaultImageData();if(!r)return;const n=this.getCamera(),{viewPlaneNormal:a,viewUp:o,focalPoint:i,position:s}=n,l=ot.R3.cross(ot.R3.create(),a,o);let c=ot.R3.copy(ot.R3.create(),o);const u=ot.R3.negate(ot.R3.create(),a),d=ot.R3.distance(s,i),f=r.getDimensions().map((e=>Math.floor(e/2))),p=[f[0],f[1],f[2]],g=r.indexToWorld(p,ot.R3.create()),m=this._getFocalPointForResetCamera(g,n,{resetPan:!0,resetToCenter:!1}),h=ot.R3.subtract(ot.R3.create(),i,m),v=ot.R3.length(h),y=e=>{const t=ot.R3.scale(ot.R3.create(),e,2*ot.R3.dot(h,e));return ot.R3.subtract(t,t,h),ot.R3.normalize(t,t),t};if(e){const e=y(c),t=ot.R3.scaleAndAdd(ot.R3.create(),m,e,v),r=ot.R3.scaleAndAdd(ot.R3.create(),t,u,d);this.setCamera({viewPlaneNormal:u,position:r,focalPoint:t}),this.flipHorizontal=!this.flipHorizontal}if(t){c=ot.R3.negate(c,o);const e=y(l),t=ot.R3.scaleAndAdd(ot.R3.create(),m,e,v),r=ot.R3.scaleAndAdd(ot.R3.create(),t,u,d);this.setCamera({focalPoint:t,viewPlaneNormal:u,viewUp:c,position:r}),this.flipVertical=!this.flipVertical}this.render()}getDefaultImageData(){const e=this.getDefaultActor();if(e&&hd(e))return e.actor.getMapper().getInputData()}getDefaultActor(){return this.getActors()[0]}getActors(){return Array.from(this._actors.values())}getActor(e){return this._actors.get(e)}getActorUIDByIndex(e){const t=this.getActors()[e];if(t)return t.uid}getActorByIndex(e){return this.getActors()[e]}setActors(e){this.removeAllActors();this.addActors(e,!0)}_removeActor(e){const t=this.getActor(e);if(!t)return void console.warn(`Actor ${e} does not exist for this viewport`);this.getRenderer().removeViewProp(t.actor),this._actors.delete(e)}removeActors(e){e.forEach((e=>{this._removeActor(e)}))}addActors(e,t=!1){const r=this.getRenderingEngine();r&&!r.hasBeenDestroyed?(e.forEach((e=>this.addActor(e))),this.resetCamera(t,t)):console.warn("Viewport::addActors::Rendering engine has not been initialized or has been destroyed")}addActor(e){const{uid:t,actor:r}=e,n=this.getRenderingEngine();if(!n||n.hasBeenDestroyed)return void console.warn(`Cannot add actor UID of ${t} Rendering Engine has been destroyed`);if(!t||!r)throw new Error("Actors should have uid and vtk Actor properties");if(this.getActor(t))return void console.warn(`Actor ${t} already exists for this viewport`);this.getRenderer().addActor(r),this._actors.set(t,Object.assign({},e))}removeAllActors(){this.getRenderer().removeAllViewProps(),this._actors=new Map}resetCameraNoEvent(){this._suppressCameraModifiedEvents=!0,this.resetCamera(),this._suppressCameraModifiedEvents=!1}setCameraNoEvent(e){this._suppressCameraModifiedEvents=!0,this.setCamera(e),this._suppressCameraModifiedEvents=!1}_getViewImageDataIntersections(e,t,r){const n=r[0],a=r[1],o=r[2],i=n*t[0]+a*t[1]+o*t[2],s=e.getBounds(),l=this._getEdges(s),c=[];for(const e of l){const[[t,r,l],[u,d,f]]=e;if(n*(u-t)+a*(d-r)+o*(f-l)==0)continue;const p=Ud([t,r,l],[u,d,f],[n,a,o,i]);this._isInBounds(p,s)&&c.push(p)}return c}setDisplayArea(e,t=!1){const{storeAsInitialCamera:r}=e;this.setCamera(this.fitToCanvasCamera,!1);const{imageArea:n,imageCanvasPoint:a}=e;if(n){const[e,t]=n,a=Math.min(this.getZoom()/e,this.getZoom()/t);this.setZoom(a,r)}const o=this.getDefaultImageData();if(a&&o){const{imagePoint:e,canvasPoint:t}=a,[n,i]=t,s=window?.devicePixelRatio||1,l=this.sWidth/s*(n-.5),c=this.sHeight/s*(i-.5),u=o.getDimensions(),d=this.worldToCanvas([0,0,0]),f=this.worldToCanvas(u),p=[f[0]-d[0],f[1]-d[1]],[g,m]=p,[h,v]=e,y=[g*(.5-h)+l,m*(.5-v)+c];this.setPan(y,r)}if(r&&(this.options.displayArea=e),!t){const t={viewportId:this.id,displayArea:e,storeAsInitialCamera:r};se(this.element,g.DISPLAY_AREA_MODIFIED,t)}}getDisplayArea(){return this.options?.displayArea}resetCamera(e=!0,t=!0,r=!0,n=!0){const a=this.getRenderer();this.setCamera({flipHorizontal:!1,flipVertical:!1});const o=ti()(this.getCamera()),i=a.computeVisiblePropBounds(),s=[0,0,0],l=this.getDefaultImageData();if(l){const e=l.getSpacing();i[0]=i[0]+e[0]/2,i[1]=i[1]-e[0]/2,i[2]=i[2]+e[1]/2,i[3]=i[3]-e[1]/2,i[4]=i[4]+e[2]/2,i[5]=i[5]-e[2]/2}const c=this.getVtkActiveCamera(),u=c.getViewPlaneNormal(),d=c.getViewUp();if(s[0]=(i[0]+i[1])/2,s[1]=(i[2]+i[3])/2,s[2]=(i[4]+i[5])/2,l){const e=l.getDimensions().map((e=>Math.floor(e/2))),t=[e[0],e[1],e[2]];l.indexToWorld(t,s)}const{widthWorld:f,heightWorld:p}=this._getWorldDistanceViewUpAndViewRight(i,d,u),g=[this.sWidth,this.sHeight],m=f/p,h=g[0]/g[1];let v;if(m.999?[-d[2],d[0],d[1]]:d,P=this._getFocalPointForResetCamera(s,o,{resetPan:e,resetToCenter:r}),w=[P[0]+x*u[0],P[1]+x*u[1],P[2]+x*u[2]];a.resetCameraClippingRange(i);const O=[-j.MAXIMUM_RAY_DISTANCE,j.MAXIMUM_RAY_DISTANCE];c.setPhysicalScale(v),c.setPhysicalTranslation(-P[0],-P[1],-P[2]),this.setCamera({parallelScale:t?y:o.parallelScale,focalPoint:P,position:w,viewAngle:90,viewUp:S,clippingRange:O});const I=ti()(this.getCamera());this.setFitToCanvasCamera(ti()(this.getCamera())),n&&this.setInitialCamera(I);const A={type:"ResetCameraEvent",renderer:a};return a.invokeEvent(A),this.triggerCameraModifiedEventIfNecessary(o,I),l&&this.options?.displayArea&&t&&e&&r&&this.setDisplayArea(this.options?.displayArea),!0}setInitialCamera(e){this.initialCamera=e}setFitToCanvasCamera(e){this.fitToCanvasCamera=e}getPan(){const e=this.getVtkActiveCamera().getFocalPoint(),t=this.canvasToWorld([0,0]),r=this.worldToCanvas(ot.R3.subtract(ot.R3.create(),this.initialCamera.focalPoint,t)),n=this.worldToCanvas(ot.R3.subtract(ot.R3.create(),e,t));return ot.K4.subtract(ot.K4.create(),r,n)}setPan(e,t=!1){const r=this.getCamera(),{focalPoint:n,position:a}=r,o=this.canvasToWorld([0,0]),i=ot.K4.subtract(ot.K4.create(),e,this.getPan());if(Math.abs(i[0])<1&&Math.abs(i[1])<1&&!t)return;const s=ot.R3.subtract(ot.R3.create(),this.canvasToWorld(i),o),l=ot.R3.subtract(ot.R3.create(),n,s),c=ot.R3.subtract(ot.R3.create(),a,s);this.setCamera({...r,focalPoint:l,position:c},t)}getZoom(){const e=this.getVtkActiveCamera(),{parallelScale:t}=this.initialCamera;return t/e.getParallelScale()}setZoom(e,t=!1){const r=this.getCamera(),{parallelScale:n}=this.initialCamera,a=n/e;(r.parallelScale!==a||t)&&this.setCamera({...r,parallelScale:a},t)}_getFocalPointForViewPlaneReset(e){const{focalPoint:t,viewPlaneNormal:r}=this.getCamera(),n=this._getViewImageDataIntersections(e,t,r);let a=0,o=0,i=0;n.forEach((([e,t,r])=>{a+=e,o+=t,i+=r}));return[a/n.length,o/n.length,i/n.length]}getCanvas(){return this.canvas}getVtkActiveCamera(){return this.getRenderer().getActiveCamera()}getCamera(){const e=this.getVtkActiveCamera();return{viewUp:e.getViewUp(),viewPlaneNormal:e.getViewPlaneNormal(),position:e.getPosition(),focalPoint:e.getFocalPoint(),parallelProjection:e.getParallelProjection(),parallelScale:e.getParallelScale(),viewAngle:e.getViewAngle(),flipHorizontal:this.flipHorizontal,flipVertical:this.flipVertical}}setCamera(e,t=!1){const r=this.getVtkActiveCamera(),n=ti()(this.getCamera()),a=Object.assign({},n,e),{viewUp:o,viewPlaneNormal:i,position:s,focalPoint:l,parallelScale:c,viewAngle:u,flipHorizontal:d,flipVertical:f,clippingRange:p}=e;if(void 0!==d){const e=d&&!this.flipHorizontal||!d&&this.flipHorizontal;e&&this.flip({flipHorizontal:e})}if(void 0!==f){const e=f&&!this.flipVertical||!f&&this.flipVertical;e&&this.flip({flipVertical:e})}void 0!==o&&r.setViewUp(o),void 0!==i&&r.setDirectionOfProjection(-i[0],-i[1],-i[2]),void 0!==s&&r.setPosition(...s),void 0!==l&&r.setFocalPoint(...l),void 0!==c&&r.setParallelScale(c),void 0!==u&&r.setViewAngle(u),void 0!==p&&r.setClippingRange(p);const g=this.getDefaultActor();if(!g||!g.actor)return;if(vd(g,"vtkImageSlice")){this.getRenderer().resetCameraClippingRange()}else this.updateClippingPlanesForActors(a);t&&this.setInitialCamera(a),this.triggerCameraModifiedEventIfNecessary(n,this.getCamera())}triggerCameraModifiedEventIfNecessary(e,t){if(!this._suppressCameraModifiedEvents&&!this.suppressEvents){const r={previousCamera:e,camera:t,element:this.element,viewportId:this.id,renderingEngineId:this.renderingEngineId,rotation:this.getRotation()};se(this.element,g.CAMERA_MODIFIED,r)}}updateClippingPlanesForActors(e){this.getActors().forEach((t=>{if(!t.actor)return;const r=t.actor.getMapper().getClippingPlanes();let n=j.MINIMUM_SLAB_THICKNESS;t.slabThickness&&(n=t.slabThickness);const{viewPlaneNormal:a,focalPoint:o}=e;this.setOrientationOfClippingPlanes(r,n,a,o)}))}setOrientationOfClippingPlanes(e,t,r,n){if(e.length<2)return;const a=[r[0],r[1],r[2]];Vc.ZP.multiplyScalar(a,t),e[0].setNormal(r);const o=[0,0,0];Vc.ZP.subtract(n,a,o),e[0].setOrigin(o),e[1].setNormal(-r[0],-r[1],-r[2]);const i=[0,0,0];Vc.ZP.add(n,a,i),e[1].setOrigin(i)}_getWorldDistanceViewUpAndViewRight(e,t,r){const n=this._getCorners(e),a=this._getCorners(e),o=ot.R3.cross(ot.R3.create(),t,r);let i=id.Z.buildFromDegree().identity().rotateFromDirections(t,[1,0,0]);n.forEach((e=>i.apply(e)));let s=1/0,l=-1/0;for(let e=0;e<8;e++){const t=n[e][0];t>l&&(l=t),ti.apply(e)));let c=1/0,u=-1/0;for(let e=0;e<8;e++){const t=a[e][0];t>u&&(u=t),tn||co||us)}_getEdges(e){const[t,r,n,a,o,i,s,l]=this._getCorners(e);return[[t,r],[t,o],[t,n],[r,a],[r,i],[n,a],[n,s],[a,l],[o,s],[o,i],[i,l],[s,l]]}};const Pf=class extends Sf{constructor(e){if(super(e),this.useCPURendering=!1,this.use16BitTexture=!1,this.inverted=!1,this.getProperties=()=>{const e=this.getActors().map((e=>{const t=e.actor,r=e.uid;if(!qd.getVolume(r))return null;const n=t.getProperty().getRGBTransferFunction(0),[a,o]="SIGMOID"===this.VOILUTFunction?ae(n):n.getRange();return{volumeId:r,voiRange:{lower:a,upper:o}}})).filter(Boolean);return{voiRange:e.length?e[0].voiRange:null,VOILUTFunction:this.VOILUTFunction,invert:this.inverted}},this.getFrameOfReferenceUID=()=>this._FrameOfReferenceUID,this.canvasToWorld=e=>{const t=this.getVtkActiveCamera();t.setIsPerformingCoordinateTransformation?.(!0);const r=this.getRenderer(),n=this.getRenderingEngine().offscreenMultiRenderWindow.getOpenGLRenderWindow(),a=n.getSize(),o=window.devicePixelRatio||1,i=[e[0]*o,e[1]*o],s=[i[0]+this.sx,i[1]+this.sy];s[1]=a[1]-s[1];const l=n.displayToWorld(s[0],s[1],0,r);return t.setIsPerformingCoordinateTransformation?.(!1),[l[0],l[1],l[2]]},this.worldToCanvas=e=>{const t=this.getVtkActiveCamera();t.setIsPerformingCoordinateTransformation?.(!0);const r=this.getRenderer(),n=this.getRenderingEngine().offscreenMultiRenderWindow.getOpenGLRenderWindow(),a=n.getSize(),o=n.worldToDisplay(...e,r);o[1]=a[1]-o[1];const i=[o[0]-this.sx,o[1]-this.sy],s=window.devicePixelRatio||1,l=[i[0]/s,i[1]/s];return t.setIsPerformingCoordinateTransformation?.(!1),l},this.hasImageURI=e=>this.getActors().filter((e=>vd(e,"vtkVolume"))).some((({uid:t})=>{const r=qd.getVolume(t);if(!r||!r.imageIds)return!1;return r.imageIds.map(me).includes(e)})),this.getImageIds=e=>{const t=this._getApplicableVolumeActor(e);if(!t)throw new Error(`No actor found for the given volumeId: ${e}`);const r=t.volumeId,n=qd.getVolume(r);if(!n)throw new Error(`imageVolume with id: ${r} does not exist in cache`);return n.imageIds},this.useCPURendering=Ze(),this.use16BitTexture=this._shouldUseNativeDataType(),this.useCPURendering)throw new Error("VolumeViewports cannot be used whilst CPU Fallback Rendering is enabled.");const t=this.getRenderer(),r=Nc.newInstance();switch(t.setActiveCamera(r),this.type){case y.ORTHOGRAPHIC:case y.VOLUME_3D:r.setParallelProjection(!0);break;case y.PERSPECTIVE:r.setParallelProjection(!1);break;default:throw new Error(`Unrecognized viewport type: ${this.type}`)}this.initializeVolumeNewImageEventDispatcher()}static get useCustomRenderingPipeline(){return!1}applyViewOrientation(e){const{viewPlaneNormal:t,viewUp:r}=this._getOrientationVectors(e),n=this.getVtkActiveCamera();n.setDirectionOfProjection(-t[0],-t[1],-t[2]),n.setViewUpFrom(r),this.resetCamera()}initializeVolumeNewImageEventDispatcher(){const e=function(e){const{viewportId:t}=e.detail;if(t!==this.id||this.isDisabled)return;if(!this.getImageData())return;xf(e)}.bind(this),t=function(r){const{viewportId:n}=r.detail;if(n!==this.id)return;this.element.removeEventListener(g.CAMERA_MODIFIED,e),J.removeEventListener(g.ELEMENT_DISABLED,t),function(e){void 0!==Cf[e]&&delete Cf[e]}(n)}.bind(this);this.element.removeEventListener(g.CAMERA_MODIFIED,e),this.element.addEventListener(g.CAMERA_MODIFIED,e),J.addEventListener(g.ELEMENT_DISABLED,t)}resetVolumeViewportClippingRange(){const e=this.getVtkActiveCamera();e.getParallelProjection()?e.setClippingRange(-j.MAXIMUM_RAY_DISTANCE,j.MAXIMUM_RAY_DISTANCE):e.setClippingRange(j.MINIMUM_SLAB_THICKNESS,j.MAXIMUM_RAY_DISTANCE)}setVOILUTFunction(e,t,r){-1===Object.values(_).indexOf(e)&&(e=_.LINEAR);const{voiRange:n}=this.getProperties();this.VOILUTFunction=e,this.setVOI(n,t,r)}setColormap(e,t,r){const n=this._getApplicableVolumeActor(t);if(!n)return;const{volumeActor:a}=n;a.getMapper().setSampleDistance(1);const o=te.ZP.newInstance();let i=Zd(e.name);const{name:s}=e;if(i||(i=Qd.getPresetByName(s)),!i)throw new Error(`Colormap ${e} not found`);const l=a.getProperty().getRGBTransferFunction(0).getRange();o.applyColorMap(i),o.setMappingRange(l[0],l[1]),a.getProperty().setRGBTransferFunction(0,o)}setOpacity(e,t){const r=this._getApplicableVolumeActor(t);if(!r)return;const{volumeActor:n}=r,a=vc.ZP.newInstance();if("number"==typeof e.opacity){const t=n.getProperty().getRGBTransferFunction(0).getRange();a.addPoint(t[0],e.opacity),a.addPoint(t[1],e.opacity)}else e.opacity.forEach((({opacity:e,value:t})=>{a.addPoint(t,e)}));n.getProperty().setScalarOpacity(0,a)}setInvert(e,t,r){const n=this._getApplicableVolumeActor(t);if(!n)return;const a=n.volumeId;ee(this._getOrCreateColorTransferFunction(a)),this.inverted=e;const{voiRange:o}=this.getProperties();if(!r){const e={viewportId:this.id,range:o,volumeId:a,VOILUTFunction:this.VOILUTFunction,invert:this.inverted,invertStateChanged:!0};se(this.element,g.VOI_MODIFIED,e)}}_getOrCreateColorTransferFunction(e){const t=this._getApplicableVolumeActor(e);if(!t)return null;const{volumeActor:r}=t,n=r.getProperty().getRGBTransferFunction(0);if(n)return n;const a=te.ZP.newInstance();return r.getProperty().setRGBTransferFunction(0,a),a}setInterpolationType(e,t){const r=this._getApplicableVolumeActor(t);if(!r)return;const{volumeActor:n}=r;n.getProperty().setInterpolationType(e)}setVOI(e,t,r=!1){const n=this._getApplicableVolumeActor(t);if(!n)return;const{volumeActor:a}=n,o=n.volumeId;let i=e;if(void 0===i){const e=a.getMapper().getInputData().getPointData().getScalars().getRange();i={lower:e[0],upper:e[1]}}if(this.VOILUTFunction===_.SAMPLED_SIGMOID){const e=ne(i);a.getProperty().setRGBTransferFunction(0,e)}else{const{lower:e,upper:t}=i;a.getProperty().getRGBTransferFunction(0).setRange(e,t)}if(!r){const t={viewportId:this.id,range:e,volumeId:o,VOILUTFunction:this.VOILUTFunction};se(this.element,g.VOI_MODIFIED,t)}}setProperties({voiRange:e,VOILUTFunction:t,invert:r,colormap:n,preset:a,interpolationType:o}={},i,s=!1){n?.name&&this.setColormap(n,i,s),null!=n?.opacity&&this.setOpacity(n,i),void 0!==e&&this.setVOI(e,i,s),void 0!==o&&this.setInterpolationType(o),void 0!==t&&this.setVOILUTFunction(t,i,s),void 0!==r&&this.inverted!==r&&this.setInvert(r,i,s),void 0!==a&&this.setPreset(a,i,s)}setPreset(e,t,r){const n=this._getApplicableVolumeActor(t);if(!n)return;const{volumeActor:a}=n,o=X.find((t=>t.name===e));o&&Id(a,o)}async setVolumes(e,t=!1,r=!1){const n=qd.getVolume(e[0].volumeId);if(!n)throw new Error(`imageVolume with id: ${n.volumeId} does not exist`);const a=n.metadata.FrameOfReferenceUID;await this._isValidVolumeInputArray(e,a),this._FrameOfReferenceUID=a;const o=[];for(let t=0;tt.uid===e))}getImageData(e){const t=this.getDefaultActor();if(!t)return;const{uid:r}=t;e=e??r;const n=this.getActor(e);if(!vd(n,"vtkVolume"))return;const a=n.actor,o=qd.getVolume(e),i=a.getMapper().getInputData();return{dimensions:i.getDimensions(),spacing:i.getSpacing(),origin:i.getOrigin(),direction:i.getDirection(),scalarData:i.getPointData().getScalars().isDeleted()?null:i.getPointData().getScalars().getData(),imageData:a.getMapper().getInputData(),metadata:{Modality:o?.metadata?.Modality},scaling:o?.scaling,hasPixelSpacing:!0}}_setVolumeActors(e){this.inverted=!1,this.setActors(e)}_getOrientationVectors(e){if("object"==typeof e){if(e.viewPlaneNormal&&e.viewUp)return e;throw new Error("Invalid orientation object. It must contain viewPlaneNormal and viewUp")}if("string"==typeof e&&Z[e])return Z[e];throw new Error(`Invalid orientation: ${e}. Valid orientations are: ${Object.keys(Z).join(", ")}`)}getSlabThickness(){const e=this.getActors();let t=j.MINIMUM_SLAB_THICKNESS;return e.forEach((e=>{e.slabThickness>t&&(t=e.slabThickness)})),t}getIntensityFromWorld(e){const t=this.getDefaultActor();if(!vd(t,"vtkVolume"))return;const{actor:r,uid:n}=t,a=r.getMapper().getInputData(),o=qd.getVolume(n),{dimensions:i}=o,s=nu(a,e),l=s[2]*i[0]*i[1]+s[1]*i[0]+s[0];return o.getScalarData()[l]}};const wf=class extends Pf{constructor(e){super(e),this._useAcquisitionPlaneForViewPlane=!1,this.getCurrentImageIdIndex=()=>{const{viewPlaneNormal:e,focalPoint:t}=this.getCamera(),{origin:r,spacing:n}=this.getImageData(),a=n[2],o=ot.R3.create();ot.R3.sub(o,t,r);const i=ot.R3.dot(o,e);return Math.round(Math.abs(i)/a)},this.getCurrentImageId=()=>{this.getActors().length>1&&console.warn(`Using the first/default actor of ${this.getActors().length} actors for getCurrentImageId.`);const e=this.getDefaultActor();if(!e||!vd(e,"vtkVolume"))return;const{uid:t}=e,r=qd.getVolume(t);if(!r)return;const{viewPlaneNormal:n,focalPoint:a}=this.getCamera();return ft(r,a,n)},this.getRotation=()=>0;const{orientation:t}=this.options;t&&t!==I.ACQUISITION?this.applyViewOrientation(t):this._useAcquisitionPlaneForViewPlane=!0}async setVolumes(e,t=!1,r=!1){const n=qd.getVolume(e[0].volumeId);if(!n)throw new Error(`imageVolume with id: ${n.volumeId} does not exist`);return this._useAcquisitionPlaneForViewPlane&&(this._setViewPlaneToAcquisitionPlane(n),this._useAcquisitionPlaneForViewPlane=!1),super.setVolumes(e,t,r)}async addVolumes(e,t=!1,r=!1){const n=qd.getVolume(e[0].volumeId);if(!n)throw new Error(`imageVolume with id: ${n.volumeId} does not exist`);return this._useAcquisitionPlaneForViewPlane&&(this._setViewPlaneToAcquisitionPlane(n),this._useAcquisitionPlaneForViewPlane=!1),super.addVolumes(e,t,r)}setOrientation(e,t=!0){let r,n;if(Z[e])({viewPlaneNormal:r,viewUp:n}=Z[e]);else{if("acquisition"!==e)throw new Error(`Invalid orientation: ${e}. Use Enums.OrientationAxis instead.`);({viewPlaneNormal:r,viewUp:n}=this._getAcquisitionPlaneOrientation())}this.setCamera({viewPlaneNormal:r,viewUp:n}),this.resetCamera(),t&&this.render()}_getAcquisitionPlaneOrientation(){const e=this.getDefaultActor();if(!e)return;const t=e.uid,r=qd.getVolume(t);if(!r)throw new Error(`imageVolume with id: ${t} does not exist in cache`);const{direction:n}=r;return{viewPlaneNormal:n.slice(6,9).map((e=>-e)),viewUp:n.slice(3,6).map((e=>-e))}}_setViewPlaneToAcquisitionPlane(e){let t,r;if(e){const{direction:n}=e;t=n.slice(6,9).map((e=>-e)),r=n.slice(3,6).map((e=>-e))}else({viewPlaneNormal:t,viewUp:r}=this._getAcquisitionPlaneOrientation());this.setCamera({viewPlaneNormal:t,viewUp:r}),this.resetCamera()}setBlendMode(e,t=[],r=!1){let n=this.getActors();t&&t.length>0&&(n=n.filter((e=>t.includes(e.uid)))),n.forEach((t=>{const{actor:r}=t;r.getMapper().setBlendMode(e)})),r&&this.render()}resetCamera(e=!0,t=!0,r=!0){super.resetCamera(e,t,r),this.resetVolumeViewportClippingRange();const n=this.getVtkActiveCamera(),a=n.getViewPlaneNormal(),o=n.getFocalPoint();return this.getActors().forEach((e=>{if(!e.actor)return;const t=e.actor.getMapper();if(0===t.getClippingPlanes().length){const r=$r.ZP.newInstance(),n=$r.ZP.newInstance(),i=[r,n];let s=j.MINIMUM_SLAB_THICKNESS;e.slabThickness&&(s=e.slabThickness),this.setOrientationOfClippingPlanes(i,s,a,o),t.addClippingPlane(r),t.addClippingPlane(n)}})),!0}setSlabThickness(e,t=[]){let r=this.getActors();t&&t.length>0&&(r=r.filter((e=>t.includes(e.uid)))),r.forEach((t=>{vd(t,"vtkVolume")&&(t.slabThickness=e)}));const n=this.getCamera();this.updateClippingPlanesForActors(n),this.triggerCameraModifiedEventIfNecessary(n,n)}resetProperties(e){this._resetProperties(e)}_resetProperties(e){const t=e?this.getActor(e):this.getDefaultActor();if(!t)throw new Error(`No actor found for the given volumeId: ${e}`);const r=qd.getVolume(t.uid);if(!r)throw new Error(`imageVolume with id: ${t.uid} does not exist in cache`);vf(t.actor,r,!1);const n=t.actor.getProperty().getRGBTransferFunction(0).getMappingRange(),a={viewportId:t.uid,range:{lower:n[0],upper:n[1]},volumeId:t.uid};se(this.element,g.VOI_MODIFIED,a)}};var Of=r(21924);var If={slice:0,customDisplayExtent:[0,0,0,0,0,0],useCustomExtents:!1,backgroundColor:[0,0,0,1]};var Af={extend:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,If,r),Of.Z.extend(e,t,r),ht.default.setGet(e,t,["slice","useCustomExtents"]),ht.default.setGetArray(e,t,["customDisplayExtent"],6),ht.default.setGetArray(e,t,["backgroundColor"],4),function(e,t){t.classHierarchy.push("vtkAbstractImageMapper"),e.getIsOpaque=function(){return!0},e.getCurrentImage=function(){return null}}(e,t)}};function Rf(e,t,r){var n=r.getCurrentImage(),a=n.getExtent(),o=[a[0],a[2],a[4]],i=r.getClosestIJKAxis().ijkMode,s=r.isA("vtkImageArrayMapper")?r.getSubSlice():r.getSlice();i!==r.getSlicingMode()&&(s=r.getSliceAtPosition(s)),o[i]+=s;var l=[0,0,0];n.indexToWorld(o,l),o[i]+=1;var c=[0,0,0];n.indexToWorld(o,c),c[0]-=l[0],c[1]-=l[1],c[2]-=l[2],ot.R3.normalize(c,c);var u=$r.ZP.intersectWithLine(e,t,l,c);if(u.intersection){var d=u.x,f=[0,0,0];return n.worldToIndex(d,f),{t:u.t,absoluteIJK:f}}return null}var Ef=r(84418);function Mf(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function Df(e){for(var t=1;to&&(o=c,s=n[l]<0,i=l)}if(1!==o){var u="IJKXYZ"[t.slicingMode],d="IJKXYZ"[i];_f("Unaccurate slicing along ".concat(u," axis which ")+"is not aligned with any IJK axis of the image data. "+"Using ".concat(d," axis as a fallback (").concat(o,"% aligned). ")+"Necessitates slice reformat that is not yet implemented. You can switch the slicing mode on your mapper to do IJK slicing instead.")}t.closestIJKAxis={ijkMode:i,flip:s}}t.classHierarchy.push("vtkImageMapper"),e.getSliceAtPosition=function(r){var n,a=e.getCurrentImage();if(3===r.length)n=r;else if(Number.isFinite(r)){var o=a.getBounds();switch(t.slicingMode){case Nf.X:n=[r,(o[3]+o[2])/2,(o[5]+o[4])/2];break;case Nf.Y:n=[(o[1]+o[0])/2,r,(o[5]+o[4])/2];break;case Nf.Z:n=[(o[1]+o[0])/2,(o[3]+o[2])/2,r]}}var i=[0,0,0];a.worldToIndex(n,i);var s=a.getExtent(),l=0;switch(e.getClosestIJKAxis().ijkMode){case Nf.I:l=(0,Mr.C)(i[0],s[0],s[1]);break;case Nf.J:l=(0,Mr.C)(i[1],s[2],s[3]);break;case Nf.K:l=(0,Mr.C)(i[2],s[4],s[5]);break;default:return 0}return l},e.setSliceFromCamera=function(r){var n=r.getFocalPoint();switch(t.slicingMode){case Nf.I:case Nf.J:case Nf.K:var a=e.getSliceAtPosition(n);e.setSlice(a);break;case Nf.X:e.setSlice(n[0]);break;case Nf.Y:e.setSlice(n[1]);break;case Nf.Z:e.setSlice(n[2])}},e.setXSlice=function(t){e.setSlicingMode(Nf.X),e.setSlice(t)},e.setYSlice=function(t){e.setSlicingMode(Nf.Y),e.setSlice(t)},e.setZSlice=function(t){e.setSlicingMode(Nf.Z),e.setSlice(t)},e.setISlice=function(t){e.setSlicingMode(Nf.I),e.setSlice(t)},e.setJSlice=function(t){e.setSlicingMode(Nf.J),e.setSlice(t)},e.setKSlice=function(t){e.setSlicingMode(Nf.K),e.setSlice(t)},e.getSlicingModeNormal=function(){var r=[0,0,0],n=e.getCurrentImage().getDirection(),a=[[n[0],n[1],n[2]],[n[3],n[4],n[5]],[n[6],n[7],n[8]]];switch(t.slicingMode){case Nf.X:r[0]=1;break;case Nf.Y:r[1]=1;break;case Nf.Z:r[2]=1;break;case Nf.I:(0,Mr.O)(a,[1,0,0],r);break;case Nf.J:(0,Mr.O)(a,[0,1,0],r);break;case Nf.K:(0,Mr.O)(a,[0,0,1],r)}return r},e.setSlicingMode=function(n){t.slicingMode!==n&&(t.slicingMode=n,e.getCurrentImage()&&r(),e.modified())},e.getClosestIJKAxis=function(){return void 0!==t.closestIJKAxis&&t.closestIJKAxis.ijkMode!==Nf.NONE||!e.getCurrentImage()||r(),t.closestIJKAxis},e.getBounds=function(){var r=e.getCurrentImage();if(!r)return(0,Mr.N)();if(!t.useCustomExtents)return r.getBounds();var n=t.customDisplayExtent.slice(),a=e.getClosestIJKAxis().ijkMode,o=t.slice;switch(a!==t.slicingMode&&(o=e.getSliceAtPosition(t.slice)),a){case Nf.I:n[0]=o,n[1]=o;break;case Nf.J:n[2]=o,n[3]=o;break;case Nf.K:n[4]=o,n[5]=o}return r.extentToBounds(n)},e.getBoundsForSlice=function(){var r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:t.slice,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,a=e.getCurrentImage();if(!a)return(0,Mr.N)();var o=a.getSpatialExtent(),i=e.getClosestIJKAxis().ijkMode,s=r;switch(i!==t.slicingMode&&(s=e.getSliceAtPosition(r)),i){case Nf.I:o[0]=s-n,o[1]=s+n;break;case Nf.J:o[2]=s-n,o[3]=s+n;break;case Nf.K:o[4]=s-n,o[5]=s+n}return a.extentToBounds(o)},e.intersectWithLineForPointPicking=function(t,r){return function(e,t,r){var n=Rf(e,t,r);if(n){var a=r.getCurrentImage().getExtent(),o=[Math.round(n.absoluteIJK[0]),Math.round(n.absoluteIJK[1]),Math.round(n.absoluteIJK[2])];return o[0]a[1]||o[1]a[3]||o[2]a[5]?null:{t:n.t,ijk:o}}return null}(t,r,e)},e.intersectWithLineForCellPicking=function(t,r){return function(e,t,r){var n=Rf(e,t,r);if(n){var a=r.getCurrentImage().getExtent(),o=n.absoluteIJK,i=[Math.floor(o[0]),Math.floor(o[1]),Math.floor(o[2])];if(i[0]a[1]-1||i[1]a[3]-1||i[2](a[5]?a[5]-1:a[5]))return null;var s=[o[0]-i[0],o[1]-i[1],o[2]-i[2]];return{t:n.t,ijk:i,pCoords:s}}return null}(t,r,e)},e.getCurrentImage=function(){return e.getInputData()}}var Ff={slicingMode:Nf.NONE,closestIJKAxis:{ijkMode:Nf.NONE,flip:!1},renderToRectangle:!1,sliceAtFocalPoint:!1,preferSizeOverAccuracy:!1};function Uf(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,Ff,r),Af.extend(e,t,r),ht.default.get(e,t,["slicingMode"]),ht.default.setGet(e,t,["closestIJKAxis","renderToRectangle","sliceAtFocalPoint","preferSizeOverAccuracy"]),Ef.Z.implementCoincidentTopologyMethods(e,t),Bf(e,t)}var kf=Df(Df(Df({newInstance:ht.default.newInstance(Uf,"vtkImageMapper"),extend:Uf},Vf),Lf),fn),Gf=rn.InterpolationType,Wf=ht.default.vtkErrorMacro,zf=4;var jf={independentComponents:!1,interpolationType:Gf.LINEAR,colorWindow:255,colorLevel:127.5,ambient:1,diffuse:0,opacity:1,useLookupTableScalarRange:!1};function Hf(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(Object.assign(t,jf,r),ht.default.obj(e,t),!t.componentData){t.componentData=[];for(var n=0;n(e=t.componentData[n].rGBTransferFunction.getMTime())?r:e),t.componentData[n].piecewiseFunction&&(r=r>(e=t.componentData[n].piecewiseFunction.getMTime())?r:e);return r},e.setRGBTransferFunction=function(r,n){var a=r,o=n;return Number.isInteger(r)||(o=r,a=0),t.componentData[a].rGBTransferFunction!==o&&(t.componentData[a].rGBTransferFunction=o,e.modified(),!0)},e.getRGBTransferFunction=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;return t.componentData[e].rGBTransferFunction},e.setPiecewiseFunction=function(r,n){var a=r,o=n;return Number.isInteger(r)||(o=r,a=0),t.componentData[a].piecewiseFunction!==o&&(t.componentData[a].piecewiseFunction=o,e.modified(),!0)},e.getPiecewiseFunction=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;return t.componentData[e].piecewiseFunction},e.setScalarOpacity=function(t,r){var n=t,a=r;return Number.isInteger(t)||(a=t,n=0),e.setPiecewiseFunction(n,a)},e.getScalarOpacity=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;return e.getPiecewiseFunction(t)},e.setComponentWeight=function(r,n){if(r<0||r>=zf)return Wf("Invalid index"),!1;var a=Math.min(1,Math.max(0,n));return t.componentData[r].componentWeight!==a&&(t.componentData[r].componentWeight=a,e.modified(),!0)},e.getComponentWeight=function(e){return e<0||e>=zf?(Wf("Invalid index"),0):t.componentData[e].componentWeight},e.setInterpolationTypeToNearest=function(){return e.setInterpolationType(Gf.NEAREST)},e.setInterpolationTypeToLinear=function(){return e.setInterpolationType(Gf.LINEAR)},e.getInterpolationTypeAsString=function(){return ht.default.enumToString(Gf,t.interpolationType)}}(e,t)}var Kf={newInstance:ht.default.newInstance(Hf,"vtkImageProperty"),extend:Hf},Zf=ht.default.vtkDebugMacro;var Xf={mapper:null,property:null,bounds:[1,-1,1,-1,1,-1]};function qf(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,Xf,r),ef.ZP.extend(e,t,r),t.boundsMTime={},ht.default.obj(t.boundsMTime),ht.default.set(e,t,["property"]),ht.default.setGet(e,t,["mapper"]),ht.default.getArray(e,t,["bounds"],6),function(e,t){t.classHierarchy.push("vtkImageSlice"),e.getActors=function(){return e},e.getImages=function(){return e},e.getIsOpaque=function(){if(t.forceOpaque)return!0;if(t.forceTranslucent)return!1;t.property||e.getProperty();var r=t.property.getOpacity()>=1;return r&&(!t.mapper||t.mapper.getIsOpaque())},e.hasTranslucentPolygonalGeometry=function(){return!1},e.makeProperty=Kf.newInstance,e.getProperty=function(){return null===t.property&&(t.property=e.makeProperty()),t.property},e.getBounds=function(){if(null===t.mapper)return t.bounds;var r,n=t.mapper.getBounds();if(!n||6!==n.length)return n;if(n[0]>n[1])return t.mapperBounds=n.concat(),t.bounds=[1,-1,1,-1,1,-1],t.boundsMTime.modified(),n;if(!t.mapperBounds||!(r=[n,t.mapperBounds],r[0].map((function(e,t){return r.map((function(e){return e[t]}))}))).reduce((function(e,t){return e&&t[0]===t[1]}),!0)||e.getMTime()>t.boundsMTime.getMTime()){Zf("Recomputing bounds..."),t.mapperBounds=n.map((function(e){return e}));var a=[];Jd.ZP.getCorners(n,a),e.computeMatrix();var o=new Float64Array(16);ot._E.transpose(o,t.matrix),a.forEach((function(e){return ot.R3.transformMat4(e,e,o)})),t.bounds[0]=t.bounds[2]=t.bounds[4]=Number.MAX_VALUE,t.bounds[1]=t.bounds[3]=t.bounds[5]=-Number.MAX_VALUE,t.bounds=t.bounds.map((function(e,t){return t%2==0?a.reduce((function(e,r){return e>r[t/2]?r[t/2]:e}),e):a.reduce((function(e,r){return e1&&void 0!==arguments[1]?arguments[1]:0,a=t.mapper.getBoundsForSlice(r,n);if(!a||6!==a.length)return a;if(a[0]>a[1])return a;var o=[];Jd.ZP.getCorners(a,o),e.computeMatrix();var i=new Float64Array(16);ot._E.transpose(i,t.matrix),o.forEach((function(e){return ot.R3.transformMat4(e,e,i)}));var s=[Number.MAX_VALUE,-Number.MAX_VALUE,Number.MAX_VALUE,-Number.MAX_VALUE,Number.MAX_VALUE,-Number.MAX_VALUE];return s=s.map((function(e,t){return t%2==0?o.reduce((function(e,r){return e>r[t/2]?r[t/2]:e}),e):o.reduce((function(e,r){return ee?r:e}return e},e.getRedrawMTime=function(){var e=t.mtime;if(null!==t.mapper){var r=t.mapper.getMTime();e=r>e?r:e,null!==t.mapper.getInput()&&(t.mapper.getInputAlgorithm().update(),e=(r=t.mapper.getInput().getMTime())>e?r:e)}if(null!==t.property){var n=t.property.getMTime();e=n>e?n:e,null!==t.property.getRGBTransferFunction()&&(e=(n=t.property.getRGBTransferFunction().getMTime())>e?n:e)}return e},e.getSupportsSelection=function(){return!!t.mapper&&t.mapper.getSupportsSelection()}}(e,t)}var Yf={newInstance:ht.default.newInstance(qf,"vtkImageSlice"),extend:qf};function $f(e){return Eu(e)}function Qf(e,t){const r=$f(e);return r.invert(),r.transformPoint(t)}function Jf(e,t){return $f(e).transformPoint(t)}function ep(e,t=!1){const r=e.canvas.width,n=e.canvas.height;!function(e){const{canvas:t}=e,{clientWidth:r,clientHeight:n}=t;t.width===r&&t.height===n||(t.width=r,t.height=n)}(e),void 0!==e.image&&(t||function(e,t,r){const n=e.viewport.scale,a=Ou(e.image,e.viewport.rotation),o=Math.round(a.width*n),i=Math.round(a.height*n),s=e.viewport.translation.x,l=e.viewport.translation.y;return o===t&&i<=r||o<=t&&i===r&&0===s&&0===l}(e,r,n)?function(e){const{image:t}=e;e.viewport.scale=Iu(e.canvas,t,e.viewport.rotation).scaleFactor,e.viewport.translation.x=0,e.viewport.translation.y=0}(e):function(e,t,r){const n=e.viewport.scale,a=e.canvas.width/t,o=e.canvas.height/r,i=Math.sqrt(a*o);e.viewport.scale=i*n}(e,r,n))}const tp=class extends Sf{constructor(e){super(e),this.voiUpdatedWithSetProperties=!1,this.invert=!1,this.initialInvert=!1,this.stackInvalidated=!1,this._publishCalibratedEvent=!1,this.useNativeDataType=!1,this.updateRenderingPipeline=()=>{this._configureRenderingPipeline()},this.resize=()=>{this.useCPURendering&&this._resizeCPU()},this._resizeCPU=()=>{this._cpuFallbackEnabledElement.viewport&&ep(this._cpuFallbackEnabledElement)},this.getFrameOfReferenceUID=()=>{const e=this.getCurrentImageId();if(!e)return;const t=ut("imagePlaneModule",e);return t?t.frameOfReferenceUID:void 0},this.getCornerstoneImage=()=>this.csImage,this.createActorMapper=e=>{const t=kf.newInstance();t.setInputData(e);const r=Yf.newInstance();r.setMapper(t);const{preferSizeOverAccuracy:n}=Qe().rendering;return n&&t.setPreferSizeOverAccuracy(!0),e.getPointData().getNumberOfComponents()>1&&r.getProperty().setIndependentComponents(!1),r},this.getProperties=()=>{const{voiRange:e,VOILUTFunction:t,interpolationType:r,invert:n,voiUpdatedWithSetProperties:a}=this;return{voiRange:e,VOILUTFunction:t,interpolationType:r,invert:n,rotation:this.getRotation(),isComputedVOI:!a}},this.getRotationCPU=()=>{const{viewport:e}=this._cpuFallbackEnabledElement;return e.rotation},this.getRotationGPU=()=>{const{viewUp:e,viewPlaneNormal:t,flipVertical:r}=this.getCamera(),n=r?ot.R3.negate(ot.R3.create(),this.initialViewUp):this.initialViewUp,a=180*ot.R3.angle(n,e)/Math.PI,o=ot.R3.cross(ot.R3.create(),n,e);return ot.R3.dot(o,t)>=0?a:(360-a)%360},this.renderImageObject=e=>{this._setCSImage(e);(this.useCPURendering?this._updateToDisplayImageCPU:this._updateActorToDisplayImageId).call(this,e)},this._setCSImage=e=>{e.isPreScaled=e.preScale?.scaled,this.csImage=e},this.canvasToWorldCPU=e=>{if(!this._cpuFallbackEnabledElement.image)return;const[t,r]=Qf(this._cpuFallbackEnabledElement,e),{origin:n,spacing:a,direction:o}=this.getImageData(),i=ot.R3.fromValues(0,0,0),s=o.slice(0,3),l=o.slice(3,6);return ot.R3.scaleAndAdd(i,n,s,t*a[0]),ot.R3.scaleAndAdd(i,i,l,r*a[1]),[i[0],i[1],i[2]]},this.worldToCanvasCPU=e=>{const{spacing:t,direction:r,origin:n}=this.getImageData(),a=r.slice(0,3),o=r.slice(3,6),i=ot.R3.subtract(ot.R3.create(),e,n),s=[ot.R3.dot(i,a)/t[0],ot.R3.dot(i,o)/t[1]];return Jf(this._cpuFallbackEnabledElement,s)},this.canvasToWorldGPU=e=>{const t=this.getRenderer(),r=this.getVtkActiveCamera(),n=r.getClippingRange(),a=r.getDistance();r.setClippingRange(a,a+.1);const o=this.getRenderingEngine().offscreenMultiRenderWindow.getOpenGLRenderWindow(),i=o.getSize(),s=window.devicePixelRatio||1,l=[e[0]*s,e[1]*s],c=[l[0]+this.sx,l[1]+this.sy];c[1]=i[1]-c[1];const u=o.displayToWorld(c[0],c[1],0,t);return r.setClippingRange(n[0],n[1]),[u[0],u[1],u[2]]},this.worldToCanvasGPU=e=>{const t=this.getRenderer(),r=this.getVtkActiveCamera(),n=r.getClippingRange(),a=r.getDistance();r.setClippingRange(a,a+.1);const o=this.getRenderingEngine().offscreenMultiRenderWindow.getOpenGLRenderWindow(),i=o.getSize(),s=o.worldToDisplay(...e,t);s[1]=i[1]-s[1];const l=[s[0]-this.sx,s[1]-this.sy];r.setClippingRange(n[0],n[1]);const c=window.devicePixelRatio||1;return[l[0]/c,l[1]/c]},this.getCurrentImageIdIndex=()=>this.currentImageIdIndex,this.getTargetImageIdIndex=()=>this.targetImageIdIndex,this.getImageIds=()=>this.imageIds,this.getCurrentImageId=()=>this.imageIds[this.currentImageIdIndex],this.hasImageId=e=>this.imageIds.includes(e),this.hasImageURI=e=>{const t=this.imageIds;for(let r=0;r{if(!this.useCPURendering)throw new Error("Custom cpu rendering pipeline should only be hit in CPU rendering mode");return this._cpuFallbackEnabledElement.image?(td(this._cpuFallbackEnabledElement,this.cpuRenderingInvalidated),this.cpuRenderingInvalidated=!1):this.fillWithBackgroundColor(),{canvas:this.canvas,element:this.element,viewportId:this.id,renderingEngineId:this.renderingEngineId,viewportStatus:this.viewportStatus}},this.renderingPipelineFunctions={getImageData:{cpu:this.getImageDataCPU,gpu:this.getImageDataGPU},setColormap:{cpu:this.setColormapCPU,gpu:this.setColormapGPU},getCamera:{cpu:this.getCameraCPU,gpu:super.getCamera},setCamera:{cpu:this.setCameraCPU,gpu:super.setCamera},setVOI:{cpu:this.setVOICPU,gpu:this.setVOIGPU},getRotation:{cpu:this.getRotationCPU,gpu:this.getRotationGPU},setInterpolationType:{cpu:this.setInterpolationTypeCPU,gpu:this.setInterpolationTypeGPU},setInvertColor:{cpu:this.setInvertColorCPU,gpu:this.setInvertColorGPU},resetCamera:{cpu:(e=!0,t=!0)=>(this.resetCameraCPU(e,t),!0),gpu:(e=!0,t=!0)=>(this.resetCameraGPU(e,t),!0)},canvasToWorld:{cpu:this.canvasToWorldCPU,gpu:this.canvasToWorldGPU},worldToCanvas:{cpu:this.worldToCanvasCPU,gpu:this.worldToCanvasGPU},getRenderer:{cpu:()=>this.getCPUFallbackError("getRenderer"),gpu:super.getRenderer},getDefaultActor:{cpu:()=>this.getCPUFallbackError("getDefaultActor"),gpu:super.getDefaultActor},getActors:{cpu:()=>this.getCPUFallbackError("getActors"),gpu:super.getActors},getActor:{cpu:()=>this.getCPUFallbackError("getActor"),gpu:super.getActor},setActors:{cpu:()=>this.getCPUFallbackError("setActors"),gpu:super.setActors},addActors:{cpu:()=>this.getCPUFallbackError("addActors"),gpu:super.addActors},addActor:{cpu:()=>this.getCPUFallbackError("addActor"),gpu:super.addActor},removeAllActors:{cpu:()=>this.getCPUFallbackError("removeAllActors"),gpu:super.removeAllActors},unsetColormap:{cpu:this.unsetColormapCPU,gpu:this.unsetColormapGPU}},this.scaling={},this.modality=null,this.useCPURendering=Ze(),this.useNativeDataType=this._shouldUseNativeDataType(),this._configureRenderingPipeline(),this.useCPURendering?this._resetCPUFallbackElement():this._resetGPUViewport(),this.imageIds=[],this.currentImageIdIndex=0,this.targetImageIdIndex=0,this.cameraFocalPointOnRender=[0,0,0],this.resetCamera(),this.initializeElementDisabledHandler()}setUseCPURendering(e){this.useCPURendering=e,this._configureRenderingPipeline()}static get useCustomRenderingPipeline(){return Ze()}_configureRenderingPipeline(){this.useNativeDataType=this._shouldUseNativeDataType(),this.useCPURendering=Ze();for(const[e,t]of Object.entries(this.renderingPipelineFunctions))this[e]=this.useCPURendering?t.cpu:t.gpu;this.useCPURendering?this._resetCPUFallbackElement():this._resetGPUViewport()}_resetCPUFallbackElement(){this._cpuFallbackEnabledElement={canvas:this.canvas,renderingTools:{},transform:new Ru,viewport:{rotation:0}}}_resetGPUViewport(){const e=this.getRenderer(),t=Dc.ZP.newInstance();e.setActiveCamera(t);const r=[0,0,-1];this.initialViewUp=[0,-1,0],t.setDirectionOfProjection(-r[0],-r[1],-r[2]),t.setViewUp(...this.initialViewUp),t.setParallelProjection(!0),t.setThicknessFromFocalPoint(.1),t.setFreezeFocalPoint(!0)}initializeElementDisabledHandler(){J.addEventListener(g.ELEMENT_DISABLED,(function e(){clearTimeout(this.debouncedTimeout),J.removeEventListener(g.ELEMENT_DISABLED,e)}))}getImageDataGPU(){const e=this.getDefaultActor();if(!e)return;if(!hd(e))return;const{actor:t}=e,r=t.getMapper().getInputData();return{dimensions:r.getDimensions(),spacing:r.getSpacing(),origin:r.getOrigin(),direction:r.getDirection(),scalarData:r.getPointData().getScalars().getData(),imageData:t.getMapper().getInputData(),metadata:{Modality:this.modality},scaling:this.scaling,hasPixelSpacing:this.hasPixelSpacing,calibration:this.calibration,preScale:{...this.csImage.preScale}}}getImageDataCPU(){const{metadata:e}=this._cpuFallbackEnabledElement,t=e.spacing;return{dimensions:e.dimensions,spacing:t,origin:e.origin,direction:e.direction,metadata:{Modality:this.modality},scaling:this.scaling,imageData:{getDirection:()=>e.direction,getDimensions:()=>e.dimensions,getScalarData:()=>this.cpuImagePixelData,getSpacing:()=>t,worldToIndex:e=>{const t=this.worldToCanvasCPU(e),r=Qf(this._cpuFallbackEnabledElement,t);return[r[0],r[1],0]},indexToWorld:e=>{const t=Jf(this._cpuFallbackEnabledElement,[e[0],e[1]]);return this.canvasToWorldCPU(t)}},scalarData:this.cpuImagePixelData,hasPixelSpacing:this.hasPixelSpacing,calibration:this.calibration,preScale:{...this.csImage.preScale}}}buildMetadata(e){const t=e.imageId,{pixelRepresentation:r,bitsAllocated:n,bitsStored:a,highBit:o,photometricInterpretation:i,samplesPerPixel:s}=ut("imagePixelModule",t),{windowWidth:l,windowCenter:c,voiLUTFunction:u}=e,{modality:d}=ut("generalSeriesModule",t),f=ut("scalingModule",t);"PT"===d&&f&&this._addScalingToViewport(f),this.modality=d;const p=this._getValidVOILUTFunction(u);this.VOILUTFunction=p,this.calibration=null;let g=this._getImagePlaneModule(t);return this.useCPURendering||(g=this.calibrateIfNecessary(t,g)),{imagePlaneModule:g,imagePixelModule:{bitsAllocated:n,bitsStored:a,samplesPerPixel:s,highBit:o,photometricInterpretation:i,pixelRepresentation:r,windowWidth:l,windowCenter:c,modality:d,voiLUTFunction:p}}}calibrateIfNecessary(e,t){const r=ut("calibratedPixelSpacing",e),n=this.calibration!==r,{scale:a}=r||{};return this.hasPixelSpacing=a>0||t.rowPixelSpacing>0,t.calibration=r,n?(this.calibration=r,this._publishCalibratedEvent=!0,this._calibrationEvent={scale:a,calibration:r},t):t}setProperties({voiRange:e,VOILUTFunction:t,invert:r,interpolationType:n,rotation:a}={},o=!1){if(this.viewportStatus=this.csImage?G.PRE_RENDER:G.LOADING,void 0!==e){const t=!0;this.setVOI(e,{suppressEvents:o,voiUpdatedWithSetProperties:t})}void 0!==t&&this.setVOILUTFunction(t,o),void 0!==r&&this.setInvertColor(r),void 0!==n&&this.setInterpolationType(n),void 0!==a&&this.getRotation()!==a&&this.setRotation(a)}resetProperties(){this.cpuRenderingInvalidated=!0,this.voiUpdatedWithSetProperties=!1,this.viewportStatus=G.PRE_RENDER,this.fillWithBackgroundColor(),this.useCPURendering&&(this._cpuFallbackEnabledElement.renderingTools={}),this._resetProperties(),this.render()}_resetProperties(){let e;e=this._isCurrentImagePTPrescaled()?this._getDefaultPTPrescaledVOIRange():this._getVOIRangeForCurrentImage(),this.setVOI(e),0!==this.getRotation()&&this.setRotation(0),this.setInterpolationType(T.LINEAR),this.setInvertColor(this.initialInvert)}_setPropertiesFromCache(){const{interpolationType:e,invert:t}=this;let r;r=this.voiUpdatedWithSetProperties?this.voiRange:this._isCurrentImagePTPrescaled()?this._getDefaultPTPrescaledVOIRange():this._getVOIRangeForCurrentImage()??this.voiRange,this.setVOI(r),this.setInterpolationType(e),this.setInvertColor(t)}getCameraCPU(){const{metadata:e,viewport:t}=this._cpuFallbackEnabledElement,{direction:r}=e,n=r.slice(6,9).map((e=>-e));let a=r.slice(3,6).map((e=>-e));if(t.rotation){const e=ot._E.fromRotation(ot._E.create(),t.rotation*Math.PI/180,n);a=ot.R3.transformMat4(ot.R3.create(),a,e)}const o=[this.element.clientWidth/2,this.element.clientHeight/2],i=this.canvasToWorld(o),s=this.canvasToWorld([0,0]),l=this.canvasToWorld([0,this.element.clientHeight]);return{parallelProjection:!0,focalPoint:i,position:[0,0,0],parallelScale:ot.R3.distance(s,l)/2,scale:t.scale,viewPlaneNormal:[n[0],n[1],n[2]],viewUp:[a[0],a[1],a[2]],flipHorizontal:this.flipHorizontal,flipVertical:this.flipVertical}}setCameraCPU(e){const{viewport:t,image:r}=this._cpuFallbackEnabledElement,n=this.getCameraCPU(),{focalPoint:a,parallelScale:o,scale:i,flipHorizontal:s,flipVertical:l}=e,{clientHeight:c}=this.element;if(a){const e=this.worldToCanvasCPU(a),r=Qf(this._cpuFallbackEnabledElement,e),o=this.worldToCanvasCPU(n.focalPoint),i=Qf(this._cpuFallbackEnabledElement,o),s=ot.K4.create();ot.K4.subtract(s,ot.K4.fromValues(r[0],r[1]),ot.K4.fromValues(i[0],i[1]));const l=function(e,t){const{hflip:r,vflip:n,rotation:a}=t;if(e.x*=r?-1:1,e.y*=n?-1:1,0!==a){const t=a*Math.PI/180,r=Math.cos(t),n=Math.sin(t),o=e.x*r-e.y*n,i=e.x*n+e.y*r;e.x=o,e.y=i}return e}({x:s[0],y:s[1]},t);t.translation.x-=l.x,t.translation.y-=l.y}if(o){const{rowPixelSpacing:e}=r,n=c*e*.5/o;t.scale=n,t.parallelScale=o}if(i){const{rowPixelSpacing:e}=r;t.scale=i,t.parallelScale=c*e*.5/i}void 0===s&&void 0===l||this.setFlipCPU({flipHorizontal:s,flipVertical:l}),this._cpuFallbackEnabledElement.transform=Eu(this._cpuFallbackEnabledElement);const u={previousCamera:n,camera:this.getCamera(),element:this.element,viewportId:this.id,renderingEngineId:this.renderingEngineId,rotation:this.getRotation()};se(this.element,g.CAMERA_MODIFIED,u)}setFlipCPU({flipHorizontal:e,flipVertical:t}){const{viewport:r}=this._cpuFallbackEnabledElement;void 0!==e&&(r.hflip=e,this.flipHorizontal=r.hflip),void 0!==t&&(r.vflip=t,this.flipVertical=r.vflip)}setRotation(e){const t=this.getCamera();this.useCPURendering?this.setRotationCPU(e):this.setRotationGPU(e);const r={previousCamera:t,camera:this.getCamera(),element:this.element,viewportId:this.id,renderingEngineId:this.renderingEngineId,rotation:e};se(this.element,g.CAMERA_MODIFIED,r)}setVOILUTFunction(e,t){if(this.useCPURendering)throw new Error("VOI LUT function is not supported in CPU rendering");const r=this._getValidVOILUTFunction(e);let n=!1;this.VOILUTFunction!==_.LINEAR&&r===_.LINEAR&&(n=!0),this.VOILUTFunction=r;const{voiRange:a}=this.getProperties();this.setVOI(a,{suppressEvents:t,forceRecreateLUTFunction:n})}setRotationCPU(e){const{viewport:t}=this._cpuFallbackEnabledElement;t.rotation=e}setRotationGPU(e){const{flipVertical:t}=this.getCamera(),r=t?ot.R3.negate(ot.R3.create(),this.initialViewUp):this.initialViewUp;this.setCamera({viewUp:r}),this.getVtkActiveCamera().roll(-e)}setInterpolationTypeGPU(e){const t=this.getDefaultActor();if(!t)return;if(!hd(t))return;const{actor:r}=t;r.getProperty().setInterpolationType(e),this.interpolationType=e}setInterpolationTypeCPU(e){const{viewport:t}=this._cpuFallbackEnabledElement;t.pixelReplication=e!==T.LINEAR,this.interpolationType=e}setInvertColorCPU(e){const{viewport:t}=this._cpuFallbackEnabledElement;t&&(t.invert=e,this.invert=e)}setInvertColorGPU(e){const t=this.getDefaultActor();if(t&&hd(t))if(vd(t,"vtkVolume")){const r=t.actor.getProperty().getRGBTransferFunction(0);(!this.invert&&e||this.invert&&!e)&&ee(r),this.invert=e}else if(vd(t,"vtkImageSlice")){const r=t.actor.getProperty().getRGBTransferFunction(0);(!this.invert&&e||this.invert&&!e)&&ee(r),this.invert=e}}setVOICPU(e,t={}){const{suppressEvents:r=!1}=t,{viewport:n,image:a}=this._cpuFallbackEnabledElement;if(!n||!a)return;if(void 0===e){const{windowWidth:t,windowCenter:r}=a,o=Array.isArray(t)?t[0]:t,i=Array.isArray(r)?r[0]:r;n.voi={windowWidth:o,windowCenter:i};const{lower:s,upper:l}=jd(o,i);e={lower:s,upper:l}}else{const{lower:t,upper:r}=e,{windowCenter:a,windowWidth:o}=zd(t,r);n.voi||(n.voi={windowWidth:0,windowCenter:0}),n.voi.windowWidth=o,n.voi.windowCenter=a}this.voiRange=e;const o={viewportId:this.id,range:e};r||se(this.element,g.VOI_MODIFIED,o)}setVOIGPU(e,t={}){const{suppressEvents:r=!1,forceRecreateLUTFunction:n=!1,voiUpdatedWithSetProperties:a=!1}=t;if(e&&this.voiRange&&this.voiRange.lower===e.lower&&this.voiRange.upper===e.upper&&!n&&!this.stackInvalidated)return;const o=this.getDefaultActor();if(!o)return;if(!hd(o))return;const i=o.actor;let s=e;if(void 0===s){const e=i.getMapper().getInputData().getPointData().getScalars().getRange();s={lower:e[0],upper:e[1]}}i.getProperty().setUseLookupTableScalarRange(!0);let l=i.getProperty().getRGBTransferFunction(0);const c=this.VOILUTFunction===_.SAMPLED_SIGMOID;if(c||!l||n){l=(c?ne:oe)(s),this.invert&&ee(l),i.getProperty().setRGBTransferFunction(0,l)}if(c||l.setRange(s.lower,s.upper),this.voiRange=s,this.voiUpdatedWithSetProperties||(this.voiUpdatedWithSetProperties=a),r)return;const u={viewportId:this.id,range:s,VOILUTFunction:this.VOILUTFunction};se(this.element,g.VOI_MODIFIED,u)}_addScalingToViewport(e){if(this.scaling.PT)return;const{suvbw:t,suvlbm:r,suvbsa:n}=e,a={};r&&(a.suvbwToSuvlbm=r/t),n&&(a.suvbwToSuvbsa=n/t),this.scaling.PT=a}_getNumCompsFromPhotometricInterpretation(e){let t=1;return"RGB"!==e&&-1===e.indexOf("YBR")&&"PALETTE COLOR"!==e||(t=3),t}_getImageDataMetadata(e){const{imagePlaneModule:t,imagePixelModule:r}=this.buildMetadata(e);let n,a;n=t.rowCosines,a=t.columnCosines,null!=n&&null!=a||(n=[1,0,0],a=[0,1,0]);const o=ot.R3.fromValues(n[0],n[1],n[2]),i=ot.R3.fromValues(a[0],a[1],a[2]),s=ot.R3.create();ot.R3.cross(s,o,i);let l=t.imagePositionPatient;null==l&&(l=[0,0,0]);const c=t.columnPixelSpacing||e.columnPixelSpacing,u=t.rowPixelSpacing||e.rowPixelSpacing,d=e.columns,f=e.rows,p=e.numComps||this._getNumCompsFromPhotometricInterpretation(r.photometricInterpretation);return{bitsAllocated:r.bitsAllocated,numComps:p,origin:l,direction:[...o,...i,...s],dimensions:[d,f,1],spacing:[c,u,1],numVoxels:d*f*1,imagePlaneModule:t,imagePixelModule:r}}_getCameraOrientation(e){const t=e.slice(6,9).map((e=>-e)),r=e.slice(3,6).map((e=>-e));return{viewPlaneNormal:[t[0],t[1],t[2]],viewUp:[r[0],r[1],r[2]]}}_createVTKImageData({origin:e,direction:t,dimensions:r,spacing:n,numComps:a,pixelArray:o}){const i=new o.constructor(o.length),s=re.ZP.newInstance({name:"Pixels",numberOfComponents:a,values:i});this._imageData=Jo.ZP.newInstance(),this._imageData.setDimensions(r),this._imageData.setSpacing(n),this._imageData.setDirection(t),this._imageData.setOrigin(e),this._imageData.getPointData().setScalars(s)}async setStack(e,t=0){this._throwIfDestroyed(),this.imageIds=e,this.currentImageIdIndex=t,this.targetImageIdIndex=t,this.stackInvalidated=!0,this.flipVertical=!1,this.flipHorizontal=!1,this.voiRange=null,this.interpolationType=T.LINEAR,this.invert=!1,this.viewportStatus=G.LOADING,this.fillWithBackgroundColor(),this.useCPURendering&&(this._cpuFallbackEnabledElement.renderingTools={},delete this._cpuFallbackEnabledElement.viewport.colormap);const r=await this._setImageIdIndex(t),n={imageIds:e,viewportId:this.id,element:this.element,currentImageIdIndex:t};return se(J,g.STACK_VIEWPORT_NEW_STACK,n),r}_throwIfDestroyed(){if(this.isDisabled)throw new Error("The stack viewport has been destroyed and is no longer usable. Renderings will not be performed. If you are using the same viewportId and have re-enabled the viewport, you need to grab the new viewport instance using renderingEngine.getViewport(viewportId), instead of using your lexical scoped reference to the viewport instance.")}_checkVTKImageDataMatchesCornerstoneImage(e,t){if(!t)return!1;const[r,n]=t.getSpacing(),[a,o]=t.getDimensions(),i=this._getImagePlaneModule(e.imageId),s=t.getDirection(),l=s.slice(0,3),c=s.slice(3,6),u=t.getPointData().getScalars().getDataType(),d=Ce(r,e.columnPixelSpacing),f=Ce(n,e.rowPixelSpacing);return(d||null===e.columnPixelSpacing&&1===r)&&(f||null===e.rowPixelSpacing&&1===n)&&a===e.columns&&o===e.rows&&Ce(i.rowCosines,l)&&Ce(i.columnCosines,c)&&(!this.useNativeDataType||u===e.getPixelData().constructor.name)}_updateVTKImageDataFromCornerstoneImage(e){let t=this._getImagePlaneModule(e.imageId).imagePositionPatient;null==t&&(t=[0,0,0]),this._imageData.setOrigin(t),this._updatePixelData(e)}_updatePixelData(e){const t=e.getPixelData(),r=this._imageData.getPointData().getScalars().getData();if(e.color&&e.rgba){const n=new Uint8Array(e.columns*e.rows*3);for(let r=0;rn,r.set(n)}else r.set(t);this._imageData.modified()}async _loadAndDisplayImage(e,t){return await(this.useCPURendering?this._loadAndDisplayImageCPU(e,t):this._loadAndDisplayImageGPU(e,t)),e}_loadAndDisplayImageCPU(e,t){return new Promise(((r,n)=>{function a(e,t,n){if(this.currentImageIdIndex!==t)return;const a=e.getPixelData(),o=e.preScale,i=o?.scalingParameters;if(a instanceof Float32Array&&(o?.scaled&&i?.rescaleIntercept%1!=0||i?.rescaleSlope%1!=0)){const t={min:e.maxPixelValue,max:e.minPixelValue},r=Math.abs(t.max-t.min)/65535,n=t.min,o=a.length,i=new Uint16Array(o);let s=65535,l=0;for(let e=0;ei,e.preScale={...e.preScale,scaled:!1}}this._setCSImage(e),this.viewportStatus=G.PRE_RENDER;const s={image:e,imageId:n,imageIdIndex:t,viewportId:this.id,renderingEngineId:this.renderingEngineId};se(this.element,g.STACK_NEW_IMAGE,s),this._updateToDisplayImageCPU(e),this.render(),this.currentImageIdIndex=t,r(n)}function o(e,t,r){const a={error:e,imageIdIndex:t,imageId:r};this.suppressEvents||se(J,g.IMAGE_LOAD_ERROR,a),n(e)}const i=h.Interaction,s={imageId:e},l={imageId:e,imageIdIndex:t,viewportId:this.id,renderingEngineId:this.renderingEngineId};se(this.element,g.PRE_STACK_NEW_IMAGE,l),iu.addRequest(function(e,t,r){return du(e,r).then((r=>{a.call(this,r,t,e)}),(r=>{o.call(this,r,t,e)}))}.bind(this,e,t,{preScale:{enabled:!0},useRGBA:!0}),i,s,-5)}))}_loadAndDisplayImageGPU(e,t){return new Promise(((r,n)=>{function a(e,t,n){if(this.currentImageIdIndex!==t)return;const a=this.csImage?.imageFrame,o=e?.imageFrame;a?.photometricInterpretation===o?.photometricInterpretation&&this.csImage?.photometricInterpretation===e?.photometricInterpretation||(this.stackInvalidated=!0),this._setCSImage(e);const i={image:e,imageId:n,imageIdIndex:t,viewportId:this.id,renderingEngineId:this.renderingEngineId};se(this.element,g.STACK_NEW_IMAGE,i),this._updateActorToDisplayImageId(e),this.render(),this.currentImageIdIndex=t,r(n)}function o(e,t,r){const a={error:e,imageIdIndex:t,imageId:r};se(J,g.IMAGE_LOAD_ERROR,a),n(e)}const i=h.Interaction,s={imageId:e},l={targetBuffer:{type:this.useNativeDataType?void 0:"Float32Array"},preScale:{enabled:!0},useRGBA:!1},c={imageId:e,imageIdIndex:t,viewportId:this.id,renderingEngineId:this.renderingEngineId};se(this.element,g.PRE_STACK_NEW_IMAGE,c),iu.addRequest(function(e,t,r){return du(e,r).then((r=>{a.call(this,r,t,e)}),(r=>{o.call(this,r,t,e)}))}.bind(this,e,t,l),i,s,-5)}))}_updateToDisplayImageCPU(e){const t=this._getImageDataMetadata(e),r=Au(this.canvas,e,this.modality,this._cpuFallbackEnabledElement.viewport.colormap),{windowCenter:n,windowWidth:a}=r.voi;this.voiRange=jd(a,n),this._cpuFallbackEnabledElement.image=e,this._cpuFallbackEnabledElement.metadata={...t},this.cpuImagePixelData=e.getPixelData();const o=Object.assign({},r,this._cpuFallbackEnabledElement.viewport);this._cpuFallbackEnabledElement.viewport=this.stackInvalidated?r:o,this.stackInvalidated=!1,this.cpuRenderingInvalidated=!0,this._cpuFallbackEnabledElement.transform=Eu(this._cpuFallbackEnabledElement)}_updateActorToDisplayImageId(e){const t=this._checkVTKImageDataMatchesCornerstoneImage(e,this._imageData),r=this.getRenderer().getActiveCamera(),n=ti()(this.getCamera());if(t&&!this.stackInvalidated){this._updateVTKImageDataFromCornerstoneImage(e);const t=this.getCamera(),a=ot.R3.subtract(ot.R3.create(),this.cameraFocalPointOnRender,t.focalPoint);this.resetCameraNoEvent(),this.setCameraNoEvent({flipHorizontal:n.flipHorizontal,flipVertical:n.flipVertical,viewUp:n.viewUp});const{focalPoint:o}=this.getCamera();return this.cameraFocalPointOnRender=o,r.setFreezeFocalPoint(!0),this._restoreCameraProps(t,n,a),void this._setPropertiesFromCache()}const{origin:a,direction:o,dimensions:i,spacing:s,numComps:l,imagePixelModule:c}=this._getImageDataMetadata(e);this._createVTKImageData({origin:a,direction:o,dimensions:i,spacing:s,numComps:l,pixelArray:e.getPixelData()}),this._updateVTKImageDataFromCornerstoneImage(e);const u=this.createActorMapper(this._imageData),d=[];d.push({uid:this.id,actor:u}),this.setActors(d);const{viewPlaneNormal:f,viewUp:p}=this._getCameraOrientation(o);this.setCameraNoEvent({viewUp:p,viewPlaneNormal:f}),this.initialViewUp=p,this.resetCameraNoEvent(),this.triggerCameraEvent(this.getCamera(),n),r.setFreezeFocalPoint(!0);const g="MONOCHROME1"===c.photometricInterpretation;this.stackInvalidated=!0,this.setVOI(this._getInitialVOIRange(e),{forceRecreateLUTFunction:!!g}),this.initialInvert=!!g,this.setInvertColor(this.invert||this.initialInvert),this.cameraFocalPointOnRender=this.getCamera().focalPoint,this.stackInvalidated=!1,this._publishCalibratedEvent&&this.triggerCalibrationEvent()}_getInitialVOIRange(e){if(this.voiRange&&this.voiUpdatedWithSetProperties)return this.voiRange;const{windowCenter:t,windowWidth:r}=e;let n=this._getVOIRangeFromWindowLevel(r,t);return n=this._getPTPreScaledRange()||n,n}_getPTPreScaledRange(){if(this._isCurrentImagePTPrescaled())return this._getDefaultPTPrescaledVOIRange()}_isCurrentImagePTPrescaled(){return!("PT"!==this.modality||!this.csImage.isPreScaled)&&!!this.csImage.preScale?.scalingParameters?.suvbw}_getDefaultPTPrescaledVOIRange(){return{lower:0,upper:5}}_getVOIRangeFromWindowLevel(e,t){let r,n;if("number"==typeof t&&"number"==typeof e?(r=t,n=e):Array.isArray(t)&&Array.isArray(e)&&(r=t[0],n=e[0]),void 0!==r&&void 0!==n)return jd(n,r)}async _setImageIdIndex(e){if(e>=this.imageIds.length)throw new Error(`ImageIdIndex provided ${e} is invalid, the stack only has ${this.imageIds.length} elements`);this.currentImageIdIndex=e,this.hasPixelSpacing=!0,this.viewportStatus=G.PRE_RENDER;return await this._loadAndDisplayImage(this.imageIds[e],e)}resetCameraCPU(e,t){const{image:r}=this._cpuFallbackEnabledElement;if(!r)return;!function(e,t=!0,r=!0){const{canvas:n,image:a,viewport:o}=e,i=Iu(n,a,0).scaleFactor;o.vflip=!1,o.hflip=!1,t&&(o.translation.x=0,o.translation.y=0),r&&(o.displayedArea.tlhc.x=1,o.displayedArea.tlhc.y=1,o.displayedArea.brhc.x=a.columns,o.displayedArea.brhc.y=a.rows,o.scale=i)}(this._cpuFallbackEnabledElement,e,t);const{scale:n}=this._cpuFallbackEnabledElement.viewport,{clientWidth:a,clientHeight:o}=this.element,i=[a/2,o/2],s=this.canvasToWorldCPU(i);this.setCameraCPU({focalPoint:s,scale:n})}resetCameraGPU(e,t){this.setCamera({flipHorizontal:!1,flipVertical:!1,viewUp:this.initialViewUp});return super.resetCamera(e,t,!0)}scroll(e,t=!0,r=!1){const n=this.imageIds,a=this.targetImageIdIndex,o=n.length;let i=a+e;i=Math.max(0,i),r?i%=o:i=Math.min(o-1,i),this.targetImageIdIndex=i;const s=n[i];qd.isLoaded(s)||!t?this.setImageIdIndex(i):(clearTimeout(this.debouncedTimeout),this.debouncedTimeout=window.setTimeout((()=>{this.setImageIdIndex(i)}),40));const l={newImageIdIndex:i,imageId:s,direction:e};i!==a&&se(this.element,g.STACK_VIEWPORT_SCROLL,l)}async setImageIdIndex(e){if(this._throwIfDestroyed(),this.currentImageIdIndex===e)return this.getCurrentImageId();return this._setImageIdIndex(e)}calibrateSpacing(e){const t=this.getImageIds().indexOf(e);this.stackInvalidated=!0,this._loadAndDisplayImage(e,t)}_restoreCameraProps({parallelScale:e},t,r){const n=this.getRenderer(),{position:a,focalPoint:o}=this.getCamera(),i=ot.R3.subtract(ot.R3.create(),a,r),s=ot.R3.subtract(ot.R3.create(),o,r);this.setCameraNoEvent({parallelScale:e,position:i,focalPoint:s});const l=this.getCamera();this.triggerCameraEvent(l,t);const c={type:"ResetCameraEvent",renderer:n};n.invokeEvent(c)}triggerCameraEvent(e,t){const r={previousCamera:t,camera:e,element:this.element,viewportId:this.id,renderingEngineId:this.renderingEngineId};this.suppressEvents||se(this.element,g.CAMERA_MODIFIED,r)}triggerCalibrationEvent(){const{imageData:e}=this.getImageData(),t={element:this.element,viewportId:this.id,renderingEngineId:this.renderingEngineId,imageId:this.getCurrentImageId(),imageData:e,worldToIndex:e.getWorldToIndex(),...this._calibrationEvent};this.suppressEvents||se(this.element,g.IMAGE_SPACING_CALIBRATED,t),this._publishCalibratedEvent=!1}_getVOIRangeForCurrentImage(){const{windowCenter:e,windowWidth:t}=this.csImage;return this._getVOIRangeFromWindowLevel(t,e)}_getValidVOILUTFunction(e){return-1===Object.values(_).indexOf(e)&&(e=_.LINEAR),e}getCPUFallbackError(e){return new Error(`method ${e} cannot be used during CPU Fallback mode`)}fillWithBackgroundColor(){const e=this.getRenderingEngine();e&&e.fillCanvasWithBackgroundColor(this.canvas,this.options.background)}unsetColormapCPU(){delete this._cpuFallbackEnabledElement.viewport.colormap,this._cpuFallbackEnabledElement.renderingTools={},this.cpuRenderingInvalidated=!0,this.fillWithBackgroundColor(),this.render()}setColormapCPU(e){const t=Yu(e.name,e);this._cpuFallbackEnabledElement.viewport.colormap=t,this._cpuFallbackEnabledElement.renderingTools={},this.fillWithBackgroundColor(),this.cpuRenderingInvalidated=!0,this.render()}setColormapGPU(e){const t=this.getDefaultActor().actor.getProperty(),r=t.getRGBTransferFunction();if(r)r.applyColorMap(e),t.setRGBTransferFunction(0,r);else{const r=te.ZP.newInstance(),n=this._getVOIRangeForCurrentImage();r.applyColorMap(e),r.setMappingRange(n.lower,n.upper),t.setRGBTransferFunction(0,r)}this.render()}unsetColormapGPU(){throw new Error("unsetColormapGPU not implemented.")}_getImagePlaneModule(e){const t=ut("imagePlaneModule",e);ut("calibratedPixelSpacing",e);this.calibration||=t.calibration;const r={...t};return r.columnPixelSpacing||(r.columnPixelSpacing=1,this.hasPixelSpacing=this.calibration?.scale>0),r.rowPixelSpacing||(r.rowPixelSpacing=1,this.hasPixelSpacing=this.calibration?.scale>0),r.columnCosines||(r.columnCosines=[0,1,0]),r.rowCosines||(r.rowCosines=[1,0,0]),r.imagePositionPatient||(r.imagePositionPatient=[0,0,0]),r.imageOrientationPatient||(r.imageOrientationPatient=new Float32Array([1,0,0,0,1,0])),r}};const rp=class extends Pf{constructor(e){super(e),this.getRotation=()=>0,this.getCurrentImageIdIndex=()=>{},this.getCurrentImageId=()=>null;const{parallelProjection:t,orientation:r}=this.options,n=this.getVtkActiveCamera();null!=t&&n.setParallelProjection(t),r&&r!==I.ACQUISITION&&this.applyViewOrientation(r)}resetCamera(e=!0,t=!0,r=!0){super.resetCamera(e,t,r),this.resetVolumeViewportClippingRange()}setSlabThickness(e,t){return null}setBlendMode(e,t,r){return null}resetProperties(e){return null}},np={[y.ORTHOGRAPHIC]:wf,[y.PERSPECTIVE]:wf,[y.STACK]:tp,[y.VOLUME_3D]:rp};function ap(e){return np[e].useCustomRenderingPipeline}const op=class{constructor(e){if(this._needsRender=new Set,this._animationFrameSet=!1,this._animationFrameHandle=null,this.renderFrameOfReference=e=>{const t=this._getViewportsAsArray().map((t=>{if(t.getFrameOfReferenceUID()===e)return t.id}));return this.renderViewports(t)},this._renderFlaggedViewports=()=>{this._throwIfDestroyed(),this.useCPURendering||this.performVtkDrawCall();const e=this._getViewportsAsArray(),t=[];for(let r=0;r{e?.element&&se(e.element,g.IMAGE_RENDERED,e)}))},this.id=e||le(),this.useCPURendering=Ze(),$.set(this),!$e())throw new Error("@cornerstonejs/core is not initialized, run init() first");this.useCPURendering||(this.offscreenMultiRenderWindow=mc.newInstance(),this.offScreenCanvasContainer=document.createElement("div"),this.offscreenMultiRenderWindow.setContainer(this.offScreenCanvasContainer)),this._viewports=new Map,this.hasBeenDestroyed=!1}enableElement(e){const t=this._normalizeViewportInputEntry(e);this._throwIfDestroyed();const{element:r,viewportId:n}=t;if(!r)throw new Error("No element provided");this.getViewport(n)&&(console.log("Viewport already exists, disabling it first"),this.disableElement(n),console.log(`Viewport ${n} disabled`));const{type:a}=t,o=ap(a);this.useCPURendering||o?this.addCustomViewport(t):this.enableVTKjsDrivenViewport(t);const i=Cu(r),{background:s}=t.defaultOptions;this.fillCanvasWithBackgroundColor(i,s)}disableElement(e){this._throwIfDestroyed();const t=this.getViewport(e);if(!t)return void console.warn(`viewport ${e} does not exist`);this._resetViewport(t),ap(t.type)||this.useCPURendering||this.offscreenMultiRenderWindow.removeRenderer(e),this._removeViewport(e),t.isDisabled=!0,this._needsRender.delete(e);this.getViewports().length||this._clearAnimationFrame();this.resize(!0,!0)}setViewports(e){const t=this._normalizeViewportInputEntries(e);this._throwIfDestroyed(),this._reset();const r=[],n=[];t.forEach((e=>{this.useCPURendering||ap(e.type)?n.push(e):r.push(e)})),this.setVtkjsDrivenViewports(r),this.setCustomViewports(n)}resize(e=!0,t=!0){this._throwIfDestroyed();const r=this._getViewportsAsArray(),n=[],a=[];r.forEach((e=>{ap(e.type)?a.push(e):n.push(e)})),n.length&&this._resizeVTKViewports(n,t,e),a.length&&this._resizeUsingCustomResizeHandler(a,t,e)}getViewport(e){return this._viewports.get(e)}getViewports(){return this._throwIfDestroyed(),this._getViewportsAsArray()}getStackViewports(){this._throwIfDestroyed();return this.getViewports().filter((e=>e instanceof tp))}getVolumeViewports(){this._throwIfDestroyed();return this.getViewports().filter((e=>e instanceof Pf))}render(){const e=this.getViewports().map((e=>e.id));this._setViewportsToBeRenderedNextFrame(e)}renderViewports(e){this._setViewportsToBeRenderedNextFrame(e)}renderViewport(e){this._setViewportsToBeRenderedNextFrame([e])}destroy(){if(!this.hasBeenDestroyed){if(!this.useCPURendering){this._getViewportsAsArray().forEach((e=>{this.offscreenMultiRenderWindow.removeRenderer(e.id)})),this.offscreenMultiRenderWindow.delete(),delete this.offscreenMultiRenderWindow}this._reset(),$.delete(this.id),this.hasBeenDestroyed=!0}}fillCanvasWithBackgroundColor(e,t){const r=e.getContext("2d");let n;if(t){const e=t.map((e=>Math.floor(255*e)));n=`rgb(${e[0]}, ${e[1]}, ${e[2]})`}else n="black";r.fillStyle=n,r.fillRect(0,0,e.width,e.height)}_normalizeViewportInputEntry(e){const{type:t,defaultOptions:r}=e;let n=r;return n&&0!==Object.keys(n).length||(n={background:[0,0,0],orientation:null,displayArea:null},t===y.ORTHOGRAPHIC&&(n={...n,orientation:I.AXIAL})),{...e,defaultOptions:n}}_normalizeViewportInputEntries(e){const t=[];return e.forEach((e=>{t.push(this._normalizeViewportInputEntry(e))})),t}_resizeUsingCustomResizeHandler(e,t=!0,r=!0){e.forEach((e=>{"function"==typeof e.resize&&e.resize()})),e.forEach((e=>{const r=e.getCamera();e.resetCamera(),t&&e.setCamera(r)})),!0===r&&this.render()}_resizeVTKViewports(e,t=!0,r=!0){const n=e.map((e=>e.canvas));if(n.length){const{offScreenCanvasWidth:t,offScreenCanvasHeight:r}=this._resizeOffScreenCanvas(n);this._resize(e,t,r)}e.forEach((e=>{const r=Cu(e.element),n=r.getBoundingClientRect(),a=window.devicePixelRatio||1;r.width=n.width*a,r.height=n.height*a;const o=e.getCamera();e.resetCamera(),t&&e.setCamera(o)})),!0===r&&this.render()}enableVTKjsDrivenViewport(e){const t=this._getViewportsAsArray().filter((e=>!1===ap(e.type))),r=t.map((e=>e.canvas)),n=Cu(e.element);r.push(n);const a=window.devicePixelRatio||1,o=n.getBoundingClientRect();n.width=o.width*a,n.height=o.height*a;const{offScreenCanvasWidth:i,offScreenCanvasHeight:s}=this._resizeOffScreenCanvas(r),l=this._resize(t,i,s),c={...e,canvas:n};this.addVtkjsDrivenViewport(c,{offScreenCanvasWidth:i,offScreenCanvasHeight:s,xOffset:l})}_removeViewport(e){this.getViewport(e)?this._viewports.delete(e):console.warn(`viewport ${e} does not exist`)}addVtkjsDrivenViewport(e,t){const{element:r,canvas:n,viewportId:a,type:o,defaultOptions:i}=e;r.tabIndex=-1;const{offScreenCanvasWidth:s,offScreenCanvasHeight:l,xOffset:c}=t,{sxStartDisplayCoords:u,syStartDisplayCoords:d,sxEndDisplayCoords:f,syEndDisplayCoords:p,sx:m,sy:h,sWidth:v,sHeight:b}=this._getViewportCoordsOnOffScreenCanvas(e,s,l,c);this.offscreenMultiRenderWindow.addRenderer({viewport:[u,d,f,p],id:a,background:i.background?i.background:[0,0,0]});const T={id:a,element:r,renderingEngineId:this.id,type:o,canvas:n,sx:m,sy:h,sWidth:v,sHeight:b,defaultOptions:i||{}};let C;if(o===y.STACK)C=new tp(T);else if(o===y.ORTHOGRAPHIC||o===y.PERSPECTIVE)C=new wf(T);else{if(o!==y.VOLUME_3D)throw new Error(`Viewport Type ${o} is not supported`);C=new rp(T)}this._viewports.set(a,C);const x={element:r,viewportId:a,renderingEngineId:this.id};C.suppressEvents||se(J,g.ELEMENT_ENABLED,x)}addCustomViewport(e){const{element:t,viewportId:r,type:n,defaultOptions:a}=e;t.tabIndex=-1;const o=Cu(t),{clientWidth:i,clientHeight:s}=o;o.width===i&&o.height===s||(o.width=i,o.height=s);const l={id:r,renderingEngineId:this.id,element:t,type:n,canvas:o,sx:0,sy:0,sWidth:i,sHeight:s,defaultOptions:a||{}};if(n!==y.STACK)throw new Error("Support for fully custom viewports not yet implemented");const c=new tp(l);this._viewports.set(r,c);const u={element:t,viewportId:r,renderingEngineId:this.id};se(J,g.ELEMENT_ENABLED,u)}setCustomViewports(e){e.forEach((e=>this.addCustomViewport(e)))}setVtkjsDrivenViewports(e){if(e.length){const t=e.map((e=>Cu(e.element)));t.forEach((e=>{const t=window.devicePixelRatio||1,r=e.getBoundingClientRect();e.width=r.width*t,e.height=r.height*t}));const{offScreenCanvasWidth:r,offScreenCanvasHeight:n}=this._resizeOffScreenCanvas(t);let a=0;for(let o=0;oe.clientHeight*n)));let o=0;return e.forEach((e=>{o+=e.clientWidth*n})),t.width=o,t.height=a,r.resize(),{offScreenCanvasWidth:o,offScreenCanvasHeight:a}}_resize(e,t,r){let n=0;const a=window.devicePixelRatio||1;for(let o=0;o{this._needsRender.add(e)})),this._render()}_render(){this._needsRender.size>0&&!1===this._animationFrameSet&&(this._animationFrameHandle=window.requestAnimationFrame(this._renderFlaggedViewports),this._animationFrameSet=!0)}performVtkDrawCall(){const{offscreenMultiRenderWindow:e}=this,t=e.getRenderWindow(),r=e.getRenderers();if(r.length){for(let e=0;e{this._resetViewport(e)})),this._clearAnimationFrame(),this._viewports=new Map}_throwIfDestroyed(){if(this.hasBeenDestroyed)throw new Error("this.destroy() has been manually called to free up memory, can not longer use this instance. Instead make a new one.")}_downloadOffScreenCanvas(){!function(e){const t=document.createElement("a");t.download="viewport.png",t.href=e,document.body.appendChild(t),t.click(),document.body.removeChild(t)}(this._debugRender())}_debugRender(){const{offscreenMultiRenderWindow:e}=this,t=e.getRenderWindow(),r=e.getRenderers();for(let e=0;e{const{sx:t,sy:r,sWidth:a,sHeight:o}=e,i=e.canvas,{width:s,height:l}=i;i.getContext("2d").drawImage(n,t,r,a,o,0,0,s,l)})),a}};const ip=op,sp=new au("imageRetrievalPool");sp.setMaxSimultaneousRequests(h.Interaction,200),sp.setMaxSimultaneousRequests(h.Thumbnail,200),sp.setMaxSimultaneousRequests(h.Prefetch,200),sp.grabDelay=0;const lp=sp,cp=Symbol("DefaultSettings"),up=Symbol("RuntimeSettings"),dp=Symbol("ObjectSettingsMap"),fp=Symbol("Dictionary");class pp{constructor(e){const t=Object.create(e instanceof pp&&fp in e?e[fp]:null);Object.seal(Object.defineProperty(this,fp,{value:t}))}set(e,t){return mp(this[fp],e,t,null)}get(e){return function(e,t){return e[t]}(this[fp],e)}unset(e){return function(e,t){if(t.endsWith(".")){let r=0;const n=t,a=n.slice(0,-1),o=0===a.length;for(const t in e)Object.prototype.hasOwnProperty.call(e,t)&&(o||t.startsWith(n)||t===a)&&(delete e[t],++r);return r>0}return delete e[t]}(this[fp],e+"")}forEach(e){gp(this[fp],e)}extend(){return new pp(this)}import(e){hp(e)&&Object.keys(e).forEach((t=>{mp(this[fp],t,e[t],null)}))}dump(){const e={};return gp(this[fp],((t,r)=>{void 0!==r&&vp(e,t,r)})),e}static assert(e){return e instanceof pp?e:pp.getRuntimeSettings()}static getDefaultSettings(e=null){let t=pp[cp];if(t instanceof pp||(t=new pp,pp[cp]=t),e){const r={};return t.forEach((n=>{if(n.startsWith(e)){const a=n.split(`${e}.`)[1];r[a]=t.get(n)}})),r}return t}static getRuntimeSettings(){let e=pp[up];return e instanceof pp||(e=new pp(pp.getDefaultSettings()),pp[up]=e),e}static getObjectSettings(e,t){let r=null;if(e instanceof pp)r=e;else if("object"==typeof e&&null!==e){let n=pp[dp];n instanceof WeakMap||(n=new WeakMap,pp[dp]=n),r=n.get(e),r instanceof pp||(r=new pp(pp.assert(pp.getObjectSettings(t))),n.set(e,r))}return r}static extendRuntimeSettings(){return pp.getRuntimeSettings().extend()}}function gp(e,t){for(const r in e)t(r,e[r])}function mp(e,t,r,n){return!!function(e){let t,r,n;if("string"!=typeof e||(t=e.length-1)<0)return!1;n=-1;for(;(r=e.indexOf(".",n+1))>=0;){if(r-n<2||r===t)return!1;n=r}return!0}(t)&&(hp(r)?function(e,t,r,n){let a;if(n.has(r))return mp(e,t,null,n);n.add(r),a=0;for(const o in r)Object.prototype.hasOwnProperty.call(r,o)&&(mp(e,0===o.length?t:`${t}.${o}`,r[o],n)||++a);return n.delete(r),0===a}(e,t,r,n instanceof WeakSet?n:new WeakSet):(e[t]=r,!0))}function hp(e){if("object"==typeof e&&null!==e){const t=Object.getPrototypeOf(e);if(t===Object.prototype||null===t)return!0}return!1}function vp(e,t,r){const n=t.indexOf(".");if(n>=0){const a=t.slice(0,n);let o=e[a];if("object"!=typeof o||null===o){const t=o;o={},void 0!==t&&(o[""]=t),e[a]=o}vp(o,t.slice(n+1,t.length),r)}else e[t]=r}pp.getDefaultSettings().set("useCursors",!0);var yp=r(47294);function bp(e,t){switch(arguments.length){case 0:break;case 1:this.range(e);break;default:this.range(t).domain(e)}return this}Symbol("implicit");var Tp=r(22791);function Cp(e){return+e}var xp=[0,1];function Sp(e){return e}function Pp(e,t){return(t-=e=+e)?function(r){return(r-e)/t}:(r=isNaN(t)?NaN:.5,function(){return r});var r}function wp(e,t,r){var n=e[0],a=e[1],o=t[0],i=t[1];return at&&(r=e,e=t,t=r),function(r){return Math.max(e,Math.min(t,r))}}(i[0],i[e-1])),n=e>2?Op:wp,a=o=null,d}function d(t){return null==t||isNaN(t=+t)?r:(a||(a=n(i.map(e),s,l)))(e(c(t)))}return d.invert=function(r){return c(t((o||(o=n(s,i.map(e),Tp.k4)))(r)))},d.domain=function(e){return arguments.length?(i=Array.from(e,Cp),u()):i.slice()},d.range=function(e){return arguments.length?(s=Array.from(e),u()):s.slice()},d.rangeRound=function(e){return s=Array.from(e),l=Tp.uL,u()},d.clamp=function(e){return arguments.length?(c=!!e||Sp,u()):c!==Sp},d.interpolate=function(e){return arguments.length?(l=e,u()):l},d.unknown=function(e){return arguments.length?(r=e,d):r},function(r,n){return e=r,t=n,u()}}function Ap(e,t){if((r=(e=t?e.toExponential(t-1):e.toExponential()).indexOf("e"))<0)return null;var r,n=e.slice(0,r);return[n.length>1?n[0]+n.slice(2):n,+e.slice(r+1)]}function Rp(e){return(e=Ap(Math.abs(e)))?e[1]:NaN}var Ep,Mp=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;function Dp(e){if(!(t=Mp.exec(e)))throw new Error("invalid format: "+e);var t;return new Vp({fill:t[1],align:t[2],sign:t[3],symbol:t[4],zero:t[5],width:t[6],comma:t[7],precision:t[8]&&t[8].slice(1),trim:t[9],type:t[10]})}function Vp(e){this.fill=void 0===e.fill?" ":e.fill+"",this.align=void 0===e.align?">":e.align+"",this.sign=void 0===e.sign?"-":e.sign+"",this.symbol=void 0===e.symbol?"":e.symbol+"",this.zero=!!e.zero,this.width=void 0===e.width?void 0:+e.width,this.comma=!!e.comma,this.precision=void 0===e.precision?void 0:+e.precision,this.trim=!!e.trim,this.type=void 0===e.type?"":e.type+""}function Lp(e,t){var r=Ap(e,t);if(!r)return e+"";var n=r[0],a=r[1];return a<0?"0."+new Array(-a).join("0")+n:n.length>a+1?n.slice(0,a+1)+"."+n.slice(a+1):n+new Array(a-n.length+2).join("0")}Dp.prototype=Vp.prototype,Vp.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(void 0===this.width?"":Math.max(1,0|this.width))+(this.comma?",":"")+(void 0===this.precision?"":"."+Math.max(0,0|this.precision))+(this.trim?"~":"")+this.type};const _p={"%":(e,t)=>(100*e).toFixed(t),b:e=>Math.round(e).toString(2),c:e=>e+"",d:function(e){return Math.abs(e=Math.round(e))>=1e21?e.toLocaleString("en").replace(/,/g,""):e.toString(10)},e:(e,t)=>e.toExponential(t),f:(e,t)=>e.toFixed(t),g:(e,t)=>e.toPrecision(t),o:e=>Math.round(e).toString(8),p:(e,t)=>Lp(100*e,t),r:Lp,s:function(e,t){var r=Ap(e,t);if(!r)return e+"";var n=r[0],a=r[1],o=a-(Ep=3*Math.max(-8,Math.min(8,Math.floor(a/3))))+1,i=n.length;return o===i?n:o>i?n+new Array(o-i+1).join("0"):o>0?n.slice(0,o)+"."+n.slice(o):"0."+new Array(1-o).join("0")+Ap(e,Math.max(0,t+o-1))[0]},X:e=>Math.round(e).toString(16).toUpperCase(),x:e=>Math.round(e).toString(16)};function Np(e){return e}var Bp,Fp,Up,kp=Array.prototype.map,Gp=["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];function Wp(e){var t,r,n=void 0===e.grouping||void 0===e.thousands?Np:(t=kp.call(e.grouping,Number),r=e.thousands+"",function(e,n){for(var a=e.length,o=[],i=0,s=t[0],l=0;a>0&&s>0&&(l+s+1>n&&(s=Math.max(1,n-l)),o.push(e.substring(a-=s,a+s)),!((l+=s+1)>n));)s=t[i=(i+1)%t.length];return o.reverse().join(r)}),a=void 0===e.currency?"":e.currency[0]+"",o=void 0===e.currency?"":e.currency[1]+"",i=void 0===e.decimal?".":e.decimal+"",s=void 0===e.numerals?Np:function(e){return function(t){return t.replace(/[0-9]/g,(function(t){return e[+t]}))}}(kp.call(e.numerals,String)),l=void 0===e.percent?"%":e.percent+"",c=void 0===e.minus?"−":e.minus+"",u=void 0===e.nan?"NaN":e.nan+"";function d(e){var t=(e=Dp(e)).fill,r=e.align,d=e.sign,f=e.symbol,p=e.zero,g=e.width,m=e.comma,h=e.precision,v=e.trim,y=e.type;"n"===y?(m=!0,y="g"):_p[y]||(void 0===h&&(h=12),v=!0,y="g"),(p||"0"===t&&"="===r)&&(p=!0,t="0",r="=");var b="$"===f?a:"#"===f&&/[boxX]/.test(y)?"0"+y.toLowerCase():"",T="$"===f?o:/[%p]/.test(y)?l:"",C=_p[y],x=/[defgprs%]/.test(y);function S(e){var a,o,l,f=b,S=T;if("c"===y)S=C(e)+S,e="";else{var P=(e=+e)<0||1/e<0;if(e=isNaN(e)?u:C(Math.abs(e),h),v&&(e=function(e){e:for(var t,r=e.length,n=1,a=-1;n0&&(a=0)}return a>0?e.slice(0,a)+e.slice(t+1):e}(e)),P&&0==+e&&"+"!==d&&(P=!1),f=(P?"("===d?d:c:"-"===d||"("===d?"":d)+f,S=("s"===y?Gp[8+Ep/3]:"")+S+(P&&"("===d?")":""),x)for(a=-1,o=e.length;++a(l=e.charCodeAt(a))||l>57){S=(46===l?i+e.slice(a+1):e.slice(a))+S,e=e.slice(0,a);break}}m&&!p&&(e=n(e,1/0));var w=f.length+e.length+S.length,O=w>1)+f+e+S+O.slice(w);break;default:e=O+f+e+S}return s(e)}return h=void 0===h?6:/[gprs]/.test(y)?Math.max(1,Math.min(21,h)):Math.max(0,Math.min(20,h)),S.toString=function(){return e+""},S}return{format:d,formatPrefix:function(e,t){var r=d(((e=Dp(e)).type="f",e)),n=3*Math.max(-8,Math.min(8,Math.floor(Rp(t)/3))),a=Math.pow(10,-n),o=Gp[8+n/3];return function(e){return r(a*e)+o}}}}function zp(e,t,r,n){var a,o=(0,yp.ly)(e,t,r);switch((n=Dp(null==n?",f":n)).type){case"s":var i=Math.max(Math.abs(e),Math.abs(t));return null!=n.precision||isNaN(a=function(e,t){return Math.max(0,3*Math.max(-8,Math.min(8,Math.floor(Rp(t)/3)))-Rp(Math.abs(e)))}(o,i))||(n.precision=a),Up(n,i);case"":case"e":case"g":case"p":case"r":null!=n.precision||isNaN(a=function(e,t){return e=Math.abs(e),t=Math.abs(t)-e,Math.max(0,Rp(t)-Rp(e))+1}(o,Math.max(Math.abs(e),Math.abs(t))))||(n.precision=a-("e"===n.type));break;case"f":case"%":null!=n.precision||isNaN(a=function(e){return Math.max(0,-Rp(Math.abs(e)))}(o))||(n.precision=a-2*("%"===n.type))}return Fp(n)}function jp(){var e=Ip()(Sp,Sp);return e.copy=function(){return t=e,jp().domain(t.domain()).range(t.range()).interpolate(t.interpolate()).clamp(t.clamp()).unknown(t.unknown());var t},bp.apply(e,arguments),function(e){var t=e.domain;return e.ticks=function(e){var r=t();return(0,yp.sd)(r[0],r[r.length-1],null==e?10:e)},e.tickFormat=function(e,r){var n=t();return zp(n[0],n[n.length-1],null==e?10:e,r)},e.nice=function(r){null==r&&(r=10);var n,a,o=t(),i=0,s=o.length-1,l=o[i],c=o[s],u=10;for(c0;){if((a=(0,yp.G9)(l,c,r))===n)return o[i]=l,o[s]=c,t(o);if(a>0)l=Math.floor(l/a)*a,c=Math.ceil(c/a)*a;else{if(!(a<0))break;l=Math.ceil(l*a)/a,c=Math.floor(c*a)/a}n=a}return e},e}(e)}Bp=Wp({thousands:",",grouping:[3],currency:["$",""]}),Fp=Bp.format,Up=Bp.formatPrefix;const Hp=new Date,Kp=new Date;function Zp(e,t,r,n){function a(t){return e(t=0===arguments.length?new Date:new Date(+t)),t}return a.floor=t=>(e(t=new Date(+t)),t),a.ceil=r=>(e(r=new Date(r-1)),t(r,1),e(r),r),a.round=e=>{const t=a(e),r=a.ceil(e);return e-t(t(e=new Date(+e),null==r?1:Math.floor(r)),e),a.range=(r,n,o)=>{const i=[];if(r=a.ceil(r),o=null==o?1:Math.floor(o),!(r0))return i;let s;do{i.push(s=new Date(+r)),t(r,o),e(r)}while(sZp((t=>{if(t>=t)for(;e(t),!r(t);)t.setTime(t-1)}),((e,n)=>{if(e>=e)if(n<0)for(;++n<=0;)for(;t(e,-1),!r(e););else for(;--n>=0;)for(;t(e,1),!r(e););})),r&&(a.count=(t,n)=>(Hp.setTime(+t),Kp.setTime(+n),e(Hp),e(Kp),Math.floor(r(Hp,Kp))),a.every=e=>(e=Math.floor(e),isFinite(e)&&e>0?e>1?a.filter(n?t=>n(t)%e==0:t=>a.count(0,t)%e==0):a:null)),a}const Xp=Zp((()=>{}),((e,t)=>{e.setTime(+e+t)}),((e,t)=>t-e));Xp.every=e=>(e=Math.floor(e),isFinite(e)&&e>0?e>1?Zp((t=>{t.setTime(Math.floor(t/e)*e)}),((t,r)=>{t.setTime(+t+r*e)}),((t,r)=>(r-t)/e)):Xp:null);Xp.range;const qp=1e3,Yp=6e4,$p=36e5,Qp=864e5,Jp=6048e5,eg=2592e6,tg=31536e6,rg=Zp((e=>{e.setTime(e-e.getMilliseconds())}),((e,t)=>{e.setTime(+e+t*qp)}),((e,t)=>(t-e)/qp),(e=>e.getUTCSeconds())),ng=(rg.range,Zp((e=>{e.setTime(e-e.getMilliseconds()-e.getSeconds()*qp)}),((e,t)=>{e.setTime(+e+t*Yp)}),((e,t)=>(t-e)/Yp),(e=>e.getMinutes()))),ag=(ng.range,Zp((e=>{e.setUTCSeconds(0,0)}),((e,t)=>{e.setTime(+e+t*Yp)}),((e,t)=>(t-e)/Yp),(e=>e.getUTCMinutes()))),og=(ag.range,Zp((e=>{e.setTime(e-e.getMilliseconds()-e.getSeconds()*qp-e.getMinutes()*Yp)}),((e,t)=>{e.setTime(+e+t*$p)}),((e,t)=>(t-e)/$p),(e=>e.getHours()))),ig=(og.range,Zp((e=>{e.setUTCMinutes(0,0,0)}),((e,t)=>{e.setTime(+e+t*$p)}),((e,t)=>(t-e)/$p),(e=>e.getUTCHours()))),sg=(ig.range,Zp((e=>e.setHours(0,0,0,0)),((e,t)=>e.setDate(e.getDate()+t)),((e,t)=>(t-e-(t.getTimezoneOffset()-e.getTimezoneOffset())*Yp)/Qp),(e=>e.getDate()-1))),lg=(sg.range,Zp((e=>{e.setUTCHours(0,0,0,0)}),((e,t)=>{e.setUTCDate(e.getUTCDate()+t)}),((e,t)=>(t-e)/Qp),(e=>e.getUTCDate()-1))),cg=(lg.range,Zp((e=>{e.setUTCHours(0,0,0,0)}),((e,t)=>{e.setUTCDate(e.getUTCDate()+t)}),((e,t)=>(t-e)/Qp),(e=>Math.floor(e/Qp))));cg.range;function ug(e){return Zp((t=>{t.setDate(t.getDate()-(t.getDay()+7-e)%7),t.setHours(0,0,0,0)}),((e,t)=>{e.setDate(e.getDate()+7*t)}),((e,t)=>(t-e-(t.getTimezoneOffset()-e.getTimezoneOffset())*Yp)/Jp))}const dg=ug(0),fg=ug(1),pg=ug(2),gg=ug(3),mg=ug(4),hg=ug(5),vg=ug(6);dg.range,fg.range,pg.range,gg.range,mg.range,hg.range,vg.range;function yg(e){return Zp((t=>{t.setUTCDate(t.getUTCDate()-(t.getUTCDay()+7-e)%7),t.setUTCHours(0,0,0,0)}),((e,t)=>{e.setUTCDate(e.getUTCDate()+7*t)}),((e,t)=>(t-e)/Jp))}const bg=yg(0),Tg=yg(1),Cg=yg(2),xg=yg(3),Sg=yg(4),Pg=yg(5),wg=yg(6),Og=(bg.range,Tg.range,Cg.range,xg.range,Sg.range,Pg.range,wg.range,Zp((e=>{e.setDate(1),e.setHours(0,0,0,0)}),((e,t)=>{e.setMonth(e.getMonth()+t)}),((e,t)=>t.getMonth()-e.getMonth()+12*(t.getFullYear()-e.getFullYear())),(e=>e.getMonth()))),Ig=(Og.range,Zp((e=>{e.setUTCDate(1),e.setUTCHours(0,0,0,0)}),((e,t)=>{e.setUTCMonth(e.getUTCMonth()+t)}),((e,t)=>t.getUTCMonth()-e.getUTCMonth()+12*(t.getUTCFullYear()-e.getUTCFullYear())),(e=>e.getUTCMonth()))),Ag=(Ig.range,Zp((e=>{e.setMonth(0,1),e.setHours(0,0,0,0)}),((e,t)=>{e.setFullYear(e.getFullYear()+t)}),((e,t)=>t.getFullYear()-e.getFullYear()),(e=>e.getFullYear())));Ag.every=e=>isFinite(e=Math.floor(e))&&e>0?Zp((t=>{t.setFullYear(Math.floor(t.getFullYear()/e)*e),t.setMonth(0,1),t.setHours(0,0,0,0)}),((t,r)=>{t.setFullYear(t.getFullYear()+r*e)})):null;Ag.range;const Rg=Zp((e=>{e.setUTCMonth(0,1),e.setUTCHours(0,0,0,0)}),((e,t)=>{e.setUTCFullYear(e.getUTCFullYear()+t)}),((e,t)=>t.getUTCFullYear()-e.getUTCFullYear()),(e=>e.getUTCFullYear()));Rg.every=e=>isFinite(e=Math.floor(e))&&e>0?Zp((t=>{t.setUTCFullYear(Math.floor(t.getUTCFullYear()/e)*e),t.setUTCMonth(0,1),t.setUTCHours(0,0,0,0)}),((t,r)=>{t.setUTCFullYear(t.getUTCFullYear()+r*e)})):null;Rg.range;function Eg(e,t,r,n,a,o){const i=[[rg,1,qp],[rg,5,5e3],[rg,15,15e3],[rg,30,3e4],[o,1,Yp],[o,5,3e5],[o,15,9e5],[o,30,18e5],[a,1,$p],[a,3,108e5],[a,6,216e5],[a,12,432e5],[n,1,Qp],[n,2,1728e5],[r,1,Jp],[t,1,eg],[t,3,7776e6],[e,1,tg]];function s(t,r,n){const a=Math.abs(r-t)/n,o=(0,yp.YF)((([,,e])=>e)).right(i,a);if(o===i.length)return e.every((0,yp.ly)(t/tg,r/tg,n));if(0===o)return Xp.every(Math.max((0,yp.ly)(t,r,n),1));const[s,l]=i[a/i[o-1][2][e.toLowerCase(),t])))}function qg(e,t,r){var n=Wg.exec(t.slice(r,r+1));return n?(e.w=+n[0],r+n[0].length):-1}function Yg(e,t,r){var n=Wg.exec(t.slice(r,r+1));return n?(e.u=+n[0],r+n[0].length):-1}function $g(e,t,r){var n=Wg.exec(t.slice(r,r+2));return n?(e.U=+n[0],r+n[0].length):-1}function Qg(e,t,r){var n=Wg.exec(t.slice(r,r+2));return n?(e.V=+n[0],r+n[0].length):-1}function Jg(e,t,r){var n=Wg.exec(t.slice(r,r+2));return n?(e.W=+n[0],r+n[0].length):-1}function em(e,t,r){var n=Wg.exec(t.slice(r,r+4));return n?(e.y=+n[0],r+n[0].length):-1}function tm(e,t,r){var n=Wg.exec(t.slice(r,r+2));return n?(e.y=+n[0]+(+n[0]>68?1900:2e3),r+n[0].length):-1}function rm(e,t,r){var n=/^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(t.slice(r,r+6));return n?(e.Z=n[1]?0:-(n[2]+(n[3]||"00")),r+n[0].length):-1}function nm(e,t,r){var n=Wg.exec(t.slice(r,r+1));return n?(e.q=3*n[0]-3,r+n[0].length):-1}function am(e,t,r){var n=Wg.exec(t.slice(r,r+2));return n?(e.m=n[0]-1,r+n[0].length):-1}function om(e,t,r){var n=Wg.exec(t.slice(r,r+2));return n?(e.d=+n[0],r+n[0].length):-1}function im(e,t,r){var n=Wg.exec(t.slice(r,r+3));return n?(e.m=0,e.d=+n[0],r+n[0].length):-1}function sm(e,t,r){var n=Wg.exec(t.slice(r,r+2));return n?(e.H=+n[0],r+n[0].length):-1}function lm(e,t,r){var n=Wg.exec(t.slice(r,r+2));return n?(e.M=+n[0],r+n[0].length):-1}function cm(e,t,r){var n=Wg.exec(t.slice(r,r+2));return n?(e.S=+n[0],r+n[0].length):-1}function um(e,t,r){var n=Wg.exec(t.slice(r,r+3));return n?(e.L=+n[0],r+n[0].length):-1}function dm(e,t,r){var n=Wg.exec(t.slice(r,r+6));return n?(e.L=Math.floor(n[0]/1e3),r+n[0].length):-1}function fm(e,t,r){var n=zg.exec(t.slice(r,r+1));return n?r+n[0].length:-1}function pm(e,t,r){var n=Wg.exec(t.slice(r));return n?(e.Q=+n[0],r+n[0].length):-1}function gm(e,t,r){var n=Wg.exec(t.slice(r));return n?(e.s=+n[0],r+n[0].length):-1}function mm(e,t){return Hg(e.getDate(),t,2)}function hm(e,t){return Hg(e.getHours(),t,2)}function vm(e,t){return Hg(e.getHours()%12||12,t,2)}function ym(e,t){return Hg(1+sg.count(Ag(e),e),t,3)}function bm(e,t){return Hg(e.getMilliseconds(),t,3)}function Tm(e,t){return bm(e,t)+"000"}function Cm(e,t){return Hg(e.getMonth()+1,t,2)}function xm(e,t){return Hg(e.getMinutes(),t,2)}function Sm(e,t){return Hg(e.getSeconds(),t,2)}function Pm(e){var t=e.getDay();return 0===t?7:t}function wm(e,t){return Hg(dg.count(Ag(e)-1,e),t,2)}function Om(e){var t=e.getDay();return t>=4||0===t?mg(e):mg.ceil(e)}function Im(e,t){return e=Om(e),Hg(mg.count(Ag(e),e)+(4===Ag(e).getDay()),t,2)}function Am(e){return e.getDay()}function Rm(e,t){return Hg(fg.count(Ag(e)-1,e),t,2)}function Em(e,t){return Hg(e.getFullYear()%100,t,2)}function Mm(e,t){return Hg((e=Om(e)).getFullYear()%100,t,2)}function Dm(e,t){return Hg(e.getFullYear()%1e4,t,4)}function Vm(e,t){var r=e.getDay();return Hg((e=r>=4||0===r?mg(e):mg.ceil(e)).getFullYear()%1e4,t,4)}function Lm(e){var t=e.getTimezoneOffset();return(t>0?"-":(t*=-1,"+"))+Hg(t/60|0,"0",2)+Hg(t%60,"0",2)}function _m(e,t){return Hg(e.getUTCDate(),t,2)}function Nm(e,t){return Hg(e.getUTCHours(),t,2)}function Bm(e,t){return Hg(e.getUTCHours()%12||12,t,2)}function Fm(e,t){return Hg(1+lg.count(Rg(e),e),t,3)}function Um(e,t){return Hg(e.getUTCMilliseconds(),t,3)}function km(e,t){return Um(e,t)+"000"}function Gm(e,t){return Hg(e.getUTCMonth()+1,t,2)}function Wm(e,t){return Hg(e.getUTCMinutes(),t,2)}function zm(e,t){return Hg(e.getUTCSeconds(),t,2)}function jm(e){var t=e.getUTCDay();return 0===t?7:t}function Hm(e,t){return Hg(bg.count(Rg(e)-1,e),t,2)}function Km(e){var t=e.getUTCDay();return t>=4||0===t?Sg(e):Sg.ceil(e)}function Zm(e,t){return e=Km(e),Hg(Sg.count(Rg(e),e)+(4===Rg(e).getUTCDay()),t,2)}function Xm(e){return e.getUTCDay()}function qm(e,t){return Hg(Tg.count(Rg(e)-1,e),t,2)}function Ym(e,t){return Hg(e.getUTCFullYear()%100,t,2)}function $m(e,t){return Hg((e=Km(e)).getUTCFullYear()%100,t,2)}function Qm(e,t){return Hg(e.getUTCFullYear()%1e4,t,4)}function Jm(e,t){var r=e.getUTCDay();return Hg((e=r>=4||0===r?Sg(e):Sg.ceil(e)).getUTCFullYear()%1e4,t,4)}function eh(){return"+0000"}function th(){return"%"}function rh(e){return+e}function nh(e){return Math.floor(+e/1e3)}!function(e){Fg=function(e){var t=e.dateTime,r=e.date,n=e.time,a=e.periods,o=e.days,i=e.shortDays,s=e.months,l=e.shortMonths,c=Zg(a),u=Xg(a),d=Zg(o),f=Xg(o),p=Zg(i),g=Xg(i),m=Zg(s),h=Xg(s),v=Zg(l),y=Xg(l),b={a:function(e){return i[e.getDay()]},A:function(e){return o[e.getDay()]},b:function(e){return l[e.getMonth()]},B:function(e){return s[e.getMonth()]},c:null,d:mm,e:mm,f:Tm,g:Mm,G:Vm,H:hm,I:vm,j:ym,L:bm,m:Cm,M:xm,p:function(e){return a[+(e.getHours()>=12)]},q:function(e){return 1+~~(e.getMonth()/3)},Q:rh,s:nh,S:Sm,u:Pm,U:wm,V:Im,w:Am,W:Rm,x:null,X:null,y:Em,Y:Dm,Z:Lm,"%":th},T={a:function(e){return i[e.getUTCDay()]},A:function(e){return o[e.getUTCDay()]},b:function(e){return l[e.getUTCMonth()]},B:function(e){return s[e.getUTCMonth()]},c:null,d:_m,e:_m,f:km,g:$m,G:Jm,H:Nm,I:Bm,j:Fm,L:Um,m:Gm,M:Wm,p:function(e){return a[+(e.getUTCHours()>=12)]},q:function(e){return 1+~~(e.getUTCMonth()/3)},Q:rh,s:nh,S:zm,u:jm,U:Hm,V:Zm,w:Xm,W:qm,x:null,X:null,y:Ym,Y:Qm,Z:eh,"%":th},C={a:function(e,t,r){var n=p.exec(t.slice(r));return n?(e.w=g.get(n[0].toLowerCase()),r+n[0].length):-1},A:function(e,t,r){var n=d.exec(t.slice(r));return n?(e.w=f.get(n[0].toLowerCase()),r+n[0].length):-1},b:function(e,t,r){var n=v.exec(t.slice(r));return n?(e.m=y.get(n[0].toLowerCase()),r+n[0].length):-1},B:function(e,t,r){var n=m.exec(t.slice(r));return n?(e.m=h.get(n[0].toLowerCase()),r+n[0].length):-1},c:function(e,r,n){return P(e,t,r,n)},d:om,e:om,f:dm,g:tm,G:em,H:sm,I:sm,j:im,L:um,m:am,M:lm,p:function(e,t,r){var n=c.exec(t.slice(r));return n?(e.p=u.get(n[0].toLowerCase()),r+n[0].length):-1},q:nm,Q:pm,s:gm,S:cm,u:Yg,U:$g,V:Qg,w:qg,W:Jg,x:function(e,t,n){return P(e,r,t,n)},X:function(e,t,r){return P(e,n,t,r)},y:tm,Y:em,Z:rm,"%":fm};function x(e,t){return function(r){var n,a,o,i=[],s=-1,l=0,c=e.length;for(r instanceof Date||(r=new Date(+r));++s53)return null;"w"in o||(o.w=1),"Z"in o?(a=(n=Ng(Bg(o.y,0,1))).getUTCDay(),n=a>4||0===a?Tg.ceil(n):Tg(n),n=lg.offset(n,7*(o.V-1)),o.y=n.getUTCFullYear(),o.m=n.getUTCMonth(),o.d=n.getUTCDate()+(o.w+6)%7):(a=(n=_g(Bg(o.y,0,1))).getDay(),n=a>4||0===a?fg.ceil(n):fg(n),n=sg.offset(n,7*(o.V-1)),o.y=n.getFullYear(),o.m=n.getMonth(),o.d=n.getDate()+(o.w+6)%7)}else("W"in o||"U"in o)&&("w"in o||(o.w="u"in o?o.u%7:"W"in o?1:0),a="Z"in o?Ng(Bg(o.y,0,1)).getUTCDay():_g(Bg(o.y,0,1)).getDay(),o.m=0,o.d="W"in o?(o.w+6)%7+7*o.W-(a+5)%7:o.w+7*o.U-(a+6)%7);return"Z"in o?(o.H+=o.Z/100|0,o.M+=o.Z%100,Ng(o)):_g(o)}}function P(e,t,r,n){for(var a,o,i=0,s=t.length,l=r.length;i=l)return-1;if(37===(a=t.charCodeAt(i++))){if(a=t.charAt(i++),!(o=C[a in Gg?t.charAt(i++):a])||(n=o(e,r,n))<0)return-1}else if(a!=r.charCodeAt(n++))return-1}return n}return b.x=x(r,b),b.X=x(n,b),b.c=x(t,b),T.x=x(r,T),T.X=x(n,T),T.c=x(t,T),{format:function(e){var t=x(e+="",b);return t.toString=function(){return e},t},parse:function(e){var t=S(e+="",!1);return t.toString=function(){return e},t},utcFormat:function(e){var t=x(e+="",T);return t.toString=function(){return e},t},utcParse:function(e){var t=S(e+="",!0);return t.toString=function(){return e},t}}}(e),Fg.format,Fg.parse,Ug=Fg.utcFormat,kg=Fg.utcParse}({dateTime:"%x, %X",date:"%-m/%-d/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});var ah="%Y-%m-%dT%H:%M:%S.%LZ";Date.prototype.toISOString||Ug(ah);+new Date("2000-01-01T00:00:00.000Z")||kg(ah);var oh=r(64725);function ih(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function sh(e){for(var t=1;t2&&void 0!==arguments[2]?arguments[2]:{renderable:null};Object.assign(t,{},r),ht.default.obj(e,t),t.tmPolyData=Wt.ZP.newInstance(),t.tmMapper=Fs.ZP.newInstance(),t.tmMapper.setInputData(t.tmPolyData),t.tmActor=fc.ZP.newInstance({parentProp:e}),t.tmActor.setMapper(t.tmMapper),ht.default.setGet(e,t,["renderable"]),ht.default.get(e,t,["lastSize","lastAspectRatio","axisTextStyle","tickTextStyle","tmActor","ticks"]),t.forceUpdate=!1,t.lastRedrawTime={},ht.default.obj(t.lastRedrawTime,{mtime:0}),t.lastRebuildTime={},ht.default.obj(t.lastRebuildTime,{mtime:0}),t.lastSize=[-1,-1],t.lastTickBounds=[],function(e,t){t.classHierarchy.push("vtkCubeAxesActorHelper"),e.setRenderable=function(r){t.renderable!==r&&(t.renderable=r,t.tmActor.addTexture(t.renderable.getTmTexture()),t.tmActor.setProperty(r.getProperty()),t.tmActor.setParentProp(r),e.modified())},e.createPolyDataForOneLabel=function(e,r,n,a,o,i,s){var l=t.renderable.get_tmAtlas().get(e);if(l){var c=t.renderable.getTextPolyData().getPoints().getData(),u=t.lastSize;ph[0]=c[3*r],ph[1]=c[3*r+1],ph[2]=c[3*r+2],ot.R3.transformMat4(mh,ph,n),mh[0]+=.1,ot.R3.transformMat4(gh,mh,a),ot.R3.subtract(vh,gh,ph),mh[0]-=.1,mh[1]+=.1,ot.R3.transformMat4(gh,mh,a),ot.R3.subtract(yh,gh,ph);for(var d=0;d<3;d++)vh[d]/=.05*u[0],yh[d]/=.05*u[1];var f=s.ptIdx,p=s.cellIdx;ph[0]=c[3*r],ph[1]=c[3*r+1],ph[2]=c[3*r+2],o[0]<-.5?ot.R3.scale(mh,vh,o[0]*i-l.width):o[0]>.5?ot.R3.scale(mh,vh,o[0]*i):ot.R3.scale(mh,vh,o[0]*i-l.width/2),ot.R3.add(ph,ph,mh),ot.R3.scale(mh,yh,o[1]*i-l.height/2),ot.R3.add(ph,ph,mh),s.points[3*f]=ph[0],s.points[3*f+1]=ph[1],s.points[3*f+2]=ph[2],s.tcoords[2*f]=l.tcoords[0],s.tcoords[2*f+1]=l.tcoords[1],f++,ot.R3.scale(mh,vh,l.width),ot.R3.add(ph,ph,mh),s.points[3*f]=ph[0],s.points[3*f+1]=ph[1],s.points[3*f+2]=ph[2],s.tcoords[2*f]=l.tcoords[2],s.tcoords[2*f+1]=l.tcoords[3],f++,ot.R3.scale(mh,yh,l.height),ot.R3.add(ph,ph,mh),s.points[3*f]=ph[0],s.points[3*f+1]=ph[1],s.points[3*f+2]=ph[2],s.tcoords[2*f]=l.tcoords[4],s.tcoords[2*f+1]=l.tcoords[5],f++,ot.R3.scale(mh,vh,l.width),ot.R3.subtract(ph,ph,mh),s.points[3*f]=ph[0],s.points[3*f+1]=ph[1],s.points[3*f+2]=ph[2],s.tcoords[2*f]=l.tcoords[6],s.tcoords[2*f+1]=l.tcoords[7],f++,s.polys[4*p]=3,s.polys[4*p+1]=f-4,s.polys[4*p+2]=f-3,s.polys[4*p+3]=f-2,p++,s.polys[4*p]=3,s.polys[4*p+1]=f-4,s.polys[4*p+2]=f-2,s.polys[4*p+3]=f-1,s.ptIdx+=4,s.cellIdx+=2}},e.updateTexturePolyData=function(){var r=t.camera.getCompositeProjectionMatrix(t.lastAspectRatio,-1,1);ot._E.transpose(r,r);var n=t.renderable.getTextValues().length,a=4*n,o=2*n,i=new Float64Array(3*a),s=new Uint16Array(4*o),l=new Float32Array(2*a);ot._E.invert(bh,r);for(var c={ptIdx:0,cellIdx:0,polys:s,points:i,tcoords:l},u=0,d=0,f=0,p=t.renderable.getTextPolyData().getPoints().getData(),g=t.renderable.getTextValues();u2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,function(e){return sh({boundsScaleFactor:1.3,camera:null,dataBounds:(0,pa.Z)(Jd.ZP.INIT_BOUNDS),faceVisibilityAngle:8,gridLines:!0,axisLabels:null,axisTitlePixelOffset:35,axisTextStyle:{fontColor:"white",fontStyle:"normal",fontSize:18,fontFamily:"serif"},tickLabelPixelOffset:12,tickTextStyle:{fontColor:"white",fontStyle:"normal",fontSize:14,fontFamily:"serif"}},e)}(r)),fc.ZP.extend(e,t,r),t.lastFacesToDraw=[!1,!1,!1,!1,!1,!1],t.axisLabels=["X-Axis","Y-Axis","Z-Axis"],t.tickCounts=[],t.textValues=[],t.lastTickBounds=[],t.tmCanvas=document.createElement("canvas"),t.tmContext=t.tmCanvas.getContext("2d"),t._tmAtlas=new Map,t.tmTexture=oh.ZP.newInstance(),t.tmTexture.setInterpolate(!1),e.getProperty().setDiffuse(0),e.getProperty().setAmbient(1),t.gridMapper=Fs.ZP.newInstance(),t.polyData=Wt.ZP.newInstance(),t.gridMapper.setInputData(t.polyData),t.gridActor=fc.ZP.newInstance(),t.gridActor.setMapper(t.gridMapper),t.gridActor.setProperty(e.getProperty()),t.gridActor.setParentProp(e),t.textPolyData=Wt.ZP.newInstance(),ht.default.setGet(e,t,["axisTitlePixelOffset","boundsScaleFactor","faceVisibilityAngle","gridLines","tickLabelPixelOffset"]),ht.default.setGetArray(e,t,["dataBounds"],6),ht.default.setGetArray(e,t,["axisLabels"],3),ht.default.get(e,t,["axisTextStyle","tickTextStyle","camera","tmTexture","textValues","textPolyData","tickCounts","gridActor"]),function(e,t){t.classHierarchy.push("vtkCubeAxesActor"),e.setCamera=function(r){t.camera!==r&&(t.cameraModifiedSub&&(t.cameraModifiedSub.unsubscribe(),t.cameraModifiedSub=null),t.camera=r,r&&(t.cameraModifiedSub=r.onModified(e.update)),e.update(),e.modified())},e.computeFacesToDraw=function(){var e=t.camera.getViewMatrix();ot._E.transpose(e,e);for(var r=!1,n=Jd.ZP.getDiagonalLength(t.dataBounds),a=Math.sin(t.faceVisibilityAngle*Math.PI/180),o=0;o<6;o++){var i=!1,s=Math.floor(o/2),l=(s+1)%3,c=(s+2)%3;t.dataBounds[2*l]!==t.dataBounds[2*l+1]&&t.dataBounds[2*c]!==t.dataBounds[2*c+1]&&(ph[s]=t.dataBounds[o]-.1*n*lh[o][s],ph[l]=.5*(t.dataBounds[2*l]+t.dataBounds[2*l+1]),ph[c]=.5*(t.dataBounds[2*c]+t.dataBounds[2*c+1]),ot.R3.transformMat4(mh,ph,e),ph[s]=t.dataBounds[o],ot.R3.transformMat4(hh,ph,e),ot.R3.subtract(mh,hh,mh),ot.R3.normalize(mh,mh),i=mh[2]>a,t.camera.getParallelProjection()||(ot.R3.normalize(hh,hh),i=ot.R3.dot(hh,mh)>a)),i!==t.lastFacesToDraw[o]&&(t.lastFacesToDraw[o]=i,r=!0)}return r},e.updatePolyData=function(e,r,n){var a=0,o=0;a+=8;for(var i=0,s=0;s<12;s++)r[s]>0&&i++;if(o+=i,t.gridLines)for(var l=0;l<6;l++)e[l]&&(a+=2*n[fh[l][0]].length+2*n[fh[l][1]].length,o+=n[fh[l][0]].length+n[fh[l][1]].length);for(var c=new Float64Array(3*a),u=new Uint32Array(3*o),d=0,f=0,p=0;p<2;p++)for(var g=0;g<2;g++)for(var m=0;m<2;m++)c[3*d]=t.dataBounds[m],c[3*d+1]=t.dataBounds[2+g],c[3*d+2]=t.dataBounds[4+p],d++;for(var h=0;h<12;h++)r[h]>0&&(u[3*f]=2,u[3*f+1]=uh[h][0],u[3*f+2]=uh[h][1],f++);if(t.gridLines)for(var v=0;v<6;v++)if(e[v]){for(var y=Math.floor(v/2),b=n[fh[v][0]],T=0;T2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,Ph,r),Tt.extend(e,t,r),t.CubeAxesActorHelper=Sh.newCubeAxesActorHelper(),function(e,t){t.classHierarchy.push("vtkOpenGLCubeAxesActor"),e.buildPass=function(r){r&&(t._openGLRenderer=e.getFirstAncestorOfType("vtkOpenGLRenderer"),t._openGLRenderWindow=t._openGLRenderer.getParent(),t.CubeAxesActorHelper.getRenderable()||t.CubeAxesActorHelper.setRenderable(t.renderable),e.prepareNodes(),e.addMissingNode(t.CubeAxesActorHelper.getTmActor()),e.addMissingNode(t.renderable.getGridActor()),e.removeUnusedNodes())},e.opaquePass=function(e,r){if(e){var n=t._openGLRenderer?t._openGLRenderer.getRenderable().getActiveCamera():null,a=t._openGLRenderer.getTiledSizeAndOrigin();t.CubeAxesActorHelper.updateAPISpecificData([a.usize,a.vsize],n,t._openGLRenderWindow.getRenderable())}}}(e,t)}var Oh=(0,ht.WL)(wh,"vtkOpenGLCubeAxesActor");wt("vtkCubeAxesActor",Oh);var Ih=r(1600),Ah=r(85687),Rh=Ah.ZP.ColorMode,Eh=Ah.ZP.ScalarMode,Mh=Ah.ZP.GetArray;var Dh={static:!1,lookupTable:null,scalarVisibility:!1,scalarRange:[0,1],useLookupTableScalarRange:!1,colorMode:0,scalarMode:0,arrayAccessMode:1,renderTime:0,colorByArrayName:null,transformCoordinate:null,viewSpecificProperties:null,customShaderAttributes:[]};function Vh(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,Dh,r),hc.Z.extend(e,t,r),ht.default.get(e,t,["colorMapColors"]),ht.default.setGet(e,t,["arrayAccessMode","colorByArrayName","colorMode","lookupTable","renderTime","scalarMode","scalarVisibility","static","transformCoordinate","useLookupTableScalarRange","viewSpecificProperties","customShaderAttributes"]),ht.default.setGetArray(e,t,["scalarRange"],2),t.viewSpecificProperties||(t.viewSpecificProperties={}),function(e,t){t.classHierarchy.push("vtkMapper2D"),e.createDefaultLookupTable=function(){t.lookupTable=Ih.ZP.newInstance()},e.getColorModeAsString=function(){return ht.default.enumToString(Rh,t.colorMode)},e.setColorModeToDefault=function(){return e.setColorMode(0)},e.setColorModeToMapScalars=function(){return e.setColorMode(1)},e.setColorModeToDirectScalars=function(){return e.setColorMode(2)},e.getScalarModeAsString=function(){return ht.default.enumToString(Eh,t.scalarMode)},e.setScalarModeToDefault=function(){return e.setScalarMode(0)},e.setScalarModeToUsePointData=function(){return e.setScalarMode(1)},e.setScalarModeToUseCellData=function(){return e.setScalarMode(2)},e.setScalarModeToUsePointFieldData=function(){return e.setScalarMode(3)},e.setScalarModeToUseCellFieldData=function(){return e.setScalarMode(4)},e.setScalarModeToUseFieldData=function(){return e.setScalarMode(5)},e.getAbstractScalars=function(e,r,n,a,o){if(!e||!t.scalarVisibility)return{scalars:null,cellFLag:!1};var i=null,s=!1;if(r===Eh.DEFAULT)(i=e.getPointData().getScalars())||(i=e.getCellData().getScalars(),s=!0);else if(r===Eh.USE_POINT_DATA)i=e.getPointData().getScalars();else if(r===Eh.USE_CELL_DATA)i=e.getCellData().getScalars(),s=!0;else if(r===Eh.USE_POINT_FIELD_DATA){var l=e.getPointData();i=n===Mh.BY_ID?l.getArrayByIndex(a):l.getArrayByName(o)}else if(r===Eh.USE_CELL_FIELD_DATA){var c=e.getCellData();s=!0,i=n===Mh.BY_ID?c.getArrayByIndex(a):c.getArrayByName(o)}else if(r===Eh.USE_FIELD_DATA){var u=e.getFieldData();i=n===Mh.BY_ID?u.getArrayByIndex(a):u.getArrayByName(o)}return{scalars:i,cellFlag:s}},e.getLookupTable=function(){return t.lookupTable||e.createDefaultLookupTable(),t.lookupTable},e.getMTime=function(){var e=t.mtime;if(null!==t.lookupTable){var r=t.lookupTable.getMTime();e=r>e?r:e}return e},e.mapScalars=function(r,n){var a=e.getAbstractScalars(r,t.scalarMode,t.arrayAccessMode,t.arrayId,t.colorByArrayName).scalars;if(a){var o="".concat(e.getMTime()).concat(a.getMTime()).concat(n);if(t.colorBuildString!==o){t.useLookupTableScalarRange||e.getLookupTable().setRange(t.scalarRange[0],t.scalarRange[1]);var i=e.getLookupTable();i&&(i.build(),t.colorMapColors=i.mapScalars(a,t.colorMode,t.fieldDataTupleId)),t.colorBuildString="".concat(e.getMTime()).concat(a.getMTime()).concat(n)}}else t.colorMapColors=null}}(e,t)}var Lh={newInstance:ht.default.newInstance(Vh,"vtkMapper2D"),extend:Vh},_h="//VTK::System::Dec\n\n/*=========================================================================\n\n Program: Visualization Toolkit\n Module: vtkPolyData2DFS.glsl\n\n Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen\n All rights reserved.\n See Copyright.txt or http://www.kitware.com/Copyright.htm for details.\n\n This software is distributed WITHOUT ANY WARRANTY; without even\n the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR\n PURPOSE. See the above copyright notice for more information.\n\n=========================================================================*/\n\nuniform int PrimitiveIDOffset;\n\n// Texture coordinates\n//VTK::TCoord::Dec\n\n// Scalar coloring\n//VTK::Color::Dec\n\n// Depth Peeling\n//VTK::DepthPeeling::Dec\n\n// picking support\n//VTK::Picking::Dec\n\n// the output of this shader\n//VTK::Output::Dec\n\n// Apple Bug\n//VTK::PrimID::Dec\n\nvoid main()\n{\n // Apple Bug\n //VTK::PrimID::Impl\n\n //VTK::Color::Impl\n //VTK::TCoord::Impl\n\n //VTK::DepthPeeling::Impl\n //VTK::Picking::Impl\n\n if (gl_FragData[0].a <= 0.0)\n {\n discard;\n }\n}\n",Nh="//VTK::System::Dec\n\n/*=========================================================================\n\n Program: Visualization Toolkit\n Module: vtkPolyData2DVS.glsl\n\n Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen\n All rights reserved.\n See Copyright.txt or http://www.kitware.com/Copyright.htm for details.\n\n This software is distributed WITHOUT ANY WARRANTY; without even\n the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR\n PURPOSE. See the above copyright notice for more information.\n\n=========================================================================*/\n\n// all variables that represent positions or directions have a suffix\n// indicating the coordinate system they are in. The possible values are\n// MC - Model Coordinates\n// WC - WC world coordinates\n// VC - View Coordinates\n// DC - Display Coordinates\n\nin vec4 vertexWC;\n\n// frag position in VC\n//VTK::PositionVC::Dec\n\n// material property values\n//VTK::Color::Dec\n\n// Texture coordinates\n//VTK::TCoord::Dec\n\n// Apple Bug\n//VTK::PrimID::Dec\n\nuniform mat4 WCVCMatrix; // World to view matrix\n\nvoid main()\n{\n // Apple Bug\n //VTK::PrimID::Impl\n\n gl_Position = WCVCMatrix*vertexWC;\n\n //VTK::TCoord::Impl\n\n //VTK::Color::Impl\n\n //VTK::PositionVC::Impl\n}\n",Bh={BACKGROUND:0,FOREGROUND:1},Fh={DisplayLocation:Bh},Uh=Er.primTypes,kh=Lh.ScalarMode,Gh=ht.E0,Wh={type:"StartEvent"},zh={type:"EndEvent"};var jh={context:null,VBOBuildTime:0,VBOBuildString:null,primitives:null,primTypes:null,shaderRebuildString:null};function Hh(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,jh,r),Tt.extend(e,t,r),Qr.implementReplaceShaderCoincidentOffset(e,t,r),Qr.implementBuildShadersWithReplacements(e,t,r),t.primitives=[],t.primTypes=Uh,t.tmpMat4=ot._E.identity(new Float64Array(16));for(var n=Uh.Start;ne.getAttributeUpdateTime().getMTime()||e.getShaderSourceTime().getMTime()>e.getAttributeUpdateTime().getMTime())){t.renderable.getCustomShaderAttributes().forEach((function(r,n){e.getProgram().isAttributeUsed("".concat(r,"MC"))&&(e.getVAO().addAttributeArray(e.getProgram(),e.getCABO(),"".concat(r,"MC"),e.getCABO().getCustomData()[n].offset,e.getCABO().getStride(),t.context.FLOAT,e.getCABO().getCustomData()[n].components,!1)||Gh("Error setting ".concat(r,"MC in shader VAO.")))})),e.getProgram().isAttributeUsed("tcoordMC")&&e.getCABO().getTCoordOffset()?e.getVAO().addAttributeArray(e.getProgram(),e.getCABO(),"tcoordMC",e.getCABO().getTCoordOffset(),e.getCABO().getStride(),t.context.FLOAT,e.getCABO().getTCoordComponents(),!1)||Gh("Error setting tcoordMC in shader VAO."):e.getVAO().removeAttributeArray("tcoordMC"),t.internalColorTexture&&e.getProgram().isUniformUsed("texture1")&&e.getProgram().setUniformi("texture1",t.internalColorTexture.getTextureUnit());var a=t.openGLActor2D.getActiveTextures();if(a)for(var o=0;o=c[0]?s[0]:c[0],u[1]=s[1]>=c[1]?s[1]:c[1],u[2]=s[2]<=c[2]?s[2]:c[2],u[3]=s[3]<=c[3]?s[3]:c[3],!(u[0]>=u[2]||u[1]>=u[3])){i[0]=(0,Mr.K)(i[0]*(u[2]-u[0])/(s[2]-s[0])),i[1]=(0,Mr.K)(i[1]*(u[3]-u[1])/(s[3]-s[1]));var d=t._openGLRenderer.getParent().getSize(),f=(0,Mr.K)(l[0]-(u[0]-s[0])*d[0]),p=(0,Mr.K)(l[1]-(u[1]-s[1])*d[1]),g=-f,m=-f+i[0],h=-p,v=-p+i[1];g===m&&(m=g+1),h===v&&(v=h+1);var y,b,T,C=ot._E.identity(new Float64Array(16));C[0]=2/(m-g),C[5]=2/(v-h),C[3]=-1*(m+g)/(m-g),C[7]=-1*(v+h)/(v-h),C[10]=0,C[11]=n.getProperty().getDisplayLocation()===Bh.FOREGROUND?-1:1,C[15]=1,ot._E.transpose(C,C),a.setUniformMatrix("WCVCMatrix",(y=[C,o],b=ot._E,T=t.tmpMat4,b.identity(T),y.reduce((function(e,t,r){return 0===r?t?b.copy(e,t):b.identity(e):t?b.multiply(e,e,t):e}),T)))}}}(e,t)}var Kh=(0,ht.WL)(Hh,"vtkOpenGLPolyDataMapper2D");function Zh(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function Xh(e){for(var t=1;t1?s.fontSize=Math.max(20*o,10):s.fontSize=Math.max(16*o,10);var l=e.updateTextureAtlas();e.setTopTitle(!1);var c=e.getBoxSizeByReference();if(e.getLastAspectRatio()>1)e.setTickLabelPixelOffset(.3*s.fontSize),l.titleWidth<=l.tickWidth+e.getTickLabelPixelOffset()+.8*s.fontSize?(e.setTopTitle(!0),e.setAxisTitlePixelOffset(.2*s.fontSize),c[0]=2*(l.tickWidth+e.getTickLabelPixelOffset()+.8*s.fontSize)/r[0],e.setBoxPosition([.98-c[0],-.92])):(e.setAxisTitlePixelOffset(.2*s.fontSize),c[0]=2*(l.titleHeight+e.getAxisTitlePixelOffset()+l.tickWidth+e.getTickLabelPixelOffset()+.8*s.fontSize)/r[0],e.setBoxPosition([.99-c[0],-.92])),c[1]=Math.max(1.2,Math.min(1.84/a,1.84));else{e.setAxisTitlePixelOffset(1.2*s.fontSize),e.setTickLabelPixelOffset(.1*s.fontSize);var u=2*(.8*s.fontSize+l.titleHeight+e.getAxisTitlePixelOffset())/r[1],d=2*l.tickWidth/r[0];c[0]=Math.min(1.9,Math.max(1.4,1.4*d*(e.getTicks().length+3))),c[1]=u,e.setBoxPosition([-.5*c[0],-.97])}e.recomputeBarSegments(l)}}function Qh(e,t){return function(e){var t=e.getLastTickBounds(),r=jp().domain([t[0],t[1]]),n=r.ticks(5),a=r.tickFormat(5);e.setTicks(n),e.setTickStrings(n.map(a))}}var Jh=ht.default.newInstance((function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{renderable:null};Object.assign(t,{},r),ht.default.obj(e,t),ht.default.setGet(e,t,["axisTitlePixelOffset","tickLabelPixelOffset","renderable","topTitle","ticks","tickStrings"]),ht.default.get(e,t,["lastSize","lastAspectRatio","lastTickBounds","axisTextStyle","tickTextStyle","barActor","tmActor"]),ht.default.getArray(e,t,["boxPosition","boxSize"]),ht.default.setArray(e,t,["boxPosition","boxSize"],2),t.forceUpdate=!1,t.lastRebuildTime={},ht.default.obj(t.lastRebuildTime,{mtime:0}),t.lastSize=[-1,-1],t.tmCanvas=document.createElement("canvas"),t.tmContext=t.tmCanvas.getContext("2d"),t._tmAtlas=new Map,t.barMapper=Fs.ZP.newInstance(),t.barMapper.setInterpolateScalarsBeforeMapping(!0),t.barMapper.setUseLookupTableScalarRange(!0),t.polyData=Wt.ZP.newInstance(),t.barMapper.setInputData(t.polyData),t.barActor=fc.ZP.newInstance(),t.barActor.setMapper(t.barMapper),t.tmPolyData=Wt.ZP.newInstance(),t.tmMapper=Fs.ZP.newInstance(),t.tmMapper.setInputData(t.tmPolyData),t.tmTexture=oh.ZP.newInstance({resizable:!0}),t.tmTexture.setInterpolate(!1),t.tmActor=fc.ZP.newInstance({parentProp:e}),t.tmActor.setMapper(t.tmMapper),t.tmActor.addTexture(t.tmTexture),t.barPosition=[0,0],t.barSize=[0,0],t.boxPosition=[.88,-.92],t.boxSize=[.1,1.1],t.lastTickBounds=[],function(e,t){t.classHierarchy.push("vtkScalarBarActorHelper"),e.setRenderable=function(r){t.renderable!==r&&(t.renderable=r,t.barActor.setProperty(r.getProperty()),t.barActor.setParentProp(r),t.barActor.setCoordinateSystemToDisplay(),t.tmActor.setProperty(r.getProperty()),t.tmActor.setParentProp(r),t.tmActor.setCoordinateSystemToDisplay(),t.generateTicks=r.generateTicks,t.axisTextStyle=Xh({},r.getAxisTextStyle()),t.tickTextStyle=Xh({},r.getTickTextStyle()),e.modified())},e.updateAPISpecificData=function(r,n,a){t.lastSize[0]===r[0]&&t.lastSize[1]===r[1]||(t.lastSize[0]=r[0],t.lastSize[1]=r[1],t.lastAspectRatio=r[0]/r[1],t.forceUpdate=!0);var o=t.renderable.getScalarsToColors();if(o&&t.renderable.getVisibility()&&(t.barMapper.setLookupTable(o),t.camera=n,t.renderWindow=a,t.forceUpdate||Math.max(o.getMTime(),e.getMTime(),t.renderable.getMTime())>t.lastRebuildTime.getMTime())){var i=o.getMappingRange();if(t.lastTickBounds=(0,pa.Z)(i),t.renderable.getGenerateTicks()(e),t.renderable.getAutomated())t.renderable.getAutoLayout()(e);else{t.axisTextStyle=Xh({},t.renderable.getAxisTextStyle()),t.tickTextStyle=Xh({},t.renderable.getTickTextStyle()),t.barPosition=(0,pa.Z)(t.renderable.getBarPosition()),t.barSize=(0,pa.Z)(t.renderable.getBarSize()),t.boxPosition=(0,pa.Z)(t.renderable.getBoxPosition()),t.boxSize=(0,pa.Z)(t.renderable.getBoxSize()),t.axisTitlePixelOffset=t.renderable.getAxisTitlePixelOffset(),t.tickLabelPixelOffset=t.renderable.getTickLabelPixelOffset();var s=e.updateTextureAtlas();e.recomputeBarSegments(s)}e.updatePolyDataForLabels(),e.updatePolyDataForBarSegments(),t.lastRebuildTime.modified(),t.forceUpdate=!1}},e.updateTextureAtlas=function(){t.tmContext.textBaseline="bottom",t.tmContext.textAlign="left";var r={},n=new Map,a=0,o=1;Yh(t.tmContext,t.axisTextStyle);var i=t.tmContext.measureText(t.renderable.getAxisLabel()),s={height:i.actualBoundingBoxAscent+2,startingHeight:o,width:i.width+2,textStyle:t.axisTextStyle};n.set(t.renderable.getAxisLabel(),s),o+=s.height,a=s.width,r.titleWidth=s.width,r.titleHeight=s.height,r.tickWidth=0,r.tickHeight=0,Yh(t.tmContext,t.tickTextStyle);for(var l=[].concat((0,pa.Z)(e.getTickStrings()),["NaN","Below","Above"]),c=0;ct.boxSize[0];var r=2*e.tickHeight/t.lastSize[1],n=[1,1];if(t.vertical){var a=2*(e.tickWidth+t.tickLabelPixelOffset)/t.lastSize[0];if(t.topTitle){var o=2*(e.titleHeight+t.axisTitlePixelOffset)/t.lastSize[1];t.barSize[0]=t.boxSize[0]-a,t.barSize[1]=t.boxSize[1]-o}else{var i=2*(e.titleHeight+t.axisTitlePixelOffset)/t.lastSize[0];t.barSize[0]=t.boxSize[0]-i-a,t.barSize[1]=t.boxSize[1]}t.barPosition[0]=t.boxPosition[0]+a,t.barPosition[1]=t.boxPosition[1],n[1]=r}else{var s=(2*e.tickWidth-8)/t.lastSize[0],l=2*(e.titleHeight+t.axisTitlePixelOffset)/t.lastSize[1];t.barSize[0]=t.boxSize[0],t.barPosition[0]=t.boxPosition[0],t.barSize[1]=t.boxSize[1]-l,t.barPosition[1]=t.boxPosition[1],n[0]=s}return n},e.recomputeBarSegments=function(r){var n,a,o,i,s=e.computeBarSize(r);t.barSegments=[];var l=[0,0],c=t.vertical?1:0,u=t.vertical?.01:.02;function d(e,r){t.barSegments.push({corners:[[].concat(l),[l[0]+s[0],l[1]],[l[0]+s[0],l[1]+s[1]],[l[0],l[1]+s[1]]],scalars:r,title:e}),l[c]+=s[c]+u}t.renderable.getDrawNanAnnotation()&&t.renderable.getScalarsToColors().getNanColor()&&d("NaN",[NaN,NaN,NaN,NaN]),t.renderable.getDrawBelowRangeSwatch()&&null!==(n=(a=t.renderable.getScalarsToColors()).getUseBelowRangeColor)&&void 0!==n&&n.call(a)&&d("Below",[-.1,-.1,-.1,-.1]);var f=null===(o=(i=t.renderable.getScalarsToColors()).getUseAboveRangeColor)||void 0===o?void 0:o.call(i);l[c]+=u;var p=s[c];s[c]=f?1-2*u-s[c]-l[c]:1-u-l[c],d("ticks",t.vertical?[0,0,.995,.995]:[0,.995,.995,0]),t.renderable.getDrawAboveRangeSwatch()&&f&&(s[c]=p,l[c]+=u,d("Above",[1.1,1.1,1.1,1.1]))};var r=new Float64Array(3);e.createPolyDataForOneLabel=function(e,n,a,o,i,s){var l=t._tmAtlas.get(e);if(l){var c=s.ptIdx,u=s.cellIdx;r[0]=(.5*n[0]+.5)*t.lastSize[0],r[1]=(.5*n[1]+.5)*t.lastSize[1],r[2]=n[2],r[0]+=i[0],r[1]+=i[1];var d=[],f="vertical"===o?[1,0]:[0,1];"vertical"===o?(d[0]=l.width,d[1]=-l.height,"middle"===a[0]?r[1]-=l.width/2:"right"===a[0]&&(r[1]-=l.width),"middle"===a[1]?r[0]+=l.height/2:"top"===a[1]&&(r[0]+=l.height)):(d[0]=l.width,d[1]=l.height,"middle"===a[0]?r[0]-=l.width/2:"right"===a[0]&&(r[0]-=l.width),"middle"===a[1]?r[1]-=l.height/2:"top"===a[1]&&(r[1]-=l.height)),s.points[3*c]=r[0],s.points[3*c+1]=r[1],s.points[3*c+2]=r[2],s.tcoords[2*c]=l.tcoords[0],s.tcoords[2*c+1]=l.tcoords[1],c++,r[f[0]]+=d[0],s.points[3*c]=r[0],s.points[3*c+1]=r[1],s.points[3*c+2]=r[2],s.tcoords[2*c]=l.tcoords[2],s.tcoords[2*c+1]=l.tcoords[3],c++,r[f[1]]+=d[1],s.points[3*c]=r[0],s.points[3*c+1]=r[1],s.points[3*c+2]=r[2],s.tcoords[2*c]=l.tcoords[4],s.tcoords[2*c+1]=l.tcoords[5],c++,r[f[0]]-=d[0],s.points[3*c]=r[0],s.points[3*c+1]=r[1],s.points[3*c+2]=r[2],s.tcoords[2*c]=l.tcoords[6],s.tcoords[2*c+1]=l.tcoords[7],c++,s.polys[4*u]=3,s.polys[4*u+1]=c-4,s.polys[4*u+2]=c-3,s.polys[4*u+3]=c-2,u++,s.polys[4*u]=3,s.polys[4*u+1]=c-4,s.polys[4*u+2]=c-2,s.polys[4*u+3]=c-1,s.ptIdx+=4,s.cellIdx+=2}};var n=new Float64Array(3);e.updatePolyDataForLabels=function(){var r=e.getTickStrings().length+t.barSegments.length,a=4*r,o=2*r,i=new Float64Array(3*a),s=new Uint16Array(4*o),l=new Float32Array(2*a),c={ptIdx:0,cellIdx:0,polys:s,points:i,tcoords:l},u=t.vertical?0:1,d=t.vertical?1:0;n[2]=-.99;var f=t.vertical?["right","middle"]:["middle","bottom"],p=[0,1],g=[0,0];t.vertical?(g[0]=-t.tickLabelPixelOffset,t.topTitle?(n[0]=t.boxPosition[0]+.5*t.boxSize[0],n[1]=t.barPosition[1]+t.barSize[1],e.createPolyDataForOneLabel(t.renderable.getAxisLabel(),n,["middle","bottom"],"horizontal",[0,t.axisTitlePixelOffset],c)):(n[0]=t.barPosition[0]+t.barSize[0],n[1]=t.barPosition[1]+.5*t.barSize[1],e.createPolyDataForOneLabel(t.renderable.getAxisLabel(),n,["middle","top"],"vertical",[t.axisTitlePixelOffset,0],c)),p=[-1,0]):(g[1]=t.tickLabelPixelOffset,n[0]=t.barPosition[0]+.5*t.barSize[0],n[1]=t.barPosition[1]+t.barSize[1],e.createPolyDataForOneLabel(t.renderable.getAxisLabel(),n,["middle","bottom"],"horizontal",[0,t.axisTitlePixelOffset],c)),n[u]=t.barPosition[u]+(.5*p[u]+.5)*t.barSize[u],n[d]=t.barPosition[d]+.5*t.barSize[d];for(var m=null,h=0;h2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,function(e){return Xh({automated:!0,autoLayout:null,axisLabel:"Scalar Value",barPosition:[0,0],barSize:[0,0],boxPosition:[.88,-.92],boxSize:[.1,1.1],scalarToColors:null,axisTitlePixelOffset:36,axisTextStyle:{fontColor:"white",fontStyle:"normal",fontSize:18,fontFamily:"serif"},tickLabelPixelOffset:14,tickTextStyle:{fontColor:"white",fontStyle:"normal",fontSize:14,fontFamily:"serif"},generateTicks:null,drawNanAnnotation:!0,drawBelowRangeSwatch:!0,drawAboveRangeSwatch:!0},e)}(r)),t.autoLayout||(t.autoLayout=$h(0,t)),t.generateTicks||(t.generateTicks=Qh()),fc.ZP.extend(e,t,r),e.getProperty().setDiffuse(0),e.getProperty().setAmbient(1),ht.default.setGet(e,t,["automated","autoLayout","axisTitlePixelOffset","axisLabel","scalarsToColors","tickLabelPixelOffset","generateTicks","drawNanAnnotation","drawBelowRangeSwatch","drawAboveRangeSwatch"]),ht.default.get(e,t,["axisTextStyle","tickTextStyle"]),ht.default.getArray(e,t,["barPosition","barSize","boxPosition","boxSize"]),ht.default.setArray(e,t,["barPosition","barSize","boxPosition","boxSize"],2),function(e,t){t.classHierarchy.push("vtkScalarBarActor"),e.setTickTextStyle=function(r){t.tickTextStyle=Xh(Xh({},t.tickTextStyle),r),e.modified()},e.setAxisTextStyle=function(r){t.axisTextStyle=Xh(Xh({},t.axisTextStyle),r),e.modified()},e.resetAutoLayoutToDefault=function(){e.setAutoLayout($h(0,t))},e.resetGenerateTicksToDefault=function(){e.setGenerateTicks(Qh())}}(e,t)}var tv={newInstance:ht.default.newInstance(ev,"vtkScalarBarActor"),extend:ev,newScalarBarActorHelper:Jh};var rv={};function nv(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,rv,r),Tt.extend(e,t,r),t.scalarBarActorHelper=tv.newScalarBarActorHelper(),function(e,t){t.classHierarchy.push("vtkOpenGLScalarBarActor"),e.buildPass=function(r){r&&(t._openGLRenderer=e.getFirstAncestorOfType("vtkOpenGLRenderer"),t._openGLRenderWindow=t._openGLRenderer.getParent(),t.scalarBarActorHelper.getRenderable()||t.scalarBarActorHelper.setRenderable(t.renderable),e.prepareNodes(),e.addMissingNode(t.scalarBarActorHelper.getBarActor()),e.addMissingNode(t.scalarBarActorHelper.getTmActor()),e.removeUnusedNodes())},e.opaquePass=function(e,r){if(e){var n=t._openGLRenderer?t._openGLRenderer.getRenderable().getActiveCamera():null,a=t._openGLRenderer.getTiledSizeAndOrigin();t.scalarBarActorHelper.updateAPISpecificData([a.usize,a.vsize],n,t._openGLRenderWindow.getRenderable())}}}(e,t)}var av=(0,ht.WL)(nv,"vtkOpenGLScalarBarActor");wt("vtkScalarBarActor",av);var ov=Us.ZP.CoordinateSystem;var iv={keyMatricesTime:null,keyMatrices:null,propID:void 0,bufferShift:void 0};function sv(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,iv,r),Tt.extend(e,t,r),t.keyMatricesTime={},ht.default.obj(t.keyMatricesTime,{mtime:0}),t.keyMatrices={normalMatrix:new Float64Array(16),bcwc:new Float64Array(16),bcsc:new Float64Array(16)},ht.default.get(e,t,["propID","keyMatricesTime"]),t.bufferShift=[0,0,0,0],function(e,t){t.classHierarchy.push("vtkWebGPUActor"),e.buildPass=function(r){r&&(t.WebGPURenderer=e.getFirstAncestorOfType("vtkWebGPURenderer"),t.WebGPURenderWindow=t.WebGPURenderer.getFirstAncestorOfType("vtkWebGPURenderWindow"),void 0===t.propID&&(t.propID=t.WebGPURenderWindow.getUniquePropID()),e.prepareNodes(),e.addMissingNode(t.renderable.getMapper()),e.removeUnusedNodes())},e.traverseOpaquePass=function(r){t.renderable&&t.renderable.getNestedVisibility()&&t.renderable.getIsOpaque()&&(!t.WebGPURenderer.getSelector()||t.renderable.getNestedPickable())&&(e.apply(r,!0),t.children[0]&&t.children[0].traverse(r),e.apply(r,!1))},e.traverseTranslucentPass=function(r){!t.renderable||!t.renderable.getNestedVisibility()||t.renderable.getIsOpaque()||t.WebGPURenderer.getSelector()&&!t.renderable.getNestedPickable()||(e.apply(r,!0),t.children[0]&&t.children[0].traverse(r),e.apply(r,!1))},e.queryPass=function(e,r){if(e){if(!t.renderable||!t.renderable.getVisibility())return;t.renderable.getIsOpaque()?r.incrementOpaqueActorCount():r.incrementTranslucentActorCount()}},e.getBufferShift=function(r){return e.getKeyMatrices(r),t.bufferShift},e.getKeyMatrices=function(e){if(Math.max(t.renderable.getMTime(),e.getStabilizedTime())>t.keyMatricesTime.getMTime()){t.renderable.computeMatrix();var r=t.renderable.getMatrix();t.bufferShift[0]=r[3],t.bufferShift[1]=r[7],t.bufferShift[2]=r[11];var n=e.getStabilizedCenterByReference();t.renderable.getCoordinateSystem()===ov.WORLD&&(t.bufferShift[0]-=n[0],t.bufferShift[1]-=n[1],t.bufferShift[2]-=n[2]),ot._E.transpose(t.keyMatrices.bcwc,r),t.renderable.getIsIdentity()?ot._E.identity(t.keyMatrices.normalMatrix):(ot._E.copy(t.keyMatrices.normalMatrix,t.keyMatrices.bcwc),t.keyMatrices.normalMatrix[3]=0,t.keyMatrices.normalMatrix[7]=0,t.keyMatrices.normalMatrix[11]=0,ot._E.invert(t.keyMatrices.normalMatrix,t.keyMatrices.normalMatrix),ot._E.transpose(t.keyMatrices.normalMatrix,t.keyMatrices.normalMatrix)),ot._E.translate(t.keyMatrices.bcwc,t.keyMatrices.bcwc,[-t.bufferShift[0],-t.bufferShift[1],-t.bufferShift[2]]),t.renderable.getCoordinateSystem()===ov.WORLD?ot._E.translate(t.keyMatrices.bcsc,t.keyMatrices.bcwc,[-n[0],-n[1],-n[2]]):ot._E.copy(t.keyMatrices.bcsc,t.keyMatrices.bcwc),t.keyMatricesTime.modified()}return t.keyMatrices}}(e,t)}var lv=ht.default.newInstance(sv);Qn("vtkActor",lv);var cv=Us.ZP.CoordinateSystem;var uv={keyMatricesTime:null,keyMatrices:null,propID:void 0,bufferShift:void 0};function dv(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,uv,r),Tt.extend(e,t,r),t.keyMatricesTime={},ht.default.obj(t.keyMatricesTime,{mtime:0}),t.keyMatrices={normalMatrix:new Float64Array(16),bcwc:new Float64Array(16),bcsc:new Float64Array(16)},ht.default.get(e,t,["propID","keyMatricesTime"]),t.bufferShift=[0,0,0,0],function(e,t){t.classHierarchy.push("vtkWebGPUActor2D"),e.buildPass=function(r){r&&(t.WebGPURenderer=e.getFirstAncestorOfType("vtkWebGPURenderer"),t.WebGPURenderWindow=t.WebGPURenderer.getFirstAncestorOfType("vtkWebGPURenderWindow"),void 0===t.propID&&(t.propID=t.WebGPURenderWindow.getUniquePropID()),e.prepareNodes(),e.addMissingNode(t.renderable.getMapper()),e.removeUnusedNodes())},e.traverseOpaquePass=function(r){t.renderable&&t.renderable.getNestedVisibility()&&t.renderable.getIsOpaque()&&(!t.WebGPURenderer.getSelector()||t.renderable.getNestedPickable())&&(e.apply(r,!0),t.children[0]&&t.children[0].traverse(r),e.apply(r,!1))},e.traverseTranslucentPass=function(r){!t.renderable||!t.renderable.getNestedVisibility()||t.renderable.getIsOpaque()||t.WebGPURenderer.getSelector()&&!t.renderable.getNestedPickable()||(e.apply(r,!0),t.children[0]&&t.children[0].traverse(r),e.apply(r,!1))},e.queryPass=function(e,r){if(e){if(!t.renderable||!t.renderable.getVisibility())return;t.renderable.getIsOpaque()?r.incrementOpaqueActorCount():r.incrementTranslucentActorCount()}},e.getBufferShift=function(r){return e.getKeyMatrices(r),t.bufferShift},e.getKeyMatrices=function(e){if(Math.max(t.renderable.getMTime(),e.getStabilizedTime())>t.keyMatricesTime.getMTime()){t.bufferShift[0]=0,t.bufferShift[1]=0,t.bufferShift[2]=0;var r=e.getStabilizedCenterByReference();t.renderable.getCoordinateSystem()===cv.WORLD&&(t.bufferShift[0]-=r[0],t.bufferShift[1]-=r[1],t.bufferShift[2]-=r[2]),ot._E.identity(t.keyMatrices.bcwc),ot._E.identity(t.keyMatrices.normalMatrix),ot._E.translate(t.keyMatrices.bcwc,t.keyMatrices.bcwc,[-t.bufferShift[0],-t.bufferShift[1],-t.bufferShift[2]]),t.renderable.getCoordinateSystem()===cv.WORLD?ot._E.translate(t.keyMatrices.bcsc,t.keyMatrices.bcwc,[-r[0],-r[1],-r[2]]):ot._E.copy(t.keyMatrices.bcsc,t.keyMatrices.bcwc),t.keyMatricesTime.modified()}return t.keyMatrices}}(e,t)}var fv=ht.default.newInstance(dv);Qn("vtkActor2D",fv);var pv={};function gv(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,pv,r),Tt.extend(e,t,r),t.CubeAxesActorHelper=Sh.newCubeAxesActorHelper(),function(e,t){t.classHierarchy.push("vtkWebGPUCubeAxesActor"),e.buildPass=function(r){r&&(t.WebGPURenderer=e.getFirstAncestorOfType("vtkWebGPURenderer"),t.WebGPURenderWindow=t.WebGPURenderer.getParent(),t.CubeAxesActorHelper.getRenderable()||t.CubeAxesActorHelper.setRenderable(t.renderable),e.prepareNodes(),e.addMissingNode(t.CubeAxesActorHelper.getTmActor()),e.addMissingNode(t.renderable.getGridActor()),e.removeUnusedNodes())},e.opaquePass=function(e,r){if(e){var n=t.WebGPURenderer?t.WebGPURenderer.getRenderable().getActiveCamera():null,a=t.WebGPURenderer.getTiledSizeAndOrigin();t.CubeAxesActorHelper.updateAPISpecificData([a.usize,a.vsize],n,t.WebGPURenderWindow.getRenderable())}}}(e,t)}var mv=(0,ht.WL)(gv,"vtkWebGPUCubeAxesActor");function hv(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}Qn("vtkCubeAxesActor",mv);var vv=Fh.DisplayLocation;var yv={color:[1,1,1],opacity:1,pointSize:1,lineWidth:1,representation:ur.hX.SURFACE,displayLocation:vv.FOREGROUND};function bv(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,yv,r),ht.default.obj(e,t),ht.default.setGet(e,t,["opacity","lineWidth","pointSize","displayLocation","representation"]),ht.default.setGetArray(e,t,["color"],3),function(e,t){t.classHierarchy.push("vtkProperty2D"),e.setDisplayLocationToBackground=function(){return e.setDisplayLocation(vv.BACKGROUND)},e.setDisplayLocationToForeground=function(){return e.setDisplayLocation(vv.FOREGROUND)},e.setRepresentationToWireframe=function(){return e.setRepresentation(ur.hX.WIREFRAME)},e.setRepresentationToSurface=function(){return e.setRepresentation(ur.hX.SURFACE)},e.setRepresentationToPoints=function(){return e.setRepresentation(ur.hX.POINTS)},e.getRepresentationAsString=function(){return ht.default.enumToString(ur.hX,t.representation)}}(e,t)}var Tv=function(e){for(var t=1;t=0}var Av={is2D:!1,cellArray:null,currentInput:null,cellOffset:0,primitiveType:0,colorTexture:null,renderEncoder:null,textures:null};function Rv(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,Av,r),Aa.extend(e,t,r),t.fragmentShaderTemplate='\nstruct PBRData {\n diffuse: vec3,\n specular: vec3,\n}\n\n// Dot product with the max already in it\nfn mdot(a: vec3, b: vec3) -> f32 {\n return max(0.0, dot(a, b));\n}\n// Dot product with a max in it that does not allow for negative values\n// Physically based rendering is accurate as long as normals are accurate,\n// however this is pretty often not the case. In order to prevent negative\n// values from ruining light calculations and creating zones of zero light,\n// this remapping is used, which smoothly clamps the dot product between\n// zero and one while still maintaining a good amount of accuracy.\nfn cdot(a: vec3, b: vec3) -> f32 {\n var d: f32 = max(0.0, dot(a, b));\n d = pow((d + 1) / 2.0, 2.6);\n return d;\n}\n\n// Lambertian diffuse model\nfn lambertDiffuse(base: vec3, N: vec3, L: vec3) -> vec3 {\n var pi: f32 = 3.14159265359; \n var NdotL: f32 = mdot(N, L);\n NdotL = pow(NdotL, 1.5);\n return (base/pi)*NdotL;\n}\n\n// Yasuhiro Fujii improvement on the Oren-Nayar model\n// https://mimosa-pudica.net/improved-oren-nayar.html\n// p is surface color, o is roughness\nfn fujiiOrenNayar(p: vec3, o: f32, N: vec3, L: vec3, V: vec3) -> vec3 {\n var invpi: f32 = 0.31830988618; // 1/pi\n\n var o2 = o*o;\n var NdotL: f32 = mdot(N, L);\n NdotL = pow(NdotL, 1.5); // Less physically accurate, but hides the "seams" between lights better\n\n var NdotV: f32 = mdot(N, V);\n var LdotV: f32 = mdot(L, V);\n\n var s: f32 = LdotV - NdotL*NdotV;\n var t: f32 = mix(1, max(NdotL, NdotV), step(0, s)); // Mix with step is the equivalent of an if statement\n var A: vec3 = 0.5*(o2 / (o2 + 0.33)) + 0.17*p*(o2 / (o2 + 0.13));\n A = invpi*(1 - A);\n var B: f32 = 0.45*(o2 / (o2 + 0.09));\n B = invpi*B;\n\n return p*NdotL*(A + B*(s/t));\n}\n\n// Fresnel portion of BRDF (IOR only, simplified)\nfn schlickFresnelIOR(V: vec3, N: vec3, ior: f32, k: f32) -> f32 {\n var NdotV: f32 = mdot(V, N);\n var F0: f32 = (pow((ior - 1.0), 2) + k*k) / (pow((ior + 1.0), 2) + k*k); // This takes into account the roughness, which the other one does not\n return F0 + (1 - F0) * pow((1-NdotV), 5); \n}\n\n// Fresnel portion of BRDF (Color ior, better)\nfn schlickFresnelRGB(V: vec3, N: vec3, F0: vec3) -> vec3 {\n var NdotV: f32 = mdot(V, N);\n return F0 + (1 - F0) * pow((1-NdotV), 5); \n}\n\n// Normal portion of BRDF\n// https://learnopengl.com/PBR/Theory\n// Trowbridge-Reitz GGX functions: normal, halfway, roughness^2\nfn trGGX(N: vec3, H: vec3, a: f32) -> f32 {\n var pi: f32 = 3.14159265359; \n\n var a2: f32 = a*a;\n var NdotH = mdot(N, H);\n var NdotH2 = NdotH*NdotH;\n \n var denom: f32 = NdotH2 * (a2 - 1.0) + 1.0;\n\n return a2 / max((pi*denom*denom), 0.000001);\n}\n\n// A VERY bad approximation of anisotropy. Real anisotropic calculations require tangent and bitangent\nfn anisotrophicTrGGX(N: vec3, H: vec3, O: vec3, s: f32, a: f32) -> f32 {\n var Op: vec3 = (rendererUBO.WCVCNormals * vec4(normalize(O) * s, 0.)).xyz;\n\n var ggx1: f32 = trGGX(N + Op*s, H, a);\n var ggx2: f32 = trGGX(N - Op*s, H, a);\n return (0.5 * ggx1 + 0.5 * ggx2);\n}\n\n// Geometry portion of BRDF\nfn schlickGGX(N: vec3, X: vec3, k: f32) -> f32 {\n var NdotX = cdot(N, X);\n return NdotX / max(0.000001, (NdotX*(1-k) + k));\n}\n\nfn smithSurfaceRoughness(N: vec3, V: vec3, L: vec3, k: f32) -> f32 {\n var ggx1: f32 = min(1, schlickGGX(N, V, k));\n var ggx2: f32 = min(1, schlickGGX(N, L, k));\n return ggx1*ggx2;\n}\n\n// BRDF Combination\nfn cookTorrance(D: f32, F: f32, G: f32, N: vec3, V: vec3, L: vec3) -> f32 {\n var num: f32 = D*F*G;\n var denom: f32 = 4*cdot(V, N)*cdot(L, N);\n\n return num / max(denom, 0.000001);\n}\n\n// Different lighting calculations for different light sources\nfn calcDirectionalLight(N: vec3, V: vec3, ior: f32, roughness: f32, metallic: f32, direction: vec3, color: vec3, base: vec3) -> PBRData { \n var L: vec3 = normalize(direction); // Light Vector\n var H: vec3 = normalize(L + V); // Halfway Vector\n\n var alpha = roughness*roughness;\n var k: f32 = alpha*alpha / 2;\n\n var D: f32 = trGGX(N, H, alpha); // Distribution\n // var F: f32 = schlickFresnelIOR(V, N, ior, k); // Fresnel\n var G: f32 = smithSurfaceRoughness(N, V, L, k); // Geometry\n\n var brdf: f32 = cookTorrance(D, 1, G, N, V, L); // Fresnel term is replaced with 1 because it is added later\n var incoming: vec3 = color;\n var angle: f32 = mdot(L, N);\n angle = pow(angle, 1.5);\n\n var specular: vec3 = brdf*incoming*angle;\n // Oren-Nayar gives a clay-like effect when fully rough which some people may not want, so it might be better to give a separate\n // control property for the diffuse vs specular roughness\n var diffuse: vec3 = incoming*fujiiOrenNayar(base, roughness, N, L, V); \n // Stores the specular and diffuse separately to allow for finer post processing\n var out = PBRData(diffuse, specular);\n \n return out; // Returns angle along with color of light so the final color can be multiplied by angle as well (creates black areas)\n}\n\n// TODO: find some way to reduce the number of arguments going in here\nfn calcPointLight(N: vec3, V: vec3, fragPos: vec3, ior: f32, roughness: f32, metallic: f32, position: vec3, color: vec3, base: vec3) -> PBRData {\n var L: vec3 = normalize(position - fragPos); // Light Vector\n var H: vec3 = normalize(L + V); // Halfway Vector\n var dist = distance(position, fragPos);\n\n var alpha = roughness*roughness;\n var k: f32 = alpha*alpha / 2; // could also be pow(alpha + 1.0, 2) / 8\n\n var D: f32 = trGGX(N, H, alpha); // Distribution\n // var F: f32 = schlickFresnelIOR(V, N, ior, k); // Fresnel\n var G: f32 = smithSurfaceRoughness(N, V, L, k); // Geometry\n\n var brdf: f32 = cookTorrance(D, 1, G, N, V, L); \n var incoming: vec3 = color * (1. / (dist*dist));\n var angle: f32 = mdot(L, N);\n angle = pow(angle, 1.5); // Smoothing factor makes it less accurate, but reduces ugly "seams" bewteen light sources\n\n var specular: vec3 = brdf*incoming*angle;\n var diffuse: vec3 = incoming*fujiiOrenNayar(base, roughness, N, L, V);\n\n // Stores the specular and diffuse separately to allow for finer post processing\n // Could also be done (propably more properly) with a struct\n var out = PBRData(diffuse, specular);\n \n return out; // Returns angle along with color of light so the final color can be multiplied by angle as well (creates black areas)\n}\n\n// For a reason unknown to me, spheres dont seem to behave propperly with head-on spot lights\nfn calcSpotLight(N: vec3, V: vec3, fragPos: vec3, ior: f32, roughness: f32, metallic: f32, position: vec3, direction: vec3, cones: vec2, color: vec3, base: vec3) -> PBRData {\n var L: vec3 = normalize(position - fragPos);\n var H: vec3 = normalize(L + V); // Halfway Vector\n var dist = distance(position, fragPos);\n\n var alpha = roughness*roughness;\n var k: f32 = alpha*alpha / 2; // could also be pow(alpha + 1.0, 2) / 8\n\n var D: f32 = trGGX(N, H, alpha); // Distribution\n // var F: f32 = schlickFresnelIOR(V, N, ior, k); // Fresnel\n var G: f32 = smithSurfaceRoughness(N, V, L, k); // Geometry\n\n var brdf: f32 = cookTorrance(D, 1, G, N, V, L); \n \n // Cones.x is the inner phi and cones.y is the outer phi\n var theta: f32 = mdot(normalize(direction), L);\n var epsilon: f32 = cones.x - cones.y;\n var intensity: f32 = (theta - cones.y) / epsilon;\n intensity = clamp(intensity, 0.0, 1.0);\n intensity /= dist*dist;\n\n var incoming: vec3 = color * intensity;\n\n var angle: f32 = mdot(L, N);\n angle = pow(angle, 1.5); // Smoothing factor makes it less accurate, but reduces ugly "seams" bewteen light sources\n\n var specular: vec3 = brdf*incoming*angle;\n var diffuse: vec3 = incoming*fujiiOrenNayar(base, roughness, N, L, V);\n\n // Stores the specular and diffuse separately to allow for finer post processing\n // Could also be done (propably more properly) with a struct\n var out = PBRData(diffuse, specular);\n \n return out; // Returns angle along with color of light so the final color can be multiplied by angle as well (creates black areas)\n}\n\n// Environment mapping stuff\n// Takes in a vector and converts it to an equivalent coordinate in a rectilinear texture. Should be replaced with cubemaps at some point\nfn vecToRectCoord(dir: vec3) -> vec2 {\n var tau: f32 = 6.28318530718;\n var pi: f32 = 3.14159265359;\n var out: vec2 = vec2(0.0);\n\n out.x = atan2(dir.z, dir.x) / tau;\n out.x += 0.5;\n\n var phix: f32 = length(vec2(dir.x, dir.z));\n out.y = atan2(dir.y, phix) / pi + 0.5;\n\n return out;\n}\n\n//VTK::Renderer::Dec\n\n//VTK::Color::Dec\n\n//VTK::TCoord::Dec\n\n// optional surface normal declaration\n//VTK::Normal::Dec\n\n//VTK::Select::Dec\n\n//VTK::RenderEncoder::Dec\n\n//VTK::Mapper::Dec\n\n//VTK::IOStructs::Dec\n\n@fragment\nfn main(\n//VTK::IOStructs::Input\n)\n//VTK::IOStructs::Output\n{\n var output : fragmentOutput;\n\n // Temporary ambient, diffuse, and opacity\n var ambientColor: vec4 = mapperUBO.AmbientColor;\n var diffuseColor: vec4 = mapperUBO.DiffuseColor;\n var opacity: f32 = mapperUBO.Opacity;\n\n // This should be declared somewhere else\n var _diffuseMap: vec4 = vec4(1);\n var _roughnessMap: vec4 = vec4(1);\n var _metallicMap: vec4 = vec4(1);\n var _normalMap: vec4 = vec4(0, 0, 1, 0); // normal map was setting off the normal vector detection in fragment\n var _ambientOcclusionMap: vec4 = vec4(1);\n var _emissionMap: vec4 = vec4(0);\n\n //VTK::Color::Impl\n\n //VTK::TCoord::Impl\n\n //VTK::Normal::Impl\n\n var computedColor: vec4 = vec4(diffuseColor.rgb, 1.0);\n\n //VTK::Light::Impl\n\n //VTK::Select::Impl\n\n if (computedColor.a == 0.0) { discard; };\n\n //VTK::Position::Impl\n\n //VTK::RenderEncoder::Impl\n\n return output;\n}\n',t.vertexShaderTemplate="\n//VTK::Renderer::Dec\n\n//VTK::Color::Dec\n\n//VTK::Normal::Dec\n\n//VTK::TCoord::Dec\n\n//VTK::Select::Dec\n\n//VTK::Mapper::Dec\n\n//VTK::IOStructs::Dec\n\n@vertex\nfn main(\n//VTK::IOStructs::Input\n)\n//VTK::IOStructs::Output\n{\n var output : vertexOutput;\n\n var vertex: vec4 = vertexBC;\n\n //VTK::Color::Impl\n\n //VTK::Normal::Impl\n\n //VTK::TCoord::Impl\n\n //VTK::Select::Impl\n\n //VTK::Position::Impl\n\n return output;\n}\n",t._tmpMat3=ot.wO.identity(new Float64Array(9)),t._tmpMat4=ot._E.identity(new Float64Array(16)),t.UBO=So.newInstance({label:"mapperUBO"}),t.UBO.addEntry("BCWCMatrix","mat4x4"),t.UBO.addEntry("BCSCMatrix","mat4x4"),t.UBO.addEntry("MCWCNormals","mat4x4"),t.UBO.addEntry("AmbientColor","vec4"),t.UBO.addEntry("DiffuseColor","vec4"),t.UBO.addEntry("EdgeColor","vec4"),t.UBO.addEntry("SpecularColor","vec4"),t.UBO.addEntry("AmbientIntensity","f32"),t.UBO.addEntry("DiffuseIntensity","f32"),t.UBO.addEntry("Roughness","f32"),t.UBO.addEntry("Metallic","f32"),t.UBO.addEntry("Ambient","f32"),t.UBO.addEntry("Normal","f32"),t.UBO.addEntry("Emission","f32"),t.UBO.addEntry("NormalStrength","f32"),t.UBO.addEntry("BaseIOR","f32"),t.UBO.addEntry("SpecularIntensity","f32"),t.UBO.addEntry("LineWidth","f32"),t.UBO.addEntry("Opacity","f32"),t.UBO.addEntry("ZValue","f32"),t.UBO.addEntry("PropID","u32"),t.UBO.addEntry("ClipNear","f32"),t.UBO.addEntry("ClipFar","f32"),t.UBO.addEntry("Time","u32"),(0,ht.g2)(e,t,["cellArray","currentInput","cellOffset","is2D","primitiveType","renderEncoder"]),t.textures=[],function(e,t){t.classHierarchy.push("vtkWebGPUCellArrayMapper"),e.buildPass=function(r){r&&(t.is2D?(t.WebGPUActor=e.getFirstAncestorOfType("vtkWebGPUActor2D"),t.forceZValue=!0):(t.WebGPUActor=e.getFirstAncestorOfType("vtkWebGPUActor"),t.forceZValue=!1),t.coordinateSystem=t.WebGPUActor.getRenderable().getCoordinateSystem(),t.useRendererMatrix=t.coordinateSystem!==wv.DISPLAY,t.WebGPURenderer=t.WebGPUActor.getFirstAncestorOfType("vtkWebGPURenderer"),t.WebGPURenderWindow=t.WebGPURenderer.getParent(),t.device=t.WebGPURenderWindow.getDevice())},e.translucentPass=function(r){r&&(e.prepareToDraw(t.WebGPURenderer.getRenderEncoder()),t.renderEncoder.registerDrawCallback(t.pipeline,e.draw))},e.opaquePass=function(r){r&&(e.prepareToDraw(t.WebGPURenderer.getRenderEncoder()),t.renderEncoder.registerDrawCallback(t.pipeline,e.draw))},e.updateUBO=function(){var r=t.WebGPUActor.getRenderable().getProperty(),n=t.UBO.getSendTime();if(e.getMTime()>n||r.getMTime()>n||t.renderable.getMTime()>n){var a,o=t.WebGPUActor.getKeyMatrices(t.WebGPURenderer);if(t.UBO.setArray("BCWCMatrix",o.bcwc),t.UBO.setArray("BCSCMatrix",o.bcsc),t.UBO.setArray("MCWCNormals",o.normalMatrix),t.is2D){t.UBO.setValue("ZValue",t.WebGPUActor.getRenderable().getProperty().getDisplayLocation()===Ov.FOREGROUND?1:0);var i=r.getColorByReference();t.UBO.setValue("AmbientIntensity",1),t.UBO.setArray("DiffuseColor",[i[0],i[1],i[2],1]),t.UBO.setValue("DiffuseIntensity",0),t.UBO.setValue("SpecularIntensity",0)}else{var s=r.getAmbientColorByReference();t.UBO.setValue("AmbientIntensity",r.getAmbient()),t.UBO.setArray("AmbientColor",[s[0],s[1],s[2],1]),t.UBO.setValue("DiffuseIntensity",r.getDiffuse()),s=r.getDiffuseColorByReference(),t.UBO.setArray("DiffuseColor",[s[0],s[1],s[2],1]),t.UBO.setValue("Roughness",r.getRoughness()),t.UBO.setValue("BaseIOR",r.getBaseIOR()),t.UBO.setValue("Metallic",r.getMetallic()),t.UBO.setValue("NormalStrength",r.getNormalStrength()),t.UBO.setValue("Emission",r.getEmission()),t.UBO.setValue("SpecularIntensity",r.getSpecular()),s=r.getSpecularColorByReference(),t.UBO.setArray("SpecularColor",[s[0],s[1],s[2],1])}var l=null===(a=r.getEdgeColorByReference)||void 0===a?void 0:a.call(r);l&&t.UBO.setArray("EdgeColor",[l[0],l[1],l[2],1]),t.UBO.setValue("LineWidth",r.getLineWidth()),t.UBO.setValue("Opacity",r.getOpacity()),t.UBO.setValue("PropID",t.WebGPUActor.getPropID());var c=t.WebGPURenderWindow.getDevice();t.UBO.sendIfNeeded(c)}},e.haveWideLines=function(){var e=t.WebGPUActor.getRenderable(),r=e.getProperty().getRepresentation();return!(e.getProperty().getLineWidth()<=1)&&t.primitiveType!==xv.Verts&&(t.primitiveType!==xv.Triangles&&t.primitiveType!==xv.TriangleStrips||r===Sv.WIREFRAME)},e.replaceShaderPosition=function(r,n,a){var o=n.getShaderDescription("vertex");o.addBuiltinOutput("vec4","@builtin(position) Position"),o.hasOutput("vertexVC")||o.addOutput("vec4","vertexVC");var i=o.getCode();t.useRendererMatrix?(i=fa.substitute(i,"//VTK::Position::Impl",[" var pCoord: vec4 = rendererUBO.SCPCMatrix*mapperUBO.BCSCMatrix*vertexBC;"," output.vertexVC = rendererUBO.SCVCMatrix * mapperUBO.BCSCMatrix * vec4(vertexBC.xyz, 1.0);","//VTK::Position::Impl"]).result,t.forceZValue&&(i=fa.substitute(i,"//VTK::Position::Impl",["pCoord = vec4(pCoord.xyz/pCoord.w, 1.0);","pCoord.z = mapperUBO.ZValue;","//VTK::Position::Impl"]).result)):(i=fa.substitute(i,"//VTK::Position::Impl",[" var pCoord: vec4 = mapperUBO.BCSCMatrix*vertexBC;"," pCoord.x = 2.0* pCoord.x / rendererUBO.viewportSize.x - 1.0;"," pCoord.y = 2.0* pCoord.y / rendererUBO.viewportSize.y - 1.0;"," pCoord.z = 0.5 - 0.5 * pCoord.z;","//VTK::Position::Impl"]).result,t.forceZValue&&(i=fa.substitute(i,"//VTK::Position::Impl",[" pCoord.z = mapperUBO.ZValue;","//VTK::Position::Impl"]).result)),e.haveWideLines()&&(o.addBuiltinInput("u32","@builtin(instance_index) instanceIndex"),i=fa.substitute(i,"//VTK::Position::Impl",[" var tmpPos: vec4 = pCoord;"," var numSteps: f32 = ceil(mapperUBO.LineWidth - 1.0);"," var offset: f32 = (mapperUBO.LineWidth - 1.0) * (f32(input.instanceIndex / 2u) - numSteps/2.0) / numSteps;"," var tmpPos2: vec3 = tmpPos.xyz / tmpPos.w;"," tmpPos2.x = tmpPos2.x + 2.0 * (f32(input.instanceIndex) % 2.0) * offset / rendererUBO.viewportSize.x;"," tmpPos2.y = tmpPos2.y + 2.0 * (f32(input.instanceIndex + 1u) % 2.0) * offset / rendererUBO.viewportSize.y;"," tmpPos2.z = min(1.0, tmpPos2.z + 0.00001);"," pCoord = vec4(tmpPos2.xyz * tmpPos.w, tmpPos.w);","//VTK::Position::Impl"]).result),i=fa.substitute(i,"//VTK::Position::Impl",[" output.Position = pCoord;"]).result,o.setCode(i)},t.shaderReplacements.set("replaceShaderPosition",e.replaceShaderPosition),e.replaceShaderNormal=function(e,r,n){var a=n.getBuffer("normalMC"),o=t.WebGPUActor.getRenderable();if(a){var i=r.getShaderDescription("vertex");i.hasOutput("normalVC")||i.addOutput("vec3","normalVC",a.getArrayInformation()[0].interpolation),i.hasOutput("tangentVC")||i.addOutput("vec3","tangentVC",a.getArrayInformation()[0].interpolation),i.hasOutput("bitangentVC")||i.addOutput("vec3","bitangentVC",a.getArrayInformation()[0].interpolation);var s=i.getCode();s=fa.substitute(s,"//VTK::Normal::Impl",[" output.normalVC = normalize((rendererUBO.WCVCNormals * mapperUBO.MCWCNormals * normalMC).xyz);"," var c1: vec3 = cross(output.normalVC, vec3(0, 0, 1));"," var c2: vec3 = cross(output.normalVC, vec3(0, 1, 0));"," var tangent: vec3 = mix(c1, c2, distance(c1, c2));"," output.tangentVC = normalize(tangent);"," output.bitangentVC = normalize(cross(output.normalVC, tangent));"]).result,i.setCode(s);var l=r.getShaderDescription("fragment");s=l.getCode(),s=o.getProperty().getNormalTexture()?fa.substitute(s,"//VTK::Normal::Impl",[" var normal: vec3 = input.normalVC;"," if (!input.frontFacing) { normal = -normal; }"," var tangent: vec3 = input.tangentVC;"," var bitangent: vec3 = input.bitangentVC;"," var TCVCMatrix: mat3x3 = mat3x3("," tangent.x, bitangent.x, normal.x,"," tangent.y, bitangent.y, normal.y,"," tangent.z, bitangent.z, normal.z,"," );"," var mappedNormal: vec3 = TCVCMatrix * (_normalMap.xyz * 2 - 1);"," normal = mix(normal, mappedNormal, mapperUBO.NormalStrength);"," normal = normalize(normal);"]).result:fa.substitute(s,"//VTK::Normal::Impl",[" var normal: vec3 = input.normalVC;"," if (!input.frontFacing) { normal = -normal; }"," normal = normalize(normal);"]).result,l.setCode(s)}},t.shaderReplacements.set("replaceShaderNormal",e.replaceShaderNormal),e.replaceShaderLight=function(e,r,n){if(!e.includes("sel")){var a=r.getShaderDescription("vertex");a.hasOutput("vertexVC")||a.addOutput("vec4","vertexVC");var o=t.WebGPURenderer.getRenderable(),i=r.getShaderDescription("fragment"),s=i.getCode();if(!s.includes("var normal:")||!t.useRendererMatrix||Iv(e)||t.is2D||e.includes("sel"))s=fa.substitute(s,"//VTK::Light::Impl",[" var diffuse: vec3 = diffuseColor.rgb;"," var specular: vec3 = mapperUBO.SpecularColor.rgb * mapperUBO.SpecularColor.a;"," computedColor = vec4(diffuse * _diffuseMap.rgb, mapperUBO.Opacity);"]).result,i.setCode(s);else{var l,c=[" var pi: f32 = 3.14159265359;"," var fragPos: vec3 = vec3(input.vertexVC.xyz);"," var V: vec3 = mix(normalize(-fragPos), vec3(0, 0, 1), f32(rendererUBO.cameraParallel)); // View Vector"," var baseColor: vec3 = _diffuseMap.rgb * diffuseColor.rgb;"," var roughness: f32 = max(0.000001, mapperUBO.Roughness * _roughnessMap.r);"," var metallic: f32 = mapperUBO.Metallic * _metallicMap.r;"," var alpha: f32 = roughness*roughness;"," var ior: f32 = mapperUBO.BaseIOR;"," var k: f32 = alpha*alpha / 2;"," var diffuse: vec3 = vec3(0.);"," var specular: vec3 = vec3(0.);"," var emission: vec3 = _emissionMap.rgb * mapperUBO.Emission;"," {"," var i: i32 = 0;"," loop {"," if !(i < rendererUBO.LightCount) { break; }"," switch (i32(rendererLightSSBO.values[i].LightData.x)) {"," // Point Light"," case 0 {"," var color: vec3 = rendererLightSSBO.values[i].LightColor.rgb * rendererLightSSBO.values[i].LightColor.w;"," var pos: vec3 = (rendererLightSSBO.values[i].LightPos).xyz;"," var calculated: PBRData = calcPointLight(normal, V, fragPos, ior, roughness, metallic, pos, color, baseColor);"," diffuse += max(vec3(0), calculated.diffuse);"," specular += max(vec3(0), calculated.specular);"," }"," // Directional light"," case 1 {"," var dir: vec3 = (rendererUBO.WCVCNormals * vec4(normalize(rendererLightSSBO.values[i].LightDir.xyz), 0.)).xyz;"," dir = normalize(dir);"," var color: vec3 = rendererLightSSBO.values[i].LightColor.rgb * rendererLightSSBO.values[i].LightColor.w;"," var calculated: PBRData = calcDirectionalLight(normal, V, ior, roughness, metallic, dir, color, baseColor); // diffuseColor.rgb needs to be fixed with a more dynamic diffuse color"," diffuse += max(vec3(0), calculated.diffuse);"," specular += max(vec3(0), calculated.specular);"," }"," // Spot Light"," case 2 {"," var color: vec3 = rendererLightSSBO.values[i].LightColor.rgb * rendererLightSSBO.values[i].LightColor.w;"," var pos: vec3 = (rendererLightSSBO.values[i].LightPos).xyz;"," var dir: vec3 = (rendererUBO.WCVCNormals * vec4(normalize(rendererLightSSBO.values[i].LightDir.xyz), 0.)).xyz;"," dir = normalize(dir);"," var cones: vec2 = vec2(rendererLightSSBO.values[i].LightData.y, rendererLightSSBO.values[i].LightData.z);"," var calculated: PBRData = calcSpotLight(normal, V, fragPos, ior, roughness, metallic, pos, dir, cones, color, baseColor);"," diffuse += max(vec3(0), calculated.diffuse);"," specular += max(vec3(0), calculated.specular);"," }"," default { continue; }"," }"," continuing { i++; }"," }"," }"," var fresnel: f32 = schlickFresnelIOR(V, normal, ior, k); // Fresnel"," fresnel = min(1, fresnel);"," // This could be controlled with its own variable (that isnt base color) for better artistic control"," var fresnelMetallic: vec3 = schlickFresnelRGB(V, normal, baseColor); // Fresnel for metal, takes color into account"," var kS: vec3 = mix(vec3(fresnel), fresnelMetallic, metallic);"," kS = min(vec3(1), kS);"," var kD: vec3 = (1.0 - kS) * (1.0 - metallic);"," var PBR: vec3 = mapperUBO.DiffuseIntensity*kD*diffuse + kS*specular;"," PBR += emission;"," computedColor = vec4(PBR, mapperUBO.Opacity);"];null!==(l=o.getEnvironmentTexture())&&void 0!==l&&l.getImageLoaded()&&c.push(" // To get diffuse IBL, the texture is sampled with normals in worldspace"," var diffuseIBLCoords: vec3 = (transpose(rendererUBO.WCVCNormals) * vec4(normal, 1.)).xyz;"," var diffuseCoords: vec2 = vecToRectCoord(diffuseIBLCoords);"," // To get specular IBL, the texture is sampled as the worldspace reflection between the normal and view vectors"," // Reflections are first calculated in viewspace, then converted to worldspace to sample the environment"," var VreflN: vec3 = normalize(reflect(-V, normal));"," var reflectionIBLCoords = (transpose(rendererUBO.WCVCNormals) * vec4(VreflN, 1.)).xyz;"," var specularCoords: vec2 = vecToRectCoord(reflectionIBLCoords);"," var diffuseIBL = textureSampleLevel(EnvironmentTexture, EnvironmentTextureSampler, diffuseCoords, rendererUBO.MaxEnvironmentMipLevel);"," var level = roughness * rendererUBO.MaxEnvironmentMipLevel;"," var specularIBL = textureSampleLevel(EnvironmentTexture, EnvironmentTextureSampler, specularCoords, level);"," var specularIBLContribution: vec3 = specularIBL.rgb*rendererUBO.BackgroundSpecularStrength;"," computedColor += vec4(specularIBLContribution*kS, 0);"," var diffuseIBLContribution: vec3 = diffuseIBL.rgb*rendererUBO.BackgroundDiffuseStrength;"," diffuseIBLContribution *= baseColor * _ambientOcclusionMap.rgb;"," computedColor += vec4(diffuseIBLContribution*kD, 0);"),s=fa.substitute(s,"//VTK::Light::Impl",c).result,i.setCode(s)}}},t.shaderReplacements.set("replaceShaderLight",e.replaceShaderLight),e.replaceShaderColor=function(e,t,r){if(Iv(e)){var n=t.getShaderDescription("fragment"),a=n.getCode();return a=fa.substitute(a,"//VTK::Color::Impl",["ambientColor = mapperUBO.EdgeColor;","diffuseColor = mapperUBO.EdgeColor;"]).result,void n.setCode(a)}var o=r.getBuffer("colorVI");if(o){var i=t.getShaderDescription("vertex");i.addOutput("vec4","color",o.getArrayInformation()[0].interpolation);var s=i.getCode();s=fa.substitute(s,"//VTK::Color::Impl",[" output.color = colorVI;"]).result,i.setCode(s);var l=t.getShaderDescription("fragment");s=l.getCode(),s=fa.substitute(s,"//VTK::Color::Impl",["ambientColor = input.color;","diffuseColor = input.color;","opacity = mapperUBO.Opacity * input.color.a;"]).result,l.setCode(s)}},t.shaderReplacements.set("replaceShaderColor",e.replaceShaderColor),e.replaceShaderTCoord=function(e,r,n){var a,o,i,s,l,c,u,d,f,p,g,m,h,v,y,b,T,C;if(n.hasAttribute("tcoord")){var x=r.getShaderDescription("vertex"),S=n.getBuffer("tcoord"),P=Ca.getNumberOfComponentsFromBufferFormat(S.getArrayInformation()[0].format),w=x.getCode();x.addOutput("vec".concat(P,""),"tcoordVS"),w=fa.substitute(w,"//VTK::TCoord::Impl",[" output.tcoordVS = tcoord;"]).result,x.setCode(w);var O=r.getShaderDescription("fragment");w=O.getCode();var I,A,R=t.WebGPUActor.getRenderable(),E=function(e){return!!e&&e.getDimensionality()===P},M=[];(null!==(a=(o=R.getProperty()).getDiffuseTexture)&&void 0!==a&&null!==(i=a.call(o))&&void 0!==i&&i.getImageLoaded()||R.getTextures()[0]||t.colorTexture)&&(E(null===(I=(A=R.getProperty()).getDiffuseTexture)||void 0===I?void 0:I.call(A))||E(R.getTextures()[0])||E(t.colorTexture))&&M.push("_diffuseMap = textureSample(DiffuseTexture, DiffuseTextureSampler, input.tcoordVS);"),null!==(s=(l=R.getProperty()).getRoughnessTexture)&&void 0!==s&&null!==(c=s.call(l))&&void 0!==c&&c.getImageLoaded()&&E(R.getProperty().getRoughnessTexture())&&M.push("_roughnessMap = textureSample(RoughnessTexture, RoughnessTextureSampler, input.tcoordVS);"),null!==(u=(d=R.getProperty()).getMetallicTexture)&&void 0!==u&&null!==(f=u.call(d))&&void 0!==f&&f.getImageLoaded()&&E(R.getProperty().getMetallicTexture())&&M.push("_metallicMap = textureSample(MetallicTexture, MetallicTextureSampler, input.tcoordVS);"),null!==(p=(g=R.getProperty()).getNormalTexture)&&void 0!==p&&null!==(m=p.call(g))&&void 0!==m&&m.getImageLoaded()&&E(R.getProperty().getNormalTexture())&&M.push("_normalMap = textureSample(NormalTexture, NormalTextureSampler, input.tcoordVS);"),null!==(h=(v=R.getProperty()).getAmbientOcclusionTexture)&&void 0!==h&&null!==(y=h.call(v))&&void 0!==y&&y.getImageLoaded()&&E(R.getProperty().getAmbientOcclusionTexture())&&M.push("_ambientOcclusionMap = textureSample(AmbientOcclusionTexture, AmbientOcclusionTextureSampler, input.tcoordVS);"),null!==(b=(T=R.getProperty()).getEmissionTexture)&&void 0!==b&&null!==(C=b.call(T))&&void 0!==C&&C.getImageLoaded()&&E(R.getProperty().getEmissionTexture())&&M.push("_emissionMap = textureSample(EmissionTexture, EmissionTextureSampler, input.tcoordVS);"),w=fa.substitute(w,"//VTK::TCoord::Impl",M).result,O.setCode(w)}},t.shaderReplacements.set("replaceShaderTCoord",e.replaceShaderTCoord),e.replaceShaderSelect=function(e,t,r){if(e.includes("sel")){var n=t.getShaderDescription("fragment"),a=n.getCode();a=fa.substitute(a,"//VTK::Select::Impl",[" var compositeID: u32 = 0u;"]).result,n.setCode(a)}},t.shaderReplacements.set("replaceShaderSelect",e.replaceShaderSelect),e.getUsage=function(e,t){return e===Sv.POINTS||t===xv.Points?Cv.Verts:t===xv.Lines?Cv.Lines:e===Sv.WIREFRAME?t===xv.Triangles?Cv.LinesFromTriangles:Cv.LinesFromStrips:t===xv.Triangles?Cv.Triangles:t===xv.TriangleStrips?Cv.Strips:t===xv.TriangleEdges?Cv.LinesFromTriangles:Cv.LinesFromStrips},e.getHashFromUsage=function(e){return"pt".concat(e)},e.getTopologyFromUsage=function(e){switch(e){case Cv.Triangles:return"triangle-list";case Cv.Verts:return"point-list";case Cv.Lines:default:return"line-list"}},e.buildVertexInput=function(){var r,n,a=t.currentInput,o=t.cellArray,i=t.primitiveType,s=t.WebGPUActor.getRenderable().getProperty().getRepresentation(),l=t.WebGPURenderWindow.getDevice(),c=!1;i===xv.TriangleEdges&&(c=!0,s=Sv.WIREFRAME);var u,d=t.vertexInput,f=a.getPoints();if(o){var p={hash:"R".concat(s,"P").concat(i).concat(o.getMTime()),usage:Cv.Index,cells:o,numberOfPoints:f.getNumberOfPoints(),primitiveType:i,representation:s};u=l.getBufferManager().getBuffer(p),d.setIndexBuffer(u)}else d.setIndexBuffer(null);if(f){var g=t.WebGPUActor.getBufferShift(t.WebGPURenderer),m={hash:"".concat(f.getMTime(),"I").concat(u.getMTime()).concat(g.join(),"float32x4"),usage:Cv.PointArray,format:"float32x4",dataArray:f,indexBuffer:u,shift:g,packExtra:!0},h=l.getBufferManager().getBuffer(m);d.addBuffer(h,["vertexBC"])}else d.removeBufferIfPresent("vertexBC");var v=e.getUsage(s,i);if(t._usesCellNormals=!1,t.is2D||v!==Cv.Triangles&&v!==Cv.Strips)d.removeBufferIfPresent("normalMC");else{var y=a.getPointData().getNormals(),b={format:"snorm8x4",indexBuffer:u,packExtra:!0,shift:0,scale:127};if(y){b.hash="".concat(y.getMTime(),"I").concat(u.getMTime(),"snorm8x4"),b.dataArray=y,b.usage=Cv.PointArray;var T=l.getBufferManager().getBuffer(b);d.addBuffer(T,["normalMC"])}else if(i===xv.Triangles){t._usesCellNormals=!0,b.hash="PFN".concat(f.getMTime(),"I").concat(u.getMTime(),"snorm8x4"),b.dataArray=f,b.cells=o,b.usage=Cv.NormalsFromPoints;var C=l.getBufferManager().getBuffer(b);d.addBuffer(C,["normalMC"])}else d.removeBufferIfPresent("normalMC")}var x=!1;if(t.renderable.getScalarVisibility()){var S=t.renderable.getColorMapColors();if(S&&!c){var P=t.renderable.getScalarMode(),w=!1;P!==Pv.USE_CELL_DATA&&P!==Pv.USE_CELL_FIELD_DATA&&P!==Pv.USE_FIELD_DATA&&a.getPointData().getScalars()||P===Pv.USE_POINT_FIELD_DATA||!S||(w=!0);var O={usage:Cv.PointArray,format:"unorm8x4",hash:"".concat(w).concat(S.getMTime(),"I").concat(u.getMTime(),"unorm8x4"),dataArray:S,indexBuffer:u,cellData:w,cellOffset:0},I=l.getBufferManager().getBuffer(O);d.addBuffer(I,["colorVI"]),x=!0}}x||d.removeBufferIfPresent("colorVI");var A=null;if((A=null!==(r=(n=t.renderable).getInterpolateScalarsBeforeMapping)&&void 0!==r&&r.call(n)&&t.renderable.getColorCoordinates()?t.renderable.getColorCoordinates():a.getPointData().getTCoords())&&!c){var R=l.getBufferManager().getBufferForPointArray(A,d.getIndexBuffer());d.addBuffer(R,["tcoord"])}else d.removeBufferIfPresent("tcoord")},e.updateTextures=function(){var e,r,n,a,o,i,s,l,c,u,d,f,p,g,m,h=[],v=[],y=null===(e=(r=t.renderable).getColorTextureMap)||void 0===e?void 0:e.call(r);y&&(t.colorTexture||(t.colorTexture=oh.ZP.newInstance({label:"polyDataColor"})),t.colorTexture.setInputData(y),v.push(["Diffuse",t.colorTexture]));var b=t.WebGPUActor.getRenderable(),T=t.WebGPURenderer.getRenderable(),C=[];if(null!==(n=(a=b.getProperty()).getDiffuseTexture)&&void 0!==n&&n.call(a)){var x=["Diffuse",b.getProperty().getDiffuseTexture()];C.push(x)}if(b.getTextures()[0]){var S=["Diffuse",b.getTextures()[0]];C.push(S)}if(t.colorTexture){var P=["Diffuse",t.colorTexture];C.push(P)}if(null!==(o=(i=b.getProperty()).getRoughnessTexture)&&void 0!==o&&o.call(i)){var w=["Roughness",b.getProperty().getRoughnessTexture()];C.push(w)}if(null!==(s=(l=b.getProperty()).getMetallicTexture)&&void 0!==s&&s.call(l)){var O=["Metallic",b.getProperty().getMetallicTexture()];C.push(O)}if(null!==(c=(u=b.getProperty()).getNormalTexture)&&void 0!==c&&c.call(u)){var I=["Normal",b.getProperty().getNormalTexture()];C.push(I)}if(null!==(d=(f=b.getProperty()).getAmbientOcclusionTexture)&&void 0!==d&&d.call(f)){var A=["AmbientOcclusion",b.getProperty().getAmbientOcclusionTexture()];C.push(A)}if(null!==(p=(g=b.getProperty()).getEmissionTexture)&&void 0!==p&&p.call(g)){var R=["Emission",b.getProperty().getEmissionTexture()];C.push(R)}if(null!==(m=T.getEnvironmentTexture)&&void 0!==m&&m.call(T)){var E=["Environment",T.getEnvironmentTexture()];C.push(E)}for(var M=0;M=0;G--)h[G]||(t.textures.splice(G,1),t.textureViews.splice(G,1))},e.computePipelineHash=function(){var r="pd".concat(t.useRendererMatrix?"r":"").concat(t.forceZValue?"z":"");if(t.primitiveType===xv.TriangleEdges||t.primitiveType===xv.TriangleStripEdges)r+="edge";else{if(t.vertexInput.hasAttribute("normalMC")&&(r+="n"),t.vertexInput.hasAttribute("colorVI")&&(r+="c"),t.vertexInput.hasAttribute("tcoord")){var n=t.vertexInput.getBuffer("tcoord"),a=Ca.getNumberOfComponentsFromBufferFormat(n.getArrayInformation()[0].format);r+="t".concat(a)}t.textures.length&&(r+="tx".concat(t.textures.length))}t._usesCellNormals&&(r+="cn"),t.SSBO&&(r+="ssbo"),r+=e.getHashFromUsage(t.usage),r+=t.renderEncoder.getPipelineHash(),t.pipelineHash=r},e.updateBuffers=function(){t.primitiveType!==xv.TriangleEdges&&t.primitiveType!==xv.TriangleStripEdges&&e.updateTextures();var r=t.WebGPUActor.getRenderable(),n=r.getProperty().getRepresentation();t.usage=e.getUsage(n,t.primitiveType),e.buildVertexInput();var a=t.vertexInput.getBuffer("vertexBC");if(e.setNumberOfVertices(a.getSizeInBytes()/a.getStrideInBytes()),e.setTopology(e.getTopologyFromUsage(t.usage)),e.updateUBO(),e.haveWideLines()){var o=r.getProperty();e.setNumberOfInstances(Math.ceil(2*o.getLineWidth()))}else e.setNumberOfInstances(1)}}(e,t)}var Ev={newInstance:(0,ht.WL)(Rv,"vtkWebGPUCellArrayMapper"),extend:Rv},Mv=po.PrimitiveTypes;var Dv={primitives:null};function Vv(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,Dv,r),Tt.extend(e,t,r),t.primitives=[],function(e,t){t.classHierarchy.push("vtkWebGPUPolyDataMapper"),e.createCellArrayMapper=function(){return Ev.newInstance()},e.buildPass=function(r){if(r){t.WebGPUActor=e.getFirstAncestorOfType("vtkWebGPUActor"),t.renderable.getStatic()||t.renderable.update();var n=t.renderable.getInputData();t.renderable.mapScalars(n,1),e.updateCellArrayMappers(n)}},e.updateCellArrayMappers=function(r){for(var n=[r.getVerts(),r.getLines(),r.getPolys(),r.getStrips()],a=[],o=0,i=Mv.Points;i<=Mv.Triangles;i++)if(n[i].getNumberOfValues()>0){t.primitives[i]||(t.primitives[i]=e.createCellArrayMapper());var s=t.primitives[i];s.setCellArray(n[i]),s.setCurrentInput(r),s.setCellOffset(o),s.setPrimitiveType(i),s.setRenderable(t.renderable),o+=n[i].getNumberOfCells(),a.push(s)}else t.primitives[i]=null;if(t.WebGPUActor.getRenderable().getProperty().getEdgeVisibility())for(var l=Mv.TriangleEdges;l<=Mv.TriangleStripEdges;l++)if(n[l-2].getNumberOfValues()>0){t.primitives[l]||(t.primitives[l]=e.createCellArrayMapper());var c=t.primitives[l];c.setCellArray(n[l-2]),c.setCurrentInput(r),c.setCellOffset(t.primitives[l-2].getCellOffset()),c.setPrimitiveType(l),c.setRenderable(t.renderable),a.push(c)}else t.primitives[l]=null;e.prepareNodes(),e.addMissingChildren(a),e.removeUnusedNodes()}}(e,t)}var Lv=(0,ht.WL)(Vv,"vtkWebGPUPolyDataMapper");function _v(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}Qn("vtkMapper",Lv);var Nv=po.PrimitiveTypes;function Bv(e){return function(e){for(var t=1;t2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,Bv(r)),Tt.extend(e,t,r),t.primitives=[],function(e,t){t.classHierarchy.push("vtkWebGPUPolyDataMapper2D"),e.createCellArrayMapper=function(){return Ev.newInstance()},e.buildPass=function(r){if(r){t.WebGPUActor=e.getFirstAncestorOfType("vtkWebGPUActor2D"),t.renderable.getStatic()||t.renderable.update();var n=t.renderable.getInputData();t.renderable.mapScalars(n,1),e.updateCellArrayMappers(n)}},e.updateCellArrayMappers=function(r){for(var n=[r.getVerts(),r.getLines(),r.getPolys(),r.getStrips()],a=[],o=0,i=Nv.Points;i<=Nv.Triangles;i++)if(n[i].getNumberOfValues()>0){t.primitives[i]||(t.primitives[i]=e.createCellArrayMapper());var s=t.primitives[i];s.setCellArray(n[i]),s.setCurrentInput(r),s.setCellOffset(o),s.setPrimitiveType(i),s.setRenderable(t.renderable),s.setIs2D(!0),o+=n[i].getNumberOfCells(),a.push(s)}else t.primitives[i]=null;e.prepareNodes(),e.addMissingChildren(a),e.removeUnusedNodes()}}(e,t)}var Uv=(0,ht.WL)(Fv,"vtkWebGPUPolyDataMapper2D");Qn("vtkMapper2D",Uv);var kv={};function Gv(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,kv,r),Tt.extend(e,t,r),t.scalarBarActorHelper=tv.newScalarBarActorHelper(),function(e,t){t.classHierarchy.push("vtkWebGPUScalarBarActor"),e.buildPass=function(r){r&&(t.WebGPURenderer=e.getFirstAncestorOfType("vtkWebGPURenderer"),t.WebGPURenderWindow=t.WebGPURenderer.getParent(),t.scalarBarActorHelper.getRenderable()||t.scalarBarActorHelper.setRenderable(t.renderable),e.prepareNodes(),e.addMissingNode(t.scalarBarActorHelper.getBarActor()),e.addMissingNode(t.scalarBarActorHelper.getTmActor()),e.removeUnusedNodes())},e.opaquePass=function(e,r){if(e){var n=t.WebGPURenderer?t.WebGPURenderer.getRenderable().getActiveCamera():null,a=t.WebGPURenderer.getTiledSizeAndOrigin();t.scalarBarActorHelper.updateAPISpecificData([a.usize,a.vsize],n,t.WebGPURenderWindow.getRenderable())}}}(e,t)}var Wv=(0,ht.WL)(Gv,"vtkWebGPUScalarBarActor");Qn("vtkScalarBarActor",Wv);var zv={texture:null,handle:null,sampler:null,label:null};function jv(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,zv,r),ht.default.obj(e,t),t.bindGroupLayoutEntry={visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,texture:{sampleType:"float",viewDimension:"2d"}},t.bindGroupTime={},ht.default.obj(t.bindGroupTime,{mtime:0}),ht.default.get(e,t,["bindGroupTime","texture"]),ht.default.setGet(e,t,["bindGroupLayoutEntry","label","sampler"]),function(e,t){t.classHierarchy.push("vtkWebGPUTextureView"),e.create=function(e,r){t.texture=e,t.options=r,t.options.dimension=t.options.dimension||"2d",t.options.label=t.label,t.textureHandle=e.getHandle(),t.handle=t.textureHandle.createView(t.options),t.bindGroupLayoutEntry.texture.viewDimension=t.options.dimension;var n=Ca.getDetailsFromTextureFormat(t.texture.getFormat());t.bindGroupLayoutEntry.texture.sampleType=n.sampleType},e.createFromTextureHandle=function(e,r){t.texture=null,t.options=r,t.options.dimension=t.options.dimension||"2d",t.options.label=t.label,t.textureHandle=e,t.handle=t.textureHandle.createView(t.options),t.bindGroupLayoutEntry.texture.viewDimension=t.options.dimension;var n=Ca.getDetailsFromTextureFormat(r.format);t.bindGroupLayoutEntry.texture.sampleType=n.sampleType,t.bindGroupTime.modified()},e.getBindGroupEntry=function(){return{resource:e.getHandle()}},e.getShaderCode=function(e,r){var n="f32";"sint"===t.bindGroupLayoutEntry.texture.sampleType?n="i32":"uint"===t.bindGroupLayoutEntry.texture.sampleType&&(n="u32");var a="@binding(".concat(e,") @group(").concat(r,") var ").concat(t.label,": texture_").concat(t.options.dimension,"<").concat(n,">;");return"depth"===t.bindGroupLayoutEntry.texture.sampleType&&(a="@binding(".concat(e,") @group(").concat(r,") var ").concat(t.label,": texture_depth_").concat(t.options.dimension,";")),a},e.addSampler=function(r,n){var a=Lo.newInstance({label:"".concat(t.label,"Sampler")});a.create(r,n),e.setSampler(a)},e.getBindGroupTime=function(){return t.texture&&t.texture.getHandle()!==t.textureHandle&&(t.textureHandle=t.texture.getHandle(),t.handle=t.textureHandle.createView(t.options),t.bindGroupTime.modified()),t.bindGroupTime},e.getHandle=function(){return t.texture&&t.texture.getHandle()!==t.textureHandle&&(t.textureHandle=t.texture.getHandle(),t.handle=t.textureHandle.createView(t.options),t.bindGroupTime.modified()),t.handle}}(e,t)}var Hv={newInstance:ht.default.newInstance(jv),extend:jv},Kv=po.BufferUsage;var Zv={device:null,handle:null,buffer:null,ready:!1,label:null};function Xv(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,Zv,r),ht.default.obj(e,t),ht.default.get(e,t,["handle","ready","width","height","depth","format","usage"]),ht.default.setGet(e,t,["device","label"]),function(e,t){t.classHierarchy.push("vtkWebGPUTexture"),e.create=function(e,r){t.device=e,t.width=r.width,t.height=r.height,t.depth=r.depth?r.depth:1;var n=1===t.depth?"2d":"3d";t.format=r.format?r.format:"rgba8unorm",t.mipLevel=r.mipLevel?r.mipLevel:0,t.usage=r.usage?r.usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST,t.handle=t.device.getHandle().createTexture({size:[t.width,t.height,t.depth],format:t.format,usage:t.usage,label:t.label,dimension:n,mipLevelCount:t.mipLevel+1})},e.assignFromHandle=function(e,r,n){t.device=e,t.handle=r,t.width=n.width,t.height=n.height,t.depth=n.depth?n.depth:1,t.format=n.format?n.format:"rgba8unorm",t.usage=n.usage?n.usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST},e.writeImageData=function(r){var n=[];if(r.canvas)return t.device.getHandle().queue.copyExternalImageToTexture({source:r.canvas,flipY:r.flip},{texture:t.handle,premultipliedAlpha:!0},[t.width,t.height,t.depth]),void(t.ready=!0);r.jsImageData&&!r.nativeArray&&(r.width=r.jsImageData.width,r.height=r.jsImageData.height,r.depth=1,r.format="rgba8unorm",r.flip=!0,r.nativeArray=r.jsImageData.data);var a=Ca.getDetailsFromTextureFormat(t.format),o=t.width*a.stride,i=function(e,t,r){var n=e.length/(t*r)*e.BYTES_PER_ELEMENT,o=2===a.elementSize&&"float"===a.sampleType;if(o||n%256){for(var i=e,s=n/i.BYTES_PER_ELEMENT,l=a.elementSize,c=256*Math.floor((s*l+255)/256),u=c/l,d=ht.default.newTypedArray(o?"Uint16Array":i.constructor.name,u*t*r),f=0;f1&&e++,t.height>1&&e++,t.depth>1&&e++,e},e.resizeToMatch=function(e){e.getWidth()===t.width&&e.getHeight()===t.height&&e.getDepth()===t.depth||(t.width=e.getWidth(),t.height=e.getHeight(),t.depth=e.getDepth(),t.handle=t.device.getHandle().createTexture({size:[t.width,t.height,t.depth],format:t.format,usage:t.usage,label:t.label}))},e.resize=function(e,r){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1;e===t.width&&r===t.height&&n===t.depth||(t.width=e,t.height=r,t.depth=n,t.handle=t.device.getHandle().createTexture({size:[t.width,t.height,t.depth],format:t.format,usage:t.usage,label:t.label}))},e.createView=function(r){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};n.dimension||(n.dimension=1===t.depth?"2d":"3d");var a=Hv.newInstance({label:r});return a.create(e,n),a}}(e,t)}ht.default.newInstance(Xv);const qv=class{constructor(e){const{points:t,type:r}=e.data;this.id=e.id,this.points=t,this.type=r,this.color=e.color,this.segmentIndex=e.segmentIndex,this.sizeInBytes=this._getSizeInBytes()}_getSizeInBytes(){let e=0;return e+=3*this.points.length,e}getPoints(){return this.points}getFlatPointsArray(){return this.points.map((e=>[...e])).flat()}getColor(){return this.color}getType(){return this.type}};class Yv{constructor(e){this.color=[200,0,0],this.id=e.id,this.contours=[],this.color=e.color??this.color,this.frameOfReferenceUID=e.frameOfReferenceUID,this.segmentIndex=e.segmentIndex,this._createEachContour(e.data),this.sizeInBytes=this._getSizeInBytes()}_createEachContour(e){e.forEach((e=>{const{points:t,type:r,color:n}=e,a=new qv({id:`${this.id}-segment-${this.segmentIndex}`,data:{points:t,type:r,segmentIndex:this.segmentIndex,color:n??this.color},segmentIndex:this.segmentIndex,color:n??this.color});this.contours.push(a)})),this._updateContourSetCentroid()}_updateContourSetCentroid(){const e=this.getTotalNumberOfPoints(),t=this.getFlatPointsArray(),r=t.reduce(((e,t)=>[e[0]+t[0],e[1]+t[1],e[2]+t[2]]),[0,0,0]),n=[r[0]/e,r[1]/e,r[2]/e],a=t.reduce(((e,t)=>this._getDistance(n,t)e+t.sizeInBytes),0)}getCentroid(){return this.centroid}getSegmentIndex(){return this.segmentIndex}getColor(){return this.color}getContours(){return this.contours}getSizeInBytes(){return this.sizeInBytes}getFlatPointsArray(){return this.contours.map((e=>e.getPoints())).flat()}getNumberOfContours(){return this.contours.length}getTotalNumberOfPoints(){return this.contours.reduce(((e,t)=>e+t.getPoints().length),0)}getNumberOfPointsArray(){return this.contours.reduce(((e,t,r)=>(e[r]=this.getNumberOfPointsInAContour(r),e)),[])}getPointsInContour(e){return this.contours[e].getPoints()}getNumberOfPointsInAContour(e){return this.getPointsInContour(e).length}_getDistance(e,t){return Math.sqrt((e[0]-t[0])**2+(e[1]-t[1])**2+(e[2]-t[2])**2)}}async function $v(e,t){let r=qd.getGeometry(e);if(r)return r;if(t.type!==M.CONTOUR)throw new Error("Unknown geometry type, Only CONTOUR is supported");r=function(e,t){if(!t||0===t.data.length)throw new Error("Invalid contour set data, see publicContourSetData type for more info");if(!t.id)throw new Error("Invalid contour set data, each contour set must have an id");if(!t.data||!Array.isArray(t.data))throw new Error("Invalid contour set data, each contour set must have an array of contours");t.data.forEach((e=>{if(!e.points||!Array.isArray(e.points))throw new Error("Invalid contour set data, each contour must have an array of points");e.points.forEach((e=>{if(!e||!Array.isArray(e)||3!==e.length)throw new Error("Invalid contour set data, each point must be an array of length 3")}))}));const r=new Yv({id:t.id,data:t.data,color:t.color,frameOfReferenceUID:t.frameOfReferenceUID,segmentIndex:t.segmentIndex}),n={id:e,type:M.CONTOUR,data:r,sizeInBytes:r.getSizeInBytes()};return n}(e,t.geometryData);const n={promise:Promise.resolve(r)};return await qd.putGeometryLoadObject(e,n),r}},17197:(e,t,r)=>{"use strict";r.d(t,{ZP:()=>g});var n=r(78826),a=r(87765),o=r(41168),i=r(54131),s=r(89262);function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function c(e){for(var t=1;t2&&void 0!==arguments[2]?arguments[2]:{};i.ZP.extend(e,t,function(e){return c({empty:!0,numberOfComponents:1,dataType:s.Tu.UNSIGNED_INT},e)}(r)),function(e,t){t.classHierarchy.push("vtkCellArray");var r=c({},e);e.getNumberOfCells=function(r){return void 0===t.numberOfCells||r?(t.cellSizes?t.numberOfCells=t.cellSizes.length:t.numberOfCells=d(e.getData()),t.numberOfCells):t.numberOfCells},e.getCellSizes=function(r){return void 0===t.cellSizes||r?(t.cellSizes=u(e.getData()),t.cellSizes):t.cellSizes},e.resize=function(n){var a=e.getNumberOfTuples();r.resize(n);var o=e.getNumberOfTuples();o{"use strict";r.d(t,{ZP:()=>y});var n=r(87765),a=r(89262),o=r(41168),i=r(59474);function s(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;ta&&(a=o);return{min:n,max:a}}function d(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1;if(t<0&&r>1){for(var n=e.length/r,a=new Float64Array(n),o=0,i=0;o1&&void 0!==arguments[1]?arguments[1]:0,r=e||[];r.length<=t;)r.push(null);return r}function p(e){return Object.prototype.toString.call(e).slice(8,-1)}var g={computeRange:d,createRangeHelper:function(){var e=Number.MAX_VALUE,t=-Number.MAX_VALUE,r=0,n=0;return{add:function(a){e>a&&(e=a),tr&&(r=o)}return r}};var m={name:"",numberOfComponents:1,dataType:a.ZP.DefaultDataType,rangeTuple:[0,0]};function h(e,t){var r,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(Object.assign(t,m,n),!t.empty&&!t.values&&!t.size)throw new TypeError("Cannot create vtkDataArray object without: size > 0, values");(t.values?Array.isArray(t.values)&&(t.values=(0,o.MR)(t.dataType,t.values)):t.values=(0,o.B5)(t.dataType,t.size),t.values)&&(t.size=null!==(r=t.size)&&void 0!==r?r:t.values.length,t.dataType=p(t.values));(0,o.j6)(e,t),(0,o.t8)(e,t,["name","numberOfComponents"]),function(e,t){function r(r){if(r<0)return!1;var n=e.getNumberOfComponents(),a=t.values.length/(n>0?n:1);if(r===a)return!0;if(r>a){var i=t.values;return t.values=(0,o.B5)(t.dataType,(r+a)*n),t.values.set(i),!0}return t.size>r*n&&(t.size=r*n,e.dataChange()),!0}t.classHierarchy.push("vtkDataArray"),e.dataChange=function(){t.ranges=null,e.modified()},e.resize=function(n){r(n);var a=n*e.getNumberOfComponents();return t.size!==a&&(t.size=a,e.dataChange(),!0)},e.initialize=function(){e.resize(0)},e.getElementComponentSize=function(){return t.values.BYTES_PER_ELEMENT},e.getComponent=function(e){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return t.values[e*t.numberOfComponents+r]},e.setComponent=function(r,n,a){a!==t.values[r*t.numberOfComponents+n]&&(t.values[r*t.numberOfComponents+n]=a,e.dataChange())},e.getValue=function(r){var n=r/t.numberOfComponents,a=r%t.numberOfComponents;return e.getComponent(n,a)},e.setValue=function(r,n){var a=r/t.numberOfComponents,o=r%t.numberOfComponents;e.setComponent(a,o,n)},e.getData=function(){return t.size===t.values.length?t.values:t.values.subarray(0,t.size)},e.getRange=function(){var r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:-1,n=r<0?t.numberOfComponents:r,a=null;return t.ranges||(t.ranges=f(t.ranges,t.numberOfComponents)),(a=t.ranges[n])?(t.rangeTuple[0]=a.min,t.rangeTuple[1]=a.max,t.rangeTuple):(a=d(e.getData(),r,t.numberOfComponents),t.ranges[n]=a,t.rangeTuple[0]=a.min,t.rangeTuple[1]=a.max,t.rangeTuple)},e.setRange=function(e,r){t.ranges||(t.ranges=f(t.ranges,t.numberOfComponents));var n={min:e.min,max:e.max};return t.ranges[r]=n,t.rangeTuple[0]=n.min,t.rangeTuple[1]=n.max,t.rangeTuple},e.setTuple=function(e,r){for(var n=e*t.numberOfComponents,a=0;a1&&void 0!==arguments[1]?arguments[1]:[],n=t.numberOfComponents||1,a=e*n;switch(n){case 4:r[3]=t.values[a+3];case 3:r[2]=t.values[a+2];case 2:r[1]=t.values[a+1];case 1:r[0]=t.values[a];break;default:for(var o=n-1;o>=0;--o)r[o]=t.values[a+o]}return r},e.getTuples=function(r,n){var a=(null!=r?r:0)*t.numberOfComponents,o=(null!=n?n:e.getNumberOfTuples())*t.numberOfComponents,i=e.getData().subarray(a,o);return i.length>0?i:null},e.getTupleLocation=function(){return(arguments.length>0&&void 0!==arguments[0]?arguments[0]:1)*t.numberOfComponents},e.getNumberOfComponents=function(){return t.numberOfComponents},e.getNumberOfValues=function(){return t.size},e.getNumberOfTuples=function(){return t.size/t.numberOfComponents},e.getDataType=function(){return t.dataType},e.newClone=function(){return v({empty:!0,name:t.name,dataType:t.dataType,numberOfComponents:t.numberOfComponents})},e.getName=function(){return t.name||(e.modified(),t.name="vtkDataArray".concat(e.getMTime())),t.name},e.setData=function(r,n){t.values=r,t.size=r.length,t.dataType=p(r),n&&(t.numberOfComponents=n),t.size%t.numberOfComponents!=0&&(t.numberOfComponents=1),e.dataChange()},e.getState=function(){if(t.deleted)return null;var r=l(l({},t),{},{vtkClass:e.getClassName()});r.values=Array.from(r.values),delete r.buffer,Object.keys(r).forEach((function(e){r[e]||delete r[e]}));var n={};return Object.keys(r).sort().forEach((function(e){n[e]=r[e]})),n.mtime&&delete n.mtime,n},e.deepCopy=function(t){e.shallowCopy(t),e.setData(t.getData().slice())},e.interpolateTuple=function(r,n,a,o,i,s){var l=t.numberOfComponents||1;l===n.getNumberOfComponents()&&l===o.getNumberOfComponents()||c("numberOfComponents must match");var u=n.getTuple(a),d=o.getTuple(i),f=[];switch(f.length=l,l){case 4:f[3]=u[3]+(d[3]-u[3])*s;case 3:f[2]=u[2]+(d[2]-u[2])*s;case 2:f[1]=u[1]+(d[1]-u[1])*s;case 1:f[0]=u[0]+(d[0]-u[0])*s;break;default:for(var p=0;p{"use strict";r.d(t,{Tu:()=>a,Xe:()=>n,ZP:()=>o});var n={Int8Array:1,Uint8Array:1,Uint8ClampedArray:1,Int16Array:2,Uint16Array:2,Int32Array:4,Uint32Array:4,Float32Array:4,Float64Array:8},a={VOID:"",CHAR:"Int8Array",SIGNED_CHAR:"Int8Array",UNSIGNED_CHAR:"Uint8Array",SHORT:"Int16Array",UNSIGNED_SHORT:"Uint16Array",INT:"Int32Array",UNSIGNED_INT:"Uint32Array",FLOAT:"Float32Array",DOUBLE:"Float64Array"},o={DefaultDataType:a.FLOAT,DataTypeByteSize:n,VtkDataTypes:a}},1600:(e,t,r)=>{"use strict";r.d(t,{ZP:()=>g});var n=r(41168),a=r(59474),o=r(4666),i=r(77415),s=r(89262),l=n.default.vtkErrorMacro,c=0,u=1,d=2;var f={numberOfColors:256,hueRange:[0,.66667],saturationRange:[1,1],valueRange:[1,1],alphaRange:[1,1],nanColor:[.5,0,0,1],belowRangeColor:[0,0,0,1],aboveRangeColor:[1,1,1,1],useAboveRangeColor:!1,useBelowRangeColor:!1,alpha:1};function p(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,f,r),o.ZP.extend(e,t,r),t.table||(t.table=[]),t.buildTime={},n.default.obj(t.buildTime),t.opaqueFlagBuildTime={},n.default.obj(t.opaqueFlagBuildTime,{mtime:0}),t.insertTime={},n.default.obj(t.insertTime,{mtime:0}),n.default.get(e,t,["buildTime"]),n.default.setGet(e,t,["numberOfColors","useAboveRangeColor","useBelowRangeColor"]),n.default.setArray(e,t,["alphaRange","hueRange","saturationRange","valueRange"],2),n.default.setArray(e,t,["nanColor","belowRangeColor","aboveRangeColor"],4),n.default.getArray(e,t,["hueRange","saturationRange","valueRange","alphaRange","nanColor","belowRangeColor","aboveRangeColor"]),function(e,t){t.classHierarchy.push("vtkLookupTable"),e.isOpaque=function(){if(t.opaqueFlagBuildTime.getMTime()t.range[1]?t.maxIndex+u+1.5:(r=(e+t.shift)*t.scale)e[0]&&(t.scale=(t.maxIndex+1)/(e[1]-e[0]))},e.mapScalarsThroughTable=function(r,n,a,o){var s=e.linearLookup;t.indexedLookup&&(s=e.indexedLookupFunction);var l=e.getMappingRange(),c={maxIndex:e.getNumberOfColors()-1,range:l,shift:0,scale:0};e.lookupShiftAndScale(l,c);var u=e.getAlpha(),d=r.getNumberOfTuples(),f=r.getNumberOfComponents(),p=n.getData(),g=r.getData();if(u>=1){if(a===i.OG.RGBA)for(var m=0;mt.buildTime.getMTime()&&t.insertTime.getMTime()<=t.buildTime.getMTime())&&e.forceBuild()},t.table.length>0&&t.insertTime.modified()}(e,t)}var g={newInstance:n.default.newInstance(p,"vtkLookupTable"),extend:p}},32899:(e,t,r)=>{"use strict";r.d(t,{ZP:()=>n.f});r(16976),r(78826),r(53775),r(41168),r(40286);var n=r(59474)},40286:(e,t,r)=>{"use strict";r.d(t,{B0:()=>i,Ib:()=>o,Wd:()=>n,qt:()=>a});var n=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],a=[1,0,0,0,1,0,0,0,1],o=1e-6,i=1e-12},59474:(e,t,r)=>{"use strict";r.d(t,{A:()=>b,C:()=>Qe,F:()=>ct,G:()=>Ge,H:()=>Ze,I:()=>Xe,J:()=>C,K:()=>T,L:()=>ie,M:()=>E,N:()=>pt,O:()=>de,P:()=>Ye,Q:()=>M,a:()=>ye,b:()=>we,c:()=>Je,d:()=>H,e:()=>ee,f:()=>bt,g:()=>Le,h:()=>We,i:()=>ft,j:()=>Z,k:()=>U,l:()=>q,m:()=>z,n:()=>X,o:()=>se,r:()=>y,s:()=>k,u:()=>qe});var n=r(16976),a=r(78826),o=r(53775),i=r.n(o),s=r(41168),l=r(40286),c=s.default.vtkErrorMacro,u=s.default.vtkWarningMacro,d=0,f=20;function p(e){return function(){return c("vtkMath::".concat(e," - NOT IMPLEMENTED"))}}function g(e,t,r,n){for(var a,o=0;o0&&void 0!==arguments[0]?arguments[0]:3,t=Array(e),r=0;r2&&void 0!==arguments[2]?arguments[2]:1,r=1/0,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,a=e.length;n2&&void 0!==arguments[2]?arguments[2]:1,r=-1/0,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,a=e.length;n2&&void 0!==arguments[2]?arguments[2]:1,r=1/0,n=-1/0,a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,o=e.length;a=0;--a)if(r[a]0&&void 0!==arguments[0]?arguments[0]:0;return e+((arguments.length>1&&void 0!==arguments[1]?arguments[1]:1)-e)*Math.random()}var F=p("gaussian");function U(e,t,r){return r[0]=e[0]+t[0],r[1]=e[1]+t[1],r[2]=e[2]+t[2],r}function k(e,t,r){return r[0]=e[0]-t[0],r[1]=e[1]-t[1],r[2]=e[2]-t[2],r}function G(e,t){return e[0]*=t,e[1]*=t,e[2]*=t,e}function W(e,t){return e[0]*=t,e[1]*=t,e}function z(e,t,r,n){return n[0]=e[0]+t[0]*r,n[1]=e[1]+t[1]*r,n[2]=e[2]+t[2]*r,n}function j(e,t,r,n){return n[0]=e[0]+t[0]*r,n[1]=e[1]+t[1]*r,n}function H(e,t){return e[0]*t[0]+e[1]*t[1]+e[2]*t[2]}function K(e,t,r){r[0]=e[0]*t[0],r[1]=e[0]*t[1],r[2]=e[0]*t[2],r[3]=e[1]*t[0],r[4]=e[1]*t[1],r[5]=e[1]*t[2],r[6]=e[2]*t[0],r[7]=e[2]*t[1],r[8]=e[2]*t[2]}function Z(e,t,r){var n=e[1]*t[2]-e[2]*t[1],a=e[2]*t[0]-e[0]*t[2],o=e[0]*t[1]-e[1]*t[0];return r[0]=n,r[1]=a,r[2]=o,r}function X(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:3;switch(t){case 1:return Math.abs(e);case 2:return Math.sqrt(e[0]*e[0]+e[1]*e[1]);case 3:return Math.sqrt(e[0]*e[0]+e[1]*e[1]+e[2]*e[2]);default:for(var r=0,n=0;nl&&s>c?(a=0,o=1,i=2):l>c?(a=1,o=2,i=0):(a=2,o=0,i=1);var d=e[a]/u,f=e[o]/u,p=e[i]/u,g=Math.sqrt(d*d+p*p);if(0!==n){var m=Math.sin(n),h=Math.cos(n);t&&(t[a]=(p*h-d*f*m)/g,t[o]=m*g,t[i]=(-d*h-f*p*m)/g),r&&(r[a]=(-p*m-d*f*h)/g,r[o]=h*g,r[i]=(d*m-f*p*h)/g)}else t&&(t[a]=p/g,t[o]=0,t[i]=-d/g),r&&(r[a]=-d*f/g,r[o]=g,r[i]=-f*p/g)}function $(e,t,r){var n=H(t,t);if(0===n)return r[0]=0,r[1]=0,r[2]=0,!1;for(var a=H(e,t)/n,o=0;o<3;o++)r[o]=t[o];return G(r,a),!0}function Q(e,t){return e[0]*t[0]+e[1]*t[1]}function J(e,t,r){var n=Q(t,t);if(0===n)return r[0]=0,r[1]=0,!1;for(var a=Q(e,t)/n,o=0;o<2;o++)r[o]=t[o];return W(r,a),!0}function ee(e,t){return(e[0]-t[0])*(e[0]-t[0])+(e[1]-t[1])*(e[1]-t[1])+(e[2]-t[2])*(e[2]-t[2])}function te(e,t){var r=[0,0,0];return Z(e,t,r),Math.atan2(X(r),H(e,t))}function re(e,t,r){var n=Math.abs(e-r);return 1/Math.sqrt(2*Math.PI*t)*Math.exp(-Math.pow(n,2)/(2*t))}function ne(e,t,r){var n=Math.abs(e-r);return Math.exp(-Math.pow(n,2)/(2*t))}function ae(e,t,r){r[0]=e[0]*t[0],r[1]=e[0]*t[1],r[2]=e[1]*t[0],r[3]=e[1]*t[1]}function oe(e){return Math.sqrt(e[0]*e[0]+e[1]*e[1])}function ie(e){var t=oe(e);return 0!==t&&(e[0]/=t,e[1]/=t),t}function se(){for(var e=arguments.length,t=new Array(e),r=0;ra&&(a=n),(n=Math.abs(e[3*i+2]))>a&&(a=n),o[i]=1/a;a=o[0]*Math.abs(e[0]),r=0,(n=o[1]*Math.abs(e[3]))>=a&&(a=n,r=1),(n=o[2]*Math.abs(e[6]))>=a&&(r=2),0!==r&&(g(e,3,r,0),o[r]=o[0]),t[0]=r,e[3]/=e[0],e[6]/=e[0],e[4]-=e[3]*e[1],e[7]-=e[6]*e[1],a=o[1]*Math.abs(e[4]),r=1,(n=o[2]*Math.abs(e[7]))>=a&&(r=2,g(e,3,1,2),o[2]=o[1]),t[1]=r,e[7]/=e[4],e[5]-=e[3]*e[2],e[8]-=e[6]*e[2]+e[7]*e[5],t[2]=2}function ce(e,t,r){var n=r[t[0]];r[t[0]]=r[0],r[0]=n,n=r[t[1]],r[t[1]]=r[1],r[1]=n-e[3]*r[0],n=r[t[2]],r[t[2]]=r[2],r[2]=n-e[6]*r[0]-e[7]*r[1],r[2]/=e[8],r[1]=(r[1]-e[5]*r[2])/e[4],r[0]=(r[0]-e[1]*r[1]-e[2]*r[2])/e[0]}function ue(e,t,r){var n=e[0],a=e[1],o=e[2],i=e[3],s=e[4],l=e[5],c=e[6],u=e[7],d=e[8],f=+se(s,u,l,d),p=-se(i,c,l,d),g=+se(i,c,s,u),m=-se(a,u,o,d),h=+se(n,c,o,d),v=-se(n,c,a,u),y=+se(a,s,o,l),b=-se(n,i,o,l),T=+se(n,i,a,s),C=n*f+a*p+o*g,x=f*t[0]+m*t[1]+y*t[2],S=p*t[0]+h*t[1]+b*t[2],P=g*t[0]+v*t[1]+T*t[2];r[0]=x/C,r[1]=S/C,r[2]=P/C}function de(e,t,r){var n=e[0]*t[0]+e[1]*t[1]+e[2]*t[2],a=e[3]*t[0]+e[4]*t[1]+e[5]*t[2],o=e[6]*t[0]+e[7]*t[1]+e[8]*t[2];r[0]=n,r[1]=a,r[2]=o}function fe(e,t,r){for(var n=(0,a.Z)(e),o=(0,a.Z)(t),i=0;i<3;i++)r[i]=n[0]*o[i]+n[1]*o[i+3]+n[2]*o[i+6],r[i+3]=n[3]*o[i]+n[4]*o[i+3]+n[5]*o[i+6],r[i+6]=n[6]*o[i]+n[7]*o[i+3]+n[8]*o[i+6]}function pe(e,t,r,n,o,i,s){n!==o&&c("Number of columns of A must match number of rows of B.");for(var l=(0,a.Z)(e),u=(0,a.Z)(t),d=0;d2&&void 0!==arguments[2]?arguments[2]:l.Ib;if(e.length!==t.length)return!1;return e.every((function(e,n){return Math.abs(e-t[n])<=r}))}var ye=ve;function be(e){for(var t=0;t<3;t++)e[3*t]=e[3*t+1]=e[3*t+2]=0,e[3*t+t]=1}function Te(e,t){for(var r=0;r1&&void 0!==arguments[1]?arguments[1]:l.Ib;return ye(e,l.Wd,t)}function xe(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:l.Ib;return ye(e,l.qt,t)}function Se(e,t){var r=e[0]*e[0],n=e[0]*e[1],a=e[0]*e[2],o=e[0]*e[3],i=e[1]*e[1],s=e[2]*e[2],l=e[3]*e[3],c=e[1]*e[2],u=e[1]*e[3],d=e[2]*e[3],f=i+s+l,p=1/(r+f),g=(r-f)*p;p*=2,t[0]=i*p+g,t[3]=(c+o)*p,t[6]=(u-a)*p,t[1]=(c-o)*p,t[4]=s*p+g,t[7]=(d+n)*p,t[2]=(u+a)*p,t[5]=(d-n)*p,t[8]=l*p+g}function Pe(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;if(!"".concat(e).includes("e"))return+"".concat(Math.round("".concat(e,"e+").concat(t)),"e-").concat(t);var r="".concat(e).split("e"),n="";return+r[1]+t>0&&(n="+"),+"".concat(Math.round("".concat(+r[0],"e").concat(n).concat(+r[1]+t)),"e-").concat(t)}function we(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[0,0,0],r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0;return t[0]=Pe(e[0],r),t[1]=Pe(e[1],r),t[2]=Pe(e[2],r),t}function Oe(e,t,r,n){var a,o,i,s,c,d,p,g,v,y,b,T,C,x,S,P,w=h(t),O=h(t),I=function(e,t,r){x=e[t],C=e[r],e[t]=x-T*(C+x*y),e[r]=C+T*(x-C*y)};for(Te(t,n),c=0;c3&&Math.abs(r[c])+x===Math.abs(r[c])&&Math.abs(r[s])+x===Math.abs(r[s]))e[c*t+s]=0;else if(Math.abs(e[c*t+s])>p){for(C=r[s]-r[c],Math.abs(C)+x===Math.abs(C)?v=e[c*t+s]/C:(g=.5*C/e[c*t+s],v=1/(Math.abs(g)+Math.sqrt(1+g*g)),g<0&&(v=-v)),S=1/Math.sqrt(1+v*v),y=(T=v*S)/(1+S),C=v*e[c*t+s],O[c]-=C,O[s]+=C,r[c]-=C,r[s]+=C,e[c*t+s]=0,o=0;o<=c-1;o++)I(e,o*t+c,o*t+s);for(o=c+1;o<=s-1;o++)I(e,c*t+o,o*t+s);for(o=s+1;o=f)return u("vtkMath::Jacobi: Error extracting eigenfunctions"),0;for(o=0;o=P||Math.abs(r[a]-P)>1)+(1&t);for(d=0,a=0;a=0&&d++;if(d(n=l>s?l:s)?c:n,a[i]=1,0!==n&&(a[i]/=n)}var u=Math.abs(t[0])*a[0],d=Math.abs(t[3])*a[1],f=Math.abs(t[6])*a[2];o[0]=0,d>=(n=u)&&(n=d,o[0]=1),f>=n&&(o[0]=2),0!==o[0]&&(m(t,3,o[0],0),a[o[0]]=a[0]);var p=Math.abs(t[4])*a[1],g=Math.abs(t[7])*a[2];o[1]=1,g>=(n=p)&&(o[1]=2,m(t,3,1,2)),o[2]=2;var v=0;if(he(t)<0){v=1;for(var y=0;y<9;y++)t[y]=-t[y]}var b=h(4);if(Ie(t,b),Se(b,t),v)for(var T=0;T<9;T++)t[T]=-t[T];1!==o[1]&&m(t,3,o[1],1),0!==o[0]&&m(t,3,o[0],0)}function Ee(e,t,r){var n,o,i,s,l,c;if(Oe((0,a.Z)(e),3,t,r),t[0]!==t[1]||t[0]!==t[2]){for(ge(r,r),n=0;n<3;n++)if(t[(n+1)%3]===t[(n+2)%3]){for(c=Math.abs(r[3*n]),s=0,o=1;o<3;o++)c<(l=Math.abs(r[3*n+o]))&&(c=l,s=o);s!==n&&(l=t[s],t[s]=t[n],t[n]=l,g(r,3,n,s)),r[3*s+s]<0&&(r[3*s]=-r[3*s],r[3*s+1]=-r[3*s+1],r[3*s+2]=-r[3*s+2]),i=(s+2)%3,r[3*(o=(s+1)%3)]=0,r[3*o+1]=0,r[3*o+2]=0,r[3*o+o]=1;var u=Z([r[3*s],r[3*s+1],r[3*s+2]],[r[3*o],r[3*o+1],r[3*o+2]],[]);q(u);for(var d=Z(u,[r[3*s],r[3*s+1],r[3*s+2]],[]),f=0;f<3;f++)r[3*i+f]=u[f],r[3*o+f]=d[f];return void ge(r,r)}for(c=Math.abs(r[0]),s=0,n=1;n<3;n++)c<(l=Math.abs(r[3*n]))&&(c=l,s=n);if(0!==s){var p=t[s];t[s]=t[0],t[0]=p,g(r,3,s,0)}if(Math.abs(r[4])i&&(i=d);if(0===i)return u("Unable to factor linear system"),0;p[n]=1/i}for(a=0;a=i&&(i=c,f=n)}if(a!==f){for(o=0;o=0)for(o=i;o<=a-1;o++)l-=e[a*n+o]*r[o];else 0!==l&&(i=a);r[a]=l}for(a=n-1;a>=0;a--){for(l=r[a],o=a+1;o4&&void 0!==arguments[4]?arguments[4]:null,a=(arguments.length>3&&void 0!==arguments[3]?arguments[3]:null)||h(r),o=n||h(r);if(0===De(e,a,r))return null;for(var i=0;in&&(n=Math.abs(e[a*t+o]));for(var i=0;i6&&void 0!==arguments[6])||arguments[6];if(el.B0&&(g=0,p[d]=0);if(g&&1===a)return u("Detected homogeneous system (Y=0), calling SolveHomogeneousLeastSquares()"),Fe(e,t,r,o);if(g)v=1;else for(d=0;d1&&void 0!==arguments[1]?arguments[1]:[0,.5,1];switch(e.length){case 3:return t[0]=17*parseInt(e[0],16)/255,t[1]=17*parseInt(e[1],16)/255,t[2]=17*parseInt(e[2],16)/255,t;case 4:return t[0]=17*parseInt(e[1],16)/255,t[1]=17*parseInt(e[2],16)/255,t[2]=17*parseInt(e[3],16)/255,t;case 6:return t[0]=parseInt(e.substr(0,2),16)/255,t[1]=parseInt(e.substr(2,2),16)/255,t[2]=parseInt(e.substr(4,2),16)/255,t;case 7:return t[0]=parseInt(e.substr(1,2),16)/255,t[1]=parseInt(e.substr(3,2),16)/255,t[2]=parseInt(e.substr(5,2),16)/255,t;case 9:return t[0]=parseInt(e.substr(1,2),16)/255,t[1]=parseInt(e.substr(3,2),16)/255,t[2]=parseInt(e.substr(5,2),16)/255,t[3]=parseInt(e.substr(7,2),16)/255,t;default:return t}}function Ge(e,t){var r,a,o=(0,n.Z)(e,3),i=o[0],s=o[1],l=o[2],c=1/6,u=i,d=i;s>u?u=s:su?u=l:l0?(u-d)/u:0)>0?(r=i===u?c*(s-l)/(u-d):s===u?1/3+c*(l-i)/(u-d):2/3+c*(i-s)/(u-d))<0&&(r+=1):r=0,t[0]=r,t[1]=a,t[2]=f}function We(e,t){var r,a,o,i=(0,n.Z)(e,3),s=i[0],l=i[1],c=i[2],u=1/3,d=1/6,f=2/3,p=5/6;s>d&&s<=u?(a=1,r=(u-s)/d,o=0):s>u&&s<=.5?(a=1,o=(s-u)/d,r=0):s>.5&&s<=f?(o=1,a=(f-s)/d,r=0):s>f&&s<=p?(o=1,r=(s-f)/d,a=0):s>p&&s<=1?(r=1,o=(1-s)/d,a=0):(r=1,a=s/d,o=0),r=l*r+(1-l),a=l*a+(1-l),o=l*o+(1-l),r*=c,a*=c,o*=c,t[0]=r,t[1]=a,t[2]=o}function ze(e,t){var r=(0,n.Z)(e,3),a=(r[0]+16)/116,o=r[1]/500+a,i=a-r[2]/200;a=Math.pow(a,3)>.008856?Math.pow(a,3):(a-16/116)/7.787,o=Math.pow(o,3)>.008856?Math.pow(o,3):(o-16/116)/7.787,i=Math.pow(i,3)>.008856?Math.pow(i,3):(i-16/116)/7.787;t[0]=.9505*o,t[1]=1*a,t[2]=1.089*i}function je(e,t){var r=(0,n.Z)(e,3),a=r[0]/.9505,o=r[1]/1,i=r[2]/1.089;a=a>.008856?Math.pow(a,1/3):7.787*a+16/116,o=o>.008856?Math.pow(o,1/3):7.787*o+16/116,i=i>.008856?Math.pow(i,1/3):7.787*i+16/116,t[0]=116*o-16,t[1]=500*(a-o),t[2]=200*(o-i)}function He(e,t){var r=(0,n.Z)(e,3),a=r[0],o=r[1],i=r[2],s=3.2406*a+-1.5372*o+-.4986*i,l=-.9689*a+1.8758*o+.0415*i,c=.0557*a+-.204*o+1.057*i;s>.0031308?s=1.055*Math.pow(s,1/2.4)-.055:s*=12.92,l>.0031308?l=1.055*Math.pow(l,1/2.4)-.055:l*=12.92,c>.0031308?c=1.055*Math.pow(c,1/2.4)-.055:c*=12.92;var u=s;u1&&(s/=u,l/=u,c/=u),s<0&&(s=0),l<0&&(l=0),c<0&&(c=0),t[0]=s,t[1]=l,t[2]=c}function Ke(e,t){var r=(0,n.Z)(e,3),a=r[0],o=r[1],i=r[2];a>.04045?a=Math.pow((a+.055)/1.055,2.4):a/=12.92,o>.04045?o=Math.pow((o+.055)/1.055,2.4):o/=12.92,i>.04045?i=Math.pow((i+.055)/1.055,2.4):i/=12.92,t[0]=.4124*a+.3576*o+.1805*i,t[1]=.2126*a+.7152*o+.0722*i,t[2]=.0193*a+.1192*o+.9505*i}function Ze(e,t){var r=[0,0,0];Ke(e,r),je(r,t)}function Xe(e,t){var r=[0,0,0];ze(e,r),He(r,t)}function qe(e){return e[0]=1,e[1]=-1,e[2]=1,e[3]=-1,e[4]=1,e[5]=-1,e}function Ye(e){return!(e[1]-e[0]<0)}function $e(e,t,r){return r[0]=Math.min(e[0],t[0]),r[1]=Math.max(e[0],t[0]),r[2]=Math.min(e[1],t[1]),r[3]=Math.max(e[1],t[1]),r[4]=Math.min(e[2],t[2]),r[5]=Math.max(e[2],t[2]),r}function Qe(e,t,r){return er?r:e}function Je(e,t,r){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[0,0,0];return n[0]=Qe(e[0],t[0],r[0]),n[1]=Qe(e[1],t[1],r[1]),n[2]=Qe(e[2],t[2],r[2]),n}function et(e,t){var r=0;return t[0]!==t[1]&&(r=((r=et[1]?t[1]:e)-t[0])/(t[1]-t[0])),r}var tt=p("GetScalarTypeFittingRange"),rt=p("GetAdjustedScalarRange");function nt(e,t){if(!e||!t)return 0;for(var r=0;r<6;r+=2)if(e[r]t[r+1]||e[r+1]t[r+1])return 0;return 1}function at(e,t,r){if(!e||!t)return 0;for(var n=0;n<6;n+=2)if(e[n]+r[n/2]t[n+1]||e[n+1]+r[n/2]t[n+1])return 0;return 1}function ot(e,t,r){if(!e||!t||!r)return 0;for(var n=0;n<3;n++)if(e[n]+r[n]t[2*n+1])return 0;return 1}function it(e,t,r,n){for(var a=h(3),o=h(3),i=h(3),s=h(3),l=h(3),c=h(3),u=0;u<3;++u)a[u]=e[u]-t[u],o[u]=t[u]-r[u],i[u]=r[u]-e[u],s[u]=-a[u],l[u]=-o[u],c[u]=-i[u];var d=X(s),f=X(l),p=X(i),g=h(3);Z(a,o,g);for(var m=X(g),v=d*f*p/(2*m),y=2*m*m,b=f*f*H(a,c)/y,T=p*p*H(s,o)/y,C=d*d*H(i,l)/y,x=0;x<3;++x)n[x]=b*e[x]+T*t[x]+C*r[x];return v}var st=1/0,lt=-1/0,ct=function(e){return!Number.isFinite(e)},ut=Number.isFinite,dt=Number.isNaN,ft=dt;function pt(){return[].concat([Number.MAX_VALUE,-Number.MAX_VALUE,Number.MAX_VALUE,-Number.MAX_VALUE,Number.MAX_VALUE,-Number.MAX_VALUE])}function gt(e){for(var t=-1,r=-1,n=0;nt&&(r=n,t=a)}return r}function mt(e){var t=Math.floor(255*e);return t>15?t.toString(16):"0".concat(t.toString(16))}function ht(e){return"".concat(arguments.length>1&&void 0!==arguments[1]?arguments[1]:"#").concat(e.map(mt).join(""))}function vt(e){return Math.round(255*e)}function yt(e){return 3===e.length?"rgb(".concat(e.map(vt).join(", "),")"):"rgba(".concat(vt(e[0]||0),", ").concat(vt(e[1]||0),", ").concat(vt(e[2]||0),", ").concat(e[3]||0,")")}var bt={Pi:v,radiansFromDegrees:y,degreesFromRadians:b,round:T,floor:C,ceil:x,ceilLog2:A,min:S,max:P,arrayMin:w,arrayMax:O,arrayRange:I,isPowerOfTwo:M,nearestPowerOfTwo:E,factorial:R,binomial:D,beginCombination:V,nextCombination:L,randomSeed:_,getSeed:N,random:B,gaussian:F,add:U,subtract:k,multiplyScalar:G,multiplyScalar2D:W,multiplyAccumulate:z,multiplyAccumulate2D:j,dot:H,outer:K,cross:Z,norm:X,normalize:q,perpendiculars:Y,projectVector:$,projectVector2D:J,distance2BetweenPoints:ee,angleBetweenVectors:te,gaussianAmplitude:re,gaussianWeight:ne,dot2D:Q,outer2D:ae,norm2D:oe,normalize2D:ie,determinant2x2:se,LUFactor3x3:le,LUSolve3x3:ce,linearSolve3x3:ue,multiply3x3_vect3:de,multiply3x3_mat3:fe,multiplyMatrix:pe,transpose3x3:ge,invert3x3:me,identity3x3:be,identity:Te,isIdentity:Ce,isIdentity3x3:xe,determinant3x3:he,quaternionToMatrix3x3:Se,areEquals:ve,areMatricesEqual:ye,roundNumber:Pe,roundVector:we,matrix3x3ToQuaternion:Ie,multiplyQuaternion:Ae,orthogonalize3x3:Re,diagonalize3x3:Ee,singularValueDecomposition3x3:Me,solveLinearSystem:Le,invertMatrix:_e,luFactorLinearSystem:De,luSolveLinearSystem:Ve,estimateMatrixCondition:Ne,jacobi:Be,jacobiN:Oe,solveHomogeneousLeastSquares:Fe,solveLeastSquares:Ue,hex2float:ke,rgb2hsv:Ge,hsv2rgb:We,lab2xyz:ze,xyz2lab:je,xyz2rgb:He,rgb2xyz:Ke,rgb2lab:Ze,lab2rgb:Xe,uninitializeBounds:qe,areBoundsInitialized:Ye,computeBoundsFromPoints:$e,clampValue:Qe,clampVector:Je,clampAndNormalizeValue:et,getScalarTypeFittingRange:tt,getAdjustedScalarRange:rt,extentIsWithinOtherExtent:nt,boundsIsWithinOtherBounds:at,pointIsWithinBounds:ot,solve3PointCircle:it,inf:st,negInf:lt,isInf:ct,isNan:dt,isNaN:dt,isFinite:ut,createUninitializedBounds:pt,getMajorAxisIndex:gt,floatToHex2:mt,floatRGB2HexCode:ht,float2CssRGBA:yt}},45802:(e,t,r)=>{"use strict";r.d(t,{Z:()=>f});var n=r(78826),a=r(72688),o=r(75755),i=r(45451),s=r(59474),l=r(40286),c=function(e){return e},u=1e-6,d=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];(0,a.Z)(this,e),this.matrix=i._E.identity(new Float64Array(16)),this.tmp=new Float64Array(3),this.angleConv=t?i.DV.toRadian:c}return(0,o.Z)(e,[{key:"rotateFromDirections",value:function(e,t){var r=new Float64Array(3),n=new Float64Array(3),a=new Float64Array(16);i.R3.set(r,e[0],e[1],e[2]),i.R3.set(n,t[0],t[1],t[2]),i.R3.normalize(r,r),i.R3.normalize(n,n);var o=i.R3.dot(r,n);return o>=1||(i.R3.cross(this.tmp,r,n),i.R3.length(this.tmp)1&&void 0!==arguments[1]?arguments[1]:0,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:-1;if((0,s.a)(l.Wd,this.matrix))return this;for(var n=-1===r?e.length:t+3*r,a=t;a{"use strict";r.d(t,{ZP:()=>u});var n=r(41168),a=r(54131),o=r(89262),i=n.default.vtkErrorMacro,s=[1,-1,1,-1,1,-1];var l={empty:!0,numberOfComponents:3,dataType:o.Tu.FLOAT,bounds:[1,-1,1,-1,1,-1]};function c(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,l,r),a.ZP.extend(e,t,r),function(e,t){t.classHierarchy.push("vtkPoints"),e.getNumberOfPoints=e.getNumberOfTuples,e.setNumberOfPoints=function(r){var a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:3;e.getNumberOfPoints()!==r&&(t.size=r*a,t.values=n.default.newTypedArray(t.dataType,t.size),e.setNumberOfComponents(a),e.modified())},e.setPoint=function(t){for(var r=arguments.length,n=new Array(r>1?r-1:0),a=1;a{"use strict";r.d(t,{ZP:()=>y});var n=r(87765),a=r(41168),o=r(54131),i=r(77415),s=r(85687);function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}var c=i.ZP.ScalarMappingTarget,u=i.ZP.VectorMode,d=o.ZP.VtkDataTypes,f=s.ZP.ColorMode,p=a.default.vtkErrorMacro;function g(e){return e}function m(e){return Math.floor(255*e+.5)}var h={alpha:1,vectorComponent:0,vectorSize:-1,vectorMode:u.COMPONENT,mappingRange:null,annotationArray:null,annotatedValueMap:null,indexedLookup:!1};function v(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,h,r),a.default.obj(e,t),t.mappingRange=[0,255],t.annotationArray=[],t.annotatedValueMap=[],a.default.setGet(e,t,["vectorSize","vectorComponent","vectorMode","alpha","indexedLookup"]),a.default.setArray(e,t,["mappingRange"],2),a.default.getArray(e,t,["mappingRange"]),function(e,t){t.classHierarchy.push("vtkScalarsToColors"),e.setVectorModeToMagnitude=function(){return e.setVectorMode(u.MAGNITUDE)},e.setVectorModeToComponent=function(){return e.setVectorMode(u.COMPONENT)},e.setVectorModeToRGBColors=function(){return e.setVectorMode(u.RGBCOLORS)},e.build=function(){},e.isOpaque=function(){return!0},e.setAnnotations=function(r,n){if(!(r&&!n||!r&&n))if(r&&n&&r.length!==n.length)p("Values and annotations do not have the same number of tuples so ignoring");else{if(t.annotationArray=[],n&&r)for(var a=n.length,o=0;o=0?t.annotationArray[a].annotation!==n&&(t.annotationArray[a].annotation=n,o=!0):(t.annotationArray.push({value:r,annotation:n}),a=t.annotationArray.length-1,o=!0),o&&(e.updateAnnotatedValueMap(),e.modified()),a},e.getNumberOfAnnotatedValues=function(){return t.annotationArray.length},e.getAnnotatedValue=function(e){return e<0||e>=t.annotationArray.length?null:t.annotationArray[e].value},e.getAnnotation=function(e){return void 0===t.annotationArray[e]?null:t.annotationArray[e].annotation},e.getAnnotatedValueIndex=function(r){return t.annotationArray.length?e.checkForAnnotatedValue(r):-1},e.removeAnnotation=function(r){var n=e.checkForAnnotatedValue(r),a=n>=0;return a&&(t.annotationArray.splice(n,1),e.updateAnnotatedValueMap(),e.modified()),a},e.resetAnnotations=function(){t.annotationArray=[],t.annotatedValueMap=[],e.modified()},e.getAnnotationColor=function(r,n){if(t.indexedLookup){var a=e.getAnnotatedValueIndex(r);e.getIndexedColor(a,n)}else e.getColor(parseFloat(r),n),n[3]=1},e.checkForAnnotatedValue=function(t){return e.getAnnotatedValueIndexInternal(t)},e.getAnnotatedValueIndexInternal=function(e){if(void 0!==t.annotatedValueMap[e]){var r=t.annotationArray.length;return t.annotatedValueMap[e]%r}return-1},e.getIndexedColor=function(e,t){t[0]=0,t[1]=0,t[2]=0,t[3]=0},e.updateAnnotatedValueMap=function(){t.annotatedValueMap=[];for(var e=t.annotationArray.length,r=0;r1?e.mapVectorsThroughTable(t,s,c.RGBA,-1,-1):(p<0&&(p=0),p>=i&&(p=i-1),e.mapScalarsThroughTable(t,s,c.RGBA,p))}return s},e.mapVectorsToMagnitude=function(e,t,r){for(var n=e.getNumberOfTuples(),a=e.getNumberOfComponents(),o=t.getData(),i=e.getData(),s=0;s=d&&(c=d-1)):(-1===l&&(l=e.getVectorSize()),l<=0?(c=0,l=d):(c<0&&(c=0),c>=d&&(c=d-1),c+l>d&&(l=d-c)),s!==u.MAGNITUDE||1!==d&&1!==l||(s=u.COMPONENT));var f=0;switch(c>0&&(f=c),s){case u.COMPONENT:e.mapScalarsThroughTable(t,r,n,f);break;case u.RGBCOLORS:break;case u.MAGNITUDE:default:var p=o.ZP.newInstance({numberOfComponents:1,values:new Float32Array(t.getNumberOfTuples())});e.mapVectorsToMagnitude(t,p,l),e.mapScalarsThroughTable(p,r,n,0)}},e.luminanceToRGBA=function(e,t,r,n){for(var a=n(r),o=t.getData(),i=e.getData(),s=o.length,l=0,c=0;c=1&&r.getDataType()===d.UNSIGNED_CHAR)return r;var s=o.ZP.newInstance({numberOfComponents:4,empty:!0,size:4*a,dataType:d.UNSIGNED_CHAR});if(a<=0)return s;i=(i=i>0?i:0)<1?i:1;var l=g;switch(r.getDataType()!==d.FLOAT&&r.getDataType()!==d.DOUBLE||(l=m),n){case 1:e.luminanceToRGBA(s,r,i,l);break;case 2:e.luminanceAlphaToRGBA(s,r,l);break;case 3:e.rGBToRGBA(s,r,i,l);break;case 4:e.rGBAToRGBA(s,r,i,l);break;default:return p("Cannot convert colors"),null}return s},e.usingLogScale=function(){return!1},e.getNumberOfAvailableColors=function(){return 16777216},e.setRange=function(t,r){return e.setMappingRange(t,r)},e.getRange=function(){return e.getMappingRange()},e.areScalarsOpaque=function(r,n,a){if(!r)return e.isOpaque();var o=r.getNumberOfComponents();return(n!==f.DEFAULT||r.getDataType()!==d.UNSIGNED_CHAR)&&n!==f.DIRECT_SCALARS||(3===o||1===o?t.alpha>=1:255===r.getRange(o-1)[0])}}(e,t)}var y=function(e){for(var t=1;t{"use strict";r.d(t,{OG:()=>n,ZP:()=>a});var n={LUMINANCE:1,LUMINANCE_ALPHA:2,RGB:3,RGBA:4},a={VectorMode:{MAGNITUDE:0,COMPONENT:1,RGBCOLORS:2},ScalarMappingTarget:n}},91382:(e,t,r)=>{"use strict";r.d(t,{ZP:()=>Z});var n=r(87765),a=r(72688),o=r(75755),i=r(78826),s=r(16976),l=r(59474),c=r(45451),u=r(3969);function d(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}var f=[Number.MAX_VALUE,-Number.MAX_VALUE,Number.MAX_VALUE,-Number.MAX_VALUE,Number.MAX_VALUE,-Number.MAX_VALUE];function p(e,t){return e[0]===t[0]&&e[1]===t[1]&&e[2]===t[2]&&e[3]===t[3]&&e[4]===t[4]&&e[5]===t[5]}function g(e){return e[0]<=e[1]&&e[2]<=e[3]&&e[4]<=e[5]}function m(e,t){return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e}function h(e){return m(e,f)}function v(e,t,r,n){var a=(0,s.Z)(e,6),o=a[0],i=a[1],l=a[2],c=a[3],u=a[4],d=a[5];return e[0]=ot?i:t,e[2]=lr?c:r,e[4]=un?d:n,e}function y(e,t){if(0===t.length)return e;if(Array.isArray(t[0]))for(var r=0;ri?t:i,e[2]=r,e[3]=r>c?r:c,e[4]=n,e[5]=n>d?n:d,o!==t||l!==r||u!==n}function C(e,t,r,n){var a=(0,s.Z)(e,6),o=a[0],i=a[1],l=a[2],c=a[3],u=a[4],d=a[5];return e[0]=t=0?(e[0]*=t,e[1]*=t):(e[0]=t*e[1],e[1]=t*e[0]),r>=0?(e[2]*=r,e[3]*=r):(e[2]=r*e[3],e[3]=r*e[2]),n>=0?(e[4]*=n,e[5]*=n):(e[4]=n*e[5],e[5]=n*e[4]),!0)}function P(e){return[.5*(e[0]+e[1]),.5*(e[2]+e[3]),.5*(e[4]+e[5])]}function w(e,t){return e[2*t+1]-e[2*t]}function O(e){return[w(e,0),w(e,1),w(e,2)]}function I(e){return e.slice(0,2)}function A(e){return e.slice(2,4)}function R(e){return e.slice(4,6)}function E(e){var t=O(e);return t[0]>t[1]?t[0]>t[2]?t[0]:t[2]:t[1]>t[2]?t[1]:t[2]}function M(e){if(g(e)){var t=O(e);return Math.sqrt(t[0]*t[0]+t[1]*t[1]+t[2]*t[2])}return null}function D(e){return[e[0],e[2],e[4]]}function V(e){return[e[1],e[3],e[5]]}function L(e,t){return e<=0&&t>=0||e>=0&&t<=0}function _(e,t){for(var r=0,n=0;n<2;n++)for(var a=2;a<4;a++)for(var o=4;o<6;o++)t[r]=[e[n],e[a],e[o]],r++;return t}function N(e,t,r){return t[0]=e[0],t[1]=e[2],t[2]=e[4],r[0]=e[1],r[1]=e[3],r[2]=e[5],t}function B(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[];r.length<6&&h(r);for(var n=_(e,[]),a=0;a1&&void 0!==arguments[1]?arguments[1]:[];return t[0]=.5*(e[1]-e[0]),t[1]=.5*(e[3]-e[2]),t[2]=.5*(e[5]-e[4]),t}function U(e,t,r,n){for(var a=[].concat(f),o=e.getData(),i=0;ie[2*u+1]?(i[u]=0,c[u]=e[2*u+1],o=!1):i[u]=2;if(o)return n[0]=t[0],n[1]=t[1],n[2]=t[2],a[0]=0,1;for(var d=0;d<3;d++)2!==i[d]&&0!==r[d]?l[d]=(c[d]-t[d])/r[d]:l[d]=-1;for(var f=0;f<3;f++)l[s]1||l[s]<0)return 0;a[0]=l[s];for(var p=0;p<3;p++)if(s!==p){if(n[p]=t[p]+l[s]*r[p],n[p]e[2*p+1])return 0}else n[p]=c[p];return 1}function G(e,t,r){for(var n=[],a=0,o=1,i=1,s=4;s<=5;++s){n[2]=e[s];for(var l=2;l<=3;++l){n[1]=e[l];for(var c=0;c<=1;++c)if(n[0]=e[c],a=u.ZP.evaluate(r,t,n),i&&(o=a>=0?1:-1,i=0),0===a||o>0&&a<0||o<0&&a>0)return 1}}return 0}function W(e,t){if(!g(e)||!g(t))return!1;for(var r,n=[0,0,0,0,0,0],a=0;a<3;a++)if(r=!1,t[2*a]>=e[2*a]&&t[2*a]<=e[2*a+1]?(r=!0,n[2*a]=t[2*a]):e[2*a]>=t[2*a]&&e[2*a]<=t[2*a+1]&&(r=!0,n[2*a]=e[2*a]),t[2*a+1]>=e[2*a]&&t[2*a+1]<=e[2*a+1]?(r=!0,n[2*a+1]=t[2*a+1]):e[2*a+1]>=t[2*a]&&e[2*a+1]<=t[2*a+1]&&(r=!0,n[2*a+1]=e[2*a+1]),!r)return!1;return e[0]=n[0],e[1]=n[1],e[2]=n[2],e[3]=n[3],e[4]=n[4],e[5]=n[5],!0}function z(e,t){if(!g(e)||!g(t))return!1;for(var r=0;r<3;r++)if(!(t[2*r]>=e[2*r]&&t[2*r]<=e[2*r+1]||e[2*r]>=t[2*r]&&e[2*r]<=t[2*r+1]||t[2*r+1]>=e[2*r]&&t[2*r+1]<=e[2*r+1]||e[2*r+1]>=t[2*r]&&e[2*r+1]<=t[2*r+1]))return!1;return!0}function j(e,t,r,n){return!(te[1])&&(!(re[3])&&!(ne[5]))}function H(e,t,r){for(var n=[[0,1,2,3,4,5,6,7],[0,1,4,5,2,3,6,7],[0,2,4,6,1,3,5,7]],a=[0,0,0,0,0,0,0,0],o=0,i=0;i<2;i++)for(var s=2;s<4;s++)for(var l=4;l<6;l++){var c=[e[i],e[s],e[l]];a[o++]=u.ZP.evaluate(r,t,c)}for(var d=2;d--&&!(L(a[n[d][0]],a[n[d][4]])&&L(a[n[d][1]],a[n[d][5]])&&L(a[n[d][2]],a[n[d][6]])&&L(a[n[d][3]],a[n[d][7]])););if(d<0)return!1;for(var f=Math.sign(r[d]),p=Math.abs((e[2*d+1]-e[2*d])*r[d]),g=f>0?1:0,m=0;m<4;m++)if(0!==p){var h=Math.abs(a[n[d][m]])/p;f>0&&hg&&(g=h)}var v=(1-g)*e[2*d]+g*e[2*d+1];return f>0?e[2*d]=v:e[2*d+1]=v,!0}var K=function(){function e(t){(0,a.Z)(this,e),this.bounds=t,this.bounds||(this.bounds=new Float64Array(f))}return(0,o.Z)(e,[{key:"getBounds",value:function(){return this.bounds}},{key:"equals",value:function(e){return p(this.bounds,e)}},{key:"isValid",value:function(){return g(this.bounds)}},{key:"setBounds",value:function(e){return m(this.bounds,e)}},{key:"reset",value:function(){return h(this.bounds)}},{key:"addPoint",value:function(){for(var e=arguments.length,t=new Array(e),r=0;r1&&void 0!==arguments[1]?arguments[1]:[];return B(this.bounds,e,t)}},{key:"computeScale3",value:function(e){return F(this.bounds,e)}},{key:"cutWithPlane",value:function(e,t){return H(this.bounds,e,t)}},{key:"intersectBox",value:function(e,t,r,n){return k(this.bounds,e,t,r,n)}},{key:"intersectPlane",value:function(e,t){return G(this.bounds,e,t)}},{key:"intersect",value:function(e){return W(this.bounds,e)}},{key:"intersects",value:function(e){return z(this.bounds,e)}},{key:"containsPoint",value:function(e,t,r){return j(this.bounds,e,t,r)}},{key:"contains",value:function(e){return z(this.bounds,e)}}]),e}();var Z=function(e){for(var t=1;t{"use strict";r.d(t,{ZP:()=>O});var n=r(87765),a=r(41168),o=r(99824),i=r(54131),s=a.default.vtkErrorMacro,l=a.default.vtkWarningMacro;var c={arrays:[],copyFieldFlags:[],doCopyAllOn:!0,doCopyAllOff:!1};function u(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,c,r),a.default.obj(e,t),function(e,t){t.classHierarchy.push("vtkFieldData");var r=e.getState;t.arrays&&(t.arrays=t.arrays.map((function(e){return{data:(0,o.Z)(e.data)}}))),e.initialize=function(){e.initializeFields(),e.copyAllOn(),e.clearFieldFlags()},e.initializeFields=function(){t.arrays=[],t.copyFieldFlags={},e.modified()},e.copyStructure=function(r){e.initializeFields(),t.copyFieldFlags=r.getCopyFieldFlags().map((function(e){return e})),t.arrays=r.arrays().map((function(e){return{array:e}}))},e.getNumberOfArrays=function(){return t.arrays.length},e.getNumberOfActiveArrays=function(){return t.arrays.length},e.addArray=function(r){var n=r.getName(),a=e.getArrayWithIndex(n),o=a.array,i=a.index;return null!=o?(t.arrays[i]={data:r},i):(t.arrays=[].concat(t.arrays,{data:r}),t.arrays.length-1)},e.removeAllArrays=function(){t.arrays=[]},e.removeArray=function(r){var n=t.arrays.findIndex((function(e){return e.getName()===r}));return e.removeArrayByIndex(n)},e.removeArrayByIndex=function(e){return-1!==e&&e=0&&e=0},e.getArrayName=function(e){var r=t.arrays[e];return r?r.data.getName():""},e.getCopyFieldFlags=function(){return t.copyFieldFlags},e.getFlag=function(e){return t.copyFieldFlags[e]},e.passData=function(r){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:-1,o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:-1;r.getArrays().forEach((function(l){var c=e.getFlag(l.getName());if(!1!==c&&(!t.doCopyAllOff||!0===c)&&l){var u=e.getArrayByName(l.getName());if(u)if(l.getNumberOfComponents()===u.getNumberOfComponents())if(n>-1&&n-1?o:n;u.insertTuple(d,l.getTuple(n))}else u.insertTuples(0,l.getTuples());else s("Unhandled case in passData");else if(n<0||n>l.getNumberOfTuples())e.addArray(l),r.getAttributes(l).forEach((function(t){e.setAttribute(l,t)}));else{var f=l.getNumberOfComponents(),p=l.getNumberOfValues(),g=o>-1?o:n;p<=g*f&&(p=(g+1)*f),(u=i.ZP.newInstance({name:l.getName(),dataType:l.getDataType(),numberOfComponents:f,values:a.default.newTypedArray(l.getDataType(),p),size:0})).insertTuple(g,l.getTuple(n)),e.addArray(u),r.getAttributes(l).forEach((function(t){e.setAttribute(u,t)}))}}}))},e.interpolateData=function(r){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:-1,o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:-1,c=arguments.length>3&&void 0!==arguments[3]?arguments[3]:-1,u=arguments.length>4&&void 0!==arguments[4]?arguments[4]:.5;r.getArrays().forEach((function(d){var f=e.getFlag(d.getName());if(!1!==f&&(!t.doCopyAllOff||!0===f)&&d){var p=e.getArrayByName(d.getName());if(p)if(d.getNumberOfComponents()===p.getNumberOfComponents())if(n>-1&&n-1?c:n;p.interpolateTuple(g,d,n,d,o,u),l("Unexpected case in interpolateData")}else p.insertTuples(d.getTuples());else s("Unhandled case in interpolateData");else if(n<0||o<0||n>d.getNumberOfTuples())e.addArray(d),r.getAttributes(d).forEach((function(t){e.setAttribute(d,t)}));else{var m=d.getNumberOfComponents(),h=d.getNumberOfValues(),v=c>-1?c:n;h<=v*m&&(h=(v+1)*m),(p=i.ZP.newInstance({name:d.getName(),dataType:d.getDataType(),numberOfComponents:m,values:a.default.newTypedArray(d.getDataType(),h),size:0})).interpolateTuple(v,d,n,d,o,u),e.addArray(p),r.getAttributes(d).forEach((function(t){e.setAttribute(p,t)}))}}}))},e.copyFieldOn=function(e){t.copyFieldFlags[e]=!0},e.copyFieldOff=function(e){t.copyFieldFlags[e]=!1},e.copyAllOn=function(){t.doCopyAllOn&&!t.doCopyAllOff||(t.doCopyAllOn=!0,t.doCopyAllOff=!1,e.modified())},e.copyAllOff=function(){!t.doCopyAllOn&&t.doCopyAllOff||(t.doCopyAllOn=!1,t.doCopyAllOff=!0,e.modified())},e.clearFieldFlags=function(){t.copyFieldFlags={}},e.deepCopy=function(e){t.arrays=e.getArrays().map((function(e){var t=e.newClone();return t.deepCopy(e),{data:t}}))},e.copyFlags=function(e){return e.getCopyFieldFlags().map((function(e){return e}))},e.reset=function(){return t.arrays.forEach((function(e){return e.data.reset()}))},e.getMTime=function(){return t.arrays.reduce((function(e,t){return t.data.getMTime()>e?t.data.getMTime():e}),t.mtime)},e.getNumberOfComponents=function(){return t.arrays.reduce((function(e,t){return e+t.data.getNumberOfComponents()}),0)},e.getNumberOfTuples=function(){return t.arrays.length>0?t.arrays[0].getNumberOfTuples():0},e.getState=function(){var e=r();return e&&(e.arrays=t.arrays.map((function(e){return{data:e.data.getState()}}))),e}}(e,t)}var d={newInstance:a.default.newInstance(u,"vtkFieldData"),extend:u},f=r(21477);function p(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function g(e){for(var t=1;t2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,y,r),d.extend(e,t,r),a.default.setGet(e,t,["activeScalars","activeNormals","activeTCoords","activeVectors","activeTensors","activeGlobalIds","activePedigreeIds"]),t.arrays||(t.arrays={}),function(e,t){var r=["Scalars","Vectors","Normals","TCoords","Tensors","GlobalIds","PedigreeIds"];function n(e){var t=r.find((function(t){return m[t.toUpperCase()]===e||"number"!=typeof e&&t.toLowerCase()===e.toLowerCase()}));return void 0===t&&(t=null),t}t.classHierarchy.push("vtkDataSetAttributes");var o=g({},e);e.checkNumberOfComponents=function(e){return!0},e.setAttribute=function(r,a){var o=n(a);if(r&&"PEDIGREEIDS"===o.toUpperCase()&&!r.isA("vtkDataArray"))return v("Cannot set attribute ".concat(o,". The attribute must be a vtkDataArray.")),-1;if(r&&!e.checkNumberOfComponents(r,o))return v("Cannot set attribute ".concat(o,". Incorrect number of components.")),-1;var i=t["active".concat(o)];if(i>=0&&i=0&&r2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,P,r),a.default.obj(e,t),a.default.setGet(e,t,S),function(e,t){t.classHierarchy.push("vtkDataSet"),S.forEach((function(e){t[e]?t[e]=(0,o.Z)(t[e]):t[e]=T.newInstance()}));var r=e.shallowCopy;e.shallowCopy=function(e){r(e,arguments.length>1&&void 0!==arguments[1]&&arguments[1]),S.forEach((function(r){t[r]=T.newInstance(),t[r].shallowCopy(e.getReferenceByName(r))}))}}(e,t)}var O=function(e){for(var t=1;t{"use strict";r.d(t,{XJ:()=>n,ZP:()=>a});var n={DEFAULT:0,SINGLE:1,DOUBLE:2},a={AttributeCopyOperations:{COPYTUPLE:0,INTERPOLATE:1,PASSDATA:2,ALLCOPY:3},AttributeLimitTypes:{MAX:0,EXACT:1,NOLIMIT:2},AttributeTypes:{SCALARS:0,VECTORS:1,NORMALS:2,TCOORDS:3,TENSORS:4,GLOBALIDS:5,PEDIGREEIDS:6,EDGEFLAG:7,NUM_ATTRIBUTES:8},CellGhostTypes:{DUPLICATECELL:1,HIGHCONNECTIVITYCELL:2,LOWCONNECTIVITYCELL:4,REFINEDCELL:8,EXTERIORCELL:16,HIDDENCELL:32},DesiredOutputPrecision:n,PointGhostTypes:{DUPLICATEPOINT:1,HIDDENPOINT:2},ghostArrayName:"vtkGhostType"}},96372:(e,t,r)=>{"use strict";r.d(t,{ZP:()=>b});var n=r(16976),a=r(78826),o=r(41168),i=r(59474),s=r(91382),l=r(14418),c=r(87765),u={UNCHANGED:0,SINGLE_POINT:1,X_LINE:2,Y_LINE:3,Z_LINE:4,XY_PLANE:5,YZ_PLANE:6,XZ_PLANE:7,XYZ_GRID:8,EMPTY:9},d={StructuredType:u};function f(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}var p=d.StructuredType;var g=function(e){for(var t=1;te[1]||e[2]>e[3]||e[4]>e[5]?p.EMPTY:3===t?p.XYZ_GRID:2===t?e[0]===e[1]?p.YZ_PLANE:e[2]===e[3]?p.XZ_PLANE:p.XY_PLANE:1===t?e[0]2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,v,r),l.ZP.extend(e,t,r),t.direction?Array.isArray(t.direction)&&(t.direction=new Float64Array(t.direction.slice(0,9))):t.direction=m.wO.identity(new Float64Array(9)),t.indexToWorld=new Float64Array(16),t.worldToIndex=new Float64Array(16),o.default.get(e,t,["indexToWorld","worldToIndex"]),o.default.setGetArray(e,t,["origin","spacing"],3),o.default.setGetArray(e,t,["direction"],9),o.default.getArray(e,t,["extent"],6),function(e,t){t.classHierarchy.push("vtkImageData"),e.setExtent=function(){if(t.deleted)return h("instance deleted - cannot call any method"),!1;for(var r=arguments.length,n=new Array(r),a=0;a1&&(r*=t[n]-1)}return r},e.getNumberOfPoints=function(){var t=e.getDimensions();return t[0]*t[1]*t[2]},e.getPoint=function(r){var n=e.getDimensions();if(0===n[0]||0===n[1]||0===n[2])return h("Requesting a point from an empty image."),null;var a=new Float64Array(3);switch(t.dataDescription){case u.EMPTY:return null;case u.SINGLE_POINT:break;case u.X_LINE:a[0]=r;break;case u.Y_LINE:a[1]=r;break;case u.Z_LINE:a[2]=r;break;case u.XY_PLANE:a[0]=r%n[0],a[1]=r/n[0];break;case u.YZ_PLANE:a[1]=r%n[1],a[2]=r/n[1];break;case u.XZ_PLANE:a[0]=r%n[0],a[2]=r/n[0];break;case u.XYZ_GRID:a[0]=r%n[0],a[1]=r/n[0]%n[1],a[2]=r/(n[0]*n[1]);break;default:h("Invalid dataDescription")}var o=[0,0,0];return e.indexToWorld(a,o),o},e.getBounds=function(){return e.extentToBounds(e.getSpatialExtent())},e.extentToBounds=function(e){return s.ZP.transformBounds(e,t.indexToWorld)},e.getSpatialExtent=function(){return s.ZP.inflate((0,a.Z)(t.extent),.5)},e.computeTransforms=function(){m._E.fromTranslation(t.indexToWorld,t.origin),t.indexToWorld[0]=t.direction[0],t.indexToWorld[1]=t.direction[1],t.indexToWorld[2]=t.direction[2],t.indexToWorld[4]=t.direction[3],t.indexToWorld[5]=t.direction[4],t.indexToWorld[6]=t.direction[5],t.indexToWorld[8]=t.direction[6],t.indexToWorld[9]=t.direction[7],t.indexToWorld[10]=t.direction[8],m._E.scale(t.indexToWorld,t.indexToWorld,t.spacing),m._E.invert(t.worldToIndex,t.indexToWorld)},e.indexToWorld=function(e){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return m.R3.transformMat4(r,e,t.indexToWorld),r},e.indexToWorldVec3=e.indexToWorld,e.worldToIndex=function(e){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return m.R3.transformMat4(r,e,t.worldToIndex),r},e.worldToIndexVec3=e.worldToIndex,e.indexToWorldBounds=function(e){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return s.ZP.transformBounds(e,t.indexToWorld,r)},e.worldToIndexBounds=function(e){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return s.ZP.transformBounds(e,t.worldToIndex,r)},e.onModified(e.computeTransforms),e.computeTransforms(),e.getCenter=function(){return s.ZP.getCenter(e.getBounds())},e.computeHistogram=function(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,n=[0,0,0,0,0,0];e.worldToIndexBounds(t,n);var a=[0,0,0],o=[0,0,0];s.ZP.computeCornerPoints(n,a,o),(0,i.b)(a,a),(0,i.b)(o,o);var l=e.getDimensions();(0,i.c)(a,[0,0,0],[l[0]-1,l[1]-1,l[2]-1],a),(0,i.c)(o,[0,0,0],[l[0]-1,l[1]-1,l[2]-1],o);for(var c=l[0],u=l[0]*l[1],d=e.getPointData().getScalars().getData(),f=-1/0,p=1/0,g=0,m=0,h=0,v=a[2];v<=o[2];v++)for(var y=a[1];y<=o[1];y++)for(var b=a[0]+y*c+v*u,T=a[0];T<=o[0];T++){if(!r||r([T,y,v],n)){var C=d[b];C>f&&(f=C),C0?m/h:0,S=h?Math.abs(g/h-x*x):0;return{minimum:p,maximum:f,average:x,variance:S,sigma:Math.sqrt(S),count:h}},e.computeIncrements=function(e){for(var t=[],r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1,n=0;n<3;++n)t[n]=r,r*=e[2*n+1]-e[2*n]+1;return t},e.computeOffsetIndex=function(t){var r=(0,n.Z)(t,3),a=r[0],o=r[1],i=r[2],s=e.getExtent(),l=e.getPointData().getScalars().getNumberOfComponents(),c=e.computeIncrements(s,l);return Math.floor((Math.round(a)-s[0])*c[0]+(Math.round(o)-s[2])*c[1]+(Math.round(i)-s[4])*c[2])},e.getOffsetIndexFromWorld=function(t){for(var r=e.getExtent(),n=e.worldToIndex(t),a=0;a<3;++a)if(n[a]r[2*a+1])return h("GetScalarPointer: Pixel ".concat(n," is not in memory. Current extent = ").concat(r)),NaN;return e.computeOffsetIndex(n)},e.getScalarValueFromWorld=function(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=e.getPointData().getScalars().getNumberOfComponents();if(r<0||r>=n)return h("GetScalarPointer: Scalar Component ".concat(r," is not within bounds. Current Scalar numberOfComponents: ").concat(n)),NaN;var a=e.getOffsetIndexFromWorld(t);return Number.isNaN(a)?a:e.getPointData().getScalars().getComponent(a,r)}}(e,t)}var b={newInstance:o.default.newInstance(y,"vtkImageData"),extend:y}},44031:(e,t,r)=>{"use strict";r.d(t,{ZP:()=>s});var n=r(41168),a=n.default.vtkErrorMacro;var o={range:[0,0],clamping:!0,allowDuplicateScalars:!1};function i(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,o,r),n.default.obj(e,t),t.nodes=[],n.default.setGet(e,t,["allowDuplicateScalars","clamping"]),n.default.setArray(e,t,["range"],2),n.default.getArray(e,t,["range"]),function(e,t){t.classHierarchy.push("vtkPiecewiseFunction"),e.getSize=function(){return t.nodes.length},e.getType=function(){var e,r=0,n=0;t.nodes.length>0&&(r=t.nodes[0].y);for(var a=1;ar)switch(n){case 0:case 1:n=1;break;default:n=3}else switch(n){case 0:case 2:n=2;break;default:n=3}if(r=e,3===n)break}switch(n){case 0:return"Constant";case 1:return"NonDecreasing";case 2:return"NonIncreasing";default:return"Varied"}},e.getDataPointer=function(){var e=t.nodes.length;if(t.function=null,e>0){t.function=[];for(var r=0;r0?t.nodes[r-1].x:t.clamping?-Number.MAX_VALUE:t.nodes[0].x},e.getNodeValue=function(e,r){var n=t.nodes.length;return e<0||e>=n?(a("Index out of range!"),-1):(r[0]=t.nodes[e].x,r[1]=t.nodes[e].y,r[2]=t.nodes[e].midpoint,r[3]=t.nodes[e].sharpness,1)},e.setNodeValue=function(r,n){var o=t.nodes.length;if(r<0||r>=o)return a("Index out of range!"),-1;var i=t.nodes[r].x;return t.nodes[r].x=n[0],t.nodes[r].y=n[1],t.nodes[r].midpoint=n[2],t.nodes[r].sharpness=n[3],i!==n[0]?e.sortAndUpdateRange():e.modified(),1},e.addPoint=function(t,r){return e.addPointLong(t,r,.5,0)},e.addPointLong=function(r,n,o,i){if(o<0||o>1)return a("Midpoint outside range [0.0, 1.0]"),-1;if(i<0||i>1)return a("Sharpness outside range [0.0, 1.0]"),-1;t.allowDuplicateScalars||e.removePoint(r);var s,l={x:r,y:n,midpoint:o,sharpness:i};for(t.nodes.push(l),e.sortAndUpdateRange(),s=0;s=t.nodes.length)return-1;var a=n,o=!1;return t.nodes.splice(n,1),0!==n&&n!==t.nodes.length||(o=e.updateRange()),o||e.modified(),a},e.removeAllPoints=function(){t.nodes=[],e.sortAndUpdateRange()},e.addSegment=function(r,n,a,o){e.sortAndUpdateRange();for(var i=0;i=r&&t.nodes[i].x<=a?t.nodes.splice(i,1):i++;e.addPoint(r,n,.5,0),e.addPoint(a,o,.5,0)},e.getValue=function(t){var r=[];return e.getTable(t,t,1,r),r[0]},e.adjustRange=function(r){if(r.length<2)return 0;var n=e.getRange();n[0]r[1]?e.addPoint(r[1],e.getValue(r[1])):e.addPoint(r[1],e.getValue(n[1])),e.sortAndUpdateRange();for(var a=0;a=r[0]&&t.nodes[a].x<=r[1]?t.nodes.splice(a,1):++a;return e.sortAndUpdateRange(),1},e.estimateMinNumberOfSamples=function(t,r){var n=e.findMinimumXDistance();return Math.ceil((r-t)/n)},e.findMinimumXDistance=function(){var e=t.nodes.length;if(e<2)return-1;for(var r=t.nodes[1].x-t.nodes[0].x,n=0;n4&&void 0!==arguments[4]?arguments[4]:1,s=0,l=t.nodes.length,c=0;0!==l&&(c=t.nodes[l-1].y);var u=0,d=0,f=0,p=0,g=0,m=0,h=0;for(o=0;o1?e+o/(n-1)*(r-e):.5*(e+r);st.nodes[s].x;)++s.99999&&(m=.99999));if(s>=l)a[v]=t.clamping?c:0;else if(0===s)a[v]=t.clamping?t.nodes[0].y:0;else{var y=(u-d)/(f-d);if(y=y.99){if(y<.5){a[v]=p;continue}a[v]=g;continue}if(h<.01){a[v]=(1-y)*p+y*g;continue}y<.5?y=.5*Math.pow(2*y,1+10*h):y>.5&&(y=1-.5*Math.pow(2*(1-y),1+10*h));var b=y*y,T=b*y,C=2*T-3*b+1,x=-2*T+3*b,S=T-2*b+y,P=T-b,w=(1-h)*(g-p);a[v]=C*p+x*g+S*w+P*w;var O=pg?p:g;a[v]=a[v]I?I:a[v]}}}}(e,t)}var s={newInstance:n.default.newInstance(i,"vtkPiecewiseFunction"),extend:i}},3969:(e,t,r)=>{"use strict";r.d(t,{ZP:()=>b});var n=r(87765),a=r(59474),o=r(41168);function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}var s=1e-6,l="coincide",c="disjoint";function u(e,t,r){var n=r[0]*(e[0]-t[0])+r[1]*(e[1]-t[1])+r[2]*(e[2]-t[2]);return Math.abs(n)}function d(e,t,r,n){var o=[];(0,a.s)(e,t,o);var i=(0,a.d)(r,o);n[0]=e[0]-i*r[0],n[1]=e[1]-i*r[1],n[2]=e[2]-i*r[2]}function f(e,t,r){var n=(0,a.d)(e,t),o=(0,a.d)(t,t);return 0===o&&(o=1),r[0]=e[0]-n*t[0]/o,r[1]=e[1]-n*t[1]/o,r[2]=e[2]-n*t[2]/o,r}function p(e,t,r,n){var o=[];(0,a.s)(e,t,o);var i=(0,a.d)(r,o),s=(0,a.d)(r,r);0!==s?(n[0]=e[0]-i*r[0]/s,n[1]=e[1]-i*r[1]/s,n[2]=e[2]-i*r[2]/s):(n[0]=e[0],n[1]=e[1],n[2]=e[2])}function g(e,t,r,n){var o={intersection:!1,betweenPoints:!1,t:Number.MAX_VALUE,x:[]},i=[],l=[];(0,a.s)(t,e,i),(0,a.s)(r,e,l);var c=(0,a.d)(n,l),u=(0,a.d)(n,i);return(u<0?-u:u)<=(c<0?-c*s:c*s)||(o.t=c/u,o.x[0]=e[0]+o.t*i[0],o.x[1]=e[1]+o.t*i[1],o.x[2]=e[2]+o.t*i[2],o.intersection=!0,o.betweenPoints=o.t>=0&&o.t<=1),o}function m(e,t,r,n){var o={intersection:!1,l0:[],l1:[],error:null},i=[];(0,a.j)(t,n,i);var u,d=i.map((function(e){return Math.abs(e)}));if(d[0]+d[1]+d[2]d[1]&&d[0]>d[2]?"x":d[1]>d[2]?"y":"z";var p=[],g=-(0,a.d)(t,e),m=-(0,a.d)(n,r);switch(u){case"x":p[0]=0,p[1]=(m*t[2]-g*n[2])/i[0],p[2]=(g*n[1]-m*t[1])/i[0];break;case"y":p[0]=(g*n[2]-m*t[2])/i[1],p[1]=0,p[2]=(m*t[0]-g*n[0])/i[1];break;case"z":p[0]=(m*t[1]-g*n[1])/i[2],p[1]=(g*n[0]-m*t[0])/i[2],p[2]=0}return o.l0=p,(0,a.k)(p,i,o.l1),o.intersection=!0,o}var h={evaluate:function(e,t,r){return e[0]*(r[0]-t[0])+e[1]*(r[1]-t[1])+e[2]*(r[2]-t[2])},distanceToPlane:u,projectPoint:d,projectVector:f,generalizedProjectPoint:p,intersectWithLine:g,intersectWithPlane:m,DISJOINT:c,COINCIDE:l};var v={normal:[0,0,1],origin:[0,0,0]};function y(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,v,r),o.default.obj(e,t),o.default.setGetArray(e,t,["normal","origin"],3),function(e,t){t.classHierarchy.push("vtkPlane"),e.distanceToPlane=function(e){return u(e,t.origin,t.normal)},e.projectPoint=function(e,r){d(e,t.origin,t.normal,r)},e.projectVector=function(e,r){return f(e,t.normal,r)},e.push=function(e){if(0!==e)for(var r=0;r<3;r++)t.origin[r]+=e*t.normal[r]},e.generalizedProjectPoint=function(e,r){p(e,t.origin,t.normal,r)},e.evaluateFunction=function(e,r,n){return Array.isArray(e)?t.normal[0]*(e[0]-t.origin[0])+t.normal[1]*(e[1]-t.origin[1])+t.normal[2]*(e[2]-t.origin[2]):t.normal[0]*(e-t.origin[0])+t.normal[1]*(r-t.origin[1])+t.normal[2]*(n-t.origin[2])},e.evaluateGradient=function(e){return[t.normal[0],t.normal[1],t.normal[2]]},e.intersectWithLine=function(e,r){return g(e,r,t.origin,t.normal)},e.intersectWithPlane=function(e,r){return m(e,r,t.origin,t.normal)}}(e,t)}var b=function(e){for(var t=1;t{"use strict";r.d(t,{ZP:()=>$});var n=r(87765),a=r(41168),o=r(99824),i=r(17197),s=r(78826),l=r(59474),c=r(23834);var u={bounds:[-1,-1,-1,-1,-1,-1],pointsIds:[]};function d(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,u,r),a.default.obj(e,t),t.points||(t.points=c.ZP.newInstance()),a.default.get(e,t,["points","pointsIds"]),function(e,t){t.classHierarchy.push("vtkCell"),e.initialize=function(e){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;if(r){t.pointsIds=r;var n=t.points.getData();n.length!==3*t.pointsIds.length&&(n=a.default.newTypedArray(e.getDataType(),3*t.pointsIds.length));var o=e.getData();t.pointsIds.forEach((function(e,t){var r=3*e,a=3*t;n[a]=o[r],n[++a]=o[++r],n[++a]=o[++r]})),t.points.setData(n)}else{t.points=e,t.pointsIds=new Array(e.getNumberOfPoints());for(var i=e.getNumberOfPoints()-1;i>=0;--i)t.pointsIds[i]=i}},e.getBounds=function(){var e=t.points.getNumberOfPoints(),r=[];if(e){t.points.getPoint(0,r),t.bounds[0]=r[0],t.bounds[1]=r[0],t.bounds[2]=r[1],t.bounds[3]=r[1],t.bounds[4]=r[2],t.bounds[5]=r[2];for(var n=1;nt.bounds[1]?r[0]:t.bounds[1],t.bounds[2]=r[1]t.bounds[3]?r[1]:t.bounds[3],t.bounds[4]=r[2]t.bounds[5]?r[2]:t.bounds[5]}else(0,l.u)(t.bounds);return t.bounds},e.getLength2=function(){e.getBounds();for(var r=0,n=0,a=0;a<3;a++)r+=(n=t.bounds[2*a+1]-t.bounds[2*a])*n;return r},e.getParametricDistance=function(e){for(var t,r=0,n=0;n<3;n++)(t=e[n]<0?-e[n]:e[n]>1?e[n]-1:0)>r&&(r=t);return r},e.getNumberOfPoints=function(){return t.points.getNumberOfPoints()},e.deepCopy=function(e){e.initialize(t.points,t.pointsIds)},e.getCellDimension=function(){},e.intersectWithLine=function(e,t,r,n,a,o,i){},e.evaluatePosition=function(e,t,r,n,o,i){a.default.vtkErrorMacro("vtkCell.evaluatePosition is not implemented.")}}(e,t)}var f={newInstance:a.default.newInstance(d,"vtkCell"),extend:d};var p={array:null,maxId:0,extend:0};function g(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,p,r),a.default.obj(e,t),function(e,t){t.classHierarchy.push("vtkCellLinks"),e.buildLinks=function(r){var n=r.getPoints().getNumberOfPoints(),a=r.getNumberOfCells(),o=new Uint32Array(n);if(r.isA("vtkPolyData")){for(var i=0;i1&&void 0!==arguments[1]?arguments[1]:1e3;t.array=Array(e).fill().map((function(){return{ncells:0,cells:null}})),t.extend=r,t.maxId=-1},e.initialize=function(){t.array=null},e.getLink=function(e){return t.array[e]},e.getNcells=function(e){return t.array[e].ncells},e.getCells=function(e){return t.array[e].cells},e.insertNextPoint=function(e){t.array.push({ncells:e,cells:Array(e)}),++t.maxId},e.insertNextCellReference=function(e,r){t.array[e].cells[t.array[e].ncells++]=r},e.deletePoint=function(e){t.array[e].ncells=0,t.array[e].cells=null},e.removeCellReference=function(e,r){t.array[r].cells=t.array[r].cells.filter((function(t){return t!==e})),t.array[r].ncells=t.array[r].cells.length},e.addCellReference=function(e,r){t.array[r].cells[t.array[r].ncells++]=e},e.resizeCellList=function(e,r){t.array[e].cells.length=r},e.squeeze=function(){!function(e,t){var r=t;for(t>=e.array.length&&(r+=e.array.length);r>e.array.length;)e.array.push({ncells:0,cells:null});e.array.length=r}(t,t.maxId+1)},e.reset=function(){t.maxId=-1},e.deepCopy=function(e){t.array=(0,s.Z)(e.array),t.extend=e.extend,t.maxId=e.maxId},e.incrementLinkCount=function(e){++t.array[e].ncells},e.allocateLinks=function(e){for(var r=0;r2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,T,r),a.default.obj(e,t),a.default.get(e,t,["size","maxId","extend"]),a.default.getArray(e,t,["typeArray","locationArray"]),function(e,t){t.classHierarchy.push("vtkCellTypes"),e.allocate=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:512,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1e3;t.size=e>0?e:1,t.extend=r>0?r:1,t.maxId=-1,t.typeArray=new Uint8Array(e),t.locationArray=new Uint32Array(e)},e.insertCell=function(e,r,n){t.typeArray[e]=r,t.locationArray[e]=n,e>t.maxId&&(t.maxId=e)},e.insertNextCell=function(r,n){return e.insertCell(++t.maxId,r,n),t.maxId},e.setCellTypes=function(e,r,n){t.size=e,t.typeArray=r,t.locationArray=n,t.maxId=e-1},e.getCellLocation=function(e){return t.locationArray[e]},e.deleteCell=function(e){t.typeArray[e]=h.VTK_EMPTY_CELL},e.getNumberOfTypes=function(){return t.maxId+1},e.isType=function(t){for(var r=e.getNumberOfTypes(),n=0;n3&&void 0!==arguments[3]?arguments[3]:null,o={t:Number.MIN_VALUE,distance:0},i=[];i[0]=r[0]-t[0],i[1]=r[1]-t[1],i[2]=r[2]-t[2];var s=i[0]*(e[0]-t[0])+i[1]*(e[1]-t[1])+i[2]*(e[2]-t[2]),c=(0,l.d)(i,i),u=1e-5*s;return 0!==c&&(o.t=s/c),u<0&&(u=-u),-u1?n=r:(n=i,i[0]=t[0]+o.t*i[0],i[1]=t[1]+o.t*i[1],i[2]=t[2]+o.t*i[2]),a&&(a[0]=n[0],a[1]=n[1],a[2]=n[2]),o.distance=(0,l.e)(n,e),o}function A(e,t,r,n,a,o){var i=[],s=[],c=[];a[0]=0,o[0]=0,(0,l.s)(t,e,i),(0,l.s)(n,r,s),(0,l.s)(r,e,c);var u=[(0,l.d)(i,i),-(0,l.d)(i,s),-(0,l.d)(i,s),(0,l.d)(s,s)],d=[];if(d[0]=(0,l.d)(i,c),d[1]=-(0,l.d)(s,c),0===(0,l.g)(u,d,2)){for(var f,p=Number.MAX_VALUE,g=[e,t,r,n],m=[r,r,e,e],h=[n,n,t,t],v=[o[0],o[0],a[0],a[0]],y=[a[0],a[0],o[0],o[0]],b=0;b<4;b++)(f=I(g[b],m[b],h[b])).distance=0&&a[0]<=1&&o[0]>=0&&o[0]<=1?O.YES_INTERSECTION:O.NO_INTERSECTION}var R={distanceToLine:I,intersection:A};var E={};function M(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,E,r),f.extend(e,t,r),function(e,t){t.classHierarchy.push("vtkLine"),e.getCellDimension=function(){return 1},e.intersectWithLine=function(e,r,n,a,o){var i={intersect:0,t:Number.MAX_VALUE,subId:0,betweenPoints:null};o[1]=0,o[2]=0;var s=[],c=[],u=[];t.points.getPoint(0,c),t.points.getPoint(1,u);var d,f=[],p=[],g=A(e,r,c,u,f,p);if(i.t=f[0],i.betweenPoints=(d=i.t)>=0&&d<=1,o[0]=p[0],g===O.YES_INTERSECTION){for(var m=0;m<3;m++)a[m]=c[m]+o[0]*(u[m]-c[m]),s[m]=e[m]+i.t*(r[m]-e[m]);if((0,l.e)(a,s)<=n*n)return i.intersect=1,i}else{var h;if(i.t<0)return(h=I(e,c,u,a)).distance<=n*n?(i.t=0,i.intersect=1,i.betweenPoints=!0,i):i;if(i.t>1)return(h=I(r,c,u,a)).distance<=n*n?(i.t=1,i.intersect=1,i.betweenPoints=!0,i):i;if(o[0]<0)return o[0]=0,h=I(c,e,r,a),i.t=h.t,h.distance<=n*n?(i.intersect=1,i):i;if(o[0]>1)return o[0]=1,h=I(u,e,r,a),i.t=h.t,h.distance<=n*n?(i.intersect=1,i):i}return i},e.evaluateLocation=function(e,r,n){var a=[],o=[];t.points.getPoint(0,a),t.points.getPoint(1,o);for(var i=0;i<3;i++)r[i]=a[i]+e[0]*(o[i]-a[i]);n[0]=1-e[0],n[1]=e[0]}}(e,t)}var D=w(w({newInstance:a.default.newInstance(M,"vtkLine"),extend:M},R),S),V=r(14418);var L={};function _(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,L,r),V.ZP.extend(e,t,r),a.default.setGet(e,t,["points"]),function(e,t){t.classHierarchy.push("vtkPointSet"),t.points?t.points=(0,o.Z)(t.points):t.points=c.ZP.newInstance(),e.getNumberOfPoints=function(){return t.points.getNumberOfPoints()},e.getBounds=function(){return t.points.getBounds()},e.computeBounds=function(){e.getBounds()};var r=e.shallowCopy;e.shallowCopy=function(e){r(e,arguments.length>1&&void 0!==arguments[1]&&arguments[1]),t.points=c.ZP.newInstance(),t.points.shallowCopy(e.getPoints())}}(e,t)}var N={newInstance:a.default.newInstance(_,"vtkPointSet"),extend:_},B=r(3969);function F(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function U(e,t,r,n){var a=r[0]-t[0],o=r[1]-t[1],i=r[2]-t[2],s=e[0]-t[0],l=e[1]-t[1],c=e[2]-t[2];n[0]=o*c-i*l,n[1]=i*s-a*c,n[2]=a*l-o*s}function k(e,t,r,n){U(e,t,r,n);var a=Math.sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);0!==a&&(n[0]/=a,n[1]/=a,n[2]/=a)}var G={computeNormalDirection:U,computeNormal:k,intersectWithTriangle:function(e,t,r,n,a,o){var i=arguments.length>6&&void 0!==arguments[6]?arguments[6]:1e-6,s=!1,c=[],u=[],d=[],f=[],p=[];k(e,t,r,f),k(n,a,o,p);var g=-(0,l.d)(f,e),m=-(0,l.d)(p,n),h=[(0,l.d)(p,e)+m,(0,l.d)(p,t)+m,(0,l.d)(p,r)+m];if(h[0]*h[1]>i&&h[0]*h[2]>i)return{intersect:!1,coplanar:s,pt1:c,pt2:u,surfaceId:d};var v=[(0,l.d)(f,n)+g,(0,l.d)(f,a)+g,(0,l.d)(f,o)+g];if(v[0]*v[1]>i&&v[0]*v[2]>i)return{intersect:!1,coplanar:s,pt1:c,pt2:u,surfaceId:d};if(Math.abs(f[0]-p[0])<1e-9&&Math.abs(f[1]-p[1])<1e-9&&Math.abs(f[2]-p[2])<1e-9&&Math.abs(g-m)<1e-9)return{intersect:!1,coplanar:s=!0,pt1:c,pt2:u,surfaceId:d};var y=[e,t,r],b=[n,a,o],T=(0,l.d)(f,p),C=(g-m*T)/(T*T-1),x=(m-g*T)/(T*T-1),S=[C*f[0]+x*p[0],C*f[1]+x*p[1],C*f[2]+x*p[2]],P=(0,l.j)(f,p,[]);(0,l.l)(P);for(var w,O,I=0,A=0,R=[],E=[],M=50,D=50,V=0;V<3;V++){var L=V,_=(V+1)%3,N=B.ZP.intersectWithLine(y[L],y[_],n,p);N.intersection&&N.t>0-i&&N.t<1+i&&(N.t<1+i&&N.t>1-i&&(M=I),R[I++]=(0,l.d)(N.x,P)-(0,l.d)(S,P));var F=B.ZP.intersectWithLine(b[L],b[_],e,f);F.intersection&&F.t>0-i&&F.t<1+i&&(F.t<1+i&&F.t>1-i&&(D=A),E[A++]=(0,l.d)(F.x,P)-(0,l.d)(S,P))}if(I>2){I--;var U=R[2];R[2]=R[M],R[M]=U}if(A>2){A--;var G=E[2];E[2]=E[D],E[D]=G}if(2!==I||2!==A)return{intersect:!1,coplanar:s,pt1:c,pt2:u,surfaceId:d};if(Number.isNaN(R[0])||Number.isNaN(R[1])||Number.isNaN(E[0])||Number.isNaN(E[1]))return{intersect:!1,coplanar:s,pt1:c,pt2:u,surfaceId:d};if(R[0]>R[1]){var W=R[1];R[1]=R[0],R[0]=W}if(E[0]>E[1]){var z=E[1];E[1]=E[0],E[0]=z}return R[1]2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,W,r),f.extend(e,t,r),function(e,t){t.classHierarchy.push("vtkTriangle"),e.getCellDimension=function(){return 2},e.intersectWithLine=function(r,n,a,o,i){var s={subId:0,t:Number.MAX_VALUE,intersect:0,betweenPoints:!1};i[2]=0;var c=a*a,u=[],d=[],f=[];t.points.getPoint(0,u),t.points.getPoint(1,d),t.points.getPoint(2,f);var p=[];if(k(u,d,f,p),0!==p[0]||0!==p[1]||0!==p[2]){var g=B.ZP.intersectWithLine(r,n,u,p);if(s.betweenPoints=g.betweenPoints,s.t=g.t,o[0]=g.x[0],o[1]=g.x[1],o[2]=g.x[2],!g.intersection)return i[0]=0,i[1]=0,s.intersect=0,s;var m=e.evaluatePosition(o,[],i,[]);if(m.evaluation>=0)return m.dist2<=c?(s.intersect=1,s):(s.intersect=m.evaluation,s)}var h=(0,l.e)(u,d),v=(0,l.e)(d,f),y=(0,l.e)(f,u);t.line||(t.line=D.newInstance()),h>v&&h>y?(t.line.getPoints().setPoint(0,u),t.line.getPoints().setPoint(1,d)):v>y&&v>h?(t.line.getPoints().setPoint(0,d),t.line.getPoints().setPoint(1,f)):(t.line.getPoints().setPoint(0,f),t.line.getPoints().setPoint(1,u));var b=t.line.intersectWithLine(r,n,a,o,i);if(s.betweenPoints=b.betweenPoints,s.t=b.t,b.intersect){for(var T=[],C=[],x=[],S=0;S<3;S++)T[S]=u[S]-f[S],C[S]=d[S]-f[S],x[S]=o[S]-f[S];return i[0]=(0,l.d)(x,T)/y,i[1]=(0,l.d)(x,C)/v,s.intersect=1,s}return i[0]=0,i[1]=0,s.intersect=0,s},e.evaluatePosition=function(e,r,n,a){var o,i,s,c,u,d,f,p={subId:0,dist2:0,evaluation:-1},g=[],m=[],h=[],v=[],y=[],b=[],T=[],C=0,x=[],S=[],P=[],w=[],O=[];p.subId=0,n[2]=0,t.points.getPoint(1,g),t.points.getPoint(2,m),t.points.getPoint(0,h),U(g,m,h,v),B.ZP.generalizedProjectPoint(e,g,v,O);var I=0;for(o=0;o<3;o++)(s=v[o]<0?-v[o]:v[o])>I&&(I=s,C=o);for(i=0,o=0;o<3;o++)o!==C&&(x[i++]=o);for(o=0;o<2;o++)y[o]=O[x[o]]-h[x[o]],b[o]=g[x[o]]-h[x[o]],T[o]=m[x[o]]-h[x[o]];if(0===(c=(0,l.o)(b,T)))return n[0]=0,n[1]=0,p.evaluation=-1,p;if(n[0]=(0,l.o)(y,T)/c,n[1]=(0,l.o)(b,y)/c,a[0]=1-(n[0]+n[1]),a[1]=n[0],a[2]=n[1],a[0]>=0&&a[0]<=1&&a[1]>=0&&a[1]<=1&&a[2]>=0&&a[2]<=1)r&&(p.dist2=(0,l.e)(O,e),r[0]=O[0],r[1]=O[1],r[2]=O[2]),p.evaluation=1;else{var A;if(r)if(a[1]<0&&a[2]<0)for(u=(0,l.e)(e,h),d=D.distanceToLine(e,g,h,A,P),f=D.distanceToLine(e,h,m,A,w),u1?n[a]-1:0)>r&&(r=t);return r}}(e,t)}var j,H=function(e){for(var t=1;t2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,q,r),N.extend(e,t,r),a.default.get(e,t,["cells","links"]),a.default.setGet(e,t,["verts","lines","polys","strips"]),function(e,t){t.classHierarchy.push("vtkPolyData"),K.forEach((function(r){var n;e["getNumberOf".concat((n=r,n.replace(/(?:^\w|[A-Z]|\b\w)/g,(function(e){return e.toUpperCase()})).replace(/\s+/g,"")))]=function(){return t[r].getNumberOfCells()},t[r]?t[r]=(0,o.Z)(t[r]):t[r]=i.ZP.newInstance()})),e.getNumberOfCells=function(){return K.reduce((function(e,r){return e+t[r].getNumberOfCells()}),0)};var r=e.shallowCopy;e.shallowCopy=function(e){r(e,arguments.length>1&&void 0!==arguments[1]&&arguments[1]),K.forEach((function(r){t[r]=i.ZP.newInstance(),t[r].shallowCopy(e.getReferenceByName(r))}))},e.buildCells=function(){var r=e.getNumberOfVerts(),n=e.getNumberOfLines(),a=e.getNumberOfPolys(),o=e.getNumberOfStrips(),i=r+n+a+o,s=new Uint8Array(i),l=s,c=new Uint32Array(i),u=c;if(r){var d=0;t.verts.getCellSizes().forEach((function(e,t){u[t]=d,l[t]=e>1?h.VTK_POLY_VERTEX:h.VTK_VERTEX,d+=e+1})),u=u.subarray(r),l=l.subarray(r)}if(n){var f=0;t.lines.getCellSizes().forEach((function(e,t){u[t]=f,l[t]=e>2?h.VTK_POLY_LINE:h.VTK_LINE,1===e&&Z("Building VTK_LINE ",t," with only one point, but VTK_LINE needs at least two points. Check the input."),f+=e+1})),u=u.subarray(n),l=l.subarray(n)}if(a){var p=0;t.polys.getCellSizes().forEach((function(e,t){switch(u[t]=p,e){case 3:l[t]=h.VTK_TRIANGLE;break;case 4:l[t]=h.VTK_QUAD;break;default:l[t]=h.VTK_POLYGON}e<3&&Z("Building VTK_TRIANGLE ",t," with less than three points, but VTK_TRIANGLE needs at least three points. Check the input."),p+=e+1})),u+=u.subarray(a),l+=l.subarray(a)}if(o){var g=0;l.fill(h.VTK_TRIANGLE_STRIP,0,o),t.strips.getCellSizes().forEach((function(e,t){u[t]=g,g+=e+1}))}t.cells=x.newInstance(),t.cells.setCellTypes(i,s,c)},e.buildLinks=function(){var r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;void 0===t.cells&&e.buildCells(),t.links=m.newInstance(),r>0?t.links.allocate(r):t.links.allocate(e.getPoints().getNumberOfPoints()),t.links.buildLinks(e)},e.getCellType=function(e){return t.cells.getCellType(e)},e.getCellPoints=function(r){var n=e.getCellType(r),a=null;switch(n){case h.VTK_VERTEX:case h.VTK_POLY_VERTEX:a=t.verts;break;case h.VTK_LINE:case h.VTK_POLY_LINE:a=t.lines;break;case h.VTK_TRIANGLE:case h.VTK_QUAD:case h.VTK_POLYGON:a=t.polys;break;case h.VTK_TRIANGLE_STRIP:a=t.strips;break;default:return a=null,{type:0,cellPointIds:null}}var o=t.cells.getCellLocation(r);return{cellType:n,cellPointIds:a.getCell(o)}},e.getPointCells=function(e){return t.links.getCells(e)},e.getCellEdgeNeighbors=function(e,r,n){var a=t.links.getLink(r),o=t.links.getLink(n);return a.cells.filter((function(t){return t!==e&&-1!==o.cells.indexOf(t)}))},e.getCell=function(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,n=e.getCellPoints(t),a=r||X[n.cellType].newInstance();return a.initialize(e.getPoints(),n.cellPointIds),a}}(e,t)}var $={newInstance:a.default.newInstance(Y,"vtkPolyData"),extend:Y}},97442:(e,t,r)=>{"use strict";r.d(t,{ZP:()=>u});var n=r(78826),a=r(41168),o=r(54131),i=r(1299),s=r(45802);var l={xLength:1,yLength:1,zLength:1,center:[0,0,0],rotations:[0,0,0],pointType:"Float64Array",generate3DTextureCoordinates:!1};function c(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,l,r),a.default.obj(e,t),a.default.setGet(e,t,["xLength","yLength","zLength","generate3DTextureCoordinates"]),a.default.setGetArray(e,t,["center","rotations"],3),a.default.algo(e,t,0,1),function(e,t){t.classHierarchy.push("vtkCubeSource"),e.setBounds=function(){var e=[];if(Array.isArray(arguments.length<=0?void 0:arguments[0]))e=arguments.length<=0?void 0:arguments[0];else for(var r=0;r{"use strict";r.d(t,{Z:()=>o});var n=r(41168);var a={clippingPlanes:[]};var o={extend:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,a,r),n.default.obj(e,t),n.default.algo(e,t,1,0),t.clippingPlanes||(t.clippingPlanes=[]),function(e,t){t.classHierarchy.push("vtkAbstractMapper"),e.update=function(){e.getInputData()},e.addClippingPlane=function(r){return!!r.isA("vtkPlane")&&!t.clippingPlanes.includes(r)&&(t.clippingPlanes.push(r),e.modified(),!0)},e.getNumberOfClippingPlanes=function(){return t.clippingPlanes.length},e.removeAllClippingPlanes=function(){return 0!==t.clippingPlanes.length&&(t.clippingPlanes.length=0,e.modified(),!0)},e.removeClippingPlane=function(r){var n=t.clippingPlanes.indexOf(r);return-1!==n&&(t.clippingPlanes.splice(n,1),e.modified(),!0)},e.getClippingPlanes=function(){return t.clippingPlanes},e.setClippingPlanes=function(t){if(t)if(Array.isArray(t))for(var r=t.length,n=0;n=0&&r{"use strict";r.d(t,{Z:()=>s});var n=r(41168),a=r(16595),o=r(59474);var i={bounds:[1,-1,1,-1,1,-1],center:[0,0,0],viewSpecificProperties:null};var s={extend:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,i,r),a.Z.extend(e,t,r),t.bounds||(0,o.u)(t.bounds),t.center||(t.center=[0,0,0]),n.default.setGet(e,t,["viewSpecificProperties"]),t.viewSpecificProperties||(t.viewSpecificProperties={}),function(e,t){e.getBounds=function(){return 0},e.getBounds=function(r){e.getBounds();for(var n=0;n<6;n++)r[n]=t.bounds[n]},e.getCenter=function(){e.getBounds();for(var r=0;r<3;r++)t.center[r]=(t.bounds[2*r+1]+t.bounds[2*r])/2;return t.center.slice()},e.getLength=function(){var r=0,n=0;e.getBounds();for(var a=0;a<3;a++)n+=(r=t.bounds[2*a+1]-t.bounds[2*a])*r;return Math.sqrt(n)}}(e,t)}}},16623:(e,t,r)=>{"use strict";r.d(t,{ZP:()=>g});var n=r(87765),a=r(45451),o=r(41168),i=r(91382),s=r(49445),l=r(98589);function c(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}var u=o.default.vtkDebugMacro;function d(e,t){t.classHierarchy.push("vtkActor");var r=function(e){for(var t=1;t=1;return r=(r=r&&(!t.texture||!t.texture.isTranslucent()))&&(!t.mapper||t.mapper.getIsOpaque())},e.hasTranslucentPolygonalGeometry=function(){return null!==t.mapper&&(null===t.property&&e.setProperty(e.makeProperty()),!e.getIsOpaque())},e.makeProperty=l.ZP.newInstance,e.getProperty=function(){return null===t.property&&(t.property=e.makeProperty()),t.property},e.getBounds=function(){if(null===t.mapper)return t.bounds;var r=t.mapper.getBounds();if(!r||6!==r.length)return r;if(r[0]>r[1])return t.mapperBounds=r.concat(),t.bounds=[1,-1,1,-1,1,-1],t.boundsMTime.modified(),r;if(!t.mapperBounds||r[0]!==t.mapperBounds[0]||r[1]!==t.mapperBounds[1]||r[2]!==t.mapperBounds[2]||r[3]!==t.mapperBounds[3]||r[4]!==t.mapperBounds[4]||r[5]!==t.mapperBounds[5]||e.getMTime()>t.boundsMTime.getMTime()){u("Recomputing bounds..."),t.mapperBounds=r.concat();var n=[];i.ZP.getCorners(r,n),e.computeMatrix();var o=new Float64Array(16);a._E.transpose(o,t.matrix),n.forEach((function(e){return a.R3.transformMat4(e,e,o)})),t.bounds[0]=t.bounds[2]=t.bounds[4]=Number.MAX_VALUE,t.bounds[1]=t.bounds[3]=t.bounds[5]=-Number.MAX_VALUE,t.bounds=t.bounds.map((function(e,t){return t%2==0?n.reduce((function(e,r){return e>r[t/2]?r[t/2]:e}),e):n.reduce((function(e,r){return ee?n:e}if(null!==t.backfaceProperty){var a=t.backfaceProperty.getMTime();e=a>e?a:e}return e},e.getRedrawMTime=function(){var e=t.mtime;if(null!==t.mapper){var r=t.mapper.getMTime();e=r>e?r:e,null!==t.mapper.getInput()&&(t.mapper.getInputAlgorithm().update(),e=(r=t.mapper.getInput().getMTime())>e?r:e)}return e},e.getSupportsSelection=function(){return!!t.mapper&&t.mapper.getSupportsSelection()},e.processSelectorPixelBuffers=function(e,r){t.mapper&&t.mapper.processSelectorPixelBuffers&&t.mapper.processSelectorPixelBuffers(e,r)}}var f={mapper:null,property:null,backfaceProperty:null,forceOpaque:!1,forceTranslucent:!1,bounds:[1,-1,1,-1,1,-1]};function p(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,f,r),s.ZP.extend(e,t,r),t.boundsMTime={},o.default.obj(t.boundsMTime),o.default.set(e,t,["property"]),o.default.setGet(e,t,["backfaceProperty","forceOpaque","forceTranslucent","mapper"]),d(e,t)}var g={newInstance:o.default.newInstance(p,"vtkActor"),extend:p}},34535:(e,t,r)=>{"use strict";r.d(t,{ZP:()=>u});var n=r(78826),a=r(45451),o=r(41168),i=r(59474),s=o.default.vtkDebugMacro;var l={position:[0,0,1],focalPoint:[0,0,0],viewUp:[0,1,0],directionOfProjection:[0,0,-1],parallelProjection:!1,useHorizontalViewAngle:!1,viewAngle:30,parallelScale:1,clippingRange:[.01,1000.01],windowCenter:[0,0],viewPlaneNormal:[0,0,1],useOffAxisProjection:!1,screenBottomLeft:[-.5,-.5,-.5],screenBottomRight:[.5,-.5,-.5],screenTopRight:[.5,.5,-.5],freezeFocalPoint:!1,projectionMatrix:null,viewMatrix:null,cameraLightTransform:a._E.create(),physicalTranslation:[0,0,0],physicalScale:1,physicalViewUp:[0,1,0],physicalViewNorth:[0,0,-1]};function c(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,l,r),o.default.obj(e,t),o.default.get(e,t,["distance"]),o.default.setGet(e,t,["parallelProjection","useHorizontalViewAngle","viewAngle","parallelScale","useOffAxisProjection","freezeFocalPoint","physicalScale"]),o.default.getArray(e,t,["directionOfProjection","viewPlaneNormal","position","focalPoint"]),o.default.setGetArray(e,t,["clippingRange","windowCenter"],2),o.default.setGetArray(e,t,["viewUp","screenBottomLeft","screenBottomRight","screenTopRight","physicalTranslation","physicalViewUp","physicalViewNorth"],3),function(e,t){t.classHierarchy.push("vtkCamera");var r=new Float64Array(3),o=new Float64Array([0,0,-1]),l=new Float64Array([0,1,0]),c=a._E.identity(new Float64Array(16)),u=a._E.identity(new Float64Array(16)),d=new Float64Array(3),f=new Float64Array(3),p=new Float64Array(3),g=a._E.identity(new Float64Array(16)),m=a._E.identity(new Float64Array(16)),h=new Float64Array(3),v=new Float64Array(3);function y(){t.viewPlaneNormal[0]=-t.directionOfProjection[0],t.viewPlaneNormal[1]=-t.directionOfProjection[1],t.viewPlaneNormal[2]=-t.directionOfProjection[2]}e.orthogonalizeViewUp=function(){var r=e.getViewMatrix();t.viewUp[0]=r[4],t.viewUp[1]=r[5],t.viewUp[2]=r[6],e.modified()},e.setPosition=function(r,n,a){r===t.position[0]&&n===t.position[1]&&a===t.position[2]||(t.position[0]=r,t.position[1]=n,t.position[2]=a,e.computeDistance(),e.modified())},e.setFocalPoint=function(r,n,a){r===t.focalPoint[0]&&n===t.focalPoint[1]&&a===t.focalPoint[2]||(t.focalPoint[0]=r,t.focalPoint[1]=n,t.focalPoint[2]=a,e.computeDistance(),e.modified())},e.setDistance=function(r){if(t.distance!==r){t.distance=r,t.distance<1e-20&&(t.distance=1e-20,s("Distance is set to minimum."));var n=t.directionOfProjection;t.focalPoint[0]=t.position[0]+n[0]*t.distance,t.focalPoint[1]=t.position[1]+n[1]*t.distance,t.focalPoint[2]=t.position[2]+n[2]*t.distance,e.modified()}},e.computeDistance=function(){var e=t.focalPoint[0]-t.position[0],r=t.focalPoint[1]-t.position[1],n=t.focalPoint[2]-t.position[2];if(t.distance=Math.sqrt(e*e+r*r+n*n),t.distance<1e-20){t.distance=1e-20,s("Distance is set to minimum.");var a=t.directionOfProjection;t.focalPoint[0]=t.position[0]+a[0]*t.distance,t.focalPoint[1]=t.position[1]+a[1]*t.distance,t.focalPoint[2]=t.position[2]+a[2]*t.distance}t.directionOfProjection[0]=e/t.distance,t.directionOfProjection[1]=r/t.distance,t.directionOfProjection[2]=n/t.distance,y()},e.dolly=function(r){if(!(r<=0)){var n=t.distance/r;e.setPosition(t.focalPoint[0]-n*t.directionOfProjection[0],t.focalPoint[1]-n*t.directionOfProjection[1],t.focalPoint[2]-n*t.directionOfProjection[2])}},e.roll=function(r){var n=t.position,o=t.focalPoint,s=t.viewUp,l=new Float64Array([s[0],s[1],s[2],0]);a._E.identity(g);var c=new Float64Array([o[0]-n[0],o[1]-n[1],o[2]-n[2]]);a._E.rotate(g,g,(0,i.r)(r),c),a.vh.transformMat4(l,l,g),t.viewUp[0]=l[0],t.viewUp[1]=l[1],t.viewUp[2]=l[2],e.modified()},e.azimuth=function(r){var n=t.focalPoint;a._E.identity(m),a._E.translate(m,m,n),a._E.rotate(m,m,(0,i.r)(r),t.viewUp),a._E.translate(m,m,[-n[0],-n[1],-n[2]]),a.R3.transformMat4(h,t.position,m),e.setPosition(h[0],h[1],h[2])},e.yaw=function(r){var n=t.position;a._E.identity(m),a._E.translate(m,m,n),a._E.rotate(m,m,(0,i.r)(r),t.viewUp),a._E.translate(m,m,[-n[0],-n[1],-n[2]]),a.R3.transformMat4(v,t.focalPoint,m),e.setFocalPoint(v[0],v[1],v[2])},e.elevation=function(r){var n=t.focalPoint,o=e.getViewMatrix(),s=[-o[0],-o[1],-o[2]];a._E.identity(m),a._E.translate(m,m,n),a._E.rotate(m,m,(0,i.r)(r),s),a._E.translate(m,m,[-n[0],-n[1],-n[2]]),a.R3.transformMat4(h,t.position,m),e.setPosition(h[0],h[1],h[2])},e.pitch=function(r){var o=t.position,s=e.getViewMatrix(),l=[s[0],s[1],s[2]];a._E.identity(m),a._E.translate(m,m,o),a._E.rotate(m,m,(0,i.r)(r),l),a._E.translate(m,m,[-o[0],-o[1],-o[2]]),a.R3.transformMat4(v,t.focalPoint,m),e.setFocalPoint.apply(e,(0,n.Z)(v))},e.zoom=function(r){r<=0||(t.parallelProjection?t.parallelScale/=r:t.viewAngle/=r,e.modified())},e.translate=function(r,n,a){var o=[r,n,a];(0,i.k)(t.position,o,t.position),(0,i.k)(t.focalPoint,o,t.focalPoint),e.computeDistance(),e.modified()},e.applyTransform=function(r){var o=[].concat((0,n.Z)(t.viewUp),[1]),i=[],s=[],l=[];o[0]+=t.position[0],o[1]+=t.position[1],o[2]+=t.position[2],a.vh.transformMat4(i,[].concat((0,n.Z)(t.position),[1]),r),a.vh.transformMat4(s,[].concat((0,n.Z)(t.focalPoint),[1]),r),a.vh.transformMat4(l,o,r),l[0]-=i[0],l[1]-=i[1],l[2]-=i[2],e.setPosition.apply(e,(0,n.Z)(i.slice(0,3))),e.setFocalPoint.apply(e,(0,n.Z)(s.slice(0,3))),e.setViewUp.apply(e,(0,n.Z)(l.slice(0,3)))},e.getThickness=function(){return t.clippingRange[1]-t.clippingRange[0]},e.setThickness=function(r){var n=r;n<1e-20&&(n=1e-20,s("Thickness is set to minimum.")),e.setClippingRange(t.clippingRange[0],t.clippingRange[0]+n)},e.setThicknessFromFocalPoint=function(r){var n=r;n<1e-20&&(n=1e-20,s("Thickness is set to minimum.")),e.setClippingRange(t.distance-n/2,t.distance+n/2)},e.setRoll=function(e){},e.getRoll=function(){},e.setObliqueAngles=function(e,t){},e.getOrientation=function(){},e.getOrientationWXYZ=function(){},e.getFrustumPlanes=function(e){},e.getCameraLightTransformMatrix=function(e){return a._E.copy(e,t.cameraLightTransform),e},e.computeCameraLightTransform=function(){a._E.copy(c,e.getViewMatrix()),a._E.invert(c,c),a._E.fromScaling(u,[t.distance,t.distance,t.distance]),a._E.multiply(c,c,u),a._E.identity(t.cameraLightTransform),a._E.translate(t.cameraLightTransform,c,[0,0,-1])},e.deepCopy=function(e){},e.physicalOrientationToWorldDirection=function(e){var t=a.gf.fromValues(e[0],e[1],e[2],e[3]),r=a.gf.create(),n=a.gf.fromValues(0,0,1,0);return a.gf.conjugate(r,t),a.gf.multiply(n,t,n),a.gf.multiply(n,n,r),[n[0],n[1],n[2]]},e.getPhysicalToWorldMatrix=function(t){e.getWorldToPhysicalMatrix(t),a._E.invert(t,t)},e.getWorldToPhysicalMatrix=function(e){a._E.identity(e);var r=[3];(0,i.j)(t.physicalViewNorth,t.physicalViewUp,r),e[0]=r[0],e[1]=r[1],e[2]=r[2],e[4]=t.physicalViewUp[0],e[5]=t.physicalViewUp[1],e[6]=t.physicalViewUp[2],e[8]=-t.physicalViewNorth[0],e[9]=-t.physicalViewNorth[1],e[10]=-t.physicalViewNorth[2],a._E.transpose(e,e),a.R3.set(d,1/t.physicalScale,1/t.physicalScale,1/t.physicalScale),a._E.scale(e,e,d),a._E.translate(e,e,t.physicalTranslation)},e.computeViewParametersFromViewMatrix=function(n){a._E.invert(c,n),a.R3.transformMat4(d,r,c),e.computeDistance();var i=t.distance;e.setPosition(d[0],d[1],d[2]),a.R3.transformMat4(f,o,c),a.R3.subtract(f,f,d),a.R3.normalize(f,f),e.setDirectionOfProjection(f[0],f[1],f[2]),a.R3.transformMat4(p,l,c),a.R3.subtract(p,p,d),a.R3.normalize(p,p),e.setViewUp(p[0],p[1],p[2]),e.setDistance(i)},e.computeViewParametersFromPhysicalMatrix=function(t){e.getWorldToPhysicalMatrix(c),a._E.multiply(c,t,c),e.computeViewParametersFromViewMatrix(c)},e.setViewMatrix=function(r){t.viewMatrix=r,t.viewMatrix&&(a._E.copy(c,t.viewMatrix),e.computeViewParametersFromViewMatrix(c),a._E.transpose(t.viewMatrix,t.viewMatrix))},e.getViewMatrix=function(){if(t.viewMatrix)return t.viewMatrix;a._E.lookAt(c,t.position,t.focalPoint,t.viewUp),a._E.transpose(c,c);var e=new Float64Array(16);return a._E.copy(e,c),e},e.setProjectionMatrix=function(e){t.projectionMatrix=e},e.getProjectionMatrix=function(e,r,n){var o=new Float64Array(16);if(a._E.identity(o),t.projectionMatrix){var s=1/t.physicalScale;return a.R3.set(d,s,s,s),a._E.copy(o,t.projectionMatrix),a._E.scale(o,o,d),a._E.transpose(o,o),o}a._E.identity(c);var l=t.clippingRange[1]-t.clippingRange[0],u=[t.clippingRange[0]+(r+1)*l/2,t.clippingRange[0]+(n+1)*l/2];if(t.parallelProjection){var f=t.parallelScale*e,p=t.parallelScale,g=(t.windowCenter[0]-1)*f,m=(t.windowCenter[0]+1)*f,h=(t.windowCenter[1]-1)*p,v=(t.windowCenter[1]+1)*p;a._E.ortho(c,g,m,h,v,u[0],u[1]),a._E.transpose(c,c)}else{if(t.useOffAxisProjection)throw new Error("Off-Axis projection is not supported at this time");var y,b,T=Math.tan((0,i.r)(t.viewAngle)/2);!0===t.useHorizontalViewAngle?(y=t.clippingRange[0]*T,b=t.clippingRange[0]*T/e):(y=t.clippingRange[0]*T*e,b=t.clippingRange[0]*T);var C=(t.windowCenter[0]-1)*y,x=(t.windowCenter[0]+1)*y,S=(t.windowCenter[1]-1)*b,P=(t.windowCenter[1]+1)*b,w=u[0],O=u[1];c[0]=2*w/(x-C),c[5]=2*w/(P-S),c[2]=(C+x)/(x-C),c[6]=(S+P)/(P-S),c[10]=-(w+O)/(O-w),c[14]=-1,c[11]=-2*w*O/(O-w),c[15]=0}return a._E.copy(o,c),o},e.getCompositeProjectionMatrix=function(t,r,n){var o=e.getViewMatrix(),i=e.getProjectionMatrix(t,r,n);return a._E.multiply(i,o,i),i},e.setDirectionOfProjection=function(e,r,n){if(t.directionOfProjection[0]!==e||t.directionOfProjection[1]!==r||t.directionOfProjection[2]!==n){t.directionOfProjection[0]=e,t.directionOfProjection[1]=r,t.directionOfProjection[2]=n;var a=t.directionOfProjection;t.focalPoint[0]=t.position[0]+a[0]*t.distance,t.focalPoint[1]=t.position[1]+a[1]*t.distance,t.focalPoint[2]=t.position[2]+a[2]*t.distance,y()}},e.setDeviceAngles=function(r,n,o,s){var l=[3];(0,i.j)(t.physicalViewNorth,t.physicalViewUp,l);var c=a._E.identity(new Float64Array(16));a._E.rotate(c,c,(0,i.r)(r),t.physicalViewUp),a._E.rotate(c,c,(0,i.r)(n),l),a._E.rotate(c,c,(0,i.r)(o),t.physicalViewNorth),a._E.rotate(c,c,(0,i.r)(-s),t.physicalViewUp);var u=new Float64Array([-t.physicalViewUp[0],-t.physicalViewUp[1],-t.physicalViewUp[2]]),d=new Float64Array(t.physicalViewNorth);a.R3.transformMat4(u,u,c),a.R3.transformMat4(d,d,c),e.setDirectionOfProjection(u[0],u[1],u[2]),e.setViewUp(d[0],d[1],d[2]),e.modified()},e.setOrientationWXYZ=function(t,r,o,s){var l=a._E.identity(new Float64Array(16));if(0!==t&&(0!==r||0!==o||0!==s)){var c=(0,i.r)(t),u=a.gf.create();a.gf.setAxisAngle(u,[r,o,s],c),a._E.fromQuat(l,u)}var d=new Float64Array(3);a.R3.transformMat4(d,[0,0,-1],l);var f=new Float64Array(3);a.R3.transformMat4(f,[0,1,0],l),e.setDirectionOfProjection.apply(e,(0,n.Z)(d)),e.setViewUp.apply(e,(0,n.Z)(f)),e.modified()},e.computeClippingRange=function(e){var r,n;r=t.viewPlaneNormal,n=t.position;for(var a=-r[0],o=-r[1],i=-r[2],s=-(a*n[0]+o*n[1]+i*n[2]),l=[a*e[0]+o*e[2]+i*e[4]+s,1e-18],c=0;c<2;c++)for(var u=0;u<2;u++)for(var d=0;d<2;d++){var f=a*e[d]+o*e[2+u]+i*e[4+c]+s;l[0]=fl[1]?f:l[1]}return l}}(e,t)}var u={newInstance:o.default.newInstance(c,"vtkCamera"),extend:c}},95548:(e,t,r)=>{"use strict";r.d(t,{ZP:()=>T});var n=r(87765),a=r(41168),o=r(59474),i=r(4666),s={ColorSpace:{RGB:0,HSV:1,LAB:2,DIVERGING:3},Scale:{LINEAR:0,LOG10:1}};function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}var c=s.ColorSpace,u=s.Scale,d=i.ZP.ScalarMappingTarget,f=a.default.vtkDebugMacro,p=a.default.vtkErrorMacro,g=a.default.vtkWarningMacro;function m(e,t){var r=e[0],n=e[1],a=e[2],o=Math.sqrt(r*r+n*n+a*a),i=o>.001?Math.acos(r/o):0,s=i>.001?Math.atan2(a,n):0;t[0]=o,t[1]=i,t[2]=s}function h(e,t){if(e[0]>=t-.1)return e[2];var r=e[1]*Math.sqrt(t*t-e[0]*e[0])/(e[0]*Math.sin(e[1]));return e[2]>-.3*Math.PI?e[2]+r:e[2]-r}function v(e,t,r,n){var a=[],i=[];(0,o.H)(t,a),(0,o.H)(r,i);var s=[],l=[];m(a,s),m(i,l);var c=e;if(s[1]>.05&&l[1]>.05&&function(e,t){var r=e-t;for(r<0&&(r=-r);r>=2*Math.PI;)r-=2*Math.PI;return r>Math.PI&&(r=2*Math.PI-r),r}(s[2],l[2])>.33*Math.PI){var u=Math.max(s[0],l[0]);u=Math.max(88,u),e<.5?(l[0]=u,l[1]=0,l[2]=0,c*=2):(s[0]=u,s[1]=0,s[2]=0,c=2*c-1)}s[1]<.05&&l[1]>.05?s[2]=h(l,s[0]):l[1]<.05&&s[1]>.05&&(l[2]=h(s,l[0]));var d=[];d[0]=(1-c)*s[0]+c*l[0],d[1]=(1-c)*s[1]+c*l[1],d[2]=(1-c)*s[2]+c*l[2];var f=[];!function(e,t){var r=e[0],n=e[1],a=e[2];t[0]=r*Math.cos(n),t[1]=r*Math.sin(n)*Math.cos(a),t[2]=r*Math.sin(n)*Math.sin(a)}(d,f),(0,o.I)(f,n)}var y={clamping:!0,colorSpace:c.RGB,hSVWrap:!0,scale:u.LINEAR,nanColor:null,belowRangeColor:null,aboveRangeColor:null,useAboveRangeColor:!1,useBelowRangeColor:!1,allowDuplicateScalars:!1,table:null,tableSize:0,buildTime:null,nodes:null,discretize:!1,numberOfValues:256};function b(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,y,r),i.ZP.extend(e,t,r),t.table=[],t.nodes=[],t.nanColor=[.5,0,0,1],t.belowRangeColor=[0,0,0,1],t.aboveRangeColor=[1,1,1,1],t.buildTime={},a.default.obj(t.buildTime),a.default.get(e,t,["buildTime","mappingRange"]),a.default.setGet(e,t,["useAboveRangeColor","useBelowRangeColor","colorSpace","discretize","numberOfValues"]),a.default.setArray(e,t,["nanColor","belowRangeColor","aboveRangeColor"],4),a.default.getArray(e,t,["nanColor","belowRangeColor","aboveRangeColor"]),function(e,t){t.classHierarchy.push("vtkColorTransferFunction"),e.getSize=function(){return t.nodes.length},e.addRGBPoint=function(t,r,n,a){return e.addRGBPointLong(t,r,n,a,.5,0)},e.addRGBPointLong=function(r,n,a,o){var i=arguments.length>4&&void 0!==arguments[4]?arguments[4]:.5,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0;if(i<0||i>1)return p("Midpoint outside range [0.0, 1.0]"),-1;if(s<0||s>1)return p("Sharpness outside range [0.0, 1.0]"),-1;t.allowDuplicateScalars||e.removePoint(r);var l={x:r,r:n,g:a,b:o,midpoint:i,sharpness:s};t.nodes.push(l),e.sortAndUpdateRange();for(var c=0;c4&&void 0!==arguments[4]?arguments[4]:.5,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,l=[],c=[r,n,a];return(0,o.h)(c,l),e.addRGBPoint(t,l[0],l[1],l[2],i,s)},e.setNodes=function(r){if(t.nodes!==r){var n=JSON.stringify(t.nodes);t.nodes=r;var a=JSON.stringify(t.nodes);if(e.sortAndUpdateRange()||n!==a)return e.modified(),!0}return!1},e.sortAndUpdateRange=function(){var r=JSON.stringify(t.nodes);t.nodes.sort((function(e,t){return e.x-t.x}));var n=JSON.stringify(t.nodes),a=e.updateRange();return a||r===n?a:(e.modified(),!0)},e.updateRange=function(){var r=[2];r[0]=t.mappingRange[0],r[1]=t.mappingRange[1];var n=t.nodes.length;return n?(t.mappingRange[0]=t.nodes[0].x,t.mappingRange[1]=t.nodes[n-1].x):(t.mappingRange[0]=0,t.mappingRange[1]=0),(r[0]!==t.mappingRange[0]||r[1]!==t.mappingRange[1])&&(e.modified(),!0)},e.removePoint=function(r){for(var n=0;n=t.nodes.length)return-1;var o=!1;return t.nodes.splice(n,1),0!==n&&n!==t.nodes.length||(o=e.updateRange()),o||e.modified(),a},e.movePoint=function(r,n){if(r!==n){e.removePoint(n);for(var a=0;a=r&&t.nodes[u].x<=i?t.nodes.splice(u,1):u++;e.addRGBPointLong(r,n,a,o,.5,0),e.addRGBPointLong(i,s,l,c,.5,0),e.modified()},e.addHSVSegment=function(t,r,n,a,i,s,l,c){var u=[r,n,a],d=[s,l,c],f=[],p=[];(0,o.h)(u,f),(0,o.h)(d,p),e.addRGBSegment(t,f[0],f[1],f[2],i,p[0],p[1],p[2])},e.mapValue=function(t){var r=[];return e.getColor(t,r),[Math.floor(255*r[0]+.5),Math.floor(255*r[1]+.5),Math.floor(255*r[2]+.5),255]},e.getColor=function(r,n){if(t.indexedLookup){var a=e.getSize(),o=e.getAnnotatedValueIndexInternal(r);if(o<0||0===a)e.getNanColor(n);else{var i=[];e.getNodeValue(o%a,i),n[0]=i.r,n[1]=i.g,n[2]=i.b}}else e.getTable(r,r,1,n)},e.getRedValue=function(t){var r=[];return e.getColor(t,r),r[0]},e.getGreenValue=function(t){var r=[];return e.getColor(t,r),r[1]},e.getBlueValue=function(t){var r=[];return e.getColor(t,r),r[2]},e.getTable=function(r,n,a,i){var s=Number(r),l=Number(n);if((0,o.i)(s)||(0,o.i)(l))for(var d=0;d0);var A=0,R=0,E=0;I&&(A=Math.log10(s),R=Math.log10(l));for(var M=0;M1?I?(E=A+M/(a-1)*(R-A),b=Math.pow(10,E)):b=s+M/(a-1)*(l-s):I?(E=.5*(A+R),b=Math.pow(10,E)):b=.5*(s+l),t.discretize){var V=t.mappingRange;if(b>=V[0]&&b<=V[1]){var L=t.numberOfValues,_=V[1]-V[0];if(L<=1)b=V[0]+_/2;else{var N=(b-V[0])/_,B=(0,o.J)(L*N);b=V[0]+B/(L-1)*_}}}for(;ft.nodes[f].x;)++f.99999&&(P=.99999));if(b>t.mappingRange[1])i[D]=0,i[D+1]=0,i[D+2]=0,t.clamping&&(e.getUseAboveRangeColor()?(i[D]=t.aboveRangeColor[0],i[D+1]=t.aboveRangeColor[1],i[D+2]=t.aboveRangeColor[2]):(i[D]=m,i[D+1]=h,i[D+2]=y));else if(b0&&(i[D]=t.nodes[0].r,i[D+1]=t.nodes[0].g,i[D+2]=t.nodes[0].b));else if(0===f&&(Math.abs(b-s)<1e-6||t.discretize))g>0?(i[D]=t.nodes[0].r,i[D+1]=t.nodes[0].g,i[D+2]=t.nodes[0].b):(i[D]=0,i[D+1]=0,i[D+2]=0);else{var F=0;if(F=(F=I?(E-T)/(C-T):(b-T)/(C-T)).99){if(F<.5){i[D]=x[0],i[D+1]=x[1],i[D+2]=x[2];continue}i[D]=S[0],i[D+1]=S[1],i[D+2]=S[2];continue}if(w<.01){if(t.colorSpace===c.RGB)i[D]=(1-F)*x[0]+F*S[0],i[D+1]=(1-F)*x[1]+F*S[1],i[D+2]=(1-F)*x[2]+F*S[2];else if(t.colorSpace===c.HSV){var U=[],k=[];(0,o.G)(x,U),(0,o.G)(S,k),t.hSVWrap&&(U[0]-k[0]>.5||k[0]-U[0]>.5)&&(U[0]>k[0]?U[0]-=1:k[0]-=1);var G=[];G[0]=(1-F)*U[0]+F*k[0],G[0]<0&&(G[0]+=1),G[1]=(1-F)*U[1]+F*k[1],G[2]=(1-F)*U[2]+F*k[2],(0,o.h)(G,O),i[D]=O[0],i[D+1]=O[1],i[D+2]=O[2]}else if(t.colorSpace===c.LAB){var W=[],z=[];(0,o.H)(x,W),(0,o.H)(S,z);var j=[];j[0]=(1-F)*W[0]+F*z[0],j[1]=(1-F)*W[1]+F*z[1],j[2]=(1-F)*W[2]+F*z[2],(0,o.I)(j,O),i[D]=O[0],i[D+1]=O[1],i[D+2]=O[2]}else t.colorSpace===c.DIVERGING?(v(F,x,S,O),i[D]=O[0],i[D+1]=O[1],i[D+2]=O[2]):p("ColorSpace set to invalid value.",t.colorSpace);continue}F<.5?F=.5*Math.pow(2*F,1+10*w):F>.5&&(F=1-.5*Math.pow(2*(1-F),1+10*w));var H=F*F,K=H*F,Z=2*K-3*H+1,X=-2*K+3*H,q=K-2*H+F,Y=K-H,$=void 0;if(t.colorSpace===c.RGB)for(var Q=0;Q<3;Q++)$=(1-w)*(S[Q]-x[Q]),i[D+Q]=Z*x[Q]+X*S[Q]+q*$+Y*$;else if(t.colorSpace===c.HSV){var J=[],ee=[];(0,o.G)(x,J),(0,o.G)(S,ee),t.hSVWrap&&(J[0]-ee[0]>.5||ee[0]-J[0]>.5)&&(J[0]>ee[0]?J[0]-=1:ee[0]-=1);for(var te=[],re=0;re<3;re++)$=(1-w)*(ee[re]-J[re]),te[re]=Z*J[re]+X*ee[re]+q*$+Y*$,0===re&&te[re]<0&&(te[re]+=1);(0,o.h)(te,O),i[D]=O[0],i[D+1]=O[1],i[D+2]=O[2]}else if(t.colorSpace===c.LAB){var ne=[],ae=[];(0,o.H)(x,ne),(0,o.H)(S,ae);for(var oe=[],ie=0;ie<3;ie++)$=(1-w)*(ae[ie]-ne[ie]),oe[ie]=Z*ne[ie]+X*ae[ie]+q*$+Y*$;(0,o.I)(oe,O),i[D]=O[0],i[D+1]=O[1],i[D+2]=O[2]}else t.colorSpace===c.DIVERGING?(v(F,x,S,O),i[D]=O[0],i[D+1]=O[1],i[D+2]=O[2]):p("ColorSpace set to invalid value.");for(var se=0;se<3;se++)i[D+se]=i[D+se]<0?0:i[D+se],i[D+se]=i[D+se]>1?1:i[D+se]}}}},e.getUint8Table=function(r,n,a){var o=arguments.length>3&&void 0!==arguments[3]&&arguments[3];if(e.getMTime()<=t.buildTime&&t.tableSize===a&&t.tableWithAlpha!==o)return t.table;if(0===t.nodes.length)return p("Attempting to lookup a value with no points in the function"),t.table;var i=o?4:3;t.tableSize===a&&t.tableWithAlpha===o||(t.table=new Uint8Array(a*i),t.tableSize=a,t.tableWithAlpha=o);var s=[];e.getTable(r,n,a,s);for(var l=0;l1&&(i=(n-r)/(a-1));for(var s=0;s=t.nodes.length?(p("Index out of range!"),-1):(r[0]=t.nodes[e].x,r[1]=t.nodes[e].r,r[2]=t.nodes[e].g,r[3]=t.nodes[e].b,r[4]=t.nodes[e].midpoint,r[5]=t.nodes[e].sharpness,1)},e.setNodeValue=function(r,n){if(r<0||r>=t.nodes.length)return p("Index out of range!"),-1;var a=t.nodes[r].x;return t.nodes[r].x=n[0],t.nodes[r].r=n[1],t.nodes[r].g=n[2],t.nodes[r].b=n[3],t.nodes[r].midpoint=n[4],t.nodes[r].sharpness=n[5],a!==n[0]?e.sortAndUpdateRange():e.modified(),1},e.getNumberOfAvailableColors=function(){return t.indexedLookup&&e.getSize()?e.getSize():t.tableSize?t.tableSize:16777216},e.getIndexedColor=function(t,r){var n=e.getSize();if(n>0&&t>=0){var a=[];e.getNodeValue(t%n,a);for(var o=0;o<3;++o)r[o]=a[o+1];r[3]=1}else e.getNanColor(r),r[3]=1},e.fillFromDataPointer=function(t,r){if(!(t<=0)&&r){e.removeAllPoints();for(var n=0;nr[1]?(e.getColor(r[1],a),e.addRGBPoint(r[1],a[0],a[1],a[2])):(e.getColor(n[1],a),e.addRGBPoint(r[1],a[0],a[1],a[2])),e.sortAndUpdateRange();for(var o=0;o=r[0]&&t.nodes[o].x<=r[1]?t.nodes.splice(o,1):++o;return 1},e.estimateMinNumberOfSamples=function(t,r){var n=e.findMinimumXDistance();return Math.ceil((r-t)/n)},e.findMinimumXDistance=function(){if(t.nodes.length<2)return-1;for(var e=Number.MAX_VALUE,r=0;r{"use strict";r.d(t,{ZP:()=>A});var n=r(87765),a=r(41168),o=r(21924),i=r(54131),s=r(96372),l=r(1600),c=r(59474),u=r(77415),d=r(84418),f=r(85687),p=r(14418),g=r(18603);function m(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function h(e){for(var t=1;t2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,O,r),o.Z.extend(e,t,r),a.default.get(e,t,["colorCoordinates","colorMapColors","colorTextureMap"]),a.default.setGet(e,t,["colorByArrayName","arrayAccessMode","colorMode","fieldDataTupleId","interpolateScalarsBeforeMapping","lookupTable","populateSelectionSettings","renderTime","scalarMode","scalarVisibility","selectionWebGLIdsToVTKIds","static","useLookupTableScalarRange","customShaderAttributes"]),a.default.setGetArray(e,t,["scalarRange"],2),d.Z.implementCoincidentTopologyMethods(e,t),function(e,t){t.classHierarchy.push("vtkMapper"),e.getBounds=function(){var r=e.getInputData();return r?(t.static||e.update(),t.bounds=r.getBounds()):t.bounds=(0,c.N)(),t.bounds},e.setForceCompileOnly=function(e){t.forceCompileOnly=e},e.createDefaultLookupTable=function(){t.lookupTable=l.ZP.newInstance()},e.getColorModeAsString=function(){return a.default.enumToString(T,t.colorMode)},e.setColorModeToDefault=function(){return e.setColorMode(0)},e.setColorModeToMapScalars=function(){return e.setColorMode(1)},e.setColorModeToDirectScalars=function(){return e.setColorMode(2)},e.getScalarModeAsString=function(){return a.default.enumToString(C,t.scalarMode)},e.setScalarModeToDefault=function(){return e.setScalarMode(0)},e.setScalarModeToUsePointData=function(){return e.setScalarMode(1)},e.setScalarModeToUseCellData=function(){return e.setScalarMode(2)},e.setScalarModeToUsePointFieldData=function(){return e.setScalarMode(3)},e.setScalarModeToUseCellFieldData=function(){return e.setScalarMode(4)},e.setScalarModeToUseFieldData=function(){return e.setScalarMode(5)},e.getAbstractScalars=function(e,r,n,a,o){if(!e||!t.scalarVisibility)return{scalars:null,cellFLag:!1};var i=null,s=!1;if(r===C.DEFAULT)(i=e.getPointData().getScalars())||(i=e.getCellData().getScalars(),s=!0);else if(r===C.USE_POINT_DATA)i=e.getPointData().getScalars();else if(r===C.USE_CELL_DATA)i=e.getCellData().getScalars(),s=!0;else if(r===C.USE_POINT_FIELD_DATA){var l=e.getPointData();i=n===x.BY_ID?l.getArrayByIndex(a):l.getArrayByName(o)}else if(r===C.USE_CELL_FIELD_DATA){var c=e.getCellData();s=!0,i=n===x.BY_ID?c.getArrayByIndex(a):c.getArrayByName(o)}else if(r===C.USE_FIELD_DATA){var u=e.getFieldData();i=n===x.BY_ID?u.getArrayByIndex(a):u.getArrayByName(o)}return{scalars:i,cellFlag:s}},e.mapScalars=function(r,n){var a=e.getAbstractScalars(r,t.scalarMode,t.arrayAccessMode,t.arrayId,t.colorByArrayName).scalars;if(!a)return t.colorCoordinates=null,t.colorTextureMap=null,void(t.colorMapColors=null);var o="".concat(e.getMTime()).concat(a.getMTime()).concat(n);if(t.colorBuildString!==o){if(t.useLookupTableScalarRange||e.getLookupTable().setRange(t.scalarRange[0],t.scalarRange[1]),e.canUseTextureMapForColoring(r))e.mapScalarsToTexture(a,n);else{t.colorCoordinates=null,t.colorTextureMap=null;var i=e.getLookupTable();i&&(i.build(),t.colorMapColors=i.mapScalars(a,t.colorMode,t.fieldDataTupleId))}t.colorBuildString="".concat(e.getMTime()).concat(a.getMTime()).concat(n)}},e.scalarToTextureCoordinate=function(e,t,r){var n=.5,a=1;return(0,c.i)(e)||(a=.49,(n=(e-t)*r)>1e3?n=1e3:n<-1e3&&(n=-1e3)),{texCoordS:n,texCoordT:a}},e.createColorTextureCoordinates=function(t,r,n,a,o,i,s,c,u){var d=(i[1]-i[0])/c,f=[];f[0]=i[0]-d,f[1]=i[1]+d;var p=1/(f[1]-f[0]),g=r.getData(),m=t.getData(),h=0,v=0;if(o<0||o>=a)for(var y=0;yt.colorTextureMap.getMTime()||t.lookupTable.getMTime()>t.colorTextureMap.getMTime()||t.lookupTable.getAlpha()!==n){t.lookupTable.setAlpha(n),t.colorTextureMap=null,t.lookupTable.build();var u=t.lookupTable.getNumberOfAvailableColors();u>4094&&(u=4094),u+=2;for(var d=(a[1]-a[0])/(u-1-2),f=new Float64Array(2*u),p=0;pt.colorCoordinates.getMTime()||e.getInputData(0).getMTime()>t.colorCoordinates.getMTime()||t.lookupTable.getMTime()>t.colorCoordinates.getMTime()){t.colorCoordinates=null;var h=r.getNumberOfComponents(),v=r.getNumberOfTuples();t.colorCoordinates=i.ZP.newInstance({numberOfComponents:2,values:new Float32Array(2*v)});var y=t.lookupTable.getVectorComponent();t.lookupTable.getVectorMode()===S.MAGNITUDE&&r.getNumberOfComponents()>1&&(y=-1),e.createColorTextureCoordinates(r,t.colorCoordinates,v,h,y,a,t.lookupTable.getRange(),t.colorTextureMap.getPointData().getScalars().getNumberOfTuples()/2-2,o)}},e.getIsOpaque=function(){var r=e.getInputData(),n=e.getAbstractScalars(r,t.scalarMode,t.arrayAccessMode,t.arrayId,t.colorByArrayName).scalars;if(!t.scalarVisibility||null==n)return!0;var a=e.getLookupTable();return!a||(a.build(),a.areScalarsOpaque(n,t.colorMode,-1))},e.canUseTextureMapForColoring=function(r){if(!t.interpolateScalarsBeforeMapping)return!1;if(t.lookupTable&&t.lookupTable.getIndexedLookup())return!1;var n=e.getAbstractScalars(r,t.scalarMode,t.arrayAccessMode,t.arrayId,t.colorByArrayName),a=n.scalars;return!(!a||n.cellFlag||t.colorMode===T.DEFAULT&&a.getDataType()===P.UNSIGNED_CHAR||t.colorMode===T.DIRECT_SCALARS)},e.clearColorArrays=function(){t.colorMapColors=null,t.colorCoordinates=null,t.colorTextureMap=null},e.getLookupTable=function(){return t.lookupTable||e.createDefaultLookupTable(),t.lookupTable},e.getMTime=function(){var e=t.mtime;if(null!==t.lookupTable){var r=t.lookupTable.getMTime();e=r>e?r:e}return e},e.getPrimitiveCount=function(){var t=e.getInputData();return{points:t.getPoints().getNumberOfValues()/3,verts:t.getVerts().getNumberOfValues()-t.getVerts().getNumberOfCells(),lines:t.getLines().getNumberOfValues()-2*t.getLines().getNumberOfCells(),triangles:t.getPolys().getNumberOfValues()-3*t.getPolys().getNumberOfCells()}},e.acquireInvertibleLookupTable=w("AcquireInvertibleLookupTable"),e.valueToColor=w("ValueToColor"),e.colorToValue=w("ColorToValue"),e.useInvertibleColorFor=w("UseInvertibleColorFor"),e.clearInvertibleColor=w("ClearInvertibleColor"),e.processSelectorPixelBuffers=function(e,r){if(e&&t.selectionWebGLIdsToVTKIds&&t.populateSelectionSettings){var n=e.getRawPixelBuffer(g.X.ID_LOW24),a=e.getRawPixelBuffer(g.X.ID_HIGH24),o=e.getCurrentPass(),i=e.getFieldAssociation(),s=null;i===v.FIELD_ASSOCIATION_POINTS?s=t.selectionWebGLIdsToVTKIds.points:i===v.FIELD_ASSOCIATION_CELLS&&(s=t.selectionWebGLIdsToVTKIds.cells),s&&r.forEach((function(t){if(o===g.X.ID_LOW24){var r=0;a&&(r+=a[t],r*=256),r+=n[t+2],r*=256,r+=n[t+1],r*=256,r+=n[t];var i=s[r],l=e.getPixelBuffer(g.X.ID_LOW24);l[t]=255&i,l[t+1]=(65280&i)>>8,l[t+2]=(16711680&i)>>16}else if(o===g.X.ID_HIGH24&&a){var c=0;c+=a[t],c*=256,c+=n[t],c*=256,c+=n[t+1],c*=256,c+=n[t+2];var u=s[c];e.getPixelBuffer(g.X.ID_HIGH24)[t]=(4278190080&u)>>24}}))}}}(e,t)}var A=h(h(h({newInstance:a.default.newInstance(I,"vtkMapper"),extend:I},y),b),f.ZP)},84418:(e,t,r)=>{"use strict";r.d(t,{Z:()=>f});var n=1,a=0,o=["VTK_RESOLVE_OFF","VTK_RESOLVE_POLYGON_OFFSET"];function i(){a=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0}var s={getResolveCoincidentTopologyAsString:function(){return o[a]},getResolveCoincidentTopologyPolygonOffsetFaces:function(){return n},getResolveCoincidentTopology:function(){return a},setResolveCoincidentTopology:i,setResolveCoincidentTopologyPolygonOffsetFaces:function(e){n=e},setResolveCoincidentTopologyToDefault:function(){i(0)},setResolveCoincidentTopologyToOff:function(){i(0)},setResolveCoincidentTopologyToPolygonOffset:function(){i(1)}},l=r(41168);function c(e,t,r){r.forEach((function(r){e["get".concat(r.method)]=function(){return t[r.key]},e["set".concat(r.method)]=function(e,n){t[r.key]={factor:e,offset:n}}}))}var u=["Polygon","Line","Point"],d={};c(d,{Polygon:{factor:2,offset:0},Line:{factor:1,offset:-1},Point:{factor:0,offset:-2}},u.map((function(e){return{key:e,method:"ResolveCoincidentTopology".concat(e,"OffsetParameters")}})));var f={implementCoincidentTopologyMethods:function(e,t){void 0===t.resolveCoincidentTopology&&(t.resolveCoincidentTopology=!1),l.default.setGet(e,t,["resolveCoincidentTopology"]),t.topologyOffset={Polygon:{factor:0,offset:0},Line:{factor:0,offset:0},Point:{factor:0,offset:0}},Object.keys(s).forEach((function(t){e[t]=s[t]})),Object.keys(d).forEach((function(t){e[t]=d[t]})),c(e,t.topologyOffset,u.map((function(e){return{key:e,method:"RelativeCoincidentTopology".concat(e,"OffsetParameters")}}))),e.getCoincidentTopologyPolygonOffsetParameters=function(){var t=d.getResolveCoincidentTopologyPolygonOffsetParameters(),r=e.getRelativeCoincidentTopologyPolygonOffsetParameters();return{factor:t.factor+r.factor,offset:t.offset+r.offset}},e.getCoincidentTopologyLineOffsetParameters=function(){var t=d.getResolveCoincidentTopologyLineOffsetParameters(),r=e.getRelativeCoincidentTopologyLineOffsetParameters();return{factor:t.factor+r.factor,offset:t.offset+r.offset}},e.getCoincidentTopologyPointOffsetParameter=function(){var t=d.getResolveCoincidentTopologyPointOffsetParameters(),r=e.getRelativeCoincidentTopologyPointOffsetParameters();return{factor:t.factor+r.factor,offset:t.offset+r.offset}}},staticOffsetAPI:d,otherStaticMethods:s,CATEGORIES:u}},85687:(e,t,r)=>{"use strict";r.d(t,{ZP:()=>n});var n={ColorMode:{DEFAULT:0,MAP_SCALARS:1,DIRECT_SCALARS:2},GetArray:{BY_ID:0,BY_NAME:1},ScalarMode:{DEFAULT:0,USE_POINT_DATA:1,USE_CELL_DATA:2,USE_POINT_FIELD_DATA:3,USE_CELL_FIELD_DATA:4,USE_FIELD_DATA:5}}},54873:(e,t,r)=>{"use strict";r.d(t,{ZP:()=>d});var n=r(87765),a=r(41168),o={CoordinateSystem:{DISPLAY:0,WORLD:1}};function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}var s=o.CoordinateSystem;function l(e){return function(){return a.default.vtkErrorMacro("vtkProp::".concat(e," - NOT IMPLEMENTED"))}}var c={allocatedRenderTime:10,coordinateSystem:s.WORLD,dragable:!0,estimatedRenderTime:0,paths:null,pickable:!0,renderTimeMultiplier:1,savedEstimatedRenderTime:0,textures:[],useBounds:!0,visibility:!0};function u(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,c,r),a.default.obj(e,t),a.default.get(e,t,["estimatedRenderTime","allocatedRenderTime"]),a.default.setGet(e,t,["_parentProp","coordinateSystem","dragable","pickable","renderTimeMultiplier","useBounds","visibility"]),a.default.moveToProtected(e,t,["parentProp"]),function(e,t){t.classHierarchy.push("vtkProp"),e.getMTime=function(){for(var e=t.mtime,r=0;re&&(e=n)}return e},e.processSelectorPixelBuffers=function(e,t){},e.getNestedProps=function(){return null},e.getActors=function(){return[]},e.getActors2D=function(){return[]},e.getVolumes=function(){return[]},e.pick=l("pick"),e.hasKey=l("hasKey"),e.getNestedVisibility=function(){return t.visibility&&(!t._parentProp||t._parentProp.getNestedVisibility())},e.getNestedPickable=function(){return t.pickable&&(!t._parentProp||t._parentProp.getNestedPickable())},e.getNestedDragable=function(){return t.dragable&&(!t._parentProp||t._parentProp.getNestedDragable())},e.getRedrawMTime=function(){return t.mtime},e.setEstimatedRenderTime=function(e){t.estimatedRenderTime=e,t.savedEstimatedRenderTime=e},e.restoreEstimatedRenderTime=function(){t.estimatedRenderTime=t.savedEstimatedRenderTime},e.addEstimatedRenderTime=function(e){t.estimatedRenderTime+=e},e.setAllocatedRenderTime=function(e){t.allocatedRenderTime=e,t.savedEstimatedRenderTime=t.estimatedRenderTime,t.estimatedRenderTime=0},e.getSupportsSelection=function(){return!1},e.getTextures=function(){return t.textures},e.hasTexture=function(e){return-1!==t.textures.indexOf(e)},e.addTexture=function(r){r&&!e.hasTexture(r)&&(t.textures=t.textures.concat(r),e.modified())},e.removeTexture=function(r){var n=t.textures.filter((function(e){return e!==r}));t.textures.length!==n.length&&(t.textures=n,e.modified())},e.removeAllTextures=function(){t.textures=[],e.modified()},e.setCoordinateSystemToWorld=function(){return e.setCoordinateSystem(s.WORLD)},e.setCoordinateSystemToDisplay=function(){return e.setCoordinateSystem(s.DISPLAY)}}(e,t)}var d=function(e){for(var t=1;t{"use strict";r.d(t,{ZP:()=>u});var n=r(45451),a=r(41168),o=r(91382),i=r(59474),s=r(54873);var l={origin:[0,0,0],position:[0,0,0],orientation:[0,0,0],rotation:null,scale:[1,1,1],bounds:[1,-1,1,-1,1,-1],userMatrix:null,userMatrixMTime:null,cachedProp3D:null,isIdentity:!0,matrixMTime:null};function c(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,l,r),s.ZP.extend(e,t,r),t.matrixMTime={},a.default.obj(t.matrixMTime),a.default.get(e,t,["bounds","isIdentity"]),a.default.getArray(e,t,["orientation"]),a.default.setGetArray(e,t,["origin","position","scale"],3),t.matrix=n._E.identity(new Float64Array(16)),t.rotation=n._E.identity(new Float64Array(16)),t.userMatrix=n._E.identity(new Float64Array(16)),t.transform=null,function(e,t){t.classHierarchy.push("vtkProp3D"),e.addPosition=function(r){t.position=t.position.map((function(e,t){return e+r[t]})),e.modified()},e.getOrientationWXYZ=function(){var e=n.gf.create();n._E.getRotation(e,t.rotation);var r=new Float64Array(3),a=n.gf.getAxisAngle(r,e);return[(0,i.A)(a),r[0],r[1],r[2]]},e.rotateX=function(r){0!==r&&(n._E.rotateX(t.rotation,t.rotation,(0,i.r)(r)),e.modified())},e.rotateY=function(r){0!==r&&(n._E.rotateY(t.rotation,t.rotation,(0,i.r)(r)),e.modified())},e.rotateZ=function(r){0!==r&&(n._E.rotateZ(t.rotation,t.rotation,(0,i.r)(r)),e.modified())},e.rotateWXYZ=function(r,a,o,s){if(0!==r&&(0!==a||0!==o||0!==s)){var l=(0,i.r)(r),c=n.gf.create();n.gf.setAxisAngle(c,[a,o,s],l);var u=new Float64Array(16);n._E.fromQuat(u,c),n._E.multiply(t.rotation,t.rotation,u),e.modified()}},e.setOrientation=function(r,a,o){return(r!==t.orientation[0]||a!==t.orientation[1]||o!==t.orientation[2])&&(t.orientation=[r,a,o],n._E.identity(t.rotation),e.rotateZ(o),e.rotateX(r),e.rotateY(a),e.modified(),!0)},e.setUserMatrix=function(r){return!(0,i.a)(t.userMatrix,r)&&(n._E.copy(t.userMatrix,r),e.modified(),!0)},e.getMatrix=function(){return e.computeMatrix(),t.matrix},e.computeMatrix=function(){if(e.getMTime()>t.matrixMTime.getMTime()){n._E.identity(t.matrix),t.userMatrix&&n._E.multiply(t.matrix,t.matrix,t.userMatrix),n._E.translate(t.matrix,t.matrix,t.origin),n._E.translate(t.matrix,t.matrix,t.position),n._E.multiply(t.matrix,t.matrix,t.rotation),n._E.scale(t.matrix,t.matrix,t.scale),n._E.translate(t.matrix,t.matrix,[-t.origin[0],-t.origin[1],-t.origin[2]]),n._E.transpose(t.matrix,t.matrix),t.isIdentity=!0;for(var r=0;r<4;++r)for(var a=0;a<4;++a)(r===a?1:0)!==t.matrix[r+4*a]&&(t.isIdentity=!1);t.matrixMTime.modified()}},e.getCenter=function(){return o.ZP.getCenter(t.bounds)},e.getLength=function(){return o.ZP.getLength(t.bounds)},e.getXRange=function(){return o.ZP.getXRange(t.bounds)},e.getYRange=function(){return o.ZP.getYRange(t.bounds)},e.getZRange=function(){return o.ZP.getZRange(t.bounds)},e.getUserMatrix=function(){return t.userMatrix},e.onModified((function(){e.computeMatrix()}))}(e,t)}var u={newInstance:a.default.newInstance(c,"vtkProp3D"),extend:c}},98589:(e,t,r)=>{"use strict";r.d(t,{ZP:()=>f});var n=r(87765),a=r(41168),o=r(42695);function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}var s=o.ZP.Representation,l=o.ZP.Interpolation;function c(e){return function(){return a.default.vtkErrorMacro("vtkProperty::".concat(e," - NOT IMPLEMENTED"))}}var u={color:[1,1,1],ambientColor:[1,1,1],diffuseColor:[1,1,1],specularColor:[1,1,1],edgeColor:[0,0,0],ambient:0,diffuse:1,metallic:0,roughness:.6,normalStrength:1,emission:1,baseIOR:1.45,specular:0,specularPower:1,opacity:1,interpolation:l.GOURAUD,representation:s.SURFACE,edgeVisibility:!1,backfaceCulling:!1,frontfaceCulling:!1,pointSize:1,lineWidth:1,lighting:!0,shading:!1,materialName:null};function d(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,u,r),a.default.obj(e,t),a.default.setGet(e,t,["lighting","interpolation","ambient","diffuse","metallic","roughness","normalStrength","emission","baseIOR","specular","specularPower","opacity","edgeVisibility","lineWidth","pointSize","backfaceCulling","frontfaceCulling","representation","diffuseTexture","metallicTexture","roughnessTexture","normalTexture","ambientOcclusionTexture","emissionTexture"]),a.default.setGetArray(e,t,["ambientColor","specularColor","diffuseColor","edgeColor"],3),function(e,t){t.classHierarchy.push("vtkProperty"),e.setColor=function(r,n,a){Array.isArray(r)?t.color[0]===r[0]&&t.color[1]===r[1]&&t.color[2]===r[2]||(t.color[0]=r[0],t.color[1]=r[1],t.color[2]=r[2],e.modified()):t.color[0]===r&&t.color[1]===n&&t.color[2]===a||(t.color[0]=r,t.color[1]=n,t.color[2]=a,e.modified()),e.setDiffuseColor(t.color),e.setAmbientColor(t.color),e.setSpecularColor(t.color)},e.computeCompositeColor=c("ComputeCompositeColor"),e.getColor=function(){var e=0;t.ambient+t.diffuse+t.specular>0&&(e=1/(t.ambient+t.diffuse+t.specular));for(var r=0;r<3;r++)t.color[r]=e*(t.ambient*t.ambientColor[r]+t.diffuse*t.diffuseColor[r]+t.specular*t.specularColor[r]);return[].concat(t.color)},e.setSpecularPower=function(r){var n=1/Math.max(1,r);t.roughness===n&&t.specularPower===r||(t.specularPower=r,t.roughness=n,e.modified())},e.addShaderVariable=c("AddShaderVariable"),e.setInterpolationToFlat=function(){return e.setInterpolation(l.FLAT)},e.setInterpolationToGouraud=function(){return e.setInterpolation(l.GOURAUD)},e.setInterpolationToPhong=function(){return e.setInterpolation(l.PHONG)},e.getInterpolationAsString=function(){return a.default.enumToString(l,t.interpolation)},e.setRepresentationToWireframe=function(){return e.setRepresentation(s.WIREFRAME)},e.setRepresentationToSurface=function(){return e.setRepresentation(s.SURFACE)},e.setRepresentationToPoints=function(){return e.setRepresentation(s.POINTS)},e.getRepresentationAsString=function(){return a.default.enumToString(s,t.representation)}}(e,t)}var f=function(e){for(var t=1;t{"use strict";r.d(t,{ZP:()=>o,hX:()=>a});var n={FLAT:0,GOURAUD:1,PHONG:2},a={POINTS:0,WIREFRAME:1,SURFACE:2},o={Shading:n,Representation:a,Interpolation:n}},32198:(e,t,r)=>{"use strict";r.d(t,{ZP:()=>x});var n=r(45451),a=r(41168),o=r(34535),i=r(59474);var s={switch:!0,intensity:1,color:[1,1,1],position:[0,0,1],focalPoint:[0,0,0],positional:!1,exponent:1,coneAngle:30,coneFalloff:5,attenuationValues:[1,0,0],transformMatrix:null,lightType:"SceneLight",shadowAttenuation:1,direction:[0,0,0],directionMTime:0};function l(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,s,r),a.default.obj(e,t),a.default.setGet(e,t,["intensity","switch","positional","exponent","coneAngle","coneFalloff","transformMatrix","lightType","shadowAttenuation","attenuationValues"]),a.default.setGetArray(e,t,["color","position","focalPoint","attenuationValues"],3),function(e,t){t.classHierarchy.push("vtkLight");var r=new Float64Array(3);e.getTransformedPosition=function(){return t.transformMatrix?n.R3.transformMat4(r,t.position,t.transformMatrix):n.R3.set(r,t.position[0],t.position[1],t.position[2]),r},e.getTransformedFocalPoint=function(){return t.transformMatrix?n.R3.transformMat4(r,t.focalPoint,t.transformMatrix):n.R3.set(r,t.focalPoint[0],t.focalPoint[1],t.focalPoint[2]),r},e.getDirection=function(){return t.directionMTime1&&void 0!==arguments[1]?arguments[1]:[];t.push(e);var n=e.getNestedProps();if(n&&n.length)for(var a=0;a2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,f,r),a.default.obj(e,t),a.default.event(e,t,"event"),a.default.setGetArray(e,t,["viewport"],4),a.default.setGetArray(e,t,["background","background2"],3),d(e,t)}var g={newInstance:a.default.newInstance(p,"vtkViewport"),extend:p},m=r(91382),h=a.eR,v=a.E0,y=a.t7;function b(e){return function(){return v("vtkRenderer::".concat(e," - NOT IMPLEMENTED"))}}var T={pickedProp:null,activeCamera:null,allBounds:[],ambient:[1,1,1],allocatedRenderTime:100,timeFactor:1,automaticLightCreation:!0,twoSidedLighting:!0,lastRenderTimeInSeconds:-1,renderWindow:null,lights:[],actors:[],volumes:[],lightFollowCamera:!0,numberOfPropsRendered:0,propArray:null,pathArray:null,layer:0,preserveColorBuffer:!1,preserveDepthBuffer:!1,computeVisiblePropBounds:(0,i.N)(),interactive:!0,nearClippingPlaneTolerance:0,clippingRangeExpansion:.05,erase:!0,draw:!0,useShadows:!1,useDepthPeeling:!1,occlusionRatio:0,maximumNumberOfPeels:4,selector:null,delegate:null,texturedBackground:!1,backgroundTexture:null,environmentTexture:null,environmentTextureDiffuseStrength:1,environmentTextureSpecularStrength:1,useEnvironmentTextureAsBackground:!1,pass:0};function C(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};for(Object.assign(t,T,r),g.extend(e,t,r),t.background||(t.background=[0,0,0,1]);t.background.length<3;)t.background.push(0);3===t.background.length&&t.background.push(1),(0,a.U2)(e,t,["_renderWindow","allocatedRenderTime","timeFactor","lastRenderTimeInSeconds","numberOfPropsRendered","lastRenderingUsedDepthPeeling","selector"]),(0,a.g2)(e,t,["twoSidedLighting","lightFollowCamera","automaticLightCreation","erase","draw","nearClippingPlaneTolerance","clippingRangeExpansion","backingStore","interactive","layer","preserveColorBuffer","preserveDepthBuffer","useDepthPeeling","occlusionRatio","maximumNumberOfPeels","delegate","backgroundTexture","texturedBackground","environmentTexture","environmentTextureDiffuseStrength","environmentTextureSpecularStrength","useEnvironmentTextureAsBackground","useShadows","pass"]),(0,a.c$)(e,t,["actors","volumes","lights"]),(0,a.DV)(e,t,["background"],4,1),(0,a.B6)(e,t,["renderWindow"]),function(e,t){t.classHierarchy.push("vtkRenderer");var r={type:"ComputeVisiblePropBoundsEvent",renderer:e},a={type:"ResetCameraClippingRangeEvent",renderer:e},s={type:"ResetCameraEvent",renderer:e};e.updateCamera=function(){return t.activeCamera||(h("No cameras are on, creating one."),e.getActiveCameraAndResetIfCreated()),t.activeCamera.render(e),!0},e.updateLightsGeometryToFollowCamera=function(){var r=e.getActiveCameraAndResetIfCreated();t.lights.forEach((function(e){e.lightTypeIsSceneLight()||(e.lightTypeIsHeadLight()?(e.setPositionFrom(r.getPositionByReference()),e.setFocalPointFrom(r.getFocalPointByReference()),e.modified(r.getMTime())):e.lightTypeIsCameraLight()?e.setTransformMatrix(r.getCameraLightTransformMatrix(n._E.create())):v("light has unknown light type",e.get()))}))},e.updateLightGeometry=function(){return!t.lightFollowCamera||e.updateLightsGeometryToFollowCamera()},e.allocateTime=b("allocateTime"),e.updateGeometry=b("updateGeometry"),e.getVTKWindow=function(){return t._renderWindow},e.setLayer=function(r){h(e.getClassName(),e,"setting Layer to ",r),t.layer!==r&&(t.layer=r,e.modified()),e.setPreserveColorBuffer(!!r)},e.setActiveCamera=function(r){return t.activeCamera!==r&&(t.activeCamera=r,e.modified(),e.invokeEvent({type:"ActiveCameraEvent",camera:r}),!0)},e.makeCamera=function(){var t=o.ZP.newInstance();return e.invokeEvent({type:"CreateCameraEvent",camera:t}),t},e.getActiveCamera=function(){return t.activeCamera||(t.activeCamera=e.makeCamera()),t.activeCamera},e.getActiveCameraAndResetIfCreated=function(){return t.activeCamera||(e.getActiveCamera(),e.resetCamera()),t.activeCamera},e.getActors=function(){return t.actors=[],t.props.forEach((function(e){t.actors=t.actors.concat(e.getActors())})),t.actors},e.addActor=e.addViewProp,e.removeActor=function(r){t.actors=t.actors.filter((function(e){return e!==r})),e.removeViewProp(r),e.modified()},e.removeAllActors=function(){e.getActors().forEach((function(t){e.removeViewProp(t)})),t.actors=[],e.modified()},e.getVolumes=function(){return t.volumes=[],t.props.forEach((function(e){t.volumes=t.volumes.concat(e.getVolumes())})),t.volumes},e.addVolume=e.addViewProp,e.removeVolume=function(r){t.volumes=t.volumes.filter((function(e){return e!==r})),e.removeViewProp(r),e.modified()},e.removeAllVolumes=function(){e.getVolumes().forEach((function(t){e.removeViewProp(t)})),t.volumes=[],e.modified()},e.hasLight=function(e){return t.lights.includes(e)},e.addLight=function(r){r&&!e.hasLight(r)&&(t.lights.push(r),e.modified())},e.removeLight=function(r){t.lights=t.lights.filter((function(e){return e!==r})),e.modified()},e.removeAllLights=function(){t.lights=[],e.modified()},e.setLightCollection=function(r){t.lights=r,e.modified()},e.makeLight=c.newInstance,e.createLight=function(){t.automaticLightCreation&&(t._createdLight&&(e.removeLight(t._createdLight),t._createdLight.delete(),t._createdLight=null),t._createdLight=e.makeLight(),e.addLight(t._createdLight),t._createdLight.setLightTypeToHeadLight(),t._createdLight.setPosition(e.getActiveCamera().getPosition()),t._createdLight.setFocalPoint(e.getActiveCamera().getFocalPoint()))},e.normalizedDisplayToWorld=function(t,r,n,a){var o=e.normalizedDisplayToProjection(t,r,n);return o=e.projectionToView(o[0],o[1],o[2],a),e.viewToWorld(o[0],o[1],o[2])},e.worldToNormalizedDisplay=function(t,r,n,a){var o=e.worldToView(t,r,n);return o=e.viewToProjection(o[0],o[1],o[2],a),e.projectionToNormalizedDisplay(o[0],o[1],o[2])},e.viewToWorld=function(e,r,a){if(null===t.activeCamera)return v("ViewToWorld: no active camera, cannot compute view to world, returning 0,0,0"),[0,0,0];var o=t.activeCamera.getViewMatrix();n._E.invert(o,o),n._E.transpose(o,o);var i=new Float64Array([e,r,a]);return n.R3.transformMat4(i,i,o),i},e.projectionToView=function(e,r,a,o){if(null===t.activeCamera)return v("ProjectionToView: no active camera, cannot compute projection to view, returning 0,0,0"),[0,0,0];var i=t.activeCamera.getProjectionMatrix(o,-1,1);n._E.invert(i,i),n._E.transpose(i,i);var s=new Float64Array([e,r,a]);return n.R3.transformMat4(s,s,i),s},e.worldToView=function(e,r,a){if(null===t.activeCamera)return v("WorldToView: no active camera, cannot compute view to world, returning 0,0,0"),[0,0,0];var o=t.activeCamera.getViewMatrix();n._E.transpose(o,o);var i=new Float64Array([e,r,a]);return n.R3.transformMat4(i,i,o),i},e.viewToProjection=function(e,r,a,o){if(null===t.activeCamera)return v("ViewToProjection: no active camera, cannot compute view to projection, returning 0,0,0"),[0,0,0];var i=t.activeCamera.getProjectionMatrix(o,-1,1);n._E.transpose(i,i);var s=new Float64Array([e,r,a]);return n.R3.transformMat4(s,s,i),s},e.computeVisiblePropBounds=function(){t.allBounds[0]=m.ZP.INIT_BOUNDS[0],t.allBounds[1]=m.ZP.INIT_BOUNDS[1],t.allBounds[2]=m.ZP.INIT_BOUNDS[2],t.allBounds[3]=m.ZP.INIT_BOUNDS[3],t.allBounds[4]=m.ZP.INIT_BOUNDS[4],t.allBounds[5]=m.ZP.INIT_BOUNDS[5];var n=!0;e.invokeEvent(r);for(var a=0;at.allBounds[1]&&(t.allBounds[1]=s[1]),s[2]t.allBounds[3]&&(t.allBounds[3]=s[3]),s[4]t.allBounds[5]&&(t.allBounds[5]=s[5]))}}return n&&((0,i.u)(t.allBounds),h("Can't compute bounds, no 3D props are visible")),t.allBounds},e.resetCamera=function(){var r=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:null)||e.computeVisiblePropBounds(),n=[0,0,0];if(!(0,i.P)(r))return h("Cannot reset camera!"),!1;var a=null;if(!e.getActiveCamera())return v("Trying to reset non-existent camera"),!1;a=t.activeCamera.getViewPlaneNormal(),t.activeCamera.setViewAngle(30),n[0]=(r[0]+r[1])/2,n[1]=(r[2]+r[3])/2,n[2]=(r[4]+r[5])/2;var o=r[1]-r[0],l=r[3]-r[2],c=r[5]-r[4],u=(o*=o)+(l*=l)+(c*=c);u=0===u?1:u,u=.5*Math.sqrt(u);var d=(0,i.r)(t.activeCamera.getViewAngle()),f=u,p=u/Math.sin(.5*d),g=t.activeCamera.getViewUp();return Math.abs((0,i.d)(g,a))>.999&&(y("Resetting view-up since view plane normal is parallel"),t.activeCamera.setViewUp(-g[2],g[0],g[1])),t.activeCamera.setFocalPoint(n[0],n[1],n[2]),t.activeCamera.setPosition(n[0]+p*a[0],n[1]+p*a[1],n[2]+p*a[2]),e.resetCameraClippingRange(r),t.activeCamera.setParallelScale(f),t.activeCamera.setPhysicalScale(u),t.activeCamera.setPhysicalTranslation(-n[0],-n[1],-n[2]),e.invokeEvent(s),!0},e.resetCameraClippingRange=function(){var r=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:null)||e.computeVisiblePropBounds();if(!(0,i.P)(r))return h("Cannot reset camera clipping range!"),!1;if(e.getActiveCameraAndResetIfCreated(),!t.activeCamera)return v("Trying to reset clipping range of non-existent camera"),!1;var n=t.activeCamera.computeClippingRange(r),o=0;if(t.activeCamera.getParallelProjection())o=.2*t.activeCamera.getParallelScale();else{var s=(0,i.r)(t.activeCamera.getViewAngle());o=.2*Math.tan(s/2)*n[1]}return n[1]-n[0]=n[1]?.01*n[1]:n[0],t.nearClippingPlaneTolerance||(t.nearClippingPlaneTolerance=.01),n[0]e&&(e=r);var n=t._createdLight?t._createdLight.getMTime():0;return n>e&&(e=n),e},e.getTransparent=function(){return!!t.preserveColorBuffer},e.isActiveCameraCreated=function(){return!!t.activeCamera}}(e,t)}var x={newInstance:(0,a.WL)(C,"vtkRenderer"),extend:C}},64725:(e,t,r)=>{"use strict";r.d(t,{ZP:()=>c});var n=r(87765),a=r(78826),o=r(41168);function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}var s={image:null,canvas:null,jsImageData:null,imageLoaded:!1,repeat:!1,interpolate:!1,edgeClamp:!1,mipLevel:0,resizable:!1};function l(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,s,r),o.default.obj(e,t),o.default.algo(e,t,6,0),o.default.get(e,t,["canvas","image","jsImageData","imageLoaded","resizable"]),o.default.setGet(e,t,["repeat","edgeClamp","interpolate","mipLevel"]),function(e,t){t.classHierarchy.push("vtkTexture"),e.imageLoaded=function(){t.image.removeEventListener("load",e.imageLoaded),t.imageLoaded=!0,e.modified()},e.setJsImageData=function(r){t.jsImageData!==r&&(null!==r&&(e.setInputData(null),e.setInputConnection(null),t.image=null,t.canvas=null),t.jsImageData=r,t.imageLoaded=!0,e.modified())},e.setCanvas=function(r){t.canvas!==r&&(null!==r&&(e.setInputData(null),e.setInputConnection(null),t.image=null,t.jsImageData=null),t.canvas=r,e.modified())},e.setImage=function(r){t.image!==r&&(null!==r&&(e.setInputData(null),e.setInputConnection(null),t.canvas=null,t.jsImageData=null),t.image=r,t.imageLoaded=!1,r.complete?e.imageLoaded():r.addEventListener("load",e.imageLoaded),e.modified())},e.getDimensionality=function(){var r=0,n=0,a=1;if(e.getInputData()){var o=e.getInputData();r=o.getDimensions()[0],n=o.getDimensions()[1],a=o.getDimensions()[2]}return t.jsImageData&&(r=t.jsImageData.width,n=t.jsImageData.height),t.canvas&&(r=t.canvas.width,n=t.canvas.height),t.image&&(r=t.image.width,n=t.image.height),(r>1)+(n>1)+(a>1)},e.getInputAsJsImageData=function(){if(!t.imageLoaded||e.getInputData())return null;if(t.jsImageData)return t.jsImageData();if(t.canvas)return t.canvas.getContext("2d").getImageData(0,0,t.canvas.width,t.canvas.height);if(t.image){var r=document.createElement("canvas");r.width=t.image.width,r.height=t.image.height;var n=r.getContext("2d");return n.translate(0,r.height),n.scale(1,-1),n.drawImage(t.image,0,0,t.image.width,t.image.height),n.getImageData(0,0,r.width,r.height)}return null}}(e,t)}var c=function(e){for(var t=1;ti&&(w+=p),O<-i&&(w-=p),y[w]?S+=y[w]*o[P]:x-=o[P],C+=1}c[b+T]=S/x}y=(0,a.Z)(c);for(var I=0;I{"use strict";r.d(t,{X:()=>n,Z:()=>a});var n={MIN_KNOWN_PASS:0,ACTOR_PASS:0,COMPOSITE_INDEX_PASS:1,ID_LOW24:2,ID_HIGH24:3,MAX_KNOWN_PASS:3},a={PassTypes:n}},41168:(e,t,r)=>{"use strict";r.d(t,{Uw:()=>Q,tS:()=>te,default:()=>ie,U2:()=>z,c$:()=>X,B6:()=>$,WL:()=>ee,B5:()=>L,MR:()=>_,j6:()=>G,t8:()=>K,g2:()=>Z,DV:()=>Y,eR:()=>R,E0:()=>E,t7:()=>M});var n=r(16976),a=r(79133),o=r(87765),i=r(78826),s=r(33937),l=r(54833);function c(e,t,r){return c=(0,l.Z)()?Reflect.construct.bind():function(e,t,r){var n=[null];n.push.apply(n,t);var a=new(Function.bind.apply(e,n));return r&&(0,s.Z)(a,r.prototype),a},c.apply(null,arguments)}var u=r(25686),d=r.n(u),f=r(99824),p=r(72688),g=r(75755),m=r(69721);function h(){return h="undefined"!=typeof Reflect&&Reflect.get?Reflect.get.bind():function(e,t,r){var n=function(e,t){for(;!Object.prototype.hasOwnProperty.call(e,t)&&null!==(e=(0,m.Z)(e)););return e}(e,t);if(n){var a=Object.getOwnPropertyDescriptor(n,t);return a.get?a.get.call(arguments.length<3?e:r):a.value}},h.apply(this,arguments)}var v=r(57652),y=r(36639);function b(e){var t="function"==typeof Map?new Map:void 0;return b=function(e){if(null===e||(r=e,-1===Function.toString.call(r).indexOf("[native code]")))return e;var r;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,n)}function n(){return c(e,arguments,(0,m.Z)(this).constructor)}return n.prototype=Object.create(e.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}}),(0,s.Z)(n,e)},b(e)}function T(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var r,n=(0,m.Z)(e);if(t){var a=(0,m.Z)(this).constructor;r=Reflect.construct(n,arguments,a)}else r=n.apply(this,arguments);return(0,y.Z)(this,r)}}var C=function(e){(0,v.Z)(r,e);var t=T(r);function r(){return(0,p.Z)(this,r),t.apply(this,arguments)}return(0,g.Z)(r,[{key:"push",value:function(){for(var e=0;e1?t-1:0),n=1;n1?r-1:0),a=1;a0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};F(t);var r=[];if(Number.isInteger(t.mtime)||(t.mtime=++P),"classHierarchy"in t){if(!(t.classHierarchy instanceof C)){for(var n=new C,a=0;a0&&void 0!==arguments[0]?arguments[0]:0;return t.classHierarchy[t.classHierarchy.length-1-e]},e.set=function(){var r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=arguments.length>1&&void 0!==arguments[1]&&arguments[1],a=arguments.length>2&&void 0!==arguments[2]&&arguments[2],o=!1;return Object.keys(r).forEach((function(s){var l=a?null:e["set".concat(N(s))];l&&Array.isArray(r[s])&&l.length>1?o=l.apply(void 0,(0,i.Z)(r[s]))||o:l?o=l(r[s])||o:(-1!==["mtime"].indexOf(s)||n||M("Warning: Set value to model directly ".concat(s,", ").concat(r[s])),o=t[s]!==r[s]||o,t[s]=r[s])})),o},e.get=function(){for(var e=arguments.length,r=new Array(e),n=0;n1&&void 0!==arguments[1]&&arguments[1];if(r.getClassName()!==e.getClassName())throw new Error("Cannot ShallowCopy ".concat(r.getClassName()," into ").concat(e.getClassName()));var a=r.get(),o=Object.keys(t).sort();Object.keys(a).sort().forEach((function(e){var r=o.indexOf(e);-1===r?n&&R("add ".concat(e," in shallowCopy")):o.splice(r,1),t[e]=a[e]})),o.length&&n&&R("Untouched keys: ".concat(o.join(", "))),e.modified()},e.toJSON=function(){return e.getState()},e}var W={object:function(e,t,r){return function(){return S({},t[r.name])}}};function z(e,t,r){r.forEach((function(r){if("object"===(0,a.Z)(r)){var n=W[r.type];e["get".concat(B(r.name))]=n?n(e,t,r):function(){return t[r.name]}}else e["get".concat(B(r))]=function(){return t[r]}}))}var j={enum:function(e,t,r){var n="_on".concat(B(r.name),"Changed");return function(a){if("string"==typeof a){if(void 0!==r.enum[a])return t[r.name]!==r.enum[a]&&(t[r.name]=r.enum[a],e.modified(),!0);throw E("Set Enum with invalid argument ".concat(r,", ").concat(a)),new RangeError("Set Enum with invalid string argument")}if("number"==typeof a){if(t[r.name]!==a){if(-1!==Object.keys(r.enum).map((function(e){return r.enum[e]})).indexOf(a)){var o,i=t[r.name];return t[r.name]=a,null===(o=t[n])||void 0===o||o.call(t,e,t,a,i),e.modified(),!0}throw E("Set Enum outside numeric range ".concat(r,", ").concat(a)),new RangeError("Set Enum outside numeric range")}return!1}throw E("Set Enum with invalid argument (String/Number) ".concat(r,", ").concat(a)),new TypeError("Set Enum with invalid argument (String/Number)")}},object:function(e,t,r){var n="_on".concat(B(r.name),"Changed");return function(a){if(!d()(t[r.name],a)){var o,i=t[r.name];return t[r.name]=a,null===(o=t[n])||void 0===o||o.call(t,e,t,a,i),e.modified(),!0}return!1}}};function H(e){if("object"===(0,a.Z)(e)){var t=j[e.type];if(t)return function(r,n){return t(r,n,e)};throw E("No setter for field ".concat(e)),new TypeError("No setter for field")}return function(t,r){var n="_on".concat(B(e),"Changed");return function(a){if(r.deleted)return E("instance deleted - cannot call any method"),!1;if(r[e]!==a){var o,i=r[e.name];return r[e]=a,null===(o=r[n])||void 0===o||o.call(r,t,r,a,i),t.modified(),!0}return!1}}}function K(e,t,r){r.forEach((function(r){"object"===(0,a.Z)(r)?e["set".concat(B(r.name))]=H(r)(e,t):e["set".concat(B(r))]=H(r)(e,t)}))}function Z(e,t,r){z(e,t,r),K(e,t,r)}function X(e,t,r){r.forEach((function(r){e["get".concat(B(r))]=function(){return t[r]?Array.from(t[r]):t[r]},e["get".concat(B(r),"ByReference")]=function(){return t[r]}}))}function q(e,t,r,n){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:void 0;r.forEach((function(r){if(t[r]&&n&&t[r].length!==n)throw new RangeError("Invalid initial number of values for array (".concat(r,")"));var o="_on".concat(B(r),"Changed");e["set".concat(B(r))]=function(){if(t.deleted)return E("instance deleted - cannot call any method"),!1;for(var i=arguments.length,s=new Array(i),l=0;l=0)&&(u=u[0],d=!0),null==u)c=t[r]!==u;else{if(n&&u.length!==n){if(!(u.length4&&void 0!==arguments[4]?arguments[4]:void 0;X(e,t,r),q(e,t,r,n,a)}function $(e,t,r){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:0;t.deleted?E("instance deleted - cannot call any method"):n>=t.numberOfInputs?E("algorithm ".concat(e.getClassName()," only has ").concat(t.numberOfInputs," input ports. To add more input ports, use addInputData()")):(t.inputData[n]!==r||t.inputConnection[n])&&(t.inputData[n]=r,t.inputConnection[n]=null,e.modified&&e.modified())}function o(r){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;if(t.deleted)E("instance deleted - cannot call any method");else{if(n>=t.numberOfInputs){var a="algorithm ".concat(e.getClassName()," only has ");return a+="".concat(t.numberOfInputs),void E(a+=" input ports. To add more input ports, use addInputConnection()")}t.inputData[n]=null,t.inputConnection[n]=r}}function i(){for(var e=t.numberOfInputs;e&&!t.inputData[e-1]&&!t.inputConnection[e-1];)e--;return e===t.numberOfInputs&&t.numberOfInputs++,e}function s(){var r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;return t.deleted?(E("instance deleted - cannot call any method"),null):(e.shouldUpdate()&&e.update(),t.output[r])}if(t.inputData?t.inputData=t.inputData.map(f.Z):t.inputData=[],t.inputConnection?t.inputConnection=t.inputConnection.map(f.Z):t.inputConnection=[],t.output?t.output=t.output.map(f.Z):t.output=[],t.inputArrayToProcess?t.inputArrayToProcess=t.inputArrayToProcess.map(f.Z):t.inputArrayToProcess=[],t.numberOfInputs=r,e.shouldUpdate=function(){for(var r=e.getMTime(),a=1/0,o=n;o--;){if(!t.output[o]||t.output[o].isDeleted())return!0;var i=t.output[o].getMTime();if(ia)return!0}return!1},t.numberOfInputs){for(var l=t.numberOfInputs;l--;)t.inputData.push(null),t.inputConnection.push(null);e.setInputData=a,e.setInputConnection=o,e.addInputData=function(e){t.deleted?E("instance deleted - cannot call any method"):a(e,i())},e.addInputConnection=function(e){t.deleted?E("instance deleted - cannot call any method"):o(e,i())},e.getInputData=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;return t.inputConnection[e]&&(t.inputData[e]=t.inputConnection[e]()),t.inputData[e]},e.getInputConnection=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;return t.inputConnection[e]}}n&&(e.getOutputData=s,e.getOutputPort=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,r=function(){return s(t)};return r.filter=e,r}),e.update=function(){var r=[];if(t.numberOfInputs)for(var n=0;n3&&void 0!==arguments[3]?arguments[3]:"Scalars";t.inputArrayToProcess.length0&&void 0!==arguments[0]?arguments[0]:{}),Object.freeze(t)};return t&&f.Z.register(t,r),r}function te(){for(var e=arguments.length,t=new Array(e),r=0;r2&&void 0!==arguments[2]?arguments[2]:{};t.keystore=Object.assign(t.keystore||{},r),e.setKey=function(e,r){t.keystore[e]=r},e.getKey=function(e){return t.keystore[e]},e.getAllKeys=function(){return Object.keys(t.keystore)},e.deleteKey=function(e){return delete t.keystore[e]},e.clearKeystore=function(){return e.getAllKeys().forEach((function(e){return delete t.keystore[e]}))}}var ae=1,oe="__root__";var ie={algo:Q,capitalize:N,chain:te,debounce:function(e,t,r){var n,a=this,o=function(){for(var o=arguments.length,i=new Array(o),s=0;s1&&void 0!==arguments[1]?arguments[1]:0;if(!e.apply)return console.error("Invalid callback for event ".concat(r)),null;if(t.deleted)return E("instance deleted - cannot call any method"),null;var o=i++;return a.push([o,e,n]),a.sort((function(e,t){return t[2]-e[2]})),function(e){return Object.freeze({unsubscribe:function(){s(e)}})}(o)},e.delete=function(){o(),a.forEach((function(e){return s((0,n.Z)(e,1)[0])}))}},EVENT_ABORT:J,formatBytesToProperUnit:function(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:2,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1e3,n=["TB","GB","MB","KB"],a=Number(e),o="B";a>r;)a/=r,o=n.pop();return"".concat(a.toFixed(t)," ").concat(o)},formatNumbersWithThousandSeparator:function(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:" ",r=[],n=e;n>1e3;)r.push("000".concat(n%1e3).slice(-3)),n=Math.floor(n/1e3);return n>0&&r.push(n),r.reverse(),r.join(t)},get:z,getArray:X,getCurrentGlobalMTime:function(){return P},getStateArrayMapFunc:U,isVtkObject:re,keystore:ne,measurePromiseExecution:function(e,t){var r=performance.now();e.finally((function(){var e=performance.now()-r;t(e)}))},moveToProtected:$,newInstance:ee,newTypedArray:L,newTypedArrayFrom:_,normalizeWheel:function(e){var t=0,r=0,n=0,a=0;return"detail"in e&&(r=e.detail),"wheelDelta"in e&&(r=-e.wheelDelta/120),"wheelDeltaY"in e&&(r=-e.wheelDeltaY/120),"wheelDeltaX"in e&&(t=-e.wheelDeltaX/120),"axis"in e&&e.axis===e.HORIZONTAL_AXIS&&(t=r,r=0),n=10*t,a=10*r,"deltaY"in e&&(a=e.deltaY),"deltaX"in e&&(n=e.deltaX),(n||a)&&e.deltaMode&&(1===e.deltaMode?(n*=40,a*=40):(n*=800,a*=800)),n&&!t&&(t=n<1?-1:1),a&&!r&&(r=a<1?-1:1),{spinX:t,spinY:r,pixelX:n,pixelY:a}},obj:G,proxy:function(e,t){ne(e,t);var r=e.delete;t.proxyId="".concat(ae++),t.ui=JSON.parse(JSON.stringify(t.ui||[])),z(e,t,["proxyId","proxyGroup","proxyName"]),Z(e,t,["proxyManager"]);var n={},a={};function i(e,t){a[t]||(a[t]=[]);for(var r=a[t],o=0;o0&&void 0!==arguments[0]?arguments[0]:oe,n=[],o=t.proxyId,i=function(){return a[arguments.length>0&&void 0!==arguments[0]?arguments[0]:oe]}(r)||[],l=0;l1&&void 0!==arguments[1]&&arguments[1];if(t.propertyLinkMap[e])return t.propertyLinkMap[e];var n=null,a=[],i=0,s=!1;function l(r){var l=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(s)return null;var c=[],u=null;for(i=a.length;i--;){var d=a[i];d.instance===r?u=d:c.push(d)}if(!u)return null;var f=u.instance["get".concat(B(u.propertyName))]();if(!function(e,t){if(e===t)return!0;if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return!1;for(var r=0;r2&&void 0!==arguments[2]&&arguments[2],s=r.onModified(l),u=a[0];return a.push({instance:r,propertyName:n,subscription:s}),i&&(t.propertyLinkMap[e].persistent&&void 0!==t.propertyLinkMap[e].value?r.set((0,o.Z)({},n,t.propertyLinkMap[e].value)):u&&l(u.instance,!0)),{unsubscribe:function(){return c(r,n)}}},unbind:c,unsubscribe:function(){for(;a.length;)a.pop().subscription.unsubscribe()},persistent:r};return t.propertyLinkMap[e]=u,u},e.listPropertyNames=function(){return s().map((function(e){return e.name}))},e.getPropertyByName=function(e){return s().find((function(t){return t.name===e}))},e.getPropertyDomainByName=function(e){return(n[e]||{}).domain},e.getProxySection=function(){return{id:t.proxyId,name:t.proxyGroup,ui:t.ui,properties:s()}},e.delete=function(){for(var n=Object.keys(t.propertyLinkMap),a=n.length;a--;)t.propertyLinkMap[n[a]].unsubscribe();Object.keys(t.propertyLinkSubscribers).forEach(e.gcPropertyLinks),r()},e.getState=function(){return null},k((function(){if(t.links)for(var r=0;r2&&void 0!==arguments[2]?arguments[2]:{},n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};t.this=e;for(var a=Object.keys(n),o=a.length,i=function(){var i=a[o];t[i]=n[i];var s=r[i];e["set".concat(B(i))]=function(r){r!==t[i]&&(t[i]=r,function(e){for(var r=Object.keys(e),n=r.length;n--;){var a=r[n];t[a].set(e[a])}}(s[r]),e.modified())}};o--;)i();a.length&&z(e,t,a)},safeArrays:F,set:K,setArray:q,setGet:Z,setGetArray:Y,setImmediate:k,setLoggerFunction:function(e,t){A[e]&&(A[e]=t||I)},throttle:function(e,t){var r=!1,n=null;function a(){r=!1,null!==n&&(o.apply(void 0,(0,i.Z)(n)),n=null)}function o(){for(var o=arguments.length,i=new Array(o),s=0;s2&&void 0!==arguments[2]?arguments[2]:[],a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[];if(re(t)){if(a.indexOf(t)>=0)return n;a.push(t);var o=r(t);void 0!==o&&n.push(o);var i=t.get();Object.keys(i).forEach((function(t){var o=i[t];Array.isArray(o)?o.forEach((function(t){e(t,r,n,a)})):e(o,r,n,a)}))}return n},TYPED_ARRAYS:V,uncapitalize:function(e){return e.charAt(0).toLowerCase()+e.slice(1)},VOID:w,vtkDebugMacro:R,vtkErrorMacro:E,vtkInfoMacro:function(){A.info.apply(A,arguments)},vtkLogMacro:function(){A.log.apply(A,arguments)},vtkOnceErrorMacro:function(e){D[e]||(A.error(e),D[e]=!0)},vtkWarningMacro:M}},99824:(e,t,r)=>{"use strict";r.d(t,{I:()=>s,Z:()=>c});var n=r(79133),a=r(87765),o=r(7218);function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}var s=r.n(o)()(),l={vtkObject:function(){return null}};function c(e){if(null==e)return e;if(e.isA)return e;if(!e.vtkClass)return s.console&&s.console.error&&s.console.error("Invalid VTK object"),null;var t=l[e.vtkClass];if(!t)return s.console&&s.console.error&&s.console.error("No vtk class found for Object of type ".concat(e.vtkClass)),null;var r=function(e){for(var t=1;t{"use strict";"undefined"!=typeof self?e.exports=self:"undefined"!=typeof window?e.exports=window:e.exports=Function("return this")()},7218:(e,t,r)=>{"use strict";var n=r(35582),a=r(99989),o=r(96370),i=r(7345),s=o(),l=function(){return s};n(l,{getPolyfill:o,implementation:a,shim:i}),e.exports=l},96370:(e,t,r)=>{"use strict";var n=r(99989);e.exports=function(){return"object"==typeof r.g&&r.g&&r.g.Math===Math&&r.g.Array===Array?r.g:n}},7345:(e,t,r)=>{"use strict";var n=r(35582),a=r(96370);e.exports=function(){var e=a();if(n.supportsDescriptors){var t=Object.getOwnPropertyDescriptor(e,"globalThis");t&&(!t.configurable||!t.enumerable&&t.writable&&globalThis===e)||Object.defineProperty(e,"globalThis",{configurable:!0,enumerable:!1,value:e,writable:!0})}else"object"==typeof globalThis&&globalThis===e||(e.globalThis=e);return e}},20840:e=>{e.exports=function(e){"use strict";var t=["0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"];function r(e,t){var r=e[0],n=e[1],a=e[2],o=e[3];n=((n+=((a=((a+=((o=((o+=((r=((r+=(n&a|~n&o)+t[0]-680876936|0)<<7|r>>>25)+n|0)&n|~r&a)+t[1]-389564586|0)<<12|o>>>20)+r|0)&r|~o&n)+t[2]+606105819|0)<<17|a>>>15)+o|0)&o|~a&r)+t[3]-1044525330|0)<<22|n>>>10)+a|0,n=((n+=((a=((a+=((o=((o+=((r=((r+=(n&a|~n&o)+t[4]-176418897|0)<<7|r>>>25)+n|0)&n|~r&a)+t[5]+1200080426|0)<<12|o>>>20)+r|0)&r|~o&n)+t[6]-1473231341|0)<<17|a>>>15)+o|0)&o|~a&r)+t[7]-45705983|0)<<22|n>>>10)+a|0,n=((n+=((a=((a+=((o=((o+=((r=((r+=(n&a|~n&o)+t[8]+1770035416|0)<<7|r>>>25)+n|0)&n|~r&a)+t[9]-1958414417|0)<<12|o>>>20)+r|0)&r|~o&n)+t[10]-42063|0)<<17|a>>>15)+o|0)&o|~a&r)+t[11]-1990404162|0)<<22|n>>>10)+a|0,n=((n+=((a=((a+=((o=((o+=((r=((r+=(n&a|~n&o)+t[12]+1804603682|0)<<7|r>>>25)+n|0)&n|~r&a)+t[13]-40341101|0)<<12|o>>>20)+r|0)&r|~o&n)+t[14]-1502002290|0)<<17|a>>>15)+o|0)&o|~a&r)+t[15]+1236535329|0)<<22|n>>>10)+a|0,n=((n+=((a=((a+=((o=((o+=((r=((r+=(n&o|a&~o)+t[1]-165796510|0)<<5|r>>>27)+n|0)&a|n&~a)+t[6]-1069501632|0)<<9|o>>>23)+r|0)&n|r&~n)+t[11]+643717713|0)<<14|a>>>18)+o|0)&r|o&~r)+t[0]-373897302|0)<<20|n>>>12)+a|0,n=((n+=((a=((a+=((o=((o+=((r=((r+=(n&o|a&~o)+t[5]-701558691|0)<<5|r>>>27)+n|0)&a|n&~a)+t[10]+38016083|0)<<9|o>>>23)+r|0)&n|r&~n)+t[15]-660478335|0)<<14|a>>>18)+o|0)&r|o&~r)+t[4]-405537848|0)<<20|n>>>12)+a|0,n=((n+=((a=((a+=((o=((o+=((r=((r+=(n&o|a&~o)+t[9]+568446438|0)<<5|r>>>27)+n|0)&a|n&~a)+t[14]-1019803690|0)<<9|o>>>23)+r|0)&n|r&~n)+t[3]-187363961|0)<<14|a>>>18)+o|0)&r|o&~r)+t[8]+1163531501|0)<<20|n>>>12)+a|0,n=((n+=((a=((a+=((o=((o+=((r=((r+=(n&o|a&~o)+t[13]-1444681467|0)<<5|r>>>27)+n|0)&a|n&~a)+t[2]-51403784|0)<<9|o>>>23)+r|0)&n|r&~n)+t[7]+1735328473|0)<<14|a>>>18)+o|0)&r|o&~r)+t[12]-1926607734|0)<<20|n>>>12)+a|0,n=((n+=((a=((a+=((o=((o+=((r=((r+=(n^a^o)+t[5]-378558|0)<<4|r>>>28)+n|0)^n^a)+t[8]-2022574463|0)<<11|o>>>21)+r|0)^r^n)+t[11]+1839030562|0)<<16|a>>>16)+o|0)^o^r)+t[14]-35309556|0)<<23|n>>>9)+a|0,n=((n+=((a=((a+=((o=((o+=((r=((r+=(n^a^o)+t[1]-1530992060|0)<<4|r>>>28)+n|0)^n^a)+t[4]+1272893353|0)<<11|o>>>21)+r|0)^r^n)+t[7]-155497632|0)<<16|a>>>16)+o|0)^o^r)+t[10]-1094730640|0)<<23|n>>>9)+a|0,n=((n+=((a=((a+=((o=((o+=((r=((r+=(n^a^o)+t[13]+681279174|0)<<4|r>>>28)+n|0)^n^a)+t[0]-358537222|0)<<11|o>>>21)+r|0)^r^n)+t[3]-722521979|0)<<16|a>>>16)+o|0)^o^r)+t[6]+76029189|0)<<23|n>>>9)+a|0,n=((n+=((a=((a+=((o=((o+=((r=((r+=(n^a^o)+t[9]-640364487|0)<<4|r>>>28)+n|0)^n^a)+t[12]-421815835|0)<<11|o>>>21)+r|0)^r^n)+t[15]+530742520|0)<<16|a>>>16)+o|0)^o^r)+t[2]-995338651|0)<<23|n>>>9)+a|0,n=((n+=((o=((o+=(n^((r=((r+=(a^(n|~o))+t[0]-198630844|0)<<6|r>>>26)+n|0)|~a))+t[7]+1126891415|0)<<10|o>>>22)+r|0)^((a=((a+=(r^(o|~n))+t[14]-1416354905|0)<<15|a>>>17)+o|0)|~r))+t[5]-57434055|0)<<21|n>>>11)+a|0,n=((n+=((o=((o+=(n^((r=((r+=(a^(n|~o))+t[12]+1700485571|0)<<6|r>>>26)+n|0)|~a))+t[3]-1894986606|0)<<10|o>>>22)+r|0)^((a=((a+=(r^(o|~n))+t[10]-1051523|0)<<15|a>>>17)+o|0)|~r))+t[1]-2054922799|0)<<21|n>>>11)+a|0,n=((n+=((o=((o+=(n^((r=((r+=(a^(n|~o))+t[8]+1873313359|0)<<6|r>>>26)+n|0)|~a))+t[15]-30611744|0)<<10|o>>>22)+r|0)^((a=((a+=(r^(o|~n))+t[6]-1560198380|0)<<15|a>>>17)+o|0)|~r))+t[13]+1309151649|0)<<21|n>>>11)+a|0,n=((n+=((o=((o+=(n^((r=((r+=(a^(n|~o))+t[4]-145523070|0)<<6|r>>>26)+n|0)|~a))+t[11]-1120210379|0)<<10|o>>>22)+r|0)^((a=((a+=(r^(o|~n))+t[2]+718787259|0)<<15|a>>>17)+o|0)|~r))+t[9]-343485551|0)<<21|n>>>11)+a|0,e[0]=r+e[0]|0,e[1]=n+e[1]|0,e[2]=a+e[2]|0,e[3]=o+e[3]|0}function n(e){var t,r=[];for(t=0;t<64;t+=4)r[t>>2]=e.charCodeAt(t)+(e.charCodeAt(t+1)<<8)+(e.charCodeAt(t+2)<<16)+(e.charCodeAt(t+3)<<24);return r}function a(e){var t,r=[];for(t=0;t<64;t+=4)r[t>>2]=e[t]+(e[t+1]<<8)+(e[t+2]<<16)+(e[t+3]<<24);return r}function o(e){var t,a,o,i,s,l,c=e.length,u=[1732584193,-271733879,-1732584194,271733878];for(t=64;t<=c;t+=64)r(u,n(e.substring(t-64,t)));for(a=(e=e.substring(t-64)).length,o=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],t=0;t>2]|=e.charCodeAt(t)<<(t%4<<3);if(o[t>>2]|=128<<(t%4<<3),t>55)for(r(u,o),t=0;t<16;t+=1)o[t]=0;return i=(i=8*c).toString(16).match(/(.*?)(.{0,8})$/),s=parseInt(i[2],16),l=parseInt(i[1],16)||0,o[14]=s,o[15]=l,r(u,o),u}function i(e){var t,n,o,i,s,l,c=e.length,u=[1732584193,-271733879,-1732584194,271733878];for(t=64;t<=c;t+=64)r(u,a(e.subarray(t-64,t)));for(n=(e=t-64>2]|=e[t]<<(t%4<<3);if(o[t>>2]|=128<<(t%4<<3),t>55)for(r(u,o),t=0;t<16;t+=1)o[t]=0;return i=(i=8*c).toString(16).match(/(.*?)(.{0,8})$/),s=parseInt(i[2],16),l=parseInt(i[1],16)||0,o[14]=s,o[15]=l,r(u,o),u}function s(e){var r,n="";for(r=0;r<4;r+=1)n+=t[e>>8*r+4&15]+t[e>>8*r&15];return n}function l(e){var t;for(t=0;tu?new ArrayBuffer(0):(a=u-c,o=new ArrayBuffer(a),i=new Uint8Array(o),s=new Uint8Array(this,c,a),i.set(s),o)}}(),g.prototype.append=function(e){return this.appendBinary(c(e)),this},g.prototype.appendBinary=function(e){this._buff+=e,this._length+=e.length;var t,a=this._buff.length;for(t=64;t<=a;t+=64)r(this._hash,n(this._buff.substring(t-64,t)));return this._buff=this._buff.substring(t-64),this},g.prototype.end=function(e){var t,r,n=this._buff,a=n.length,o=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];for(t=0;t>2]|=n.charCodeAt(t)<<(t%4<<3);return this._finish(o,a),r=l(this._hash),e&&(r=p(r)),this.reset(),r},g.prototype.reset=function(){return this._buff="",this._length=0,this._hash=[1732584193,-271733879,-1732584194,271733878],this},g.prototype.getState=function(){return{buff:this._buff,length:this._length,hash:this._hash.slice()}},g.prototype.setState=function(e){return this._buff=e.buff,this._length=e.length,this._hash=e.hash,this},g.prototype.destroy=function(){delete this._hash,delete this._buff,delete this._length},g.prototype._finish=function(e,t){var n,a,o,i=t;if(e[i>>2]|=128<<(i%4<<3),i>55)for(r(this._hash,e),i=0;i<16;i+=1)e[i]=0;n=(n=8*this._length).toString(16).match(/(.*?)(.{0,8})$/),a=parseInt(n[2],16),o=parseInt(n[1],16)||0,e[14]=a,e[15]=o,r(this._hash,e)},g.hash=function(e,t){return g.hashBinary(c(e),t)},g.hashBinary=function(e,t){var r=l(o(e));return t?p(r):r},g.ArrayBuffer=function(){this.reset()},g.ArrayBuffer.prototype.append=function(e){var t,n=f(this._buff.buffer,e,!0),o=n.length;for(this._length+=e.byteLength,t=64;t<=o;t+=64)r(this._hash,a(n.subarray(t-64,t)));return this._buff=t-64>2]|=n[t]<<(t%4<<3);return this._finish(o,a),r=l(this._hash),e&&(r=p(r)),this.reset(),r},g.ArrayBuffer.prototype.reset=function(){return this._buff=new Uint8Array(0),this._length=0,this._hash=[1732584193,-271733879,-1732584194,271733878],this},g.ArrayBuffer.prototype.getState=function(){var e=g.prototype.getState.call(this);return e.buff=d(e.buff),e},g.ArrayBuffer.prototype.setState=function(e){return e.buff=u(e.buff,!0),g.prototype.setState.call(this,e)},g.ArrayBuffer.prototype.destroy=g.prototype.destroy,g.ArrayBuffer.prototype._finish=g.prototype._finish,g.ArrayBuffer.hash=function(e,t){var r=l(i(new Uint8Array(e)));return t?p(r):r},g}()},13790:(e,t,r)=>{var n=r(74292).default;function a(){"use strict";e.exports=a=function(){return t},e.exports.__esModule=!0,e.exports.default=e.exports;var t={},r=Object.prototype,o=r.hasOwnProperty,i=Object.defineProperty||function(e,t,r){e[t]=r.value},s="function"==typeof Symbol?Symbol:{},l=s.iterator||"@@iterator",c=s.asyncIterator||"@@asyncIterator",u=s.toStringTag||"@@toStringTag";function d(e,t,r){return Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}),e[t]}try{d({},"")}catch(e){d=function(e,t,r){return e[t]=r}}function f(e,t,r,n){var a=t&&t.prototype instanceof m?t:m,o=Object.create(a.prototype),s=new A(n||[]);return i(o,"_invoke",{value:P(e,r,s)}),o}function p(e,t,r){try{return{type:"normal",arg:e.call(t,r)}}catch(e){return{type:"throw",arg:e}}}t.wrap=f;var g={};function m(){}function h(){}function v(){}var y={};d(y,l,(function(){return this}));var b=Object.getPrototypeOf,T=b&&b(b(R([])));T&&T!==r&&o.call(T,l)&&(y=T);var C=v.prototype=m.prototype=Object.create(y);function x(e){["next","throw","return"].forEach((function(t){d(e,t,(function(e){return this._invoke(t,e)}))}))}function S(e,t){function r(a,i,s,l){var c=p(e[a],e,i);if("throw"!==c.type){var u=c.arg,d=u.value;return d&&"object"==n(d)&&o.call(d,"__await")?t.resolve(d.__await).then((function(e){r("next",e,s,l)}),(function(e){r("throw",e,s,l)})):t.resolve(d).then((function(e){u.value=e,s(u)}),(function(e){return r("throw",e,s,l)}))}l(c.arg)}var a;i(this,"_invoke",{value:function(e,n){function o(){return new t((function(t,a){r(e,n,t,a)}))}return a=a?a.then(o,o):o()}})}function P(e,t,r){var n="suspendedStart";return function(a,o){if("executing"===n)throw new Error("Generator is already running");if("completed"===n){if("throw"===a)throw o;return E()}for(r.method=a,r.arg=o;;){var i=r.delegate;if(i){var s=w(i,r);if(s){if(s===g)continue;return s}}if("next"===r.method)r.sent=r._sent=r.arg;else if("throw"===r.method){if("suspendedStart"===n)throw n="completed",r.arg;r.dispatchException(r.arg)}else"return"===r.method&&r.abrupt("return",r.arg);n="executing";var l=p(e,t,r);if("normal"===l.type){if(n=r.done?"completed":"suspendedYield",l.arg===g)continue;return{value:l.arg,done:r.done}}"throw"===l.type&&(n="completed",r.method="throw",r.arg=l.arg)}}}function w(e,t){var r=t.method,n=e.iterator[r];if(void 0===n)return t.delegate=null,"throw"===r&&e.iterator.return&&(t.method="return",t.arg=void 0,w(e,t),"throw"===t.method)||"return"!==r&&(t.method="throw",t.arg=new TypeError("The iterator does not provide a '"+r+"' method")),g;var a=p(n,e.iterator,t.arg);if("throw"===a.type)return t.method="throw",t.arg=a.arg,t.delegate=null,g;var o=a.arg;return o?o.done?(t[e.resultName]=o.value,t.next=e.nextLoc,"return"!==t.method&&(t.method="next",t.arg=void 0),t.delegate=null,g):o:(t.method="throw",t.arg=new TypeError("iterator result is not an object"),t.delegate=null,g)}function O(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function I(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function A(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(O,this),this.reset(!0)}function R(e){if(e){var t=e[l];if(t)return t.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var r=-1,n=function t(){for(;++r=0;--n){var a=this.tryEntries[n],i=a.completion;if("root"===a.tryLoc)return r("end");if(a.tryLoc<=this.prev){var s=o.call(a,"catchLoc"),l=o.call(a,"finallyLoc");if(s&&l){if(this.prev=0;--r){var n=this.tryEntries[r];if(n.tryLoc<=this.prev&&o.call(n,"finallyLoc")&&this.prev=0;--t){var r=this.tryEntries[t];if(r.finallyLoc===e)return this.complete(r.completion,r.afterLoc),I(r),g}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var r=this.tryEntries[t];if(r.tryLoc===e){var n=r.completion;if("throw"===n.type){var a=n.arg;I(r)}return a}}throw new Error("illegal catch attempt")},delegateYield:function(e,t,r){return this.delegate={iterator:R(e),resultName:t,nextLoc:r},"next"===this.method&&(this.arg=void 0),g}},t}e.exports=a,e.exports.__esModule=!0,e.exports.default=e.exports},75882:(e,t,r)=>{var n=r(13790)();e.exports=n;try{regeneratorRuntime=n}catch(e){"object"==typeof globalThis?globalThis.regeneratorRuntime=n:Function("r","regeneratorRuntime = r")(n)}},47294:(e,t,r)=>{"use strict";function n(e,t){return null==e||null==t?NaN:et?1:e>=t?0:NaN}function a(e,t){return null==e||null==t?NaN:te?1:t>=e?0:NaN}function o(e){let t,r,o;function s(e,n,a=0,o=e.length){if(a>>1;r(e[t],n)<0?a=t+1:o=t}while(an(e(t),r),o=(t,r)=>e(t)-r):(t=e===n||e===a?e:i,r=e,o=e),{left:s,center:function(e,t,r=0,n=e.length){const a=s(e,t,r,n-1);return a>r&&o(e[a-1],t)>-o(e[a],t)?a-1:a},right:function(e,n,a=0,o=e.length){if(a>>1;r(e[t],n)<=0?a=t+1:o=t}while(ac,YF:()=>o,G9:()=>T,ly:()=>C,sd:()=>b,$R:()=>P});const s=o(n),l=s.right,c=(s.left,o((function(e){return null===e?NaN:+e})).center,l);u(p),u((function(e){const t=p(e);return(e,r,n,a,o)=>{t(e,r,(n<<=2)+0,(a<<=2)+0,o<<=2),t(e,r,n+1,a+1,o),t(e,r,n+2,a+2,o),t(e,r,n+3,a+3,o)}}));function u(e){return function(t,r,n=r){if(!((r=+r)>=0))throw new RangeError("invalid rx");if(!((n=+n)>=0))throw new RangeError("invalid ry");let{data:a,width:o,height:i}=t;if(!((o=Math.floor(o))>=0))throw new RangeError("invalid width");if(!((i=Math.floor(void 0!==i?i:a.length/o))>=0))throw new RangeError("invalid height");if(!o||!i||!r&&!n)return t;const s=r&&e(r),l=n&&e(n),c=a.slice();return s&&l?(d(s,c,a,o,i),d(s,a,c,o,i),d(s,c,a,o,i),f(l,a,c,o,i),f(l,c,a,o,i),f(l,a,c,o,i)):s?(d(s,a,c,o,i),d(s,c,a,o,i),d(s,a,c,o,i)):l&&(f(l,a,c,o,i),f(l,c,a,o,i),f(l,a,c,o,i)),t}}function d(e,t,r,n,a){for(let o=0,i=n*a;o{if(!((o-=i)>=a))return;let s=e*n[a];const l=i*e;for(let e=a,t=a+l;e{if(!((i-=s)>=o))return;let l=t*a[o];const c=s*t,u=c+s;for(let e=o,t=o+c;e=m?10:o>=h?5:o>=v?2:1;let s,l,c;return a<0?(c=Math.pow(10,-a)/i,s=Math.round(e*c),l=Math.round(t*c),s/ct&&--l,c=-c):(c=Math.pow(10,a)*i,s=Math.round(e/c),l=Math.round(t/c),s*ct&&--l),l0))return[];if((e=+e)===(t=+t))return[e];const n=t=a))return[];const s=o-a+1,l=new Array(s);if(n)if(i<0)for(let e=0;et||void 0===r&&t>=t)&&(r=t);else{let n=-1;for(let a of e)null!=(a=t(a,++n,e))&&(r>a||void 0===r&&a>=a)&&(r=a)}return r}(e,S),n=new Array(r);++t{"use strict";function n(e,t,r){e.prototype=t.prototype=r,r.constructor=e}function a(e,t){var r=Object.create(e.prototype);for(var n in t)r[n]=t[n];return r}function o(){}r.d(t,{sX:()=>Me,nH:()=>me,k4:()=>Oe,uL:()=>De,q$:()=>We});var i=.7,s=1/i,l="\\s*([+-]?\\d+)\\s*",c="\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)\\s*",u="\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)%\\s*",d=/^#([0-9a-f]{3,8})$/,f=new RegExp(`^rgb\\(${l},${l},${l}\\)$`),p=new RegExp(`^rgb\\(${u},${u},${u}\\)$`),g=new RegExp(`^rgba\\(${l},${l},${l},${c}\\)$`),m=new RegExp(`^rgba\\(${u},${u},${u},${c}\\)$`),h=new RegExp(`^hsl\\(${c},${u},${u}\\)$`),v=new RegExp(`^hsla\\(${c},${u},${u},${c}\\)$`),y={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074};function b(){return this.rgb().formatHex()}function T(){return this.rgb().formatRgb()}function C(e){var t,r;return e=(e+"").trim().toLowerCase(),(t=d.exec(e))?(r=t[1].length,t=parseInt(t[1],16),6===r?x(t):3===r?new O(t>>8&15|t>>4&240,t>>4&15|240&t,(15&t)<<4|15&t,1):8===r?S(t>>24&255,t>>16&255,t>>8&255,(255&t)/255):4===r?S(t>>12&15|t>>8&240,t>>8&15|t>>4&240,t>>4&15|240&t,((15&t)<<4|15&t)/255):null):(t=f.exec(e))?new O(t[1],t[2],t[3],1):(t=p.exec(e))?new O(255*t[1]/100,255*t[2]/100,255*t[3]/100,1):(t=g.exec(e))?S(t[1],t[2],t[3],t[4]):(t=m.exec(e))?S(255*t[1]/100,255*t[2]/100,255*t[3]/100,t[4]):(t=h.exec(e))?D(t[1],t[2]/100,t[3]/100,1):(t=v.exec(e))?D(t[1],t[2]/100,t[3]/100,t[4]):y.hasOwnProperty(e)?x(y[e]):"transparent"===e?new O(NaN,NaN,NaN,0):null}function x(e){return new O(e>>16&255,e>>8&255,255&e,1)}function S(e,t,r,n){return n<=0&&(e=t=r=NaN),new O(e,t,r,n)}function P(e){return e instanceof o||(e=C(e)),e?new O((e=e.rgb()).r,e.g,e.b,e.opacity):new O}function w(e,t,r,n){return 1===arguments.length?P(e):new O(e,t,r,null==n?1:n)}function O(e,t,r,n){this.r=+e,this.g=+t,this.b=+r,this.opacity=+n}function I(){return`#${M(this.r)}${M(this.g)}${M(this.b)}`}function A(){const e=R(this.opacity);return`${1===e?"rgb(":"rgba("}${E(this.r)}, ${E(this.g)}, ${E(this.b)}${1===e?")":`, ${e})`}`}function R(e){return isNaN(e)?1:Math.max(0,Math.min(1,e))}function E(e){return Math.max(0,Math.min(255,Math.round(e)||0))}function M(e){return((e=E(e))<16?"0":"")+e.toString(16)}function D(e,t,r,n){return n<=0?e=t=r=NaN:r<=0||r>=1?e=t=NaN:t<=0&&(e=NaN),new _(e,t,r,n)}function V(e){if(e instanceof _)return new _(e.h,e.s,e.l,e.opacity);if(e instanceof o||(e=C(e)),!e)return new _;if(e instanceof _)return e;var t=(e=e.rgb()).r/255,r=e.g/255,n=e.b/255,a=Math.min(t,r,n),i=Math.max(t,r,n),s=NaN,l=i-a,c=(i+a)/2;return l?(s=t===i?(r-n)/l+6*(r0&&c<1?0:s,new _(s,l,c,e.opacity)}function L(e,t,r,n){return 1===arguments.length?V(e):new _(e,t,r,null==n?1:n)}function _(e,t,r,n){this.h=+e,this.s=+t,this.l=+r,this.opacity=+n}function N(e){return(e=(e||0)%360)<0?e+360:e}function B(e){return Math.max(0,Math.min(1,e||0))}function F(e,t,r){return 255*(e<60?t+(r-t)*e/60:e<180?r:e<240?t+(r-t)*(240-e)/60:t)}n(o,C,{copy(e){return Object.assign(new this.constructor,this,e)},displayable(){return this.rgb().displayable()},hex:b,formatHex:b,formatHex8:function(){return this.rgb().formatHex8()},formatHsl:function(){return V(this).formatHsl()},formatRgb:T,toString:T}),n(O,w,a(o,{brighter(e){return e=null==e?s:Math.pow(s,e),new O(this.r*e,this.g*e,this.b*e,this.opacity)},darker(e){return e=null==e?i:Math.pow(i,e),new O(this.r*e,this.g*e,this.b*e,this.opacity)},rgb(){return this},clamp(){return new O(E(this.r),E(this.g),E(this.b),R(this.opacity))},displayable(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:I,formatHex:I,formatHex8:function(){return`#${M(this.r)}${M(this.g)}${M(this.b)}${M(255*(isNaN(this.opacity)?1:this.opacity))}`},formatRgb:A,toString:A})),n(_,L,a(o,{brighter(e){return e=null==e?s:Math.pow(s,e),new _(this.h,this.s,this.l*e,this.opacity)},darker(e){return e=null==e?i:Math.pow(i,e),new _(this.h,this.s,this.l*e,this.opacity)},rgb(){var e=this.h%360+360*(this.h<0),t=isNaN(e)||isNaN(this.s)?0:this.s,r=this.l,n=r+(r<.5?r:1-r)*t,a=2*r-n;return new O(F(e>=240?e-240:e+120,a,n),F(e,a,n),F(e<120?e+240:e-120,a,n),this.opacity)},clamp(){return new _(N(this.h),B(this.s),B(this.l),R(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl(){const e=R(this.opacity);return`${1===e?"hsl(":"hsla("}${N(this.h)}, ${100*B(this.s)}%, ${100*B(this.l)}%${1===e?")":`, ${e})`}`}}));const U=Math.PI/180,k=180/Math.PI,G=.96422,W=1,z=.82521,j=4/29,H=6/29,K=3*H*H,Z=H*H*H;function X(e){if(e instanceof q)return new q(e.l,e.a,e.b,e.opacity);if(e instanceof re)return ne(e);e instanceof O||(e=P(e));var t,r,n=J(e.r),a=J(e.g),o=J(e.b),i=Y((.2225045*n+.7168786*a+.0606169*o)/W);return n===a&&a===o?t=r=i:(t=Y((.4360747*n+.3850649*a+.1430804*o)/G),r=Y((.0139322*n+.0971045*a+.7141733*o)/z)),new q(116*i-16,500*(t-i),200*(i-r),e.opacity)}function q(e,t,r,n){this.l=+e,this.a=+t,this.b=+r,this.opacity=+n}function Y(e){return e>Z?Math.pow(e,1/3):e/K+j}function $(e){return e>H?e*e*e:K*(e-j)}function Q(e){return 255*(e<=.0031308?12.92*e:1.055*Math.pow(e,1/2.4)-.055)}function J(e){return(e/=255)<=.04045?e/12.92:Math.pow((e+.055)/1.055,2.4)}function ee(e){if(e instanceof re)return new re(e.h,e.c,e.l,e.opacity);if(e instanceof q||(e=X(e)),0===e.a&&0===e.b)return new re(NaN,0=1?(r=1,t-1):Math.floor(r*t),a=e[n],o=e[n+1],i=n>0?e[n-1]:2*a-o,s=n()=>e;function ve(e,t){return function(r){return e+r*t}}function ye(e,t){var r=t-e;return r?ve(e,r>180||r<-180?r-360*Math.round(r/360):r):he(isNaN(e)?t:e)}function be(e){return 1==(e=+e)?Te:function(t,r){return r-t?function(e,t,r){return e=Math.pow(e,r),t=Math.pow(t,r)-e,r=1/r,function(n){return Math.pow(e+n*t,r)}}(t,r,e):he(isNaN(t)?r:t)}}function Te(e,t){var r=t-e;return r?ve(e,r):he(isNaN(e)?t:e)}const Ce=function e(t){var r=be(t);function n(e,t){var n=r((e=w(e)).r,(t=w(t)).r),a=r(e.g,t.g),o=r(e.b,t.b),i=Te(e.opacity,t.opacity);return function(t){return e.r=n(t),e.g=a(t),e.b=o(t),e.opacity=i(t),e+""}}return n.gamma=e,n}(1);function xe(e){return function(t){var r,n,a=t.length,o=new Array(a),i=new Array(a),s=new Array(a);for(r=0;ro&&(a=t.slice(o,a),s[i]?s[i]+=a:s[++i]=a),(r=r[0])===(n=n[0])?s[i]?s[i]+=n:s[++i]=n:(s[++i]=null,l.push({i,x:Oe(r,n)})),o=Re.lastIndex;return o180?t+=360:t-e>180&&(e+=360),o.push({i:r.push(a(r)+"rotate(",null,n)-2,x:Oe(e,t)})):t&&r.push(a(r)+"rotate("+t+n)}(o.rotate,i.rotate,s,l),function(e,t,r,o){e!==t?o.push({i:r.push(a(r)+"skewX(",null,n)-2,x:Oe(e,t)}):t&&r.push(a(r)+"skewX("+t+n)}(o.skewX,i.skewX,s,l),function(e,t,r,n,o,i){if(e!==r||t!==n){var s=o.push(a(o)+"scale(",null,",",null,")");i.push({i:s-4,x:Oe(e,r)},{i:s-2,x:Oe(t,n)})}else 1===r&&1===n||o.push(a(o)+"scale("+r+","+n+")")}(o.scaleX,o.scaleY,i.scaleX,i.scaleY,s,l),o=i=null,function(e){for(var t,r=-1,n=l.length;++r {\n return cache[id];\n },\n /**\n * Adds the `RenderingEngine` instance to the cache.\n *\n * @param re - The `RenderingEngine` to add.\n */\n set: (re: IRenderingEngine): void => {\n const renderingEngineId = re.id;\n\n cache[renderingEngineId] = re;\n },\n /**\n * Deletes the `RenderingEngine` instance from the cache.\n *\n * @param id - The `id` of the `RenderingEngine` instance to delete.\n * @returns True if the delete was successful.\n */\n delete: (id: string) => {\n return delete cache[id];\n },\n\n getAll: (): Array => {\n const renderingEngineIds = Object.keys(cache);\n const renderingEngines = renderingEngineIds.map((id) => cache[id]);\n\n // sort the rendering engines so that the ones that start with _\n // are at the end of the array. The reason is for not breaking\n // the code that used getRenderingEngines(), but since we moved\n // the renderToCanvas utility to use GPU hence it needs a\n // rendering engine and we don't want to use the default one.\n renderingEngines.sort((a, b) => {\n if (a.id[0] === '_' && b.id[0] !== '_') {\n return 1;\n } else if (a.id[0] !== '_' && b.id[0] === '_') {\n return -1;\n } else {\n return 0;\n }\n });\n\n return renderingEngines;\n },\n};\n\nexport default renderingEngineCache;\n","/**\n * EventTarget - Provides the [EventTarget](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget) interface\n */\nclass CornerstoneEventTarget implements EventTarget {\n private listeners;\n\n constructor() {\n this.listeners = {};\n }\n\n public reset() {\n this.listeners = {};\n }\n\n public addEventListener(type, callback) {\n if (!this.listeners[type]) {\n this.listeners[type] = [];\n }\n\n // prevent multiple callbacks from firing\n if (this.listeners[type].indexOf(callback) !== -1) {\n return;\n }\n\n this.listeners[type].push(callback);\n }\n\n public removeEventListener(type, callback) {\n if (!this.listeners[type]) {\n return;\n }\n\n const stack = this.listeners[type];\n const stackLength = stack.length;\n\n for (let i = 0; i < stackLength; i++) {\n if (stack[i] === callback) {\n stack.splice(i, 1);\n\n return;\n }\n }\n }\n\n dispatchEvent(event) {\n if (!this.listeners[event.type]) {\n //console.warn(`Skipping dispatch since there are no listeners for ${event.type}`);\n return;\n }\n\n const stack = this.listeners[event.type].slice();\n const stackLength = stack.length;\n\n for (let i = 0; i < stackLength; i++) {\n stack[i].call(this, event);\n }\n\n return !event.defaultPrevented;\n }\n}\n\n/**\n * EventTarget - Provides the [EventTarget](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget) interface\n */\nconst eventTarget = new CornerstoneEventTarget();\n\nexport default eventTarget;\n","/**\n * A utility that can be used to invert (in place) an RgbTransferFunction.\n *\n * @example\n * Grabbing a reference to the RGB Transfer function from the viewport:\n * ```\n * const rgbTransferFunction = viewport\n * .getActor()\n * .getProperty()\n * .getRGBTransferFunction(0);\n *\n * rgbTransferFunction.setRange(0, 5);\n *\n * invertRgbTransferFunction(rgbTransferFunction);\n * ```\n *\n * @see {@link https://kitware.github.io/vtk-js/api/Rendering_Core_ColorTransferFunction.html|VTK.js: ColorTransferFunction}\n * @param rgbTransferFunction\n */\nexport default function invertRgbTransferFunction(\n rgbTransferFunction: any\n): void {\n // cut in case there is no function at all\n if (!rgbTransferFunction) {\n return;\n }\n\n const size = rgbTransferFunction.getSize();\n\n for (let index = 0; index < size; index++) {\n const nodeValue1 = [];\n\n rgbTransferFunction.getNodeValue(index, nodeValue1);\n\n nodeValue1[1] = 1 - nodeValue1[1];\n nodeValue1[2] = 1 - nodeValue1[2];\n nodeValue1[3] = 1 - nodeValue1[3];\n\n rgbTransferFunction.setNodeValue(index, nodeValue1);\n }\n}\n","import vtkColorTransferFunction from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction';\nimport vtkDataArray from '@kitware/vtk.js/Common/Core/DataArray';\nimport { VOIRange } from '../types';\nimport { windowLevel as windowLevelUtil } from '.';\n\n/**\n * A utility that can be used to generate an Sigmoid RgbTransferFunction.\n * Sigmoid transfer functions are used in the dicom specification:\n * https://dicom.nema.org/medical/dicom/2018b/output/chtml/part03/sect_C.11.2.html\n *\n * @example\n * Setting an RGB Transfer function from the viewport:\n * ```\n * const sigmoidRGBTransferFunction = createSigmoidRGBTransferFunction(0, 255, { lower: 0, upper: 255} );\n * viewport\n * .getActor()\n * .getProperty()\n * .setRGBTransferFunction(0, sigmoidRGBTransferFunction);\n * ```\n *\n * @see {@link https://kitware.github.io/vtk-js/api/Rendering_Core_ColorTransferFunction.html|VTK.js: ColorTransferFunction}\n * @param rgbTransferFunction\n */\nexport default function createSigmoidRGBTransferFunction(\n voiRange: VOIRange,\n approximationNodes = 1024 // humans can precieve no more than 900 shades of gray doi: 10.1007/s10278-006-1052-3\n): vtkColorTransferFunction {\n const { windowWidth, windowCenter } = windowLevelUtil.toWindowLevel(\n voiRange.lower,\n voiRange.upper\n );\n\n // Function is defined by dicom spec\n // https://dicom.nema.org/medical/dicom/2018b/output/chtml/part03/sect_C.11.2.html\n const sigmoid = (x: number, wc: number, ww: number) => {\n return 1 / (1 + Math.exp((-4 * (x - wc)) / ww));\n };\n\n // This function is the analytical inverse of the dicom spec sigmoid function\n // for values y = [0, 1] exclusive. We use this to perform better sampling of\n // points for the LUT as some images can have 2^16 unique values. This method\n // can be deprecated if vtk supports LUTFunctions rather than look up tables\n // or if vtk supports logistic scale. It currently only supports linear and\n // log10 scaling which can be set on the vtkColorTransferFunction\n const logit = (y: number, wc: number, ww: number) => {\n return wc - (ww / 4) * Math.log((1 - y) / y);\n };\n\n // we slice out the first and last value to avoid 0 and 1 Infinity values\n const range = [...Array(approximationNodes + 2).keys()]\n .map((v) => v / (approximationNodes + 2))\n .slice(1, -1);\n const table = range.reduce((res, y) => {\n const x = logit(y, windowCenter, windowWidth);\n return res.concat(x, y, y, y, 0.5, 0.0);\n }, []);\n\n const cfun = vtkColorTransferFunction.newInstance();\n cfun.buildFunctionFromArray(\n vtkDataArray.newInstance({ values: table, numberOfComponents: 6 })\n );\n return cfun;\n}\n","import vtkColorTransferFunction from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction';\n\nexport default function getVoiFromSigmoidRGBTransferFunction(\n cfun: vtkColorTransferFunction\n): [number, number] {\n let cfunRange = [];\n // @ts-ignore: vtk d ts problem\n const [lower, upper] = cfun.getRange();\n cfun.getTable(lower, upper, 1024, cfunRange);\n cfunRange = cfunRange.filter((v, k) => k % 3 === 0);\n const cfunDomain = [...Array(1024).keys()].map((v, k) => {\n return lower + ((upper - lower) / (1024 - 1)) * k;\n });\n const y1 = cfunRange[256];\n const logy1 = Math.log((1 - y1) / y1);\n const x1 = cfunDomain[256];\n const y2 = cfunRange[256 * 3];\n const logy2 = Math.log((1 - y2) / y2);\n const x2 = cfunDomain[256 * 3];\n const ww = Math.round((4 * (x2 - x1)) / (logy1 - logy2));\n const wc = Math.round(x1 + (ww * logy1) / 4);\n return [Math.round(wc - ww / 2), Math.round(wc + ww / 2)];\n}\n","import vtkColorTransferFunction from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction';\nimport { VOIRange } from '../types';\n\nexport default function createLinearRGBTransferFunction(\n voiRange: VOIRange\n): vtkColorTransferFunction {\n const cfun = vtkColorTransferFunction.newInstance();\n let lower = 0;\n let upper = 1024;\n if (\n voiRange &&\n voiRange.lower !== undefined &&\n voiRange.upper !== undefined\n ) {\n lower = voiRange.lower;\n upper = voiRange.upper;\n }\n cfun.addRGBPoint(lower, 0.0, 0.0, 0.0);\n cfun.addRGBPoint(upper, 1.0, 1.0, 1.0);\n\n return cfun;\n}\n","/**\n * A utility that can be used to scale (in place) an RgbTransferFunction. We\n * often use this to scale the transfer function based on a PET calculation.\n *\n * @example\n * Grabbing a reference to the RGB Transfer function from the viewport:\n * ```\n * const rgbTransferFunction = viewport\n * .getActor()\n * .getProperty()\n * .getRGBTransferFunction(0);\n *\n * scaleRgbTransferFunction(rgbTransferFunction, 2);\n * ```\n *\n * @see {@link https://kitware.github.io/vtk-js/api/Rendering_Core_ColorTransferFunction.html|VTK.js: ColorTransferFunction}\n * @param rgbTransferFunction\n * @param scalingFactor\n */\nexport default function scaleRGBTransferFunction(\n rgbTransferFunction: any,\n scalingFactor: number\n): void {\n const size = rgbTransferFunction.getSize();\n\n for (let index = 0; index < size; index++) {\n const nodeValue1 = [];\n\n rgbTransferFunction.getNodeValue(index, nodeValue1);\n\n nodeValue1[1] = nodeValue1[1] * scalingFactor;\n nodeValue1[2] = nodeValue1[2] * scalingFactor;\n nodeValue1[3] = nodeValue1[3] * scalingFactor;\n\n rgbTransferFunction.setNodeValue(index, nodeValue1);\n }\n}\n","import eventTarget from '../eventTarget';\n\n/**\n * Small utility to trigger a custom event for a given EventTarget.\n *\n * @example\n *\n * ```javascript\n * triggerEvent(element, Events.IMAGE_RENDERED, { element })\n * ```\n * or it can trigger event on the eventTarget itself\n *\n * ```javascript\n * triggerEvent(eventTarget, CSTOOLS_EVENTS.ANNOTATION_MODIFIED, { viewportId, annotationUID })\n * ```\n *\n * @param el - The element or EventTarget to trigger the event upon\n * @param type - The event type name\n * @param detail - The event detail to be sent\n * @returns false if event is cancelable and at least one of the event handlers\n * which received event called Event.preventDefault(). Otherwise it returns true.\n */\nexport default function triggerEvent(\n el: EventTarget = eventTarget,\n type: string,\n detail: unknown = null\n): boolean {\n if (!type) {\n throw new Error('Event type was not defined');\n }\n\n const event = new CustomEvent(type, {\n detail,\n cancelable: true,\n });\n\n return el.dispatchEvent(event);\n}\n","// prettier-ignore\n// @ts-nocheck\n/**\n * Generates a unique id that has limited chance of collision\n *\n * @see {@link https://stackoverflow.com/a/2117523/1867984|StackOverflow: Source}\n * @returns a v4 compliant GUID\n */\nexport default function uuidv4(): string {\n return ([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g, c =>\n (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16)\n );\n}\n","/**\n * Calculate the minimum and maximum values in an Array\n *\n * @param storedPixelData - The pixel data to calculate the min and max values for\n * @returns an object with two properties: min and max\n */\nexport default function getMinMax(storedPixelData: number[]): {\n min: number;\n max: number;\n} {\n // we always calculate the min max values since they are not always\n // present in DICOM and we don't want to trust them anyway as cornerstone\n // depends on us providing reliable values for these\n let min = storedPixelData[0];\n\n let max = storedPixelData[0];\n\n let storedPixel;\n const numPixels = storedPixelData.length;\n\n for (let index = 1; index < numPixels; index++) {\n storedPixel = storedPixelData[index];\n min = Math.min(min, storedPixel);\n max = Math.max(max, storedPixel);\n }\n\n return {\n min,\n max,\n };\n}\n","const LAST_RUNTIME_ID = Symbol('LastRuntimeId');\nconst GLOBAL_CONTEXT = {};\nconst DEFAULT_MAX = 0xffffffff; // Max 32-bit integer\nconst DEFAULT_SEPARATOR = '-';\n\n/**\n * Generate a unique numeric ID string valid during a single runtime session;\n *\n * @param context - An optional object to be used as context.\n * Defaults to a global context;\n * @param separator - The component separator. Defaults to \"-\";\n * @param max - The maximum component value. Defaults to 4294967295;\n * @returns The string representation of the the unique ID;\n */\nexport default function getRuntimeId(\n context?: unknown,\n separator?: string,\n max?: number\n): string {\n return getNextRuntimeId(\n // @ts-ignore\n context !== null && typeof context === 'object' ? context : GLOBAL_CONTEXT,\n LAST_RUNTIME_ID,\n (typeof max === 'number' && max > 0 ? max : DEFAULT_MAX) >>> 0\n ).join(typeof separator === 'string' ? separator : DEFAULT_SEPARATOR);\n}\n\n/*\n * Helpers\n */\n\nfunction getNextRuntimeId(\n context: Record>,\n symbol: symbol,\n max: number\n): Array {\n let idComponents = context[symbol];\n if (!(idComponents instanceof Array)) {\n idComponents = [0];\n Object.defineProperty(context, symbol, { value: idComponents });\n }\n for (let carry = true, i = 0; carry && i < idComponents.length; ++i) {\n let n = idComponents[i] | 0;\n if (n < max) {\n carry = false;\n n = n + 1;\n } else {\n n = 0;\n if (i + 1 === idComponents.length) {\n idComponents.push(0);\n }\n }\n idComponents[i] = n;\n }\n return idComponents;\n}\n","/**\n * Removes the data loader scheme from the imageId\n *\n * @param imageId - Image ID\n * @returns imageId without the data loader scheme\n */\nexport default function imageIdToURI(imageId: string): string {\n const colonIndex = imageId.indexOf(':');\n return imageId.substring(colonIndex + 1);\n}\n","import imageIdToURI from './imageIdToURI';\nimport { IImageCalibration } from '../types';\n\nconst state: Record = {}; // Calibrated pixel spacing per imageId\n\n/**\n * Simple metadataProvider object to store metadata for calibrated spacings.\n * This can be added via cornerstone.metaData.addProvider(...) in order to store\n * and return calibrated pixel spacings when metaData type is \"calibratedPixelSpacing\".\n */\nconst metadataProvider = {\n /**\n * Adds metadata for an imageId.\n * @param imageId - the imageId for the metadata to store\n * @param payload - the payload composed of new calibrated pixel spacings\n */\n add: (imageId: string, payload: IImageCalibration): void => {\n const imageURI = imageIdToURI(imageId);\n state[imageURI] = payload;\n },\n\n /**\n * Returns the metadata for an imageId if it exists.\n * @param type - the type of metadata to enquire about\n * @param imageId - the imageId to enquire about\n * @returns the calibrated pixel spacings for the imageId if it exists, otherwise undefined\n */\n get: (type: string, imageId: string): IImageCalibration => {\n if (type === 'calibratedPixelSpacing') {\n const imageURI = imageIdToURI(imageId);\n return state[imageURI];\n }\n },\n};\n\nexport default metadataProvider;\n","function areNumbersEqualWithTolerance(\n num1: number,\n num2: number,\n tolerance: number\n): boolean {\n return Math.abs(num1 - num2) <= tolerance;\n}\n\nfunction areArraysEqual(\n arr1: ArrayLike,\n arr2: ArrayLike,\n tolerance = 1e-5\n): boolean {\n if (arr1.length !== arr2.length) {\n return false;\n }\n\n for (let i = 0; i < arr1.length; i++) {\n if (!areNumbersEqualWithTolerance(arr1[i], arr2[i], tolerance)) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction isNumberType(value: any): value is number {\n return typeof value === 'number';\n}\n\nfunction isNumberArrayLike(value: any): value is ArrayLike {\n return 'length' in value && typeof value[0] === 'number';\n}\n\n/**\n * Returns whether two values are equal or not, based on epsilon comparison.\n * For array comparison, it does NOT strictly compare them but only compare its values.\n * It can compare array of numbers and also typed array. Otherwise it will just return false.\n *\n * @param v1 - The first value to compare\n * @param v2 - The second value to compare\n * @param tolerance - The acceptable tolerance, the default is 0.00001\n *\n * @returns True if the two values are within the tolerance levels.\n */\nexport default function isEqual(\n v1: ValueType,\n v2: ValueType,\n tolerance = 1e-5\n): boolean {\n // values must be the same type or not null\n if (typeof v1 !== typeof v2 || v1 === null || v2 === null) {\n return false;\n }\n\n if (isNumberType(v1) && isNumberType(v2)) {\n return areNumbersEqualWithTolerance(v1, v2, tolerance);\n }\n\n if (isNumberArrayLike(v1) && isNumberArrayLike(v2)) {\n return areArraysEqual(v1, v2, tolerance);\n }\n\n return false;\n}\n","import type Point3 from '../types/Point3';\n\n/**\n * returns equal if the two vec3s are opposite within the\n * given tolerance in each dimension.\n *\n * @param v1 - The first 3 vector\n * @param v2 - The second 3 vector.\n * @param tolerance - The acceptable tolerance.\n *\n * @returns True if the two values are within the tolerance levels.\n */\nexport default function isOpposite(\n v1: Point3,\n v2: Point3,\n tolerance = 1e-5\n): boolean {\n return (\n Math.abs(v1[0] + v2[0]) < tolerance &&\n Math.abs(v1[1] + v2[1]) < tolerance &&\n Math.abs(v1[2] + v2[2]) < tolerance\n );\n}\n","// GPU blocklist\n// SEE: https://chromium.googlesource.com/chromium/src/+/master/gpu/config/software_rendering_list.json\n// SEE: https://hg.mozilla.org/mozilla-central/raw-file/tip/services/settings/dumps/blocklists/gfx.json\nexport const BLOCKLISTED_GPUS = [\n 'geforce 320m',\n 'geforce 8600',\n 'geforce 8600m gt',\n 'geforce 8800 gs',\n 'geforce 8800 gt',\n 'geforce 9400',\n 'geforce 9400m g',\n 'geforce 9400m',\n 'geforce 9600m gt',\n 'geforce 9600m',\n 'geforce fx go5200',\n 'geforce gt 120',\n 'geforce gt 130',\n 'geforce gt 330m',\n 'geforce gtx 285',\n 'google swiftshader',\n 'intel g41',\n 'intel g45',\n 'intel gma 4500mhd',\n 'intel gma x3100',\n 'intel hd 3000',\n 'intel q45',\n 'legacy',\n 'mali-2',\n 'mali-3',\n 'mali-4',\n 'quadro fx 1500',\n 'quadro fx 4',\n 'quadro fx 5',\n 'radeon hd 2400',\n 'radeon hd 2600',\n 'radeon hd 4670',\n 'radeon hd 4850',\n 'radeon hd 4870',\n 'radeon hd 5670',\n 'radeon hd 5750',\n 'radeon hd 6290',\n 'radeon hd 6300',\n 'radeon hd 6310',\n 'radeon hd 6320',\n 'radeon hd 6490m',\n 'radeon hd 6630m',\n 'radeon hd 6750m',\n 'radeon hd 6770m',\n 'radeon hd 6970m',\n 'sgx 543',\n 'sgx543',\n];\n","const debug = false ? console.log : undefined;\n\nexport function cleanRenderer(renderer: string) {\n debug?.('cleanRenderer', { renderer });\n\n renderer = renderer\n .toLowerCase()\n // Strip off ANGLE() - for example:\n // 'ANGLE (NVIDIA TITAN Xp)' becomes 'NVIDIA TITAN Xp'':\n .replace(/^angle ?\\((.+)\\)*$/, '$1')\n // Strip off [number]gb & strip off direct3d and after - for example:\n // 'Radeon (TM) RX 470 Series Direct3D11 vs_5_0 ps_5_0' becomes\n // 'Radeon (TM) RX 470 Series'\n .replace(/\\s(\\d{1,2}gb|direct3d.+$)|\\(r\\)| \\([^)]+\\)$/g, '')\n // Strip out graphics API. The one Vulkan example we've seen includes\n // the GPU in parens after the Vulkan version so this also keeps that\n // eg. 'vulkan 1.2.175 (nvidia nvidia geforce gtx 970 (0x000013c2))'\n // becomes 'nvidia nvidia geforce gtx 970 (0x000013c2)'\n // `OpenGL 4.5.0` gets removed all together\n .replace(/(?:vulkan|opengl) \\d+\\.\\d+(?:\\.\\d+)?(?: \\((.*)\\))?/, '$1')\n\n debug?.('cleanRenderer - renderer cleaned to', { renderer });\n\n return renderer;\n};\n","/**\r\n * The following defined constants and descriptions are directly ported from https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/Constants\r\n *\r\n * Any copyright is dedicated to the Public Domain. http://creativecommons.org/publicdomain/zero/1.0/\r\n *\r\n * Contributors\r\n *\r\n * See: https://developer.mozilla.org/en-US/profiles/Sheppy\r\n * See: https://developer.mozilla.org/en-US/profiles/fscholz\r\n * See: https://developer.mozilla.org/en-US/profiles/AtiX\r\n * See: https://developer.mozilla.org/en-US/profiles/Sebastianz\r\n *\r\n * These constants are defined on the WebGLRenderingContext / WebGL2RenderingContext interface\r\n */\r\n// Clearing buffers\r\n// Constants passed to WebGLRenderingContext.clear() to clear buffer masks\r\n/**\r\n * Passed to clear to clear the current depth buffer\r\n * @constant {number}\r\n */\r\nconst GL_DEPTH_BUFFER_BIT = 0x00000100;\r\n/**\r\n * Passed to clear to clear the current stencil buffer\r\n * @constant {number}\r\n */\r\nconst GL_STENCIL_BUFFER_BIT = 0x00000400;\r\n/**\r\n * Passed to clear to clear the current color buffer\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_BUFFER_BIT = 0x00004000;\r\n// Rendering primitives\r\n// Constants passed to WebGLRenderingContext.drawElements() or WebGLRenderingContext.drawArrays() to specify what kind of primitive to render\r\n/**\r\n * Passed to drawElements or drawArrays to draw single points\r\n * @constant {number}\r\n */\r\nconst GL_POINTS = 0x0000;\r\n/**\r\n * Passed to drawElements or drawArrays to draw lines. Each vertex connects to the one after it\r\n * @constant {number}\r\n */\r\nconst GL_LINES = 0x0001;\r\n/**\r\n * Passed to drawElements or drawArrays to draw lines. Each set of two vertices is treated as a separate line segment\r\n * @constant {number}\r\n */\r\nconst GL_LINE_LOOP = 0x0002;\r\n/**\r\n * Passed to drawElements or drawArrays to draw a connected group of line segments from the first vertex to the last\r\n * @constant {number}\r\n */\r\nconst GL_LINE_STRIP = 0x0003;\r\n/**\r\n * Passed to drawElements or drawArrays to draw triangles. Each set of three vertices creates a separate triangle\r\n * @constant {number}\r\n */\r\nconst GL_TRIANGLES = 0x0004;\r\n/**\r\n * Passed to drawElements or drawArrays to draw a connected group of triangles\r\n * @constant {number}\r\n */\r\nconst GL_TRIANGLE_STRIP = 0x0005;\r\n/**\r\n * Passed to drawElements or drawArrays to draw a connected group of triangles. Each vertex connects to the previous and the first vertex in the fan\r\n * @constant {number}\r\n */\r\nconst GL_TRIANGLE_FAN = 0x0006;\r\n// Blending modes\r\n// Constants passed to WebGLRenderingContext.blendFunc() or WebGLRenderingContext.blendFuncSeparate() to specify the blending mode (for both, RBG and alpha, or separately)\r\n/**\r\n * Passed to blendFunc or blendFuncSeparate to turn off a component\r\n * @constant {number}\r\n */\r\nconst GL_ZERO = 0;\r\n/**\r\n * Passed to blendFunc or blendFuncSeparate to turn on a component\r\n * @constant {number}\r\n */\r\nconst GL_ONE = 1;\r\n/**\r\n * Passed to blendFunc or blendFuncSeparate to multiply a component by the source elements color\r\n * @constant {number}\r\n */\r\nconst GL_SRC_COLOR = 0x0300;\r\n/**\r\n * Passed to blendFunc or blendFuncSeparate to multiply a component by one minus the source elements color\r\n * @constant {number}\r\n */\r\nconst GL_ONE_MINUS_SRC_COLOR = 0x0301;\r\n/**\r\n * Passed to blendFunc or blendFuncSeparate to multiply a component by the source's alpha\r\n * @constant {number}\r\n */\r\nconst GL_SRC_ALPHA = 0x0302;\r\n/**\r\n * Passed to blendFunc or blendFuncSeparate to multiply a component by one minus the source's alpha\r\n * @constant {number}\r\n */\r\nconst GL_ONE_MINUS_SRC_ALPHA = 0x0303;\r\n/**\r\n * Passed to blendFunc or blendFuncSeparate to multiply a component by the destination's alpha\r\n * @constant {number}\r\n */\r\nconst GL_DST_ALPHA = 0x0304;\r\n/**\r\n * Passed to blendFunc or blendFuncSeparate to multiply a component by one minus the destination's alpha\r\n * @constant {number}\r\n */\r\nconst GL_ONE_MINUS_DST_ALPHA = 0x0305;\r\n/**\r\n * Passed to blendFunc or blendFuncSeparate to multiply a component by the destination's color\r\n * @constant {number}\r\n */\r\nconst GL_DST_COLOR = 0x0306;\r\n/**\r\n * Passed to blendFunc or blendFuncSeparate to multiply a component by one minus the destination's color\r\n * @constant {number}\r\n */\r\nconst GL_ONE_MINUS_DST_COLOR = 0x0307;\r\n/**\r\n * Passed to blendFunc or blendFuncSeparate to multiply a component by the minimum of source's alpha or one minus the destination's alpha\r\n * @constant {number}\r\n */\r\nconst GL_SRC_ALPHA_SATURATE = 0x0308;\r\n/**\r\n * Passed to blendFunc or blendFuncSeparate to specify a constant color blend function\r\n * @constant {number}\r\n */\r\nconst GL_CONSTANT_COLOR = 0x8001;\r\n/**\r\n * Passed to blendFunc or blendFuncSeparate to specify one minus a constant color blend function\r\n * @constant {number}\r\n */\r\nconst GL_ONE_MINUS_CONSTANT_COLOR = 0x8002;\r\n/**\r\n * Passed to blendFunc or blendFuncSeparate to specify a constant alpha blend function\r\n * @constant {number}\r\n */\r\nconst GL_CONSTANT_ALPHA = 0x8003;\r\n/**\r\n * Passed to blendFunc or blendFuncSeparate to specify one minus a constant alpha blend function\r\n * @constant {number}\r\n */\r\nconst GL_ONE_MINUS_CONSTANT_ALPHA = 0x8004;\r\n// Blending equations\r\n// Constants passed to WebGLRenderingContext.blendEquation() or WebGLRenderingContext.blendEquationSeparate() to control how the blending is calculated (for both, RBG and alpha, or separately)\r\n/**\r\n * Passed to blendEquation or blendEquationSeparate to set an addition blend function\r\n * @constant {number}\r\n */\r\nconst GL_FUNC_ADD = 0x8006;\r\n/**\r\n * Passed to blendEquation or blendEquationSeparate to specify a subtraction blend function (source - destination)\r\n * @constant {number}\r\n */\r\nconst GL_FUNC_SUBSTRACT = 0x800a;\r\n/**\r\n * Passed to blendEquation or blendEquationSeparate to specify a reverse subtraction blend function (destination - source)\r\n * @constant {number}\r\n */\r\nconst GL_FUNC_REVERSE_SUBTRACT = 0x800b;\r\n// Getting GL parameter information\r\n// Constants passed to WebGLRenderingContext.getParameter() to specify what information to return\r\n/**\r\n * Passed to getParameter to get the current RGB blend function\r\n * @constant {number}\r\n */\r\nconst GL_BLEND_EQUATION = 0x8009;\r\n/**\r\n * Passed to getParameter to get the current RGB blend function. Same as BLEND_EQUATION\r\n * @constant {number}\r\n */\r\nconst GL_BLEND_EQUATION_RGB = 0x8009;\r\n/**\r\n * Passed to getParameter to get the current alpha blend function. Same as BLEND_EQUATION\r\n * @constant {number}\r\n */\r\nconst GL_BLEND_EQUATION_ALPHA = 0x883d;\r\n/**\r\n * Passed to getParameter to get the current destination RGB blend function\r\n * @constant {number}\r\n */\r\nconst GL_BLEND_DST_RGB = 0x80c8;\r\n/**\r\n * Passed to getParameter to get the current source RGB blend function\r\n * @constant {number}\r\n */\r\nconst GL_BLEND_SRC_RGB = 0x80c9;\r\n/**\r\n * Passed to getParameter to get the current destination alpha blend function\r\n * @constant {number}\r\n */\r\nconst GL_BLEND_DST_ALPHA = 0x80ca;\r\n/**\r\n * Passed to getParameter to get the current source alpha blend function\r\n * @constant {number}\r\n */\r\nconst GL_BLEND_SRC_ALPHA = 0x80cb;\r\n/**\r\n * Passed to getParameter to return a the current blend color\r\n * @constant {number}\r\n */\r\nconst GL_BLEND_COLOR = 0x8005;\r\n/**\r\n * Passed to getParameter to get the array buffer binding\r\n * @constant {number}\r\n */\r\nconst GL_ARRAY_BUFFER_BINDING = 0x8894;\r\n/**\r\n * Passed to getParameter to get the current element array buffer\r\n * @constant {number}\r\n */\r\nconst GL_ELEMENT_ARRAY_BUFFER_BINDING = 0x8895;\r\n/**\r\n * Passed to getParameter to get the current lineWidth (set by the lineWidth method)\r\n * @constant {number}\r\n */\r\nconst GL_LINE_WIDTH = 0x0b21;\r\n/**\r\n * Passed to getParameter to get the current size of a point drawn with gl.POINTS\r\n * @constant {number}\r\n */\r\nconst GL_ALIASED_POINT_SIZE_RANGE = 0x846d;\r\n/**\r\n * Passed to getParameter to get the range of available widths for a line. Returns a length-2 array with the lo value at 0, and hight at 1\r\n * @constant {number}\r\n */\r\nconst GL_ALIASED_LINE_WIDTH_RANGE = 0x846e;\r\n/**\r\n * Passed to getParameter to get the current value of cullFace. Should return FRONT, BACK, or FRONT_AND_BACK\r\n * @constant {number}\r\n */\r\nconst GL_CULL_FACE_MODE = 0x0b45;\r\n/**\r\n * Passed to getParameter to determine the current value of frontFace. Should return CW or CCW\r\n * @constant {number}\r\n */\r\nconst GL_FRONT_FACE = 0x0b46;\r\n/**\r\n * Passed to getParameter to return a length-2 array of floats giving the current depth range\r\n * @constant {number}\r\n */\r\nconst GL_DEPTH_RANGE = 0x0b70;\r\n/**\r\n * Passed to getParameter to determine if the depth write mask is enabled\r\n * @constant {number}\r\n */\r\nconst GL_DEPTH_WRITEMASK = 0x0b72;\r\n/**\r\n * Passed to getParameter to determine the current depth clear value\r\n * @constant {number}\r\n */\r\nconst GL_DEPTH_CLEAR_VALUE = 0x0b73;\r\n/**\r\n * Passed to getParameter to get the current depth function. Returns NEVER, ALWAYS, LESS, EQUAL, LEQUAL, GREATER, GEQUAL, or NOTEQUAL\r\n * @constant {number}\r\n */\r\nconst GL_DEPTH_FUNC = 0x0b74;\r\n/**\r\n * Passed to getParameter to get the value the stencil will be cleared to\r\n * @constant {number}\r\n */\r\nconst GL_STENCIL_CLEAR_VALUE = 0x0b91;\r\n/**\r\n * Passed to getParameter to get the current stencil function. Returns NEVER, ALWAYS, LESS, EQUAL, LEQUAL, GREATER, GEQUAL, or NOTEQUAL\r\n * @constant {number}\r\n */\r\nconst GL_STENCIL_FUNC = 0x0b92;\r\n/**\r\n * Passed to getParameter to get the current stencil fail function. Should return KEEP, REPLACE, INCR, DECR, INVERT, INCR_WRAP, or DECR_WRAP\r\n * @constant {number}\r\n */\r\nconst GL_STENCIL_FAIL = 0x0b94;\r\n/**\r\n * Passed to getParameter to get the current stencil fail function should the depth buffer test fail. Should return KEEP, REPLACE, INCR, DECR, INVERT, INCR_WRAP, or DECR_WRAP\r\n * @constant {number}\r\n */\r\nconst GL_STENCIL_PASS_DEPTH_FAIL = 0x0b95;\r\n/**\r\n * Passed to getParameter to get the current stencil fail function should the depth buffer test pass. Should return KEEP, REPLACE, INCR, DECR, INVERT, INCR_WRAP, or DECR_WRAP\r\n * @constant {number}\r\n */\r\nconst GL_STENCIL_PASS_DEPTH_PASS = 0x0b96;\r\n/**\r\n * Passed to getParameter to get the reference value used for stencil tests\r\n * @constant {number}\r\n */\r\nconst GL_STENCIL_REF = 0x0b97;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_STENCIL_VALUE_MASK = 0x0b93;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_STENCIL_WRITEMASK = 0x0b98;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_STENCIL_BACK_FUNC = 0x8800;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_STENCIL_BACK_FAIL = 0x8801;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_STENCIL_BACK_PASS_DEPTH_FAIL = 0x8802;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_STENCIL_BACK_PASS_DEPTH_PASS = 0x8803;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_STENCIL_BACK_REF = 0x8ca3;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_STENCIL_BACK_VALUE_MASK = 0x8ca4;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_STENCIL_BACK_WRITEMASK = 0x8ca5;\r\n/**\r\n * Returns an Int32Array with four elements for the current viewport dimensions\r\n * @constant {number}\r\n */\r\nconst GL_VIEWPORT = 0x0ba2;\r\n/**\r\n * Returns an Int32Array with four elements for the current scissor box dimensions\r\n * @constant {number}\r\n */\r\nconst GL_SCISSOR_BOX = 0x0c10;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_CLEAR_VALUE = 0x0c22;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_WRITEMASK = 0x0c23;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNPACK_ALIGNMENT = 0x0cf5;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_PACK_ALIGNMENT = 0x0d05;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_TEXTURE_SIZE = 0x0d33;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_VIEWPORT_DIMS = 0x0d3a;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_SUBPIXEL_BITS = 0x0d50;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RED_BITS = 0x0d52;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_GREEN_BITS = 0x0d53;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_BLUE_BITS = 0x0d54;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_ALPHA_BITS = 0x0d55;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DEPTH_BITS = 0x0d56;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_STENCIL_BITS = 0x0d57;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_POLYGON_OFFSET_UNITS = 0x2a00;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_POLYGON_OFFSET_FACTOR = 0x8038;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE_BINDING_2D = 0x8069;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_SAMPLE_BUFFERS = 0x80a8;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_SAMPLES = 0x80a9;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_SAMPLE_COVERAGE_VALUE = 0x80aa;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_SAMPLE_COVERAGE_INVERT = 0x80ab;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_TEXTURE_FORMATS = 0x86a3;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_VENDOR = 0x1f00;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RENDERER = 0x1f01;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_VERSION = 0x1f02;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_IMPLEMENTATION_COLOR_READ_TYPE = 0x8b9a;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_IMPLEMENTATION_COLOR_READ_FORMAT = 0x8b9b;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_BROWSER_DEFAULT_WEBGL = 0x9244;\r\n// Buffers\r\n// Constants passed to WebGLRenderingContext.bufferData(), WebGLRenderingContext.bufferSubData(), WebGLRenderingContext.bindBuffer(), or WebGLRenderingContext.getBufferParameter()\r\n/**\r\n * Passed to bufferData as a hint about whether the contents of the buffer are likely to be used often and not change often\r\n * @constant {number}\r\n */\r\nconst GL_STATIC_DRAW = 0x88e4;\r\n/**\r\n * Passed to bufferData as a hint about whether the contents of the buffer are likely to not be used often\r\n * @constant {number}\r\n */\r\nconst GL_STREAM_DRAW = 0x88e0;\r\n/**\r\n * Passed to bufferData as a hint about whether the contents of the buffer are likely to be used often and change often\r\n * @constant {number}\r\n */\r\nconst GL_DYNAMIC_DRAW = 0x88e8;\r\n/**\r\n * Passed to bindBuffer or bufferData to specify the type of buffer being used\r\n * @constant {number}\r\n */\r\nconst GL_ARRAY_BUFFER = 0x8892;\r\n/**\r\n * Passed to bindBuffer or bufferData to specify the type of buffer being used\r\n * @constant {number}\r\n */\r\nconst GL_ELEMENT_ARRAY_BUFFER = 0x8893;\r\n/**\r\n * Passed to getBufferParameter to get a buffer's size\r\n * @constant {number}\r\n */\r\nconst GL_BUFFER_SIZE = 0x8764;\r\n/**\r\n * Passed to getBufferParameter to get the hint for the buffer passed in when it was created\r\n * @constant {number}\r\n */\r\nconst GL_BUFFER_USAGE = 0x8765;\r\n// Vertex attributes\r\n// Constants passed to WebGLRenderingContext.getVertexAttrib()\r\n/**\r\n * Passed to getVertexAttrib to read back the current vertex attribute\r\n * @constant {number}\r\n */\r\nconst GL_CURRENT_VERTEX_ATTRIB = 0x8626;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_VERTEX_ATTRIB_ARRAY_ENABLED = 0x8622;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_VERTEX_ATTRIB_ARRAY_SIZE = 0x8623;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_VERTEX_ATTRIB_ARRAY_STRIDE = 0x8624;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_VERTEX_ATTRIB_ARRAY_TYPE = 0x8625;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_VERTEX_ATTRIB_ARRAY_NORMALIZED = 0x886a;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_VERTEX_ATTRIB_ARRAY_POINTER = 0x8645;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = 0x889f;\r\n// Culling\r\n// Constants passed to WebGLRenderingContext.cullFace()\r\n/**\r\n * Passed to enable/disable to turn on/off culling. Can also be used with getParameter to find the current culling method\r\n * @constant {number}\r\n */\r\nconst GL_CULL_FACE = 0x0b44;\r\n/**\r\n * Passed to cullFace to specify that only front faces should be culled\r\n * @constant {number}\r\n */\r\nconst GL_FRONT = 0x0404;\r\n/**\r\n * Passed to cullFace to specify that only back faces should be culled\r\n * @constant {number}\r\n */\r\nconst GL_BACK = 0x0405;\r\n/**\r\n * Passed to cullFace to specify that front and back faces should be culled\r\n * @constant {number}\r\n */\r\nconst GL_FRONT_AND_BACK = 0x0408;\r\n// Enabling and disabling\r\n// Constants passed to WebGLRenderingContext.enable() or WebGLRenderingContext.disable()\r\n/**\r\n * Passed to enable/disable to turn on/off blending. Can also be used with getParameter to find the current blending method\r\n * @constant {number}\r\n */\r\nconst GL_BLEND = 0x0be2;\r\n/**\r\n * Passed to enable/disable to turn on/off the depth test. Can also be used with getParameter to query the depth test\r\n * @constant {number}\r\n */\r\nconst GL_DEPTH_TEST = 0x0b71;\r\n/**\r\n * Passed to enable/disable to turn on/off dithering. Can also be used with getParameter to find the current dithering method\r\n * @constant {number}\r\n */\r\nconst GL_DITHER = 0x0bd0;\r\n/**\r\n * Passed to enable/disable to turn on/off the polygon offset. Useful for rendering hidden-line images, decals, and or solids with highlighted edges. Can also be used with getParameter to query the scissor test\r\n * @constant {number}\r\n */\r\nconst GL_POLYGON_OFFSET_FILL = 0x8037;\r\n/**\r\n * Passed to enable/disable to turn on/off the alpha to coverage. Used in multi-sampling alpha channels\r\n * @constant {number}\r\n */\r\nconst GL_SAMPLE_ALPHA_TO_COVERAGE = 0x809e;\r\n/**\r\n * Passed to enable/disable to turn on/off the sample coverage. Used in multi-sampling\r\n * @constant {number}\r\n */\r\nconst GL_SAMPLE_COVERAGE = 0x80a0;\r\n/**\r\n * Passed to enable/disable to turn on/off the scissor test. Can also be used with getParameter to query the scissor test\r\n * @constant {number}\r\n */\r\nconst GL_SCISSOR_TEST = 0x0c11;\r\n/**\r\n * Passed to enable/disable to turn on/off the stencil test. Can also be used with getParameter to query the stencil test\r\n * @constant {number}\r\n */\r\nconst GL_STENCIL_TEST = 0x0b90;\r\n// Errors\r\n// Constants returned from WebGLRenderingContext.getError()\r\n/**\r\n * Returned from getError\r\n * @constant {number}\r\n */\r\nconst GL_NO_ERROR = 0;\r\n/**\r\n * Returned from getError\r\n * @constant {number}\r\n */\r\nconst GL_INVALID_ENUM = 0x0500;\r\n/**\r\n * Returned from getError\r\n * @constant {number}\r\n */\r\nconst GL_INVALID_VALUE = 0x0501;\r\n/**\r\n * Returned from getError\r\n * @constant {number}\r\n */\r\nconst GL_INVALID_OPERATION = 0x0502;\r\n/**\r\n * Returned from getError\r\n * @constant {number}\r\n */\r\nconst GL_OUT_OF_MEMORY = 0x0505;\r\n/**\r\n * Returned from getError\r\n * @constant {number}\r\n */\r\nconst GL_CONTEXT_LOST_WEBGL = 0x9242;\r\n// Front face directions\r\n// Constants passed to WebGLRenderingContext.frontFace()\r\n/**\r\n * Passed to frontFace to specify the front face of a polygon is drawn in the clockwise direction,\r\n * @constant {number}\r\n */\r\nconst GL_CW = 0x0900;\r\n/**\r\n * Passed to frontFace to specify the front face of a polygon is drawn in the counter clockwise direction\r\n * @constant {number}\r\n */\r\nconst GL_CCW = 0x0901;\r\n// Hints\r\n// Constants passed to WebGLRenderingContext.hint()\r\n/**\r\n * There is no preference for this behavior\r\n * @constant {number}\r\n */\r\nconst GL_DONT_CARE = 0x1100;\r\n/**\r\n * The most efficient behavior should be used\r\n * @constant {number}\r\n */\r\nconst GL_FASTEST = 0x1101;\r\n/**\r\n * The most correct or the highest quality option should be used\r\n * @constant {number}\r\n */\r\nconst GL_NICEST = 0x1102;\r\n/**\r\n * Hint for the quality of filtering when generating mipmap images with WebGLRenderingContext.generateMipmap()\r\n * @constant {number}\r\n */\r\nconst GL_GENERATE_MIPMAP_HINT = 0x8192;\r\n// Data types\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_BYTE = 0x1400;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNSIGNED_BYTE = 0x1401;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_SHORT = 0x1402;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNSIGNED_SHORT = 0x1403;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_INT = 0x1404;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNSIGNED_INT = 0x1405;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FLOAT = 0x1406;\r\n// Pixel formats\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DEPTH_COMPONENT = 0x1902;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_ALPHA = 0x1906;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RGB = 0x1907;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RGBA = 0x1908;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_LUMINANCE = 0x1909;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_LUMINANCE_ALPHA = 0x190a;\r\n// Pixel types\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNSIGNED_SHORT_4_4_4_4 = 0x8033;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNSIGNED_SHORT_5_5_5_1 = 0x8034;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNSIGNED_SHORT_5_6_5 = 0x8363;\r\n// Shaders\r\n// Constants passed to WebGLRenderingContext.getShaderParameter()\r\n/**\r\n * Passed to createShader to define a fragment shader\r\n * @constant {number}\r\n */\r\nconst GL_FRAGMENT_SHADER = 0x8b30;\r\n/**\r\n * Passed to createShader to define a vertex shader\r\n * @constant {number}\r\n */\r\nconst GL_VERTEX_SHADER = 0x8b31;\r\n/**\r\n * Passed to getShaderParamter to get the status of the compilation. Returns false if the shader was not compiled. You can then query getShaderInfoLog to find the exact error\r\n * @constant {number}\r\n */\r\nconst GL_COMPILE_STATUS = 0x8b81;\r\n/**\r\n * Passed to getShaderParamter to determine if a shader was deleted via deleteShader. Returns true if it was, false otherwise\r\n * @constant {number}\r\n */\r\nconst GL_DELETE_STATUS = 0x8b80;\r\n/**\r\n * Passed to getProgramParameter after calling linkProgram to determine if a program was linked correctly. Returns false if there were errors. Use getProgramInfoLog to find the exact error\r\n * @constant {number}\r\n */\r\nconst GL_LINK_STATUS = 0x8b82;\r\n/**\r\n * Passed to getProgramParameter after calling validateProgram to determine if it is valid. Returns false if errors were found\r\n * @constant {number}\r\n */\r\nconst GL_VALIDATE_STATUS = 0x8b83;\r\n/**\r\n * Passed to getProgramParameter after calling attachShader to determine if the shader was attached correctly. Returns false if errors occurred\r\n * @constant {number}\r\n */\r\nconst GL_ATTACHED_SHADERS = 0x8b85;\r\n/**\r\n * Passed to getProgramParameter to get the number of attributes active in a program\r\n * @constant {number}\r\n */\r\nconst GL_ACTIVE_ATTRIBUTES = 0x8b89;\r\n/**\r\n * Passed to getProgramParamter to get the number of uniforms active in a program\r\n * @constant {number}\r\n */\r\nconst GL_ACTIVE_UNIFORMS = 0x8b86;\r\n/**\r\n * The maximum number of entries possible in the vertex attribute list\r\n * @constant {number}\r\n */\r\nconst GL_MAX_VERTEX_ATTRIBS = 0x8869;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_VERTEX_UNIFORM_VECTORS = 0x8dfb;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_VARYING_VECTORS = 0x8dfc;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS = 0x8b4d;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS = 0x8b4c;\r\n/**\r\n * Implementation dependent number of maximum texture units. At least 8\r\n * @constant {number}\r\n */\r\nconst GL_MAX_TEXTURE_IMAGE_UNITS = 0x8872;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_FRAGMENT_UNIFORM_VECTORS = 0x8dfd;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_SHADER_TYPE = 0x8b4f;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_SHADING_LANGUAGE_VERSION = 0x8b8c;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_CURRENT_PROGRAM = 0x8b8d;\r\n// Depth or stencil tests\r\n// Constants passed to WebGLRenderingContext.stencilFunc()\r\n/**\r\n * Passed to depthFunction or stencilFunction to specify depth or stencil tests will never pass. i.e. Nothing will be drawn\r\n * @constant {number}\r\n */\r\nconst GL_NEVER = 0x0200;\r\n/**\r\n * Passed to depthFunction or stencilFunction to specify depth or stencil tests will always pass. i.e. Pixels will be drawn in the order they are drawn\r\n * @constant {number}\r\n */\r\nconst GL_ALWAYS = 0x0207;\r\n/**\r\n * Passed to depthFunction or stencilFunction to specify depth or stencil tests will pass if the new depth value is less than the stored value\r\n * @constant {number}\r\n */\r\nconst GL_LESS = 0x0201;\r\n/**\r\n * Passed to depthFunction or stencilFunction to specify depth or stencil tests will pass if the new depth value is equals to the stored value\r\n * @constant {number}\r\n */\r\nconst GL_EQUAL = 0x0202;\r\n/**\r\n * Passed to depthFunction or stencilFunction to specify depth or stencil tests will pass if the new depth value is less than or equal to the stored value\r\n * @constant {number}\r\n */\r\nconst GL_LEQUAL = 0x0203;\r\n/**\r\n * Passed to depthFunction or stencilFunction to specify depth or stencil tests will pass if the new depth value is greater than the stored value\r\n * @constant {number}\r\n */\r\nconst GL_GREATER = 0x0204;\r\n/**\r\n * Passed to depthFunction or stencilFunction to specify depth or stencil tests will pass if the new depth value is greater than or equal to the stored value\r\n * @constant {number}\r\n */\r\nconst GL_GEQUAL = 0x0206;\r\n/**\r\n * Passed to depthFunction or stencilFunction to specify depth or stencil tests will pass if the new depth value is not equal to the stored value\r\n * @constant {number}\r\n */\r\nconst GL_NOTEQUAL = 0x0205;\r\n// Stencil actions\r\n// Constants passed to WebGLRenderingContext.stencilOp()\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_KEEP = 0x1e00;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_REPLACE = 0x1e01;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_INCR = 0x1e02;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DECR = 0x1e03;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_INVERT = 0x150a;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_INCR_WRAP = 0x8507;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DECR_WRAP = 0x8508;\r\n// Textures\r\n// Constants passed to WebGLRenderingContext.texParameteri(), WebGLRenderingContext.texParameterf(), WebGLRenderingContext.bindTexture(), WebGLRenderingContext.texImage2D(), and others\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_NEAREST = 0x2600;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_LINEAR = 0x2601;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_NEAREST_MIPMAP_NEAREST = 0x2700;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_LINEAR_MIPMAP_NEAREST = 0x2701;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_NEAREST_MIPMAP_LINEAR = 0x2702;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_LINEAR_MIPMAP_LINEAR = 0x2703;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE_MAG_FILTER = 0x2800;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE_MIN_FILTER = 0x2801;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE_WRAP_S = 0x2802;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE_WRAP_T = 0x2803;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE_2D = 0x0de1;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE = 0x1702;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE_CUBE_MAP = 0x8513;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE_BINDING_CUBE_MAP = 0x8514;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE_CUBE_MAP_POSITIVE_X = 0x8515;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE_CUBE_MAP_NEGATIVE_X = 0x8516;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE_CUBE_MAP_POSITIVE_Y = 0x8517;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE_CUBE_MAP_NEGATIVE_Y = 0x8518;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE_CUBE_MAP_POSITIVE_Z = 0x8519;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE_CUBE_MAP_NEGATIVE_Z = 0x851a;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_CUBE_MAP_TEXTURE_SIZE = 0x851c;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE0 = 0x84c0;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE1 = 0x84c1;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE2 = 0x84c2;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE3 = 0x84c3;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE4 = 0x84c4;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE5 = 0x84c5;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE6 = 0x84c6;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE7 = 0x84c7;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE8 = 0x84c8;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE9 = 0x84c9;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE10 = 0x84ca;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE11 = 0x84cb;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE12 = 0x84cc;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE13 = 0x84cd;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE14 = 0x84ce;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE15 = 0x84cf;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE16 = 0x84d0;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE17 = 0x84d1;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE18 = 0x84d2;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE19 = 0x84d3;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE20 = 0x84d4;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE21 = 0x84d5;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE22 = 0x84d6;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE23 = 0x84d7;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE24 = 0x84d8;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE25 = 0x84d9;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE26 = 0x84da;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE27 = 0x84db;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE28 = 0x84dc;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE29 = 0x84dd;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE30 = 0x84de;\r\n/**\r\n * A texture unit\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE31 = 0x84df;\r\n/**\r\n * The current active texture unit\r\n * @constant {number}\r\n */\r\nconst GL_ACTIVE_TEXTURE = 0x84e0;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_REPEAT = 0x2901;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_CLAMP_TO_EDGE = 0x812f;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MIRRORED_REPEAT = 0x8370;\r\n// Uniform types\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FLOAT_VEC2 = 0x8b50;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FLOAT_VEC3 = 0x8b51;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FLOAT_VEC4 = 0x8b52;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_INT_VEC2 = 0x8b53;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_INT_VEC3 = 0x8b54;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_INT_VEC4 = 0x8b55;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_BOOL = 0x8b56;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_BOOL_VEC2 = 0x8b57;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_BOOL_VEC3 = 0x8b58;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_BOOL_VEC4 = 0x8b59;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FLOAT_MAT2 = 0x8b5a;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FLOAT_MAT3 = 0x8b5b;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FLOAT_MAT4 = 0x8b5c;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_SAMPLER_2D = 0x8b5e;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_SAMPLER_CUBE = 0x8b60;\r\n// Shader precision-specified types\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_LOW_FLOAT = 0x8df0;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MEDIUM_FLOAT = 0x8df1;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_HIGH_FLOAT = 0x8df2;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_LOW_INT = 0x8df3;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MEDIUM_INT = 0x8df4;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_HIGH_INT = 0x8df5;\r\n// Framebuffers and renderbuffers\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FRAMEBUFFER = 0x8d40;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RENDERBUFFER = 0x8d41;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RGBA4 = 0x8056;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RGB5_A1 = 0x8057;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RGB565 = 0x8d62;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DEPTH_COMPONENT16 = 0x81a5;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_STENCIL_INDEX = 0x1901;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_STENCIL_INDEX8 = 0x8d48;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DEPTH_STENCIL = 0x84f9;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RENDERBUFFER_WIDTH = 0x8d42;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RENDERBUFFER_HEIGHT = 0x8d43;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RENDERBUFFER_INTERNAL_FORMAT = 0x8d44;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RENDERBUFFER_RED_SIZE = 0x8d50;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RENDERBUFFER_GREEN_SIZE = 0x8d51;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RENDERBUFFER_BLUE_SIZE = 0x8d52;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RENDERBUFFER_ALPHA_SIZE = 0x8d53;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RENDERBUFFER_DEPTH_SIZE = 0x8d54;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RENDERBUFFER_STENCIL_SIZE = 0x8d55;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE = 0x8cd0;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME = 0x8cd1;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL = 0x8cd2;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = 0x8cd3;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT0 = 0x8ce0;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DEPTH_ATTACHMENT = 0x8d00;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_STENCIL_ATTACHMENT = 0x8d20;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DEPTH_STENCIL_ATTACHMENT = 0x821a;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_NONE = 0;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FRAMEBUFFER_COMPLETE = 0x8cd5;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT = 0x8cd6;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = 0x8cd7;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS = 0x8cd9;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FRAMEBUFFER_UNSUPPORTED = 0x8cdd;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FRAMEBUFFER_BINDING = 0x8ca6;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RENDERBUFFER_BINDING = 0x8ca7;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_RENDERBUFFER_SIZE = 0x84e8;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_INVALID_FRAMEBUFFER_OPERATION = 0x0506;\r\n// Pixel storage modes\r\n// Constants passed to WebGLRenderingContext.pixelStorei()\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNPACK_FLIP_Y_WEBGL = 0x9240;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNPACK_PREMULTIPLY_ALPHA_WEBGL = 0x9241;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNPACK_COLORSPACE_CONVERSION_WEBGL = 0x9243;\r\n// Additional constants defined WebGL 2\r\n// These constants are defined on the WebGL2RenderingContext interface. All WebGL 1 constants are also available in a WebGL 2 context\r\n// Getting GL parameter information\r\n// Constants passed to WebGLRenderingContext.getParameter() to specify what information to return\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_READ_BUFFER = 0x0c02;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNPACK_ROW_LENGTH = 0x0cf2;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNPACK_SKIP_ROWS = 0x0cf3;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNPACK_SKIP_PIXELS = 0x0cf4;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_PACK_ROW_LENGTH = 0x0d02;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_PACK_SKIP_ROWS = 0x0d03;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_PACK_SKIP_PIXELS = 0x0d04;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE_BINDING_3D = 0x806a;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNPACK_SKIP_IMAGES = 0x806d;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNPACK_IMAGE_HEIGHT = 0x806e;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_3D_TEXTURE_SIZE = 0x8073;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_ELEMENTS_VERTICES = 0x80e8;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_ELEMENTS_INDICES = 0x80e9;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_TEXTURE_LOD_BIAS = 0x84fd;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_FRAGMENT_UNIFORM_COMPONENTS = 0x8b49;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_VERTEX_UNIFORM_COMPONENTS = 0x8b4a;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_ARRAY_TEXTURE_LAYERS = 0x88ff;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MIN_PROGRAM_TEXEL_OFFSET = 0x8904;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_PROGRAM_TEXEL_OFFSET = 0x8905;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_VARYING_COMPONENTS = 0x8b4b;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FRAGMENT_SHADER_DERIVATIVE_HINT = 0x8b8b;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RASTERIZER_DISCARD = 0x8c89;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_VERTEX_ARRAY_BINDING = 0x85b5;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_VERTEX_OUTPUT_COMPONENTS = 0x9122;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_FRAGMENT_INPUT_COMPONENTS = 0x9125;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_SERVER_WAIT_TIMEOUT = 0x9111;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_ELEMENT_INDEX = 0x8d6b;\r\n// Textures\r\n// Constants passed to WebGLRenderingContext.texParameteri(), WebGLRenderingContext.texParameterf(), WebGLRenderingContext.bindTexture(), WebGLRenderingContext.texImage2D(), and others\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RED = 0x1903;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RGB8 = 0x8051;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RGBA8 = 0x8058;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RGB10_A2 = 0x8059;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE_3D = 0x806f;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE_WRAP_R = 0x8072;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE_MIN_LOD = 0x813a;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE_MAX_LOD = 0x813b;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE_BASE_LEVEL = 0x813c;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE_MAX_LEVEL = 0x813d;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE_COMPARE_MODE = 0x884c;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE_COMPARE_FUNC = 0x884d;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_SRGB = 0x8c40;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_SRGB8 = 0x8c41;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_SRGB8_ALPHA8 = 0x8c43;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_COMPARE_REF_TO_TEXTURE = 0x884e;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RGBA32F = 0x8814;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RGB32F = 0x8815;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RGBA16F = 0x881a;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RGB16F = 0x881b;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE_2D_ARRAY = 0x8c1a;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE_BINDING_2D_ARRAY = 0x8c1d;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_R11F_G11F_B10F = 0x8c3a;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RGB9_E5 = 0x8c3d;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RGBA32UI = 0x8d70;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RGB32UI = 0x8d71;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RGBA16UI = 0x8d76;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RGB16UI = 0x8d77;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RGBA8UI = 0x8d7c;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RGB8UI = 0x8d7d;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RGBA32I = 0x8d82;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RGB32I = 0x8d83;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RGBA16I = 0x8d88;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RGB16I = 0x8d89;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RGBA8I = 0x8d8e;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RGB8I = 0x8d8f;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RED_INTEGER = 0x8d94;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RGB_INTEGER = 0x8d98;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RGBA_INTEGER = 0x8d99;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_R8 = 0x8229;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RG8 = 0x822b;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_R16F = 0x822d;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_R32F = 0x822e;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RG16F = 0x822f;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RG32F = 0x8230;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_R8I = 0x8231;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_R8UI = 0x8232;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_R16I = 0x8233;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_R16UI = 0x8234;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_R32I = 0x8235;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_R32UI = 0x8236;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RG8I = 0x8237;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RG8UI = 0x8238;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RG16I = 0x8239;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RG16UI = 0x823a;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RG32I = 0x823b;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RG32UI = 0x823c;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_R8_SNORM = 0x8f94;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RG8_SNORM = 0x8f95;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RGB8_SNORM = 0x8f96;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RGBA8_SNORM = 0x8f97;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RGB10_A2UI = 0x906f;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE_IMMUTABLE_FORMAT = 0x912f;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE_IMMUTABLE_LEVELS = 0x82df;\r\n// Pixel types\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNSIGNED_INT_2_10_10_10_REV = 0x8368;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNSIGNED_INT_10F_11F_11F_REV = 0x8c3b;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNSIGNED_INT_5_9_9_9_REV = 0x8c3e;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FLOAT_32_UNSIGNED_INT_24_8_REV = 0x8dad;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNSIGNED_INT_24_8 = 0x84fa;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_HALF_FLOAT = 0x140b;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RG = 0x8227;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RG_INTEGER = 0x8228;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_INT_2_10_10_10_REV = 0x8d9f;\r\n// Queries\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_CURRENT_QUERY = 0x8865;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_QUERY_RESULT = 0x8866;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_QUERY_RESULT_AVAILABLE = 0x8867;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_ANY_SAMPLES_PASSED = 0x8c2f;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_ANY_SAMPLES_PASSED_CONSERVATIVE = 0x8d6a;\r\n// Draw buffers\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_DRAW_BUFFERS = 0x8824;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER0 = 0x8825;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER1 = 0x8826;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER2 = 0x8827;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER3 = 0x8828;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER4 = 0x8829;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER5 = 0x882a;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER6 = 0x882b;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER7 = 0x882c;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER8 = 0x882d;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER9 = 0x882e;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER10 = 0x882f;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER11 = 0x8830;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER12 = 0x8831;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER13 = 0x8832;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER14 = 0x8833;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER15 = 0x8834;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_COLOR_ATTACHMENTS = 0x8cdf;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT1 = 0x8ce1;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT2 = 0x8ce2;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT3 = 0x8ce3;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT4 = 0x8ce4;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT5 = 0x8ce5;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT6 = 0x8ce6;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT7 = 0x8ce7;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT8 = 0x8ce8;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT9 = 0x8ce9;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT10 = 0x8cea;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT11 = 0x8ceb;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT12 = 0x8cec;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT13 = 0x8ced;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT14 = 0x8cee;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT15 = 0x8cef;\r\n// Samplers\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_SAMPLER_3D = 0x8b5f;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_SAMPLER_2D_SHADOW = 0x8b62;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_SAMPLER_2D_ARRAY = 0x8dc1;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_SAMPLER_2D_ARRAY_SHADOW = 0x8dc4;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_SAMPLER_CUBE_SHADOW = 0x8dc5;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_INT_SAMPLER_2D = 0x8dca;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_INT_SAMPLER_3D = 0x8dcb;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_INT_SAMPLER_CUBE = 0x8dcc;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_INT_SAMPLER_2D_ARRAY = 0x8dcf;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNSIGNED_INT_SAMPLER_2D = 0x8dd2;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNSIGNED_INT_SAMPLER_3D = 0x8dd3;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNSIGNED_INT_SAMPLER_CUBE = 0x8dd4;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNSIGNED_INT_SAMPLER_2D_ARRAY = 0x8dd7;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_SAMPLES = 0x8d57;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_SAMPLER_BINDING = 0x8919;\r\n// Buffers\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_PIXEL_PACK_BUFFER = 0x88eb;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_PIXEL_UNPACK_BUFFER = 0x88ec;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_PIXEL_PACK_BUFFER_BINDING = 0x88ed;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_PIXEL_UNPACK_BUFFER_BINDING = 0x88ef;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_COPY_READ_BUFFER = 0x8f36;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_COPY_WRITE_BUFFER = 0x8f37;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_COPY_READ_BUFFER_BINDING = 0x8f36;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_COPY_WRITE_BUFFER_BINDING = 0x8f37;\r\n// Data types\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FLOAT_MAT2X3 = 0x8b65;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FLOAT_MAT2X4 = 0x8b66;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FLOAT_MAT3X2 = 0x8b67;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FLOAT_MAT3X4 = 0x8b68;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FLOAT_MAT4X2 = 0x8b69;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FLOAT_MAT4X3 = 0x8b6a;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNSIGNED_INT_VEC2 = 0x8dc6;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNSIGNED_INT_VEC3 = 0x8dc7;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNSIGNED_INT_VEC4 = 0x8dc8;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNSIGNED_NORMALIZED = 0x8c17;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_SIGNED_NORMALIZED = 0x8f9c;\r\n// Vertex attributes\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_VERTEX_ATTRIB_ARRAY_INTEGER = 0x88fd;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_VERTEX_ATTRIB_ARRAY_DIVISOR = 0x88fe;\r\n// Transform feedback\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TRANSFORM_FEEDBACK_BUFFER_MODE = 0x8c7f;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS = 0x8c80;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TRANSFORM_FEEDBACK_VARYINGS = 0x8c83;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TRANSFORM_FEEDBACK_BUFFER_START = 0x8c84;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TRANSFORM_FEEDBACK_BUFFER_SIZE = 0x8c85;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN = 0x8c88;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS = 0x8c8a;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS = 0x8c8b;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_INTERLEAVED_ATTRIBS = 0x8c8c;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_SEPARATE_ATTRIBS = 0x8c8d;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TRANSFORM_FEEDBACK_BUFFER = 0x8c8e;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TRANSFORM_FEEDBACK_BUFFER_BINDING = 0x8c8f;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TRANSFORM_FEEDBACK = 0x8e22;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TRANSFORM_FEEDBACK_PAUSED = 0x8e23;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TRANSFORM_FEEDBACK_ACTIVE = 0x8e24;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TRANSFORM_FEEDBACK_BINDING = 0x8e25;\r\n// Framebuffers and renderbuffers\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING = 0x8210;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE = 0x8211;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE = 0x8212;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE = 0x8213;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE = 0x8214;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE = 0x8215;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE = 0x8216;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE = 0x8217;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FRAMEBUFFER_DEFAULT = 0x8218;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DEPTH24_STENCIL8 = 0x88f0;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_FRAMEBUFFER_BINDING = 0x8ca6;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_READ_FRAMEBUFFER = 0x8ca8;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_FRAMEBUFFER = 0x8ca9;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_READ_FRAMEBUFFER_BINDING = 0x8caa;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_RENDERBUFFER_SAMPLES = 0x8cab;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER = 0x8cd4;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE = 0x8d56;\r\n// Uniforms\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNIFORM_BUFFER = 0x8a11;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNIFORM_BUFFER_BINDING = 0x8a28;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNIFORM_BUFFER_START = 0x8a29;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNIFORM_BUFFER_SIZE = 0x8a2a;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_VERTEX_UNIFORM_BLOCKS = 0x8a2b;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_FRAGMENT_UNIFORM_BLOCKS = 0x8a2d;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_COMBINED_UNIFORM_BLOCKS = 0x8a2e;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_UNIFORM_BUFFER_BINDINGS = 0x8a2f;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_UNIFORM_BLOCK_SIZE = 0x8a30;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS = 0x8a31;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS = 0x8a33;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT = 0x8a34;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_ACTIVE_UNIFORM_BLOCKS = 0x8a36;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNIFORM_TYPE = 0x8a37;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNIFORM_SIZE = 0x8a38;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNIFORM_BLOCK_INDEX = 0x8a3a;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNIFORM_OFFSET = 0x8a3b;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNIFORM_ARRAY_STRIDE = 0x8a3c;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNIFORM_MATRIX_STRIDE = 0x8a3d;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNIFORM_IS_ROW_MAJOR = 0x8a3e;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNIFORM_BLOCK_BINDING = 0x8a3f;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNIFORM_BLOCK_DATA_SIZE = 0x8a40;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS = 0x8a42;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES = 0x8a43;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER = 0x8a44;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER = 0x8a46;\r\n// Sync objects\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_OBJECT_TYPE = 0x9112;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_SYNC_CONDITION = 0x9113;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_SYNC_STATUS = 0x9114;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_SYNC_FLAGS = 0x9115;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_SYNC_FENCE = 0x9116;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_SYNC_GPU_COMMANDS_COMPLETE = 0x9117;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNSIGNALED = 0x9118;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_SIGNALED = 0x9119;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_ALREADY_SIGNALED = 0x911a;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TIMEOUT_EXPIRED = 0x911b;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_CONDITION_SATISFIED = 0x911c;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_WAIT_FAILED = 0x911d;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_SYNC_FLUSH_COMMANDS_BIT = 0x00000001;\r\n// Miscellaneous constants\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_COLOR = 0x1800;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DEPTH = 0x1801;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_STENCIL = 0x1802;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MIN = 0x8007;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX = 0x8008;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DEPTH_COMPONENT24 = 0x81a6;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_STREAM_READ = 0x88e1;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_STREAM_COPY = 0x88e2;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_STATIC_READ = 0x88e5;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_STATIC_COPY = 0x88e6;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DYNAMIC_READ = 0x88e9;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DYNAMIC_COPY = 0x88ea;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DEPTH_COMPONENT32F = 0x8cac;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_DEPTH32F_STENCIL8 = 0x8cad;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_INVALID_INDEX = 0xffffffff;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_TIMEOUT_IGNORED = -1;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_MAX_CLIENT_WAIT_TIMEOUT_WEBGL = 0x9247;\r\n// Constants defined in WebGL extensions\r\n// ANGLE_instanced_arrays\r\n// The ANGLE_instanced_arrays extension is part of the WebGL API and allows to draw the same object, or groups of similar objects multiple times, if they share the same vertex data, primitive count and type\r\n/**\r\n * Describes the frequency divisor used for instanced rendering\r\n * @constant {number}\r\n */\r\nconst GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE = 0x88fe;\r\n// WEBGL_debug_renderer_info\r\n// The WEBGL_debug_renderer_info extension is part of the WebGL API and exposes two constants with information about the graphics driver for debugging purposes\r\n/**\r\n * Passed to getParameter to get the vendor string of the graphics driver\r\n * @constant {number}\r\n */\r\nconst GL_UNMASKED_VENDOR_WEBGL = 0x9245;\r\n/**\r\n * Passed to getParameter to get the renderer string of the graphics driver\r\n * @constant {number}\r\n */\r\nconst GL_UNMASKED_RENDERER_WEBGL = 0x9246;\r\n// EXT_texture_filter_anisotropic\r\n// The EXT_texture_filter_anisotropic extension is part of the WebGL API and exposes two constants for anisotropic filtering (AF)\r\n/**\r\n * Returns the maximum available anisotropy\r\n * @constant {number}\r\n */\r\nconst GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT = 0x84ff;\r\n/**\r\n * Passed to texParameter to set the desired maximum anisotropy for a texture\r\n * @constant {number}\r\n */\r\nconst GL_TEXTURE_MAX_ANISOTROPY_EXT = 0x84fe;\r\n// WEBGL_compressed_texture_s3tc\r\n// The WEBGL_compressed_texture_s3tc extension is part of the WebGL API and exposes four S3TC compressed texture formats\r\n/**\r\n * A DXT1-compressed image in an RGB image format\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_RGB_S3TC_DXT1_EXT = 0x83f0;\r\n/**\r\n * A DXT1-compressed image in an RGB image format with a simple on/off alpha value\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_RGBA_S3TC_DXT1_EXT = 0x83f1;\r\n/**\r\n * A DXT3-compressed image in an RGBA image format. Compared to a 32-bit RGBA texture, it offers 4:1 compression\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_RGBA_S3TC_DXT3_EXT = 0x83f2;\r\n/**\r\n * A DXT5-compressed image in an RGBA image format. It also provides a 4:1 compression, but differs to the DXT3 compression in how the alpha compression is done\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_RGBA_S3TC_DXT5_EXT = 0x83f3;\r\n// WEBGL_compressed_texture_s3tc_srgb\r\n// The WEBGL_compressed_texture_s3tc_srgb extension is part of the WebGL API and exposes four S3TC compressed texture formats for the sRGB colorspace\r\n/**\r\n * A DXT1-compressed image in an sRGB image format\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_SRGB_S3TC_DXT1_EXT = 0x8c4c;\r\n/**\r\n * A DXT1-compressed image in an sRGB image format with a simple on/off alpha value\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT = 0x8c4d;\r\n/**\r\n * A DXT3-compressed image in an sRGBA image format\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT = 0x8c4e;\r\n/**\r\n * A DXT5-compressed image in an sRGBA image format\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT = 0x8c4f;\r\n// WEBGL_compressed_texture_etc\r\n// The WEBGL_compressed_texture_etc extension is part of the WebGL API and exposes 10 ETC/EAC compressed texture formats\r\n/**\r\n * One-channel (red) unsigned format compression\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_R11_EAC = 0x9270;\r\n/**\r\n * One-channel (red) signed format compression\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_SIGNED_R11_EAC = 0x9271;\r\n/**\r\n * Two-channel (red and green) unsigned format compression\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_RG11_EAC = 0x9272;\r\n/**\r\n * Two-channel (red and green) signed format compression\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_SIGNED_RG11_EAC = 0x9273;\r\n/**\r\n * Compresses RBG8 data with no alpha channel\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_RGB8_ETC2 = 0x9274;\r\n/**\r\n * Compresses RGBA8 data. The RGB part is encoded the same as RGB_ETC2, but the alpha part is encoded separately\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_RGBA8_ETC2_EAC = 0x9275;\r\n/**\r\n * Compresses sRBG8 data with no alpha channel\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_SRGB8_ETC2 = 0x9276;\r\n/**\r\n * Compresses sRGBA8 data. The sRGB part is encoded the same as SRGB_ETC2, but the alpha part is encoded separately\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC = 0x9277;\r\n/**\r\n * Similar to RGB8_ETC, but with ability to punch through the alpha channel, which means to make it completely opaque or transparent\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 = 0x9278;\r\n/**\r\n * Similar to SRGB8_ETC, but with ability to punch through the alpha channel, which means to make it completely opaque or transparent\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 = 0x9279;\r\n// WEBGL_compressed_texture_pvrtc\r\n// The WEBGL_compressed_texture_pvrtc extension is part of the WebGL API and exposes four PVRTC compressed texture formats\r\n/**\r\n * RGB compression in 4-bit mode. One block for each 4×4 pixels\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG = 0x8c00;\r\n/**\r\n * RGBA compression in 4-bit mode. One block for each 4×4 pixels\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG = 0x8c02;\r\n/**\r\n * RGB compression in 2-bit mode. One block for each 8×4 pixels\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG = 0x8c01;\r\n/**\r\n * RGBA compression in 2-bit mode. One block for each 8×4 pixels\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG = 0x8c03;\r\n// WEBGL_compressed_texture_etc1\r\n// The WEBGL_compressed_texture_etc1 extension is part of the WebGL API and exposes the ETC1 compressed texture format\r\n/**\r\n * Compresses 24-bit RGB data with no alpha channel\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_RGB_ETC1_WEBGL = 0x8d64;\r\n// WEBGL_compressed_texture_atc\r\n// The WEBGL_compressed_texture_atc extension is part of the WebGL API and exposes 3 ATC compressed texture formats. ATC is a proprietary compression algorithm for compressing textures on handheld devices\r\n/**\r\n * Compresses RGB textures with no alpha channel\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_RGB_ATC_WEBGL = 0x8c92;\r\n/**\r\n * Compresses RGBA textures using explicit alpha encoding (useful when alpha transitions are sharp)\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL = 0x8c92;\r\n/**\r\n * Compresses RGBA textures using interpolated alpha encoding (useful when alpha transitions are gradient)\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL = 0x87ee;\r\n// WEBGL_compressed_texture_astc\r\n// The WEBGL_compressed_texture_astc extension is part of the WebGL API and exposes Adaptive Scalable Texture Compression (ASTC) compressed texture formats to WebGL\r\n// https://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_astc/\r\n// https://developer.nvidia.com/astc-texture-compression-for-game-assets\r\n/**\r\n * Compresses RGBA textures using ASTC compression in a blocksize of 4x4\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_RGBA_ASTC_4X4_KHR = 0x93b0;\r\n/**\r\n * Compresses RGBA textures using ASTC compression in a blocksize of 5x4\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_RGBA_ASTC_5X4_KHR = 0x93b1;\r\n/**\r\n * Compresses RGBA textures using ASTC compression in a blocksize of 5x5\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_RGBA_ASTC_5X5_KHR = 0x93b2;\r\n/**\r\n * Compresses RGBA textures using ASTC compression in a blocksize of 6x5\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_RGBA_ASTC_6X5_KHR = 0x93b3;\r\n/**\r\n * Compresses RGBA textures using ASTC compression in a blocksize of 6x6\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_RGBA_ASTC_6X6_KHR = 0x93b4;\r\n/**\r\n * Compresses RGBA textures using ASTC compression in a blocksize of 8x5\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_RGBA_ASTC_8X5_KHR = 0x93b5;\r\n/**\r\n * Compresses RGBA textures using ASTC compression in a blocksize of 8x6\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_RGBA_ASTC_8X6_KHR = 0x93b6;\r\n/**\r\n * Compresses RGBA textures using ASTC compression in a blocksize of 8x8\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_RGBA_ASTC_8X8_KHR = 0x93b7;\r\n/**\r\n * Compresses RGBA textures using ASTC compression in a blocksize of 10x5\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_RGBA_ASTC_10X5_KHR = 0x93b8;\r\n/**\r\n * Compresses RGBA textures using ASTC compression in a blocksize of 10x6\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_RGBA_ASTC_10X6_KHR = 0x93b9;\r\n/**\r\n * Compresses RGBA textures using ASTC compression in a blocksize of 10x8\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_RGBA_ASTC_10X8_KHR = 0x93ba;\r\n/**\r\n * Compresses RGBA textures using ASTC compression in a blocksize of 10x10\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_RGBA_ASTC_10X10_KHR = 0x93bb;\r\n/**\r\n * Compresses RGBA textures using ASTC compression in a blocksize of 12x10\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_RGBA_ASTC_12X10_KHR = 0x93bc;\r\n/**\r\n * Compresses RGBA textures using ASTC compression in a blocksize of 12x12\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_RGBA_ASTC_12X12_KHR = 0x93bd;\r\n/**\r\n * Compresses SRGB8 textures using ASTC compression in a blocksize of 4x4\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4X4_KHR = 0x93d0;\r\n/**\r\n * Compresses SRGB8 textures using ASTC compression in a blocksize of 5x4\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5X4_KHR = 0x93d1;\r\n/**\r\n * Compresses SRGB8 textures using ASTC compression in a blocksize of 5x5\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5X5_KHR = 0x93d2;\r\n/**\r\n * Compresses SRGB8 textures using ASTC compression in a blocksize of 6x5\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6X5_KHR = 0x93d3;\r\n/**\r\n * Compresses SRGB8 textures using ASTC compression in a blocksize of 6x6\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6X6_KHR = 0x93d4;\r\n/**\r\n * Compresses SRGB8 textures using ASTC compression in a blocksize of 8x5\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8X5_KHR = 0x93d5;\r\n/**\r\n * Compresses SRGB8 textures using ASTC compression in a blocksize of 8x6\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8X6_KHR = 0x93d6;\r\n/**\r\n * Compresses SRGB8 textures using ASTC compression in a blocksize of 8x8\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8X8_KHR = 0x93d7;\r\n/**\r\n * Compresses SRGB8 textures using ASTC compression in a blocksize of 10x5\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10X5_KHR = 0x93d8;\r\n/**\r\n * Compresses SRGB8 textures using ASTC compression in a blocksize of 10x6\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10X6_KHR = 0x93d9;\r\n/**\r\n * Compresses SRGB8 textures using ASTC compression in a blocksize of 10x8\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10X8_KHR = 0x93da;\r\n/**\r\n * Compresses SRGB8 textures using ASTC compression in a blocksize of 10x10\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10X10_KHR = 0x93db;\r\n/**\r\n * Compresses SRGB8 textures using ASTC compression in a blocksize of 12x10\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12X10_KHR = 0x93dc;\r\n/**\r\n * Compresses SRGB8 textures using ASTC compression in a blocksize of 12x12\r\n * @constant {number}\r\n */\r\nconst GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12X12_KHR = 0x93dd;\r\n// WEBGL_depth_texture\r\n// The WEBGL_depth_texture extension is part of the WebGL API and defines 2D depth and depth-stencil textures\r\n/**\r\n * Unsigned integer type for 24-bit depth texture data\r\n * @constant {number}\r\n */\r\nconst GL_UNSIGNED_INT_24_8_WEBGL = 0x84fa;\r\n// OES_texture_half_float\r\n// The OES_texture_half_float extension is part of the WebGL API and adds texture formats with 16- (aka half float) and 32-bit floating-point components\r\n/**\r\n * Half floating-point type (16-bit)\r\n * @constant {number}\r\n */\r\nconst GL_HALF_FLOAT_OES = 0x8d61;\r\n// WEBGL_color_buffer_float\r\n// The WEBGL_color_buffer_float extension is part of the WebGL API and adds the ability to render to 32-bit floating-point color buffers\r\n/**\r\n * RGBA 32-bit floating-point color-renderable format\r\n * @constant {number}\r\n */\r\nconst GL_RGBA32F_EXT = 0x8814;\r\n/**\r\n * RGB 32-bit floating-point color-renderable format\r\n * @constant {number}\r\n */\r\nconst GL_RGB32F_EXT = 0x8815;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT = 0x8211;\r\n/**\r\n * @constant {number}\r\n */\r\nconst GL_UNSIGNED_NORMALIZED_EXT = 0x8c17;\r\n// EXT_blend_minmax\r\n// The EXT_blend_minmax extension is part of the WebGL API and extends blending capabilities by adding two new blend equations: the minimum or maximum color components of the source and destination colors\r\n/**\r\n * Produces the minimum color components of the source and destination colors\r\n * @constant {number}\r\n */\r\nconst GL_MIN_EXT = 0x8007;\r\n/**\r\n * Produces the maximum color components of the source and destination colors\r\n * @constant {number}\r\n */\r\nconst GL_MAX_EXT = 0x8008;\r\n// EXT_sRGB\r\n// The EXT_sRGB extension is part of the WebGL API and adds sRGB support to textures and framebuffer objects\r\n/**\r\n * Unsized sRGB format that leaves the precision up to the driver\r\n * @constant {number}\r\n */\r\nconst GL_SRGB_EXT = 0x8c40;\r\n/**\r\n * Unsized sRGB format with unsized alpha component\r\n * @constant {number}\r\n */\r\nconst GL_SRGB_ALPHA_EXT = 0x8c42;\r\n/**\r\n * Sized (8-bit) sRGB and alpha formats\r\n * @constant {number}\r\n */\r\nconst GL_SRGB8_ALPHA8_EXT = 0x8c43;\r\n/**\r\n * Returns the framebuffer color encoding\r\n * @constant {number}\r\n */\r\nconst GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT = 0x8210;\r\n// OES_standard_derivatives\r\n// The OES_standard_derivatives extension is part of the WebGL API and adds the GLSL derivative functions dFdx, dFdy, and fwidth\r\n/**\r\n * Indicates the accuracy of the derivative calculation for the GLSL built-in functions: dFdx, dFdy, and fwidth\r\n * @constant {number}\r\n */\r\nconst GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES = 0x8b8b;\r\n// WEBGL_draw_buffers\r\n// The WEBGL_draw_buffers extension is part of the WebGL API and enables a fragment shader to write to several textures, which is useful for deferred shading, for example\r\n/**\r\n * Framebuffer color attachment point\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT0_WEBGL = 0x8ce0;\r\n/**\r\n * Framebuffer color attachment point\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT1_WEBGL = 0x8ce1;\r\n/**\r\n * Framebuffer color attachment point\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT2_WEBGL = 0x8ce2;\r\n/**\r\n * Framebuffer color attachment point\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT3_WEBGL = 0x8ce3;\r\n/**\r\n * Framebuffer color attachment point\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT4_WEBGL = 0x8ce4;\r\n/**\r\n * Framebuffer color attachment point\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT5_WEBGL = 0x8ce5;\r\n/**\r\n * Framebuffer color attachment point\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT6_WEBGL = 0x8ce6;\r\n/**\r\n * Framebuffer color attachment point\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT7_WEBGL = 0x8ce7;\r\n/**\r\n * Framebuffer color attachment point\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT8_WEBGL = 0x8ce8;\r\n/**\r\n * Framebuffer color attachment point\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT9_WEBGL = 0x8ce9;\r\n/**\r\n * Framebuffer color attachment point\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT10_WEBGL = 0x8cea;\r\n/**\r\n * Framebuffer color attachment point\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT11_WEBGL = 0x8ceb;\r\n/**\r\n * Framebuffer color attachment point\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT12_WEBGL = 0x8cec;\r\n/**\r\n * Framebuffer color attachment point\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT13_WEBGL = 0x8ced;\r\n/**\r\n * Framebuffer color attachment point\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT14_WEBGL = 0x8cee;\r\n/**\r\n * Framebuffer color attachment point\r\n * @constant {number}\r\n */\r\nconst GL_COLOR_ATTACHMENT15_WEBGL = 0x8cef;\r\n/**\r\n * Draw buffer\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER0_WEBGL = 0x8825;\r\n/**\r\n * Draw buffer\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER1_WEBGL = 0x8826;\r\n/**\r\n * Draw buffer\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER2_WEBGL = 0x8827;\r\n/**\r\n * Draw buffer\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER3_WEBGL = 0x8828;\r\n/**\r\n * Draw buffer\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER4_WEBGL = 0x8829;\r\n/**\r\n * Draw buffer\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER5_WEBGL = 0x882a;\r\n/**\r\n * Draw buffer\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER6_WEBGL = 0x882b;\r\n/**\r\n * Draw buffer\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER7_WEBGL = 0x882c;\r\n/**\r\n * Draw buffer\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER8_WEBGL = 0x882d;\r\n/**\r\n * Draw buffer\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER9_WEBGL = 0x882e;\r\n/**\r\n * Draw buffer\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER10_WEBGL = 0x882f;\r\n/**\r\n * Draw buffer\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER11_WEBGL = 0x8830;\r\n/**\r\n * Draw buffer\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER12_WEBGL = 0x8831;\r\n/**\r\n * Draw buffer\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER13_WEBGL = 0x8832;\r\n/**\r\n * Draw buffer\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER14_WEBGL = 0x8833;\r\n/**\r\n * Draw buffer\r\n * @constant {number}\r\n */\r\nconst GL_DRAW_BUFFER15_WEBGL = 0x8834;\r\n/**\r\n * Maximum number of framebuffer color attachment points\r\n * @constant {number}\r\n */\r\nconst GL_MAX_COLOR_ATTACHMENTS_WEBGL = 0x8cdf;\r\n/**\r\n * Maximum number of draw buffers\r\n * @constant {number}\r\n */\r\nconst GL_MAX_DRAW_BUFFERS_WEBGL = 0x8824;\r\n// OES_vertex_array_object\r\n// The OES_vertex_array_object extension is part of the WebGL API and provides vertex array objects (VAOs) which encapsulate vertex array states. These objects keep pointers to vertex data and provide names for different sets of vertex data\r\n/**\r\n * The bound vertex array object (VAO)\r\n * @constant {number}\r\n */\r\nconst GL_VERTEX_ARRAY_BINDING_OES = 0x85b5;\r\n// EXT_disjoint_timer_query\r\n// The EXT_disjoint_timer_query extension is part of the WebGL API and provides a way to measure the duration of a set of GL commands, without stalling the rendering pipeline\r\n/**\r\n * The number of bits used to hold the query result for the given target\r\n * @constant {number}\r\n */\r\nconst GL_QUERY_COUNTER_BITS_EXT = 0x8864;\r\n/**\r\n * The currently active query\r\n * @constant {number}\r\n */\r\nconst GL_CURRENT_QUERY_EXT = 0x8865;\r\n/**\r\n * The query result\r\n * @constant {number}\r\n */\r\nconst GL_QUERY_RESULT_EXT = 0x8866;\r\n/**\r\n * A Boolean indicating whether or not a query result is available\r\n * @constant {number}\r\n */\r\nconst GL_QUERY_RESULT_AVAILABLE_EXT = 0x8867;\r\n/**\r\n * Elapsed time (in nanoseconds)\r\n * @constant {number}\r\n */\r\nconst GL_TIME_ELAPSED_EXT = 0x88bf;\r\n/**\r\n * The current time\r\n * @constant {number}\r\n */\r\nconst GL_TIMESTAMP_EXT = 0x8e28;\r\n/**\r\n * A Boolean indicating whether or not the GPU performed any disjoint operation\r\n * @constant {number}\r\n */\r\nconst GL_GPU_DISJOINT_EXT = 0x8fbb;\r\n// Constants defined in WebGL draft extensions\r\n// KHR_parallel_shader_compile\r\n// The KHR_parallel_shader_compile extension is part of the WebGL draft API and provides multithreaded asynchronous shader compilation\r\n/**\r\n * Query to determine if the compilation process is complete\r\n * @constant {number}\r\n */\r\nconst GL_COMPLETION_STATUS_KHR = 0x91b1;\n\nexport { GL_ACTIVE_ATTRIBUTES, GL_ACTIVE_TEXTURE, GL_ACTIVE_UNIFORMS, GL_ACTIVE_UNIFORM_BLOCKS, GL_ALIASED_LINE_WIDTH_RANGE, GL_ALIASED_POINT_SIZE_RANGE, GL_ALPHA, GL_ALPHA_BITS, GL_ALREADY_SIGNALED, GL_ALWAYS, GL_ANY_SAMPLES_PASSED, GL_ANY_SAMPLES_PASSED_CONSERVATIVE, GL_ARRAY_BUFFER, GL_ARRAY_BUFFER_BINDING, GL_ATTACHED_SHADERS, GL_BACK, GL_BLEND, GL_BLEND_COLOR, GL_BLEND_DST_ALPHA, GL_BLEND_DST_RGB, GL_BLEND_EQUATION, GL_BLEND_EQUATION_ALPHA, GL_BLEND_EQUATION_RGB, GL_BLEND_SRC_ALPHA, GL_BLEND_SRC_RGB, GL_BLUE_BITS, GL_BOOL, GL_BOOL_VEC2, GL_BOOL_VEC3, GL_BOOL_VEC4, GL_BROWSER_DEFAULT_WEBGL, GL_BUFFER_SIZE, GL_BUFFER_USAGE, GL_BYTE, GL_CCW, GL_CLAMP_TO_EDGE, GL_COLOR, GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT0_WEBGL, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT10, GL_COLOR_ATTACHMENT10_WEBGL, GL_COLOR_ATTACHMENT11, GL_COLOR_ATTACHMENT11_WEBGL, GL_COLOR_ATTACHMENT12, GL_COLOR_ATTACHMENT12_WEBGL, GL_COLOR_ATTACHMENT13, GL_COLOR_ATTACHMENT13_WEBGL, GL_COLOR_ATTACHMENT14, GL_COLOR_ATTACHMENT14_WEBGL, GL_COLOR_ATTACHMENT15, GL_COLOR_ATTACHMENT15_WEBGL, GL_COLOR_ATTACHMENT1_WEBGL, GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT2_WEBGL, GL_COLOR_ATTACHMENT3, GL_COLOR_ATTACHMENT3_WEBGL, GL_COLOR_ATTACHMENT4, GL_COLOR_ATTACHMENT4_WEBGL, GL_COLOR_ATTACHMENT5, GL_COLOR_ATTACHMENT5_WEBGL, GL_COLOR_ATTACHMENT6, GL_COLOR_ATTACHMENT6_WEBGL, GL_COLOR_ATTACHMENT7, GL_COLOR_ATTACHMENT7_WEBGL, GL_COLOR_ATTACHMENT8, GL_COLOR_ATTACHMENT8_WEBGL, GL_COLOR_ATTACHMENT9, GL_COLOR_ATTACHMENT9_WEBGL, GL_COLOR_BUFFER_BIT, GL_COLOR_CLEAR_VALUE, GL_COLOR_WRITEMASK, GL_COMPARE_REF_TO_TEXTURE, GL_COMPILE_STATUS, GL_COMPLETION_STATUS_KHR, GL_COMPRESSED_R11_EAC, GL_COMPRESSED_RG11_EAC, GL_COMPRESSED_RGB8_ETC2, GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, GL_COMPRESSED_RGBA8_ETC2_EAC, GL_COMPRESSED_RGBA_ASTC_10X10_KHR, GL_COMPRESSED_RGBA_ASTC_10X5_KHR, GL_COMPRESSED_RGBA_ASTC_10X6_KHR, GL_COMPRESSED_RGBA_ASTC_10X8_KHR, GL_COMPRESSED_RGBA_ASTC_12X10_KHR, GL_COMPRESSED_RGBA_ASTC_12X12_KHR, GL_COMPRESSED_RGBA_ASTC_4X4_KHR, GL_COMPRESSED_RGBA_ASTC_5X4_KHR, GL_COMPRESSED_RGBA_ASTC_5X5_KHR, GL_COMPRESSED_RGBA_ASTC_6X5_KHR, GL_COMPRESSED_RGBA_ASTC_6X6_KHR, GL_COMPRESSED_RGBA_ASTC_8X5_KHR, GL_COMPRESSED_RGBA_ASTC_8X6_KHR, GL_COMPRESSED_RGBA_ASTC_8X8_KHR, GL_COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL, GL_COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL, GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG, GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, GL_COMPRESSED_RGB_ATC_WEBGL, GL_COMPRESSED_RGB_ETC1_WEBGL, GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG, GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, GL_COMPRESSED_SIGNED_R11_EAC, GL_COMPRESSED_SIGNED_RG11_EAC, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10X10_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10X5_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10X6_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10X8_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12X10_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12X12_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4X4_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5X4_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5X5_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6X5_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6X6_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8X5_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8X6_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8X8_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, GL_COMPRESSED_SRGB8_ETC2, GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, GL_COMPRESSED_SRGB_S3TC_DXT1_EXT, GL_COMPRESSED_TEXTURE_FORMATS, GL_CONDITION_SATISFIED, GL_CONSTANT_ALPHA, GL_CONSTANT_COLOR, GL_CONTEXT_LOST_WEBGL, GL_COPY_READ_BUFFER, GL_COPY_READ_BUFFER_BINDING, GL_COPY_WRITE_BUFFER, GL_COPY_WRITE_BUFFER_BINDING, GL_CULL_FACE, GL_CULL_FACE_MODE, GL_CURRENT_PROGRAM, GL_CURRENT_QUERY, GL_CURRENT_QUERY_EXT, GL_CURRENT_VERTEX_ATTRIB, GL_CW, GL_DECR, GL_DECR_WRAP, GL_DELETE_STATUS, GL_DEPTH, GL_DEPTH24_STENCIL8, GL_DEPTH32F_STENCIL8, GL_DEPTH_ATTACHMENT, GL_DEPTH_BITS, GL_DEPTH_BUFFER_BIT, GL_DEPTH_CLEAR_VALUE, GL_DEPTH_COMPONENT, GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT24, GL_DEPTH_COMPONENT32F, GL_DEPTH_FUNC, GL_DEPTH_RANGE, GL_DEPTH_STENCIL, GL_DEPTH_STENCIL_ATTACHMENT, GL_DEPTH_TEST, GL_DEPTH_WRITEMASK, GL_DITHER, GL_DONT_CARE, GL_DRAW_BUFFER0, GL_DRAW_BUFFER0_WEBGL, GL_DRAW_BUFFER1, GL_DRAW_BUFFER10, GL_DRAW_BUFFER10_WEBGL, GL_DRAW_BUFFER11, GL_DRAW_BUFFER11_WEBGL, GL_DRAW_BUFFER12, GL_DRAW_BUFFER12_WEBGL, GL_DRAW_BUFFER13, GL_DRAW_BUFFER13_WEBGL, GL_DRAW_BUFFER14, GL_DRAW_BUFFER14_WEBGL, GL_DRAW_BUFFER15, GL_DRAW_BUFFER15_WEBGL, GL_DRAW_BUFFER1_WEBGL, GL_DRAW_BUFFER2, GL_DRAW_BUFFER2_WEBGL, GL_DRAW_BUFFER3, GL_DRAW_BUFFER3_WEBGL, GL_DRAW_BUFFER4, GL_DRAW_BUFFER4_WEBGL, GL_DRAW_BUFFER5, GL_DRAW_BUFFER5_WEBGL, GL_DRAW_BUFFER6, GL_DRAW_BUFFER6_WEBGL, GL_DRAW_BUFFER7, GL_DRAW_BUFFER7_WEBGL, GL_DRAW_BUFFER8, GL_DRAW_BUFFER8_WEBGL, GL_DRAW_BUFFER9, GL_DRAW_BUFFER9_WEBGL, GL_DRAW_FRAMEBUFFER, GL_DRAW_FRAMEBUFFER_BINDING, GL_DST_ALPHA, GL_DST_COLOR, GL_DYNAMIC_COPY, GL_DYNAMIC_DRAW, GL_DYNAMIC_READ, GL_ELEMENT_ARRAY_BUFFER, GL_ELEMENT_ARRAY_BUFFER_BINDING, GL_EQUAL, GL_FASTEST, GL_FLOAT, GL_FLOAT_32_UNSIGNED_INT_24_8_REV, GL_FLOAT_MAT2, GL_FLOAT_MAT2X3, GL_FLOAT_MAT2X4, GL_FLOAT_MAT3, GL_FLOAT_MAT3X2, GL_FLOAT_MAT3X4, GL_FLOAT_MAT4, GL_FLOAT_MAT4X2, GL_FLOAT_MAT4X3, GL_FLOAT_VEC2, GL_FLOAT_VEC3, GL_FLOAT_VEC4, GL_FRAGMENT_SHADER, GL_FRAGMENT_SHADER_DERIVATIVE_HINT, GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES, GL_FRAMEBUFFER, GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE, GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE, GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING, GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT, GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE, GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT, GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE, GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE, GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE, GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE, GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER, GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL, GL_FRAMEBUFFER_BINDING, GL_FRAMEBUFFER_COMPLETE, GL_FRAMEBUFFER_DEFAULT, GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT, GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS, GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT, GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE, GL_FRAMEBUFFER_UNSUPPORTED, GL_FRONT, GL_FRONT_AND_BACK, GL_FRONT_FACE, GL_FUNC_ADD, GL_FUNC_REVERSE_SUBTRACT, GL_FUNC_SUBSTRACT, GL_GENERATE_MIPMAP_HINT, GL_GEQUAL, GL_GPU_DISJOINT_EXT, GL_GREATER, GL_GREEN_BITS, GL_HALF_FLOAT, GL_HALF_FLOAT_OES, GL_HIGH_FLOAT, GL_HIGH_INT, GL_IMPLEMENTATION_COLOR_READ_FORMAT, GL_IMPLEMENTATION_COLOR_READ_TYPE, GL_INCR, GL_INCR_WRAP, GL_INT, GL_INTERLEAVED_ATTRIBS, GL_INT_2_10_10_10_REV, GL_INT_SAMPLER_2D, GL_INT_SAMPLER_2D_ARRAY, GL_INT_SAMPLER_3D, GL_INT_SAMPLER_CUBE, GL_INT_VEC2, GL_INT_VEC3, GL_INT_VEC4, GL_INVALID_ENUM, GL_INVALID_FRAMEBUFFER_OPERATION, GL_INVALID_INDEX, GL_INVALID_OPERATION, GL_INVALID_VALUE, GL_INVERT, GL_KEEP, GL_LEQUAL, GL_LESS, GL_LINEAR, GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR_MIPMAP_NEAREST, GL_LINES, GL_LINE_LOOP, GL_LINE_STRIP, GL_LINE_WIDTH, GL_LINK_STATUS, GL_LOW_FLOAT, GL_LOW_INT, GL_LUMINANCE, GL_LUMINANCE_ALPHA, GL_MAX, GL_MAX_3D_TEXTURE_SIZE, GL_MAX_ARRAY_TEXTURE_LAYERS, GL_MAX_CLIENT_WAIT_TIMEOUT_WEBGL, GL_MAX_COLOR_ATTACHMENTS, GL_MAX_COLOR_ATTACHMENTS_WEBGL, GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS, GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, GL_MAX_COMBINED_UNIFORM_BLOCKS, GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS, GL_MAX_CUBE_MAP_TEXTURE_SIZE, GL_MAX_DRAW_BUFFERS, GL_MAX_DRAW_BUFFERS_WEBGL, GL_MAX_ELEMENTS_INDICES, GL_MAX_ELEMENTS_VERTICES, GL_MAX_ELEMENT_INDEX, GL_MAX_EXT, GL_MAX_FRAGMENT_INPUT_COMPONENTS, GL_MAX_FRAGMENT_UNIFORM_BLOCKS, GL_MAX_FRAGMENT_UNIFORM_COMPONENTS, GL_MAX_FRAGMENT_UNIFORM_VECTORS, GL_MAX_PROGRAM_TEXEL_OFFSET, GL_MAX_RENDERBUFFER_SIZE, GL_MAX_SAMPLES, GL_MAX_SERVER_WAIT_TIMEOUT, GL_MAX_TEXTURE_IMAGE_UNITS, GL_MAX_TEXTURE_LOD_BIAS, GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, GL_MAX_TEXTURE_SIZE, GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS, GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS, GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS, GL_MAX_UNIFORM_BLOCK_SIZE, GL_MAX_UNIFORM_BUFFER_BINDINGS, GL_MAX_VARYING_COMPONENTS, GL_MAX_VARYING_VECTORS, GL_MAX_VERTEX_ATTRIBS, GL_MAX_VERTEX_OUTPUT_COMPONENTS, GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, GL_MAX_VERTEX_UNIFORM_BLOCKS, GL_MAX_VERTEX_UNIFORM_COMPONENTS, GL_MAX_VERTEX_UNIFORM_VECTORS, GL_MAX_VIEWPORT_DIMS, GL_MEDIUM_FLOAT, GL_MEDIUM_INT, GL_MIN, GL_MIN_EXT, GL_MIN_PROGRAM_TEXEL_OFFSET, GL_MIRRORED_REPEAT, GL_NEAREST, GL_NEAREST_MIPMAP_LINEAR, GL_NEAREST_MIPMAP_NEAREST, GL_NEVER, GL_NICEST, GL_NONE, GL_NOTEQUAL, GL_NO_ERROR, GL_OBJECT_TYPE, GL_ONE, GL_ONE_MINUS_CONSTANT_ALPHA, GL_ONE_MINUS_CONSTANT_COLOR, GL_ONE_MINUS_DST_ALPHA, GL_ONE_MINUS_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA, GL_ONE_MINUS_SRC_COLOR, GL_OUT_OF_MEMORY, GL_PACK_ALIGNMENT, GL_PACK_ROW_LENGTH, GL_PACK_SKIP_PIXELS, GL_PACK_SKIP_ROWS, GL_PIXEL_PACK_BUFFER, GL_PIXEL_PACK_BUFFER_BINDING, GL_PIXEL_UNPACK_BUFFER, GL_PIXEL_UNPACK_BUFFER_BINDING, GL_POINTS, GL_POLYGON_OFFSET_FACTOR, GL_POLYGON_OFFSET_FILL, GL_POLYGON_OFFSET_UNITS, GL_QUERY_COUNTER_BITS_EXT, GL_QUERY_RESULT, GL_QUERY_RESULT_AVAILABLE, GL_QUERY_RESULT_AVAILABLE_EXT, GL_QUERY_RESULT_EXT, GL_R11F_G11F_B10F, GL_R16F, GL_R16I, GL_R16UI, GL_R32F, GL_R32I, GL_R32UI, GL_R8, GL_R8I, GL_R8UI, GL_R8_SNORM, GL_RASTERIZER_DISCARD, GL_READ_BUFFER, GL_READ_FRAMEBUFFER, GL_READ_FRAMEBUFFER_BINDING, GL_RED, GL_RED_BITS, GL_RED_INTEGER, GL_RENDERBUFFER, GL_RENDERBUFFER_ALPHA_SIZE, GL_RENDERBUFFER_BINDING, GL_RENDERBUFFER_BLUE_SIZE, GL_RENDERBUFFER_DEPTH_SIZE, GL_RENDERBUFFER_GREEN_SIZE, GL_RENDERBUFFER_HEIGHT, GL_RENDERBUFFER_INTERNAL_FORMAT, GL_RENDERBUFFER_RED_SIZE, GL_RENDERBUFFER_SAMPLES, GL_RENDERBUFFER_STENCIL_SIZE, GL_RENDERBUFFER_WIDTH, GL_RENDERER, GL_REPEAT, GL_REPLACE, GL_RG, GL_RG16F, GL_RG16I, GL_RG16UI, GL_RG32F, GL_RG32I, GL_RG32UI, GL_RG8, GL_RG8I, GL_RG8UI, GL_RG8_SNORM, GL_RGB, GL_RGB10_A2, GL_RGB10_A2UI, GL_RGB16F, GL_RGB16I, GL_RGB16UI, GL_RGB32F, GL_RGB32F_EXT, GL_RGB32I, GL_RGB32UI, GL_RGB565, GL_RGB5_A1, GL_RGB8, GL_RGB8I, GL_RGB8UI, GL_RGB8_SNORM, GL_RGB9_E5, GL_RGBA, GL_RGBA16F, GL_RGBA16I, GL_RGBA16UI, GL_RGBA32F, GL_RGBA32F_EXT, GL_RGBA32I, GL_RGBA32UI, GL_RGBA4, GL_RGBA8, GL_RGBA8I, GL_RGBA8UI, GL_RGBA8_SNORM, GL_RGBA_INTEGER, GL_RGB_INTEGER, GL_RG_INTEGER, GL_SAMPLER_2D, GL_SAMPLER_2D_ARRAY, GL_SAMPLER_2D_ARRAY_SHADOW, GL_SAMPLER_2D_SHADOW, GL_SAMPLER_3D, GL_SAMPLER_BINDING, GL_SAMPLER_CUBE, GL_SAMPLER_CUBE_SHADOW, GL_SAMPLES, GL_SAMPLE_ALPHA_TO_COVERAGE, GL_SAMPLE_BUFFERS, GL_SAMPLE_COVERAGE, GL_SAMPLE_COVERAGE_INVERT, GL_SAMPLE_COVERAGE_VALUE, GL_SCISSOR_BOX, GL_SCISSOR_TEST, GL_SEPARATE_ATTRIBS, GL_SHADER_TYPE, GL_SHADING_LANGUAGE_VERSION, GL_SHORT, GL_SIGNALED, GL_SIGNED_NORMALIZED, GL_SRC_ALPHA, GL_SRC_ALPHA_SATURATE, GL_SRC_COLOR, GL_SRGB, GL_SRGB8, GL_SRGB8_ALPHA8, GL_SRGB8_ALPHA8_EXT, GL_SRGB_ALPHA_EXT, GL_SRGB_EXT, GL_STATIC_COPY, GL_STATIC_DRAW, GL_STATIC_READ, GL_STENCIL, GL_STENCIL_ATTACHMENT, GL_STENCIL_BACK_FAIL, GL_STENCIL_BACK_FUNC, GL_STENCIL_BACK_PASS_DEPTH_FAIL, GL_STENCIL_BACK_PASS_DEPTH_PASS, GL_STENCIL_BACK_REF, GL_STENCIL_BACK_VALUE_MASK, GL_STENCIL_BACK_WRITEMASK, GL_STENCIL_BITS, GL_STENCIL_BUFFER_BIT, GL_STENCIL_CLEAR_VALUE, GL_STENCIL_FAIL, GL_STENCIL_FUNC, GL_STENCIL_INDEX, GL_STENCIL_INDEX8, GL_STENCIL_PASS_DEPTH_FAIL, GL_STENCIL_PASS_DEPTH_PASS, GL_STENCIL_REF, GL_STENCIL_TEST, GL_STENCIL_VALUE_MASK, GL_STENCIL_WRITEMASK, GL_STREAM_COPY, GL_STREAM_DRAW, GL_STREAM_READ, GL_SUBPIXEL_BITS, GL_SYNC_CONDITION, GL_SYNC_FENCE, GL_SYNC_FLAGS, GL_SYNC_FLUSH_COMMANDS_BIT, GL_SYNC_GPU_COMMANDS_COMPLETE, GL_SYNC_STATUS, GL_TEXTURE, GL_TEXTURE0, GL_TEXTURE1, GL_TEXTURE10, GL_TEXTURE11, GL_TEXTURE12, GL_TEXTURE13, GL_TEXTURE14, GL_TEXTURE15, GL_TEXTURE16, GL_TEXTURE17, GL_TEXTURE18, GL_TEXTURE19, GL_TEXTURE2, GL_TEXTURE20, GL_TEXTURE21, GL_TEXTURE22, GL_TEXTURE23, GL_TEXTURE24, GL_TEXTURE25, GL_TEXTURE26, GL_TEXTURE27, GL_TEXTURE28, GL_TEXTURE29, GL_TEXTURE3, GL_TEXTURE30, GL_TEXTURE31, GL_TEXTURE4, GL_TEXTURE5, GL_TEXTURE6, GL_TEXTURE7, GL_TEXTURE8, GL_TEXTURE9, GL_TEXTURE_2D, GL_TEXTURE_2D_ARRAY, GL_TEXTURE_3D, GL_TEXTURE_BASE_LEVEL, GL_TEXTURE_BINDING_2D, GL_TEXTURE_BINDING_2D_ARRAY, GL_TEXTURE_BINDING_3D, GL_TEXTURE_BINDING_CUBE_MAP, GL_TEXTURE_COMPARE_FUNC, GL_TEXTURE_COMPARE_MODE, GL_TEXTURE_CUBE_MAP, GL_TEXTURE_CUBE_MAP_NEGATIVE_X, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, GL_TEXTURE_CUBE_MAP_POSITIVE_X, GL_TEXTURE_CUBE_MAP_POSITIVE_Y, GL_TEXTURE_CUBE_MAP_POSITIVE_Z, GL_TEXTURE_IMMUTABLE_FORMAT, GL_TEXTURE_IMMUTABLE_LEVELS, GL_TEXTURE_MAG_FILTER, GL_TEXTURE_MAX_ANISOTROPY_EXT, GL_TEXTURE_MAX_LEVEL, GL_TEXTURE_MAX_LOD, GL_TEXTURE_MIN_FILTER, GL_TEXTURE_MIN_LOD, GL_TEXTURE_WRAP_R, GL_TEXTURE_WRAP_S, GL_TEXTURE_WRAP_T, GL_TIMEOUT_EXPIRED, GL_TIMEOUT_IGNORED, GL_TIMESTAMP_EXT, GL_TIME_ELAPSED_EXT, GL_TRANSFORM_FEEDBACK, GL_TRANSFORM_FEEDBACK_ACTIVE, GL_TRANSFORM_FEEDBACK_BINDING, GL_TRANSFORM_FEEDBACK_BUFFER, GL_TRANSFORM_FEEDBACK_BUFFER_BINDING, GL_TRANSFORM_FEEDBACK_BUFFER_MODE, GL_TRANSFORM_FEEDBACK_BUFFER_SIZE, GL_TRANSFORM_FEEDBACK_BUFFER_START, GL_TRANSFORM_FEEDBACK_PAUSED, GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, GL_TRANSFORM_FEEDBACK_VARYINGS, GL_TRIANGLES, GL_TRIANGLE_FAN, GL_TRIANGLE_STRIP, GL_UNIFORM_ARRAY_STRIDE, GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS, GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES, GL_UNIFORM_BLOCK_BINDING, GL_UNIFORM_BLOCK_DATA_SIZE, GL_UNIFORM_BLOCK_INDEX, GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER, GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER, GL_UNIFORM_BUFFER, GL_UNIFORM_BUFFER_BINDING, GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT, GL_UNIFORM_BUFFER_SIZE, GL_UNIFORM_BUFFER_START, GL_UNIFORM_IS_ROW_MAJOR, GL_UNIFORM_MATRIX_STRIDE, GL_UNIFORM_OFFSET, GL_UNIFORM_SIZE, GL_UNIFORM_TYPE, GL_UNMASKED_RENDERER_WEBGL, GL_UNMASKED_VENDOR_WEBGL, GL_UNPACK_ALIGNMENT, GL_UNPACK_COLORSPACE_CONVERSION_WEBGL, GL_UNPACK_FLIP_Y_WEBGL, GL_UNPACK_IMAGE_HEIGHT, GL_UNPACK_PREMULTIPLY_ALPHA_WEBGL, GL_UNPACK_ROW_LENGTH, GL_UNPACK_SKIP_IMAGES, GL_UNPACK_SKIP_PIXELS, GL_UNPACK_SKIP_ROWS, GL_UNSIGNALED, GL_UNSIGNED_BYTE, GL_UNSIGNED_INT, GL_UNSIGNED_INT_10F_11F_11F_REV, GL_UNSIGNED_INT_24_8, GL_UNSIGNED_INT_24_8_WEBGL, GL_UNSIGNED_INT_2_10_10_10_REV, GL_UNSIGNED_INT_5_9_9_9_REV, GL_UNSIGNED_INT_SAMPLER_2D, GL_UNSIGNED_INT_SAMPLER_2D_ARRAY, GL_UNSIGNED_INT_SAMPLER_3D, GL_UNSIGNED_INT_SAMPLER_CUBE, GL_UNSIGNED_INT_VEC2, GL_UNSIGNED_INT_VEC3, GL_UNSIGNED_INT_VEC4, GL_UNSIGNED_NORMALIZED, GL_UNSIGNED_NORMALIZED_EXT, GL_UNSIGNED_SHORT, GL_UNSIGNED_SHORT_4_4_4_4, GL_UNSIGNED_SHORT_5_5_5_1, GL_UNSIGNED_SHORT_5_6_5, GL_VALIDATE_STATUS, GL_VENDOR, GL_VERSION, GL_VERTEX_ARRAY_BINDING, GL_VERTEX_ARRAY_BINDING_OES, GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, GL_VERTEX_ATTRIB_ARRAY_DIVISOR, GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE, GL_VERTEX_ATTRIB_ARRAY_ENABLED, GL_VERTEX_ATTRIB_ARRAY_INTEGER, GL_VERTEX_ATTRIB_ARRAY_NORMALIZED, GL_VERTEX_ATTRIB_ARRAY_POINTER, GL_VERTEX_ATTRIB_ARRAY_SIZE, GL_VERTEX_ATTRIB_ARRAY_STRIDE, GL_VERTEX_ATTRIB_ARRAY_TYPE, GL_VERTEX_SHADER, GL_VIEWPORT, GL_WAIT_FAILED, GL_ZERO };\n","export const isSSR = typeof window === 'undefined';\n","import { isSSR } from './ssr';\n\nexport const deviceInfo = (() => {\n if (isSSR) {\n return;\n }\n\n const { userAgent, platform, maxTouchPoints } = window.navigator;\n\n const isIOS = /(iphone|ipod|ipad)/i.test(userAgent);\n\n // Workaround for ipadOS, force detection as tablet\n // SEE: https://github.com/lancedikson/bowser/issues/329\n // SEE: https://stackoverflow.com/questions/58019463/how-to-detect-device-name-in-safari-on-ios-13-while-it-doesnt-show-the-correct\n const isIpad =\n platform === 'iPad' ||\n // @ts-expect-error window.MSStream is non standard\n (platform === 'MacIntel' && maxTouchPoints > 0 && !window.MSStream);\n\n const isAndroid = /android/i.test(userAgent);\n\n return {\n isIpad,\n isMobile: isAndroid || isIOS || isIpad,\n isSafari12: /Version\\/12.+Safari/.test(userAgent),\n };\n})();\n","// Caches\nconst array: number[] = [];\nconst charCodeCache: number[] = [];\n\n// Compute the difference (distance) between two strings\n// SEE: https://en.wikipedia.org/wiki/Levenshtein_distance\n// CREDIT: https://github.com/sindresorhus/leven (version 3.1.0)\nexport function getLevenshteinDistance(left: string, right: string): number {\n if (left === right) {\n return 0;\n }\n\n const swap = left;\n\n // Swapping the strings if `a` is longer than `b` so we know which one is the\n // shortest & which one is the longest\n if (left.length > right.length) {\n left = right;\n right = swap;\n }\n\n let leftLength = left.length;\n let rightLength = right.length;\n\n // Performing suffix trimming:\n // We can linearly drop suffix common to both strings since they\n // don't increase distance at all\n // Note: `~-` is the bitwise way to perform a `- 1` operation\n while (leftLength > 0 &&\n left.charCodeAt(~-leftLength) === right.charCodeAt(~-rightLength)) {\n leftLength--;\n rightLength--;\n }\n\n // Performing prefix trimming\n // We can linearly drop prefix common to both strings since they\n // don't increase distance at all\n let start = 0;\n\n while (start < leftLength &&\n left.charCodeAt(start) === right.charCodeAt(start)) {\n start++;\n }\n\n leftLength -= start;\n rightLength -= start;\n\n if (leftLength === 0) {\n return rightLength;\n }\n\n let bCharCode;\n let result = 0;\n let temp;\n let temp2;\n let i = 0;\n let j = 0;\n\n while (i < leftLength) {\n charCodeCache[i] = left.charCodeAt(start + i);\n array[i] = ++i;\n }\n\n while (j < rightLength) {\n bCharCode = right.charCodeAt(start + j);\n temp = j++;\n result = j;\n\n for (i = 0; i < leftLength; i++) {\n temp2 = bCharCode === charCodeCache[i] ? temp : temp + 1;\n temp = array[i];\n // eslint-disable-next-line no-multi-assign\n result = array[i] =\n temp > result\n ? temp2 > result\n ? result + 1\n : temp2\n : temp2 > temp\n ? temp + 1\n : temp2;\n }\n }\n\n return result;\n}\n","export function isDefined(val: T | undefined | null | void): val is T {\n return val !== undefined && val !== null;\n}\n","export class OutdatedBenchmarksError extends Error {\n constructor(message?: string) {\n super(message); // 'Error' breaks prototype chain here\n Object.setPrototypeOf(this, new.target.prototype); // restore prototype chain\n }\n}\n","// Data\nimport { version } from '../package.json';\n\n// Internal\nimport { BLOCKLISTED_GPUS } from './internal/blocklistedGPUS';\nimport { cleanRenderer } from './internal/cleanRenderer';\nimport { deobfuscateRenderer } from './internal/deobfuscateRenderer';\nimport { deviceInfo } from './internal/deviceInfo';\nimport { getLevenshteinDistance } from './internal/getLevenshteinDistance';\nimport { getGPUVersion } from './internal/getGPUVersion';\nimport { getWebGLContext } from './internal/getWebGLContext';\nimport { isSSR } from './internal/ssr';\nimport { isDefined } from './internal/util';\nimport { OutdatedBenchmarksError } from './internal/error';\n\n// Types\nexport interface GetGPUTier {\n /**\n * URL of directory where benchmark data is hosted.\n *\n * @default https://unpkg.com/detect-gpu@{version}/dist/benchmarks\n */\n benchmarksURL?: string;\n /**\n * Optionally pass in a WebGL context to avoid creating a temporary one\n * internally.\n */\n glContext?: WebGLRenderingContext | WebGL2RenderingContext;\n /**\n * Whether to fail if the system performance is low or if no hardware GPU is\n * available.\n *\n * @default false\n */\n failIfMajorPerformanceCaveat?: boolean;\n /**\n * Framerate per tier for mobile devices.\n *\n * @defaultValue [0, 15, 30, 60]\n */\n mobileTiers?: number[];\n /**\n * Framerate per tier for desktop devices.\n *\n * @defaultValue [0, 15, 30, 60]\n */\n desktopTiers?: number[];\n /**\n * Optionally override specific parameters. Used mainly for testing.\n */\n override?: {\n renderer?: string;\n /**\n * Override whether device is an iPad.\n */\n isIpad?: boolean;\n /**\n * Override whether device is a mobile device.\n */\n isMobile?: boolean;\n /**\n * Override device screen size.\n */\n screenSize?: { width: number; height: number };\n /**\n * Override how benchmark data is loaded\n */\n loadBenchmarks?: (file: string) => Promise;\n };\n}\n\nexport type TierType =\n | 'SSR'\n | 'WEBGL_UNSUPPORTED'\n | 'BLOCKLISTED'\n | 'FALLBACK'\n | 'BENCHMARK';\n\nexport type TierResult = {\n tier: number;\n type: TierType;\n isMobile?: boolean;\n fps?: number;\n gpu?: string;\n device?: string;\n};\n\nexport type ModelEntryScreen = [number, number, number, string | undefined];\n\nexport type ModelEntry = [string, string, 0 | 1, ModelEntryScreen[]];\n\nconst debug = false ? console.log : undefined;\n\nexport const getGPUTier = async ({\n mobileTiers = [0, 15, 30, 60],\n desktopTiers = [0, 15, 30, 60],\n override = {},\n glContext,\n failIfMajorPerformanceCaveat = false,\n benchmarksURL = `https://unpkg.com/detect-gpu@${version}/dist/benchmarks`,\n}: GetGPUTier = {}): Promise => {\n const queryCache: { [k: string]: Promise } = {};\n if (isSSR) {\n return {\n tier: 0,\n type: 'SSR',\n };\n }\n\n const {\n isIpad = !!deviceInfo?.isIpad,\n isMobile = !!deviceInfo?.isMobile,\n screenSize = window.screen,\n loadBenchmarks = async (file: string) => {\n const data: ModelEntry[] = await fetch(`${benchmarksURL}/${file}`).then(\n (response) => response.json()\n );\n\n // Remove version tag and check version is supported\n const version = parseInt(\n (data.shift() as unknown as string).split('.')[0],\n 10\n );\n if (version < 4) {\n throw new OutdatedBenchmarksError(\n 'Detect GPU benchmark data is out of date. Please update to version 4x'\n );\n }\n return data;\n },\n } = override;\n let { renderer } = override;\n const getGpuType = (renderer: string) => {\n const types = isMobile\n ? (['adreno', 'apple', 'mali-t', 'mali', 'nvidia', 'powervr'] as const)\n : (['intel', 'apple', 'amd', 'radeon', 'nvidia', 'geforce'] as const);\n for (const type of types) {\n if (renderer.includes(type)) {\n return type;\n }\n }\n };\n\n async function queryBenchmarks(renderer: string) {\n const type = getGpuType(renderer);\n if (!type) {\n return;\n }\n\n debug?.('queryBenchmarks - found type:', { type });\n\n const benchmarkFile = `${isMobile ? 'm' : 'd'}-${type}${\n isIpad ? '-ipad' : ''\n }.json`;\n\n const benchmark = (queryCache[benchmarkFile] =\n queryCache[benchmarkFile] ?? loadBenchmarks(benchmarkFile));\n let benchmarks: ModelEntry[];\n try {\n benchmarks = await benchmark;\n } catch (error) {\n if (error instanceof OutdatedBenchmarksError) {\n throw error;\n }\n debug?.(\"queryBenchmarks - couldn't load benchmark:\", { error });\n return;\n }\n\n const version = getGPUVersion(renderer);\n\n let matched = benchmarks.filter(\n ([, modelVersion]) => modelVersion === version\n );\n\n debug?.(\n `found ${matched.length} matching entries using version '${version}':`,\n\n matched.map(([model]) => model)\n );\n\n // If nothing matched, try comparing model names:\n if (!matched.length) {\n matched = benchmarks.filter(([model]) => model.includes(renderer));\n\n debug?.(\n `found ${matched.length} matching entries comparing model names`,\n {\n matched,\n }\n );\n }\n\n const matchCount = matched.length;\n\n if (matchCount === 0) {\n return;\n }\n\n // eslint-disable-next-line prefer-const\n let [gpu, , , fpsesByPixelCount] =\n matchCount > 1\n ? matched\n .map(\n (match) =>\n [match, getLevenshteinDistance(renderer, match[0])] as const\n )\n .sort(([, a], [, b]) => a - b)[0][0]\n : matched[0];\n\n debug?.(\n `${renderer} matched closest to ${gpu} with the following screen sizes`,\n JSON.stringify(fpsesByPixelCount)\n );\n\n let minDistance = Number.MAX_VALUE;\n let closest: ModelEntryScreen | undefined;\n const { devicePixelRatio } = window;\n const pixelCount =\n screenSize.width *\n devicePixelRatio *\n screenSize.height *\n devicePixelRatio;\n\n for (const match of fpsesByPixelCount) {\n const [width, height] = match;\n const entryPixelCount = width * height;\n const distance = Math.abs(pixelCount - entryPixelCount);\n\n if (distance < minDistance) {\n minDistance = distance;\n closest = match;\n }\n }\n\n if (!closest) {\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const [, , fps, device] = closest!;\n\n return [minDistance, fps, gpu, device] as const;\n };\n\n const toResult = (\n tier: number,\n type: TierType,\n gpu?: string,\n fps?: number,\n device?: string\n ) => ({\n device,\n fps,\n gpu,\n isMobile,\n tier,\n type,\n });\n\n let renderers: string[];\n let rawRenderer = '';\n\n if (!renderer) {\n const gl =\n glContext ||\n getWebGLContext(deviceInfo?.isSafari12, failIfMajorPerformanceCaveat);\n\n if (!gl) {\n return toResult(0, 'WEBGL_UNSUPPORTED');\n }\n\n const debugRendererInfo = gl.getExtension('WEBGL_debug_renderer_info');\n\n if (debugRendererInfo) {\n renderer = gl.getParameter(debugRendererInfo.UNMASKED_RENDERER_WEBGL);\n }\n\n if (!renderer) {\n return toResult(1, 'FALLBACK');\n }\n\n rawRenderer = renderer;\n renderer = cleanRenderer(renderer);\n renderers = deobfuscateRenderer(gl, renderer, isMobile);\n } else {\n renderer = cleanRenderer(renderer);\n renderers = [renderer];\n }\n\n const results = (await Promise.all(renderers.map(queryBenchmarks)))\n .filter(isDefined)\n .sort(([aDis = Number.MAX_VALUE, aFps], [bDis = Number.MAX_VALUE, bFps]) =>\n aDis === bDis ? aFps - bFps : aDis - bDis\n );\n if (!results.length) {\n const blocklistedModel: string | undefined = BLOCKLISTED_GPUS.find(\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n (blocklistedModel) => renderer!.includes(blocklistedModel)\n );\n return blocklistedModel\n ? toResult(0, 'BLOCKLISTED', blocklistedModel)\n : toResult(1, 'FALLBACK', `${renderer} (${rawRenderer})`);\n }\n\n const [, fps, model, device] = results[0];\n\n if (fps === -1) {\n return toResult(0, 'BLOCKLISTED', model, fps, device);\n }\n\n const tiers = isMobile ? mobileTiers : desktopTiers;\n let tier = 0;\n\n for (let i = 0; i < tiers.length; i++) {\n if (fps >= tiers[i]) {\n tier = i;\n }\n }\n\n return toResult(tier, 'BENCHMARK', model, fps, device);\n};\n","export function getWebGLContext(isSafari12?: boolean,\n failIfMajorPerformanceCaveat = false) {\n const attributes: {\n alpha: boolean;\n antialias: boolean;\n depth: boolean;\n failIfMajorPerformanceCaveat: boolean;\n powerPreference?: string;\n stencil: boolean;\n } = {\n alpha: false,\n antialias: false,\n depth: false,\n failIfMajorPerformanceCaveat,\n powerPreference: 'high-performance',\n stencil: false,\n };\n\n // Workaround for Safari 12, which otherwise crashes with powerPreference set\n // to high-performance: https://github.com/pmndrs/detect-gpu/issues/5\n if (isSafari12) {\n delete attributes.powerPreference;\n }\n\n const canvas = window.document.createElement('canvas');\n\n const gl = (canvas.getContext('webgl', attributes) ||\n canvas.getContext(\n 'experimental-webgl',\n attributes\n )) as WebGLRenderingContext | null;\n\n return gl ?? undefined;\n}\n","// Internal\nimport { deobfuscateAppleGPU } from './deobfuscateAppleGPU';\n\nexport function deobfuscateRenderer(\n gl: WebGLRenderingContext | WebGL2RenderingContext,\n renderer: string,\n isMobileTier: boolean\n) {\n return renderer === 'apple gpu'\n ? deobfuscateAppleGPU(gl, renderer, isMobileTier)\n : [renderer];\n}\n","// Vendor\nimport {\n GL_ARRAY_BUFFER,\n GL_COLOR_BUFFER_BIT,\n GL_FLOAT,\n GL_FRAGMENT_SHADER,\n GL_RGBA,\n GL_STATIC_DRAW,\n GL_TRIANGLES,\n GL_UNSIGNED_BYTE,\n GL_VERTEX_SHADER,\n} from 'webgl-constants';\n\n// Internal\nimport { deviceInfo } from './deviceInfo';\n\nconst debug = false ? console.warn : undefined;\n\nexport function deobfuscateAppleGPU(\n gl: WebGLRenderingContext,\n renderer: string,\n isMobileTier: boolean\n) {\n if (!isMobileTier) {\n debug?.('Safari 14+ obfuscates its GPU type and version, using fallback');\n return [renderer];\n }\n const pixelId = calculateMagicPixelId(gl);\n const codeA = '801621810' as const;\n const codeB = '8016218135' as const;\n const codeC = '80162181161' as const;\n\n // All chipsets that support at least iOS 12:\n const possibleChipsets: [\n string,\n typeof codeA | typeof codeB | typeof codeC,\n number\n ][] = deviceInfo?.isIpad\n ? [\n // ['a4', 5], // ipad 1st gen\n // ['a5', 9], // ipad 2 / ipad mini 1st gen\n // ['a5x', 9], // ipad 3rd gen\n // ['a6x', 10], // ipad 4th gen\n ['a7', codeC, 12], // ipad air / ipad mini 2 / ipad mini 3\n ['a8', codeB, 15], // pad mini 4\n ['a8x', codeB, 15], // ipad air 2\n ['a9', codeB, 15], // ipad 5th gen\n ['a9x', codeB, 15], // pro 9.7 2016 / pro 12.9 2015\n ['a10', codeB, 15], // ipad 7th gen / ipad 6th gen\n ['a10x', codeB, 15], // pro 10.5 2017 / pro 12.9 2nd gen, 2017\n ['a12', codeA, 15], // ipad 8th gen / ipad air 3rd gen / ipad mini 5th gen\n ['a12x', codeA, 15], // pro 11 1st gen / pro 12.9 3rd gen\n ['a12z', codeA, 15], // pro 12.9 4th gen / pro 11 2nd gen\n ['a14', codeA, 15], // ipad air 4th gen\n ['m1', codeA, 15], // ipad pro 11 2nd gen / 12.9 5th gen\n ]\n : [\n // ['a4', 7], // 4 / ipod touch 4th gen\n // ['a5', 9], // 4S / ipod touch 5th gen\n // ['a6', 10], // 5 / 5C\n ['a7', codeC, 12], // 5S\n ['a8', codeB, 12], // 6 / 6 plus / ipod touch 6th gen\n ['a9', codeB, 15], // 6s / 6s plus/ se 1st gen\n ['a10', codeB, 15], // 7 / 7 plus / iPod Touch 7th gen\n ['a11', codeA, 15], // 8 / 8 plus / X\n ['a12', codeA, 15], // XS / XS Max / XR\n ['a13', codeA, 15], // 11 / 11 pro / 11 pro max / se 2nd gen\n ['a14', codeA, 15], // 12 / 12 mini / 12 pro / 12 pro max\n ];\n let chipsets: typeof possibleChipsets;\n\n // In iOS 14.x Apple started normalizing the outcome of this hack,\n // we use this fact to limit the list to devices that support ios 14+\n if (pixelId === '80162181255') {\n chipsets = possibleChipsets.filter(([, , iosVersion]) => iosVersion >= 14);\n } else {\n chipsets = possibleChipsets.filter(([, id]) => id === pixelId);\n // If nothing was found to match the pixel id, include all chipsets:\n if (!chipsets.length) {\n chipsets = possibleChipsets;\n }\n }\n const renderers = chipsets.map(([gpu]) => `apple ${gpu} gpu`);\n debug?.(\n `iOS 12.2+ obfuscates its GPU type and version, using closest matches: ${JSON.stringify(renderers)}`\n );\n return renderers;\n}\n\n// Apple GPU (iOS 12.2+, Safari 14+)\n// SEE: https://github.com/pmndrs/detect-gpu/issues/7\n// CREDIT: https://medium.com/@Samsy/detecting-apple-a10-iphone-7-to-a11-iphone-8-and-b019b8f0eb87\n// CREDIT: https://github.com/Samsy/appleGPUDetection/blob/master/index.js\nfunction calculateMagicPixelId(gl: WebGLRenderingContext) {\n const vertexShaderSource = /* glsl */ `\n precision highp float;\n attribute vec3 aPosition;\n varying float vvv;\n void main() {\n vvv = 0.31622776601683794;\n gl_Position = vec4(aPosition, 1.0);\n }\n `;\n\n const fragmentShaderSource = /* glsl */ `\n precision highp float;\n varying float vvv;\n void main() {\n vec4 enc = vec4(1.0, 255.0, 65025.0, 16581375.0) * vvv;\n enc = fract(enc);\n enc -= enc.yzww * vec4(1.0 / 255.0, 1.0 / 255.0, 1.0 / 255.0, 0.0);\n gl_FragColor = enc;\n }\n `;\n\n const vertexShader = gl.createShader(GL_VERTEX_SHADER);\n const fragmentShader = gl.createShader(GL_FRAGMENT_SHADER);\n const program = gl.createProgram();\n if (!(fragmentShader && vertexShader && program)) return;\n gl.shaderSource(vertexShader, vertexShaderSource);\n gl.shaderSource(fragmentShader, fragmentShaderSource);\n gl.compileShader(vertexShader);\n gl.compileShader(fragmentShader);\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n\n gl.linkProgram(program);\n\n gl.detachShader(program, vertexShader);\n gl.detachShader(program, fragmentShader);\n gl.deleteShader(vertexShader);\n gl.deleteShader(fragmentShader);\n\n gl.useProgram(program);\n\n const vertexArray = gl.createBuffer();\n gl.bindBuffer(GL_ARRAY_BUFFER, vertexArray);\n gl.bufferData(\n GL_ARRAY_BUFFER,\n new Float32Array([-1, -1, 0, 3, -1, 0, -1, 3, 0]),\n GL_STATIC_DRAW\n );\n\n const aPosition = gl.getAttribLocation(program, 'aPosition');\n gl.vertexAttribPointer(aPosition, 3, GL_FLOAT, false, 0, 0);\n gl.enableVertexAttribArray(aPosition);\n\n gl.clearColor(1, 1, 1, 1);\n gl.clear(GL_COLOR_BUFFER_BIT);\n gl.viewport(0, 0, 1, 1);\n gl.drawArrays(GL_TRIANGLES, 0, 3);\n\n const pixels = new Uint8Array(4);\n gl.readPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixels);\n\n gl.deleteProgram(program);\n gl.deleteBuffer(vertexArray);\n return pixels.join('');\n}\n","export function getGPUVersion(model: string) {\n model = model.replace(/\\([^)]+\\)/, '');\n\n const matches =\n // First set of digits\n model.match(/\\d+/) ||\n // If the renderer did not contain any numbers, match letters\n model.match(/(\\W|^)([A-Za-z]{1,3})(\\W|$)/g);\n\n // Remove any non-word characters and also remove 'amd' which could be matched\n // in the clause above\n return matches?.join('').replace(/\\W|amd/g, '') ?? '';\n}\n","import renderingEngineCache from './renderingEngineCache';\nimport type { IRenderingEngine } from '../types';\n\n/**\n * Method to retrieve a RenderingEngine by its unique identifier.\n *\n * @example\n * How to get a RenderingEngine that was created earlier:\n * ```javascript\n * import { RenderingEngine, getRenderingEngine } from 'vtkjs-viewport';\n *\n * const renderingEngine = new RenderingEngine('my-engine');\n *\n * // getting reference to rendering engine later...\n * const renderingEngine = getRenderingEngine('my-engine');\n * ```\n *\n * @param id - The identifier that was used to create the RenderingEngine\n * @returns the matching RenderingEngine, or `undefined` if there is no match\n * @public\n */\nexport function getRenderingEngine(id: string): IRenderingEngine | undefined {\n return renderingEngineCache.get(id);\n}\n\n/**\n * Get all the rendering engines that are currently registered\n * @returns An array of rendering engines.\n */\nexport function getRenderingEngines(): IRenderingEngine[] | undefined {\n return renderingEngineCache.getAll();\n}\n\nexport default getRenderingEngine;\n","import { getGPUTier } from 'detect-gpu';\nimport { SharedArrayBufferModes } from './enums';\nimport { getRenderingEngines } from './RenderingEngine/getRenderingEngine';\nlet csRenderInitialized = false;\nlet useSharedArrayBuffer = true;\nlet sharedArrayBufferMode = SharedArrayBufferModes.TRUE;\nimport { deepMerge } from './utilities';\nimport { Cornerstone3DConfig } from './types';\n// TODO: move sharedArrayBuffer into config.\n// TODO: change config into a class with methods to better control get/set\nconst defaultConfig: Cornerstone3DConfig = {\n gpuTier: undefined,\n detectGPUConfig: {},\n rendering: {\n useCPURendering: false,\n // GPU rendering options\n preferSizeOverAccuracy: false,\n useNorm16Texture: false, // _hasNorm16TextureSupport(),\n strictZSpacingForVolumeViewport: true,\n },\n // cache\n // ...\n};\n\nlet config: Cornerstone3DConfig = {\n gpuTier: undefined,\n detectGPUConfig: {},\n rendering: {\n useCPURendering: false,\n // GPU rendering options\n preferSizeOverAccuracy: false,\n useNorm16Texture: false, // _hasNorm16TextureSupport(),\n strictZSpacingForVolumeViewport: true,\n },\n // cache\n // ...\n};\n\nfunction _getGLContext(): RenderingContext {\n // Create canvas element. The canvas is not added to the\n // document itself, so it is never displayed in the\n // browser window.\n const canvas = document.createElement('canvas');\n // Get WebGLRenderingContext from canvas element.\n const gl =\n canvas.getContext('webgl2') ||\n canvas.getContext('webgl') ||\n canvas.getContext('experimental-webgl');\n\n return gl;\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/By_example/Detect_WebGL\nfunction _hasActiveWebGLContext() {\n const gl = _getGLContext();\n\n // Check if the context is either WebGLRenderingContext or WebGL2RenderingContext\n return (\n gl instanceof WebGLRenderingContext || gl instanceof WebGL2RenderingContext\n );\n}\n\nfunction hasSharedArrayBuffer() {\n try {\n /*eslint-disable no-constant-condition */\n if (new SharedArrayBuffer(0)) {\n return true;\n } else {\n return false;\n }\n } catch {\n return false;\n }\n}\n\n// Todo: commenting this out until proper support for int16 textures\n// are added to browsers, current implementation is buggy\n// function _hasNorm16TextureSupport() {\n// const gl = _getGLContext();\n\n// if (gl) {\n// const ext = (gl as WebGL2RenderingContext).getExtension(\n// 'EXT_texture_norm16'\n// );\n\n// if (ext) {\n// return true;\n// }\n// }\n\n// return false;\n// }\n\n/**\n * Initialize the cornerstone-core. If the browser has a webgl context and\n * the detected gpu (by detect-gpu library) indicates the GPU is not low end we\n * will use webgl GPU rendering. Otherwise we will use cpu rendering.\n *\n * @param configuration - A configuration object\n * @returns A promise that resolves to true cornerstone has been initialized successfully.\n * @category Initialization\n */\nasync function init(configuration = config): Promise {\n if (csRenderInitialized) {\n return csRenderInitialized;\n }\n\n // merge configs\n config = deepMerge(defaultConfig, configuration);\n\n // gpuTier\n const hasWebGLContext = _hasActiveWebGLContext();\n if (!hasWebGLContext) {\n console.log('CornerstoneRender: GPU not detected, using CPU rendering');\n config.rendering.useCPURendering = true;\n } else {\n config.gpuTier =\n config.gpuTier || (await getGPUTier(config.detectGPUConfig));\n console.log(\n 'CornerstoneRender: Using detect-gpu to get the GPU benchmark:',\n config.gpuTier\n );\n if (config.gpuTier.tier < 1) {\n console.log(\n 'CornerstoneRender: GPU is not powerful enough, using CPU rendering'\n );\n config.rendering.useCPURendering = true;\n } else {\n console.log('CornerstoneRender: using GPU rendering');\n }\n }\n\n setUseSharedArrayBuffer(sharedArrayBufferMode);\n\n csRenderInitialized = true;\n return csRenderInitialized;\n}\n\n/**\n * It sets the useCPURenderingOnlyForDebugOrTests variable to the status value.\n * This only should be used for debugging or tests. DO NOT USE IT IF YOU ARE NOT\n * SURE WHAT YOU ARE DOING.\n * @param status - boolean\n * @category Initialization\n *\n */\nfunction setUseCPURendering(status: boolean): void {\n config.rendering.useCPURendering = status;\n csRenderInitialized = true;\n _updateRenderingPipelinesForAllViewports();\n}\n\nfunction setPreferSizeOverAccuracy(status: boolean): void {\n config.rendering.preferSizeOverAccuracy = status;\n csRenderInitialized = true;\n _updateRenderingPipelinesForAllViewports();\n}\n\n/**\n * Resets the cornerstone-core init state if it has been manually\n * initialized to force use the cpu rendering (e.g., for tests)\n * @category Initialization\n *\n */\nfunction resetUseCPURendering(): void {\n config.rendering.useCPURendering = !_hasActiveWebGLContext();\n _updateRenderingPipelinesForAllViewports();\n}\n\n/**\n * Returns whether or not we are using CPU rendering.\n * @returns true if we are using CPU rendering.\n * @category Initialization\n *\n */\nfunction getShouldUseCPURendering(): boolean {\n return config.rendering.useCPURendering;\n}\n\nfunction setUseSharedArrayBuffer(mode: SharedArrayBufferModes | boolean): void {\n if (mode == SharedArrayBufferModes.AUTO) {\n sharedArrayBufferMode = SharedArrayBufferModes.AUTO;\n const hasSharedBuffer = hasSharedArrayBuffer();\n if (!hasSharedBuffer) {\n useSharedArrayBuffer = false;\n console.warn(\n `CornerstoneRender: SharedArray Buffer not allowed, performance may be slower.\n Try ensuring page is cross-origin isolated to enable SharedArrayBuffer.`\n );\n } else {\n useSharedArrayBuffer = true;\n // eslint-disable-next-line no-console\n console.log('CornerstoneRender: using SharedArrayBuffer');\n }\n return;\n }\n\n if (mode == SharedArrayBufferModes.TRUE || mode == true) {\n sharedArrayBufferMode = SharedArrayBufferModes.TRUE;\n useSharedArrayBuffer = true;\n return;\n }\n\n if (mode == SharedArrayBufferModes.FALSE || mode == false) {\n sharedArrayBufferMode = SharedArrayBufferModes.FALSE;\n useSharedArrayBuffer = false;\n return;\n }\n}\n\nfunction resetUseSharedArrayBuffer(): void {\n setUseSharedArrayBuffer(sharedArrayBufferMode);\n}\n\nfunction getShouldUseSharedArrayBuffer(): boolean {\n return useSharedArrayBuffer;\n}\n\n/**\n *\n * Returns whether or not cornerstone-core has been initialized.\n * @returns true if the cornerstone render has been initialized.\n * @category Initialization\n *\n */\nfunction isCornerstoneInitialized(): boolean {\n return csRenderInitialized;\n}\n\n/**\n * This function returns a copy of the config object. This is used to prevent the\n * config object from being modified by other parts of the program.\n * @returns A copy of the config object.\n */\nfunction getConfiguration(): Cornerstone3DConfig {\n // return a copy\n // return JSON.parse(JSON.stringify(config));\n return config;\n}\n\nfunction setConfiguration(c: Cornerstone3DConfig) {\n config = c;\n _updateRenderingPipelinesForAllViewports();\n}\n\n/**\n * Update rendering pipelines for all viewports in all rendering engines.\n * @returns {void}\n * @category Initialization\n */\nfunction _updateRenderingPipelinesForAllViewports(): void {\n getRenderingEngines().forEach((engine) =>\n engine\n .getViewports()\n .forEach((viewport) => viewport.updateRenderingPipeline?.())\n );\n}\n\nexport {\n init,\n getShouldUseCPURendering,\n getShouldUseSharedArrayBuffer,\n isCornerstoneInitialized,\n setUseCPURendering,\n setUseSharedArrayBuffer,\n setPreferSizeOverAccuracy,\n resetUseCPURendering,\n resetUseSharedArrayBuffer,\n getConfiguration,\n setConfiguration,\n};\n","import global from '../global';\nimport { getShouldUseSharedArrayBuffer } from '../init';\n\n/**\n * A helper function that creates a new Float32Array that utilized a shared\n * array buffer. This allows the array to be updated simultaneously in\n * workers or the main thread. Depending on the system (the CPU, the OS, the Browser)\n * it can take a while until the change is propagated to all contexts.\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer|MDN: SharedArrayBuffer}\n * @remarks\n * We use SharedArrayBuffers in our ImageCache class. It's what allows us to\n * stream data to build a volume. It's important to note that SharedArrayBuffer\n * does not work out of the box for all web browsers. In some, it is disabled\n * behind a flag; in others, it has been removed entirely.\n *\n * @example\n * Creating an array for a Volume with known dimensions:\n * ```\n * const dimensions = [512, 512, 25];\n * const scalarData = createUint8SharedArray(dimensions[0] * dimensions[1] * dimensions[2]);\n * ```\n *\n * @param length - frame size * number of frames\n * @returns a Uint8Array with an underlying SharedArrayBuffer\n * @public\n */\nfunction createUint8SharedArray(length: number): Uint8Array {\n if (!getShouldUseSharedArrayBuffer()) {\n throw new Error(\n 'Your page is NOT cross-origin isolated, see https://developer.mozilla.org/en-US/docs/Web/API/crossOriginIsolated'\n );\n }\n if (window.SharedArrayBuffer === undefined) {\n throw new Error(\n 'SharedArrayBuffer is NOT supported in your browser see https://developer.chrome.com/blog/enabling-shared-array-buffer/'\n );\n }\n\n const sharedArrayBuffer = new SharedArrayBuffer(length);\n\n return new Uint8Array(sharedArrayBuffer);\n}\n\nexport default createUint8SharedArray;\n","import global from '../global';\nimport { getShouldUseSharedArrayBuffer } from '../init';\n\n/**\n * A helper function that creates a new Float32Array that utilized a shared\n * array buffer. This allows the array to be updated simultaneously in\n * workers or the main thread. Depending on the system (the CPU, the OS, the Browser)\n * it can take a while until the change is propagated to all contexts.\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer|MDN: SharedArrayBuffer}\n * @remarks\n * We use SharedArrayBuffers in our ImageCache class. It's what allows us to\n * stream data to build a volume. It's important to note that SharedArrayBuffer\n * does not work out of the box for all web browsers. In some, it is disabled\n * behind a flag; in others, it has been removed entirely.\n *\n * @example\n * Creating an array for a Volume with known dimensions:\n * ```\n * const dimensions = [512, 512, 25];\n * const scalarData = createFloat32SharedArray(dimensions[0] * dimensions[1] * dimensions[2]);\n * ```\n *\n * @param length - frame size * number of frames\n * @returns a Float32Array with an underlying SharedArrayBuffer\n * @public\n */\nfunction createFloat32SharedArray(length: number): Float32Array {\n if (!getShouldUseSharedArrayBuffer()) {\n throw new Error(\n 'Your page is NOT cross-origin isolated, see https://developer.mozilla.org/en-US/docs/Web/API/crossOriginIsolated'\n );\n }\n if (window.SharedArrayBuffer === undefined) {\n throw new Error(\n 'SharedArrayBuffer is NOT supported in your browser see https://developer.chrome.com/blog/enabling-shared-array-buffer/'\n );\n }\n\n const sharedArrayBuffer = new SharedArrayBuffer(length * 4);\n\n return new Float32Array(sharedArrayBuffer);\n}\n\nexport default createFloat32SharedArray;\n","import global from '../global';\n/**\n * A helper function that creates a new Uint16 that utilized a shared\n * array buffer. This allows the array to be updated simultaneously in\n * workers or the main thread. Depending on the system (the CPU, the OS, the Browser)\n * it can take a while until the change is propagated to all contexts.\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer|MDN: SharedArrayBuffer}\n * @remarks\n * We use SharedArrayBuffers in our ImageCache class. It's what allows us to\n * stream data to build a volume. It's important to note that SharedArrayBuffer\n * does not work out of the box for all web browsers. In some, it is disabled\n * behind a flag; in others, it has been removed entirely.\n *\n * @example\n * Creating an array for a Volume with known dimensions:\n * ```\n * const dimensions = [512, 512, 25];\n * const scalarData = createUint16SharedArray(dimensions[0] * dimensions[1] * dimensions[2]);\n * ```\n *\n * @param length - frame size * number of frames\n * @returns a Uint8Array with an underlying SharedArrayBuffer\n * @public\n */\nfunction createUint16SharedArray(length: number): Uint16Array {\n if (!window.crossOriginIsolated) {\n throw new Error(\n 'Your page is NOT cross-origin isolated, see https://developer.mozilla.org/en-US/docs/Web/API/crossOriginIsolated'\n );\n }\n if (window.SharedArrayBuffer === undefined) {\n throw new Error(\n 'SharedArrayBuffer is NOT supported in your browser see https://developer.chrome.com/blog/enabling-shared-array-buffer/'\n );\n }\n\n const sharedArrayBuffer = new SharedArrayBuffer(length * 2);\n\n return new Uint16Array(sharedArrayBuffer);\n}\n\nexport default createUint16SharedArray;\n","import global from '../global';\n/**\n * A helper function that creates a new Int16 that utilized a shared\n * array buffer. This allows the array to be updated simultaneously in\n * workers or the main thread. Depending on the system (the CPU, the OS, the Browser)\n * it can take a while until the change is propagated to all contexts.\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer|MDN: SharedArrayBuffer}\n * @remarks\n * We use SharedArrayBuffers in our ImageCache class. It's what allows us to\n * stream data to build a volume. It's important to note that SharedArrayBuffer\n * does not work out of the box for all web browsers. In some, it is disabled\n * behind a flag; in others, it has been removed entirely.\n *\n * @example\n * Creating an array for a Volume with known dimensions:\n * ```\n * const dimensions = [512, 512, 25];\n * const scalarData = createInt16SharedArray(dimensions[0] * dimensions[1] * dimensions[2]);\n * ```\n *\n * @param length - frame size * number of frames\n * @returns a Int8Array with an underlying SharedArrayBuffer\n * @public\n */\nfunction createInt16SharedArray(length: number): Int16Array {\n if (!window.crossOriginIsolated) {\n throw new Error(\n 'Your page is NOT cross-origin isolated, see https://developer.mozilla.org/en-US/docs/Web/API/crossOriginIsolated'\n );\n }\n if (window.SharedArrayBuffer === undefined) {\n throw new Error(\n 'SharedArrayBuffer is NOT supported in your browser see https://developer.chrome.com/blog/enabling-shared-array-buffer/'\n );\n }\n\n const sharedArrayBuffer = new SharedArrayBuffer(length * 2);\n\n return new Int16Array(sharedArrayBuffer);\n}\n\nexport default createInt16SharedArray;\n","// This module defines a way to access various metadata about an imageId. This layer of abstraction exists\n// So metadata can be provided in different ways (e.g. by parsing DICOM P10 or by a WADO-RS document)\n\nconst providers = [];\n\n/**\n * Adds a metadata provider with the specified priority\n * @param provider - Metadata provider function\n * @param priority - 0 is default/normal, > 0 is high, < 0 is low\n *\n * @category MetaData\n */\nexport function addProvider(\n provider: (type: string, query: any) => any,\n priority = 0\n): void {\n let i;\n\n // Find the right spot to insert this provider based on priority\n for (i = 0; i < providers.length; i++) {\n if (providers[i].priority <= priority) {\n break;\n }\n }\n\n // Insert the decode task at position i\n providers.splice(i, 0, {\n priority,\n provider,\n });\n}\n\n/**\n * Removes the specified provider\n *\n * @param provider - Metadata provider function\n *\n * @category MetaData\n */\nexport function removeProvider(\n provider: (type: string, query: any) => { any }\n): void {\n for (let i = 0; i < providers.length; i++) {\n if (providers[i].provider === provider) {\n providers.splice(i, 1);\n\n break;\n }\n }\n}\n\n/**\n * Removes all providers\n *\n * @category MetaData\n */\nexport function removeAllProviders(): void {\n while (providers.length > 0) {\n providers.pop();\n }\n}\n\n/**\n * Gets metadata from the registered metadata providers. Will call each one from highest priority to lowest\n * until one responds\n *\n * @param type - The type of metadata requested from the metadata store\n * @param query - The query for the metadata store, often imageId\n *\n * @returns The metadata retrieved from the metadata store\n * @category MetaData\n */\nfunction getMetaData(type: string, query: string): any {\n // Invoke each provider in priority order until one returns something\n for (let i = 0; i < providers.length; i++) {\n const result = providers[i].provider(type, query);\n\n if (result !== undefined) {\n return result;\n }\n }\n}\n\nexport { getMetaData as get };\n","import { vec3 } from 'gl-matrix';\nimport { IImageVolume, Point3 } from '../types';\n\n/**\n * Given an `imageVolume` and a normal direction (`viewPlaneNormal`), calculates\n * the spacing between voxels in the normal direction. If (`viewPlaneNormal`) is\n * parallel to one of the directions you will obtain the spacing in that direction.\n * Otherwise each of the `imageVolume`'s directions are projected onto the volume,\n * so that you obtain a spacing of the order of \"seeing a new set of voxels if the camera where to dolly\".\n *\n * @param imageVolume - The image volume to calculate the spacing in the normal direction.\n * @param viewPlaneNormal - The normal direction of the view plane.\n * @returns\n */\nexport default function getSpacingInNormalDirection(\n imageVolume: IImageVolume,\n viewPlaneNormal: Point3\n): number {\n const { direction, spacing } = imageVolume;\n\n // Calculate size of spacing vector in normal direction\n const iVector = direction.slice(0, 3) as Point3;\n const jVector = direction.slice(3, 6) as Point3;\n const kVector = direction.slice(6, 9) as Point3;\n\n const dotProducts = [\n vec3.dot(iVector, viewPlaneNormal),\n vec3.dot(jVector, viewPlaneNormal),\n vec3.dot(kVector, viewPlaneNormal),\n ];\n\n const projectedSpacing = vec3.create();\n\n vec3.set(\n projectedSpacing,\n dotProducts[0] * spacing[0],\n dotProducts[1] * spacing[1],\n dotProducts[2] * spacing[2]\n );\n\n const spacingInNormalDirection = vec3.length(projectedSpacing);\n\n return spacingInNormalDirection;\n}\n","import { vec3 } from 'gl-matrix';\nimport * as metaData from '../metaData';\nimport type { IImageVolume, Point3 } from '../types';\n\nimport getSpacingInNormalDirection from './getSpacingInNormalDirection';\nimport { EPSILON } from '../constants';\n\n/**\n * Given an image, a point in space and the viewPlaneNormal it returns the\n * closest imageId of the image volume that is within half voxel spacing\n * of the point in space.\n * @param imageVolume - The image volume\n * @param worldPos - The position in the world coordinate system (from mouse click)\n * @param viewPlaneNormal - The normal vector of the viewport\n *\n * @returns The imageId for the tool.\n */\nexport default function getClosestImageId(\n imageVolume: IImageVolume,\n worldPos: Point3,\n viewPlaneNormal: Point3\n): string {\n if (!imageVolume) {\n return;\n }\n\n const { direction, imageIds } = imageVolume;\n\n if (!imageIds || !imageIds.length) {\n return;\n }\n\n // 1. Get ScanAxis vector\n const kVector = direction.slice(6, 9);\n\n // 2. Check if scanAxis is not parallel to camera viewPlaneNormal\n const dotProducts = vec3.dot(kVector as Point3, viewPlaneNormal);\n\n // 2.a if imagePlane is not parallel to the camera: tool is not drawn on an\n // imaging plane, return\n if (Math.abs(dotProducts) < 1 - EPSILON) {\n return;\n }\n\n // 3. Calculate Spacing the in the normal direction, this will get used to\n // check whether we are withing a slice\n const spacingInNormalDirection = getSpacingInNormalDirection(\n imageVolume,\n viewPlaneNormal\n );\n\n const halfSpacingInNormalDirection = spacingInNormalDirection / 2;\n\n // 4. Iterate over all imageIds and check if the tool point (worldPos) is\n // withing one of the slices defined by an imageId\n let imageIdForTool;\n for (let i = 0; i < imageIds.length; i++) {\n const imageId = imageIds[i];\n\n // 4.a Get metadata for the imageId\n const { imagePositionPatient } = metaData.get('imagePlaneModule', imageId);\n\n // 4.b Calculate the direction vector from annotation. point to the first voxel\n // of this image defined by imageId\n const dir = vec3.create();\n vec3.sub(dir, worldPos, imagePositionPatient);\n\n // 4.c Calculate the distance between the vector above and the viewplaneNormal\n // i.e., projected distance\n const dot = vec3.dot(dir, viewPlaneNormal);\n\n // 4.d If the distance is withing range, return the imageId\n if (Math.abs(dot) < halfSpacingInNormalDirection) {\n imageIdForTool = imageId;\n }\n }\n\n return imageIdForTool;\n}\n","import {\n ICache,\n IImage,\n IImageVolume,\n IGeometry,\n IImageLoadObject,\n IVolumeLoadObject,\n IGeometryLoadObject,\n ICachedImage,\n ICachedVolume,\n ICachedGeometry,\n EventTypes,\n} from '../types';\nimport { triggerEvent, imageIdToURI } from '../utilities';\nimport eventTarget from '../eventTarget';\nimport Events from '../enums/Events';\n\nconst ONE_GB = 1073741824;\n\n/**\n * Stores images, volumes and geometry.\n * There are two sizes - the max cache size, that controls the overal maximum\n * size, and the instance size, which controls how big any single object can\n * be. Defaults are 3 GB and 2 GB - 8 bytes (just enough to allow allocating it\n * without crashing).\n * The 3 gb is tuned to the chromium garbage collection cycle to allow image volumes\n * to be used/discarded.\n */\nclass Cache implements ICache {\n // used to store image data (2d)\n private readonly _imageCache = new Map(); // volatile space\n // used to store volume data (3d)\n private readonly _volumeCache = new Map(); // non-volatile space\n // Todo: contour for now, but will be used for surface, etc.\n private readonly _geometryCache: Map;\n\n private _imageCacheSize = 0;\n private _volumeCacheSize = 0;\n private _maxCacheSize = 3 * ONE_GB;\n private _maxInstanceSize = 2 * ONE_GB - 8;\n\n constructor() {\n // used to store object data (contour, surface, etc.)\n this._geometryCache = new Map();\n }\n\n /**\n * Set the maximum cache Size\n *\n * Maximum cache size should be set before adding the data. If set after,\n * and it is smaller than the current size, will cause issues.\n *\n * @param newMaxCacheSize - new maximum cache size\n *\n */\n public setMaxCacheSize = (newMaxCacheSize: number): void => {\n if (!newMaxCacheSize || typeof newMaxCacheSize !== 'number') {\n const errorMessage = `New max cacheSize ${this._maxCacheSize} should be defined and should be a number.`;\n throw new Error(errorMessage);\n }\n\n this._maxCacheSize = newMaxCacheSize;\n };\n\n /**\n * Checks if there is enough space in the cache for requested byte size\n *\n * It returns false, if the sum of volatile (image) cache and unallocated cache\n * is less than the requested byteLength\n *\n * @param byteLength - byte length of requested byte size\n *\n * @returns - boolean indicating if there is enough space in the cache\n */\n public isCacheable = (byteLength: number): boolean => {\n if (byteLength > this._maxInstanceSize) {\n return false;\n }\n const unallocatedSpace = this.getBytesAvailable();\n const imageCacheSize = this._imageCacheSize;\n const availableSpace = unallocatedSpace + imageCacheSize;\n\n return availableSpace > byteLength;\n };\n\n /**\n * Returns maximum CacheSize allowed\n *\n * @returns maximum allowed cache size\n */\n public getMaxCacheSize = (): number => this._maxCacheSize;\n\n /**\n * Returns maximum size of a single instance (volume or single image)\n *\n * @returns maximum instance size\n */\n public getMaxInstanceSize = (): number => this._maxInstanceSize;\n\n /**\n * Returns current size of the cache\n *\n * @returns current size of the cache\n */\n public getCacheSize = (): number =>\n this._imageCacheSize + this._volumeCacheSize;\n\n /**\n * Returns the unallocated size of the cache\n *\n */\n public getBytesAvailable(): number {\n return this.getMaxCacheSize() - this.getCacheSize();\n }\n\n /**\n * Deletes the imageId from the image cache\n *\n * @param imageId - imageId\n *\n */\n private _decacheImage = (imageId: string) => {\n const { imageLoadObject } = this._imageCache.get(imageId);\n\n // Cancel any in-progress loading\n if (imageLoadObject.cancelFn) {\n imageLoadObject.cancelFn();\n }\n\n if (imageLoadObject.decache) {\n imageLoadObject.decache();\n }\n\n this._imageCache.delete(imageId);\n };\n\n /**\n * Deletes the volumeId from the volume cache\n *\n * @param volumeId - volumeId\n *\n */\n private _decacheVolume = (volumeId: string) => {\n const cachedVolume = this._volumeCache.get(volumeId);\n const { volumeLoadObject, volume } = cachedVolume;\n\n if (volume.cancelLoading) {\n volume.cancelLoading();\n }\n\n if (volume.imageData) {\n volume.imageData.delete();\n }\n\n if (volumeLoadObject.cancelFn) {\n // Cancel any in-progress loading\n volumeLoadObject.cancelFn();\n }\n\n if (volumeLoadObject.decache) {\n volumeLoadObject.decache();\n }\n\n this._volumeCache.delete(volumeId);\n };\n\n /**\n * Deletes all the images and volumes in the cache\n *\n * Relevant events are fired for each decached image (IMAGE_CACHE_IMAGE_REMOVED) and\n * the decached volume (VOLUME_CACHE_VOLUME_REMOVED).\n *\n * @fires Events.IMAGE_CACHE_IMAGE_REMOVED\n * @fires Events.VOLUME_CACHE_VOLUME_REMOVED\n *\n */\n public purgeCache = (): void => {\n const imageIterator = this._imageCache.keys();\n\n /* eslint-disable no-constant-condition */\n while (true) {\n const { value: imageId, done } = imageIterator.next();\n\n if (done) {\n break;\n }\n\n this.removeImageLoadObject(imageId);\n\n triggerEvent(eventTarget, Events.IMAGE_CACHE_IMAGE_REMOVED, { imageId });\n }\n\n this.purgeVolumeCache();\n };\n\n /**\n * Deletes all the volumes in the cache\n */\n public purgeVolumeCache = (): void => {\n const volumeIterator = this._volumeCache.keys();\n\n /* eslint-disable no-constant-condition */\n while (true) {\n const { value: volumeId, done } = volumeIterator.next();\n\n if (done) {\n break;\n }\n\n this.removeVolumeLoadObject(volumeId);\n\n triggerEvent(eventTarget, Events.VOLUME_CACHE_VOLUME_REMOVED, {\n volumeId,\n });\n }\n };\n\n /**\n * Purges the cache if necessary based on the requested number of bytes\n *\n * 1) it sorts the volatile (image) cache based on the most recent used images\n * and starts purging from the oldest ones.\n * Note: for a volume, if the volume-related image Ids is provided, it starts\n * by purging the none-related image Ids (those that are not related to the\n * current volume)\n * 2) For a volume, if we purge all images that won't be included in this volume and still\n * don't have enough unallocated space, purge images that will be included\n * in this volume until we have enough space. These will need to be\n * re-fetched, but we must do this not to straddle over the given memory\n * limit, even for a short time, as this may crash the application.\n *\n * @fires Events.IMAGE_CACHE_IMAGE_REMOVED\n *\n * @param numBytes - Number of bytes for the image/volume that is\n * going to be stored inside the cache\n * @param volumeImageIds - list of imageIds that correspond to the\n * volume whose numberOfBytes we want to store in the cache.\n * @returns bytesAvailable or undefined in purging cache\n * does not successfully make enough space for the requested number of bytes\n */\n public decacheIfNecessaryUntilBytesAvailable(\n numBytes: number,\n volumeImageIds?: Array\n ): number | undefined {\n let bytesAvailable = this.getBytesAvailable();\n\n // If max cache size has not been exceeded, do nothing\n if (bytesAvailable >= numBytes) {\n return bytesAvailable;\n }\n\n let cachedImages = Array.from(this._imageCache.values());\n\n // Cache size has been exceeded, create list of images sorted by timeStamp\n // So we can purge the least recently used image\n function compare(a, b) {\n if (a.timeStamp > b.timeStamp) {\n return 1;\n }\n if (a.timeStamp < b.timeStamp) {\n return -1;\n }\n\n return 0;\n }\n\n cachedImages.sort(compare);\n let cachedImageIds = cachedImages.map((im) => im.imageId);\n\n let imageIdsToPurge = cachedImageIds;\n\n // if we are making space for a volume, we start by purging the imageIds\n // that are not related to the volume\n if (volumeImageIds) {\n imageIdsToPurge = cachedImageIds.filter(\n (id) => !volumeImageIds.includes(id)\n );\n }\n\n // Remove images (that are not related to the volume) from volatile cache\n // until the requested number of bytes become available\n for (const imageId of imageIdsToPurge) {\n this.removeImageLoadObject(imageId);\n\n triggerEvent(eventTarget, Events.IMAGE_CACHE_IMAGE_REMOVED, { imageId });\n\n bytesAvailable = this.getBytesAvailable();\n if (bytesAvailable >= numBytes) {\n return bytesAvailable;\n }\n }\n\n // Remove the imageIds (both volume related and not related)\n cachedImages = Array.from(this._imageCache.values());\n cachedImageIds = cachedImages.map((im) => im.imageId);\n\n // Remove volume-image Ids from volatile cache until the requested number of bytes\n // become available\n for (const imageId of cachedImageIds) {\n this.removeImageLoadObject(imageId);\n\n triggerEvent(eventTarget, Events.IMAGE_CACHE_IMAGE_REMOVED, { imageId });\n\n bytesAvailable = this.getBytesAvailable();\n if (bytesAvailable >= numBytes) {\n return bytesAvailable;\n }\n }\n\n // Technically we should not reach here, since isCacheable will throw an\n // error if unallocated + volatile (image) cache cannot fit the upcoming\n // number of bytes\n }\n\n /**\n * Puts a new image load object into the cache\n *\n * First, it creates a CachedImage object and put it inside the imageCache for\n * the imageId. After the imageLoadObject promise resolves to an image,\n * it: 1) adds the image into the correct CachedImage object 2) increments the\n * cache size, 3) triggers IMAGE_CACHE_IMAGE_ADDED 4) Purge the cache if\n * necessary -- if the cache size is greater than the maximum cache size, it\n * iterates over the imageCache and decache them one by one until the cache\n * size becomes less than the maximum allowed cache size\n *\n * @fires Events.IMAGE_CACHE_IMAGE_ADDED\n * @fires Events.CACHE_SIZE_EXCEEDED if the cache size exceeds the maximum\n *\n * @param imageId - ImageId for the image\n * @param imageLoadObject - The object that is loading or loaded the image\n */\n public putImageLoadObject(\n imageId: string,\n imageLoadObject: IImageLoadObject\n ): Promise {\n if (imageId === undefined) {\n throw new Error('putImageLoadObject: imageId must not be undefined');\n }\n\n if (imageLoadObject.promise === undefined) {\n throw new Error(\n 'putImageLoadObject: imageLoadObject.promise must not be undefined'\n );\n }\n\n if (this._imageCache.has(imageId)) {\n throw new Error('putImageLoadObject: imageId already in cache');\n }\n\n if (\n imageLoadObject.cancelFn &&\n typeof imageLoadObject.cancelFn !== 'function'\n ) {\n throw new Error(\n 'putImageLoadObject: imageLoadObject.cancel must be a function'\n );\n }\n\n const cachedImage: ICachedImage = {\n loaded: false,\n imageId,\n sharedCacheKey: undefined, // The sharedCacheKey for this imageId. undefined by default\n imageLoadObject,\n timeStamp: Date.now(),\n sizeInBytes: 0,\n };\n\n this._imageCache.set(imageId, cachedImage);\n\n return imageLoadObject.promise\n .then((image: IImage) => {\n if (!this._imageCache.get(imageId)) {\n // If the image has been purged before being loaded, we stop here.\n console.warn(\n 'The image was purged from the cache before it completed loading.'\n );\n return;\n }\n\n if (Number.isNaN(image.sizeInBytes)) {\n throw new Error(\n 'putImageLoadObject: image.sizeInBytes must not be undefined'\n );\n }\n if (image.sizeInBytes.toFixed === undefined) {\n throw new Error(\n 'putImageLoadObject: image.sizeInBytes is not a number'\n );\n }\n\n // check if there is enough space in unallocated + image Cache\n if (!this.isCacheable(image.sizeInBytes)) {\n throw new Error(Events.CACHE_SIZE_EXCEEDED);\n }\n\n // if there is, decache if necessary\n this.decacheIfNecessaryUntilBytesAvailable(image.sizeInBytes);\n\n cachedImage.loaded = true;\n cachedImage.image = image;\n cachedImage.sizeInBytes = image.sizeInBytes;\n this._incrementImageCacheSize(cachedImage.sizeInBytes);\n const eventDetails: EventTypes.ImageCacheImageAddedEventDetail = {\n image: cachedImage,\n };\n\n triggerEvent(eventTarget, Events.IMAGE_CACHE_IMAGE_ADDED, eventDetails);\n\n cachedImage.sharedCacheKey = image.sharedCacheKey;\n })\n .catch((error) => {\n // console.warn(error)\n this._imageCache.delete(imageId);\n throw error;\n });\n }\n\n /**\n * Returns the object that is loading a given imageId\n *\n * @param imageId - Image ID\n * @returns IImageLoadObject\n */\n public getImageLoadObject(imageId: string): IImageLoadObject {\n if (imageId === undefined) {\n throw new Error('getImageLoadObject: imageId must not be undefined');\n }\n const cachedImage = this._imageCache.get(imageId);\n\n if (cachedImage === undefined) {\n return;\n }\n\n // Bump time stamp for cached image\n cachedImage.timeStamp = Date.now();\n\n return cachedImage.imageLoadObject;\n }\n\n /**\n * It checks the imageCache for the provided imageId, and returns true\n * if the image is loaded, false otherwise. Note, this only checks the imageCache\n * and does not check the volume cache.\n * @param imageId - image Id to check\n * @returns boolean\n */\n public isLoaded(imageId: string): boolean {\n const cachedImage = this._imageCache.get(imageId);\n\n if (!cachedImage) {\n return false;\n }\n\n return cachedImage.loaded;\n }\n\n /**\n * Returns the volume that contains the requested imageId. It will check the\n * imageIds inside the volume to find a match.\n *\n * @param imageId - ImageId\n * @returns - Volume object\n */\n public getVolumeContainingImageId(imageId: string): {\n volume: IImageVolume;\n imageIdIndex: number;\n } {\n const volumeIds = Array.from(this._volumeCache.keys());\n const imageIdToUse = imageIdToURI(imageId);\n\n for (const volumeId of volumeIds) {\n const cachedVolume = this._volumeCache.get(volumeId);\n const { volume } = cachedVolume;\n\n if (!volume?.imageIds?.length) {\n return;\n }\n\n const imageIdIndex = volume.getImageURIIndex(imageIdToUse);\n\n if (imageIdIndex > -1) {\n return { volume, imageIdIndex };\n }\n }\n }\n\n /**\n * Returns the cached image from the imageCache for the requested imageId.\n * It first strips the imageId to remove the data loading scheme.\n *\n * @param imageId - Image ID\n * @returns cached image\n */\n public getCachedImageBasedOnImageURI(\n imageId: string\n ): ICachedImage | undefined {\n const imageURIToUse = imageIdToURI(imageId);\n\n const cachedImageIds = Array.from(this._imageCache.keys());\n const foundImageId = cachedImageIds.find((imageId) => {\n return imageIdToURI(imageId) === imageURIToUse;\n });\n\n if (!foundImageId) {\n return;\n }\n\n return this._imageCache.get(foundImageId);\n }\n /**\n * Puts a new image load object into the cache\n *\n * First, it creates a CachedVolume object and put it inside the volumeCache for\n * the volumeId. After the volumeLoadObject promise resolves to a volume,\n * it: 1) adds the volume into the correct CachedVolume object inside volumeCache\n * 2) increments the cache size, 3) triggers VOLUME_CACHE_VOLUME_ADDED 4) Purge\n * the cache if necessary -- if the cache size is greater than the maximum cache size, it\n * iterates over the imageCache (not volumeCache) and decache them one by one\n * until the cache size becomes less than the maximum allowed cache size\n *\n * @fires Events.VOLUME_CACHE_VOLUME_ADDED\n *\n * @param volumeId - volumeId of the volume\n * @param volumeLoadObject - The object that is loading or loaded the volume\n */\n public putVolumeLoadObject(\n volumeId: string,\n volumeLoadObject: IVolumeLoadObject\n ): Promise {\n if (volumeId === undefined) {\n throw new Error('putVolumeLoadObject: volumeId must not be undefined');\n }\n if (volumeLoadObject.promise === undefined) {\n throw new Error(\n 'putVolumeLoadObject: volumeLoadObject.promise must not be undefined'\n );\n }\n if (this._volumeCache.has(volumeId)) {\n throw new Error(\n `putVolumeLoadObject: volumeId:${volumeId} already in cache`\n );\n }\n if (\n volumeLoadObject.cancelFn &&\n typeof volumeLoadObject.cancelFn !== 'function'\n ) {\n throw new Error(\n 'putVolumeLoadObject: volumeLoadObject.cancel must be a function'\n );\n }\n\n // todo: @Erik there are two loaded flags, one inside cachedVolume and the other\n // inside the volume.loadStatus.loaded, the actual all pixelData loaded is the\n // loadStatus one. This causes confusion\n const cachedVolume: ICachedVolume = {\n loaded: false,\n volumeId,\n volumeLoadObject,\n timeStamp: Date.now(),\n sizeInBytes: 0,\n };\n\n this._volumeCache.set(volumeId, cachedVolume);\n\n return volumeLoadObject.promise\n .then((volume: IImageVolume) => {\n if (!this._volumeCache.get(volumeId)) {\n // If the image has been purged before being loaded, we stop here.\n console.warn(\n 'The image was purged from the cache before it completed loading.'\n );\n return;\n }\n\n if (Number.isNaN(volume.sizeInBytes)) {\n throw new Error(\n 'putVolumeLoadObject: volume.sizeInBytes must not be undefined'\n );\n }\n if (volume.sizeInBytes.toFixed === undefined) {\n throw new Error(\n 'putVolumeLoadObject: volume.sizeInBytes is not a number'\n );\n }\n\n // this.isCacheable is called at the volume loader, before requesting\n // the images of the volume\n\n this.decacheIfNecessaryUntilBytesAvailable(\n volume.sizeInBytes,\n // @ts-ignore: // todo ImageVolume does not have imageIds\n volume.imageIds\n );\n\n // cachedVolume.loaded = true\n cachedVolume.volume = volume;\n cachedVolume.sizeInBytes = volume.sizeInBytes;\n this._incrementVolumeCacheSize(cachedVolume.sizeInBytes);\n\n const eventDetails: EventTypes.VolumeCacheVolumeAddedEventDetail = {\n volume: cachedVolume,\n };\n\n triggerEvent(\n eventTarget,\n Events.VOLUME_CACHE_VOLUME_ADDED,\n eventDetails\n );\n })\n .catch((error) => {\n this._volumeCache.delete(volumeId);\n throw error;\n });\n }\n\n /**\n * Returns the object that is loading a given volumeId\n *\n * @param volumeId - Volume ID\n * @returns IVolumeLoadObject\n */\n public getVolumeLoadObject = (volumeId: string): IVolumeLoadObject => {\n if (volumeId === undefined) {\n throw new Error('getVolumeLoadObject: volumeId must not be undefined');\n }\n const cachedVolume = this._volumeCache.get(volumeId);\n\n if (cachedVolume === undefined) {\n return;\n }\n\n // Bump time stamp for cached volume (not used for anything for now)\n cachedVolume.timeStamp = Date.now();\n\n return cachedVolume.volumeLoadObject;\n };\n\n public getGeometry = (geometryId: string): IGeometry => {\n if (geometryId == null) {\n throw new Error('getGeometry: geometryId must not be undefined');\n }\n\n const cachedGeometry = this._geometryCache.get(geometryId);\n\n if (cachedGeometry === undefined) {\n return;\n }\n\n // Bump time stamp for cached geometry (not used for anything for now)\n cachedGeometry.timeStamp = Date.now();\n\n return cachedGeometry.geometry;\n };\n\n /**\n * Returns the volume associated with the volumeId\n *\n * @param volumeId - Volume ID\n * @returns Volume\n */\n public getVolume = (volumeId: string): IImageVolume => {\n if (volumeId === undefined) {\n throw new Error('getVolume: volumeId must not be undefined');\n }\n const cachedVolume = this._volumeCache.get(volumeId);\n\n if (cachedVolume === undefined) {\n return;\n }\n\n // Bump time stamp for cached volume (not used for anything for now)\n cachedVolume.timeStamp = Date.now();\n\n return cachedVolume.volume;\n };\n\n /**\n * Removes the image loader associated with a given Id from the cache\n *\n * It increases the cache size after removing the image.\n *\n * @fires Events.IMAGE_CACHE_IMAGE_REMOVED\n *\n * @param imageId - Image ID\n */\n public removeImageLoadObject = (imageId: string): void => {\n if (imageId === undefined) {\n throw new Error('removeImageLoadObject: imageId must not be undefined');\n }\n const cachedImage = this._imageCache.get(imageId);\n\n if (cachedImage === undefined) {\n throw new Error(\n 'removeImageLoadObject: imageId was not present in imageCache'\n );\n }\n\n this._incrementImageCacheSize(-cachedImage.sizeInBytes);\n\n const eventDetails = {\n imageId,\n };\n\n triggerEvent(eventTarget, Events.IMAGE_CACHE_IMAGE_REMOVED, eventDetails);\n this._decacheImage(imageId);\n };\n\n /**\n * Removes the volume loader associated with a given Id from the cache\n *\n * It increases the cache size after removing the image.\n *\n * @fires Events.VOLUME_CACHE_VOLUME_REMOVED\n *\n * @param imageId - ImageId\n */\n public removeVolumeLoadObject = (volumeId: string): void => {\n if (volumeId === undefined) {\n throw new Error('removeVolumeLoadObject: volumeId must not be undefined');\n }\n const cachedVolume = this._volumeCache.get(volumeId);\n\n if (cachedVolume === undefined) {\n throw new Error(\n 'removeVolumeLoadObject: volumeId was not present in volumeCache'\n );\n }\n\n this._incrementVolumeCacheSize(-cachedVolume.sizeInBytes);\n\n const eventDetails = {\n volume: cachedVolume,\n volumeId,\n };\n\n triggerEvent(eventTarget, Events.VOLUME_CACHE_VOLUME_REMOVED, eventDetails);\n this._decacheVolume(volumeId);\n };\n\n putGeometryLoadObject = (\n geometryId: string,\n geometryLoadObject: IGeometryLoadObject\n ): Promise => {\n if (geometryId == undefined) {\n throw new Error(\n 'putGeometryLoadObject: geometryId must not be undefined'\n );\n }\n\n if (this._geometryCache.has(geometryId)) {\n throw new Error(\n 'putGeometryLoadObject: geometryId already present in geometryCache'\n );\n }\n\n const cachedGeometry: ICachedGeometry = {\n geometryId,\n geometryLoadObject,\n loaded: false,\n timeStamp: Date.now(),\n sizeInBytes: 0,\n };\n\n this._geometryCache.set(geometryId, cachedGeometry);\n\n return geometryLoadObject.promise\n .then((geometry: IGeometry) => {\n if (!this._geometryCache.has(geometryId)) {\n console.warn(\n 'putGeometryLoadObject: geometryId was removed from geometryCache'\n );\n return;\n }\n\n if (Number.isNaN(geometry.sizeInBytes)) {\n throw new Error(\n 'putGeometryLoadObject: geometry.sizeInBytes is not a number'\n );\n }\n\n // Todo: fix is cacheable\n\n cachedGeometry.loaded = true;\n cachedGeometry.geometry = geometry;\n cachedGeometry.sizeInBytes = geometry.sizeInBytes;\n\n // this._incrementGeometryCacheSize(geometry.sizeInBytes);\n\n const eventDetails = {\n geometry,\n geometryId,\n };\n\n triggerEvent(\n eventTarget,\n Events.GEOMETRY_CACHE_GEOMETRY_ADDED,\n eventDetails\n );\n\n return;\n })\n .catch((error) => {\n this._geometryCache.delete(geometryId);\n throw error;\n });\n };\n\n /**\n * Increases the image cache size with the provided increment\n *\n * @param increment - bytes length\n */\n private _incrementImageCacheSize = (increment: number) => {\n this._imageCacheSize += increment;\n };\n\n /**\n * Increases the cache size with the provided increment\n *\n * @param increment - bytes length\n */\n private _incrementVolumeCacheSize = (increment: number) => {\n this._volumeCacheSize += increment;\n };\n}\n\n/**\n * This module deals with Caching of images and volumes\n * The cache has two main components: a volatile portion for images and a\n * non-volatile portion for volumes. Individual 2D images are volatile and\n * will be replaced by new images hitting the cache. When you allocate volumes,\n * these are non-volatile and reserve a block of memory from the cache.\n * Volumes must be released manually.\n * We will have a shared block of memory allocated for the entire cache, e.g. 1GB\n * which will be shared for images and volumes.\n *\n * **When a new image is added:**\n * We check if there is enough unallocated + volatile space for the single image\n *\n * if so\n * - We allocate the image in image cache, and if necessary oldest images\n * are decached to match the maximumCacheSize criteria\n * - If a volume contains that imageId, copy it over using TypedArray's set method.\n * If no volumes contain the imageId, the image is fetched by image loaders\n *\n * If not (cache is mostly/completely full with volumes)\n * - throw that the cache does not have enough working space to allocate the image\n *\n *\n * **When a new volume is added:**\n * Check if there is enough unallocated + volatile space to allocate the volume:\n *\n * If so:\n * - Decache oldest images which won't be included in this volume until\n * we have enough free space for the volume\n * - If not enough space from previous space, decache images that will be included\n * in the volume until we have enough free space (These will need to be re-fetched,\n * but we must do this not to straddle over the given memory limit, even for a\n * short time, as this may crash the app)\n * - At this point, if any of the frames (indexed by imageId) are present in the volatile\n * image cache, copy these over to the volume now\n *\n * If not (cache is mostly/completely full with volumes),\n * - throw that the cache does not have enough working space to allocate the volume.\n *\n */\nconst cache = new Cache();\nexport default cache;\nexport { Cache }; // for documentation\n","import macro from '../../macros.js';\n\nvar vtkErrorMacro = macro.vtkErrorMacro;\nvar PASS_TYPES = ['Build', 'Render']; // ----------------------------------------------------------------------------\n// vtkViewNode methods\n// ----------------------------------------------------------------------------\n\nfunction vtkViewNode(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkViewNode'); // Builds myself.\n\n publicAPI.build = function (prepass) {}; // Renders myself\n\n\n publicAPI.render = function (prepass) {};\n\n publicAPI.traverse = function (renderPass) {\n // we can choose to do special\n // traversal here based on pass\n var passTraversal = renderPass.getTraverseOperation();\n var fn = publicAPI[passTraversal];\n\n if (fn) {\n fn(renderPass);\n return;\n } // default traversal\n\n\n publicAPI.apply(renderPass, true);\n\n for (var index = 0; index < model.children.length; index++) {\n model.children[index].traverse(renderPass);\n }\n\n publicAPI.apply(renderPass, false);\n };\n\n publicAPI.apply = function (renderPass, prepass) {\n var customRenderPass = publicAPI[renderPass.getOperation()];\n\n if (customRenderPass) {\n customRenderPass(prepass, renderPass);\n }\n };\n\n publicAPI.getViewNodeFor = function (dataObject) {\n if (model.renderable === dataObject) {\n return publicAPI;\n }\n\n for (var index = 0; index < model.children.length; ++index) {\n var child = model.children[index];\n var vn = child.getViewNodeFor(dataObject);\n\n if (vn) {\n return vn;\n }\n }\n\n return undefined;\n };\n\n publicAPI.getFirstAncestorOfType = function (type) {\n if (!model._parent) {\n return null;\n }\n\n if (model._parent.isA(type)) {\n return model._parent;\n }\n\n return model._parent.getFirstAncestorOfType(type);\n }; // add a missing node/child for the passed in renderables. This should\n // be called only in between prepareNodes and removeUnusedNodes\n\n\n publicAPI.addMissingNode = function (dobj) {\n if (!dobj) {\n return;\n }\n\n var result = model._renderableChildMap.get(dobj); // if found just mark as visited\n\n\n if (result !== undefined) {\n result.setVisited(true);\n } else {\n // otherwise create a node\n var newNode = publicAPI.createViewNode(dobj);\n\n if (newNode) {\n newNode.setParent(publicAPI);\n newNode.setVisited(true);\n\n model._renderableChildMap.set(dobj, newNode);\n\n model.children.push(newNode);\n }\n }\n }; // add missing nodes/children for the passed in renderables. This should\n // be called only in between prepareNodes and removeUnusedNodes\n\n\n publicAPI.addMissingNodes = function (dataObjs) {\n if (!dataObjs || !dataObjs.length) {\n return;\n }\n\n for (var index = 0; index < dataObjs.length; ++index) {\n var dobj = dataObjs[index];\n\n var result = model._renderableChildMap.get(dobj); // if found just mark as visited\n\n\n if (result !== undefined) {\n result.setVisited(true);\n } else {\n // otherwise create a node\n var newNode = publicAPI.createViewNode(dobj);\n\n if (newNode) {\n newNode.setParent(publicAPI);\n newNode.setVisited(true);\n\n model._renderableChildMap.set(dobj, newNode);\n\n model.children.push(newNode);\n }\n }\n }\n }; // ability to add children that have no renderable use in the same manner\n // as addMissingNodes This case is when a normal viewnode wants to\n // delegate passes to a helper or child that doeasn't map to a clear\n // renderable or any renderable\n\n\n publicAPI.addMissingChildren = function (children) {\n if (!children || !children.length) {\n return;\n }\n\n for (var index = 0; index < children.length; ++index) {\n var child = children[index];\n var cindex = model.children.indexOf(child);\n\n if (cindex === -1) {\n child.setParent(publicAPI);\n model.children.push(child);\n }\n\n child.setVisited(true);\n }\n };\n\n publicAPI.prepareNodes = function () {\n for (var index = 0; index < model.children.length; ++index) {\n model.children[index].setVisited(false);\n }\n };\n\n publicAPI.setVisited = function (val) {\n model.visited = val;\n };\n\n publicAPI.removeUnusedNodes = function () {\n var deleted = null;\n\n for (var index = 0; index < model.children.length; ++index) {\n var child = model.children[index];\n var visited = child.getVisited();\n\n if (!visited) {\n var renderable = child.getRenderable();\n\n if (renderable) {\n model._renderableChildMap.delete(renderable);\n }\n\n if (!deleted) {\n deleted = [];\n }\n\n deleted.push(child);\n child.delete();\n } else {\n child.setVisited(false);\n }\n }\n\n if (deleted) {\n // slow does alloc but not as common\n model.children = model.children.filter(function (el) {\n return !deleted.includes(el);\n });\n }\n };\n\n publicAPI.createViewNode = function (dataObj) {\n if (!model.myFactory) {\n vtkErrorMacro('Cannot create view nodes without my own factory');\n return null;\n }\n\n var ret = model.myFactory.createNode(dataObj);\n\n if (ret) {\n ret.setRenderable(dataObj);\n }\n\n return ret;\n };\n\n var parentDelete = publicAPI.delete;\n\n publicAPI.delete = function () {\n for (var i = 0; i < model.children.length; i++) {\n model.children[i].delete();\n }\n\n parentDelete();\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n // _parent: null,\n renderable: null,\n myFactory: null,\n children: [],\n visited: false\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Build VTK API\n\n macro.obj(publicAPI, model);\n macro.event(publicAPI, model, 'event');\n model._renderableChildMap = new Map();\n macro.get(publicAPI, model, ['visited']);\n macro.setGet(publicAPI, model, ['_parent', 'renderable', 'myFactory']);\n macro.getArray(publicAPI, model, ['children']);\n macro.moveToProtected(publicAPI, model, ['parent']); // Object methods\n\n vtkViewNode(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\n\nvar newInstance = macro.newInstance(extend, 'vtkViewNode'); // ----------------------------------------------------------------------------\n\nvar vtkViewNode$1 = {\n newInstance: newInstance,\n extend: extend,\n PASS_TYPES: PASS_TYPES\n};\n\nexport { vtkViewNode$1 as default };\n","import macro from '../../macros.js';\n\n// vtkViewNodeFactory methods\n// ----------------------------------------------------------------------------\n\nfunction vtkViewNodeFactory(publicAPI, model) {\n // Make sure our overrides is just for our instance not shared with everyone...\n if (!model.overrides) {\n model.overrides = {};\n } // Set our className\n\n\n model.classHierarchy.push('vtkViewNodeFactory');\n\n publicAPI.createNode = function (dataObject) {\n if (dataObject.isDeleted()) {\n return null;\n }\n\n var cpt = 0;\n var className = dataObject.getClassName(cpt++);\n var isObject = false;\n var keys = Object.keys(model.overrides);\n\n while (className && !isObject) {\n if (keys.indexOf(className) !== -1) {\n isObject = true;\n } else {\n className = dataObject.getClassName(cpt++);\n }\n }\n\n if (!isObject) {\n return null;\n }\n\n var vn = model.overrides[className]();\n vn.setMyFactory(publicAPI);\n return vn;\n };\n\n publicAPI.registerOverride = function (className, func) {\n model.overrides[className] = func;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {// overrides: {},\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Build VTK API\n\n macro.obj(publicAPI, model); // Object methods\n\n vtkViewNodeFactory(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkViewNodeFactory'); // ----------------------------------------------------------------------------\n\nvar vtkViewNodeFactory$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkViewNodeFactory$1 as default, extend, newInstance };\n","import macro from '../../macros.js';\nimport vtkViewNodeFactory$1 from '../SceneGraph/ViewNodeFactory.js';\n\nvar CLASS_MAPPING = Object.create(null);\nfunction registerOverride(className, fn) {\n CLASS_MAPPING[className] = fn;\n} // ----------------------------------------------------------------------------\n// vtkOpenGLViewNodeFactory methods\n// ----------------------------------------------------------------------------\n\nfunction vtkOpenGLViewNodeFactory(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkOpenGLViewNodeFactory');\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Static class mapping shared across instances\n\n model.overrides = CLASS_MAPPING; // Inheritance\n\n vtkViewNodeFactory$1.extend(publicAPI, model, initialValues); // Object methods\n\n vtkOpenGLViewNodeFactory(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkOpenGLViewNodeFactory'); // ----------------------------------------------------------------------------\n\nvar vtkViewNodeFactory = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkViewNodeFactory as default, extend, newInstance, registerOverride };\n","import { mat4, mat3 } from 'gl-matrix';\nimport { newInstance as newInstance$1, obj, setGet } from '../../macros.js';\nimport vtkViewNode from '../SceneGraph/ViewNode.js';\nimport { registerOverride } from './ViewNodeFactory.js';\n\n// vtkOpenGLCamera methods\n// ----------------------------------------------------------------------------\n\nfunction vtkOpenGLCamera(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkOpenGLCamera');\n\n publicAPI.buildPass = function (prepass) {\n if (prepass) {\n model._openGLRenderer = publicAPI.getFirstAncestorOfType('vtkOpenGLRenderer');\n model._openGLRenderWindow = model._openGLRenderer.getParent();\n model.context = model._openGLRenderWindow.getContext();\n }\n }; // Renders myself\n\n\n publicAPI.opaquePass = function (prepass) {\n if (prepass) {\n var tsize = model._openGLRenderer.getTiledSizeAndOrigin();\n\n model.context.viewport(tsize.lowerLeftU, tsize.lowerLeftV, tsize.usize, tsize.vsize);\n model.context.scissor(tsize.lowerLeftU, tsize.lowerLeftV, tsize.usize, tsize.vsize);\n }\n };\n\n publicAPI.translucentPass = publicAPI.opaquePass;\n publicAPI.zBufferPass = publicAPI.opaquePass;\n publicAPI.opaqueZBufferPass = publicAPI.opaquePass;\n publicAPI.volumePass = publicAPI.opaquePass;\n\n publicAPI.getKeyMatrices = function (ren) {\n // has the camera changed?\n if (ren !== model.lastRenderer || model._openGLRenderWindow.getMTime() > model.keyMatrixTime.getMTime() || publicAPI.getMTime() > model.keyMatrixTime.getMTime() || ren.getMTime() > model.keyMatrixTime.getMTime() || model.renderable.getMTime() > model.keyMatrixTime.getMTime()) {\n mat4.copy(model.keyMatrices.wcvc, model.renderable.getViewMatrix());\n mat3.fromMat4(model.keyMatrices.normalMatrix, model.keyMatrices.wcvc);\n mat3.invert(model.keyMatrices.normalMatrix, model.keyMatrices.normalMatrix);\n mat4.transpose(model.keyMatrices.wcvc, model.keyMatrices.wcvc);\n\n var aspectRatio = model._openGLRenderer.getAspectRatio();\n\n mat4.copy(model.keyMatrices.vcpc, model.renderable.getProjectionMatrix(aspectRatio, -1, 1));\n mat4.transpose(model.keyMatrices.vcpc, model.keyMatrices.vcpc);\n mat4.multiply(model.keyMatrices.wcpc, model.keyMatrices.vcpc, model.keyMatrices.wcvc);\n model.keyMatrixTime.modified();\n model.lastRenderer = ren;\n }\n\n return model.keyMatrices;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n context: null,\n lastRenderer: null,\n keyMatrixTime: null,\n keyMatrices: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkViewNode.extend(publicAPI, model, initialValues);\n model.keyMatrixTime = {};\n obj(model.keyMatrixTime); // values always get set by the get method\n\n model.keyMatrices = {\n normalMatrix: new Float64Array(9),\n vcpc: new Float64Array(16),\n wcvc: new Float64Array(16),\n wcpc: new Float64Array(16)\n }; // Build VTK API\n\n setGet(publicAPI, model, ['context', 'keyMatrixTime']); // Object methods\n\n vtkOpenGLCamera(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend); // ----------------------------------------------------------------------------\n\nvar vtkCamera = {\n newInstance: newInstance,\n extend: extend\n}; // Register ourself to OpenGL backend if imported\n\nregisterOverride('vtkCamera', newInstance);\n\nexport { vtkCamera as default, extend, newInstance };\n","import { newInstance as newInstance$1, get, setGet, moveToProtected, vtkDebugMacro as vtkDebugMacro$1 } from '../../macros.js';\nimport vtkViewNode from '../SceneGraph/ViewNode.js';\nimport { registerOverride } from './ViewNodeFactory.js';\n\nvar vtkDebugMacro = vtkDebugMacro$1; // ----------------------------------------------------------------------------\n// vtkOpenGLRenderer methods\n// ----------------------------------------------------------------------------\n\n/* eslint-disable no-bitwise */\n\nfunction vtkOpenGLRenderer(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkOpenGLRenderer'); // Builds myself.\n\n publicAPI.buildPass = function (prepass) {\n if (prepass) {\n if (!model.renderable) {\n return;\n }\n\n publicAPI.updateLights();\n publicAPI.prepareNodes();\n publicAPI.addMissingNode(model.renderable.getActiveCamera());\n publicAPI.addMissingNodes(model.renderable.getViewPropsWithNestedProps());\n publicAPI.removeUnusedNodes();\n }\n };\n\n publicAPI.updateLights = function () {\n var count = 0;\n var lights = model.renderable.getLightsByReference();\n\n for (var index = 0; index < lights.length; ++index) {\n if (lights[index].getSwitch() > 0.0) {\n count++;\n }\n }\n\n if (!count) {\n vtkDebugMacro('No lights are on, creating one.');\n model.renderable.createLight();\n }\n\n return count;\n };\n\n publicAPI.zBufferPass = function (prepass) {\n if (prepass) {\n var clearMask = 0;\n var gl = model.context;\n\n if (!model.renderable.getTransparent()) {\n model.context.clearColor(1.0, 0.0, 0.0, 1.0);\n clearMask |= gl.COLOR_BUFFER_BIT;\n }\n\n if (!model.renderable.getPreserveDepthBuffer()) {\n gl.clearDepth(1.0);\n clearMask |= gl.DEPTH_BUFFER_BIT;\n model.context.depthMask(true);\n }\n\n var ts = publicAPI.getTiledSizeAndOrigin();\n gl.enable(gl.SCISSOR_TEST);\n gl.scissor(ts.lowerLeftU, ts.lowerLeftV, ts.usize, ts.vsize);\n gl.viewport(ts.lowerLeftU, ts.lowerLeftV, ts.usize, ts.vsize);\n gl.colorMask(true, true, true, true);\n\n if (clearMask) {\n gl.clear(clearMask);\n }\n\n gl.enable(gl.DEPTH_TEST);\n }\n };\n\n publicAPI.opaqueZBufferPass = function (prepass) {\n return publicAPI.zBufferPass(prepass);\n }; // Renders myself\n\n\n publicAPI.cameraPass = function (prepass) {\n if (prepass) {\n publicAPI.clear();\n }\n };\n\n publicAPI.getAspectRatio = function () {\n var size = model._parent.getSizeByReference();\n\n var viewport = model.renderable.getViewportByReference();\n return size[0] * (viewport[2] - viewport[0]) / ((viewport[3] - viewport[1]) * size[1]);\n };\n\n publicAPI.getTiledSizeAndOrigin = function () {\n var vport = model.renderable.getViewportByReference(); // if there is no window assume 0 1\n\n var tileViewPort = [0.0, 0.0, 1.0, 1.0]; // find the lower left corner of the viewport, taking into account the\n // lower left boundary of this tile\n\n var vpu = vport[0] - tileViewPort[0];\n var vpv = vport[1] - tileViewPort[1]; // store the result as a pixel value\n\n var ndvp = model._parent.normalizedDisplayToDisplay(vpu, vpv);\n\n var lowerLeftU = Math.round(ndvp[0]);\n var lowerLeftV = Math.round(ndvp[1]); // find the upper right corner of the viewport, taking into account the\n // lower left boundary of this tile\n\n var vpu2 = vport[2] - tileViewPort[0];\n var vpv2 = vport[3] - tileViewPort[1];\n\n var ndvp2 = model._parent.normalizedDisplayToDisplay(vpu2, vpv2); // now compute the size of the intersection of the viewport with the\n // current tile\n\n\n var usize = Math.round(ndvp2[0]) - lowerLeftU;\n var vsize = Math.round(ndvp2[1]) - lowerLeftV;\n\n if (usize < 0) {\n usize = 0;\n }\n\n if (vsize < 0) {\n vsize = 0;\n }\n\n return {\n usize: usize,\n vsize: vsize,\n lowerLeftU: lowerLeftU,\n lowerLeftV: lowerLeftV\n };\n };\n\n publicAPI.clear = function () {\n var clearMask = 0;\n var gl = model.context;\n\n if (!model.renderable.getTransparent()) {\n var background = model.renderable.getBackgroundByReference(); // renderable ensures that background has 4 entries.\n\n model.context.clearColor(background[0], background[1], background[2], background[3]);\n clearMask |= gl.COLOR_BUFFER_BIT;\n }\n\n if (!model.renderable.getPreserveDepthBuffer()) {\n gl.clearDepth(1.0);\n clearMask |= gl.DEPTH_BUFFER_BIT;\n model.context.depthMask(true);\n }\n\n gl.colorMask(true, true, true, true);\n var ts = publicAPI.getTiledSizeAndOrigin();\n gl.enable(gl.SCISSOR_TEST);\n gl.scissor(ts.lowerLeftU, ts.lowerLeftV, ts.usize, ts.vsize);\n gl.viewport(ts.lowerLeftU, ts.lowerLeftV, ts.usize, ts.vsize);\n\n if (clearMask) {\n gl.clear(clearMask);\n }\n\n gl.enable(gl.DEPTH_TEST);\n /* eslint-enable no-bitwise */\n };\n\n publicAPI.releaseGraphicsResources = function () {\n if (model.selector !== null) {\n model.selector.releaseGraphicsResources();\n }\n };\n\n publicAPI.setOpenGLRenderWindow = function (rw) {\n if (model._openGLRenderWindow === rw) {\n return;\n }\n\n publicAPI.releaseGraphicsResources();\n model._openGLRenderWindow = rw;\n model.context = null;\n\n if (rw) {\n model.context = model._openGLRenderWindow.getContext();\n }\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n context: null,\n // _openGLRenderWindow: null,\n selector: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkViewNode.extend(publicAPI, model, initialValues); // Build VTK API\n\n get(publicAPI, model, ['shaderCache']);\n setGet(publicAPI, model, ['selector']);\n moveToProtected(publicAPI, model, ['openGLRenderWindow']); // Object methods\n\n vtkOpenGLRenderer(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend, 'vtkOpenGLRenderer'); // ----------------------------------------------------------------------------\n\nvar vtkRenderer = {\n newInstance: newInstance,\n extend: extend\n}; // Register ourself to OpenGL backend if imported\n\nregisterOverride('vtkRenderer', newInstance);\n\nexport { vtkRenderer as default, extend, newInstance };\n","import _classCallCheck from '@babel/runtime/helpers/classCallCheck';\nimport _createClass from '@babel/runtime/helpers/createClass';\nimport macro from '../../macros.js';\nimport vtkCellArray from '../../Common/Core/CellArray.js';\nimport vtkPolyData from '../../Common/DataModel/PolyData.js';\n\nvar vtkErrorMacro = macro.vtkErrorMacro;\n\nvar SegmentAgregator = /*#__PURE__*/function () {\n function SegmentAgregator() {\n _classCallCheck(this, SegmentAgregator);\n\n this.segmentMapping = {};\n this.segments = [null]; // to force first id to be 1\n\n this.faces = [];\n }\n\n _createClass(SegmentAgregator, [{\n key: \"addSegment\",\n value: function addSegment(segment) {\n var first = segment[0];\n var last = segment[segment.length - 1];\n\n if (first === last || segment.length < 2) {\n return;\n }\n\n var mappingFirst = this.segmentMapping[first];\n var mappingLast = this.segmentMapping[last];\n\n if (mappingFirst !== undefined && mappingLast !== undefined) {\n if (Math.abs(mappingFirst) === Math.abs(mappingLast)) {\n // This make a closing loop\n var idx = mappingFirst < mappingLast ? mappingLast : mappingFirst;\n var seg = this.segments[idx];\n\n if (mappingFirst > 0) {\n for (var i = 1; i < segment.length - 1; i++) {\n seg.push(segment[i]);\n }\n } else {\n for (var _i = 1; _i < segment.length - 1; _i++) {\n seg.unshift(segment[segment.length - 1 - _i]);\n }\n }\n\n this.faces.push(seg);\n this.segments[idx] = null;\n this.segmentMapping[first] = undefined;\n this.segmentMapping[last] = undefined;\n } else {\n // we need to merge segments\n // strategie:\n // => remove and add them again in special order to induce merge\n var idxHead = Math.abs(mappingFirst);\n var idxTail = Math.abs(mappingLast);\n var segHead = this.segments[idxHead];\n var segTail = this.segments[idxTail];\n this.segments[idxHead] = null;\n this.segments[idxTail] = null;\n this.segmentMapping[segHead[0]] = undefined;\n this.segmentMapping[segTail[0]] = undefined;\n this.segmentMapping[segHead[segHead.length - 1]] = undefined;\n this.segmentMapping[segTail[segTail.length - 1]] = undefined; // This will lead to a single segment\n\n this.addSegment(segment);\n this.addSegment(segHead);\n this.addSegment(segTail);\n }\n } else if (mappingFirst !== undefined) {\n if (mappingFirst > 0) {\n // The head of our segment match the tail of the existing one\n var _seg = this.segments[mappingFirst];\n\n for (var _i2 = 1; _i2 < segment.length; _i2++) {\n _seg.push(segment[_i2]);\n } // record new tail\n\n\n this.segmentMapping[last] = mappingFirst;\n } else {\n // our segment should be reverted and put on the front of the existing one\n var _seg2 = this.segments[-mappingFirst]; // record new head\n\n this.segmentMapping[last] = mappingFirst;\n\n for (var _i3 = 1; _i3 < segment.length; _i3++) {\n _seg2.unshift(segment[_i3]);\n }\n } // Erase used connection\n\n\n this.segmentMapping[first] = undefined;\n } else if (mappingLast !== undefined) {\n if (mappingLast > 0) {\n // The tail of our segment match the tail of the existing one\n var _seg3 = this.segments[mappingLast];\n\n for (var _i4 = 1; _i4 < segment.length; _i4++) {\n _seg3.push(segment[segment.length - 1 - _i4]);\n } // record new tail\n\n\n this.segmentMapping[first] = mappingLast;\n } else {\n // our segment should be reverted and put on the front of the existing one\n var _seg4 = this.segments[-mappingLast]; // record new head\n\n this.segmentMapping[first] = mappingLast;\n\n for (var _i5 = 1; _i5 < segment.length; _i5++) {\n _seg4.unshift(segment[segment.length - _i5 - 1]);\n }\n } // Erase used connection\n\n\n this.segmentMapping[last] = undefined;\n } else {\n // store segment for now\n var id = this.segments.length;\n this.segments.push(segment);\n this.segmentMapping[first] = -id;\n this.segmentMapping[last] = id;\n }\n }\n }]);\n\n return SegmentAgregator;\n}(); // ----------------------------------------------------------------------------\n// vtkClosedPolyLineToSurfaceFilter methods\n// ----------------------------------------------------------------------------\n\n\nfunction vtkClosedPolyLineToSurfaceFilter(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkClosedPolyLineToSurfaceFilter'); // --------------------------------------------------------------------------\n\n publicAPI.requestData = function (inData, outData) {\n // implement requestData\n var input = inData[0];\n\n if (!input) {\n vtkErrorMacro('Invalid or missing input');\n return;\n }\n\n var output = vtkPolyData.newInstance();\n output.shallowCopy(input); // Extract faces\n\n var agregator = new SegmentAgregator();\n var lines = input.getLines().getData();\n var offset = 0;\n\n while (offset < lines.length) {\n var lineSize = lines[offset++];\n var lineSegment = [];\n\n for (var i = 0; i < lineSize; i++) {\n lineSegment.push(lines[offset + i]);\n }\n\n agregator.addSegment(lineSegment);\n offset += lineSize;\n } // Create CellArray for polys\n\n\n var faces = agregator.faces;\n var cellArraySize = faces.length;\n\n for (var _i6 = 0; _i6 < faces.length; _i6++) {\n cellArraySize += faces[_i6].length;\n }\n\n var cellArray = new Uint16Array(cellArraySize);\n offset = 0;\n\n for (var _i7 = 0; _i7 < faces.length; _i7++) {\n var face = faces[_i7];\n cellArray[offset++] = face.length;\n\n for (var j = 0; j < face.length; j++) {\n cellArray[offset++] = face[j];\n }\n }\n\n output.setPolys(vtkCellArray.newInstance({\n values: cellArray,\n name: 'faces'\n }));\n outData[0] = output;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Make this a VTK object\n\n macro.obj(publicAPI, model); // Also make it an algorithm with one input and one output\n\n macro.algo(publicAPI, model, 1, 1); // Object specific methods\n\n vtkClosedPolyLineToSurfaceFilter(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkClosedPolyLineToSurfaceFilter'); // ----------------------------------------------------------------------------\n\nvar vtkClosedPolyLineToSurfaceFilter$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkClosedPolyLineToSurfaceFilter$1 as default, extend, newInstance };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport { newInstance as newInstance$1, obj, algo, setGet, vtkErrorMacro as vtkErrorMacro$1, newTypedArrayFrom } from '../../macros.js';\nimport vtkPolyData from '../../Common/DataModel/PolyData.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nvar vtkErrorMacro = vtkErrorMacro$1;\n\nfunction initPolyIterator(pd) {\n var polys = pd.getPolys().getData();\n var strips = pd.getStrips().getData();\n var it = {\n done: false,\n polyIdx: 0,\n stripIdx: 0,\n remainingStripLength: 0,\n // returns a single poly cell\n next: function next() {\n var ret = null;\n\n if (it.polyIdx < polys.length) {\n var cellSize = polys[it.polyIdx];\n var start = it.polyIdx + 1;\n var end = start + cellSize;\n it.polyIdx = end;\n ret = polys.subarray(start, end);\n } else if (it.stripIdx < strips.length) {\n if (it.remainingStripLength === 0) {\n it.remainingStripLength = strips[it.stripIdx] - 2; // sliding window of 3 points\n // stripIdx points to the last point in a triangle 3-tuple\n\n it.stripIdx += 3;\n }\n\n var _start = it.stripIdx - 2;\n\n var _end = it.stripIdx + 1;\n\n it.stripIdx++;\n it.remainingStripLength--;\n ret = strips.subarray(_start, _end);\n } else if (it.done) {\n throw new Error('Iterator is done');\n }\n\n it.done = it.polyIdx >= polys.length && it.stripIdx >= strips.length;\n return ret;\n }\n };\n return it;\n} // ----------------------------------------------------------------------------\n// vtkCutter methods\n// ----------------------------------------------------------------------------\n\n\nfunction vtkCutter(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkCutter'); // Capture \"parentClass\" api for internal use\n\n var superClass = _objectSpread({}, publicAPI);\n\n publicAPI.getMTime = function () {\n var mTime = superClass.getMTime();\n\n if (!model.cutFunction) {\n return mTime;\n }\n\n mTime = Math.max(mTime, model.cutFunction.getMTime());\n return mTime;\n };\n\n function dataSetCutter(input, output) {\n var points = input.getPoints();\n var pointsData = points.getData();\n var numPts = points.getNumberOfPoints();\n var newPointsData = [];\n var newLinesData = [];\n var newPolysData = [];\n\n if (!model.cutScalars || model.cutScalars.length < numPts) {\n model.cutScalars = new Float32Array(numPts);\n } // Loop over all points evaluating scalar function at each point\n\n\n var inOffset = 0;\n var outOffset = 0;\n\n while (inOffset < pointsData.length) {\n model.cutScalars[outOffset++] = model.cutFunction.evaluateFunction(pointsData[inOffset++], pointsData[inOffset++], pointsData[inOffset++]);\n }\n\n var crossedEdges = [];\n var x1 = new Array(3);\n var x2 = new Array(3); // Loop over all cells; get scalar values for all cell points\n // and process each cell.\n\n /* eslint-disable no-continue */\n\n var it = initPolyIterator(input);\n\n while (!it.done) {\n // cell contains the point IDs/indices\n var cell = it.next(); // Check that cells have at least 3 points\n\n if (cell.length <= 2) {\n continue;\n } // Get associated scalar of points that constitute the current cell\n\n\n var cellPointsScalars = [];\n var pointIndex = void 0;\n\n for (var i = 0; i < cell.length; i++) {\n pointIndex = cell[i];\n cellPointsScalars.push(model.cutScalars[pointIndex]);\n } // Check if all cell points are on same side (same side == cell not crossed by cut function)\n // TODO: won't work if one point scalar is = 0 ?\n\n\n var sideFirstPoint = cellPointsScalars[0] > 0;\n var allPointsSameSide = true;\n\n for (var _i = 1; _i < cellPointsScalars.length; _i++) {\n var sideCurrentPoint = cellPointsScalars[_i] > 0;\n\n if (sideCurrentPoint !== sideFirstPoint) {\n allPointsSameSide = false;\n break;\n }\n } // Go to next cell if cell is not crossed by cut function\n\n\n if (allPointsSameSide) {\n continue;\n } // Find and compute edges which intersect cells\n\n\n var intersectedEdgesList = [];\n\n for (var _i2 = 0; _i2 < cell.length; _i2++) {\n var idNext = _i2 + 1 === cell.length ? 0 : _i2 + 1; // Go to next edge if edge is not crossed\n // TODO: in most come cases, (numberOfPointsInCell - 1) or 0 edges of the cell\n // will be crossed, but if it crosses right at a point, it could be intersecting\n // with (numberOfPoints) or 1 edge(s). Do we account for that?\n\n var signPoint0 = cellPointsScalars[_i2] > 0;\n var signPoint1 = cellPointsScalars[idNext] > 0;\n\n if (signPoint1 === signPoint0) {\n continue;\n } // Compute preferred interpolation direction\n\n\n var e1 = _i2;\n var e2 = idNext;\n var deltaScalar = cellPointsScalars[e2] - cellPointsScalars[e1];\n\n if (deltaScalar <= 0) {\n e1 = idNext;\n e2 = _i2;\n deltaScalar *= -1;\n } // linear interpolation\n\n\n var t = 0.0;\n\n if (deltaScalar !== 0.0) {\n t = (model.cutValue - cellPointsScalars[e1]) / deltaScalar;\n } // points position\n\n\n var pointID1 = cell[e1];\n var pointID2 = cell[e2];\n x1[0] = pointsData[pointID1 * 3];\n x1[1] = pointsData[pointID1 * 3 + 1];\n x1[2] = pointsData[pointID1 * 3 + 2];\n x2[0] = pointsData[pointID2 * 3];\n x2[1] = pointsData[pointID2 * 3 + 1];\n x2[2] = pointsData[pointID2 * 3 + 2]; // Compute the intersected point on edge\n\n var computedIntersectedPoint = [x1[0] + t * (x2[0] - x1[0]), x1[1] + t * (x2[1] - x1[1]), x1[2] + t * (x2[2] - x1[2])]; // Keep track of it\n\n intersectedEdgesList.push({\n pointEdge1: pointID1,\n // id of one point of the edge\n pointEdge2: pointID2,\n // id of one point of the edge\n intersectedPoint: computedIntersectedPoint,\n // 3D coordinate of points that intersected edge\n newPointID: -1 // id of the intersected point when it will be added into vtkPoints\n\n });\n } // Add points into newPointList\n\n\n for (var _i3 = 0; _i3 < intersectedEdgesList.length; _i3++) {\n var intersectedEdge = intersectedEdgesList[_i3];\n var alreadyAdded = false; // Check if point/edge already added\n\n for (var j = 0; j < crossedEdges.length; j++) {\n var crossedEdge = crossedEdges[j];\n var sameEdge = intersectedEdge.pointEdge1 === crossedEdge.pointEdge1 && intersectedEdge.pointEdge2 === crossedEdge.pointEdge2;\n var samePoint = intersectedEdge.intersectedPoint[0] === crossedEdge.intersectedPoint[0] && intersectedEdge.intersectedPoint[1] === crossedEdge.intersectedPoint[1] && intersectedEdge.intersectedPoint[2] === crossedEdge.intersectedPoint[2];\n\n if (sameEdge || samePoint) {\n alreadyAdded = true;\n intersectedEdgesList[_i3].newPointID = crossedEdges[j].newPointID;\n break;\n }\n }\n\n if (!alreadyAdded) {\n newPointsData.push(intersectedEdge.intersectedPoint[0]);\n newPointsData.push(intersectedEdge.intersectedPoint[1]);\n newPointsData.push(intersectedEdge.intersectedPoint[2]);\n intersectedEdgesList[_i3].newPointID = newPointsData.length / 3 - 1;\n crossedEdges.push(intersectedEdgesList[_i3]);\n }\n } // Store cells\n\n\n var cellSize = intersectedEdgesList.length;\n\n if (cellSize === 2) {\n newLinesData.push(cellSize, intersectedEdgesList[0].newPointID, intersectedEdgesList[1].newPointID);\n } else if (cellSize > 2) {\n newPolysData.push(cellSize);\n intersectedEdgesList.forEach(function (edge) {\n newPolysData.push(edge.newPointID);\n });\n }\n } // Set points\n\n\n var outputPoints = output.getPoints();\n outputPoints.setData(newTypedArrayFrom(points.getDataType(), newPointsData), 3); // Set lines\n\n if (newLinesData.length !== 0) {\n output.getLines().setData(Uint16Array.from(newLinesData));\n } // Set polys\n\n\n if (newPolysData.length !== 0) {\n output.getPolys().setData(Uint16Array.from(newPolysData));\n }\n } // expose requestData\n\n\n publicAPI.requestData = function (inData, outData) {\n // implement requestData\n var input = inData[0];\n\n if (!input) {\n vtkErrorMacro('Invalid or missing input');\n return;\n }\n\n if (!model.cutFunction) {\n vtkErrorMacro('Missing cut function');\n return;\n }\n\n var output = vtkPolyData.newInstance();\n dataSetCutter(input, output);\n outData[0] = output;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n cutFunction: null,\n // support method with evaluateFunction method\n cutScalars: null,\n cutValue: 0.0\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Make this a VTK object\n\n obj(publicAPI, model); // Also make it an algorithm with one input and one output\n\n algo(publicAPI, model, 1, 1); // Set implicit function use to cut the input data (is vtkPlane)\n\n setGet(publicAPI, model, ['cutFunction', 'cutValue']); // Object specific methods\n\n vtkCutter(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend, 'vtkCutter'); // ----------------------------------------------------------------------------\n\nvar vtkCutter$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkCutter$1 as default, extend, newInstance };\n","var ObjectType = {\n ARRAY_BUFFER: 0,\n ELEMENT_ARRAY_BUFFER: 1,\n TEXTURE_BUFFER: 2\n};\nvar Constants = {\n ObjectType: ObjectType\n};\n\nexport { ObjectType, Constants as default };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport macro from '../../macros.js';\nimport Constants from './BufferObject/Constants.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nvar ObjectType = Constants.ObjectType; // ----------------------------------------------------------------------------\n// Global methods\n// ----------------------------------------------------------------------------\n// ----------------------------------------------------------------------------\n// Static API\n// ----------------------------------------------------------------------------\n\nvar STATIC = {}; // ----------------------------------------------------------------------------\n// vtkOpenGLBufferObject methods\n// ----------------------------------------------------------------------------\n\nfunction vtkOpenGLBufferObject(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkOpenGLBufferObject'); // Class-specific private functions\n\n function convertType(type) {\n switch (type) {\n case ObjectType.ELEMENT_ARRAY_BUFFER:\n return model.context.ELEMENT_ARRAY_BUFFER;\n\n case ObjectType.TEXTURE_BUFFER:\n if ('TEXTURE_BUFFER' in model.context) {\n return model.context.TEXTURE_BUFFER;\n }\n\n /* eslint-disable no-fallthrough */\n // Intentional fallthrough in case there is no TEXTURE_BUFFER in WebGL\n\n case ObjectType.ARRAY_BUFFER:\n default:\n return model.context.ARRAY_BUFFER;\n\n /* eslint-enable no-fallthrough */\n }\n }\n\n var internalType = null;\n var internalHandle = null;\n var dirty = true;\n var error = ''; // Public API methods\n\n publicAPI.getType = function () {\n return internalType;\n };\n\n publicAPI.setType = function (value) {\n internalType = value;\n };\n\n publicAPI.getHandle = function () {\n return internalHandle;\n };\n\n publicAPI.isReady = function () {\n return dirty === false;\n };\n\n publicAPI.generateBuffer = function (type) {\n var objectTypeGL = convertType(type);\n\n if (internalHandle === null) {\n internalHandle = model.context.createBuffer();\n internalType = type;\n }\n\n return convertType(internalType) === objectTypeGL;\n };\n\n publicAPI.upload = function (data, type) {\n // buffer, size, type\n var alreadyGenerated = publicAPI.generateBuffer(type);\n\n if (!alreadyGenerated) {\n error = 'Trying to upload array buffer to incompatible buffer.';\n return false;\n }\n\n model.context.bindBuffer(convertType(internalType), internalHandle);\n model.context.bufferData(convertType(internalType), data, model.context.STATIC_DRAW);\n dirty = false;\n return true;\n };\n\n publicAPI.bind = function () {\n if (!internalHandle) {\n return false;\n }\n\n model.context.bindBuffer(convertType(internalType), internalHandle);\n return true;\n };\n\n publicAPI.release = function () {\n if (!internalHandle) {\n return false;\n }\n\n model.context.bindBuffer(convertType(internalType), null);\n return true;\n };\n\n publicAPI.releaseGraphicsResources = function () {\n if (internalHandle !== null) {\n model.context.bindBuffer(convertType(internalType), null);\n model.context.deleteBuffer(internalHandle);\n internalHandle = null;\n }\n };\n\n publicAPI.setOpenGLRenderWindow = function (rw) {\n if (model._openGLRenderWindow === rw) {\n return;\n }\n\n publicAPI.releaseGraphicsResources();\n model._openGLRenderWindow = rw;\n model.context = null;\n\n if (rw) {\n model.context = model._openGLRenderWindow.getContext();\n }\n };\n\n publicAPI.getError = function () {\n return error;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n objectType: ObjectType.ARRAY_BUFFER,\n // _openGLRenderWindow: null,\n context: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Object methods\n\n macro.obj(publicAPI, model);\n macro.get(publicAPI, model, ['_openGLRenderWindow']);\n macro.moveToProtected(publicAPI, model, ['openGLRenderWindow']);\n vtkOpenGLBufferObject(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend); // ----------------------------------------------------------------------------\n\nvar vtkBufferObject = _objectSpread(_objectSpread({\n newInstance: newInstance,\n extend: extend\n}, STATIC), Constants);\n\nexport { STATIC, vtkBufferObject as default, extend, newInstance };\n","import { vec3, mat4, quat } from 'gl-matrix';\nimport macro from '../../macros.js';\nimport vtkBufferObject from './BufferObject.js';\nimport { ObjectType } from './BufferObject/Constants.js';\nimport { Representation } from '../Core/Property/Constants.js';\n\nvar vtkErrorMacro = macro.vtkErrorMacro; // ----------------------------------------------------------------------------\n// Static functions\n// ----------------------------------------------------------------------------\n\nfunction computeInverseShiftAndScaleMatrix(coordShift, coordScale) {\n var inverseScale = new Float64Array(3);\n vec3.inverse(inverseScale, coordScale);\n var matrix = new Float64Array(16);\n mat4.fromRotationTranslationScale(matrix, quat.create(), coordShift, inverseScale);\n return matrix;\n}\n\nfunction shouldApplyCoordShiftAndScale(coordShift, coordScale) {\n if (coordShift === null || coordScale === null) {\n return false;\n }\n\n return !(vec3.exactEquals(coordShift, [0, 0, 0]) && vec3.exactEquals(coordScale, [1, 1, 1]));\n} // ----------------------------------------------------------------------------\n// vtkOpenGLCellArrayBufferObject methods\n// ----------------------------------------------------------------------------\n\n\nfunction vtkOpenGLCellArrayBufferObject(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkOpenGLCellArrayBufferObject');\n publicAPI.setType(ObjectType.ARRAY_BUFFER);\n\n publicAPI.createVBO = function (cellArray, inRep, outRep, options) {\n var selectionMaps = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null;\n\n if (!cellArray.getData() || !cellArray.getData().length) {\n model.elementCount = 0;\n return 0;\n } // Figure out how big each block will be, currently 6 or 7 floats.\n\n\n model.blockSize = 3;\n model.vertexOffset = 0;\n model.normalOffset = 0;\n model.tCoordOffset = 0;\n model.tCoordComponents = 0;\n model.colorComponents = 0;\n model.colorOffset = 0;\n model.customData = [];\n var pointData = options.points.getData();\n var normalData = null;\n var tcoordData = null;\n var colorData = null;\n var colorComponents = options.colors ? options.colors.getNumberOfComponents() : 0;\n var textureComponents = options.tcoords ? options.tcoords.getNumberOfComponents() : 0; // the values of 4 below are because floats are 4 bytes\n\n if (options.normals) {\n model.normalOffset = 4 * model.blockSize;\n model.blockSize += 3;\n normalData = options.normals.getData();\n }\n\n if (options.customAttributes) {\n options.customAttributes.forEach(function (a) {\n if (a) {\n model.customData.push({\n data: a.getData(),\n offset: 4 * model.blockSize,\n components: a.getNumberOfComponents(),\n name: a.getName()\n });\n model.blockSize += a.getNumberOfComponents();\n }\n });\n }\n\n if (options.tcoords) {\n model.tCoordOffset = 4 * model.blockSize;\n model.tCoordComponents = textureComponents;\n model.blockSize += textureComponents;\n tcoordData = options.tcoords.getData();\n }\n\n if (options.colors) {\n model.colorComponents = options.colors.getNumberOfComponents();\n model.colorOffset = 0;\n colorData = options.colors.getData();\n\n if (!model.colorBO) {\n model.colorBO = vtkBufferObject.newInstance();\n }\n\n model.colorBO.setOpenGLRenderWindow(model._openGLRenderWindow);\n } else {\n model.colorBO = null;\n }\n\n model.stride = 4 * model.blockSize;\n var pointIdx = 0;\n var normalIdx = 0;\n var tcoordIdx = 0;\n var colorIdx = 0;\n var custIdx = 0;\n var cellCount = 0;\n var addAPoint;\n var cellBuilders = {\n // easy, every input point becomes an output point\n anythingToPoints: function anythingToPoints(numPoints, cellPts, offset) {\n for (var i = 0; i < numPoints; ++i) {\n addAPoint(cellPts[offset + i]);\n }\n },\n linesToWireframe: function linesToWireframe(numPoints, cellPts, offset) {\n // for lines we add a bunch of segments\n for (var i = 0; i < numPoints - 1; ++i) {\n addAPoint(cellPts[offset + i]);\n addAPoint(cellPts[offset + i + 1]);\n }\n },\n polysToWireframe: function polysToWireframe(numPoints, cellPts, offset) {\n // for polys we add a bunch of segments and close it\n if (numPoints > 2) {\n for (var i = 0; i < numPoints; ++i) {\n addAPoint(cellPts[offset + i]);\n addAPoint(cellPts[offset + (i + 1) % numPoints]);\n }\n }\n },\n stripsToWireframe: function stripsToWireframe(numPoints, cellPts, offset) {\n if (numPoints > 2) {\n // for strips we add a bunch of segments and close it\n for (var i = 0; i < numPoints - 1; ++i) {\n addAPoint(cellPts[offset + i]);\n addAPoint(cellPts[offset + i + 1]);\n }\n\n for (var _i = 0; _i < numPoints - 2; _i++) {\n addAPoint(cellPts[offset + _i]);\n addAPoint(cellPts[offset + _i + 2]);\n }\n }\n },\n polysToSurface: function polysToSurface(npts, cellPts, offset) {\n for (var i = 0; i < npts - 2; i++) {\n addAPoint(cellPts[offset + 0]);\n addAPoint(cellPts[offset + i + 1]);\n addAPoint(cellPts[offset + i + 2]);\n }\n },\n stripsToSurface: function stripsToSurface(npts, cellPts, offset) {\n for (var i = 0; i < npts - 2; i++) {\n addAPoint(cellPts[offset + i]);\n addAPoint(cellPts[offset + i + 1 + i % 2]);\n addAPoint(cellPts[offset + i + 1 + (i + 1) % 2]);\n }\n }\n };\n var cellCounters = {\n // easy, every input point becomes an output point\n anythingToPoints: function anythingToPoints(numPoints, cellPts) {\n return numPoints;\n },\n linesToWireframe: function linesToWireframe(numPoints, cellPts) {\n if (numPoints > 1) {\n return (numPoints - 1) * 2;\n }\n\n return 0;\n },\n polysToWireframe: function polysToWireframe(numPoints, cellPts) {\n if (numPoints > 2) {\n return numPoints * 2;\n }\n\n return 0;\n },\n stripsToWireframe: function stripsToWireframe(numPoints, cellPts) {\n if (numPoints > 2) {\n return numPoints * 4 - 6;\n }\n\n return 0;\n },\n polysToSurface: function polysToSurface(npts, cellPts) {\n if (npts > 2) {\n return (npts - 2) * 3;\n }\n\n return 0;\n },\n stripsToSurface: function stripsToSurface(npts, cellPts, offset) {\n if (npts > 2) {\n return (npts - 2) * 3;\n }\n\n return 0;\n }\n };\n var func = null;\n var countFunc = null;\n\n if (outRep === Representation.POINTS || inRep === 'verts') {\n func = cellBuilders.anythingToPoints;\n countFunc = cellCounters.anythingToPoints;\n } else if (outRep === Representation.WIREFRAME || inRep === 'lines') {\n func = cellBuilders[\"\".concat(inRep, \"ToWireframe\")];\n countFunc = cellCounters[\"\".concat(inRep, \"ToWireframe\")];\n } else {\n func = cellBuilders[\"\".concat(inRep, \"ToSurface\")];\n countFunc = cellCounters[\"\".concat(inRep, \"ToSurface\")];\n }\n\n var array = cellArray.getData();\n var size = array.length;\n var caboCount = 0;\n\n for (var index = 0; index < size;) {\n caboCount += countFunc(array[index], array);\n index += array[index] + 1;\n }\n\n var packedUCVBO = null;\n var packedVBO = new Float32Array(caboCount * model.blockSize);\n\n if (colorData) {\n packedUCVBO = new Uint8Array(caboCount * 4);\n }\n\n var vboidx = 0;\n var ucidx = 0; // Find out if shift scale should be used\n // Compute squares of diagonal size and distance from the origin\n\n var diagSq = 0.0;\n var distSq = 0.0;\n\n for (var i = 0; i < 3; ++i) {\n var range = options.points.getRange(i);\n var delta = range[1] - range[0];\n diagSq += delta * delta;\n var distShift = 0.5 * (range[1] + range[0]);\n distSq += distShift * distShift;\n }\n\n var useShiftAndScale = diagSq > 0 && (Math.abs(distSq) / diagSq > 1.0e6 || // If data is far from the origin relative to its size\n Math.abs(Math.log10(diagSq)) > 3.0 || // If the size is huge when not far from the origin\n diagSq === 0 && distSq > 1.0e6); // If data is a point, but far from the origin\n\n if (useShiftAndScale) {\n // Compute shift and scale vectors\n var coordShift = new Float64Array(3);\n var coordScale = new Float64Array(3);\n\n for (var _i2 = 0; _i2 < 3; ++_i2) {\n var _range = options.points.getRange(_i2);\n\n var _delta = _range[1] - _range[0];\n\n coordShift[_i2] = 0.5 * (_range[1] + _range[0]);\n coordScale[_i2] = _delta > 0 ? 1.0 / _delta : 1.0;\n }\n\n publicAPI.setCoordShiftAndScale(coordShift, coordScale);\n } else if (model.coordShiftAndScaleEnabled === true) {\n // Make sure to reset\n publicAPI.setCoordShiftAndScale(null, null);\n } // Initialize the structures used to keep track of point ids and cell ids for selectors\n\n\n if (selectionMaps) {\n if (!selectionMaps.points && !selectionMaps.cells) {\n selectionMaps.points = new Int32Array(caboCount);\n selectionMaps.cells = new Int32Array(caboCount);\n } else {\n var newPoints = new Int32Array(caboCount + selectionMaps.points.length);\n newPoints.set(selectionMaps.points);\n selectionMaps.points = newPoints;\n var newCells = new Int32Array(caboCount + selectionMaps.cells.length);\n newCells.set(selectionMaps.cells);\n selectionMaps.cells = newCells;\n }\n }\n\n var pointCount = options.vertexOffset;\n\n addAPoint = function addAPointFunc(i) {\n // Keep track of original point and cell ids, for selection\n if (selectionMaps) {\n selectionMaps.points[pointCount] = i;\n selectionMaps.cells[pointCount] = cellCount + options.cellOffset;\n }\n\n ++pointCount; // Vertices\n\n pointIdx = i * 3;\n\n if (!model.coordShiftAndScaleEnabled) {\n packedVBO[vboidx++] = pointData[pointIdx++];\n packedVBO[vboidx++] = pointData[pointIdx++];\n packedVBO[vboidx++] = pointData[pointIdx++];\n } else {\n // Apply shift and scale\n packedVBO[vboidx++] = (pointData[pointIdx++] - model.coordShift[0]) * model.coordScale[0];\n packedVBO[vboidx++] = (pointData[pointIdx++] - model.coordShift[1]) * model.coordScale[1];\n packedVBO[vboidx++] = (pointData[pointIdx++] - model.coordShift[2]) * model.coordScale[2];\n }\n\n if (normalData !== null) {\n if (options.haveCellNormals) {\n normalIdx = (cellCount + options.cellOffset) * 3;\n } else {\n normalIdx = i * 3;\n }\n\n packedVBO[vboidx++] = normalData[normalIdx++];\n packedVBO[vboidx++] = normalData[normalIdx++];\n packedVBO[vboidx++] = normalData[normalIdx++];\n }\n\n model.customData.forEach(function (attr) {\n custIdx = i * attr.components;\n\n for (var j = 0; j < attr.components; ++j) {\n packedVBO[vboidx++] = attr.data[custIdx++];\n }\n });\n\n if (tcoordData !== null) {\n tcoordIdx = i * textureComponents;\n\n for (var j = 0; j < textureComponents; ++j) {\n packedVBO[vboidx++] = tcoordData[tcoordIdx++];\n }\n }\n\n if (colorData !== null) {\n if (options.haveCellScalars) {\n colorIdx = (cellCount + options.cellOffset) * colorComponents;\n } else {\n colorIdx = i * colorComponents;\n }\n\n packedUCVBO[ucidx++] = colorData[colorIdx++];\n packedUCVBO[ucidx++] = colorData[colorIdx++];\n packedUCVBO[ucidx++] = colorData[colorIdx++];\n packedUCVBO[ucidx++] = colorComponents === 4 ? colorData[colorIdx++] : 255;\n }\n };\n\n for (var _index = 0; _index < size;) {\n func(array[_index], array, _index + 1);\n _index += array[_index] + 1;\n cellCount++;\n }\n\n model.elementCount = caboCount;\n publicAPI.upload(packedVBO, ObjectType.ARRAY_BUFFER);\n\n if (model.colorBO) {\n model.colorBOStride = 4;\n model.colorBO.upload(packedUCVBO, ObjectType.ARRAY_BUFFER);\n }\n\n return cellCount;\n };\n\n publicAPI.setCoordShiftAndScale = function (coordShift, coordScale) {\n if (coordShift !== null && (coordShift.constructor !== Float64Array || coordShift.length !== 3)) {\n vtkErrorMacro('Wrong type for coordShift, expected vec3 or null');\n return;\n }\n\n if (coordScale !== null && (coordScale.constructor !== Float64Array || coordScale.length !== 3)) {\n vtkErrorMacro('Wrong type for coordScale, expected vec3 or null');\n return;\n }\n\n if (model.coordShift === null || coordShift === null || !vec3.equals(coordShift, model.coordShift)) {\n model.coordShift = coordShift;\n }\n\n if (model.coordScale === null || coordScale === null || !vec3.equals(coordScale, model.coordScale)) {\n model.coordScale = coordScale;\n }\n\n model.coordShiftAndScaleEnabled = shouldApplyCoordShiftAndScale(model.coordShift, model.coordScale);\n\n if (model.coordShiftAndScaleEnabled) {\n model.inverseShiftAndScaleMatrix = computeInverseShiftAndScaleMatrix(model.coordShift, model.coordScale);\n } else {\n model.inverseShiftAndScaleMatrix = null;\n }\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n elementCount: 0,\n stride: 0,\n colorBOStride: 0,\n vertexOffset: 0,\n normalOffset: 0,\n tCoordOffset: 0,\n tCoordComponents: 0,\n colorOffset: 0,\n colorComponents: 0,\n tcoordBO: null,\n customData: [],\n coordShift: null,\n coordScale: null,\n coordShiftAndScaleEnabled: false,\n inverseShiftAndScaleMatrix: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkBufferObject.extend(publicAPI, model, initialValues);\n macro.setGet(publicAPI, model, ['colorBO', 'elementCount', 'stride', 'colorBOStride', 'vertexOffset', 'normalOffset', 'tCoordOffset', 'tCoordComponents', 'colorOffset', 'colorComponents', 'customData']);\n macro.get(publicAPI, model, ['coordShift', 'coordScale', 'coordShiftAndScaleEnabled', 'inverseShiftAndScaleMatrix']); // Object specific methods\n\n vtkOpenGLCellArrayBufferObject(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend); // ----------------------------------------------------------------------------\n\nvar vtkCellArrayBufferObject = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkCellArrayBufferObject as default, extend, newInstance };\n","import macro from '../../macros.js';\n\nvar vtkErrorMacro = macro.vtkErrorMacro; // export const SHADER_TYPES = ['Vertex', 'Fragment', 'Geometry', 'Unknown'];\n// ----------------------------------------------------------------------------\n// vtkShader methods\n// ----------------------------------------------------------------------------\n\nfunction vtkShader(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkShader');\n\n publicAPI.compile = function () {\n var stype = model.context.VERTEX_SHADER;\n\n if (!model.source || !model.source.length || model.shaderType === 'Unknown') {\n return false;\n } // Ensure we delete the previous shader if necessary.\n\n\n if (model.handle !== 0) {\n model.context.deleteShader(model.handle);\n model.handle = 0;\n }\n\n switch (model.shaderType) {\n // case vtkShader::Geometry:\n // type = GL_GEOMETRY_SHADER;\n // break;\n case 'Fragment':\n stype = model.context.FRAGMENT_SHADER;\n break;\n\n case 'Vertex':\n default:\n stype = model.context.VERTEX_SHADER;\n break;\n }\n\n model.handle = model.context.createShader(stype);\n model.context.shaderSource(model.handle, model.source);\n model.context.compileShader(model.handle);\n var isCompiled = model.context.getShaderParameter(model.handle, model.context.COMPILE_STATUS);\n\n if (!isCompiled) {\n var lastError = model.context.getShaderInfoLog(model.handle);\n vtkErrorMacro(\"Error compiling shader '\".concat(model.source, \"': \").concat(lastError));\n model.context.deleteShader(model.handle);\n model.handle = 0;\n return false;\n } // The shader compiled, store its handle and return success.\n\n\n return true;\n };\n\n publicAPI.cleanup = function () {\n if (model.shaderType === 'Unknown' || model.handle === 0) {\n return;\n }\n\n model.context.deleteShader(model.handle);\n model.handle = 0;\n model.dirty = true;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n shaderType: 'Unknown',\n source: '',\n error: '',\n handle: 0,\n dirty: false,\n context: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Build VTK API\n\n macro.obj(publicAPI, model);\n macro.setGet(publicAPI, model, ['shaderType', 'source', 'error', 'handle', 'context']); // Object methods\n\n vtkShader(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkShader'); // ----------------------------------------------------------------------------\n\nvar vtkShader$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkShader$1 as default, extend, newInstance };\n","import macro from '../../macros.js';\nimport vtkShader from './Shader.js';\n\nvar vtkErrorMacro = macro.vtkErrorMacro; // perform in place string substitutions, indicate if a substitution was done\n// this is useful for building up shader strings which typically involve\n// lots of string substitutions. Return true if a substitution was done.\n\nfunction substitute(source, search, replace, all) {\n // We only accept strings or array of strings, typeof is faster than Array.isArray\n var replaceStr = typeof replace === 'string' ? replace : replace.join('\\n'); // We don't need to instantiate a RegExp if we don't want a global substitution.\n // In all other cases, we need to take the provided string or RegExp and\n // instantiate a new one to add the `g` flag.\n // Argument defaults are transpiled to slow `arguments`-based operations\n // better assume undefined as flag to know if the value is set or not\n\n var replaceSearch = all === false ? search : new RegExp(search, 'g');\n var resultstr = source.replace(replaceSearch, replaceStr);\n return {\n // If the result is different than the input, we did perform a replacement\n replace: resultstr !== replaceStr,\n result: resultstr\n };\n} // ----------------------------------------------------------------------------\n// vtkShaderProgram methods\n// ----------------------------------------------------------------------------\n\nfunction vtkShaderProgram(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkShaderProgram');\n\n publicAPI.compileShader = function () {\n if (!model.vertexShader.compile()) {\n vtkErrorMacro(model.vertexShader.getSource().split('\\n').map(function (line, index) {\n return \"\".concat(index, \": \").concat(line);\n }).join('\\n'));\n vtkErrorMacro(model.vertexShader.getError());\n return 0;\n }\n\n if (!model.fragmentShader.compile()) {\n vtkErrorMacro(model.fragmentShader.getSource().split('\\n').map(function (line, index) {\n return \"\".concat(index, \": \").concat(line);\n }).join('\\n'));\n vtkErrorMacro(model.fragmentShader.getError());\n return 0;\n } // skip geometry for now\n\n\n if (!publicAPI.attachShader(model.vertexShader)) {\n vtkErrorMacro(model.error);\n return 0;\n }\n\n if (!publicAPI.attachShader(model.fragmentShader)) {\n vtkErrorMacro(model.error);\n return 0;\n }\n\n if (!publicAPI.link()) {\n vtkErrorMacro(\"Links failed: \".concat(model.error));\n return 0;\n }\n\n publicAPI.setCompiled(true);\n return 1;\n };\n\n publicAPI.cleanup = function () {\n if (model.shaderType === 'Unknown' || model.handle === 0) {\n return;\n }\n\n model.context.deleteShader(model.handle);\n model.handle = 0;\n };\n\n publicAPI.bind = function () {\n if (!model.linked && !publicAPI.link()) {\n return false;\n }\n\n model.context.useProgram(model.handle);\n publicAPI.setBound(true);\n return true;\n };\n\n publicAPI.isBound = function () {\n return !!model.bound;\n };\n\n publicAPI.release = function () {\n model.context.useProgram(null);\n publicAPI.setBound(false);\n };\n\n publicAPI.setContext = function (ctx) {\n model.vertexShader.setContext(ctx);\n model.fragmentShader.setContext(ctx);\n model.geometryShader.setContext(ctx);\n };\n\n publicAPI.link = function () {\n if (model.linked) {\n return true;\n }\n\n if (model.handle === 0) {\n model.error = 'Program has not been initialized, and/or does not have shaders.';\n return false;\n } // clear out the list of uniforms used\n\n\n model.uniformLocs = {};\n model.context.linkProgram(model.handle);\n var isCompiled = model.context.getProgramParameter(model.handle, model.context.LINK_STATUS);\n\n if (!isCompiled) {\n var lastError = model.context.getProgramInfoLog(model.handle);\n vtkErrorMacro(\"Error linking shader \".concat(lastError));\n model.handle = 0;\n return false;\n }\n\n publicAPI.setLinked(true);\n model.attributeLocs = {};\n return true;\n };\n\n publicAPI.setUniformMatrix = function (name, v) {\n var location = publicAPI.findUniform(name);\n\n if (location === -1) {\n model.error = \"Could not set uniform \".concat(name, \" . No such uniform.\");\n return false;\n }\n\n var f32 = new Float32Array(v);\n model.context.uniformMatrix4fv(location, false, f32);\n return true;\n };\n\n publicAPI.setUniformMatrix3x3 = function (name, v) {\n var location = publicAPI.findUniform(name);\n\n if (location === -1) {\n model.error = \"Could not set uniform \".concat(name, \" . No such uniform.\");\n return false;\n }\n\n var f32 = new Float32Array(v);\n model.context.uniformMatrix3fv(location, false, f32);\n return true;\n };\n\n publicAPI.setUniformf = function (name, v) {\n var location = publicAPI.findUniform(name);\n\n if (location === -1) {\n model.error = \"Could not set uniform \".concat(name, \" . No such uniform.\");\n return false;\n }\n\n model.context.uniform1f(location, v);\n return true;\n };\n\n publicAPI.setUniformfv = function (name, v) {\n var location = publicAPI.findUniform(name);\n\n if (location === -1) {\n model.error = \"Could not set uniform \".concat(name, \" . No such uniform.\");\n return false;\n }\n\n model.context.uniform1fv(location, v);\n return true;\n };\n\n publicAPI.setUniformi = function (name, v) {\n var location = publicAPI.findUniform(name);\n\n if (location === -1) {\n model.error = \"Could not set uniform \".concat(name, \" . No such uniform.\");\n return false;\n }\n\n model.context.uniform1i(location, v);\n return true;\n };\n\n publicAPI.setUniformiv = function (name, v) {\n var location = publicAPI.findUniform(name);\n\n if (location === -1) {\n model.error = \"Could not set uniform \".concat(name, \" . No such uniform.\");\n return false;\n }\n\n model.context.uniform1iv(location, v);\n return true;\n };\n\n publicAPI.setUniform2f = function (name, v1, v2) {\n var location = publicAPI.findUniform(name);\n\n if (location === -1) {\n model.error = \"Could not set uniform \".concat(name, \" . No such uniform.\");\n return false;\n }\n\n if (v2 === undefined) {\n throw new RangeError('Invalid number of values for array');\n }\n\n model.context.uniform2f(location, v1, v2);\n return true;\n };\n\n publicAPI.setUniform2fv = function (name, v) {\n var location = publicAPI.findUniform(name);\n\n if (location === -1) {\n model.error = \"Could not set uniform \".concat(name, \" . No such uniform.\");\n return false;\n }\n\n model.context.uniform2fv(location, v);\n return true;\n };\n\n publicAPI.setUniform2i = function (name, v1, v2) {\n var location = publicAPI.findUniform(name);\n\n if (location === -1) {\n model.error = \"Could not set uniform \".concat(name, \" . No such uniform.\");\n return false;\n }\n\n if (v2 === undefined) {\n throw new RangeError('Invalid number of values for array');\n }\n\n model.context.uniform2i(location, v1, v2);\n return true;\n };\n\n publicAPI.setUniform2iv = function (name, v) {\n var location = publicAPI.findUniform(name);\n\n if (location === -1) {\n model.error = \"Could not set uniform \".concat(name, \" . No such uniform.\");\n return false;\n }\n\n model.context.uniform2iv(location, v);\n return true;\n };\n\n publicAPI.setUniform3f = function (name, a1, a2, a3) {\n var location = publicAPI.findUniform(name);\n\n if (location === -1) {\n model.error = \"Could not set uniform \".concat(name, \" . No such uniform.\");\n return false;\n }\n\n if (a3 === undefined) {\n throw new RangeError('Invalid number of values for array');\n }\n\n model.context.uniform3f(location, a1, a2, a3);\n return true;\n };\n\n publicAPI.setUniform3fArray = function (name, a) {\n var location = publicAPI.findUniform(name);\n\n if (location === -1) {\n model.error = \"Could not set uniform \".concat(name, \" . No such uniform.\");\n return false;\n }\n\n if (!Array.isArray(a) || a.length !== 3) {\n throw new RangeError('Invalid number of values for array');\n }\n\n model.context.uniform3f(location, a[0], a[1], a[2]);\n return true;\n };\n\n publicAPI.setUniform3fv = function (name, v) {\n var location = publicAPI.findUniform(name);\n\n if (location === -1) {\n model.error = \"Could not set uniform \".concat(name, \" . No such uniform.\");\n return false;\n }\n\n model.context.uniform3fv(location, v);\n return true;\n };\n\n publicAPI.setUniform3i = function (name) {\n var location = publicAPI.findUniform(name);\n\n if (location === -1) {\n model.error = \"Could not set uniform \".concat(name, \" . No such uniform.\");\n return false;\n }\n\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n var array = args; // allow an array passed as a single argument\n\n if (array.length === 1 && Array.isArray(array[0])) {\n array = array[0];\n }\n\n if (array.length !== 3) {\n throw new RangeError('Invalid number of values for array');\n }\n\n model.context.uniform3i(location, array[0], array[1], array[2]);\n return true;\n };\n\n publicAPI.setUniform3iv = function (name, v) {\n var location = publicAPI.findUniform(name);\n\n if (location === -1) {\n model.error = \"Could not set uniform \".concat(name, \" . No such uniform.\");\n return false;\n }\n\n model.context.uniform3iv(location, v);\n return true;\n };\n\n publicAPI.setUniform4f = function (name) {\n var location = publicAPI.findUniform(name);\n\n if (location === -1) {\n model.error = \"Could not set uniform \".concat(name, \" . No such uniform.\");\n return false;\n }\n\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n\n var array = args; // allow an array passed as a single argument\n\n if (array.length === 1 && Array.isArray(array[0])) {\n array = array[0];\n }\n\n if (array.length !== 4) {\n throw new RangeError('Invalid number of values for array');\n }\n\n model.context.uniform4f(location, array[0], array[1], array[2], array[3]);\n return true;\n };\n\n publicAPI.setUniform4fv = function (name, v) {\n var location = publicAPI.findUniform(name);\n\n if (location === -1) {\n model.error = \"Could not set uniform \".concat(name, \" . No such uniform.\");\n return false;\n }\n\n model.context.uniform4fv(location, v);\n return true;\n };\n\n publicAPI.setUniform4i = function (name) {\n var location = publicAPI.findUniform(name);\n\n if (location === -1) {\n model.error = \"Could not set uniform \".concat(name, \" . No such uniform.\");\n return false;\n }\n\n for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {\n args[_key3 - 1] = arguments[_key3];\n }\n\n var array = args; // allow an array passed as a single argument\n\n if (array.length === 1 && Array.isArray(array[0])) {\n array = array[0];\n }\n\n if (array.length !== 4) {\n throw new RangeError('Invalid number of values for array');\n }\n\n model.context.uniform4i(location, array[0], array[1], array[2], array[3]);\n return true;\n };\n\n publicAPI.setUniform4iv = function (name, v) {\n var location = publicAPI.findUniform(name);\n\n if (location === -1) {\n model.error = \"Could not set uniform \".concat(name, \" . No such uniform.\");\n return false;\n }\n\n model.context.uniform4iv(location, v);\n return true;\n };\n\n publicAPI.findUniform = function (name) {\n if (!name || !model.linked) {\n return -1;\n } // see if we have cached the result\n\n\n var loc = model.uniformLocs[name];\n\n if (loc !== undefined) {\n return loc;\n }\n\n loc = model.context.getUniformLocation(model.handle, name);\n\n if (loc === null) {\n model.error = \"Uniform \".concat(name, \" not found in current shader program.\");\n model.uniformLocs[name] = -1;\n return -1;\n }\n\n model.uniformLocs[name] = loc;\n return loc;\n };\n\n publicAPI.isUniformUsed = function (name) {\n if (!name) {\n return false;\n } // see if we have cached the result\n\n\n var loc = model.uniformLocs[name];\n\n if (loc !== undefined) {\n return loc !== null;\n }\n\n if (!model.linked) {\n vtkErrorMacro('attempt to find uniform when the shader program is not linked');\n return false;\n }\n\n loc = model.context.getUniformLocation(model.handle, name);\n model.uniformLocs[name] = loc;\n\n if (loc === null) {\n return false;\n }\n\n return true;\n };\n\n publicAPI.isAttributeUsed = function (name) {\n if (!name) {\n return false;\n } // see if we have cached the result\n\n\n if (name in model.attributeLocs) {\n return true;\n }\n\n if (!model.linked) {\n vtkErrorMacro('attempt to find uniform when the shader program is not linked');\n return false;\n }\n\n var loc = model.context.getAttribLocation(model.handle, name);\n\n if (loc === -1) {\n return false;\n }\n\n model.attributeLocs[name] = loc;\n return true;\n };\n\n publicAPI.attachShader = function (shader) {\n if (shader.getHandle() === 0) {\n model.error = 'Shader object was not initialized, cannot attach it.';\n return false;\n }\n\n if (shader.getShaderType() === 'Unknown') {\n model.error = 'Shader object is of type Unknown and cannot be used.';\n return false;\n }\n\n if (model.handle === 0) {\n var thandle = model.context.createProgram();\n\n if (thandle === 0) {\n model.error = 'Could not create shader program.';\n return false;\n }\n\n model.handle = thandle;\n model.linked = false;\n }\n\n if (shader.getShaderType() === 'Vertex') {\n if (model.vertexShaderHandle !== 0) {\n model.comntext.detachShader(model.handle, model.vertexShaderHandle);\n }\n\n model.vertexShaderHandle = shader.getHandle();\n }\n\n if (shader.getShaderType() === 'Fragment') {\n if (model.fragmentShaderHandle !== 0) {\n model.context.detachShader(model.handle, model.fragmentShaderHandle);\n }\n\n model.fragmentShaderHandle = shader.getHandle();\n }\n\n model.context.attachShader(model.handle, shader.getHandle());\n publicAPI.setLinked(false);\n return true;\n };\n\n publicAPI.detachShader = function (shader) {\n if (shader.getHandle() === 0) {\n model.error = 'shader object was not initialized, cannot attach it.';\n return false;\n }\n\n if (shader.getShaderType() === 'Unknown') {\n model.error = 'Shader object is of type Unknown and cannot be used.';\n return false;\n }\n\n if (model.handle === 0) {\n model.error = 'This shader program has not been initialized yet.';\n }\n\n switch (shader.getShaderType()) {\n case 'Vertex':\n if (model.vertexShaderHandle !== shader.getHandle()) {\n model.error = 'The supplied shader was not attached to this program.';\n return false;\n }\n\n model.context.detachShader(model.handle, shader.getHandle());\n model.vertexShaderHandle = 0;\n model.linked = false;\n return true;\n\n case 'Fragment':\n if (model.fragmentShaderHandle !== shader.getHandle()) {\n model.error = 'The supplied shader was not attached to this program.';\n return false;\n }\n\n model.context.detachShader(model.handle, shader.getHandle());\n model.fragmentShaderHandle = 0;\n model.linked = false;\n return true;\n\n default:\n return false;\n }\n };\n\n publicAPI.setContext = function (ctx) {\n model.context = ctx;\n model.vertexShader.setContext(ctx);\n model.fragmentShader.setContext(ctx);\n model.geometryShader.setContext(ctx);\n };\n\n publicAPI.setLastCameraMTime = function (mtime) {\n model.lastCameraMTime = mtime;\n }; // publicAPI.enableAttributeArray = (name) => {\n // const location = publicAPI.findAttributeArray(name);\n // if (location === -1) {\n // model.error = `Could not enable attribute ${name} No such attribute.`;\n // return false;\n // }\n // model.context.enableVertexAttribArray(location);\n // return true;\n // };\n // publicAPI.disableAttributeArray = (name) => {\n // const location = publicAPI.findAttributeArray(name);\n // if (location === -1) {\n // model.error = `Could not enable attribute ${name} No such attribute.`;\n // return false;\n // }\n // model.context.disableVertexAttribArray(location);\n // return true;\n // };\n\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n vertexShaderHandle: 0,\n fragmentShaderHandle: 0,\n geometryShaderHandle: 0,\n vertexShader: null,\n fragmentShader: null,\n geometryShader: null,\n linked: false,\n bound: false,\n compiled: false,\n error: '',\n handle: 0,\n numberOfOutputs: 0,\n attributesLocs: null,\n uniformLocs: null,\n md5Hash: 0,\n context: null,\n lastCameraMTime: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Instantiate internal objects\n\n model.attributesLocs = {};\n model.uniformLocs = {};\n model.vertexShader = vtkShader.newInstance();\n model.vertexShader.setShaderType('Vertex');\n model.fragmentShader = vtkShader.newInstance();\n model.fragmentShader.setShaderType('Fragment');\n model.geometryShader = vtkShader.newInstance();\n model.geometryShader.setShaderType('Geometry'); // Build VTK API\n\n macro.obj(publicAPI, model);\n macro.get(publicAPI, model, ['lastCameraMTime']);\n macro.setGet(publicAPI, model, ['error', 'handle', 'compiled', 'bound', 'md5Hash', 'vertexShader', 'fragmentShader', 'geometryShader', 'linked']); // Object methods\n\n vtkShaderProgram(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\n\nvar newInstance = macro.newInstance(extend, 'vtkShaderProgram'); // ----------------------------------------------------------------------------\n\nvar vtkShaderProgram$1 = {\n newInstance: newInstance,\n extend: extend,\n substitute: substitute\n};\n\nexport { vtkShaderProgram$1 as default, substitute };\n","import macro from '../../macros.js';\nimport { ObjectType } from './BufferObject/Constants.js';\n\n// vtkOpenGLVertexArrayObject methods\n// ----------------------------------------------------------------------------\n\nfunction vtkOpenGLVertexArrayObject(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkOpenGLVertexArrayObject'); // Public API methods\n\n publicAPI.exposedMethod = function () {// This is a publicly exposed method of this object\n };\n\n publicAPI.initialize = function () {\n model.instancingExtension = null;\n\n if (!model._openGLRenderWindow.getWebgl2()) {\n model.instancingExtension = model.context.getExtension('ANGLE_instanced_arrays');\n }\n\n if (!model.forceEmulation && model._openGLRenderWindow && model._openGLRenderWindow.getWebgl2()) {\n model.extension = null;\n model.supported = true;\n model.handleVAO = model.context.createVertexArray();\n } else {\n model.extension = model.context.getExtension('OES_vertex_array_object'); // Start setting up VAO\n\n if (!model.forceEmulation && model.extension) {\n model.supported = true;\n model.handleVAO = model.extension.createVertexArrayOES();\n } else {\n model.supported = false;\n }\n }\n };\n\n publicAPI.isReady = function () {\n return (// We either probed and allocated a VAO, or are falling back as the current\n // hardware does not support VAOs.\n model.handleVAO !== 0 || model.supported === false\n );\n };\n\n publicAPI.bind = function () {\n // Either simply bind the VAO, or emulate behavior by binding all attributes.\n if (!publicAPI.isReady()) {\n publicAPI.initialize();\n }\n\n if (publicAPI.isReady() && model.supported) {\n if (model.extension) {\n model.extension.bindVertexArrayOES(model.handleVAO);\n } else {\n model.context.bindVertexArray(model.handleVAO);\n }\n } else if (publicAPI.isReady()) {\n var gl = model.context;\n\n for (var ibuff = 0; ibuff < model.buffers.length; ++ibuff) {\n var buff = model.buffers[ibuff];\n model.context.bindBuffer(gl.ARRAY_BUFFER, buff.buffer);\n\n for (var iatt = 0; iatt < buff.attributes.length; ++iatt) {\n var attrIt = buff.attributes[iatt];\n var matrixCount = attrIt.isMatrix ? attrIt.size : 1;\n\n for (var i = 0; i < matrixCount; ++i) {\n gl.enableVertexAttribArray(attrIt.index + i);\n gl.vertexAttribPointer(attrIt.index + i, attrIt.size, attrIt.type, attrIt.normalize, attrIt.stride, attrIt.offset + attrIt.stride * i / attrIt.size);\n\n if (attrIt.divisor > 0) {\n if (model.instancingExtension) {\n model.instancingExtension.vertexAttribDivisorANGLE(attrIt.index + i, 1);\n } else {\n gl.vertexAttribDivisor(attrIt.index + i, 1);\n }\n }\n }\n }\n }\n }\n };\n\n publicAPI.release = function () {\n // Either simply release the VAO, or emulate behavior by releasing all attributes.\n if (publicAPI.isReady() && model.supported) {\n if (model.extension) {\n model.extension.bindVertexArrayOES(null);\n } else {\n model.context.bindVertexArray(null);\n }\n } else if (publicAPI.isReady()) {\n var gl = model.context;\n\n for (var ibuff = 0; ibuff < model.buffers.length; ++ibuff) {\n var buff = model.buffers[ibuff];\n model.context.bindBuffer(gl.ARRAY_BUFFER, buff.buffer);\n\n for (var iatt = 0; iatt < buff.attributes.length; ++iatt) {\n var attrIt = buff.attributes[iatt];\n var matrixCount = attrIt.isMatrix ? attrIt.size : 1;\n\n for (var i = 0; i < matrixCount; ++i) {\n gl.enableVertexAttribArray(attrIt.index + i);\n gl.vertexAttribPointer(attrIt.index + i, attrIt.size, attrIt.type, attrIt.normalize, attrIt.stride, attrIt.offset + attrIt.stride * i / attrIt.size);\n\n if (attrIt.divisor > 0) {\n if (model.instancingExtension) {\n model.instancingExtension.vertexAttribDivisorANGLE(attrIt.index + i, 0);\n } else {\n gl.vertexAttribDivisor(attrIt.index + i, 0);\n }\n }\n\n gl.disableVertexAttribArray(attrIt.index + i);\n }\n }\n }\n }\n };\n\n publicAPI.shaderProgramChanged = function () {\n publicAPI.release();\n\n if (model.handleVAO) {\n if (model.extension) {\n model.extension.deleteVertexArrayOES(model.handleVAO);\n } else {\n model.context.deleteVertexArray(model.handleVAO);\n }\n }\n\n model.handleVAO = 0;\n model.handleProgram = 0;\n };\n\n publicAPI.releaseGraphicsResources = function () {\n publicAPI.shaderProgramChanged();\n\n if (model.handleVAO) {\n if (model.extension) {\n model.extension.deleteVertexArrayOES(model.handleVAO);\n } else {\n model.context.deleteVertexArray(model.handleVAO);\n }\n }\n\n model.handleVAO = 0;\n model.supported = true;\n model.handleProgram = 0;\n };\n\n publicAPI.addAttributeArray = function (program, buffer, name, offset, stride, elementType, elementTupleSize, normalize) {\n return publicAPI.addAttributeArrayWithDivisor(program, buffer, name, offset, stride, elementType, elementTupleSize, normalize, 0, false);\n };\n\n publicAPI.addAttributeArrayWithDivisor = function (program, buffer, name, offset, stride, elementType, elementTupleSize, normalize, divisor, isMatrix) {\n if (!program) {\n return false;\n } // Check the program is bound, and the buffer is valid.\n\n\n if (!program.isBound() || buffer.getHandle() === 0 || buffer.getType() !== ObjectType.ARRAY_BUFFER) {\n return false;\n } // Perform initialization if necessary, ensure program matches VAOs.\n\n\n if (model.handleProgram === 0) {\n model.handleProgram = program.getHandle();\n }\n\n if (!publicAPI.isReady()) {\n publicAPI.initialize();\n }\n\n if (!publicAPI.isReady() || model.handleProgram !== program.getHandle()) {\n return false;\n }\n\n var gl = model.context;\n var attribs = {};\n attribs.name = name;\n attribs.index = gl.getAttribLocation(model.handleProgram, name);\n attribs.offset = offset;\n attribs.stride = stride;\n attribs.type = elementType;\n attribs.size = elementTupleSize;\n attribs.normalize = normalize;\n attribs.isMatrix = isMatrix;\n attribs.divisor = divisor;\n\n if (attribs.Index === -1) {\n return false;\n } // Always make the call as even the first use wants the attrib pointer setting\n // up when we are emulating.\n\n\n buffer.bind();\n gl.enableVertexAttribArray(attribs.index);\n gl.vertexAttribPointer(attribs.index, attribs.size, attribs.type, attribs.normalize, attribs.stride, attribs.offset);\n\n if (divisor > 0) {\n if (model.instancingExtension) {\n model.instancingExtension.vertexAttribDivisorANGLE(attribs.index, 1);\n } else {\n gl.vertexAttribDivisor(attribs.index, 1);\n }\n }\n\n attribs.buffer = buffer.getHandle(); // If vertex array objects are not supported then build up our list.\n\n if (!model.supported) {\n // find the buffer\n var buffFound = false;\n\n for (var ibuff = 0; ibuff < model.buffers.length; ++ibuff) {\n var buff = model.buffers[ibuff];\n\n if (buff.buffer === attribs.buffer) {\n buffFound = true;\n var found = false;\n\n for (var iatt = 0; iatt < buff.attributes.length; ++iatt) {\n var attrIt = buff.attributes[iatt];\n\n if (attrIt.name === name) {\n found = true;\n buff.attributes[iatt] = attribs;\n }\n }\n\n if (!found) {\n buff.attributes.push(attribs);\n }\n }\n }\n\n if (!buffFound) {\n model.buffers.push({\n buffer: attribs.buffer,\n attributes: [attribs]\n });\n }\n }\n\n return true;\n };\n\n publicAPI.addAttributeMatrixWithDivisor = function (program, buffer, name, offset, stride, elementType, elementTupleSize, normalize, divisor) {\n // bind the first row of values\n var result = publicAPI.addAttributeArrayWithDivisor(program, buffer, name, offset, stride, elementType, elementTupleSize, normalize, divisor, true);\n\n if (!result) {\n return result;\n }\n\n var gl = model.context;\n var index = gl.getAttribLocation(model.handleProgram, name);\n\n for (var i = 1; i < elementTupleSize; i++) {\n gl.enableVertexAttribArray(index + i);\n gl.vertexAttribPointer(index + i, elementTupleSize, elementType, normalize, stride, offset + stride * i / elementTupleSize);\n\n if (divisor > 0) {\n if (model.instancingExtension) {\n model.instancingExtension.vertexAttribDivisorANGLE(index + i, 1);\n } else {\n gl.vertexAttribDivisor(index + i, 1);\n }\n }\n }\n\n return true;\n };\n\n publicAPI.removeAttributeArray = function (name) {\n if (!publicAPI.isReady() || model.handleProgram === 0) {\n return false;\n } // If we don't have real VAOs find the entry and remove it too.\n\n\n if (!model.supported) {\n for (var ibuff = 0; ibuff < model.buffers.length; ++ibuff) {\n var buff = model.buffers[ibuff];\n\n for (var iatt = 0; iatt < buff.attributes.length; ++iatt) {\n var attrIt = buff.attributes[iatt];\n\n if (attrIt.name === name) {\n buff.attributes.splice(iatt, 1);\n\n if (!buff.attributes.length) {\n model.buffers.splice(ibuff, 1);\n }\n\n return true;\n }\n }\n }\n }\n\n return true;\n };\n\n publicAPI.setOpenGLRenderWindow = function (rw) {\n if (model._openGLRenderWindow === rw) {\n return;\n }\n\n publicAPI.releaseGraphicsResources();\n model._openGLRenderWindow = rw;\n model.context = null;\n\n if (rw) {\n model.context = model._openGLRenderWindow.getContext();\n }\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n forceEmulation: false,\n handleVAO: 0,\n handleProgram: 0,\n supported: true,\n buffers: null,\n context: null // _openGLRenderWindow: null,\n\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Internal objects initialization\n\n model.buffers = []; // Object methods\n\n macro.obj(publicAPI, model); // Create get-only macros\n\n macro.get(publicAPI, model, ['supported']); // Create get-set macros\n\n macro.setGet(publicAPI, model, ['forceEmulation']); // For more macro methods, see \"Sources/macros.js\"\n // Object specific methods\n\n vtkOpenGLVertexArrayObject(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkOpenGLVertexArrayObject'); // ----------------------------------------------------------------------------\n\nvar vtkVertexArrayObject = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkVertexArrayObject as default, extend, newInstance };\n","import macro from '../../macros.js';\nimport vtkCellArrayBufferObject from './CellArrayBufferObject.js';\nimport vtkShaderProgram from './ShaderProgram.js';\nimport vtkVertexArrayObject from './VertexArrayObject.js';\nimport { Representation } from '../Core/Property/Constants.js';\n\nvar primTypes = {\n Start: 0,\n Points: 0,\n Lines: 1,\n Tris: 2,\n TriStrips: 3,\n TrisEdges: 4,\n TriStripsEdges: 5,\n End: 6\n}; // ----------------------------------------------------------------------------\n// vtkOpenGLHelper methods\n// ----------------------------------------------------------------------------\n\nfunction vtkOpenGLHelper(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkOpenGLHelper');\n\n publicAPI.setOpenGLRenderWindow = function (win) {\n model.context = win.getContext();\n model.program.setContext(model.context);\n model.VAO.setOpenGLRenderWindow(win);\n model.CABO.setOpenGLRenderWindow(win);\n };\n\n publicAPI.releaseGraphicsResources = function (oglwin) {\n model.VAO.releaseGraphicsResources();\n model.CABO.releaseGraphicsResources();\n model.CABO.setElementCount(0);\n };\n\n publicAPI.drawArrays = function (ren, actor, rep, oglMapper) {\n // Are there any entries\n if (model.CABO.getElementCount()) {\n // are we drawing edges\n var mode = publicAPI.getOpenGLMode(rep);\n var wideLines = publicAPI.haveWideLines(ren, actor);\n var gl = model.context;\n var depthMask = gl.getParameter(gl.DEPTH_WRITEMASK);\n\n if (model.pointPicking) {\n gl.depthMask(false);\n }\n\n var drawingLines = mode === gl.LINES;\n\n if (drawingLines && wideLines) {\n publicAPI.updateShaders(ren, actor, oglMapper);\n gl.drawArraysInstanced(mode, 0, model.CABO.getElementCount(), 2 * Math.ceil(actor.getProperty().getLineWidth()));\n } else {\n gl.lineWidth(actor.getProperty().getLineWidth());\n publicAPI.updateShaders(ren, actor, oglMapper);\n gl.drawArrays(mode, 0, model.CABO.getElementCount()); // reset the line width\n\n gl.lineWidth(1);\n }\n\n var stride = (mode === gl.POINTS ? 1 : 0) || (mode === gl.LINES ? 2 : 3);\n\n if (model.pointPicking) {\n gl.depthMask(depthMask);\n }\n\n return model.CABO.getElementCount() / stride;\n }\n\n return 0;\n };\n\n publicAPI.getOpenGLMode = function (rep) {\n if (model.pointPicking) {\n return model.context.POINTS;\n }\n\n var type = model.primitiveType;\n\n if (rep === Representation.POINTS || type === primTypes.Points) {\n return model.context.POINTS;\n }\n\n if (rep === Representation.WIREFRAME || type === primTypes.Lines || type === primTypes.TrisEdges || type === primTypes.TriStripsEdges) {\n return model.context.LINES;\n }\n\n return model.context.TRIANGLES;\n };\n\n publicAPI.haveWideLines = function (ren, actor) {\n if (actor.getProperty().getLineWidth() > 1.0) {\n // we have wide lines, but the OpenGL implementation may\n // actually support them, check the range to see if we\n // really need have to implement our own wide lines\n if (model.CABO.getOpenGLRenderWindow()) {\n if (model.CABO.getOpenGLRenderWindow().getHardwareMaximumLineWidth() >= actor.getProperty().getLineWidth()) {\n return false;\n }\n }\n\n return true;\n }\n\n return false;\n };\n\n publicAPI.getNeedToRebuildShaders = function (ren, actor, oglMapper) {\n // has something changed that would require us to recreate the shader?\n // candidates are\n // property modified (representation interpolation and lighting)\n // input modified\n // mapper modified (lighting complexity)\n if (oglMapper.getNeedToRebuildShaders(publicAPI, ren, actor) || publicAPI.getProgram() === 0 || publicAPI.getShaderSourceTime().getMTime() < oglMapper.getMTime() || publicAPI.getShaderSourceTime().getMTime() < actor.getMTime()) {\n return true;\n }\n\n return false;\n };\n\n publicAPI.updateShaders = function (ren, actor, oglMapper) {\n // has something changed that would require us to recreate the shader?\n if (publicAPI.getNeedToRebuildShaders(ren, actor, oglMapper)) {\n var shaders = {\n Vertex: null,\n Fragment: null,\n Geometry: null\n };\n oglMapper.buildShaders(shaders, ren, actor); // compile and bind the program if needed\n\n var newShader = model.CABO.getOpenGLRenderWindow().getShaderCache().readyShaderProgramArray(shaders.Vertex, shaders.Fragment, shaders.Geometry); // if the shader changed reinitialize the VAO\n\n if (newShader !== publicAPI.getProgram()) {\n publicAPI.setProgram(newShader); // reset the VAO as the shader has changed\n\n publicAPI.getVAO().releaseGraphicsResources();\n }\n\n publicAPI.getShaderSourceTime().modified();\n } else {\n model.CABO.getOpenGLRenderWindow().getShaderCache().readyShaderProgram(publicAPI.getProgram());\n }\n\n publicAPI.getVAO().bind();\n oglMapper.setMapperShaderParameters(publicAPI, ren, actor);\n oglMapper.setPropertyShaderParameters(publicAPI, ren, actor);\n oglMapper.setCameraShaderParameters(publicAPI, ren, actor);\n oglMapper.setLightingShaderParameters(publicAPI, ren, actor);\n oglMapper.invokeShaderCallbacks(publicAPI, ren, actor);\n };\n\n publicAPI.setMapperShaderParameters = function (ren, actor, size) {\n if (publicAPI.haveWideLines(ren, actor)) {\n publicAPI.getProgram().setUniform2f('viewportSize', size.usize, size.vsize);\n var lineWidth = parseFloat(actor.getProperty().getLineWidth());\n var halfLineWidth = lineWidth / 2.0;\n publicAPI.getProgram().setUniformf('lineWidthStepSize', lineWidth / Math.ceil(lineWidth));\n publicAPI.getProgram().setUniformf('halfLineWidth', halfLineWidth);\n }\n\n if (model.primitiveType === primTypes.Points || actor.getProperty().getRepresentation() === Representation.POINTS) {\n publicAPI.getProgram().setUniformf('pointSize', actor.getProperty().getPointSize());\n } else if (model.pointPicking) {\n publicAPI.getProgram().setUniformf('pointSize', publicAPI.getPointPickingPrimitiveSize());\n }\n };\n\n publicAPI.replaceShaderPositionVC = function (shaders, ren, actor) {\n var VSSource = shaders.Vertex; // Always set point size in case we need picking\n\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::PositionVC::Dec', ['//VTK::PositionVC::Dec', 'uniform float pointSize;']).result;\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::PositionVC::Impl', ['//VTK::PositionVC::Impl', ' gl_PointSize = pointSize;'], false).result; // for lines, make sure we add the width code\n\n if (publicAPI.getOpenGLMode(actor.getProperty().getRepresentation()) === model.context.LINES && publicAPI.haveWideLines(ren, actor)) {\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::PositionVC::Dec', ['//VTK::PositionVC::Dec', 'uniform vec2 viewportSize;', 'uniform float lineWidthStepSize;', 'uniform float halfLineWidth;']).result;\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::PositionVC::Impl', ['//VTK::PositionVC::Impl', ' if (halfLineWidth > 0.0)', ' {', ' float offset = float(gl_InstanceID / 2) * lineWidthStepSize - halfLineWidth;', ' vec4 tmpPos = gl_Position;', ' vec3 tmpPos2 = tmpPos.xyz / tmpPos.w;', ' tmpPos2.x = tmpPos2.x + 2.0 * mod(float(gl_InstanceID), 2.0) * offset / viewportSize[0];', ' tmpPos2.y = tmpPos2.y + 2.0 * mod(float(gl_InstanceID + 1), 2.0) * offset / viewportSize[1];', ' gl_Position = vec4(tmpPos2.xyz * tmpPos.w, tmpPos.w);', ' }']).result;\n }\n\n shaders.Vertex = VSSource;\n };\n\n publicAPI.getPointPickingPrimitiveSize = function () {\n if (model.primitiveType === primTypes.Points) {\n return 2;\n }\n\n if (model.primitiveType === primTypes.Lines) {\n return 4;\n }\n\n return 6;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n context: null,\n program: null,\n shaderSourceTime: null,\n VAO: null,\n attributeUpdateTime: null,\n CABO: null,\n primitiveType: 0,\n pointPicking: false\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Build VTK API\n\n macro.obj(publicAPI, model);\n model.shaderSourceTime = {};\n macro.obj(model.shaderSourceTime);\n model.attributeUpdateTime = {};\n macro.obj(model.attributeUpdateTime);\n macro.setGet(publicAPI, model, ['program', 'shaderSourceTime', 'VAO', 'attributeUpdateTime', 'CABO', 'primitiveType', 'pointPicking']);\n model.program = vtkShaderProgram.newInstance();\n model.VAO = vtkVertexArrayObject.newInstance();\n model.CABO = vtkCellArrayBufferObject.newInstance(); // Object methods\n\n vtkOpenGLHelper(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend); // ----------------------------------------------------------------------------\n\nvar vtkHelper = {\n newInstance: newInstance,\n extend: extend,\n primTypes: primTypes\n};\n\nexport { vtkHelper as default, extend, newInstance, primTypes };\n","var Wrap = {\n CLAMP_TO_EDGE: 0,\n REPEAT: 1,\n MIRRORED_REPEAT: 2\n};\nvar Filter = {\n NEAREST: 0,\n LINEAR: 1,\n NEAREST_MIPMAP_NEAREST: 2,\n NEAREST_MIPMAP_LINEAR: 3,\n LINEAR_MIPMAP_NEAREST: 4,\n LINEAR_MIPMAP_LINEAR: 5\n};\nvar Constants = {\n Wrap: Wrap,\n Filter: Filter\n};\n\nexport { Filter, Wrap, Constants as default };\n","/* eslint-disable no-bitwise */\nvar floatView = new Float32Array(1);\nvar int32View = new Int32Array(floatView.buffer);\n/* eslint-disable no-bitwise */\n\n/* This method is faster than the OpenEXR implementation (very often\n * used, eg. in Ogre), with the additional benefit of rounding, inspired\n * by James Tursa?s half-precision code. */\n\nfunction toHalf(val) {\n floatView[0] = val;\n var x = int32View[0];\n var bits = x >> 16 & 0x8000;\n /* Get the sign */\n\n var m = x >> 12 & 0x07ff;\n /* Keep one extra bit for rounding */\n\n var e = x >> 23 & 0xff;\n /* Using int is faster here */\n\n /* If zero, or denormal, or exponent underflows too much for a denormal\n * half, return signed zero. */\n\n if (e < 103) {\n return bits;\n }\n /* If NaN, return NaN. If Inf or exponent overflow, return Inf. */\n\n\n if (e > 142) {\n bits |= 0x7c00;\n /* If exponent was 0xff and one mantissa bit was set, it means NaN,\n * not Inf, so make sure we set one mantissa bit too. */\n\n bits |= (e === 255 ? 0 : 1) && x & 0x007fffff;\n return bits;\n }\n /* If exponent underflows but not too much, return a denormal */\n\n\n if (e < 113) {\n m |= 0x0800;\n /* Extra rounding may overflow and set mantissa to 0 and exponent\n * to 1, which is OK. */\n\n bits |= (m >> 114 - e) + (m >> 113 - e & 1);\n return bits;\n }\n\n bits |= e - 112 << 10 | m >> 1;\n /* Extra rounding. An overflow will set mantissa to 0 and increment\n * the exponent, which is OK. */\n\n bits += m & 1;\n return bits;\n}\n\nfunction fromHalf(h) {\n var s = (h & 0x8000) >> 15;\n var e = (h & 0x7c00) >> 10;\n var f = h & 0x03ff;\n\n if (e === 0) {\n return (s ? -1 : 1) * Math.pow(2, -14) * (f / Math.pow(2, 10));\n }\n\n if (e === 0x1f) {\n return f ? NaN : (s ? -1 : 1) * Infinity;\n }\n\n return (s ? -1 : 1) * Math.pow(2, e - 15) * (1 + f / Math.pow(2, 10));\n}\n\nvar HalfFloat = {\n fromHalf: fromHalf,\n toHalf: toHalf\n};\n\nexport { HalfFloat as default };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport _slicedToArray from '@babel/runtime/helpers/slicedToArray';\nimport Constants from './Texture/Constants.js';\nimport HalfFloat from '../../Common/Core/HalfFloat.js';\nimport { newInstance as newInstance$1, obj, set, setGet, get, moveToProtected, newTypedArray, vtkDebugMacro as vtkDebugMacro$1, vtkErrorMacro as vtkErrorMacro$1, vtkWarningMacro as vtkWarningMacro$1 } from '../../macros.js';\nimport vtkDataArray from '../../Common/Core/DataArray.js';\nimport { Q as isPowerOfTwo, M as nearestPowerOfTwo } from '../../Common/Core/Math/index.js';\nimport vtkViewNode from '../SceneGraph/ViewNode.js';\nimport { registerOverride } from './ViewNodeFactory.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nvar Wrap = Constants.Wrap,\n Filter = Constants.Filter;\nvar VtkDataTypes = vtkDataArray.VtkDataTypes;\nvar vtkDebugMacro = vtkDebugMacro$1,\n vtkErrorMacro = vtkErrorMacro$1,\n vtkWarningMacro = vtkWarningMacro$1;\nvar toHalf = HalfFloat.toHalf; // ----------------------------------------------------------------------------\n// vtkOpenGLTexture methods\n// ----------------------------------------------------------------------------\n\nfunction vtkOpenGLTexture(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkOpenGLTexture'); // Renders myself\n\n publicAPI.render = function () {\n var renWin = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n\n if (renWin) {\n model._openGLRenderWindow = renWin;\n } else {\n model._openGLRenderer = publicAPI.getFirstAncestorOfType('vtkOpenGLRenderer'); // sync renderable properties\n\n model._openGLRenderWindow = model._openGLRenderer.getParent();\n }\n\n model.context = model._openGLRenderWindow.getContext();\n\n if (model.renderable.getInterpolate()) {\n if (model.generateMipmap) {\n publicAPI.setMinificationFilter(Filter.LINEAR_MIPMAP_LINEAR);\n } else {\n publicAPI.setMinificationFilter(Filter.LINEAR);\n }\n\n publicAPI.setMagnificationFilter(Filter.LINEAR);\n } else {\n publicAPI.setMinificationFilter(Filter.NEAREST);\n publicAPI.setMagnificationFilter(Filter.NEAREST);\n }\n\n if (model.renderable.getRepeat()) {\n publicAPI.setWrapR(Wrap.REPEAT);\n publicAPI.setWrapS(Wrap.REPEAT);\n publicAPI.setWrapT(Wrap.REPEAT);\n } // clear image if input data is set\n\n\n if (model.renderable.getInputData()) {\n model.renderable.setImage(null);\n } // create the texture if it is not done already\n\n\n if (!model.handle || model.renderable.getMTime() > model.textureBuildTime.getMTime()) {\n // if we have an Image\n if (model.renderable.getImage() !== null) {\n if (model.renderable.getInterpolate()) {\n model.generateMipmap = true;\n publicAPI.setMinificationFilter(Filter.LINEAR_MIPMAP_LINEAR);\n } // Have an Image which may not be complete\n\n\n if (model.renderable.getImage() && model.renderable.getImageLoaded()) {\n publicAPI.create2DFromImage(model.renderable.getImage());\n publicAPI.activate();\n publicAPI.sendParameters();\n model.textureBuildTime.modified();\n }\n } // if we have a canvas\n\n\n if (model.renderable.getCanvas() !== null) {\n if (model.renderable.getInterpolate()) {\n model.generateMipmap = true;\n publicAPI.setMinificationFilter(Filter.LINEAR_MIPMAP_LINEAR);\n }\n\n var canvas = model.renderable.getCanvas();\n publicAPI.create2DFromRaw(canvas.width, canvas.height, 4, VtkDataTypes.UNSIGNED_CHAR, canvas, true);\n publicAPI.activate();\n publicAPI.sendParameters();\n model.textureBuildTime.modified();\n } // if we have jsImageData\n\n\n if (model.renderable.getJsImageData() !== null) {\n var jsid = model.renderable.getJsImageData();\n\n if (model.renderable.getInterpolate()) {\n model.generateMipmap = true;\n publicAPI.setMinificationFilter(Filter.LINEAR_MIPMAP_LINEAR);\n }\n\n publicAPI.create2DFromRaw(jsid.width, jsid.height, 4, VtkDataTypes.UNSIGNED_CHAR, jsid.data, true);\n publicAPI.activate();\n publicAPI.sendParameters();\n model.textureBuildTime.modified();\n } // if we have InputData\n\n\n var input = model.renderable.getInputData(0);\n\n if (input && input.getPointData().getScalars()) {\n var ext = input.getExtent();\n var inScalars = input.getPointData().getScalars(); // do we have a cube map? Six inputs\n\n var data = [];\n\n for (var i = 0; i < model.renderable.getNumberOfInputPorts(); ++i) {\n var indata = model.renderable.getInputData(i);\n var scalars = indata ? indata.getPointData().getScalars().getData() : null;\n\n if (scalars) {\n data.push(scalars);\n }\n }\n\n if (model.renderable.getInterpolate() && inScalars.getNumberOfComponents() === 4) {\n model.generateMipmap = true;\n publicAPI.setMinificationFilter(Filter.LINEAR_MIPMAP_LINEAR);\n }\n\n if (data.length % 6 === 0) {\n publicAPI.createCubeFromRaw(ext[1] - ext[0] + 1, ext[3] - ext[2] + 1, inScalars.getNumberOfComponents(), inScalars.getDataType(), data);\n } else {\n publicAPI.create2DFromRaw(ext[1] - ext[0] + 1, ext[3] - ext[2] + 1, inScalars.getNumberOfComponents(), inScalars.getDataType(), inScalars.getData());\n }\n\n publicAPI.activate();\n publicAPI.sendParameters();\n model.textureBuildTime.modified();\n }\n }\n\n if (model.handle) {\n publicAPI.activate();\n }\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.destroyTexture = function () {\n // deactivate it first\n publicAPI.deactivate();\n\n if (model.context && model.handle) {\n model.context.deleteTexture(model.handle);\n }\n\n model.handle = 0;\n model.numberOfDimensions = 0;\n model.target = 0;\n model.components = 0;\n model.width = 0;\n model.height = 0;\n model.depth = 0;\n publicAPI.resetFormatAndType();\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.createTexture = function () {\n // reuse the existing handle if we have one\n if (!model.handle) {\n model.handle = model.context.createTexture();\n\n if (model.target) {\n model.context.bindTexture(model.target, model.handle); // See: http://www.openmodel.context..org/wiki/Common_Mistakes#Creating_a_complete_texture\n // turn off mip map filter or set the base and max level correctly. here\n // both are done.\n\n model.context.texParameteri(model.target, model.context.TEXTURE_MIN_FILTER, publicAPI.getOpenGLFilterMode(model.minificationFilter));\n model.context.texParameteri(model.target, model.context.TEXTURE_MAG_FILTER, publicAPI.getOpenGLFilterMode(model.magnificationFilter));\n model.context.texParameteri(model.target, model.context.TEXTURE_WRAP_S, publicAPI.getOpenGLWrapMode(model.wrapS));\n model.context.texParameteri(model.target, model.context.TEXTURE_WRAP_T, publicAPI.getOpenGLWrapMode(model.wrapT));\n\n if (model._openGLRenderWindow.getWebgl2()) {\n model.context.texParameteri(model.target, model.context.TEXTURE_WRAP_R, publicAPI.getOpenGLWrapMode(model.wrapR));\n }\n\n model.context.bindTexture(model.target, null);\n }\n }\n }; //---------------------------------------------------------------------------\n\n\n publicAPI.getTextureUnit = function () {\n if (model._openGLRenderWindow) {\n return model._openGLRenderWindow.getTextureUnitForTexture(publicAPI);\n }\n\n return -1;\n }; //---------------------------------------------------------------------------\n\n\n publicAPI.activate = function () {\n // activate a free texture unit for this texture\n model._openGLRenderWindow.activateTexture(publicAPI);\n\n publicAPI.bind();\n }; //---------------------------------------------------------------------------\n\n\n publicAPI.deactivate = function () {\n if (model._openGLRenderWindow) {\n model._openGLRenderWindow.deactivateTexture(publicAPI);\n }\n }; //---------------------------------------------------------------------------\n\n\n publicAPI.releaseGraphicsResources = function (rwin) {\n if (rwin && model.handle) {\n rwin.activateTexture(publicAPI);\n rwin.deactivateTexture(publicAPI);\n model.context.deleteTexture(model.handle);\n model.handle = 0;\n model.numberOfDimensions = 0;\n model.target = 0;\n model.internalFormat = 0;\n model.format = 0;\n model.openGLDataType = 0;\n model.components = 0;\n model.width = 0;\n model.height = 0;\n model.depth = 0;\n }\n\n if (model.shaderProgram) {\n model.shaderProgram.releaseGraphicsResources(rwin);\n model.shaderProgram = null;\n }\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.bind = function () {\n model.context.bindTexture(model.target, model.handle);\n\n if (model.autoParameters && publicAPI.getMTime() > model.sendParametersTime.getMTime()) {\n publicAPI.sendParameters();\n }\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.isBound = function () {\n var result = false;\n\n if (model.context && model.handle) {\n var target = 0;\n\n switch (model.target) {\n case model.context.TEXTURE_2D:\n target = model.context.TEXTURE_BINDING_2D;\n break;\n\n default:\n vtkWarningMacro('impossible case');\n break;\n }\n\n var oid = model.context.getIntegerv(target);\n result = oid === model.handle;\n }\n\n return result;\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.sendParameters = function () {\n model.context.texParameteri(model.target, model.context.TEXTURE_WRAP_S, publicAPI.getOpenGLWrapMode(model.wrapS));\n model.context.texParameteri(model.target, model.context.TEXTURE_WRAP_T, publicAPI.getOpenGLWrapMode(model.wrapT));\n\n if (model._openGLRenderWindow.getWebgl2()) {\n model.context.texParameteri(model.target, model.context.TEXTURE_WRAP_R, publicAPI.getOpenGLWrapMode(model.wrapR));\n }\n\n model.context.texParameteri(model.target, model.context.TEXTURE_MIN_FILTER, publicAPI.getOpenGLFilterMode(model.minificationFilter));\n model.context.texParameteri(model.target, model.context.TEXTURE_MAG_FILTER, publicAPI.getOpenGLFilterMode(model.magnificationFilter));\n\n if (model._openGLRenderWindow.getWebgl2()) {\n model.context.texParameteri(model.target, model.context.TEXTURE_BASE_LEVEL, model.baseLevel);\n model.context.texParameteri(model.target, model.context.TEXTURE_MAX_LEVEL, model.maxLevel);\n } // model.context.texParameterf(model.target, model.context.TEXTURE_MIN_LOD, model.minLOD);\n // model.context.texParameterf(model.target, model.context.TEXTURE_MAX_LOD, model.maxLOD);\n\n\n model.sendParametersTime.modified();\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.getInternalFormat = function (vtktype, numComps) {\n if (!model._forceInternalFormat) {\n model.internalFormat = publicAPI.getDefaultInternalFormat(vtktype, numComps);\n }\n\n if (!model.internalFormat) {\n vtkDebugMacro(\"Unable to find suitable internal format for T=\".concat(vtktype, \" NC= \").concat(numComps));\n }\n\n return model.internalFormat;\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.getDefaultInternalFormat = function (vtktype, numComps) {\n var result = 0; // try default next\n\n result = model._openGLRenderWindow.getDefaultTextureInternalFormat(vtktype, numComps, model.oglNorm16Ext, model.useHalfFloat);\n\n if (result) {\n return result;\n }\n\n if (!result) {\n vtkDebugMacro('Unsupported internal texture type!');\n vtkDebugMacro(\"Unable to find suitable internal format for T=\".concat(vtktype, \" NC= \").concat(numComps));\n }\n\n return result;\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.setInternalFormat = function (iFormat) {\n model._forceInternalFormat = true;\n\n if (iFormat !== model.internalFormat) {\n model.internalFormat = iFormat;\n publicAPI.modified();\n }\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.getFormat = function (vtktype, numComps) {\n model.format = publicAPI.getDefaultFormat(vtktype, numComps);\n return model.format;\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.getDefaultFormat = function (vtktype, numComps) {\n if (model._openGLRenderWindow.getWebgl2()) {\n switch (numComps) {\n case 1:\n return model.context.RED;\n\n case 2:\n return model.context.RG;\n\n case 3:\n return model.context.RGB;\n\n case 4:\n return model.context.RGBA;\n\n default:\n return model.context.RGB;\n }\n } else {\n // webgl1\n switch (numComps) {\n case 1:\n return model.context.LUMINANCE;\n\n case 2:\n return model.context.LUMINANCE_ALPHA;\n\n case 3:\n return model.context.RGB;\n\n case 4:\n return model.context.RGBA;\n\n default:\n return model.context.RGB;\n }\n }\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.resetFormatAndType = function () {\n model.format = 0;\n model.internalFormat = 0;\n model._forceInternalFormat = false;\n model.openGLDataType = 0;\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.getDefaultDataType = function (vtkScalarType) {\n // DON'T DEAL with VTK_CHAR as this is platform dependent.\n if (model._openGLRenderWindow.getWebgl2()) {\n switch (vtkScalarType) {\n // case VtkDataTypes.SIGNED_CHAR:\n // return model.context.BYTE;\n case VtkDataTypes.UNSIGNED_CHAR:\n return model.context.UNSIGNED_BYTE;\n // prefer norm16 since that is accurate compared to\n // half float which is not\n\n case model.oglNorm16Ext && !model.useHalfFloat && VtkDataTypes.SHORT:\n return model.context.SHORT;\n\n case model.oglNorm16Ext && !model.useHalfFloat && VtkDataTypes.UNSIGNED_SHORT:\n return model.context.UNSIGNED_SHORT;\n // use half float type\n\n case model.useHalfFloat && VtkDataTypes.SHORT:\n return model.context.HALF_FLOAT;\n\n case model.useHalfFloat && VtkDataTypes.UNSIGNED_SHORT:\n return model.context.HALF_FLOAT;\n // case VtkDataTypes.INT:\n // return model.context.INT;\n // case VtkDataTypes.UNSIGNED_INT:\n // return model.context.UNSIGNED_INT;\n\n case VtkDataTypes.FLOAT:\n case VtkDataTypes.VOID: // used for depth component textures.\n\n default:\n return model.context.FLOAT;\n }\n }\n\n switch (vtkScalarType) {\n // case VtkDataTypes.SIGNED_CHAR:\n // return model.context.BYTE;\n case VtkDataTypes.UNSIGNED_CHAR:\n return model.context.UNSIGNED_BYTE;\n // case VtkDataTypes.SHORT:\n // return model.context.SHORT;\n // case VtkDataTypes.UNSIGNED_SHORT:\n // return model.context.UNSIGNED_SHORT;\n // case VtkDataTypes.INT:\n // return model.context.INT;\n // case VtkDataTypes.UNSIGNED_INT:\n // return model.context.UNSIGNED_INT;\n\n case VtkDataTypes.FLOAT:\n case VtkDataTypes.VOID: // used for depth component textures.\n\n default:\n if (model.context.getExtension('OES_texture_float') && model.context.getExtension('OES_texture_float_linear')) {\n return model.context.FLOAT;\n }\n\n {\n var halfFloat = model.context.getExtension('OES_texture_half_float');\n\n if (halfFloat && model.context.getExtension('OES_texture_half_float_linear')) {\n return halfFloat.HALF_FLOAT_OES;\n }\n }\n return model.context.UNSIGNED_BYTE;\n }\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.getOpenGLDataType = function (vtkScalarType) {\n var forceUpdate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (!model.openGLDataType || forceUpdate) {\n model.openGLDataType = publicAPI.getDefaultDataType(vtkScalarType);\n }\n\n return model.openGLDataType;\n };\n\n publicAPI.getShiftAndScale = function () {\n var shift = 0.0;\n var scale = 1.0; // for all float type internal formats\n\n switch (model.openGLDataType) {\n case model.context.BYTE:\n scale = 127.5;\n shift = scale - 128.0;\n break;\n\n case model.context.UNSIGNED_BYTE:\n scale = 255.0;\n shift = 0.0;\n break;\n\n case model.context.SHORT:\n scale = 32767.5;\n shift = scale - 32768.0;\n break;\n\n case model.context.UNSIGNED_SHORT:\n scale = 65536.0;\n shift = 0.0;\n break;\n\n case model.context.INT:\n scale = 2147483647.5;\n shift = scale - 2147483648.0;\n break;\n\n case model.context.UNSIGNED_INT:\n scale = 4294967295.0;\n shift = 0.0;\n break;\n\n case model.context.FLOAT:\n }\n\n return {\n shift: shift,\n scale: scale\n };\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.getOpenGLFilterMode = function (emode) {\n switch (emode) {\n case Filter.NEAREST:\n return model.context.NEAREST;\n\n case Filter.LINEAR:\n return model.context.LINEAR;\n\n case Filter.NEAREST_MIPMAP_NEAREST:\n return model.context.NEAREST_MIPMAP_NEAREST;\n\n case Filter.NEAREST_MIPMAP_LINEAR:\n return model.context.NEAREST_MIPMAP_LINEAR;\n\n case Filter.LINEAR_MIPMAP_NEAREST:\n return model.context.LINEAR_MIPMAP_NEAREST;\n\n case Filter.LINEAR_MIPMAP_LINEAR:\n return model.context.LINEAR_MIPMAP_LINEAR;\n\n default:\n return model.context.NEAREST;\n }\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.getOpenGLWrapMode = function (vtktype) {\n switch (vtktype) {\n case Wrap.CLAMP_TO_EDGE:\n return model.context.CLAMP_TO_EDGE;\n\n case Wrap.REPEAT:\n return model.context.REPEAT;\n\n case Wrap.MIRRORED_REPEAT:\n return model.context.MIRRORED_REPEAT;\n\n default:\n return model.context.CLAMP_TO_EDGE;\n }\n }; //----------------------------------------------------------------------------\n\n\n function updateArrayDataType(dataType, data) {\n var depth = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var pixData = [];\n var pixCount = model.width * model.height * model.components;\n\n if (depth) {\n pixCount *= model.depth;\n } // if the opengl data type is float\n // then the data array must be float\n\n\n if (dataType !== VtkDataTypes.FLOAT && model.openGLDataType === model.context.FLOAT) {\n for (var idx = 0; idx < data.length; idx++) {\n if (data[idx]) {\n var dataArrayToCopy = data[idx].length > pixCount ? data[idx].subarray(0, pixCount) : data[idx];\n pixData.push(new Float32Array(dataArrayToCopy));\n } else {\n pixData.push(null);\n }\n }\n } // if the opengl data type is ubyte\n // then the data array must be u8, we currently simply truncate the data\n\n\n if (dataType !== VtkDataTypes.UNSIGNED_CHAR && model.openGLDataType === model.context.UNSIGNED_BYTE) {\n for (var _idx = 0; _idx < data.length; _idx++) {\n if (data[_idx]) {\n var _dataArrayToCopy = data[_idx].length > pixCount ? data[_idx].subarray(0, pixCount) : data[_idx];\n\n pixData.push(new Uint8Array(_dataArrayToCopy));\n } else {\n pixData.push(null);\n }\n }\n } // if the opengl data type is half float\n // then the data array must be u16\n\n\n var halfFloat = false;\n\n if (model._openGLRenderWindow.getWebgl2()) {\n halfFloat = model.openGLDataType === model.context.HALF_FLOAT;\n } else {\n var halfFloatExt = model.context.getExtension('OES_texture_half_float');\n halfFloat = halfFloatExt && model.openGLDataType === halfFloatExt.HALF_FLOAT_OES;\n }\n\n if (halfFloat) {\n for (var _idx2 = 0; _idx2 < data.length; _idx2++) {\n if (data[_idx2]) {\n var newArray = new Uint16Array(pixCount);\n var src = data[_idx2];\n\n for (var i = 0; i < pixCount; i++) {\n newArray[i] = toHalf(src[i]);\n }\n\n pixData.push(newArray);\n } else {\n pixData.push(null);\n }\n }\n } // The output has to be filled\n\n\n if (pixData.length === 0) {\n for (var _i = 0; _i < data.length; _i++) {\n pixData.push(data[_i]);\n }\n }\n\n return pixData;\n } //----------------------------------------------------------------------------\n\n\n function scaleTextureToHighestPowerOfTwo(data) {\n if (model._openGLRenderWindow.getWebgl2()) {\n // No need if webGL2\n return data;\n }\n\n var pixData = [];\n var width = model.width;\n var height = model.height;\n var numComps = model.components;\n\n if (data && (!isPowerOfTwo(width) || !isPowerOfTwo(height))) {\n // Scale up the texture to the next highest power of two dimensions.\n var halfFloat = model.context.getExtension('OES_texture_half_float');\n var newWidth = nearestPowerOfTwo(width);\n var newHeight = nearestPowerOfTwo(height);\n var pixCount = newWidth * newHeight * model.components;\n\n for (var idx = 0; idx < data.length; idx++) {\n if (data[idx] !== null) {\n var newArray = null;\n var jFactor = height / newHeight;\n var iFactor = width / newWidth;\n var usingHalf = false;\n\n if (model.openGLDataType === model.context.FLOAT) {\n newArray = new Float32Array(pixCount);\n } else if (halfFloat && model.openGLDataType === halfFloat.HALF_FLOAT_OES) {\n newArray = new Uint16Array(pixCount);\n usingHalf = true;\n } else {\n newArray = new Uint8Array(pixCount);\n }\n\n for (var j = 0; j < newHeight; j++) {\n var joff = j * newWidth * numComps;\n var jidx = j * jFactor;\n var jlow = Math.floor(jidx);\n var jhi = Math.ceil(jidx);\n\n if (jhi >= height) {\n jhi = height - 1;\n }\n\n var jmix = jidx - jlow;\n var jmix1 = 1.0 - jmix;\n jlow = jlow * width * numComps;\n jhi = jhi * width * numComps;\n\n for (var i = 0; i < newWidth; i++) {\n var ioff = i * numComps;\n var iidx = i * iFactor;\n var ilow = Math.floor(iidx);\n var ihi = Math.ceil(iidx);\n\n if (ihi >= width) {\n ihi = width - 1;\n }\n\n var imix = iidx - ilow;\n ilow *= numComps;\n ihi *= numComps;\n\n for (var c = 0; c < numComps; c++) {\n if (usingHalf) {\n newArray[joff + ioff + c] = HalfFloat.toHalf(HalfFloat.fromHalf(data[idx][jlow + ilow + c]) * jmix1 * (1.0 - imix) + HalfFloat.fromHalf(data[idx][jlow + ihi + c]) * jmix1 * imix + HalfFloat.fromHalf(data[idx][jhi + ilow + c]) * jmix * (1.0 - imix) + HalfFloat.fromHalf(data[idx][jhi + ihi + c]) * jmix * imix);\n } else {\n newArray[joff + ioff + c] = data[idx][jlow + ilow + c] * jmix1 * (1.0 - imix) + data[idx][jlow + ihi + c] * jmix1 * imix + data[idx][jhi + ilow + c] * jmix * (1.0 - imix) + data[idx][jhi + ihi + c] * jmix * imix;\n }\n }\n }\n }\n\n pixData.push(newArray);\n model.width = newWidth;\n model.height = newHeight;\n } else {\n pixData.push(null);\n }\n }\n } // The output has to be filled\n\n\n if (pixData.length === 0) {\n for (var _i2 = 0; _i2 < data.length; _i2++) {\n pixData.push(data[_i2]);\n }\n }\n\n return pixData;\n } //----------------------------------------------------------------------------\n\n\n function useTexStorage(dataType) {\n if (model._openGLRenderWindow) {\n var _model$renderable;\n\n if (model.resizable || (_model$renderable = model.renderable) !== null && _model$renderable !== void 0 && _model$renderable.getResizable()) {\n // Cannot use texStorage if the texture is supposed to be resizable.\n return false;\n }\n\n if (model._openGLRenderWindow.getWebgl2()) {\n var webGLInfo = model._openGLRenderWindow.getGLInformations();\n\n if (webGLInfo.RENDERER.value.match(/WebKit/gi) && navigator.platform.match(/Mac/gi) && model.oglNorm16Ext && (dataType === VtkDataTypes.UNSIGNED_SHORT || dataType === VtkDataTypes.SHORT)) {\n // Cannot use texStorage with EXT_texture_norm16 textures on Mac M1 GPU.\n // No errors reported but the texture is unusable.\n return false;\n } // Use texStorage for WebGL2\n\n\n return true;\n }\n\n return false;\n }\n\n return false;\n } //----------------------------------------------------------------------------\n\n\n publicAPI.create2DFromRaw = function (width, height, numComps, dataType, data) {\n var flip = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false;\n // Now determine the texture parameters using the arguments.\n publicAPI.getOpenGLDataType(dataType, true);\n publicAPI.getInternalFormat(dataType, numComps);\n publicAPI.getFormat(dataType, numComps);\n\n if (!model.internalFormat || !model.format || !model.openGLDataType) {\n vtkErrorMacro('Failed to determine texture parameters.');\n return false;\n }\n\n model.target = model.context.TEXTURE_2D;\n model.components = numComps;\n model.width = width;\n model.height = height;\n model.depth = 1;\n model.numberOfDimensions = 2;\n\n model._openGLRenderWindow.activateTexture(publicAPI);\n\n publicAPI.createTexture();\n publicAPI.bind(); // Create an array of texture with one texture\n\n var dataArray = [data];\n var pixData = updateArrayDataType(dataType, dataArray);\n var scaledData = scaleTextureToHighestPowerOfTwo(pixData); // Source texture data from the PBO.\n\n model.context.pixelStorei(model.context.UNPACK_FLIP_Y_WEBGL, flip);\n model.context.pixelStorei(model.context.UNPACK_ALIGNMENT, 1);\n\n if (useTexStorage(dataType)) {\n model.context.texStorage2D(model.target, 1, model.internalFormat, model.width, model.height);\n\n if (scaledData[0] != null) {\n model.context.texSubImage2D(model.target, 0, 0, 0, model.width, model.height, model.format, model.openGLDataType, scaledData[0]);\n }\n } else {\n model.context.texImage2D(model.target, 0, model.internalFormat, model.width, model.height, 0, model.format, model.openGLDataType, scaledData[0]);\n }\n\n if (model.generateMipmap) {\n model.context.generateMipmap(model.target);\n } // always reset the flip\n\n\n if (flip) {\n model.context.pixelStorei(model.context.UNPACK_FLIP_Y_WEBGL, false);\n }\n\n publicAPI.deactivate();\n return true;\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.createCubeFromRaw = function (width, height, numComps, dataType, data) {\n // Now determine the texture parameters using the arguments.\n publicAPI.getOpenGLDataType(dataType);\n publicAPI.getInternalFormat(dataType, numComps);\n publicAPI.getFormat(dataType, numComps);\n\n if (!model.internalFormat || !model.format || !model.openGLDataType) {\n vtkErrorMacro('Failed to determine texture parameters.');\n return false;\n }\n\n model.target = model.context.TEXTURE_CUBE_MAP;\n model.components = numComps;\n model.width = width;\n model.height = height;\n model.depth = 1;\n model.numberOfDimensions = 2;\n\n model._openGLRenderWindow.activateTexture(publicAPI);\n\n model.maxLevel = data.length / 6 - 1;\n publicAPI.createTexture();\n publicAPI.bind();\n var pixData = updateArrayDataType(dataType, data);\n var scaledData = scaleTextureToHighestPowerOfTwo(pixData); // invert the data because opengl is messed up with cube maps\n // and uses the old renderman standard with Y going down\n // even though it is completely at odds with OpenGL standards\n\n var invertedData = [];\n var widthLevel = model.width;\n var heightLevel = model.height;\n\n for (var i = 0; i < scaledData.length; i++) {\n if (i % 6 === 0 && i !== 0) {\n widthLevel /= 2;\n heightLevel /= 2;\n }\n\n invertedData[i] = newTypedArray(dataType, heightLevel * widthLevel * model.components);\n\n for (var y = 0; y < heightLevel; ++y) {\n var row1 = y * widthLevel * model.components;\n var row2 = (heightLevel - y - 1) * widthLevel * model.components;\n invertedData[i].set(scaledData[i].slice(row2, row2 + widthLevel * model.components), row1);\n }\n } // Source texture data from the PBO.\n\n\n model.context.pixelStorei(model.context.UNPACK_ALIGNMENT, 1);\n\n if (useTexStorage(dataType)) {\n model.context.texStorage2D(model.target, 6, model.internalFormat, model.width, model.height);\n } // We get the 6 images\n\n\n for (var _i3 = 0; _i3 < 6; _i3++) {\n // For each mipmap level\n var j = 0;\n var w = model.width;\n var h = model.height;\n\n while (w >= 1 && h >= 1) {\n // In webgl 1, all levels need to be defined. So if the latest level size is\n // 8x8, we have to add 3 more null textures (4x4, 2x2, 1x1)\n // In webgl 2, the attribute maxLevel will be use.\n var tempData = null;\n\n if (j <= model.maxLevel) {\n tempData = invertedData[6 * j + _i3];\n }\n\n if (useTexStorage(dataType)) {\n if (tempData != null) {\n model.context.texSubImage2D(model.context.TEXTURE_CUBE_MAP_POSITIVE_X + _i3, j, 0, 0, w, h, model.format, model.openGLDataType, tempData);\n }\n } else {\n model.context.texImage2D(model.context.TEXTURE_CUBE_MAP_POSITIVE_X + _i3, j, model.internalFormat, w, h, 0, model.format, model.openGLDataType, tempData);\n }\n\n j++;\n w /= 2;\n h /= 2;\n }\n } // generateMipmap must not be called here because we manually upload all levels\n // if it is called, all levels will be overwritten\n\n\n publicAPI.deactivate();\n return true;\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.createDepthFromRaw = function (width, height, dataType, data) {\n // Now determine the texture parameters using the arguments.\n publicAPI.getOpenGLDataType(dataType);\n model.format = model.context.DEPTH_COMPONENT;\n\n if (model._openGLRenderWindow.getWebgl2()) {\n if (dataType === VtkDataTypes.FLOAT) {\n model.internalFormat = model.context.DEPTH_COMPONENT32F;\n } else {\n model.internalFormat = model.context.DEPTH_COMPONENT16;\n }\n } else {\n model.internalFormat = model.context.DEPTH_COMPONENT;\n }\n\n if (!model.internalFormat || !model.format || !model.openGLDataType) {\n vtkErrorMacro('Failed to determine texture parameters.');\n return false;\n }\n\n model.target = model.context.TEXTURE_2D;\n model.components = 1;\n model.width = width;\n model.height = height;\n model.depth = 1;\n model.numberOfDimensions = 2;\n\n model._openGLRenderWindow.activateTexture(publicAPI);\n\n publicAPI.createTexture();\n publicAPI.bind(); // Source texture data from the PBO.\n // model.context.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true);\n\n model.context.pixelStorei(model.context.UNPACK_ALIGNMENT, 1);\n\n if (useTexStorage(dataType)) {\n model.context.texStorage2D(model.target, 1, model.internalFormat, model.width, model.height);\n\n if (data != null) {\n model.context.texSubImage2D(model.target, 0, 0, 0, model.width, model.height, model.format, model.openGLDataType, data);\n }\n } else {\n model.context.texImage2D(model.target, 0, model.internalFormat, model.width, model.height, 0, model.format, model.openGLDataType, data);\n }\n\n if (model.generateMipmap) {\n model.context.generateMipmap(model.target);\n }\n\n publicAPI.deactivate();\n return true;\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.create2DFromImage = function (image) {\n // Now determine the texture parameters using the arguments.\n publicAPI.getOpenGLDataType(VtkDataTypes.UNSIGNED_CHAR);\n publicAPI.getInternalFormat(VtkDataTypes.UNSIGNED_CHAR, 4);\n publicAPI.getFormat(VtkDataTypes.UNSIGNED_CHAR, 4);\n\n if (!model.internalFormat || !model.format || !model.openGLDataType) {\n vtkErrorMacro('Failed to determine texture parameters.');\n return false;\n }\n\n model.target = model.context.TEXTURE_2D;\n model.components = 4;\n model.depth = 1;\n model.numberOfDimensions = 2;\n\n model._openGLRenderWindow.activateTexture(publicAPI);\n\n publicAPI.createTexture();\n publicAPI.bind(); // Source texture data from the PBO.\n // model.context.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true);\n\n model.context.pixelStorei(model.context.UNPACK_ALIGNMENT, 1); // Scale up the texture to the next highest power of two dimensions (if needed) and flip y.\n\n var needNearestPowerOfTwo = !model._openGLRenderWindow.getWebgl2() && (!isPowerOfTwo(image.width) || !isPowerOfTwo(image.height));\n var canvas = document.createElement('canvas');\n canvas.width = needNearestPowerOfTwo ? nearestPowerOfTwo(image.width) : image.width;\n canvas.height = needNearestPowerOfTwo ? nearestPowerOfTwo(image.height) : image.height;\n model.width = canvas.width;\n model.height = canvas.height;\n var ctx = canvas.getContext('2d');\n ctx.translate(0, canvas.height);\n ctx.scale(1, -1);\n ctx.drawImage(image, 0, 0, image.width, image.height, 0, 0, canvas.width, canvas.height);\n var safeImage = canvas;\n\n if (useTexStorage(VtkDataTypes.UNSIGNED_CHAR)) {\n model.context.texStorage2D(model.target, 1, model.internalFormat, model.width, model.height);\n\n if (safeImage != null) {\n model.context.texSubImage2D(model.target, 0, 0, 0, model.width, model.height, model.format, model.openGLDataType, safeImage);\n }\n } else {\n model.context.texImage2D(model.target, 0, model.internalFormat, model.width, model.height, 0, model.format, model.openGLDataType, safeImage);\n }\n\n if (model.generateMipmap) {\n model.context.generateMipmap(model.target);\n }\n\n publicAPI.deactivate();\n return true;\n }; // Compute scale and offset per component from min and max per component\n\n\n function computeScaleOffsets(min, max, numComps) {\n var offset = new Array(numComps);\n var scale = new Array(numComps);\n\n for (var c = 0; c < numComps; ++c) {\n offset[c] = min[c];\n scale[c] = max[c] - min[c] || 1.0;\n }\n\n return {\n scale: scale,\n offset: offset\n };\n } // HalfFloat only represents numbers between [-2048, 2048] exactly accurate,\n // for numbers outside of this range there is a precision limitation\n\n\n function hasExactHalfFloat(offset, scale) {\n // Per Component\n for (var c = 0; c < offset.length; c++) {\n var min = offset[c];\n var max = scale[c] + min;\n\n if (min < -2048 || min > 2048 || max < -2048 || max > 2048) {\n return false;\n }\n }\n\n return true;\n }\n\n function setUseHalfFloat(dataType, offset, scale, preferSizeOverAccuracy) {\n publicAPI.getOpenGLDataType(dataType);\n var useHalfFloat = false;\n\n if (model._openGLRenderWindow.getWebgl2()) {\n useHalfFloat = model.openGLDataType === model.context.HALF_FLOAT;\n } else {\n var halfFloatExt = model.context.getExtension('OES_texture_half_float');\n useHalfFloat = halfFloatExt && model.openGLDataType === halfFloatExt.HALF_FLOAT_OES;\n } // Don't consider halfFloat and convert back to Float when the range of data does not generate an accurate halfFloat\n // AND it is not preferable to have a smaller texture than an exact texture.\n\n\n var isHalfFloat = useHalfFloat && (hasExactHalfFloat(offset, scale) || preferSizeOverAccuracy);\n model.useHalfFloat = isHalfFloat;\n }\n\n function processDataArray(dataArray, preferSizeOverAccuracy) {\n var numComps = dataArray.getNumberOfComponents();\n var dataType = dataArray.getDataType();\n var data = dataArray.getData(); // Compute min max from array\n // Using the vtkDataArray.getRange() enables caching\n\n var minArray = new Array(numComps);\n var maxArray = new Array(numComps);\n\n for (var c = 0; c < numComps; ++c) {\n var _dataArray$getRange = dataArray.getRange(c),\n _dataArray$getRange2 = _slicedToArray(_dataArray$getRange, 2),\n min = _dataArray$getRange2[0],\n max = _dataArray$getRange2[1];\n\n minArray[c] = min;\n maxArray[c] = max;\n }\n\n var scaleOffsets = computeScaleOffsets(minArray, maxArray, numComps); // preferSizeOverAccuracy will override norm16 due to bug with norm16 implementation\n // https://bugs.chromium.org/p/chromium/issues/detail?id=1408247\n\n setUseHalfFloat(dataType, scaleOffsets.offset, scaleOffsets.scale, preferSizeOverAccuracy); // since our default is to use half float, in case that we can't use it\n // we need to use another type\n\n if (!model.useHalfFloat) {\n publicAPI.getOpenGLDataType(dataType, true);\n }\n\n return {\n numComps: numComps,\n dataType: dataType,\n data: data,\n scaleOffsets: scaleOffsets\n };\n }\n\n publicAPI.create2DFilterableFromRaw = function (width, height, numberOfComponents, dataType, values) {\n var preferSizeOverAccuracy = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false;\n return publicAPI.create2DFilterableFromDataArray(width, height, vtkDataArray.newInstance({\n numberOfComponents: numberOfComponents,\n dataType: dataType,\n values: values\n }), preferSizeOverAccuracy);\n };\n\n publicAPI.create2DFilterableFromDataArray = function (width, height, dataArray) {\n var preferSizeOverAccuracy = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n\n var _processDataArray = processDataArray(dataArray, preferSizeOverAccuracy),\n numComps = _processDataArray.numComps,\n dataType = _processDataArray.dataType,\n data = _processDataArray.data;\n\n publicAPI.create2DFromRaw(width, height, numComps, dataType, data);\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.create3DFromRaw = function (width, height, depth, numComps, dataType, data) {\n // Permit OpenGLDataType to be half float, if applicable, for 3D\n publicAPI.getOpenGLDataType(dataType); // Now determine the texture parameters using the arguments.\n\n publicAPI.getInternalFormat(dataType, numComps);\n publicAPI.getFormat(dataType, numComps);\n\n if (!model.internalFormat || !model.format || !model.openGLDataType) {\n vtkErrorMacro('Failed to determine texture parameters.');\n return false;\n }\n\n model.target = model.context.TEXTURE_3D;\n model.components = numComps;\n model.width = width;\n model.height = height;\n model.depth = depth;\n model.numberOfDimensions = 3;\n\n model._openGLRenderWindow.activateTexture(publicAPI);\n\n publicAPI.createTexture();\n publicAPI.bind(); // Create an array of texture with one texture\n\n var dataArray = [data];\n var is3DArray = true;\n var pixData = updateArrayDataType(dataType, dataArray, is3DArray);\n var scaledData = scaleTextureToHighestPowerOfTwo(pixData); // Source texture data from the PBO.\n // model.context.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true);\n\n model.context.pixelStorei(model.context.UNPACK_ALIGNMENT, 1); // openGLDataType\n\n if (useTexStorage(dataType)) {\n model.context.texStorage3D(model.target, 1, model.internalFormat, model.width, model.height, model.depth);\n\n if (scaledData[0] != null) {\n model.context.texSubImage3D(model.target, 0, 0, 0, 0, model.width, model.height, model.depth, model.format, model.openGLDataType, scaledData[0]);\n }\n } else {\n model.context.texImage3D(model.target, 0, model.internalFormat, model.width, model.height, model.depth, 0, model.format, model.openGLDataType, scaledData[0]);\n }\n\n if (model.generateMipmap) {\n model.context.generateMipmap(model.target);\n }\n\n publicAPI.deactivate();\n return true;\n }; //----------------------------------------------------------------------------\n // This method simulates a 3D texture using 2D\n // Prefer create3DFilterableFromDataArray to enable caching of min and max values\n\n\n publicAPI.create3DFilterableFromRaw = function (width, height, depth, numberOfComponents, dataType, values) {\n var preferSizeOverAccuracy = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : false;\n return publicAPI.create3DFilterableFromDataArray(width, height, depth, vtkDataArray.newInstance({\n numberOfComponents: numberOfComponents,\n dataType: dataType,\n values: values\n }), preferSizeOverAccuracy);\n }; //----------------------------------------------------------------------------\n // This method create a 3D texture from dimensions and a DataArray\n\n\n publicAPI.create3DFilterableFromDataArray = function (width, height, depth, dataArray) {\n var preferSizeOverAccuracy = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n\n var _processDataArray2 = processDataArray(dataArray, preferSizeOverAccuracy),\n numComps = _processDataArray2.numComps,\n dataType = _processDataArray2.dataType,\n data = _processDataArray2.data,\n scaleOffsets = _processDataArray2.scaleOffsets;\n\n var numPixelsIn = width * height * depth;\n var offset = [];\n var scale = [];\n\n for (var c = 0; c < numComps; ++c) {\n offset[c] = 0.0;\n scale[c] = 1.0;\n } // store the information, we will need it later\n // offset and scale are the offset and scale required to get\n // the texture value back to data values ala\n // data = texture * scale + offset\n // and texture = (data - offset)/scale\n\n\n model.volumeInfo = {\n scale: scale,\n offset: offset,\n dataComputedScale: scaleOffsets.scale,\n dataComputedOffset: scaleOffsets.offset,\n width: width,\n height: height,\n depth: depth\n }; // Create a copy of scale and offset to avoid aliasing issues\n // Original is read only, copy is read/write\n // Use the copy as volumeInfo.scale and volumeInfo.offset\n\n var scaleOffsetsCopy = structuredClone(scaleOffsets); // WebGL2 path, we have 3d textures etc\n\n if (model._openGLRenderWindow.getWebgl2()) {\n if (model.oglNorm16Ext && !model.useHalfFloat && dataType === VtkDataTypes.SHORT) {\n for (var _c = 0; _c < numComps; ++_c) {\n model.volumeInfo.scale[_c] = 32767.0;\n }\n\n return publicAPI.create3DFromRaw(width, height, depth, numComps, dataType, data);\n }\n\n if (model.oglNorm16Ext && !model.useHalfFloat && dataType === VtkDataTypes.UNSIGNED_SHORT) {\n for (var _c2 = 0; _c2 < numComps; ++_c2) {\n model.volumeInfo.scale[_c2] = 65535.0;\n }\n\n return publicAPI.create3DFromRaw(width, height, depth, numComps, dataType, data);\n }\n\n if (dataType === VtkDataTypes.FLOAT || model.useHalfFloat && (dataType === VtkDataTypes.SHORT || dataType === VtkDataTypes.UNSIGNED_SHORT)) {\n return publicAPI.create3DFromRaw(width, height, depth, numComps, dataType, data);\n }\n\n if (dataType === VtkDataTypes.UNSIGNED_CHAR) {\n for (var _c3 = 0; _c3 < numComps; ++_c3) {\n model.volumeInfo.scale[_c3] = 255.0;\n }\n\n return publicAPI.create3DFromRaw(width, height, depth, numComps, dataType, data);\n } // otherwise convert to float\n\n\n var _newArray = new Float32Array(numPixelsIn * numComps); // use computed scale and offset\n\n\n model.volumeInfo.offset = scaleOffsetsCopy.offset;\n model.volumeInfo.scale = scaleOffsetsCopy.scale;\n var count = 0;\n var scaleInverse = scaleOffsetsCopy.scale.map(function (s) {\n return 1 / s;\n });\n\n for (var i = 0; i < numPixelsIn; i++) {\n for (var nc = 0; nc < numComps; nc++) {\n _newArray[count] = (data[count] - scaleOffsetsCopy.offset[nc]) * scaleInverse[nc];\n count++;\n }\n }\n\n return publicAPI.create3DFromRaw(width, height, depth, numComps, VtkDataTypes.FLOAT, _newArray);\n } // not webgl2, deal with webgl1, no 3d textures\n // and maybe no float textures\n\n\n var volCopyData = function volCopyData(outArray, outIdx, inValue, smin, smax) {\n outArray[outIdx] = inValue;\n };\n\n var dataTypeToUse = VtkDataTypes.UNSIGNED_CHAR; // unsigned char gets used as is\n\n if (dataType === VtkDataTypes.UNSIGNED_CHAR) {\n for (var _c4 = 0; _c4 < numComps; ++_c4) {\n scaleOffsetsCopy.offset[_c4] = 0.0;\n scaleOffsetsCopy.scale[_c4] = 255.0;\n }\n } else if (model.context.getExtension('OES_texture_float') && model.context.getExtension('OES_texture_float_linear')) {\n // use float textures scaled to 0.0 to 1.0\n dataTypeToUse = VtkDataTypes.FLOAT;\n\n volCopyData = function volCopyData(outArray, outIdx, inValue, soffset, sscale) {\n outArray[outIdx] = (inValue - soffset) / sscale;\n };\n } else {\n // worst case, scale data to uchar\n dataTypeToUse = VtkDataTypes.UNSIGNED_CHAR;\n\n volCopyData = function volCopyData(outArray, outIdx, inValue, soffset, sscale) {\n outArray[outIdx] = 255.0 * (inValue - soffset) / sscale;\n };\n } // Now determine the texture parameters using the arguments.\n\n\n publicAPI.getOpenGLDataType(dataTypeToUse);\n publicAPI.getInternalFormat(dataTypeToUse, numComps);\n publicAPI.getFormat(dataTypeToUse, numComps);\n\n if (!model.internalFormat || !model.format || !model.openGLDataType) {\n vtkErrorMacro('Failed to determine texture parameters.');\n return false;\n } // have to pack this 3D texture into pot 2D texture\n\n\n model.target = model.context.TEXTURE_2D;\n model.components = numComps;\n model.depth = 1;\n model.numberOfDimensions = 2; // MAX_TEXTURE_SIZE gives the max dimensions that can be supported by the GPU,\n // but it doesn't mean it will fit in memory. If we have to use a float data type\n // or 4 components, there are good chances that the texture size will blow up\n // and could not fit in the GPU memory. Use a smaller texture size in that case,\n // which will force a downsampling of the dataset.\n // That problem does not occur when using webGL2 since we can pack the data in\n // denser textures based on our data type.\n // TODO: try to fit in the biggest supported texture, catch the gl error if it\n // does not fix (OUT_OF_MEMORY), then attempt with smaller texture\n\n var maxTexDim = model.context.getParameter(model.context.MAX_TEXTURE_SIZE);\n\n if (maxTexDim > 4096 && (dataTypeToUse === VtkDataTypes.FLOAT || numComps >= 3)) {\n maxTexDim = 4096;\n } // compute estimate for XY subsample\n\n\n var xstride = 1;\n var ystride = 1;\n\n if (numPixelsIn > maxTexDim * maxTexDim) {\n xstride = Math.ceil(Math.sqrt(numPixelsIn / (maxTexDim * maxTexDim)));\n ystride = xstride;\n }\n\n var targetWidth = Math.sqrt(numPixelsIn) / xstride;\n targetWidth = nearestPowerOfTwo(targetWidth); // determine X reps\n\n var xreps = Math.floor(targetWidth * xstride / width);\n var yreps = Math.ceil(depth / xreps);\n var targetHeight = nearestPowerOfTwo(height * yreps / ystride);\n model.width = targetWidth;\n model.height = targetHeight;\n\n model._openGLRenderWindow.activateTexture(publicAPI);\n\n publicAPI.createTexture();\n publicAPI.bind(); // store the information, we will need it later\n\n model.volumeInfo.xreps = xreps;\n model.volumeInfo.yreps = yreps;\n model.volumeInfo.xstride = xstride;\n model.volumeInfo.ystride = ystride;\n model.volumeInfo.offset = scaleOffsetsCopy.offset;\n model.volumeInfo.scale = scaleOffsetsCopy.scale; // OK stuff the data into the 2d TEXTURE\n // first allocate the new texture\n\n var newArray;\n var pixCount = targetWidth * targetHeight * numComps;\n\n if (dataTypeToUse === VtkDataTypes.FLOAT) {\n newArray = new Float32Array(pixCount);\n } else {\n newArray = new Uint8Array(pixCount);\n } // then stuff the data into it, nothing fancy right now\n // for stride\n\n\n var outIdx = 0;\n var tileWidth = Math.floor(width / xstride);\n var tileHeight = Math.floor(height / ystride);\n\n for (var yRep = 0; yRep < yreps; yRep++) {\n var xrepsThisRow = Math.min(xreps, depth - yRep * xreps);\n var outXContIncr = numComps * (model.width - xrepsThisRow * Math.floor(width / xstride));\n\n for (var tileY = 0; tileY < tileHeight; tileY++) {\n for (var xRep = 0; xRep < xrepsThisRow; xRep++) {\n var inOffset = numComps * ((yRep * xreps + xRep) * width * height + ystride * tileY * width);\n\n for (var tileX = 0; tileX < tileWidth; tileX++) {\n // copy value\n for (var _nc = 0; _nc < numComps; _nc++) {\n volCopyData(newArray, outIdx, data[inOffset + xstride * tileX * numComps + _nc], scaleOffsetsCopy.offset[_nc], scaleOffsetsCopy.scale[_nc]);\n outIdx++;\n }\n }\n }\n\n outIdx += outXContIncr;\n }\n } // Source texture data from the PBO.\n // model.context.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true);\n\n\n model.context.pixelStorei(model.context.UNPACK_ALIGNMENT, 1);\n\n if (useTexStorage(dataTypeToUse)) {\n model.context.texStorage2D(model.target, 1, model.internalFormat, model.width, model.height);\n\n if (newArray != null) {\n model.context.texSubImage2D(model.target, 0, 0, 0, model.width, model.height, model.format, model.openGLDataType, newArray);\n }\n } else {\n model.context.texImage2D(model.target, 0, model.internalFormat, model.width, model.height, 0, model.format, model.openGLDataType, newArray);\n }\n\n publicAPI.deactivate();\n return true;\n };\n\n publicAPI.setOpenGLRenderWindow = function (rw) {\n if (model._openGLRenderWindow === rw) {\n return;\n }\n\n publicAPI.releaseGraphicsResources();\n model._openGLRenderWindow = rw;\n model.context = null;\n\n if (rw) {\n model.context = model._openGLRenderWindow.getContext();\n }\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.getMaximumTextureSize = function (ctx) {\n if (ctx && ctx.isCurrent()) {\n return ctx.getIntegerv(ctx.MAX_TEXTURE_SIZE);\n }\n\n return -1;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n _openGLRenderWindow: null,\n _forceInternalFormat: false,\n context: null,\n handle: 0,\n sendParametersTime: null,\n textureBuildTime: null,\n numberOfDimensions: 0,\n target: 0,\n format: 0,\n openGLDataType: 0,\n components: 0,\n width: 0,\n height: 0,\n depth: 0,\n autoParameters: true,\n wrapS: Wrap.CLAMP_TO_EDGE,\n wrapT: Wrap.CLAMP_TO_EDGE,\n wrapR: Wrap.CLAMP_TO_EDGE,\n minificationFilter: Filter.NEAREST,\n magnificationFilter: Filter.NEAREST,\n minLOD: -1000.0,\n maxLOD: 1000.0,\n baseLevel: 0,\n maxLevel: 1000,\n generateMipmap: false,\n // use half float by default, but it will get set\n // to false if the context does not support it or\n // the voxel intensity range is out of the accurate\n // range of half float\n useHalfFloat: true,\n oglNorm16Ext: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkViewNode.extend(publicAPI, model, initialValues);\n model.sendParametersTime = {};\n obj(model.sendParametersTime, {\n mtime: 0\n });\n model.textureBuildTime = {};\n obj(model.textureBuildTime, {\n mtime: 0\n }); // Build VTK API\n\n set(publicAPI, model, ['format', 'openGLDataType']);\n setGet(publicAPI, model, ['keyMatrixTime', 'minificationFilter', 'magnificationFilter', 'wrapS', 'wrapT', 'wrapR', 'generateMipmap', 'oglNorm16Ext']);\n get(publicAPI, model, ['width', 'height', 'volumeInfo', 'components', 'handle', 'target']);\n moveToProtected(publicAPI, model, ['openGLRenderWindow']); // Object methods\n\n vtkOpenGLTexture(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend, 'vtkOpenGLTexture'); // ----------------------------------------------------------------------------\n\nvar vtkOpenGLTexture$1 = _objectSpread({\n newInstance: newInstance,\n extend: extend\n}, Constants); // Register ourself to OpenGL backend if imported\n\nregisterOverride('vtkTexture', newInstance);\n\nexport { vtkOpenGLTexture$1 as default, extend, newInstance };\n","import vtkShaderProgram from './ShaderProgram.js';\n\nfunction implementReplaceShaderCoincidentOffset(publicAPI, model) {\n\n publicAPI.replaceShaderCoincidentOffset = function (shaders, ren, actor) {\n var cp = publicAPI.getCoincidentParameters(ren, actor); // if we need an offset handle it here\n // The value of .000016 is suitable for depth buffers\n // of at least 16 bit depth. We do not query the depth\n // right now because we would need some mechanism to\n // cache the result taking into account FBO changes etc.\n\n if (cp && (cp.factor !== 0.0 || cp.offset !== 0.0)) {\n var FSSource = shaders.Fragment;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Coincident::Dec', ['uniform float cfactor;', 'uniform float coffset;']).result;\n\n if (model.context.getExtension('EXT_frag_depth')) {\n if (cp.factor !== 0.0) {\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::UniformFlow::Impl', ['float cscale = length(vec2(dFdx(gl_FragCoord.z),dFdy(gl_FragCoord.z)));', '//VTK::UniformFlow::Impl'], false).result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Depth::Impl', 'gl_FragDepthEXT = gl_FragCoord.z + cfactor*cscale + 0.000016*coffset;').result;\n } else {\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Depth::Impl', 'gl_FragDepthEXT = gl_FragCoord.z + 0.000016*coffset;').result;\n }\n }\n\n if (model._openGLRenderWindow.getWebgl2()) {\n if (cp.factor !== 0.0) {\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::UniformFlow::Impl', ['float cscale = length(vec2(dFdx(gl_FragCoord.z),dFdy(gl_FragCoord.z)));', '//VTK::UniformFlow::Impl'], false).result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Depth::Impl', 'gl_FragDepth = gl_FragCoord.z + cfactor*cscale + 0.000016*coffset;').result;\n } else {\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Depth::Impl', 'gl_FragDepth = gl_FragCoord.z + 0.000016*coffset;').result;\n }\n }\n\n shaders.Fragment = FSSource;\n }\n };\n}\n\nfunction implementBuildShadersWithReplacements(publicAPI, model) {\n\n publicAPI.applyShaderReplacements = function (shaders, viewSpec, pre) {\n var shaderReplacements = null;\n\n if (viewSpec) {\n shaderReplacements = viewSpec.ShaderReplacements;\n }\n\n if (shaderReplacements) {\n for (var i = 0; i < shaderReplacements.length; i++) {\n var currReplacement = shaderReplacements[i];\n\n if (pre && currReplacement.replaceFirst || !pre && !currReplacement.replaceFirst) {\n var shaderType = currReplacement.shaderType;\n var ssrc = shaders[shaderType];\n var substituteRes = vtkShaderProgram.substitute(ssrc, currReplacement.originalValue, currReplacement.replacementValue, currReplacement.replaceAll);\n shaders[shaderType] = substituteRes.result;\n }\n }\n }\n };\n\n publicAPI.buildShaders = function (shaders, ren, actor) {\n publicAPI.getReplacedShaderTemplate(shaders, ren, actor);\n model.lastRenderPassShaderReplacement = model.currentRenderPass ? model.currentRenderPass.getShaderReplacement() : null; // apply any renderPassReplacements\n\n if (model.lastRenderPassShaderReplacement) {\n model.lastRenderPassShaderReplacement(shaders);\n }\n\n var openGLSpec = model.renderable.getViewSpecificProperties().OpenGL; // user specified pre replacements\n\n publicAPI.applyShaderReplacements(shaders, openGLSpec, true);\n publicAPI.replaceShaderValues(shaders, ren, actor); // user specified post replacements\n\n publicAPI.applyShaderReplacements(shaders, openGLSpec);\n };\n\n publicAPI.getReplacedShaderTemplate = function (shaders, ren, actor) {\n var openGLSpecProp = model.renderable.getViewSpecificProperties().OpenGL;\n publicAPI.getShaderTemplate(shaders, ren, actor);\n var vertexShaderCode = shaders.Vertex;\n\n if (openGLSpecProp) {\n var vertexSpecProp = openGLSpecProp.VertexShaderCode;\n\n if (vertexSpecProp !== undefined && vertexSpecProp !== '') {\n vertexShaderCode = vertexSpecProp;\n }\n }\n\n shaders.Vertex = vertexShaderCode;\n var fragmentShaderCode = shaders.Fragment;\n\n if (openGLSpecProp) {\n var fragmentSpecProp = openGLSpecProp.FragmentShaderCode;\n\n if (fragmentSpecProp !== undefined && fragmentSpecProp !== '') {\n fragmentShaderCode = fragmentSpecProp;\n }\n }\n\n shaders.Fragment = fragmentShaderCode;\n var geometryShaderCode = shaders.Geometry;\n\n if (openGLSpecProp) {\n var geometrySpecProp = openGLSpecProp.GeometryShaderCode;\n\n if (geometrySpecProp !== undefined) {\n geometryShaderCode = geometrySpecProp;\n }\n }\n\n shaders.Geometry = geometryShaderCode;\n };\n}\n\nvar vtkReplacementShaderMapper = {\n implementReplaceShaderCoincidentOffset: implementReplaceShaderCoincidentOffset,\n implementBuildShadersWithReplacements: implementBuildShadersWithReplacements\n};\n\nexport { vtkReplacementShaderMapper as default };\n","var vtkImageResliceMapperVS = \"//VTK::System::Dec\\n\\n/*=========================================================================\\n\\n Program: Visualization Toolkit\\n Module: vtkImageResliceMapperVS.glsl\\n\\n Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen\\n All rights reserved.\\n See Copyright.txt or http://www.kitware.com/Copyright.htm for details.\\n\\n This software is distributed WITHOUT ANY WARRANTY; without even\\n the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR\\n PURPOSE. See the above copyright notice for more information.\\n\\n=========================================================================*/\\n\\n// all variables that represent positions or directions have a suffix\\n// indicating the coordinate system they are in. The possible values are\\n// MC - Model coordinates\\n// WC - World coordinates\\n// VC - View coordinates\\n// DC - Display coordinates\\n// TC - Texture coordinates\\n\\n// frag position in VC\\n//VTK::PositionVC::Dec\\n\\n// Texture coordinates\\n//VTK::TCoord::Dec\\n\\n// picking support\\n//VTK::Picking::Dec\\n\\n// camera and actor matrix values\\n//VTK::Camera::Dec\\n\\nvoid main()\\n{\\n //VTK::PositionVC::Impl\\n\\n //VTK::TCoord::Impl\\n\\n //VTK::Picking::Impl\\n}\\n\";\n\nexport { vtkImageResliceMapperVS as v };\n","var vtkImageResliceMapperFS = \"//VTK::System::Dec\\n\\n/*=========================================================================\\n\\n Program: Visualization Toolkit\\n Module: vtkImageResliceMapperFS.glsl\\n\\n Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen\\n All rights reserved.\\n See Copyright.txt or http://www.kitware.com/Copyright.htm for details.\\n\\n This software is distributed WITHOUT ANY WARRANTY; without even\\n the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR\\n PURPOSE. See the above copyright notice for more information.\\n\\n=========================================================================*/\\n// Template for the gpu image mapper fragment shader\\n\\n// VC position of this fragment\\n//VTK::PositionVC::Dec\\n\\n// Texture coordinates\\n//VTK::TCoord::Dec\\n\\n// picking support\\n//VTK::Picking::Dec\\n\\n// handle coincident offsets\\n//VTK::Coincident::Dec\\n\\n//VTK::ZBuffer::Dec\\n\\n// the output of this shader\\n//VTK::Output::Dec\\n\\nvoid main()\\n{\\n // VC position of this fragment. This should not branch/return/discard.\\n //VTK::PositionVC::Impl\\n\\n // Place any calls that require uniform flow (e.g. dFdx) here.\\n //VTK::UniformFlow::Impl\\n\\n // Set gl_FragDepth here (gl_FragCoord.z by default)\\n //VTK::Depth::Impl\\n\\n // Early depth peeling abort:\\n //VTK::DepthPeeling::PreColor\\n\\n //VTK::TCoord::Impl\\n\\n if (gl_FragData[0].a <= 0.0)\\n {\\n discard;\\n }\\n\\n //VTK::DepthPeeling::Impl\\n\\n //VTK::Picking::Impl\\n\\n // handle coincident offsets\\n //VTK::Coincident::Impl\\n\\n //VTK::ZBuffer::Impl\\n\\n //VTK::RenderPassFragmentShader::Impl\\n}\\n\";\n\nexport { vtkImageResliceMapperFS as v };\n","var InterpolationType = {\n NEAREST: 0,\n LINEAR: 1\n};\nvar InterpolationType$1 = {\n InterpolationType: InterpolationType\n};\n\nexport { InterpolationType, InterpolationType$1 as default };\n","import _slicedToArray from '@babel/runtime/helpers/slicedToArray';\nimport { newInstance as newInstance$1, obj, get, vtkErrorMacro as vtkErrorMacro$1 } from '../../macros.js';\nimport { mat4, vec3 } from 'gl-matrix';\nimport vtkClosedPolyLineToSurfaceFilter from '../../Filters/General/ClosedPolyLineToSurfaceFilter.js';\nimport vtkCubeSource from '../../Filters/Sources/CubeSource.js';\nimport vtkCutter from '../../Filters/Core/Cutter.js';\nimport vtkDataArray from '../../Common/Core/DataArray.js';\nimport vtkHelper from './Helper.js';\nimport { f as vtkMath } from '../../Common/Core/Math/index.js';\nimport vtkOpenGLTexture from './Texture.js';\nimport vtkPlane from '../../Common/DataModel/Plane.js';\nimport vtkPolyData from '../../Common/DataModel/PolyData.js';\nimport vtkReplacementShaderMapper from './ReplacementShaderMapper.js';\nimport vtkShaderProgram from './ShaderProgram.js';\nimport vtkViewNode from '../SceneGraph/ViewNode.js';\nimport { v as vtkImageResliceMapperVS } from './glsl/vtkImageResliceMapperVS.glsl.js';\nimport { v as vtkImageResliceMapperFS } from './glsl/vtkImageResliceMapperFS.glsl.js';\nimport InterpolationType from '../Core/ImageProperty/Constants.js';\nimport { VtkDataTypes } from '../../Common/Core/DataArray/Constants.js';\nimport { Filter } from './Texture/Constants.js';\nimport { Representation } from '../Core/Property/Constants.js';\nimport { registerOverride } from './ViewNodeFactory.js';\n\nvar vtkErrorMacro = vtkErrorMacro$1; // ----------------------------------------------------------------------------\n// helper methods\n// ----------------------------------------------------------------------------\n\nfunction computeFnToString(property, fn, numberOfComponents) {\n var pwfun = fn.apply(property);\n\n if (pwfun) {\n var iComps = property.getIndependentComponents();\n return \"\".concat(property.getMTime(), \"-\").concat(iComps, \"-\").concat(numberOfComponents);\n }\n\n return '0';\n}\n\nfunction safeMatrixMultiply(matrixArray, matrixType, tmpMat) {\n matrixType.identity(tmpMat);\n return matrixArray.reduce(function (res, matrix, index) {\n if (index === 0) {\n return matrix ? matrixType.copy(res, matrix) : matrixType.identity(res);\n }\n\n return matrix ? matrixType.multiply(res, res, matrix) : res;\n }, tmpMat);\n} // ----------------------------------------------------------------------------\n// vtkOpenGLImageResliceMapper methods\n// ----------------------------------------------------------------------------\n\n\nfunction vtkOpenGLImageResliceMapper(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkOpenGLImageResliceMapper');\n\n publicAPI.buildPass = function (prepass) {\n if (prepass) {\n model.currentRenderPass = null;\n model._openGLImageSlice = publicAPI.getFirstAncestorOfType('vtkOpenGLImageSlice');\n model._openGLRenderer = publicAPI.getFirstAncestorOfType('vtkOpenGLRenderer');\n\n var ren = model._openGLRenderer.getRenderable();\n\n model._openGLCamera = model._openGLRenderer.getViewNodeFor(ren.getActiveCamera());\n model._openGLRenderWindow = model._openGLRenderer.getParent();\n model.context = model._openGLRenderWindow.getContext();\n model.tris.setOpenGLRenderWindow(model._openGLRenderWindow);\n\n if (!model.openGLTexture) {\n model.openGLTexture = vtkOpenGLTexture.newInstance();\n }\n\n model.openGLTexture.setOpenGLRenderWindow(model._openGLRenderWindow);\n model.colorTexture.setOpenGLRenderWindow(model._openGLRenderWindow);\n model.pwfTexture.setOpenGLRenderWindow(model._openGLRenderWindow);\n }\n };\n\n publicAPI.translucentPass = function (prepass, renderPass) {\n if (prepass) {\n model.currentRenderPass = renderPass;\n publicAPI.render();\n }\n };\n\n publicAPI.zBufferPass = function (prepass) {\n if (prepass) {\n model.haveSeenDepthRequest = true;\n model.renderDepth = true;\n publicAPI.render();\n model.renderDepth = false;\n }\n };\n\n publicAPI.opaqueZBufferPass = function (prepass) {\n return publicAPI.zBufferPass(prepass);\n };\n\n publicAPI.opaquePass = function (prepass) {\n if (prepass) {\n publicAPI.render();\n }\n };\n\n publicAPI.getCoincidentParameters = function (ren, actor) {\n if (model.renderable.getResolveCoincidentTopology()) {\n return model.renderable.getCoincidentTopologyPolygonOffsetParameters();\n }\n\n return null;\n }; // Renders myself\n\n\n publicAPI.render = function () {\n var actor = model._openGLImageSlice.getRenderable();\n\n var ren = model._openGLRenderer.getRenderable();\n\n publicAPI.renderPiece(ren, actor);\n };\n\n publicAPI.renderPiece = function (ren, actor) {\n publicAPI.invokeEvent({\n type: 'StartEvent'\n });\n model.renderable.update();\n model.currentInput = model.renderable.getInputData();\n\n if (!model.currentInput) {\n vtkErrorMacro('No input!');\n return;\n }\n\n publicAPI.updateResliceGeometry();\n publicAPI.renderPieceStart(ren, actor);\n publicAPI.renderPieceDraw(ren, actor);\n publicAPI.renderPieceFinish(ren, actor);\n publicAPI.invokeEvent({\n type: 'EndEvent'\n });\n };\n\n publicAPI.renderPieceStart = function (ren, actor) {\n // make sure the BOs are up to date\n publicAPI.updateBufferObjects(ren, actor);\n var iType = actor.getProperty().getInterpolationType();\n\n if (iType === InterpolationType.NEAREST) {\n model.openGLTexture.setMinificationFilter(Filter.NEAREST);\n model.openGLTexture.setMagnificationFilter(Filter.NEAREST);\n model.colorTexture.setMinificationFilter(Filter.NEAREST);\n model.colorTexture.setMagnificationFilter(Filter.NEAREST);\n model.pwfTexture.setMinificationFilter(Filter.NEAREST);\n model.pwfTexture.setMagnificationFilter(Filter.NEAREST);\n } else {\n model.openGLTexture.setMinificationFilter(Filter.LINEAR);\n model.openGLTexture.setMagnificationFilter(Filter.LINEAR);\n model.colorTexture.setMinificationFilter(Filter.LINEAR);\n model.colorTexture.setMagnificationFilter(Filter.LINEAR);\n model.pwfTexture.setMinificationFilter(Filter.LINEAR);\n model.pwfTexture.setMagnificationFilter(Filter.LINEAR);\n } // No buffer objects bound.\n\n\n model.lastBoundBO = null;\n };\n\n publicAPI.renderPieceDraw = function (ren, actor) {\n var gl = model.context; // render the texture\n\n model.openGLTexture.activate();\n model.colorTexture.activate();\n model.pwfTexture.activate(); // update shaders if required\n\n publicAPI.updateShaders(model.tris, ren, actor); // Finally draw\n\n gl.drawArrays(gl.TRIANGLES, 0, model.tris.getCABO().getElementCount());\n model.tris.getVAO().release();\n model.openGLTexture.deactivate();\n model.colorTexture.deactivate();\n model.pwfTexture.deactivate();\n };\n\n publicAPI.renderPieceFinish = function (ren, actor) {};\n\n publicAPI.updateBufferObjects = function (ren, actor) {\n // Rebuild buffer objects if needed\n if (publicAPI.getNeedToRebuildBufferObjects(ren, actor)) {\n publicAPI.buildBufferObjects(ren, actor);\n }\n };\n\n publicAPI.getNeedToRebuildBufferObjects = function (ren, actor) {\n return model.VBOBuildTime.getMTime() < publicAPI.getMTime() || model.VBOBuildTime.getMTime() < actor.getMTime() || model.VBOBuildTime.getMTime() < model.renderable.getMTime() || model.VBOBuildTime.getMTime() < actor.getProperty().getMTime() || model.VBOBuildTime.getMTime() < model.currentInput.getMTime() || model.VBOBuildTime.getMTime() < model.resliceGeom.getMTime();\n };\n\n publicAPI.buildBufferObjects = function (ren, actor) {\n var _image$getPointData;\n\n var image = model.currentInput;\n\n if (!image) {\n return;\n }\n\n var scalars = (_image$getPointData = image.getPointData()) === null || _image$getPointData === void 0 ? void 0 : _image$getPointData.getScalars();\n\n if (!scalars) {\n return;\n }\n\n var numComp = scalars.getNumberOfComponents();\n\n if (!model._externalOpenGLTexture) {\n var _toString = \"\".concat(image.getMTime(), \"A\").concat(scalars.getMTime());\n\n if (model.openGLTextureString !== _toString) {\n // Build the image scalar texture\n var dims = image.getDimensions(); // Use norm16 for the 3D texture if the extension is available\n\n model.openGLTexture.getOglNorm16Ext(model.context.getExtension('EXT_texture_norm16'));\n model.openGLTexture.releaseGraphicsResources(model._openGLRenderWindow);\n model.openGLTexture.resetFormatAndType();\n model.openGLTexture.create3DFilterableFromDataArray(dims[0], dims[1], dims[2], scalars);\n model.openGLTextureString = _toString;\n }\n }\n\n var ppty = actor.getProperty();\n var iComps = ppty.getIndependentComponents();\n var numIComps = iComps ? numComp : 1;\n var textureHeight = iComps ? 2 * numIComps : 1;\n var cfunToString = computeFnToString(ppty, ppty.getRGBTransferFunction, numIComps);\n\n if (model.colorTextureString !== cfunToString) {\n var cWidth = 1024;\n var cSize = cWidth * textureHeight * 3;\n var cTable = new Uint8Array(cSize);\n var cfun = ppty.getRGBTransferFunction();\n\n if (cfun) {\n var tmpTable = new Float32Array(cWidth * 3);\n\n for (var c = 0; c < numIComps; c++) {\n cfun = ppty.getRGBTransferFunction(c);\n var cRange = cfun.getRange();\n cfun.getTable(cRange[0], cRange[1], cWidth, tmpTable, 1);\n\n if (iComps) {\n for (var i = 0; i < cWidth * 3; i++) {\n cTable[c * cWidth * 6 + i] = 255.0 * tmpTable[i];\n cTable[c * cWidth * 6 + i + cWidth * 3] = 255.0 * tmpTable[i];\n }\n } else {\n for (var _i = 0; _i < cWidth * 3; _i++) {\n cTable[c * cWidth * 6 + _i] = 255.0 * tmpTable[_i];\n }\n }\n }\n\n model.colorTexture.releaseGraphicsResources(model._openGLRenderWindow);\n model.colorTexture.resetFormatAndType();\n model.colorTexture.create2DFromRaw(cWidth, textureHeight, 3, VtkDataTypes.UNSIGNED_CHAR, cTable);\n } else {\n for (var _i2 = 0; _i2 < cWidth * 3; ++_i2) {\n cTable[_i2] = 255.0 * _i2 / ((cWidth - 1) * 3);\n cTable[_i2 + 1] = 255.0 * _i2 / ((cWidth - 1) * 3);\n cTable[_i2 + 2] = 255.0 * _i2 / ((cWidth - 1) * 3);\n }\n\n model.colorTexture.create2DFromRaw(cWidth, 1, 3, VtkDataTypes.UNSIGNED_CHAR, cTable);\n }\n\n model.colorTextureString = cfunToString;\n } // Build piecewise function buffer. This buffer is used either\n // for component weighting or opacity, depending on whether we're\n // rendering components independently or not.\n\n\n var pwfunToString = computeFnToString(ppty, ppty.getPiecewiseFunction, numIComps);\n\n if (model.pwfTextureString !== pwfunToString) {\n var pwfWidth = 1024;\n var pwfSize = pwfWidth * textureHeight;\n var pwfTable = new Uint8Array(pwfSize);\n var pwfun = ppty.getPiecewiseFunction(); // support case where pwfun is added/removed\n\n model.pwfTexture.releaseGraphicsResources(model._openGLRenderWindow);\n model.pwfTexture.resetFormatAndType();\n\n if (pwfun) {\n var pwfFloatTable = new Float32Array(pwfSize);\n\n var _tmpTable = new Float32Array(pwfWidth);\n\n for (var _c = 0; _c < numIComps; ++_c) {\n pwfun = ppty.getPiecewiseFunction(_c);\n\n if (pwfun === null) {\n // Piecewise constant max if no function supplied for this component\n pwfFloatTable.fill(1.0);\n } else {\n var pwfRange = pwfun.getRange();\n pwfun.getTable(pwfRange[0], pwfRange[1], pwfWidth, _tmpTable, 1); // adjust for sample distance etc\n\n if (iComps) {\n for (var _i3 = 0; _i3 < pwfWidth; _i3++) {\n pwfFloatTable[_c * pwfWidth * 2 + _i3] = _tmpTable[_i3];\n pwfFloatTable[_c * pwfWidth * 2 + _i3 + pwfWidth] = _tmpTable[_i3];\n }\n } else {\n for (var _i4 = 0; _i4 < pwfWidth; _i4++) {\n pwfFloatTable[_c * pwfWidth * 2 + _i4] = _tmpTable[_i4];\n }\n }\n }\n }\n\n model.pwfTexture.create2DFromRaw(pwfWidth, textureHeight, 1, VtkDataTypes.FLOAT, pwfFloatTable);\n } else {\n // default is opaque\n pwfTable.fill(255.0);\n model.pwfTexture.create2DFromRaw(pwfWidth, 1, 1, VtkDataTypes.UNSIGNED_CHAR, pwfTable);\n }\n\n model.pwfTextureString = pwfunToString;\n }\n\n var vboString = \"\".concat(model.resliceGeom.getMTime(), \"A\").concat(model.renderable.getSlabThickness());\n\n if (!model.tris.getCABO().getElementCount() || model.VBOBuildString !== vboString) {\n var points = vtkDataArray.newInstance({\n numberOfComponents: 3,\n values: model.resliceGeom.getPoints().getData()\n });\n points.setName('points');\n var cells = vtkDataArray.newInstance({\n numberOfComponents: 1,\n values: model.resliceGeom.getPolys().getData()\n });\n var options = {\n points: points,\n cellOffset: 0\n };\n\n if (model.renderable.getSlabThickness() > 0.0) {\n var n = model.resliceGeom.getPointData().getNormals();\n\n if (!n) {\n vtkErrorMacro('Slab mode requested without normals');\n } else {\n options.normals = n;\n }\n }\n\n model.tris.getCABO().createVBO(cells, 'polys', Representation.SURFACE, options);\n }\n\n model.VBOBuildString = vboString;\n model.VBOBuildTime.modified();\n };\n\n publicAPI.updateShaders = function (cellBO, ren, actor) {\n model.lastBoundBO = cellBO; // has something changed that would require us to recreate the shader?\n\n if (publicAPI.getNeedToRebuildShaders(cellBO, ren, actor)) {\n var shaders = {\n Vertex: null,\n Fragment: null,\n Geometry: null\n };\n publicAPI.buildShaders(shaders, ren, actor); // compile and bind the program if needed\n\n var newShader = model._openGLRenderWindow.getShaderCache().readyShaderProgramArray(shaders.Vertex, shaders.Fragment, shaders.Geometry); // if the shader changed reinitialize the VAO\n\n\n if (newShader !== cellBO.getProgram()) {\n cellBO.setProgram(newShader); // reset the VAO as the shader has changed\n\n cellBO.getVAO().releaseGraphicsResources();\n }\n\n cellBO.getShaderSourceTime().modified();\n } else {\n model._openGLRenderWindow.getShaderCache().readyShaderProgram(cellBO.getProgram());\n }\n\n cellBO.getVAO().bind();\n publicAPI.setMapperShaderParameters(cellBO, ren, actor);\n publicAPI.setCameraShaderParameters(cellBO, ren, actor);\n publicAPI.setPropertyShaderParameters(cellBO, ren, actor);\n };\n\n publicAPI.setMapperShaderParameters = function (cellBO, ren, actor) {\n var program = cellBO.getProgram();\n\n if (cellBO.getCABO().getElementCount() && (model.VBOBuildTime.getMTime() > cellBO.getAttributeUpdateTime().getMTime() || cellBO.getShaderSourceTime().getMTime() > cellBO.getAttributeUpdateTime().getMTime())) {\n // Set the 3D texture\n if (program.isUniformUsed('texture1')) {\n program.setUniformi('texture1', model.openGLTexture.getTextureUnit());\n } // Set the plane vertex attributes\n\n\n if (program.isAttributeUsed('vertexWC')) {\n if (!cellBO.getVAO().addAttributeArray(program, cellBO.getCABO(), 'vertexWC', cellBO.getCABO().getVertexOffset(), cellBO.getCABO().getStride(), model.context.FLOAT, 3, model.context.FALSE)) {\n vtkErrorMacro('Error setting vertexWC in shader VAO.');\n }\n } // If we are doing slab mode, we need normals\n\n\n if (program.isAttributeUsed('normalWC')) {\n if (!cellBO.getVAO().addAttributeArray(program, cellBO.getCABO(), 'normalWC', cellBO.getCABO().getNormalOffset(), cellBO.getCABO().getStride(), model.context.FLOAT, 3, model.context.FALSE)) {\n vtkErrorMacro('Error setting normalWC in shader VAO.');\n }\n }\n\n if (program.isUniformUsed('slabThickness')) {\n program.setUniformf('slabThickness', model.renderable.getSlabThickness());\n }\n\n if (program.isUniformUsed('spacing')) {\n program.setUniform3fv('spacing', model.currentInput.getSpacing());\n }\n\n if (program.isUniformUsed('slabType')) {\n program.setUniformi('slabType', model.renderable.getSlabType());\n }\n\n if (program.isUniformUsed('slabType')) {\n program.setUniformi('slabType', model.renderable.getSlabType());\n }\n\n if (program.isUniformUsed('slabTrapezoid')) {\n program.setUniformi('slabTrapezoid', model.renderable.getSlabTrapezoidIntegration());\n }\n\n var shiftScaleEnabled = cellBO.getCABO().getCoordShiftAndScaleEnabled();\n var inverseShiftScaleMatrix = shiftScaleEnabled ? cellBO.getCABO().getInverseShiftAndScaleMatrix() : null; // Set the world->texture matrix\n\n if (program.isUniformUsed('WCTCMatrix')) {\n var image = model.currentInput;\n mat4.identity(model.tmpMat4);\n var bounds = image.getBounds();\n var sc = [bounds[1] - bounds[0], bounds[3] - bounds[2], bounds[5] - bounds[4]];\n var o = [bounds[0], bounds[2], bounds[4]];\n var q = [0, 0, 0, 1];\n mat4.fromRotationTranslationScale(model.tmpMat4, q, o, sc);\n mat4.invert(model.tmpMat4, model.tmpMat4);\n\n if (inverseShiftScaleMatrix) {\n mat4.multiply(model.tmpMat4, model.tmpMat4, inverseShiftScaleMatrix);\n }\n\n program.setUniformMatrix('WCTCMatrix', model.tmpMat4);\n }\n\n cellBO.getAttributeUpdateTime().modified();\n } // Depth request\n\n\n if (model.haveSeenDepthRequest) {\n cellBO.getProgram().setUniformi('depthRequest', model.renderDepth ? 1 : 0);\n } // handle coincident\n\n\n if (cellBO.getProgram().isUniformUsed('coffset')) {\n var cp = publicAPI.getCoincidentParameters(ren, actor);\n cellBO.getProgram().setUniformf('coffset', cp.offset); // cfactor isn't always used when coffset is.\n\n if (cellBO.getProgram().isUniformUsed('cfactor')) {\n cellBO.getProgram().setUniformf('cfactor', cp.factor);\n }\n }\n };\n\n publicAPI.setCameraShaderParameters = function (cellBO, ren, actor) {\n // [WMVP]C == {world, model, view, projection} coordinates\n // e.g. WCPC == world to projection coordinate transformation\n var keyMats = model._openGLCamera.getKeyMatrices(ren);\n\n var actMats = model._openGLImageSlice.getKeyMatrices();\n\n var shiftScaleEnabled = cellBO.getCABO().getCoordShiftAndScaleEnabled();\n var inverseShiftScaleMatrix = shiftScaleEnabled ? cellBO.getCABO().getInverseShiftAndScaleMatrix() : null;\n var program = cellBO.getProgram();\n\n if (program.isUniformUsed('MCPCMatrix')) {\n mat4.identity(model.tmpMat4);\n program.setUniformMatrix('MCPCMatrix', safeMatrixMultiply([keyMats.wcpc, actMats.mcwc, inverseShiftScaleMatrix], mat4, model.tmpMat4));\n }\n\n if (program.isUniformUsed('MCVCMatrix')) {\n mat4.identity(model.tmpMat4);\n program.setUniformMatrix('MCVCMatrix', safeMatrixMultiply([keyMats.wcvc, actMats.mcwc, inverseShiftScaleMatrix], mat4, model.tmpMat4));\n }\n };\n\n publicAPI.setPropertyShaderParameters = function (cellBO, ren, actor) {\n var program = cellBO.getProgram();\n var ppty = actor.getProperty();\n var opacity = ppty.getOpacity();\n program.setUniformf('opacity', opacity); // Component mix\n // Independent components: Mixed according to component weights\n // Dependent components: Mixed using the following logic:\n // - 2 comps => LA\n // - 3 comps => RGB + opacity from pwf\n // - 4 comps => RGBA\n\n var numComp = model.openGLTexture.getComponents();\n var iComps = ppty.getIndependentComponents();\n\n if (iComps) {\n for (var i = 0; i < numComp; ++i) {\n program.setUniformf(\"mix\".concat(i), ppty.getComponentWeight(i));\n }\n } // Color opacity map\n\n\n var volInfo = model.openGLTexture.getVolumeInfo(); // three levels of shift scale combined into one\n // for performance in the fragment shader\n\n for (var _i5 = 0; _i5 < numComp; _i5++) {\n var cw = ppty.getColorWindow();\n var cl = ppty.getColorLevel();\n var target = iComps ? _i5 : 0;\n var cfun = ppty.getRGBTransferFunction(target);\n\n if (cfun && ppty.getUseLookupTableScalarRange()) {\n var cRange = cfun.getRange();\n cw = cRange[1] - cRange[0];\n cl = 0.5 * (cRange[1] + cRange[0]);\n }\n\n var scale = volInfo.scale[_i5] / cw;\n var shift = (volInfo.offset[_i5] - cl) / cw + 0.5;\n program.setUniformf(\"cshift\".concat(_i5), shift);\n program.setUniformf(\"cscale\".concat(_i5), scale);\n }\n\n var texColorUnit = model.colorTexture.getTextureUnit();\n program.setUniformi('colorTexture1', texColorUnit); // pwf shift/scale\n\n for (var _i6 = 0; _i6 < numComp; _i6++) {\n var pwfScale = 1.0;\n var pwfShift = 0.0;\n\n var _target = iComps ? _i6 : 0;\n\n var pwfun = ppty.getPiecewiseFunction(_target);\n\n if (pwfun) {\n var pwfRange = pwfun.getRange();\n var length = pwfRange[1] - pwfRange[0];\n var mid = 0.5 * (pwfRange[0] + pwfRange[1]);\n pwfScale = volInfo.scale[_i6] / length;\n pwfShift = (volInfo.offset[_i6] - mid) / length + 0.5;\n }\n\n program.setUniformf(\"pwfshift\".concat(_i6), pwfShift);\n program.setUniformf(\"pwfscale\".concat(_i6), pwfScale);\n }\n\n var texOpacityUnit = model.pwfTexture.getTextureUnit();\n program.setUniformi('pwfTexture1', texOpacityUnit); // Background color\n\n program.setUniform4fv('backgroundColor', model.renderable.getBackgroundColor());\n };\n\n publicAPI.getNeedToRebuildShaders = function (cellBO, ren, actor) {\n // has something changed that would require us to recreate the shader?\n // candidates are\n // property modified (representation interpolation and lighting)\n // input modified\n // light complexity changed\n // render pass shader replacement changed\n var tNumComp = model.openGLTexture.getComponents();\n var iComp = actor.getProperty().getIndependentComponents();\n var slabTh = model.renderable.getSlabThickness();\n var slabType = model.renderable.getSlabType();\n var slabTrap = model.renderable.getSlabTrapezoidIntegration(); // has the render pass shader replacement changed? Two options\n\n var needRebuild = false;\n\n if (!model.currentRenderPass && model.lastRenderPassShaderReplacement || model.currentRenderPass && model.currentRenderPass.getShaderReplacement() !== model.lastRenderPassShaderReplacement) {\n needRebuild = true;\n }\n\n if (needRebuild || model.lastHaveSeenDepthRequest !== model.haveSeenDepthRequest || cellBO.getProgram() === 0 || model.lastTextureComponents !== tNumComp || model.lastIndependentComponents !== iComp || model.lastSlabThickness !== slabTh || model.lastSlabType !== slabType || model.lastSlabTrapezoidIntegration !== slabTrap) {\n model.lastHaveSeenDepthRequest = model.haveSeenDepthRequest;\n model.lastTextureComponents = tNumComp;\n model.lastIndependentComponents = iComp;\n model.lastSlabThickness = slabTh;\n model.lastSlabType = slabType;\n model.lastSlabTrapezoidIntegration = slabTrap;\n return true;\n }\n\n return false;\n };\n\n publicAPI.getShaderTemplate = function (shaders, ren, actor) {\n shaders.Vertex = vtkImageResliceMapperVS;\n shaders.Fragment = vtkImageResliceMapperFS;\n shaders.Geometry = '';\n };\n\n publicAPI.replaceShaderValues = function (shaders, ren, actor) {\n publicAPI.replaceShaderTCoord(shaders, ren, actor);\n publicAPI.replaceShaderPositionVC(shaders, ren, actor);\n\n if (model.haveSeenDepthRequest) {\n var FSSource = shaders.Fragment;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::ZBuffer::Dec', 'uniform int depthRequest;').result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::ZBuffer::Impl', ['if (depthRequest == 1) {', 'float iz = floor(gl_FragCoord.z*65535.0 + 0.1);', 'float rf = floor(iz/256.0)/255.0;', 'float gf = mod(iz,256.0)/255.0;', 'gl_FragData[0] = vec4(rf, gf, 0.0, 1.0); }']).result;\n shaders.Fragment = FSSource;\n }\n\n publicAPI.replaceShaderCoincidentOffset(shaders, ren, actor);\n };\n\n publicAPI.replaceShaderTCoord = function (shaders, ren, actor) {\n var VSSource = shaders.Vertex;\n var GSSource = shaders.Geometry;\n var FSSource = shaders.Fragment;\n var tcoordVSDec = ['uniform mat4 WCTCMatrix;', 'out vec3 fragTexCoord;'];\n var slabThickness = model.renderable.getSlabThickness();\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::TCoord::Dec', tcoordVSDec).result;\n var tcoordVSImpl = ['fragTexCoord = (WCTCMatrix * vertexWC).xyz;'];\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::TCoord::Impl', tcoordVSImpl).result;\n var tNumComp = model.openGLTexture.getComponents();\n var iComps = actor.getProperty().getIndependentComponents();\n var tcoordFSDec = ['in vec3 fragTexCoord;', 'uniform highp sampler3D texture1;', 'uniform mat4 WCTCMatrix;', // color shift and scale\n 'uniform float cshift0;', 'uniform float cscale0;', // pwf shift and scale\n 'uniform float pwfshift0;', 'uniform float pwfscale0;', // color and pwf textures\n 'uniform sampler2D colorTexture1;', 'uniform sampler2D pwfTexture1;', // opacity\n 'uniform float opacity;', // background color\n 'uniform vec4 backgroundColor;'];\n\n if (iComps) {\n for (var comp = 1; comp < tNumComp; comp++) {\n tcoordFSDec = tcoordFSDec.concat([// color shift and scale\n \"uniform float cshift\".concat(comp, \";\"), \"uniform float cscale\".concat(comp, \";\"), // weighting shift and scale\n \"uniform float pwfshift\".concat(comp, \";\"), \"uniform float pwfscale\".concat(comp, \";\")]);\n } // the heights defined below are the locations\n // for the up to four components of the tfuns\n // the tfuns have a height of 2XnumComps pixels so the\n // values are computed to hit the middle of the two rows\n // for that component\n\n\n switch (tNumComp) {\n case 1:\n tcoordFSDec = tcoordFSDec.concat(['uniform float mix0;', '#define height0 0.5']);\n break;\n\n case 2:\n tcoordFSDec = tcoordFSDec.concat(['uniform float mix0;', 'uniform float mix1;', '#define height0 0.25', '#define height1 0.75']);\n break;\n\n case 3:\n tcoordFSDec = tcoordFSDec.concat(['uniform float mix0;', 'uniform float mix1;', 'uniform float mix2;', '#define height0 0.17', '#define height1 0.5', '#define height2 0.83']);\n break;\n\n case 4:\n tcoordFSDec = tcoordFSDec.concat(['uniform float mix0;', 'uniform float mix1;', 'uniform float mix2;', 'uniform float mix3;', '#define height0 0.125', '#define height1 0.375', '#define height2 0.625', '#define height3 0.875']);\n break;\n\n default:\n vtkErrorMacro('Unsupported number of independent coordinates.');\n }\n }\n\n if (slabThickness > 0.0) {\n tcoordFSDec = tcoordFSDec.concat(['uniform vec3 spacing;', 'uniform float slabThickness;', 'uniform int slabType;', 'uniform int slabTrapezoid;']);\n tcoordFSDec = tcoordFSDec.concat(['vec4 compositeValue(vec4 currVal, vec4 valToComp, int trapezoid)', '{', ' vec4 retVal = vec4(1.0);', ' if (slabType == 0) // min', ' {', ' retVal = min(currVal, valToComp);', ' }', ' else if (slabType == 1) // max', ' {', ' retVal = max(currVal, valToComp);', ' }', ' else if (slabType == 3) // sum', ' {', ' retVal = currVal + (trapezoid > 0 ? 0.5 * valToComp : valToComp); ', ' }', ' else // mean', ' {', ' retVal = currVal + (trapezoid > 0 ? 0.5 * valToComp : valToComp); ', ' }', ' return retVal;', '}']);\n }\n\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::TCoord::Dec', tcoordFSDec).result;\n var tcoordFSImpl = ['if (any(greaterThan(fragTexCoord, vec3(1.0))) || any(lessThan(fragTexCoord, vec3(0.0))))', '{', ' // set the background color and exit', ' gl_FragData[0] = backgroundColor;', ' return;', '}', 'vec4 tvalue = texture(texture1, fragTexCoord);'];\n\n if (slabThickness > 0.0) {\n tcoordFSImpl = tcoordFSImpl.concat(['// Get the first and last samples', 'int numSlices = 1;', 'vec3 normalxspacing = normalWCVSOutput * spacing * 0.5;', 'float distTraveled = length(normalxspacing);', 'int trapezoid = 0;', 'while (distTraveled < slabThickness * 0.5)', '{', ' distTraveled += length(normalxspacing);', ' float fnumSlices = float(numSlices);', ' if (distTraveled > slabThickness * 0.5)', ' {', ' // Before stepping outside the slab, sample at the boundaries', ' normalxspacing = normalWCVSOutput * slabThickness * 0.5 / fnumSlices;', ' trapezoid = slabTrapezoid;', ' }', ' vec3 fragTCoordNeg = (WCTCMatrix * vec4(vertexWCVSOutput.xyz - fnumSlices * normalxspacing, 1.0)).xyz;', ' if (!any(greaterThan(fragTCoordNeg, vec3(1.0))) && !any(lessThan(fragTCoordNeg, vec3(0.0))))', ' {', ' vec4 newVal = texture(texture1, fragTCoordNeg);', ' tvalue = compositeValue(tvalue, newVal, trapezoid);', ' numSlices += 1;', ' }', ' vec3 fragTCoordPos = (WCTCMatrix * vec4(vertexWCVSOutput.xyz + fnumSlices * normalxspacing, 1.0)).xyz;', ' if (!any(greaterThan(fragTCoordNeg, vec3(1.0))) && !any(lessThan(fragTCoordNeg, vec3(0.0))))', ' {', ' vec4 newVal = texture(texture1, fragTCoordPos);', ' tvalue = compositeValue(tvalue, newVal, trapezoid);', ' numSlices += 1;', ' }', '}', '// Finally, if slab type is *mean*, divide the sum by the numSlices', 'if (slabType == 2)', '{', ' tvalue = tvalue / float(numSlices);', '}']);\n }\n\n if (iComps) {\n var rgba = ['r', 'g', 'b', 'a'];\n\n for (var _comp = 0; _comp < tNumComp; ++_comp) {\n tcoordFSImpl = tcoordFSImpl.concat([\"vec3 tcolor\".concat(_comp, \" = mix\").concat(_comp, \" * texture2D(colorTexture1, vec2(tvalue.\").concat(rgba[_comp], \" * cscale\").concat(_comp, \" + cshift\").concat(_comp, \", height\").concat(_comp, \")).rgb;\"), \"float compWeight\".concat(_comp, \" = mix\").concat(_comp, \" * texture2D(pwfTexture1, vec2(tvalue.\").concat(rgba[_comp], \" * pwfscale\").concat(_comp, \" + pwfshift\").concat(_comp, \", height\").concat(_comp, \")).r;\")]);\n }\n\n switch (tNumComp) {\n case 1:\n tcoordFSImpl = tcoordFSImpl.concat(['gl_FragData[0] = vec4(tcolor0.rgb, compWeight0 * opacity);']);\n break;\n\n case 2:\n tcoordFSImpl = tcoordFSImpl.concat(['float weightSum = compWeight0 + compWeight1;', 'gl_FragData[0] = vec4(vec3((tcolor0.rgb * (compWeight0 / weightSum)) + (tcolor1.rgb * (compWeight1 / weightSum))), opacity);']);\n break;\n\n case 3:\n tcoordFSImpl = tcoordFSImpl.concat(['float weightSum = compWeight0 + compWeight1 + compWeight2;', 'gl_FragData[0] = vec4(vec3((tcolor0.rgb * (compWeight0 / weightSum)) + (tcolor1.rgb * (compWeight1 / weightSum)) + (tcolor2.rgb * (compWeight2 / weightSum))), opacity);']);\n break;\n\n case 4:\n tcoordFSImpl = tcoordFSImpl.concat(['float weightSum = compWeight0 + compWeight1 + compWeight2 + compWeight3;', 'gl_FragData[0] = vec4(vec3((tcolor0.rgb * (compWeight0 / weightSum)) + (tcolor1.rgb * (compWeight1 / weightSum)) + (tcolor2.rgb * (compWeight2 / weightSum)) + (tcolor3.rgb * (compWeight3 / weightSum))), opacity);']);\n break;\n\n default:\n vtkErrorMacro('Unsupported number of independent coordinates.');\n }\n } else {\n // dependent components\n switch (tNumComp) {\n case 1:\n tcoordFSImpl = tcoordFSImpl.concat(['// Dependent components', 'float intensity = tvalue.r;', 'vec3 tcolor = texture2D(colorTexture1, vec2(intensity * cscale0 + cshift0, 0.5)).rgb;', 'float scalarOpacity = texture2D(pwfTexture1, vec2(intensity * pwfscale0 + pwfshift0, 0.5)).r;', 'gl_FragData[0] = vec4(tcolor, scalarOpacity * opacity);']);\n break;\n\n case 2:\n tcoordFSImpl = tcoordFSImpl.concat(['float intensity = tvalue.r*cscale0 + cshift0;', 'gl_FragData[0] = vec4(texture2D(colorTexture1, vec2(intensity, 0.5)).rgb, pwfscale0*tvalue.g + pwfshift0);']);\n break;\n\n case 3:\n tcoordFSImpl = tcoordFSImpl.concat(['vec4 tcolor = cscale0*tvalue + cshift0;', 'gl_FragData[0] = vec4(texture2D(colorTexture1, vec2(tcolor.r,0.5)).r,', ' texture2D(colorTexture1, vec2(tcolor.g,0.5)).r,', ' texture2D(colorTexture1, vec2(tcolor.b,0.5)).r, opacity);']);\n break;\n\n default:\n tcoordFSImpl = tcoordFSImpl.concat(['vec4 tcolor = cscale0*tvalue + cshift0;', 'gl_FragData[0] = vec4(texture2D(colorTexture1, vec2(tcolor.r,0.5)).r,', ' texture2D(colorTexture1, vec2(tcolor.g,0.5)).r,', ' texture2D(colorTexture1, vec2(tcolor.b,0.5)).r, tcolor.a);']);\n }\n }\n\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::TCoord::Impl', tcoordFSImpl).result;\n shaders.Vertex = VSSource;\n shaders.Fragment = FSSource;\n shaders.Geometry = GSSource;\n };\n\n publicAPI.replaceShaderPositionVC = function (shaders, ren, actor) {\n var VSSource = shaders.Vertex;\n var GSSource = shaders.Geometry;\n var FSSource = shaders.Fragment;\n var slabThickness = model.renderable.getSlabThickness();\n var posVCVSDec = ['attribute vec4 vertexWC;']; // Add a unique hash to the shader to ensure that the shader program is unique to this mapper.\n\n posVCVSDec = posVCVSDec.concat([\"//\".concat(publicAPI.getMTime()).concat(model.resliceGeomUpdateString)]);\n\n if (slabThickness > 0.0) {\n posVCVSDec = posVCVSDec.concat(['attribute vec3 normalWC;', 'varying vec3 normalWCVSOutput;', 'varying vec4 vertexWCVSOutput;']);\n }\n\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::PositionVC::Dec', posVCVSDec).result;\n var posVCVSImpl = ['gl_Position = MCPCMatrix * vertexWC;'];\n\n if (slabThickness > 0.0) {\n posVCVSImpl = posVCVSImpl.concat(['normalWCVSOutput = normalWC;', 'vertexWCVSOutput = vertexWC;']);\n }\n\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::PositionVC::Impl', posVCVSImpl).result;\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::Camera::Dec', ['uniform mat4 MCPCMatrix;', 'uniform mat4 MCVCMatrix;']).result;\n var posVCFSDec = [];\n\n if (slabThickness > 0.0) {\n posVCFSDec = posVCFSDec.concat(['varying vec3 normalWCVSOutput;', 'varying vec4 vertexWCVSOutput;']);\n }\n\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::PositionVC::Dec', posVCFSDec).result;\n shaders.Vertex = VSSource;\n shaders.Geometry = GSSource;\n shaders.Fragment = FSSource;\n };\n\n function isVectorAxisAligned(n) {\n vtkMath.normalize(n);\n var tmpN = [0, 0, 0];\n\n for (var i = 0; i < 3; ++i) {\n vec3.zero(tmpN);\n tmpN[i] = 1.0;\n var dotP = vtkMath.dot(n, tmpN);\n\n if (dotP < -0.999 || dotP > 0.999) {\n return [true, i];\n }\n }\n\n return [false, 2];\n }\n\n publicAPI.updateResliceGeometry = function () {\n var resGeomString = '';\n var image = model.currentInput;\n var imageBounds = image === null || image === void 0 ? void 0 : image.getBounds(); // Orthogonal slicing by default\n\n var orthoSlicing = true;\n var orthoAxis = 2;\n\n if (model.renderable.getSlicePolyData()) {\n resGeomString = resGeomString.concat(\"PolyData\".concat(model.renderable.getSlicePolyData().getMTime()));\n } else if (model.renderable.getSlicePlane()) {\n resGeomString = resGeomString.concat(\"Plane\".concat(model.renderable.getSlicePlane().getMTime()));\n\n if (image) {\n resGeomString = resGeomString.concat(\"Image\".concat(image.getMTime()));\n } // Check to see if we can bypass oblique slicing related bounds computation\n\n\n var _isVectorAxisAligned = isVectorAxisAligned(model.renderable.getSlicePlane().getNormal());\n\n var _isVectorAxisAligned2 = _slicedToArray(_isVectorAxisAligned, 2);\n\n orthoSlicing = _isVectorAxisAligned2[0];\n orthoAxis = _isVectorAxisAligned2[1];\n } else {\n var _model$renderable$get;\n\n // Create a default slice plane here\n var plane = vtkPlane.newInstance();\n plane.setNormal(0, 0, 1);\n var bds = [0, 1, 0, 1, 0, 1];\n\n if (image) {\n bds = imageBounds;\n }\n\n plane.setOrigin(bds[0], bds[2], 0.5 * (bds[5] + bds[4]));\n model.renderable.setSlicePlane(plane);\n resGeomString = resGeomString.concat(\"Plane\".concat((_model$renderable$get = model.renderable.getSlicePlane()) === null || _model$renderable$get === void 0 ? void 0 : _model$renderable$get.getMTime()));\n\n if (image) {\n resGeomString = resGeomString.concat(\"Image\".concat(image.getMTime()));\n }\n }\n\n if (!model.resliceGeom || model.resliceGeomUpdateString !== resGeomString) {\n if (model.renderable.getSlicePolyData()) {\n model.resliceGeom = model.renderable.getSlicePolyData();\n } else if (model.renderable.getSlicePlane()) {\n var bounds = image ? imageBounds : [0, 1, 0, 1, 0, 1];\n\n if (!orthoSlicing) {\n var cube = vtkCubeSource.newInstance();\n cube.setCenter(0.5 * (bounds[0] + bounds[1]), 0.5 * (bounds[2] + bounds[3]), 0.5 * (bounds[4] + bounds[5]));\n cube.setXLength(bounds[1] - bounds[0]);\n cube.setYLength(bounds[3] - bounds[2]);\n cube.setZLength(bounds[5] - bounds[4]);\n var cutter = vtkCutter.newInstance();\n cutter.setInputConnection(cube.getOutputPort());\n cutter.setCutFunction(model.renderable.getSlicePlane());\n var pds = vtkClosedPolyLineToSurfaceFilter.newInstance();\n pds.setInputConnection(cutter.getOutputPort());\n pds.update();\n model.resliceGeom = pds.getOutputData(); // The above method does not generate point normals\n // Set it manually here.\n\n var n = model.renderable.getSlicePlane().getNormal();\n var npts = model.resliceGeom.getNumberOfPoints();\n vtkMath.normalize(n);\n var normalsData = new Float32Array(npts * 3);\n\n for (var i = 0; i < npts; ++i) {\n normalsData[3 * i] = n[0];\n normalsData[3 * i + 1] = n[1];\n normalsData[3 * i + 2] = n[2];\n }\n\n var normals = vtkDataArray.newInstance({\n numberOfComponents: 3,\n values: normalsData,\n name: 'Normals'\n });\n model.resliceGeom.getPointData().setNormals(normals);\n } else {\n var ptsArray = new Float32Array(12);\n var o = model.renderable.getSlicePlane().getOrigin();\n var otherAxes = [(orthoAxis + 1) % 3, (orthoAxis + 2) % 3].sort();\n var ptIdx = 0;\n\n for (var _i7 = 0; _i7 < 2; ++_i7) {\n for (var j = 0; j < 2; ++j) {\n ptsArray[ptIdx + orthoAxis] = o[orthoAxis];\n ptsArray[ptIdx + otherAxes[0]] = bounds[2 * otherAxes[0] + j];\n ptsArray[ptIdx + otherAxes[1]] = bounds[2 * otherAxes[1] + _i7];\n ptIdx += 3;\n }\n }\n\n var cellArray = new Uint16Array(8);\n cellArray[0] = 3;\n cellArray[1] = 0;\n cellArray[2] = 1;\n cellArray[3] = 3;\n cellArray[4] = 3;\n cellArray[5] = 0;\n cellArray[6] = 3;\n cellArray[7] = 2;\n\n var _n = model.renderable.getSlicePlane().getNormal();\n\n vtkMath.normalize(_n);\n\n var _normalsData = new Float32Array(12);\n\n for (var _i8 = 0; _i8 < 4; ++_i8) {\n _normalsData[3 * _i8] = _n[0];\n _normalsData[3 * _i8 + 1] = _n[1];\n _normalsData[3 * _i8 + 2] = _n[2];\n }\n\n if (!model.resliceGeom) {\n model.resliceGeom = vtkPolyData.newInstance();\n }\n\n model.resliceGeom.getPoints().setData(ptsArray, 3);\n model.resliceGeom.getPolys().setData(cellArray, 1);\n\n var _normals = vtkDataArray.newInstance({\n numberOfComponents: 3,\n values: _normalsData,\n name: 'Normals'\n });\n\n model.resliceGeom.getPointData().setNormals(_normals);\n model.resliceGeom.modified();\n }\n } else {\n vtkErrorMacro('Something went wrong.', 'A default slice plane should have been created in the beginning of', 'updateResliceGeometry.');\n }\n\n model.resliceGeomUpdateString = resGeomString;\n }\n };\n\n publicAPI.setOpenGLTexture = function (oglTex) {\n if (oglTex) {\n model.openGLTexture = oglTex;\n model._externalOpenGLTexture = true;\n }\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n VBOBuildTime: {},\n VBOBuildString: null,\n haveSeenDepthRequest: false,\n lastHaveSeenDepthRequest: false,\n lastIndependentComponents: false,\n lastTextureComponents: 0,\n lastSlabThickness: 0,\n lastSlabTrapezoidIntegration: 0,\n lastSlabType: -1,\n openGLTexture: null,\n openGLTextureString: null,\n colorTextureString: null,\n pwfTextureString: null,\n resliceGeom: null,\n resliceGeomUpdateString: null,\n tris: null,\n colorTexture: null,\n pwfTexture: null,\n _externalOpenGLTexture: false\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkViewNode.extend(publicAPI, model, initialValues);\n vtkReplacementShaderMapper.implementReplaceShaderCoincidentOffset(publicAPI, model, initialValues);\n vtkReplacementShaderMapper.implementBuildShadersWithReplacements(publicAPI, model, initialValues);\n model.tris = vtkHelper.newInstance();\n model.openGLTexture = vtkOpenGLTexture.newInstance();\n model.colorTexture = vtkOpenGLTexture.newInstance();\n model.pwfTexture = vtkOpenGLTexture.newInstance();\n model.VBOBuildTime = {};\n obj(model.VBOBuildTime); // model.modelToView = mat4.identity(new Float64Array(16));\n\n model.tmpMat4 = mat4.identity(new Float64Array(16));\n get(publicAPI, model, ['openGLTexture']); // Object methods\n\n vtkOpenGLImageResliceMapper(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend, 'vtkOpenGLImageResliceMapper'); // ----------------------------------------------------------------------------\n\nvar vtkImageResliceMapper = {\n newInstance: newInstance,\n extend: extend\n}; // Register ourself to OpenGL backend if imported\n\nregisterOverride('vtkImageResliceMapper', newInstance);\n\nexport { vtkImageResliceMapper as default, extend, newInstance };\n","var SlicingMode = {\n NONE: -1,\n I: 0,\n J: 1,\n K: 2,\n X: 3,\n Y: 4,\n Z: 5\n};\nvar Constants = {\n SlicingMode: SlicingMode\n};\n\nexport { SlicingMode, Constants as default };\n","var vtkPolyDataVS = \"//VTK::System::Dec\\n\\n/*=========================================================================\\n\\n Program: Visualization Toolkit\\n Module: vtkPolyDataVS.glsl\\n\\n Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen\\n All rights reserved.\\n See Copyright.txt or http://www.kitware.com/Copyright.htm for details.\\n\\n This software is distributed WITHOUT ANY WARRANTY; without even\\n the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR\\n PURPOSE. See the above copyright notice for more information.\\n\\n=========================================================================*/\\n\\nattribute vec4 vertexMC;\\n\\n// frag position in VC\\n//VTK::PositionVC::Dec\\n\\n// optional normal declaration\\n//VTK::Normal::Dec\\n\\n// extra lighting parameters\\n//VTK::Light::Dec\\n\\n// Texture coordinates\\n//VTK::TCoord::Dec\\n\\n// material property values\\n//VTK::Color::Dec\\n\\n// clipping plane vars\\n//VTK::Clip::Dec\\n\\n// camera and actor matrix values\\n//VTK::Camera::Dec\\n\\n// Apple Bug\\n//VTK::PrimID::Dec\\n\\n// picking support\\n//VTK::Picking::Dec\\n\\nvoid main()\\n{\\n //VTK::Color::Impl\\n\\n //VTK::Normal::Impl\\n\\n //VTK::TCoord::Impl\\n\\n //VTK::Clip::Impl\\n\\n //VTK::PrimID::Impl\\n\\n //VTK::PositionVC::Impl\\n\\n //VTK::Light::Impl\\n\\n //VTK::Picking::Impl\\n}\\n\";\n\nexport { vtkPolyDataVS as v };\n","var vtkPolyDataFS = \"//VTK::System::Dec\\n\\n/*=========================================================================\\n\\n Program: Visualization Toolkit\\n Module: vtkPolyDataFS.glsl\\n\\n Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen\\n All rights reserved.\\n See Copyright.txt or http://www.kitware.com/Copyright.htm for details.\\n\\n This software is distributed WITHOUT ANY WARRANTY; without even\\n the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR\\n PURPOSE. See the above copyright notice for more information.\\n\\n=========================================================================*/\\n// Template for the polydata mappers fragment shader\\n\\nuniform int PrimitiveIDOffset;\\n\\n// VC position of this fragment\\n//VTK::PositionVC::Dec\\n\\n// optional color passed in from the vertex shader, vertexColor\\n//VTK::Color::Dec\\n\\n// optional surface normal declaration\\n//VTK::Normal::Dec\\n\\n// extra lighting parameters\\n//VTK::Light::Dec\\n\\n// Texture coordinates\\n//VTK::TCoord::Dec\\n\\n// picking support\\n//VTK::Picking::Dec\\n\\n// Depth Peeling Support\\n//VTK::DepthPeeling::Dec\\n\\n// clipping plane vars\\n//VTK::Clip::Dec\\n\\n// the output of this shader\\n//VTK::Output::Dec\\n\\n// Apple Bug\\n//VTK::PrimID::Dec\\n\\n// handle coincident offsets\\n//VTK::Coincident::Dec\\n\\n//VTK::ZBuffer::Dec\\n\\nvoid main()\\n{\\n // VC position of this fragment. This should not branch/return/discard.\\n //VTK::PositionVC::Impl\\n\\n // Place any calls that require uniform flow (e.g. dFdx) here.\\n //VTK::UniformFlow::Impl\\n\\n // Set gl_FragDepth here (gl_FragCoord.z by default)\\n //VTK::Depth::Impl\\n\\n // Early depth peeling abort:\\n //VTK::DepthPeeling::PreColor\\n\\n // Apple Bug\\n //VTK::PrimID::Impl\\n\\n //VTK::Clip::Impl\\n\\n //VTK::Color::Impl\\n\\n // Generate the normal if we are not passed in one\\n //VTK::Normal::Impl\\n\\n //VTK::TCoord::Impl\\n\\n //VTK::Light::Impl\\n\\n if (gl_FragData[0].a <= 0.0)\\n {\\n discard;\\n }\\n\\n //VTK::DepthPeeling::Impl\\n\\n //VTK::Picking::Impl\\n\\n // handle coincident offsets\\n //VTK::Coincident::Impl\\n\\n //VTK::ZBuffer::Impl\\n\\n //VTK::RenderPassFragmentShader::Impl\\n}\\n\";\n\nexport { vtkPolyDataFS as v };\n","import { mat4 } from 'gl-matrix';\nimport Constants from '../Core/ImageMapper/Constants.js';\nimport { newInstance as newInstance$1, setGet, obj, vtkErrorMacro as vtkErrorMacro$1 } from '../../macros.js';\nimport vtkDataArray from '../../Common/Core/DataArray.js';\nimport { VtkDataTypes } from '../../Common/Core/DataArray/Constants.js';\nimport vtkHelper from './Helper.js';\nimport { u as uninitializeBounds } from '../../Common/Core/Math/index.js';\nimport vtkOpenGLTexture from './Texture.js';\nimport vtkShaderProgram from './ShaderProgram.js';\nimport vtkViewNode from '../SceneGraph/ViewNode.js';\nimport { Representation } from '../Core/Property/Constants.js';\nimport { Filter, Wrap } from './Texture/Constants.js';\nimport { InterpolationType } from '../Core/ImageProperty/Constants.js';\nimport { v as vtkPolyDataVS } from './glsl/vtkPolyDataVS.glsl.js';\nimport { v as vtkPolyDataFS } from './glsl/vtkPolyDataFS.glsl.js';\nimport vtkReplacementShaderMapper from './ReplacementShaderMapper.js';\nimport { registerOverride } from './ViewNodeFactory.js';\n\nvar vtkErrorMacro = vtkErrorMacro$1;\nvar SlicingMode = Constants.SlicingMode; // ----------------------------------------------------------------------------\n// helper methods\n// ----------------------------------------------------------------------------\n\nfunction computeFnToString(property, fn, numberOfComponents) {\n var pwfun = fn.apply(property);\n\n if (pwfun) {\n var iComps = property.getIndependentComponents();\n return \"\".concat(property.getMTime(), \"-\").concat(iComps, \"-\").concat(numberOfComponents);\n }\n\n return '0';\n} // ----------------------------------------------------------------------------\n// vtkOpenGLImageMapper methods\n// ----------------------------------------------------------------------------\n\n\nfunction vtkOpenGLImageMapper(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkOpenGLImageMapper');\n\n publicAPI.buildPass = function (prepass) {\n if (prepass) {\n model.currentRenderPass = null;\n model.openGLImageSlice = publicAPI.getFirstAncestorOfType('vtkOpenGLImageSlice');\n model._openGLRenderer = publicAPI.getFirstAncestorOfType('vtkOpenGLRenderer');\n model._openGLRenderWindow = model._openGLRenderer.getParent();\n model.context = model._openGLRenderWindow.getContext();\n model.tris.setOpenGLRenderWindow(model._openGLRenderWindow);\n model.openGLTexture.setOpenGLRenderWindow(model._openGLRenderWindow);\n model.colorTexture.setOpenGLRenderWindow(model._openGLRenderWindow);\n model.pwfTexture.setOpenGLRenderWindow(model._openGLRenderWindow);\n\n var ren = model._openGLRenderer.getRenderable();\n\n model.openGLCamera = model._openGLRenderer.getViewNodeFor(ren.getActiveCamera()); // is slice set by the camera\n\n if (model.renderable.isA('vtkImageMapper') && model.renderable.getSliceAtFocalPoint()) {\n model.renderable.setSliceFromCamera(ren.getActiveCamera());\n }\n }\n };\n\n publicAPI.translucentPass = function (prepass, renderPass) {\n if (prepass) {\n model.currentRenderPass = renderPass;\n publicAPI.render();\n }\n };\n\n publicAPI.zBufferPass = function (prepass) {\n if (prepass) {\n model.haveSeenDepthRequest = true;\n model.renderDepth = true;\n publicAPI.render();\n model.renderDepth = false;\n }\n };\n\n publicAPI.opaqueZBufferPass = function (prepass) {\n return publicAPI.zBufferPass(prepass);\n };\n\n publicAPI.opaquePass = function (prepass) {\n if (prepass) {\n publicAPI.render();\n }\n };\n\n publicAPI.getCoincidentParameters = function (ren, actor) {\n if (model.renderable.getResolveCoincidentTopology()) {\n return model.renderable.getCoincidentTopologyPolygonOffsetParameters();\n }\n\n return null;\n }; // Renders myself\n\n\n publicAPI.render = function () {\n var actor = model.openGLImageSlice.getRenderable();\n\n var ren = model._openGLRenderer.getRenderable();\n\n publicAPI.renderPiece(ren, actor);\n };\n\n publicAPI.getShaderTemplate = function (shaders, ren, actor) {\n shaders.Vertex = vtkPolyDataVS;\n shaders.Fragment = vtkPolyDataFS;\n shaders.Geometry = '';\n };\n\n publicAPI.replaceShaderValues = function (shaders, ren, actor) {\n var VSSource = shaders.Vertex;\n var FSSource = shaders.Fragment;\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::Camera::Dec', ['uniform mat4 MCPCMatrix;']).result;\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::PositionVC::Impl', [' gl_Position = MCPCMatrix * vertexMC;']).result;\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::TCoord::Impl', 'tcoordVCVSOutput = tcoordMC;').result;\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::TCoord::Dec', 'attribute vec2 tcoordMC; varying vec2 tcoordVCVSOutput;').result;\n var tNumComp = model.openGLTexture.getComponents();\n var iComps = actor.getProperty().getIndependentComponents();\n var tcoordDec = ['varying vec2 tcoordVCVSOutput;', // color shift and scale\n 'uniform float cshift0;', 'uniform float cscale0;', // pwf shift and scale\n 'uniform float pwfshift0;', 'uniform float pwfscale0;', 'uniform sampler2D texture1;', 'uniform sampler2D colorTexture1;', 'uniform sampler2D pwfTexture1;', 'uniform float opacity;'];\n\n if (iComps) {\n for (var comp = 1; comp < tNumComp; comp++) {\n tcoordDec = tcoordDec.concat([// color shift and scale\n \"uniform float cshift\".concat(comp, \";\"), \"uniform float cscale\".concat(comp, \";\"), // weighting shift and scale\n \"uniform float pwfshift\".concat(comp, \";\"), \"uniform float pwfscale\".concat(comp, \";\")]);\n } // the heights defined below are the locations\n // for the up to four components of the tfuns\n // the tfuns have a height of 2XnumComps pixels so the\n // values are computed to hit the middle of the two rows\n // for that component\n\n\n switch (tNumComp) {\n case 1:\n tcoordDec = tcoordDec.concat(['uniform float mix0;', '#define height0 0.5']);\n break;\n\n case 2:\n tcoordDec = tcoordDec.concat(['uniform float mix0;', 'uniform float mix1;', '#define height0 0.25', '#define height1 0.75']);\n break;\n\n case 3:\n tcoordDec = tcoordDec.concat(['uniform float mix0;', 'uniform float mix1;', 'uniform float mix2;', '#define height0 0.17', '#define height1 0.5', '#define height2 0.83']);\n break;\n\n case 4:\n tcoordDec = tcoordDec.concat(['uniform float mix0;', 'uniform float mix1;', 'uniform float mix2;', 'uniform float mix3;', '#define height0 0.125', '#define height1 0.375', '#define height2 0.625', '#define height3 0.875']);\n break;\n\n default:\n vtkErrorMacro('Unsupported number of independent coordinates.');\n }\n }\n\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::TCoord::Dec', tcoordDec).result;\n\n if (iComps) {\n var rgba = ['r', 'g', 'b', 'a'];\n var tcoordImpl = ['vec4 tvalue = texture2D(texture1, tcoordVCVSOutput);'];\n\n for (var _comp = 0; _comp < tNumComp; _comp++) {\n tcoordImpl = tcoordImpl.concat([\"vec3 tcolor\".concat(_comp, \" = mix\").concat(_comp, \" * texture2D(colorTexture1, vec2(tvalue.\").concat(rgba[_comp], \" * cscale\").concat(_comp, \" + cshift\").concat(_comp, \", height\").concat(_comp, \")).rgb;\"), \"float compWeight\".concat(_comp, \" = mix\").concat(_comp, \" * texture2D(pwfTexture1, vec2(tvalue.\").concat(rgba[_comp], \" * pwfscale\").concat(_comp, \" + pwfshift\").concat(_comp, \", height\").concat(_comp, \")).r;\")]);\n }\n\n switch (tNumComp) {\n case 1:\n tcoordImpl = tcoordImpl.concat(['gl_FragData[0] = vec4(tcolor0.rgb, opacity);']);\n break;\n\n case 2:\n tcoordImpl = tcoordImpl.concat(['float weightSum = compWeight0 + compWeight1;', 'gl_FragData[0] = vec4(vec3((tcolor0.rgb * (compWeight0 / weightSum)) + (tcolor1.rgb * (compWeight1 / weightSum))), opacity);']);\n break;\n\n case 3:\n tcoordImpl = tcoordImpl.concat(['float weightSum = compWeight0 + compWeight1 + compWeight2;', 'gl_FragData[0] = vec4(vec3((tcolor0.rgb * (compWeight0 / weightSum)) + (tcolor1.rgb * (compWeight1 / weightSum)) + (tcolor2.rgb * (compWeight2 / weightSum))), opacity);']);\n break;\n\n case 4:\n tcoordImpl = tcoordImpl.concat(['float weightSum = compWeight0 + compWeight1 + compWeight2 + compWeight3;', 'gl_FragData[0] = vec4(vec3((tcolor0.rgb * (compWeight0 / weightSum)) + (tcolor1.rgb * (compWeight1 / weightSum)) + (tcolor2.rgb * (compWeight2 / weightSum)) + (tcolor3.rgb * (compWeight3 / weightSum))), opacity);']);\n break;\n\n default:\n vtkErrorMacro('Unsupported number of independent coordinates.');\n }\n\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::TCoord::Impl', tcoordImpl).result;\n } else {\n // dependent components\n switch (tNumComp) {\n case 1:\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::TCoord::Impl', ['float intensity = texture2D(texture1, tcoordVCVSOutput).r;', 'vec3 tcolor = texture2D(colorTexture1, vec2(intensity * cscale0 + cshift0, 0.5)).rgb;', 'float scalarOpacity = texture2D(pwfTexture1, vec2(intensity * pwfscale0 + pwfshift0, 0.5)).r;', 'gl_FragData[0] = vec4(tcolor, scalarOpacity * opacity);']).result;\n break;\n\n case 2:\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::TCoord::Impl', ['vec4 tcolor = texture2D(texture1, tcoordVCVSOutput);', 'float intensity = tcolor.r*cscale0 + cshift0;', 'gl_FragData[0] = vec4(texture2D(colorTexture1, vec2(intensity, 0.5)).rgb, pwfscale0*tcolor.g + pwfshift0);']).result;\n break;\n\n case 3:\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::TCoord::Impl', ['vec4 tcolor = cscale0*texture2D(texture1, tcoordVCVSOutput.st) + cshift0;', 'gl_FragData[0] = vec4(texture2D(colorTexture1, vec2(tcolor.r,0.5)).r,', ' texture2D(colorTexture1, vec2(tcolor.g,0.5)).r,', ' texture2D(colorTexture1, vec2(tcolor.b,0.5)).r, opacity);']).result;\n break;\n\n default:\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::TCoord::Impl', ['vec4 tcolor = cscale0*texture2D(texture1, tcoordVCVSOutput.st) + cshift0;', 'gl_FragData[0] = vec4(texture2D(colorTexture1, vec2(tcolor.r,0.5)).r,', ' texture2D(colorTexture1, vec2(tcolor.g,0.5)).r,', ' texture2D(colorTexture1, vec2(tcolor.b,0.5)).r, tcolor.a);']).result;\n }\n }\n\n if (model.haveSeenDepthRequest) {\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::ZBuffer::Dec', 'uniform int depthRequest;').result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::ZBuffer::Impl', ['if (depthRequest == 1) {', 'float iz = floor(gl_FragCoord.z*65535.0 + 0.1);', 'float rf = floor(iz/256.0)/255.0;', 'float gf = mod(iz,256.0)/255.0;', 'gl_FragData[0] = vec4(rf, gf, 0.0, 1.0); }']).result;\n }\n\n shaders.Vertex = VSSource;\n shaders.Fragment = FSSource;\n publicAPI.replaceShaderClip(shaders, ren, actor);\n publicAPI.replaceShaderCoincidentOffset(shaders, ren, actor);\n };\n\n publicAPI.replaceShaderClip = function (shaders, ren, actor) {\n var VSSource = shaders.Vertex;\n var FSSource = shaders.Fragment;\n\n if (model.renderable.getNumberOfClippingPlanes()) {\n var numClipPlanes = model.renderable.getNumberOfClippingPlanes();\n\n if (numClipPlanes > 6) {\n vtkErrorMacro$1('OpenGL has a limit of 6 clipping planes');\n numClipPlanes = 6;\n }\n\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::Clip::Dec', ['uniform int numClipPlanes;', 'uniform vec4 clipPlanes[6];', 'varying float clipDistancesVSOutput[6];']).result;\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::Clip::Impl', ['for (int planeNum = 0; planeNum < 6; planeNum++)', ' {', ' if (planeNum >= numClipPlanes)', ' {', ' break;', ' }', ' clipDistancesVSOutput[planeNum] = dot(clipPlanes[planeNum], vertexMC);', ' }']).result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Clip::Dec', ['uniform int numClipPlanes;', 'varying float clipDistancesVSOutput[6];']).result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Clip::Impl', ['for (int planeNum = 0; planeNum < 6; planeNum++)', ' {', ' if (planeNum >= numClipPlanes)', ' {', ' break;', ' }', ' if (clipDistancesVSOutput[planeNum] < 0.0) discard;', ' }']).result;\n }\n\n shaders.Vertex = VSSource;\n shaders.Fragment = FSSource;\n };\n\n publicAPI.getNeedToRebuildShaders = function (cellBO, ren, actor) {\n // has something changed that would require us to recreate the shader?\n // candidates are\n // property modified (representation interpolation and lighting)\n // input modified\n // light complexity changed\n // render pass shader replacement changed\n var tNumComp = model.openGLTexture.getComponents();\n var iComp = actor.getProperty().getIndependentComponents(); // has the render pass shader replacement changed? Two options\n\n var needRebuild = false;\n\n if (!model.currentRenderPass && model.lastRenderPassShaderReplacement || model.currentRenderPass && model.currentRenderPass.getShaderReplacement() !== model.lastRenderPassShaderReplacement) {\n needRebuild = true;\n }\n\n if (needRebuild || model.lastHaveSeenDepthRequest !== model.haveSeenDepthRequest || cellBO.getProgram() === 0 || model.lastTextureComponents !== tNumComp || model.lastIndependentComponents !== iComp) {\n model.lastHaveSeenDepthRequest = model.haveSeenDepthRequest;\n model.lastTextureComponents = tNumComp;\n model.lastIndependentComponents = iComp;\n return true;\n }\n\n return false;\n };\n\n publicAPI.updateShaders = function (cellBO, ren, actor) {\n model.lastBoundBO = cellBO; // has something changed that would require us to recreate the shader?\n\n if (publicAPI.getNeedToRebuildShaders(cellBO, ren, actor)) {\n var shaders = {\n Vertex: null,\n Fragment: null,\n Geometry: null\n };\n publicAPI.buildShaders(shaders, ren, actor); // compile and bind the program if needed\n\n var newShader = model._openGLRenderWindow.getShaderCache().readyShaderProgramArray(shaders.Vertex, shaders.Fragment, shaders.Geometry); // if the shader changed reinitialize the VAO\n\n\n if (newShader !== cellBO.getProgram()) {\n cellBO.setProgram(newShader); // reset the VAO as the shader has changed\n\n cellBO.getVAO().releaseGraphicsResources();\n }\n\n cellBO.getShaderSourceTime().modified();\n } else {\n model._openGLRenderWindow.getShaderCache().readyShaderProgram(cellBO.getProgram());\n }\n\n cellBO.getVAO().bind();\n publicAPI.setMapperShaderParameters(cellBO, ren, actor);\n publicAPI.setCameraShaderParameters(cellBO, ren, actor);\n publicAPI.setPropertyShaderParameters(cellBO, ren, actor);\n };\n\n publicAPI.setMapperShaderParameters = function (cellBO, ren, actor) {\n // Now to update the VAO too, if necessary.\n if (cellBO.getCABO().getElementCount() && (model.VBOBuildTime > cellBO.getAttributeUpdateTime().getMTime() || cellBO.getShaderSourceTime().getMTime() > cellBO.getAttributeUpdateTime().getMTime())) {\n if (cellBO.getProgram().isAttributeUsed('vertexMC')) {\n if (!cellBO.getVAO().addAttributeArray(cellBO.getProgram(), cellBO.getCABO(), 'vertexMC', cellBO.getCABO().getVertexOffset(), cellBO.getCABO().getStride(), model.context.FLOAT, 3, model.context.FALSE)) {\n vtkErrorMacro('Error setting vertexMC in shader VAO.');\n }\n }\n\n if (cellBO.getProgram().isAttributeUsed('tcoordMC') && cellBO.getCABO().getTCoordOffset()) {\n if (!cellBO.getVAO().addAttributeArray(cellBO.getProgram(), cellBO.getCABO(), 'tcoordMC', cellBO.getCABO().getTCoordOffset(), cellBO.getCABO().getStride(), model.context.FLOAT, cellBO.getCABO().getTCoordComponents(), model.context.FALSE)) {\n vtkErrorMacro('Error setting tcoordMC in shader VAO.');\n }\n }\n\n cellBO.getAttributeUpdateTime().modified();\n }\n\n var texUnit = model.openGLTexture.getTextureUnit();\n cellBO.getProgram().setUniformi('texture1', texUnit);\n var numComp = model.openGLTexture.getComponents();\n var iComps = actor.getProperty().getIndependentComponents();\n\n if (iComps) {\n for (var i = 0; i < numComp; i++) {\n cellBO.getProgram().setUniformf(\"mix\".concat(i), actor.getProperty().getComponentWeight(i));\n }\n }\n\n var oglShiftScale = model.openGLTexture.getShiftAndScale(); // three levels of shift scale combined into one\n // for performance in the fragment shader\n\n for (var _i = 0; _i < numComp; _i++) {\n var cw = actor.getProperty().getColorWindow();\n var cl = actor.getProperty().getColorLevel();\n var target = iComps ? _i : 0;\n var cfun = actor.getProperty().getRGBTransferFunction(target);\n\n if (cfun && actor.getProperty().getUseLookupTableScalarRange()) {\n var cRange = cfun.getRange();\n cw = cRange[1] - cRange[0];\n cl = 0.5 * (cRange[1] + cRange[0]);\n }\n\n var scale = oglShiftScale.scale / cw;\n var shift = (oglShiftScale.shift - cl) / cw + 0.5;\n cellBO.getProgram().setUniformf(\"cshift\".concat(_i), shift);\n cellBO.getProgram().setUniformf(\"cscale\".concat(_i), scale);\n } // pwf shift/scale\n\n\n for (var _i2 = 0; _i2 < numComp; _i2++) {\n var pwfScale = 1.0;\n var pwfShift = 0.0;\n\n var _target = iComps ? _i2 : 0;\n\n var pwfun = actor.getProperty().getPiecewiseFunction(_target);\n\n if (pwfun) {\n var pwfRange = pwfun.getRange();\n var length = pwfRange[1] - pwfRange[0];\n var mid = 0.5 * (pwfRange[0] + pwfRange[1]);\n pwfScale = oglShiftScale.scale / length;\n pwfShift = (oglShiftScale.shift - mid) / length + 0.5;\n }\n\n cellBO.getProgram().setUniformf(\"pwfshift\".concat(_i2), pwfShift);\n cellBO.getProgram().setUniformf(\"pwfscale\".concat(_i2), pwfScale);\n }\n\n if (model.haveSeenDepthRequest) {\n cellBO.getProgram().setUniformi('depthRequest', model.renderDepth ? 1 : 0);\n } // handle coincident\n\n\n if (cellBO.getProgram().isUniformUsed('coffset')) {\n var cp = publicAPI.getCoincidentParameters(ren, actor);\n cellBO.getProgram().setUniformf('coffset', cp.offset); // cfactor isn't always used when coffset is.\n\n if (cellBO.getProgram().isUniformUsed('cfactor')) {\n cellBO.getProgram().setUniformf('cfactor', cp.factor);\n }\n }\n\n var texColorUnit = model.colorTexture.getTextureUnit();\n cellBO.getProgram().setUniformi('colorTexture1', texColorUnit);\n var texOpacityUnit = model.pwfTexture.getTextureUnit();\n cellBO.getProgram().setUniformi('pwfTexture1', texOpacityUnit);\n\n if (model.renderable.getNumberOfClippingPlanes()) {\n // add all the clipping planes\n var numClipPlanes = model.renderable.getNumberOfClippingPlanes();\n\n if (numClipPlanes > 6) {\n vtkErrorMacro$1('OpenGL has a limit of 6 clipping planes');\n numClipPlanes = 6;\n }\n\n var shiftScaleEnabled = cellBO.getCABO().getCoordShiftAndScaleEnabled();\n var inverseShiftScaleMatrix = shiftScaleEnabled ? cellBO.getCABO().getInverseShiftAndScaleMatrix() : null;\n var mat = inverseShiftScaleMatrix ? mat4.copy(model.imagematinv, actor.getMatrix()) : actor.getMatrix();\n\n if (inverseShiftScaleMatrix) {\n mat4.transpose(mat, mat);\n mat4.multiply(mat, mat, inverseShiftScaleMatrix);\n mat4.transpose(mat, mat);\n } // transform crop plane normal with transpose(inverse(worldToIndex))\n\n\n mat4.transpose(model.imagemat, model.currentInput.getIndexToWorld());\n mat4.multiply(model.imagematinv, mat, model.imagemat);\n var planeEquations = [];\n\n for (var _i3 = 0; _i3 < numClipPlanes; _i3++) {\n var planeEquation = [];\n model.renderable.getClippingPlaneInDataCoords(model.imagematinv, _i3, planeEquation);\n\n for (var j = 0; j < 4; j++) {\n planeEquations.push(planeEquation[j]);\n }\n }\n\n cellBO.getProgram().setUniformi('numClipPlanes', numClipPlanes);\n cellBO.getProgram().setUniform4fv('clipPlanes', planeEquations);\n }\n };\n\n publicAPI.setCameraShaderParameters = function (cellBO, ren, actor) {\n var program = cellBO.getProgram();\n var actMats = model.openGLImageSlice.getKeyMatrices();\n var image = model.currentInput;\n var i2wmat4 = image.getIndexToWorld();\n mat4.multiply(model.imagemat, actMats.mcwc, i2wmat4);\n var keyMats = model.openGLCamera.getKeyMatrices(ren);\n mat4.multiply(model.imagemat, keyMats.wcpc, model.imagemat);\n\n if (cellBO.getCABO().getCoordShiftAndScaleEnabled()) {\n var inverseShiftScaleMat = cellBO.getCABO().getInverseShiftAndScaleMatrix();\n mat4.multiply(model.imagemat, model.imagemat, inverseShiftScaleMat);\n }\n\n program.setUniformMatrix('MCPCMatrix', model.imagemat);\n };\n\n publicAPI.setPropertyShaderParameters = function (cellBO, ren, actor) {\n var program = cellBO.getProgram();\n var ppty = actor.getProperty();\n var opacity = ppty.getOpacity();\n program.setUniformf('opacity', opacity);\n };\n\n publicAPI.renderPieceStart = function (ren, actor) {\n // make sure the BOs are up to date\n publicAPI.updateBufferObjects(ren, actor); // Bind the OpenGL, this is shared between the different primitive/cell types.\n\n model.lastBoundBO = null;\n };\n\n publicAPI.renderPieceDraw = function (ren, actor) {\n var gl = model.context; // activate the texture\n\n model.openGLTexture.activate();\n model.colorTexture.activate();\n model.pwfTexture.activate(); // draw polygons\n\n if (model.tris.getCABO().getElementCount()) {\n // First we do the triangles, update the shader, set uniforms, etc.\n publicAPI.updateShaders(model.tris, ren, actor);\n gl.drawArrays(gl.TRIANGLES, 0, model.tris.getCABO().getElementCount());\n model.tris.getVAO().release();\n }\n\n model.openGLTexture.deactivate();\n model.colorTexture.deactivate();\n model.pwfTexture.deactivate();\n };\n\n publicAPI.renderPieceFinish = function (ren, actor) {};\n\n publicAPI.renderPiece = function (ren, actor) {\n // Make sure that we have been properly initialized.\n // if (ren.getRenderWindow().checkAbortStatus()) {\n // return;\n // }\n publicAPI.invokeEvent({\n type: 'StartEvent'\n });\n model.renderable.update();\n model.currentInput = model.renderable.getCurrentImage();\n publicAPI.invokeEvent({\n type: 'EndEvent'\n });\n\n if (!model.currentInput) {\n vtkErrorMacro('No input!');\n return;\n }\n\n publicAPI.renderPieceStart(ren, actor);\n publicAPI.renderPieceDraw(ren, actor);\n publicAPI.renderPieceFinish(ren, actor);\n };\n\n publicAPI.computeBounds = function (ren, actor) {\n if (!publicAPI.getInput()) {\n uninitializeBounds(model.bounds);\n return;\n }\n\n model.bounds = publicAPI.getInput().getBounds();\n };\n\n publicAPI.updateBufferObjects = function (ren, actor) {\n // Rebuild buffers if needed\n if (publicAPI.getNeedToRebuildBufferObjects(ren, actor)) {\n publicAPI.buildBufferObjects(ren, actor);\n }\n };\n\n publicAPI.getNeedToRebuildBufferObjects = function (ren, actor) {\n // first do a coarse check\n if (model.VBOBuildTime.getMTime() < publicAPI.getMTime() || model.VBOBuildTime.getMTime() < actor.getMTime() || model.VBOBuildTime.getMTime() < model.renderable.getMTime() || model.VBOBuildTime.getMTime() < actor.getProperty().getMTime() || model.VBOBuildTime.getMTime() < model.currentInput.getMTime()) {\n return true;\n }\n\n return false;\n };\n\n publicAPI.buildBufferObjects = function (ren, actor) {\n var image = model.currentInput;\n\n if (!image) {\n return;\n }\n\n var imgScalars = image.getPointData() && image.getPointData().getScalars();\n\n if (!imgScalars) {\n return;\n }\n\n var dataType = imgScalars.getDataType();\n var numComp = imgScalars.getNumberOfComponents();\n var actorProperty = actor.getProperty(); // set interpolation on the texture based on property setting\n\n var iType = actorProperty.getInterpolationType();\n\n if (iType === InterpolationType.NEAREST) {\n model.colorTexture.setMinificationFilter(Filter.NEAREST);\n model.colorTexture.setMagnificationFilter(Filter.NEAREST);\n model.pwfTexture.setMinificationFilter(Filter.NEAREST);\n model.pwfTexture.setMagnificationFilter(Filter.NEAREST);\n } else {\n model.colorTexture.setMinificationFilter(Filter.LINEAR);\n model.colorTexture.setMagnificationFilter(Filter.LINEAR);\n model.pwfTexture.setMinificationFilter(Filter.LINEAR);\n model.pwfTexture.setMagnificationFilter(Filter.LINEAR);\n }\n\n var iComps = actorProperty.getIndependentComponents();\n var numIComps = iComps ? numComp : 1;\n var textureHeight = iComps ? 2 * numIComps : 1;\n var cfunToString = computeFnToString(actorProperty, actorProperty.getRGBTransferFunction, numIComps);\n\n if (model.colorTextureString !== cfunToString) {\n var cWidth = 1024;\n var cSize = cWidth * textureHeight * 3;\n var cTable = new Uint8Array(cSize);\n var cfun = actorProperty.getRGBTransferFunction();\n\n if (cfun) {\n var tmpTable = new Float32Array(cWidth * 3);\n\n for (var c = 0; c < numIComps; c++) {\n cfun = actorProperty.getRGBTransferFunction(c);\n var cRange = cfun.getRange();\n cfun.getTable(cRange[0], cRange[1], cWidth, tmpTable, 1);\n\n if (iComps) {\n for (var i = 0; i < cWidth * 3; i++) {\n cTable[c * cWidth * 6 + i] = 255.0 * tmpTable[i];\n cTable[c * cWidth * 6 + i + cWidth * 3] = 255.0 * tmpTable[i];\n }\n } else {\n for (var _i4 = 0; _i4 < cWidth * 3; _i4++) {\n cTable[c * cWidth * 6 + _i4] = 255.0 * tmpTable[_i4];\n }\n }\n }\n\n model.colorTexture.create2DFromRaw(cWidth, textureHeight, 3, VtkDataTypes.UNSIGNED_CHAR, cTable);\n } else {\n for (var _i5 = 0; _i5 < cWidth * 3; ++_i5) {\n cTable[_i5] = 255.0 * _i5 / ((cWidth - 1) * 3);\n cTable[_i5 + 1] = 255.0 * _i5 / ((cWidth - 1) * 3);\n cTable[_i5 + 2] = 255.0 * _i5 / ((cWidth - 1) * 3);\n }\n\n model.colorTexture.create2DFromRaw(cWidth, 1, 3, VtkDataTypes.UNSIGNED_CHAR, cTable);\n }\n\n model.colorTextureString = cfunToString;\n } // Build piecewise function buffer. This buffer is used either\n // for component weighting or opacity, depending on whether we're\n // rendering components independently or not.\n\n\n var pwfunToString = computeFnToString(actorProperty, actorProperty.getPiecewiseFunction, numIComps);\n\n if (model.pwfTextureString !== pwfunToString) {\n var pwfWidth = 1024;\n var pwfSize = pwfWidth * textureHeight;\n var pwfTable = new Uint8Array(pwfSize);\n var pwfun = actorProperty.getPiecewiseFunction(); // support case where pwfun is added/removed\n\n model.pwfTexture.resetFormatAndType();\n\n if (pwfun) {\n var pwfFloatTable = new Float32Array(pwfSize);\n\n var _tmpTable = new Float32Array(pwfWidth);\n\n for (var _c = 0; _c < numIComps; ++_c) {\n pwfun = actorProperty.getPiecewiseFunction(_c);\n\n if (pwfun === null) {\n // Piecewise constant max if no function supplied for this component\n pwfFloatTable.fill(1.0);\n } else {\n var pwfRange = pwfun.getRange();\n pwfun.getTable(pwfRange[0], pwfRange[1], pwfWidth, _tmpTable, 1); // adjust for sample distance etc\n\n if (iComps) {\n for (var _i6 = 0; _i6 < pwfWidth; _i6++) {\n pwfFloatTable[_c * pwfWidth * 2 + _i6] = _tmpTable[_i6];\n pwfFloatTable[_c * pwfWidth * 2 + _i6 + pwfWidth] = _tmpTable[_i6];\n }\n } else {\n for (var _i7 = 0; _i7 < pwfWidth; _i7++) {\n pwfFloatTable[_c * pwfWidth * 2 + _i7] = _tmpTable[_i7];\n }\n }\n }\n }\n\n model.pwfTexture.create2DFromRaw(pwfWidth, textureHeight, 1, VtkDataTypes.FLOAT, pwfFloatTable);\n } else {\n // default is opaque\n pwfTable.fill(255.0);\n model.pwfTexture.create2DFromRaw(pwfWidth, 1, 1, VtkDataTypes.UNSIGNED_CHAR, pwfTable);\n }\n\n model.pwfTextureString = pwfunToString;\n } // Find what IJK axis and what direction to slice along\n\n\n var _model$renderable$get = model.renderable.getClosestIJKAxis(),\n ijkMode = _model$renderable$get.ijkMode; // Find the IJK slice\n\n\n var slice = model.renderable.getSlice();\n\n if (ijkMode !== model.renderable.getSlicingMode()) {\n // If not IJK slicing, get the IJK slice from the XYZ position/slice\n slice = model.renderable.getSliceAtPosition(slice);\n } // Use sub-Slice number/offset if mapper being used is vtkImageArrayMapper,\n // since this mapper uses a collection of vtkImageData (and not just a single vtkImageData).\n\n\n var nSlice = model.renderable.isA('vtkImageArrayMapper') ? model.renderable.getSubSlice() // get subSlice of the current (possibly multi-frame) image\n : Math.round(slice); // Find sliceOffset\n\n var ext = image.getExtent();\n var sliceOffset;\n\n if (ijkMode === SlicingMode.I) {\n sliceOffset = nSlice - ext[0];\n }\n\n if (ijkMode === SlicingMode.J) {\n sliceOffset = nSlice - ext[2];\n }\n\n if (ijkMode === SlicingMode.K || ijkMode === SlicingMode.NONE) {\n sliceOffset = nSlice - ext[4];\n } // rebuild the VBO if the data has changed\n\n\n var toString = \"\".concat(slice, \"A\").concat(image.getMTime(), \"A\").concat(imgScalars.getMTime(), \"B\").concat(publicAPI.getMTime(), \"C\").concat(model.renderable.getSlicingMode(), \"D\").concat(actor.getProperty().getInterpolationType());\n\n if (model.VBOBuildString !== toString) {\n var _model$renderable$get2, _model$renderable;\n\n // Build the VBOs\n var dims = image.getDimensions();\n\n if (iType === InterpolationType.NEAREST) {\n if (new Set([1, 3, 4]).has(numComp) && dataType === VtkDataTypes.UNSIGNED_CHAR && !iComps) {\n model.openGLTexture.setGenerateMipmap(true);\n model.openGLTexture.setMinificationFilter(Filter.NEAREST);\n } else {\n model.openGLTexture.setMinificationFilter(Filter.NEAREST);\n }\n\n model.openGLTexture.setMagnificationFilter(Filter.NEAREST);\n } else {\n if (numComp === 4 && dataType === VtkDataTypes.UNSIGNED_CHAR && !iComps) {\n model.openGLTexture.setGenerateMipmap(true);\n model.openGLTexture.setMinificationFilter(Filter.LINEAR_MIPMAP_LINEAR);\n } else {\n model.openGLTexture.setMinificationFilter(Filter.LINEAR);\n }\n\n model.openGLTexture.setMagnificationFilter(Filter.LINEAR);\n }\n\n model.openGLTexture.setWrapS(Wrap.CLAMP_TO_EDGE);\n model.openGLTexture.setWrapT(Wrap.CLAMP_TO_EDGE);\n var sliceSize = dims[0] * dims[1] * numComp;\n var ptsArray = new Float32Array(12);\n var tcoordArray = new Float32Array(8);\n\n for (var _i8 = 0; _i8 < 4; _i8++) {\n tcoordArray[_i8 * 2] = _i8 % 2 ? 1.0 : 0.0;\n tcoordArray[_i8 * 2 + 1] = _i8 > 1 ? 1.0 : 0.0;\n } // Determine depth position of the slicing plane in the scene.\n // Slicing modes X, Y, and Z use a continuous axis position, whereas\n // slicing modes I, J, and K should use discrete positions.\n\n\n var sliceDepth = [SlicingMode.X, SlicingMode.Y, SlicingMode.Z].includes(model.renderable.getSlicingMode()) ? slice : nSlice;\n var spatialExt = image.getSpatialExtent();\n var basicScalars = imgScalars.getData();\n var scalars = null; // Get right scalars according to slicing mode\n\n if (ijkMode === SlicingMode.I) {\n scalars = new basicScalars.constructor(dims[2] * dims[1] * numComp);\n var id = 0;\n\n for (var k = 0; k < dims[2]; k++) {\n for (var j = 0; j < dims[1]; j++) {\n var bsIdx = (sliceOffset + j * dims[0] + k * dims[0] * dims[1]) * numComp;\n id = (k * dims[1] + j) * numComp;\n scalars.set(basicScalars.subarray(bsIdx, bsIdx + numComp), id);\n }\n }\n\n dims[0] = dims[1];\n dims[1] = dims[2];\n ptsArray[0] = sliceDepth;\n ptsArray[1] = spatialExt[2];\n ptsArray[2] = spatialExt[4];\n ptsArray[3] = sliceDepth;\n ptsArray[4] = spatialExt[3];\n ptsArray[5] = spatialExt[4];\n ptsArray[6] = sliceDepth;\n ptsArray[7] = spatialExt[2];\n ptsArray[8] = spatialExt[5];\n ptsArray[9] = sliceDepth;\n ptsArray[10] = spatialExt[3];\n ptsArray[11] = spatialExt[5];\n } else if (ijkMode === SlicingMode.J) {\n scalars = new basicScalars.constructor(dims[2] * dims[0] * numComp);\n var _id = 0;\n\n for (var _k = 0; _k < dims[2]; _k++) {\n for (var _i9 = 0; _i9 < dims[0]; _i9++) {\n var _bsIdx = (_i9 + sliceOffset * dims[0] + _k * dims[0] * dims[1]) * numComp;\n\n _id = (_k * dims[0] + _i9) * numComp;\n scalars.set(basicScalars.subarray(_bsIdx, _bsIdx + numComp), _id);\n }\n }\n\n dims[1] = dims[2];\n ptsArray[0] = spatialExt[0];\n ptsArray[1] = sliceDepth;\n ptsArray[2] = spatialExt[4];\n ptsArray[3] = spatialExt[1];\n ptsArray[4] = sliceDepth;\n ptsArray[5] = spatialExt[4];\n ptsArray[6] = spatialExt[0];\n ptsArray[7] = sliceDepth;\n ptsArray[8] = spatialExt[5];\n ptsArray[9] = spatialExt[1];\n ptsArray[10] = sliceDepth;\n ptsArray[11] = spatialExt[5];\n } else if (ijkMode === SlicingMode.K || ijkMode === SlicingMode.NONE) {\n scalars = basicScalars.subarray(sliceOffset * sliceSize, (sliceOffset + 1) * sliceSize);\n ptsArray[0] = spatialExt[0];\n ptsArray[1] = spatialExt[2];\n ptsArray[2] = sliceDepth;\n ptsArray[3] = spatialExt[1];\n ptsArray[4] = spatialExt[2];\n ptsArray[5] = sliceDepth;\n ptsArray[6] = spatialExt[0];\n ptsArray[7] = spatialExt[3];\n ptsArray[8] = sliceDepth;\n ptsArray[9] = spatialExt[1];\n ptsArray[10] = spatialExt[3];\n ptsArray[11] = sliceDepth;\n } else {\n vtkErrorMacro('Reformat slicing not yet supported.');\n }\n\n model.openGLTexture.create2DFilterableFromRaw(dims[0], dims[1], numComp, imgScalars.getDataType(), scalars, (_model$renderable$get2 = (_model$renderable = model.renderable).getPreferSizeOverAccuracy) === null || _model$renderable$get2 === void 0 ? void 0 : _model$renderable$get2.call(_model$renderable));\n model.openGLTexture.activate();\n model.openGLTexture.sendParameters();\n model.openGLTexture.deactivate();\n var points = vtkDataArray.newInstance({\n numberOfComponents: 3,\n values: ptsArray\n });\n points.setName('points');\n var tcoords = vtkDataArray.newInstance({\n numberOfComponents: 2,\n values: tcoordArray\n });\n tcoords.setName('tcoords');\n var cellArray = new Uint16Array(8);\n cellArray[0] = 3;\n cellArray[1] = 0;\n cellArray[2] = 1;\n cellArray[3] = 3;\n cellArray[4] = 3;\n cellArray[5] = 0;\n cellArray[6] = 3;\n cellArray[7] = 2;\n var cells = vtkDataArray.newInstance({\n numberOfComponents: 1,\n values: cellArray\n });\n model.tris.getCABO().createVBO(cells, 'polys', Representation.SURFACE, {\n points: points,\n tcoords: tcoords,\n cellOffset: 0\n });\n model.VBOBuildTime.modified();\n model.VBOBuildString = toString;\n }\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n VBOBuildTime: 0,\n VBOBuildString: null,\n openGLTexture: null,\n tris: null,\n imagemat: null,\n imagematinv: null,\n colorTexture: null,\n pwfTexture: null,\n lastHaveSeenDepthRequest: false,\n haveSeenDepthRequest: false,\n lastTextureComponents: 0\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkViewNode.extend(publicAPI, model, initialValues);\n vtkReplacementShaderMapper.implementReplaceShaderCoincidentOffset(publicAPI, model, initialValues);\n vtkReplacementShaderMapper.implementBuildShadersWithReplacements(publicAPI, model, initialValues);\n model.tris = vtkHelper.newInstance();\n model.openGLTexture = vtkOpenGLTexture.newInstance({\n resizable: true\n });\n model.colorTexture = vtkOpenGLTexture.newInstance({\n resizable: true\n });\n model.pwfTexture = vtkOpenGLTexture.newInstance({\n resizable: true\n });\n model.imagemat = mat4.identity(new Float64Array(16));\n model.imagematinv = mat4.identity(new Float64Array(16)); // Build VTK API\n\n setGet(publicAPI, model, []);\n model.VBOBuildTime = {};\n obj(model.VBOBuildTime); // Object methods\n\n vtkOpenGLImageMapper(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend, 'vtkOpenGLImageMapper'); // ----------------------------------------------------------------------------\n\nvar vtkImageMapper = {\n newInstance: newInstance,\n extend: extend\n}; // Register ourself to OpenGL backend if imported\n\nregisterOverride('vtkAbstractImageMapper', newInstance);\n\nexport { vtkImageMapper as default, extend, newInstance };\n","import { mat4 } from 'gl-matrix';\nimport { newInstance as newInstance$1, obj, setGet } from '../../macros.js';\nimport vtkViewNode from '../SceneGraph/ViewNode.js';\nimport { registerOverride } from './ViewNodeFactory.js';\n\n// vtkOpenGLImageSlice methods\n// ----------------------------------------------------------------------------\n\nfunction vtkOpenGLImageSlice(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkOpenGLImageSlice'); // Builds myself.\n\n publicAPI.buildPass = function (prepass) {\n if (!model.renderable || !model.renderable.getVisibility()) {\n return;\n }\n\n if (prepass) {\n if (!model.renderable) {\n return;\n }\n\n model._openGLRenderWindow = publicAPI.getFirstAncestorOfType('vtkOpenGLRenderWindow');\n model._openGLRenderer = publicAPI.getFirstAncestorOfType('vtkOpenGLRenderer');\n model.context = model._openGLRenderWindow.getContext();\n publicAPI.prepareNodes();\n publicAPI.addMissingNode(model.renderable.getMapper());\n publicAPI.removeUnusedNodes();\n }\n };\n\n publicAPI.traverseZBufferPass = function (renderPass) {\n if (!model.renderable || !model.renderable.getNestedVisibility() || model._openGLRenderer.getSelector() && !model.renderable.getNestedPickable()) {\n return;\n }\n\n publicAPI.apply(renderPass, true);\n model.children.forEach(function (child) {\n child.traverse(renderPass);\n });\n publicAPI.apply(renderPass, false);\n };\n\n publicAPI.traverseOpaqueZBufferPass = function (renderPass) {\n return publicAPI.traverseOpaquePass(renderPass);\n }; // we draw textures, then mapper, then post pass textures\n\n\n publicAPI.traverseOpaquePass = function (renderPass) {\n if (!model.renderable || !model.renderable.getNestedVisibility() || !model.renderable.getIsOpaque() || model._openGLRenderer.getSelector() && !model.renderable.getNestedPickable()) {\n return;\n }\n\n publicAPI.apply(renderPass, true);\n model.children.forEach(function (child) {\n child.traverse(renderPass);\n });\n publicAPI.apply(renderPass, false);\n }; // we draw textures, then mapper, then post pass textures\n\n\n publicAPI.traverseTranslucentPass = function (renderPass) {\n if (!model.renderable || !model.renderable.getNestedVisibility() || model.renderable.getIsOpaque() || model._openGLRenderer.getSelector() && !model.renderable.getNestedPickable()) {\n return;\n }\n\n publicAPI.apply(renderPass, true);\n model.children.forEach(function (child) {\n child.traverse(renderPass);\n });\n publicAPI.apply(renderPass, false);\n };\n\n publicAPI.queryPass = function (prepass, renderPass) {\n if (prepass) {\n if (!model.renderable || !model.renderable.getVisibility()) {\n return;\n }\n\n if (model.renderable.getIsOpaque()) {\n renderPass.incrementOpaqueActorCount();\n } else {\n renderPass.incrementTranslucentActorCount();\n }\n }\n };\n\n publicAPI.zBufferPass = function (prepass, renderPass) {\n return publicAPI.opaquePass(prepass, renderPass);\n };\n\n publicAPI.opaqueZBufferPass = function (prepass, renderPass) {\n return publicAPI.opaquePass(prepass, renderPass);\n }; // Renders myself\n\n\n publicAPI.opaquePass = function (prepass, renderPass) {\n if (prepass) {\n model.context.depthMask(true);\n }\n }; // Renders myself\n\n\n publicAPI.translucentPass = function (prepass, renderPass) {\n model.context.depthMask(!prepass);\n };\n\n publicAPI.getKeyMatrices = function () {\n // has the actor changed?\n if (model.renderable.getMTime() > model.keyMatrixTime.getMTime()) {\n mat4.copy(model.keyMatrices.mcwc, model.renderable.getMatrix());\n mat4.transpose(model.keyMatrices.mcwc, model.keyMatrices.mcwc);\n model.keyMatrixTime.modified();\n }\n\n return model.keyMatrices;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n context: null,\n keyMatrixTime: null,\n keyMatrices: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkViewNode.extend(publicAPI, model, initialValues);\n model.keyMatrixTime = {};\n obj(model.keyMatrixTime, {\n mtime: 0\n });\n model.keyMatrices = {\n mcwc: mat4.identity(new Float64Array(16))\n }; // Build VTK API\n\n setGet(publicAPI, model, ['context']); // Object methods\n\n vtkOpenGLImageSlice(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend, 'vtkOpenGLImageSlice'); // ----------------------------------------------------------------------------\n\nvar vtkImageSlice = {\n newInstance: newInstance,\n extend: extend\n}; // Register ourself to OpenGL backend if imported\n\nregisterOverride('vtkImageSlice', newInstance);\n\nexport { vtkImageSlice as default, extend, newInstance };\n","import { mat4, mat3 } from 'gl-matrix';\nimport { newInstance as newInstance$1, obj, setGet } from '../../macros.js';\nimport vtkViewNode from '../SceneGraph/ViewNode.js';\nimport { registerOverride } from './ViewNodeFactory.js';\n\n// vtkOpenGLVolume methods\n// ----------------------------------------------------------------------------\n\nfunction vtkOpenGLVolume(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkOpenGLVolume'); // Builds myself.\n\n publicAPI.buildPass = function (prepass) {\n if (!model.renderable || !model.renderable.getVisibility()) {\n return;\n }\n\n if (prepass) {\n model._openGLRenderWindow = publicAPI.getFirstAncestorOfType('vtkOpenGLRenderWindow');\n model._openGLRenderer = publicAPI.getFirstAncestorOfType('vtkOpenGLRenderer');\n model.context = model._openGLRenderWindow.getContext();\n publicAPI.prepareNodes();\n publicAPI.addMissingNode(model.renderable.getMapper());\n publicAPI.removeUnusedNodes();\n }\n };\n\n publicAPI.queryPass = function (prepass, renderPass) {\n if (prepass) {\n if (!model.renderable || !model.renderable.getVisibility()) {\n return;\n }\n\n renderPass.incrementVolumeCount();\n }\n };\n\n publicAPI.traverseVolumePass = function (renderPass) {\n if (!model.renderable || !model.renderable.getNestedVisibility() || model._openGLRenderer.getSelector() && !model.renderable.getNestedPickable()) {\n return;\n }\n\n publicAPI.apply(renderPass, true);\n model.children[0].traverse(renderPass);\n publicAPI.apply(renderPass, false);\n }; // Renders myself\n\n\n publicAPI.volumePass = function (prepass) {\n if (!model.renderable || !model.renderable.getVisibility()) {\n return;\n }\n\n model.context.depthMask(!prepass);\n };\n\n publicAPI.getKeyMatrices = function () {\n // has the actor changed?\n if (model.renderable.getMTime() > model.keyMatrixTime.getMTime()) {\n model.renderable.computeMatrix();\n mat4.copy(model.MCWCMatrix, model.renderable.getMatrix());\n mat4.transpose(model.MCWCMatrix, model.MCWCMatrix);\n\n if (model.renderable.getIsIdentity()) {\n mat3.identity(model.normalMatrix);\n } else {\n mat3.fromMat4(model.normalMatrix, model.MCWCMatrix);\n mat3.invert(model.normalMatrix, model.normalMatrix);\n }\n\n model.keyMatrixTime.modified();\n }\n\n return {\n mcwc: model.MCWCMatrix,\n normalMatrix: model.normalMatrix\n };\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {// context: null,\n // keyMatrixTime: null,\n // normalMatrix: null,\n // MCWCMatrix: null,\n // _openGLRenderWindow: null,\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkViewNode.extend(publicAPI, model, initialValues);\n model.keyMatrixTime = {};\n obj(model.keyMatrixTime, {\n mtime: 0\n }); // always set by getter\n\n model.normalMatrix = new Float64Array(9);\n model.MCWCMatrix = new Float64Array(16); // Build VTK API\n\n setGet(publicAPI, model, ['context']); // Object methods\n\n vtkOpenGLVolume(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend, 'vtkOpenGLVolume'); // ----------------------------------------------------------------------------\n\nvar vtkVolume = {\n newInstance: newInstance,\n extend: extend\n}; // Register ourself to OpenGL backend if imported\n\nregisterOverride('vtkVolume', newInstance);\n\nexport { vtkVolume as default, extend, newInstance };\n","import { newInstance as newInstance$1, obj, vtkErrorMacro, getArray } from '../../macros.js';\nimport vtkOpenGLTexture from './Texture.js';\nimport { VtkDataTypes } from '../../Common/Core/DataArray/Constants.js';\nimport { Filter } from './Texture/Constants.js';\n\n// vtkFramebuffer methods\n// ----------------------------------------------------------------------------\n\nfunction vtkFramebuffer(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkFramebuffer');\n\n publicAPI.getBothMode = function () {\n return model.context.FRAMEBUFFER;\n }; // publicAPI.getDrawMode = () => model.context.DRAW_FRAMEBUFFER;\n // publicAPI.getReadMode = () => model.context.READ_FRAMEBUFFER;\n\n\n publicAPI.saveCurrentBindingsAndBuffers = function (modeIn) {\n var mode = typeof modeIn !== 'undefined' ? modeIn : publicAPI.getBothMode();\n publicAPI.saveCurrentBindings(mode);\n publicAPI.saveCurrentBuffers(mode);\n };\n\n publicAPI.saveCurrentBindings = function (modeIn) {\n if (!model.context) {\n vtkErrorMacro('you must set the OpenGLRenderWindow before calling saveCurrentBindings');\n return;\n }\n\n var gl = model.context;\n model.previousDrawBinding = gl.getParameter(model.context.FRAMEBUFFER_BINDING);\n model.previousActiveFramebuffer = model._openGLRenderWindow.getActiveFramebuffer();\n };\n\n publicAPI.saveCurrentBuffers = function (modeIn) {// noop on webgl 1\n };\n\n publicAPI.restorePreviousBindingsAndBuffers = function (modeIn) {\n var mode = typeof modeIn !== 'undefined' ? modeIn : publicAPI.getBothMode();\n publicAPI.restorePreviousBindings(mode);\n publicAPI.restorePreviousBuffers(mode);\n };\n\n publicAPI.restorePreviousBindings = function (modeIn) {\n if (!model.context) {\n vtkErrorMacro('you must set the OpenGLRenderWindow before calling restorePreviousBindings');\n return;\n }\n\n var gl = model.context;\n gl.bindFramebuffer(gl.FRAMEBUFFER, model.previousDrawBinding);\n\n model._openGLRenderWindow.setActiveFramebuffer(model.previousActiveFramebuffer);\n };\n\n publicAPI.restorePreviousBuffers = function (modeIn) {// currently a noop on webgl1\n };\n\n publicAPI.bind = function () {\n var modeArg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n var mode = modeArg;\n\n if (mode === null) {\n mode = model.context.FRAMEBUFFER;\n }\n\n model.context.bindFramebuffer(mode, model.glFramebuffer);\n\n for (var i = 0; i < model.colorBuffers.length; i++) {\n model.colorBuffers[i].bind();\n }\n\n model._openGLRenderWindow.setActiveFramebuffer(publicAPI);\n };\n\n publicAPI.create = function (width, height) {\n if (!model.context) {\n vtkErrorMacro('you must set the OpenGLRenderWindow before calling create');\n return;\n }\n\n model.glFramebuffer = model.context.createFramebuffer();\n model.glFramebuffer.width = width;\n model.glFramebuffer.height = height;\n };\n\n publicAPI.setColorBuffer = function (texture) {\n var attachment = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var gl = model.context;\n\n if (!gl) {\n vtkErrorMacro('you must set the OpenGLRenderWindow before calling setColorBuffer');\n return;\n }\n\n var glAttachment = gl.COLOR_ATTACHMENT0;\n\n if (attachment > 0) {\n if (model._openGLRenderWindow.getWebgl2()) {\n glAttachment += attachment;\n } else {\n vtkErrorMacro('Using multiple framebuffer attachments requires WebGL 2');\n return;\n }\n }\n\n model.colorBuffers[attachment] = texture;\n gl.framebufferTexture2D(gl.FRAMEBUFFER, glAttachment, gl.TEXTURE_2D, texture.getHandle(), 0);\n };\n\n publicAPI.removeColorBuffer = function () {\n var attachment = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var gl = model.context;\n\n if (!gl) {\n vtkErrorMacro('you must set the OpenGLRenderWindow before calling removeColorBuffer');\n return;\n }\n\n var glAttachment = gl.COLOR_ATTACHMENT0;\n\n if (attachment > 0) {\n if (model._openGLRenderWindow.getWebgl2()) {\n glAttachment += attachment;\n } else {\n vtkErrorMacro('Using multiple framebuffer attachments requires WebGL 2');\n return;\n }\n }\n\n gl.framebufferTexture2D(gl.FRAMEBUFFER, glAttachment, gl.TEXTURE_2D, null, 0);\n model.colorBuffers = model.colorBuffers.splice(attachment, 1);\n };\n\n publicAPI.setDepthBuffer = function (texture) {\n if (!model.context) {\n vtkErrorMacro('you must set the OpenGLRenderWindow before calling setDepthBuffer');\n return;\n }\n\n if (model._openGLRenderWindow.getWebgl2()) {\n var gl = model.context;\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.TEXTURE_2D, texture.getHandle(), 0);\n } else {\n vtkErrorMacro('Attaching depth buffer textures to fbo requires WebGL 2');\n }\n };\n\n publicAPI.removeDepthBuffer = function () {\n if (!model.context) {\n vtkErrorMacro('you must set the OpenGLRenderWindow before calling removeDepthBuffer');\n return;\n }\n\n if (model._openGLRenderWindow.getWebgl2()) {\n var gl = model.context;\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.TEXTURE_2D, null, 0);\n } else {\n vtkErrorMacro('Attaching depth buffer textures to framebuffers requires WebGL 2');\n }\n };\n\n publicAPI.getGLFramebuffer = function () {\n return model.glFramebuffer;\n };\n\n publicAPI.setOpenGLRenderWindow = function (rw) {\n if (model._openGLRenderWindow === rw) {\n return;\n }\n\n publicAPI.releaseGraphicsResources();\n model._openGLRenderWindow = rw;\n model.context = null;\n\n if (rw) {\n model.context = model._openGLRenderWindow.getContext();\n }\n };\n\n publicAPI.releaseGraphicsResources = function () {\n if (model.glFramebuffer) {\n model.context.deleteFramebuffer(model.glFramebuffer);\n }\n };\n\n publicAPI.getSize = function () {\n var size = [0, 0];\n\n if (model.glFramebuffer !== null) {\n size[0] = model.glFramebuffer.width;\n size[1] = model.glFramebuffer.height;\n }\n\n return size;\n };\n\n publicAPI.populateFramebuffer = function () {\n if (!model.context) {\n vtkErrorMacro('you must set the OpenGLRenderWindow before calling populateFrameBuffer');\n return;\n }\n\n publicAPI.bind();\n var gl = model.context;\n var texture = vtkOpenGLTexture.newInstance();\n texture.setOpenGLRenderWindow(model._openGLRenderWindow);\n texture.setMinificationFilter(Filter.LINEAR);\n texture.setMagnificationFilter(Filter.LINEAR);\n texture.create2DFromRaw(model.glFramebuffer.width, model.glFramebuffer.height, 4, VtkDataTypes.UNSIGNED_CHAR, null);\n publicAPI.setColorBuffer(texture); // for now do not count on having a depth buffer texture\n // as they are not standard webgl 1\n\n model.depthTexture = gl.createRenderbuffer();\n gl.bindRenderbuffer(gl.RENDERBUFFER, model.depthTexture);\n gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, model.glFramebuffer.width, model.glFramebuffer.height);\n gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, model.depthTexture);\n }; // For backwards compatibility. Use getColorBuffers()[0] going forward.\n\n\n publicAPI.getColorTexture = function () {\n return model.colorBuffers[0];\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n // _openGLRenderWindow: null,\n glFramebuffer: null,\n colorBuffers: null,\n depthTexture: null,\n previousDrawBinding: 0,\n previousReadBinding: 0,\n previousDrawBuffer: 0,\n previousReadBuffer: 0,\n previousActiveFramebuffer: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Build VTK API\n\n obj(publicAPI, model);\n\n if (model.colorBuffers) {\n vtkErrorMacro('you cannot initialize colorBuffers through the constructor. You should call setColorBuffer() instead.');\n }\n\n model.colorBuffers = [];\n getArray(publicAPI, model, ['colorBuffers']); // For more macro methods, see \"Sources/macros.js\"\n // Object specific methods\n\n vtkFramebuffer(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend, 'vtkFramebuffer'); // ----------------------------------------------------------------------------\n\nvar vtkOpenGLFramebuffer = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkOpenGLFramebuffer as default, extend, newInstance };\n","var InterpolationType = {\n NEAREST: 0,\n LINEAR: 1,\n FAST_LINEAR: 2\n};\nvar OpacityMode = {\n FRACTIONAL: 0,\n PROPORTIONAL: 1\n};\nvar Constants = {\n InterpolationType: InterpolationType,\n OpacityMode: OpacityMode\n};\n\nexport { InterpolationType, OpacityMode, Constants as default };\n","var vtkVolumeVS = \"//VTK::System::Dec\\n\\n/*=========================================================================\\n\\n Program: Visualization Toolkit\\n Module: vtkPolyDataVS.glsl\\n\\n Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen\\n All rights reserved.\\n See Copyright.txt or http://www.kitware.com/Copyright.htm for details.\\n\\n This software is distributed WITHOUT ANY WARRANTY; without even\\n the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR\\n PURPOSE. See the above copyright notice for more information.\\n\\n=========================================================================*/\\n\\nattribute vec4 vertexDC;\\n\\nvarying vec3 vertexVCVSOutput;\\nuniform mat4 PCVCMatrix;\\n\\nuniform float dcxmin;\\nuniform float dcxmax;\\nuniform float dcymin;\\nuniform float dcymax;\\n\\nvoid main()\\n{\\n // dcsmall is the device coords reduced to the\\n // x y area covered by the volume\\n vec4 dcsmall = vec4(\\n dcxmin + 0.5 * (vertexDC.x + 1.0) * (dcxmax - dcxmin),\\n dcymin + 0.5 * (vertexDC.y + 1.0) * (dcymax - dcymin),\\n vertexDC.z,\\n vertexDC.w);\\n vec4 vcpos = PCVCMatrix * dcsmall;\\n vertexVCVSOutput = vcpos.xyz/vcpos.w;\\n gl_Position = dcsmall;\\n}\\n\";\n\nexport { vtkVolumeVS as v };\n","var vtkVolumeFS = \"//VTK::System::Dec\\n\\n/*=========================================================================\\n\\n Program: Visualization Toolkit\\n Module: vtkVolumeFS.glsl\\n\\n Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen\\n All rights reserved.\\n See Copyright.txt or http://www.kitware.com/Copyright.htm for details.\\n\\n This software is distributed WITHOUT ANY WARRANTY; without even\\n the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR\\n PURPOSE. See the above copyright notice for more information.\\n\\n=========================================================================*/\\n// Template for the volume mappers fragment shader\\n\\n// the output of this shader\\n//VTK::Output::Dec\\n\\nvarying vec3 vertexVCVSOutput;\\n\\n// first declare the settings from the mapper\\n// that impact the code paths in here\\n\\n// always set vtkNumComponents 1,2,3,4\\n//VTK::NumComponents\\n\\n// possibly define vtkTrilinearOn\\n//VTK::TrilinearOn\\n\\n// possibly define vtkIndependentComponents\\n//VTK::IndependentComponentsOn\\n\\n// possibly define any \\\"proportional\\\" components\\n//VTK::vtkProportionalComponents\\n\\n// Define the blend mode to use\\n#define vtkBlendMode //VTK::BlendMode\\n\\n// Possibly define vtkImageLabelOutlineOn\\n//VTK::ImageLabelOutlineOn\\n\\n#ifdef vtkImageLabelOutlineOn\\nuniform int outlineThickness;\\nuniform float outlineOpacity;\\nuniform float vpWidth;\\nuniform float vpHeight;\\nuniform float vpOffsetX;\\nuniform float vpOffsetY;\\nuniform mat4 PCWCMatrix;\\nuniform mat4 vWCtoIDX;\\n#endif\\n\\n// define vtkLightComplexity\\n//VTK::LightComplexity\\n#if vtkLightComplexity > 0\\nuniform float vSpecularPower;\\nuniform float vAmbient;\\nuniform float vDiffuse;\\nuniform float vSpecular;\\n//VTK::Light::Dec\\n#endif\\n\\n//VTK::VolumeShadowOn\\n//VTK::SurfaceShadowOn\\n//VTK::localAmbientOcclusionOn\\n//VTK::LAO::Dec\\n//VTK::VolumeShadow::Dec\\n\\n// define vtkComputeNormalFromOpacity\\n//VTK::vtkComputeNormalFromOpacity\\n\\n// possibly define vtkGradientOpacityOn\\n//VTK::GradientOpacityOn\\n#ifdef vtkGradientOpacityOn\\nuniform float goscale0;\\nuniform float goshift0;\\nuniform float gomin0;\\nuniform float gomax0;\\n#if defined(vtkIndependentComponentsOn) && (vtkNumComponents > 1)\\nuniform float goscale1;\\nuniform float goshift1;\\nuniform float gomin1;\\nuniform float gomax1;\\n#if vtkNumComponents >= 3\\nuniform float goscale2;\\nuniform float goshift2;\\nuniform float gomin2;\\nuniform float gomax2;\\n#endif\\n#if vtkNumComponents >= 4\\nuniform float goscale3;\\nuniform float goshift3;\\nuniform float gomin3;\\nuniform float gomax3;\\n#endif\\n#endif\\n#endif\\n\\n// if you want to see the raw tiled\\n// data in webgl1 uncomment the following line\\n// #define debugtile\\n\\n// camera values\\nuniform float camThick;\\nuniform float camNear;\\nuniform float camFar;\\nuniform int cameraParallel;\\n\\n// values describing the volume geometry\\nuniform vec3 vOriginVC;\\nuniform vec3 vSpacing;\\nuniform ivec3 volumeDimensions; // 3d texture dimensions\\nuniform vec3 vPlaneNormal0;\\nuniform float vPlaneDistance0;\\nuniform vec3 vPlaneNormal1;\\nuniform float vPlaneDistance1;\\nuniform vec3 vPlaneNormal2;\\nuniform float vPlaneDistance2;\\nuniform vec3 vPlaneNormal3;\\nuniform float vPlaneDistance3;\\nuniform vec3 vPlaneNormal4;\\nuniform float vPlaneDistance4;\\nuniform vec3 vPlaneNormal5;\\nuniform float vPlaneDistance5;\\n\\n//VTK::ClipPlane::Dec\\n\\n// opacity and color textures\\nuniform sampler2D otexture;\\nuniform float oshift0;\\nuniform float oscale0;\\nuniform sampler2D ctexture;\\nuniform float cshift0;\\nuniform float cscale0;\\n\\n// jitter texture\\nuniform sampler2D jtexture;\\n\\n// some 3D texture values\\nuniform float sampleDistance;\\nuniform vec3 vVCToIJK;\\n\\n// the heights defined below are the locations\\n// for the up to four components of the tfuns\\n// the tfuns have a height of 2XnumComps pixels so the\\n// values are computed to hit the middle of the two rows\\n// for that component\\n#ifdef vtkIndependentComponentsOn\\n#if vtkNumComponents == 2\\nuniform float mix0;\\nuniform float mix1;\\n#define height0 0.25\\n#define height1 0.75\\n#endif\\n#if vtkNumComponents == 3\\nuniform float mix0;\\nuniform float mix1;\\nuniform float mix2;\\n#define height0 0.17\\n#define height1 0.5\\n#define height2 0.83\\n#endif\\n#if vtkNumComponents == 4\\nuniform float mix0;\\nuniform float mix1;\\nuniform float mix2;\\nuniform float mix3;\\n#define height0 0.125\\n#define height1 0.375\\n#define height2 0.625\\n#define height3 0.875\\n#endif\\n#endif\\n\\n#if vtkNumComponents >= 2\\nuniform float oshift1;\\nuniform float oscale1;\\nuniform float cshift1;\\nuniform float cscale1;\\n#endif\\n#if vtkNumComponents >= 3\\nuniform float oshift2;\\nuniform float oscale2;\\nuniform float cshift2;\\nuniform float cscale2;\\n#endif\\n#if vtkNumComponents >= 4\\nuniform float oshift3;\\nuniform float oscale3;\\nuniform float cshift3;\\nuniform float cscale3;\\n#endif\\n\\nuniform vec4 ipScalarRangeMin;\\nuniform vec4 ipScalarRangeMax;\\n\\n// declaration for intermixed geometry\\n//VTK::ZBuffer::Dec\\n\\n//=======================================================================\\n// global and custom variables (a temporary section before photorealistics rendering module is complete)\\nvec3 rayDirVC;\\nfloat sampleDistanceISVS;\\nfloat sampleDistanceIS;\\n\\n#define SQRT3 1.7321\\n#define INV4PI 0.0796\\n#define EPSILON 0.001\\n#define PI 3.1415\\n#define PI2 9.8696\\n\\n//=======================================================================\\n// Webgl2 specific version of functions\\n#if __VERSION__ == 300\\n\\nuniform highp sampler3D texture1;\\n\\nvec4 getTextureValue(vec3 pos)\\n{\\n vec4 tmp = texture(texture1, pos);\\n#if vtkNumComponents == 1\\n tmp.a = tmp.r;\\n#endif\\n#if vtkNumComponents == 2\\n tmp.a = tmp.g;\\n#endif\\n#if vtkNumComponents == 3\\n tmp.a = length(tmp.rgb);\\n#endif\\n return tmp;\\n}\\n\\n//=======================================================================\\n// WebGL1 specific version of functions\\n#else\\n\\nuniform sampler2D texture1;\\n\\nuniform float texWidth;\\nuniform float texHeight;\\nuniform int xreps;\\nuniform int xstride;\\nuniform int ystride;\\n\\n// if computing trilinear values from multiple z slices\\n#ifdef vtkTrilinearOn\\nvec4 getTextureValue(vec3 ijk)\\n{\\n float zoff = 1.0/float(volumeDimensions.z);\\n vec4 val1 = getOneTextureValue(ijk);\\n vec4 val2 = getOneTextureValue(vec3(ijk.xy, ijk.z + zoff));\\n\\n float indexZ = float(volumeDimensions)*ijk.z;\\n float zmix = indexZ - floor(indexZ);\\n\\n return mix(val1, val2, zmix);\\n}\\n\\nvec4 getOneTextureValue(vec3 ijk)\\n#else // nearest or fast linear\\nvec4 getTextureValue(vec3 ijk)\\n#endif\\n{\\n vec3 tdims = vec3(volumeDimensions);\\n\\n#ifdef debugtile\\n vec2 tpos = vec2(ijk.x, ijk.y);\\n vec4 tmp = texture2D(texture1, tpos);\\n tmp.a = 1.0;\\n\\n#else\\n int z = int(ijk.z * tdims.z);\\n int yz = z / xreps;\\n int xz = z - yz*xreps;\\n\\n int tileWidth = volumeDimensions.x/xstride;\\n int tileHeight = volumeDimensions.y/ystride;\\n\\n xz *= tileWidth;\\n yz *= tileHeight;\\n\\n float ni = float(xz) + (ijk.x*float(tileWidth));\\n float nj = float(yz) + (ijk.y*float(tileHeight));\\n\\n vec2 tpos = vec2(ni/texWidth, nj/texHeight);\\n\\n vec4 tmp = texture2D(texture1, tpos);\\n\\n#if vtkNumComponents == 1\\n tmp.a = tmp.r;\\n#endif\\n#if vtkNumComponents == 2\\n tmp.g = tmp.a;\\n#endif\\n#if vtkNumComponents == 3\\n tmp.a = length(tmp.rgb);\\n#endif\\n#endif\\n\\n return tmp;\\n}\\n\\n// End of Webgl1 specific code\\n//=======================================================================\\n#endif\\n\\n//=======================================================================\\n// transformation between VC and IS space\\n\\n// convert vector position from idx to vc\\n#if vtkLightComplexity > 0\\nvec3 IStoVC(vec3 posIS){\\n vec3 posVC = posIS / vVCToIJK;\\n return posVC.x * vPlaneNormal0 +\\n posVC.y * vPlaneNormal2 +\\n posVC.z * vPlaneNormal4 +\\n vOriginVC;\\n}\\n\\n// convert vector position from vc to idx\\nvec3 VCtoIS(vec3 posVC){\\n posVC = posVC - vOriginVC;\\n posVC = vec3(\\n dot(posVC, vPlaneNormal0),\\n dot(posVC, vPlaneNormal2),\\n dot(posVC, vPlaneNormal4));\\n return posVC * vVCToIJK;\\n}\\n#endif\\n\\n//Rotate vector to view coordinate\\n#if (vtkLightComplexity > 0) || (defined vtkGradientOpacityOn)\\nvoid rotateToViewCoord(inout vec3 dirIS){\\n dirIS.xyz =\\n dirIS.x * vPlaneNormal0 +\\n dirIS.y * vPlaneNormal2 +\\n dirIS.z * vPlaneNormal4;\\n}\\n\\n//Rotate vector to idx coordinate\\nvec3 rotateToIDX(vec3 dirVC){\\n vec3 dirIS;\\n dirIS.xyz = vec3(\\n dot(dirVC, vPlaneNormal0),\\n dot(dirVC, vPlaneNormal2),\\n dot(dirVC, vPlaneNormal4));\\n return dirIS;\\n}\\n#endif\\n\\n//=======================================================================\\n// Given a normal compute the gradient opacity factors\\nfloat computeGradientOpacityFactor(\\n float normalMag, float goscale, float goshift, float gomin, float gomax)\\n{\\n#if defined(vtkGradientOpacityOn)\\n return clamp(normalMag * goscale + goshift, gomin, gomax);\\n#else\\n return 1.0;\\n#endif\\n}\\n\\n//=======================================================================\\n// compute the normal and gradient magnitude for a position, uses forward difference\\n#if (vtkLightComplexity > 0) || (defined vtkGradientOpacityOn)\\n #ifdef vtkComputeNormalFromOpacity\\n #ifdef vtkGradientOpacityOn\\n vec4 computeNormalForDensity(vec3 pos, float scalar, vec3 tstep, out mat3 scalarInterp, out vec3 secondaryGradientMag)\\n {\\n vec4 result;\\n scalarInterp[0][0] = getTextureValue(pos + vec3(tstep.x, 0.0, 0.0)).a;\\n scalarInterp[0][1] = getTextureValue(pos + vec3(0.0, tstep.y, 0.0)).a;\\n scalarInterp[0][2] = getTextureValue(pos + vec3(0.0, 0.0, tstep.z)).a;\\n // look up scalar values for computing secondary gradient\\n scalarInterp[1][0] = getTextureValue(pos + vec3(2.0*tstep.x, 0.0, 0.0)).a;\\n scalarInterp[1][1] = getTextureValue(pos + vec3(0.0, 2.0*tstep.y, 0.0)).a;\\n scalarInterp[1][2] = getTextureValue(pos + vec3(0.0, 0.0, 2.0*tstep.z)).a;\\n scalarInterp[2][0] = getTextureValue(pos + vec3(tstep.x, tstep.y, 0.0)).a;\\n scalarInterp[2][1] = getTextureValue(pos + vec3(tstep.x, 0.0, tstep.z)).a;\\n scalarInterp[2][2] = getTextureValue(pos + vec3(0.0, tstep.y, tstep.z)).a;\\n result.x = scalarInterp[0][0] - scalar;\\n result.y = scalarInterp[0][1] - scalar;\\n result.z = scalarInterp[0][2] - scalar;\\n // divide by spacing\\n result.xyz /= vSpacing;\\n result.w = length(result.xyz);\\n rotateToViewCoord(result.xyz);\\n secondaryGradientMag.x = length(vec3(scalarInterp[1][0] - scalarInterp[0][0],\\n scalarInterp[2][0] - scalarInterp[0][0],\\n scalarInterp[2][1] - scalarInterp[0][0]) / vSpacing);\\n secondaryGradientMag.y = length(vec3(scalarInterp[2][0] - scalarInterp[0][1],\\n scalarInterp[1][1] - scalarInterp[0][1],\\n scalarInterp[2][2] - scalarInterp[0][1]) / vSpacing);\\n secondaryGradientMag.z = length(vec3(scalarInterp[2][1] - scalarInterp[0][2],\\n scalarInterp[2][2] - scalarInterp[0][2],\\n scalarInterp[1][2] - scalarInterp[0][2]) / vSpacing);\\n if (length(result.xyz) > 0.0) {\\n return vec4(normalize(result.xyz),result.w);\\n } else {\\n return vec4(0.0);\\n }\\n }\\n\\n vec4 computeDensityNormal(float scalar, float gradientMag, mat3 scalarInterp, vec3 secondaryGradientMag)\\n {\\n vec4 opacityG;\\n vec3 opacityInterp = vec3(0.0);\\n float opacity = texture2D(otexture, vec2(scalar * oscale0 + oshift0, 0.5)).r;\\n if (gradientMag >= 0.0){\\n opacity *= computeGradientOpacityFactor(gradientMag, goscale0, goshift0, gomin0, gomax0);\\n }\\n opacityInterp.x = texture2D(otexture, vec2(scalarInterp[0][0] * oscale0 + oshift0, 0.5)).r;\\n if (secondaryGradientMag.x >= 0.0){\\n opacityInterp.x *= computeGradientOpacityFactor(secondaryGradientMag.x, goscale0, goshift0, gomin0, gomax0);\\n }\\n\\n opacityInterp.y = texture2D(otexture, vec2(scalarInterp[0][1] * oscale0 + oshift0, 0.5)).r;\\n if (secondaryGradientMag.y >= 0.0){\\n opacityInterp.y *= computeGradientOpacityFactor(secondaryGradientMag.y, goscale0, goshift0, gomin0, gomax0);\\n }\\n\\n opacityInterp.z = texture2D(otexture, vec2(scalarInterp[0][2] * oscale0 + oshift0, 0.5)).r;\\n if (secondaryGradientMag.z >= 0.0){\\n opacityInterp.z *= computeGradientOpacityFactor(secondaryGradientMag.z, goscale0, goshift0, gomin0, gomax0);\\n }\\n\\n opacityG.xyz = opacityInterp - vec3(opacity,opacity,opacity);\\n // divide by spacing\\n opacityG.xyz /= vSpacing;\\n opacityG.w = length(opacityG.xyz);\\n rotateToViewCoord(opacityG.xyz);\\n if (length(opacityG.xyz) > 0.0) {\\n return vec4(normalize(opacityG.xyz),opacityG.w);\\n } else {\\n return vec4(0.0);\\n }\\n }\\n\\n #else\\n //if gradient opacity not on but using density gradient\\n vec4 computeDensityNormal(float scalar, vec3 scalarInterp)\\n {\\n vec4 opacityG;\\n float opacity = texture2D(otexture, vec2(scalar * oscale0 + oshift0, 0.5)).r;\\n opacityG.x = texture2D(otexture, vec2(scalarInterp.x * oscale0 + oshift0, 0.5)).r - opacity;\\n opacityG.y = texture2D(otexture, vec2(scalarInterp.y * oscale0 + oshift0, 0.5)).r - opacity;\\n opacityG.z = texture2D(otexture, vec2(scalarInterp.z * oscale0 + oshift0, 0.5)).r - opacity;\\n // divide by spacing\\n opacityG.xyz /= vSpacing;\\n opacityG.w = length(opacityG.xyz);\\n // rotate to View Coords\\n rotateToViewCoord(opacityG.xyz);\\n if (length(opacityG.xyz) > 0.0) {\\n return vec4(normalize(opacityG.xyz),opacityG.w);\\n } else {\\n return vec4(0.0);\\n }\\n }\\n vec4 computeNormalForDensity(vec3 pos, float scalar, vec3 tstep, out vec3 scalarInterp)\\n {\\n vec4 result;\\n scalarInterp.x = getTextureValue(pos + vec3(tstep.x, 0.0, 0.0)).a;\\n scalarInterp.y = getTextureValue(pos + vec3(0.0, tstep.y, 0.0)).a;\\n scalarInterp.z = getTextureValue(pos + vec3(0.0, 0.0, tstep.z)).a;\\n result.x = scalarInterp.x - scalar;\\n result.y = scalarInterp.y - scalar;\\n result.z = scalarInterp.z - scalar;\\n // divide by spacing\\n result.xyz /= vSpacing;\\n result.w = length(result.xyz);\\n // rotate to View Coords\\n rotateToViewCoord(result.xyz);\\n if (length(result.xyz) > 0.0) {\\n return vec4(normalize(result.xyz),result.w);\\n } else {\\n return vec4(0.0);\\n }\\n }\\n #endif\\n #endif\\n // compute scalar density\\n vec4 computeNormal(vec3 pos, float scalar, vec3 tstep)\\n {\\n vec4 result;\\n result.x = getTextureValue(pos + vec3(tstep.x, 0.0, 0.0)).a - scalar;\\n result.y = getTextureValue(pos + vec3(0.0, tstep.y, 0.0)).a - scalar;\\n result.z = getTextureValue(pos + vec3(0.0, 0.0, tstep.z)).a - scalar;\\n // divide by spacing\\n result.xyz /= vSpacing;\\n result.w = length(result.xyz);\\n if (result.w > 0.0){\\n // rotate to View Coords\\n rotateToViewCoord(result.xyz);\\n return vec4(normalize(result.xyz),result.w);\\n } else {\\n return vec4(0.0);\\n }\\n }\\n#endif\\n\\n#ifdef vtkImageLabelOutlineOn\\nvec3 fragCoordToIndexSpace(vec4 fragCoord) {\\n vec4 pcPos = vec4(\\n (fragCoord.x / vpWidth - vpOffsetX - 0.5) * 2.0,\\n (fragCoord.y / vpHeight - vpOffsetY - 0.5) * 2.0,\\n (fragCoord.z - 0.5) * 2.0,\\n 1.0);\\n\\n vec4 worldCoord = PCWCMatrix * pcPos;\\n vec4 vertex = (worldCoord/worldCoord.w);\\n\\n vec3 index = (vWCtoIDX * vertex).xyz;\\n\\n // half voxel fix for labelmapOutline\\n return (index + vec3(0.5)) / vec3(volumeDimensions);\\n}\\n#endif\\n\\n//=======================================================================\\n// compute the normals and gradient magnitudes for a position\\n// for independent components\\nmat4 computeMat4Normal(vec3 pos, vec4 tValue, vec3 tstep)\\n{\\n mat4 result;\\n vec4 distX = getTextureValue(pos + vec3(tstep.x, 0.0, 0.0)) - tValue;\\n vec4 distY = getTextureValue(pos + vec3(0.0, tstep.y, 0.0)) - tValue;\\n vec4 distZ = getTextureValue(pos + vec3(0.0, 0.0, tstep.z)) - tValue;\\n\\n // divide by spacing\\n distX /= vSpacing.x;\\n distY /= vSpacing.y;\\n distZ /= vSpacing.z;\\n\\n mat3 rot;\\n rot[0] = vPlaneNormal0;\\n rot[1] = vPlaneNormal2;\\n rot[2] = vPlaneNormal4;\\n\\n#if !defined(vtkComponent0Proportional)\\n result[0].xyz = vec3(distX.r, distY.r, distZ.r);\\n result[0].a = length(result[0].xyz);\\n result[0].xyz *= rot;\\n if (result[0].w > 0.0)\\n {\\n result[0].xyz /= result[0].w;\\n }\\n#endif\\n\\n// optionally compute the 2nd component\\n#if vtkNumComponents >= 2 && !defined(vtkComponent1Proportional)\\n result[1].xyz = vec3(distX.g, distY.g, distZ.g);\\n result[1].a = length(result[1].xyz);\\n result[1].xyz *= rot;\\n if (result[1].w > 0.0)\\n {\\n result[1].xyz /= result[1].w;\\n }\\n#endif\\n\\n// optionally compute the 3rd component\\n#if vtkNumComponents >= 3 && !defined(vtkComponent2Proportional)\\n result[2].xyz = vec3(distX.b, distY.b, distZ.b);\\n result[2].a = length(result[2].xyz);\\n result[2].xyz *= rot;\\n if (result[2].w > 0.0)\\n {\\n result[2].xyz /= result[2].w;\\n }\\n#endif\\n\\n// optionally compute the 4th component\\n#if vtkNumComponents >= 4 && !defined(vtkComponent3Proportional)\\n result[3].xyz = vec3(distX.a, distY.a, distZ.a);\\n result[3].a = length(result[3].xyz);\\n result[3].xyz *= rot;\\n if (result[3].w > 0.0)\\n {\\n result[3].xyz /= result[3].w;\\n }\\n#endif\\n\\n return result;\\n}\\n\\n//=======================================================================\\n// global shadow - secondary ray\\n#if defined(VolumeShadowOn) || defined(localAmbientOcclusionOn)\\nfloat random()\\n{\\n float rand = fract(sin(dot(gl_FragCoord.xy,vec2(12.9898,78.233)))*43758.5453123);\\n float jitter=texture2D(jtexture,gl_FragCoord.xy/32.).r;\\n uint pcg_state = floatBitsToUint(jitter);\\n uint state = pcg_state;\\n pcg_state = pcg_state * uint(747796405) + uint(2891336453);\\n uint word = ((state >> ((state >> uint(28)) + uint(4))) ^ state) * uint(277803737);\\n return (float((((word >> uint(22)) ^ word) >> 1 ))/float(2147483647) + rand)/2.0;\\n}\\n#endif\\n\\n#ifdef VolumeShadowOn\\n// henyey greenstein phase function\\nfloat phase_function(float cos_angle)\\n{\\n // divide by 2.0 instead of 4pi to increase intensity\\n return ((1.0-anisotropy2)/pow(1.0+anisotropy2-2.0*anisotropy*cos_angle, 1.5))/2.0;\\n}\\n\\n// Computes the intersection between a ray and a box\\nstruct Hit\\n{\\n float tmin;\\n float tmax;\\n};\\n\\nstruct Ray\\n{\\n vec3 origin;\\n vec3 dir;\\n vec3 invDir;\\n};\\n\\nbool BBoxIntersect(vec3 boundMin, vec3 boundMax, const Ray r, out Hit hit)\\n{\\n vec3 tbot = r.invDir * (boundMin - r.origin);\\n vec3 ttop = r.invDir * (boundMax - r.origin);\\n vec3 tmin = min(ttop, tbot);\\n vec3 tmax = max(ttop, tbot);\\n vec2 t = max(tmin.xx, tmin.yz);\\n float t0 = max(t.x, t.y);\\n t = min(tmax.xx, tmax.yz);\\n float t1 = min(t.x, t.y);\\n hit.tmin = t0;\\n hit.tmax = t1;\\n return t1 > max(t0,0.0);\\n}\\n\\n// As BBoxIntersect requires the inverse of the ray coords,\\n// this function is used to avoid numerical issues\\nvoid safe_0_vector(inout Ray ray)\\n{\\n if(abs(ray.dir.x) < EPSILON) ray.dir.x = sign(ray.dir.x) * EPSILON;\\n if(abs(ray.dir.y) < EPSILON) ray.dir.y = sign(ray.dir.y) * EPSILON;\\n if(abs(ray.dir.z) < EPSILON) ray.dir.z = sign(ray.dir.z) * EPSILON;\\n}\\n\\nfloat volume_shadow(vec3 posIS, vec3 lightDirNormIS)\\n{\\n float shadow = 1.0;\\n float opacity = 0.0;\\n\\n // modify sample distance with a random number between 1.5 and 3.0\\n float sampleDistanceISVS_jitter = sampleDistanceISVS * mix(1.5, 3.0, random());\\n float opacityPrev = texture2D(otexture, vec2(getTextureValue(posIS).r * oscale0 + oshift0, 0.5)).r;\\n\\n // in case the first sample near surface has a very tiled light ray, we need to offset start position\\n posIS += sampleDistanceISVS_jitter * lightDirNormIS;\\n\\n // compute the start and end points for the ray\\n Ray ray;\\n Hit hit;\\n ray.origin = posIS;\\n ray.dir = lightDirNormIS;\\n safe_0_vector(ray);\\n ray.invDir = 1.0/ray.dir;\\n\\n if(!BBoxIntersect(vec3(0.0),vec3(1.0), ray, hit))\\n {\\n return 1.0;\\n }\\n float maxdist = hit.tmax;\\n\\n // interpolate shadow ray length between: 1 unit of sample distance in IS to SQRT3, based on globalIlluminationReach\\n float maxgi = mix(sampleDistanceISVS_jitter,SQRT3,giReach);\\n maxdist = min(maxdist,maxgi);\\n if(maxdist < EPSILON) {\\n return 1.0;\\n }\\n\\n // support gradient opacity\\n #ifdef vtkGradientOpacityOn\\n vec4 normal;\\n #endif\\n\\n float current_dist = 0.0;\\n float current_step = length(sampleDistanceISVS_jitter * lightDirNormIS);\\n float clamped_step = 0.0;\\n\\n vec4 scalar = vec4(0.0);\\n while(current_dist < maxdist)\\n {\\n scalar = getTextureValue(posIS);\\n opacity = texture2D(otexture, vec2(scalar.r * oscale0 + oshift0, 0.5)).r;\\n #ifdef vtkGradientOpacityOn\\n normal = computeNormal(posIS, scalar.a, vec3(1.0/vec3(volumeDimensions)));\\n opacity *= computeGradientOpacityFactor(normal.w, goscale0, goshift0, gomin0, gomax0);\\n #endif\\n shadow *= 1.0 - opacity;\\n\\n // optimization: early termination\\n if (shadow < EPSILON){\\n return 0.0;\\n }\\n\\n clamped_step = min(maxdist - current_dist, current_step);\\n posIS += clamped_step * lightDirNormIS;\\n current_dist += current_step;\\n }\\n\\n return shadow;\\n}\\n\\nvec3 applyShadowRay(vec3 tColor, vec3 posIS, vec3 viewDirectionVC)\\n{\\n vec3 vertLight = vec3(0.0);\\n vec3 secondary_contrib = vec3(0.0);\\n // here we assume only positional light, no effect of cones\\n for (int i = 0; i < lightNum; i++)\\n {\\n #if(vtkLightComplexity==3)\\n if (lightPositional[i] == 1){\\n vertLight = lightPositionVC[i] - IStoVC(posIS);\\n }else{\\n vertLight = - lightDirectionVC[i];\\n }\\n #else\\n vertLight = - lightDirectionVC[i];\\n #endif\\n // here we assume achromatic light, only intensity\\n float dDotL = dot(viewDirectionVC, normalize(vertLight));\\n // isotropic scatter returns 0.5 instead of 1/4pi to increase intensity\\n float phase_attenuation = 0.5;\\n if (abs(anisotropy) > EPSILON){\\n phase_attenuation = phase_function(dDotL);\\n }\\n float vol_shadow = volume_shadow(posIS, normalize(rotateToIDX(vertLight)));\\n secondary_contrib += tColor * vDiffuse * lightColor[i] * vol_shadow * phase_attenuation;\\n secondary_contrib += tColor * vAmbient;\\n }\\n return secondary_contrib;\\n}\\n#endif\\n\\n//=======================================================================\\n// local ambient occlusion\\n#ifdef localAmbientOcclusionOn\\nvec3 sample_direction_uniform(int i)\\n{\\n float rand = random() * 0.5;\\n float theta = PI2 * (kernelSample[i][0] + rand);\\n float phi = acos(2.0 * (kernelSample[i][1] + rand) -1.0) / 2.5;\\n return normalize(vec3(cos(theta)*sin(phi), sin(theta)*sin(phi), cos(phi)));\\n}\\n\\n// return a matrix that transform startDir into z axis; startDir should be normalized\\nmat3 zBaseRotationalMatrix(vec3 startDir){\\n vec3 axis = cross(startDir, vec3(0.0,0.0,1.0));\\n float cosA = startDir.z;\\n float k = 1.0 / (1.0 + cosA);\\n mat3 matrix = mat3((axis.x * axis.x * k) + cosA, (axis.y * axis.x * k) - axis.z, (axis.z * axis.x * k) + axis.y,\\n (axis.x * axis.y * k) + axis.z, (axis.y * axis.y * k) + cosA, (axis.z * axis.y * k) - axis.x,\\n (axis.x * axis.z * k) - axis.y, (axis.y * axis.z * k) + axis.x, (axis.z * axis.z * k) + cosA);\\n return matrix;\\n}\\n\\nfloat computeLAO(vec3 posIS, float op, vec3 lightDir, vec4 normal){\\n // apply LAO only at selected locations, otherwise return full brightness\\n if (normal.w > 0.0 && op > 0.05){\\n float total_transmittance = 0.0;\\n mat3 inverseRotateBasis = inverse(zBaseRotationalMatrix(normalize(-normal.xyz)));\\n vec3 currPos, randomDirStep;\\n float weight, transmittance, opacity;\\n for (int i = 0; i < kernelSize; i++)\\n {\\n randomDirStep = inverseRotateBasis * sample_direction_uniform(i) * sampleDistanceIS;\\n weight = 1.0 - dot(normalize(lightDir), normalize(randomDirStep));\\n currPos = posIS;\\n transmittance = 1.0;\\n for (int j = 0; j < kernelRadius ; j++){\\n currPos += randomDirStep;\\n // check if it's at clipping plane, if so return full brightness\\n if (all(greaterThan(currPos, vec3(EPSILON))) && all(lessThan(currPos,vec3(1.0-EPSILON)))){\\n opacity = texture2D(otexture, vec2(getTextureValue(currPos).r * oscale0 + oshift0, 0.5)).r;\\n #ifdef vtkGradientOpacityOn\\n opacity *= computeGradientOpacityFactor(normal.w, goscale0, goshift0, gomin0, gomax0);\\n #endif\\n transmittance *= 1.0 - opacity;\\n }\\n else{\\n break;\\n }\\n }\\n total_transmittance += transmittance / float(kernelRadius) * weight;\\n\\n // early termination if fully translucent\\n if (total_transmittance > 1.0 - EPSILON){\\n return 1.0;\\n }\\n }\\n // average transmittance and reduce variance\\n return clamp(total_transmittance / float(kernelSize), 0.3, 1.0);\\n } else {\\n return 1.0;\\n }\\n}\\n#endif\\n\\n//=======================================================================\\n// surface light contribution\\n#if vtkLightComplexity > 0\\n void applyLighting(inout vec3 tColor, vec4 normal)\\n {\\n vec3 diffuse = vec3(0.0, 0.0, 0.0);\\n vec3 specular = vec3(0.0, 0.0, 0.0);\\n float df, sf = 0.0;\\n for (int i = 0; i < lightNum; i++){\\n df = abs(dot(normal.rgb, -lightDirectionVC[i]));\\n diffuse += df * lightColor[i];\\n sf = pow( abs(dot(lightHalfAngleVC[i],normal.rgb)), vSpecularPower);\\n specular += sf * lightColor[i];\\n }\\n tColor.rgb = tColor.rgb*(diffuse*vDiffuse + vAmbient) + specular*vSpecular;\\n }\\n #ifdef SurfaceShadowOn\\n #if vtkLightComplexity < 3\\n vec3 applyLightingDirectional(vec3 posIS, vec4 tColor, vec4 normal)\\n {\\n // everything in VC\\n vec3 diffuse = vec3(0.0);\\n vec3 specular = vec3(0.0);\\n #ifdef localAmbientOcclusionOn\\n vec3 ambient = vec3(0.0);\\n #endif\\n vec3 vertLightDirection;\\n for (int i = 0; i < lightNum; i++){\\n float ndotL,vdotR;\\n vertLightDirection = lightDirectionVC[i];\\n ndotL = dot(normal.xyz, vertLightDirection);\\n if (ndotL < 0.0 && twoSidedLighting)\\n {\\n ndotL = -ndotL;\\n }\\n if (ndotL > 0.0)\\n {\\n diffuse += ndotL * lightColor[i];\\n //specular\\n vdotR = dot(-rayDirVC, normalize(2.0 * ndotL * -normal.xyz + vertLightDirection));\\n if (vdotR > 0.0)\\n {\\n specular += pow(vdotR, vSpecularPower) * lightColor[i];\\n }\\n }\\n #ifdef localAmbientOcclusionOn\\n ambient += computeLAO(posIS, tColor.a, vertLightDirection, normal);\\n #endif\\n }\\n #ifdef localAmbientOcclusionOn\\n return tColor.rgb * (diffuse * vDiffuse + vAmbient * ambient) + specular*vSpecular;\\n #else\\n return tColor.rgb * (diffuse * vDiffuse + vAmbient) + specular*vSpecular;\\n #endif\\n }\\n #else\\n vec3 applyLightingPositional(vec3 posIS, vec4 tColor, vec4 normal, vec3 posVC)\\n {\\n // everything in VC\\n vec3 diffuse = vec3(0.0);\\n vec3 specular = vec3(0.0);\\n #ifdef localAmbientOcclusionOn\\n vec3 ambient = vec3(0.0);\\n #endif\\n vec3 vertLightDirection;\\n for (int i = 0; i < lightNum; i++){\\n float distance,attenuation,ndotL,vdotR;\\n vec3 lightDir;\\n if (lightPositional[i] == 1){\\n lightDir = lightDirectionVC[i];\\n vertLightDirection = posVC - lightPositionVC[i];\\n distance = length(vertLightDirection);\\n vertLightDirection = normalize(vertLightDirection);\\n attenuation = 1.0 / (lightAttenuation[i].x\\n + lightAttenuation[i].y * distance\\n + lightAttenuation[i].z * distance * distance);\\n // per OpenGL standard cone angle is 90 or less for a spot light\\n if (lightConeAngle[i] <= 90.0){\\n float coneDot = dot(vertLightDirection, lightDir);\\n if (coneDot >= cos(radians(lightConeAngle[i]))){ // if inside cone\\n attenuation = attenuation * pow(coneDot, lightExponent[i]);\\n }\\n else {\\n attenuation = 0.0;\\n }\\n }\\n ndotL = dot(normal.xyz, vertLightDirection);\\n if (ndotL < 0.0 && twoSidedLighting)\\n {\\n ndotL = -ndotL;\\n }\\n if (ndotL > 0.0)\\n {\\n diffuse += ndotL * attenuation * lightColor[i];\\n //specular\\n vdotR = dot(-rayDirVC, normalize(2.0 * ndotL * -normal.xyz + vertLightDirection));\\n if (vdotR > 0.0)\\n {\\n specular += pow(vdotR, vSpecularPower) * attenuation * lightColor[i];\\n }\\n }\\n #ifdef localAmbientOcclusionOn\\n ambient += computeLAO(posIS, tColor.a, vertLightDirection, normal);\\n #endif\\n } else {\\n vertLightDirection = lightDirectionVC[i];\\n ndotL = dot(normal.xyz, vertLightDirection);\\n if (ndotL < 0.0 && twoSidedLighting)\\n {\\n ndotL = -ndotL;\\n }\\n if (ndotL > 0.0)\\n {\\n diffuse += ndotL * lightColor[i];\\n //specular\\n vdotR = dot(-rayDirVC, normalize(2.0 * ndotL * -normal.xyz + vertLightDirection));\\n if (vdotR > 0.0)\\n {\\n specular += pow(vdotR, vSpecularPower) * lightColor[i];\\n }\\n }\\n #ifdef localAmbientOcclusionOn\\n ambient += computeLAO(posIS, tColor.a, vertLightDirection, normal);\\n #endif\\n }\\n }\\n #ifdef localAmbientOcclusionOn\\n return tColor.rgb * (diffuse * vDiffuse + vAmbient * ambient) + specular*vSpecular;\\n #else\\n return tColor.rgb * (diffuse * vDiffuse + vAmbient) + specular*vSpecular;\\n #endif\\n }\\n #endif\\n #endif\\n#endif\\n\\n//=======================================================================\\n// Given a texture value compute the color and opacity\\n//\\nvec4 getColorForValue(vec4 tValue, vec3 posIS, vec3 tstep)\\n{\\n#ifdef vtkImageLabelOutlineOn\\n vec3 centerPosIS = fragCoordToIndexSpace(gl_FragCoord); // pos in texture space\\n vec4 centerValue = getTextureValue(centerPosIS);\\n bool pixelOnBorder = false;\\n vec4 tColor = texture2D(ctexture, vec2(centerValue.r * cscale0 + cshift0, 0.5));\\n\\n // Get alpha of segment from opacity function.\\n tColor.a = texture2D(otexture, vec2(centerValue.r * oscale0 + oshift0, 0.5)).r;\\n\\n // Only perform outline check on fragments rendering voxels that aren't invisible.\\n // Saves a bunch of needless checks on the background.\\n // TODO define epsilon when building shader?\\n if (float(tColor.a) > 0.01) {\\n for (int i = -outlineThickness; i <= outlineThickness; i++) {\\n for (int j = -outlineThickness; j <= outlineThickness; j++) {\\n if (i == 0 || j == 0) {\\n continue;\\n }\\n\\n vec4 neighborPixelCoord = vec4(gl_FragCoord.x + float(i),\\n gl_FragCoord.y + float(j),\\n gl_FragCoord.z, gl_FragCoord.w);\\n\\n vec3 neighborPosIS = fragCoordToIndexSpace(neighborPixelCoord);\\n vec4 value = getTextureValue(neighborPosIS);\\n\\n // If any of my neighbours are not the same value as I\\n // am, this means I am on the border of the segment.\\n // We can break the loops\\n if (any(notEqual(value, centerValue))) {\\n pixelOnBorder = true;\\n break;\\n }\\n }\\n\\n if (pixelOnBorder == true) {\\n break;\\n }\\n }\\n\\n // If I am on the border, I am displayed at full opacity\\n if (pixelOnBorder == true) {\\n tColor.a = outlineOpacity;\\n }\\n }\\n\\n#else\\n // compute the normal and gradient magnitude if needed\\n // We compute it as a vec4 if possible otherwise a mat4\\n //\\n vec4 goFactor = vec4(1.0,1.0,1.0,1.0);\\n\\n // compute the normal vectors as needed\\n #if (vtkLightComplexity > 0) || defined(vtkGradientOpacityOn)\\n #if defined(vtkIndependentComponentsOn) && (vtkNumComponents > 1)\\n mat4 normalMat = computeMat4Normal(posIS, tValue, tstep);\\n #if !defined(vtkComponent0Proportional)\\n vec4 normal0 = normalMat[0];\\n #endif\\n #if !defined(vtkComponent1Proportional)\\n vec4 normal1 = normalMat[1];\\n #endif\\n #if vtkNumComponents > 2\\n #if !defined(vtkComponent2Proportional)\\n vec4 normal2 = normalMat[2];\\n #endif\\n #if vtkNumComponents > 3\\n #if !defined(vtkComponent3Proportional)\\n vec4 normal3 = normalMat[3];\\n #endif\\n #endif\\n #endif\\n #else\\n vec4 normalLight;\\n #ifdef vtkComputeNormalFromOpacity\\n #ifdef vtkGradientOpacityOn\\n mat3 scalarInterp;\\n vec3 secondaryGradientMag;\\n vec4 normal0 = computeNormalForDensity(posIS, tValue.a, tstep, scalarInterp, secondaryGradientMag);\\n normalLight = computeDensityNormal(tValue.a, normal0.w, scalarInterp,secondaryGradientMag);\\n if (length(normalLight) == 0.0){\\n normalLight = normal0;\\n }\\n #else\\n vec3 scalarInterp;\\n vec4 normal0 = computeNormalForDensity(posIS, tValue.a, tstep, scalarInterp);\\n if (length(normal0)>0.0){\\n normalLight = computeDensityNormal(tValue.a,scalarInterp);\\n if (length(normalLight)==0.0){\\n normalLight = normal0;\\n }\\n }\\n #endif\\n #else\\n vec4 normal0 = computeNormal(posIS, tValue.a, tstep);\\n normalLight = normal0;\\n #endif\\n #endif\\n #endif\\n\\n // compute gradient opacity factors as needed\\n #if defined(vtkGradientOpacityOn)\\n #if !defined(vtkComponent0Proportional)\\n goFactor.x =\\n computeGradientOpacityFactor(normal0.a, goscale0, goshift0, gomin0, gomax0);\\n #endif\\n #if defined(vtkIndependentComponentsOn) && (vtkNumComponents > 1)\\n #if !defined(vtkComponent1Proportional)\\n goFactor.y =\\n computeGradientOpacityFactor(normal1.a, goscale1, goshift1, gomin1, gomax1);\\n #endif\\n #if vtkNumComponents > 2\\n #if !defined(vtkComponent2Proportional)\\n goFactor.z =\\n computeGradientOpacityFactor(normal2.a, goscale2, goshift2, gomin2, gomax2);\\n #endif\\n #if vtkNumComponents > 3\\n #if !defined(vtkComponent3Proportional)\\n goFactor.w =\\n computeGradientOpacityFactor(normal3.a, goscale3, goshift3, gomin3, gomax3);\\n #endif\\n #endif\\n #endif\\n #endif\\n #endif\\n\\n // single component is always independent\\n #if vtkNumComponents == 1\\n vec4 tColor = texture2D(ctexture, vec2(tValue.r * cscale0 + cshift0, 0.5));\\n tColor.a = goFactor.x*texture2D(otexture, vec2(tValue.r * oscale0 + oshift0, 0.5)).r;\\n if (tColor.a < EPSILON){\\n return vec4(0.0);\\n }\\n #endif\\n\\n #if defined(vtkIndependentComponentsOn) && vtkNumComponents >= 2\\n vec4 tColor = mix0*texture2D(ctexture, vec2(tValue.r * cscale0 + cshift0, height0));\\n #if !defined(vtkComponent0Proportional)\\n tColor.a = goFactor.x*mix0*texture2D(otexture, vec2(tValue.r * oscale0 + oshift0, height0)).r;\\n #else\\n float pwfValue = texture2D(otexture, vec2(tValue.r * oscale0 + oshift0, height0)).r;\\n tColor *= pwfValue;\\n tColor.a *= mix(pwfValue, 1.0, (1.0 - mix0));\\n #endif\\n\\n vec3 tColor1 = mix1*texture2D(ctexture, vec2(tValue.g * cscale1 + cshift1, height1)).rgb;\\n #if !defined(vtkComponent1Proportional)\\n tColor.a += goFactor.y*mix1*texture2D(otexture, vec2(tValue.g * oscale1 + oshift1, height1)).r;\\n #else\\n float pwfValue = texture2D(otexture, vec2(tValue.g * oscale1 + oshift1, height1)).r;\\n tColor1 *= pwfValue;\\n tColor.a *= mix(pwfValue, 1.0, (1.0 - mix1));\\n #endif\\n\\n #if vtkNumComponents >= 3\\n vec3 tColor2 = mix2*texture2D(ctexture, vec2(tValue.b * cscale2 + cshift2, height2)).rgb;\\n #if !defined(vtkComponent2Proportional)\\n tColor.a += goFactor.z*mix2*texture2D(otexture, vec2(tValue.b * oscale2 + oshift2, height2)).r;\\n #else\\n float pwfValue = texture2D(otexture, vec2(tValue.b * oscale2 + oshift2, height2)).r;\\n tColor2 *= pwfValue;\\n tColor.a *= mix(pwfValue, 1.0, (1.0 - mix2));\\n #endif\\n\\n #if vtkNumComponents >= 4\\n vec3 tColor3 = mix3*texture2D(ctexture, vec2(tValue.a * cscale3 + cshift3, height3)).rgb;\\n #if !defined(vtkComponent3Proportional)\\n tColor.a += goFactor.w*mix3*texture2D(otexture, vec2(tValue.a * oscale3 + oshift3, height3)).r;\\n #else\\n float pwfValue = texture2D(otexture, vec2(tValue.a * oscale3 + oshift3, height3)).r;\\n tColor3 *= pwfValue;\\n tColor.a *= mix(pwfValue, 1.0, (1.0 - mix3));\\n #endif\\n #endif\\n #endif\\n #else // then not independent\\n\\n #if vtkNumComponents == 2\\n float lum = tValue.r * cscale0 + cshift0;\\n float alpha = goFactor.x*texture2D(otexture, vec2(tValue.a * oscale1 + oshift1, 0.5)).r;\\n vec4 tColor = vec4(lum, lum, lum, alpha);\\n #endif\\n #if vtkNumComponents == 3\\n vec4 tColor;\\n tColor.r = tValue.r * cscale0 + cshift0;\\n tColor.g = tValue.g * cscale1 + cshift1;\\n tColor.b = tValue.b * cscale2 + cshift2;\\n tColor.a = goFactor.x*texture2D(otexture, vec2(tValue.a * oscale0 + oshift0, 0.5)).r;\\n #endif\\n #if vtkNumComponents == 4\\n vec4 tColor;\\n tColor.r = tValue.r * cscale0 + cshift0;\\n tColor.g = tValue.g * cscale1 + cshift1;\\n tColor.b = tValue.b * cscale2 + cshift2;\\n tColor.a = goFactor.x*texture2D(otexture, vec2(tValue.a * oscale3 + oshift3, 0.5)).r;\\n #endif\\n #endif // dependent\\n\\n // apply lighting if requested as appropriate\\n #if vtkLightComplexity > 0\\n #if !defined(vtkComponent0Proportional)\\n #if vtkNumComponents == 1\\n #ifdef SurfaceShadowOn\\n #if vtkLightComplexity < 3\\n vec3 tColorS = applyLightingDirectional(posIS, tColor, normalLight);\\n #else\\n vec3 tColorS = applyLightingPositional(posIS, tColor, normalLight, IStoVC(posIS));\\n #endif\\n #endif\\n\\n #ifdef VolumeShadowOn\\n vec3 tColorVS = applyShadowRay(tColor.rgb, posIS, rayDirVC);\\n #ifdef SurfaceShadowOn\\n float vol_coef = volumetricScatteringBlending * (1.0 - tColor.a / 2.0) * (1.0 - atan(normalLight.w) * INV4PI);\\n tColor.rgb = (1.0-vol_coef) * tColorS + vol_coef * tColorVS;\\n #else\\n tColor.rgb = tColorVS;\\n #endif\\n #else\\n tColor.rgb = tColorS;\\n #endif\\n\\n #else\\n applyLighting(tColor.rgb, normal0);\\n #endif\\n #endif\\n\\n #if defined(vtkIndependentComponentsOn) && vtkNumComponents >= 2\\n #if !defined(vtkComponent1Proportional)\\n applyLighting(tColor1, normal1);\\n #endif\\n #if vtkNumComponents >= 3\\n #if !defined(vtkComponent2Proportional)\\n applyLighting(tColor2, normal2);\\n #endif\\n #if vtkNumComponents >= 4\\n #if !defined(vtkComponent3Proportional)\\n applyLighting(tColor3, normal3);\\n #endif\\n #endif\\n #endif\\n #endif\\n #endif\\n\\n// perform final independent blend as needed\\n#if defined(vtkIndependentComponentsOn) && vtkNumComponents >= 2\\n tColor.rgb += tColor1;\\n#if vtkNumComponents >= 3\\n tColor.rgb += tColor2;\\n#if vtkNumComponents >= 4\\n tColor.rgb += tColor3;\\n#endif\\n#endif\\n#endif\\n\\n#endif\\nreturn tColor;\\n}\\n\\nbool valueWithinScalarRange(vec4 val, vec4 min, vec4 max) {\\n bool withinRange = false;\\n #if vtkNumComponents == 1\\n if (val.r >= min.r && val.r <= max.r) {\\n withinRange = true;\\n }\\n #endif\\n #if defined(vtkIndependentComponentsOn) && vtkNumComponents == 2\\n if (val.r >= min.r && val.r <= max.r &&\\n val.g >= min.g && val.g <= max.g) {\\n withinRange = true;\\n }\\n #endif\\n #if defined(vtkIndependentComponentsOn) && vtkNumComponents >= 3\\n if (all(greaterThanEqual(val, ipScalarRangeMin)) &&\\n all(lessThanEqual(val, ipScalarRangeMax))) {\\n withinRange = true;\\n }\\n #endif\\n return withinRange;\\n}\\n\\n//=======================================================================\\n// Apply the specified blend mode operation along the ray's path.\\n//\\nvoid applyBlend(vec3 posIS, vec3 endIS, vec3 tdims)\\n{\\n vec3 tstep = 1.0/tdims;\\n\\n // start slightly inside and apply some jitter\\n vec3 delta = endIS - posIS;\\n vec3 stepIS = normalize(delta)*sampleDistanceIS;\\n float raySteps = length(delta)/sampleDistanceIS;\\n\\n // avoid 0.0 jitter\\n float jitter = 0.01 + 0.99*texture2D(jtexture, gl_FragCoord.xy/32.0).r;\\n float stepsTraveled = jitter;\\n\\n // local vars for the loop\\n vec4 color = vec4(0.0, 0.0, 0.0, 0.0);\\n vec4 tValue;\\n vec4 tColor;\\n\\n // if we have less than one step then pick the middle point\\n // as our value\\n // if (raySteps <= 1.0)\\n // {\\n // posIS = (posIS + endIS)*0.5;\\n // }\\n\\n // Perform initial step at the volume boundary\\n // compute the scalar\\n tValue = getTextureValue(posIS);\\n\\n #if vtkBlendMode == 0 // COMPOSITE_BLEND\\n // now map through opacity and color\\n tColor = getColorForValue(tValue, posIS, tstep);\\n\\n // handle very thin volumes\\n if (raySteps <= 1.0)\\n {\\n tColor.a = 1.0 - pow(1.0 - tColor.a, raySteps);\\n gl_FragData[0] = tColor;\\n return;\\n }\\n\\n tColor.a = 1.0 - pow(1.0 - tColor.a, jitter);\\n color = vec4(tColor.rgb*tColor.a, tColor.a);\\n posIS += (jitter*stepIS);\\n\\n for (int i = 0; i < //VTK::MaximumSamplesValue ; ++i)\\n {\\n if (stepsTraveled + 1.0 >= raySteps) { break; }\\n\\n // compute the scalar\\n tValue = getTextureValue(posIS);\\n\\n // now map through opacity and color\\n tColor = getColorForValue(tValue, posIS, tstep);\\n\\n float mix = (1.0 - color.a);\\n\\n // this line should not be needed but nvidia seems to not handle\\n // the break correctly on windows/chrome 58 angle\\n //mix = mix * sign(max(raySteps - stepsTraveled - 1.0, 0.0));\\n\\n color = color + vec4(tColor.rgb*tColor.a, tColor.a)*mix;\\n stepsTraveled++;\\n posIS += stepIS;\\n if (color.a > 0.99) { color.a = 1.0; break; }\\n }\\n\\n if (color.a < 0.99 && (raySteps - stepsTraveled) > 0.0)\\n {\\n posIS = endIS;\\n\\n // compute the scalar\\n tValue = getTextureValue(posIS);\\n\\n // now map through opacity and color\\n tColor = getColorForValue(tValue, posIS, tstep);\\n tColor.a = 1.0 - pow(1.0 - tColor.a, raySteps - stepsTraveled);\\n\\n float mix = (1.0 - color.a);\\n color = color + vec4(tColor.rgb*tColor.a, tColor.a)*mix;\\n }\\n\\n gl_FragData[0] = vec4(color.rgb/color.a, color.a);\\n #endif\\n #if vtkBlendMode == 1 || vtkBlendMode == 2\\n // MAXIMUM_INTENSITY_BLEND || MINIMUM_INTENSITY_BLEND\\n // Find maximum/minimum intensity along the ray.\\n\\n // Define the operation we will use (min or max)\\n #if vtkBlendMode == 1\\n #define OP max\\n #else\\n #define OP min\\n #endif\\n\\n // If the clipping range is shorter than the sample distance\\n // we can skip the sampling loop along the ray.\\n if (raySteps <= 1.0)\\n {\\n gl_FragData[0] = getColorForValue(tValue, posIS, tstep);\\n return;\\n }\\n\\n vec4 value = tValue;\\n posIS += (jitter*stepIS);\\n\\n // Sample along the ray until MaximumSamplesValue,\\n // ending slightly inside the total distance\\n for (int i = 0; i < //VTK::MaximumSamplesValue ; ++i)\\n {\\n // If we have reached the last step, break\\n if (stepsTraveled + 1.0 >= raySteps) { break; }\\n\\n // compute the scalar\\n tValue = getTextureValue(posIS);\\n\\n // Update the maximum value if necessary\\n value = OP(tValue, value);\\n\\n // Otherwise, continue along the ray\\n stepsTraveled++;\\n posIS += stepIS;\\n }\\n\\n // Perform the last step along the ray using the\\n // residual distance\\n posIS = endIS;\\n tValue = getTextureValue(posIS);\\n value = OP(tValue, value);\\n\\n // Now map through opacity and color\\n gl_FragData[0] = getColorForValue(value, posIS, tstep);\\n #endif\\n #if vtkBlendMode == 3 || vtkBlendMode == 4 //AVERAGE_INTENSITY_BLEND || ADDITIVE_BLEND\\n vec4 sum = vec4(0.);\\n\\n if (valueWithinScalarRange(tValue, ipScalarRangeMin, ipScalarRangeMax)) {\\n sum += tValue;\\n }\\n\\n if (raySteps <= 1.0) {\\n gl_FragData[0] = getColorForValue(sum, posIS, tstep);\\n return;\\n }\\n\\n posIS += (jitter*stepIS);\\n\\n // Sample along the ray until MaximumSamplesValue,\\n // ending slightly inside the total distance\\n for (int i = 0; i < //VTK::MaximumSamplesValue ; ++i)\\n {\\n // If we have reached the last step, break\\n if (stepsTraveled + 1.0 >= raySteps) { break; }\\n\\n // compute the scalar\\n tValue = getTextureValue(posIS);\\n\\n // One can control the scalar range by setting the AverageIPScalarRange to disregard scalar values, not in the range of interest, from the average computation.\\n // Notes:\\n // - We are comparing all values in the texture to see if any of them\\n // are outside of the scalar range. In the future we might want to allow\\n // scalar ranges for each component.\\n if (valueWithinScalarRange(tValue, ipScalarRangeMin, ipScalarRangeMax)) {\\n // Sum the values across each step in the path\\n sum += tValue;\\n }\\n stepsTraveled++;\\n posIS += stepIS;\\n }\\n\\n // Perform the last step along the ray using the\\n // residual distance\\n posIS = endIS;\\n\\n // compute the scalar\\n tValue = getTextureValue(posIS);\\n\\n // One can control the scalar range by setting the IPScalarRange to disregard scalar values, not in the range of interest, from the average computation\\n if (valueWithinScalarRange(tValue, ipScalarRangeMin, ipScalarRangeMax)) {\\n sum += tValue;\\n\\n stepsTraveled++;\\n }\\n\\n #if vtkBlendMode == 3 // Average\\n sum /= vec4(stepsTraveled, stepsTraveled, stepsTraveled, 1.0);\\n #endif\\n\\n gl_FragData[0] = getColorForValue(sum, posIS, tstep);\\n #endif\\n #if vtkBlendMode == 5 // RADON\\n float normalizedRayIntensity = 1.0;\\n\\n // handle very thin volumes\\n if (raySteps <= 1.0)\\n {\\n tValue = getTextureValue(posIS);\\n normalizedRayIntensity = normalizedRayIntensity - sampleDistance*texture2D(otexture, vec2(tValue.r * oscale0 + oshift0, 0.5)).r;\\n gl_FragData[0] = texture2D(ctexture, vec2(normalizedRayIntensity, 0.5));\\n return;\\n }\\n\\n posIS += (jitter*stepIS);\\n\\n for (int i = 0; i < //VTK::MaximumSamplesValue ; ++i)\\n {\\n if (stepsTraveled + 1.0 >= raySteps) { break; }\\n\\n // compute the scalar value\\n tValue = getTextureValue(posIS);\\n\\n // Convert scalar value to normalizedRayIntensity coefficient and accumulate normalizedRayIntensity\\n normalizedRayIntensity = normalizedRayIntensity - sampleDistance*texture2D(otexture, vec2(tValue.r * oscale0 + oshift0, 0.5)).r;\\n\\n posIS += stepIS;\\n stepsTraveled++;\\n }\\n\\n // map normalizedRayIntensity to color\\n gl_FragData[0] = texture2D(ctexture, vec2(normalizedRayIntensity , 0.5));\\n\\n #endif\\n}\\n\\n//=======================================================================\\n// Compute a new start and end point for a given ray based\\n// on the provided bounded clipping plane (aka a rectangle)\\nvoid getRayPointIntersectionBounds(\\n vec3 rayPos, vec3 rayDir,\\n vec3 planeDir, float planeDist,\\n inout vec2 tbounds, vec3 vPlaneX, vec3 vPlaneY,\\n float vSize1, float vSize2)\\n{\\n float result = dot(rayDir, planeDir);\\n if (abs(result) < 1e-6)\\n {\\n return;\\n }\\n result = -1.0 * (dot(rayPos, planeDir) + planeDist) / result;\\n vec3 xposVC = rayPos + rayDir*result;\\n vec3 vxpos = xposVC - vOriginVC;\\n vec2 vpos = vec2(\\n dot(vxpos, vPlaneX),\\n dot(vxpos, vPlaneY));\\n\\n // on some apple nvidia systems this does not work\\n // if (vpos.x < 0.0 || vpos.x > vSize1 ||\\n // vpos.y < 0.0 || vpos.y > vSize2)\\n // even just\\n // if (vpos.x < 0.0 || vpos.y < 0.0)\\n // fails\\n // so instead we compute a value that represents in and out\\n //and then compute the return using this value\\n float xcheck = max(0.0, vpos.x * (vpos.x - vSize1)); // 0 means in bounds\\n float check = sign(max(xcheck, vpos.y * (vpos.y - vSize2))); // 0 means in bounds, 1 = out\\n\\n tbounds = mix(\\n vec2(min(tbounds.x, result), max(tbounds.y, result)), // in value\\n tbounds, // out value\\n check); // 0 in 1 out\\n}\\n\\n//=======================================================================\\n// given a\\n// - ray direction (rayDir)\\n// - starting point (vertexVCVSOutput)\\n// - bounding planes of the volume\\n// - optionally depth buffer values\\n// - far clipping plane\\n// compute the start/end distances of the ray we need to cast\\nvec2 computeRayDistances(vec3 rayDir, vec3 tdims)\\n{\\n vec2 dists = vec2(100.0*camFar, -1.0);\\n\\n vec3 vSize = vSpacing*tdims;\\n\\n // all this is in View Coordinates\\n getRayPointIntersectionBounds(vertexVCVSOutput, rayDir,\\n vPlaneNormal0, vPlaneDistance0, dists, vPlaneNormal2, vPlaneNormal4,\\n vSize.y, vSize.z);\\n getRayPointIntersectionBounds(vertexVCVSOutput, rayDir,\\n vPlaneNormal1, vPlaneDistance1, dists, vPlaneNormal2, vPlaneNormal4,\\n vSize.y, vSize.z);\\n getRayPointIntersectionBounds(vertexVCVSOutput, rayDir,\\n vPlaneNormal2, vPlaneDistance2, dists, vPlaneNormal0, vPlaneNormal4,\\n vSize.x, vSize.z);\\n getRayPointIntersectionBounds(vertexVCVSOutput, rayDir,\\n vPlaneNormal3, vPlaneDistance3, dists, vPlaneNormal0, vPlaneNormal4,\\n vSize.x, vSize.z);\\n getRayPointIntersectionBounds(vertexVCVSOutput, rayDir,\\n vPlaneNormal4, vPlaneDistance4, dists, vPlaneNormal0, vPlaneNormal2,\\n vSize.x, vSize.y);\\n getRayPointIntersectionBounds(vertexVCVSOutput, rayDir,\\n vPlaneNormal5, vPlaneDistance5, dists, vPlaneNormal0, vPlaneNormal2,\\n vSize.x, vSize.y);\\n\\n //VTK::ClipPlane::Impl\\n\\n // do not go behind front clipping plane\\n dists.x = max(0.0,dists.x);\\n\\n // do not go PAST far clipping plane\\n float farDist = -camThick/rayDir.z;\\n dists.y = min(farDist,dists.y);\\n\\n // Do not go past the zbuffer value if set\\n // This is used for intermixing opaque geometry\\n //VTK::ZBuffer::Impl\\n\\n return dists;\\n}\\n\\n//=======================================================================\\n// Compute the index space starting position (pos) and end\\n// position\\n//\\nvoid computeIndexSpaceValues(out vec3 pos, out vec3 endPos, vec3 rayDir, vec2 dists)\\n{\\n // compute starting and ending values in volume space\\n pos = vertexVCVSOutput + dists.x*rayDir;\\n pos = pos - vOriginVC;\\n // convert to volume basis and origin\\n pos = vec3(\\n dot(pos, vPlaneNormal0),\\n dot(pos, vPlaneNormal2),\\n dot(pos, vPlaneNormal4));\\n\\n endPos = vertexVCVSOutput + dists.y*rayDir;\\n endPos = endPos - vOriginVC;\\n endPos = vec3(\\n dot(endPos, vPlaneNormal0),\\n dot(endPos, vPlaneNormal2),\\n dot(endPos, vPlaneNormal4));\\n\\n float delta = length(endPos - pos);\\n\\n pos *= vVCToIJK;\\n endPos *= vVCToIJK;\\n\\n float delta2 = length(endPos - pos);\\n sampleDistanceIS = sampleDistance*delta2/delta;\\n #ifdef VolumeShadowOn\\n sampleDistanceISVS = sampleDistanceIS * volumeShadowSamplingDistFactor;\\n #endif\\n}\\n\\nvoid main()\\n{\\n\\n if (cameraParallel == 1)\\n {\\n // Camera is parallel, so the rayDir is just the direction of the camera.\\n rayDirVC = vec3(0.0, 0.0, -1.0);\\n } else {\\n // camera is at 0,0,0 so rayDir for perspective is just the vc coord\\n rayDirVC = normalize(vertexVCVSOutput);\\n }\\n\\n vec3 tdims = vec3(volumeDimensions);\\n\\n // compute the start and end points for the ray\\n vec2 rayStartEndDistancesVC = computeRayDistances(rayDirVC, tdims);\\n\\n // do we need to composite? aka does the ray have any length\\n // If not, bail out early\\n if (rayStartEndDistancesVC.y <= rayStartEndDistancesVC.x)\\n {\\n discard;\\n }\\n\\n // IS = Index Space\\n vec3 posIS;\\n vec3 endIS;\\n computeIndexSpaceValues(posIS, endIS, rayDirVC, rayStartEndDistancesVC);\\n\\n // Perform the blending operation along the ray\\n applyBlend(posIS, endIS, tdims);\\n}\\n\";\n\nexport { vtkVolumeFS as v };\n","import _slicedToArray from '@babel/runtime/helpers/slicedToArray';\nimport _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport { newInstance as newInstance$1, obj, setGet, chain, vtkWarningMacro as vtkWarningMacro$1, vtkErrorMacro as vtkErrorMacro$1 } from '../../macros.js';\nimport { mat4, mat3, vec3 } from 'gl-matrix';\nimport vtkDataArray from '../../Common/Core/DataArray.js';\nimport { VtkDataTypes } from '../../Common/Core/DataArray/Constants.js';\nimport vtkHelper from './Helper.js';\nimport { u as uninitializeBounds } from '../../Common/Core/Math/index.js';\nimport vtkOpenGLFramebuffer from './Framebuffer.js';\nimport vtkOpenGLTexture from './Texture.js';\nimport vtkShaderProgram from './ShaderProgram.js';\nimport vtkVertexArrayObject from './VertexArrayObject.js';\nimport vtkViewNode from '../SceneGraph/ViewNode.js';\nimport { Representation } from '../Core/Property/Constants.js';\nimport { Wrap, Filter } from './Texture/Constants.js';\nimport { InterpolationType, OpacityMode } from '../Core/VolumeProperty/Constants.js';\nimport { BlendMode } from '../Core/VolumeMapper/Constants.js';\nimport { v as vtkVolumeVS } from './glsl/vtkVolumeVS.glsl.js';\nimport { v as vtkVolumeFS } from './glsl/vtkVolumeFS.glsl.js';\nimport { registerOverride } from './ViewNodeFactory.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nvar vtkWarningMacro = vtkWarningMacro$1,\n vtkErrorMacro = vtkErrorMacro$1; // TODO: Do we want this in some shared utility? Shouldwe just use lodash.isEqual\n\nfunction arrayEquals(a, b) {\n if (a.length !== b.length) {\n return false;\n }\n\n for (var i = 0; i < a.length; ++i) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n\n return true;\n} // ----------------------------------------------------------------------------\n// vtkOpenGLVolumeMapper methods\n// ----------------------------------------------------------------------------\n\n\nfunction vtkOpenGLVolumeMapper(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkOpenGLVolumeMapper');\n\n publicAPI.buildPass = function () {\n model.zBufferTexture = null;\n }; // ohh someone is doing a zbuffer pass, use that for\n // intermixed volume rendering\n\n\n publicAPI.zBufferPass = function (prepass, renderPass) {\n if (prepass) {\n var zbt = renderPass.getZBufferTexture();\n\n if (zbt !== model.zBufferTexture) {\n model.zBufferTexture = zbt;\n }\n }\n };\n\n publicAPI.opaqueZBufferPass = function (prepass, renderPass) {\n return publicAPI.zBufferPass(prepass, renderPass);\n }; // Renders myself\n\n\n publicAPI.volumePass = function (prepass, renderPass) {\n if (prepass) {\n model._openGLRenderWindow = publicAPI.getFirstAncestorOfType('vtkOpenGLRenderWindow');\n model.context = model._openGLRenderWindow.getContext();\n model.tris.setOpenGLRenderWindow(model._openGLRenderWindow);\n model.jitterTexture.setOpenGLRenderWindow(model._openGLRenderWindow);\n model.framebuffer.setOpenGLRenderWindow(model._openGLRenderWindow); // Per Component?\n\n model.scalarTexture.setOpenGLRenderWindow(model._openGLRenderWindow);\n model.colorTexture.setOpenGLRenderWindow(model._openGLRenderWindow);\n model.opacityTexture.setOpenGLRenderWindow(model._openGLRenderWindow);\n model.openGLVolume = publicAPI.getFirstAncestorOfType('vtkOpenGLVolume');\n var actor = model.openGLVolume.getRenderable();\n model._openGLRenderer = publicAPI.getFirstAncestorOfType('vtkOpenGLRenderer');\n\n var ren = model._openGLRenderer.getRenderable();\n\n model.openGLCamera = model._openGLRenderer.getViewNodeFor(ren.getActiveCamera());\n publicAPI.renderPiece(ren, actor);\n }\n };\n\n publicAPI.buildShaders = function (shaders, ren, actor) {\n publicAPI.getShaderTemplate(shaders, ren, actor);\n publicAPI.replaceShaderValues(shaders, ren, actor);\n };\n\n publicAPI.getShaderTemplate = function (shaders, ren, actor) {\n shaders.Vertex = vtkVolumeVS;\n shaders.Fragment = vtkVolumeFS;\n shaders.Geometry = '';\n };\n\n publicAPI.replaceShaderValues = function (shaders, ren, actor) {\n var FSSource = shaders.Fragment; // define some values in the shader\n\n var iType = actor.getProperty().getInterpolationType();\n\n if (iType === InterpolationType.LINEAR) {\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::TrilinearOn', '#define vtkTrilinearOn').result;\n }\n\n var vtkImageLabelOutline = actor.getProperty().getUseLabelOutline();\n\n if (vtkImageLabelOutline === true) {\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::ImageLabelOutlineOn', '#define vtkImageLabelOutlineOn').result;\n }\n\n var numComp = model.scalarTexture.getComponents();\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::NumComponents', \"#define vtkNumComponents \".concat(numComp)).result;\n var iComps = actor.getProperty().getIndependentComponents();\n\n if (iComps) {\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::IndependentComponentsOn', '#define vtkIndependentComponentsOn').result; // Define any proportional components\n\n var proportionalComponents = [];\n\n for (var nc = 0; nc < numComp; nc++) {\n if (actor.getProperty().getOpacityMode(nc) === OpacityMode.PROPORTIONAL) {\n proportionalComponents.push(\"#define vtkComponent\".concat(nc, \"Proportional\"));\n }\n }\n\n if (proportionalComponents.length > 0) {\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::vtkProportionalComponents', proportionalComponents.join('\\n')).result;\n }\n } // WebGL only supports loops over constants\n // and does not support while loops so we\n // have to hard code how many steps/samples to take\n // We do a break so most systems will gracefully\n // early terminate, but it is always possible\n // a system will execute every step regardless\n\n\n var ext = model.currentInput.getSpatialExtent();\n var spc = model.currentInput.getSpacing();\n var vsize = new Float64Array(3);\n vec3.set(vsize, (ext[1] - ext[0]) * spc[0], (ext[3] - ext[2]) * spc[1], (ext[5] - ext[4]) * spc[2]);\n var maxSamples = vec3.length(vsize) / model.renderable.getSampleDistance();\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::MaximumSamplesValue', \"\".concat(Math.ceil(maxSamples))).result; // set light complexity\n\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::LightComplexity', \"#define vtkLightComplexity \".concat(model.lastLightComplexity)).result; // set shadow blending flag\n\n if (model.lastLightComplexity > 0) {\n if (model.renderable.getVolumetricScatteringBlending() > 0.0) {\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::VolumeShadowOn', \"#define VolumeShadowOn\").result;\n }\n\n if (model.renderable.getVolumetricScatteringBlending() < 1.0) {\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::SurfaceShadowOn', \"#define SurfaceShadowOn\").result;\n }\n\n if (model.renderable.getLocalAmbientOcclusion() && actor.getProperty().getAmbient() > 0.0) {\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::localAmbientOcclusionOn', \"#define localAmbientOcclusionOn\").result;\n }\n } // if using gradient opacity define that\n\n\n model.gopacity = actor.getProperty().getUseGradientOpacity(0);\n\n for (var _nc = 1; iComps && !model.gopacity && _nc < numComp; ++_nc) {\n if (actor.getProperty().getUseGradientOpacity(_nc)) {\n model.gopacity = true;\n }\n }\n\n if (model.gopacity) {\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::GradientOpacityOn', '#define vtkGradientOpacityOn').result;\n } // set normal from density\n\n\n if (model.renderable.getComputeNormalFromOpacity()) {\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::vtkComputeNormalFromOpacity', \"#define vtkComputeNormalFromOpacity\").result;\n } // if we have a ztexture then declare it and use it\n\n\n if (model.zBufferTexture !== null) {\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::ZBuffer::Dec', ['uniform sampler2D zBufferTexture;', 'uniform float vpWidth;', 'uniform float vpHeight;']).result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::ZBuffer::Impl', ['vec4 depthVec = texture2D(zBufferTexture, vec2(gl_FragCoord.x / vpWidth, gl_FragCoord.y/vpHeight));', 'float zdepth = (depthVec.r*256.0 + depthVec.g)/257.0;', 'zdepth = zdepth * 2.0 - 1.0;', 'if (cameraParallel == 0) {', 'zdepth = -2.0 * camFar * camNear / (zdepth*(camFar-camNear)-(camFar+camNear)) - camNear;}', 'else {', 'zdepth = (zdepth + 1.0) * 0.5 * (camFar - camNear);}\\n', 'zdepth = -zdepth/rayDir.z;', 'dists.y = min(zdepth,dists.y);']).result;\n } // Set the BlendMode approach\n\n\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::BlendMode', \"\".concat(model.renderable.getBlendMode())).result;\n shaders.Fragment = FSSource;\n publicAPI.replaceShaderLight(shaders, ren, actor);\n publicAPI.replaceShaderClippingPlane(shaders, ren, actor);\n };\n\n publicAPI.replaceShaderLight = function (shaders, ren, actor) {\n if (model.lastLightComplexity === 0) {\n return;\n }\n\n var FSSource = shaders.Fragment; // check for shadow maps - not implemented yet, skip\n // const shadowFactor = '';\n // to-do: single out the case when complexity = 1\n // only account for lights that are switched on\n\n var lightNum = 0;\n ren.getLights().forEach(function (light) {\n if (light.getSwitch()) {\n lightNum += 1;\n }\n });\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Light::Dec', [\"uniform int lightNum;\", \"uniform bool twoSidedLighting;\", \"uniform vec3 lightColor[\".concat(lightNum, \"];\"), \"uniform vec3 lightDirectionVC[\".concat(lightNum, \"]; // normalized\"), \"uniform vec3 lightHalfAngleVC[\".concat(lightNum, \"];\"), '//VTK::Light::Dec'], false).result; // support any number of lights\n\n if (model.lastLightComplexity === 3) {\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Light::Dec', [\"uniform vec3 lightPositionVC[\".concat(lightNum, \"];\"), \"uniform vec3 lightAttenuation[\".concat(lightNum, \"];\"), \"uniform float lightConeAngle[\".concat(lightNum, \"];\"), \"uniform float lightExponent[\".concat(lightNum, \"];\"), \"uniform int lightPositional[\".concat(lightNum, \"];\")], false).result;\n }\n\n if (model.renderable.getVolumetricScatteringBlending() > 0.0) {\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::VolumeShadow::Dec', [\"uniform float volumetricScatteringBlending;\", \"uniform float giReach;\", \"uniform float volumeShadowSamplingDistFactor;\", \"uniform float anisotropy;\", \"uniform float anisotropy2;\"], false).result;\n }\n\n if (model.renderable.getLocalAmbientOcclusion() && actor.getProperty().getAmbient() > 0.0) {\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::LAO::Dec', [\"uniform int kernelRadius;\", \"uniform vec2 kernelSample[\".concat(model.renderable.getLAOKernelRadius(), \"];\"), \"uniform int kernelSize;\"], false).result;\n }\n\n shaders.Fragment = FSSource;\n };\n\n publicAPI.replaceShaderClippingPlane = function (shaders, ren, actor) {\n var FSSource = shaders.Fragment;\n\n if (model.renderable.getClippingPlanes().length > 0) {\n var clipPlaneSize = model.renderable.getClippingPlanes().length;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::ClipPlane::Dec', [\"uniform vec3 vClipPlaneNormals[6];\", \"uniform float vClipPlaneDistances[6];\", '//VTK::ClipPlane::Dec'], false).result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::ClipPlane::Impl', [\"for(int i = 0; i < \".concat(clipPlaneSize, \"; i++) {\"), ' float rayDirRatio = dot(rayDir, vClipPlaneNormals[i]);', ' float equationResult = dot(vertexVCVSOutput, vClipPlaneNormals[i]) + vClipPlaneDistances[i];', ' if (rayDirRatio == 0.0)', ' {', ' if (equationResult < 0.0) dists.x = dists.y;', ' continue;', ' }', ' float result = -1.0 * equationResult / rayDirRatio;', ' if (rayDirRatio < 0.0) dists.y = min(dists.y, result);', ' else dists.x = max(dists.x, result);', '}', '//VTK::ClipPlane::Impl'], false).result;\n }\n\n shaders.Fragment = FSSource;\n };\n\n publicAPI.getNeedToRebuildShaders = function (cellBO, ren, actor) {\n // do we need lighting?\n var lightComplexity = 0;\n\n if (actor.getProperty().getShade() && model.renderable.getBlendMode() === BlendMode.COMPOSITE_BLEND) {\n // consider the lighting complexity to determine which case applies\n // simple headlight, Light Kit, the whole feature set of VTK\n lightComplexity = 0;\n model.numberOfLights = 0;\n ren.getLights().forEach(function (light) {\n var status = light.getSwitch();\n\n if (status > 0) {\n model.numberOfLights++;\n\n if (lightComplexity === 0) {\n lightComplexity = 1;\n }\n }\n\n if (lightComplexity === 1 && (model.numberOfLights > 1 || light.getIntensity() !== 1.0 || !light.lightTypeIsHeadLight())) {\n lightComplexity = 2;\n }\n\n if (lightComplexity < 3 && light.getPositional()) {\n lightComplexity = 3;\n }\n });\n }\n\n var needRebuild = false;\n\n if (model.lastLightComplexity !== lightComplexity) {\n model.lastLightComplexity = lightComplexity;\n needRebuild = true;\n }\n\n var numComp = model.scalarTexture.getComponents();\n var iComps = actor.getProperty().getIndependentComponents();\n var usesProportionalComponents = false;\n var proportionalComponents = [];\n\n if (iComps) {\n // Define any proportional components\n for (var nc = 0; nc < numComp; nc++) {\n proportionalComponents.push(actor.getProperty().getOpacityMode(nc));\n }\n\n if (proportionalComponents.length > 0) {\n usesProportionalComponents = true;\n }\n }\n\n var ext = model.currentInput.getSpatialExtent();\n var spc = model.currentInput.getSpacing();\n var vsize = new Float64Array(3);\n vec3.set(vsize, (ext[1] - ext[0]) * spc[0], (ext[3] - ext[2]) * spc[1], (ext[5] - ext[4]) * spc[2]);\n var maxSamples = vec3.length(vsize) / model.renderable.getSampleDistance();\n var state = {\n interpolationType: actor.getProperty().getInterpolationType(),\n useLabelOutline: actor.getProperty().getUseLabelOutline(),\n numComp: numComp,\n usesProportionalComponents: usesProportionalComponents,\n iComps: iComps,\n maxSamples: maxSamples,\n useGradientOpacity: actor.getProperty().getUseGradientOpacity(0),\n blendMode: model.renderable.getBlendMode(),\n proportionalComponents: proportionalComponents\n }; // We only need to rebuild the shader if one of these variables has changed,\n // since they are used in the shader template replacement step.\n\n if (!model.previousState || model.previousState.interpolationType !== state.interpolationType || model.previousState.useLabelOutline !== state.useLabelOutline || model.previousState.numComp !== state.numComp || model.previousState.usesProportionalComponents !== state.usesProportionalComponents || model.previousState.iComps !== state.iComps || model.previousState.maxSamples !== state.maxSamples || model.previousState.useGradientOpacity !== state.useGradientOpacity || model.previousState.blendMode !== state.blendMode || !arrayEquals(model.previousState.proportionalComponents, state.proportionalComponents)) {\n model.previousState = _objectSpread({}, state);\n return true;\n } // has something changed that would require us to recreate the shader?\n\n\n if (cellBO.getProgram() === 0 || needRebuild || model.lastHaveSeenDepthRequest !== model.haveSeenDepthRequest || !!model.lastZBufferTexture !== !!model.zBufferTexture || cellBO.getShaderSourceTime().getMTime() < publicAPI.getMTime() || cellBO.getShaderSourceTime().getMTime() < model.renderable.getMTime()) {\n model.lastZBufferTexture = model.zBufferTexture;\n return true;\n }\n\n return false;\n };\n\n publicAPI.updateShaders = function (cellBO, ren, actor) {\n model.lastBoundBO = cellBO; // has something changed that would require us to recreate the shader?\n\n if (publicAPI.getNeedToRebuildShaders(cellBO, ren, actor)) {\n var shaders = {\n Vertex: null,\n Fragment: null,\n Geometry: null\n };\n publicAPI.buildShaders(shaders, ren, actor); // compile and bind the program if needed\n\n var newShader = model._openGLRenderWindow.getShaderCache().readyShaderProgramArray(shaders.Vertex, shaders.Fragment, shaders.Geometry); // if the shader changed reinitialize the VAO\n\n\n if (newShader !== cellBO.getProgram()) {\n cellBO.setProgram(newShader); // reset the VAO as the shader has changed\n\n cellBO.getVAO().releaseGraphicsResources();\n }\n\n cellBO.getShaderSourceTime().modified();\n } else {\n model._openGLRenderWindow.getShaderCache().readyShaderProgram(cellBO.getProgram());\n }\n\n cellBO.getVAO().bind();\n publicAPI.setMapperShaderParameters(cellBO, ren, actor);\n publicAPI.setCameraShaderParameters(cellBO, ren, actor);\n publicAPI.setPropertyShaderParameters(cellBO, ren, actor);\n publicAPI.getClippingPlaneShaderParameters(cellBO, ren, actor);\n };\n\n publicAPI.setMapperShaderParameters = function (cellBO, ren, actor) {\n // Now to update the VAO too, if necessary.\n var program = cellBO.getProgram();\n\n if (cellBO.getCABO().getElementCount() && (model.VBOBuildTime.getMTime() > cellBO.getAttributeUpdateTime().getMTime() || cellBO.getShaderSourceTime().getMTime() > cellBO.getAttributeUpdateTime().getMTime())) {\n if (program.isAttributeUsed('vertexDC')) {\n if (!cellBO.getVAO().addAttributeArray(program, cellBO.getCABO(), 'vertexDC', cellBO.getCABO().getVertexOffset(), cellBO.getCABO().getStride(), model.context.FLOAT, 3, model.context.FALSE)) {\n vtkErrorMacro('Error setting vertexDC in shader VAO.');\n }\n }\n\n cellBO.getAttributeUpdateTime().modified();\n }\n\n program.setUniformi('texture1', model.scalarTexture.getTextureUnit());\n program.setUniformf('sampleDistance', model.renderable.getSampleDistance());\n var volInfo = model.scalarTexture.getVolumeInfo();\n var ipScalarRange = model.renderable.getIpScalarRange();\n var minVals = [];\n var maxVals = [];\n\n for (var i = 0; i < 4; i++) {\n // convert iprange from 0-1 into data range values\n minVals[i] = ipScalarRange[0] * volInfo.dataComputedScale[i] + volInfo.dataComputedOffset[i];\n maxVals[i] = ipScalarRange[1] * volInfo.dataComputedScale[i] + volInfo.dataComputedOffset[i]; // convert data ranges into texture values\n\n minVals[i] = (minVals[i] - volInfo.offset[i]) / volInfo.scale[i];\n maxVals[i] = (maxVals[i] - volInfo.offset[i]) / volInfo.scale[i];\n }\n\n program.setUniform4f('ipScalarRangeMin', minVals[0], minVals[1], minVals[2], minVals[3]);\n program.setUniform4f('ipScalarRangeMax', maxVals[0], maxVals[1], maxVals[2], maxVals[3]); // if we have a zbuffer texture then set it\n\n if (model.zBufferTexture !== null) {\n program.setUniformi('zBufferTexture', model.zBufferTexture.getTextureUnit());\n var size = model._useSmallViewport ? [model._smallViewportWidth, model._smallViewportHeight] : model._openGLRenderWindow.getFramebufferSize();\n program.setUniformf('vpWidth', size[0]);\n program.setUniformf('vpHeight', size[1]);\n }\n };\n\n publicAPI.setCameraShaderParameters = function (cellBO, ren, actor) {\n // // [WMVP]C == {world, model, view, projection} coordinates\n // // E.g., WCPC == world to projection coordinate transformation\n var keyMats = model.openGLCamera.getKeyMatrices(ren);\n var actMats = model.openGLVolume.getKeyMatrices();\n mat4.multiply(model.modelToView, keyMats.wcvc, actMats.mcwc);\n var program = cellBO.getProgram();\n var cam = model.openGLCamera.getRenderable();\n var crange = cam.getClippingRange();\n program.setUniformf('camThick', crange[1] - crange[0]);\n program.setUniformf('camNear', crange[0]);\n program.setUniformf('camFar', crange[1]);\n var bounds = model.currentInput.getBounds();\n var dims = model.currentInput.getDimensions(); // compute the viewport bounds of the volume\n // we will only render those fragments.\n\n var pos = new Float64Array(3);\n var dir = new Float64Array(3);\n var dcxmin = 1.0;\n var dcxmax = -1.0;\n var dcymin = 1.0;\n var dcymax = -1.0;\n\n for (var i = 0; i < 8; ++i) {\n vec3.set(pos, bounds[i % 2], bounds[2 + Math.floor(i / 2) % 2], bounds[4 + Math.floor(i / 4)]);\n vec3.transformMat4(pos, pos, model.modelToView);\n\n if (!cam.getParallelProjection()) {\n vec3.normalize(dir, pos); // now find the projection of this point onto a\n // nearZ distance plane. Since the camera is at 0,0,0\n // in VC the ray is just t*pos and\n // t is -nearZ/dir.z\n // intersection becomes pos.x/pos.z\n\n var t = -crange[0] / pos[2];\n vec3.scale(pos, dir, t);\n } // now convert to DC\n\n\n vec3.transformMat4(pos, pos, keyMats.vcpc);\n dcxmin = Math.min(pos[0], dcxmin);\n dcxmax = Math.max(pos[0], dcxmax);\n dcymin = Math.min(pos[1], dcymin);\n dcymax = Math.max(pos[1], dcymax);\n }\n\n program.setUniformf('dcxmin', dcxmin);\n program.setUniformf('dcxmax', dcxmax);\n program.setUniformf('dcymin', dcymin);\n program.setUniformf('dcymax', dcymax);\n\n if (program.isUniformUsed('cameraParallel')) {\n program.setUniformi('cameraParallel', cam.getParallelProjection());\n }\n\n var ext = model.currentInput.getSpatialExtent();\n var spc = model.currentInput.getSpacing();\n var vsize = new Float64Array(3);\n vec3.set(vsize, (ext[1] - ext[0]) * spc[0], (ext[3] - ext[2]) * spc[1], (ext[5] - ext[4]) * spc[2]);\n program.setUniform3f('vSpacing', spc[0], spc[1], spc[2]);\n vec3.set(pos, ext[0], ext[2], ext[4]);\n model.currentInput.indexToWorldVec3(pos, pos);\n vec3.transformMat4(pos, pos, model.modelToView);\n program.setUniform3f('vOriginVC', pos[0], pos[1], pos[2]); // apply the image directions\n\n var i2wmat4 = model.currentInput.getIndexToWorld();\n mat4.multiply(model.idxToView, model.modelToView, i2wmat4);\n mat3.multiply(model.idxNormalMatrix, keyMats.normalMatrix, actMats.normalMatrix);\n mat3.multiply(model.idxNormalMatrix, model.idxNormalMatrix, model.currentInput.getDirectionByReference());\n var maxSamples = vec3.length(vsize) / model.renderable.getSampleDistance();\n\n if (maxSamples > model.renderable.getMaximumSamplesPerRay()) {\n vtkWarningMacro(\"The number of steps required \".concat(Math.ceil(maxSamples), \" is larger than the\\n specified maximum number of steps \").concat(model.renderable.getMaximumSamplesPerRay(), \".\\n Please either change the\\n volumeMapper sampleDistance or its maximum number of samples.\"));\n }\n\n var vctoijk = new Float64Array(3);\n vec3.set(vctoijk, 1.0, 1.0, 1.0);\n vec3.divide(vctoijk, vctoijk, vsize);\n program.setUniform3f('vVCToIJK', vctoijk[0], vctoijk[1], vctoijk[2]);\n program.setUniform3i('volumeDimensions', dims[0], dims[1], dims[2]);\n\n if (!model._openGLRenderWindow.getWebgl2()) {\n var volInfo = model.scalarTexture.getVolumeInfo();\n program.setUniformf('texWidth', model.scalarTexture.getWidth());\n program.setUniformf('texHeight', model.scalarTexture.getHeight());\n program.setUniformi('xreps', volInfo.xreps);\n program.setUniformi('xstride', volInfo.xstride);\n program.setUniformi('ystride', volInfo.ystride);\n } // map normals through normal matrix\n // then use a point on the plane to compute the distance\n\n\n var normal = new Float64Array(3);\n var pos2 = new Float64Array(3);\n\n for (var _i = 0; _i < 6; ++_i) {\n switch (_i) {\n case 1:\n vec3.set(normal, -1.0, 0.0, 0.0);\n vec3.set(pos2, ext[0], ext[2], ext[4]);\n break;\n\n case 2:\n vec3.set(normal, 0.0, 1.0, 0.0);\n vec3.set(pos2, ext[1], ext[3], ext[5]);\n break;\n\n case 3:\n vec3.set(normal, 0.0, -1.0, 0.0);\n vec3.set(pos2, ext[0], ext[2], ext[4]);\n break;\n\n case 4:\n vec3.set(normal, 0.0, 0.0, 1.0);\n vec3.set(pos2, ext[1], ext[3], ext[5]);\n break;\n\n case 5:\n vec3.set(normal, 0.0, 0.0, -1.0);\n vec3.set(pos2, ext[0], ext[2], ext[4]);\n break;\n\n case 0:\n default:\n vec3.set(normal, 1.0, 0.0, 0.0);\n vec3.set(pos2, ext[1], ext[3], ext[5]);\n break;\n }\n\n vec3.transformMat3(normal, normal, model.idxNormalMatrix);\n vec3.transformMat4(pos2, pos2, model.idxToView);\n var dist = -1.0 * vec3.dot(pos2, normal); // we have the plane in view coordinates\n // specify the planes in view coordinates\n\n program.setUniform3f(\"vPlaneNormal\".concat(_i), normal[0], normal[1], normal[2]);\n program.setUniformf(\"vPlaneDistance\".concat(_i), dist);\n }\n\n if (actor.getProperty().getUseLabelOutline()) {\n var image = model.currentInput;\n var worldToIndex = image.getWorldToIndex();\n program.setUniformMatrix('vWCtoIDX', worldToIndex);\n var camera = ren.getActiveCamera();\n\n var _camera$getClippingRa = camera.getClippingRange(),\n _camera$getClippingRa2 = _slicedToArray(_camera$getClippingRa, 2),\n cRange0 = _camera$getClippingRa2[0],\n cRange1 = _camera$getClippingRa2[1];\n\n var distance = camera.getDistance(); // set the clipping range to be model.distance and model.distance + 0.1\n // since we use the in the keyMats.wcpc (world to projection) matrix\n // the projection matrix calculation relies on the clipping range to be\n // set correctly. This is done inside the interactorStyleMPRSlice which\n // limits use cases where the interactor style is not used.\n\n camera.setClippingRange(distance, distance + 0.1);\n var labelOutlineKeyMats = model.openGLCamera.getKeyMatrices(ren); // Get the projection coordinate to world coordinate transformation matrix.\n\n mat4.invert(model.projectionToWorld, labelOutlineKeyMats.wcpc); // reset the clipping range since the keyMats are cached\n\n camera.setClippingRange(cRange0, cRange1); // to re compute the matrices for the current camera and cache them\n\n model.openGLCamera.getKeyMatrices(ren);\n program.setUniformMatrix('PCWCMatrix', model.projectionToWorld);\n var size = publicAPI.getRenderTargetSize();\n program.setUniformf('vpWidth', size[0]);\n program.setUniformf('vpHeight', size[1]);\n var offset = publicAPI.getRenderTargetOffset();\n program.setUniformf('vpOffsetX', offset[0] / size[0]);\n program.setUniformf('vpOffsetY', offset[1] / size[1]);\n }\n\n mat4.invert(model.projectionToView, keyMats.vcpc);\n program.setUniformMatrix('PCVCMatrix', model.projectionToView); // handle lighting values\n\n if (model.lastLightComplexity === 0) {\n return;\n }\n\n var lightNum = 0;\n var lightColor = [];\n var lightDir = [];\n var halfAngle = [];\n ren.getLights().forEach(function (light) {\n var status = light.getSwitch();\n\n if (status > 0) {\n var dColor = light.getColor();\n var intensity = light.getIntensity();\n lightColor[0 + lightNum * 3] = dColor[0] * intensity;\n lightColor[1 + lightNum * 3] = dColor[1] * intensity;\n lightColor[2 + lightNum * 3] = dColor[2] * intensity;\n var ldir = light.getDirection();\n vec3.set(normal, ldir[0], ldir[1], ldir[2]);\n vec3.transformMat3(normal, normal, keyMats.normalMatrix); // in view coordinat\n\n vec3.normalize(normal, normal);\n lightDir[0 + lightNum * 3] = normal[0];\n lightDir[1 + lightNum * 3] = normal[1];\n lightDir[2 + lightNum * 3] = normal[2]; // camera DOP is 0,0,-1.0 in VC\n\n halfAngle[0 + lightNum * 3] = -0.5 * normal[0];\n halfAngle[1 + lightNum * 3] = -0.5 * normal[1];\n halfAngle[2 + lightNum * 3] = -0.5 * (normal[2] - 1.0);\n lightNum++;\n }\n });\n program.setUniformi('twoSidedLighting', ren.getTwoSidedLighting());\n program.setUniformi('lightNum', lightNum);\n program.setUniform3fv('lightColor', lightColor);\n program.setUniform3fv('lightDirectionVC', lightDir);\n program.setUniform3fv('lightHalfAngleVC', halfAngle);\n\n if (model.lastLightComplexity === 3) {\n lightNum = 0;\n var lightPositionVC = [];\n var lightAttenuation = [];\n var lightConeAngle = [];\n var lightExponent = [];\n var lightPositional = [];\n ren.getLights().forEach(function (light) {\n var status = light.getSwitch();\n\n if (status > 0) {\n var attenuation = light.getAttenuationValues();\n lightAttenuation[0 + lightNum * 3] = attenuation[0];\n lightAttenuation[1 + lightNum * 3] = attenuation[1];\n lightAttenuation[2 + lightNum * 3] = attenuation[2];\n lightExponent[lightNum] = light.getExponent();\n lightConeAngle[lightNum] = light.getConeAngle();\n lightPositional[lightNum] = light.getPositional();\n var lp = light.getTransformedPosition();\n vec3.transformMat4(lp, lp, model.modelToView);\n lightPositionVC[0 + lightNum * 3] = lp[0];\n lightPositionVC[1 + lightNum * 3] = lp[1];\n lightPositionVC[2 + lightNum * 3] = lp[2];\n lightNum += 1;\n }\n });\n program.setUniform3fv('lightPositionVC', lightPositionVC);\n program.setUniform3fv('lightAttenuation', lightAttenuation);\n program.setUniformfv('lightConeAngle', lightConeAngle);\n program.setUniformfv('lightExponent', lightExponent);\n program.setUniformiv('lightPositional', lightPositional);\n }\n\n if (model.renderable.getVolumetricScatteringBlending() > 0.0) {\n program.setUniformf('giReach', model.renderable.getGlobalIlluminationReach());\n program.setUniformf('volumetricScatteringBlending', model.renderable.getVolumetricScatteringBlending());\n program.setUniformf('volumeShadowSamplingDistFactor', model.renderable.getVolumeShadowSamplingDistFactor());\n program.setUniformf('anisotropy', model.renderable.getAnisotropy());\n program.setUniformf('anisotropy2', Math.pow(model.renderable.getAnisotropy(), 2.0));\n }\n\n if (model.renderable.getLocalAmbientOcclusion() && actor.getProperty().getAmbient() > 0.0) {\n var ks = model.renderable.getLAOKernelSize();\n program.setUniformi('kernelSize', ks);\n var kernelSample = [];\n\n for (var _i2 = 0; _i2 < ks; _i2++) {\n kernelSample[_i2 * 2] = Math.random() * 0.5;\n kernelSample[_i2 * 2 + 1] = Math.random() * 0.5;\n }\n\n program.setUniform2fv('kernelSample', kernelSample);\n program.setUniformi('kernelRadius', model.renderable.getLAOKernelRadius());\n }\n };\n\n publicAPI.setPropertyShaderParameters = function (cellBO, ren, actor) {\n var program = cellBO.getProgram();\n program.setUniformi('ctexture', model.colorTexture.getTextureUnit());\n program.setUniformi('otexture', model.opacityTexture.getTextureUnit());\n program.setUniformi('jtexture', model.jitterTexture.getTextureUnit());\n var volInfo = model.scalarTexture.getVolumeInfo();\n var vprop = actor.getProperty(); // set the component mix when independent\n\n var numComp = model.scalarTexture.getComponents();\n var iComps = actor.getProperty().getIndependentComponents();\n\n if (iComps && numComp >= 2) {\n for (var i = 0; i < numComp; i++) {\n program.setUniformf(\"mix\".concat(i), actor.getProperty().getComponentWeight(i));\n }\n } // three levels of shift scale combined into one\n // for performance in the fragment shader\n\n\n for (var _i3 = 0; _i3 < numComp; _i3++) {\n var target = iComps ? _i3 : 0;\n var sscale = volInfo.scale[_i3];\n var ofun = vprop.getScalarOpacity(target);\n var oRange = ofun.getRange();\n var oscale = sscale / (oRange[1] - oRange[0]);\n var oshift = (volInfo.offset[_i3] - oRange[0]) / (oRange[1] - oRange[0]);\n program.setUniformf(\"oshift\".concat(_i3), oshift);\n program.setUniformf(\"oscale\".concat(_i3), oscale);\n var cfun = vprop.getRGBTransferFunction(target);\n var cRange = cfun.getRange();\n var cshift = (volInfo.offset[_i3] - cRange[0]) / (cRange[1] - cRange[0]);\n var cScale = sscale / (cRange[1] - cRange[0]);\n program.setUniformf(\"cshift\".concat(_i3), cshift);\n program.setUniformf(\"cscale\".concat(_i3), cScale);\n }\n\n if (model.gopacity) {\n if (iComps) {\n for (var nc = 0; nc < numComp; ++nc) {\n var _sscale = volInfo.scale[nc];\n var useGO = vprop.getUseGradientOpacity(nc);\n\n if (useGO) {\n var gomin = vprop.getGradientOpacityMinimumOpacity(nc);\n var gomax = vprop.getGradientOpacityMaximumOpacity(nc);\n program.setUniformf(\"gomin\".concat(nc), gomin);\n program.setUniformf(\"gomax\".concat(nc), gomax);\n var goRange = [vprop.getGradientOpacityMinimumValue(nc), vprop.getGradientOpacityMaximumValue(nc)];\n program.setUniformf(\"goscale\".concat(nc), _sscale * (gomax - gomin) / (goRange[1] - goRange[0]));\n program.setUniformf(\"goshift\".concat(nc), -goRange[0] * (gomax - gomin) / (goRange[1] - goRange[0]) + gomin);\n } else {\n program.setUniformf(\"gomin\".concat(nc), 1.0);\n program.setUniformf(\"gomax\".concat(nc), 1.0);\n program.setUniformf(\"goscale\".concat(nc), 0.0);\n program.setUniformf(\"goshift\".concat(nc), 1.0);\n }\n }\n } else {\n var _sscale2 = volInfo.scale[numComp - 1];\n\n var _gomin = vprop.getGradientOpacityMinimumOpacity(0);\n\n var _gomax = vprop.getGradientOpacityMaximumOpacity(0);\n\n program.setUniformf('gomin0', _gomin);\n program.setUniformf('gomax0', _gomax);\n var _goRange = [vprop.getGradientOpacityMinimumValue(0), vprop.getGradientOpacityMaximumValue(0)];\n program.setUniformf('goscale0', _sscale2 * (_gomax - _gomin) / (_goRange[1] - _goRange[0]));\n program.setUniformf('goshift0', -_goRange[0] * (_gomax - _gomin) / (_goRange[1] - _goRange[0]) + _gomin);\n }\n }\n\n var vtkImageLabelOutline = actor.getProperty().getUseLabelOutline();\n\n if (vtkImageLabelOutline === true) {\n var labelOutlineThickness = actor.getProperty().getLabelOutlineThickness();\n var labelOutlineOpacity = actor.getProperty().getLabelOutlineOpacity();\n program.setUniformi('outlineThickness', labelOutlineThickness);\n program.setUniformf('outlineOpacity', labelOutlineOpacity);\n }\n\n if (model.lastLightComplexity > 0) {\n program.setUniformf('vAmbient', vprop.getAmbient());\n program.setUniformf('vDiffuse', vprop.getDiffuse());\n program.setUniformf('vSpecular', vprop.getSpecular());\n program.setUniformf('vSpecularPower', vprop.getSpecularPower());\n }\n };\n\n publicAPI.getClippingPlaneShaderParameters = function (cellBO, ren, actor) {\n if (model.renderable.getClippingPlanes().length > 0) {\n var keyMats = model.openGLCamera.getKeyMatrices(ren);\n var clipPlaneNormals = [];\n var clipPlaneDistances = [];\n var clipPlanes = model.renderable.getClippingPlanes();\n var clipPlaneSize = clipPlanes.length;\n\n for (var i = 0; i < clipPlaneSize; ++i) {\n var clipPlaneNormal = clipPlanes[i].getNormal();\n var clipPlanePos = clipPlanes[i].getOrigin();\n vec3.transformMat3(clipPlaneNormal, clipPlaneNormal, keyMats.normalMatrix);\n vec3.transformMat4(clipPlanePos, clipPlanePos, keyMats.wcvc);\n var clipPlaneDist = -1.0 * vec3.dot(clipPlanePos, clipPlaneNormal);\n clipPlaneNormals.push(clipPlaneNormal[0]);\n clipPlaneNormals.push(clipPlaneNormal[1]);\n clipPlaneNormals.push(clipPlaneNormal[2]);\n clipPlaneDistances.push(clipPlaneDist);\n }\n\n var program = cellBO.getProgram();\n program.setUniform3fv(\"vClipPlaneNormals\", clipPlaneNormals);\n program.setUniformfv(\"vClipPlaneDistances\", clipPlaneDistances);\n }\n }; // unsubscribe from our listeners\n\n\n publicAPI.delete = chain(function () {\n if (model._animationRateSubscription) {\n model._animationRateSubscription.unsubscribe();\n\n model._animationRateSubscription = null;\n }\n }, publicAPI.delete);\n\n publicAPI.getRenderTargetSize = function () {\n if (model._useSmallViewport) {\n return [model._smallViewportWidth, model._smallViewportHeight];\n }\n\n var _model$_openGLRendere = model._openGLRenderer.getTiledSizeAndOrigin(),\n usize = _model$_openGLRendere.usize,\n vsize = _model$_openGLRendere.vsize;\n\n return [usize, vsize];\n };\n\n publicAPI.getRenderTargetOffset = function () {\n var _model$_openGLRendere2 = model._openGLRenderer.getTiledSizeAndOrigin(),\n lowerLeftU = _model$_openGLRendere2.lowerLeftU,\n lowerLeftV = _model$_openGLRendere2.lowerLeftV;\n\n return [lowerLeftU, lowerLeftV];\n };\n\n publicAPI.renderPieceStart = function (ren, actor) {\n var rwi = ren.getVTKWindow().getInteractor();\n model._useSmallViewport = false;\n\n if (rwi.isAnimating() && model._lastScale > 1.5) {\n model._useSmallViewport = true;\n }\n\n if (!model._animationRateSubscription) {\n // when the animation frame rate changes recompute the scale factor\n model._animationRateSubscription = rwi.onAnimationFrameRateUpdate(function () {\n if (model.renderable.getAutoAdjustSampleDistances()) {\n var frate = rwi.getRecentAnimationFrameRate();\n var adjustment = rwi.getDesiredUpdateRate() / frate; // only change if we are off by 15%\n\n if (adjustment > 1.15 || adjustment < 0.85) {\n model._lastScale *= adjustment;\n } // clamp scale to some reasonable values.\n // Below 1.5 we will just be using full resolution as that is close enough\n // Above 400 seems like a lot so we limit to that 1/20th per axis\n\n\n if (model._lastScale > 400) {\n model._lastScale = 400;\n }\n\n if (model._lastScale < 1.5) {\n model._lastScale = 1.5;\n }\n } else {\n model._lastScale = model.renderable.getImageSampleDistance() * model.renderable.getImageSampleDistance();\n }\n\n var size = model._openGLRenderWindow.getFramebufferSize();\n\n model._smallViewportWidth = Math.ceil(size[0] / Math.sqrt(model._lastScale));\n model._smallViewportHeight = Math.ceil(size[1] / Math.sqrt(model._lastScale));\n });\n } // use/create/resize framebuffer if needed\n\n\n if (model._useSmallViewport) {\n var size = model._openGLRenderWindow.getFramebufferSize(); // adjust viewportSize to always be at most the dest fo size\n\n\n if (model._smallViewportHeight > size[1]) {\n model._smallViewportHeight = size[1];\n }\n\n if (model._smallViewportWidth > size[0]) {\n model._smallViewportWidth = size[0];\n }\n\n model.framebuffer.saveCurrentBindingsAndBuffers();\n\n if (model.framebuffer.getGLFramebuffer() === null) {\n model.framebuffer.create(size[0], size[1]);\n model.framebuffer.populateFramebuffer();\n } else {\n var fbSize = model.framebuffer.getSize();\n\n if (fbSize[0] !== size[0] || fbSize[1] !== size[1]) {\n model.framebuffer.create(size[0], size[1]);\n model.framebuffer.populateFramebuffer();\n }\n }\n\n model.framebuffer.bind();\n var gl = model.context;\n gl.clearColor(0.0, 0.0, 0.0, 0.0);\n gl.colorMask(true, true, true, true);\n gl.clear(gl.COLOR_BUFFER_BIT);\n gl.viewport(0, 0, model._smallViewportWidth, model._smallViewportHeight);\n model.fvp = [model._smallViewportWidth / size[0], model._smallViewportHeight / size[1]];\n }\n\n model.context.disable(model.context.DEPTH_TEST); // make sure the BOs are up to date\n\n publicAPI.updateBufferObjects(ren, actor); // set interpolation on the texture based on property setting\n\n var iType = actor.getProperty().getInterpolationType();\n\n if (iType === InterpolationType.NEAREST) {\n model.scalarTexture.setMinificationFilter(Filter.NEAREST);\n model.scalarTexture.setMagnificationFilter(Filter.NEAREST);\n } else {\n model.scalarTexture.setMinificationFilter(Filter.LINEAR);\n model.scalarTexture.setMagnificationFilter(Filter.LINEAR);\n } // Bind the OpenGL, this is shared between the different primitive/cell types.\n\n\n model.lastBoundBO = null; // if we have a zbuffer texture then activate it\n\n if (model.zBufferTexture !== null) {\n model.zBufferTexture.activate();\n }\n };\n\n publicAPI.renderPieceDraw = function (ren, actor) {\n var gl = model.context; // render the texture\n\n model.scalarTexture.activate();\n model.opacityTexture.activate();\n model.colorTexture.activate();\n model.jitterTexture.activate();\n publicAPI.updateShaders(model.tris, ren, actor); // First we do the triangles, update the shader, set uniforms, etc.\n // for (let i = 0; i < 11; ++i) {\n // gl.drawArrays(gl.TRIANGLES, 66 * i, 66);\n // }\n\n gl.drawArrays(gl.TRIANGLES, 0, model.tris.getCABO().getElementCount());\n model.tris.getVAO().release();\n model.scalarTexture.deactivate();\n model.colorTexture.deactivate();\n model.opacityTexture.deactivate();\n model.jitterTexture.deactivate();\n };\n\n publicAPI.renderPieceFinish = function (ren, actor) {\n // if we have a zbuffer texture then deactivate it\n if (model.zBufferTexture !== null) {\n model.zBufferTexture.deactivate();\n }\n\n if (model._useSmallViewport) {\n // now copy the framebuffer with the volume into the\n // regular buffer\n model.framebuffer.restorePreviousBindingsAndBuffers();\n\n if (model.copyShader === null) {\n model.copyShader = model._openGLRenderWindow.getShaderCache().readyShaderProgramArray(['//VTK::System::Dec', 'attribute vec4 vertexDC;', 'uniform vec2 tfactor;', 'varying vec2 tcoord;', 'void main() { tcoord = vec2(vertexDC.x*0.5 + 0.5, vertexDC.y*0.5 + 0.5) * tfactor; gl_Position = vertexDC; }'].join('\\n'), ['//VTK::System::Dec', '//VTK::Output::Dec', 'uniform sampler2D texture1;', 'varying vec2 tcoord;', 'void main() { gl_FragData[0] = texture2D(texture1,tcoord); }'].join('\\n'), '');\n var program = model.copyShader;\n model.copyVAO = vtkVertexArrayObject.newInstance();\n model.copyVAO.setOpenGLRenderWindow(model._openGLRenderWindow);\n model.tris.getCABO().bind();\n\n if (!model.copyVAO.addAttributeArray(program, model.tris.getCABO(), 'vertexDC', model.tris.getCABO().getVertexOffset(), model.tris.getCABO().getStride(), model.context.FLOAT, 3, model.context.FALSE)) {\n vtkErrorMacro('Error setting vertexDC in copy shader VAO.');\n }\n } else {\n model._openGLRenderWindow.getShaderCache().readyShaderProgram(model.copyShader);\n }\n\n var size = model._openGLRenderWindow.getFramebufferSize();\n\n model.context.viewport(0, 0, size[0], size[1]); // activate texture\n\n var tex = model.framebuffer.getColorTexture();\n tex.activate();\n model.copyShader.setUniformi('texture', tex.getTextureUnit());\n model.copyShader.setUniform2f('tfactor', model.fvp[0], model.fvp[1]);\n var gl = model.context;\n gl.blendFuncSeparate(gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA); // render quad\n\n model.context.drawArrays(model.context.TRIANGLES, 0, model.tris.getCABO().getElementCount());\n tex.deactivate();\n gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n }\n };\n\n publicAPI.renderPiece = function (ren, actor) {\n publicAPI.invokeEvent({\n type: 'StartEvent'\n });\n model.renderable.update();\n model.currentInput = model.renderable.getInputData();\n publicAPI.invokeEvent({\n type: 'EndEvent'\n });\n\n if (!model.currentInput) {\n vtkErrorMacro('No input!');\n return;\n }\n\n publicAPI.renderPieceStart(ren, actor);\n publicAPI.renderPieceDraw(ren, actor);\n publicAPI.renderPieceFinish(ren, actor);\n };\n\n publicAPI.computeBounds = function (ren, actor) {\n if (!publicAPI.getInput()) {\n uninitializeBounds(model.Bounds);\n return;\n }\n\n model.bounds = publicAPI.getInput().getBounds();\n };\n\n publicAPI.updateBufferObjects = function (ren, actor) {\n // Rebuild buffers if needed\n if (publicAPI.getNeedToRebuildBufferObjects(ren, actor)) {\n publicAPI.buildBufferObjects(ren, actor);\n }\n };\n\n publicAPI.getNeedToRebuildBufferObjects = function (ren, actor) {\n // first do a coarse check\n if (model.VBOBuildTime.getMTime() < publicAPI.getMTime() || model.VBOBuildTime.getMTime() < actor.getMTime() || model.VBOBuildTime.getMTime() < model.renderable.getMTime() || model.VBOBuildTime.getMTime() < actor.getProperty().getMTime() || model.VBOBuildTime.getMTime() < model.currentInput.getMTime()) {\n return true;\n }\n\n return false;\n };\n\n publicAPI.buildBufferObjects = function (ren, actor) {\n var image = model.currentInput;\n\n if (!image) {\n return;\n }\n\n var scalars = image.getPointData() && image.getPointData().getScalars();\n\n if (!scalars) {\n return;\n }\n\n var vprop = actor.getProperty();\n\n if (!model.jitterTexture.getHandle()) {\n var oTable = new Uint8Array(32 * 32);\n\n for (var i = 0; i < 32 * 32; ++i) {\n oTable[i] = 255.0 * Math.random();\n }\n\n model.jitterTexture.setMinificationFilter(Filter.LINEAR);\n model.jitterTexture.setMagnificationFilter(Filter.LINEAR);\n model.jitterTexture.create2DFromRaw(32, 32, 1, VtkDataTypes.UNSIGNED_CHAR, oTable);\n }\n\n var numComp = scalars.getNumberOfComponents();\n var iComps = vprop.getIndependentComponents();\n var numIComps = iComps ? numComp : 1; // rebuild opacity tfun?\n\n var toString = \"\".concat(vprop.getMTime());\n\n if (model.opacityTextureString !== toString) {\n var oWidth = 1024;\n var oSize = oWidth * 2 * numIComps;\n var ofTable = new Float32Array(oSize);\n var tmpTable = new Float32Array(oWidth);\n\n for (var c = 0; c < numIComps; ++c) {\n var ofun = vprop.getScalarOpacity(c);\n var opacityFactor = model.renderable.getSampleDistance() / vprop.getScalarOpacityUnitDistance(c);\n var oRange = ofun.getRange();\n ofun.getTable(oRange[0], oRange[1], oWidth, tmpTable, 1); // adjust for sample distance etc\n\n for (var _i4 = 0; _i4 < oWidth; ++_i4) {\n ofTable[c * oWidth * 2 + _i4] = 1.0 - Math.pow(1.0 - tmpTable[_i4], opacityFactor);\n ofTable[c * oWidth * 2 + _i4 + oWidth] = ofTable[c * oWidth * 2 + _i4];\n }\n }\n\n model.opacityTexture.releaseGraphicsResources(model._openGLRenderWindow);\n model.opacityTexture.setMinificationFilter(Filter.LINEAR);\n model.opacityTexture.setMagnificationFilter(Filter.LINEAR); // use float texture where possible because we really need the resolution\n // for this table. Errors in low values of opacity accumulate to\n // visible artifacts. High values of opacity quickly terminate without\n // artifacts.\n\n if (model._openGLRenderWindow.getWebgl2() || model.context.getExtension('OES_texture_float') && model.context.getExtension('OES_texture_float_linear')) {\n model.opacityTexture.create2DFromRaw(oWidth, 2 * numIComps, 1, VtkDataTypes.FLOAT, ofTable);\n } else {\n var _oTable = new Uint8Array(oSize);\n\n for (var _i5 = 0; _i5 < oSize; ++_i5) {\n _oTable[_i5] = 255.0 * ofTable[_i5];\n }\n\n model.opacityTexture.create2DFromRaw(oWidth, 2 * numIComps, 1, VtkDataTypes.UNSIGNED_CHAR, _oTable);\n }\n\n model.opacityTextureString = toString;\n } // rebuild color tfun?\n\n\n toString = \"\".concat(vprop.getMTime());\n\n if (model.colorTextureString !== toString) {\n var cWidth = 1024;\n var cSize = cWidth * 2 * numIComps * 3;\n var cTable = new Uint8Array(cSize);\n\n var _tmpTable = new Float32Array(cWidth * 3);\n\n for (var _c = 0; _c < numIComps; ++_c) {\n var cfun = vprop.getRGBTransferFunction(_c);\n var cRange = cfun.getRange();\n cfun.getTable(cRange[0], cRange[1], cWidth, _tmpTable, 1);\n\n for (var _i6 = 0; _i6 < cWidth * 3; ++_i6) {\n cTable[_c * cWidth * 6 + _i6] = 255.0 * _tmpTable[_i6];\n cTable[_c * cWidth * 6 + _i6 + cWidth * 3] = 255.0 * _tmpTable[_i6];\n }\n }\n\n model.colorTexture.releaseGraphicsResources(model._openGLRenderWindow);\n model.colorTexture.setMinificationFilter(Filter.LINEAR);\n model.colorTexture.setMagnificationFilter(Filter.LINEAR);\n model.colorTexture.create2DFromRaw(cWidth, 2 * numIComps, 3, VtkDataTypes.UNSIGNED_CHAR, cTable);\n model.colorTextureString = toString;\n } // rebuild the scalarTexture if the data has changed\n\n\n toString = \"\".concat(image.getMTime());\n\n if (model.scalarTextureString !== toString) {\n // Build the textures\n var dims = image.getDimensions(); // Use norm16 for scalar texture if the extension is available\n\n model.scalarTexture.setOglNorm16Ext(model.context.getExtension('EXT_texture_norm16'));\n model.scalarTexture.releaseGraphicsResources(model._openGLRenderWindow);\n model.scalarTexture.resetFormatAndType();\n model.scalarTexture.create3DFilterableFromDataArray(dims[0], dims[1], dims[2], scalars, model.renderable.getPreferSizeOverAccuracy());\n model.scalarTextureString = toString;\n }\n\n if (!model.tris.getCABO().getElementCount()) {\n // build the CABO\n var ptsArray = new Float32Array(12);\n\n for (var _i7 = 0; _i7 < 4; _i7++) {\n ptsArray[_i7 * 3] = _i7 % 2 * 2 - 1.0;\n ptsArray[_i7 * 3 + 1] = _i7 > 1 ? 1.0 : -1.0;\n ptsArray[_i7 * 3 + 2] = -1.0;\n }\n\n var cellArray = new Uint16Array(8);\n cellArray[0] = 3;\n cellArray[1] = 0;\n cellArray[2] = 1;\n cellArray[3] = 3;\n cellArray[4] = 3;\n cellArray[5] = 0;\n cellArray[6] = 3;\n cellArray[7] = 2; // const dim = 12.0;\n // const ptsArray = new Float32Array(3 * dim * dim);\n // for (let i = 0; i < dim; i++) {\n // for (let j = 0; j < dim; j++) {\n // const offset = ((i * dim) + j) * 3;\n // ptsArray[offset] = (2.0 * (i / (dim - 1.0))) - 1.0;\n // ptsArray[offset + 1] = (2.0 * (j / (dim - 1.0))) - 1.0;\n // ptsArray[offset + 2] = -1.0;\n // }\n // }\n // const cellArray = new Uint16Array(8 * (dim - 1) * (dim - 1));\n // for (let i = 0; i < dim - 1; i++) {\n // for (let j = 0; j < dim - 1; j++) {\n // const offset = 8 * ((i * (dim - 1)) + j);\n // cellArray[offset] = 3;\n // cellArray[offset + 1] = (i * dim) + j;\n // cellArray[offset + 2] = (i * dim) + 1 + j;\n // cellArray[offset + 3] = ((i + 1) * dim) + 1 + j;\n // cellArray[offset + 4] = 3;\n // cellArray[offset + 5] = (i * dim) + j;\n // cellArray[offset + 6] = ((i + 1) * dim) + 1 + j;\n // cellArray[offset + 7] = ((i + 1) * dim) + j;\n // }\n // }\n\n var points = vtkDataArray.newInstance({\n numberOfComponents: 3,\n values: ptsArray\n });\n points.setName('points');\n var cells = vtkDataArray.newInstance({\n numberOfComponents: 1,\n values: cellArray\n });\n model.tris.getCABO().createVBO(cells, 'polys', Representation.SURFACE, {\n points: points,\n cellOffset: 0\n });\n }\n\n model.VBOBuildTime.modified();\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n context: null,\n VBOBuildTime: null,\n scalarTexture: null,\n scalarTextureString: null,\n opacityTexture: null,\n opacityTextureString: null,\n colorTexture: null,\n colorTextureString: null,\n jitterTexture: null,\n tris: null,\n framebuffer: null,\n copyShader: null,\n copyVAO: null,\n lastXYF: 1.0,\n targetXYF: 1.0,\n zBufferTexture: null,\n lastZBufferTexture: null,\n lastLightComplexity: 0,\n fullViewportTime: 1.0,\n idxToView: null,\n idxNormalMatrix: null,\n modelToView: null,\n projectionToView: null,\n avgWindowArea: 0.0,\n avgFrameTime: 0.0\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkViewNode.extend(publicAPI, model, initialValues);\n model.VBOBuildTime = {};\n obj(model.VBOBuildTime, {\n mtime: 0\n });\n model.tris = vtkHelper.newInstance();\n model.scalarTexture = vtkOpenGLTexture.newInstance();\n model.opacityTexture = vtkOpenGLTexture.newInstance();\n model.colorTexture = vtkOpenGLTexture.newInstance();\n model.jitterTexture = vtkOpenGLTexture.newInstance();\n model.jitterTexture.setWrapS(Wrap.REPEAT);\n model.jitterTexture.setWrapT(Wrap.REPEAT);\n model.framebuffer = vtkOpenGLFramebuffer.newInstance();\n model.idxToView = mat4.identity(new Float64Array(16));\n model.idxNormalMatrix = mat3.identity(new Float64Array(9));\n model.modelToView = mat4.identity(new Float64Array(16));\n model.projectionToView = mat4.identity(new Float64Array(16));\n model.projectionToWorld = mat4.identity(new Float64Array(16));\n model._lastScale = 1.0; // Build VTK API\n\n setGet(publicAPI, model, ['context']); // Object methods\n\n vtkOpenGLVolumeMapper(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend, 'vtkOpenGLVolumeMapper'); // ----------------------------------------------------------------------------\n\nvar vtkVolumeMapper = {\n newInstance: newInstance,\n extend: extend\n}; // Register ourself to OpenGL backend if imported\n\nregisterOverride('vtkVolumeMapper', newInstance);\n\nexport { vtkVolumeMapper as default, extend, newInstance };\n","import { newInstance as newInstance$1, vtkDebugMacro as vtkDebugMacro$1 } from '../../macros.js';\nimport vtkViewNode from '../SceneGraph/ViewNode.js';\nimport { registerOverride } from './ViewNodeFactory.js';\n\n// import { mat4, vec3 } from 'gl-matrix';\nvar vtkDebugMacro = vtkDebugMacro$1; // ----------------------------------------------------------------------------\n// vtkOpenGLPixelSpaceCallbackMapper methods\n// ----------------------------------------------------------------------------\n\nfunction vtkOpenGLPixelSpaceCallbackMapper(publicAPI, model) {\n model.classHierarchy.push('vtkOpenGLPixelSpaceCallbackMapper');\n\n publicAPI.opaquePass = function (prepass, renderPass) {\n model._openGLRenderer = publicAPI.getFirstAncestorOfType('vtkOpenGLRenderer');\n model._openGLRenderWindow = model._openGLRenderer.getParent();\n\n var aspectRatio = model._openGLRenderer.getAspectRatio();\n\n var camera = model._openGLRenderer ? model._openGLRenderer.getRenderable().getActiveCamera() : null;\n\n var tsize = model._openGLRenderer.getTiledSizeAndOrigin();\n\n var texels = null;\n\n if (model.renderable.getUseZValues()) {\n var zbt = renderPass.getZBufferTexture();\n var width = Math.floor(zbt.getWidth());\n var height = Math.floor(zbt.getHeight());\n\n var gl = model._openGLRenderWindow.getContext();\n\n zbt.bind(); // Here we need to use vtkFramebuffer to save current settings (bindings/buffers)\n\n var fb = renderPass.getFramebuffer();\n\n if (!fb) {\n vtkDebugMacro('No framebuffer to save/restore');\n } else {\n // save framebuffer settings\n fb.saveCurrentBindingsAndBuffers();\n }\n\n var framebuffer = gl.createFramebuffer();\n gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, zbt.getHandle(), 0);\n\n if (gl.checkFramebufferStatus(gl.FRAMEBUFFER) === gl.FRAMEBUFFER_COMPLETE) {\n texels = new Uint8Array(width * height * 4);\n gl.viewport(0, 0, width, height);\n gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, texels);\n } // Now we need to restore framebuffer bindings/buffers\n\n\n if (fb) {\n fb.restorePreviousBindingsAndBuffers();\n }\n\n gl.deleteFramebuffer(framebuffer);\n }\n\n model.renderable.invokeCallback(model.renderable.getInputData(), camera, aspectRatio, tsize, texels);\n };\n\n publicAPI.queryPass = function (prepass, renderPass) {\n if (prepass) {\n if (model.renderable.getUseZValues()) {\n renderPass.requestDepth();\n }\n }\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkViewNode.extend(publicAPI, model, initialValues); // Object methods\n\n vtkOpenGLPixelSpaceCallbackMapper(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend, 'vtkOpenGLPixelSpaceCallbackMapper'); // ----------------------------------------------------------------------------\n\nvar vtkPixelSpaceCallbackMapper = {\n newInstance: newInstance,\n extend: extend\n}; // Register ourself to OpenGL backend if imported\n\nregisterOverride('vtkPixelSpaceCallbackMapper', newInstance);\n\nexport { vtkPixelSpaceCallbackMapper as default, extend, newInstance };\n","import macro from '../../macros.js';\nimport vtkViewNodeFactory from '../SceneGraph/ViewNodeFactory.js';\n\nvar CLASS_MAPPING = Object.create(null);\nfunction registerOverride(className, fn) {\n CLASS_MAPPING[className] = fn;\n} // ----------------------------------------------------------------------------\n// vtkWebGPUViewNodeFactory methods\n// ----------------------------------------------------------------------------\n\nfunction vtkWebGPUViewNodeFactory(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkWebGPUViewNodeFactory');\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Static class mapping shared across instances\n\n model.overrides = CLASS_MAPPING; // Inheritance\n\n vtkViewNodeFactory.extend(publicAPI, model, initialValues); // Object methods\n\n vtkWebGPUViewNodeFactory(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkWebGPUViewNodeFactory'); // ----------------------------------------------------------------------------\n\nvar vtkWebGPUViewNodeFactory$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkWebGPUViewNodeFactory$1 as default, extend, newInstance, registerOverride };\n","import { mat4 } from 'gl-matrix';\nimport macro from '../../macros.js';\nimport vtkViewNode from '../SceneGraph/ViewNode.js';\nimport { registerOverride } from './ViewNodeFactory.js';\n\n// vtkWebGPUCamera methods\n// ----------------------------------------------------------------------------\n\nfunction vtkWebGPUCamera(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkWebGPUCamera');\n\n publicAPI.getProjectionMatrix = function (outMat, aspect, cRange, windowCenter) {\n mat4.identity(outMat);\n\n if (model.renderable.getParallelProjection()) {\n // set up a rectangular parallelipiped\n var parallelScale = model.renderable.getParallelScale();\n var width = parallelScale * aspect;\n var height = parallelScale;\n var xmin = (windowCenter[0] - 1.0) * width;\n var xmax = (windowCenter[0] + 1.0) * width;\n var ymin = (windowCenter[1] - 1.0) * height;\n var ymax = (windowCenter[1] + 1.0) * height;\n var xr = 1.0 / (xmax - xmin);\n var yr = 1.0 / (ymax - ymin);\n outMat[0] = 2.0 * xr;\n outMat[5] = 2.0 * yr;\n outMat[10] = 1.0 / (cRange[1] - cRange[0]);\n outMat[12] = (xmax + xmin) * xr;\n outMat[13] = (ymax + ymin) * yr;\n outMat[14] = cRange[1] / (cRange[1] - cRange[0]);\n } else {\n var tmp = Math.tan(Math.PI * model.renderable.getViewAngle() / 360.0);\n\n var _width;\n\n var _height;\n\n if (model.renderable.getUseHorizontalViewAngle() === true) {\n _width = cRange[0] * tmp;\n _height = cRange[0] * tmp / aspect;\n } else {\n _width = cRange[0] * tmp * aspect;\n _height = cRange[0] * tmp;\n }\n\n var _xmin = (windowCenter[0] - 1.0) * _width;\n\n var _xmax = (windowCenter[0] + 1.0) * _width;\n\n var _ymin = (windowCenter[1] - 1.0) * _height;\n\n var _ymax = (windowCenter[1] + 1.0) * _height;\n\n outMat[0] = 2.0 * cRange[0] / (_xmax - _xmin);\n outMat[5] = 2.0 * cRange[0] / (_ymax - _ymin);\n outMat[12] = (_xmin + _xmax) / (_xmax - _xmin);\n outMat[13] = (_ymin + _ymax) / (_ymax - _ymin);\n outMat[10] = 0.0;\n outMat[14] = cRange[0];\n outMat[11] = -1.0;\n outMat[15] = 0.0;\n }\n };\n\n publicAPI.convertToOpenGLDepth = function (val) {\n if (model.renderable.getParallelProjection()) {\n return 1.0 - val;\n }\n\n var cRange = model.renderable.getClippingRangeByReference();\n var zval = -cRange[0] / val;\n zval = (cRange[0] + cRange[1]) / (cRange[1] - cRange[0]) + 2.0 * cRange[0] * cRange[1] / (zval * (cRange[1] - cRange[0]));\n return 0.5 * zval + 0.5;\n };\n\n publicAPI.getKeyMatrices = function (webGPURenderer) {\n // has the camera changed?\n var ren = webGPURenderer.getRenderable();\n var webGPURenderWindow = webGPURenderer.getParent();\n\n if (Math.max(webGPURenderWindow.getMTime(), publicAPI.getMTime(), ren.getMTime(), model.renderable.getMTime(), webGPURenderer.getStabilizedTime()) > model.keyMatrixTime.getMTime()) {\n var wcvc = model.renderable.getViewMatrix();\n mat4.copy(model.keyMatrices.normalMatrix, wcvc); // zero out translation\n\n model.keyMatrices.normalMatrix[3] = 0.0;\n model.keyMatrices.normalMatrix[7] = 0.0;\n model.keyMatrices.normalMatrix[11] = 0.0;\n mat4.invert(model.keyMatrices.normalMatrix, model.keyMatrices.normalMatrix);\n mat4.transpose(model.keyMatrices.wcvc, wcvc);\n var center = webGPURenderer.getStabilizedCenterByReference();\n mat4.translate(model.keyMatrices.scvc, model.keyMatrices.wcvc, center);\n var aspectRatio = webGPURenderer.getAspectRatio();\n var cRange = model.renderable.getClippingRangeByReference();\n publicAPI.getProjectionMatrix(model.keyMatrices.vcpc, aspectRatio, cRange, model.renderable.getWindowCenterByReference());\n mat4.multiply(model.keyMatrices.scpc, model.keyMatrices.vcpc, model.keyMatrices.scvc);\n mat4.invert(model.keyMatrices.pcsc, model.keyMatrices.scpc);\n model.keyMatrixTime.modified();\n }\n\n return model.keyMatrices;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n keyMatrixTime: null,\n keyMatrices: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkViewNode.extend(publicAPI, model, initialValues);\n model.keyMatrixTime = {};\n macro.obj(model.keyMatrixTime); // values always get set by the get method\n\n model.keyMatrices = {\n normalMatrix: new Float64Array(16),\n vcpc: new Float64Array(16),\n pcsc: new Float64Array(16),\n wcvc: new Float64Array(16),\n scpc: new Float64Array(16),\n scvc: new Float64Array(16)\n }; // Build VTK API\n\n macro.setGet(publicAPI, model, ['keyMatrixTime']); // Object methods\n\n vtkWebGPUCamera(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend); // ----------------------------------------------------------------------------\n\nvar index = {\n newInstance: newInstance,\n extend: extend\n}; // Register ourself to WebGPU backend if imported\n\nregisterOverride('vtkCamera', newInstance);\n\nexport { index as default, extend, newInstance };\n","import macro from '../../macros.js';\n\n// vtkWebGPUBindGroup methods\n// ----------------------------------------------------------------------------\n\nfunction vtkWebGPUBindGroup(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkWebGPUBindGroup');\n\n publicAPI.setBindables = function (bindables) {\n // is there a difference between the old and new list?\n if (model.bindables.length === bindables.length) {\n var allMatch = true;\n\n for (var i = 0; i < model.bindables.length; i++) {\n if (model.bindables[i] !== bindables[i]) {\n allMatch = false;\n }\n }\n\n if (allMatch) {\n return;\n }\n } // there is a difference\n\n\n model.bindables = bindables;\n publicAPI.modified();\n };\n\n publicAPI.getBindGroupLayout = function (device) {\n var entries = [];\n\n for (var i = 0; i < model.bindables.length; i++) {\n var entry = model.bindables[i].getBindGroupLayoutEntry();\n entry.binding = i;\n entries.push(entry);\n }\n\n return device.getBindGroupLayout({\n entries: entries\n });\n };\n\n publicAPI.getBindGroup = function (device) {\n // check mtime\n var mtime = publicAPI.getMTime();\n\n for (var i = 0; i < model.bindables.length; i++) {\n var tm = model.bindables[i].getBindGroupTime().getMTime();\n mtime = tm > mtime ? tm : mtime;\n }\n\n if (mtime < model.bindGroupTime.getMTime()) {\n return model.bindGroup;\n }\n\n var entries = [];\n\n for (var _i = 0; _i < model.bindables.length; _i++) {\n var entry = model.bindables[_i].getBindGroupEntry();\n\n entry.binding = _i;\n entries.push(entry);\n }\n\n model.bindGroup = device.getHandle().createBindGroup({\n layout: publicAPI.getBindGroupLayout(device),\n entries: entries,\n label: model.label\n });\n model.bindGroupTime.modified();\n return model.bindGroup;\n };\n\n publicAPI.getShaderCode = function (pipeline) {\n var lines = [];\n var bgroup = pipeline.getBindGroupLayoutCount(model.label);\n\n for (var i = 0; i < model.bindables.length; i++) {\n lines.push(model.bindables[i].getShaderCode(i, bgroup));\n }\n\n return lines.join('\\n');\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n device: null,\n handle: null,\n label: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Object methods\n\n macro.obj(publicAPI, model);\n model.bindables = [];\n model.bindGroupTime = {};\n macro.obj(model.bindGroupTime, {\n mtime: 0\n });\n macro.get(publicAPI, model, ['bindGroupTime', 'handle', 'sizeInBytes', 'usage']);\n macro.setGet(publicAPI, model, ['label', 'device', 'arrayInformation']);\n vtkWebGPUBindGroup(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend); // ----------------------------------------------------------------------------\n\nvar vtkWebGPUBindGroup$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkWebGPUBindGroup$1 as default, extend, newInstance };\n","import macro from '../../macros.js';\n\n// vtkWebGPUShaderModule methods\n// ----------------------------------------------------------------------------\n\nfunction vtkWebGPUShaderModule(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkWebGPUShaderModule');\n\n publicAPI.initialize = function (device, shaderDesc) {\n model.device = device; // console.log(shaderDesc.getCode());\n\n model.handle = model.device.getHandle().createShaderModule({\n code: shaderDesc.getCode()\n });\n }; // publicAPI.setLastCameraMTime = (mtime) => {\n // model.lastCameraMTime = mtime;\n // };\n\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n device: null,\n handle: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Build VTK API\n\n macro.obj(publicAPI, model);\n macro.get(publicAPI, model, ['lastCameraMTime']);\n macro.setGet(publicAPI, model, ['device', 'handle']); // Object methods\n\n vtkWebGPUShaderModule(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\n\nvar newInstance = macro.newInstance(extend, 'vtkWebGPUShaderModule'); // ----------------------------------------------------------------------------\n\nvar vtkWebGPUShaderModule$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkWebGPUShaderModule$1 as default };\n","import macro from '../../macros.js';\nimport vtkWebGPUShaderModule from './ShaderModule.js';\n\n// this is useful for building up shader strings which typically involve\n// lots of string substitutions. Return true if a substitution was done.\n\nfunction substitute(source, search, replace) {\n var all = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var replaceStr = Array.isArray(replace) ? replace.join('\\n') : replace;\n var replaced = false;\n\n if (source.search(search) !== -1) {\n replaced = true;\n }\n\n var gflag = '';\n\n if (all) {\n gflag = 'g';\n }\n\n var regex = new RegExp(search, gflag);\n var resultstr = source.replace(regex, replaceStr);\n return {\n replace: replaced,\n result: resultstr\n };\n} // ----------------------------------------------------------------------------\n// vtkWebGPUShaderCache methods\n// ----------------------------------------------------------------------------\n\n\nfunction vtkWebGPUShaderCache(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkWebGPUShaderCache');\n\n publicAPI.getShaderModule = function (shaderDesc) {\n // has it already been created?\n var sType = shaderDesc.getType();\n var sHash = shaderDesc.getHash();\n\n var keys = model._shaderModules.keys();\n\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n\n if (key.getHash() === sHash && key.getType() === sType) {\n return model._shaderModules.get(key);\n }\n } // console.log(JSON.stringify(shaderDesc));\n\n\n var sm = vtkWebGPUShaderModule.newInstance();\n sm.initialize(model.device, shaderDesc);\n\n model._shaderModules.set(shaderDesc, sm);\n\n return sm;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n shaderModules: null,\n device: null,\n window: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Internal objects\n\n model._shaderModules = new Map(); // Build VTK API\n\n macro.obj(publicAPI, model);\n macro.setGet(publicAPI, model, ['device', 'window']); // Object methods\n\n vtkWebGPUShaderCache(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkWebGPUShaderCache'); // ----------------------------------------------------------------------------\n\nvar vtkWebGPUShaderCache$1 = {\n newInstance: newInstance,\n extend: extend,\n substitute: substitute\n};\n\nexport { vtkWebGPUShaderCache$1 as default, extend, newInstance };\n","import { newInstance as newInstance$1, obj, get, setGet } from '../../macros.js';\n\n// vtkWebGPUPipeline methods\n// ----------------------------------------------------------------------------\n\nfunction vtkWebGPUPipeline(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkWebGPUPipeline');\n\n publicAPI.getShaderDescriptions = function () {\n return model.shaderDescriptions;\n };\n\n publicAPI.initialize = function (device, hash) {\n // start with the renderencoder settings\n model.pipelineDescription = model.renderEncoder.getPipelineSettings();\n model.pipelineDescription.primitive.topology = model.topology;\n model.pipelineDescription.vertex = model.vertexState;\n model.pipelineDescription.label = hash; // add in bind group layouts\n\n var bindGroupLayouts = [];\n\n for (var i = 0; i < model.layouts.length; i++) {\n bindGroupLayouts.push(model.layouts[i].layout);\n }\n\n model.pipelineLayout = device.getHandle().createPipelineLayout({\n bindGroupLayouts: bindGroupLayouts\n });\n model.pipelineDescription.layout = model.pipelineLayout;\n\n for (var _i = 0; _i < model.shaderDescriptions.length; _i++) {\n var sd = model.shaderDescriptions[_i];\n var sm = device.getShaderModule(sd);\n\n if (sd.getType() === 'vertex') {\n model.pipelineDescription.vertex.module = sm.getHandle();\n model.pipelineDescription.vertex.entryPoint = 'main';\n }\n\n if (sd.getType() === 'fragment') {\n model.pipelineDescription.fragment.module = sm.getHandle();\n model.pipelineDescription.fragment.entryPoint = 'main';\n }\n }\n\n model.handle = device.getHandle().createRenderPipeline(model.pipelineDescription);\n };\n\n publicAPI.getShaderDescription = function (stype) {\n for (var i = 0; i < model.shaderDescriptions.length; i++) {\n if (model.shaderDescriptions[i].getType() === stype) return model.shaderDescriptions[i];\n }\n\n return null;\n };\n\n publicAPI.addBindGroupLayout = function (bindGroup) {\n if (!bindGroup) {\n return;\n }\n\n model.layouts.push({\n layout: bindGroup.getBindGroupLayout(model.device),\n label: bindGroup.getLabel()\n });\n };\n\n publicAPI.getBindGroupLayout = function (idx) {\n return model.layouts[idx].layout;\n };\n\n publicAPI.getBindGroupLayoutCount = function (llabel) {\n for (var i = 0; i < model.layouts.length; i++) {\n if (model.layouts[i].label === llabel) {\n return i;\n }\n }\n\n return 0;\n };\n\n publicAPI.bindVertexInput = function (renderEncoder, vInput) {\n vInput.bindBuffers(renderEncoder);\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n handle: null,\n layouts: null,\n renderEncoder: null,\n shaderDescriptions: null,\n vertexState: null,\n topology: null,\n pipelineDescription: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Build VTK API\n\n obj(publicAPI, model);\n model.layouts = [];\n model.shaderDescriptions = [];\n get(publicAPI, model, ['handle', 'pipelineDescription']);\n setGet(publicAPI, model, ['device', 'renderEncoder', 'topology', 'vertexState']); // For more macro methods, see \"Sources/macros.js\"\n // Object specific methods\n\n vtkWebGPUPipeline(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend, 'vtkWebGPUPipeline'); // ----------------------------------------------------------------------------\n\nvar vtkWebGPUPipeline$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkWebGPUPipeline$1 as default, extend, newInstance };\n","import macro from '../../macros.js';\nimport vtkWebGPUShaderCache from './ShaderCache.js';\n\n// vtkWebGPUShaderDescription methods\n// ----------------------------------------------------------------------------\n// shader description\n\nfunction vtkWebGPUShaderDescription(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkWebGPUShaderDescription');\n\n publicAPI.hasOutput = function (name) {\n return model.outputNames.includes(name);\n };\n\n publicAPI.addOutput = function (type, name) {\n var interpolation = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined;\n model.outputTypes.push(type);\n model.outputNames.push(name);\n model.outputInterpolations.push(interpolation);\n };\n\n publicAPI.addBuiltinOutput = function (type, name) {\n model.builtinOutputTypes.push(type);\n model.builtinOutputNames.push(name);\n };\n\n publicAPI.addBuiltinInput = function (type, name) {\n model.builtinInputTypes.push(type);\n model.builtinInputNames.push(name);\n }; // perform shader replacements for the input and outputs\n // of this shader. That includes vertex inputs if specified\n\n\n publicAPI.replaceShaderCode = function (priorStage, vertexInput) {\n var inputImpl = [];\n var iodec = [];\n\n if (vertexInput) {\n inputImpl.push(vertexInput.getShaderCode());\n }\n\n if (priorStage || model.builtinInputNames.length) {\n var inputStruct = [];\n inputStruct.push(\"struct \".concat(model.type, \"Input\\n{\"));\n\n if (priorStage) {\n var inputNames = priorStage.getOutputNamesByReference();\n var inputTypes = priorStage.getOutputTypesByReference();\n var inputInterpolations = priorStage.getOutputInterpolationsByReference();\n\n for (var i = 0; i < inputNames.length; i++) {\n if (inputInterpolations[i] !== undefined) {\n inputStruct.push(\" @location(\".concat(i, \") @interpolate(\").concat(inputInterpolations[i], \") \").concat(inputNames[i], \" : \").concat(inputTypes[i], \",\"));\n } else {\n inputStruct.push(\" @location(\".concat(i, \") \").concat(inputNames[i], \" : \").concat(inputTypes[i], \",\"));\n }\n }\n }\n\n for (var _i = 0; _i < model.builtinInputNames.length; _i++) {\n inputStruct.push(\" \".concat(model.builtinInputNames[_i], \" : \").concat(model.builtinInputTypes[_i], \",\"));\n }\n\n if (inputStruct.length > 1) {\n inputStruct.push('};');\n iodec = inputStruct;\n inputImpl[inputImpl.length - 1] += ',';\n inputImpl.push(\"input: \".concat(model.type, \"Input\"));\n }\n }\n\n if (inputImpl.length) {\n model.code = vtkWebGPUShaderCache.substitute(model.code, '//VTK::IOStructs::Input', inputImpl).result;\n }\n\n if (model.outputNames.length + model.builtinOutputNames.length) {\n var outputStruct = [\"struct \".concat(model.type, \"Output\\n{\")];\n\n for (var _i2 = 0; _i2 < model.outputNames.length; _i2++) {\n if (model.outputInterpolations[_i2] !== undefined) {\n outputStruct.push(\" @location(\".concat(_i2, \") @interpolate(\").concat(model.outputInterpolations[_i2], \") \").concat(model.outputNames[_i2], \" : \").concat(model.outputTypes[_i2], \",\"));\n } else {\n outputStruct.push(\" @location(\".concat(_i2, \") \").concat(model.outputNames[_i2], \" : \").concat(model.outputTypes[_i2], \",\"));\n }\n }\n\n for (var _i3 = 0; _i3 < model.builtinOutputNames.length; _i3++) {\n outputStruct.push(\" \".concat(model.builtinOutputNames[_i3], \" : \").concat(model.builtinOutputTypes[_i3], \",\"));\n }\n\n outputStruct.push('};');\n iodec = iodec.concat(outputStruct);\n model.code = vtkWebGPUShaderCache.substitute(model.code, '//VTK::IOStructs::Output', [\"-> \".concat(model.type, \"Output\")]).result;\n }\n\n model.code = vtkWebGPUShaderCache.substitute(model.code, '//VTK::IOStructs::Dec', iodec).result;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n type: null,\n // 'vertex' or 'fragment'\n hash: null,\n code: null,\n outputNames: null,\n outputTypes: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues);\n model.outputNames = [];\n model.outputTypes = [];\n model.outputInterpolations = [];\n model.builtinOutputNames = [];\n model.builtinOutputTypes = [];\n model.builtinInputNames = [];\n model.builtinInputTypes = []; // Build VTK API\n\n macro.obj(publicAPI, model);\n macro.setGet(publicAPI, model, ['type', 'hash', 'code']);\n macro.getArray(publicAPI, model, ['outputTypes', 'outputNames', 'outputInterpolations']); // Object methods\n\n vtkWebGPUShaderDescription(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkWebGPUShaderDescription'); // ----------------------------------------------------------------------------\n\nvar vtkWebGPUShaderDescription$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkWebGPUShaderDescription$1 as default, extend, newInstance };\n","import { vtkErrorMacro } from '../../macros.js';\n\n// vtkWebGPUDevice static functions\n//\n// WebGPU uses types in a many places and calls, and often those types\n// need to be associated with byte sizes, alignments, native arrays etc.\n// The folowing methods are designed to help vtk.js introspect those types.\n// WebGPU currently tends to use multiple type formats:\n// - buffer types such as float32x4\n// - shader types suchs as vec4\n// - texture types such as rgba32float\n// ----------------------------------------------------------------------------\n// see https://gpuweb.github.io/gpuweb/#texture-formats\n// for possible formats, there are a lot of them\n\nvar textureDetails = {\n // 8-bit formats\n r8unorm: {\n numComponents: 1,\n nativeType: Uint8Array,\n stride: 1,\n elementSize: 1,\n sampleType: 'float'\n },\n r8snorm: {\n numComponents: 1,\n nativeType: Int8Array,\n stride: 1,\n elementSize: 1,\n sampleType: 'float'\n },\n r8uint: {\n numComponents: 1,\n nativeType: Uint8Array,\n stride: 1,\n elementSize: 1,\n sampleType: 'uint'\n },\n r8sint: {\n numComponents: 1,\n nativeType: Int8Array,\n stride: 1,\n elementSize: 1,\n sampleType: 'sint'\n },\n // 16-bit formats\n r16uint: {\n numComponents: 1,\n nativeType: Uint16Array,\n stride: 2,\n elementSize: 2,\n sampleType: 'uint'\n },\n r16sint: {\n numComponents: 1,\n nativeType: Int16Array,\n stride: 2,\n elementSize: 2,\n sampleType: 'sint'\n },\n r16float: {\n numComponents: 1,\n nativeType: Float32Array,\n stride: 2,\n elementSize: 2,\n sampleType: 'float'\n },\n rg8unorm: {\n numComponents: 2,\n nativeType: Uint8Array,\n stride: 2,\n elementSize: 1,\n sampleType: 'float'\n },\n rg8snorm: {\n numComponents: 2,\n nativeType: Int8Array,\n stride: 2,\n elementSize: 1,\n sampleType: 'float'\n },\n rg8uint: {\n numComponents: 2,\n nativeType: Uint8Array,\n stride: 2,\n elementSize: 1,\n sampleType: 'uint'\n },\n rg8sint: {\n numComponents: 2,\n nativeType: Int8Array,\n stride: 2,\n elementSize: 1,\n sampleType: 'sint'\n },\n // 32-bit formats\n r32uint: {\n numComponents: 1,\n nativeType: Uint32Array,\n stride: 4,\n elementSize: 4,\n sampleType: 'uint'\n },\n r32sint: {\n numComponents: 1,\n nativeType: Int32Array,\n stride: 4,\n elementSize: 4,\n sampleType: 'sint'\n },\n r32float: {\n numComponents: 1,\n nativeType: Float32Array,\n stride: 4,\n elementSize: 4,\n sampleType: 'unfilterable-float'\n },\n rg16uint: {\n numComponents: 2,\n nativeType: Uint16Array,\n stride: 4,\n elementSize: 2,\n sampleType: 'uint'\n },\n rg16sint: {\n numComponents: 2,\n nativeType: Int16Array,\n stride: 4,\n elementSize: 2,\n sampleType: 'sint'\n },\n rg16float: {\n numComponents: 2,\n nativeType: Float32Array,\n stride: 4,\n elementSize: 2,\n sampleType: 'float'\n },\n rgba8unorm: {\n numComponents: 4,\n nativeType: Uint8Array,\n stride: 4,\n elementSize: 1,\n sampleType: 'float'\n },\n 'rgba8unorm-srgb': {\n numComponents: 4,\n nativeType: Uint8Array,\n stride: 4,\n elementSize: 1,\n sampleType: 'float'\n },\n rgba8snorm: {\n numComponents: 4,\n nativeType: Int8Array,\n stride: 4,\n elementSize: 1,\n sampleType: 'float'\n },\n rgba8uint: {\n numComponents: 4,\n nativeType: Uint8Array,\n stride: 4,\n elementSize: 1,\n sampleType: 'uint'\n },\n rgba8sint: {\n numComponents: 4,\n nativeType: Int8Array,\n stride: 4,\n elementSize: 1,\n sampleType: 'sint'\n },\n bgra8unorm: {\n numComponents: 4,\n nativeType: Uint8Array,\n stride: 4,\n elementSize: 1,\n sampleType: 'float'\n },\n 'bgra8unorm-srgb': {\n numComponents: 4,\n nativeType: Uint8Array,\n stride: 4,\n elementSize: 1,\n sampleType: 'float'\n },\n // Packed 32-bit formats\n rgb9e5ufloat: {\n numComponents: 4,\n nativeType: Uint32Array,\n stride: 4,\n sampleType: 'float'\n },\n rgb10a2unorm: {\n numComponents: 4,\n nativeType: Uint32Array,\n stride: 4,\n sampleType: 'float'\n },\n rg11b10ufloat: {\n numComponents: 4,\n nativeType: Float32Array,\n stride: 4,\n sampleType: 'float'\n },\n // 64-bit formats\n rg32uint: {\n numComponents: 2,\n nativeType: Uint32Array,\n stride: 8,\n elementSize: 4,\n sampleType: 'uint'\n },\n rg32sint: {\n numComponents: 2,\n nativeType: Int32Array,\n stride: 8,\n elementSize: 4,\n sampleType: 'sint'\n },\n rg32float: {\n numComponents: 2,\n nativeType: Float32Array,\n stride: 8,\n elementSize: 4,\n sampleType: 'unfilterable-float'\n },\n rgba16uint: {\n numComponents: 4,\n nativeType: Uint16Array,\n stride: 8,\n elementSize: 2,\n sampleType: 'uint'\n },\n rgba16sint: {\n numComponents: 4,\n nativeType: Int16Array,\n stride: 8,\n elementSize: 2,\n sampleType: 'sint'\n },\n rgba16float: {\n numComponents: 4,\n nativeType: Float32Array,\n stride: 8,\n elementSize: 2,\n sampleType: 'float'\n },\n // 128-bit formats\n rgba32uint: {\n numComponents: 4,\n nativeType: Uint32Array,\n stride: 16,\n elementSize: 4,\n sampleType: 'uint'\n },\n rgba32sint: {\n numComponents: 4,\n nativeType: Int32Array,\n stride: 16,\n elementSize: 4,\n sampleType: 'sint'\n },\n rgba32float: {\n numComponents: 4,\n nativeType: Float32Array,\n stride: 16,\n elementSize: 4,\n sampleType: 'unfilterable-float'\n },\n // Depth and stencil formats\n stencil8: {\n numComponents: 1,\n nativeType: Uint8Array,\n stride: 1,\n elementSize: 1,\n sampleType: 'uint'\n },\n depth16unorm: {\n numComponents: 1,\n nativeType: Uint16Array,\n stride: 2,\n elementSize: 2,\n sampleType: 'depth'\n },\n depth24plus: {\n numComponents: 1,\n nativeType: Uint32Array,\n stride: 4,\n elementSize: 3,\n sampleType: 'depth'\n },\n 'depth24plus-stencil8': {\n numComponents: 2,\n nativeType: Uint32Array,\n stride: 4,\n sampleType: 'mixed'\n },\n depth32float: {\n numComponents: 1,\n nativeType: Float32Array,\n stride: 4,\n elementSize: 4,\n sampleType: 'depth'\n }\n};\n\nfunction getDetailsFromTextureFormat(format) {\n if (!format || format.length < 6) return 0;\n\n if (format in textureDetails === true) {\n return textureDetails[format];\n }\n\n vtkErrorMacro(\"unknown format \".concat(format));\n return null;\n} // see https://gpuweb.github.io/gpuweb/#enumdef-gpuvertexformat\n// for possible formats\n\n\nfunction getByteStrideFromBufferFormat(format) {\n if (!format || format.length < 5) return 0; // options are x2, x3, x4 or nothing\n\n var numComp = 1;\n\n if (format[format.length - 2] === 'x') {\n numComp = Number(format[format.length - 1]);\n }\n\n var sizeStart = numComp === 1 ? format.length - 1 : format.length - 3; // options are 8, 16, 32 resulting in 8, 6, 2 as the last char\n // plugged into the formula below gives 1, 2, 4 respectively\n\n var num = Number(format[sizeStart]);\n\n if (Number.isNaN(num)) {\n vtkErrorMacro(\"unknown format \".concat(format));\n return 0;\n }\n\n var typeSize = 5 - num / 2;\n return numComp * typeSize;\n} // see https://gpuweb.github.io/gpuweb/#enumdef-gpuvertexformat\n// for possible formats\n\n\nfunction getNumberOfComponentsFromBufferFormat(format) {\n if (!format || format.length < 5) return 0; // options are x2, x3, x4 or nothing\n\n var numComp = 1;\n\n if (format[format.length - 2] === 'x') {\n numComp = Number(format[format.length - 1]);\n }\n\n return numComp;\n} // see https://gpuweb.github.io/gpuweb/#enumdef-gpuvertexformat\n// for possible formats\n\n\nfunction getNativeTypeFromBufferFormat(format) {\n if (!format || format.length < 5) return 0; // raw types are Uint Int or Float as follows\n\n var result;\n\n if (format[0] === 'f') {\n result = 'Float';\n } else if (format[0] === 's') {\n result = 'Int';\n } else if (format[0] === 'u') {\n result = 'Uint';\n } else {\n vtkErrorMacro(\"unknown format \".concat(format));\n return undefined;\n } // options are 8, 16, 32 resulting in 8, 6, 2 as the last char\n // plugged into the formula below gives 1, 2, 4 respectively\n\n\n var base = format.split('x')[0];\n var num = Number(base[base.length - 1]);\n\n if (Number.isNaN(num)) {\n vtkErrorMacro(\"unknown format \".concat(format));\n return undefined;\n }\n\n result += 8 * (5 - num / 2);\n result += 'Array';\n return result;\n}\n\nfunction getShaderTypeFromBufferFormat(format) {\n var dataType;\n\n if (format[0] === 'f' || format[1] === 'n') {\n dataType = 'f32';\n } else if (format[0] === 's' && format[1] === 'i') {\n dataType = 'i32';\n } else if (format[0] === 'u' && format[1] === 'i') {\n dataType = 'u32';\n } else {\n vtkErrorMacro(\"unknown format \".concat(format));\n return undefined;\n } // options are x2, x3, x4 or nothing\n\n\n var numComp = 1;\n\n if (format[format.length - 2] === 'x') {\n numComp = Number(format[format.length - 1]);\n }\n\n if (numComp === 4) return \"vec4<\".concat(dataType, \">\");\n if (numComp === 3) return \"vec3<\".concat(dataType, \">\");\n if (numComp === 2) return \"vec2<\".concat(dataType, \">\");\n return dataType;\n}\n\nfunction getByteStrideFromShaderFormat(format) {\n if (!format) return 0;\n var numComp = 1;\n\n if (format.substring(0, 3) === 'vec') {\n numComp = Number(format[3]);\n } else if (format.substring(0, 3) === 'mat') {\n numComp = format[3] * format[5];\n }\n\n var typeSize = 4;\n return numComp * typeSize;\n}\n\nfunction getNativeTypeFromShaderFormat(format) {\n if (!format) return undefined;\n if (format.includes('f32')) return 'Float32Array';\n if (format.includes('i32')) return 'Int32Array';\n if (format.includes('u32')) return 'Uint32Array';\n vtkErrorMacro(\"unknown format \".concat(format));\n return undefined;\n}\n\nvar vtkWebGPUTypes = {\n getDetailsFromTextureFormat: getDetailsFromTextureFormat,\n getByteStrideFromBufferFormat: getByteStrideFromBufferFormat,\n getNumberOfComponentsFromBufferFormat: getNumberOfComponentsFromBufferFormat,\n getNativeTypeFromBufferFormat: getNativeTypeFromBufferFormat,\n getShaderTypeFromBufferFormat: getShaderTypeFromBufferFormat,\n getByteStrideFromShaderFormat: getByteStrideFromShaderFormat,\n getNativeTypeFromShaderFormat: getNativeTypeFromShaderFormat\n};\n\nexport { vtkWebGPUTypes as default };\n","import { newInstance as newInstance$1, obj, setGet } from '../../macros.js';\nimport vtkWebGPUTypes from './Types.js';\n\nfunction arraysEqual(a, b) {\n if (a === b) return true;\n if (a == null || b == null) return false;\n if (a.length !== b.length) return false;\n\n for (var i = 0; i < a.length; ++i) {\n if (!b.includes(a[i])) return false;\n }\n\n return true;\n} // ----------------------------------------------------------------------------\n// vtkWebGPUVertexInput methods\n// ----------------------------------------------------------------------------\n\n\nfunction vtkWebGPUVertexInput(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkWebGPUVertexInput');\n\n publicAPI.addBuffer = function (buffer, inames) {\n var stepMode = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'vertex';\n var names = inames;\n\n if (!Array.isArray(names)) {\n names = [names];\n } // only add if it is a new setting\n\n\n for (var i = 0; i < model.inputs.length; i++) {\n if (arraysEqual(model.inputs[i].names, names)) {\n if (model.inputs[i].buffer === buffer) {\n return;\n }\n\n model.inputs[i].buffer = buffer;\n return;\n }\n } // when adding a new entry, make sure we sort the array\n // as the order is important to the shader and must always\n // be the same, so alphabetical is an easy option\n\n\n model.inputs.push({\n buffer: buffer,\n stepMode: stepMode,\n names: names\n });\n model.inputs = model.inputs.sort(function (v1, v2) {\n if (v1.names[0] < v2.names[0]) {\n return -1;\n }\n\n if (v1.names[0] > v2.names[0]) {\n return 1;\n }\n\n return 0;\n });\n };\n\n publicAPI.removeBufferIfPresent = function (name) {\n for (var i = 0; i < model.inputs.length; i++) {\n if (model.inputs[i].names.includes(name)) {\n model.inputs.splice(i, 1);\n }\n }\n };\n\n publicAPI.getBuffer = function (name) {\n for (var i = 0; i < model.inputs.length; i++) {\n if (model.inputs[i].names.includes(name)) {\n return model.inputs[i].buffer;\n }\n }\n\n return null;\n };\n\n publicAPI.hasAttribute = function (name) {\n for (var i = 0; i < model.inputs.length; i++) {\n if (model.inputs[i].names.includes(name)) {\n return true;\n }\n }\n\n return false;\n };\n\n publicAPI.getAttributeTime = function (name) {\n for (var i = 0; i < model.inputs.length; i++) {\n if (model.inputs[i].names.includes(name)) {\n return model.inputs[i].buffer.getSourceTime();\n }\n }\n\n return 0;\n };\n\n publicAPI.getShaderCode = function () {\n var result = '';\n var nameCount = 0;\n\n for (var i = 0; i < model.inputs.length; i++) {\n for (var nm = 0; nm < model.inputs[i].names.length; nm++) {\n var arrayInfo = model.inputs[i].buffer.getArrayInformation()[nm];\n var type = vtkWebGPUTypes.getShaderTypeFromBufferFormat(arrayInfo.format);\n\n if (nameCount > 0) {\n result += ',\\n';\n }\n\n result = \"\".concat(result, \" @location(\").concat(nameCount, \") \").concat(model.inputs[i].names[nm], \" : \").concat(type);\n nameCount++;\n }\n }\n\n return result;\n };\n\n publicAPI.getVertexInputInformation = function () {\n var info = {};\n\n if (model.inputs.length) {\n var vertexBuffers = [];\n var nameCount = 0;\n\n for (var i = 0; i < model.inputs.length; i++) {\n var buf = model.inputs[i].buffer;\n var buffer = {\n arrayStride: buf.getStrideInBytes(),\n stepMode: model.inputs[i].stepMode,\n attributes: []\n };\n var arrayInfo = buf.getArrayInformation();\n\n for (var nm = 0; nm < model.inputs[i].names.length; nm++) {\n buffer.attributes.push({\n shaderLocation: nameCount,\n offset: arrayInfo[nm].offset,\n format: arrayInfo[nm].format\n });\n nameCount++;\n }\n\n vertexBuffers.push(buffer);\n }\n\n info.buffers = vertexBuffers;\n }\n\n return info;\n };\n\n publicAPI.bindBuffers = function (renderEncoder) {\n for (var i = 0; i < model.inputs.length; i++) {\n renderEncoder.setVertexBuffer(i, model.inputs[i].buffer.getHandle());\n }\n\n if (model.indexBuffer) {\n renderEncoder.setIndexBuffer(model.indexBuffer.getHandle(), model.indexBuffer.getArrayInformation()[0].format);\n }\n };\n\n publicAPI.getReady = function () {};\n\n publicAPI.releaseGraphicsResources = function () {\n if (model.created) {\n model.inputs = [];\n model.bindingDescriptions = [];\n model.attributeDescriptions = [];\n }\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n inputs: null,\n bindingDescriptions: false,\n attributeDescriptions: null,\n indexBuffer: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Build VTK API\n\n obj(publicAPI, model);\n model.bindingDescriptions = [];\n model.attributeDescriptions = [];\n model.inputs = [];\n setGet(publicAPI, model, ['created', 'device', 'handle', 'indexBuffer']); // For more macro methods, see \"Sources/macros.js\"\n // Object specific methods\n\n vtkWebGPUVertexInput(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend, 'vtkWebGPUVertexInput'); // ----------------------------------------------------------------------------\n\nvar vtkWebGPUVertexInput$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkWebGPUVertexInput$1 as default, extend, newInstance };\n","import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';\nimport macro from '../../macros.js';\nimport vtkViewNode from '../SceneGraph/ViewNode.js';\nimport vtkWebGPUBindGroup from './BindGroup.js';\nimport vtkWebGPUPipeline from './Pipeline.js';\nimport vtkWebGPUShaderCache from './ShaderCache.js';\nimport vtkWebGPUShaderDescription from './ShaderDescription.js';\nimport vtkWebGPUVertexInput from './VertexInput.js';\n\nvar vtkWebGPUSimpleMapperVS = \"\\n//VTK::Renderer::Dec\\n\\n//VTK::Color::Dec\\n\\n//VTK::Normal::Dec\\n\\n//VTK::TCoord::Dec\\n\\n//VTK::Select::Dec\\n\\n//VTK::Mapper::Dec\\n\\n//VTK::IOStructs::Dec\\n\\n@vertex\\nfn main(\\n//VTK::IOStructs::Input\\n)\\n//VTK::IOStructs::Output\\n{\\n var output : vertexOutput;\\n\\n // var vertex: vec4 = vertexBC;\\n\\n //VTK::Color::Impl\\n\\n //VTK::Normal::Impl\\n\\n //VTK::TCoord::Impl\\n\\n //VTK::Select::Impl\\n\\n //VTK::Position::Impl\\n\\n return output;\\n}\\n\";\nvar vtkWebGPUSimpleMapperFS = \"\\n//VTK::Renderer::Dec\\n\\n//VTK::Color::Dec\\n\\n//VTK::Normal::Dec\\n\\n//VTK::TCoord::Dec\\n\\n//VTK::Select::Dec\\n\\n//VTK::RenderEncoder::Dec\\n\\n//VTK::Mapper::Dec\\n\\n//VTK::IOStructs::Dec\\n\\n@fragment\\nfn main(\\n//VTK::IOStructs::Input\\n)\\n//VTK::IOStructs::Output\\n{\\n var output : fragmentOutput;\\n\\n //VTK::Color::Impl\\n\\n //VTK::Normal::Impl\\n\\n //VTK::Light::Impl\\n\\n //VTK::TCoord::Impl\\n\\n //VTK::Select::Impl\\n\\n // var computedColor:vec4 = vec4(1.0,0.5,0.5,1.0);\\n\\n //VTK::RenderEncoder::Impl\\n return output;\\n}\\n\"; // ----------------------------------------------------------------------------\n// vtkWebGPUSimpleMapper methods\n// ----------------------------------------------------------------------------\n\nfunction vtkWebGPUSimpleMapper(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkWebGPUSimpleMapper');\n\n publicAPI.generateShaderDescriptions = function (hash, pipeline, vertexInput) {\n // create the shader descriptions\n var vDesc = vtkWebGPUShaderDescription.newInstance({\n type: 'vertex',\n hash: hash,\n code: model.vertexShaderTemplate\n });\n var fDesc = vtkWebGPUShaderDescription.newInstance({\n type: 'fragment',\n hash: hash,\n code: model.fragmentShaderTemplate\n }); // add them to the pipeline\n\n var sdrs = pipeline.getShaderDescriptions();\n sdrs.push(vDesc);\n sdrs.push(fDesc); // look for replacements to invoke\n\n var scode = model.vertexShaderTemplate + model.fragmentShaderTemplate; // eslint-disable-next-line prefer-regex-literals\n\n var re = new RegExp('//VTK::[^:]*::', 'g');\n var unique = scode.match(re).filter(function (v, i, a) {\n return a.indexOf(v) === i;\n });\n var fnames = unique.map(function (v) {\n return \"replaceShader\".concat(v.substring(7, v.length - 2));\n }); // now invoke shader replacement functions\n\n for (var i = 0; i < fnames.length; i++) {\n var fname = fnames[i];\n\n if (fname !== 'replaceShaderIOStructs' && model.shaderReplacements.has(fname)) {\n model.shaderReplacements.get(fname)(hash, pipeline, vertexInput);\n }\n } // always replace the IOStructs last as other replacement funcs may\n // add inputs or outputs\n\n\n publicAPI.replaceShaderIOStructs(hash, pipeline, vertexInput); // console.log(vDesc.getCode());\n // console.log(fDesc.getCode());\n };\n\n publicAPI.replaceShaderIOStructs = function (hash, pipeline, vertexInput) {\n var vDesc = pipeline.getShaderDescription('vertex');\n vDesc.replaceShaderCode(null, vertexInput);\n var fDesc = pipeline.getShaderDescription('fragment');\n fDesc.replaceShaderCode(vDesc);\n };\n\n publicAPI.replaceShaderRenderEncoder = function (hash, pipeline, vertexInput) {\n model.renderEncoder.replaceShaderCode(pipeline);\n };\n\n model.shaderReplacements.set('replaceShaderRenderEncoder', publicAPI.replaceShaderRenderEncoder);\n\n publicAPI.replaceShaderRenderer = function (hash, pipeline, vertexInput) {\n if (!model.WebGPURenderer) {\n return;\n }\n\n var ubocode = model.WebGPURenderer.getBindGroup().getShaderCode(pipeline);\n var vDesc = pipeline.getShaderDescription('vertex');\n var code = vDesc.getCode();\n code = vtkWebGPUShaderCache.substitute(code, '//VTK::Renderer::Dec', [ubocode]).result;\n vDesc.setCode(code);\n var fDesc = pipeline.getShaderDescription('fragment');\n code = fDesc.getCode();\n code = vtkWebGPUShaderCache.substitute(code, '//VTK::Renderer::Dec', [ubocode]).result;\n fDesc.setCode(code);\n };\n\n model.shaderReplacements.set('replaceShaderRenderer', publicAPI.replaceShaderRenderer);\n\n publicAPI.replaceShaderMapper = function (hash, pipeline, vertexInput) {\n var ubocode = model.bindGroup.getShaderCode(pipeline);\n var vDesc = pipeline.getShaderDescription('vertex');\n var code = vDesc.getCode();\n code = vtkWebGPUShaderCache.substitute(code, '//VTK::Mapper::Dec', [ubocode]).result;\n vDesc.setCode(code);\n var fDesc = pipeline.getShaderDescription('fragment');\n fDesc.addBuiltinInput('bool', '@builtin(front_facing) frontFacing');\n code = fDesc.getCode();\n code = vtkWebGPUShaderCache.substitute(code, '//VTK::Mapper::Dec', [ubocode]).result;\n fDesc.setCode(code);\n };\n\n model.shaderReplacements.set('replaceShaderMapper', publicAPI.replaceShaderMapper);\n\n publicAPI.replaceShaderPosition = function (hash, pipeline, vertexInput) {\n var vDesc = pipeline.getShaderDescription('vertex');\n vDesc.addBuiltinOutput('vec4', '@builtin(position) Position');\n var code = vDesc.getCode();\n code = vtkWebGPUShaderCache.substitute(code, '//VTK::Position::Impl', [' output.Position = rendererUBO.SCPCMatrix*vertexBC;']).result;\n vDesc.setCode(code);\n };\n\n model.shaderReplacements.set('replaceShaderPosition', publicAPI.replaceShaderPosition);\n\n publicAPI.replaceShaderTCoord = function (hash, pipeline, vertexInput) {\n var vDesc = pipeline.getShaderDescription('vertex');\n vDesc.addOutput('vec2', 'tcoordVS');\n };\n\n model.shaderReplacements.set('replaceShaderTCoord', publicAPI.replaceShaderTCoord);\n\n publicAPI.addTextureView = function (view) {\n // is it already there?\n if (model.textureViews.includes(view)) {\n return;\n }\n\n model.textureViews.push(view);\n }; // do everything required for this mapper to be rerady to draw\n // but do not bind or do the actual draw commands as the pipeline\n // is not neccessarily bound yet\n\n\n publicAPI.prepareToDraw = function (renderEncoder) {\n model.renderEncoder = renderEncoder; // do anything needed to get our input data up to date\n\n publicAPI.updateInput(); // make sure buffers are created and up to date\n\n publicAPI.updateBuffers(); // update bindings and bind groups/layouts\n // does not acutally bind them, that is done in draw(...)\n\n publicAPI.updateBindings(); // update the pipeline, includes computing the hash, and if needed\n // creating the pipeline, shader code etc\n\n publicAPI.updatePipeline();\n };\n\n publicAPI.updateInput = function () {};\n\n publicAPI.updateBuffers = function () {};\n\n publicAPI.updateBindings = function () {\n // bindings can change without a pipeline change\n // as long as their layout remains the same.\n // That is why this is done even when the pipeline\n // hash doesn't change.\n model.bindGroup.setBindables(publicAPI.getBindables());\n };\n\n publicAPI.computePipelineHash = function () {};\n\n publicAPI.registerDrawCallback = function (encoder) {\n encoder.registerDrawCallback(model.pipeline, publicAPI.draw);\n };\n\n publicAPI.prepareAndDraw = function (encoder) {\n publicAPI.prepareToDraw(encoder);\n encoder.setPipeline(model.pipeline);\n publicAPI.draw(encoder);\n }; // do the rest of the calls required to draw this mapper\n // at this point the command encouder and pipeline are\n // created and bound\n\n\n publicAPI.draw = function (renderEncoder) {\n var pipeline = renderEncoder.getBoundPipeline(); // bind the mapper bind group\n\n renderEncoder.activateBindGroup(model.bindGroup);\n\n if (model.WebGPURenderer) {\n model.WebGPURenderer.bindUBO(renderEncoder);\n } // bind the vertex input\n\n\n pipeline.bindVertexInput(renderEncoder, model.vertexInput);\n var indexBuffer = model.vertexInput.getIndexBuffer();\n\n if (indexBuffer) {\n renderEncoder.drawIndexed(indexBuffer.getIndexCount(), model.numberOfInstances, 0, 0, 0);\n } else {\n renderEncoder.draw(model.numberOfVertices, model.numberOfInstances, 0, 0);\n }\n };\n\n publicAPI.getBindables = function () {\n var bindables = _toConsumableArray(model.additionalBindables);\n\n if (model.UBO) {\n bindables.push(model.UBO);\n }\n\n if (model.SSBO) {\n bindables.push(model.SSBO);\n } // add texture BindGroupLayouts\n\n\n for (var t = 0; t < model.textureViews.length; t++) {\n bindables.push(model.textureViews[t]);\n var samp = model.textureViews[t].getSampler();\n\n if (samp) {\n bindables.push(samp);\n }\n }\n\n return bindables;\n };\n\n publicAPI.updatePipeline = function () {\n publicAPI.computePipelineHash();\n model.pipeline = model.device.getPipeline(model.pipelineHash); // build the pipeline if needed\n\n if (!model.pipeline) {\n model.pipeline = vtkWebGPUPipeline.newInstance();\n model.pipeline.setDevice(model.device);\n\n if (model.WebGPURenderer) {\n model.pipeline.addBindGroupLayout(model.WebGPURenderer.getBindGroup());\n }\n\n model.pipeline.addBindGroupLayout(model.bindGroup);\n publicAPI.generateShaderDescriptions(model.pipelineHash, model.pipeline, model.vertexInput);\n model.pipeline.setTopology(model.topology);\n model.pipeline.setRenderEncoder(model.renderEncoder);\n model.pipeline.setVertexState(model.vertexInput.getVertexInputInformation());\n model.device.createPipeline(model.pipelineHash, model.pipeline);\n }\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n additionalBindables: undefined,\n bindGroup: null,\n device: null,\n fragmentShaderTemplate: null,\n numberOfInstances: 1,\n numberOfVertices: 0,\n pipelineHash: null,\n shaderReplacements: null,\n SSBO: null,\n textureViews: null,\n topology: 'triangle-list',\n UBO: null,\n vertexShaderTemplate: null,\n WebGPURenderer: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkViewNode.extend(publicAPI, model, initialValues);\n model.textureViews = [];\n model.vertexInput = vtkWebGPUVertexInput.newInstance();\n model.bindGroup = vtkWebGPUBindGroup.newInstance({\n label: 'mapperBG'\n });\n model.additionalBindables = [];\n model.fragmentShaderTemplate = model.fragmentShaderTemplate || vtkWebGPUSimpleMapperFS;\n model.vertexShaderTemplate = model.vertexShaderTemplate || vtkWebGPUSimpleMapperVS;\n model.shaderReplacements = new Map(); // Build VTK API\n\n macro.get(publicAPI, model, ['pipeline', 'vertexInput']);\n macro.setGet(publicAPI, model, ['additionalBindables', 'device', 'fragmentShaderTemplate', 'interpolate', 'numberOfInstances', 'numberOfVertices', 'pipelineHash', 'shaderReplacements', 'SSBO', 'textureViews', 'topology', 'UBO', 'vertexShaderTemplate', 'WebGPURenderer']); // Object methods\n\n vtkWebGPUSimpleMapper(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkWebGPUSimpleMapper'); // ----------------------------------------------------------------------------\n\nvar vtkWebGPUSimpleMapper$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkWebGPUSimpleMapper$1 as default, extend, newInstance };\n","import macro from '../../macros.js';\nimport vtkWebGPUShaderCache from './ShaderCache.js';\nimport vtkWebGPUSimpleMapper from './SimpleMapper.js';\n\n// vtkWebGPUFullScreenQuad methods\n// ----------------------------------------------------------------------------\n\nfunction vtkWebGPUFullScreenQuad(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkWebGPUFullScreenQuad');\n\n publicAPI.replaceShaderPosition = function (hash, pipeline, vertexInput) {\n var vDesc = pipeline.getShaderDescription('vertex');\n vDesc.addBuiltinOutput('vec4', '@builtin(position) Position');\n vDesc.addOutput('vec4', 'vertexVC');\n var code = vDesc.getCode();\n code = vtkWebGPUShaderCache.substitute(code, '//VTK::Position::Impl', ['output.tcoordVS = vec2(vertexBC.x * 0.5 + 0.5, 1.0 - vertexBC.y * 0.5 - 0.5);', 'output.Position = vec4(vertexBC, 1.0);', 'output.vertexVC = vec4(vertexBC, 1);']).result;\n vDesc.setCode(code);\n };\n\n model.shaderReplacements.set('replaceShaderPosition', publicAPI.replaceShaderPosition);\n\n publicAPI.updateBuffers = function () {\n var buff = model.device.getBufferManager().getFullScreenQuadBuffer();\n model.vertexInput.addBuffer(buff, ['vertexBC']);\n model.numberOfVertices = 6;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkWebGPUSimpleMapper.extend(publicAPI, model, initialValues); // Object methods\n\n vtkWebGPUFullScreenQuad(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkWebGPUFullScreenQuad'); // ----------------------------------------------------------------------------\n\nvar vtkWebGPUFullScreenQuad$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkWebGPUFullScreenQuad$1 as default, extend, newInstance };\n","var BufferUsage = {\n Verts: 0,\n Lines: 1,\n Triangles: 2,\n Strips: 3,\n LinesFromStrips: 4,\n LinesFromTriangles: 5,\n Points: 6,\n UniformArray: 7,\n PointArray: 8,\n NormalsFromPoints: 9,\n Texture: 10,\n RawVertex: 11,\n Storage: 12,\n Index: 13\n};\nvar PrimitiveTypes = {\n Start: 0,\n Points: 0,\n Lines: 1,\n Triangles: 2,\n TriangleStrips: 3,\n TriangleEdges: 4,\n TriangleStripEdges: 5,\n End: 6\n};\nvar Constants = {\n BufferUsage: BufferUsage,\n PrimitiveTypes: PrimitiveTypes\n};\n\nexport { BufferUsage, PrimitiveTypes, Constants as default };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport macro from '../../macros.js';\nimport Constants from './BufferManager/Constants.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nvar forwarded = ['getMappedRange', 'mapAsync', 'unmap'];\n\nfunction bufferSubData(device, destBuffer, destOffset, srcArrayBuffer) {\n var byteCount = srcArrayBuffer.byteLength;\n var srcBuffer = device.createBuffer({\n size: byteCount,\n\n /* eslint-disable no-undef */\n usage: GPUBufferUsage.COPY_SRC,\n\n /* eslint-enable no-undef */\n mappedAtCreation: true\n });\n var arrayBuffer = srcBuffer.getMappedRange(0, byteCount);\n new Uint8Array(arrayBuffer).set(new Uint8Array(srcArrayBuffer)); // memcpy\n\n srcBuffer.unmap();\n var encoder = device.createCommandEncoder();\n encoder.copyBufferToBuffer(srcBuffer, 0, destBuffer, destOffset, byteCount);\n var commandBuffer = encoder.finish();\n var queue = device.queue;\n queue.submit([commandBuffer]);\n srcBuffer.destroy();\n} // ----------------------------------------------------------------------------\n// vtkWebGPUBufferManager methods\n// ----------------------------------------------------------------------------\n\n\nfunction vtkWebGPUBuffer(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkWebGPUBuffer');\n\n publicAPI.create = function (sizeInBytes, usage) {\n model.handle = model.device.getHandle().createBuffer({\n size: sizeInBytes,\n usage: usage,\n label: model.label\n });\n model.sizeInBytes = sizeInBytes;\n model.usage = usage;\n };\n\n publicAPI.write = function (data) {\n bufferSubData(model.device.getHandle(), model.handle, 0, data.buffer);\n };\n\n publicAPI.createAndWrite = function (data, usage) {\n model.handle = model.device.getHandle().createBuffer({\n size: data.byteLength,\n usage: usage,\n mappedAtCreation: true,\n label: model.label\n });\n model.sizeInBytes = data.byteLength;\n model.usage = usage;\n new Uint8Array(model.handle.getMappedRange()).set(new Uint8Array(data.buffer)); // memcpy\n\n model.handle.unmap();\n }; // simple forwarders\n\n\n var _loop = function _loop(i) {\n publicAPI[forwarded[i]] = function () {\n var _model$handle;\n\n return (_model$handle = model.handle)[forwarded[i]].apply(_model$handle, arguments);\n };\n };\n\n for (var i = 0; i < forwarded.length; i++) {\n _loop(i);\n }\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n device: null,\n handle: null,\n sizeInBytes: 0,\n strideInBytes: 0,\n arrayInformation: null,\n usage: null,\n label: null,\n sourceTime: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Object methods\n\n macro.obj(publicAPI, model);\n macro.get(publicAPI, model, ['handle', 'sizeInBytes', 'usage']);\n macro.setGet(publicAPI, model, ['strideInBytes', 'device', 'arrayInformation', 'label', 'sourceTime']);\n vtkWebGPUBuffer(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend); // ----------------------------------------------------------------------------\n\nvar vtkWebGPUBuffer$1 = _objectSpread({\n newInstance: newInstance,\n extend: extend\n}, Constants);\n\nexport { vtkWebGPUBuffer$1 as default, extend, newInstance };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport _classCallCheck from '@babel/runtime/helpers/classCallCheck';\nimport _createClass from '@babel/runtime/helpers/createClass';\nimport macro from '../../macros.js';\nimport Constants from './BufferManager/Constants.js';\nimport vtkProperty from '../Core/Property.js';\nimport vtkWebGPUBuffer from './Buffer.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nvar Representation = vtkProperty.Representation;\nvar PrimitiveTypes = Constants.PrimitiveTypes; // Simulate a small map of pointId to flatId for a cell. The original code\n// used a map and was 2.6x slower (4.7 to 1.9 seconds). Using two fixed\n// length arrays with a count is so much faster even with the required for\n// loops and if statements. This only works as we know the usage is\n// restricted to clear(), set() get() and has() so the count is always\n// incrmenting except for clear where it goes back to 0. Performance\n// improvement is probably due to this appoach not hitting the heap but wow\n// it is so much faster. Code that adds to these vectors checks against 9 to\n// make sure there is room. Switching to test against vec.length -1 results\n// in a small performance hit, so if you change 10, search for 9 in this\n// small class and change those as well.\n\nvar _LimitedMap = /*#__PURE__*/function () {\n function _LimitedMap() {\n _classCallCheck(this, _LimitedMap);\n\n this.keys = new Uint32Array(10);\n this.values = new Uint32Array(10);\n this.count = 0;\n }\n\n _createClass(_LimitedMap, [{\n key: \"clear\",\n value: function clear() {\n this.count = 0;\n }\n }, {\n key: \"has\",\n value: function has(key) {\n for (var i = 0; i < this.count; i++) {\n if (this.keys[i] === key) {\n return true;\n }\n }\n\n return undefined;\n }\n }, {\n key: \"get\",\n value: function get(key) {\n for (var i = 0; i < this.count; i++) {\n if (this.keys[i] === key) {\n return this.values[i];\n }\n }\n\n return undefined;\n }\n }, {\n key: \"set\",\n value: function set(key, value) {\n if (this.count < 9) {\n this.keys[this.count] = key;\n this.values[this.count++] = value;\n }\n }\n }]);\n\n return _LimitedMap;\n}();\n\nfunction getPrimitiveName(primType) {\n switch (primType) {\n case PrimitiveTypes.Points:\n return 'points';\n\n case PrimitiveTypes.Lines:\n return 'lines';\n\n case PrimitiveTypes.Triangles:\n case PrimitiveTypes.TriangleEdges:\n return 'polys';\n\n case PrimitiveTypes.TriangleStripEdges:\n case PrimitiveTypes.TriangleStrips:\n return 'strips';\n\n default:\n return '';\n }\n}\n\nfunction _getOrAddFlatId(state, ptId, cellId) {\n var flatId = state.pointIdToFlatId[ptId];\n\n if (flatId < 0) {\n flatId = state.flatId;\n state.pointIdToFlatId[ptId] = flatId;\n state.flatIdToPointId[state.flatId] = ptId;\n state.flatIdToCellId[state.flatId] = cellId;\n state.flatId++;\n }\n\n return flatId;\n}\n\nfunction fillCell(ptIds, cellId, state) {\n var numPtIds = ptIds.length; // are any points already marked for this cell? If so use that as the provoking point\n\n for (var ptIdx = 0; ptIdx < numPtIds; ptIdx++) {\n var _ptId = ptIds[ptIdx];\n\n if (state.cellProvokedMap.has(_ptId)) {\n state.ibo[state.iboId++] = state.cellProvokedMap.get(_ptId); // insert remaining ptIds (they do not need to provoke)\n\n for (var ptIdx2 = ptIdx + 1; ptIdx2 < ptIdx + numPtIds; ptIdx2++) {\n _ptId = ptIds[ptIdx2 % numPtIds];\n\n var _flatId = _getOrAddFlatId(state, _ptId, cellId); // add to ibo\n\n\n state.ibo[state.iboId++] = _flatId;\n } // all done now\n\n\n return;\n }\n } // else have any of the points not been used yet? (not in provokedPointIds)\n\n\n for (var _ptIdx = 0; _ptIdx < numPtIds; _ptIdx++) {\n var _ptId2 = ptIds[_ptIdx];\n\n if (!state.provokedPointIds[_ptId2]) {\n var _flatId2 = _getOrAddFlatId(state, _ptId2, cellId); // mark provoking and add to ibo\n\n\n state.provokedPointIds[_ptId2] = 1;\n state.cellProvokedMap.set(_ptId2, _flatId2); // when provoking always set the cellId as an original non-provoking value\n // will have been stored and we need to overwrite that\n\n state.flatIdToCellId[_flatId2] = cellId;\n state.ibo[state.iboId++] = _flatId2; // insert remaining ptIds (they do not need to provoke)\n\n for (var _ptIdx2 = _ptIdx + 1; _ptIdx2 < _ptIdx + numPtIds; _ptIdx2++) {\n _ptId2 = ptIds[_ptIdx2 % numPtIds];\n _flatId2 = _getOrAddFlatId(state, _ptId2, cellId); // add to ibo\n\n state.ibo[state.iboId++] = _flatId2;\n } // all done now\n\n\n return;\n }\n } // if we got here then none of the ptIds could be used to provoke\n // so just duplicate the first one\n\n\n var ptId = ptIds[0];\n var flatId = state.flatId;\n state.cellProvokedMap.set(ptId, flatId);\n state.flatIdToPointId[state.flatId] = ptId;\n state.flatIdToCellId[state.flatId] = cellId;\n state.flatId++; // add to ibo\n\n state.ibo[state.iboId++] = flatId; // insert remaining ptIds (they do not need to provoke)\n\n for (var _ptIdx3 = 1; _ptIdx3 < numPtIds; _ptIdx3++) {\n ptId = ptIds[_ptIdx3];\n flatId = _getOrAddFlatId(state, ptId, cellId); // add to ibo\n\n state.ibo[state.iboId++] = flatId;\n }\n}\n\nfunction countCell(ptIds, cellId, state) {\n var numPtIds = ptIds.length;\n state.iboSize += numPtIds; // are any points already marked for this cell? If so use that as the provoking point\n\n for (var ptIdx = 0; ptIdx < numPtIds; ptIdx++) {\n var ptId = ptIds[ptIdx];\n\n if (state.cellProvokedMap.has(ptId)) {\n return;\n }\n } // else have any of the points not been used yet? (not in provokedPointIds)\n\n\n for (var _ptIdx4 = 0; _ptIdx4 < numPtIds; _ptIdx4++) {\n var _ptId3 = ptIds[_ptIdx4];\n\n if (!state.provokedPointIds[_ptId3]) {\n state.provokedPointIds[_ptId3] = 1;\n state.cellProvokedMap.set(_ptId3, 1);\n return;\n }\n } // if we got here then none of the ptIds could be used to provoke\n\n\n state.cellProvokedMap.set(ptIds[0], 1);\n state.extraPoints++;\n}\n\nvar processCell;\n\nvar _single = new Uint32Array(1);\n\nvar _double = new Uint32Array(2);\n\nvar _triple = new Uint32Array(3);\n\nvar _indexCellBuilders = {\n // easy, every input point becomes an output point\n anythingToPoints: function anythingToPoints(numPoints, cellPts, offset, cellId, state) {\n for (var i = 0; i < numPoints; ++i) {\n _single[0] = cellPts[offset + i];\n processCell(_single, cellId, state);\n }\n },\n linesToWireframe: function linesToWireframe(numPoints, cellPts, offset, cellId, state) {\n // for lines we add a bunch of segments\n for (var i = 0; i < numPoints - 1; ++i) {\n _double[0] = cellPts[offset + i];\n _double[1] = cellPts[offset + i + 1];\n processCell(_double, cellId, state);\n }\n },\n polysToWireframe: function polysToWireframe(numPoints, cellPts, offset, cellId, state) {\n // for polys we add a bunch of segments and close it\n if (numPoints > 2) {\n for (var i = 0; i < numPoints; ++i) {\n _double[0] = cellPts[offset + i];\n _double[1] = cellPts[offset + (i + 1) % numPoints];\n processCell(_double, cellId, state);\n }\n }\n },\n stripsToWireframe: function stripsToWireframe(numPoints, cellPts, offset, cellId, state) {\n if (numPoints > 2) {\n // for strips we add a bunch of segments and close it\n for (var i = 0; i < numPoints - 1; ++i) {\n _double[0] = cellPts[offset + i];\n _double[1] = cellPts[offset + i + 1];\n processCell(_double, cellId, state);\n }\n\n for (var _i = 0; _i < numPoints - 2; _i++) {\n _double[0] = cellPts[offset + _i];\n _double[1] = cellPts[offset + _i + 2];\n processCell(_double, cellId, state);\n }\n }\n },\n polysToSurface: function polysToSurface(npts, cellPts, offset, cellId, state) {\n for (var i = 0; i < npts - 2; i++) {\n _triple[0] = cellPts[offset];\n _triple[1] = cellPts[offset + i + 1];\n _triple[2] = cellPts[offset + i + 2];\n processCell(_triple, cellId, state);\n }\n },\n stripsToSurface: function stripsToSurface(npts, cellPts, offset, cellId, state) {\n for (var i = 0; i < npts - 2; i++) {\n _triple[0] = cellPts[offset + i];\n _triple[1] = cellPts[offset + i + 1 + i % 2];\n _triple[2] = cellPts[offset + i + 1 + (i + 1) % 2];\n processCell(_triple, cellId, state);\n }\n }\n}; // ----------------------------------------------------------------------------\n// vtkWebGPUIndexBufferManager methods\n// ----------------------------------------------------------------------------\n\nfunction vtkWebGPUIndexBuffer(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkWebGPUIndexBuffer');\n\n publicAPI.buildIndexBuffer = function (req) {\n var cellArray = req.cells;\n var primitiveType = req.primitiveType;\n var representation = req.representation;\n var cellOffset = req.cellOffset;\n var array = cellArray.getData();\n var cellArraySize = array.length;\n var inRepName = getPrimitiveName(primitiveType);\n var numPts = req.numberOfPoints;\n var state = {\n provokedPointIds: new Uint8Array(numPts),\n // size is good\n extraPoints: 0,\n iboSize: 0,\n flatId: 0,\n iboId: 0,\n cellProvokedMap: new _LimitedMap()\n };\n var func = null;\n\n if (representation === Representation.POINTS || primitiveType === PrimitiveTypes.Points) {\n func = _indexCellBuilders.anythingToPoints;\n } else if (representation === Representation.WIREFRAME || primitiveType === PrimitiveTypes.Lines) {\n func = _indexCellBuilders[\"\".concat(inRepName, \"ToWireframe\")];\n } else {\n func = _indexCellBuilders[\"\".concat(inRepName, \"ToSurface\")];\n } // first we count how many extra provoking points we need\n\n\n processCell = countCell;\n var cellId = cellOffset || 0;\n\n for (var cellArrayIndex = 0; cellArrayIndex < cellArraySize;) {\n state.cellProvokedMap.clear();\n func(array[cellArrayIndex], array, cellArrayIndex + 1, cellId, state);\n cellArrayIndex += array[cellArrayIndex] + 1;\n cellId++;\n } // then we allocate the remaining structures\n // (we pick the best size to save space and transfer costs)\n\n\n if (numPts <= 0xffff) {\n state.flatIdToPointId = new Uint16Array(numPts + state.extraPoints);\n } else {\n state.flatIdToPointId = new Uint32Array(numPts + state.extraPoints);\n }\n\n if (numPts + state.extraPoints < 0x8fff) {\n state.pointIdToFlatId = new Int16Array(numPts);\n } else {\n state.pointIdToFlatId = new Int32Array(numPts);\n }\n\n if (numPts + state.extraPoints <= 0xffff) {\n state.ibo = new Uint16Array(state.iboSize);\n req.format = 'uint16';\n } else {\n state.ibo = new Uint32Array(state.iboSize);\n req.format = 'uint32';\n }\n\n if (cellId <= 0xffff) {\n state.flatIdToCellId = new Uint16Array(numPts + state.extraPoints);\n } else {\n state.flatIdToCellId = new Uint32Array(numPts + state.extraPoints);\n }\n\n state.pointIdToFlatId.fill(-1);\n state.provokedPointIds.fill(0); // and fill them in\n\n processCell = fillCell;\n cellId = cellOffset || 0;\n\n for (var _cellArrayIndex = 0; _cellArrayIndex < cellArraySize;) {\n state.cellProvokedMap.clear();\n func(array[_cellArrayIndex], array, _cellArrayIndex + 1, cellId, state);\n _cellArrayIndex += array[_cellArrayIndex] + 1;\n cellId++;\n }\n\n delete state.provokedPointIds;\n delete state.pointIdToFlatId; // store the results we need\n\n req.nativeArray = state.ibo;\n model.flatIdToPointId = state.flatIdToPointId;\n model.flatIdToCellId = state.flatIdToCellId;\n model.flatSize = state.flatId;\n model.indexCount = state.iboId;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n flatIdToPointId: null,\n flatIdToCellId: null,\n flatSize: 0,\n indexCount: 0\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkWebGPUBuffer.extend(publicAPI, model, initialValues);\n macro.setGet(publicAPI, model, ['flatIdToPointId', 'flatIdToCellId', 'flatSize', 'indexCount']);\n vtkWebGPUIndexBuffer(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend); // ----------------------------------------------------------------------------\n\nvar vtkWebGPUIndexBuffer$1 = _objectSpread({\n newInstance: newInstance,\n extend: extend\n}, Constants);\n\nexport { vtkWebGPUIndexBuffer$1 as default, extend, newInstance };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport { newInstance as newInstance$1, obj, setGet, vtkErrorMacro as vtkErrorMacro$1, newTypedArray } from '../../macros.js';\nimport { j as cross, l as normalize } from '../../Common/Core/Math/index.js';\nimport vtkDataArray from '../../Common/Core/DataArray.js';\nimport vtkWebGPUBuffer from './Buffer.js';\nimport vtkWebGPUIndexBuffer from './IndexBuffer.js';\nimport vtkWebGPUTypes from './Types.js';\nimport Constants from './BufferManager/Constants.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nvar BufferUsage = Constants.BufferUsage;\nvar vtkErrorMacro = vtkErrorMacro$1;\nvar VtkDataTypes = vtkDataArray.VtkDataTypes; // the webgpu constants all show up as undefined\n\n/* eslint-disable no-undef */\n// ----------------------------------------------------------------------------\n// Static API\n// ----------------------------------------------------------------------------\n\nvar STATIC = {};\n\nfunction _getFormatForDataArray(dataArray) {\n var format;\n\n switch (dataArray.getDataType()) {\n case VtkDataTypes.UNSIGNED_CHAR:\n format = 'uint8';\n break;\n\n case VtkDataTypes.FLOAT:\n format = 'float32';\n break;\n\n case VtkDataTypes.UNSIGNED_INT:\n format = 'uint32';\n break;\n\n case VtkDataTypes.INT:\n format = 'sint32';\n break;\n\n case VtkDataTypes.DOUBLE:\n format = 'float32';\n break;\n\n case VtkDataTypes.UNSIGNED_SHORT:\n format = 'uint16';\n break;\n\n case VtkDataTypes.SHORT:\n format = 'sin16';\n break;\n\n default:\n format = 'float32';\n break;\n }\n\n switch (dataArray.getNumberOfComponents()) {\n case 2:\n format += 'x2';\n break;\n\n case 3:\n // only 32bit types support x3\n if (!format.includes('32')) {\n vtkErrorMacro(\"unsupported x3 type for \".concat(format));\n }\n\n format += 'x3';\n break;\n\n case 4:\n format += 'x4';\n break;\n }\n\n return format;\n}\n\nfunction packArray(indexBuffer, inArrayData, numComp, outputType, options) {\n var result = {};\n var flatSize = indexBuffer.getFlatSize();\n\n if (!flatSize) {\n return result;\n } // setup shift and scale\n\n\n var shift = [0.0, 0.0, 0.0, 0.0];\n\n if (options.shift) {\n if (options.shift.length) {\n shift = options.shift;\n } else {\n shift.fill(options.shift);\n }\n }\n\n var scale = [1.0, 1.0, 1.0, 1.0];\n\n if (options.scale) {\n if (options.scale.length) {\n scale = options.scale;\n } else {\n scale.fill(options.scale);\n }\n }\n\n var packExtra = Object.prototype.hasOwnProperty.call(options, 'packExtra') ? options.packExtra : false;\n var addAPoint;\n var vboidx = 0;\n var stride = numComp + (packExtra ? 1 : 0);\n var packedVBO = newTypedArray(outputType, flatSize * stride); // pick the right function based on point versus cell data\n\n var flatIdMap = indexBuffer.getFlatIdToPointId();\n\n if (options.cellData) {\n flatIdMap = indexBuffer.getFlatIdToCellId();\n } // add data based on number of components\n\n\n if (numComp === 1) {\n addAPoint = function addAPointFunc(i) {\n packedVBO[vboidx++] = scale[0] * inArrayData[i] + shift[0];\n };\n } else if (numComp === 2) {\n addAPoint = function addAPointFunc(i) {\n packedVBO[vboidx++] = scale[0] * inArrayData[i] + shift[0];\n packedVBO[vboidx++] = scale[1] * inArrayData[i + 1] + shift[1];\n };\n } else if (numComp === 3 && !packExtra) {\n addAPoint = function addAPointFunc(i) {\n packedVBO[vboidx++] = scale[0] * inArrayData[i] + shift[0];\n packedVBO[vboidx++] = scale[1] * inArrayData[i + 1] + shift[1];\n packedVBO[vboidx++] = scale[2] * inArrayData[i + 2] + shift[2];\n };\n } else if (numComp === 3 && packExtra) {\n addAPoint = function addAPointFunc(i) {\n packedVBO[vboidx++] = scale[0] * inArrayData[i] + shift[0];\n packedVBO[vboidx++] = scale[1] * inArrayData[i + 1] + shift[1];\n packedVBO[vboidx++] = scale[2] * inArrayData[i + 2] + shift[2];\n packedVBO[vboidx++] = scale[3] * 1.0 + shift[3];\n };\n } else if (numComp === 4) {\n addAPoint = function addAPointFunc(i) {\n packedVBO[vboidx++] = scale[0] * inArrayData[i] + shift[0];\n packedVBO[vboidx++] = scale[1] * inArrayData[i + 1] + shift[1];\n packedVBO[vboidx++] = scale[2] * inArrayData[i + 2] + shift[2];\n packedVBO[vboidx++] = scale[3] * inArrayData[i + 3] + shift[3];\n };\n } // for each entry in the flat array process it\n\n\n for (var index = 0; index < flatSize; index++) {\n var inArrayId = numComp * flatIdMap[index];\n addAPoint(inArrayId);\n }\n\n result.nativeArray = packedVBO;\n return result;\n}\n\nfunction getNormal(pointData, i0, i1, i2) {\n var v1 = [pointData[i2 * 3] - pointData[i1 * 3], pointData[i2 * 3 + 1] - pointData[i1 * 3 + 1], pointData[i2 * 3 + 2] - pointData[i1 * 3 + 2]];\n var v2 = [pointData[i0 * 3] - pointData[i1 * 3], pointData[i0 * 3 + 1] - pointData[i1 * 3 + 1], pointData[i0 * 3 + 2] - pointData[i1 * 3 + 2]];\n var result = [];\n cross(v1, v2, result);\n normalize(result);\n return result;\n}\n\nfunction generateNormals(cellArray, pointArray) {\n var pointData = pointArray.getData();\n var cellArrayData = cellArray.getData();\n\n if (!cellArrayData || !pointData) {\n return null;\n } // return a cellArray of normals\n\n\n var packedVBO = new Int8Array(cellArray.getNumberOfCells() * 4);\n var size = cellArrayData.length;\n var vboidx = 0;\n\n for (var index = 0; index < size;) {\n var normal = getNormal(pointData, cellArrayData[index + 1], cellArrayData[index + 2], cellArrayData[index + 3]);\n packedVBO[vboidx++] = 127 * normal[0];\n packedVBO[vboidx++] = 127 * normal[1];\n packedVBO[vboidx++] = 127 * normal[2];\n packedVBO[vboidx++] = 127;\n index += cellArrayData[index] + 1;\n }\n\n return packedVBO;\n} // ----------------------------------------------------------------------------\n// vtkWebGPUBufferManager methods\n// ----------------------------------------------------------------------------\n\n\nfunction vtkWebGPUBufferManager(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkWebGPUBufferManager');\n\n function _createBuffer(req) {\n // if a dataArray is provided set the nativeArray\n if (req.dataArray && !req.nativeArray) {\n req.nativeArray = req.dataArray.getData();\n }\n\n var buffer;\n var gpuUsage; // handle index buffers\n\n if (req.usage === BufferUsage.Index) {\n // todo change to FlattenedIndex to be more clear\n buffer = vtkWebGPUIndexBuffer.newInstance({\n label: req.label\n });\n buffer.setDevice(model.device);\n /* eslint-disable no-bitwise */\n\n gpuUsage = GPUBufferUsage.INDEX | GPUBufferUsage.COPY_DST;\n /* eslint-enable no-bitwise */\n\n buffer.buildIndexBuffer(req);\n buffer.createAndWrite(req.nativeArray, gpuUsage);\n buffer.setArrayInformation([{\n format: req.format\n }]);\n } // create one if not done already\n\n\n if (!buffer) {\n buffer = vtkWebGPUBuffer.newInstance({\n label: req.label\n });\n buffer.setDevice(model.device);\n } // handle uniform buffers\n\n\n if (req.usage === BufferUsage.UniformArray) {\n /* eslint-disable no-bitwise */\n gpuUsage = GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST;\n /* eslint-enable no-bitwise */\n\n buffer.createAndWrite(req.nativeArray, gpuUsage);\n } // handle storage buffers\n\n\n if (req.usage === BufferUsage.Storage) {\n /* eslint-disable no-bitwise */\n gpuUsage = GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST;\n /* eslint-enable no-bitwise */\n\n buffer.createAndWrite(req.nativeArray, gpuUsage);\n } // handle textures\n\n\n if (req.usage === BufferUsage.Texture) {\n /* eslint-disable no-bitwise */\n gpuUsage = GPUBufferUsage.COPY_SRC;\n /* eslint-enable no-bitwise */\n\n buffer.createAndWrite(req.nativeArray, gpuUsage);\n } // all of the below types that have gpuUsage = VERTEX require format\n // to be provided.\n // handle point data\n\n\n if (req.usage === BufferUsage.PointArray) {\n gpuUsage = GPUBufferUsage.VERTEX;\n var arrayType = vtkWebGPUTypes.getNativeTypeFromBufferFormat(req.format);\n var result = packArray(req.indexBuffer, req.dataArray.getData(), req.dataArray.getNumberOfComponents(), arrayType, {\n packExtra: req.packExtra,\n shift: req.shift,\n scale: req.scale,\n cellData: req.cellData,\n cellOffset: req.cellOffset\n });\n buffer.createAndWrite(result.nativeArray, gpuUsage);\n buffer.setStrideInBytes(vtkWebGPUTypes.getByteStrideFromBufferFormat(req.format));\n buffer.setArrayInformation([{\n offset: 0,\n format: req.format,\n interpolation: req.cellData ? 'flat' : 'perspective'\n }]);\n } // handle normals from points, snorm8x4\n\n\n if (req.usage === BufferUsage.NormalsFromPoints) {\n gpuUsage = GPUBufferUsage.VERTEX;\n\n var _arrayType = vtkWebGPUTypes.getNativeTypeFromBufferFormat(req.format);\n\n var normals = generateNormals(req.cells, req.dataArray);\n\n var _result = packArray(req.indexBuffer, normals, 4, _arrayType, {\n cellData: true\n });\n\n buffer.createAndWrite(_result.nativeArray, gpuUsage);\n buffer.setStrideInBytes(vtkWebGPUTypes.getByteStrideFromBufferFormat(req.format));\n buffer.setArrayInformation([{\n offset: 0,\n format: req.format,\n interpolation: 'flat'\n }]);\n }\n\n if (req.usage === BufferUsage.RawVertex) {\n gpuUsage = GPUBufferUsage.VERTEX;\n buffer.createAndWrite(req.nativeArray, gpuUsage);\n buffer.setStrideInBytes(vtkWebGPUTypes.getByteStrideFromBufferFormat(req.format));\n buffer.setArrayInformation([{\n offset: 0,\n format: req.format\n }]);\n }\n\n buffer.setSourceTime(req.time);\n return buffer;\n } // is the buffer already present?\n\n\n publicAPI.hasBuffer = function (hash) {\n return model.device.hasCachedObject(hash);\n };\n\n publicAPI.getBuffer = function (req) {\n // if we have a source the get/create/cache the buffer\n if (req.hash) {\n return model.device.getCachedObject(req.hash, _createBuffer, req);\n }\n\n return _createBuffer(req);\n };\n\n publicAPI.getBufferForPointArray = function (dataArray, indexBuffer) {\n var format = _getFormatForDataArray(dataArray);\n\n var buffRequest = {\n hash: \"\".concat(dataArray.getMTime(), \"I\").concat(indexBuffer.getMTime()).concat(format),\n usage: BufferUsage.PointArray,\n format: format,\n dataArray: dataArray,\n indexBuffer: indexBuffer\n };\n return publicAPI.getBuffer(buffRequest);\n };\n\n publicAPI.getFullScreenQuadBuffer = function () {\n if (model.fullScreenQuadBuffer) {\n return model.fullScreenQuadBuffer;\n }\n\n model.fullScreenQuadBuffer = vtkWebGPUBuffer.newInstance();\n model.fullScreenQuadBuffer.setDevice(model.device); // prettier-ignore\n\n var array = new Float32Array([-1.0, -1.0, 0.0, 1.0, -1.0, 0.0, 1.0, 1.0, 0.0, -1.0, -1.0, 0.0, 1.0, 1.0, 0.0, -1.0, 1.0, 0.0]);\n model.fullScreenQuadBuffer.createAndWrite(array, GPUBufferUsage.VERTEX);\n model.fullScreenQuadBuffer.setStrideInBytes(12);\n model.fullScreenQuadBuffer.setArrayInformation([{\n offset: 0,\n format: 'float32x3'\n }]);\n return model.fullScreenQuadBuffer;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n device: null,\n fullScreenQuadBuffer: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Object methods\n\n obj(publicAPI, model);\n setGet(publicAPI, model, ['device']);\n vtkWebGPUBufferManager(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend); // ----------------------------------------------------------------------------\n\nvar vtkWebGPUBufferManager$1 = _objectSpread(_objectSpread({\n newInstance: newInstance,\n extend: extend\n}, STATIC), Constants);\n\nexport { STATIC, vtkWebGPUBufferManager$1 as default, extend, newInstance };\n","import macro from '../../macros.js';\nimport vtkWebGPUBufferManager from './BufferManager.js';\nimport vtkWebGPUTypes from './Types.js';\n\nvar BufferUsage = vtkWebGPUBufferManager.BufferUsage;\nvar vtkErrorMacro = macro.vtkErrorMacro; // ----------------------------------------------------------------------------\n// vtkWebGPUStorageBuffer - similar to the UniformBuffer class\n// but YOU are responsible for layout issues and alignment.\n// The order you add entries is the order they will be layed out\n// in memory. But you must follow layout rules.\n// ----------------------------------------------------------------------------\n// ----------------------------------------------------------------------------\n// vtkWebGPUStorageBuffer methods\n// ----------------------------------------------------------------------------\n\nfunction vtkWebGPUStorageBuffer(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkWebGPUStorageBuffer');\n\n publicAPI.addEntry = function (name, type) {\n if (model._bufferEntryNames.has(name)) {\n vtkErrorMacro(\"entry named \".concat(name, \" already exists\"));\n return;\n }\n\n model._bufferEntryNames.set(name, model.bufferEntries.length);\n\n var sizeInBytes = vtkWebGPUTypes.getByteStrideFromShaderFormat(type);\n model.bufferEntries.push({\n name: name,\n type: type,\n sizeInBytes: sizeInBytes,\n offset: model.sizeInBytes,\n nativeType: vtkWebGPUTypes.getNativeTypeFromShaderFormat(type)\n });\n model.sizeInBytes += sizeInBytes;\n };\n\n publicAPI.send = function (device) {\n if (!model._buffer) {\n var req = {\n nativeArray: model.Float32Array,\n usage: BufferUsage.Storage,\n label: model.label\n };\n model._buffer = device.getBufferManager().getBuffer(req);\n model.bindGroupTime.modified();\n\n model._sendTime.modified();\n\n return;\n }\n\n device.getHandle().queue.writeBuffer(model._buffer.getHandle(), 0, model.arrayBuffer, 0, model.sizeInBytes * model.numberOfInstances);\n\n model._sendTime.modified();\n };\n\n publicAPI.createView = function (type) {\n if (type in model === false) {\n if (!model.arrayBuffer) {\n model.arrayBuffer = new ArrayBuffer(model.sizeInBytes * model.numberOfInstances);\n }\n\n model[type] = macro.newTypedArray(type, model.arrayBuffer);\n }\n };\n\n publicAPI.setValue = function (name, instance, val) {\n var idx = model._bufferEntryNames.get(name);\n\n if (idx === undefined) {\n vtkErrorMacro(\"entry named \".concat(name, \" not found in UBO\"));\n return;\n }\n\n var entry = model.bufferEntries[idx];\n publicAPI.createView(entry.nativeType);\n var view = model[entry.nativeType];\n view[(entry.offset + instance * model.sizeInBytes) / view.BYTES_PER_ELEMENT] = val;\n };\n\n publicAPI.setArray = function (name, instance, arr) {\n var idx = model._bufferEntryNames.get(name);\n\n if (idx === undefined) {\n vtkErrorMacro(\"entry named \".concat(name, \" not found in UBO\"));\n return;\n }\n\n var entry = model.bufferEntries[idx];\n publicAPI.createView(entry.nativeType);\n var view = model[entry.nativeType];\n var ioffset = (entry.offset + instance * model.sizeInBytes) / view.BYTES_PER_ELEMENT;\n\n for (var i = 0; i < arr.length; i++) {\n view[ioffset + i] = arr[i];\n }\n };\n\n publicAPI.setAllInstancesFromArray = function (name, arr) {\n var idx = model._bufferEntryNames.get(name);\n\n if (idx === undefined) {\n vtkErrorMacro(\"entry named \".concat(name, \" not found in UBO\"));\n return;\n }\n\n var entry = model.bufferEntries[idx];\n publicAPI.createView(entry.nativeType);\n var view = model[entry.nativeType];\n var numComponents = arr.length / model.numberOfInstances;\n\n for (var inst = 0; inst < model.numberOfInstances; inst++) {\n var ioffset = (entry.offset + inst * model.sizeInBytes) / view.BYTES_PER_ELEMENT;\n\n for (var i = 0; i < numComponents; i++) {\n view[ioffset + i] = arr[inst * numComponents + i];\n }\n }\n };\n\n publicAPI.setAllInstancesFromArrayColorToFloat = function (name, arr) {\n var idx = model._bufferEntryNames.get(name);\n\n if (idx === undefined) {\n vtkErrorMacro(\"entry named \".concat(name, \" not found in UBO\"));\n return;\n }\n\n var entry = model.bufferEntries[idx];\n publicAPI.createView(entry.nativeType);\n var view = model[entry.nativeType];\n var numComponents = arr.length / model.numberOfInstances;\n\n for (var inst = 0; inst < model.numberOfInstances; inst++) {\n var ioffset = (entry.offset + inst * model.sizeInBytes) / view.BYTES_PER_ELEMENT;\n\n for (var i = 0; i < numComponents; i++) {\n view[ioffset + i] = arr[inst * numComponents + i] / 255.0;\n }\n }\n };\n\n publicAPI.setAllInstancesFromArray3x3To4x4 = function (name, arr) {\n var idx = model._bufferEntryNames.get(name);\n\n if (idx === undefined) {\n vtkErrorMacro(\"entry named \".concat(name, \" not found in UBO\"));\n return;\n }\n\n var entry = model.bufferEntries[idx];\n publicAPI.createView(entry.nativeType);\n var view = model[entry.nativeType];\n var numComponents = 9;\n\n for (var inst = 0; inst < model.numberOfInstances; inst++) {\n var ioffset = (entry.offset + inst * model.sizeInBytes) / view.BYTES_PER_ELEMENT;\n\n for (var j = 0; j < 3; j++) {\n for (var i = 0; i < 3; i++) {\n view[ioffset + j * 4 + i] = arr[inst * numComponents + j * 3 + i];\n }\n }\n }\n };\n\n publicAPI.getSendTime = function () {\n return model._sendTime.getMTime();\n };\n\n publicAPI.getShaderCode = function (binding, group) {\n var lines = [\"struct \".concat(model.label, \"StructEntry\\n{\")];\n\n for (var i = 0; i < model.bufferEntries.length; i++) {\n var entry = model.bufferEntries[i];\n lines.push(\" \".concat(entry.name, \": \").concat(entry.type, \",\"));\n }\n\n lines.push(\"\\n};\\nstruct \".concat(model.label, \"Struct\\n{\\n values: array<\").concat(model.label, \"StructEntry>,\\n};\\n@binding(\").concat(binding, \") @group(\").concat(group, \") var \").concat(model.label, \": \").concat(model.label, \"Struct;\\n\"));\n return lines.join('\\n');\n };\n\n publicAPI.getBindGroupEntry = function () {\n var foo = {\n resource: {\n buffer: model._buffer.getHandle()\n }\n };\n return foo;\n };\n\n publicAPI.clearData = function () {\n model.numberOfInstances = 0;\n model.sizeInBytes = 0;\n model.bufferEntries = [];\n model._bufferEntryNames = new Map();\n model._buffer = null;\n delete model.arrayBuffer;\n delete model.Float32Array;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n bufferEntries: null,\n bufferEntryNames: null,\n sizeInBytes: 0,\n label: null,\n numberOfInstances: 1\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Build VTK API\n\n macro.obj(publicAPI, model); // Internal objects\n\n model._bufferEntryNames = new Map();\n model.bufferEntries = [];\n model._sendTime = {};\n macro.obj(model._sendTime, {\n mtime: 0\n });\n model.bindGroupTime = {};\n macro.obj(model.bindGroupTime, {\n mtime: 0\n }); // default SSBO desc\n\n model.bindGroupLayoutEntry = model.bindGroupLayoutEntry || {\n buffer: {\n type: 'read-only-storage'\n }\n };\n macro.get(publicAPI, model, ['bindGroupTime']);\n macro.setGet(publicAPI, model, ['device', 'bindGroupLayoutEntry', 'label', 'numberOfInstances', 'sizeInBytes']); // Object methods\n\n vtkWebGPUStorageBuffer(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkWebGPUStorageBuffer'); // ----------------------------------------------------------------------------\n\nvar vtkWebGPUStorageBuffer$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkWebGPUStorageBuffer$1 as default, extend, newInstance };\n","import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';\nimport macro from '../../macros.js';\nimport vtkWebGPUBufferManager from './BufferManager.js';\nimport vtkWebGPUTypes from './Types.js';\n\nvar BufferUsage = vtkWebGPUBufferManager.BufferUsage;\nvar vtkErrorMacro = macro.vtkErrorMacro; // ----------------------------------------------------------------------------\n// vtkWebGPUUniformBuffer methods\n// ----------------------------------------------------------------------------\n\nfunction vtkWebGPUUniformBuffer(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkWebGPUUniformBuffer');\n\n publicAPI.addEntry = function (name, type) {\n if (model._bufferEntryNames.has(name)) {\n vtkErrorMacro(\"entry named \".concat(name, \" already exists\"));\n return;\n }\n\n model.sortDirty = true;\n\n model._bufferEntryNames.set(name, model.bufferEntries.length);\n\n model.bufferEntries.push({\n name: name,\n type: type,\n sizeInBytes: vtkWebGPUTypes.getByteStrideFromShaderFormat(type),\n offset: -1,\n nativeType: vtkWebGPUTypes.getNativeTypeFromShaderFormat(type),\n packed: false\n });\n }; // UBOs have layout rules in terms of how memory is aligned so we\n // have to be careful how we order the entries. For example a vec4\n // must be aligned on a 16 byte offset, etc. See\n // https://gpuweb.github.io/gpuweb/wgsl/#memory-layouts\n // for more details. Right now you can create a situation that would fail\n // in the future we could add dummy spacer entries where needed to\n // handle alignment issues\n\n\n publicAPI.sortBufferEntries = function () {\n if (!model.sortDirty) {\n return;\n }\n\n var currOffset = 0;\n var newEntries = []; // compute the max alignment, this is required as WebGPU defines a UBO to have\n // a size that is a multiple of the maxAlignment\n\n var maxAlignment = 4;\n\n for (var i = 0; i < model.bufferEntries.length; i++) {\n var entry = model.bufferEntries[i];\n\n if (entry.sizeInBytes % 16 === 0) {\n maxAlignment = Math.max(16, maxAlignment);\n }\n\n if (entry.sizeInBytes % 8 === 0) {\n maxAlignment = Math.max(8, maxAlignment);\n }\n } // pack anything whose size is a multiple of 16 bytes first\n // this includes a couple types that don't require 16 byte alignment\n // such as mat2x2 but that is OK\n\n\n for (var _i = 0; _i < model.bufferEntries.length; _i++) {\n var _entry = model.bufferEntries[_i];\n\n if (_entry.packed === false && _entry.sizeInBytes % 16 === 0) {\n _entry.packed = true;\n _entry.offset = currOffset;\n newEntries.push(_entry);\n currOffset += _entry.sizeInBytes;\n }\n } // now it gets tough, we have the following common types (f32, i32, u32)\n // - vec2 8 byte size, 8 byte alignment\n // - vec3 12 byte size, 16 byte alignment\n // - f32 4 byte size, 4 byte alignment\n // try adding 12 byte, 4 byte pairs\n\n\n for (var _i2 = 0; _i2 < model.bufferEntries.length; _i2++) {\n var _entry2 = model.bufferEntries[_i2];\n\n if (_entry2.packed === false && _entry2.sizeInBytes === 12) {\n for (var i2 = 0; i2 < model.bufferEntries.length; i2++) {\n var entry2 = model.bufferEntries[i2];\n\n if (entry2.packed === false && entry2.sizeInBytes === 4) {\n _entry2.packed = true;\n _entry2.offset = currOffset;\n newEntries.push(_entry2);\n currOffset += _entry2.sizeInBytes;\n entry2.packed = true;\n entry2.offset = currOffset;\n newEntries.push(entry2);\n currOffset += entry2.sizeInBytes;\n break;\n }\n }\n }\n } // try adding 8 byte, 8 byte pairs\n\n\n for (var _i3 = 0; _i3 < model.bufferEntries.length; _i3++) {\n var _entry3 = model.bufferEntries[_i3];\n\n if (!_entry3.packed && _entry3.sizeInBytes % 8 === 0) {\n for (var _i4 = _i3 + 1; _i4 < model.bufferEntries.length; _i4++) {\n var _entry4 = model.bufferEntries[_i4];\n\n if (!_entry4.packed && _entry4.sizeInBytes % 8 === 0) {\n _entry3.packed = true;\n _entry3.offset = currOffset;\n newEntries.push(_entry3);\n currOffset += _entry3.sizeInBytes;\n _entry4.packed = true;\n _entry4.offset = currOffset;\n newEntries.push(_entry4);\n currOffset += _entry4.sizeInBytes;\n break;\n }\n }\n }\n } // try adding 8 byte, 4 byte 4 byte triplets\n\n\n for (var _i5 = 0; _i5 < model.bufferEntries.length; _i5++) {\n var _entry5 = model.bufferEntries[_i5];\n\n if (!_entry5.packed && _entry5.sizeInBytes % 8 === 0) {\n var found = false;\n\n for (var _i6 = 0; !found && _i6 < model.bufferEntries.length; _i6++) {\n var _entry6 = model.bufferEntries[_i6];\n\n if (!_entry6.packed && _entry6.sizeInBytes === 4) {\n for (var i3 = _i6 + 1; i3 < model.bufferEntries.length; i3++) {\n var entry3 = model.bufferEntries[i3];\n\n if (!entry3.packed && entry3.sizeInBytes === 4) {\n _entry5.packed = true;\n _entry5.offset = currOffset;\n newEntries.push(_entry5);\n currOffset += _entry5.sizeInBytes;\n _entry6.packed = true;\n _entry6.offset = currOffset;\n newEntries.push(_entry6);\n currOffset += _entry6.sizeInBytes;\n entry3.packed = true;\n entry3.offset = currOffset;\n newEntries.push(entry3);\n currOffset += entry3.sizeInBytes;\n found = true;\n break;\n }\n }\n }\n }\n }\n } // Add anything remaining that is larger than 4 bytes and hope we get lucky.\n // Likely if there is more than one item added here it will result\n // in a failed UBO\n\n\n for (var _i7 = 0; _i7 < model.bufferEntries.length; _i7++) {\n var _entry7 = model.bufferEntries[_i7];\n\n if (!_entry7.packed && _entry7.sizeInBytes > 4) {\n _entry7.packed = true;\n _entry7.offset = currOffset;\n newEntries.push(_entry7);\n currOffset += _entry7.sizeInBytes;\n }\n } // finally add remaining 4 byte items\n\n\n for (var _i8 = 0; _i8 < model.bufferEntries.length; _i8++) {\n var _entry8 = model.bufferEntries[_i8];\n\n if (!_entry8.packed) {\n _entry8.packed = true;\n _entry8.offset = currOffset;\n newEntries.push(_entry8);\n currOffset += _entry8.sizeInBytes;\n }\n } // update entries and entryNames\n\n\n model.bufferEntries = newEntries;\n\n model._bufferEntryNames.clear();\n\n for (var _i9 = 0; _i9 < model.bufferEntries.length; _i9++) {\n model._bufferEntryNames.set(model.bufferEntries[_i9].name, _i9);\n }\n\n model.sizeInBytes = currOffset;\n model.sizeInBytes = maxAlignment * Math.ceil(model.sizeInBytes / maxAlignment);\n model.sortDirty = false;\n };\n\n publicAPI.sendIfNeeded = function (device) {\n if (!model.UBO) {\n var req = {\n nativeArray: model.Float32Array,\n usage: BufferUsage.UniformArray,\n label: model.label\n };\n model.UBO = device.getBufferManager().getBuffer(req);\n model.bindGroupTime.modified();\n model.sendDirty = false;\n } // send data down if needed\n\n\n if (model.sendDirty) {\n device.getHandle().queue.writeBuffer(model.UBO.getHandle(), 0, model.arrayBuffer, 0, model.sizeInBytes);\n model.sendDirty = false;\n } // always updated as mappers depend on this time\n // it is more of a sentIfNeededTime\n\n\n model.sendTime.modified();\n };\n\n publicAPI.createView = function (type) {\n if (type in model === false) {\n if (!model.arrayBuffer) {\n model.arrayBuffer = new ArrayBuffer(model.sizeInBytes);\n }\n\n model[type] = macro.newTypedArray(type, model.arrayBuffer);\n }\n };\n\n publicAPI.setValue = function (name, val) {\n publicAPI.sortBufferEntries();\n\n var idx = model._bufferEntryNames.get(name);\n\n if (idx === undefined) {\n vtkErrorMacro(\"entry named \".concat(name, \" not found in UBO\"));\n return;\n }\n\n var entry = model.bufferEntries[idx];\n publicAPI.createView(entry.nativeType);\n var view = model[entry.nativeType];\n\n if (entry.lastValue !== val) {\n view[entry.offset / view.BYTES_PER_ELEMENT] = val;\n model.sendDirty = true;\n }\n\n entry.lastValue = val;\n };\n\n publicAPI.setArray = function (name, arr) {\n publicAPI.sortBufferEntries();\n\n var idx = model._bufferEntryNames.get(name);\n\n if (idx === undefined) {\n vtkErrorMacro(\"entry named \".concat(name, \" not found in UBO\"));\n return;\n }\n\n var entry = model.bufferEntries[idx];\n publicAPI.createView(entry.nativeType);\n var view = model[entry.nativeType];\n var changed = false;\n\n for (var i = 0; i < arr.length; i++) {\n if (!entry.lastValue || entry.lastValue[i] !== arr[i]) {\n view[entry.offset / view.BYTES_PER_ELEMENT + i] = arr[i];\n changed = true;\n }\n }\n\n if (changed) {\n model.sendDirty = true;\n entry.lastValue = _toConsumableArray(arr);\n }\n };\n\n publicAPI.getBindGroupEntry = function () {\n var foo = {\n resource: {\n buffer: model.UBO.getHandle()\n }\n };\n return foo;\n };\n\n publicAPI.getSendTime = function () {\n return model.sendTime.getMTime();\n };\n\n publicAPI.getShaderCode = function (binding, group) {\n // sort the entries\n publicAPI.sortBufferEntries();\n var lines = [\"struct \".concat(model.label, \"Struct\\n{\")];\n\n for (var i = 0; i < model.bufferEntries.length; i++) {\n var entry = model.bufferEntries[i];\n lines.push(\" \".concat(entry.name, \": \").concat(entry.type, \",\"));\n }\n\n lines.push(\"};\\n@binding(\".concat(binding, \") @group(\").concat(group, \") var \").concat(model.label, \": \").concat(model.label, \"Struct;\"));\n return lines.join('\\n');\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n bufferEntries: null,\n bufferEntryNames: null,\n sizeInBytes: 0,\n label: null,\n bindGroupLayoutEntry: null,\n bindGroupEntry: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Build VTK API\n\n macro.obj(publicAPI, model); // Internal objects\n\n model._bufferEntryNames = new Map();\n model.bufferEntries = []; // default UBO desc\n\n model.bindGroupLayoutEntry = model.bindGroupLayoutEntry || {\n buffer: {\n type: 'uniform'\n }\n };\n model.sendTime = {};\n macro.obj(model.sendTime, {\n mtime: 0\n });\n model.bindGroupTime = {};\n macro.obj(model.bindGroupTime, {\n mtime: 0\n });\n model.sendDirty = true;\n model.sortDirty = true;\n macro.get(publicAPI, model, ['binding', 'bindGroupTime']);\n macro.setGet(publicAPI, model, ['bindGroupLayoutEntry', 'device', 'label', 'sizeInBytes']); // Object methods\n\n vtkWebGPUUniformBuffer(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkWebGPUUniformBuffer'); // ----------------------------------------------------------------------------\n\nvar vtkWebGPUUniformBuffer$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkWebGPUUniformBuffer$1 as default, extend, newInstance };\n","import { mat4, vec3 } from 'gl-matrix';\nimport { newInstance as newInstance$1, obj, get, getArray, setGet, vtkDebugMacro as vtkDebugMacro$1 } from '../../macros.js';\nimport { r as radiansFromDegrees } from '../../Common/Core/Math/index.js';\nimport vtkViewNode from '../SceneGraph/ViewNode.js';\nimport vtkWebGPUBindGroup from './BindGroup.js';\nimport vtkWebGPUFullScreenQuad from './FullScreenQuad.js';\nimport vtkWebGPUStorageBuffer from './StorageBuffer.js';\nimport vtkWebGPUUniformBuffer from './UniformBuffer.js';\nimport { registerOverride } from './ViewNodeFactory.js';\n\nvar vtkDebugMacro = vtkDebugMacro$1;\nvar clearFragColorTemplate = \"\\n//VTK::Renderer::Dec\\n\\n//VTK::Mapper::Dec\\n\\n//VTK::TCoord::Dec\\n\\n//VTK::RenderEncoder::Dec\\n\\n//VTK::IOStructs::Dec\\n\\n@fragment\\nfn main(\\n//VTK::IOStructs::Input\\n)\\n//VTK::IOStructs::Output\\n{\\n var output: fragmentOutput;\\n\\n var computedColor: vec4 = mapperUBO.BackgroundColor;\\n\\n //VTK::RenderEncoder::Impl\\n return output;\\n}\\n\";\nvar clearFragTextureTemplate = \"\\nfn vecToRectCoord(dir: vec3) -> vec2 {\\n var tau: f32 = 6.28318530718;\\n var pi: f32 = 3.14159265359;\\n var out: vec2 = vec2(0.0);\\n\\n out.x = atan2(dir.z, dir.x) / tau;\\n out.x += 0.5;\\n\\n var phix: f32 = length(vec2(dir.x, dir.z));\\n out.y = atan2(dir.y, phix) / pi + 0.5;\\n\\n return out;\\n}\\n\\n//VTK::Renderer::Dec\\n\\n//VTK::Mapper::Dec\\n\\n//VTK::TCoord::Dec\\n\\n//VTK::RenderEncoder::Dec\\n\\n//VTK::IOStructs::Dec\\n\\n@fragment\\nfn main(\\n//VTK::IOStructs::Input\\n)\\n//VTK::IOStructs::Output\\n{\\n var output: fragmentOutput;\\n\\n var tcoord: vec4 = vec4(input.vertexVC.xy, -1, 1);\\n var V: vec4 = normalize(mapperUBO.FSQMatrix * tcoord); // vec2((input.tcoordVS.x - 0.5) * 2, -(input.tcoordVS.y - 0.5) * 2);\\n // textureSampleLevel gets rid of some ugly artifacts\\n var background = textureSampleLevel(EnvironmentTexture, EnvironmentTextureSampler, vecToRectCoord(V.xyz), 0);\\n var computedColor: vec4 = vec4(background.rgb, 1);\\n\\n //VTK::RenderEncoder::Impl\\n return output;\\n}\\n\";\n\nvar _fsqClearMat4 = new Float64Array(16);\n\nvar _tNormalMat4 = new Float64Array(16); // Light type index gives either 0, 1, or 2 which indicates what type of light there is.\n// While technically, there are only spot and directional lights, within the CellArrayMapper\n// there is a third, positional light. It is technically just a variant of a spot light with\n// a cone angle of 90 or above, however certain calculations can be skipped if it is treated\n// separately.\n// The mappings are shown below:\n// 0 -> positional light\n// 1 -> directional light\n// 2 -> spot light\n\n\nfunction getLightTypeIndex(light) {\n if (light.getPositional()) {\n if (light.getConeAngle() >= 90) {\n return 0;\n }\n\n return 2;\n }\n\n return 1;\n} // ----------------------------------------------------------------------------\n// vtkWebGPURenderer methods\n// ----------------------------------------------------------------------------\n\n/* eslint-disable no-bitwise */\n\n\nfunction vtkWebGPURenderer(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkWebGPURenderer'); // Builds myself.\n\n publicAPI.buildPass = function (prepass) {\n if (prepass) {\n if (!model.renderable) {\n return;\n }\n\n model.camera = model.renderable.getActiveCamera();\n publicAPI.updateLights();\n publicAPI.prepareNodes();\n publicAPI.addMissingNode(model.camera);\n publicAPI.addMissingNodes(model.renderable.getViewPropsWithNestedProps());\n publicAPI.removeUnusedNodes();\n model.webgpuCamera = publicAPI.getViewNodeFor(model.camera);\n publicAPI.updateStabilizedMatrix();\n }\n };\n\n publicAPI.updateStabilizedMatrix = function () {\n // This method is designed to help with floating point\n // issues when rendering datasets that push the limits of\n // resolutions on float.\n //\n // One of the most common cases is when the dataset is located far\n // away from the origin relative to the clipping range we are looking\n // at. For that case we want to perform the floating point sensitive\n // multiplications on the CPU in double. To this end we want the\n // vertex rendering ops to look something like\n //\n // Compute shifted points and load those into the VBO\n // pointCoordsSC = WorldToStabilizedMatrix * pointCoords;\n //\n // In the vertex shader do the following\n // positionVC = StabilizedToDeviceMatrix * ModelToStabilizedMatrix*vertexIn;\n //\n // We use two matrices because it is expensive to change the\n // WorldToStabilized matrix as we have to reupload all pointCoords\n // So that matrix (MCSCMatrix) is fairly static, the Stabilized to\n // Device matrix is the one that gets updated every time the camera\n // changes.\n //\n // The basic idea is that we should translate the data so that\n // when the center of the view frustum moves a lot\n // we recenter it. The center of the view frustum is roughly\n // camPos + dirOfProj*(far + near)*0.5\n var clipRange = model.camera.getClippingRange();\n var pos = model.camera.getPositionByReference();\n var dop = model.camera.getDirectionOfProjectionByReference();\n var center = [];\n var offset = [];\n vec3.scale(offset, dop, 0.5 * (clipRange[0] + clipRange[1]));\n vec3.add(center, pos, offset);\n vec3.sub(offset, center, model.stabilizedCenter);\n var length = vec3.len(offset);\n\n if (length / (clipRange[1] - clipRange[0]) > model.recenterThreshold) {\n model.stabilizedCenter = center;\n model.stabilizedTime.modified();\n }\n };\n\n publicAPI.updateLights = function () {\n var count = 0;\n var lights = model.renderable.getLightsByReference();\n\n for (var index = 0; index < lights.length; ++index) {\n if (lights[index].getSwitch() > 0.0) {\n count++;\n }\n }\n\n if (!count) {\n vtkDebugMacro('No lights are on, creating one.');\n model.renderable.createLight();\n }\n\n return count;\n };\n\n publicAPI.updateUBO = function () {\n // make sure the data is up to date\n // has the camera changed?\n var utime = model.UBO.getSendTime();\n\n if (model._parent.getMTime() > utime || publicAPI.getMTime() > utime || model.camera.getMTime() > utime || model.renderable.getMTime() > utime) {\n var _model$renderable$get;\n\n var keyMats = model.webgpuCamera.getKeyMatrices(publicAPI);\n model.UBO.setArray('WCVCMatrix', keyMats.wcvc);\n model.UBO.setArray('SCPCMatrix', keyMats.scpc);\n model.UBO.setArray('PCSCMatrix', keyMats.pcsc);\n model.UBO.setArray('SCVCMatrix', keyMats.scvc);\n model.UBO.setArray('VCPCMatrix', keyMats.vcpc);\n model.UBO.setArray('WCVCNormals', keyMats.normalMatrix);\n model.UBO.setValue('LightCount', model.renderable.getLights().length);\n model.UBO.setValue('MaxEnvironmentMipLevel', (_model$renderable$get = model.renderable.getEnvironmentTexture()) === null || _model$renderable$get === void 0 ? void 0 : _model$renderable$get.getMipLevel());\n model.UBO.setValue('BackgroundDiffuseStrength', model.renderable.getEnvironmentTextureDiffuseStrength());\n model.UBO.setValue('BackgroundSpecularStrength', model.renderable.getEnvironmentTextureSpecularStrength());\n var tsize = publicAPI.getYInvertedTiledSizeAndOrigin();\n model.UBO.setArray('viewportSize', [tsize.usize, tsize.vsize]);\n model.UBO.setValue('cameraParallel', model.camera.getParallelProjection());\n\n var device = model._parent.getDevice();\n\n model.UBO.sendIfNeeded(device);\n }\n };\n\n publicAPI.updateSSBO = function () {\n var lights = model.renderable.getLights();\n var keyMats = model.webgpuCamera.getKeyMatrices(publicAPI);\n var lightTimeString = \"\".concat(model.renderable.getMTime());\n\n for (var i = 0; i < lights.length; i++) {\n lightTimeString += lights[i].getMTime();\n }\n\n if (lightTimeString !== model.lightTimeString) {\n var lightPosArray = new Float32Array(lights.length * 4);\n var lightDirArray = new Float32Array(lights.length * 4);\n var lightColorArray = new Float32Array(lights.length * 4);\n var lightTypeArray = new Float32Array(lights.length * 4);\n\n for (var _i = 0; _i < lights.length; _i++) {\n var offset = _i * 4; // Position\n\n var viewCoordinatePosition = lights[_i].getPosition();\n\n vec3.transformMat4(viewCoordinatePosition, viewCoordinatePosition, keyMats.wcvc); // viewCoordinatePosition\n\n lightPosArray[offset] = viewCoordinatePosition[0];\n lightPosArray[offset + 1] = viewCoordinatePosition[1];\n lightPosArray[offset + 2] = viewCoordinatePosition[2];\n lightPosArray[offset + 3] = 0; // Rotation (All are negative to correct for -Z being forward)\n\n lightDirArray[offset] = -lights[_i].getDirection()[0];\n lightDirArray[offset + 1] = -lights[_i].getDirection()[1];\n lightDirArray[offset + 2] = -lights[_i].getDirection()[2];\n lightDirArray[offset + 3] = 0; // Color\n\n lightColorArray[offset] = lights[_i].getColor()[0];\n lightColorArray[offset + 1] = lights[_i].getColor()[1];\n lightColorArray[offset + 2] = lights[_i].getColor()[2];\n lightColorArray[offset + 3] = lights[_i].getIntensity() * 5; // arbitrary multiplication to fix the dullness of low value PBR lights\n // Type\n\n lightTypeArray[offset] = getLightTypeIndex(lights[_i]); // Type\n\n lightTypeArray[offset + 1] = Math.cos(radiansFromDegrees(lights[_i].getConeAngle())); // Inner Phi, should probably do some check on these to make sure they dont excede limits\n\n lightTypeArray[offset + 2] = Math.cos(radiansFromDegrees(lights[_i].getConeAngle() + lights[_i].getConeFalloff())); // Outer Phi\n\n lightTypeArray[offset + 3] = 0;\n } // Im not sure how correct this is, but this is what the example does\n // https://kitware.github.io/vtk-js/api/Rendering_WebGPU_VolumePassFSQ.html\n\n\n model.SSBO.clearData();\n model.SSBO.setNumberOfInstances(lights.length);\n model.SSBO.addEntry('LightPos', 'vec4'); // Position\n\n model.SSBO.addEntry('LightDir', 'vec4'); // Direction\n\n model.SSBO.addEntry('LightColor', 'vec4'); // Color (r, g, b, intensity)\n\n model.SSBO.addEntry('LightData', 'vec4'); // Other data (type, etc, etc, etc)\n\n model.SSBO.setAllInstancesFromArray('LightPos', lightPosArray);\n model.SSBO.setAllInstancesFromArray('LightDir', lightDirArray);\n model.SSBO.setAllInstancesFromArray('LightColor', lightColorArray);\n model.SSBO.setAllInstancesFromArray('LightData', lightTypeArray);\n\n var device = model._parent.getDevice();\n\n model.SSBO.send(device);\n }\n\n model.lightTimeString = lightTimeString;\n };\n\n publicAPI.scissorAndViewport = function (encoder) {\n var tsize = publicAPI.getYInvertedTiledSizeAndOrigin();\n encoder.getHandle().setViewport(tsize.lowerLeftU, tsize.lowerLeftV, tsize.usize, tsize.vsize, 0.0, 1.0); // set scissor\n\n encoder.getHandle().setScissorRect(tsize.lowerLeftU, tsize.lowerLeftV, tsize.usize, tsize.vsize);\n };\n\n publicAPI.bindUBO = function (renderEncoder) {\n renderEncoder.activateBindGroup(model.bindGroup);\n }; // Renders myself\n\n\n publicAPI.opaquePass = function (prepass) {\n if (prepass) {\n model.renderEncoder.begin(model._parent.getCommandEncoder());\n publicAPI.updateUBO();\n publicAPI.updateSSBO();\n } else {\n publicAPI.scissorAndViewport(model.renderEncoder);\n publicAPI.clear();\n model.renderEncoder.end();\n }\n };\n\n publicAPI.clear = function () {\n var _model$backgroundTex;\n\n if (model.renderable.getTransparent() || model.suppressClear) {\n return;\n }\n\n var device = model._parent.getDevice(); // Normal Solid Color\n\n\n if (!model.clearFSQ) {\n model.clearFSQ = vtkWebGPUFullScreenQuad.newInstance();\n model.clearFSQ.setDevice(device);\n model.clearFSQ.setPipelineHash('clearfsq');\n model.clearFSQ.setFragmentShaderTemplate(clearFragColorTemplate);\n var ubo = vtkWebGPUUniformBuffer.newInstance({\n label: 'mapperUBO'\n });\n ubo.addEntry('FSQMatrix', 'mat4x4');\n ubo.addEntry('BackgroundColor', 'vec4');\n model.clearFSQ.setUBO(ubo);\n model.backgroundTex = model.renderable.getEnvironmentTexture();\n } // Textured Background\n\n\n if (model.clearFSQ.getPipelineHash() !== 'clearfsqwithtexture' && model.renderable.getUseEnvironmentTextureAsBackground() && (_model$backgroundTex = model.backgroundTex) !== null && _model$backgroundTex !== void 0 && _model$backgroundTex.getImageLoaded()) {\n model.clearFSQ.setFragmentShaderTemplate(clearFragTextureTemplate);\n\n var _ubo = vtkWebGPUUniformBuffer.newInstance({\n label: 'mapperUBO'\n });\n\n _ubo.addEntry('FSQMatrix', 'mat4x4');\n\n _ubo.addEntry('BackgroundColor', 'vec4');\n\n model.clearFSQ.setUBO(_ubo);\n var environmentTextureHash = device.getTextureManager().getTextureForVTKTexture(model.backgroundTex);\n\n if (environmentTextureHash.getReady()) {\n var tview = environmentTextureHash.createView(\"EnvironmentTexture\");\n model.clearFSQ.setTextureViews([tview]);\n model.backgroundTexLoaded = true;\n var interpolate = model.backgroundTex.getInterpolate() ? 'linear' : 'nearest';\n tview.addSampler(device, {\n addressModeU: 'repeat',\n addressModeV: 'clamp-to-edge',\n addressModeW: 'repeat',\n minFilter: interpolate,\n magFilter: interpolate,\n mipmapFilter: 'linear'\n });\n }\n\n model.clearFSQ.setPipelineHash('clearfsqwithtexture');\n } else if (model.clearFSQ.getPipelineHash() === 'clearfsqwithtexture' && !model.renderable.getUseEnvironmentTextureAsBackground()) {\n // In case the mode is changed at runtime\n model.clearFSQ = vtkWebGPUFullScreenQuad.newInstance();\n model.clearFSQ.setDevice(device);\n model.clearFSQ.setPipelineHash('clearfsq');\n model.clearFSQ.setFragmentShaderTemplate(clearFragColorTemplate);\n\n var _ubo2 = vtkWebGPUUniformBuffer.newInstance({\n label: 'mapperUBO'\n });\n\n _ubo2.addEntry('FSQMatrix', 'mat4x4');\n\n _ubo2.addEntry('BackgroundColor', 'vec4');\n\n model.clearFSQ.setUBO(_ubo2);\n }\n\n var keyMats = model.webgpuCamera.getKeyMatrices(publicAPI);\n var background = model.renderable.getBackgroundByReference();\n model.clearFSQ.getUBO().setArray('BackgroundColor', background);\n mat4.transpose(_tNormalMat4, keyMats.normalMatrix);\n mat4.mul(_fsqClearMat4, keyMats.scvc, keyMats.pcsc);\n mat4.mul(_fsqClearMat4, _tNormalMat4, _fsqClearMat4);\n model.clearFSQ.getUBO().setArray('FSQMatrix', _fsqClearMat4);\n model.clearFSQ.getUBO().sendIfNeeded(device);\n model.clearFSQ.prepareAndDraw(model.renderEncoder);\n };\n\n publicAPI.translucentPass = function (prepass) {\n if (prepass) {\n model.renderEncoder.begin(model._parent.getCommandEncoder());\n } else {\n publicAPI.scissorAndViewport(model.renderEncoder);\n model.renderEncoder.end();\n }\n };\n\n publicAPI.volumeDepthRangePass = function (prepass) {\n if (prepass) {\n model.renderEncoder.begin(model._parent.getCommandEncoder());\n } else {\n publicAPI.scissorAndViewport(model.renderEncoder);\n model.renderEncoder.end();\n }\n };\n\n publicAPI.getAspectRatio = function () {\n var size = model._parent.getSizeByReference();\n\n var viewport = model.renderable.getViewportByReference();\n return size[0] * (viewport[2] - viewport[0]) / ((viewport[3] - viewport[1]) * size[1]);\n };\n\n publicAPI.convertToOpenGLDepth = function (val) {\n return model.webgpuCamera.convertToOpenGLDepth(val);\n };\n\n publicAPI.getYInvertedTiledSizeAndOrigin = function () {\n var res = publicAPI.getTiledSizeAndOrigin();\n\n var size = model._parent.getSizeByReference();\n\n res.lowerLeftV = size[1] - res.vsize - res.lowerLeftV;\n return res;\n };\n\n publicAPI.getTiledSizeAndOrigin = function () {\n var vport = model.renderable.getViewportByReference(); // if there is no window assume 0 1\n\n var tileViewPort = [0.0, 0.0, 1.0, 1.0]; // find the lower left corner of the viewport, taking into account the\n // lower left boundary of this tile\n\n var vpu = vport[0] - tileViewPort[0];\n var vpv = vport[1] - tileViewPort[1]; // store the result as a pixel value\n\n var ndvp = model._parent.normalizedDisplayToDisplay(vpu, vpv);\n\n var lowerLeftU = Math.round(ndvp[0]);\n var lowerLeftV = Math.round(ndvp[1]); // find the upper right corner of the viewport, taking into account the\n // lower left boundary of this tile\n\n var vpu2 = vport[2] - tileViewPort[0];\n var vpv2 = vport[3] - tileViewPort[1];\n\n var ndvp2 = model._parent.normalizedDisplayToDisplay(vpu2, vpv2); // now compute the size of the intersection of the viewport with the\n // current tile\n\n\n var usize = Math.round(ndvp2[0]) - lowerLeftU;\n var vsize = Math.round(ndvp2[1]) - lowerLeftV;\n\n if (usize < 0) {\n usize = 0;\n }\n\n if (vsize < 0) {\n vsize = 0;\n }\n\n return {\n usize: usize,\n vsize: vsize,\n lowerLeftU: lowerLeftU,\n lowerLeftV: lowerLeftV\n };\n };\n\n publicAPI.getPropFromID = function (id) {\n for (var i = 0; i < model.children.length; i++) {\n var res = model.children[i].getPropID ? model.children[i].getPropID() : -1;\n\n if (res === id) {\n return model.children[i];\n }\n }\n\n return null;\n };\n\n publicAPI.getStabilizedTime = function () {\n return model.stabilizedTime.getMTime();\n };\n\n publicAPI.releaseGraphicsResources = function () {\n if (model.selector !== null) {\n model.selector.releaseGraphicsResources();\n }\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n bindGroup: null,\n selector: null,\n renderEncoder: null,\n recenterThreshold: 20.0,\n suppressClear: false,\n stabilizedCenter: [0.0, 0.0, 0.0]\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkViewNode.extend(publicAPI, model, initialValues); // UBO\n\n model.UBO = vtkWebGPUUniformBuffer.newInstance({\n label: 'rendererUBO'\n });\n model.UBO.addEntry('WCVCMatrix', 'mat4x4');\n model.UBO.addEntry('SCPCMatrix', 'mat4x4');\n model.UBO.addEntry('PCSCMatrix', 'mat4x4');\n model.UBO.addEntry('SCVCMatrix', 'mat4x4');\n model.UBO.addEntry('VCPCMatrix', 'mat4x4');\n model.UBO.addEntry('WCVCNormals', 'mat4x4');\n model.UBO.addEntry('viewportSize', 'vec2');\n model.UBO.addEntry('LightCount', 'i32');\n model.UBO.addEntry('MaxEnvironmentMipLevel', 'f32');\n model.UBO.addEntry('BackgroundDiffuseStrength', 'f32');\n model.UBO.addEntry('BackgroundSpecularStrength', 'f32');\n model.UBO.addEntry('cameraParallel', 'u32'); // SSBO (Light data)\n\n model.SSBO = vtkWebGPUStorageBuffer.newInstance({\n label: 'rendererLightSSBO'\n });\n model.lightTimeString = '';\n model.bindGroup = vtkWebGPUBindGroup.newInstance({\n label: 'rendererBG'\n });\n model.bindGroup.setBindables([model.UBO, model.SSBO]);\n model.tmpMat4 = mat4.identity(new Float64Array(16));\n model.stabilizedTime = {};\n obj(model.stabilizedTime, {\n mtime: 0\n }); // Build VTK API\n\n get(publicAPI, model, ['bindGroup', 'stabilizedTime']);\n getArray(publicAPI, model, ['stabilizedCenter']);\n setGet(publicAPI, model, ['renderEncoder', 'selector', 'suppressClear', 'UBO']); // Object methods\n\n vtkWebGPURenderer(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend, 'vtkWebGPURenderer'); // ----------------------------------------------------------------------------\n\nvar index = {\n newInstance: newInstance,\n extend: extend\n}; // Register ourself to WebGPU backend if imported\n\nregisterOverride('vtkRenderer', newInstance);\n\nexport { index as default, extend, newInstance };\n","import macro from '../../macros.js';\n\n/* eslint-disable no-bitwise */\n// ----------------------------------------------------------------------------\n// vtkWebGPUSampler methods\n// ----------------------------------------------------------------------------\n\nfunction vtkWebGPUSampler(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkWebGPUSampler');\n\n publicAPI.create = function (device) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n model.device = device;\n model.options.addressModeU = options.addressModeU ? options.addressModeU : 'clamp-to-edge';\n model.options.addressModeV = options.addressModeV ? options.addressModeV : 'clamp-to-edge';\n model.options.addressModeW = options.addressModeW ? options.addressModeW : 'clamp-to-edge';\n model.options.magFilter = options.magFilter ? options.magFilter : 'nearest';\n model.options.minFilter = options.minFilter ? options.minFilter : 'nearest';\n model.options.mipmapFilter = options.mipmapFilter ? options.mipmapFilter : 'nearest';\n model.options.label = model.label;\n model.handle = model.device.getHandle().createSampler(model.options);\n model.bindGroupTime.modified();\n };\n\n publicAPI.getShaderCode = function (binding, group) {\n var result = \"@binding(\".concat(binding, \") @group(\").concat(group, \") var \").concat(model.label, \": sampler;\");\n return result;\n };\n\n publicAPI.getBindGroupEntry = function () {\n var foo = {\n resource: model.handle\n };\n return foo;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n device: null,\n handle: null,\n label: null,\n options: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Object methods\n\n macro.obj(publicAPI, model);\n model.options = {};\n model.bindGroupLayoutEntry = {\n /* eslint-disable no-undef */\n visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT,\n\n /* eslint-enable no-undef */\n sampler: {// type: 'filtering',\n }\n };\n model.bindGroupTime = {};\n macro.obj(model.bindGroupTime, {\n mtime: 0\n });\n macro.get(publicAPI, model, ['bindGroupTime', 'handle', 'options']);\n macro.setGet(publicAPI, model, ['bindGroupLayoutEntry', 'device', 'label']);\n vtkWebGPUSampler(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend); // ----------------------------------------------------------------------------\n\nvar vtkWebGPUSampler$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkWebGPUSampler$1 as default, extend, newInstance };\n","import { mat4, vec4 } from 'gl-matrix';\nimport Constants from '../Core/ImageMapper/Constants.js';\nimport { newInstance as newInstance$1, obj } from '../../macros.js';\nimport vtkWebGPUShaderCache from './ShaderCache.js';\nimport vtkWebGPUFullScreenQuad from './FullScreenQuad.js';\nimport vtkWebGPUUniformBuffer from './UniformBuffer.js';\nimport vtkWebGPUSampler from './Sampler.js';\nimport { InterpolationType } from '../Core/ImageProperty/Constants.js';\nimport { registerOverride } from './ViewNodeFactory.js';\n\nvar SlicingMode = Constants.SlicingMode;\nvar imgFragTemplate = \"\\n//VTK::Renderer::Dec\\n\\n//VTK::Mapper::Dec\\n\\n//VTK::TCoord::Dec\\n\\n//VTK::Image::Dec\\n\\n//VTK::RenderEncoder::Dec\\n\\n//VTK::IOStructs::Dec\\n\\n@fragment\\nfn main(\\n//VTK::IOStructs::Input\\n)\\n//VTK::IOStructs::Output\\n{\\n var output: fragmentOutput;\\n\\n //VTK::Image::Sample\\n\\n // var computedColor: vec4 = vec4(1.0,0.7, 0.5, 1.0);\\n\\n//VTK::RenderEncoder::Impl\\n\\n return output;\\n}\\n\"; // ----------------------------------------------------------------------------\n// helper methods\n// ----------------------------------------------------------------------------\n\nfunction computeFnToString(property, fn, numberOfComponents) {\n var pwfun = fn.apply(property);\n\n if (pwfun) {\n var iComps = property.getIndependentComponents();\n return \"\".concat(property.getMTime(), \"-\").concat(iComps, \"-\").concat(numberOfComponents);\n }\n\n return '0';\n} // ----------------------------------------------------------------------------\n// vtkWebGPUImageMapper methods\n// ----------------------------------------------------------------------------\n\n\nvar tmpMat4 = new Float64Array(16);\nvar tmp2Mat4 = new Float64Array(16);\nvar tmp3Mat4 = new Float64Array(16);\nvar ptsArray1 = new Float64Array(4);\nvar ptsArray2 = new Float64Array(4);\n\nfunction vtkWebGPUImageMapper(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkWebGPUImageMapper');\n\n publicAPI.buildPass = function (prepass) {\n if (prepass) {\n model.WebGPUImageSlice = publicAPI.getFirstAncestorOfType('vtkWebGPUImageSlice');\n model.WebGPURenderer = model.WebGPUImageSlice.getFirstAncestorOfType('vtkWebGPURenderer');\n model.WebGPURenderWindow = model.WebGPURenderer.getParent();\n model.device = model.WebGPURenderWindow.getDevice();\n var ren = model.WebGPURenderer.getRenderable(); // is slice set by the camera\n\n if (model.renderable.getSliceAtFocalPoint()) {\n model.renderable.setSliceFromCamera(ren.getActiveCamera());\n }\n }\n }; // Renders myself\n\n\n publicAPI.translucentPass = function (prepass) {\n if (prepass) {\n publicAPI.render();\n }\n };\n\n publicAPI.opaquePass = function (prepass) {\n if (prepass) {\n publicAPI.render();\n }\n };\n\n publicAPI.render = function () {\n model.renderable.update();\n model.currentInput = model.renderable.getInputData();\n publicAPI.prepareToDraw(model.WebGPURenderer.getRenderEncoder());\n model.renderEncoder.registerDrawCallback(model.pipeline, publicAPI.draw);\n };\n\n publicAPI.computePipelineHash = function () {\n var ext = model.currentInput.getExtent();\n\n if (ext[0] === ext[1] || ext[2] === ext[3] || ext[4] === ext[5]) {\n model.dimensions = 2;\n model.pipelineHash = 'img2';\n } else {\n model.dimensions = 3;\n model.pipelineHash = 'img3';\n }\n };\n\n publicAPI.updateUBO = function () {\n var utime = model.UBO.getSendTime();\n var actor = model.WebGPUImageSlice.getRenderable();\n var volMapr = actor.getMapper();\n\n if (publicAPI.getMTime() > utime || model.renderable.getMTime() > utime || actor.getProperty().getMTime() > utime) {\n // compute the SCTCMatrix\n var image = volMapr.getInputData();\n var center = model.WebGPURenderer.getStabilizedCenterByReference();\n mat4.identity(tmpMat4);\n mat4.translate(tmpMat4, tmpMat4, center); // tmpMat4 is now SC->World\n\n var mcwcmat = actor.getMatrix();\n mat4.transpose(tmp2Mat4, mcwcmat);\n mat4.invert(tmp2Mat4, tmp2Mat4); // tmp2Mat4 is now world to model\n\n mat4.multiply(tmpMat4, tmp2Mat4, tmpMat4); // tmp4Mat is now SC->Model\n // the method on the data is world to index but the volume is in\n // model coordinates so really in this context it is model to index\n\n var modelToIndex = image.getWorldToIndex();\n mat4.multiply(tmpMat4, modelToIndex, tmpMat4); // tmpMat4 is now SC -> Index, save this as we need it later\n\n mat4.invert(tmp3Mat4, tmpMat4); // need translation and scale\n\n mat4.fromTranslation(tmp2Mat4, [0.5, 0.5, 0.5]);\n mat4.multiply(tmpMat4, tmp2Mat4, tmpMat4);\n var dims = image.getDimensions();\n mat4.identity(tmp2Mat4);\n mat4.scale(tmp2Mat4, tmp2Mat4, [1.0 / dims[0], 1.0 / dims[1], 1.0 / dims[2]]);\n mat4.multiply(tmpMat4, tmp2Mat4, tmpMat4); // tmpMat4 is now SC -> Tcoord\n\n model.UBO.setArray('SCTCMatrix', tmpMat4); // need to compute the plane here in world coordinates\n // then pass that down in the UBO\n\n var ext = model.currentInput.getExtent(); // Find what IJK axis and what direction to slice along\n\n var _model$renderable$get = model.renderable.getClosestIJKAxis(),\n ijkMode = _model$renderable$get.ijkMode; // Find the IJK slice\n\n\n var nSlice = model.renderable.getSlice();\n\n if (ijkMode !== model.renderable.getSlicingMode()) {\n // If not IJK slicing, get the IJK slice from the XYZ position/slice\n nSlice = model.renderable.getSliceAtPosition(nSlice);\n }\n\n var axis0 = 2;\n var axis1 = 0;\n var axis2 = 1;\n\n if (ijkMode === SlicingMode.I) {\n axis0 = 0;\n axis1 = 1;\n axis2 = 2;\n } else if (ijkMode === SlicingMode.J) {\n axis0 = 1;\n axis1 = 2;\n axis2 = 0;\n }\n\n ptsArray1[axis0] = nSlice;\n ptsArray1[axis1] = ext[axis1 * 2] - 0.5;\n ptsArray1[axis2] = ext[axis2 * 2] - 0.5;\n ptsArray1[3] = 1.0;\n vec4.transformMat4(ptsArray1, ptsArray1, tmp3Mat4);\n model.UBO.setArray('Origin', ptsArray1);\n ptsArray2[axis0] = nSlice;\n ptsArray2[axis1] = ext[axis1 * 2 + 1] + 0.5;\n ptsArray2[axis2] = ext[axis2 * 2] - 0.5;\n ptsArray2[3] = 1.0;\n vec4.transformMat4(ptsArray2, ptsArray2, tmp3Mat4);\n vec4.subtract(ptsArray2, ptsArray2, ptsArray1);\n ptsArray2[3] = 1.0;\n model.UBO.setArray('Axis1', ptsArray2);\n ptsArray2[axis0] = nSlice;\n ptsArray2[axis1] = ext[axis1 * 2] - 0.5;\n ptsArray2[axis2] = ext[axis2 * 2 + 1] + 0.5;\n ptsArray2[3] = 1.0;\n vec4.transformMat4(ptsArray2, ptsArray2, tmp3Mat4);\n vec4.subtract(ptsArray2, ptsArray2, ptsArray1);\n ptsArray2[3] = 1.0;\n model.UBO.setArray('Axis2', ptsArray2); // three levels of shift scale combined into one\n // for performance in the fragment shader\n\n var cScale = [1, 1, 1, 1];\n var cShift = [0, 0, 0, 0];\n var tView = model.textureViews[0];\n var tScale = tView.getTexture().getScale();\n var numComp = tView.getTexture().getNumberOfComponents();\n var iComps = false; // todo handle independent?\n\n for (var i = 0; i < numComp; i++) {\n var cw = actor.getProperty().getColorWindow();\n var cl = actor.getProperty().getColorLevel();\n var target = iComps ? i : 0;\n var cfun = actor.getProperty().getRGBTransferFunction(target);\n\n if (cfun) {\n var cRange = cfun.getRange();\n cw = cRange[1] - cRange[0];\n cl = 0.5 * (cRange[1] + cRange[0]);\n }\n\n cScale[i] = tScale / cw;\n cShift[i] = -cl / cw + 0.5;\n }\n\n model.UBO.setArray('cScale', cScale);\n model.UBO.setArray('cShift', cShift);\n model.UBO.sendIfNeeded(model.device);\n }\n };\n\n publicAPI.updateLUTImage = function () {\n var actorProperty = model.WebGPUImageSlice.getRenderable().getProperty();\n var tView = publicAPI.getTextureViews()[0];\n tView.getTexture().getNumberOfComponents();\n\n var numIComps = 1;\n var cfunToString = computeFnToString(actorProperty, actorProperty.getRGBTransferFunction, numIComps);\n\n if (model.colorTextureString !== cfunToString) {\n model.numRows = numIComps;\n var colorArray = new Uint8Array(model.numRows * 2 * model.rowLength * 4);\n var cfun = actorProperty.getRGBTransferFunction();\n\n if (cfun) {\n var tmpTable = new Float32Array(model.rowLength * 3);\n\n for (var c = 0; c < numIComps; c++) {\n cfun = actorProperty.getRGBTransferFunction(c);\n var cRange = cfun.getRange();\n cfun.getTable(cRange[0], cRange[1], model.rowLength, tmpTable, 1);\n\n {\n for (var _i = 0; _i < model.rowLength; _i++) {\n var _idx = c * model.rowLength * 8 + _i * 4;\n\n colorArray[_idx] = 255.0 * tmpTable[_i * 3];\n colorArray[_idx + 1] = 255.0 * tmpTable[_i * 3 + 1];\n colorArray[_idx + 2] = 255.0 * tmpTable[_i * 3 + 2];\n colorArray[_idx + 3] = 255.0;\n\n for (var _j = 0; _j < 4; _j++) {\n colorArray[_idx + model.rowLength * 4 + _j] = colorArray[_idx + _j];\n }\n }\n }\n }\n } else {\n for (var _i2 = 0; _i2 < model.rowLength; ++_i2) {\n var grey = 255.0 * _i2 / (model.rowLength - 1);\n colorArray[_i2 * 4] = grey;\n colorArray[_i2 * 4 + 1] = grey;\n colorArray[_i2 * 4 + 2] = grey;\n colorArray[_i2 * 4 + 3] = 255.0;\n\n for (var _j2 = 0; _j2 < 4; _j2++) {\n colorArray[_i2 * 4 + model.rowLength * 4 + _j2] = colorArray[_i2 * 4 + _j2];\n }\n }\n }\n\n {\n var treq = {\n nativeArray: colorArray,\n width: model.rowLength,\n height: model.numRows * 2,\n depth: 1,\n format: 'rgba8unorm'\n };\n var newTex = model.device.getTextureManager().getTexture(treq);\n var tview = newTex.createView('tfunTexture');\n model.textureViews[1] = tview;\n }\n model.colorTextureString = cfunToString;\n }\n };\n\n var superClassUpdateBuffers = publicAPI.updateBuffers;\n\n publicAPI.updateBuffers = function () {\n superClassUpdateBuffers();\n var newTex = model.device.getTextureManager().getTextureForImageData(model.currentInput);\n var tViews = model.textureViews;\n\n if (!tViews[0] || tViews[0].getTexture() !== newTex) {\n var tview = newTex.createView('imgTexture');\n tViews[0] = tview;\n }\n\n publicAPI.updateLUTImage();\n publicAPI.updateUBO(); // set interpolation on the texture based on property setting\n\n var actorProperty = model.WebGPUImageSlice.getRenderable().getProperty();\n var iType = actorProperty.getInterpolationType() === InterpolationType.NEAREST ? 'nearest' : 'linear';\n\n if (!model.clampSampler || iType !== model.clampSampler.getOptions().minFilter) {\n model.clampSampler = vtkWebGPUSampler.newInstance({\n label: 'clampSampler'\n });\n model.clampSampler.create(model.device, {\n minFilter: iType,\n magFilter: iType\n });\n model.additionalBindables = [model.clampSampler];\n }\n };\n\n var sr = publicAPI.getShaderReplacements();\n\n publicAPI.replaceShaderPosition = function (hash, pipeline, vertexInput) {\n var vDesc = pipeline.getShaderDescription('vertex');\n vDesc.addBuiltinOutput('vec4', '@builtin(position) Position');\n var code = vDesc.getCode();\n var lines = ['var pos: vec4 = mapperUBO.Origin +', ' (vertexBC.x * 0.5 + 0.5) * mapperUBO.Axis1 + (vertexBC.y * 0.5 + 0.5) * mapperUBO.Axis2;', 'pos.w = 1.0;'];\n\n if (model.dimensions === 2) {\n lines.push('var tcoord : vec2 = (mapperUBO.SCTCMatrix * pos).xy;');\n } else {\n lines.push('var tcoord : vec3 = (mapperUBO.SCTCMatrix * pos).xyz;');\n }\n\n lines.push('output.tcoordVS = tcoord;', 'output.Position = rendererUBO.SCPCMatrix * pos;');\n code = vtkWebGPUShaderCache.substitute(code, '//VTK::Position::Impl', lines).result;\n vDesc.setCode(code);\n };\n\n sr.set('replaceShaderPosition', publicAPI.replaceShaderPosition);\n\n publicAPI.replaceShaderTCoord = function (hash, pipeline, vertexInput) {\n var vDesc = pipeline.getShaderDescription('vertex');\n\n if (model.dimensions === 2) {\n vDesc.addOutput('vec2', 'tcoordVS');\n } else {\n vDesc.addOutput('vec3', 'tcoordVS');\n }\n };\n\n sr.set('replaceShaderTCoord', publicAPI.replaceShaderTCoord);\n\n publicAPI.replaceShaderImage = function (hash, pipeline, vertexInput) {\n var fDesc = pipeline.getShaderDescription('fragment');\n var code = fDesc.getCode();\n\n if (model.dimensions === 3) {\n code = vtkWebGPUShaderCache.substitute(code, '//VTK::Image::Sample', [\" var computedColor: vec4 =\", \" textureSampleLevel(imgTexture, clampSampler, input.tcoordVS, 0.0);\", \"//VTK::Image::Sample\"]).result;\n } else {\n code = vtkWebGPUShaderCache.substitute(code, '//VTK::Image::Sample', [\" var computedColor: vec4 =\", \" textureSampleLevel(imgTexture, clampSampler, input.tcoordVS, 0.0);\", \"//VTK::Image::Sample\"]).result;\n }\n\n code = vtkWebGPUShaderCache.substitute(code, '//VTK::Image::Sample', [\" var coord: vec2 =\", \" vec2(computedColor.r * mapperUBO.cScale.r + mapperUBO.cShift.r, 0.5);\", \" computedColor = textureSampleLevel(tfunTexture, clampSampler, coord, 0.0);\"]).result;\n fDesc.setCode(code);\n };\n\n sr.set('replaceShaderImage', publicAPI.replaceShaderImage);\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n rowLength: 1024\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkWebGPUFullScreenQuad.extend(publicAPI, model, initialValues);\n publicAPI.setFragmentShaderTemplate(imgFragTemplate);\n model.UBO = vtkWebGPUUniformBuffer.newInstance({\n label: 'mapperUBO'\n });\n model.UBO.addEntry('SCTCMatrix', 'mat4x4');\n model.UBO.addEntry('Origin', 'vec4');\n model.UBO.addEntry('Axis2', 'vec4');\n model.UBO.addEntry('Axis1', 'vec4');\n model.UBO.addEntry('cScale', 'vec4');\n model.UBO.addEntry('cShift', 'vec4');\n model.lutBuildTime = {};\n obj(model.lutBuildTime, {\n mtime: 0\n });\n model.imagemat = mat4.identity(new Float64Array(16));\n model.imagematinv = mat4.identity(new Float64Array(16));\n model.VBOBuildTime = {};\n obj(model.VBOBuildTime); // Object methods\n\n vtkWebGPUImageMapper(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend, 'vtkWebGPUImageMapper'); // ----------------------------------------------------------------------------\n\nvar index = {\n newInstance: newInstance,\n extend: extend\n}; // Register ourself to WebGPU backend if imported\n\nregisterOverride('vtkImageMapper', newInstance);\n\nexport { index as default, extend, newInstance };\n","import { mat4 } from 'gl-matrix';\nimport { newInstance as newInstance$1, obj, get } from '../../macros.js';\nimport vtkViewNode from '../SceneGraph/ViewNode.js';\nimport { registerOverride } from './ViewNodeFactory.js';\n\n// vtkWebGPUImageSlice methods\n// ----------------------------------------------------------------------------\n\nfunction vtkWebGPUImageSlice(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkWebGPUImageSlice'); // Builds myself.\n\n publicAPI.buildPass = function (prepass) {\n if (!model.renderable || !model.renderable.getVisibility()) {\n return;\n }\n\n if (prepass) {\n if (!model.renderable) {\n return;\n }\n\n model.WebGPURenderer = publicAPI.getFirstAncestorOfType('vtkWebGPURenderer');\n model.WebGPURenderWindow = model.WebGPURenderer.getFirstAncestorOfType('vtkWebGPURenderWindow');\n\n if (model.propID === undefined) {\n model.propID = model.WebGPURenderWindow.getUniquePropID();\n }\n\n publicAPI.prepareNodes();\n publicAPI.addMissingNode(model.renderable.getMapper());\n publicAPI.removeUnusedNodes();\n }\n }; // we draw textures, then mapper, then post pass textures\n\n\n publicAPI.traverseOpaquePass = function (renderPass) {\n if (!model.renderable || !model.renderable.getNestedVisibility() || !model.renderable.getIsOpaque() || model.WebGPURenderer.getSelector() && !model.renderable.getNestedPickable()) {\n return;\n }\n\n publicAPI.apply(renderPass, true);\n model.children.forEach(function (child) {\n child.traverse(renderPass);\n });\n publicAPI.apply(renderPass, false);\n };\n\n publicAPI.traverseTranslucentPass = function (renderPass) {\n if (!model.renderable || !model.renderable.getNestedVisibility() || model.renderable.getIsOpaque() || model.WebGPURenderer.getSelector() && !model.renderable.getNestedPickable()) {\n return;\n }\n\n publicAPI.apply(renderPass, true);\n model.children.forEach(function (child) {\n child.traverse(renderPass);\n });\n publicAPI.apply(renderPass, false);\n };\n\n publicAPI.queryPass = function (prepass, renderPass) {\n if (prepass) {\n if (!model.renderable || !model.renderable.getVisibility()) {\n return;\n }\n\n if (model.renderable.getIsOpaque()) {\n renderPass.incrementOpaqueActorCount();\n } else {\n renderPass.incrementTranslucentActorCount();\n }\n }\n };\n\n publicAPI.getBufferShift = function (wgpuRen) {\n publicAPI.getKeyMatrices(wgpuRen);\n return model.bufferShift;\n };\n\n publicAPI.getKeyMatrices = function (wgpuRen) {\n // has the actor or stabilization center changed?\n if (Math.max(model.renderable.getMTime(), wgpuRen.getStabilizedTime()) > model.keyMatricesTime.getMTime()) {\n model.renderable.computeMatrix();\n var mcwc = model.renderable.getMatrix(); // compute the net shift\n\n var center = wgpuRen.getStabilizedCenterByReference();\n model.bufferShift[0] = mcwc[3] - center[0];\n model.bufferShift[1] = mcwc[7] - center[1];\n model.bufferShift[2] = mcwc[11] - center[2];\n mat4.transpose(model.keyMatrices.bcwc, mcwc);\n\n if (model.renderable.getIsIdentity()) {\n mat4.identity(model.keyMatrices.normalMatrix);\n } else {\n // we use bcwc BEFORE the translate below (just to get transposed mcvc)\n mat4.copy(model.keyMatrices.normalMatrix, model.keyMatrices.bcwc); // zero out translation\n\n model.keyMatrices.normalMatrix[3] = 0.0;\n model.keyMatrices.normalMatrix[7] = 0.0;\n model.keyMatrices.normalMatrix[11] = 0.0;\n mat4.invert(model.keyMatrices.normalMatrix, model.keyMatrices.normalMatrix);\n mat4.transpose(model.keyMatrices.normalMatrix, model.keyMatrices.normalMatrix);\n } // only meed the buffer shift to get to world\n\n\n mat4.translate(model.keyMatrices.bcwc, model.keyMatrices.bcwc, [-model.bufferShift[0], -model.bufferShift[1], -model.bufferShift[2]]); // to get to stabilized we also need the center\n\n mat4.translate(model.keyMatrices.bcsc, model.keyMatrices.bcwc, [-center[0], -center[1], -center[2]]);\n model.keyMatricesTime.modified();\n }\n\n return model.keyMatrices;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n bufferShift: undefined,\n keyMatrixTime: null,\n keyMatrices: null,\n propID: undefined\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkViewNode.extend(publicAPI, model, initialValues);\n model.keyMatricesTime = {};\n obj(model.keyMatricesTime, {\n mtime: 0\n });\n model.keyMatrices = {\n normalMatrix: new Float64Array(16),\n bcwc: new Float64Array(16),\n bcsc: new Float64Array(16)\n };\n model.keyMatrixTime = {};\n obj(model.keyMatrixTime, {\n mtime: 0\n });\n model.keyMatrices = {\n mcwc: mat4.identity(new Float64Array(16))\n };\n model.bufferShift = [0, 0, 0, 0];\n get(publicAPI, model, ['propID', 'keyMatricesTime']); // Object methods\n\n vtkWebGPUImageSlice(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend, 'vtkWebGPUImageSlice'); // ----------------------------------------------------------------------------\n\nvar index = {\n newInstance: newInstance,\n extend: extend\n}; // Register ourself to WebGPU backend if imported\n\nregisterOverride('vtkImageSlice', newInstance);\n\nexport { index as default, extend, newInstance };\n","import { mat4 } from 'gl-matrix';\nimport macro from '../../macros.js';\nimport vtkViewNode from '../SceneGraph/ViewNode.js';\nimport { registerOverride } from './ViewNodeFactory.js';\n\n// vtkWebGPUVolume methods\n// ----------------------------------------------------------------------------\n\nfunction vtkWebGPUVolume(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkWebGPUVolume'); // Builds myself.\n\n publicAPI.buildPass = function (prepass) {\n if (!model.renderable || !model.renderable.getVisibility()) {\n return;\n }\n\n if (prepass) {\n model.WebGPURenderer = publicAPI.getFirstAncestorOfType('vtkWebGPURenderer');\n model.WebGPURenderWindow = model.WebGPURenderer.getFirstAncestorOfType('vtkWebGPURenderWindow'); // for the future if we support hardware selection of volumes\n\n if (model.propID === undefined) {\n model.propID = model.WebGPURenderWindow.getUniquePropID();\n }\n\n model.renderable.getMapper().update();\n }\n };\n\n publicAPI.queryPass = function (prepass, renderPass) {\n if (prepass) {\n if (!model.renderable || !model.renderable.getVisibility()) {\n return;\n } // Check for the special case when the mapper's bounds are unknown\n\n\n var bds = model.renderable.getMapper().getBounds();\n\n if (!bds || bds.length !== 6 || bds[0] > bds[1]) {\n return;\n }\n\n renderPass.addVolume(publicAPI);\n }\n }; // used in the method below\n\n\n var idx = new Float64Array(3);\n var vout = new Float64Array(3);\n\n publicAPI.getBoundingCubePoints = function (result, offset) {\n var input = model.renderable.getMapper().getInputData();\n\n if (!input) {\n return;\n }\n\n var extent = input.getExtent();\n var m = model.renderable.getMatrix();\n var count = 0;\n\n for (var iz = 4; iz < 6; iz++) {\n idx[2] = extent[iz];\n\n for (var iy = 2; iy < 4; iy++) {\n idx[1] = extent[iy];\n\n for (var ix = 0; ix < 2; ix++) {\n idx[0] = extent[ix];\n input.indexToWorld(idx, vout);\n var poffset = offset + count * 3;\n result[poffset++] = m[0] * vout[0] + m[1] * vout[1] + m[2] * vout[2] + m[3];\n result[poffset++] = m[4] * vout[0] + m[5] * vout[1] + m[6] * vout[2] + m[7];\n result[poffset++] = m[8] * vout[0] + m[9] * vout[1] + m[10] * vout[2] + m[11];\n count++;\n }\n }\n }\n };\n\n publicAPI.getKeyMatrices = function (wgpuRen) {\n // has the actor or stabilization center changed?\n if (Math.max(model.renderable.getMTime(), wgpuRen.getStabilizedTime()) > model.keyMatricesTime.getMTime()) {\n model.renderable.computeMatrix();\n var mcwc = model.renderable.getMatrix(); // compute the net shift\n\n var center = wgpuRen.getStabilizedCenterByReference();\n mat4.transpose(model.keyMatrices.bcwc, mcwc); // to get to stabilized we also need the center\n\n mat4.translate(model.keyMatrices.bcsc, model.keyMatrices.bcwc, [-center[0], -center[1], -center[2]]);\n model.keyMatricesTime.modified();\n }\n\n return model.keyMatrices;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n propID: undefined,\n keyMatricesTime: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkViewNode.extend(publicAPI, model, initialValues);\n model.keyMatricesTime = {};\n macro.obj(model.keyMatricesTime, {\n mtime: 0\n });\n model.keyMatrices = {\n bcwc: new Float64Array(16),\n bcsc: new Float64Array(16)\n };\n macro.get(publicAPI, model, ['propID', 'keyMatricesTime']); // Object methods\n\n vtkWebGPUVolume(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkWebGPUVolume'); // ----------------------------------------------------------------------------\n\nvar index = {\n newInstance: newInstance,\n extend: extend\n}; // Register ourself to WebGPU backend if imported\n\nregisterOverride('vtkVolume', newInstance);\n\nexport { index as default, extend, newInstance };\n","import macro from '../../macros.js';\nimport vtkViewNode from '../SceneGraph/ViewNode.js';\nimport { registerOverride } from './ViewNodeFactory.js';\n\n// vtkWebGPUPixelSpaceCallbackMapper methods\n// ----------------------------------------------------------------------------\n\nfunction vtkWebGPUPixelSpaceCallbackMapper(publicAPI, model) {\n model.classHierarchy.push('vtkWebGPUPixelSpaceCallbackMapper');\n\n publicAPI.opaquePass = function (prepass, renderPass) {\n model.WebGPURenderer = publicAPI.getFirstAncestorOfType('vtkWebGPURenderer');\n model.WebGPURenderWindow = model.WebGPURenderer.getParent();\n var aspectRatio = model.WebGPURenderer.getAspectRatio();\n var camera = model.WebGPURenderer ? model.WebGPURenderer.getRenderable().getActiveCamera() : null;\n var tsize = model.WebGPURenderer.getTiledSizeAndOrigin();\n var texels = null;\n\n if (model.renderable.getUseZValues()) ;\n\n model.renderable.invokeCallback(model.renderable.getInputData(), camera, aspectRatio, tsize, texels);\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkViewNode.extend(publicAPI, model, initialValues); // Object methods\n\n vtkWebGPUPixelSpaceCallbackMapper(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkWebGPUPixelSpaceCallbackMapper'); // ----------------------------------------------------------------------------\n\nvar index = {\n newInstance: newInstance,\n extend: extend\n}; // Register ourself to WebGPU backend if imported\n\nregisterOverride('vtkPixelSpaceCallbackMapper', newInstance);\n\nexport { index as default, extend, newInstance };\n","function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n if (info.done) {\n resolve(value);\n } else {\n Promise.resolve(value).then(_next, _throw);\n }\n}\nexport default function _asyncToGenerator(fn) {\n return function () {\n var self = this,\n args = arguments;\n return new Promise(function (resolve, reject) {\n var gen = fn.apply(self, args);\n function _next(value) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n }\n function _throw(err) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n }\n _next(undefined);\n });\n };\n}","import macro from '../../macros.js';\n\nvar DEFAULT_VIEW_API = navigator.gpu ? 'WebGPU' : 'WebGL';\nvar VIEW_CONSTRUCTORS = Object.create(null); // ----------------------------------------------------------------------------\n// static methods\n// ----------------------------------------------------------------------------\n\nfunction registerViewConstructor(name, constructor) {\n VIEW_CONSTRUCTORS[name] = constructor;\n}\nfunction listViewAPIs() {\n return Object.keys(VIEW_CONSTRUCTORS);\n}\nfunction newAPISpecificView(name) {\n var initialValues = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n return VIEW_CONSTRUCTORS[name] && VIEW_CONSTRUCTORS[name](initialValues);\n} // ----------------------------------------------------------------------------\n// vtkRenderWindow methods\n// ----------------------------------------------------------------------------\n\nfunction vtkRenderWindow(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkRenderWindow'); // Add renderer\n\n publicAPI.addRenderer = function (renderer) {\n if (publicAPI.hasRenderer(renderer)) {\n return;\n }\n\n renderer.setRenderWindow(publicAPI);\n model.renderers.push(renderer); // for (this->Renderers->InitTraversal(rsit);\n // (aren = this->Renderers->GetNextRenderer(rsit)); )\n // {\n // aren->SetAllocatedRenderTime\n // (1.0/(this->DesiredUpdateRate*this->Renderers->GetNumberOfItems()));\n // }\n\n publicAPI.modified();\n }; // Remove renderer\n\n\n publicAPI.removeRenderer = function (renderer) {\n model.renderers = model.renderers.filter(function (r) {\n return r !== renderer;\n });\n publicAPI.modified();\n };\n\n publicAPI.hasRenderer = function (ren) {\n return model.renderers.indexOf(ren) !== -1;\n }; // get an API specific view of this data\n\n\n publicAPI.newAPISpecificView = function (name) {\n var initialValues = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n return newAPISpecificView(name || model.defaultViewAPI, initialValues);\n }; // Add renderer\n\n\n publicAPI.addView = function (view) {\n if (publicAPI.hasView(view)) {\n return;\n }\n\n view.setRenderable(publicAPI);\n\n model._views.push(view);\n\n publicAPI.modified();\n }; // Remove renderer\n\n\n publicAPI.removeView = function (view) {\n model._views = model._views.filter(function (r) {\n return r !== view;\n });\n publicAPI.modified();\n };\n\n publicAPI.hasView = function (view) {\n return model._views.indexOf(view) !== -1;\n }; // handle any pre render initializations\n\n\n publicAPI.preRender = function () {\n model.renderers.forEach(function (ren) {\n // make sure we have a camera\n if (!ren.isActiveCameraCreated()) {\n ren.resetCamera();\n }\n });\n };\n\n publicAPI.render = function () {\n publicAPI.preRender();\n\n if (model.interactor) {\n model.interactor.render();\n } else {\n model._views.forEach(function (view) {\n return view.traverseAllPasses();\n });\n }\n };\n\n publicAPI.getStatistics = function () {\n var results = {\n propCount: 0,\n invisiblePropCount: 0\n };\n model.renderers.forEach(function (ren) {\n var props = ren.getViewProps();\n props.forEach(function (prop) {\n if (prop.getVisibility()) {\n results.propCount += 1;\n var mpr = prop.getMapper && prop.getMapper();\n\n if (mpr && mpr.getPrimitiveCount) {\n var pcount = mpr.getPrimitiveCount();\n Object.keys(pcount).forEach(function (keyName) {\n if (!results[keyName]) {\n results[keyName] = 0;\n }\n\n results[keyName] += pcount[keyName];\n });\n }\n } else {\n results.invisiblePropCount += 1;\n }\n });\n });\n results.str = Object.keys(results).map(function (keyName) {\n return \"\".concat(keyName, \": \").concat(results[keyName]);\n }).join('\\n');\n return results;\n };\n\n publicAPI.captureImages = function () {\n var format = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'image/png';\n var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n macro.setImmediate(publicAPI.render);\n return model._views.map(function (view) {\n return view.captureNextImage ? view.captureNextImage(format, opts) : undefined;\n }).filter(function (i) {\n return !!i;\n });\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n defaultViewAPI: DEFAULT_VIEW_API,\n renderers: [],\n views: [],\n interactor: null,\n neverRendered: true,\n numberOfLayers: 1\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Build VTK API\n\n macro.obj(publicAPI, model);\n macro.setGet(publicAPI, model, ['interactor', 'numberOfLayers', '_views', 'defaultViewAPI']);\n macro.get(publicAPI, model, ['neverRendered']);\n macro.getArray(publicAPI, model, ['renderers']);\n macro.moveToProtected(publicAPI, model, ['views']);\n macro.event(publicAPI, model, 'completion'); // Object methods\n\n vtkRenderWindow(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkRenderWindow'); // ----------------------------------------------------------------------------\n\nvar vtkRenderWindow$1 = {\n newInstance: newInstance,\n extend: extend,\n registerViewConstructor: registerViewConstructor,\n listViewAPIs: listViewAPIs,\n newAPISpecificView: newAPISpecificView\n};\n\nexport { vtkRenderWindow$1 as default, extend, listViewAPIs, newAPISpecificView, newInstance, registerViewConstructor };\n","import macro from '../../macros.js';\n\nfunction vtkRenderPass(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkRenderPass');\n\n publicAPI.getOperation = function () {\n return model.currentOperation;\n };\n\n publicAPI.setCurrentOperation = function (val) {\n model.currentOperation = val;\n model.currentTraverseOperation = \"traverse\".concat(macro.capitalize(model.currentOperation));\n };\n\n publicAPI.getTraverseOperation = function () {\n return model.currentTraverseOperation;\n }; // by default this class will traverse all of its\n // preDelegateOperations, then call its delegate render passes\n // the traverse all of its postDelegateOperations\n // any of those three arrays can be empty\n\n\n publicAPI.traverse = function (viewNode) {\n var parent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n\n if (model.deleted) {\n return;\n } // we just render our delegates in order\n\n\n model._currentParent = parent;\n model.preDelegateOperations.forEach(function (val) {\n publicAPI.setCurrentOperation(val);\n viewNode.traverse(publicAPI);\n });\n model.delegates.forEach(function (val) {\n val.traverse(viewNode, publicAPI);\n });\n model.postDelegateOperations.forEach(function (val) {\n publicAPI.setCurrentOperation(val);\n viewNode.traverse(publicAPI);\n });\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n delegates: [],\n currentOperation: null,\n preDelegateOperations: [],\n postDelegateOperations: [],\n currentParent: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Build VTK API\n\n macro.obj(publicAPI, model);\n macro.get(publicAPI, model, ['currentOperation']);\n macro.setGet(publicAPI, model, ['delegates', '_currentParent', 'preDelegateOperations', 'postDelegateOperations']);\n macro.moveToProtected(publicAPI, model, ['currentParent']); // Object methods\n\n vtkRenderPass(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkRenderPass'); // ----------------------------------------------------------------------------\n\nvar vtkRenderPass$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkRenderPass$1 as default, extend, newInstance };\n","import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';\nimport macro from '../../macros.js';\nimport vtkOpenGLTexture from './Texture.js';\nimport vtkOpenGLFramebuffer from './Framebuffer.js';\nimport vtkRenderPass from '../SceneGraph/RenderPass.js';\nimport vtkDataArray from '../../Common/Core/DataArray.js';\nimport vtkHelper from './Helper.js';\nimport vtkProperty from '../Core/Property.js';\nimport vtkShaderProgram from './ShaderProgram.js';\nimport vtkVertexArrayObject from './VertexArrayObject.js';\n\nvar Representation = vtkProperty.Representation;\nvar vtkErrorMacro = macro.vtkErrorMacro; // ----------------------------------------------------------------------------\n\nfunction translucentShaderReplacement(shaders) {\n var substituteRes = vtkShaderProgram.substitute(shaders.Fragment, '//VTK::RenderPassFragmentShader::Impl', \"\\n float weight = gl_FragData[0].a * pow(max(1.1 - gl_FragCoord.z, 0.0), 2.0);\\n gl_FragData[0] = vec4(gl_FragData[0].rgb*weight, gl_FragData[0].a);\\n gl_FragData[1].r = weight;\\n \", false);\n shaders.Fragment = substituteRes.result;\n}\n\nvar oitpFragTemplate = \"//VTK::System::Dec\\n\\nin vec2 tcoord;\\n\\nuniform sampler2D translucentRTexture;\\nuniform sampler2D translucentRGBATexture;\\n\\n// the output of this shader\\n//VTK::Output::Dec\\n\\nvoid main()\\n{\\n vec4 t1Color = texture(translucentRGBATexture, tcoord);\\n float t2Color = texture(translucentRTexture, tcoord).r;\\n gl_FragData[0] = vec4(t1Color.rgb/max(t2Color,0.01), 1.0 - t1Color.a);\\n}\\n\";\n\nfunction vtkOpenGLOrderIndependentTranslucentPass(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkOpenGLOrderIndependentTranslucentPass'); // build vertices etc\n\n publicAPI.createVertexBuffer = function () {\n // 4 corner points in clipping space in order (x, y, z) where z is always set to -1\n // prettier-ignore\n var ptsArray = new Float32Array([-1, -1, -1, 1, -1, -1, -1, 1, -1, 1, 1, -1]); // 4 corresponding corner points in texture space in order (x, y)\n\n var tcoordArray = new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]); // a square defined as cell relation ship in order (cell_size, v1, v2, v3, v4)\n\n var cellArray = new Uint16Array([4, 0, 1, 3, 2]);\n var points = vtkDataArray.newInstance({\n numberOfComponents: 3,\n values: ptsArray\n });\n points.setName('points');\n var tcoords = vtkDataArray.newInstance({\n numberOfComponents: 2,\n values: tcoordArray\n });\n tcoords.setName('tcoords');\n var cells = vtkDataArray.newInstance({\n numberOfComponents: 1,\n values: cellArray\n });\n model.tris.getCABO().createVBO(cells, 'polys', Representation.SURFACE, {\n points: points,\n tcoords: tcoords,\n cellOffset: 0\n });\n model.VBOBuildTime.modified();\n };\n\n publicAPI.createFramebuffer = function (viewNode) {\n var _model$framebuffer;\n\n var size = viewNode.getSize();\n var gl = viewNode.getContext();\n model.framebuffer = vtkOpenGLFramebuffer.newInstance();\n model.framebuffer.setOpenGLRenderWindow(viewNode);\n\n (_model$framebuffer = model.framebuffer).create.apply(_model$framebuffer, _toConsumableArray(size));\n\n model.framebuffer.saveCurrentBindingsAndBuffers();\n model.framebuffer.bind();\n model.translucentRGBATexture = vtkOpenGLTexture.newInstance();\n model.translucentRGBATexture.setInternalFormat(gl.RGBA16F);\n model.translucentRGBATexture.setFormat(gl.RGBA);\n model.translucentRGBATexture.setOpenGLDataType(gl.HALF_FLOAT);\n model.translucentRGBATexture.setOpenGLRenderWindow(viewNode);\n model.translucentRGBATexture.create2DFromRaw(size[0], size[1], 4, 'Float32Array', null);\n model.translucentRTexture = vtkOpenGLTexture.newInstance();\n model.translucentRTexture.setInternalFormat(gl.R16F);\n model.translucentRTexture.setFormat(gl.RED);\n model.translucentRTexture.setOpenGLDataType(gl.HALF_FLOAT);\n model.translucentRTexture.setOpenGLRenderWindow(viewNode);\n model.translucentRTexture.create2DFromRaw(size[0], size[1], 1, 'Float32Array', null);\n model.translucentZTexture = vtkOpenGLTexture.newInstance();\n model.translucentZTexture.setOpenGLRenderWindow(viewNode);\n model.translucentZTexture.createDepthFromRaw(size[0], size[1], 'Float32Array', null);\n model.framebuffer.setColorBuffer(model.translucentRGBATexture, 0);\n model.framebuffer.setColorBuffer(model.translucentRTexture, 1);\n model.framebuffer.setDepthBuffer(model.translucentZTexture);\n };\n\n publicAPI.createCopyShader = function (viewNode) {\n model.copyShader = viewNode.getShaderCache().readyShaderProgramArray(['//VTK::System::Dec', 'attribute vec4 vertexDC;', 'attribute vec2 tcoordTC;', 'varying vec2 tcoord;', 'void main() { tcoord = tcoordTC; gl_Position = vertexDC; }'].join('\\n'), oitpFragTemplate, '');\n };\n\n publicAPI.createVBO = function (viewNode) {\n var gl = viewNode.getContext();\n model.tris.setOpenGLRenderWindow(viewNode);\n publicAPI.createVertexBuffer();\n var program = model.copyShader; // prepare the vertex and triangle data for the image plane to render to\n\n model.tris.getCABO().bind();\n\n if (!model.copyVAO.addAttributeArray(program, model.tris.getCABO(), 'vertexDC', model.tris.getCABO().getVertexOffset(), model.tris.getCABO().getStride(), gl.FLOAT, 3, gl.FALSE)) {\n vtkErrorMacro('Error setting vertexDC in copy shader VAO.');\n }\n\n if (!model.copyVAO.addAttributeArray(program, model.tris.getCABO(), 'tcoordTC', model.tris.getCABO().getTCoordOffset(), model.tris.getCABO().getStride(), gl.FLOAT, 2, gl.FALSE)) {\n vtkErrorMacro('Error setting vertexDC in copy shader VAO.');\n }\n };\n\n publicAPI.traverse = function (viewNode, renNode, forwardPass) {\n if (model.deleted) {\n return;\n }\n\n var size = viewNode.getSize();\n var gl = viewNode.getContext(); // if we lack the webgl2 and half floatsupport just do\n // basic alpha blending\n\n model._supported = false;\n\n if (renNode.getSelector() || !gl || !viewNode.getWebgl2() || !gl.getExtension('EXT_color_buffer_half_float') && !gl.getExtension('EXT_color_buffer_float')) {\n publicAPI.setCurrentOperation('translucentPass');\n renNode.traverse(publicAPI);\n return;\n }\n\n model._supported = true; // prepare framebuffer // allocate framebuffer if needed and bind it\n\n if (model.framebuffer === null) {\n publicAPI.createFramebuffer(viewNode);\n } else {\n var fbSize = model.framebuffer.getSize();\n\n if (fbSize === null || fbSize[0] !== size[0] || fbSize[1] !== size[1]) {\n model.framebuffer.releaseGraphicsResources();\n model.translucentRGBATexture.releaseGraphicsResources(viewNode);\n model.translucentRTexture.releaseGraphicsResources(viewNode);\n model.translucentZTexture.releaseGraphicsResources(viewNode);\n publicAPI.createFramebuffer(viewNode);\n } else {\n // store framebuffer bindings to restore them later\n model.framebuffer.saveCurrentBindingsAndBuffers();\n model.framebuffer.bind();\n }\n }\n\n gl.drawBuffers([gl.COLOR_ATTACHMENT0]);\n gl.clearBufferfv(gl.COLOR, 0, [0.0, 0.0, 0.0, 0.0]);\n gl.clearBufferfv(gl.DEPTH, 0, [1.0]);\n gl.colorMask(false, false, false, false); // rerender the opaque pass to set the depth buffer\n // TODO remove when webgl1 is deprecated and instead\n // have the forward pass use a texture backed zbuffer\n\n if (forwardPass.getOpaqueActorCount() > 0) {\n // Don't use zBufferPass as it will also render the depth of translucent actors\n forwardPass.setCurrentOperation('opaqueZBufferPass');\n renNode.traverse(forwardPass);\n }\n\n gl.colorMask(true, true, true, true);\n gl.drawBuffers([gl.COLOR_ATTACHMENT0, gl.COLOR_ATTACHMENT1]); // make sure to clear the entire framebuffer as we will\n // be blitting the entire thing all of it needs good initial values\n\n gl.viewport(0, 0, size[0], size[1]);\n gl.scissor(0, 0, size[0], size[1]);\n gl.clearBufferfv(gl.COLOR, 0, [0.0, 0.0, 0.0, 1.0]);\n gl.clearBufferfv(gl.COLOR, 1, [0.0, 0.0, 0.0, 0.0]);\n gl.enable(gl.DEPTH_TEST);\n gl.enable(gl.BLEND); // basic gist is we accumulate color into RGB We compute final opacity\n // into A We store accumulated opacity into R of the R texture.\n\n gl.blendFuncSeparate(gl.ONE, gl.ONE, gl.ZERO, gl.ONE_MINUS_SRC_ALPHA); // now do the translucent rendering\n\n publicAPI.setCurrentOperation('translucentPass');\n renNode.traverse(publicAPI);\n gl.drawBuffers([gl.NONE]);\n model.framebuffer.restorePreviousBindingsAndBuffers(); // gl.drawBuffers([gl.BACK]);\n // make sure the copy shader is ready\n\n if (model.copyShader === null) {\n publicAPI.createCopyShader(viewNode);\n } else {\n viewNode.getShaderCache().readyShaderProgram(model.copyShader);\n } // make sure we have a VAO\n\n\n if (!model.copyVAO) {\n model.copyVAO = vtkVertexArrayObject.newInstance();\n model.copyVAO.setOpenGLRenderWindow(viewNode);\n }\n\n model.copyVAO.bind(); // make sure the VBO is up to date\n\n if (model.VBOBuildTime.getMTime() < publicAPI.getMTime()) {\n publicAPI.createVBO(viewNode);\n }\n\n gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n gl.depthMask(false);\n gl.depthFunc(gl.ALWAYS);\n gl.viewport(0, 0, size[0], size[1]);\n gl.scissor(0, 0, size[0], size[1]); // activate texture\n\n model.translucentRGBATexture.activate();\n model.copyShader.setUniformi('translucentRGBATexture', model.translucentRGBATexture.getTextureUnit());\n model.translucentRTexture.activate();\n model.copyShader.setUniformi('translucentRTexture', model.translucentRTexture.getTextureUnit()); // render quad\n\n gl.drawArrays(gl.TRIANGLES, 0, model.tris.getCABO().getElementCount());\n gl.depthMask(true);\n gl.depthFunc(gl.LEQUAL);\n model.translucentRGBATexture.deactivate();\n model.translucentRTexture.deactivate();\n };\n\n publicAPI.getShaderReplacement = function () {\n if (model._supported) {\n return translucentShaderReplacement;\n }\n\n return null;\n };\n\n publicAPI.releaseGraphicsResources = function (viewNode) {\n if (model.framebuffer) {\n model.framebuffer.releaseGraphicsResources(viewNode);\n model.framebuffer = null;\n }\n\n if (model.translucentRGBATexture) {\n model.translucentRGBATexture.releaseGraphicsResources(viewNode);\n model.translucentRGBATexture = null;\n }\n\n if (model.translucentRTexture) {\n model.translucentRTexture.releaseGraphicsResources(viewNode);\n model.translucentRTexture = null;\n }\n\n if (model.translucentZTexture) {\n model.translucentZTexture.releaseGraphicsResources(viewNode);\n model.translucentZTexture = null;\n }\n\n if (model.copyVAO) {\n model.copyVAO.releaseGraphicsResources(viewNode);\n model.copyVAO = null;\n }\n\n if (model.copyShader) {\n model.copyShader.releaseGraphicsResources(viewNode);\n model.copyShader = null;\n }\n\n if (model.tris) {\n model.tris.releaseGraphicsResources(viewNode);\n model.tris = null;\n }\n\n publicAPI.modified();\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n framebuffer: null,\n copyShader: null,\n tris: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Build VTK API\n\n vtkRenderPass.extend(publicAPI, model, initialValues);\n model.VBOBuildTime = {};\n macro.obj(model.VBOBuildTime, {\n mtime: 0\n });\n model.tris = vtkHelper.newInstance();\n macro.get(publicAPI, model, ['framebuffer']); // Object methods\n\n vtkOpenGLOrderIndependentTranslucentPass(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkOpenGLOrderIndependentTranslucentPass'); // ----------------------------------------------------------------------------\n\nvar vtkOpenGLOrderIndependentTranslucentPass$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkOpenGLOrderIndependentTranslucentPass$1 as default, extend, newInstance };\n","import macro from '../../macros.js';\nimport vtkOpenGLFramebuffer from './Framebuffer.js';\nimport vtkRenderPass from '../SceneGraph/RenderPass.js';\nimport vtkOpenGLOrderIndependentTranslucentPass from './OrderIndependentTranslucentPass.js';\n\nfunction vtkForwardPass(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkForwardPass'); // this pass implements a forward rendering pipeline\n // if both volumes and opaque geometry are present\n // it will mix the two together by capturing a zbuffer\n // first\n\n publicAPI.traverse = function (viewNode) {\n var parent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n\n if (model.deleted) {\n return;\n } // we just render our delegates in order\n\n\n model._currentParent = parent; // build\n\n publicAPI.setCurrentOperation('buildPass');\n viewNode.traverse(publicAPI);\n var numlayers = viewNode.getRenderable().getNumberOfLayers(); // iterate over renderers\n\n var renderers = viewNode.getChildren();\n\n for (var i = 0; i < numlayers; i++) {\n for (var index = 0; index < renderers.length; index++) {\n var renNode = renderers[index];\n var ren = viewNode.getRenderable().getRenderers()[index];\n\n if (ren.getDraw() && ren.getLayer() === i) {\n // check for both opaque and volume actors\n model.opaqueActorCount = 0;\n model.translucentActorCount = 0;\n model.volumeCount = 0;\n model.overlayActorCount = 0;\n publicAPI.setCurrentOperation('queryPass');\n renNode.traverse(publicAPI); // do we need to capture a zbuffer?\n\n if ((model.opaqueActorCount > 0 || model.translucentActorCount > 0) && model.volumeCount > 0 || model.depthRequested) {\n var size = viewNode.getFramebufferSize(); // make sure the framebuffer is setup\n\n if (model.framebuffer === null) {\n model.framebuffer = vtkOpenGLFramebuffer.newInstance();\n }\n\n model.framebuffer.setOpenGLRenderWindow(viewNode);\n model.framebuffer.saveCurrentBindingsAndBuffers();\n var fbSize = model.framebuffer.getSize();\n\n if (fbSize === null || fbSize[0] !== size[0] || fbSize[1] !== size[1]) {\n model.framebuffer.create(size[0], size[1]);\n model.framebuffer.populateFramebuffer();\n }\n\n model.framebuffer.bind(); // opaqueZBufferPass only renders opaque actors\n // zBufferPass renders both translucent and opaque actors\n // we want to be able to pick translucent actors\n\n publicAPI.setCurrentOperation('zBufferPass');\n renNode.traverse(publicAPI);\n model.framebuffer.restorePreviousBindingsAndBuffers(); // reset now that we have done it\n\n model.depthRequested = false;\n }\n\n publicAPI.setCurrentOperation('cameraPass');\n renNode.traverse(publicAPI);\n\n if (model.opaqueActorCount > 0) {\n publicAPI.setCurrentOperation('opaquePass');\n renNode.traverse(publicAPI);\n }\n\n if (model.translucentActorCount > 0) {\n if (!model.translucentPass) {\n model.translucentPass = vtkOpenGLOrderIndependentTranslucentPass.newInstance();\n }\n\n model.translucentPass.traverse(viewNode, renNode, publicAPI);\n }\n\n if (model.volumeCount > 0) {\n publicAPI.setCurrentOperation('volumePass');\n renNode.traverse(publicAPI);\n }\n\n if (model.overlayActorCount > 0) {\n publicAPI.setCurrentOperation('overlayPass');\n renNode.traverse(publicAPI);\n }\n }\n }\n }\n };\n\n publicAPI.getZBufferTexture = function () {\n if (model.framebuffer) {\n return model.framebuffer.getColorTexture();\n }\n\n return null;\n };\n\n publicAPI.requestDepth = function () {\n model.depthRequested = true;\n };\n\n publicAPI.incrementOpaqueActorCount = function () {\n return model.opaqueActorCount++;\n };\n\n publicAPI.incrementTranslucentActorCount = function () {\n return model.translucentActorCount++;\n };\n\n publicAPI.incrementVolumeCount = function () {\n return model.volumeCount++;\n };\n\n publicAPI.incrementOverlayActorCount = function () {\n return model.overlayActorCount++;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n opaqueActorCount: 0,\n translucentActorCount: 0,\n volumeCount: 0,\n overlayActorCount: 0,\n framebuffer: null,\n depthRequested: false\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Build VTK API\n\n vtkRenderPass.extend(publicAPI, model, initialValues);\n macro.get(publicAPI, model, ['framebuffer', 'opaqueActorCount', 'translucentActorCount', 'volumeCount']); // Object methods\n\n vtkForwardPass(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkForwardPass'); // ----------------------------------------------------------------------------\n\nvar vtkForwardPass$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkForwardPass$1 as default, extend, newInstance };\n","import _asyncToGenerator from '@babel/runtime/helpers/asyncToGenerator';\nimport _regeneratorRuntime from '@babel/runtime/regenerator';\nimport macro from '../../macros.js';\nimport vtkDataSet from '../../Common/DataModel/DataSet.js';\n\nvar FieldAssociations = vtkDataSet.FieldAssociations; // ----------------------------------------------------------------------------\n// vtkHardwareSelector methods\n// ----------------------------------------------------------------------------\n\nfunction vtkHardwareSelector(publicAPI, model) {\n model.classHierarchy.push('vtkHardwareSelector'); // get the source data that is used for generating a selection. This\n // must be called at least once before calling generateSelection. In\n // raster based backends this method will capture the buffers. You can\n // call this once and then make multiple calls to generateSelection.\n\n publicAPI.getSourceDataAsync = /*#__PURE__*/function () {\n var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(renderer, fx1, fy1, fx2, fy2) {\n return _regeneratorRuntime.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n case \"end\":\n return _context.stop();\n }\n }\n }, _callee);\n }));\n\n return function (_x, _x2, _x3, _x4, _x5) {\n return _ref.apply(this, arguments);\n };\n }();\n\n publicAPI.selectAsync = /*#__PURE__*/function () {\n var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(renderer, fx1, fy1, fx2, fy2) {\n var srcData;\n return _regeneratorRuntime.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n _context2.next = 2;\n return publicAPI.getSourceDataAsync(renderer, fx1, fy1, fx2, fy2);\n\n case 2:\n srcData = _context2.sent;\n\n if (!srcData) {\n _context2.next = 5;\n break;\n }\n\n return _context2.abrupt(\"return\", srcData.generateSelection(fx1, fy1, fx2, fy2));\n\n case 5:\n return _context2.abrupt(\"return\", []);\n\n case 6:\n case \"end\":\n return _context2.stop();\n }\n }\n }, _callee2);\n }));\n\n return function (_x6, _x7, _x8, _x9, _x10) {\n return _ref2.apply(this, arguments);\n };\n }();\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n fieldAssociation: FieldAssociations.FIELD_ASSOCIATION_CELLS,\n captureZValues: false\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n macro.obj(publicAPI, model);\n macro.setGet(publicAPI, model, ['fieldAssociation', 'captureZValues']); // Object methods\n\n vtkHardwareSelector(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkHardwareSelector'); // ----------------------------------------------------------------------------\n\nvar vtkHardwareSelector$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkHardwareSelector$1 as default, extend, newInstance };\n","/**\n * The (primary) property that describes the content of a selection\n * node's data. Other auxiliary description properties follow.\n * GLOBALIDS means that the selection list contains values from the\n * vtkDataSetAttribute array of the same name.\n * PEDIGREEIDS means that the selection list contains values from the\n * vtkDataSetAttribute array of the same name.\n * VALUES means the the selection list contains values from an\n * arbitrary attribute array (ignores any globalids attribute)\n * INDICES means that the selection list contains indexes into the\n * cell or point arrays.\n * FRUSTUM means the set of points and cells inside a frustum\n * LOCATIONS means the set of points and cells near a set of positions\n * THRESHOLDS means the points and cells with values within a set of ranges\n * getContentType() returns -1 if the content type is not set.\n */\n// Specify how data arrays can be used by data objects\nvar SelectionContent = {\n GLOBALIDS: 0,\n PEDIGREEIDS: 1,\n VALUES: 2,\n INDICES: 3,\n FRUSTUM: 4,\n LOCATIONS: 5,\n THRESHOLDS: 6,\n BLOCKS: 7,\n QUERY: 8\n};\nvar SelectionField = {\n CELL: 0,\n POINT: 1,\n FIELD: 2,\n VERTEX: 3,\n EDGE: 4,\n ROW: 5\n};\nvar Constants = {\n SelectionContent: SelectionContent,\n SelectionField: SelectionField\n};\n\nexport { SelectionContent, SelectionField, Constants as default };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport macro from '../../macros.js';\nimport Constants from './SelectionNode/Constants.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n// vtkSelectionNode methods\n// ----------------------------------------------------------------------------\n\nfunction vtkSelectionNode(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkSelectionNode');\n\n publicAPI.getBounds = function () {\n return model.points.getBounds();\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n contentType: -1,\n fieldType: -1,\n properties: null,\n selectionList: []\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n macro.obj(publicAPI, model);\n model.properties = {};\n macro.setGet(publicAPI, model, ['contentType', 'fieldType', 'properties', 'selectionList']); // Object specific methods\n\n vtkSelectionNode(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkSelectionNode'); // ----------------------------------------------------------------------------\n\nvar vtkSelectionNode$1 = _objectSpread({\n newInstance: newInstance,\n extend: extend\n}, Constants);\n\nexport { vtkSelectionNode$1 as default, extend, newInstance };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';\nimport _asyncToGenerator from '@babel/runtime/helpers/asyncToGenerator';\nimport _regeneratorRuntime from '@babel/runtime/regenerator';\nimport macro from '../../macros.js';\nimport Constants from './HardwareSelector/Constants.js';\nimport vtkHardwareSelector$1 from '../Core/HardwareSelector.js';\nimport vtkOpenGLFramebuffer from './Framebuffer.js';\nimport vtkSelectionNode from '../../Common/DataModel/SelectionNode.js';\nimport vtkDataSet from '../../Common/DataModel/DataSet.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nvar PassTypes = Constants.PassTypes;\nvar SelectionContent = vtkSelectionNode.SelectionContent,\n SelectionField = vtkSelectionNode.SelectionField;\nvar FieldAssociations = vtkDataSet.FieldAssociations;\nvar vtkErrorMacro = macro.vtkErrorMacro;\nvar idOffset = 1;\n\nfunction getInfoHash(info) {\n return \"\".concat(info.propID, \" \").concat(info.compositeID);\n}\n\nfunction getAlpha(xx, yy, pb, area) {\n if (!pb) {\n return 0;\n }\n\n var offset = (yy * (area[2] - area[0] + 1) + xx) * 4;\n return pb[offset + 3];\n}\n\nfunction convert(xx, yy, pb, area) {\n if (!pb) {\n return 0;\n }\n\n var offset = (yy * (area[2] - area[0] + 1) + xx) * 4;\n var r = pb[offset];\n var g = pb[offset + 1];\n var b = pb[offset + 2];\n return (b * 256 + g) * 256 + r;\n}\n\nfunction getID(low24, high8) {\n /* eslint-disable no-bitwise */\n var val = high8;\n val <<= 24;\n val |= low24;\n return val;\n /* eslint-enable no-bitwise */\n}\n\nfunction getPixelInformationWithData(buffdata, inDisplayPosition, maxDistance, outSelectedPosition) {\n // Base case\n var maxDist = maxDistance < 0 ? 0 : maxDistance;\n\n if (maxDist === 0) {\n outSelectedPosition[0] = inDisplayPosition[0];\n outSelectedPosition[1] = inDisplayPosition[1];\n\n if (inDisplayPosition[0] < buffdata.area[0] || inDisplayPosition[0] > buffdata.area[2] || inDisplayPosition[1] < buffdata.area[1] || inDisplayPosition[1] > buffdata.area[3]) {\n return null;\n } // offset inDisplayPosition based on the lower-left-corner of the Area.\n\n\n var displayPosition = [inDisplayPosition[0] - buffdata.area[0], inDisplayPosition[1] - buffdata.area[1]];\n var actorid = convert(displayPosition[0], displayPosition[1], buffdata.pixBuffer[PassTypes.ACTOR_PASS], buffdata.area);\n\n if (actorid <= 0 || actorid - idOffset >= buffdata.props.length) {\n // the pixel did not hit any actor.\n return null;\n }\n\n var _info = {};\n _info.valid = true;\n _info.propID = actorid - idOffset;\n _info.prop = buffdata.props[_info.propID];\n var compositeID = convert(displayPosition[0], displayPosition[1], buffdata.pixBuffer[PassTypes.COMPOSITE_INDEX_PASS], buffdata.area);\n\n if (compositeID < 0 || compositeID > 0xffffff) {\n compositeID = 0;\n }\n\n _info.compositeID = compositeID - idOffset;\n\n if (buffdata.captureZValues) {\n var offset = (displayPosition[1] * (buffdata.area[2] - buffdata.area[0] + 1) + displayPosition[0]) * 4;\n _info.zValue = (256 * buffdata.zBuffer[offset] + buffdata.zBuffer[offset + 1]) / 65535.0;\n _info.displayPosition = inDisplayPosition;\n }\n\n if (buffdata.pixBuffer[PassTypes.ID_LOW24]) {\n if (getAlpha(displayPosition[0], displayPosition[1], buffdata.pixBuffer[PassTypes.ID_LOW24], buffdata.area) === 0.0) {\n return _info;\n }\n }\n\n var low24 = convert(displayPosition[0], displayPosition[1], buffdata.pixBuffer[PassTypes.ID_LOW24], buffdata.area);\n var high24 = convert(displayPosition[0], displayPosition[1], buffdata.pixBuffer[PassTypes.ID_HIGH24], buffdata.area);\n _info.attributeID = getID(low24, high24);\n return _info;\n } // Iterate over successively growing boxes.\n // They recursively call the base case to handle single pixels.\n\n\n var dispPos = [inDisplayPosition[0], inDisplayPosition[1]];\n var curPos = [0, 0];\n var info = getPixelInformationWithData(buffdata, inDisplayPosition, 0, outSelectedPosition);\n\n if (info && info.valid) {\n return info;\n }\n\n for (var dist = 1; dist < maxDist; ++dist) {\n // Vertical sides of box.\n for (var y = dispPos[1] > dist ? dispPos[1] - dist : 0; y <= dispPos[1] + dist; ++y) {\n curPos[1] = y;\n\n if (dispPos[0] >= dist) {\n curPos[0] = dispPos[0] - dist;\n info = getPixelInformationWithData(buffdata, curPos, 0, outSelectedPosition);\n\n if (info && info.valid) {\n return info;\n }\n }\n\n curPos[0] = dispPos[0] + dist;\n info = getPixelInformationWithData(buffdata, curPos, 0, outSelectedPosition);\n\n if (info && info.valid) {\n return info;\n }\n } // Horizontal sides of box.\n\n\n for (var x = dispPos[0] >= dist ? dispPos[0] - (dist - 1) : 0; x <= dispPos[0] + (dist - 1); ++x) {\n curPos[0] = x;\n\n if (dispPos[1] >= dist) {\n curPos[1] = dispPos[1] - dist;\n info = getPixelInformationWithData(buffdata, curPos, 0, outSelectedPosition);\n\n if (info && info.valid) {\n return info;\n }\n }\n\n curPos[1] = dispPos[1] + dist;\n info = getPixelInformationWithData(buffdata, curPos, 0, outSelectedPosition);\n\n if (info && info.valid) {\n return info;\n }\n }\n } // nothing hit.\n\n\n outSelectedPosition[0] = inDisplayPosition[0];\n outSelectedPosition[1] = inDisplayPosition[1];\n return null;\n} //-----------------------------------------------------------------------------\n\n\nfunction convertSelection(fieldassociation, dataMap, captureZValues, renderer, openGLRenderWindow) {\n var sel = [];\n var count = 0;\n dataMap.forEach(function (value, key) {\n var child = vtkSelectionNode.newInstance();\n child.setContentType(SelectionContent.INDICES);\n\n switch (fieldassociation) {\n case FieldAssociations.FIELD_ASSOCIATION_CELLS:\n child.setFieldType(SelectionField.CELL);\n break;\n\n case FieldAssociations.FIELD_ASSOCIATION_POINTS:\n child.setFieldType(SelectionField.POINT);\n break;\n\n default:\n vtkErrorMacro('Unknown field association');\n }\n\n child.getProperties().propID = value.info.propID;\n child.getProperties().prop = value.info.prop;\n child.getProperties().compositeID = value.info.compositeID;\n child.getProperties().attributeID = value.info.attributeID;\n child.getProperties().pixelCount = value.pixelCount;\n\n if (captureZValues) {\n child.getProperties().displayPosition = [value.info.displayPosition[0], value.info.displayPosition[1], value.info.zValue];\n child.getProperties().worldPosition = openGLRenderWindow.displayToWorld(value.info.displayPosition[0], value.info.displayPosition[1], value.info.zValue, renderer);\n }\n\n child.setSelectionList(value.attributeIDs);\n sel[count] = child;\n count++;\n });\n return sel;\n} //----------------------------------------------------------------------------\n\n\nfunction generateSelectionWithData(buffdata, fx1, fy1, fx2, fy2) {\n var x1 = Math.floor(fx1);\n var y1 = Math.floor(fy1);\n var x2 = Math.floor(fx2);\n var y2 = Math.floor(fy2);\n var dataMap = new Map();\n var outSelectedPosition = [0, 0];\n\n for (var yy = y1; yy <= y2; yy++) {\n for (var xx = x1; xx <= x2; xx++) {\n var pos = [xx, yy];\n var info = getPixelInformationWithData(buffdata, pos, 0, outSelectedPosition);\n\n if (info && info.valid) {\n var hash = getInfoHash(info);\n\n if (!dataMap.has(hash)) {\n dataMap.set(hash, {\n info: info,\n pixelCount: 1,\n attributeIDs: [info.attributeID]\n });\n } else {\n var dmv = dataMap.get(hash);\n dmv.pixelCount++;\n\n if (buffdata.captureZValues) {\n if (info.zValue < dmv.info.zValue) {\n dmv.info = info;\n }\n }\n\n if (dmv.attributeIDs.indexOf(info.attributeID) === -1) {\n dmv.attributeIDs.push(info.attributeID);\n }\n }\n }\n }\n }\n\n return convertSelection(buffdata.fieldAssociation, dataMap, buffdata.captureZValues, buffdata.renderer, buffdata.openGLRenderWindow);\n} // ----------------------------------------------------------------------------\n// vtkOpenGLHardwareSelector methods\n// ----------------------------------------------------------------------------\n\n\nfunction vtkOpenGLHardwareSelector(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkOpenGLHardwareSelector'); //----------------------------------------------------------------------------\n\n publicAPI.releasePixBuffers = function () {\n model.rawPixBuffer = [];\n model.pixBuffer = [];\n model.zBuffer = null;\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.beginSelection = function () {\n model._openGLRenderer = model._openGLRenderWindow.getViewNodeFor(model._renderer);\n model.maxAttributeId = 0;\n\n var size = model._openGLRenderWindow.getSize();\n\n if (!model.framebuffer) {\n model.framebuffer = vtkOpenGLFramebuffer.newInstance();\n model.framebuffer.setOpenGLRenderWindow(model._openGLRenderWindow);\n model.framebuffer.saveCurrentBindingsAndBuffers();\n model.framebuffer.create(size[0], size[1]); // this calls model.framebuffer.bind()\n\n model.framebuffer.populateFramebuffer();\n } else {\n model.framebuffer.setOpenGLRenderWindow(model._openGLRenderWindow);\n model.framebuffer.saveCurrentBindingsAndBuffers();\n var fbSize = model.framebuffer.getSize();\n\n if (fbSize[0] !== size[0] || fbSize[1] !== size[1]) {\n model.framebuffer.create(size[0], size[1]); // this calls model.framebuffer.bind()\n\n model.framebuffer.populateFramebuffer();\n } else {\n model.framebuffer.bind();\n }\n }\n\n model._openGLRenderer.clear();\n\n model._openGLRenderer.setSelector(publicAPI);\n\n model.hitProps = {};\n model.propPixels = {};\n model.props = [];\n publicAPI.releasePixBuffers();\n\n if (model.fieldAssociation === FieldAssociations.FIELD_ASSOCIATION_POINTS) {\n var gl = model._openGLRenderWindow.getContext();\n\n var originalBlending = gl.isEnabled(gl.BLEND);\n gl.disable(gl.BLEND);\n\n model._openGLRenderWindow.traverseAllPasses();\n\n if (originalBlending) {\n gl.enable(gl.BLEND);\n }\n }\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.endSelection = function () {\n model.hitProps = {};\n\n model._openGLRenderer.setSelector(null);\n\n model.framebuffer.restorePreviousBindingsAndBuffers();\n };\n\n publicAPI.preCapturePass = function () {\n var gl = model._openGLRenderWindow.getContext(); // Disable blending\n\n\n model.originalBlending = gl.isEnabled(gl.BLEND);\n gl.disable(gl.BLEND);\n };\n\n publicAPI.postCapturePass = function () {\n var gl = model._openGLRenderWindow.getContext(); // Restore blending if it was enabled prior to the capture\n\n\n if (model.originalBlending) {\n gl.enable(gl.BLEND);\n }\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.select = function () {\n var sel = null;\n\n if (publicAPI.captureBuffers()) {\n sel = publicAPI.generateSelection(model.area[0], model.area[1], model.area[2], model.area[3]);\n publicAPI.releasePixBuffers();\n }\n\n return sel;\n };\n\n publicAPI.getSourceDataAsync = /*#__PURE__*/function () {\n var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(renderer, fx1, fy1, fx2, fy2) {\n var size, result;\n return _regeneratorRuntime.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n // assign the renderer\n model._renderer = renderer; // set area to all if no arguments provided\n\n if (fx1 === undefined) {\n size = model._openGLRenderWindow.getSize();\n publicAPI.setArea(0, 0, size[0] - 1, size[1] - 1);\n } else {\n publicAPI.setArea(fx1, fy1, fx2, fy2);\n } // just do capture buffers and package up the result\n\n\n if (publicAPI.captureBuffers()) {\n _context.next = 4;\n break;\n }\n\n return _context.abrupt(\"return\", false);\n\n case 4:\n result = {\n area: _toConsumableArray(model.area),\n pixBuffer: _toConsumableArray(model.pixBuffer),\n captureZValues: model.captureZValues,\n zBuffer: model.zBuffer,\n props: _toConsumableArray(model.props),\n fieldAssociation: model.fieldAssociation,\n renderer: renderer,\n openGLRenderWindow: model._openGLRenderWindow\n };\n\n result.generateSelection = function () {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return generateSelectionWithData.apply(void 0, [result].concat(args));\n };\n\n return _context.abrupt(\"return\", result);\n\n case 7:\n case \"end\":\n return _context.stop();\n }\n }\n }, _callee);\n }));\n\n return function (_x, _x2, _x3, _x4, _x5) {\n return _ref.apply(this, arguments);\n };\n }(); //----------------------------------------------------------------------------\n\n\n publicAPI.captureBuffers = function () {\n if (!model._renderer || !model._openGLRenderWindow) {\n vtkErrorMacro('Renderer and view must be set before calling Select.');\n return false;\n }\n\n model._openGLRenderer = model._openGLRenderWindow.getViewNodeFor(model._renderer); // todo revisit making selection part of core\n // then we can do this in core\n\n model._openGLRenderWindow.getRenderable().preRender(); // int rgba[4];\n // rwin.getColorBufferSizes(rgba);\n // if (rgba[0] < 8 || rgba[1] < 8 || rgba[2] < 8) {\n // vtkErrorMacro(\"Color buffer depth must be at least 8 bit. \"\n // \"Currently: \" << rgba[0] << \", \" << rgba[1] << \", \" < 0x00ffffff;\n }\n\n if (model.fieldAssociation === FieldAssociations.FIELD_ASSOCIATION_CELLS) {\n return model.maximumCellId > 0x00ffffff;\n }\n }\n\n return true;\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.savePixelBuffer = function (passNo) {\n model.pixBuffer[passNo] = model._openGLRenderWindow.getPixelData(model.area[0], model.area[1], model.area[2], model.area[3]);\n\n if (!model.rawPixBuffer[passNo]) {\n var size = (model.area[2] - model.area[0] + 1) * (model.area[3] - model.area[1] + 1) * 4;\n model.rawPixBuffer[passNo] = new Uint8Array(size);\n model.rawPixBuffer[passNo].set(model.pixBuffer[passNo]);\n }\n\n if (passNo === PassTypes.ACTOR_PASS) {\n if (model.captureZValues) {\n var rpasses = model._openGLRenderWindow.getRenderPasses();\n\n if (typeof rpasses[0].requestDepth === 'function' && typeof rpasses[0].getFramebuffer === 'function') {\n var fb = rpasses[0].getFramebuffer();\n fb.saveCurrentBindingsAndBuffers();\n fb.bind();\n model.zBuffer = model._openGLRenderWindow.getPixelData(model.area[0], model.area[1], model.area[2], model.area[3]);\n fb.restorePreviousBindingsAndBuffers();\n }\n }\n\n publicAPI.buildPropHitList(model.rawPixBuffer[passNo]);\n }\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.buildPropHitList = function (pixelbuffer) {\n var offset = 0;\n\n for (var yy = 0; yy <= model.area[3] - model.area[1]; yy++) {\n for (var xx = 0; xx <= model.area[2] - model.area[0]; xx++) {\n var val = convert(xx, yy, pixelbuffer, model.area);\n\n if (val > 0) {\n val--;\n\n if (!(val in model.hitProps)) {\n model.hitProps[val] = true;\n model.propPixels[val] = [];\n }\n\n model.propPixels[val].push(offset * 4);\n }\n\n ++offset;\n }\n }\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.renderProp = function (prop) {\n if (model.currentPass === PassTypes.ACTOR_PASS) {\n publicAPI.setPropColorValueFromInt(model.props.length + idOffset);\n model.props.push(prop);\n }\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.renderCompositeIndex = function (index) {\n if (model.currentPass === PassTypes.COMPOSITE_INDEX_PASS) {\n publicAPI.setPropColorValueFromInt(index + idOffset);\n }\n }; //----------------------------------------------------------------------------\n // TODO: make inline\n\n\n publicAPI.renderAttributeId = function (attribid) {\n if (attribid < 0) {\n // negative attribid is valid. It happens when rendering higher order\n // elements where new points are added for rendering smooth surfaces.\n return;\n }\n\n model.maxAttributeId = attribid > model.maxAttributeId ? attribid : model.maxAttributeId; // if (model.currentPass < PassTypes.ID_LOW24) {\n // return; // useless...\n // }\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.passTypeToString = function (type) {\n return macro.enumToString(PassTypes, type);\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.isPropHit = function (id) {\n return Boolean(model.hitProps[id]);\n };\n\n publicAPI.setPropColorValueFromInt = function (val) {\n model.propColorValue[0] = val % 256 / 255.0;\n model.propColorValue[1] = Math.floor(val / 256) % 256 / 255.0;\n model.propColorValue[2] = Math.floor(val / 65536) % 256 / 255.0;\n }; // info has\n // valid\n // propId\n // prop\n // compositeID\n // attributeID\n //----------------------------------------------------------------------------\n\n\n publicAPI.getPixelInformation = function (inDisplayPosition, maxDistance, outSelectedPosition) {\n // Base case\n var maxDist = maxDistance < 0 ? 0 : maxDistance;\n\n if (maxDist === 0) {\n outSelectedPosition[0] = inDisplayPosition[0];\n outSelectedPosition[1] = inDisplayPosition[1];\n\n if (inDisplayPosition[0] < model.area[0] || inDisplayPosition[0] > model.area[2] || inDisplayPosition[1] < model.area[1] || inDisplayPosition[1] > model.area[3]) {\n return null;\n } // offset inDisplayPosition based on the lower-left-corner of the Area.\n\n\n var displayPosition = [inDisplayPosition[0] - model.area[0], inDisplayPosition[1] - model.area[1]];\n var actorid = convert(displayPosition[0], displayPosition[1], model.pixBuffer[PassTypes.ACTOR_PASS], model.area);\n\n if (actorid <= 0 || actorid - idOffset >= model.props.length) {\n // the pixel did not hit any actor.\n return null;\n }\n\n var _info2 = {};\n _info2.valid = true;\n _info2.propID = actorid - idOffset;\n _info2.prop = model.props[_info2.propID];\n var compositeID = convert(displayPosition[0], displayPosition[1], model.pixBuffer[PassTypes.COMPOSITE_INDEX_PASS], model.area);\n\n if (compositeID < 0 || compositeID > 0xffffff) {\n compositeID = 0;\n }\n\n _info2.compositeID = compositeID - idOffset;\n\n if (model.captureZValues) {\n var offset = (displayPosition[1] * (model.area[2] - model.area[0] + 1) + displayPosition[0]) * 4;\n _info2.zValue = (256 * model.zBuffer[offset] + model.zBuffer[offset + 1]) / 65535.0;\n _info2.displayPosition = inDisplayPosition;\n } // Skip attribute ids if alpha is zero (missed)\n\n\n if (model.pixBuffer[PassTypes.ID_LOW24]) {\n if (getAlpha(displayPosition[0], displayPosition[1], model.pixBuffer[PassTypes.ID_LOW24], model.area) === 0.0) {\n return _info2;\n }\n }\n\n var low24 = convert(displayPosition[0], displayPosition[1], model.pixBuffer[PassTypes.ID_LOW24], model.area);\n var high24 = convert(displayPosition[0], displayPosition[1], model.pixBuffer[PassTypes.ID_HIGH24], model.area);\n _info2.attributeID = getID(low24, high24);\n return _info2;\n } // Iterate over successively growing boxes.\n // They recursively call the base case to handle single pixels.\n\n\n var dispPos = [inDisplayPosition[0], inDisplayPosition[1]];\n var curPos = [0, 0];\n var info = publicAPI.getPixelInformation(inDisplayPosition, 0, outSelectedPosition);\n\n if (info && info.valid) {\n return info;\n }\n\n for (var dist = 1; dist < maxDist; ++dist) {\n // Vertical sides of box.\n for (var y = dispPos[1] > dist ? dispPos[1] - dist : 0; y <= dispPos[1] + dist; ++y) {\n curPos[1] = y;\n\n if (dispPos[0] >= dist) {\n curPos[0] = dispPos[0] - dist;\n info = publicAPI.getPixelInformation(curPos, 0, outSelectedPosition);\n\n if (info && info.valid) {\n return info;\n }\n }\n\n curPos[0] = dispPos[0] + dist;\n info = publicAPI.getPixelInformation(curPos, 0, outSelectedPosition);\n\n if (info && info.valid) {\n return info;\n }\n } // Horizontal sides of box.\n\n\n for (var x = dispPos[0] >= dist ? dispPos[0] - (dist - 1) : 0; x <= dispPos[0] + (dist - 1); ++x) {\n curPos[0] = x;\n\n if (dispPos[1] >= dist) {\n curPos[1] = dispPos[1] - dist;\n info = publicAPI.getPixelInformation(curPos, 0, outSelectedPosition);\n\n if (info && info.valid) {\n return info;\n }\n }\n\n curPos[1] = dispPos[1] + dist;\n info = publicAPI.getPixelInformation(curPos, 0, outSelectedPosition);\n\n if (info && info.valid) {\n return info;\n }\n }\n } // nothing hit.\n\n\n outSelectedPosition[0] = inDisplayPosition[0];\n outSelectedPosition[1] = inDisplayPosition[1];\n return null;\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.generateSelection = function (fx1, fy1, fx2, fy2) {\n var x1 = Math.floor(fx1);\n var y1 = Math.floor(fy1);\n var x2 = Math.floor(fx2);\n var y2 = Math.floor(fy2);\n var dataMap = new Map();\n var outSelectedPosition = [0, 0];\n\n for (var yy = y1; yy <= y2; yy++) {\n for (var xx = x1; xx <= x2; xx++) {\n var pos = [xx, yy];\n var info = publicAPI.getPixelInformation(pos, 0, outSelectedPosition);\n\n if (info && info.valid) {\n var hash = getInfoHash(info);\n\n if (!dataMap.has(hash)) {\n dataMap.set(hash, {\n info: info,\n pixelCount: 1,\n attributeIDs: [info.attributeID]\n });\n } else {\n var dmv = dataMap.get(hash);\n dmv.pixelCount++;\n\n if (model.captureZValues) {\n if (info.zValue < dmv.info.zValue) {\n dmv.info = info;\n }\n }\n\n if (dmv.attributeIDs.indexOf(info.attributeID) === -1) {\n dmv.attributeIDs.push(info.attributeID);\n }\n }\n }\n }\n }\n\n return convertSelection(model.fieldAssociation, dataMap, model.captureZValues, model._renderer, model._openGLRenderWindow);\n };\n\n publicAPI.getRawPixelBuffer = function (passNo) {\n return model.rawPixBuffer[passNo];\n };\n\n publicAPI.getPixelBuffer = function (passNo) {\n return model.pixBuffer[passNo];\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.attach = function (w, r) {\n model._openGLRenderWindow = w;\n model._renderer = r;\n }; // override\n\n\n var superSetArea = publicAPI.setArea;\n\n publicAPI.setArea = function () {\n if (superSetArea.apply(void 0, arguments)) {\n model.area[0] = Math.floor(model.area[0]);\n model.area[1] = Math.floor(model.area[1]);\n model.area[2] = Math.floor(model.area[2]);\n model.area[3] = Math.floor(model.area[3]);\n return true;\n }\n\n return false;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n area: undefined,\n // _renderer: null,\n // _openGLRenderWindow: null,\n // _openGLRenderer: null,\n currentPass: -1,\n propColorValue: null,\n props: null,\n maximumPointId: 0,\n maximumCellId: 0,\n idOffset: 1\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Build VTK API\n\n vtkHardwareSelector$1.extend(publicAPI, model, initialValues);\n model.propColorValue = [0, 0, 0];\n model.props = [];\n\n if (!model.area) {\n model.area = [0, 0, 0, 0];\n }\n\n macro.setGetArray(publicAPI, model, ['area'], 4);\n macro.setGet(publicAPI, model, ['_renderer', 'currentPass', '_openGLRenderWindow', 'maximumPointId', 'maximumCellId']);\n macro.setGetArray(publicAPI, model, ['propColorValue'], 3);\n macro.moveToProtected(publicAPI, model, ['renderer', 'openGLRenderWindow']);\n macro.event(publicAPI, model, 'event'); // Object methods\n\n vtkOpenGLHardwareSelector(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkOpenGLHardwareSelector'); // ----------------------------------------------------------------------------\n\nvar vtkHardwareSelector = _objectSpread({\n newInstance: newInstance,\n extend: extend\n}, Constants);\n\nexport { vtkHardwareSelector as default, extend, newInstance };\n","import Md5 from 'spark-md5';\nimport macro from '../../macros.js';\nimport vtkShaderProgram from './ShaderProgram.js';\n\nvar SET_GET_FIELDS = ['lastShaderBound', 'context', '_openGLRenderWindow']; // ----------------------------------------------------------------------------\n// vtkShaderCache methods\n// ----------------------------------------------------------------------------\n\nfunction vtkShaderCache(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkShaderCache');\n\n publicAPI.replaceShaderValues = function (VSSource, FSSource, GSSource) {\n // first handle renaming any Fragment shader inputs\n // if we have a geometry shader. By default fragment shaders\n // assume their inputs come from a Vertex Shader. When we\n // have a Geometry shader we rename the frament shader inputs\n // to come from the geometry shader\n var nFSSource = FSSource;\n\n if (GSSource.length > 0) {\n nFSSource = vtkShaderProgram.substitute(nFSSource, 'VSOut', 'GSOut').result;\n }\n\n var gl2 = model._openGLRenderWindow.getWebgl2();\n\n var fragDepthString = '\\n';\n var version = '#version 100\\n';\n\n if (gl2) {\n version = '#version 300 es\\n' + '#define attribute in\\n' + '#define textureCube texture\\n' + '#define texture2D texture\\n' + '#define textureCubeLod textureLod\\n' + '#define texture2DLod textureLod\\n';\n } else {\n model.context.getExtension('OES_standard_derivatives');\n\n if (model.context.getExtension('EXT_frag_depth')) {\n fragDepthString = '#extension GL_EXT_frag_depth : enable\\n';\n }\n\n if (model.context.getExtension('EXT_shader_texture_lod')) {\n fragDepthString += '#extension GL_EXT_shader_texture_lod : enable\\n' + '#define textureCubeLod textureCubeLodEXT\\n' + '#define texture2DLod texture2DLodEXT';\n }\n }\n\n nFSSource = vtkShaderProgram.substitute(nFSSource, '//VTK::System::Dec', [\"\".concat(version, \"\\n\"), gl2 ? '' : '#extension GL_OES_standard_derivatives : enable\\n', fragDepthString, '#ifdef GL_FRAGMENT_PRECISION_HIGH', 'precision highp float;', 'precision highp int;', '#else', 'precision mediump float;', 'precision mediump int;', '#endif']).result;\n var nVSSource = vtkShaderProgram.substitute(VSSource, '//VTK::System::Dec', [\"\".concat(version, \"\\n\"), '#ifdef GL_FRAGMENT_PRECISION_HIGH', 'precision highp float;', 'precision highp int;', '#else', 'precision mediump float;', 'precision mediump int;', '#endif']).result;\n\n if (gl2) {\n nVSSource = vtkShaderProgram.substitute(nVSSource, 'varying', 'out').result;\n nFSSource = vtkShaderProgram.substitute(nFSSource, 'varying', 'in').result;\n var shaderOutputs = '';\n var outputCount = 0;\n\n while (nFSSource.includes(\"gl_FragData[\".concat(outputCount, \"]\"))) {\n nFSSource = vtkShaderProgram.substitute(nFSSource, \"gl_FragData\\\\[\".concat(outputCount, \"\\\\]\"), \"fragOutput\".concat(outputCount)).result;\n shaderOutputs += \"layout(location = \".concat(outputCount, \") out vec4 fragOutput\").concat(outputCount, \";\\n\");\n outputCount++;\n }\n\n nFSSource = vtkShaderProgram.substitute(nFSSource, '//VTK::Output::Dec', shaderOutputs).result;\n } // nFSSource = ShaderProgram.substitute(nFSSource, 'gl_FragData\\\\[0\\\\]',\n // 'gl_FragColor').result;\n\n\n var nGSSource = vtkShaderProgram.substitute(GSSource, '//VTK::System::Dec', version).result;\n return {\n VSSource: nVSSource,\n FSSource: nFSSource,\n GSSource: nGSSource\n };\n }; // return NULL if there is an issue\n\n\n publicAPI.readyShaderProgramArray = function (vertexCode, fragmentCode, geometryCode) {\n var data = publicAPI.replaceShaderValues(vertexCode, fragmentCode, geometryCode);\n var shader = publicAPI.getShaderProgram(data.VSSource, data.FSSource, data.GSSource);\n return publicAPI.readyShaderProgram(shader);\n };\n\n publicAPI.readyShaderProgram = function (shader) {\n if (!shader) {\n return null;\n } // compile if needed\n\n\n if (!shader.getCompiled() && !shader.compileShader()) {\n return null;\n } // bind if needed\n\n\n if (!publicAPI.bindShader(shader)) {\n return null;\n }\n\n return shader;\n };\n\n publicAPI.getShaderProgram = function (vertexCode, fragmentCode, geometryCode) {\n // compute the MD5 and the check the map\n var hashInput = \"\".concat(vertexCode).concat(fragmentCode).concat(geometryCode);\n var result = Md5.hash(hashInput); // does it already exist?\n\n if (!(result in model.shaderPrograms)) {\n // create one\n var sps = vtkShaderProgram.newInstance();\n sps.setContext(model.context);\n sps.getVertexShader().setSource(vertexCode);\n sps.getFragmentShader().setSource(fragmentCode);\n\n if (geometryCode) {\n sps.getGeometryShader().setSource(geometryCode);\n }\n\n sps.setMd5Hash(result);\n model.shaderPrograms[result] = sps;\n return sps;\n }\n\n return model.shaderPrograms[result];\n };\n\n publicAPI.releaseGraphicsResources = function (win) {\n // NOTE:\n // In the current implementation as of October 26th, if a shader\n // program is created by ShaderCache then it should make sure\n // that it releases the graphics resources used by these programs.\n // It is not wisely for callers to do that since then they would\n // have to loop over all the programs were in use and invoke\n // release graphics resources individually.\n publicAPI.releaseCurrentShader();\n Object.keys(model.shaderPrograms).map(function (key) {\n return model.shaderPrograms[key];\n }).forEach(function (sp) {\n return sp.releaseGraphicsResources(win);\n });\n };\n\n publicAPI.releaseGraphicsResources = function () {\n // release prior shader\n if (model.astShaderBound) {\n model.lastShaderBound.release();\n model.lastShaderBound = null;\n }\n };\n\n publicAPI.bindShader = function (shader) {\n if (model.lastShaderBound === shader) {\n return 1;\n } // release prior shader\n\n\n if (model.lastShaderBound) {\n model.lastShaderBound.release();\n }\n\n shader.bind();\n model.lastShaderBound = shader;\n return 1;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n lastShaderBound: null,\n shaderPrograms: null,\n context: null // _openGLRenderWindow: null,\n\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Internal objects\n\n model.shaderPrograms = {}; // Build VTK API\n\n macro.obj(publicAPI, model);\n macro.setGet(publicAPI, model, SET_GET_FIELDS);\n macro.moveToProtected(publicAPI, model, ['openGLRenderWindow']); // Object methods\n\n vtkShaderCache(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkShaderCache'); // ----------------------------------------------------------------------------\n\nvar vtkShaderCache$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkShaderCache$1 as default, extend, newInstance };\n","import macro from '../../macros.js';\n\nvar vtkErrorMacro = macro.vtkErrorMacro; // ----------------------------------------------------------------------------\n// vtkOpenGLTextureUnitManager methods\n// ----------------------------------------------------------------------------\n\nfunction vtkOpenGLTextureUnitManager(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkOpenGLTextureUnitManager'); // ----------------------------------------------------------------------------\n // Description:\n // Delete the allocation table and check if it is not called before\n // all the texture units have been released.\n\n publicAPI.deleteTable = function () {\n for (var i = 0; i < model.numberOfTextureUnits; ++i) {\n if (model.textureUnits[i] === true) {\n vtkErrorMacro('some texture units were not properly released');\n }\n }\n\n model.textureUnits = [];\n model.numberOfTextureUnits = 0;\n }; // ----------------------------------------------------------------------------\n\n\n publicAPI.setContext = function (ctx) {\n if (model.context !== ctx) {\n if (model.context !== 0) {\n publicAPI.deleteTable();\n }\n\n model.context = ctx;\n\n if (model.context) {\n model.numberOfTextureUnits = ctx.getParameter(ctx.MAX_TEXTURE_IMAGE_UNITS);\n\n for (var i = 0; i < model.numberOfTextureUnits; ++i) {\n model.textureUnits[i] = false;\n }\n }\n\n publicAPI.modified();\n }\n }; // ----------------------------------------------------------------------------\n // Description:\n // Reserve a texture unit. It returns its number.\n // It returns -1 if the allocation failed (because there are no more\n // texture units left).\n // \\post valid_result: result==-1 || result>=0 && resultGetNumberOfTextureUnits())\n // \\post allocated: result==-1 || this->IsAllocated(result)\n\n\n publicAPI.allocate = function () {\n for (var i = 0; i < model.numberOfTextureUnits; i++) {\n if (!publicAPI.isAllocated(i)) {\n model.textureUnits[i] = true;\n return i;\n }\n }\n\n return -1;\n };\n\n publicAPI.allocateUnit = function (unit) {\n if (publicAPI.isAllocated(unit)) {\n return -1;\n }\n\n model.textureUnits[unit] = true;\n return unit;\n }; // ----------------------------------------------------------------------------\n // Description:\n // Tell if texture unit `textureUnitId' is already allocated.\n // \\pre valid_id_range : textureUnitId>=0 && textureUnitIdGetNumberOfTextureUnits()\n\n\n publicAPI.isAllocated = function (textureUnitId) {\n return model.textureUnits[textureUnitId];\n }; // ----------------------------------------------------------------------------\n // Description:\n // Release a texture unit.\n // \\pre valid_id: textureUnitId>=0 && textureUnitIdGetNumberOfTextureUnits()\n // \\pre allocated_id: this->IsAllocated(textureUnitId)\n\n\n publicAPI.free = function (val) {\n model.textureUnits[val] = false;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n context: null,\n numberOfTextureUnits: 0,\n textureUnits: 0\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues);\n macro.obj(publicAPI, model);\n model.textureUnits = []; // Build VTK API\n\n macro.get(publicAPI, model, ['numberOfTextureUnits']);\n macro.setGet(publicAPI, model, ['context']); // Object methods\n\n vtkOpenGLTextureUnitManager(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkOpenGLTextureUnitManager'); // ----------------------------------------------------------------------------\n\nvar vtkTextureUnitManager = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkTextureUnitManager as default, extend, newInstance };\n","import macro from '../../macros.js';\nimport vtkViewNode from './ViewNode.js';\n\n// vtkRenderWindowViewNode is intended to be a superclass for all api specific\n// RenderWindows. It is intended to define a common API that can be invoked\n// upon an api specific render window and provide some common method\n// implementations. If your application requires communicating with an api specific\n// view try to limit such interactions to methods defined in this class.\n// ----------------------------------------------------------------------------\n// ----------------------------------------------------------------------------\n// vtkRenderWindowViewNode methods\n// ----------------------------------------------------------------------------\n\nfunction vtkRenderWindowViewNode(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkRenderWindowViewNode');\n\n publicAPI.getViewNodeFactory = function () {\n return null;\n };\n\n publicAPI.getAspectRatio = function () {\n return model.size[0] / model.size[1];\n };\n\n publicAPI.getAspectRatioForRenderer = function (renderer) {\n var viewport = renderer.getViewportByReference();\n return model.size[0] * (viewport[2] - viewport[0]) / ((viewport[3] - viewport[1]) * model.size[1]);\n };\n\n publicAPI.isInViewport = function (x, y, viewport) {\n var vCoords = viewport.getViewportByReference();\n var size = publicAPI.getFramebufferSize();\n\n if (vCoords[0] * size[0] <= x && vCoords[2] * size[0] >= x && vCoords[1] * size[1] <= y && vCoords[3] * size[1] >= y) {\n return true;\n }\n\n return false;\n };\n\n publicAPI.getViewportSize = function (viewport) {\n var vCoords = viewport.getViewportByReference();\n var size = publicAPI.getFramebufferSize();\n return [(vCoords[2] - vCoords[0]) * size[0], (vCoords[3] - vCoords[1]) * size[1]];\n };\n\n publicAPI.getViewportCenter = function (viewport) {\n var size = publicAPI.getViewportSize(viewport);\n return [size[0] * 0.5, size[1] * 0.5];\n };\n\n publicAPI.displayToNormalizedDisplay = function (x, y, z) {\n var size = publicAPI.getFramebufferSize();\n return [x / size[0], y / size[1], z];\n };\n\n publicAPI.normalizedDisplayToDisplay = function (x, y, z) {\n var size = publicAPI.getFramebufferSize();\n return [x * size[0], y * size[1], z];\n };\n\n publicAPI.worldToView = function (x, y, z, renderer) {\n return renderer.worldToView(x, y, z);\n };\n\n publicAPI.viewToWorld = function (x, y, z, renderer) {\n return renderer.viewToWorld(x, y, z);\n };\n\n publicAPI.worldToDisplay = function (x, y, z, renderer) {\n var val = renderer.worldToView(x, y, z);\n var dims = publicAPI.getViewportSize(renderer);\n var val2 = renderer.viewToProjection(val[0], val[1], val[2], dims[0] / dims[1]);\n var val3 = renderer.projectionToNormalizedDisplay(val2[0], val2[1], val2[2]);\n return publicAPI.normalizedDisplayToDisplay(val3[0], val3[1], val3[2]);\n };\n\n publicAPI.displayToWorld = function (x, y, z, renderer) {\n var val = publicAPI.displayToNormalizedDisplay(x, y, z);\n var val2 = renderer.normalizedDisplayToProjection(val[0], val[1], val[2]);\n var dims = publicAPI.getViewportSize(renderer);\n var val3 = renderer.projectionToView(val2[0], val2[1], val2[2], dims[0] / dims[1]);\n return renderer.viewToWorld(val3[0], val3[1], val3[2]);\n };\n\n publicAPI.normalizedDisplayToViewport = function (x, y, z, renderer) {\n var vCoords = renderer.getViewportByReference();\n vCoords = publicAPI.normalizedDisplayToDisplay(vCoords[0], vCoords[1], 0.0);\n var coords = publicAPI.normalizedDisplayToDisplay(x, y, z);\n return [coords[0] - vCoords[0] - 0.5, coords[1] - vCoords[1] - 0.5, z];\n };\n\n publicAPI.viewportToNormalizedViewport = function (x, y, z, renderer) {\n var size = publicAPI.getViewportSize(renderer);\n\n if (size && size[0] !== 0 && size[1] !== 0) {\n return [x / (size[0] - 1.0), y / (size[1] - 1.0), z];\n }\n\n return [x, y, z];\n };\n\n publicAPI.normalizedViewportToViewport = function (x, y, z, renderer) {\n var size = publicAPI.getViewportSize(renderer);\n return [x * (size[0] - 1.0), y * (size[1] - 1.0), z];\n };\n\n publicAPI.displayToLocalDisplay = function (x, y, z) {\n var size = publicAPI.getFramebufferSize();\n return [x, size[1] - y - 1, z];\n };\n\n publicAPI.viewportToNormalizedDisplay = function (x, y, z, renderer) {\n var vCoords = renderer.getViewportByReference();\n vCoords = publicAPI.normalizedDisplayToDisplay(vCoords[0], vCoords[1], 0.0);\n var x2 = x + vCoords[0] + 0.5;\n var y2 = y + vCoords[1] + 0.5;\n return publicAPI.displayToNormalizedDisplay(x2, y2, z);\n };\n\n publicAPI.getComputedDevicePixelRatio = function () {\n return model.size[0] / publicAPI.getContainerSize()[0];\n };\n\n publicAPI.getContainerSize = function () {\n macro.vtkErrorMacro('not implemented');\n };\n\n publicAPI.getPixelData = function (x1, y1, x2, y2) {\n macro.vtkErrorMacro('not implemented');\n };\n\n publicAPI.createSelector = function () {\n macro.vtkErrorMacro('not implemented');\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n size: undefined,\n selector: undefined\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues);\n\n if (!model.size) {\n model.size = [300, 300];\n }\n\n macro.getArray(publicAPI, model, ['size'], 2);\n macro.get(publicAPI, model, ['selector']); // Inheritance\n\n vtkViewNode.extend(publicAPI, model, initialValues); // Object methods\n\n vtkRenderWindowViewNode(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkRenderWindowViewNode'); // ----------------------------------------------------------------------------\n\nvar vtkRenderWindowViewNode$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkRenderWindowViewNode$1 as default, extend, newInstance };\n","var XrSessionTypes = {\n HmdVR: 0,\n // Head-mounted display (HMD), two-camera virtual reality session\n MobileAR: 1,\n // Mobile device, single-camera augmented reality session\n LookingGlassVR: 2 // Looking Glass hologram display, N-camera virtual reality session\n\n};\nvar Constants = {\n XrSessionTypes: XrSessionTypes\n};\n\nexport { XrSessionTypes, Constants as default };\n","// This is used to access the underlying 3D context\nvar GET_UNDERLYING_CONTEXT = '__getUnderlyingContext';\nfunction createContextProxyHandler() {\n var cache = new Map();\n var getParameterHandler = {\n apply: function apply(target, gl, args) {\n if (cache.has(args[0])) {\n return cache.get(args[0]);\n }\n\n return target.apply(gl, args);\n }\n }; // only supports single-value setters\n\n function cachedSetterHandler(key) {\n return {\n apply: function apply(target, gl, args) {\n cache.set(key, args[0]);\n return target.apply(gl, args);\n }\n };\n } // When a property is accessed on the webgl context proxy,\n // it's accessed is intercepted. If the property name matches\n // any of the keys of `propHandlers`, then that handler is called\n // with the following arguments: (gl, prop, receiver, propValue)\n // - gl (WebGL2RenderingContext): the underlying webgl context\n // - propName (string): the property name\n // - receiver (Proxy): the webgl context proxy\n // - propValue (unknown): the value of `gl[propName]`\n\n\n var propHandlers = Object.create(null); // Sets getParameter(property) as a cached getter proxy.\n // propValue.bind(gl) is to avoid Illegal Invocation errors.\n\n propHandlers.getParameter = function (gl, prop, receiver, propValue) {\n return new Proxy(propValue.bind(gl), getParameterHandler);\n }; // Sets depthMask(flag) as a cached setter proxy.\n\n\n propHandlers.depthMask = function (gl, prop, receiver, propValue) {\n return new Proxy(propValue.bind(gl), cachedSetterHandler(gl.DEPTH_WRITEMASK));\n };\n\n return {\n get: function get(gl, prop, receiver) {\n if (prop === GET_UNDERLYING_CONTEXT) return function () {\n return gl;\n };\n var value = Reflect.get(gl, prop, gl);\n\n if (value instanceof Function) {\n // prevents Illegal Invocation errors\n value = value.bind(gl);\n }\n\n var propHandler = propHandlers[prop];\n\n if (propHandler) {\n return propHandler(gl, prop, receiver, value);\n }\n\n return value;\n }\n };\n}\nvar ContextProxy = {\n createContextProxyHandler: createContextProxyHandler\n};\n\nexport { GET_UNDERLYING_CONTEXT, createContextProxyHandler, ContextProxy as default };\n","import _slicedToArray from '@babel/runtime/helpers/slicedToArray';\nimport _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';\nimport _asyncToGenerator from '@babel/runtime/helpers/asyncToGenerator';\nimport _regeneratorRuntime from '@babel/runtime/regenerator';\nimport { VtkDataTypes } from '../../Common/Core/DataArray/Constants.js';\nimport macro from '../../macros.js';\nimport { registerViewConstructor } from '../Core/RenderWindow.js';\nimport vtkForwardPass from './ForwardPass.js';\nimport vtkHardwareSelector from './HardwareSelector.js';\nimport vtkShaderCache from './ShaderCache.js';\nimport vtkTextureUnitManager from './TextureUnitManager.js';\nimport vtkViewNodeFactory from './ViewNodeFactory.js';\nimport vtkRenderPass from '../SceneGraph/RenderPass.js';\nimport vtkRenderWindowViewNode from '../SceneGraph/RenderWindowViewNode.js';\nimport Constants from './RenderWindow/Constants.js';\nimport { createContextProxyHandler, GET_UNDERLYING_CONTEXT } from './RenderWindow/ContextProxy.js';\n\nvar vtkDebugMacro = macro.vtkDebugMacro,\n vtkErrorMacro = macro.vtkErrorMacro;\nvar XrSessionTypes = Constants.XrSessionTypes;\nvar SCREENSHOT_PLACEHOLDER = {\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%'\n};\nvar DEFAULT_RESET_FACTORS = {\n vr: {\n rescaleFactor: 1.0,\n translateZ: -0.7 // 0.7 m forward from the camera\n\n },\n ar: {\n rescaleFactor: 0.25,\n // scale down AR for viewing comfort by default\n translateZ: -0.5 // 0.5 m forward from the camera\n\n }\n};\n\nfunction checkRenderTargetSupport(gl, format, type) {\n // create temporary frame buffer and texture\n var framebuffer = gl.createFramebuffer();\n var texture = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.texImage2D(gl.TEXTURE_2D, 0, format, 2, 2, 0, format, type, null);\n gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0); // check frame buffer status\n\n var status = gl.checkFramebufferStatus(gl.FRAMEBUFFER); // clean up\n\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.bindTexture(gl.TEXTURE_2D, null);\n return status === gl.FRAMEBUFFER_COMPLETE;\n} // ----------------------------------------------------------------------------\n// Monitor the usage of GL context across vtkOpenGLRenderWindow instances\n// ----------------------------------------------------------------------------\n\n\nvar GL_CONTEXT_COUNT = 0;\nvar GL_CONTEXT_LISTENERS = [];\n\nfunction createGLContext() {\n GL_CONTEXT_COUNT++;\n GL_CONTEXT_LISTENERS.forEach(function (cb) {\n return cb(GL_CONTEXT_COUNT);\n });\n}\n\nfunction deleteGLContext() {\n GL_CONTEXT_COUNT--;\n GL_CONTEXT_LISTENERS.forEach(function (cb) {\n return cb(GL_CONTEXT_COUNT);\n });\n}\n\nfunction pushMonitorGLContextCount(cb) {\n GL_CONTEXT_LISTENERS.push(cb);\n}\nfunction popMonitorGLContextCount(cb) {\n return GL_CONTEXT_LISTENERS.pop();\n}\n\nfunction _preventDefault(e) {\n e.preventDefault();\n} // ----------------------------------------------------------------------------\n// vtkOpenGLRenderWindow methods\n// ----------------------------------------------------------------------------\n\n\nfunction vtkOpenGLRenderWindow(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkOpenGLRenderWindow');\n var cachingContextHandler = createContextProxyHandler();\n\n publicAPI.getViewNodeFactory = function () {\n return model.myFactory;\n }; // prevent default context lost handler\n\n\n model.canvas.addEventListener('webglcontextlost', _preventDefault, false);\n model.canvas.addEventListener('webglcontextrestored', publicAPI.restoreContext, false); // Cache the value here as calling it on each frame is expensive\n\n var isImmersiveVrSupported = navigator.xr !== undefined && navigator.xr.isSessionSupported('immersive-vr'); // Auto update style\n\n var previousSize = [0, 0];\n\n function updateWindow() {\n // Canvas size\n if (model.renderable) {\n if (model.size[0] !== previousSize[0] || model.size[1] !== previousSize[1]) {\n previousSize[0] = model.size[0];\n previousSize[1] = model.size[1];\n model.canvas.setAttribute('width', model.size[0]);\n model.canvas.setAttribute('height', model.size[1]);\n }\n } // ImageStream size\n\n\n if (model.viewStream) {\n // If same size that's a NoOp\n model.viewStream.setSize(model.size[0], model.size[1]);\n } // Offscreen ?\n\n\n model.canvas.style.display = model.useOffScreen ? 'none' : 'block'; // Cursor type\n\n if (model.el) {\n model.el.style.cursor = model.cursorVisibility ? model.cursor : 'none';\n } // Invalidate cached DOM container size\n\n\n model.containerSize = null;\n }\n\n publicAPI.onModified(updateWindow); // Builds myself.\n\n publicAPI.buildPass = function (prepass) {\n if (prepass) {\n if (!model.renderable) {\n return;\n }\n\n publicAPI.prepareNodes();\n publicAPI.addMissingNodes(model.renderable.getRenderersByReference());\n publicAPI.removeUnusedNodes();\n publicAPI.initialize();\n model.children.forEach(function (child) {\n child.setOpenGLRenderWindow(publicAPI);\n });\n }\n };\n\n publicAPI.initialize = function () {\n if (!model.initialized) {\n model.context = publicAPI.get3DContext();\n model.textureUnitManager = vtkTextureUnitManager.newInstance();\n model.textureUnitManager.setContext(model.context);\n model.shaderCache.setContext(model.context); // initialize blending for transparency\n\n var gl = model.context;\n gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n gl.depthFunc(gl.LEQUAL);\n gl.enable(gl.BLEND);\n model.initialized = true;\n }\n };\n\n publicAPI.makeCurrent = function () {\n model.context.makeCurrent();\n };\n\n publicAPI.setContainer = function (el) {\n if (model.el && model.el !== el) {\n if (model.canvas.parentNode !== model.el) {\n vtkErrorMacro('Error: canvas parent node does not match container');\n } // Remove canvas from previous container\n\n\n model.el.removeChild(model.canvas); // If the renderer has previously added\n // a background image, remove it from the DOM.\n\n if (model.el.contains(model.bgImage)) {\n model.el.removeChild(model.bgImage);\n }\n }\n\n if (model.el !== el) {\n model.el = el;\n\n if (model.el) {\n model.el.appendChild(model.canvas); // If the renderer is set to use a background\n // image, attach it to the DOM.\n\n if (model.useBackgroundImage) {\n model.el.appendChild(model.bgImage);\n }\n } // Trigger modified()\n\n\n publicAPI.modified();\n }\n };\n\n publicAPI.getContainer = function () {\n return model.el;\n };\n\n publicAPI.getContainerSize = function () {\n if (!model.containerSize && model.el) {\n var _model$el$getBounding = model.el.getBoundingClientRect(),\n width = _model$el$getBounding.width,\n height = _model$el$getBounding.height;\n\n model.containerSize = [width, height];\n }\n\n return model.containerSize || model.size;\n };\n\n publicAPI.getFramebufferSize = function () {\n if (model.activeFramebuffer) {\n return model.activeFramebuffer.getSize();\n }\n\n return model.size;\n };\n\n publicAPI.getPixelData = function (x1, y1, x2, y2) {\n var pixels = new Uint8Array((x2 - x1 + 1) * (y2 - y1 + 1) * 4);\n model.context.readPixels(x1, y1, x2 - x1 + 1, y2 - y1 + 1, model.context.RGBA, model.context.UNSIGNED_BYTE, pixels);\n return pixels;\n };\n\n publicAPI.get3DContext = function () {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {\n preserveDrawingBuffer: false,\n depth: true,\n alpha: true,\n powerPreference: 'high-performance'\n };\n var result = null; // Do we have webxr support\n\n if (isImmersiveVrSupported) {\n publicAPI.invokeHaveVRDisplay();\n }\n\n var webgl2Supported = typeof WebGL2RenderingContext !== 'undefined';\n model.webgl2 = false;\n\n if (model.defaultToWebgl2 && webgl2Supported) {\n result = model.canvas.getContext('webgl2', options);\n\n if (result) {\n model.webgl2 = true;\n vtkDebugMacro('using webgl2');\n }\n }\n\n if (!result) {\n vtkDebugMacro('using webgl1');\n result = model.canvas.getContext('webgl', options) || model.canvas.getContext('experimental-webgl', options);\n }\n\n return new Proxy(result, cachingContextHandler);\n }; // Request an XR session on the user device with WebXR,\n // typically in response to a user request such as a button press\n\n\n publicAPI.startXR = function (xrSessionType) {\n if (navigator.xr === undefined) {\n throw new Error('WebXR is not available');\n }\n\n model.xrSessionType = xrSessionType !== undefined ? xrSessionType : XrSessionTypes.HmdVR;\n var isAR = xrSessionType === XrSessionTypes.MobileAR;\n var sessionType = isAR ? 'immersive-ar' : 'immersive-vr';\n\n if (!navigator.xr.isSessionSupported(sessionType)) {\n if (isAR) {\n throw new Error('Device does not support AR session');\n } else {\n throw new Error('VR display is not available');\n }\n }\n\n if (model.xrSession === null) {\n navigator.xr.requestSession(sessionType).then(publicAPI.enterXR, function () {\n throw new Error('Failed to create XR session!');\n });\n } else {\n throw new Error('XR Session already exists!');\n }\n }; // When an XR session is available, set up the XRWebGLLayer\n // and request the first animation frame for the device\n\n\n publicAPI.enterXR = /*#__PURE__*/function () {\n var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(xrSession) {\n var gl, glLayer;\n return _regeneratorRuntime.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n model.xrSession = xrSession;\n model.oldCanvasSize = model.size.slice();\n\n if (!(model.xrSession !== null)) {\n _context.next = 15;\n break;\n }\n\n gl = publicAPI.get3DContext();\n _context.next = 6;\n return gl.makeXRCompatible();\n\n case 6:\n glLayer = new global.XRWebGLLayer(model.xrSession, // constructor needs unproxied context\n gl[GET_UNDERLYING_CONTEXT]());\n publicAPI.setSize(glLayer.framebufferWidth, glLayer.framebufferHeight);\n model.xrSession.updateRenderState({\n baseLayer: glLayer\n });\n model.xrSession.requestReferenceSpace('local').then(function (refSpace) {\n model.xrReferenceSpace = refSpace;\n });\n publicAPI.resetXRScene();\n model.renderable.getInteractor().switchToXRAnimation();\n model.xrSceneFrame = model.xrSession.requestAnimationFrame(publicAPI.xrRender);\n _context.next = 16;\n break;\n\n case 15:\n throw new Error('Failed to enter VR with a null xrSession.');\n\n case 16:\n case \"end\":\n return _context.stop();\n }\n }\n }, _callee);\n }));\n\n return function (_x) {\n return _ref.apply(this, arguments);\n };\n }();\n\n publicAPI.resetXRScene = function () {\n var inputRescaleFactor = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : DEFAULT_RESET_FACTORS.vr.rescaleFactor;\n var inputTranslateZ = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : DEFAULT_RESET_FACTORS.vr.translateZ;\n // Adjust world-to-physical parameters for different modalities\n // Default parameter values are for HMD VR\n var rescaleFactor = inputRescaleFactor;\n var translateZ = inputTranslateZ;\n var isXrSessionAR = model.xrSessionType === XrSessionTypes.MobileAR;\n\n if (isXrSessionAR && rescaleFactor === DEFAULT_RESET_FACTORS.vr.rescaleFactor) {\n // Scale down by default in AR\n rescaleFactor = DEFAULT_RESET_FACTORS.ar.rescaleFactor;\n }\n\n if (isXrSessionAR && translateZ === DEFAULT_RESET_FACTORS.vr.translateZ) {\n // Default closer to the camera in AR\n translateZ = DEFAULT_RESET_FACTORS.ar.translateZ;\n }\n\n var ren = model.renderable.getRenderers()[0];\n ren.resetCamera();\n var camera = ren.getActiveCamera();\n var physicalScale = camera.getPhysicalScale();\n var physicalTranslation = camera.getPhysicalTranslation();\n physicalScale /= rescaleFactor;\n translateZ *= physicalScale;\n physicalTranslation[2] += translateZ;\n camera.setPhysicalScale(physicalScale);\n camera.setPhysicalTranslation(physicalTranslation); // Clip at 0.1m, 100.0m in physical space by default\n\n camera.setClippingRange(0.1 * physicalScale, 100.0 * physicalScale);\n };\n\n publicAPI.stopXR = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {\n var gl, ren;\n return _regeneratorRuntime.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n if (!(navigator.xr === undefined)) {\n _context2.next = 2;\n break;\n }\n\n return _context2.abrupt(\"return\");\n\n case 2:\n if (!(model.xrSession !== null)) {\n _context2.next = 10;\n break;\n }\n\n model.xrSession.cancelAnimationFrame(model.xrSceneFrame);\n model.renderable.getInteractor().returnFromXRAnimation();\n gl = publicAPI.get3DContext();\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n _context2.next = 9;\n return model.xrSession.end().catch(function (error) {\n if (!(error instanceof DOMException)) {\n throw error;\n }\n });\n\n case 9:\n model.xrSession = null;\n\n case 10:\n if (model.oldCanvasSize !== undefined) {\n publicAPI.setSize.apply(publicAPI, _toConsumableArray(model.oldCanvasSize));\n } // Reset to default canvas\n\n\n ren = model.renderable.getRenderers()[0];\n ren.getActiveCamera().setProjectionMatrix(null);\n ren.resetCamera();\n ren.setViewport(0.0, 0, 1.0, 1.0);\n publicAPI.traverseAllPasses();\n\n case 16:\n case \"end\":\n return _context2.stop();\n }\n }\n }, _callee2);\n }));\n\n publicAPI.xrRender = /*#__PURE__*/function () {\n var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3(t, frame) {\n var xrSession, xrPose, gl, glLayer, ren;\n return _regeneratorRuntime.wrap(function _callee3$(_context3) {\n while (1) {\n switch (_context3.prev = _context3.next) {\n case 0:\n xrSession = frame.session;\n model.renderable.getInteractor().updateXRGamepads(xrSession, frame, model.xrReferenceSpace);\n model.xrSceneFrame = model.xrSession.requestAnimationFrame(publicAPI.xrRender);\n xrPose = frame.getViewerPose(model.xrReferenceSpace);\n\n if (xrPose) {\n gl = publicAPI.get3DContext();\n\n if (model.xrSessionType === XrSessionTypes.MobileAR && model.oldCanvasSize !== undefined) {\n gl.canvas.width = model.oldCanvasSize[0];\n gl.canvas.height = model.oldCanvasSize[1];\n }\n\n glLayer = xrSession.renderState.baseLayer;\n gl.bindFramebuffer(gl.FRAMEBUFFER, glLayer.framebuffer);\n gl.clear(gl.COLOR_BUFFER_BIT);\n gl.clear(gl.DEPTH_BUFFER_BIT);\n publicAPI.setSize(glLayer.framebufferWidth, glLayer.framebufferHeight); // get the first renderer\n\n ren = model.renderable.getRenderers()[0]; // Do a render pass for each eye\n\n xrPose.views.forEach(function (view, index) {\n var viewport = glLayer.getViewport(view); // TODO: Appropriate handling for AR passthrough on HMDs\n // with two eyes will require further investigation.\n\n if (model.xrSessionType === XrSessionTypes.HmdVR) {\n if (view.eye === 'left') {\n ren.setViewport(0, 0, 0.5, 1.0);\n } else if (view.eye === 'right') {\n ren.setViewport(0.5, 0, 1.0, 1.0);\n } else {\n // No handling for non-eye viewport\n return;\n }\n } else if (model.xrSessionType === XrSessionTypes.LookingGlassVR) {\n var startX = viewport.x / glLayer.framebufferWidth;\n var startY = viewport.y / glLayer.framebufferHeight;\n var endX = (viewport.x + viewport.width) / glLayer.framebufferWidth;\n var endY = (viewport.y + viewport.height) / glLayer.framebufferHeight;\n ren.setViewport(startX, startY, endX, endY);\n } else {\n ren.setViewport(0, 0, 1, 1);\n }\n\n ren.getActiveCamera().computeViewParametersFromPhysicalMatrix(view.transform.inverse.matrix);\n ren.getActiveCamera().setProjectionMatrix(view.projectionMatrix);\n publicAPI.traverseAllPasses();\n }); // Reset scissorbox before any subsequent rendering to external displays\n // on frame end, such as rendering to a Looking Glass display.\n\n gl.scissor(0, 0, glLayer.framebufferWidth, glLayer.framebufferHeight);\n gl.disable(gl.SCISSOR_TEST);\n }\n\n case 5:\n case \"end\":\n return _context3.stop();\n }\n }\n }, _callee3);\n }));\n\n return function (_x2, _x3) {\n return _ref3.apply(this, arguments);\n };\n }();\n\n publicAPI.restoreContext = function () {\n var rp = vtkRenderPass.newInstance();\n rp.setCurrentOperation('Release');\n rp.traverse(publicAPI, null);\n };\n\n publicAPI.activateTexture = function (texture) {\n // Only add if it isn't already there\n var result = model._textureResourceIds.get(texture);\n\n if (result !== undefined) {\n model.context.activeTexture(model.context.TEXTURE0 + result);\n return;\n }\n\n var activeUnit = publicAPI.getTextureUnitManager().allocate();\n\n if (activeUnit < 0) {\n vtkErrorMacro('Hardware does not support the number of textures defined.');\n return;\n }\n\n model._textureResourceIds.set(texture, activeUnit);\n\n model.context.activeTexture(model.context.TEXTURE0 + activeUnit);\n };\n\n publicAPI.deactivateTexture = function (texture) {\n // Only deactivate if it isn't already there\n var result = model._textureResourceIds.get(texture);\n\n if (result !== undefined) {\n publicAPI.getTextureUnitManager().free(result);\n\n model._textureResourceIds.delete(texture);\n }\n };\n\n publicAPI.getTextureUnitForTexture = function (texture) {\n var result = model._textureResourceIds.get(texture);\n\n if (result !== undefined) {\n return result;\n }\n\n return -1;\n };\n\n publicAPI.getDefaultTextureInternalFormat = function (vtktype, numComps) {\n var oglNorm16Ext = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n var useHalfFloat = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n\n if (model.webgl2) {\n switch (vtktype) {\n case VtkDataTypes.UNSIGNED_CHAR:\n switch (numComps) {\n case 1:\n return model.context.R8;\n\n case 2:\n return model.context.RG8;\n\n case 3:\n return model.context.RGB8;\n\n case 4:\n default:\n return model.context.RGBA8;\n }\n\n case oglNorm16Ext && !useHalfFloat && VtkDataTypes.UNSIGNED_SHORT:\n switch (numComps) {\n case 1:\n return oglNorm16Ext.R16_EXT;\n\n case 2:\n return oglNorm16Ext.RG16_EXT;\n\n case 3:\n return oglNorm16Ext.RGB16_EXT;\n\n case 4:\n default:\n return oglNorm16Ext.RGBA16_EXT;\n }\n\n // prioritize norm16 over float\n\n case oglNorm16Ext && !useHalfFloat && VtkDataTypes.SHORT:\n switch (numComps) {\n case 1:\n return oglNorm16Ext.R16_SNORM_EXT;\n\n case 2:\n return oglNorm16Ext.RG16_SNORM_EXT;\n\n case 3:\n return oglNorm16Ext.RGB16_SNORM_EXT;\n\n case 4:\n default:\n return oglNorm16Ext.RGBA16_SNORM_EXT;\n }\n\n case VtkDataTypes.FLOAT:\n default:\n switch (numComps) {\n case 1:\n return model.context.R16F;\n\n case 2:\n return model.context.RG16F;\n\n case 3:\n return model.context.RGB16F;\n\n case 4:\n default:\n return model.context.RGBA16F;\n }\n\n }\n } // webgl1 only supports four types\n\n\n switch (numComps) {\n case 1:\n return model.context.LUMINANCE;\n\n case 2:\n return model.context.LUMINANCE_ALPHA;\n\n case 3:\n return model.context.RGB;\n\n case 4:\n default:\n return model.context.RGBA;\n }\n };\n\n publicAPI.setBackgroundImage = function (img) {\n model.bgImage.src = img.src;\n };\n\n publicAPI.setUseBackgroundImage = function (value) {\n model.useBackgroundImage = value; // Add or remove the background image from the\n // DOM as specified.\n\n if (model.useBackgroundImage && !model.el.contains(model.bgImage)) {\n model.el.appendChild(model.bgImage);\n } else if (!model.useBackgroundImage && model.el.contains(model.bgImage)) {\n model.el.removeChild(model.bgImage);\n }\n };\n\n function getCanvasDataURL() {\n var format = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : model.imageFormat;\n // Copy current canvas to not modify the original\n var temporaryCanvas = document.createElement('canvas');\n var temporaryContext = temporaryCanvas.getContext('2d');\n temporaryCanvas.width = model.canvas.width;\n temporaryCanvas.height = model.canvas.height;\n temporaryContext.drawImage(model.canvas, 0, 0); // Get current client rect to place canvas\n\n var mainBoundingClientRect = model.canvas.getBoundingClientRect();\n var renderWindow = model.renderable;\n var renderers = renderWindow.getRenderers();\n renderers.forEach(function (renderer) {\n var viewProps = renderer.getViewProps();\n viewProps.forEach(function (viewProp) {\n // Check if the prop has a container that should have canvas\n if (viewProp.getContainer) {\n var container = viewProp.getContainer();\n var canvasList = container.getElementsByTagName('canvas'); // Go throughout all canvas and copy it into temporary main canvas\n\n for (var i = 0; i < canvasList.length; i++) {\n var currentCanvas = canvasList[i];\n var boundingClientRect = currentCanvas.getBoundingClientRect();\n var newXPosition = boundingClientRect.x - mainBoundingClientRect.x;\n var newYPosition = boundingClientRect.y - mainBoundingClientRect.y;\n temporaryContext.drawImage(currentCanvas, newXPosition, newYPosition);\n }\n }\n });\n });\n var screenshot = temporaryCanvas.toDataURL(format);\n temporaryCanvas.remove();\n publicAPI.invokeImageReady(screenshot);\n }\n\n publicAPI.captureNextImage = function () {\n var format = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'image/png';\n\n var _ref4 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n _ref4$resetCamera = _ref4.resetCamera,\n resetCamera = _ref4$resetCamera === void 0 ? false : _ref4$resetCamera,\n _ref4$size = _ref4.size,\n size = _ref4$size === void 0 ? null : _ref4$size,\n _ref4$scale = _ref4.scale,\n scale = _ref4$scale === void 0 ? 1 : _ref4$scale;\n\n if (model.deleted) {\n return null;\n }\n\n model.imageFormat = format;\n var previous = model.notifyStartCaptureImage;\n model.notifyStartCaptureImage = true;\n model._screenshot = {\n size: !!size || scale !== 1 ? size || model.size.map(function (val) {\n return val * scale;\n }) : null\n };\n return new Promise(function (resolve, reject) {\n var subscription = publicAPI.onImageReady(function (imageURL) {\n if (model._screenshot.size === null) {\n model.notifyStartCaptureImage = previous;\n subscription.unsubscribe();\n\n if (model._screenshot.placeHolder) {\n // resize the main canvas back to its original size and show it\n model.size = model._screenshot.originalSize; // process the resize\n\n publicAPI.modified(); // restore the saved camera parameters, if applicable\n\n if (model._screenshot.cameras) {\n model._screenshot.cameras.forEach(function (_ref5) {\n var restoreParamsFn = _ref5.restoreParamsFn,\n arg = _ref5.arg;\n return restoreParamsFn(arg);\n });\n } // Trigger a render at the original size\n\n\n publicAPI.traverseAllPasses(); // Remove and clean up the placeholder, revealing the original\n\n model.el.removeChild(model._screenshot.placeHolder);\n\n model._screenshot.placeHolder.remove();\n\n model._screenshot = null;\n }\n\n resolve(imageURL);\n } else {\n // Create a placeholder image overlay while we resize and render\n var tmpImg = document.createElement('img');\n tmpImg.style = SCREENSHOT_PLACEHOLDER;\n tmpImg.src = imageURL;\n model._screenshot.placeHolder = model.el.appendChild(tmpImg); // hide the main canvas\n\n model.canvas.style.display = 'none'; // remember the main canvas original size, then resize it\n\n model._screenshot.originalSize = model.size;\n model.size = model._screenshot.size;\n model._screenshot.size = null; // process the resize\n\n publicAPI.modified();\n\n if (resetCamera) {\n var isUserResetCamera = resetCamera !== true; // If resetCamera was requested, we first save camera parameters\n // from all the renderers, so we can restore them later\n\n model._screenshot.cameras = model.renderable.getRenderers().map(function (renderer) {\n var camera = renderer.getActiveCamera();\n var params = camera.get('focalPoint', 'position', 'parallelScale');\n return {\n resetCameraArgs: isUserResetCamera ? {\n renderer: renderer\n } : undefined,\n resetCameraFn: isUserResetCamera ? resetCamera : renderer.resetCamera,\n restoreParamsFn: camera.set,\n // \"clone\" the params so we don't keep refs to properties\n arg: JSON.parse(JSON.stringify(params))\n };\n }); // Perform the resetCamera() on each renderer only after capturing\n // the params from all active cameras, in case there happen to be\n // linked cameras among the renderers.\n\n model._screenshot.cameras.forEach(function (_ref6) {\n var resetCameraFn = _ref6.resetCameraFn,\n resetCameraArgs = _ref6.resetCameraArgs;\n return resetCameraFn(resetCameraArgs);\n });\n } // Trigger a render at the custom size\n\n\n publicAPI.traverseAllPasses();\n }\n });\n });\n };\n\n var hardwareMaximumLineWidth;\n\n publicAPI.getHardwareMaximumLineWidth = function () {\n // We cache the result of this function because `getParameter` is slow\n if (hardwareMaximumLineWidth != null) {\n return hardwareMaximumLineWidth;\n }\n\n var gl = publicAPI.get3DContext();\n var lineWidthRange = gl.getParameter(gl.ALIASED_LINE_WIDTH_RANGE);\n hardwareMaximumLineWidth = lineWidthRange[1];\n return lineWidthRange[1];\n };\n\n publicAPI.getGLInformations = function () {\n var gl = publicAPI.get3DContext();\n var glTextureFloat = gl.getExtension('OES_texture_float');\n var glTextureHalfFloat = gl.getExtension('OES_texture_half_float');\n var glDebugRendererInfo = gl.getExtension('WEBGL_debug_renderer_info');\n var glDrawBuffers = gl.getExtension('WEBGL_draw_buffers');\n var glAnisotropic = gl.getExtension('EXT_texture_filter_anisotropic') || gl.getExtension('WEBKIT_EXT_texture_filter_anisotropic');\n var params = [['Max Vertex Attributes', 'MAX_VERTEX_ATTRIBS', gl.getParameter(gl.MAX_VERTEX_ATTRIBS)], ['Max Varying Vectors', 'MAX_VARYING_VECTORS', gl.getParameter(gl.MAX_VARYING_VECTORS)], ['Max Vertex Uniform Vectors', 'MAX_VERTEX_UNIFORM_VECTORS', gl.getParameter(gl.MAX_VERTEX_UNIFORM_VECTORS)], ['Max Fragment Uniform Vectors', 'MAX_FRAGMENT_UNIFORM_VECTORS', gl.getParameter(gl.MAX_FRAGMENT_UNIFORM_VECTORS)], ['Max Fragment Texture Image Units', 'MAX_TEXTURE_IMAGE_UNITS', gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS)], ['Max Vertex Texture Image Units', 'MAX_VERTEX_TEXTURE_IMAGE_UNITS', gl.getParameter(gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS)], ['Max Combined Texture Image Units', 'MAX_COMBINED_TEXTURE_IMAGE_UNITS', gl.getParameter(gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS)], ['Max 2D Texture Size', 'MAX_TEXTURE_SIZE', gl.getParameter(gl.MAX_TEXTURE_SIZE)], ['Max Cube Texture Size', 'MAX_CUBE_MAP_TEXTURE_SIZE', gl.getParameter(gl.MAX_CUBE_MAP_TEXTURE_SIZE)], ['Max Texture Anisotropy', 'MAX_TEXTURE_MAX_ANISOTROPY_EXT', glAnisotropic && gl.getParameter(glAnisotropic.MAX_TEXTURE_MAX_ANISOTROPY_EXT)], ['Point Size Range', 'ALIASED_POINT_SIZE_RANGE', gl.getParameter(gl.ALIASED_POINT_SIZE_RANGE).join(' - ')], ['Line Width Range', 'ALIASED_LINE_WIDTH_RANGE', gl.getParameter(gl.ALIASED_LINE_WIDTH_RANGE).join(' - ')], ['Max Viewport Dimensions', 'MAX_VIEWPORT_DIMS', gl.getParameter(gl.MAX_VIEWPORT_DIMS).join(' - ')], ['Max Renderbuffer Size', 'MAX_RENDERBUFFER_SIZE', gl.getParameter(gl.MAX_RENDERBUFFER_SIZE)], ['Framebuffer Red Bits', 'RED_BITS', gl.getParameter(gl.RED_BITS)], ['Framebuffer Green Bits', 'GREEN_BITS', gl.getParameter(gl.GREEN_BITS)], ['Framebuffer Blue Bits', 'BLUE_BITS', gl.getParameter(gl.BLUE_BITS)], ['Framebuffer Alpha Bits', 'ALPHA_BITS', gl.getParameter(gl.ALPHA_BITS)], ['Framebuffer Depth Bits', 'DEPTH_BITS', gl.getParameter(gl.DEPTH_BITS)], ['Framebuffer Stencil Bits', 'STENCIL_BITS', gl.getParameter(gl.STENCIL_BITS)], ['Framebuffer Subpixel Bits', 'SUBPIXEL_BITS', gl.getParameter(gl.SUBPIXEL_BITS)], ['MSAA Samples', 'SAMPLES', gl.getParameter(gl.SAMPLES)], ['MSAA Sample Buffers', 'SAMPLE_BUFFERS', gl.getParameter(gl.SAMPLE_BUFFERS)], ['Supported Formats for UByte Render Targets ', 'UNSIGNED_BYTE RENDER TARGET FORMATS', [glTextureFloat && checkRenderTargetSupport(gl, gl.RGBA, gl.UNSIGNED_BYTE) ? 'RGBA' : '', glTextureFloat && checkRenderTargetSupport(gl, gl.RGB, gl.UNSIGNED_BYTE) ? 'RGB' : '', glTextureFloat && checkRenderTargetSupport(gl, gl.LUMINANCE, gl.UNSIGNED_BYTE) ? 'LUMINANCE' : '', glTextureFloat && checkRenderTargetSupport(gl, gl.ALPHA, gl.UNSIGNED_BYTE) ? 'ALPHA' : '', glTextureFloat && checkRenderTargetSupport(gl, gl.LUMINANCE_ALPHA, gl.UNSIGNED_BYTE) ? 'LUMINANCE_ALPHA' : ''].join(' ')], ['Supported Formats for Half Float Render Targets', 'HALF FLOAT RENDER TARGET FORMATS', [glTextureHalfFloat && checkRenderTargetSupport(gl, gl.RGBA, glTextureHalfFloat.HALF_FLOAT_OES) ? 'RGBA' : '', glTextureHalfFloat && checkRenderTargetSupport(gl, gl.RGB, glTextureHalfFloat.HALF_FLOAT_OES) ? 'RGB' : '', glTextureHalfFloat && checkRenderTargetSupport(gl, gl.LUMINANCE, glTextureHalfFloat.HALF_FLOAT_OES) ? 'LUMINANCE' : '', glTextureHalfFloat && checkRenderTargetSupport(gl, gl.ALPHA, glTextureHalfFloat.HALF_FLOAT_OES) ? 'ALPHA' : '', glTextureHalfFloat && checkRenderTargetSupport(gl, gl.LUMINANCE_ALPHA, glTextureHalfFloat.HALF_FLOAT_OES) ? 'LUMINANCE_ALPHA' : ''].join(' ')], ['Supported Formats for Full Float Render Targets', 'FLOAT RENDER TARGET FORMATS', [glTextureFloat && checkRenderTargetSupport(gl, gl.RGBA, gl.FLOAT) ? 'RGBA' : '', glTextureFloat && checkRenderTargetSupport(gl, gl.RGB, gl.FLOAT) ? 'RGB' : '', glTextureFloat && checkRenderTargetSupport(gl, gl.LUMINANCE, gl.FLOAT) ? 'LUMINANCE' : '', glTextureFloat && checkRenderTargetSupport(gl, gl.ALPHA, gl.FLOAT) ? 'ALPHA' : '', glTextureFloat && checkRenderTargetSupport(gl, gl.LUMINANCE_ALPHA, gl.FLOAT) ? 'LUMINANCE_ALPHA' : ''].join(' ')], ['Max Multiple Render Targets Buffers', 'MAX_DRAW_BUFFERS_WEBGL', glDrawBuffers ? gl.getParameter(glDrawBuffers.MAX_DRAW_BUFFERS_WEBGL) : 0], ['High Float Precision in Vertex Shader', 'HIGH_FLOAT VERTEX_SHADER', [gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.HIGH_FLOAT).precision, ' (-2', gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.HIGH_FLOAT).rangeMin, ' - 2', gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.HIGH_FLOAT).rangeMax, ')'].join('')], ['Medium Float Precision in Vertex Shader', 'MEDIUM_FLOAT VERTEX_SHADER', [gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.MEDIUM_FLOAT).precision, ' (-2', gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.MEDIUM_FLOAT).rangeMin, ' - 2', gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.MEDIUM_FLOAT).rangeMax, ')'].join('')], ['Low Float Precision in Vertex Shader', 'LOW_FLOAT VERTEX_SHADER', [gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.LOW_FLOAT).precision, ' (-2', gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.LOW_FLOAT).rangeMin, ' - 2', gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.LOW_FLOAT).rangeMax, ')'].join('')], ['High Float Precision in Fragment Shader', 'HIGH_FLOAT FRAGMENT_SHADER', [gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_FLOAT).precision, ' (-2', gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_FLOAT).rangeMin, ' - 2', gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_FLOAT).rangeMax, ')'].join('')], ['Medium Float Precision in Fragment Shader', 'MEDIUM_FLOAT FRAGMENT_SHADER', [gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT).precision, ' (-2', gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT).rangeMin, ' - 2', gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT).rangeMax, ')'].join('')], ['Low Float Precision in Fragment Shader', 'LOW_FLOAT FRAGMENT_SHADER', [gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.LOW_FLOAT).precision, ' (-2', gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.LOW_FLOAT).rangeMin, ' - 2', gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.LOW_FLOAT).rangeMax, ')'].join('')], ['High Int Precision in Vertex Shader', 'HIGH_INT VERTEX_SHADER', [gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.HIGH_INT).precision, ' (-2', gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.HIGH_INT).rangeMin, ' - 2', gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.HIGH_INT).rangeMax, ')'].join('')], ['Medium Int Precision in Vertex Shader', 'MEDIUM_INT VERTEX_SHADER', [gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.MEDIUM_INT).precision, ' (-2', gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.MEDIUM_INT).rangeMin, ' - 2', gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.MEDIUM_INT).rangeMax, ')'].join('')], ['Low Int Precision in Vertex Shader', 'LOW_INT VERTEX_SHADER', [gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.LOW_INT).precision, ' (-2', gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.LOW_INT).rangeMin, ' - 2', gl.getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.LOW_INT).rangeMax, ')'].join('')], ['High Int Precision in Fragment Shader', 'HIGH_INT FRAGMENT_SHADER', [gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_INT).precision, ' (-2', gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_INT).rangeMin, ' - 2', gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_INT).rangeMax, ')'].join('')], ['Medium Int Precision in Fragment Shader', 'MEDIUM_INT FRAGMENT_SHADER', [gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.MEDIUM_INT).precision, ' (-2', gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.MEDIUM_INT).rangeMin, ' - 2', gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.MEDIUM_INT).rangeMax, ')'].join('')], ['Low Int Precision in Fragment Shader', 'LOW_INT FRAGMENT_SHADER', [gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.LOW_INT).precision, ' (-2', gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.LOW_INT).rangeMin, ' - 2', gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.LOW_INT).rangeMax, ')'].join('')], ['Supported Extensions', 'EXTENSIONS', gl.getSupportedExtensions().join('
\\t\\t\\t\\t\\t ')], ['WebGL Renderer', 'RENDERER', gl.getParameter(gl.RENDERER)], ['WebGL Vendor', 'VENDOR', gl.getParameter(gl.VENDOR)], ['WebGL Version', 'VERSION', gl.getParameter(gl.VERSION)], ['Shading Language Version', 'SHADING_LANGUAGE_VERSION', gl.getParameter(gl.SHADING_LANGUAGE_VERSION)], ['Unmasked Renderer', 'UNMASKED_RENDERER', glDebugRendererInfo && gl.getParameter(glDebugRendererInfo.UNMASKED_RENDERER_WEBGL)], ['Unmasked Vendor', 'UNMASKED_VENDOR', glDebugRendererInfo && gl.getParameter(glDebugRendererInfo.UNMASKED_VENDOR_WEBGL)], ['WebGL Version', 'WEBGL_VERSION', model.webgl2 ? 2 : 1]];\n var result = {};\n\n while (params.length) {\n var _params$pop = params.pop(),\n _params$pop2 = _slicedToArray(_params$pop, 3),\n label = _params$pop2[0],\n key = _params$pop2[1],\n value = _params$pop2[2];\n\n if (key) {\n result[key] = {\n label: label,\n value: value\n };\n }\n }\n\n return result;\n };\n\n publicAPI.traverseAllPasses = function () {\n if (model.renderPasses) {\n for (var index = 0; index < model.renderPasses.length; ++index) {\n model.renderPasses[index].traverse(publicAPI, null);\n }\n }\n\n if (model.notifyStartCaptureImage) {\n getCanvasDataURL();\n }\n };\n\n publicAPI.disableCullFace = function () {\n if (model.cullFaceEnabled) {\n model.context.disable(model.context.CULL_FACE);\n model.cullFaceEnabled = false;\n }\n };\n\n publicAPI.enableCullFace = function () {\n if (!model.cullFaceEnabled) {\n model.context.enable(model.context.CULL_FACE);\n model.cullFaceEnabled = true;\n }\n };\n\n publicAPI.setViewStream = function (stream) {\n if (model.viewStream === stream) {\n return false;\n }\n\n if (model.subscription) {\n model.subscription.unsubscribe();\n model.subscription = null;\n }\n\n model.viewStream = stream;\n\n if (model.viewStream) {\n // Force background to be transparent + render\n var mainRenderer = model.renderable.getRenderers()[0];\n mainRenderer.getBackgroundByReference()[3] = 0; // Enable display of the background image\n\n publicAPI.setUseBackgroundImage(true); // Bind to remote stream\n\n model.subscription = model.viewStream.onImageReady(function (e) {\n return publicAPI.setBackgroundImage(e.image);\n });\n model.viewStream.setSize(model.size[0], model.size[1]);\n model.viewStream.invalidateCache();\n model.viewStream.render();\n publicAPI.modified();\n }\n\n return true;\n };\n\n publicAPI.createSelector = function () {\n var ret = vtkHardwareSelector.newInstance();\n ret.setOpenGLRenderWindow(publicAPI);\n return ret;\n };\n\n function clearEvents() {\n model.canvas.removeEventListener('webglcontextlost', _preventDefault);\n model.canvas.removeEventListener('webglcontextrestored', publicAPI.restoreContext);\n }\n\n publicAPI.delete = macro.chain(clearEvents, publicAPI.delete, publicAPI.setViewStream, deleteGLContext); // Do not trigger modified for performance reasons\n\n publicAPI.setActiveFramebuffer = function (newActiveFramebuffer) {\n model.activeFramebuffer = newActiveFramebuffer;\n };\n\n var superSetSize = publicAPI.setSize;\n\n publicAPI.setSize = function (width, height) {\n var modified = superSetSize(width, height);\n\n if (modified) {\n publicAPI.invokeWindowResizeEvent({\n width: width,\n height: height\n });\n }\n\n return modified;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n cullFaceEnabled: false,\n shaderCache: null,\n initialized: false,\n context: null,\n canvas: null,\n cursorVisibility: true,\n cursor: 'pointer',\n textureUnitManager: null,\n textureResourceIds: null,\n containerSize: null,\n renderPasses: [],\n notifyStartCaptureImage: false,\n webgl2: false,\n defaultToWebgl2: true,\n // attempt webgl2 on by default\n activeFramebuffer: null,\n xrSession: null,\n xrReferenceSpace: null,\n xrSupported: true,\n imageFormat: 'image/png',\n useOffScreen: false,\n useBackgroundImage: false\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkRenderWindowViewNode.extend(publicAPI, model, initialValues); // Create internal instances\n\n model.canvas = document.createElement('canvas');\n model.canvas.style.width = '100%';\n createGLContext();\n\n if (!model.selector) {\n model.selector = vtkHardwareSelector.newInstance();\n model.selector.setOpenGLRenderWindow(publicAPI);\n } // Create internal bgImage\n\n\n model.bgImage = new Image();\n model.bgImage.style.position = 'absolute';\n model.bgImage.style.left = '0';\n model.bgImage.style.top = '0';\n model.bgImage.style.width = '100%';\n model.bgImage.style.height = '100%';\n model.bgImage.style.zIndex = '-1';\n model._textureResourceIds = new Map();\n model.myFactory = vtkViewNodeFactory.newInstance();\n /* eslint-disable no-use-before-define */\n\n model.myFactory.registerOverride('vtkRenderWindow', newInstance);\n /* eslint-enable no-use-before-define */\n\n model.shaderCache = vtkShaderCache.newInstance();\n model.shaderCache.setOpenGLRenderWindow(publicAPI); // setup default forward pass rendering\n\n model.renderPasses[0] = vtkForwardPass.newInstance();\n macro.event(publicAPI, model, 'imageReady');\n macro.event(publicAPI, model, 'haveVRDisplay'); // Build VTK API\n\n macro.get(publicAPI, model, ['shaderCache', 'textureUnitManager', 'webgl2', 'vrDisplay', 'useBackgroundImage', 'xrSupported', 'activeFramebuffer']);\n macro.setGet(publicAPI, model, ['initialized', 'context', 'canvas', 'renderPasses', 'notifyStartCaptureImage', 'defaultToWebgl2', 'cursor', 'useOffScreen']);\n macro.setGetArray(publicAPI, model, ['size'], 2);\n macro.event(publicAPI, model, 'windowResizeEvent'); // Object methods\n\n vtkOpenGLRenderWindow(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkOpenGLRenderWindow'); // ----------------------------------------------------------------------------\n// Register API specific RenderWindow implementation\n// ----------------------------------------------------------------------------\n\nregisterViewConstructor('WebGL', newInstance); // ----------------------------------------------------------------------------\n\nvar vtkRenderWindow = {\n newInstance: newInstance,\n extend: extend,\n pushMonitorGLContextCount: pushMonitorGLContextCount,\n popMonitorGLContextCount: popMonitorGLContextCount\n};\n\nexport { vtkRenderWindow as default, extend, newInstance, popMonitorGLContextCount, pushMonitorGLContextCount };\n","import { mat3, mat4 } from 'gl-matrix';\nimport { newInstance as newInstance$1, obj, setGet, get } from '../../macros.js';\nimport vtkViewNode from '../SceneGraph/ViewNode.js';\nimport { registerOverride } from './ViewNodeFactory.js';\n\n// vtkOpenGLActor methods\n// ----------------------------------------------------------------------------\n\nfunction vtkOpenGLActor(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkOpenGLActor'); // Builds myself.\n\n publicAPI.buildPass = function (prepass) {\n if (prepass) {\n model._openGLRenderWindow = publicAPI.getFirstAncestorOfType('vtkOpenGLRenderWindow');\n model._openGLRenderer = publicAPI.getFirstAncestorOfType('vtkOpenGLRenderer');\n model.context = model._openGLRenderWindow.getContext();\n publicAPI.prepareNodes();\n publicAPI.addMissingNodes(model.renderable.getTextures());\n publicAPI.addMissingNode(model.renderable.getMapper());\n publicAPI.removeUnusedNodes(); // we store textures and mapper\n\n model.ogltextures = null;\n model.activeTextures = null;\n\n for (var index = 0; index < model.children.length; index++) {\n var child = model.children[index];\n\n if (child.isA('vtkOpenGLTexture')) {\n if (!model.ogltextures) {\n model.ogltextures = [];\n }\n\n model.ogltextures.push(child);\n } else {\n model.oglmapper = child;\n }\n }\n }\n }; // render both opaque and translucent actors\n\n\n publicAPI.traverseZBufferPass = function (renderPass) {\n if (!model.renderable || !model.renderable.getNestedVisibility() || model._openGLRenderer.getSelector() && !model.renderable.getNestedPickable()) {\n return;\n }\n\n publicAPI.apply(renderPass, true);\n model.oglmapper.traverse(renderPass);\n publicAPI.apply(renderPass, false);\n }; // only render opaque actors\n\n\n publicAPI.traverseOpaqueZBufferPass = function (renderPass) {\n return publicAPI.traverseOpaquePass(renderPass);\n }; // we draw textures, then mapper, then post pass textures\n\n\n publicAPI.traverseOpaquePass = function (renderPass) {\n if (!model.renderable || !model.renderable.getNestedVisibility() || !model.renderable.getIsOpaque() || model._openGLRenderer.getSelector() && !model.renderable.getNestedPickable()) {\n return;\n }\n\n publicAPI.apply(renderPass, true);\n model.oglmapper.traverse(renderPass);\n publicAPI.apply(renderPass, false);\n }; // we draw textures, then mapper, then post pass textures\n\n\n publicAPI.traverseTranslucentPass = function (renderPass) {\n if (!model.renderable || !model.renderable.getNestedVisibility() || model.renderable.getIsOpaque() || model._openGLRenderer.getSelector() && !model.renderable.getNestedPickable()) {\n return;\n }\n\n publicAPI.apply(renderPass, true);\n model.oglmapper.traverse(renderPass);\n publicAPI.apply(renderPass, false);\n };\n\n publicAPI.activateTextures = function () {\n // always traverse textures first, then mapper\n if (!model.ogltextures) {\n return;\n }\n\n model.activeTextures = [];\n\n for (var index = 0; index < model.ogltextures.length; index++) {\n var child = model.ogltextures[index];\n child.render();\n\n if (child.getHandle()) {\n model.activeTextures.push(child);\n }\n }\n };\n\n publicAPI.queryPass = function (prepass, renderPass) {\n if (prepass) {\n if (!model.renderable || !model.renderable.getVisibility()) {\n return;\n }\n\n if (model.renderable.getIsOpaque()) {\n renderPass.incrementOpaqueActorCount();\n } else {\n renderPass.incrementTranslucentActorCount();\n }\n }\n };\n\n publicAPI.zBufferPass = function (prepass, renderPass) {\n return publicAPI.opaquePass(prepass, renderPass);\n };\n\n publicAPI.opaqueZBufferPass = function (prepass, renderPass) {\n return publicAPI.opaquePass(prepass, renderPass);\n };\n\n publicAPI.opaquePass = function (prepass, renderPass) {\n if (prepass) {\n model.context.depthMask(true);\n publicAPI.activateTextures();\n } else if (model.activeTextures) {\n for (var index = 0; index < model.activeTextures.length; index++) {\n model.activeTextures[index].deactivate();\n }\n }\n }; // Renders myself\n\n\n publicAPI.translucentPass = function (prepass, renderPass) {\n if (prepass) {\n model.context.depthMask(false);\n publicAPI.activateTextures();\n } else if (model.activeTextures) {\n for (var index = 0; index < model.activeTextures.length; index++) {\n model.activeTextures[index].deactivate();\n }\n }\n };\n\n publicAPI.getKeyMatrices = function () {\n // has the actor changed?\n if (model.renderable.getMTime() > model.keyMatrixTime.getMTime()) {\n model.renderable.computeMatrix();\n mat4.copy(model.keyMatrices.mcwc, model.renderable.getMatrix());\n mat4.transpose(model.keyMatrices.mcwc, model.keyMatrices.mcwc);\n\n if (model.renderable.getIsIdentity()) {\n mat3.identity(model.keyMatrices.normalMatrix);\n } else {\n mat3.fromMat4(model.keyMatrices.normalMatrix, model.keyMatrices.mcwc);\n mat3.invert(model.keyMatrices.normalMatrix, model.keyMatrices.normalMatrix);\n mat3.transpose(model.keyMatrices.normalMatrix, model.keyMatrices.normalMatrix);\n }\n\n model.keyMatrixTime.modified();\n }\n\n return model.keyMatrices;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n context: null,\n keyMatrixTime: null,\n keyMatrices: null,\n activeTextures: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkViewNode.extend(publicAPI, model, initialValues);\n model.keyMatrixTime = {};\n obj(model.keyMatrixTime, {\n mtime: 0\n });\n model.keyMatrices = {\n normalMatrix: mat3.identity(new Float64Array(9)),\n mcwc: mat4.identity(new Float64Array(16))\n }; // Build VTK API\n\n setGet(publicAPI, model, ['context']);\n get(publicAPI, model, ['activeTextures']); // Object methods\n\n vtkOpenGLActor(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend); // ----------------------------------------------------------------------------\n\nvar vtkActor = {\n newInstance: newInstance,\n extend: extend\n}; // Register ourself to OpenGL backend if imported\n\nregisterOverride('vtkActor', newInstance);\n\nexport { vtkActor as default, extend, newInstance };\n","import { newInstance as newInstance$1, setGet, get } from '../../macros.js';\nimport vtkViewNode from '../SceneGraph/ViewNode.js';\nimport { registerOverride } from './ViewNodeFactory.js';\n\n// vtkOpenGLActor methods\n// ----------------------------------------------------------------------------\n\nfunction vtkOpenGLActor2D(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkOpenGLActor2D'); // Builds myself.\n\n publicAPI.buildPass = function (prepass) {\n if (prepass) {\n if (!model.renderable) {\n return;\n }\n\n model._openGLRenderWindow = publicAPI.getFirstAncestorOfType('vtkOpenGLRenderWindow');\n model._openGLRenderer = publicAPI.getFirstAncestorOfType('vtkOpenGLRenderer');\n model.context = model._openGLRenderWindow.getContext();\n publicAPI.prepareNodes();\n publicAPI.addMissingNodes(model.renderable.getTextures());\n publicAPI.addMissingNode(model.renderable.getMapper());\n publicAPI.removeUnusedNodes(); // we store textures and mapper\n\n model.ogltextures = null;\n model.activeTextures = null;\n\n for (var index = 0; index < model.children.length; index++) {\n var child = model.children[index];\n\n if (child.isA('vtkOpenGLTexture')) {\n if (!model.ogltextures) {\n model.ogltextures = [];\n }\n\n model.ogltextures.push(child);\n } else {\n model.oglmapper = child;\n }\n }\n }\n };\n\n publicAPI.queryPass = function (prepass, renderPass) {\n if (prepass) {\n if (!model.renderable || !model.renderable.getVisibility()) {\n return;\n }\n\n renderPass.incrementOverlayActorCount();\n }\n }; // we draw textures, then mapper, then post pass textures\n\n\n publicAPI.traverseOpaquePass = function (renderPass) {\n if (!model.oglmapper || !model.renderable || !model.renderable.getNestedVisibility() || !model.renderable.getIsOpaque() || model._openGLRenderer.getSelector() && !model.renderable.getNestedPickable()) {\n return;\n }\n\n publicAPI.apply(renderPass, true);\n model.oglmapper.traverse(renderPass);\n publicAPI.apply(renderPass, false);\n }; // we draw textures, then mapper, then post pass textures\n\n\n publicAPI.traverseTranslucentPass = function (renderPass) {\n if (!model.oglmapper || !model.renderable || !model.renderable.getNestedVisibility() || model.renderable.getIsOpaque() || model._openGLRenderer.getSelector() && !model.renderable.getNestedPickable()) {\n return;\n }\n\n publicAPI.apply(renderPass, true);\n model.oglmapper.traverse(renderPass);\n publicAPI.apply(renderPass, false);\n };\n\n publicAPI.traverseOverlayPass = function (renderPass) {\n if (!model.oglmapper || !model.renderable || !model.renderable.getNestedVisibility() || model._openGLRenderer.getSelector() && !model.renderable.getNestedPickable) {\n return;\n }\n\n publicAPI.apply(renderPass, true);\n model.oglmapper.traverse(renderPass);\n publicAPI.apply(renderPass, false);\n };\n\n publicAPI.activateTextures = function () {\n // always traverse textures first, then mapper\n if (!model.ogltextures) {\n return;\n }\n\n model.activeTextures = [];\n\n for (var index = 0; index < model.ogltextures.length; index++) {\n var child = model.ogltextures[index];\n child.render();\n\n if (child.getHandle()) {\n model.activeTextures.push(child);\n }\n }\n }; // Renders myself\n\n\n publicAPI.opaquePass = function (prepass, renderPass) {\n if (prepass) {\n model.context.depthMask(true);\n publicAPI.activateTextures();\n } else if (model.activeTextures) {\n // deactivate textures\n for (var index = 0; index < model.activeTextures.length; index++) {\n model.activeTextures[index].deactivate();\n }\n }\n }; // Renders myself\n\n\n publicAPI.translucentPass = function (prepass, renderPass) {\n if (prepass) {\n model.context.depthMask(false);\n publicAPI.activateTextures();\n } else if (model.activeTextures) {\n for (var index = 0; index < model.activeTextures.length; index++) {\n model.activeTextures[index].deactivate();\n }\n }\n }; // Renders myself\n\n\n publicAPI.overlayPass = function (prepass, renderPass) {\n if (prepass) {\n model.context.depthMask(true);\n publicAPI.activateTextures();\n } else if (model.activeTextures) {\n // deactivate textures\n for (var index = 0; index < model.activeTextures.length; index++) {\n model.activeTextures[index].deactivate();\n }\n }\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n context: null,\n activeTextures: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkViewNode.extend(publicAPI, model, initialValues); // Build VTK API\n\n setGet(publicAPI, model, ['context']);\n get(publicAPI, model, ['activeTextures']); // Object methods\n\n vtkOpenGLActor2D(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend); // ----------------------------------------------------------------------------\n\nvar vtkActor2D = {\n newInstance: newInstance,\n extend: extend\n}; // Register ourself to OpenGL backend if imported\n\nregisterOverride('vtkActor2D', newInstance);\n\nexport { vtkActor2D as default, extend, newInstance };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';\nimport { mat3, mat4, vec3 } from 'gl-matrix';\nimport { newInstance as newInstance$1, setGet, obj, vtkErrorMacro as vtkErrorMacro$1 } from '../../macros.js';\nimport vtkHelper from './Helper.js';\nimport vtkMapper from '../Core/Mapper.js';\nimport { l as normalize, u as uninitializeBounds } from '../../Common/Core/Math/index.js';\nimport vtkOpenGLTexture from './Texture.js';\nimport vtkProp from '../Core/Prop.js';\nimport vtkProperty from '../Core/Property.js';\nimport vtkShaderProgram from './ShaderProgram.js';\nimport vtkViewNode from '../SceneGraph/ViewNode.js';\nimport { v as vtkPolyDataVS } from './glsl/vtkPolyDataVS.glsl.js';\nimport { v as vtkPolyDataFS } from './glsl/vtkPolyDataFS.glsl.js';\nimport vtkReplacementShaderMapper from './ReplacementShaderMapper.js';\nimport { registerOverride } from './ViewNodeFactory.js';\nimport { PassTypes } from './HardwareSelector/Constants.js';\nimport vtkDataSet from '../../Common/DataModel/DataSet.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nvar FieldAssociations = vtkDataSet.FieldAssociations;\n/* eslint-disable no-lonely-if */\n\nvar primTypes = vtkHelper.primTypes;\nvar Representation = vtkProperty.Representation,\n Shading = vtkProperty.Shading;\nvar ScalarMode = vtkMapper.ScalarMode;\nvar Filter = vtkOpenGLTexture.Filter,\n Wrap = vtkOpenGLTexture.Wrap;\nvar vtkErrorMacro = vtkErrorMacro$1;\nvar StartEvent = {\n type: 'StartEvent'\n};\nvar EndEvent = {\n type: 'EndEvent'\n};\nvar CoordinateSystem = vtkProp.CoordinateSystem; // ----------------------------------------------------------------------------\n// vtkOpenGLPolyDataMapper methods\n// ----------------------------------------------------------------------------\n\nfunction getPickState(renderer) {\n var selector = renderer.getSelector();\n\n if (selector) {\n return selector.getCurrentPass();\n }\n\n return PassTypes.MIN_KNOWN_PASS - 1;\n}\n\nfunction vtkOpenGLPolyDataMapper(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkOpenGLPolyDataMapper');\n\n publicAPI.buildPass = function (prepass) {\n if (prepass) {\n model.currentRenderPass = null;\n model.openGLActor = publicAPI.getFirstAncestorOfType('vtkOpenGLActor');\n model._openGLRenderer = model.openGLActor.getFirstAncestorOfType('vtkOpenGLRenderer');\n model._openGLRenderWindow = model._openGLRenderer.getParent();\n model.openGLCamera = model._openGLRenderer.getViewNodeFor(model._openGLRenderer.getRenderable().getActiveCamera());\n }\n }; // Renders myself\n\n\n publicAPI.translucentPass = function (prepass, renderPass) {\n if (prepass) {\n model.currentRenderPass = renderPass;\n publicAPI.render();\n }\n };\n\n publicAPI.zBufferPass = function (prepass) {\n if (prepass) {\n model.haveSeenDepthRequest = true;\n model.renderDepth = true;\n publicAPI.render();\n model.renderDepth = false;\n }\n };\n\n publicAPI.opaqueZBufferPass = function (prepass) {\n return publicAPI.zBufferPass(prepass);\n };\n\n publicAPI.opaquePass = function (prepass) {\n if (prepass) {\n publicAPI.render();\n }\n };\n\n publicAPI.render = function () {\n var ctx = model._openGLRenderWindow.getContext();\n\n if (model.context !== ctx) {\n model.context = ctx;\n\n for (var i = primTypes.Start; i < primTypes.End; i++) {\n model.primitives[i].setOpenGLRenderWindow(model._openGLRenderWindow);\n }\n }\n\n var actor = model.openGLActor.getRenderable();\n\n var ren = model._openGLRenderer.getRenderable();\n\n publicAPI.renderPiece(ren, actor);\n };\n\n publicAPI.getShaderTemplate = function (shaders, ren, actor) {\n shaders.Vertex = vtkPolyDataVS;\n shaders.Fragment = vtkPolyDataFS;\n shaders.Geometry = '';\n };\n\n publicAPI.replaceShaderColor = function (shaders, ren, actor) {\n var VSSource = shaders.Vertex;\n var GSSource = shaders.Geometry;\n var FSSource = shaders.Fragment;\n var lastLightComplexity = model.lastBoundBO.getReferenceByName('lastLightComplexity'); // create the material/color property declarations, and VS implementation\n // these are always defined\n\n var colorDec = ['uniform float ambient;', 'uniform float diffuse;', 'uniform float specular;', 'uniform float opacityUniform; // the fragment opacity', 'uniform vec3 ambientColorUniform;', 'uniform vec3 diffuseColorUniform;']; // add more for specular\n\n if (lastLightComplexity) {\n colorDec = colorDec.concat(['uniform vec3 specularColorUniform;', 'uniform float specularPowerUniform;']);\n } // now handle the more complex fragment shader implementation\n // the following are always defined variables. We start\n // by assigning a default value from the uniform\n\n\n var colorImpl = ['vec3 ambientColor;', ' vec3 diffuseColor;', ' float opacity;'];\n\n if (lastLightComplexity) {\n colorImpl = colorImpl.concat([' vec3 specularColor;', ' float specularPower;']);\n }\n\n colorImpl = colorImpl.concat([' ambientColor = ambientColorUniform;', ' diffuseColor = diffuseColorUniform;', ' opacity = opacityUniform;']);\n\n if (lastLightComplexity) {\n colorImpl = colorImpl.concat([' specularColor = specularColorUniform;', ' specularPower = specularPowerUniform;']);\n } // add scalar vertex coloring\n\n\n if (model.lastBoundBO.getCABO().getColorComponents() !== 0 && !model.drawingEdges) {\n colorDec = colorDec.concat(['varying vec4 vertexColorVSOutput;']);\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::Color::Dec', ['attribute vec4 scalarColor;', 'varying vec4 vertexColorVSOutput;']).result;\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::Color::Impl', ['vertexColorVSOutput = scalarColor;']).result;\n GSSource = vtkShaderProgram.substitute(GSSource, '//VTK::Color::Dec', ['in vec4 vertexColorVSOutput[];', 'out vec4 vertexColorGSOutput;']).result;\n GSSource = vtkShaderProgram.substitute(GSSource, '//VTK::Color::Impl', ['vertexColorGSOutput = vertexColorVSOutput[i];']).result;\n }\n\n if (model.lastBoundBO.getCABO().getColorComponents() !== 0 && !model.drawingEdges) {\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Color::Impl', colorImpl.concat([' diffuseColor = vertexColorVSOutput.rgb;', ' ambientColor = vertexColorVSOutput.rgb;', ' opacity = opacity*vertexColorVSOutput.a;'])).result;\n } else {\n if (model.renderable.getInterpolateScalarsBeforeMapping() && model.renderable.getColorCoordinates() && !model.drawingEdges) {\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Color::Impl', colorImpl.concat([' vec4 texColor = texture2D(texture1, tcoordVCVSOutput.st);', ' diffuseColor = texColor.rgb;', ' ambientColor = texColor.rgb;', ' opacity = opacity*texColor.a;'])).result;\n } else {\n if (actor.getBackfaceProperty() && !model.drawingEdges) {\n colorDec = colorDec.concat(['uniform float opacityUniformBF; // the fragment opacity', 'uniform float ambientIntensityBF; // the material ambient', 'uniform float diffuseIntensityBF; // the material diffuse', 'uniform vec3 ambientColorUniformBF; // ambient material color', 'uniform vec3 diffuseColorUniformBF; // diffuse material color']);\n\n if (lastLightComplexity) {\n colorDec = colorDec.concat(['uniform float specularIntensityBF; // the material specular intensity', 'uniform vec3 specularColorUniformBF; // intensity weighted color', 'uniform float specularPowerUniformBF;']);\n colorImpl = colorImpl.concat(['if (gl_FrontFacing == false) {', ' ambientColor = ambientIntensityBF * ambientColorUniformBF;', ' diffuseColor = diffuseIntensityBF * diffuseColorUniformBF;', ' specularColor = specularIntensityBF * specularColorUniformBF;', ' specularPower = specularPowerUniformBF;', ' opacity = opacityUniformBF; }']);\n } else {\n colorImpl = colorImpl.concat(['if (gl_FrontFacing == false) {', ' ambientColor = ambientIntensityBF * ambientColorUniformBF;', ' diffuseColor = diffuseIntensityBF * diffuseColorUniformBF;', ' opacity = opacityUniformBF; }']);\n }\n }\n\n if (model.haveCellScalars && !model.drawingEdges) {\n colorDec = colorDec.concat(['uniform samplerBuffer texture1;']);\n }\n\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Color::Impl', colorImpl).result;\n }\n }\n\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Color::Dec', colorDec).result;\n shaders.Vertex = VSSource;\n shaders.Geometry = GSSource;\n shaders.Fragment = FSSource;\n };\n\n publicAPI.replaceShaderLight = function (shaders, ren, actor) {\n var FSSource = shaders.Fragment; // check for shadow maps\n\n var shadowFactor = '';\n var lastLightComplexity = model.lastBoundBO.getReferenceByName('lastLightComplexity');\n var lastLightCount = model.lastBoundBO.getReferenceByName('lastLightCount');\n var sstring = [];\n\n switch (lastLightComplexity) {\n case 0:\n // no lighting or RENDER_VALUES\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Light::Impl', [' gl_FragData[0] = vec4(ambientColor * ambient + diffuseColor * diffuse, opacity);', ' //VTK::Light::Impl'], false).result;\n break;\n\n case 1:\n // headlight\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Light::Impl', [' float df = max(0.0, normalVCVSOutput.z);', ' float sf = pow(df, specularPower);', ' vec3 diffuseL = df * diffuseColor;', ' vec3 specularL = sf * specularColor;', ' gl_FragData[0] = vec4(ambientColor * ambient + diffuseL * diffuse + specularL * specular, opacity);', ' //VTK::Light::Impl'], false).result;\n break;\n\n case 2:\n // light kit\n for (var lc = 0; lc < lastLightCount; ++lc) {\n sstring = sstring.concat([\"uniform vec3 lightColor\".concat(lc, \";\"), \"uniform vec3 lightDirectionVC\".concat(lc, \"; // normalized\"), \"uniform vec3 lightHalfAngleVC\".concat(lc, \"; // normalized\")]);\n }\n\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Light::Dec', sstring).result;\n sstring = ['vec3 diffuseL = vec3(0,0,0);', ' vec3 specularL = vec3(0,0,0);', ' float df;'];\n\n for (var _lc = 0; _lc < lastLightCount; ++_lc) {\n sstring = sstring.concat([\" df = max(0.0, dot(normalVCVSOutput, -lightDirectionVC\".concat(_lc, \"));\"), \" diffuseL += ((df\".concat(shadowFactor, \") * lightColor\").concat(_lc, \");\"), \" if (dot(normalVCVSOutput, lightDirectionVC\".concat(_lc, \") < 0.0)\"), ' {', \" float sf = pow( max(0.0, dot(lightHalfAngleVC\".concat(_lc, \",normalVCVSOutput)), specularPower);\"), \" specularL += ((sf\".concat(shadowFactor, \") * lightColor\").concat(_lc, \");\"), ' }']);\n }\n\n sstring = sstring.concat([' diffuseL = diffuseL * diffuseColor;', ' specularL = specularL * specularColor;', ' gl_FragData[0] = vec4(ambientColor * ambient + diffuseL * diffuse + specularL * specular, opacity);', ' //VTK::Light::Impl']);\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Light::Impl', sstring, false).result;\n break;\n\n case 3:\n // positional\n for (var _lc2 = 0; _lc2 < lastLightCount; ++_lc2) {\n sstring = sstring.concat([\"uniform vec3 lightColor\".concat(_lc2, \";\"), \"uniform vec3 lightDirectionVC\".concat(_lc2, \"; // normalized\"), \"uniform vec3 lightHalfAngleVC\".concat(_lc2, \"; // normalized\"), \"uniform vec3 lightPositionVC\".concat(_lc2, \";\"), \"uniform vec3 lightAttenuation\".concat(_lc2, \";\"), \"uniform float lightConeAngle\".concat(_lc2, \";\"), \"uniform float lightExponent\".concat(_lc2, \";\"), \"uniform int lightPositional\".concat(_lc2, \";\")]);\n }\n\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Light::Dec', sstring).result;\n sstring = ['vec3 diffuseL = vec3(0,0,0);', ' vec3 specularL = vec3(0,0,0);', ' vec3 vertLightDirectionVC;', ' float attenuation;', ' float df;'];\n\n for (var _lc3 = 0; _lc3 < lastLightCount; ++_lc3) {\n sstring = sstring.concat([' attenuation = 1.0;', \" if (lightPositional\".concat(_lc3, \" == 0)\"), ' {', \" vertLightDirectionVC = lightDirectionVC\".concat(_lc3, \";\"), ' }', ' else', ' {', \" vertLightDirectionVC = vertexVC.xyz - lightPositionVC\".concat(_lc3, \";\"), ' float distanceVC = length(vertLightDirectionVC);', ' vertLightDirectionVC = normalize(vertLightDirectionVC);', ' attenuation = 1.0 /', \" (lightAttenuation\".concat(_lc3, \".x\"), \" + lightAttenuation\".concat(_lc3, \".y * distanceVC\"), \" + lightAttenuation\".concat(_lc3, \".z * distanceVC * distanceVC);\"), ' // per OpenGL standard cone angle is 90 or less for a spot light', \" if (lightConeAngle\".concat(_lc3, \" <= 90.0)\"), ' {', \" float coneDot = dot(vertLightDirectionVC, lightDirectionVC\".concat(_lc3, \");\"), ' // if inside the cone', \" if (coneDot >= cos(radians(lightConeAngle\".concat(_lc3, \")))\"), ' {', \" attenuation = attenuation * pow(coneDot, lightExponent\".concat(_lc3, \");\"), ' }', ' else', ' {', ' attenuation = 0.0;', ' }', ' }', ' }', ' df = max(0.0, attenuation*dot(normalVCVSOutput, -vertLightDirectionVC));', \" diffuseL += ((df\".concat(shadowFactor, \") * lightColor\").concat(_lc3, \");\"), ' if (dot(normalVCVSOutput, vertLightDirectionVC) < 0.0)', ' {', \" float sf = attenuation*pow( max(0.0, dot(lightHalfAngleVC\".concat(_lc3, \",normalVCVSOutput)), specularPower);\"), \" specularL += ((sf\".concat(shadowFactor, \") * lightColor\").concat(_lc3, \");\"), ' }']);\n }\n\n sstring = sstring.concat([' diffuseL = diffuseL * diffuseColor;', ' specularL = specularL * specularColor;', ' gl_FragData[0] = vec4(ambientColor * ambient + diffuseL * diffuse + specularL * specular, opacity);', ' //VTK::Light::Impl']);\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Light::Impl', sstring, false).result;\n break;\n\n default:\n vtkErrorMacro('bad light complexity');\n }\n\n shaders.Fragment = FSSource;\n };\n\n publicAPI.replaceShaderNormal = function (shaders, ren, actor) {\n var lastLightComplexity = model.lastBoundBO.getReferenceByName('lastLightComplexity');\n\n if (lastLightComplexity > 0) {\n var VSSource = shaders.Vertex;\n var GSSource = shaders.Geometry;\n var FSSource = shaders.Fragment;\n\n if (model.lastBoundBO.getCABO().getNormalOffset()) {\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::Normal::Dec', ['attribute vec3 normalMC;', 'uniform mat3 normalMatrix;', 'varying vec3 normalVCVSOutput;']).result;\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::Normal::Impl', ['normalVCVSOutput = normalMatrix * normalMC;']).result;\n GSSource = vtkShaderProgram.substitute(GSSource, '//VTK::Normal::Dec', ['in vec3 normalVCVSOutput[];', 'out vec3 normalVCGSOutput;']).result;\n GSSource = vtkShaderProgram.substitute(GSSource, '//VTK::Normal::Impl', ['normalVCGSOutput = normalVCVSOutput[i];']).result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Normal::Dec', ['varying vec3 normalVCVSOutput;']).result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Normal::Impl', ['vec3 normalVCVSOutput = normalize(normalVCVSOutput);', // if (!gl_FrontFacing) does not work in intel hd4000 mac\n // if (int(gl_FrontFacing) == 0) does not work on mesa\n ' if (gl_FrontFacing == false) { normalVCVSOutput = -normalVCVSOutput; }']).result;\n } else {\n if (model.haveCellNormals) {\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Normal::Dec', ['uniform mat3 normalMatrix;', 'uniform samplerBuffer textureN;']).result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Normal::Impl', ['vec3 normalVCVSOutput = normalize(normalMatrix *', ' texelFetchBuffer(textureN, gl_PrimitiveID + PrimitiveIDOffset).xyz);', ' if (gl_FrontFacing == false) { normalVCVSOutput = -normalVCVSOutput; }']).result;\n } else {\n if (model.lastBoundBO.getOpenGLMode(actor.getProperty().getRepresentation()) === model.context.LINES) {\n // generate a normal for lines, it will be perpendicular to the line\n // and maximally aligned with the camera view direction\n // no clue if this is the best way to do this.\n // the code below has been optimized a bit so what follows is\n // an explanation of the basic approach. Compute the gradient of the line\n // with respect to x and y, the the larger of the two\n // cross that with the camera view direction. That gives a vector\n // orthogonal to the camera view and the line. Note that the line and the camera\n // view are probably not orthogonal. Which is why when we cross result that with\n // the line gradient again we get a reasonable normal. It will be othogonal to\n // the line (which is a plane but maximally aligned with the camera view.\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::UniformFlow::Impl', [' vec3 fdx = dFdx(vertexVC.xyz);', ' vec3 fdy = dFdy(vertexVC.xyz);', ' //VTK::UniformFlow::Impl'] // For further replacements\n ).result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Normal::Impl', ['vec3 normalVCVSOutput;', ' if (abs(fdx.x) > 0.0)', ' { fdx = normalize(fdx); normalVCVSOutput = normalize(cross(vec3(fdx.y, -fdx.x, 0.0), fdx)); }', ' else { fdy = normalize(fdy); normalVCVSOutput = normalize(cross(vec3(fdy.y, -fdy.x, 0.0), fdy));}']).result;\n } else {\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Normal::Dec', ['uniform int cameraParallel;']).result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::UniformFlow::Impl', [// ' vec3 fdx = vec3(dFdx(vertexVC.x),dFdx(vertexVC.y),dFdx(vertexVC.z));',\n // ' vec3 fdy = vec3(dFdy(vertexVC.x),dFdy(vertexVC.y),dFdy(vertexVC.z));',\n ' vec3 fdx = dFdx(vertexVC.xyz);', ' vec3 fdy = dFdy(vertexVC.xyz);', ' //VTK::UniformFlow::Impl'] // For further replacements\n ).result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Normal::Impl', [' fdx = normalize(fdx);', ' fdy = normalize(fdy);', ' vec3 normalVCVSOutput = normalize(cross(fdx,fdy));', // the code below is faster, but does not work on some devices\n // 'vec3 normalVC = normalize(cross(dFdx(vertexVC.xyz), dFdy(vertexVC.xyz)));',\n ' if (cameraParallel == 1 && normalVCVSOutput.z < 0.0) { normalVCVSOutput = -1.0*normalVCVSOutput; }', ' if (cameraParallel == 0 && dot(normalVCVSOutput,vertexVC.xyz) > 0.0) { normalVCVSOutput = -1.0*normalVCVSOutput; }']).result;\n }\n }\n }\n\n shaders.Vertex = VSSource;\n shaders.Geometry = GSSource;\n shaders.Fragment = FSSource;\n }\n };\n\n publicAPI.replaceShaderPositionVC = function (shaders, ren, actor) {\n // replace common shader code\n model.lastBoundBO.replaceShaderPositionVC(shaders, ren, actor);\n var VSSource = shaders.Vertex;\n var GSSource = shaders.Geometry;\n var FSSource = shaders.Fragment; // do we need the vertex in the shader in View Coordinates\n\n var lastLightComplexity = model.lastBoundBO.getReferenceByName('lastLightComplexity');\n\n if (lastLightComplexity > 0) {\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::PositionVC::Dec', ['varying vec4 vertexVCVSOutput;']).result;\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::PositionVC::Impl', ['vertexVCVSOutput = MCVCMatrix * vertexMC;', ' gl_Position = MCPCMatrix * vertexMC;']).result;\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::Camera::Dec', ['uniform mat4 MCPCMatrix;', 'uniform mat4 MCVCMatrix;']).result;\n GSSource = vtkShaderProgram.substitute(GSSource, '//VTK::PositionVC::Dec', ['in vec4 vertexVCVSOutput[];', 'out vec4 vertexVCGSOutput;']).result;\n GSSource = vtkShaderProgram.substitute(GSSource, '//VTK::PositionVC::Impl', ['vertexVCGSOutput = vertexVCVSOutput[i];']).result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::PositionVC::Dec', ['varying vec4 vertexVCVSOutput;']).result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::PositionVC::Impl', ['vec4 vertexVC = vertexVCVSOutput;']).result;\n } else {\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::Camera::Dec', ['uniform mat4 MCPCMatrix;']).result;\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::PositionVC::Impl', [' gl_Position = MCPCMatrix * vertexMC;']).result;\n }\n\n shaders.Vertex = VSSource;\n shaders.Geometry = GSSource;\n shaders.Fragment = FSSource;\n };\n\n publicAPI.replaceShaderTCoord = function (shaders, ren, actor) {\n if (model.lastBoundBO.getCABO().getTCoordOffset()) {\n var VSSource = shaders.Vertex;\n var GSSource = shaders.Geometry;\n var FSSource = shaders.Fragment;\n\n if (model.drawingEdges) {\n return;\n }\n\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::TCoord::Impl', 'tcoordVCVSOutput = tcoordMC;').result; // we only handle the first texture by default\n // additional textures are activated and we set the uniform\n // for the texture unit they are assigned to, but you have to\n // add in the shader code to do something with them\n\n var tus = model.openGLActor.getActiveTextures();\n var tNumComp = 2;\n var tcdim = 2;\n\n if (tus && tus.length > 0) {\n tNumComp = tus[0].getComponents();\n\n if (tus[0].getTarget() === model.context.TEXTURE_CUBE_MAP) {\n tcdim = 3;\n }\n }\n\n if (model.renderable.getColorTextureMap()) {\n tNumComp = model.renderable.getColorTextureMap().getPointData().getScalars().getNumberOfComponents();\n tcdim = 2;\n }\n\n if (tcdim === 2) {\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::TCoord::Dec', 'attribute vec2 tcoordMC; varying vec2 tcoordVCVSOutput;').result;\n GSSource = vtkShaderProgram.substitute(GSSource, '//VTK::TCoord::Dec', ['in vec2 tcoordVCVSOutput[];', 'out vec2 tcoordVCGSOutput;']).result;\n GSSource = vtkShaderProgram.substitute(GSSource, '//VTK::TCoord::Impl', 'tcoordVCGSOutput = tcoordVCVSOutput[i];').result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::TCoord::Dec', ['varying vec2 tcoordVCVSOutput;', 'uniform sampler2D texture1;']).result;\n\n if (tus && tus.length >= 1) {\n switch (tNumComp) {\n case 1:\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::TCoord::Impl', [' vec4 tcolor = texture2D(texture1, tcoordVCVSOutput);', ' ambientColor = ambientColor*tcolor.r;', ' diffuseColor = diffuseColor*tcolor.r;']).result;\n break;\n\n case 2:\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::TCoord::Impl', [' vec4 tcolor = texture2D(texture1, tcoordVCVSOutput);', ' ambientColor = ambientColor*tcolor.r;', ' diffuseColor = diffuseColor*tcolor.r;', ' opacity = opacity * tcolor.g;']).result;\n break;\n\n default:\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::TCoord::Impl', [' vec4 tcolor = texture2D(texture1, tcoordVCVSOutput);', ' ambientColor = ambientColor*tcolor.rgb;', ' diffuseColor = diffuseColor*tcolor.rgb;', ' opacity = opacity * tcolor.a;']).result;\n }\n }\n } else {\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::TCoord::Dec', 'attribute vec3 tcoordMC; varying vec3 tcoordVCVSOutput;').result;\n GSSource = vtkShaderProgram.substitute(GSSource, '//VTK::TCoord::Dec', ['in vec3 tcoordVCVSOutput[];', 'out vec3 tcoordVCGSOutput;']).result;\n GSSource = vtkShaderProgram.substitute(GSSource, '//VTK::TCoord::Impl', 'tcoordVCGSOutput = tcoordVCVSOutput[i];').result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::TCoord::Dec', ['varying vec3 tcoordVCVSOutput;', 'uniform samplerCube texture1;']).result;\n\n switch (tNumComp) {\n case 1:\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::TCoord::Impl', [' vec4 tcolor = textureCube(texture1, tcoordVCVSOutput);', ' ambientColor = ambientColor*tcolor.r;', ' diffuseColor = diffuseColor*tcolor.r;']).result;\n break;\n\n case 2:\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::TCoord::Impl', [' vec4 tcolor = textureCube(texture1, tcoordVCVSOutput);', ' ambientColor = ambientColor*tcolor.r;', ' diffuseColor = diffuseColor*tcolor.r;', ' opacity = opacity * tcolor.g;']).result;\n break;\n\n default:\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::TCoord::Impl', [' vec4 tcolor = textureCube(texture1, tcoordVCVSOutput);', ' ambientColor = ambientColor*tcolor.rgb;', ' diffuseColor = diffuseColor*tcolor.rgb;', ' opacity = opacity * tcolor.a;']).result;\n }\n }\n\n shaders.Vertex = VSSource;\n shaders.Geometry = GSSource;\n shaders.Fragment = FSSource;\n }\n };\n\n publicAPI.replaceShaderClip = function (shaders, ren, actor) {\n var VSSource = shaders.Vertex;\n var FSSource = shaders.Fragment;\n\n if (model.renderable.getNumberOfClippingPlanes()) {\n var numClipPlanes = model.renderable.getNumberOfClippingPlanes();\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::Clip::Dec', ['uniform int numClipPlanes;', \"uniform vec4 clipPlanes[\".concat(numClipPlanes, \"];\"), \"varying float clipDistancesVSOutput[\".concat(numClipPlanes, \"];\")]).result;\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::Clip::Impl', [\"for (int planeNum = 0; planeNum < \".concat(numClipPlanes, \"; planeNum++)\"), ' {', ' if (planeNum >= numClipPlanes)', ' {', ' break;', ' }', ' clipDistancesVSOutput[planeNum] = dot(clipPlanes[planeNum], vertexMC);', ' }']).result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Clip::Dec', ['uniform int numClipPlanes;', \"varying float clipDistancesVSOutput[\".concat(numClipPlanes, \"];\")]).result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Clip::Impl', [\"for (int planeNum = 0; planeNum < \".concat(numClipPlanes, \"; planeNum++)\"), ' {', ' if (planeNum >= numClipPlanes)', ' {', ' break;', ' }', ' if (clipDistancesVSOutput[planeNum] < 0.0) discard;', ' }']).result;\n }\n\n shaders.Vertex = VSSource;\n shaders.Fragment = FSSource;\n };\n\n publicAPI.getCoincidentParameters = function (ren, actor) {\n // 1. ResolveCoincidentTopology is On and non zero for this primitive\n // type\n var cp = {\n factor: 0.0,\n offset: 0.0\n };\n var prop = actor.getProperty();\n\n if (model.renderable.getResolveCoincidentTopology() || prop.getEdgeVisibility() && prop.getRepresentation() === Representation.SURFACE) {\n var primType = model.lastBoundBO.getPrimitiveType();\n\n if (primType === primTypes.Points || prop.getRepresentation() === Representation.POINTS) {\n cp = model.renderable.getCoincidentTopologyPointOffsetParameter();\n } else if (primType === primTypes.Lines || prop.getRepresentation() === Representation.WIREFRAME) {\n cp = model.renderable.getCoincidentTopologyLineOffsetParameters();\n } else if (primType === primTypes.Tris || primType === primTypes.TriStrips) {\n cp = model.renderable.getCoincidentTopologyPolygonOffsetParameters();\n }\n\n if (primType === primTypes.TrisEdges || primType === primTypes.TriStripsEdges) {\n cp = model.renderable.getCoincidentTopologyPolygonOffsetParameters();\n cp.factor /= 2.0;\n cp.offset /= 2.0;\n }\n } // hardware picking always offset due to saved zbuffer\n // This gets you above the saved surface depth buffer.\n\n\n var selector = model._openGLRenderer.getSelector();\n\n if (selector && selector.getFieldAssociation() === FieldAssociations.FIELD_ASSOCIATION_POINTS) {\n cp.offset -= 2.0;\n }\n\n return cp;\n };\n\n publicAPI.replaceShaderPicking = function (shaders, ren, actor) {\n var FSSource = shaders.Fragment;\n var VSSource = shaders.Vertex;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Picking::Dec', ['uniform int picking;', '//VTK::Picking::Dec']).result;\n\n if (!model._openGLRenderer.getSelector()) {\n return;\n }\n\n if (model.lastSelectionState === PassTypes.ID_LOW24 || model.lastSelectionState === PassTypes.ID_HIGH24) {\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::Picking::Dec', ['flat out int vertexIDVSOutput;\\n', 'uniform int VertexIDOffset;\\n']).result;\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::Picking::Impl', ' vertexIDVSOutput = gl_VertexID + VertexIDOffset;\\n').result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Picking::Dec', 'flat in int vertexIDVSOutput;\\n').result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Picking::Impl', [' int idx = vertexIDVSOutput;', '//VTK::Picking::Impl']).result;\n }\n\n switch (model.lastSelectionState) {\n case PassTypes.ID_LOW24:\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Picking::Impl', ' gl_FragData[0] = vec4(float(idx%256)/255.0, float((idx/256)%256)/255.0, float((idx/65536)%256)/255.0, 1.0);').result;\n break;\n\n case PassTypes.ID_HIGH24:\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Picking::Impl', ' gl_FragData[0] = vec4(float(idx)/255.0, 0.0, 0.0, 1.0);').result;\n break;\n\n default:\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Picking::Dec', 'uniform vec3 mapperIndex;').result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Picking::Impl', ' gl_FragData[0] = picking != 0 ? vec4(mapperIndex,1.0) : gl_FragData[0];').result;\n }\n\n shaders.Fragment = FSSource;\n shaders.Vertex = VSSource;\n };\n\n publicAPI.replaceShaderValues = function (shaders, ren, actor) {\n publicAPI.replaceShaderColor(shaders, ren, actor);\n publicAPI.replaceShaderNormal(shaders, ren, actor);\n publicAPI.replaceShaderLight(shaders, ren, actor);\n publicAPI.replaceShaderTCoord(shaders, ren, actor);\n publicAPI.replaceShaderPicking(shaders, ren, actor);\n publicAPI.replaceShaderClip(shaders, ren, actor);\n publicAPI.replaceShaderCoincidentOffset(shaders, ren, actor);\n publicAPI.replaceShaderPositionVC(shaders, ren, actor);\n\n if (model.haveSeenDepthRequest) {\n var FSSource = shaders.Fragment;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::ZBuffer::Dec', 'uniform int depthRequest;').result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::ZBuffer::Impl', ['if (depthRequest == 1) {', 'float iz = floor(gl_FragCoord.z*65535.0 + 0.1);', 'float rf = floor(iz/256.0)/255.0;', 'float gf = mod(iz,256.0)/255.0;', 'gl_FragData[0] = vec4(rf, gf, 0.0, 1.0); }']).result;\n shaders.Fragment = FSSource;\n }\n };\n\n publicAPI.getNeedToRebuildShaders = function (cellBO, ren, actor) {\n var lightComplexity = 0;\n var numberOfLights = 0;\n var primType = cellBO.getPrimitiveType();\n var poly = model.currentInput; // different algo from C++ as of 5/2019\n\n var needLighting = false;\n var pointNormals = poly.getPointData().getNormals();\n var cellNormals = poly.getCellData().getNormals();\n var flat = actor.getProperty().getInterpolation() === Shading.FLAT;\n var representation = actor.getProperty().getRepresentation();\n var mode = cellBO.getOpenGLMode(representation, primType); // 1) all surfaces need lighting\n\n if (mode === model.context.TRIANGLES) {\n needLighting = true; // 2) all cell normals without point normals need lighting\n } else if (cellNormals && !pointNormals) {\n needLighting = true; // 3) Phong + pointNormals need lighting\n } else if (!flat && pointNormals) {\n needLighting = true; // 4) Phong Lines need lighting\n } else if (!flat && mode === model.context.LINES) {\n needLighting = true;\n } // 5) everything else is unlit\n // do we need lighting?\n\n\n if (actor.getProperty().getLighting() && needLighting) {\n // consider the lighting complexity to determine which case applies\n // simple headlight, Light Kit, the whole feature set of VTK\n lightComplexity = 0;\n var lights = ren.getLightsByReference();\n\n for (var index = 0; index < lights.length; ++index) {\n var light = lights[index];\n var status = light.getSwitch();\n\n if (status > 0) {\n numberOfLights++;\n\n if (lightComplexity === 0) {\n lightComplexity = 1;\n }\n }\n\n if (lightComplexity === 1 && (numberOfLights > 1 || light.getIntensity() !== 1.0 || !light.lightTypeIsHeadLight())) {\n lightComplexity = 2;\n }\n\n if (lightComplexity < 3 && light.getPositional()) {\n lightComplexity = 3;\n }\n }\n }\n\n var needRebuild = false;\n var lastLightComplexity = model.lastBoundBO.getReferenceByName('lastLightComplexity');\n var lastLightCount = model.lastBoundBO.getReferenceByName('lastLightCount');\n\n if (lastLightComplexity !== lightComplexity || lastLightCount !== numberOfLights) {\n model.lastBoundBO.set({\n lastLightComplexity: lightComplexity\n }, true);\n model.lastBoundBO.set({\n lastLightCount: numberOfLights\n }, true);\n needRebuild = true;\n } // has the render pass shader replacement changed? Two options\n\n\n if (!model.currentRenderPass && model.lastRenderPassShaderReplacement || model.currentRenderPass && model.currentRenderPass.getShaderReplacement() !== model.lastRenderPassShaderReplacement) {\n needRebuild = true;\n } // has something changed that would require us to recreate the shader?\n // candidates are\n // property modified (representation interpolation and lighting)\n // input modified\n // light complexity changed\n // render pass shader replacement changed\n\n\n if (model.lastHaveSeenDepthRequest !== model.haveSeenDepthRequest || cellBO.getShaderSourceTime().getMTime() < model.renderable.getMTime() || cellBO.getShaderSourceTime().getMTime() < model.currentInput.getMTime() || cellBO.getShaderSourceTime().getMTime() < model.selectionStateChanged.getMTime() || needRebuild) {\n model.lastHaveSeenDepthRequest = model.haveSeenDepthRequest;\n return true;\n }\n\n return false;\n };\n\n publicAPI.invokeShaderCallbacks = function (cellBO, ren, actor) {\n var listCallbacks = model.renderable.getViewSpecificProperties().ShadersCallbacks;\n\n if (listCallbacks) {\n listCallbacks.forEach(function (object) {\n object.callback(object.userData, cellBO, ren, actor);\n });\n }\n };\n\n publicAPI.setMapperShaderParameters = function (cellBO, ren, actor) {\n // Now to update the VAO too, if necessary.\n if (cellBO.getProgram().isUniformUsed('PrimitiveIDOffset')) {\n cellBO.getProgram().setUniformi('PrimitiveIDOffset', model.primitiveIDOffset);\n }\n\n if (cellBO.getProgram().isUniformUsed('VertexIDOffset')) {\n cellBO.getProgram().setUniformi('VertexIDOffset', model.vertexIDOffset);\n }\n\n if (cellBO.getCABO().getElementCount() && (model.VBOBuildTime.getMTime() > cellBO.getAttributeUpdateTime().getMTime() || cellBO.getShaderSourceTime().getMTime() > cellBO.getAttributeUpdateTime().getMTime())) {\n var lastLightComplexity = model.lastBoundBO.getReferenceByName('lastLightComplexity');\n\n if (cellBO.getProgram().isAttributeUsed('vertexMC')) {\n if (!cellBO.getVAO().addAttributeArray(cellBO.getProgram(), cellBO.getCABO(), 'vertexMC', cellBO.getCABO().getVertexOffset(), cellBO.getCABO().getStride(), model.context.FLOAT, 3, false)) {\n vtkErrorMacro('Error setting vertexMC in shader VAO.');\n }\n }\n\n if (cellBO.getProgram().isAttributeUsed('normalMC') && cellBO.getCABO().getNormalOffset() && lastLightComplexity > 0) {\n if (!cellBO.getVAO().addAttributeArray(cellBO.getProgram(), cellBO.getCABO(), 'normalMC', cellBO.getCABO().getNormalOffset(), cellBO.getCABO().getStride(), model.context.FLOAT, 3, false)) {\n vtkErrorMacro('Error setting normalMC in shader VAO.');\n }\n } else {\n cellBO.getVAO().removeAttributeArray('normalMC');\n }\n\n model.renderable.getCustomShaderAttributes().forEach(function (attrName, idx) {\n if (cellBO.getProgram().isAttributeUsed(\"\".concat(attrName, \"MC\"))) {\n if (!cellBO.getVAO().addAttributeArray(cellBO.getProgram(), cellBO.getCABO(), \"\".concat(attrName, \"MC\"), cellBO.getCABO().getCustomData()[idx].offset, cellBO.getCABO().getStride(), model.context.FLOAT, cellBO.getCABO().getCustomData()[idx].components, false)) {\n vtkErrorMacro(\"Error setting \".concat(attrName, \"MC in shader VAO.\"));\n }\n }\n });\n\n if (cellBO.getProgram().isAttributeUsed('tcoordMC') && cellBO.getCABO().getTCoordOffset()) {\n if (!cellBO.getVAO().addAttributeArray(cellBO.getProgram(), cellBO.getCABO(), 'tcoordMC', cellBO.getCABO().getTCoordOffset(), cellBO.getCABO().getStride(), model.context.FLOAT, cellBO.getCABO().getTCoordComponents(), false)) {\n vtkErrorMacro('Error setting tcoordMC in shader VAO.');\n }\n } else {\n cellBO.getVAO().removeAttributeArray('tcoordMC');\n }\n\n if (cellBO.getProgram().isAttributeUsed('scalarColor') && cellBO.getCABO().getColorComponents()) {\n if (!cellBO.getVAO().addAttributeArray(cellBO.getProgram(), cellBO.getCABO().getColorBO(), 'scalarColor', cellBO.getCABO().getColorOffset(), cellBO.getCABO().getColorBOStride(), model.context.UNSIGNED_BYTE, 4, true)) {\n vtkErrorMacro('Error setting scalarColor in shader VAO.');\n }\n } else {\n cellBO.getVAO().removeAttributeArray('scalarColor');\n }\n\n cellBO.getAttributeUpdateTime().modified();\n }\n\n if (model.renderable.getNumberOfClippingPlanes()) {\n // add all the clipping planes\n var numClipPlanes = model.renderable.getNumberOfClippingPlanes();\n var planeEquations = [];\n var shiftScaleEnabled = cellBO.getCABO().getCoordShiftAndScaleEnabled();\n var inverseShiftScaleMatrix = shiftScaleEnabled ? cellBO.getCABO().getInverseShiftAndScaleMatrix() : null;\n var mat = inverseShiftScaleMatrix ? mat4.copy(model.tmpMat4, actor.getMatrix()) : actor.getMatrix();\n\n if (inverseShiftScaleMatrix) {\n mat4.transpose(mat, mat);\n mat4.multiply(mat, mat, inverseShiftScaleMatrix);\n mat4.transpose(mat, mat);\n }\n\n for (var i = 0; i < numClipPlanes; i++) {\n var planeEquation = [];\n model.renderable.getClippingPlaneInDataCoords(mat, i, planeEquation);\n\n for (var j = 0; j < 4; j++) {\n planeEquations.push(planeEquation[j]);\n }\n }\n\n cellBO.getProgram().setUniformi('numClipPlanes', numClipPlanes);\n cellBO.getProgram().setUniform4fv('clipPlanes', planeEquations);\n }\n\n if (model.internalColorTexture && cellBO.getProgram().isUniformUsed('texture1')) {\n cellBO.getProgram().setUniformi('texture1', model.internalColorTexture.getTextureUnit());\n }\n\n var tus = model.openGLActor.getActiveTextures();\n\n if (tus) {\n for (var index = 0; index < tus.length; ++index) {\n var tex = tus[index];\n var texUnit = tex.getTextureUnit();\n var tname = \"texture\".concat(texUnit + 1);\n\n if (cellBO.getProgram().isUniformUsed(tname)) {\n cellBO.getProgram().setUniformi(tname, texUnit);\n }\n }\n } // handle depth requests\n\n\n if (model.haveSeenDepthRequest) {\n cellBO.getProgram().setUniformi('depthRequest', model.renderDepth ? 1 : 0);\n } // handle coincident\n\n\n if (cellBO.getProgram().isUniformUsed('coffset')) {\n var cp = publicAPI.getCoincidentParameters(ren, actor);\n cellBO.getProgram().setUniformf('coffset', cp.offset); // cfactor isn't always used when coffset is.\n\n if (cellBO.getProgram().isUniformUsed('cfactor')) {\n cellBO.getProgram().setUniformf('cfactor', cp.factor);\n }\n } // handle wide lines\n\n\n cellBO.setMapperShaderParameters(ren, actor, model._openGLRenderer.getTiledSizeAndOrigin());\n\n var selector = model._openGLRenderer.getSelector();\n\n cellBO.getProgram().setUniform3fArray('mapperIndex', selector ? selector.getPropColorValue() : [0.0, 0.0, 0.0]);\n cellBO.getProgram().setUniformi('picking', selector ? selector.getCurrentPass() + 1 : 0);\n };\n\n publicAPI.setLightingShaderParameters = function (cellBO, ren, actor) {\n // for unlit and headlight there are no lighting parameters\n var lastLightComplexity = model.lastBoundBO.getReferenceByName('lastLightComplexity');\n\n if (lastLightComplexity < 2) {\n return;\n }\n\n var program = cellBO.getProgram(); // bind some light settings\n\n var numberOfLights = 0;\n var lights = ren.getLightsByReference();\n\n for (var index = 0; index < lights.length; ++index) {\n var light = lights[index];\n var status = light.getSwitch();\n\n if (status > 0.0) {\n var dColor = light.getColorByReference();\n var intensity = light.getIntensity();\n model.lightColor[0] = dColor[0] * intensity;\n model.lightColor[1] = dColor[1] * intensity;\n model.lightColor[2] = dColor[2] * intensity; // get required info from light\n\n var ld = light.getDirection();\n var transform = ren.getActiveCamera().getViewMatrix();\n\n var newLightDirection = _toConsumableArray(ld);\n\n if (light.lightTypeIsSceneLight()) {\n newLightDirection[0] = transform[0] * ld[0] + transform[1] * ld[1] + transform[2] * ld[2];\n newLightDirection[1] = transform[4] * ld[0] + transform[5] * ld[1] + transform[6] * ld[2];\n newLightDirection[2] = transform[8] * ld[0] + transform[9] * ld[1] + transform[10] * ld[2];\n normalize(newLightDirection);\n }\n\n model.lightDirection[0] = newLightDirection[0];\n model.lightDirection[1] = newLightDirection[1];\n model.lightDirection[2] = newLightDirection[2];\n model.lightHalfAngle[0] = -model.lightDirection[0];\n model.lightHalfAngle[1] = -model.lightDirection[1];\n model.lightHalfAngle[2] = -model.lightDirection[2] + 1.0;\n normalize(model.lightDirection);\n program.setUniform3fArray(\"lightColor\".concat(numberOfLights), model.lightColor);\n program.setUniform3fArray(\"lightDirectionVC\".concat(numberOfLights), model.lightDirection);\n program.setUniform3fArray(\"lightHalfAngleVC\".concat(numberOfLights), model.lightHalfAngle);\n numberOfLights++;\n }\n } // we are done unless we have positional lights\n\n\n if (lastLightComplexity < 3) {\n return;\n } // for lightkit case there are some parameters to set\n\n\n var cam = ren.getActiveCamera();\n var viewTF = cam.getViewMatrix();\n mat4.transpose(viewTF, viewTF);\n numberOfLights = 0;\n\n for (var _index = 0; _index < lights.length; ++_index) {\n var _light = lights[_index];\n\n var _status = _light.getSwitch();\n\n if (_status > 0.0) {\n var lp = _light.getTransformedPosition();\n\n var np = new Float64Array(3);\n vec3.transformMat4(np, lp, viewTF);\n program.setUniform3fArray(\"lightAttenuation\".concat(numberOfLights), _light.getAttenuationValuesByReference());\n program.setUniformi(\"lightPositional\".concat(numberOfLights), _light.getPositional());\n program.setUniformf(\"lightExponent\".concat(numberOfLights), _light.getExponent());\n program.setUniformf(\"lightConeAngle\".concat(numberOfLights), _light.getConeAngle());\n program.setUniform3fArray(\"lightPositionVC\".concat(numberOfLights), [np[0], np[1], np[2]]);\n numberOfLights++;\n }\n }\n };\n\n function safeMatrixMultiply(matrixArray, matrixType, tmpMat) {\n matrixType.identity(tmpMat);\n return matrixArray.reduce(function (res, matrix, index) {\n if (index === 0) {\n return matrix ? matrixType.copy(res, matrix) : matrixType.identity(res);\n }\n\n return matrix ? matrixType.multiply(res, res, matrix) : res;\n }, tmpMat);\n }\n\n publicAPI.setCameraShaderParameters = function (cellBO, ren, actor) {\n var program = cellBO.getProgram(); // [WMVP]C == {world, model, view, projection} coordinates\n // E.g., WCPC == world to projection coordinate transformation\n\n var keyMats = model.openGLCamera.getKeyMatrices(ren);\n var cam = ren.getActiveCamera();\n var camm = model.openGLCamera.getKeyMatrixTime().getMTime();\n var progm = program.getLastCameraMTime();\n var shiftScaleEnabled = cellBO.getCABO().getCoordShiftAndScaleEnabled();\n var inverseShiftScaleMatrix = shiftScaleEnabled ? cellBO.getCABO().getInverseShiftAndScaleMatrix() : null;\n var actorIsIdentity = actor.getIsIdentity();\n var actMats = actorIsIdentity ? {\n mcwc: null,\n normalMatrix: null\n } : model.openGLActor.getKeyMatrices();\n\n if (actor.getCoordinateSystem() === CoordinateSystem.DISPLAY) {\n var size = model._openGLRenderer.getTiledSizeAndOrigin();\n\n mat4.identity(model.tmpMat4);\n model.tmpMat4[0] = 2.0 / size.usize;\n model.tmpMat4[12] = -1.0;\n model.tmpMat4[5] = 2.0 / size.vsize;\n model.tmpMat4[13] = -1.0;\n mat4.multiply(model.tmpMat4, model.tmpMat4, inverseShiftScaleMatrix);\n program.setUniformMatrix('MCPCMatrix', model.tmpMat4);\n } else {\n program.setUniformMatrix('MCPCMatrix', safeMatrixMultiply([keyMats.wcpc, actMats.mcwc, inverseShiftScaleMatrix], mat4, model.tmpMat4));\n }\n\n if (program.isUniformUsed('MCVCMatrix')) {\n program.setUniformMatrix('MCVCMatrix', safeMatrixMultiply([keyMats.wcvc, actMats.mcwc, inverseShiftScaleMatrix], mat4, model.tmpMat4));\n }\n\n if (program.isUniformUsed('normalMatrix')) {\n program.setUniformMatrix3x3('normalMatrix', safeMatrixMultiply([keyMats.normalMatrix, actMats.normalMatrix], mat3, model.tmpMat3));\n }\n\n if (progm !== camm) {\n if (program.isUniformUsed('cameraParallel')) {\n program.setUniformi('cameraParallel', cam.getParallelProjection());\n }\n\n program.setLastCameraMTime(camm);\n }\n\n if (!actorIsIdentity) {\n // reset the cam mtime as actor modified the shader values\n program.setLastCameraMTime(0);\n }\n };\n\n publicAPI.setPropertyShaderParameters = function (cellBO, ren, actor) {\n var program = cellBO.getProgram();\n var ppty = actor.getProperty();\n var opacity = ppty.getOpacity();\n var aColor = model.drawingEdges ? ppty.getEdgeColorByReference() : ppty.getAmbientColorByReference();\n var dColor = model.drawingEdges ? ppty.getEdgeColorByReference() : ppty.getDiffuseColorByReference();\n var aIntensity = model.drawingEdges ? 1.0 : ppty.getAmbient();\n var dIntensity = model.drawingEdges ? 0.0 : ppty.getDiffuse();\n var sIntensity = model.drawingEdges ? 0.0 : ppty.getSpecular();\n var specularPower = ppty.getSpecularPower();\n program.setUniformf('opacityUniform', opacity);\n program.setUniform3fArray('ambientColorUniform', aColor);\n program.setUniform3fArray('diffuseColorUniform', dColor);\n program.setUniformf('ambient', aIntensity);\n program.setUniformf('diffuse', dIntensity); // we are done unless we have lighting\n\n var lastLightComplexity = model.lastBoundBO.getReferenceByName('lastLightComplexity');\n\n if (lastLightComplexity < 1) {\n return;\n }\n\n var sColor = ppty.getSpecularColorByReference();\n program.setUniform3fArray('specularColorUniform', sColor);\n program.setUniformf('specularPowerUniform', specularPower);\n program.setUniformf('specular', sIntensity); // now set the backface properties if we have them\n\n if (program.isUniformUsed('ambientIntensityBF')) {\n ppty = actor.getBackfaceProperty();\n opacity = ppty.getOpacity();\n aColor = ppty.getAmbientColor();\n aIntensity = ppty.getAmbient();\n dColor = ppty.getDiffuseColor();\n dIntensity = ppty.getDiffuse();\n sColor = ppty.getSpecularColor();\n sIntensity = ppty.getSpecular();\n program.setUniformf('ambientIntensityBF', aIntensity);\n program.setUniformf('diffuseIntensityBF', dIntensity);\n program.setUniformf('opacityUniformBF', opacity);\n program.setUniform3fArray('ambientColorUniformBF', aColor);\n program.setUniform3fArray('diffuseColorUniformBF', dColor); // we are done unless we have lighting\n\n if (lastLightComplexity < 1) {\n return;\n }\n\n program.setUniformf('specularIntensityBF', sIntensity);\n program.setUniform3fArray('specularColorUniformBF', sColor);\n program.setUniformf('specularPowerUniformBF', specularPower);\n }\n };\n\n publicAPI.updateMaximumPointCellIds = function (ren, actor) {\n var _model$selectionWebGL, _model$selectionWebGL2, _model$selectionWebGL3, _model$selectionWebGL4;\n\n var selector = model._openGLRenderer.getSelector();\n\n if (!selector) {\n return;\n }\n\n if ((_model$selectionWebGL = model.selectionWebGLIdsToVTKIds) !== null && _model$selectionWebGL !== void 0 && (_model$selectionWebGL2 = _model$selectionWebGL.points) !== null && _model$selectionWebGL2 !== void 0 && _model$selectionWebGL2.length) {\n var length = model.selectionWebGLIdsToVTKIds.points.length;\n selector.setMaximumPointId(length - 1);\n }\n\n if ((_model$selectionWebGL3 = model.selectionWebGLIdsToVTKIds) !== null && _model$selectionWebGL3 !== void 0 && (_model$selectionWebGL4 = _model$selectionWebGL3.cells) !== null && _model$selectionWebGL4 !== void 0 && _model$selectionWebGL4.length) {\n var _length = model.selectionWebGLIdsToVTKIds.cells.length;\n selector.setMaximumCellId(_length - 1);\n }\n\n var fieldAssociation = selector.getFieldAssociation();\n\n if (fieldAssociation === FieldAssociations.FIELD_ASSOCIATION_POINTS) {\n model.pointPicking = true;\n }\n };\n\n publicAPI.renderPieceStart = function (ren, actor) {\n model.primitiveIDOffset = 0;\n model.vertexIDOffset = 0;\n var picking = getPickState(model._openGLRenderer);\n\n if (model.lastSelectionState !== picking) {\n model.selectionStateChanged.modified();\n model.lastSelectionState = picking;\n }\n\n if (model._openGLRenderer.getSelector()) {\n switch (picking) {\n default:\n model._openGLRenderer.getSelector().renderProp(actor);\n\n }\n } // make sure the BOs are up to date\n\n\n publicAPI.updateBufferObjects(ren, actor); // If we are coloring by texture, then load the texture map.\n // Use Map as indicator, because texture hangs around.\n\n if (model.renderable.getColorTextureMap()) {\n model.internalColorTexture.activate();\n } // Bind the OpenGL, this is shared between the different primitive/cell types.\n\n\n model.lastBoundBO = null;\n };\n\n publicAPI.renderPieceDraw = function (ren, actor) {\n var representation = actor.getProperty().getRepresentation();\n var drawSurfaceWithEdges = actor.getProperty().getEdgeVisibility() && representation === Representation.SURFACE;\n\n var selector = model._openGLRenderer.getSelector(); // If we are picking points, we need to tell it to the helper\n\n\n var pointPicking = selector && selector.getFieldAssociation() === FieldAssociations.FIELD_ASSOCIATION_POINTS && (model.lastSelectionState === PassTypes.ID_LOW24 || model.lastSelectionState === PassTypes.ID_HIGH24); // for every primitive type\n\n for (var i = primTypes.Start; i < primTypes.End; i++) {\n model.primitives[i].setPointPicking(pointPicking);\n var cabo = model.primitives[i].getCABO();\n\n if (cabo.getElementCount()) {\n // are we drawing edges\n model.drawingEdges = drawSurfaceWithEdges && (i === primTypes.TrisEdges || i === primTypes.TriStripsEdges); // don't draw edges when rendering depth or rendering for picking\n\n if (!model.drawingEdges || !(model.renderDepth || model.lastSelectionState >= 0)) {\n model.lastBoundBO = model.primitives[i];\n model.primitiveIDOffset += model.primitives[i].drawArrays(ren, actor, representation, publicAPI);\n model.vertexIDOffset += model.primitives[i].getCABO().getElementCount();\n }\n }\n }\n };\n\n publicAPI.renderPieceFinish = function (ren, actor) {\n if (model.LastBoundBO) {\n model.LastBoundBO.getVAO().release();\n }\n\n if (model.renderable.getColorTextureMap()) {\n model.internalColorTexture.deactivate();\n }\n };\n\n publicAPI.renderPiece = function (ren, actor) {\n // Make sure that we have been properly initialized.\n // if (ren.getRenderWindow().checkAbortStatus()) {\n // return;\n // }\n publicAPI.invokeEvent(StartEvent);\n\n if (!model.renderable.getStatic()) {\n model.renderable.update();\n }\n\n model.currentInput = model.renderable.getInputData();\n publicAPI.invokeEvent(EndEvent);\n\n if (!model.currentInput) {\n vtkErrorMacro('No input!');\n return;\n } // if there are no points then we are done\n\n\n if (!model.currentInput.getPoints || !model.currentInput.getPoints().getNumberOfValues()) {\n return;\n } // apply faceCulling\n\n\n var gl = model.context;\n var backfaceCulling = actor.getProperty().getBackfaceCulling();\n var frontfaceCulling = actor.getProperty().getFrontfaceCulling();\n\n if (!backfaceCulling && !frontfaceCulling) {\n model._openGLRenderWindow.disableCullFace();\n } else if (frontfaceCulling) {\n model._openGLRenderWindow.enableCullFace();\n\n gl.cullFace(gl.FRONT);\n } else {\n model._openGLRenderWindow.enableCullFace();\n\n gl.cullFace(gl.BACK);\n }\n\n publicAPI.renderPieceStart(ren, actor);\n publicAPI.renderPieceDraw(ren, actor);\n publicAPI.renderPieceFinish(ren, actor);\n };\n\n publicAPI.computeBounds = function (ren, actor) {\n if (!publicAPI.getInput()) {\n uninitializeBounds(model.bounds);\n return;\n }\n\n model.bounds = publicAPI.getInput().getBounds();\n };\n\n publicAPI.updateBufferObjects = function (ren, actor) {\n // Rebuild buffers if needed\n if (publicAPI.getNeedToRebuildBufferObjects(ren, actor)) {\n publicAPI.buildBufferObjects(ren, actor);\n }\n };\n\n publicAPI.getNeedToRebuildBufferObjects = function (ren, actor) {\n // first do a coarse check\n // Note that the actor's mtime includes it's properties mtime\n var vmtime = model.VBOBuildTime.getMTime();\n\n if (vmtime < publicAPI.getMTime() || vmtime < model.renderable.getMTime() || vmtime < actor.getMTime() || vmtime < model.currentInput.getMTime()) {\n return true;\n }\n\n return false;\n };\n\n publicAPI.buildBufferObjects = function (ren, actor) {\n var poly = model.currentInput;\n\n if (poly === null) {\n return;\n }\n\n model.renderable.mapScalars(poly, 1.0);\n var c = model.renderable.getColorMapColors();\n model.haveCellScalars = false;\n var scalarMode = model.renderable.getScalarMode();\n\n if (model.renderable.getScalarVisibility()) {\n // We must figure out how the scalars should be mapped to the polydata.\n if ((scalarMode === ScalarMode.USE_CELL_DATA || scalarMode === ScalarMode.USE_CELL_FIELD_DATA || scalarMode === ScalarMode.USE_FIELD_DATA || !poly.getPointData().getScalars()) && scalarMode !== ScalarMode.USE_POINT_FIELD_DATA && c) {\n model.haveCellScalars = true;\n }\n } // Do we have normals?\n\n\n var n = actor.getProperty().getInterpolation() !== Shading.FLAT ? poly.getPointData().getNormals() : null;\n\n if (n === null && poly.getCellData().getNormals()) {\n model.haveCellNormals = true;\n n = poly.getCellData().getNormals();\n } // rebuild the VBO if the data has changed we create a string for the VBO what\n // can change the VBO? points normals tcoords colors so what can change those?\n // the input data is clearly one as it can change all four items tcoords may\n // haveTextures or not colors may change based on quite a few mapping\n // parameters in the mapper\n\n\n var representation = actor.getProperty().getRepresentation();\n var tcoords = poly.getPointData().getTCoords();\n\n if (!model.openGLActor.getActiveTextures()) {\n tcoords = null;\n } // handle color mapping via texture\n\n\n if (model.renderable.getColorCoordinates()) {\n tcoords = model.renderable.getColorCoordinates();\n\n if (!model.internalColorTexture) {\n model.internalColorTexture = vtkOpenGLTexture.newInstance({\n resizable: true\n });\n }\n\n var tex = model.internalColorTexture; // the following 4 lines allow for NPOT textures\n\n tex.setMinificationFilter(Filter.NEAREST);\n tex.setMagnificationFilter(Filter.NEAREST);\n tex.setWrapS(Wrap.CLAMP_TO_EDGE);\n tex.setWrapT(Wrap.CLAMP_TO_EDGE);\n tex.setOpenGLRenderWindow(model._openGLRenderWindow);\n var input = model.renderable.getColorTextureMap();\n var ext = input.getExtent();\n var inScalars = input.getPointData().getScalars();\n tex.create2DFromRaw(ext[1] - ext[0] + 1, ext[3] - ext[2] + 1, inScalars.getNumberOfComponents(), inScalars.getDataType(), inScalars.getData());\n tex.activate();\n tex.sendParameters();\n tex.deactivate();\n }\n\n var toString = \"\".concat(poly.getMTime(), \"A\").concat(representation, \"B\").concat(poly.getMTime()) + \"C\".concat(n ? n.getMTime() : 1, \"D\").concat(c ? c.getMTime() : 1) + \"E\".concat(actor.getProperty().getEdgeVisibility()) + \"F\".concat(tcoords ? tcoords.getMTime() : 1);\n\n if (model.VBOBuildString !== toString) {\n // Build the VBOs\n var points = poly.getPoints();\n var options = {\n points: points,\n normals: n,\n tcoords: tcoords,\n colors: c,\n cellOffset: 0,\n vertexOffset: 0,\n // Used to keep track of vertex ids across primitives for selection\n haveCellScalars: model.haveCellScalars,\n haveCellNormals: model.haveCellNormals,\n customAttributes: model.renderable.getCustomShaderAttributes().map(function (arrayName) {\n return poly.getPointData().getArrayByName(arrayName);\n })\n };\n\n if (model.renderable.getPopulateSelectionSettings()) {\n model.selectionWebGLIdsToVTKIds = {\n points: null,\n cells: null\n };\n }\n\n var primitives = [{\n inRep: 'verts',\n cells: poly.getVerts()\n }, {\n inRep: 'lines',\n cells: poly.getLines()\n }, {\n inRep: 'polys',\n cells: poly.getPolys()\n }, {\n inRep: 'strips',\n cells: poly.getStrips()\n }, {\n inRep: 'polys',\n cells: poly.getPolys()\n }, {\n inRep: 'strips',\n cells: poly.getStrips()\n }];\n var drawSurfaceWithEdges = actor.getProperty().getEdgeVisibility() && representation === Representation.SURFACE;\n\n for (var i = primTypes.Start; i < primTypes.End; i++) {\n if (i !== primTypes.TrisEdges && i !== primTypes.TriStripsEdges) {\n options.cellOffset += model.primitives[i].getCABO().createVBO(primitives[i].cells, primitives[i].inRep, representation, options, model.selectionWebGLIdsToVTKIds);\n options.vertexOffset += model.primitives[i].getCABO().getElementCount();\n } else {\n // if we have edge visibility build the edge VBOs\n if (drawSurfaceWithEdges) {\n // VBOs for edges in \"surface with edges\" are the last to be built,\n // they are not used when picking with a hardware selector so they\n // don't need selectionWebGLIdsToVTKIds and don't update cellOffset and vertexOffset\n model.primitives[i].getCABO().createVBO(primitives[i].cells, primitives[i].inRep, Representation.WIREFRAME, _objectSpread(_objectSpread({}, options), {}, {\n tcoords: null,\n colors: null,\n haveCellScalars: false,\n haveCellNormals: false\n }));\n } else {\n // otherwise free them\n model.primitives[i].releaseGraphicsResources();\n }\n }\n }\n\n if (model.renderable.getPopulateSelectionSettings()) {\n model.renderable.setSelectionWebGLIdsToVTKIds(model.selectionWebGLIdsToVTKIds);\n publicAPI.updateMaximumPointCellIds();\n }\n\n model.VBOBuildTime.modified();\n model.VBOBuildString = toString;\n }\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n context: null,\n VBOBuildTime: 0,\n VBOBuildString: null,\n primitives: null,\n primTypes: null,\n shaderRebuildString: null,\n tmpMat4: null,\n ambientColor: [],\n // used internally\n diffuseColor: [],\n // used internally\n specularColor: [],\n // used internally\n lightColor: [],\n // used internally\n lightHalfAngle: [],\n // used internally\n lightDirection: [],\n // used internally\n lastHaveSeenDepthRequest: false,\n haveSeenDepthRequest: false,\n lastSelectionState: PassTypes.MIN_KNOWN_PASS - 1,\n selectionStateChanged: null,\n selectionWebGLIdsToVTKIds: null,\n pointPicking: false\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkViewNode.extend(publicAPI, model, initialValues);\n vtkReplacementShaderMapper.implementReplaceShaderCoincidentOffset(publicAPI, model, initialValues);\n vtkReplacementShaderMapper.implementBuildShadersWithReplacements(publicAPI, model, initialValues);\n model.primitives = [];\n model.primTypes = primTypes;\n model.tmpMat3 = mat3.identity(new Float64Array(9));\n model.tmpMat4 = mat4.identity(new Float64Array(16));\n\n for (var i = primTypes.Start; i < primTypes.End; i++) {\n model.primitives[i] = vtkHelper.newInstance();\n model.primitives[i].setPrimitiveType(i);\n model.primitives[i].set({\n lastLightComplexity: 0,\n lastLightCount: 0,\n lastSelectionPass: false\n }, true);\n } // Build VTK API\n\n\n setGet(publicAPI, model, ['context']);\n model.VBOBuildTime = {};\n obj(model.VBOBuildTime, {\n mtime: 0\n });\n model.selectionStateChanged = {};\n obj(model.selectionStateChanged, {\n mtime: 0\n }); // Object methods\n\n vtkOpenGLPolyDataMapper(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend, 'vtkOpenGLPolyDataMapper'); // ----------------------------------------------------------------------------\n\nvar vtkOpenGLPolyDataMapper$1 = {\n newInstance: newInstance,\n extend: extend\n}; // Register ourself to OpenGL backend if imported\n\nregisterOverride('vtkMapper', newInstance);\n\nexport { vtkOpenGLPolyDataMapper$1 as default, extend, newInstance };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport { mat3, mat4 } from 'gl-matrix';\nimport { newInstance as newInstance$1, obj, vtkErrorMacro as vtkErrorMacro$1 } from '../../macros.js';\nimport vtkBufferObject from './BufferObject.js';\nimport vtkHardwareSelector from './HardwareSelector.js';\nimport vtkProperty from '../Core/Property.js';\nimport vtkOpenGLPolyDataMapper from './PolyDataMapper.js';\nimport vtkShaderProgram from './ShaderProgram.js';\nimport { registerOverride } from './ViewNodeFactory.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nvar vtkErrorMacro = vtkErrorMacro$1;\nvar Representation = vtkProperty.Representation;\nvar ObjectType = vtkBufferObject.ObjectType;\nvar PassTypes = vtkHardwareSelector.PassTypes;\nvar StartEvent = {\n type: 'StartEvent'\n};\nvar EndEvent = {\n type: 'EndEvent'\n}; // ----------------------------------------------------------------------------\n// vtkOpenGLSphereMapper methods\n// ----------------------------------------------------------------------------\n\nfunction vtkOpenGLGlyph3DMapper(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkOpenGLGlyph3DMapper'); // Capture 'parentClass' api for internal use\n\n var superClass = _objectSpread({}, publicAPI);\n\n publicAPI.renderPiece = function (ren, actor) {\n publicAPI.invokeEvent(StartEvent);\n\n if (!model.renderable.getStatic()) {\n model.renderable.update();\n }\n\n model.currentInput = model.renderable.getInputData(1);\n publicAPI.invokeEvent(EndEvent);\n\n if (!model.currentInput) {\n vtkErrorMacro('No input!');\n return;\n } // if there are no points then we are done\n\n\n if (!model.currentInput.getPoints || !model.currentInput.getPoints().getNumberOfValues()) {\n return;\n } // apply faceCulling\n\n\n var gl = model.context;\n\n if (model._openGLRenderWindow.getWebgl2()) {\n model.hardwareSupport = true;\n model.extension = null;\n } else if (!model.extension) {\n model.extension = model.context.getExtension('ANGLE_instanced_arrays');\n model.hardwareSupport = !!model.extension;\n } // to test without extension support uncomment the next two lines\n // model.extension = null;\n // model.hardwareSupport = !!model.extension;\n\n\n var backfaceCulling = actor.getProperty().getBackfaceCulling();\n var frontfaceCulling = actor.getProperty().getFrontfaceCulling();\n\n if (!backfaceCulling && !frontfaceCulling) {\n model._openGLRenderWindow.disableCullFace();\n } else if (frontfaceCulling) {\n model._openGLRenderWindow.enableCullFace();\n\n gl.cullFace(gl.FRONT);\n } else {\n model._openGLRenderWindow.enableCullFace();\n\n gl.cullFace(gl.BACK);\n }\n\n publicAPI.renderPieceStart(ren, actor);\n publicAPI.renderPieceDraw(ren, actor);\n publicAPI.renderPieceFinish(ren, actor);\n };\n\n publicAPI.multiply4x4WithOffset = function (out, a, b, off) {\n var a00 = a[0];\n var a01 = a[1];\n var a02 = a[2];\n var a03 = a[3];\n var a10 = a[4];\n var a11 = a[5];\n var a12 = a[6];\n var a13 = a[7];\n var a20 = a[8];\n var a21 = a[9];\n var a22 = a[10];\n var a23 = a[11];\n var a30 = a[12];\n var a31 = a[13];\n var a32 = a[14];\n var a33 = a[15]; // Cache only the current line of the second matrix\n\n var b0 = b[off];\n var b1 = b[off + 1];\n var b2 = b[off + 2];\n var b3 = b[off + 3];\n out[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[off + 4];\n b1 = b[off + 5];\n b2 = b[off + 6];\n b3 = b[off + 7];\n out[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[off + 8];\n b1 = b[off + 9];\n b2 = b[off + 10];\n b3 = b[off + 11];\n out[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[off + 12];\n b1 = b[off + 13];\n b2 = b[off + 14];\n b3 = b[off + 15];\n out[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n };\n\n publicAPI.replaceShaderNormal = function (shaders, ren, actor) {\n if (model.hardwareSupport) {\n var lastLightComplexity = model.lastBoundBO.getReferenceByName('lastLightComplexity');\n\n if (lastLightComplexity > 0) {\n var VSSource = shaders.Vertex;\n\n if (model.lastBoundBO.getCABO().getNormalOffset()) {\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::Normal::Dec', ['attribute vec3 normalMC;', 'attribute mat3 gNormal;', 'uniform mat3 normalMatrix;', 'varying vec3 normalVCVSOutput;']).result;\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::Normal::Impl', ['normalVCVSOutput = normalMatrix * gNormal * normalMC;']).result;\n }\n\n shaders.Vertex = VSSource;\n }\n }\n\n superClass.replaceShaderNormal(shaders, ren, actor);\n };\n\n publicAPI.replaceShaderColor = function (shaders, ren, actor) {\n if (model.hardwareSupport && model.renderable.getColorArray()) {\n var VSSource = shaders.Vertex;\n var GSSource = shaders.Geometry;\n var FSSource = shaders.Fragment;\n var lastLightComplexity = model.lastBoundBO.getReferenceByName('lastLightComplexity'); // create the material/color property declarations, and VS implementation\n // these are always defined\n\n var colorDec = ['uniform float ambient;', 'uniform float diffuse;', 'uniform float specular;', 'uniform float opacityUniform; // the fragment opacity']; // add more for specular\n\n if (lastLightComplexity) {\n colorDec = colorDec.concat(['uniform vec3 specularColorUniform;', 'uniform float specularPowerUniform;']);\n } // now handle the more complex fragment shader implementation\n // the following are always defined variables. We start\n // by assigning a default value from the uniform\n\n\n var colorImpl = ['vec3 ambientColor;', ' vec3 diffuseColor;', ' float opacity;'];\n\n if (lastLightComplexity) {\n colorImpl = colorImpl.concat([' vec3 specularColor;', ' float specularPower;']);\n }\n\n colorImpl = colorImpl.concat([' opacity = opacityUniform;']);\n\n if (lastLightComplexity) {\n colorImpl = colorImpl.concat([' specularColor = specularColorUniform;', ' specularPower = specularPowerUniform;']);\n }\n\n if (!model.drawingEdges) {\n colorDec = colorDec.concat(['varying vec4 vertexColorVSOutput;']);\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::Color::Dec', ['attribute vec4 gColor;', 'varying vec4 vertexColorVSOutput;']).result;\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::Color::Impl', ['vertexColorVSOutput = gColor;']).result;\n GSSource = vtkShaderProgram.substitute(GSSource, '//VTK::Color::Dec', ['in vec4 vertexColorVSOutput[];', 'out vec4 vertexColorGSOutput;']).result;\n GSSource = vtkShaderProgram.substitute(GSSource, '//VTK::Color::Impl', ['vertexColorGSOutput = vertexColorVSOutput[i];']).result;\n colorImpl = colorImpl.concat([' diffuseColor = vertexColorVSOutput.rgb;', ' ambientColor = vertexColorVSOutput.rgb;', ' opacity = opacity*vertexColorVSOutput.a;']);\n }\n\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Color::Impl', colorImpl).result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Color::Dec', colorDec).result;\n shaders.Vertex = VSSource;\n shaders.Geometry = GSSource;\n shaders.Fragment = FSSource;\n }\n\n superClass.replaceShaderColor(shaders, ren, actor);\n };\n\n publicAPI.replaceShaderPositionVC = function (shaders, ren, actor) {\n if (model.hardwareSupport) {\n var VSSource = shaders.Vertex; // do we need the vertex in the shader in View Coordinates\n\n var lastLightComplexity = model.lastBoundBO.getReferenceByName('lastLightComplexity');\n\n if (lastLightComplexity > 0) {\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::PositionVC::Impl', ['vec4 gVertexMC = gMatrix * vertexMC;', 'vertexVCVSOutput = MCVCMatrix * gVertexMC;', ' gl_Position = MCPCMatrix * gVertexMC;']).result;\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::Camera::Dec', ['attribute mat4 gMatrix;', 'uniform mat4 MCPCMatrix;', 'uniform mat4 MCVCMatrix;']).result;\n } else {\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::Camera::Dec', ['attribute mat4 gMatrix;', 'uniform mat4 MCPCMatrix;']).result;\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::PositionVC::Impl', ['vec4 gVertexMC = gMatrix * vertexMC;', ' gl_Position = MCPCMatrix * gVertexMC;']).result;\n }\n\n shaders.Vertex = VSSource;\n }\n\n superClass.replaceShaderPositionVC(shaders, ren, actor);\n };\n\n publicAPI.replaceShaderPicking = function (shaders, ren, actor) {\n if (model.hardwareSupport) {\n var FSSource = shaders.Fragment;\n var VSSource = shaders.Vertex;\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::Picking::Dec', ['attribute vec3 mapperIndexVS;', 'varying vec3 mapperIndexVSOutput;']).result;\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::Picking::Impl', ' mapperIndexVSOutput = mapperIndexVS;').result;\n shaders.Vertex = VSSource;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Picking::Dec', ['varying vec3 mapperIndexVSOutput;', 'uniform vec3 mapperIndex;', 'uniform int picking;']).result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Picking::Impl', [' vec4 pickColor = picking == 2 ? vec4(mapperIndexVSOutput,1.0) : vec4(mapperIndex,1.0);', ' gl_FragData[0] = picking != 0 ? pickColor : gl_FragData[0];']).result;\n shaders.Fragment = FSSource;\n } else {\n superClass.replaceShaderPicking(shaders, ren, actor);\n }\n };\n\n publicAPI.updateGlyphShaderParameters = function (normalMatrixUsed, mcvcMatrixUsed, cellBO, carray, garray, narray, p, selector) {\n var program = cellBO.getProgram();\n\n if (normalMatrixUsed) {\n var a = model.normalMatrix;\n var b = narray;\n var ofs = p * 9;\n var out = model.tmpMat3;\n var a00 = a[0];\n var a01 = a[1];\n var a02 = a[2];\n var a10 = a[3];\n var a11 = a[4];\n var a12 = a[5];\n var a20 = a[6];\n var a21 = a[7];\n var a22 = a[8];\n var b00 = b[ofs];\n var b01 = b[ofs + 1];\n var b02 = b[ofs + 2];\n var b10 = b[ofs + 3];\n var b11 = b[ofs + 4];\n var b12 = b[ofs + 5];\n var b20 = b[ofs + 6];\n var b21 = b[ofs + 7];\n var b22 = b[ofs + 8];\n out[0] = b00 * a00 + b01 * a10 + b02 * a20;\n out[1] = b00 * a01 + b01 * a11 + b02 * a21;\n out[2] = b00 * a02 + b01 * a12 + b02 * a22;\n out[3] = b10 * a00 + b11 * a10 + b12 * a20;\n out[4] = b10 * a01 + b11 * a11 + b12 * a21;\n out[5] = b10 * a02 + b11 * a12 + b12 * a22;\n out[6] = b20 * a00 + b21 * a10 + b22 * a20;\n out[7] = b20 * a01 + b21 * a11 + b22 * a21;\n out[8] = b20 * a02 + b21 * a12 + b22 * a22;\n program.setUniformMatrix3x3('normalMatrix', model.tmpMat3);\n }\n\n publicAPI.multiply4x4WithOffset(model.tmpMat4, model.mcpcMatrix, garray, p * 16);\n program.setUniformMatrix('MCPCMatrix', model.tmpMat4);\n\n if (mcvcMatrixUsed) {\n publicAPI.multiply4x4WithOffset(model.tmpMat4, model.mcvcMatrix, garray, p * 16);\n program.setUniformMatrix('MCVCMatrix', model.tmpMat4);\n } // set color\n\n\n if (carray) {\n var cdata = carray.getData();\n model.tmpColor[0] = cdata[p * 4] / 255.0;\n model.tmpColor[1] = cdata[p * 4 + 1] / 255.0;\n model.tmpColor[2] = cdata[p * 4 + 2] / 255.0;\n program.setUniform3fArray('ambientColorUniform', model.tmpColor);\n program.setUniform3fArray('diffuseColorUniform', model.tmpColor);\n }\n\n if (selector) {\n program.setUniform3fArray('mapperIndex', selector.getPropColorValue());\n }\n };\n\n publicAPI.renderPieceDraw = function (ren, actor) {\n var representation = actor.getProperty().getRepresentation();\n var gl = model.context;\n var drawSurfaceWithEdges = actor.getProperty().getEdgeVisibility() && representation === Representation.SURFACE; // [WMVP]C == {world, model, view, projection} coordinates\n // E.g., WCPC == world to projection coordinate transformation\n\n var keyMats = model.openGLCamera.getKeyMatrices(ren);\n var actMats = model.openGLActor.getKeyMatrices(); // precompute the actor+camera mats once\n\n mat3.multiply(model.normalMatrix, keyMats.normalMatrix, actMats.normalMatrix);\n mat4.multiply(model.mcpcMatrix, keyMats.wcpc, actMats.mcwc);\n mat4.multiply(model.mcvcMatrix, keyMats.wcvc, actMats.mcwc);\n var garray = model.renderable.getMatrixArray();\n var narray = model.renderable.getNormalArray();\n var carray = model.renderable.getColorArray();\n var numPts = garray.length / 16;\n var compositePass = false;\n\n if (model._openGLRenderer.getSelector()) {\n if (model._openGLRenderer.getSelector().getCurrentPass() === PassTypes.COMPOSITE_INDEX_PASS) {\n compositePass = true;\n }\n } // for every primitive type\n\n\n for (var i = model.primTypes.Start; i < model.primTypes.End; i++) {\n // if there are entries\n var cabo = model.primitives[i].getCABO();\n\n if (cabo.getElementCount()) {\n // are we drawing edges\n model.drawingEdges = drawSurfaceWithEdges && (i === model.primTypes.TrisEdges || i === model.primTypes.TriStripsEdges);\n model.lastBoundBO = model.primitives[i];\n model.primitives[i].updateShaders(ren, actor, publicAPI);\n var program = model.primitives[i].getProgram();\n var mode = model.primitives[i].getOpenGLMode(representation);\n var normalMatrixUsed = program.isUniformUsed('normalMatrix');\n var mcvcMatrixUsed = program.isUniformUsed('MCVCMatrix');\n\n if (model.hardwareSupport) {\n if (model.extension) {\n model.extension.drawArraysInstancedANGLE(mode, 0, cabo.getElementCount(), numPts);\n } else {\n gl.drawArraysInstanced(mode, 0, cabo.getElementCount(), numPts);\n }\n } else {\n // draw the array multiple times with different cam matrix\n for (var p = 0; p < numPts; ++p) {\n if (compositePass) {\n model._openGLRenderer.getSelector().renderCompositeIndex(p);\n }\n\n publicAPI.updateGlyphShaderParameters(normalMatrixUsed, mcvcMatrixUsed, model.primitives[i], carray, garray, narray, p, compositePass ? model._openGLRenderer.getSelector() : null);\n gl.drawArrays(mode, 0, cabo.getElementCount());\n }\n }\n }\n }\n };\n\n publicAPI.setMapperShaderParameters = function (cellBO, ren, actor) {\n if (cellBO.getCABO().getElementCount() && (model.glyphBOBuildTime.getMTime() > cellBO.getAttributeUpdateTime().getMTime() || cellBO.getShaderSourceTime().getMTime() > cellBO.getAttributeUpdateTime().getMTime())) {\n if (cellBO.getProgram().isAttributeUsed('gMatrix')) {\n if (!cellBO.getVAO().addAttributeMatrixWithDivisor(cellBO.getProgram(), model.matrixBuffer, 'gMatrix', 0, 64, model.context.FLOAT, 4, false, 1)) {\n vtkErrorMacro('Error setting gMatrix in shader VAO.');\n }\n } else {\n cellBO.getVAO().removeAttributeArray('gMatrix');\n }\n\n if (cellBO.getProgram().isAttributeUsed('gNormal')) {\n if (!cellBO.getVAO().addAttributeMatrixWithDivisor(cellBO.getProgram(), model.normalBuffer, 'gNormal', 0, 36, model.context.FLOAT, 3, false, 1)) {\n vtkErrorMacro('Error setting gNormal in shader VAO.');\n }\n } else {\n cellBO.getVAO().removeAttributeArray('gNormal');\n }\n\n if (cellBO.getProgram().isAttributeUsed('gColor')) {\n if (!cellBO.getVAO().addAttributeArrayWithDivisor(cellBO.getProgram(), model.colorBuffer, 'gColor', 0, 4, model.context.UNSIGNED_BYTE, 4, true, 1, false)) {\n vtkErrorMacro('Error setting gColor in shader VAO.');\n }\n } else {\n cellBO.getVAO().removeAttributeArray('gColor');\n }\n\n if (cellBO.getProgram().isAttributeUsed('mapperIndexVS')) {\n if (!cellBO.getVAO().addAttributeArrayWithDivisor(cellBO.getProgram(), model.pickBuffer, 'mapperIndexVS', 0, 4, model.context.UNSIGNED_BYTE, 4, true, 1, false)) {\n vtkErrorMacro('Error setting mapperIndexVS in shader VAO.');\n }\n } else {\n cellBO.getVAO().removeAttributeArray('mapperIndexVS');\n }\n\n superClass.setMapperShaderParameters(cellBO, ren, actor);\n cellBO.getAttributeUpdateTime().modified();\n return;\n }\n\n superClass.setMapperShaderParameters(cellBO, ren, actor);\n };\n\n publicAPI.getNeedToRebuildBufferObjects = function (ren, actor) {\n model.renderable.buildArrays(); // first do a coarse check\n // Note that the actor's mtime includes it's properties mtime\n\n var vmtime = model.VBOBuildTime.getMTime();\n\n if (vmtime < model.renderable.getBuildTime().getMTime()) {\n return true;\n }\n\n return superClass.getNeedToRebuildBufferObjects(ren, actor);\n };\n\n publicAPI.getNeedToRebuildShaders = function (cellBO, ren, actor) {\n if (superClass.getNeedToRebuildShaders(cellBO, ren, actor) || cellBO.getShaderSourceTime().getMTime() < model.renderable.getMTime() || cellBO.getShaderSourceTime().getMTime() < model.currentInput.getMTime()) {\n return true;\n }\n\n return false;\n };\n\n publicAPI.buildBufferObjects = function (ren, actor) {\n if (model.hardwareSupport) {\n // update the buffer objects if needed\n var garray = model.renderable.getMatrixArray();\n var narray = model.renderable.getNormalArray();\n var carray = model.renderable.getColorArray();\n\n if (!model.matrixBuffer) {\n model.matrixBuffer = vtkBufferObject.newInstance();\n model.matrixBuffer.setOpenGLRenderWindow(model._openGLRenderWindow);\n model.normalBuffer = vtkBufferObject.newInstance();\n model.normalBuffer.setOpenGLRenderWindow(model._openGLRenderWindow);\n model.colorBuffer = vtkBufferObject.newInstance();\n model.colorBuffer.setOpenGLRenderWindow(model._openGLRenderWindow);\n model.pickBuffer = vtkBufferObject.newInstance();\n model.pickBuffer.setOpenGLRenderWindow(model._openGLRenderWindow);\n }\n\n if (model.renderable.getBuildTime().getMTime() > model.glyphBOBuildTime.getMTime()) {\n model.matrixBuffer.upload(garray, ObjectType.ARRAY_BUFFER);\n model.normalBuffer.upload(narray, ObjectType.ARRAY_BUFFER);\n\n if (carray) {\n model.colorBuffer.upload(carray.getData(), ObjectType.ARRAY_BUFFER);\n } else {\n model.colorBuffer.releaseGraphicsResources();\n }\n\n var numPts = garray.length / 16;\n var parray = new Uint8Array(4 * numPts);\n\n for (var i = 0; i < numPts; ++i) {\n var value = i + 1;\n var offset = i * 4;\n parray[offset] = value % 256;\n value -= parray[offset];\n value /= 256;\n parray[offset + 1] = value % 256;\n value -= parray[offset + 1];\n value /= 256;\n parray[offset + 2] = value % 256;\n parray[offset + 3] = 255;\n }\n\n model.pickBuffer.upload(parray, ObjectType.ARRAY_BUFFER);\n model.glyphBOBuildTime.modified();\n }\n }\n\n return superClass.buildBufferObjects(ren, actor);\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n normalMatrix: null,\n mcpcMatrix: null,\n mcwcMatrix: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkOpenGLPolyDataMapper.extend(publicAPI, model, initialValues);\n model.tmpMat3 = mat3.identity(new Float64Array(9));\n model.normalMatrix = mat3.identity(new Float64Array(9));\n model.mcpcMatrix = mat4.identity(new Float64Array(16));\n model.mcvcMatrix = mat4.identity(new Float64Array(16));\n model.tmpColor = [];\n model.glyphBOBuildTime = {};\n obj(model.glyphBOBuildTime, {\n mtime: 0\n }); // Object methods\n\n vtkOpenGLGlyph3DMapper(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend, 'vtkOpenGLGlyph3DMapper'); // ----------------------------------------------------------------------------\n\nvar vtkGlyph3DMapper = {\n newInstance: newInstance,\n extend: extend\n}; // Register ourself to OpenGL backend if imported\n\nregisterOverride('vtkGlyph3DMapper', newInstance);\n\nexport { vtkGlyph3DMapper as default, extend, newInstance };\n","import { mat3, mat4 } from 'gl-matrix';\nimport { newInstance as newInstance$1, obj, setGet, get, vtkErrorMacro as vtkErrorMacro$1 } from '../../macros.js';\nimport vtkDataArray from '../../Common/Core/DataArray.js';\nimport vtkHelper from './Helper.js';\nimport vtkViewNode from '../SceneGraph/ViewNode.js';\nimport vtkOpenGLTexture from './Texture.js';\nimport { Representation } from '../Core/Property/Constants.js';\nimport { registerOverride } from './ViewNodeFactory.js';\n\nvar vtkErrorMacro = vtkErrorMacro$1; // ----------------------------------------------------------------------------\n// vtkOpenGLSkybox methods\n// ----------------------------------------------------------------------------\n\nfunction vtkOpenGLSkybox(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkOpenGLSkybox'); // Builds myself.\n\n publicAPI.buildPass = function (prepass) {\n if (prepass) {\n model._openGLRenderer = publicAPI.getFirstAncestorOfType('vtkOpenGLRenderer');\n model._openGLRenderWindow = model._openGLRenderer.getParent();\n model.context = model._openGLRenderWindow.getContext();\n model.tris.setOpenGLRenderWindow(model._openGLRenderWindow);\n model.openGLTexture.setOpenGLRenderWindow(model._openGLRenderWindow);\n\n var ren = model._openGLRenderer.getRenderable();\n\n model.openGLCamera = model._openGLRenderer.getViewNodeFor(ren.getActiveCamera());\n }\n };\n\n publicAPI.queryPass = function (prepass, renderPass) {\n if (prepass) {\n if (!model.renderable || !model.renderable.getVisibility()) {\n return;\n }\n\n renderPass.incrementOpaqueActorCount();\n }\n };\n\n publicAPI.opaquePass = function (prepass, renderPass) {\n if (prepass && !model._openGLRenderer.getSelector()) {\n publicAPI.updateBufferObjects();\n model.context.depthMask(true);\n\n model._openGLRenderWindow.getShaderCache().readyShaderProgram(model.tris.getProgram());\n\n model.openGLTexture.render(model._openGLRenderWindow);\n var texUnit = model.openGLTexture.getTextureUnit();\n model.tris.getProgram().setUniformi('sbtexture', texUnit);\n\n var ren = model._openGLRenderer.getRenderable();\n\n var keyMats = model.openGLCamera.getKeyMatrices(ren);\n var imat = new Float64Array(16);\n mat4.invert(imat, keyMats.wcpc);\n model.tris.getProgram().setUniformMatrix('IMCPCMatrix', imat);\n\n if (model.lastFormat === 'box') {\n var camPos = ren.getActiveCamera().getPosition();\n model.tris.getProgram().setUniform3f('camPos', camPos[0], camPos[1], camPos[2]);\n }\n\n model.tris.getVAO().bind(); // draw polygons\n\n model.context.drawArrays(model.context.TRIANGLES, 0, model.tris.getCABO().getElementCount());\n model.tris.getVAO().release();\n model.openGLTexture.deactivate();\n }\n };\n\n publicAPI.updateBufferObjects = function () {\n // build the VBO if needed, only happens once\n if (!model.tris.getCABO().getElementCount()) {\n var ptsArray = new Float32Array(12);\n\n for (var i = 0; i < 4; i++) {\n ptsArray[i * 3] = i % 2 * 2 - 1.0;\n ptsArray[i * 3 + 1] = i > 1 ? 1.0 : -1.0;\n ptsArray[i * 3 + 2] = 1.0;\n }\n\n var points = vtkDataArray.newInstance({\n numberOfComponents: 3,\n values: ptsArray\n });\n points.setName('points');\n var cellArray = new Uint16Array(8);\n cellArray[0] = 3;\n cellArray[1] = 0;\n cellArray[2] = 1;\n cellArray[3] = 3;\n cellArray[4] = 3;\n cellArray[5] = 0;\n cellArray[6] = 3;\n cellArray[7] = 2;\n var cells = vtkDataArray.newInstance({\n numberOfComponents: 1,\n values: cellArray\n });\n model.tris.getCABO().createVBO(cells, 'polys', Representation.SURFACE, {\n points: points,\n cellOffset: 0\n });\n } // update the program?\n\n\n if (model.renderable.getFormat() !== model.lastFormat) {\n model.lastFormat = model.renderable.getFormat();\n\n if (model.lastFormat === 'box') {\n // we invert Y below because opengl is messed up!\n // Cube Maps have been specified to follow the RenderMan\n // specification (for whatever reason), and RenderMan\n // assumes the images' origin being in the upper left,\n // contrary to the usual OpenGL behaviour of having the\n // image origin in the lower left. That's why things get\n // swapped in the Y direction. It totally breaks with the usual\n // OpenGL semantics and doesn't make sense at all.\n // But now we're stuck with it. From\n // https://stackoverflow.com/questions/11685608/convention-of-faces-in-opengl-cubemapping\n //\n model.tris.setProgram(model._openGLRenderWindow.getShaderCache().readyShaderProgramArray(\"//VTK::System::Dec\\n attribute vec3 vertexMC;\\n uniform mat4 IMCPCMatrix;\\n varying vec3 TexCoords;\\n void main () {\\n gl_Position = vec4(vertexMC.xyz, 1.0);\\n vec4 wpos = IMCPCMatrix * gl_Position;\\n TexCoords = wpos.xyz/wpos.w;\\n }\", \"//VTK::System::Dec\\n //VTK::Output::Dec\\n varying vec3 TexCoords;\\n uniform samplerCube sbtexture;\\n uniform vec3 camPos;\\n void main () {\\n // skybox looks from inside out\\n // which means we have to adjust\\n // our tcoords. Otherwise text would\\n // be flipped\\n vec3 tc = normalize(TexCoords - camPos);\\n if (abs(tc.z) < max(abs(tc.x),abs(tc.y)))\\n {\\n tc = vec3(1.0, 1.0, -1.0) * tc;\\n }\\n else\\n {\\n tc = vec3(-1.0, 1.0, 1.0) * tc;\\n }\\n gl_FragData[0] = textureCube(sbtexture, tc);\\n }\", ''));\n }\n\n if (model.lastFormat === 'background') {\n // maps the texture to the window\n model.tris.setProgram(model._openGLRenderWindow.getShaderCache().readyShaderProgramArray(\"//VTK::System::Dec\\n attribute vec3 vertexMC;\\n uniform mat4 IMCPCMatrix;\\n varying vec2 TexCoords;\\n void main () {\\n gl_Position = vec4(vertexMC.xyz, 1.0);\\n vec4 wpos = IMCPCMatrix * gl_Position;\\n TexCoords = vec2(vertexMC.x, vertexMC.y)*0.5 + 0.5;\\n }\", \"//VTK::System::Dec\\n //VTK::Output::Dec\\n varying vec2 TexCoords;\\n uniform sampler2D sbtexture;\\n void main () {\\n gl_FragData[0] = texture2D(sbtexture, TexCoords);\\n }\", ''));\n }\n\n model.tris.getShaderSourceTime().modified();\n model.tris.getVAO().bind();\n\n if (!model.tris.getVAO().addAttributeArray(model.tris.getProgram(), model.tris.getCABO(), 'vertexMC', model.tris.getCABO().getVertexOffset(), model.tris.getCABO().getStride(), model.context.FLOAT, 3, model.context.FALSE)) {\n vtkErrorMacro('Error setting vertexMC in shader VAO.');\n }\n } // set/update the texture map if needed\n\n\n var tmaps = model.renderable.getTextures();\n\n if (!tmaps.length) {\n vtkErrorMacro('vtkSkybox requires a texture map');\n }\n\n if (model.openGLTexture.getRenderable() !== tmaps[0]) {\n model.openGLTexture.releaseGraphicsResources(model._openGLRenderWindow);\n model.openGLTexture.setRenderable(tmaps[0]);\n }\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n context: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkViewNode.extend(publicAPI, model, initialValues);\n model.openGLTexture = vtkOpenGLTexture.newInstance();\n model.tris = vtkHelper.newInstance();\n model.keyMatrixTime = {};\n obj(model.keyMatrixTime, {\n mtime: 0\n });\n model.keyMatrices = {\n normalMatrix: mat3.identity(new Float64Array(9)),\n mcwc: mat4.identity(new Float64Array(16))\n }; // Build VTK API\n\n setGet(publicAPI, model, ['context']);\n get(publicAPI, model, ['activeTextures']); // Object methods\n\n vtkOpenGLSkybox(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend); // ----------------------------------------------------------------------------\n\nvar vtkSkybox = {\n newInstance: newInstance,\n extend: extend\n}; // Register ourself to OpenGL backend if imported\n\nregisterOverride('vtkSkybox', newInstance);\n\nexport { vtkSkybox as default, extend, newInstance };\n","var vtkSphereMapperVS = \"//VTK::System::Dec\\n\\n/*=========================================================================\\n\\n Program: Visualization Toolkit\\n Module: vtkSphereMapperVS.glsl\\n\\n Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen\\n All rights reserved.\\n See Copyright.txt or http://www.kitware.com/Copyright.htm for details.\\n\\n This software is distributed WITHOUT ANY WARRANTY; without even\\n the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR\\n PURPOSE. See the above copyright notice for more information.\\n\\n=========================================================================*/\\n// this shader implements imposters in OpenGL for Spheres\\n\\nattribute vec4 vertexMC;\\nattribute vec2 offsetMC;\\n\\n// optional normal declaration\\n//VTK::Normal::Dec\\n\\n//VTK::Picking::Dec\\n\\n// Texture coordinates\\n//VTK::TCoord::Dec\\n\\nuniform mat3 normalMatrix; // transform model coordinate directions to view coordinates\\n\\n// material property values\\n//VTK::Color::Dec\\n\\n// clipping plane vars\\n//VTK::Clip::Dec\\n\\n// camera and actor matrix values\\n//VTK::Camera::Dec\\n\\nvarying vec4 vertexVCVSOutput;\\nvarying float radiusVCVSOutput;\\nvarying vec3 centerVCVSOutput;\\n\\nuniform int cameraParallel;\\nuniform float scaleFactor;\\n\\nvoid main()\\n{\\n //VTK::Picking::Impl\\n\\n //VTK::Color::Impl\\n\\n //VTK::Normal::Impl\\n\\n //VTK::TCoord::Impl\\n\\n //VTK::Clip::Impl\\n\\n // compute the projected vertex position\\n vec2 scaledOffsetMC = scaleFactor * offsetMC;\\n vertexVCVSOutput = MCVCMatrix * vertexMC;\\n centerVCVSOutput = vertexVCVSOutput.xyz;\\n radiusVCVSOutput = length(scaledOffsetMC)*0.5;\\n\\n // make the triangle face the camera\\n if (cameraParallel == 0)\\n {\\n vec3 dir = normalize(-vertexVCVSOutput.xyz);\\n vec3 base2 = normalize(cross(dir,vec3(1.0,0.0,0.0)));\\n vec3 base1 = cross(base2,dir);\\n vertexVCVSOutput.xyz = vertexVCVSOutput.xyz + scaledOffsetMC.x*base1 + scaledOffsetMC.y*base2;\\n }\\n else\\n {\\n // add in the offset\\n vertexVCVSOutput.xy = vertexVCVSOutput.xy + scaledOffsetMC;\\n }\\n\\n gl_Position = VCPCMatrix * vertexVCVSOutput;\\n}\\n\";\n\nexport { vtkSphereMapperVS as v };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport { mat4 } from 'gl-matrix';\nimport { ObjectType } from './BufferObject/Constants.js';\nimport { newInstance as newInstance$1, vtkErrorMacro as vtkErrorMacro$1 } from '../../macros.js';\nimport vtkBufferObject from './BufferObject.js';\nimport { r as radiansFromDegrees } from '../../Common/Core/Math/index.js';\nimport vtkShaderProgram from './ShaderProgram.js';\nimport vtkOpenGLPolyDataMapper from './PolyDataMapper.js';\nimport { v as vtkSphereMapperVS } from './glsl/vtkSphereMapperVS.glsl.js';\nimport { v as vtkPolyDataFS } from './glsl/vtkPolyDataFS.glsl.js';\nimport { registerOverride } from './ViewNodeFactory.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nvar vtkErrorMacro = vtkErrorMacro$1; // ----------------------------------------------------------------------------\n// vtkOpenGLSphereMapper methods\n// ----------------------------------------------------------------------------\n\nfunction vtkOpenGLSphereMapper(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkOpenGLSphereMapper'); // Capture 'parentClass' api for internal use\n\n var superClass = _objectSpread({}, publicAPI);\n\n publicAPI.getShaderTemplate = function (shaders, ren, actor) {\n shaders.Vertex = vtkSphereMapperVS;\n shaders.Fragment = vtkPolyDataFS;\n shaders.Geometry = '';\n };\n\n publicAPI.replaceShaderValues = function (shaders, ren, actor) {\n var VSSource = shaders.Vertex;\n var FSSource = shaders.Fragment;\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::Camera::Dec', ['uniform mat4 VCPCMatrix;\\n', 'uniform mat4 MCVCMatrix;']).result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::PositionVC::Dec', ['varying vec4 vertexVCVSOutput;']).result; // we create vertexVC below, so turn off the default\n // implementation\n\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::PositionVC::Impl', ['vec4 vertexVC = vertexVCVSOutput;\\n']).result; // for lights kit and positional the VCPC matrix is already defined\n // so don't redefine it\n\n var replacement = ['uniform float invertedDepth;\\n', 'uniform int cameraParallel;\\n', 'varying float radiusVCVSOutput;\\n', 'varying vec3 centerVCVSOutput;\\n', 'uniform mat4 VCPCMatrix;\\n'];\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Normal::Dec', replacement).result;\n var fragString = '';\n\n if (model.context.getExtension('EXT_frag_depth')) {\n fragString = 'gl_FragDepthEXT = (pos.z / pos.w + 1.0) / 2.0;\\n';\n }\n\n if (model._openGLRenderWindow.getWebgl2()) {\n fragString = 'gl_FragDepth = (pos.z / pos.w + 1.0) / 2.0;\\n';\n }\n\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Depth::Impl', [// compute the eye position and unit direction\n ' vec3 EyePos;\\n', ' vec3 EyeDir;\\n', ' if (cameraParallel != 0) {\\n', ' EyePos = vec3(vertexVC.x, vertexVC.y, vertexVC.z + 3.0*radiusVCVSOutput);\\n', ' EyeDir = vec3(0.0,0.0,-1.0); }\\n', ' else {\\n', ' EyeDir = vertexVC.xyz;\\n', ' EyePos = vec3(0.0,0.0,0.0);\\n', ' float lengthED = length(EyeDir);\\n', ' EyeDir = normalize(EyeDir);\\n', // we adjust the EyePos to be closer if it is too far away\n // to prevent floating point precision noise\n ' if (lengthED > radiusVCVSOutput*3.0) {\\n', ' EyePos = vertexVC.xyz - EyeDir*3.0*radiusVCVSOutput; }\\n', ' }\\n', // translate to Sphere center\n ' EyePos = EyePos - centerVCVSOutput;\\n', // scale to radius 1.0\n ' EyePos = EyePos/radiusVCVSOutput;\\n', // find the intersection\n ' float b = 2.0*dot(EyePos,EyeDir);\\n', ' float c = dot(EyePos,EyePos) - 1.0;\\n', ' float d = b*b - 4.0*c;\\n', ' vec3 normalVCVSOutput = vec3(0.0,0.0,1.0);\\n', ' if (d < 0.0) { discard; }\\n', ' else {\\n', ' float t = (-b - invertedDepth*sqrt(d))*0.5;\\n', // compute the normal, for unit sphere this is just\n // the intersection point\n ' normalVCVSOutput = invertedDepth*normalize(EyePos + t*EyeDir);\\n', // compute the intersection point in VC\n ' vertexVC.xyz = normalVCVSOutput*radiusVCVSOutput + centerVCVSOutput;\\n', ' }\\n', // compute the pixel's depth\n // ' normalVCVSOutput = vec3(0,0,1);\\n'\n ' vec4 pos = VCPCMatrix * vertexVC;\\n', fragString]).result; // Strip out the normal line -- the normal is computed as part of the depth\n\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Normal::Impl', '').result;\n\n if (model.haveSeenDepthRequest) {\n // special depth impl\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::ZBuffer::Impl', ['if (depthRequest == 1) {', 'float computedZ = (pos.z / pos.w + 1.0) / 2.0;', 'float iz = floor(computedZ * 65535.0 + 0.1);', 'float rf = floor(iz/256.0)/255.0;', 'float gf = mod(iz,256.0)/255.0;', 'gl_FragData[0] = vec4(rf, gf, 0.0, 1.0); }']).result;\n }\n\n shaders.Vertex = VSSource;\n shaders.Fragment = FSSource;\n superClass.replaceShaderValues(shaders, ren, actor);\n };\n\n publicAPI.setMapperShaderParameters = function (cellBO, ren, actor) {\n if (cellBO.getCABO().getElementCount() && (model.VBOBuildTime > cellBO.getAttributeUpdateTime().getMTime() || cellBO.getShaderSourceTime().getMTime() > cellBO.getAttributeUpdateTime().getMTime()) && cellBO.getProgram().isAttributeUsed('offsetMC')) {\n if (!cellBO.getVAO().addAttributeArray(cellBO.getProgram(), cellBO.getCABO(), 'offsetMC', 12, // 12:this->VBO->ColorOffset+sizeof(float)\n cellBO.getCABO().getStride(), model.context.FLOAT, 2, false)) {\n vtkErrorMacro(\"Error setting 'offsetMC' in shader VAO.\");\n }\n }\n\n if (cellBO.getProgram().isUniformUsed('invertedDepth')) {\n cellBO.getProgram().setUniformf('invertedDepth', model.invert ? -1.0 : 1.0);\n }\n\n if (cellBO.getProgram().isUniformUsed('scaleFactor')) {\n // apply scaling factor only if a scale array has been provided.\n var poly = model.currentInput;\n var pointData = poly.getPointData();\n\n if (model.renderable.getScaleArray() != null && pointData.hasArray(model.renderable.getScaleArray())) {\n cellBO.getProgram().setUniformf('scaleFactor', model.renderable.getScaleFactor());\n } else {\n cellBO.getProgram().setUniformf('scaleFactor', 1.0);\n }\n }\n\n superClass.setMapperShaderParameters(cellBO, ren, actor);\n };\n\n publicAPI.setCameraShaderParameters = function (cellBO, ren, actor) {\n var program = cellBO.getProgram();\n var cam = ren.getActiveCamera();\n var keyMats = model.openGLCamera.getKeyMatrices(ren);\n\n if (program.isUniformUsed('VCPCMatrix')) {\n program.setUniformMatrix('VCPCMatrix', keyMats.vcpc);\n }\n\n if (program.isUniformUsed('MCVCMatrix')) {\n if (!actor.getIsIdentity()) {\n var actMats = model.openGLActor.getKeyMatrices();\n var tmp4 = new Float64Array(16);\n mat4.multiply(tmp4, keyMats.wcvc, actMats.mcwc);\n program.setUniformMatrix('MCVCMatrix', tmp4);\n } else {\n program.setUniformMatrix('MCVCMatrix', keyMats.wcvc);\n }\n }\n\n if (program.isUniformUsed('cameraParallel')) {\n cellBO.getProgram().setUniformi('cameraParallel', cam.getParallelProjection());\n }\n };\n\n publicAPI.getOpenGLMode = function (rep, type) {\n return model.context.TRIANGLES;\n };\n\n publicAPI.buildBufferObjects = function (ren, actor) {\n var poly = model.currentInput;\n\n if (poly === null) {\n return;\n }\n\n model.renderable.mapScalars(poly, 1.0);\n var c = model.renderable.getColorMapColors();\n var vbo = model.primitives[model.primTypes.Tris].getCABO();\n var pointData = poly.getPointData();\n var points = poly.getPoints();\n var numPoints = points.getNumberOfPoints();\n var pointArray = points.getData();\n var pointSize = 5; // x,y,z,orientation1,orientation2\n\n var scales = null;\n\n if (model.renderable.getScaleArray() != null && pointData.hasArray(model.renderable.getScaleArray())) {\n scales = pointData.getArray(model.renderable.getScaleArray()).getData();\n }\n\n var colorData = null;\n var colorComponents = 0;\n var packedUCVBO = null;\n\n if (c) {\n colorComponents = c.getNumberOfComponents();\n vbo.setColorOffset(0);\n vbo.setColorBOStride(4);\n colorData = c.getData();\n packedUCVBO = new Uint8Array(3 * numPoints * 4);\n\n if (!vbo.getColorBO()) {\n vbo.setColorBO(vtkBufferObject.newInstance());\n }\n\n vbo.getColorBO().setOpenGLRenderWindow(model._openGLRenderWindow);\n } else if (vbo.getColorBO()) {\n vbo.setColorBO(null);\n }\n\n vbo.setColorComponents(colorComponents);\n var packedVBO = new Float32Array(pointSize * numPoints * 3);\n vbo.setStride(pointSize * 4);\n var cos30 = Math.cos(radiansFromDegrees(30.0));\n var pointIdx = 0;\n var colorIdx = 0; //\n // Generate points and point data for sides\n //\n\n var vboIdx = 0;\n var ucIdx = 0;\n\n for (var i = 0; i < numPoints; ++i) {\n var radius = model.renderable.getRadius();\n\n if (scales) {\n radius = scales[i];\n }\n\n pointIdx = i * 3;\n packedVBO[vboIdx++] = pointArray[pointIdx++];\n packedVBO[vboIdx++] = pointArray[pointIdx++];\n packedVBO[vboIdx++] = pointArray[pointIdx++];\n packedVBO[vboIdx++] = -2.0 * radius * cos30;\n packedVBO[vboIdx++] = -radius;\n\n if (colorData) {\n colorIdx = i * colorComponents;\n packedUCVBO[ucIdx++] = colorData[colorIdx];\n packedUCVBO[ucIdx++] = colorData[colorIdx + 1];\n packedUCVBO[ucIdx++] = colorData[colorIdx + 2];\n packedUCVBO[ucIdx++] = colorData[colorIdx + 3];\n }\n\n pointIdx = i * 3;\n packedVBO[vboIdx++] = pointArray[pointIdx++];\n packedVBO[vboIdx++] = pointArray[pointIdx++];\n packedVBO[vboIdx++] = pointArray[pointIdx++];\n packedVBO[vboIdx++] = 2.0 * radius * cos30;\n packedVBO[vboIdx++] = -radius;\n\n if (colorData) {\n packedUCVBO[ucIdx++] = colorData[colorIdx];\n packedUCVBO[ucIdx++] = colorData[colorIdx + 1];\n packedUCVBO[ucIdx++] = colorData[colorIdx + 2];\n packedUCVBO[ucIdx++] = colorData[colorIdx + 3];\n }\n\n pointIdx = i * 3;\n packedVBO[vboIdx++] = pointArray[pointIdx++];\n packedVBO[vboIdx++] = pointArray[pointIdx++];\n packedVBO[vboIdx++] = pointArray[pointIdx++];\n packedVBO[vboIdx++] = 0.0;\n packedVBO[vboIdx++] = 2.0 * radius;\n\n if (colorData) {\n packedUCVBO[ucIdx++] = colorData[colorIdx];\n packedUCVBO[ucIdx++] = colorData[colorIdx + 1];\n packedUCVBO[ucIdx++] = colorData[colorIdx + 2];\n packedUCVBO[ucIdx++] = colorData[colorIdx + 3];\n }\n }\n\n vbo.setElementCount(vboIdx / pointSize);\n vbo.upload(packedVBO, ObjectType.ARRAY_BUFFER);\n\n if (c) {\n vbo.getColorBO().upload(packedUCVBO, ObjectType.ARRAY_BUFFER);\n }\n\n model.VBOBuildTime.modified();\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkOpenGLPolyDataMapper.extend(publicAPI, model, initialValues); // Object methods\n\n vtkOpenGLSphereMapper(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend, 'vtkOpenGLSphereMapper'); // ----------------------------------------------------------------------------\n\nvar vtkSphereMapper = {\n newInstance: newInstance,\n extend: extend\n}; // Register ourself to OpenGL backend if imported\n\nregisterOverride('vtkSphereMapper', newInstance);\n\nexport { vtkSphereMapper as default, extend, newInstance };\n","var vtkStickMapperVS = \"//VTK::System::Dec\\n\\n/*=========================================================================\\n\\n Program: Visualization Toolkit\\n Module: vtkStickMapperVS.glsl\\n\\n Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen\\n All rights reserved.\\n See Copyright.txt or http://www.kitware.com/Copyright.htm for details.\\n\\n This software is distributed WITHOUT ANY WARRANTY; without even\\n the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR\\n PURPOSE. See the above copyright notice for more information.\\n\\n=========================================================================*/\\n// this shader implements imposters in OpenGL for Sticks\\n\\nattribute vec4 vertexMC;\\nattribute vec3 orientMC;\\nattribute vec4 offsetMC;\\nattribute float radiusMC;\\n\\n// optional normal declaration\\n//VTK::Normal::Dec\\n\\n//VTK::Picking::Dec\\n\\n// Texture coordinates\\n//VTK::TCoord::Dec\\n\\nuniform mat3 normalMatrix; // transform model coordinate directions to view coordinates\\n\\n// material property values\\n//VTK::Color::Dec\\n\\n// clipping plane vars\\n//VTK::Clip::Dec\\n\\n// camera and actor matrix values\\n//VTK::Camera::Dec\\n\\nvarying vec4 vertexVCVSOutput;\\nvarying float radiusVCVSOutput;\\nvarying float lengthVCVSOutput;\\nvarying vec3 centerVCVSOutput;\\nvarying vec3 orientVCVSOutput;\\n\\nuniform int cameraParallel;\\n\\nvoid main()\\n{\\n //VTK::Picking::Impl\\n\\n //VTK::Color::Impl\\n\\n //VTK::Normal::Impl\\n\\n //VTK::TCoord::Impl\\n\\n //VTK::Clip::Impl\\n\\n vertexVCVSOutput = MCVCMatrix * vertexMC;\\n centerVCVSOutput = vertexVCVSOutput.xyz;\\n radiusVCVSOutput = radiusMC;\\n lengthVCVSOutput = length(orientMC);\\n orientVCVSOutput = normalMatrix * normalize(orientMC);\\n\\n // make sure it is pointing out of the screen\\n if (orientVCVSOutput.z < 0.0)\\n {\\n orientVCVSOutput = -orientVCVSOutput;\\n }\\n\\n // make the basis\\n vec3 xbase;\\n vec3 ybase;\\n vec3 dir = vec3(0.0,0.0,1.0);\\n if (cameraParallel == 0)\\n {\\n dir = normalize(-vertexVCVSOutput.xyz);\\n }\\n if (abs(dot(dir,orientVCVSOutput)) == 1.0)\\n {\\n xbase = normalize(cross(vec3(0.0,1.0,0.0),orientVCVSOutput));\\n ybase = cross(xbase,orientVCVSOutput);\\n }\\n else\\n {\\n xbase = normalize(cross(orientVCVSOutput,dir));\\n ybase = cross(orientVCVSOutput,xbase);\\n }\\n\\n vec3 offsets = offsetMC.xyz*2.0-1.0;\\n vertexVCVSOutput.xyz = vertexVCVSOutput.xyz +\\n radiusVCVSOutput*offsets.x*xbase +\\n radiusVCVSOutput*offsets.y*ybase +\\n 0.5*lengthVCVSOutput*offsets.z*orientVCVSOutput;\\n\\n gl_Position = VCPCMatrix * vertexVCVSOutput;\\n}\\n\";\n\nexport { vtkStickMapperVS as v };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport { mat4, mat3 } from 'gl-matrix';\nimport { ObjectType } from './BufferObject/Constants.js';\nimport { newInstance as newInstance$1, vtkErrorMacro as vtkErrorMacro$1 } from '../../macros.js';\nimport vtkBufferObject from './BufferObject.js';\nimport { v as vtkStickMapperVS } from './glsl/vtkStickMapperVS.glsl.js';\nimport { v as vtkPolyDataFS } from './glsl/vtkPolyDataFS.glsl.js';\nimport vtkShaderProgram from './ShaderProgram.js';\nimport vtkOpenGLPolyDataMapper from './PolyDataMapper.js';\nimport { registerOverride } from './ViewNodeFactory.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nvar vtkErrorMacro = vtkErrorMacro$1; // ----------------------------------------------------------------------------\n// vtkOpenGLStickMapper methods\n// ----------------------------------------------------------------------------\n\nfunction vtkOpenGLStickMapper(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkOpenGLStickMapper'); // Capture 'parentClass' api for internal use\n\n var superClass = _objectSpread({}, publicAPI);\n\n publicAPI.getShaderTemplate = function (shaders, ren, actor) {\n shaders.Vertex = vtkStickMapperVS;\n shaders.Fragment = vtkPolyDataFS;\n shaders.Geometry = '';\n };\n\n publicAPI.replaceShaderValues = function (shaders, ren, actor) {\n var VSSource = shaders.Vertex;\n var FSSource = shaders.Fragment;\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::Camera::Dec', ['uniform mat4 VCPCMatrix;\\n', 'uniform mat4 MCVCMatrix;']).result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::PositionVC::Dec', 'varying vec4 vertexVCVSOutput;').result; // we create vertexVC below, so turn off the default\n // implementation\n\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::PositionVC::Impl', ' vec4 vertexVC = vertexVCVSOutput;\\n').result; // for lights kit and positional the VCPC matrix is already defined\n // so don't redefine it\n\n var replacement = ['uniform int cameraParallel;\\n', 'varying float radiusVCVSOutput;\\n', 'varying vec3 orientVCVSOutput;\\n', 'varying float lengthVCVSOutput;\\n', 'varying vec3 centerVCVSOutput;\\n', 'uniform mat4 VCPCMatrix;\\n'];\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Normal::Dec', replacement).result;\n var fragString = '';\n\n if (model.context.getExtension('EXT_frag_depth')) {\n fragString = ' gl_FragDepthEXT = (pos.z / pos.w + 1.0) / 2.0;\\n';\n }\n\n if (model._openGLRenderWindow.getWebgl2()) {\n fragString = 'gl_FragDepth = (pos.z / pos.w + 1.0) / 2.0;\\n';\n } // see https://www.cl.cam.ac.uk/teaching/1999/AGraphHCI/SMAG/node2.html\n\n\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Depth::Impl', [// compute the eye position and unit direction\n ' vec3 EyePos;\\n', ' vec3 EyeDir;\\n', ' if (cameraParallel != 0) {\\n', ' EyePos = vec3(vertexVC.x, vertexVC.y, vertexVC.z + 3.0*radiusVCVSOutput);\\n', ' EyeDir = vec3(0.0,0.0,-1.0); }\\n', ' else {\\n', ' EyeDir = vertexVC.xyz;\\n', ' EyePos = vec3(0.0,0.0,0.0);\\n', ' float lengthED = length(EyeDir);\\n', ' EyeDir = normalize(EyeDir);\\n', // we adjust the EyePos to be closer if it is too far away\n // to prevent floating point precision noise\n ' if (lengthED > radiusVCVSOutput*3.0) {\\n', ' EyePos = vertexVC.xyz - EyeDir*3.0*radiusVCVSOutput; }\\n', ' }\\n', // translate to Stick center\n ' EyePos = EyePos - centerVCVSOutput;\\n', // rotate to new basis\n // base1, base2, orientVC\n ' vec3 base1;\\n', ' if (abs(orientVCVSOutput.z) < 0.99) {\\n', ' base1 = normalize(cross(orientVCVSOutput,vec3(0.0,0.0,1.0))); }\\n', ' else {\\n', ' base1 = normalize(cross(orientVCVSOutput,vec3(0.0,1.0,0.0))); }\\n', ' vec3 base2 = cross(orientVCVSOutput,base1);\\n', ' EyePos = vec3(dot(EyePos,base1),dot(EyePos,base2),dot(EyePos,orientVCVSOutput));\\n', ' EyeDir = vec3(dot(EyeDir,base1),dot(EyeDir,base2),dot(EyeDir,orientVCVSOutput));\\n', // scale by radius\n ' EyePos = EyePos/radiusVCVSOutput;\\n', // find the intersection\n ' float a = EyeDir.x*EyeDir.x + EyeDir.y*EyeDir.y;\\n', ' float b = 2.0*(EyePos.x*EyeDir.x + EyePos.y*EyeDir.y);\\n', ' float c = EyePos.x*EyePos.x + EyePos.y*EyePos.y - 1.0;\\n', ' float d = b*b - 4.0*a*c;\\n', ' vec3 normalVCVSOutput = vec3(0.0,0.0,1.0);\\n', ' if (d < 0.0) { discard; }\\n', ' else {\\n', ' float t = (-b - sqrt(d))/(2.0*a);\\n', ' float tz = EyePos.z + t*EyeDir.z;\\n', ' vec3 iPoint = EyePos + t*EyeDir;\\n', ' if (abs(iPoint.z)*radiusVCVSOutput > lengthVCVSOutput*0.5) {\\n', // test for end cap\n ' float t2 = (-b + sqrt(d))/(2.0*a);\\n', ' float tz2 = EyePos.z + t2*EyeDir.z;\\n', ' if (tz2*radiusVCVSOutput > lengthVCVSOutput*0.5 || tz*radiusVCVSOutput < -0.5*lengthVCVSOutput) { discard; }\\n', ' else {\\n', ' normalVCVSOutput = orientVCVSOutput;\\n', ' float t3 = (lengthVCVSOutput*0.5/radiusVCVSOutput - EyePos.z)/EyeDir.z;\\n', ' iPoint = EyePos + t3*EyeDir;\\n', ' vertexVC.xyz = radiusVCVSOutput*(iPoint.x*base1 + iPoint.y*base2 + iPoint.z*orientVCVSOutput) + centerVCVSOutput;\\n', ' }\\n', ' }\\n', ' else {\\n', // The normal is the iPoint.xy rotated back into VC\n ' normalVCVSOutput = iPoint.x*base1 + iPoint.y*base2;\\n', // rescale rerotate and translate\n ' vertexVC.xyz = radiusVCVSOutput*(normalVCVSOutput + iPoint.z*orientVCVSOutput) + centerVCVSOutput;\\n', ' }\\n', ' }\\n', // ' vec3 normalVC = vec3(0.0,0.0,1.0);\\n'\n // compute the pixel's depth\n ' vec4 pos = VCPCMatrix * vertexVC;\\n', fragString]).result; // Strip out the normal line -- the normal is computed as part of the depth\n\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Normal::Impl', '').result;\n\n if (model.haveSeenDepthRequest) {\n // special depth impl\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::ZBuffer::Impl', ['if (depthRequest == 1) {', 'float computedZ = (pos.z / pos.w + 1.0) / 2.0;', 'float iz = floor(computedZ * 65535.0 + 0.1);', 'float rf = floor(iz/256.0)/255.0;', 'float gf = mod(iz,256.0)/255.0;', 'gl_FragData[0] = vec4(rf, gf, 0.0, 1.0); }']).result;\n }\n\n shaders.Vertex = VSSource;\n shaders.Fragment = FSSource;\n superClass.replaceShaderValues(shaders, ren, actor);\n };\n\n publicAPI.setMapperShaderParameters = function (cellBO, ren, actor) {\n if (cellBO.getCABO().getElementCount() && (model.VBOBuildTime > cellBO.getAttributeUpdateTime().getMTime() || cellBO.getShaderSourceTime().getMTime() > cellBO.getAttributeUpdateTime().getMTime())) {\n if (cellBO.getProgram().isAttributeUsed('orientMC')) {\n if (!cellBO.getVAO().addAttributeArray(cellBO.getProgram(), cellBO.getCABO(), 'orientMC', 12, // after X Y Z\n cellBO.getCABO().getStride(), model.context.FLOAT, 3, false)) {\n vtkErrorMacro(\"Error setting 'orientMC' in shader VAO.\");\n }\n }\n\n if (cellBO.getProgram().isAttributeUsed('offsetMC')) {\n if (!cellBO.getVAO().addAttributeArray(cellBO.getProgram(), cellBO.getCABO().getColorBO(), 'offsetMC', 0, cellBO.getCABO().getColorBOStride(), model.context.UNSIGNED_BYTE, 3, true)) {\n vtkErrorMacro(\"Error setting 'offsetMC' in shader VAO.\");\n }\n }\n\n if (cellBO.getProgram().isAttributeUsed('radiusMC')) {\n if (!cellBO.getVAO().addAttributeArray(cellBO.getProgram(), cellBO.getCABO(), 'radiusMC', 24, // X Y Z OX OY OZ\n cellBO.getCABO().getStride(), model.context.FLOAT, 1, false)) {\n vtkErrorMacro(\"Error setting 'radiusMC' in shader VAO.\");\n }\n }\n }\n\n superClass.setMapperShaderParameters(cellBO, ren, actor);\n };\n\n publicAPI.setCameraShaderParameters = function (cellBO, ren, actor) {\n var program = cellBO.getProgram();\n var cam = ren.getActiveCamera();\n var keyMats = model.openGLCamera.getKeyMatrices(ren);\n\n if (program.isUniformUsed('VCPCMatrix')) {\n program.setUniformMatrix('VCPCMatrix', keyMats.vcpc);\n }\n\n if (!actor.getIsIdentity()) {\n var actMats = model.openGLActor.getKeyMatrices();\n\n if (program.isUniformUsed('MCVCMatrix')) {\n var tmp4 = new Float64Array(16);\n mat4.multiply(tmp4, keyMats.wcvc, actMats.mcwc);\n program.setUniformMatrix('MCVCMatrix', tmp4);\n }\n\n if (program.isUniformUsed('normalMatrix')) {\n var anorms = new Float64Array(9);\n mat3.multiply(anorms, keyMats.normalMatrix, actMats.normalMatrix);\n program.setUniformMatrix3x3('normalMatrix', anorms);\n }\n } else {\n if (program.isUniformUsed('MCVCMatrix')) {\n program.setUniformMatrix('MCVCMatrix', keyMats.wcvc);\n }\n\n if (program.isUniformUsed('normalMatrix')) {\n program.setUniformMatrix3x3('normalMatrix', keyMats.normalMatrix);\n }\n }\n\n if (program.isUniformUsed('cameraParallel')) {\n cellBO.getProgram().setUniformi('cameraParallel', cam.getParallelProjection());\n }\n };\n\n publicAPI.getOpenGLMode = function (rep, type) {\n return model.context.TRIANGLES;\n };\n\n publicAPI.buildBufferObjects = function (ren, actor) {\n var poly = model.currentInput;\n\n if (poly === null) {\n return;\n }\n\n model.renderable.mapScalars(poly, 1.0);\n var c = model.renderable.getColorMapColors();\n var vbo = model.primitives[model.primTypes.Tris].getCABO();\n var pointData = poly.getPointData();\n var points = poly.getPoints();\n var numPoints = points.getNumberOfPoints();\n var pointArray = points.getData();\n var pointSize = 3; // x,y,z\n // three more floats for orientation + 1 for radius\n\n pointSize += 4;\n var colorData = null;\n var colorComponents = 0;\n vbo.setColorBOStride(4);\n\n if (!vbo.getColorBO()) {\n vbo.setColorBO(vtkBufferObject.newInstance());\n }\n\n vbo.getColorBO().setOpenGLRenderWindow(model._openGLRenderWindow);\n\n if (c) {\n colorComponents = c.getNumberOfComponents();\n vbo.setColorOffset(4);\n colorData = c.getData();\n vbo.setColorBOStride(8);\n }\n\n vbo.setColorComponents(colorComponents);\n vbo.setStride(pointSize * 4); // Create a buffer, and copy the data over.\n\n var packedVBO = new Float32Array(pointSize * numPoints * 12);\n var packedUCVBO = new Uint8Array(12 * numPoints * (colorData ? 8 : 4));\n var scales = null;\n var orientationArray = null; //\n // Generate points and point data for sides\n //\n\n if (model.renderable.getScaleArray() != null && pointData.hasArray(model.renderable.getScaleArray())) {\n scales = pointData.getArray(model.renderable.getScaleArray()).getData();\n }\n\n if (model.renderable.getOrientationArray() != null && pointData.hasArray(model.renderable.getOrientationArray())) {\n orientationArray = pointData.getArray(model.renderable.getOrientationArray()).getData();\n } else {\n vtkErrorMacro(['Error setting orientationArray.\\n', 'You have to specify the stick orientation']);\n } // Vertices\n // 013 - 032 - 324 - 453\n //\n // _.4---_.5\n // .-* .-*\n // 2-----3\n // | /|\n // | / |\n // | / |\n // | / |\n // |/ |\n // 0-----1\n //\n // coord for each points\n // 0: 000\n // 1: 100\n // 2: 001\n // 3: 101\n // 4: 011\n // 5: 111\n // prettier-ignore\n\n\n var verticesArray = [0, 1, 3, 0, 3, 2, 2, 3, 5, 2, 5, 4];\n var pointIdx = 0;\n var colorIdx = 0;\n var vboIdx = 0;\n var ucIdx = 0;\n\n for (var i = 0; i < numPoints; ++i) {\n var length = model.renderable.getLength();\n var radius = model.renderable.getRadius();\n\n if (scales) {\n length = scales[i * 2];\n radius = scales[i * 2 + 1];\n }\n\n for (var j = 0; j < verticesArray.length; ++j) {\n pointIdx = i * 3;\n packedVBO[vboIdx++] = pointArray[pointIdx++];\n packedVBO[vboIdx++] = pointArray[pointIdx++];\n packedVBO[vboIdx++] = pointArray[pointIdx++];\n pointIdx = i * 3;\n packedVBO[vboIdx++] = orientationArray[pointIdx++] * length;\n packedVBO[vboIdx++] = orientationArray[pointIdx++] * length;\n packedVBO[vboIdx++] = orientationArray[pointIdx++] * length;\n packedVBO[vboIdx++] = radius;\n packedUCVBO[ucIdx++] = 255 * (verticesArray[j] % 2);\n packedUCVBO[ucIdx++] = verticesArray[j] >= 4 ? 255 : 0;\n packedUCVBO[ucIdx++] = verticesArray[j] >= 2 ? 255 : 0;\n packedUCVBO[ucIdx++] = 255;\n colorIdx = i * colorComponents;\n\n if (colorData) {\n packedUCVBO[ucIdx++] = colorData[colorIdx];\n packedUCVBO[ucIdx++] = colorData[colorIdx + 1];\n packedUCVBO[ucIdx++] = colorData[colorIdx + 2];\n packedUCVBO[ucIdx++] = colorData[colorIdx + 3];\n }\n }\n }\n\n vbo.setElementCount(vboIdx / pointSize);\n vbo.upload(packedVBO, ObjectType.ARRAY_BUFFER);\n vbo.getColorBO().upload(packedUCVBO, ObjectType.ARRAY_BUFFER);\n model.VBOBuildTime.modified();\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkOpenGLPolyDataMapper.extend(publicAPI, model, initialValues); // Object methods\n\n vtkOpenGLStickMapper(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend, 'vtkOpenGLStickMapper'); // ----------------------------------------------------------------------------\n\nvar vtkStickMapper = {\n newInstance: newInstance,\n extend: extend\n}; // Register ourself to OpenGL backend if imported\n\nregisterOverride('vtkStickMapper', newInstance);\n\nexport { vtkStickMapper as default, extend, newInstance };\n","import { mat3, mat4, vec3 } from 'gl-matrix';\nimport macro from '@kitware/vtk.js/macros';\nimport vtkOpenGLVolumeMapper from '@kitware/vtk.js/Rendering/OpenGL/VolumeMapper';\nimport { Filter } from '@kitware/vtk.js/Rendering/OpenGL/Texture/Constants';\nimport { VtkDataTypes } from '@kitware/vtk.js/Common/Core/DataArray/Constants';\nimport vtkDataArray from '@kitware/vtk.js/Common/Core/DataArray';\nimport { Representation } from '@kitware/vtk.js/Rendering/Core/Property/Constants';\n\nconst { vtkWarningMacro } = macro;\n/**\n * vtkStreamingOpenGLVolumeMapper - A dervied class of the core vtkOpenGLVolumeMapper class.\n * This class replaces the buildBufferObjects function so that we progressively upload our textures\n * into GPU memory using the new methods on vtkStreamingOpenGLTexture.\n *\n *\n * @param {*} publicAPI The public API to extend\n * @param {*} model The private model to extend.\n */\nfunction vtkStreamingOpenGLVolumeMapper(publicAPI, model) {\n model.classHierarchy.push('vtkStreamingOpenGLVolumeMapper');\n\n /**\n * buildBufferObjects - A fork of vtkOpenGLVolumeMapper's buildBufferObjects method.\n * This fork performs most of the same actions, but builds the textures progressively using\n * vtkStreamingOpenGLTexture's methods, and also prevents recomputation of the texture for each\n * vtkStreamingOpenGLVolumeMapper using the texture.\n *\n *\n * @param {*} ren The renderer.\n * @param {*} actor The actor to build the buffer objects for.\n */\n publicAPI.buildBufferObjects = (ren, actor) => {\n const image = model.currentInput;\n if (!image) {\n return;\n }\n\n const scalars = image.getPointData() && image.getPointData().getScalars();\n if (!scalars) {\n return;\n }\n\n const vprop = actor.getProperty();\n\n if (!model.jitterTexture.getHandle()) {\n const oTable = new Uint8Array(32 * 32);\n for (let i = 0; i < 32 * 32; ++i) {\n oTable[i] = 255.0 * Math.random();\n }\n model.jitterTexture.setMinificationFilter(Filter.LINEAR);\n model.jitterTexture.setMagnificationFilter(Filter.LINEAR);\n model.jitterTexture.create2DFromRaw(\n 32,\n 32,\n 1,\n VtkDataTypes.UNSIGNED_CHAR,\n oTable\n );\n }\n\n const numComp = scalars.getNumberOfComponents();\n const iComps = vprop.getIndependentComponents();\n const numIComps = iComps ? numComp : 1;\n\n // rebuild opacity tfun?\n let toString = `${vprop.getMTime()}`;\n if (model.opacityTextureString !== toString) {\n const oWidth = 1024;\n const oSize = oWidth * 2 * numIComps;\n const ofTable = new Float32Array(oSize);\n const tmpTable = new Float32Array(oWidth);\n\n for (let c = 0; c < numIComps; ++c) {\n const ofun = vprop.getScalarOpacity(c);\n const opacityFactor =\n model.renderable.getSampleDistance() /\n vprop.getScalarOpacityUnitDistance(c);\n\n const oRange = ofun.getRange();\n ofun.getTable(oRange[0], oRange[1], oWidth, tmpTable, 1);\n // adjust for sample distance etc\n for (let i = 0; i < oWidth; ++i) {\n ofTable[c * oWidth * 2 + i] =\n 1.0 - (1.0 - tmpTable[i]) ** opacityFactor;\n ofTable[c * oWidth * 2 + i + oWidth] = ofTable[c * oWidth * 2 + i];\n }\n }\n\n model.opacityTexture.releaseGraphicsResources(model._openGLRenderWindow);\n model.opacityTexture.setMinificationFilter(Filter.LINEAR);\n model.opacityTexture.setMagnificationFilter(Filter.LINEAR);\n\n // use float texture where possible because we really need the resolution\n // for this table. Errors in low values of opacity accumulate to\n // visible artifacts. High values of opacity quickly terminate without\n // artifacts.\n if (\n model._openGLRenderWindow.getWebgl2() ||\n (model.context.getExtension('OES_texture_float') &&\n model.context.getExtension('OES_texture_float_linear'))\n ) {\n model.opacityTexture.create2DFromRaw(\n oWidth,\n 2 * numIComps,\n 1,\n VtkDataTypes.FLOAT,\n ofTable\n );\n } else {\n const oTable = new Uint8Array(oSize);\n for (let i = 0; i < oSize; ++i) {\n oTable[i] = 255.0 * ofTable[i];\n }\n model.opacityTexture.create2DFromRaw(\n oWidth,\n 2 * numIComps,\n 1,\n VtkDataTypes.UNSIGNED_CHAR,\n oTable\n );\n }\n model.opacityTextureString = toString;\n }\n\n // rebuild color tfun?\n toString = `${vprop.getMTime()}`;\n\n if (model.colorTextureString !== toString) {\n const cWidth = 1024;\n const cSize = cWidth * 2 * numIComps * 3;\n const cTable = new Uint8Array(cSize);\n const tmpTable = new Float32Array(cWidth * 3);\n\n for (let c = 0; c < numIComps; ++c) {\n const cfun = vprop.getRGBTransferFunction(c);\n const cRange = cfun.getRange();\n cfun.getTable(cRange[0], cRange[1], cWidth, tmpTable, 1);\n for (let i = 0; i < cWidth * 3; ++i) {\n cTable[c * cWidth * 6 + i] = 255.0 * tmpTable[i];\n cTable[c * cWidth * 6 + i + cWidth * 3] = 255.0 * tmpTable[i];\n }\n }\n\n model.colorTexture.releaseGraphicsResources(model._openGLRenderWindow);\n model.colorTexture.setMinificationFilter(Filter.LINEAR);\n model.colorTexture.setMagnificationFilter(Filter.LINEAR);\n\n model.colorTexture.create2DFromRaw(\n cWidth,\n 2 * numIComps,\n 3,\n VtkDataTypes.UNSIGNED_CHAR,\n cTable\n );\n model.colorTextureString = toString;\n }\n\n // rebuild the scalarTexture if the data has changed\n toString = `${image.getMTime()}`;\n\n if (model.scalarTextureString !== toString) {\n // Build the textures\n const dims = image.getDimensions();\n\n const previousTextureParameters =\n model.scalarTexture.getTextureParameters();\n\n const dataType = image.getPointData().getScalars().getDataType();\n const data = image.getPointData().getScalars().getData();\n\n let shouldReset = true;\n\n if (\n previousTextureParameters.dataType &&\n previousTextureParameters.dataType === dataType\n ) {\n const previousTextureSize =\n previousTextureParameters.width *\n previousTextureParameters.height *\n previousTextureParameters.depth *\n previousTextureParameters.numComps;\n if (data.length === previousTextureSize) {\n shouldReset = false;\n }\n }\n\n if (shouldReset) {\n model.scalarTexture.setOglNorm16Ext(\n model.context.getExtension('EXT_texture_norm16')\n );\n\n model.scalarTexture.releaseGraphicsResources(model._openGLRenderWindow);\n model.scalarTexture.resetFormatAndType();\n\n model.scalarTexture.create3DFilterableFromRaw(\n dims[0],\n dims[1],\n dims[2],\n numComp,\n scalars.getDataType(),\n scalars.getData(),\n model.renderable.getPreferSizeOverAccuracy()\n );\n } else {\n model.scalarTexture.deactivate();\n model.scalarTexture.update3DFromRaw(data);\n }\n\n model.scalarTextureString = toString;\n }\n\n if (!model.tris.getCABO().getElementCount()) {\n // build the CABO\n const ptsArray = new Float32Array(12);\n for (let i = 0; i < 4; i++) {\n ptsArray[i * 3] = (i % 2) * 2 - 1.0;\n ptsArray[i * 3 + 1] = i > 1 ? 1.0 : -1.0;\n ptsArray[i * 3 + 2] = -1.0;\n }\n\n const cellArray = new Uint16Array(8);\n cellArray[0] = 3;\n cellArray[1] = 0;\n cellArray[2] = 1;\n cellArray[3] = 3;\n cellArray[4] = 3;\n cellArray[5] = 0;\n cellArray[6] = 3;\n cellArray[7] = 2;\n\n const points = vtkDataArray.newInstance({\n numberOfComponents: 3,\n values: ptsArray,\n });\n points.setName('points');\n const cells = vtkDataArray.newInstance({\n numberOfComponents: 1,\n values: cellArray,\n });\n model.tris.getCABO().createVBO(cells, 'polys', Representation.SURFACE, {\n points,\n cellOffset: 0,\n });\n }\n\n model.VBOBuildTime.modified();\n };\n\n // publicAPI.getRenderTargetSize = () => {\n // // https://github.com/Kitware/vtk-js/blob/master/Sources/Rendering/OpenGL/VolumeMapper/index.js#L952\n // if (model.lastXYF > 1.43) {\n // const sz = model.framebuffer.getSize()\n // return [model.fvp[0] * sz[0], model.fvp[1] * sz[1]]\n // }\n\n // // This seems wrong, it assumes the renderWindow only has one renderer\n // // but I don't know if this stuff is correct...\n\n // const { usize, vsize } = model.openGLRenderer.getTiledSizeAndOrigin()\n\n // return [usize, vsize]\n // }\n\n // publicAPI.getRenderTargetSize = () => {\n // if (model._useSmallViewport) {\n // return [model._smallViewportWidth, model._smallViewportHeight]\n // }\n\n // return model._openGLRenderWindow.getFramebufferSize()\n // }\n\n publicAPI.getRenderTargetSize = () => {\n if (model._useSmallViewport) {\n return [model._smallViewportWidth, model._smallViewportHeight];\n }\n\n const { usize, vsize } = model._openGLRenderer.getTiledSizeAndOrigin();\n\n return [usize, vsize];\n };\n\n publicAPI.getRenderTargetOffset = () => {\n const { lowerLeftU, lowerLeftV } =\n model._openGLRenderer.getTiledSizeAndOrigin();\n\n return [lowerLeftU, lowerLeftV];\n };\n\n // TODO: it seems like this may be needed to reset the GPU memory associated\n // with a volume\n // publicAPI.hardReset = () => {\n // model.opacityTexture.releaseGraphicsResources(model._openGLRenderWindow);\n // model.colorTexture.releaseGraphicsResources(model._openGLRenderWindow);\n // model.scalarTexture.setOglNorm16Ext(\n // model.context.getExtension('EXT_texture_norm16')\n // );\n // model.scalarTexture.releaseGraphicsResources(model._openGLRenderWindow);\n // model.scalarTexture.resetFormatAndType();\n // };\n}\n\n// ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n// ----------------------------------------------------------------------------\n\nconst DEFAULT_VALUES = {};\n\nexport function extend(publicAPI, model, initialValues = {}) {\n Object.assign(model, DEFAULT_VALUES, initialValues);\n\n vtkOpenGLVolumeMapper.extend(publicAPI, model, initialValues);\n\n model.scalarTexture = initialValues.scalarTexture;\n model.previousState = {};\n\n // Object methods\n vtkStreamingOpenGLVolumeMapper(publicAPI, model);\n}\n\n// ----------------------------------------------------------------------------\n\nexport const newInstance = macro.newInstance(\n extend,\n 'vtkStreamingOpenGLVolumeMapper'\n);\n\n// ----------------------------------------------------------------------------\n\nexport default { newInstance, extend };\n","import macro from '@kitware/vtk.js/macros';\n// import vtkGenericWidgetRepresentation from '@kitware/vtk.js/Rendering/SceneGraph/GenericWidgetRepresentation'\nimport vtkOpenGLActor from '@kitware/vtk.js/Rendering/OpenGL/Actor';\nimport vtkOpenGLActor2D from '@kitware/vtk.js/Rendering/OpenGL/Actor2D';\nimport vtkOpenGLCamera from '@kitware/vtk.js/Rendering/OpenGL/Camera';\nimport vtkOpenGLGlyph3DMapper from '@kitware/vtk.js/Rendering/OpenGL/Glyph3DMapper';\nimport vtkOpenGLImageMapper from '@kitware/vtk.js/Rendering/OpenGL/ImageMapper';\nimport vtkOpenGLImageSlice from '@kitware/vtk.js/Rendering/OpenGL/ImageSlice';\nimport vtkOpenGLPixelSpaceCallbackMapper from '@kitware/vtk.js/Rendering/OpenGL/PixelSpaceCallbackMapper';\nimport vtkOpenGLPolyDataMapper from '@kitware/vtk.js/Rendering/OpenGL/PolyDataMapper';\nimport vtkOpenGLRenderer from '@kitware/vtk.js/Rendering/OpenGL/Renderer';\nimport vtkOpenGLSkybox from '@kitware/vtk.js/Rendering/OpenGL/Skybox';\nimport vtkOpenGLSphereMapper from '@kitware/vtk.js/Rendering/OpenGL/SphereMapper';\nimport vtkOpenGLStickMapper from '@kitware/vtk.js/Rendering/OpenGL/StickMapper';\nimport vtkOpenGLTexture from '@kitware/vtk.js/Rendering/OpenGL/Texture';\nimport vtkOpenGLVolume from '@kitware/vtk.js/Rendering/OpenGL/Volume';\nimport vtkOpenGLVolumeMapper from '@kitware/vtk.js/Rendering/OpenGL/VolumeMapper';\nimport vtkViewNodeFactory from '@kitware/vtk.js/Rendering/SceneGraph/ViewNodeFactory';\nimport vtkStreamingOpenGLVolumeMapper from './vtkStreamingOpenGLVolumeMapper';\n\n/**\n * vtkStreamingOpenGLViewNodeFactory - A fork of the vtkOpenGLViewNodeFactory,\n * so that we can inject our custom derived \"Streaming\" classes.\n *\n * @param {*} publicAPI The public API to extend\n * @param {*} model The private model to extend.\n */\nfunction vtkStreamingOpenGLViewNodeFactory(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkStreamingOpenGLViewNodeFactory');\n\n /**\n * createNode - fork of createNode from vtkOpenGLViewNodeFactory.\n * This fork is required to inject the properties from model.getModelInitialValues.\n *\n * @param {object} dataObject An instance of a vtk.js class.\n */\n publicAPI.createNode = (dataObject) => {\n if (dataObject.isDeleted()) {\n return null;\n }\n\n let cpt = 0;\n let className = dataObject.getClassName(cpt++);\n let isObject = false;\n const keys = Object.keys(model.overrides);\n while (className && !isObject) {\n if (keys.indexOf(className) !== -1) {\n isObject = true;\n } else {\n className = dataObject.getClassName(cpt++);\n }\n }\n\n if (!isObject) {\n return null;\n }\n\n const initialValues = model.getModelInitialValues(dataObject);\n\n const vn = model.overrides[className](initialValues);\n vn.setMyFactory(publicAPI);\n return vn;\n };\n\n /**\n * getModelInitialValues - This function allows us to pass textures down from our\n * vtkSharedVolumeMapper to new instances of vtkStreamingOpenGLVolumeMapper.\n * The prevents us from sharing memory.\n *\n * TODO: It would be beneficial to push similar, but generalized, functionality\n * back to vtk.js in the future.\n *\n * @param {object} dataObject An instance of a vtk.js class.\n */\n model.getModelInitialValues = (dataObject) => {\n const initialValues = {};\n\n const className = dataObject.getClassName();\n\n if (className === 'vtkSharedVolumeMapper') {\n initialValues.scalarTexture = dataObject.getScalarTexture();\n }\n\n return initialValues;\n };\n}\n\n// ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\nconst DEFAULT_VALUES = {};\n\n// ----------------------------------------------------------------------------\n\nexport function extend(publicAPI, model, initialValues = {}) {\n Object.assign(model, DEFAULT_VALUES, initialValues);\n\n // Inheritance\n vtkViewNodeFactory.extend(publicAPI, model, initialValues);\n\n // Object methods\n vtkStreamingOpenGLViewNodeFactory(publicAPI, model);\n\n // Initialization\n publicAPI.registerOverride('vtkActor', vtkOpenGLActor.newInstance);\n publicAPI.registerOverride('vtkActor2D', vtkOpenGLActor2D.newInstance);\n publicAPI.registerOverride('vtkCamera', vtkOpenGLCamera.newInstance);\n publicAPI.registerOverride(\n 'vtkGlyph3DMapper',\n vtkOpenGLGlyph3DMapper.newInstance\n );\n publicAPI.registerOverride(\n 'vtkImageMapper',\n vtkOpenGLImageMapper.newInstance\n );\n publicAPI.registerOverride('vtkImageSlice', vtkOpenGLImageSlice.newInstance);\n publicAPI.registerOverride('vtkMapper', vtkOpenGLPolyDataMapper.newInstance);\n publicAPI.registerOverride(\n 'vtkPixelSpaceCallbackMapper',\n vtkOpenGLPixelSpaceCallbackMapper.newInstance\n );\n publicAPI.registerOverride('vtkRenderer', vtkOpenGLRenderer.newInstance);\n publicAPI.registerOverride('vtkSkybox', vtkOpenGLSkybox.newInstance);\n publicAPI.registerOverride(\n 'vtkSphereMapper',\n vtkOpenGLSphereMapper.newInstance\n );\n publicAPI.registerOverride(\n 'vtkStickMapper',\n vtkOpenGLStickMapper.newInstance\n );\n publicAPI.registerOverride('vtkTexture', vtkOpenGLTexture.newInstance);\n publicAPI.registerOverride('vtkVolume', vtkOpenGLVolume.newInstance);\n publicAPI.registerOverride(\n 'vtkVolumeMapper',\n vtkOpenGLVolumeMapper.newInstance\n );\n publicAPI.registerOverride(\n 'vtkSharedVolumeMapper',\n vtkStreamingOpenGLVolumeMapper.newInstance\n );\n // publicAPI.registerOverride(\n // 'vtkWidgetRepresentation',\n // vtkGenericWidgetRepresentation.newInstance\n // )\n}\n\n// ----------------------------------------------------------------------------\n\nexport const newInstance = macro.newInstance(\n extend,\n 'vtkStreamingOpenGLViewNodeFactory'\n);\n\n// ----------------------------------------------------------------------------\n\nexport default { newInstance, extend };\n","import macro from '@kitware/vtk.js/macros';\nimport vtkOpenGLRenderWindow from '@kitware/vtk.js/Rendering/OpenGL/RenderWindow';\nimport vtkStreamingOpenGLViewNodeFactory from './vtkStreamingOpenGLViewNodeFactory';\n\n/**\n * vtkStreamingOpenGLRenderWindow - A dervied class of the core vtkOpenGLRenderWindow class.\n * The main purpose for this class extension is to add in our own node factory, so we can use\n * our extended \"streaming\" classes for progressive texture loading.\n *\n *\n * @param {*} publicAPI The public API to extend\n * @param {*} model The private model to extend.\n */\nfunction vtkStreamingOpenGLRenderWindow(publicAPI, model) {\n model.classHierarchy.push('vtkStreamingOpenGLRenderWindow');\n}\n\n// ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n// ----------------------------------------------------------------------------\n\nexport function extend(publicAPI, model, initialValues = {}) {\n Object.assign(model, initialValues);\n\n vtkOpenGLRenderWindow.extend(publicAPI, model, initialValues);\n\n model.myFactory = vtkStreamingOpenGLViewNodeFactory.newInstance();\n /* eslint-disable no-use-before-define */\n model.myFactory.registerOverride('vtkRenderWindow', newInstance);\n /* eslint-enable no-use-before-define */\n\n // Object methods\n vtkStreamingOpenGLRenderWindow(publicAPI, model);\n}\n\n// ----------------------------------------------------------------------------\n\nexport const newInstance = macro.newInstance(\n extend,\n 'vtkStreamingOpenGLRenderWindow'\n);\n\n// ----------------------------------------------------------------------------\n\nexport default { newInstance, extend };\n","var Device = {\n Unknown: 0,\n LeftController: 1,\n RightController: 2\n};\nvar Input = {\n Unknown: 0,\n Trigger: 1,\n TrackPad: 2,\n Grip: 3,\n Thumbstick: 4,\n A: 5,\n B: 6,\n ApplicationMenu: 7 // Not exposed in WebXR API\n\n};\nvar Axis = {\n Unknown: 0,\n TouchpadX: 1,\n TouchpadY: 2,\n ThumbstickX: 3,\n ThumbstickY: 4\n};\nvar Constants = {\n Device: Device,\n Input: Input,\n Axis: Axis\n};\n\nexport { Axis, Device, Input, Constants as default };\n","import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';\nimport _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport macro from '../../macros.js';\nimport { A as degreesFromRadians } from '../../Common/Core/Math/index.js';\nimport Constants from './RenderWindowInteractor/Constants.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nvar Device = Constants.Device,\n Input = Constants.Input;\nvar vtkWarningMacro = macro.vtkWarningMacro,\n vtkErrorMacro = macro.vtkErrorMacro,\n normalizeWheel = macro.normalizeWheel,\n vtkOnceErrorMacro = macro.vtkOnceErrorMacro; // ----------------------------------------------------------------------------\n// Global methods\n// ----------------------------------------------------------------------------\n\nvar EMPTY_MOUSE_EVENT = new MouseEvent('');\nvar deviceInputMap = {\n 'xr-standard': [Input.Trigger, Input.Grip, Input.TrackPad, Input.Thumbstick, Input.A, Input.B]\n};\nvar handledEvents = ['StartAnimation', 'Animation', 'EndAnimation', 'PointerEnter', 'PointerLeave', 'MouseEnter', 'MouseLeave', 'StartMouseMove', 'MouseMove', 'EndMouseMove', 'LeftButtonPress', 'LeftButtonRelease', 'MiddleButtonPress', 'MiddleButtonRelease', 'RightButtonPress', 'RightButtonRelease', 'KeyPress', 'KeyDown', 'KeyUp', 'StartMouseWheel', 'MouseWheel', 'EndMouseWheel', 'StartPinch', 'Pinch', 'EndPinch', 'StartPan', 'Pan', 'EndPan', 'StartRotate', 'Rotate', 'EndRotate', 'Button3D', 'Move3D', 'StartPointerLock', 'EndPointerLock', 'StartInteraction', 'Interaction', 'EndInteraction', 'AnimationFrameRateUpdate'];\n\nfunction preventDefault(event) {\n if (event.cancelable) {\n event.preventDefault();\n }\n}\n\nfunction pointerCacheToPositions(cache) {\n var positions = Object.create(null);\n cache.forEach(function (_ref) {\n var pointerId = _ref.pointerId,\n position = _ref.position;\n positions[pointerId] = position;\n });\n return positions;\n} // ----------------------------------------------------------------------------\n// vtkRenderWindowInteractor methods\n// ----------------------------------------------------------------------------\n\n\nfunction vtkRenderWindowInteractor(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkRenderWindowInteractor'); // Initialize list of requesters\n\n var animationRequesters = new Set(); // map from pointerId to { pointerId: number, position: [x, y] }\n\n var pointerCache = new Map(); // Factor to apply on wheel spin.\n\n var wheelCoefficient = 1; // Public API methods\n //----------------------------------------------------------------------\n\n publicAPI.start = function () {\n // Let the compositing handle the event loop if it wants to.\n // if (publicAPI.HasObserver(vtkCommand::StartEvent) && !publicAPI.HandleEventLoop) {\n // publicAPI.invokeEvent({ type: 'StartEvent' });\n // return;\n // }\n // As a convenience, initialize if we aren't initialized yet.\n if (!model.initialized) {\n publicAPI.initialize();\n\n if (!model.initialized) {\n return;\n }\n } // Pass execution to the subclass which will run the event loop,\n // this will not return until TerminateApp is called.\n\n\n publicAPI.startEventLoop();\n }; //----------------------------------------------------------------------\n\n\n publicAPI.setRenderWindow = function (aren) {\n vtkErrorMacro('you want to call setView(view) instead of setRenderWindow on a vtk.js interactor');\n }; //----------------------------------------------------------------------\n\n\n publicAPI.setInteractorStyle = function (style) {\n if (model.interactorStyle !== style) {\n if (model.interactorStyle != null) {\n model.interactorStyle.setInteractor(null);\n }\n\n model.interactorStyle = style;\n\n if (model.interactorStyle != null) {\n if (model.interactorStyle.getInteractor() !== publicAPI) {\n model.interactorStyle.setInteractor(publicAPI);\n }\n }\n }\n }; //---------------------------------------------------------------------\n\n\n publicAPI.initialize = function () {\n model.initialized = true;\n publicAPI.enable();\n publicAPI.render();\n };\n\n publicAPI.enable = function () {\n return publicAPI.setEnabled(true);\n };\n\n publicAPI.disable = function () {\n return publicAPI.setEnabled(false);\n };\n\n publicAPI.startEventLoop = function () {\n return vtkWarningMacro('empty event loop');\n };\n\n function updateCurrentRenderer(x, y) {\n if (!model._forcedRenderer) {\n model.currentRenderer = publicAPI.findPokedRenderer(x, y);\n }\n }\n\n publicAPI.getCurrentRenderer = function () {\n if (model.currentRenderer) {\n return model.currentRenderer;\n }\n\n updateCurrentRenderer(0, 0);\n return model.currentRenderer;\n };\n\n function getScreenEventPositionFor(source) {\n var canvas = model._view.getCanvas();\n\n var bounds = canvas.getBoundingClientRect();\n var scaleX = canvas.width / bounds.width;\n var scaleY = canvas.height / bounds.height;\n var position = {\n x: scaleX * (source.clientX - bounds.left),\n y: scaleY * (bounds.height - source.clientY + bounds.top),\n z: 0\n }; // if multitouch, do not update the current renderer\n\n if (pointerCache.size <= 1 || !model.currentRenderer) {\n updateCurrentRenderer(position.x, position.y);\n }\n\n return position;\n }\n\n function getModifierKeysFor(event) {\n return {\n controlKey: event.ctrlKey,\n altKey: event.altKey,\n shiftKey: event.shiftKey\n };\n }\n\n function getKeysFor(event) {\n var modifierKeys = getModifierKeysFor(event);\n\n var keys = _objectSpread({\n key: event.key,\n keyCode: event.charCode\n }, modifierKeys);\n\n return keys;\n }\n\n function getDeviceTypeFor(event) {\n return event.pointerType || '';\n }\n\n publicAPI.bindEvents = function (container) {\n model.container = container;\n container.addEventListener('contextmenu', preventDefault);\n container.addEventListener('wheel', publicAPI.handleWheel);\n container.addEventListener('DOMMouseScroll', publicAPI.handleWheel);\n container.addEventListener('pointerenter', publicAPI.handlePointerEnter);\n container.addEventListener('pointerleave', publicAPI.handlePointerLeave);\n container.addEventListener('pointermove', publicAPI.handlePointerMove, {\n passive: false\n });\n container.addEventListener('pointerdown', publicAPI.handlePointerDown, {\n passive: false\n });\n container.addEventListener('pointerup', publicAPI.handlePointerUp);\n container.addEventListener('pointercancel', publicAPI.handlePointerCancel);\n document.addEventListener('keypress', publicAPI.handleKeyPress);\n document.addEventListener('keydown', publicAPI.handleKeyDown);\n document.addEventListener('keyup', publicAPI.handleKeyUp);\n document.addEventListener('pointerlockchange', publicAPI.handlePointerLockChange); // using touchAction is more performant than preventDefault\n // in a touchstart handler.\n\n container.style.touchAction = 'none';\n container.style.userSelect = 'none'; // disables tap highlight for when cursor is pointer\n\n container.style.webkitTapHighlightColor = 'rgba(0,0,0,0)';\n };\n\n publicAPI.unbindEvents = function () {\n var container = model.container;\n container.removeEventListener('contextmenu', preventDefault);\n container.removeEventListener('wheel', publicAPI.handleWheel);\n container.removeEventListener('DOMMouseScroll', publicAPI.handleWheel);\n container.removeEventListener('pointerenter', publicAPI.handlePointerEnter);\n container.removeEventListener('pointerleave', publicAPI.handlePointerLeave);\n container.removeEventListener('pointermove', publicAPI.handlePointerMove, {\n passive: false\n });\n container.removeEventListener('pointerdown', publicAPI.handlePointerDown, {\n passive: false\n });\n container.removeEventListener('pointerup', publicAPI.handlePointerUp);\n container.removeEventListener('pointercancel', publicAPI.handlePointerCancel);\n document.removeEventListener('keypress', publicAPI.handleKeyPress);\n document.removeEventListener('keydown', publicAPI.handleKeyDown);\n document.removeEventListener('keyup', publicAPI.handleKeyUp);\n document.removeEventListener('pointerlockchange', publicAPI.handlePointerLockChange);\n model.container = null;\n pointerCache.clear();\n };\n\n publicAPI.handleKeyPress = function (event) {\n var data = getKeysFor(event);\n publicAPI.keyPressEvent(data);\n };\n\n publicAPI.handleKeyDown = function (event) {\n var data = getKeysFor(event);\n publicAPI.keyDownEvent(data);\n };\n\n publicAPI.handleKeyUp = function (event) {\n var data = getKeysFor(event);\n publicAPI.keyUpEvent(data);\n };\n\n publicAPI.handlePointerEnter = function (event) {\n var callData = _objectSpread(_objectSpread({}, getModifierKeysFor(event)), {}, {\n position: getScreenEventPositionFor(event),\n deviceType: getDeviceTypeFor(event)\n });\n\n publicAPI.pointerEnterEvent(callData);\n\n if (callData.deviceType === 'mouse') {\n publicAPI.mouseEnterEvent(callData);\n }\n };\n\n publicAPI.handlePointerLeave = function (event) {\n var callData = _objectSpread(_objectSpread({}, getModifierKeysFor(event)), {}, {\n position: getScreenEventPositionFor(event),\n deviceType: getDeviceTypeFor(event)\n });\n\n publicAPI.pointerLeaveEvent(callData);\n\n if (callData.deviceType === 'mouse') {\n publicAPI.mouseLeaveEvent(callData);\n }\n };\n\n publicAPI.handlePointerDown = function (event) {\n if (event.button > 2 || publicAPI.isPointerLocked()) {\n // ignore events from extra mouse buttons such as `back` and `forward`\n return;\n }\n\n if (model.preventDefaultOnPointerDown) {\n preventDefault(event);\n }\n\n if (event.target.hasPointerCapture(event.pointerId)) {\n event.target.releasePointerCapture(event.pointerId);\n }\n\n model.container.setPointerCapture(event.pointerId);\n\n if (pointerCache.has(event.pointerId)) {\n vtkWarningMacro('[RenderWindowInteractor] duplicate pointerId detected');\n }\n\n pointerCache.set(event.pointerId, {\n pointerId: event.pointerId,\n position: getScreenEventPositionFor(event)\n });\n\n switch (event.pointerType) {\n case 'pen':\n case 'touch':\n publicAPI.handleTouchStart(event);\n break;\n\n case 'mouse':\n default:\n publicAPI.handleMouseDown(event);\n break;\n }\n };\n\n publicAPI.handlePointerUp = function (event) {\n if (pointerCache.has(event.pointerId)) {\n if (model.preventDefaultOnPointerUp) {\n preventDefault(event);\n }\n\n pointerCache.delete(event.pointerId);\n model.container.releasePointerCapture(event.pointerId);\n\n switch (event.pointerType) {\n case 'pen':\n case 'touch':\n publicAPI.handleTouchEnd(event);\n break;\n\n case 'mouse':\n default:\n publicAPI.handleMouseUp(event);\n break;\n }\n }\n };\n\n publicAPI.handlePointerCancel = function (event) {\n if (pointerCache.has(event.pointerId)) {\n pointerCache.delete(event.pointerId);\n\n switch (event.pointerType) {\n case 'pen':\n case 'touch':\n publicAPI.handleTouchEnd(event);\n break;\n\n case 'mouse':\n default:\n publicAPI.handleMouseUp(event);\n break;\n }\n }\n };\n\n publicAPI.handlePointerMove = function (event) {\n if (pointerCache.has(event.pointerId)) {\n var pointer = pointerCache.get(event.pointerId);\n pointer.position = getScreenEventPositionFor(event);\n }\n\n switch (event.pointerType) {\n case 'pen':\n case 'touch':\n publicAPI.handleTouchMove(event);\n break;\n\n case 'mouse':\n default:\n publicAPI.handleMouseMove(event);\n break;\n }\n };\n\n publicAPI.handleMouseDown = function (event) {\n var callData = _objectSpread(_objectSpread({}, getModifierKeysFor(event)), {}, {\n position: getScreenEventPositionFor(event),\n deviceType: getDeviceTypeFor(event)\n });\n\n switch (event.button) {\n case 0:\n publicAPI.leftButtonPressEvent(callData);\n break;\n\n case 1:\n publicAPI.middleButtonPressEvent(callData);\n break;\n\n case 2:\n publicAPI.rightButtonPressEvent(callData);\n break;\n\n default:\n vtkErrorMacro(\"Unknown mouse button pressed: \".concat(event.button));\n break;\n }\n }; //----------------------------------------------------------------------\n\n\n publicAPI.requestPointerLock = function () {\n if (model.container) {\n model.container.requestPointerLock();\n }\n }; //----------------------------------------------------------------------\n\n\n publicAPI.exitPointerLock = function () {\n return document.exitPointerLock();\n }; //----------------------------------------------------------------------\n\n\n publicAPI.isPointerLocked = function () {\n return !!model.container && document.pointerLockElement === model.container;\n }; //----------------------------------------------------------------------\n\n\n publicAPI.handlePointerLockChange = function () {\n if (publicAPI.isPointerLocked()) {\n publicAPI.startPointerLockEvent();\n } else {\n publicAPI.endPointerLockEvent();\n }\n }; //----------------------------------------------------------------------\n\n\n function forceRender() {\n if (model._view && model.enabled && model.enableRender) {\n model.inRender = true;\n\n model._view.traverseAllPasses();\n\n model.inRender = false;\n } // outside the above test so that third-party code can redirect\n // the render to the appropriate class\n\n\n publicAPI.invokeRenderEvent();\n }\n\n publicAPI.requestAnimation = function (requestor) {\n if (requestor === undefined) {\n vtkErrorMacro(\"undefined requester, can not start animating\");\n return;\n }\n\n if (animationRequesters.has(requestor)) {\n vtkWarningMacro(\"requester is already registered for animating\");\n return;\n }\n\n animationRequesters.add(requestor);\n\n if (!model.animationRequest && animationRequesters.size === 1 && !model.xrAnimation) {\n model._animationStartTime = Date.now();\n model._animationFrameCount = 0;\n model.animationRequest = requestAnimationFrame(publicAPI.handleAnimation);\n publicAPI.startAnimationEvent();\n }\n }; // continue animating for at least the specified duration of\n // milliseconds.\n\n\n publicAPI.extendAnimation = function (duration) {\n var newEnd = Date.now() + duration;\n model._animationExtendedEnd = Math.max(model._animationExtendedEnd, newEnd);\n\n if (!model.animationRequest && animationRequesters.size === 0 && !model.xrAnimation) {\n model._animationStartTime = Date.now();\n model._animationFrameCount = 0;\n model.animationRequest = requestAnimationFrame(publicAPI.handleAnimation);\n publicAPI.startAnimationEvent();\n }\n };\n\n publicAPI.isAnimating = function () {\n return model.xrAnimation || model.animationRequest !== null;\n };\n\n publicAPI.cancelAnimation = function (requestor) {\n var skipWarning = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (!animationRequesters.has(requestor)) {\n if (!skipWarning) {\n var requestStr = requestor && requestor.getClassName ? requestor.getClassName() : requestor;\n vtkWarningMacro(\"\".concat(requestStr, \" did not request an animation\"));\n }\n\n return;\n }\n\n animationRequesters.delete(requestor);\n\n if (model.animationRequest && animationRequesters.size === 0 && Date.now() > model._animationExtendedEnd) {\n cancelAnimationFrame(model.animationRequest);\n model.animationRequest = null;\n publicAPI.endAnimationEvent();\n publicAPI.render();\n }\n };\n\n publicAPI.switchToXRAnimation = function () {\n // cancel existing animation if any\n if (model.animationRequest) {\n cancelAnimationFrame(model.animationRequest);\n model.animationRequest = null;\n }\n\n model.xrAnimation = true;\n };\n\n publicAPI.returnFromXRAnimation = function () {\n model.xrAnimation = false;\n\n if (animationRequesters.size !== 0) {\n model.recentAnimationFrameRate = 10.0;\n model.animationRequest = requestAnimationFrame(publicAPI.handleAnimation);\n }\n };\n\n publicAPI.updateXRGamepads = function (xrSession, xrFrame, xrRefSpace) {\n // watch for when buttons change state and fire events\n xrSession.inputSources.forEach(function (inputSource) {\n var gripPose = inputSource.gripSpace == null ? null : xrFrame.getPose(inputSource.gripSpace, xrRefSpace);\n var gp = inputSource.gamepad;\n var hand = inputSource.handedness;\n\n if (gp) {\n if (!(gp.index in model.lastGamepadValues)) {\n model.lastGamepadValues[gp.index] = {\n left: {\n buttons: {}\n },\n right: {\n buttons: {}\n },\n none: {\n buttons: {}\n }\n };\n }\n\n for (var b = 0; b < gp.buttons.length; ++b) {\n if (!(b in model.lastGamepadValues[gp.index][hand].buttons)) {\n model.lastGamepadValues[gp.index][hand].buttons[b] = false;\n }\n\n if (model.lastGamepadValues[gp.index][hand].buttons[b] !== gp.buttons[b].pressed && gripPose != null) {\n publicAPI.button3DEvent({\n gamepad: gp,\n position: gripPose.transform.position,\n orientation: gripPose.transform.orientation,\n pressed: gp.buttons[b].pressed,\n device: inputSource.handedness === 'left' ? Device.LeftController : Device.RightController,\n input: deviceInputMap[gp.mapping] && deviceInputMap[gp.mapping][b] ? deviceInputMap[gp.mapping][b] : Input.Trigger\n });\n model.lastGamepadValues[gp.index][hand].buttons[b] = gp.buttons[b].pressed;\n }\n\n if (model.lastGamepadValues[gp.index][hand].buttons[b] && gripPose != null) {\n publicAPI.move3DEvent({\n gamepad: gp,\n position: gripPose.transform.position,\n orientation: gripPose.transform.orientation,\n device: inputSource.handedness === 'left' ? Device.LeftController : Device.RightController\n });\n }\n }\n }\n });\n };\n\n publicAPI.handleMouseMove = function (event) {\n var callData = _objectSpread(_objectSpread({}, getModifierKeysFor(event)), {}, {\n position: getScreenEventPositionFor(event),\n deviceType: getDeviceTypeFor(event)\n });\n\n if (model.moveTimeoutID === 0) {\n publicAPI.startMouseMoveEvent(callData);\n } else {\n publicAPI.mouseMoveEvent(callData);\n clearTimeout(model.moveTimeoutID);\n } // start a timer to keep us animating while we get mouse move events\n\n\n model.moveTimeoutID = setTimeout(function () {\n publicAPI.endMouseMoveEvent();\n model.moveTimeoutID = 0;\n }, 200);\n };\n\n publicAPI.handleAnimation = function () {\n var currTime = Date.now();\n model._animationFrameCount++;\n\n if (currTime - model._animationStartTime > 1000.0 && model._animationFrameCount > 1) {\n model.recentAnimationFrameRate = 1000.0 * (model._animationFrameCount - 1) / (currTime - model._animationStartTime);\n model.lastFrameTime = 1.0 / model.recentAnimationFrameRate;\n publicAPI.animationFrameRateUpdateEvent();\n model._animationStartTime = currTime;\n model._animationFrameCount = 1;\n }\n\n publicAPI.animationEvent();\n forceRender();\n\n if (animationRequesters.size > 0 || Date.now() < model._animationExtendedEnd) {\n model.animationRequest = requestAnimationFrame(publicAPI.handleAnimation);\n } else {\n cancelAnimationFrame(model.animationRequest);\n model.animationRequest = null;\n publicAPI.endAnimationEvent();\n publicAPI.render();\n }\n };\n\n publicAPI.handleWheel = function (event) {\n preventDefault(event);\n /**\n * wheel event values can vary significantly across browsers, platforms\n * and devices [1]. `normalizeWheel` uses facebook's solution from their\n * fixed-data-table repository [2].\n *\n * [1] https://developer.mozilla.org/en-US/docs/Web/Events/mousewheel\n * [2] https://github.com/facebookarchive/fixed-data-table/blob/master/src/vendor_upstream/dom/normalizeWheel.js\n *\n * This code will return an object with properties:\n *\n * spinX -- normalized spin speed (use for zoom) - x plane\n * spinY -- \" - y plane\n * pixelX -- normalized distance (to pixels) - x plane\n * pixelY -- \" - y plane\n *\n */\n\n var callData = _objectSpread(_objectSpread(_objectSpread({}, normalizeWheel(event)), getModifierKeysFor(event)), {}, {\n position: getScreenEventPositionFor(event),\n deviceType: getDeviceTypeFor(event)\n }); // Wheel events are thought to scroll pages (i.e. multiple lines at once).\n // See normalizeWheel() documentation for more context.\n // While trackpad wheel events are many small (<1) wheel spins,\n // mouse wheel events have absolute spin values higher than 1.\n // Here the first spin value is \"recorded\", and used to normalize\n // all the following mouse wheel events.\n\n\n if (model.wheelTimeoutID === 0) {\n // we attempt to distinguish between trackpads and mice\n // .3 will be larger than the first trackpad event,\n // but small enough to detect some common edge case mice\n if (Math.abs(callData.spinY) >= 0.3) {\n // Event is coming from mouse wheel\n wheelCoefficient = Math.abs(callData.spinY);\n } else {\n // Event is coming from trackpad\n wheelCoefficient = 1;\n }\n }\n\n callData.spinY /= wheelCoefficient;\n\n if (model.wheelTimeoutID === 0) {\n publicAPI.startMouseWheelEvent(callData);\n publicAPI.mouseWheelEvent(callData);\n } else {\n publicAPI.mouseWheelEvent(callData);\n clearTimeout(model.wheelTimeoutID);\n }\n\n if (model.mouseScrollDebounceByPass) {\n publicAPI.extendAnimation(600);\n publicAPI.endMouseWheelEvent();\n model.wheelTimeoutID = 0;\n } else {\n // start a timer to keep us animating while we get wheel events\n model.wheelTimeoutID = setTimeout(function () {\n publicAPI.extendAnimation(600);\n publicAPI.endMouseWheelEvent();\n model.wheelTimeoutID = 0;\n }, 200);\n }\n };\n\n publicAPI.handleMouseUp = function (event) {\n var callData = _objectSpread(_objectSpread({}, getModifierKeysFor(event)), {}, {\n position: getScreenEventPositionFor(event),\n deviceType: getDeviceTypeFor(event)\n });\n\n switch (event.button) {\n case 0:\n publicAPI.leftButtonReleaseEvent(callData);\n break;\n\n case 1:\n publicAPI.middleButtonReleaseEvent(callData);\n break;\n\n case 2:\n publicAPI.rightButtonReleaseEvent(callData);\n break;\n\n default:\n vtkErrorMacro(\"Unknown mouse button released: \".concat(event.button));\n break;\n }\n };\n\n publicAPI.handleTouchStart = function (event) {\n var pointers = _toConsumableArray(pointerCache.values()); // If multitouch\n\n\n if (model.recognizeGestures && pointers.length > 1) {\n var positions = pointerCacheToPositions(pointerCache); // did we just transition to multitouch?\n\n if (pointers.length === 2) {\n var callData = _objectSpread(_objectSpread({}, getModifierKeysFor(EMPTY_MOUSE_EVENT)), {}, {\n position: pointers[0].position,\n deviceType: getDeviceTypeFor(event)\n });\n\n publicAPI.leftButtonReleaseEvent(callData);\n } // handle the gesture\n\n\n publicAPI.recognizeGesture('TouchStart', positions);\n } else if (pointers.length === 1) {\n var _callData = _objectSpread(_objectSpread({}, getModifierKeysFor(EMPTY_MOUSE_EVENT)), {}, {\n position: getScreenEventPositionFor(event),\n deviceType: getDeviceTypeFor(event)\n });\n\n publicAPI.leftButtonPressEvent(_callData);\n }\n };\n\n publicAPI.handleTouchMove = function (event) {\n var pointers = _toConsumableArray(pointerCache.values());\n\n if (model.recognizeGestures && pointers.length > 1) {\n var positions = pointerCacheToPositions(pointerCache);\n publicAPI.recognizeGesture('TouchMove', positions);\n } else if (pointers.length === 1) {\n var callData = _objectSpread(_objectSpread({}, getModifierKeysFor(EMPTY_MOUSE_EVENT)), {}, {\n position: pointers[0].position,\n deviceType: getDeviceTypeFor(event)\n });\n\n publicAPI.mouseMoveEvent(callData);\n }\n };\n\n publicAPI.handleTouchEnd = function (event) {\n var pointers = _toConsumableArray(pointerCache.values());\n\n if (model.recognizeGestures) {\n // No more fingers down\n if (pointers.length === 0) {\n var callData = _objectSpread(_objectSpread({}, getModifierKeysFor(EMPTY_MOUSE_EVENT)), {}, {\n position: getScreenEventPositionFor(event),\n deviceType: getDeviceTypeFor(event)\n });\n\n publicAPI.leftButtonReleaseEvent(callData);\n } else if (pointers.length === 1) {\n // If one finger left, end touch and start button press\n var positions = pointerCacheToPositions(pointerCache);\n publicAPI.recognizeGesture('TouchEnd', positions);\n\n var _callData2 = _objectSpread(_objectSpread({}, getModifierKeysFor(EMPTY_MOUSE_EVENT)), {}, {\n position: pointers[0].position,\n deviceType: getDeviceTypeFor(event)\n });\n\n publicAPI.leftButtonPressEvent(_callData2);\n } else {\n // If more than one finger left, keep touch move\n var _positions = pointerCacheToPositions(pointerCache);\n\n publicAPI.recognizeGesture('TouchMove', _positions);\n }\n } else if (pointers.length === 1) {\n var _callData3 = _objectSpread(_objectSpread({}, getModifierKeysFor(EMPTY_MOUSE_EVENT)), {}, {\n position: pointers[0].position,\n deviceType: getDeviceTypeFor(event)\n });\n\n publicAPI.leftButtonReleaseEvent(_callData3);\n }\n };\n\n publicAPI.setView = function (val) {\n if (model._view === val) {\n return;\n }\n\n model._view = val;\n\n model._view.getRenderable().setInteractor(publicAPI);\n\n publicAPI.modified();\n };\n\n publicAPI.getFirstRenderer = function () {\n var _model$_view, _model$_view$getRende, _model$_view$getRende2;\n\n return (_model$_view = model._view) === null || _model$_view === void 0 ? void 0 : (_model$_view$getRende = _model$_view.getRenderable()) === null || _model$_view$getRende === void 0 ? void 0 : (_model$_view$getRende2 = _model$_view$getRende.getRenderersByReference()) === null || _model$_view$getRende2 === void 0 ? void 0 : _model$_view$getRende2[0];\n };\n\n publicAPI.findPokedRenderer = function () {\n var _model$_view2, _model$_view2$getRend;\n\n var x = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var y = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\n if (!model._view) {\n return null;\n } // The original order of renderers needs to remain as\n // the first one is the one we want to manipulate the camera on.\n\n\n var rc = (_model$_view2 = model._view) === null || _model$_view2 === void 0 ? void 0 : (_model$_view2$getRend = _model$_view2.getRenderable()) === null || _model$_view2$getRend === void 0 ? void 0 : _model$_view2$getRend.getRenderers();\n\n if (!rc || rc.length === 0) {\n return null;\n }\n\n rc.sort(function (a, b) {\n return a.getLayer() - b.getLayer();\n });\n var interactiveren = null;\n var viewportren = null;\n var currentRenderer = null;\n var count = rc.length;\n\n while (count--) {\n var aren = rc[count];\n\n if (model._view.isInViewport(x, y, aren) && aren.getInteractive()) {\n currentRenderer = aren;\n break;\n }\n\n if (interactiveren === null && aren.getInteractive()) {\n // Save this renderer in case we can't find one in the viewport that\n // is interactive.\n interactiveren = aren;\n }\n\n if (viewportren === null && model._view.isInViewport(x, y, aren)) {\n // Save this renderer in case we can't find one in the viewport that\n // is interactive.\n viewportren = aren;\n }\n } // We must have a value. If we found an interactive renderer before, that's\n // better than a non-interactive renderer.\n\n\n if (currentRenderer === null) {\n currentRenderer = interactiveren;\n } // We must have a value. If we found a renderer that is in the viewport,\n // that is better than any old viewport (but not as good as an interactive\n // one).\n\n\n if (currentRenderer === null) {\n currentRenderer = viewportren;\n } // We must have a value - take anything.\n\n\n if (currentRenderer == null) {\n currentRenderer = rc[0];\n }\n\n return currentRenderer;\n }; // only render if we are not animating. If we are animating\n // then renders will happen naturally anyhow and we definitely\n // do not want extra renders as the make the apparent interaction\n // rate slower.\n\n\n publicAPI.render = function () {\n if (!publicAPI.isAnimating() && !model.inRender) {\n forceRender();\n }\n }; // create the generic Event methods\n\n\n handledEvents.forEach(function (eventName) {\n var lowerFirst = eventName.charAt(0).toLowerCase() + eventName.slice(1);\n\n publicAPI[\"\".concat(lowerFirst, \"Event\")] = function (arg) {\n // Check that interactor enabled\n if (!model.enabled) {\n return;\n } // Check that a poked renderer exists\n\n\n var renderer = publicAPI.getCurrentRenderer();\n\n if (!renderer) {\n vtkOnceErrorMacro(\"\\n Can not forward events without a current renderer on the interactor.\\n \");\n return;\n } // Pass the eventName and the poked renderer\n\n\n var callData = _objectSpread({\n type: eventName,\n pokedRenderer: model.currentRenderer,\n firstRenderer: publicAPI.getFirstRenderer()\n }, arg); // Call invoke\n\n\n publicAPI[\"invoke\".concat(eventName)](callData);\n };\n }); // we know we are in multitouch now, so start recognizing\n\n publicAPI.recognizeGesture = function (event, positions) {\n // more than two pointers we ignore\n if (Object.keys(positions).length > 2) {\n return;\n }\n\n if (!model.startingEventPositions) {\n model.startingEventPositions = {};\n } // store the initial positions\n\n\n if (event === 'TouchStart') {\n Object.keys(positions).forEach(function (key) {\n model.startingEventPositions[key] = positions[key];\n }); // we do not know what the gesture is yet\n\n model.currentGesture = 'Start';\n return;\n } // end the gesture if needed\n\n\n if (event === 'TouchEnd') {\n if (model.currentGesture === 'Pinch') {\n publicAPI.render();\n publicAPI.endPinchEvent();\n }\n\n if (model.currentGesture === 'Rotate') {\n publicAPI.render();\n publicAPI.endRotateEvent();\n }\n\n if (model.currentGesture === 'Pan') {\n publicAPI.render();\n publicAPI.endPanEvent();\n }\n\n model.currentGesture = 'Start';\n model.startingEventPositions = {};\n return;\n } // what are the two pointers we are working with\n\n\n var count = 0;\n var posVals = [];\n var startVals = [];\n Object.keys(positions).forEach(function (key) {\n posVals[count] = positions[key];\n startVals[count] = model.startingEventPositions[key];\n count++;\n }); // The meat of the algorithm\n // on move events we analyze them to determine what type\n // of movement it is and then deal with it.\n // calculate the distances\n\n var originalDistance = Math.sqrt((startVals[0].x - startVals[1].x) * (startVals[0].x - startVals[1].x) + (startVals[0].y - startVals[1].y) * (startVals[0].y - startVals[1].y));\n var newDistance = Math.sqrt((posVals[0].x - posVals[1].x) * (posVals[0].x - posVals[1].x) + (posVals[0].y - posVals[1].y) * (posVals[0].y - posVals[1].y)); // calculate rotations\n\n var originalAngle = degreesFromRadians(Math.atan2(startVals[1].y - startVals[0].y, startVals[1].x - startVals[0].x));\n var newAngle = degreesFromRadians(Math.atan2(posVals[1].y - posVals[0].y, posVals[1].x - posVals[0].x)); // angles are cyclic so watch for that, 1 and 359 are only 2 apart :)\n\n var angleDeviation = newAngle - originalAngle;\n newAngle = newAngle + 180.0 >= 360.0 ? newAngle - 180.0 : newAngle + 180.0;\n originalAngle = originalAngle + 180.0 >= 360.0 ? originalAngle - 180.0 : originalAngle + 180.0;\n\n if (Math.abs(newAngle - originalAngle) < Math.abs(angleDeviation)) {\n angleDeviation = newAngle - originalAngle;\n } // calculate the translations\n\n\n var trans = [];\n trans[0] = (posVals[0].x - startVals[0].x + posVals[1].x - startVals[1].x) / 2.0;\n trans[1] = (posVals[0].y - startVals[0].y + posVals[1].y - startVals[1].y) / 2.0;\n\n if (event === 'TouchMove') {\n // OK we want to\n // - immediately respond to the user\n // - allow the user to zoom without panning (saves focal point)\n // - allow the user to rotate without panning (saves focal point)\n // do we know what gesture we are doing yet? If not\n // see if we can figure it out\n if (model.currentGesture === 'Start') {\n // pinch is a move to/from the center point\n // rotate is a move along the circumference\n // pan is a move of the center point\n // compute the distance along each of these axes in pixels\n // the first to break thresh wins\n var thresh = 0.01 * Math.sqrt(model.container.clientWidth * model.container.clientWidth + model.container.clientHeight * model.container.clientHeight);\n\n if (thresh < 15.0) {\n thresh = 15.0;\n }\n\n var pinchDistance = Math.abs(newDistance - originalDistance);\n var rotateDistance = newDistance * 3.1415926 * Math.abs(angleDeviation) / 360.0;\n var panDistance = Math.sqrt(trans[0] * trans[0] + trans[1] * trans[1]);\n\n if (pinchDistance > thresh && pinchDistance > rotateDistance && pinchDistance > panDistance) {\n model.currentGesture = 'Pinch';\n var callData = {\n scale: 1.0,\n touches: positions\n };\n publicAPI.startPinchEvent(callData);\n } else if (rotateDistance > thresh && rotateDistance > panDistance) {\n model.currentGesture = 'Rotate';\n var _callData4 = {\n rotation: 0.0,\n touches: positions\n };\n publicAPI.startRotateEvent(_callData4);\n } else if (panDistance > thresh) {\n model.currentGesture = 'Pan';\n var _callData5 = {\n translation: [0, 0],\n touches: positions\n };\n publicAPI.startPanEvent(_callData5);\n }\n } else {\n // if we have found a specific type of movement then\n // handle it\n if (model.currentGesture === 'Rotate') {\n var _callData6 = {\n rotation: angleDeviation,\n touches: positions\n };\n publicAPI.rotateEvent(_callData6);\n }\n\n if (model.currentGesture === 'Pinch') {\n var _callData7 = {\n scale: newDistance / originalDistance,\n touches: positions\n };\n publicAPI.pinchEvent(_callData7);\n }\n\n if (model.currentGesture === 'Pan') {\n var _callData8 = {\n translation: trans,\n touches: positions\n };\n publicAPI.panEvent(_callData8);\n }\n }\n }\n };\n\n publicAPI.handleVisibilityChange = function () {\n model._animationStartTime = Date.now();\n model._animationFrameCount = 0;\n };\n\n publicAPI.setCurrentRenderer = function (r) {\n model._forcedRenderer = !!r;\n model.currentRenderer = r;\n }; // Stop animating if the renderWindowInteractor is deleted.\n\n\n var superDelete = publicAPI.delete;\n\n publicAPI.delete = function () {\n while (animationRequesters.size) {\n publicAPI.cancelAnimation(animationRequesters.values().next().value);\n }\n\n if (typeof document.hidden !== 'undefined') {\n document.removeEventListener('visibilitychange', publicAPI.handleVisibilityChange);\n }\n\n if (model.container) {\n publicAPI.unbindEvents();\n }\n\n superDelete();\n }; // Use the Page Visibility API to detect when we switch away from or back to\n // this tab, and reset the animationFrameStart. When tabs are not active, browsers\n // will stop calling requestAnimationFrame callbacks.\n\n\n if (typeof document.hidden !== 'undefined') {\n document.addEventListener('visibilitychange', publicAPI.handleVisibilityChange, false);\n }\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n renderWindow: null,\n interactorStyle: null,\n picker: null,\n pickingManager: null,\n initialized: false,\n enabled: false,\n enableRender: true,\n currentRenderer: null,\n lightFollowCamera: true,\n desiredUpdateRate: 30.0,\n stillUpdateRate: 2.0,\n container: null,\n // _view: null,\n recognizeGestures: true,\n currentGesture: 'Start',\n animationRequest: null,\n lastFrameTime: 0.1,\n recentAnimationFrameRate: 10.0,\n wheelTimeoutID: 0,\n moveTimeoutID: 0,\n lastGamepadValues: {},\n preventDefaultOnPointerDown: false,\n preventDefaultOnPointerUp: false,\n mouseScrollDebounceByPass: false\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Object methods\n\n macro.obj(publicAPI, model); // run animation at least until this time\n\n model._animationExtendedEnd = 0;\n macro.event(publicAPI, model, 'RenderEvent');\n handledEvents.forEach(function (eventName) {\n return macro.event(publicAPI, model, eventName);\n }); // Create get-only macros\n\n macro.get(publicAPI, model, ['initialized', 'container', 'interactorStyle', 'lastFrameTime', 'recentAnimationFrameRate', '_view']); // Create get-set macros\n\n macro.setGet(publicAPI, model, ['lightFollowCamera', 'enabled', 'enableRender', 'recognizeGestures', 'desiredUpdateRate', 'stillUpdateRate', 'picker', 'preventDefaultOnPointerDown', 'preventDefaultOnPointerUp', 'mouseScrollDebounceByPass']);\n macro.moveToProtected(publicAPI, model, ['view']); // For more macro methods, see \"Sources/macros.js\"\n // Object specific methods\n\n vtkRenderWindowInteractor(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkRenderWindowInteractor'); // ----------------------------------------------------------------------------\n\nvar vtkRenderWindowInteractor$1 = _objectSpread({\n newInstance: newInstance,\n extend: extend,\n handledEvents: handledEvents\n}, Constants);\n\nexport { vtkRenderWindowInteractor$1 as default, extend, newInstance };\n","import macro from '@kitware/vtk.js/macros';\nimport vtkStreamingOpenGLRenderWindow from './vtkStreamingOpenGLRenderWindow';\nimport vtkRenderer from '@kitware/vtk.js/Rendering/Core/Renderer';\nimport vtkRenderWindow from '@kitware/vtk.js/Rendering/Core/RenderWindow';\nimport vtkRenderWindowInteractor from '@kitware/vtk.js/Rendering/Core/RenderWindowInteractor';\n\n// Load basic classes for vtk() factory\nimport '@kitware/vtk.js/Common/Core/Points';\nimport '@kitware/vtk.js/Common/Core/DataArray';\nimport '@kitware/vtk.js/Common/DataModel/PolyData';\nimport '@kitware/vtk.js/Rendering/Core/Actor';\nimport '@kitware/vtk.js/Rendering/Core/Mapper';\n\n/**\n * vtkOffscreenMultiRenderWindow - A class to deal with offscreen rendering with multiple renderers.\n *\n * This class is based on the vtkGenericRenderWindow with two key differences:\n * - the vtkGenericRenderWindow had a renderer at the top level, with helpers to get it from the renderWindow.\n * although you could add more renderers, this gave special status to the first viewport. Which was confusing.\n * - When checking the size of the container element we no longer check the client size, as the canvas is offscreen.\n * - We aren't using interactor styles, so don't set one up.\n *\n * Additionally this class has some new helpers to easily add/associate renderers to different viewportIds.\n *\n *\n * @param {*} publicAPI The public API to extend\n * @param {*} model The private model to extend.\n */\nfunction vtkOffscreenMultiRenderWindow(publicAPI, model) {\n // Capture resize trigger method to remove from publicAPI\n const invokeResize = publicAPI.invokeResize;\n delete publicAPI.invokeResize;\n\n // VTK renderWindow. No renderers set by default\n model.renderWindow = vtkRenderWindow.newInstance();\n model.rendererMap = {};\n\n // OpenGLRenderWindow\n model.openGLRenderWindow = vtkStreamingOpenGLRenderWindow.newInstance();\n model.renderWindow.addView(model.openGLRenderWindow);\n\n // Interactor\n model.interactor = vtkRenderWindowInteractor.newInstance();\n model.interactor.setView(model.openGLRenderWindow);\n model.interactor.initialize();\n\n publicAPI.addRenderer = ({ viewport, id, background }) => {\n const renderer = vtkRenderer.newInstance({\n viewport,\n background: background || model.background,\n });\n\n model.renderWindow.addRenderer(renderer);\n model.rendererMap[id] = renderer;\n };\n\n publicAPI.destroy = () => {\n const rwi = model.renderWindow.getInteractor();\n rwi.delete();\n };\n\n publicAPI.removeRenderer = (id) => {\n const renderer = publicAPI.getRenderer(id);\n model.renderWindow.removeRenderer(renderer);\n renderer.delete();\n delete model.rendererMap[id];\n };\n\n publicAPI.getRenderer = (id) => {\n return model.rendererMap[id];\n };\n\n publicAPI.getRenderers = () => {\n const { rendererMap } = model;\n\n const renderers = Object.keys(rendererMap).map((id) => {\n return { id, renderer: rendererMap[id] };\n });\n\n return renderers;\n };\n\n // Handle window resize\n publicAPI.resize = () => {\n if (model.container) {\n // Don't use getBoundingClientRect() as in vtkGenericRenderWindow as is an offscreen canvas.\n const { width, height } = model.container;\n\n // Note: we do not scale by devicePixelRatio here because it has already\n // been done when adding the offscreenCanvas viewport representations\n model.openGLRenderWindow.setSize(Math.floor(width), Math.floor(height));\n invokeResize();\n model.renderWindow.render();\n }\n };\n\n // Handle DOM container relocation\n publicAPI.setContainer = (el) => {\n // Switch container\n model.container = el;\n model.openGLRenderWindow.setContainer(model.container);\n };\n\n // Properly release GL context\n publicAPI.delete = macro.chain(\n publicAPI.setContainer,\n publicAPI.destroy,\n model.openGLRenderWindow.delete,\n publicAPI.delete\n );\n\n publicAPI.resize();\n}\n\n// ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\nconst DEFAULT_VALUES = {\n background: [0.0, 0.0, 0.0],\n container: null,\n};\n\n// ----------------------------------------------------------------------------\n\nexport function extend(publicAPI, model, initialValues = {}) {\n Object.assign(model, DEFAULT_VALUES, initialValues);\n\n // Object methods\n macro.obj(publicAPI, model);\n macro.get(publicAPI, model, [\n 'renderWindow',\n 'openGLRenderWindow',\n 'interactor',\n 'container',\n ]);\n macro.event(publicAPI, model, 'resize');\n\n // Object specific methods\n vtkOffscreenMultiRenderWindow(publicAPI, model);\n}\n\n// ----------------------------------------------------------------------------\n\nexport const newInstance = macro.newInstance(extend);\n\n// ----------------------------------------------------------------------------\n\nexport default { newInstance, extend };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport macro from '../../macros.js';\nimport { N as createUninitializedBounds, C as clampValue, J as floor } from '../../Common/Core/Math/index.js';\nimport Constants from './VolumeMapper/Constants.js';\nimport vtkAbstractMapper from './AbstractMapper.js';\nimport vtkPiecewiseFunction from '../../Common/DataModel/PiecewiseFunction.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nvar BlendMode = Constants.BlendMode,\n FilterMode = Constants.FilterMode;\n\nfunction createRadonTransferFunction(firstAbsorbentMaterialHounsfieldValue, firstAbsorbentMaterialAbsorption, maxAbsorbentMaterialHounsfieldValue, maxAbsorbentMaterialAbsorption, outputTransferFunction) {\n var ofun = null;\n\n if (outputTransferFunction) {\n ofun = outputTransferFunction;\n ofun.removeAllPoints();\n } else {\n ofun = vtkPiecewiseFunction.newInstance();\n }\n\n ofun.addPointLong(-1024, 0, 1, 1); // air (i.e. material with no absorption)\n\n ofun.addPoint(firstAbsorbentMaterialHounsfieldValue, firstAbsorbentMaterialAbsorption);\n ofun.addPoint(maxAbsorbentMaterialHounsfieldValue, maxAbsorbentMaterialAbsorption);\n return ofun;\n} // ----------------------------------------------------------------------------\n// Static API\n// ----------------------------------------------------------------------------\n\n\nvar STATIC = {\n createRadonTransferFunction: createRadonTransferFunction\n}; // ----------------------------------------------------------------------------\n// vtkVolumeMapper methods\n// ----------------------------------------------------------------------------\n\nfunction vtkVolumeMapper(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkVolumeMapper');\n\n var superClass = _objectSpread({}, publicAPI);\n\n publicAPI.getBounds = function () {\n var input = publicAPI.getInputData();\n\n if (!input) {\n model.bounds = createUninitializedBounds();\n } else {\n if (!model.static) {\n publicAPI.update();\n }\n\n model.bounds = input.getBounds();\n }\n\n return model.bounds;\n };\n\n publicAPI.update = function () {\n publicAPI.getInputData();\n };\n\n publicAPI.setBlendModeToComposite = function () {\n publicAPI.setBlendMode(BlendMode.COMPOSITE_BLEND);\n };\n\n publicAPI.setBlendModeToMaximumIntensity = function () {\n publicAPI.setBlendMode(BlendMode.MAXIMUM_INTENSITY_BLEND);\n };\n\n publicAPI.setBlendModeToMinimumIntensity = function () {\n publicAPI.setBlendMode(BlendMode.MINIMUM_INTENSITY_BLEND);\n };\n\n publicAPI.setBlendModeToAverageIntensity = function () {\n publicAPI.setBlendMode(BlendMode.AVERAGE_INTENSITY_BLEND);\n };\n\n publicAPI.setBlendModeToAdditiveIntensity = function () {\n publicAPI.setBlendMode(BlendMode.ADDITIVE_INTENSITY_BLEND);\n };\n\n publicAPI.setBlendModeToRadonTransform = function () {\n publicAPI.setBlendMode(BlendMode.RADON_TRANSFORM_BLEND);\n };\n\n publicAPI.getBlendModeAsString = function () {\n return macro.enumToString(BlendMode, model.blendMode);\n };\n\n publicAPI.setAverageIPScalarRange = function (min, max) {\n console.warn('setAverageIPScalarRange is deprecated use setIpScalarRange');\n publicAPI.setIpScalarRange(min, max);\n };\n\n publicAPI.getFilterModeAsString = function () {\n return macro.enumToString(FilterMode, model.filterMode);\n };\n\n publicAPI.setFilterModeToOff = function () {\n publicAPI.setFilterMode(FilterMode.OFF);\n };\n\n publicAPI.setFilterModeToNormalized = function () {\n publicAPI.setFilterMode(FilterMode.NORMALIZED);\n };\n\n publicAPI.setFilterModeToRaw = function () {\n publicAPI.setFilterMode(FilterMode.RAW);\n };\n\n publicAPI.setGlobalIlluminationReach = function (gl) {\n return superClass.setGlobalIlluminationReach(clampValue(gl, 0.0, 1.0));\n };\n\n publicAPI.setVolumetricScatteringBlending = function (vsb) {\n return superClass.setVolumetricScatteringBlending(clampValue(vsb, 0.0, 1.0));\n };\n\n publicAPI.setVolumeShadowSamplingDistFactor = function (vsdf) {\n return superClass.setVolumeShadowSamplingDistFactor(vsdf >= 1.0 ? vsdf : 1.0);\n };\n\n publicAPI.setAnisotropy = function (at) {\n return superClass.setAnisotropy(clampValue(at, -0.99, 0.99));\n };\n\n publicAPI.setLAOKernelSize = function (ks) {\n return superClass.setLAOKernelSize(floor(clampValue(ks, 1, 32)));\n };\n\n publicAPI.setLAOKernelRadius = function (kr) {\n return superClass.setLAOKernelRadius(kr >= 1 ? kr : 1);\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n// TODO: what values to use for averageIPScalarRange to get GLSL to use max / min values like [-Math.inf, Math.inf]?\n\n\nvar DEFAULT_VALUES = {\n bounds: [1, -1, 1, -1, 1, -1],\n sampleDistance: 1.0,\n imageSampleDistance: 1.0,\n maximumSamplesPerRay: 1000,\n autoAdjustSampleDistances: true,\n blendMode: BlendMode.COMPOSITE_BLEND,\n ipScalarRange: [-1000000.0, 1000000.0],\n filterMode: FilterMode.OFF,\n // ignored by WebGL so no behavior change\n preferSizeOverAccuracy: false,\n // Whether to use halfFloat representation of float, when it is inaccurate\n computeNormalFromOpacity: false,\n // volume shadow parameters\n volumetricScatteringBlending: 0.0,\n globalIlluminationReach: 0.0,\n volumeShadowSamplingDistFactor: 5.0,\n anisotropy: 0.0,\n // local ambient occlusion\n localAmbientOcclusion: false,\n LAOKernelSize: 15,\n LAOKernelRadius: 7\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues);\n vtkAbstractMapper.extend(publicAPI, model, initialValues);\n macro.setGet(publicAPI, model, ['sampleDistance', 'imageSampleDistance', 'maximumSamplesPerRay', 'autoAdjustSampleDistances', 'blendMode', 'filterMode', 'preferSizeOverAccuracy', 'computeNormalFromOpacity', 'volumetricScatteringBlending', 'globalIlluminationReach', 'volumeShadowSamplingDistFactor', 'anisotropy', 'localAmbientOcclusion', 'LAOKernelSize', 'LAOKernelRadius']);\n macro.setGetArray(publicAPI, model, ['ipScalarRange'], 2);\n macro.event(publicAPI, model, 'lightingActivated'); // Object methods\n\n vtkVolumeMapper(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkVolumeMapper'); // ----------------------------------------------------------------------------\n\nvar vtkVolumeMapper$1 = _objectSpread({\n newInstance: newInstance,\n extend: extend\n}, STATIC);\n\nexport { STATIC, vtkVolumeMapper$1 as default, extend, newInstance };\n","import macro from '@kitware/vtk.js/macros';\nimport vtkVolumeMapper from '@kitware/vtk.js/Rendering/Core/VolumeMapper';\n\n/**\n * vtkSharedVolumeMapper - A derived class of the core vtkVolumeMapper class\n * the scalar texture in as an argument. This is so we can share the same texture\n * memory across different mappers/actors, so we don't duplicate memory usage.\n *\n *\n *\n * @param {*} publicAPI The public API to extend\n * @param {*} model The private model to extend.\n * @hidden\n */\nfunction vtkSharedVolumeMapper(publicAPI, model) {\n model.classHierarchy.push('vtkSharedVolumeMapper');\n\n const superDelete = publicAPI.delete;\n publicAPI.delete = () => {\n model.scalarTexture = null;\n superDelete();\n };\n}\n\n// ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n// ----------------------------------------------------------------------------\n\nconst DEFAULT_VALUES = {\n scalarTexture: null,\n};\n\nexport function extend(publicAPI, model, initialValues = {}) {\n Object.assign(model, DEFAULT_VALUES, initialValues);\n\n vtkVolumeMapper.extend(publicAPI, model, initialValues);\n\n macro.setGet(publicAPI, model, ['scalarTexture']);\n\n // Object methods\n vtkSharedVolumeMapper(publicAPI, model);\n}\n\n// ----------------------------------------------------------------------------\n\nexport const newInstance = macro.newInstance(extend, 'vtkSharedVolumeMapper');\n\n// ----------------------------------------------------------------------------\n\nexport default { newInstance, extend };\n","import macro from '@kitware/vtk.js/macros';\nimport vtkOpenGLTexture from '@kitware/vtk.js/Rendering/OpenGL/Texture';\nimport HalfFloat from '@kitware/vtk.js/Common/Core/HalfFloat';\nimport { getConfiguration } from '../../init';\n\n/**\n * vtkStreamingOpenGLTexture - A dervied class of the core vtkOpenGLTexture.\n * This class has methods to update the texture memory on the GPU slice by slice\n * in an efficient yet GPU-architecture friendly manner.\n *\n *\n * @param {*} publicAPI The public API to extend\n * @param {*} model The private model to extend.\n */\nfunction vtkStreamingOpenGLTexture(publicAPI, model) {\n model.classHierarchy.push('vtkStreamingOpenGLTexture');\n\n const superCreate3DFilterableFromRaw = publicAPI.create3DFilterableFromRaw;\n\n publicAPI.create3DFilterableFromRaw = (\n width,\n height,\n depth,\n numComps,\n dataType,\n data,\n preferSizeOverAccuracy\n ) => {\n model.inputDataType = dataType;\n model.inputNumComps = numComps;\n\n superCreate3DFilterableFromRaw(\n width,\n height,\n depth,\n numComps,\n dataType,\n data,\n preferSizeOverAccuracy\n );\n };\n\n /**\n * This function updates the GPU texture memory to match the current\n * representation of data held in RAM.\n *\n * @param {Float32Array|Uint8Array|Int16Array|Uint16Array} data The data array which has been updated.\n */\n publicAPI.update3DFromRaw = (data) => {\n const { updatedFrames } = model;\n\n if (!updatedFrames.length) {\n return;\n }\n model._openGLRenderWindow.activateTexture(publicAPI);\n publicAPI.createTexture();\n publicAPI.bind();\n\n let bytesPerVoxel;\n let TypedArrayConstructor;\n\n if (data instanceof Uint8Array) {\n bytesPerVoxel = 1;\n TypedArrayConstructor = Uint8Array;\n } else if (data instanceof Int16Array) {\n bytesPerVoxel = 2;\n TypedArrayConstructor = Int16Array;\n } else if (data instanceof Uint16Array) {\n bytesPerVoxel = 2;\n TypedArrayConstructor = Uint16Array;\n } else if (data instanceof Float32Array) {\n bytesPerVoxel = 4;\n TypedArrayConstructor = Float32Array;\n } else {\n throw new Error(`No support for given TypedArray.`);\n }\n\n for (let i = 0; i < updatedFrames.length; i++) {\n if (updatedFrames[i]) {\n model.fillSubImage3D(data, i, bytesPerVoxel, TypedArrayConstructor);\n }\n }\n\n // Reset updatedFrames\n model.updatedFrames = [];\n\n if (model.generateMipmap) {\n model.context.generateMipmap(model.target);\n }\n\n publicAPI.deactivate();\n return true;\n };\n\n /**\n * This function updates the GPU texture memory to match the current\n * representation of data held in RAM.\n *\n * @param {Float32Array|Uint8Array} data The data array which has been updated.\n * @param {number} frameIndex The frame to load in.\n * @param {number} BytesPerVoxel The number of bytes per voxel in the data, so we don't have to constantly\n * check the array type.\n * @param {object} TypedArrayConstructor The constructor for the array type. Again so we don't have to constantly check.\n */\n model.fillSubImage3D = (\n data,\n frameIndex,\n bytesPerVoxel,\n TypedArrayConstructor\n ) => {\n const buffer = data.buffer;\n\n const frameLength = model.width * model.height;\n const frameLengthInBytes = frameLength * model.components * bytesPerVoxel;\n\n const zOffset = frameIndex * frameLengthInBytes;\n const rowLength = model.width * model.components;\n\n const gl = model.context;\n\n /**\n * It appears that the implementation of texSubImage3D uses 2D textures to do the texture copy if\n * MAX_TEXTURE_SIZE is greater than MAX_TEXTURE_SIZE_3D. As such if you make a single block too big\n * the transfer messes up cleanly and you render a black box or some data if you are lucky.\n *\n * This block-size based on 2D texture size seems like the safest approach that should work on most systems.\n *\n * There are certainly further optimizations that could be done here, we can do bigger chunks with other systems\n * But we need to find the _exact_ criteria. And then its not even guaranteed it'll be much faster.\n */\n const MAX_TEXTURE_SIZE = gl.getParameter(gl.MAX_TEXTURE_SIZE);\n let blockHeight = Math.floor(\n (bytesPerVoxel * MAX_TEXTURE_SIZE) / model.width\n );\n\n // Cap to actual frame height:\n blockHeight = Math.min(blockHeight, model.height);\n const { useNorm16Texture, preferSizeOverAccuracy } =\n getConfiguration().rendering;\n // TODO: there is currently a bug in chrome and safari which requires\n // blockheight = 1 for norm16 textures:\n // https://bugs.chromium.org/p/chromium/issues/detail?id=1408247\n // https://bugs.webkit.org/show_bug.cgi?id=252039\n if (useNorm16Texture && !preferSizeOverAccuracy) {\n blockHeight = 1;\n }\n\n const multiRowBlockLength = rowLength * blockHeight;\n const multiRowBlockLengthInBytes = multiRowBlockLength * bytesPerVoxel;\n\n const normalBlocks = Math.floor(model.height / blockHeight);\n\n const lastBlockHeight = model.height % blockHeight;\n const multiRowLastBlockLength = rowLength * lastBlockHeight;\n\n // Perform most blocks.\n for (let block = 0; block < normalBlocks; block++) {\n const yOffset = block * blockHeight;\n\n let dataView = new TypedArrayConstructor(\n buffer,\n zOffset + block * multiRowBlockLengthInBytes,\n multiRowBlockLength\n );\n\n if (\n model.useHalfFloat &&\n (TypedArrayConstructor === Uint16Array ||\n TypedArrayConstructor === Int16Array)\n ) {\n // in the case we want to use halfFloat rendering (preferSizeOverAccuracy = true),\n // we need to convert uint16 and int16 into fp16 format.\n // This is the step where precision is lost for streaming volume viewport.\n for (let idx = 0; idx < dataView.length; idx++) {\n dataView[idx] = HalfFloat.toHalf(dataView[idx]);\n }\n if (TypedArrayConstructor === Int16Array) {\n dataView = new Uint16Array(dataView);\n }\n }\n\n gl.texSubImage3D(\n model.target, // target\n 0, // mipMap level (always zero)\n 0, // xOffset\n yOffset, // yOffset\n frameIndex,\n model.width,\n blockHeight, //model.height,\n 1, // numFramesInBlock,\n model.format,\n model.openGLDataType,\n dataView\n );\n }\n\n // perform last block if present\n\n if (lastBlockHeight !== 0) {\n const yOffset = normalBlocks * blockHeight;\n\n // Dataview of last block\n const dataView = new TypedArrayConstructor(\n buffer,\n zOffset + normalBlocks * multiRowBlockLengthInBytes,\n multiRowLastBlockLength\n );\n\n gl.texSubImage3D(\n model.target, // target\n 0, // mipMap level (always zero)\n 0, // xOffset\n yOffset, // yOffset\n frameIndex,\n model.width,\n lastBlockHeight, //model.height,\n 1, // numFramesInBlock,\n model.format,\n model.openGLDataType,\n dataView\n );\n }\n };\n\n publicAPI.getTextureParameters = () => {\n return {\n width: model.width,\n height: model.height,\n depth: model.depth,\n numComps: model.inputNumComps,\n dataType: model.inputDataType,\n };\n };\n\n /**\n * Called when a frame is loaded so that on next render we know which data to load in.\n * @param {number} frameIndex The frame to load in.\n */\n publicAPI.setUpdatedFrame = (frameIndex) => {\n model.updatedFrames[frameIndex] = true;\n };\n}\n\n// ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n// ----------------------------------------------------------------------------\n\nconst DEFAULT_VALUES = {\n updatedFrames: [],\n};\n\nexport function extend(publicAPI, model, initialValues = {}) {\n Object.assign(model, DEFAULT_VALUES, initialValues);\n\n vtkOpenGLTexture.extend(publicAPI, model, initialValues);\n\n // Object methods\n vtkStreamingOpenGLTexture(publicAPI, model);\n}\n\n// ----------------------------------------------------------------------------\n\nexport const newInstance = macro.newInstance(\n extend,\n 'vtkStreamingOpenGLTexture'\n);\n\n// ----------------------------------------------------------------------------\n\nexport default { newInstance, extend };\n","import macro from '@kitware/vtk.js/macros';\nimport vtkCamera from '@kitware/vtk.js/Rendering/Core/Camera';\nimport { vec3, mat4 } from 'gl-matrix';\nimport vtkMath from '@kitware/vtk.js/Common/Core/Math';\n\n/**\n * vtkSlabCamera - A derived class of the core vtkCamera class\n *\n * This customization is necesssary because when we do coordinate transformations\n * we need to set the cRange between [d, d + 0.1],\n * where d is distance between the camera position and the focal point.\n * While when we render we set to the clippingRange [0.01, d * 2],\n * where d is the calculated from the bounds of all the actors.\n *\n * @param {*} publicAPI The public API to extend\n * @param {*} model The private model to extend.\n */\nfunction vtkSlabCamera(publicAPI, model) {\n model.classHierarchy.push('vtkSlabCamera');\n\n // Set up private variables and methods\n const tmpMatrix = mat4.identity(new Float64Array(16));\n const tmpvec1 = new Float64Array(3);\n\n /**\n * getProjectionMatrix - A fork of vtkCamera's getProjectionMatrix method.\n * This fork performs most of the same actions, but define crange around\n * model.distance when doing coordinate transformations.\n */\n publicAPI.getProjectionMatrix = (aspect, nearz, farz) => {\n const result = mat4.create();\n\n if (model.projectionMatrix) {\n const scale = 1 / model.physicalScale;\n vec3.set(tmpvec1, scale, scale, scale);\n\n mat4.copy(result, model.projectionMatrix);\n mat4.scale(result, result, tmpvec1);\n mat4.transpose(result, result);\n return result;\n }\n\n mat4.identity(tmpMatrix);\n\n let cRange0 = model.clippingRange[0];\n let cRange1 = model.clippingRange[1];\n if (model.isPerformingCoordinateTransformation) {\n /**\n * NOTE: this is necessary because we want the coordinate transformation\n * respect to the view plane (plane orthogonal to the camera and passing to\n * the focal point).\n *\n * When vtk.js computes the coordinate transformations, it simply uses the\n * camera matrix (no ray casting).\n *\n * However for the volume viewport the clipping range is set to be\n * (-RENDERING_DEFAULTS.MAXIMUM_RAY_DISTANCE, RENDERING_DEFAULTS.MAXIMUM_RAY_DISTANCE).\n * The clipping range is used in the camera method getProjectionMatrix().\n * The projection matrix is used then for viewToWorld/worldToView methods of\n * the renderer. This means that vkt.js will not return the coordinates of\n * the point on the view plane (i.e. the depth coordinate will corresponded\n * to the focal point).\n *\n * Therefore the clipping range has to be set to (distance, distance + 0.01),\n * where now distance is the distance between the camera position and focal\n * point. This is done internally, in our camera customization when the flag\n * isPerformingCoordinateTransformation is set to true.\n */\n cRange0 = model.distance;\n cRange1 = model.distance + 0.1;\n }\n\n const cWidth = cRange1 - cRange0;\n const cRange = [\n cRange0 + ((nearz + 1) * cWidth) / 2.0,\n cRange0 + ((farz + 1) * cWidth) / 2.0,\n ];\n\n if (model.parallelProjection) {\n // set up a rectangular parallelipiped\n const width = model.parallelScale * aspect;\n const height = model.parallelScale;\n\n const xmin = (model.windowCenter[0] - 1.0) * width;\n const xmax = (model.windowCenter[0] + 1.0) * width;\n const ymin = (model.windowCenter[1] - 1.0) * height;\n const ymax = (model.windowCenter[1] + 1.0) * height;\n\n mat4.ortho(tmpMatrix, xmin, xmax, ymin, ymax, cRange[0], cRange[1]);\n mat4.transpose(tmpMatrix, tmpMatrix);\n } else if (model.useOffAxisProjection) {\n throw new Error('Off-Axis projection is not supported at this time');\n } else {\n const tmp = Math.tan(vtkMath.radiansFromDegrees(model.viewAngle) / 2.0);\n let width;\n let height;\n if (model.useHorizontalViewAngle === true) {\n width = cRange0 * tmp;\n height = (cRange0 * tmp) / aspect;\n } else {\n width = cRange0 * tmp * aspect;\n height = cRange0 * tmp;\n }\n\n const xmin = (model.windowCenter[0] - 1.0) * width;\n const xmax = (model.windowCenter[0] + 1.0) * width;\n const ymin = (model.windowCenter[1] - 1.0) * height;\n const ymax = (model.windowCenter[1] + 1.0) * height;\n const znear = cRange[0];\n const zfar = cRange[1];\n\n tmpMatrix[0] = (2.0 * znear) / (xmax - xmin);\n tmpMatrix[5] = (2.0 * znear) / (ymax - ymin);\n tmpMatrix[2] = (xmin + xmax) / (xmax - xmin);\n tmpMatrix[6] = (ymin + ymax) / (ymax - ymin);\n tmpMatrix[10] = -(znear + zfar) / (zfar - znear);\n tmpMatrix[14] = -1.0;\n tmpMatrix[11] = (-2.0 * znear * zfar) / (zfar - znear);\n tmpMatrix[15] = 0.0;\n }\n\n mat4.copy(result, tmpMatrix);\n\n return result;\n };\n}\n\n// ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n// ----------------------------------------------------------------------------\n\nconst DEFAULT_VALUES = {\n isPerformingCoordinateTransformation: false,\n};\n\nexport function extend(publicAPI, model, initialValues = {}) {\n Object.assign(model, DEFAULT_VALUES, initialValues);\n\n vtkCamera.extend(publicAPI, model, initialValues);\n\n macro.setGet(publicAPI, model, ['isPerformingCoordinateTransformation']);\n\n // Object methods\n vtkSlabCamera(publicAPI, model);\n}\n\n// ----------------------------------------------------------------------------\n\nexport const newInstance = macro.newInstance(extend, 'vtkSlabCamera');\n\n// ----------------------------------------------------------------------------\n\nexport default { newInstance, extend };\n","import isTypedArray from '../../utilities/isTypedArray';\nimport { imageIdToURI } from '../../utilities';\nimport { vtkStreamingOpenGLTexture } from '../../RenderingEngine/vtkClasses';\nimport type { vtkImageData } from '@kitware/vtk.js/Common/DataModel/ImageData';\nimport {\n IVolume,\n VolumeScalarData,\n Metadata,\n Point3,\n IImageVolume,\n Mat3,\n} from '../../types';\n\n/** The base class for volume data. It includes the volume metadata\n * and the volume data along with the loading status.\n */\nexport class ImageVolume implements IImageVolume {\n private _imageIds: Array;\n private _imageIdsIndexMap = new Map();\n private _imageURIsIndexMap = new Map();\n /** volume scalar data 3D or 4D */\n protected scalarData: VolumeScalarData | Array;\n\n /** Read-only unique identifier for the volume */\n readonly volumeId: string;\n\n isPreScaled = false;\n\n /** Dimensions of the volume */\n dimensions: Point3;\n /** volume direction in world space */\n direction: Mat3;\n /** volume metadata */\n metadata: Metadata;\n /** volume origin, Note this is an opinionated origin for the volume */\n origin: Point3;\n /** Whether preScaling has been performed on the volume */\n /** volume scaling parameters if it contains scaled data */\n scaling?: {\n PT?: {\n // @TODO: Do these values exist?\n SUVlbmFactor?: number;\n SUVbsaFactor?: number;\n // accessed in ProbeTool\n suvbwToSuvlbm?: number;\n suvbwToSuvbsa?: number;\n };\n };\n /** volume size in bytes */\n sizeInBytes?: number; // Seems weird to pass this in? Why not grab it from scalarData.byteLength\n /** volume spacing in 3d world space */\n spacing: Point3;\n /** volume number of voxels */\n numVoxels: number;\n /** volume image data */\n imageData?: vtkImageData;\n /** open gl texture for the volume */\n vtkOpenGLTexture: any; // No good way of referencing vtk classes as they aren't classes.\n /** load status object for the volume */\n loadStatus?: Record;\n /** optional reference volume id if the volume is derived from another volume */\n referencedVolumeId?: string;\n /** whether the metadata for the pixel spacing is not undefined */\n hasPixelSpacing: boolean;\n\n constructor(props: IVolume) {\n this.volumeId = props.volumeId;\n this.metadata = props.metadata;\n this.dimensions = props.dimensions;\n this.spacing = props.spacing;\n this.origin = props.origin;\n this.direction = props.direction;\n this.imageData = props.imageData;\n this.scalarData = props.scalarData;\n this.sizeInBytes = props.sizeInBytes;\n this.vtkOpenGLTexture = vtkStreamingOpenGLTexture.newInstance();\n this.numVoxels =\n this.dimensions[0] * this.dimensions[1] * this.dimensions[2];\n\n if (props.scaling) {\n this.scaling = props.scaling;\n }\n\n if (props.referencedVolumeId) {\n this.referencedVolumeId = props.referencedVolumeId;\n }\n }\n\n /** return the image ids for the volume if it is made of separated images */\n public get imageIds(): Array {\n return this._imageIds;\n }\n\n /** updates the image ids */\n public set imageIds(newImageIds: Array) {\n this._imageIds = newImageIds;\n this._reprocessImageIds();\n }\n\n private _reprocessImageIds() {\n this._imageIdsIndexMap.clear();\n this._imageURIsIndexMap.clear();\n\n this._imageIds.forEach((imageId, i) => {\n const imageURI = imageIdToURI(imageId);\n\n this._imageIdsIndexMap.set(imageId, i);\n this._imageURIsIndexMap.set(imageURI, i);\n });\n }\n\n cancelLoading: () => void;\n\n /** return true if it is a 4D volume or false if it is 3D volume */\n public isDynamicVolume(): boolean {\n return false;\n }\n\n /**\n * Return the scalar data for 3D volumes or the active scalar data\n * (current time point) for 4D volumes\n */\n public getScalarData(): VolumeScalarData {\n if (isTypedArray(this.scalarData)) {\n return this.scalarData;\n }\n\n throw new Error('Unknow scalar data type');\n }\n\n /**\n * return the index of a given imageId\n * @param imageId - imageId\n * @returns imageId index\n */\n public getImageIdIndex(imageId: string): number {\n return this._imageIdsIndexMap.get(imageId);\n }\n\n /**\n * return the index of a given imageURI\n * @param imageId - imageURI\n * @returns imageURI index\n */\n public getImageURIIndex(imageURI: string): number {\n return this._imageURIsIndexMap.get(imageURI);\n }\n\n /**\n * destroy the volume and make it unusable\n */\n destroy(): void {\n // TODO: GPU memory associated with volume is not cleared.\n this.imageData.delete();\n this.imageData = null;\n this.scalarData = null;\n\n this.vtkOpenGLTexture.releaseGraphicsResources();\n this.vtkOpenGLTexture.delete();\n }\n}\n\nexport default ImageVolume;\n","/**\n * checks if an object is an instance of a TypedArray\n *\n * @param obj - Object to check\n *\n * @returns True if the object is a TypedArray.\n */\nexport default function isTypedArray(obj: any): boolean {\n return (\n obj instanceof Int8Array ||\n obj instanceof Uint8Array ||\n obj instanceof Uint8ClampedArray ||\n obj instanceof Int16Array ||\n obj instanceof Uint16Array ||\n obj instanceof Int32Array ||\n obj instanceof Uint32Array ||\n obj instanceof Float32Array ||\n obj instanceof Float64Array\n );\n}\n","import '@kitware/vtk.js/Rendering/Profiles/Volume';\n\nimport vtkImageData from '@kitware/vtk.js/Common/DataModel/ImageData';\nimport type { vtkImageData as vtkImageDataType } from '@kitware/vtk.js/Common/DataModel/ImageData';\nimport vtkDataArray from '@kitware/vtk.js/Common/Core/DataArray';\nimport cloneDeep from 'lodash.clonedeep';\n\nimport { ImageVolume } from '../cache/classes/ImageVolume';\nimport type * as Types from '../types';\nimport cache from '../cache/cache';\nimport Events from '../enums/Events';\nimport eventTarget from '../eventTarget';\nimport triggerEvent from '../utilities/triggerEvent';\nimport { uuidv4 } from '../utilities';\nimport { Point3, Metadata, EventTypes, Mat3 } from '../types';\nimport { getConfiguration } from '../init';\n\ninterface VolumeLoaderOptions {\n imageIds: Array;\n}\n\ninterface DerivedVolumeOptions {\n volumeId: string;\n targetBuffer?: {\n type: 'Float32Array' | 'Uint8Array' | 'Uint16Array' | 'Int16Array';\n sharedArrayBuffer?: boolean;\n };\n}\ninterface LocalVolumeOptions {\n scalarData: Float32Array | Uint8Array | Uint16Array | Int16Array;\n metadata: Metadata;\n dimensions: Point3;\n spacing: Point3;\n origin: Point3;\n direction: Mat3;\n}\n\n/**\n * Adds a single scalar data to a 3D volume\n */\nfunction addScalarDataToImageData(\n imageData: vtkImageDataType,\n scalarData: Types.VolumeScalarData,\n dataArrayAttrs\n) {\n const scalarArray = vtkDataArray.newInstance({\n name: `Pixels`,\n values: scalarData,\n ...dataArrayAttrs,\n });\n\n imageData.getPointData().setScalars(scalarArray);\n}\n\n/**\n * Adds multiple scalar data (time points) to a 4D volume\n */\nfunction addScalarDataArraysToImageData(\n imageData: vtkImageDataType,\n scalarDataArrays: Types.VolumeScalarData[],\n dataArrayAttrs\n) {\n scalarDataArrays.forEach((scalarData, i) => {\n const vtkScalarArray = vtkDataArray.newInstance({\n name: `timePoint-${i}`,\n values: scalarData,\n ...dataArrayAttrs,\n });\n\n imageData.getPointData().addArray(vtkScalarArray);\n });\n\n // Set the first as active otherwise nothing is displayed on the screen\n imageData.getPointData().setActiveScalars('timePoint-0');\n}\n\nfunction createInternalVTKRepresentation(\n volume: Types.IImageVolume\n): vtkImageDataType {\n const { dimensions, metadata, spacing, direction, origin } = volume;\n const { PhotometricInterpretation } = metadata;\n\n let numComponents = 1;\n if (PhotometricInterpretation === 'RGB') {\n numComponents = 3;\n }\n\n const imageData = vtkImageData.newInstance();\n const dataArrayAttrs = { numberOfComponents: numComponents };\n\n imageData.setDimensions(dimensions);\n imageData.setSpacing(spacing);\n imageData.setDirection(direction);\n imageData.setOrigin(origin);\n\n // Add scalar data to 3D or 4D volume\n if (volume.isDynamicVolume()) {\n const scalarDataArrays = ((\n volume\n )).getScalarDataArrays();\n\n addScalarDataArraysToImageData(imageData, scalarDataArrays, dataArrayAttrs);\n } else {\n const scalarData = volume.getScalarData();\n\n addScalarDataToImageData(imageData, scalarData, dataArrayAttrs);\n }\n\n return imageData;\n}\n\n/**\n * This module deals with VolumeLoaders and loading volumes\n */\n\nconst volumeLoaders = {};\n\nlet unknownVolumeLoader;\n\n/**\n * Load a volume using a registered Cornerstone Volume Loader.\n *\n * The volume loader that is used will be\n * determined by the volume loader scheme matching against the volumeId.\n *\n * @param volumeId - A Cornerstone Volume Object's volumeId\n * @param options - Options to be passed to the Volume Loader. Options\n * contain the ImageIds that is passed to the loader\n *\n * @returns An Object which can be used to act after a volume is loaded or loading fails\n *\n */\nfunction loadVolumeFromVolumeLoader(\n volumeId: string,\n options?: VolumeLoaderOptions\n): Types.IVolumeLoadObject {\n const colonIndex = volumeId.indexOf(':');\n const scheme = volumeId.substring(0, colonIndex);\n const loader = volumeLoaders[scheme];\n\n if (loader === undefined || loader === null) {\n if (unknownVolumeLoader !== undefined) {\n return unknownVolumeLoader(volumeId, options);\n }\n\n throw new Error(\n 'loadVolumeFromVolumeLoader: no volume loader for volumeId'\n );\n }\n\n const volumeLoadObject = loader(volumeId, options);\n\n // Broadcast a volume loaded event once the image is loaded\n volumeLoadObject.promise.then(\n function (volume) {\n triggerEvent(eventTarget, Events.VOLUME_LOADED, { volume });\n },\n function (error) {\n const errorObject: EventTypes.VolumeLoadedFailedEventDetail = {\n volumeId,\n error,\n };\n\n triggerEvent(eventTarget, Events.VOLUME_LOADED_FAILED, errorObject);\n }\n );\n\n return volumeLoadObject;\n}\n\n/**\n * Loads a volume given a volumeId and optional priority and returns a promise which will resolve to\n * the loaded image object or fail if an error occurred. The loaded image is not stored in the cache.\n *\n * @param volumeId - A Cornerstone Image Object's volumeId\n * @param options - Options to be passed to the Volume Loader\n *\n * @returns An Object which can be used to act after an image is loaded or loading fails\n */\nexport function loadVolume(\n volumeId: string,\n options: VolumeLoaderOptions = { imageIds: [] }\n): Promise {\n if (volumeId === undefined) {\n throw new Error('loadVolume: parameter volumeId must not be undefined');\n }\n\n let volumeLoadObject = cache.getVolumeLoadObject(volumeId);\n\n if (volumeLoadObject !== undefined) {\n return volumeLoadObject.promise;\n }\n\n volumeLoadObject = loadVolumeFromVolumeLoader(volumeId, options);\n\n return volumeLoadObject.promise.then((volume: Types.IImageVolume) => {\n volume.imageData = createInternalVTKRepresentation(volume);\n return volume;\n });\n}\n\n/**\n * Loads an image given an volumeId and optional priority and returns a promise which will resolve to\n * the loaded image object or fail if an error occurred. The image is stored in the cache.\n *\n * @param volumeId - A Cornerstone Image Object's volumeId\n * @param options - Options to be passed to the Volume Loader\n *\n * @returns Volume Loader Object\n */\nexport async function createAndCacheVolume(\n volumeId: string,\n options?: VolumeLoaderOptions\n): Promise> {\n if (volumeId === undefined) {\n throw new Error(\n 'createAndCacheVolume: parameter volumeId must not be undefined'\n );\n }\n\n let volumeLoadObject = cache.getVolumeLoadObject(volumeId);\n\n if (volumeLoadObject !== undefined) {\n return volumeLoadObject.promise;\n }\n\n volumeLoadObject = loadVolumeFromVolumeLoader(volumeId, options);\n\n volumeLoadObject.promise.then((volume: Types.IImageVolume) => {\n volume.imageData = createInternalVTKRepresentation(volume);\n });\n\n cache.putVolumeLoadObject(volumeId, volumeLoadObject).catch((err) => {\n throw err;\n });\n\n return volumeLoadObject.promise;\n}\n\n/**\n * Based on a referencedVolumeId, it will build and cache a new volume. If\n * no scalarData is specified in the options, an empty derived volume will be\n * created that matches the image metadata of the referenceVolume. If scalarData\n * is given, it will be used to generate the intensity values for the derivedVolume.\n * Finally, it will save the volume in the cache.\n * @param referencedVolumeId - the volumeId from which the new volume will get its metadata\n * @param options - DerivedVolumeOptions {uid: derivedVolumeUID, targetBuffer: { type: Float32Array | Uint8Array |\n * Uint16Array | Uint32Array }, scalarData: if provided}\n *\n * @returns ImageVolume\n */\nexport async function createAndCacheDerivedVolume(\n referencedVolumeId: string,\n options: DerivedVolumeOptions\n): Promise {\n const referencedVolume = cache.getVolume(referencedVolumeId);\n\n if (!referencedVolume) {\n throw new Error(\n `Cannot created derived volume: Referenced volume with id ${referencedVolumeId} does not exist.`\n );\n }\n\n let { volumeId } = options;\n const { targetBuffer } = options;\n\n if (volumeId === undefined) {\n volumeId = uuidv4();\n }\n\n const { metadata, dimensions, spacing, origin, direction } = referencedVolume;\n const scalarData = referencedVolume.getScalarData();\n const scalarLength = scalarData.length;\n\n let numBytes, TypedArray;\n\n const { useNorm16Texture } = getConfiguration().rendering;\n\n // If target buffer is provided\n if (targetBuffer) {\n if (targetBuffer.type === 'Float32Array') {\n numBytes = scalarLength * 4;\n TypedArray = Float32Array;\n } else if (targetBuffer.type === 'Uint8Array') {\n numBytes = scalarLength;\n TypedArray = Uint8Array;\n } else if (useNorm16Texture && targetBuffer.type === 'Uint16Array') {\n numBytes = scalarLength * 2;\n TypedArray = Uint16Array;\n } else if (useNorm16Texture && targetBuffer.type === 'Int16Array') {\n numBytes = scalarLength * 2;\n TypedArray = Uint16Array;\n } else {\n throw new Error('TargetBuffer should be Float32Array or Uint8Array');\n }\n } else {\n // Use float32 if no targetBuffer is provided\n numBytes = scalarLength * 4;\n TypedArray = Float32Array;\n }\n\n // check if there is enough space in unallocated + image Cache\n const isCacheable = cache.isCacheable(numBytes);\n if (!isCacheable) {\n throw new Error(Events.CACHE_SIZE_EXCEEDED);\n }\n\n let volumeScalarData;\n if (targetBuffer?.sharedArrayBuffer) {\n const buffer = new SharedArrayBuffer(numBytes);\n volumeScalarData = new TypedArray(buffer);\n } else {\n volumeScalarData = new TypedArray(scalarLength);\n }\n\n // Todo: handle more than one component for segmentation (RGB)\n const scalarArray = vtkDataArray.newInstance({\n name: 'Pixels',\n numberOfComponents: 1,\n values: volumeScalarData,\n });\n\n const derivedImageData = vtkImageData.newInstance();\n\n derivedImageData.setDimensions(dimensions);\n derivedImageData.setSpacing(spacing);\n derivedImageData.setDirection(direction);\n derivedImageData.setOrigin(origin);\n derivedImageData.getPointData().setScalars(scalarArray);\n\n const derivedVolume = new ImageVolume({\n volumeId,\n metadata: cloneDeep(metadata),\n dimensions: [dimensions[0], dimensions[1], dimensions[2]],\n spacing,\n origin,\n direction,\n imageData: derivedImageData,\n scalarData: volumeScalarData,\n sizeInBytes: numBytes,\n referencedVolumeId,\n });\n\n const volumeLoadObject = {\n promise: Promise.resolve(derivedVolume),\n };\n\n await cache.putVolumeLoadObject(volumeId, volumeLoadObject);\n\n return derivedVolume;\n}\n\n/**\n * Creates and cache a volume based on a set of provided properties including\n * dimensions, spacing, origin, direction, metadata, scalarData. It should be noted that\n * scalarData should be provided for this function to work. If a volume with the same\n * Id exists in the cache it returns it immediately.\n * @param options - { scalarData, metadata, dimensions, spacing, origin, direction }\n * @param volumeId - Id of the generated volume\n *\n * @returns ImageVolume\n */\nexport function createLocalVolume(\n options: LocalVolumeOptions,\n volumeId: string,\n preventCache = false\n): ImageVolume {\n const { scalarData, metadata, dimensions, spacing, origin, direction } =\n options;\n\n if (\n !scalarData ||\n !(\n scalarData instanceof Uint8Array ||\n scalarData instanceof Float32Array ||\n scalarData instanceof Uint16Array ||\n scalarData instanceof Int16Array\n )\n ) {\n throw new Error(\n 'To use createLocalVolume you should pass scalarData of type Uint8Array, Uint16Array, Int16Array or Float32Array'\n );\n }\n\n // Todo: handle default values for spacing, origin, direction if not provided\n if (volumeId === undefined) {\n volumeId = uuidv4();\n }\n\n const cachedVolume = cache.getVolume(volumeId);\n\n if (cachedVolume) {\n return cachedVolume as ImageVolume;\n }\n\n const scalarLength = dimensions[0] * dimensions[1] * dimensions[2];\n\n const numBytes = scalarData ? scalarData.buffer.byteLength : scalarLength * 4;\n\n // check if there is enough space in unallocated + image Cache\n const isCacheable = cache.isCacheable(numBytes);\n if (!isCacheable) {\n throw new Error(Events.CACHE_SIZE_EXCEEDED);\n }\n\n const scalarArray = vtkDataArray.newInstance({\n name: 'Pixels',\n numberOfComponents: 1,\n values: scalarData,\n });\n\n const imageData = vtkImageData.newInstance();\n\n imageData.setDimensions(dimensions);\n imageData.setSpacing(spacing);\n imageData.setDirection(direction);\n imageData.setOrigin(origin);\n imageData.getPointData().setScalars(scalarArray);\n\n const derivedVolume = new ImageVolume({\n volumeId,\n metadata: cloneDeep(metadata),\n dimensions: [dimensions[0], dimensions[1], dimensions[2]],\n spacing,\n origin,\n direction,\n imageData: imageData,\n scalarData,\n sizeInBytes: numBytes,\n });\n\n if (preventCache) {\n return derivedVolume;\n }\n\n const volumeLoadObject = {\n promise: Promise.resolve(derivedVolume),\n };\n cache.putVolumeLoadObject(volumeId, volumeLoadObject);\n\n return derivedVolume;\n}\n\n/**\n * Registers an volumeLoader plugin with cornerstone for the specified scheme\n *\n * @param scheme - The scheme to use for this volume loader (e.g. 'dicomweb', 'wadouri', 'http')\n * @param volumeLoader - A Cornerstone Volume Loader function\n */\nexport function registerVolumeLoader(\n scheme: string,\n volumeLoader: Types.VolumeLoaderFn\n): void {\n volumeLoaders[scheme] = volumeLoader;\n}\n\n/** Gets the array of volume loader schemes */\nexport function getVolumeLoaderSchemes(): string[] {\n return Object.keys(volumeLoaders);\n}\n\n/**\n * Registers a new unknownVolumeLoader and returns the previous one\n *\n * @param volumeLoader - A Cornerstone Volume Loader\n *\n * @returns The previous Unknown Volume Loader\n */\nexport function registerUnknownVolumeLoader(\n volumeLoader: Types.VolumeLoaderFn\n): Types.VolumeLoaderFn | undefined {\n const oldVolumeLoader = unknownVolumeLoader;\n\n unknownVolumeLoader = volumeLoader;\n\n return oldVolumeLoader;\n}\n","import cache from '../cache/cache';\nimport { EPSILON } from '../constants';\n// import type { VolumeViewport } from '../RenderingEngine'\nimport { ICamera, IImageVolume, IVolumeViewport } from '../types';\nimport getSpacingInNormalDirection from './getSpacingInNormalDirection';\nimport { getVolumeLoaderSchemes } from '../loaders/volumeLoader';\n\n// One EPSILON part larger multiplier\nconst EPSILON_PART = 1 + EPSILON;\n\nconst startsWith = (str, starts) =>\n starts === str.substring(0, Math.min(str.length, starts.length));\n\n// Check if this is a primary volume\n// For now, that means it came from some sort of image loader, but\n// should be specifically designated.\nconst isPrimaryVolume = (volume): boolean =>\n !!getVolumeLoaderSchemes().find((scheme) =>\n startsWith(volume.volumeId, scheme)\n );\n\n/**\n * Given a volume viewport and camera, find the target volume.\n * The imageVolume is retrieved from cache for the specified targetVolumeId or\n * in case it is not provided, it chooses the volumeId on the viewport (there\n * might be more than one in case of fusion) that has the finest resolution in the\n * direction of view (normal).\n *\n * @param viewport - volume viewport\n * @param camera - current camera\n * @param targetVolumeId - If a target volumeId is given that volume\n * is forced to be used.\n *\n * @returns An object containing the imageVolume and spacingInNormalDirection.\n *\n */\nexport default function getTargetVolumeAndSpacingInNormalDir(\n viewport: IVolumeViewport,\n camera: ICamera,\n targetVolumeId?: string\n): {\n imageVolume: IImageVolume;\n spacingInNormalDirection: number;\n actorUID: string;\n} {\n const { viewPlaneNormal } = camera;\n const volumeActors = viewport.getActors();\n\n if (!volumeActors || !volumeActors.length) {\n return {\n spacingInNormalDirection: null,\n imageVolume: null,\n actorUID: null,\n };\n }\n\n const imageVolumes = volumeActors\n .map((va) => {\n // prefer the referenceUID if it is set, since it can be a derived actor\n // and the uid does not necessarily match the volumeId\n const actorUID = va.referenceId ?? va.uid;\n return cache.getVolume(actorUID);\n })\n .filter((iv) => !!iv);\n\n // If a volumeId is defined, set that volume as the target\n if (targetVolumeId) {\n const imageVolumeIndex = imageVolumes.findIndex(\n (iv) => iv.volumeId === targetVolumeId\n );\n\n const imageVolume = imageVolumes[imageVolumeIndex];\n const { uid: actorUID } = volumeActors[imageVolumeIndex];\n const spacingInNormalDirection = getSpacingInNormalDirection(\n imageVolume,\n viewPlaneNormal\n );\n\n return { imageVolume, spacingInNormalDirection, actorUID };\n }\n\n if (!imageVolumes.length) {\n return {\n spacingInNormalDirection: null,\n imageVolume: null,\n actorUID: null,\n };\n }\n\n // Fetch volume actor with finest resolution in direction of projection.\n const smallest = {\n spacingInNormalDirection: Infinity,\n imageVolume: null,\n actorUID: null,\n };\n\n const hasPrimaryVolume = imageVolumes.find(isPrimaryVolume);\n\n for (let i = 0; i < imageVolumes.length; i++) {\n const imageVolume = imageVolumes[i];\n\n if (hasPrimaryVolume && !isPrimaryVolume(imageVolume)) {\n // Secondary volumes like segmentation don't count towards spacing\n continue;\n }\n\n const spacingInNormalDirection = getSpacingInNormalDirection(\n imageVolume,\n viewPlaneNormal\n );\n\n // Allow for EPSILON part larger requirement to prefer earlier volumes\n // when the spacing is within a factor of EPSILON. Use a factor because\n // that deals with very small or very large volumes effectively.\n if (\n spacingInNormalDirection * EPSILON_PART <\n smallest.spacingInNormalDirection\n ) {\n smallest.spacingInNormalDirection = spacingInNormalDirection;\n smallest.imageVolume = imageVolume;\n smallest.actorUID = volumeActors[i].uid;\n }\n }\n\n return smallest;\n}\n","import { Point3 } from '../types';\n\n/**\n * Converts `vtkVolumeActor` bounds to corners in world space.\n *\n * @param volumeActor - The `vtkVolumeActor`.\n *\n * @returns An array of the corners of the `volumeActor` in world space.\n */\nexport default function getVolumeActorCorners(volumeActor): Array {\n const imageData = volumeActor.getMapper().getInputData();\n const bounds = imageData.extentToBounds(imageData.getExtent());\n\n return [\n [bounds[0], bounds[2], bounds[4]],\n [bounds[0], bounds[2], bounds[5]],\n [bounds[0], bounds[3], bounds[4]],\n [bounds[0], bounds[3], bounds[5]],\n [bounds[1], bounds[2], bounds[4]],\n [bounds[1], bounds[2], bounds[5]],\n [bounds[1], bounds[3], bounds[4]],\n [bounds[1], bounds[3], bounds[5]],\n ];\n}\n","import { Point3 } from '../types';\n\n/**\n * Returns true if the specified index is within the given dimensions.\n *\n * @param index - The index to check.\n * @param dimensions - The dimensions to check against.\n *\n * @returns True if the index is in-bounds.\n */\nexport default function indexWithinDimensions(\n index: Point3,\n dimensions: Point3\n): boolean {\n if (\n index[0] < 0 ||\n index[0] >= dimensions[0] ||\n index[1] < 0 ||\n index[1] >= dimensions[1] ||\n index[2] < 0 ||\n index[2] >= dimensions[2]\n ) {\n return false;\n }\n\n return true;\n}\n","import { IVolumeViewport } from '../types';\nimport {\n getRenderingEngines,\n getRenderingEngine,\n} from '../RenderingEngine/getRenderingEngine';\n\n/**\n * Returns the viewports containing the same volume actors (all actors) the same\n * as the target viewport. If renderingEngineId is provided, it will only return\n * viewports that are associated with the renderingEngineId; otherwise, it will\n * return search in all rendering engines.\n *\n * This method is useful for finding viewports that are associated with the same\n * volume (e.g., for tools that share state between viewports).\n *\n * @param viewport - target viewport\n * @returns array of viewports that have the same volume actor as the target viewport\n */\nfunction getVolumeViewportsContainingSameVolumes(\n targetViewport: IVolumeViewport,\n renderingEngineId?: string\n): Array {\n // If rendering engine is not provided, use all rendering engines\n let renderingEngines;\n if (renderingEngineId) {\n renderingEngines = [getRenderingEngine(renderingEngineId)];\n } else {\n renderingEngines = getRenderingEngines();\n }\n\n const sameVolumesViewports = [];\n\n renderingEngines.forEach((renderingEngine) => {\n const targetActors = targetViewport.getActors();\n const viewports = renderingEngine.getVolumeViewports();\n\n for (const vp of viewports) {\n const vpActors = vp.getActors();\n\n if (vpActors.length !== targetActors.length) {\n continue;\n }\n\n // every targetActors should be in the vpActors\n const sameVolumes = targetActors.every(({ uid }) =>\n vpActors.find((vpActor) => uid === vpActor.uid)\n );\n\n if (sameVolumes) {\n sameVolumesViewports.push(vp);\n }\n }\n });\n\n return sameVolumesViewports;\n}\n\nexport default getVolumeViewportsContainingSameVolumes;\n","import { IVolumeViewport } from '../types';\nimport {\n getRenderingEngines,\n getRenderingEngine,\n} from '../RenderingEngine/getRenderingEngine';\n\n/**\n * Similar to {@link getVolumeViewportsContainingSameVolumes}, but uses the volumeId\n * to filter viewports that contain the same volume.\n *\n * @returns VolumeViewport viewports array\n */\nfunction getViewportsWithVolumeId(\n volumeId: string,\n renderingEngineId?: string\n): Array {\n // If rendering engine is not provided, use all rendering engines\n let renderingEngines;\n if (renderingEngineId) {\n renderingEngines = [getRenderingEngine(renderingEngineId)];\n } else {\n renderingEngines = getRenderingEngines();\n }\n\n const targetViewports = [];\n\n renderingEngines.forEach((renderingEngine) => {\n const viewports = renderingEngine.getVolumeViewports();\n const filteredViewports = viewports.filter((vp) =>\n vp.hasVolumeId(volumeId)\n );\n targetViewports.push(...filteredViewports);\n });\n\n return targetViewports;\n}\n\nexport default getViewportsWithVolumeId;\n","import type Point3 from '../types/Point3';\n\n/**\n * Given an imageData object and a point in physical space, return the index of the\n * voxel that contains the point. TODO: this should be pushed to vtk upstream.\n * @param imageData - The image data object.\n * @param physicalPoint - The point in physical space that you want to transform to\n * index space.\n * @returns An array of integers.\n */\nexport default function transformWorldToIndex(imageData, worldPos: Point3) {\n const continuousIndex = imageData.worldToIndex(worldPos);\n const index = continuousIndex.map(Math.round);\n\n return index;\n}\n","import RequestType from '../enums/RequestType';\nimport { IImage } from '../types';\nimport { uuidv4 } from '../utilities';\n\ntype AdditionalDetails = {\n imageId?: string;\n volumeId?: string;\n};\n\ntype RequestDetailsInterface = {\n requestFn: () => Promise;\n type: RequestType;\n additionalDetails: AdditionalDetails;\n};\n\ntype RequestPool = {\n [name in RequestType]: { [key: number]: RequestDetailsInterface[] };\n};\n\n/**\n * RequestPool manager class is a base class that manages the request pools.\n * It is used imageRetrievalPoolManager, and imageLoadPoolManager to retrieve and load images.\n * Previously requestPoolManager was used to manage the retrieval and loading and decoding\n * of the images in a way that new requests were sent after the image was both loaded and decoded\n * which was not performant since it was waiting for the image to be loaded and decoded before\n * sending the next request which is a network request and can be done in parallel.\n * Now, we use separate imageRetrievalPoolManager and imageLoadPoolManager\n * to improve performance and both are extending the RequestPoolManager class which\n * is a basic queueing pool.\n *\n * A new requestPool can be created by instantiating a new RequestPoolManager class.\n *\n * ```javascript\n * const requestPoolManager = new RequestPoolManager()\n * ```\n *\n * ## ImageLoadPoolManager\n *\n * You can use the imageLoadPoolManager to load images, by providing a `requestFn`\n * that returns a promise for the image. You can provide a `type` to specify the type of\n * request (interaction, thumbnail, prefetch), and you can provide additional details\n * that will be passed to the requestFn. Below is an example of a requestFn that loads\n * an image from an imageId:\n *\n * ```javascript\n *\n * const priority = -5\n * const requestType = RequestType.Interaction\n * const additionalDetails = { imageId }\n * const options = {\n * targetBuffer: {\n * type: 'Float32Array',\n * offset: null,\n * length: null,\n * },\n * preScale: {\n * enabled: true,\n * },\n * }\n *\n * imageLoadPoolManager.addRequest(\n * loadAndCacheImage(imageId, options).then(() => { // set on viewport}),\n * requestType,\n * additionalDetails,\n * priority\n * )\n * ```\n * ### ImageRetrievalPoolManager\n * You don't need to directly use the imageRetrievalPoolManager to load images\n * since the imageLoadPoolManager will automatically use it for retrieval. However,\n * maximum number of concurrent requests can be set by calling `setMaxConcurrentRequests`.\n */\nclass RequestPoolManager {\n private id: string;\n private awake: boolean;\n private requestPool: RequestPool;\n private numRequests = {\n interaction: 0,\n thumbnail: 0,\n prefetch: 0,\n };\n /* maximum number of requests of each type. */\n public maxNumRequests: {\n interaction: number;\n thumbnail: number;\n prefetch: number;\n };\n /* A public property that is used to set the delay between requests. */\n public grabDelay: number;\n private timeoutHandle: number;\n\n /**\n * By default a request pool containing three priority groups, one for each\n * of the request types, is created. Maximum number of requests of each type\n * is set to 6.\n */\n constructor(id?: string) {\n this.id = id ? id : uuidv4();\n\n this.requestPool = {\n interaction: { 0: [] },\n thumbnail: { 0: [] },\n prefetch: { 0: [] },\n };\n\n this.grabDelay = 5;\n this.awake = false;\n\n this.numRequests = {\n interaction: 0,\n thumbnail: 0,\n prefetch: 0,\n };\n\n this.maxNumRequests = {\n interaction: 6,\n thumbnail: 6,\n prefetch: 5,\n };\n }\n\n /**\n * This function sets the maximum number of requests for a given request type.\n * @param type - The type of request you want to set the max number\n * of requests for it can be either of interaction, prefetch, or thumbnail.\n * @param maxNumRequests - The maximum number of requests that can be\n * made at a time.\n */\n public setMaxSimultaneousRequests(\n type: RequestType,\n maxNumRequests: number\n ): void {\n this.maxNumRequests[type] = maxNumRequests;\n }\n\n /**\n * It returns the maximum number of requests of a given type that can be made\n * @param type - The type of request.\n * @returns The maximum number of requests of a given type.\n */\n public getMaxSimultaneousRequests(type: RequestType): number {\n return this.maxNumRequests[type];\n }\n\n /**\n * Stops further fetching of the requests, all the ongoing requests will still\n * be retrieved\n */\n public destroy(): void {\n if (this.timeoutHandle) {\n window.clearTimeout(this.timeoutHandle);\n }\n }\n\n /**\n * Adds the requests to the pool of requests.\n *\n * @param requestFn - A function that returns a promise which resolves in the image\n * @param type - Priority category, it can be either of interaction, prefetch,\n * or thumbnail.\n * @param additionalDetails - Additional details that requests can contain.\n * For instance the volumeId for the volume requests\n * @param priority - Priority number for each category of requests. Its default\n * value is priority 0. The lower the priority number, the higher the priority number\n *\n */\n public addRequest(\n requestFn: () => Promise,\n type: RequestType,\n additionalDetails: Record,\n priority = 0\n ): void {\n // Describe the request\n const requestDetails: RequestDetailsInterface = {\n requestFn,\n type,\n additionalDetails,\n };\n\n // Check if the priority group exists on the request type\n if (this.requestPool[type][priority] === undefined) {\n this.requestPool[type][priority] = [];\n }\n\n // Adding the request to the correct priority group of the request type\n this.requestPool[type][priority].push(requestDetails);\n\n // Wake up\n if (!this.awake) {\n this.awake = true;\n this.startGrabbing();\n } else if (type === RequestType.Interaction) {\n // Todo: this is a hack for interaction right now, we should separate\n // the grabbing from the adding requests\n this.startGrabbing();\n }\n }\n\n /**\n * Filter the requestPoolManager's pool of request based on the result of\n * provided filter function. The provided filter function needs to return false or true\n *\n * @param filterFunction - The filter function for filtering of the requests to keep\n */\n public filterRequests(\n filterFunction: (requestDetails: RequestDetailsInterface) => boolean\n ): void {\n Object.keys(this.requestPool).forEach((type: string) => {\n const requestType = this.requestPool[type];\n Object.keys(requestType).forEach((priority) => {\n requestType[priority] = requestType[priority].filter(\n (requestDetails: RequestDetailsInterface) => {\n return filterFunction(requestDetails);\n }\n );\n });\n });\n }\n\n /**\n * Clears the requests specific to the provided type. For instance, the\n * pool of requests of type 'interaction' can be cleared via this function.\n *\n *\n * @param type - category of the request (either interaction, prefetch or thumbnail)\n */\n public clearRequestStack(type: string): void {\n if (!this.requestPool[type]) {\n throw new Error(`No category for the type ${type} found`);\n }\n this.requestPool[type] = { 0: [] };\n }\n\n private sendRequests(type) {\n const requestsToSend = this.maxNumRequests[type] - this.numRequests[type];\n\n for (let i = 0; i < requestsToSend; i++) {\n const requestDetails = this.getNextRequest(type);\n if (requestDetails === null) {\n return false;\n } else if (requestDetails) {\n this.numRequests[type]++;\n this.awake = true;\n\n requestDetails.requestFn().finally(() => {\n this.numRequests[type]--;\n this.startAgain();\n });\n }\n }\n\n return true;\n }\n\n private getNextRequest(type): RequestDetailsInterface | null {\n const interactionPriorities = this.getSortedPriorityGroups(type);\n for (const priority of interactionPriorities) {\n if (this.requestPool[type][priority].length) {\n return this.requestPool[type][priority].shift();\n }\n }\n\n return null;\n }\n\n protected startGrabbing(): void {\n const hasRemainingInteractionRequests = this.sendRequests(\n RequestType.Interaction\n );\n const hasRemainingThumbnailRequests = this.sendRequests(\n RequestType.Thumbnail\n );\n const hasRemainingPrefetchRequests = this.sendRequests(\n RequestType.Prefetch\n );\n\n if (\n !hasRemainingInteractionRequests &&\n !hasRemainingThumbnailRequests &&\n !hasRemainingPrefetchRequests\n ) {\n this.awake = false;\n }\n }\n\n protected startAgain(): void {\n if (!this.awake) {\n return;\n }\n\n if (this.grabDelay !== undefined) {\n // Prevents calling setTimeout hundreds of times when hundreds of requests\n // are added which make it slower and works in an unexpected way when\n // destroy/clearTimeout is called because only the last handle is stored.\n if (!this.timeoutHandle) {\n this.timeoutHandle = window.setTimeout(() => {\n this.timeoutHandle = null;\n this.startGrabbing();\n }, this.grabDelay);\n }\n } else {\n this.startGrabbing();\n }\n }\n\n protected getSortedPriorityGroups(type: string): Array {\n const priorities = Object.keys(this.requestPool[type])\n .map(Number)\n .filter((priority) => this.requestPool[type][priority].length)\n .sort((a, b) => a - b);\n return priorities;\n }\n\n /**\n * Returns the request pool containing different categories, their priority and\n * the added request details.\n *\n * @returns the request pool which contains different categories, their priority and\n * the added request details\n */\n getRequestPool(): RequestPool {\n return this.requestPool;\n }\n}\n\nconst requestPoolManager = new RequestPoolManager();\n\nexport { RequestPoolManager };\nexport default requestPoolManager;\n","import { RequestPoolManager } from './requestPoolManager';\nimport RequestType from '../enums/RequestType';\n\n/**\n * You can use the imageLoadPoolManager to load images, by providing a `requestFn`\n * that returns a promise for the image. You can provide a `type` to specify the type of\n * request (interaction, thumbnail, prefetch), and you can provide additional details\n * that will be passed to the requestFn. Below is an example of a requestFn that loads\n * an image from an imageId:\n *\n * ```javascript\n *\n * const priority = -5\n * const requestType = RequestType.Interaction\n * const additionalDetails = { imageId }\n * const options = {\n * targetBuffer: {\n * type: 'Float32Array',\n * offset: null,\n * length: null,\n * },\n * preScale: {\n * enabled: true,\n * },\n * }\n *\n * imageLoadPoolManager.addRequest(\n * loadAndCacheImage(imageId, options).then(() => { // set on viewport}),\n * requestType,\n * additionalDetails,\n * priority\n * )\n * ```\n */\nconst imageLoadPoolManager = new RequestPoolManager('imageLoadPool');\n\nimageLoadPoolManager.grabDelay = 0;\n\nimageLoadPoolManager.setMaxSimultaneousRequests(RequestType.Interaction, 1000);\nimageLoadPoolManager.setMaxSimultaneousRequests(RequestType.Thumbnail, 1000);\nimageLoadPoolManager.setMaxSimultaneousRequests(RequestType.Prefetch, 1000);\n\nexport default imageLoadPoolManager;\n","import cache from '../cache/cache';\nimport Events from '../enums/Events';\nimport eventTarget from '../eventTarget';\nimport { triggerEvent } from '../utilities';\nimport { IImage, ImageLoaderFn, IImageLoadObject, EventTypes } from '../types';\nimport imageLoadPoolManager from '../requestPool/imageLoadPoolManager';\n\nexport interface ImageLoaderOptions {\n priority: number;\n requestType: string;\n additionalDetails?: Record;\n}\n/**\n * This module deals with ImageLoaders, loading images and caching images\n */\nconst imageLoaders = {};\nlet unknownImageLoader;\n\n/**\n * Loads an image using a registered Cornerstone Image Loader.\n *\n * The image loader that is used will be\n * determined by the image loader scheme matching against the imageId.\n *\n * @param imageId - A Cornerstone Image Object's imageId\n * @param Options - to be passed to the Image Loader\n *\n * @returns - An Object which can be used to act after an image is loaded or loading fails\n */\nfunction loadImageFromImageLoader(\n imageId: string,\n options: ImageLoaderOptions\n): IImageLoadObject {\n // Extract the image loader scheme: wadors:https://image1 => wadors\n const colonIndex = imageId.indexOf(':');\n const scheme = imageId.substring(0, colonIndex);\n const loader = imageLoaders[scheme];\n if (loader === undefined || loader === null) {\n if (unknownImageLoader !== undefined) {\n return unknownImageLoader(imageId);\n }\n throw new Error('loadImageFromImageLoader: no image loader for imageId');\n }\n // Load using the registered loader\n const imageLoadObject = loader(imageId, options);\n // Broadcast an image loaded event once the image is loaded\n imageLoadObject.promise.then(\n function (image) {\n triggerEvent(eventTarget, Events.IMAGE_LOADED, { image });\n },\n function (error) {\n const errorObject: EventTypes.ImageLoadedFailedEventDetail = {\n imageId,\n error,\n };\n triggerEvent(eventTarget, Events.IMAGE_LOAD_FAILED, errorObject);\n }\n );\n return imageLoadObject;\n}\n\n/**\n * Gets the imageLoadObject by 1) Looking in to the cache to see if the\n * imageLoadObject has already been cached, 2) Checks inside the volume cache\n * to see if there is a volume that contains the same imageURI for the requested\n * imageID 3) Checks inside the imageCache for similar imageURI that might have\n * been stored as a result of decaching a volume 4) Finally if none were found\n * it request it from the registered imageLoaders.\n *\n * @param imageId - A Cornerstone Image Object's imageId\n * @param options - Options to be passed to the Image Loader\n *\n * @returns An Object which can be used to act after an image is loaded or loading fails\n */\nfunction loadImageFromCacheOrVolume(\n imageId: string,\n options: ImageLoaderOptions\n): IImageLoadObject {\n // 1. Check inside the image cache for imageId\n let imageLoadObject = cache.getImageLoadObject(imageId);\n if (imageLoadObject !== undefined) {\n return imageLoadObject;\n }\n // 2. Check if there exists a volume in the cache containing the imageId,\n // we copy the pixelData over.\n const cachedVolumeInfo = cache.getVolumeContainingImageId(imageId);\n if (cachedVolumeInfo && cachedVolumeInfo.volume.loadStatus.loaded) {\n // 2.1 Convert the volume at the specific slice to a cornerstoneImage object.\n // this will copy the pixel data over.\n const { volume, imageIdIndex } = cachedVolumeInfo;\n imageLoadObject = volume.convertToCornerstoneImage(imageId, imageIdIndex);\n return imageLoadObject;\n }\n // 3. If no volume found, we search inside the imageCache for the imageId\n // that has the same URI which had been cached if the volume was converted\n // to an image\n const cachedImage = cache.getCachedImageBasedOnImageURI(imageId);\n if (cachedImage) {\n imageLoadObject = cachedImage.imageLoadObject;\n return imageLoadObject;\n }\n // 4. if not in image cache nor inside the volume cache, we request the\n // image loaders to load it\n imageLoadObject = loadImageFromImageLoader(imageId, options);\n\n return imageLoadObject;\n}\n\n/**\n * Loads an image given an imageId and optional priority and returns a promise\n * which will resolve to the loaded image object or fail if an error occurred.\n * The loaded image is not stored in the cache.\n *\n *\n * @param imageId - A Cornerstone Image Object's imageId\n * @param options - Options to be passed to the Image Loader\n *\n * @returns An Object which can be used to act after an image is loaded or loading fails\n */\nexport function loadImage(\n imageId: string,\n options: ImageLoaderOptions = { priority: 0, requestType: 'prefetch' }\n): Promise {\n if (imageId === undefined) {\n throw new Error('loadImage: parameter imageId must not be undefined');\n }\n\n return loadImageFromCacheOrVolume(imageId, options).promise;\n}\n\n/**\n * Loads an image given an imageId and optional priority and returns a promise\n * which will resolve to the loaded image object or fail if an error occurred.\n * The image is stored in the cache.\n *\n * @param imageId - A Cornerstone Image Object's imageId\n * @param options - Options to be passed to the Image Loader\n *\n * @returns Image Loader Object\n */\nexport function loadAndCacheImage(\n imageId: string,\n options: ImageLoaderOptions = { priority: 0, requestType: 'prefetch' }\n): Promise {\n if (imageId === undefined) {\n throw new Error(\n 'loadAndCacheImage: parameter imageId must not be undefined'\n );\n }\n const imageLoadObject = loadImageFromCacheOrVolume(imageId, options);\n\n // if not inside cache, store it\n if (!cache.getImageLoadObject(imageId)) {\n cache.putImageLoadObject(imageId, imageLoadObject).catch((err) => {\n console.warn(err);\n });\n }\n\n return imageLoadObject.promise;\n}\n\n/**\n * Load and cache a list of imageIds\n *\n * @param imageIds - list of imageIds\n * @param options - options for loader\n *\n */\nexport function loadAndCacheImages(\n imageIds: Array,\n options: ImageLoaderOptions = { priority: 0, requestType: 'prefetch' }\n): Promise[] {\n if (!imageIds || imageIds.length === 0) {\n throw new Error(\n 'loadAndCacheImages: parameter imageIds must be list of image Ids'\n );\n }\n\n const allPromises = imageIds.map((imageId) => {\n return loadAndCacheImage(imageId, options);\n });\n\n return allPromises;\n}\n\n/**\n * Removes the imageId from the request pool manager and executes the `cancel`\n * function if it exists.\n *\n * @param imageId - A Cornerstone Image Object's imageId\n *\n */\nexport function cancelLoadImage(imageId: string): void {\n const filterFunction = ({ additionalDetails }) => {\n if (additionalDetails.imageId) {\n return additionalDetails.imageId !== imageId;\n }\n\n // for volumes\n return true;\n };\n\n // Instruct the request pool manager to filter queued\n // requests to ensure requests we no longer need are\n // no longer sent.\n imageLoadPoolManager.filterRequests(filterFunction);\n\n // TODO: Cancel decoding and retrieval as well (somehow?)\n\n // cancel image loading if in progress\n const imageLoadObject = cache.getImageLoadObject(imageId);\n\n if (imageLoadObject) {\n imageLoadObject.cancelFn();\n }\n}\n\n/**\n * Removes the imageIds from the request pool manager and calls the `cancel`\n * function if it exists.\n *\n * @param imageIds - Array of Cornerstone Image Object's imageIds\n *\n */\nexport function cancelLoadImages(imageIds: Array): void {\n imageIds.forEach((imageId) => cancelLoadImage(imageId));\n}\n\n/**\n * Removes all the ongoing image loads by calling the `cancel` method on each\n * imageLoadObject. If no `cancel` method is available, it will be ignored.\n *\n */\nexport function cancelLoadAll(): void {\n const requestPool = imageLoadPoolManager.getRequestPool();\n\n Object.keys(requestPool).forEach((type: string) => {\n const requests = requestPool[type];\n\n Object.keys(requests).forEach((priority) => {\n const requestDetails = requests[priority].pop();\n const { imageId, volumeId } = requestDetails.additionalDetails;\n\n let loadObject;\n\n if (imageId) {\n loadObject = cache.getImageLoadObject(imageId);\n } else if (volumeId) {\n loadObject = cache.getVolumeLoadObject(volumeId);\n }\n if (loadObject) {\n loadObject.cancel();\n }\n });\n // resetting the pool types to be empty\n imageLoadPoolManager.clearRequestStack(type);\n\n // TODO: Clear retrieval and decoding queues as well\n });\n}\n\n/**\n * Registers an imageLoader plugin with cornerstone for the specified scheme\n *\n * @param scheme - The scheme to use for this image loader (e.g. 'dicomweb', 'wadouri', 'http')\n * @param imageLoader - A Cornerstone Image Loader function\n */\nexport function registerImageLoader(\n scheme: string,\n imageLoader: ImageLoaderFn\n): void {\n imageLoaders[scheme] = imageLoader;\n}\n/**\n * Registers a new unknownImageLoader and returns the previous one\n *\n * @param imageLoader - A Cornerstone Image Loader\n *\n * @returns The previous Unknown Image Loader\n */\nexport function registerUnknownImageLoader(\n imageLoader: ImageLoaderFn\n): ImageLoaderFn {\n const oldImageLoader = unknownImageLoader;\n unknownImageLoader = imageLoader;\n return oldImageLoader;\n}\n/**\n * Removes all registered and unknown image loaders. This should be called\n * when the application is unmounted to prevent memory leaks.\n *\n */\nexport function unregisterAllImageLoaders(): void {\n Object.keys(imageLoaders).forEach(\n (imageLoader) => delete imageLoaders[imageLoader]\n );\n unknownImageLoader = undefined;\n}\n","const VIEWPORT_ELEMENT = 'viewport-element';\nconst CANVAS_CSS_CLASS = 'cornerstone-canvas';\n\n/**\n * Create a canvas and append it to the element\n *\n * @param element - An HTML Element\n * @returns canvas - A Canvas DOM element\n */\nfunction createCanvas(element: Element | HTMLDivElement): HTMLCanvasElement {\n const canvas = document.createElement('canvas');\n\n canvas.style.position = 'absolute';\n canvas.style.width = '100%';\n canvas.style.height = '100%';\n canvas.classList.add(CANVAS_CSS_CLASS);\n element.appendChild(canvas);\n\n return canvas;\n}\n\n/**\n * Creates an internal div that will contain canvas and SVG layer as children\n * @param element - An HTML Element\n * @returns div Cornerstone internal div that will include the canvas and SVG\n * as its children\n */\nexport function createViewportElement(element: HTMLDivElement): HTMLDivElement {\n const div = document.createElement('div');\n div.style.position = 'relative';\n div.style.width = '100%';\n div.style.height = '100%';\n div.classList.add(VIEWPORT_ELEMENT);\n element.appendChild(div);\n\n return div;\n}\n\n/**\n * Create a canvas or returns the one that already exists for a given element.\n * It first checks if the element has a canvas, if not it creates one and returns it.\n *\n * @param element - An HTML Element\n * @returns canvas a Canvas DOM element\n */\nexport default function getOrCreateCanvas(\n element: HTMLDivElement\n): HTMLCanvasElement {\n const canvasSelector = `canvas.${CANVAS_CSS_CLASS}`;\n const viewportElement = `div.${VIEWPORT_ELEMENT}`;\n\n // Internal div with `relative` positioning to enable absolute positioning\n // of the canvas and svg layer.\n const internalDiv =\n element.querySelector(viewportElement) || createViewportElement(element);\n\n return internalDiv.querySelector(canvasSelector) || createCanvas(internalDiv);\n}\n","import { IImage } from '../types';\n\nconst isPTPrescaledWithSUV = (image: IImage) => {\n return image.preScale?.scaled && image.preScale.scalingParameters?.suvbw;\n};\n\nexport default isPTPrescaledWithSUV;\n","import getOrCreateCanvas from '../RenderingEngine/helpers/getOrCreateCanvas';\nimport { ViewportType, Events } from '../enums';\nimport StackViewport from '../RenderingEngine/StackViewport';\nimport { IImage } from '../types';\nimport { getRenderingEngine } from '../RenderingEngine/getRenderingEngine';\nimport RenderingEngine from '../RenderingEngine';\nimport isPTPrescaledWithSUV from './isPTPrescaledWithSUV';\n\n/**\n * Renders an cornerstone image to a Canvas. This method will handle creation\n * of a temporary enabledElement, setting the imageId, and rendering the image via\n * a StackViewport, copying the canvas drawing to the given canvas Element, and\n * disabling the created temporary element. SuppressEvents argument is used to\n * prevent events from firing during the render process (e.g. during a series\n * of renders to a thumbnail image).\n *\n * @example\n * ```\n * const canvas = document.getElementById('myCanvas')\n *\n * renderToCanvasGPU(canvas, image)\n * ```\n * @param canvas - Canvas element to render to\n * @param image - The image to render\n * @param modality - [Default = undefined] The modality of the image\n * @returns - A promise that resolves when the image has been rendered with the imageId\n */\nexport default function renderToCanvasGPU(\n canvas: HTMLCanvasElement,\n image: IImage,\n modality = undefined,\n renderingEngineId = '_thumbnails'\n): Promise {\n if (!canvas || !(canvas instanceof HTMLCanvasElement)) {\n throw new Error('canvas element is required');\n }\n\n const imageIdToPrint = image.imageId;\n const viewportId = `renderGPUViewport-${imageIdToPrint}`;\n const imageId = image.imageId;\n const element = document.createElement('div');\n element.style.width = `${canvas.width}px`;\n element.style.height = `${canvas.height}px`;\n element.style.visibility = 'hidden';\n element.style.position = 'absolute';\n\n // Up-sampling the provided canvas to match the device pixel ratio\n // since we use device pixel ratio to determine the size of the canvas\n // inside the rendering engine.\n const devicePixelRatio = window.devicePixelRatio || 1;\n const originalWidth = canvas.width;\n const originalHeight = canvas.height;\n canvas.width = originalWidth * devicePixelRatio;\n canvas.height = originalHeight * devicePixelRatio;\n canvas.style.width = `${originalWidth}px`;\n canvas.style.height = `${originalHeight}px`;\n\n document.body.appendChild(element);\n\n // add id to the element so we can find it later, and fix the : which is not allowed in css\n const uniqueId = viewportId.split(':').join('-');\n element.setAttribute('viewport-id-for-remove', uniqueId);\n\n const renderingEngine =\n (getRenderingEngine(renderingEngineId) as RenderingEngine) ||\n new RenderingEngine(renderingEngineId);\n\n let viewport = renderingEngine.getViewport(viewportId) as StackViewport;\n\n if (!viewport) {\n const stackViewportInput = {\n viewportId,\n type: ViewportType.STACK,\n element,\n defaultOptions: {\n suppressEvents: true,\n },\n };\n renderingEngine.enableElement(stackViewportInput);\n viewport = renderingEngine.getViewport(viewportId) as StackViewport;\n }\n\n return new Promise((resolve) => {\n // Creating a temporary HTML element so that we can\n // enable it and later disable it without losing the canvas context\n let elementRendered = false;\n\n // Create a named function to handle the event\n const onImageRendered = (eventDetail) => {\n if (elementRendered) {\n return;\n }\n\n // get the canvas element that is the child of the div\n const temporaryCanvas = getOrCreateCanvas(element);\n\n // Copy the temporary canvas to the given canvas\n const context = canvas.getContext('2d');\n context.drawImage(\n temporaryCanvas,\n 0,\n 0,\n temporaryCanvas.width,\n temporaryCanvas.height, // source dimensions\n 0,\n 0,\n canvas.width,\n canvas.height // destination dimensions\n );\n\n elementRendered = true;\n\n // remove based on id\n element.removeEventListener(Events.IMAGE_RENDERED, onImageRendered);\n\n // Ensure pending previous resize calls are done which might have been\n // triggered by the same disableElement call. This is to avoid potential\n // grab of the wrong canvas coordinate from the offscreen renderer since\n // disable might have not finished resizing yet and it will cause weird\n // copy to on screen from an incorrect location in the offscreen renderer.\n setTimeout(() => {\n renderingEngine.disableElement(viewportId);\n\n // remove all the elements that has the same id\n const elements = document.querySelectorAll(\n `[viewport-id-for-remove=\"${uniqueId}\"]`\n );\n elements.forEach((element) => {\n element.remove();\n });\n }, 0);\n resolve(imageId);\n };\n\n element.addEventListener(Events.IMAGE_RENDERED, onImageRendered);\n viewport.renderImageObject(image);\n\n // force a reset camera to center the image\n viewport.resetCamera();\n\n if (modality === 'PT' && !isPTPrescaledWithSUV(image)) {\n viewport.setProperties({\n voiRange: {\n lower: image.minPixelValue,\n upper: image.maxPixelValue,\n },\n });\n }\n\n viewport.render();\n });\n}\n","import { CPUFallbackViewport } from '../../../../types';\n\nconst state = {\n viewport: {},\n};\n\n/**\n * Sets new default values for `getDefaultViewport`\n *\n * @param {Object} viewport - Object that sets new default values for getDefaultViewport\n * @returns {undefined}\n */\nexport default function (viewport: CPUFallbackViewport): void {\n state.viewport = viewport || {};\n}\n\nexport { state };\n","/**\n * Check if the supplied parameter is undefined and throws and error\n * @param {any} checkParam the parameter to validate for undefined\n * @param {any} errorMsg the error message to be thrown\n * @returns {void}\n * @memberof internal\n */\nexport function validateParameterUndefined(\n checkParam: any | undefined,\n errorMsg: string\n): void {\n if (checkParam === undefined) {\n throw new Error(errorMsg);\n }\n}\n\n/**\n * Check if the supplied parameter is undefined or null and throws and error\n * @param {any} checkParam the parameter to validate for undefined\n * @param {any} errorMsg the error message to be thrown\n * @returns {void}\n * @memberof internal\n */\nexport function validateParameterUndefinedOrNull(\n checkParam: any | null | undefined,\n errorMsg: string\n): void {\n if (checkParam === undefined || checkParam === null) {\n throw new Error(errorMsg);\n }\n}\n","import { validateParameterUndefinedOrNull } from './validator';\nimport { IImage } from '../../../../types';\n\n/**\n * Check if the angle is rotated\n * @param {Number} rotation the rotation angle\n * @returns {Boolean} true if the angle is rotated; Otherwise, false.\n * @memberof Internal\n */\nfunction isRotated(rotation?: number | null): boolean {\n return !(\n rotation === null ||\n rotation === undefined ||\n rotation === 0 ||\n rotation === 180\n );\n}\n\n/**\n * Retrieves the current image dimensions given an enabled element\n *\n * @param {any} image The Cornerstone image.\n * @param {Number} rotation Optional. The rotation angle of the image.\n * @return {{width:Number, height:Number}} The Image dimensions\n * @memberof Internal\n */\nexport default function (\n image: IImage,\n rotation = null\n): { height: number; width: number } {\n validateParameterUndefinedOrNull(\n image,\n 'getImageSize: parameter image must not be undefined'\n );\n validateParameterUndefinedOrNull(\n image.width,\n 'getImageSize: parameter image must have width'\n );\n validateParameterUndefinedOrNull(\n image.height,\n 'getImageSize: parameter image must have height'\n );\n\n if (isRotated(rotation)) {\n return {\n height: image.width,\n width: image.height,\n };\n }\n\n return {\n width: image.width,\n height: image.height,\n };\n}\n","import { validateParameterUndefinedOrNull } from './validator';\nimport getImageSize from './getImageSize';\nimport { IImage } from '../../../../types';\n\n/**\n * Calculates the horizontal, vertical and minimum scale factor for an image\n @param canvas - The window size where the image is displayed. This can be any HTML element or structure with a width, height fields (e.g. canvas).\n * @param image - The cornerstone image object\n * @param rotation - The rotation angle of the image.\n * @returns The calculated horizontal, vertical and minimum scale factor\n */\nexport default function (\n canvas: HTMLCanvasElement,\n image: IImage,\n rotation: number | null = null\n): {\n verticalScale: number;\n horizontalScale: number;\n scaleFactor: number;\n} {\n validateParameterUndefinedOrNull(\n canvas,\n 'getImageScale: parameter canvas must not be undefined'\n );\n validateParameterUndefinedOrNull(\n image,\n 'getImageScale: parameter image must not be undefined'\n );\n\n const imageSize = getImageSize(image, rotation);\n const rowPixelSpacing = image.rowPixelSpacing || 1;\n const columnPixelSpacing = image.columnPixelSpacing || 1;\n let verticalRatio = 1;\n let horizontalRatio = 1;\n\n if (rowPixelSpacing < columnPixelSpacing) {\n horizontalRatio = columnPixelSpacing / rowPixelSpacing;\n } else {\n // even if they are equal we want to calculate this ratio (the ration might be 0.5)\n verticalRatio = rowPixelSpacing / columnPixelSpacing;\n }\n\n const verticalScale = canvas.height / imageSize.height / verticalRatio;\n const horizontalScale = canvas.width / imageSize.width / horizontalRatio;\n\n // Fit image to window\n return {\n verticalScale,\n horizontalScale,\n scaleFactor: Math.min(horizontalScale, verticalScale),\n };\n}\n","import createViewport from './createViewport';\nimport getImageFitScale from './getImageFitScale';\nimport {\n IImage,\n CPUFallbackColormap,\n CPUFallbackViewport,\n} from '../../../../types';\n\n/**\n * Creates a new viewport object containing default values for the image and canvas\n *\n * @param canvas - A Canvas DOM element\n * @param image - A Cornerstone Image Object\n * @returns viewport - object\n */\nexport default function (\n canvas: HTMLCanvasElement,\n image: IImage,\n modality?: string,\n colormap?: CPUFallbackColormap\n): CPUFallbackViewport {\n if (canvas === undefined) {\n throw new Error(\n 'getDefaultViewport: parameter canvas must not be undefined'\n );\n }\n\n if (image === undefined) {\n return createViewport();\n }\n\n // Fit image to window\n const scale = getImageFitScale(canvas, image, 0).scaleFactor;\n\n let voi;\n\n if (modality === 'PT' && image.isPreScaled) {\n voi = {\n windowWidth: 5,\n windowCenter: 2.5,\n };\n } else if (\n image.windowWidth !== undefined &&\n image.windowCenter !== undefined\n ) {\n voi = {\n windowWidth: Array.isArray(image.windowWidth)\n ? image.windowWidth[0]\n : image.windowWidth,\n windowCenter: Array.isArray(image.windowCenter)\n ? image.windowCenter[0]\n : image.windowCenter,\n };\n }\n\n return {\n scale,\n translation: {\n x: 0,\n y: 0,\n },\n voi,\n invert: image.invert,\n pixelReplication: false,\n rotation: 0,\n hflip: false,\n vflip: false,\n modalityLUT: image.modalityLUT,\n modality,\n voiLUT: image.voiLUT,\n colormap: colormap !== undefined ? colormap : image.colormap,\n displayedArea: {\n tlhc: {\n x: 1,\n y: 1,\n },\n brhc: {\n x: image.columns,\n y: image.rows,\n },\n rowPixelSpacing:\n image.rowPixelSpacing === undefined ? 1 : image.rowPixelSpacing,\n columnPixelSpacing:\n image.columnPixelSpacing === undefined ? 1 : image.columnPixelSpacing,\n presentationSizeMode: 'NONE',\n },\n };\n}\n","import { state } from './setDefaultViewport';\nimport {\n CPUFallbackViewportDisplayedArea,\n CPUFallbackViewport,\n} from '../../../../types';\n\n// eslint-disable-next-line valid-jsdoc\n/**\n * Creates the default displayed area.\n * C.10.4 Displayed Area Module: This Module describes Attributes required to define a Specified Displayed Area space.\n *\n * @returns {tlhc: {x,y}, brhc: {x, y},rowPixelSpacing: Number, columnPixelSpacing: Number, presentationSizeMode: Number} displayedArea object\n * @memberof Internal\n */\nfunction createDefaultDisplayedArea(): CPUFallbackViewportDisplayedArea {\n return {\n // Top Left Hand Corner\n tlhc: {\n x: 1,\n y: 1,\n },\n // Bottom Right Hand Corner\n brhc: {\n x: 1,\n y: 1,\n },\n rowPixelSpacing: 1,\n columnPixelSpacing: 1,\n presentationSizeMode: 'NONE',\n };\n}\n\n/**\n * Creates a new viewport object containing default values\n *\n * @returns {Viewport} viewport object\n * @memberof Internal\n */\nexport default function createViewport(): CPUFallbackViewport {\n const displayedArea = createDefaultDisplayedArea();\n const initialDefaultViewport = {\n scale: 1,\n translation: {\n x: 0,\n y: 0,\n },\n voi: {\n windowWidth: undefined,\n windowCenter: undefined,\n },\n invert: false,\n pixelReplication: false,\n rotation: 0,\n hflip: false,\n vflip: false,\n modalityLUT: undefined,\n voiLUT: undefined,\n colormap: undefined,\n labelmap: false,\n displayedArea,\n };\n\n return Object.assign({}, initialDefaultViewport, state.viewport);\n}\n","import {\n CPUFallbackTransform,\n Point2,\n TransformMatrix2D,\n} from '../../../../types';\n\n// By Simon Sarris\n// Www.simonsarris.com\n// Sarris@acm.org\n//\n// Free to use and distribute at will\n// So long as you are nice to people, etc\n\n// Simple class for keeping track of the current transformation matrix\n\n// For instance:\n// Var t = new Transform();\n// T.rotate(5);\n// Var m = t.m;\n// Ctx.setTransform(m[0], m[1], m[2], m[3], m[4], m[5]);\n\n// Is equivalent to:\n// Ctx.rotate(5);\n\n// But now you can retrieve it :)\n\n// Remember that this does not account for any CSS transforms applied to the canvas\nexport class Transform implements CPUFallbackTransform {\n private m: TransformMatrix2D;\n\n constructor() {\n this.reset();\n }\n\n getMatrix(): TransformMatrix2D {\n return this.m;\n }\n\n reset(): void {\n this.m = [1, 0, 0, 1, 0, 0];\n }\n\n clone(): CPUFallbackTransform {\n const transform = new Transform();\n\n transform.m[0] = this.m[0];\n transform.m[1] = this.m[1];\n transform.m[2] = this.m[2];\n transform.m[3] = this.m[3];\n transform.m[4] = this.m[4];\n transform.m[5] = this.m[5];\n\n return transform;\n }\n\n multiply(matrix: TransformMatrix2D): void {\n const m11 = this.m[0] * matrix[0] + this.m[2] * matrix[1];\n const m12 = this.m[1] * matrix[0] + this.m[3] * matrix[1];\n\n const m21 = this.m[0] * matrix[2] + this.m[2] * matrix[3];\n const m22 = this.m[1] * matrix[2] + this.m[3] * matrix[3];\n\n const dx = this.m[0] * matrix[4] + this.m[2] * matrix[5] + this.m[4];\n const dy = this.m[1] * matrix[4] + this.m[3] * matrix[5] + this.m[5];\n\n this.m[0] = m11;\n this.m[1] = m12;\n this.m[2] = m21;\n this.m[3] = m22;\n this.m[4] = dx;\n this.m[5] = dy;\n }\n\n invert(): void {\n const d = 1 / (this.m[0] * this.m[3] - this.m[1] * this.m[2]);\n const m0 = this.m[3] * d;\n const m1 = -this.m[1] * d;\n const m2 = -this.m[2] * d;\n const m3 = this.m[0] * d;\n const m4 = d * (this.m[2] * this.m[5] - this.m[3] * this.m[4]);\n const m5 = d * (this.m[1] * this.m[4] - this.m[0] * this.m[5]);\n\n this.m[0] = m0;\n this.m[1] = m1;\n this.m[2] = m2;\n this.m[3] = m3;\n this.m[4] = m4;\n this.m[5] = m5;\n }\n\n rotate(rad: number): void {\n const c = Math.cos(rad);\n const s = Math.sin(rad);\n const m11 = this.m[0] * c + this.m[2] * s;\n const m12 = this.m[1] * c + this.m[3] * s;\n const m21 = this.m[0] * -s + this.m[2] * c;\n const m22 = this.m[1] * -s + this.m[3] * c;\n\n this.m[0] = m11;\n this.m[1] = m12;\n this.m[2] = m21;\n this.m[3] = m22;\n }\n\n translate(x: number, y: number): void {\n this.m[4] += this.m[0] * x + this.m[2] * y;\n this.m[5] += this.m[1] * x + this.m[3] * y;\n }\n\n scale(sx: number, sy: number) {\n this.m[0] *= sx;\n this.m[1] *= sx;\n this.m[2] *= sy;\n this.m[3] *= sy;\n }\n\n transformPoint(point: Point2): Point2 {\n const x = point[0];\n const y = point[1];\n\n return [\n x * this.m[0] + y * this.m[2] + this.m[4],\n x * this.m[1] + y * this.m[3] + this.m[5],\n ];\n }\n}\n","import { Transform } from './transform';\nimport {\n CPUFallbackEnabledElement,\n CPUFallbackTransform,\n} from '../../../../types';\n\n/**\n * Calculate the transform for a Cornerstone enabled element\n *\n * @param enabledElement - The Cornerstone Enabled Element\n * @param scale - The viewport scale\n * @returns The current transform\n */\nexport default function (\n enabledElement: CPUFallbackEnabledElement,\n scale?: number\n): CPUFallbackTransform {\n const transform = new Transform();\n\n if (!enabledElement.viewport.displayedArea) {\n return transform;\n }\n\n // Move to center of canvas\n transform.translate(\n enabledElement.canvas.width / 2,\n enabledElement.canvas.height / 2\n );\n\n // Apply the rotation before scaling for non square pixels\n const angle = enabledElement.viewport.rotation;\n\n if (angle !== 0) {\n transform.rotate((angle * Math.PI) / 180);\n }\n\n // Apply the scale\n let widthScale = enabledElement.viewport.scale;\n let heightScale = enabledElement.viewport.scale;\n\n const width =\n enabledElement.viewport.displayedArea.brhc.x -\n (enabledElement.viewport.displayedArea.tlhc.x - 1);\n const height =\n enabledElement.viewport.displayedArea.brhc.y -\n (enabledElement.viewport.displayedArea.tlhc.y - 1);\n\n if (enabledElement.viewport.displayedArea.presentationSizeMode === 'NONE') {\n if (\n enabledElement.image.rowPixelSpacing <\n enabledElement.image.columnPixelSpacing\n ) {\n widthScale *=\n enabledElement.image.columnPixelSpacing /\n enabledElement.image.rowPixelSpacing;\n } else if (\n enabledElement.image.columnPixelSpacing <\n enabledElement.image.rowPixelSpacing\n ) {\n heightScale *=\n enabledElement.image.rowPixelSpacing /\n enabledElement.image.columnPixelSpacing;\n }\n } else {\n // These should be good for \"TRUE SIZE\" and \"MAGNIFY\"\n widthScale = enabledElement.viewport.displayedArea.columnPixelSpacing;\n heightScale = enabledElement.viewport.displayedArea.rowPixelSpacing;\n\n if (\n enabledElement.viewport.displayedArea.presentationSizeMode ===\n 'SCALE TO FIT'\n ) {\n // Fit TRUE IMAGE image (width/height) to window\n const verticalScale =\n enabledElement.canvas.height / (height * heightScale);\n const horizontalScale =\n enabledElement.canvas.width / (width * widthScale);\n\n // Apply new scale\n widthScale = heightScale = Math.min(horizontalScale, verticalScale);\n\n if (\n enabledElement.viewport.displayedArea.rowPixelSpacing <\n enabledElement.viewport.displayedArea.columnPixelSpacing\n ) {\n widthScale *=\n enabledElement.viewport.displayedArea.columnPixelSpacing /\n enabledElement.viewport.displayedArea.rowPixelSpacing;\n } else if (\n enabledElement.viewport.displayedArea.columnPixelSpacing <\n enabledElement.viewport.displayedArea.rowPixelSpacing\n ) {\n heightScale *=\n enabledElement.viewport.displayedArea.rowPixelSpacing /\n enabledElement.viewport.displayedArea.columnPixelSpacing;\n }\n }\n }\n\n transform.scale(widthScale, heightScale);\n\n // Unrotate to so we can translate unrotated\n if (angle !== 0) {\n transform.rotate((-angle * Math.PI) / 180);\n }\n\n // Apply the pan offset\n transform.translate(\n enabledElement.viewport.translation.x,\n enabledElement.viewport.translation.y\n );\n\n // Rotate again so we can apply general scale\n if (angle !== 0) {\n transform.rotate((angle * Math.PI) / 180);\n }\n\n if (scale !== undefined) {\n // Apply the font scale\n transform.scale(scale, scale);\n }\n\n // Apply Flip if required\n if (enabledElement.viewport.hflip) {\n transform.scale(-1, 1);\n }\n\n if (enabledElement.viewport.vflip) {\n transform.scale(1, -1);\n }\n\n // Move back from center of image\n transform.translate(-width / 2, -height / 2);\n\n return transform;\n}\n","/**\n * Use the performance.now() method if possible, and if not, use Date.now()\n *\n * @return {number} Time elapsed since the time origin\n * @memberof Polyfills\n */\nexport default function (): number {\n if (window.performance) {\n return performance.now();\n }\n\n return Date.now();\n}\n","/* eslint no-bitwise: 0 */\n\n/**\n * Volume of Interest Lookup Table Function\n *\n * @typedef {Function} VOILUTFunction\n *\n * @param {Number} modalityLutValue\n * @returns {Number} transformed value\n * @memberof Objects\n */\n\n/**\n * @module: VOILUT\n */\n\n/**\n * Generates the linear VOI LUT function.\n * From the DICOM standard:\n * https://dicom.nema.org/medical/dicom/current/output/html/part03.html#sect_C.11.2.1.2.1\n * ((x - (c - 0.5)) / (w-1) + 0.5) * (ymax- ymin) + ymin\n * clipped to the ymin...ymax range\n *\n * @param {Number} windowWidth Window Width\n * @param {Number} windowCenter Window Center\n * @returns {VOILUTFunction} VOI LUT mapping function\n * @memberof VOILUT\n */\nfunction generateLinearVOILUT(windowWidth: number, windowCenter: number) {\n return function (modalityLutValue) {\n const value =\n ((modalityLutValue - (windowCenter - 0.5)) / (windowWidth - 1) + 0.5) *\n 255.0;\n return Math.min(Math.max(value, 0), 255);\n };\n}\n\n/**\n * Generate a non-linear volume of interest lookup table\n *\n * @param {LUT} voiLUT Volume of Interest Lookup Table Object\n *\n * @returns {VOILUTFunction} VOI LUT mapping function\n * @memberof VOILUT\n */\nfunction generateNonLinearVOILUT(voiLUT) {\n // We don't trust the voiLUT.numBitsPerEntry, mainly thanks to Agfa!\n const bitsPerEntry = Math.max(...voiLUT.lut).toString(2).length;\n const shift = bitsPerEntry - 8;\n const minValue = voiLUT.lut[0] >> shift;\n const maxValue = voiLUT.lut[voiLUT.lut.length - 1] >> shift;\n const maxValueMapped = voiLUT.firstValueMapped + voiLUT.lut.length - 1;\n\n return function (modalityLutValue) {\n if (modalityLutValue < voiLUT.firstValueMapped) {\n return minValue;\n } else if (modalityLutValue >= maxValueMapped) {\n return maxValue;\n }\n\n return voiLUT.lut[modalityLutValue - voiLUT.firstValueMapped] >> shift;\n };\n}\n\n/**\n * Retrieve a VOI LUT mapping function given the current windowing settings\n * and the VOI LUT for the image\n *\n * @param {Number} windowWidth Window Width\n * @param {Number} windowCenter Window Center\n * @param {LUT} [voiLUT] Volume of Interest Lookup Table Object\n *\n * @return {VOILUTFunction} VOI LUT mapping function\n * @memberof VOILUT\n */\nexport default function (windowWidth: number, windowCenter: number, voiLUT) {\n if (voiLUT) {\n return generateNonLinearVOILUT(voiLUT);\n }\n\n return generateLinearVOILUT(windowWidth, windowCenter);\n}\n","import calculateTransform from './calculateTransform';\nimport { CPUFallbackEnabledElement } from '../../../../types';\n\n/**\n * Sets the canvas context transformation matrix to the pixel coordinate system. This allows\n * geometry to be driven using the canvas context using coordinates in the pixel coordinate system\n * @param {EnabledElement} enabledElement The\n * @param {CanvasRenderingContext2D} context The CanvasRenderingContext2D for the enabledElement's Canvas\n * @param {Number} [scale] Optional scale to apply\n * @returns {void}\n */\nexport default function (\n enabledElement: CPUFallbackEnabledElement,\n context: CanvasRenderingContext2D,\n scale?: number\n): void {\n if (enabledElement === undefined) {\n throw new Error(\n 'setToPixelCoordinateSystem: parameter enabledElement must not be undefined'\n );\n }\n if (context === undefined) {\n throw new Error(\n 'setToPixelCoordinateSystem: parameter context must not be undefined'\n );\n }\n\n const transform = calculateTransform(enabledElement, scale);\n const m = transform.getMatrix();\n\n context.setTransform(m[0], m[1], m[2], m[3], m[4], m[5]);\n}\n","import { CPUFallbackEnabledElement, IImage } from '../../../../types';\n\n/**\n * Determine whether or not an Enabled Element needs to be re-rendered.\n *\n * If the imageId has changed, or if any of the last rendered viewport\n * parameters have changed, this function will return true.\n *\n * @param enabledElement - An Enabled Element\n * @param image - An Image\n * @returns Whether - or not the Enabled Element needs to re-render its image\n */\nexport default function doesImageNeedToBeRendered(\n enabledElement: CPUFallbackEnabledElement,\n image: IImage\n): boolean {\n const lastRenderedImageId = enabledElement.renderingTools.lastRenderedImageId;\n const lastRenderedViewport =\n enabledElement.renderingTools.lastRenderedViewport;\n\n return (\n image.imageId !== lastRenderedImageId ||\n !lastRenderedViewport ||\n lastRenderedViewport.windowCenter !==\n enabledElement.viewport.voi.windowCenter ||\n lastRenderedViewport.windowWidth !==\n enabledElement.viewport.voi.windowWidth ||\n lastRenderedViewport.invert !== enabledElement.viewport.invert ||\n lastRenderedViewport.rotation !== enabledElement.viewport.rotation ||\n lastRenderedViewport.hflip !== enabledElement.viewport.hflip ||\n lastRenderedViewport.vflip !== enabledElement.viewport.vflip ||\n lastRenderedViewport.modalityLUT !== enabledElement.viewport.modalityLUT ||\n lastRenderedViewport.voiLUT !== enabledElement.viewport.voiLUT ||\n lastRenderedViewport.colormap !== enabledElement.viewport.colormap\n );\n}\n","import { CPUFallbackEnabledElement, IImage } from '../../../../types';\n\n/**\n * Sets size and clears canvas\n *\n * @param {Object} enabledElement Cornerstone Enabled Element\n * @param {Object} image Image to be rendered\n * @returns {void}\n * @memberof rendering\n */\nexport default function (\n enabledElement: CPUFallbackEnabledElement,\n image: IImage\n): void {\n const renderCanvas = enabledElement.renderingTools.renderCanvas;\n\n // Resize the canvas\n renderCanvas.width = image.width;\n renderCanvas.height = image.height;\n\n const canvasContext = renderCanvas.getContext('2d');\n\n // NOTE - we need to fill the render canvas with white pixels since we\n // control the luminance using the alpha channel to improve rendering performance.\n canvasContext.fillStyle = 'white';\n canvasContext.fillRect(0, 0, renderCanvas.width, renderCanvas.height);\n\n const renderCanvasData = canvasContext.getImageData(\n 0,\n 0,\n image.width,\n image.height\n );\n\n enabledElement.renderingTools.renderCanvasContext = canvasContext;\n enabledElement.renderingTools.renderCanvasData = renderCanvasData;\n}\n","import {\n CPUFallbackEnabledElement,\n CPUFallbackRenderingTools,\n} from '../../../../types';\n\n/**\n * Saves the parameters of the last render into renderingTools, used later to decide if data can be reused.\n *\n * @param {Object} enabledElement Cornerstone EnabledElement\n * @returns {Object} enabledElement.renderingTools\n * @memberof rendering\n */\n\nexport default function (\n enabledElement: CPUFallbackEnabledElement\n): CPUFallbackRenderingTools {\n const imageId = enabledElement.image.imageId;\n const viewport = enabledElement.viewport;\n const isColor = enabledElement.image.color;\n\n enabledElement.renderingTools.lastRenderedImageId = imageId;\n enabledElement.renderingTools.lastRenderedIsColor = isColor;\n enabledElement.renderingTools.lastRenderedViewport = {\n windowCenter: viewport.voi.windowCenter,\n windowWidth: viewport.voi.windowWidth,\n invert: viewport.invert,\n rotation: viewport.rotation,\n hflip: viewport.hflip,\n vflip: viewport.vflip,\n modalityLUT: viewport.modalityLUT,\n voiLUT: viewport.voiLUT,\n colormap: viewport.colormap,\n };\n\n return enabledElement.renderingTools;\n}\n","import now from './now';\nimport generateColorLUT from './generateColorLUT';\nimport storedColorPixelDataToCanvasImageData from './storedColorPixelDataToCanvasImageData';\nimport storedRGBAPixelDataToCanvasImageData from './storedRGBAPixelDataToCanvasImageData';\nimport setToPixelCoordinateSystem from './setToPixelCoordinateSystem';\nimport doesImageNeedToBeRendered from './doesImageNeedToBeRendered';\nimport initializeRenderCanvas from './initializeRenderCanvas';\nimport saveLastRendered from './saveLastRendered';\nimport {\n IImage,\n CPUFallbackViewport,\n CPUFallbackEnabledElement,\n} from '../../../../types';\n\n/**\n * Generates an appropriate Look Up Table to render the given image with the given window width and level (specified in the viewport)\n * Uses an internal cache for performance\n *\n * @param {Object} image The image to be rendered\n * @param {Object} viewport The viewport values used for rendering\n * @returns {Uint8ClampedArray} Look Up Table array.\n * @memberof rendering\n */\nfunction getLut(image: IImage, viewport: CPUFallbackViewport) {\n // If we have a cached lut and it has the right values, return it immediately\n if (\n image.cachedLut !== undefined &&\n image.cachedLut.windowCenter === viewport.voi.windowCenter &&\n image.cachedLut.windowWidth === viewport.voi.windowWidth &&\n image.cachedLut.invert === viewport.invert\n ) {\n return image.cachedLut.lutArray;\n }\n\n // Lut is invalid or not present, regenerate it and cache it\n generateColorLUT(\n image,\n viewport.voi.windowWidth,\n viewport.voi.windowCenter,\n viewport.invert\n );\n image.cachedLut.windowWidth = viewport.voi.windowWidth;\n image.cachedLut.windowCenter = viewport.voi.windowCenter;\n image.cachedLut.invert = viewport.invert;\n\n return image.cachedLut.lutArray;\n}\n\n/**\n * Returns an appropriate canvas to render the Image. If the canvas available in the cache is appropriate\n * it is returned, otherwise adjustments are made. It also sets the color transfer functions.\n *\n * @param enabledElement - The cornerstone enabled element\n * @param image - The image to be rendered\n * @param invalidated - Is pixel data valid\n * @returns An appropriate canvas for rendering the image\n * @memberof rendering\n */\nfunction getRenderCanvas(\n enabledElement: CPUFallbackEnabledElement,\n image: IImage,\n invalidated: boolean\n): HTMLCanvasElement {\n const canvasWasColor =\n enabledElement.renderingTools.lastRenderedIsColor === true;\n\n if (!enabledElement.renderingTools.renderCanvas || !canvasWasColor) {\n enabledElement.renderingTools.renderCanvas =\n document.createElement('canvas');\n }\n\n const renderCanvas = enabledElement.renderingTools.renderCanvas;\n\n // The ww/wc is identity and not inverted - get a canvas with the image rendered into it for\n // Fast drawing. Note that this is 256/128, and NOT 255/127, per the DICOM\n // standard, but allow either.\n const { windowWidth, windowCenter } = enabledElement.viewport.voi;\n if (\n (windowWidth === 256 || windowWidth === 255) &&\n (windowCenter === 128 || windowCenter === 127) &&\n enabledElement.viewport.invert === false &&\n image.getCanvas &&\n image.getCanvas()\n ) {\n return image.getCanvas();\n }\n\n // Apply the lut to the stored pixel data onto the render canvas\n if (\n doesImageNeedToBeRendered(enabledElement, image) === false &&\n invalidated !== true\n ) {\n return renderCanvas;\n }\n\n // If our render canvas does not match the size of this image reset it\n // NOTE: This might be inefficient if we are updating multiple images of different\n // Sizes frequently.\n if (\n renderCanvas.width !== image.width ||\n renderCanvas.height !== image.height\n ) {\n initializeRenderCanvas(enabledElement, image);\n }\n\n // Get the lut to use\n let start = now();\n const colorLUT = getLut(image, enabledElement.viewport);\n\n image.stats = image.stats || {};\n image.stats.lastLutGenerateTime = now() - start;\n\n const renderCanvasData = enabledElement.renderingTools.renderCanvasData;\n const renderCanvasContext = enabledElement.renderingTools.renderCanvasContext;\n\n // The color image voi/invert has been modified - apply the lut to the underlying\n // Pixel data and put it into the renderCanvas\n if (image.rgba) {\n storedRGBAPixelDataToCanvasImageData(\n image,\n colorLUT,\n renderCanvasData.data\n );\n } else {\n storedColorPixelDataToCanvasImageData(\n image,\n colorLUT,\n renderCanvasData.data\n );\n }\n\n start = now();\n renderCanvasContext.putImageData(renderCanvasData, 0, 0);\n image.stats.lastPutImageDataTime = now() - start;\n\n return renderCanvas;\n}\n\n/**\n * API function to render a color image to an enabled element\n *\n * @param {EnabledElement} enabledElement The Cornerstone Enabled Element to redraw\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\n * @returns {void}\n * @memberof rendering\n */\nexport function renderColorImage(\n enabledElement: CPUFallbackEnabledElement,\n invalidated: boolean\n): void {\n if (enabledElement === undefined) {\n throw new Error(\n 'renderColorImage: enabledElement parameter must not be undefined'\n );\n }\n\n const image = enabledElement.image;\n\n if (image === undefined) {\n throw new Error(\n 'renderColorImage: image must be loaded before it can be drawn'\n );\n }\n\n // Get the canvas context and reset the transform\n const context = enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Clear the canvas\n context.fillStyle = 'black';\n context.fillRect(\n 0,\n 0,\n enabledElement.canvas.width,\n enabledElement.canvas.height\n );\n\n // Turn off image smooth/interpolation if pixelReplication is set in the viewport\n context.imageSmoothingEnabled = !enabledElement.viewport.pixelReplication;\n\n // Save the canvas context state and apply the viewport properties\n setToPixelCoordinateSystem(enabledElement, context);\n\n const renderCanvas = getRenderCanvas(enabledElement, image, invalidated);\n\n const sx = enabledElement.viewport.displayedArea.tlhc.x - 1;\n const sy = enabledElement.viewport.displayedArea.tlhc.y - 1;\n const width = enabledElement.viewport.displayedArea.brhc.x - sx;\n const height = enabledElement.viewport.displayedArea.brhc.y - sy;\n\n context.drawImage(renderCanvas, sx, sy, width, height, 0, 0, width, height);\n\n enabledElement.renderingTools = saveLastRendered(enabledElement);\n}\n","import getVOILUT from './getVOILut';\nimport { IImage, CPUFallbackLUT } from '../../../../types';\n\n/**\n * Creates a LUT used while rendering to convert stored pixel values to\n * display pixels\n *\n * @param image - A Cornerstone Image Object\n * @param windowWidth - The Window Width\n * @param windowCenter - The Window Center\n * @param invert - A boolean describing whether or not the image has been inverted\n * @param voiLUT- A Volume of Interest Lookup Table\n *\n * @returns A lookup table to apply to the image\n */\nexport default function generateColorLUT(\n image: IImage,\n windowWidth: number | number[],\n windowCenter: number | number[],\n invert: boolean,\n voiLUT?: CPUFallbackLUT\n) {\n const maxPixelValue = image.maxPixelValue;\n const minPixelValue = image.minPixelValue;\n const offset = Math.min(minPixelValue, 0);\n\n if (image.cachedLut === undefined) {\n const length = maxPixelValue - offset + 1;\n\n image.cachedLut = {};\n image.cachedLut.lutArray = new Uint8ClampedArray(length);\n }\n\n const lut = image.cachedLut.lutArray;\n const vlutfn = getVOILUT(\n Array.isArray(windowWidth) ? windowWidth[0] : windowWidth,\n Array.isArray(windowCenter) ? windowCenter[0] : windowCenter,\n voiLUT\n );\n\n if (invert === true) {\n for (\n let storedValue = minPixelValue;\n storedValue <= maxPixelValue;\n storedValue++\n ) {\n lut[storedValue + -offset] = 255 - vlutfn(storedValue);\n }\n } else {\n for (\n let storedValue = minPixelValue;\n storedValue <= maxPixelValue;\n storedValue++\n ) {\n lut[storedValue + -offset] = vlutfn(storedValue);\n }\n }\n\n return lut;\n}\n","import now from './now';\nimport { IImage } from '../../../../types';\n\n/**\n * Converts stored RGBA color pixel values to display pixel values using a LUT.\n *\n * @param {Image} image A Cornerstone Image Object\n * @param {Array} lut Lookup table array\n * @param {Uint8ClampedArray} canvasImageDataData canvasImageData.data buffer filled with white pixels\n *\n * @returns {void}\n * @memberof Internal\n */\nexport default function (\n image: IImage,\n lut: Uint8ClampedArray,\n canvasImageDataData: Uint8ClampedArray\n): void {\n let start = now();\n const pixelData = image.getPixelData();\n\n image.stats.lastGetPixelDataTime = now() - start;\n\n const minPixelValue = image.minPixelValue;\n let canvasImageDataIndex = 0;\n let storedPixelDataIndex = 0;\n const numPixels = pixelData.length;\n\n // NOTE: As of Nov 2014, most javascript engines have lower performance when indexing negative indexes.\n // We have a special code path for this case that improves performance. Thanks to @jpambrun for this enhancement\n start = now();\n if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex++] =\n lut[pixelData[storedPixelDataIndex++] + -minPixelValue]; // Red\n canvasImageDataData[canvasImageDataIndex++] =\n lut[pixelData[storedPixelDataIndex++] + -minPixelValue]; // Green\n canvasImageDataData[canvasImageDataIndex++] =\n lut[pixelData[storedPixelDataIndex++] + -minPixelValue]; // Blue\n canvasImageDataData[canvasImageDataIndex++] =\n pixelData[storedPixelDataIndex++];\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex++] =\n lut[pixelData[storedPixelDataIndex++]]; // Red\n canvasImageDataData[canvasImageDataIndex++] =\n lut[pixelData[storedPixelDataIndex++]]; // Green\n canvasImageDataData[canvasImageDataIndex++] =\n lut[pixelData[storedPixelDataIndex++]]; // Blue\n canvasImageDataData[canvasImageDataIndex++] =\n pixelData[storedPixelDataIndex++];\n }\n }\n image.stats.lastStoredPixelDataToCanvasImageDataTime = now() - start;\n}\n","import now from './now';\nimport { IImage } from '../../../../types';\n\n/**\n * Converts stored color pixel values to display pixel values using a LUT.\n *\n * Note: Skips alpha value for any input image pixel data.\n *\n * @param {Image} image A Cornerstone Image Object\n * @param {Array} lut Lookup table array\n * @param {Uint8ClampedArray} canvasImageDataData canvasImageData.data buffer filled with white pixels\n *\n * @returns {void}\n * @memberof Internal\n */\nexport default function (\n image: IImage,\n lut: Uint8ClampedArray,\n canvasImageDataData: Uint8ClampedArray\n): void {\n let start = now();\n const pixelData = image.getPixelData();\n\n image.stats.lastGetPixelDataTime = now() - start;\n\n const minPixelValue = image.minPixelValue;\n let canvasImageDataIndex = 0;\n let storedPixelDataIndex = 0;\n const numPixels = pixelData.length;\n\n // NOTE: As of Nov 2014, most javascript engines have lower performance when indexing negative indexes.\n // We have a special code path for this case that improves performance. Thanks to @jpambrun for this enhancement\n start = now();\n if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex++] =\n lut[pixelData[storedPixelDataIndex++] + -minPixelValue]; // Red\n canvasImageDataData[canvasImageDataIndex++] =\n lut[pixelData[storedPixelDataIndex++] + -minPixelValue]; // Green\n canvasImageDataData[canvasImageDataIndex] =\n lut[pixelData[storedPixelDataIndex] + -minPixelValue]; // Blue\n storedPixelDataIndex += 2;\n canvasImageDataIndex += 2;\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex++] =\n lut[pixelData[storedPixelDataIndex++]]; // Red\n canvasImageDataData[canvasImageDataIndex++] =\n lut[pixelData[storedPixelDataIndex++]]; // Green\n canvasImageDataData[canvasImageDataIndex] =\n lut[pixelData[storedPixelDataIndex]]; // Blue\n storedPixelDataIndex += 2;\n canvasImageDataIndex += 2;\n }\n }\n image.stats.lastStoredPixelDataToCanvasImageDataTime = now() - start;\n}\n","import type { IImage, CPUFallbackViewport } from '../../../../types';\n\n/**\n * Computes the VOI to display all the pixels if no VOI LUT data (Window Width/Window Center or voiLUT) exists on the viewport object.\n *\n * @param viewport - Object containing the viewport properties\n * @param image - An Image loaded by a Cornerstone Image Loader\n */\nexport default function computeAutoVoi(\n viewport: CPUFallbackViewport,\n image: IImage\n): void {\n if (hasVoi(viewport)) {\n return;\n }\n\n const maxVoi = image.maxPixelValue * image.slope + image.intercept;\n const minVoi = image.minPixelValue * image.slope + image.intercept;\n const ww = maxVoi - minVoi;\n const wc = (maxVoi + minVoi) / 2;\n\n if (viewport.voi === undefined) {\n viewport.voi = {\n windowWidth: ww,\n windowCenter: wc,\n };\n } else {\n viewport.voi.windowWidth = ww;\n viewport.voi.windowCenter = wc;\n }\n}\n\n/**\n * Check if viewport has voi LUT data\n * @param viewport - The viewport to check for voi LUT data\n * @returns true viewport has LUT data (Window Width/Window Center or voiLUT). Otherwise, false.\n */\nfunction hasVoi(viewport: CPUFallbackViewport): boolean {\n const hasLut =\n viewport.voiLUT && viewport.voiLUT.lut && viewport.voiLUT.lut.length > 0;\n\n return (\n hasLut ||\n (viewport.voi.windowWidth !== undefined &&\n viewport.voi.windowCenter !== undefined)\n );\n}\n","/**\n * Check if two lookup tables match\n *\n * @param {LUT} a A lookup table function\n * @param {LUT} b Another lookup table function\n * @return {boolean} Whether or not they match\n * @memberof rendering\n */\nexport default function (a: any, b: any) {\n // If undefined, they are equal\n if (!a && !b) {\n return true;\n }\n // If one is undefined, not equal\n if (!a || !b) {\n return false;\n }\n\n // Check the unique ids\n return a.id === b.id;\n}\n","import computeAutoVoi from './computeAutoVoi';\nimport lutMatches from './lutMatches';\nimport generateLut from './generateLut';\nimport { IImage, CPUFallbackViewport } from '../../../../types';\n\n/**\n * Retrieve or generate a LUT Array for an Image and Viewport\n *\n * @param {Image} image An Image Object\n * @param {Viewport} viewport An Viewport Object\n * @param {Boolean} invalidated Whether or not the LUT data has been invalidated\n * (e.g. by a change to the windowWidth, windowCenter, or invert viewport parameters).\n * @return {Uint8ClampedArray} LUT Array\n * @memberof rendering\n */\nexport default function (\n image: IImage,\n viewport: CPUFallbackViewport,\n invalidated: boolean\n): Uint8ClampedArray {\n // If we have a cached lut and it has the right values, return it immediately\n if (\n image.cachedLut !== undefined &&\n image.cachedLut.windowCenter === viewport.voi.windowCenter &&\n image.cachedLut.windowWidth === viewport.voi.windowWidth &&\n lutMatches(image.cachedLut.modalityLUT, viewport.modalityLUT) &&\n lutMatches(image.cachedLut.voiLUT, viewport.voiLUT) &&\n image.cachedLut.invert === viewport.invert &&\n invalidated !== true\n ) {\n return image.cachedLut.lutArray;\n }\n\n computeAutoVoi(viewport, image);\n\n // Lut is invalid or not present, regenerate it and cache it\n generateLut(\n image,\n viewport.voi.windowWidth,\n viewport.voi.windowCenter,\n viewport.invert,\n viewport.modalityLUT,\n viewport.voiLUT\n );\n\n image.cachedLut.windowWidth = viewport.voi.windowWidth;\n image.cachedLut.windowCenter = viewport.voi.windowCenter;\n image.cachedLut.invert = viewport.invert;\n image.cachedLut.voiLUT = viewport.voiLUT;\n image.cachedLut.modalityLUT = viewport.modalityLUT;\n\n return image.cachedLut.lutArray;\n}\n","import getModalityLut from './getModalityLut';\nimport getVOILUT from './getVOILut';\nimport { IImage, CPUFallbackLUT } from '../../../../types';\n\n/**\n * Creates a LUT used while rendering to convert stored pixel values to\n * display pixels\n *\n * @param image - A Cornerstone Image Object\n * @param windowWidth - The Window Width\n * @param windowCenter - The Window Center\n * @param invert - A boolean describing whether or not the image has been inverted\n * @param modalityLUT - A modality Lookup Table\n * @param voiLUT - A Volume of Interest Lookup Table\n *\n * @returns A lookup table to apply to the image\n */\nexport default function (\n image: IImage,\n windowWidth: number,\n windowCenter: number,\n invert: boolean,\n modalityLUT: CPUFallbackLUT,\n voiLUT: CPUFallbackLUT\n): Uint8ClampedArray {\n const maxPixelValue = image.maxPixelValue;\n const minPixelValue = image.minPixelValue;\n const offset = Math.min(minPixelValue, 0);\n\n if (image.cachedLut === undefined) {\n const length = maxPixelValue - offset + 1;\n\n image.cachedLut = {};\n image.cachedLut.lutArray = new Uint8ClampedArray(length);\n }\n\n const lut = image.cachedLut.lutArray;\n\n const mlutfn = getModalityLut(image.slope, image.intercept, modalityLUT);\n const vlutfn = getVOILUT(windowWidth, windowCenter, voiLUT);\n\n if (image.isPreScaled) {\n // if the image is already preScaled, it means that the slop and the intercept\n // are applied and there is no need for a modalityLut\n if (invert === true) {\n for (\n let storedValue = minPixelValue;\n storedValue <= maxPixelValue;\n storedValue++\n ) {\n lut[storedValue + -offset] = 255 - vlutfn(storedValue);\n }\n } else {\n for (\n let storedValue = minPixelValue;\n storedValue <= maxPixelValue;\n storedValue++\n ) {\n lut[storedValue + -offset] = vlutfn(storedValue);\n }\n }\n } else {\n if (invert === true) {\n for (\n let storedValue = minPixelValue;\n storedValue <= maxPixelValue;\n storedValue++\n ) {\n lut[storedValue + -offset] = 255 - vlutfn(mlutfn(storedValue));\n }\n } else {\n for (\n let storedValue = minPixelValue;\n storedValue <= maxPixelValue;\n storedValue++\n ) {\n lut[storedValue + -offset] = vlutfn(mlutfn(storedValue));\n }\n }\n }\n\n return lut;\n}\n","/**\n * Generates a linear modality transformation function\n *\n * See DICOM PS3.3 C.11.1 Modality LUT Module\n *\n * http://dicom.nema.org/medical/Dicom/current/output/chtml/part03/sect_C.11.html\n *\n * @param {Number} slope m in the equation specified by Rescale Intercept (0028,1052).\n * @param {Number} intercept The value b in relationship between stored values (SV) and the output units specified in Rescale Type (0028,1054).\n\n Output units = m*SV + b.\n * @return {function(*): *} A linear modality LUT function. Given a stored pixel it returns the modality pixel value\n * @memberof Internal\n */\nfunction generateLinearModalityLUT(slope, intercept) {\n return (storedPixelValue) => storedPixelValue * slope + intercept;\n}\n\nfunction generateNonLinearModalityLUT(modalityLUT) {\n const minValue = modalityLUT.lut[0];\n const maxValue = modalityLUT.lut[modalityLUT.lut.length - 1];\n const maxValueMapped = modalityLUT.firstValueMapped + modalityLUT.lut.length;\n\n return (storedPixelValue) => {\n if (storedPixelValue < modalityLUT.firstValueMapped) {\n return minValue;\n } else if (storedPixelValue >= maxValueMapped) {\n return maxValue;\n }\n\n return modalityLUT.lut[storedPixelValue];\n };\n}\n\n/**\n * Get the appropriate Modality LUT for the current situation.\n *\n * @param {Number} [slope] m in the equation specified by Rescale Intercept (0028,1052).\n * @param {Number} [intercept] The value b in relationship between stored values (SV) and the output units specified in Rescale Type (0028,1054).\n * @param {Function} [modalityLUT] A modality LUT function. Given a stored pixel it returns the modality pixel value.\n *\n * @return {function(*): *} A modality LUT function. Given a stored pixel it returns the modality pixel value.\n * @memberof Internal\n */\nexport default function (\n slope: number,\n intercept: number,\n modalityLUT: unknown\n) {\n if (modalityLUT) {\n return generateNonLinearModalityLUT(modalityLUT);\n }\n\n return generateLinearModalityLUT(slope, intercept);\n}\n","import storedPixelDataToCanvasImageData from './storedPixelDataToCanvasImageData';\nimport storedPixelDataToCanvasImageDataPET from './storedPixelDataToCanvasImageDataPET';\nimport storedPixelDataToCanvasImageDataRGBA from './storedPixelDataToCanvasImageDataRGBA';\nimport setToPixelCoordinateSystem from './setToPixelCoordinateSystem';\nimport now from './now';\nimport getLut from './getLut';\nimport doesImageNeedToBeRendered from './doesImageNeedToBeRendered';\nimport initializeRenderCanvas from './initializeRenderCanvas';\nimport saveLastRendered from './saveLastRendered';\nimport { IImage, CPUFallbackEnabledElement } from '../../../../types';\n\n/**\n * Returns an appropriate canvas to render the Image. If the canvas available in the cache is appropriate\n * it is returned, otherwise adjustments are made. It also sets the color transfer functions.\n *\n * @param {Object} enabledElement The cornerstone enabled element\n * @param {Object} image The image to be rendered\n * @param {Boolean} invalidated Is pixel data valid\n * @param {Boolean} [useAlphaChannel = true] Will an alpha channel be used\n * @returns {HTMLCanvasElement} An appropriate canvas for rendering the image\n * @memberof rendering\n */\nfunction getRenderCanvas(\n enabledElement: CPUFallbackEnabledElement,\n image: IImage,\n invalidated: boolean,\n useAlphaChannel = true\n): HTMLCanvasElement {\n const canvasWasColor =\n enabledElement.renderingTools.lastRenderedIsColor === true;\n\n if (!enabledElement.renderingTools.renderCanvas || canvasWasColor) {\n enabledElement.renderingTools.renderCanvas =\n document.createElement('canvas');\n initializeRenderCanvas(enabledElement, image);\n }\n\n const renderCanvas = enabledElement.renderingTools.renderCanvas;\n\n if (\n doesImageNeedToBeRendered(enabledElement, image) === false &&\n invalidated !== true\n ) {\n return renderCanvas;\n }\n\n // If our render canvas does not match the size of this image reset it\n // NOTE: This might be inefficient if we are updating multiple images of different\n // Sizes frequently.\n if (\n renderCanvas.width !== image.width ||\n renderCanvas.height !== image.height\n ) {\n initializeRenderCanvas(enabledElement, image);\n }\n\n image.stats = image.stats || {};\n\n const renderCanvasData = enabledElement.renderingTools.renderCanvasData;\n const renderCanvasContext = enabledElement.renderingTools.renderCanvasContext;\n\n let start = now();\n image.stats.lastLutGenerateTime = now() - start;\n\n const { viewport } = enabledElement;\n\n // If modality is 'PT' and the image is scaled then the results are floating points,\n // and we cannot create a lut for it (cannot have float indices). Therefore,\n // we use a mapping function to get the voiLUT from the values by applying\n // the windowLevel and windowWidth.\n if (viewport.modality === 'PT' && image.isPreScaled) {\n const { windowWidth, windowCenter } = viewport.voi;\n const minimum = windowCenter - windowWidth / 2;\n const maximum = windowCenter + windowWidth / 2;\n const range = maximum - minimum;\n const collectedMultiplierTerms = 255.0 / range;\n\n let petVOILutFunction;\n\n if (viewport.invert) {\n petVOILutFunction = (value) =>\n 255 - (value - minimum) * collectedMultiplierTerms;\n } else {\n // Note, don't need to math.floor, that is dealt with by setting the value in the Uint8Array.\n petVOILutFunction = (value) =>\n (value - minimum) * collectedMultiplierTerms;\n }\n\n storedPixelDataToCanvasImageDataPET(\n image,\n petVOILutFunction,\n renderCanvasData.data\n );\n } else {\n // Get the lut to use\n const lut = getLut(image, viewport, invalidated);\n\n if (useAlphaChannel) {\n storedPixelDataToCanvasImageData(image, lut, renderCanvasData.data);\n } else {\n storedPixelDataToCanvasImageDataRGBA(image, lut, renderCanvasData.data);\n }\n }\n\n start = now();\n renderCanvasContext.putImageData(renderCanvasData, 0, 0);\n image.stats.lastPutImageDataTime = now() - start;\n\n return renderCanvas;\n}\n\n/**\n * API function to draw a grayscale image to a given enabledElement\n *\n * @param {EnabledElement} enabledElement The Cornerstone Enabled Element to redraw\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\n * @returns {void}\n * @memberof rendering\n */\nexport function renderGrayscaleImage(\n enabledElement: CPUFallbackEnabledElement,\n invalidated: boolean\n): void {\n if (enabledElement === undefined) {\n throw new Error(\n 'drawImage: enabledElement parameter must not be undefined'\n );\n }\n\n const image = enabledElement.image;\n\n if (image === undefined) {\n throw new Error('drawImage: image must be loaded before it can be drawn');\n }\n\n // Get the canvas context and reset the transform\n const context = enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Clear the canvas\n context.fillStyle = 'black';\n context.fillRect(\n 0,\n 0,\n enabledElement.canvas.width,\n enabledElement.canvas.height\n );\n\n // Turn off image smooth/interpolation if pixelReplication is set in the viewport\n context.imageSmoothingEnabled = !enabledElement.viewport.pixelReplication;\n\n // Save the canvas context state and apply the viewport properties\n setToPixelCoordinateSystem(enabledElement, context);\n\n const renderCanvas = getRenderCanvas(enabledElement, image, invalidated);\n\n const sx = enabledElement.viewport.displayedArea.tlhc.x - 1;\n const sy = enabledElement.viewport.displayedArea.tlhc.y - 1;\n const width = enabledElement.viewport.displayedArea.brhc.x - sx;\n const height = enabledElement.viewport.displayedArea.brhc.y - sy;\n\n context.drawImage(renderCanvas, sx, sy, width, height, 0, 0, width, height);\n\n enabledElement.renderingTools = saveLastRendered(enabledElement);\n}\n","import now from './now';\nimport { IImage } from '../../../../types';\n\n/**\n * This function transforms stored pixel values into a canvas image data buffer\n * by using a LUT. This is the most performance sensitive code in cornerstone and\n * we use a special trick to make this go as fast as possible. Specifically we\n * use the alpha channel only to control the luminance rather than the red, green and\n * blue channels which makes it over 3x faster. The canvasImageDataData buffer needs\n * to be previously filled with white pixels.\n *\n * NOTE: Attribution would be appreciated if you use this technique!\n *\n * @param {Image} image A Cornerstone Image Object\n * @param {Array} lut Lookup table array\n * @param {Uint8ClampedArray} canvasImageDataData canvasImageData.data buffer filled with white pixels\n *\n * @returns {void}\n * @memberof Internal\n */\nexport default function (\n image: IImage,\n lutFunction: (value: number) => number,\n canvasImageDataData: Uint8ClampedArray\n): void {\n let start = now();\n const pixelData = image.getPixelData();\n\n image.stats.lastGetPixelDataTime = now() - start;\n\n const numPixels = pixelData.length;\n // const minPixelValue = image.minPixelValue;\n let canvasImageDataIndex = 3;\n let storedPixelDataIndex = 0;\n\n // NOTE: As of Nov 2014, most javascript engines have lower performance when indexing negative indexes.\n // We have a special code path for this case that improves performance. Thanks to @jpambrun for this enhancement\n\n // Added two paths (Int16Array, Uint16Array) to avoid polymorphic deoptimization in chrome.\n start = now();\n\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex] = lutFunction(\n pixelData[storedPixelDataIndex++]\n ); // Alpha\n canvasImageDataIndex += 4;\n }\n\n image.stats.lastStoredPixelDataToCanvasImageDataTime = now() - start;\n}\n","import now from './now';\nimport { IImage } from '../../../../types';\n\n/**\n * This function transforms stored pixel values into a canvas image data buffer\n * by using a LUT. This is the most performance sensitive code in cornerstone and\n * we use a special trick to make this go as fast as possible. Specifically we\n * use the alpha channel only to control the luminance rather than the red, green and\n * blue channels which makes it over 3x faster. The canvasImageDataData buffer needs\n * to be previously filled with white pixels.\n *\n * NOTE: Attribution would be appreciated if you use this technique!\n *\n * @param {Image} image A Cornerstone Image Object\n * @param {Array} lut Lookup table array\n * @param {Uint8ClampedArray} canvasImageDataData canvasImageData.data buffer filled with white pixels\n *\n * @returns {void}\n * @memberof Internal\n */\nexport default function (\n image: IImage,\n lut: Uint8ClampedArray,\n canvasImageDataData: Uint8ClampedArray\n): void {\n let start = now();\n const pixelData = image.getPixelData();\n\n image.stats.lastGetPixelDataTime = now() - start;\n\n const numPixels = pixelData.length;\n const minPixelValue = image.minPixelValue;\n let canvasImageDataIndex = 3;\n let storedPixelDataIndex = 0;\n\n // NOTE: As of Nov 2014, most javascript engines have lower performance when indexing negative indexes.\n // We have a special code path for this case that improves performance. Thanks to @jpambrun for this enhancement\n\n // Added two paths (Int16Array, Uint16Array) to avoid polymorphic deoptimization in chrome.\n start = now();\n if (pixelData instanceof Int16Array) {\n if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex] =\n lut[pixelData[storedPixelDataIndex++] + -minPixelValue]; // Alpha\n canvasImageDataIndex += 4;\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex] =\n lut[pixelData[storedPixelDataIndex++]]; // Alpha\n canvasImageDataIndex += 4;\n }\n }\n } else if (pixelData instanceof Uint16Array) {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex] =\n lut[pixelData[storedPixelDataIndex++]]; // Alpha\n canvasImageDataIndex += 4;\n }\n } else if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex] =\n lut[pixelData[storedPixelDataIndex++] + -minPixelValue]; // Alpha\n canvasImageDataIndex += 4;\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n canvasImageDataData[canvasImageDataIndex] =\n lut[pixelData[storedPixelDataIndex++]]; // Alpha\n canvasImageDataIndex += 4;\n }\n }\n\n image.stats.lastStoredPixelDataToCanvasImageDataTime = now() - start;\n}\n","import now from './now';\nimport { IImage } from '../../../../types';\n\n/**\n * This function transforms stored pixel values into a canvas image data buffer\n * by using a LUT.\n *\n * @param {Image} image A Cornerstone Image Object\n * @param {Array} lut Lookup table array\n * @param {Uint8ClampedArray} canvasImageDataData canvasImageData.data buffer filled with white pixels\n *\n * @returns {void}\n * @memberof Internal\n */\nexport default function (\n image: IImage,\n lut: Uint8ClampedArray,\n canvasImageDataData: Uint8ClampedArray\n): void {\n let start = now();\n const pixelData = image.getPixelData();\n\n image.stats.lastGetPixelDataTime = now() - start;\n\n const numPixels = pixelData.length;\n const minPixelValue = image.minPixelValue;\n let canvasImageDataIndex = 0;\n let storedPixelDataIndex = 0;\n let pixelValue;\n\n // NOTE: As of Nov 2014, most javascript engines have lower performance when indexing negative indexes.\n // We have a special code path for this case that improves performance. Thanks to @jpambrun for this enhancement\n\n // Added two paths (Int16Array, Uint16Array) to avoid polymorphic deoptimization in chrome.\n start = now();\n if (pixelData instanceof Int16Array) {\n if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n pixelValue = lut[pixelData[storedPixelDataIndex++] + -minPixelValue];\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = 255; // Alpha\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n pixelValue = lut[pixelData[storedPixelDataIndex++]];\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = 255; // Alpha\n }\n }\n } else if (pixelData instanceof Uint16Array) {\n while (storedPixelDataIndex < numPixels) {\n pixelValue = lut[pixelData[storedPixelDataIndex++]];\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = 255; // Alpha\n }\n } else if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n pixelValue = lut[pixelData[storedPixelDataIndex++] + -minPixelValue];\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = 255; // Alpha\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n pixelValue = lut[pixelData[storedPixelDataIndex++]];\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = pixelValue;\n canvasImageDataData[canvasImageDataIndex++] = 255; // Alpha\n }\n }\n\n image.stats.lastStoredPixelDataToCanvasImageDataTime = now() - start;\n}\n","import { Point2, Point4, CPUFallbackLookupTable } from '../../../../types';\n\n// This code was created based on vtkLookupTable\n// http://www.vtk.org/doc/release/5.0/html/a01697.html\n// https://github.com/Kitware/VTK/blob/master/Common/Core/vtkLookupTable.cxx\nconst BELOW_RANGE_COLOR_INDEX = 0;\nconst ABOVE_RANGE_COLOR_INDEX = 1;\nconst NAN_COLOR_INDEX = 2;\n\n/**\n * Converts an HSV (Hue, Saturation, Value) color to RGB (Red, Green, Blue) color value\n * @param {Number} hue A number representing the hue color value\n * @param {any} sat A number representing the saturation color value\n * @param {any} val A number representing the value color value\n * @returns {Numberp[]} An RGB color array\n */\nfunction HSVToRGB(hue, sat, val) {\n if (hue > 1) {\n throw new Error('HSVToRGB expects hue < 1');\n }\n\n const rgb = [];\n\n if (sat === 0) {\n rgb[0] = val;\n rgb[1] = val;\n rgb[2] = val;\n\n return rgb;\n }\n\n const hueCase = Math.floor(hue * 6);\n const frac = 6 * hue - hueCase;\n const lx = val * (1 - sat);\n const ly = val * (1 - sat * frac);\n const lz = val * (1 - sat * (1 - frac));\n\n switch (hueCase) {\n /* 0 p.Range[1]) {\n dIndex = p.MaxIndex + ABOVE_RANGE_COLOR_INDEX + 1.5;\n } else {\n dIndex = (v + p.Shift) * p.Scale;\n }\n\n return Math.floor(dIndex);\n}\n\n/**\n * Maps scalar values into colors via a lookup table\n * LookupTable is an object that is used by mapper objects to map scalar values into rgba (red-green-blue-alpha transparency) color specification,\n * or rgba into scalar values. The color table can be created by direct insertion of color values, or by specifying hue, saturation, value, and alpha range and generating a table\n */\nclass LookupTable implements CPUFallbackLookupTable {\n NumberOfColors: number;\n Ramp: string;\n TableRange: Point2;\n HueRange: Point2;\n SaturationRange: Point2;\n ValueRange: Point2;\n AlphaRange: Point2;\n NaNColor: Point4;\n BelowRangeColor: Point4;\n UseBelowRangeColor: boolean;\n AboveRangeColor: Point4;\n UseAboveRangeColor: boolean;\n InputRange: Point2;\n Table: Point4[];\n\n /**\n * Creates a default linear LookupTable object with 256 colors.\n */\n constructor() {\n this.NumberOfColors = 256;\n this.Ramp = 'linear';\n this.TableRange = [0, 255];\n this.HueRange = [0, 0.66667];\n this.SaturationRange = [1, 1];\n this.ValueRange = [1, 1];\n this.AlphaRange = [1, 1];\n this.NaNColor = [128, 0, 0, 255];\n this.BelowRangeColor = [0, 0, 0, 255];\n this.UseBelowRangeColor = true;\n this.AboveRangeColor = [255, 255, 255, 255];\n this.UseAboveRangeColor = true;\n this.InputRange = [0, 255];\n this.Table = [];\n }\n\n /**\n * Specify the number of values (i.e., colors) in the lookup table.\n * @param {Number} number The number of colors in he LookupTable\n * @returns {void}\n * @memberof Colors\n */\n public setNumberOfTableValues(number) {\n this.NumberOfColors = number;\n }\n\n /**\n * Set the shape of the table ramp to either 'linear', 'scurve' or 'sqrt'\n * @param {String} ramp A string value representing the shape of the table. Allowed values are 'linear', 'scurve' or 'sqrt'\n * @returns {void}\n * @memberof Colors\n */\n public setRamp(ramp) {\n this.Ramp = ramp;\n }\n\n /**\n * Sets the minimum/maximum scalar values for scalar mapping.\n * Scalar values less than minimum range value are clamped to minimum range value.\n * Scalar values greater than maximum range value are clamped to maximum range value.\n * @param {Number} start A double representing the minimum scaler value of the LookupTable\n * @param {any} end A double representing the maximum scaler value of the LookupTable\n * @returns {void}\n * @memberof Colors\n */\n public setTableRange(start, end) {\n this.TableRange[0] = start;\n this.TableRange[1] = end;\n }\n\n /**\n * Set the range in hue (using automatic generation). Hue ranges between [0,1].\n * @param {Number} start A double representing the minimum hue value in a range. Min. is 0\n * @param {Number} end A double representing the maximum hue value in a range. Max. is 1\n * @returns {void}\n * @memberof Colors\n */\n public setHueRange(start, end) {\n this.HueRange[0] = start;\n this.HueRange[1] = end;\n }\n\n /**\n * Set the range in saturation (using automatic generation). Saturation ranges between [0,1].\n * @param {Number} start A double representing the minimum Saturation value in a range. Min. is 0\n * @param {Number} end A double representing the maximum Saturation value in a range. Max. is 1\n * @returns {void}\n * @memberof Colors\n */\n public setSaturationRange(start, end) {\n this.SaturationRange[0] = start;\n this.SaturationRange[1] = end;\n }\n\n /**\n * Set the range in value (using automatic generation). Value ranges between [0,1].\n * @param {Numeber } start A double representing the minimum value in a range. Min. is 0\n * @param {Numeber} end A double representing the maximum value in a range. Max. is 1\n * @returns {void}\n * @memberof Colors\n */\n public setValueRange(start, end) {\n // Set the range in value (using automatic generation). Value ranges between [0,1].\n this.ValueRange[0] = start;\n this.ValueRange[1] = end;\n }\n\n /**\n * (Not Used) Sets the range of scalars which will be mapped.\n * @param {Number} start the minimum scalar value in the range\n * @param {Number} end the maximum scalar value in the range\n * @returns {void}\n * @memberof Colors\n */\n public setRange(start, end) {\n this.InputRange[0] = start;\n this.InputRange[1] = end;\n }\n\n /**\n * Set the range in alpha (using automatic generation). Alpha ranges from [0,1].\n * @param {Number} start A double representing the minimum alpha value\n * @param {Number} end A double representing the maximum alpha value\n * @returns {void}\n * @memberof Colors\n */\n public setAlphaRange(start, end) {\n // Set the range in alpha (using automatic generation). Alpha ranges from [0,1].\n this.AlphaRange[0] = start;\n this.AlphaRange[1] = end;\n }\n\n /**\n * Map one value through the lookup table and return the color as an\n * RGBA array of doubles between 0 and 1.\n * @param {Number} scalar A double scalar value which will be mapped to a color in the LookupTable\n * @returns {Number[]} An RGBA array of doubles between 0 and 1\n * @memberof Colors\n */\n public getColor(scalar) {\n return this.mapValue(scalar);\n }\n\n /**\n * Generate lookup table from hue, saturation, value, alpha min/max values. Table is built from linear ramp of each value.\n * @param {Boolean} force true to force the build of the LookupTable. Otherwie, false. This is useful if a lookup table has been defined manually\n * (using SetTableValue) and then an application decides to rebuild the lookup table using the implicit process.\n * @returns {void}\n * @memberof Colors\n */\n public build(force) {\n if (this.Table.length > 1 && !force) {\n return;\n }\n\n // Clear the table\n this.Table = [];\n\n const maxIndex = this.NumberOfColors - 1;\n\n let hinc, sinc, vinc, ainc;\n\n if (maxIndex) {\n hinc = (this.HueRange[1] - this.HueRange[0]) / maxIndex;\n sinc = (this.SaturationRange[1] - this.SaturationRange[0]) / maxIndex;\n vinc = (this.ValueRange[1] - this.ValueRange[0]) / maxIndex;\n ainc = (this.AlphaRange[1] - this.AlphaRange[0]) / maxIndex;\n } else {\n hinc = sinc = vinc = ainc = 0.0;\n }\n\n for (let i = 0; i <= maxIndex; i++) {\n const hue = this.HueRange[0] + i * hinc;\n const sat = this.SaturationRange[0] + i * sinc;\n const val = this.ValueRange[0] + i * vinc;\n const alpha = this.AlphaRange[0] + i * ainc;\n\n const rgb = HSVToRGB(hue, sat, val);\n const c_rgba: Point4 = [0, 0, 0, 0];\n\n switch (this.Ramp) {\n case 'scurve':\n c_rgba[0] = Math.floor(\n 127.5 * (1.0 + Math.cos((1.0 - rgb[0]) * Math.PI))\n );\n c_rgba[1] = Math.floor(\n 127.5 * (1.0 + Math.cos((1.0 - rgb[1]) * Math.PI))\n );\n c_rgba[2] = Math.floor(\n 127.5 * (1.0 + Math.cos((1.0 - rgb[2]) * Math.PI))\n );\n c_rgba[3] = Math.floor(alpha * 255);\n break;\n case 'linear':\n c_rgba[0] = Math.floor(rgb[0] * 255 + 0.5);\n c_rgba[1] = Math.floor(rgb[1] * 255 + 0.5);\n c_rgba[2] = Math.floor(rgb[2] * 255 + 0.5);\n c_rgba[3] = Math.floor(alpha * 255 + 0.5);\n break;\n case 'sqrt':\n c_rgba[0] = Math.floor(Math.sqrt(rgb[0]) * 255 + 0.5);\n c_rgba[1] = Math.floor(Math.sqrt(rgb[1]) * 255 + 0.5);\n c_rgba[2] = Math.floor(Math.sqrt(rgb[2]) * 255 + 0.5);\n c_rgba[3] = Math.floor(Math.sqrt(alpha) * 255 + 0.5);\n break;\n default:\n throw new Error(`Invalid Ramp value (${this.Ramp})`);\n }\n\n this.Table.push(c_rgba);\n }\n\n this.buildSpecialColors();\n }\n\n /**\n * Ensures the out-of-range colors (Below range and Above range) are set correctly.\n * @returns {void}\n * @memberof Colors\n */\n private buildSpecialColors() {\n const numberOfColors = this.NumberOfColors;\n const belowRangeColorIndex = numberOfColors + BELOW_RANGE_COLOR_INDEX;\n const aboveRangeColorIndex = numberOfColors + ABOVE_RANGE_COLOR_INDEX;\n const nanColorIndex = numberOfColors + NAN_COLOR_INDEX;\n\n // Below range color\n if (this.UseBelowRangeColor || numberOfColors === 0) {\n this.Table[belowRangeColorIndex] = this.BelowRangeColor;\n } else {\n // Duplicate the first color in the table.\n this.Table[belowRangeColorIndex] = this.Table[0];\n }\n\n // Above range color\n if (this.UseAboveRangeColor || numberOfColors === 0) {\n this.Table[aboveRangeColorIndex] = this.AboveRangeColor;\n } else {\n // Duplicate the last color in the table.\n this.Table[aboveRangeColorIndex] = this.Table[numberOfColors - 1];\n }\n\n // Always use NanColor\n this.Table[nanColorIndex] = this.NaNColor;\n }\n\n /**\n * Similar to GetColor - Map one value through the lookup table and return the color as an\n * RGBA array of doubles between 0 and 1.\n * @param {Numeber} v A double scalar value which will be mapped to a color in the LookupTable\n * @returns {Number[]} An RGBA array of doubles between 0 and 1\n * @memberof Colors\n */\n private mapValue(v) {\n const index = this.getIndex(v);\n\n if (index < 0) {\n return this.NaNColor;\n } else if (index === 0) {\n if (this.UseBelowRangeColor && v < this.TableRange[0]) {\n return this.BelowRangeColor;\n }\n } else if (index === this.NumberOfColors - 1) {\n if (this.UseAboveRangeColor && v > this.TableRange[1]) {\n return this.AboveRangeColor;\n }\n }\n\n return this.Table[index];\n }\n\n /**\n * Return the table index associated with a particular value.\n * @param {Number} v A double value which table index will be returned.\n * @returns {Number} The index in the LookupTable\n * @memberof Colors\n */\n private getIndex(v) {\n const p = {\n Range: [],\n MaxIndex: this.NumberOfColors - 1,\n Shift: -this.TableRange[0],\n Scale: 1,\n };\n\n if (this.TableRange[1] <= this.TableRange[0]) {\n p.Scale = Number.MAX_VALUE;\n } else {\n p.Scale = p.MaxIndex / (this.TableRange[1] - this.TableRange[0]);\n }\n\n p.Range[0] = this.TableRange[0];\n p.Range[1] = this.TableRange[1];\n\n // First, check whether we have a number...\n if (isNaN(v)) {\n // For backwards compatibility\n return -1;\n }\n\n // Map to an index:\n let index = linearIndexLookupMain(v, p);\n\n // For backwards compatibility, if the index indicates an\n // Out-of-range value, truncate to index range for in-range colors.\n if (index === this.NumberOfColors + BELOW_RANGE_COLOR_INDEX) {\n index = 0;\n } else if (index === this.NumberOfColors + ABOVE_RANGE_COLOR_INDEX) {\n index = this.NumberOfColors - 1;\n }\n\n return index;\n }\n\n /**\n * Directly load color into lookup table. Use [0,1] double values for color component specification.\n * Make sure that you've either used the Build() method or used SetNumberOfTableValues() prior to using this method.\n * @param {Number} index The index in the LookupTable of where to insert the color value\n * @param {Number[]} rgba An array of [0,1] double values for an RGBA color component\n * @returns {void}\n * @memberof Colors\n */\n public setTableValue(index, rgba) {\n // Check if it index, red, green, blue and alpha were passed as parameter\n if (arguments.length === 5) {\n rgba = Array.prototype.slice.call(arguments, 1);\n }\n\n // Check the index to make sure it is valid\n if (index < 0) {\n throw new Error(\n `Can't set the table value for negative index (${index})`\n );\n }\n\n if (index >= this.NumberOfColors) {\n new Error(\n `Index ${index} is greater than the number of colors ${this.NumberOfColors}`\n );\n }\n\n this.Table[index] = rgba;\n\n if (index === 0 || index === this.NumberOfColors - 1) {\n // This is needed due to the way the special colors are stored in\n // The internal table. If Above/BelowRangeColors are not used and\n // The min/max colors are changed in the table with this member\n // Function, then the colors used for values outside the range may\n // Be incorrect. Calling this here ensures the out-of-range colors\n // Are set correctly.\n this.buildSpecialColors();\n }\n }\n}\n\nexport default LookupTable;\n","import LookupTable from './lookupTable';\nimport CPU_COLORMAPS from '../../../../constants/cpuColormaps';\nimport {\n CPUFallbackColormap,\n CPUFallbackColormapData,\n Point4,\n} from '../../../../types';\n\nconst COLOR_TRANSPARENT: Point4 = [0, 0, 0, 0];\n\n/**\n * Generate linearly spaced vectors\n * http://cens.ioc.ee/local/man/matlab/techdoc/ref/linspace.html\n * @param {Number} a A number representing the first vector\n * @param {Number} b A number representing the second vector\n * @param {Number} n The number of linear spaced vectors to generate\n * @returns {Array} An array of points representing linear spaced vectors.\n * @memberof Colors\n */\nfunction linspace(a: number, b: number, n: number): number[] {\n n = n === null ? 100 : n;\n\n const increment = (b - a) / (n - 1);\n const vector = [];\n\n while (n-- > 0) {\n vector.push(a);\n a += increment;\n }\n\n // Make sure the last item will always be \"b\" because most of the\n // Time we'll get numbers like 1.0000000000000002 instead of 1.\n vector[vector.length - 1] = b;\n\n return vector;\n}\n\n/**\n * Returns the \"rank/index\" of the element in a sorted array if found or the highest index if not. Uses (binary search)\n * @param {Array} array A sorted array to search in\n * @param {any} elem the element in the array to search for\n * @returns {number} The rank/index of the element in the given array\n * @memberof Colors\n */\nfunction getRank(array, elem) {\n let left = 0;\n let right = array.length - 1;\n\n while (left <= right) {\n const mid = left + Math.floor((right - left) / 2);\n const midElem = array[mid];\n\n if (midElem === elem) {\n return mid;\n } else if (elem < midElem) {\n right = mid - 1;\n } else {\n left = mid + 1;\n }\n }\n\n return left;\n}\n\n/**\n * Find the indices into a sorted array a such that, if the corresponding elements\n * In v were inserted before the indices, the order of a would be preserved.\n * http://lagrange.univ-lyon1.fr/docs/numpy/1.11.0/reference/generated/numpy.searchsorted.html\n * @param {Array} inputArray The array where the values will be inserted\n * @param {Array} values An array of the values to be inserted into the inputArray\n * @returns {Array} The indices where elements should be inserted to maintain order.\n * @memberof Colors\n */\nfunction searchSorted(inputArray, values) {\n let i;\n const indexes = [];\n const len = values.length;\n\n inputArray.sort(function (a, b) {\n return a - b;\n });\n\n for (i = 0; i < len; i++) {\n indexes[i] = getRank(inputArray, values[i]);\n }\n\n return indexes;\n}\n\n/**\n * Creates an *N* -element 1-d lookup table\n * @param {Number} N The number of elements in the result lookup table\n * @param {Array} data represented by a list of x,y0,y1 mapping correspondences. Each element in this\n * List represents how a value between 0 and 1 (inclusive) represented by x is mapped to\n * A corresponding value between 0 and 1 (inclusive). The two values of y are to allow for\n * Discontinuous mapping functions (say as might be found in a sawtooth) where y0 represents\n * The value of y for values of x <= to that given, and y1 is the value to be used for x >\n * Than that given). The list must start with x=0, end with x=1, and all values of x must be\n * In increasing order. Values between the given mapping points are determined by simple linear\n * Interpolation.\n * @param {any} gamma value denotes a \"gamma curve\" value which adjusts the brightness\n * at the bottom and top of the map.\n * @returns {any[]} an array \"result\" where result[x*(N-1)] gives the closest value for\n * Values of x between 0 and 1.\n * @memberof Colors\n */\nfunction makeMappingArray(N, data, gamma) {\n let i;\n const x = [];\n const y0 = [];\n const y1 = [];\n const lut = [];\n\n gamma = gamma === null ? 1 : gamma;\n\n for (i = 0; i < data.length; i++) {\n const element = data[i];\n\n x.push((N - 1) * element[0]);\n y0.push(element[1]);\n y1.push(element[1]);\n }\n\n const xLinSpace = linspace(0, 1, N);\n\n for (i = 0; i < N; i++) {\n xLinSpace[i] = (N - 1) * Math.pow(xLinSpace[i], gamma);\n }\n\n const xLinSpaceIndexes = searchSorted(x, xLinSpace);\n\n for (i = 1; i < N - 1; i++) {\n const index = xLinSpaceIndexes[i];\n const colorPercent =\n (xLinSpace[i] - x[index - 1]) / (x[index] - x[index - 1]);\n const colorDelta = y0[index] - y1[index - 1];\n\n lut[i] = colorPercent * colorDelta + y1[index - 1];\n }\n\n lut[0] = y1[0];\n lut[N - 1] = y0[data.length - 1];\n\n return lut;\n}\n\n/**\n * Creates a Colormap based on lookup tables using linear segments.\n * @param {{red:Array, green:Array, blue:Array}} segmentedData An object with a red, green and blue entries.\n * Each entry should be a list of x, y0, y1 tuples, forming rows in a table.\n * @param {Number} N The number of elements in the result Colormap\n * @param {any} gamma value denotes a \"gamma curve\" value which adjusts the brightness\n * at the bottom and top of the Colormap.\n * @returns {Array} The created Colormap object\n * @description The lookup table is generated using linear interpolation for each\n * Primary color, with the 0-1 domain divided into any number of\n * Segments.\n * https://github.com/stefanv/matplotlib/blob/3f1a23755e86fef97d51e30e106195f34425c9e3/lib/matplotlib/colors.py#L663\n * @memberof Colors\n */\nfunction createLinearSegmentedColormap(segmentedData, N, gamma) {\n let i;\n const lut = [];\n\n N = N === null ? 256 : N;\n gamma = gamma === null ? 1 : gamma;\n\n const redLut = makeMappingArray(N, segmentedData.red, gamma);\n const greenLut = makeMappingArray(N, segmentedData.green, gamma);\n const blueLut = makeMappingArray(N, segmentedData.blue, gamma);\n\n for (i = 0; i < N; i++) {\n const red = Math.round(redLut[i] * 255);\n const green = Math.round(greenLut[i] * 255);\n const blue = Math.round(blueLut[i] * 255);\n const rgba = [red, green, blue, 255];\n\n lut.push(rgba);\n }\n\n return lut;\n}\n\n/**\n * Return all available colormaps (id and name)\n * @returns {Array<{id,key}>} An array of colormaps with an object containing the \"id\" and display \"name\"\n * @memberof Colors\n */\nexport function getColormapsList() {\n const colormaps = [];\n const keys = Object.keys(CPU_COLORMAPS);\n\n keys.forEach(function (key) {\n if (CPU_COLORMAPS.hasOwnProperty(key)) {\n const colormap = CPU_COLORMAPS[key];\n\n colormaps.push({\n id: key,\n name: colormap.name,\n });\n }\n });\n\n colormaps.sort(function (a, b) {\n const aName = a.name.toLowerCase();\n const bName = b.name.toLowerCase();\n\n if (aName === bName) {\n return 0;\n }\n\n return aName < bName ? -1 : 1;\n });\n\n return colormaps;\n}\n\n/**\n * Return a colorMap object with the provided id and colormapData\n * if the Id matches existent colorMap objects (check colormapsData) the colormapData is ignored.\n * if the colormapData is not empty, the colorMap will be added to the colormapsData list. Otherwise, an empty colorMap object is returned.\n * @param {string} id The ID of the colormap\n * @param {Object} colormapData - An object that can contain a name, numColors, gama, segmentedData and/or colors\n * @returns {*} The Colormap Object\n * @memberof Colors\n */\nexport function getColormap(\n id: string,\n colormapData?: CPUFallbackColormapData\n): CPUFallbackColormap {\n let colormap = CPU_COLORMAPS[id];\n\n if (!colormap) {\n colormap = CPU_COLORMAPS[id] = colormapData || {\n name: '',\n colors: [],\n };\n }\n\n if (!colormap.colors && colormap.segmentedData) {\n colormap.colors = createLinearSegmentedColormap(\n colormap.segmentedData,\n colormap.numColors,\n colormap.gamma\n );\n }\n\n const cpuFallbackColormap: CPUFallbackColormap = {\n getId() {\n return id;\n },\n\n getColorSchemeName() {\n return colormap.name;\n },\n\n setColorSchemeName(name) {\n colormap.name = name;\n },\n\n getNumberOfColors() {\n return colormap.colors.length;\n },\n\n setNumberOfColors(numColors) {\n while (colormap.colors.length < numColors) {\n colormap.colors.push(COLOR_TRANSPARENT);\n }\n\n colormap.colors.length = numColors;\n },\n\n getColor(index) {\n if (this.isValidIndex(index)) {\n return colormap.colors[index];\n }\n\n return COLOR_TRANSPARENT;\n },\n\n getColorRepeating(index) {\n const numColors = colormap.colors.length;\n\n index = numColors ? index % numColors : 0;\n\n return this.getColor(index);\n },\n\n setColor(index, rgba) {\n if (this.isValidIndex(index)) {\n colormap.colors[index] = rgba;\n }\n },\n\n addColor(rgba) {\n colormap.colors.push(rgba);\n },\n\n insertColor(index, rgba) {\n if (this.isValidIndex(index)) {\n colormap.colors.splice(index, 1, rgba);\n }\n },\n\n removeColor(index) {\n if (this.isValidIndex(index)) {\n colormap.colors.splice(index, 1);\n }\n },\n\n clearColors() {\n colormap.colors = [];\n },\n\n buildLookupTable(lut) {\n if (!lut) {\n return;\n }\n\n const numColors = colormap.colors.length;\n\n lut.setNumberOfTableValues(numColors);\n\n for (let i = 0; i < numColors; i++) {\n lut.setTableValue(i, colormap.colors[i]);\n }\n },\n\n createLookupTable() {\n const lut = new LookupTable();\n\n this.buildLookupTable(lut);\n\n return lut;\n },\n\n isValidIndex(index) {\n return index >= 0 && index < colormap.colors.length;\n },\n };\n\n return cpuFallbackColormap;\n}\n","import * as colors from '../colors/index';\nimport now from './now';\nimport type { IImage, CPUFallbackLookupTable } from '../../../../types';\n\n/**\n *\n * @param {Image} image A Cornerstone Image Object\n * @param {Array} grayscaleLut Lookup table array\n * @param {LookupTable|Array} colorLUT Lookup table array\n * @param {Uint8ClampedArray} canvasImageDataData canvasImageData.data buffer filled with white pixels\n *\n * @returns {void}\n * @memberof Internal\n */\nfunction storedPixelDataToCanvasImageDataPseudocolorLUT(\n image: IImage,\n grayscaleLut: Uint8ClampedArray,\n colorLUT: CPUFallbackLookupTable,\n canvasImageDataData: Uint8ClampedArray\n): void {\n let start = now();\n const pixelData = image.getPixelData();\n\n image.stats.lastGetPixelDataTime = now() - start;\n\n const numPixels = pixelData.length;\n const minPixelValue = image.minPixelValue;\n let canvasImageDataIndex = 0;\n let storedPixelDataIndex = 0;\n let grayscale;\n let rgba;\n let clut;\n\n start = now();\n\n if (colorLUT instanceof colors.LookupTable) {\n clut = colorLUT.Table;\n } else {\n clut = colorLUT;\n }\n\n if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n grayscale =\n grayscaleLut[pixelData[storedPixelDataIndex++] + -minPixelValue];\n rgba = clut[grayscale];\n canvasImageDataData[canvasImageDataIndex++] = rgba[0];\n canvasImageDataData[canvasImageDataIndex++] = rgba[1];\n canvasImageDataData[canvasImageDataIndex++] = rgba[2];\n canvasImageDataData[canvasImageDataIndex++] = rgba[3];\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n grayscale = grayscaleLut[pixelData[storedPixelDataIndex++]];\n rgba = clut[grayscale];\n canvasImageDataData[canvasImageDataIndex++] = rgba[0];\n canvasImageDataData[canvasImageDataIndex++] = rgba[1];\n canvasImageDataData[canvasImageDataIndex++] = rgba[2];\n canvasImageDataData[canvasImageDataIndex++] = rgba[3];\n }\n }\n\n image.stats.lastStoredPixelDataToCanvasImageDataTime = now() - start;\n}\n\nexport default storedPixelDataToCanvasImageDataPseudocolorLUT;\n","import * as colors from '../colors/index';\nimport now from './now';\nimport type { IImage, CPUFallbackLookupTable } from '../../../../types';\n\n/**\n *\n * @param {Image} image A Cornerstone Image Object\n * @param {Array} grayscaleLut Lookup table array\n * @param {LookupTable|Array} colorLUT Lookup table array\n * @param {Uint8ClampedArray} canvasImageDataData canvasImageData.data buffer filled with white pixels\n *\n * @returns {void}\n * @memberof Internal\n */\nfunction storedPixelDataToCanvasImageDataPseudocolorLUTPET(\n image: IImage,\n lutFunction: (value: number) => number,\n colorLUT: CPUFallbackLookupTable,\n canvasImageDataData: Uint8ClampedArray\n): void {\n let start = now();\n const pixelData = image.getPixelData();\n\n image.stats.lastGetPixelDataTime = now() - start;\n\n const numPixels = pixelData.length;\n const minPixelValue = image.minPixelValue;\n let canvasImageDataIndex = 0;\n let storedPixelDataIndex = 0;\n let grayscale;\n let rgba;\n let clut;\n\n start = now();\n\n if (colorLUT instanceof colors.LookupTable) {\n clut = colorLUT.Table;\n } else {\n clut = colorLUT;\n }\n\n if (minPixelValue < 0) {\n while (storedPixelDataIndex < numPixels) {\n grayscale = lutFunction(\n pixelData[storedPixelDataIndex++] + -minPixelValue\n );\n\n rgba = clut[grayscale];\n canvasImageDataData[canvasImageDataIndex++] = rgba[0];\n canvasImageDataData[canvasImageDataIndex++] = rgba[1];\n canvasImageDataData[canvasImageDataIndex++] = rgba[2];\n canvasImageDataData[canvasImageDataIndex++] = rgba[3];\n }\n } else {\n while (storedPixelDataIndex < numPixels) {\n grayscale = lutFunction(pixelData[storedPixelDataIndex++]);\n rgba = clut[grayscale];\n canvasImageDataData[canvasImageDataIndex++] = rgba[0];\n canvasImageDataData[canvasImageDataIndex++] = rgba[1];\n canvasImageDataData[canvasImageDataIndex++] = rgba[2];\n canvasImageDataData[canvasImageDataIndex++] = rgba[3];\n }\n }\n\n image.stats.lastStoredPixelDataToCanvasImageDataTime = now() - start;\n}\n\nexport default storedPixelDataToCanvasImageDataPseudocolorLUTPET;\n","import setToPixelCoordinateSystem from './setToPixelCoordinateSystem';\nimport now from './now';\nimport initializeRenderCanvas from './initializeRenderCanvas';\nimport getLut from './getLut';\nimport saveLastRendered from './saveLastRendered';\nimport doesImageNeedToBeRendered from './doesImageNeedToBeRendered';\nimport storedPixelDataToCanvasImageDataPseudocolorLUT from './storedPixelDataToCanvasImageDataPseudocolorLUT';\nimport storedPixelDataToCanvasImageDataPseudocolorLUTPET from './storedPixelDataToCanvasImageDataPseudocolorLUTPET';\nimport * as colors from '../colors/index';\nimport type { IImage, CPUFallbackEnabledElement } from '../../../../types';\n\nfunction clamp(value: number, min: number, max: number) {\n return Math.max(min, Math.min(max, value));\n}\n\n/**\n * Returns an appropriate canvas to render the Image. If the canvas available in the cache is appropriate\n * it is returned, otherwise adjustments are made. It also sets the color transfer functions.\n *\n * @param {Object} enabledElement The cornerstone enabled element\n * @param {Object} image The image to be rendered\n * @param {Boolean} invalidated Is pixel data valid\n * @returns {HTMLCanvasElement} An appropriate canvas for rendering the image\n * @memberof rendering\n */\nfunction getRenderCanvas(\n enabledElement: CPUFallbackEnabledElement,\n image: IImage,\n invalidated: boolean\n): HTMLCanvasElement {\n if (!enabledElement.renderingTools.renderCanvas) {\n enabledElement.renderingTools.renderCanvas =\n document.createElement('canvas');\n }\n\n const renderCanvas = enabledElement.renderingTools.renderCanvas;\n\n let colormap =\n enabledElement.viewport.colormap || enabledElement.options.colormap;\n\n if (enabledElement.options && enabledElement.options.colormap) {\n console.warn(\n 'enabledElement.options.colormap is deprecated. Use enabledElement.viewport.colormap instead'\n );\n }\n if (colormap && typeof colormap === 'string') {\n colormap = colors.getColormap(colormap);\n }\n\n if (!colormap) {\n throw new Error('renderPseudoColorImage: colormap not found.');\n }\n\n const colormapId = colormap.getId();\n\n if (\n doesImageNeedToBeRendered(enabledElement, image) === false &&\n invalidated !== true &&\n enabledElement.renderingTools.colormapId === colormapId\n ) {\n return renderCanvas;\n }\n\n // If our render canvas does not match the size of this image reset it\n // NOTE: This might be inefficient if we are updating multiple images of different\n // Sizes frequently.\n if (\n renderCanvas.width !== image.width ||\n renderCanvas.height !== image.height\n ) {\n initializeRenderCanvas(enabledElement, image);\n }\n\n // Get the lut to use\n let start = now();\n\n if (\n !enabledElement.renderingTools.colorLUT ||\n invalidated ||\n enabledElement.renderingTools.colormapId !== colormapId\n ) {\n colormap.setNumberOfColors(256);\n enabledElement.renderingTools.colorLUT = colormap.createLookupTable();\n enabledElement.renderingTools.colormapId = colormapId;\n }\n\n const renderCanvasData = enabledElement.renderingTools.renderCanvasData;\n const renderCanvasContext = enabledElement.renderingTools.renderCanvasContext;\n const { viewport } = enabledElement;\n const colorLUT = enabledElement.renderingTools.colorLUT;\n\n if (viewport.modality === 'PT') {\n const { windowWidth, windowCenter } = viewport.voi;\n const minimum = windowCenter - windowWidth / 2;\n const maximum = windowCenter + windowWidth / 2;\n const range = maximum - minimum;\n const collectedMultiplierTerms = 255.0 / range;\n\n let petVOILutFunction;\n\n if (viewport.invert) {\n petVOILutFunction = (value) => {\n return clamp(\n Math.floor(255 - (value - minimum) * collectedMultiplierTerms),\n 0,\n 255\n );\n };\n } else {\n petVOILutFunction = (value) => {\n return clamp(\n Math.floor((value - minimum) * collectedMultiplierTerms),\n 0,\n 255\n );\n };\n }\n\n storedPixelDataToCanvasImageDataPseudocolorLUTPET(\n image,\n petVOILutFunction,\n colorLUT,\n renderCanvasData.data\n );\n } else {\n const lut = getLut(image, enabledElement.viewport, invalidated);\n\n image.stats = image.stats || {};\n image.stats.lastLutGenerateTime = now() - start;\n\n storedPixelDataToCanvasImageDataPseudocolorLUT(\n image,\n lut,\n colorLUT,\n renderCanvasData.data\n );\n }\n\n start = now();\n renderCanvasContext.putImageData(renderCanvasData, 0, 0);\n image.stats.lastPutImageDataTime = now() - start;\n\n return renderCanvas;\n}\n\n/**\n * API function to draw a pseudo-color image to a given enabledElement\n *\n * @param {EnabledElement} enabledElement The Cornerstone Enabled Element to redraw\n * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used\n * @returns {void}\n * @memberof rendering\n */\nexport function renderPseudoColorImage(\n enabledElement: CPUFallbackEnabledElement,\n invalidated: boolean\n): void {\n if (enabledElement === undefined) {\n throw new Error(\n 'drawImage: enabledElement parameter must not be undefined'\n );\n }\n\n const image = enabledElement.image;\n\n if (image === undefined) {\n throw new Error('drawImage: image must be loaded before it can be drawn');\n }\n\n // Get the canvas context and reset the transform\n const context = enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Clear the canvas\n context.fillStyle = 'black';\n context.fillRect(\n 0,\n 0,\n enabledElement.canvas.width,\n enabledElement.canvas.height\n );\n\n // Turn off image smooth/interpolation if pixelReplication is set in the viewport\n context.imageSmoothingEnabled = !enabledElement.viewport.pixelReplication;\n\n // Save the canvas context state and apply the viewport properties\n setToPixelCoordinateSystem(enabledElement, context);\n\n // If no options are set we will retrieve the renderCanvas through the\n // Normal Canvas rendering path\n // TODO: Add WebGL support for pseudocolor pipeline\n const renderCanvas = getRenderCanvas(enabledElement, image, invalidated);\n\n const sx = enabledElement.viewport.displayedArea.tlhc.x - 1;\n const sy = enabledElement.viewport.displayedArea.tlhc.y - 1;\n const width = enabledElement.viewport.displayedArea.brhc.x - sx;\n const height = enabledElement.viewport.displayedArea.brhc.y - sy;\n\n context.drawImage(renderCanvas, sx, sy, width, height, 0, 0, width, height);\n\n enabledElement.renderingTools = saveLastRendered(enabledElement);\n}\n","import now from './rendering/now';\nimport { renderColorImage } from './rendering/renderColorImage';\nimport { renderGrayscaleImage } from './rendering/renderGrayscaleImage';\nimport { renderPseudoColorImage } from './rendering/renderPseudoColorImage';\nimport { CPUFallbackEnabledElement } from '../../../types';\n\n/**\n * Draw an image to a given enabled element synchronously\n *\n * @param enabledElement - An enabled element to draw into\n * @param invalidated - true if pixel data has been invalidated and cached rendering should not be used\n */\nexport default function (\n enabledElement: CPUFallbackEnabledElement,\n invalidated: boolean\n): void {\n const image = enabledElement.image;\n\n // Check if enabledElement can be redrawn\n if (!enabledElement.canvas || !enabledElement.image) {\n return;\n }\n\n // Start measuring the time needed to draw the image.\n const start = now();\n\n image.stats = {\n lastGetPixelDataTime: -1.0,\n lastStoredPixelDataToCanvasImageDataTime: -1.0,\n lastPutImageDataTime: -1.0,\n lastRenderTime: -1.0,\n lastLutGenerateTime: -1.0,\n };\n\n if (image) {\n let render = image.render;\n\n if (!render) {\n if (enabledElement.viewport.colormap) {\n render = renderPseudoColorImage;\n } else if (image.color) {\n render = renderColorImage;\n } else {\n render = renderGrayscaleImage;\n }\n }\n\n render(enabledElement, invalidated);\n }\n\n // Calculate how long it took to draw the image/layers\n const renderTimeInMs = now() - start;\n\n image.stats.lastRenderTime = renderTimeInMs;\n\n enabledElement.invalid = false;\n enabledElement.needsRedraw = false;\n}\n","import { IImage, CPUFallbackEnabledElement } from '../types';\n\nimport getDefaultViewport from '../RenderingEngine/helpers/cpuFallback/rendering/getDefaultViewport';\nimport calculateTransform from '../RenderingEngine/helpers/cpuFallback/rendering/calculateTransform';\nimport drawImageSync from '../RenderingEngine/helpers/cpuFallback/drawImageSync';\n\n/**\n * Renders a cornerstone image object to a canvas.\n * Note: this does not load the image but only takes care of the rendering pipeline\n *\n * @param image - Cornerstone image object\n * @param canvas - Canvas element to render to\n */\nexport default function renderToCanvasCPU(\n canvas: HTMLCanvasElement,\n image: IImage,\n modality?: string,\n renderingEngineId?: string\n): Promise {\n const viewport = getDefaultViewport(canvas, image, modality);\n\n const enabledElement: CPUFallbackEnabledElement = {\n canvas,\n viewport,\n image,\n renderingTools: {},\n };\n\n enabledElement.transform = calculateTransform(enabledElement);\n\n const invalidated = true;\n return new Promise((resolve, reject) => {\n drawImageSync(enabledElement, invalidated);\n resolve(image.imageId);\n });\n}\n","import { IImage } from '../types';\n\nimport { loadAndCacheImage } from '../loaders/imageLoader';\nimport * as metaData from '../metaData';\nimport { RequestType } from '../enums';\nimport imageLoadPoolManager from '../requestPool/imageLoadPoolManager';\nimport renderToCanvasGPU from './renderToCanvasGPU';\nimport renderToCanvasCPU from './renderToCanvasCPU';\nimport { getConfiguration } from '../init';\n\ninterface LoadImageOptions {\n canvas: HTMLCanvasElement;\n imageId: string;\n requestType?: RequestType;\n priority?: number;\n renderingEngineId?: string;\n useCPURendering?: boolean;\n}\n\n/**\n * Loads and renders an imageId to a Canvas. It will use the GPU rendering pipeline\n * for image by default but you can force the CPU rendering pipeline by setting the\n * useCPURendering parameter to true.\n *\n * @example\n * ```\n * const canvas = document.getElementById('myCanvas')\n * const imageId = 'myImageId'\n *\n * loadImageToCanvas(canvas, imageId)\n * ```\n * @param canvas - Canvas element to render to\n * @param imageId - The imageId to render\n * @param requestType - The type of request (default to interaction), can be 'interaction' or 'prefetch' or 'thumbnail'\n * the order of loading for the pool manager is interaction, thumbnail, prefetch\n * @param priority - The priority of the request within the request type (lower is higher priority)\n * @param useCPURendering - Force the use of the CPU rendering pipeline (default to false)\n * @returns - A promise that resolves when the image has been rendered with the imageId\n */\nexport default function loadImageToCanvas(\n options: LoadImageOptions\n): Promise {\n const {\n canvas,\n imageId,\n requestType = RequestType.Thumbnail,\n priority = -5,\n renderingEngineId = '_thumbnails',\n useCPURendering = false,\n } = options;\n\n const renderFn = useCPURendering ? renderToCanvasCPU : renderToCanvasGPU;\n\n return new Promise((resolve, reject) => {\n function successCallback(image: IImage, imageId: string) {\n const { modality } = metaData.get('generalSeriesModule', imageId) || {};\n\n image.isPreScaled = image.isPreScaled || image.preScale?.scaled;\n\n renderFn(canvas, image, modality, renderingEngineId).then(() => {\n resolve(imageId);\n });\n }\n\n function errorCallback(error: Error, imageId: string) {\n console.error(error, imageId);\n reject(error);\n }\n\n function sendRequest(imageId, imageIdIndex, options) {\n return loadAndCacheImage(imageId, options).then(\n (image) => {\n successCallback.call(this, image, imageId);\n },\n (error) => {\n errorCallback.call(this, error, imageId);\n }\n );\n }\n\n const { useNorm16Texture } = getConfiguration().rendering;\n\n // IMPORTANT: Request type should be passed if not the 'interaction'\n // highest priority will be used for the request type in the imageRetrievalPool\n const options = {\n targetBuffer: {\n type: useNorm16Texture ? undefined : 'Float32Array',\n },\n preScale: {\n enabled: true,\n },\n useRGBA: !!useCPURendering,\n requestType,\n };\n\n imageLoadPoolManager.addRequest(\n sendRequest.bind(null, imageId, null, options),\n requestType,\n { imageId },\n priority\n );\n });\n}\n","import { vec3 } from 'gl-matrix';\nimport { metaData } from '..';\nimport { Point2, Point3 } from '../types';\n\n/**\n * Given the imageId, and 3d coordinates on the world space, it returns the continuos\n * image coordinates (IJ) on the image space. The image space is\n * defined with [0,0] being on the top left corner of the top left pixel,\n * the [1,1] being on the bottom right corner of the top left pixel.\n * @param imageId - The image id\n * @param worldCoords - The 3d coordinates on the world.\n * @returns The 2d coordinates on the image.\n *\n */\nfunction worldToImageCoords(\n imageId: string,\n worldCoords: Point3\n): Point2 | undefined {\n const imagePlaneModule = metaData.get('imagePlaneModule', imageId);\n\n if (!imagePlaneModule) {\n throw new Error(`No imagePlaneModule found for imageId: ${imageId}`);\n }\n\n // For the image coordinates we need to calculate the transformation matrix\n // from the world coordinates to the image coordinates.\n\n const {\n columnCosines,\n rowCosines,\n imagePositionPatient: origin,\n } = imagePlaneModule;\n\n let { columnPixelSpacing, rowPixelSpacing } = imagePlaneModule;\n // Use ||= to convert null and 0 as well as undefined to 1\n columnPixelSpacing ||= 1;\n rowPixelSpacing ||= 1;\n\n // The origin is the image position patient, but since image coordinates start\n // from [0,0] for the top left hand of the first pixel, and the origin is at the\n // center of the first pixel, we need to account for this.\n const newOrigin = vec3.create();\n\n vec3.scaleAndAdd(newOrigin, origin, columnCosines, -columnPixelSpacing / 2);\n vec3.scaleAndAdd(newOrigin, newOrigin, rowCosines, -rowPixelSpacing / 2);\n\n // Get the subtraction vector from the origin to the world coordinates\n const sub = vec3.create();\n vec3.sub(sub, worldCoords, newOrigin);\n\n // Projected distance of the sub vector onto the rowCosines\n const rowDistance = vec3.dot(sub, rowCosines);\n\n // Projected distance of the sub vector onto the columnCosines\n const columnDistance = vec3.dot(sub, columnCosines);\n\n const imageCoords = [\n rowDistance / rowPixelSpacing,\n columnDistance / columnPixelSpacing,\n ];\n\n return imageCoords as Point2;\n}\n\nexport default worldToImageCoords;\n","import { vec3 } from 'gl-matrix';\nimport { metaData } from '..';\nimport { Point2, Point3 } from '../types';\n\n/**\n * Given the imageId and a 2d coordinates on the image space with [0,0] being the top left corner\n * of the top left pixel, and options which includes the imageId, it returns the\n * 3d coordinates on the world space.\n * @param imageId - The image id\n * @param imageCoords - The 2d coordinates on the image\n * @returns The 3d coordinates on the world.\n *\n */\nexport default function imageToWorldCoords(\n imageId: string,\n imageCoords: Point2\n): Point3 | undefined {\n const imagePlaneModule = metaData.get('imagePlaneModule', imageId);\n\n if (!imagePlaneModule) {\n throw new Error(`No imagePlaneModule found for imageId: ${imageId}`);\n }\n\n const {\n columnCosines,\n rowCosines,\n imagePositionPatient: origin,\n } = imagePlaneModule;\n\n let { columnPixelSpacing, rowPixelSpacing } = imagePlaneModule;\n // Use ||= to convert null and 0 as well as undefined to 1\n columnPixelSpacing ||= 1;\n rowPixelSpacing ||= 1;\n\n // calculate the image coordinates in the world space\n const imageCoordsInWorld = vec3.create();\n\n // move from origin in the direction of the row cosines with the amount of\n // row pixel spacing times the first element of the image coordinates vector\n vec3.scaleAndAdd(\n imageCoordsInWorld,\n origin,\n rowCosines,\n // to accommodate the [0,0] being on the top left corner of the top left pixel\n // but the origin is at the center of the top left pixel\n rowPixelSpacing * (imageCoords[0] - 0.5)\n );\n\n vec3.scaleAndAdd(\n imageCoordsInWorld,\n imageCoordsInWorld,\n columnCosines,\n columnPixelSpacing * (imageCoords[1] - 0.5)\n );\n\n return Array.from(imageCoordsInWorld) as Point3;\n}\n","import vtkMatrixBuilder from '@kitware/vtk.js/Common/Core/MatrixBuilder';\nimport getVolumeActorCorners from './getVolumeActorCorners';\nimport type { VolumeActor, Point3, ActorSliceRange } from '../types';\nimport { EPSILON } from '../constants';\n\nconst SMALL_EPSILON = EPSILON * EPSILON;\nconst isOne = (v) => Math.abs(Math.abs(v) - 1) < SMALL_EPSILON;\nconst isUnit = (v, off) =>\n isOne(v[off]) || isOne(v[off + 1]) || isOne(v[off + 2]);\n\nconst isOrthonormal = (v) => isUnit(v, 0) && isUnit(v, 3) && isUnit(v, 6);\n\n/**\n * Given a `vtkVolumeActor`, and a normal direction,\n * calculate the range of slices in the focal normal direction that encapsulate\n * the volume. Also project the `focalPoint` onto this range.\n *\n * @param volumeActor - The `vtkVolumeActor`.\n * @param viewPlaneNormal - The normal to the camera view.\n * @param focalPoint - The focal point of the camera.\n *\n * @returns an object containing the `min`, `max` and `current`\n * positions in the normal direction.\n */\nexport default function getSliceRange(\n volumeActor: VolumeActor,\n viewPlaneNormal: Point3,\n focalPoint: Point3\n): ActorSliceRange {\n const imageData = volumeActor.getMapper().getInputData();\n let corners;\n const direction = imageData.getDirection();\n\n if (isOrthonormal(direction)) {\n // This logic is only valid when the IJK vectors are unit vectors\n corners = getVolumeActorCorners(volumeActor);\n } else {\n // This logic works for both unit and non-unit vectors, but is slower\n const [dx, dy, dz] = imageData.getDimensions();\n const cornersIdx = [\n [0, 0, 0],\n [dx - 1, 0, 0],\n [0, dy - 1, 0],\n [dx - 1, dy - 1, 0],\n [0, 0, dz - 1],\n [dx - 1, 0, dz - 1],\n [0, dy - 1, dz - 1],\n [dx - 1, dy - 1, dz - 1],\n ];\n corners = cornersIdx.map((it) => imageData.indexToWorld(it));\n }\n // Get rotation matrix from normal to +X (since bounds is aligned to XYZ)\n const transform = vtkMatrixBuilder\n .buildFromDegree()\n .identity()\n .rotateFromDirections(viewPlaneNormal, [1, 0, 0]);\n\n corners.forEach((pt) => transform.apply(pt));\n\n const transformedFocalPoint = [...focalPoint];\n transform.apply(transformedFocalPoint);\n\n const currentSlice = transformedFocalPoint[0];\n\n // range is now maximum X distance\n let minX = Infinity;\n let maxX = -Infinity;\n for (let i = 0; i < 8; i++) {\n const x = corners[i][0];\n if (x > maxX) {\n maxX = x;\n }\n if (x < minX) {\n minX = x;\n }\n }\n\n return {\n min: minX,\n max: maxX,\n current: currentSlice,\n actor: volumeActor,\n viewPlaneNormal,\n focalPoint,\n };\n}\n","import getSliceRange from './getSliceRange';\nimport getTargetVolumeAndSpacingInNormalDir from './getTargetVolumeAndSpacingInNormalDir';\nimport {\n ActorSliceRange,\n IVolumeViewport,\n ICamera,\n VolumeActor,\n} from '../types';\n\n/**\n * Calculates the slice range for the given volume based on its orientation\n * @param viewport - Volume viewport\n * @param volumeId - Id of one of the volumes loaded on the given viewport\n * @returns slice range information\n */\nfunction getVolumeSliceRangeInfo(\n viewport: IVolumeViewport,\n volumeId: string\n): {\n sliceRange: ActorSliceRange;\n spacingInNormalDirection: number;\n camera: ICamera;\n} {\n const camera = viewport.getCamera();\n const { focalPoint, viewPlaneNormal } = camera;\n const { spacingInNormalDirection, actorUID } =\n getTargetVolumeAndSpacingInNormalDir(viewport, camera, volumeId);\n\n if (!actorUID) {\n throw new Error(\n `Could not find image volume with id ${volumeId} in the viewport`\n );\n }\n\n const actorEntry = viewport.getActor(actorUID);\n\n if (!actorEntry) {\n console.warn('No actor found for with actorUID of', actorUID);\n return null;\n }\n\n const volumeActor = actorEntry.actor as VolumeActor;\n const sliceRange = getSliceRange(volumeActor, viewPlaneNormal, focalPoint);\n\n return {\n sliceRange,\n spacingInNormalDirection,\n camera,\n };\n}\n\nexport default getVolumeSliceRangeInfo;\n","import { IVolumeViewport } from '../types';\nimport getVolumeSliceRangeInfo from './getVolumeSliceRangeInfo';\n\n/**\n * Calculates the number os steps the volume can scroll based on its orientation\n * @param viewport - Volume viewport\n * @param volumeId - Id of one of the volumes loaded on the given viewport\n * @returns number of steps the volume can scroll and its current position\n */\nfunction getVolumeViewportScrollInfo(\n viewport: IVolumeViewport,\n volumeId: string\n) {\n const { sliceRange, spacingInNormalDirection, camera } =\n getVolumeSliceRangeInfo(viewport, volumeId);\n\n const { min, max, current } = sliceRange;\n\n // Now we can see how many steps there are in this direction\n const numScrollSteps = Math.round((max - min) / spacingInNormalDirection);\n\n // Find out current frameIndex\n const fraction = (current - min) / (max - min);\n const floatingStepNumber = fraction * numScrollSteps;\n const currentStepIndex = Math.round(floatingStepNumber);\n\n return {\n numScrollSteps,\n currentStepIndex,\n sliceRangeInfo: {\n sliceRange,\n spacingInNormalDirection,\n camera,\n },\n };\n}\n\nexport default getVolumeViewportScrollInfo;\n","import { vec3 } from 'gl-matrix';\nimport { ActorSliceRange, Point3 } from '../types';\n\n/**\n * Given a number of frames, `deltaFrames`,\n * move the `focalPoint` and camera `position` so that it moves forward/backwards\n * `deltaFrames` in the camera's normal direction, and snaps to the nearest frame.\n *\n * @param focalPoint - The focal point to move.\n * @param position - The camera position to move.\n * @param sliceRange - The scroll range used to find the current\n * position in the stack, as well as prevent scrolling past the extent of the volume.\n * @param viewPlaneNormal - The normal direction of the camera.\n * @param spacingInNormalDirection - The spacing of frames the normal direction of the camera.\n * @param deltaFrames - The number of frames to jump.\n *\n * @returns The `newFocalPoint` and `newPosition` of the camera.\n */\nexport default function snapFocalPointToSlice(\n focalPoint: Point3,\n position: Point3,\n sliceRange: ActorSliceRange,\n viewPlaneNormal: Point3,\n spacingInNormalDirection: number,\n deltaFrames: number\n): { newFocalPoint: Point3; newPosition: Point3 } {\n const { min, max, current } = sliceRange;\n\n // Get the current offset off the camera position so we can add it on at the end.\n const posDiffFromFocalPoint = vec3.create();\n\n vec3.sub(posDiffFromFocalPoint, position, focalPoint);\n\n // Now we can see how many steps there are in this direction\n const steps = Math.round((max - min) / spacingInNormalDirection);\n\n // Find out current frameIndex\n const fraction = (current - min) / (max - min);\n const floatingStepNumber = fraction * steps;\n let frameIndex = Math.round(floatingStepNumber);\n\n // Dolly the focal point back to min slice focal point.\n let newFocalPoint = [\n focalPoint[0] -\n viewPlaneNormal[0] * floatingStepNumber * spacingInNormalDirection,\n focalPoint[1] -\n viewPlaneNormal[1] * floatingStepNumber * spacingInNormalDirection,\n focalPoint[2] -\n viewPlaneNormal[2] * floatingStepNumber * spacingInNormalDirection,\n ];\n\n // Increment the slice number by deltaFrames.\n frameIndex += deltaFrames;\n\n // Clamp sliceNumber to volume.\n if (frameIndex > steps) {\n frameIndex = steps;\n } else if (frameIndex < 0) {\n frameIndex = 0;\n }\n\n // Dolly the focal towards to the correct frame focal point.\n const newSlicePosFromMin = frameIndex * spacingInNormalDirection;\n\n newFocalPoint = [\n newFocalPoint[0] + viewPlaneNormal[0] * newSlicePosFromMin,\n newFocalPoint[1] + viewPlaneNormal[1] * newSlicePosFromMin,\n newFocalPoint[2] + viewPlaneNormal[2] * newSlicePosFromMin,\n ];\n\n const newPosition = [\n newFocalPoint[0] + posDiffFromFocalPoint[0],\n newFocalPoint[1] + posDiffFromFocalPoint[1],\n newFocalPoint[2] + posDiffFromFocalPoint[2],\n ];\n\n return { newFocalPoint, newPosition };\n}\n","import { ImageSliceData, IVolumeViewport, VolumeActor } from '../types';\nimport getSliceRange from './getSliceRange';\nimport getTargetVolumeAndSpacingInNormalDir from './getTargetVolumeAndSpacingInNormalDir';\n\n/**\n * It calculates the number of slices and the current slice index for a given\n * Volume viewport\n * @param viewport - volume viewport\n * @returns An object with two properties: numberOfSlices and imageIndex.\n */\nfunction getImageSliceDataForVolumeViewport(\n viewport: IVolumeViewport\n): ImageSliceData {\n const camera = viewport.getCamera();\n\n const { spacingInNormalDirection, imageVolume } =\n getTargetVolumeAndSpacingInNormalDir(viewport, camera);\n\n if (!imageVolume) {\n return;\n }\n\n const { viewPlaneNormal, focalPoint } = camera;\n\n const actorEntry = viewport\n .getActors()\n .find(\n (a) =>\n a.referenceId === imageVolume.volumeId || a.uid === imageVolume.volumeId\n );\n\n if (!actorEntry) {\n console.warn('No actor found for with actorUID of', imageVolume.volumeId);\n }\n\n const volumeActor = actorEntry.actor as VolumeActor;\n const sliceRange = getSliceRange(volumeActor, viewPlaneNormal, focalPoint);\n\n const { min, max, current } = sliceRange;\n\n // calculate number of steps from min to max with current normal spacing in direction\n const numberOfSlices = Math.round((max - min) / spacingInNormalDirection) + 1;\n\n // calculate the imageIndex based on min, max, current\n let imageIndex = ((current - min) / (max - min)) * numberOfSlices;\n imageIndex = Math.floor(imageIndex);\n\n // Clamp imageIndex\n if (imageIndex > numberOfSlices - 1) {\n imageIndex = numberOfSlices - 1;\n } else if (imageIndex < 0) {\n imageIndex = 0;\n }\n\n return {\n numberOfSlices,\n imageIndex,\n };\n}\n\nexport default getImageSliceDataForVolumeViewport;\n","import { Types } from '..';\n\ntype actorTypes = 'vtkActor' | 'vtkVolume' | 'vtkImageSlice';\n\n/**\n * Checks if a vtk Actor is an image actor (vtkVolume or vtkImageSlice) otherwise returns false.\n *\n * @param actor - actor\n * @returns A boolean value.\n */\nexport function isImageActor(actorEntry: Types.ActorEntry): boolean {\n return (\n actorIsA(actorEntry, 'vtkVolume') || actorIsA(actorEntry, 'vtkImageSlice')\n );\n}\n\nexport function actorIsA(\n actorEntry: Types.ActorEntry,\n actorType: actorTypes\n): boolean {\n const actor = actorEntry.actor;\n\n return !!actor.isA(actorType);\n}\n","import { getRenderingEngine } from '../RenderingEngine';\nimport { getRenderingEngines } from '../RenderingEngine/getRenderingEngine';\nimport { IStackViewport, IVolumeViewport } from '../types';\n\ntype Viewport = IStackViewport | IVolumeViewport;\n\n/**\n * Get the viewport that is rendering the image with the given imageURI (imageId without\n * the loader schema), this can be a stackViewport or a volumeViewport.\n *\n * @param renderingEngine - The rendering engine that is rendering the viewports\n * @param imageURI - The imageURI of the image that is requested\n * @returns A Viewport\n */\nexport default function getViewportsWithImageURI(\n imageURI: string,\n renderingEngineId?: string\n): Array {\n // If rendering engine is not provided, use all rendering engines\n let renderingEngines;\n if (renderingEngineId) {\n renderingEngines = [getRenderingEngine(renderingEngineId)];\n } else {\n renderingEngines = getRenderingEngines();\n }\n\n const viewports = [];\n renderingEngines.forEach((renderingEngine) => {\n const stackViewports = renderingEngine.getStackViewports();\n\n const filteredStackViewports = stackViewports.filter((viewport) =>\n viewport.hasImageURI(imageURI)\n );\n\n // If no stack viewport found but a volumeViewport is rendering the same data\n const volumeViewports = renderingEngine.getVolumeViewports();\n\n const filteredVolumeViewports = volumeViewports.filter((viewport) =>\n viewport.hasImageURI(imageURI)\n );\n\n viewports.push(...filteredStackViewports, ...filteredVolumeViewports);\n });\n\n return viewports;\n}\n","import { vec3 } from 'gl-matrix';\nimport { planar } from '.';\nimport { metaData } from '..';\nimport { IStackViewport, Point3 } from '../types';\n\n/**\n * Given a point in 3D space and a viewport it returns the index of the closest imageId, it assumes that stack images are sorted according to their sliceLocation\n * @param point - [A, B, C] coordinates of the point in 3D space\n * @param viewport - The StackViewport to search for the closest imageId\n *\n * @returns The imageId index of the closest imageId or null if no imageId is found\n */\nexport default function getClosestStackImageIndexForPoint(\n point: Point3,\n viewport: IStackViewport\n): number | null {\n const minimalDistance = calculateMinimalDistanceForStackViewport(\n point,\n viewport\n );\n return minimalDistance ? minimalDistance.index : null;\n}\n\n//assumes that imageIds are sorted by slice location\nexport function calculateMinimalDistanceForStackViewport(\n point: Point3,\n viewport: IStackViewport\n): { distance: number; index: number } | null {\n const imageIds = viewport.getImageIds();\n const currentImageIdIndex = viewport.getCurrentImageIdIndex();\n\n if (imageIds.length === 0) {\n return null;\n }\n\n const getDistance = (imageId: string): null | number => {\n const planeMetadata = getPlaneMetadata(imageId);\n if (!planeMetadata) {\n return null;\n }\n const plane = planar.planeEquation(\n planeMetadata.planeNormal,\n planeMetadata.imagePositionPatient\n );\n const distance = planar.planeDistanceToPoint(plane, point);\n return distance;\n };\n\n const closestStack = {\n distance: getDistance(imageIds[currentImageIdIndex]) ?? Infinity,\n index: currentImageIdIndex,\n };\n\n //check higher indices\n const higherImageIds = imageIds.slice(currentImageIdIndex + 1);\n\n for (let i = 0; i < higherImageIds.length; i++) {\n const id = higherImageIds[i];\n const distance = getDistance(id);\n if (distance === null) {\n continue;\n }\n if (distance <= closestStack.distance) {\n closestStack.distance = distance;\n closestStack.index = i + currentImageIdIndex + 1;\n } else {\n break;\n }\n }\n //check lower indices\n const lowerImageIds = imageIds.slice(0, currentImageIdIndex);\n for (let i = lowerImageIds.length - 1; i >= 0; i--) {\n const id = lowerImageIds[i];\n const distance = getDistance(id);\n if (distance === null || distance === closestStack.distance) {\n continue;\n }\n if (distance < closestStack.distance) {\n closestStack.distance = distance;\n closestStack.index = i;\n } else {\n break;\n }\n }\n return closestStack.distance === Infinity ? null : closestStack;\n}\n\nfunction getPlaneMetadata(imageId: string): null | {\n rowCosines: Point3;\n columnCosines: Point3;\n imagePositionPatient: Point3;\n planeNormal: Point3;\n} {\n const targetImagePlane = metaData.get('imagePlaneModule', imageId);\n\n if (\n !targetImagePlane ||\n !(\n targetImagePlane.rowCosines instanceof Array &&\n targetImagePlane.rowCosines.length === 3\n ) ||\n !(\n targetImagePlane.columnCosines instanceof Array &&\n targetImagePlane.columnCosines.length === 3\n ) ||\n !(\n targetImagePlane.imagePositionPatient instanceof Array &&\n targetImagePlane.imagePositionPatient.length === 3\n )\n ) {\n return null;\n }\n const {\n rowCosines,\n columnCosines,\n imagePositionPatient,\n }: {\n rowCosines: Point3;\n columnCosines: Point3;\n imagePositionPatient: Point3;\n } = targetImagePlane;\n\n const rowVec = vec3.set(vec3.create(), ...rowCosines);\n const colVec = vec3.set(vec3.create(), ...columnCosines);\n const planeNormal = vec3.cross(vec3.create(), rowVec, colVec) as Point3;\n\n return { rowCosines, columnCosines, imagePositionPatient, planeNormal };\n}\n","import { mat4 } from 'gl-matrix';\nimport { addProvider } from '../metaData';\n\nconst state = {};\n\n/**\n * Simple metadataProvider object to store metadata for spatial registration module.\n */\nconst spatialRegistrationMetadataProvider = {\n /* Adding a new entry to the state object. */\n add: (query: string[], payload: mat4): void => {\n const [viewportId1, viewportId2] = query;\n const entryId = `${viewportId1}_${viewportId2}`;\n\n if (!state[entryId]) {\n state[entryId] = {};\n }\n\n state[entryId] = payload;\n },\n\n get: (type: string, query: string[]): mat4 => {\n if (type !== 'spatialRegistrationModule') {\n return;\n }\n\n const [viewportId1, viewportId2] = query;\n\n // check both ways\n const entryId = `${viewportId1}_${viewportId2}`;\n\n if (state[entryId]) {\n return state[entryId];\n }\n\n const entryIdReverse = `${viewportId2}_${viewportId1}`;\n\n if (state[entryIdReverse]) {\n return mat4.invert(mat4.create(), state[entryIdReverse]);\n }\n },\n};\n\naddProvider(\n spatialRegistrationMetadataProvider.get.bind(\n spatialRegistrationMetadataProvider\n )\n);\n\nexport default spatialRegistrationMetadataProvider;\n","import { vec3, mat4 } from 'gl-matrix';\nimport { IStackViewport } from '../types';\nimport spatialRegistrationMetadataProvider from './spatialRegistrationMetadataProvider';\nimport { metaData } from '..';\n\n/**\n * Defines the allowed difference as a percent between the unit normals before\n * two planes are considered not coplanar. Since this value is small compared\n * to the unit lenght, this value is approximately the angular difference, measured\n * in radians. That is, allow about a 3 degrees variation.\n */\nconst ALLOWED_DELTA = 0.05;\n\n/**\n * It calculates the registration matrix between two viewports (currently only\n * translation is supported)\n * If the viewports are in the same frame of reference, it will return early,\n * but otherwise it will use the current image's metadata to calculate the\n * translation between the two viewports and adds it to the spatialRegistrationModule\n * metadata provider\n *\n *\n * @param viewport1 - The first stack viewport\n * @param viewport2 - The second stack viewport\n */\nfunction calculateViewportsSpatialRegistration(\n viewport1: IStackViewport,\n viewport2: IStackViewport\n): void {\n const imageId1 = viewport1.getCurrentImageId();\n const imageId2 = viewport2.getCurrentImageId();\n\n const imagePlaneModule1 = metaData.get('imagePlaneModule', imageId1);\n const imagePlaneModule2 = metaData.get('imagePlaneModule', imageId2);\n\n if (!imagePlaneModule1 || !imagePlaneModule2) {\n console.log('Viewport spatial registration requires image plane module');\n return;\n }\n const { imageOrientationPatient: iop2 } = imagePlaneModule2;\n const isSameImagePlane = imagePlaneModule1.imageOrientationPatient.every(\n (v, i) => Math.abs(v - iop2[i]) < ALLOWED_DELTA\n );\n\n if (!isSameImagePlane) {\n console.log(\n 'Viewport spatial registration only supported for same orientation (hence translation only) for now',\n imagePlaneModule1?.imageOrientationPatient,\n imagePlaneModule2?.imageOrientationPatient\n );\n return;\n }\n\n const imagePositionPatient1 = imagePlaneModule1.imagePositionPatient;\n const imagePositionPatient2 = imagePlaneModule2.imagePositionPatient;\n\n const translation = vec3.subtract(\n vec3.create(),\n imagePositionPatient1,\n imagePositionPatient2\n );\n\n const mat = mat4.fromTranslation(mat4.create(), translation);\n spatialRegistrationMetadataProvider.add([viewport1.id, viewport2.id], mat);\n}\n\nexport default calculateViewportsSpatialRegistration;\n","import {\n IImageData,\n IStackViewport,\n IVolumeViewport,\n Point2,\n Point3,\n} from '../types';\n\n/**\n * Given a viewport, return the corners of the image in the viewport in world coordinates.\n * Note that this is different than the corners of the canvas in world coordinates since\n * an image can be zoomed out and the canvas can be larger than the image; hence, the\n * corners of the canvas in world coordinates will be outside the image.\n *\n * @param viewport - The viewport to get the corners of.\n * @returns The corners of the image in the viewport in world coordinates.\n */\nexport default function getViewportImageCornersInWorld(\n viewport: IStackViewport | IVolumeViewport\n): Point3[] {\n const { imageData, dimensions } = viewport.getImageData() as IImageData;\n const { canvas } = viewport;\n\n const topLeftCanvas: Point2 = [0, 0];\n const topRightCanvas: Point2 = [canvas.width, 0];\n const bottomRightCanvas: Point2 = [canvas.width, canvas.height];\n const bottomLeftCanvas: Point2 = [0, canvas.height];\n\n const topLeftWorld = viewport.canvasToWorld(topLeftCanvas);\n const topRightWorld = viewport.canvasToWorld(topRightCanvas);\n const bottomRightWorld = viewport.canvasToWorld(bottomRightCanvas);\n const bottomLeftWorld = viewport.canvasToWorld(bottomLeftCanvas);\n\n const topLeftImage = imageData.worldToIndex(topLeftWorld);\n const topRightImage = imageData.worldToIndex(topRightWorld);\n const bottomRightImage = imageData.worldToIndex(bottomRightWorld);\n const bottomLeftImage = imageData.worldToIndex(bottomLeftWorld);\n\n return _getStackViewportImageCorners({\n dimensions,\n imageData,\n topLeftImage,\n topRightImage,\n bottomRightImage,\n bottomLeftImage,\n topLeftWorld,\n topRightWorld,\n bottomRightWorld,\n bottomLeftWorld,\n });\n}\n\nfunction _getStackViewportImageCorners({\n dimensions,\n imageData,\n topLeftImage,\n topRightImage,\n bottomRightImage,\n bottomLeftImage,\n topLeftWorld,\n topRightWorld,\n bottomRightWorld,\n bottomLeftWorld,\n}) {\n const topLeftImageWorld = _isInBounds(topLeftImage, dimensions)\n ? topLeftWorld\n : (imageData.indexToWorld([0, 0, 0]) as Point3);\n\n const topRightImageWorld = _isInBounds(topRightImage, dimensions)\n ? topRightWorld\n : (imageData.indexToWorld([dimensions[0] - 1, 0, 0]) as Point3);\n\n const bottomRightImageWorld = _isInBounds(bottomRightImage, dimensions)\n ? bottomRightWorld\n : (imageData.indexToWorld([\n dimensions[0] - 1,\n dimensions[1] - 1,\n 0,\n ]) as Point3);\n\n const bottomLeftImageWorld = _isInBounds(bottomLeftImage, dimensions)\n ? bottomLeftWorld\n : (imageData.indexToWorld([0, dimensions[1] - 1, 0]) as Point3);\n\n return [\n topLeftImageWorld,\n topRightImageWorld,\n bottomLeftImageWorld,\n bottomRightImageWorld,\n ];\n}\n\nfunction _isInBounds(imageCoord, dimensions) {\n return (\n imageCoord[0] > 0 ||\n imageCoord[0] < dimensions[0] - 1 ||\n imageCoord[1] > 0 ||\n imageCoord[1] < dimensions[1] - 1 ||\n imageCoord[2] > 0 ||\n imageCoord[2] < dimensions[2] - 1\n );\n}\n","/**\n * A function that checks if there is a value in the array that is NaN.\n * or if the input is a number it just checks if it is NaN.\n * @param input - The input to check if it is NaN.\n * @returns - True if the input is NaN, false otherwise.\n */\nexport default function hasNaNValues(input: number[] | number): boolean {\n if (Array.isArray(input)) {\n return input.some((value) => Number.isNaN(value));\n }\n return Number.isNaN(input);\n}\n","import vtkColorTransferFunction from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction';\nimport vtkPiecewiseFunction from '@kitware/vtk.js/Common/DataModel/PiecewiseFunction';\nimport { ViewportPreset } from '../types';\nimport { VolumeActor } from '../types/IActor';\n\n/**\n * Applies a preset to a volume actor.\n *\n * @param actor - The volume actor to apply the preset to.\n * @param preset - The preset to apply.\n */\nexport default function applyPreset(\n actor: VolumeActor,\n preset: ViewportPreset\n) {\n // Create color transfer function\n const colorTransferArray = preset.colorTransfer\n .split(' ')\n .splice(1)\n .map(parseFloat);\n\n const { shiftRange } = getShiftRange(colorTransferArray);\n const min = shiftRange[0];\n const width = shiftRange[1] - shiftRange[0];\n const cfun = vtkColorTransferFunction.newInstance();\n const normColorTransferValuePoints = [];\n for (let i = 0; i < colorTransferArray.length; i += 4) {\n let value = colorTransferArray[i];\n const r = colorTransferArray[i + 1];\n const g = colorTransferArray[i + 2];\n const b = colorTransferArray[i + 3];\n\n value = (value - min) / width;\n normColorTransferValuePoints.push([value, r, g, b]);\n }\n\n applyPointsToRGBFunction(normColorTransferValuePoints, shiftRange, cfun);\n\n actor.getProperty().setRGBTransferFunction(0, cfun);\n\n // Create scalar opacity function\n const scalarOpacityArray = preset.scalarOpacity\n .split(' ')\n .splice(1)\n .map(parseFloat);\n\n const ofun = vtkPiecewiseFunction.newInstance();\n const normPoints = [];\n for (let i = 0; i < scalarOpacityArray.length; i += 2) {\n let value = scalarOpacityArray[i];\n const opacity = scalarOpacityArray[i + 1];\n\n value = (value - min) / width;\n\n normPoints.push([value, opacity]);\n }\n\n applyPointsToPiecewiseFunction(normPoints, shiftRange, ofun);\n\n actor.getProperty().setScalarOpacity(0, ofun);\n\n const [\n gradientMinValue,\n gradientMinOpacity,\n gradientMaxValue,\n gradientMaxOpacity,\n ] = preset.gradientOpacity.split(' ').splice(1).map(parseFloat);\n\n actor.getProperty().setUseGradientOpacity(0, true);\n actor.getProperty().setGradientOpacityMinimumValue(0, gradientMinValue);\n actor.getProperty().setGradientOpacityMinimumOpacity(0, gradientMinOpacity);\n actor.getProperty().setGradientOpacityMaximumValue(0, gradientMaxValue);\n actor.getProperty().setGradientOpacityMaximumOpacity(0, gradientMaxOpacity);\n\n if (preset.interpolation === '1') {\n actor.getProperty().setInterpolationTypeToFastLinear();\n //actor.getProperty().setInterpolationTypeToLinear()\n }\n\n const ambient = parseFloat(preset.ambient);\n const diffuse = parseFloat(preset.diffuse);\n const specular = parseFloat(preset.specular);\n const specularPower = parseFloat(preset.specularPower);\n\n actor.getProperty().setAmbient(ambient);\n actor.getProperty().setDiffuse(diffuse);\n actor.getProperty().setSpecular(specular);\n actor.getProperty().setSpecularPower(specularPower);\n}\n\nfunction getShiftRange(colorTransferArray) {\n // Credit to paraview-glance\n // https://github.com/Kitware/paraview-glance/blob/3fec8eeff31e9c19ad5b6bff8e7159bd745e2ba9/src/components/controls/ColorBy/script.js#L133\n\n // shift range is original rgb/opacity range centered around 0\n let min = Infinity;\n let max = -Infinity;\n for (let i = 0; i < colorTransferArray.length; i += 4) {\n min = Math.min(min, colorTransferArray[i]);\n max = Math.max(max, colorTransferArray[i]);\n }\n\n const center = (max - min) / 2;\n\n return {\n shiftRange: [-center, center],\n min,\n max,\n };\n}\n\nfunction applyPointsToRGBFunction(points, range, cfun) {\n const width = range[1] - range[0];\n const rescaled = points.map(([x, r, g, b]) => [\n x * width + range[0],\n r,\n g,\n b,\n ]);\n\n cfun.removeAllPoints();\n rescaled.forEach(([x, r, g, b]) => cfun.addRGBPoint(x, r, g, b));\n\n return rescaled;\n}\n\nfunction applyPointsToPiecewiseFunction(points, range, pwf) {\n const width = range[1] - range[0];\n const rescaled = points.map(([x, y]) => [x * width + range[0], y]);\n\n pwf.removeAllPoints();\n rescaled.forEach(([x, y]) => pwf.addPoint(x, y));\n\n return rescaled;\n}\n","const isMergeableObject = (val) => {\n const nonNullObject = val && typeof val === 'object';\n\n return (\n nonNullObject &&\n Object.prototype.toString.call(val) !== '[object RegExp]' &&\n Object.prototype.toString.call(val) !== '[object Date]'\n );\n};\n\nconst emptyTarget = (val) => {\n const isEmpty = Array.isArray(val) ? [] : {};\n\n return isEmpty;\n};\n\nconst cloneIfNecessary = (value, optionsArgument) => {\n const clone = optionsArgument && optionsArgument.clone === true;\n\n return clone && isMergeableObject(value)\n ? deepMerge(emptyTarget(value), value, optionsArgument)\n : value;\n};\n\nconst defaultArrayMerge = (target, source, optionsArgument) => {\n const destination = target.slice();\n\n source.forEach(function (e, i) {\n if (typeof destination[i] === 'undefined') {\n destination[i] = cloneIfNecessary(e, optionsArgument);\n } else if (isMergeableObject(e)) {\n destination[i] = deepMerge(target[i], e, optionsArgument);\n } else if (target.indexOf(e) === -1) {\n destination.push(cloneIfNecessary(e, optionsArgument));\n }\n });\n\n return destination;\n};\n\nconst mergeObject = (target, source, optionsArgument) => {\n const destination = {};\n\n if (isMergeableObject(target)) {\n Object.keys(target).forEach(function (key) {\n destination[key] = cloneIfNecessary(target[key], optionsArgument);\n });\n }\n Object.keys(source).forEach(function (key) {\n if (!isMergeableObject(source[key]) || !target[key]) {\n destination[key] = cloneIfNecessary(source[key], optionsArgument);\n } else {\n destination[key] = deepMerge(target[key], source[key], optionsArgument);\n }\n });\n\n return destination;\n};\n\n/**\n * Merge two objects, recursively merging any objects that are arrays\n * @param target - The target object.\n * @param source - The source object to merge into the target object.\n * @param optionsArgument - The options object.\n * @returns The merged object.\n */\nconst deepMerge = (target = {}, source = {}, optionsArgument = undefined) => {\n const array = Array.isArray(source);\n const options = optionsArgument || { arrayMerge: defaultArrayMerge };\n const arrayMerge = options.arrayMerge || defaultArrayMerge;\n\n if (array) {\n return Array.isArray(target)\n ? arrayMerge(target, source, optionsArgument)\n : cloneIfNecessary(source, optionsArgument);\n }\n\n return mergeObject(target, source, optionsArgument);\n};\n\nexport default deepMerge;\n","import { get as metaDataGet } from '../metaData';\nimport { ScalingParameters } from '../types';\n\n/**\n * It returns the scaling parameters for the image with the given imageId. This can be\n * used to get passed (as an option) to the imageLoader in order to apply scaling to the image inside\n * the imageLoader.\n * @param imageId - The imageId of the image\n * @returns ScalingParameters\n */\nexport default function getScalingParameters(\n imageId: string\n): ScalingParameters {\n const modalityLutModule = metaDataGet('modalityLutModule', imageId) || {};\n const generalSeriesModule = metaDataGet('generalSeriesModule', imageId) || {};\n\n const { modality } = generalSeriesModule;\n\n const scalingParameters = {\n rescaleSlope: modalityLutModule.rescaleSlope,\n rescaleIntercept: modalityLutModule.rescaleIntercept,\n modality,\n };\n\n const suvFactor = metaDataGet('scalingModule', imageId) || {};\n\n return {\n ...scalingParameters,\n ...(modality === 'PT' && {\n suvbw: suvFactor.suvbw,\n suvbsa: suvFactor.suvbsa,\n suvlbm: suvFactor.suvlbm,\n }),\n };\n}\n","import { ScalingParameters } from '../types';\n\n/**\n * If the scalar data is a Uint8Array, return 'Uint8Array'. If the scalar data is a\n * Float32Array, return 'Float32Array'. If the scalar data is a Int16Array, return\n * 'Int16Array'. If the scalar data is a Uint16Array, return 'Uint16Array'. If the\n * scalar data is none of the above, throw an error.\n * @param {ScalingParameters} scalingParameters - {\n * @param {any} [scalarData] - The data to be converted.\n * @returns The data type of the scalar data.\n */\nexport default function getScalarDataType(\n scalingParameters: ScalingParameters,\n scalarData?: any\n): string {\n let type;\n\n if (scalarData && scalarData instanceof Uint8Array) {\n type = 'Uint8Array';\n } else if (scalarData instanceof Float32Array) {\n type = 'Float32Array';\n } else if (scalarData instanceof Int16Array) {\n type = 'Int16Array';\n } else if (scalarData instanceof Uint16Array) {\n type = 'Uint16Array';\n } else {\n throw new Error('Unsupported array type');\n }\n\n return type;\n}\n","import getRenderingEngine, {\n getRenderingEngines,\n} from './RenderingEngine/getRenderingEngine';\nimport { IEnabledElement } from './types';\n\n/**\n * A convenience method to find an EnabledElement given a reference to its\n * associated element. Commonly used in code that's handling a custom\n * event emitted by this library.\n *\n * @example\n * Using the renderingEngine to find the enabled element:\n * ```javascript\n * const element = getRenderingEngine(renderingEngineId)\n * .getViewport(viewportId)\n * .element\n *\n * const enabledElement = getEnabledElement(element)\n * ```\n *\n * @example\n * Using a cornerstone event's \"element\"\n * ```javascript\n * // Our \"cornerstone events\" contain the source element, which is\n * // raised on the viewport's div element\n * const { element } = evt.detail\n * const enabledElement = getEnabledElement(element)\n * ```\n *\n * @param element - a reference to an EnabledElement/Viewport's div element\n * @returns the associated EnabledElement, or undefined if no matching EnabledElement\n * can be found\n */\nexport default function getEnabledElement(\n element: HTMLDivElement | undefined\n): IEnabledElement | undefined {\n if (!element) {\n return;\n }\n\n const { viewportUid, renderingEngineUid } = element.dataset;\n\n return getEnabledElementByIds(viewportUid, renderingEngineUid);\n}\n\n/**\n * Similar to {@link getEnabledElement}, but takes the IDs of the\n * renderingEngine and viewport as parameters to return the associated\n * EnabledElement.\n *\n * @param viewportId - The Id of the viewport\n * @param renderingEngineId - The Id of the rendering engine.\n * @returns The enabled element which is an object that contains the viewport, rendering\n * engine, viewport Id, rendering engine Id, and the Frame of Reference UID.\n */\nexport function getEnabledElementByIds(\n viewportId: string,\n renderingEngineId: string\n): IEnabledElement {\n if (!renderingEngineId || !viewportId) {\n return;\n }\n\n const renderingEngine = getRenderingEngine(renderingEngineId);\n\n if (!renderingEngine || renderingEngine.hasBeenDestroyed) {\n return;\n }\n\n const viewport = renderingEngine.getViewport(viewportId);\n\n if (!viewport) {\n return;\n }\n\n const FrameOfReferenceUID = viewport.getFrameOfReferenceUID();\n\n return {\n viewport,\n renderingEngine,\n viewportId,\n renderingEngineId,\n FrameOfReferenceUID,\n };\n}\n\n/**\n * Get all the enabled elements from all the rendering engines\n * @returns An array of enabled elements.\n */\nexport function getEnabledElements(): IEnabledElement[] {\n const enabledElements = [];\n\n const renderingEngines = getRenderingEngines();\n\n renderingEngines.forEach((renderingEngine) => {\n const viewports = renderingEngine.getViewports();\n\n viewports.forEach(({ element }) => {\n enabledElements.push(getEnabledElement(element));\n });\n });\n\n return enabledElements;\n}\n","import { StackViewport, Types } from '..';\nimport getEnabledElement from '../getEnabledElement';\n\n/**\n * Gets the IImage rendered by the given element. This is provided as a\n * convenience for the legacy cornerstone getImage function. However it is\n * encouraged for IStackViewport.getImage to be used instead.\n * @param element - the element rendering/containing the image\n * @returns the image\n */\nfunction getImageLegacy(element: HTMLDivElement): Types.IImage | undefined {\n const enabledElement = getEnabledElement(element);\n\n if (!enabledElement) {\n return;\n }\n\n const { viewport } = enabledElement;\n\n if (!(viewport instanceof StackViewport)) {\n throw new Error(\n `An image can only be fetched for a stack viewport and not for a viewport of type: ${viewport.type}`\n );\n }\n\n return viewport.getCornerstoneImage();\n}\n\nexport default getImageLegacy;\n","import { Point3, Plane } from '../types';\nimport { vec3, mat3 } from 'gl-matrix';\n\n/**\n * It calculates the intersection of a line and a plane.\n * Plane equation is Ax+By+Cz=D\n * @param p0 - [x,y,z] of the first point of the line\n * @param p1 - [x,y,z] of the second point of the line\n * @param plane - [A, B, C, D] Plane parameter: Ax+By+Cz=D\n * @returns - [X,Y,Z] coordinates of the intersection\n */\nfunction linePlaneIntersection(p0: Point3, p1: Point3, plane: Plane): Point3 {\n const [x0, y0, z0] = p0;\n const [x1, y1, z1] = p1;\n const [A, B, C, D] = plane;\n const a = x1 - x0;\n const b = y1 - y0;\n const c = z1 - z0;\n const t = (-1 * (A * x0 + B * y0 + C * z0 - D)) / (A * a + B * b + C * c);\n const X = a * t + x0;\n const Y = b * t + y0;\n const Z = c * t + z0;\n\n return [X, Y, Z];\n}\n\n/**\n * It returns the plane equation defined by a point and a normal vector.\n * @param normal - normal vector\n * @param point - a point on the plane\n * @returns - [A, B,C, D] of plane equation A*X + B*Y + C*Z = D\n */\nfunction planeEquation(normal: Point3, point: Point3 | vec3): Plane {\n const [A, B, C] = normal;\n const D = A * point[0] + B * point[1] + C * point[2];\n return [A, B, C, D];\n}\n\n/**\n * Computes the intersection of three planes in 3D space with equations:\n * A1*X + B1*Y + C1*Z = D1\n * A2*X + B2*Y + C2*Z = D2\n * A3*X + B3*Y + C3*Z = D3\n * @returns - [x, y, z] the intersection in the world coordinate\n */\nfunction threePlaneIntersection(\n firstPlane: Plane,\n secondPlane: Plane,\n thirdPlane: Plane\n): Point3 {\n const [A1, B1, C1, D1] = firstPlane;\n const [A2, B2, C2, D2] = secondPlane;\n const [A3, B3, C3, D3] = thirdPlane;\n const m0 = mat3.fromValues(A1, A2, A3, B1, B2, B3, C1, C2, C3);\n const m1 = mat3.fromValues(D1, D2, D3, B1, B2, B3, C1, C2, C3);\n const m2 = mat3.fromValues(A1, A2, A3, D1, D2, D3, C1, C2, C3);\n const m3 = mat3.fromValues(A1, A2, A3, B1, B2, B3, D1, D2, D3);\n\n // TODO: handle no intersection scenario\n const x = mat3.determinant(m1) / mat3.determinant(m0);\n const y = mat3.determinant(m2) / mat3.determinant(m0);\n const z = mat3.determinant(m3) / mat3.determinant(m0);\n return [x, y, z];\n}\n\n/**\n * Computes the distance of a point in 3D space to a plane\n * @param plane - [A, B, C, D] of plane equation A*X + B*Y + C*Z = D\n * @param point - [A, B, C] the plane in World coordinate\n * @param signed - if true, the distance is signed\n * @returns - the distance of the point to the plane\n * */\nfunction planeDistanceToPoint(\n plane: Plane,\n point: Point3,\n signed = false\n): number {\n const [A, B, C, D] = plane;\n const [x, y, z] = point;\n const numerator = A * x + B * y + C * z - D;\n const distance = Math.abs(numerator) / Math.sqrt(A * A + B * B + C * C);\n const sign = signed ? Math.sign(numerator) : 1;\n return sign * distance;\n}\n\nexport {\n linePlaneIntersection,\n planeEquation,\n threePlaneIntersection,\n planeDistanceToPoint,\n};\n","/**\n * Given a low and high window level, return the window width and window center\n * Formulas from note 4 in\n * https://dicom.nema.org/medical/dicom/current/output/html/part03.html#sect_C.11.2.1.2.1\n * extended to allow for low/high swapping\n * @param low - The low window level.\n * @param high - The high window level.\n * @returns a JavaScript object with two properties: windowWidth and windowCenter.\n */\nfunction toWindowLevel(\n low: number,\n high: number\n): {\n windowWidth: number;\n windowCenter: number;\n} {\n // Allow for swapping high/low\n const windowWidth = Math.abs(high - low) + 1;\n const windowCenter = (low + high + 1) / 2;\n\n return { windowWidth, windowCenter };\n}\n\n/**\n * Given a window width and center, return the lower and upper bounds of the window\n * The formulas for the calculation are specified in\n * https://dicom.nema.org/medical/dicom/current/output/html/part03.html#sect_C.11.2.1.2.1\n * if (x <= c - 0.5 - (w-1) /2), then y = ymin\n * else if (x > c - 0.5 + (w-1) /2), then y = ymax\n * else y = ((x - (c - 0.5)) / (w-1) + 0.5) * (ymax- ymin) + ymin\n * @param windowWidth - the width of the window in HU\n * @param windowCenter - The center of the window.\n * @returns a JavaScript object with two properties: lower and upper.\n */\nfunction toLowHighRange(\n windowWidth: number,\n windowCenter: number\n): {\n lower: number;\n upper: number;\n} {\n const lower = windowCenter - 0.5 - (windowWidth - 1) / 2;\n const upper = windowCenter - 0.5 + (windowWidth - 1) / 2;\n\n return { lower, upper };\n}\n\nexport { toWindowLevel, toLowHighRange };\n","import { ColormapRegistration } from '../types';\n\nconst _colormaps = new Map();\n\n/**\n * Register a colormap\n * @param name - name of the colormap\n * @param colormap - colormap object\n */\nfunction registerColormap(colormap: ColormapRegistration) {\n _colormaps.set(colormap.Name, colormap);\n}\n\n/**\n * Get a colormap by name\n * @param name - name of the colormap\n * @returns colormap object\n */\nfunction getColormap(name) {\n return _colormaps.get(name);\n}\n\n/**\n * Get all registered colormap names\n * @returns array of colormap names\n *\n */\nfunction getColormapNames() {\n return Array.from(_colormaps.keys());\n}\n\nexport { getColormap, getColormapNames, registerColormap };\n","import cache, { Cache } from './cache';\nimport ImageVolume from './classes/ImageVolume';\n\nexport { ImageVolume, Cache };\nexport default cache;\n","var vtkColorMaps = [\n\t{\n\t\tName: \"KAAMS\",\n\t\tIndexedColors: [\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.63,\n\t\t\t0.63,\n\t\t\t1,\n\t\t\t0.67,\n\t\t\t0.5,\n\t\t\t0.33,\n\t\t\t1,\n\t\t\t0.5,\n\t\t\t0.75,\n\t\t\t0.53,\n\t\t\t0.35,\n\t\t\t0.7,\n\t\t\t1,\n\t\t\t0.75,\n\t\t\t0.5\n\t\t],\n\t\tAnnotations: [\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t1,\n\t\t\t2,\n\t\t\t2,\n\t\t\t3,\n\t\t\t3,\n\t\t\t4,\n\t\t\t4,\n\t\t\t5,\n\t\t\t5,\n\t\t\t6,\n\t\t\t6,\n\t\t\t7,\n\t\t\t7,\n\t\t\t8,\n\t\t\t8,\n\t\t\t9,\n\t\t\t9,\n\t\t\t10,\n\t\t\t10,\n\t\t\t11,\n\t\t\t11\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Diverging\",\n\t\tName: \"Cool to Warm\",\n\t\tNanColor: [\n\t\t\t1,\n\t\t\t1,\n\t\t\t0\n\t\t],\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t0.23137254902,\n\t\t\t0.298039215686,\n\t\t\t0.752941176471,\n\t\t\t0.5,\n\t\t\t0.865,\n\t\t\t0.865,\n\t\t\t0.865,\n\t\t\t1,\n\t\t\t0.705882352941,\n\t\t\t0.0156862745098,\n\t\t\t0.149019607843\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tCreator: \"Francesca Samsel\",\n\t\tName: \"Cool to Warm (Extended)\",\n\t\tNanColor: [\n\t\t\t0.25,\n\t\t\t0,\n\t\t\t0\n\t\t],\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0.34902,\n\t\t\t0.03125,\n\t\t\t0.039216,\n\t\t\t0.062745,\n\t\t\t0.380392,\n\t\t\t0.0625,\n\t\t\t0.062745,\n\t\t\t0.117647,\n\t\t\t0.411765,\n\t\t\t0.09375,\n\t\t\t0.090196,\n\t\t\t0.184314,\n\t\t\t0.45098,\n\t\t\t0.125,\n\t\t\t0.12549,\n\t\t\t0.262745,\n\t\t\t0.501961,\n\t\t\t0.15625,\n\t\t\t0.160784,\n\t\t\t0.337255,\n\t\t\t0.541176,\n\t\t\t0.1875,\n\t\t\t0.2,\n\t\t\t0.396078,\n\t\t\t0.568627,\n\t\t\t0.21875,\n\t\t\t0.239216,\n\t\t\t0.454902,\n\t\t\t0.6,\n\t\t\t0.25,\n\t\t\t0.286275,\n\t\t\t0.521569,\n\t\t\t0.65098,\n\t\t\t0.28125,\n\t\t\t0.337255,\n\t\t\t0.592157,\n\t\t\t0.701961,\n\t\t\t0.3125,\n\t\t\t0.388235,\n\t\t\t0.654902,\n\t\t\t0.74902,\n\t\t\t0.34375,\n\t\t\t0.466667,\n\t\t\t0.737255,\n\t\t\t0.819608,\n\t\t\t0.375,\n\t\t\t0.572549,\n\t\t\t0.819608,\n\t\t\t0.878431,\n\t\t\t0.40625,\n\t\t\t0.654902,\n\t\t\t0.866667,\n\t\t\t0.909804,\n\t\t\t0.4375,\n\t\t\t0.752941,\n\t\t\t0.917647,\n\t\t\t0.941176,\n\t\t\t0.46875,\n\t\t\t0.823529,\n\t\t\t0.956863,\n\t\t\t0.968627,\n\t\t\t0.5,\n\t\t\t0.988235,\n\t\t\t0.960784,\n\t\t\t0.901961,\n\t\t\t0.5,\n\t\t\t0.941176,\n\t\t\t0.984314,\n\t\t\t0.988235,\n\t\t\t0.52,\n\t\t\t0.988235,\n\t\t\t0.945098,\n\t\t\t0.85098,\n\t\t\t0.54,\n\t\t\t0.980392,\n\t\t\t0.898039,\n\t\t\t0.784314,\n\t\t\t0.5625,\n\t\t\t0.968627,\n\t\t\t0.835294,\n\t\t\t0.698039,\n\t\t\t0.59375,\n\t\t\t0.94902,\n\t\t\t0.733333,\n\t\t\t0.588235,\n\t\t\t0.625,\n\t\t\t0.929412,\n\t\t\t0.65098,\n\t\t\t0.509804,\n\t\t\t0.65625,\n\t\t\t0.909804,\n\t\t\t0.564706,\n\t\t\t0.435294,\n\t\t\t0.6875,\n\t\t\t0.878431,\n\t\t\t0.458824,\n\t\t\t0.352941,\n\t\t\t0.71875,\n\t\t\t0.839216,\n\t\t\t0.388235,\n\t\t\t0.286275,\n\t\t\t0.75,\n\t\t\t0.760784,\n\t\t\t0.294118,\n\t\t\t0.211765,\n\t\t\t0.78125,\n\t\t\t0.701961,\n\t\t\t0.211765,\n\t\t\t0.168627,\n\t\t\t0.8125,\n\t\t\t0.65098,\n\t\t\t0.156863,\n\t\t\t0.129412,\n\t\t\t0.84375,\n\t\t\t0.6,\n\t\t\t0.094118,\n\t\t\t0.094118,\n\t\t\t0.875,\n\t\t\t0.54902,\n\t\t\t0.066667,\n\t\t\t0.098039,\n\t\t\t0.90625,\n\t\t\t0.501961,\n\t\t\t0.05098,\n\t\t\t0.12549,\n\t\t\t0.9375,\n\t\t\t0.45098,\n\t\t\t0.054902,\n\t\t\t0.172549,\n\t\t\t0.96875,\n\t\t\t0.4,\n\t\t\t0.054902,\n\t\t\t0.192157,\n\t\t\t1,\n\t\t\t0.34902,\n\t\t\t0.070588,\n\t\t\t0.211765\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Diverging\",\n\t\tName: \"Warm to Cool\",\n\t\tNanColor: [\n\t\t\t1,\n\t\t\t1,\n\t\t\t0\n\t\t],\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t0.705882352941,\n\t\t\t0.0156862745098,\n\t\t\t0.149019607843,\n\t\t\t0.5,\n\t\t\t0.865,\n\t\t\t0.865,\n\t\t\t0.865,\n\t\t\t1,\n\t\t\t0.23137254902,\n\t\t\t0.298039215686,\n\t\t\t0.752941176471\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tCreator: \"Francesca Samsel\",\n\t\tName: \"Warm to Cool (Extended)\",\n\t\tNanColor: [\n\t\t\t0.250004,\n\t\t\t0,\n\t\t\t0\n\t\t],\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t0.34902,\n\t\t\t0,\n\t\t\t0.129412,\n\t\t\t0.025,\n\t\t\t0.4,\n\t\t\t0.00392157,\n\t\t\t0.101961,\n\t\t\t0.05,\n\t\t\t0.470588,\n\t\t\t0.0156863,\n\t\t\t0.0901961,\n\t\t\t0.075,\n\t\t\t0.54902,\n\t\t\t0.027451,\n\t\t\t0.0705882,\n\t\t\t0.1,\n\t\t\t0.619608,\n\t\t\t0.0627451,\n\t\t\t0.0431373,\n\t\t\t0.125,\n\t\t\t0.690196,\n\t\t\t0.12549,\n\t\t\t0.0627451,\n\t\t\t0.15,\n\t\t\t0.741176,\n\t\t\t0.184314,\n\t\t\t0.0745098,\n\t\t\t0.175,\n\t\t\t0.788235,\n\t\t\t0.266667,\n\t\t\t0.0941176,\n\t\t\t0.2,\n\t\t\t0.811765,\n\t\t\t0.345098,\n\t\t\t0.113725,\n\t\t\t0.225,\n\t\t\t0.831373,\n\t\t\t0.411765,\n\t\t\t0.133333,\n\t\t\t0.25,\n\t\t\t0.85098,\n\t\t\t0.47451,\n\t\t\t0.145098,\n\t\t\t0.275,\n\t\t\t0.870588,\n\t\t\t0.54902,\n\t\t\t0.156863,\n\t\t\t0.3,\n\t\t\t0.878431,\n\t\t\t0.619608,\n\t\t\t0.168627,\n\t\t\t0.325,\n\t\t\t0.890196,\n\t\t\t0.658824,\n\t\t\t0.196078,\n\t\t\t0.35,\n\t\t\t0.909804,\n\t\t\t0.717647,\n\t\t\t0.235294,\n\t\t\t0.375,\n\t\t\t0.929412,\n\t\t\t0.776471,\n\t\t\t0.278431,\n\t\t\t0.395522,\n\t\t\t0.94902,\n\t\t\t0.823529,\n\t\t\t0.321569,\n\t\t\t0.418905,\n\t\t\t0.968627,\n\t\t\t0.87451,\n\t\t\t0.407843,\n\t\t\t0.444278,\n\t\t\t0.980392,\n\t\t\t0.917647,\n\t\t\t0.509804,\n\t\t\t0.470149,\n\t\t\t0.988235,\n\t\t\t0.956863,\n\t\t\t0.643137,\n\t\t\t0.483582,\n\t\t\t0.992157,\n\t\t\t0.964706,\n\t\t\t0.713725,\n\t\t\t0.499,\n\t\t\t0.988235,\n\t\t\t0.980392,\n\t\t\t0.870588,\n\t\t\t0.5,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.501,\n\t\t\t0.913725,\n\t\t\t0.988235,\n\t\t\t0.937255,\n\t\t\t0.516418,\n\t\t\t0.827451,\n\t\t\t0.980392,\n\t\t\t0.886275,\n\t\t\t0.531343,\n\t\t\t0.764706,\n\t\t\t0.980392,\n\t\t\t0.866667,\n\t\t\t0.546766,\n\t\t\t0.658824,\n\t\t\t0.980392,\n\t\t\t0.843137,\n\t\t\t0.564179,\n\t\t\t0.572549,\n\t\t\t0.964706,\n\t\t\t0.835294,\n\t\t\t0.587562,\n\t\t\t0.423529,\n\t\t\t0.941176,\n\t\t\t0.87451,\n\t\t\t0.60597,\n\t\t\t0.262745,\n\t\t\t0.901961,\n\t\t\t0.862745,\n\t\t\t0.629851,\n\t\t\t0.0705882,\n\t\t\t0.854902,\n\t\t\t0.870588,\n\t\t\t0.651741,\n\t\t\t0.0509804,\n\t\t\t0.8,\n\t\t\t0.85098,\n\t\t\t0.681592,\n\t\t\t0.0235294,\n\t\t\t0.709804,\n\t\t\t0.831373,\n\t\t\t0.712935,\n\t\t\t0.0313725,\n\t\t\t0.615686,\n\t\t\t0.811765,\n\t\t\t0.75,\n\t\t\t0.0313725,\n\t\t\t0.537255,\n\t\t\t0.788235,\n\t\t\t0.775,\n\t\t\t0.0392157,\n\t\t\t0.466667,\n\t\t\t0.768627,\n\t\t\t0.8,\n\t\t\t0.0509804,\n\t\t\t0.396078,\n\t\t\t0.741176,\n\t\t\t0.825,\n\t\t\t0.054902,\n\t\t\t0.317647,\n\t\t\t0.709804,\n\t\t\t0.85,\n\t\t\t0.054902,\n\t\t\t0.243137,\n\t\t\t0.678431,\n\t\t\t0.875,\n\t\t\t0.0431373,\n\t\t\t0.164706,\n\t\t\t0.639216,\n\t\t\t0.9,\n\t\t\t0.0313725,\n\t\t\t0.0980392,\n\t\t\t0.6,\n\t\t\t0.925,\n\t\t\t0.0392157,\n\t\t\t0.0392157,\n\t\t\t0.560784,\n\t\t\t0.95,\n\t\t\t0.105882,\n\t\t\t0.0509804,\n\t\t\t0.509804,\n\t\t\t0.975,\n\t\t\t0.113725,\n\t\t\t0.0235294,\n\t\t\t0.45098,\n\t\t\t1,\n\t\t\t0.12549,\n\t\t\t0,\n\t\t\t0.380392\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"RGB\",\n\t\tName: \"Rainbow Desaturated\",\n\t\tNanColor: [\n\t\t\t1,\n\t\t\t1,\n\t\t\t0\n\t\t],\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t0.278431372549,\n\t\t\t0.278431372549,\n\t\t\t0.858823529412,\n\t\t\t0.143,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0.360784313725,\n\t\t\t0.285,\n\t\t\t0,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.429,\n\t\t\t0,\n\t\t\t0.501960784314,\n\t\t\t0,\n\t\t\t0.571,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0.714,\n\t\t\t1,\n\t\t\t0.380392156863,\n\t\t\t0,\n\t\t\t0.857,\n\t\t\t0.419607843137,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0.878431372549,\n\t\t\t0.301960784314,\n\t\t\t0.301960784314\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"RGB\",\n\t\tName: \"Cold and Hot\",\n\t\tNanColor: [\n\t\t\t1,\n\t\t\t1,\n\t\t\t0\n\t\t],\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.45,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0.5,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0.501960784314,\n\t\t\t0.55,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"RGB\",\n\t\tName: \"Black-Body Radiation\",\n\t\tNanColor: [\n\t\t\t0,\n\t\t\t0.498039215686,\n\t\t\t1\n\t\t],\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0.4,\n\t\t\t0.901960784314,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0.8,\n\t\t\t0.901960784314,\n\t\t\t0.901960784314,\n\t\t\t0,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"RGB\",\n\t\tName: \"X Ray\",\n\t\tNanColor: [\n\t\t\t1,\n\t\t\t0,\n\t\t\t0\n\t\t],\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"RGB\",\n\t\tName: \"Grayscale\",\n\t\tNanColor: [\n\t\t\t1,\n\t\t\t0,\n\t\t\t0\n\t\t],\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"RGB\",\n\t\tName: \"BkRd\",\n\t\tNanColor: [\n\t\t\t0,\n\t\t\t1,\n\t\t\t1\n\t\t],\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"RGB\",\n\t\tName: \"BkGn\",\n\t\tNanColor: [\n\t\t\t1,\n\t\t\t0,\n\t\t\t1\n\t\t],\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"RGB\",\n\t\tName: \"BkBu\",\n\t\tNanColor: [\n\t\t\t1,\n\t\t\t1,\n\t\t\t0\n\t\t],\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"RGB\",\n\t\tName: \"BkMa\",\n\t\tNanColor: [\n\t\t\t0,\n\t\t\t1,\n\t\t\t0\n\t\t],\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0,\n\t\t\t1\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"RGB\",\n\t\tName: \"BkCy\",\n\t\tNanColor: [\n\t\t\t0,\n\t\t\t1,\n\t\t\t1\n\t\t],\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0,\n\t\t\t1,\n\t\t\t1\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"RGB\",\n\t\tName: \"Black, Blue and White\",\n\t\tNanColor: [\n\t\t\t1,\n\t\t\t1,\n\t\t\t0\n\t\t],\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0.333,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0.501960784314,\n\t\t\t0.666,\n\t\t\t0,\n\t\t\t0.501960784314,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"RGB\",\n\t\tName: \"Black, Orange and White\",\n\t\tNanColor: [\n\t\t\t1,\n\t\t\t1,\n\t\t\t0\n\t\t],\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0.333,\n\t\t\t0.501960784314,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0.666,\n\t\t\t1,\n\t\t\t0.501960784314,\n\t\t\t0,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tCreator: \"Francesca Samsel\",\n\t\tName: \"Linear YGB 1211g\",\n\t\tNanColor: [\n\t\t\t0.25,\n\t\t\t0,\n\t\t\t0\n\t\t],\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t1,\n\t\t\t0.988235,\n\t\t\t0.968627,\n\t\t\t0.02,\n\t\t\t1,\n\t\t\t0.952941,\n\t\t\t0.878431,\n\t\t\t0.05,\n\t\t\t0.968627,\n\t\t\t0.905882,\n\t\t\t0.776471,\n\t\t\t0.1,\n\t\t\t0.94902,\n\t\t\t0.898039,\n\t\t\t0.647059,\n\t\t\t0.15,\n\t\t\t0.901961,\n\t\t\t0.878431,\n\t\t\t0.556863,\n\t\t\t0.2,\n\t\t\t0.847059,\n\t\t\t0.858824,\n\t\t\t0.482353,\n\t\t\t0.25,\n\t\t\t0.690196,\n\t\t\t0.819608,\n\t\t\t0.435294,\n\t\t\t0.3,\n\t\t\t0.513725,\n\t\t\t0.768627,\n\t\t\t0.384314,\n\t\t\t0.35,\n\t\t\t0.337255,\n\t\t\t0.721569,\n\t\t\t0.337255,\n\t\t\t0.4,\n\t\t\t0.278431,\n\t\t\t0.658824,\n\t\t\t0.392157,\n\t\t\t0.45,\n\t\t\t0.231373,\n\t\t\t0.639216,\n\t\t\t0.435294,\n\t\t\t0.5,\n\t\t\t0.203922,\n\t\t\t0.6,\n\t\t\t0.486275,\n\t\t\t0.55,\n\t\t\t0.172549,\n\t\t\t0.568627,\n\t\t\t0.537255,\n\t\t\t0.6,\n\t\t\t0.141176,\n\t\t\t0.517647,\n\t\t\t0.54902,\n\t\t\t0.65,\n\t\t\t0.133333,\n\t\t\t0.458824,\n\t\t\t0.541176,\n\t\t\t0.7,\n\t\t\t0.12549,\n\t\t\t0.396078,\n\t\t\t0.529412,\n\t\t\t0.75,\n\t\t\t0.117647,\n\t\t\t0.321569,\n\t\t\t0.521569,\n\t\t\t0.8,\n\t\t\t0.121569,\n\t\t\t0.258824,\n\t\t\t0.509804,\n\t\t\t0.85,\n\t\t\t0.133333,\n\t\t\t0.227451,\n\t\t\t0.501961,\n\t\t\t0.9,\n\t\t\t0.145098,\n\t\t\t0.192157,\n\t\t\t0.490196,\n\t\t\t0.95,\n\t\t\t0.188235,\n\t\t\t0.164706,\n\t\t\t0.470588,\n\t\t\t1,\n\t\t\t0.258824,\n\t\t\t0.196078,\n\t\t\t0.439216\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"CIELAB\",\n\t\tCreator: \"Francesca Samsel\",\n\t\tName: \"Linear Green (Gr4L)\",\n\t\tNanColor: [\n\t\t\t0.25,\n\t\t\t0,\n\t\t\t0\n\t\t],\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t0.054902,\n\t\t\t0.109804,\n\t\t\t0.121569,\n\t\t\t0.05,\n\t\t\t0.07451,\n\t\t\t0.172549,\n\t\t\t0.180392,\n\t\t\t0.1,\n\t\t\t0.086275,\n\t\t\t0.231373,\n\t\t\t0.219608,\n\t\t\t0.15,\n\t\t\t0.094118,\n\t\t\t0.278431,\n\t\t\t0.25098,\n\t\t\t0.2,\n\t\t\t0.109804,\n\t\t\t0.34902,\n\t\t\t0.278431,\n\t\t\t0.25,\n\t\t\t0.113725,\n\t\t\t0.4,\n\t\t\t0.278431,\n\t\t\t0.3,\n\t\t\t0.117647,\n\t\t\t0.45098,\n\t\t\t0.270588,\n\t\t\t0.35,\n\t\t\t0.117647,\n\t\t\t0.490196,\n\t\t\t0.243137,\n\t\t\t0.4,\n\t\t\t0.113725,\n\t\t\t0.521569,\n\t\t\t0.203922,\n\t\t\t0.45,\n\t\t\t0.109804,\n\t\t\t0.54902,\n\t\t\t0.152941,\n\t\t\t0.5,\n\t\t\t0.082353,\n\t\t\t0.588235,\n\t\t\t0.082353,\n\t\t\t0.55,\n\t\t\t0.109804,\n\t\t\t0.631373,\n\t\t\t0.05098,\n\t\t\t0.6,\n\t\t\t0.211765,\n\t\t\t0.678431,\n\t\t\t0.082353,\n\t\t\t0.65,\n\t\t\t0.317647,\n\t\t\t0.721569,\n\t\t\t0.113725,\n\t\t\t0.7,\n\t\t\t0.431373,\n\t\t\t0.760784,\n\t\t\t0.160784,\n\t\t\t0.75,\n\t\t\t0.556863,\n\t\t\t0.8,\n\t\t\t0.239216,\n\t\t\t0.8,\n\t\t\t0.666667,\n\t\t\t0.839216,\n\t\t\t0.294118,\n\t\t\t0.85,\n\t\t\t0.784314,\n\t\t\t0.878431,\n\t\t\t0.396078,\n\t\t\t0.9,\n\t\t\t0.886275,\n\t\t\t0.921569,\n\t\t\t0.533333,\n\t\t\t0.95,\n\t\t\t0.960784,\n\t\t\t0.94902,\n\t\t\t0.670588,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.984314,\n\t\t\t0.901961\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tCreator: \"Francesca Samsel\",\n\t\tName: \"Linear Blue (8_31f)\",\n\t\tNanColor: [\n\t\t\t0.25,\n\t\t\t0,\n\t\t\t0\n\t\t],\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t0.960784,\n\t\t\t1,\n\t\t\t0.980392,\n\t\t\t0.05,\n\t\t\t0.815686,\n\t\t\t0.960784,\n\t\t\t0.913725,\n\t\t\t0.1,\n\t\t\t0.670588,\n\t\t\t0.929412,\n\t\t\t0.870588,\n\t\t\t0.15,\n\t\t\t0.556863,\n\t\t\t0.901961,\n\t\t\t0.843137,\n\t\t\t0.2,\n\t\t\t0.478431,\n\t\t\t0.870588,\n\t\t\t0.823529,\n\t\t\t0.25,\n\t\t\t0.439216,\n\t\t\t0.831373,\n\t\t\t0.803922,\n\t\t\t0.3,\n\t\t\t0.4,\n\t\t\t0.8,\n\t\t\t0.788235,\n\t\t\t0.35,\n\t\t\t0.376471,\n\t\t\t0.768627,\n\t\t\t0.768627,\n\t\t\t0.4,\n\t\t\t0.34902,\n\t\t\t0.709804,\n\t\t\t0.729412,\n\t\t\t0.45,\n\t\t\t0.32549,\n\t\t\t0.654902,\n\t\t\t0.690196,\n\t\t\t0.5,\n\t\t\t0.301961,\n\t\t\t0.607843,\n\t\t\t0.658824,\n\t\t\t0.55,\n\t\t\t0.247059,\n\t\t\t0.545098,\n\t\t\t0.619608,\n\t\t\t0.6,\n\t\t\t0.239216,\n\t\t\t0.494118,\n\t\t\t0.580392,\n\t\t\t0.65,\n\t\t\t0.227451,\n\t\t\t0.439216,\n\t\t\t0.541176,\n\t\t\t0.7,\n\t\t\t0.227451,\n\t\t\t0.403922,\n\t\t\t0.521569,\n\t\t\t0.75,\n\t\t\t0.231373,\n\t\t\t0.368627,\n\t\t\t0.501961,\n\t\t\t0.8,\n\t\t\t0.227451,\n\t\t\t0.321569,\n\t\t\t0.470588,\n\t\t\t0.85,\n\t\t\t0.219608,\n\t\t\t0.282353,\n\t\t\t0.439216,\n\t\t\t0.9,\n\t\t\t0.192157,\n\t\t\t0.235294,\n\t\t\t0.4,\n\t\t\t0.95,\n\t\t\t0.160784,\n\t\t\t0.184314,\n\t\t\t0.34902,\n\t\t\t1,\n\t\t\t0.133333,\n\t\t\t0.12549,\n\t\t\t0.301961\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"HSV\",\n\t\tName: \"Blue to Red Rainbow\",\n\t\tNanColor: [\n\t\t\t0.498039215686,\n\t\t\t0.498039215686,\n\t\t\t0.498039215686\n\t\t],\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"HSV\",\n\t\tName: \"Red to Blue Rainbow\",\n\t\tNanColor: [\n\t\t\t0.498039215686,\n\t\t\t0.498039215686,\n\t\t\t0.498039215686\n\t\t],\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"RGB\",\n\t\tName: \"Rainbow Blended White\",\n\t\tNanColor: [\n\t\t\t1,\n\t\t\t1,\n\t\t\t0\n\t\t],\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.17,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0.34,\n\t\t\t0,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.5,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0.67,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0.84,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0.878431372549,\n\t\t\t0,\n\t\t\t1\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"RGB\",\n\t\tName: \"Rainbow Blended Grey\",\n\t\tNanColor: [\n\t\t\t1,\n\t\t\t1,\n\t\t\t0\n\t\t],\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t0.317647058824,\n\t\t\t0.341176470588,\n\t\t\t0.43137254902,\n\t\t\t0.17,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0.34,\n\t\t\t0,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.5,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0.67,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0.84,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0.878431372549,\n\t\t\t0,\n\t\t\t1\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"RGB\",\n\t\tName: \"Rainbow Blended Black\",\n\t\tNanColor: [\n\t\t\t1,\n\t\t\t1,\n\t\t\t0\n\t\t],\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0.17,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0.34,\n\t\t\t0,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.5,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0.67,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0.84,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0.878431372549,\n\t\t\t0,\n\t\t\t1\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"RGB\",\n\t\tName: \"Blue to Yellow\",\n\t\tNanColor: [\n\t\t\t1,\n\t\t\t0,\n\t\t\t0\n\t\t],\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t0.0392156862745,\n\t\t\t0.0392156862745,\n\t\t\t0.949019607843,\n\t\t\t1,\n\t\t\t0.949019607843,\n\t\t\t0.949019607843,\n\t\t\t0.0392156862745\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"HSV\",\n\t\tName: \"blot\",\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0.166,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0.167,\n\t\t\t1,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0.332,\n\t\t\t1,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0.333,\n\t\t\t0,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.5,\n\t\t\t0,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.501,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0.666,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0.667,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0.832,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0.833,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"CIELab Blue to Red\",\n\t\tNanColor: [\n\t\t\t1,\n\t\t\t1,\n\t\t\t0\n\t\t],\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t0,\n\t\t\t0.6,\n\t\t\t0.749019607843,\n\t\t\t1,\n\t\t\t0.76862745098,\n\t\t\t0.466666666667,\n\t\t\t0.341176470588\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"RGB\",\n\t\tName: \"jet\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0.5625,\n\t\t\t-0.777778,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t-0.269841,\n\t\t\t0,\n\t\t\t1,\n\t\t\t1,\n\t\t\t-0.015873,\n\t\t\t0.5,\n\t\t\t1,\n\t\t\t0.5,\n\t\t\t0.238095,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0.746032,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0.5,\n\t\t\t0,\n\t\t\t0\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"RGB\",\n\t\tName: \"rainbow\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t-0.5,\n\t\t\t0,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0.5,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"erdc_rainbow_bright\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.32549,\n\t\t\t0.14902,\n\t\t\t0.960784,\n\t\t\t-0.866221,\n\t\t\t0.297047,\n\t\t\t0.375586,\n\t\t\t0.963836,\n\t\t\t-0.732441,\n\t\t\t0.180302,\n\t\t\t0.536818,\n\t\t\t0.964627,\n\t\t\t-0.598662,\n\t\t\t0.1302,\n\t\t\t0.649207,\n\t\t\t0.929647,\n\t\t\t-0.464883,\n\t\t\t0.0445143,\n\t\t\t0.749654,\n\t\t\t0.855998,\n\t\t\t-0.331104,\n\t\t\t0.0271325,\n\t\t\t0.830713,\n\t\t\t0.721527,\n\t\t\t-0.197324,\n\t\t\t0.259504,\n\t\t\t0.866145,\n\t\t\t0.543555,\n\t\t\t-0.0635452,\n\t\t\t0.428364,\n\t\t\t0.890725,\n\t\t\t0.329819,\n\t\t\t0.0702341,\n\t\t\t0.568503,\n\t\t\t0.898508,\n\t\t\t0.187623,\n\t\t\t0.204013,\n\t\t\t0.738259,\n\t\t\t0.890317,\n\t\t\t0.0825461,\n\t\t\t0.337793,\n\t\t\t0.84546,\n\t\t\t0.86136,\n\t\t\t0.0147555,\n\t\t\t0.471572,\n\t\t\t0.912191,\n\t\t\t0.808018,\n\t\t\t0,\n\t\t\t0.605351,\n\t\t\t0.962848,\n\t\t\t0.710445,\n\t\t\t0,\n\t\t\t0.73913,\n\t\t\t0.999469,\n\t\t\t0.600258,\n\t\t\t0.0176284,\n\t\t\t0.87291,\n\t\t\t0.994156,\n\t\t\t0.445975,\n\t\t\t0.193912,\n\t\t\t1,\n\t\t\t0.980407,\n\t\t\t0.247105,\n\t\t\t0.262699\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"erdc_rainbow_dark\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0.423499,\n\t\t\t-0.866221,\n\t\t\t0,\n\t\t\t0.119346,\n\t\t\t0.529237,\n\t\t\t-0.732441,\n\t\t\t0,\n\t\t\t0.238691,\n\t\t\t0.634976,\n\t\t\t-0.598662,\n\t\t\t0,\n\t\t\t0.346852,\n\t\t\t0.68788,\n\t\t\t-0.464883,\n\t\t\t0,\n\t\t\t0.45022,\n\t\t\t0.718141,\n\t\t\t-0.331104,\n\t\t\t0,\n\t\t\t0.553554,\n\t\t\t0.664839,\n\t\t\t-0.197324,\n\t\t\t0,\n\t\t\t0.651082,\n\t\t\t0.519303,\n\t\t\t-0.0635452,\n\t\t\t0.115841,\n\t\t\t0.72479,\n\t\t\t0.352857,\n\t\t\t0.0702341,\n\t\t\t0.326771,\n\t\t\t0.781195,\n\t\t\t0.140187,\n\t\t\t0.204013,\n\t\t\t0.522765,\n\t\t\t0.798524,\n\t\t\t0.0284624,\n\t\t\t0.337793,\n\t\t\t0.703162,\n\t\t\t0.788685,\n\t\t\t0.00885756,\n\t\t\t0.471572,\n\t\t\t0.845118,\n\t\t\t0.751133,\n\t\t\t0,\n\t\t\t0.605351,\n\t\t\t0.955734,\n\t\t\t0.690825,\n\t\t\t0,\n\t\t\t0.73913,\n\t\t\t0.995402,\n\t\t\t0.567916,\n\t\t\t0.0618524,\n\t\t\t0.87291,\n\t\t\t0.987712,\n\t\t\t0.403398,\n\t\t\t0.164851,\n\t\t\t1,\n\t\t\t0.980407,\n\t\t\t0.247105,\n\t\t\t0.262699\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"nic_CubicL\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.479965,\n\t\t\t0.0118108,\n\t\t\t0.5307,\n\t\t\t-0.87451,\n\t\t\t0.522213,\n\t\t\t0.0551282,\n\t\t\t0.706919,\n\t\t\t-0.74902,\n\t\t\t0.50839,\n\t\t\t0.237278,\n\t\t\t0.867764,\n\t\t\t-0.623529,\n\t\t\t0.451617,\n\t\t\t0.373834,\n\t\t\t0.987255,\n\t\t\t-0.498039,\n\t\t\t0.39365,\n\t\t\t0.497255,\n\t\t\t0.97506,\n\t\t\t-0.372549,\n\t\t\t0.328631,\n\t\t\t0.599639,\n\t\t\t0.891843,\n\t\t\t-0.247059,\n\t\t\t0.250043,\n\t\t\t0.690286,\n\t\t\t0.778553,\n\t\t\t-0.121569,\n\t\t\t0.249656,\n\t\t\t0.764905,\n\t\t\t0.645857,\n\t\t\t0.00392157,\n\t\t\t0.297954,\n\t\t\t0.821466,\n\t\t\t0.50449,\n\t\t\t0.129412,\n\t\t\t0.337509,\n\t\t\t0.872595,\n\t\t\t0.358447,\n\t\t\t0.254902,\n\t\t\t0.430011,\n\t\t\t0.913789,\n\t\t\t0.297079,\n\t\t\t0.380392,\n\t\t\t0.587191,\n\t\t\t0.931381,\n\t\t\t0.333353,\n\t\t\t0.505882,\n\t\t\t0.727937,\n\t\t\t0.93591,\n\t\t\t0.353742,\n\t\t\t0.631373,\n\t\t\t0.826403,\n\t\t\t0.921081,\n\t\t\t0.365066,\n\t\t\t0.756863,\n\t\t\t0.893201,\n\t\t\t0.846317,\n\t\t\t0.372662,\n\t\t\t0.882353,\n\t\t\t0.965347,\n\t\t\t0.73884,\n\t\t\t0.378506,\n\t\t\t1,\n\t\t\t0.983235,\n\t\t\t0.597451,\n\t\t\t0.366856\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"nic_CubicYF\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.5151,\n\t\t\t0.0482,\n\t\t\t0.6697,\n\t\t\t-0.87451,\n\t\t\t0.520711,\n\t\t\t0.168955,\n\t\t\t0.800574,\n\t\t\t-0.74902,\n\t\t\t0.493694,\n\t\t\t0.278596,\n\t\t\t0.911824,\n\t\t\t-0.623529,\n\t\t\t0.440026,\n\t\t\t0.369475,\n\t\t\t0.984978,\n\t\t\t-0.498039,\n\t\t\t0.398932,\n\t\t\t0.457593,\n\t\t\t0.987053,\n\t\t\t-0.372549,\n\t\t\t0.350651,\n\t\t\t0.540644,\n\t\t\t0.929608,\n\t\t\t-0.247059,\n\t\t\t0.298827,\n\t\t\t0.615625,\n\t\t\t0.857729,\n\t\t\t-0.121569,\n\t\t\t0.239928,\n\t\t\t0.685061,\n\t\t\t0.769531,\n\t\t\t0.00392157,\n\t\t\t0.228832,\n\t\t\t0.739349,\n\t\t\t0.673287,\n\t\t\t0.129412,\n\t\t\t0.263297,\n\t\t\t0.78608,\n\t\t\t0.569988,\n\t\t\t0.254902,\n\t\t\t0.298107,\n\t\t\t0.828337,\n\t\t\t0.460214,\n\t\t\t0.380392,\n\t\t\t0.33092,\n\t\t\t0.864071,\n\t\t\t0.352674,\n\t\t\t0.505882,\n\t\t\t0.38306,\n\t\t\t0.898169,\n\t\t\t0.287309,\n\t\t\t0.631373,\n\t\t\t0.49023,\n\t\t\t0.917481,\n\t\t\t0.307961,\n\t\t\t0.756863,\n\t\t\t0.62372,\n\t\t\t0.926026,\n\t\t\t0.332309,\n\t\t\t0.882353,\n\t\t\t0.717458,\n\t\t\t0.92527,\n\t\t\t0.342476,\n\t\t\t1,\n\t\t\t0.8,\n\t\t\t0.9255,\n\t\t\t0.3529\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"gist_earth\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.87451,\n\t\t\t0.239216,\n\t\t\t0.027451,\n\t\t\t0.415686,\n\t\t\t-0.74902,\n\t\t\t0.0901961,\n\t\t\t0.254902,\n\t\t\t0.556863,\n\t\t\t-0.623529,\n\t\t\t0.0941176,\n\t\t\t0.352941,\n\t\t\t0.54902,\n\t\t\t-0.498039,\n\t\t\t0.105882,\n\t\t\t0.435294,\n\t\t\t0.533333,\n\t\t\t-0.372549,\n\t\t\t0.12549,\n\t\t\t0.52549,\n\t\t\t0.501961,\n\t\t\t-0.247059,\n\t\t\t0.156863,\n\t\t\t0.596078,\n\t\t\t0.443137,\n\t\t\t-0.121569,\n\t\t\t0.196078,\n\t\t\t0.65098,\n\t\t\t0.380392,\n\t\t\t0.00392157,\n\t\t\t0.282353,\n\t\t\t0.717647,\n\t\t\t0.301961,\n\t\t\t0.129412,\n\t\t\t0.466667,\n\t\t\t0.772549,\n\t\t\t0.27451,\n\t\t\t0.254902,\n\t\t\t0.678431,\n\t\t\t0.784314,\n\t\t\t0.309804,\n\t\t\t0.380392,\n\t\t\t0.901961,\n\t\t\t0.756863,\n\t\t\t0.376471,\n\t\t\t0.505882,\n\t\t\t0.992157,\n\t\t\t0.705882,\n\t\t\t0.521569,\n\t\t\t0.631373,\n\t\t\t1,\n\t\t\t0.721569,\n\t\t\t0.701961,\n\t\t\t0.756863,\n\t\t\t1,\n\t\t\t0.784314,\n\t\t\t0.784314,\n\t\t\t0.882353,\n\t\t\t1,\n\t\t\t0.866667,\n\t\t\t0.866667,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"2hot\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.0416667,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.873016,\n\t\t\t0.208333,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.746032,\n\t\t\t0.375,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.619048,\n\t\t\t0.541667,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.492063,\n\t\t\t0.708333,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.365079,\n\t\t\t0.854137,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.238095,\n\t\t\t0.937488,\n\t\t\t0.039062,\n\t\t\t0,\n\t\t\t-0.111111,\n\t\t\t1,\n\t\t\t0.208333,\n\t\t\t0,\n\t\t\t0.015873,\n\t\t\t1,\n\t\t\t0.375,\n\t\t\t0,\n\t\t\t0.142857,\n\t\t\t1,\n\t\t\t0.541667,\n\t\t\t0,\n\t\t\t0.269841,\n\t\t\t1,\n\t\t\t0.708333,\n\t\t\t0,\n\t\t\t0.396825,\n\t\t\t1,\n\t\t\t0.858805,\n\t\t\t0.03125,\n\t\t\t0.52381,\n\t\t\t1,\n\t\t\t0.947392,\n\t\t\t0.15625,\n\t\t\t0.650794,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.3125,\n\t\t\t0.777778,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.5625,\n\t\t\t0.904762,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.8125,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"erdc_red2yellow_BW\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t7.54296e-7,\n\t\t\t0,\n\t\t\t0.0000109827,\n\t\t\t-0.87451,\n\t\t\t0.18285,\n\t\t\t0.0264094,\n\t\t\t0,\n\t\t\t-0.74902,\n\t\t\t0.3066,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.623529,\n\t\t\t0.422841,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.498039,\n\t\t\t0.522945,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.372549,\n\t\t\t0.605721,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.247059,\n\t\t\t0.672502,\n\t\t\t0.14168,\n\t\t\t0,\n\t\t\t-0.121569,\n\t\t\t0.728167,\n\t\t\t0.244025,\n\t\t\t0,\n\t\t\t0.00392157,\n\t\t\t0.781215,\n\t\t\t0.333454,\n\t\t\t0,\n\t\t\t0.129412,\n\t\t\t0.825,\n\t\t\t0.423586,\n\t\t\t0,\n\t\t\t0.254902,\n\t\t\t0.855893,\n\t\t\t0.516793,\n\t\t\t0,\n\t\t\t0.380392,\n\t\t\t0.880491,\n\t\t\t0.608846,\n\t\t\t0,\n\t\t\t0.505882,\n\t\t\t0.910305,\n\t\t\t0.695505,\n\t\t\t0,\n\t\t\t0.631373,\n\t\t\t0.94109,\n\t\t\t0.779067,\n\t\t\t0.223528,\n\t\t\t0.756863,\n\t\t\t0.967873,\n\t\t\t0.858572,\n\t\t\t0.473521,\n\t\t\t0.882353,\n\t\t\t0.986815,\n\t\t\t0.933211,\n\t\t\t0.751583,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.999997\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"erdc_marine2gold_BW\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t1.11641e-7,\n\t\t\t0,\n\t\t\t0.00000162551,\n\t\t\t-0.87451,\n\t\t\t0.0413146,\n\t\t\t0.0619808,\n\t\t\t0.209857,\n\t\t\t-0.74902,\n\t\t\t0.0185557,\n\t\t\t0.101341,\n\t\t\t0.350684,\n\t\t\t-0.623529,\n\t\t\t0.00486405,\n\t\t\t0.149847,\n\t\t\t0.461054,\n\t\t\t-0.498039,\n\t\t\t0.0836345,\n\t\t\t0.210845,\n\t\t\t0.517906,\n\t\t\t-0.372549,\n\t\t\t0.173222,\n\t\t\t0.276134,\n\t\t\t0.541793,\n\t\t\t-0.247059,\n\t\t\t0.259857,\n\t\t\t0.343877,\n\t\t\t0.535869,\n\t\t\t-0.121569,\n\t\t\t0.362299,\n\t\t\t0.408124,\n\t\t\t0.504293,\n\t\t\t0.00392157,\n\t\t\t0.468266,\n\t\t\t0.468276,\n\t\t\t0.468257,\n\t\t\t0.129412,\n\t\t\t0.582781,\n\t\t\t0.527545,\n\t\t\t0.374914,\n\t\t\t0.254902,\n\t\t\t0.691591,\n\t\t\t0.585251,\n\t\t\t0.274266,\n\t\t\t0.380392,\n\t\t\t0.784454,\n\t\t\t0.645091,\n\t\t\t0.247332,\n\t\t\t0.505882,\n\t\t\t0.862299,\n\t\t\t0.710383,\n\t\t\t0.27518,\n\t\t\t0.631373,\n\t\t\t0.920863,\n\t\t\t0.782923,\n\t\t\t0.351563,\n\t\t\t0.756863,\n\t\t\t0.955792,\n\t\t\t0.859699,\n\t\t\t0.533541,\n\t\t\t0.882353,\n\t\t\t0.976162,\n\t\t\t0.93433,\n\t\t\t0.780671,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.999983\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"erdc_blue2gold_BW\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.87451,\n\t\t\t0.0742735,\n\t\t\t0.0440331,\n\t\t\t0.230013,\n\t\t\t-0.74902,\n\t\t\t0.125276,\n\t\t\t0.0258685,\n\t\t\t0.415826,\n\t\t\t-0.623529,\n\t\t\t0.143879,\n\t\t\t0.0163031,\n\t\t\t0.591346,\n\t\t\t-0.498039,\n\t\t\t0.212261,\n\t\t\t0.0627855,\n\t\t\t0.705239,\n\t\t\t-0.372549,\n\t\t\t0.306048,\n\t\t\t0.141178,\n\t\t\t0.763636,\n\t\t\t-0.247059,\n\t\t\t0.391537,\n\t\t\t0.232286,\n\t\t\t0.773263,\n\t\t\t-0.121569,\n\t\t\t0.461734,\n\t\t\t0.336633,\n\t\t\t0.708321,\n\t\t\t0.00392157,\n\t\t\t0.54209,\n\t\t\t0.427581,\n\t\t\t0.590007,\n\t\t\t0.129412,\n\t\t\t0.61704,\n\t\t\t0.508623,\n\t\t\t0.460978,\n\t\t\t0.254902,\n\t\t\t0.702703,\n\t\t\t0.579586,\n\t\t\t0.309117,\n\t\t\t0.380392,\n\t\t\t0.790336,\n\t\t\t0.644811,\n\t\t\t0.170397,\n\t\t\t0.505882,\n\t\t\t0.870173,\n\t\t\t0.710733,\n\t\t\t0.117134,\n\t\t\t0.631373,\n\t\t\t0.93656,\n\t\t\t0.781991,\n\t\t\t0.157144,\n\t\t\t0.756863,\n\t\t\t0.965672,\n\t\t\t0.862068,\n\t\t\t0.409836,\n\t\t\t0.882353,\n\t\t\t0.985751,\n\t\t\t0.936296,\n\t\t\t0.714162,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.999999\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"erdc_sapphire2gold_BW\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.107704,\n\t\t\t0.107708,\n\t\t\t0.107694,\n\t\t\t-0.87451,\n\t\t\t0.1851,\n\t\t\t0.112354,\n\t\t\t0.308554,\n\t\t\t-0.74902,\n\t\t\t0.236782,\n\t\t\t0.114233,\n\t\t\t0.48788,\n\t\t\t-0.623529,\n\t\t\t0.28296,\n\t\t\t0.126187,\n\t\t\t0.639464,\n\t\t\t-0.498039,\n\t\t\t0.344787,\n\t\t\t0.171643,\n\t\t\t0.739713,\n\t\t\t-0.372549,\n\t\t\t0.413325,\n\t\t\t0.242371,\n\t\t\t0.76913,\n\t\t\t-0.247059,\n\t\t\t0.481863,\n\t\t\t0.3131,\n\t\t\t0.719841,\n\t\t\t-0.121569,\n\t\t\t0.550402,\n\t\t\t0.383829,\n\t\t\t0.612222,\n\t\t\t0.00392157,\n\t\t\t0.61894,\n\t\t\t0.454558,\n\t\t\t0.51126,\n\t\t\t0.129412,\n\t\t\t0.687478,\n\t\t\t0.525287,\n\t\t\t0.39993,\n\t\t\t0.254902,\n\t\t\t0.756017,\n\t\t\t0.596016,\n\t\t\t0.289923,\n\t\t\t0.380392,\n\t\t\t0.824555,\n\t\t\t0.666745,\n\t\t\t0.255498,\n\t\t\t0.505882,\n\t\t\t0.892979,\n\t\t\t0.736822,\n\t\t\t0.27696,\n\t\t\t0.631373,\n\t\t\t0.938851,\n\t\t\t0.804966,\n\t\t\t0.351734,\n\t\t\t0.756863,\n\t\t\t0.966491,\n\t\t\t0.874853,\n\t\t\t0.53572,\n\t\t\t0.882353,\n\t\t\t0.982105,\n\t\t\t0.94153,\n\t\t\t0.782579,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.999986\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"erdc_red2purple_BW\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.87451,\n\t\t\t0.167793,\n\t\t\t0.0166271,\n\t\t\t0.0431278,\n\t\t\t-0.74902,\n\t\t\t0.262608,\n\t\t\t0.0107595,\n\t\t\t0.0791181,\n\t\t\t-0.623529,\n\t\t\t0.351902,\n\t\t\t0.0101858,\n\t\t\t0.100926,\n\t\t\t-0.498039,\n\t\t\t0.441257,\n\t\t\t0.0160835,\n\t\t\t0.131919,\n\t\t\t-0.372549,\n\t\t\t0.5221,\n\t\t\t0.0555972,\n\t\t\t0.195625,\n\t\t\t-0.247059,\n\t\t\t0.593852,\n\t\t\t0.104294,\n\t\t\t0.310234,\n\t\t\t-0.121569,\n\t\t\t0.654628,\n\t\t\t0.158115,\n\t\t\t0.448486,\n\t\t\t0.00392157,\n\t\t\t0.707443,\n\t\t\t0.220914,\n\t\t\t0.570253,\n\t\t\t0.129412,\n\t\t\t0.749504,\n\t\t\t0.293268,\n\t\t\t0.67897,\n\t\t\t0.254902,\n\t\t\t0.781587,\n\t\t\t0.370517,\n\t\t\t0.779269,\n\t\t\t0.380392,\n\t\t\t0.809951,\n\t\t\t0.451099,\n\t\t\t0.855831,\n\t\t\t0.505882,\n\t\t\t0.84424,\n\t\t\t0.531462,\n\t\t\t0.900451,\n\t\t\t0.631373,\n\t\t\t0.865174,\n\t\t\t0.620901,\n\t\t\t0.91606,\n\t\t\t0.756863,\n\t\t\t0.875041,\n\t\t\t0.714054,\n\t\t\t0.910284,\n\t\t\t0.882353,\n\t\t\t0.880764,\n\t\t\t0.80554,\n\t\t\t0.896276,\n\t\t\t1,\n\t\t\t0.887572,\n\t\t\t0.887591,\n\t\t\t0.887556\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"erdc_purple2pink_BW\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.87451,\n\t\t\t0.117562,\n\t\t\t0.0291202,\n\t\t\t0.175876,\n\t\t\t-0.74902,\n\t\t\t0.178368,\n\t\t\t0.0458476,\n\t\t\t0.285454,\n\t\t\t-0.623529,\n\t\t\t0.237731,\n\t\t\t0.0680173,\n\t\t\t0.387717,\n\t\t\t-0.498039,\n\t\t\t0.300877,\n\t\t\t0.0956291,\n\t\t\t0.484802,\n\t\t\t-0.372549,\n\t\t\t0.370929,\n\t\t\t0.136858,\n\t\t\t0.554985,\n\t\t\t-0.247059,\n\t\t\t0.449033,\n\t\t\t0.189273,\n\t\t\t0.58863,\n\t\t\t-0.121569,\n\t\t\t0.529971,\n\t\t\t0.245796,\n\t\t\t0.598587,\n\t\t\t0.00392157,\n\t\t\t0.609914,\n\t\t\t0.300643,\n\t\t\t0.610244,\n\t\t\t0.129412,\n\t\t\t0.697079,\n\t\t\t0.351286,\n\t\t\t0.616371,\n\t\t\t0.254902,\n\t\t\t0.785858,\n\t\t\t0.401991,\n\t\t\t0.617376,\n\t\t\t0.380392,\n\t\t\t0.862517,\n\t\t\t0.45745,\n\t\t\t0.64463,\n\t\t\t0.505882,\n\t\t\t0.91359,\n\t\t\t0.525462,\n\t\t\t0.705336,\n\t\t\t0.631373,\n\t\t\t0.932583,\n\t\t\t0.61064,\n\t\t\t0.767412,\n\t\t\t0.756863,\n\t\t\t0.922478,\n\t\t\t0.706966,\n\t\t\t0.817522,\n\t\t\t0.882353,\n\t\t\t0.901302,\n\t\t\t0.803071,\n\t\t\t0.856311,\n\t\t\t1,\n\t\t\t0.887571,\n\t\t\t0.887591,\n\t\t\t0.887549\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"erdc_pbj_lin\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.87451,\n\t\t\t0.091821,\n\t\t\t0.0611476,\n\t\t\t0.10617,\n\t\t\t-0.74902,\n\t\t\t0.160311,\n\t\t\t0.0900022,\n\t\t\t0.192713,\n\t\t\t-0.623529,\n\t\t\t0.22484,\n\t\t\t0.12126,\n\t\t\t0.272128,\n\t\t\t-0.498039,\n\t\t\t0.291263,\n\t\t\t0.157469,\n\t\t\t0.340828,\n\t\t\t-0.372549,\n\t\t\t0.360015,\n\t\t\t0.200388,\n\t\t\t0.388903,\n\t\t\t-0.247059,\n\t\t\t0.437497,\n\t\t\t0.250058,\n\t\t\t0.387201,\n\t\t\t-0.121569,\n\t\t\t0.512636,\n\t\t\t0.304969,\n\t\t\t0.355955,\n\t\t\t0.00392157,\n\t\t\t0.582603,\n\t\t\t0.360874,\n\t\t\t0.33488,\n\t\t\t0.129412,\n\t\t\t0.655126,\n\t\t\t0.416374,\n\t\t\t0.306351,\n\t\t\t0.254902,\n\t\t\t0.725889,\n\t\t\t0.473329,\n\t\t\t0.279051,\n\t\t\t0.380392,\n\t\t\t0.778125,\n\t\t\t0.537928,\n\t\t\t0.302697,\n\t\t\t0.505882,\n\t\t\t0.815894,\n\t\t\t0.606931,\n\t\t\t0.382431,\n\t\t\t0.631373,\n\t\t\t0.839159,\n\t\t\t0.679308,\n\t\t\t0.497608,\n\t\t\t0.756863,\n\t\t\t0.854748,\n\t\t\t0.751666,\n\t\t\t0.631792,\n\t\t\t0.882353,\n\t\t\t0.869483,\n\t\t\t0.822508,\n\t\t\t0.768592,\n\t\t\t1,\n\t\t\t0.887572,\n\t\t\t0.887589,\n\t\t\t0.887565\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"erdc_blue2green_muted\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.107704,\n\t\t\t0.107708,\n\t\t\t0.107695,\n\t\t\t-0.87451,\n\t\t\t0.141522,\n\t\t\t0.13066,\n\t\t\t0.270741,\n\t\t\t-0.74902,\n\t\t\t0.180123,\n\t\t\t0.146119,\n\t\t\t0.42308,\n\t\t\t-0.623529,\n\t\t\t0.210161,\n\t\t\t0.169674,\n\t\t\t0.551795,\n\t\t\t-0.498039,\n\t\t\t0.239701,\n\t\t\t0.212939,\n\t\t\t0.634969,\n\t\t\t-0.372549,\n\t\t\t0.253916,\n\t\t\t0.282947,\n\t\t\t0.653641,\n\t\t\t-0.247059,\n\t\t\t0.242791,\n\t\t\t0.366933,\n\t\t\t0.608521,\n\t\t\t-0.121569,\n\t\t\t0.226302,\n\t\t\t0.446776,\n\t\t\t0.52693,\n\t\t\t0.00392157,\n\t\t\t0.236237,\n\t\t\t0.514689,\n\t\t\t0.458798,\n\t\t\t0.129412,\n\t\t\t0.274641,\n\t\t\t0.577589,\n\t\t\t0.376069,\n\t\t\t0.254902,\n\t\t\t0.349625,\n\t\t\t0.633993,\n\t\t\t0.288131,\n\t\t\t0.380392,\n\t\t\t0.4437,\n\t\t\t0.683677,\n\t\t\t0.260497,\n\t\t\t0.505882,\n\t\t\t0.536247,\n\t\t\t0.731214,\n\t\t\t0.285424,\n\t\t\t0.631373,\n\t\t\t0.628472,\n\t\t\t0.777128,\n\t\t\t0.349151,\n\t\t\t0.756863,\n\t\t\t0.718259,\n\t\t\t0.819287,\n\t\t\t0.496825,\n\t\t\t0.882353,\n\t\t\t0.804768,\n\t\t\t0.856164,\n\t\t\t0.703299,\n\t\t\t1,\n\t\t\t0.887571,\n\t\t\t0.887591,\n\t\t\t0.887548\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"erdc_blue2green_BW\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t3.63578e-7,\n\t\t\t0,\n\t\t\t0.00000529374,\n\t\t\t-0.87451,\n\t\t\t0.0539915,\n\t\t\t0.0577948,\n\t\t\t0.212806,\n\t\t\t-0.74902,\n\t\t\t0.0620393,\n\t\t\t0.0758942,\n\t\t\t0.388959,\n\t\t\t-0.623529,\n\t\t\t0.0697499,\n\t\t\t0.102032,\n\t\t\t0.54177,\n\t\t\t-0.498039,\n\t\t\t0.113295,\n\t\t\t0.156156,\n\t\t\t0.64334,\n\t\t\t-0.372549,\n\t\t\t0.152047,\n\t\t\t0.243196,\n\t\t\t0.670283,\n\t\t\t-0.247059,\n\t\t\t0.158096,\n\t\t\t0.344084,\n\t\t\t0.622864,\n\t\t\t-0.121569,\n\t\t\t0.151142,\n\t\t\t0.43922,\n\t\t\t0.532767,\n\t\t\t0.00392157,\n\t\t\t0.17155,\n\t\t\t0.521588,\n\t\t\t0.457719,\n\t\t\t0.129412,\n\t\t\t0.225861,\n\t\t\t0.599141,\n\t\t\t0.363997,\n\t\t\t0.254902,\n\t\t\t0.32328,\n\t\t\t0.67007,\n\t\t\t0.259083,\n\t\t\t0.380392,\n\t\t\t0.442344,\n\t\t\t0.733697,\n\t\t\t0.223754,\n\t\t\t0.505882,\n\t\t\t0.558409,\n\t\t\t0.794941,\n\t\t\t0.257411,\n\t\t\t0.631373,\n\t\t\t0.673875,\n\t\t\t0.854344,\n\t\t\t0.340822,\n\t\t\t0.756863,\n\t\t\t0.787244,\n\t\t\t0.909326,\n\t\t\t0.524717,\n\t\t\t0.882353,\n\t\t\t0.896483,\n\t\t\t0.958063,\n\t\t\t0.775914,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.999982\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"GREEN-WHITE_LINEAR\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.87451,\n\t\t\t0,\n\t\t\t0.062745,\n\t\t\t0,\n\t\t\t-0.74902,\n\t\t\t0,\n\t\t\t0.12549,\n\t\t\t0,\n\t\t\t-0.623529,\n\t\t\t0,\n\t\t\t0.188235,\n\t\t\t0,\n\t\t\t-0.498039,\n\t\t\t0,\n\t\t\t0.25098,\n\t\t\t0,\n\t\t\t-0.372549,\n\t\t\t0,\n\t\t\t0.313725,\n\t\t\t0,\n\t\t\t-0.247059,\n\t\t\t0,\n\t\t\t0.376471,\n\t\t\t0,\n\t\t\t-0.121569,\n\t\t\t0.094118,\n\t\t\t0.439216,\n\t\t\t0,\n\t\t\t0.00392157,\n\t\t\t0.196078,\n\t\t\t0.501961,\n\t\t\t0,\n\t\t\t0.129412,\n\t\t\t0.294118,\n\t\t\t0.564706,\n\t\t\t0,\n\t\t\t0.254902,\n\t\t\t0.396078,\n\t\t\t0.627451,\n\t\t\t0,\n\t\t\t0.380392,\n\t\t\t0.498039,\n\t\t\t0.690196,\n\t\t\t0,\n\t\t\t0.505882,\n\t\t\t0.6,\n\t\t\t0.752941,\n\t\t\t0.145098,\n\t\t\t0.631373,\n\t\t\t0.701961,\n\t\t\t0.815686,\n\t\t\t0.364706,\n\t\t\t0.756863,\n\t\t\t0.8,\n\t\t\t0.878431,\n\t\t\t0.580392,\n\t\t\t0.882353,\n\t\t\t0.901961,\n\t\t\t0.941176,\n\t\t\t0.796078,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"erdc_green2yellow_BW\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.87451,\n\t\t\t0,\n\t\t\t0.105542,\n\t\t\t0.0603919,\n\t\t\t-0.74902,\n\t\t\t0,\n\t\t\t0.159454,\n\t\t\t0.104148,\n\t\t\t-0.623529,\n\t\t\t0,\n\t\t\t0.219502,\n\t\t\t0.15542,\n\t\t\t-0.498039,\n\t\t\t0,\n\t\t\t0.282276,\n\t\t\t0.203811,\n\t\t\t-0.372549,\n\t\t\t0,\n\t\t\t0.346331,\n\t\t\t0.235652,\n\t\t\t-0.247059,\n\t\t\t0,\n\t\t\t0.411765,\n\t\t\t0.235428,\n\t\t\t-0.121569,\n\t\t\t0,\n\t\t\t0.477177,\n\t\t\t0.217977,\n\t\t\t0.00392157,\n\t\t\t0.0593644,\n\t\t\t0.541635,\n\t\t\t0.21361,\n\t\t\t0.129412,\n\t\t\t0.233081,\n\t\t\t0.604722,\n\t\t\t0.210591,\n\t\t\t0.254902,\n\t\t\t0.369803,\n\t\t\t0.664942,\n\t\t\t0.226536,\n\t\t\t0.380392,\n\t\t\t0.498446,\n\t\t\t0.722367,\n\t\t\t0.288237,\n\t\t\t0.505882,\n\t\t\t0.601929,\n\t\t\t0.782244,\n\t\t\t0.380815,\n\t\t\t0.631373,\n\t\t\t0.703207,\n\t\t\t0.840497,\n\t\t\t0.512134,\n\t\t\t0.756863,\n\t\t\t0.803186,\n\t\t\t0.896433,\n\t\t\t0.674462,\n\t\t\t0.882353,\n\t\t\t0.903834,\n\t\t\t0.950266,\n\t\t\t0.846715,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.999981\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"blue2cyan\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.87451,\n\t\t\t0,\n\t\t\t0.152941,\n\t\t\t0.364706,\n\t\t\t-0.74902,\n\t\t\t0,\n\t\t\t0.254902,\n\t\t\t0.470588,\n\t\t\t-0.623529,\n\t\t\t0,\n\t\t\t0.34902,\n\t\t\t0.572549,\n\t\t\t-0.498039,\n\t\t\t0,\n\t\t\t0.443137,\n\t\t\t0.670588,\n\t\t\t-0.372549,\n\t\t\t0,\n\t\t\t0.537255,\n\t\t\t0.772549,\n\t\t\t-0.247059,\n\t\t\t0,\n\t\t\t0.627451,\n\t\t\t0.870588,\n\t\t\t-0.121569,\n\t\t\t0,\n\t\t\t0.717647,\n\t\t\t0.964706,\n\t\t\t0.00392157,\n\t\t\t0.0784314,\n\t\t\t0.772549,\n\t\t\t1,\n\t\t\t0.129412,\n\t\t\t0.207843,\n\t\t\t0.858824,\n\t\t\t1,\n\t\t\t0.254902,\n\t\t\t0.32549,\n\t\t\t0.941176,\n\t\t\t1,\n\t\t\t0.380392,\n\t\t\t0.45098,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.505882,\n\t\t\t0.560784,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.631373,\n\t\t\t0.662745,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.756863,\n\t\t\t0.760784,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.882353,\n\t\t\t0.870588,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"erdc_blue2cyan_BW\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t4.05298e-7,\n\t\t\t0,\n\t\t\t0.0000059012,\n\t\t\t-0.87451,\n\t\t\t0.0207526,\n\t\t\t0.0740933,\n\t\t\t0.18093,\n\t\t\t-0.74902,\n\t\t\t0,\n\t\t\t0.121033,\n\t\t\t0.30343,\n\t\t\t-0.623529,\n\t\t\t0,\n\t\t\t0.166892,\n\t\t\t0.416095,\n\t\t\t-0.498039,\n\t\t\t0,\n\t\t\t0.216768,\n\t\t\t0.524796,\n\t\t\t-0.372549,\n\t\t\t0.0164769,\n\t\t\t0.275471,\n\t\t\t0.608585,\n\t\t\t-0.247059,\n\t\t\t0.0544527,\n\t\t\t0.344824,\n\t\t\t0.659267,\n\t\t\t-0.121569,\n\t\t\t0.0880643,\n\t\t\t0.419118,\n\t\t\t0.688675,\n\t\t\t0.00392157,\n\t\t\t0.127938,\n\t\t\t0.492556,\n\t\t\t0.720256,\n\t\t\t0.129412,\n\t\t\t0.149476,\n\t\t\t0.566946,\n\t\t\t0.756918,\n\t\t\t0.254902,\n\t\t\t0.188961,\n\t\t\t0.641333,\n\t\t\t0.792122,\n\t\t\t0.380392,\n\t\t\t0.245482,\n\t\t\t0.715336,\n\t\t\t0.827609,\n\t\t\t0.505882,\n\t\t\t0.329216,\n\t\t\t0.786235,\n\t\t\t0.874761,\n\t\t\t0.631373,\n\t\t\t0.453558,\n\t\t\t0.852803,\n\t\t\t0.918466,\n\t\t\t0.756863,\n\t\t\t0.626281,\n\t\t\t0.910493,\n\t\t\t0.954,\n\t\t\t0.882353,\n\t\t\t0.82257,\n\t\t\t0.958709,\n\t\t\t0.980146,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.999989\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"erdc_blue_BW\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.87451,\n\t\t\t0.0425591,\n\t\t\t0.0763529,\n\t\t\t0.150682,\n\t\t\t-0.74902,\n\t\t\t0.0569472,\n\t\t\t0.119154,\n\t\t\t0.275403,\n\t\t\t-0.623529,\n\t\t\t0.0635978,\n\t\t\t0.164772,\n\t\t\t0.395427,\n\t\t\t-0.498039,\n\t\t\t0.0774342,\n\t\t\t0.213851,\n\t\t\t0.510014,\n\t\t\t-0.372549,\n\t\t\t0.106815,\n\t\t\t0.267034,\n\t\t\t0.615102,\n\t\t\t-0.247059,\n\t\t\t0.122093,\n\t\t\t0.324649,\n\t\t\t0.720068,\n\t\t\t-0.121569,\n\t\t\t0.160851,\n\t\t\t0.387068,\n\t\t\t0.806956,\n\t\t\t0.00392157,\n\t\t\t0.213754,\n\t\t\t0.453516,\n\t\t\t0.878012,\n\t\t\t0.129412,\n\t\t\t0.26722,\n\t\t\t0.524656,\n\t\t\t0.932436,\n\t\t\t0.254902,\n\t\t\t0.326844,\n\t\t\t0.599279,\n\t\t\t0.968038,\n\t\t\t0.380392,\n\t\t\t0.403403,\n\t\t\t0.674712,\n\t\t\t0.984784,\n\t\t\t0.505882,\n\t\t\t0.499703,\n\t\t\t0.745519,\n\t\t\t1,\n\t\t\t0.631373,\n\t\t\t0.615055,\n\t\t\t0.813983,\n\t\t\t1,\n\t\t\t0.756863,\n\t\t\t0.74405,\n\t\t\t0.879228,\n\t\t\t1,\n\t\t\t0.882353,\n\t\t\t0.877909,\n\t\t\t0.941913,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.999996\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"BLUE-WHITE\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.87451,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0.082353,\n\t\t\t-0.74902,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0.168627,\n\t\t\t-0.623529,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0.254902,\n\t\t\t-0.498039,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0.337255,\n\t\t\t-0.372549,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0.423529,\n\t\t\t-0.247059,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0.509804,\n\t\t\t-0.121569,\n\t\t\t0,\n\t\t\t0.101961,\n\t\t\t0.592157,\n\t\t\t0.00392157,\n\t\t\t0,\n\t\t\t0.203922,\n\t\t\t0.678431,\n\t\t\t0.129412,\n\t\t\t0,\n\t\t\t0.301961,\n\t\t\t0.764706,\n\t\t\t0.254902,\n\t\t\t0,\n\t\t\t0.403922,\n\t\t\t0.85098,\n\t\t\t0.380392,\n\t\t\t0,\n\t\t\t0.505882,\n\t\t\t0.933333,\n\t\t\t0.505882,\n\t\t\t0,\n\t\t\t0.603922,\n\t\t\t1,\n\t\t\t0.631373,\n\t\t\t0.254902,\n\t\t\t0.705882,\n\t\t\t1,\n\t\t\t0.756863,\n\t\t\t0.509804,\n\t\t\t0.807843,\n\t\t\t1,\n\t\t\t0.882353,\n\t\t\t0.764706,\n\t\t\t0.905882,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"erdc_purple_BW\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t4.264e-8,\n\t\t\t0,\n\t\t\t6.20844e-7,\n\t\t\t-0.87451,\n\t\t\t0.100579,\n\t\t\t0.0593111,\n\t\t\t0.145666,\n\t\t\t-0.74902,\n\t\t\t0.167794,\n\t\t\t0.0889224,\n\t\t\t0.254953,\n\t\t\t-0.623529,\n\t\t\t0.231446,\n\t\t\t0.123339,\n\t\t\t0.360511,\n\t\t\t-0.498039,\n\t\t\t0.296699,\n\t\t\t0.163027,\n\t\t\t0.461278,\n\t\t\t-0.372549,\n\t\t\t0.363211,\n\t\t\t0.209286,\n\t\t\t0.55306,\n\t\t\t-0.247059,\n\t\t\t0.431136,\n\t\t\t0.260776,\n\t\t\t0.637195,\n\t\t\t-0.121569,\n\t\t\t0.498202,\n\t\t\t0.320012,\n\t\t\t0.705799,\n\t\t\t0.00392157,\n\t\t\t0.567456,\n\t\t\t0.380459,\n\t\t\t0.778091,\n\t\t\t0.129412,\n\t\t\t0.629381,\n\t\t\t0.445284,\n\t\t\t0.8448,\n\t\t\t0.254902,\n\t\t\t0.688373,\n\t\t\t0.517374,\n\t\t\t0.895694,\n\t\t\t0.380392,\n\t\t\t0.74891,\n\t\t\t0.590906,\n\t\t\t0.93976,\n\t\t\t0.505882,\n\t\t\t0.805017,\n\t\t\t0.667956,\n\t\t\t0.977626,\n\t\t\t0.631373,\n\t\t\t0.850914,\n\t\t\t0.752618,\n\t\t\t0.992396,\n\t\t\t0.756863,\n\t\t\t0.89724,\n\t\t\t0.838454,\n\t\t\t0.994093,\n\t\t\t0.882353,\n\t\t\t0.948461,\n\t\t\t0.922603,\n\t\t\t0.994449,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.999967\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"erdc_magenta_BW\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0.0000254023,\n\t\t\t-0.87451,\n\t\t\t0.128696,\n\t\t\t0.0456782,\n\t\t\t0.11635,\n\t\t\t-0.74902,\n\t\t\t0.228133,\n\t\t\t0.0476299,\n\t\t\t0.201452,\n\t\t\t-0.623529,\n\t\t\t0.327273,\n\t\t\t0.0374065,\n\t\t\t0.282107,\n\t\t\t-0.498039,\n\t\t\t0.420953,\n\t\t\t0.0408166,\n\t\t\t0.35709,\n\t\t\t-0.372549,\n\t\t\t0.511562,\n\t\t\t0.0642203,\n\t\t\t0.430511,\n\t\t\t-0.247059,\n\t\t\t0.599552,\n\t\t\t0.102686,\n\t\t\t0.504257,\n\t\t\t-0.121569,\n\t\t\t0.684646,\n\t\t\t0.150536,\n\t\t\t0.579429,\n\t\t\t0.00392157,\n\t\t\t0.765817,\n\t\t\t0.205978,\n\t\t\t0.656062,\n\t\t\t0.129412,\n\t\t\t0.839176,\n\t\t\t0.27229,\n\t\t\t0.731807,\n\t\t\t0.254902,\n\t\t\t0.89536,\n\t\t\t0.357594,\n\t\t\t0.797309,\n\t\t\t0.380392,\n\t\t\t0.930238,\n\t\t\t0.457825,\n\t\t\t0.846984,\n\t\t\t0.505882,\n\t\t\t0.945921,\n\t\t\t0.564536,\n\t\t\t0.880571,\n\t\t\t0.631373,\n\t\t\t0.948995,\n\t\t\t0.670753,\n\t\t\t0.902279,\n\t\t\t0.756863,\n\t\t\t0.947124,\n\t\t\t0.772819,\n\t\t\t0.918171,\n\t\t\t0.882353,\n\t\t\t0.947265,\n\t\t\t0.869424,\n\t\t\t0.934352,\n\t\t\t1,\n\t\t\t0.954719,\n\t\t\t0.95475,\n\t\t\t0.954726\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"magenta\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.87451,\n\t\t\t0.364706,\n\t\t\t0,\n\t\t\t0.152941,\n\t\t\t-0.74902,\n\t\t\t0.470588,\n\t\t\t0,\n\t\t\t0.254902,\n\t\t\t-0.623529,\n\t\t\t0.572549,\n\t\t\t0,\n\t\t\t0.34902,\n\t\t\t-0.498039,\n\t\t\t0.670588,\n\t\t\t0,\n\t\t\t0.443137,\n\t\t\t-0.372549,\n\t\t\t0.772549,\n\t\t\t0,\n\t\t\t0.537255,\n\t\t\t-0.247059,\n\t\t\t0.870588,\n\t\t\t0,\n\t\t\t0.627451,\n\t\t\t-0.121569,\n\t\t\t0.964706,\n\t\t\t0,\n\t\t\t0.717647,\n\t\t\t0.00392157,\n\t\t\t1,\n\t\t\t0.0784314,\n\t\t\t0.772549,\n\t\t\t0.129412,\n\t\t\t1,\n\t\t\t0.207843,\n\t\t\t0.858824,\n\t\t\t0.254902,\n\t\t\t1,\n\t\t\t0.32549,\n\t\t\t0.941176,\n\t\t\t0.380392,\n\t\t\t1,\n\t\t\t0.45098,\n\t\t\t1,\n\t\t\t0.505882,\n\t\t\t1,\n\t\t\t0.560784,\n\t\t\t1,\n\t\t\t0.631373,\n\t\t\t1,\n\t\t\t0.662745,\n\t\t\t1,\n\t\t\t0.756863,\n\t\t\t1,\n\t\t\t0.760784,\n\t\t\t1,\n\t\t\t0.882353,\n\t\t\t1,\n\t\t\t0.870588,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"RED-PURPLE\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.87451,\n\t\t\t0.188235,\n\t\t\t0,\n\t\t\t0.007843,\n\t\t\t-0.74902,\n\t\t\t0.345098,\n\t\t\t0,\n\t\t\t0.035294,\n\t\t\t-0.623529,\n\t\t\t0.439216,\n\t\t\t0,\n\t\t\t0.098039,\n\t\t\t-0.498039,\n\t\t\t0.533333,\n\t\t\t0,\n\t\t\t0.152941,\n\t\t\t-0.372549,\n\t\t\t0.627451,\n\t\t\t0.015686,\n\t\t\t0.211765,\n\t\t\t-0.247059,\n\t\t\t0.721569,\n\t\t\t0.031373,\n\t\t\t0.266667,\n\t\t\t-0.121569,\n\t\t\t0.8,\n\t\t\t0.047059,\n\t\t\t0.329412,\n\t\t\t0.00392157,\n\t\t\t0.862745,\n\t\t\t0.047059,\n\t\t\t0.403922,\n\t\t\t0.129412,\n\t\t\t0.941176,\n\t\t\t0.062745,\n\t\t\t0.466667,\n\t\t\t0.254902,\n\t\t\t0.988235,\n\t\t\t0.078431,\n\t\t\t0.54902,\n\t\t\t0.380392,\n\t\t\t0.988235,\n\t\t\t0.141176,\n\t\t\t0.643137,\n\t\t\t0.505882,\n\t\t\t0.988235,\n\t\t\t0.25098,\n\t\t\t0.729412,\n\t\t\t0.631373,\n\t\t\t0.988235,\n\t\t\t0.376471,\n\t\t\t0.811765,\n\t\t\t0.756863,\n\t\t\t0.988235,\n\t\t\t0.54902,\n\t\t\t0.886275,\n\t\t\t0.882353,\n\t\t\t0.988235,\n\t\t\t0.752941,\n\t\t\t0.952941,\n\t\t\t1,\n\t\t\t0.996078,\n\t\t\t0.996078,\n\t\t\t0.996078\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"erdc_red_BW\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.87451,\n\t\t\t0.147204,\n\t\t\t0.0480135,\n\t\t\t0.0401815,\n\t\t\t-0.74902,\n\t\t\t0.253411,\n\t\t\t0.0617478,\n\t\t\t0.0301333,\n\t\t\t-0.623529,\n\t\t\t0.356059,\n\t\t\t0.0746331,\n\t\t\t0.0446897,\n\t\t\t-0.498039,\n\t\t\t0.457731,\n\t\t\t0.0934935,\n\t\t\t0.0636931,\n\t\t\t-0.372549,\n\t\t\t0.557199,\n\t\t\t0.122714,\n\t\t\t0.0860013,\n\t\t\t-0.247059,\n\t\t\t0.665179,\n\t\t\t0.144238,\n\t\t\t0.105585,\n\t\t\t-0.121569,\n\t\t\t0.763833,\n\t\t\t0.187056,\n\t\t\t0.138326,\n\t\t\t0.00392157,\n\t\t\t0.847035,\n\t\t\t0.254558,\n\t\t\t0.189407,\n\t\t\t0.129412,\n\t\t\t0.905663,\n\t\t\t0.345937,\n\t\t\t0.258215,\n\t\t\t0.254902,\n\t\t\t0.941431,\n\t\t\t0.447111,\n\t\t\t0.346277,\n\t\t\t0.380392,\n\t\t\t0.962608,\n\t\t\t0.546927,\n\t\t\t0.457571,\n\t\t\t0.505882,\n\t\t\t0.987833,\n\t\t\t0.637276,\n\t\t\t0.569944,\n\t\t\t0.631373,\n\t\t\t0.994202,\n\t\t\t0.732176,\n\t\t\t0.687958,\n\t\t\t0.756863,\n\t\t\t0.993304,\n\t\t\t0.826268,\n\t\t\t0.800567,\n\t\t\t0.882353,\n\t\t\t0.994413,\n\t\t\t0.917205,\n\t\t\t0.906393,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.999979\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"RED_TEMPERATURE\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.87451,\n\t\t\t0.090196,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.74902,\n\t\t\t0.180392,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.623529,\n\t\t\t0.270588,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.498039,\n\t\t\t0.360784,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.372549,\n\t\t\t0.45098,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.247059,\n\t\t\t0.545098,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.121569,\n\t\t\t0.635294,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0.00392157,\n\t\t\t0.72549,\n\t\t\t0.058824,\n\t\t\t0,\n\t\t\t0.129412,\n\t\t\t0.815686,\n\t\t\t0.176471,\n\t\t\t0,\n\t\t\t0.254902,\n\t\t\t0.905882,\n\t\t\t0.294118,\n\t\t\t0,\n\t\t\t0.380392,\n\t\t\t1,\n\t\t\t0.411765,\n\t\t\t0,\n\t\t\t0.505882,\n\t\t\t1,\n\t\t\t0.533333,\n\t\t\t0.027451,\n\t\t\t0.631373,\n\t\t\t1,\n\t\t\t0.65098,\n\t\t\t0.27451,\n\t\t\t0.756863,\n\t\t\t1,\n\t\t\t0.768627,\n\t\t\t0.521569,\n\t\t\t0.882353,\n\t\t\t1,\n\t\t\t0.886275,\n\t\t\t0.768627,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"erdc_orange_BW\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0.0000253806,\n\t\t\t-0.87451,\n\t\t\t0.135871,\n\t\t\t0.0593824,\n\t\t\t0,\n\t\t\t-0.74902,\n\t\t\t0.224328,\n\t\t\t0.0907216,\n\t\t\t0,\n\t\t\t-0.623529,\n\t\t\t0.318083,\n\t\t\t0.119647,\n\t\t\t0,\n\t\t\t-0.498039,\n\t\t\t0.414443,\n\t\t\t0.150246,\n\t\t\t0,\n\t\t\t-0.372549,\n\t\t\t0.511077,\n\t\t\t0.184884,\n\t\t\t0,\n\t\t\t-0.247059,\n\t\t\t0.605501,\n\t\t\t0.226033,\n\t\t\t0,\n\t\t\t-0.121569,\n\t\t\t0.695274,\n\t\t\t0.275491,\n\t\t\t0,\n\t\t\t0.00392157,\n\t\t\t0.777826,\n\t\t\t0.334445,\n\t\t\t0,\n\t\t\t0.129412,\n\t\t\t0.851498,\n\t\t\t0.402441,\n\t\t\t0,\n\t\t\t0.254902,\n\t\t\t0.915899,\n\t\t\t0.47759,\n\t\t\t0.000602975,\n\t\t\t0.380392,\n\t\t\t0.971984,\n\t\t\t0.557882,\n\t\t\t0.0361443,\n\t\t\t0.505882,\n\t\t\t1,\n\t\t\t0.641287,\n\t\t\t0.135967,\n\t\t\t0.631373,\n\t\t\t1,\n\t\t\t0.725198,\n\t\t\t0.27997,\n\t\t\t0.756863,\n\t\t\t1,\n\t\t\t0.808205,\n\t\t\t0.438135,\n\t\t\t0.882353,\n\t\t\t1,\n\t\t\t0.89306,\n\t\t\t0.587036,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.977928,\n\t\t\t0.721599\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"heated_object\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.87451,\n\t\t\t0.34902,\n\t\t\t0.0862745,\n\t\t\t0,\n\t\t\t-0.74902,\n\t\t\t0.45098,\n\t\t\t0.172549,\n\t\t\t0,\n\t\t\t-0.623529,\n\t\t\t0.52549,\n\t\t\t0.231373,\n\t\t\t0,\n\t\t\t-0.498039,\n\t\t\t0.580392,\n\t\t\t0.278431,\n\t\t\t0,\n\t\t\t-0.372549,\n\t\t\t0.623529,\n\t\t\t0.313725,\n\t\t\t0,\n\t\t\t-0.247059,\n\t\t\t0.670588,\n\t\t\t0.352941,\n\t\t\t0,\n\t\t\t-0.121569,\n\t\t\t0.717647,\n\t\t\t0.392157,\n\t\t\t0,\n\t\t\t0.00392157,\n\t\t\t0.772549,\n\t\t\t0.439216,\n\t\t\t0,\n\t\t\t0.129412,\n\t\t\t0.839216,\n\t\t\t0.494118,\n\t\t\t0,\n\t\t\t0.254902,\n\t\t\t0.901961,\n\t\t\t0.541176,\n\t\t\t0,\n\t\t\t0.380392,\n\t\t\t0.968627,\n\t\t\t0.6,\n\t\t\t0,\n\t\t\t0.505882,\n\t\t\t1,\n\t\t\t0.658824,\n\t\t\t0,\n\t\t\t0.631373,\n\t\t\t1,\n\t\t\t0.721569,\n\t\t\t0,\n\t\t\t0.756863,\n\t\t\t1,\n\t\t\t0.827451,\n\t\t\t0.298039,\n\t\t\t0.882353,\n\t\t\t1,\n\t\t\t0.976471,\n\t\t\t0.72549,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"erdc_gold_BW\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0.0000190933,\n\t\t\t-0.87451,\n\t\t\t0.128363,\n\t\t\t0.0636265,\n\t\t\t0,\n\t\t\t-0.74902,\n\t\t\t0.193795,\n\t\t\t0.111057,\n\t\t\t0,\n\t\t\t-0.623529,\n\t\t\t0.25976,\n\t\t\t0.15987,\n\t\t\t0,\n\t\t\t-0.498039,\n\t\t\t0.328546,\n\t\t\t0.210589,\n\t\t\t0,\n\t\t\t-0.372549,\n\t\t\t0.399726,\n\t\t\t0.26332,\n\t\t\t0,\n\t\t\t-0.247059,\n\t\t\t0.472969,\n\t\t\t0.318261,\n\t\t\t0,\n\t\t\t-0.121569,\n\t\t\t0.546245,\n\t\t\t0.375827,\n\t\t\t0,\n\t\t\t0.00392157,\n\t\t\t0.61745,\n\t\t\t0.436719,\n\t\t\t0,\n\t\t\t0.129412,\n\t\t\t0.685545,\n\t\t\t0.501113,\n\t\t\t0,\n\t\t\t0.254902,\n\t\t\t0.749578,\n\t\t\t0.568799,\n\t\t\t0,\n\t\t\t0.380392,\n\t\t\t0.80962,\n\t\t\t0.6394,\n\t\t\t0,\n\t\t\t0.505882,\n\t\t\t0.865572,\n\t\t\t0.712699,\n\t\t\t0.10257,\n\t\t\t0.631373,\n\t\t\t0.917709,\n\t\t\t0.787569,\n\t\t\t0.233665,\n\t\t\t0.756863,\n\t\t\t0.966914,\n\t\t\t0.863138,\n\t\t\t0.369608,\n\t\t\t0.882353,\n\t\t\t1,\n\t\t\t0.939405,\n\t\t\t0.496104,\n\t\t\t1,\n\t\t\t0.999225,\n\t\t\t1,\n\t\t\t0.612275\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"erdc_brown_BW\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t3.3216e-7,\n\t\t\t0,\n\t\t\t0.00000483629,\n\t\t\t-0.87451,\n\t\t\t0.14693,\n\t\t\t0.0518172,\n\t\t\t0,\n\t\t\t-0.74902,\n\t\t\t0.225806,\n\t\t\t0.0814996,\n\t\t\t0,\n\t\t\t-0.623529,\n\t\t\t0.301681,\n\t\t\t0.111452,\n\t\t\t0,\n\t\t\t-0.498039,\n\t\t\t0.370487,\n\t\t\t0.150664,\n\t\t\t0,\n\t\t\t-0.372549,\n\t\t\t0.43108,\n\t\t\t0.199477,\n\t\t\t0,\n\t\t\t-0.247059,\n\t\t\t0.4849,\n\t\t\t0.255107,\n\t\t\t0,\n\t\t\t-0.121569,\n\t\t\t0.536798,\n\t\t\t0.313486,\n\t\t\t0,\n\t\t\t0.00392157,\n\t\t\t0.59286,\n\t\t\t0.371167,\n\t\t\t0,\n\t\t\t0.129412,\n\t\t\t0.653119,\n\t\t\t0.428135,\n\t\t\t0,\n\t\t\t0.254902,\n\t\t\t0.714589,\n\t\t\t0.485917,\n\t\t\t0.0379541,\n\t\t\t0.380392,\n\t\t\t0.774667,\n\t\t\t0.54565,\n\t\t\t0.116634,\n\t\t\t0.505882,\n\t\t\t0.831222,\n\t\t\t0.608047,\n\t\t\t0.183895,\n\t\t\t0.631373,\n\t\t\t0.880305,\n\t\t\t0.674199,\n\t\t\t0.260298,\n\t\t\t0.756863,\n\t\t\t0.922314,\n\t\t\t0.742472,\n\t\t\t0.367086,\n\t\t\t0.882353,\n\t\t\t0.959408,\n\t\t\t0.811222,\n\t\t\t0.497258,\n\t\t\t1,\n\t\t\t0.993548,\n\t\t\t0.875183,\n\t\t\t0.622093\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"copper_Matlab\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.87451,\n\t\t\t0.0784314,\n\t\t\t0.0501961,\n\t\t\t0.0313725,\n\t\t\t-0.74902,\n\t\t\t0.156863,\n\t\t\t0.100392,\n\t\t\t0.0627451,\n\t\t\t-0.623529,\n\t\t\t0.235294,\n\t\t\t0.150588,\n\t\t\t0.0941176,\n\t\t\t-0.498039,\n\t\t\t0.313725,\n\t\t\t0.200784,\n\t\t\t0.12549,\n\t\t\t-0.372549,\n\t\t\t0.392157,\n\t\t\t0.25098,\n\t\t\t0.156863,\n\t\t\t-0.247059,\n\t\t\t0.470588,\n\t\t\t0.301176,\n\t\t\t0.188235,\n\t\t\t-0.121569,\n\t\t\t0.54902,\n\t\t\t0.351373,\n\t\t\t0.219608,\n\t\t\t0.00392157,\n\t\t\t0.627451,\n\t\t\t0.401569,\n\t\t\t0.25098,\n\t\t\t0.129412,\n\t\t\t0.705882,\n\t\t\t0.451765,\n\t\t\t0.282353,\n\t\t\t0.254902,\n\t\t\t0.784314,\n\t\t\t0.501961,\n\t\t\t0.313725,\n\t\t\t0.380392,\n\t\t\t0.862745,\n\t\t\t0.552157,\n\t\t\t0.345098,\n\t\t\t0.505882,\n\t\t\t0.941176,\n\t\t\t0.602353,\n\t\t\t0.376471,\n\t\t\t0.631373,\n\t\t\t1,\n\t\t\t0.652549,\n\t\t\t0.407843,\n\t\t\t0.756863,\n\t\t\t1,\n\t\t\t0.702745,\n\t\t\t0.439216,\n\t\t\t0.882353,\n\t\t\t1,\n\t\t\t0.752941,\n\t\t\t0.470588,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.8,\n\t\t\t0.5\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"pink_Matlab\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.87451,\n\t\t\t0.312416,\n\t\t\t0.204524,\n\t\t\t0.204524,\n\t\t\t-0.74902,\n\t\t\t0.441822,\n\t\t\t0.289241,\n\t\t\t0.289241,\n\t\t\t-0.623529,\n\t\t\t0.54112,\n\t\t\t0.354246,\n\t\t\t0.354246,\n\t\t\t-0.498039,\n\t\t\t0.624831,\n\t\t\t0.409048,\n\t\t\t0.409048,\n\t\t\t-0.372549,\n\t\t\t0.698582,\n\t\t\t0.45733,\n\t\t\t0.45733,\n\t\t\t-0.247059,\n\t\t\t0.764404,\n\t\t\t0.502282,\n\t\t\t0.500979,\n\t\t\t-0.121569,\n\t\t\t0.791292,\n\t\t\t0.591516,\n\t\t\t0.54112,\n\t\t\t0.00392157,\n\t\t\t0.817297,\n\t\t\t0.66895,\n\t\t\t0.578481,\n\t\t\t0.129412,\n\t\t\t0.842499,\n\t\t\t0.738308,\n\t\t\t0.613572,\n\t\t\t0.254902,\n\t\t\t0.866968,\n\t\t\t0.801687,\n\t\t\t0.646762,\n\t\t\t0.380392,\n\t\t\t0.890766,\n\t\t\t0.86041,\n\t\t\t0.678329,\n\t\t\t0.505882,\n\t\t\t0.913944,\n\t\t\t0.913944,\n\t\t\t0.711254,\n\t\t\t0.631373,\n\t\t\t0.936549,\n\t\t\t0.936549,\n\t\t\t0.79459,\n\t\t\t0.756863,\n\t\t\t0.958621,\n\t\t\t0.958621,\n\t\t\t0.869979,\n\t\t\t0.882353,\n\t\t\t0.980196,\n\t\t\t0.980196,\n\t\t\t0.939336,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"bone_Matlab\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.87451,\n\t\t\t0.054902,\n\t\t\t0.054902,\n\t\t\t0.075817,\n\t\t\t-0.74902,\n\t\t\t0.109804,\n\t\t\t0.109804,\n\t\t\t0.151634,\n\t\t\t-0.623529,\n\t\t\t0.164706,\n\t\t\t0.164706,\n\t\t\t0.227451,\n\t\t\t-0.498039,\n\t\t\t0.219608,\n\t\t\t0.219608,\n\t\t\t0.303268,\n\t\t\t-0.372549,\n\t\t\t0.27451,\n\t\t\t0.27451,\n\t\t\t0.379085,\n\t\t\t-0.247059,\n\t\t\t0.329412,\n\t\t\t0.329902,\n\t\t\t0.454412,\n\t\t\t-0.121569,\n\t\t\t0.384314,\n\t\t\t0.405719,\n\t\t\t0.509314,\n\t\t\t0.00392157,\n\t\t\t0.439216,\n\t\t\t0.481536,\n\t\t\t0.564216,\n\t\t\t0.129412,\n\t\t\t0.494118,\n\t\t\t0.557353,\n\t\t\t0.619118,\n\t\t\t0.254902,\n\t\t\t0.54902,\n\t\t\t0.63317,\n\t\t\t0.67402,\n\t\t\t0.380392,\n\t\t\t0.603922,\n\t\t\t0.708987,\n\t\t\t0.728922,\n\t\t\t0.505882,\n\t\t\t0.660294,\n\t\t\t0.783824,\n\t\t\t0.783824,\n\t\t\t0.631373,\n\t\t\t0.746569,\n\t\t\t0.838725,\n\t\t\t0.838725,\n\t\t\t0.756863,\n\t\t\t0.832843,\n\t\t\t0.893627,\n\t\t\t0.893627,\n\t\t\t0.882353,\n\t\t\t0.919118,\n\t\t\t0.948529,\n\t\t\t0.948529,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"gray_Matlab\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.87451,\n\t\t\t0.0627451,\n\t\t\t0.0627451,\n\t\t\t0.0627451,\n\t\t\t-0.74902,\n\t\t\t0.12549,\n\t\t\t0.12549,\n\t\t\t0.12549,\n\t\t\t-0.623529,\n\t\t\t0.188235,\n\t\t\t0.188235,\n\t\t\t0.188235,\n\t\t\t-0.498039,\n\t\t\t0.25098,\n\t\t\t0.25098,\n\t\t\t0.25098,\n\t\t\t-0.372549,\n\t\t\t0.313725,\n\t\t\t0.313725,\n\t\t\t0.313725,\n\t\t\t-0.247059,\n\t\t\t0.376471,\n\t\t\t0.376471,\n\t\t\t0.376471,\n\t\t\t-0.121569,\n\t\t\t0.439216,\n\t\t\t0.439216,\n\t\t\t0.439216,\n\t\t\t0.00392157,\n\t\t\t0.501961,\n\t\t\t0.501961,\n\t\t\t0.501961,\n\t\t\t0.129412,\n\t\t\t0.564706,\n\t\t\t0.564706,\n\t\t\t0.564706,\n\t\t\t0.254902,\n\t\t\t0.627451,\n\t\t\t0.627451,\n\t\t\t0.627451,\n\t\t\t0.380392,\n\t\t\t0.690196,\n\t\t\t0.690196,\n\t\t\t0.690196,\n\t\t\t0.505882,\n\t\t\t0.752941,\n\t\t\t0.752941,\n\t\t\t0.752941,\n\t\t\t0.631373,\n\t\t\t0.815686,\n\t\t\t0.815686,\n\t\t\t0.815686,\n\t\t\t0.756863,\n\t\t\t0.878431,\n\t\t\t0.878431,\n\t\t\t0.878431,\n\t\t\t0.882353,\n\t\t\t0.941176,\n\t\t\t0.941176,\n\t\t\t0.941176,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"Purples\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.247059,\n\t\t\t0,\n\t\t\t0.490196,\n\t\t\t-0.87451,\n\t\t\t0.288397,\n\t\t\t0.07677,\n\t\t\t0.525629,\n\t\t\t-0.74902,\n\t\t\t0.32975,\n\t\t\t0.153587,\n\t\t\t0.561092,\n\t\t\t-0.623529,\n\t\t\t0.373057,\n\t\t\t0.236263,\n\t\t\t0.600461,\n\t\t\t-0.498039,\n\t\t\t0.416363,\n\t\t\t0.319,\n\t\t\t0.639923,\n\t\t\t-0.372549,\n\t\t\t0.459669,\n\t\t\t0.405613,\n\t\t\t0.685198,\n\t\t\t-0.247059,\n\t\t\t0.503345,\n\t\t\t0.491534,\n\t\t\t0.730058,\n\t\t\t-0.121569,\n\t\t\t0.562399,\n\t\t\t0.54862,\n\t\t\t0.757616,\n\t\t\t0.00392157,\n\t\t\t0.621453,\n\t\t\t0.606075,\n\t\t\t0.785544,\n\t\t\t0.129412,\n\t\t\t0.680508,\n\t\t\t0.674971,\n\t\t\t0.824914,\n\t\t\t0.254902,\n\t\t\t0.739562,\n\t\t\t0.743406,\n\t\t\t0.863899,\n\t\t\t0.380392,\n\t\t\t0.798616,\n\t\t\t0.800492,\n\t\t\t0.893426,\n\t\t\t0.505882,\n\t\t\t0.85684,\n\t\t\t0.856655,\n\t\t\t0.922491,\n\t\t\t0.631373,\n\t\t\t0.898178,\n\t\t\t0.894056,\n\t\t\t0.942176,\n\t\t\t0.756863,\n\t\t\t0.938654,\n\t\t\t0.930919,\n\t\t\t0.961646,\n\t\t\t0.882353,\n\t\t\t0.964245,\n\t\t\t0.958478,\n\t\t\t0.977393,\n\t\t\t1,\n\t\t\t0.988235,\n\t\t\t0.984314,\n\t\t\t0.992157\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"Blues\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.031373,\n\t\t\t0.188235,\n\t\t\t0.419608,\n\t\t\t-0.87451,\n\t\t\t0.031373,\n\t\t\t0.253195,\n\t\t\t0.516063,\n\t\t\t-0.74902,\n\t\t\t0.031757,\n\t\t\t0.318139,\n\t\t\t0.612149,\n\t\t\t-0.623529,\n\t\t\t0.080969,\n\t\t\t0.38113,\n\t\t\t0.661361,\n\t\t\t-0.498039,\n\t\t\t0.130427,\n\t\t\t0.444152,\n\t\t\t0.710327,\n\t\t\t-0.372549,\n\t\t\t0.195386,\n\t\t\t0.509112,\n\t\t\t0.743791,\n\t\t\t-0.247059,\n\t\t\t0.260715,\n\t\t\t0.573841,\n\t\t\t0.777209,\n\t\t\t-0.121569,\n\t\t\t0.341423,\n\t\t\t0.628958,\n\t\t\t0.808704,\n\t\t\t0.00392157,\n\t\t\t0.422745,\n\t\t\t0.684075,\n\t\t\t0.839892,\n\t\t\t0.129412,\n\t\t\t0.523137,\n\t\t\t0.739193,\n\t\t\t0.861546,\n\t\t\t0.254902,\n\t\t\t0.622684,\n\t\t\t0.793464,\n\t\t\t0.883429,\n\t\t\t0.380392,\n\t\t\t0.701423,\n\t\t\t0.826928,\n\t\t\t0.910988,\n\t\t\t0.505882,\n\t\t\t0.778685,\n\t\t\t0.8603,\n\t\t\t0.937993,\n\t\t\t0.631373,\n\t\t\t0.825928,\n\t\t\t0.891795,\n\t\t\t0.953741,\n\t\t\t0.756863,\n\t\t\t0.87328,\n\t\t\t0.923291,\n\t\t\t0.969489,\n\t\t\t0.882353,\n\t\t\t0.922491,\n\t\t\t0.954787,\n\t\t\t0.985236,\n\t\t\t1,\n\t\t\t0.968627,\n\t\t\t0.984314,\n\t\t\t1\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"Greens\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0.266667,\n\t\t\t0.105882,\n\t\t\t-0.87451,\n\t\t\t0,\n\t\t\t0.347374,\n\t\t\t0.139346,\n\t\t\t-0.74902,\n\t\t\t0.000538,\n\t\t\t0.427912,\n\t\t\t0.172933,\n\t\t\t-0.623529,\n\t\t\t0.069435,\n\t\t\t0.486967,\n\t\t\t0.222145,\n\t\t\t-0.498039,\n\t\t\t0.138178,\n\t\t\t0.546082,\n\t\t\t0.271326,\n\t\t\t-0.372549,\n\t\t\t0.197232,\n\t\t\t0.609073,\n\t\t\t0.31857,\n\t\t\t-0.247059,\n\t\t\t0.257255,\n\t\t\t0.671742,\n\t\t\t0.365859,\n\t\t\t-0.121569,\n\t\t\t0.357647,\n\t\t\t0.720953,\n\t\t\t0.415071,\n\t\t\t0.00392157,\n\t\t\t0.45767,\n\t\t\t0.769919,\n\t\t\t0.465021,\n\t\t\t0.129412,\n\t\t\t0.546251,\n\t\t\t0.811257,\n\t\t\t0.537855,\n\t\t\t0.254902,\n\t\t\t0.634295,\n\t\t\t0.852211,\n\t\t\t0.610688,\n\t\t\t0.380392,\n\t\t\t0.709097,\n\t\t\t0.883706,\n\t\t\t0.683522,\n\t\t\t0.505882,\n\t\t\t0.78316,\n\t\t\t0.914833,\n\t\t\t0.755894,\n\t\t\t0.631373,\n\t\t\t0.842215,\n\t\t\t0.938454,\n\t\t\t0.818885,\n\t\t\t0.756863,\n\t\t\t0.899977,\n\t\t\t0.961538,\n\t\t\t0.880692,\n\t\t\t0.882353,\n\t\t\t0.935409,\n\t\t\t0.975317,\n\t\t\t0.92203,\n\t\t\t1,\n\t\t\t0.968627,\n\t\t\t0.988235,\n\t\t\t0.960784\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"PuBu\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.301961,\n\t\t\t0,\n\t\t\t0.294118,\n\t\t\t-0.87451,\n\t\t\t0.404321,\n\t\t\t0.029527,\n\t\t\t0.390573,\n\t\t\t-0.74902,\n\t\t\t0.50599,\n\t\t\t0.059592,\n\t\t\t0.486782,\n\t\t\t-0.623529,\n\t\t\t0.519769,\n\t\t\t0.158016,\n\t\t\t0.551742,\n\t\t\t-0.498039,\n\t\t\t0.533456,\n\t\t\t0.256194,\n\t\t\t0.616301,\n\t\t\t-0.372549,\n\t\t\t0.54133,\n\t\t\t0.33887,\n\t\t\t0.655671,\n\t\t\t-0.247059,\n\t\t\t0.54902,\n\t\t\t0.421592,\n\t\t\t0.695087,\n\t\t\t-0.121569,\n\t\t\t0.54902,\n\t\t\t0.506236,\n\t\t\t0.736424,\n\t\t\t0.00392157,\n\t\t\t0.550127,\n\t\t\t0.590573,\n\t\t\t0.777701,\n\t\t\t0.129412,\n\t\t\t0.585559,\n\t\t\t0.665375,\n\t\t\t0.81707,\n\t\t\t0.254902,\n\t\t\t0.622145,\n\t\t\t0.739023,\n\t\t\t0.855825,\n\t\t\t0.380392,\n\t\t\t0.687105,\n\t\t\t0.784298,\n\t\t\t0.879446,\n\t\t\t0.505882,\n\t\t\t0.752065,\n\t\t\t0.829758,\n\t\t\t0.903253,\n\t\t\t0.631373,\n\t\t\t0.817024,\n\t\t\t0.87897,\n\t\t\t0.930811,\n\t\t\t0.756863,\n\t\t\t0.880907,\n\t\t\t0.927213,\n\t\t\t0.957832,\n\t\t\t0.882353,\n\t\t\t0.926182,\n\t\t\t0.958708,\n\t\t\t0.975548,\n\t\t\t1,\n\t\t\t0.968627,\n\t\t\t0.988235,\n\t\t\t0.992157\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"BuPu\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.007843,\n\t\t\t0.219608,\n\t\t\t0.345098,\n\t\t\t-0.87451,\n\t\t\t0.01178,\n\t\t\t0.286536,\n\t\t\t0.449427,\n\t\t\t-0.74902,\n\t\t\t0.015702,\n\t\t\t0.35328,\n\t\t\t0.553479,\n\t\t\t-0.623529,\n\t\t\t0.01767,\n\t\t\t0.396586,\n\t\t\t0.622376,\n\t\t\t-0.498039,\n\t\t\t0.021115,\n\t\t\t0.4402,\n\t\t\t0.690688,\n\t\t\t-0.372549,\n\t\t\t0.11757,\n\t\t\t0.503191,\n\t\t\t0.722184,\n\t\t\t-0.247059,\n\t\t\t0.214625,\n\t\t\t0.565859,\n\t\t\t0.753633,\n\t\t\t-0.121569,\n\t\t\t0.336671,\n\t\t\t0.615071,\n\t\t\t0.78316,\n\t\t\t0.00392157,\n\t\t\t0.457978,\n\t\t\t0.663975,\n\t\t\t0.812503,\n\t\t\t0.129412,\n\t\t\t0.556401,\n\t\t\t0.703345,\n\t\t\t0.836125,\n\t\t\t0.254902,\n\t\t\t0.65421,\n\t\t\t0.742714,\n\t\t\t0.859669,\n\t\t\t0.380392,\n\t\t\t0.736886,\n\t\t\t0.782084,\n\t\t\t0.881323,\n\t\t\t0.505882,\n\t\t\t0.81827,\n\t\t\t0.821638,\n\t\t\t0.903068,\n\t\t\t0.631373,\n\t\t\t0.873387,\n\t\t\t0.864944,\n\t\t\t0.92669,\n\t\t\t0.756863,\n\t\t\t0.927536,\n\t\t\t0.907605,\n\t\t\t0.949988,\n\t\t\t0.882353,\n\t\t\t0.964937,\n\t\t\t0.9391,\n\t\t\t0.967705,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.968627,\n\t\t\t0.984314\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"BuGn\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.031373,\n\t\t\t0.25098,\n\t\t\t0.505882,\n\t\t\t-0.87451,\n\t\t\t0.031373,\n\t\t\t0.329719,\n\t\t\t0.590527,\n\t\t\t-0.74902,\n\t\t\t0.031911,\n\t\t\t0.408397,\n\t\t\t0.674787,\n\t\t\t-0.623529,\n\t\t\t0.100807,\n\t\t\t0.479262,\n\t\t\t0.710219,\n\t\t\t-0.498039,\n\t\t\t0.169704,\n\t\t\t0.550219,\n\t\t\t0.745744,\n\t\t\t-0.372549,\n\t\t\t0.238601,\n\t\t\t0.62699,\n\t\t\t0.787082,\n\t\t\t-0.247059,\n\t\t\t0.307958,\n\t\t\t0.703114,\n\t\t\t0.826759,\n\t\t\t-0.121569,\n\t\t\t0.39654,\n\t\t\t0.752326,\n\t\t\t0.797232,\n\t\t\t0.00392157,\n\t\t\t0.485121,\n\t\t\t0.801046,\n\t\t\t0.767705,\n\t\t\t0.129412,\n\t\t\t0.573702,\n\t\t\t0.83451,\n\t\t\t0.738178,\n\t\t\t0.254902,\n\t\t\t0.661592,\n\t\t\t0.867743,\n\t\t\t0.711034,\n\t\t\t0.380392,\n\t\t\t0.732457,\n\t\t\t0.895302,\n\t\t\t0.74253,\n\t\t\t0.505882,\n\t\t\t0.801845,\n\t\t\t0.922307,\n\t\t\t0.774579,\n\t\t\t0.631373,\n\t\t\t0.841215,\n\t\t\t0.938055,\n\t\t\t0.817885,\n\t\t\t0.756863,\n\t\t\t0.880907,\n\t\t\t0.95391,\n\t\t\t0.861084,\n\t\t\t0.882353,\n\t\t\t0.926182,\n\t\t\t0.971626,\n\t\t\t0.902422,\n\t\t\t1,\n\t\t\t0.968627,\n\t\t\t0.988235,\n\t\t\t0.941176\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"GnBu\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0.266667,\n\t\t\t0.105882,\n\t\t\t-0.87451,\n\t\t\t0,\n\t\t\t0.347374,\n\t\t\t0.139346,\n\t\t\t-0.74902,\n\t\t\t0.000538,\n\t\t\t0.427912,\n\t\t\t0.172933,\n\t\t\t-0.623529,\n\t\t\t0.069435,\n\t\t\t0.486967,\n\t\t\t0.222145,\n\t\t\t-0.498039,\n\t\t\t0.138178,\n\t\t\t0.546175,\n\t\t\t0.272095,\n\t\t\t-0.372549,\n\t\t\t0.197232,\n\t\t\t0.615071,\n\t\t\t0.368551,\n\t\t\t-0.247059,\n\t\t\t0.256609,\n\t\t\t0.683276,\n\t\t\t0.464867,\n\t\t\t-0.121569,\n\t\t\t0.329443,\n\t\t\t0.722645,\n\t\t\t0.555417,\n\t\t\t0.00392157,\n\t\t\t0.403137,\n\t\t\t0.762138,\n\t\t\t0.645413,\n\t\t\t0.129412,\n\t\t\t0.503529,\n\t\t\t0.805444,\n\t\t\t0.718247,\n\t\t\t0.254902,\n\t\t\t0.603922,\n\t\t\t0.848597,\n\t\t\t0.790465,\n\t\t\t0.380392,\n\t\t\t0.704314,\n\t\t\t0.887966,\n\t\t\t0.847551,\n\t\t\t0.505882,\n\t\t\t0.802307,\n\t\t\t0.926321,\n\t\t\t0.903714,\n\t\t\t0.631373,\n\t\t\t0.851519,\n\t\t\t0.944037,\n\t\t\t0.941115,\n\t\t\t0.756863,\n\t\t\t0.899977,\n\t\t\t0.961538,\n\t\t\t0.976901,\n\t\t\t0.882353,\n\t\t\t0.935409,\n\t\t\t0.975317,\n\t\t\t0.984775,\n\t\t\t1,\n\t\t\t0.968627,\n\t\t\t0.988235,\n\t\t\t0.992157\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"GnBuPu\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.003922,\n\t\t\t0.27451,\n\t\t\t0.211765,\n\t\t\t-0.87451,\n\t\t\t0.003922,\n\t\t\t0.349312,\n\t\t\t0.280661,\n\t\t\t-0.74902,\n\t\t\t0.003937,\n\t\t\t0.423852,\n\t\t\t0.349773,\n\t\t\t-0.623529,\n\t\t\t0.005905,\n\t\t\t0.46519,\n\t\t\t0.446228,\n\t\t\t-0.498039,\n\t\t\t0.009443,\n\t\t\t0.506344,\n\t\t\t0.542837,\n\t\t\t-0.372549,\n\t\t\t0.111803,\n\t\t\t0.535871,\n\t\t\t0.649135,\n\t\t\t-0.247059,\n\t\t\t0.214025,\n\t\t\t0.565859,\n\t\t\t0.753633,\n\t\t\t-0.121569,\n\t\t\t0.310481,\n\t\t\t0.615071,\n\t\t\t0.78316,\n\t\t\t0.00392157,\n\t\t\t0.407797,\n\t\t\t0.663975,\n\t\t\t0.812503,\n\t\t\t0.129412,\n\t\t\t0.531811,\n\t\t\t0.703345,\n\t\t\t0.836125,\n\t\t\t0.254902,\n\t\t\t0.65421,\n\t\t\t0.742714,\n\t\t\t0.859669,\n\t\t\t0.380392,\n\t\t\t0.736886,\n\t\t\t0.782084,\n\t\t\t0.881323,\n\t\t\t0.505882,\n\t\t\t0.81827,\n\t\t\t0.821176,\n\t\t\t0.902884,\n\t\t\t0.631373,\n\t\t\t0.873387,\n\t\t\t0.854641,\n\t\t\t0.922568,\n\t\t\t0.756863,\n\t\t\t0.927536,\n\t\t\t0.888535,\n\t\t\t0.942361,\n\t\t\t0.882353,\n\t\t\t0.964937,\n\t\t\t0.929873,\n\t\t\t0.964014,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.968627,\n\t\t\t0.984314\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"BuGnYl\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.031373,\n\t\t\t0.113725,\n\t\t\t0.345098,\n\t\t\t-0.87451,\n\t\t\t0.088458,\n\t\t\t0.159,\n\t\t\t0.463206,\n\t\t\t-0.74902,\n\t\t\t0.145052,\n\t\t\t0.204567,\n\t\t\t0.5807,\n\t\t\t-0.623529,\n\t\t\t0.139146,\n\t\t\t0.287243,\n\t\t\t0.620069,\n\t\t\t-0.498039,\n\t\t\t0.13318,\n\t\t\t0.370196,\n\t\t\t0.659562,\n\t\t\t-0.372549,\n\t\t\t0.123337,\n\t\t\t0.470588,\n\t\t\t0.706805,\n\t\t\t-0.247059,\n\t\t\t0.115386,\n\t\t\t0.570335,\n\t\t\t0.753126,\n\t\t\t-0.121569,\n\t\t\t0.186251,\n\t\t\t0.643168,\n\t\t\t0.761,\n\t\t\t0.00392157,\n\t\t\t0.258716,\n\t\t\t0.71514,\n\t\t\t0.768074,\n\t\t\t0.129412,\n\t\t\t0.380761,\n\t\t\t0.760415,\n\t\t\t0.750358,\n\t\t\t0.254902,\n\t\t\t0.503576,\n\t\t\t0.806075,\n\t\t\t0.732795,\n\t\t\t0.380392,\n\t\t\t0.645306,\n\t\t\t0.861192,\n\t\t\t0.719016,\n\t\t\t0.505882,\n\t\t\t0.783899,\n\t\t\t0.91511,\n\t\t\t0.705606,\n\t\t\t0.631373,\n\t\t\t0.858701,\n\t\t\t0.944637,\n\t\t\t0.6997,\n\t\t\t0.756863,\n\t\t\t0.931349,\n\t\t\t0.973303,\n\t\t\t0.698424,\n\t\t\t0.882353,\n\t\t\t0.966782,\n\t\t\t0.987082,\n\t\t\t0.777163,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.85098\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"PuRd\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.286275,\n\t\t\t0,\n\t\t\t0.415686,\n\t\t\t-0.87451,\n\t\t\t0.38273,\n\t\t\t0.001968,\n\t\t\t0.441276,\n\t\t\t-0.74902,\n\t\t\t0.479231,\n\t\t\t0.003922,\n\t\t\t0.466774,\n\t\t\t-0.623529,\n\t\t\t0.581592,\n\t\t\t0.003922,\n\t\t\t0.480554,\n\t\t\t-0.498039,\n\t\t\t0.683799,\n\t\t\t0.00549,\n\t\t\t0.494887,\n\t\t\t-0.372549,\n\t\t\t0.776317,\n\t\t\t0.105882,\n\t\t\t0.544098,\n\t\t\t-0.247059,\n\t\t\t0.867866,\n\t\t\t0.206321,\n\t\t\t0.592618,\n\t\t\t-0.121569,\n\t\t\t0.919047,\n\t\t\t0.308681,\n\t\t\t0.612303,\n\t\t\t0.00392157,\n\t\t\t0.968812,\n\t\t\t0.411226,\n\t\t\t0.632603,\n\t\t\t0.129412,\n\t\t\t0.974717,\n\t\t\t0.519493,\n\t\t\t0.671972,\n\t\t\t0.254902,\n\t\t\t0.980546,\n\t\t\t0.626451,\n\t\t\t0.71065,\n\t\t\t0.380392,\n\t\t\t0.984483,\n\t\t\t0.701253,\n\t\t\t0.732303,\n\t\t\t0.505882,\n\t\t\t0.988328,\n\t\t\t0.77504,\n\t\t\t0.755617,\n\t\t\t0.631373,\n\t\t\t0.990296,\n\t\t\t0.828189,\n\t\t\t0.812703,\n\t\t\t0.756863,\n\t\t\t0.992372,\n\t\t\t0.880907,\n\t\t\t0.869035,\n\t\t\t0.882353,\n\t\t\t0.996309,\n\t\t\t0.926182,\n\t\t\t0.912341,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.968627,\n\t\t\t0.952941\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"RdPu\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.403922,\n\t\t\t0,\n\t\t\t0.121569,\n\t\t\t-0.87451,\n\t\t\t0.500377,\n\t\t\t0,\n\t\t\t0.192434,\n\t\t\t-0.74902,\n\t\t\t0.596909,\n\t\t\t0.000277,\n\t\t\t0.263037,\n\t\t\t-0.623529,\n\t\t\t0.703206,\n\t\t\t0.035709,\n\t\t\t0.300438,\n\t\t\t-0.498039,\n\t\t\t0.808612,\n\t\t\t0.071296,\n\t\t\t0.338854,\n\t\t\t-0.372549,\n\t\t\t0.857824,\n\t\t\t0.116571,\n\t\t\t0.441215,\n\t\t\t-0.247059,\n\t\t\t0.905513,\n\t\t\t0.163552,\n\t\t\t0.54293,\n\t\t\t-0.121569,\n\t\t\t0.889765,\n\t\t\t0.281661,\n\t\t\t0.617732,\n\t\t\t0.00392157,\n\t\t\t0.873156,\n\t\t\t0.39897,\n\t\t\t0.691611,\n\t\t\t0.129412,\n\t\t\t0.82985,\n\t\t\t0.491488,\n\t\t\t0.736886,\n\t\t\t0.254902,\n\t\t\t0.789081,\n\t\t\t0.583237,\n\t\t\t0.781853,\n\t\t\t0.380392,\n\t\t\t0.810734,\n\t\t\t0.656071,\n\t\t\t0.819254,\n\t\t\t0.505882,\n\t\t\t0.833126,\n\t\t\t0.729181,\n\t\t\t0.85684,\n\t\t\t0.631373,\n\t\t\t0.870527,\n\t\t\t0.80792,\n\t\t\t0.898178,\n\t\t\t0.756863,\n\t\t\t0.907605,\n\t\t\t0.884398,\n\t\t\t0.938331,\n\t\t\t0.882353,\n\t\t\t0.9391,\n\t\t\t0.921799,\n\t\t\t0.958016,\n\t\t\t1,\n\t\t\t0.968627,\n\t\t\t0.956863,\n\t\t\t0.976471\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"Oranges\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.498039,\n\t\t\t0.152941,\n\t\t\t0.015686,\n\t\t\t-0.87451,\n\t\t\t0.57481,\n\t\t\t0.182468,\n\t\t\t0.013718,\n\t\t\t-0.74902,\n\t\t\t0.651765,\n\t\t\t0.212042,\n\t\t\t0.011734,\n\t\t\t-0.623529,\n\t\t\t0.752157,\n\t\t\t0.247474,\n\t\t\t0.007797,\n\t\t\t-0.498039,\n\t\t\t0.851719,\n\t\t\t0.283368,\n\t\t\t0.004475,\n\t\t\t-0.372549,\n\t\t\t0.898962,\n\t\t\t0.348328,\n\t\t\t0.039908,\n\t\t\t-0.247059,\n\t\t\t0.945652,\n\t\t\t0.413426,\n\t\t\t0.076401,\n\t\t\t-0.121569,\n\t\t\t0.969273,\n\t\t\t0.484291,\n\t\t\t0.157109,\n\t\t\t0.00392157,\n\t\t\t0.992157,\n\t\t\t0.554971,\n\t\t\t0.238185,\n\t\t\t0.129412,\n\t\t\t0.992157,\n\t\t\t0.619931,\n\t\t\t0.330704,\n\t\t\t0.254902,\n\t\t\t0.992157,\n\t\t\t0.684967,\n\t\t\t0.423837,\n\t\t\t0.380392,\n\t\t\t0.992157,\n\t\t\t0.751895,\n\t\t\t0.532103,\n\t\t\t0.505882,\n\t\t\t0.992249,\n\t\t\t0.817716,\n\t\t\t0.639354,\n\t\t\t0.631373,\n\t\t\t0.994218,\n\t\t\t0.861023,\n\t\t\t0.725967,\n\t\t\t0.756863,\n\t\t\t0.996186,\n\t\t\t0.903576,\n\t\t\t0.810965,\n\t\t\t0.882353,\n\t\t\t0.998155,\n\t\t\t0.933103,\n\t\t\t0.868051,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.960784,\n\t\t\t0.921569\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"Reds\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.403922,\n\t\t\t0,\n\t\t\t0.05098,\n\t\t\t-0.87451,\n\t\t\t0.525967,\n\t\t\t0.029527,\n\t\t\t0.066728,\n\t\t\t-0.74902,\n\t\t\t0.647643,\n\t\t\t0.058962,\n\t\t\t0.082476,\n\t\t\t-0.623529,\n\t\t\t0.722445,\n\t\t\t0.076678,\n\t\t\t0.098224,\n\t\t\t-0.498039,\n\t\t\t0.797186,\n\t\t\t0.095194,\n\t\t\t0.114187,\n\t\t\t-0.372549,\n\t\t\t0.868051,\n\t\t\t0.164091,\n\t\t\t0.143714,\n\t\t\t-0.247059,\n\t\t\t0.937809,\n\t\t\t0.233541,\n\t\t\t0.173933,\n\t\t\t-0.121569,\n\t\t\t0.96143,\n\t\t\t0.326059,\n\t\t\t0.232987,\n\t\t\t0.00392157,\n\t\t\t0.984375,\n\t\t\t0.418147,\n\t\t\t0.292657,\n\t\t\t0.129412,\n\t\t\t0.986344,\n\t\t\t0.496886,\n\t\t\t0.371396,\n\t\t\t0.254902,\n\t\t\t0.988235,\n\t\t\t0.575702,\n\t\t\t0.450673,\n\t\t\t0.380392,\n\t\t\t0.988235,\n\t\t\t0.656409,\n\t\t\t0.543191,\n\t\t\t0.505882,\n\t\t\t0.98842,\n\t\t\t0.736747,\n\t\t\t0.635894,\n\t\t\t0.631373,\n\t\t\t0.992357,\n\t\t\t0.809581,\n\t\t\t0.732349,\n\t\t\t0.756863,\n\t\t\t0.996186,\n\t\t\t0.880692,\n\t\t\t0.826759,\n\t\t\t0.882353,\n\t\t\t0.998155,\n\t\t\t0.92203,\n\t\t\t0.885813,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.960784,\n\t\t\t0.941176\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"RdOr\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.498039,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.87451,\n\t\t\t0.6004,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.74902,\n\t\t\t0.702514,\n\t\t\t0.000738,\n\t\t\t0.000477,\n\t\t\t-0.623529,\n\t\t\t0.773379,\n\t\t\t0.095225,\n\t\t\t0.061499,\n\t\t\t-0.498039,\n\t\t\t0.843875,\n\t\t\t0.189865,\n\t\t\t0.12283,\n\t\t\t-0.372549,\n\t\t\t0.891119,\n\t\t\t0.294195,\n\t\t\t0.203537,\n\t\t\t-0.247059,\n\t\t\t0.937855,\n\t\t\t0.397924,\n\t\t\t0.283137,\n\t\t\t-0.121569,\n\t\t\t0.963445,\n\t\t\t0.476663,\n\t\t\t0.316601,\n\t\t\t0.00392157,\n\t\t\t0.988297,\n\t\t\t0.555771,\n\t\t\t0.351665,\n\t\t\t0.129412,\n\t\t\t0.990265,\n\t\t\t0.646321,\n\t\t\t0.436309,\n\t\t\t0.254902,\n\t\t\t0.992157,\n\t\t\t0.735256,\n\t\t\t0.519646,\n\t\t\t0.380392,\n\t\t\t0.992157,\n\t\t\t0.784468,\n\t\t\t0.570827,\n\t\t\t0.505882,\n\t\t\t0.992249,\n\t\t\t0.833218,\n\t\t\t0.623483,\n\t\t\t0.631373,\n\t\t\t0.994218,\n\t\t\t0.872587,\n\t\t\t0.706159,\n\t\t\t0.756863,\n\t\t\t0.996186,\n\t\t\t0.911419,\n\t\t\t0.788189,\n\t\t\t0.882353,\n\t\t\t0.998155,\n\t\t\t0.940946,\n\t\t\t0.859054,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.968627,\n\t\t\t0.92549\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"BrOrYl\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.4,\n\t\t\t0.145098,\n\t\t\t0.023529,\n\t\t\t-0.87451,\n\t\t\t0.500392,\n\t\t\t0.174625,\n\t\t\t0.019592,\n\t\t\t-0.74902,\n\t\t\t0.600784,\n\t\t\t0.204291,\n\t\t\t0.015656,\n\t\t\t-0.623529,\n\t\t\t0.701176,\n\t\t\t0.251534,\n\t\t\t0.011719,\n\t\t\t-0.498039,\n\t\t\t0.800984,\n\t\t\t0.299146,\n\t\t\t0.008397,\n\t\t\t-0.372549,\n\t\t\t0.863975,\n\t\t\t0.370012,\n\t\t\t0.043829,\n\t\t\t-0.247059,\n\t\t\t0.926321,\n\t\t\t0.441107,\n\t\t\t0.0794,\n\t\t\t-0.121569,\n\t\t\t0.961753,\n\t\t\t0.521815,\n\t\t\t0.120738,\n\t\t\t0.00392157,\n\t\t\t0.996078,\n\t\t\t0.602645,\n\t\t\t0.163122,\n\t\t\t0.129412,\n\t\t\t0.996078,\n\t\t\t0.68729,\n\t\t\t0.237924,\n\t\t\t0.254902,\n\t\t\t0.996078,\n\t\t\t0.771011,\n\t\t\t0.314879,\n\t\t\t0.380392,\n\t\t\t0.996078,\n\t\t\t0.832034,\n\t\t\t0.444798,\n\t\t\t0.505882,\n\t\t\t0.996171,\n\t\t\t0.892042,\n\t\t\t0.572595,\n\t\t\t0.631373,\n\t\t\t0.998139,\n\t\t\t0.931411,\n\t\t\t0.65724,\n\t\t\t0.756863,\n\t\t\t1,\n\t\t\t0.969489,\n\t\t\t0.741669,\n\t\t\t0.882353,\n\t\t\t1,\n\t\t\t0.985236,\n\t\t\t0.822376,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.898039\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"RdOrYl\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.501961,\n\t\t\t0,\n\t\t\t0.14902,\n\t\t\t-0.87451,\n\t\t\t0.622038,\n\t\t\t0,\n\t\t\t0.14902,\n\t\t\t-0.74902,\n\t\t\t0.741761,\n\t\t\t0.0004,\n\t\t\t0.148866,\n\t\t\t-0.623529,\n\t\t\t0.816563,\n\t\t\t0.05158,\n\t\t\t0.129181,\n\t\t\t-0.498039,\n\t\t\t0.890965,\n\t\t\t0.10356,\n\t\t\t0.110235,\n\t\t\t-0.372549,\n\t\t\t0.940177,\n\t\t\t0.205921,\n\t\t\t0.137793,\n\t\t\t-0.247059,\n\t\t\t0.988281,\n\t\t\t0.308789,\n\t\t\t0.165536,\n\t\t\t-0.121569,\n\t\t\t0.99025,\n\t\t\t0.432803,\n\t\t\t0.200969,\n\t\t\t0.00392157,\n\t\t\t0.992218,\n\t\t\t0.555217,\n\t\t\t0.236278,\n\t\t\t0.129412,\n\t\t\t0.994187,\n\t\t\t0.628051,\n\t\t\t0.267774,\n\t\t\t0.254902,\n\t\t\t0.996078,\n\t\t\t0.701038,\n\t\t\t0.301269,\n\t\t\t0.380392,\n\t\t\t0.996078,\n\t\t\t0.777809,\n\t\t\t0.383945,\n\t\t\t0.505882,\n\t\t\t0.996171,\n\t\t\t0.852826,\n\t\t\t0.466621,\n\t\t\t0.631373,\n\t\t\t0.998139,\n\t\t\t0.892195,\n\t\t\t0.549296,\n\t\t\t0.756863,\n\t\t\t1,\n\t\t\t0.931349,\n\t\t\t0.632188,\n\t\t\t0.882353,\n\t\t\t1,\n\t\t\t0.966782,\n\t\t\t0.7188,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.8\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"CIELab_blue2red\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0.6,\n\t\t\t0.74902,\n\t\t\t1,\n\t\t\t0.76863,\n\t\t\t0.46667,\n\t\t\t0.34118\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"blue2yellow\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0.5,\n\t\t\t0.5,\n\t\t\t0.5,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"erdc_blue2gold\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.175119,\n\t\t\t0.0438468,\n\t\t\t1,\n\t\t\t-0.874016,\n\t\t\t0.22383,\n\t\t\t0.159771,\n\t\t\t0.94557,\n\t\t\t-0.748031,\n\t\t\t0.27254,\n\t\t\t0.233611,\n\t\t\t0.891216,\n\t\t\t-0.622047,\n\t\t\t0.321251,\n\t\t\t0.296526,\n\t\t\t0.836857,\n\t\t\t-0.496063,\n\t\t\t0.369962,\n\t\t\t0.354296,\n\t\t\t0.782359,\n\t\t\t-0.370079,\n\t\t\t0.418672,\n\t\t\t0.409139,\n\t\t\t0.72754,\n\t\t\t-0.244094,\n\t\t\t0.467383,\n\t\t\t0.462152,\n\t\t\t0.672148,\n\t\t\t-0.11811,\n\t\t\t0.51609,\n\t\t\t0.51396,\n\t\t\t0.615825,\n\t\t\t0.00787402,\n\t\t\t0.572863,\n\t\t\t0.55452,\n\t\t\t0.559172,\n\t\t\t0.133858,\n\t\t\t0.630269,\n\t\t\t0.593822,\n\t\t\t0.517729,\n\t\t\t0.259843,\n\t\t\t0.689588,\n\t\t\t0.624668,\n\t\t\t0.47446,\n\t\t\t0.385827,\n\t\t\t0.745394,\n\t\t\t0.656113,\n\t\t\t0.428638,\n\t\t\t0.511811,\n\t\t\t0.798624,\n\t\t\t0.688104,\n\t\t\t0.379105,\n\t\t\t0.637795,\n\t\t\t0.849926,\n\t\t\t0.720593,\n\t\t\t0.323834,\n\t\t\t0.76378,\n\t\t\t0.899765,\n\t\t\t0.753543,\n\t\t\t0.258657,\n\t\t\t0.889764,\n\t\t\t0.948487,\n\t\t\t0.78692,\n\t\t\t0.171778,\n\t\t\t1,\n\t\t\t0.990413,\n\t\t\t0.816451,\n\t\t\t0.00729848\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"erdc_blue2yellow\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.0830122,\n\t\t\t0,\n\t\t\t0.495617,\n\t\t\t-0.87451,\n\t\t\t0.141973,\n\t\t\t0.0551288,\n\t\t\t0.57363,\n\t\t\t-0.74902,\n\t\t\t0.193048,\n\t\t\t0.110258,\n\t\t\t0.604561,\n\t\t\t-0.623529,\n\t\t\t0.234231,\n\t\t\t0.165386,\n\t\t\t0.57643,\n\t\t\t-0.498039,\n\t\t\t0.275413,\n\t\t\t0.220515,\n\t\t\t0.548299,\n\t\t\t-0.372549,\n\t\t\t0.316596,\n\t\t\t0.275644,\n\t\t\t0.520169,\n\t\t\t-0.247059,\n\t\t\t0.357778,\n\t\t\t0.330773,\n\t\t\t0.492038,\n\t\t\t-0.121569,\n\t\t\t0.398961,\n\t\t\t0.385901,\n\t\t\t0.463908,\n\t\t\t0.00392157,\n\t\t\t0.449929,\n\t\t\t0.438487,\n\t\t\t0.426815,\n\t\t\t0.129412,\n\t\t\t0.511572,\n\t\t\t0.488299,\n\t\t\t0.379944,\n\t\t\t0.254902,\n\t\t\t0.581222,\n\t\t\t0.53603,\n\t\t\t0.325741,\n\t\t\t0.380392,\n\t\t\t0.650871,\n\t\t\t0.583761,\n\t\t\t0.271538,\n\t\t\t0.505882,\n\t\t\t0.720521,\n\t\t\t0.631493,\n\t\t\t0.217335,\n\t\t\t0.631373,\n\t\t\t0.79017,\n\t\t\t0.679224,\n\t\t\t0.163132,\n\t\t\t0.756863,\n\t\t\t0.85982,\n\t\t\t0.726955,\n\t\t\t0.108929,\n\t\t\t0.882353,\n\t\t\t0.910254,\n\t\t\t0.774159,\n\t\t\t0.14112,\n\t\t\t1,\n\t\t\t0.927513,\n\t\t\t0.81759,\n\t\t\t0.306289\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"erdc_cyan2orange\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.0471513,\n\t\t\t0.213874,\n\t\t\t0.414329,\n\t\t\t-0.87451,\n\t\t\t0.0674702,\n\t\t\t0.256648,\n\t\t\t0.439027,\n\t\t\t-0.74902,\n\t\t\t0.0959957,\n\t\t\t0.299331,\n\t\t\t0.462089,\n\t\t\t-0.623529,\n\t\t\t0.132428,\n\t\t\t0.341872,\n\t\t\t0.483212,\n\t\t\t-0.498039,\n\t\t\t0.188743,\n\t\t\t0.38277,\n\t\t\t0.500597,\n\t\t\t-0.372549,\n\t\t\t0.268511,\n\t\t\t0.420229,\n\t\t\t0.512179,\n\t\t\t-0.247059,\n\t\t\t0.352945,\n\t\t\t0.455602,\n\t\t\t0.519101,\n\t\t\t-0.121569,\n\t\t\t0.43893,\n\t\t\t0.489368,\n\t\t\t0.521538,\n\t\t\t0.00392157,\n\t\t\t0.522445,\n\t\t\t0.522495,\n\t\t\t0.522436,\n\t\t\t0.129412,\n\t\t\t0.600089,\n\t\t\t0.555682,\n\t\t\t0.53205,\n\t\t\t0.254902,\n\t\t\t0.67988,\n\t\t\t0.587981,\n\t\t\t0.539163,\n\t\t\t0.380392,\n\t\t\t0.761011,\n\t\t\t0.619586,\n\t\t\t0.544439,\n\t\t\t0.505882,\n\t\t\t0.84278,\n\t\t\t0.650741,\n\t\t\t0.548567,\n\t\t\t0.631373,\n\t\t\t0.910713,\n\t\t\t0.687347,\n\t\t\t0.557822,\n\t\t\t0.756863,\n\t\t\t0.952232,\n\t\t\t0.734972,\n\t\t\t0.577775,\n\t\t\t0.882353,\n\t\t\t0.975642,\n\t\t\t0.789858,\n\t\t\t0.604868,\n\t\t\t1,\n\t\t\t0.990752,\n\t\t\t0.843643,\n\t\t\t0.632857\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"erdc_purple2green\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.235006,\n\t\t\t0.0483128,\n\t\t\t0.530899,\n\t\t\t-0.87451,\n\t\t\t0.302968,\n\t\t\t0.108419,\n\t\t\t0.552391,\n\t\t\t-0.74902,\n\t\t\t0.360241,\n\t\t\t0.166059,\n\t\t\t0.569502,\n\t\t\t-0.623529,\n\t\t\t0.406746,\n\t\t\t0.226782,\n\t\t\t0.579373,\n\t\t\t-0.498039,\n\t\t\t0.444073,\n\t\t\t0.28964,\n\t\t\t0.582094,\n\t\t\t-0.372549,\n\t\t\t0.473648,\n\t\t\t0.353774,\n\t\t\t0.577947,\n\t\t\t-0.247059,\n\t\t\t0.497636,\n\t\t\t0.418154,\n\t\t\t0.567911,\n\t\t\t-0.121569,\n\t\t\t0.519086,\n\t\t\t0.481741,\n\t\t\t0.553968,\n\t\t\t0.00392157,\n\t\t\t0.542884,\n\t\t\t0.542914,\n\t\t\t0.542875,\n\t\t\t0.129412,\n\t\t\t0.566303,\n\t\t\t0.603989,\n\t\t\t0.527499,\n\t\t\t0.254902,\n\t\t\t0.595218,\n\t\t\t0.662965,\n\t\t\t0.516857,\n\t\t\t0.380392,\n\t\t\t0.628641,\n\t\t\t0.720701,\n\t\t\t0.510673,\n\t\t\t0.505882,\n\t\t\t0.665373,\n\t\t\t0.777849,\n\t\t\t0.508165,\n\t\t\t0.631373,\n\t\t\t0.704182,\n\t\t\t0.834921,\n\t\t\t0.508303,\n\t\t\t0.756863,\n\t\t\t0.743846,\n\t\t\t0.892328,\n\t\t\t0.50999,\n\t\t\t0.882353,\n\t\t\t0.783158,\n\t\t\t0.950422,\n\t\t\t0.512181,\n\t\t\t1,\n\t\t\t0.818617,\n\t\t\t1,\n\t\t\t0.513888\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"erdc_purple2green_dark\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.107656,\n\t\t\t0,\n\t\t\t0.428682,\n\t\t\t-0.87451,\n\t\t\t0.1924,\n\t\t\t0,\n\t\t\t0.449799,\n\t\t\t-0.74902,\n\t\t\t0.255118,\n\t\t\t0.0648939,\n\t\t\t0.466726,\n\t\t\t-0.623529,\n\t\t\t0.304256,\n\t\t\t0.133066,\n\t\t\t0.476703,\n\t\t\t-0.498039,\n\t\t\t0.343202,\n\t\t\t0.19716,\n\t\t\t0.479793,\n\t\t\t-0.372549,\n\t\t\t0.373876,\n\t\t\t0.260353,\n\t\t\t0.476241,\n\t\t\t-0.247059,\n\t\t\t0.398497,\n\t\t\t0.322872,\n\t\t\t0.466953,\n\t\t\t-0.121569,\n\t\t\t0.420016,\n\t\t\t0.384252,\n\t\t\t0.453785,\n\t\t\t0.00392157,\n\t\t\t0.44319,\n\t\t\t0.443216,\n\t\t\t0.443186,\n\t\t\t0.129412,\n\t\t\t0.465553,\n\t\t\t0.502139,\n\t\t\t0.428233,\n\t\t\t0.254902,\n\t\t\t0.492959,\n\t\t\t0.559151,\n\t\t\t0.417591,\n\t\t\t0.380392,\n\t\t\t0.524654,\n\t\t\t0.615092,\n\t\t\t0.411016,\n\t\t\t0.505882,\n\t\t\t0.55959,\n\t\t\t0.670583,\n\t\t\t0.40779,\n\t\t\t0.631373,\n\t\t\t0.596614,\n\t\t\t0.726102,\n\t\t\t0.406948,\n\t\t\t0.756863,\n\t\t\t0.634544,\n\t\t\t0.782032,\n\t\t\t0.407439,\n\t\t\t0.882353,\n\t\t\t0.672183,\n\t\t\t0.838703,\n\t\t\t0.408237,\n\t\t\t1,\n\t\t\t0.706131,\n\t\t\t0.892759,\n\t\t\t0.408452\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"coolwarm\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.229806,\n\t\t\t0.298718,\n\t\t\t0.753683,\n\t\t\t-0.875,\n\t\t\t0.303869,\n\t\t\t0.406535,\n\t\t\t0.844959,\n\t\t\t-0.75,\n\t\t\t0.383013,\n\t\t\t0.509419,\n\t\t\t0.917388,\n\t\t\t-0.625,\n\t\t\t0.466667,\n\t\t\t0.604563,\n\t\t\t0.968155,\n\t\t\t-0.5,\n\t\t\t0.552953,\n\t\t\t0.688929,\n\t\t\t0.995376,\n\t\t\t-0.375,\n\t\t\t0.639176,\n\t\t\t0.7596,\n\t\t\t0.998151,\n\t\t\t-0.25,\n\t\t\t0.722193,\n\t\t\t0.813953,\n\t\t\t0.976575,\n\t\t\t-0.125,\n\t\t\t0.798692,\n\t\t\t0.849786,\n\t\t\t0.931689,\n\t\t\t0,\n\t\t\t0.865395,\n\t\t\t0.86541,\n\t\t\t0.865396,\n\t\t\t0.125,\n\t\t\t0.924128,\n\t\t\t0.827385,\n\t\t\t0.774508,\n\t\t\t0.25,\n\t\t\t0.958853,\n\t\t\t0.769768,\n\t\t\t0.678008,\n\t\t\t0.375,\n\t\t\t0.969954,\n\t\t\t0.694267,\n\t\t\t0.579375,\n\t\t\t0.5,\n\t\t\t0.958003,\n\t\t\t0.602842,\n\t\t\t0.481776,\n\t\t\t0.625,\n\t\t\t0.923945,\n\t\t\t0.497309,\n\t\t\t0.38797,\n\t\t\t0.75,\n\t\t\t0.869187,\n\t\t\t0.378313,\n\t\t\t0.300267,\n\t\t\t0.875,\n\t\t\t0.795632,\n\t\t\t0.241284,\n\t\t\t0.220526,\n\t\t\t1,\n\t\t\t0.705673,\n\t\t\t0.0155562,\n\t\t\t0.150233\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"BuRd\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.019608,\n\t\t\t0.188235,\n\t\t\t0.380392,\n\t\t\t-0.87451,\n\t\t\t0.088504,\n\t\t\t0.321107,\n\t\t\t0.564937,\n\t\t\t-0.74902,\n\t\t\t0.163399,\n\t\t\t0.444983,\n\t\t\t0.697501,\n\t\t\t-0.623529,\n\t\t\t0.247059,\n\t\t\t0.555709,\n\t\t\t0.754095,\n\t\t\t-0.498039,\n\t\t\t0.420684,\n\t\t\t0.676432,\n\t\t\t0.818685,\n\t\t\t-0.372549,\n\t\t\t0.606459,\n\t\t\t0.789773,\n\t\t\t0.880277,\n\t\t\t-0.247059,\n\t\t\t0.761476,\n\t\t\t0.868512,\n\t\t\t0.924567,\n\t\t\t-0.121569,\n\t\t\t0.878047,\n\t\t\t0.925721,\n\t\t\t0.951942,\n\t\t\t0.00392157,\n\t\t\t0.969089,\n\t\t\t0.966474,\n\t\t\t0.964937,\n\t\t\t0.129412,\n\t\t\t0.983852,\n\t\t\t0.897578,\n\t\t\t0.846828,\n\t\t\t0.254902,\n\t\t\t0.982468,\n\t\t\t0.800692,\n\t\t\t0.706113,\n\t\t\t0.380392,\n\t\t\t0.960323,\n\t\t\t0.66782,\n\t\t\t0.536332,\n\t\t\t0.505882,\n\t\t\t0.894579,\n\t\t\t0.503806,\n\t\t\t0.399769,\n\t\t\t0.631373,\n\t\t\t0.81707,\n\t\t\t0.33218,\n\t\t\t0.281046,\n\t\t\t0.756863,\n\t\t\t0.728489,\n\t\t\t0.155017,\n\t\t\t0.197386,\n\t\t\t0.882353,\n\t\t\t0.576932,\n\t\t\t0.055363,\n\t\t\t0.14925,\n\t\t\t1,\n\t\t\t0.403922,\n\t\t\t0,\n\t\t\t0.121569\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"Spectral_lowBlue\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.368627,\n\t\t\t0.309804,\n\t\t\t0.635294,\n\t\t\t-0.87451,\n\t\t\t0.260361,\n\t\t\t0.450058,\n\t\t\t0.70173,\n\t\t\t-0.74902,\n\t\t\t0.248058,\n\t\t\t0.591311,\n\t\t\t0.717186,\n\t\t\t-0.623529,\n\t\t\t0.376009,\n\t\t\t0.734025,\n\t\t\t0.658132,\n\t\t\t-0.498039,\n\t\t\t0.537947,\n\t\t\t0.814764,\n\t\t\t0.64506,\n\t\t\t-0.372549,\n\t\t\t0.702345,\n\t\t\t0.879585,\n\t\t\t0.636678,\n\t\t\t-0.247059,\n\t\t\t0.84752,\n\t\t\t0.938639,\n\t\t\t0.607151,\n\t\t\t-0.121569,\n\t\t\t0.940408,\n\t\t\t0.976163,\n\t\t\t0.656055,\n\t\t\t0.00392157,\n\t\t\t0.999923,\n\t\t\t0.997616,\n\t\t\t0.745021,\n\t\t\t0.129412,\n\t\t\t0.997463,\n\t\t\t0.921338,\n\t\t\t0.61707,\n\t\t\t0.254902,\n\t\t\t0.995002,\n\t\t\t0.824606,\n\t\t\t0.499885,\n\t\t\t0.380392,\n\t\t\t0.992541,\n\t\t\t0.701576,\n\t\t\t0.39654,\n\t\t\t0.505882,\n\t\t\t0.973472,\n\t\t\t0.547405,\n\t\t\t0.318108,\n\t\t\t0.631373,\n\t\t\t0.937793,\n\t\t\t0.398539,\n\t\t\t0.270127,\n\t\t\t0.756863,\n\t\t\t0.861515,\n\t\t\t0.282891,\n\t\t\t0.299654,\n\t\t\t0.882353,\n\t\t\t0.746482,\n\t\t\t0.144637,\n\t\t\t0.288812,\n\t\t\t1,\n\t\t\t0.619608,\n\t\t\t0.003922,\n\t\t\t0.258824\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"GnRP\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0.266667,\n\t\t\t0.105882,\n\t\t\t-0.87451,\n\t\t\t0.066436,\n\t\t\t0.394617,\n\t\t\t0.174779,\n\t\t\t-0.74902,\n\t\t\t0.168858,\n\t\t\t0.524567,\n\t\t\t0.25767,\n\t\t\t-0.623529,\n\t\t\t0.323875,\n\t\t\t0.657439,\n\t\t\t0.361015,\n\t\t\t-0.498039,\n\t\t\t0.504883,\n\t\t\t0.772318,\n\t\t\t0.506344,\n\t\t\t-0.372549,\n\t\t\t0.678431,\n\t\t\t0.870127,\n\t\t\t0.654902,\n\t\t\t-0.247059,\n\t\t\t0.803922,\n\t\t\t0.921799,\n\t\t\t0.780392,\n\t\t\t-0.121569,\n\t\t\t0.897116,\n\t\t\t0.951942,\n\t\t\t0.882814,\n\t\t\t0.00392157,\n\t\t\t0.967397,\n\t\t\t0.965936,\n\t\t\t0.967474,\n\t\t\t0.129412,\n\t\t\t0.928028,\n\t\t\t0.879815,\n\t\t\t0.930565,\n\t\t\t0.254902,\n\t\t\t0.866052,\n\t\t\t0.780777,\n\t\t\t0.882891,\n\t\t\t0.380392,\n\t\t\t0.77501,\n\t\t\t0.665129,\n\t\t\t0.821376,\n\t\t\t0.505882,\n\t\t\t0.675663,\n\t\t\t0.537024,\n\t\t\t0.737024,\n\t\t\t0.631373,\n\t\t\t0.57847,\n\t\t\t0.396155,\n\t\t\t0.645982,\n\t\t\t0.756863,\n\t\t\t0.492349,\n\t\t\t0.223914,\n\t\t\t0.547559,\n\t\t\t0.882353,\n\t\t\t0.375548,\n\t\t\t0.096886,\n\t\t\t0.423299,\n\t\t\t1,\n\t\t\t0.25098,\n\t\t\t0,\n\t\t\t0.294118\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"GYPi\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.152941,\n\t\t\t0.392157,\n\t\t\t0.098039,\n\t\t\t-0.87451,\n\t\t\t0.246444,\n\t\t\t0.505344,\n\t\t\t0.117724,\n\t\t\t-0.74902,\n\t\t\t0.351942,\n\t\t\t0.614533,\n\t\t\t0.161399,\n\t\t\t-0.623529,\n\t\t\t0.474971,\n\t\t\t0.717878,\n\t\t\t0.240138,\n\t\t\t-0.498039,\n\t\t\t0.611995,\n\t\t\t0.811226,\n\t\t\t0.392849,\n\t\t\t-0.372549,\n\t\t\t0.746328,\n\t\t\t0.893118,\n\t\t\t0.565321,\n\t\t\t-0.247059,\n\t\t\t0.859516,\n\t\t\t0.94233,\n\t\t\t0.747405,\n\t\t\t-0.121569,\n\t\t\t0.928105,\n\t\t\t0.96386,\n\t\t\t0.875663,\n\t\t\t0.00392157,\n\t\t\t0.969089,\n\t\t\t0.966859,\n\t\t\t0.968012,\n\t\t\t0.129412,\n\t\t\t0.983852,\n\t\t\t0.910265,\n\t\t\t0.948328,\n\t\t\t0.254902,\n\t\t\t0.979239,\n\t\t\t0.833218,\n\t\t\t0.914648,\n\t\t\t0.380392,\n\t\t\t0.949712,\n\t\t\t0.729873,\n\t\t\t0.862976,\n\t\t\t0.505882,\n\t\t\t0.905652,\n\t\t\t0.58293,\n\t\t\t0.763552,\n\t\t\t0.631373,\n\t\t\t0.85521,\n\t\t\t0.410073,\n\t\t\t0.652211,\n\t\t\t0.756863,\n\t\t\t0.793695,\n\t\t\t0.183699,\n\t\t\t0.531642,\n\t\t\t0.882353,\n\t\t\t0.683737,\n\t\t\t0.063899,\n\t\t\t0.420761,\n\t\t\t1,\n\t\t\t0.556863,\n\t\t\t0.003922,\n\t\t\t0.321569\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"GnYlRd\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0.407843,\n\t\t\t0.215686,\n\t\t\t-0.87451,\n\t\t\t0.063975,\n\t\t\t0.525952,\n\t\t\t0.277201,\n\t\t\t-0.74902,\n\t\t\t0.177932,\n\t\t\t0.633064,\n\t\t\t0.332718,\n\t\t\t-0.623529,\n\t\t\t0.364937,\n\t\t\t0.724106,\n\t\t\t0.379469,\n\t\t\t-0.498039,\n\t\t\t0.527951,\n\t\t\t0.797155,\n\t\t\t0.40223,\n\t\t\t-0.372549,\n\t\t\t0.678431,\n\t\t\t0.862822,\n\t\t\t0.433449,\n\t\t\t-0.247059,\n\t\t\t0.803922,\n\t\t\t0.916955,\n\t\t\t0.514648,\n\t\t\t-0.121569,\n\t\t\t0.909419,\n\t\t\t0.961861,\n\t\t\t0.625067,\n\t\t\t0.00392157,\n\t\t\t0.999923,\n\t\t\t0.997616,\n\t\t\t0.745021,\n\t\t\t0.129412,\n\t\t\t0.997463,\n\t\t\t0.921338,\n\t\t\t0.61707,\n\t\t\t0.254902,\n\t\t\t0.995002,\n\t\t\t0.824606,\n\t\t\t0.499885,\n\t\t\t0.380392,\n\t\t\t0.992541,\n\t\t\t0.701576,\n\t\t\t0.39654,\n\t\t\t0.505882,\n\t\t\t0.973472,\n\t\t\t0.547405,\n\t\t\t0.318108,\n\t\t\t0.631373,\n\t\t\t0.939023,\n\t\t\t0.389927,\n\t\t\t0.245521,\n\t\t\t0.756863,\n\t\t\t0.867666,\n\t\t\t0.239831,\n\t\t\t0.176624,\n\t\t\t0.882353,\n\t\t\t0.762399,\n\t\t\t0.110727,\n\t\t\t0.151326,\n\t\t\t1,\n\t\t\t0.647059,\n\t\t\t0,\n\t\t\t0.14902\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"GBBr\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0,\n\t\t\t0.235294,\n\t\t\t0.188235,\n\t\t\t-0.87451,\n\t\t\t0.002461,\n\t\t\t0.338639,\n\t\t\t0.301423,\n\t\t\t-0.74902,\n\t\t\t0.055902,\n\t\t\t0.448981,\n\t\t\t0.417609,\n\t\t\t-0.623529,\n\t\t\t0.183852,\n\t\t\t0.56955,\n\t\t\t0.538178,\n\t\t\t-0.498039,\n\t\t\t0.357785,\n\t\t\t0.700115,\n\t\t\t0.660746,\n\t\t\t-0.372549,\n\t\t\t0.540177,\n\t\t\t0.819531,\n\t\t\t0.77624,\n\t\t\t-0.247059,\n\t\t\t0.714879,\n\t\t\t0.890888,\n\t\t\t0.864821,\n\t\t\t-0.121569,\n\t\t\t0.851134,\n\t\t\t0.934564,\n\t\t\t0.922645,\n\t\t\t0.00392157,\n\t\t\t0.960861,\n\t\t\t0.959785,\n\t\t\t0.95694,\n\t\t\t0.129412,\n\t\t\t0.963322,\n\t\t\t0.927797,\n\t\t\t0.83391,\n\t\t\t0.254902,\n\t\t\t0.939946,\n\t\t\t0.868897,\n\t\t\t0.68935,\n\t\t\t0.380392,\n\t\t\t0.883353,\n\t\t\t0.775394,\n\t\t\t0.517109,\n\t\t\t0.505882,\n\t\t\t0.808074,\n\t\t\t0.625836,\n\t\t\t0.324106,\n\t\t\t0.631373,\n\t\t\t0.717647,\n\t\t\t0.476355,\n\t\t\t0.15494,\n\t\t\t0.756863,\n\t\t\t0.592157,\n\t\t\t0.358247,\n\t\t\t0.06882,\n\t\t\t0.882353,\n\t\t\t0.458593,\n\t\t\t0.26436,\n\t\t\t0.031142,\n\t\t\t1,\n\t\t\t0.329412,\n\t\t\t0.188235,\n\t\t\t0.019608\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"PuOr\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.498039,\n\t\t\t0.231373,\n\t\t\t0.031373,\n\t\t\t-0.87451,\n\t\t\t0.62599,\n\t\t\t0.30273,\n\t\t\t0.026451,\n\t\t\t-0.74902,\n\t\t\t0.746943,\n\t\t\t0.387082,\n\t\t\t0.037524,\n\t\t\t-0.623529,\n\t\t\t0.85767,\n\t\t\t0.490427,\n\t\t\t0.071972,\n\t\t\t-0.498039,\n\t\t\t0.936409,\n\t\t\t0.617762,\n\t\t\t0.236371,\n\t\t\t-0.372549,\n\t\t\t0.992695,\n\t\t\t0.743099,\n\t\t\t0.43291,\n\t\t\t-0.247059,\n\t\t\t0.995156,\n\t\t\t0.841523,\n\t\t\t0.63714,\n\t\t\t-0.121569,\n\t\t\t0.985313,\n\t\t\t0.913802,\n\t\t\t0.813687,\n\t\t\t0.00392157,\n\t\t\t0.966244,\n\t\t\t0.966398,\n\t\t\t0.967705,\n\t\t\t0.129412,\n\t\t\t0.889965,\n\t\t\t0.89504,\n\t\t\t0.938178,\n\t\t\t0.254902,\n\t\t\t0.806151,\n\t\t\t0.804306,\n\t\t\t0.894656,\n\t\t\t0.380392,\n\t\t\t0.712649,\n\t\t\t0.688658,\n\t\t\t0.833141,\n\t\t\t0.505882,\n\t\t\t0.594233,\n\t\t\t0.554325,\n\t\t\t0.744637,\n\t\t\t0.631373,\n\t\t\t0.474894,\n\t\t\t0.404229,\n\t\t\t0.652364,\n\t\t\t0.756863,\n\t\t\t0.366628,\n\t\t\t0.217224,\n\t\t\t0.563783,\n\t\t\t0.882353,\n\t\t\t0.266436,\n\t\t\t0.089965,\n\t\t\t0.434833,\n\t\t\t1,\n\t\t\t0.176471,\n\t\t\t0,\n\t\t\t0.294118\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"PRGn\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.25098,\n\t\t\t0,\n\t\t\t0.294118,\n\t\t\t-0.87451,\n\t\t\t0.383852,\n\t\t\t0.103345,\n\t\t\t0.431911,\n\t\t\t-0.74902,\n\t\t\t0.497732,\n\t\t\t0.234679,\n\t\t\t0.55371,\n\t\t\t-0.623529,\n\t\t\t0.583852,\n\t\t\t0.40692,\n\t\t\t0.652134,\n\t\t\t-0.498039,\n\t\t\t0.681968,\n\t\t\t0.545175,\n\t\t\t0.742561,\n\t\t\t-0.372549,\n\t\t\t0.7807,\n\t\t\t0.672357,\n\t\t\t0.825221,\n\t\t\t-0.247059,\n\t\t\t0.871742,\n\t\t\t0.788005,\n\t\t\t0.886736,\n\t\t\t-0.121569,\n\t\t\t0.930488,\n\t\t\t0.885198,\n\t\t\t0.932872,\n\t\t\t0.00392157,\n\t\t\t0.966321,\n\t\t\t0.968089,\n\t\t\t0.965859,\n\t\t\t0.129412,\n\t\t\t0.892503,\n\t\t\t0.950865,\n\t\t\t0.877278,\n\t\t\t0.254902,\n\t\t\t0.796078,\n\t\t\t0.91857,\n\t\t\t0.772549,\n\t\t\t0.380392,\n\t\t\t0.670588,\n\t\t\t0.866897,\n\t\t\t0.647059,\n\t\t\t0.505882,\n\t\t\t0.493195,\n\t\t\t0.765398,\n\t\t\t0.496655,\n\t\t\t0.631373,\n\t\t\t0.314187,\n\t\t\t0.649135,\n\t\t\t0.354556,\n\t\t\t0.756863,\n\t\t\t0.15917,\n\t\t\t0.516263,\n\t\t\t0.251211,\n\t\t\t0.882353,\n\t\t\t0.062284,\n\t\t\t0.386621,\n\t\t\t0.170473,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0.266667,\n\t\t\t0.105882\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"PiYG\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.556863,\n\t\t\t0.003922,\n\t\t\t0.321569,\n\t\t\t-0.87451,\n\t\t\t0.692195,\n\t\t\t0.067897,\n\t\t\t0.427374,\n\t\t\t-0.74902,\n\t\t\t0.797539,\n\t\t\t0.197847,\n\t\t\t0.539177,\n\t\t\t-0.623529,\n\t\t\t0.859054,\n\t\t\t0.424221,\n\t\t\t0.659746,\n\t\t\t-0.498039,\n\t\t\t0.908574,\n\t\t\t0.592618,\n\t\t\t0.770319,\n\t\t\t-0.372549,\n\t\t\t0.951557,\n\t\t\t0.736332,\n\t\t\t0.866205,\n\t\t\t-0.247059,\n\t\t\t0.981084,\n\t\t\t0.839677,\n\t\t\t0.917878,\n\t\t\t-0.121569,\n\t\t\t0.98293,\n\t\t\t0.913802,\n\t\t\t0.949558,\n\t\t\t0.00392157,\n\t\t\t0.96732,\n\t\t\t0.968474,\n\t\t\t0.965629,\n\t\t\t0.129412,\n\t\t\t0.92549,\n\t\t\t0.963552,\n\t\t\t0.869666,\n\t\t\t0.254902,\n\t\t\t0.852441,\n\t\t\t0.939254,\n\t\t\t0.736025,\n\t\t\t0.380392,\n\t\t\t0.739254,\n\t\t\t0.890042,\n\t\t\t0.553941,\n\t\t\t0.505882,\n\t\t\t0.60323,\n\t\t\t0.805536,\n\t\t\t0.382238,\n\t\t\t0.631373,\n\t\t\t0.467282,\n\t\t\t0.711419,\n\t\t\t0.235217,\n\t\t\t0.756863,\n\t\t\t0.344252,\n\t\t\t0.608074,\n\t\t\t0.156478,\n\t\t\t0.882353,\n\t\t\t0.2406,\n\t\t\t0.49827,\n\t\t\t0.116494,\n\t\t\t1,\n\t\t\t0.152941,\n\t\t\t0.392157,\n\t\t\t0.098039\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"OrPu\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.176471,\n\t\t\t0,\n\t\t\t0.294118,\n\t\t\t-0.87451,\n\t\t\t0.272434,\n\t\t\t0.095963,\n\t\t\t0.444214,\n\t\t\t-0.74902,\n\t\t\t0.373395,\n\t\t\t0.228912,\n\t\t\t0.56932,\n\t\t\t-0.623529,\n\t\t\t0.481661,\n\t\t\t0.415917,\n\t\t\t0.657901,\n\t\t\t-0.498039,\n\t\t\t0.601922,\n\t\t\t0.562937,\n\t\t\t0.750481,\n\t\t\t-0.372549,\n\t\t\t0.718493,\n\t\t\t0.695886,\n\t\t\t0.836986,\n\t\t\t-0.247059,\n\t\t\t0.811995,\n\t\t\t0.811534,\n\t\t\t0.898501,\n\t\t\t-0.121569,\n\t\t\t0.894733,\n\t\t\t0.8995,\n\t\t\t0.940023,\n\t\t\t0.00392157,\n\t\t\t0.969166,\n\t\t\t0.966859,\n\t\t\t0.963629,\n\t\t\t0.129412,\n\t\t\t0.98639,\n\t\t\t0.910265,\n\t\t\t0.803691,\n\t\t\t0.254902,\n\t\t\t0.995002,\n\t\t\t0.835371,\n\t\t\t0.624375,\n\t\t\t0.380392,\n\t\t\t0.992541,\n\t\t\t0.736947,\n\t\t\t0.420146,\n\t\t\t0.505882,\n\t\t\t0.931949,\n\t\t\t0.609458,\n\t\t\t0.224221,\n\t\t\t0.631373,\n\t\t\t0.85075,\n\t\t\t0.483968,\n\t\t\t0.069819,\n\t\t\t0.756863,\n\t\t\t0.740023,\n\t\t\t0.380623,\n\t\t\t0.035371,\n\t\t\t0.882353,\n\t\t\t0.617993,\n\t\t\t0.29827,\n\t\t\t0.026759,\n\t\t\t1,\n\t\t\t0.498039,\n\t\t\t0.231373,\n\t\t\t0.031373\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"BrBG\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.329412,\n\t\t\t0.188235,\n\t\t\t0.019608,\n\t\t\t-0.87451,\n\t\t\t0.467205,\n\t\t\t0.269435,\n\t\t\t0.031911,\n\t\t\t-0.74902,\n\t\t\t0.6,\n\t\t\t0.365629,\n\t\t\t0.074202,\n\t\t\t-0.623529,\n\t\t\t0.72549,\n\t\t\t0.483737,\n\t\t\t0.160323,\n\t\t\t-0.498039,\n\t\t\t0.812995,\n\t\t\t0.635832,\n\t\t\t0.336409,\n\t\t\t-0.372549,\n\t\t\t0.88689,\n\t\t\t0.781238,\n\t\t\t0.527874,\n\t\t\t-0.247059,\n\t\t\t0.943483,\n\t\t\t0.87474,\n\t\t\t0.700115,\n\t\t\t-0.121569,\n\t\t\t0.963168,\n\t\t\t0.929796,\n\t\t\t0.841599,\n\t\t\t0.00392157,\n\t\t\t0.957247,\n\t\t\t0.959938,\n\t\t\t0.959554,\n\t\t\t0.129412,\n\t\t\t0.84406,\n\t\t\t0.932872,\n\t\t\t0.920185,\n\t\t\t0.254902,\n\t\t\t0.70396,\n\t\t\t0.886428,\n\t\t\t0.859285,\n\t\t\t0.380392,\n\t\t\t0.529258,\n\t\t\t0.815071,\n\t\t\t0.770704,\n\t\t\t0.505882,\n\t\t\t0.346251,\n\t\t\t0.691811,\n\t\t\t0.653057,\n\t\t\t0.631373,\n\t\t\t0.175855,\n\t\t\t0.562015,\n\t\t\t0.530642,\n\t\t\t0.756863,\n\t\t\t0.047905,\n\t\t\t0.441446,\n\t\t\t0.410073,\n\t\t\t0.882353,\n\t\t\t0.002307,\n\t\t\t0.33218,\n\t\t\t0.294348,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0.235294,\n\t\t\t0.188235\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"GyRd\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.101961,\n\t\t\t0.101961,\n\t\t\t0.101961,\n\t\t\t-0.87451,\n\t\t\t0.227451,\n\t\t\t0.227451,\n\t\t\t0.227451,\n\t\t\t-0.74902,\n\t\t\t0.359939,\n\t\t\t0.359939,\n\t\t\t0.359939,\n\t\t\t-0.623529,\n\t\t\t0.502653,\n\t\t\t0.502653,\n\t\t\t0.502653,\n\t\t\t-0.498039,\n\t\t\t0.631373,\n\t\t\t0.631373,\n\t\t\t0.631373,\n\t\t\t-0.372549,\n\t\t\t0.749865,\n\t\t\t0.749865,\n\t\t\t0.749865,\n\t\t\t-0.247059,\n\t\t\t0.843368,\n\t\t\t0.843368,\n\t\t\t0.843368,\n\t\t\t-0.121569,\n\t\t\t0.926105,\n\t\t\t0.926105,\n\t\t\t0.926105,\n\t\t\t0.00392157,\n\t\t\t0.999846,\n\t\t\t0.997232,\n\t\t\t0.995694,\n\t\t\t0.129412,\n\t\t\t0.994925,\n\t\t\t0.908651,\n\t\t\t0.857901,\n\t\t\t0.254902,\n\t\t\t0.982468,\n\t\t\t0.800692,\n\t\t\t0.706113,\n\t\t\t0.380392,\n\t\t\t0.960323,\n\t\t\t0.66782,\n\t\t\t0.536332,\n\t\t\t0.505882,\n\t\t\t0.894579,\n\t\t\t0.503806,\n\t\t\t0.399769,\n\t\t\t0.631373,\n\t\t\t0.81707,\n\t\t\t0.33218,\n\t\t\t0.281046,\n\t\t\t0.756863,\n\t\t\t0.728489,\n\t\t\t0.155017,\n\t\t\t0.197386,\n\t\t\t0.882353,\n\t\t\t0.576932,\n\t\t\t0.055363,\n\t\t\t0.14925,\n\t\t\t1,\n\t\t\t0.403922,\n\t\t\t0,\n\t\t\t0.121569\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"erdc_divHi_purpleGreen\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.297553,\n\t\t\t0,\n\t\t\t0.489074,\n\t\t\t-0.87451,\n\t\t\t0.40259,\n\t\t\t0.151146,\n\t\t\t0.567754,\n\t\t\t-0.74902,\n\t\t\t0.516038,\n\t\t\t0.284843,\n\t\t\t0.658231,\n\t\t\t-0.623529,\n\t\t\t0.629783,\n\t\t\t0.423646,\n\t\t\t0.750938,\n\t\t\t-0.498039,\n\t\t\t0.735198,\n\t\t\t0.563697,\n\t\t\t0.835956,\n\t\t\t-0.372549,\n\t\t\t0.82408,\n\t\t\t0.695541,\n\t\t\t0.903582,\n\t\t\t-0.247059,\n\t\t\t0.889091,\n\t\t\t0.807454,\n\t\t\t0.944862,\n\t\t\t-0.121569,\n\t\t\t0.92334,\n\t\t\t0.886917,\n\t\t\t0.951839,\n\t\t\t0.00392157,\n\t\t\t0.921045,\n\t\t\t0.921084,\n\t\t\t0.921003,\n\t\t\t0.129412,\n\t\t\t0.877324,\n\t\t\t0.907455,\n\t\t\t0.845381,\n\t\t\t0.254902,\n\t\t\t0.797649,\n\t\t\t0.849713,\n\t\t\t0.734695,\n\t\t\t0.380392,\n\t\t\t0.691646,\n\t\t\t0.75964,\n\t\t\t0.600532,\n\t\t\t0.505882,\n\t\t\t0.568981,\n\t\t\t0.649159,\n\t\t\t0.453807,\n\t\t\t0.631373,\n\t\t\t0.438945,\n\t\t\t0.529756,\n\t\t\t0.304259,\n\t\t\t0.756863,\n\t\t\t0.30973,\n\t\t\t0.412001,\n\t\t\t0.158303,\n\t\t\t0.882353,\n\t\t\t0.187078,\n\t\t\t0.305111,\n\t\t\t0.00251458,\n\t\t\t1,\n\t\t\t0.101655,\n\t\t\t0.220836,\n\t\t\t0\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"erdc_divHi_purpleGreen_dim\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.404088,\n\t\t\t0.131038,\n\t\t\t0.592767,\n\t\t\t-0.87451,\n\t\t\t0.486469,\n\t\t\t0.230957,\n\t\t\t0.651243,\n\t\t\t-0.74902,\n\t\t\t0.575165,\n\t\t\t0.339335,\n\t\t\t0.717723,\n\t\t\t-0.623529,\n\t\t\t0.662741,\n\t\t\t0.454332,\n\t\t\t0.784263,\n\t\t\t-0.498039,\n\t\t\t0.742071,\n\t\t\t0.570213,\n\t\t\t0.842918,\n\t\t\t-0.372549,\n\t\t\t0.806935,\n\t\t\t0.678992,\n\t\t\t0.886227,\n\t\t\t-0.247059,\n\t\t\t0.852219,\n\t\t\t0.771315,\n\t\t\t0.90763,\n\t\t\t-0.121569,\n\t\t\t0.873345,\n\t\t\t0.837327,\n\t\t\t0.901572,\n\t\t\t0.00392157,\n\t\t\t0.866783,\n\t\t\t0.86682,\n\t\t\t0.866745,\n\t\t\t0.129412,\n\t\t\t0.82839,\n\t\t\t0.858225,\n\t\t\t0.796812,\n\t\t\t0.254902,\n\t\t\t0.762578,\n\t\t\t0.814287,\n\t\t\t0.700202,\n\t\t\t0.380392,\n\t\t\t0.676429,\n\t\t\t0.744229,\n\t\t\t0.585735,\n\t\t\t0.505882,\n\t\t\t0.577033,\n\t\t\t0.65732,\n\t\t\t0.461526,\n\t\t\t0.631373,\n\t\t\t0.47128,\n\t\t\t0.562476,\n\t\t\t0.33476,\n\t\t\t0.756863,\n\t\t\t0.365461,\n\t\t\t0.467957,\n\t\t\t0.21076,\n\t\t\t0.882353,\n\t\t\t0.264758,\n\t\t\t0.381138,\n\t\t\t0.0878313,\n\t\t\t1,\n\t\t\t0.182591,\n\t\t\t0.312249,\n\t\t\t0\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"erdc_divLow_icePeach\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.480048,\n\t\t\t0.817441,\n\t\t\t0.998056,\n\t\t\t-0.87451,\n\t\t\t0.425898,\n\t\t\t0.726921,\n\t\t\t0.883187,\n\t\t\t-0.74902,\n\t\t\t0.366682,\n\t\t\t0.629445,\n\t\t\t0.761936,\n\t\t\t-0.623529,\n\t\t\t0.308756,\n\t\t\t0.531002,\n\t\t\t0.640217,\n\t\t\t-0.498039,\n\t\t\t0.258021,\n\t\t\t0.43705,\n\t\t\t0.523433,\n\t\t\t-0.372549,\n\t\t\t0.219244,\n\t\t\t0.352381,\n\t\t\t0.416348,\n\t\t\t-0.247059,\n\t\t\t0.195127,\n\t\t\t0.281032,\n\t\t\t0.322979,\n\t\t\t-0.121569,\n\t\t\t0.186286,\n\t\t\t0.22627,\n\t\t\t0.246525,\n\t\t\t0.00392157,\n\t\t\t0.192352,\n\t\t\t0.19236,\n\t\t\t0.192364,\n\t\t\t0.129412,\n\t\t\t0.255927,\n\t\t\t0.214469,\n\t\t\t0.191756,\n\t\t\t0.254902,\n\t\t\t0.340459,\n\t\t\t0.254426,\n\t\t\t0.206666,\n\t\t\t0.380392,\n\t\t\t0.444655,\n\t\t\t0.309315,\n\t\t\t0.234029,\n\t\t\t0.505882,\n\t\t\t0.565353,\n\t\t\t0.376004,\n\t\t\t0.270969,\n\t\t\t0.631373,\n\t\t\t0.697917,\n\t\t\t0.450748,\n\t\t\t0.314293,\n\t\t\t0.756863,\n\t\t\t0.836657,\n\t\t\t0.529064,\n\t\t\t0.360227,\n\t\t\t0.882353,\n\t\t\t0.972695,\n\t\t\t0.614884,\n\t\t\t0.413123,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.705904,\n\t\t\t0.472699\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"erdc_divLow_purpleGreen\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.956034,\n\t\t\t0.666487,\n\t\t\t0.952663,\n\t\t\t-0.87451,\n\t\t\t0.874457,\n\t\t\t0.572698,\n\t\t\t0.936352,\n\t\t\t-0.74902,\n\t\t\t0.753465,\n\t\t\t0.488253,\n\t\t\t0.909063,\n\t\t\t-0.623529,\n\t\t\t0.63309,\n\t\t\t0.413507,\n\t\t\t0.763833,\n\t\t\t-0.498039,\n\t\t\t0.514491,\n\t\t\t0.345878,\n\t\t\t0.620015,\n\t\t\t-0.372549,\n\t\t\t0.405008,\n\t\t\t0.288141,\n\t\t\t0.484376,\n\t\t\t-0.247059,\n\t\t\t0.311388,\n\t\t\t0.241986,\n\t\t\t0.363556,\n\t\t\t-0.121569,\n\t\t\t0.238722,\n\t\t\t0.209044,\n\t\t\t0.263449,\n\t\t\t0.00392157,\n\t\t\t0.192352,\n\t\t\t0.192366,\n\t\t\t0.192362,\n\t\t\t0.129412,\n\t\t\t0.200379,\n\t\t\t0.233201,\n\t\t\t0.168618,\n\t\t\t0.254902,\n\t\t\t0.230151,\n\t\t\t0.291737,\n\t\t\t0.165227,\n\t\t\t0.380392,\n\t\t\t0.279481,\n\t\t\t0.366076,\n\t\t\t0.178607,\n\t\t\t0.505882,\n\t\t\t0.344927,\n\t\t\t0.453267,\n\t\t\t0.205703,\n\t\t\t0.631373,\n\t\t\t0.421554,\n\t\t\t0.549449,\n\t\t\t0.242643,\n\t\t\t0.756863,\n\t\t\t0.503334,\n\t\t\t0.649999,\n\t\t\t0.284377,\n\t\t\t0.882353,\n\t\t\t0.583497,\n\t\t\t0.749672,\n\t\t\t0.324969,\n\t\t\t1,\n\t\t\t0.650705,\n\t\t\t0.837228,\n\t\t\t0.356264\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"Haze_green\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t1,\n\t\t\t0.835294,\n\t\t\t0.886275,\n\t\t\t-0.87451,\n\t\t\t0.937255,\n\t\t\t0.756863,\n\t\t\t0.870443,\n\t\t\t-0.74902,\n\t\t\t0.875817,\n\t\t\t0.666376,\n\t\t\t0.857807,\n\t\t\t-0.623529,\n\t\t\t0.778359,\n\t\t\t0.583007,\n\t\t\t0.808134,\n\t\t\t-0.498039,\n\t\t\t0.676253,\n\t\t\t0.494118,\n\t\t\t0.745098,\n\t\t\t-0.372549,\n\t\t\t0.561365,\n\t\t\t0.390123,\n\t\t\t0.682353,\n\t\t\t-0.247059,\n\t\t\t0.438344,\n\t\t\t0.262745,\n\t\t\t0.621496,\n\t\t\t-0.121569,\n\t\t\t0.321133,\n\t\t\t0.141031,\n\t\t\t0.558751,\n\t\t\t0.00392157,\n\t\t\t0.203922,\n\t\t\t0.0217865,\n\t\t\t0.495861,\n\t\t\t0.129412,\n\t\t\t0.265505,\n\t\t\t0.129412,\n\t\t\t0.433261,\n\t\t\t0.254902,\n\t\t\t0.311692,\n\t\t\t0.255338,\n\t\t\t0.37008,\n\t\t\t0.380392,\n\t\t\t0.356282,\n\t\t\t0.377342,\n\t\t\t0.310821,\n\t\t\t0.505882,\n\t\t\t0.39971,\n\t\t\t0.488889,\n\t\t\t0.258243,\n\t\t\t0.631373,\n\t\t\t0.442556,\n\t\t\t0.604357,\n\t\t\t0.205519,\n\t\t\t0.756863,\n\t\t\t0.48671,\n\t\t\t0.71968,\n\t\t\t0.152941,\n\t\t\t0.882353,\n\t\t\t0.529847,\n\t\t\t0.830356,\n\t\t\t0.100944,\n\t\t\t1,\n\t\t\t0.572549,\n\t\t\t0.933333,\n\t\t\t0.054902\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"Haze_lime\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.704034,\n\t\t\t0.784196,\n\t\t\t1,\n\t\t\t-0.87451,\n\t\t\t0.633111,\n\t\t\t0.691418,\n\t\t\t0.956078,\n\t\t\t-0.74902,\n\t\t\t0.564021,\n\t\t\t0.600606,\n\t\t\t0.912157,\n\t\t\t-0.623529,\n\t\t\t0.496827,\n\t\t\t0.51189,\n\t\t\t0.868235,\n\t\t\t-0.498039,\n\t\t\t0.43157,\n\t\t\t0.425416,\n\t\t\t0.824314,\n\t\t\t-0.372549,\n\t\t\t0.368248,\n\t\t\t0.341347,\n\t\t\t0.780392,\n\t\t\t-0.247059,\n\t\t\t0.306767,\n\t\t\t0.259855,\n\t\t\t0.736471,\n\t\t\t-0.121569,\n\t\t\t0.246862,\n\t\t\t0.181069,\n\t\t\t0.692549,\n\t\t\t0.00392157,\n\t\t\t0.191619,\n\t\t\t0.109542,\n\t\t\t0.648627,\n\t\t\t0.129412,\n\t\t\t0.257404,\n\t\t\t0.194031,\n\t\t\t0.604706,\n\t\t\t0.254902,\n\t\t\t0.321794,\n\t\t\t0.278775,\n\t\t\t0.560784,\n\t\t\t0.380392,\n\t\t\t0.387909,\n\t\t\t0.364617,\n\t\t\t0.516863,\n\t\t\t0.505882,\n\t\t\t0.456569,\n\t\t\t0.451881,\n\t\t\t0.472941,\n\t\t\t0.631373,\n\t\t\t0.527424,\n\t\t\t0.540773,\n\t\t\t0.42902,\n\t\t\t0.756863,\n\t\t\t0.599759,\n\t\t\t0.631427,\n\t\t\t0.385098,\n\t\t\t0.882353,\n\t\t\t0.673065,\n\t\t\t0.723898,\n\t\t\t0.341176,\n\t\t\t1,\n\t\t\t0.742751,\n\t\t\t0.812252,\n\t\t\t0.3\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"RGB\",\n\t\tName: \"Haze\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t1,\n\t\t\t0.835294,\n\t\t\t0.996078,\n\t\t\t-0.00392157,\n\t\t\t0.023529,\n\t\t\t0.141176,\n\t\t\t0.498039,\n\t\t\t0.00392157,\n\t\t\t0.015686,\n\t\t\t0.137255,\n\t\t\t0.494118,\n\t\t\t1,\n\t\t\t0.984314,\n\t\t\t0.764706,\n\t\t\t0\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"Haze_cyan\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.956863,\n\t\t\t1,\n\t\t\t0.835294,\n\t\t\t-0.87451,\n\t\t\t0.933188,\n\t\t\t0.921714,\n\t\t\t0.760784,\n\t\t\t-0.74902,\n\t\t\t0.870588,\n\t\t\t0.803486,\n\t\t\t0.671605,\n\t\t\t-0.623529,\n\t\t\t0.807843,\n\t\t\t0.684096,\n\t\t\t0.583297,\n\t\t\t-0.498039,\n\t\t\t0.745098,\n\t\t\t0.569208,\n\t\t\t0.494118,\n\t\t\t-0.372549,\n\t\t\t0.682353,\n\t\t\t0.437763,\n\t\t\t0.390123,\n\t\t\t-0.247059,\n\t\t\t0.621496,\n\t\t\t0.288163,\n\t\t\t0.262745,\n\t\t\t-0.121569,\n\t\t\t0.558751,\n\t\t\t0.144517,\n\t\t\t0.141031,\n\t\t\t0.00392157,\n\t\t\t0.495861,\n\t\t\t0.0217865,\n\t\t\t0.0413943,\n\t\t\t0.129412,\n\t\t\t0.433261,\n\t\t\t0.137255,\n\t\t\t0.129412,\n\t\t\t0.254902,\n\t\t\t0.37008,\n\t\t\t0.263181,\n\t\t\t0.255338,\n\t\t\t0.380392,\n\t\t\t0.306318,\n\t\t\t0.381845,\n\t\t\t0.372694,\n\t\t\t0.505882,\n\t\t\t0.243137,\n\t\t\t0.503994,\n\t\t\t0.494263,\n\t\t\t0.631373,\n\t\t\t0.180392,\n\t\t\t0.629484,\n\t\t\t0.619753,\n\t\t\t0.756863,\n\t\t\t0.117647,\n\t\t\t0.754975,\n\t\t\t0.747131,\n\t\t\t0.882353,\n\t\t\t0.054902,\n\t\t\t0.876398,\n\t\t\t0.866812,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0.988235,\n\t\t\t0.976471\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"nic_Edge\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.191208,\n\t\t\t0.191208,\n\t\t\t0.191208,\n\t\t\t-0.87451,\n\t\t\t0.239484,\n\t\t\t0.00545035,\n\t\t\t0.614821,\n\t\t\t-0.74902,\n\t\t\t0.220593,\n\t\t\t0.0617459,\n\t\t\t0.863547,\n\t\t\t-0.623529,\n\t\t\t0.17509,\n\t\t\t0.278988,\n\t\t\t0.97794,\n\t\t\t-0.498039,\n\t\t\t0.143526,\n\t\t\t0.576069,\n\t\t\t0.998553,\n\t\t\t-0.372549,\n\t\t\t0.166456,\n\t\t\t0.871883,\n\t\t\t0.96594,\n\t\t\t-0.247059,\n\t\t\t0.376202,\n\t\t\t0.993555,\n\t\t\t0.981833,\n\t\t\t-0.121569,\n\t\t\t0.681996,\n\t\t\t0.991297,\n\t\t\t0.999239,\n\t\t\t0.00392157,\n\t\t\t0.954172,\n\t\t\t0.952734,\n\t\t\t0.94374,\n\t\t\t0.129412,\n\t\t\t0.999735,\n\t\t\t0.99301,\n\t\t\t0.662896,\n\t\t\t0.254902,\n\t\t\t0.979399,\n\t\t\t0.991466,\n\t\t\t0.357973,\n\t\t\t0.380392,\n\t\t\t0.968771,\n\t\t\t0.854967,\n\t\t\t0.162659,\n\t\t\t0.505882,\n\t\t\t0.999245,\n\t\t\t0.556697,\n\t\t\t0.144323,\n\t\t\t0.631373,\n\t\t\t0.973959,\n\t\t\t0.26223,\n\t\t\t0.177946,\n\t\t\t0.756863,\n\t\t\t0.852358,\n\t\t\t0.0526707,\n\t\t\t0.222974,\n\t\t\t0.882353,\n\t\t\t0.593889,\n\t\t\t0.00912724,\n\t\t\t0.238855,\n\t\t\t1,\n\t\t\t0.191208,\n\t\t\t0.191208,\n\t\t\t0.191208\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"erdc_iceFire_H\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t4.05432e-7,\n\t\t\t0,\n\t\t\t0.00000590122,\n\t\t\t-0.87451,\n\t\t\t0,\n\t\t\t0.120401,\n\t\t\t0.302675,\n\t\t\t-0.74902,\n\t\t\t0,\n\t\t\t0.216583,\n\t\t\t0.524574,\n\t\t\t-0.623529,\n\t\t\t0.0552475,\n\t\t\t0.345025,\n\t\t\t0.6595,\n\t\t\t-0.498039,\n\t\t\t0.128047,\n\t\t\t0.492588,\n\t\t\t0.720288,\n\t\t\t-0.372549,\n\t\t\t0.188955,\n\t\t\t0.641309,\n\t\t\t0.792092,\n\t\t\t-0.247059,\n\t\t\t0.327673,\n\t\t\t0.784935,\n\t\t\t0.873434,\n\t\t\t-0.121569,\n\t\t\t0.60824,\n\t\t\t0.892164,\n\t\t\t0.935547,\n\t\t\t0.00392157,\n\t\t\t0.881371,\n\t\t\t0.912178,\n\t\t\t0.818099,\n\t\t\t0.129412,\n\t\t\t0.951407,\n\t\t\t0.835621,\n\t\t\t0.449279,\n\t\t\t0.254902,\n\t\t\t0.904481,\n\t\t\t0.690489,\n\t\t\t0,\n\t\t\t0.380392,\n\t\t\t0.85407,\n\t\t\t0.510864,\n\t\t\t0,\n\t\t\t0.505882,\n\t\t\t0.777093,\n\t\t\t0.33018,\n\t\t\t0.00088199,\n\t\t\t0.631373,\n\t\t\t0.672862,\n\t\t\t0.139087,\n\t\t\t0.00269398,\n\t\t\t0.756863,\n\t\t\t0.508815,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0.882353,\n\t\t\t0.299417,\n\t\t\t0.000366289,\n\t\t\t0.000547829,\n\t\t\t1,\n\t\t\t0.0157519,\n\t\t\t0.00332021,\n\t\t\t4.55569e-8\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"erdc_iceFire_L\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.870485,\n\t\t\t0.913768,\n\t\t\t0.832905,\n\t\t\t-0.87451,\n\t\t\t0.586919,\n\t\t\t0.887865,\n\t\t\t0.934003,\n\t\t\t-0.74902,\n\t\t\t0.31583,\n\t\t\t0.776442,\n\t\t\t0.867858,\n\t\t\t-0.623529,\n\t\t\t0.18302,\n\t\t\t0.632034,\n\t\t\t0.787722,\n\t\t\t-0.498039,\n\t\t\t0.117909,\n\t\t\t0.484134,\n\t\t\t0.713825,\n\t\t\t-0.372549,\n\t\t\t0.0507239,\n\t\t\t0.335979,\n\t\t\t0.654741,\n\t\t\t-0.247059,\n\t\t\t0,\n\t\t\t0.209874,\n\t\t\t0.511832,\n\t\t\t-0.121569,\n\t\t\t0,\n\t\t\t0.114689,\n\t\t\t0.28935,\n\t\t\t0.00392157,\n\t\t\t0.0157519,\n\t\t\t0.00332021,\n\t\t\t4.55569e-8,\n\t\t\t0.129412,\n\t\t\t0.312914,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0.254902,\n\t\t\t0.520865,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0.380392,\n\t\t\t0.680105,\n\t\t\t0.15255,\n\t\t\t0.0025996,\n\t\t\t0.505882,\n\t\t\t0.785109,\n\t\t\t0.339479,\n\t\t\t0.000797922,\n\t\t\t0.631373,\n\t\t\t0.857354,\n\t\t\t0.522494,\n\t\t\t0,\n\t\t\t0.756863,\n\t\t\t0.910974,\n\t\t\t0.699774,\n\t\t\t0,\n\t\t\t0.882353,\n\t\t\t0.951921,\n\t\t\t0.842817,\n\t\t\t0.478545,\n\t\t\t1,\n\t\t\t0.881371,\n\t\t\t0.912178,\n\t\t\t0.818099\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"RGB\",\n\t\tName: \"hsv\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t-0.666666,\n\t\t\t1,\n\t\t\t0,\n\t\t\t1,\n\t\t\t-0.333333,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.33333,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0.66666,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tName: \"hue_L60\",\n\t\tRGBPoints: [\n\t\t\t-1,\n\t\t\t0.964784,\n\t\t\t0.400592,\n\t\t\t0.349549,\n\t\t\t-0.87451,\n\t\t\t0.964915,\n\t\t\t0.372498,\n\t\t\t0.53785,\n\t\t\t-0.74902,\n\t\t\t0.892353,\n\t\t\t0.401039,\n\t\t\t0.759569,\n\t\t\t-0.623529,\n\t\t\t0.79263,\n\t\t\t0.446956,\n\t\t\t0.903017,\n\t\t\t-0.498039,\n\t\t\t0.682208,\n\t\t\t0.49954,\n\t\t\t0.966673,\n\t\t\t-0.372549,\n\t\t\t0.56392,\n\t\t\t0.553082,\n\t\t\t0.968836,\n\t\t\t-0.247059,\n\t\t\t0.442031,\n\t\t\t0.606396,\n\t\t\t0.901601,\n\t\t\t-0.121569,\n\t\t\t0.305499,\n\t\t\t0.65701,\n\t\t\t0.765784,\n\t\t\t0.00392157,\n\t\t\t0.197251,\n\t\t\t0.687914,\n\t\t\t0.620914,\n\t\t\t0.129412,\n\t\t\t0.193882,\n\t\t\t0.701887,\n\t\t\t0.472654,\n\t\t\t0.254902,\n\t\t\t0.249866,\n\t\t\t0.706123,\n\t\t\t0.320005,\n\t\t\t0.380392,\n\t\t\t0.35132,\n\t\t\t0.697417,\n\t\t\t0.202919,\n\t\t\t0.505882,\n\t\t\t0.498097,\n\t\t\t0.669467,\n\t\t\t0.125232,\n\t\t\t0.631373,\n\t\t\t0.637477,\n\t\t\t0.626239,\n\t\t\t0.107431,\n\t\t\t0.756863,\n\t\t\t0.762115,\n\t\t\t0.56872,\n\t\t\t0.155812,\n\t\t\t0.882353,\n\t\t\t0.889434,\n\t\t\t0.481116,\n\t\t\t0.240445,\n\t\t\t1,\n\t\t\t0.964784,\n\t\t\t0.400592,\n\t\t\t0.349549\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0.8941176470588236,\n\t\t\t0.1019607843137255,\n\t\t\t0.1098039215686274,\n\t\t\t0.2156862745098039,\n\t\t\t0.4941176470588236,\n\t\t\t0.7215686274509804,\n\t\t\t0.3019607843137255,\n\t\t\t0.6862745098039216,\n\t\t\t0.2901960784313726,\n\t\t\t0.596078431372549,\n\t\t\t0.3058823529411765,\n\t\t\t0.6392156862745098,\n\t\t\t1,\n\t\t\t0.4980392156862745,\n\t\t\t0,\n\t\t\t0.6509803921568628,\n\t\t\t0.3372549019607843,\n\t\t\t0.1568627450980392\n\t\t],\n\t\tName: \"Spectrum\",\n\t\tNanColor: [\n\t\t\t0.6509803921568628,\n\t\t\t0.3372549019607843,\n\t\t\t0.1568627450980392\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.4745098039215686,\n\t\t\t0.09019607843137255,\n\t\t\t0.09019607843137255,\n\t\t\t0.7098039215686275,\n\t\t\t0.00392156862745098,\n\t\t\t0.00392156862745098,\n\t\t\t0.9372549019607843,\n\t\t\t0.2784313725490196,\n\t\t\t0.09803921568627451,\n\t\t\t0.9764705882352941,\n\t\t\t0.5137254901960784,\n\t\t\t0.1411764705882353,\n\t\t\t1,\n\t\t\t0.7058823529411765,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0.8980392156862745,\n\t\t\t0.02352941176470588\n\t\t],\n\t\tName: \"Warm\",\n\t\tNanColor: [\n\t\t\t1,\n\t\t\t0.8980392156862745,\n\t\t\t0.02352941176470588\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.4588235294117647,\n\t\t\t0.6941176470588235,\n\t\t\t0.00392156862745098,\n\t\t\t0.3450980392156863,\n\t\t\t0.5019607843137255,\n\t\t\t0.1607843137254902,\n\t\t\t0.3137254901960784,\n\t\t\t0.8431372549019608,\n\t\t\t0.7490196078431373,\n\t\t\t0.1098039215686274,\n\t\t\t0.5843137254901961,\n\t\t\t0.803921568627451,\n\t\t\t0.2313725490196079,\n\t\t\t0.407843137254902,\n\t\t\t0.6705882352941176,\n\t\t\t0.6039215686274509,\n\t\t\t0.407843137254902,\n\t\t\t1,\n\t\t\t0.3725490196078431,\n\t\t\t0.2,\n\t\t\t0.5019607843137255\n\t\t],\n\t\tName: \"Cool\",\n\t\tNanColor: [\n\t\t\t0.3725490196078431,\n\t\t\t0.2,\n\t\t\t0.5019607843137255\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.2313725490196079,\n\t\t\t0.407843137254902,\n\t\t\t0.6705882352941176,\n\t\t\t0.1098039215686274,\n\t\t\t0.5843137254901961,\n\t\t\t0.803921568627451,\n\t\t\t0.3058823529411765,\n\t\t\t0.8509803921568627,\n\t\t\t0.9176470588235294,\n\t\t\t0.4509803921568628,\n\t\t\t0.6039215686274509,\n\t\t\t0.8352941176470589,\n\t\t\t0.2588235294117647,\n\t\t\t0.2392156862745098,\n\t\t\t0.6627450980392157,\n\t\t\t0.3137254901960784,\n\t\t\t0.3294117647058823,\n\t\t\t0.5294117647058824,\n\t\t\t0.06274509803921569,\n\t\t\t0.1647058823529412,\n\t\t\t0.3215686274509804\n\t\t],\n\t\tName: \"Blues\",\n\t\tNanColor: [\n\t\t\t0.06274509803921569,\n\t\t\t0.1647058823529412,\n\t\t\t0.3215686274509804\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.1098039215686274,\n\t\t\t0.5843137254901961,\n\t\t\t0.803921568627451,\n\t\t\t0.2313725490196079,\n\t\t\t0.407843137254902,\n\t\t\t0.6705882352941176,\n\t\t\t0.4,\n\t\t\t0.2431372549019608,\n\t\t\t0.7176470588235294,\n\t\t\t0.6352941176470588,\n\t\t\t0.3294117647058823,\n\t\t\t0.8117647058823529,\n\t\t\t0.8705882352941177,\n\t\t\t0.3803921568627451,\n\t\t\t0.807843137254902,\n\t\t\t0.8627450980392157,\n\t\t\t0.3803921568627451,\n\t\t\t0.5843137254901961,\n\t\t\t0.2392156862745098,\n\t\t\t0.06274509803921569,\n\t\t\t0.3215686274509804\n\t\t],\n\t\tName: \"Wild Flower\",\n\t\tNanColor: [\n\t\t\t0.2392156862745098,\n\t\t\t0.06274509803921569,\n\t\t\t0.3215686274509804\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.396078431372549,\n\t\t\t0.4862745098039216,\n\t\t\t0.2156862745098039,\n\t\t\t0.4588235294117647,\n\t\t\t0.6941176470588235,\n\t\t\t0.00392156862745098,\n\t\t\t0.6980392156862745,\n\t\t\t0.7294117647058823,\n\t\t\t0.1882352941176471,\n\t\t\t1,\n\t\t\t0.8980392156862745,\n\t\t\t0.02352941176470588,\n\t\t\t1,\n\t\t\t0.7058823529411765,\n\t\t\t0,\n\t\t\t0.9764705882352941,\n\t\t\t0.5137254901960784,\n\t\t\t0.1411764705882353\n\t\t],\n\t\tName: \"Citrus\",\n\t\tNanColor: [\n\t\t\t0.9764705882352941,\n\t\t\t0.5137254901960784,\n\t\t\t0.1411764705882353\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.4980392156862745,\n\t\t\t0.2313725490196079,\n\t\t\t0.03137254901960784,\n\t\t\t0.7019607843137254,\n\t\t\t0.3450980392156863,\n\t\t\t0.02352941176470588,\n\t\t\t0.8784313725490196,\n\t\t\t0.5098039215686274,\n\t\t\t0.0784313725490196,\n\t\t\t0.9921568627450981,\n\t\t\t0.7215686274509804,\n\t\t\t0.3882352941176471,\n\t\t\t0.996078431372549,\n\t\t\t0.8784313725490196,\n\t\t\t0.7137254901960784,\n\t\t\t0.9686274509803922,\n\t\t\t0.9686274509803922,\n\t\t\t0.9686274509803922,\n\t\t\t0.8470588235294118,\n\t\t\t0.8549019607843137,\n\t\t\t0.9215686274509803,\n\t\t\t0.6980392156862745,\n\t\t\t0.6705882352941176,\n\t\t\t0.8235294117647058,\n\t\t\t0.5019607843137255,\n\t\t\t0.4509803921568628,\n\t\t\t0.6745098039215687,\n\t\t\t0.3294117647058823,\n\t\t\t0.1529411764705882,\n\t\t\t0.5333333333333333,\n\t\t\t0.1764705882352941,\n\t\t\t0,\n\t\t\t0.2941176470588235\n\t\t],\n\t\tName: \"Brewer Diverging Purple-Orange (11)\",\n\t\tNanColor: [\n\t\t\t0.1764705882352941,\n\t\t\t0,\n\t\t\t0.2941176470588235\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.4980392156862745,\n\t\t\t0.2313725490196079,\n\t\t\t0.03137254901960784,\n\t\t\t0.7019607843137254,\n\t\t\t0.3450980392156863,\n\t\t\t0.02352941176470588,\n\t\t\t0.8784313725490196,\n\t\t\t0.5098039215686274,\n\t\t\t0.0784313725490196,\n\t\t\t0.9921568627450981,\n\t\t\t0.7215686274509804,\n\t\t\t0.3882352941176471,\n\t\t\t0.996078431372549,\n\t\t\t0.8784313725490196,\n\t\t\t0.7137254901960784,\n\t\t\t0.8470588235294118,\n\t\t\t0.8549019607843137,\n\t\t\t0.9215686274509803,\n\t\t\t0.6980392156862745,\n\t\t\t0.6705882352941176,\n\t\t\t0.8235294117647058,\n\t\t\t0.5019607843137255,\n\t\t\t0.4509803921568628,\n\t\t\t0.6745098039215687,\n\t\t\t0.3294117647058823,\n\t\t\t0.1529411764705882,\n\t\t\t0.5333333333333333,\n\t\t\t0.1764705882352941,\n\t\t\t0,\n\t\t\t0.2941176470588235\n\t\t],\n\t\tName: \"Brewer Diverging Purple-Orange (10)\",\n\t\tNanColor: [\n\t\t\t0.1764705882352941,\n\t\t\t0,\n\t\t\t0.2941176470588235\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.7019607843137254,\n\t\t\t0.3450980392156863,\n\t\t\t0.02352941176470588,\n\t\t\t0.8784313725490196,\n\t\t\t0.5098039215686274,\n\t\t\t0.0784313725490196,\n\t\t\t0.9921568627450981,\n\t\t\t0.7215686274509804,\n\t\t\t0.3882352941176471,\n\t\t\t0.996078431372549,\n\t\t\t0.8784313725490196,\n\t\t\t0.7137254901960784,\n\t\t\t0.9686274509803922,\n\t\t\t0.9686274509803922,\n\t\t\t0.9686274509803922,\n\t\t\t0.8470588235294118,\n\t\t\t0.8549019607843137,\n\t\t\t0.9215686274509803,\n\t\t\t0.6980392156862745,\n\t\t\t0.6705882352941176,\n\t\t\t0.8235294117647058,\n\t\t\t0.5019607843137255,\n\t\t\t0.4509803921568628,\n\t\t\t0.6745098039215687,\n\t\t\t0.3294117647058823,\n\t\t\t0.1529411764705882,\n\t\t\t0.5333333333333333\n\t\t],\n\t\tName: \"Brewer Diverging Purple-Orange (9)\",\n\t\tNanColor: [\n\t\t\t0.3294117647058823,\n\t\t\t0.1529411764705882,\n\t\t\t0.5333333333333333\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.7019607843137254,\n\t\t\t0.3450980392156863,\n\t\t\t0.02352941176470588,\n\t\t\t0.8784313725490196,\n\t\t\t0.5098039215686274,\n\t\t\t0.0784313725490196,\n\t\t\t0.9921568627450981,\n\t\t\t0.7215686274509804,\n\t\t\t0.3882352941176471,\n\t\t\t0.996078431372549,\n\t\t\t0.8784313725490196,\n\t\t\t0.7137254901960784,\n\t\t\t0.8470588235294118,\n\t\t\t0.8549019607843137,\n\t\t\t0.9215686274509803,\n\t\t\t0.6980392156862745,\n\t\t\t0.6705882352941176,\n\t\t\t0.8235294117647058,\n\t\t\t0.5019607843137255,\n\t\t\t0.4509803921568628,\n\t\t\t0.6745098039215687,\n\t\t\t0.3294117647058823,\n\t\t\t0.1529411764705882,\n\t\t\t0.5333333333333333\n\t\t],\n\t\tName: \"Brewer Diverging Purple-Orange (8)\",\n\t\tNanColor: [\n\t\t\t0.3294117647058823,\n\t\t\t0.1529411764705882,\n\t\t\t0.5333333333333333\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.7019607843137254,\n\t\t\t0.3450980392156863,\n\t\t\t0.02352941176470588,\n\t\t\t0.9450980392156862,\n\t\t\t0.6392156862745098,\n\t\t\t0.2509803921568627,\n\t\t\t0.996078431372549,\n\t\t\t0.8784313725490196,\n\t\t\t0.7137254901960784,\n\t\t\t0.9686274509803922,\n\t\t\t0.9686274509803922,\n\t\t\t0.9686274509803922,\n\t\t\t0.8470588235294118,\n\t\t\t0.8549019607843137,\n\t\t\t0.9215686274509803,\n\t\t\t0.6,\n\t\t\t0.5568627450980392,\n\t\t\t0.7647058823529411,\n\t\t\t0.3294117647058823,\n\t\t\t0.1529411764705882,\n\t\t\t0.5333333333333333\n\t\t],\n\t\tName: \"Brewer Diverging Purple-Orange (7)\",\n\t\tNanColor: [\n\t\t\t0.3294117647058823,\n\t\t\t0.1529411764705882,\n\t\t\t0.5333333333333333\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.7019607843137254,\n\t\t\t0.3450980392156863,\n\t\t\t0.02352941176470588,\n\t\t\t0.9450980392156862,\n\t\t\t0.6392156862745098,\n\t\t\t0.2509803921568627,\n\t\t\t0.996078431372549,\n\t\t\t0.8784313725490196,\n\t\t\t0.7137254901960784,\n\t\t\t0.8470588235294118,\n\t\t\t0.8549019607843137,\n\t\t\t0.9215686274509803,\n\t\t\t0.6,\n\t\t\t0.5568627450980392,\n\t\t\t0.7647058823529411,\n\t\t\t0.3294117647058823,\n\t\t\t0.1529411764705882,\n\t\t\t0.5333333333333333\n\t\t],\n\t\tName: \"Brewer Diverging Purple-Orange (6)\",\n\t\tNanColor: [\n\t\t\t0.3294117647058823,\n\t\t\t0.1529411764705882,\n\t\t\t0.5333333333333333\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.9019607843137255,\n\t\t\t0.3803921568627451,\n\t\t\t0.00392156862745098,\n\t\t\t0.9921568627450981,\n\t\t\t0.7215686274509804,\n\t\t\t0.3882352941176471,\n\t\t\t0.9686274509803922,\n\t\t\t0.9686274509803922,\n\t\t\t0.9686274509803922,\n\t\t\t0.6980392156862745,\n\t\t\t0.6705882352941176,\n\t\t\t0.8235294117647058,\n\t\t\t0.3686274509803922,\n\t\t\t0.2352941176470588,\n\t\t\t0.6\n\t\t],\n\t\tName: \"Brewer Diverging Purple-Orange (5)\",\n\t\tNanColor: [\n\t\t\t0.3686274509803922,\n\t\t\t0.2352941176470588,\n\t\t\t0.6\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.9019607843137255,\n\t\t\t0.3803921568627451,\n\t\t\t0.00392156862745098,\n\t\t\t0.9921568627450981,\n\t\t\t0.7215686274509804,\n\t\t\t0.3882352941176471,\n\t\t\t0.6980392156862745,\n\t\t\t0.6705882352941176,\n\t\t\t0.8235294117647058,\n\t\t\t0.3686274509803922,\n\t\t\t0.2352941176470588,\n\t\t\t0.6\n\t\t],\n\t\tName: \"Brewer Diverging Purple-Orange (4)\",\n\t\tNanColor: [\n\t\t\t0.3686274509803922,\n\t\t\t0.2352941176470588,\n\t\t\t0.6\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.9450980392156862,\n\t\t\t0.6392156862745098,\n\t\t\t0.2509803921568627,\n\t\t\t0.9686274509803922,\n\t\t\t0.9686274509803922,\n\t\t\t0.9686274509803922,\n\t\t\t0.6,\n\t\t\t0.5568627450980392,\n\t\t\t0.7647058823529411\n\t\t],\n\t\tName: \"Brewer Diverging Purple-Orange (3)\",\n\t\tNanColor: [\n\t\t\t0.6,\n\t\t\t0.5568627450980392,\n\t\t\t0.7647058823529411\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.6196078431372549,\n\t\t\t0.00392156862745098,\n\t\t\t0.2588235294117647,\n\t\t\t0.8352941176470589,\n\t\t\t0.2431372549019608,\n\t\t\t0.3098039215686275,\n\t\t\t0.9568627450980393,\n\t\t\t0.4274509803921568,\n\t\t\t0.2627450980392157,\n\t\t\t0.9921568627450981,\n\t\t\t0.6823529411764706,\n\t\t\t0.3803921568627451,\n\t\t\t0.996078431372549,\n\t\t\t0.8784313725490196,\n\t\t\t0.5450980392156862,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.7490196078431373,\n\t\t\t0.9019607843137255,\n\t\t\t0.9607843137254902,\n\t\t\t0.596078431372549,\n\t\t\t0.6705882352941176,\n\t\t\t0.8666666666666667,\n\t\t\t0.6431372549019608,\n\t\t\t0.4,\n\t\t\t0.7607843137254902,\n\t\t\t0.6470588235294118,\n\t\t\t0.196078431372549,\n\t\t\t0.5333333333333333,\n\t\t\t0.7411764705882353,\n\t\t\t0.3686274509803922,\n\t\t\t0.3098039215686275,\n\t\t\t0.6352941176470588\n\t\t],\n\t\tName: \"Brewer Diverging Spectral (11)\",\n\t\tNanColor: [\n\t\t\t0.3686274509803922,\n\t\t\t0.3098039215686275,\n\t\t\t0.6352941176470588\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.6196078431372549,\n\t\t\t0.00392156862745098,\n\t\t\t0.2588235294117647,\n\t\t\t0.8352941176470589,\n\t\t\t0.2431372549019608,\n\t\t\t0.3098039215686275,\n\t\t\t0.9568627450980393,\n\t\t\t0.4274509803921568,\n\t\t\t0.2627450980392157,\n\t\t\t0.9921568627450981,\n\t\t\t0.6823529411764706,\n\t\t\t0.3803921568627451,\n\t\t\t0.996078431372549,\n\t\t\t0.8784313725490196,\n\t\t\t0.5450980392156862,\n\t\t\t0.9019607843137255,\n\t\t\t0.9607843137254902,\n\t\t\t0.596078431372549,\n\t\t\t0.6705882352941176,\n\t\t\t0.8666666666666667,\n\t\t\t0.6431372549019608,\n\t\t\t0.4,\n\t\t\t0.7607843137254902,\n\t\t\t0.6470588235294118,\n\t\t\t0.196078431372549,\n\t\t\t0.5333333333333333,\n\t\t\t0.7411764705882353,\n\t\t\t0.3686274509803922,\n\t\t\t0.3098039215686275,\n\t\t\t0.6352941176470588\n\t\t],\n\t\tName: \"Brewer Diverging Spectral (10)\",\n\t\tNanColor: [\n\t\t\t0.3686274509803922,\n\t\t\t0.3098039215686275,\n\t\t\t0.6352941176470588\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.8352941176470589,\n\t\t\t0.2431372549019608,\n\t\t\t0.3098039215686275,\n\t\t\t0.9568627450980393,\n\t\t\t0.4274509803921568,\n\t\t\t0.2627450980392157,\n\t\t\t0.9921568627450981,\n\t\t\t0.6823529411764706,\n\t\t\t0.3803921568627451,\n\t\t\t0.996078431372549,\n\t\t\t0.8784313725490196,\n\t\t\t0.5450980392156862,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.7490196078431373,\n\t\t\t0.9019607843137255,\n\t\t\t0.9607843137254902,\n\t\t\t0.596078431372549,\n\t\t\t0.6705882352941176,\n\t\t\t0.8666666666666667,\n\t\t\t0.6431372549019608,\n\t\t\t0.4,\n\t\t\t0.7607843137254902,\n\t\t\t0.6470588235294118,\n\t\t\t0.196078431372549,\n\t\t\t0.5333333333333333,\n\t\t\t0.7411764705882353\n\t\t],\n\t\tName: \"Brewer Diverging Spectral (9)\",\n\t\tNanColor: [\n\t\t\t0.196078431372549,\n\t\t\t0.5333333333333333,\n\t\t\t0.7411764705882353\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.8352941176470589,\n\t\t\t0.2431372549019608,\n\t\t\t0.3098039215686275,\n\t\t\t0.9568627450980393,\n\t\t\t0.4274509803921568,\n\t\t\t0.2627450980392157,\n\t\t\t0.9921568627450981,\n\t\t\t0.6823529411764706,\n\t\t\t0.3803921568627451,\n\t\t\t0.996078431372549,\n\t\t\t0.8784313725490196,\n\t\t\t0.5450980392156862,\n\t\t\t0.9019607843137255,\n\t\t\t0.9607843137254902,\n\t\t\t0.596078431372549,\n\t\t\t0.6705882352941176,\n\t\t\t0.8666666666666667,\n\t\t\t0.6431372549019608,\n\t\t\t0.4,\n\t\t\t0.7607843137254902,\n\t\t\t0.6470588235294118,\n\t\t\t0.196078431372549,\n\t\t\t0.5333333333333333,\n\t\t\t0.7411764705882353\n\t\t],\n\t\tName: \"Brewer Diverging Spectral (8)\",\n\t\tNanColor: [\n\t\t\t0.196078431372549,\n\t\t\t0.5333333333333333,\n\t\t\t0.7411764705882353\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.8352941176470589,\n\t\t\t0.2431372549019608,\n\t\t\t0.3098039215686275,\n\t\t\t0.9882352941176471,\n\t\t\t0.5529411764705883,\n\t\t\t0.3490196078431372,\n\t\t\t0.996078431372549,\n\t\t\t0.8784313725490196,\n\t\t\t0.5450980392156862,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.7490196078431373,\n\t\t\t0.9019607843137255,\n\t\t\t0.9607843137254902,\n\t\t\t0.596078431372549,\n\t\t\t0.6,\n\t\t\t0.8352941176470589,\n\t\t\t0.5803921568627451,\n\t\t\t0.196078431372549,\n\t\t\t0.5333333333333333,\n\t\t\t0.7411764705882353\n\t\t],\n\t\tName: \"Brewer Diverging Spectral (7)\",\n\t\tNanColor: [\n\t\t\t0.196078431372549,\n\t\t\t0.5333333333333333,\n\t\t\t0.7411764705882353\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.8352941176470589,\n\t\t\t0.2431372549019608,\n\t\t\t0.3098039215686275,\n\t\t\t0.9882352941176471,\n\t\t\t0.5529411764705883,\n\t\t\t0.3490196078431372,\n\t\t\t0.996078431372549,\n\t\t\t0.8784313725490196,\n\t\t\t0.5450980392156862,\n\t\t\t0.9019607843137255,\n\t\t\t0.9607843137254902,\n\t\t\t0.596078431372549,\n\t\t\t0.6,\n\t\t\t0.8352941176470589,\n\t\t\t0.5803921568627451,\n\t\t\t0.196078431372549,\n\t\t\t0.5333333333333333,\n\t\t\t0.7411764705882353\n\t\t],\n\t\tName: \"Brewer Diverging Spectral (6)\",\n\t\tNanColor: [\n\t\t\t0.196078431372549,\n\t\t\t0.5333333333333333,\n\t\t\t0.7411764705882353\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.8431372549019608,\n\t\t\t0.09803921568627451,\n\t\t\t0.1098039215686274,\n\t\t\t0.9921568627450981,\n\t\t\t0.6823529411764706,\n\t\t\t0.3803921568627451,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.7490196078431373,\n\t\t\t0.6705882352941176,\n\t\t\t0.8666666666666667,\n\t\t\t0.6431372549019608,\n\t\t\t0.1686274509803922,\n\t\t\t0.5137254901960784,\n\t\t\t0.7294117647058823\n\t\t],\n\t\tName: \"Brewer Diverging Spectral (5)\",\n\t\tNanColor: [\n\t\t\t0.1686274509803922,\n\t\t\t0.5137254901960784,\n\t\t\t0.7294117647058823\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.8431372549019608,\n\t\t\t0.09803921568627451,\n\t\t\t0.1098039215686274,\n\t\t\t0.9921568627450981,\n\t\t\t0.6823529411764706,\n\t\t\t0.3803921568627451,\n\t\t\t0.6705882352941176,\n\t\t\t0.8666666666666667,\n\t\t\t0.6431372549019608,\n\t\t\t0.1686274509803922,\n\t\t\t0.5137254901960784,\n\t\t\t0.7294117647058823\n\t\t],\n\t\tName: \"Brewer Diverging Spectral (4)\",\n\t\tNanColor: [\n\t\t\t0.1686274509803922,\n\t\t\t0.5137254901960784,\n\t\t\t0.7294117647058823\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.9882352941176471,\n\t\t\t0.5529411764705883,\n\t\t\t0.3490196078431372,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.7490196078431373,\n\t\t\t0.6,\n\t\t\t0.8352941176470589,\n\t\t\t0.5803921568627451\n\t\t],\n\t\tName: \"Brewer Diverging Spectral (3)\",\n\t\tNanColor: [\n\t\t\t0.6,\n\t\t\t0.8352941176470589,\n\t\t\t0.5803921568627451\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.3294117647058823,\n\t\t\t0.1882352941176471,\n\t\t\t0.0196078431372549,\n\t\t\t0.5490196078431373,\n\t\t\t0.3176470588235294,\n\t\t\t0.0392156862745098,\n\t\t\t0.7490196078431373,\n\t\t\t0.5058823529411764,\n\t\t\t0.1764705882352941,\n\t\t\t0.8745098039215686,\n\t\t\t0.7607843137254902,\n\t\t\t0.4901960784313725,\n\t\t\t0.9647058823529412,\n\t\t\t0.9098039215686274,\n\t\t\t0.7647058823529411,\n\t\t\t0.9607843137254902,\n\t\t\t0.9607843137254902,\n\t\t\t0.9607843137254902,\n\t\t\t0.7803921568627451,\n\t\t\t0.9176470588235294,\n\t\t\t0.8980392156862745,\n\t\t\t0.5019607843137255,\n\t\t\t0.803921568627451,\n\t\t\t0.7568627450980392,\n\t\t\t0.207843137254902,\n\t\t\t0.592156862745098,\n\t\t\t0.5607843137254902,\n\t\t\t0.00392156862745098,\n\t\t\t0.4,\n\t\t\t0.3686274509803922,\n\t\t\t0,\n\t\t\t0.2352941176470588,\n\t\t\t0.1882352941176471\n\t\t],\n\t\tName: \"Brewer Diverging Brown-Blue-Green (11)\",\n\t\tNanColor: [\n\t\t\t0,\n\t\t\t0.2352941176470588,\n\t\t\t0.1882352941176471\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.3294117647058823,\n\t\t\t0.1882352941176471,\n\t\t\t0.0196078431372549,\n\t\t\t0.5490196078431373,\n\t\t\t0.3176470588235294,\n\t\t\t0.0392156862745098,\n\t\t\t0.7490196078431373,\n\t\t\t0.5058823529411764,\n\t\t\t0.1764705882352941,\n\t\t\t0.8745098039215686,\n\t\t\t0.7607843137254902,\n\t\t\t0.4901960784313725,\n\t\t\t0.9647058823529412,\n\t\t\t0.9098039215686274,\n\t\t\t0.7647058823529411,\n\t\t\t0.7803921568627451,\n\t\t\t0.9176470588235294,\n\t\t\t0.8980392156862745,\n\t\t\t0.5019607843137255,\n\t\t\t0.803921568627451,\n\t\t\t0.7568627450980392,\n\t\t\t0.207843137254902,\n\t\t\t0.592156862745098,\n\t\t\t0.5607843137254902,\n\t\t\t0.00392156862745098,\n\t\t\t0.4,\n\t\t\t0.3686274509803922,\n\t\t\t0,\n\t\t\t0.2352941176470588,\n\t\t\t0.1882352941176471\n\t\t],\n\t\tName: \"Brewer Diverging Brown-Blue-Green (10)\",\n\t\tNanColor: [\n\t\t\t0,\n\t\t\t0.2352941176470588,\n\t\t\t0.1882352941176471\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.5490196078431373,\n\t\t\t0.3176470588235294,\n\t\t\t0.0392156862745098,\n\t\t\t0.7490196078431373,\n\t\t\t0.5058823529411764,\n\t\t\t0.1764705882352941,\n\t\t\t0.8745098039215686,\n\t\t\t0.7607843137254902,\n\t\t\t0.4901960784313725,\n\t\t\t0.9647058823529412,\n\t\t\t0.9098039215686274,\n\t\t\t0.7647058823529411,\n\t\t\t0.9607843137254902,\n\t\t\t0.9607843137254902,\n\t\t\t0.9607843137254902,\n\t\t\t0.7803921568627451,\n\t\t\t0.9176470588235294,\n\t\t\t0.8980392156862745,\n\t\t\t0.5019607843137255,\n\t\t\t0.803921568627451,\n\t\t\t0.7568627450980392,\n\t\t\t0.207843137254902,\n\t\t\t0.592156862745098,\n\t\t\t0.5607843137254902,\n\t\t\t0.00392156862745098,\n\t\t\t0.4,\n\t\t\t0.3686274509803922\n\t\t],\n\t\tName: \"Brewer Diverging Brown-Blue-Green (9)\",\n\t\tNanColor: [\n\t\t\t0.00392156862745098,\n\t\t\t0.4,\n\t\t\t0.3686274509803922\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.5490196078431373,\n\t\t\t0.3176470588235294,\n\t\t\t0.0392156862745098,\n\t\t\t0.7490196078431373,\n\t\t\t0.5058823529411764,\n\t\t\t0.1764705882352941,\n\t\t\t0.8745098039215686,\n\t\t\t0.7607843137254902,\n\t\t\t0.4901960784313725,\n\t\t\t0.9647058823529412,\n\t\t\t0.9098039215686274,\n\t\t\t0.7647058823529411,\n\t\t\t0.7803921568627451,\n\t\t\t0.9176470588235294,\n\t\t\t0.8980392156862745,\n\t\t\t0.5019607843137255,\n\t\t\t0.803921568627451,\n\t\t\t0.7568627450980392,\n\t\t\t0.207843137254902,\n\t\t\t0.592156862745098,\n\t\t\t0.5607843137254902,\n\t\t\t0.00392156862745098,\n\t\t\t0.4,\n\t\t\t0.3686274509803922\n\t\t],\n\t\tName: \"Brewer Diverging Brown-Blue-Green (8)\",\n\t\tNanColor: [\n\t\t\t0.00392156862745098,\n\t\t\t0.4,\n\t\t\t0.3686274509803922\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.5490196078431373,\n\t\t\t0.3176470588235294,\n\t\t\t0.0392156862745098,\n\t\t\t0.8470588235294118,\n\t\t\t0.7019607843137254,\n\t\t\t0.396078431372549,\n\t\t\t0.9647058823529412,\n\t\t\t0.9098039215686274,\n\t\t\t0.7647058823529411,\n\t\t\t0.9607843137254902,\n\t\t\t0.9607843137254902,\n\t\t\t0.9607843137254902,\n\t\t\t0.7803921568627451,\n\t\t\t0.9176470588235294,\n\t\t\t0.8980392156862745,\n\t\t\t0.3529411764705883,\n\t\t\t0.7058823529411765,\n\t\t\t0.6745098039215687,\n\t\t\t0.00392156862745098,\n\t\t\t0.4,\n\t\t\t0.3686274509803922\n\t\t],\n\t\tName: \"Brewer Diverging Brown-Blue-Green (7)\",\n\t\tNanColor: [\n\t\t\t0.00392156862745098,\n\t\t\t0.4,\n\t\t\t0.3686274509803922\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.5490196078431373,\n\t\t\t0.3176470588235294,\n\t\t\t0.0392156862745098,\n\t\t\t0.8470588235294118,\n\t\t\t0.7019607843137254,\n\t\t\t0.396078431372549,\n\t\t\t0.9647058823529412,\n\t\t\t0.9098039215686274,\n\t\t\t0.7647058823529411,\n\t\t\t0.7803921568627451,\n\t\t\t0.9176470588235294,\n\t\t\t0.8980392156862745,\n\t\t\t0.3529411764705883,\n\t\t\t0.7058823529411765,\n\t\t\t0.6745098039215687,\n\t\t\t0.00392156862745098,\n\t\t\t0.4,\n\t\t\t0.3686274509803922\n\t\t],\n\t\tName: \"Brewer Diverging Brown-Blue-Green (6)\",\n\t\tNanColor: [\n\t\t\t0.00392156862745098,\n\t\t\t0.4,\n\t\t\t0.3686274509803922\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.6509803921568628,\n\t\t\t0.3803921568627451,\n\t\t\t0.1019607843137255,\n\t\t\t0.8745098039215686,\n\t\t\t0.7607843137254902,\n\t\t\t0.4901960784313725,\n\t\t\t0.9607843137254902,\n\t\t\t0.9607843137254902,\n\t\t\t0.9607843137254902,\n\t\t\t0.5019607843137255,\n\t\t\t0.803921568627451,\n\t\t\t0.7568627450980392,\n\t\t\t0.00392156862745098,\n\t\t\t0.5215686274509804,\n\t\t\t0.4431372549019608\n\t\t],\n\t\tName: \"Brewer Diverging Brown-Blue-Green (5)\",\n\t\tNanColor: [\n\t\t\t0.00392156862745098,\n\t\t\t0.5215686274509804,\n\t\t\t0.4431372549019608\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.6509803921568628,\n\t\t\t0.3803921568627451,\n\t\t\t0.1019607843137255,\n\t\t\t0.8745098039215686,\n\t\t\t0.7607843137254902,\n\t\t\t0.4901960784313725,\n\t\t\t0.5019607843137255,\n\t\t\t0.803921568627451,\n\t\t\t0.7568627450980392,\n\t\t\t0.00392156862745098,\n\t\t\t0.5215686274509804,\n\t\t\t0.4431372549019608\n\t\t],\n\t\tName: \"Brewer Diverging Brown-Blue-Green (4)\",\n\t\tNanColor: [\n\t\t\t0.00392156862745098,\n\t\t\t0.5215686274509804,\n\t\t\t0.4431372549019608\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.8470588235294118,\n\t\t\t0.7019607843137254,\n\t\t\t0.396078431372549,\n\t\t\t0.9607843137254902,\n\t\t\t0.9607843137254902,\n\t\t\t0.9607843137254902,\n\t\t\t0.3529411764705883,\n\t\t\t0.7058823529411765,\n\t\t\t0.6745098039215687\n\t\t],\n\t\tName: \"Brewer Diverging Brown-Blue-Green (3)\",\n\t\tNanColor: [\n\t\t\t0.3529411764705883,\n\t\t\t0.7058823529411765,\n\t\t\t0.6745098039215687\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.9686274509803922,\n\t\t\t0.9882352941176471,\n\t\t\t0.9921568627450981,\n\t\t\t0.8980392156862745,\n\t\t\t0.9607843137254902,\n\t\t\t0.9764705882352941,\n\t\t\t0.8,\n\t\t\t0.9254901960784314,\n\t\t\t0.9019607843137255,\n\t\t\t0.6,\n\t\t\t0.8470588235294118,\n\t\t\t0.788235294117647,\n\t\t\t0.4,\n\t\t\t0.7607843137254902,\n\t\t\t0.6431372549019608,\n\t\t\t0.2549019607843137,\n\t\t\t0.6823529411764706,\n\t\t\t0.4627450980392157,\n\t\t\t0.1372549019607843,\n\t\t\t0.5450980392156862,\n\t\t\t0.2705882352941176,\n\t\t\t0,\n\t\t\t0.4274509803921568,\n\t\t\t0.1725490196078431,\n\t\t\t0,\n\t\t\t0.2666666666666667,\n\t\t\t0.1058823529411765\n\t\t],\n\t\tName: \"Brewer Sequential Blue-Green (9)\",\n\t\tNanColor: [\n\t\t\t0,\n\t\t\t0.2666666666666667,\n\t\t\t0.1058823529411765\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.9686274509803922,\n\t\t\t0.9882352941176471,\n\t\t\t0.9921568627450981,\n\t\t\t0.8980392156862745,\n\t\t\t0.9607843137254902,\n\t\t\t0.9764705882352941,\n\t\t\t0.8,\n\t\t\t0.9254901960784314,\n\t\t\t0.9019607843137255,\n\t\t\t0.6,\n\t\t\t0.8470588235294118,\n\t\t\t0.788235294117647,\n\t\t\t0.4,\n\t\t\t0.7607843137254902,\n\t\t\t0.6431372549019608,\n\t\t\t0.2549019607843137,\n\t\t\t0.6823529411764706,\n\t\t\t0.4627450980392157,\n\t\t\t0.1372549019607843,\n\t\t\t0.5450980392156862,\n\t\t\t0.2705882352941176,\n\t\t\t0,\n\t\t\t0.3450980392156863,\n\t\t\t0.1411764705882353\n\t\t],\n\t\tName: \"Brewer Sequential Blue-Green (8)\",\n\t\tNanColor: [\n\t\t\t0,\n\t\t\t0.3450980392156863,\n\t\t\t0.1411764705882353\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.9294117647058824,\n\t\t\t0.9725490196078431,\n\t\t\t0.984313725490196,\n\t\t\t0.8,\n\t\t\t0.9254901960784314,\n\t\t\t0.9019607843137255,\n\t\t\t0.8,\n\t\t\t0.9254901960784314,\n\t\t\t0.9019607843137255,\n\t\t\t0.4,\n\t\t\t0.7607843137254902,\n\t\t\t0.6431372549019608,\n\t\t\t0.2549019607843137,\n\t\t\t0.6823529411764706,\n\t\t\t0.4627450980392157,\n\t\t\t0.1372549019607843,\n\t\t\t0.5450980392156862,\n\t\t\t0.2705882352941176,\n\t\t\t0,\n\t\t\t0.3450980392156863,\n\t\t\t0.1411764705882353\n\t\t],\n\t\tName: \"Brewer Sequential Blue-Green (7)\",\n\t\tNanColor: [\n\t\t\t0,\n\t\t\t0.3450980392156863,\n\t\t\t0.1411764705882353\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.9294117647058824,\n\t\t\t0.9725490196078431,\n\t\t\t0.984313725490196,\n\t\t\t0.8,\n\t\t\t0.9254901960784314,\n\t\t\t0.9019607843137255,\n\t\t\t0.6,\n\t\t\t0.8470588235294118,\n\t\t\t0.788235294117647,\n\t\t\t0.4,\n\t\t\t0.7607843137254902,\n\t\t\t0.6431372549019608,\n\t\t\t0.1725490196078431,\n\t\t\t0.6352941176470588,\n\t\t\t0.3725490196078431,\n\t\t\t0,\n\t\t\t0.4274509803921568,\n\t\t\t0.1725490196078431\n\t\t],\n\t\tName: \"Brewer Sequential Blue-Green (6)\",\n\t\tNanColor: [\n\t\t\t0,\n\t\t\t0.4274509803921568,\n\t\t\t0.1725490196078431\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.9294117647058824,\n\t\t\t0.9725490196078431,\n\t\t\t0.984313725490196,\n\t\t\t0.6980392156862745,\n\t\t\t0.8862745098039215,\n\t\t\t0.8862745098039215,\n\t\t\t0.4,\n\t\t\t0.7607843137254902,\n\t\t\t0.6431372549019608,\n\t\t\t0.1725490196078431,\n\t\t\t0.6352941176470588,\n\t\t\t0.3725490196078431,\n\t\t\t0,\n\t\t\t0.4274509803921568,\n\t\t\t0.1725490196078431\n\t\t],\n\t\tName: \"Brewer Sequential Blue-Green (5)\",\n\t\tNanColor: [\n\t\t\t0,\n\t\t\t0.4274509803921568,\n\t\t\t0.1725490196078431\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.9294117647058824,\n\t\t\t0.9725490196078431,\n\t\t\t0.984313725490196,\n\t\t\t0.6980392156862745,\n\t\t\t0.8862745098039215,\n\t\t\t0.8862745098039215,\n\t\t\t0.4,\n\t\t\t0.7607843137254902,\n\t\t\t0.6431372549019608,\n\t\t\t0.1372549019607843,\n\t\t\t0.5450980392156862,\n\t\t\t0.2705882352941176\n\t\t],\n\t\tName: \"Brewer Sequential Blue-Green (4)\",\n\t\tNanColor: [\n\t\t\t0.1372549019607843,\n\t\t\t0.5450980392156862,\n\t\t\t0.2705882352941176\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.8980392156862745,\n\t\t\t0.9607843137254902,\n\t\t\t0.9764705882352941,\n\t\t\t0.6,\n\t\t\t0.8470588235294118,\n\t\t\t0.788235294117647,\n\t\t\t0.1725490196078431,\n\t\t\t0.6352941176470588,\n\t\t\t0.3725490196078431\n\t\t],\n\t\tName: \"Brewer Sequential Blue-Green (3)\",\n\t\tNanColor: [\n\t\t\t0.1725490196078431,\n\t\t\t0.6352941176470588,\n\t\t\t0.3725490196078431\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.8980392156862745,\n\t\t\t1,\n\t\t\t0.9686274509803922,\n\t\t\t0.7372549019607844,\n\t\t\t0.996078431372549,\n\t\t\t0.8901960784313725,\n\t\t\t0.5686274509803921,\n\t\t\t0.996078431372549,\n\t\t\t0.7686274509803922,\n\t\t\t0.3098039215686275,\n\t\t\t0.996078431372549,\n\t\t\t0.6,\n\t\t\t0.1607843137254902,\n\t\t\t0.9254901960784314,\n\t\t\t0.4392156862745098,\n\t\t\t0.0784313725490196,\n\t\t\t0.8,\n\t\t\t0.2980392156862745,\n\t\t\t0.00784313725490196,\n\t\t\t0.6,\n\t\t\t0.203921568627451,\n\t\t\t0.01568627450980392,\n\t\t\t0.4,\n\t\t\t0.1450980392156863,\n\t\t\t0.02352941176470588\n\t\t],\n\t\tName: \"Brewer Sequential Yellow-Orange-Brown (9)\",\n\t\tNanColor: [\n\t\t\t0.4,\n\t\t\t0.1450980392156863,\n\t\t\t0.02352941176470588\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.8980392156862745,\n\t\t\t1,\n\t\t\t0.9686274509803922,\n\t\t\t0.7372549019607844,\n\t\t\t0.996078431372549,\n\t\t\t0.8901960784313725,\n\t\t\t0.5686274509803921,\n\t\t\t0.996078431372549,\n\t\t\t0.7686274509803922,\n\t\t\t0.3098039215686275,\n\t\t\t0.996078431372549,\n\t\t\t0.6,\n\t\t\t0.1607843137254902,\n\t\t\t0.9254901960784314,\n\t\t\t0.4392156862745098,\n\t\t\t0.0784313725490196,\n\t\t\t0.8,\n\t\t\t0.2980392156862745,\n\t\t\t0.00784313725490196,\n\t\t\t0.5490196078431373,\n\t\t\t0.1764705882352941,\n\t\t\t0.01568627450980392\n\t\t],\n\t\tName: \"Brewer Sequential Yellow-Orange-Brown (8)\",\n\t\tNanColor: [\n\t\t\t0.5490196078431373,\n\t\t\t0.1764705882352941,\n\t\t\t0.01568627450980392\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.8313725490196079,\n\t\t\t0.996078431372549,\n\t\t\t0.8901960784313725,\n\t\t\t0.5686274509803921,\n\t\t\t0.996078431372549,\n\t\t\t0.7686274509803922,\n\t\t\t0.3098039215686275,\n\t\t\t0.996078431372549,\n\t\t\t0.6,\n\t\t\t0.1607843137254902,\n\t\t\t0.9254901960784314,\n\t\t\t0.4392156862745098,\n\t\t\t0.0784313725490196,\n\t\t\t0.8,\n\t\t\t0.2980392156862745,\n\t\t\t0.00784313725490196,\n\t\t\t0.5490196078431373,\n\t\t\t0.1764705882352941,\n\t\t\t0.01568627450980392\n\t\t],\n\t\tName: \"Brewer Sequential Yellow-Orange-Brown (7)\",\n\t\tNanColor: [\n\t\t\t0.5490196078431373,\n\t\t\t0.1764705882352941,\n\t\t\t0.01568627450980392\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.8313725490196079,\n\t\t\t0.996078431372549,\n\t\t\t0.8901960784313725,\n\t\t\t0.5686274509803921,\n\t\t\t0.996078431372549,\n\t\t\t0.7686274509803922,\n\t\t\t0.3098039215686275,\n\t\t\t0.996078431372549,\n\t\t\t0.6,\n\t\t\t0.1607843137254902,\n\t\t\t0.8509803921568627,\n\t\t\t0.3725490196078431,\n\t\t\t0.05490196078431372,\n\t\t\t0.6,\n\t\t\t0.203921568627451,\n\t\t\t0.01568627450980392\n\t\t],\n\t\tName: \"Brewer Sequential Yellow-Orange-Brown (6)\",\n\t\tNanColor: [\n\t\t\t0.6,\n\t\t\t0.203921568627451,\n\t\t\t0.01568627450980392\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.8313725490196079,\n\t\t\t0.996078431372549,\n\t\t\t0.8509803921568627,\n\t\t\t0.5568627450980392,\n\t\t\t0.996078431372549,\n\t\t\t0.6,\n\t\t\t0.1607843137254902,\n\t\t\t0.8509803921568627,\n\t\t\t0.3725490196078431,\n\t\t\t0.05490196078431372,\n\t\t\t0.6,\n\t\t\t0.203921568627451,\n\t\t\t0.01568627450980392\n\t\t],\n\t\tName: \"Brewer Sequential Yellow-Orange-Brown (5)\",\n\t\tNanColor: [\n\t\t\t0.6,\n\t\t\t0.203921568627451,\n\t\t\t0.01568627450980392\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.8313725490196079,\n\t\t\t0.996078431372549,\n\t\t\t0.8509803921568627,\n\t\t\t0.5568627450980392,\n\t\t\t0.996078431372549,\n\t\t\t0.6,\n\t\t\t0.1607843137254902,\n\t\t\t0.8,\n\t\t\t0.2980392156862745,\n\t\t\t0.00784313725490196\n\t\t],\n\t\tName: \"Brewer Sequential Yellow-Orange-Brown (4)\",\n\t\tNanColor: [\n\t\t\t0.8,\n\t\t\t0.2980392156862745,\n\t\t\t0.00784313725490196\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t1,\n\t\t\t0.9686274509803922,\n\t\t\t0.7372549019607844,\n\t\t\t0.996078431372549,\n\t\t\t0.7686274509803922,\n\t\t\t0.3098039215686275,\n\t\t\t0.8509803921568627,\n\t\t\t0.3725490196078431,\n\t\t\t0.05490196078431372\n\t\t],\n\t\tName: \"Brewer Sequential Yellow-Orange-Brown (3)\",\n\t\tNanColor: [\n\t\t\t0.8509803921568627,\n\t\t\t0.3725490196078431,\n\t\t\t0.05490196078431372\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.9686274509803922,\n\t\t\t0.9882352941176471,\n\t\t\t0.9921568627450981,\n\t\t\t0.8784313725490196,\n\t\t\t0.9254901960784314,\n\t\t\t0.9568627450980393,\n\t\t\t0.7490196078431373,\n\t\t\t0.8274509803921568,\n\t\t\t0.9019607843137255,\n\t\t\t0.6196078431372549,\n\t\t\t0.7372549019607844,\n\t\t\t0.8549019607843137,\n\t\t\t0.5490196078431373,\n\t\t\t0.5882352941176471,\n\t\t\t0.7764705882352941,\n\t\t\t0.5490196078431373,\n\t\t\t0.4196078431372549,\n\t\t\t0.6941176470588235,\n\t\t\t0.5333333333333333,\n\t\t\t0.2549019607843137,\n\t\t\t0.615686274509804,\n\t\t\t0.5058823529411764,\n\t\t\t0.05882352941176471,\n\t\t\t0.4862745098039216,\n\t\t\t0.3019607843137255,\n\t\t\t0,\n\t\t\t0.2941176470588235\n\t\t],\n\t\tName: \"Brewer Sequential Blue-Purple (9)\",\n\t\tNanColor: [\n\t\t\t0.3019607843137255,\n\t\t\t0,\n\t\t\t0.2941176470588235\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.9686274509803922,\n\t\t\t0.9882352941176471,\n\t\t\t0.9921568627450981,\n\t\t\t0.8784313725490196,\n\t\t\t0.9254901960784314,\n\t\t\t0.9568627450980393,\n\t\t\t0.7490196078431373,\n\t\t\t0.8274509803921568,\n\t\t\t0.9019607843137255,\n\t\t\t0.6196078431372549,\n\t\t\t0.7372549019607844,\n\t\t\t0.8549019607843137,\n\t\t\t0.5490196078431373,\n\t\t\t0.5882352941176471,\n\t\t\t0.7764705882352941,\n\t\t\t0.5490196078431373,\n\t\t\t0.4196078431372549,\n\t\t\t0.6941176470588235,\n\t\t\t0.5333333333333333,\n\t\t\t0.2549019607843137,\n\t\t\t0.615686274509804,\n\t\t\t0.4313725490196079,\n\t\t\t0.00392156862745098,\n\t\t\t0.4196078431372549\n\t\t],\n\t\tName: \"Brewer Sequential Blue-Purple (8)\",\n\t\tNanColor: [\n\t\t\t0.4313725490196079,\n\t\t\t0.00392156862745098,\n\t\t\t0.4196078431372549\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.9294117647058824,\n\t\t\t0.9725490196078431,\n\t\t\t0.984313725490196,\n\t\t\t0.7490196078431373,\n\t\t\t0.8274509803921568,\n\t\t\t0.9019607843137255,\n\t\t\t0.6196078431372549,\n\t\t\t0.7372549019607844,\n\t\t\t0.8549019607843137,\n\t\t\t0.5490196078431373,\n\t\t\t0.5882352941176471,\n\t\t\t0.7764705882352941,\n\t\t\t0.5490196078431373,\n\t\t\t0.4196078431372549,\n\t\t\t0.6941176470588235,\n\t\t\t0.5333333333333333,\n\t\t\t0.2549019607843137,\n\t\t\t0.615686274509804,\n\t\t\t0.4313725490196079,\n\t\t\t0.00392156862745098,\n\t\t\t0.4196078431372549\n\t\t],\n\t\tName: \"Brewer Sequential Blue-Purple (7)\",\n\t\tNanColor: [\n\t\t\t0.4313725490196079,\n\t\t\t0.00392156862745098,\n\t\t\t0.4196078431372549\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.9294117647058824,\n\t\t\t0.9725490196078431,\n\t\t\t0.984313725490196,\n\t\t\t0.7490196078431373,\n\t\t\t0.8274509803921568,\n\t\t\t0.9019607843137255,\n\t\t\t0.6196078431372549,\n\t\t\t0.7372549019607844,\n\t\t\t0.8549019607843137,\n\t\t\t0.5490196078431373,\n\t\t\t0.5882352941176471,\n\t\t\t0.7764705882352941,\n\t\t\t0.5333333333333333,\n\t\t\t0.3372549019607843,\n\t\t\t0.6549019607843137,\n\t\t\t0.5058823529411764,\n\t\t\t0.05882352941176471,\n\t\t\t0.4862745098039216\n\t\t],\n\t\tName: \"Brewer Sequential Blue-Purple (6)\",\n\t\tNanColor: [\n\t\t\t0.5058823529411764,\n\t\t\t0.05882352941176471,\n\t\t\t0.4862745098039216\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.9294117647058824,\n\t\t\t0.9725490196078431,\n\t\t\t0.984313725490196,\n\t\t\t0.7019607843137254,\n\t\t\t0.803921568627451,\n\t\t\t0.8901960784313725,\n\t\t\t0.5490196078431373,\n\t\t\t0.5882352941176471,\n\t\t\t0.7764705882352941,\n\t\t\t0.5333333333333333,\n\t\t\t0.3372549019607843,\n\t\t\t0.6549019607843137,\n\t\t\t0.5058823529411764,\n\t\t\t0.05882352941176471,\n\t\t\t0.4862745098039216\n\t\t],\n\t\tName: \"Brewer Sequential Blue-Purple (5)\",\n\t\tNanColor: [\n\t\t\t0.5058823529411764,\n\t\t\t0.05882352941176471,\n\t\t\t0.4862745098039216\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.9294117647058824,\n\t\t\t0.9725490196078431,\n\t\t\t0.984313725490196,\n\t\t\t0.7019607843137254,\n\t\t\t0.803921568627451,\n\t\t\t0.8901960784313725,\n\t\t\t0.5490196078431373,\n\t\t\t0.5882352941176471,\n\t\t\t0.7764705882352941,\n\t\t\t0.5333333333333333,\n\t\t\t0.2549019607843137,\n\t\t\t0.615686274509804\n\t\t],\n\t\tName: \"Brewer Sequential Blue-Purple (4)\",\n\t\tNanColor: [\n\t\t\t0.5333333333333333,\n\t\t\t0.2549019607843137,\n\t\t\t0.615686274509804\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.8784313725490196,\n\t\t\t0.9254901960784314,\n\t\t\t0.9568627450980393,\n\t\t\t0.6196078431372549,\n\t\t\t0.7372549019607844,\n\t\t\t0.8549019607843137,\n\t\t\t0.5333333333333333,\n\t\t\t0.3372549019607843,\n\t\t\t0.6549019607843137\n\t\t],\n\t\tName: \"Brewer Sequential Blue-Purple (3)\",\n\t\tNanColor: [\n\t\t\t0.5333333333333333,\n\t\t\t0.3372549019607843,\n\t\t\t0.6549019607843137\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.4980392156862745,\n\t\t\t0.788235294117647,\n\t\t\t0.4980392156862745,\n\t\t\t0.7450980392156863,\n\t\t\t0.6823529411764706,\n\t\t\t0.8313725490196079,\n\t\t\t0.9921568627450981,\n\t\t\t0.7529411764705882,\n\t\t\t0.5254901960784314,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.6,\n\t\t\t0.2196078431372549,\n\t\t\t0.4235294117647059,\n\t\t\t0.6901960784313725,\n\t\t\t0.9411764705882353,\n\t\t\t0.00784313725490196,\n\t\t\t0.4980392156862745,\n\t\t\t0.7490196078431373,\n\t\t\t0.3568627450980392,\n\t\t\t0.09019607843137255,\n\t\t\t0.4,\n\t\t\t0.4,\n\t\t\t0.4\n\t\t],\n\t\tName: \"Brewer Qualitative Accent\",\n\t\tNanColor: [\n\t\t\t0.4,\n\t\t\t0.4,\n\t\t\t0.4\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.1058823529411765,\n\t\t\t0.6196078431372549,\n\t\t\t0.4666666666666667,\n\t\t\t0.8509803921568627,\n\t\t\t0.3725490196078431,\n\t\t\t0.00784313725490196,\n\t\t\t0.4588235294117647,\n\t\t\t0.4392156862745098,\n\t\t\t0.7019607843137254,\n\t\t\t0.9058823529411765,\n\t\t\t0.1607843137254902,\n\t\t\t0.5411764705882353,\n\t\t\t0.4,\n\t\t\t0.6509803921568628,\n\t\t\t0.1176470588235294,\n\t\t\t0.9019607843137255,\n\t\t\t0.6705882352941176,\n\t\t\t0.00784313725490196,\n\t\t\t0.6509803921568628,\n\t\t\t0.4627450980392157,\n\t\t\t0.1137254901960784,\n\t\t\t0.4,\n\t\t\t0.4,\n\t\t\t0.4\n\t\t],\n\t\tName: \"Brewer Qualitative Dark2\",\n\t\tNanColor: [\n\t\t\t0.4,\n\t\t\t0.4,\n\t\t\t0.4\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.4,\n\t\t\t0.7607843137254902,\n\t\t\t0.6470588235294118,\n\t\t\t0.9882352941176471,\n\t\t\t0.5529411764705883,\n\t\t\t0.3843137254901961,\n\t\t\t0.5529411764705883,\n\t\t\t0.6274509803921569,\n\t\t\t0.796078431372549,\n\t\t\t0.9058823529411765,\n\t\t\t0.5411764705882353,\n\t\t\t0.7647058823529411,\n\t\t\t0.6509803921568628,\n\t\t\t0.8470588235294118,\n\t\t\t0.3294117647058823,\n\t\t\t1,\n\t\t\t0.8509803921568627,\n\t\t\t0.1843137254901961,\n\t\t\t0.8980392156862745,\n\t\t\t0.7686274509803922,\n\t\t\t0.5803921568627451,\n\t\t\t0.7019607843137254,\n\t\t\t0.7019607843137254,\n\t\t\t0.7019607843137254\n\t\t],\n\t\tName: \"Brewer Qualitative Set2\",\n\t\tNanColor: [\n\t\t\t0.7019607843137254,\n\t\t\t0.7019607843137254,\n\t\t\t0.7019607843137254\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.7019607843137254,\n\t\t\t0.8862745098039215,\n\t\t\t0.803921568627451,\n\t\t\t0.9921568627450981,\n\t\t\t0.803921568627451,\n\t\t\t0.6745098039215687,\n\t\t\t0.796078431372549,\n\t\t\t0.8352941176470589,\n\t\t\t0.9098039215686274,\n\t\t\t0.9568627450980393,\n\t\t\t0.792156862745098,\n\t\t\t0.8941176470588236,\n\t\t\t0.9019607843137255,\n\t\t\t0.9607843137254902,\n\t\t\t0.788235294117647,\n\t\t\t1,\n\t\t\t0.9490196078431372,\n\t\t\t0.6823529411764706,\n\t\t\t0.9450980392156862,\n\t\t\t0.8862745098039215,\n\t\t\t0.8,\n\t\t\t0.8,\n\t\t\t0.8,\n\t\t\t0.8\n\t\t],\n\t\tName: \"Brewer Qualitative Pastel2\",\n\t\tNanColor: [\n\t\t\t0.8,\n\t\t\t0.8,\n\t\t\t0.8\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.984313725490196,\n\t\t\t0.7058823529411765,\n\t\t\t0.6823529411764706,\n\t\t\t0.7019607843137254,\n\t\t\t0.803921568627451,\n\t\t\t0.8901960784313725,\n\t\t\t0.8,\n\t\t\t0.9215686274509803,\n\t\t\t0.7725490196078432,\n\t\t\t0.8705882352941177,\n\t\t\t0.796078431372549,\n\t\t\t0.8941176470588236,\n\t\t\t0.996078431372549,\n\t\t\t0.8509803921568627,\n\t\t\t0.6509803921568628,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.8,\n\t\t\t0.8980392156862745,\n\t\t\t0.8470588235294118,\n\t\t\t0.7411764705882353,\n\t\t\t0.9921568627450981,\n\t\t\t0.8549019607843137,\n\t\t\t0.9254901960784314,\n\t\t\t0.9490196078431372,\n\t\t\t0.9490196078431372,\n\t\t\t0.9490196078431372\n\t\t],\n\t\tName: \"Brewer Qualitative Pastel1\",\n\t\tNanColor: [\n\t\t\t0.9490196078431372,\n\t\t\t0.9490196078431372,\n\t\t\t0.9490196078431372\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.8941176470588236,\n\t\t\t0.1019607843137255,\n\t\t\t0.1098039215686274,\n\t\t\t0.2156862745098039,\n\t\t\t0.4941176470588236,\n\t\t\t0.7215686274509804,\n\t\t\t0.3019607843137255,\n\t\t\t0.6862745098039216,\n\t\t\t0.2901960784313726,\n\t\t\t0.596078431372549,\n\t\t\t0.3058823529411765,\n\t\t\t0.6392156862745098,\n\t\t\t1,\n\t\t\t0.4980392156862745,\n\t\t\t0,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.2,\n\t\t\t0.6509803921568628,\n\t\t\t0.3372549019607843,\n\t\t\t0.1568627450980392,\n\t\t\t0.9686274509803922,\n\t\t\t0.5058823529411764,\n\t\t\t0.7490196078431373,\n\t\t\t0.6,\n\t\t\t0.6,\n\t\t\t0.6\n\t\t],\n\t\tName: \"Brewer Qualitative Set1\",\n\t\tNanColor: [\n\t\t\t0.6,\n\t\t\t0.6,\n\t\t\t0.6\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.6509803921568628,\n\t\t\t0.807843137254902,\n\t\t\t0.8901960784313725,\n\t\t\t0.1215686274509804,\n\t\t\t0.4705882352941176,\n\t\t\t0.7058823529411765,\n\t\t\t0.6980392156862745,\n\t\t\t0.8745098039215686,\n\t\t\t0.5411764705882353,\n\t\t\t0.2,\n\t\t\t0.6274509803921569,\n\t\t\t0.1725490196078431,\n\t\t\t0.984313725490196,\n\t\t\t0.6039215686274509,\n\t\t\t0.6,\n\t\t\t0.8901960784313725,\n\t\t\t0.1019607843137255,\n\t\t\t0.1098039215686274,\n\t\t\t0.9921568627450981,\n\t\t\t0.7490196078431373,\n\t\t\t0.4352941176470588,\n\t\t\t1,\n\t\t\t0.4980392156862745,\n\t\t\t0,\n\t\t\t0.792156862745098,\n\t\t\t0.6980392156862745,\n\t\t\t0.8392156862745098,\n\t\t\t0.4156862745098039,\n\t\t\t0.2392156862745098,\n\t\t\t0.6039215686274509,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.6\n\t\t],\n\t\tName: \"Brewer Qualitative Paired\",\n\t\tNanColor: [\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.6\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.5529411764705883,\n\t\t\t0.8274509803921568,\n\t\t\t0.7803921568627451,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.7019607843137254,\n\t\t\t0.7450980392156863,\n\t\t\t0.7294117647058823,\n\t\t\t0.8549019607843137,\n\t\t\t0.984313725490196,\n\t\t\t0.5019607843137255,\n\t\t\t0.4470588235294118,\n\t\t\t0.5019607843137255,\n\t\t\t0.6941176470588235,\n\t\t\t0.8274509803921568,\n\t\t\t0.9921568627450981,\n\t\t\t0.7058823529411765,\n\t\t\t0.3843137254901961,\n\t\t\t0.7019607843137254,\n\t\t\t0.8705882352941177,\n\t\t\t0.4117647058823529,\n\t\t\t0.9882352941176471,\n\t\t\t0.803921568627451,\n\t\t\t0.8980392156862745,\n\t\t\t0.8509803921568627,\n\t\t\t0.8509803921568627,\n\t\t\t0.8509803921568627,\n\t\t\t0.7372549019607844,\n\t\t\t0.5019607843137255,\n\t\t\t0.7411764705882353,\n\t\t\t0.8,\n\t\t\t0.9215686274509803,\n\t\t\t0.7725490196078432,\n\t\t\t1,\n\t\t\t0.9294117647058824,\n\t\t\t0.4352941176470588\n\t\t],\n\t\tName: \"Brewer Qualitative Set3\",\n\t\tNanColor: [\n\t\t\t1,\n\t\t\t0.9294117647058824,\n\t\t\t0.4352941176470588\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t1,\n\t\t\t0,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0.862745,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0.695201,\n\t\t\t0\n\t\t],\n\t\tName: \"Traffic Lights\",\n\t\tNanColor: [\n\t\t\t0.803922,\n\t\t\t0,\n\t\t\t0.803922\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.908659,\n\t\t\t0.604013,\n\t\t\t0.581857,\n\t\t\t1,\n\t\t\t0.862745,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0.695201,\n\t\t\t0\n\t\t],\n\t\tName: \"Traffic Lights For Deuteranopes\",\n\t\tNanColor: [\n\t\t\t0.803922,\n\t\t\t0,\n\t\t\t0.803922\n\t\t]\n\t},\n\t{\n\t\tIndexedColors: [\n\t\t\t0.4196078431372549,\n\t\t\t0,\n\t\t\t0.07058823529411765,\n\t\t\t0.9019607843137255,\n\t\t\t0.9411764705882353,\n\t\t\t0.0196078431372549,\n\t\t\t0.01568627450980392,\n\t\t\t0.6196078431372549,\n\t\t\t0.00784313725490196\n\t\t],\n\t\tName: \"Traffic Lights For Deuteranopes 2\",\n\t\tNanColor: [\n\t\t\t0.803922,\n\t\t\t0,\n\t\t\t0.803922\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tCreator: \"Francesca Samsel\",\n\t\tName: \"Muted Blue-Green\",\n\t\tNanColor: [\n\t\t\t0.25,\n\t\t\t0,\n\t\t\t0\n\t\t],\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t0.109804,\n\t\t\t0.27451,\n\t\t\t0.301961,\n\t\t\t0.02,\n\t\t\t0.129412,\n\t\t\t0.309804,\n\t\t\t0.341176,\n\t\t\t0.05,\n\t\t\t0.14902,\n\t\t\t0.341176,\n\t\t\t0.380392,\n\t\t\t0.1,\n\t\t\t0.188235,\n\t\t\t0.403922,\n\t\t\t0.458824,\n\t\t\t0.15,\n\t\t\t0.227451,\n\t\t\t0.447059,\n\t\t\t0.521569,\n\t\t\t0.2,\n\t\t\t0.290196,\n\t\t\t0.494118,\n\t\t\t0.588235,\n\t\t\t0.25,\n\t\t\t0.368627,\n\t\t\t0.552941,\n\t\t\t0.670588,\n\t\t\t0.3,\n\t\t\t0.458824,\n\t\t\t0.619608,\n\t\t\t0.74902,\n\t\t\t0.35,\n\t\t\t0.588235,\n\t\t\t0.713725,\n\t\t\t0.85098,\n\t\t\t0.4,\n\t\t\t0.72549,\n\t\t\t0.815686,\n\t\t\t0.941176,\n\t\t\t0.45,\n\t\t\t0.831373,\n\t\t\t0.882353,\n\t\t\t0.980392,\n\t\t\t0.475,\n\t\t\t0.909804,\n\t\t\t0.933333,\n\t\t\t1,\n\t\t\t0.5,\n\t\t\t0.980392,\n\t\t\t0.984314,\n\t\t\t1,\n\t\t\t0.5,\n\t\t\t0.996078,\n\t\t\t1,\n\t\t\t0.94902,\n\t\t\t0.5,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.980392,\n\t\t\t0.5,\n\t\t\t0.980392,\n\t\t\t0.984314,\n\t\t\t1,\n\t\t\t0.525,\n\t\t\t0.972549,\n\t\t\t0.988235,\n\t\t\t0.890196,\n\t\t\t0.55,\n\t\t\t0.917647,\n\t\t\t0.960784,\n\t\t\t0.835294,\n\t\t\t0.6,\n\t\t\t0.835294,\n\t\t\t0.921569,\n\t\t\t0.772549,\n\t\t\t0.65,\n\t\t\t0.768627,\n\t\t\t0.901961,\n\t\t\t0.737255,\n\t\t\t0.7,\n\t\t\t0.670588,\n\t\t\t0.831373,\n\t\t\t0.654902,\n\t\t\t0.75,\n\t\t\t0.576471,\n\t\t\t0.760784,\n\t\t\t0.584314,\n\t\t\t0.8,\n\t\t\t0.498039,\n\t\t\t0.678431,\n\t\t\t0.521569,\n\t\t\t0.85,\n\t\t\t0.392157,\n\t\t\t0.560784,\n\t\t\t0.427451,\n\t\t\t0.9,\n\t\t\t0.294118,\n\t\t\t0.45098,\n\t\t\t0.333333,\n\t\t\t0.95,\n\t\t\t0.211765,\n\t\t\t0.34902,\n\t\t\t0.254902,\n\t\t\t1,\n\t\t\t0.152941,\n\t\t\t0.278431,\n\t\t\t0.196078\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tCreator: \"Francesca Samsel\",\n\t\tName: \"Green-Blue Asymmetric Divergent (62Blbc)\",\n\t\tNanColor: [\n\t\t\t0.25,\n\t\t\t0,\n\t\t\t0\n\t\t],\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t0.121569,\n\t\t\t0.2,\n\t\t\t0.145098,\n\t\t\t0.05,\n\t\t\t0.196078,\n\t\t\t0.301961,\n\t\t\t0.223529,\n\t\t\t0.1,\n\t\t\t0.258824,\n\t\t\t0.4,\n\t\t\t0.278431,\n\t\t\t0.2,\n\t\t\t0.341176,\n\t\t\t0.54902,\n\t\t\t0.341176,\n\t\t\t0.25,\n\t\t\t0.419608,\n\t\t\t0.619608,\n\t\t\t0.376471,\n\t\t\t0.3,\n\t\t\t0.545098,\n\t\t\t0.701961,\n\t\t\t0.392157,\n\t\t\t0.35,\n\t\t\t0.643137,\n\t\t\t0.780392,\n\t\t\t0.403922,\n\t\t\t0.4,\n\t\t\t0.729412,\n\t\t\t0.819608,\n\t\t\t0.45098,\n\t\t\t0.45,\n\t\t\t0.811765,\n\t\t\t0.870588,\n\t\t\t0.521569,\n\t\t\t0.5,\n\t\t\t0.898039,\n\t\t\t0.909804,\n\t\t\t0.564706,\n\t\t\t0.55,\n\t\t\t0.941176,\n\t\t\t0.92549,\n\t\t\t0.686275,\n\t\t\t0.6,\n\t\t\t0.960784,\n\t\t\t0.94902,\n\t\t\t0.776471,\n\t\t\t0.64,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.65,\n\t\t\t0.890196,\n\t\t\t0.988235,\n\t\t\t0.972549,\n\t\t\t0.7,\n\t\t\t0.721569,\n\t\t\t0.894118,\n\t\t\t0.901961,\n\t\t\t0.75,\n\t\t\t0.631373,\n\t\t\t0.823529,\n\t\t\t0.839216,\n\t\t\t0.8,\n\t\t\t0.517647,\n\t\t\t0.662745,\n\t\t\t0.701961,\n\t\t\t0.85,\n\t\t\t0.384314,\n\t\t\t0.494118,\n\t\t\t0.54902,\n\t\t\t0.9,\n\t\t\t0.298039,\n\t\t\t0.360784,\n\t\t\t0.45098,\n\t\t\t0.95,\n\t\t\t0.223529,\n\t\t\t0.25098,\n\t\t\t0.34902,\n\t\t\t0.99,\n\t\t\t0.156863,\n\t\t\t0.172549,\n\t\t\t0.25098,\n\t\t\t1,\n\t\t\t0.137255,\n\t\t\t0.137255,\n\t\t\t0.188235\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tCreator: \"Francesca Samsel\",\n\t\tName: \"Asymmtrical Earth Tones (6_21b)\",\n\t\tNanColor: [\n\t\t\t0.25,\n\t\t\t0,\n\t\t\t0\n\t\t],\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t0.141176,\n\t\t\t0.14902,\n\t\t\t0.2,\n\t\t\t0.05,\n\t\t\t0.215686,\n\t\t\t0.258824,\n\t\t\t0.321569,\n\t\t\t0.1,\n\t\t\t0.243137,\n\t\t\t0.368627,\n\t\t\t0.380392,\n\t\t\t0.15,\n\t\t\t0.27451,\n\t\t\t0.439216,\n\t\t\t0.4,\n\t\t\t0.2,\n\t\t\t0.32549,\n\t\t\t0.501961,\n\t\t\t0.384314,\n\t\t\t0.25,\n\t\t\t0.403922,\n\t\t\t0.6,\n\t\t\t0.419608,\n\t\t\t0.3,\n\t\t\t0.486275,\n\t\t\t0.701961,\n\t\t\t0.454902,\n\t\t\t0.35,\n\t\t\t0.556863,\n\t\t\t0.74902,\n\t\t\t0.494118,\n\t\t\t0.4,\n\t\t\t0.670588,\n\t\t\t0.8,\n\t\t\t0.545098,\n\t\t\t0.5,\n\t\t\t0.854902,\n\t\t\t0.901961,\n\t\t\t0.631373,\n\t\t\t0.55,\n\t\t\t0.92549,\n\t\t\t0.941176,\n\t\t\t0.694118,\n\t\t\t0.6,\n\t\t\t0.960784,\n\t\t\t0.94902,\n\t\t\t0.776471,\n\t\t\t0.65,\n\t\t\t0.988235,\n\t\t\t0.968627,\n\t\t\t0.909804,\n\t\t\t0.7,\n\t\t\t0.839216,\n\t\t\t0.815686,\n\t\t\t0.772549,\n\t\t\t0.75,\n\t\t\t0.701961,\n\t\t\t0.662745,\n\t\t\t0.615686,\n\t\t\t0.8,\n\t\t\t0.6,\n\t\t\t0.529412,\n\t\t\t0.478431,\n\t\t\t0.85,\n\t\t\t0.501961,\n\t\t\t0.403922,\n\t\t\t0.360784,\n\t\t\t0.9,\n\t\t\t0.439216,\n\t\t\t0.313725,\n\t\t\t0.290196,\n\t\t\t1,\n\t\t\t0.301961,\n\t\t\t0.164706,\n\t\t\t0.176471\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Lab\",\n\t\tCreator: \"Francesca Samsel\",\n\t\tName: \"Yellow 15\",\n\t\tNanColor: [\n\t\t\t0.25,\n\t\t\t0,\n\t\t\t0\n\t\t],\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.988235,\n\t\t\t0.002,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.988235,\n\t\t\t0.05,\n\t\t\t0.984314,\n\t\t\t0.988235,\n\t\t\t0.843137,\n\t\t\t0.1,\n\t\t\t0.988235,\n\t\t\t0.988235,\n\t\t\t0.741176,\n\t\t\t0.15,\n\t\t\t0.980392,\n\t\t\t0.968627,\n\t\t\t0.654902,\n\t\t\t0.2,\n\t\t\t0.980392,\n\t\t\t0.945098,\n\t\t\t0.576471,\n\t\t\t0.25,\n\t\t\t0.968627,\n\t\t\t0.905882,\n\t\t\t0.486275,\n\t\t\t0.3,\n\t\t\t0.968627,\n\t\t\t0.862745,\n\t\t\t0.388235,\n\t\t\t0.35,\n\t\t\t0.960784,\n\t\t\t0.803922,\n\t\t\t0.286275,\n\t\t\t0.4,\n\t\t\t0.94902,\n\t\t\t0.741176,\n\t\t\t0.219608,\n\t\t\t0.45,\n\t\t\t0.941176,\n\t\t\t0.678431,\n\t\t\t0.14902,\n\t\t\t0.5,\n\t\t\t0.929412,\n\t\t\t0.607843,\n\t\t\t0.094118,\n\t\t\t0.55,\n\t\t\t0.921569,\n\t\t\t0.545098,\n\t\t\t0.054902,\n\t\t\t0.6,\n\t\t\t0.909804,\n\t\t\t0.486275,\n\t\t\t0.035294,\n\t\t\t0.65,\n\t\t\t0.890196,\n\t\t\t0.411765,\n\t\t\t0.019608,\n\t\t\t0.7,\n\t\t\t0.8,\n\t\t\t0.305882,\n\t\t\t0,\n\t\t\t0.75,\n\t\t\t0.760784,\n\t\t\t0.239216,\n\t\t\t0,\n\t\t\t0.8,\n\t\t\t0.678431,\n\t\t\t0.180392,\n\t\t\t0.011765,\n\t\t\t0.85,\n\t\t\t0.6,\n\t\t\t0.121569,\n\t\t\t0.023529,\n\t\t\t0.9,\n\t\t\t0.501961,\n\t\t\t0.054902,\n\t\t\t0.031373,\n\t\t\t0.95,\n\t\t\t0.4,\n\t\t\t0.039216,\n\t\t\t0.058824,\n\t\t\t1,\n\t\t\t0.301961,\n\t\t\t0.047059,\n\t\t\t0.090196\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Diverging\",\n\t\tName: \"Magma (matplotlib)\",\n\t\tNanColor: [\n\t\t\t0,\n\t\t\t1,\n\t\t\t0\n\t\t],\n\t\tSource: \"https://github.com/BIDS/colormap/blob/master/colormaps.py\",\n\t\tLicense: \"CC0\",\n\t\tCreator: \"Nathaniel J. Smith & Stefan van der Walt\",\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t0.001462,\n\t\t\t0.000466,\n\t\t\t0.013866,\n\t\t\t0.003922,\n\t\t\t0.002258,\n\t\t\t0.001295,\n\t\t\t0.018331,\n\t\t\t0.007843,\n\t\t\t0.003279,\n\t\t\t0.002305,\n\t\t\t0.023708,\n\t\t\t0.011765,\n\t\t\t0.004512,\n\t\t\t0.00349,\n\t\t\t0.029965,\n\t\t\t0.015686,\n\t\t\t0.00595,\n\t\t\t0.004843,\n\t\t\t0.03713,\n\t\t\t0.019608,\n\t\t\t0.007588,\n\t\t\t0.006356,\n\t\t\t0.044973,\n\t\t\t0.023529,\n\t\t\t0.009426,\n\t\t\t0.008022,\n\t\t\t0.052844,\n\t\t\t0.027451,\n\t\t\t0.011465,\n\t\t\t0.009828,\n\t\t\t0.06075,\n\t\t\t0.031373,\n\t\t\t0.013708,\n\t\t\t0.011771,\n\t\t\t0.068667,\n\t\t\t0.035294,\n\t\t\t0.016156,\n\t\t\t0.01384,\n\t\t\t0.076603,\n\t\t\t0.039216,\n\t\t\t0.018815,\n\t\t\t0.016026,\n\t\t\t0.084584,\n\t\t\t0.043137,\n\t\t\t0.021692,\n\t\t\t0.01832,\n\t\t\t0.09261,\n\t\t\t0.047059,\n\t\t\t0.024792,\n\t\t\t0.020715,\n\t\t\t0.100676,\n\t\t\t0.05098,\n\t\t\t0.028123,\n\t\t\t0.023201,\n\t\t\t0.108787,\n\t\t\t0.054902,\n\t\t\t0.031696,\n\t\t\t0.025765,\n\t\t\t0.116965,\n\t\t\t0.058824,\n\t\t\t0.03552,\n\t\t\t0.028397,\n\t\t\t0.125209,\n\t\t\t0.062745,\n\t\t\t0.039608,\n\t\t\t0.03109,\n\t\t\t0.133515,\n\t\t\t0.066667,\n\t\t\t0.04383,\n\t\t\t0.03383,\n\t\t\t0.141886,\n\t\t\t0.070588,\n\t\t\t0.048062,\n\t\t\t0.036607,\n\t\t\t0.150327,\n\t\t\t0.07451,\n\t\t\t0.05232,\n\t\t\t0.039407,\n\t\t\t0.158841,\n\t\t\t0.078431,\n\t\t\t0.056615,\n\t\t\t0.04216,\n\t\t\t0.167446,\n\t\t\t0.082353,\n\t\t\t0.060949,\n\t\t\t0.044794,\n\t\t\t0.176129,\n\t\t\t0.086275,\n\t\t\t0.06533,\n\t\t\t0.047318,\n\t\t\t0.184892,\n\t\t\t0.090196,\n\t\t\t0.069764,\n\t\t\t0.049726,\n\t\t\t0.193735,\n\t\t\t0.094118,\n\t\t\t0.074257,\n\t\t\t0.052017,\n\t\t\t0.20266,\n\t\t\t0.098039,\n\t\t\t0.078815,\n\t\t\t0.054184,\n\t\t\t0.211667,\n\t\t\t0.101961,\n\t\t\t0.083446,\n\t\t\t0.056225,\n\t\t\t0.220755,\n\t\t\t0.105882,\n\t\t\t0.088155,\n\t\t\t0.058133,\n\t\t\t0.229922,\n\t\t\t0.109804,\n\t\t\t0.092949,\n\t\t\t0.059904,\n\t\t\t0.239164,\n\t\t\t0.113725,\n\t\t\t0.097833,\n\t\t\t0.061531,\n\t\t\t0.248477,\n\t\t\t0.117647,\n\t\t\t0.102815,\n\t\t\t0.06301,\n\t\t\t0.257854,\n\t\t\t0.121569,\n\t\t\t0.107899,\n\t\t\t0.064335,\n\t\t\t0.267289,\n\t\t\t0.12549,\n\t\t\t0.113094,\n\t\t\t0.065492,\n\t\t\t0.276784,\n\t\t\t0.129412,\n\t\t\t0.118405,\n\t\t\t0.066479,\n\t\t\t0.286321,\n\t\t\t0.133333,\n\t\t\t0.123833,\n\t\t\t0.067295,\n\t\t\t0.295879,\n\t\t\t0.137255,\n\t\t\t0.12938,\n\t\t\t0.067935,\n\t\t\t0.305443,\n\t\t\t0.141176,\n\t\t\t0.135053,\n\t\t\t0.068391,\n\t\t\t0.315,\n\t\t\t0.145098,\n\t\t\t0.140858,\n\t\t\t0.068654,\n\t\t\t0.324538,\n\t\t\t0.14902,\n\t\t\t0.146785,\n\t\t\t0.068738,\n\t\t\t0.334011,\n\t\t\t0.152941,\n\t\t\t0.152839,\n\t\t\t0.068637,\n\t\t\t0.343404,\n\t\t\t0.156863,\n\t\t\t0.159018,\n\t\t\t0.068354,\n\t\t\t0.352688,\n\t\t\t0.160784,\n\t\t\t0.165308,\n\t\t\t0.067911,\n\t\t\t0.361816,\n\t\t\t0.164706,\n\t\t\t0.171713,\n\t\t\t0.067305,\n\t\t\t0.370771,\n\t\t\t0.168627,\n\t\t\t0.178212,\n\t\t\t0.066576,\n\t\t\t0.379497,\n\t\t\t0.172549,\n\t\t\t0.184801,\n\t\t\t0.065732,\n\t\t\t0.387973,\n\t\t\t0.176471,\n\t\t\t0.19146,\n\t\t\t0.064818,\n\t\t\t0.396152,\n\t\t\t0.180392,\n\t\t\t0.198177,\n\t\t\t0.063862,\n\t\t\t0.404009,\n\t\t\t0.184314,\n\t\t\t0.204935,\n\t\t\t0.062907,\n\t\t\t0.411514,\n\t\t\t0.188235,\n\t\t\t0.211718,\n\t\t\t0.061992,\n\t\t\t0.418647,\n\t\t\t0.192157,\n\t\t\t0.218512,\n\t\t\t0.061158,\n\t\t\t0.425392,\n\t\t\t0.196078,\n\t\t\t0.225302,\n\t\t\t0.060445,\n\t\t\t0.431742,\n\t\t\t0.2,\n\t\t\t0.232077,\n\t\t\t0.059889,\n\t\t\t0.437695,\n\t\t\t0.203922,\n\t\t\t0.238826,\n\t\t\t0.059517,\n\t\t\t0.443256,\n\t\t\t0.207843,\n\t\t\t0.245543,\n\t\t\t0.059352,\n\t\t\t0.448436,\n\t\t\t0.211765,\n\t\t\t0.25222,\n\t\t\t0.059415,\n\t\t\t0.453248,\n\t\t\t0.215686,\n\t\t\t0.258857,\n\t\t\t0.059706,\n\t\t\t0.45771,\n\t\t\t0.219608,\n\t\t\t0.265447,\n\t\t\t0.060237,\n\t\t\t0.46184,\n\t\t\t0.223529,\n\t\t\t0.271994,\n\t\t\t0.060994,\n\t\t\t0.46566,\n\t\t\t0.227451,\n\t\t\t0.278493,\n\t\t\t0.061978,\n\t\t\t0.46919,\n\t\t\t0.231373,\n\t\t\t0.284951,\n\t\t\t0.063168,\n\t\t\t0.472451,\n\t\t\t0.235294,\n\t\t\t0.291366,\n\t\t\t0.064553,\n\t\t\t0.475462,\n\t\t\t0.239216,\n\t\t\t0.29774,\n\t\t\t0.066117,\n\t\t\t0.478243,\n\t\t\t0.243137,\n\t\t\t0.304081,\n\t\t\t0.067835,\n\t\t\t0.480812,\n\t\t\t0.247059,\n\t\t\t0.310382,\n\t\t\t0.069702,\n\t\t\t0.483186,\n\t\t\t0.25098,\n\t\t\t0.316654,\n\t\t\t0.07169,\n\t\t\t0.48538,\n\t\t\t0.254902,\n\t\t\t0.322899,\n\t\t\t0.073782,\n\t\t\t0.487408,\n\t\t\t0.258824,\n\t\t\t0.329114,\n\t\t\t0.075972,\n\t\t\t0.489287,\n\t\t\t0.262745,\n\t\t\t0.335308,\n\t\t\t0.078236,\n\t\t\t0.491024,\n\t\t\t0.266667,\n\t\t\t0.341482,\n\t\t\t0.080564,\n\t\t\t0.492631,\n\t\t\t0.270588,\n\t\t\t0.347636,\n\t\t\t0.082946,\n\t\t\t0.494121,\n\t\t\t0.27451,\n\t\t\t0.353773,\n\t\t\t0.085373,\n\t\t\t0.495501,\n\t\t\t0.278431,\n\t\t\t0.359898,\n\t\t\t0.087831,\n\t\t\t0.496778,\n\t\t\t0.282353,\n\t\t\t0.366012,\n\t\t\t0.090314,\n\t\t\t0.49796,\n\t\t\t0.286275,\n\t\t\t0.372116,\n\t\t\t0.092816,\n\t\t\t0.499053,\n\t\t\t0.290196,\n\t\t\t0.378211,\n\t\t\t0.095332,\n\t\t\t0.500067,\n\t\t\t0.294118,\n\t\t\t0.384299,\n\t\t\t0.097855,\n\t\t\t0.501002,\n\t\t\t0.298039,\n\t\t\t0.390384,\n\t\t\t0.100379,\n\t\t\t0.501864,\n\t\t\t0.301961,\n\t\t\t0.396467,\n\t\t\t0.102902,\n\t\t\t0.502658,\n\t\t\t0.305882,\n\t\t\t0.402548,\n\t\t\t0.10542,\n\t\t\t0.503386,\n\t\t\t0.309804,\n\t\t\t0.408629,\n\t\t\t0.10793,\n\t\t\t0.504052,\n\t\t\t0.313725,\n\t\t\t0.414709,\n\t\t\t0.110431,\n\t\t\t0.504662,\n\t\t\t0.317647,\n\t\t\t0.420791,\n\t\t\t0.11292,\n\t\t\t0.505215,\n\t\t\t0.321569,\n\t\t\t0.426877,\n\t\t\t0.115395,\n\t\t\t0.505714,\n\t\t\t0.32549,\n\t\t\t0.432967,\n\t\t\t0.117855,\n\t\t\t0.50616,\n\t\t\t0.329412,\n\t\t\t0.439062,\n\t\t\t0.120298,\n\t\t\t0.506555,\n\t\t\t0.333333,\n\t\t\t0.445163,\n\t\t\t0.122724,\n\t\t\t0.506901,\n\t\t\t0.337255,\n\t\t\t0.451271,\n\t\t\t0.125132,\n\t\t\t0.507198,\n\t\t\t0.341176,\n\t\t\t0.457386,\n\t\t\t0.127522,\n\t\t\t0.507448,\n\t\t\t0.345098,\n\t\t\t0.463508,\n\t\t\t0.129893,\n\t\t\t0.507652,\n\t\t\t0.34902,\n\t\t\t0.46964,\n\t\t\t0.132245,\n\t\t\t0.507809,\n\t\t\t0.352941,\n\t\t\t0.47578,\n\t\t\t0.134577,\n\t\t\t0.507921,\n\t\t\t0.356863,\n\t\t\t0.481929,\n\t\t\t0.136891,\n\t\t\t0.507989,\n\t\t\t0.360784,\n\t\t\t0.488088,\n\t\t\t0.139186,\n\t\t\t0.508011,\n\t\t\t0.364706,\n\t\t\t0.494258,\n\t\t\t0.141462,\n\t\t\t0.507988,\n\t\t\t0.368627,\n\t\t\t0.500438,\n\t\t\t0.143719,\n\t\t\t0.50792,\n\t\t\t0.372549,\n\t\t\t0.506629,\n\t\t\t0.145958,\n\t\t\t0.507806,\n\t\t\t0.376471,\n\t\t\t0.512831,\n\t\t\t0.148179,\n\t\t\t0.507648,\n\t\t\t0.380392,\n\t\t\t0.519045,\n\t\t\t0.150383,\n\t\t\t0.507443,\n\t\t\t0.384314,\n\t\t\t0.52527,\n\t\t\t0.152569,\n\t\t\t0.507192,\n\t\t\t0.388235,\n\t\t\t0.531507,\n\t\t\t0.154739,\n\t\t\t0.506895,\n\t\t\t0.392157,\n\t\t\t0.537755,\n\t\t\t0.156894,\n\t\t\t0.506551,\n\t\t\t0.396078,\n\t\t\t0.544015,\n\t\t\t0.159033,\n\t\t\t0.506159,\n\t\t\t0.4,\n\t\t\t0.550287,\n\t\t\t0.161158,\n\t\t\t0.505719,\n\t\t\t0.403922,\n\t\t\t0.556571,\n\t\t\t0.163269,\n\t\t\t0.50523,\n\t\t\t0.407843,\n\t\t\t0.562866,\n\t\t\t0.165368,\n\t\t\t0.504692,\n\t\t\t0.411765,\n\t\t\t0.569172,\n\t\t\t0.167454,\n\t\t\t0.504105,\n\t\t\t0.415686,\n\t\t\t0.57549,\n\t\t\t0.16953,\n\t\t\t0.503466,\n\t\t\t0.419608,\n\t\t\t0.581819,\n\t\t\t0.171596,\n\t\t\t0.502777,\n\t\t\t0.423529,\n\t\t\t0.588158,\n\t\t\t0.173652,\n\t\t\t0.502035,\n\t\t\t0.427451,\n\t\t\t0.594508,\n\t\t\t0.175701,\n\t\t\t0.501241,\n\t\t\t0.431373,\n\t\t\t0.600868,\n\t\t\t0.177743,\n\t\t\t0.500394,\n\t\t\t0.435294,\n\t\t\t0.607238,\n\t\t\t0.179779,\n\t\t\t0.499492,\n\t\t\t0.439216,\n\t\t\t0.613617,\n\t\t\t0.181811,\n\t\t\t0.498536,\n\t\t\t0.443137,\n\t\t\t0.620005,\n\t\t\t0.18384,\n\t\t\t0.497524,\n\t\t\t0.447059,\n\t\t\t0.626401,\n\t\t\t0.185867,\n\t\t\t0.496456,\n\t\t\t0.45098,\n\t\t\t0.632805,\n\t\t\t0.187893,\n\t\t\t0.495332,\n\t\t\t0.454902,\n\t\t\t0.639216,\n\t\t\t0.189921,\n\t\t\t0.49415,\n\t\t\t0.458824,\n\t\t\t0.645633,\n\t\t\t0.191952,\n\t\t\t0.49291,\n\t\t\t0.462745,\n\t\t\t0.652056,\n\t\t\t0.193986,\n\t\t\t0.491611,\n\t\t\t0.466667,\n\t\t\t0.658483,\n\t\t\t0.196027,\n\t\t\t0.490253,\n\t\t\t0.470588,\n\t\t\t0.664915,\n\t\t\t0.198075,\n\t\t\t0.488836,\n\t\t\t0.47451,\n\t\t\t0.671349,\n\t\t\t0.200133,\n\t\t\t0.487358,\n\t\t\t0.478431,\n\t\t\t0.677786,\n\t\t\t0.202203,\n\t\t\t0.485819,\n\t\t\t0.482353,\n\t\t\t0.684224,\n\t\t\t0.204286,\n\t\t\t0.484219,\n\t\t\t0.486275,\n\t\t\t0.690661,\n\t\t\t0.206384,\n\t\t\t0.482558,\n\t\t\t0.490196,\n\t\t\t0.697098,\n\t\t\t0.208501,\n\t\t\t0.480835,\n\t\t\t0.494118,\n\t\t\t0.703532,\n\t\t\t0.210638,\n\t\t\t0.479049,\n\t\t\t0.498039,\n\t\t\t0.709962,\n\t\t\t0.212797,\n\t\t\t0.477201,\n\t\t\t0.501961,\n\t\t\t0.716387,\n\t\t\t0.214982,\n\t\t\t0.47529,\n\t\t\t0.505882,\n\t\t\t0.722805,\n\t\t\t0.217194,\n\t\t\t0.473316,\n\t\t\t0.509804,\n\t\t\t0.729216,\n\t\t\t0.219437,\n\t\t\t0.471279,\n\t\t\t0.513725,\n\t\t\t0.735616,\n\t\t\t0.221713,\n\t\t\t0.46918,\n\t\t\t0.517647,\n\t\t\t0.742004,\n\t\t\t0.224025,\n\t\t\t0.467018,\n\t\t\t0.521569,\n\t\t\t0.748378,\n\t\t\t0.226377,\n\t\t\t0.464794,\n\t\t\t0.52549,\n\t\t\t0.754737,\n\t\t\t0.228772,\n\t\t\t0.462509,\n\t\t\t0.529412,\n\t\t\t0.761077,\n\t\t\t0.231214,\n\t\t\t0.460162,\n\t\t\t0.533333,\n\t\t\t0.767398,\n\t\t\t0.233705,\n\t\t\t0.457755,\n\t\t\t0.537255,\n\t\t\t0.773695,\n\t\t\t0.236249,\n\t\t\t0.455289,\n\t\t\t0.541176,\n\t\t\t0.779968,\n\t\t\t0.238851,\n\t\t\t0.452765,\n\t\t\t0.545098,\n\t\t\t0.786212,\n\t\t\t0.241514,\n\t\t\t0.450184,\n\t\t\t0.54902,\n\t\t\t0.792427,\n\t\t\t0.244242,\n\t\t\t0.447543,\n\t\t\t0.552941,\n\t\t\t0.798608,\n\t\t\t0.24704,\n\t\t\t0.444848,\n\t\t\t0.556863,\n\t\t\t0.804752,\n\t\t\t0.249911,\n\t\t\t0.442102,\n\t\t\t0.560784,\n\t\t\t0.810855,\n\t\t\t0.252861,\n\t\t\t0.439305,\n\t\t\t0.564706,\n\t\t\t0.816914,\n\t\t\t0.255895,\n\t\t\t0.436461,\n\t\t\t0.568627,\n\t\t\t0.822926,\n\t\t\t0.259016,\n\t\t\t0.433573,\n\t\t\t0.572549,\n\t\t\t0.828886,\n\t\t\t0.262229,\n\t\t\t0.430644,\n\t\t\t0.576471,\n\t\t\t0.834791,\n\t\t\t0.26554,\n\t\t\t0.427671,\n\t\t\t0.580392,\n\t\t\t0.840636,\n\t\t\t0.268953,\n\t\t\t0.424666,\n\t\t\t0.584314,\n\t\t\t0.846416,\n\t\t\t0.272473,\n\t\t\t0.421631,\n\t\t\t0.588235,\n\t\t\t0.852126,\n\t\t\t0.276106,\n\t\t\t0.418573,\n\t\t\t0.592157,\n\t\t\t0.857763,\n\t\t\t0.279857,\n\t\t\t0.415496,\n\t\t\t0.596078,\n\t\t\t0.86332,\n\t\t\t0.283729,\n\t\t\t0.412403,\n\t\t\t0.6,\n\t\t\t0.868793,\n\t\t\t0.287728,\n\t\t\t0.409303,\n\t\t\t0.603922,\n\t\t\t0.874176,\n\t\t\t0.291859,\n\t\t\t0.406205,\n\t\t\t0.607843,\n\t\t\t0.879464,\n\t\t\t0.296125,\n\t\t\t0.403118,\n\t\t\t0.611765,\n\t\t\t0.884651,\n\t\t\t0.30053,\n\t\t\t0.400047,\n\t\t\t0.615686,\n\t\t\t0.889731,\n\t\t\t0.305079,\n\t\t\t0.397002,\n\t\t\t0.619608,\n\t\t\t0.8947,\n\t\t\t0.309773,\n\t\t\t0.393995,\n\t\t\t0.623529,\n\t\t\t0.899552,\n\t\t\t0.314616,\n\t\t\t0.391037,\n\t\t\t0.627451,\n\t\t\t0.904281,\n\t\t\t0.31961,\n\t\t\t0.388137,\n\t\t\t0.631373,\n\t\t\t0.908884,\n\t\t\t0.324755,\n\t\t\t0.385308,\n\t\t\t0.635294,\n\t\t\t0.913354,\n\t\t\t0.330052,\n\t\t\t0.382563,\n\t\t\t0.639216,\n\t\t\t0.917689,\n\t\t\t0.3355,\n\t\t\t0.379915,\n\t\t\t0.643137,\n\t\t\t0.921884,\n\t\t\t0.341098,\n\t\t\t0.377376,\n\t\t\t0.647059,\n\t\t\t0.925937,\n\t\t\t0.346844,\n\t\t\t0.374959,\n\t\t\t0.65098,\n\t\t\t0.929845,\n\t\t\t0.352734,\n\t\t\t0.372677,\n\t\t\t0.654902,\n\t\t\t0.933606,\n\t\t\t0.358764,\n\t\t\t0.370541,\n\t\t\t0.658824,\n\t\t\t0.937221,\n\t\t\t0.364929,\n\t\t\t0.368567,\n\t\t\t0.662745,\n\t\t\t0.940687,\n\t\t\t0.371224,\n\t\t\t0.366762,\n\t\t\t0.666667,\n\t\t\t0.944006,\n\t\t\t0.377643,\n\t\t\t0.365136,\n\t\t\t0.670588,\n\t\t\t0.94718,\n\t\t\t0.384178,\n\t\t\t0.363701,\n\t\t\t0.67451,\n\t\t\t0.95021,\n\t\t\t0.39082,\n\t\t\t0.362468,\n\t\t\t0.678431,\n\t\t\t0.953099,\n\t\t\t0.397563,\n\t\t\t0.361438,\n\t\t\t0.682353,\n\t\t\t0.955849,\n\t\t\t0.4044,\n\t\t\t0.360619,\n\t\t\t0.686275,\n\t\t\t0.958464,\n\t\t\t0.411324,\n\t\t\t0.360014,\n\t\t\t0.690196,\n\t\t\t0.960949,\n\t\t\t0.418323,\n\t\t\t0.35963,\n\t\t\t0.694118,\n\t\t\t0.96331,\n\t\t\t0.42539,\n\t\t\t0.359469,\n\t\t\t0.698039,\n\t\t\t0.965549,\n\t\t\t0.432519,\n\t\t\t0.359529,\n\t\t\t0.701961,\n\t\t\t0.967671,\n\t\t\t0.439703,\n\t\t\t0.35981,\n\t\t\t0.705882,\n\t\t\t0.96968,\n\t\t\t0.446936,\n\t\t\t0.360311,\n\t\t\t0.709804,\n\t\t\t0.971582,\n\t\t\t0.45421,\n\t\t\t0.36103,\n\t\t\t0.713725,\n\t\t\t0.973381,\n\t\t\t0.46152,\n\t\t\t0.361965,\n\t\t\t0.717647,\n\t\t\t0.975082,\n\t\t\t0.468861,\n\t\t\t0.363111,\n\t\t\t0.721569,\n\t\t\t0.97669,\n\t\t\t0.476226,\n\t\t\t0.364466,\n\t\t\t0.72549,\n\t\t\t0.97821,\n\t\t\t0.483612,\n\t\t\t0.366025,\n\t\t\t0.729412,\n\t\t\t0.979645,\n\t\t\t0.491014,\n\t\t\t0.367783,\n\t\t\t0.733333,\n\t\t\t0.981,\n\t\t\t0.498428,\n\t\t\t0.369734,\n\t\t\t0.737255,\n\t\t\t0.982279,\n\t\t\t0.505851,\n\t\t\t0.371874,\n\t\t\t0.741176,\n\t\t\t0.983485,\n\t\t\t0.51328,\n\t\t\t0.374198,\n\t\t\t0.745098,\n\t\t\t0.984622,\n\t\t\t0.520713,\n\t\t\t0.376698,\n\t\t\t0.74902,\n\t\t\t0.985693,\n\t\t\t0.528148,\n\t\t\t0.379371,\n\t\t\t0.752941,\n\t\t\t0.9867,\n\t\t\t0.535582,\n\t\t\t0.38221,\n\t\t\t0.756863,\n\t\t\t0.987646,\n\t\t\t0.543015,\n\t\t\t0.38521,\n\t\t\t0.760784,\n\t\t\t0.988533,\n\t\t\t0.550446,\n\t\t\t0.388365,\n\t\t\t0.764706,\n\t\t\t0.989363,\n\t\t\t0.557873,\n\t\t\t0.391671,\n\t\t\t0.768627,\n\t\t\t0.990138,\n\t\t\t0.565296,\n\t\t\t0.395122,\n\t\t\t0.772549,\n\t\t\t0.990871,\n\t\t\t0.572706,\n\t\t\t0.398714,\n\t\t\t0.776471,\n\t\t\t0.991558,\n\t\t\t0.580107,\n\t\t\t0.402441,\n\t\t\t0.780392,\n\t\t\t0.992196,\n\t\t\t0.587502,\n\t\t\t0.406299,\n\t\t\t0.784314,\n\t\t\t0.992785,\n\t\t\t0.594891,\n\t\t\t0.410283,\n\t\t\t0.788235,\n\t\t\t0.993326,\n\t\t\t0.602275,\n\t\t\t0.41439,\n\t\t\t0.792157,\n\t\t\t0.993834,\n\t\t\t0.609644,\n\t\t\t0.418613,\n\t\t\t0.796078,\n\t\t\t0.994309,\n\t\t\t0.616999,\n\t\t\t0.42295,\n\t\t\t0.8,\n\t\t\t0.994738,\n\t\t\t0.62435,\n\t\t\t0.427397,\n\t\t\t0.803922,\n\t\t\t0.995122,\n\t\t\t0.631696,\n\t\t\t0.431951,\n\t\t\t0.807843,\n\t\t\t0.99548,\n\t\t\t0.639027,\n\t\t\t0.436607,\n\t\t\t0.811765,\n\t\t\t0.99581,\n\t\t\t0.646344,\n\t\t\t0.441361,\n\t\t\t0.815686,\n\t\t\t0.996096,\n\t\t\t0.653659,\n\t\t\t0.446213,\n\t\t\t0.819608,\n\t\t\t0.996341,\n\t\t\t0.660969,\n\t\t\t0.45116,\n\t\t\t0.823529,\n\t\t\t0.99658,\n\t\t\t0.668256,\n\t\t\t0.456192,\n\t\t\t0.827451,\n\t\t\t0.996775,\n\t\t\t0.675541,\n\t\t\t0.461314,\n\t\t\t0.831373,\n\t\t\t0.996925,\n\t\t\t0.682828,\n\t\t\t0.466526,\n\t\t\t0.835294,\n\t\t\t0.997077,\n\t\t\t0.690088,\n\t\t\t0.471811,\n\t\t\t0.839216,\n\t\t\t0.997186,\n\t\t\t0.697349,\n\t\t\t0.477182,\n\t\t\t0.843137,\n\t\t\t0.997254,\n\t\t\t0.704611,\n\t\t\t0.482635,\n\t\t\t0.847059,\n\t\t\t0.997325,\n\t\t\t0.711848,\n\t\t\t0.488154,\n\t\t\t0.85098,\n\t\t\t0.997351,\n\t\t\t0.719089,\n\t\t\t0.493755,\n\t\t\t0.854902,\n\t\t\t0.997351,\n\t\t\t0.726324,\n\t\t\t0.499428,\n\t\t\t0.858824,\n\t\t\t0.997341,\n\t\t\t0.733545,\n\t\t\t0.505167,\n\t\t\t0.862745,\n\t\t\t0.997285,\n\t\t\t0.740772,\n\t\t\t0.510983,\n\t\t\t0.866667,\n\t\t\t0.997228,\n\t\t\t0.747981,\n\t\t\t0.516859,\n\t\t\t0.870588,\n\t\t\t0.997138,\n\t\t\t0.75519,\n\t\t\t0.522806,\n\t\t\t0.87451,\n\t\t\t0.997019,\n\t\t\t0.762398,\n\t\t\t0.528821,\n\t\t\t0.878431,\n\t\t\t0.996898,\n\t\t\t0.769591,\n\t\t\t0.534892,\n\t\t\t0.882353,\n\t\t\t0.996727,\n\t\t\t0.776795,\n\t\t\t0.541039,\n\t\t\t0.886275,\n\t\t\t0.996571,\n\t\t\t0.783977,\n\t\t\t0.547233,\n\t\t\t0.890196,\n\t\t\t0.996369,\n\t\t\t0.791167,\n\t\t\t0.553499,\n\t\t\t0.894118,\n\t\t\t0.996162,\n\t\t\t0.798348,\n\t\t\t0.55982,\n\t\t\t0.898039,\n\t\t\t0.995932,\n\t\t\t0.805527,\n\t\t\t0.566202,\n\t\t\t0.901961,\n\t\t\t0.99568,\n\t\t\t0.812706,\n\t\t\t0.572645,\n\t\t\t0.905882,\n\t\t\t0.995424,\n\t\t\t0.819875,\n\t\t\t0.57914,\n\t\t\t0.909804,\n\t\t\t0.995131,\n\t\t\t0.827052,\n\t\t\t0.585701,\n\t\t\t0.913725,\n\t\t\t0.994851,\n\t\t\t0.834213,\n\t\t\t0.592307,\n\t\t\t0.917647,\n\t\t\t0.994524,\n\t\t\t0.841387,\n\t\t\t0.598983,\n\t\t\t0.921569,\n\t\t\t0.994222,\n\t\t\t0.84854,\n\t\t\t0.605696,\n\t\t\t0.92549,\n\t\t\t0.993866,\n\t\t\t0.855711,\n\t\t\t0.612482,\n\t\t\t0.929412,\n\t\t\t0.993545,\n\t\t\t0.862859,\n\t\t\t0.619299,\n\t\t\t0.933333,\n\t\t\t0.99317,\n\t\t\t0.870024,\n\t\t\t0.626189,\n\t\t\t0.937255,\n\t\t\t0.992831,\n\t\t\t0.877168,\n\t\t\t0.633109,\n\t\t\t0.941176,\n\t\t\t0.99244,\n\t\t\t0.88433,\n\t\t\t0.640099,\n\t\t\t0.945098,\n\t\t\t0.992089,\n\t\t\t0.89147,\n\t\t\t0.647116,\n\t\t\t0.94902,\n\t\t\t0.991688,\n\t\t\t0.898627,\n\t\t\t0.654202,\n\t\t\t0.952941,\n\t\t\t0.991332,\n\t\t\t0.905763,\n\t\t\t0.661309,\n\t\t\t0.956863,\n\t\t\t0.99093,\n\t\t\t0.912915,\n\t\t\t0.668481,\n\t\t\t0.960784,\n\t\t\t0.99057,\n\t\t\t0.920049,\n\t\t\t0.675675,\n\t\t\t0.964706,\n\t\t\t0.990175,\n\t\t\t0.927196,\n\t\t\t0.682926,\n\t\t\t0.968627,\n\t\t\t0.989815,\n\t\t\t0.934329,\n\t\t\t0.690198,\n\t\t\t0.972549,\n\t\t\t0.989434,\n\t\t\t0.94147,\n\t\t\t0.697519,\n\t\t\t0.976471,\n\t\t\t0.989077,\n\t\t\t0.948604,\n\t\t\t0.704863,\n\t\t\t0.980392,\n\t\t\t0.988717,\n\t\t\t0.955742,\n\t\t\t0.712242,\n\t\t\t0.984314,\n\t\t\t0.988367,\n\t\t\t0.962878,\n\t\t\t0.719649,\n\t\t\t0.988235,\n\t\t\t0.988033,\n\t\t\t0.970012,\n\t\t\t0.727077,\n\t\t\t0.992157,\n\t\t\t0.987691,\n\t\t\t0.977154,\n\t\t\t0.734536,\n\t\t\t0.996078,\n\t\t\t0.987387,\n\t\t\t0.984288,\n\t\t\t0.742002,\n\t\t\t1,\n\t\t\t0.987053,\n\t\t\t0.991438,\n\t\t\t0.749504\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Diverging\",\n\t\tName: \"Inferno (matplotlib)\",\n\t\tNanColor: [\n\t\t\t0,\n\t\t\t1,\n\t\t\t0\n\t\t],\n\t\tSource: \"https://github.com/BIDS/colormap/blob/master/colormaps.py\",\n\t\tLicense: \"CC0\",\n\t\tCreator: \"Nathaniel J. Smith & Stefan van der Walt\",\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t0.001462,\n\t\t\t0.000466,\n\t\t\t0.013866,\n\t\t\t0.003922,\n\t\t\t0.002267,\n\t\t\t0.00127,\n\t\t\t0.01857,\n\t\t\t0.007843,\n\t\t\t0.003299,\n\t\t\t0.002249,\n\t\t\t0.024239,\n\t\t\t0.011765,\n\t\t\t0.004547,\n\t\t\t0.003392,\n\t\t\t0.030909,\n\t\t\t0.015686,\n\t\t\t0.006006,\n\t\t\t0.004692,\n\t\t\t0.038558,\n\t\t\t0.019608,\n\t\t\t0.007676,\n\t\t\t0.006136,\n\t\t\t0.046836,\n\t\t\t0.023529,\n\t\t\t0.009561,\n\t\t\t0.007713,\n\t\t\t0.055143,\n\t\t\t0.027451,\n\t\t\t0.011663,\n\t\t\t0.009417,\n\t\t\t0.06346,\n\t\t\t0.031373,\n\t\t\t0.013995,\n\t\t\t0.011225,\n\t\t\t0.071862,\n\t\t\t0.035294,\n\t\t\t0.016561,\n\t\t\t0.013136,\n\t\t\t0.080282,\n\t\t\t0.039216,\n\t\t\t0.019373,\n\t\t\t0.015133,\n\t\t\t0.088767,\n\t\t\t0.043137,\n\t\t\t0.022447,\n\t\t\t0.017199,\n\t\t\t0.097327,\n\t\t\t0.047059,\n\t\t\t0.025793,\n\t\t\t0.019331,\n\t\t\t0.10593,\n\t\t\t0.05098,\n\t\t\t0.029432,\n\t\t\t0.021503,\n\t\t\t0.114621,\n\t\t\t0.054902,\n\t\t\t0.033385,\n\t\t\t0.023702,\n\t\t\t0.123397,\n\t\t\t0.058824,\n\t\t\t0.037668,\n\t\t\t0.025921,\n\t\t\t0.132232,\n\t\t\t0.062745,\n\t\t\t0.042253,\n\t\t\t0.028139,\n\t\t\t0.141141,\n\t\t\t0.066667,\n\t\t\t0.046915,\n\t\t\t0.030324,\n\t\t\t0.150164,\n\t\t\t0.070588,\n\t\t\t0.051644,\n\t\t\t0.032474,\n\t\t\t0.159254,\n\t\t\t0.07451,\n\t\t\t0.056449,\n\t\t\t0.034569,\n\t\t\t0.168414,\n\t\t\t0.078431,\n\t\t\t0.06134,\n\t\t\t0.03659,\n\t\t\t0.177642,\n\t\t\t0.082353,\n\t\t\t0.066331,\n\t\t\t0.038504,\n\t\t\t0.186962,\n\t\t\t0.086275,\n\t\t\t0.071429,\n\t\t\t0.040294,\n\t\t\t0.196354,\n\t\t\t0.090196,\n\t\t\t0.076637,\n\t\t\t0.041905,\n\t\t\t0.205799,\n\t\t\t0.094118,\n\t\t\t0.081962,\n\t\t\t0.043328,\n\t\t\t0.215289,\n\t\t\t0.098039,\n\t\t\t0.087411,\n\t\t\t0.044556,\n\t\t\t0.224813,\n\t\t\t0.101961,\n\t\t\t0.09299,\n\t\t\t0.045583,\n\t\t\t0.234358,\n\t\t\t0.105882,\n\t\t\t0.098702,\n\t\t\t0.046402,\n\t\t\t0.243904,\n\t\t\t0.109804,\n\t\t\t0.104551,\n\t\t\t0.047008,\n\t\t\t0.25343,\n\t\t\t0.113725,\n\t\t\t0.110536,\n\t\t\t0.047399,\n\t\t\t0.262912,\n\t\t\t0.117647,\n\t\t\t0.116656,\n\t\t\t0.047574,\n\t\t\t0.272321,\n\t\t\t0.121569,\n\t\t\t0.122908,\n\t\t\t0.047536,\n\t\t\t0.281624,\n\t\t\t0.12549,\n\t\t\t0.129285,\n\t\t\t0.047293,\n\t\t\t0.290788,\n\t\t\t0.129412,\n\t\t\t0.135778,\n\t\t\t0.046856,\n\t\t\t0.299776,\n\t\t\t0.133333,\n\t\t\t0.142378,\n\t\t\t0.046242,\n\t\t\t0.308553,\n\t\t\t0.137255,\n\t\t\t0.149073,\n\t\t\t0.045468,\n\t\t\t0.317085,\n\t\t\t0.141176,\n\t\t\t0.15585,\n\t\t\t0.044559,\n\t\t\t0.325338,\n\t\t\t0.145098,\n\t\t\t0.162689,\n\t\t\t0.043554,\n\t\t\t0.333277,\n\t\t\t0.14902,\n\t\t\t0.169575,\n\t\t\t0.042489,\n\t\t\t0.340874,\n\t\t\t0.152941,\n\t\t\t0.176493,\n\t\t\t0.041402,\n\t\t\t0.348111,\n\t\t\t0.156863,\n\t\t\t0.183429,\n\t\t\t0.040329,\n\t\t\t0.354971,\n\t\t\t0.160784,\n\t\t\t0.190367,\n\t\t\t0.039309,\n\t\t\t0.361447,\n\t\t\t0.164706,\n\t\t\t0.197297,\n\t\t\t0.0384,\n\t\t\t0.367535,\n\t\t\t0.168627,\n\t\t\t0.204209,\n\t\t\t0.037632,\n\t\t\t0.373238,\n\t\t\t0.172549,\n\t\t\t0.211095,\n\t\t\t0.03703,\n\t\t\t0.378563,\n\t\t\t0.176471,\n\t\t\t0.217949,\n\t\t\t0.036615,\n\t\t\t0.383522,\n\t\t\t0.180392,\n\t\t\t0.224763,\n\t\t\t0.036405,\n\t\t\t0.388129,\n\t\t\t0.184314,\n\t\t\t0.231538,\n\t\t\t0.036405,\n\t\t\t0.3924,\n\t\t\t0.188235,\n\t\t\t0.238273,\n\t\t\t0.036621,\n\t\t\t0.396353,\n\t\t\t0.192157,\n\t\t\t0.244967,\n\t\t\t0.037055,\n\t\t\t0.400007,\n\t\t\t0.196078,\n\t\t\t0.25162,\n\t\t\t0.037705,\n\t\t\t0.403378,\n\t\t\t0.2,\n\t\t\t0.258234,\n\t\t\t0.038571,\n\t\t\t0.406485,\n\t\t\t0.203922,\n\t\t\t0.26481,\n\t\t\t0.039647,\n\t\t\t0.409345,\n\t\t\t0.207843,\n\t\t\t0.271347,\n\t\t\t0.040922,\n\t\t\t0.411976,\n\t\t\t0.211765,\n\t\t\t0.27785,\n\t\t\t0.042353,\n\t\t\t0.414392,\n\t\t\t0.215686,\n\t\t\t0.284321,\n\t\t\t0.043933,\n\t\t\t0.416608,\n\t\t\t0.219608,\n\t\t\t0.290763,\n\t\t\t0.045644,\n\t\t\t0.418637,\n\t\t\t0.223529,\n\t\t\t0.297178,\n\t\t\t0.04747,\n\t\t\t0.420491,\n\t\t\t0.227451,\n\t\t\t0.303568,\n\t\t\t0.049396,\n\t\t\t0.422182,\n\t\t\t0.231373,\n\t\t\t0.309935,\n\t\t\t0.051407,\n\t\t\t0.423721,\n\t\t\t0.235294,\n\t\t\t0.316282,\n\t\t\t0.05349,\n\t\t\t0.425116,\n\t\t\t0.239216,\n\t\t\t0.32261,\n\t\t\t0.055634,\n\t\t\t0.426377,\n\t\t\t0.243137,\n\t\t\t0.328921,\n\t\t\t0.057827,\n\t\t\t0.427511,\n\t\t\t0.247059,\n\t\t\t0.335217,\n\t\t\t0.06006,\n\t\t\t0.428524,\n\t\t\t0.25098,\n\t\t\t0.3415,\n\t\t\t0.062325,\n\t\t\t0.429425,\n\t\t\t0.254902,\n\t\t\t0.347771,\n\t\t\t0.064616,\n\t\t\t0.430217,\n\t\t\t0.258824,\n\t\t\t0.354032,\n\t\t\t0.066925,\n\t\t\t0.430906,\n\t\t\t0.262745,\n\t\t\t0.360284,\n\t\t\t0.069247,\n\t\t\t0.431497,\n\t\t\t0.266667,\n\t\t\t0.366529,\n\t\t\t0.071579,\n\t\t\t0.431994,\n\t\t\t0.270588,\n\t\t\t0.372768,\n\t\t\t0.073915,\n\t\t\t0.4324,\n\t\t\t0.27451,\n\t\t\t0.379001,\n\t\t\t0.076253,\n\t\t\t0.432719,\n\t\t\t0.278431,\n\t\t\t0.385228,\n\t\t\t0.078591,\n\t\t\t0.432955,\n\t\t\t0.282353,\n\t\t\t0.391453,\n\t\t\t0.080927,\n\t\t\t0.433109,\n\t\t\t0.286275,\n\t\t\t0.397674,\n\t\t\t0.083257,\n\t\t\t0.433183,\n\t\t\t0.290196,\n\t\t\t0.403894,\n\t\t\t0.08558,\n\t\t\t0.433179,\n\t\t\t0.294118,\n\t\t\t0.410113,\n\t\t\t0.087896,\n\t\t\t0.433098,\n\t\t\t0.298039,\n\t\t\t0.416331,\n\t\t\t0.090203,\n\t\t\t0.432943,\n\t\t\t0.301961,\n\t\t\t0.422549,\n\t\t\t0.092501,\n\t\t\t0.432714,\n\t\t\t0.305882,\n\t\t\t0.428768,\n\t\t\t0.09479,\n\t\t\t0.432412,\n\t\t\t0.309804,\n\t\t\t0.434987,\n\t\t\t0.097069,\n\t\t\t0.432039,\n\t\t\t0.313725,\n\t\t\t0.441207,\n\t\t\t0.099338,\n\t\t\t0.431594,\n\t\t\t0.317647,\n\t\t\t0.447428,\n\t\t\t0.101597,\n\t\t\t0.43108,\n\t\t\t0.321569,\n\t\t\t0.453651,\n\t\t\t0.103848,\n\t\t\t0.430498,\n\t\t\t0.32549,\n\t\t\t0.459875,\n\t\t\t0.106089,\n\t\t\t0.429846,\n\t\t\t0.329412,\n\t\t\t0.4661,\n\t\t\t0.108322,\n\t\t\t0.429125,\n\t\t\t0.333333,\n\t\t\t0.472328,\n\t\t\t0.110547,\n\t\t\t0.428334,\n\t\t\t0.337255,\n\t\t\t0.478558,\n\t\t\t0.112764,\n\t\t\t0.427475,\n\t\t\t0.341176,\n\t\t\t0.484789,\n\t\t\t0.114974,\n\t\t\t0.426548,\n\t\t\t0.345098,\n\t\t\t0.491022,\n\t\t\t0.117179,\n\t\t\t0.425552,\n\t\t\t0.34902,\n\t\t\t0.497257,\n\t\t\t0.119379,\n\t\t\t0.424488,\n\t\t\t0.352941,\n\t\t\t0.503493,\n\t\t\t0.121575,\n\t\t\t0.423356,\n\t\t\t0.356863,\n\t\t\t0.50973,\n\t\t\t0.123769,\n\t\t\t0.422156,\n\t\t\t0.360784,\n\t\t\t0.515967,\n\t\t\t0.12596,\n\t\t\t0.420887,\n\t\t\t0.364706,\n\t\t\t0.522206,\n\t\t\t0.12815,\n\t\t\t0.419549,\n\t\t\t0.368627,\n\t\t\t0.528444,\n\t\t\t0.130341,\n\t\t\t0.418142,\n\t\t\t0.372549,\n\t\t\t0.534683,\n\t\t\t0.132534,\n\t\t\t0.416667,\n\t\t\t0.376471,\n\t\t\t0.54092,\n\t\t\t0.134729,\n\t\t\t0.415123,\n\t\t\t0.380392,\n\t\t\t0.547157,\n\t\t\t0.136929,\n\t\t\t0.413511,\n\t\t\t0.384314,\n\t\t\t0.553392,\n\t\t\t0.139134,\n\t\t\t0.411829,\n\t\t\t0.388235,\n\t\t\t0.559624,\n\t\t\t0.141346,\n\t\t\t0.410078,\n\t\t\t0.392157,\n\t\t\t0.565854,\n\t\t\t0.143567,\n\t\t\t0.408258,\n\t\t\t0.396078,\n\t\t\t0.572081,\n\t\t\t0.145797,\n\t\t\t0.406369,\n\t\t\t0.4,\n\t\t\t0.578304,\n\t\t\t0.148039,\n\t\t\t0.404411,\n\t\t\t0.403922,\n\t\t\t0.584521,\n\t\t\t0.150294,\n\t\t\t0.402385,\n\t\t\t0.407843,\n\t\t\t0.590734,\n\t\t\t0.152563,\n\t\t\t0.40029,\n\t\t\t0.411765,\n\t\t\t0.59694,\n\t\t\t0.154848,\n\t\t\t0.398125,\n\t\t\t0.415686,\n\t\t\t0.603139,\n\t\t\t0.157151,\n\t\t\t0.395891,\n\t\t\t0.419608,\n\t\t\t0.60933,\n\t\t\t0.159474,\n\t\t\t0.393589,\n\t\t\t0.423529,\n\t\t\t0.615513,\n\t\t\t0.161817,\n\t\t\t0.391219,\n\t\t\t0.427451,\n\t\t\t0.621685,\n\t\t\t0.164184,\n\t\t\t0.388781,\n\t\t\t0.431373,\n\t\t\t0.627847,\n\t\t\t0.166575,\n\t\t\t0.386276,\n\t\t\t0.435294,\n\t\t\t0.633998,\n\t\t\t0.168992,\n\t\t\t0.383704,\n\t\t\t0.439216,\n\t\t\t0.640135,\n\t\t\t0.171438,\n\t\t\t0.381065,\n\t\t\t0.443137,\n\t\t\t0.64626,\n\t\t\t0.173914,\n\t\t\t0.378359,\n\t\t\t0.447059,\n\t\t\t0.652369,\n\t\t\t0.176421,\n\t\t\t0.375586,\n\t\t\t0.45098,\n\t\t\t0.658463,\n\t\t\t0.178962,\n\t\t\t0.372748,\n\t\t\t0.454902,\n\t\t\t0.66454,\n\t\t\t0.181539,\n\t\t\t0.369846,\n\t\t\t0.458824,\n\t\t\t0.670599,\n\t\t\t0.184153,\n\t\t\t0.366879,\n\t\t\t0.462745,\n\t\t\t0.676638,\n\t\t\t0.186807,\n\t\t\t0.363849,\n\t\t\t0.466667,\n\t\t\t0.682656,\n\t\t\t0.189501,\n\t\t\t0.360757,\n\t\t\t0.470588,\n\t\t\t0.688653,\n\t\t\t0.192239,\n\t\t\t0.357603,\n\t\t\t0.47451,\n\t\t\t0.694627,\n\t\t\t0.195021,\n\t\t\t0.354388,\n\t\t\t0.478431,\n\t\t\t0.700576,\n\t\t\t0.197851,\n\t\t\t0.351113,\n\t\t\t0.482353,\n\t\t\t0.7065,\n\t\t\t0.200728,\n\t\t\t0.347777,\n\t\t\t0.486275,\n\t\t\t0.712396,\n\t\t\t0.203656,\n\t\t\t0.344383,\n\t\t\t0.490196,\n\t\t\t0.718264,\n\t\t\t0.206636,\n\t\t\t0.340931,\n\t\t\t0.494118,\n\t\t\t0.724103,\n\t\t\t0.20967,\n\t\t\t0.337424,\n\t\t\t0.498039,\n\t\t\t0.729909,\n\t\t\t0.212759,\n\t\t\t0.333861,\n\t\t\t0.501961,\n\t\t\t0.735683,\n\t\t\t0.215906,\n\t\t\t0.330245,\n\t\t\t0.505882,\n\t\t\t0.741423,\n\t\t\t0.219112,\n\t\t\t0.326576,\n\t\t\t0.509804,\n\t\t\t0.747127,\n\t\t\t0.222378,\n\t\t\t0.322856,\n\t\t\t0.513725,\n\t\t\t0.752794,\n\t\t\t0.225706,\n\t\t\t0.319085,\n\t\t\t0.517647,\n\t\t\t0.758422,\n\t\t\t0.229097,\n\t\t\t0.315266,\n\t\t\t0.521569,\n\t\t\t0.76401,\n\t\t\t0.232554,\n\t\t\t0.311399,\n\t\t\t0.52549,\n\t\t\t0.769556,\n\t\t\t0.236077,\n\t\t\t0.307485,\n\t\t\t0.529412,\n\t\t\t0.775059,\n\t\t\t0.239667,\n\t\t\t0.303526,\n\t\t\t0.533333,\n\t\t\t0.780517,\n\t\t\t0.243327,\n\t\t\t0.299523,\n\t\t\t0.537255,\n\t\t\t0.785929,\n\t\t\t0.247056,\n\t\t\t0.295477,\n\t\t\t0.541176,\n\t\t\t0.791293,\n\t\t\t0.250856,\n\t\t\t0.29139,\n\t\t\t0.545098,\n\t\t\t0.796607,\n\t\t\t0.254728,\n\t\t\t0.287264,\n\t\t\t0.54902,\n\t\t\t0.801871,\n\t\t\t0.258674,\n\t\t\t0.283099,\n\t\t\t0.552941,\n\t\t\t0.807082,\n\t\t\t0.262692,\n\t\t\t0.278898,\n\t\t\t0.556863,\n\t\t\t0.812239,\n\t\t\t0.266786,\n\t\t\t0.274661,\n\t\t\t0.560784,\n\t\t\t0.817341,\n\t\t\t0.270954,\n\t\t\t0.27039,\n\t\t\t0.564706,\n\t\t\t0.822386,\n\t\t\t0.275197,\n\t\t\t0.266085,\n\t\t\t0.568627,\n\t\t\t0.827372,\n\t\t\t0.279517,\n\t\t\t0.26175,\n\t\t\t0.572549,\n\t\t\t0.832299,\n\t\t\t0.283913,\n\t\t\t0.257383,\n\t\t\t0.576471,\n\t\t\t0.837165,\n\t\t\t0.288385,\n\t\t\t0.252988,\n\t\t\t0.580392,\n\t\t\t0.841969,\n\t\t\t0.292933,\n\t\t\t0.248564,\n\t\t\t0.584314,\n\t\t\t0.846709,\n\t\t\t0.297559,\n\t\t\t0.244113,\n\t\t\t0.588235,\n\t\t\t0.851384,\n\t\t\t0.30226,\n\t\t\t0.239636,\n\t\t\t0.592157,\n\t\t\t0.855992,\n\t\t\t0.307038,\n\t\t\t0.235133,\n\t\t\t0.596078,\n\t\t\t0.860533,\n\t\t\t0.311892,\n\t\t\t0.230606,\n\t\t\t0.6,\n\t\t\t0.865006,\n\t\t\t0.316822,\n\t\t\t0.226055,\n\t\t\t0.603922,\n\t\t\t0.869409,\n\t\t\t0.321827,\n\t\t\t0.221482,\n\t\t\t0.607843,\n\t\t\t0.873741,\n\t\t\t0.326906,\n\t\t\t0.216886,\n\t\t\t0.611765,\n\t\t\t0.878001,\n\t\t\t0.33206,\n\t\t\t0.212268,\n\t\t\t0.615686,\n\t\t\t0.882188,\n\t\t\t0.337287,\n\t\t\t0.207628,\n\t\t\t0.619608,\n\t\t\t0.886302,\n\t\t\t0.342586,\n\t\t\t0.202968,\n\t\t\t0.623529,\n\t\t\t0.890341,\n\t\t\t0.347957,\n\t\t\t0.198286,\n\t\t\t0.627451,\n\t\t\t0.894305,\n\t\t\t0.353399,\n\t\t\t0.193584,\n\t\t\t0.631373,\n\t\t\t0.898192,\n\t\t\t0.358911,\n\t\t\t0.18886,\n\t\t\t0.635294,\n\t\t\t0.902003,\n\t\t\t0.364492,\n\t\t\t0.184116,\n\t\t\t0.639216,\n\t\t\t0.905735,\n\t\t\t0.37014,\n\t\t\t0.17935,\n\t\t\t0.643137,\n\t\t\t0.90939,\n\t\t\t0.375856,\n\t\t\t0.174563,\n\t\t\t0.647059,\n\t\t\t0.912966,\n\t\t\t0.381636,\n\t\t\t0.169755,\n\t\t\t0.65098,\n\t\t\t0.916462,\n\t\t\t0.387481,\n\t\t\t0.164924,\n\t\t\t0.654902,\n\t\t\t0.919879,\n\t\t\t0.393389,\n\t\t\t0.16007,\n\t\t\t0.658824,\n\t\t\t0.923215,\n\t\t\t0.399359,\n\t\t\t0.155193,\n\t\t\t0.662745,\n\t\t\t0.92647,\n\t\t\t0.405389,\n\t\t\t0.150292,\n\t\t\t0.666667,\n\t\t\t0.929644,\n\t\t\t0.411479,\n\t\t\t0.145367,\n\t\t\t0.670588,\n\t\t\t0.932737,\n\t\t\t0.417627,\n\t\t\t0.140417,\n\t\t\t0.67451,\n\t\t\t0.935747,\n\t\t\t0.423831,\n\t\t\t0.13544,\n\t\t\t0.678431,\n\t\t\t0.938675,\n\t\t\t0.430091,\n\t\t\t0.130438,\n\t\t\t0.682353,\n\t\t\t0.941521,\n\t\t\t0.436405,\n\t\t\t0.125409,\n\t\t\t0.686275,\n\t\t\t0.944285,\n\t\t\t0.442772,\n\t\t\t0.120354,\n\t\t\t0.690196,\n\t\t\t0.946965,\n\t\t\t0.449191,\n\t\t\t0.115272,\n\t\t\t0.694118,\n\t\t\t0.949562,\n\t\t\t0.45566,\n\t\t\t0.110164,\n\t\t\t0.698039,\n\t\t\t0.952075,\n\t\t\t0.462178,\n\t\t\t0.105031,\n\t\t\t0.701961,\n\t\t\t0.954506,\n\t\t\t0.468744,\n\t\t\t0.099874,\n\t\t\t0.705882,\n\t\t\t0.956852,\n\t\t\t0.475356,\n\t\t\t0.094695,\n\t\t\t0.709804,\n\t\t\t0.959114,\n\t\t\t0.482014,\n\t\t\t0.089499,\n\t\t\t0.713725,\n\t\t\t0.961293,\n\t\t\t0.488716,\n\t\t\t0.084289,\n\t\t\t0.717647,\n\t\t\t0.963387,\n\t\t\t0.495462,\n\t\t\t0.079073,\n\t\t\t0.721569,\n\t\t\t0.965397,\n\t\t\t0.502249,\n\t\t\t0.073859,\n\t\t\t0.72549,\n\t\t\t0.967322,\n\t\t\t0.509078,\n\t\t\t0.068659,\n\t\t\t0.729412,\n\t\t\t0.969163,\n\t\t\t0.515946,\n\t\t\t0.063488,\n\t\t\t0.733333,\n\t\t\t0.970919,\n\t\t\t0.522853,\n\t\t\t0.058367,\n\t\t\t0.737255,\n\t\t\t0.97259,\n\t\t\t0.529798,\n\t\t\t0.053324,\n\t\t\t0.741176,\n\t\t\t0.974176,\n\t\t\t0.53678,\n\t\t\t0.048392,\n\t\t\t0.745098,\n\t\t\t0.975677,\n\t\t\t0.543798,\n\t\t\t0.043618,\n\t\t\t0.74902,\n\t\t\t0.977092,\n\t\t\t0.55085,\n\t\t\t0.03905,\n\t\t\t0.752941,\n\t\t\t0.978422,\n\t\t\t0.557937,\n\t\t\t0.034931,\n\t\t\t0.756863,\n\t\t\t0.979666,\n\t\t\t0.565057,\n\t\t\t0.031409,\n\t\t\t0.760784,\n\t\t\t0.980824,\n\t\t\t0.572209,\n\t\t\t0.028508,\n\t\t\t0.764706,\n\t\t\t0.981895,\n\t\t\t0.579392,\n\t\t\t0.02625,\n\t\t\t0.768627,\n\t\t\t0.982881,\n\t\t\t0.586606,\n\t\t\t0.024661,\n\t\t\t0.772549,\n\t\t\t0.983779,\n\t\t\t0.593849,\n\t\t\t0.02377,\n\t\t\t0.776471,\n\t\t\t0.984591,\n\t\t\t0.601122,\n\t\t\t0.023606,\n\t\t\t0.780392,\n\t\t\t0.985315,\n\t\t\t0.608422,\n\t\t\t0.024202,\n\t\t\t0.784314,\n\t\t\t0.985952,\n\t\t\t0.61575,\n\t\t\t0.025592,\n\t\t\t0.788235,\n\t\t\t0.986502,\n\t\t\t0.623105,\n\t\t\t0.027814,\n\t\t\t0.792157,\n\t\t\t0.986964,\n\t\t\t0.630485,\n\t\t\t0.030908,\n\t\t\t0.796078,\n\t\t\t0.987337,\n\t\t\t0.63789,\n\t\t\t0.034916,\n\t\t\t0.8,\n\t\t\t0.987622,\n\t\t\t0.64532,\n\t\t\t0.039886,\n\t\t\t0.803922,\n\t\t\t0.987819,\n\t\t\t0.652773,\n\t\t\t0.045581,\n\t\t\t0.807843,\n\t\t\t0.987926,\n\t\t\t0.66025,\n\t\t\t0.05175,\n\t\t\t0.811765,\n\t\t\t0.987945,\n\t\t\t0.667748,\n\t\t\t0.058329,\n\t\t\t0.815686,\n\t\t\t0.987874,\n\t\t\t0.675267,\n\t\t\t0.065257,\n\t\t\t0.819608,\n\t\t\t0.987714,\n\t\t\t0.682807,\n\t\t\t0.072489,\n\t\t\t0.823529,\n\t\t\t0.987464,\n\t\t\t0.690366,\n\t\t\t0.07999,\n\t\t\t0.827451,\n\t\t\t0.987124,\n\t\t\t0.697944,\n\t\t\t0.087731,\n\t\t\t0.831373,\n\t\t\t0.986694,\n\t\t\t0.70554,\n\t\t\t0.095694,\n\t\t\t0.835294,\n\t\t\t0.986175,\n\t\t\t0.713153,\n\t\t\t0.103863,\n\t\t\t0.839216,\n\t\t\t0.985566,\n\t\t\t0.720782,\n\t\t\t0.112229,\n\t\t\t0.843137,\n\t\t\t0.984865,\n\t\t\t0.728427,\n\t\t\t0.120785,\n\t\t\t0.847059,\n\t\t\t0.984075,\n\t\t\t0.736087,\n\t\t\t0.129527,\n\t\t\t0.85098,\n\t\t\t0.983196,\n\t\t\t0.743758,\n\t\t\t0.138453,\n\t\t\t0.854902,\n\t\t\t0.982228,\n\t\t\t0.751442,\n\t\t\t0.147565,\n\t\t\t0.858824,\n\t\t\t0.981173,\n\t\t\t0.759135,\n\t\t\t0.156863,\n\t\t\t0.862745,\n\t\t\t0.980032,\n\t\t\t0.766837,\n\t\t\t0.166353,\n\t\t\t0.866667,\n\t\t\t0.978806,\n\t\t\t0.774545,\n\t\t\t0.176037,\n\t\t\t0.870588,\n\t\t\t0.977497,\n\t\t\t0.782258,\n\t\t\t0.185923,\n\t\t\t0.87451,\n\t\t\t0.976108,\n\t\t\t0.789974,\n\t\t\t0.196018,\n\t\t\t0.878431,\n\t\t\t0.974638,\n\t\t\t0.797692,\n\t\t\t0.206332,\n\t\t\t0.882353,\n\t\t\t0.973088,\n\t\t\t0.805409,\n\t\t\t0.216877,\n\t\t\t0.886275,\n\t\t\t0.971468,\n\t\t\t0.813122,\n\t\t\t0.227658,\n\t\t\t0.890196,\n\t\t\t0.969783,\n\t\t\t0.820825,\n\t\t\t0.238686,\n\t\t\t0.894118,\n\t\t\t0.968041,\n\t\t\t0.828515,\n\t\t\t0.249972,\n\t\t\t0.898039,\n\t\t\t0.966243,\n\t\t\t0.836191,\n\t\t\t0.261534,\n\t\t\t0.901961,\n\t\t\t0.964394,\n\t\t\t0.843848,\n\t\t\t0.273391,\n\t\t\t0.905882,\n\t\t\t0.962517,\n\t\t\t0.851476,\n\t\t\t0.285546,\n\t\t\t0.909804,\n\t\t\t0.960626,\n\t\t\t0.859069,\n\t\t\t0.29801,\n\t\t\t0.913725,\n\t\t\t0.95872,\n\t\t\t0.866624,\n\t\t\t0.31082,\n\t\t\t0.917647,\n\t\t\t0.956834,\n\t\t\t0.874129,\n\t\t\t0.323974,\n\t\t\t0.921569,\n\t\t\t0.954997,\n\t\t\t0.881569,\n\t\t\t0.337475,\n\t\t\t0.92549,\n\t\t\t0.953215,\n\t\t\t0.888942,\n\t\t\t0.351369,\n\t\t\t0.929412,\n\t\t\t0.951546,\n\t\t\t0.896226,\n\t\t\t0.365627,\n\t\t\t0.933333,\n\t\t\t0.950018,\n\t\t\t0.903409,\n\t\t\t0.380271,\n\t\t\t0.937255,\n\t\t\t0.948683,\n\t\t\t0.910473,\n\t\t\t0.395289,\n\t\t\t0.941176,\n\t\t\t0.947594,\n\t\t\t0.917399,\n\t\t\t0.410665,\n\t\t\t0.945098,\n\t\t\t0.946809,\n\t\t\t0.924168,\n\t\t\t0.426373,\n\t\t\t0.94902,\n\t\t\t0.946392,\n\t\t\t0.930761,\n\t\t\t0.442367,\n\t\t\t0.952941,\n\t\t\t0.946403,\n\t\t\t0.937159,\n\t\t\t0.458592,\n\t\t\t0.956863,\n\t\t\t0.946903,\n\t\t\t0.943348,\n\t\t\t0.47497,\n\t\t\t0.960784,\n\t\t\t0.947937,\n\t\t\t0.949318,\n\t\t\t0.491426,\n\t\t\t0.964706,\n\t\t\t0.949545,\n\t\t\t0.955063,\n\t\t\t0.50786,\n\t\t\t0.968627,\n\t\t\t0.95174,\n\t\t\t0.960587,\n\t\t\t0.524203,\n\t\t\t0.972549,\n\t\t\t0.954529,\n\t\t\t0.965896,\n\t\t\t0.540361,\n\t\t\t0.976471,\n\t\t\t0.957896,\n\t\t\t0.971003,\n\t\t\t0.556275,\n\t\t\t0.980392,\n\t\t\t0.961812,\n\t\t\t0.975924,\n\t\t\t0.571925,\n\t\t\t0.984314,\n\t\t\t0.966249,\n\t\t\t0.980678,\n\t\t\t0.587206,\n\t\t\t0.988235,\n\t\t\t0.971162,\n\t\t\t0.985282,\n\t\t\t0.602154,\n\t\t\t0.992157,\n\t\t\t0.976511,\n\t\t\t0.989753,\n\t\t\t0.61676,\n\t\t\t0.996078,\n\t\t\t0.982257,\n\t\t\t0.994109,\n\t\t\t0.631017,\n\t\t\t1,\n\t\t\t0.988362,\n\t\t\t0.998364,\n\t\t\t0.644924\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Diverging\",\n\t\tName: \"Plasma (matplotlib)\",\n\t\tNanColor: [\n\t\t\t0,\n\t\t\t1,\n\t\t\t0\n\t\t],\n\t\tSource: \"https://github.com/BIDS/colormap/blob/master/colormaps.py\",\n\t\tLicense: \"CC0\",\n\t\tCreator: \"Nathaniel J. Smith & Stefan van der Walt\",\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t0.050383,\n\t\t\t0.029803,\n\t\t\t0.527975,\n\t\t\t0.003922,\n\t\t\t0.063536,\n\t\t\t0.028426,\n\t\t\t0.533124,\n\t\t\t0.007843,\n\t\t\t0.075353,\n\t\t\t0.027206,\n\t\t\t0.538007,\n\t\t\t0.011765,\n\t\t\t0.086222,\n\t\t\t0.026125,\n\t\t\t0.542658,\n\t\t\t0.015686,\n\t\t\t0.096379,\n\t\t\t0.025165,\n\t\t\t0.547103,\n\t\t\t0.019608,\n\t\t\t0.10598,\n\t\t\t0.024309,\n\t\t\t0.551368,\n\t\t\t0.023529,\n\t\t\t0.115124,\n\t\t\t0.023556,\n\t\t\t0.555468,\n\t\t\t0.027451,\n\t\t\t0.123903,\n\t\t\t0.022878,\n\t\t\t0.559423,\n\t\t\t0.031373,\n\t\t\t0.132381,\n\t\t\t0.022258,\n\t\t\t0.56325,\n\t\t\t0.035294,\n\t\t\t0.140603,\n\t\t\t0.021687,\n\t\t\t0.566959,\n\t\t\t0.039216,\n\t\t\t0.148607,\n\t\t\t0.021154,\n\t\t\t0.570562,\n\t\t\t0.043137,\n\t\t\t0.156421,\n\t\t\t0.020651,\n\t\t\t0.574065,\n\t\t\t0.047059,\n\t\t\t0.16407,\n\t\t\t0.020171,\n\t\t\t0.577478,\n\t\t\t0.05098,\n\t\t\t0.171574,\n\t\t\t0.019706,\n\t\t\t0.580806,\n\t\t\t0.054902,\n\t\t\t0.17895,\n\t\t\t0.019252,\n\t\t\t0.584054,\n\t\t\t0.058824,\n\t\t\t0.186213,\n\t\t\t0.018803,\n\t\t\t0.587228,\n\t\t\t0.062745,\n\t\t\t0.193374,\n\t\t\t0.018354,\n\t\t\t0.59033,\n\t\t\t0.066667,\n\t\t\t0.200445,\n\t\t\t0.017902,\n\t\t\t0.593364,\n\t\t\t0.070588,\n\t\t\t0.207435,\n\t\t\t0.017442,\n\t\t\t0.596333,\n\t\t\t0.07451,\n\t\t\t0.21435,\n\t\t\t0.016973,\n\t\t\t0.599239,\n\t\t\t0.078431,\n\t\t\t0.221197,\n\t\t\t0.016497,\n\t\t\t0.602083,\n\t\t\t0.082353,\n\t\t\t0.227983,\n\t\t\t0.016007,\n\t\t\t0.604867,\n\t\t\t0.086275,\n\t\t\t0.234715,\n\t\t\t0.015502,\n\t\t\t0.607592,\n\t\t\t0.090196,\n\t\t\t0.241396,\n\t\t\t0.014979,\n\t\t\t0.610259,\n\t\t\t0.094118,\n\t\t\t0.248032,\n\t\t\t0.014439,\n\t\t\t0.612868,\n\t\t\t0.098039,\n\t\t\t0.254627,\n\t\t\t0.013882,\n\t\t\t0.615419,\n\t\t\t0.101961,\n\t\t\t0.261183,\n\t\t\t0.013308,\n\t\t\t0.617911,\n\t\t\t0.105882,\n\t\t\t0.267703,\n\t\t\t0.012716,\n\t\t\t0.620346,\n\t\t\t0.109804,\n\t\t\t0.274191,\n\t\t\t0.012109,\n\t\t\t0.622722,\n\t\t\t0.113725,\n\t\t\t0.280648,\n\t\t\t0.011488,\n\t\t\t0.625038,\n\t\t\t0.117647,\n\t\t\t0.287076,\n\t\t\t0.010855,\n\t\t\t0.627295,\n\t\t\t0.121569,\n\t\t\t0.293478,\n\t\t\t0.010213,\n\t\t\t0.62949,\n\t\t\t0.12549,\n\t\t\t0.299855,\n\t\t\t0.009561,\n\t\t\t0.631624,\n\t\t\t0.129412,\n\t\t\t0.30621,\n\t\t\t0.008902,\n\t\t\t0.633694,\n\t\t\t0.133333,\n\t\t\t0.312543,\n\t\t\t0.008239,\n\t\t\t0.6357,\n\t\t\t0.137255,\n\t\t\t0.318856,\n\t\t\t0.007576,\n\t\t\t0.63764,\n\t\t\t0.141176,\n\t\t\t0.32515,\n\t\t\t0.006915,\n\t\t\t0.639512,\n\t\t\t0.145098,\n\t\t\t0.331426,\n\t\t\t0.006261,\n\t\t\t0.641316,\n\t\t\t0.14902,\n\t\t\t0.337683,\n\t\t\t0.005618,\n\t\t\t0.643049,\n\t\t\t0.152941,\n\t\t\t0.343925,\n\t\t\t0.004991,\n\t\t\t0.64471,\n\t\t\t0.156863,\n\t\t\t0.35015,\n\t\t\t0.004382,\n\t\t\t0.646298,\n\t\t\t0.160784,\n\t\t\t0.356359,\n\t\t\t0.003798,\n\t\t\t0.64781,\n\t\t\t0.164706,\n\t\t\t0.362553,\n\t\t\t0.003243,\n\t\t\t0.649245,\n\t\t\t0.168627,\n\t\t\t0.368733,\n\t\t\t0.002724,\n\t\t\t0.650601,\n\t\t\t0.172549,\n\t\t\t0.374897,\n\t\t\t0.002245,\n\t\t\t0.651876,\n\t\t\t0.176471,\n\t\t\t0.381047,\n\t\t\t0.001814,\n\t\t\t0.653068,\n\t\t\t0.180392,\n\t\t\t0.387183,\n\t\t\t0.001434,\n\t\t\t0.654177,\n\t\t\t0.184314,\n\t\t\t0.393304,\n\t\t\t0.001114,\n\t\t\t0.655199,\n\t\t\t0.188235,\n\t\t\t0.399411,\n\t\t\t0.000859,\n\t\t\t0.656133,\n\t\t\t0.192157,\n\t\t\t0.405503,\n\t\t\t0.000678,\n\t\t\t0.656977,\n\t\t\t0.196078,\n\t\t\t0.41158,\n\t\t\t0.000577,\n\t\t\t0.65773,\n\t\t\t0.2,\n\t\t\t0.417642,\n\t\t\t0.000564,\n\t\t\t0.65839,\n\t\t\t0.203922,\n\t\t\t0.423689,\n\t\t\t0.000646,\n\t\t\t0.658956,\n\t\t\t0.207843,\n\t\t\t0.429719,\n\t\t\t0.000831,\n\t\t\t0.659425,\n\t\t\t0.211765,\n\t\t\t0.435734,\n\t\t\t0.001127,\n\t\t\t0.659797,\n\t\t\t0.215686,\n\t\t\t0.441732,\n\t\t\t0.00154,\n\t\t\t0.660069,\n\t\t\t0.219608,\n\t\t\t0.447714,\n\t\t\t0.00208,\n\t\t\t0.66024,\n\t\t\t0.223529,\n\t\t\t0.453677,\n\t\t\t0.002755,\n\t\t\t0.66031,\n\t\t\t0.227451,\n\t\t\t0.459623,\n\t\t\t0.003574,\n\t\t\t0.660277,\n\t\t\t0.231373,\n\t\t\t0.46555,\n\t\t\t0.004545,\n\t\t\t0.660139,\n\t\t\t0.235294,\n\t\t\t0.471457,\n\t\t\t0.005678,\n\t\t\t0.659897,\n\t\t\t0.239216,\n\t\t\t0.477344,\n\t\t\t0.00698,\n\t\t\t0.659549,\n\t\t\t0.243137,\n\t\t\t0.48321,\n\t\t\t0.00846,\n\t\t\t0.659095,\n\t\t\t0.247059,\n\t\t\t0.489055,\n\t\t\t0.010127,\n\t\t\t0.658534,\n\t\t\t0.25098,\n\t\t\t0.494877,\n\t\t\t0.01199,\n\t\t\t0.657865,\n\t\t\t0.254902,\n\t\t\t0.500678,\n\t\t\t0.014055,\n\t\t\t0.657088,\n\t\t\t0.258824,\n\t\t\t0.506454,\n\t\t\t0.016333,\n\t\t\t0.656202,\n\t\t\t0.262745,\n\t\t\t0.512206,\n\t\t\t0.018833,\n\t\t\t0.655209,\n\t\t\t0.266667,\n\t\t\t0.517933,\n\t\t\t0.021563,\n\t\t\t0.654109,\n\t\t\t0.270588,\n\t\t\t0.523633,\n\t\t\t0.024532,\n\t\t\t0.652901,\n\t\t\t0.27451,\n\t\t\t0.529306,\n\t\t\t0.027747,\n\t\t\t0.651586,\n\t\t\t0.278431,\n\t\t\t0.534952,\n\t\t\t0.031217,\n\t\t\t0.650165,\n\t\t\t0.282353,\n\t\t\t0.54057,\n\t\t\t0.03495,\n\t\t\t0.64864,\n\t\t\t0.286275,\n\t\t\t0.546157,\n\t\t\t0.038954,\n\t\t\t0.64701,\n\t\t\t0.290196,\n\t\t\t0.551715,\n\t\t\t0.043136,\n\t\t\t0.645277,\n\t\t\t0.294118,\n\t\t\t0.557243,\n\t\t\t0.047331,\n\t\t\t0.643443,\n\t\t\t0.298039,\n\t\t\t0.562738,\n\t\t\t0.051545,\n\t\t\t0.641509,\n\t\t\t0.301961,\n\t\t\t0.568201,\n\t\t\t0.055778,\n\t\t\t0.639477,\n\t\t\t0.305882,\n\t\t\t0.573632,\n\t\t\t0.060028,\n\t\t\t0.637349,\n\t\t\t0.309804,\n\t\t\t0.579029,\n\t\t\t0.064296,\n\t\t\t0.635126,\n\t\t\t0.313725,\n\t\t\t0.584391,\n\t\t\t0.068579,\n\t\t\t0.632812,\n\t\t\t0.317647,\n\t\t\t0.589719,\n\t\t\t0.072878,\n\t\t\t0.630408,\n\t\t\t0.321569,\n\t\t\t0.595011,\n\t\t\t0.07719,\n\t\t\t0.627917,\n\t\t\t0.32549,\n\t\t\t0.600266,\n\t\t\t0.081516,\n\t\t\t0.625342,\n\t\t\t0.329412,\n\t\t\t0.605485,\n\t\t\t0.085854,\n\t\t\t0.622686,\n\t\t\t0.333333,\n\t\t\t0.610667,\n\t\t\t0.090204,\n\t\t\t0.619951,\n\t\t\t0.337255,\n\t\t\t0.615812,\n\t\t\t0.094564,\n\t\t\t0.61714,\n\t\t\t0.341176,\n\t\t\t0.620919,\n\t\t\t0.098934,\n\t\t\t0.614257,\n\t\t\t0.345098,\n\t\t\t0.625987,\n\t\t\t0.103312,\n\t\t\t0.611305,\n\t\t\t0.34902,\n\t\t\t0.631017,\n\t\t\t0.107699,\n\t\t\t0.608287,\n\t\t\t0.352941,\n\t\t\t0.636008,\n\t\t\t0.112092,\n\t\t\t0.605205,\n\t\t\t0.356863,\n\t\t\t0.640959,\n\t\t\t0.116492,\n\t\t\t0.602065,\n\t\t\t0.360784,\n\t\t\t0.645872,\n\t\t\t0.120898,\n\t\t\t0.598867,\n\t\t\t0.364706,\n\t\t\t0.650746,\n\t\t\t0.125309,\n\t\t\t0.595617,\n\t\t\t0.368627,\n\t\t\t0.65558,\n\t\t\t0.129725,\n\t\t\t0.592317,\n\t\t\t0.372549,\n\t\t\t0.660374,\n\t\t\t0.134144,\n\t\t\t0.588971,\n\t\t\t0.376471,\n\t\t\t0.665129,\n\t\t\t0.138566,\n\t\t\t0.585582,\n\t\t\t0.380392,\n\t\t\t0.669845,\n\t\t\t0.142992,\n\t\t\t0.582154,\n\t\t\t0.384314,\n\t\t\t0.674522,\n\t\t\t0.147419,\n\t\t\t0.578688,\n\t\t\t0.388235,\n\t\t\t0.67916,\n\t\t\t0.151848,\n\t\t\t0.575189,\n\t\t\t0.392157,\n\t\t\t0.683758,\n\t\t\t0.156278,\n\t\t\t0.57166,\n\t\t\t0.396078,\n\t\t\t0.688318,\n\t\t\t0.160709,\n\t\t\t0.568103,\n\t\t\t0.4,\n\t\t\t0.69284,\n\t\t\t0.165141,\n\t\t\t0.564522,\n\t\t\t0.403922,\n\t\t\t0.697324,\n\t\t\t0.169573,\n\t\t\t0.560919,\n\t\t\t0.407843,\n\t\t\t0.701769,\n\t\t\t0.174005,\n\t\t\t0.557296,\n\t\t\t0.411765,\n\t\t\t0.706178,\n\t\t\t0.178437,\n\t\t\t0.553657,\n\t\t\t0.415686,\n\t\t\t0.710549,\n\t\t\t0.182868,\n\t\t\t0.550004,\n\t\t\t0.419608,\n\t\t\t0.714883,\n\t\t\t0.187299,\n\t\t\t0.546338,\n\t\t\t0.423529,\n\t\t\t0.719181,\n\t\t\t0.191729,\n\t\t\t0.542663,\n\t\t\t0.427451,\n\t\t\t0.723444,\n\t\t\t0.196158,\n\t\t\t0.538981,\n\t\t\t0.431373,\n\t\t\t0.72767,\n\t\t\t0.200586,\n\t\t\t0.535293,\n\t\t\t0.435294,\n\t\t\t0.731862,\n\t\t\t0.205013,\n\t\t\t0.531601,\n\t\t\t0.439216,\n\t\t\t0.736019,\n\t\t\t0.209439,\n\t\t\t0.527908,\n\t\t\t0.443137,\n\t\t\t0.740143,\n\t\t\t0.213864,\n\t\t\t0.524216,\n\t\t\t0.447059,\n\t\t\t0.744232,\n\t\t\t0.218288,\n\t\t\t0.520524,\n\t\t\t0.45098,\n\t\t\t0.748289,\n\t\t\t0.222711,\n\t\t\t0.516834,\n\t\t\t0.454902,\n\t\t\t0.752312,\n\t\t\t0.227133,\n\t\t\t0.513149,\n\t\t\t0.458824,\n\t\t\t0.756304,\n\t\t\t0.231555,\n\t\t\t0.509468,\n\t\t\t0.462745,\n\t\t\t0.760264,\n\t\t\t0.235976,\n\t\t\t0.505794,\n\t\t\t0.466667,\n\t\t\t0.764193,\n\t\t\t0.240396,\n\t\t\t0.502126,\n\t\t\t0.470588,\n\t\t\t0.76809,\n\t\t\t0.244817,\n\t\t\t0.498465,\n\t\t\t0.47451,\n\t\t\t0.771958,\n\t\t\t0.249237,\n\t\t\t0.494813,\n\t\t\t0.478431,\n\t\t\t0.775796,\n\t\t\t0.253658,\n\t\t\t0.491171,\n\t\t\t0.482353,\n\t\t\t0.779604,\n\t\t\t0.258078,\n\t\t\t0.487539,\n\t\t\t0.486275,\n\t\t\t0.783383,\n\t\t\t0.2625,\n\t\t\t0.483918,\n\t\t\t0.490196,\n\t\t\t0.787133,\n\t\t\t0.266922,\n\t\t\t0.480307,\n\t\t\t0.494118,\n\t\t\t0.790855,\n\t\t\t0.271345,\n\t\t\t0.476706,\n\t\t\t0.498039,\n\t\t\t0.794549,\n\t\t\t0.27577,\n\t\t\t0.473117,\n\t\t\t0.501961,\n\t\t\t0.798216,\n\t\t\t0.280197,\n\t\t\t0.469538,\n\t\t\t0.505882,\n\t\t\t0.801855,\n\t\t\t0.284626,\n\t\t\t0.465971,\n\t\t\t0.509804,\n\t\t\t0.805467,\n\t\t\t0.289057,\n\t\t\t0.462415,\n\t\t\t0.513725,\n\t\t\t0.809052,\n\t\t\t0.293491,\n\t\t\t0.45887,\n\t\t\t0.517647,\n\t\t\t0.812612,\n\t\t\t0.297928,\n\t\t\t0.455338,\n\t\t\t0.521569,\n\t\t\t0.816144,\n\t\t\t0.302368,\n\t\t\t0.451816,\n\t\t\t0.52549,\n\t\t\t0.819651,\n\t\t\t0.306812,\n\t\t\t0.448306,\n\t\t\t0.529412,\n\t\t\t0.823132,\n\t\t\t0.311261,\n\t\t\t0.444806,\n\t\t\t0.533333,\n\t\t\t0.826588,\n\t\t\t0.315714,\n\t\t\t0.441316,\n\t\t\t0.537255,\n\t\t\t0.830018,\n\t\t\t0.320172,\n\t\t\t0.437836,\n\t\t\t0.541176,\n\t\t\t0.833422,\n\t\t\t0.324635,\n\t\t\t0.434366,\n\t\t\t0.545098,\n\t\t\t0.836801,\n\t\t\t0.329105,\n\t\t\t0.430905,\n\t\t\t0.54902,\n\t\t\t0.840155,\n\t\t\t0.33358,\n\t\t\t0.427455,\n\t\t\t0.552941,\n\t\t\t0.843484,\n\t\t\t0.338062,\n\t\t\t0.424013,\n\t\t\t0.556863,\n\t\t\t0.846788,\n\t\t\t0.342551,\n\t\t\t0.420579,\n\t\t\t0.560784,\n\t\t\t0.850066,\n\t\t\t0.347048,\n\t\t\t0.417153,\n\t\t\t0.564706,\n\t\t\t0.853319,\n\t\t\t0.351553,\n\t\t\t0.413734,\n\t\t\t0.568627,\n\t\t\t0.856547,\n\t\t\t0.356066,\n\t\t\t0.410322,\n\t\t\t0.572549,\n\t\t\t0.85975,\n\t\t\t0.360588,\n\t\t\t0.406917,\n\t\t\t0.576471,\n\t\t\t0.862927,\n\t\t\t0.365119,\n\t\t\t0.403519,\n\t\t\t0.580392,\n\t\t\t0.866078,\n\t\t\t0.36966,\n\t\t\t0.400126,\n\t\t\t0.584314,\n\t\t\t0.869203,\n\t\t\t0.374212,\n\t\t\t0.396738,\n\t\t\t0.588235,\n\t\t\t0.872303,\n\t\t\t0.378774,\n\t\t\t0.393355,\n\t\t\t0.592157,\n\t\t\t0.875376,\n\t\t\t0.383347,\n\t\t\t0.389976,\n\t\t\t0.596078,\n\t\t\t0.878423,\n\t\t\t0.387932,\n\t\t\t0.3866,\n\t\t\t0.6,\n\t\t\t0.881443,\n\t\t\t0.392529,\n\t\t\t0.383229,\n\t\t\t0.603922,\n\t\t\t0.884436,\n\t\t\t0.397139,\n\t\t\t0.37986,\n\t\t\t0.607843,\n\t\t\t0.887402,\n\t\t\t0.401762,\n\t\t\t0.376494,\n\t\t\t0.611765,\n\t\t\t0.89034,\n\t\t\t0.406398,\n\t\t\t0.37313,\n\t\t\t0.615686,\n\t\t\t0.89325,\n\t\t\t0.411048,\n\t\t\t0.369768,\n\t\t\t0.619608,\n\t\t\t0.896131,\n\t\t\t0.415712,\n\t\t\t0.366407,\n\t\t\t0.623529,\n\t\t\t0.898984,\n\t\t\t0.420392,\n\t\t\t0.363047,\n\t\t\t0.627451,\n\t\t\t0.901807,\n\t\t\t0.425087,\n\t\t\t0.359688,\n\t\t\t0.631373,\n\t\t\t0.904601,\n\t\t\t0.429797,\n\t\t\t0.356329,\n\t\t\t0.635294,\n\t\t\t0.907365,\n\t\t\t0.434524,\n\t\t\t0.35297,\n\t\t\t0.639216,\n\t\t\t0.910098,\n\t\t\t0.439268,\n\t\t\t0.34961,\n\t\t\t0.643137,\n\t\t\t0.9128,\n\t\t\t0.444029,\n\t\t\t0.346251,\n\t\t\t0.647059,\n\t\t\t0.915471,\n\t\t\t0.448807,\n\t\t\t0.34289,\n\t\t\t0.65098,\n\t\t\t0.918109,\n\t\t\t0.453603,\n\t\t\t0.339529,\n\t\t\t0.654902,\n\t\t\t0.920714,\n\t\t\t0.458417,\n\t\t\t0.336166,\n\t\t\t0.658824,\n\t\t\t0.923287,\n\t\t\t0.463251,\n\t\t\t0.332801,\n\t\t\t0.662745,\n\t\t\t0.925825,\n\t\t\t0.468103,\n\t\t\t0.329435,\n\t\t\t0.666667,\n\t\t\t0.928329,\n\t\t\t0.472975,\n\t\t\t0.326067,\n\t\t\t0.670588,\n\t\t\t0.930798,\n\t\t\t0.477867,\n\t\t\t0.322697,\n\t\t\t0.67451,\n\t\t\t0.933232,\n\t\t\t0.48278,\n\t\t\t0.319325,\n\t\t\t0.678431,\n\t\t\t0.93563,\n\t\t\t0.487712,\n\t\t\t0.315952,\n\t\t\t0.682353,\n\t\t\t0.93799,\n\t\t\t0.492667,\n\t\t\t0.312575,\n\t\t\t0.686275,\n\t\t\t0.940313,\n\t\t\t0.497642,\n\t\t\t0.309197,\n\t\t\t0.690196,\n\t\t\t0.942598,\n\t\t\t0.502639,\n\t\t\t0.305816,\n\t\t\t0.694118,\n\t\t\t0.944844,\n\t\t\t0.507658,\n\t\t\t0.302433,\n\t\t\t0.698039,\n\t\t\t0.947051,\n\t\t\t0.512699,\n\t\t\t0.299049,\n\t\t\t0.701961,\n\t\t\t0.949217,\n\t\t\t0.517763,\n\t\t\t0.295662,\n\t\t\t0.705882,\n\t\t\t0.951344,\n\t\t\t0.52285,\n\t\t\t0.292275,\n\t\t\t0.709804,\n\t\t\t0.953428,\n\t\t\t0.52796,\n\t\t\t0.288883,\n\t\t\t0.713725,\n\t\t\t0.95547,\n\t\t\t0.533093,\n\t\t\t0.28549,\n\t\t\t0.717647,\n\t\t\t0.957469,\n\t\t\t0.53825,\n\t\t\t0.282096,\n\t\t\t0.721569,\n\t\t\t0.959424,\n\t\t\t0.543431,\n\t\t\t0.278701,\n\t\t\t0.72549,\n\t\t\t0.961336,\n\t\t\t0.548636,\n\t\t\t0.275305,\n\t\t\t0.729412,\n\t\t\t0.963203,\n\t\t\t0.553865,\n\t\t\t0.271909,\n\t\t\t0.733333,\n\t\t\t0.965024,\n\t\t\t0.559118,\n\t\t\t0.268513,\n\t\t\t0.737255,\n\t\t\t0.966798,\n\t\t\t0.564396,\n\t\t\t0.265118,\n\t\t\t0.741176,\n\t\t\t0.968526,\n\t\t\t0.5697,\n\t\t\t0.261721,\n\t\t\t0.745098,\n\t\t\t0.970205,\n\t\t\t0.575028,\n\t\t\t0.258325,\n\t\t\t0.74902,\n\t\t\t0.971835,\n\t\t\t0.580382,\n\t\t\t0.254931,\n\t\t\t0.752941,\n\t\t\t0.973416,\n\t\t\t0.585761,\n\t\t\t0.25154,\n\t\t\t0.756863,\n\t\t\t0.974947,\n\t\t\t0.591165,\n\t\t\t0.248151,\n\t\t\t0.760784,\n\t\t\t0.976428,\n\t\t\t0.596595,\n\t\t\t0.244767,\n\t\t\t0.764706,\n\t\t\t0.977856,\n\t\t\t0.602051,\n\t\t\t0.241387,\n\t\t\t0.768627,\n\t\t\t0.979233,\n\t\t\t0.607532,\n\t\t\t0.238013,\n\t\t\t0.772549,\n\t\t\t0.980556,\n\t\t\t0.613039,\n\t\t\t0.234646,\n\t\t\t0.776471,\n\t\t\t0.981826,\n\t\t\t0.618572,\n\t\t\t0.231287,\n\t\t\t0.780392,\n\t\t\t0.983041,\n\t\t\t0.624131,\n\t\t\t0.227937,\n\t\t\t0.784314,\n\t\t\t0.984199,\n\t\t\t0.629718,\n\t\t\t0.224595,\n\t\t\t0.788235,\n\t\t\t0.985301,\n\t\t\t0.63533,\n\t\t\t0.221265,\n\t\t\t0.792157,\n\t\t\t0.986345,\n\t\t\t0.640969,\n\t\t\t0.217948,\n\t\t\t0.796078,\n\t\t\t0.987332,\n\t\t\t0.646633,\n\t\t\t0.214648,\n\t\t\t0.8,\n\t\t\t0.98826,\n\t\t\t0.652325,\n\t\t\t0.211364,\n\t\t\t0.803922,\n\t\t\t0.989128,\n\t\t\t0.658043,\n\t\t\t0.2081,\n\t\t\t0.807843,\n\t\t\t0.989935,\n\t\t\t0.663787,\n\t\t\t0.204859,\n\t\t\t0.811765,\n\t\t\t0.990681,\n\t\t\t0.669558,\n\t\t\t0.201642,\n\t\t\t0.815686,\n\t\t\t0.991365,\n\t\t\t0.675355,\n\t\t\t0.198453,\n\t\t\t0.819608,\n\t\t\t0.991985,\n\t\t\t0.681179,\n\t\t\t0.195295,\n\t\t\t0.823529,\n\t\t\t0.992541,\n\t\t\t0.68703,\n\t\t\t0.19217,\n\t\t\t0.827451,\n\t\t\t0.993032,\n\t\t\t0.692907,\n\t\t\t0.189084,\n\t\t\t0.831373,\n\t\t\t0.993456,\n\t\t\t0.69881,\n\t\t\t0.186041,\n\t\t\t0.835294,\n\t\t\t0.993814,\n\t\t\t0.704741,\n\t\t\t0.183043,\n\t\t\t0.839216,\n\t\t\t0.994103,\n\t\t\t0.710698,\n\t\t\t0.180097,\n\t\t\t0.843137,\n\t\t\t0.994324,\n\t\t\t0.716681,\n\t\t\t0.177208,\n\t\t\t0.847059,\n\t\t\t0.994474,\n\t\t\t0.722691,\n\t\t\t0.174381,\n\t\t\t0.85098,\n\t\t\t0.994553,\n\t\t\t0.728728,\n\t\t\t0.171622,\n\t\t\t0.854902,\n\t\t\t0.994561,\n\t\t\t0.734791,\n\t\t\t0.168938,\n\t\t\t0.858824,\n\t\t\t0.994495,\n\t\t\t0.74088,\n\t\t\t0.166335,\n\t\t\t0.862745,\n\t\t\t0.994355,\n\t\t\t0.746995,\n\t\t\t0.163821,\n\t\t\t0.866667,\n\t\t\t0.994141,\n\t\t\t0.753137,\n\t\t\t0.161404,\n\t\t\t0.870588,\n\t\t\t0.993851,\n\t\t\t0.759304,\n\t\t\t0.159092,\n\t\t\t0.87451,\n\t\t\t0.993482,\n\t\t\t0.765499,\n\t\t\t0.156891,\n\t\t\t0.878431,\n\t\t\t0.993033,\n\t\t\t0.77172,\n\t\t\t0.154808,\n\t\t\t0.882353,\n\t\t\t0.992505,\n\t\t\t0.777967,\n\t\t\t0.152855,\n\t\t\t0.886275,\n\t\t\t0.991897,\n\t\t\t0.784239,\n\t\t\t0.151042,\n\t\t\t0.890196,\n\t\t\t0.991209,\n\t\t\t0.790537,\n\t\t\t0.149377,\n\t\t\t0.894118,\n\t\t\t0.990439,\n\t\t\t0.796859,\n\t\t\t0.14787,\n\t\t\t0.898039,\n\t\t\t0.989587,\n\t\t\t0.803205,\n\t\t\t0.146529,\n\t\t\t0.901961,\n\t\t\t0.988648,\n\t\t\t0.809579,\n\t\t\t0.145357,\n\t\t\t0.905882,\n\t\t\t0.987621,\n\t\t\t0.815978,\n\t\t\t0.144363,\n\t\t\t0.909804,\n\t\t\t0.986509,\n\t\t\t0.822401,\n\t\t\t0.143557,\n\t\t\t0.913725,\n\t\t\t0.985314,\n\t\t\t0.828846,\n\t\t\t0.142945,\n\t\t\t0.917647,\n\t\t\t0.984031,\n\t\t\t0.835315,\n\t\t\t0.142528,\n\t\t\t0.921569,\n\t\t\t0.982653,\n\t\t\t0.841812,\n\t\t\t0.142303,\n\t\t\t0.92549,\n\t\t\t0.98119,\n\t\t\t0.848329,\n\t\t\t0.142279,\n\t\t\t0.929412,\n\t\t\t0.979644,\n\t\t\t0.854866,\n\t\t\t0.142453,\n\t\t\t0.933333,\n\t\t\t0.977995,\n\t\t\t0.861432,\n\t\t\t0.142808,\n\t\t\t0.937255,\n\t\t\t0.976265,\n\t\t\t0.868016,\n\t\t\t0.143351,\n\t\t\t0.941176,\n\t\t\t0.974443,\n\t\t\t0.874622,\n\t\t\t0.144061,\n\t\t\t0.945098,\n\t\t\t0.97253,\n\t\t\t0.88125,\n\t\t\t0.144923,\n\t\t\t0.94902,\n\t\t\t0.970533,\n\t\t\t0.887896,\n\t\t\t0.145919,\n\t\t\t0.952941,\n\t\t\t0.968443,\n\t\t\t0.894564,\n\t\t\t0.147014,\n\t\t\t0.956863,\n\t\t\t0.966271,\n\t\t\t0.901249,\n\t\t\t0.14818,\n\t\t\t0.960784,\n\t\t\t0.964021,\n\t\t\t0.90795,\n\t\t\t0.14937,\n\t\t\t0.964706,\n\t\t\t0.961681,\n\t\t\t0.914672,\n\t\t\t0.15052,\n\t\t\t0.968627,\n\t\t\t0.959276,\n\t\t\t0.921407,\n\t\t\t0.151566,\n\t\t\t0.972549,\n\t\t\t0.956808,\n\t\t\t0.928152,\n\t\t\t0.152409,\n\t\t\t0.976471,\n\t\t\t0.954287,\n\t\t\t0.934908,\n\t\t\t0.152921,\n\t\t\t0.980392,\n\t\t\t0.951726,\n\t\t\t0.941671,\n\t\t\t0.152925,\n\t\t\t0.984314,\n\t\t\t0.949151,\n\t\t\t0.948435,\n\t\t\t0.152178,\n\t\t\t0.988235,\n\t\t\t0.946602,\n\t\t\t0.95519,\n\t\t\t0.150328,\n\t\t\t0.992157,\n\t\t\t0.944152,\n\t\t\t0.961916,\n\t\t\t0.146861,\n\t\t\t0.996078,\n\t\t\t0.941896,\n\t\t\t0.96859,\n\t\t\t0.140956,\n\t\t\t1,\n\t\t\t0.940015,\n\t\t\t0.975158,\n\t\t\t0.131326\n\t\t]\n\t},\n\t{\n\t\tColorSpace: \"Diverging\",\n\t\tName: \"Viridis (matplotlib)\",\n\t\tNanColor: [\n\t\t\t1,\n\t\t\t0,\n\t\t\t0\n\t\t],\n\t\tSource: \"https://github.com/BIDS/colormap/blob/master/colormaps.py\",\n\t\tLicense: \"CC0\",\n\t\tCreator: \"Eric Firing\",\n\t\tRGBPoints: [\n\t\t\t0,\n\t\t\t0.267004,\n\t\t\t0.004874,\n\t\t\t0.329415,\n\t\t\t0.003922,\n\t\t\t0.26851,\n\t\t\t0.009605,\n\t\t\t0.335427,\n\t\t\t0.007843,\n\t\t\t0.269944,\n\t\t\t0.014625,\n\t\t\t0.341379,\n\t\t\t0.011765,\n\t\t\t0.271305,\n\t\t\t0.019942,\n\t\t\t0.347269,\n\t\t\t0.015686,\n\t\t\t0.272594,\n\t\t\t0.025563,\n\t\t\t0.353093,\n\t\t\t0.019608,\n\t\t\t0.273809,\n\t\t\t0.031497,\n\t\t\t0.358853,\n\t\t\t0.023529,\n\t\t\t0.274952,\n\t\t\t0.037752,\n\t\t\t0.364543,\n\t\t\t0.027451,\n\t\t\t0.276022,\n\t\t\t0.044167,\n\t\t\t0.370164,\n\t\t\t0.031373,\n\t\t\t0.277018,\n\t\t\t0.050344,\n\t\t\t0.375715,\n\t\t\t0.035294,\n\t\t\t0.277941,\n\t\t\t0.056324,\n\t\t\t0.381191,\n\t\t\t0.039216,\n\t\t\t0.278791,\n\t\t\t0.062145,\n\t\t\t0.386592,\n\t\t\t0.043137,\n\t\t\t0.279566,\n\t\t\t0.067836,\n\t\t\t0.391917,\n\t\t\t0.047059,\n\t\t\t0.280267,\n\t\t\t0.073417,\n\t\t\t0.397163,\n\t\t\t0.05098,\n\t\t\t0.280894,\n\t\t\t0.078907,\n\t\t\t0.402329,\n\t\t\t0.054902,\n\t\t\t0.281446,\n\t\t\t0.08432,\n\t\t\t0.407414,\n\t\t\t0.058824,\n\t\t\t0.281924,\n\t\t\t0.089666,\n\t\t\t0.412415,\n\t\t\t0.062745,\n\t\t\t0.282327,\n\t\t\t0.094955,\n\t\t\t0.417331,\n\t\t\t0.066667,\n\t\t\t0.282656,\n\t\t\t0.100196,\n\t\t\t0.42216,\n\t\t\t0.070588,\n\t\t\t0.28291,\n\t\t\t0.105393,\n\t\t\t0.426902,\n\t\t\t0.07451,\n\t\t\t0.283091,\n\t\t\t0.110553,\n\t\t\t0.431554,\n\t\t\t0.078431,\n\t\t\t0.283197,\n\t\t\t0.11568,\n\t\t\t0.436115,\n\t\t\t0.082353,\n\t\t\t0.283229,\n\t\t\t0.120777,\n\t\t\t0.440584,\n\t\t\t0.086275,\n\t\t\t0.283187,\n\t\t\t0.125848,\n\t\t\t0.44496,\n\t\t\t0.090196,\n\t\t\t0.283072,\n\t\t\t0.130895,\n\t\t\t0.449241,\n\t\t\t0.094118,\n\t\t\t0.282884,\n\t\t\t0.13592,\n\t\t\t0.453427,\n\t\t\t0.098039,\n\t\t\t0.282623,\n\t\t\t0.140926,\n\t\t\t0.457517,\n\t\t\t0.101961,\n\t\t\t0.28229,\n\t\t\t0.145912,\n\t\t\t0.46151,\n\t\t\t0.105882,\n\t\t\t0.281887,\n\t\t\t0.150881,\n\t\t\t0.465405,\n\t\t\t0.109804,\n\t\t\t0.281412,\n\t\t\t0.155834,\n\t\t\t0.469201,\n\t\t\t0.113725,\n\t\t\t0.280868,\n\t\t\t0.160771,\n\t\t\t0.472899,\n\t\t\t0.117647,\n\t\t\t0.280255,\n\t\t\t0.165693,\n\t\t\t0.476498,\n\t\t\t0.121569,\n\t\t\t0.279574,\n\t\t\t0.170599,\n\t\t\t0.479997,\n\t\t\t0.12549,\n\t\t\t0.278826,\n\t\t\t0.17549,\n\t\t\t0.483397,\n\t\t\t0.129412,\n\t\t\t0.278012,\n\t\t\t0.180367,\n\t\t\t0.486697,\n\t\t\t0.133333,\n\t\t\t0.277134,\n\t\t\t0.185228,\n\t\t\t0.489898,\n\t\t\t0.137255,\n\t\t\t0.276194,\n\t\t\t0.190074,\n\t\t\t0.493001,\n\t\t\t0.141176,\n\t\t\t0.275191,\n\t\t\t0.194905,\n\t\t\t0.496005,\n\t\t\t0.145098,\n\t\t\t0.274128,\n\t\t\t0.199721,\n\t\t\t0.498911,\n\t\t\t0.14902,\n\t\t\t0.273006,\n\t\t\t0.20452,\n\t\t\t0.501721,\n\t\t\t0.152941,\n\t\t\t0.271828,\n\t\t\t0.209303,\n\t\t\t0.504434,\n\t\t\t0.156863,\n\t\t\t0.270595,\n\t\t\t0.214069,\n\t\t\t0.507052,\n\t\t\t0.160784,\n\t\t\t0.269308,\n\t\t\t0.218818,\n\t\t\t0.509577,\n\t\t\t0.164706,\n\t\t\t0.267968,\n\t\t\t0.223549,\n\t\t\t0.512008,\n\t\t\t0.168627,\n\t\t\t0.26658,\n\t\t\t0.228262,\n\t\t\t0.514349,\n\t\t\t0.172549,\n\t\t\t0.265145,\n\t\t\t0.232956,\n\t\t\t0.516599,\n\t\t\t0.176471,\n\t\t\t0.263663,\n\t\t\t0.237631,\n\t\t\t0.518762,\n\t\t\t0.180392,\n\t\t\t0.262138,\n\t\t\t0.242286,\n\t\t\t0.520837,\n\t\t\t0.184314,\n\t\t\t0.260571,\n\t\t\t0.246922,\n\t\t\t0.522828,\n\t\t\t0.188235,\n\t\t\t0.258965,\n\t\t\t0.251537,\n\t\t\t0.524736,\n\t\t\t0.192157,\n\t\t\t0.257322,\n\t\t\t0.25613,\n\t\t\t0.526563,\n\t\t\t0.196078,\n\t\t\t0.255645,\n\t\t\t0.260703,\n\t\t\t0.528312,\n\t\t\t0.2,\n\t\t\t0.253935,\n\t\t\t0.265254,\n\t\t\t0.529983,\n\t\t\t0.203922,\n\t\t\t0.252194,\n\t\t\t0.269783,\n\t\t\t0.531579,\n\t\t\t0.207843,\n\t\t\t0.250425,\n\t\t\t0.27429,\n\t\t\t0.533103,\n\t\t\t0.211765,\n\t\t\t0.248629,\n\t\t\t0.278775,\n\t\t\t0.534556,\n\t\t\t0.215686,\n\t\t\t0.246811,\n\t\t\t0.283237,\n\t\t\t0.535941,\n\t\t\t0.219608,\n\t\t\t0.244972,\n\t\t\t0.287675,\n\t\t\t0.53726,\n\t\t\t0.223529,\n\t\t\t0.243113,\n\t\t\t0.292092,\n\t\t\t0.538516,\n\t\t\t0.227451,\n\t\t\t0.241237,\n\t\t\t0.296485,\n\t\t\t0.539709,\n\t\t\t0.231373,\n\t\t\t0.239346,\n\t\t\t0.300855,\n\t\t\t0.540844,\n\t\t\t0.235294,\n\t\t\t0.237441,\n\t\t\t0.305202,\n\t\t\t0.541921,\n\t\t\t0.239216,\n\t\t\t0.235526,\n\t\t\t0.309527,\n\t\t\t0.542944,\n\t\t\t0.243137,\n\t\t\t0.233603,\n\t\t\t0.313828,\n\t\t\t0.543914,\n\t\t\t0.247059,\n\t\t\t0.231674,\n\t\t\t0.318106,\n\t\t\t0.544834,\n\t\t\t0.25098,\n\t\t\t0.229739,\n\t\t\t0.322361,\n\t\t\t0.545706,\n\t\t\t0.254902,\n\t\t\t0.227802,\n\t\t\t0.326594,\n\t\t\t0.546532,\n\t\t\t0.258824,\n\t\t\t0.225863,\n\t\t\t0.330805,\n\t\t\t0.547314,\n\t\t\t0.262745,\n\t\t\t0.223925,\n\t\t\t0.334994,\n\t\t\t0.548053,\n\t\t\t0.266667,\n\t\t\t0.221989,\n\t\t\t0.339161,\n\t\t\t0.548752,\n\t\t\t0.270588,\n\t\t\t0.220057,\n\t\t\t0.343307,\n\t\t\t0.549413,\n\t\t\t0.27451,\n\t\t\t0.21813,\n\t\t\t0.347432,\n\t\t\t0.550038,\n\t\t\t0.278431,\n\t\t\t0.21621,\n\t\t\t0.351535,\n\t\t\t0.550627,\n\t\t\t0.282353,\n\t\t\t0.214298,\n\t\t\t0.355619,\n\t\t\t0.551184,\n\t\t\t0.286275,\n\t\t\t0.212395,\n\t\t\t0.359683,\n\t\t\t0.55171,\n\t\t\t0.290196,\n\t\t\t0.210503,\n\t\t\t0.363727,\n\t\t\t0.552206,\n\t\t\t0.294118,\n\t\t\t0.208623,\n\t\t\t0.367752,\n\t\t\t0.552675,\n\t\t\t0.298039,\n\t\t\t0.206756,\n\t\t\t0.371758,\n\t\t\t0.553117,\n\t\t\t0.301961,\n\t\t\t0.204903,\n\t\t\t0.375746,\n\t\t\t0.553533,\n\t\t\t0.305882,\n\t\t\t0.203063,\n\t\t\t0.379716,\n\t\t\t0.553925,\n\t\t\t0.309804,\n\t\t\t0.201239,\n\t\t\t0.38367,\n\t\t\t0.554294,\n\t\t\t0.313725,\n\t\t\t0.19943,\n\t\t\t0.387607,\n\t\t\t0.554642,\n\t\t\t0.317647,\n\t\t\t0.197636,\n\t\t\t0.391528,\n\t\t\t0.554969,\n\t\t\t0.321569,\n\t\t\t0.19586,\n\t\t\t0.395433,\n\t\t\t0.555276,\n\t\t\t0.32549,\n\t\t\t0.1941,\n\t\t\t0.399323,\n\t\t\t0.555565,\n\t\t\t0.329412,\n\t\t\t0.192357,\n\t\t\t0.403199,\n\t\t\t0.555836,\n\t\t\t0.333333,\n\t\t\t0.190631,\n\t\t\t0.407061,\n\t\t\t0.556089,\n\t\t\t0.337255,\n\t\t\t0.188923,\n\t\t\t0.41091,\n\t\t\t0.556326,\n\t\t\t0.341176,\n\t\t\t0.187231,\n\t\t\t0.414746,\n\t\t\t0.556547,\n\t\t\t0.345098,\n\t\t\t0.185556,\n\t\t\t0.41857,\n\t\t\t0.556753,\n\t\t\t0.34902,\n\t\t\t0.183898,\n\t\t\t0.422383,\n\t\t\t0.556944,\n\t\t\t0.352941,\n\t\t\t0.182256,\n\t\t\t0.426184,\n\t\t\t0.55712,\n\t\t\t0.356863,\n\t\t\t0.180629,\n\t\t\t0.429975,\n\t\t\t0.557282,\n\t\t\t0.360784,\n\t\t\t0.179019,\n\t\t\t0.433756,\n\t\t\t0.55743,\n\t\t\t0.364706,\n\t\t\t0.177423,\n\t\t\t0.437527,\n\t\t\t0.557565,\n\t\t\t0.368627,\n\t\t\t0.175841,\n\t\t\t0.44129,\n\t\t\t0.557685,\n\t\t\t0.372549,\n\t\t\t0.174274,\n\t\t\t0.445044,\n\t\t\t0.557792,\n\t\t\t0.376471,\n\t\t\t0.172719,\n\t\t\t0.448791,\n\t\t\t0.557885,\n\t\t\t0.380392,\n\t\t\t0.171176,\n\t\t\t0.45253,\n\t\t\t0.557965,\n\t\t\t0.384314,\n\t\t\t0.169646,\n\t\t\t0.456262,\n\t\t\t0.55803,\n\t\t\t0.388235,\n\t\t\t0.168126,\n\t\t\t0.459988,\n\t\t\t0.558082,\n\t\t\t0.392157,\n\t\t\t0.166617,\n\t\t\t0.463708,\n\t\t\t0.558119,\n\t\t\t0.396078,\n\t\t\t0.165117,\n\t\t\t0.467423,\n\t\t\t0.558141,\n\t\t\t0.4,\n\t\t\t0.163625,\n\t\t\t0.471133,\n\t\t\t0.558148,\n\t\t\t0.403922,\n\t\t\t0.162142,\n\t\t\t0.474838,\n\t\t\t0.55814,\n\t\t\t0.407843,\n\t\t\t0.160665,\n\t\t\t0.47854,\n\t\t\t0.558115,\n\t\t\t0.411765,\n\t\t\t0.159194,\n\t\t\t0.482237,\n\t\t\t0.558073,\n\t\t\t0.415686,\n\t\t\t0.157729,\n\t\t\t0.485932,\n\t\t\t0.558013,\n\t\t\t0.419608,\n\t\t\t0.15627,\n\t\t\t0.489624,\n\t\t\t0.557936,\n\t\t\t0.423529,\n\t\t\t0.154815,\n\t\t\t0.493313,\n\t\t\t0.55784,\n\t\t\t0.427451,\n\t\t\t0.153364,\n\t\t\t0.497,\n\t\t\t0.557724,\n\t\t\t0.431373,\n\t\t\t0.151918,\n\t\t\t0.500685,\n\t\t\t0.557587,\n\t\t\t0.435294,\n\t\t\t0.150476,\n\t\t\t0.504369,\n\t\t\t0.55743,\n\t\t\t0.439216,\n\t\t\t0.149039,\n\t\t\t0.508051,\n\t\t\t0.55725,\n\t\t\t0.443137,\n\t\t\t0.147607,\n\t\t\t0.511733,\n\t\t\t0.557049,\n\t\t\t0.447059,\n\t\t\t0.14618,\n\t\t\t0.515413,\n\t\t\t0.556823,\n\t\t\t0.45098,\n\t\t\t0.144759,\n\t\t\t0.519093,\n\t\t\t0.556572,\n\t\t\t0.454902,\n\t\t\t0.143343,\n\t\t\t0.522773,\n\t\t\t0.556295,\n\t\t\t0.458824,\n\t\t\t0.141935,\n\t\t\t0.526453,\n\t\t\t0.555991,\n\t\t\t0.462745,\n\t\t\t0.140536,\n\t\t\t0.530132,\n\t\t\t0.555659,\n\t\t\t0.466667,\n\t\t\t0.139147,\n\t\t\t0.533812,\n\t\t\t0.555298,\n\t\t\t0.470588,\n\t\t\t0.13777,\n\t\t\t0.537492,\n\t\t\t0.554906,\n\t\t\t0.47451,\n\t\t\t0.136408,\n\t\t\t0.541173,\n\t\t\t0.554483,\n\t\t\t0.478431,\n\t\t\t0.135066,\n\t\t\t0.544853,\n\t\t\t0.554029,\n\t\t\t0.482353,\n\t\t\t0.133743,\n\t\t\t0.548535,\n\t\t\t0.553541,\n\t\t\t0.486275,\n\t\t\t0.132444,\n\t\t\t0.552216,\n\t\t\t0.553018,\n\t\t\t0.490196,\n\t\t\t0.131172,\n\t\t\t0.555899,\n\t\t\t0.552459,\n\t\t\t0.494118,\n\t\t\t0.129933,\n\t\t\t0.559582,\n\t\t\t0.551864,\n\t\t\t0.498039,\n\t\t\t0.128729,\n\t\t\t0.563265,\n\t\t\t0.551229,\n\t\t\t0.501961,\n\t\t\t0.127568,\n\t\t\t0.566949,\n\t\t\t0.550556,\n\t\t\t0.505882,\n\t\t\t0.126453,\n\t\t\t0.570633,\n\t\t\t0.549841,\n\t\t\t0.509804,\n\t\t\t0.125394,\n\t\t\t0.574318,\n\t\t\t0.549086,\n\t\t\t0.513725,\n\t\t\t0.124395,\n\t\t\t0.578002,\n\t\t\t0.548287,\n\t\t\t0.517647,\n\t\t\t0.123463,\n\t\t\t0.581687,\n\t\t\t0.547445,\n\t\t\t0.521569,\n\t\t\t0.122606,\n\t\t\t0.585371,\n\t\t\t0.546557,\n\t\t\t0.52549,\n\t\t\t0.121831,\n\t\t\t0.589055,\n\t\t\t0.545623,\n\t\t\t0.529412,\n\t\t\t0.121148,\n\t\t\t0.592739,\n\t\t\t0.544641,\n\t\t\t0.533333,\n\t\t\t0.120565,\n\t\t\t0.596422,\n\t\t\t0.543611,\n\t\t\t0.537255,\n\t\t\t0.120092,\n\t\t\t0.600104,\n\t\t\t0.54253,\n\t\t\t0.541176,\n\t\t\t0.119738,\n\t\t\t0.603785,\n\t\t\t0.5414,\n\t\t\t0.545098,\n\t\t\t0.119512,\n\t\t\t0.607464,\n\t\t\t0.540218,\n\t\t\t0.54902,\n\t\t\t0.119423,\n\t\t\t0.611141,\n\t\t\t0.538982,\n\t\t\t0.552941,\n\t\t\t0.119483,\n\t\t\t0.614817,\n\t\t\t0.537692,\n\t\t\t0.556863,\n\t\t\t0.119699,\n\t\t\t0.61849,\n\t\t\t0.536347,\n\t\t\t0.560784,\n\t\t\t0.120081,\n\t\t\t0.622161,\n\t\t\t0.534946,\n\t\t\t0.564706,\n\t\t\t0.120638,\n\t\t\t0.625828,\n\t\t\t0.533488,\n\t\t\t0.568627,\n\t\t\t0.12138,\n\t\t\t0.629492,\n\t\t\t0.531973,\n\t\t\t0.572549,\n\t\t\t0.122312,\n\t\t\t0.633153,\n\t\t\t0.530398,\n\t\t\t0.576471,\n\t\t\t0.123444,\n\t\t\t0.636809,\n\t\t\t0.528763,\n\t\t\t0.580392,\n\t\t\t0.12478,\n\t\t\t0.640461,\n\t\t\t0.527068,\n\t\t\t0.584314,\n\t\t\t0.126326,\n\t\t\t0.644107,\n\t\t\t0.525311,\n\t\t\t0.588235,\n\t\t\t0.128087,\n\t\t\t0.647749,\n\t\t\t0.523491,\n\t\t\t0.592157,\n\t\t\t0.130067,\n\t\t\t0.651384,\n\t\t\t0.521608,\n\t\t\t0.596078,\n\t\t\t0.132268,\n\t\t\t0.655014,\n\t\t\t0.519661,\n\t\t\t0.6,\n\t\t\t0.134692,\n\t\t\t0.658636,\n\t\t\t0.517649,\n\t\t\t0.603922,\n\t\t\t0.137339,\n\t\t\t0.662252,\n\t\t\t0.515571,\n\t\t\t0.607843,\n\t\t\t0.14021,\n\t\t\t0.665859,\n\t\t\t0.513427,\n\t\t\t0.611765,\n\t\t\t0.143303,\n\t\t\t0.669459,\n\t\t\t0.511215,\n\t\t\t0.615686,\n\t\t\t0.146616,\n\t\t\t0.67305,\n\t\t\t0.508936,\n\t\t\t0.619608,\n\t\t\t0.150148,\n\t\t\t0.676631,\n\t\t\t0.506589,\n\t\t\t0.623529,\n\t\t\t0.153894,\n\t\t\t0.680203,\n\t\t\t0.504172,\n\t\t\t0.627451,\n\t\t\t0.157851,\n\t\t\t0.683765,\n\t\t\t0.501686,\n\t\t\t0.631373,\n\t\t\t0.162016,\n\t\t\t0.687316,\n\t\t\t0.499129,\n\t\t\t0.635294,\n\t\t\t0.166383,\n\t\t\t0.690856,\n\t\t\t0.496502,\n\t\t\t0.639216,\n\t\t\t0.170948,\n\t\t\t0.694384,\n\t\t\t0.493803,\n\t\t\t0.643137,\n\t\t\t0.175707,\n\t\t\t0.6979,\n\t\t\t0.491033,\n\t\t\t0.647059,\n\t\t\t0.180653,\n\t\t\t0.701402,\n\t\t\t0.488189,\n\t\t\t0.65098,\n\t\t\t0.185783,\n\t\t\t0.704891,\n\t\t\t0.485273,\n\t\t\t0.654902,\n\t\t\t0.19109,\n\t\t\t0.708366,\n\t\t\t0.482284,\n\t\t\t0.658824,\n\t\t\t0.196571,\n\t\t\t0.711827,\n\t\t\t0.479221,\n\t\t\t0.662745,\n\t\t\t0.202219,\n\t\t\t0.715272,\n\t\t\t0.476084,\n\t\t\t0.666667,\n\t\t\t0.20803,\n\t\t\t0.718701,\n\t\t\t0.472873,\n\t\t\t0.670588,\n\t\t\t0.214,\n\t\t\t0.722114,\n\t\t\t0.469588,\n\t\t\t0.67451,\n\t\t\t0.220124,\n\t\t\t0.725509,\n\t\t\t0.466226,\n\t\t\t0.678431,\n\t\t\t0.226397,\n\t\t\t0.728888,\n\t\t\t0.462789,\n\t\t\t0.682353,\n\t\t\t0.232815,\n\t\t\t0.732247,\n\t\t\t0.459277,\n\t\t\t0.686275,\n\t\t\t0.239374,\n\t\t\t0.735588,\n\t\t\t0.455688,\n\t\t\t0.690196,\n\t\t\t0.24607,\n\t\t\t0.73891,\n\t\t\t0.452024,\n\t\t\t0.694118,\n\t\t\t0.252899,\n\t\t\t0.742211,\n\t\t\t0.448284,\n\t\t\t0.698039,\n\t\t\t0.259857,\n\t\t\t0.745492,\n\t\t\t0.444467,\n\t\t\t0.701961,\n\t\t\t0.266941,\n\t\t\t0.748751,\n\t\t\t0.440573,\n\t\t\t0.705882,\n\t\t\t0.274149,\n\t\t\t0.751988,\n\t\t\t0.436601,\n\t\t\t0.709804,\n\t\t\t0.281477,\n\t\t\t0.755203,\n\t\t\t0.432552,\n\t\t\t0.713725,\n\t\t\t0.288921,\n\t\t\t0.758394,\n\t\t\t0.428426,\n\t\t\t0.717647,\n\t\t\t0.296479,\n\t\t\t0.761561,\n\t\t\t0.424223,\n\t\t\t0.721569,\n\t\t\t0.304148,\n\t\t\t0.764704,\n\t\t\t0.419943,\n\t\t\t0.72549,\n\t\t\t0.311925,\n\t\t\t0.767822,\n\t\t\t0.415586,\n\t\t\t0.729412,\n\t\t\t0.319809,\n\t\t\t0.770914,\n\t\t\t0.411152,\n\t\t\t0.733333,\n\t\t\t0.327796,\n\t\t\t0.77398,\n\t\t\t0.40664,\n\t\t\t0.737255,\n\t\t\t0.335885,\n\t\t\t0.777018,\n\t\t\t0.402049,\n\t\t\t0.741176,\n\t\t\t0.344074,\n\t\t\t0.780029,\n\t\t\t0.397381,\n\t\t\t0.745098,\n\t\t\t0.35236,\n\t\t\t0.783011,\n\t\t\t0.392636,\n\t\t\t0.74902,\n\t\t\t0.360741,\n\t\t\t0.785964,\n\t\t\t0.387814,\n\t\t\t0.752941,\n\t\t\t0.369214,\n\t\t\t0.788888,\n\t\t\t0.382914,\n\t\t\t0.756863,\n\t\t\t0.377779,\n\t\t\t0.791781,\n\t\t\t0.377939,\n\t\t\t0.760784,\n\t\t\t0.386433,\n\t\t\t0.794644,\n\t\t\t0.372886,\n\t\t\t0.764706,\n\t\t\t0.395174,\n\t\t\t0.797475,\n\t\t\t0.367757,\n\t\t\t0.768627,\n\t\t\t0.404001,\n\t\t\t0.800275,\n\t\t\t0.362552,\n\t\t\t0.772549,\n\t\t\t0.412913,\n\t\t\t0.803041,\n\t\t\t0.357269,\n\t\t\t0.776471,\n\t\t\t0.421908,\n\t\t\t0.805774,\n\t\t\t0.35191,\n\t\t\t0.780392,\n\t\t\t0.430983,\n\t\t\t0.808473,\n\t\t\t0.346476,\n\t\t\t0.784314,\n\t\t\t0.440137,\n\t\t\t0.811138,\n\t\t\t0.340967,\n\t\t\t0.788235,\n\t\t\t0.449368,\n\t\t\t0.813768,\n\t\t\t0.335384,\n\t\t\t0.792157,\n\t\t\t0.458674,\n\t\t\t0.816363,\n\t\t\t0.329727,\n\t\t\t0.796078,\n\t\t\t0.468053,\n\t\t\t0.818921,\n\t\t\t0.323998,\n\t\t\t0.8,\n\t\t\t0.477504,\n\t\t\t0.821444,\n\t\t\t0.318195,\n\t\t\t0.803922,\n\t\t\t0.487026,\n\t\t\t0.823929,\n\t\t\t0.312321,\n\t\t\t0.807843,\n\t\t\t0.496615,\n\t\t\t0.826376,\n\t\t\t0.306377,\n\t\t\t0.811765,\n\t\t\t0.506271,\n\t\t\t0.828786,\n\t\t\t0.300362,\n\t\t\t0.815686,\n\t\t\t0.515992,\n\t\t\t0.831158,\n\t\t\t0.294279,\n\t\t\t0.819608,\n\t\t\t0.525776,\n\t\t\t0.833491,\n\t\t\t0.288127,\n\t\t\t0.823529,\n\t\t\t0.535621,\n\t\t\t0.835785,\n\t\t\t0.281908,\n\t\t\t0.827451,\n\t\t\t0.545524,\n\t\t\t0.838039,\n\t\t\t0.275626,\n\t\t\t0.831373,\n\t\t\t0.555484,\n\t\t\t0.840254,\n\t\t\t0.269281,\n\t\t\t0.835294,\n\t\t\t0.565498,\n\t\t\t0.84243,\n\t\t\t0.262877,\n\t\t\t0.839216,\n\t\t\t0.575563,\n\t\t\t0.844566,\n\t\t\t0.256415,\n\t\t\t0.843137,\n\t\t\t0.585678,\n\t\t\t0.846661,\n\t\t\t0.249897,\n\t\t\t0.847059,\n\t\t\t0.595839,\n\t\t\t0.848717,\n\t\t\t0.243329,\n\t\t\t0.85098,\n\t\t\t0.606045,\n\t\t\t0.850733,\n\t\t\t0.236712,\n\t\t\t0.854902,\n\t\t\t0.616293,\n\t\t\t0.852709,\n\t\t\t0.230052,\n\t\t\t0.858824,\n\t\t\t0.626579,\n\t\t\t0.854645,\n\t\t\t0.223353,\n\t\t\t0.862745,\n\t\t\t0.636902,\n\t\t\t0.856542,\n\t\t\t0.21662,\n\t\t\t0.866667,\n\t\t\t0.647257,\n\t\t\t0.8584,\n\t\t\t0.209861,\n\t\t\t0.870588,\n\t\t\t0.657642,\n\t\t\t0.860219,\n\t\t\t0.203082,\n\t\t\t0.87451,\n\t\t\t0.668054,\n\t\t\t0.861999,\n\t\t\t0.196293,\n\t\t\t0.878431,\n\t\t\t0.678489,\n\t\t\t0.863742,\n\t\t\t0.189503,\n\t\t\t0.882353,\n\t\t\t0.688944,\n\t\t\t0.865448,\n\t\t\t0.182725,\n\t\t\t0.886275,\n\t\t\t0.699415,\n\t\t\t0.867117,\n\t\t\t0.175971,\n\t\t\t0.890196,\n\t\t\t0.709898,\n\t\t\t0.868751,\n\t\t\t0.169257,\n\t\t\t0.894118,\n\t\t\t0.720391,\n\t\t\t0.87035,\n\t\t\t0.162603,\n\t\t\t0.898039,\n\t\t\t0.730889,\n\t\t\t0.871916,\n\t\t\t0.156029,\n\t\t\t0.901961,\n\t\t\t0.741388,\n\t\t\t0.873449,\n\t\t\t0.149561,\n\t\t\t0.905882,\n\t\t\t0.751884,\n\t\t\t0.874951,\n\t\t\t0.143228,\n\t\t\t0.909804,\n\t\t\t0.762373,\n\t\t\t0.876424,\n\t\t\t0.137064,\n\t\t\t0.913725,\n\t\t\t0.772852,\n\t\t\t0.877868,\n\t\t\t0.131109,\n\t\t\t0.917647,\n\t\t\t0.783315,\n\t\t\t0.879285,\n\t\t\t0.125405,\n\t\t\t0.921569,\n\t\t\t0.79376,\n\t\t\t0.880678,\n\t\t\t0.120005,\n\t\t\t0.92549,\n\t\t\t0.804182,\n\t\t\t0.882046,\n\t\t\t0.114965,\n\t\t\t0.929412,\n\t\t\t0.814576,\n\t\t\t0.883393,\n\t\t\t0.110347,\n\t\t\t0.933333,\n\t\t\t0.82494,\n\t\t\t0.88472,\n\t\t\t0.106217,\n\t\t\t0.937255,\n\t\t\t0.83527,\n\t\t\t0.886029,\n\t\t\t0.102646,\n\t\t\t0.941176,\n\t\t\t0.845561,\n\t\t\t0.887322,\n\t\t\t0.099702,\n\t\t\t0.945098,\n\t\t\t0.85581,\n\t\t\t0.888601,\n\t\t\t0.097452,\n\t\t\t0.94902,\n\t\t\t0.866013,\n\t\t\t0.889868,\n\t\t\t0.095953,\n\t\t\t0.952941,\n\t\t\t0.876168,\n\t\t\t0.891125,\n\t\t\t0.09525,\n\t\t\t0.956863,\n\t\t\t0.886271,\n\t\t\t0.892374,\n\t\t\t0.095374,\n\t\t\t0.960784,\n\t\t\t0.89632,\n\t\t\t0.893616,\n\t\t\t0.096335,\n\t\t\t0.964706,\n\t\t\t0.906311,\n\t\t\t0.894855,\n\t\t\t0.098125,\n\t\t\t0.968627,\n\t\t\t0.916242,\n\t\t\t0.896091,\n\t\t\t0.100717,\n\t\t\t0.972549,\n\t\t\t0.926106,\n\t\t\t0.89733,\n\t\t\t0.104071,\n\t\t\t0.976471,\n\t\t\t0.935904,\n\t\t\t0.89857,\n\t\t\t0.108131,\n\t\t\t0.980392,\n\t\t\t0.945636,\n\t\t\t0.899815,\n\t\t\t0.112838,\n\t\t\t0.984314,\n\t\t\t0.9553,\n\t\t\t0.901065,\n\t\t\t0.118128,\n\t\t\t0.988235,\n\t\t\t0.964894,\n\t\t\t0.902323,\n\t\t\t0.123941,\n\t\t\t0.992157,\n\t\t\t0.974417,\n\t\t\t0.90359,\n\t\t\t0.130215,\n\t\t\t0.996078,\n\t\t\t0.983868,\n\t\t\t0.904867,\n\t\t\t0.136897,\n\t\t\t1,\n\t\t\t0.993248,\n\t\t\t0.906157,\n\t\t\t0.143936\n\t\t]\n\t},\n\t{\n\t\tShowIndexedColorActiveValues: 1,\n\t\tIndexedColors: [\n\t\t\t0.07,\n\t\t\t0.5,\n\t\t\t0.7,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.85,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.8,\n\t\t\t0.5,\n\t\t\t1,\n\t\t\t0.76,\n\t\t\t1,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0.71,\n\t\t\t0.71,\n\t\t\t0.5,\n\t\t\t0.5,\n\t\t\t0.5,\n\t\t\t0.05,\n\t\t\t0.05,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.05,\n\t\t\t0.05,\n\t\t\t0.7,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.7,\n\t\t\t0.89,\n\t\t\t0.96,\n\t\t\t0.67,\n\t\t\t0.36,\n\t\t\t0.95,\n\t\t\t0.54,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0.75,\n\t\t\t0.65,\n\t\t\t0.65,\n\t\t\t0.5,\n\t\t\t0.6,\n\t\t\t0.6,\n\t\t\t1,\n\t\t\t0.5,\n\t\t\t0,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.19,\n\t\t\t0.12,\n\t\t\t0.94,\n\t\t\t0.12,\n\t\t\t0.5,\n\t\t\t0.82,\n\t\t\t0.89,\n\t\t\t0.56,\n\t\t\t0.25,\n\t\t\t0.83,\n\t\t\t0.24,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0.9,\n\t\t\t0.9,\n\t\t\t0.9,\n\t\t\t0.75,\n\t\t\t0.76,\n\t\t\t0.78,\n\t\t\t0.65,\n\t\t\t0.65,\n\t\t\t0.67,\n\t\t\t0.54,\n\t\t\t0.6,\n\t\t\t0.78,\n\t\t\t0.61,\n\t\t\t0.48,\n\t\t\t0.78,\n\t\t\t0.5,\n\t\t\t0.48,\n\t\t\t0.78,\n\t\t\t0.44,\n\t\t\t0.48,\n\t\t\t0.78,\n\t\t\t0.36,\n\t\t\t0.48,\n\t\t\t0.76,\n\t\t\t1,\n\t\t\t0.48,\n\t\t\t0.38,\n\t\t\t0.49,\n\t\t\t0.5,\n\t\t\t0.69,\n\t\t\t0.76,\n\t\t\t0.56,\n\t\t\t0.56,\n\t\t\t0.4,\n\t\t\t0.56,\n\t\t\t0.56,\n\t\t\t0.74,\n\t\t\t0.5,\n\t\t\t0.89,\n\t\t\t1,\n\t\t\t0.63,\n\t\t\t0,\n\t\t\t0.65,\n\t\t\t0.16,\n\t\t\t0.16,\n\t\t\t0.36,\n\t\t\t0.72,\n\t\t\t0.82,\n\t\t\t0.44,\n\t\t\t0.18,\n\t\t\t0.69,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0.58,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.58,\n\t\t\t0.88,\n\t\t\t0.88,\n\t\t\t0.45,\n\t\t\t0.76,\n\t\t\t0.79,\n\t\t\t0.33,\n\t\t\t0.71,\n\t\t\t0.71,\n\t\t\t0.23,\n\t\t\t0.62,\n\t\t\t0.62,\n\t\t\t0.14,\n\t\t\t0.56,\n\t\t\t0.56,\n\t\t\t0.04,\n\t\t\t0.49,\n\t\t\t0.55,\n\t\t\t0,\n\t\t\t0.41,\n\t\t\t0.52,\n\t\t\t0.88,\n\t\t\t0.88,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.85,\n\t\t\t0.56,\n\t\t\t0.65,\n\t\t\t0.46,\n\t\t\t0.45,\n\t\t\t0.4,\n\t\t\t0.5,\n\t\t\t0.5,\n\t\t\t0.62,\n\t\t\t0.39,\n\t\t\t0.71,\n\t\t\t0.83,\n\t\t\t0.48,\n\t\t\t0,\n\t\t\t0.58,\n\t\t\t0,\n\t\t\t0.58,\n\t\t\t0.26,\n\t\t\t0.62,\n\t\t\t0.69,\n\t\t\t0.34,\n\t\t\t0.09,\n\t\t\t0.56,\n\t\t\t0,\n\t\t\t0.79,\n\t\t\t0,\n\t\t\t0.44,\n\t\t\t0.83,\n\t\t\t1,\n\t\t\t1,\n\t\t\t1,\n\t\t\t0.78,\n\t\t\t0.85,\n\t\t\t1,\n\t\t\t0.78,\n\t\t\t0.78,\n\t\t\t1,\n\t\t\t0.78,\n\t\t\t0.64,\n\t\t\t1,\n\t\t\t0.78,\n\t\t\t0.56,\n\t\t\t1,\n\t\t\t0.78,\n\t\t\t0.38,\n\t\t\t1,\n\t\t\t0.78,\n\t\t\t0.27,\n\t\t\t1,\n\t\t\t0.78,\n\t\t\t0.19,\n\t\t\t1,\n\t\t\t0.78,\n\t\t\t0.12,\n\t\t\t1,\n\t\t\t0.78,\n\t\t\t0,\n\t\t\t1,\n\t\t\t0.61,\n\t\t\t0,\n\t\t\t0.9,\n\t\t\t0.46,\n\t\t\t0,\n\t\t\t0.83,\n\t\t\t0.32,\n\t\t\t0,\n\t\t\t0.75,\n\t\t\t0.22,\n\t\t\t0,\n\t\t\t0.67,\n\t\t\t0.14,\n\t\t\t0.3,\n\t\t\t0.76,\n\t\t\t1,\n\t\t\t0.3,\n\t\t\t0.65,\n\t\t\t1,\n\t\t\t0.13,\n\t\t\t0.58,\n\t\t\t0.84,\n\t\t\t0.15,\n\t\t\t0.49,\n\t\t\t0.67,\n\t\t\t0.15,\n\t\t\t0.4,\n\t\t\t0.59,\n\t\t\t0.09,\n\t\t\t0.33,\n\t\t\t0.53,\n\t\t\t0.96,\n\t\t\t0.93,\n\t\t\t0.82,\n\t\t\t0.8,\n\t\t\t0.82,\n\t\t\t0.12,\n\t\t\t0.71,\n\t\t\t0.71,\n\t\t\t0.76,\n\t\t\t0.65,\n\t\t\t0.33,\n\t\t\t0.3,\n\t\t\t0.34,\n\t\t\t0.35,\n\t\t\t0.38,\n\t\t\t0.62,\n\t\t\t0.31,\n\t\t\t0.71,\n\t\t\t0.67,\n\t\t\t0.36,\n\t\t\t0,\n\t\t\t0.46,\n\t\t\t0.31,\n\t\t\t0.27,\n\t\t\t0.26,\n\t\t\t0.51,\n\t\t\t0.59,\n\t\t\t0.26,\n\t\t\t0,\n\t\t\t0.4,\n\t\t\t0,\n\t\t\t0.49,\n\t\t\t0,\n\t\t\t0.44,\n\t\t\t0.67,\n\t\t\t0.98,\n\t\t\t0,\n\t\t\t0.73,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0.63,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0.56,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0.5,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0.42,\n\t\t\t1,\n\t\t\t0.33,\n\t\t\t0.36,\n\t\t\t0.95,\n\t\t\t0.47,\n\t\t\t0.36,\n\t\t\t0.89,\n\t\t\t0.54,\n\t\t\t0.31,\n\t\t\t0.89,\n\t\t\t0.63,\n\t\t\t0.21,\n\t\t\t0.83,\n\t\t\t0.7,\n\t\t\t0.12,\n\t\t\t0.83,\n\t\t\t0.7,\n\t\t\t0.12,\n\t\t\t0.73,\n\t\t\t0.7,\n\t\t\t0.05,\n\t\t\t0.65,\n\t\t\t0.74,\n\t\t\t0.05,\n\t\t\t0.53,\n\t\t\t0.78,\n\t\t\t0,\n\t\t\t0.4,\n\t\t\t0.8,\n\t\t\t0,\n\t\t\t0.35,\n\t\t\t0.82,\n\t\t\t0,\n\t\t\t0.31,\n\t\t\t0.85,\n\t\t\t0,\n\t\t\t0.27,\n\t\t\t0.88,\n\t\t\t0,\n\t\t\t0.22,\n\t\t\t0.9,\n\t\t\t0,\n\t\t\t0.18,\n\t\t\t0.91,\n\t\t\t0,\n\t\t\t0.15,\n\t\t\t0.92,\n\t\t\t0,\n\t\t\t0.14,\n\t\t\t0.93,\n\t\t\t0,\n\t\t\t0.13,\n\t\t\t0.94,\n\t\t\t0,\n\t\t\t0.12,\n\t\t\t0.95,\n\t\t\t0,\n\t\t\t0.11,\n\t\t\t0.96,\n\t\t\t0,\n\t\t\t0.1,\n\t\t\t0.97,\n\t\t\t0,\n\t\t\t0.09,\n\t\t\t0.98,\n\t\t\t0,\n\t\t\t0.08,\n\t\t\t0.99,\n\t\t\t0,\n\t\t\t0.07,\n\t\t\t1,\n\t\t\t0,\n\t\t\t0.06\n\t\t],\n\t\tAnnotations: [\n\t\t\t0,\n\t\t\t\"Xx\",\n\t\t\t1,\n\t\t\t\"H\",\n\t\t\t2,\n\t\t\t\"He\",\n\t\t\t3,\n\t\t\t\"Li\",\n\t\t\t4,\n\t\t\t\"Be\",\n\t\t\t5,\n\t\t\t\"B\",\n\t\t\t6,\n\t\t\t\"C\",\n\t\t\t7,\n\t\t\t\"N\",\n\t\t\t8,\n\t\t\t\"O\",\n\t\t\t9,\n\t\t\t\"F\",\n\t\t\t10,\n\t\t\t\"Ne\",\n\t\t\t11,\n\t\t\t\"Na\",\n\t\t\t12,\n\t\t\t\"Mg\",\n\t\t\t13,\n\t\t\t\"Al\",\n\t\t\t14,\n\t\t\t\"Si\",\n\t\t\t15,\n\t\t\t\"P\",\n\t\t\t16,\n\t\t\t\"S\",\n\t\t\t17,\n\t\t\t\"Cl\",\n\t\t\t18,\n\t\t\t\"Ar\",\n\t\t\t19,\n\t\t\t\"K\",\n\t\t\t20,\n\t\t\t\"Ca\",\n\t\t\t21,\n\t\t\t\"Sc\",\n\t\t\t22,\n\t\t\t\"Ti\",\n\t\t\t23,\n\t\t\t\"V\",\n\t\t\t24,\n\t\t\t\"Cr\",\n\t\t\t25,\n\t\t\t\"Mn\",\n\t\t\t26,\n\t\t\t\"Fe\",\n\t\t\t27,\n\t\t\t\"Co\",\n\t\t\t28,\n\t\t\t\"Ni\",\n\t\t\t29,\n\t\t\t\"Cu\",\n\t\t\t30,\n\t\t\t\"Zn\",\n\t\t\t31,\n\t\t\t\"Ga\",\n\t\t\t32,\n\t\t\t\"Ge\",\n\t\t\t33,\n\t\t\t\"As\",\n\t\t\t34,\n\t\t\t\"Se\",\n\t\t\t35,\n\t\t\t\"Br\",\n\t\t\t36,\n\t\t\t\"Kr\",\n\t\t\t37,\n\t\t\t\"Rb\",\n\t\t\t38,\n\t\t\t\"Sr\",\n\t\t\t39,\n\t\t\t\"Y\",\n\t\t\t40,\n\t\t\t\"Zr\",\n\t\t\t41,\n\t\t\t\"Nb\",\n\t\t\t42,\n\t\t\t\"Mo\",\n\t\t\t43,\n\t\t\t\"Tc\",\n\t\t\t44,\n\t\t\t\"Ru\",\n\t\t\t45,\n\t\t\t\"Rh\",\n\t\t\t46,\n\t\t\t\"Pd\",\n\t\t\t47,\n\t\t\t\"Ag\",\n\t\t\t48,\n\t\t\t\"Cd\",\n\t\t\t49,\n\t\t\t\"In\",\n\t\t\t50,\n\t\t\t\"Sn\",\n\t\t\t51,\n\t\t\t\"Sb\",\n\t\t\t52,\n\t\t\t\"Te\",\n\t\t\t53,\n\t\t\t\"I\",\n\t\t\t54,\n\t\t\t\"Xe\",\n\t\t\t55,\n\t\t\t\"Cs\",\n\t\t\t56,\n\t\t\t\"Ba\",\n\t\t\t57,\n\t\t\t\"La\",\n\t\t\t58,\n\t\t\t\"Ce\",\n\t\t\t59,\n\t\t\t\"Pr\",\n\t\t\t60,\n\t\t\t\"Nd\",\n\t\t\t61,\n\t\t\t\"Pm\",\n\t\t\t62,\n\t\t\t\"Sm\",\n\t\t\t63,\n\t\t\t\"Eu\",\n\t\t\t64,\n\t\t\t\"Gd\",\n\t\t\t65,\n\t\t\t\"Tb\",\n\t\t\t66,\n\t\t\t\"Dy\",\n\t\t\t67,\n\t\t\t\"Ho\",\n\t\t\t68,\n\t\t\t\"Er\",\n\t\t\t69,\n\t\t\t\"Tm\",\n\t\t\t70,\n\t\t\t\"Yb\",\n\t\t\t71,\n\t\t\t\"Lu\",\n\t\t\t72,\n\t\t\t\"Hf\",\n\t\t\t73,\n\t\t\t\"Ta\",\n\t\t\t74,\n\t\t\t\"W\",\n\t\t\t75,\n\t\t\t\"Re\",\n\t\t\t76,\n\t\t\t\"Os\",\n\t\t\t77,\n\t\t\t\"Ir\",\n\t\t\t78,\n\t\t\t\"Pt\",\n\t\t\t79,\n\t\t\t\"Au\",\n\t\t\t80,\n\t\t\t\"Hg\",\n\t\t\t81,\n\t\t\t\"Tl\",\n\t\t\t82,\n\t\t\t\"Pb\",\n\t\t\t83,\n\t\t\t\"Bi\",\n\t\t\t84,\n\t\t\t\"Po\",\n\t\t\t85,\n\t\t\t\"At\",\n\t\t\t86,\n\t\t\t\"Rn\",\n\t\t\t87,\n\t\t\t\"Fr\",\n\t\t\t88,\n\t\t\t\"Ra\",\n\t\t\t89,\n\t\t\t\"Ac\",\n\t\t\t90,\n\t\t\t\"Th\",\n\t\t\t91,\n\t\t\t\"Pa\",\n\t\t\t92,\n\t\t\t\"U\",\n\t\t\t93,\n\t\t\t\"Np\",\n\t\t\t94,\n\t\t\t\"Pu\",\n\t\t\t95,\n\t\t\t\"Am\",\n\t\t\t96,\n\t\t\t\"Cm\",\n\t\t\t97,\n\t\t\t\"Bk\",\n\t\t\t98,\n\t\t\t\"Cf\",\n\t\t\t99,\n\t\t\t\"Es\",\n\t\t\t100,\n\t\t\t\"Fm\",\n\t\t\t101,\n\t\t\t\"Md\",\n\t\t\t102,\n\t\t\t\"No\",\n\t\t\t103,\n\t\t\t\"Lr\",\n\t\t\t104,\n\t\t\t\"Rf\",\n\t\t\t105,\n\t\t\t\"Db\",\n\t\t\t106,\n\t\t\t\"Sg\",\n\t\t\t107,\n\t\t\t\"Bh\",\n\t\t\t108,\n\t\t\t\"Hs\",\n\t\t\t109,\n\t\t\t\"Mt\",\n\t\t\t110,\n\t\t\t\"Ds\",\n\t\t\t111,\n\t\t\t\"Rg\",\n\t\t\t112,\n\t\t\t\"Cn\",\n\t\t\t113,\n\t\t\t\"Uut\",\n\t\t\t114,\n\t\t\t\"Uuq\",\n\t\t\t115,\n\t\t\t\"Uup\",\n\t\t\t116,\n\t\t\t\"Uuh\",\n\t\t\t117,\n\t\t\t\"Uus\",\n\t\t\t118,\n\t\t\t\"Uuo\"\n\t\t],\n\t\tName: \"BlueObeliskElements\"\n\t}\n];\n\nexport { vtkColorMaps as v };\n","import { v as vtkColorMaps$1 } from './ColorMaps.json.js';\n\nvar presetMap = Object.create(null);\nvtkColorMaps$1.filter(function (p) {\n return p.RGBPoints;\n}).filter(function (p) {\n return p.ColorSpace !== 'CIELAB';\n}).forEach(function (p) {\n presetMap[p.Name] = p;\n}); // ----------------------------------------------------------------------------\n\nvar rgbPresetNames = Object.keys(presetMap);\nrgbPresetNames.sort(); // ----------------------------------------------------------------------------\n\nfunction getPresetByName(name) {\n return presetMap[name];\n} // ----------------------------------------------------------------------------\n\n\nfunction addPreset(preset) {\n if (!preset.RGBPoints || preset.ColorSpace === 'CIELAB') {\n return;\n }\n\n if (!presetMap[preset.Name]) {\n rgbPresetNames.push(preset.Name);\n rgbPresetNames.sort();\n }\n\n presetMap[preset.Name] = preset;\n} // ----------------------------------------------------------------------------\n\n\nfunction removePresetByName(name) {\n var index = rgbPresetNames.indexOf(name);\n\n if (index > -1) {\n rgbPresetNames.splice(index, 1);\n }\n\n delete presetMap[name];\n} // ----------------------------------------------------------------------------\n\n\nvar vtkColorMaps = {\n addPreset: addPreset,\n removePresetByName: removePresetByName,\n getPresetByName: getPresetByName,\n rgbPresetNames: rgbPresetNames\n};\n\nexport { vtkColorMaps as default };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport macro from '../../macros.js';\nimport vtkColorTransferFunction from './ColorTransferFunction.js';\nimport vtkPiecewiseFunction from '../../Common/DataModel/PiecewiseFunction.js';\nimport Constants from './VolumeProperty/Constants.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nvar InterpolationType = Constants.InterpolationType,\n OpacityMode = Constants.OpacityMode;\nvar vtkErrorMacro = macro.vtkErrorMacro;\nvar VTK_MAX_VRCOMP = 4; // ----------------------------------------------------------------------------\n// vtkVolumeProperty methods\n// ----------------------------------------------------------------------------\n\nfunction vtkVolumeProperty(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkVolumeProperty');\n\n publicAPI.getMTime = function () {\n var mTime = model.mtime;\n var time;\n\n for (var index = 0; index < VTK_MAX_VRCOMP; index++) {\n // Color MTimes\n if (model.componentData[index].colorChannels === 1) {\n if (model.componentData[index].grayTransferFunction) {\n // time that Gray transfer function was last modified\n time = model.componentData[index].grayTransferFunction.getMTime();\n mTime = mTime > time ? mTime : time;\n }\n } else if (model.componentData[index].colorChannels === 3) {\n if (model.componentData[index].rGBTransferFunction) {\n // time that RGB transfer function was last modified\n time = model.componentData[index].rGBTransferFunction.getMTime();\n mTime = mTime > time ? mTime : time;\n }\n } // Opacity MTimes\n\n\n if (model.componentData[index].scalarOpacity) {\n // time that Scalar opacity transfer function was last modified\n time = model.componentData[index].scalarOpacity.getMTime();\n mTime = mTime > time ? mTime : time;\n }\n\n if (model.componentData[index].gradientOpacity) {\n if (!model.componentData[index].disableGradientOpacity) {\n // time that Gradient opacity transfer function was last modified\n time = model.componentData[index].gradientOpacity.getMTime();\n mTime = mTime > time ? mTime : time;\n }\n }\n }\n\n return mTime;\n };\n\n publicAPI.getColorChannels = function (index) {\n if (index < 0 || index > 3) {\n vtkErrorMacro('Bad index - must be between 0 and 3');\n return 0;\n }\n\n return model.componentData[index].colorChannels;\n }; // Set the color of a volume to a gray transfer function\n\n\n publicAPI.setGrayTransferFunction = function (index, func) {\n var modified = false;\n\n if (model.componentData[index].grayTransferFunction !== func) {\n model.componentData[index].grayTransferFunction = func;\n modified = true;\n }\n\n if (model.componentData[index].colorChannels !== 1) {\n model.componentData[index].colorChannels = 1;\n modified = true;\n }\n\n if (modified) {\n publicAPI.modified();\n }\n\n return modified;\n }; // Get the currently set gray transfer function. Create one if none set.\n\n\n publicAPI.getGrayTransferFunction = function (index) {\n if (model.componentData[index].grayTransferFunction === null) {\n model.componentData[index].grayTransferFunction = vtkPiecewiseFunction.newInstance();\n model.componentData[index].grayTransferFunction.addPoint(0, 0.0);\n model.componentData[index].grayTransferFunction.addPoint(1024, 1.0);\n\n if (model.componentData[index].colorChannels !== 1) {\n model.componentData[index].colorChannels = 1;\n }\n\n publicAPI.modified();\n }\n\n return model.componentData[index].grayTransferFunction;\n }; // Set the color of a volume to an RGB transfer function\n\n\n publicAPI.setRGBTransferFunction = function (index, func) {\n var modified = false;\n\n if (model.componentData[index].rGBTransferFunction !== func) {\n model.componentData[index].rGBTransferFunction = func;\n modified = true;\n }\n\n if (model.componentData[index].colorChannels !== 3) {\n model.componentData[index].colorChannels = 3;\n modified = true;\n }\n\n if (modified) {\n publicAPI.modified();\n }\n\n return modified;\n }; // Get the currently set RGB transfer function. Create one if none set.\n\n\n publicAPI.getRGBTransferFunction = function (index) {\n if (model.componentData[index].rGBTransferFunction === null) {\n model.componentData[index].rGBTransferFunction = vtkColorTransferFunction.newInstance();\n model.componentData[index].rGBTransferFunction.addRGBPoint(0, 0.0, 0.0, 0.0);\n model.componentData[index].rGBTransferFunction.addRGBPoint(1024, 1.0, 1.0, 1.0);\n\n if (model.componentData[index].colorChannels !== 3) {\n model.componentData[index].colorChannels = 3;\n }\n\n publicAPI.modified();\n }\n\n return model.componentData[index].rGBTransferFunction;\n }; // Set the scalar opacity of a volume to a transfer function\n\n\n publicAPI.setScalarOpacity = function (index, func) {\n if (model.componentData[index].scalarOpacity !== func) {\n model.componentData[index].scalarOpacity = func;\n publicAPI.modified();\n return true;\n }\n\n return false;\n }; // Get the scalar opacity transfer function. Create one if none set.\n\n\n publicAPI.getScalarOpacity = function (index) {\n if (model.componentData[index].scalarOpacity === null) {\n model.componentData[index].scalarOpacity = vtkPiecewiseFunction.newInstance();\n model.componentData[index].scalarOpacity.addPoint(0, 1.0);\n model.componentData[index].scalarOpacity.addPoint(1024, 1.0);\n publicAPI.modified();\n }\n\n return model.componentData[index].scalarOpacity;\n };\n\n publicAPI.setComponentWeight = function (index, value) {\n if (index < 0 || index >= VTK_MAX_VRCOMP) {\n vtkErrorMacro('Invalid index');\n return false;\n }\n\n var val = Math.min(1, Math.max(0, value));\n\n if (model.componentData[index].componentWeight !== val) {\n model.componentData[index].componentWeight = val;\n publicAPI.modified();\n return true;\n }\n\n return false;\n };\n\n publicAPI.getComponentWeight = function (index) {\n if (index < 0 || index >= VTK_MAX_VRCOMP) {\n vtkErrorMacro('Invalid index');\n return 0.0;\n }\n\n return model.componentData[index].componentWeight;\n };\n\n publicAPI.setInterpolationTypeToNearest = function () {\n return publicAPI.setInterpolationType(InterpolationType.NEAREST);\n };\n\n publicAPI.setInterpolationTypeToLinear = function () {\n return publicAPI.setInterpolationType(InterpolationType.LINEAR);\n };\n\n publicAPI.setInterpolationTypeToFastLinear = function () {\n return publicAPI.setInterpolationType(InterpolationType.FAST_LINEAR);\n };\n\n publicAPI.getInterpolationTypeAsString = function () {\n return macro.enumToString(InterpolationType, model.interpolationType);\n };\n\n var sets = ['useGradientOpacity', 'scalarOpacityUnitDistance', 'gradientOpacityMinimumValue', 'gradientOpacityMinimumOpacity', 'gradientOpacityMaximumValue', 'gradientOpacityMaximumOpacity', 'opacityMode'];\n sets.forEach(function (val) {\n var cap = macro.capitalize(val);\n\n publicAPI[\"set\".concat(cap)] = function (index, value) {\n if (model.componentData[index][\"\".concat(val)] !== value) {\n model.componentData[index][\"\".concat(val)] = value;\n publicAPI.modified();\n return true;\n }\n\n return false;\n };\n });\n var gets = ['useGradientOpacity', 'scalarOpacityUnitDistance', 'gradientOpacityMinimumValue', 'gradientOpacityMinimumOpacity', 'gradientOpacityMaximumValue', 'gradientOpacityMaximumOpacity', 'opacityMode'];\n gets.forEach(function (val) {\n var cap = macro.capitalize(val);\n\n publicAPI[\"get\".concat(cap)] = function (index) {\n return model.componentData[index][\"\".concat(val)];\n };\n });\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n independentComponents: true,\n interpolationType: InterpolationType.FAST_LINEAR,\n shade: false,\n ambient: 0.1,\n diffuse: 0.7,\n specular: 0.2,\n specularPower: 10.0,\n useLabelOutline: false,\n labelOutlineThickness: 1,\n labelOutlineOpacity: 1.0\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Build VTK API\n\n macro.obj(publicAPI, model);\n\n if (!model.componentData) {\n model.componentData = [];\n\n for (var i = 0; i < VTK_MAX_VRCOMP; ++i) {\n model.componentData.push({\n colorChannels: 1,\n grayTransferFunction: null,\n rGBTransferFunction: null,\n scalarOpacity: null,\n scalarOpacityUnitDistance: 1.0,\n opacityMode: OpacityMode.FRACTIONAL,\n gradientOpacityMinimumValue: 0,\n gradientOpacityMinimumOpacity: 0.0,\n gradientOpacityMaximumValue: 1.0,\n gradientOpacityMaximumOpacity: 1.0,\n useGradientOpacity: false,\n componentWeight: 1.0\n });\n }\n }\n\n macro.setGet(publicAPI, model, ['independentComponents', 'interpolationType', 'shade', 'ambient', 'diffuse', 'specular', 'specularPower', 'useLabelOutline', 'labelOutlineThickness', 'labelOutlineOpacity']); // Object methods\n\n vtkVolumeProperty(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkVolumeProperty'); // ----------------------------------------------------------------------------\n\nvar vtkVolumeProperty$1 = _objectSpread({\n newInstance: newInstance,\n extend: extend\n}, Constants);\n\nexport { vtkVolumeProperty$1 as default, extend, newInstance };\n","import { mat4, vec3 } from 'gl-matrix';\nimport macro from '../../macros.js';\nimport vtkBoundingBox from '../../Common/DataModel/BoundingBox.js';\nimport vtkProp3D from './Prop3D.js';\nimport vtkVolumeProperty from './VolumeProperty.js';\n\nvar vtkDebugMacro = macro.vtkDebugMacro; // ----------------------------------------------------------------------------\n// vtkVolume methods\n// ----------------------------------------------------------------------------\n\nfunction vtkVolume(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkVolume');\n\n publicAPI.getVolumes = function () {\n return publicAPI;\n };\n\n publicAPI.makeProperty = vtkVolumeProperty.newInstance;\n\n publicAPI.getProperty = function () {\n if (model.property === null) {\n model.property = publicAPI.makeProperty();\n }\n\n return model.property;\n };\n\n publicAPI.getBounds = function () {\n if (model.mapper === null) {\n return model.bounds;\n } // Check for the special case when the mapper's bounds are unknown\n\n\n var bds = model.mapper.getBounds();\n\n if (!bds || bds.length !== 6) {\n return bds;\n } // Check for the special case when the actor is empty.\n\n\n if (bds[0] > bds[1]) {\n model.mapperBounds = bds.concat(); // copy the mapper's bounds\n\n model.bounds = [1, -1, 1, -1, 1, -1];\n model.boundsMTime.modified();\n return bds;\n } // Check if we have cached values for these bounds - we cache the\n // values returned by model.mapper.getBounds() and we store the time\n // of caching. If the values returned this time are different, or\n // the modified time of this class is newer than the cached time,\n // then we need to rebuild.\n\n\n var zip = function zip(rows) {\n return rows[0].map(function (_, c) {\n return rows.map(function (row) {\n return row[c];\n });\n });\n };\n\n if (!model.mapperBounds || !zip([bds, model.mapperBounds]).reduce(function (a, b) {\n return a && b[0] === b[1];\n }, true) || publicAPI.getMTime() > model.boundsMTime.getMTime()) {\n vtkDebugMacro('Recomputing bounds...');\n model.mapperBounds = bds.map(function (x) {\n return x;\n });\n var bbox = [];\n vtkBoundingBox.getCorners(bds, bbox);\n publicAPI.computeMatrix();\n var tmp4 = new Float64Array(16);\n mat4.transpose(tmp4, model.matrix);\n bbox.forEach(function (pt) {\n return vec3.transformMat4(pt, pt, tmp4);\n });\n /* eslint-disable no-multi-assign */\n\n model.bounds[0] = model.bounds[2] = model.bounds[4] = Number.MAX_VALUE;\n model.bounds[1] = model.bounds[3] = model.bounds[5] = -Number.MAX_VALUE;\n /* eslint-enable no-multi-assign */\n\n model.bounds = model.bounds.map(function (d, i) {\n return i % 2 === 0 ? bbox.reduce(function (a, b) {\n return a > b[i / 2] ? b[i / 2] : a;\n }, d) : bbox.reduce(function (a, b) {\n return a < b[(i - 1) / 2] ? b[(i - 1) / 2] : a;\n }, d);\n });\n model.boundsMTime.modified();\n }\n\n return model.bounds;\n };\n\n publicAPI.getMTime = function () {\n var mt = model.mtime;\n\n if (model.property !== null) {\n var time = model.property.getMTime();\n mt = time > mt ? time : mt;\n }\n\n return mt;\n };\n\n publicAPI.getRedrawMTime = function () {\n var mt = model.mtime;\n\n if (model.mapper !== null) {\n var time = model.mapper.getMTime();\n mt = time > mt ? time : mt;\n\n if (model.mapper.getInput() !== null) {\n // FIXME !!! getInputAlgorithm / getInput\n model.mapper.getInputAlgorithm().update();\n time = model.mapper.getInput().getMTime();\n mt = time > mt ? time : mt;\n }\n }\n\n return mt;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n mapper: null,\n property: null,\n bounds: [1, -1, 1, -1, 1, -1]\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkProp3D.extend(publicAPI, model, initialValues); // vtkTimeStamp\n\n model.boundsMTime = {};\n macro.obj(model.boundsMTime); // Build VTK API\n\n macro.set(publicAPI, model, ['property']);\n macro.setGet(publicAPI, model, ['mapper']);\n macro.getArray(publicAPI, model, ['bounds'], 6); // Object methods\n\n vtkVolume(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkVolume'); // ----------------------------------------------------------------------------\n\nvar vtkVolume$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkVolume$1 as default, extend, newInstance };\n","import { vtkSharedVolumeMapper } from '../vtkClasses';\nimport { getConfiguration } from '../../init';\n/**\n * Given an imageData and a vtkOpenGLTexture, it creates a \"shared\" vtk volume mapper\n * from which various volume actors can be created.\n *\n * @param imageData - the vtkImageData object that contains the data to\n * render.\n * @param vtkOpenGLTexture - The vtkOpenGLTexture that will be used to render\n * the volume.\n * @returns The volume mapper.\n */\nexport default function createVolumeMapper(\n imageData: any,\n vtkOpenGLTexture: any\n): any {\n const volumeMapper = vtkSharedVolumeMapper.newInstance();\n\n if (getConfiguration().rendering.preferSizeOverAccuracy) {\n volumeMapper.setPreferSizeOverAccuracy(true);\n }\n\n volumeMapper.setInputData(imageData);\n\n const spacing = imageData.getSpacing();\n // Set the sample distance to half the mean length of one side. This is where the divide by 6 comes from.\n // https://github.com/Kitware/VTK/blob/6b559c65bb90614fb02eb6d1b9e3f0fca3fe4b0b/Rendering/VolumeOpenGL2/vtkSmartVolumeMapper.cxx#L344\n const sampleDistance = (spacing[0] + spacing[1] + spacing[2]) / 6;\n\n // This is to allow for good pixel level image quality.\n // Todo: why we are setting this to 4000? Is this a good number? it should be configurable\n volumeMapper.setMaximumSamplesPerRay(4000);\n volumeMapper.setSampleDistance(sampleDistance);\n volumeMapper.setScalarTexture(vtkOpenGLTexture);\n\n return volumeMapper;\n}\n","import {\n VolumeActor,\n IImageVolume,\n VOIRange,\n ScalingParameters,\n} from '../../types';\nimport { loadAndCacheImage } from '../../loaders/imageLoader';\nimport * as metaData from '../../metaData';\nimport { getMinMax, windowLevel } from '../../utilities';\nimport { RequestType } from '../../enums';\n\nconst PRIORITY = 0;\nconst REQUEST_TYPE = RequestType.Prefetch;\n\n/**\n * It sets the default window level of an image volume based on the VOI.\n * It first look for the VOI in the metadata and if it is not found, it\n * loads the middle slice image (middle imageId) and based on its min\n * and max pixel values, it calculates the VOI.\n * Finally it sets the VOI on the volumeActor transferFunction\n * @param volumeActor - The volume actor\n * @param imageVolume - The image volume that we want to set the VOI for.\n */\nasync function setDefaultVolumeVOI(\n volumeActor: VolumeActor,\n imageVolume: IImageVolume,\n use16BitTexture: boolean\n): Promise {\n let voi = getVOIFromMetadata(imageVolume);\n\n if (!voi) {\n voi = await getVOIFromMinMax(imageVolume, use16BitTexture);\n }\n\n if (!voi || voi.lower === undefined || voi.upper === undefined) {\n throw new Error(\n 'Could not get VOI from metadata, nor from the min max of the image middle slice'\n );\n }\n\n voi = handlePreScaledVolume(imageVolume, voi);\n const { lower, upper } = voi;\n\n volumeActor\n .getProperty()\n .getRGBTransferFunction(0)\n .setMappingRange(lower, upper);\n}\n\nfunction handlePreScaledVolume(imageVolume: IImageVolume, voi: VOIRange) {\n const imageIds = imageVolume.imageIds;\n const imageIdIndex = Math.floor(imageIds.length / 2);\n const imageId = imageIds[imageIdIndex];\n\n const generalSeriesModule =\n metaData.get('generalSeriesModule', imageId) || {};\n\n /**\n * If the volume is prescaled and the modality is PT Sometimes you get super high\n * values at the peak and it skews the min/max so nothing useful is displayed\n * Therefore, we follow the majority of other viewers and we set the min/max\n * for the scaled PT to be 0, 5\n */\n if (_isCurrentImagePTPrescaled(generalSeriesModule.modality, imageVolume)) {\n return {\n lower: 0,\n upper: 5,\n };\n }\n\n return voi;\n}\n\n/**\n * Get the VOI from the metadata of the middle slice of the image volume. It checks\n * the metadata for the VOI and if it is not found, it returns null\n *\n * @param imageVolume - The image volume that we want to get the VOI from.\n * @returns VOIRange with lower and upper values\n */\nfunction getVOIFromMetadata(imageVolume: IImageVolume): VOIRange {\n const { imageIds } = imageVolume;\n\n const imageIdIndex = Math.floor(imageIds.length / 2);\n const imageId = imageIds[imageIdIndex];\n\n const voiLutModule = metaData.get('voiLutModule', imageId);\n\n if (voiLutModule && voiLutModule.windowWidth && voiLutModule.windowCenter) {\n const { windowWidth, windowCenter } = voiLutModule;\n\n const voi = {\n windowWidth: Array.isArray(windowWidth) ? windowWidth[0] : windowWidth,\n windowCenter: Array.isArray(windowCenter)\n ? windowCenter[0]\n : windowCenter,\n };\n\n const { lower, upper } = windowLevel.toLowHighRange(\n Number(voi.windowWidth),\n Number(voi.windowCenter)\n );\n\n return {\n lower,\n upper,\n };\n }\n}\n\n/**\n * It loads the middle slice image (middle imageId) and based on its min\n * and max pixel values, it calculates the VOI.\n *\n * @param imageVolume - The image volume that we want to get the VOI from.\n * @returns The VOIRange with lower and upper values\n */\nasync function getVOIFromMinMax(\n imageVolume: IImageVolume,\n use16BitTexture: boolean\n): Promise {\n const { imageIds } = imageVolume;\n const scalarData = imageVolume.getScalarData();\n\n // Get the middle image from the list of imageIds\n const imageIdIndex = Math.floor(imageIds.length / 2);\n const imageId = imageVolume.imageIds[imageIdIndex];\n const generalSeriesModule =\n metaData.get('generalSeriesModule', imageId) || {};\n const { modality } = generalSeriesModule;\n const modalityLutModule = metaData.get('modalityLutModule', imageId) || {};\n\n const numImages = imageIds.length;\n const bytesPerImage = scalarData.byteLength / numImages;\n const voxelsPerImage = scalarData.length / numImages;\n const bytePerPixel = scalarData.BYTES_PER_ELEMENT;\n\n const scalingParameters: ScalingParameters = {\n rescaleSlope: modalityLutModule.rescaleSlope,\n rescaleIntercept: modalityLutModule.rescaleIntercept,\n modality,\n };\n\n let scalingParametersToUse;\n if (modality === 'PT') {\n const suvFactor = metaData.get('scalingModule', imageId);\n\n if (suvFactor) {\n scalingParametersToUse = {\n ...scalingParameters,\n suvbw: suvFactor.suvbw,\n };\n }\n }\n\n const byteOffset = imageIdIndex * bytesPerImage;\n\n const options = {\n targetBuffer: {\n type: use16BitTexture ? undefined : 'Float32Array',\n },\n priority: PRIORITY,\n requestType: REQUEST_TYPE,\n preScale: {\n enabled: true,\n scalingParameters: scalingParametersToUse,\n },\n };\n\n // Loading the middle slice image for a volume has two scenarios, the first one is that\n // uses the same volumeLoader which might not resolve to an image (since for performance\n // reasons volumes' pixelData is set via offset and length on the volume arrayBuffer\n // when each slice is loaded). The second scenario is that the image might not reach\n // to the volumeLoader, and an already cached image (with Image object) is used\n // instead. For the first scenario, we use the arrayBuffer of the volume to get the correct\n // slice for the imageScalarData, and for the second scenario we use the getPixelData\n // on the Cornerstone IImage object to get the pixel data.\n const image = await loadAndCacheImage(imageId, options);\n\n let imageScalarData;\n if (!image) {\n imageScalarData = _getImageScalarDataFromImageVolume(\n imageVolume,\n byteOffset,\n bytePerPixel,\n voxelsPerImage\n );\n } else {\n imageScalarData = image.getPixelData();\n }\n\n // Get the min and max pixel values of the middle slice\n const { min, max } = getMinMax(imageScalarData);\n\n return {\n lower: min,\n upper: max,\n };\n}\n\nfunction _getImageScalarDataFromImageVolume(\n imageVolume,\n byteOffset,\n bytePerPixel,\n voxelsPerImage\n) {\n const { scalarData } = imageVolume;\n const { volumeBuffer } = scalarData;\n if (scalarData.BYTES_PER_ELEMENT !== bytePerPixel) {\n byteOffset *= scalarData.BYTES_PER_ELEMENT / bytePerPixel;\n }\n\n const TypedArray = scalarData.constructor;\n const imageScalarData = new TypedArray(voxelsPerImage);\n\n const volumeBufferView = new TypedArray(\n volumeBuffer,\n byteOffset,\n voxelsPerImage\n );\n\n imageScalarData.set(volumeBufferView);\n\n return imageScalarData;\n}\n\nfunction _isCurrentImagePTPrescaled(modality, imageVolume) {\n if (modality !== 'PT' || !imageVolume.isPreScaled) {\n return false;\n }\n\n if (!imageVolume.scaling?.PT.suvbw) {\n return false;\n }\n\n return true;\n}\n\nexport default setDefaultVolumeVOI;\n","import vtkVolume from '@kitware/vtk.js/Rendering/Core/Volume';\n\nimport { VolumeActor } from './../../types/IActor';\nimport { VoiModifiedEventDetail } from './../../types/EventTypes';\nimport { loadVolume } from '../../loaders/volumeLoader';\nimport createVolumeMapper from './createVolumeMapper';\nimport BlendModes from '../../enums/BlendModes';\nimport { triggerEvent } from '../../utilities';\nimport { Events } from '../../enums';\nimport setDefaultVolumeVOI from './setDefaultVolumeVOI';\n\ninterface createVolumeActorInterface {\n volumeId: string;\n callback?: ({\n volumeActor,\n volumeId,\n }: {\n volumeActor: VolumeActor;\n volumeId: string;\n }) => void;\n blendMode?: BlendModes;\n}\n\n/**\n * Given a volumeId, it creates a vtk volume actor and returns it. If\n * callback is provided, it will be called with the volume actor and the\n * volumeId. If blendMode is provided, it will be set on the volume actor.\n *\n * @param props - createVolumeActorInterface\n * @returns A promise that resolves to a VolumeActor.\n */\nasync function createVolumeActor(\n props: createVolumeActorInterface,\n element: HTMLDivElement,\n viewportId: string,\n suppressEvents = false,\n use16BitTexture = false\n): Promise {\n const { volumeId, callback, blendMode } = props;\n\n const imageVolume = await loadVolume(volumeId);\n\n if (!imageVolume) {\n throw new Error(\n `imageVolume with id: ${imageVolume.volumeId} does not exist`\n );\n }\n\n const { imageData, vtkOpenGLTexture } = imageVolume;\n\n const volumeMapper = createVolumeMapper(imageData, vtkOpenGLTexture);\n\n if (blendMode) {\n volumeMapper.setBlendMode(blendMode);\n }\n\n const volumeActor = vtkVolume.newInstance();\n volumeActor.setMapper(volumeMapper);\n\n const numberOfComponents = imageData\n .getPointData()\n .getScalars()\n .getNumberOfComponents();\n\n if (numberOfComponents === 3) {\n volumeActor.getProperty().setIndependentComponents(false);\n }\n\n // If the volume is composed of imageIds, we can apply a default VOI based\n // on either the metadata or the min/max of the middle slice. Example of other\n // types of volumes which might not be composed of imageIds would be e.g., nrrd, nifti\n // format volumes\n if (imageVolume.imageIds) {\n await setDefaultVolumeVOI(volumeActor, imageVolume, use16BitTexture);\n }\n\n if (callback) {\n callback({ volumeActor, volumeId });\n }\n\n if (!suppressEvents) {\n triggerVOIModified(element, viewportId, volumeActor, volumeId);\n }\n\n return volumeActor;\n}\n\nfunction triggerVOIModified(\n element: HTMLDivElement,\n viewportId: string,\n volumeActor: VolumeActor,\n volumeId: string\n) {\n const voiRange = volumeActor\n .getProperty()\n .getRGBTransferFunction(0)\n .getRange();\n\n const voiModifiedEventDetail: VoiModifiedEventDetail = {\n viewportId,\n range: {\n lower: voiRange[0],\n upper: voiRange[1],\n },\n volumeId,\n };\n\n triggerEvent(element, Events.VOI_MODIFIED, voiModifiedEventDetail);\n}\n\nexport default createVolumeActor;\n","import BaseVolumeViewport from '../BaseVolumeViewport';\nimport type {\n IVolumeInput,\n IRenderingEngine,\n IVolumeViewport,\n} from '../../types';\n\n/**\n * Similar to {@link addVolumesToViewports} it adds volumes to viewports; however,\n * this method will Set the volumes on the viewports which means that the previous\n * volumes will be removed.\n *\n * @param renderingEngine - The rendering engine to use to get viewports from\n * @param volumeInputs - Array of volume inputs including volumeId. Other properties\n * such as visibility, callback, blendMode, slabThickness are optional\n * @param viewportIds - Array of viewport IDs to add the volume to\n * @param immediateRender - If true, the volumes will be rendered immediately\n * @returns A promise that resolves when all volumes have been added\n */\nasync function setVolumesForViewports(\n renderingEngine: IRenderingEngine,\n volumeInputs: Array,\n viewportIds: Array,\n immediateRender = false,\n suppressEvents = false\n): Promise {\n // Check if all viewports are volumeViewports\n viewportIds.forEach((viewportId) => {\n const viewport = renderingEngine.getViewport(viewportId);\n\n if (!viewport) {\n throw new Error(`Viewport with Id ${viewportId} does not exist`);\n }\n\n // if not instance of BaseVolumeViewport, throw\n if (!(viewport instanceof BaseVolumeViewport)) {\n throw new Error(\n 'setVolumesForViewports only supports VolumeViewport and VolumeViewport3D'\n );\n }\n });\n\n const setVolumePromises = viewportIds.map(async (viewportId) => {\n const viewport = renderingEngine.getViewport(viewportId) as IVolumeViewport;\n\n await viewport.setVolumes(volumeInputs, immediateRender, suppressEvents);\n });\n\n await Promise.all(setVolumePromises);\n\n return;\n}\n\nexport default setVolumesForViewports;\n","import { VolumeViewport } from '../';\nimport BaseVolumeViewport from '../BaseVolumeViewport';\nimport type { IVolumeInput, IRenderingEngine } from '../../types';\n\n/**\n * For each provided viewport it adds a volume to the viewport using the\n * provided renderingEngine\n *\n *\n * @param renderingEngine - The rendering engine to use to get viewports from\n * @param volumeInputs - Array of volume inputs including volumeId. Other properties\n * such as visibility, callback, blendMode, slabThickness are optional\n * @param viewportIds - Array of viewport IDs to add the volume to\n * @param immediateRender - If true, the volumes will be rendered immediately\n * @returns A promise that resolves when all volumes have been added\n */\nasync function addVolumesToViewports(\n renderingEngine: IRenderingEngine,\n volumeInputs: Array,\n viewportIds: Array,\n immediateRender = false,\n suppressEvents = false\n): Promise {\n // Check if all viewports are volumeViewports\n for (const viewportId of viewportIds) {\n const viewport = renderingEngine.getViewport(viewportId);\n\n if (!viewport) {\n throw new Error(`Viewport with Id ${viewportId} does not exist`);\n }\n\n // if not instance of BaseVolumeViewport, throw\n if (!(viewport instanceof BaseVolumeViewport)) {\n console.warn(\n `Viewport with Id ${viewportId} is not a BaseVolumeViewport. Cannot add volume to this viewport.`\n );\n\n return;\n }\n }\n\n const addVolumePromises = viewportIds.map(async (viewportId) => {\n const viewport = renderingEngine.getViewport(viewportId) as VolumeViewport;\n\n await viewport.addVolumes(volumeInputs, immediateRender, suppressEvents);\n });\n\n await Promise.all(addVolumePromises);\n return;\n}\n\nexport default addVolumesToViewports;\n","import {\n getImageSliceDataForVolumeViewport,\n triggerEvent,\n} from '../../utilities';\nimport { EventTypes } from '../../types';\nimport { Events } from '../../enums';\nimport { getRenderingEngine } from '../getRenderingEngine';\nimport BaseVolumeViewport from '../BaseVolumeViewport';\n\n// Keeping track of previous imageIndex for each viewportId\ntype VolumeImageState = Record;\n\nconst state: VolumeImageState = {};\n\nexport function resetVolumeNewImageState(viewportId: string): void {\n if (state[viewportId] !== undefined) {\n delete state[viewportId];\n }\n}\n\n/**\n * It captures the camera modified event and with the camera focal point and viewPlaneNomad\n * it calculates the image index in the view direction. Finally it triggers\n * a VOLUME_NEW_IMAGE event with the image index.\n *\n * @internal\n *\n * @param cameraEvent - The camera modified event\n * @param viewportImageData - The image data of the viewport\n */\nfunction volumeNewImageEventDispatcher(\n cameraEvent: EventTypes.CameraModifiedEvent\n): void {\n const { renderingEngineId, viewportId } = cameraEvent.detail;\n const renderingEngine = getRenderingEngine(renderingEngineId);\n const viewport = renderingEngine.getViewport(viewportId);\n\n if (!(viewport instanceof BaseVolumeViewport)) {\n throw new Error(\n `volumeNewImageEventDispatcher: viewport is not a BaseVolumeViewport`\n );\n }\n\n if (state[viewport.id] === undefined) {\n state[viewport.id] = 0;\n }\n\n const sliceData = getImageSliceDataForVolumeViewport(viewport);\n\n if (!sliceData) {\n console.warn(\n `volumeNewImageEventDispatcher: sliceData is undefined for viewport ${viewport.id}`\n );\n return;\n }\n\n const { numberOfSlices, imageIndex } = sliceData;\n\n if (state[viewport.id] === imageIndex) {\n return;\n }\n\n state[viewport.id] = imageIndex;\n\n const eventDetail: EventTypes.VolumeNewImageEventDetail = {\n imageIndex,\n viewportId,\n renderingEngineId,\n numberOfSlices,\n };\n\n triggerEvent(viewport.element, Events.VOLUME_NEW_IMAGE, eventDetail);\n}\n\nexport default volumeNewImageEventDispatcher;\n","import type { vtkCamera } from '@kitware/vtk.js/Rendering/Core/Camera';\nimport vtkMatrixBuilder from '@kitware/vtk.js/Common/Core/MatrixBuilder';\nimport vtkMath from '@kitware/vtk.js/Common/Core/Math';\nimport vtkPlane from '@kitware/vtk.js/Common/DataModel/Plane';\n\nimport { vec2, vec3 } from 'gl-matrix';\nimport _cloneDeep from 'lodash.clonedeep';\n\nimport Events from '../enums/Events';\nimport ViewportStatus from '../enums/ViewportStatus';\nimport ViewportType from '../enums/ViewportType';\nimport renderingEngineCache from './renderingEngineCache';\nimport { triggerEvent, planar, isImageActor, actorIsA } from '../utilities';\nimport hasNaNValues from '../utilities/hasNaNValues';\nimport { RENDERING_DEFAULTS } from '../constants';\nimport type {\n ICamera,\n ActorEntry,\n IRenderingEngine,\n ViewportInputOptions,\n Point2,\n Point3,\n FlipDirection,\n EventTypes,\n DisplayArea,\n} from '../types';\nimport type { ViewportInput, IViewport } from '../types/IViewport';\nimport type { vtkSlabCamera } from './vtkClasses/vtkSlabCamera';\nimport { getConfiguration } from '../init';\nimport IImageCalibration from '../types/IImageCalibration';\n\n/**\n * An object representing a single viewport, which is a camera\n * looking into a viewport, and an associated target output `HTMLDivElement`.\n * Viewport is a base class that can be extended to create a specific\n * viewport type. Both VolumeViewport and StackViewport are subclasses\n * of Viewport. Common logic for all viewports is contained in Viewport class\n * which is camera properties/methods, vtk.js actors, and other common\n * logic.\n */\nclass Viewport implements IViewport {\n /** unique identifier for the viewport */\n readonly id: string;\n /** HTML element in DOM that is used for rendering the viewport */\n readonly element: HTMLDivElement;\n /** an internal canvas that is created on the provided HTML element */\n readonly canvas: HTMLCanvasElement;\n /** RenderingEngine id that the viewport belongs to */\n readonly renderingEngineId: string;\n /** Type of viewport */\n readonly type: ViewportType;\n protected flipHorizontal = false;\n protected flipVertical = false;\n public isDisabled: boolean;\n /** Record the renddering status, mostly for testing purposes, but can also\n * be useful for knowing things like whether the viewport is initialized\n */\n public viewportStatus: ViewportStatus = ViewportStatus.NO_DATA;\n\n /** sx of viewport on the offscreen canvas */\n sx: number;\n /** sy of viewport on the offscreen canvas */\n sy: number;\n /** sWidth of viewport on the offscreen canvas */\n sWidth: number;\n /** sHeight of viewport on the offscreen canvas */\n sHeight: number;\n /** a Map containing the actor uid and actors */\n _actors: Map;\n /** Default options for the viewport which includes orientation, viewPlaneNormal and backgroundColor */\n readonly defaultOptions: any;\n /** options for the viewport which includes orientation axis, backgroundColor and displayArea */\n options: ViewportInputOptions;\n private _suppressCameraModifiedEvents = false;\n /** A flag representing if viewport methods should fire events or not */\n readonly suppressEvents: boolean;\n protected hasPixelSpacing = true;\n protected calibration: IImageCalibration;\n /** The camera that is initially defined on the reset for\n * the relative pan/zoom\n */\n protected initialCamera: ICamera;\n /** The camera that is defined for resetting displayArea to ensure absolute displayArea\n * settings\n */\n private fitToCanvasCamera: ICamera;\n\n constructor(props: ViewportInput) {\n this.id = props.id;\n this.renderingEngineId = props.renderingEngineId;\n this.type = props.type;\n this.element = props.element;\n this.canvas = props.canvas;\n this.sx = props.sx;\n this.sy = props.sy;\n this.sWidth = props.sWidth;\n this.sHeight = props.sHeight;\n this._actors = new Map();\n // Set data attributes for render events\n this.element.setAttribute('data-viewport-uid', this.id);\n this.element.setAttribute(\n 'data-rendering-engine-uid',\n this.renderingEngineId\n );\n\n this.defaultOptions = _cloneDeep(props.defaultOptions);\n this.suppressEvents = props.defaultOptions.suppressEvents\n ? props.defaultOptions.suppressEvents\n : false;\n this.options = _cloneDeep(props.defaultOptions);\n this.isDisabled = false;\n }\n\n getRotation: () => number;\n getFrameOfReferenceUID: () => string;\n canvasToWorld: (canvasPos: Point2) => Point3;\n worldToCanvas: (worldPos: Point3) => Point2;\n customRenderViewportToCanvas: () => unknown;\n resize: () => void;\n getProperties: () => void;\n updateRenderingPipeline: () => void;\n\n static get useCustomRenderingPipeline(): boolean {\n return false;\n }\n\n /**\n * Indicate that the image has been rendered.\n * This will set the viewportStatus to RENDERED if there is image data\n * available to actually be rendered - otherwise, the rendering simply showed\n * the background image.\n */\n public setRendered() {\n if (\n this.viewportStatus === ViewportStatus.NO_DATA ||\n this.viewportStatus === ViewportStatus.LOADING\n ) {\n return;\n }\n this.viewportStatus = ViewportStatus.RENDERED;\n }\n\n /**\n * Returns the rendering engine driving the `Viewport`.\n *\n * @returns The RenderingEngine instance.\n */\n public getRenderingEngine(): IRenderingEngine {\n return renderingEngineCache.get(this.renderingEngineId);\n }\n\n /**\n * Returns the `vtkRenderer` responsible for rendering the `Viewport`.\n *\n * @returns The `vtkRenderer` for the `Viewport`.\n */\n public getRenderer(): any {\n const renderingEngine = this.getRenderingEngine();\n\n if (!renderingEngine || renderingEngine.hasBeenDestroyed) {\n throw new Error('Rendering engine has been destroyed');\n }\n\n return renderingEngine.offscreenMultiRenderWindow.getRenderer(this.id);\n }\n\n /**\n * Renders the `Viewport` using the `RenderingEngine`.\n */\n public render(): void {\n const renderingEngine = this.getRenderingEngine();\n\n renderingEngine.renderViewport(this.id);\n }\n\n /**\n * Sets new options and (TODO) applies them.\n *\n * @param options - The viewport options to set.\n * @param immediate - If `true`, renders the viewport after the options are set.\n */\n public setOptions(options: ViewportInputOptions, immediate = false): void {\n this.options = _cloneDeep(options);\n\n // TODO When this is needed we need to move the camera position.\n // We can steal some logic from the tools we build to do this.\n if (this.options?.displayArea) {\n this.setDisplayArea(this.options?.displayArea);\n }\n if (immediate) {\n this.render();\n }\n }\n\n /**\n * Resets the options the `Viewport`'s `defaultOptions`\n *\n * @param immediate - If `true`, renders the viewport after the options are reset.\n */\n public reset(immediate = false) {\n this.options = _cloneDeep(this.defaultOptions);\n\n // TODO When this is needed we need to move the camera position.\n // We can steal some logic from the tools we build to do this.\n\n if (immediate) {\n this.render();\n }\n }\n\n /**\n * Flip the viewport on horizontal or vertical axis, this method\n * works with vtk-js backed rendering pipeline.\n *\n * @param flipOptions - Flip options specifying the axis of flip\n * @param flipOptions.flipHorizontal - Flip the viewport on horizontal axis\n * @param flipOptions.flipVertical - Flip the viewport on vertical axis\n */\n protected flip({ flipHorizontal, flipVertical }: FlipDirection): void {\n const imageData = this.getDefaultImageData();\n\n if (!imageData) {\n return;\n }\n\n const camera = this.getCamera();\n const { viewPlaneNormal, viewUp, focalPoint, position } = camera;\n\n const viewRight = vec3.cross(vec3.create(), viewPlaneNormal, viewUp);\n let viewUpToSet = vec3.copy(vec3.create(), viewUp);\n const viewPlaneNormalToSet = vec3.negate(vec3.create(), viewPlaneNormal);\n\n // for both flip horizontal and vertical we need to move the camera to the\n // other side of the image\n const distance = vec3.distance(position, focalPoint);\n\n // If the pan has been applied, we need to be able\n // apply the pan back\n const dimensions = imageData.getDimensions();\n const middleIJK = dimensions.map((d) => Math.floor(d / 2));\n\n const idx = [middleIJK[0], middleIJK[1], middleIJK[2]];\n const centeredFocalPoint = imageData.indexToWorld(idx, vec3.create());\n\n const resetFocalPoint = this._getFocalPointForResetCamera(\n centeredFocalPoint as Point3,\n camera,\n { resetPan: true, resetToCenter: false }\n );\n\n const panDir = vec3.subtract(vec3.create(), focalPoint, resetFocalPoint);\n const panValue = vec3.length(panDir);\n\n const getPanDir = (mirrorVec) => {\n const panDirMirror = vec3.scale(\n vec3.create(),\n mirrorVec,\n 2 * vec3.dot(panDir, mirrorVec)\n );\n vec3.subtract(panDirMirror, panDirMirror, panDir);\n vec3.normalize(panDirMirror, panDirMirror);\n\n return panDirMirror;\n };\n\n // Flipping horizontal mean that the camera should move\n // to the other side of the image but looking at the\n // same direction and same focal point\n if (flipHorizontal) {\n // we need to apply the pan value to the new focal point but in the direction\n // that is mirrored on the viewUp for the flip horizontal and\n // viewRight for the flip vertical\n\n // mirror the pan direction based on the viewUp\n const panDirMirror = getPanDir(viewUpToSet);\n\n // move focal point from the resetFocalPoint to the newFocalPoint\n // based on the panDirMirror and panValue\n const newFocalPoint = vec3.scaleAndAdd(\n vec3.create(),\n resetFocalPoint,\n panDirMirror,\n panValue\n );\n\n // move the camera position also the same way as the focal point\n const newPosition = vec3.scaleAndAdd(\n vec3.create(),\n newFocalPoint,\n viewPlaneNormalToSet,\n distance\n );\n\n this.setCamera({\n viewPlaneNormal: viewPlaneNormalToSet as Point3,\n position: newPosition as Point3,\n focalPoint: newFocalPoint as Point3,\n });\n\n this.flipHorizontal = !this.flipHorizontal;\n }\n\n // Flipping vertical mean that the camera should negate the view up\n // and also move to the other side of the image but looking at the\n if (flipVertical) {\n viewUpToSet = vec3.negate(viewUpToSet, viewUp);\n\n // we need to apply the pan value to the new focal point but in the direction\n const panDirMirror = getPanDir(viewRight);\n\n const newFocalPoint = vec3.scaleAndAdd(\n vec3.create(),\n resetFocalPoint,\n panDirMirror,\n panValue\n );\n\n const newPosition = vec3.scaleAndAdd(\n vec3.create(),\n newFocalPoint,\n viewPlaneNormalToSet,\n distance\n );\n\n this.setCamera({\n focalPoint: newFocalPoint as Point3,\n viewPlaneNormal: viewPlaneNormalToSet as Point3,\n viewUp: viewUpToSet as Point3,\n position: newPosition as Point3,\n });\n\n this.flipVertical = !this.flipVertical;\n }\n\n this.render();\n }\n\n private getDefaultImageData(): any {\n const actorEntry = this.getDefaultActor();\n\n if (actorEntry && isImageActor(actorEntry)) {\n return actorEntry.actor.getMapper().getInputData();\n }\n }\n\n /**\n * Get the default actor\n * @returns An actor entry.\n */\n public getDefaultActor(): ActorEntry {\n return this.getActors()[0];\n }\n\n /**\n * Get all the actors in the viewport\n * @returns An array of ActorEntry objects.\n */\n public getActors(): Array {\n return Array.from(this._actors.values());\n }\n\n /**\n * Get an actor by its UID\n * @param actorUID - The unique ID of the actor.\n * @returns An ActorEntry object.\n */\n public getActor(actorUID: string): ActorEntry {\n return this._actors.get(actorUID);\n }\n\n /**\n * Get an actor UID by its index\n * @param index - array index.\n * @returns actorUID\n */\n public getActorUIDByIndex(index: number): string {\n const actor = this.getActors()[index];\n if (actor) {\n return actor.uid;\n }\n }\n\n /**\n * Get an actor by its index\n * @param index - array index.\n * @returns actorUID\n */\n public getActorByIndex(index: number): ActorEntry {\n return this.getActors()[index];\n }\n\n /**\n * It removes all actors from the viewport and then adds the actors from the array.\n * @param actors - An array of ActorEntry objects.\n */\n public setActors(actors: Array): void {\n this.removeAllActors();\n const resetCameraPanAndZoom = true;\n // when we set the actor we need to reset the camera to initialize the\n // camera focal point with the bounds of the actors.\n this.addActors(actors, resetCameraPanAndZoom);\n }\n\n /**\n * Remove the actor from the viewport\n * @param actorUID - The unique identifier for the actor.\n */\n _removeActor(actorUID: string): void {\n const actorEntry = this.getActor(actorUID);\n if (!actorEntry) {\n console.warn(`Actor ${actorUID} does not exist for this viewport`);\n return;\n }\n const renderer = this.getRenderer();\n renderer.removeViewProp(actorEntry.actor); // removeActor not implemented in vtk?\n this._actors.delete(actorUID);\n }\n\n /**\n * Remove the actors with the given UIDs from the viewport\n * @param actorUIDs - An array of actor UIDs to remove.\n */\n public removeActors(actorUIDs: Array): void {\n actorUIDs.forEach((actorUID) => {\n this._removeActor(actorUID);\n });\n }\n\n /**\n * Add a list of actors (actor entries) to the viewport\n * @param resetCameraPanAndZoom - force reset pan and zoom of the camera,\n * default value is false.\n * @param actors - An array of ActorEntry objects.\n */\n public addActors(\n actors: Array,\n resetCameraPanAndZoom = false\n ): void {\n const renderingEngine = this.getRenderingEngine();\n if (!renderingEngine || renderingEngine.hasBeenDestroyed) {\n console.warn(\n 'Viewport::addActors::Rendering engine has not been initialized or has been destroyed'\n );\n return;\n }\n\n actors.forEach((actor) => this.addActor(actor));\n\n // set the clipping planes for the actors\n this.resetCamera(resetCameraPanAndZoom, resetCameraPanAndZoom);\n }\n\n /**\n * Add an actor to the viewport including its id, its actor and slabThickness\n * if defined\n * @param actorEntry - ActorEntry\n * @param actorEntry.uid - The unique identifier for the actor.\n * @param actorEntry.actor - The volume actor.\n * @param actorEntry.slabThickness - The slab thickness.\n */\n public addActor(actorEntry: ActorEntry): void {\n const { uid: actorUID, actor } = actorEntry;\n const renderingEngine = this.getRenderingEngine();\n\n if (!renderingEngine || renderingEngine.hasBeenDestroyed) {\n console.warn(\n `Cannot add actor UID of ${actorUID} Rendering Engine has been destroyed`\n );\n return;\n }\n\n if (!actorUID || !actor) {\n throw new Error('Actors should have uid and vtk Actor properties');\n }\n\n if (this.getActor(actorUID)) {\n console.warn(`Actor ${actorUID} already exists for this viewport`);\n return;\n }\n\n const renderer = this.getRenderer();\n renderer.addActor(actor);\n this._actors.set(actorUID, Object.assign({}, actorEntry));\n }\n\n /**\n * Remove all actors from the renderer\n */\n public removeAllActors(): void {\n this.getRenderer().removeAllViewProps();\n this._actors = new Map();\n return;\n }\n\n /**\n * Reset the camera to the default viewport camera without firing events\n */\n protected resetCameraNoEvent(): void {\n this._suppressCameraModifiedEvents = true;\n this.resetCamera();\n this._suppressCameraModifiedEvents = false;\n }\n\n /**\n * Sets the camera to the default viewport camera without firing events\n * @param camera - The camera to use for the viewport.\n */\n protected setCameraNoEvent(camera: ICamera): void {\n this._suppressCameraModifiedEvents = true;\n this.setCamera(camera);\n this._suppressCameraModifiedEvents = false;\n }\n\n /**\n * Calculates the intersections between the volume's boundaries and the viewplane.\n * 1) Determine the viewplane using the camera's ViewplaneNormal and focalPoint.\n * 2) Using volumeBounds, calculate the line equation for the 3D volume's 12 edges.\n * 3) Intersect each edge to the viewPlane and see whether the intersection point is inside the volume bounds.\n * 4) Return list of intersection points\n * It should be noted that intersection points may range from 3 to 6 points.\n * Orthogonal views have four points of intersection.\n *\n * @param imageData - vtkImageData\n * @param focalPoint - camera focal point\n * @param normal - view plane normal\n * @returns intersections list\n */\n private _getViewImageDataIntersections(imageData, focalPoint, normal) {\n // Viewplane equation: Ax+By+Cz=D\n const A = normal[0];\n const B = normal[1];\n const C = normal[2];\n const D = A * focalPoint[0] + B * focalPoint[1] + C * focalPoint[2];\n\n // Computing the edges of the 3D cube\n const bounds = imageData.getBounds();\n const edges = this._getEdges(bounds);\n\n const intersections = [];\n\n for (const edge of edges) {\n // start point: [x0, y0, z0], end point: [x1, y1, z1]\n const [[x0, y0, z0], [x1, y1, z1]] = edge;\n // Check if the edge is parallel to plane\n if (A * (x1 - x0) + B * (y1 - y0) + C * (z1 - z0) === 0) {\n continue;\n }\n const intersectionPoint = planar.linePlaneIntersection(\n [x0, y0, z0],\n [x1, y1, z1],\n [A, B, C, D]\n );\n\n if (this._isInBounds(intersectionPoint, bounds)) {\n intersections.push(intersectionPoint);\n }\n }\n\n return intersections;\n }\n\n /**\n * Sets the camera to an initial bounds. If\n * resetPan and resetZoom are true it places the focal point at the center of\n * the volume (or slice); otherwise, only the camera zoom and camera Pan or Zoom\n * is reset for the current view.\n * @param displayArea - The display area of interest.\n * @param suppressEvents - If true, don't fire displayArea event.\n */\n public setDisplayArea(\n displayArea: DisplayArea,\n suppressEvents = false\n ): void {\n const { storeAsInitialCamera } = displayArea;\n\n // make calculations relative to the fitToCanvasCamera view\n this.setCamera(this.fitToCanvasCamera, false);\n\n const { imageArea, imageCanvasPoint } = displayArea;\n\n if (imageArea) {\n const [areaX, areaY] = imageArea;\n const zoom = Math.min(this.getZoom() / areaX, this.getZoom() / areaY);\n this.setZoom(zoom, storeAsInitialCamera);\n }\n\n // getting the image info\n const imageData = this.getDefaultImageData();\n if (imageCanvasPoint && imageData) {\n const { imagePoint, canvasPoint } = imageCanvasPoint;\n const [canvasX, canvasY] = canvasPoint;\n const devicePixelRatio = window?.devicePixelRatio || 1;\n const validateCanvasPanX = this.sWidth / devicePixelRatio;\n const validateCanvasPanY = this.sHeight / devicePixelRatio;\n const canvasPanX = validateCanvasPanX * (canvasX - 0.5);\n const canvasPanY = validateCanvasPanY * (canvasY - 0.5);\n\n const dimensions = imageData.getDimensions();\n const canvasZero = this.worldToCanvas([0, 0, 0]);\n const canvasEdge = this.worldToCanvas(dimensions);\n const canvasImage = [\n canvasEdge[0] - canvasZero[0],\n canvasEdge[1] - canvasZero[1],\n ];\n const [imgWidth, imgHeight] = canvasImage;\n const [imageX, imageY] = imagePoint;\n const imagePanX = imgWidth * (0.5 - imageX);\n const imagePanY = imgHeight * (0.5 - imageY);\n\n const newPositionX = imagePanX + canvasPanX;\n const newPositionY = imagePanY + canvasPanY;\n\n const deltaPoint2: Point2 = [newPositionX, newPositionY];\n this.setPan(deltaPoint2, storeAsInitialCamera);\n }\n\n if (storeAsInitialCamera) {\n this.options.displayArea = displayArea;\n }\n\n if (!suppressEvents) {\n const eventDetail: EventTypes.DisplayAreaModifiedEventDetail = {\n viewportId: this.id,\n displayArea: displayArea,\n storeAsInitialCamera: storeAsInitialCamera,\n };\n\n triggerEvent(this.element, Events.DISPLAY_AREA_MODIFIED, eventDetail);\n }\n }\n\n public getDisplayArea(): DisplayArea | undefined {\n return this.options?.displayArea;\n }\n\n /**\n * Resets the camera based on the rendering volume(s) bounds. If\n * resetPan and resetZoom are true it places the focal point at the center of\n * the volume (or slice); otherwise, only the camera zoom and camera Pan or Zoom\n * is reset for the current view.\n * @param resetPan - If true, the camera focal point is reset to the center of the volume (slice)\n * @param resetZoom - If true, the camera zoom is reset to the default zoom\n * @param storeAsInitialCamera - If true, reset camera is stored as the initial camera (to allow differences to\n * be detected for pan/zoom values)\n * @returns boolean\n */\n public resetCamera(\n resetPan = true,\n resetZoom = true,\n resetToCenter = true,\n storeAsInitialCamera = true\n ): boolean {\n const renderer = this.getRenderer();\n\n // fix the flip right away, since we rely on the viewPlaneNormal and\n // viewUp for later. Basically, we need to flip back if flipHorizontal\n // is true or flipVertical is true\n this.setCamera({\n flipHorizontal: false,\n flipVertical: false,\n });\n\n const previousCamera = _cloneDeep(this.getCamera());\n const bounds = renderer.computeVisiblePropBounds();\n const focalPoint = [0, 0, 0];\n const imageData = this.getDefaultImageData();\n\n // Todo: remove this, this is just for tests passing\n if (imageData) {\n const spc = imageData.getSpacing();\n\n bounds[0] = bounds[0] + spc[0] / 2;\n bounds[1] = bounds[1] - spc[0] / 2;\n bounds[2] = bounds[2] + spc[1] / 2;\n bounds[3] = bounds[3] - spc[1] / 2;\n bounds[4] = bounds[4] + spc[2] / 2;\n bounds[5] = bounds[5] - spc[2] / 2;\n }\n\n const activeCamera = this.getVtkActiveCamera();\n const viewPlaneNormal = activeCamera.getViewPlaneNormal();\n const viewUp = activeCamera.getViewUp();\n\n // Reset the perspective zoom factors, otherwise subsequent zooms will cause\n // the view angle to become very small and cause bad depth sorting.\n // todo: parallel projection only\n\n focalPoint[0] = (bounds[0] + bounds[1]) / 2.0;\n focalPoint[1] = (bounds[2] + bounds[3]) / 2.0;\n focalPoint[2] = (bounds[4] + bounds[5]) / 2.0;\n\n if (imageData) {\n const dimensions = imageData.getDimensions();\n const middleIJK = dimensions.map((d) => Math.floor(d / 2));\n\n const idx = [middleIJK[0], middleIJK[1], middleIJK[2]];\n imageData.indexToWorld(idx, focalPoint);\n }\n\n const { widthWorld, heightWorld } =\n this._getWorldDistanceViewUpAndViewRight(bounds, viewUp, viewPlaneNormal);\n\n const canvasSize = [this.sWidth, this.sHeight];\n\n const boundsAspectRatio = widthWorld / heightWorld;\n const canvasAspectRatio = canvasSize[0] / canvasSize[1];\n\n let radius;\n\n if (boundsAspectRatio < canvasAspectRatio) {\n // can fit full height, so use it.\n radius = heightWorld / 2;\n } else {\n const scaleFactor = boundsAspectRatio / canvasAspectRatio;\n\n radius = (heightWorld * scaleFactor) / 2;\n }\n\n //const angle = vtkMath.radiansFromDegrees(activeCamera.getViewAngle())\n const parallelScale = 1.1 * radius;\n\n let w1 = bounds[1] - bounds[0];\n let w2 = bounds[3] - bounds[2];\n let w3 = bounds[5] - bounds[4];\n w1 *= w1;\n w2 *= w2;\n w3 *= w3;\n radius = w1 + w2 + w3;\n\n // If we have just a single point, pick a radius of 1.0\n radius = radius === 0 ? 1.0 : radius;\n\n // compute the radius of the enclosing sphere\n radius = Math.sqrt(radius) * 0.5;\n\n const distance = 1.1 * radius;\n\n const viewUpToSet: Point3 =\n Math.abs(vtkMath.dot(viewUp, viewPlaneNormal)) > 0.999\n ? [-viewUp[2], viewUp[0], viewUp[1]]\n : viewUp;\n\n const focalPointToSet = this._getFocalPointForResetCamera(\n focalPoint,\n previousCamera,\n { resetPan, resetToCenter }\n );\n\n const positionToSet: Point3 = [\n focalPointToSet[0] + distance * viewPlaneNormal[0],\n focalPointToSet[1] + distance * viewPlaneNormal[1],\n focalPointToSet[2] + distance * viewPlaneNormal[2],\n ];\n\n renderer.resetCameraClippingRange(bounds);\n\n const clippingRangeToUse: Point2 = [\n -RENDERING_DEFAULTS.MAXIMUM_RAY_DISTANCE,\n RENDERING_DEFAULTS.MAXIMUM_RAY_DISTANCE,\n ];\n\n activeCamera.setPhysicalScale(radius);\n activeCamera.setPhysicalTranslation(\n -focalPointToSet[0],\n -focalPointToSet[1],\n -focalPointToSet[2]\n );\n\n this.setCamera({\n parallelScale: resetZoom ? parallelScale : previousCamera.parallelScale,\n focalPoint: focalPointToSet,\n position: positionToSet,\n viewAngle: 90,\n viewUp: viewUpToSet,\n clippingRange: clippingRangeToUse,\n });\n\n const modifiedCamera = _cloneDeep(this.getCamera());\n\n this.setFitToCanvasCamera(_cloneDeep(this.getCamera()));\n\n if (storeAsInitialCamera) {\n this.setInitialCamera(modifiedCamera);\n }\n\n const RESET_CAMERA_EVENT = {\n type: 'ResetCameraEvent',\n renderer,\n };\n\n // Here to let parallel/distributed compositing intercept\n // and do the right thing.\n renderer.invokeEvent(RESET_CAMERA_EVENT);\n\n this.triggerCameraModifiedEventIfNecessary(previousCamera, modifiedCamera);\n\n if (\n imageData &&\n this.options?.displayArea &&\n resetZoom &&\n resetPan &&\n resetToCenter\n ) {\n this.setDisplayArea(this.options?.displayArea);\n }\n\n return true;\n }\n\n /**\n * Sets the provided camera as the initial camera.\n * This allows computing differences applied later as compared to the initial\n * position, for things like zoom and pan.\n * @param camera - to store as the initial value.\n */\n protected setInitialCamera(camera: ICamera): void {\n this.initialCamera = camera;\n }\n\n /**\n * Sets the provided camera as the displayArea camera.\n * This allows computing differences applied later as compared to the initial\n * position, for things like zoom and pan.\n * @param camera - to store as the initial value.\n */\n protected setFitToCanvasCamera(camera: ICamera): void {\n this.fitToCanvasCamera = camera;\n }\n\n /**\n * Helper function to return the current canvas pan value.\n *\n * @returns a Point2 containing the current pan values\n * on the canvas,\n * computed from the current camera, where the initial pan\n * value is [0,0].\n */\n public getPan(): Point2 {\n const activeCamera = this.getVtkActiveCamera();\n const focalPoint = activeCamera.getFocalPoint() as Point3;\n\n const zero3 = this.canvasToWorld([0, 0]);\n const initialCanvasFocal = this.worldToCanvas(\n vec3.subtract(vec3.create(), this.initialCamera.focalPoint, zero3)\n );\n const currentCanvasFocal = this.worldToCanvas(\n vec3.subtract(vec3.create(), focalPoint, zero3)\n );\n const result = (\n vec2.subtract(vec2.create(), initialCanvasFocal, currentCanvasFocal)\n );\n return result;\n }\n\n /**\n * Sets the canvas pan value relative to the initial view position of 0,0\n * Modifies the camera to perform the pan.\n */\n public setPan(pan: Point2, storeAsInitialCamera = false): void {\n const previousCamera = this.getCamera();\n const { focalPoint, position } = previousCamera;\n const zero3 = this.canvasToWorld([0, 0]);\n const delta2 = vec2.subtract(vec2.create(), pan, this.getPan());\n if (\n Math.abs(delta2[0]) < 1 &&\n Math.abs(delta2[1]) < 1 &&\n !storeAsInitialCamera\n ) {\n return;\n }\n const delta = vec3.subtract(\n vec3.create(),\n this.canvasToWorld(delta2),\n zero3\n );\n const newFocal = vec3.subtract(vec3.create(), focalPoint, delta);\n const newPosition = vec3.subtract(vec3.create(), position, delta);\n this.setCamera(\n {\n ...previousCamera,\n focalPoint: newFocal as Point3,\n position: newPosition as Point3,\n },\n storeAsInitialCamera\n );\n }\n\n /**\n * Returns a current zoom level relative to the initial parallel scale\n * originally applied to the image. That is, on initial display,\n * the zoom level is 1. Computed as a function of the camera.\n */\n public getZoom(): number {\n const activeCamera = this.getVtkActiveCamera();\n const { parallelScale: initialParallelScale } = this.initialCamera;\n return initialParallelScale / activeCamera.getParallelScale();\n }\n\n /** Zooms the image using parallel scale by updating the camera value.\n * @param value - The relative parallel scale to apply. It is relative\n * to the initial offsets value.\n * @param storeAsInitialCamera - can be set to true to reset the camera\n * after applying this zoom as the initial camera. A subsequent getZoom\n * call will return \"1\", but the zoom will have been applied.\n */\n public setZoom(value: number, storeAsInitialCamera = false): void {\n const camera = this.getCamera();\n const { parallelScale: initialParallelScale } = this.initialCamera;\n const parallelScale = initialParallelScale / value;\n if (camera.parallelScale === parallelScale && !storeAsInitialCamera) {\n return;\n }\n this.setCamera(\n {\n ...camera,\n parallelScale,\n },\n storeAsInitialCamera\n );\n }\n\n /**\n * Because the focalPoint is always in the centre of the viewport,\n * we must do planar computations if the frame (image \"slice\") is to be preserved.\n * 1. Calculate the intersection of the view plane with the imageData\n * which results in points of intersection (minimum of 3, maximum of 6)\n * 2. Calculate average of the intersection points to get newFocalPoint\n * 3. Set the new focalPoint\n * @param imageData - imageData\n * @returns focalPoint\n */\n private _getFocalPointForViewPlaneReset(imageData) {\n // Todo: move some where else\n const { focalPoint, viewPlaneNormal: normal } = this.getCamera();\n const intersections = this._getViewImageDataIntersections(\n imageData,\n focalPoint,\n normal\n );\n\n let x = 0;\n let y = 0;\n let z = 0;\n\n intersections.forEach(([point_x, point_y, point_z]) => {\n x += point_x;\n y += point_y;\n z += point_z;\n });\n\n const newFocalPoint = [\n x / intersections.length,\n y / intersections.length,\n z / intersections.length,\n ];\n // Set the focal point on the average of the intersection points\n return newFocalPoint;\n }\n\n /**\n * Gets the target output canvas for the `Viewport`.\n *\n * @returns an HTMLCanvasElement.\n */\n public getCanvas(): HTMLCanvasElement {\n return this.canvas;\n }\n /**\n * Gets the active vtkCamera for the viewport.\n *\n * @returns vtk driven camera\n */\n protected getVtkActiveCamera(): vtkCamera | vtkSlabCamera {\n const renderer = this.getRenderer();\n\n return renderer.getActiveCamera();\n }\n\n /**\n * Get the camera's current state\n * @returns The camera object.\n */\n public getCamera(): ICamera {\n const vtkCamera = this.getVtkActiveCamera();\n\n return {\n viewUp: vtkCamera.getViewUp(),\n viewPlaneNormal: vtkCamera.getViewPlaneNormal(),\n position: vtkCamera.getPosition(),\n focalPoint: vtkCamera.getFocalPoint(),\n parallelProjection: vtkCamera.getParallelProjection(),\n parallelScale: vtkCamera.getParallelScale(),\n viewAngle: vtkCamera.getViewAngle(),\n flipHorizontal: this.flipHorizontal,\n flipVertical: this.flipVertical,\n };\n }\n\n /**\n * Set the camera parameters\n * @param cameraInterface - ICamera\n * @param storeAsInitialCamera - to set the provided camera as the initial one,\n * used to compute differences for things like pan and zoom.\n */\n public setCamera(\n cameraInterface: ICamera,\n storeAsInitialCamera = false\n ): void {\n const vtkCamera = this.getVtkActiveCamera();\n const previousCamera = _cloneDeep(this.getCamera());\n const updatedCamera = Object.assign({}, previousCamera, cameraInterface);\n const {\n viewUp,\n viewPlaneNormal,\n position,\n focalPoint,\n parallelScale,\n viewAngle,\n flipHorizontal,\n flipVertical,\n clippingRange,\n } = cameraInterface;\n\n // Note: Flip camera should be two separate calls since\n // for flip, we need to flip the viewportNormal, and if\n // flipHorizontal, and flipVertical are both true, that would\n // the logic would be incorrect. So instead, we handle flip Horizontal\n // and flipVertical separately.\n if (flipHorizontal !== undefined) {\n // flip if not flipped but requested to flip OR if flipped but requested to\n // not flip\n const flipH =\n (flipHorizontal && !this.flipHorizontal) ||\n (!flipHorizontal && this.flipHorizontal);\n\n if (flipH) {\n this.flip({ flipHorizontal: flipH });\n }\n }\n\n if (flipVertical !== undefined) {\n const flipV =\n (flipVertical && !this.flipVertical) ||\n (!flipVertical && this.flipVertical);\n\n if (flipV) {\n this.flip({ flipVertical: flipV });\n }\n }\n\n if (viewUp !== undefined) {\n vtkCamera.setViewUp(viewUp);\n }\n\n if (viewPlaneNormal !== undefined) {\n vtkCamera.setDirectionOfProjection(\n -viewPlaneNormal[0],\n -viewPlaneNormal[1],\n -viewPlaneNormal[2]\n );\n }\n\n if (position !== undefined) {\n vtkCamera.setPosition(...position);\n }\n\n if (focalPoint !== undefined) {\n vtkCamera.setFocalPoint(...focalPoint);\n }\n\n if (parallelScale !== undefined) {\n vtkCamera.setParallelScale(parallelScale);\n }\n\n if (viewAngle !== undefined) {\n vtkCamera.setViewAngle(viewAngle);\n }\n\n if (clippingRange !== undefined) {\n vtkCamera.setClippingRange(clippingRange);\n }\n\n // update clippingPlanes if volume viewports\n const actorEntry = this.getDefaultActor();\n\n if (!actorEntry || !actorEntry.actor) {\n return;\n }\n\n const isImageSlice = actorIsA(actorEntry, 'vtkImageSlice');\n\n if (!isImageSlice) {\n this.updateClippingPlanesForActors(updatedCamera);\n } else {\n const renderer = this.getRenderer();\n renderer.resetCameraClippingRange();\n }\n\n if (storeAsInitialCamera) {\n this.setInitialCamera(updatedCamera);\n }\n\n this.triggerCameraModifiedEventIfNecessary(\n previousCamera,\n this.getCamera()\n );\n }\n\n /**\n * Trigger camera modified event\n * @param cameraInterface - ICamera\n * @param cameraInterface - ICamera\n */\n public triggerCameraModifiedEventIfNecessary(\n previousCamera: ICamera,\n updatedCamera: ICamera\n ): void {\n if (!this._suppressCameraModifiedEvents && !this.suppressEvents) {\n const eventDetail: EventTypes.CameraModifiedEventDetail = {\n previousCamera,\n camera: updatedCamera,\n element: this.element,\n viewportId: this.id,\n renderingEngineId: this.renderingEngineId,\n rotation: this.getRotation(),\n };\n\n triggerEvent(this.element, Events.CAMERA_MODIFIED, eventDetail);\n }\n }\n\n /**\n * Updates the actors clipping planes orientation from the camera properties\n * @param updatedCamera - ICamera\n */\n protected updateClippingPlanesForActors(updatedCamera: ICamera): void {\n const actorEntries = this.getActors();\n actorEntries.forEach((actorEntry) => {\n // we assume that the first two clipping plane of the mapper are always\n // the 'camera' clipping. Update clipping planes only if the actor is\n // a vtkVolume\n if (!actorEntry.actor) {\n return;\n }\n\n const mapper = actorEntry.actor.getMapper();\n const vtkPlanes = mapper.getClippingPlanes();\n\n let slabThickness = RENDERING_DEFAULTS.MINIMUM_SLAB_THICKNESS;\n if (actorEntry.slabThickness) {\n slabThickness = actorEntry.slabThickness;\n }\n\n const { viewPlaneNormal, focalPoint } = updatedCamera;\n\n this.setOrientationOfClippingPlanes(\n vtkPlanes,\n slabThickness,\n viewPlaneNormal,\n focalPoint\n );\n });\n }\n\n public setOrientationOfClippingPlanes(\n vtkPlanes: Array,\n slabThickness: number,\n viewPlaneNormal: Point3,\n focalPoint: Point3\n ): void {\n if (vtkPlanes.length < 2) {\n return;\n }\n\n const scaledDistance = [\n viewPlaneNormal[0],\n viewPlaneNormal[1],\n viewPlaneNormal[2],\n ];\n vtkMath.multiplyScalar(scaledDistance, slabThickness);\n\n vtkPlanes[0].setNormal(viewPlaneNormal);\n const newOrigin1 = [0, 0, 0];\n vtkMath.subtract(focalPoint, scaledDistance, newOrigin1);\n vtkPlanes[0].setOrigin(newOrigin1);\n\n vtkPlanes[1].setNormal(\n -viewPlaneNormal[0],\n -viewPlaneNormal[1],\n -viewPlaneNormal[2]\n );\n const newOrigin2 = [0, 0, 0];\n vtkMath.add(focalPoint, scaledDistance, newOrigin2);\n vtkPlanes[1].setOrigin(newOrigin2);\n }\n\n private _getWorldDistanceViewUpAndViewRight(bounds, viewUp, viewPlaneNormal) {\n const viewUpCorners = this._getCorners(bounds);\n const viewRightCorners = this._getCorners(bounds);\n\n const viewRight = vec3.cross(vec3.create(), viewUp, viewPlaneNormal);\n\n let transform = vtkMatrixBuilder\n .buildFromDegree()\n .identity()\n .rotateFromDirections(viewUp, [1, 0, 0]);\n\n viewUpCorners.forEach((pt) => transform.apply(pt));\n\n // range is now maximum X distance\n let minY = Infinity;\n let maxY = -Infinity;\n for (let i = 0; i < 8; i++) {\n const y = viewUpCorners[i][0];\n if (y > maxY) {\n maxY = y;\n }\n if (y < minY) {\n minY = y;\n }\n }\n\n transform = vtkMatrixBuilder\n .buildFromDegree()\n .identity()\n .rotateFromDirections(\n [viewRight[0], viewRight[1], viewRight[2]],\n [1, 0, 0]\n );\n\n viewRightCorners.forEach((pt) => transform.apply(pt));\n\n // range is now maximum Y distance\n let minX = Infinity;\n let maxX = -Infinity;\n for (let i = 0; i < 8; i++) {\n const x = viewRightCorners[i][0];\n if (x > maxX) {\n maxX = x;\n }\n if (x < minX) {\n minX = x;\n }\n }\n\n return { widthWorld: maxX - minX, heightWorld: maxY - minY };\n }\n\n protected _shouldUseNativeDataType() {\n const { useNorm16Texture, preferSizeOverAccuracy } =\n getConfiguration().rendering;\n return useNorm16Texture || preferSizeOverAccuracy;\n }\n\n _getCorners(bounds: Array): Array[] {\n return [\n [bounds[0], bounds[2], bounds[4]],\n [bounds[0], bounds[2], bounds[5]],\n [bounds[0], bounds[3], bounds[4]],\n [bounds[0], bounds[3], bounds[5]],\n [bounds[1], bounds[2], bounds[4]],\n [bounds[1], bounds[2], bounds[5]],\n [bounds[1], bounds[3], bounds[4]],\n [bounds[1], bounds[3], bounds[5]],\n ];\n }\n\n _getFocalPointForResetCamera(\n centeredFocalPoint: Point3,\n previousCamera: ICamera,\n { resetPan = true, resetToCenter = true }\n ): Point3 {\n if (resetToCenter && resetPan) {\n return centeredFocalPoint;\n }\n\n if (resetToCenter && !resetPan) {\n return hasNaNValues(previousCamera.focalPoint)\n ? centeredFocalPoint\n : previousCamera.focalPoint;\n }\n\n if (!resetToCenter && resetPan) {\n // this is an interesting case that means the reset camera should not\n // change the slice (default behavior is to go to the center of the\n // image), and rather just reset the pan on the slice that is currently\n // being viewed\n const oldCamera = previousCamera;\n const oldFocalPoint = oldCamera.focalPoint;\n const oldViewPlaneNormal = oldCamera.viewPlaneNormal;\n\n const vectorFromOldFocalPointToCenteredFocalPoint = vec3.subtract(\n vec3.create(),\n centeredFocalPoint,\n oldFocalPoint\n );\n\n const distanceFromOldFocalPointToCenteredFocalPoint = vec3.dot(\n vectorFromOldFocalPointToCenteredFocalPoint,\n oldViewPlaneNormal\n );\n\n const newFocalPoint = vec3.scaleAndAdd(\n vec3.create(),\n centeredFocalPoint,\n oldViewPlaneNormal,\n -1 * distanceFromOldFocalPointToCenteredFocalPoint\n );\n\n return [newFocalPoint[0], newFocalPoint[1], newFocalPoint[2]];\n }\n\n if (!resetPan && !resetToCenter) {\n // this means the reset camera should not change the slice and should not\n // touch the pan either.\n return hasNaNValues(previousCamera.focalPoint)\n ? centeredFocalPoint\n : previousCamera.focalPoint;\n }\n }\n\n /**\n * Determines whether or not the 3D point position is inside the boundaries of the 3D imageData.\n * @param point - 3D coordinate\n * @param bounds - Bounds of the image\n * @returns boolean\n */\n _isInBounds(point: Point3, bounds: number[]): boolean {\n const [xMin, xMax, yMin, yMax, zMin, zMax] = bounds;\n const [x, y, z] = point;\n if (x < xMin || x > xMax || y < yMin || y > yMax || z < zMin || z > zMax) {\n return false;\n }\n return true;\n }\n\n /**\n * Returns a list of edges for the imageData bounds, which are\n * the cube edges in the case of volumeViewport edges.\n * p1: front, bottom, left\n * p2: front, top, left\n * p3: back, bottom, left\n * p4: back, top, left\n * p5: front, bottom, right\n * p6: front, top, right\n * p7: back, bottom, right\n * p8: back, top, right\n * @param bounds - Bounds of the renderer\n * @returns Edges of the containing bounds\n */\n _getEdges(bounds: Array): Array<[number[], number[]]> {\n const [p1, p2, p3, p4, p5, p6, p7, p8] = this._getCorners(bounds);\n return [\n [p1, p2],\n [p1, p5],\n [p1, p3],\n [p2, p4],\n [p2, p6],\n [p3, p4],\n [p3, p7],\n [p4, p8],\n [p5, p7],\n [p5, p6],\n [p6, p8],\n [p7, p8],\n ];\n }\n}\n\nexport default Viewport;\n","import vtkVolume from '@kitware/vtk.js/Rendering/Core/Volume';\nimport vtkColorTransferFunction from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction';\nimport vtkColorMaps from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction/ColorMaps';\nimport vtkPiecewiseFunction from '@kitware/vtk.js/Common/DataModel/PiecewiseFunction';\n\nimport cache from '../cache';\nimport {\n MPR_CAMERA_VALUES,\n RENDERING_DEFAULTS,\n VIEWPORT_PRESETS,\n} from '../constants';\nimport {\n BlendModes,\n Events,\n InterpolationType,\n OrientationAxis,\n ViewportStatus,\n VOILUTFunctionType,\n} from '../enums';\nimport ViewportType from '../enums/ViewportType';\nimport eventTarget from '../eventTarget';\nimport { getShouldUseCPURendering } from '../init';\nimport { loadVolume } from '../loaders/volumeLoader';\nimport type {\n ActorEntry,\n ColormapPublic,\n FlipDirection,\n IImageData,\n IVolumeInput,\n OrientationVectors,\n Point2,\n Point3,\n VOIRange,\n VolumeViewportProperties,\n} from '../types';\nimport { VoiModifiedEventDetail } from '../types/EventTypes';\nimport type { ViewportInput } from '../types/IViewport';\nimport type IVolumeViewport from '../types/IVolumeViewport';\nimport {\n actorIsA,\n applyPreset,\n createSigmoidRGBTransferFunction,\n getVoiFromSigmoidRGBTransferFunction,\n imageIdToURI,\n invertRgbTransferFunction,\n triggerEvent,\n colormap as colormapUtils,\n} from '../utilities';\nimport { createVolumeActor } from './helpers';\nimport volumeNewImageEventDispatcher, {\n resetVolumeNewImageState,\n} from './helpers/volumeNewImageEventDispatcher';\nimport Viewport from './Viewport';\nimport type { vtkSlabCamera as vtkSlabCameraType } from './vtkClasses/vtkSlabCamera';\nimport vtkSlabCamera from './vtkClasses/vtkSlabCamera';\nimport transformWorldToIndex from '../utilities/transformWorldToIndex';\n\n/**\n * Abstract base class for volume viewports. VolumeViewports are used to render\n * 3D volumes from which various orientations can be viewed. Since VolumeViewports\n * use SharedVolumeMappers behind the scene, memory footprint of visualizations\n * of the same volume in different orientations is very small.\n *\n * For setting volumes on viewports you need to use {@link addVolumesToViewports}\n * which will add volumes to the specified viewports.\n */\nabstract class BaseVolumeViewport extends Viewport implements IVolumeViewport {\n useCPURendering = false;\n use16BitTexture = false;\n private _FrameOfReferenceUID: string;\n private inverted = false;\n\n // Viewport Properties\n // TODO: similar to setVoi, this is only applicable to first volume\n private VOILUTFunction: VOILUTFunctionType;\n\n constructor(props: ViewportInput) {\n super(props);\n\n this.useCPURendering = getShouldUseCPURendering();\n this.use16BitTexture = this._shouldUseNativeDataType();\n\n if (this.useCPURendering) {\n throw new Error(\n 'VolumeViewports cannot be used whilst CPU Fallback Rendering is enabled.'\n );\n }\n\n const renderer = this.getRenderer();\n\n const camera = vtkSlabCamera.newInstance();\n renderer.setActiveCamera(camera);\n\n switch (this.type) {\n case ViewportType.ORTHOGRAPHIC:\n camera.setParallelProjection(true);\n break;\n case ViewportType.VOLUME_3D:\n camera.setParallelProjection(true);\n break;\n case ViewportType.PERSPECTIVE:\n camera.setParallelProjection(false);\n break;\n default:\n throw new Error(`Unrecognized viewport type: ${this.type}`);\n }\n\n this.initializeVolumeNewImageEventDispatcher();\n }\n\n static get useCustomRenderingPipeline(): boolean {\n return false;\n }\n\n protected applyViewOrientation(\n orientation: OrientationAxis | OrientationVectors\n ) {\n const { viewPlaneNormal, viewUp } =\n this._getOrientationVectors(orientation);\n const camera = this.getVtkActiveCamera();\n camera.setDirectionOfProjection(\n -viewPlaneNormal[0],\n -viewPlaneNormal[1],\n -viewPlaneNormal[2]\n );\n camera.setViewUpFrom(viewUp);\n\n this.resetCamera();\n }\n\n private initializeVolumeNewImageEventDispatcher(): void {\n const volumeNewImageHandlerBound = volumeNewImageHandler.bind(this);\n const volumeNewImageCleanUpBound = volumeNewImageCleanUp.bind(this);\n\n function volumeNewImageHandler(cameraEvent) {\n const { viewportId } = cameraEvent.detail;\n\n if (viewportId !== this.id || this.isDisabled) {\n return;\n }\n\n const viewportImageData = this.getImageData();\n\n if (!viewportImageData) {\n return;\n }\n\n volumeNewImageEventDispatcher(cameraEvent);\n }\n\n function volumeNewImageCleanUp(evt) {\n const { viewportId } = evt.detail;\n\n if (viewportId !== this.id) {\n return;\n }\n\n this.element.removeEventListener(\n Events.CAMERA_MODIFIED,\n volumeNewImageHandlerBound\n );\n\n eventTarget.removeEventListener(\n Events.ELEMENT_DISABLED,\n volumeNewImageCleanUpBound\n );\n\n resetVolumeNewImageState(viewportId);\n }\n\n this.element.removeEventListener(\n Events.CAMERA_MODIFIED,\n volumeNewImageHandlerBound\n );\n this.element.addEventListener(\n Events.CAMERA_MODIFIED,\n volumeNewImageHandlerBound\n );\n\n eventTarget.addEventListener(\n Events.ELEMENT_DISABLED,\n volumeNewImageCleanUpBound\n );\n }\n\n protected resetVolumeViewportClippingRange() {\n const activeCamera = this.getVtkActiveCamera();\n\n if (activeCamera.getParallelProjection()) {\n activeCamera.setClippingRange(\n -RENDERING_DEFAULTS.MAXIMUM_RAY_DISTANCE,\n RENDERING_DEFAULTS.MAXIMUM_RAY_DISTANCE\n );\n } else {\n activeCamera.setClippingRange(\n RENDERING_DEFAULTS.MINIMUM_SLAB_THICKNESS,\n RENDERING_DEFAULTS.MAXIMUM_RAY_DISTANCE\n );\n }\n }\n\n /**\n * Sets the properties for the volume viewport on the volume\n * Sets the VOILUTFunction property for the volume viewport on the volume\n *\n * @param VOILUTFunction - Sets the voi mode (LINEAR or SAMPLED_SIGMOID)\n * @param volumeId - The volume id to set the properties for (if undefined, the first volume)\n * @param suppressEvents - If true, the viewport will not emit events\n */\n private setVOILUTFunction(\n voiLUTFunction: VOILUTFunctionType,\n volumeId?: string,\n suppressEvents?: boolean\n ): void {\n // make sure the VOI LUT function is valid in the VOILUTFunctionType which is enum\n if (Object.values(VOILUTFunctionType).indexOf(voiLUTFunction) === -1) {\n voiLUTFunction = VOILUTFunctionType.LINEAR;\n }\n const { voiRange } = this.getProperties();\n this.VOILUTFunction = voiLUTFunction;\n this.setVOI(voiRange, volumeId, suppressEvents);\n }\n\n /**\n * Sets the colormap for the volume with the given ID and optionally suppresses events.\n *\n * @param colormap - The colormap to apply (e.g., \"hsv\").\n * @param volumeId - The ID of the volume to set the colormap for.\n * @param suppressEvents - If `true`, events will not be emitted during the colormap a\n *\n * @returns void\n */\n private setColormap(\n colormap: ColormapPublic,\n volumeId: string,\n suppressEvents?: boolean\n ) {\n const applicableVolumeActorInfo = this._getApplicableVolumeActor(volumeId);\n\n if (!applicableVolumeActorInfo) {\n return;\n }\n\n const { volumeActor } = applicableVolumeActorInfo;\n\n const mapper = volumeActor.getMapper();\n mapper.setSampleDistance(1.0);\n\n const cfun = vtkColorTransferFunction.newInstance();\n let colormapObj = colormapUtils.getColormap(colormap.name);\n\n const { name } = colormap;\n\n if (!colormapObj) {\n colormapObj = vtkColorMaps.getPresetByName(name);\n }\n\n if (!colormapObj) {\n throw new Error(`Colormap ${colormap} not found`);\n }\n\n const range = volumeActor\n .getProperty()\n .getRGBTransferFunction(0)\n .getRange();\n\n cfun.applyColorMap(colormapObj);\n cfun.setMappingRange(range[0], range[1]);\n volumeActor.getProperty().setRGBTransferFunction(0, cfun);\n }\n\n /**\n * Sets the opacity for the volume with the given ID.\n *\n * @param colormap - An object containing opacity that can be a number or an array of OpacityMapping\n * @param volumeId - The ID of the volume to set the opacity for.\n *\n * @returns void\n */\n private setOpacity(colormap: ColormapPublic, volumeId: string) {\n const applicableVolumeActorInfo = this._getApplicableVolumeActor(volumeId);\n if (!applicableVolumeActorInfo) {\n return;\n }\n const { volumeActor } = applicableVolumeActorInfo;\n const ofun = vtkPiecewiseFunction.newInstance();\n if (typeof colormap.opacity === 'number') {\n const range = volumeActor\n .getProperty()\n .getRGBTransferFunction(0)\n .getRange();\n\n ofun.addPoint(range[0], colormap.opacity);\n ofun.addPoint(range[1], colormap.opacity);\n } else {\n colormap.opacity.forEach(({ opacity, value }) => {\n ofun.addPoint(value, opacity);\n });\n }\n volumeActor.getProperty().setScalarOpacity(0, ofun);\n }\n\n /**\n * Sets the inversion for the volume transfer function\n *\n * @param invert - Should the transfer function be inverted?\n * @param volumeId - volumeId\n * @param suppressEvents - If `true`, events will not be published\n *\n * @returns void\n */\n private setInvert(\n invert: boolean,\n volumeId?: string,\n suppressEvents?: boolean\n ) {\n const applicableVolumeActorInfo = this._getApplicableVolumeActor(volumeId);\n\n if (!applicableVolumeActorInfo) {\n return;\n }\n\n const volumeIdToUse = applicableVolumeActorInfo.volumeId;\n\n const cfun = this._getOrCreateColorTransferFunction(volumeIdToUse);\n invertRgbTransferFunction(cfun);\n\n this.inverted = invert;\n\n const { voiRange } = this.getProperties();\n\n if (!suppressEvents) {\n const eventDetail: VoiModifiedEventDetail = {\n viewportId: this.id,\n range: voiRange,\n volumeId: volumeIdToUse,\n VOILUTFunction: this.VOILUTFunction,\n invert: this.inverted,\n invertStateChanged: true,\n };\n\n triggerEvent(this.element, Events.VOI_MODIFIED, eventDetail);\n }\n }\n\n private _getOrCreateColorTransferFunction(\n volumeId: string\n ): vtkColorTransferFunction {\n const applicableVolumeActorInfo = this._getApplicableVolumeActor(volumeId);\n\n if (!applicableVolumeActorInfo) {\n return null;\n }\n\n const { volumeActor } = applicableVolumeActorInfo;\n\n const rgbTransferFunction = volumeActor\n .getProperty()\n .getRGBTransferFunction(0);\n\n if (rgbTransferFunction) {\n return rgbTransferFunction;\n }\n\n const newRGBTransferFunction = vtkColorTransferFunction.newInstance();\n volumeActor.getProperty().setRGBTransferFunction(0, newRGBTransferFunction);\n\n return newRGBTransferFunction;\n }\n\n private setInterpolationType(\n interpolationType: InterpolationType,\n volumeId?: string\n ) {\n const applicableVolumeActorInfo = this._getApplicableVolumeActor(volumeId);\n\n if (!applicableVolumeActorInfo) {\n return;\n }\n\n const { volumeActor } = applicableVolumeActorInfo;\n const volumeProperty = volumeActor.getProperty();\n\n // @ts-ignore\n volumeProperty.setInterpolationType(interpolationType);\n }\n\n /**\n * Sets the properties for the volume viewport on the volume\n * (if fusion, it sets it for the first volume in the fusion)\n *\n * @param voiRange - Sets the lower and upper voi\n * @param volumeId - The volume id to set the properties for (if undefined, the first volume)\n * @param suppressEvents - If true, the viewport will not emit events\n */\n private setVOI(\n voiRange: VOIRange,\n volumeId?: string,\n suppressEvents = false\n ): void {\n const applicableVolumeActorInfo = this._getApplicableVolumeActor(volumeId);\n\n if (!applicableVolumeActorInfo) {\n return;\n }\n\n const { volumeActor } = applicableVolumeActorInfo;\n const volumeIdToUse = applicableVolumeActorInfo.volumeId;\n\n let voiRangeToUse = voiRange;\n if (typeof voiRangeToUse === 'undefined') {\n const imageData = volumeActor.getMapper().getInputData();\n const range = imageData.getPointData().getScalars().getRange();\n const maxVoiRange = { lower: range[0], upper: range[1] };\n voiRangeToUse = maxVoiRange;\n }\n\n // scaling logic here\n // https://github.com/Kitware/vtk-js/blob/c6f2e12cddfe5c0386a73f0793eb6d9ab20d573e/Sources/Rendering/OpenGL/VolumeMapper/index.js#L957-L972\n if (this.VOILUTFunction === VOILUTFunctionType.SAMPLED_SIGMOID) {\n const cfun = createSigmoidRGBTransferFunction(voiRangeToUse);\n volumeActor.getProperty().setRGBTransferFunction(0, cfun);\n } else {\n // TODO: refactor and make it work for PET series (inverted/colormap)\n // const cfun = createLinearRGBTransferFunction(voiRangeToUse);\n // volumeActor.getProperty().setRGBTransferFunction(0, cfun);\n\n // Todo: Moving from LINEAR to SIGMOID and back to LINEAR will not\n // work until we implement it in a different way because the\n // LINEAR transfer function is not recreated.\n const { lower, upper } = voiRangeToUse;\n volumeActor\n .getProperty()\n .getRGBTransferFunction(0)\n .setRange(lower, upper);\n }\n\n if (!suppressEvents) {\n const eventDetail: VoiModifiedEventDetail = {\n viewportId: this.id,\n range: voiRange,\n volumeId: volumeIdToUse,\n VOILUTFunction: this.VOILUTFunction,\n };\n\n triggerEvent(this.element, Events.VOI_MODIFIED, eventDetail);\n }\n }\n\n /**\n * Sets the properties for the volume viewport on the volume\n * (if fusion, it sets it for the first volume in the fusion)\n *\n * @param VolumeViewportProperties - The properties to set\n * @param [VolumeViewportProperties.voiRange] - Sets the lower and upper voi\n * @param [VolumeViewportProperties.VOILUTFunction] - Sets the voi mode (LINEAR, or SAMPLED_SIGMOID)\n * @param [VolumeViewportProperties.invert] - Inverts the color transfer function\n * @param [VolumeViewportProperties.colormap] - Sets the colormap\n * @param [VolumeViewportProperties.preset] - Sets the colormap\n * @param volumeId - The volume id to set the properties for (if undefined, the first volume)\n * @param suppressEvents - If true, the viewport will not emit events\n */\n public setProperties(\n {\n voiRange,\n VOILUTFunction,\n invert,\n colormap,\n preset,\n interpolationType,\n }: VolumeViewportProperties = {},\n volumeId?: string,\n suppressEvents = false\n ): void {\n // Note: colormap should always be done first, since we can then\n // modify the voiRange\n\n if (colormap?.name) {\n this.setColormap(colormap, volumeId, suppressEvents);\n }\n if (colormap?.opacity != null) {\n this.setOpacity(colormap, volumeId);\n }\n\n if (voiRange !== undefined) {\n this.setVOI(voiRange, volumeId, suppressEvents);\n }\n\n if (typeof interpolationType !== 'undefined') {\n this.setInterpolationType(interpolationType);\n }\n\n if (VOILUTFunction !== undefined) {\n this.setVOILUTFunction(VOILUTFunction, volumeId, suppressEvents);\n }\n\n if (invert !== undefined && this.inverted !== invert) {\n this.setInvert(invert, volumeId, suppressEvents);\n }\n\n if (preset !== undefined) {\n this.setPreset(preset, volumeId, suppressEvents);\n }\n }\n\n /**\n * Sets the specified preset for the volume with the given ID\n *\n * @param presetName - The name of the preset to apply (e.g., \"CT-Bone\").\n * @param volumeId - The ID of the volume to set the preset for.\n * @param suppressEvents - If `true`, events will not be emitted during the preset application.\n *\n * @returns void\n */\n private setPreset(presetName, volumeId, suppressEvents) {\n const applicableVolumeActorInfo = this._getApplicableVolumeActor(volumeId);\n\n if (!applicableVolumeActorInfo) {\n return;\n }\n\n const { volumeActor } = applicableVolumeActorInfo;\n\n const preset = VIEWPORT_PRESETS.find((preset) => {\n return preset.name === presetName;\n });\n\n if (!preset) {\n return;\n }\n\n applyPreset(volumeActor, preset);\n }\n\n /**\n * Retrieve the viewport properties\n * @returns viewport properties including voi, interpolation type: TODO: slabThickness, invert, rotation, flip\n */\n public getProperties = (): VolumeViewportProperties => {\n const voiRanges = this.getActors()\n .map((actorEntry) => {\n const volumeActor = actorEntry.actor as vtkVolume;\n const volumeId = actorEntry.uid;\n const volume = cache.getVolume(volumeId);\n if (!volume) {\n return null;\n }\n const cfun = volumeActor.getProperty().getRGBTransferFunction(0);\n const [lower, upper] =\n this.VOILUTFunction === 'SIGMOID'\n ? getVoiFromSigmoidRGBTransferFunction(cfun)\n : cfun.getRange();\n return { volumeId, voiRange: { lower, upper } };\n })\n .filter(Boolean);\n\n const voiRange = voiRanges.length ? voiRanges[0].voiRange : null;\n const VOILUTFunction = this.VOILUTFunction;\n\n return { voiRange, VOILUTFunction, invert: this.inverted };\n };\n\n /**\n * Creates volume actors for all volumes defined in the `volumeInputArray`.\n * For each entry, if a `callback` is supplied, it will be called with the new volume actor as input.\n * For each entry, if a `blendMode` and/or `slabThickness` is defined, this will be set on the actor's\n * `VolumeMapper`.\n *\n * @param volumeInputArray - The array of `VolumeInput`s which define the volumes to add.\n * @param immediate - Whether the `Viewport` should be rendered as soon as volumes are added.\n */\n public async setVolumes(\n volumeInputArray: Array,\n immediate = false,\n suppressEvents = false\n ): Promise {\n const firstImageVolume = cache.getVolume(volumeInputArray[0].volumeId);\n\n if (!firstImageVolume) {\n throw new Error(\n `imageVolume with id: ${firstImageVolume.volumeId} does not exist`\n );\n }\n\n const FrameOfReferenceUID = firstImageVolume.metadata.FrameOfReferenceUID;\n\n await this._isValidVolumeInputArray(volumeInputArray, FrameOfReferenceUID);\n\n this._FrameOfReferenceUID = FrameOfReferenceUID;\n\n const volumeActors = [];\n\n // One actor per volume\n for (let i = 0; i < volumeInputArray.length; i++) {\n const { volumeId, actorUID, slabThickness } = volumeInputArray[i];\n\n const actor = await createVolumeActor(\n volumeInputArray[i],\n this.element,\n this.id,\n suppressEvents,\n this.use16BitTexture\n );\n\n // We cannot use only volumeId since then we cannot have for instance more\n // than one representation of the same volume (since actors would have the\n // same name, and we don't allow that) AND We cannot use only any uid, since\n // we rely on the volume in the cache for mapper. So we prefer actorUID if\n // it is defined, otherwise we use volumeId for the actor name.\n const uid = actorUID || volumeId;\n volumeActors.push({\n uid,\n actor,\n slabThickness,\n referenceId: volumeId,\n });\n }\n\n this._setVolumeActors(volumeActors);\n this.viewportStatus = ViewportStatus.PRE_RENDER;\n\n triggerEvent(this.element, Events.VOLUME_VIEWPORT_NEW_VOLUME, {\n viewportId: this.id,\n volumeActors,\n });\n\n if (immediate) {\n this.render();\n }\n }\n\n /**\n * Creates and adds volume actors for all volumes defined in the `volumeInputArray`.\n * For each entry, if a `callback` is supplied, it will be called with the new volume actor as input.\n *\n * @param volumeInputArray - The array of `VolumeInput`s which define the volumes to add.\n * @param immediate - Whether the `Viewport` should be rendered as soon as volumes are added.\n */\n public async addVolumes(\n volumeInputArray: Array,\n immediate = false,\n suppressEvents = false\n ): Promise {\n const firstImageVolume = cache.getVolume(volumeInputArray[0].volumeId);\n\n if (!firstImageVolume) {\n throw new Error(\n `imageVolume with id: ${firstImageVolume.volumeId} does not exist`\n );\n }\n const volumeActors = [];\n\n await this._isValidVolumeInputArray(\n volumeInputArray,\n this._FrameOfReferenceUID\n );\n\n // One actor per volume\n for (let i = 0; i < volumeInputArray.length; i++) {\n const { volumeId, visibility, actorUID, slabThickness } =\n volumeInputArray[i];\n\n const actor = await createVolumeActor(\n volumeInputArray[i],\n this.element,\n this.id,\n suppressEvents,\n this.use16BitTexture\n );\n\n if (visibility === false) {\n actor.setVisibility(false);\n }\n\n // We cannot use only volumeId since then we cannot have for instance more\n // than one representation of the same volume (since actors would have the\n // same name, and we don't allow that) AND We cannot use only any uid, since\n // we rely on the volume in the cache for mapper. So we prefer actorUID if\n // it is defined, otherwise we use volumeId for the actor name.\n const uid = actorUID || volumeId;\n volumeActors.push({\n uid,\n actor,\n slabThickness,\n // although the actor UID is defined, we need to use the volumeId for the\n // referenceId, since the actor UID is used to reference the actor in the\n // viewport, however, the actor is created from its volumeId\n // and if later we need to grab the referenced volume from cache,\n // we can use the referenceId to get the volume from the cache\n referenceId: volumeId,\n });\n }\n\n this.addActors(volumeActors);\n\n if (immediate) {\n // render\n this.render();\n }\n }\n\n /**\n * It removes the volume actor from the Viewport. If the volume actor is not in\n * the viewport, it does nothing.\n * @param actorUIDs - Array of actor UIDs to remove. In case of simple volume it will\n * be the volume Id, but in case of Segmentation it will be `{volumeId}-{representationType}`\n * since the same volume can be rendered in multiple representations.\n * @param immediate - If true, the Viewport will be rendered immediately\n */\n public removeVolumeActors(actorUIDs: Array, immediate = false): void {\n // Todo: This is actually removeActors\n this.removeActors(actorUIDs);\n\n if (immediate) {\n this.render();\n }\n }\n\n /**\n * It sets the orientation for the camera, the orientation can be one of the\n * following: axial, sagittal, coronal, default. Use the Enums.OrientationAxis\n * to set the orientation. The \"default\" orientation is the orientation that\n * the volume was acquired in (scan axis)\n *\n * @param orientation - The orientation to set the camera to.\n * @param immediate - Whether the `Viewport` should be rendered as soon as the camera is set.\n */\n public setOrientation(orientation: OrientationAxis, immediate = true): void {\n console.warn('Method \"setOrientation\" needs implementation');\n }\n\n private _getApplicableVolumeActor(volumeId?: string) {\n if (volumeId !== undefined && !this.getActor(volumeId)) {\n return;\n }\n\n const actorEntries = this.getActors();\n\n if (!actorEntries.length) {\n return;\n }\n\n let volumeActor;\n\n if (volumeId) {\n volumeActor = this.getActor(volumeId)?.actor as vtkVolume;\n }\n\n // // set it for the first volume (if there are more than one - fusion)\n if (!volumeActor) {\n volumeActor = actorEntries[0].actor as vtkVolume;\n volumeId = actorEntries[0].uid;\n }\n\n return { volumeActor, volumeId };\n }\n\n private async _isValidVolumeInputArray(\n volumeInputArray: Array,\n FrameOfReferenceUID: string\n ): Promise {\n const numVolumes = volumeInputArray.length;\n\n // Check all other volumes exist and have the same FrameOfReference\n for (let i = 1; i < numVolumes; i++) {\n const volumeInput = volumeInputArray[i];\n\n const imageVolume = await loadVolume(volumeInput.volumeId);\n\n if (!imageVolume) {\n throw new Error(\n `imageVolume with id: ${imageVolume.volumeId} does not exist`\n );\n }\n\n if (FrameOfReferenceUID !== imageVolume.metadata.FrameOfReferenceUID) {\n throw new Error(\n `Volumes being added to viewport ${this.id} do not share the same FrameOfReferenceUID. This is not yet supported`\n );\n }\n }\n\n return true;\n }\n\n /**\n * gets the visible bounds of the viewport in the world coordinate system\n */\n public getBounds(): number[] {\n const renderer = this.getRenderer();\n const bounds = renderer.computeVisiblePropBounds();\n return bounds;\n }\n\n /**\n * Flip the viewport along the desired axis\n * @param flipDirection - FlipDirection\n */\n public flip(flipDirection: FlipDirection): void {\n super.flip(flipDirection);\n }\n\n public getFrameOfReferenceUID = (): string => {\n return this._FrameOfReferenceUID;\n };\n\n /**\n * Checks if the viewport has a volume actor with the given volumeId\n * @param volumeId - the volumeId to look for\n * @returns Boolean indicating if the volume is present in the viewport\n */\n public hasVolumeId(volumeId: string): boolean {\n // Note: this assumes that the uid of the volume is the same as the volumeId\n // which is not guaranteed to be the case for SEG.\n const actorEntries = this.getActors();\n return actorEntries.some((actorEntry) => {\n return actorEntry.uid === volumeId;\n });\n }\n\n /**\n * Returns the image and its properties that is being shown inside the\n * stack viewport. It returns, the image dimensions, image direction,\n * image scalar data, vtkImageData object, metadata, and scaling (e.g., PET suvbw)\n * Note: since the volume viewport supports fusion, to get the\n * image data for a specific volume, use the optional volumeId\n * argument.\n *\n * @param volumeId - The volumeId of the volume to get the image for.\n * @returns IImageData: {dimensions, direction, scalarData, vtkImageData, metadata, scaling}\n */\n public getImageData(volumeId?: string): IImageData | undefined {\n const defaultActor = this.getDefaultActor();\n if (!defaultActor) {\n return;\n }\n\n const { uid: defaultActorUID } = defaultActor;\n volumeId = volumeId ?? defaultActorUID;\n\n const actorEntry = this.getActor(volumeId);\n\n if (!actorIsA(actorEntry, 'vtkVolume')) {\n return;\n }\n\n const actor = actorEntry.actor;\n const volume = cache.getVolume(volumeId);\n\n const vtkImageData = actor.getMapper().getInputData();\n return {\n dimensions: vtkImageData.getDimensions(),\n spacing: vtkImageData.getSpacing(),\n origin: vtkImageData.getOrigin(),\n direction: vtkImageData.getDirection(),\n scalarData: vtkImageData.getPointData().getScalars().isDeleted()\n ? null\n : vtkImageData.getPointData().getScalars().getData(),\n imageData: actor.getMapper().getInputData(),\n metadata: {\n Modality: volume?.metadata?.Modality,\n },\n scaling: volume?.scaling,\n hasPixelSpacing: true,\n };\n }\n\n /**\n * Attaches the volume actors to the viewport.\n *\n * @param volumeActorEntries - The volume actors to add the viewport.\n *\n */\n private _setVolumeActors(volumeActorEntries: Array): void {\n // New volume actors implies resetting the inverted flag (i.e. like starting from scratch).\n this.inverted = false;\n this.setActors(volumeActorEntries);\n }\n\n /**\n * canvasToWorld Returns the world coordinates of the given `canvasPos`\n * projected onto the plane defined by the `Viewport`'s `vtkCamera`'s focal point\n * and the direction of projection.\n *\n * @param canvasPos - The position in canvas coordinates.\n * @returns The corresponding world coordinates.\n * @public\n */\n public canvasToWorld = (canvasPos: Point2): Point3 => {\n const vtkCamera = this.getVtkActiveCamera() as vtkSlabCameraType;\n\n /**\n * NOTE: this is necessary because we want the coordinate transformation\n * respect to the view plane (plane orthogonal to the camera and passing to\n * the focal point).\n *\n * When vtk.js computes the coordinate transformations, it simply uses the\n * camera matrix (no ray casting).\n *\n * However for the volume viewport the clipping range is set to be\n * (-RENDERING_DEFAULTS.MAXIMUM_RAY_DISTANCE, RENDERING_DEFAULTS.MAXIMUM_RAY_DISTANCE).\n * The clipping range is used in the camera method getProjectionMatrix().\n * The projection matrix is used then for viewToWorld/worldToView methods of\n * the renderer. This means that vkt.js will not return the coordinates of\n * the point on the view plane (i.e. the depth coordinate will correspond\n * to the focal point).\n *\n * Therefore the clipping range has to be set to (distance, distance + 0.01),\n * where now distance is the distance between the camera position and focal\n * point. This is done internally, in our camera customization when the flag\n * isPerformingCoordinateTransformation is set to true.\n */\n\n vtkCamera.setIsPerformingCoordinateTransformation?.(true);\n\n const renderer = this.getRenderer();\n const offscreenMultiRenderWindow =\n this.getRenderingEngine().offscreenMultiRenderWindow;\n const openGLRenderWindow =\n offscreenMultiRenderWindow.getOpenGLRenderWindow();\n const size = openGLRenderWindow.getSize();\n const devicePixelRatio = window.devicePixelRatio || 1;\n const canvasPosWithDPR = [\n canvasPos[0] * devicePixelRatio,\n canvasPos[1] * devicePixelRatio,\n ];\n const displayCoord = [\n canvasPosWithDPR[0] + this.sx,\n canvasPosWithDPR[1] + this.sy,\n ];\n\n // The y axis display coordinates are inverted with respect to canvas coords\n displayCoord[1] = size[1] - displayCoord[1];\n\n const worldCoord = openGLRenderWindow.displayToWorld(\n displayCoord[0],\n displayCoord[1],\n 0,\n renderer\n );\n\n vtkCamera.setIsPerformingCoordinateTransformation?.(false);\n\n return [worldCoord[0], worldCoord[1], worldCoord[2]];\n };\n\n /**\n * Returns the canvas coordinates of the given `worldPos`\n * projected onto the `Viewport`'s `canvas`.\n *\n * @param worldPos - The position in world coordinates.\n * @returns The corresponding canvas coordinates.\n * @public\n */\n public worldToCanvas = (worldPos: Point3): Point2 => {\n const vtkCamera = this.getVtkActiveCamera() as vtkSlabCameraType;\n\n /**\n * NOTE: this is necessary because we want the coordinate trasformation\n * respect to the view plane (plane orthogonal to the camera and passing to\n * the focal point).\n *\n * When vtk.js computes the coordinate transformations, it simply uses the\n * camera matrix (no ray casting).\n *\n * However for the volume viewport the clipping range is set to be\n * (-RENDERING_DEFAULTS.MAXIMUM_RAY_DISTANCE, RENDERING_DEFAULTS.MAXIMUM_RAY_DISTANCE).\n * The clipping range is used in the camera method getProjectionMatrix().\n * The projection matrix is used then for viewToWorld/worldToView methods of\n * the renderer. This means that vkt.js will not return the coordinates of\n * the point on the view plane (i.e. the depth coordinate will corresponded\n * to the focal point).\n *\n * Therefore the clipping range has to be set to (distance, distance + 0.01),\n * where now distance is the distance between the camera position and focal\n * point. This is done internally, in our camera customization when the flag\n * isPerformingCoordinateTransformation is set to true.\n */\n\n vtkCamera.setIsPerformingCoordinateTransformation?.(true);\n\n const renderer = this.getRenderer();\n const offscreenMultiRenderWindow =\n this.getRenderingEngine().offscreenMultiRenderWindow;\n const openGLRenderWindow =\n offscreenMultiRenderWindow.getOpenGLRenderWindow();\n const size = openGLRenderWindow.getSize();\n const displayCoord = openGLRenderWindow.worldToDisplay(\n ...worldPos,\n renderer\n );\n\n // The y axis display coordinates are inverted with respect to canvas coords\n displayCoord[1] = size[1] - displayCoord[1];\n\n const canvasCoord = [\n displayCoord[0] - this.sx,\n displayCoord[1] - this.sy,\n ];\n\n const devicePixelRatio = window.devicePixelRatio || 1;\n const canvasCoordWithDPR = [\n canvasCoord[0] / devicePixelRatio,\n canvasCoord[1] / devicePixelRatio,\n ];\n\n vtkCamera.setIsPerformingCoordinateTransformation?.(false);\n\n return canvasCoordWithDPR;\n };\n\n /*\n * Checking if the imageURI is in the volumes that are being\n * rendered by the viewport. imageURI is the imageId without the schema\n * for instance for the imageId of wadors:http://..., the http://... is the imageURI.\n * Why we don't check the imageId is because the same image can be shown in\n * another viewport (StackViewport) with a different schema\n *\n * @param imageURI - The imageURI to check\n * @returns True if the imageURI is in the volumes that are being rendered by the viewport\n */\n public hasImageURI = (imageURI: string): boolean => {\n const volumeActors = this.getActors().filter((actorEntry) =>\n actorIsA(actorEntry, 'vtkVolume')\n );\n\n return volumeActors.some(({ uid }) => {\n const volume = cache.getVolume(uid);\n\n if (!volume || !volume.imageIds) {\n return false;\n }\n\n const volumeImageURIs = volume.imageIds.map(imageIdToURI);\n\n return volumeImageURIs.includes(imageURI);\n });\n };\n\n protected _getOrientationVectors(\n orientation: OrientationAxis | OrientationVectors\n ): OrientationVectors {\n if (typeof orientation === 'object') {\n if (orientation.viewPlaneNormal && orientation.viewUp) {\n return orientation;\n } else {\n throw new Error(\n 'Invalid orientation object. It must contain viewPlaneNormal and viewUp'\n );\n }\n } else if (\n typeof orientation === 'string' &&\n MPR_CAMERA_VALUES[orientation]\n ) {\n return MPR_CAMERA_VALUES[orientation];\n } else {\n throw new Error(\n `Invalid orientation: ${orientation}. Valid orientations are: ${Object.keys(\n MPR_CAMERA_VALUES\n ).join(', ')}`\n );\n }\n }\n /**\n * Gets the largest slab thickness from all actors in the viewport.\n *\n * @returns slabThickness - The slab thickness.\n */\n public getSlabThickness(): number {\n const actors = this.getActors();\n let slabThickness = RENDERING_DEFAULTS.MINIMUM_SLAB_THICKNESS;\n actors.forEach((actor) => {\n if (actor.slabThickness > slabThickness) {\n slabThickness = actor.slabThickness;\n }\n });\n\n return slabThickness;\n }\n /**\n * Given a point in world coordinates, return the intensity at that point\n * @param point - The point in world coordinates to get the intensity\n * from.\n * @returns The intensity value of the voxel at the given point.\n */\n public getIntensityFromWorld(point: Point3): number {\n const actorEntry = this.getDefaultActor();\n if (!actorIsA(actorEntry, 'vtkVolume')) {\n return;\n }\n\n const { actor, uid } = actorEntry;\n const imageData = actor.getMapper().getInputData();\n\n const volume = cache.getVolume(uid);\n const { dimensions } = volume;\n\n const index = transformWorldToIndex(imageData, point);\n\n const voxelIndex =\n index[2] * dimensions[0] * dimensions[1] +\n index[1] * dimensions[0] +\n index[0];\n\n return volume.getScalarData()[voxelIndex];\n }\n\n /**\n * Returns the list of image Ids for the current viewport\n *\n * @param volumeId - volumeId\n * @returns list of strings for image Ids\n */\n public getImageIds = (volumeId?: string): Array => {\n const applicableVolumeActorInfo = this._getApplicableVolumeActor(volumeId);\n\n if (!applicableVolumeActorInfo) {\n throw new Error(`No actor found for the given volumeId: ${volumeId}`);\n }\n\n const volumeIdToUse = applicableVolumeActorInfo.volumeId;\n\n const imageVolume = cache.getVolume(volumeIdToUse);\n if (!imageVolume) {\n throw new Error(\n `imageVolume with id: ${volumeIdToUse} does not exist in cache`\n );\n }\n\n return imageVolume.imageIds;\n };\n\n abstract getCurrentImageIdIndex(): number;\n\n abstract getCurrentImageId(): string;\n\n abstract setBlendMode(\n blendMode: BlendModes,\n filterActorUIDs?: Array,\n immediate?: boolean\n ): void;\n\n abstract setSlabThickness(\n slabThickness: number,\n filterActorUIDs?: Array\n ): void;\n\n abstract resetProperties(volumeId?: string): void;\n}\n\nexport default BaseVolumeViewport;\n","import vtkPlane from '@kitware/vtk.js/Common/DataModel/Plane';\nimport vtkVolume from '@kitware/vtk.js/Rendering/Core/Volume';\n\nimport { vec3 } from 'gl-matrix';\n\nimport cache from '../cache';\nimport { MPR_CAMERA_VALUES, RENDERING_DEFAULTS } from '../constants';\nimport { BlendModes, OrientationAxis, Events } from '../enums';\nimport type {\n ActorEntry,\n IImageVolume,\n IVolumeInput,\n OrientationVectors,\n Point3,\n} from '../types';\nimport type { ViewportInput } from '../types/IViewport';\nimport { actorIsA, getClosestImageId, triggerEvent } from '../utilities';\nimport BaseVolumeViewport from './BaseVolumeViewport';\nimport setDefaultVolumeVOI from './helpers/setDefaultVolumeVOI';\n\n/**\n * An object representing a VolumeViewport. VolumeViewports are used to render\n * 3D volumes from which various orientations can be viewed. Since VolumeViewports\n * use SharedVolumeMappers behind the scene, memory footprint of visualizations\n * of the same volume in different orientations is very small.\n *\n * For setting volumes on viewports you need to use {@link addVolumesToViewports}\n * which will add volumes to the specified viewports.\n */\nclass VolumeViewport extends BaseVolumeViewport {\n private _useAcquisitionPlaneForViewPlane = false;\n constructor(props: ViewportInput) {\n super(props);\n\n const { orientation } = this.options;\n\n // if the camera is set to be acquisition axis then we need to skip\n // it for now until the volume is set\n if (orientation && orientation !== OrientationAxis.ACQUISITION) {\n this.applyViewOrientation(orientation);\n return;\n }\n\n this._useAcquisitionPlaneForViewPlane = true;\n }\n\n /**\n * Creates volume actors for all volumes defined in the `volumeInputArray`.\n * For each entry, if a `callback` is supplied, it will be called with the new volume actor as input.\n * For each entry, if a `blendMode` and/or `slabThickness` is defined, this will be set on the actor's\n * `VolumeMapper`.\n *\n * @param volumeInputArray - The array of `VolumeInput`s which define the volumes to add.\n * @param immediate - Whether the `Viewport` should be rendered as soon as volumes are added.\n */\n public async setVolumes(\n volumeInputArray: Array,\n immediate = false,\n suppressEvents = false\n ): Promise {\n const firstImageVolume = cache.getVolume(volumeInputArray[0].volumeId);\n\n if (!firstImageVolume) {\n throw new Error(\n `imageVolume with id: ${firstImageVolume.volumeId} does not exist`\n );\n }\n\n if (this._useAcquisitionPlaneForViewPlane) {\n this._setViewPlaneToAcquisitionPlane(firstImageVolume);\n this._useAcquisitionPlaneForViewPlane = false;\n }\n\n return super.setVolumes(volumeInputArray, immediate, suppressEvents);\n }\n\n /**\n * Creates and adds volume actors for all volumes defined in the `volumeInputArray`.\n * For each entry, if a `callback` is supplied, it will be called with the new volume actor as input.\n *\n * @param volumeInputArray - The array of `VolumeInput`s which define the volumes to add.\n * @param immediate - Whether the `Viewport` should be rendered as soon as volumes are added.\n */\n public async addVolumes(\n volumeInputArray: Array,\n immediate = false,\n suppressEvents = false\n ): Promise {\n const firstImageVolume = cache.getVolume(volumeInputArray[0].volumeId);\n\n if (!firstImageVolume) {\n throw new Error(\n `imageVolume with id: ${firstImageVolume.volumeId} does not exist`\n );\n }\n\n if (this._useAcquisitionPlaneForViewPlane) {\n this._setViewPlaneToAcquisitionPlane(firstImageVolume);\n this._useAcquisitionPlaneForViewPlane = false;\n }\n\n return super.addVolumes(volumeInputArray, immediate, suppressEvents);\n }\n\n /**\n * It sets the orientation for the camera, the orientation can be one of the\n * following: axial, sagittal, coronal, default. Use the Enums.OrientationAxis\n * to set the orientation. The \"default\" orientation is the orientation that\n * the volume was acquired in (scan axis)\n *\n * @param orientation - The orientation to set the camera to.\n * @param immediate - Whether the `Viewport` should be rendered as soon as the camera is set.\n */\n public setOrientation(orientation: OrientationAxis, immediate = true): void {\n let viewPlaneNormal, viewUp;\n\n if (MPR_CAMERA_VALUES[orientation]) {\n ({ viewPlaneNormal, viewUp } = MPR_CAMERA_VALUES[orientation]);\n } else if (orientation === 'acquisition') {\n ({ viewPlaneNormal, viewUp } = this._getAcquisitionPlaneOrientation());\n } else {\n throw new Error(\n `Invalid orientation: ${orientation}. Use Enums.OrientationAxis instead.`\n );\n }\n\n this.setCamera({\n viewPlaneNormal,\n viewUp,\n });\n\n this.resetCamera();\n\n if (immediate) {\n this.render();\n }\n }\n\n private _getAcquisitionPlaneOrientation(): OrientationVectors {\n const actorEntry = this.getDefaultActor();\n\n if (!actorEntry) {\n return;\n }\n\n // Todo: fix this after we add the volumeId reference to actorEntry later\n // in the segmentation refactor\n const volumeId = actorEntry.uid;\n\n const imageVolume = cache.getVolume(volumeId);\n\n if (!imageVolume) {\n throw new Error(\n `imageVolume with id: ${volumeId} does not exist in cache`\n );\n }\n\n const { direction } = imageVolume;\n const viewPlaneNormal = direction.slice(6, 9).map((x) => -x) as Point3;\n const viewUp = (direction.slice(3, 6) as Point3).map((x) => -x) as Point3;\n\n return {\n viewPlaneNormal,\n viewUp,\n };\n }\n\n private _setViewPlaneToAcquisitionPlane(imageVolume: IImageVolume): void {\n let viewPlaneNormal, viewUp;\n\n if (imageVolume) {\n const { direction } = imageVolume;\n viewPlaneNormal = direction.slice(6, 9).map((x) => -x) as Point3;\n viewUp = (direction.slice(3, 6) as Point3).map((x) => -x) as Point3;\n } else {\n ({ viewPlaneNormal, viewUp } = this._getAcquisitionPlaneOrientation());\n }\n\n this.setCamera({\n viewPlaneNormal,\n viewUp,\n });\n\n this.resetCamera();\n }\n\n public setBlendMode(\n blendMode: BlendModes,\n filterActorUIDs = [],\n immediate = false\n ): void {\n let actorEntries = this.getActors();\n\n if (filterActorUIDs && filterActorUIDs.length > 0) {\n actorEntries = actorEntries.filter((actorEntry: ActorEntry) => {\n return filterActorUIDs.includes(actorEntry.uid);\n });\n }\n\n actorEntries.forEach((actorEntry) => {\n const { actor } = actorEntry;\n\n const mapper = actor.getMapper();\n // @ts-ignore vtk incorrect typing\n mapper.setBlendMode(blendMode);\n });\n\n if (immediate) {\n this.render();\n }\n }\n\n /**\n * Reset the camera for the volume viewport\n */\n public resetCamera(\n resetPan = true,\n resetZoom = true,\n resetToCenter = true\n ): boolean {\n super.resetCamera(resetPan, resetZoom, resetToCenter);\n\n this.resetVolumeViewportClippingRange();\n\n const activeCamera = this.getVtkActiveCamera();\n const viewPlaneNormal = activeCamera.getViewPlaneNormal();\n const focalPoint = activeCamera.getFocalPoint();\n\n // always add clipping planes for the volume viewport. If a use case\n // arises where we don't want clipping planes, you should use the volume_3d\n // viewport instead.\n const actorEntries = this.getActors();\n actorEntries.forEach((actorEntry) => {\n if (!actorEntry.actor) {\n return;\n }\n const mapper = actorEntry.actor.getMapper();\n const vtkPlanes = mapper.getClippingPlanes();\n\n if (vtkPlanes.length === 0) {\n const clipPlane1 = vtkPlane.newInstance();\n const clipPlane2 = vtkPlane.newInstance();\n const newVtkPlanes = [clipPlane1, clipPlane2];\n\n let slabThickness = RENDERING_DEFAULTS.MINIMUM_SLAB_THICKNESS;\n if (actorEntry.slabThickness) {\n slabThickness = actorEntry.slabThickness;\n }\n\n this.setOrientationOfClippingPlanes(\n newVtkPlanes,\n slabThickness,\n viewPlaneNormal,\n focalPoint\n );\n\n mapper.addClippingPlane(clipPlane1);\n mapper.addClippingPlane(clipPlane2);\n }\n });\n\n return true;\n }\n\n /**\n * It sets the slabThickness of the actors of the viewport. If filterActorUIDs are\n * provided, only the actors with the given UIDs will be affected. If no\n * filterActorUIDs are provided, all actors will be affected.\n *\n * @param slabThickness - The slab thickness to set.\n * @param filterActorUIDs - Optional argument to filter the actors to apply\n * the slab thickness to (if not provided, all actors will be affected).\n */\n public setSlabThickness(slabThickness: number, filterActorUIDs = []): void {\n let actorEntries = this.getActors();\n\n if (filterActorUIDs && filterActorUIDs.length > 0) {\n actorEntries = actorEntries.filter((actorEntry) => {\n return filterActorUIDs.includes(actorEntry.uid);\n });\n }\n\n actorEntries.forEach((actorEntry) => {\n if (actorIsA(actorEntry, 'vtkVolume')) {\n actorEntry.slabThickness = slabThickness;\n }\n });\n\n const currentCamera = this.getCamera();\n this.updateClippingPlanesForActors(currentCamera);\n this.triggerCameraModifiedEventIfNecessary(currentCamera, currentCamera);\n }\n\n /**\n * Uses the origin and focalPoint to calculate the slice index.\n * Todo: This only works if the imageIds are properly sorted\n *\n * @returns The slice index\n */\n public getCurrentImageIdIndex = (): number | undefined => {\n const { viewPlaneNormal, focalPoint } = this.getCamera();\n\n // Todo: handle scenario of fusion of multiple volumes\n // we cannot only check number of actors, because we might have\n // segmentations ...\n const { origin, spacing } = this.getImageData();\n\n // how many steps are from the origin to the focal point in the\n // normal direction\n const spacingInNormal = spacing[2];\n const sub = vec3.create();\n vec3.sub(sub, focalPoint, origin);\n const distance = vec3.dot(sub, viewPlaneNormal);\n\n // divide by the spacing in the normal direction to get the\n // number of steps, and subtract 1 to get the index\n return Math.round(Math.abs(distance) / spacingInNormal);\n };\n\n /**\n * Uses viewport camera and volume actor to decide if the viewport\n * is looking at the volume in the direction of acquisition (imageIds).\n * If so, it uses the origin and focalPoint to find which imageId is\n * currently being viewed.\n *\n * @returns ImageId\n */\n public getCurrentImageId = (): string | undefined => {\n if (this.getActors().length > 1) {\n console.warn(\n `Using the first/default actor of ${\n this.getActors().length\n } actors for getCurrentImageId.`\n );\n }\n\n const actorEntry = this.getDefaultActor();\n\n if (!actorEntry || !actorIsA(actorEntry, 'vtkVolume')) {\n return;\n }\n\n const { uid } = actorEntry;\n const volume = cache.getVolume(uid);\n\n if (!volume) {\n return;\n }\n\n const { viewPlaneNormal, focalPoint } = this.getCamera();\n\n return getClosestImageId(volume, focalPoint, viewPlaneNormal);\n };\n\n getRotation = (): number => 0;\n\n /**\n * Reset the viewport properties to the default values\n *\n\n * @param volumeId - Optional volume ID to specify which volume properties to reset.\n * If not provided, it will reset the properties of the default actor.\n *\n * @returns void\n */\n public resetProperties(volumeId?: string): void {\n this._resetProperties(volumeId);\n }\n\n private _resetProperties(volumeId?: string) {\n // Get the actor based on the volumeId if provided, otherwise use the default actor.\n const volumeActor = volumeId\n ? this.getActor(volumeId)\n : this.getDefaultActor();\n\n if (!volumeActor) {\n throw new Error(`No actor found for the given volumeId: ${volumeId}`);\n }\n\n const imageVolume = cache.getVolume(volumeActor.uid);\n if (!imageVolume) {\n throw new Error(\n `imageVolume with id: ${volumeActor.uid} does not exist in cache`\n );\n }\n setDefaultVolumeVOI(volumeActor.actor as vtkVolume, imageVolume, false);\n\n const range = (volumeActor.actor as vtkVolume)\n .getProperty()\n .getRGBTransferFunction(0)\n .getMappingRange();\n\n const eventDetails = {\n viewportId: volumeActor.uid,\n range: {\n lower: range[0],\n upper: range[1],\n },\n volumeId: volumeActor.uid,\n };\n\n triggerEvent(this.element, Events.VOI_MODIFIED, eventDetails);\n }\n}\n\nexport default VolumeViewport;\n","import macro from '../../macros.js';\nimport vtkAbstractMapper3D from './AbstractMapper3D.js';\n\n// vtkAbstractImageMapper methods\n// ----------------------------------------------------------------------------\n\nfunction vtkAbstractImageMapper(publicAPI, model) {\n model.classHierarchy.push('vtkAbstractImageMapper');\n\n publicAPI.getIsOpaque = function () {\n return true;\n };\n\n publicAPI.getCurrentImage = function () {\n return null;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n slice: 0,\n customDisplayExtent: [0, 0, 0, 0, 0, 0],\n useCustomExtents: false,\n backgroundColor: [0, 0, 0, 1]\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Build VTK API\n\n vtkAbstractMapper3D.extend(publicAPI, model, initialValues);\n macro.setGet(publicAPI, model, ['slice', 'useCustomExtents']);\n macro.setGetArray(publicAPI, model, ['customDisplayExtent'], 6);\n macro.setGetArray(publicAPI, model, ['backgroundColor'], 4);\n vtkAbstractImageMapper(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar vtkAbstractImageMapper$1 = {\n extend: extend\n};\n\nexport { vtkAbstractImageMapper$1 as default, extend };\n","import { vec3 } from 'gl-matrix';\nimport vtkPlane from '../../../Common/DataModel/Plane.js';\n\n/**\n * Perform plane-line intersection, where the line is defined by two points (p1, p2),\n * and the plane is defined by the imageData and slice number.\n *\n * @param {Vector3} p1\n * @param {Vector3} p2\n * @param {vtkImageMapper|vtkImageArrayMapper} mapper\n */\n\nfunction doPicking(p1, p2, mapper) {\n var imageData = mapper.getCurrentImage();\n var extent = imageData.getExtent(); // Slice origin\n\n var ijk = [extent[0], extent[2], extent[4]];\n\n var _mapper$getClosestIJK = mapper.getClosestIJKAxis(),\n ijkMode = _mapper$getClosestIJK.ijkMode;\n\n var nSlice = mapper.isA('vtkImageArrayMapper') ? mapper.getSubSlice() : mapper.getSlice();\n\n if (ijkMode !== mapper.getSlicingMode()) {\n // If not IJK slicing, get the IJK slice from the XYZ position/slice\n nSlice = mapper.getSliceAtPosition(nSlice);\n }\n\n ijk[ijkMode] += nSlice;\n var worldOrigin = [0, 0, 0];\n imageData.indexToWorld(ijk, worldOrigin); // Normal computation\n\n ijk[ijkMode] += 1;\n var worldNormal = [0, 0, 0];\n imageData.indexToWorld(ijk, worldNormal);\n worldNormal[0] -= worldOrigin[0];\n worldNormal[1] -= worldOrigin[1];\n worldNormal[2] -= worldOrigin[2];\n vec3.normalize(worldNormal, worldNormal);\n var intersect = vtkPlane.intersectWithLine(p1, p2, worldOrigin, worldNormal);\n\n if (intersect.intersection) {\n var point = intersect.x;\n var absoluteIJK = [0, 0, 0];\n imageData.worldToIndex(point, absoluteIJK); // `t` is the parametric position along the line\n // defined in Plane.intersectWithLine\n\n return {\n t: intersect.t,\n absoluteIJK: absoluteIJK\n };\n }\n\n return null;\n}\n/**\n * Implement point picking for image plane.\n * The plane is defined by the imageData and current slice number,\n * set in the input mapper.\n *\n * @param {Vector3} p1\n * @param {Vector3} p2\n * @param {vtkImageMapper|vtkImageArrayMapper} mapper\n */\n\n\nfunction intersectWithLineForPointPicking(p1, p2, mapper) {\n var pickingData = doPicking(p1, p2, mapper);\n\n if (pickingData) {\n var imageData = mapper.getCurrentImage();\n var extent = imageData.getExtent(); // Get closer integer ijk\n // NB: point picking means closest slice, means rounding\n\n var ijk = [Math.round(pickingData.absoluteIJK[0]), Math.round(pickingData.absoluteIJK[1]), Math.round(pickingData.absoluteIJK[2])]; // Are we outside our actual extent\n\n if (ijk[0] < extent[0] || ijk[0] > extent[1] || ijk[1] < extent[2] || ijk[1] > extent[3] || ijk[2] < extent[4] || ijk[2] > extent[5]) {\n return null;\n }\n\n return {\n t: pickingData.t,\n ijk: ijk\n };\n }\n\n return null;\n}\n/**\n * Implement cell picking for image plane.\n * The plane is defined by the imageData and current slice number,\n * set in the input mapper.\n *\n * @param {Vector3} p1\n * @param {Vector3} p2\n * @param {vtkImageMapper|vtkImageArrayMapper} mapper\n */\n\nfunction intersectWithLineForCellPicking(p1, p2, mapper) {\n var pickingData = doPicking(p1, p2, mapper);\n\n if (pickingData) {\n var imageData = mapper.getCurrentImage();\n var extent = imageData.getExtent();\n var absIJK = pickingData.absoluteIJK; // Get closer integer ijk\n // NB: cell picking means closest voxel, means flooring\n\n var ijk = [Math.floor(absIJK[0]), Math.floor(absIJK[1]), Math.floor(absIJK[2])]; // Are we outside our actual extent\n\n if (ijk[0] < extent[0] || ijk[0] > extent[1] - 1 || ijk[1] < extent[2] || ijk[1] > extent[3] - 1 || ijk[2] < extent[4] || // handle single-slice images\n ijk[2] > (extent[5] ? extent[5] - 1 : extent[5])) {\n return null;\n } // Parametric coordinates within cell\n\n\n var pCoords = [absIJK[0] - ijk[0], absIJK[1] - ijk[1], absIJK[2] - ijk[2]];\n return {\n t: pickingData.t,\n ijk: ijk,\n pCoords: pCoords\n };\n }\n\n return null;\n}\n\nexport { intersectWithLineForCellPicking, intersectWithLineForPointPicking };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport Constants from './ImageMapper/Constants.js';\nimport macro from '../../macros.js';\nimport vtkAbstractImageMapper from './AbstractImageMapper.js';\nimport { intersectWithLineForPointPicking, intersectWithLineForCellPicking } from './AbstractImageMapper/helper.js';\nimport { C as clampValue, O as multiply3x3_vect3, N as createUninitializedBounds } from '../../Common/Core/Math/index.js';\nimport CoincidentTopologyHelper from './Mapper/CoincidentTopologyHelper.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nvar staticOffsetAPI = CoincidentTopologyHelper.staticOffsetAPI,\n otherStaticMethods = CoincidentTopologyHelper.otherStaticMethods;\nvar vtkWarningMacro = macro.vtkWarningMacro;\nvar SlicingMode = Constants.SlicingMode; // ----------------------------------------------------------------------------\n// vtkImageMapper methods\n// ----------------------------------------------------------------------------\n\nfunction vtkImageMapper(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkImageMapper');\n\n publicAPI.getSliceAtPosition = function (pos) {\n var image = publicAPI.getCurrentImage();\n var pos3;\n\n if (pos.length === 3) {\n pos3 = pos;\n } else if (Number.isFinite(pos)) {\n var bds = image.getBounds();\n\n switch (model.slicingMode) {\n case SlicingMode.X:\n pos3 = [pos, (bds[3] + bds[2]) / 2, (bds[5] + bds[4]) / 2];\n break;\n\n case SlicingMode.Y:\n pos3 = [(bds[1] + bds[0]) / 2, pos, (bds[5] + bds[4]) / 2];\n break;\n\n case SlicingMode.Z:\n pos3 = [(bds[1] + bds[0]) / 2, (bds[3] + bds[2]) / 2, pos];\n break;\n }\n }\n\n var ijk = [0, 0, 0];\n image.worldToIndex(pos3, ijk);\n var ex = image.getExtent();\n\n var _publicAPI$getClosest = publicAPI.getClosestIJKAxis(),\n ijkMode = _publicAPI$getClosest.ijkMode;\n\n var slice = 0;\n\n switch (ijkMode) {\n case SlicingMode.I:\n slice = clampValue(ijk[0], ex[0], ex[1]);\n break;\n\n case SlicingMode.J:\n slice = clampValue(ijk[1], ex[2], ex[3]);\n break;\n\n case SlicingMode.K:\n slice = clampValue(ijk[2], ex[4], ex[5]);\n break;\n\n default:\n return 0;\n }\n\n return slice;\n };\n\n publicAPI.setSliceFromCamera = function (cam) {\n var fp = cam.getFocalPoint();\n\n switch (model.slicingMode) {\n case SlicingMode.I:\n case SlicingMode.J:\n case SlicingMode.K:\n {\n var slice = publicAPI.getSliceAtPosition(fp);\n publicAPI.setSlice(slice);\n }\n break;\n\n case SlicingMode.X:\n publicAPI.setSlice(fp[0]);\n break;\n\n case SlicingMode.Y:\n publicAPI.setSlice(fp[1]);\n break;\n\n case SlicingMode.Z:\n publicAPI.setSlice(fp[2]);\n break;\n }\n };\n\n publicAPI.setXSlice = function (id) {\n publicAPI.setSlicingMode(SlicingMode.X);\n publicAPI.setSlice(id);\n };\n\n publicAPI.setYSlice = function (id) {\n publicAPI.setSlicingMode(SlicingMode.Y);\n publicAPI.setSlice(id);\n };\n\n publicAPI.setZSlice = function (id) {\n publicAPI.setSlicingMode(SlicingMode.Z);\n publicAPI.setSlice(id);\n };\n\n publicAPI.setISlice = function (id) {\n publicAPI.setSlicingMode(SlicingMode.I);\n publicAPI.setSlice(id);\n };\n\n publicAPI.setJSlice = function (id) {\n publicAPI.setSlicingMode(SlicingMode.J);\n publicAPI.setSlice(id);\n };\n\n publicAPI.setKSlice = function (id) {\n publicAPI.setSlicingMode(SlicingMode.K);\n publicAPI.setSlice(id);\n };\n\n publicAPI.getSlicingModeNormal = function () {\n var out = [0, 0, 0];\n var a = publicAPI.getCurrentImage().getDirection();\n var mat3 = [[a[0], a[1], a[2]], [a[3], a[4], a[5]], [a[6], a[7], a[8]]];\n\n switch (model.slicingMode) {\n case SlicingMode.X:\n out[0] = 1;\n break;\n\n case SlicingMode.Y:\n out[1] = 1;\n break;\n\n case SlicingMode.Z:\n out[2] = 1;\n break;\n\n case SlicingMode.I:\n multiply3x3_vect3(mat3, [1, 0, 0], out);\n break;\n\n case SlicingMode.J:\n multiply3x3_vect3(mat3, [0, 1, 0], out);\n break;\n\n case SlicingMode.K:\n multiply3x3_vect3(mat3, [0, 0, 1], out);\n break;\n }\n\n return out;\n };\n\n function computeClosestIJKAxis() {\n var inVec3;\n\n switch (model.slicingMode) {\n case SlicingMode.X:\n inVec3 = [1, 0, 0];\n break;\n\n case SlicingMode.Y:\n inVec3 = [0, 1, 0];\n break;\n\n case SlicingMode.Z:\n inVec3 = [0, 0, 1];\n break;\n\n default:\n model.closestIJKAxis = {\n ijkMode: model.slicingMode,\n flip: false\n };\n return;\n } // Project vec3 onto direction cosines\n\n\n var out = [0, 0, 0]; // The direction matrix in vtkImageData is the indexToWorld rotation matrix\n // with a column-major data layout since it is stored as a WebGL matrix.\n // We need the worldToIndex rotation matrix for the projection, and it needs\n // to be in a row-major data layout to use vtkMath for operations.\n // To go from the indexToWorld column-major matrix to the worldToIndex\n // row-major matrix, we need to transpose it (column -> row) then inverse it.\n // However, that 3x3 matrix is a rotation matrix which is orthonormal, meaning\n // that its inverse is equal to its transpose. We therefore need to apply two\n // transpositions resulting in a no-op.\n\n var a = publicAPI.getCurrentImage().getDirection();\n multiply3x3_vect3(a, inVec3, out);\n var maxAbs = 0.0;\n var ijkMode = -1;\n var flip = false;\n\n for (var axis = 0; axis < out.length; ++axis) {\n var absValue = Math.abs(out[axis]);\n\n if (absValue > maxAbs) {\n maxAbs = absValue;\n flip = out[axis] < 0.0;\n ijkMode = axis;\n }\n }\n\n if (maxAbs !== 1.0) {\n var xyzLabel = 'IJKXYZ'[model.slicingMode];\n var ijkLabel = 'IJKXYZ'[ijkMode];\n vtkWarningMacro(\"Unaccurate slicing along \".concat(xyzLabel, \" axis which \") + \"is not aligned with any IJK axis of the image data. \" + \"Using \".concat(ijkLabel, \" axis as a fallback (\").concat(maxAbs, \"% aligned). \") + \"Necessitates slice reformat that is not yet implemented. \" + \"You can switch the slicing mode on your mapper to do IJK slicing instead.\");\n }\n\n model.closestIJKAxis = {\n ijkMode: ijkMode,\n flip: flip\n };\n }\n\n publicAPI.setSlicingMode = function (mode) {\n if (model.slicingMode === mode) {\n return;\n }\n\n model.slicingMode = mode;\n\n if (publicAPI.getCurrentImage()) {\n computeClosestIJKAxis();\n }\n\n publicAPI.modified();\n };\n\n publicAPI.getClosestIJKAxis = function () {\n if ((model.closestIJKAxis === undefined || model.closestIJKAxis.ijkMode === SlicingMode.NONE) && publicAPI.getCurrentImage()) {\n computeClosestIJKAxis();\n }\n\n return model.closestIJKAxis;\n };\n\n publicAPI.getBounds = function () {\n var image = publicAPI.getCurrentImage();\n\n if (!image) {\n return createUninitializedBounds();\n }\n\n if (!model.useCustomExtents) {\n return image.getBounds();\n }\n\n var ex = model.customDisplayExtent.slice();\n\n var _publicAPI$getClosest2 = publicAPI.getClosestIJKAxis(),\n ijkMode = _publicAPI$getClosest2.ijkMode;\n\n var nSlice = model.slice;\n\n if (ijkMode !== model.slicingMode) {\n // If not IJK slicing, get the IJK slice from the XYZ position/slice\n nSlice = publicAPI.getSliceAtPosition(model.slice);\n }\n\n switch (ijkMode) {\n case SlicingMode.I:\n ex[0] = nSlice;\n ex[1] = nSlice;\n break;\n\n case SlicingMode.J:\n ex[2] = nSlice;\n ex[3] = nSlice;\n break;\n\n case SlicingMode.K:\n ex[4] = nSlice;\n ex[5] = nSlice;\n break;\n }\n\n return image.extentToBounds(ex);\n };\n\n publicAPI.getBoundsForSlice = function () {\n var slice = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : model.slice;\n var halfThickness = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var image = publicAPI.getCurrentImage();\n\n if (!image) {\n return createUninitializedBounds();\n }\n\n var extent = image.getSpatialExtent();\n\n var _publicAPI$getClosest3 = publicAPI.getClosestIJKAxis(),\n ijkMode = _publicAPI$getClosest3.ijkMode;\n\n var nSlice = slice;\n\n if (ijkMode !== model.slicingMode) {\n // If not IJK slicing, get the IJK slice from the XYZ position/slice\n nSlice = publicAPI.getSliceAtPosition(slice);\n }\n\n switch (ijkMode) {\n case SlicingMode.I:\n extent[0] = nSlice - halfThickness;\n extent[1] = nSlice + halfThickness;\n break;\n\n case SlicingMode.J:\n extent[2] = nSlice - halfThickness;\n extent[3] = nSlice + halfThickness;\n break;\n\n case SlicingMode.K:\n extent[4] = nSlice - halfThickness;\n extent[5] = nSlice + halfThickness;\n break;\n }\n\n return image.extentToBounds(extent);\n };\n\n publicAPI.intersectWithLineForPointPicking = function (p1, p2) {\n return intersectWithLineForPointPicking(p1, p2, publicAPI);\n };\n\n publicAPI.intersectWithLineForCellPicking = function (p1, p2) {\n return intersectWithLineForCellPicking(p1, p2, publicAPI);\n };\n\n publicAPI.getCurrentImage = function () {\n return publicAPI.getInputData();\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n slicingMode: SlicingMode.NONE,\n closestIJKAxis: {\n ijkMode: SlicingMode.NONE,\n flip: false\n },\n renderToRectangle: false,\n sliceAtFocalPoint: false,\n preferSizeOverAccuracy: false // Whether to use halfFloat representation of float, when it is inaccurate\n\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Build VTK API\n\n vtkAbstractImageMapper.extend(publicAPI, model, initialValues);\n macro.get(publicAPI, model, ['slicingMode']);\n macro.setGet(publicAPI, model, ['closestIJKAxis', 'renderToRectangle', 'sliceAtFocalPoint', 'preferSizeOverAccuracy']);\n CoincidentTopologyHelper.implementCoincidentTopologyMethods(publicAPI, model); // Object methods\n\n vtkImageMapper(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkImageMapper'); // ----------------------------------------------------------------------------\n\nvar vtkImageMapper$1 = _objectSpread(_objectSpread(_objectSpread({\n newInstance: newInstance,\n extend: extend\n}, staticOffsetAPI), otherStaticMethods), Constants);\n\nexport { vtkImageMapper$1 as default, extend, newInstance };\n","import macro from '../../macros.js';\nimport InterpolationType$1 from './ImageProperty/Constants.js';\n\nvar InterpolationType = InterpolationType$1.InterpolationType;\nvar vtkErrorMacro = macro.vtkErrorMacro;\nvar VTK_MAX_VRCOMP = 4; // ----------------------------------------------------------------------------\n// vtkImageProperty methods\n// ----------------------------------------------------------------------------\n\nfunction vtkImageProperty(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkImageProperty');\n\n publicAPI.getMTime = function () {\n var mTime = model.mtime;\n var time;\n\n for (var index = 0; index < VTK_MAX_VRCOMP; index++) {\n // Color MTimes\n if (model.componentData[index].rGBTransferFunction) {\n // time that RGB transfer function was last modified\n time = model.componentData[index].rGBTransferFunction.getMTime();\n mTime = mTime > time ? mTime : time;\n } // Piecewise function MTimes\n\n\n if (model.componentData[index].piecewiseFunction) {\n // time that weighting function was last modified\n time = model.componentData[index].piecewiseFunction.getMTime();\n mTime = mTime > time ? mTime : time;\n }\n }\n\n return mTime;\n }; // Set the color of a volume to an RGB transfer function\n\n\n publicAPI.setRGBTransferFunction = function (index, func) {\n // backwards compatible call without the component index\n var idx = index;\n var transferFunc = func;\n\n if (!Number.isInteger(index)) {\n transferFunc = index;\n idx = 0;\n }\n\n if (model.componentData[idx].rGBTransferFunction !== transferFunc) {\n model.componentData[idx].rGBTransferFunction = transferFunc;\n publicAPI.modified();\n return true;\n }\n\n return false;\n }; // Get the currently set RGB transfer function.\n\n\n publicAPI.getRGBTransferFunction = function () {\n var idx = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n return model.componentData[idx].rGBTransferFunction;\n }; // Set the piecewise function\n\n\n publicAPI.setPiecewiseFunction = function (index, func) {\n var idx = index;\n var transferFunc = func;\n\n if (!Number.isInteger(index)) {\n transferFunc = index;\n idx = 0;\n }\n\n if (model.componentData[idx].piecewiseFunction !== transferFunc) {\n model.componentData[idx].piecewiseFunction = transferFunc;\n publicAPI.modified();\n return true;\n }\n\n return false;\n }; // Get the component weighting function.\n\n\n publicAPI.getPiecewiseFunction = function () {\n var idx = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n return model.componentData[idx].piecewiseFunction;\n }; // Alias to set the piecewise function\n\n\n publicAPI.setScalarOpacity = function (index, func) {\n // backwards compatible call without the component index\n var idx = index;\n var transferFunc = func;\n\n if (!Number.isInteger(index)) {\n transferFunc = index;\n idx = 0;\n }\n\n return publicAPI.setPiecewiseFunction(idx, transferFunc);\n }; // Alias to get the piecewise function (backwards compatibility)\n\n\n publicAPI.getScalarOpacity = function () {\n var idx = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n return publicAPI.getPiecewiseFunction(idx);\n };\n\n publicAPI.setComponentWeight = function (index, value) {\n if (index < 0 || index >= VTK_MAX_VRCOMP) {\n vtkErrorMacro('Invalid index');\n return false;\n }\n\n var val = Math.min(1, Math.max(0, value));\n\n if (model.componentData[index].componentWeight !== val) {\n model.componentData[index].componentWeight = val;\n publicAPI.modified();\n return true;\n }\n\n return false;\n };\n\n publicAPI.getComponentWeight = function (index) {\n if (index < 0 || index >= VTK_MAX_VRCOMP) {\n vtkErrorMacro('Invalid index');\n return 0.0;\n }\n\n return model.componentData[index].componentWeight;\n };\n\n publicAPI.setInterpolationTypeToNearest = function () {\n return publicAPI.setInterpolationType(InterpolationType.NEAREST);\n };\n\n publicAPI.setInterpolationTypeToLinear = function () {\n return publicAPI.setInterpolationType(InterpolationType.LINEAR);\n };\n\n publicAPI.getInterpolationTypeAsString = function () {\n return macro.enumToString(InterpolationType, model.interpolationType);\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n independentComponents: false,\n interpolationType: InterpolationType.LINEAR,\n colorWindow: 255,\n colorLevel: 127.5,\n ambient: 1.0,\n diffuse: 0.0,\n opacity: 1.0,\n useLookupTableScalarRange: false\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Build VTK API\n\n macro.obj(publicAPI, model);\n\n if (!model.componentData) {\n model.componentData = [];\n\n for (var i = 0; i < VTK_MAX_VRCOMP; i++) {\n model.componentData.push({\n rGBTransferFunction: null,\n piecewiseFunction: null,\n componentWeight: 1.0\n });\n }\n }\n\n macro.setGet(publicAPI, model, ['independentComponents', 'interpolationType', 'colorWindow', 'colorLevel', 'ambient', 'diffuse', 'opacity', 'useLookupTableScalarRange']); // Object methods\n\n vtkImageProperty(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkImageProperty'); // ----------------------------------------------------------------------------\n\nvar vtkImageProperty$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkImageProperty$1 as default, extend, newInstance };\n","import { mat4, vec3 } from 'gl-matrix';\nimport macro from '../../macros.js';\nimport vtkBoundingBox from '../../Common/DataModel/BoundingBox.js';\nimport vtkProp3D from './Prop3D.js';\nimport vtkImageProperty from './ImageProperty.js';\n\nvar vtkDebugMacro = macro.vtkDebugMacro; // ----------------------------------------------------------------------------\n// vtkImageSlice methods\n// ----------------------------------------------------------------------------\n\nfunction vtkImageSlice(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkImageSlice');\n\n publicAPI.getActors = function () {\n return publicAPI;\n };\n\n publicAPI.getImages = function () {\n return publicAPI;\n };\n\n publicAPI.getIsOpaque = function () {\n if (model.forceOpaque) {\n return true;\n }\n\n if (model.forceTranslucent) {\n return false;\n } // make sure we have a property\n\n\n if (!model.property) {\n // force creation of a property\n publicAPI.getProperty();\n }\n\n var isOpaque = model.property.getOpacity() >= 1.0; // are we using an opaque scalar array, if any?\n\n isOpaque = isOpaque && (!model.mapper || model.mapper.getIsOpaque());\n return isOpaque;\n }; // Always render during opaque pass, to keep the behavior\n // predictable and because depth-peeling kills alpha-blending.\n // In the future, the Renderer should render images in layers,\n // i.e. where each image will have a layer number assigned to it,\n // and the Renderer will do the images in their own pass.\n\n\n publicAPI.hasTranslucentPolygonalGeometry = function () {\n return false;\n };\n\n publicAPI.makeProperty = vtkImageProperty.newInstance;\n\n publicAPI.getProperty = function () {\n if (model.property === null) {\n model.property = publicAPI.makeProperty();\n }\n\n return model.property;\n };\n\n publicAPI.getBounds = function () {\n if (model.mapper === null) {\n return model.bounds;\n } // Check for the special case when the mapper's bounds are unknown\n\n\n var bds = model.mapper.getBounds();\n\n if (!bds || bds.length !== 6) {\n return bds;\n } // Check for the special case when the actor is empty.\n\n\n if (bds[0] > bds[1]) {\n model.mapperBounds = bds.concat(); // copy the mapper's bounds\n\n model.bounds = [1, -1, 1, -1, 1, -1];\n model.boundsMTime.modified();\n return bds;\n } // Check if we have cached values for these bounds - we cache the\n // values returned by model.mapper.getBounds() and we store the time\n // of caching. If the values returned this time are different, or\n // the modified time of this class is newer than the cached time,\n // then we need to rebuild.\n\n\n var zip = function zip(rows) {\n return rows[0].map(function (_, c) {\n return rows.map(function (row) {\n return row[c];\n });\n });\n };\n\n if (!model.mapperBounds || !zip([bds, model.mapperBounds]).reduce(function (a, b) {\n return a && b[0] === b[1];\n }, true) || publicAPI.getMTime() > model.boundsMTime.getMTime()) {\n vtkDebugMacro('Recomputing bounds...');\n model.mapperBounds = bds.map(function (x) {\n return x;\n });\n var bbox = [];\n vtkBoundingBox.getCorners(bds, bbox);\n publicAPI.computeMatrix();\n var tmp4 = new Float64Array(16);\n mat4.transpose(tmp4, model.matrix);\n bbox.forEach(function (pt) {\n return vec3.transformMat4(pt, pt, tmp4);\n });\n /* eslint-disable no-multi-assign */\n\n model.bounds[0] = model.bounds[2] = model.bounds[4] = Number.MAX_VALUE;\n model.bounds[1] = model.bounds[3] = model.bounds[5] = -Number.MAX_VALUE;\n /* eslint-enable no-multi-assign */\n\n model.bounds = model.bounds.map(function (d, i) {\n return i % 2 === 0 ? bbox.reduce(function (a, b) {\n return a > b[i / 2] ? b[i / 2] : a;\n }, d) : bbox.reduce(function (a, b) {\n return a < b[(i - 1) / 2] ? b[(i - 1) / 2] : a;\n }, d);\n });\n model.boundsMTime.modified();\n }\n\n return model.bounds;\n };\n\n publicAPI.getBoundsForSlice = function (slice) {\n var thickness = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n // Check for the special case when the mapper's bounds are unknown\n var bds = model.mapper.getBoundsForSlice(slice, thickness);\n\n if (!bds || bds.length !== 6) {\n return bds;\n } // Check for the special case when the actor is empty.\n\n\n if (bds[0] > bds[1]) {\n return bds;\n }\n\n var bbox = [];\n vtkBoundingBox.getCorners(bds, bbox);\n publicAPI.computeMatrix();\n var tmp4 = new Float64Array(16);\n mat4.transpose(tmp4, model.matrix);\n bbox.forEach(function (pt) {\n return vec3.transformMat4(pt, pt, tmp4);\n });\n var newBounds = [Number.MAX_VALUE, -Number.MAX_VALUE, Number.MAX_VALUE, -Number.MAX_VALUE, Number.MAX_VALUE, -Number.MAX_VALUE];\n newBounds = newBounds.map(function (d, i) {\n return i % 2 === 0 ? bbox.reduce(function (a, b) {\n return a > b[i / 2] ? b[i / 2] : a;\n }, d) : bbox.reduce(function (a, b) {\n return a < b[(i - 1) / 2] ? b[(i - 1) / 2] : a;\n }, d);\n });\n return newBounds;\n }; //----------------------------------------------------------------------------\n // Get the minimum X bound\n\n\n publicAPI.getMinXBound = function () {\n publicAPI.getBounds();\n return model.bounds[0];\n }; // Get the maximum X bound\n\n\n publicAPI.getMaxXBound = function () {\n publicAPI.getBounds();\n return model.bounds[1];\n }; // Get the minimum Y bound\n\n\n publicAPI.getMinYBound = function () {\n publicAPI.getBounds();\n return model.bounds[2];\n }; // Get the maximum Y bound\n\n\n publicAPI.getMaxYBound = function () {\n publicAPI.getBounds();\n return model.bounds[3];\n }; // Get the minimum Z bound\n\n\n publicAPI.getMinZBound = function () {\n publicAPI.getBounds();\n return model.bounds[4];\n }; // Get the maximum Z bound\n\n\n publicAPI.getMaxZBound = function () {\n publicAPI.getBounds();\n return model.bounds[5];\n };\n\n publicAPI.getMTime = function () {\n var mt = model.mtime;\n\n if (model.property !== null) {\n var time = model.property.getMTime();\n mt = time > mt ? time : mt;\n }\n\n return mt;\n };\n\n publicAPI.getRedrawMTime = function () {\n var mt = model.mtime;\n\n if (model.mapper !== null) {\n var time = model.mapper.getMTime();\n mt = time > mt ? time : mt;\n\n if (model.mapper.getInput() !== null) {\n // FIXME !!! getInputAlgorithm / getInput\n model.mapper.getInputAlgorithm().update();\n time = model.mapper.getInput().getMTime();\n mt = time > mt ? time : mt;\n }\n }\n\n if (model.property !== null) {\n var _time = model.property.getMTime();\n\n mt = _time > mt ? _time : mt;\n\n if (model.property.getRGBTransferFunction() !== null) {\n _time = model.property.getRGBTransferFunction().getMTime();\n mt = _time > mt ? _time : mt;\n }\n }\n\n return mt;\n };\n\n publicAPI.getSupportsSelection = function () {\n return model.mapper ? model.mapper.getSupportsSelection() : false;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n mapper: null,\n property: null,\n bounds: [1, -1, 1, -1, 1, -1]\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkProp3D.extend(publicAPI, model, initialValues); // vtkTimeStamp\n\n model.boundsMTime = {};\n macro.obj(model.boundsMTime); // Build VTK API\n\n macro.set(publicAPI, model, ['property']);\n macro.setGet(publicAPI, model, ['mapper']);\n macro.getArray(publicAPI, model, ['bounds'], 6); // Object methods\n\n vtkImageSlice(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkImageSlice'); // ----------------------------------------------------------------------------\n\nvar vtkImageSlice$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkImageSlice$1 as default, extend, newInstance };\n","import calculateTransform from './calculateTransform';\nimport {\n CPUFallbackEnabledElement,\n CPUFallbackTransform,\n} from '../../../../types';\n\nexport default function (\n enabledElement: CPUFallbackEnabledElement\n): CPUFallbackTransform {\n // Todo: for some reason using the cached transfer after the first call\n // does not give correct transform.\n // if (enabledElement.transform) {\n // return enabledElement.transform;\n // }\n\n return calculateTransform(enabledElement);\n}\n","import getTransform from './getTransform';\n\nimport { Point2, CPUFallbackEnabledElement } from '../../../../types';\n\n/**\n * Converts a point in the canvas coordinate system to the pixel coordinate system\n * system. This can be used to reset tools' image coordinates after modifications\n * have been made in canvas space (e.g. moving a tool by a few cm, independent of\n * image resolution).\n *\n * @param element - The Cornerstone element within which the input point lies\n * @param pt - The input point in the canvas coordinate system\n *\n * @returns The transformed point in the pixel coordinate system\n */\nexport default function (\n enabledElement: CPUFallbackEnabledElement,\n pt: Point2\n): Point2 {\n const transform = getTransform(enabledElement);\n\n transform.invert();\n\n return transform.transformPoint(pt);\n}\n","import getTransform from './getTransform';\nimport { CPUFallbackEnabledElement, Point2 } from '../../../../types';\n\n/**\n * Converts a point in the pixel coordinate system to the canvas coordinate system\n * system. This can be used to render using canvas context without having the weird\n * side effects that come from scaling and non square pixels\n *\n * @param {HTMLDivElement} element An HTML Element enabled for Cornerstone\n * @param {{x: Number, y: Number}} pt The transformed point in the pixel coordinate system\n *\n * @returns {{x: Number, y: Number}} The input point in the canvas coordinate system\n * @memberof PixelCoordinateSystem\n */\nexport default function (\n enabledElement: CPUFallbackEnabledElement,\n pt: Point2\n): Point2 {\n const transform = getTransform(enabledElement);\n\n return transform.transformPoint(pt);\n}\n","import fitToWindow from './fitToWindow';\nimport getImageSize from './getImageSize';\nimport { CPUFallbackEnabledElement } from '../../../../types';\n\n/**\n * This module is responsible for enabling an element to display images with cornerstone\n *\n * @param {HTMLDivElement} element The DOM element enabled for Cornerstone\n * @param {HTMLDivElement} canvas The Canvas DOM element within the DOM element enabled for Cornerstone\n * @returns {void}\n */\nfunction setCanvasSize(enabledElement: CPUFallbackEnabledElement) {\n const { canvas } = enabledElement;\n const { clientWidth, clientHeight } = canvas;\n\n // Set the canvas to be same resolution as the client.\n if (canvas.width !== clientWidth || canvas.height !== clientHeight) {\n canvas.width = clientWidth;\n canvas.height = clientHeight;\n }\n}\n\n/**\n * Checks if the image of a given enabled element fitted the window\n * before the resize\n *\n * @param {EnabledElement} enabledElement The Cornerstone Enabled Element\n * @param {number} oldCanvasWidth The width of the canvas before the resize\n * @param {number} oldCanvasHeight The height of the canvas before the resize\n * @return {Boolean} true if it fitted the windows, false otherwise\n */\nfunction wasFitToWindow(\n enabledElement: CPUFallbackEnabledElement,\n oldCanvasWidth: number,\n oldCanvasHeight: number\n): boolean {\n const scale = enabledElement.viewport.scale;\n const imageSize = getImageSize(\n enabledElement.image,\n enabledElement.viewport.rotation\n );\n const imageWidth = Math.round(imageSize.width * scale);\n const imageHeight = Math.round(imageSize.height * scale);\n const x = enabledElement.viewport.translation.x;\n const y = enabledElement.viewport.translation.y;\n\n return (\n (imageWidth === oldCanvasWidth && imageHeight <= oldCanvasHeight) ||\n (imageWidth <= oldCanvasWidth &&\n imageHeight === oldCanvasHeight &&\n x === 0 &&\n y === 0)\n );\n}\n\n/**\n * Rescale the image relative to the changed size of the canvas\n *\n * @param {EnabledElement} enabledElement The Cornerstone Enabled Element\n * @param {number} oldCanvasWidth The width of the canvas before the resize\n * @param {number} oldCanvasHeight The height of the canvas before the resize\n * @return {void}\n */\nfunction relativeRescale(\n enabledElement: CPUFallbackEnabledElement,\n oldCanvasWidth: number,\n oldCanvasHeight: number\n): void {\n const scale = enabledElement.viewport.scale;\n const canvasWidth = enabledElement.canvas.width;\n const canvasHeight = enabledElement.canvas.height;\n const relWidthChange = canvasWidth / oldCanvasWidth;\n const relHeightChange = canvasHeight / oldCanvasHeight;\n const relChange = Math.sqrt(relWidthChange * relHeightChange);\n\n enabledElement.viewport.scale = relChange * scale;\n}\n\n/**\n * Resizes an enabled element and optionally fits the image to window\n *\n * @param {HTMLDivElement} element The DOM element enabled for Cornerstone\n * @param {Boolean} forceFitToWindow true to to force a refit, false to rescale accordingly\n * @returns {void}\n */\nexport default function (\n enabledElement: CPUFallbackEnabledElement,\n forceFitToWindow = false\n): void {\n const oldCanvasWidth = enabledElement.canvas.width;\n const oldCanvasHeight = enabledElement.canvas.height;\n\n setCanvasSize(enabledElement);\n\n if (enabledElement.image === undefined) {\n return;\n }\n\n if (\n forceFitToWindow ||\n wasFitToWindow(enabledElement, oldCanvasWidth, oldCanvasHeight)\n ) {\n // Fit the image to the window again if it fitted before the resize\n fitToWindow(enabledElement);\n } else {\n // Adapt the scale of a zoomed or panned image relative to the size change\n relativeRescale(enabledElement, oldCanvasWidth, oldCanvasHeight);\n }\n}\n","import getImageFitScale from './getImageFitScale';\nimport { CPUFallbackEnabledElement } from '../../../../types';\n\n/**\n * Adjusts an image's scale and translation so the image is centered and all pixels\n * in the image are viewable.\n *\n * @param element - The Cornerstone element to update\n */\nexport default function (enabledElement: CPUFallbackEnabledElement): void {\n const { image } = enabledElement;\n\n // The new scale is the minimum of the horizontal and vertical scale values\n enabledElement.viewport.scale = getImageFitScale(\n enabledElement.canvas,\n image,\n enabledElement.viewport.rotation\n ).scaleFactor;\n\n enabledElement.viewport.translation.x = 0;\n enabledElement.viewport.translation.y = 0;\n}\n","import vtkDataArray from '@kitware/vtk.js/Common/Core/DataArray';\nimport vtkImageData from '@kitware/vtk.js/Common/DataModel/ImageData';\nimport type { vtkImageData as vtkImageDataType } from '@kitware/vtk.js/Common/DataModel/ImageData';\nimport _cloneDeep from 'lodash.clonedeep';\nimport vtkCamera from '@kitware/vtk.js/Rendering/Core/Camera';\nimport { vec2, vec3, mat4 } from 'gl-matrix';\nimport vtkImageMapper from '@kitware/vtk.js/Rendering/Core/ImageMapper';\nimport vtkImageSlice from '@kitware/vtk.js/Rendering/Core/ImageSlice';\nimport vtkColorTransferFunction from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction';\nimport * as metaData from '../metaData';\nimport Viewport from './Viewport';\nimport eventTarget from '../eventTarget';\nimport {\n triggerEvent,\n isEqual,\n invertRgbTransferFunction,\n createSigmoidRGBTransferFunction,\n windowLevel as windowLevelUtil,\n imageIdToURI,\n isImageActor,\n actorIsA,\n} from '../utilities';\nimport {\n Point2,\n Point3,\n VOIRange,\n ICamera,\n IImage,\n IImageData,\n CPUIImageData,\n PTScaling,\n Scaling,\n StackViewportProperties,\n FlipDirection,\n ActorEntry,\n CPUFallbackEnabledElement,\n CPUFallbackColormapData,\n EventTypes,\n IStackViewport,\n VolumeActor,\n Mat3,\n ColormapRegistration,\n IImageCalibration,\n} from '../types';\nimport { ViewportInput } from '../types/IViewport';\nimport drawImageSync from './helpers/cpuFallback/drawImageSync';\nimport { getColormap } from './helpers/cpuFallback/colors/index';\n\nimport { loadAndCacheImage } from '../loaders/imageLoader';\nimport imageLoadPoolManager from '../requestPool/imageLoadPoolManager';\nimport {\n InterpolationType,\n RequestType,\n Events,\n CalibrationTypes,\n VOILUTFunctionType,\n} from '../enums';\nimport canvasToPixel from './helpers/cpuFallback/rendering/canvasToPixel';\nimport pixelToCanvas from './helpers/cpuFallback/rendering/pixelToCanvas';\nimport getDefaultViewport from './helpers/cpuFallback/rendering/getDefaultViewport';\nimport calculateTransform from './helpers/cpuFallback/rendering/calculateTransform';\nimport resize from './helpers/cpuFallback/rendering/resize';\n\nimport resetCamera from './helpers/cpuFallback/rendering/resetCamera';\nimport { Transform } from './helpers/cpuFallback/rendering/transform';\nimport { getConfiguration, getShouldUseCPURendering } from '../init';\nimport {\n StackViewportNewStackEventDetail,\n StackViewportScrollEventDetail,\n VoiModifiedEventDetail,\n} from '../types/EventTypes';\nimport cache from '../cache';\nimport correctShift from './helpers/cpuFallback/rendering/correctShift';\nimport { ImageActor } from '../types/IActor';\nimport createLinearRGBTransferFunction from '../utilities/createLinearRGBTransferFunction';\nimport {\n PixelDataTypedArray,\n ImagePixelModule,\n ImagePlaneModule,\n} from '../types';\nimport ViewportStatus from '../enums/ViewportStatus';\n\nconst EPSILON = 1; // Slice Thickness\n\ninterface ImageDataMetaData {\n bitsAllocated: number;\n numComps: number;\n origin: Point3;\n direction: Mat3;\n dimensions: Point3;\n spacing: Point3;\n numVoxels: number;\n imagePlaneModule: ImagePlaneModule;\n imagePixelModule: ImagePixelModule;\n}\n// TODO This needs to be exposed as its published to consumers.\ntype CalibrationEvent = {\n rowScale?: number;\n columnScale?: number;\n scale: number;\n calibration: IImageCalibration;\n};\n\ntype SetVOIOptions = {\n suppressEvents?: boolean;\n forceRecreateLUTFunction?: boolean;\n voiUpdatedWithSetProperties?: boolean;\n};\n\n/**\n * An object representing a single stack viewport, which is a camera\n * looking into an internal viewport, and an associated target output `canvas`.\n *\n * StackViewports can be rendered using both GPU and a fallback CPU is the GPU\n * is not available (or low performance). Read more about StackViewports in\n * the documentation section of this website.\n */\nclass StackViewport extends Viewport implements IStackViewport {\n private imageIds: Array;\n // current imageIdIndex that is rendered in the viewport\n private currentImageIdIndex: number;\n // the imageIdIndex that is targeted to be loaded with scrolling but has not initiated loading yet\n private targetImageIdIndex: number;\n // setTimeout if the image is debounced to be loaded\n private debouncedTimeout: number;\n\n // Viewport Properties\n private voiRange: VOIRange;\n private voiUpdatedWithSetProperties = false;\n private VOILUTFunction: VOILUTFunctionType;\n //\n private invert = false;\n // The initial invert of the image loaded as opposed to the invert status of the viewport itself (see above).\n private initialInvert = false;\n private interpolationType: InterpolationType;\n\n // Helpers\n private _imageData: vtkImageDataType;\n private cameraFocalPointOnRender: Point3; // we use focalPoint since flip manipulates the position and makes it useless to track\n private stackInvalidated = false; // if true -> new actor is forced to be created for the stack\n private _publishCalibratedEvent = false;\n private _calibrationEvent: CalibrationEvent;\n private _cpuFallbackEnabledElement?: CPUFallbackEnabledElement;\n // CPU fallback\n private useCPURendering: boolean;\n // Since WebGL natively supports 8 bit int and Float32, we should check if\n // extra configuration flags has been set to use native data type\n // which would save a lot of memory and speed up rendering but it is not\n // yet widely supported in all hardwares. This feature can be turned on\n // by setting useNorm16Texture or preferSizeOverAccuracy in the configuration\n private useNativeDataType = false;\n private cpuImagePixelData: PixelDataTypedArray;\n private cpuRenderingInvalidated: boolean;\n private csImage: IImage;\n\n // TODO: These should not be here and will be nuked\n public modality: string; // this is needed for tools\n public scaling: Scaling;\n\n // Camera properties\n private initialViewUp: Point3;\n\n /**\n * Constructor for the StackViewport class\n * @param props - ViewportInput\n */\n constructor(props: ViewportInput) {\n super(props);\n this.scaling = {};\n this.modality = null;\n this.useCPURendering = getShouldUseCPURendering();\n this.useNativeDataType = this._shouldUseNativeDataType();\n this._configureRenderingPipeline();\n\n this.useCPURendering\n ? this._resetCPUFallbackElement()\n : this._resetGPUViewport();\n\n this.imageIds = [];\n this.currentImageIdIndex = 0;\n this.targetImageIdIndex = 0;\n this.cameraFocalPointOnRender = [0, 0, 0];\n this.resetCamera();\n\n this.initializeElementDisabledHandler();\n }\n\n public setUseCPURendering(value: boolean) {\n this.useCPURendering = value;\n this._configureRenderingPipeline();\n }\n\n static get useCustomRenderingPipeline(): boolean {\n return getShouldUseCPURendering();\n }\n\n public updateRenderingPipeline = () => {\n this._configureRenderingPipeline();\n };\n\n private _configureRenderingPipeline() {\n this.useNativeDataType = this._shouldUseNativeDataType();\n this.useCPURendering = getShouldUseCPURendering();\n\n for (const [funcName, functions] of Object.entries(\n this.renderingPipelineFunctions\n )) {\n this[funcName] = this.useCPURendering ? functions.cpu : functions.gpu;\n }\n\n this.useCPURendering\n ? this._resetCPUFallbackElement()\n : this._resetGPUViewport();\n }\n\n private _resetCPUFallbackElement() {\n this._cpuFallbackEnabledElement = {\n canvas: this.canvas,\n renderingTools: {},\n transform: new Transform(),\n viewport: { rotation: 0 },\n };\n }\n\n private _resetGPUViewport() {\n const renderer = this.getRenderer();\n const camera = vtkCamera.newInstance();\n renderer.setActiveCamera(camera);\n\n const viewPlaneNormal = [0, 0, -1];\n this.initialViewUp = [0, -1, 0];\n\n camera.setDirectionOfProjection(\n -viewPlaneNormal[0],\n -viewPlaneNormal[1],\n -viewPlaneNormal[2]\n );\n camera.setViewUp(...this.initialViewUp);\n camera.setParallelProjection(true);\n camera.setThicknessFromFocalPoint(0.1);\n camera.setFreezeFocalPoint(true);\n }\n\n /**\n * Returns the image and its properties that is being shown inside the\n * stack viewport. It returns, the image dimensions, image direction,\n * image scalar data, vtkImageData object, metadata, and scaling (e.g., PET suvbw)\n *\n * @returns IImageData: dimensions, direction, scalarData, vtkImageData, metadata, scaling\n */\n public getImageData: () => IImageData | CPUIImageData;\n\n /**\n * Sets the colormap for the current viewport.\n * @param colormap - The colormap data to use.\n */\n public setColormap: (\n colormap: CPUFallbackColormapData | ColormapRegistration\n ) => void;\n\n /**\n * If the user has selected CPU rendering, return the CPU camera, otherwise\n * return the default camera\n * @returns The camera object.\n */\n public getCamera: () => ICamera;\n\n /**\n * Set the camera based on the provided camera object.\n * @param cameraInterface - The camera interface that will be used to\n * render the scene.\n */\n public setCamera: (\n cameraInterface: ICamera,\n storeAsInitialCamera?: boolean\n ) => void;\n\n public getRotation: () => number;\n\n /**\n * It sets the colormap to the default colormap.\n */\n public unsetColormap: () => void;\n\n /**\n * Centers Pan and resets the zoom for stack viewport.\n */\n public resetCamera: (resetPan?: boolean, resetZoom?: boolean) => boolean;\n\n /**\n * canvasToWorld Returns the world coordinates of the given `canvasPos`\n * projected onto the plane defined by the `Viewport`'s camera.\n *\n * @param canvasPos - The position in canvas coordinates.\n * @returns The corresponding world coordinates.\n * @public\n */\n public canvasToWorld: (canvasPos: Point2) => Point3;\n\n /**\n * Returns the canvas coordinates of the given `worldPos`\n * projected onto the `Viewport`'s `canvas`.\n *\n * @param worldPos - The position in world coordinates.\n * @returns The corresponding canvas coordinates.\n * @public\n */\n public worldToCanvas: (worldPos: Point3) => Point2;\n\n /**\n * If the renderer is CPU based, throw an error. Otherwise, returns the `vtkRenderer` responsible for rendering the `Viewport`.\n *\n * @returns The `vtkRenderer` for the `Viewport`.\n */\n public getRenderer: () => any;\n\n /**\n * If the renderer is CPU based, throw an error. Otherwise, return the default\n * actor which is the first actor in the renderer.\n * @returns An actor entry.\n */\n public getDefaultActor: () => ActorEntry;\n\n /**\n * If the renderer is CPU based, throw an error. Otherwise, return the actors in the viewport\n * @returns An array of ActorEntry objects.\n */\n public getActors: () => Array;\n /**\n * If the renderer is CPU based, throw an error. Otherwise, it returns the actor entry for the given actor UID.\n * @param actorUID - The unique ID of the actor you want to get.\n * @returns An ActorEntry object.\n */\n public getActor: (actorUID: string) => ActorEntry;\n\n /**\n * If the renderer is CPU-based, throw an error; otherwise, set the\n * actors in the viewport.\n * @param actors - An array of ActorEntry objects.\n */\n public setActors: (actors: Array) => void;\n\n /**\n * If the renderer is CPU based, throw an error. Otherwise, add a list of actors to the viewport\n * @param actors - An array of ActorEntry objects.\n */\n public addActors: (actors: Array) => void;\n\n /**\n * If the renderer is CPU based, throw an error. Otherwise, add the\n * actor to the viewport\n * @param actorEntry - The ActorEntry object that was created by the\n * user.\n */\n public addActor: (actorEntry: ActorEntry) => void;\n\n /**\n * It throws an error if the renderer is CPU based. Otherwise, it removes the actors from the viewport.\n */\n public removeAllActors: () => void;\n\n private setVOI: (voiRange: VOIRange, options?: SetVOIOptions) => void;\n\n private setInterpolationType: (interpolationType: InterpolationType) => void;\n\n private setInvertColor: (invert: boolean) => void;\n\n private initializeElementDisabledHandler() {\n eventTarget.addEventListener(\n Events.ELEMENT_DISABLED,\n function elementDisabledHandler() {\n clearTimeout(this.debouncedTimeout);\n\n eventTarget.removeEventListener(\n Events.ELEMENT_DISABLED,\n elementDisabledHandler\n );\n }\n );\n }\n\n /**\n * Resizes the viewport - only used in CPU fallback for StackViewport. The\n * GPU resizing happens inside the RenderingEngine.\n */\n public resize = (): void => {\n // GPU viewport resize is handled inside the RenderingEngine\n if (this.useCPURendering) {\n this._resizeCPU();\n }\n };\n\n private _resizeCPU = (): void => {\n if (this._cpuFallbackEnabledElement.viewport) {\n resize(this._cpuFallbackEnabledElement);\n }\n };\n\n private getImageDataGPU(): IImageData | undefined {\n const defaultActor = this.getDefaultActor();\n\n if (!defaultActor) {\n return;\n }\n\n if (!isImageActor(defaultActor)) {\n return;\n }\n\n const { actor } = defaultActor;\n const vtkImageData = actor.getMapper().getInputData();\n return {\n dimensions: vtkImageData.getDimensions(),\n spacing: vtkImageData.getSpacing(),\n origin: vtkImageData.getOrigin(),\n direction: vtkImageData.getDirection(),\n scalarData: vtkImageData.getPointData().getScalars().getData(),\n imageData: actor.getMapper().getInputData(),\n metadata: { Modality: this.modality },\n scaling: this.scaling,\n hasPixelSpacing: this.hasPixelSpacing,\n calibration: this.calibration,\n preScale: {\n ...this.csImage.preScale,\n },\n };\n }\n\n private getImageDataCPU(): CPUIImageData | undefined {\n const { metadata } = this._cpuFallbackEnabledElement;\n\n const spacing = metadata.spacing;\n\n return {\n dimensions: metadata.dimensions,\n spacing,\n origin: metadata.origin,\n direction: metadata.direction,\n metadata: { Modality: this.modality },\n scaling: this.scaling,\n imageData: {\n getDirection: () => metadata.direction,\n getDimensions: () => metadata.dimensions,\n getScalarData: () => this.cpuImagePixelData,\n getSpacing: () => spacing,\n worldToIndex: (point: Point3) => {\n const canvasPoint = this.worldToCanvasCPU(point);\n const pixelCoord = canvasToPixel(\n this._cpuFallbackEnabledElement,\n canvasPoint\n );\n return [pixelCoord[0], pixelCoord[1], 0];\n },\n indexToWorld: (point: Point3) => {\n const canvasPoint = pixelToCanvas(this._cpuFallbackEnabledElement, [\n point[0],\n point[1],\n ]);\n return this.canvasToWorldCPU(canvasPoint);\n },\n },\n scalarData: this.cpuImagePixelData,\n hasPixelSpacing: this.hasPixelSpacing,\n calibration: this.calibration,\n preScale: {\n ...this.csImage.preScale,\n },\n };\n }\n\n /**\n * Returns the frame of reference UID, if the image doesn't have imagePlaneModule\n * metadata, it returns undefined, otherwise, frameOfReferenceUID is returned.\n * @returns frameOfReferenceUID : string representing frame of reference id\n */\n public getFrameOfReferenceUID = (): string | undefined => {\n // Get the current image that is displayed in the viewport\n const imageId = this.getCurrentImageId();\n\n if (!imageId) {\n return;\n }\n\n // Use the metadata provider to grab its imagePlaneModule metadata\n const imagePlaneModule = metaData.get('imagePlaneModule', imageId);\n\n // If nothing exists, return undefined\n if (!imagePlaneModule) {\n return;\n }\n\n // Otherwise, provide the FrameOfReferenceUID so we can map\n // annotations made on VolumeViewports back to StackViewports\n // and vice versa\n return imagePlaneModule.frameOfReferenceUID;\n };\n\n /**\n * Returns the raw/loaded image being shown inside the stack viewport.\n */\n public getCornerstoneImage = (): IImage => {\n return this.csImage;\n };\n\n /**\n * Creates imageMapper based on the provided vtkImageData and also creates\n * the imageSliceActor and connects it to the imageMapper.\n * For color stack images, it sets the independent components to be false which\n * is required in vtk.\n *\n * @param imageData - vtkImageData for the viewport\n * @returns actor vtkActor\n */\n private createActorMapper = (imageData) => {\n const mapper = vtkImageMapper.newInstance();\n mapper.setInputData(imageData);\n\n const actor = vtkImageSlice.newInstance();\n\n actor.setMapper(mapper);\n\n const { preferSizeOverAccuracy } = getConfiguration().rendering;\n\n if (preferSizeOverAccuracy) {\n // @ts-ignore for now until vtk is updated\n mapper.setPreferSizeOverAccuracy(true);\n }\n\n if (imageData.getPointData().getNumberOfComponents() > 1) {\n actor.getProperty().setIndependentComponents(false);\n }\n\n return actor;\n };\n\n /**\n * Retrieves the metadata from the metadata provider, and optionally adds the\n * scaling to the viewport if modality is PET and scaling metadata is provided.\n *\n * @param imageId - a string representing the imageId for the image\n * @returns imagePlaneModule and imagePixelModule containing the metadata for the image\n */\n private buildMetadata(image: IImage) {\n const imageId = image.imageId;\n\n const {\n pixelRepresentation,\n bitsAllocated,\n bitsStored,\n highBit,\n photometricInterpretation,\n samplesPerPixel,\n } = metaData.get('imagePixelModule', imageId);\n\n // we can grab the window center and width from the image object\n // since it the loader already has used the metadata provider\n // to get the values\n const { windowWidth, windowCenter, voiLUTFunction } = image;\n\n const { modality } = metaData.get('generalSeriesModule', imageId);\n const imageIdScalingFactor = metaData.get('scalingModule', imageId);\n\n if (modality === 'PT' && imageIdScalingFactor) {\n this._addScalingToViewport(imageIdScalingFactor);\n }\n\n this.modality = modality;\n const voiLUTFunctionEnum = this._getValidVOILUTFunction(voiLUTFunction);\n this.VOILUTFunction = voiLUTFunctionEnum;\n\n this.calibration = null;\n let imagePlaneModule = this._getImagePlaneModule(imageId);\n\n if (!this.useCPURendering) {\n imagePlaneModule = this.calibrateIfNecessary(imageId, imagePlaneModule);\n }\n\n return {\n imagePlaneModule,\n imagePixelModule: {\n bitsAllocated,\n bitsStored,\n samplesPerPixel,\n highBit,\n photometricInterpretation,\n pixelRepresentation,\n windowWidth,\n windowCenter,\n modality,\n voiLUTFunction: voiLUTFunctionEnum,\n },\n };\n }\n\n /**\n * Checks the metadataProviders to see if a calibratedPixelSpacing is\n * given. If so, checks the actor to see if it needs to be modified, and\n * set the flags for imageCalibration if a new actor needs to be created\n *\n * @param imageId - imageId\n * @param imagePlaneModule - imagePlaneModule\n * @returns modified imagePlaneModule with the calibrated spacings\n */\n private calibrateIfNecessary(imageId, imagePlaneModule) {\n const calibration = metaData.get('calibratedPixelSpacing', imageId);\n const isUpdated = this.calibration !== calibration;\n const { scale } = calibration || {};\n this.hasPixelSpacing = scale > 0 || imagePlaneModule.rowPixelSpacing > 0;\n imagePlaneModule.calibration = calibration;\n\n if (!isUpdated) {\n return imagePlaneModule;\n }\n\n this.calibration = calibration;\n this._publishCalibratedEvent = true;\n this._calibrationEvent = {\n scale,\n calibration,\n };\n\n return imagePlaneModule;\n }\n\n /**\n * Sets the properties for the viewport on the default actor. Properties include\n * setting the VOI, inverting the colors and setting the interpolation type, rotation\n * @param voiRange - Sets the lower and upper voi\n * @param invert - Inverts the colors\n * @param interpolationType - Changes the interpolation type (1:linear, 0: nearest)\n * @param rotation - image rotation in degrees\n */\n public setProperties(\n {\n voiRange,\n VOILUTFunction,\n invert,\n interpolationType,\n rotation,\n }: StackViewportProperties = {},\n suppressEvents = false\n ): void {\n this.viewportStatus = this.csImage\n ? ViewportStatus.PRE_RENDER\n : ViewportStatus.LOADING;\n // if voi is not applied for the first time, run the setVOI function\n // which will apply the default voi based on the range\n if (typeof voiRange !== 'undefined') {\n const voiUpdatedWithSetProperties = true;\n this.setVOI(voiRange, { suppressEvents, voiUpdatedWithSetProperties });\n }\n\n if (typeof VOILUTFunction !== 'undefined') {\n this.setVOILUTFunction(VOILUTFunction, suppressEvents);\n }\n\n if (typeof invert !== 'undefined') {\n this.setInvertColor(invert);\n }\n\n if (typeof interpolationType !== 'undefined') {\n this.setInterpolationType(interpolationType);\n }\n\n if (typeof rotation !== 'undefined') {\n // TODO: check with VTK about rounding errors here.\n if (this.getRotation() !== rotation) {\n this.setRotation(rotation);\n }\n }\n }\n\n /**\n * Retrieve the viewport properties\n * @returns viewport properties including voi, invert, interpolation type, rotation, flip\n */\n public getProperties = (): StackViewportProperties => {\n const {\n voiRange,\n VOILUTFunction,\n interpolationType,\n invert,\n voiUpdatedWithSetProperties,\n } = this;\n const rotation = this.getRotation();\n\n return {\n voiRange,\n VOILUTFunction,\n interpolationType,\n invert,\n rotation,\n isComputedVOI: !voiUpdatedWithSetProperties,\n };\n };\n\n /**\n * Reset the viewport properties to the default values\n */\n public resetProperties(): void {\n this.cpuRenderingInvalidated = true;\n this.voiUpdatedWithSetProperties = false;\n this.viewportStatus = ViewportStatus.PRE_RENDER;\n\n this.fillWithBackgroundColor();\n\n if (this.useCPURendering) {\n this._cpuFallbackEnabledElement.renderingTools = {};\n }\n\n this._resetProperties();\n\n this.render();\n }\n\n private _resetProperties() {\n let voiRange;\n if (this._isCurrentImagePTPrescaled()) {\n // if not set via setProperties; if it is a PT image and is already prescaled,\n // use the default range for PT\n voiRange = this._getDefaultPTPrescaledVOIRange();\n } else {\n // if not set via setProperties; if it is not a PT image or is not prescaled,\n // use the voiRange for the current image from its metadata if found\n // otherwise, use the cached voiRange\n voiRange = this._getVOIRangeForCurrentImage();\n }\n\n this.setVOI(voiRange);\n\n if (this.getRotation() !== 0) {\n this.setRotation(0);\n }\n this.setInterpolationType(InterpolationType.LINEAR);\n this.setInvertColor(this.initialInvert);\n }\n\n private _setPropertiesFromCache(): void {\n const { interpolationType, invert } = this;\n\n let voiRange;\n if (this.voiUpdatedWithSetProperties) {\n // use the cached voiRange if the voiRange is locked (if the user has\n // manually set the voi with tools or setProperties api)\n voiRange = this.voiRange;\n } else if (this._isCurrentImagePTPrescaled()) {\n // if not set via setProperties; if it is a PT image and is already prescaled,\n // use the default range for PT\n voiRange = this._getDefaultPTPrescaledVOIRange();\n } else {\n // if not set via setProperties; if it is not a PT image or is not prescaled,\n // use the voiRange for the current image from its metadata if found\n // otherwise, use the cached voiRange\n voiRange = this._getVOIRangeForCurrentImage() ?? this.voiRange;\n }\n\n this.setVOI(voiRange);\n this.setInterpolationType(interpolationType);\n this.setInvertColor(invert);\n }\n\n private getCameraCPU(): Partial {\n const { metadata, viewport } = this._cpuFallbackEnabledElement;\n const { direction } = metadata;\n\n // focalPoint and position of CPU camera is just a placeholder since\n // tools need focalPoint to be defined\n const viewPlaneNormal = direction.slice(6, 9).map((x) => -x) as Point3;\n let viewUp = direction.slice(3, 6).map((x) => -x) as Point3;\n\n // If camera is rotated, we need the correct rotated viewUp along the\n // viewPlaneNormal vector\n if (viewport.rotation) {\n const rotationMatrix = mat4.fromRotation(\n mat4.create(),\n (viewport.rotation * Math.PI) / 180,\n viewPlaneNormal\n );\n viewUp = vec3.transformMat4(\n vec3.create(),\n viewUp,\n rotationMatrix\n ) as Point3;\n }\n\n const canvasCenter: Point2 = [\n this.element.clientWidth / 2,\n this.element.clientHeight / 2,\n ];\n\n // Focal point is the center of the canvas in world coordinate by construction\n const canvasCenterWorld = this.canvasToWorld(canvasCenter);\n\n // parallel scale is half of the viewport height in the world units (mm)\n\n const topLeftWorld = this.canvasToWorld([0, 0]);\n const bottomLeftWorld = this.canvasToWorld([0, this.element.clientHeight]);\n\n const parallelScale = vec3.distance(topLeftWorld, bottomLeftWorld) / 2;\n\n return {\n parallelProjection: true,\n focalPoint: canvasCenterWorld,\n position: [0, 0, 0],\n parallelScale,\n scale: viewport.scale,\n viewPlaneNormal: [\n viewPlaneNormal[0],\n viewPlaneNormal[1],\n viewPlaneNormal[2],\n ],\n viewUp: [viewUp[0], viewUp[1], viewUp[2]],\n flipHorizontal: this.flipHorizontal,\n flipVertical: this.flipVertical,\n };\n }\n\n private setCameraCPU(cameraInterface: ICamera): void {\n const { viewport, image } = this._cpuFallbackEnabledElement;\n const previousCamera = this.getCameraCPU();\n\n const { focalPoint, parallelScale, scale, flipHorizontal, flipVertical } =\n cameraInterface;\n\n const { clientHeight } = this.element;\n\n if (focalPoint) {\n const focalPointCanvas = this.worldToCanvasCPU(focalPoint);\n const focalPointPixel = canvasToPixel(\n this._cpuFallbackEnabledElement,\n focalPointCanvas\n );\n\n const prevFocalPointCanvas = this.worldToCanvasCPU(\n previousCamera.focalPoint\n );\n const prevFocalPointPixel = canvasToPixel(\n this._cpuFallbackEnabledElement,\n prevFocalPointCanvas\n );\n\n const deltaPixel = vec2.create();\n vec2.subtract(\n deltaPixel,\n vec2.fromValues(focalPointPixel[0], focalPointPixel[1]),\n vec2.fromValues(prevFocalPointPixel[0], prevFocalPointPixel[1])\n );\n\n const shift = correctShift(\n { x: deltaPixel[0], y: deltaPixel[1] },\n viewport\n );\n\n viewport.translation.x -= shift.x;\n viewport.translation.y -= shift.y;\n }\n\n if (parallelScale) {\n // We need to convert he parallelScale which has a physical meaning to\n // camera scale factor (since CPU works with scale). Since parallelScale represents\n // half of the height of the viewport in the world unit (mm), we can use that\n // to compute the scale factor which is the ratio of the viewport height in pixels\n // to the current rendered image height.\n const { rowPixelSpacing } = image;\n const scale = (clientHeight * rowPixelSpacing * 0.5) / parallelScale;\n\n viewport.scale = scale;\n viewport.parallelScale = parallelScale;\n }\n\n if (scale) {\n const { rowPixelSpacing } = image;\n viewport.scale = scale;\n viewport.parallelScale = (clientHeight * rowPixelSpacing * 0.5) / scale;\n }\n\n if (flipHorizontal !== undefined || flipVertical !== undefined) {\n this.setFlipCPU({ flipHorizontal, flipVertical });\n }\n\n // re-calculate the transforms\n this._cpuFallbackEnabledElement.transform = calculateTransform(\n this._cpuFallbackEnabledElement\n );\n\n const eventDetail: EventTypes.CameraModifiedEventDetail = {\n previousCamera,\n camera: this.getCamera(),\n element: this.element,\n viewportId: this.id,\n renderingEngineId: this.renderingEngineId,\n rotation: this.getRotation(),\n };\n\n triggerEvent(this.element, Events.CAMERA_MODIFIED, eventDetail);\n }\n\n private setFlipCPU({ flipHorizontal, flipVertical }: FlipDirection): void {\n const { viewport } = this._cpuFallbackEnabledElement;\n\n if (flipHorizontal !== undefined) {\n viewport.hflip = flipHorizontal;\n this.flipHorizontal = viewport.hflip;\n }\n\n if (flipVertical !== undefined) {\n viewport.vflip = flipVertical;\n this.flipVertical = viewport.vflip;\n }\n }\n\n private getRotationCPU = (): number => {\n const { viewport } = this._cpuFallbackEnabledElement;\n return viewport.rotation;\n };\n\n /**\n * Gets the rotation resulting from the value set in setRotation AND taking into\n * account any flips that occurred subsequently.\n *\n * @returns the rotation resulting from the value set in setRotation AND taking into\n * account any flips that occurred subsequently.\n */\n private getRotationGPU = (): number => {\n const {\n viewUp: currentViewUp,\n viewPlaneNormal,\n flipVertical,\n } = this.getCamera();\n\n // The initial view up vector without any rotation, but incorporating vertical flip.\n const initialViewUp = flipVertical\n ? vec3.negate(vec3.create(), this.initialViewUp)\n : this.initialViewUp;\n\n // The angle between the initial and current view up vectors.\n // TODO: check with VTK about rounding errors here.\n const initialToCurrentViewUpAngle =\n (vec3.angle(initialViewUp, currentViewUp) * 180) / Math.PI;\n\n // Now determine if initialToCurrentViewUpAngle is positive or negative by comparing\n // the direction of the initial/current view up cross product with the current\n // viewPlaneNormal.\n\n const initialToCurrentViewUpCross = vec3.cross(\n vec3.create(),\n initialViewUp,\n currentViewUp\n );\n\n // The sign of the dot product of the start/end view up cross product and\n // the viewPlaneNormal indicates a positive or negative rotation respectively.\n const normalDot = vec3.dot(initialToCurrentViewUpCross, viewPlaneNormal);\n\n return normalDot >= 0\n ? initialToCurrentViewUpAngle\n : (360 - initialToCurrentViewUpAngle) % 360;\n };\n\n private setRotation(rotation: number): void {\n const previousCamera = this.getCamera();\n\n this.useCPURendering\n ? this.setRotationCPU(rotation)\n : this.setRotationGPU(rotation);\n\n // New camera after rotation\n const camera = this.getCamera();\n\n const eventDetail: EventTypes.CameraModifiedEventDetail = {\n previousCamera,\n camera,\n element: this.element,\n viewportId: this.id,\n renderingEngineId: this.renderingEngineId,\n rotation,\n };\n\n triggerEvent(this.element, Events.CAMERA_MODIFIED, eventDetail);\n }\n\n private setVOILUTFunction(\n voiLUTFunction: VOILUTFunctionType,\n suppressEvents?: boolean\n ): void {\n if (this.useCPURendering) {\n throw new Error('VOI LUT function is not supported in CPU rendering');\n }\n\n // make sure the VOI LUT function is valid in the VOILUTFunctionType which is enum\n const newVOILUTFunction = this._getValidVOILUTFunction(voiLUTFunction);\n\n let forceRecreateLUTFunction = false;\n if (\n this.VOILUTFunction !== VOILUTFunctionType.LINEAR &&\n newVOILUTFunction === VOILUTFunctionType.LINEAR\n ) {\n forceRecreateLUTFunction = true;\n }\n\n this.VOILUTFunction = newVOILUTFunction;\n\n const { voiRange } = this.getProperties();\n this.setVOI(voiRange, { suppressEvents, forceRecreateLUTFunction });\n }\n\n private setRotationCPU(rotation: number): void {\n const { viewport } = this._cpuFallbackEnabledElement;\n viewport.rotation = rotation;\n }\n\n private setRotationGPU(rotation: number): void {\n const { flipVertical } = this.getCamera();\n\n // Moving back to zero rotation, for new scrolled slice rotation is 0 after camera reset\n const initialViewUp = flipVertical\n ? vec3.negate(vec3.create(), this.initialViewUp)\n : this.initialViewUp;\n\n this.setCamera({\n viewUp: initialViewUp as Point3,\n });\n\n // rotating camera to the new value\n this.getVtkActiveCamera().roll(-rotation);\n }\n\n private setInterpolationTypeGPU(interpolationType: InterpolationType): void {\n const defaultActor = this.getDefaultActor();\n\n if (!defaultActor) {\n return;\n }\n\n if (!isImageActor(defaultActor)) {\n return;\n }\n const { actor } = defaultActor;\n const volumeProperty = actor.getProperty();\n\n // @ts-ignore\n volumeProperty.setInterpolationType(interpolationType);\n this.interpolationType = interpolationType;\n }\n\n private setInterpolationTypeCPU(interpolationType: InterpolationType): void {\n const { viewport } = this._cpuFallbackEnabledElement;\n\n viewport.pixelReplication =\n interpolationType === InterpolationType.LINEAR ? false : true;\n\n this.interpolationType = interpolationType;\n }\n\n private setInvertColorCPU(invert: boolean): void {\n const { viewport } = this._cpuFallbackEnabledElement;\n\n if (!viewport) {\n return;\n }\n\n viewport.invert = invert;\n this.invert = invert;\n }\n\n private setInvertColorGPU(invert: boolean): void {\n const defaultActor = this.getDefaultActor();\n\n if (!defaultActor) {\n return;\n }\n\n if (!isImageActor(defaultActor)) {\n return;\n }\n\n // Duplicated logic to make sure typescript stops complaining\n // about vtkActor not having the correct property\n if (actorIsA(defaultActor, 'vtkVolume')) {\n const volumeActor = defaultActor.actor as VolumeActor;\n const tfunc = volumeActor.getProperty().getRGBTransferFunction(0);\n\n if ((!this.invert && invert) || (this.invert && !invert)) {\n invertRgbTransferFunction(tfunc);\n }\n this.invert = invert;\n } else if (actorIsA(defaultActor, 'vtkImageSlice')) {\n const imageSliceActor = defaultActor.actor as vtkImageSlice;\n const tfunc = imageSliceActor.getProperty().getRGBTransferFunction(0);\n\n if ((!this.invert && invert) || (this.invert && !invert)) {\n invertRgbTransferFunction(tfunc);\n }\n this.invert = invert;\n }\n }\n\n private setVOICPU(voiRange: VOIRange, options: SetVOIOptions = {}): void {\n const { suppressEvents = false } = options;\n // TODO: Account for VOILUTFunction\n const { viewport, image } = this._cpuFallbackEnabledElement;\n\n if (!viewport || !image) {\n return;\n }\n\n if (typeof voiRange === 'undefined') {\n const { windowWidth: ww, windowCenter: wc } = image;\n\n const wwToUse = Array.isArray(ww) ? ww[0] : ww;\n const wcToUse = Array.isArray(wc) ? wc[0] : wc;\n viewport.voi = {\n windowWidth: wwToUse,\n windowCenter: wcToUse,\n };\n\n const { lower, upper } = windowLevelUtil.toLowHighRange(wwToUse, wcToUse);\n voiRange = { lower, upper };\n } else {\n const { lower, upper } = voiRange;\n const { windowCenter, windowWidth } = windowLevelUtil.toWindowLevel(\n lower,\n upper\n );\n\n if (!viewport.voi) {\n viewport.voi = {\n windowWidth: 0,\n windowCenter: 0,\n };\n }\n\n viewport.voi.windowWidth = windowWidth;\n viewport.voi.windowCenter = windowCenter;\n }\n\n this.voiRange = voiRange;\n const eventDetail: VoiModifiedEventDetail = {\n viewportId: this.id,\n range: voiRange,\n };\n\n if (!suppressEvents) {\n triggerEvent(this.element, Events.VOI_MODIFIED, eventDetail);\n }\n }\n\n private setVOIGPU(voiRange: VOIRange, options: SetVOIOptions = {}): void {\n const {\n suppressEvents = false,\n forceRecreateLUTFunction = false,\n voiUpdatedWithSetProperties = false,\n } = options;\n\n if (\n voiRange &&\n this.voiRange &&\n this.voiRange.lower === voiRange.lower &&\n this.voiRange.upper === voiRange.upper &&\n !forceRecreateLUTFunction &&\n !this.stackInvalidated\n ) {\n return;\n }\n\n const defaultActor = this.getDefaultActor();\n if (!defaultActor) {\n return;\n }\n\n if (!isImageActor(defaultActor)) {\n return;\n }\n const imageActor = defaultActor.actor as ImageActor;\n\n let voiRangeToUse = voiRange;\n\n if (typeof voiRangeToUse === 'undefined') {\n const imageData = imageActor.getMapper().getInputData();\n const range = imageData.getPointData().getScalars().getRange();\n const maxVoiRange = { lower: range[0], upper: range[1] };\n voiRangeToUse = maxVoiRange;\n }\n\n // scaling logic here\n // https://github.com/Kitware/vtk-js/blob/master/Sources/Rendering/OpenGL/ImageMapper/index.js#L540-L549\n imageActor.getProperty().setUseLookupTableScalarRange(true);\n\n let transferFunction = imageActor.getProperty().getRGBTransferFunction(0);\n\n const isSigmoidTFun =\n this.VOILUTFunction === VOILUTFunctionType.SAMPLED_SIGMOID;\n\n // use the old cfun if it exists for linear case\n if (isSigmoidTFun || !transferFunction || forceRecreateLUTFunction) {\n const transferFunctionCreator = isSigmoidTFun\n ? createSigmoidRGBTransferFunction\n : createLinearRGBTransferFunction;\n\n transferFunction = transferFunctionCreator(voiRangeToUse);\n\n if (this.invert) {\n invertRgbTransferFunction(transferFunction);\n }\n\n imageActor.getProperty().setRGBTransferFunction(0, transferFunction);\n }\n\n if (!isSigmoidTFun) {\n // @ts-ignore vtk type error\n transferFunction.setRange(voiRangeToUse.lower, voiRangeToUse.upper);\n }\n\n this.voiRange = voiRangeToUse;\n\n // if voiRange is set by setProperties we need to lock it if it is not locked already\n if (!this.voiUpdatedWithSetProperties) {\n this.voiUpdatedWithSetProperties = voiUpdatedWithSetProperties;\n }\n\n if (suppressEvents) {\n return;\n }\n\n const eventDetail: VoiModifiedEventDetail = {\n viewportId: this.id,\n range: voiRangeToUse,\n VOILUTFunction: this.VOILUTFunction,\n };\n\n triggerEvent(this.element, Events.VOI_MODIFIED, eventDetail);\n }\n\n /**\n * Adds scaling parameters to the viewport to be used along all slices\n *\n * @param imageIdScalingFactor - suvbw, suvlbm, suvbsa\n */\n private _addScalingToViewport(imageIdScalingFactor) {\n if (this.scaling.PT) {\n return;\n }\n\n // if don't exist\n // These ratios are constant across all frames, so only need one.\n const { suvbw, suvlbm, suvbsa } = imageIdScalingFactor;\n\n const ptScaling = {};\n\n if (suvlbm) {\n ptScaling.suvbwToSuvlbm = suvlbm / suvbw;\n }\n\n if (suvbsa) {\n ptScaling.suvbwToSuvbsa = suvbsa / suvbw;\n }\n\n this.scaling.PT = ptScaling;\n }\n\n /**\n * Calculates number of components based on the dicom metadata\n *\n * @param photometricInterpretation - string dicom tag\n * @returns number representing number of components\n */\n private _getNumCompsFromPhotometricInterpretation(\n photometricInterpretation: string\n ): number {\n // TODO: this function will need to have more logic later\n // see http://dicom.nema.org/medical/Dicom/current/output/chtml/part03/sect_C.7.6.3.html#sect_C.7.6.3.1.2\n let numberOfComponents = 1;\n if (\n photometricInterpretation === 'RGB' ||\n photometricInterpretation.indexOf('YBR') !== -1 ||\n photometricInterpretation === 'PALETTE COLOR'\n ) {\n numberOfComponents = 3;\n }\n\n return numberOfComponents;\n }\n\n /**\n * Calculates image metadata based on the image object. It calculates normal\n * axis for the images, and output image metadata\n *\n * @param image - stack image containing cornerstone image\n * @returns image metadata: bitsAllocated, number of components, origin,\n * direction, dimensions, spacing, number of voxels.\n */\n private _getImageDataMetadata(image: IImage): ImageDataMetaData {\n // TODO: Creating a single image should probably not require a metadata provider.\n // We should define the minimum we need to display an image and it should live on\n // the Image object itself. Additional stuff (e.g. pixel spacing, direction, origin, etc)\n // should be optional and used if provided through a metadata provider.\n\n const { imagePlaneModule, imagePixelModule } = this.buildMetadata(image);\n\n let rowCosines, columnCosines;\n\n rowCosines = imagePlaneModule.rowCosines;\n columnCosines = imagePlaneModule.columnCosines;\n\n // if null or undefined\n if (rowCosines == null || columnCosines == null) {\n rowCosines = [1, 0, 0];\n columnCosines = [0, 1, 0];\n }\n\n const rowCosineVec = vec3.fromValues(\n rowCosines[0],\n rowCosines[1],\n rowCosines[2]\n );\n const colCosineVec = vec3.fromValues(\n columnCosines[0],\n columnCosines[1],\n columnCosines[2]\n );\n const scanAxisNormal = vec3.create();\n vec3.cross(scanAxisNormal, rowCosineVec, colCosineVec);\n\n let origin = imagePlaneModule.imagePositionPatient;\n // if null or undefined\n if (origin == null) {\n origin = [0, 0, 0];\n }\n\n const xSpacing =\n imagePlaneModule.columnPixelSpacing || image.columnPixelSpacing;\n const ySpacing = imagePlaneModule.rowPixelSpacing || image.rowPixelSpacing;\n const xVoxels = image.columns;\n const yVoxels = image.rows;\n\n // Note: For rendering purposes, we use the EPSILON as the z spacing.\n // This is purely for internal implementation logic since we are still\n // technically rendering 3D objects with vtk.js, but the abstracted intention\n // of the stack viewport is to render 2D images\n const zSpacing = EPSILON;\n const zVoxels = 1;\n\n const numComps =\n image.numComps ||\n this._getNumCompsFromPhotometricInterpretation(\n imagePixelModule.photometricInterpretation\n );\n\n return {\n bitsAllocated: imagePixelModule.bitsAllocated,\n numComps,\n origin,\n direction: [...rowCosineVec, ...colCosineVec, ...scanAxisNormal] as Mat3,\n dimensions: [xVoxels, yVoxels, zVoxels],\n spacing: [xSpacing, ySpacing, zSpacing],\n numVoxels: xVoxels * yVoxels * zVoxels,\n imagePlaneModule,\n imagePixelModule,\n };\n }\n\n /**\n * Converts the image direction to camera viewUp and viewplaneNormal\n *\n * @param imageDataDirection - vtkImageData direction\n * @returns viewplane normal and viewUp of the camera\n */\n private _getCameraOrientation(imageDataDirection: Mat3): {\n viewPlaneNormal: Point3;\n viewUp: Point3;\n } {\n const viewPlaneNormal = imageDataDirection.slice(6, 9).map((x) => -x);\n\n const viewUp = imageDataDirection.slice(3, 6).map((x) => -x);\n return {\n viewPlaneNormal: [\n viewPlaneNormal[0],\n viewPlaneNormal[1],\n viewPlaneNormal[2],\n ],\n viewUp: [viewUp[0], viewUp[1], viewUp[2]],\n };\n }\n\n /**\n * Creates vtkImagedata based on the image object, it creates\n * and empty scalar data for the image based on the metadata\n * tags (e.g., bitsAllocated)\n *\n * @param image - cornerstone Image object\n */\n private _createVTKImageData({\n origin,\n direction,\n dimensions,\n spacing,\n numComps,\n pixelArray,\n }): void {\n const values = new pixelArray.constructor(pixelArray.length);\n\n // Todo: I guess nothing should be done for use16bit?\n const scalarArray = vtkDataArray.newInstance({\n name: 'Pixels',\n numberOfComponents: numComps,\n values: values,\n });\n\n this._imageData = vtkImageData.newInstance();\n\n this._imageData.setDimensions(dimensions);\n this._imageData.setSpacing(spacing);\n this._imageData.setDirection(direction);\n this._imageData.setOrigin(origin);\n this._imageData.getPointData().setScalars(scalarArray);\n }\n\n /**\n * Sets the imageIds to be visualized inside the stack viewport. It accepts\n * list of imageIds, the index of the first imageId to be viewed. It is a\n * asynchronous function that returns a promise resolving to imageId being\n * displayed in the stack viewport.\n *\n *\n * @param imageIds - list of strings, that represents list of image Ids\n * @param currentImageIdIndex - number representing the index of the initial image to be displayed\n */\n public async setStack(\n imageIds: Array,\n currentImageIdIndex = 0\n ): Promise {\n this._throwIfDestroyed();\n\n this.imageIds = imageIds;\n this.currentImageIdIndex = currentImageIdIndex;\n this.targetImageIdIndex = currentImageIdIndex;\n\n // reset the stack\n this.stackInvalidated = true;\n this.flipVertical = false;\n this.flipHorizontal = false;\n this.voiRange = null;\n this.interpolationType = InterpolationType.LINEAR;\n this.invert = false;\n this.viewportStatus = ViewportStatus.LOADING;\n\n this.fillWithBackgroundColor();\n\n if (this.useCPURendering) {\n this._cpuFallbackEnabledElement.renderingTools = {};\n delete this._cpuFallbackEnabledElement.viewport.colormap;\n }\n\n const imageId = await this._setImageIdIndex(currentImageIdIndex);\n\n const eventDetail: StackViewportNewStackEventDetail = {\n imageIds,\n viewportId: this.id,\n element: this.element,\n currentImageIdIndex: currentImageIdIndex,\n };\n\n triggerEvent(eventTarget, Events.STACK_VIEWPORT_NEW_STACK, eventDetail);\n\n return imageId;\n }\n\n /**\n * Throws an error if you are using a destroyed instance of the stack viewport\n */\n private _throwIfDestroyed() {\n if (this.isDisabled) {\n throw new Error(\n 'The stack viewport has been destroyed and is no longer usable. Renderings will not be performed. If you ' +\n 'are using the same viewportId and have re-enabled the viewport, you need to grab the new viewport instance ' +\n 'using renderingEngine.getViewport(viewportId), instead of using your lexical scoped reference to the viewport instance.'\n );\n }\n }\n\n /**\n * It checks if the new image object matches the dimensions, spacing,\n * and direction of the previously displayed image in the viewport or not.\n * It returns a boolean\n *\n * @param image - Cornerstone Image object\n * @param imageData - vtkImageData\n * @returns boolean\n */\n private _checkVTKImageDataMatchesCornerstoneImage(\n image: IImage,\n imageData: vtkImageDataType\n ): boolean {\n if (!imageData) {\n return false;\n }\n const [xSpacing, ySpacing] = imageData.getSpacing();\n const [xVoxels, yVoxels] = imageData.getDimensions();\n const imagePlaneModule = this._getImagePlaneModule(image.imageId);\n const direction = imageData.getDirection();\n const rowCosines = direction.slice(0, 3);\n const columnCosines = direction.slice(3, 6);\n const dataType = imageData.getPointData().getScalars().getDataType();\n\n // using epsilon comparison for float numbers comparison.\n const isSameXSpacing = isEqual(xSpacing, image.columnPixelSpacing);\n const isSameYSpacing = isEqual(ySpacing, image.rowPixelSpacing);\n\n // using spacing, size, and direction only for now\n return (\n (isSameXSpacing ||\n (image.columnPixelSpacing === null && xSpacing === 1.0)) &&\n (isSameYSpacing ||\n (image.rowPixelSpacing === null && ySpacing === 1.0)) &&\n xVoxels === image.columns &&\n yVoxels === image.rows &&\n isEqual(imagePlaneModule.rowCosines, rowCosines) &&\n isEqual(imagePlaneModule.columnCosines, columnCosines) &&\n (!this.useNativeDataType ||\n dataType === image.getPixelData().constructor.name)\n );\n }\n\n /**\n * It Updates the vtkImageData of the viewport with the new pixel data\n * from the provided image object.\n *\n * @param image - Cornerstone Image object\n */\n private _updateVTKImageDataFromCornerstoneImage(image: IImage): void {\n const imagePlaneModule = this._getImagePlaneModule(image.imageId);\n let origin = imagePlaneModule.imagePositionPatient;\n\n if (origin == null) {\n origin = [0, 0, 0];\n }\n\n this._imageData.setOrigin(origin);\n\n // Update the pixel data in the vtkImageData object with the pixelData\n // from the loaded Cornerstone image\n this._updatePixelData(image);\n }\n\n private _updatePixelData(image: IImage) {\n const pixelData = image.getPixelData();\n const scalars = this._imageData.getPointData().getScalars();\n const scalarData = scalars.getData() as\n | Uint8Array\n | Float32Array\n | Uint16Array\n | Int16Array;\n\n // if the color image is loaded with CPU previously, it loads it\n // with RGBA, and here we need to remove the A channel from the\n // pixel data.\n if (image.color && image.rgba) {\n const newPixelData = new Uint8Array(image.columns * image.rows * 3);\n for (let i = 0; i < image.columns * image.rows; i++) {\n newPixelData[i * 3] = pixelData[i * 4];\n newPixelData[i * 3 + 1] = pixelData[i * 4 + 1];\n newPixelData[i * 3 + 2] = pixelData[i * 4 + 2];\n }\n // modify the image object to have the correct pixel data for later\n // use.\n image.rgba = false;\n image.getPixelData = () => newPixelData;\n scalarData.set(newPixelData);\n } else {\n scalarData.set(pixelData);\n }\n\n // Trigger modified on the VTK Object so the texture is updated\n // TODO: evaluate directly changing things with texSubImage3D later\n this._imageData.modified();\n }\n\n /**\n * It uses imageLoadPoolManager to add request for the imageId. It loadsAndCache\n * the image and triggers the STACK_NEW_IMAGE when the request successfully retrieves\n * the image. Next, the volume actor gets updated with the new new retrieved image.\n *\n * @param imageId - string representing the imageId\n * @param imageIdIndex - index of the imageId in the imageId list\n */\n private async _loadAndDisplayImage(\n imageId: string,\n imageIdIndex: number\n ): Promise {\n await (this.useCPURendering\n ? this._loadAndDisplayImageCPU(imageId, imageIdIndex)\n : this._loadAndDisplayImageGPU(imageId, imageIdIndex));\n\n return imageId;\n }\n\n private _loadAndDisplayImageCPU(\n imageId: string,\n imageIdIndex: number\n ): Promise {\n return new Promise((resolve, reject) => {\n // 1. Load the image using the Image Loader\n function successCallback(\n image: IImage,\n imageIdIndex: number,\n imageId: string\n ) {\n // Perform this check after the image has finished loading\n // in case the user has already scrolled away to another image.\n // In that case, do not render this image.\n if (this.currentImageIdIndex !== imageIdIndex) {\n return;\n }\n\n const pixelData = image.getPixelData();\n\n // handle the case where the pixelData is a Float32Array\n // CPU path cannot handle it, it should be converted to Uint16Array\n // and via the Modality LUT we can display it properly\n const preScale = image.preScale;\n const scalingParams = preScale?.scalingParameters;\n\n const scaledWithNonIntegers =\n (preScale?.scaled && scalingParams?.rescaleIntercept % 1 !== 0) ||\n scalingParams?.rescaleSlope % 1 !== 0;\n\n if (pixelData instanceof Float32Array && scaledWithNonIntegers) {\n const floatMinMax = {\n min: image.maxPixelValue,\n max: image.minPixelValue,\n };\n const floatRange = Math.abs(floatMinMax.max - floatMinMax.min);\n const intRange = 65535;\n const slope = floatRange / intRange;\n const intercept = floatMinMax.min;\n const numPixels = pixelData.length;\n const intPixelData = new Uint16Array(numPixels);\n\n let min = 65535;\n\n let max = 0;\n\n for (let i = 0; i < numPixels; i++) {\n const rescaledPixel = Math.floor(\n (pixelData[i] - intercept) / slope\n );\n\n intPixelData[i] = rescaledPixel;\n min = Math.min(min, rescaledPixel);\n max = Math.max(max, rescaledPixel);\n }\n\n // reset the properties since basically the image has changed\n image.minPixelValue = min;\n image.maxPixelValue = max;\n image.slope = slope;\n image.intercept = intercept;\n image.getPixelData = () => intPixelData;\n\n image.preScale = {\n ...image.preScale,\n scaled: false,\n };\n }\n\n this._setCSImage(image);\n this.viewportStatus = ViewportStatus.PRE_RENDER;\n\n const eventDetail: EventTypes.StackNewImageEventDetail = {\n image,\n imageId,\n imageIdIndex,\n viewportId: this.id,\n renderingEngineId: this.renderingEngineId,\n };\n\n triggerEvent(this.element, Events.STACK_NEW_IMAGE, eventDetail);\n\n this._updateToDisplayImageCPU(image);\n\n // Todo: trigger an event to allow applications to hook into END of loading state\n // Currently we use loadHandlerManagers for this\n\n // Trigger the image to be drawn on the next animation frame\n this.render();\n\n // Update the viewport's currentImageIdIndex to reflect the newly\n // rendered image\n this.currentImageIdIndex = imageIdIndex;\n resolve(imageId);\n }\n\n function errorCallback(\n error: Error,\n imageIdIndex: number,\n imageId: string\n ) {\n const eventDetail = {\n error,\n imageIdIndex,\n imageId,\n };\n\n if (!this.suppressEvents) {\n triggerEvent(eventTarget, Events.IMAGE_LOAD_ERROR, eventDetail);\n }\n\n reject(error);\n }\n\n function sendRequest(imageId, imageIdIndex, options) {\n return loadAndCacheImage(imageId, options).then(\n (image) => {\n successCallback.call(this, image, imageIdIndex, imageId);\n },\n (error) => {\n errorCallback.call(this, error, imageIdIndex, imageId);\n }\n );\n }\n\n const priority = -5;\n const requestType = RequestType.Interaction;\n const additionalDetails = { imageId };\n const options = {\n preScale: {\n enabled: true,\n },\n useRGBA: true,\n };\n\n const eventDetail: EventTypes.PreStackNewImageEventDetail = {\n imageId,\n imageIdIndex,\n viewportId: this.id,\n renderingEngineId: this.renderingEngineId,\n };\n triggerEvent(this.element, Events.PRE_STACK_NEW_IMAGE, eventDetail);\n\n imageLoadPoolManager.addRequest(\n sendRequest.bind(this, imageId, imageIdIndex, options),\n requestType,\n additionalDetails,\n priority\n );\n });\n }\n\n private _loadAndDisplayImageGPU(imageId: string, imageIdIndex: number) {\n return new Promise((resolve, reject) => {\n // 1. Load the image using the Image Loader\n function successCallback(image, imageIdIndex, imageId) {\n // Todo: trigger an event to allow applications to hook into END of loading state\n // Currently we use loadHandlerManagers for this\n // Perform this check after the image has finished loading\n // in case the user has already scrolled away to another image.\n // In that case, do not render this image.\n if (this.currentImageIdIndex !== imageIdIndex) {\n return;\n }\n\n // If Photometric Interpretation is not the same for the next image we are trying to load\n // invalidate the stack to recreate the VTK imageData\n const csImgFrame = this.csImage?.imageFrame;\n const imgFrame = image?.imageFrame;\n\n // if a volume is decached into images then the imageFrame will be undefined\n if (\n csImgFrame?.photometricInterpretation !==\n imgFrame?.photometricInterpretation ||\n this.csImage?.photometricInterpretation !==\n image?.photometricInterpretation\n ) {\n this.stackInvalidated = true;\n }\n\n this._setCSImage(image);\n\n const eventDetail: EventTypes.StackNewImageEventDetail = {\n image,\n imageId,\n imageIdIndex,\n viewportId: this.id,\n renderingEngineId: this.renderingEngineId,\n };\n\n triggerEvent(this.element, Events.STACK_NEW_IMAGE, eventDetail);\n this._updateActorToDisplayImageId(image);\n\n // Trigger the image to be drawn on the next animation frame\n this.render();\n\n // Update the viewport's currentImageIdIndex to reflect the newly\n // rendered image\n this.currentImageIdIndex = imageIdIndex;\n resolve(imageId);\n }\n\n function errorCallback(error, imageIdIndex, imageId) {\n const eventDetail = {\n error,\n imageIdIndex,\n imageId,\n };\n\n triggerEvent(eventTarget, Events.IMAGE_LOAD_ERROR, eventDetail);\n reject(error);\n }\n\n function sendRequest(imageId, imageIdIndex, options) {\n return loadAndCacheImage(imageId, options).then(\n (image) => {\n successCallback.call(this, image, imageIdIndex, imageId);\n },\n (error) => {\n errorCallback.call(this, error, imageIdIndex, imageId);\n }\n );\n }\n\n /**\n * If use16bittexture is specified, the CSWIL will automatically choose the\n * array type when no targetBuffer is provided. When CSWIL is initialized,\n * the use16bit should match the settings of cornerstone3D (either preferSizeOverAccuracy\n * or norm16 textures need to be enabled)\n *\n * If use16bittexture is not specified, we force the Float32Array for now\n */\n const priority = -5;\n const requestType = RequestType.Interaction;\n const additionalDetails = { imageId };\n const options = {\n targetBuffer: {\n type: this.useNativeDataType ? undefined : 'Float32Array',\n },\n preScale: {\n enabled: true,\n },\n useRGBA: false,\n };\n\n const eventDetail: EventTypes.PreStackNewImageEventDetail = {\n imageId,\n imageIdIndex,\n viewportId: this.id,\n renderingEngineId: this.renderingEngineId,\n };\n triggerEvent(this.element, Events.PRE_STACK_NEW_IMAGE, eventDetail);\n\n imageLoadPoolManager.addRequest(\n sendRequest.bind(this, imageId, imageIdIndex, options),\n requestType,\n additionalDetails,\n priority\n );\n });\n }\n\n /**\n * Renders the given Cornerstone image object in the viewport.\n * This method is intended to be used by utilities to render\n * an individual image, rather than by applications that want to display\n * a complete image stack. If you want to load and display a complete\n * image stack, use the setStack method instead of this one.\n *\n * The rendered image will appear in the viewport's element.\n * Use this method if you have other means of loading and the\n * cornerstone image object is already available.\n *\n * If you don't understand the difference between this method and\n * setStack, you probably want to use setStack.\n *\n * @param image - The Cornerstone image object to render.\n */\n public renderImageObject = (image) => {\n this._setCSImage(image);\n\n const renderFn = this.useCPURendering\n ? this._updateToDisplayImageCPU\n : this._updateActorToDisplayImageId;\n\n renderFn.call(this, image);\n };\n\n private _setCSImage = (image) => {\n image.isPreScaled = image.preScale?.scaled;\n this.csImage = image;\n };\n\n private _updateToDisplayImageCPU(image: IImage) {\n const metadata = this._getImageDataMetadata(image) as ImageDataMetaData;\n\n const viewport = getDefaultViewport(\n this.canvas,\n image,\n this.modality,\n this._cpuFallbackEnabledElement.viewport.colormap\n );\n\n const { windowCenter, windowWidth } = viewport.voi;\n this.voiRange = windowLevelUtil.toLowHighRange(windowWidth, windowCenter);\n\n this._cpuFallbackEnabledElement.image = image;\n this._cpuFallbackEnabledElement.metadata = {\n ...metadata,\n };\n this.cpuImagePixelData = image.getPixelData();\n\n const viewportSettingToUse = Object.assign(\n {},\n viewport,\n this._cpuFallbackEnabledElement.viewport\n );\n\n // Important: this.stackInvalidated is different than cpuRenderingInvalidated. The\n // former is being used to maintain the previous state of the viewport\n // in the same stack, the latter is used to trigger drawImageSync\n this._cpuFallbackEnabledElement.viewport = this.stackInvalidated\n ? viewport\n : viewportSettingToUse;\n\n // used the previous state of the viewport, then stackInvalidated is set to false\n this.stackInvalidated = false;\n\n // new viewport is set to the current viewport, then cpuRenderingInvalidated is set to true\n this.cpuRenderingInvalidated = true;\n\n this._cpuFallbackEnabledElement.transform = calculateTransform(\n this._cpuFallbackEnabledElement\n );\n }\n\n /**\n * It updates the volume actor with the retrieved cornerstone image.\n * It first checks if the new image has the same dimensions, spacings, and\n * dimensions of the previous one: 1) If yes, it updates the pixel data 2) if not,\n * it creates a whole new volume actor for the image.\n * Note: Camera gets reset for both situations. Therefore, each image renders at\n * its exact 3D location in the space, and both image and camera moves while scrolling.\n *\n * @param image - Cornerstone image\n * @returns\n */\n private _updateActorToDisplayImageId(image) {\n // This function should do the following:\n // - Get the existing actor's vtkImageData that is being used to render the current image and check if we can reuse the vtkImageData that is in place (i.e. do the image dimensions and data type match?)\n // - If we can reuse it, replace the scalar data under the hood\n // - If we cannot reuse it, create a new actor, remove the old one, and reset the camera\n\n // 2. Check if we can reuse the existing vtkImageData object, if one is present.\n const sameImageData = this._checkVTKImageDataMatchesCornerstoneImage(\n image,\n this._imageData\n );\n\n const activeCamera = this.getRenderer().getActiveCamera();\n\n // Cache camera props so we can trigger one camera changed event after\n // The full transition.\n const previousCameraProps = _cloneDeep(this.getCamera());\n if (sameImageData && !this.stackInvalidated) {\n // 3a. If we can reuse it, replace the scalar data under the hood\n this._updateVTKImageDataFromCornerstoneImage(image);\n\n // Since the 3D location of the imageData is changing as we scroll, we need\n // to modify the camera position to render this properly. However, resetting\n // causes problem related to zoom and pan tools: upon rendering of a new slice\n // the pan and zoom will get reset. To solve this, 1) we store the camera\n // properties related to pan and zoom 2) reset the camera to correctly place\n // it in the space 3) restore the pan, zoom props.\n const cameraProps = this.getCamera();\n\n const panCache = vec3.subtract(\n vec3.create(),\n this.cameraFocalPointOnRender,\n cameraProps.focalPoint\n );\n\n // Reset the camera to point to the new slice location, reset camera doesn't\n // modify the direction of projection and viewUp\n this.resetCameraNoEvent();\n\n // set the flip and view up back to the previous value since the restore camera props\n // rely on the correct flip value\n this.setCameraNoEvent({\n flipHorizontal: previousCameraProps.flipHorizontal,\n flipVertical: previousCameraProps.flipVertical,\n viewUp: previousCameraProps.viewUp,\n });\n\n const { focalPoint } = this.getCamera();\n this.cameraFocalPointOnRender = focalPoint;\n\n // This is necessary to initialize the clipping range and it is not related\n // to our custom slabThickness.\n // @ts-ignore: vtkjs incorrect typing\n activeCamera.setFreezeFocalPoint(true);\n\n // We shouldn't restore the focalPoint, position and parallelScale after reset\n // if it is the first render or we have completely re-created the vtkImageData\n this._restoreCameraProps(\n cameraProps,\n previousCameraProps,\n panCache as Point3\n );\n\n this._setPropertiesFromCache();\n\n return;\n }\n\n const {\n origin,\n direction,\n dimensions,\n spacing,\n numComps,\n imagePixelModule,\n } = this._getImageDataMetadata(image);\n\n // 3b. If we cannot reuse the vtkImageData object (either the first render\n // or the size has changed), create a new one\n this._createVTKImageData({\n origin,\n direction,\n dimensions,\n spacing,\n numComps,\n pixelArray: image.getPixelData(),\n });\n\n // Set the scalar data of the vtkImageData object from the Cornerstone\n // Image's pixel data\n this._updateVTKImageDataFromCornerstoneImage(image);\n\n // Create a VTK Image Slice actor to display the vtkImageData object\n const actor = this.createActorMapper(this._imageData);\n const actors = [];\n actors.push({ uid: this.id, actor });\n this.setActors(actors);\n // Adjusting the camera based on slice axis. this is required if stack\n // contains various image orientations (axial ct, sagittal xray)\n const { viewPlaneNormal, viewUp } = this._getCameraOrientation(direction);\n\n this.setCameraNoEvent({ viewUp, viewPlaneNormal });\n\n // Setting this makes the following comment about resetCameraNoEvent not modifying viewUp true.\n this.initialViewUp = viewUp;\n\n // Reset the camera to point to the new slice location, reset camera doesn't\n // modify the direction of projection and viewUp\n this.resetCameraNoEvent();\n\n this.triggerCameraEvent(this.getCamera(), previousCameraProps);\n\n // This is necessary to initialize the clipping range and it is not related\n // to our custom slabThickness.\n // @ts-ignore: vtkjs incorrect typing\n activeCamera.setFreezeFocalPoint(true);\n\n const monochrome1 =\n imagePixelModule.photometricInterpretation === 'MONOCHROME1';\n\n // invalidate the stack so that we can set the voi range\n this.stackInvalidated = true;\n\n this.setVOI(this._getInitialVOIRange(image), {\n forceRecreateLUTFunction: !!monochrome1,\n });\n\n this.initialInvert = !!monochrome1;\n\n // should carry over the invert color from the previous image if has been applied\n this.setInvertColor(this.invert || this.initialInvert);\n\n // Saving position of camera on render, to cache the panning\n this.cameraFocalPointOnRender = this.getCamera().focalPoint;\n this.stackInvalidated = false;\n\n if (this._publishCalibratedEvent) {\n this.triggerCalibrationEvent();\n }\n }\n\n private _getInitialVOIRange(image: IImage) {\n if (this.voiRange && this.voiUpdatedWithSetProperties) {\n return this.voiRange;\n }\n const { windowCenter, windowWidth } = image;\n\n let voiRange = this._getVOIRangeFromWindowLevel(windowWidth, windowCenter);\n\n // Get the range for the PT since if it is prescaled\n // we set a default range of 0-5\n voiRange = this._getPTPreScaledRange() || voiRange;\n\n return voiRange;\n }\n\n private _getPTPreScaledRange() {\n if (!this._isCurrentImagePTPrescaled()) {\n return undefined;\n }\n\n return this._getDefaultPTPrescaledVOIRange();\n }\n\n private _isCurrentImagePTPrescaled() {\n if (this.modality !== 'PT' || !this.csImage.isPreScaled) {\n return false;\n }\n\n if (!this.csImage.preScale?.scalingParameters?.suvbw) {\n return false;\n }\n\n return true;\n }\n\n private _getDefaultPTPrescaledVOIRange() {\n return { lower: 0, upper: 5 };\n }\n\n private _getVOIRangeFromWindowLevel(\n windowWidth: number | number[],\n windowCenter: number | number[]\n ): { lower: number; upper: number } | undefined {\n let center, width;\n\n if (typeof windowCenter === 'number' && typeof windowWidth === 'number') {\n center = windowCenter;\n width = windowWidth;\n } else if (Array.isArray(windowCenter) && Array.isArray(windowWidth)) {\n center = windowCenter[0];\n width = windowWidth[0];\n }\n\n // If center and width are defined, convert them to low-high range\n if (center !== undefined && width !== undefined) {\n return windowLevelUtil.toLowHighRange(width, center);\n }\n }\n\n /**\n * Loads the image based on the provided imageIdIndex\n * @param imageIdIndex - number represents imageId index\n */\n private async _setImageIdIndex(imageIdIndex: number): Promise {\n if (imageIdIndex >= this.imageIds.length) {\n throw new Error(\n `ImageIdIndex provided ${imageIdIndex} is invalid, the stack only has ${this.imageIds.length} elements`\n );\n }\n\n // Update the state of the viewport to the new imageIdIndex;\n this.currentImageIdIndex = imageIdIndex;\n this.hasPixelSpacing = true;\n this.viewportStatus = ViewportStatus.PRE_RENDER;\n\n // Todo: trigger an event to allow applications to hook into START of loading state\n // Currently we use loadHandlerManagers for this\n const imageId = await this._loadAndDisplayImage(\n this.imageIds[imageIdIndex],\n imageIdIndex\n );\n\n return imageId;\n }\n\n private resetCameraCPU(resetPan, resetZoom) {\n const { image } = this._cpuFallbackEnabledElement;\n\n if (!image) {\n return;\n }\n\n resetCamera(this._cpuFallbackEnabledElement, resetPan, resetZoom);\n\n const { scale } = this._cpuFallbackEnabledElement.viewport;\n\n // canvas center is the focal point\n const { clientWidth, clientHeight } = this.element;\n const center: Point2 = [clientWidth / 2, clientHeight / 2];\n\n const centerWorld = this.canvasToWorldCPU(center);\n\n this.setCameraCPU({\n focalPoint: centerWorld,\n scale,\n });\n }\n\n private resetCameraGPU(resetPan, resetZoom): boolean {\n // Todo: we need to make the rotation a camera properties so that\n // we can reset it there, right now it is not possible to reset the rotation\n // without this\n\n // We do not know the ordering of various flips and rotations that have been applied,\n // so the rotation and flip must be reset together.\n this.setCamera({\n flipHorizontal: false,\n flipVertical: false,\n viewUp: this.initialViewUp,\n });\n\n // For stack Viewport we since we have only one slice\n // it should be enough to reset the camera to the center of the image\n const resetToCenter = true;\n return super.resetCamera(resetPan, resetZoom, resetToCenter);\n }\n\n /**\n * It scrolls the stack of imageIds by the delta amount provided. If the debounce\n * flag is set, it will only scroll the stack if the delta is greater than the\n * debounceThreshold which is 40 milliseconds by default.\n * @param delta - number of indices to scroll, it can be positive or negative\n * @param debounce - whether to debounce the scroll event\n * @param loop - whether to loop the stack\n */\n public scroll(delta: number, debounce = true, loop = false): void {\n const imageIds = this.imageIds;\n\n const currentTargetImageIdIndex = this.targetImageIdIndex;\n const numberOfFrames = imageIds.length;\n\n let newTargetImageIdIndex = currentTargetImageIdIndex + delta;\n newTargetImageIdIndex = Math.max(0, newTargetImageIdIndex);\n\n if (loop) {\n newTargetImageIdIndex = newTargetImageIdIndex % numberOfFrames;\n } else {\n newTargetImageIdIndex = Math.min(\n numberOfFrames - 1,\n newTargetImageIdIndex\n );\n }\n\n this.targetImageIdIndex = newTargetImageIdIndex;\n\n const targetImageId = imageIds[newTargetImageIdIndex];\n\n const imageAlreadyLoaded = cache.isLoaded(targetImageId);\n\n // If image is already cached we want to scroll right away; however, if it is\n // not cached, we can debounce the scroll event to avoid firing multiple scroll\n // events for the images that might happen to be passing by (as a result of infinite\n // scrolling).\n if (imageAlreadyLoaded || !debounce) {\n this.setImageIdIndex(newTargetImageIdIndex);\n } else {\n clearTimeout(this.debouncedTimeout);\n this.debouncedTimeout = window.setTimeout(() => {\n this.setImageIdIndex(newTargetImageIdIndex);\n }, 40);\n }\n\n const eventData: StackViewportScrollEventDetail = {\n newImageIdIndex: newTargetImageIdIndex,\n imageId: targetImageId,\n direction: delta,\n };\n\n if (newTargetImageIdIndex !== currentTargetImageIdIndex) {\n triggerEvent(this.element, Events.STACK_VIEWPORT_SCROLL, eventData);\n }\n }\n\n /**\n * Loads the image based on the provided imageIdIndex. It is an Async function which\n * returns a promise that resolves to the imageId.\n *\n * @param imageIdIndex - number represents imageId index in the list of\n * provided imageIds in setStack\n */\n public async setImageIdIndex(imageIdIndex: number): Promise {\n this._throwIfDestroyed();\n\n // If we are already on this imageId index, stop here\n if (this.currentImageIdIndex === imageIdIndex) {\n return this.getCurrentImageId();\n }\n\n // Otherwise, get the imageId and attempt to display it\n const imageId = this._setImageIdIndex(imageIdIndex);\n\n return imageId;\n }\n\n /**\n * Calibrates the image with new metadata that has been added for imageId. To calibrate\n * a viewport, you should add your calibration data manually to\n * calibratedPixelSpacingMetadataProvider and call viewport.calibrateSpacing\n * for it get applied.\n *\n * @param imageId - imageId to be calibrated\n */\n public calibrateSpacing(imageId: string): void {\n const imageIdIndex = this.getImageIds().indexOf(imageId);\n this.stackInvalidated = true;\n this._loadAndDisplayImage(imageId, imageIdIndex);\n }\n\n /**\n * Restores the camera props such zooming and panning after an image is\n * changed, if needed (after scroll)\n *\n * @param parallelScale - camera parallel scale\n */\n private _restoreCameraProps(\n { parallelScale: prevScale }: ICamera,\n previousCamera: ICamera,\n panCache: Point3\n ): void {\n const renderer = this.getRenderer();\n\n // get the focalPoint and position after the reset\n const { position, focalPoint } = this.getCamera();\n\n const newPosition = vec3.subtract(vec3.create(), position, panCache);\n const newFocal = vec3.subtract(vec3.create(), focalPoint, panCache);\n\n // Restoring previous state x,y and scale, keeping the new z\n // we need to break the flip operations since they also work on the\n // camera position and focal point\n this.setCameraNoEvent({\n parallelScale: prevScale,\n position: newPosition as Point3,\n focalPoint: newFocal as Point3,\n });\n\n const camera = this.getCamera();\n\n this.triggerCameraEvent(camera, previousCamera);\n\n // Invoking render\n const RESET_CAMERA_EVENT = {\n type: 'ResetCameraEvent',\n renderer,\n };\n\n renderer.invokeEvent(RESET_CAMERA_EVENT);\n }\n\n private triggerCameraEvent(camera: ICamera, previousCamera: ICamera) {\n // Finally emit event for the full camera change cause during load image.\n const eventDetail: EventTypes.CameraModifiedEventDetail = {\n previousCamera,\n camera,\n element: this.element,\n viewportId: this.id,\n renderingEngineId: this.renderingEngineId,\n };\n\n if (!this.suppressEvents) {\n // For crosshairs to adapt to new viewport size\n triggerEvent(this.element, Events.CAMERA_MODIFIED, eventDetail);\n }\n }\n\n private triggerCalibrationEvent() {\n // Update the indexToWorld and WorldToIndex for viewport\n const { imageData } = this.getImageData();\n // Finally emit event for the full camera change cause during load image.\n const eventDetail: EventTypes.ImageSpacingCalibratedEventDetail = {\n element: this.element,\n viewportId: this.id,\n renderingEngineId: this.renderingEngineId,\n imageId: this.getCurrentImageId(),\n // Todo: why do we need to pass imageData? isn't' indexToWorld and worldToIndex enough?\n imageData: imageData as vtkImageData,\n worldToIndex: imageData.getWorldToIndex() as mat4,\n ...this._calibrationEvent,\n };\n\n if (!this.suppressEvents) {\n // Let the tools know the image spacing has been calibrated\n triggerEvent(this.element, Events.IMAGE_SPACING_CALIBRATED, eventDetail);\n }\n\n this._publishCalibratedEvent = false;\n }\n\n private canvasToWorldCPU = (canvasPos: Point2): Point3 => {\n if (!this._cpuFallbackEnabledElement.image) {\n return;\n }\n // compute the pixel coordinate in the image\n const [px, py] = canvasToPixel(this._cpuFallbackEnabledElement, canvasPos);\n\n // convert pixel coordinate to world coordinate\n const { origin, spacing, direction } = this.getImageData();\n\n const worldPos = vec3.fromValues(0, 0, 0);\n\n // Calculate size of spacing vector in normal direction\n const iVector = direction.slice(0, 3) as Point3;\n const jVector = direction.slice(3, 6) as Point3;\n\n // Calculate the world coordinate of the pixel\n vec3.scaleAndAdd(worldPos, origin, iVector, px * spacing[0]);\n vec3.scaleAndAdd(worldPos, worldPos, jVector, py * spacing[1]);\n\n return [worldPos[0], worldPos[1], worldPos[2]] as Point3;\n };\n\n private worldToCanvasCPU = (worldPos: Point3): Point2 => {\n // world to pixel\n const { spacing, direction, origin } = this.getImageData();\n\n const iVector = direction.slice(0, 3) as Point3;\n const jVector = direction.slice(3, 6) as Point3;\n\n const diff = vec3.subtract(vec3.create(), worldPos, origin);\n\n const worldPoint: Point2 = [\n vec3.dot(diff, iVector) / spacing[0],\n vec3.dot(diff, jVector) / spacing[1],\n ];\n\n // pixel to canvas\n const canvasPoint = pixelToCanvas(\n this._cpuFallbackEnabledElement,\n worldPoint\n );\n return canvasPoint;\n };\n\n private canvasToWorldGPU = (canvasPos: Point2): Point3 => {\n const renderer = this.getRenderer();\n\n // Temporary setting the clipping range to the distance and distance + 0.1\n // in order to calculate the transformations correctly.\n // This is similar to the vtkSlabCamera isPerformingCoordinateTransformations\n // You can read more about it here there.\n const vtkCamera = this.getVtkActiveCamera();\n const crange = vtkCamera.getClippingRange();\n const distance = vtkCamera.getDistance();\n\n vtkCamera.setClippingRange(distance, distance + 0.1);\n\n const offscreenMultiRenderWindow =\n this.getRenderingEngine().offscreenMultiRenderWindow;\n const openGLRenderWindow =\n offscreenMultiRenderWindow.getOpenGLRenderWindow();\n const size = openGLRenderWindow.getSize();\n\n const devicePixelRatio = window.devicePixelRatio || 1;\n const canvasPosWithDPR = [\n canvasPos[0] * devicePixelRatio,\n canvasPos[1] * devicePixelRatio,\n ];\n const displayCoord = [\n canvasPosWithDPR[0] + this.sx,\n canvasPosWithDPR[1] + this.sy,\n ];\n\n // The y axis display coordinates are inverted with respect to canvas coords\n displayCoord[1] = size[1] - displayCoord[1];\n\n const worldCoord = openGLRenderWindow.displayToWorld(\n displayCoord[0],\n displayCoord[1],\n 0,\n renderer\n );\n\n // set clipping range back to original to be able\n vtkCamera.setClippingRange(crange[0], crange[1]);\n\n return [worldCoord[0], worldCoord[1], worldCoord[2]];\n };\n\n private worldToCanvasGPU = (worldPos: Point3): Point2 => {\n const renderer = this.getRenderer();\n\n // Temporary setting the clipping range to the distance and distance + 0.1\n // in order to calculate the transformations correctly.\n // This is similar to the vtkSlabCamera isPerformingCoordinateTransformations\n // You can read more about it here there.\n const vtkCamera = this.getVtkActiveCamera();\n const crange = vtkCamera.getClippingRange();\n const distance = vtkCamera.getDistance();\n\n vtkCamera.setClippingRange(distance, distance + 0.1);\n\n const offscreenMultiRenderWindow =\n this.getRenderingEngine().offscreenMultiRenderWindow;\n const openGLRenderWindow =\n offscreenMultiRenderWindow.getOpenGLRenderWindow();\n const size = openGLRenderWindow.getSize();\n const displayCoord = openGLRenderWindow.worldToDisplay(\n ...worldPos,\n renderer\n );\n\n // The y axis display coordinates are inverted with respect to canvas coords\n displayCoord[1] = size[1] - displayCoord[1];\n\n const canvasCoord = [\n displayCoord[0] - this.sx,\n displayCoord[1] - this.sy,\n ];\n\n // set clipping range back to original to be able\n vtkCamera.setClippingRange(crange[0], crange[1]);\n\n const devicePixelRatio = window.devicePixelRatio || 1;\n const canvasCoordWithDPR = [\n canvasCoord[0] / devicePixelRatio,\n canvasCoord[1] / devicePixelRatio,\n ];\n\n return canvasCoordWithDPR;\n };\n\n private _getVOIRangeForCurrentImage() {\n const { windowCenter, windowWidth } = this.csImage;\n\n return this._getVOIRangeFromWindowLevel(windowWidth, windowCenter);\n }\n\n private _getValidVOILUTFunction(voiLUTFunction: any) {\n if (Object.values(VOILUTFunctionType).indexOf(voiLUTFunction) === -1) {\n voiLUTFunction = VOILUTFunctionType.LINEAR;\n }\n return voiLUTFunction;\n }\n\n /**\n * Returns the index of the imageId being renderer\n *\n * @returns currently shown imageId index\n */\n public getCurrentImageIdIndex = (): number => {\n return this.currentImageIdIndex;\n };\n\n /**\n *\n * Returns the imageIdIndex that is targeted to be loaded, in case of debounced\n * loading (with scroll), the targetImageIdIndex is the latest imageId\n * index that is requested to be loaded but debounced.\n */\n public getTargetImageIdIndex = (): number => {\n return this.targetImageIdIndex;\n };\n\n /**\n * Returns the list of image Ids for the current viewport\n * @returns list of strings for image Ids\n */\n public getImageIds = (): Array => {\n return this.imageIds;\n };\n\n /**\n * Returns the currently rendered imageId\n * @returns string for imageId\n */\n public getCurrentImageId = (): string => {\n return this.imageIds[this.currentImageIdIndex];\n };\n\n /**\n * Returns true if the viewport contains the given imageId\n * @param imageId - imageId\n * @returns boolean if imageId is in viewport\n */\n public hasImageId = (imageId: string): boolean => {\n return this.imageIds.includes(imageId);\n };\n\n /**\n * Returns true if the viewport contains the given imageURI (no data loader scheme)\n * @param imageURI - imageURI\n * @returns boolean if imageURI is in viewport\n */\n public hasImageURI = (imageURI: string): boolean => {\n const imageIds = this.imageIds;\n for (let i = 0; i < imageIds.length; i++) {\n if (imageIdToURI(imageIds[i]) === imageURI) {\n return true;\n }\n }\n\n return false;\n };\n\n private getCPUFallbackError(method: string): Error {\n return new Error(\n `method ${method} cannot be used during CPU Fallback mode`\n );\n }\n\n private fillWithBackgroundColor() {\n const renderingEngine = this.getRenderingEngine();\n\n if (renderingEngine) {\n renderingEngine.fillCanvasWithBackgroundColor(\n this.canvas,\n this.options.background\n );\n }\n }\n\n public customRenderViewportToCanvas = () => {\n if (!this.useCPURendering) {\n throw new Error(\n 'Custom cpu rendering pipeline should only be hit in CPU rendering mode'\n );\n }\n\n if (this._cpuFallbackEnabledElement.image) {\n drawImageSync(\n this._cpuFallbackEnabledElement,\n this.cpuRenderingInvalidated\n );\n // reset flags\n this.cpuRenderingInvalidated = false;\n } else {\n this.fillWithBackgroundColor();\n }\n\n return {\n canvas: this.canvas,\n element: this.element,\n viewportId: this.id,\n renderingEngineId: this.renderingEngineId,\n viewportStatus: this.viewportStatus,\n };\n };\n\n private unsetColormapCPU() {\n delete this._cpuFallbackEnabledElement.viewport.colormap;\n this._cpuFallbackEnabledElement.renderingTools = {};\n\n this.cpuRenderingInvalidated = true;\n\n this.fillWithBackgroundColor();\n\n this.render();\n }\n\n private setColormapCPU(colormapData: CPUFallbackColormapData) {\n const colormap = getColormap(colormapData.name, colormapData);\n\n this._cpuFallbackEnabledElement.viewport.colormap = colormap;\n this._cpuFallbackEnabledElement.renderingTools = {};\n\n this.fillWithBackgroundColor();\n this.cpuRenderingInvalidated = true;\n\n this.render();\n }\n\n private setColormapGPU(colormap: ColormapRegistration) {\n const ActorEntry = this.getDefaultActor();\n const actor = ActorEntry.actor as ImageActor;\n const actorProp = actor.getProperty();\n const rgbTransferFunction = actorProp.getRGBTransferFunction();\n\n if (!rgbTransferFunction) {\n const cfun = vtkColorTransferFunction.newInstance();\n const voiRange = this._getVOIRangeForCurrentImage();\n cfun.applyColorMap(colormap);\n cfun.setMappingRange(voiRange.lower, voiRange.upper);\n actorProp.setRGBTransferFunction(0, cfun);\n } else {\n rgbTransferFunction.applyColorMap(colormap);\n actorProp.setRGBTransferFunction(0, rgbTransferFunction);\n }\n\n this.render();\n }\n\n private unsetColormapGPU() {\n // TODO -> vtk has full colormaps which are piecewise and frankly better?\n // Do we really want a pre defined 256 color map just for the sake of harmonization?\n throw new Error('unsetColormapGPU not implemented.');\n }\n\n // create default values for imagePlaneModule if values are undefined\n private _getImagePlaneModule(imageId: string): ImagePlaneModule {\n const imagePlaneModule = metaData.get('imagePlaneModule', imageId);\n\n const calibratedPixelSpacing = metaData.get(\n 'calibratedPixelSpacing',\n imageId\n );\n\n this.calibration ||= imagePlaneModule.calibration;\n\n const newImagePlaneModule: ImagePlaneModule = {\n ...imagePlaneModule,\n };\n\n if (!newImagePlaneModule.columnPixelSpacing) {\n newImagePlaneModule.columnPixelSpacing = 1;\n this.hasPixelSpacing = this.calibration?.scale > 0;\n }\n\n if (!newImagePlaneModule.rowPixelSpacing) {\n newImagePlaneModule.rowPixelSpacing = 1;\n this.hasPixelSpacing = this.calibration?.scale > 0;\n }\n\n if (!newImagePlaneModule.columnCosines) {\n newImagePlaneModule.columnCosines = [0, 1, 0];\n }\n\n if (!newImagePlaneModule.rowCosines) {\n newImagePlaneModule.rowCosines = [1, 0, 0];\n }\n\n if (!newImagePlaneModule.imagePositionPatient) {\n newImagePlaneModule.imagePositionPatient = [0, 0, 0];\n }\n\n if (!newImagePlaneModule.imageOrientationPatient) {\n newImagePlaneModule.imageOrientationPatient = new Float32Array([\n 1, 0, 0, 0, 1, 0,\n ]);\n }\n\n return newImagePlaneModule;\n }\n\n private renderingPipelineFunctions = {\n getImageData: {\n cpu: this.getImageDataCPU,\n gpu: this.getImageDataGPU,\n },\n setColormap: {\n cpu: this.setColormapCPU,\n gpu: this.setColormapGPU,\n },\n getCamera: {\n cpu: this.getCameraCPU,\n gpu: super.getCamera,\n },\n setCamera: {\n cpu: this.setCameraCPU,\n gpu: super.setCamera,\n },\n setVOI: {\n cpu: this.setVOICPU,\n gpu: this.setVOIGPU,\n },\n getRotation: {\n cpu: this.getRotationCPU,\n gpu: this.getRotationGPU,\n },\n setInterpolationType: {\n cpu: this.setInterpolationTypeCPU,\n gpu: this.setInterpolationTypeGPU,\n },\n setInvertColor: {\n cpu: this.setInvertColorCPU,\n gpu: this.setInvertColorGPU,\n },\n resetCamera: {\n cpu: (resetPan = true, resetZoom = true): boolean => {\n this.resetCameraCPU(resetPan, resetZoom);\n return true;\n },\n gpu: (resetPan = true, resetZoom = true): boolean => {\n this.resetCameraGPU(resetPan, resetZoom);\n return true;\n },\n },\n canvasToWorld: {\n cpu: this.canvasToWorldCPU,\n gpu: this.canvasToWorldGPU,\n },\n worldToCanvas: {\n cpu: this.worldToCanvasCPU,\n gpu: this.worldToCanvasGPU,\n },\n getRenderer: {\n cpu: () => this.getCPUFallbackError('getRenderer'),\n gpu: super.getRenderer,\n },\n getDefaultActor: {\n cpu: () => this.getCPUFallbackError('getDefaultActor'),\n gpu: super.getDefaultActor,\n },\n getActors: {\n cpu: () => this.getCPUFallbackError('getActors'),\n gpu: super.getActors,\n },\n getActor: {\n cpu: () => this.getCPUFallbackError('getActor'),\n gpu: super.getActor,\n },\n setActors: {\n cpu: () => this.getCPUFallbackError('setActors'),\n gpu: super.setActors,\n },\n addActors: {\n cpu: () => this.getCPUFallbackError('addActors'),\n gpu: super.addActors,\n },\n addActor: {\n cpu: () => this.getCPUFallbackError('addActor'),\n gpu: super.addActor,\n },\n removeAllActors: {\n cpu: () => this.getCPUFallbackError('removeAllActors'),\n gpu: super.removeAllActors,\n },\n unsetColormap: {\n cpu: this.unsetColormapCPU,\n gpu: this.unsetColormapGPU,\n },\n };\n}\n\nexport default StackViewport;\n","import { CPUFallbackViewport, Point2 } from '../../../../types';\n\ntype Shift = {\n x: number;\n y: number;\n};\n/**\n * Corrects the shift by accounting for viewport rotation and flips.\n *\n * @param shift - The shift to correct.\n * @param viewportOrientation - Object containing information on the viewport orientation.\n */\nexport default function (\n shift: Shift,\n viewportOrientation: CPUFallbackViewport\n): Shift {\n const { hflip, vflip, rotation } = viewportOrientation;\n\n // Apply Flips\n shift.x *= hflip ? -1 : 1;\n shift.y *= vflip ? -1 : 1;\n\n // Apply rotations\n if (rotation !== 0) {\n const angle = (rotation * Math.PI) / 180;\n\n const cosA = Math.cos(angle);\n const sinA = Math.sin(angle);\n\n const newX = shift.x * cosA - shift.y * sinA;\n const newY = shift.x * sinA + shift.y * cosA;\n\n shift.x = newX;\n shift.y = newY;\n }\n\n return shift;\n}\n","import getImageFitScale from './getImageFitScale';\nimport { CPUFallbackEnabledElement } from '../../../../types';\n\n/**\n * Resets the camera to the default position. which would be the center of the image.\n * with no translation, no flipping, no zoom and proper scale.\n */\nexport default function (\n enabledElement: CPUFallbackEnabledElement,\n resetPan = true,\n resetZoom = true\n): void {\n const { canvas, image, viewport } = enabledElement;\n const scale = getImageFitScale(canvas, image, 0).scaleFactor;\n\n viewport.vflip = false;\n viewport.hflip = false;\n\n if (resetPan) {\n viewport.translation.x = 0;\n viewport.translation.y = 0;\n }\n\n if (resetZoom) {\n viewport.displayedArea.tlhc.x = 1;\n viewport.displayedArea.tlhc.y = 1;\n viewport.displayedArea.brhc.x = image.columns;\n viewport.displayedArea.brhc.y = image.rows;\n\n viewport.scale = scale;\n }\n}\n","import { BlendModes, OrientationAxis } from '../enums';\nimport type { ViewportInput } from '../types/IViewport';\nimport BaseVolumeViewport from './BaseVolumeViewport';\n\n/**\n * An object representing a 3-dimensional volume viewport. VolumeViewport3Ds are used to render\n * 3D volumes in their entirety, and not just load a single slice at a time.\n *\n * For setting volumes on viewports you need to use {@link addVolumesToViewports}\n * which will add volumes to the specified viewports.\n */\nclass VolumeViewport3D extends BaseVolumeViewport {\n constructor(props: ViewportInput) {\n super(props);\n\n const { parallelProjection, orientation } = this.options;\n\n const activeCamera = this.getVtkActiveCamera();\n\n if (parallelProjection != null) {\n activeCamera.setParallelProjection(parallelProjection);\n }\n\n if (orientation && orientation !== OrientationAxis.ACQUISITION) {\n this.applyViewOrientation(orientation);\n }\n }\n\n public resetCamera(\n resetPan = true,\n resetZoom = true,\n resetToCenter = true\n ): boolean {\n super.resetCamera(resetPan, resetZoom, resetToCenter);\n this.resetVolumeViewportClippingRange();\n return;\n }\n\n getRotation = (): number => 0;\n\n getCurrentImageIdIndex = (): number | undefined => {\n return undefined;\n };\n\n getCurrentImageId = (): string => {\n return null;\n };\n\n setSlabThickness(\n slabThickness: number,\n filterActorUIDs?: Array\n ): void {\n return null;\n }\n\n setBlendMode(\n blendMode: BlendModes,\n filterActorUIDs?: string[],\n immediate?: boolean\n ): void {\n return null;\n }\n\n resetProperties(volumeId?: string): void {\n return null;\n }\n}\n\nexport default VolumeViewport3D;\n","// TODO -> Eventually we'll need to register to this list\nimport StackViewport from '../StackViewport';\nimport VolumeViewport from '../VolumeViewport';\nimport ViewportType from '../../enums/ViewportType';\nimport VolumeViewport3D from '../VolumeViewport3D';\n\nconst viewportTypeToViewportClass = {\n [ViewportType.ORTHOGRAPHIC]: VolumeViewport,\n [ViewportType.PERSPECTIVE]: VolumeViewport,\n [ViewportType.STACK]: StackViewport,\n [ViewportType.VOLUME_3D]: VolumeViewport3D,\n};\n\nexport default viewportTypeToViewportClass;\n","import viewportTypeToViewportClass from './viewportTypeToViewportClass';\n\nexport default function viewportTypeUsesCustomRenderingPipeline(\n viewportType: string\n) {\n return viewportTypeToViewportClass[viewportType].useCustomRenderingPipeline;\n}\n","import Events from '../enums/Events';\nimport renderingEngineCache from './renderingEngineCache';\nimport eventTarget from '../eventTarget';\nimport { triggerEvent, uuidv4 } from '../utilities';\nimport { vtkOffscreenMultiRenderWindow } from './vtkClasses';\nimport ViewportType from '../enums/ViewportType';\nimport VolumeViewport from './VolumeViewport';\nimport BaseVolumeViewport from './BaseVolumeViewport';\nimport StackViewport from './StackViewport';\nimport viewportTypeUsesCustomRenderingPipeline from './helpers/viewportTypeUsesCustomRenderingPipeline';\nimport getOrCreateCanvas from './helpers/getOrCreateCanvas';\nimport { getShouldUseCPURendering, isCornerstoneInitialized } from '../init';\nimport type IStackViewport from '../types/IStackViewport';\nimport type IRenderingEngine from '../types/IRenderingEngine';\nimport type IVolumeViewport from '../types/IVolumeViewport';\nimport type * as EventTypes from '../types/EventTypes';\nimport type {\n ViewportInput,\n PublicViewportInput,\n InternalViewportInput,\n NormalizedViewportInput,\n} from '../types/IViewport';\nimport { OrientationAxis, ViewportStatus } from '../enums';\nimport VolumeViewport3D from './VolumeViewport3D';\n\ntype ViewportDisplayCoords = {\n sxStartDisplayCoords: number;\n syStartDisplayCoords: number;\n sxEndDisplayCoords: number;\n syEndDisplayCoords: number;\n sx: number;\n sy: number;\n sWidth: number;\n sHeight: number;\n};\n\n// Rendering engines seem to not like rendering things less than 2 pixels per side\nconst VIEWPORT_MIN_SIZE = 2;\n\n/**\n * A RenderingEngine takes care of the full pipeline of creating viewports and rendering\n * them on a large offscreen canvas and transmitting this data back to the screen. This allows us\n * to leverage the power of vtk.js whilst only using one WebGL context for the processing, and allowing\n * us to share texture memory across on-screen viewports that show the same data.\n *\n * Instantiating a rendering engine:\n * ```js\n * const renderingEngine = new RenderingEngine('pet-ct-rendering-engine');\n * ```\n *\n * There are various ways you can trigger a render on viewports. The simplest is to call `render()`\n * on the rendering engine; however, it will trigger a render on all viewports. A more efficient\n * way to do this is to call `renderViewports([viewportId])` on the rendering engine to\n * trigger a render on a specific viewport(s). Each viewport also has a `.render` method which can be used to trigger a render on that\n * viewport.\n *\n *\n * Rendering engine uses `detect-gpu` external library to detect if GPU is available and\n * it has minimum requirement to be able to render a volume with vtk.js. If GPU is not available\n * RenderingEngine will throw an error if you try to render a volume; however, for StackViewports\n * it is capable of falling back to CPU rendering for Stack images.\n *\n * By default RenderingEngine will use vtk.js enabled pipeline for rendering viewports,\n * however, if a custom rendering pipeline is specified by a custom viewport, it will be used instead.\n * We use this custom pipeline to render a StackViewport on CPU using Cornerstone-legacy cpu rendering pipeline.\n *\n * @public\n */\nclass RenderingEngine implements IRenderingEngine {\n /** Unique identifier for renderingEngine */\n readonly id: string;\n /** A flag which tells if the renderingEngine has been destroyed */\n public hasBeenDestroyed: boolean;\n public offscreenMultiRenderWindow: any;\n readonly offScreenCanvasContainer: any; // WebGL\n private _viewports: Map;\n private _needsRender: Set = new Set();\n private _animationFrameSet = false;\n private _animationFrameHandle: number | null = null;\n private useCPURendering: boolean;\n\n /**\n * @param uid - Unique identifier for RenderingEngine\n */\n constructor(id?: string) {\n this.id = id ? id : uuidv4();\n this.useCPURendering = getShouldUseCPURendering();\n\n renderingEngineCache.set(this);\n\n if (!isCornerstoneInitialized()) {\n throw new Error(\n '@cornerstonejs/core is not initialized, run init() first'\n );\n }\n\n if (!this.useCPURendering) {\n this.offscreenMultiRenderWindow =\n vtkOffscreenMultiRenderWindow.newInstance();\n this.offScreenCanvasContainer = document.createElement('div');\n this.offscreenMultiRenderWindow.setContainer(\n this.offScreenCanvasContainer\n );\n }\n\n this._viewports = new Map();\n this.hasBeenDestroyed = false;\n }\n\n /**\n * Enables the requested viewport and add it to the viewports. It will\n * properly create the Stack viewport or Volume viewport:\n *\n * 1) Checks if the viewport is defined already, if yes, remove it first\n * 2) Checks if the viewport is using a custom rendering pipeline, if no,\n * it calculates a new offscreen canvas with the new requested viewport\n * 3) Adds the viewport\n *\n *\n * ```\n * renderingEngine.enableElement({\n * viewportId: viewportId,\n * type: ViewportType.ORTHOGRAPHIC,\n * element,\n * defaultOptions: {\n * orientation: Enums.OrientationAxis.AXIAL,\n * background: [1, 0, 1],\n * },\n * })\n * ```\n *\n * @fires Events.ELEMENT_ENABLED\n *\n * @param viewportInputEntry - viewport specifications\n */\n public enableElement(viewportInputEntry: PublicViewportInput): void {\n const viewportInput = this._normalizeViewportInputEntry(viewportInputEntry);\n\n this._throwIfDestroyed();\n const { element, viewportId } = viewportInput;\n\n // Throw error if no canvas\n if (!element) {\n throw new Error('No element provided');\n }\n\n // 1. Get the viewport from the list of available viewports.\n const viewport = this.getViewport(viewportId);\n\n // 1.a) If there is a found viewport, we remove the viewport and create a new viewport\n if (viewport) {\n console.log('Viewport already exists, disabling it first');\n this.disableElement(viewportId);\n console.log(`Viewport ${viewportId} disabled`);\n }\n\n // 2.a) See if viewport uses a custom rendering pipeline.\n const { type } = viewportInput;\n\n const viewportUsesCustomRenderingPipeline =\n viewportTypeUsesCustomRenderingPipeline(type);\n\n // 2.b) Retrieving the list of viewports for calculation of the new size for\n // offScreen canvas.\n\n // If the viewport being added uses a custom pipeline, or we aren't using\n // GPU rendering, we don't need to resize the offscreen canvas.\n if (!this.useCPURendering && !viewportUsesCustomRenderingPipeline) {\n this.enableVTKjsDrivenViewport(viewportInput);\n } else {\n // 3 Add the requested viewport to rendering Engine\n this.addCustomViewport(viewportInput);\n }\n\n // 5. Set the background color for the canvas\n const canvas = getOrCreateCanvas(element);\n const { background } = viewportInput.defaultOptions;\n this.fillCanvasWithBackgroundColor(canvas, background);\n }\n\n /**\n * Disables the requested viewportId from the rendering engine:\n *\n * 1) It removes the viewport from the the list of viewports\n * 2) remove the renderer from the offScreen render window if using vtk.js driven\n * rendering pipeline\n * 3) resetting the viewport to remove the canvas attributes and canvas data\n * 4) resize the offScreen appropriately (if using vtk.js driven rendering pipeline)\n *\n * @fires Events.ELEMENT_ENABLED\n *\n * @param viewportId - viewport Id\n *\n */\n public disableElement(viewportId: string): void {\n this._throwIfDestroyed();\n // 1. Getting the viewport to remove it\n const viewport = this.getViewport(viewportId);\n\n // 2 To throw if there is no viewport stored in rendering engine\n if (!viewport) {\n console.warn(`viewport ${viewportId} does not exist`);\n return;\n }\n\n // 3. Reset the viewport to remove attributes, and reset the canvas\n this._resetViewport(viewport);\n\n // 4. Remove the related renderer from the offScreenMultiRenderWindow\n if (\n !viewportTypeUsesCustomRenderingPipeline(viewport.type) &&\n !this.useCPURendering\n ) {\n this.offscreenMultiRenderWindow.removeRenderer(viewportId);\n }\n\n // 5. Remove the requested viewport from the rendering engine\n this._removeViewport(viewportId);\n viewport.isDisabled = true;\n\n // 6. Avoid rendering for the disabled viewport\n this._needsRender.delete(viewportId);\n\n // 7. Clear RAF if no viewport is left\n const viewports = this.getViewports();\n if (!viewports.length) {\n this._clearAnimationFrame();\n }\n\n // 8. Resize the offScreen canvas to accommodate for the new size (after removal)\n // Note: Resize should not reset pan and zoom when disabling an element.\n // This is because we are only resizing the offscreen canvas to deal with the element\n // which was removed, and do not wish to alter the current state of any other currently enabled element\n const immediate = true;\n const keepCamera = true;\n this.resize(immediate, keepCamera);\n }\n\n /**\n * It takes an array of viewport input objects including element, viewportId, type\n * and defaultOptions. It will add the viewport to the rendering engine and enables them.\n *\n *\n * ```typescript\n *renderingEngine.setViewports([\n * {\n * viewportId: axialViewportId,\n * type: ViewportType.ORTHOGRAPHIC,\n * element: document.getElementById('axialDiv'),\n * defaultOptions: {\n * orientation: Enums.OrientationAxis.AXIAL,\n * },\n * },\n * {\n * viewportId: sagittalViewportId,\n * type: ViewportType.ORTHOGRAPHIC,\n * element: document.getElementById('sagittalDiv'),\n * defaultOptions: {\n * orientation: Enums.OrientationAxis.SAGITTAL,\n * },\n * },\n * {\n * viewportId: customOrientationViewportId,\n * type: ViewportType.ORTHOGRAPHIC,\n * element: document.getElementById('customOrientationDiv'),\n * defaultOptions: {\n * orientation: { viewPlaneNormal: [0, 0, 1], viewUp: [0, 1, 0] },\n * },\n * },\n * ])\n * ```\n *\n * @fires Events.ELEMENT_ENABLED\n *\n * @param viewportInputEntries - Array\n */\n\n public setViewports(\n publicViewportInputEntries: Array\n ): void {\n const viewportInputEntries = this._normalizeViewportInputEntries(\n publicViewportInputEntries\n );\n this._throwIfDestroyed();\n this._reset();\n\n // 1. Split viewports based on whether they use vtk.js or a custom pipeline.\n\n const vtkDrivenViewportInputEntries: NormalizedViewportInput[] = [];\n const customRenderingViewportInputEntries: NormalizedViewportInput[] = [];\n\n viewportInputEntries.forEach((vpie) => {\n if (\n !this.useCPURendering &&\n !viewportTypeUsesCustomRenderingPipeline(vpie.type)\n ) {\n vtkDrivenViewportInputEntries.push(vpie);\n } else {\n customRenderingViewportInputEntries.push(vpie);\n }\n });\n\n this.setVtkjsDrivenViewports(vtkDrivenViewportInputEntries);\n this.setCustomViewports(customRenderingViewportInputEntries);\n }\n\n /**\n * Resizes the offscreen viewport and recalculates translations to on screen canvases.\n * It is up to the parent app to call the resize of the on-screen canvas changes.\n * This is left as an app level concern as one might want to debounce the changes, or the like.\n *\n * @param immediate - Whether all of the viewports should be rendered immediately.\n * @param keepCamera - Whether to keep the camera for other viewports while resizing the offscreen canvas\n */\n public resize(immediate = true, keepCamera = true): void {\n this._throwIfDestroyed();\n // 1. Get the viewports' canvases\n const viewports = this._getViewportsAsArray();\n\n const vtkDrivenViewports = [];\n const customRenderingViewports = [];\n\n viewports.forEach((vpie) => {\n if (!viewportTypeUsesCustomRenderingPipeline(vpie.type)) {\n vtkDrivenViewports.push(vpie);\n } else {\n customRenderingViewports.push(vpie);\n }\n });\n\n if (vtkDrivenViewports.length) {\n this._resizeVTKViewports(vtkDrivenViewports, keepCamera, immediate);\n }\n\n if (customRenderingViewports.length) {\n this._resizeUsingCustomResizeHandler(\n customRenderingViewports,\n keepCamera,\n immediate\n );\n }\n }\n\n /**\n * Returns the viewport by Id\n *\n * @returns viewport\n */\n public getViewport(viewportId: string): IStackViewport | IVolumeViewport {\n return this._viewports.get(viewportId);\n }\n\n /**\n * getViewports Returns an array of all `Viewport`s on the `RenderingEngine` instance.\n *\n * @returns Array of viewports\n */\n public getViewports(): Array {\n this._throwIfDestroyed();\n\n return this._getViewportsAsArray();\n }\n\n /**\n * Filters all the available viewports and return the stack viewports\n * @returns stack viewports registered on the rendering Engine\n */\n public getStackViewports(): Array {\n this._throwIfDestroyed();\n\n const viewports = this.getViewports();\n\n const isStackViewport = (\n viewport: IStackViewport | IVolumeViewport\n ): viewport is StackViewport => {\n return viewport instanceof StackViewport;\n };\n\n return viewports.filter(isStackViewport);\n }\n\n /**\n * Return all the viewports that are volume viewports\n * @returns An array of VolumeViewport objects.\n */\n public getVolumeViewports(): Array {\n this._throwIfDestroyed();\n\n const viewports = this.getViewports();\n\n const isVolumeViewport = (\n viewport: IStackViewport | IVolumeViewport\n ): viewport is BaseVolumeViewport => {\n return viewport instanceof BaseVolumeViewport;\n };\n\n return viewports.filter(isVolumeViewport);\n }\n\n /**\n * Renders all viewports on the next animation frame.\n *\n * @fires Events.IMAGE_RENDERED\n */\n public render(): void {\n const viewports = this.getViewports();\n const viewportIds = viewports.map((vp) => vp.id);\n\n this._setViewportsToBeRenderedNextFrame(viewportIds);\n }\n\n /**\n * Renders any viewports viewing the given Frame Of Reference.\n *\n * @param FrameOfReferenceUID - The unique identifier of the\n * Frame Of Reference.\n */\n public renderFrameOfReference = (FrameOfReferenceUID: string): void => {\n const viewports = this._getViewportsAsArray();\n const viewportIdsWithSameFrameOfReferenceUID = viewports.map((vp) => {\n if (vp.getFrameOfReferenceUID() === FrameOfReferenceUID) {\n return vp.id;\n }\n });\n\n return this.renderViewports(viewportIdsWithSameFrameOfReferenceUID);\n };\n\n /**\n * Renders the provided Viewport IDs.\n *\n */\n public renderViewports(viewportIds: Array): void {\n this._setViewportsToBeRenderedNextFrame(viewportIds);\n }\n\n /**\n * Renders only a specific `Viewport` on the next animation frame.\n *\n * @param viewportId - The Id of the viewport.\n */\n public renderViewport(viewportId: string): void {\n this._setViewportsToBeRenderedNextFrame([viewportId]);\n }\n\n /**\n * destroy the rendering engine. It will remove all the viewports and,\n * if the rendering engine is using the GPU, it will also destroy the GPU\n * resources.\n */\n public destroy(): void {\n if (this.hasBeenDestroyed) {\n return;\n }\n\n // remove vtk rendered first before resetting the viewport\n if (!this.useCPURendering) {\n const viewports = this._getViewportsAsArray();\n viewports.forEach((vp) => {\n this.offscreenMultiRenderWindow.removeRenderer(vp.id);\n });\n\n // Free up WebGL resources\n this.offscreenMultiRenderWindow.delete();\n\n // Make sure all references go stale and are garbage collected.\n delete this.offscreenMultiRenderWindow;\n }\n\n this._reset();\n renderingEngineCache.delete(this.id);\n\n this.hasBeenDestroyed = true;\n }\n\n /**\n * Fill the canvas with the background color\n * @param canvas - The canvas element to draw on.\n * @param backgroundColor - An array of three numbers between 0 and 1 that\n * specify the red, green, and blue values of the background color.\n */\n public fillCanvasWithBackgroundColor(\n canvas: HTMLCanvasElement,\n backgroundColor: [number, number, number]\n ): void {\n const ctx = canvas.getContext('2d');\n\n // Default to black if no background color is set\n let fillStyle;\n if (backgroundColor) {\n const rgb = backgroundColor.map((f) => Math.floor(255 * f));\n fillStyle = `rgb(${rgb[0]}, ${rgb[1]}, ${rgb[2]})`;\n } else {\n fillStyle = 'black';\n }\n\n // We draw over the previous stack with the background color while we\n // wait for the next stack to load\n ctx.fillStyle = fillStyle;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n }\n\n private _normalizeViewportInputEntry(\n viewportInputEntry: PublicViewportInput\n ) {\n const { type, defaultOptions } = viewportInputEntry;\n let options = defaultOptions;\n\n if (!options || Object.keys(options).length === 0) {\n options = {\n background: [0, 0, 0],\n orientation: null,\n displayArea: null,\n };\n\n if (type === ViewportType.ORTHOGRAPHIC) {\n options = {\n ...options,\n orientation: OrientationAxis.AXIAL,\n };\n }\n }\n\n return {\n ...viewportInputEntry,\n defaultOptions: options,\n };\n }\n\n private _normalizeViewportInputEntries(\n viewportInputEntries: Array\n ): Array {\n const normalizedViewportInputs = [];\n\n viewportInputEntries.forEach((viewportInput) => {\n normalizedViewportInputs.push(\n this._normalizeViewportInputEntry(viewportInput)\n );\n });\n\n return normalizedViewportInputs;\n }\n\n private _resizeUsingCustomResizeHandler(\n customRenderingViewports: StackViewport[],\n keepCamera = true,\n immediate = true\n ) {\n // 1. If viewport has a custom resize method, call it here.\n customRenderingViewports.forEach((vp) => {\n if (typeof vp.resize === 'function') {\n vp.resize();\n }\n });\n\n // 3. Reset viewport cameras\n customRenderingViewports.forEach((vp) => {\n const prevCamera = vp.getCamera();\n vp.resetCamera();\n\n if (keepCamera) {\n vp.setCamera(prevCamera);\n }\n });\n\n // 2. If render is immediate: Render all\n if (immediate === true) {\n this.render();\n }\n }\n\n private _resizeVTKViewports(\n vtkDrivenViewports: Array,\n keepCamera = true,\n immediate = true\n ) {\n const canvasesDrivenByVtkJs = vtkDrivenViewports.map((vp) => vp.canvas);\n\n if (canvasesDrivenByVtkJs.length) {\n // 1. Recalculate and resize the offscreen canvas size\n const { offScreenCanvasWidth, offScreenCanvasHeight } =\n this._resizeOffScreenCanvas(canvasesDrivenByVtkJs);\n\n // 2. Recalculate the viewports location on the off screen canvas\n this._resize(\n vtkDrivenViewports,\n offScreenCanvasWidth,\n offScreenCanvasHeight\n );\n }\n\n // 3. Reset viewport cameras\n vtkDrivenViewports.forEach((vp: IStackViewport | IVolumeViewport) => {\n const canvas = getOrCreateCanvas(vp.element);\n const rect = canvas.getBoundingClientRect();\n const devicePixelRatio = window.devicePixelRatio || 1;\n canvas.width = rect.width * devicePixelRatio;\n canvas.height = rect.height * devicePixelRatio;\n\n const prevCamera = vp.getCamera();\n vp.resetCamera();\n\n if (keepCamera) {\n vp.setCamera(prevCamera);\n }\n });\n\n // 4. If render is immediate: Render all\n if (immediate === true) {\n this.render();\n }\n }\n\n /**\n * Enables a viewport to be driven by the offscreen vtk.js rendering engine.\n *\n * @param viewportInputEntry - Information object used to\n * construct and enable the viewport.\n */\n private enableVTKjsDrivenViewport(\n viewportInputEntry: NormalizedViewportInput\n ) {\n const viewports = this._getViewportsAsArray();\n const viewportsDrivenByVtkJs = viewports.filter(\n (vp) => viewportTypeUsesCustomRenderingPipeline(vp.type) === false\n );\n\n const canvasesDrivenByVtkJs = viewportsDrivenByVtkJs.map((vp) => vp.canvas);\n\n const canvas = getOrCreateCanvas(viewportInputEntry.element);\n canvasesDrivenByVtkJs.push(canvas);\n\n const devicePixelRatio = window.devicePixelRatio || 1;\n\n const rect = canvas.getBoundingClientRect();\n canvas.width = rect.width * devicePixelRatio;\n canvas.height = rect.height * devicePixelRatio;\n\n // 2.c Calculating the new size for offScreen Canvas\n const { offScreenCanvasWidth, offScreenCanvasHeight } =\n this._resizeOffScreenCanvas(canvasesDrivenByVtkJs);\n\n // 2.d Re-position previous viewports on the offScreen Canvas based on the new\n // offScreen canvas size\n const xOffset = this._resize(\n viewportsDrivenByVtkJs,\n offScreenCanvasWidth,\n offScreenCanvasHeight\n );\n\n const internalViewportEntry = { ...viewportInputEntry, canvas };\n\n // 3 Add the requested viewport to rendering Engine\n this.addVtkjsDrivenViewport(internalViewportEntry, {\n offScreenCanvasWidth,\n offScreenCanvasHeight,\n xOffset,\n });\n }\n\n /**\n * Disables the requested viewportId from the rendering engine:\n * 1) It removes the viewport from the the list of viewports\n * 2) remove the renderer from the offScreen render window\n * 3) resetting the viewport to remove the canvas attributes and canvas data\n * 4) resize the offScreen appropriately\n *\n * @param viewportId - viewport Id\n *\n */\n private _removeViewport(viewportId: string): void {\n // 1. Get the viewport\n const viewport = this.getViewport(viewportId);\n if (!viewport) {\n console.warn(`viewport ${viewportId} does not exist`);\n return;\n }\n\n // 2. Delete the viewports from the the viewports\n this._viewports.delete(viewportId);\n }\n\n /**\n * Adds a viewport driven by vtk.js to the `RenderingEngine`.\n *\n * @param viewportInputEntry - Information object used to construct and enable the viewport.\n * @param options - Options object used to configure the viewport.\n * @param options.offScreenCanvasWidth - The width of the offscreen canvas.\n * @param options.offScreenCanvasHeight - The height of the offscreen canvas.\n * @param options.xOffset - The x offset of the viewport on the offscreen canvas.\n */\n private addVtkjsDrivenViewport(\n viewportInputEntry: InternalViewportInput,\n offscreenCanvasProperties?: {\n offScreenCanvasWidth: number;\n offScreenCanvasHeight: number;\n xOffset: number;\n }\n ): void {\n const { element, canvas, viewportId, type, defaultOptions } =\n viewportInputEntry;\n\n // Make the element not focusable, we use this for modifier keys to work\n element.tabIndex = -1;\n\n const { offScreenCanvasWidth, offScreenCanvasHeight, xOffset } =\n offscreenCanvasProperties;\n\n // 1. Calculate the size of location of the viewport on the offScreen canvas\n const {\n sxStartDisplayCoords,\n syStartDisplayCoords,\n sxEndDisplayCoords,\n syEndDisplayCoords,\n sx,\n sy,\n sWidth,\n sHeight,\n } = this._getViewportCoordsOnOffScreenCanvas(\n viewportInputEntry,\n offScreenCanvasWidth,\n offScreenCanvasHeight,\n xOffset\n );\n\n // 2. Add a renderer to the offScreenMultiRenderWindow\n this.offscreenMultiRenderWindow.addRenderer({\n viewport: [\n sxStartDisplayCoords,\n syStartDisplayCoords,\n sxEndDisplayCoords,\n syEndDisplayCoords,\n ],\n id: viewportId,\n background: defaultOptions.background\n ? defaultOptions.background\n : [0, 0, 0],\n });\n\n // 3. ViewportInput to be passed to a stack/volume viewport\n const viewportInput = {\n id: viewportId,\n element, // div\n renderingEngineId: this.id,\n type,\n canvas,\n sx,\n sy,\n sWidth,\n sHeight,\n defaultOptions: defaultOptions || {},\n };\n\n // 4. Create a proper viewport based on the type of the viewport\n let viewport;\n if (type === ViewportType.STACK) {\n // 4.a Create stack viewport\n viewport = new StackViewport(viewportInput);\n } else if (\n type === ViewportType.ORTHOGRAPHIC ||\n type === ViewportType.PERSPECTIVE\n ) {\n // 4.b Create a volume viewport\n viewport = new VolumeViewport(viewportInput);\n } else if (type === ViewportType.VOLUME_3D) {\n viewport = new VolumeViewport3D(viewportInput);\n } else {\n throw new Error(`Viewport Type ${type} is not supported`);\n }\n\n // 5. Storing the viewports\n this._viewports.set(viewportId, viewport);\n\n const eventDetail: EventTypes.ElementEnabledEventDetail = {\n element,\n viewportId,\n renderingEngineId: this.id,\n };\n\n if (!viewport.suppressEvents) {\n triggerEvent(eventTarget, Events.ELEMENT_ENABLED, eventDetail);\n }\n }\n\n /**\n * Adds a viewport using a custom rendering pipeline to the `RenderingEngine`.\n *\n * @param viewportInputEntry - Information object used to\n * construct and enable the viewport.\n */\n private addCustomViewport(viewportInputEntry: PublicViewportInput): void {\n const { element, viewportId, type, defaultOptions } = viewportInputEntry;\n\n // Make the element not focusable, we use this for modifier keys to work\n element.tabIndex = -1;\n\n const canvas = getOrCreateCanvas(element);\n\n // Add a viewport with no offset\n const { clientWidth, clientHeight } = canvas;\n\n // Set the canvas to be same resolution as the client.\n // Note: This ignores devicePixelRatio for now. We may want to change it in the\n // future but it has no benefit for the Cornerstone CPU rendering pathway at the\n // moment anyway.\n if (canvas.width !== clientWidth || canvas.height !== clientHeight) {\n canvas.width = clientWidth;\n canvas.height = clientHeight;\n }\n\n const viewportInput = {\n id: viewportId,\n renderingEngineId: this.id,\n element, // div\n type,\n canvas,\n sx: 0, // No offset, uses own renderer\n sy: 0,\n sWidth: clientWidth,\n sHeight: clientHeight,\n defaultOptions: defaultOptions || {},\n };\n\n // 4. Create a proper viewport based on the type of the viewport\n\n if (type !== ViewportType.STACK) {\n // In the future these will need to be pluggable, but we aren't there yet\n // and these are just Stacks for now.\n throw new Error('Support for fully custom viewports not yet implemented');\n }\n\n // 4.a Create stack viewport\n const viewport = new StackViewport(viewportInput);\n\n // 5. Storing the viewports\n this._viewports.set(viewportId, viewport);\n\n const eventDetail: EventTypes.ElementEnabledEventDetail = {\n element,\n viewportId,\n renderingEngineId: this.id,\n };\n\n triggerEvent(eventTarget, Events.ELEMENT_ENABLED, eventDetail);\n }\n\n /**\n * Sets multiple viewports using custom rendering\n * pipelines to the `RenderingEngine`.\n *\n * @param viewportInputEntries - An array of information\n * objects used to construct and enable the viewports.\n */\n private setCustomViewports(viewportInputEntries: PublicViewportInput[]) {\n viewportInputEntries.forEach((vpie) => this.addCustomViewport(vpie));\n }\n\n /**\n * Sets multiple vtk.js driven viewports to\n * the `RenderingEngine`.\n *\n * @param viewportInputEntries - An array of information\n * objects used to construct and enable the viewports.\n */\n private setVtkjsDrivenViewports(\n viewportInputEntries: NormalizedViewportInput[]\n ) {\n // Deal with vtkjs driven viewports\n if (viewportInputEntries.length) {\n // 1. Getting all the canvases from viewports calculation of the new offScreen size\n const vtkDrivenCanvases = viewportInputEntries.map((vp) =>\n getOrCreateCanvas(vp.element)\n );\n\n // Ensure the canvas size includes any scaling due to device pixel ratio\n vtkDrivenCanvases.forEach((canvas) => {\n const devicePixelRatio = window.devicePixelRatio || 1;\n\n const rect = canvas.getBoundingClientRect();\n canvas.width = rect.width * devicePixelRatio;\n canvas.height = rect.height * devicePixelRatio;\n });\n\n // 2. Set canvas size based on height and sum of widths\n const { offScreenCanvasWidth, offScreenCanvasHeight } =\n this._resizeOffScreenCanvas(vtkDrivenCanvases);\n\n /*\n TODO: Commenting this out until we can mock the Canvas usage in the tests (or use jsdom?)\n if (!offScreenCanvasWidth || !offScreenCanvasHeight) {\n throw new Error('Invalid offscreen canvas width or height')\n }*/\n\n // 3. Adding the viewports based on the viewportInputEntry definition to the\n // rendering engine.\n let xOffset = 0;\n for (let i = 0; i < viewportInputEntries.length; i++) {\n const vtkDrivenViewportInputEntry = viewportInputEntries[i];\n const canvas = vtkDrivenCanvases[i];\n const internalViewportEntry = {\n ...vtkDrivenViewportInputEntry,\n canvas,\n };\n\n this.addVtkjsDrivenViewport(internalViewportEntry, {\n offScreenCanvasWidth,\n offScreenCanvasHeight,\n xOffset,\n });\n\n // Incrementing the xOffset which provides the horizontal location of each\n // viewport on the offScreen canvas\n xOffset += canvas.width;\n }\n }\n }\n\n /**\n * Resizes the offscreen canvas based on the provided vtk.js driven canvases.\n *\n * @param canvases - An array of HTML Canvas\n */\n private _resizeOffScreenCanvas(\n canvasesDrivenByVtkJs: Array\n ): { offScreenCanvasWidth: number; offScreenCanvasHeight: number } {\n const { offScreenCanvasContainer, offscreenMultiRenderWindow } = this;\n\n const devicePixelRatio = window.devicePixelRatio || 1;\n\n // 1. Calculated the height of the offScreen canvas to be the maximum height\n // between canvases\n const offScreenCanvasHeight = Math.max(\n ...canvasesDrivenByVtkJs.map(\n (canvas) => canvas.clientHeight * devicePixelRatio\n )\n );\n\n // 2. Calculating the width of the offScreen canvas to be the sum of all\n let offScreenCanvasWidth = 0;\n\n canvasesDrivenByVtkJs.forEach((canvas) => {\n offScreenCanvasWidth += canvas.clientWidth * devicePixelRatio;\n });\n\n offScreenCanvasContainer.width = offScreenCanvasWidth;\n offScreenCanvasContainer.height = offScreenCanvasHeight;\n\n // 3. Resize command\n offscreenMultiRenderWindow.resize();\n\n return { offScreenCanvasWidth, offScreenCanvasHeight };\n }\n\n /**\n * Recalculates and updates the viewports location on the offScreen canvas upon its resize\n *\n * @param viewports - An array of viewports\n * @param offScreenCanvasWidth - new offScreen canvas width\n * @param offScreenCanvasHeight - new offScreen canvas height\n *\n * @returns _xOffset the final offset which will be used for the next viewport\n */\n private _resize(\n viewportsDrivenByVtkJs: Array,\n offScreenCanvasWidth: number,\n offScreenCanvasHeight: number\n ): number {\n // Redefine viewport properties\n let _xOffset = 0;\n\n const devicePixelRatio = window.devicePixelRatio || 1;\n\n for (let i = 0; i < viewportsDrivenByVtkJs.length; i++) {\n const viewport = viewportsDrivenByVtkJs[i];\n const {\n sxStartDisplayCoords,\n syStartDisplayCoords,\n sxEndDisplayCoords,\n syEndDisplayCoords,\n sx,\n sy,\n sWidth,\n sHeight,\n } = this._getViewportCoordsOnOffScreenCanvas(\n viewport,\n offScreenCanvasWidth,\n offScreenCanvasHeight,\n _xOffset\n );\n\n _xOffset += viewport.canvas.clientWidth * devicePixelRatio;\n\n viewport.sx = sx;\n viewport.sy = sy;\n viewport.sWidth = sWidth;\n viewport.sHeight = sHeight;\n\n // Updating the renderer for the viewport\n const renderer = this.offscreenMultiRenderWindow.getRenderer(viewport.id);\n renderer.setViewport([\n sxStartDisplayCoords,\n syStartDisplayCoords,\n sxEndDisplayCoords,\n syEndDisplayCoords,\n ]);\n }\n\n // Returns the final xOffset\n return _xOffset;\n }\n\n /**\n * Calculates the location of the provided viewport on the offScreenCanvas\n *\n * @param viewports - An array of viewports\n * @param offScreenCanvasWidth - new offScreen canvas width\n * @param offScreenCanvasHeight - new offScreen canvas height\n * @param _xOffset - xOffSet to draw\n */\n private _getViewportCoordsOnOffScreenCanvas(\n viewport: InternalViewportInput | IStackViewport | IVolumeViewport,\n offScreenCanvasWidth: number,\n offScreenCanvasHeight: number,\n _xOffset: number\n ): ViewportDisplayCoords {\n const { canvas } = viewport;\n const { clientWidth, clientHeight } = canvas;\n const devicePixelRatio = window.devicePixelRatio || 1;\n const height = clientHeight * devicePixelRatio;\n const width = clientWidth * devicePixelRatio;\n\n // Update the canvas drawImage offsets.\n const sx = _xOffset;\n const sy = 0;\n const sWidth = width;\n const sHeight = height;\n\n const sxStartDisplayCoords = sx / offScreenCanvasWidth;\n\n // Need to offset y if it not max height\n const syStartDisplayCoords =\n sy + (offScreenCanvasHeight - height) / offScreenCanvasHeight;\n\n const sWidthDisplayCoords = sWidth / offScreenCanvasWidth;\n const sHeightDisplayCoords = sHeight / offScreenCanvasHeight;\n\n return {\n sxStartDisplayCoords,\n syStartDisplayCoords,\n sxEndDisplayCoords: sxStartDisplayCoords + sWidthDisplayCoords,\n syEndDisplayCoords: syStartDisplayCoords + sHeightDisplayCoords,\n sx,\n sy,\n sWidth,\n sHeight,\n };\n }\n\n /**\n * @method _getViewportsAsArray Returns an array of all viewports\n *\n * @returns {Array} Array of viewports.\n */\n private _getViewportsAsArray() {\n return Array.from(this._viewports.values());\n }\n\n private _setViewportsToBeRenderedNextFrame(viewportIds: string[]) {\n // Add the viewports to the set of flagged viewports\n viewportIds.forEach((viewportId) => {\n this._needsRender.add(viewportId);\n });\n\n // Render any flagged viewports\n this._render();\n }\n\n /**\n * Sets up animation frame if necessary\n */\n private _render() {\n // If we have viewports that need rendering and we have not already\n // set the RAF callback to run on the next frame.\n if (this._needsRender.size > 0 && this._animationFrameSet === false) {\n this._animationFrameHandle = window.requestAnimationFrame(\n this._renderFlaggedViewports\n );\n\n // Set the flag that we have already set up the next RAF call.\n this._animationFrameSet = true;\n }\n }\n\n /**\n * Renders all viewports.\n */\n private _renderFlaggedViewports = () => {\n this._throwIfDestroyed();\n\n if (!this.useCPURendering) {\n this.performVtkDrawCall();\n }\n\n const viewports = this._getViewportsAsArray();\n const eventDetailArray = [];\n\n for (let i = 0; i < viewports.length; i++) {\n const viewport = viewports[i];\n if (this._needsRender.has(viewport.id)) {\n const eventDetail =\n this.renderViewportUsingCustomOrVtkPipeline(viewport);\n eventDetailArray.push(eventDetail);\n viewport.setRendered();\n\n // This viewport has been rendered, we can remove it from the set\n this._needsRender.delete(viewport.id);\n\n // If there is nothing left that is flagged for rendering, stop the loop\n if (this._needsRender.size === 0) {\n break;\n }\n }\n }\n\n // allow RAF to be called again\n this._animationFrameSet = false;\n this._animationFrameHandle = null;\n\n eventDetailArray.forEach((eventDetail) => {\n // Very small viewports won't have an element\n if (!eventDetail?.element) {\n return;\n }\n triggerEvent(eventDetail.element, Events.IMAGE_RENDERED, eventDetail);\n });\n };\n\n /**\n * Performs the single `vtk.js` draw call which is used to render the offscreen\n * canvas for vtk.js. This is a bulk rendering step for all Volume and Stack\n * viewports when GPU rendering is available.\n */\n private performVtkDrawCall() {\n // Render all viewports under vtk.js' control.\n const { offscreenMultiRenderWindow } = this;\n const renderWindow = offscreenMultiRenderWindow.getRenderWindow();\n\n const renderers = offscreenMultiRenderWindow.getRenderers();\n\n if (!renderers.length) {\n return;\n }\n\n for (let i = 0; i < renderers.length; i++) {\n const { renderer, id } = renderers[i];\n\n // Requesting viewports that need rendering to be rendered only\n if (this._needsRender.has(id)) {\n renderer.setDraw(true);\n } else {\n renderer.setDraw(false);\n }\n }\n\n renderWindow.render();\n\n // After redraw we set all renderers to not render until necessary\n for (let i = 0; i < renderers.length; i++) {\n renderers[i].renderer.setDraw(false);\n }\n }\n\n /**\n * Renders the given viewport\n * using its proffered method.\n *\n * @param viewport - The viewport to render\n */\n private renderViewportUsingCustomOrVtkPipeline(\n viewport: IStackViewport | IVolumeViewport\n ): EventTypes.ImageRenderedEventDetail[] {\n let eventDetail;\n\n // Rendering engines start having issues without at least two pixels\n // in each direction\n if (\n viewport.sWidth < VIEWPORT_MIN_SIZE ||\n viewport.sHeight < VIEWPORT_MIN_SIZE\n ) {\n console.log('Viewport is too small', viewport.sWidth, viewport.sHeight);\n return;\n }\n if (viewportTypeUsesCustomRenderingPipeline(viewport.type) === true) {\n eventDetail =\n viewport.customRenderViewportToCanvas() as EventTypes.ImageRenderedEventDetail;\n } else {\n if (this.useCPURendering) {\n throw new Error(\n 'GPU not available, and using a viewport with no custom render pipeline.'\n );\n }\n\n const { offscreenMultiRenderWindow } = this;\n const openGLRenderWindow =\n offscreenMultiRenderWindow.getOpenGLRenderWindow();\n const context = openGLRenderWindow.get3DContext();\n const offScreenCanvas = context.canvas;\n\n eventDetail = this._renderViewportFromVtkCanvasToOnscreenCanvas(\n viewport,\n offScreenCanvas\n );\n }\n\n return eventDetail;\n }\n\n /**\n * Renders a particular `Viewport`'s on screen canvas.\n * @param viewport - The `Viewport` to render.\n * @param offScreenCanvas - The offscreen canvas to render from.\n */\n private _renderViewportFromVtkCanvasToOnscreenCanvas(\n viewport: IStackViewport | IVolumeViewport,\n offScreenCanvas\n ): EventTypes.ImageRenderedEventDetail {\n const {\n element,\n canvas,\n sx,\n sy,\n sWidth,\n sHeight,\n id: viewportId,\n renderingEngineId,\n suppressEvents,\n } = viewport;\n\n const { width: dWidth, height: dHeight } = canvas;\n\n const onScreenContext = canvas.getContext('2d');\n\n onScreenContext.drawImage(\n offScreenCanvas,\n sx,\n sy,\n sWidth,\n sHeight,\n 0, //dx\n 0, // dy\n dWidth,\n dHeight\n );\n\n return {\n element,\n suppressEvents,\n viewportId,\n renderingEngineId,\n viewportStatus: viewport.viewportStatus,\n };\n }\n\n /**\n * Reset the viewport by removing the data attributes\n * and clearing the context of draw. It also emits an element disabled event\n *\n * @param viewport - The `Viewport` to render.\n */\n private _resetViewport(viewport: IStackViewport | IVolumeViewport) {\n const renderingEngineId = this.id;\n\n const { element, canvas, id: viewportId } = viewport;\n\n const eventDetail: EventTypes.ElementDisabledEventDetail = {\n element,\n viewportId,\n renderingEngineId,\n };\n\n // Trigger first before removing the data attributes, as we need the enabled\n // element to remove tools associated with the viewport\n triggerEvent(eventTarget, Events.ELEMENT_DISABLED, eventDetail);\n\n element.removeAttribute('data-viewport-uid');\n element.removeAttribute('data-rendering-engine-uid');\n\n // clear drawing\n const context = canvas.getContext('2d');\n context.clearRect(0, 0, canvas.width, canvas.height);\n }\n\n private _clearAnimationFrame() {\n window.cancelAnimationFrame(this._animationFrameHandle);\n\n this._needsRender.clear();\n this._animationFrameSet = false;\n this._animationFrameHandle = null;\n }\n\n /**\n * Resets the `RenderingEngine`\n */\n private _reset() {\n const viewports = this._getViewportsAsArray();\n\n viewports.forEach((viewport) => {\n this._resetViewport(viewport);\n });\n\n this._clearAnimationFrame();\n\n this._viewports = new Map();\n }\n\n /**\n * Throws an error if trying to interact with the `RenderingEngine`\n * instance after its `destroy` method has been called.\n */\n private _throwIfDestroyed() {\n if (this.hasBeenDestroyed) {\n throw new Error(\n 'this.destroy() has been manually called to free up memory, can not longer use this instance. Instead make a new one.'\n );\n }\n }\n\n // debugging utils for offScreen canvas\n _downloadOffScreenCanvas() {\n const dataURL = this._debugRender();\n _TEMPDownloadURI(dataURL);\n }\n\n // debugging utils for offScreen canvas\n _debugRender(): void {\n const { offscreenMultiRenderWindow } = this;\n const renderWindow = offscreenMultiRenderWindow.getRenderWindow();\n\n const renderers = offscreenMultiRenderWindow.getRenderers();\n\n for (let i = 0; i < renderers.length; i++) {\n renderers[i].renderer.setDraw(true);\n }\n\n renderWindow.render();\n const openGLRenderWindow =\n offscreenMultiRenderWindow.getOpenGLRenderWindow();\n const context = openGLRenderWindow.get3DContext();\n\n const offScreenCanvas = context.canvas;\n const dataURL = offScreenCanvas.toDataURL();\n\n this._getViewportsAsArray().forEach((viewport) => {\n const { sx, sy, sWidth, sHeight } = viewport;\n\n const canvas = viewport.canvas;\n const { width: dWidth, height: dHeight } = canvas;\n\n const onScreenContext = canvas.getContext('2d');\n\n //sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight\n onScreenContext.drawImage(\n offScreenCanvas,\n sx,\n sy,\n sWidth,\n sHeight,\n 0, //dx\n 0, // dy\n dWidth,\n dHeight\n );\n });\n\n return dataURL;\n }\n}\n\nexport default RenderingEngine;\n\n// debugging utils for offScreen canvas\nfunction _TEMPDownloadURI(uri) {\n const link = document.createElement('a');\n\n link.download = 'viewport.png';\n link.href = uri;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n}\n","import RenderingEngine from './RenderingEngine';\nimport getRenderingEngine from './getRenderingEngine';\nimport VolumeViewport from './VolumeViewport';\nimport StackViewport from './StackViewport';\nimport VolumeViewport3D from './VolumeViewport3D';\nimport {\n createVolumeActor,\n createVolumeMapper,\n getOrCreateCanvas,\n} from './helpers';\n\nexport {\n getRenderingEngine,\n RenderingEngine,\n VolumeViewport,\n VolumeViewport3D,\n createVolumeActor,\n createVolumeMapper,\n getOrCreateCanvas,\n StackViewport,\n};\n\nexport default RenderingEngine;\n","import { RequestPoolManager } from './requestPoolManager';\nimport RequestType from '../enums/RequestType';\n\n/**\n * ImageRetrievalPoolManager\n * You don't need to directly use the imageRetrievalPoolManager to load images\n * since the imageLoadPoolManager will automatically use it for retrieval. However,\n * maximum number of concurrent requests can be set by calling `setMaxConcurrentRequests`.\n *\n * Retrieval (usually) === XHR requests\n */\nconst imageRetrievalPoolManager = new RequestPoolManager('imageRetrievalPool');\n\nimageRetrievalPoolManager.setMaxSimultaneousRequests(\n RequestType.Interaction,\n 200\n);\nimageRetrievalPoolManager.setMaxSimultaneousRequests(\n RequestType.Thumbnail,\n 200\n);\nimageRetrievalPoolManager.setMaxSimultaneousRequests(RequestType.Prefetch, 200);\nimageRetrievalPoolManager.grabDelay = 0;\n\nexport default imageRetrievalPoolManager;\n","/*\n * Constants\n */\n\nconst DEFAULT_SETTINGS = Symbol('DefaultSettings');\nconst RUNTIME_SETTINGS = Symbol('RuntimeSettings');\nconst OBJECT_SETTINGS_MAP = Symbol('ObjectSettingsMap');\nconst DICTIONARY = Symbol('Dictionary');\n\n/**\n * Settings\n */\nexport default class Settings {\n constructor(base?: Settings) {\n const dictionary = Object.create(\n base instanceof Settings && DICTIONARY in base ? base[DICTIONARY] : null\n );\n Object.seal(\n Object.defineProperty(this, DICTIONARY, {\n value: dictionary,\n })\n );\n }\n\n set(key: string, value: unknown): boolean {\n return set(this[DICTIONARY], key, value, null);\n }\n\n get(key: string): unknown {\n return get(this[DICTIONARY], key);\n }\n\n /**\n * Unset a specific key or a set of keys within a namespace when the key ends with a dot (ASCII #46).\n * If the key is \".\", all keys will be removed and this command works as a reset.\n * @param key - name The key to be unset or a namespace.\n * @returns boolean\n */\n unset(key: string): boolean {\n return unset(this[DICTIONARY], key + '');\n }\n\n forEach(callback: (key: string, value: unknown) => void): void {\n iterate(this[DICTIONARY], callback);\n }\n\n extend(): Settings {\n return new Settings(this);\n }\n\n /**\n * Recursively import all properties from the given plain JavaScript object.\n * This method has the opposite effect of the `dump` method.\n * @param root - The root object whose properties will\n * be imported.\n */\n import(root: Record): void {\n if (isPlainObject(root)) {\n Object.keys(root).forEach((key) => {\n set(this[DICTIONARY], key, root[key], null);\n });\n }\n }\n\n /**\n * Build a JSON representation of the current internal state of this settings\n * object. The returned object can be safely passed to `JSON.stringify`\n * function.\n * @returns The JSON representation of the current\n * state of this settings instance\n */\n dump(): Record {\n const context = {};\n iterate(this[DICTIONARY], (key, value) => {\n if (typeof value !== 'undefined') {\n deepSet(context, key, value);\n }\n });\n return context;\n }\n\n static assert(subject: Settings): Settings {\n return subject instanceof Settings\n ? subject\n : Settings.getRuntimeSettings();\n }\n\n static getDefaultSettings(subfield = null): Settings | any {\n let defaultSettings = Settings[DEFAULT_SETTINGS];\n if (!(defaultSettings instanceof Settings)) {\n defaultSettings = new Settings();\n Settings[DEFAULT_SETTINGS] = defaultSettings;\n }\n\n // Given subfield of 'segmentation' it will return all settings\n // that starts with segmentation.*\n if (subfield) {\n const settingObj = {};\n defaultSettings.forEach((name: string) => {\n if (name.startsWith(subfield)) {\n const setting = name.split(`${subfield}.`)[1];\n settingObj[setting] = defaultSettings.get(name);\n }\n });\n return settingObj;\n }\n\n return defaultSettings;\n }\n\n static getRuntimeSettings(): Settings {\n let runtimeSettings = Settings[RUNTIME_SETTINGS];\n if (!(runtimeSettings instanceof Settings)) {\n runtimeSettings = new Settings(Settings.getDefaultSettings());\n Settings[RUNTIME_SETTINGS] = runtimeSettings;\n }\n return runtimeSettings;\n }\n\n static getObjectSettings(subject: unknown, from?: unknown): Settings {\n let settings = null;\n if (subject instanceof Settings) {\n settings = subject;\n } else if (typeof subject === 'object' && subject !== null) {\n let objectSettingsMap = Settings[OBJECT_SETTINGS_MAP];\n if (!(objectSettingsMap instanceof WeakMap)) {\n objectSettingsMap = new WeakMap();\n Settings[OBJECT_SETTINGS_MAP] = objectSettingsMap;\n }\n settings = objectSettingsMap.get(subject);\n if (!(settings instanceof Settings)) {\n settings = new Settings(\n Settings.assert(Settings.getObjectSettings(from))\n );\n objectSettingsMap.set(subject, settings);\n }\n }\n return settings;\n }\n\n static extendRuntimeSettings(): Settings {\n return Settings.getRuntimeSettings().extend();\n }\n}\n\n/*\n * Local Helpers\n */\n\nfunction unset(dictionary: Record, name: string): boolean {\n if (name.endsWith('.')) {\n let deleteCount = 0;\n const namespace = name;\n const base = namespace.slice(0, -1);\n const deleteAll = base.length === 0;\n for (const key in dictionary) {\n if (\n Object.prototype.hasOwnProperty.call(dictionary, key) &&\n (deleteAll || key.startsWith(namespace) || key === base)\n ) {\n delete dictionary[key];\n ++deleteCount;\n }\n }\n return deleteCount > 0;\n }\n return delete dictionary[name];\n}\n\nfunction iterate(\n dictionary: Record,\n callback: (key: string, value: unknown) => void\n): void {\n for (const key in dictionary) {\n callback(key, dictionary[key]);\n }\n}\n\nfunction setAll(\n dictionary: Record,\n prefix: string,\n record: Record,\n references: WeakSet>\n): boolean {\n let failCount: number;\n if (references.has(record)) {\n return set(dictionary, prefix, null, references);\n }\n references.add(record);\n failCount = 0;\n for (const field in record) {\n if (Object.prototype.hasOwnProperty.call(record, field)) {\n const key = field.length === 0 ? prefix : `${prefix}.${field}`;\n if (!set(dictionary, key, record[field], references)) {\n ++failCount;\n }\n }\n }\n references.delete(record);\n return failCount === 0;\n}\n\n/**\n * Set the key-value pair on a given dictionary. If the given value is a\n * plain javascript object, every property of that object will also be set.\n * @param dictionary {Record} The target dictionary\n * @param key {string} The given key\n * @param value {unknown} The given value\n * @param references {WeakSet>} references is a WeakSet\n * instance used to keep track of which objects have already been iterated\n * through preventing thus possible stack overflows caused by cyclic references\n * @returns {boolean} Returns true if every given key-value pair has been\n * successfully set\n */\nfunction set(\n dictionary: Record,\n key: string,\n value: unknown,\n references: WeakSet>\n): boolean {\n if (isValidKey(key)) {\n if (isPlainObject(value)) {\n return setAll(\n dictionary,\n key,\n value as Record,\n references instanceof WeakSet ? references : new WeakSet()\n );\n }\n dictionary[key] = value;\n return true;\n }\n return false;\n}\n\nfunction get(dictionary: Record, key: string): unknown {\n return dictionary[key];\n}\n\n/**\n * Make sure the -provided key correctly formatted.\n * e.g.:\n * \"my.cool.property\" (valid)\n * \"my.cool.property.\" (invalid)\n * \".my.cool.property\" (invalid)\n * \"my.cool..property\" (invalid)\n * @param key {string} The property name to be used as key within the internal\n * dictionary\n * @returns {boolean} True on success, false otherwise\n */\nfunction isValidKey(key: string): boolean {\n let last: number, current: number, previous: number;\n if (typeof key !== 'string' || (last = key.length - 1) < 0) {\n return false;\n }\n previous = -1;\n while ((current = key.indexOf('.', previous + 1)) >= 0) {\n if (current - previous < 2 || current === last) {\n return false;\n }\n previous = current;\n }\n return true;\n}\n\nfunction isPlainObject(subject: unknown) {\n if (typeof subject === 'object' && subject !== null) {\n const prototype = Object.getPrototypeOf(subject);\n if (prototype === Object.prototype || prototype === null) {\n return true;\n }\n }\n return false;\n}\n\nfunction deepSet(context, key, value) {\n const separator = key.indexOf('.');\n if (separator >= 0) {\n const subKey = key.slice(0, separator);\n let subContext = context[subKey];\n if (typeof subContext !== 'object' || subContext === null) {\n const subContextValue = subContext;\n subContext = {};\n if (typeof subContextValue !== 'undefined') {\n subContext[''] = subContextValue;\n }\n context[subKey] = subContext;\n }\n deepSet(subContext, key.slice(separator + 1, key.length), value);\n } else {\n context[key] = value;\n }\n}\n\n/**\n * Initial Settings for the repository\n */\nSettings.getDefaultSettings().set('useCursors', true);\n","export function initRange(domain, range) {\n switch (arguments.length) {\n case 0: break;\n case 1: this.range(domain); break;\n default: this.range(range).domain(domain); break;\n }\n return this;\n}\n\nexport function initInterpolator(domain, interpolator) {\n switch (arguments.length) {\n case 0: break;\n case 1: {\n if (typeof domain === \"function\") this.interpolator(domain);\n else this.range(domain);\n break;\n }\n default: {\n this.domain(domain);\n if (typeof interpolator === \"function\") this.interpolator(interpolator);\n else this.range(interpolator);\n break;\n }\n }\n return this;\n}\n","import {InternMap} from \"d3-array\";\nimport {initRange} from \"./init.js\";\n\nexport const implicit = Symbol(\"implicit\");\n\nexport default function ordinal() {\n var index = new InternMap(),\n domain = [],\n range = [],\n unknown = implicit;\n\n function scale(d) {\n let i = index.get(d);\n if (i === undefined) {\n if (unknown !== implicit) return unknown;\n index.set(d, i = domain.push(d) - 1);\n }\n return range[i % range.length];\n }\n\n scale.domain = function(_) {\n if (!arguments.length) return domain.slice();\n domain = [], index = new InternMap();\n for (const value of _) {\n if (index.has(value)) continue;\n index.set(value, domain.push(value) - 1);\n }\n return scale;\n };\n\n scale.range = function(_) {\n return arguments.length ? (range = Array.from(_), scale) : range.slice();\n };\n\n scale.unknown = function(_) {\n return arguments.length ? (unknown = _, scale) : unknown;\n };\n\n scale.copy = function() {\n return ordinal(domain, range).unknown(unknown);\n };\n\n initRange.apply(scale, arguments);\n\n return scale;\n}\n","export default function number(x) {\n return +x;\n}\n","import {bisect} from \"d3-array\";\nimport {interpolate as interpolateValue, interpolateNumber, interpolateRound} from \"d3-interpolate\";\nimport constant from \"./constant.js\";\nimport number from \"./number.js\";\n\nvar unit = [0, 1];\n\nexport function identity(x) {\n return x;\n}\n\nfunction normalize(a, b) {\n return (b -= (a = +a))\n ? function(x) { return (x - a) / b; }\n : constant(isNaN(b) ? NaN : 0.5);\n}\n\nfunction clamper(a, b) {\n var t;\n if (a > b) t = a, a = b, b = t;\n return function(x) { return Math.max(a, Math.min(b, x)); };\n}\n\n// normalize(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1].\n// interpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding range value x in [a,b].\nfunction bimap(domain, range, interpolate) {\n var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1];\n if (d1 < d0) d0 = normalize(d1, d0), r0 = interpolate(r1, r0);\n else d0 = normalize(d0, d1), r0 = interpolate(r0, r1);\n return function(x) { return r0(d0(x)); };\n}\n\nfunction polymap(domain, range, interpolate) {\n var j = Math.min(domain.length, range.length) - 1,\n d = new Array(j),\n r = new Array(j),\n i = -1;\n\n // Reverse descending domains.\n if (domain[j] < domain[0]) {\n domain = domain.slice().reverse();\n range = range.slice().reverse();\n }\n\n while (++i < j) {\n d[i] = normalize(domain[i], domain[i + 1]);\n r[i] = interpolate(range[i], range[i + 1]);\n }\n\n return function(x) {\n var i = bisect(domain, x, 1, j) - 1;\n return r[i](d[i](x));\n };\n}\n\nexport function copy(source, target) {\n return target\n .domain(source.domain())\n .range(source.range())\n .interpolate(source.interpolate())\n .clamp(source.clamp())\n .unknown(source.unknown());\n}\n\nexport function transformer() {\n var domain = unit,\n range = unit,\n interpolate = interpolateValue,\n transform,\n untransform,\n unknown,\n clamp = identity,\n piecewise,\n output,\n input;\n\n function rescale() {\n var n = Math.min(domain.length, range.length);\n if (clamp !== identity) clamp = clamper(domain[0], domain[n - 1]);\n piecewise = n > 2 ? polymap : bimap;\n output = input = null;\n return scale;\n }\n\n function scale(x) {\n return x == null || isNaN(x = +x) ? unknown : (output || (output = piecewise(domain.map(transform), range, interpolate)))(transform(clamp(x)));\n }\n\n scale.invert = function(y) {\n return clamp(untransform((input || (input = piecewise(range, domain.map(transform), interpolateNumber)))(y)));\n };\n\n scale.domain = function(_) {\n return arguments.length ? (domain = Array.from(_, number), rescale()) : domain.slice();\n };\n\n scale.range = function(_) {\n return arguments.length ? (range = Array.from(_), rescale()) : range.slice();\n };\n\n scale.rangeRound = function(_) {\n return range = Array.from(_), interpolate = interpolateRound, rescale();\n };\n\n scale.clamp = function(_) {\n return arguments.length ? (clamp = _ ? true : identity, rescale()) : clamp !== identity;\n };\n\n scale.interpolate = function(_) {\n return arguments.length ? (interpolate = _, rescale()) : interpolate;\n };\n\n scale.unknown = function(_) {\n return arguments.length ? (unknown = _, scale) : unknown;\n };\n\n return function(t, u) {\n transform = t, untransform = u;\n return rescale();\n };\n}\n\nexport default function continuous() {\n return transformer()(identity, identity);\n}\n","export default function constants(x) {\n return function() {\n return x;\n };\n}\n","export default function(x) {\n return Math.abs(x = Math.round(x)) >= 1e21\n ? x.toLocaleString(\"en\").replace(/,/g, \"\")\n : x.toString(10);\n}\n\n// Computes the decimal coefficient and exponent of the specified number x with\n// significant digits p, where x is positive and p is in [1, 21] or undefined.\n// For example, formatDecimalParts(1.23) returns [\"123\", 0].\nexport function formatDecimalParts(x, p) {\n if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf(\"e\")) < 0) return null; // NaN, ±Infinity\n var i, coefficient = x.slice(0, i);\n\n // The string returned by toExponential either has the form \\d\\.\\d+e[-+]\\d+\n // (e.g., 1.2e+3) or the form \\de[-+]\\d+ (e.g., 1e+3).\n return [\n coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,\n +x.slice(i + 1)\n ];\n}\n","import {formatDecimalParts} from \"./formatDecimal.js\";\n\nexport default function(x) {\n return x = formatDecimalParts(Math.abs(x)), x ? x[1] : NaN;\n}\n","// [[fill]align][sign][symbol][0][width][,][.precision][~][type]\nvar re = /^(?:(.)?([<>=^]))?([+\\-( ])?([$#])?(0)?(\\d+)?(,)?(\\.\\d+)?(~)?([a-z%])?$/i;\n\nexport default function formatSpecifier(specifier) {\n if (!(match = re.exec(specifier))) throw new Error(\"invalid format: \" + specifier);\n var match;\n return new FormatSpecifier({\n fill: match[1],\n align: match[2],\n sign: match[3],\n symbol: match[4],\n zero: match[5],\n width: match[6],\n comma: match[7],\n precision: match[8] && match[8].slice(1),\n trim: match[9],\n type: match[10]\n });\n}\n\nformatSpecifier.prototype = FormatSpecifier.prototype; // instanceof\n\nexport function FormatSpecifier(specifier) {\n this.fill = specifier.fill === undefined ? \" \" : specifier.fill + \"\";\n this.align = specifier.align === undefined ? \">\" : specifier.align + \"\";\n this.sign = specifier.sign === undefined ? \"-\" : specifier.sign + \"\";\n this.symbol = specifier.symbol === undefined ? \"\" : specifier.symbol + \"\";\n this.zero = !!specifier.zero;\n this.width = specifier.width === undefined ? undefined : +specifier.width;\n this.comma = !!specifier.comma;\n this.precision = specifier.precision === undefined ? undefined : +specifier.precision;\n this.trim = !!specifier.trim;\n this.type = specifier.type === undefined ? \"\" : specifier.type + \"\";\n}\n\nFormatSpecifier.prototype.toString = function() {\n return this.fill\n + this.align\n + this.sign\n + this.symbol\n + (this.zero ? \"0\" : \"\")\n + (this.width === undefined ? \"\" : Math.max(1, this.width | 0))\n + (this.comma ? \",\" : \"\")\n + (this.precision === undefined ? \"\" : \".\" + Math.max(0, this.precision | 0))\n + (this.trim ? \"~\" : \"\")\n + this.type;\n};\n","import {formatDecimalParts} from \"./formatDecimal.js\";\n\nexport var prefixExponent;\n\nexport default function(x, p) {\n var d = formatDecimalParts(x, p);\n if (!d) return x + \"\";\n var coefficient = d[0],\n exponent = d[1],\n i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1,\n n = coefficient.length;\n return i === n ? coefficient\n : i > n ? coefficient + new Array(i - n + 1).join(\"0\")\n : i > 0 ? coefficient.slice(0, i) + \".\" + coefficient.slice(i)\n : \"0.\" + new Array(1 - i).join(\"0\") + formatDecimalParts(x, Math.max(0, p + i - 1))[0]; // less than 1y!\n}\n","import {formatDecimalParts} from \"./formatDecimal.js\";\n\nexport default function(x, p) {\n var d = formatDecimalParts(x, p);\n if (!d) return x + \"\";\n var coefficient = d[0],\n exponent = d[1];\n return exponent < 0 ? \"0.\" + new Array(-exponent).join(\"0\") + coefficient\n : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + \".\" + coefficient.slice(exponent + 1)\n : coefficient + new Array(exponent - coefficient.length + 2).join(\"0\");\n}\n","import formatDecimal from \"./formatDecimal.js\";\nimport formatPrefixAuto from \"./formatPrefixAuto.js\";\nimport formatRounded from \"./formatRounded.js\";\n\nexport default {\n \"%\": (x, p) => (x * 100).toFixed(p),\n \"b\": (x) => Math.round(x).toString(2),\n \"c\": (x) => x + \"\",\n \"d\": formatDecimal,\n \"e\": (x, p) => x.toExponential(p),\n \"f\": (x, p) => x.toFixed(p),\n \"g\": (x, p) => x.toPrecision(p),\n \"o\": (x) => Math.round(x).toString(8),\n \"p\": (x, p) => formatRounded(x * 100, p),\n \"r\": formatRounded,\n \"s\": formatPrefixAuto,\n \"X\": (x) => Math.round(x).toString(16).toUpperCase(),\n \"x\": (x) => Math.round(x).toString(16)\n};\n","export default function(x) {\n return x;\n}\n","import exponent from \"./exponent.js\";\nimport formatGroup from \"./formatGroup.js\";\nimport formatNumerals from \"./formatNumerals.js\";\nimport formatSpecifier from \"./formatSpecifier.js\";\nimport formatTrim from \"./formatTrim.js\";\nimport formatTypes from \"./formatTypes.js\";\nimport {prefixExponent} from \"./formatPrefixAuto.js\";\nimport identity from \"./identity.js\";\n\nvar map = Array.prototype.map,\n prefixes = [\"y\",\"z\",\"a\",\"f\",\"p\",\"n\",\"µ\",\"m\",\"\",\"k\",\"M\",\"G\",\"T\",\"P\",\"E\",\"Z\",\"Y\"];\n\nexport default function(locale) {\n var group = locale.grouping === undefined || locale.thousands === undefined ? identity : formatGroup(map.call(locale.grouping, Number), locale.thousands + \"\"),\n currencyPrefix = locale.currency === undefined ? \"\" : locale.currency[0] + \"\",\n currencySuffix = locale.currency === undefined ? \"\" : locale.currency[1] + \"\",\n decimal = locale.decimal === undefined ? \".\" : locale.decimal + \"\",\n numerals = locale.numerals === undefined ? identity : formatNumerals(map.call(locale.numerals, String)),\n percent = locale.percent === undefined ? \"%\" : locale.percent + \"\",\n minus = locale.minus === undefined ? \"−\" : locale.minus + \"\",\n nan = locale.nan === undefined ? \"NaN\" : locale.nan + \"\";\n\n function newFormat(specifier) {\n specifier = formatSpecifier(specifier);\n\n var fill = specifier.fill,\n align = specifier.align,\n sign = specifier.sign,\n symbol = specifier.symbol,\n zero = specifier.zero,\n width = specifier.width,\n comma = specifier.comma,\n precision = specifier.precision,\n trim = specifier.trim,\n type = specifier.type;\n\n // The \"n\" type is an alias for \",g\".\n if (type === \"n\") comma = true, type = \"g\";\n\n // The \"\" type, and any invalid type, is an alias for \".12~g\".\n else if (!formatTypes[type]) precision === undefined && (precision = 12), trim = true, type = \"g\";\n\n // If zero fill is specified, padding goes after sign and before digits.\n if (zero || (fill === \"0\" && align === \"=\")) zero = true, fill = \"0\", align = \"=\";\n\n // Compute the prefix and suffix.\n // For SI-prefix, the suffix is lazily computed.\n var prefix = symbol === \"$\" ? currencyPrefix : symbol === \"#\" && /[boxX]/.test(type) ? \"0\" + type.toLowerCase() : \"\",\n suffix = symbol === \"$\" ? currencySuffix : /[%p]/.test(type) ? percent : \"\";\n\n // What format function should we use?\n // Is this an integer type?\n // Can this type generate exponential notation?\n var formatType = formatTypes[type],\n maybeSuffix = /[defgprs%]/.test(type);\n\n // Set the default precision if not specified,\n // or clamp the specified precision to the supported range.\n // For significant precision, it must be in [1, 21].\n // For fixed precision, it must be in [0, 20].\n precision = precision === undefined ? 6\n : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision))\n : Math.max(0, Math.min(20, precision));\n\n function format(value) {\n var valuePrefix = prefix,\n valueSuffix = suffix,\n i, n, c;\n\n if (type === \"c\") {\n valueSuffix = formatType(value) + valueSuffix;\n value = \"\";\n } else {\n value = +value;\n\n // Determine the sign. -0 is not less than 0, but 1 / -0 is!\n var valueNegative = value < 0 || 1 / value < 0;\n\n // Perform the initial formatting.\n value = isNaN(value) ? nan : formatType(Math.abs(value), precision);\n\n // Trim insignificant zeros.\n if (trim) value = formatTrim(value);\n\n // If a negative value rounds to zero after formatting, and no explicit positive sign is requested, hide the sign.\n if (valueNegative && +value === 0 && sign !== \"+\") valueNegative = false;\n\n // Compute the prefix and suffix.\n valuePrefix = (valueNegative ? (sign === \"(\" ? sign : minus) : sign === \"-\" || sign === \"(\" ? \"\" : sign) + valuePrefix;\n valueSuffix = (type === \"s\" ? prefixes[8 + prefixExponent / 3] : \"\") + valueSuffix + (valueNegative && sign === \"(\" ? \")\" : \"\");\n\n // Break the formatted value into the integer “value” part that can be\n // grouped, and fractional or exponential “suffix” part that is not.\n if (maybeSuffix) {\n i = -1, n = value.length;\n while (++i < n) {\n if (c = value.charCodeAt(i), 48 > c || c > 57) {\n valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix;\n value = value.slice(0, i);\n break;\n }\n }\n }\n }\n\n // If the fill character is not \"0\", grouping is applied before padding.\n if (comma && !zero) value = group(value, Infinity);\n\n // Compute the padding.\n var length = valuePrefix.length + value.length + valueSuffix.length,\n padding = length < width ? new Array(width - length + 1).join(fill) : \"\";\n\n // If the fill character is \"0\", grouping is applied after padding.\n if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = \"\";\n\n // Reconstruct the final output based on the desired alignment.\n switch (align) {\n case \"<\": value = valuePrefix + value + valueSuffix + padding; break;\n case \"=\": value = valuePrefix + padding + value + valueSuffix; break;\n case \"^\": value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length); break;\n default: value = padding + valuePrefix + value + valueSuffix; break;\n }\n\n return numerals(value);\n }\n\n format.toString = function() {\n return specifier + \"\";\n };\n\n return format;\n }\n\n function formatPrefix(specifier, value) {\n var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = \"f\", specifier)),\n e = Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3,\n k = Math.pow(10, -e),\n prefix = prefixes[8 + e / 3];\n return function(value) {\n return f(k * value) + prefix;\n };\n }\n\n return {\n format: newFormat,\n formatPrefix: formatPrefix\n };\n}\n","import formatLocale from \"./locale.js\";\n\nvar locale;\nexport var format;\nexport var formatPrefix;\n\ndefaultLocale({\n thousands: \",\",\n grouping: [3],\n currency: [\"$\", \"\"]\n});\n\nexport default function defaultLocale(definition) {\n locale = formatLocale(definition);\n format = locale.format;\n formatPrefix = locale.formatPrefix;\n return locale;\n}\n","export default function(grouping, thousands) {\n return function(value, width) {\n var i = value.length,\n t = [],\n j = 0,\n g = grouping[0],\n length = 0;\n\n while (i > 0 && g > 0) {\n if (length + g + 1 > width) g = Math.max(1, width - length);\n t.push(value.substring(i -= g, i + g));\n if ((length += g + 1) > width) break;\n g = grouping[j = (j + 1) % grouping.length];\n }\n\n return t.reverse().join(thousands);\n };\n}\n","export default function(numerals) {\n return function(value) {\n return value.replace(/[0-9]/g, function(i) {\n return numerals[+i];\n });\n };\n}\n","// Trims insignificant zeros, e.g., replaces 1.2000k with 1.2k.\nexport default function(s) {\n out: for (var n = s.length, i = 1, i0 = -1, i1; i < n; ++i) {\n switch (s[i]) {\n case \".\": i0 = i1 = i; break;\n case \"0\": if (i0 === 0) i0 = i; i1 = i; break;\n default: if (!+s[i]) break out; if (i0 > 0) i0 = 0; break;\n }\n }\n return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s;\n}\n","import {tickStep} from \"d3-array\";\nimport {format, formatPrefix, formatSpecifier, precisionFixed, precisionPrefix, precisionRound} from \"d3-format\";\n\nexport default function tickFormat(start, stop, count, specifier) {\n var step = tickStep(start, stop, count),\n precision;\n specifier = formatSpecifier(specifier == null ? \",f\" : specifier);\n switch (specifier.type) {\n case \"s\": {\n var value = Math.max(Math.abs(start), Math.abs(stop));\n if (specifier.precision == null && !isNaN(precision = precisionPrefix(step, value))) specifier.precision = precision;\n return formatPrefix(specifier, value);\n }\n case \"\":\n case \"e\":\n case \"g\":\n case \"p\":\n case \"r\": {\n if (specifier.precision == null && !isNaN(precision = precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === \"e\");\n break;\n }\n case \"f\":\n case \"%\": {\n if (specifier.precision == null && !isNaN(precision = precisionFixed(step))) specifier.precision = precision - (specifier.type === \"%\") * 2;\n break;\n }\n }\n return format(specifier);\n}\n","import exponent from \"./exponent.js\";\n\nexport default function(step, value) {\n return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3 - exponent(Math.abs(step)));\n}\n","import exponent from \"./exponent.js\";\n\nexport default function(step, max) {\n step = Math.abs(step), max = Math.abs(max) - step;\n return Math.max(0, exponent(max) - exponent(step)) + 1;\n}\n","import exponent from \"./exponent.js\";\n\nexport default function(step) {\n return Math.max(0, -exponent(Math.abs(step)));\n}\n","import {ticks, tickIncrement} from \"d3-array\";\nimport continuous, {copy} from \"./continuous.js\";\nimport {initRange} from \"./init.js\";\nimport tickFormat from \"./tickFormat.js\";\n\nexport function linearish(scale) {\n var domain = scale.domain;\n\n scale.ticks = function(count) {\n var d = domain();\n return ticks(d[0], d[d.length - 1], count == null ? 10 : count);\n };\n\n scale.tickFormat = function(count, specifier) {\n var d = domain();\n return tickFormat(d[0], d[d.length - 1], count == null ? 10 : count, specifier);\n };\n\n scale.nice = function(count) {\n if (count == null) count = 10;\n\n var d = domain();\n var i0 = 0;\n var i1 = d.length - 1;\n var start = d[i0];\n var stop = d[i1];\n var prestep;\n var step;\n var maxIter = 10;\n\n if (stop < start) {\n step = start, start = stop, stop = step;\n step = i0, i0 = i1, i1 = step;\n }\n \n while (maxIter-- > 0) {\n step = tickIncrement(start, stop, count);\n if (step === prestep) {\n d[i0] = start\n d[i1] = stop\n return domain(d);\n } else if (step > 0) {\n start = Math.floor(start / step) * step;\n stop = Math.ceil(stop / step) * step;\n } else if (step < 0) {\n start = Math.ceil(start * step) / step;\n stop = Math.floor(stop * step) / step;\n } else {\n break;\n }\n prestep = step;\n }\n\n return scale;\n };\n\n return scale;\n}\n\nexport default function linear() {\n var scale = continuous();\n\n scale.copy = function() {\n return copy(scale, linear());\n };\n\n initRange.apply(scale, arguments);\n\n return linearish(scale);\n}\n","const t0 = new Date, t1 = new Date;\n\nexport function timeInterval(floori, offseti, count, field) {\n\n function interval(date) {\n return floori(date = arguments.length === 0 ? new Date : new Date(+date)), date;\n }\n\n interval.floor = (date) => {\n return floori(date = new Date(+date)), date;\n };\n\n interval.ceil = (date) => {\n return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date;\n };\n\n interval.round = (date) => {\n const d0 = interval(date), d1 = interval.ceil(date);\n return date - d0 < d1 - date ? d0 : d1;\n };\n\n interval.offset = (date, step) => {\n return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date;\n };\n\n interval.range = (start, stop, step) => {\n const range = [];\n start = interval.ceil(start);\n step = step == null ? 1 : Math.floor(step);\n if (!(start < stop) || !(step > 0)) return range; // also handles Invalid Date\n let previous;\n do range.push(previous = new Date(+start)), offseti(start, step), floori(start);\n while (previous < start && start < stop);\n return range;\n };\n\n interval.filter = (test) => {\n return timeInterval((date) => {\n if (date >= date) while (floori(date), !test(date)) date.setTime(date - 1);\n }, (date, step) => {\n if (date >= date) {\n if (step < 0) while (++step <= 0) {\n while (offseti(date, -1), !test(date)) {} // eslint-disable-line no-empty\n } else while (--step >= 0) {\n while (offseti(date, +1), !test(date)) {} // eslint-disable-line no-empty\n }\n }\n });\n };\n\n if (count) {\n interval.count = (start, end) => {\n t0.setTime(+start), t1.setTime(+end);\n floori(t0), floori(t1);\n return Math.floor(count(t0, t1));\n };\n\n interval.every = (step) => {\n step = Math.floor(step);\n return !isFinite(step) || !(step > 0) ? null\n : !(step > 1) ? interval\n : interval.filter(field\n ? (d) => field(d) % step === 0\n : (d) => interval.count(0, d) % step === 0);\n };\n }\n\n return interval;\n}\n","import {timeInterval} from \"./interval.js\";\n\nexport const millisecond = timeInterval(() => {\n // noop\n}, (date, step) => {\n date.setTime(+date + step);\n}, (start, end) => {\n return end - start;\n});\n\n// An optimized implementation for this simple case.\nmillisecond.every = (k) => {\n k = Math.floor(k);\n if (!isFinite(k) || !(k > 0)) return null;\n if (!(k > 1)) return millisecond;\n return timeInterval((date) => {\n date.setTime(Math.floor(date / k) * k);\n }, (date, step) => {\n date.setTime(+date + step * k);\n }, (start, end) => {\n return (end - start) / k;\n });\n};\n\nexport const milliseconds = millisecond.range;\n","export const durationSecond = 1000;\nexport const durationMinute = durationSecond * 60;\nexport const durationHour = durationMinute * 60;\nexport const durationDay = durationHour * 24;\nexport const durationWeek = durationDay * 7;\nexport const durationMonth = durationDay * 30;\nexport const durationYear = durationDay * 365;\n","import {timeInterval} from \"./interval.js\";\nimport {durationSecond} from \"./duration.js\";\n\nexport const second = timeInterval((date) => {\n date.setTime(date - date.getMilliseconds());\n}, (date, step) => {\n date.setTime(+date + step * durationSecond);\n}, (start, end) => {\n return (end - start) / durationSecond;\n}, (date) => {\n return date.getUTCSeconds();\n});\n\nexport const seconds = second.range;\n","import {timeInterval} from \"./interval.js\";\nimport {durationMinute, durationSecond} from \"./duration.js\";\n\nexport const timeMinute = timeInterval((date) => {\n date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond);\n}, (date, step) => {\n date.setTime(+date + step * durationMinute);\n}, (start, end) => {\n return (end - start) / durationMinute;\n}, (date) => {\n return date.getMinutes();\n});\n\nexport const timeMinutes = timeMinute.range;\n\nexport const utcMinute = timeInterval((date) => {\n date.setUTCSeconds(0, 0);\n}, (date, step) => {\n date.setTime(+date + step * durationMinute);\n}, (start, end) => {\n return (end - start) / durationMinute;\n}, (date) => {\n return date.getUTCMinutes();\n});\n\nexport const utcMinutes = utcMinute.range;\n","import {timeInterval} from \"./interval.js\";\nimport {durationHour, durationMinute, durationSecond} from \"./duration.js\";\n\nexport const timeHour = timeInterval((date) => {\n date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond - date.getMinutes() * durationMinute);\n}, (date, step) => {\n date.setTime(+date + step * durationHour);\n}, (start, end) => {\n return (end - start) / durationHour;\n}, (date) => {\n return date.getHours();\n});\n\nexport const timeHours = timeHour.range;\n\nexport const utcHour = timeInterval((date) => {\n date.setUTCMinutes(0, 0, 0);\n}, (date, step) => {\n date.setTime(+date + step * durationHour);\n}, (start, end) => {\n return (end - start) / durationHour;\n}, (date) => {\n return date.getUTCHours();\n});\n\nexport const utcHours = utcHour.range;\n","import {timeInterval} from \"./interval.js\";\nimport {durationDay, durationMinute} from \"./duration.js\";\n\nexport const timeDay = timeInterval(\n date => date.setHours(0, 0, 0, 0),\n (date, step) => date.setDate(date.getDate() + step),\n (start, end) => (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationDay,\n date => date.getDate() - 1\n);\n\nexport const timeDays = timeDay.range;\n\nexport const utcDay = timeInterval((date) => {\n date.setUTCHours(0, 0, 0, 0);\n}, (date, step) => {\n date.setUTCDate(date.getUTCDate() + step);\n}, (start, end) => {\n return (end - start) / durationDay;\n}, (date) => {\n return date.getUTCDate() - 1;\n});\n\nexport const utcDays = utcDay.range;\n\nexport const unixDay = timeInterval((date) => {\n date.setUTCHours(0, 0, 0, 0);\n}, (date, step) => {\n date.setUTCDate(date.getUTCDate() + step);\n}, (start, end) => {\n return (end - start) / durationDay;\n}, (date) => {\n return Math.floor(date / durationDay);\n});\n\nexport const unixDays = unixDay.range;\n","import {timeInterval} from \"./interval.js\";\nimport {durationMinute, durationWeek} from \"./duration.js\";\n\nfunction timeWeekday(i) {\n return timeInterval((date) => {\n date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7);\n date.setHours(0, 0, 0, 0);\n }, (date, step) => {\n date.setDate(date.getDate() + step * 7);\n }, (start, end) => {\n return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationWeek;\n });\n}\n\nexport const timeSunday = timeWeekday(0);\nexport const timeMonday = timeWeekday(1);\nexport const timeTuesday = timeWeekday(2);\nexport const timeWednesday = timeWeekday(3);\nexport const timeThursday = timeWeekday(4);\nexport const timeFriday = timeWeekday(5);\nexport const timeSaturday = timeWeekday(6);\n\nexport const timeSundays = timeSunday.range;\nexport const timeMondays = timeMonday.range;\nexport const timeTuesdays = timeTuesday.range;\nexport const timeWednesdays = timeWednesday.range;\nexport const timeThursdays = timeThursday.range;\nexport const timeFridays = timeFriday.range;\nexport const timeSaturdays = timeSaturday.range;\n\nfunction utcWeekday(i) {\n return timeInterval((date) => {\n date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7);\n date.setUTCHours(0, 0, 0, 0);\n }, (date, step) => {\n date.setUTCDate(date.getUTCDate() + step * 7);\n }, (start, end) => {\n return (end - start) / durationWeek;\n });\n}\n\nexport const utcSunday = utcWeekday(0);\nexport const utcMonday = utcWeekday(1);\nexport const utcTuesday = utcWeekday(2);\nexport const utcWednesday = utcWeekday(3);\nexport const utcThursday = utcWeekday(4);\nexport const utcFriday = utcWeekday(5);\nexport const utcSaturday = utcWeekday(6);\n\nexport const utcSundays = utcSunday.range;\nexport const utcMondays = utcMonday.range;\nexport const utcTuesdays = utcTuesday.range;\nexport const utcWednesdays = utcWednesday.range;\nexport const utcThursdays = utcThursday.range;\nexport const utcFridays = utcFriday.range;\nexport const utcSaturdays = utcSaturday.range;\n","import {timeInterval} from \"./interval.js\";\n\nexport const timeMonth = timeInterval((date) => {\n date.setDate(1);\n date.setHours(0, 0, 0, 0);\n}, (date, step) => {\n date.setMonth(date.getMonth() + step);\n}, (start, end) => {\n return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12;\n}, (date) => {\n return date.getMonth();\n});\n\nexport const timeMonths = timeMonth.range;\n\nexport const utcMonth = timeInterval((date) => {\n date.setUTCDate(1);\n date.setUTCHours(0, 0, 0, 0);\n}, (date, step) => {\n date.setUTCMonth(date.getUTCMonth() + step);\n}, (start, end) => {\n return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12;\n}, (date) => {\n return date.getUTCMonth();\n});\n\nexport const utcMonths = utcMonth.range;\n","import {timeInterval} from \"./interval.js\";\n\nexport const timeYear = timeInterval((date) => {\n date.setMonth(0, 1);\n date.setHours(0, 0, 0, 0);\n}, (date, step) => {\n date.setFullYear(date.getFullYear() + step);\n}, (start, end) => {\n return end.getFullYear() - start.getFullYear();\n}, (date) => {\n return date.getFullYear();\n});\n\n// An optimized implementation for this simple case.\ntimeYear.every = (k) => {\n return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : timeInterval((date) => {\n date.setFullYear(Math.floor(date.getFullYear() / k) * k);\n date.setMonth(0, 1);\n date.setHours(0, 0, 0, 0);\n }, (date, step) => {\n date.setFullYear(date.getFullYear() + step * k);\n });\n};\n\nexport const timeYears = timeYear.range;\n\nexport const utcYear = timeInterval((date) => {\n date.setUTCMonth(0, 1);\n date.setUTCHours(0, 0, 0, 0);\n}, (date, step) => {\n date.setUTCFullYear(date.getUTCFullYear() + step);\n}, (start, end) => {\n return end.getUTCFullYear() - start.getUTCFullYear();\n}, (date) => {\n return date.getUTCFullYear();\n});\n\n// An optimized implementation for this simple case.\nutcYear.every = (k) => {\n return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : timeInterval((date) => {\n date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k);\n date.setUTCMonth(0, 1);\n date.setUTCHours(0, 0, 0, 0);\n }, (date, step) => {\n date.setUTCFullYear(date.getUTCFullYear() + step * k);\n });\n};\n\nexport const utcYears = utcYear.range;\n","import {bisector, tickStep} from \"d3-array\";\nimport {durationDay, durationHour, durationMinute, durationMonth, durationSecond, durationWeek, durationYear} from \"./duration.js\";\nimport {millisecond} from \"./millisecond.js\";\nimport {second} from \"./second.js\";\nimport {timeMinute, utcMinute} from \"./minute.js\";\nimport {timeHour, utcHour} from \"./hour.js\";\nimport {timeDay, unixDay} from \"./day.js\";\nimport {timeSunday, utcSunday} from \"./week.js\";\nimport {timeMonth, utcMonth} from \"./month.js\";\nimport {timeYear, utcYear} from \"./year.js\";\n\nfunction ticker(year, month, week, day, hour, minute) {\n\n const tickIntervals = [\n [second, 1, durationSecond],\n [second, 5, 5 * durationSecond],\n [second, 15, 15 * durationSecond],\n [second, 30, 30 * durationSecond],\n [minute, 1, durationMinute],\n [minute, 5, 5 * durationMinute],\n [minute, 15, 15 * durationMinute],\n [minute, 30, 30 * durationMinute],\n [ hour, 1, durationHour ],\n [ hour, 3, 3 * durationHour ],\n [ hour, 6, 6 * durationHour ],\n [ hour, 12, 12 * durationHour ],\n [ day, 1, durationDay ],\n [ day, 2, 2 * durationDay ],\n [ week, 1, durationWeek ],\n [ month, 1, durationMonth ],\n [ month, 3, 3 * durationMonth ],\n [ year, 1, durationYear ]\n ];\n\n function ticks(start, stop, count) {\n const reverse = stop < start;\n if (reverse) [start, stop] = [stop, start];\n const interval = count && typeof count.range === \"function\" ? count : tickInterval(start, stop, count);\n const ticks = interval ? interval.range(start, +stop + 1) : []; // inclusive stop\n return reverse ? ticks.reverse() : ticks;\n }\n\n function tickInterval(start, stop, count) {\n const target = Math.abs(stop - start) / count;\n const i = bisector(([,, step]) => step).right(tickIntervals, target);\n if (i === tickIntervals.length) return year.every(tickStep(start / durationYear, stop / durationYear, count));\n if (i === 0) return millisecond.every(Math.max(tickStep(start, stop, count), 1));\n const [t, step] = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i];\n return t.every(step);\n }\n\n return [ticks, tickInterval];\n}\n\nconst [utcTicks, utcTickInterval] = ticker(utcYear, utcMonth, utcSunday, unixDay, utcHour, utcMinute);\nconst [timeTicks, timeTickInterval] = ticker(timeYear, timeMonth, timeSunday, timeDay, timeHour, timeMinute);\n\nexport {utcTicks, utcTickInterval, timeTicks, timeTickInterval};\n","import {\n timeDay,\n timeSunday,\n timeMonday,\n timeThursday,\n timeYear,\n utcDay,\n utcSunday,\n utcMonday,\n utcThursday,\n utcYear\n} from \"d3-time\";\n\nfunction localDate(d) {\n if (0 <= d.y && d.y < 100) {\n var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L);\n date.setFullYear(d.y);\n return date;\n }\n return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L);\n}\n\nfunction utcDate(d) {\n if (0 <= d.y && d.y < 100) {\n var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L));\n date.setUTCFullYear(d.y);\n return date;\n }\n return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L));\n}\n\nfunction newDate(y, m, d) {\n return {y: y, m: m, d: d, H: 0, M: 0, S: 0, L: 0};\n}\n\nexport default function formatLocale(locale) {\n var locale_dateTime = locale.dateTime,\n locale_date = locale.date,\n locale_time = locale.time,\n locale_periods = locale.periods,\n locale_weekdays = locale.days,\n locale_shortWeekdays = locale.shortDays,\n locale_months = locale.months,\n locale_shortMonths = locale.shortMonths;\n\n var periodRe = formatRe(locale_periods),\n periodLookup = formatLookup(locale_periods),\n weekdayRe = formatRe(locale_weekdays),\n weekdayLookup = formatLookup(locale_weekdays),\n shortWeekdayRe = formatRe(locale_shortWeekdays),\n shortWeekdayLookup = formatLookup(locale_shortWeekdays),\n monthRe = formatRe(locale_months),\n monthLookup = formatLookup(locale_months),\n shortMonthRe = formatRe(locale_shortMonths),\n shortMonthLookup = formatLookup(locale_shortMonths);\n\n var formats = {\n \"a\": formatShortWeekday,\n \"A\": formatWeekday,\n \"b\": formatShortMonth,\n \"B\": formatMonth,\n \"c\": null,\n \"d\": formatDayOfMonth,\n \"e\": formatDayOfMonth,\n \"f\": formatMicroseconds,\n \"g\": formatYearISO,\n \"G\": formatFullYearISO,\n \"H\": formatHour24,\n \"I\": formatHour12,\n \"j\": formatDayOfYear,\n \"L\": formatMilliseconds,\n \"m\": formatMonthNumber,\n \"M\": formatMinutes,\n \"p\": formatPeriod,\n \"q\": formatQuarter,\n \"Q\": formatUnixTimestamp,\n \"s\": formatUnixTimestampSeconds,\n \"S\": formatSeconds,\n \"u\": formatWeekdayNumberMonday,\n \"U\": formatWeekNumberSunday,\n \"V\": formatWeekNumberISO,\n \"w\": formatWeekdayNumberSunday,\n \"W\": formatWeekNumberMonday,\n \"x\": null,\n \"X\": null,\n \"y\": formatYear,\n \"Y\": formatFullYear,\n \"Z\": formatZone,\n \"%\": formatLiteralPercent\n };\n\n var utcFormats = {\n \"a\": formatUTCShortWeekday,\n \"A\": formatUTCWeekday,\n \"b\": formatUTCShortMonth,\n \"B\": formatUTCMonth,\n \"c\": null,\n \"d\": formatUTCDayOfMonth,\n \"e\": formatUTCDayOfMonth,\n \"f\": formatUTCMicroseconds,\n \"g\": formatUTCYearISO,\n \"G\": formatUTCFullYearISO,\n \"H\": formatUTCHour24,\n \"I\": formatUTCHour12,\n \"j\": formatUTCDayOfYear,\n \"L\": formatUTCMilliseconds,\n \"m\": formatUTCMonthNumber,\n \"M\": formatUTCMinutes,\n \"p\": formatUTCPeriod,\n \"q\": formatUTCQuarter,\n \"Q\": formatUnixTimestamp,\n \"s\": formatUnixTimestampSeconds,\n \"S\": formatUTCSeconds,\n \"u\": formatUTCWeekdayNumberMonday,\n \"U\": formatUTCWeekNumberSunday,\n \"V\": formatUTCWeekNumberISO,\n \"w\": formatUTCWeekdayNumberSunday,\n \"W\": formatUTCWeekNumberMonday,\n \"x\": null,\n \"X\": null,\n \"y\": formatUTCYear,\n \"Y\": formatUTCFullYear,\n \"Z\": formatUTCZone,\n \"%\": formatLiteralPercent\n };\n\n var parses = {\n \"a\": parseShortWeekday,\n \"A\": parseWeekday,\n \"b\": parseShortMonth,\n \"B\": parseMonth,\n \"c\": parseLocaleDateTime,\n \"d\": parseDayOfMonth,\n \"e\": parseDayOfMonth,\n \"f\": parseMicroseconds,\n \"g\": parseYear,\n \"G\": parseFullYear,\n \"H\": parseHour24,\n \"I\": parseHour24,\n \"j\": parseDayOfYear,\n \"L\": parseMilliseconds,\n \"m\": parseMonthNumber,\n \"M\": parseMinutes,\n \"p\": parsePeriod,\n \"q\": parseQuarter,\n \"Q\": parseUnixTimestamp,\n \"s\": parseUnixTimestampSeconds,\n \"S\": parseSeconds,\n \"u\": parseWeekdayNumberMonday,\n \"U\": parseWeekNumberSunday,\n \"V\": parseWeekNumberISO,\n \"w\": parseWeekdayNumberSunday,\n \"W\": parseWeekNumberMonday,\n \"x\": parseLocaleDate,\n \"X\": parseLocaleTime,\n \"y\": parseYear,\n \"Y\": parseFullYear,\n \"Z\": parseZone,\n \"%\": parseLiteralPercent\n };\n\n // These recursive directive definitions must be deferred.\n formats.x = newFormat(locale_date, formats);\n formats.X = newFormat(locale_time, formats);\n formats.c = newFormat(locale_dateTime, formats);\n utcFormats.x = newFormat(locale_date, utcFormats);\n utcFormats.X = newFormat(locale_time, utcFormats);\n utcFormats.c = newFormat(locale_dateTime, utcFormats);\n\n function newFormat(specifier, formats) {\n return function(date) {\n var string = [],\n i = -1,\n j = 0,\n n = specifier.length,\n c,\n pad,\n format;\n\n if (!(date instanceof Date)) date = new Date(+date);\n\n while (++i < n) {\n if (specifier.charCodeAt(i) === 37) {\n string.push(specifier.slice(j, i));\n if ((pad = pads[c = specifier.charAt(++i)]) != null) c = specifier.charAt(++i);\n else pad = c === \"e\" ? \" \" : \"0\";\n if (format = formats[c]) c = format(date, pad);\n string.push(c);\n j = i + 1;\n }\n }\n\n string.push(specifier.slice(j, i));\n return string.join(\"\");\n };\n }\n\n function newParse(specifier, Z) {\n return function(string) {\n var d = newDate(1900, undefined, 1),\n i = parseSpecifier(d, specifier, string += \"\", 0),\n week, day;\n if (i != string.length) return null;\n\n // If a UNIX timestamp is specified, return it.\n if (\"Q\" in d) return new Date(d.Q);\n if (\"s\" in d) return new Date(d.s * 1000 + (\"L\" in d ? d.L : 0));\n\n // If this is utcParse, never use the local timezone.\n if (Z && !(\"Z\" in d)) d.Z = 0;\n\n // The am-pm flag is 0 for AM, and 1 for PM.\n if (\"p\" in d) d.H = d.H % 12 + d.p * 12;\n\n // If the month was not specified, inherit from the quarter.\n if (d.m === undefined) d.m = \"q\" in d ? d.q : 0;\n\n // Convert day-of-week and week-of-year to day-of-year.\n if (\"V\" in d) {\n if (d.V < 1 || d.V > 53) return null;\n if (!(\"w\" in d)) d.w = 1;\n if (\"Z\" in d) {\n week = utcDate(newDate(d.y, 0, 1)), day = week.getUTCDay();\n week = day > 4 || day === 0 ? utcMonday.ceil(week) : utcMonday(week);\n week = utcDay.offset(week, (d.V - 1) * 7);\n d.y = week.getUTCFullYear();\n d.m = week.getUTCMonth();\n d.d = week.getUTCDate() + (d.w + 6) % 7;\n } else {\n week = localDate(newDate(d.y, 0, 1)), day = week.getDay();\n week = day > 4 || day === 0 ? timeMonday.ceil(week) : timeMonday(week);\n week = timeDay.offset(week, (d.V - 1) * 7);\n d.y = week.getFullYear();\n d.m = week.getMonth();\n d.d = week.getDate() + (d.w + 6) % 7;\n }\n } else if (\"W\" in d || \"U\" in d) {\n if (!(\"w\" in d)) d.w = \"u\" in d ? d.u % 7 : \"W\" in d ? 1 : 0;\n day = \"Z\" in d ? utcDate(newDate(d.y, 0, 1)).getUTCDay() : localDate(newDate(d.y, 0, 1)).getDay();\n d.m = 0;\n d.d = \"W\" in d ? (d.w + 6) % 7 + d.W * 7 - (day + 5) % 7 : d.w + d.U * 7 - (day + 6) % 7;\n }\n\n // If a time zone is specified, all fields are interpreted as UTC and then\n // offset according to the specified time zone.\n if (\"Z\" in d) {\n d.H += d.Z / 100 | 0;\n d.M += d.Z % 100;\n return utcDate(d);\n }\n\n // Otherwise, all fields are in local time.\n return localDate(d);\n };\n }\n\n function parseSpecifier(d, specifier, string, j) {\n var i = 0,\n n = specifier.length,\n m = string.length,\n c,\n parse;\n\n while (i < n) {\n if (j >= m) return -1;\n c = specifier.charCodeAt(i++);\n if (c === 37) {\n c = specifier.charAt(i++);\n parse = parses[c in pads ? specifier.charAt(i++) : c];\n if (!parse || ((j = parse(d, string, j)) < 0)) return -1;\n } else if (c != string.charCodeAt(j++)) {\n return -1;\n }\n }\n\n return j;\n }\n\n function parsePeriod(d, string, i) {\n var n = periodRe.exec(string.slice(i));\n return n ? (d.p = periodLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n }\n\n function parseShortWeekday(d, string, i) {\n var n = shortWeekdayRe.exec(string.slice(i));\n return n ? (d.w = shortWeekdayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n }\n\n function parseWeekday(d, string, i) {\n var n = weekdayRe.exec(string.slice(i));\n return n ? (d.w = weekdayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n }\n\n function parseShortMonth(d, string, i) {\n var n = shortMonthRe.exec(string.slice(i));\n return n ? (d.m = shortMonthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n }\n\n function parseMonth(d, string, i) {\n var n = monthRe.exec(string.slice(i));\n return n ? (d.m = monthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n }\n\n function parseLocaleDateTime(d, string, i) {\n return parseSpecifier(d, locale_dateTime, string, i);\n }\n\n function parseLocaleDate(d, string, i) {\n return parseSpecifier(d, locale_date, string, i);\n }\n\n function parseLocaleTime(d, string, i) {\n return parseSpecifier(d, locale_time, string, i);\n }\n\n function formatShortWeekday(d) {\n return locale_shortWeekdays[d.getDay()];\n }\n\n function formatWeekday(d) {\n return locale_weekdays[d.getDay()];\n }\n\n function formatShortMonth(d) {\n return locale_shortMonths[d.getMonth()];\n }\n\n function formatMonth(d) {\n return locale_months[d.getMonth()];\n }\n\n function formatPeriod(d) {\n return locale_periods[+(d.getHours() >= 12)];\n }\n\n function formatQuarter(d) {\n return 1 + ~~(d.getMonth() / 3);\n }\n\n function formatUTCShortWeekday(d) {\n return locale_shortWeekdays[d.getUTCDay()];\n }\n\n function formatUTCWeekday(d) {\n return locale_weekdays[d.getUTCDay()];\n }\n\n function formatUTCShortMonth(d) {\n return locale_shortMonths[d.getUTCMonth()];\n }\n\n function formatUTCMonth(d) {\n return locale_months[d.getUTCMonth()];\n }\n\n function formatUTCPeriod(d) {\n return locale_periods[+(d.getUTCHours() >= 12)];\n }\n\n function formatUTCQuarter(d) {\n return 1 + ~~(d.getUTCMonth() / 3);\n }\n\n return {\n format: function(specifier) {\n var f = newFormat(specifier += \"\", formats);\n f.toString = function() { return specifier; };\n return f;\n },\n parse: function(specifier) {\n var p = newParse(specifier += \"\", false);\n p.toString = function() { return specifier; };\n return p;\n },\n utcFormat: function(specifier) {\n var f = newFormat(specifier += \"\", utcFormats);\n f.toString = function() { return specifier; };\n return f;\n },\n utcParse: function(specifier) {\n var p = newParse(specifier += \"\", true);\n p.toString = function() { return specifier; };\n return p;\n }\n };\n}\n\nvar pads = {\"-\": \"\", \"_\": \" \", \"0\": \"0\"},\n numberRe = /^\\s*\\d+/, // note: ignores next directive\n percentRe = /^%/,\n requoteRe = /[\\\\^$*+?|[\\]().{}]/g;\n\nfunction pad(value, fill, width) {\n var sign = value < 0 ? \"-\" : \"\",\n string = (sign ? -value : value) + \"\",\n length = string.length;\n return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);\n}\n\nfunction requote(s) {\n return s.replace(requoteRe, \"\\\\$&\");\n}\n\nfunction formatRe(names) {\n return new RegExp(\"^(?:\" + names.map(requote).join(\"|\") + \")\", \"i\");\n}\n\nfunction formatLookup(names) {\n return new Map(names.map((name, i) => [name.toLowerCase(), i]));\n}\n\nfunction parseWeekdayNumberSunday(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 1));\n return n ? (d.w = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekdayNumberMonday(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 1));\n return n ? (d.u = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekNumberSunday(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.U = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekNumberISO(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.V = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseWeekNumberMonday(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.W = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseFullYear(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 4));\n return n ? (d.y = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseYear(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) : -1;\n}\n\nfunction parseZone(d, string, i) {\n var n = /^(Z)|([+-]\\d\\d)(?::?(\\d\\d))?/.exec(string.slice(i, i + 6));\n return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || \"00\")), i + n[0].length) : -1;\n}\n\nfunction parseQuarter(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 1));\n return n ? (d.q = n[0] * 3 - 3, i + n[0].length) : -1;\n}\n\nfunction parseMonthNumber(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.m = n[0] - 1, i + n[0].length) : -1;\n}\n\nfunction parseDayOfMonth(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.d = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseDayOfYear(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 3));\n return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseHour24(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.H = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseMinutes(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.M = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseSeconds(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 2));\n return n ? (d.S = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseMilliseconds(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 3));\n return n ? (d.L = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseMicroseconds(d, string, i) {\n var n = numberRe.exec(string.slice(i, i + 6));\n return n ? (d.L = Math.floor(n[0] / 1000), i + n[0].length) : -1;\n}\n\nfunction parseLiteralPercent(d, string, i) {\n var n = percentRe.exec(string.slice(i, i + 1));\n return n ? i + n[0].length : -1;\n}\n\nfunction parseUnixTimestamp(d, string, i) {\n var n = numberRe.exec(string.slice(i));\n return n ? (d.Q = +n[0], i + n[0].length) : -1;\n}\n\nfunction parseUnixTimestampSeconds(d, string, i) {\n var n = numberRe.exec(string.slice(i));\n return n ? (d.s = +n[0], i + n[0].length) : -1;\n}\n\nfunction formatDayOfMonth(d, p) {\n return pad(d.getDate(), p, 2);\n}\n\nfunction formatHour24(d, p) {\n return pad(d.getHours(), p, 2);\n}\n\nfunction formatHour12(d, p) {\n return pad(d.getHours() % 12 || 12, p, 2);\n}\n\nfunction formatDayOfYear(d, p) {\n return pad(1 + timeDay.count(timeYear(d), d), p, 3);\n}\n\nfunction formatMilliseconds(d, p) {\n return pad(d.getMilliseconds(), p, 3);\n}\n\nfunction formatMicroseconds(d, p) {\n return formatMilliseconds(d, p) + \"000\";\n}\n\nfunction formatMonthNumber(d, p) {\n return pad(d.getMonth() + 1, p, 2);\n}\n\nfunction formatMinutes(d, p) {\n return pad(d.getMinutes(), p, 2);\n}\n\nfunction formatSeconds(d, p) {\n return pad(d.getSeconds(), p, 2);\n}\n\nfunction formatWeekdayNumberMonday(d) {\n var day = d.getDay();\n return day === 0 ? 7 : day;\n}\n\nfunction formatWeekNumberSunday(d, p) {\n return pad(timeSunday.count(timeYear(d) - 1, d), p, 2);\n}\n\nfunction dISO(d) {\n var day = d.getDay();\n return (day >= 4 || day === 0) ? timeThursday(d) : timeThursday.ceil(d);\n}\n\nfunction formatWeekNumberISO(d, p) {\n d = dISO(d);\n return pad(timeThursday.count(timeYear(d), d) + (timeYear(d).getDay() === 4), p, 2);\n}\n\nfunction formatWeekdayNumberSunday(d) {\n return d.getDay();\n}\n\nfunction formatWeekNumberMonday(d, p) {\n return pad(timeMonday.count(timeYear(d) - 1, d), p, 2);\n}\n\nfunction formatYear(d, p) {\n return pad(d.getFullYear() % 100, p, 2);\n}\n\nfunction formatYearISO(d, p) {\n d = dISO(d);\n return pad(d.getFullYear() % 100, p, 2);\n}\n\nfunction formatFullYear(d, p) {\n return pad(d.getFullYear() % 10000, p, 4);\n}\n\nfunction formatFullYearISO(d, p) {\n var day = d.getDay();\n d = (day >= 4 || day === 0) ? timeThursday(d) : timeThursday.ceil(d);\n return pad(d.getFullYear() % 10000, p, 4);\n}\n\nfunction formatZone(d) {\n var z = d.getTimezoneOffset();\n return (z > 0 ? \"-\" : (z *= -1, \"+\"))\n + pad(z / 60 | 0, \"0\", 2)\n + pad(z % 60, \"0\", 2);\n}\n\nfunction formatUTCDayOfMonth(d, p) {\n return pad(d.getUTCDate(), p, 2);\n}\n\nfunction formatUTCHour24(d, p) {\n return pad(d.getUTCHours(), p, 2);\n}\n\nfunction formatUTCHour12(d, p) {\n return pad(d.getUTCHours() % 12 || 12, p, 2);\n}\n\nfunction formatUTCDayOfYear(d, p) {\n return pad(1 + utcDay.count(utcYear(d), d), p, 3);\n}\n\nfunction formatUTCMilliseconds(d, p) {\n return pad(d.getUTCMilliseconds(), p, 3);\n}\n\nfunction formatUTCMicroseconds(d, p) {\n return formatUTCMilliseconds(d, p) + \"000\";\n}\n\nfunction formatUTCMonthNumber(d, p) {\n return pad(d.getUTCMonth() + 1, p, 2);\n}\n\nfunction formatUTCMinutes(d, p) {\n return pad(d.getUTCMinutes(), p, 2);\n}\n\nfunction formatUTCSeconds(d, p) {\n return pad(d.getUTCSeconds(), p, 2);\n}\n\nfunction formatUTCWeekdayNumberMonday(d) {\n var dow = d.getUTCDay();\n return dow === 0 ? 7 : dow;\n}\n\nfunction formatUTCWeekNumberSunday(d, p) {\n return pad(utcSunday.count(utcYear(d) - 1, d), p, 2);\n}\n\nfunction UTCdISO(d) {\n var day = d.getUTCDay();\n return (day >= 4 || day === 0) ? utcThursday(d) : utcThursday.ceil(d);\n}\n\nfunction formatUTCWeekNumberISO(d, p) {\n d = UTCdISO(d);\n return pad(utcThursday.count(utcYear(d), d) + (utcYear(d).getUTCDay() === 4), p, 2);\n}\n\nfunction formatUTCWeekdayNumberSunday(d) {\n return d.getUTCDay();\n}\n\nfunction formatUTCWeekNumberMonday(d, p) {\n return pad(utcMonday.count(utcYear(d) - 1, d), p, 2);\n}\n\nfunction formatUTCYear(d, p) {\n return pad(d.getUTCFullYear() % 100, p, 2);\n}\n\nfunction formatUTCYearISO(d, p) {\n d = UTCdISO(d);\n return pad(d.getUTCFullYear() % 100, p, 2);\n}\n\nfunction formatUTCFullYear(d, p) {\n return pad(d.getUTCFullYear() % 10000, p, 4);\n}\n\nfunction formatUTCFullYearISO(d, p) {\n var day = d.getUTCDay();\n d = (day >= 4 || day === 0) ? utcThursday(d) : utcThursday.ceil(d);\n return pad(d.getUTCFullYear() % 10000, p, 4);\n}\n\nfunction formatUTCZone() {\n return \"+0000\";\n}\n\nfunction formatLiteralPercent() {\n return \"%\";\n}\n\nfunction formatUnixTimestamp(d) {\n return +d;\n}\n\nfunction formatUnixTimestampSeconds(d) {\n return Math.floor(+d / 1000);\n}\n","import formatLocale from \"./locale.js\";\n\nvar locale;\nexport var timeFormat;\nexport var timeParse;\nexport var utcFormat;\nexport var utcParse;\n\ndefaultLocale({\n dateTime: \"%x, %X\",\n date: \"%-m/%-d/%Y\",\n time: \"%-I:%M:%S %p\",\n periods: [\"AM\", \"PM\"],\n days: [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"],\n shortDays: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n months: [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"],\n shortMonths: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"]\n});\n\nexport default function defaultLocale(definition) {\n locale = formatLocale(definition);\n timeFormat = locale.format;\n timeParse = locale.parse;\n utcFormat = locale.utcFormat;\n utcParse = locale.utcParse;\n return locale;\n}\n","import {utcFormat} from \"./defaultLocale.js\";\n\nexport var isoSpecifier = \"%Y-%m-%dT%H:%M:%S.%LZ\";\n\nfunction formatIsoNative(date) {\n return date.toISOString();\n}\n\nvar formatIso = Date.prototype.toISOString\n ? formatIsoNative\n : utcFormat(isoSpecifier);\n\nexport default formatIso;\n","import {isoSpecifier} from \"./isoFormat.js\";\nimport {utcParse} from \"./defaultLocale.js\";\n\nfunction parseIsoNative(string) {\n var date = new Date(string);\n return isNaN(date) ? null : date;\n}\n\nvar parseIso = +new Date(\"2000-01-01T00:00:00.000Z\")\n ? parseIsoNative\n : utcParse(isoSpecifier);\n\nexport default parseIso;\n","import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';\nimport _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport { vec3, mat4 } from 'gl-matrix';\nimport * as d3 from 'd3-scale';\nimport { L as normalize2D, M as nearestPowerOfTwo } from '../../Common/Core/Math/index.js';\nimport macro from '../../macros.js';\nimport vtkActor from './Actor.js';\nimport vtkBoundingBox from '../../Common/DataModel/BoundingBox.js';\nimport vtkDataArray from '../../Common/Core/DataArray.js';\nimport vtkMapper from './Mapper.js';\nimport vtkPolyData from '../../Common/DataModel/PolyData.js';\nimport vtkTexture from './Texture.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n// vtkCubeAxesActor\n// ----------------------------------------------------------------------------\n// faces are -x x -y y -z z\n// point 0 is 0,0,0 and then +x fastest changing, +y then +z\n\nvar faceNormals = [[-1, 0, 0], [1, 0, 0], [0, -1, 0], [0, 1, 0], [0, 0, -1], [0, 0, 1]];\nvar faceEdges = [[8, 7, 11, 3], [9, 1, 10, 5], [4, 9, 0, 8], [2, 11, 6, 10], [0, 3, 2, 1], [4, 5, 6, 7]];\nvar edgePoints = [[0, 1], [1, 3], [2, 3], [0, 2], [4, 5], [5, 7], [6, 7], [4, 6], [0, 4], [1, 5], [3, 7], [2, 6]];\nvar edgeAxes = [0, 1, 0, 1, 0, 1, 0, 1, 2, 2, 2, 2];\nvar faceAxes = [[1, 2], [1, 2], [0, 2], [0, 2], [0, 1], [0, 1]]; //\n// Developer note: This class is broken into the main class and a helper\n// class. The main class holds view independent properties (those properties\n// that do not change as the view's resolution/aspect ratio change). The\n// helper class is instantiated one per view and holds properties that can\n// depend on view specific values such as resolution. The helper class code\n// could have been left to the View specific implementation (such as\n// vtkWebGPUCubeAxesActor) but is instead placed here to it can be shared by\n// multiple rendering backends.\n//\n// some shared temp variables to reduce heap allocs\n\nvar ptv3 = new Float64Array(3);\nvar pt2v3 = new Float64Array(3);\nvar tmpv3 = new Float64Array(3);\nvar tmp2v3 = new Float64Array(3);\nvar xDir = new Float64Array(3);\nvar yDir = new Float64Array(3);\nvar invmat = new Float64Array(16);\n\nfunction applyTextStyle(ctx, style) {\n ctx.strokeStyle = style.strokeColor;\n ctx.lineWidth = style.strokeSize;\n ctx.fillStyle = style.fontColor;\n ctx.font = \"\".concat(style.fontStyle, \" \").concat(style.fontSize, \"px \").concat(style.fontFamily);\n} // many properties of this actor depend on the API specific view The main\n// dependency being the resolution as that drives what font sizes to use.\n// Bacause of this we need to do some of the calculations in a API specific\n// subclass. But... we don't want a lot of duplicated code between WebGL and\n// WebGPU for example so we have this helper class, that is designed to be\n// fairly API independent so that API specific views can call this to do\n// most of the work.\n\n\nfunction vtkCubeAxesActorHelper(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkCubeAxesActorHelper');\n\n publicAPI.setRenderable = function (renderable) {\n if (model.renderable === renderable) {\n return;\n }\n\n model.renderable = renderable;\n model.tmActor.addTexture(model.renderable.getTmTexture());\n model.tmActor.setProperty(renderable.getProperty());\n model.tmActor.setParentProp(renderable);\n publicAPI.modified();\n }; // called by updateTexturePolyData\n\n\n publicAPI.createPolyDataForOneLabel = function (text, pos, cmat, imat, dir, offset, results) {\n var value = model.renderable.get_tmAtlas().get(text);\n\n if (!value) {\n return;\n }\n\n var coords = model.renderable.getTextPolyData().getPoints().getData(); // compute pixel to distance factors\n\n var size = model.lastSize;\n ptv3[0] = coords[pos * 3];\n ptv3[1] = coords[pos * 3 + 1];\n ptv3[2] = coords[pos * 3 + 2];\n vec3.transformMat4(tmpv3, ptv3, cmat); // moving 0.1 in NDC\n\n tmpv3[0] += 0.1;\n vec3.transformMat4(pt2v3, tmpv3, imat); // results in WC move of\n\n vec3.subtract(xDir, pt2v3, ptv3);\n tmpv3[0] -= 0.1;\n tmpv3[1] += 0.1;\n vec3.transformMat4(pt2v3, tmpv3, imat); // results in WC move of\n\n vec3.subtract(yDir, pt2v3, ptv3);\n\n for (var i = 0; i < 3; i++) {\n xDir[i] /= 0.5 * 0.1 * size[0];\n yDir[i] /= 0.5 * 0.1 * size[1];\n } // have to find the four corners of the texture polygon for this label\n // convert anchor point to View Coords\n\n\n var ptIdx = results.ptIdx;\n var cellIdx = results.cellIdx;\n ptv3[0] = coords[pos * 3];\n ptv3[1] = coords[pos * 3 + 1];\n ptv3[2] = coords[pos * 3 + 2]; // horizontal left, right, or middle alignment based on dir[0]\n\n if (dir[0] < -0.5) {\n vec3.scale(tmpv3, xDir, dir[0] * offset - value.width);\n } else if (dir[0] > 0.5) {\n vec3.scale(tmpv3, xDir, dir[0] * offset);\n } else {\n vec3.scale(tmpv3, xDir, dir[0] * offset - value.width / 2.0);\n }\n\n vec3.add(ptv3, ptv3, tmpv3);\n vec3.scale(tmpv3, yDir, dir[1] * offset - value.height / 2.0);\n vec3.add(ptv3, ptv3, tmpv3);\n results.points[ptIdx * 3] = ptv3[0];\n results.points[ptIdx * 3 + 1] = ptv3[1];\n results.points[ptIdx * 3 + 2] = ptv3[2];\n results.tcoords[ptIdx * 2] = value.tcoords[0];\n results.tcoords[ptIdx * 2 + 1] = value.tcoords[1];\n ptIdx++;\n vec3.scale(tmpv3, xDir, value.width);\n vec3.add(ptv3, ptv3, tmpv3);\n results.points[ptIdx * 3] = ptv3[0];\n results.points[ptIdx * 3 + 1] = ptv3[1];\n results.points[ptIdx * 3 + 2] = ptv3[2];\n results.tcoords[ptIdx * 2] = value.tcoords[2];\n results.tcoords[ptIdx * 2 + 1] = value.tcoords[3];\n ptIdx++;\n vec3.scale(tmpv3, yDir, value.height);\n vec3.add(ptv3, ptv3, tmpv3);\n results.points[ptIdx * 3] = ptv3[0];\n results.points[ptIdx * 3 + 1] = ptv3[1];\n results.points[ptIdx * 3 + 2] = ptv3[2];\n results.tcoords[ptIdx * 2] = value.tcoords[4];\n results.tcoords[ptIdx * 2 + 1] = value.tcoords[5];\n ptIdx++;\n vec3.scale(tmpv3, xDir, value.width);\n vec3.subtract(ptv3, ptv3, tmpv3);\n results.points[ptIdx * 3] = ptv3[0];\n results.points[ptIdx * 3 + 1] = ptv3[1];\n results.points[ptIdx * 3 + 2] = ptv3[2];\n results.tcoords[ptIdx * 2] = value.tcoords[6];\n results.tcoords[ptIdx * 2 + 1] = value.tcoords[7];\n ptIdx++; // add the two triangles to represent the quad\n\n results.polys[cellIdx * 4] = 3;\n results.polys[cellIdx * 4 + 1] = ptIdx - 4;\n results.polys[cellIdx * 4 + 2] = ptIdx - 3;\n results.polys[cellIdx * 4 + 3] = ptIdx - 2;\n cellIdx++;\n results.polys[cellIdx * 4] = 3;\n results.polys[cellIdx * 4 + 1] = ptIdx - 4;\n results.polys[cellIdx * 4 + 2] = ptIdx - 2;\n results.polys[cellIdx * 4 + 3] = ptIdx - 1;\n results.ptIdx += 4;\n results.cellIdx += 2;\n }; // update the polydata associated with drawing the text labels\n // specifically the quads used for each label and their associated tcoords\n // etc. This changes every time the camera viewpoint changes\n\n\n publicAPI.updateTexturePolyData = function () {\n var cmat = model.camera.getCompositeProjectionMatrix(model.lastAspectRatio, -1, 1);\n mat4.transpose(cmat, cmat); // update the polydata\n\n var numLabels = model.renderable.getTextValues().length;\n var numPts = numLabels * 4;\n var numTris = numLabels * 2;\n var points = new Float64Array(numPts * 3);\n var polys = new Uint16Array(numTris * 4);\n var tcoords = new Float32Array(numPts * 2);\n mat4.invert(invmat, cmat);\n var results = {\n ptIdx: 0,\n cellIdx: 0,\n polys: polys,\n points: points,\n tcoords: tcoords\n };\n var ptIdx = 0;\n var textIdx = 0;\n var axisIdx = 0;\n var coords = model.renderable.getTextPolyData().getPoints().getData();\n var textValues = model.renderable.getTextValues();\n\n while (ptIdx < coords.length / 3) {\n // compute the direction to move out\n ptv3[0] = coords[ptIdx * 3];\n ptv3[1] = coords[ptIdx * 3 + 1];\n ptv3[2] = coords[ptIdx * 3 + 2];\n vec3.transformMat4(tmpv3, ptv3, cmat);\n ptv3[0] = coords[ptIdx * 3 + 3];\n ptv3[1] = coords[ptIdx * 3 + 4];\n ptv3[2] = coords[ptIdx * 3 + 5];\n vec3.transformMat4(tmp2v3, ptv3, cmat);\n vec3.subtract(tmpv3, tmpv3, tmp2v3);\n var dir = [tmpv3[0], tmpv3[1]];\n normalize2D(dir); // write the axis label\n\n publicAPI.createPolyDataForOneLabel(textValues[textIdx], ptIdx, cmat, invmat, dir, model.renderable.getAxisTitlePixelOffset(), results);\n ptIdx += 2;\n textIdx++; // write the tick labels\n\n for (var t = 0; t < model.renderable.getTickCounts()[axisIdx]; t++) {\n publicAPI.createPolyDataForOneLabel(textValues[textIdx], ptIdx, cmat, invmat, dir, model.renderable.getTickLabelPixelOffset(), results);\n ptIdx++;\n textIdx++;\n }\n\n axisIdx++;\n }\n\n var tcoordDA = vtkDataArray.newInstance({\n numberOfComponents: 2,\n values: tcoords,\n name: 'TextureCoordinates'\n });\n model.tmPolyData.getPointData().setTCoords(tcoordDA);\n model.tmPolyData.getPoints().setData(points, 3);\n model.tmPolyData.getPoints().modified();\n model.tmPolyData.getPolys().setData(polys, 1);\n model.tmPolyData.getPolys().modified();\n model.tmPolyData.modified();\n };\n\n publicAPI.updateAPISpecificData = function (size, camera, renderWindow) {\n // has the size changed?\n if (model.lastSize[0] !== size[0] || model.lastSize[1] !== size[1]) {\n model.lastSize[0] = size[0];\n model.lastSize[1] = size[1];\n model.lastAspectRatio = size[0] / size[1];\n model.forceUpdate = true;\n }\n\n model.camera = camera; // compute bounds for label quads whenever the camera changes\n\n publicAPI.updateTexturePolyData();\n };\n}\n\nvar newCubeAxesActorHelper = macro.newInstance(function (publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {\n renderable: null\n };\n Object.assign(model, {}, initialValues); // Inheritance\n\n macro.obj(publicAPI, model);\n model.tmPolyData = vtkPolyData.newInstance();\n model.tmMapper = vtkMapper.newInstance();\n model.tmMapper.setInputData(model.tmPolyData);\n model.tmActor = vtkActor.newInstance({\n parentProp: publicAPI\n });\n model.tmActor.setMapper(model.tmMapper);\n macro.setGet(publicAPI, model, ['renderable']);\n macro.get(publicAPI, model, ['lastSize', 'lastAspectRatio', 'axisTextStyle', 'tickTextStyle', 'tmActor', 'ticks']);\n model.forceUpdate = false;\n model.lastRedrawTime = {};\n macro.obj(model.lastRedrawTime, {\n mtime: 0\n });\n model.lastRebuildTime = {};\n macro.obj(model.lastRebuildTime, {\n mtime: 0\n });\n model.lastSize = [-1, -1]; // internal variables\n\n model.lastTickBounds = [];\n vtkCubeAxesActorHelper(publicAPI, model);\n}, 'vtkCubeAxesActorHelper');\n\nfunction vtkCubeAxesActor(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkCubeAxesActor');\n\n publicAPI.setCamera = function (cam) {\n if (model.camera === cam) {\n return;\n }\n\n if (model.cameraModifiedSub) {\n model.cameraModifiedSub.unsubscribe();\n model.cameraModifiedSub = null;\n }\n\n model.camera = cam;\n\n if (cam) {\n model.cameraModifiedSub = cam.onModified(publicAPI.update);\n }\n\n publicAPI.update();\n publicAPI.modified();\n }; // estimate from a camera model what faces to draw\n // return true if the list of faces to draw has changed\n\n\n publicAPI.computeFacesToDraw = function () {\n var cmat = model.camera.getViewMatrix();\n mat4.transpose(cmat, cmat);\n var changed = false;\n var length = vtkBoundingBox.getDiagonalLength(model.dataBounds);\n var faceDot = Math.sin(model.faceVisibilityAngle * Math.PI / 180.0);\n\n for (var f = 0; f < 6; f++) {\n var drawit = false;\n var faceAxis = Math.floor(f / 2);\n var otherAxis1 = (faceAxis + 1) % 3;\n var otherAxis2 = (faceAxis + 2) % 3; // only for non degenerate axes\n\n if (model.dataBounds[otherAxis1 * 2] !== model.dataBounds[otherAxis1 * 2 + 1] && model.dataBounds[otherAxis2 * 2] !== model.dataBounds[otherAxis2 * 2 + 1]) {\n // for each face transform the center and off center to get a direction vector\n ptv3[faceAxis] = model.dataBounds[f] - 0.1 * length * faceNormals[f][faceAxis];\n ptv3[otherAxis1] = 0.5 * (model.dataBounds[otherAxis1 * 2] + model.dataBounds[otherAxis1 * 2 + 1]);\n ptv3[otherAxis2] = 0.5 * (model.dataBounds[otherAxis2 * 2] + model.dataBounds[otherAxis2 * 2 + 1]);\n vec3.transformMat4(tmpv3, ptv3, cmat);\n ptv3[faceAxis] = model.dataBounds[f];\n vec3.transformMat4(tmp2v3, ptv3, cmat);\n vec3.subtract(tmpv3, tmp2v3, tmpv3);\n vec3.normalize(tmpv3, tmpv3); // tmpv3 now holds the face normal vector\n\n drawit = tmpv3[2] > faceDot; // for perspctive we need the view direction to the plane\n\n if (!model.camera.getParallelProjection()) {\n vec3.normalize(tmp2v3, tmp2v3);\n drawit = vec3.dot(tmp2v3, tmpv3) > faceDot;\n }\n }\n\n if (drawit !== model.lastFacesToDraw[f]) {\n model.lastFacesToDraw[f] = drawit;\n changed = true;\n }\n }\n\n return changed;\n }; // update the polydata that represents the boundingd edges and gridlines\n\n\n publicAPI.updatePolyData = function (facesToDraw, edgesToDraw, ticks) {\n // compute the number of points and lines required\n var numPts = 0;\n var numLines = 0;\n numPts += 8; // always start with the 8 cube points\n // count edgesToDraw\n\n var numEdgesToDraw = 0;\n\n for (var e = 0; e < 12; e++) {\n if (edgesToDraw[e] > 0) {\n numEdgesToDraw++;\n }\n }\n\n numLines += numEdgesToDraw; // add values for gridlines\n\n if (model.gridLines) {\n for (var f = 0; f < 6; f++) {\n if (facesToDraw[f]) {\n numPts += ticks[faceAxes[f][0]].length * 2 + ticks[faceAxes[f][1]].length * 2;\n numLines += ticks[faceAxes[f][0]].length + ticks[faceAxes[f][1]].length;\n }\n }\n } // now allocate the memory\n\n\n var points = new Float64Array(numPts * 3);\n var lines = new Uint32Array(numLines * 3);\n var ptIdx = 0;\n var lineIdx = 0; // add the 8 corner points\n\n for (var z = 0; z < 2; z++) {\n for (var y = 0; y < 2; y++) {\n for (var x = 0; x < 2; x++) {\n points[ptIdx * 3] = model.dataBounds[x];\n points[ptIdx * 3 + 1] = model.dataBounds[2 + y];\n points[ptIdx * 3 + 2] = model.dataBounds[4 + z];\n ptIdx++;\n }\n }\n } // draw the edges\n\n\n for (var _e = 0; _e < 12; _e++) {\n if (edgesToDraw[_e] > 0) {\n lines[lineIdx * 3] = 2;\n lines[lineIdx * 3 + 1] = edgePoints[_e][0];\n lines[lineIdx * 3 + 2] = edgePoints[_e][1];\n lineIdx++;\n }\n } // now handle gridlines\n // grid lines are tick[axis1] + ticks[axes2] lines each having two points\n // for simplicity we don;t worry about duplicating points, this is tiny\n\n\n if (model.gridLines) {\n // for each visible face\n // add the points\n for (var _f = 0; _f < 6; _f++) {\n if (facesToDraw[_f]) {\n var faceIdx = Math.floor(_f / 2);\n var aticks = ticks[faceAxes[_f][0]];\n\n for (var t = 0; t < aticks.length; t++) {\n points[ptIdx * 3 + faceIdx] = model.dataBounds[_f];\n points[ptIdx * 3 + faceAxes[_f][0]] = aticks[t];\n points[ptIdx * 3 + faceAxes[_f][1]] = model.dataBounds[faceAxes[_f][1] * 2];\n ptIdx++;\n points[ptIdx * 3 + faceIdx] = model.dataBounds[_f];\n points[ptIdx * 3 + faceAxes[_f][0]] = aticks[t];\n points[ptIdx * 3 + faceAxes[_f][1]] = model.dataBounds[faceAxes[_f][1] * 2 + 1];\n ptIdx++;\n lines[lineIdx * 3] = 2;\n lines[lineIdx * 3 + 1] = ptIdx - 2;\n lines[lineIdx * 3 + 2] = ptIdx - 1;\n lineIdx++;\n }\n\n aticks = ticks[faceAxes[_f][1]];\n\n for (var _t = 0; _t < aticks.length; _t++) {\n points[ptIdx * 3 + faceIdx] = model.dataBounds[_f];\n points[ptIdx * 3 + faceAxes[_f][1]] = aticks[_t];\n points[ptIdx * 3 + faceAxes[_f][0]] = model.dataBounds[faceAxes[_f][0] * 2];\n ptIdx++;\n points[ptIdx * 3 + faceIdx] = model.dataBounds[_f];\n points[ptIdx * 3 + faceAxes[_f][1]] = aticks[_t];\n points[ptIdx * 3 + faceAxes[_f][0]] = model.dataBounds[faceAxes[_f][0] * 2 + 1];\n ptIdx++;\n lines[lineIdx * 3] = 2;\n lines[lineIdx * 3 + 1] = ptIdx - 2;\n lines[lineIdx * 3 + 2] = ptIdx - 1;\n lineIdx++;\n }\n }\n }\n }\n\n model.polyData.getPoints().setData(points, 3);\n model.polyData.getPoints().modified();\n model.polyData.getLines().setData(lines, 1);\n model.polyData.getLines().modified();\n model.polyData.modified();\n }; // update the data that represents where to put the labels\n // in world coordinates. This only changes when faces to draw changes\n // of dataBounds changes\n\n\n publicAPI.updateTextData = function (facesToDraw, edgesToDraw, ticks, tickStrings) {\n // count outside edgesToDraw\n var textPointCount = 0;\n\n for (var e = 0; e < 12; e++) {\n if (edgesToDraw[e] === 1) {\n textPointCount += 2;\n textPointCount += ticks[edgeAxes[e]].length;\n }\n }\n\n var points = model.polyData.getPoints().getData();\n var textPoints = new Float64Array(textPointCount * 3);\n var ptIdx = 0;\n var textIdx = 0;\n var axisCount = 0;\n\n for (var f = 0; f < 6; f++) {\n if (facesToDraw[f]) {\n for (var _e2 = 0; _e2 < 4; _e2++) {\n var edgeIdx = faceEdges[f][_e2];\n\n if (edgesToDraw[edgeIdx] === 1) {\n var edgeAxis = edgeAxes[edgeIdx]; // add a middle point on the edge\n\n var ptIdx1 = edgePoints[edgeIdx][0] * 3;\n var ptIdx2 = edgePoints[edgeIdx][1] * 3;\n textPoints[ptIdx * 3] = 0.5 * (points[ptIdx1] + points[ptIdx2]);\n textPoints[ptIdx * 3 + 1] = 0.5 * (points[ptIdx1 + 1] + points[ptIdx2 + 1]);\n textPoints[ptIdx * 3 + 2] = 0.5 * (points[ptIdx1 + 2] + points[ptIdx2 + 2]);\n ptIdx++; // add a middle face point, we use this to\n // move the labels away from the edge in the right direction\n\n var faceIdx = Math.floor(f / 2);\n textPoints[ptIdx * 3 + faceIdx] = model.dataBounds[f];\n textPoints[ptIdx * 3 + faceAxes[f][0]] = 0.5 * (model.dataBounds[faceAxes[f][0] * 2] + model.dataBounds[faceAxes[f][0] * 2 + 1]);\n textPoints[ptIdx * 3 + faceAxes[f][1]] = 0.5 * (model.dataBounds[faceAxes[f][1] * 2] + model.dataBounds[faceAxes[f][1] * 2 + 1]);\n ptIdx++; // set the text\n\n model.textValues[textIdx] = model.axisLabels[edgeAxis];\n textIdx++; // now add the tick marks along the edgeAxis\n\n var otherAxis1 = (edgeAxis + 1) % 3;\n var otherAxis2 = (edgeAxis + 2) % 3;\n var aticks = ticks[edgeAxis];\n var atickStrings = tickStrings[edgeAxis];\n model.tickCounts[axisCount] = aticks.length;\n\n for (var t = 0; t < aticks.length; t++) {\n textPoints[ptIdx * 3 + edgeAxis] = aticks[t];\n textPoints[ptIdx * 3 + otherAxis1] = points[ptIdx1 + otherAxis1];\n textPoints[ptIdx * 3 + otherAxis2] = points[ptIdx1 + otherAxis2];\n ptIdx++; // set the text\n\n model.textValues[textIdx] = atickStrings[t];\n textIdx++;\n }\n\n axisCount++;\n }\n }\n }\n }\n\n model.textPolyData.getPoints().setData(textPoints, 3);\n model.textPolyData.modified();\n }; // main method to rebuild the cube axes, gets called on camera modify\n // and changes to key members\n\n\n publicAPI.update = function () {\n // Can't do anything if we don't have a camera...\n if (!model.camera) {\n return;\n } // compute what faces to draw\n\n\n var facesChanged = publicAPI.computeFacesToDraw();\n var facesToDraw = model.lastFacesToDraw; // have the bounds changed?\n\n var boundsChanged = false;\n\n for (var i = 0; i < 6; i++) {\n if (model.dataBounds[i] !== model.lastTickBounds[i]) {\n boundsChanged = true;\n model.lastTickBounds[i] = model.dataBounds[i];\n }\n } // did something significant change? If so rebuild a lot of things\n\n\n if (facesChanged || boundsChanged || model.forceUpdate) {\n // compute the edges to draw\n // for each drawn face, mark edges, all single mark edges we draw\n var edgesToDraw = new Array(12).fill(0);\n\n for (var f = 0; f < 6; f++) {\n if (facesToDraw[f]) {\n for (var e = 0; e < 4; e++) {\n edgesToDraw[faceEdges[f][e]]++;\n }\n }\n } // compute tick marks for axes\n\n\n var ticks = [];\n var tickStrings = [];\n\n for (var _i = 0; _i < 3; _i++) {\n var scale = d3.scaleLinear().domain([model.dataBounds[_i * 2], model.dataBounds[_i * 2 + 1]]);\n ticks[_i] = scale.ticks(5);\n var format = scale.tickFormat(5);\n tickStrings[_i] = ticks[_i].map(format);\n } // update gridlines / edge lines\n\n\n publicAPI.updatePolyData(facesToDraw, edgesToDraw, ticks); // compute label world coords and text\n\n publicAPI.updateTextData(facesToDraw, edgesToDraw, ticks, tickStrings); // rebuild the texture only when force or changed bounds, face\n // visibility changes do to change the atlas\n\n if (boundsChanged || model.forceUpdate) {\n publicAPI.updateTextureAtlas(tickStrings);\n }\n }\n\n model.forceUpdate = false;\n }; // create the texture map atlas that contains the rendering of\n // all the text strings. Only needs to be called when the text strings\n // have changed (labels and ticks)\n\n\n publicAPI.updateTextureAtlas = function (tickStrings) {\n // compute the width and height we need\n // set the text properties\n model.tmContext.textBaseline = 'bottom';\n model.tmContext.textAlign = 'left'; // first the three labels\n\n model._tmAtlas.clear();\n\n var maxWidth = 0;\n var totalHeight = 1; // start one pixel in so we have a border\n\n for (var i = 0; i < 3; i++) {\n if (!model._tmAtlas.has(model.axisLabels[i])) {\n applyTextStyle(model.tmContext, model.axisTextStyle);\n var metrics = model.tmContext.measureText(model.axisLabels[i]);\n var entry = {\n height: metrics.actualBoundingBoxAscent + 2,\n startingHeight: totalHeight,\n width: metrics.width + 2,\n textStyle: model.axisTextStyle\n };\n\n model._tmAtlas.set(model.axisLabels[i], entry);\n\n totalHeight += entry.height;\n\n if (maxWidth < entry.width) {\n maxWidth = entry.width;\n }\n } // and the ticks\n\n\n applyTextStyle(model.tmContext, model.tickTextStyle);\n\n for (var t = 0; t < tickStrings[i].length; t++) {\n if (!model._tmAtlas.has(tickStrings[i][t])) {\n var _metrics = model.tmContext.measureText(tickStrings[i][t]);\n\n var _entry = {\n height: _metrics.actualBoundingBoxAscent + 2,\n startingHeight: totalHeight,\n width: _metrics.width + 2,\n textStyle: model.tickTextStyle\n };\n\n model._tmAtlas.set(tickStrings[i][t], _entry);\n\n totalHeight += _entry.height;\n\n if (maxWidth < _entry.width) {\n maxWidth = _entry.width;\n }\n }\n }\n } // always use power of two to avoid interpolation\n // in cases where PO2 is required\n\n\n maxWidth = nearestPowerOfTwo(maxWidth);\n totalHeight = nearestPowerOfTwo(totalHeight); // set the tcoord values\n\n model._tmAtlas.forEach(function (value) {\n value.tcoords = [0.0, (totalHeight - value.startingHeight - value.height) / totalHeight, value.width / maxWidth, (totalHeight - value.startingHeight - value.height) / totalHeight, value.width / maxWidth, (totalHeight - value.startingHeight) / totalHeight, 0.0, (totalHeight - value.startingHeight) / totalHeight];\n }); // make sure we have power of two dimensions\n\n\n model.tmCanvas.width = maxWidth;\n model.tmCanvas.height = totalHeight;\n model.tmContext.textBaseline = 'bottom';\n model.tmContext.textAlign = 'left';\n model.tmContext.clearRect(0, 0, maxWidth, totalHeight); // draw the text onto the texture\n\n model._tmAtlas.forEach(function (value, key) {\n applyTextStyle(model.tmContext, value.textStyle);\n model.tmContext.fillText(key, 1, value.startingHeight + value.height - 1);\n });\n\n model.tmTexture.setCanvas(model.tmCanvas);\n model.tmTexture.modified();\n }; // Make sure the data is correct\n\n\n publicAPI.onModified(function () {\n model.forceUpdate = true;\n publicAPI.update();\n });\n\n publicAPI.setTickTextStyle = function (tickStyle) {\n model.tickTextStyle = _objectSpread(_objectSpread({}, model.tickTextStyle), tickStyle);\n publicAPI.modified();\n };\n\n publicAPI.setAxisTextStyle = function (axisStyle) {\n model.axisTextStyle = _objectSpread(_objectSpread({}, model.axisTextStyle), axisStyle);\n publicAPI.modified();\n };\n\n publicAPI.get_tmAtlas = function () {\n return model._tmAtlas;\n }; // try to get the bounds for the annotation. This is complicated\n // as it relies on the pixel size of the window. Every time the camera\n // changes the bounds change. This method simplifies by just expanding\n // the grid bounds by a user specified factor.\n\n\n publicAPI.getBounds = function () {\n publicAPI.update();\n vtkBoundingBox.setBounds(model.bounds, model.gridActor.getBounds());\n vtkBoundingBox.scaleAboutCenter(model.bounds, model.boundsScaleFactor, model.boundsScaleFactor, model.boundsScaleFactor);\n return model.bounds;\n }; // Make sure the grid share the actor property\n\n\n var _setProp = macro.chain(publicAPI.setProperty, model.gridActor.setProperty);\n\n publicAPI.setProperty = function (p) {\n return _setProp(p)[0];\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nfunction defaultValues(initialValues) {\n return _objectSpread({\n boundsScaleFactor: 1.3,\n camera: null,\n dataBounds: _toConsumableArray(vtkBoundingBox.INIT_BOUNDS),\n faceVisibilityAngle: 8,\n gridLines: true,\n axisLabels: null,\n axisTitlePixelOffset: 35.0,\n axisTextStyle: {\n fontColor: 'white',\n fontStyle: 'normal',\n fontSize: 18,\n fontFamily: 'serif'\n },\n tickLabelPixelOffset: 12.0,\n tickTextStyle: {\n fontColor: 'white',\n fontStyle: 'normal',\n fontSize: 14,\n fontFamily: 'serif'\n }\n }, initialValues);\n} // ----------------------------------------------------------------------------\n\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, defaultValues(initialValues)); // Inheritance\n\n vtkActor.extend(publicAPI, model, initialValues); // internal variables\n\n model.lastFacesToDraw = [false, false, false, false, false, false];\n model.axisLabels = ['X-Axis', 'Y-Axis', 'Z-Axis'];\n model.tickCounts = [];\n model.textValues = [];\n model.lastTickBounds = [];\n model.tmCanvas = document.createElement('canvas');\n model.tmContext = model.tmCanvas.getContext('2d');\n model._tmAtlas = new Map(); // for texture atlas\n\n model.tmTexture = vtkTexture.newInstance();\n model.tmTexture.setInterpolate(false);\n publicAPI.getProperty().setDiffuse(0.0);\n publicAPI.getProperty().setAmbient(1.0);\n model.gridMapper = vtkMapper.newInstance();\n model.polyData = vtkPolyData.newInstance();\n model.gridMapper.setInputData(model.polyData);\n model.gridActor = vtkActor.newInstance();\n model.gridActor.setMapper(model.gridMapper);\n model.gridActor.setProperty(publicAPI.getProperty());\n model.gridActor.setParentProp(publicAPI);\n model.textPolyData = vtkPolyData.newInstance();\n macro.setGet(publicAPI, model, ['axisTitlePixelOffset', 'boundsScaleFactor', 'faceVisibilityAngle', 'gridLines', 'tickLabelPixelOffset']);\n macro.setGetArray(publicAPI, model, ['dataBounds'], 6);\n macro.setGetArray(publicAPI, model, ['axisLabels'], 3);\n macro.get(publicAPI, model, ['axisTextStyle', 'tickTextStyle', 'camera', 'tmTexture', 'textValues', 'textPolyData', 'tickCounts', 'gridActor']); // Object methods\n\n vtkCubeAxesActor(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkCubeAxesActor'); // ----------------------------------------------------------------------------\n\nvar vtkCubeAxesActor$1 = {\n newInstance: newInstance,\n extend: extend,\n newCubeAxesActorHelper: newCubeAxesActorHelper\n};\n\nexport { vtkCubeAxesActor$1 as default, extend, newInstance };\n","import { newInstance as newInstance$1 } from '../../macros.js';\nimport vtkCubeAxesActor from '../Core/CubeAxesActor.js';\nimport vtkViewNode from '../SceneGraph/ViewNode.js';\nimport { registerOverride } from './ViewNodeFactory.js';\n\n// vtkOpenGLCubeAxesActor methods\n// ----------------------------------------------------------------------------\n\nfunction vtkOpenGLCubeAxesActor(publicAPI, model) {\n model.classHierarchy.push('vtkOpenGLCubeAxesActor'); // Builds myself.\n\n publicAPI.buildPass = function (prepass) {\n if (prepass) {\n model._openGLRenderer = publicAPI.getFirstAncestorOfType('vtkOpenGLRenderer');\n model._openGLRenderWindow = model._openGLRenderer.getParent();\n\n if (!model.CubeAxesActorHelper.getRenderable()) {\n model.CubeAxesActorHelper.setRenderable(model.renderable);\n }\n\n publicAPI.prepareNodes();\n publicAPI.addMissingNode(model.CubeAxesActorHelper.getTmActor());\n publicAPI.addMissingNode(model.renderable.getGridActor());\n publicAPI.removeUnusedNodes();\n }\n };\n\n publicAPI.opaquePass = function (prepass, renderPass) {\n if (prepass) {\n var camera = model._openGLRenderer ? model._openGLRenderer.getRenderable().getActiveCamera() : null;\n\n var tsize = model._openGLRenderer.getTiledSizeAndOrigin();\n\n model.CubeAxesActorHelper.updateAPISpecificData([tsize.usize, tsize.vsize], camera, model._openGLRenderWindow.getRenderable());\n }\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkViewNode.extend(publicAPI, model, initialValues);\n model.CubeAxesActorHelper = vtkCubeAxesActor.newCubeAxesActorHelper(); // Object methods\n\n vtkOpenGLCubeAxesActor(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend, 'vtkOpenGLCubeAxesActor'); // ----------------------------------------------------------------------------\n\nvar index = {\n newInstance: newInstance,\n extend: extend\n}; // Register ourself to OpenGL backend if imported\n\nregisterOverride('vtkCubeAxesActor', newInstance);\n\nexport { index as default, extend, newInstance };\n","import macro from '../../macros.js';\nimport vtkAbstractMapper from './AbstractMapper.js';\nimport vtkLookupTable from '../../Common/Core/LookupTable.js';\nimport Constants from './Mapper/Constants.js';\n\nvar ColorMode = Constants.ColorMode,\n ScalarMode = Constants.ScalarMode,\n GetArray = Constants.GetArray; // ---------------------------------------------------------------------------\n// vtkMapper2D methods\n// ---------------------------------------------------------------------------\n\nfunction vtkMapper2D(publicAPI, model) {\n // Set out className\n model.classHierarchy.push('vtkMapper2D');\n\n publicAPI.createDefaultLookupTable = function () {\n model.lookupTable = vtkLookupTable.newInstance();\n };\n\n publicAPI.getColorModeAsString = function () {\n return macro.enumToString(ColorMode, model.colorMode);\n };\n\n publicAPI.setColorModeToDefault = function () {\n return publicAPI.setColorMode(0);\n };\n\n publicAPI.setColorModeToMapScalars = function () {\n return publicAPI.setColorMode(1);\n };\n\n publicAPI.setColorModeToDirectScalars = function () {\n return publicAPI.setColorMode(2);\n };\n\n publicAPI.getScalarModeAsString = function () {\n return macro.enumToString(ScalarMode, model.scalarMode);\n };\n\n publicAPI.setScalarModeToDefault = function () {\n return publicAPI.setScalarMode(0);\n };\n\n publicAPI.setScalarModeToUsePointData = function () {\n return publicAPI.setScalarMode(1);\n };\n\n publicAPI.setScalarModeToUseCellData = function () {\n return publicAPI.setScalarMode(2);\n };\n\n publicAPI.setScalarModeToUsePointFieldData = function () {\n return publicAPI.setScalarMode(3);\n };\n\n publicAPI.setScalarModeToUseCellFieldData = function () {\n return publicAPI.setScalarMode(4);\n };\n\n publicAPI.setScalarModeToUseFieldData = function () {\n return publicAPI.setScalarMode(5);\n };\n\n publicAPI.getAbstractScalars = function (input, scalarMode, arrayAccessMode, arrayId, arrayName) {\n // make sure we have an input\n if (!input || !model.scalarVisibility) {\n return {\n scalars: null,\n cellFLag: false\n };\n }\n\n var scalars = null;\n var cellFlag = false; // get scalar data and point/cell attribute according to scalar mode\n\n if (scalarMode === ScalarMode.DEFAULT) {\n scalars = input.getPointData().getScalars();\n\n if (!scalars) {\n scalars = input.getCellData().getScalars();\n cellFlag = true;\n }\n } else if (scalarMode === ScalarMode.USE_POINT_DATA) {\n scalars = input.getPointData().getScalars();\n } else if (scalarMode === ScalarMode.USE_CELL_DATA) {\n scalars = input.getCellData().getScalars();\n cellFlag = true;\n } else if (scalarMode === ScalarMode.USE_POINT_FIELD_DATA) {\n var pd = input.getPointData();\n\n if (arrayAccessMode === GetArray.BY_ID) {\n scalars = pd.getArrayByIndex(arrayId);\n } else {\n scalars = pd.getArrayByName(arrayName);\n }\n } else if (scalarMode === ScalarMode.USE_CELL_FIELD_DATA) {\n var cd = input.getCellData();\n cellFlag = true;\n\n if (arrayAccessMode === GetArray.BY_ID) {\n scalars = cd.getArrayByIndex(arrayId);\n } else {\n scalars = cd.getArrayByName(arrayName);\n }\n } else if (scalarMode === ScalarMode.USE_FIELD_DATA) {\n var fd = input.getFieldData();\n\n if (arrayAccessMode === GetArray.BY_ID) {\n scalars = fd.getArrayByIndex(arrayId);\n } else {\n scalars = fd.getArrayByName(arrayName);\n }\n }\n\n return {\n scalars: scalars,\n cellFlag: cellFlag\n };\n };\n\n publicAPI.getLookupTable = function () {\n if (!model.lookupTable) {\n publicAPI.createDefaultLookupTable();\n }\n\n return model.lookupTable;\n };\n\n publicAPI.getMTime = function () {\n var mt = model.mtime;\n\n if (model.lookupTable !== null) {\n var time = model.lookupTable.getMTime();\n mt = time > mt ? time : mt;\n }\n\n return mt;\n };\n\n publicAPI.mapScalars = function (input, alpha) {\n var scalars = publicAPI.getAbstractScalars(input, model.scalarMode, model.arrayAccessMode, model.arrayId, model.colorByArrayName).scalars;\n\n if (!scalars) {\n model.colorMapColors = null;\n return;\n } // we want to only recompute when something has changed\n\n\n var toString = \"\".concat(publicAPI.getMTime()).concat(scalars.getMTime()).concat(alpha);\n if (model.colorBuildString === toString) return;\n\n if (!model.useLookupTableScalarRange) {\n publicAPI.getLookupTable().setRange(model.scalarRange[0], model.scalarRange[1]);\n }\n\n var lut = publicAPI.getLookupTable();\n\n if (lut) {\n // Ensure that the lookup table is built\n lut.build();\n model.colorMapColors = lut.mapScalars(scalars, model.colorMode, model.fieldDataTupleId);\n }\n\n model.colorBuildString = \"\".concat(publicAPI.getMTime()).concat(scalars.getMTime()).concat(alpha);\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n static: false,\n lookupTable: null,\n scalarVisibility: false,\n scalarRange: [0, 1],\n useLookupTableScalarRange: false,\n colorMode: 0,\n scalarMode: 0,\n arrayAccessMode: 1,\n // By_NAME\n renderTime: 0,\n colorByArrayName: null,\n transformCoordinate: null,\n viewSpecificProperties: null,\n customShaderAttributes: []\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkAbstractMapper.extend(publicAPI, model, initialValues);\n macro.get(publicAPI, model, ['colorMapColors']);\n macro.setGet(publicAPI, model, ['arrayAccessMode', 'colorByArrayName', 'colorMode', 'lookupTable', 'renderTime', 'scalarMode', 'scalarVisibility', 'static', 'transformCoordinate', 'useLookupTableScalarRange', 'viewSpecificProperties', 'customShaderAttributes' // point data array names that will be transferred to the VBO\n ]);\n macro.setGetArray(publicAPI, model, ['scalarRange'], 2);\n\n if (!model.viewSpecificProperties) {\n model.viewSpecificProperties = {};\n } // Object methods\n\n\n vtkMapper2D(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkMapper2D'); // ----------------------------------------------------------------------------\n\nvar vtkMapper2D$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkMapper2D$1 as default, extend, newInstance };\n","var vtkPolyData2DFS = \"//VTK::System::Dec\\n\\n/*=========================================================================\\n\\n Program: Visualization Toolkit\\n Module: vtkPolyData2DFS.glsl\\n\\n Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen\\n All rights reserved.\\n See Copyright.txt or http://www.kitware.com/Copyright.htm for details.\\n\\n This software is distributed WITHOUT ANY WARRANTY; without even\\n the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR\\n PURPOSE. See the above copyright notice for more information.\\n\\n=========================================================================*/\\n\\nuniform int PrimitiveIDOffset;\\n\\n// Texture coordinates\\n//VTK::TCoord::Dec\\n\\n// Scalar coloring\\n//VTK::Color::Dec\\n\\n// Depth Peeling\\n//VTK::DepthPeeling::Dec\\n\\n// picking support\\n//VTK::Picking::Dec\\n\\n// the output of this shader\\n//VTK::Output::Dec\\n\\n// Apple Bug\\n//VTK::PrimID::Dec\\n\\nvoid main()\\n{\\n // Apple Bug\\n //VTK::PrimID::Impl\\n\\n //VTK::Color::Impl\\n //VTK::TCoord::Impl\\n\\n //VTK::DepthPeeling::Impl\\n //VTK::Picking::Impl\\n\\n if (gl_FragData[0].a <= 0.0)\\n {\\n discard;\\n }\\n}\\n\";\n\nexport { vtkPolyData2DFS as v };\n","var vtkPolyData2DVS = \"//VTK::System::Dec\\n\\n/*=========================================================================\\n\\n Program: Visualization Toolkit\\n Module: vtkPolyData2DVS.glsl\\n\\n Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen\\n All rights reserved.\\n See Copyright.txt or http://www.kitware.com/Copyright.htm for details.\\n\\n This software is distributed WITHOUT ANY WARRANTY; without even\\n the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR\\n PURPOSE. See the above copyright notice for more information.\\n\\n=========================================================================*/\\n\\n// all variables that represent positions or directions have a suffix\\n// indicating the coordinate system they are in. The possible values are\\n// MC - Model Coordinates\\n// WC - WC world coordinates\\n// VC - View Coordinates\\n// DC - Display Coordinates\\n\\nin vec4 vertexWC;\\n\\n// frag position in VC\\n//VTK::PositionVC::Dec\\n\\n// material property values\\n//VTK::Color::Dec\\n\\n// Texture coordinates\\n//VTK::TCoord::Dec\\n\\n// Apple Bug\\n//VTK::PrimID::Dec\\n\\nuniform mat4 WCVCMatrix; // World to view matrix\\n\\nvoid main()\\n{\\n // Apple Bug\\n //VTK::PrimID::Impl\\n\\n gl_Position = WCVCMatrix*vertexWC;\\n\\n //VTK::TCoord::Impl\\n\\n //VTK::Color::Impl\\n\\n //VTK::PositionVC::Impl\\n}\\n\";\n\nexport { vtkPolyData2DVS as v };\n","var DisplayLocation = {\n BACKGROUND: 0,\n FOREGROUND: 1\n};\nvar Constants = {\n DisplayLocation: DisplayLocation\n};\n\nexport { DisplayLocation, Constants as default };\n","import { mat4 } from 'gl-matrix';\nimport { newInstance as newInstance$1, setGet, obj, vtkErrorMacro as vtkErrorMacro$1 } from '../../macros.js';\nimport vtkHelper from './Helper.js';\nimport vtkMapper2D from '../Core/Mapper2D.js';\nimport vtkPoints from '../../Common/Core/Points.js';\nimport { v as vtkPolyData2DFS } from './glsl/vtkPolyData2DFS.glsl.js';\nimport { v as vtkPolyData2DVS } from './glsl/vtkPolyData2DVS.glsl.js';\nimport vtkReplacementShaderMapper from './ReplacementShaderMapper.js';\nimport vtkShaderProgram from './ShaderProgram.js';\nimport vtkViewNode from '../SceneGraph/ViewNode.js';\nimport { K as round } from '../../Common/Core/Math/index.js';\nimport { DisplayLocation } from '../Core/Property2D/Constants.js';\nimport { registerOverride } from './ViewNodeFactory.js';\n\n// import { mat3, mat4, vec3 } from 'gl-matrix';\nvar primTypes = vtkHelper.primTypes;\nvar ScalarMode = vtkMapper2D.ScalarMode;\nvar vtkErrorMacro = vtkErrorMacro$1;\nvar StartEvent = {\n type: 'StartEvent'\n};\nvar EndEvent = {\n type: 'EndEvent'\n}; // ----------------------------------------------------------------------------\n// vtkOpenGLPolyDataMapper2D methods\n// ----------------------------------------------------------------------------\n\nfunction vtkOpenGLPolyDataMapper2D(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkOpenGLPolyDataMapper2D');\n\n publicAPI.buildPass = function (prepass) {\n if (prepass) {\n model.openGLActor2D = publicAPI.getFirstAncestorOfType('vtkOpenGLActor2D');\n model._openGLRenderer = model.openGLActor2D.getFirstAncestorOfType('vtkOpenGLRenderer');\n model._openGLRenderWindow = model._openGLRenderer.getParent();\n model.openGLCamera = model._openGLRenderer.getViewNodeFor(model._openGLRenderer.getRenderable().getActiveCamera());\n }\n };\n\n publicAPI.overlayPass = function (prepass) {\n if (prepass) {\n publicAPI.render();\n }\n };\n\n publicAPI.getShaderTemplate = function (shaders, ren, actor) {\n shaders.Vertex = vtkPolyData2DVS;\n shaders.Fragment = vtkPolyData2DFS;\n shaders.Geometry = '';\n };\n\n publicAPI.render = function () {\n var ctx = model._openGLRenderWindow.getContext();\n\n if (model.context !== ctx) {\n model.context = ctx;\n\n for (var i = primTypes.Start; i < primTypes.End; i++) {\n model.primitives[i].setOpenGLRenderWindow(model._openGLRenderWindow);\n }\n }\n\n var actor = model.openGLActor2D.getRenderable();\n\n var ren = model._openGLRenderer.getRenderable();\n\n publicAPI.renderPiece(ren, actor);\n };\n\n publicAPI.renderPiece = function (ren, actor) {\n publicAPI.invokeEvent(StartEvent);\n\n if (!model.renderable.getStatic()) {\n model.renderable.update();\n }\n\n model.currentInput = model.renderable.getInputData();\n publicAPI.invokeEvent(EndEvent);\n\n if (!model.currentInput) {\n vtkErrorMacro('No input!');\n return;\n } // if there are no points then we are done\n\n\n if (!model.currentInput.getPoints || !model.currentInput.getPoints().getNumberOfValues()) {\n return;\n }\n\n publicAPI.renderPieceStart(ren, actor);\n publicAPI.renderPieceDraw(ren, actor);\n publicAPI.renderPieceFinish(ren, actor);\n };\n\n publicAPI.renderPieceStart = function (ren, actor) {\n model.primitiveIDOffset = 0;\n\n if (model._openGLRenderer.getSelector()) {\n switch (model._openGLRenderer.getSelector().getCurrentPass()) {\n default:\n model._openGLRenderer.getSelector().renderProp(actor);\n\n }\n } // make sure the BOs are up to date\n\n\n publicAPI.updateBufferObjects(ren, actor); // Bind the OpenGL, this is shared between the different primitive/cell types.\n\n model.lastBoundBO = null;\n };\n\n publicAPI.getNeedToRebuildShaders = function (cellBO, ren, actor) {\n // has something changed that would require us to recreate the shader?\n // candidates are\n // property modified (representation interpolation and lighting)\n // input modified\n // light complexity changed\n if (cellBO.getShaderSourceTime().getMTime() < model.renderable.getMTime() || cellBO.getShaderSourceTime().getMTime() < model.currentInput.getMTime()) {\n return true;\n }\n\n return false;\n };\n\n publicAPI.updateBufferObjects = function (ren, actor) {\n // Rebuild buffers if needed\n if (publicAPI.getNeedToRebuildBufferObjects(ren, actor)) {\n publicAPI.buildBufferObjects(ren, actor);\n }\n };\n\n publicAPI.getNeedToRebuildBufferObjects = function (ren, actor) {\n // first do a coarse check\n // Note that the actor's mtime includes it's properties mtime\n var vmtime = model.VBOBuildTime.getMTime();\n\n if (vmtime < publicAPI.getMTime() || vmtime < model._openGLRenderWindow.getMTime() || vmtime < model.renderable.getMTime() || vmtime < actor.getMTime() || vmtime < model.currentInput.getMTime() || model.renderable.getTransformCoordinate() && vmtime < ren.getMTime()) {\n return true;\n }\n\n return false;\n };\n\n publicAPI.buildBufferObjects = function (ren, actor) {\n var poly = model.currentInput;\n\n if (poly === null) {\n return;\n }\n\n model.renderable.mapScalars(poly, actor.getProperty().getOpacity());\n var c = model.renderable.getColorMapColors();\n model.haveCellScalars = false;\n var scalarMode = model.renderable.getScalarMode();\n\n if (model.renderable.getScalarVisibility()) {\n // We must figure out how the scalars should be mapped to the polydata.\n if ((scalarMode === ScalarMode.USE_CELL_DATA || scalarMode === ScalarMode.USE_CELL_FIELD_DATA || scalarMode === ScalarMode.USE_FIELD_DATA || !poly.getPointData().getScalars()) && scalarMode !== ScalarMode.USE_POINT_FIELD_DATA && c) {\n model.haveCellScalars = true;\n }\n }\n\n var representation = actor.getProperty().getRepresentation();\n var tcoords = poly.getPointData().getTCoords();\n\n if (!model.openGLActor2D.getActiveTextures()) {\n tcoords = null;\n }\n\n var transformCoordinate = model.renderable.getTransformCoordinate();\n var view = ren.getRenderWindow().getViews()[0];\n var vsize = view.getViewportSize(ren);\n var toString = \"\".concat(poly.getMTime(), \"A\").concat(representation, \"B\").concat(poly.getMTime()) + \"C\".concat(c ? c.getMTime() : 1) + \"D\".concat(tcoords ? tcoords.getMTime() : 1) + \"E\".concat(transformCoordinate ? ren.getMTime() : 1) + \"F\".concat(vsize);\n\n if (model.VBOBuildString !== toString) {\n // Build the VBOs\n var points = poly.getPoints();\n\n if (transformCoordinate) {\n var p = vtkPoints.newInstance();\n var numPts = points.getNumberOfPoints();\n p.setNumberOfPoints(numPts);\n var point = [];\n\n for (var i = 0; i < numPts; ++i) {\n points.getPoint(i, point);\n transformCoordinate.setValue(point);\n var v = transformCoordinate.getComputedDoubleViewportValue(ren);\n p.setPoint(i, v[0], v[1], 0.0);\n }\n\n points = p;\n }\n\n var options = {\n points: points,\n tcoords: tcoords,\n colors: c,\n cellOffset: 0,\n haveCellScalars: model.haveCellSCalars,\n customAttributes: model.renderable.getCustomShaderAttributes().map(function (arrayName) {\n return poly.getPointData().getArrayByName(arrayName);\n })\n };\n options.cellOffset += model.primitives[primTypes.Points].getCABO().createVBO(poly.getVerts(), 'verts', representation, options);\n options.cellOffset += model.primitives[primTypes.Lines].getCABO().createVBO(poly.getLines(), 'lines', representation, options);\n options.cellOffset += model.primitives[primTypes.Tris].getCABO().createVBO(poly.getPolys(), 'polys', representation, options);\n options.cellOffset += model.primitives[primTypes.TriStrips].getCABO().createVBO(poly.getStrips(), 'strips', representation, options);\n model.VBOBuildTime.modified();\n model.VBOBuildString = toString;\n }\n };\n\n publicAPI.renderPieceDraw = function (ren, actor) {\n var representation = actor.getProperty().getRepresentation();\n var gl = model.context;\n gl.depthMask(true); // for every primitive type\n\n for (var i = primTypes.Start; i < primTypes.End; i++) {\n // if there are entries\n var cabo = model.primitives[i].getCABO();\n\n if (cabo.getElementCount()) {\n model.lastBoundBO = model.primitives[i];\n model.primitiveIDOffset += model.primitives[i].drawArrays(ren, actor, representation, publicAPI);\n }\n }\n };\n\n publicAPI.renderPieceFinish = function (ren, actor) {\n if (model.lastBoundBO) {\n model.lastBoundBO.getVAO().release();\n }\n };\n\n publicAPI.replaceShaderValues = function (shaders, ren, actor) {\n publicAPI.replaceShaderColor(shaders, ren, actor);\n publicAPI.replaceShaderTCoord(shaders, ren, actor);\n publicAPI.replaceShaderPicking(shaders, ren, actor);\n publicAPI.replaceShaderPositionVC(shaders, ren, actor);\n };\n\n publicAPI.replaceShaderColor = function (shaders, ren, actor) {\n var VSSource = shaders.Vertex;\n var GSSource = shaders.Geometry;\n var FSSource = shaders.Fragment;\n\n if (model.haveCellScalars) {\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Color::Dec', ['uniform samplerBuffer texture1;']).result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Color::Impl', ['gl_FragData[0] = texelFetchBuffer(texture1, gl_PrimitiveID + PrimitiveIDOffset);']).result;\n }\n\n if (model.lastBoundBO.getCABO().getColorComponents() !== 0) {\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::Color::Dec', ['in vec4 diffuseColor;', 'out vec4 fcolorVSOutput;']).result;\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::Color::Impl', ['fcolorVSOutput = diffuseColor;']).result;\n GSSource = vtkShaderProgram.substitute(GSSource, '//VTK::Color::Dec', ['in vec4 fcolorVSOutput[];\\n', 'out vec4 fcolorGSOutput;']).result;\n GSSource = vtkShaderProgram.substitute(GSSource, '//VTK::Color::Impl', ['fcolorGSOutput = fcolorVSOutput[i];']).result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Color::Dec', ['in vec4 fcolorVSOutput;']).result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Color::Impl', ['gl_FragData[0] = fcolorVSOutput;']).result;\n } else {\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Color::Dec', ['uniform vec4 diffuseColor;']).result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Color::Impl', ['gl_FragData[0] = diffuseColor;']).result;\n }\n\n shaders.Vertex = VSSource;\n shaders.Geometry = GSSource;\n shaders.Fragment = FSSource;\n };\n\n publicAPI.replaceShaderTCoord = function (shaders, ren, actor) {\n if (model.lastBoundBO.getCABO().getTCoordOffset()) {\n var VSSource = shaders.Vertex;\n var GSSource = shaders.Geometry;\n var FSSource = shaders.Fragment;\n var tcdim = model.lastBoundBO.getCABO().getTCoordComponents();\n\n if (tcdim === 1) {\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::TCoord::Dec', ['in float tcoordMC;', 'out float tcoordVCVSOutput;']).result;\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::TCoord::Impl', ['tcoordVCVSOutput = tcoordMC;']).result;\n GSSource = vtkShaderProgram.substitute(GSSource, '//VTK::TCoord::Dec', ['in float tcoordVCVSOutput[];\\n', 'out float tcoordVCGSOutput;']).result;\n GSSource = vtkShaderProgram.substitute(GSSource, ['//VTK::TCoord::Impl', 'tcoordVCGSOutput = tcoordVCVSOutput[i];']).result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::TCoord::Dec', ['in float tcoordVCVSOutput;', 'uniform sampler2D texture1;']).result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::TCoord::Impl', ['gl_FragData[0] = gl_FragData[0]*texture2D(texture1, vec2(tcoordVCVSOutput,0));']).result;\n } else if (tcdim === 2) {\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::TCoord::Dec', ['in vec2 tcoordMC;', 'out vec2 tcoordVCVSOutput;']).result;\n VSSource = vtkShaderProgram.substitute(VSSource, '//VTK::TCoord::Impl', ['tcoordVCVSOutput = tcoordMC;']).result;\n GSSource = vtkShaderProgram.substitute(GSSource, '//VTK::TCoord::Dec', ['in vec2 tcoordVCVSOutput[];\\n', 'out vec2 tcoordVCGSOutput;']).result;\n GSSource = vtkShaderProgram.substitute(GSSource, '//VTK::TCoord::Impl', ['tcoordVCGSOutput = tcoordVCVSOutput[i];']).result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::TCoord::Dec', ['in vec2 tcoordVCVSOutput;', 'uniform sampler2D texture1;']).result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::TCoord::Impl', ['gl_FragData[0] = gl_FragData[0]*texture2D(texture1, tcoordVCVSOutput.st);']).result;\n }\n\n if (model.haveCellScalars) {\n GSSource = vtkShaderProgram.substitute(GSSource, '//VTK::PrimID::Impl', ['gl_PrimitiveID = gl_PrimitiveIDIn;']).result;\n }\n\n shaders.Vertex = VSSource;\n shaders.Geometry = GSSource;\n shaders.Fragment = FSSource;\n }\n };\n\n publicAPI.replaceShaderPicking = function (shaders, ren, actor) {\n var FSSource = shaders.Fragment;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Picking::Dec', ['uniform vec3 mapperIndex;', 'uniform int picking;']).result;\n FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::Picking::Impl', ' gl_FragData[0] = picking != 0 ? vec4(mapperIndex,1.0) : gl_FragData[0];').result;\n shaders.Fragment = FSSource;\n };\n\n publicAPI.replaceShaderPositionVC = function (shaders, ren, actor) {\n // replace common shader code\n model.lastBoundBO.replaceShaderPositionVC(shaders, ren, actor);\n };\n\n publicAPI.invokeShaderCallbacks = function (cellBO, ren, actor) {\n var listCallbacks = model.renderable.getViewSpecificProperties().ShadersCallbacks;\n\n if (listCallbacks) {\n listCallbacks.forEach(function (object) {\n object.callback(object.userData, cellBO, ren, actor);\n });\n }\n };\n\n publicAPI.setMapperShaderParameters = function (cellBO, ren, actor) {\n // Now to update the VAO too, if necessary.\n if (cellBO.getProgram().isUniformUsed('PrimitiveIDOffset')) {\n cellBO.getProgram().setUniformi('PrimitiveIDOffset', model.primitiveIDOffset);\n }\n\n if (cellBO.getProgram().isAttributeUsed('vertexWC')) {\n if (!cellBO.getVAO().addAttributeArray(cellBO.getProgram(), cellBO.getCABO(), 'vertexWC', cellBO.getCABO().getVertexOffset(), cellBO.getCABO().getStride(), model.context.FLOAT, 3, false)) {\n vtkErrorMacro('Error setting vertexWC in shader VAO.');\n }\n }\n\n if (cellBO.getCABO().getElementCount() && (model.VBOBuildTime.getMTime() > cellBO.getAttributeUpdateTime().getMTime() || cellBO.getShaderSourceTime().getMTime() > cellBO.getAttributeUpdateTime().getMTime())) {\n model.renderable.getCustomShaderAttributes().forEach(function (attrName, idx) {\n if (cellBO.getProgram().isAttributeUsed(\"\".concat(attrName, \"MC\"))) {\n if (!cellBO.getVAO().addAttributeArray(cellBO.getProgram(), cellBO.getCABO(), \"\".concat(attrName, \"MC\"), cellBO.getCABO().getCustomData()[idx].offset, cellBO.getCABO().getStride(), model.context.FLOAT, cellBO.getCABO().getCustomData()[idx].components, false)) {\n vtkErrorMacro(\"Error setting \".concat(attrName, \"MC in shader VAO.\"));\n }\n }\n });\n\n if (cellBO.getProgram().isAttributeUsed('tcoordMC') && cellBO.getCABO().getTCoordOffset()) {\n if (!cellBO.getVAO().addAttributeArray(cellBO.getProgram(), cellBO.getCABO(), 'tcoordMC', cellBO.getCABO().getTCoordOffset(), cellBO.getCABO().getStride(), model.context.FLOAT, cellBO.getCABO().getTCoordComponents(), false)) {\n vtkErrorMacro('Error setting tcoordMC in shader VAO.');\n }\n } else {\n cellBO.getVAO().removeAttributeArray('tcoordMC');\n }\n\n if (model.internalColorTexture && cellBO.getProgram().isUniformUsed('texture1')) {\n cellBO.getProgram().setUniformi('texture1', model.internalColorTexture.getTextureUnit());\n }\n\n var tus = model.openGLActor2D.getActiveTextures();\n\n if (tus) {\n for (var index = 0; index < tus.length; ++index) {\n var tex = tus[index];\n var texUnit = tex.getTextureUnit();\n var tname = \"texture\".concat(texUnit + 1);\n\n if (cellBO.getProgram().isUniformUsed(tname)) {\n cellBO.getProgram().setUniformi(tname, texUnit);\n }\n }\n } // handle wide lines\n\n\n cellBO.setMapperShaderParameters(ren, actor, model._openGLRenderer.getTiledSizeAndOrigin());\n\n var selector = model._openGLRenderer.getSelector();\n\n cellBO.getProgram().setUniform3fArray('mapperIndex', selector ? selector.getPropColorValue() : [0.0, 0.0, 0.0]);\n cellBO.getProgram().setUniformi('picking', selector ? selector.getCurrentPass() + 1 : 0);\n }\n };\n\n publicAPI.setPropertyShaderParameters = function (cellBO, ren, actor) {\n var c = model.renderable.getColorMapColors();\n\n if (!c || c.getNumberOfComponents() === 0) {\n var program = cellBO.getProgram();\n var ppty = actor.getProperty();\n var opacity = ppty.getOpacity();\n var dColor = ppty.getColor();\n var diffuseColor = [dColor[0], dColor[1], dColor[2], opacity];\n program.setUniform4f('diffuseColor', diffuseColor);\n }\n };\n\n publicAPI.setLightingShaderParameters = function (cellBO, ren, actor) {// no-op\n };\n\n function safeMatrixMultiply(matrixArray, matrixType, tmpMat) {\n matrixType.identity(tmpMat);\n return matrixArray.reduce(function (res, matrix, index) {\n if (index === 0) {\n return matrix ? matrixType.copy(res, matrix) : matrixType.identity(res);\n }\n\n return matrix ? matrixType.multiply(res, res, matrix) : res;\n }, tmpMat);\n }\n\n publicAPI.setCameraShaderParameters = function (cellBO, ren, actor) {\n var program = cellBO.getProgram();\n var shiftScaleEnabled = cellBO.getCABO().getCoordShiftAndScaleEnabled();\n var inverseShiftScaleMatrix = shiftScaleEnabled ? cellBO.getCABO().getInverseShiftAndScaleMatrix() : null; // Get the position of the actor\n\n var view = ren.getRenderWindow().getViews()[0];\n var size = view.getViewportSize(ren);\n var vport = ren.getViewport();\n var actorPos = actor.getActualPositionCoordinate().getComputedDoubleViewportValue(ren); // Get the window info\n // Assume tile viewport is 0 1 based on vtkOpenGLRenderer\n\n var tileViewport = [0.0, 0.0, 1.0, 1.0];\n var visVP = [0.0, 0.0, 1.0, 1.0];\n visVP[0] = vport[0] >= tileViewport[0] ? vport[0] : tileViewport[0];\n visVP[1] = vport[1] >= tileViewport[1] ? vport[1] : tileViewport[1];\n visVP[2] = vport[2] <= tileViewport[2] ? vport[2] : tileViewport[2];\n visVP[3] = vport[3] <= tileViewport[3] ? vport[3] : tileViewport[3];\n\n if (visVP[0] >= visVP[2]) {\n return;\n }\n\n if (visVP[1] >= visVP[3]) {\n return;\n }\n\n size[0] = round(size[0] * (visVP[2] - visVP[0]) / (vport[2] - vport[0]));\n size[1] = round(size[1] * (visVP[3] - visVP[1]) / (vport[3] - vport[1]));\n\n var winSize = model._openGLRenderer.getParent().getSize();\n\n var xoff = round(actorPos[0] - (visVP[0] - vport[0]) * winSize[0]);\n var yoff = round(actorPos[1] - (visVP[1] - vport[1]) * winSize[1]); // set ortho projection\n\n var left = -xoff;\n var right = -xoff + size[0];\n var bottom = -yoff;\n var top = -yoff + size[1]; // it's an error to call glOrtho with\n // either left==right or top==bottom\n\n if (left === right) {\n right = left + 1.0;\n }\n\n if (bottom === top) {\n top = bottom + 1.0;\n } // compute the combined ModelView matrix and send it down to save time in the shader\n\n\n var tmpMat4 = mat4.identity(new Float64Array(16));\n tmpMat4[0] = 2.0 / (right - left);\n tmpMat4[1 * 4 + 1] = 2.0 / (top - bottom);\n tmpMat4[0 * 4 + 3] = -1.0 * (right + left) / (right - left);\n tmpMat4[1 * 4 + 3] = -1.0 * (top + bottom) / (top - bottom);\n tmpMat4[2 * 4 + 2] = 0.0;\n tmpMat4[2 * 4 + 3] = actor.getProperty().getDisplayLocation() === DisplayLocation.FOREGROUND ? -1.0 : 1.0;\n tmpMat4[3 * 4 + 3] = 1.0;\n mat4.transpose(tmpMat4, tmpMat4);\n program.setUniformMatrix('WCVCMatrix', safeMatrixMultiply([tmpMat4, inverseShiftScaleMatrix], mat4, model.tmpMat4));\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n context: null,\n VBOBuildTime: 0,\n VBOBuildString: null,\n primitives: null,\n primTypes: null,\n shaderRebuildString: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkViewNode.extend(publicAPI, model, initialValues);\n vtkReplacementShaderMapper.implementReplaceShaderCoincidentOffset(publicAPI, model, initialValues);\n vtkReplacementShaderMapper.implementBuildShadersWithReplacements(publicAPI, model, initialValues);\n model.primitives = [];\n model.primTypes = primTypes;\n model.tmpMat4 = mat4.identity(new Float64Array(16));\n\n for (var i = primTypes.Start; i < primTypes.End; i++) {\n model.primitives[i] = vtkHelper.newInstance();\n model.primitives[i].setPrimitiveType(i);\n model.primitives[i].set({\n lastLightComplexity: 0,\n lastLightCount: 0,\n lastSelectionPass: false\n }, true);\n } // Build VTK API\n\n\n setGet(publicAPI, model, ['context']);\n model.VBOBuildTime = {};\n obj(model.VBOBuildTime, {\n mtime: 0\n }); // Object methods\n\n vtkOpenGLPolyDataMapper2D(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend, 'vtkOpenGLPolyDataMapper2D'); // ----------------------------------------------------------------------------\n\nvar vtkPolyDataMapper2D = {\n newInstance: newInstance,\n extend: extend\n}; // Register ourself to OpenGL backend if imported\n\nregisterOverride('vtkMapper2D', newInstance);\n\nexport { vtkPolyDataMapper2D as default, extend, newInstance };\n","import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';\nimport _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport * as d3 from 'd3-scale';\nimport { M as nearestPowerOfTwo } from '../../Common/Core/Math/index.js';\nimport macro from '../../macros.js';\nimport vtkActor from './Actor.js';\nimport vtkDataArray from '../../Common/Core/DataArray.js';\nimport vtkScalarsToColors from '../../Common/Core/ScalarsToColors.js';\nimport vtkMapper from './Mapper.js';\nimport vtkPolyData from '../../Common/DataModel/PolyData.js';\nimport vtkTexture from './Texture.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nvar VectorMode = vtkScalarsToColors.VectorMode; // ----------------------------------------------------------------------------\n// vtkScalarBarActor\n//\n// Note log scales are currently not supported\n//\n// Developer note: This class is broken into the main class and a helper\n// class. The main class holds view independent properties (those properties\n// that do not change as the view's resolution/aspect ratio change). The\n// helper class is instantiated one per view and holds properties that can\n// depend on view specific values such as resolution. The helper class code\n// could have been left to the View specific implementation (such as\n// vtkWebGPUScalarBarActor) but is instead placed here to it can be shared by\n// multiple rendering backends.\n//\n// ----------------------------------------------------------------------------\n\nfunction applyTextStyle(ctx, style) {\n ctx.strokeStyle = style.strokeColor;\n ctx.lineWidth = style.strokeSize;\n ctx.fillStyle = style.fontColor;\n ctx.font = \"\".concat(style.fontStyle, \" \").concat(style.fontSize, \"px \").concat(style.fontFamily);\n} // ----------------------------------------------------------------------------\n// Default autoLayout function\n// ----------------------------------------------------------------------------\n// compute good values to use based on window size etc a bunch of heuristics\n// here with hand tuned constants These values worked for me but really this\n// method could be redically changed. The basic gist is\n// 1) compute a resonable font size\n// 2) render the text atlas using those font sizes\n// 3) pick horizontal or vertical bsed on window size\n// 4) based on the size of the title and tick labels rendered\n// compute the box size and position such that\n// the text will all fit nicely and the bar will be a resonable size\n// 5) compute the bar segments based on the above settings\n//\n// Note that this function can and should read values from the\n// ScalarBarActor but should only write values to the view dependent helper\n// instance that is provided as those values are the ones that will be used\n// for rendering.\n//\n\n\nfunction defaultAutoLayout(publicAPI, model) {\n return function (helper) {\n // we don't do a linear scale, the proportions for\n // a 700 pixel window differ from a 1400\n var lastSize = helper.getLastSize();\n var xAxisAdjust = Math.pow(lastSize[0] / 700, 0.8);\n var yAxisAdjust = Math.pow(lastSize[1] / 700, 0.8);\n var minAdjust = Math.min(xAxisAdjust, yAxisAdjust);\n var axisTextStyle = helper.getAxisTextStyle();\n var tickTextStyle = helper.getTickTextStyle();\n Object.assign(axisTextStyle, model.axisTextStyle);\n Object.assign(tickTextStyle, model.tickTextStyle); // compute a reasonable font size first\n\n axisTextStyle.fontSize = Math.max(24 * minAdjust, 12);\n\n if (helper.getLastAspectRatio() > 1.0) {\n tickTextStyle.fontSize = Math.max(20 * minAdjust, 10);\n } else {\n tickTextStyle.fontSize = Math.max(16 * minAdjust, 10);\n } // rebuild the text atlas\n\n\n var textSizes = helper.updateTextureAtlas(); // now compute the boxSize and pixel offsets, different algorithm\n // for horizonal versus vertical\n\n helper.setTopTitle(false);\n var boxSize = helper.getBoxSizeByReference(); // if vertical\n\n if (helper.getLastAspectRatio() > 1.0) {\n helper.setTickLabelPixelOffset(0.3 * tickTextStyle.fontSize); // if the title will fit within the width of the bar then that looks\n // nicer to put it at the top (helper.topTitle), otherwise rotate it\n // and place it sideways\n\n if (textSizes.titleWidth <= textSizes.tickWidth + helper.getTickLabelPixelOffset() + 0.8 * tickTextStyle.fontSize) {\n helper.setTopTitle(true);\n helper.setAxisTitlePixelOffset(0.2 * tickTextStyle.fontSize);\n boxSize[0] = 2.0 * (textSizes.tickWidth + helper.getTickLabelPixelOffset() + 0.8 * tickTextStyle.fontSize) / lastSize[0];\n helper.setBoxPosition([0.98 - boxSize[0], -0.92]);\n } else {\n helper.setAxisTitlePixelOffset(0.2 * tickTextStyle.fontSize);\n boxSize[0] = 2.0 * (textSizes.titleHeight + helper.getAxisTitlePixelOffset() + textSizes.tickWidth + helper.getTickLabelPixelOffset() + 0.8 * tickTextStyle.fontSize) / lastSize[0];\n helper.setBoxPosition([0.99 - boxSize[0], -0.92]);\n }\n\n boxSize[1] = Math.max(1.2, Math.min(1.84 / yAxisAdjust, 1.84));\n } else {\n // horizontal\n helper.setAxisTitlePixelOffset(1.2 * tickTextStyle.fontSize);\n helper.setTickLabelPixelOffset(0.1 * tickTextStyle.fontSize);\n var titleHeight = // total offset from top of bar (includes ticks)\n 2.0 * (0.8 * tickTextStyle.fontSize + textSizes.titleHeight + helper.getAxisTitlePixelOffset()) / lastSize[1];\n var tickWidth = 2.0 * textSizes.tickWidth / lastSize[0];\n boxSize[0] = Math.min(1.9, Math.max(1.4, 1.4 * tickWidth * (helper.getTicks().length + 3)));\n boxSize[1] = titleHeight;\n helper.setBoxPosition([-0.5 * boxSize[0], -0.97]);\n } // recomute bar segments based on positioning\n\n\n helper.recomputeBarSegments(textSizes);\n };\n} // ----------------------------------------------------------------------------\n// Default generateTicks function\n// ----------------------------------------------------------------------------\n// This function returns the default function used to generate vtkScalarBarActor ticks.\n// The default function makes use of d3.scaleLinear() to generate 5 tick marks between\n// the minimum and maximum values of the scalar bar. Customize this behavior by passing\n// a function to vtkScalarBarActor.newInstance({ generateTicks: customGenerateTicks })\n// or by calling scalarBarActor.setGenerateTicks(customGenerateTicks).\n\n\nfunction defaultGenerateTicks(publicApi, model) {\n return function (helper) {\n var lastTickBounds = helper.getLastTickBounds();\n var scale = d3.scaleLinear().domain([lastTickBounds[0], lastTickBounds[1]]);\n var ticks = scale.ticks(5);\n var format = scale.tickFormat(5);\n helper.setTicks(ticks);\n helper.setTickStrings(ticks.map(format));\n };\n} // many properties of this actor depend on the API specific view The main\n// dependency being the resolution as that drives what font sizes to use.\n// Bacause of this we need to do some of the calculations in a API specific\n// subclass. But... we don't want a lot of duplicated code between WebGL and\n// WebGPU for example so we have this helper class, that is designed to be\n// fairly API independent so that API specific views can call this to do\n// most of the work.\n\n\nfunction vtkScalarBarActorHelper(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkScalarBarActorHelper');\n\n publicAPI.setRenderable = function (renderable) {\n if (model.renderable === renderable) {\n return;\n }\n\n model.renderable = renderable;\n model.barActor.setProperty(renderable.getProperty());\n model.barActor.setParentProp(renderable);\n model.barActor.setCoordinateSystemToDisplay();\n model.tmActor.setProperty(renderable.getProperty());\n model.tmActor.setParentProp(renderable);\n model.tmActor.setCoordinateSystemToDisplay();\n model.generateTicks = renderable.generateTicks;\n model.axisTextStyle = _objectSpread({}, renderable.getAxisTextStyle());\n model.tickTextStyle = _objectSpread({}, renderable.getTickTextStyle());\n publicAPI.modified();\n };\n\n publicAPI.updateAPISpecificData = function (size, camera, renderWindow) {\n // has the size changed?\n if (model.lastSize[0] !== size[0] || model.lastSize[1] !== size[1]) {\n model.lastSize[0] = size[0];\n model.lastSize[1] = size[1];\n model.lastAspectRatio = size[0] / size[1];\n model.forceUpdate = true;\n }\n\n var scalarsToColors = model.renderable.getScalarsToColors();\n\n if (!scalarsToColors || !model.renderable.getVisibility()) {\n return;\n } // make sure the lut is assigned to our mapper\n\n\n model.barMapper.setLookupTable(scalarsToColors); // camera should be the same for all views\n\n model.camera = camera;\n model.renderWindow = renderWindow; // did something significant change? If so rebuild a lot of things\n\n if (model.forceUpdate || Math.max(scalarsToColors.getMTime(), publicAPI.getMTime(), model.renderable.getMTime()) > model.lastRebuildTime.getMTime()) {\n var range = scalarsToColors.getMappingRange();\n model.lastTickBounds = _toConsumableArray(range); // compute tick marks for axes (update for log scale)\n\n model.renderable.getGenerateTicks()(publicAPI);\n\n if (model.renderable.getAutomated()) {\n model.renderable.getAutoLayout()(publicAPI);\n } else {\n // copy values from renderable\n model.axisTextStyle = _objectSpread({}, model.renderable.getAxisTextStyle());\n model.tickTextStyle = _objectSpread({}, model.renderable.getTickTextStyle());\n model.barPosition = _toConsumableArray(model.renderable.getBarPosition());\n model.barSize = _toConsumableArray(model.renderable.getBarSize());\n model.boxPosition = _toConsumableArray(model.renderable.getBoxPosition());\n model.boxSize = _toConsumableArray(model.renderable.getBoxSize());\n model.axisTitlePixelOffset = model.renderable.getAxisTitlePixelOffset();\n model.tickLabelPixelOffset = model.renderable.getTickLabelPixelOffset(); // rebuild the texture only when force or changed bounds, face\n // visibility changes do to change the atlas\n\n var textSizes = publicAPI.updateTextureAtlas(); // recompute bar segments based on positioning\n\n publicAPI.recomputeBarSegments(textSizes);\n }\n\n publicAPI.updatePolyDataForLabels();\n publicAPI.updatePolyDataForBarSegments();\n model.lastRebuildTime.modified();\n model.forceUpdate = false;\n }\n }; // create the texture map atlas that contains the rendering of\n // all the text strings. Only needs to be called when the text strings\n // have changed (labels and ticks)\n\n\n publicAPI.updateTextureAtlas = function () {\n // set the text properties\n model.tmContext.textBaseline = 'bottom';\n model.tmContext.textAlign = 'left'; // return some factors about the text atlas\n\n var results = {}; // first the axislabel\n\n var newTmAtlas = new Map();\n var maxWidth = 0;\n var totalHeight = 1; // start one pixel in so we have a border\n\n applyTextStyle(model.tmContext, model.axisTextStyle);\n var metrics = model.tmContext.measureText(model.renderable.getAxisLabel());\n var entry = {\n height: metrics.actualBoundingBoxAscent + 2,\n startingHeight: totalHeight,\n width: metrics.width + 2,\n textStyle: model.axisTextStyle\n };\n newTmAtlas.set(model.renderable.getAxisLabel(), entry);\n totalHeight += entry.height;\n maxWidth = entry.width;\n results.titleWidth = entry.width;\n results.titleHeight = entry.height; // and the ticks, NaN Below and Above\n\n results.tickWidth = 0;\n results.tickHeight = 0;\n applyTextStyle(model.tmContext, model.tickTextStyle);\n var strings = [].concat(_toConsumableArray(publicAPI.getTickStrings()), ['NaN', 'Below', 'Above']);\n\n for (var t = 0; t < strings.length; t++) {\n if (!newTmAtlas.has(strings[t])) {\n metrics = model.tmContext.measureText(strings[t]);\n entry = {\n height: metrics.actualBoundingBoxAscent + 2,\n startingHeight: totalHeight,\n width: metrics.width + 2,\n textStyle: model.tickTextStyle\n };\n newTmAtlas.set(strings[t], entry);\n totalHeight += entry.height;\n\n if (maxWidth < entry.width) {\n maxWidth = entry.width;\n }\n\n if (results.tickWidth < entry.width) {\n results.tickWidth = entry.width;\n }\n\n if (results.tickHeight < entry.height) {\n results.tickHeight = entry.height;\n }\n }\n } // always use power of two to avoid interpolation\n // in cases where PO2 is required\n\n\n maxWidth = nearestPowerOfTwo(maxWidth);\n totalHeight = nearestPowerOfTwo(totalHeight); // set the tcoord values\n\n newTmAtlas.forEach(function (value) {\n value.tcoords = [0.0, (totalHeight - value.startingHeight - value.height) / totalHeight, value.width / maxWidth, (totalHeight - value.startingHeight - value.height) / totalHeight, value.width / maxWidth, (totalHeight - value.startingHeight) / totalHeight, 0.0, (totalHeight - value.startingHeight) / totalHeight];\n }); // make sure we have power of two dimensions\n\n model.tmCanvas.width = maxWidth;\n model.tmCanvas.height = totalHeight;\n model.tmContext.textBaseline = 'bottom';\n model.tmContext.textAlign = 'left';\n model.tmContext.clearRect(0, 0, maxWidth, totalHeight); // draw the text onto the texture\n\n newTmAtlas.forEach(function (value, key) {\n applyTextStyle(model.tmContext, value.textStyle);\n model.tmContext.fillText(key, 1, value.startingHeight + value.height - 1);\n });\n model.tmTexture.setCanvas(model.tmCanvas); // mark as modified since the canvas typically doesn't change\n\n model.tmTexture.modified();\n model._tmAtlas = newTmAtlas;\n return results;\n };\n\n publicAPI.computeBarSize = function (textSizes) {\n // compute orientation\n model.vertical = model.boxSize[1] > model.boxSize[0];\n var tickHeight = 2.0 * textSizes.tickHeight / model.lastSize[1];\n var segSize = [1, 1]; // horizontal and vertical have different astetics so adjust based on\n // orientation\n\n if (model.vertical) {\n var tickWidth = 2.0 * (textSizes.tickWidth + model.tickLabelPixelOffset) / model.lastSize[0];\n\n if (model.topTitle) {\n var titleHeight = 2.0 * (textSizes.titleHeight + model.axisTitlePixelOffset) / model.lastSize[1];\n model.barSize[0] = model.boxSize[0] - tickWidth;\n model.barSize[1] = model.boxSize[1] - titleHeight;\n } else {\n // rotated title so width is based off height\n var titleWidth = 2.0 * (textSizes.titleHeight + model.axisTitlePixelOffset) / model.lastSize[0];\n model.barSize[0] = model.boxSize[0] - titleWidth - tickWidth;\n model.barSize[1] = model.boxSize[1];\n }\n\n model.barPosition[0] = model.boxPosition[0] + tickWidth;\n model.barPosition[1] = model.boxPosition[1];\n segSize[1] = tickHeight;\n } else {\n var _tickWidth = (2.0 * textSizes.tickWidth - 8) / model.lastSize[0];\n\n var _titleHeight = 2.0 * (textSizes.titleHeight + model.axisTitlePixelOffset) / model.lastSize[1];\n\n model.barSize[0] = model.boxSize[0];\n model.barPosition[0] = model.boxPosition[0];\n model.barSize[1] = model.boxSize[1] - _titleHeight;\n model.barPosition[1] = model.boxPosition[1];\n segSize[0] = _tickWidth;\n }\n\n return segSize;\n }; // based on all the settins compute a barSegments array\n // containing the segments of the scalar bar\n // each segment contains\n // corners[4][2]\n // title - e.g. NaN, Above, ticks\n // scalars - the normalized scalars values to use for that segment\n //\n // Note that the bar consumes the space in the box that remains after\n // leaving room for the text labels\n\n\n publicAPI.recomputeBarSegments = function (textSizes) {\n var _model$renderable$get, _model$renderable$get2, _model$renderable$get3, _model$renderable$get4;\n\n // first compute the barSize/Position\n var segSize = publicAPI.computeBarSize(textSizes);\n model.barSegments = [];\n var startPos = [0.0, 0.0]; // horizontal and vertical have different astetics so adjust based on\n // orientation\n\n var barAxis = model.vertical ? 1 : 0;\n var segSpace = model.vertical ? 0.01 : 0.02;\n\n function pushSeg(title, scalars) {\n model.barSegments.push({\n corners: [[].concat(startPos), [startPos[0] + segSize[0], startPos[1]], [startPos[0] + segSize[0], startPos[1] + segSize[1]], [startPos[0], startPos[1] + segSize[1]]],\n scalars: scalars,\n title: title\n });\n startPos[barAxis] += segSize[barAxis] + segSpace;\n }\n\n if (model.renderable.getDrawNanAnnotation() && model.renderable.getScalarsToColors().getNanColor()) {\n pushSeg('NaN', [NaN, NaN, NaN, NaN]);\n }\n\n if (model.renderable.getDrawBelowRangeSwatch() && (_model$renderable$get = (_model$renderable$get2 = model.renderable.getScalarsToColors()).getUseBelowRangeColor) !== null && _model$renderable$get !== void 0 && _model$renderable$get.call(_model$renderable$get2)) {\n pushSeg('Below', [-0.1, -0.1, -0.1, -0.1]);\n }\n\n var haveAbove = (_model$renderable$get3 = (_model$renderable$get4 = model.renderable.getScalarsToColors()).getUseAboveRangeColor) === null || _model$renderable$get3 === void 0 ? void 0 : _model$renderable$get3.call(_model$renderable$get4); // extra space around the ticks section\n\n startPos[barAxis] += segSpace;\n var oldSegSize = segSize[barAxis];\n segSize[barAxis] = haveAbove ? 1.0 - 2.0 * segSpace - segSize[barAxis] - startPos[barAxis] : 1.0 - segSpace - startPos[barAxis];\n pushSeg('ticks', model.vertical ? [0, 0, 0.995, 0.995] : [0, 0.995, 0.995, 0]);\n\n if (model.renderable.getDrawAboveRangeSwatch() && haveAbove) {\n segSize[barAxis] = oldSegSize;\n startPos[barAxis] += segSpace;\n pushSeg('Above', [1.1, 1.1, 1.1, 1.1]);\n }\n }; // called by updatePolyDataForLabels\n // modifies class constants tmp2v3\n\n\n var tmp2v3 = new Float64Array(3); // anchor point = pos\n // H alignment = left, middle, right\n // V alignment = bottom, middle, top\n // Text Orientation = horizontal, vertical\n // orientation\n\n publicAPI.createPolyDataForOneLabel = function (text, pos, alignment, orientation, offset, results) {\n var value = model._tmAtlas.get(text);\n\n if (!value) {\n return;\n } // have to find the four corners of the texture polygon for this label\n\n\n var ptIdx = results.ptIdx;\n var cellIdx = results.cellIdx; // get achor point in pixels\n\n tmp2v3[0] = (0.5 * pos[0] + 0.5) * model.lastSize[0];\n tmp2v3[1] = (0.5 * pos[1] + 0.5) * model.lastSize[1];\n tmp2v3[2] = pos[2];\n tmp2v3[0] += offset[0];\n tmp2v3[1] += offset[1]; // get text size in display pixels\n\n var textSize = [];\n var textAxes = orientation === 'vertical' ? [1, 0] : [0, 1];\n\n if (orientation === 'vertical') {\n textSize[0] = value.width;\n textSize[1] = -value.height; // update anchor point based on alignment\n\n if (alignment[0] === 'middle') {\n tmp2v3[1] -= value.width / 2.0;\n } else if (alignment[0] === 'right') {\n tmp2v3[1] -= value.width;\n }\n\n if (alignment[1] === 'middle') {\n tmp2v3[0] += value.height / 2.0;\n } else if (alignment[1] === 'top') {\n tmp2v3[0] += value.height;\n }\n } else {\n textSize[0] = value.width;\n textSize[1] = value.height; // update anchor point based on alignment\n\n if (alignment[0] === 'middle') {\n tmp2v3[0] -= value.width / 2.0;\n } else if (alignment[0] === 'right') {\n tmp2v3[0] -= value.width;\n }\n\n if (alignment[1] === 'middle') {\n tmp2v3[1] -= value.height / 2.0;\n } else if (alignment[1] === 'top') {\n tmp2v3[1] -= value.height;\n }\n }\n\n results.points[ptIdx * 3] = tmp2v3[0];\n results.points[ptIdx * 3 + 1] = tmp2v3[1];\n results.points[ptIdx * 3 + 2] = tmp2v3[2];\n results.tcoords[ptIdx * 2] = value.tcoords[0];\n results.tcoords[ptIdx * 2 + 1] = value.tcoords[1];\n ptIdx++;\n tmp2v3[textAxes[0]] += textSize[0];\n results.points[ptIdx * 3] = tmp2v3[0];\n results.points[ptIdx * 3 + 1] = tmp2v3[1];\n results.points[ptIdx * 3 + 2] = tmp2v3[2];\n results.tcoords[ptIdx * 2] = value.tcoords[2];\n results.tcoords[ptIdx * 2 + 1] = value.tcoords[3];\n ptIdx++;\n tmp2v3[textAxes[1]] += textSize[1];\n results.points[ptIdx * 3] = tmp2v3[0];\n results.points[ptIdx * 3 + 1] = tmp2v3[1];\n results.points[ptIdx * 3 + 2] = tmp2v3[2];\n results.tcoords[ptIdx * 2] = value.tcoords[4];\n results.tcoords[ptIdx * 2 + 1] = value.tcoords[5];\n ptIdx++;\n tmp2v3[textAxes[0]] -= textSize[0];\n results.points[ptIdx * 3] = tmp2v3[0];\n results.points[ptIdx * 3 + 1] = tmp2v3[1];\n results.points[ptIdx * 3 + 2] = tmp2v3[2];\n results.tcoords[ptIdx * 2] = value.tcoords[6];\n results.tcoords[ptIdx * 2 + 1] = value.tcoords[7];\n ptIdx++; // add the two triangles to represent the quad\n\n results.polys[cellIdx * 4] = 3;\n results.polys[cellIdx * 4 + 1] = ptIdx - 4;\n results.polys[cellIdx * 4 + 2] = ptIdx - 3;\n results.polys[cellIdx * 4 + 3] = ptIdx - 2;\n cellIdx++;\n results.polys[cellIdx * 4] = 3;\n results.polys[cellIdx * 4 + 1] = ptIdx - 4;\n results.polys[cellIdx * 4 + 2] = ptIdx - 2;\n results.polys[cellIdx * 4 + 3] = ptIdx - 1;\n results.ptIdx += 4;\n results.cellIdx += 2;\n }; // update the polydata associated with drawing the text labels\n // specifically the quads used for each label and their associated tcoords\n // etc. This changes every time the camera viewpoint changes\n\n\n var tmpv3 = new Float64Array(3);\n\n publicAPI.updatePolyDataForLabels = function () {\n // update the polydata\n var numLabels = publicAPI.getTickStrings().length + model.barSegments.length;\n var numPts = numLabels * 4;\n var numTris = numLabels * 2;\n var points = new Float64Array(numPts * 3);\n var polys = new Uint16Array(numTris * 4);\n var tcoords = new Float32Array(numPts * 2);\n var results = {\n ptIdx: 0,\n cellIdx: 0,\n polys: polys,\n points: points,\n tcoords: tcoords\n }; // compute the direction vector\n\n var offsetAxis = model.vertical ? 0 : 1;\n var spacedAxis = model.vertical ? 1 : 0;\n tmpv3[2] = -0.99; // near plane\n // draw the title\n\n var alignment = model.vertical ? ['right', 'middle'] : ['middle', 'bottom'];\n var dir = [0, 1];\n var tickOffsets = [0, 0];\n\n if (model.vertical) {\n tickOffsets[0] = -model.tickLabelPixelOffset;\n\n if (model.topTitle) {\n tmpv3[0] = model.boxPosition[0] + 0.5 * model.boxSize[0];\n tmpv3[1] = model.barPosition[1] + model.barSize[1]; // write the axis label\n\n publicAPI.createPolyDataForOneLabel(model.renderable.getAxisLabel(), tmpv3, ['middle', 'bottom'], 'horizontal', [0, model.axisTitlePixelOffset], results);\n } else {\n tmpv3[0] = model.barPosition[0] + model.barSize[0];\n tmpv3[1] = model.barPosition[1] + 0.5 * model.barSize[1]; // write the axis label\n\n publicAPI.createPolyDataForOneLabel(model.renderable.getAxisLabel(), tmpv3, ['middle', 'top'], 'vertical', [model.axisTitlePixelOffset, 0], results);\n }\n\n dir = [-1, 0];\n } else {\n tickOffsets[1] = model.tickLabelPixelOffset;\n tmpv3[0] = model.barPosition[0] + 0.5 * model.barSize[0];\n tmpv3[1] = model.barPosition[1] + model.barSize[1];\n publicAPI.createPolyDataForOneLabel(model.renderable.getAxisLabel(), tmpv3, ['middle', 'bottom'], 'horizontal', [0, model.axisTitlePixelOffset], results);\n }\n\n tmpv3[offsetAxis] = model.barPosition[offsetAxis] + (0.5 * dir[offsetAxis] + 0.5) * model.barSize[offsetAxis];\n tmpv3[spacedAxis] = model.barPosition[spacedAxis] + model.barSize[spacedAxis] * 0.5; // draw bar segment labels\n\n var tickSeg = null;\n\n for (var i = 0; i < model.barSegments.length; i++) {\n var seg = model.barSegments[i];\n\n if (seg.title === 'ticks') {\n // handle ticks below\n tickSeg = seg;\n } else {\n tmpv3[spacedAxis] = model.barPosition[spacedAxis] + 0.5 * model.barSize[spacedAxis] * (seg.corners[2][spacedAxis] + seg.corners[0][spacedAxis]);\n publicAPI.createPolyDataForOneLabel(seg.title, tmpv3, alignment, 'horizontal', tickOffsets, results);\n }\n } // write the tick labels\n\n\n var tickSegmentStart = model.barPosition[spacedAxis] + model.barSize[spacedAxis] * tickSeg.corners[0][spacedAxis];\n var tickSegmentSize = model.barSize[spacedAxis] * (tickSeg.corners[2][spacedAxis] - tickSeg.corners[0][spacedAxis]);\n var ticks = publicAPI.getTicks();\n var tickStrings = publicAPI.getTickStrings();\n\n for (var t = 0; t < ticks.length; t++) {\n var tickPos = (ticks[t] - model.lastTickBounds[0]) / (model.lastTickBounds[1] - model.lastTickBounds[0]);\n tmpv3[spacedAxis] = tickSegmentStart + tickSegmentSize * tickPos;\n publicAPI.createPolyDataForOneLabel(tickStrings[t], tmpv3, alignment, 'horizontal', tickOffsets, results);\n }\n\n var tcoordDA = vtkDataArray.newInstance({\n numberOfComponents: 2,\n values: tcoords,\n name: 'TextureCoordinates'\n });\n model.tmPolyData.getPointData().setTCoords(tcoordDA);\n model.tmPolyData.getPoints().setData(points, 3);\n model.tmPolyData.getPoints().modified();\n model.tmPolyData.getPolys().setData(polys, 1);\n model.tmPolyData.getPolys().modified();\n model.tmPolyData.modified();\n };\n\n publicAPI.updatePolyDataForBarSegments = function () {\n var _scalarsToColors$getU, _scalarsToColors$getU2;\n\n var scalarsToColors = model.renderable.getScalarsToColors();\n var numberOfExtraColors = 0;\n\n if (model.renderable.getDrawNanAnnotation() && scalarsToColors.getNanColor()) {\n numberOfExtraColors += 1;\n }\n\n if (model.renderable.getDrawBelowRangeSwatch() && (_scalarsToColors$getU = scalarsToColors.getUseBelowRangeColor) !== null && _scalarsToColors$getU !== void 0 && _scalarsToColors$getU.call(scalarsToColors)) {\n numberOfExtraColors += 1;\n }\n\n if (model.renderable.getDrawAboveRangeSwatch() && (_scalarsToColors$getU2 = scalarsToColors.getUseAboveRangeColor) !== null && _scalarsToColors$getU2 !== void 0 && _scalarsToColors$getU2.call(scalarsToColors)) {\n numberOfExtraColors += 1;\n }\n\n var numPts = 4 * (1 + numberOfExtraColors);\n var numQuads = numPts; // handle vector component mode\n\n var numComps = 1;\n\n if (scalarsToColors.getVectorMode() === VectorMode.COMPONENT) {\n numComps = scalarsToColors.getVectorComponent() + 1;\n } // create the colored bars\n\n\n var points = new Float64Array(numPts * 3);\n var cells = new Uint16Array(numQuads * 5);\n var scalars = new Float32Array(numPts * numComps);\n var ptIdx = 0;\n var cellIdx = 0;\n\n for (var i = 0; i < model.barSegments.length; i++) {\n var seg = model.barSegments[i];\n\n for (var e = 0; e < 4; e++) {\n tmpv3[0] = model.barPosition[0] + seg.corners[e][0] * model.barSize[0];\n tmpv3[1] = model.barPosition[1] + seg.corners[e][1] * model.barSize[1];\n points[ptIdx * 3] = (0.5 * tmpv3[0] + 0.5) * model.lastSize[0];\n points[ptIdx * 3 + 1] = (0.5 * tmpv3[1] + 0.5) * model.lastSize[1];\n points[ptIdx * 3 + 2] = tmpv3[2];\n\n for (var nc = 0; nc < numComps; nc++) {\n scalars[ptIdx * numComps + nc] = model.lastTickBounds[0] + seg.scalars[e] * (model.lastTickBounds[1] - model.lastTickBounds[0]);\n }\n\n ptIdx++;\n }\n\n cells[cellIdx * 5] = 4;\n cells[cellIdx * 5 + 1] = ptIdx - 4;\n cells[cellIdx * 5 + 2] = ptIdx - 3;\n cells[cellIdx * 5 + 3] = ptIdx - 2;\n cells[cellIdx * 5 + 4] = ptIdx - 1;\n cellIdx++;\n }\n\n var scalarsDA = vtkDataArray.newInstance({\n numberOfComponents: numComps,\n values: scalars,\n name: 'Scalars'\n });\n model.polyData.getPointData().setScalars(scalarsDA);\n model.polyData.getPoints().setData(points, 3);\n model.polyData.getPoints().modified();\n model.polyData.getPolys().setData(cells, 1);\n model.polyData.getPolys().modified();\n model.polyData.modified();\n };\n}\n\nvar newScalarBarActorHelper = macro.newInstance(function (publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {\n renderable: null\n };\n Object.assign(model, {}, initialValues); // Inheritance\n\n macro.obj(publicAPI, model);\n macro.setGet(publicAPI, model, ['axisTitlePixelOffset', 'tickLabelPixelOffset', 'renderable', 'topTitle', 'ticks', 'tickStrings']);\n macro.get(publicAPI, model, ['lastSize', 'lastAspectRatio', 'lastTickBounds', 'axisTextStyle', 'tickTextStyle', 'barActor', 'tmActor']);\n macro.getArray(publicAPI, model, ['boxPosition', 'boxSize']);\n macro.setArray(publicAPI, model, ['boxPosition', 'boxSize'], 2);\n model.forceUpdate = false;\n model.lastRebuildTime = {};\n macro.obj(model.lastRebuildTime, {\n mtime: 0\n });\n model.lastSize = [-1, -1];\n model.tmCanvas = document.createElement('canvas');\n model.tmContext = model.tmCanvas.getContext('2d');\n model._tmAtlas = new Map();\n model.barMapper = vtkMapper.newInstance();\n model.barMapper.setInterpolateScalarsBeforeMapping(true);\n model.barMapper.setUseLookupTableScalarRange(true);\n model.polyData = vtkPolyData.newInstance();\n model.barMapper.setInputData(model.polyData);\n model.barActor = vtkActor.newInstance();\n model.barActor.setMapper(model.barMapper); // for texture atlas\n\n model.tmPolyData = vtkPolyData.newInstance();\n model.tmMapper = vtkMapper.newInstance();\n model.tmMapper.setInputData(model.tmPolyData);\n model.tmTexture = vtkTexture.newInstance({\n resizable: true\n });\n model.tmTexture.setInterpolate(false);\n model.tmActor = vtkActor.newInstance({\n parentProp: publicAPI\n });\n model.tmActor.setMapper(model.tmMapper);\n model.tmActor.addTexture(model.tmTexture);\n model.barPosition = [0, 0];\n model.barSize = [0, 0];\n model.boxPosition = [0.88, -0.92];\n model.boxSize = [0.1, 1.1]; // internal variables\n\n model.lastTickBounds = [];\n vtkScalarBarActorHelper(publicAPI, model);\n}, 'vtkScalarBarActorHelper'); //\n// Now we define the public class that the application sets view independent\n// properties on. This class is fairly small as it mainly just holds\n// properties setter and getters leaving all calculations to the helper\n// class.\n//\n\nfunction vtkScalarBarActor(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkScalarBarActor');\n\n publicAPI.setTickTextStyle = function (tickStyle) {\n model.tickTextStyle = _objectSpread(_objectSpread({}, model.tickTextStyle), tickStyle);\n publicAPI.modified();\n };\n\n publicAPI.setAxisTextStyle = function (axisStyle) {\n model.axisTextStyle = _objectSpread(_objectSpread({}, model.axisTextStyle), axisStyle);\n publicAPI.modified();\n };\n\n publicAPI.resetAutoLayoutToDefault = function () {\n publicAPI.setAutoLayout(defaultAutoLayout(publicAPI, model));\n };\n\n publicAPI.resetGenerateTicksToDefault = function () {\n publicAPI.setGenerateTicks(defaultGenerateTicks());\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nfunction defaultValues(initialValues) {\n return _objectSpread({\n automated: true,\n autoLayout: null,\n axisLabel: 'Scalar Value',\n barPosition: [0, 0],\n barSize: [0, 0],\n boxPosition: [0.88, -0.92],\n boxSize: [0.1, 1.1],\n scalarToColors: null,\n axisTitlePixelOffset: 36.0,\n axisTextStyle: {\n fontColor: 'white',\n fontStyle: 'normal',\n fontSize: 18,\n fontFamily: 'serif'\n },\n tickLabelPixelOffset: 14.0,\n tickTextStyle: {\n fontColor: 'white',\n fontStyle: 'normal',\n fontSize: 14,\n fontFamily: 'serif'\n },\n generateTicks: null,\n drawNanAnnotation: true,\n drawBelowRangeSwatch: true,\n drawAboveRangeSwatch: true\n }, initialValues);\n} // ----------------------------------------------------------------------------\n\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, defaultValues(initialValues));\n if (!model.autoLayout) model.autoLayout = defaultAutoLayout(publicAPI, model);\n if (!model.generateTicks) model.generateTicks = defaultGenerateTicks(); // Inheritance\n\n vtkActor.extend(publicAPI, model, initialValues);\n publicAPI.getProperty().setDiffuse(0.0);\n publicAPI.getProperty().setAmbient(1.0);\n macro.setGet(publicAPI, model, ['automated', 'autoLayout', 'axisTitlePixelOffset', 'axisLabel', 'scalarsToColors', 'tickLabelPixelOffset', 'generateTicks', 'drawNanAnnotation', 'drawBelowRangeSwatch', 'drawAboveRangeSwatch']);\n macro.get(publicAPI, model, ['axisTextStyle', 'tickTextStyle']);\n macro.getArray(publicAPI, model, ['barPosition', 'barSize', 'boxPosition', 'boxSize']);\n macro.setArray(publicAPI, model, ['barPosition', 'barSize', 'boxPosition', 'boxSize'], 2); // Object methods\n\n vtkScalarBarActor(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkScalarBarActor'); // ----------------------------------------------------------------------------\n\nvar vtkScalarBarActor$1 = {\n newInstance: newInstance,\n extend: extend,\n newScalarBarActorHelper: newScalarBarActorHelper\n};\n\nexport { vtkScalarBarActor$1 as default, extend, newInstance };\n","import { newInstance as newInstance$1 } from '../../macros.js';\nimport vtkScalarBarActor from '../Core/ScalarBarActor.js';\nimport vtkViewNode from '../SceneGraph/ViewNode.js';\nimport { registerOverride } from './ViewNodeFactory.js';\n\n// vtkOpenGLScalarBarActor methods\n// ----------------------------------------------------------------------------\n\nfunction vtkOpenGLScalarBarActor(publicAPI, model) {\n model.classHierarchy.push('vtkOpenGLScalarBarActor'); // Builds myself.\n\n publicAPI.buildPass = function (prepass) {\n if (prepass) {\n model._openGLRenderer = publicAPI.getFirstAncestorOfType('vtkOpenGLRenderer');\n model._openGLRenderWindow = model._openGLRenderer.getParent();\n\n if (!model.scalarBarActorHelper.getRenderable()) {\n model.scalarBarActorHelper.setRenderable(model.renderable);\n }\n\n publicAPI.prepareNodes();\n publicAPI.addMissingNode(model.scalarBarActorHelper.getBarActor());\n publicAPI.addMissingNode(model.scalarBarActorHelper.getTmActor());\n publicAPI.removeUnusedNodes();\n }\n };\n\n publicAPI.opaquePass = function (prepass, renderPass) {\n if (prepass) {\n var camera = model._openGLRenderer ? model._openGLRenderer.getRenderable().getActiveCamera() : null;\n\n var tsize = model._openGLRenderer.getTiledSizeAndOrigin();\n\n model.scalarBarActorHelper.updateAPISpecificData([tsize.usize, tsize.vsize], camera, model._openGLRenderWindow.getRenderable());\n }\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkViewNode.extend(publicAPI, model, initialValues);\n model.scalarBarActorHelper = vtkScalarBarActor.newScalarBarActorHelper(); // Object methods\n\n vtkOpenGLScalarBarActor(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend, 'vtkOpenGLScalarBarActor'); // ----------------------------------------------------------------------------\n\nvar index = {\n newInstance: newInstance,\n extend: extend\n}; // Register ourself to OpenGL backend if imported\n\nregisterOverride('vtkScalarBarActor', newInstance);\n\nexport { index as default, extend, newInstance };\n","import { mat4 } from 'gl-matrix';\nimport macro from '../../macros.js';\nimport vtkProp from '../Core/Prop.js';\nimport vtkViewNode from '../SceneGraph/ViewNode.js';\nimport { registerOverride } from './ViewNodeFactory.js';\n\nvar CoordinateSystem = vtkProp.CoordinateSystem; // ----------------------------------------------------------------------------\n// vtkWebGPUActor methods\n// ----------------------------------------------------------------------------\n\nfunction vtkWebGPUActor(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkWebGPUActor'); // Builds myself.\n\n publicAPI.buildPass = function (prepass) {\n if (prepass) {\n model.WebGPURenderer = publicAPI.getFirstAncestorOfType('vtkWebGPURenderer');\n model.WebGPURenderWindow = model.WebGPURenderer.getFirstAncestorOfType('vtkWebGPURenderWindow');\n\n if (model.propID === undefined) {\n model.propID = model.WebGPURenderWindow.getUniquePropID();\n }\n\n publicAPI.prepareNodes();\n publicAPI.addMissingNode(model.renderable.getMapper());\n publicAPI.removeUnusedNodes();\n }\n }; // we draw textures, then mapper, then post pass textures\n\n\n publicAPI.traverseOpaquePass = function (renderPass) {\n if (!model.renderable || !model.renderable.getNestedVisibility() || !model.renderable.getIsOpaque() || model.WebGPURenderer.getSelector() && !model.renderable.getNestedPickable()) {\n return;\n }\n\n publicAPI.apply(renderPass, true);\n\n if (model.children[0]) {\n model.children[0].traverse(renderPass);\n }\n\n publicAPI.apply(renderPass, false);\n }; // we draw textures, then mapper, then post pass textures\n\n\n publicAPI.traverseTranslucentPass = function (renderPass) {\n if (!model.renderable || !model.renderable.getNestedVisibility() || model.renderable.getIsOpaque() || model.WebGPURenderer.getSelector() && !model.renderable.getNestedPickable()) {\n return;\n }\n\n publicAPI.apply(renderPass, true);\n\n if (model.children[0]) {\n model.children[0].traverse(renderPass);\n }\n\n publicAPI.apply(renderPass, false);\n };\n\n publicAPI.queryPass = function (prepass, renderPass) {\n if (prepass) {\n if (!model.renderable || !model.renderable.getVisibility()) {\n return;\n }\n\n if (model.renderable.getIsOpaque()) {\n renderPass.incrementOpaqueActorCount();\n } else {\n renderPass.incrementTranslucentActorCount();\n }\n }\n };\n\n publicAPI.getBufferShift = function (wgpuRen) {\n publicAPI.getKeyMatrices(wgpuRen);\n return model.bufferShift;\n };\n\n publicAPI.getKeyMatrices = function (wgpuRen) {\n // has the actor or stabilization center changed?\n if (Math.max(model.renderable.getMTime(), wgpuRen.getStabilizedTime()) > model.keyMatricesTime.getMTime()) {\n model.renderable.computeMatrix();\n var mcwc = model.renderable.getMatrix(); // compute the net shift, only apply stabilized coords with world coordinates\n\n model.bufferShift[0] = mcwc[3];\n model.bufferShift[1] = mcwc[7];\n model.bufferShift[2] = mcwc[11];\n var center = wgpuRen.getStabilizedCenterByReference();\n\n if (model.renderable.getCoordinateSystem() === CoordinateSystem.WORLD) {\n model.bufferShift[0] -= center[0];\n model.bufferShift[1] -= center[1];\n model.bufferShift[2] -= center[2];\n }\n\n mat4.transpose(model.keyMatrices.bcwc, mcwc);\n\n if (model.renderable.getIsIdentity()) {\n mat4.identity(model.keyMatrices.normalMatrix);\n } else {\n // we use bcwc BEFORE the translate below (just to get transposed mcvc)\n mat4.copy(model.keyMatrices.normalMatrix, model.keyMatrices.bcwc); // zero out translation\n\n model.keyMatrices.normalMatrix[3] = 0.0;\n model.keyMatrices.normalMatrix[7] = 0.0;\n model.keyMatrices.normalMatrix[11] = 0.0;\n mat4.invert(model.keyMatrices.normalMatrix, model.keyMatrices.normalMatrix);\n mat4.transpose(model.keyMatrices.normalMatrix, model.keyMatrices.normalMatrix);\n } // only need the buffer shift to get to world\n\n\n mat4.translate(model.keyMatrices.bcwc, model.keyMatrices.bcwc, [-model.bufferShift[0], -model.bufferShift[1], -model.bufferShift[2]]); // to get to stabilized we also need the center\n\n if (model.renderable.getCoordinateSystem() === CoordinateSystem.WORLD) {\n mat4.translate(model.keyMatrices.bcsc, model.keyMatrices.bcwc, [-center[0], -center[1], -center[2]]);\n } else {\n mat4.copy(model.keyMatrices.bcsc, model.keyMatrices.bcwc);\n }\n\n model.keyMatricesTime.modified();\n }\n\n return model.keyMatrices;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n keyMatricesTime: null,\n keyMatrices: null,\n propID: undefined,\n bufferShift: undefined\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkViewNode.extend(publicAPI, model, initialValues);\n model.keyMatricesTime = {};\n macro.obj(model.keyMatricesTime, {\n mtime: 0\n });\n model.keyMatrices = {\n normalMatrix: new Float64Array(16),\n bcwc: new Float64Array(16),\n bcsc: new Float64Array(16)\n };\n macro.get(publicAPI, model, ['propID', 'keyMatricesTime']);\n model.bufferShift = [0, 0, 0, 0]; // Object methods\n\n vtkWebGPUActor(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend); // ----------------------------------------------------------------------------\n\nvar index = {\n newInstance: newInstance,\n extend: extend\n}; // Register ourself to WebGPU backend if imported\n\nregisterOverride('vtkActor', newInstance);\n\nexport { index as default, extend, newInstance };\n","import { mat4 } from 'gl-matrix';\nimport macro from '../../macros.js';\nimport vtkProp from '../Core/Prop.js';\nimport vtkViewNode from '../SceneGraph/ViewNode.js';\nimport { registerOverride } from './ViewNodeFactory.js';\n\nvar CoordinateSystem = vtkProp.CoordinateSystem; // ----------------------------------------------------------------------------\n// vtkWebGPUActor methods\n// ----------------------------------------------------------------------------\n\nfunction vtkWebGPUActor2D(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkWebGPUActor2D'); // Builds myself.\n\n publicAPI.buildPass = function (prepass) {\n if (prepass) {\n model.WebGPURenderer = publicAPI.getFirstAncestorOfType('vtkWebGPURenderer');\n model.WebGPURenderWindow = model.WebGPURenderer.getFirstAncestorOfType('vtkWebGPURenderWindow');\n\n if (model.propID === undefined) {\n model.propID = model.WebGPURenderWindow.getUniquePropID();\n }\n\n publicAPI.prepareNodes();\n publicAPI.addMissingNode(model.renderable.getMapper());\n publicAPI.removeUnusedNodes();\n }\n }; // we draw textures, then mapper, then post pass textures\n\n\n publicAPI.traverseOpaquePass = function (renderPass) {\n if (!model.renderable || !model.renderable.getNestedVisibility() || !model.renderable.getIsOpaque() || model.WebGPURenderer.getSelector() && !model.renderable.getNestedPickable()) {\n return;\n }\n\n publicAPI.apply(renderPass, true);\n\n if (model.children[0]) {\n model.children[0].traverse(renderPass);\n }\n\n publicAPI.apply(renderPass, false);\n }; // we draw textures, then mapper, then post pass textures\n\n\n publicAPI.traverseTranslucentPass = function (renderPass) {\n if (!model.renderable || !model.renderable.getNestedVisibility() || model.renderable.getIsOpaque() || model.WebGPURenderer.getSelector() && !model.renderable.getNestedPickable()) {\n return;\n }\n\n publicAPI.apply(renderPass, true);\n\n if (model.children[0]) {\n model.children[0].traverse(renderPass);\n }\n\n publicAPI.apply(renderPass, false);\n };\n\n publicAPI.queryPass = function (prepass, renderPass) {\n if (prepass) {\n if (!model.renderable || !model.renderable.getVisibility()) {\n return;\n }\n\n if (model.renderable.getIsOpaque()) {\n renderPass.incrementOpaqueActorCount();\n } else {\n renderPass.incrementTranslucentActorCount();\n }\n }\n };\n\n publicAPI.getBufferShift = function (wgpuRen) {\n publicAPI.getKeyMatrices(wgpuRen);\n return model.bufferShift;\n };\n\n publicAPI.getKeyMatrices = function (wgpuRen) {\n // has the actor or stabilization center changed?\n if (Math.max(model.renderable.getMTime(), wgpuRen.getStabilizedTime()) > model.keyMatricesTime.getMTime()) {\n // compute the net shift, only apply stabilized coords with world coordinates\n model.bufferShift[0] = 0.0;\n model.bufferShift[1] = 0.0;\n model.bufferShift[2] = 0.0;\n var center = wgpuRen.getStabilizedCenterByReference();\n\n if (model.renderable.getCoordinateSystem() === CoordinateSystem.WORLD) {\n model.bufferShift[0] -= center[0];\n model.bufferShift[1] -= center[1];\n model.bufferShift[2] -= center[2];\n }\n\n mat4.identity(model.keyMatrices.bcwc);\n mat4.identity(model.keyMatrices.normalMatrix); // only meed the buffer shift to get to world\n\n mat4.translate(model.keyMatrices.bcwc, model.keyMatrices.bcwc, [-model.bufferShift[0], -model.bufferShift[1], -model.bufferShift[2]]); // to get to stabilized we also need the center\n\n if (model.renderable.getCoordinateSystem() === CoordinateSystem.WORLD) {\n mat4.translate(model.keyMatrices.bcsc, model.keyMatrices.bcwc, [-center[0], -center[1], -center[2]]);\n } else {\n mat4.copy(model.keyMatrices.bcsc, model.keyMatrices.bcwc);\n }\n\n model.keyMatricesTime.modified();\n }\n\n return model.keyMatrices;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n keyMatricesTime: null,\n keyMatrices: null,\n propID: undefined,\n bufferShift: undefined\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkViewNode.extend(publicAPI, model, initialValues);\n model.keyMatricesTime = {};\n macro.obj(model.keyMatricesTime, {\n mtime: 0\n });\n model.keyMatrices = {\n normalMatrix: new Float64Array(16),\n bcwc: new Float64Array(16),\n bcsc: new Float64Array(16)\n };\n macro.get(publicAPI, model, ['propID', 'keyMatricesTime']);\n model.bufferShift = [0, 0, 0, 0]; // Object methods\n\n vtkWebGPUActor2D(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend); // ----------------------------------------------------------------------------\n\nvar index = {\n newInstance: newInstance,\n extend: extend\n}; // Register ourself to WebGPU backend if imported\n\nregisterOverride('vtkActor2D', newInstance);\n\nexport { index as default, extend, newInstance };\n","import { newInstance as newInstance$1 } from '../../macros.js';\nimport vtkCubeAxesActor from '../Core/CubeAxesActor.js';\nimport vtkViewNode from '../SceneGraph/ViewNode.js';\nimport { registerOverride } from './ViewNodeFactory.js';\n\n// vtkWebGPUCubeAxesActor methods\n// ----------------------------------------------------------------------------\n\nfunction vtkWebGPUCubeAxesActor(publicAPI, model) {\n model.classHierarchy.push('vtkWebGPUCubeAxesActor'); // Builds myself.\n\n publicAPI.buildPass = function (prepass) {\n if (prepass) {\n model.WebGPURenderer = publicAPI.getFirstAncestorOfType('vtkWebGPURenderer');\n model.WebGPURenderWindow = model.WebGPURenderer.getParent();\n\n if (!model.CubeAxesActorHelper.getRenderable()) {\n model.CubeAxesActorHelper.setRenderable(model.renderable);\n }\n\n publicAPI.prepareNodes();\n publicAPI.addMissingNode(model.CubeAxesActorHelper.getTmActor());\n publicAPI.addMissingNode(model.renderable.getGridActor());\n publicAPI.removeUnusedNodes();\n }\n };\n\n publicAPI.opaquePass = function (prepass, renderPass) {\n if (prepass) {\n var camera = model.WebGPURenderer ? model.WebGPURenderer.getRenderable().getActiveCamera() : null;\n var tsize = model.WebGPURenderer.getTiledSizeAndOrigin();\n model.CubeAxesActorHelper.updateAPISpecificData([tsize.usize, tsize.vsize], camera, model.WebGPURenderWindow.getRenderable());\n }\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkViewNode.extend(publicAPI, model, initialValues);\n model.CubeAxesActorHelper = vtkCubeAxesActor.newCubeAxesActorHelper(); // Object methods\n\n vtkWebGPUCubeAxesActor(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend, 'vtkWebGPUCubeAxesActor'); // ----------------------------------------------------------------------------\n\nvar index = {\n newInstance: newInstance,\n extend: extend\n}; // Register ourself to WebGPU backend if imported\n\nregisterOverride('vtkCubeAxesActor', newInstance);\n\nexport { index as default, extend, newInstance };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport macro from '../../macros.js';\nimport Constants from './Property2D/Constants.js';\nimport { Representation } from './Property/Constants.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nvar DisplayLocation = Constants.DisplayLocation; // ----------------------------------------------------------------------------\n// vtkProperty2D methods\n// ----------------------------------------------------------------------------\n\nfunction vtkProperty2D(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkProperty2D');\n\n publicAPI.setDisplayLocationToBackground = function () {\n return publicAPI.setDisplayLocation(DisplayLocation.BACKGROUND);\n };\n\n publicAPI.setDisplayLocationToForeground = function () {\n return publicAPI.setDisplayLocation(DisplayLocation.FOREGROUND);\n };\n\n publicAPI.setRepresentationToWireframe = function () {\n return publicAPI.setRepresentation(Representation.WIREFRAME);\n };\n\n publicAPI.setRepresentationToSurface = function () {\n return publicAPI.setRepresentation(Representation.SURFACE);\n };\n\n publicAPI.setRepresentationToPoints = function () {\n return publicAPI.setRepresentation(Representation.POINTS);\n };\n\n publicAPI.getRepresentationAsString = function () {\n return macro.enumToString(Representation, model.representation);\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n color: [1, 1, 1],\n opacity: 1,\n pointSize: 1,\n lineWidth: 1,\n representation: Representation.SURFACE,\n displayLocation: DisplayLocation.FOREGROUND\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Build VTK API\n\n macro.obj(publicAPI, model);\n macro.setGet(publicAPI, model, ['opacity', 'lineWidth', 'pointSize', 'displayLocation', 'representation']);\n macro.setGetArray(publicAPI, model, ['color'], 3); // Object methods\n\n vtkProperty2D(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkProperty2D'); // ----------------------------------------------------------------------------\n\nvar vtkProperty2D$1 = _objectSpread({\n newInstance: newInstance,\n extend: extend\n}, Constants);\n\nexport { vtkProperty2D$1 as default, extend, newInstance };\n","import { mat3, mat4 } from 'gl-matrix';\nimport { newInstance as newInstance$1, setGet } from '../../macros.js';\nimport vtkMapper from '../Core/Mapper.js';\nimport vtkProp from '../Core/Prop.js';\nimport vtkProperty from '../Core/Property.js';\nimport vtkProperty2D from '../Core/Property2D.js';\nimport vtkTexture from '../Core/Texture.js';\nimport vtkWebGPUBufferManager from './BufferManager.js';\nimport vtkWebGPUShaderCache from './ShaderCache.js';\nimport vtkWebGPUUniformBuffer from './UniformBuffer.js';\nimport vtkWebGPUSimpleMapper from './SimpleMapper.js';\nimport vtkWebGPUTypes from './Types.js';\n\nvar BufferUsage = vtkWebGPUBufferManager.BufferUsage,\n PrimitiveTypes = vtkWebGPUBufferManager.PrimitiveTypes;\nvar Representation = vtkProperty.Representation;\nvar ScalarMode = vtkMapper.ScalarMode;\nvar CoordinateSystem = vtkProp.CoordinateSystem;\nvar DisplayLocation = vtkProperty2D.DisplayLocation;\nvar vtkWebGPUPolyDataVS = \"\\n//VTK::Renderer::Dec\\n\\n//VTK::Color::Dec\\n\\n//VTK::Normal::Dec\\n\\n//VTK::TCoord::Dec\\n\\n//VTK::Select::Dec\\n\\n//VTK::Mapper::Dec\\n\\n//VTK::IOStructs::Dec\\n\\n@vertex\\nfn main(\\n//VTK::IOStructs::Input\\n)\\n//VTK::IOStructs::Output\\n{\\n var output : vertexOutput;\\n\\n var vertex: vec4 = vertexBC;\\n\\n //VTK::Color::Impl\\n\\n //VTK::Normal::Impl\\n\\n //VTK::TCoord::Impl\\n\\n //VTK::Select::Impl\\n\\n //VTK::Position::Impl\\n\\n return output;\\n}\\n\";\nvar vtkWebGPUPolyDataFS = \"\\nstruct PBRData {\\n diffuse: vec3,\\n specular: vec3,\\n}\\n\\n// Dot product with the max already in it\\nfn mdot(a: vec3, b: vec3) -> f32 {\\n return max(0.0, dot(a, b));\\n}\\n// Dot product with a max in it that does not allow for negative values\\n// Physically based rendering is accurate as long as normals are accurate,\\n// however this is pretty often not the case. In order to prevent negative\\n// values from ruining light calculations and creating zones of zero light,\\n// this remapping is used, which smoothly clamps the dot product between\\n// zero and one while still maintaining a good amount of accuracy.\\nfn cdot(a: vec3, b: vec3) -> f32 {\\n var d: f32 = max(0.0, dot(a, b));\\n d = pow((d + 1) / 2.0, 2.6);\\n return d;\\n}\\n\\n// Lambertian diffuse model\\nfn lambertDiffuse(base: vec3, N: vec3, L: vec3) -> vec3 {\\n var pi: f32 = 3.14159265359; \\n var NdotL: f32 = mdot(N, L);\\n NdotL = pow(NdotL, 1.5);\\n return (base/pi)*NdotL;\\n}\\n\\n// Yasuhiro Fujii improvement on the Oren-Nayar model\\n// https://mimosa-pudica.net/improved-oren-nayar.html\\n// p is surface color, o is roughness\\nfn fujiiOrenNayar(p: vec3, o: f32, N: vec3, L: vec3, V: vec3) -> vec3 {\\n var invpi: f32 = 0.31830988618; // 1/pi\\n\\n var o2 = o*o;\\n var NdotL: f32 = mdot(N, L);\\n NdotL = pow(NdotL, 1.5); // Less physically accurate, but hides the \\\"seams\\\" between lights better\\n\\n var NdotV: f32 = mdot(N, V);\\n var LdotV: f32 = mdot(L, V);\\n\\n var s: f32 = LdotV - NdotL*NdotV;\\n var t: f32 = mix(1, max(NdotL, NdotV), step(0, s)); // Mix with step is the equivalent of an if statement\\n var A: vec3 = 0.5*(o2 / (o2 + 0.33)) + 0.17*p*(o2 / (o2 + 0.13));\\n A = invpi*(1 - A);\\n var B: f32 = 0.45*(o2 / (o2 + 0.09));\\n B = invpi*B;\\n\\n return p*NdotL*(A + B*(s/t));\\n}\\n\\n// Fresnel portion of BRDF (IOR only, simplified)\\nfn schlickFresnelIOR(V: vec3, N: vec3, ior: f32, k: f32) -> f32 {\\n var NdotV: f32 = mdot(V, N);\\n var F0: f32 = (pow((ior - 1.0), 2) + k*k) / (pow((ior + 1.0), 2) + k*k); // This takes into account the roughness, which the other one does not\\n return F0 + (1 - F0) * pow((1-NdotV), 5); \\n}\\n\\n// Fresnel portion of BRDF (Color ior, better)\\nfn schlickFresnelRGB(V: vec3, N: vec3, F0: vec3) -> vec3 {\\n var NdotV: f32 = mdot(V, N);\\n return F0 + (1 - F0) * pow((1-NdotV), 5); \\n}\\n\\n// Normal portion of BRDF\\n// https://learnopengl.com/PBR/Theory\\n// Trowbridge-Reitz GGX functions: normal, halfway, roughness^2\\nfn trGGX(N: vec3, H: vec3, a: f32) -> f32 {\\n var pi: f32 = 3.14159265359; \\n\\n var a2: f32 = a*a;\\n var NdotH = mdot(N, H);\\n var NdotH2 = NdotH*NdotH;\\n \\n var denom: f32 = NdotH2 * (a2 - 1.0) + 1.0;\\n\\n return a2 / max((pi*denom*denom), 0.000001);\\n}\\n\\n// A VERY bad approximation of anisotropy. Real anisotropic calculations require tangent and bitangent\\nfn anisotrophicTrGGX(N: vec3, H: vec3, O: vec3, s: f32, a: f32) -> f32 {\\n var Op: vec3 = (rendererUBO.WCVCNormals * vec4(normalize(O) * s, 0.)).xyz;\\n\\n var ggx1: f32 = trGGX(N + Op*s, H, a);\\n var ggx2: f32 = trGGX(N - Op*s, H, a);\\n return (0.5 * ggx1 + 0.5 * ggx2);\\n}\\n\\n// Geometry portion of BRDF\\nfn schlickGGX(N: vec3, X: vec3, k: f32) -> f32 {\\n var NdotX = cdot(N, X);\\n return NdotX / max(0.000001, (NdotX*(1-k) + k));\\n}\\n\\nfn smithSurfaceRoughness(N: vec3, V: vec3, L: vec3, k: f32) -> f32 {\\n var ggx1: f32 = min(1, schlickGGX(N, V, k));\\n var ggx2: f32 = min(1, schlickGGX(N, L, k));\\n return ggx1*ggx2;\\n}\\n\\n// BRDF Combination\\nfn cookTorrance(D: f32, F: f32, G: f32, N: vec3, V: vec3, L: vec3) -> f32 {\\n var num: f32 = D*F*G;\\n var denom: f32 = 4*cdot(V, N)*cdot(L, N);\\n\\n return num / max(denom, 0.000001);\\n}\\n\\n// Different lighting calculations for different light sources\\nfn calcDirectionalLight(N: vec3, V: vec3, ior: f32, roughness: f32, metallic: f32, direction: vec3, color: vec3, base: vec3) -> PBRData { \\n var L: vec3 = normalize(direction); // Light Vector\\n var H: vec3 = normalize(L + V); // Halfway Vector\\n\\n var alpha = roughness*roughness;\\n var k: f32 = alpha*alpha / 2;\\n\\n var D: f32 = trGGX(N, H, alpha); // Distribution\\n // var F: f32 = schlickFresnelIOR(V, N, ior, k); // Fresnel\\n var G: f32 = smithSurfaceRoughness(N, V, L, k); // Geometry\\n\\n var brdf: f32 = cookTorrance(D, 1, G, N, V, L); // Fresnel term is replaced with 1 because it is added later\\n var incoming: vec3 = color;\\n var angle: f32 = mdot(L, N);\\n angle = pow(angle, 1.5);\\n\\n var specular: vec3 = brdf*incoming*angle;\\n // Oren-Nayar gives a clay-like effect when fully rough which some people may not want, so it might be better to give a separate\\n // control property for the diffuse vs specular roughness\\n var diffuse: vec3 = incoming*fujiiOrenNayar(base, roughness, N, L, V); \\n // Stores the specular and diffuse separately to allow for finer post processing\\n var out = PBRData(diffuse, specular);\\n \\n return out; // Returns angle along with color of light so the final color can be multiplied by angle as well (creates black areas)\\n}\\n\\n// TODO: find some way to reduce the number of arguments going in here\\nfn calcPointLight(N: vec3, V: vec3, fragPos: vec3, ior: f32, roughness: f32, metallic: f32, position: vec3, color: vec3, base: vec3) -> PBRData {\\n var L: vec3 = normalize(position - fragPos); // Light Vector\\n var H: vec3 = normalize(L + V); // Halfway Vector\\n var dist = distance(position, fragPos);\\n\\n var alpha = roughness*roughness;\\n var k: f32 = alpha*alpha / 2; // could also be pow(alpha + 1.0, 2) / 8\\n\\n var D: f32 = trGGX(N, H, alpha); // Distribution\\n // var F: f32 = schlickFresnelIOR(V, N, ior, k); // Fresnel\\n var G: f32 = smithSurfaceRoughness(N, V, L, k); // Geometry\\n\\n var brdf: f32 = cookTorrance(D, 1, G, N, V, L); \\n var incoming: vec3 = color * (1. / (dist*dist));\\n var angle: f32 = mdot(L, N);\\n angle = pow(angle, 1.5); // Smoothing factor makes it less accurate, but reduces ugly \\\"seams\\\" bewteen light sources\\n\\n var specular: vec3 = brdf*incoming*angle;\\n var diffuse: vec3 = incoming*fujiiOrenNayar(base, roughness, N, L, V);\\n\\n // Stores the specular and diffuse separately to allow for finer post processing\\n // Could also be done (propably more properly) with a struct\\n var out = PBRData(diffuse, specular);\\n \\n return out; // Returns angle along with color of light so the final color can be multiplied by angle as well (creates black areas)\\n}\\n\\n// For a reason unknown to me, spheres dont seem to behave propperly with head-on spot lights\\nfn calcSpotLight(N: vec3, V: vec3, fragPos: vec3, ior: f32, roughness: f32, metallic: f32, position: vec3, direction: vec3, cones: vec2, color: vec3, base: vec3) -> PBRData {\\n var L: vec3 = normalize(position - fragPos);\\n var H: vec3 = normalize(L + V); // Halfway Vector\\n var dist = distance(position, fragPos);\\n\\n var alpha = roughness*roughness;\\n var k: f32 = alpha*alpha / 2; // could also be pow(alpha + 1.0, 2) / 8\\n\\n var D: f32 = trGGX(N, H, alpha); // Distribution\\n // var F: f32 = schlickFresnelIOR(V, N, ior, k); // Fresnel\\n var G: f32 = smithSurfaceRoughness(N, V, L, k); // Geometry\\n\\n var brdf: f32 = cookTorrance(D, 1, G, N, V, L); \\n \\n // Cones.x is the inner phi and cones.y is the outer phi\\n var theta: f32 = mdot(normalize(direction), L);\\n var epsilon: f32 = cones.x - cones.y;\\n var intensity: f32 = (theta - cones.y) / epsilon;\\n intensity = clamp(intensity, 0.0, 1.0);\\n intensity /= dist*dist;\\n\\n var incoming: vec3 = color * intensity;\\n\\n var angle: f32 = mdot(L, N);\\n angle = pow(angle, 1.5); // Smoothing factor makes it less accurate, but reduces ugly \\\"seams\\\" bewteen light sources\\n\\n var specular: vec3 = brdf*incoming*angle;\\n var diffuse: vec3 = incoming*fujiiOrenNayar(base, roughness, N, L, V);\\n\\n // Stores the specular and diffuse separately to allow for finer post processing\\n // Could also be done (propably more properly) with a struct\\n var out = PBRData(diffuse, specular);\\n \\n return out; // Returns angle along with color of light so the final color can be multiplied by angle as well (creates black areas)\\n}\\n\\n// Environment mapping stuff\\n// Takes in a vector and converts it to an equivalent coordinate in a rectilinear texture. Should be replaced with cubemaps at some point\\nfn vecToRectCoord(dir: vec3) -> vec2 {\\n var tau: f32 = 6.28318530718;\\n var pi: f32 = 3.14159265359;\\n var out: vec2 = vec2(0.0);\\n\\n out.x = atan2(dir.z, dir.x) / tau;\\n out.x += 0.5;\\n\\n var phix: f32 = length(vec2(dir.x, dir.z));\\n out.y = atan2(dir.y, phix) / pi + 0.5;\\n\\n return out;\\n}\\n\\n//VTK::Renderer::Dec\\n\\n//VTK::Color::Dec\\n\\n//VTK::TCoord::Dec\\n\\n// optional surface normal declaration\\n//VTK::Normal::Dec\\n\\n//VTK::Select::Dec\\n\\n//VTK::RenderEncoder::Dec\\n\\n//VTK::Mapper::Dec\\n\\n//VTK::IOStructs::Dec\\n\\n@fragment\\nfn main(\\n//VTK::IOStructs::Input\\n)\\n//VTK::IOStructs::Output\\n{\\n var output : fragmentOutput;\\n\\n // Temporary ambient, diffuse, and opacity\\n var ambientColor: vec4 = mapperUBO.AmbientColor;\\n var diffuseColor: vec4 = mapperUBO.DiffuseColor;\\n var opacity: f32 = mapperUBO.Opacity;\\n\\n // This should be declared somewhere else\\n var _diffuseMap: vec4 = vec4(1);\\n var _roughnessMap: vec4 = vec4(1);\\n var _metallicMap: vec4 = vec4(1);\\n var _normalMap: vec4 = vec4(0, 0, 1, 0); // normal map was setting off the normal vector detection in fragment\\n var _ambientOcclusionMap: vec4 = vec4(1);\\n var _emissionMap: vec4 = vec4(0);\\n\\n //VTK::Color::Impl\\n\\n //VTK::TCoord::Impl\\n\\n //VTK::Normal::Impl\\n\\n var computedColor: vec4 = vec4(diffuseColor.rgb, 1.0);\\n\\n //VTK::Light::Impl\\n\\n //VTK::Select::Impl\\n\\n if (computedColor.a == 0.0) { discard; };\\n\\n //VTK::Position::Impl\\n\\n //VTK::RenderEncoder::Impl\\n\\n return output;\\n}\\n\";\n\nfunction isEdges(hash) {\n // edge pipelines have \"edge\" in them\n return hash.indexOf('edge') >= 0;\n} // ----------------------------------------------------------------------------\n// vtkWebGPUCellArrayMapper methods\n// ----------------------------------------------------------------------------\n\n\nfunction vtkWebGPUCellArrayMapper(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkWebGPUCellArrayMapper');\n\n publicAPI.buildPass = function (prepass) {\n if (prepass) {\n if (model.is2D) {\n model.WebGPUActor = publicAPI.getFirstAncestorOfType('vtkWebGPUActor2D');\n model.forceZValue = true;\n } else {\n model.WebGPUActor = publicAPI.getFirstAncestorOfType('vtkWebGPUActor');\n model.forceZValue = false;\n }\n\n model.coordinateSystem = model.WebGPUActor.getRenderable().getCoordinateSystem();\n model.useRendererMatrix = model.coordinateSystem !== CoordinateSystem.DISPLAY;\n model.WebGPURenderer = model.WebGPUActor.getFirstAncestorOfType('vtkWebGPURenderer');\n model.WebGPURenderWindow = model.WebGPURenderer.getParent();\n model.device = model.WebGPURenderWindow.getDevice();\n }\n }; // Renders myself\n\n\n publicAPI.translucentPass = function (prepass) {\n if (prepass) {\n publicAPI.prepareToDraw(model.WebGPURenderer.getRenderEncoder());\n model.renderEncoder.registerDrawCallback(model.pipeline, publicAPI.draw);\n }\n };\n\n publicAPI.opaquePass = function (prepass) {\n if (prepass) {\n publicAPI.prepareToDraw(model.WebGPURenderer.getRenderEncoder());\n model.renderEncoder.registerDrawCallback(model.pipeline, publicAPI.draw);\n }\n };\n\n publicAPI.updateUBO = function () {\n // make sure the data is up to date\n var actor = model.WebGPUActor.getRenderable();\n var ppty = actor.getProperty();\n var utime = model.UBO.getSendTime();\n\n if (publicAPI.getMTime() > utime || ppty.getMTime() > utime || model.renderable.getMTime() > utime) {\n var _ppty$getEdgeColorByR;\n\n // Matricies\n var keyMats = model.WebGPUActor.getKeyMatrices(model.WebGPURenderer);\n model.UBO.setArray('BCWCMatrix', keyMats.bcwc);\n model.UBO.setArray('BCSCMatrix', keyMats.bcsc);\n model.UBO.setArray('MCWCNormals', keyMats.normalMatrix);\n\n if (model.is2D) {\n model.UBO.setValue('ZValue', model.WebGPUActor.getRenderable().getProperty().getDisplayLocation() === DisplayLocation.FOREGROUND ? 1.0 : 0.0);\n\n var _aColor = ppty.getColorByReference();\n\n model.UBO.setValue('AmbientIntensity', 1.0);\n model.UBO.setArray('DiffuseColor', [_aColor[0], _aColor[1], _aColor[2], 1.0]);\n model.UBO.setValue('DiffuseIntensity', 0.0);\n model.UBO.setValue('SpecularIntensity', 0.0);\n } else {\n // Base Colors\n var _aColor2 = ppty.getAmbientColorByReference();\n\n model.UBO.setValue('AmbientIntensity', ppty.getAmbient());\n model.UBO.setArray('AmbientColor', [_aColor2[0], _aColor2[1], _aColor2[2], 1.0]);\n model.UBO.setValue('DiffuseIntensity', ppty.getDiffuse());\n _aColor2 = ppty.getDiffuseColorByReference();\n model.UBO.setArray('DiffuseColor', [_aColor2[0], _aColor2[1], _aColor2[2], 1.0]); // Roughness\n\n model.UBO.setValue('Roughness', ppty.getRoughness());\n model.UBO.setValue('BaseIOR', ppty.getBaseIOR()); // Metallic\n\n model.UBO.setValue('Metallic', ppty.getMetallic()); // Normal\n\n model.UBO.setValue('NormalStrength', ppty.getNormalStrength()); // Emission\n\n model.UBO.setValue('Emission', ppty.getEmission()); // Specular\n\n model.UBO.setValue('SpecularIntensity', ppty.getSpecular());\n _aColor2 = ppty.getSpecularColorByReference();\n model.UBO.setArray('SpecularColor', [_aColor2[0], _aColor2[1], _aColor2[2], 1.0]);\n } // Edge and line rendering\n\n\n var aColor = (_ppty$getEdgeColorByR = ppty.getEdgeColorByReference) === null || _ppty$getEdgeColorByR === void 0 ? void 0 : _ppty$getEdgeColorByR.call(ppty);\n\n if (aColor) {\n model.UBO.setArray('EdgeColor', [aColor[0], aColor[1], aColor[2], 1.0]);\n }\n\n model.UBO.setValue('LineWidth', ppty.getLineWidth());\n model.UBO.setValue('Opacity', ppty.getOpacity());\n model.UBO.setValue('PropID', model.WebGPUActor.getPropID());\n var device = model.WebGPURenderWindow.getDevice();\n model.UBO.sendIfNeeded(device);\n }\n };\n\n publicAPI.haveWideLines = function () {\n var actor = model.WebGPUActor.getRenderable();\n var representation = actor.getProperty().getRepresentation();\n\n if (actor.getProperty().getLineWidth() <= 1.0) {\n return false;\n }\n\n if (model.primitiveType === PrimitiveTypes.Verts) {\n return false;\n }\n\n if (model.primitiveType === PrimitiveTypes.Triangles || model.primitiveType === PrimitiveTypes.TriangleStrips) {\n return representation === Representation.WIREFRAME;\n }\n\n return true;\n };\n\n publicAPI.replaceShaderPosition = function (hash, pipeline, vertexInput) {\n var vDesc = pipeline.getShaderDescription('vertex');\n vDesc.addBuiltinOutput('vec4', '@builtin(position) Position');\n if (!vDesc.hasOutput('vertexVC')) vDesc.addOutput('vec4', 'vertexVC');\n var code = vDesc.getCode();\n\n if (model.useRendererMatrix) {\n code = vtkWebGPUShaderCache.substitute(code, '//VTK::Position::Impl', [' var pCoord: vec4 = rendererUBO.SCPCMatrix*mapperUBO.BCSCMatrix*vertexBC;', ' output.vertexVC = rendererUBO.SCVCMatrix * mapperUBO.BCSCMatrix * vec4(vertexBC.xyz, 1.0);', '//VTK::Position::Impl']).result;\n\n if (model.forceZValue) {\n code = vtkWebGPUShaderCache.substitute(code, '//VTK::Position::Impl', ['pCoord = vec4(pCoord.xyz/pCoord.w, 1.0);', 'pCoord.z = mapperUBO.ZValue;', '//VTK::Position::Impl']).result;\n }\n } else {\n code = vtkWebGPUShaderCache.substitute(code, '//VTK::Position::Impl', [' var pCoord: vec4 = mapperUBO.BCSCMatrix*vertexBC;', ' pCoord.x = 2.0* pCoord.x / rendererUBO.viewportSize.x - 1.0;', ' pCoord.y = 2.0* pCoord.y / rendererUBO.viewportSize.y - 1.0;', ' pCoord.z = 0.5 - 0.5 * pCoord.z;', '//VTK::Position::Impl']).result;\n\n if (model.forceZValue) {\n code = vtkWebGPUShaderCache.substitute(code, '//VTK::Position::Impl', [' pCoord.z = mapperUBO.ZValue;', '//VTK::Position::Impl']).result;\n }\n }\n\n if (publicAPI.haveWideLines()) {\n vDesc.addBuiltinInput('u32', '@builtin(instance_index) instanceIndex'); // widen the edge\n\n code = vtkWebGPUShaderCache.substitute(code, '//VTK::Position::Impl', [' var tmpPos: vec4 = pCoord;', ' var numSteps: f32 = ceil(mapperUBO.LineWidth - 1.0);', ' var offset: f32 = (mapperUBO.LineWidth - 1.0) * (f32(input.instanceIndex / 2u) - numSteps/2.0) / numSteps;', ' var tmpPos2: vec3 = tmpPos.xyz / tmpPos.w;', ' tmpPos2.x = tmpPos2.x + 2.0 * (f32(input.instanceIndex) % 2.0) * offset / rendererUBO.viewportSize.x;', ' tmpPos2.y = tmpPos2.y + 2.0 * (f32(input.instanceIndex + 1u) % 2.0) * offset / rendererUBO.viewportSize.y;', ' tmpPos2.z = min(1.0, tmpPos2.z + 0.00001);', // could become a setting\n ' pCoord = vec4(tmpPos2.xyz * tmpPos.w, tmpPos.w);', '//VTK::Position::Impl']).result;\n }\n\n code = vtkWebGPUShaderCache.substitute(code, '//VTK::Position::Impl', [' output.Position = pCoord;']).result;\n vDesc.setCode(code);\n };\n\n model.shaderReplacements.set('replaceShaderPosition', publicAPI.replaceShaderPosition);\n\n publicAPI.replaceShaderNormal = function (hash, pipeline, vertexInput) {\n var normalBuffer = vertexInput.getBuffer('normalMC');\n var actor = model.WebGPUActor.getRenderable();\n\n if (normalBuffer) {\n var vDesc = pipeline.getShaderDescription('vertex');\n\n if (!vDesc.hasOutput('normalVC')) {\n vDesc.addOutput('vec3', 'normalVC', normalBuffer.getArrayInformation()[0].interpolation);\n }\n\n if (!vDesc.hasOutput('tangentVC')) {\n vDesc.addOutput('vec3', 'tangentVC', normalBuffer.getArrayInformation()[0].interpolation);\n }\n\n if (!vDesc.hasOutput('bitangentVC')) {\n vDesc.addOutput('vec3', 'bitangentVC', normalBuffer.getArrayInformation()[0].interpolation);\n }\n\n var code = vDesc.getCode();\n code = vtkWebGPUShaderCache.substitute(code, '//VTK::Normal::Impl', [' output.normalVC = normalize((rendererUBO.WCVCNormals * mapperUBO.MCWCNormals * normalMC).xyz);', // This is just an approximation, but it happens to work extremely well\n // It only works well for normals that are head on and not super angled though\n // Definitely needs to be replaced\n ' var c1: vec3 = cross(output.normalVC, vec3(0, 0, 1));', ' var c2: vec3 = cross(output.normalVC, vec3(0, 1, 0));', ' var tangent: vec3 = mix(c1, c2, distance(c1, c2));', ' output.tangentVC = normalize(tangent);', ' output.bitangentVC = normalize(cross(output.normalVC, tangent));']).result;\n vDesc.setCode(code);\n var fDesc = pipeline.getShaderDescription('fragment');\n code = fDesc.getCode();\n\n if (actor.getProperty().getNormalTexture()) {\n code = vtkWebGPUShaderCache.substitute(code, '//VTK::Normal::Impl', [' var normal: vec3 = input.normalVC;', ' if (!input.frontFacing) { normal = -normal; }', ' var tangent: vec3 = input.tangentVC;', ' var bitangent: vec3 = input.bitangentVC;', ' var TCVCMatrix: mat3x3 = mat3x3(', ' tangent.x, bitangent.x, normal.x,', ' tangent.y, bitangent.y, normal.y,', ' tangent.z, bitangent.z, normal.z,', ' );', ' var mappedNormal: vec3 = TCVCMatrix * (_normalMap.xyz * 2 - 1);', ' normal = mix(normal, mappedNormal, mapperUBO.NormalStrength);', ' normal = normalize(normal);']).result;\n } else {\n code = vtkWebGPUShaderCache.substitute(code, '//VTK::Normal::Impl', [' var normal: vec3 = input.normalVC;', ' if (!input.frontFacing) { normal = -normal; }', ' normal = normalize(normal);']).result;\n }\n\n fDesc.setCode(code);\n }\n };\n\n model.shaderReplacements.set('replaceShaderNormal', publicAPI.replaceShaderNormal); // we only apply lighting when there is a \"var normal\" declaration in the\n // fragment shader code. That is the lighting trigger.\n\n publicAPI.replaceShaderLight = function (hash, pipeline, vertexInput) {\n if (hash.includes('sel')) return;\n var vDesc = pipeline.getShaderDescription('vertex');\n if (!vDesc.hasOutput('vertexVC')) vDesc.addOutput('vec4', 'vertexVC');\n var renderer = model.WebGPURenderer.getRenderable();\n var fDesc = pipeline.getShaderDescription('fragment');\n var code = fDesc.getCode(); // Code that runs if the fragment shader includes normals\n\n if (code.includes('var normal:') && model.useRendererMatrix && !isEdges(hash) && !model.is2D && !hash.includes('sel')) {\n var _renderer$getEnvironm;\n\n var lightingCode = [// Constants\n ' var pi: f32 = 3.14159265359;', // Vectors needed for light calculations\n ' var fragPos: vec3 = vec3(input.vertexVC.xyz);', ' var V: vec3 = mix(normalize(-fragPos), vec3(0, 0, 1), f32(rendererUBO.cameraParallel)); // View Vector', // Values needed for light calculations\n ' var baseColor: vec3 = _diffuseMap.rgb * diffuseColor.rgb;', ' var roughness: f32 = max(0.000001, mapperUBO.Roughness * _roughnessMap.r);', // Need to have a different way of sampling greyscale values aside from .r\n ' var metallic: f32 = mapperUBO.Metallic * _metallicMap.r;', ' var alpha: f32 = roughness*roughness;', ' var ior: f32 = mapperUBO.BaseIOR;', ' var k: f32 = alpha*alpha / 2;', // Split diffuse and specular components\n ' var diffuse: vec3 = vec3(0.);', ' var specular: vec3 = vec3(0.);', ' var emission: vec3 = _emissionMap.rgb * mapperUBO.Emission;', // Summing diffuse and specular components of directional lights\n ' {', ' var i: i32 = 0;', ' loop {', ' if !(i < rendererUBO.LightCount) { break; }', ' switch (i32(rendererLightSSBO.values[i].LightData.x)) {', ' // Point Light', ' case 0 {', ' var color: vec3 = rendererLightSSBO.values[i].LightColor.rgb * rendererLightSSBO.values[i].LightColor.w;', ' var pos: vec3 = (rendererLightSSBO.values[i].LightPos).xyz;', ' var calculated: PBRData = calcPointLight(normal, V, fragPos, ior, roughness, metallic, pos, color, baseColor);', ' diffuse += max(vec3(0), calculated.diffuse);', ' specular += max(vec3(0), calculated.specular);', ' }', ' // Directional light', ' case 1 {', ' var dir: vec3 = (rendererUBO.WCVCNormals * vec4(normalize(rendererLightSSBO.values[i].LightDir.xyz), 0.)).xyz;', ' dir = normalize(dir);', ' var color: vec3 = rendererLightSSBO.values[i].LightColor.rgb * rendererLightSSBO.values[i].LightColor.w;', ' var calculated: PBRData = calcDirectionalLight(normal, V, ior, roughness, metallic, dir, color, baseColor); // diffuseColor.rgb needs to be fixed with a more dynamic diffuse color', ' diffuse += max(vec3(0), calculated.diffuse);', ' specular += max(vec3(0), calculated.specular);', ' }', ' // Spot Light', ' case 2 {', ' var color: vec3 = rendererLightSSBO.values[i].LightColor.rgb * rendererLightSSBO.values[i].LightColor.w;', ' var pos: vec3 = (rendererLightSSBO.values[i].LightPos).xyz;', ' var dir: vec3 = (rendererUBO.WCVCNormals * vec4(normalize(rendererLightSSBO.values[i].LightDir.xyz), 0.)).xyz;', ' dir = normalize(dir);', ' var cones: vec2 = vec2(rendererLightSSBO.values[i].LightData.y, rendererLightSSBO.values[i].LightData.z);', ' var calculated: PBRData = calcSpotLight(normal, V, fragPos, ior, roughness, metallic, pos, dir, cones, color, baseColor);', ' diffuse += max(vec3(0), calculated.diffuse);', ' specular += max(vec3(0), calculated.specular);', ' }', ' default { continue; }', ' }', ' continuing { i++; }', ' }', ' }', // Final variables for combining specular and diffuse\n ' var fresnel: f32 = schlickFresnelIOR(V, normal, ior, k); // Fresnel', ' fresnel = min(1, fresnel);', ' // This could be controlled with its own variable (that isnt base color) for better artistic control', ' var fresnelMetallic: vec3 = schlickFresnelRGB(V, normal, baseColor); // Fresnel for metal, takes color into account', ' var kS: vec3 = mix(vec3(fresnel), fresnelMetallic, metallic);', ' kS = min(vec3(1), kS);', ' var kD: vec3 = (1.0 - kS) * (1.0 - metallic);', ' var PBR: vec3 = mapperUBO.DiffuseIntensity*kD*diffuse + kS*specular;', ' PBR += emission;', ' computedColor = vec4(PBR, mapperUBO.Opacity);'];\n\n if ((_renderer$getEnvironm = renderer.getEnvironmentTexture()) !== null && _renderer$getEnvironm !== void 0 && _renderer$getEnvironm.getImageLoaded()) {\n lightingCode.push(' // To get diffuse IBL, the texture is sampled with normals in worldspace', ' var diffuseIBLCoords: vec3 = (transpose(rendererUBO.WCVCNormals) * vec4(normal, 1.)).xyz;', ' var diffuseCoords: vec2 = vecToRectCoord(diffuseIBLCoords);', ' // To get specular IBL, the texture is sampled as the worldspace reflection between the normal and view vectors', ' // Reflections are first calculated in viewspace, then converted to worldspace to sample the environment', ' var VreflN: vec3 = normalize(reflect(-V, normal));', ' var reflectionIBLCoords = (transpose(rendererUBO.WCVCNormals) * vec4(VreflN, 1.)).xyz;', ' var specularCoords: vec2 = vecToRectCoord(reflectionIBLCoords);', ' var diffuseIBL = textureSampleLevel(EnvironmentTexture, EnvironmentTextureSampler, diffuseCoords, rendererUBO.MaxEnvironmentMipLevel);', // Level multiplier should be set by UBO\n ' var level = roughness * rendererUBO.MaxEnvironmentMipLevel;', ' var specularIBL = textureSampleLevel(EnvironmentTexture, EnvironmentTextureSampler, specularCoords, level);', // Manual mip smoothing since not all formats support smooth level sampling\n ' var specularIBLContribution: vec3 = specularIBL.rgb*rendererUBO.BackgroundSpecularStrength;', ' computedColor += vec4(specularIBLContribution*kS, 0);', ' var diffuseIBLContribution: vec3 = diffuseIBL.rgb*rendererUBO.BackgroundDiffuseStrength;', ' diffuseIBLContribution *= baseColor * _ambientOcclusionMap.rgb;', // Multipy by baseColor may be changed\n ' computedColor += vec4(diffuseIBLContribution*kD, 0);');\n }\n\n code = vtkWebGPUShaderCache.substitute(code, '//VTK::Light::Impl', lightingCode).result;\n fDesc.setCode(code); // If theres no normals, just set the specular color to be flat\n } else {\n code = vtkWebGPUShaderCache.substitute(code, '//VTK::Light::Impl', [' var diffuse: vec3 = diffuseColor.rgb;', ' var specular: vec3 = mapperUBO.SpecularColor.rgb * mapperUBO.SpecularColor.a;', ' computedColor = vec4(diffuse * _diffuseMap.rgb, mapperUBO.Opacity);']).result;\n fDesc.setCode(code);\n }\n };\n\n model.shaderReplacements.set('replaceShaderLight', publicAPI.replaceShaderLight);\n\n publicAPI.replaceShaderColor = function (hash, pipeline, vertexInput) {\n // By default, set the colors to be flat\n if (isEdges(hash)) {\n var _fDesc = pipeline.getShaderDescription('fragment');\n\n var _code = _fDesc.getCode();\n\n _code = vtkWebGPUShaderCache.substitute(_code, '//VTK::Color::Impl', ['ambientColor = mapperUBO.EdgeColor;', 'diffuseColor = mapperUBO.EdgeColor;']).result;\n\n _fDesc.setCode(_code);\n\n return;\n } // If there's no vertex color buffer return the shader as is\n\n\n var colorBuffer = vertexInput.getBuffer('colorVI');\n if (!colorBuffer) return; // Modifies the vertex shader to include the vertex colors and interpolation in the outputs\n\n var vDesc = pipeline.getShaderDescription('vertex');\n vDesc.addOutput('vec4', 'color', colorBuffer.getArrayInformation()[0].interpolation);\n var code = vDesc.getCode();\n code = vtkWebGPUShaderCache.substitute(code, '//VTK::Color::Impl', [' output.color = colorVI;']).result;\n vDesc.setCode(code); // Sets the fragment shader to accept the color inputs from the vertex shader\n\n var fDesc = pipeline.getShaderDescription('fragment');\n code = fDesc.getCode();\n code = vtkWebGPUShaderCache.substitute(code, '//VTK::Color::Impl', ['ambientColor = input.color;', 'diffuseColor = input.color;', 'opacity = mapperUBO.Opacity * input.color.a;']).result;\n fDesc.setCode(code);\n };\n\n model.shaderReplacements.set('replaceShaderColor', publicAPI.replaceShaderColor);\n\n publicAPI.replaceShaderTCoord = function (hash, pipeline, vertexInput) {\n var _actor$getProperty$ge, _actor$getProperty, _actor$getProperty$ge2, _actor$getProperty$ge4, _actor$getProperty3, _actor$getProperty$ge5, _actor$getProperty$ge6, _actor$getProperty4, _actor$getProperty$ge7, _actor$getProperty$ge8, _actor$getProperty5, _actor$getProperty$ge9, _actor$getProperty$ge10, _actor$getProperty6, _actor$getProperty$ge11, _actor$getProperty$ge12, _actor$getProperty7, _actor$getProperty$ge13;\n\n if (!vertexInput.hasAttribute('tcoord')) return;\n var vDesc = pipeline.getShaderDescription('vertex');\n var tcoords = vertexInput.getBuffer('tcoord');\n var numComp = vtkWebGPUTypes.getNumberOfComponentsFromBufferFormat(tcoords.getArrayInformation()[0].format);\n var code = vDesc.getCode();\n vDesc.addOutput(\"vec\".concat(numComp, \"\"), 'tcoordVS');\n code = vtkWebGPUShaderCache.substitute(code, '//VTK::TCoord::Impl', [' output.tcoordVS = tcoord;']).result;\n vDesc.setCode(code);\n var fDesc = pipeline.getShaderDescription('fragment');\n code = fDesc.getCode();\n var actor = model.WebGPUActor.getRenderable();\n\n var checkDims = function checkDims(texture) {\n if (!texture) return false;\n var dims = texture.getDimensionality();\n return dims === numComp;\n };\n\n var usedTextures = [];\n\n if ((_actor$getProperty$ge = (_actor$getProperty = actor.getProperty()).getDiffuseTexture) !== null && _actor$getProperty$ge !== void 0 && (_actor$getProperty$ge2 = _actor$getProperty$ge.call(_actor$getProperty)) !== null && _actor$getProperty$ge2 !== void 0 && _actor$getProperty$ge2.getImageLoaded() || actor.getTextures()[0] || model.colorTexture) {\n var _actor$getProperty$ge3, _actor$getProperty2;\n\n if ( // Chained or statements here are questionable\n checkDims((_actor$getProperty$ge3 = (_actor$getProperty2 = actor.getProperty()).getDiffuseTexture) === null || _actor$getProperty$ge3 === void 0 ? void 0 : _actor$getProperty$ge3.call(_actor$getProperty2)) || checkDims(actor.getTextures()[0]) || checkDims(model.colorTexture)) {\n usedTextures.push('_diffuseMap = textureSample(DiffuseTexture, DiffuseTextureSampler, input.tcoordVS);');\n }\n }\n\n if ((_actor$getProperty$ge4 = (_actor$getProperty3 = actor.getProperty()).getRoughnessTexture) !== null && _actor$getProperty$ge4 !== void 0 && (_actor$getProperty$ge5 = _actor$getProperty$ge4.call(_actor$getProperty3)) !== null && _actor$getProperty$ge5 !== void 0 && _actor$getProperty$ge5.getImageLoaded()) {\n if (checkDims(actor.getProperty().getRoughnessTexture())) {\n usedTextures.push('_roughnessMap = textureSample(RoughnessTexture, RoughnessTextureSampler, input.tcoordVS);');\n }\n }\n\n if ((_actor$getProperty$ge6 = (_actor$getProperty4 = actor.getProperty()).getMetallicTexture) !== null && _actor$getProperty$ge6 !== void 0 && (_actor$getProperty$ge7 = _actor$getProperty$ge6.call(_actor$getProperty4)) !== null && _actor$getProperty$ge7 !== void 0 && _actor$getProperty$ge7.getImageLoaded()) {\n if (checkDims(actor.getProperty().getMetallicTexture())) {\n usedTextures.push('_metallicMap = textureSample(MetallicTexture, MetallicTextureSampler, input.tcoordVS);');\n }\n }\n\n if ((_actor$getProperty$ge8 = (_actor$getProperty5 = actor.getProperty()).getNormalTexture) !== null && _actor$getProperty$ge8 !== void 0 && (_actor$getProperty$ge9 = _actor$getProperty$ge8.call(_actor$getProperty5)) !== null && _actor$getProperty$ge9 !== void 0 && _actor$getProperty$ge9.getImageLoaded()) {\n if (checkDims(actor.getProperty().getNormalTexture())) {\n usedTextures.push('_normalMap = textureSample(NormalTexture, NormalTextureSampler, input.tcoordVS);');\n }\n }\n\n if ((_actor$getProperty$ge10 = (_actor$getProperty6 = actor.getProperty()).getAmbientOcclusionTexture) !== null && _actor$getProperty$ge10 !== void 0 && (_actor$getProperty$ge11 = _actor$getProperty$ge10.call(_actor$getProperty6)) !== null && _actor$getProperty$ge11 !== void 0 && _actor$getProperty$ge11.getImageLoaded()) {\n if (checkDims(actor.getProperty().getAmbientOcclusionTexture())) {\n usedTextures.push('_ambientOcclusionMap = textureSample(AmbientOcclusionTexture, AmbientOcclusionTextureSampler, input.tcoordVS);');\n }\n }\n\n if ((_actor$getProperty$ge12 = (_actor$getProperty7 = actor.getProperty()).getEmissionTexture) !== null && _actor$getProperty$ge12 !== void 0 && (_actor$getProperty$ge13 = _actor$getProperty$ge12.call(_actor$getProperty7)) !== null && _actor$getProperty$ge13 !== void 0 && _actor$getProperty$ge13.getImageLoaded()) {\n if (checkDims(actor.getProperty().getEmissionTexture())) {\n usedTextures.push('_emissionMap = textureSample(EmissionTexture, EmissionTextureSampler, input.tcoordVS);');\n }\n }\n\n code = vtkWebGPUShaderCache.substitute(code, '//VTK::TCoord::Impl', usedTextures).result;\n fDesc.setCode(code);\n };\n\n model.shaderReplacements.set('replaceShaderTCoord', publicAPI.replaceShaderTCoord);\n\n publicAPI.replaceShaderSelect = function (hash, pipeline, vertexInput) {\n if (hash.includes('sel')) {\n var fDesc = pipeline.getShaderDescription('fragment');\n var code = fDesc.getCode(); // by default there are no composites, so just 0\n\n code = vtkWebGPUShaderCache.substitute(code, '//VTK::Select::Impl', [' var compositeID: u32 = 0u;']).result;\n fDesc.setCode(code);\n }\n };\n\n model.shaderReplacements.set('replaceShaderSelect', publicAPI.replaceShaderSelect);\n\n publicAPI.getUsage = function (rep, i) {\n if (rep === Representation.POINTS || i === PrimitiveTypes.Points) {\n return BufferUsage.Verts;\n }\n\n if (i === PrimitiveTypes.Lines) {\n return BufferUsage.Lines;\n }\n\n if (rep === Representation.WIREFRAME) {\n if (i === PrimitiveTypes.Triangles) {\n return BufferUsage.LinesFromTriangles;\n }\n\n return BufferUsage.LinesFromStrips;\n }\n\n if (i === PrimitiveTypes.Triangles) {\n return BufferUsage.Triangles;\n }\n\n if (i === PrimitiveTypes.TriangleStrips) {\n return BufferUsage.Strips;\n }\n\n if (i === PrimitiveTypes.TriangleEdges) {\n return BufferUsage.LinesFromTriangles;\n } // only strip edges left which are lines\n\n\n return BufferUsage.LinesFromStrips;\n };\n\n publicAPI.getHashFromUsage = function (usage) {\n return \"pt\".concat(usage);\n };\n\n publicAPI.getTopologyFromUsage = function (usage) {\n switch (usage) {\n case BufferUsage.Triangles:\n return 'triangle-list';\n\n case BufferUsage.Verts:\n return 'point-list';\n\n case BufferUsage.Lines:\n default:\n return 'line-list';\n }\n }; // TODO: calculate tangents\n\n\n publicAPI.buildVertexInput = function () {\n var _model$renderable$get, _model$renderable;\n\n var pd = model.currentInput;\n var cells = model.cellArray;\n var primType = model.primitiveType;\n var actor = model.WebGPUActor.getRenderable();\n var representation = actor.getProperty().getRepresentation();\n var device = model.WebGPURenderWindow.getDevice();\n var edges = false;\n\n if (primType === PrimitiveTypes.TriangleEdges) {\n edges = true;\n representation = Representation.WIREFRAME;\n }\n\n var vertexInput = model.vertexInput;\n var points = pd.getPoints();\n var indexBuffer; // get the flat mapping indexBuffer for the cells\n\n if (cells) {\n var buffRequest = {\n hash: \"R\".concat(representation, \"P\").concat(primType).concat(cells.getMTime()),\n usage: BufferUsage.Index,\n cells: cells,\n numberOfPoints: points.getNumberOfPoints(),\n primitiveType: primType,\n representation: representation\n };\n indexBuffer = device.getBufferManager().getBuffer(buffRequest);\n vertexInput.setIndexBuffer(indexBuffer);\n } else {\n vertexInput.setIndexBuffer(null);\n } // hash = all things that can change the values on the buffer\n // since mtimes are unique we can use\n // - indexBuffer mtime - because cells drive how we pack\n // - relevant dataArray mtime - the source data\n // - shift - not currently captured\n // - scale - not currently captured\n // - format\n // - usage\n // - packExtra - covered by format\n // points\n\n\n if (points) {\n var shift = model.WebGPUActor.getBufferShift(model.WebGPURenderer);\n var _buffRequest = {\n hash: \"\".concat(points.getMTime(), \"I\").concat(indexBuffer.getMTime()).concat(shift.join(), \"float32x4\"),\n usage: BufferUsage.PointArray,\n format: 'float32x4',\n dataArray: points,\n indexBuffer: indexBuffer,\n shift: shift,\n packExtra: true\n };\n var buff = device.getBufferManager().getBuffer(_buffRequest);\n vertexInput.addBuffer(buff, ['vertexBC']);\n } else {\n vertexInput.removeBufferIfPresent('vertexBC');\n } // normals, only used for surface rendering\n\n\n var usage = publicAPI.getUsage(representation, primType);\n model._usesCellNormals = false;\n\n if (!model.is2D && ( // no lighting on Property2D\n usage === BufferUsage.Triangles || usage === BufferUsage.Strips)) {\n var normals = pd.getPointData().getNormals(); // https://vtk.org/doc/nightly/html/classvtkPolyDataTangents.html\n // Need to find some way of using precomputed tangents (or computing new ones)\n\n var _buffRequest2 = {\n format: 'snorm8x4',\n indexBuffer: indexBuffer,\n packExtra: true,\n shift: 0,\n scale: 127\n };\n\n if (normals) {\n _buffRequest2.hash = \"\".concat(normals.getMTime(), \"I\").concat(indexBuffer.getMTime(), \"snorm8x4\");\n _buffRequest2.dataArray = normals;\n _buffRequest2.usage = BufferUsage.PointArray;\n\n var _buff = device.getBufferManager().getBuffer(_buffRequest2);\n\n vertexInput.addBuffer(_buff, ['normalMC']);\n } else if (primType === PrimitiveTypes.Triangles) {\n model._usesCellNormals = true;\n _buffRequest2.hash = \"PFN\".concat(points.getMTime(), \"I\").concat(indexBuffer.getMTime(), \"snorm8x4\");\n _buffRequest2.dataArray = points;\n _buffRequest2.cells = cells;\n _buffRequest2.usage = BufferUsage.NormalsFromPoints;\n\n var _buff2 = device.getBufferManager().getBuffer(_buffRequest2);\n\n vertexInput.addBuffer(_buff2, ['normalMC']);\n } else {\n vertexInput.removeBufferIfPresent('normalMC');\n }\n } else {\n vertexInput.removeBufferIfPresent('normalMC');\n } // deal with colors but only if modified\n\n\n var haveColors = false;\n\n if (model.renderable.getScalarVisibility()) {\n var c = model.renderable.getColorMapColors();\n\n if (c && !edges) {\n var scalarMode = model.renderable.getScalarMode();\n var haveCellScalars = false; // We must figure out how the scalars should be mapped to the polydata.\n\n if ((scalarMode === ScalarMode.USE_CELL_DATA || scalarMode === ScalarMode.USE_CELL_FIELD_DATA || scalarMode === ScalarMode.USE_FIELD_DATA || !pd.getPointData().getScalars()) && scalarMode !== ScalarMode.USE_POINT_FIELD_DATA && c) {\n haveCellScalars = true;\n }\n\n var _buffRequest3 = {\n usage: BufferUsage.PointArray,\n format: 'unorm8x4',\n hash: \"\".concat(haveCellScalars).concat(c.getMTime(), \"I\").concat(indexBuffer.getMTime(), \"unorm8x4\"),\n dataArray: c,\n indexBuffer: indexBuffer,\n cellData: haveCellScalars,\n cellOffset: 0\n };\n\n var _buff3 = device.getBufferManager().getBuffer(_buffRequest3);\n\n vertexInput.addBuffer(_buff3, ['colorVI']);\n haveColors = true;\n }\n }\n\n if (!haveColors) {\n vertexInput.removeBufferIfPresent('colorVI');\n }\n\n var tcoords = null;\n\n if ((_model$renderable$get = (_model$renderable = model.renderable).getInterpolateScalarsBeforeMapping) !== null && _model$renderable$get !== void 0 && _model$renderable$get.call(_model$renderable) && model.renderable.getColorCoordinates()) {\n tcoords = model.renderable.getColorCoordinates();\n } else {\n tcoords = pd.getPointData().getTCoords();\n }\n\n if (tcoords && !edges) {\n var _buff4 = device.getBufferManager().getBufferForPointArray(tcoords, vertexInput.getIndexBuffer());\n\n vertexInput.addBuffer(_buff4, ['tcoord']);\n } else {\n vertexInput.removeBufferIfPresent('tcoord');\n }\n };\n\n publicAPI.updateTextures = function () {\n var _model$renderable$get2, _model$renderable2, _actor$getProperty$ge14, _actor$getProperty8, _actor$getProperty$ge15, _actor$getProperty9, _actor$getProperty$ge16, _actor$getProperty10, _actor$getProperty$ge17, _actor$getProperty11, _actor$getProperty$ge18, _actor$getProperty12, _actor$getProperty$ge19, _actor$getProperty13, _renderer$getEnvironm2;\n\n // we keep track of new and used textures so\n // that we can clean up any unused textures so we don't hold onto them\n var usedTextures = [];\n var newTextures = []; // do we have a scalar color texture\n\n var idata = (_model$renderable$get2 = (_model$renderable2 = model.renderable).getColorTextureMap) === null || _model$renderable$get2 === void 0 ? void 0 : _model$renderable$get2.call(_model$renderable2);\n\n if (idata) {\n if (!model.colorTexture) {\n model.colorTexture = vtkTexture.newInstance({\n label: 'polyDataColor'\n });\n }\n\n model.colorTexture.setInputData(idata);\n newTextures.push(['Diffuse', model.colorTexture]);\n } // actor textures?\n\n\n var actor = model.WebGPUActor.getRenderable();\n var renderer = model.WebGPURenderer.getRenderable(); // Reusing the old code for new and old textures, just loading in from properties instead of actor.getTextures()\n\n var textures = []; // Feels like there should be a better way than individually adding all\n\n if ((_actor$getProperty$ge14 = (_actor$getProperty8 = actor.getProperty()).getDiffuseTexture) !== null && _actor$getProperty$ge14 !== void 0 && _actor$getProperty$ge14.call(_actor$getProperty8)) {\n var pair = ['Diffuse', actor.getProperty().getDiffuseTexture()];\n textures.push(pair);\n }\n\n if (actor.getTextures()[0]) {\n var _pair = ['Diffuse', actor.getTextures()[0]];\n textures.push(_pair);\n }\n\n if (model.colorTexture) {\n var _pair2 = ['Diffuse', model.colorTexture];\n textures.push(_pair2);\n }\n\n if ((_actor$getProperty$ge15 = (_actor$getProperty9 = actor.getProperty()).getRoughnessTexture) !== null && _actor$getProperty$ge15 !== void 0 && _actor$getProperty$ge15.call(_actor$getProperty9)) {\n var _pair3 = ['Roughness', actor.getProperty().getRoughnessTexture()];\n textures.push(_pair3);\n }\n\n if ((_actor$getProperty$ge16 = (_actor$getProperty10 = actor.getProperty()).getMetallicTexture) !== null && _actor$getProperty$ge16 !== void 0 && _actor$getProperty$ge16.call(_actor$getProperty10)) {\n var _pair4 = ['Metallic', actor.getProperty().getMetallicTexture()];\n textures.push(_pair4);\n }\n\n if ((_actor$getProperty$ge17 = (_actor$getProperty11 = actor.getProperty()).getNormalTexture) !== null && _actor$getProperty$ge17 !== void 0 && _actor$getProperty$ge17.call(_actor$getProperty11)) {\n var _pair5 = ['Normal', actor.getProperty().getNormalTexture()];\n textures.push(_pair5);\n }\n\n if ((_actor$getProperty$ge18 = (_actor$getProperty12 = actor.getProperty()).getAmbientOcclusionTexture) !== null && _actor$getProperty$ge18 !== void 0 && _actor$getProperty$ge18.call(_actor$getProperty12)) {\n var _pair6 = ['AmbientOcclusion', actor.getProperty().getAmbientOcclusionTexture()];\n textures.push(_pair6);\n }\n\n if ((_actor$getProperty$ge19 = (_actor$getProperty13 = actor.getProperty()).getEmissionTexture) !== null && _actor$getProperty$ge19 !== void 0 && _actor$getProperty$ge19.call(_actor$getProperty13)) {\n var _pair7 = ['Emission', actor.getProperty().getEmissionTexture()];\n textures.push(_pair7);\n }\n\n if ((_renderer$getEnvironm2 = renderer.getEnvironmentTexture) !== null && _renderer$getEnvironm2 !== void 0 && _renderer$getEnvironm2.call(renderer)) {\n var _pair8 = ['Environment', renderer.getEnvironmentTexture()];\n textures.push(_pair8);\n }\n\n for (var i = 0; i < textures.length; i++) {\n if (textures[i][1].getInputData() || textures[i][1].getJsImageData() || textures[i][1].getCanvas()) {\n newTextures.push(textures[i]);\n }\n\n if (textures[i][1].getImage() && textures[i][1].getImageLoaded()) {\n newTextures.push(textures[i]);\n }\n }\n\n for (var _i = 0; _i < newTextures.length; _i++) {\n var srcTexture = newTextures[_i][1];\n var textureName = newTextures[_i][0];\n var newTex = model.device.getTextureManager().getTextureForVTKTexture(srcTexture); // Generates hash\n\n if (newTex.getReady()) {\n // is this a new texture\n var found = false;\n\n for (var t = 0; t < model.textures.length; t++) {\n if (model.textures[t] === newTex) {\n found = true;\n usedTextures[t] = true;\n }\n }\n\n if (!found) {\n usedTextures[model.textures.length] = true;\n var tview = newTex.createView(\"\".concat(textureName, \"Texture\"));\n model.textures.push(newTex);\n model.textureViews.push(tview);\n var interpolate = srcTexture.getInterpolate() ? 'linear' : 'nearest';\n var addressMode = null;\n if (!addressMode && srcTexture.getEdgeClamp() && srcTexture.getRepeat()) addressMode = 'mirror-repeat';\n if (!addressMode && srcTexture.getEdgeClamp()) addressMode = 'clamp-to-edge';\n if (!addressMode && srcTexture.getRepeat()) addressMode = 'repeat';\n\n if (textureName !== 'Environment') {\n tview.addSampler(model.device, {\n addressModeU: addressMode,\n addressModeV: addressMode,\n addressModeW: addressMode,\n minFilter: interpolate,\n magFilter: interpolate\n });\n } else {\n tview.addSampler(model.device, {\n addressModeU: 'repeat',\n addressModeV: 'clamp-to-edge',\n addressModeW: 'repeat',\n minFilter: interpolate,\n magFilter: interpolate,\n mipmapFilter: 'linear'\n });\n }\n }\n }\n } // remove unused textures\n\n\n for (var _i2 = model.textures.length - 1; _i2 >= 0; _i2--) {\n if (!usedTextures[_i2]) {\n model.textures.splice(_i2, 1);\n model.textureViews.splice(_i2, 1);\n }\n }\n }; // compute a unique hash for a pipeline, this needs to be unique enough to\n // capture any pipeline code changes (which includes shader changes)\n // or vertex input changes/ bind groups/ etc\n\n\n publicAPI.computePipelineHash = function () {\n var pipelineHash = \"pd\".concat(model.useRendererMatrix ? 'r' : '').concat(model.forceZValue ? 'z' : '');\n\n if (model.primitiveType === PrimitiveTypes.TriangleEdges || model.primitiveType === PrimitiveTypes.TriangleStripEdges) {\n pipelineHash += 'edge';\n } else {\n if (model.vertexInput.hasAttribute(\"normalMC\")) {\n pipelineHash += \"n\";\n }\n\n if (model.vertexInput.hasAttribute(\"colorVI\")) {\n pipelineHash += \"c\";\n }\n\n if (model.vertexInput.hasAttribute(\"tcoord\")) {\n var tcoords = model.vertexInput.getBuffer('tcoord');\n var numComp = vtkWebGPUTypes.getNumberOfComponentsFromBufferFormat(tcoords.getArrayInformation()[0].format);\n pipelineHash += \"t\".concat(numComp);\n }\n\n if (model.textures.length) {\n pipelineHash += \"tx\".concat(model.textures.length);\n }\n }\n\n if (model._usesCellNormals) {\n pipelineHash += \"cn\";\n }\n\n if (model.SSBO) {\n pipelineHash += \"ssbo\";\n }\n\n var uhash = publicAPI.getHashFromUsage(model.usage);\n pipelineHash += uhash;\n pipelineHash += model.renderEncoder.getPipelineHash();\n model.pipelineHash = pipelineHash;\n };\n\n publicAPI.updateBuffers = function () {\n // handle textures if not edges\n if (model.primitiveType !== PrimitiveTypes.TriangleEdges && model.primitiveType !== PrimitiveTypes.TriangleStripEdges) {\n publicAPI.updateTextures();\n }\n\n var actor = model.WebGPUActor.getRenderable();\n var rep = actor.getProperty().getRepresentation(); // handle per primitive type\n\n model.usage = publicAPI.getUsage(rep, model.primitiveType);\n publicAPI.buildVertexInput();\n var vbo = model.vertexInput.getBuffer('vertexBC');\n publicAPI.setNumberOfVertices(vbo.getSizeInBytes() / vbo.getStrideInBytes());\n publicAPI.setTopology(publicAPI.getTopologyFromUsage(model.usage));\n publicAPI.updateUBO();\n\n if (publicAPI.haveWideLines()) {\n var ppty = actor.getProperty();\n publicAPI.setNumberOfInstances(Math.ceil(ppty.getLineWidth() * 2.0));\n } else {\n publicAPI.setNumberOfInstances(1);\n }\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n is2D: false,\n cellArray: null,\n currentInput: null,\n cellOffset: 0,\n primitiveType: 0,\n colorTexture: null,\n renderEncoder: null,\n textures: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initiaLalues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initiaLalues); // Inheritance\n\n vtkWebGPUSimpleMapper.extend(publicAPI, model, initiaLalues);\n model.fragmentShaderTemplate = vtkWebGPUPolyDataFS;\n model.vertexShaderTemplate = vtkWebGPUPolyDataVS;\n model._tmpMat3 = mat3.identity(new Float64Array(9));\n model._tmpMat4 = mat4.identity(new Float64Array(16)); // UBO\n\n model.UBO = vtkWebGPUUniformBuffer.newInstance({\n label: 'mapperUBO'\n });\n model.UBO.addEntry('BCWCMatrix', 'mat4x4');\n model.UBO.addEntry('BCSCMatrix', 'mat4x4');\n model.UBO.addEntry('MCWCNormals', 'mat4x4');\n model.UBO.addEntry('AmbientColor', 'vec4');\n model.UBO.addEntry('DiffuseColor', 'vec4');\n model.UBO.addEntry('EdgeColor', 'vec4');\n model.UBO.addEntry('SpecularColor', 'vec4');\n model.UBO.addEntry('AmbientIntensity', 'f32');\n model.UBO.addEntry('DiffuseIntensity', 'f32');\n model.UBO.addEntry('Roughness', 'f32');\n model.UBO.addEntry('Metallic', 'f32');\n model.UBO.addEntry('Ambient', 'f32');\n model.UBO.addEntry('Normal', 'f32');\n model.UBO.addEntry('Emission', 'f32');\n model.UBO.addEntry('NormalStrength', 'f32');\n model.UBO.addEntry('BaseIOR', 'f32');\n model.UBO.addEntry('SpecularIntensity', 'f32');\n model.UBO.addEntry('LineWidth', 'f32');\n model.UBO.addEntry('Opacity', 'f32');\n model.UBO.addEntry('ZValue', 'f32');\n model.UBO.addEntry('PropID', 'u32');\n model.UBO.addEntry('ClipNear', 'f32');\n model.UBO.addEntry('ClipFar', 'f32');\n model.UBO.addEntry('Time', 'u32'); // Build VTK API\n\n setGet(publicAPI, model, ['cellArray', 'currentInput', 'cellOffset', 'is2D', 'primitiveType', 'renderEncoder']);\n model.textures = []; // Object methods\n\n vtkWebGPUCellArrayMapper(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend, 'vtkWebGPUCellArrayMapper'); // ----------------------------------------------------------------------------\n\nvar vtkWebGPUCellArrayMapper$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkWebGPUCellArrayMapper$1 as default, extend, newInstance };\n","import { newInstance as newInstance$1 } from '../../macros.js';\nimport vtkWebGPUBufferManager from './BufferManager.js';\nimport vtkWebGPUCellArrayMapper from './CellArrayMapper.js';\nimport vtkViewNode from '../SceneGraph/ViewNode.js';\nimport { registerOverride } from './ViewNodeFactory.js';\n\nvar PrimitiveTypes = vtkWebGPUBufferManager.PrimitiveTypes; // ----------------------------------------------------------------------------\n// vtkWebGPUPolyDataMapper methods\n// ----------------------------------------------------------------------------\n\nfunction vtkWebGPUPolyDataMapper(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkWebGPUPolyDataMapper');\n\n publicAPI.createCellArrayMapper = function () {\n return vtkWebGPUCellArrayMapper.newInstance();\n };\n\n publicAPI.buildPass = function (prepass) {\n if (prepass) {\n model.WebGPUActor = publicAPI.getFirstAncestorOfType('vtkWebGPUActor');\n\n if (!model.renderable.getStatic()) {\n model.renderable.update();\n }\n\n var poly = model.renderable.getInputData();\n model.renderable.mapScalars(poly, 1.0);\n publicAPI.updateCellArrayMappers(poly);\n }\n };\n\n publicAPI.updateCellArrayMappers = function (poly) {\n var prims = [poly.getVerts(), poly.getLines(), poly.getPolys(), poly.getStrips()]; // we instantiate a cell array mapper for each cellArray that has cells\n // and they handle the rendering of that cell array\n\n var cellMappers = [];\n var cellOffset = 0;\n\n for (var i = PrimitiveTypes.Points; i <= PrimitiveTypes.Triangles; i++) {\n if (prims[i].getNumberOfValues() > 0) {\n if (!model.primitives[i]) {\n model.primitives[i] = publicAPI.createCellArrayMapper();\n }\n\n var cellMapper = model.primitives[i];\n cellMapper.setCellArray(prims[i]);\n cellMapper.setCurrentInput(poly);\n cellMapper.setCellOffset(cellOffset);\n cellMapper.setPrimitiveType(i);\n cellMapper.setRenderable(model.renderable);\n cellOffset += prims[i].getNumberOfCells();\n cellMappers.push(cellMapper);\n } else {\n model.primitives[i] = null;\n }\n }\n\n if (model.WebGPUActor.getRenderable().getProperty().getEdgeVisibility()) {\n for (var _i = PrimitiveTypes.TriangleEdges; _i <= PrimitiveTypes.TriangleStripEdges; _i++) {\n if (prims[_i - 2].getNumberOfValues() > 0) {\n if (!model.primitives[_i]) {\n model.primitives[_i] = publicAPI.createCellArrayMapper();\n }\n\n var _cellMapper = model.primitives[_i];\n\n _cellMapper.setCellArray(prims[_i - 2]);\n\n _cellMapper.setCurrentInput(poly);\n\n _cellMapper.setCellOffset(model.primitives[_i - 2].getCellOffset());\n\n _cellMapper.setPrimitiveType(_i);\n\n _cellMapper.setRenderable(model.renderable);\n\n cellMappers.push(_cellMapper);\n } else {\n model.primitives[_i] = null;\n }\n }\n }\n\n publicAPI.prepareNodes();\n publicAPI.addMissingChildren(cellMappers);\n publicAPI.removeUnusedNodes();\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n primitives: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkViewNode.extend(publicAPI, model, initialValues);\n model.primitives = []; // Object methods\n\n vtkWebGPUPolyDataMapper(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend, 'vtkWebGPUPolyDataMapper'); // ----------------------------------------------------------------------------\n\nvar vtkWebGPUPolyDataMapper$1 = {\n newInstance: newInstance,\n extend: extend\n}; // Register ourself to WebGPU backend if imported\n\nregisterOverride('vtkMapper', newInstance);\n\nexport { vtkWebGPUPolyDataMapper$1 as default, extend, newInstance };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport { newInstance as newInstance$1 } from '../../macros.js';\nimport vtkWebGPUBufferManager from './BufferManager.js';\nimport vtkWebGPUCellArrayMapper from './CellArrayMapper.js';\nimport vtkViewNode from '../SceneGraph/ViewNode.js';\nimport { registerOverride } from './ViewNodeFactory.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nvar PrimitiveTypes = vtkWebGPUBufferManager.PrimitiveTypes; // ----------------------------------------------------------------------------\n// vtkWebGPUPolyDataMapper methods\n// ----------------------------------------------------------------------------\n\nfunction vtkWebGPUPolyDataMapper2D(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkWebGPUPolyDataMapper2D');\n\n publicAPI.createCellArrayMapper = function () {\n return vtkWebGPUCellArrayMapper.newInstance();\n };\n\n publicAPI.buildPass = function (prepass) {\n if (prepass) {\n model.WebGPUActor = publicAPI.getFirstAncestorOfType('vtkWebGPUActor2D');\n\n if (!model.renderable.getStatic()) {\n model.renderable.update();\n }\n\n var poly = model.renderable.getInputData();\n model.renderable.mapScalars(poly, 1.0);\n publicAPI.updateCellArrayMappers(poly);\n }\n };\n\n publicAPI.updateCellArrayMappers = function (poly) {\n var prims = [poly.getVerts(), poly.getLines(), poly.getPolys(), poly.getStrips()]; // we instantiate a cell array mapper for each cellArray that has cells\n // and they handle the rendering of that cell array\n\n var cellMappers = [];\n var cellOffset = 0;\n\n for (var i = PrimitiveTypes.Points; i <= PrimitiveTypes.Triangles; i++) {\n if (prims[i].getNumberOfValues() > 0) {\n if (!model.primitives[i]) {\n model.primitives[i] = publicAPI.createCellArrayMapper();\n }\n\n var cellMapper = model.primitives[i];\n cellMapper.setCellArray(prims[i]);\n cellMapper.setCurrentInput(poly);\n cellMapper.setCellOffset(cellOffset);\n cellMapper.setPrimitiveType(i);\n cellMapper.setRenderable(model.renderable);\n cellMapper.setIs2D(true);\n cellOffset += prims[i].getNumberOfCells();\n cellMappers.push(cellMapper);\n } else {\n model.primitives[i] = null;\n }\n }\n\n publicAPI.prepareNodes();\n publicAPI.addMissingChildren(cellMappers);\n publicAPI.removeUnusedNodes();\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nfunction defaultValues(initialValues) {\n return _objectSpread({\n primitives: []\n }, initialValues);\n} // ----------------------------------------------------------------------------\n\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, defaultValues(initialValues)); // Inheritance\n\n vtkViewNode.extend(publicAPI, model, initialValues);\n model.primitives = []; // Object methods\n\n vtkWebGPUPolyDataMapper2D(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend, 'vtkWebGPUPolyDataMapper2D'); // ----------------------------------------------------------------------------\n\nvar index = {\n newInstance: newInstance,\n extend: extend\n}; // Register ourself to WebGPU backend if imported\n\nregisterOverride('vtkMapper2D', newInstance);\n\nexport { index as default, extend, newInstance };\n","import { newInstance as newInstance$1 } from '../../macros.js';\nimport vtkScalarBarActor from '../Core/ScalarBarActor.js';\nimport vtkViewNode from '../SceneGraph/ViewNode.js';\nimport { registerOverride } from './ViewNodeFactory.js';\n\n// vtkWebGPUScalarBarActor methods\n// ----------------------------------------------------------------------------\n\nfunction vtkWebGPUScalarBarActor(publicAPI, model) {\n model.classHierarchy.push('vtkWebGPUScalarBarActor'); // Builds myself.\n\n publicAPI.buildPass = function (prepass) {\n if (prepass) {\n model.WebGPURenderer = publicAPI.getFirstAncestorOfType('vtkWebGPURenderer');\n model.WebGPURenderWindow = model.WebGPURenderer.getParent();\n\n if (!model.scalarBarActorHelper.getRenderable()) {\n model.scalarBarActorHelper.setRenderable(model.renderable);\n }\n\n publicAPI.prepareNodes();\n publicAPI.addMissingNode(model.scalarBarActorHelper.getBarActor());\n publicAPI.addMissingNode(model.scalarBarActorHelper.getTmActor());\n publicAPI.removeUnusedNodes();\n }\n };\n\n publicAPI.opaquePass = function (prepass, renderPass) {\n if (prepass) {\n var camera = model.WebGPURenderer ? model.WebGPURenderer.getRenderable().getActiveCamera() : null;\n var tsize = model.WebGPURenderer.getTiledSizeAndOrigin();\n model.scalarBarActorHelper.updateAPISpecificData([tsize.usize, tsize.vsize], camera, model.WebGPURenderWindow.getRenderable());\n }\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkViewNode.extend(publicAPI, model, initialValues);\n model.scalarBarActorHelper = vtkScalarBarActor.newScalarBarActorHelper(); // Object methods\n\n vtkWebGPUScalarBarActor(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend, 'vtkWebGPUScalarBarActor'); // ----------------------------------------------------------------------------\n\nvar index = {\n newInstance: newInstance,\n extend: extend\n}; // Register ourself to WebGPU backend if imported\n\nregisterOverride('vtkScalarBarActor', newInstance);\n\nexport { index as default, extend, newInstance };\n","import macro from '../../macros.js';\nimport vtkWebGPUSampler from './Sampler.js';\nimport vtkWebGPUTypes from './Types.js';\n\n// vtkWebGPUTextureView methods\n// ----------------------------------------------------------------------------\n\n/* eslint-disable no-bitwise */\n\nfunction vtkWebGPUTextureView(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkWebGPUTextureView');\n\n publicAPI.create = function (texture, options) {\n model.texture = texture;\n model.options = options;\n model.options.dimension = model.options.dimension || '2d';\n model.options.label = model.label;\n model.textureHandle = texture.getHandle();\n model.handle = model.textureHandle.createView(model.options);\n model.bindGroupLayoutEntry.texture.viewDimension = model.options.dimension;\n var tDetails = vtkWebGPUTypes.getDetailsFromTextureFormat(model.texture.getFormat());\n model.bindGroupLayoutEntry.texture.sampleType = tDetails.sampleType;\n };\n\n publicAPI.createFromTextureHandle = function (textureHandle, options) {\n model.texture = null;\n model.options = options;\n model.options.dimension = model.options.dimension || '2d';\n model.options.label = model.label;\n model.textureHandle = textureHandle;\n model.handle = model.textureHandle.createView(model.options);\n model.bindGroupLayoutEntry.texture.viewDimension = model.options.dimension;\n var tDetails = vtkWebGPUTypes.getDetailsFromTextureFormat(options.format);\n model.bindGroupLayoutEntry.texture.sampleType = tDetails.sampleType;\n model.bindGroupTime.modified();\n };\n\n publicAPI.getBindGroupEntry = function () {\n var foo = {\n resource: publicAPI.getHandle()\n };\n return foo;\n };\n\n publicAPI.getShaderCode = function (binding, group) {\n var ttype = 'f32';\n\n if (model.bindGroupLayoutEntry.texture.sampleType === 'sint') {\n ttype = 'i32';\n } else if (model.bindGroupLayoutEntry.texture.sampleType === 'uint') {\n ttype = 'u32';\n }\n\n var result = \"@binding(\".concat(binding, \") @group(\").concat(group, \") var \").concat(model.label, \": texture_\").concat(model.options.dimension, \"<\").concat(ttype, \">;\");\n\n if (model.bindGroupLayoutEntry.texture.sampleType === 'depth') {\n result = \"@binding(\".concat(binding, \") @group(\").concat(group, \") var \").concat(model.label, \": texture_depth_\").concat(model.options.dimension, \";\");\n }\n\n return result;\n };\n\n publicAPI.addSampler = function (device, options) {\n var newSamp = vtkWebGPUSampler.newInstance({\n label: \"\".concat(model.label, \"Sampler\")\n });\n newSamp.create(device, options);\n publicAPI.setSampler(newSamp);\n };\n\n publicAPI.getBindGroupTime = function () {\n // check if the handle changed\n if (model.texture && model.texture.getHandle() !== model.textureHandle) {\n model.textureHandle = model.texture.getHandle();\n model.handle = model.textureHandle.createView(model.options);\n model.bindGroupTime.modified();\n }\n\n return model.bindGroupTime;\n }; // if the texture has changed then get a new view\n\n\n publicAPI.getHandle = function () {\n if (model.texture && model.texture.getHandle() !== model.textureHandle) {\n model.textureHandle = model.texture.getHandle();\n model.handle = model.textureHandle.createView(model.options);\n model.bindGroupTime.modified();\n }\n\n return model.handle;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n texture: null,\n handle: null,\n sampler: null,\n label: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Object methods\n\n macro.obj(publicAPI, model);\n model.bindGroupLayoutEntry = {\n /* eslint-disable no-undef */\n visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT,\n\n /* eslint-enable no-undef */\n texture: {\n sampleType: 'float',\n viewDimension: '2d' // multisampled: false,\n\n }\n };\n model.bindGroupTime = {};\n macro.obj(model.bindGroupTime, {\n mtime: 0\n });\n macro.get(publicAPI, model, ['bindGroupTime', 'texture']);\n macro.setGet(publicAPI, model, ['bindGroupLayoutEntry', 'label', 'sampler']);\n vtkWebGPUTextureView(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend); // ----------------------------------------------------------------------------\n\nvar vtkWebGPUTextureView$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkWebGPUTextureView$1 as default, extend, newInstance };\n","import macro from '../../macros.js';\nimport HalfFloat from '../../Common/Core/HalfFloat.js';\nimport vtkWebGPUBufferManager from './BufferManager.js';\nimport vtkWebGPUTextureView from './TextureView.js';\nimport vtkWebGPUTypes from './Types.js';\nimport vtkTexture from '../Core/Texture.js';\n\nvar BufferUsage = vtkWebGPUBufferManager.BufferUsage; // ----------------------------------------------------------------------------\n// Global methods\n// ----------------------------------------------------------------------------\n// ----------------------------------------------------------------------------\n// vtkWebGPUTexture methods\n// ----------------------------------------------------------------------------\n\nfunction vtkWebGPUTexture(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkWebGPUTexture');\n\n publicAPI.create = function (device, options) {\n model.device = device;\n model.width = options.width;\n model.height = options.height;\n model.depth = options.depth ? options.depth : 1;\n var dimension = model.depth === 1 ? '2d' : '3d';\n model.format = options.format ? options.format : 'rgba8unorm';\n model.mipLevel = options.mipLevel ? options.mipLevel : 0;\n /* eslint-disable no-undef */\n\n /* eslint-disable no-bitwise */\n\n model.usage = options.usage ? options.usage : GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST;\n /* eslint-enable no-undef */\n\n /* eslint-enable no-bitwise */\n\n model.handle = model.device.getHandle().createTexture({\n size: [model.width, model.height, model.depth],\n format: model.format,\n // 'rgba8unorm',\n usage: model.usage,\n label: model.label,\n dimension: dimension,\n mipLevelCount: model.mipLevel + 1\n });\n };\n\n publicAPI.assignFromHandle = function (device, handle, options) {\n model.device = device;\n model.handle = handle;\n model.width = options.width;\n model.height = options.height;\n model.depth = options.depth ? options.depth : 1;\n model.format = options.format ? options.format : 'rgba8unorm';\n /* eslint-disable no-undef */\n\n /* eslint-disable no-bitwise */\n\n model.usage = options.usage ? options.usage : GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST;\n /* eslint-enable no-undef */\n\n /* eslint-enable no-bitwise */\n };\n\n publicAPI.writeImageData = function (req) {\n var nativeArray = [];\n\n if (req.canvas) {\n model.device.getHandle().queue.copyExternalImageToTexture({\n source: req.canvas,\n flipY: req.flip\n }, {\n texture: model.handle,\n premultipliedAlpha: true\n }, [model.width, model.height, model.depth]);\n model.ready = true;\n return;\n }\n\n if (req.jsImageData && !req.nativeArray) {\n req.width = req.jsImageData.width;\n req.height = req.jsImageData.height;\n req.depth = 1;\n req.format = 'rgba8unorm';\n req.flip = true;\n req.nativeArray = req.jsImageData.data;\n }\n\n var tDetails = vtkWebGPUTypes.getDetailsFromTextureFormat(model.format);\n var bufferBytesPerRow = model.width * tDetails.stride;\n\n var fixAll = function fixAll(arr, height, depth) {\n // bytesPerRow must be a multiple of 256 so we might need to rebuild\n // the data here before passing to the buffer. e.g. if it is unorm8x4 then\n // we need to have width be a multiple of 64\n var inWidthInBytes = arr.length / (height * depth) * arr.BYTES_PER_ELEMENT; // is this a half float texture?\n\n var halfFloat = tDetails.elementSize === 2 && tDetails.sampleType === 'float'; // if we need to copy the data\n\n if (halfFloat || inWidthInBytes % 256) {\n var inArray = arr;\n var inWidth = inWidthInBytes / inArray.BYTES_PER_ELEMENT;\n var outBytesPerElement = tDetails.elementSize;\n var outWidthInBytes = 256 * Math.floor((inWidth * outBytesPerElement + 255) / 256);\n var outWidth = outWidthInBytes / outBytesPerElement;\n var outArray = macro.newTypedArray(halfFloat ? 'Uint16Array' : inArray.constructor.name, outWidth * height * depth);\n\n for (var v = 0; v < height * depth; v++) {\n if (halfFloat) {\n for (var i = 0; i < inWidth; i++) {\n outArray[v * outWidth + i] = HalfFloat.toHalf(inArray[v * inWidth + i]);\n }\n } else {\n outArray.set(inArray.subarray(v * inWidth, (v + 1) * inWidth), v * outWidth);\n }\n }\n\n return [outArray, outWidthInBytes];\n }\n\n return [arr, inWidthInBytes];\n };\n\n if (req.nativeArray) {\n nativeArray = req.nativeArray;\n }\n\n if (req.image) {\n var canvas = document.createElement('canvas');\n canvas.width = req.image.width;\n canvas.height = req.image.height;\n var ctx = canvas.getContext('2d');\n ctx.translate(0, canvas.height);\n ctx.scale(1, -1);\n ctx.drawImage(req.image, 0, 0, req.image.width, req.image.height, 0, 0, canvas.width, canvas.height);\n var imageData = ctx.getImageData(0, 0, req.image.width, req.image.height);\n nativeArray = imageData.data;\n }\n\n var cmdEnc = model.device.createCommandEncoder();\n\n if (publicAPI.getDimensionality() !== 3) {\n // Non-3D, supports mipmaps\n var mips = vtkTexture.generateMipmaps(nativeArray, model.width, model.height, model.mipLevel);\n var currentWidth = model.width;\n var currentHeight = model.height;\n\n for (var m = 0; m <= model.mipLevel; m++) {\n var fix = fixAll(mips[m], currentHeight, 1);\n bufferBytesPerRow = fix[1];\n var buffRequest = {\n dataArray: req.dataArray ? req.dataArray : null,\n nativeArray: fix[0],\n\n /* eslint-disable no-undef */\n usage: BufferUsage.Texture\n /* eslint-enable no-undef */\n\n };\n var buff = model.device.getBufferManager().getBuffer(buffRequest);\n cmdEnc.copyBufferToTexture({\n buffer: buff.getHandle(),\n offset: 0,\n bytesPerRow: bufferBytesPerRow,\n rowsPerImage: currentHeight\n }, {\n texture: model.handle,\n mipLevel: m\n }, [currentWidth, currentHeight, 1]);\n currentWidth /= 2;\n currentHeight /= 2;\n }\n\n model.device.submitCommandEncoder(cmdEnc);\n model.ready = true;\n } else {\n // 3D, no mipmaps\n var _fix = fixAll(nativeArray, model.height, model.depth);\n\n bufferBytesPerRow = _fix[1];\n var _buffRequest = {\n dataArray: req.dataArray ? req.dataArray : null,\n\n /* eslint-disable no-undef */\n usage: BufferUsage.Texture\n /* eslint-enable no-undef */\n\n };\n _buffRequest.nativeArray = _fix[0];\n\n var _buff = model.device.getBufferManager().getBuffer(_buffRequest);\n\n cmdEnc.copyBufferToTexture({\n buffer: _buff.getHandle(),\n offset: 0,\n bytesPerRow: bufferBytesPerRow,\n rowsPerImage: model.height\n }, {\n texture: model.handle\n }, [model.width, model.height, model.depth]);\n model.device.submitCommandEncoder(cmdEnc);\n model.ready = true;\n }\n }; // when data is pulled out of this texture what scale must be applied to\n // get back to the original source data. For formats such as r8unorm we\n // have to multiply by 255.0, for formats such as r16float it is 1.0\n\n\n publicAPI.getScale = function () {\n var tDetails = vtkWebGPUTypes.getDetailsFromTextureFormat(model.format);\n var halfFloat = tDetails.elementSize === 2 && tDetails.sampleType === 'float';\n return halfFloat ? 1.0 : 255.0;\n };\n\n publicAPI.getNumberOfComponents = function () {\n var tDetails = vtkWebGPUTypes.getDetailsFromTextureFormat(model.format);\n return tDetails.numComponents;\n };\n\n publicAPI.getDimensionality = function () {\n var dims = 0;\n if (model.width > 1) dims++;\n if (model.height > 1) dims++;\n if (model.depth > 1) dims++;\n return dims;\n };\n\n publicAPI.resizeToMatch = function (tex) {\n if (tex.getWidth() !== model.width || tex.getHeight() !== model.height || tex.getDepth() !== model.depth) {\n model.width = tex.getWidth();\n model.height = tex.getHeight();\n model.depth = tex.getDepth();\n model.handle = model.device.getHandle().createTexture({\n size: [model.width, model.height, model.depth],\n format: model.format,\n usage: model.usage,\n label: model.label\n });\n }\n };\n\n publicAPI.resize = function (width, height) {\n var depth = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;\n\n if (width !== model.width || height !== model.height || depth !== model.depth) {\n model.width = width;\n model.height = height;\n model.depth = depth;\n model.handle = model.device.getHandle().createTexture({\n size: [model.width, model.height, model.depth],\n format: model.format,\n usage: model.usage,\n label: model.label\n });\n }\n };\n\n publicAPI.createView = function (label) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n // if options is missing values try to add them in\n if (!options.dimension) {\n options.dimension = model.depth === 1 ? '2d' : '3d';\n }\n\n var view = vtkWebGPUTextureView.newInstance({\n label: label\n });\n view.create(publicAPI, options);\n return view;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n device: null,\n handle: null,\n buffer: null,\n ready: false,\n label: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Object methods\n\n macro.obj(publicAPI, model);\n macro.get(publicAPI, model, ['handle', 'ready', 'width', 'height', 'depth', 'format', 'usage']);\n macro.setGet(publicAPI, model, ['device', 'label']);\n vtkWebGPUTexture(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend); // ----------------------------------------------------------------------------\n\nvar vtkWebGPUTexture$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkWebGPUTexture$1 as default, extend, newInstance };\n","import { Point3, ContourData, IContour } from '../../types';\nimport { ContourType } from '../../enums';\n\ntype ContourProps = {\n id: string;\n data: ContourData;\n color: Point3;\n segmentIndex: number;\n};\n\n/**\n * The `Contour` class implements the `IContour` interface and represents a contour in 3D space.\n * It holds information about the contour's id, size in bytes, points, color, and type.\n * The class also provides methods to retrieve the points, color, and type of the contour.\n * Each Contour is part of a ContourSet, and each ContourSet is part of a Geometry.\n */\nexport class Contour implements IContour {\n readonly id: string;\n readonly sizeInBytes: number;\n points: Point3[];\n color: Point3;\n type: ContourType;\n segmentIndex: number;\n\n constructor(props: ContourProps) {\n const { points, type } = props.data;\n this.id = props.id;\n this.points = points;\n this.type = type;\n this.color = props.color;\n this.segmentIndex = props.segmentIndex;\n\n this.sizeInBytes = this._getSizeInBytes();\n }\n\n _getSizeInBytes(): number {\n let sizeInBytes = 0;\n\n // Assuming each point is 1 byte\n sizeInBytes += this.points.length * 3;\n return sizeInBytes;\n }\n\n /**\n * It returns the value of the points property of the data object\n * @returns The points property of the data object.\n */\n public getPoints(): Point3[] {\n return this.points;\n }\n\n public getFlatPointsArray(): number[] {\n return this.points.map((point) => [...point]).flat();\n }\n\n /**\n * This function returns the color of the contour\n * @returns The color of the contour\n */\n public getColor(): Point3 {\n return this.color;\n }\n\n /**\n * It returns the type of the contour, closed or open\n * @returns The type of the contour.\n */\n public getType(): ContourType {\n return this.type;\n }\n}\n\nexport default Contour;\n","import vtkPolyData from '@kitware/vtk.js/Common/DataModel/PolyData';\nimport { Point3, IContourSet, IContour, ContourData } from '../../types';\nimport Contour from './Contour';\n\ntype ContourSetProps = {\n id: string;\n data: ContourData[];\n frameOfReferenceUID: string;\n segmentIndex: number;\n color?: Point3;\n};\n\n/**\n * This class represents a set of contours in 3d space.\n * Usually contours are grouped together in a contour set to represent a meaningful shape.\n */\nexport class ContourSet implements IContourSet {\n readonly id: string;\n readonly sizeInBytes: number;\n readonly frameOfReferenceUID: string;\n private color: Point3 = [200, 0, 0]; // default color\n private segmentIndex: number;\n private polyData: vtkPolyData;\n private centroid: Point3;\n contours: IContour[];\n\n constructor(props: ContourSetProps) {\n this.id = props.id;\n this.contours = [];\n this.color = props.color ?? this.color;\n this.frameOfReferenceUID = props.frameOfReferenceUID;\n this.segmentIndex = props.segmentIndex;\n this._createEachContour(props.data);\n this.sizeInBytes = this._getSizeInBytes();\n }\n\n _createEachContour(contourDataArray: ContourData[]): void {\n contourDataArray.forEach((contourData) => {\n const { points, type, color } = contourData;\n\n const contour = new Contour({\n id: `${this.id}-segment-${this.segmentIndex}`,\n data: {\n points,\n type,\n segmentIndex: this.segmentIndex,\n color: color ?? this.color,\n },\n segmentIndex: this.segmentIndex,\n color: color ?? this.color,\n });\n\n this.contours.push(contour);\n });\n\n this._updateContourSetCentroid();\n }\n\n // Todo: this centroid calculation has limitation in which\n // it will not work for MPR, the reason is that we are finding\n // the centroid of all points but at the end we are picking the\n // closest point to the centroid, which will not work for MPR\n // The reason for picking the closest is a rendering issue since\n // the centroid can be not exactly in the middle of the slice\n // and it might cause the contour to be rendered in the wrong slice\n // or not rendered at all\n _updateContourSetCentroid(): void {\n const numberOfPoints = this.getTotalNumberOfPoints();\n const flatPointsArray = this.getFlatPointsArray();\n\n const sumOfPoints = flatPointsArray.reduce(\n (acc, point) => {\n return [acc[0] + point[0], acc[1] + point[1], acc[2] + point[2]];\n },\n [0, 0, 0]\n );\n\n const centroid = [\n sumOfPoints[0] / numberOfPoints,\n sumOfPoints[1] / numberOfPoints,\n sumOfPoints[2] / numberOfPoints,\n ];\n\n const closestPoint = flatPointsArray.reduce((closestPoint, point) => {\n const distanceToPoint = this._getDistance(centroid, point);\n const distanceToClosestPoint = this._getDistance(centroid, closestPoint);\n\n if (distanceToPoint < distanceToClosestPoint) {\n return point;\n } else {\n return closestPoint;\n }\n }, flatPointsArray[0]);\n\n this.centroid = closestPoint;\n }\n\n _getSizeInBytes(): number {\n return this.contours.reduce((sizeInBytes, contour) => {\n return sizeInBytes + contour.sizeInBytes;\n }, 0);\n }\n\n public getCentroid(): Point3 {\n return this.centroid;\n }\n\n public getSegmentIndex(): number {\n return this.segmentIndex;\n }\n\n public getColor(): Point3 {\n // Currently, all contours in a contour set have the same color.\n // This may change in the future.\n return this.color;\n }\n\n /**\n * This function returns the contours of the image\n * @returns The contours of the image.\n */\n public getContours(): IContour[] {\n return this.contours;\n }\n\n public getSizeInBytes(): number {\n return this.sizeInBytes;\n }\n\n /**\n * It returns an array of all the points in the glyph\n * @returns An array of points.\n */\n public getFlatPointsArray(): Point3[] {\n return this.contours.map((contour) => contour.getPoints()).flat();\n }\n\n /**\n * This function returns the number of contours in the current shape.\n * @returns The number of contours in the glyph.\n */\n public getNumberOfContours(): number {\n return this.contours.length;\n }\n\n /**\n * It loops through each contour in the `contours` array, and adds the number of\n * points in each contour to the `numberOfPoints` variable\n * @returns The number of points in the contours.\n */\n public getTotalNumberOfPoints(): number {\n return this.contours.reduce((numberOfPoints, contour) => {\n return numberOfPoints + contour.getPoints().length;\n }, 0);\n }\n\n /**\n * It returns an array of the number of points in each contour.\n * @returns An array of numbers.\n */\n public getNumberOfPointsArray(): number[] {\n return this.contours.reduce((acc, _, i) => {\n acc[i] = this.getNumberOfPointsInAContour(i);\n return acc;\n }, []);\n }\n\n /**\n * It returns the points in a contour.\n * @param contourIndex - The index of the contour you want to get the\n * points from.\n * @returns An array of Point3 objects.\n */\n public getPointsInContour(contourIndex: number): Point3[] {\n return this.contours[contourIndex].getPoints();\n }\n /**\n * \"This function returns the number of points in a contour.\"\n *\n * @param contourIndex - The index of the contour you want to get the\n * number of points from.\n * @returns The number of points in the contour.\n */\n public getNumberOfPointsInAContour(contourIndex: number): number {\n return this.getPointsInContour(contourIndex).length;\n }\n\n private _getDistance(pointA, pointB) {\n return Math.sqrt(\n (pointA[0] - pointB[0]) ** 2 +\n (pointA[1] - pointB[1]) ** 2 +\n (pointA[2] - pointB[2]) ** 2\n );\n }\n /**\n public convertToClosedSurface(): ClosedSurface {\n const flatPointsArray = this.getFlatPointsArray();\n const numPointsArray = this.getNumberOfPointsArray();\n\n const closedSurfaceData = polySeg.convertToClosedSurface(\n flatPointsArray,\n numPointsArray\n );\n\n const closedSurface = new ClosedSurface({\n id: this.id,\n data: closedSurfaceData,\n color: this.color,\n });\n\n // cache the closed surface\n return closedSurface;\n }\n */\n}\n\nexport default Contour;\n","import '@kitware/vtk.js/Rendering/Profiles/Geometry';\n\nimport cache from '../cache';\nimport { ContourSet } from '../cache/classes/ContourSet';\nimport { GeometryType } from '../enums';\nimport { IGeometry, PublicContourSetData } from '../types';\n\ntype GeometryOptions = {\n type: GeometryType;\n geometryData: PublicContourSetData; // | PublicClosedSurfaceData, ...\n};\n\n/**\n * Todo: currently we are not targeting loading geometry from a file.\n * This is a placeholder for future work. For instance, separate loaders\n * for .vti, .vtk, .obj, .dat etc. can be created and registered here.\n */\n\n/**\n * It creates a geometry object and caches it\n * @param geometryId - A unique identifier for the geometry.\n * @param options - GeometryOptions\n * @returns A promise that resolves to a geometry object.\n */\nasync function createAndCacheGeometry(\n geometryId: string,\n options: GeometryOptions\n): Promise {\n let geometry = cache.getGeometry(geometryId);\n\n if (geometry) {\n return geometry;\n }\n\n if (options.type === GeometryType.CONTOUR) {\n geometry = _createContourSet(geometryId, options.geometryData);\n } else {\n throw new Error('Unknown geometry type, Only CONTOUR is supported');\n }\n\n const geometryLoadObject = {\n promise: Promise.resolve(geometry),\n };\n\n await cache.putGeometryLoadObject(geometryId, geometryLoadObject);\n\n return geometry;\n}\n\n// Todo: this should be moved\nfunction _createContourSet(\n geometryId: string,\n contourSetData: PublicContourSetData\n) {\n // validate the data to make sure it is a valid contour set\n if (!contourSetData || contourSetData.data.length === 0) {\n throw new Error(\n 'Invalid contour set data, see publicContourSetData type for more info'\n );\n }\n\n // make sure it each has id, and each has data of type Point3[]\n if (!contourSetData.id) {\n throw new Error(\n 'Invalid contour set data, each contour set must have an id'\n );\n }\n\n if (!contourSetData.data || !Array.isArray(contourSetData.data)) {\n throw new Error(\n 'Invalid contour set data, each contour set must have an array of contours'\n );\n }\n\n contourSetData.data.forEach((contourData) => {\n if (!contourData.points || !Array.isArray(contourData.points)) {\n throw new Error(\n 'Invalid contour set data, each contour must have an array of points'\n );\n }\n\n contourData.points.forEach((point) => {\n if (!point || !Array.isArray(point) || point.length !== 3) {\n throw new Error(\n 'Invalid contour set data, each point must be an array of length 3'\n );\n }\n });\n });\n\n const contourSet = new ContourSet({\n id: contourSetData.id,\n data: contourSetData.data,\n color: contourSetData.color,\n frameOfReferenceUID: contourSetData.frameOfReferenceUID,\n segmentIndex: contourSetData.segmentIndex,\n });\n\n const geometry: IGeometry = {\n id: geometryId,\n type: GeometryType.CONTOUR,\n data: contourSet,\n sizeInBytes: contourSet.getSizeInBytes(),\n };\n\n return geometry;\n}\n\nexport { createAndCacheGeometry };\n","import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';\nimport _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport macro from '../../macros.js';\nimport vtkDataArray from './DataArray.js';\nimport { VtkDataTypes } from './DataArray/Constants.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n// Global methods\n// ----------------------------------------------------------------------------\n\nfunction extractCellSizes(cellArray) {\n var currentIdx = 0;\n return cellArray.filter(function (value, index) {\n if (index === currentIdx) {\n currentIdx += value + 1;\n return true;\n }\n\n return false;\n });\n}\n\nfunction getNumberOfCells(cellArray) {\n var cellId = 0;\n\n for (var cellArrayIndex = 0; cellArrayIndex < cellArray.length;) {\n cellArrayIndex += cellArray[cellArrayIndex] + 1;\n cellId++;\n }\n\n return cellId;\n} // ----------------------------------------------------------------------------\n// Static API\n// ----------------------------------------------------------------------------\n\n\nvar STATIC = {\n extractCellSizes: extractCellSizes,\n getNumberOfCells: getNumberOfCells\n}; // ----------------------------------------------------------------------------\n// vtkCellArray methods\n// ----------------------------------------------------------------------------\n\nfunction vtkCellArray(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkCellArray');\n\n var superClass = _objectSpread({}, publicAPI);\n\n publicAPI.getNumberOfCells = function (recompute) {\n if (model.numberOfCells !== undefined && !recompute) {\n return model.numberOfCells;\n }\n\n if (model.cellSizes) {\n model.numberOfCells = model.cellSizes.length;\n } else {\n model.numberOfCells = getNumberOfCells(publicAPI.getData());\n }\n\n return model.numberOfCells;\n };\n\n publicAPI.getCellSizes = function (recompute) {\n if (model.cellSizes !== undefined && !recompute) {\n return model.cellSizes;\n }\n\n model.cellSizes = extractCellSizes(publicAPI.getData());\n return model.cellSizes;\n };\n /**\n * When `resize()` is being used, you then MUST use `insertNextCell()`.\n */\n\n\n publicAPI.resize = function (requestedNumTuples) {\n var oldNumTuples = publicAPI.getNumberOfTuples();\n superClass.resize(requestedNumTuples);\n var newNumTuples = publicAPI.getNumberOfTuples();\n\n if (newNumTuples < oldNumTuples) {\n if (newNumTuples === 0) {\n model.numberOfCells = 0;\n model.cellSizes = [];\n } else {\n // We do not know how many cells are left.\n // Set to undefined to ensure insertNextCell works correctly.\n model.numberOfCells = undefined;\n model.cellSizes = undefined;\n }\n }\n };\n\n publicAPI.setData = function (typedArray) {\n superClass.setData(typedArray, 1);\n model.numberOfCells = undefined;\n model.cellSizes = undefined;\n };\n\n publicAPI.getCell = function (loc) {\n var cellLoc = loc;\n var numberOfPoints = model.values[cellLoc++];\n return model.values.subarray(cellLoc, cellLoc + numberOfPoints);\n };\n\n publicAPI.insertNextCell = function (cellPointIds) {\n var cellId = publicAPI.getNumberOfCells();\n publicAPI.insertNextTuples([cellPointIds.length].concat(_toConsumableArray(cellPointIds))); // By computing the number of cells earlier, we made sure that numberOfCells is defined\n\n ++model.numberOfCells;\n\n if (model.cellSizes != null) {\n model.cellSizes.push(cellPointIds.length);\n }\n\n return cellId;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nfunction defaultValues(initialValues) {\n return _objectSpread({\n empty: true,\n numberOfComponents: 1,\n dataType: VtkDataTypes.UNSIGNED_INT\n }, initialValues);\n} // ----------------------------------------------------------------------------\n\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n vtkDataArray.extend(publicAPI, model, defaultValues(initialValues));\n vtkCellArray(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkCellArray'); // ----------------------------------------------------------------------------\n\nvar vtkCellArray$1 = _objectSpread({\n newInstance: newInstance,\n extend: extend\n}, STATIC);\n\nexport { STATIC, vtkCellArray$1 as default, extend, newInstance };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport Constants from './DataArray/Constants.js';\nimport { newInstance as newInstance$1, newTypedArray, newTypedArrayFrom, obj, set, vtkErrorMacro as vtkErrorMacro$1 } from '../../macros.js';\nimport { n as norm } from './Math/index.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nvar vtkErrorMacro = vtkErrorMacro$1;\nvar DefaultDataType = Constants.DefaultDataType; // ----------------------------------------------------------------------------\n// Global methods\n// ----------------------------------------------------------------------------\n// Original source from https://www.npmjs.com/package/compute-range\n// Modified to accept type arrays\n\nfunction fastComputeRange(arr, offset, numberOfComponents) {\n var len = arr.length;\n var min;\n var max;\n var x;\n var i;\n\n if (len === 0) {\n return {\n min: Number.MAX_VALUE,\n max: -Number.MAX_VALUE\n };\n }\n\n min = arr[offset];\n max = min;\n\n for (i = offset; i < len; i += numberOfComponents) {\n x = arr[i];\n\n if (x < min) {\n min = x;\n } else if (x > max) {\n max = x;\n }\n }\n\n return {\n min: min,\n max: max\n };\n}\n/**\n * @deprecated please use fastComputeRange instead\n */\n\n\nfunction createRangeHelper() {\n var min = Number.MAX_VALUE;\n var max = -Number.MAX_VALUE;\n var count = 0;\n var sum = 0;\n return {\n add: function add(value) {\n if (min > value) {\n min = value;\n }\n\n if (max < value) {\n max = value;\n }\n\n count++;\n sum += value;\n },\n get: function get() {\n return {\n min: min,\n max: max,\n count: count,\n sum: sum,\n mean: sum / count\n };\n },\n getRange: function getRange() {\n return {\n min: min,\n max: max\n };\n }\n };\n}\n\nfunction computeRange(values) {\n var component = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var numberOfComponents = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;\n\n if (component < 0 && numberOfComponents > 1) {\n // Compute magnitude\n var size = values.length;\n var numberOfValues = size / numberOfComponents;\n var data = new Float64Array(numberOfValues);\n\n for (var i = 0, j = 0; i < numberOfValues; ++i) {\n var _i;\n\n for (var nextJ = j + numberOfComponents; j < nextJ; ++j) {\n data[i] += values[j] * values[j];\n }\n\n _i = i, data[_i] = Math.pow(data[_i], 0.5);\n }\n\n return fastComputeRange(data, 0, 1);\n }\n\n return fastComputeRange(values, component < 0 ? 0 : component, numberOfComponents);\n}\n\nfunction ensureRangeSize(rangeArray) {\n var size = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var ranges = rangeArray || []; // Pad ranges with null value to get the\n\n while (ranges.length <= size) {\n ranges.push(null);\n }\n\n return ranges;\n}\n\nfunction getDataType(typedArray) {\n // Expects toString() to return \"[object ...Array]\"\n return Object.prototype.toString.call(typedArray).slice(8, -1);\n}\n\nfunction getMaxNorm(normArray) {\n var numComps = normArray.getNumberOfComponents();\n var maxNorm = 0.0;\n var tuple = new Array(numComps);\n\n for (var i = 0; i < normArray.getNumberOfTuples(); ++i) {\n normArray.getTuple(i, tuple);\n var norm$1 = norm(tuple, numComps);\n\n if (norm$1 > maxNorm) {\n maxNorm = norm$1;\n }\n }\n\n return maxNorm;\n} // ----------------------------------------------------------------------------\n// Static API\n// ----------------------------------------------------------------------------\n\n\nvar STATIC = {\n computeRange: computeRange,\n createRangeHelper: createRangeHelper,\n fastComputeRange: fastComputeRange,\n getDataType: getDataType,\n getMaxNorm: getMaxNorm\n}; // ----------------------------------------------------------------------------\n// vtkDataArray methods\n// ----------------------------------------------------------------------------\n\nfunction vtkDataArray(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkDataArray');\n /**\n * Resize model.values and copy the old values to the new array.\n * @param {Number} requestedNumTuples Final expected number of tuples; must be >= 0\n * @returns {Boolean} True if a resize occured, false otherwise\n */\n\n function resize(requestedNumTuples) {\n if (requestedNumTuples < 0) {\n return false;\n }\n\n var numComps = publicAPI.getNumberOfComponents();\n var curNumTuples = model.values.length / (numComps > 0 ? numComps : 1);\n\n if (requestedNumTuples === curNumTuples) {\n return true;\n }\n\n if (requestedNumTuples > curNumTuples) {\n // Requested size is bigger than current size. Allocate enough\n // memory to fit the requested size and be more than double the\n // currently allocated memory.\n var oldValues = model.values;\n model.values = newTypedArray(model.dataType, (requestedNumTuples + curNumTuples) * numComps);\n model.values.set(oldValues);\n return true;\n } // Requested size is smaller than currently allocated size\n\n\n if (model.size > requestedNumTuples * numComps) {\n model.size = requestedNumTuples * numComps;\n publicAPI.dataChange();\n }\n\n return true;\n }\n\n publicAPI.dataChange = function () {\n model.ranges = null;\n publicAPI.modified();\n };\n\n publicAPI.resize = function (requestedNumTuples) {\n resize(requestedNumTuples);\n var newSize = requestedNumTuples * publicAPI.getNumberOfComponents();\n\n if (model.size !== newSize) {\n model.size = newSize;\n publicAPI.dataChange();\n return true;\n }\n\n return false;\n }; // FIXME, to rename into \"clear()\" or \"reset()\"\n\n\n publicAPI.initialize = function () {\n publicAPI.resize(0);\n };\n\n publicAPI.getElementComponentSize = function () {\n return model.values.BYTES_PER_ELEMENT;\n }; // Description:\n // Return the data component at the location specified by tupleIdx and\n // compIdx.\n\n\n publicAPI.getComponent = function (tupleIdx) {\n var compIdx = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n return model.values[tupleIdx * model.numberOfComponents + compIdx];\n }; // Description:\n // Set the data component at the location specified by tupleIdx and compIdx\n // to value.\n // Note that i is less than NumberOfTuples and j is less than\n // NumberOfComponents. Make sure enough memory has been allocated\n // (use SetNumberOfTuples() and SetNumberOfComponents()).\n\n\n publicAPI.setComponent = function (tupleIdx, compIdx, value) {\n if (value !== model.values[tupleIdx * model.numberOfComponents + compIdx]) {\n model.values[tupleIdx * model.numberOfComponents + compIdx] = value;\n publicAPI.dataChange();\n }\n };\n\n publicAPI.getValue = function (valueIdx) {\n var idx = valueIdx / model.numberOfComponents;\n var comp = valueIdx % model.numberOfComponents;\n return publicAPI.getComponent(idx, comp);\n };\n\n publicAPI.setValue = function (valueIdx, value) {\n var idx = valueIdx / model.numberOfComponents;\n var comp = valueIdx % model.numberOfComponents;\n publicAPI.setComponent(idx, comp, value);\n };\n\n publicAPI.getData = function () {\n return model.size === model.values.length ? model.values : model.values.subarray(0, model.size);\n };\n\n publicAPI.getRange = function () {\n var componentIndex = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : -1;\n var rangeIdx = componentIndex < 0 ? model.numberOfComponents : componentIndex;\n var range = null;\n\n if (!model.ranges) {\n model.ranges = ensureRangeSize(model.ranges, model.numberOfComponents);\n }\n\n range = model.ranges[rangeIdx];\n\n if (range) {\n model.rangeTuple[0] = range.min;\n model.rangeTuple[1] = range.max;\n return model.rangeTuple;\n } // Need to compute ranges...\n\n\n range = computeRange(publicAPI.getData(), componentIndex, model.numberOfComponents);\n model.ranges[rangeIdx] = range;\n model.rangeTuple[0] = range.min;\n model.rangeTuple[1] = range.max;\n return model.rangeTuple;\n };\n\n publicAPI.setRange = function (rangeValue, componentIndex) {\n if (!model.ranges) {\n model.ranges = ensureRangeSize(model.ranges, model.numberOfComponents);\n }\n\n var range = {\n min: rangeValue.min,\n max: rangeValue.max\n };\n model.ranges[componentIndex] = range;\n model.rangeTuple[0] = range.min;\n model.rangeTuple[1] = range.max;\n return model.rangeTuple;\n };\n\n publicAPI.setTuple = function (idx, tuple) {\n var offset = idx * model.numberOfComponents;\n\n for (var i = 0; i < model.numberOfComponents; i++) {\n model.values[offset + i] = tuple[i];\n }\n };\n\n publicAPI.setTuples = function (idx, tuples) {\n var i = idx * model.numberOfComponents;\n var last = Math.min(tuples.length, model.size - i);\n\n for (var j = 0; j < last;) {\n model.values[i++] = tuples[j++];\n }\n };\n\n publicAPI.insertTuple = function (idx, tuple) {\n if (model.size <= idx * model.numberOfComponents) {\n model.size = (idx + 1) * model.numberOfComponents;\n resize(idx + 1);\n }\n\n publicAPI.setTuple(idx, tuple);\n return idx;\n };\n\n publicAPI.insertTuples = function (idx, tuples) {\n var end = idx + tuples.length / model.numberOfComponents;\n\n if (model.size < end * model.numberOfComponents) {\n model.size = end * model.numberOfComponents;\n resize(end);\n }\n\n publicAPI.setTuples(idx, tuples);\n return end;\n };\n\n publicAPI.insertNextTuple = function (tuple) {\n var idx = model.size / model.numberOfComponents;\n return publicAPI.insertTuple(idx, tuple);\n };\n\n publicAPI.insertNextTuples = function (tuples) {\n var idx = model.size / model.numberOfComponents;\n return publicAPI.insertTuples(idx, tuples);\n };\n\n publicAPI.getTuple = function (idx) {\n var tupleToFill = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n var numberOfComponents = model.numberOfComponents || 1;\n var offset = idx * numberOfComponents; // Check most common component sizes first\n // to avoid doing a for loop if possible\n\n switch (numberOfComponents) {\n case 4:\n tupleToFill[3] = model.values[offset + 3];\n // eslint-disable-next-line no-fallthrough\n\n case 3:\n tupleToFill[2] = model.values[offset + 2];\n // eslint-disable-next-line no-fallthrough\n\n case 2:\n tupleToFill[1] = model.values[offset + 1];\n // eslint-disable-next-line no-fallthrough\n\n case 1:\n tupleToFill[0] = model.values[offset];\n break;\n\n default:\n for (var i = numberOfComponents - 1; i >= 0; --i) {\n tupleToFill[i] = model.values[offset + i];\n }\n\n }\n\n return tupleToFill;\n };\n\n publicAPI.getTuples = function (fromId, toId) {\n var from = (fromId !== null && fromId !== void 0 ? fromId : 0) * model.numberOfComponents;\n var to = (toId !== null && toId !== void 0 ? toId : publicAPI.getNumberOfTuples()) * model.numberOfComponents;\n var arr = publicAPI.getData().subarray(from, to);\n return arr.length > 0 ? arr : null;\n };\n\n publicAPI.getTupleLocation = function () {\n var idx = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;\n return idx * model.numberOfComponents;\n };\n\n publicAPI.getNumberOfComponents = function () {\n return model.numberOfComponents;\n };\n\n publicAPI.getNumberOfValues = function () {\n return model.size;\n };\n\n publicAPI.getNumberOfTuples = function () {\n return model.size / model.numberOfComponents;\n };\n\n publicAPI.getDataType = function () {\n return model.dataType;\n };\n /* eslint-disable no-use-before-define */\n\n\n publicAPI.newClone = function () {\n return newInstance({\n empty: true,\n name: model.name,\n dataType: model.dataType,\n numberOfComponents: model.numberOfComponents\n });\n };\n /* eslint-enable no-use-before-define */\n\n\n publicAPI.getName = function () {\n if (!model.name) {\n publicAPI.modified();\n model.name = \"vtkDataArray\".concat(publicAPI.getMTime());\n }\n\n return model.name;\n };\n\n publicAPI.setData = function (typedArray, numberOfComponents) {\n model.values = typedArray;\n model.size = typedArray.length;\n model.dataType = getDataType(typedArray);\n\n if (numberOfComponents) {\n model.numberOfComponents = numberOfComponents;\n }\n\n if (model.size % model.numberOfComponents !== 0) {\n model.numberOfComponents = 1;\n }\n\n publicAPI.dataChange();\n }; // Override serialization support\n\n\n publicAPI.getState = function () {\n if (model.deleted) {\n return null;\n }\n\n var jsonArchive = _objectSpread(_objectSpread({}, model), {}, {\n vtkClass: publicAPI.getClassName()\n }); // Convert typed array to regular array\n\n\n jsonArchive.values = Array.from(jsonArchive.values);\n delete jsonArchive.buffer; // Clean any empty data\n\n Object.keys(jsonArchive).forEach(function (keyName) {\n if (!jsonArchive[keyName]) {\n delete jsonArchive[keyName];\n }\n }); // Sort resulting object by key name\n\n var sortedObj = {};\n Object.keys(jsonArchive).sort().forEach(function (name) {\n sortedObj[name] = jsonArchive[name];\n }); // Remove mtime\n\n if (sortedObj.mtime) {\n delete sortedObj.mtime;\n }\n\n return sortedObj;\n };\n\n publicAPI.deepCopy = function (other) {\n publicAPI.shallowCopy(other);\n publicAPI.setData(other.getData().slice());\n };\n\n publicAPI.interpolateTuple = function (idx, source1, source1Idx, source2, source2Idx, t) {\n var numberOfComponents = model.numberOfComponents || 1;\n\n if (numberOfComponents !== source1.getNumberOfComponents() || numberOfComponents !== source2.getNumberOfComponents()) {\n vtkErrorMacro('numberOfComponents must match');\n }\n\n var tuple1 = source1.getTuple(source1Idx);\n var tuple2 = source2.getTuple(source2Idx);\n var out = [];\n out.length = numberOfComponents; // Check most common component sizes first\n // to avoid doing a for loop if possible\n\n switch (numberOfComponents) {\n case 4:\n out[3] = tuple1[3] + (tuple2[3] - tuple1[3]) * t;\n // eslint-disable-next-line no-fallthrough\n\n case 3:\n out[2] = tuple1[2] + (tuple2[2] - tuple1[2]) * t;\n // eslint-disable-next-line no-fallthrough\n\n case 2:\n out[1] = tuple1[1] + (tuple2[1] - tuple1[1]) * t;\n // eslint-disable-next-line no-fallthrough\n\n case 1:\n out[0] = tuple1[0] + (tuple2[0] - tuple1[0]) * t;\n break;\n\n default:\n for (var i = 0; i < numberOfComponents; i++) {\n out[i] = tuple1[i] + (tuple2[i] - tuple1[i]) * t;\n }\n\n }\n\n return publicAPI.insertTuple(idx, out);\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n// size: The current size of the dataArray.\n// NOTE: The underlying typed array may be larger than 'size'.\n\n\nvar DEFAULT_VALUES = {\n name: '',\n numberOfComponents: 1,\n dataType: DefaultDataType,\n rangeTuple: [0, 0] // size: undefined,\n // values: null,\n // ranges: null,\n\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues);\n\n if (!model.empty && !model.values && !model.size) {\n throw new TypeError('Cannot create vtkDataArray object without: size > 0, values');\n }\n\n if (!model.values) {\n model.values = newTypedArray(model.dataType, model.size);\n } else if (Array.isArray(model.values)) {\n model.values = newTypedArrayFrom(model.dataType, model.values);\n }\n\n if (model.values) {\n var _model$size;\n\n // Takes the size if provided (can be lower than `model.values`) otherwise the actual length of `values`.\n model.size = (_model$size = model.size) !== null && _model$size !== void 0 ? _model$size : model.values.length;\n model.dataType = getDataType(model.values);\n } // Object methods\n\n\n obj(publicAPI, model);\n set(publicAPI, model, ['name', 'numberOfComponents']); // Object specific methods\n\n vtkDataArray(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend, 'vtkDataArray'); // ----------------------------------------------------------------------------\n\nvar vtkDataArray$1 = _objectSpread(_objectSpread({\n newInstance: newInstance,\n extend: extend\n}, STATIC), Constants);\n\nexport { STATIC, vtkDataArray$1 as default, extend, newInstance };\n","var DataTypeByteSize = {\n Int8Array: 1,\n Uint8Array: 1,\n Uint8ClampedArray: 1,\n Int16Array: 2,\n Uint16Array: 2,\n Int32Array: 4,\n Uint32Array: 4,\n Float32Array: 4,\n Float64Array: 8\n};\nvar VtkDataTypes = {\n VOID: '',\n // not sure to know what that should be\n CHAR: 'Int8Array',\n SIGNED_CHAR: 'Int8Array',\n UNSIGNED_CHAR: 'Uint8Array',\n SHORT: 'Int16Array',\n UNSIGNED_SHORT: 'Uint16Array',\n INT: 'Int32Array',\n UNSIGNED_INT: 'Uint32Array',\n FLOAT: 'Float32Array',\n DOUBLE: 'Float64Array'\n};\nvar DefaultDataType = VtkDataTypes.FLOAT;\nvar Constants = {\n DefaultDataType: DefaultDataType,\n DataTypeByteSize: DataTypeByteSize,\n VtkDataTypes: VtkDataTypes\n};\n\nexport { DataTypeByteSize, DefaultDataType, VtkDataTypes, Constants as default };\n","import macro from '../../macros.js';\nimport { i as isNan, h as hsv2rgb } from './Math/index.js';\nimport vtkScalarsToColors from './ScalarsToColors.js';\nimport { ScalarMappingTarget } from './ScalarsToColors/Constants.js';\nimport { VtkDataTypes } from './DataArray/Constants.js';\n\nvar vtkErrorMacro = macro.vtkErrorMacro; // ----------------------------------------------------------------------------\n// Global methods\n// ----------------------------------------------------------------------------\n// Add module-level functions or api that you want to expose statically via\n// the next section...\n// ----------------------------------------------------------------------------\n// Static API\n// ----------------------------------------------------------------------------\n\nvar BELOW_RANGE_COLOR_INDEX = 0;\nvar ABOVE_RANGE_COLOR_INDEX = 1;\nvar NAN_COLOR_INDEX = 2; // ----------------------------------------------------------------------------\n// vtkMyClass methods\n// ----------------------------------------------------------------------------\n\nfunction vtkLookupTable(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkLookupTable'); //----------------------------------------------------------------------------\n // Description:\n // Return true if all of the values defining the mapping have an opacity\n // equal to 1. Default implementation return true.\n\n publicAPI.isOpaque = function () {\n if (model.opaqueFlagBuildTime.getMTime() < publicAPI.getMTime()) {\n var opaque = true;\n\n if (model.nanColor[3] < 1.0) {\n opaque = 0;\n }\n\n if (model.useBelowRangeColor && model.belowRangeColor[3] < 1.0) {\n opaque = 0;\n }\n\n if (model.useAboveRangeColor && model.aboveRangeColor[3] < 1.0) {\n opaque = 0;\n }\n\n for (var i = 3; i < model.table.length && opaque; i += 4) {\n if (model.table[i] < 255) {\n opaque = false;\n }\n }\n\n model.opaqueFlag = opaque;\n model.opaqueFlagBuildTime.modified();\n }\n\n return model.opaqueFlag;\n };\n\n publicAPI.usingLogScale = function () {\n return false;\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.getNumberOfAvailableColors = function () {\n return model.table.length / 4;\n }; //----------------------------------------------------------------------------\n // Apply shift/scale to the scalar value v and return the index.\n\n\n publicAPI.linearIndexLookup = function (v, p) {\n var dIndex = 0;\n\n if (v < p.range[0]) {\n dIndex = p.maxIndex + BELOW_RANGE_COLOR_INDEX + 1.5;\n } else if (v > p.range[1]) {\n dIndex = p.maxIndex + ABOVE_RANGE_COLOR_INDEX + 1.5;\n } else {\n dIndex = (v + p.shift) * p.scale; // This conditional is needed because when v is very close to\n // p.Range[1], it may map above p.MaxIndex in the linear mapping\n // above.\n\n dIndex = dIndex < p.maxIndex ? dIndex : p.maxIndex;\n }\n\n return Math.floor(dIndex);\n };\n\n publicAPI.linearLookup = function (v, table, p) {\n var index = 0;\n\n if (isNan(v)) {\n index = Math.floor(p.maxIndex + 1.5 + NAN_COLOR_INDEX);\n } else {\n index = publicAPI.linearIndexLookup(v, p);\n }\n\n var offset = 4 * index;\n return table.slice(offset, offset + 4);\n };\n\n publicAPI.indexedLookupFunction = function (v, table, p) {\n var index = publicAPI.getAnnotatedValueIndexInternal(v);\n\n if (index === -1) {\n index = model.numberOfColors + NAN_COLOR_INDEX;\n }\n\n var offset = 4 * index;\n return [table[offset], table[offset + 1], table[offset + 2], table[offset + 3]];\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.lookupShiftAndScale = function (range, p) {\n p.shift = -range[0];\n p.scale = Number.MAX_VALUE;\n\n if (range[1] > range[0]) {\n p.scale = (p.maxIndex + 1) / (range[1] - range[0]);\n }\n }; // Public API methods\n\n\n publicAPI.mapScalarsThroughTable = function (input, output, outFormat, inputOffset) {\n var lookupFunc = publicAPI.linearLookup;\n\n if (model.indexedLookup) {\n lookupFunc = publicAPI.indexedLookupFunction;\n }\n\n var trange = publicAPI.getMappingRange();\n var p = {\n maxIndex: publicAPI.getNumberOfColors() - 1,\n range: trange,\n shift: 0.0,\n scale: 0.0\n };\n publicAPI.lookupShiftAndScale(trange, p);\n var alpha = publicAPI.getAlpha();\n var length = input.getNumberOfTuples();\n var inIncr = input.getNumberOfComponents();\n var outputV = output.getData();\n var inputV = input.getData();\n\n if (alpha >= 1.0) {\n if (outFormat === ScalarMappingTarget.RGBA) {\n for (var i = 0; i < length; i++) {\n var cptr = lookupFunc(inputV[i * inIncr + inputOffset], model.table, p);\n outputV[i * 4] = cptr[0];\n outputV[i * 4 + 1] = cptr[1];\n outputV[i * 4 + 2] = cptr[2];\n outputV[i * 4 + 3] = cptr[3];\n }\n }\n } else {\n /* eslint-disable no-lonely-if */\n if (outFormat === ScalarMappingTarget.RGBA) {\n for (var _i = 0; _i < length; _i++) {\n var _cptr = lookupFunc(inputV[_i * inIncr + inputOffset], model.table, p);\n\n outputV[_i * 4] = _cptr[0];\n outputV[_i * 4 + 1] = _cptr[1];\n outputV[_i * 4 + 2] = _cptr[2];\n outputV[_i * 4 + 3] = Math.floor(_cptr[3] * alpha + 0.5);\n }\n }\n } // alpha blending\n\n };\n\n publicAPI.forceBuild = function () {\n var hinc = 0.0;\n var sinc = 0.0;\n var vinc = 0.0;\n var ainc = 0.0;\n var maxIndex = model.numberOfColors - 1;\n\n if (maxIndex) {\n hinc = (model.hueRange[1] - model.hueRange[0]) / maxIndex;\n sinc = (model.saturationRange[1] - model.saturationRange[0]) / maxIndex;\n vinc = (model.valueRange[1] - model.valueRange[0]) / maxIndex;\n ainc = (model.alphaRange[1] - model.alphaRange[0]) / maxIndex;\n }\n\n model.table.length = 4 * maxIndex + 16;\n var hsv = [];\n var rgba = [];\n\n for (var i = 0; i <= maxIndex; i++) {\n hsv[0] = model.hueRange[0] + i * hinc;\n hsv[1] = model.saturationRange[0] + i * sinc;\n hsv[2] = model.valueRange[0] + i * vinc;\n hsv2rgb(hsv, rgba);\n rgba[3] = model.alphaRange[0] + i * ainc; // case VTK_RAMP_LINEAR:\n\n model.table[i * 4] = rgba[0] * 255.0 + 0.5;\n model.table[i * 4 + 1] = rgba[1] * 255.0 + 0.5;\n model.table[i * 4 + 2] = rgba[2] * 255.0 + 0.5;\n model.table[i * 4 + 3] = rgba[3] * 255.0 + 0.5;\n }\n\n publicAPI.buildSpecialColors();\n model.buildTime.modified();\n };\n\n publicAPI.setTable = function (table) {\n if (table.getNumberOfComponents() !== 4) {\n vtkErrorMacro('Expected 4 components for RGBA colors');\n return;\n }\n\n if (table.getDataType() !== VtkDataTypes.UNSIGNED_CHAR) {\n vtkErrorMacro('Expected unsigned char values for RGBA colors');\n return;\n }\n\n model.numberOfColors = table.getNumberOfTuples();\n var data = table.getData();\n model.table.length = data.length;\n\n for (var i = 0; i < data.length; i++) {\n model.table[i] = data[i];\n }\n\n publicAPI.buildSpecialColors();\n model.insertTime.modified();\n publicAPI.modified();\n };\n\n publicAPI.buildSpecialColors = function () {\n // Add \"special\" colors (NaN, below range, above range) to table here.\n var numberOfColors = model.numberOfColors;\n var tptr = model.table;\n var base = (numberOfColors + BELOW_RANGE_COLOR_INDEX) * 4; // Below range color\n\n if (model.useBelowRangeColor || numberOfColors === 0) {\n tptr[base] = model.belowRangeColor[0] * 255.0 + 0.5;\n tptr[base + 1] = model.belowRangeColor[1] * 255.0 + 0.5;\n tptr[base + 2] = model.belowRangeColor[2] * 255.0 + 0.5;\n tptr[base + 3] = model.belowRangeColor[3] * 255.0 + 0.5;\n } else {\n // Duplicate the first color in the table.\n tptr[base] = tptr[0];\n tptr[base + 1] = tptr[1];\n tptr[base + 2] = tptr[2];\n tptr[base + 3] = tptr[3];\n } // Above range color\n\n\n base = (numberOfColors + ABOVE_RANGE_COLOR_INDEX) * 4;\n\n if (model.useAboveRangeColor || numberOfColors === 0) {\n tptr[base] = model.aboveRangeColor[0] * 255.0 + 0.5;\n tptr[base + 1] = model.aboveRangeColor[1] * 255.0 + 0.5;\n tptr[base + 2] = model.aboveRangeColor[2] * 255.0 + 0.5;\n tptr[base + 3] = model.aboveRangeColor[3] * 255.0 + 0.5;\n } else {\n // Duplicate the last color in the table.\n tptr[base] = tptr[4 * (numberOfColors - 1) + 0];\n tptr[base + 1] = tptr[4 * (numberOfColors - 1) + 1];\n tptr[base + 2] = tptr[4 * (numberOfColors - 1) + 2];\n tptr[base + 3] = tptr[4 * (numberOfColors - 1) + 3];\n } // Always use NanColor\n\n\n base = (numberOfColors + NAN_COLOR_INDEX) * 4;\n tptr[base] = model.nanColor[0] * 255.0 + 0.5;\n tptr[base + 1] = model.nanColor[1] * 255.0 + 0.5;\n tptr[base + 2] = model.nanColor[2] * 255.0 + 0.5;\n tptr[base + 3] = model.nanColor[3] * 255.0 + 0.5;\n };\n\n publicAPI.build = function () {\n if (model.table.length < 1 || publicAPI.getMTime() > model.buildTime.getMTime() && model.insertTime.getMTime() <= model.buildTime.getMTime()) {\n publicAPI.forceBuild();\n }\n };\n\n if (model.table.length > 0) {\n // ensure insertTime is more recently modified than buildTime if\n // a table is provided via the constructor\n model.insertTime.modified();\n }\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n numberOfColors: 256,\n // table: null,\n hueRange: [0.0, 0.66667],\n saturationRange: [1.0, 1.0],\n valueRange: [1.0, 1.0],\n alphaRange: [1.0, 1.0],\n nanColor: [0.5, 0.0, 0.0, 1.0],\n belowRangeColor: [0.0, 0.0, 0.0, 1.0],\n aboveRangeColor: [1.0, 1.0, 1.0, 1.0],\n useAboveRangeColor: false,\n useBelowRangeColor: false,\n alpha: 1.0 // buildTime: null,\n // opaqueFlagBuildTime: null,\n // insertTime: null,\n\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkScalarsToColors.extend(publicAPI, model, initialValues); // Internal objects initialization\n\n if (!model.table) {\n model.table = [];\n }\n\n model.buildTime = {};\n macro.obj(model.buildTime);\n model.opaqueFlagBuildTime = {};\n macro.obj(model.opaqueFlagBuildTime, {\n mtime: 0\n });\n model.insertTime = {};\n macro.obj(model.insertTime, {\n mtime: 0\n }); // Create get-only macros\n\n macro.get(publicAPI, model, ['buildTime']); // Create get-set macros\n\n macro.setGet(publicAPI, model, ['numberOfColors', 'useAboveRangeColor', 'useBelowRangeColor']); // Create set macros for array (needs to know size)\n\n macro.setArray(publicAPI, model, ['alphaRange', 'hueRange', 'saturationRange', 'valueRange'], 2);\n macro.setArray(publicAPI, model, ['nanColor', 'belowRangeColor', 'aboveRangeColor'], 4); // Create get macros for array\n\n macro.getArray(publicAPI, model, ['hueRange', 'saturationRange', 'valueRange', 'alphaRange', 'nanColor', 'belowRangeColor', 'aboveRangeColor']); // For more macro methods, see \"Sources/macros.js\"\n // Object specific methods\n\n vtkLookupTable(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkLookupTable'); // ----------------------------------------------------------------------------\n\nvar vtkLookupTable$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkLookupTable$1 as default, extend, newInstance };\n","var IDENTITY = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];\nvar IDENTITY_3X3 = [1, 0, 0, 0, 1, 0, 0, 0, 1];\nvar EPSILON = 1e-6;\nvar VTK_SMALL_NUMBER = 1.0e-12;\nvar Constants = {\n IDENTITY: IDENTITY,\n IDENTITY_3X3: IDENTITY_3X3,\n EPSILON: EPSILON,\n VTK_SMALL_NUMBER: VTK_SMALL_NUMBER\n};\n\nexport { EPSILON, IDENTITY, IDENTITY_3X3, VTK_SMALL_NUMBER, Constants as default };\n","import _slicedToArray from '@babel/runtime/helpers/slicedToArray';\nimport _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';\nimport seedrandom from 'seedrandom';\nimport macro from '../../../macros.js';\nimport { IDENTITY, IDENTITY_3X3, VTK_SMALL_NUMBER, EPSILON } from './Constants.js';\n\nvar vtkErrorMacro = macro.vtkErrorMacro,\n vtkWarningMacro = macro.vtkWarningMacro; // ----------------------------------------------------------------------------\n\n/* eslint-disable camelcase */\n\n/* eslint-disable no-cond-assign */\n\n/* eslint-disable no-bitwise */\n\n/* eslint-disable no-multi-assign */\n// ----------------------------------------------------------------------------\n\nvar randomSeedValue = 0;\nvar VTK_MAX_ROTATIONS = 20;\n\nfunction notImplemented(method) {\n return function () {\n return vtkErrorMacro(\"vtkMath::\".concat(method, \" - NOT IMPLEMENTED\"));\n };\n} // Swap rows for n by n matrix\n\n\nfunction swapRowsMatrix_nxn(matrix, n, row1, row2) {\n var tmp;\n\n for (var i = 0; i < n; i++) {\n tmp = matrix[row1 * n + i];\n matrix[row1 * n + i] = matrix[row2 * n + i];\n matrix[row2 * n + i] = tmp;\n }\n} // Swap columns for n by n matrix\n\n\nfunction swapColumnsMatrix_nxn(matrix, n, column1, column2) {\n var tmp;\n\n for (var i = 0; i < n; i++) {\n tmp = matrix[i * n + column1];\n matrix[i * n + column1] = matrix[i * n + column2];\n matrix[i * n + column2] = tmp;\n }\n} // ----------------------------------------------------------------------------\n// Global methods\n// ----------------------------------------------------------------------------\n\n\nfunction createArray() {\n var size = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 3;\n // faster than Array.from and/or while loop\n var res = Array(size);\n\n for (var i = 0; i < size; ++i) {\n res[i] = 0;\n }\n\n return res;\n}\nvar Pi = function Pi() {\n return Math.PI;\n};\nfunction radiansFromDegrees(deg) {\n return deg / 180 * Math.PI;\n}\nfunction degreesFromRadians(rad) {\n return rad * 180 / Math.PI;\n}\nvar round = Math.round,\n floor = Math.floor,\n ceil = Math.ceil,\n min = Math.min,\n max = Math.max;\nfunction arrayMin(arr) {\n var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var stride = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;\n var minValue = Infinity;\n\n for (var i = offset, len = arr.length; i < len; i += stride) {\n if (arr[i] < minValue) {\n minValue = arr[i];\n }\n }\n\n return minValue;\n}\nfunction arrayMax(arr) {\n var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var stride = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;\n var maxValue = -Infinity;\n\n for (var i = offset, len = arr.length; i < len; i += stride) {\n if (maxValue < arr[i]) {\n maxValue = arr[i];\n }\n }\n\n return maxValue;\n}\nfunction arrayRange(arr) {\n var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var stride = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;\n var minValue = Infinity;\n var maxValue = -Infinity;\n\n for (var i = offset, len = arr.length; i < len; i += stride) {\n if (arr[i] < minValue) {\n minValue = arr[i];\n }\n\n if (maxValue < arr[i]) {\n maxValue = arr[i];\n }\n }\n\n return [minValue, maxValue];\n}\nvar ceilLog2 = notImplemented('ceilLog2');\nvar factorial = notImplemented('factorial');\nfunction nearestPowerOfTwo(xi) {\n var v = 1;\n\n while (v < xi) {\n v *= 2;\n }\n\n return v;\n}\nfunction isPowerOfTwo(x) {\n return x === nearestPowerOfTwo(x);\n}\nfunction binomial(m, n) {\n var r = 1;\n\n for (var i = 1; i <= n; ++i) {\n r *= (m - i + 1) / i;\n }\n\n return Math.floor(r);\n}\nfunction beginCombination(m, n) {\n if (m < n) {\n return 0;\n }\n\n var r = createArray(n);\n\n for (var i = 0; i < n; ++i) {\n r[i] = i;\n }\n\n return r;\n}\nfunction nextCombination(m, n, r) {\n var status = 0;\n\n for (var i = n - 1; i >= 0; --i) {\n if (r[i] < m - n + i) {\n var j = r[i] + 1;\n\n while (i < n) {\n r[i++] = j++;\n }\n\n status = 1;\n break;\n }\n }\n\n return status;\n}\nfunction randomSeed(seed) {\n seedrandom(\"\".concat(seed), {\n global: true\n });\n randomSeedValue = seed;\n}\nfunction getSeed() {\n return randomSeedValue;\n}\nfunction random() {\n var minValue = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var maxValue = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n var delta = maxValue - minValue;\n return minValue + delta * Math.random();\n}\nvar gaussian = notImplemented('gaussian'); // Vect3 operations\n\nfunction add(a, b, out) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n return out;\n}\nfunction subtract(a, b, out) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n return out;\n}\nfunction multiplyScalar(vec, scalar) {\n vec[0] *= scalar;\n vec[1] *= scalar;\n vec[2] *= scalar;\n return vec;\n}\nfunction multiplyScalar2D(vec, scalar) {\n vec[0] *= scalar;\n vec[1] *= scalar;\n return vec;\n}\nfunction multiplyAccumulate(a, b, scalar, out) {\n out[0] = a[0] + b[0] * scalar;\n out[1] = a[1] + b[1] * scalar;\n out[2] = a[2] + b[2] * scalar;\n return out;\n}\nfunction multiplyAccumulate2D(a, b, scalar, out) {\n out[0] = a[0] + b[0] * scalar;\n out[1] = a[1] + b[1] * scalar;\n return out;\n}\nfunction dot(x, y) {\n return x[0] * y[0] + x[1] * y[1] + x[2] * y[2];\n}\nfunction outer(x, y, out_3x3) {\n out_3x3[0] = x[0] * y[0];\n out_3x3[1] = x[0] * y[1];\n out_3x3[2] = x[0] * y[2];\n out_3x3[3] = x[1] * y[0];\n out_3x3[4] = x[1] * y[1];\n out_3x3[5] = x[1] * y[2];\n out_3x3[6] = x[2] * y[0];\n out_3x3[7] = x[2] * y[1];\n out_3x3[8] = x[2] * y[2];\n}\nfunction cross(x, y, out) {\n var Zx = x[1] * y[2] - x[2] * y[1];\n var Zy = x[2] * y[0] - x[0] * y[2];\n var Zz = x[0] * y[1] - x[1] * y[0];\n out[0] = Zx;\n out[1] = Zy;\n out[2] = Zz;\n return out;\n}\nfunction norm(x) {\n var n = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 3;\n\n switch (n) {\n case 1:\n return Math.abs(x);\n\n case 2:\n return Math.sqrt(x[0] * x[0] + x[1] * x[1]);\n\n case 3:\n return Math.sqrt(x[0] * x[0] + x[1] * x[1] + x[2] * x[2]);\n\n default:\n {\n var sum = 0;\n\n for (var i = 0; i < n; i++) {\n sum += x[i] * x[i];\n }\n\n return Math.sqrt(sum);\n }\n }\n}\nfunction normalize(x) {\n var den = norm(x);\n\n if (den !== 0.0) {\n x[0] /= den;\n x[1] /= den;\n x[2] /= den;\n }\n\n return den;\n}\nfunction perpendiculars(x, y, z, theta) {\n var x2 = x[0] * x[0];\n var y2 = x[1] * x[1];\n var z2 = x[2] * x[2];\n var r = Math.sqrt(x2 + y2 + z2);\n var dx;\n var dy;\n var dz; // transpose the vector to avoid divide-by-zero error\n\n if (x2 > y2 && x2 > z2) {\n dx = 0;\n dy = 1;\n dz = 2;\n } else if (y2 > z2) {\n dx = 1;\n dy = 2;\n dz = 0;\n } else {\n dx = 2;\n dy = 0;\n dz = 1;\n }\n\n var a = x[dx] / r;\n var b = x[dy] / r;\n var c = x[dz] / r;\n var tmp = Math.sqrt(a * a + c * c);\n\n if (theta !== 0) {\n var sintheta = Math.sin(theta);\n var costheta = Math.cos(theta);\n\n if (y) {\n y[dx] = (c * costheta - a * b * sintheta) / tmp;\n y[dy] = sintheta * tmp;\n y[dz] = (-(a * costheta) - b * c * sintheta) / tmp;\n }\n\n if (z) {\n z[dx] = (-(c * sintheta) - a * b * costheta) / tmp;\n z[dy] = costheta * tmp;\n z[dz] = (a * sintheta - b * c * costheta) / tmp;\n }\n } else {\n if (y) {\n y[dx] = c / tmp;\n y[dy] = 0;\n y[dz] = -a / tmp;\n }\n\n if (z) {\n z[dx] = -a * b / tmp;\n z[dy] = tmp;\n z[dz] = -b * c / tmp;\n }\n }\n}\nfunction projectVector(a, b, projection) {\n var bSquared = dot(b, b);\n\n if (bSquared === 0) {\n projection[0] = 0;\n projection[1] = 0;\n projection[2] = 0;\n return false;\n }\n\n var scale = dot(a, b) / bSquared;\n\n for (var i = 0; i < 3; i++) {\n projection[i] = b[i];\n }\n\n multiplyScalar(projection, scale);\n return true;\n}\nfunction dot2D(x, y) {\n return x[0] * y[0] + x[1] * y[1];\n}\nfunction projectVector2D(a, b, projection) {\n var bSquared = dot2D(b, b);\n\n if (bSquared === 0) {\n projection[0] = 0;\n projection[1] = 0;\n return false;\n }\n\n var scale = dot2D(a, b) / bSquared;\n\n for (var i = 0; i < 2; i++) {\n projection[i] = b[i];\n }\n\n multiplyScalar2D(projection, scale);\n return true;\n}\nfunction distance2BetweenPoints(x, y) {\n return (x[0] - y[0]) * (x[0] - y[0]) + (x[1] - y[1]) * (x[1] - y[1]) + (x[2] - y[2]) * (x[2] - y[2]);\n}\nfunction angleBetweenVectors(v1, v2) {\n var crossVect = [0, 0, 0];\n cross(v1, v2, crossVect);\n return Math.atan2(norm(crossVect), dot(v1, v2));\n}\nfunction signedAngleBetweenVectors(v1, v2, vN) {\n var crossVect = [0, 0, 0];\n cross(v1, v2, crossVect);\n var angle = Math.atan2(norm(crossVect), dot(v1, v2));\n return dot(crossVect, vN) >= 0 ? angle : -angle;\n}\nfunction gaussianAmplitude(mean, variance, position) {\n var distanceFromMean = Math.abs(mean - position);\n return 1 / Math.sqrt(2 * Math.PI * variance) * Math.exp(-Math.pow(distanceFromMean, 2) / (2 * variance));\n}\nfunction gaussianWeight(mean, variance, position) {\n var distanceFromMean = Math.abs(mean - position);\n return Math.exp(-Math.pow(distanceFromMean, 2) / (2 * variance));\n}\nfunction outer2D(x, y, out_2x2) {\n out_2x2[0] = x[0] * y[0];\n out_2x2[1] = x[0] * y[1];\n out_2x2[2] = x[1] * y[0];\n out_2x2[3] = x[1] * y[1];\n}\nfunction norm2D(x2D) {\n return Math.sqrt(x2D[0] * x2D[0] + x2D[1] * x2D[1]);\n}\nfunction normalize2D(x) {\n var den = norm2D(x);\n\n if (den !== 0.0) {\n x[0] /= den;\n x[1] /= den;\n }\n\n return den;\n}\nfunction rowsToMat4(row0, row1, row2, row3, mat) {\n for (var i = 0; i < 4; i++) {\n mat[i] = row0[i];\n mat[4 + i] = row1[i];\n mat[8 + i] = row2[i];\n mat[12 + i] = row3[i];\n }\n\n return mat;\n}\nfunction columnsToMat4(column0, column1, column2, column3, mat) {\n for (var i = 0; i < 4; i++) {\n mat[4 * i] = column0[i];\n mat[4 * i + 1] = column1[i];\n mat[4 * i + 2] = column2[i];\n mat[4 * i + 3] = column3[i];\n }\n\n return mat;\n}\nfunction rowsToMat3(row0, row1, row2, mat) {\n for (var i = 0; i < 3; i++) {\n mat[i] = row0[i];\n mat[3 + i] = row1[i];\n mat[6 + i] = row2[i];\n }\n\n return mat;\n}\nfunction columnsToMat3(column0, column1, column2, mat) {\n for (var i = 0; i < 3; i++) {\n mat[3 * i] = column0[i];\n mat[3 * i + 1] = column1[i];\n mat[3 * i + 2] = column2[i];\n }\n\n return mat;\n}\nfunction determinant2x2() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n if (args.length === 2) {\n return args[0][0] * args[1][1] - args[1][0] * args[0][1];\n }\n\n if (args.length === 4) {\n return args[0] * args[3] - args[1] * args[2];\n }\n\n return Number.NaN;\n}\nfunction LUFactor3x3(mat_3x3, index_3) {\n var maxI;\n var tmp;\n var largest;\n var scale = [0, 0, 0]; // Loop over rows to get implicit scaling information\n\n for (var i = 0; i < 3; i++) {\n largest = Math.abs(mat_3x3[i * 3]);\n\n if ((tmp = Math.abs(mat_3x3[i * 3 + 1])) > largest) {\n largest = tmp;\n }\n\n if ((tmp = Math.abs(mat_3x3[i * 3 + 2])) > largest) {\n largest = tmp;\n }\n\n scale[i] = 1 / largest;\n } // Loop over all columns using Crout's method\n // first column\n\n\n largest = scale[0] * Math.abs(mat_3x3[0]);\n maxI = 0;\n\n if ((tmp = scale[1] * Math.abs(mat_3x3[3])) >= largest) {\n largest = tmp;\n maxI = 1;\n }\n\n if ((tmp = scale[2] * Math.abs(mat_3x3[6])) >= largest) {\n maxI = 2;\n }\n\n if (maxI !== 0) {\n swapRowsMatrix_nxn(mat_3x3, 3, maxI, 0);\n scale[maxI] = scale[0];\n }\n\n index_3[0] = maxI;\n mat_3x3[3] /= mat_3x3[0];\n mat_3x3[6] /= mat_3x3[0]; // second column\n\n mat_3x3[4] -= mat_3x3[3] * mat_3x3[1];\n mat_3x3[7] -= mat_3x3[6] * mat_3x3[1];\n largest = scale[1] * Math.abs(mat_3x3[4]);\n maxI = 1;\n\n if ((tmp = scale[2] * Math.abs(mat_3x3[7])) >= largest) {\n maxI = 2;\n swapRowsMatrix_nxn(mat_3x3, 3, 1, 2);\n scale[2] = scale[1];\n }\n\n index_3[1] = maxI;\n mat_3x3[7] /= mat_3x3[4]; // third column\n\n mat_3x3[5] -= mat_3x3[3] * mat_3x3[2];\n mat_3x3[8] -= mat_3x3[6] * mat_3x3[2] + mat_3x3[7] * mat_3x3[5];\n index_3[2] = 2;\n}\nfunction LUSolve3x3(mat_3x3, index_3, x_3) {\n // forward substitution\n var sum = x_3[index_3[0]];\n x_3[index_3[0]] = x_3[0];\n x_3[0] = sum;\n sum = x_3[index_3[1]];\n x_3[index_3[1]] = x_3[1];\n x_3[1] = sum - mat_3x3[3] * x_3[0];\n sum = x_3[index_3[2]];\n x_3[index_3[2]] = x_3[2];\n x_3[2] = sum - mat_3x3[6] * x_3[0] - mat_3x3[7] * x_3[1]; // back substitution\n\n x_3[2] /= mat_3x3[8];\n x_3[1] = (x_3[1] - mat_3x3[5] * x_3[2]) / mat_3x3[4];\n x_3[0] = (x_3[0] - mat_3x3[1] * x_3[1] - mat_3x3[2] * x_3[2]) / mat_3x3[0];\n}\nfunction linearSolve3x3(mat_3x3, x_3, y_3) {\n var a1 = mat_3x3[0];\n var b1 = mat_3x3[1];\n var c1 = mat_3x3[2];\n var a2 = mat_3x3[3];\n var b2 = mat_3x3[4];\n var c2 = mat_3x3[5];\n var a3 = mat_3x3[6];\n var b3 = mat_3x3[7];\n var c3 = mat_3x3[8]; // Compute the adjoint\n\n var d1 = +determinant2x2(b2, b3, c2, c3);\n var d2 = -determinant2x2(a2, a3, c2, c3);\n var d3 = +determinant2x2(a2, a3, b2, b3);\n var e1 = -determinant2x2(b1, b3, c1, c3);\n var e2 = +determinant2x2(a1, a3, c1, c3);\n var e3 = -determinant2x2(a1, a3, b1, b3);\n var f1 = +determinant2x2(b1, b2, c1, c2);\n var f2 = -determinant2x2(a1, a2, c1, c2);\n var f3 = +determinant2x2(a1, a2, b1, b2); // Compute the determinant\n\n var det = a1 * d1 + b1 * d2 + c1 * d3; // Multiply by the adjoint\n\n var v1 = d1 * x_3[0] + e1 * x_3[1] + f1 * x_3[2];\n var v2 = d2 * x_3[0] + e2 * x_3[1] + f2 * x_3[2];\n var v3 = d3 * x_3[0] + e3 * x_3[1] + f3 * x_3[2]; // Divide by the determinant\n\n y_3[0] = v1 / det;\n y_3[1] = v2 / det;\n y_3[2] = v3 / det;\n}\nfunction multiply3x3_vect3(mat_3x3, in_3, out_3) {\n var x = mat_3x3[0] * in_3[0] + mat_3x3[1] * in_3[1] + mat_3x3[2] * in_3[2];\n var y = mat_3x3[3] * in_3[0] + mat_3x3[4] * in_3[1] + mat_3x3[5] * in_3[2];\n var z = mat_3x3[6] * in_3[0] + mat_3x3[7] * in_3[1] + mat_3x3[8] * in_3[2];\n out_3[0] = x;\n out_3[1] = y;\n out_3[2] = z;\n}\nfunction multiply3x3_mat3(a_3x3, b_3x3, out_3x3) {\n var copyA = _toConsumableArray(a_3x3);\n\n var copyB = _toConsumableArray(b_3x3);\n\n for (var i = 0; i < 3; i++) {\n out_3x3[i] = copyA[0] * copyB[i] + copyA[1] * copyB[i + 3] + copyA[2] * copyB[i + 6];\n out_3x3[i + 3] = copyA[3] * copyB[i] + copyA[4] * copyB[i + 3] + copyA[5] * copyB[i + 6];\n out_3x3[i + 6] = copyA[6] * copyB[i] + copyA[7] * copyB[i + 3] + copyA[8] * copyB[i + 6];\n }\n}\nfunction multiplyMatrix(a, b, rowA, colA, rowB, colB, out_rowXcol) {\n // we need colA == rowB\n if (colA !== rowB) {\n vtkErrorMacro('Number of columns of A must match number of rows of B.');\n } // If a or b is used to store the result, copying them is required\n\n\n var copyA = _toConsumableArray(a);\n\n var copyB = _toConsumableArray(b); // output matrix is rowA*colB\n // output row\n\n\n for (var i = 0; i < rowA; i++) {\n // output col\n for (var j = 0; j < colB; j++) {\n out_rowXcol[i * colB + j] = 0; // sum for this point\n\n for (var k = 0; k < colA; k++) {\n out_rowXcol[i * colB + j] += copyA[i * colA + k] * copyB[j + colB * k];\n }\n }\n }\n}\nfunction transpose3x3(in_3x3, outT_3x3) {\n var tmp; // off-diagonal elements\n\n tmp = in_3x3[3];\n outT_3x3[3] = in_3x3[1];\n outT_3x3[1] = tmp;\n tmp = in_3x3[6];\n outT_3x3[6] = in_3x3[2];\n outT_3x3[2] = tmp;\n tmp = in_3x3[7];\n outT_3x3[7] = in_3x3[5];\n outT_3x3[5] = tmp; // on-diagonal elements\n\n outT_3x3[0] = in_3x3[0];\n outT_3x3[4] = in_3x3[4];\n outT_3x3[8] = in_3x3[8];\n}\nfunction invert3x3(in_3x3, outI_3x3) {\n var a1 = in_3x3[0];\n var b1 = in_3x3[1];\n var c1 = in_3x3[2];\n var a2 = in_3x3[3];\n var b2 = in_3x3[4];\n var c2 = in_3x3[5];\n var a3 = in_3x3[6];\n var b3 = in_3x3[7];\n var c3 = in_3x3[8]; // Compute the adjoint\n\n var d1 = +determinant2x2(b2, b3, c2, c3);\n var d2 = -determinant2x2(a2, a3, c2, c3);\n var d3 = +determinant2x2(a2, a3, b2, b3);\n var e1 = -determinant2x2(b1, b3, c1, c3);\n var e2 = +determinant2x2(a1, a3, c1, c3);\n var e3 = -determinant2x2(a1, a3, b1, b3);\n var f1 = +determinant2x2(b1, b2, c1, c2);\n var f2 = -determinant2x2(a1, a2, c1, c2);\n var f3 = +determinant2x2(a1, a2, b1, b2); // Divide by the determinant\n\n var det = a1 * d1 + b1 * d2 + c1 * d3;\n\n if (det === 0) {\n vtkWarningMacro('Matrix has 0 determinant');\n }\n\n outI_3x3[0] = d1 / det;\n outI_3x3[3] = d2 / det;\n outI_3x3[6] = d3 / det;\n outI_3x3[1] = e1 / det;\n outI_3x3[4] = e2 / det;\n outI_3x3[7] = e3 / det;\n outI_3x3[2] = f1 / det;\n outI_3x3[5] = f2 / det;\n outI_3x3[8] = f3 / det;\n}\nfunction determinant3x3(mat_3x3) {\n return mat_3x3[0] * mat_3x3[4] * mat_3x3[8] + mat_3x3[3] * mat_3x3[7] * mat_3x3[2] + mat_3x3[6] * mat_3x3[1] * mat_3x3[5] - mat_3x3[0] * mat_3x3[7] * mat_3x3[5] - mat_3x3[3] * mat_3x3[1] * mat_3x3[8] - mat_3x3[6] * mat_3x3[4] * mat_3x3[2];\n}\n/**\n * Returns true if elements of both arrays are equals.\n * @param {Array} a an array of numbers (vector, point, matrix...)\n * @param {Array} b an array of numbers (vector, point, matrix...)\n * @param {Number} eps tolerance\n */\n\nfunction areEquals(a, b) {\n var eps = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : EPSILON;\n\n if (a.length !== b.length) {\n return false;\n }\n\n function isEqual(element, index) {\n return Math.abs(element - b[index]) <= eps;\n }\n\n return a.every(isEqual);\n}\nvar areMatricesEqual = areEquals;\nfunction identity3x3(mat_3x3) {\n for (var i = 0; i < 3; i++) {\n /* eslint-disable-next-line no-multi-assign */\n mat_3x3[i * 3] = mat_3x3[i * 3 + 1] = mat_3x3[i * 3 + 2] = 0;\n mat_3x3[i * 3 + i] = 1;\n }\n}\nfunction identity(n, mat) {\n for (var i = 0; i < n; i++) {\n for (var j = 0; j < n; j++) {\n mat[i * n + j] = 0;\n }\n\n mat[i * n + i] = 1;\n }\n\n return mat;\n}\nfunction isIdentity(mat) {\n var eps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : EPSILON;\n return areMatricesEqual(mat, IDENTITY, eps);\n}\nfunction isIdentity3x3(mat) {\n var eps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : EPSILON;\n return areMatricesEqual(mat, IDENTITY_3X3, eps);\n}\nfunction quaternionToMatrix3x3(quat_4, mat_3x3) {\n var ww = quat_4[0] * quat_4[0];\n var wx = quat_4[0] * quat_4[1];\n var wy = quat_4[0] * quat_4[2];\n var wz = quat_4[0] * quat_4[3];\n var xx = quat_4[1] * quat_4[1];\n var yy = quat_4[2] * quat_4[2];\n var zz = quat_4[3] * quat_4[3];\n var xy = quat_4[1] * quat_4[2];\n var xz = quat_4[1] * quat_4[3];\n var yz = quat_4[2] * quat_4[3];\n var rr = xx + yy + zz; // normalization factor, just in case quaternion was not normalized\n\n var f = 1 / (ww + rr);\n var s = (ww - rr) * f;\n f *= 2;\n mat_3x3[0] = xx * f + s;\n mat_3x3[3] = (xy + wz) * f;\n mat_3x3[6] = (xz - wy) * f;\n mat_3x3[1] = (xy - wz) * f;\n mat_3x3[4] = yy * f + s;\n mat_3x3[7] = (yz + wx) * f;\n mat_3x3[2] = (xz + wy) * f;\n mat_3x3[5] = (yz - wx) * f;\n mat_3x3[8] = zz * f + s;\n}\nfunction roundNumber(num) {\n var digits = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\n if (!\"\".concat(num).includes('e')) {\n return +\"\".concat(Math.round(\"\".concat(num, \"e+\").concat(digits)), \"e-\").concat(digits);\n }\n\n var arr = \"\".concat(num).split('e');\n var sig = '';\n\n if (+arr[1] + digits > 0) {\n sig = '+';\n }\n\n return +\"\".concat(Math.round(\"\".concat(+arr[0], \"e\").concat(sig).concat(+arr[1] + digits)), \"e-\").concat(digits);\n}\nfunction roundVector(vector) {\n var out = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [0, 0, 0];\n var digits = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n out[0] = roundNumber(vector[0], digits);\n out[1] = roundNumber(vector[1], digits);\n out[2] = roundNumber(vector[2], digits);\n return out;\n}\nfunction jacobiN(a, n, w, v) {\n var i;\n var j;\n var k;\n var iq;\n var ip;\n var numPos;\n var tresh;\n var theta;\n var t;\n var tau;\n var sm;\n var s;\n var h;\n var g;\n var c;\n var tmp;\n var b = createArray(n);\n var z = createArray(n);\n\n var vtkROTATE = function vtkROTATE(aa, ii, jj) {\n g = aa[ii];\n h = aa[jj];\n aa[ii] = g - s * (h + g * tau);\n aa[jj] = h + s * (g - h * tau);\n }; // initialize\n\n\n identity(n, v);\n\n for (ip = 0; ip < n; ip++) {\n b[ip] = w[ip] = a[ip + ip * n];\n z[ip] = 0.0;\n } // begin rotation sequence\n\n\n for (i = 0; i < VTK_MAX_ROTATIONS; i++) {\n sm = 0.0;\n\n for (ip = 0; ip < n - 1; ip++) {\n for (iq = ip + 1; iq < n; iq++) {\n sm += Math.abs(a[ip * n + iq]);\n }\n }\n\n if (sm === 0.0) {\n break;\n } // first 3 sweeps\n\n\n if (i < 3) {\n tresh = 0.2 * sm / (n * n);\n } else {\n tresh = 0.0;\n }\n\n for (ip = 0; ip < n - 1; ip++) {\n for (iq = ip + 1; iq < n; iq++) {\n g = 100.0 * Math.abs(a[ip * n + iq]); // after 4 sweeps\n\n if (i > 3 && Math.abs(w[ip]) + g === Math.abs(w[ip]) && Math.abs(w[iq]) + g === Math.abs(w[iq])) {\n a[ip * n + iq] = 0.0;\n } else if (Math.abs(a[ip * n + iq]) > tresh) {\n h = w[iq] - w[ip];\n\n if (Math.abs(h) + g === Math.abs(h)) {\n t = a[ip * n + iq] / h;\n } else {\n theta = 0.5 * h / a[ip * n + iq];\n t = 1.0 / (Math.abs(theta) + Math.sqrt(1.0 + theta * theta));\n\n if (theta < 0.0) {\n t = -t;\n }\n }\n\n c = 1.0 / Math.sqrt(1 + t * t);\n s = t * c;\n tau = s / (1.0 + c);\n h = t * a[ip * n + iq];\n z[ip] -= h;\n z[iq] += h;\n w[ip] -= h;\n w[iq] += h;\n a[ip * n + iq] = 0.0; // ip already shifted left by 1 unit\n\n for (j = 0; j <= ip - 1; j++) {\n vtkROTATE(a, j * n + ip, j * n + iq);\n } // ip and iq already shifted left by 1 unit\n\n\n for (j = ip + 1; j <= iq - 1; j++) {\n vtkROTATE(a, ip * n + j, j * n + iq);\n } // iq already shifted left by 1 unit\n\n\n for (j = iq + 1; j < n; j++) {\n vtkROTATE(a, ip * n + j, iq * n + j);\n }\n\n for (j = 0; j < n; j++) {\n vtkROTATE(v, j * n + ip, j * n + iq);\n }\n }\n }\n }\n\n for (ip = 0; ip < n; ip++) {\n b[ip] += z[ip];\n w[ip] = b[ip];\n z[ip] = 0.0;\n }\n } // this is NEVER called\n\n\n if (i >= VTK_MAX_ROTATIONS) {\n vtkWarningMacro('vtkMath::Jacobi: Error extracting eigenfunctions');\n return 0;\n } // sort eigenfunctions: these changes do not affect accuracy\n\n\n for (j = 0; j < n - 1; j++) {\n // boundary incorrect\n k = j;\n tmp = w[k];\n\n for (i = j + 1; i < n; i++) {\n // boundary incorrect, shifted already\n if (w[i] >= tmp || Math.abs(w[i] - tmp) < VTK_SMALL_NUMBER) {\n // why exchange if same?\n k = i;\n tmp = w[k];\n }\n }\n\n if (k !== j) {\n w[k] = w[j];\n w[j] = tmp;\n swapColumnsMatrix_nxn(v, n, j, k);\n }\n } // ensure eigenvector consistency (i.e., Jacobi can compute vectors that\n // are negative of one another (.707,.707,0) and (-.707,-.707,0). This can\n // reek havoc in hyperstreamline/other stuff. We will select the most\n // positive eigenvector.\n\n\n var ceil_half_n = (n >> 1) + (n & 1);\n\n for (numPos = 0, i = 0; i < n * n; i++) {\n if (v[i] >= 0.0) {\n numPos++;\n }\n } // if ( numPos < ceil(double(n)/double(2.0)) )\n\n\n if (numPos < ceil_half_n) {\n for (i = 0; i < n; i++) {\n v[i * n + j] *= -1.0;\n }\n }\n\n return 1;\n}\nfunction matrix3x3ToQuaternion(mat_3x3, quat_4) {\n var tmp = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; // on-diagonal elements\n\n tmp[0] = mat_3x3[0] + mat_3x3[4] + mat_3x3[8];\n tmp[5] = mat_3x3[0] - mat_3x3[4] - mat_3x3[8];\n tmp[10] = -mat_3x3[0] + mat_3x3[4] - mat_3x3[8];\n tmp[15] = -mat_3x3[0] - mat_3x3[4] + mat_3x3[8]; // off-diagonal elements\n\n tmp[1] = tmp[4] = mat_3x3[7] - mat_3x3[5];\n tmp[2] = tmp[8] = mat_3x3[2] - mat_3x3[6];\n tmp[3] = tmp[12] = mat_3x3[3] - mat_3x3[1];\n tmp[6] = tmp[9] = mat_3x3[3] + mat_3x3[1];\n tmp[7] = tmp[13] = mat_3x3[2] + mat_3x3[6];\n tmp[11] = tmp[14] = mat_3x3[7] + mat_3x3[5];\n var eigenvectors = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];\n var eigenvalues = [0, 0, 0, 0]; // convert into format that JacobiN can use,\n // then use Jacobi to find eigenvalues and eigenvectors\n // tmp is copied because jacobiN may modify it\n\n var NTemp = [].concat(tmp);\n jacobiN(NTemp, 4, eigenvalues, eigenvectors); // the first eigenvector is the one we want\n\n quat_4[0] = eigenvectors[0];\n quat_4[1] = eigenvectors[4];\n quat_4[2] = eigenvectors[8];\n quat_4[3] = eigenvectors[12];\n}\nfunction multiplyQuaternion(quat_1, quat_2, quat_out) {\n var ww = quat_1[0] * quat_2[0];\n var wx = quat_1[0] * quat_2[1];\n var wy = quat_1[0] * quat_2[2];\n var wz = quat_1[0] * quat_2[3];\n var xw = quat_1[1] * quat_2[0];\n var xx = quat_1[1] * quat_2[1];\n var xy = quat_1[1] * quat_2[2];\n var xz = quat_1[1] * quat_2[3];\n var yw = quat_1[2] * quat_2[0];\n var yx = quat_1[2] * quat_2[1];\n var yy = quat_1[2] * quat_2[2];\n var yz = quat_1[2] * quat_2[3];\n var zw = quat_1[3] * quat_2[0];\n var zx = quat_1[3] * quat_2[1];\n var zy = quat_1[3] * quat_2[2];\n var zz = quat_1[3] * quat_2[3];\n quat_out[0] = ww - xx - yy - zz;\n quat_out[1] = wx + xw + yz - zy;\n quat_out[2] = wy - xz + yw + zx;\n quat_out[3] = wz + xy - yx + zw;\n}\nfunction orthogonalize3x3(a_3x3, out_3x3) {\n // copy the matrix\n for (var i = 0; i < 9; i++) {\n out_3x3[i] = a_3x3[i];\n } // Pivot the matrix to improve accuracy\n\n\n var scale = createArray(3);\n var index = createArray(3);\n var largest; // Loop over rows to get implicit scaling information\n\n for (var _i = 0; _i < 3; _i++) {\n var _x = Math.abs(out_3x3[_i * 3]);\n\n var _x2 = Math.abs(out_3x3[_i * 3 + 1]);\n\n var _x3 = Math.abs(out_3x3[_i * 3 + 2]);\n\n largest = _x2 > _x ? _x2 : _x;\n largest = _x3 > largest ? _x3 : largest;\n scale[_i] = 1;\n\n if (largest !== 0) {\n scale[_i] /= largest;\n }\n } // first column\n\n\n var x1 = Math.abs(out_3x3[0]) * scale[0];\n var x2 = Math.abs(out_3x3[3]) * scale[1];\n var x3 = Math.abs(out_3x3[6]) * scale[2];\n index[0] = 0;\n largest = x1;\n\n if (x2 >= largest) {\n largest = x2;\n index[0] = 1;\n }\n\n if (x3 >= largest) {\n index[0] = 2;\n }\n\n if (index[0] !== 0) {\n // swap vectors\n swapColumnsMatrix_nxn(out_3x3, 3, index[0], 0);\n scale[index[0]] = scale[0];\n } // second column\n\n\n var y2 = Math.abs(out_3x3[4]) * scale[1];\n var y3 = Math.abs(out_3x3[7]) * scale[2];\n index[1] = 1;\n largest = y2;\n\n if (y3 >= largest) {\n index[1] = 2; // swap vectors\n\n swapColumnsMatrix_nxn(out_3x3, 3, 1, 2);\n } // third column\n\n\n index[2] = 2; // A quaternion can only describe a pure rotation, not\n // a rotation with a flip, therefore the flip must be\n // removed before the matrix is converted to a quaternion.\n\n var flip = 0;\n\n if (determinant3x3(out_3x3) < 0) {\n flip = 1;\n\n for (var _i2 = 0; _i2 < 9; _i2++) {\n out_3x3[_i2] = -out_3x3[_i2];\n }\n } // Do orthogonalization using a quaternion intermediate\n // (this, essentially, does the orthogonalization via\n // diagonalization of an appropriately constructed symmetric\n // 4x4 matrix rather than by doing SVD of the 3x3 matrix)\n\n\n var quat = createArray(4);\n matrix3x3ToQuaternion(out_3x3, quat);\n quaternionToMatrix3x3(quat, out_3x3); // Put the flip back into the orthogonalized matrix.\n\n if (flip) {\n for (var _i3 = 0; _i3 < 9; _i3++) {\n out_3x3[_i3] = -out_3x3[_i3];\n }\n } // Undo the pivoting\n\n\n if (index[1] !== 1) {\n swapColumnsMatrix_nxn(out_3x3, 3, index[1], 1);\n }\n\n if (index[0] !== 0) {\n swapColumnsMatrix_nxn(out_3x3, 3, index[0], 0);\n }\n}\nfunction diagonalize3x3(a_3x3, w_3, v_3x3) {\n var i;\n var j;\n var k;\n var maxI;\n var tmp;\n var maxVal; // a is copied because jacobiN may modify it\n\n var copyA = _toConsumableArray(a_3x3); // diagonalize using Jacobi\n\n\n jacobiN(copyA, 3, w_3, v_3x3); // if all the eigenvalues are the same, return identity matrix\n\n if (w_3[0] === w_3[1] && w_3[0] === w_3[2]) {\n identity3x3(v_3x3);\n return;\n } // transpose temporarily, it makes it easier to sort the eigenvectors\n\n\n transpose3x3(v_3x3, v_3x3); // if two eigenvalues are the same, re-orthogonalize to optimally line\n // up the eigenvectors with the x, y, and z axes\n\n for (i = 0; i < 3; i++) {\n // two eigenvalues are the same\n if (w_3[(i + 1) % 3] === w_3[(i + 2) % 3]) {\n // find maximum element of the independent eigenvector\n maxVal = Math.abs(v_3x3[i * 3]);\n maxI = 0;\n\n for (j = 1; j < 3; j++) {\n if (maxVal < (tmp = Math.abs(v_3x3[i * 3 + j]))) {\n maxVal = tmp;\n maxI = j;\n }\n } // swap the eigenvector into its proper position\n\n\n if (maxI !== i) {\n tmp = w_3[maxI];\n w_3[maxI] = w_3[i];\n w_3[i] = tmp;\n swapRowsMatrix_nxn(v_3x3, 3, i, maxI);\n } // maximum element of eigenvector should be positive\n\n\n if (v_3x3[maxI * 3 + maxI] < 0) {\n v_3x3[maxI * 3] = -v_3x3[maxI * 3];\n v_3x3[maxI * 3 + 1] = -v_3x3[maxI * 3 + 1];\n v_3x3[maxI * 3 + 2] = -v_3x3[maxI * 3 + 2];\n } // re-orthogonalize the other two eigenvectors\n\n\n j = (maxI + 1) % 3;\n k = (maxI + 2) % 3;\n v_3x3[j * 3] = 0.0;\n v_3x3[j * 3 + 1] = 0.0;\n v_3x3[j * 3 + 2] = 0.0;\n v_3x3[j * 3 + j] = 1.0;\n var vectTmp1 = cross([v_3x3[maxI * 3], v_3x3[maxI * 3 + 1], v_3x3[maxI * 3 + 2]], [v_3x3[j * 3], v_3x3[j * 3 + 1], v_3x3[j * 3 + 2]], []);\n normalize(vectTmp1);\n var vectTmp2 = cross(vectTmp1, [v_3x3[maxI * 3], v_3x3[maxI * 3 + 1], v_3x3[maxI * 3 + 2]], []);\n\n for (var t = 0; t < 3; t++) {\n v_3x3[k * 3 + t] = vectTmp1[t];\n v_3x3[j * 3 + t] = vectTmp2[t];\n } // transpose vectors back to columns\n\n\n transpose3x3(v_3x3, v_3x3);\n return;\n }\n } // the three eigenvalues are different, just sort the eigenvectors\n // to align them with the x, y, and z axes\n // find the vector with the largest x element, make that vector\n // the first vector\n\n\n maxVal = Math.abs(v_3x3[0]);\n maxI = 0;\n\n for (i = 1; i < 3; i++) {\n if (maxVal < (tmp = Math.abs(v_3x3[i * 3]))) {\n maxVal = tmp;\n maxI = i;\n }\n } // swap eigenvalue and eigenvector\n\n\n if (maxI !== 0) {\n var eigenValTmp = w_3[maxI];\n w_3[maxI] = w_3[0];\n w_3[0] = eigenValTmp;\n swapRowsMatrix_nxn(v_3x3, 3, maxI, 0);\n } // do the same for the y element\n\n\n if (Math.abs(v_3x3[4]) < Math.abs(v_3x3[7])) {\n var _eigenValTmp = w_3[2];\n w_3[2] = w_3[1];\n w_3[1] = _eigenValTmp;\n swapRowsMatrix_nxn(v_3x3, 3, 1, 2);\n } // ensure that the sign of the eigenvectors is correct\n\n\n for (i = 0; i < 2; i++) {\n if (v_3x3[i * 3 + i] < 0) {\n v_3x3[i * 3] = -v_3x3[i * 3];\n v_3x3[i * 3 + 1] = -v_3x3[i * 3 + 1];\n v_3x3[i * 3 + 2] = -v_3x3[i * 3 + 2];\n }\n } // set sign of final eigenvector to ensure that determinant is positive\n\n\n if (determinant3x3(v_3x3) < 0) {\n v_3x3[6] = -v_3x3[6];\n v_3x3[7] = -v_3x3[7];\n v_3x3[8] = -v_3x3[8];\n } // transpose the eigenvectors back again\n\n\n transpose3x3(v_3x3, v_3x3);\n}\nfunction singularValueDecomposition3x3(a_3x3, u_3x3, w_3, vT_3x3) {\n var i; // copy so that A can be used for U or VT without risk\n\n var B = _toConsumableArray(a_3x3); // temporarily flip if determinant is negative\n\n\n var d = determinant3x3(B);\n\n if (d < 0) {\n for (i = 0; i < 9; i++) {\n B[i] = -B[i];\n }\n } // orthogonalize, diagonalize, etc.\n\n\n orthogonalize3x3(B, u_3x3);\n transpose3x3(B, B);\n multiply3x3_mat3(B, u_3x3, vT_3x3);\n diagonalize3x3(vT_3x3, w_3, vT_3x3);\n multiply3x3_mat3(u_3x3, vT_3x3, u_3x3);\n transpose3x3(vT_3x3, vT_3x3); // re-create the flip\n\n if (d < 0) {\n w_3[0] = -w_3[0];\n w_3[1] = -w_3[1];\n w_3[2] = -w_3[2];\n }\n}\n/**\n * Factor linear equations Ax = b using LU decomposition A = LU. Output factorization LU is in matrix A.\n * @param {Matrix} A square matrix\n * @param {Number} index integer array of pivot indices index[0->n-1]\n * @param {Number} size matrix size\n */\n\nfunction luFactorLinearSystem(A, index, size) {\n var i;\n var j;\n var k;\n var largest;\n var maxI = 0;\n var sum;\n var temp1;\n var temp2;\n var scale = createArray(size); //\n // Loop over rows to get implicit scaling information\n //\n\n for (i = 0; i < size; i++) {\n for (largest = 0.0, j = 0; j < size; j++) {\n if ((temp2 = Math.abs(A[i * size + j])) > largest) {\n largest = temp2;\n }\n }\n\n if (largest === 0.0) {\n vtkWarningMacro('Unable to factor linear system');\n return 0;\n }\n\n scale[i] = 1.0 / largest;\n } //\n // Loop over all columns using Crout's method\n //\n\n\n for (j = 0; j < size; j++) {\n for (i = 0; i < j; i++) {\n sum = A[i * size + j];\n\n for (k = 0; k < i; k++) {\n sum -= A[i * size + k] * A[k * size + j];\n }\n\n A[i * size + j] = sum;\n } //\n // Begin search for largest pivot element\n //\n\n\n for (largest = 0.0, i = j; i < size; i++) {\n sum = A[i * size + j];\n\n for (k = 0; k < j; k++) {\n sum -= A[i * size + k] * A[k * size + j];\n }\n\n A[i * size + j] = sum;\n\n if ((temp1 = scale[i] * Math.abs(sum)) >= largest) {\n largest = temp1;\n maxI = i;\n }\n } //\n // Check for row interchange\n //\n\n\n if (j !== maxI) {\n for (k = 0; k < size; k++) {\n temp1 = A[maxI * size + k];\n A[maxI * size + k] = A[j * size + k];\n A[j * size + k] = temp1;\n }\n\n scale[maxI] = scale[j];\n } //\n // Divide by pivot element and perform elimination\n //\n\n\n index[j] = maxI;\n\n if (Math.abs(A[j * size + j]) <= VTK_SMALL_NUMBER) {\n vtkWarningMacro('Unable to factor linear system');\n return 0;\n }\n\n if (j !== size - 1) {\n temp1 = 1.0 / A[j * size + j];\n\n for (i = j + 1; i < size; i++) {\n A[i * size + j] *= temp1;\n }\n }\n }\n\n return 1;\n}\nfunction luSolveLinearSystem(A, index, x, size) {\n var i;\n var j;\n var ii;\n var idx;\n var sum; //\n // Proceed with forward and backsubstitution for L and U\n // matrices. First, forward substitution.\n //\n\n for (ii = -1, i = 0; i < size; i++) {\n idx = index[i];\n sum = x[idx];\n x[idx] = x[i];\n\n if (ii >= 0) {\n for (j = ii; j <= i - 1; j++) {\n sum -= A[i * size + j] * x[j];\n }\n } else if (sum !== 0.0) {\n ii = i;\n }\n\n x[i] = sum;\n } //\n // Now, back substitution\n //\n\n\n for (i = size - 1; i >= 0; i--) {\n sum = x[i];\n\n for (j = i + 1; j < size; j++) {\n sum -= A[i * size + j] * x[j];\n }\n\n x[i] = sum / A[i * size + i];\n }\n}\nfunction solveLinearSystem(A, x, size) {\n // if we solving something simple, just solve it\n if (size === 2) {\n var y = createArray(2);\n var det = determinant2x2(A[0], A[1], A[2], A[3]);\n\n if (det === 0.0) {\n // Unable to solve linear system\n return 0;\n }\n\n y[0] = (A[3] * x[0] - A[1] * x[1]) / det;\n y[1] = (-(A[2] * x[0]) + A[0] * x[1]) / det;\n x[0] = y[0];\n x[1] = y[1];\n return 1;\n }\n\n if (size === 1) {\n if (A[0] === 0.0) {\n // Unable to solve linear system\n return 0;\n }\n\n x[0] /= A[0];\n return 1;\n } //\n // System of equations is not trivial, use Crout's method\n //\n // Check on allocation of working vectors\n\n\n var index = createArray(size); // Factor and solve matrix\n\n if (luFactorLinearSystem(A, index, size) === 0) {\n return 0;\n }\n\n luSolveLinearSystem(A, index, x, size);\n return 1;\n} // Note that A is modified during the inversion !\n\nfunction invertMatrix(A, AI, size) {\n var index = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\n var column = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null;\n var tmp1Size = index || createArray(size);\n var tmp2Size = column || createArray(size); // Factor matrix; then begin solving for inverse one column at a time.\n // Note: tmp1Size returned value is used later, tmp2Size is just working\n // memory whose values are not used in LUSolveLinearSystem\n\n if (luFactorLinearSystem(A, tmp1Size, size) === 0) {\n return null;\n }\n\n for (var j = 0; j < size; j++) {\n for (var i = 0; i < size; i++) {\n tmp2Size[i] = 0.0;\n }\n\n tmp2Size[j] = 1.0;\n luSolveLinearSystem(A, tmp1Size, tmp2Size, size);\n\n for (var _i4 = 0; _i4 < size; _i4++) {\n AI[_i4 * size + j] = tmp2Size[_i4];\n }\n }\n\n return AI;\n}\nfunction estimateMatrixCondition(A, size) {\n var minValue = +Number.MAX_VALUE;\n var maxValue = -Number.MAX_VALUE; // find the maximum value\n\n for (var i = 0; i < size; i++) {\n for (var j = i; j < size; j++) {\n if (Math.abs(A[i * size + j]) > maxValue) {\n maxValue = Math.abs(A[i * size + j]);\n }\n }\n } // find the minimum diagonal value\n\n\n for (var _i5 = 0; _i5 < size; _i5++) {\n if (Math.abs(A[_i5 * size + _i5]) < minValue) {\n minValue = Math.abs(A[_i5 * size + _i5]);\n }\n }\n\n if (minValue === 0.0) {\n return Number.MAX_VALUE;\n }\n\n return maxValue / minValue;\n}\nfunction jacobi(a_3x3, w, v) {\n return jacobiN(a_3x3, 3, w, v);\n}\nfunction solveHomogeneousLeastSquares(numberOfSamples, xt, xOrder, mt) {\n // check dimensional consistency\n if (numberOfSamples < xOrder) {\n vtkWarningMacro('Insufficient number of samples. Underdetermined.');\n return 0;\n }\n\n var i;\n var j;\n var k; // set up intermediate variables\n // Allocate matrix to hold X times transpose of X\n\n var XXt = createArray(xOrder * xOrder); // size x by x\n // Allocate the array of eigenvalues and eigenvectors\n\n var eigenvals = createArray(xOrder);\n var eigenvecs = createArray(xOrder * xOrder); // Calculate XXt upper half only, due to symmetry\n\n for (k = 0; k < numberOfSamples; k++) {\n for (i = 0; i < xOrder; i++) {\n for (j = i; j < xOrder; j++) {\n XXt[i * xOrder + j] += xt[k * xOrder + i] * xt[k * xOrder + j];\n }\n }\n } // now fill in the lower half of the XXt matrix\n\n\n for (i = 0; i < xOrder; i++) {\n for (j = 0; j < i; j++) {\n XXt[i * xOrder + j] = XXt[j * xOrder + i];\n }\n } // Compute the eigenvectors and eigenvalues\n\n\n jacobiN(XXt, xOrder, eigenvals, eigenvecs); // Smallest eigenval is at the end of the list (xOrder-1), and solution is\n // corresponding eigenvec.\n\n for (i = 0; i < xOrder; i++) {\n mt[i] = eigenvecs[i * xOrder + xOrder - 1];\n }\n\n return 1;\n}\nfunction solveLeastSquares(numberOfSamples, xt, xOrder, yt, yOrder, mt) {\n var checkHomogeneous = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : true;\n\n // check dimensional consistency\n if (numberOfSamples < xOrder || numberOfSamples < yOrder) {\n vtkWarningMacro('Insufficient number of samples. Underdetermined.');\n return 0;\n }\n\n var homogenFlags = createArray(yOrder);\n var allHomogeneous = 1;\n var hmt;\n var homogRC = 0;\n var i;\n var j;\n var k;\n var someHomogeneous = 0; // Ok, first init some flags check and see if all the systems are homogeneous\n\n if (checkHomogeneous) {\n // If Y' is zero, it's a homogeneous system and can't be solved via\n // the pseudoinverse method. Detect this case, warn the user, and\n // invoke SolveHomogeneousLeastSquares instead. Note that it doesn't\n // really make much sense for yOrder to be greater than one in this case,\n // since that's just yOrder occurrences of a 0 vector on the RHS, but\n // we allow it anyway. N\n // Initialize homogeneous flags on a per-right-hand-side basis\n for (j = 0; j < yOrder; j++) {\n homogenFlags[j] = 1;\n }\n\n for (i = 0; i < numberOfSamples; i++) {\n for (j = 0; j < yOrder; j++) {\n if (Math.abs(yt[i * yOrder + j]) > VTK_SMALL_NUMBER) {\n allHomogeneous = 0;\n homogenFlags[j] = 0;\n }\n }\n } // If we've got one system, and it's homogeneous, do it and bail out quickly.\n\n\n if (allHomogeneous && yOrder === 1) {\n vtkWarningMacro('Detected homogeneous system (Y=0), calling SolveHomogeneousLeastSquares()');\n return solveHomogeneousLeastSquares(numberOfSamples, xt, xOrder, mt);\n } // Ok, we've got more than one system of equations.\n // Figure out if we need to calculate the homogeneous equation solution for\n // any of them.\n\n\n if (allHomogeneous) {\n someHomogeneous = 1;\n } else {\n for (j = 0; j < yOrder; j++) {\n if (homogenFlags[j]) {\n someHomogeneous = 1;\n }\n }\n }\n } // If necessary, solve the homogeneous problem\n\n\n if (someHomogeneous) {\n // hmt is the homogeneous equation version of mt, the general solution.\n // hmt should be xOrder x yOrder, but since we are solving only the homogeneous part, here it is xOrder x 1\n hmt = createArray(xOrder); // Ok, solve the homogeneous problem\n\n homogRC = solveHomogeneousLeastSquares(numberOfSamples, xt, xOrder, hmt);\n } // set up intermediate variables\n\n\n var XXt = createArray(xOrder * xOrder); // size x by x\n\n var XXtI = createArray(xOrder * xOrder); // size x by x\n\n var XYt = createArray(xOrder * yOrder); // size x by y\n // first find the pseudoinverse matrix\n\n for (k = 0; k < numberOfSamples; k++) {\n for (i = 0; i < xOrder; i++) {\n // first calculate the XXt matrix, only do the upper half (symmetrical)\n for (j = i; j < xOrder; j++) {\n XXt[i * xOrder + j] += xt[k * xOrder + i] * xt[k * xOrder + j];\n } // now calculate the XYt matrix\n\n\n for (j = 0; j < yOrder; j++) {\n XYt[i * yOrder + j] += xt[k * xOrder + i] * yt[k * yOrder + j];\n }\n }\n } // now fill in the lower half of the XXt matrix\n\n\n for (i = 0; i < xOrder; i++) {\n for (j = 0; j < i; j++) {\n XXt[i * xOrder + j] = XXt[j * xOrder + i];\n }\n }\n\n var successFlag = invertMatrix(XXt, XXtI, xOrder); // next get the inverse of XXt\n\n if (successFlag) {\n for (i = 0; i < xOrder; i++) {\n for (j = 0; j < yOrder; j++) {\n mt[i * yOrder + j] = 0.0;\n\n for (k = 0; k < xOrder; k++) {\n mt[i * yOrder + j] += XXtI[i * xOrder + k] * XYt[k * yOrder + j];\n }\n }\n }\n } // Fix up any of the solutions that correspond to the homogeneous equation\n // problem.\n\n\n if (someHomogeneous) {\n for (j = 0; j < yOrder; j++) {\n if (homogenFlags[j]) {\n // Fix this one\n for (i = 0; i < xOrder; i++) {\n mt[i * yOrder + j] = hmt[i * yOrder];\n }\n }\n }\n }\n\n if (someHomogeneous) {\n return homogRC && successFlag;\n }\n\n return successFlag;\n}\nfunction hex2float(hexStr) {\n var outFloatArray = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [0, 0.5, 1];\n\n switch (hexStr.length) {\n case 3:\n // abc => #aabbcc\n outFloatArray[0] = parseInt(hexStr[0], 16) * 17 / 255;\n outFloatArray[1] = parseInt(hexStr[1], 16) * 17 / 255;\n outFloatArray[2] = parseInt(hexStr[2], 16) * 17 / 255;\n return outFloatArray;\n\n case 4:\n // #abc => #aabbcc\n outFloatArray[0] = parseInt(hexStr[1], 16) * 17 / 255;\n outFloatArray[1] = parseInt(hexStr[2], 16) * 17 / 255;\n outFloatArray[2] = parseInt(hexStr[3], 16) * 17 / 255;\n return outFloatArray;\n\n case 6:\n // ab01df => #ab01df\n outFloatArray[0] = parseInt(hexStr.substr(0, 2), 16) / 255;\n outFloatArray[1] = parseInt(hexStr.substr(2, 2), 16) / 255;\n outFloatArray[2] = parseInt(hexStr.substr(4, 2), 16) / 255;\n return outFloatArray;\n\n case 7:\n // #ab01df\n outFloatArray[0] = parseInt(hexStr.substr(1, 2), 16) / 255;\n outFloatArray[1] = parseInt(hexStr.substr(3, 2), 16) / 255;\n outFloatArray[2] = parseInt(hexStr.substr(5, 2), 16) / 255;\n return outFloatArray;\n\n case 9:\n // #ab01df00\n outFloatArray[0] = parseInt(hexStr.substr(1, 2), 16) / 255;\n outFloatArray[1] = parseInt(hexStr.substr(3, 2), 16) / 255;\n outFloatArray[2] = parseInt(hexStr.substr(5, 2), 16) / 255;\n outFloatArray[3] = parseInt(hexStr.substr(7, 2), 16) / 255;\n return outFloatArray;\n\n default:\n return outFloatArray;\n }\n}\nfunction rgb2hsv(rgb, hsv) {\n var h;\n var s;\n\n var _rgb = _slicedToArray(rgb, 3),\n r = _rgb[0],\n g = _rgb[1],\n b = _rgb[2];\n\n var onethird = 1.0 / 3.0;\n var onesixth = 1.0 / 6.0;\n var twothird = 2.0 / 3.0;\n var cmax = r;\n var cmin = r;\n\n if (g > cmax) {\n cmax = g;\n } else if (g < cmin) {\n cmin = g;\n }\n\n if (b > cmax) {\n cmax = b;\n } else if (b < cmin) {\n cmin = b;\n }\n\n var v = cmax;\n\n if (v > 0.0) {\n s = (cmax - cmin) / cmax;\n } else {\n s = 0.0;\n }\n\n if (s > 0) {\n if (r === cmax) {\n h = onesixth * (g - b) / (cmax - cmin);\n } else if (g === cmax) {\n h = onethird + onesixth * (b - r) / (cmax - cmin);\n } else {\n h = twothird + onesixth * (r - g) / (cmax - cmin);\n }\n\n if (h < 0.0) {\n h += 1.0;\n }\n } else {\n h = 0.0;\n } // Set the values back to the array\n\n\n hsv[0] = h;\n hsv[1] = s;\n hsv[2] = v;\n}\nfunction hsv2rgb(hsv, rgb) {\n var _hsv = _slicedToArray(hsv, 3),\n h = _hsv[0],\n s = _hsv[1],\n v = _hsv[2];\n\n var onethird = 1.0 / 3.0;\n var onesixth = 1.0 / 6.0;\n var twothird = 2.0 / 3.0;\n var fivesixth = 5.0 / 6.0;\n var r;\n var g;\n var b; // compute RGB from HSV\n\n if (h > onesixth && h <= onethird) {\n // green/red\n g = 1.0;\n r = (onethird - h) / onesixth;\n b = 0.0;\n } else if (h > onethird && h <= 0.5) {\n // green/blue\n g = 1.0;\n b = (h - onethird) / onesixth;\n r = 0.0;\n } else if (h > 0.5 && h <= twothird) {\n // blue/green\n b = 1.0;\n g = (twothird - h) / onesixth;\n r = 0.0;\n } else if (h > twothird && h <= fivesixth) {\n // blue/red\n b = 1.0;\n r = (h - twothird) / onesixth;\n g = 0.0;\n } else if (h > fivesixth && h <= 1.0) {\n // red/blue\n r = 1.0;\n b = (1.0 - h) / onesixth;\n g = 0.0;\n } else {\n // red/green\n r = 1.0;\n g = h / onesixth;\n b = 0.0;\n } // add Saturation to the equation.\n\n\n r = s * r + (1.0 - s);\n g = s * g + (1.0 - s);\n b = s * b + (1.0 - s);\n r *= v;\n g *= v;\n b *= v; // Assign back to the array\n\n rgb[0] = r;\n rgb[1] = g;\n rgb[2] = b;\n}\nfunction lab2xyz(lab, xyz) {\n // LAB to XYZ\n var _lab = _slicedToArray(lab, 3),\n L = _lab[0],\n a = _lab[1],\n b = _lab[2];\n\n var var_Y = (L + 16) / 116;\n var var_X = a / 500 + var_Y;\n var var_Z = var_Y - b / 200;\n\n if (Math.pow(var_Y, 3) > 0.008856) {\n var_Y = Math.pow(var_Y, 3);\n } else {\n var_Y = (var_Y - 16.0 / 116.0) / 7.787;\n }\n\n if (Math.pow(var_X, 3) > 0.008856) {\n var_X = Math.pow(var_X, 3);\n } else {\n var_X = (var_X - 16.0 / 116.0) / 7.787;\n }\n\n if (Math.pow(var_Z, 3) > 0.008856) {\n var_Z = Math.pow(var_Z, 3);\n } else {\n var_Z = (var_Z - 16.0 / 116.0) / 7.787;\n }\n\n var ref_X = 0.9505;\n var ref_Y = 1.0;\n var ref_Z = 1.089;\n xyz[0] = ref_X * var_X; // ref_X = 0.9505 Observer= 2 deg Illuminant= D65\n\n xyz[1] = ref_Y * var_Y; // ref_Y = 1.000\n\n xyz[2] = ref_Z * var_Z; // ref_Z = 1.089\n}\nfunction xyz2lab(xyz, lab) {\n var _xyz = _slicedToArray(xyz, 3),\n x = _xyz[0],\n y = _xyz[1],\n z = _xyz[2];\n\n var ref_X = 0.9505;\n var ref_Y = 1.0;\n var ref_Z = 1.089;\n var var_X = x / ref_X; // ref_X = 0.9505 Observer= 2 deg, Illuminant= D65\n\n var var_Y = y / ref_Y; // ref_Y = 1.000\n\n var var_Z = z / ref_Z; // ref_Z = 1.089\n\n if (var_X > 0.008856) var_X = Math.pow(var_X, 1.0 / 3.0);else var_X = 7.787 * var_X + 16.0 / 116.0;\n if (var_Y > 0.008856) var_Y = Math.pow(var_Y, 1.0 / 3.0);else var_Y = 7.787 * var_Y + 16.0 / 116.0;\n if (var_Z > 0.008856) var_Z = Math.pow(var_Z, 1.0 / 3.0);else var_Z = 7.787 * var_Z + 16.0 / 116.0;\n lab[0] = 116 * var_Y - 16;\n lab[1] = 500 * (var_X - var_Y);\n lab[2] = 200 * (var_Y - var_Z);\n}\nfunction xyz2rgb(xyz, rgb) {\n var _xyz2 = _slicedToArray(xyz, 3),\n x = _xyz2[0],\n y = _xyz2[1],\n z = _xyz2[2];\n\n var r = x * 3.2406 + y * -1.5372 + z * -0.4986;\n var g = x * -0.9689 + y * 1.8758 + z * 0.0415;\n var b = x * 0.0557 + y * -0.204 + z * 1.057; // The following performs a \"gamma correction\" specified by the sRGB color\n // space. sRGB is defined by a canonical definition of a display monitor and\n // has been standardized by the International Electrotechnical Commission (IEC\n // 61966-2-1). The nonlinearity of the correction is designed to make the\n // colors more perceptually uniform. This color space has been adopted by\n // several applications including Adobe Photoshop and Microsoft Windows color\n // management. OpenGL is agnostic on its RGB color space, but it is reasonable\n // to assume it is close to this one.\n\n if (r > 0.0031308) r = 1.055 * Math.pow(r, 1 / 2.4) - 0.055;else r *= 12.92;\n if (g > 0.0031308) g = 1.055 * Math.pow(g, 1 / 2.4) - 0.055;else g *= 12.92;\n if (b > 0.0031308) b = 1.055 * Math.pow(b, 1 / 2.4) - 0.055;else b *= 12.92; // Clip colors. ideally we would do something that is perceptually closest\n // (since we can see colors outside of the display gamut), but this seems to\n // work well enough.\n\n var maxVal = r;\n if (maxVal < g) maxVal = g;\n if (maxVal < b) maxVal = b;\n\n if (maxVal > 1.0) {\n r /= maxVal;\n g /= maxVal;\n b /= maxVal;\n }\n\n if (r < 0) r = 0;\n if (g < 0) g = 0;\n if (b < 0) b = 0; // Push values back to array\n\n rgb[0] = r;\n rgb[1] = g;\n rgb[2] = b;\n}\nfunction rgb2xyz(rgb, xyz) {\n var _rgb2 = _slicedToArray(rgb, 3),\n r = _rgb2[0],\n g = _rgb2[1],\n b = _rgb2[2]; // The following performs a \"gamma correction\" specified by the sRGB color\n // space. sRGB is defined by a canonical definition of a display monitor and\n // has been standardized by the International Electrotechnical Commission (IEC\n // 61966-2-1). The nonlinearity of the correction is designed to make the\n // colors more perceptually uniform. This color space has been adopted by\n // several applications including Adobe Photoshop and Microsoft Windows color\n // management. OpenGL is agnostic on its RGB color space, but it is reasonable\n // to assume it is close to this one.\n\n\n if (r > 0.04045) r = Math.pow((r + 0.055) / 1.055, 2.4);else r /= 12.92;\n if (g > 0.04045) g = Math.pow((g + 0.055) / 1.055, 2.4);else g /= 12.92;\n if (b > 0.04045) b = Math.pow((b + 0.055) / 1.055, 2.4);else b /= 12.92; // Observer. = 2 deg, Illuminant = D65\n\n xyz[0] = r * 0.4124 + g * 0.3576 + b * 0.1805;\n xyz[1] = r * 0.2126 + g * 0.7152 + b * 0.0722;\n xyz[2] = r * 0.0193 + g * 0.1192 + b * 0.9505;\n}\nfunction rgb2lab(rgb, lab) {\n var xyz = [0, 0, 0];\n rgb2xyz(rgb, xyz);\n xyz2lab(xyz, lab);\n}\nfunction lab2rgb(lab, rgb) {\n var xyz = [0, 0, 0];\n lab2xyz(lab, xyz);\n xyz2rgb(xyz, rgb);\n}\nfunction uninitializeBounds(bounds) {\n bounds[0] = 1.0;\n bounds[1] = -1.0;\n bounds[2] = 1.0;\n bounds[3] = -1.0;\n bounds[4] = 1.0;\n bounds[5] = -1.0;\n return bounds;\n}\nfunction areBoundsInitialized(bounds) {\n return !(bounds[1] - bounds[0] < 0.0);\n}\n/**\n * @deprecated please use vtkBoundingBox.addPoints(vtkBoundingBox.reset([]), points)\n */\n\nfunction computeBoundsFromPoints(point1, point2, bounds) {\n bounds[0] = Math.min(point1[0], point2[0]);\n bounds[1] = Math.max(point1[0], point2[0]);\n bounds[2] = Math.min(point1[1], point2[1]);\n bounds[3] = Math.max(point1[1], point2[1]);\n bounds[4] = Math.min(point1[2], point2[2]);\n bounds[5] = Math.max(point1[2], point2[2]);\n return bounds;\n}\nfunction clampValue(value, minValue, maxValue) {\n if (value < minValue) {\n return minValue;\n }\n\n if (value > maxValue) {\n return maxValue;\n }\n\n return value;\n}\nfunction clampVector(vector, minVector, maxVector) {\n var out = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [0, 0, 0];\n out[0] = clampValue(vector[0], minVector[0], maxVector[0]);\n out[1] = clampValue(vector[1], minVector[1], maxVector[1]);\n out[2] = clampValue(vector[2], minVector[2], maxVector[2]);\n return out;\n}\nfunction clampAndNormalizeValue(value, range) {\n var result = 0;\n\n if (range[0] !== range[1]) {\n // clamp\n if (value < range[0]) {\n result = range[0];\n } else if (value > range[1]) {\n result = range[1];\n } else {\n result = value;\n } // normalize\n\n\n result = (result - range[0]) / (range[1] - range[0]);\n }\n\n return result;\n}\nvar getScalarTypeFittingRange = notImplemented('GetScalarTypeFittingRange');\nvar getAdjustedScalarRange = notImplemented('GetAdjustedScalarRange');\nfunction extentIsWithinOtherExtent(extent1, extent2) {\n if (!extent1 || !extent2) {\n return 0;\n }\n\n for (var i = 0; i < 6; i += 2) {\n if (extent1[i] < extent2[i] || extent1[i] > extent2[i + 1] || extent1[i + 1] < extent2[i] || extent1[i + 1] > extent2[i + 1]) {\n return 0;\n }\n }\n\n return 1;\n}\nfunction boundsIsWithinOtherBounds(bounds1_6, bounds2_6, delta_3) {\n if (!bounds1_6 || !bounds2_6) {\n return 0;\n }\n\n for (var i = 0; i < 6; i += 2) {\n if (bounds1_6[i] + delta_3[i / 2] < bounds2_6[i] || bounds1_6[i] - delta_3[i / 2] > bounds2_6[i + 1] || bounds1_6[i + 1] + delta_3[i / 2] < bounds2_6[i] || bounds1_6[i + 1] - delta_3[i / 2] > bounds2_6[i + 1]) {\n return 0;\n }\n }\n\n return 1;\n}\nfunction pointIsWithinBounds(point_3, bounds_6, delta_3) {\n if (!point_3 || !bounds_6 || !delta_3) {\n return 0;\n }\n\n for (var i = 0; i < 3; i++) {\n if (point_3[i] + delta_3[i] < bounds_6[2 * i] || point_3[i] - delta_3[i] > bounds_6[2 * i + 1]) {\n return 0;\n }\n }\n\n return 1;\n}\nfunction solve3PointCircle(p1, p2, p3, center) {\n var v21 = createArray(3);\n var v32 = createArray(3);\n var v13 = createArray(3);\n var v12 = createArray(3);\n var v23 = createArray(3);\n var v31 = createArray(3);\n\n for (var i = 0; i < 3; ++i) {\n v21[i] = p1[i] - p2[i];\n v32[i] = p2[i] - p3[i];\n v13[i] = p3[i] - p1[i];\n v12[i] = -v21[i];\n v23[i] = -v32[i];\n v31[i] = -v13[i];\n }\n\n var norm12 = norm(v12);\n var norm23 = norm(v23);\n var norm13 = norm(v13);\n var crossv21v32 = createArray(3);\n cross(v21, v32, crossv21v32);\n var normCross = norm(crossv21v32);\n var radius = norm12 * norm23 * norm13 / (2 * normCross);\n var normCross22 = 2 * normCross * normCross;\n var alpha = norm23 * norm23 * dot(v21, v31) / normCross22;\n var beta = norm13 * norm13 * dot(v12, v32) / normCross22;\n var gamma = norm12 * norm12 * dot(v13, v23) / normCross22;\n\n for (var _i6 = 0; _i6 < 3; ++_i6) {\n center[_i6] = alpha * p1[_i6] + beta * p2[_i6] + gamma * p3[_i6];\n }\n\n return radius;\n}\nvar inf = Infinity;\nvar negInf = -Infinity;\nvar isInf = function isInf(value) {\n return !Number.isFinite(value);\n};\nvar isFinite = Number.isFinite,\n isNaN = Number.isNaN;\nvar isNan = isNaN; // JavaScript - add-on ----------------------\n\nfunction createUninitializedBounds() {\n return [].concat([Number.MAX_VALUE, -Number.MAX_VALUE, // X\n Number.MAX_VALUE, -Number.MAX_VALUE, // Y\n Number.MAX_VALUE, -Number.MAX_VALUE // Z\n ]);\n}\nfunction getMajorAxisIndex(vector) {\n var maxValue = -1;\n var axisIndex = -1;\n\n for (var i = 0; i < vector.length; i++) {\n var value = Math.abs(vector[i]);\n\n if (value > maxValue) {\n axisIndex = i;\n maxValue = value;\n }\n }\n\n return axisIndex;\n}\nfunction floatToHex2(value) {\n var integer = Math.floor(value * 255);\n\n if (integer > 15) {\n return integer.toString(16);\n }\n\n return \"0\".concat(integer.toString(16));\n}\nfunction floatRGB2HexCode(rgbArray) {\n var prefix = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '#';\n return \"\".concat(prefix).concat(rgbArray.map(floatToHex2).join(''));\n}\n\nfunction floatToChar(f) {\n return Math.round(f * 255);\n}\n\nfunction float2CssRGBA(rgbArray) {\n if (rgbArray.length === 3) {\n return \"rgb(\".concat(rgbArray.map(floatToChar).join(', '), \")\");\n }\n\n return \"rgba(\".concat(floatToChar(rgbArray[0] || 0), \", \").concat(floatToChar(rgbArray[1] || 0), \", \").concat(floatToChar(rgbArray[2] || 0), \", \").concat(rgbArray[3] || 0, \")\");\n} // ----------------------------------------------------------------------------\n// Only Static API\n// ----------------------------------------------------------------------------\n\nvar vtkMath = {\n Pi: Pi,\n radiansFromDegrees: radiansFromDegrees,\n degreesFromRadians: degreesFromRadians,\n round: round,\n floor: floor,\n ceil: ceil,\n ceilLog2: ceilLog2,\n min: min,\n max: max,\n arrayMin: arrayMin,\n arrayMax: arrayMax,\n arrayRange: arrayRange,\n isPowerOfTwo: isPowerOfTwo,\n nearestPowerOfTwo: nearestPowerOfTwo,\n factorial: factorial,\n binomial: binomial,\n beginCombination: beginCombination,\n nextCombination: nextCombination,\n randomSeed: randomSeed,\n getSeed: getSeed,\n random: random,\n gaussian: gaussian,\n add: add,\n subtract: subtract,\n multiplyScalar: multiplyScalar,\n multiplyScalar2D: multiplyScalar2D,\n multiplyAccumulate: multiplyAccumulate,\n multiplyAccumulate2D: multiplyAccumulate2D,\n dot: dot,\n outer: outer,\n cross: cross,\n norm: norm,\n normalize: normalize,\n perpendiculars: perpendiculars,\n projectVector: projectVector,\n projectVector2D: projectVector2D,\n distance2BetweenPoints: distance2BetweenPoints,\n angleBetweenVectors: angleBetweenVectors,\n gaussianAmplitude: gaussianAmplitude,\n gaussianWeight: gaussianWeight,\n dot2D: dot2D,\n outer2D: outer2D,\n norm2D: norm2D,\n normalize2D: normalize2D,\n determinant2x2: determinant2x2,\n LUFactor3x3: LUFactor3x3,\n LUSolve3x3: LUSolve3x3,\n linearSolve3x3: linearSolve3x3,\n multiply3x3_vect3: multiply3x3_vect3,\n multiply3x3_mat3: multiply3x3_mat3,\n multiplyMatrix: multiplyMatrix,\n transpose3x3: transpose3x3,\n invert3x3: invert3x3,\n identity3x3: identity3x3,\n identity: identity,\n isIdentity: isIdentity,\n isIdentity3x3: isIdentity3x3,\n determinant3x3: determinant3x3,\n quaternionToMatrix3x3: quaternionToMatrix3x3,\n areEquals: areEquals,\n areMatricesEqual: areMatricesEqual,\n roundNumber: roundNumber,\n roundVector: roundVector,\n matrix3x3ToQuaternion: matrix3x3ToQuaternion,\n multiplyQuaternion: multiplyQuaternion,\n orthogonalize3x3: orthogonalize3x3,\n diagonalize3x3: diagonalize3x3,\n singularValueDecomposition3x3: singularValueDecomposition3x3,\n solveLinearSystem: solveLinearSystem,\n invertMatrix: invertMatrix,\n luFactorLinearSystem: luFactorLinearSystem,\n luSolveLinearSystem: luSolveLinearSystem,\n estimateMatrixCondition: estimateMatrixCondition,\n jacobi: jacobi,\n jacobiN: jacobiN,\n solveHomogeneousLeastSquares: solveHomogeneousLeastSquares,\n solveLeastSquares: solveLeastSquares,\n hex2float: hex2float,\n rgb2hsv: rgb2hsv,\n hsv2rgb: hsv2rgb,\n lab2xyz: lab2xyz,\n xyz2lab: xyz2lab,\n xyz2rgb: xyz2rgb,\n rgb2xyz: rgb2xyz,\n rgb2lab: rgb2lab,\n lab2rgb: lab2rgb,\n uninitializeBounds: uninitializeBounds,\n areBoundsInitialized: areBoundsInitialized,\n computeBoundsFromPoints: computeBoundsFromPoints,\n clampValue: clampValue,\n clampVector: clampVector,\n clampAndNormalizeValue: clampAndNormalizeValue,\n getScalarTypeFittingRange: getScalarTypeFittingRange,\n getAdjustedScalarRange: getAdjustedScalarRange,\n extentIsWithinOtherExtent: extentIsWithinOtherExtent,\n boundsIsWithinOtherBounds: boundsIsWithinOtherBounds,\n pointIsWithinBounds: pointIsWithinBounds,\n solve3PointCircle: solve3PointCircle,\n inf: inf,\n negInf: negInf,\n isInf: isInf,\n isNan: isNaN,\n isNaN: isNaN,\n isFinite: isFinite,\n // JS add-on\n createUninitializedBounds: createUninitializedBounds,\n getMajorAxisIndex: getMajorAxisIndex,\n floatToHex2: floatToHex2,\n floatRGB2HexCode: floatRGB2HexCode,\n float2CssRGBA: float2CssRGBA\n};\n\nvar vtkMath$1 = /*#__PURE__*/Object.freeze({\n __proto__: null,\n createArray: createArray,\n Pi: Pi,\n radiansFromDegrees: radiansFromDegrees,\n degreesFromRadians: degreesFromRadians,\n round: round,\n floor: floor,\n ceil: ceil,\n min: min,\n max: max,\n arrayMin: arrayMin,\n arrayMax: arrayMax,\n arrayRange: arrayRange,\n ceilLog2: ceilLog2,\n factorial: factorial,\n nearestPowerOfTwo: nearestPowerOfTwo,\n isPowerOfTwo: isPowerOfTwo,\n binomial: binomial,\n beginCombination: beginCombination,\n nextCombination: nextCombination,\n randomSeed: randomSeed,\n getSeed: getSeed,\n random: random,\n gaussian: gaussian,\n add: add,\n subtract: subtract,\n multiplyScalar: multiplyScalar,\n multiplyScalar2D: multiplyScalar2D,\n multiplyAccumulate: multiplyAccumulate,\n multiplyAccumulate2D: multiplyAccumulate2D,\n dot: dot,\n outer: outer,\n cross: cross,\n norm: norm,\n normalize: normalize,\n perpendiculars: perpendiculars,\n projectVector: projectVector,\n dot2D: dot2D,\n projectVector2D: projectVector2D,\n distance2BetweenPoints: distance2BetweenPoints,\n angleBetweenVectors: angleBetweenVectors,\n signedAngleBetweenVectors: signedAngleBetweenVectors,\n gaussianAmplitude: gaussianAmplitude,\n gaussianWeight: gaussianWeight,\n outer2D: outer2D,\n norm2D: norm2D,\n normalize2D: normalize2D,\n rowsToMat4: rowsToMat4,\n columnsToMat4: columnsToMat4,\n rowsToMat3: rowsToMat3,\n columnsToMat3: columnsToMat3,\n determinant2x2: determinant2x2,\n LUFactor3x3: LUFactor3x3,\n LUSolve3x3: LUSolve3x3,\n linearSolve3x3: linearSolve3x3,\n multiply3x3_vect3: multiply3x3_vect3,\n multiply3x3_mat3: multiply3x3_mat3,\n multiplyMatrix: multiplyMatrix,\n transpose3x3: transpose3x3,\n invert3x3: invert3x3,\n determinant3x3: determinant3x3,\n areEquals: areEquals,\n areMatricesEqual: areMatricesEqual,\n identity3x3: identity3x3,\n identity: identity,\n isIdentity: isIdentity,\n isIdentity3x3: isIdentity3x3,\n quaternionToMatrix3x3: quaternionToMatrix3x3,\n roundNumber: roundNumber,\n roundVector: roundVector,\n jacobiN: jacobiN,\n matrix3x3ToQuaternion: matrix3x3ToQuaternion,\n multiplyQuaternion: multiplyQuaternion,\n orthogonalize3x3: orthogonalize3x3,\n diagonalize3x3: diagonalize3x3,\n singularValueDecomposition3x3: singularValueDecomposition3x3,\n luFactorLinearSystem: luFactorLinearSystem,\n luSolveLinearSystem: luSolveLinearSystem,\n solveLinearSystem: solveLinearSystem,\n invertMatrix: invertMatrix,\n estimateMatrixCondition: estimateMatrixCondition,\n jacobi: jacobi,\n solveHomogeneousLeastSquares: solveHomogeneousLeastSquares,\n solveLeastSquares: solveLeastSquares,\n hex2float: hex2float,\n rgb2hsv: rgb2hsv,\n hsv2rgb: hsv2rgb,\n lab2xyz: lab2xyz,\n xyz2lab: xyz2lab,\n xyz2rgb: xyz2rgb,\n rgb2xyz: rgb2xyz,\n rgb2lab: rgb2lab,\n lab2rgb: lab2rgb,\n uninitializeBounds: uninitializeBounds,\n areBoundsInitialized: areBoundsInitialized,\n computeBoundsFromPoints: computeBoundsFromPoints,\n clampValue: clampValue,\n clampVector: clampVector,\n clampAndNormalizeValue: clampAndNormalizeValue,\n getScalarTypeFittingRange: getScalarTypeFittingRange,\n getAdjustedScalarRange: getAdjustedScalarRange,\n extentIsWithinOtherExtent: extentIsWithinOtherExtent,\n boundsIsWithinOtherBounds: boundsIsWithinOtherBounds,\n pointIsWithinBounds: pointIsWithinBounds,\n solve3PointCircle: solve3PointCircle,\n inf: inf,\n negInf: negInf,\n isInf: isInf,\n isFinite: isFinite,\n isNaN: isNaN,\n isNan: isNan,\n createUninitializedBounds: createUninitializedBounds,\n getMajorAxisIndex: getMajorAxisIndex,\n floatToHex2: floatToHex2,\n floatRGB2HexCode: floatRGB2HexCode,\n float2CssRGBA: float2CssRGBA,\n 'default': vtkMath\n});\n\nexport { factorial as $, degreesFromRadians as A, areEquals as B, clampValue as C, arrayRange as D, getMajorAxisIndex as E, isInf as F, rgb2hsv as G, rgb2lab as H, lab2rgb as I, floor as J, round as K, normalize2D as L, nearestPowerOfTwo as M, createUninitializedBounds as N, multiply3x3_vect3 as O, areBoundsInitialized as P, isPowerOfTwo as Q, angleBetweenVectors as R, signedAngleBetweenVectors as S, createArray as T, Pi as U, ceil as V, min as W, max as X, arrayMin as Y, arrayMax as Z, ceilLog2 as _, areMatricesEqual as a, binomial as a0, beginCombination as a1, nextCombination as a2, randomSeed as a3, getSeed as a4, gaussian as a5, multiplyScalar2D as a6, multiplyAccumulate2D as a7, outer as a8, projectVector as a9, singularValueDecomposition3x3 as aA, luFactorLinearSystem as aB, luSolveLinearSystem as aC, invertMatrix as aD, estimateMatrixCondition as aE, solveHomogeneousLeastSquares as aF, solveLeastSquares as aG, hex2float as aH, lab2xyz as aI, xyz2lab as aJ, xyz2rgb as aK, rgb2xyz as aL, computeBoundsFromPoints as aM, clampAndNormalizeValue as aN, getScalarTypeFittingRange as aO, getAdjustedScalarRange as aP, extentIsWithinOtherExtent as aQ, boundsIsWithinOtherBounds as aR, pointIsWithinBounds as aS, solve3PointCircle as aT, inf as aU, negInf as aV, isFinite as aW, isNaN as aX, floatToHex2 as aY, floatRGB2HexCode as aZ, float2CssRGBA as a_, dot2D as aa, projectVector2D as ab, gaussianAmplitude as ac, gaussianWeight as ad, outer2D as ae, norm2D as af, rowsToMat4 as ag, columnsToMat4 as ah, columnsToMat3 as ai, LUFactor3x3 as aj, LUSolve3x3 as ak, linearSolve3x3 as al, multiply3x3_mat3 as am, multiplyMatrix as an, transpose3x3 as ao, invert3x3 as ap, identity3x3 as aq, identity as ar, isIdentity as as, isIdentity3x3 as at, quaternionToMatrix3x3 as au, roundNumber as av, matrix3x3ToQuaternion as aw, multiplyQuaternion as ax, orthogonalize3x3 as ay, diagonalize3x3 as az, roundVector as b, clampVector as c, dot as d, distance2BetweenPoints as e, vtkMath as f, solveLinearSystem as g, hsv2rgb as h, isNan as i, cross as j, add as k, normalize as l, multiplyAccumulate as m, norm as n, determinant2x2 as o, jacobiN as p, perpendiculars as q, radiansFromDegrees as r, subtract as s, jacobi as t, uninitializeBounds as u, vtkMath$1 as v, multiplyScalar as w, random as x, determinant3x3 as y, rowsToMat3 as z };\n","import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';\nimport _classCallCheck from '@babel/runtime/helpers/classCallCheck';\nimport _createClass from '@babel/runtime/helpers/createClass';\nimport { vec3, mat4, glMatrix } from 'gl-matrix';\nimport { a as areMatricesEqual } from './Math/index.js';\nimport { IDENTITY } from './Math/Constants.js';\n\nvar NoOp = function NoOp(v) {\n return v;\n};\n\nvar EPSILON = 1e-6;\n\nvar Transform = /*#__PURE__*/function () {\n function Transform() {\n var useDegree = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n _classCallCheck(this, Transform);\n\n this.matrix = mat4.identity(new Float64Array(16));\n this.tmp = new Float64Array(3);\n this.angleConv = useDegree ? glMatrix.toRadian : NoOp;\n }\n\n _createClass(Transform, [{\n key: \"rotateFromDirections\",\n value: function rotateFromDirections(originDirection, targetDirection) {\n var src = new Float64Array(3);\n var dst = new Float64Array(3);\n var transf = new Float64Array(16);\n vec3.set(src, originDirection[0], originDirection[1], originDirection[2]);\n vec3.set(dst, targetDirection[0], targetDirection[1], targetDirection[2]);\n vec3.normalize(src, src);\n vec3.normalize(dst, dst);\n var cosAlpha = vec3.dot(src, dst);\n\n if (cosAlpha >= 1) {\n return this;\n }\n\n vec3.cross(this.tmp, src, dst);\n\n if (vec3.length(this.tmp) < EPSILON) {\n // cross product is 0, so pick arbitrary axis perpendicular\n // to originDirection.\n vec3.cross(this.tmp, [1, 0, 0], originDirection);\n\n if (vec3.length(this.tmp) < EPSILON) {\n vec3.cross(this.tmp, [0, 1, 0], originDirection);\n }\n }\n\n mat4.fromRotation(transf, Math.acos(cosAlpha), this.tmp);\n mat4.multiply(this.matrix, this.matrix, transf);\n return this;\n }\n }, {\n key: \"rotate\",\n value: function rotate(angle, axis) {\n vec3.set.apply(vec3, [this.tmp].concat(_toConsumableArray(axis)));\n vec3.normalize(this.tmp, this.tmp);\n mat4.rotate(this.matrix, this.matrix, this.angleConv(angle), this.tmp);\n return this;\n }\n }, {\n key: \"rotateX\",\n value: function rotateX(angle) {\n mat4.rotateX(this.matrix, this.matrix, this.angleConv(angle));\n return this;\n }\n }, {\n key: \"rotateY\",\n value: function rotateY(angle) {\n mat4.rotateY(this.matrix, this.matrix, this.angleConv(angle));\n return this;\n }\n }, {\n key: \"rotateZ\",\n value: function rotateZ(angle) {\n mat4.rotateZ(this.matrix, this.matrix, this.angleConv(angle));\n return this;\n }\n }, {\n key: \"translate\",\n value: function translate(x, y, z) {\n vec3.set(this.tmp, x, y, z);\n mat4.translate(this.matrix, this.matrix, this.tmp);\n return this;\n }\n }, {\n key: \"scale\",\n value: function scale(sx, sy, sz) {\n vec3.set(this.tmp, sx, sy, sz);\n mat4.scale(this.matrix, this.matrix, this.tmp);\n return this;\n }\n }, {\n key: \"multiply\",\n value: function multiply(mat4x4) {\n mat4.multiply(this.matrix, this.matrix, mat4x4);\n return this;\n }\n }, {\n key: \"multiply3x3\",\n value: function multiply3x3(mat3x3) {\n mat4.multiply(this.matrix, this.matrix, [mat3x3[0], mat3x3[1], mat3x3[2], 0, mat3x3[3], mat3x3[4], mat3x3[5], 0, mat3x3[6], mat3x3[7], mat3x3[8], 0, 0, 0, 0, 1]);\n return this;\n }\n }, {\n key: \"invert\",\n value: function invert() {\n mat4.invert(this.matrix, this.matrix);\n return this;\n }\n }, {\n key: \"identity\",\n value: function identity() {\n mat4.identity(this.matrix);\n return this;\n } //-----------\n\n }, {\n key: \"apply\",\n value: function apply(typedArray) {\n var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var nbIterations = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : -1;\n\n if (areMatricesEqual(IDENTITY, this.matrix)) {\n // Make sure we can chain apply...\n return this;\n }\n\n var size = nbIterations === -1 ? typedArray.length : offset + nbIterations * 3;\n\n for (var i = offset; i < size; i += 3) {\n vec3.set(this.tmp, typedArray[i], typedArray[i + 1], typedArray[i + 2]);\n vec3.transformMat4(this.tmp, this.tmp, this.matrix);\n typedArray[i] = this.tmp[0];\n typedArray[i + 1] = this.tmp[1];\n typedArray[i + 2] = this.tmp[2];\n } // Make sure we can chain apply...\n\n\n return this;\n }\n }, {\n key: \"getMatrix\",\n value: function getMatrix() {\n return this.matrix;\n }\n }, {\n key: \"setMatrix\",\n value: function setMatrix(mat4x4) {\n if (!!mat4x4 && mat4x4.length === 16) {\n mat4.copy(this.matrix, mat4x4);\n }\n\n return this;\n }\n }]);\n\n return Transform;\n}();\n\nfunction buildFromDegree() {\n return new Transform(true);\n}\n\nfunction buildFromRadian() {\n return new Transform(false);\n}\n\nvar vtkMatrixBuilder = {\n buildFromDegree: buildFromDegree,\n buildFromRadian: buildFromRadian\n};\n\nexport { vtkMatrixBuilder as default };\n","import macro from '../../macros.js';\nimport vtkDataArray from './DataArray.js';\nimport { VtkDataTypes } from './DataArray/Constants.js';\n\nvar vtkErrorMacro = macro.vtkErrorMacro;\nvar INVALID_BOUNDS = [1, -1, 1, -1, 1, -1]; // ----------------------------------------------------------------------------\n// vtkPoints methods\n// ----------------------------------------------------------------------------\n\nfunction vtkPoints(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkPoints'); // Forwarding methods\n\n publicAPI.getNumberOfPoints = publicAPI.getNumberOfTuples;\n\n publicAPI.setNumberOfPoints = function (nbPoints) {\n var dimension = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 3;\n\n if (publicAPI.getNumberOfPoints() !== nbPoints) {\n model.size = nbPoints * dimension;\n model.values = macro.newTypedArray(model.dataType, model.size);\n publicAPI.setNumberOfComponents(dimension);\n publicAPI.modified();\n }\n };\n\n publicAPI.setPoint = function (idx) {\n for (var _len = arguments.length, xyz = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n xyz[_key - 1] = arguments[_key];\n }\n\n publicAPI.setTuple(idx, xyz);\n };\n\n publicAPI.getPoint = publicAPI.getTuple;\n\n publicAPI.insertNextPoint = function (x, y, z) {\n return publicAPI.insertNextTuple([x, y, z]);\n };\n\n publicAPI.getBounds = function () {\n if (publicAPI.getNumberOfComponents() === 3) {\n var _xRange = publicAPI.getRange(0);\n\n model.bounds[0] = _xRange[0];\n model.bounds[1] = _xRange[1];\n\n var _yRange = publicAPI.getRange(1);\n\n model.bounds[2] = _yRange[0];\n model.bounds[3] = _yRange[1];\n var zRange = publicAPI.getRange(2);\n model.bounds[4] = zRange[0];\n model.bounds[5] = zRange[1];\n return model.bounds;\n }\n\n if (publicAPI.getNumberOfComponents() !== 2) {\n vtkErrorMacro(\"getBounds called on an array with components of\\n \".concat(publicAPI.getNumberOfComponents()));\n return INVALID_BOUNDS;\n }\n\n var xRange = publicAPI.getRange(0);\n model.bounds[0] = xRange[0];\n model.bounds[1] = xRange[1];\n var yRange = publicAPI.getRange(1);\n model.bounds[2] = yRange[0];\n model.bounds[3] = yRange[1];\n model.bounds[4] = 0;\n model.bounds[5] = 0;\n return model.bounds;\n }; // Trigger the computation of bounds\n\n\n publicAPI.computeBounds = publicAPI.getBounds; // Initialize\n\n publicAPI.setNumberOfComponents(model.numberOfComponents < 2 ? 3 : model.numberOfComponents);\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n empty: true,\n numberOfComponents: 3,\n dataType: VtkDataTypes.FLOAT,\n bounds: [1, -1, 1, -1, 1, -1]\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues);\n vtkDataArray.extend(publicAPI, model, initialValues);\n vtkPoints(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkPoints'); // ----------------------------------------------------------------------------\n\nvar vtkPoints$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkPoints$1 as default, extend, newInstance };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport macro from '../../macros.js';\nimport vtkDataArray from './DataArray.js';\nimport vtkScalarsToColors$2 from './ScalarsToColors/Constants.js';\nimport Constants from '../../Rendering/Core/Mapper/Constants.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nvar ScalarMappingTarget = vtkScalarsToColors$2.ScalarMappingTarget,\n VectorMode = vtkScalarsToColors$2.VectorMode;\nvar VtkDataTypes = vtkDataArray.VtkDataTypes;\nvar ColorMode = Constants.ColorMode;\nvar vtkErrorMacro = macro.vtkErrorMacro; // ----------------------------------------------------------------------------\n// Global methods\n// ----------------------------------------------------------------------------\n// Add module-level functions or api that you want to expose statically via\n// the next section...\n// ----------------------------------------------------------------------------\n// Static API\n// ----------------------------------------------------------------------------\n\nfunction intColorToUChar(c) {\n return c;\n}\n\nfunction floatColorToUChar(c) {\n return Math.floor(c * 255.0 + 0.5);\n} // ----------------------------------------------------------------------------\n// vtkScalarsToColors methods\n// ----------------------------------------------------------------------------\n\n\nfunction vtkScalarsToColors(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkScalarsToColors');\n\n publicAPI.setVectorModeToMagnitude = function () {\n return publicAPI.setVectorMode(VectorMode.MAGNITUDE);\n };\n\n publicAPI.setVectorModeToComponent = function () {\n return publicAPI.setVectorMode(VectorMode.COMPONENT);\n };\n\n publicAPI.setVectorModeToRGBColors = function () {\n return publicAPI.setVectorMode(VectorMode.RGBCOLORS);\n };\n\n publicAPI.build = function () {};\n\n publicAPI.isOpaque = function () {\n return true;\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.setAnnotations = function (values, annotations) {\n if (values && !annotations || !values && annotations) {\n return;\n }\n\n if (values && annotations && values.length !== annotations.length) {\n vtkErrorMacro('Values and annotations do not have the same number of tuples so ignoring');\n return;\n }\n\n model.annotationArray = [];\n\n if (annotations && values) {\n var num = annotations.length;\n\n for (var i = 0; i < num; i++) {\n model.annotationArray.push({\n value: values[i],\n annotation: String(annotations[i])\n });\n }\n }\n\n publicAPI.updateAnnotatedValueMap();\n publicAPI.modified();\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.setAnnotation = function (value, annotation) {\n var i = publicAPI.checkForAnnotatedValue(value);\n var modified = false;\n\n if (i >= 0) {\n if (model.annotationArray[i].annotation !== annotation) {\n model.annotationArray[i].annotation = annotation;\n modified = true;\n }\n } else {\n model.annotationArray.push({\n value: value,\n annotation: annotation\n });\n i = model.annotationArray.length - 1;\n modified = true;\n }\n\n if (modified) {\n publicAPI.updateAnnotatedValueMap();\n publicAPI.modified();\n }\n\n return i;\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.getNumberOfAnnotatedValues = function () {\n return model.annotationArray.length;\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.getAnnotatedValue = function (idx) {\n if (idx < 0 || idx >= model.annotationArray.length) {\n return null;\n }\n\n return model.annotationArray[idx].value;\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.getAnnotation = function (idx) {\n if (model.annotationArray[idx] === undefined) {\n return null;\n }\n\n return model.annotationArray[idx].annotation;\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.getAnnotatedValueIndex = function (val) {\n return model.annotationArray.length ? publicAPI.checkForAnnotatedValue(val) : -1;\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.removeAnnotation = function (value) {\n var i = publicAPI.checkForAnnotatedValue(value);\n var needToRemove = i >= 0;\n\n if (needToRemove) {\n model.annotationArray.splice(i, 1);\n publicAPI.updateAnnotatedValueMap();\n publicAPI.modified();\n }\n\n return needToRemove;\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.resetAnnotations = function () {\n model.annotationArray = [];\n model.annotatedValueMap = [];\n publicAPI.modified();\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.getAnnotationColor = function (val, rgba) {\n if (model.indexedLookup) {\n var i = publicAPI.getAnnotatedValueIndex(val);\n publicAPI.getIndexedColor(i, rgba);\n } else {\n publicAPI.getColor(parseFloat(val), rgba);\n rgba[3] = 1.0;\n }\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.checkForAnnotatedValue = function (value) {\n return publicAPI.getAnnotatedValueIndexInternal(value);\n }; //----------------------------------------------------------------------------\n // An unsafe version of vtkScalarsToColors::CheckForAnnotatedValue for\n // internal use (no pointer checks performed)\n\n\n publicAPI.getAnnotatedValueIndexInternal = function (value) {\n if (model.annotatedValueMap[value] !== undefined) {\n var na = model.annotationArray.length;\n return model.annotatedValueMap[value] % na;\n } // Treat as a NaN\n\n\n return -1;\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.getIndexedColor = function (val, rgba) {\n rgba[0] = 0.0;\n rgba[1] = 0.0;\n rgba[2] = 0.0;\n rgba[3] = 0.0;\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.updateAnnotatedValueMap = function () {\n model.annotatedValueMap = [];\n var na = model.annotationArray.length;\n\n for (var i = 0; i < na; i++) {\n model.annotatedValueMap[model.annotationArray[i].value] = i;\n }\n }; // Description:\n // Internal methods that map a data array into a 4-component,\n // unsigned char RGBA array. The color mode determines the behavior\n // of mapping. If ColorMode.DEFAULT is set, then unsigned char\n // data arrays are treated as colors (and converted to RGBA if\n // necessary); If ColorMode.DIRECT_SCALARS is set, then all arrays\n // are treated as colors (integer types are clamped in the range 0-255,\n // floating point arrays are clamped in the range 0.0-1.0. Note 'char' does\n // not have enough values to represent a color so mapping this type is\n // considered an error);\n // otherwise, the data is mapped through this instance\n // of ScalarsToColors. The component argument is used for data\n // arrays with more than one component; it indicates which component\n // to use to do the blending. When the component argument is -1,\n // then the this object uses its own selected technique to change a\n // vector into a scalar to map.\n\n\n publicAPI.mapScalars = function (scalars, colorMode, componentIn) {\n var numberOfComponents = scalars.getNumberOfComponents();\n var newColors = null; // map scalars through lookup table only if needed\n\n if (colorMode === ColorMode.DEFAULT && scalars.getDataType() === VtkDataTypes.UNSIGNED_CHAR || colorMode === ColorMode.DIRECT_SCALARS && scalars) {\n newColors = publicAPI.convertToRGBA(scalars, numberOfComponents, scalars.getNumberOfTuples());\n } else {\n var newscalars = {\n type: 'vtkDataArray',\n name: 'temp',\n numberOfComponents: 4,\n dataType: VtkDataTypes.UNSIGNED_CHAR\n };\n var s = macro.newTypedArray(newscalars.dataType, 4 * scalars.getNumberOfTuples());\n newscalars.values = s;\n newscalars.size = s.length;\n newColors = vtkDataArray.newInstance(newscalars);\n var component = componentIn; // If mapper did not specify a component, use the VectorMode\n\n if (component < 0 && numberOfComponents > 1) {\n publicAPI.mapVectorsThroughTable(scalars, newColors, ScalarMappingTarget.RGBA, -1, -1);\n } else {\n if (component < 0) {\n component = 0;\n }\n\n if (component >= numberOfComponents) {\n component = numberOfComponents - 1;\n } // Map the scalars to colors\n\n\n publicAPI.mapScalarsThroughTable(scalars, newColors, ScalarMappingTarget.RGBA, component);\n }\n }\n\n return newColors;\n };\n\n publicAPI.mapVectorsToMagnitude = function (input, output, compsToUse) {\n var length = input.getNumberOfTuples();\n var inIncr = input.getNumberOfComponents();\n var outputV = output.getData();\n var inputV = input.getData();\n\n for (var i = 0; i < length; i++) {\n var sum = 0.0;\n\n for (var j = 0; j < compsToUse; j++) {\n sum += inputV[i * inIncr + j] * inputV[i * inIncr + j];\n }\n\n outputV[i] = Math.sqrt(sum);\n }\n }; //----------------------------------------------------------------------------\n // Map a set of vector values through the table\n\n\n publicAPI.mapVectorsThroughTable = function (input, output, outputFormat, vectorComponentIn, vectorSizeIn) {\n var vectorMode = publicAPI.getVectorMode();\n var vectorSize = vectorSizeIn;\n var vectorComponent = vectorComponentIn;\n var inComponents = input.getNumberOfComponents();\n\n if (vectorMode === VectorMode.COMPONENT) {\n // make sure vectorComponent is within allowed range\n if (vectorComponent === -1) {\n // if set to -1, use default value provided by table\n vectorComponent = publicAPI.getVectorComponent();\n }\n\n if (vectorComponent < 0) {\n vectorComponent = 0;\n }\n\n if (vectorComponent >= inComponents) {\n vectorComponent = inComponents - 1;\n }\n } else {\n // make sure vectorSize is within allowed range\n if (vectorSize === -1) {\n // if set to -1, use default value provided by table\n vectorSize = publicAPI.getVectorSize();\n }\n\n if (vectorSize <= 0) {\n vectorComponent = 0;\n vectorSize = inComponents;\n } else {\n if (vectorComponent < 0) {\n vectorComponent = 0;\n }\n\n if (vectorComponent >= inComponents) {\n vectorComponent = inComponents - 1;\n }\n\n if (vectorComponent + vectorSize > inComponents) {\n vectorSize = inComponents - vectorComponent;\n }\n }\n\n if (vectorMode === VectorMode.MAGNITUDE && (inComponents === 1 || vectorSize === 1)) {\n vectorMode = VectorMode.COMPONENT;\n }\n } // increment input pointer to the first component to map\n\n\n var inputOffset = 0;\n\n if (vectorComponent > 0) {\n inputOffset = vectorComponent;\n } // map according to the current vector mode\n\n\n switch (vectorMode) {\n case VectorMode.COMPONENT:\n {\n publicAPI.mapScalarsThroughTable(input, output, outputFormat, inputOffset);\n break;\n }\n\n case VectorMode.RGBCOLORS:\n {\n // publicAPI.mapColorsToColors(\n // input, output, inComponents, vectorSize,\n // outputFormat);\n break;\n }\n // MAGNITUDE is considered default\n\n case VectorMode.MAGNITUDE:\n default:\n {\n var magValues = vtkDataArray.newInstance({\n numberOfComponents: 1,\n values: new Float32Array(input.getNumberOfTuples())\n });\n publicAPI.mapVectorsToMagnitude(input, magValues, vectorSize);\n publicAPI.mapScalarsThroughTable(magValues, output, outputFormat, 0);\n break;\n }\n }\n };\n\n publicAPI.luminanceToRGBA = function (newColors, colors, alpha, convtFun) {\n var a = convtFun(alpha);\n var values = colors.getData();\n var newValues = newColors.getData();\n var size = values.length;\n var component = 0;\n var tuple = 1;\n var count = 0;\n\n for (var i = component; i < size; i += tuple) {\n var l = convtFun(values[i]);\n newValues[count * 4] = l;\n newValues[count * 4 + 1] = l;\n newValues[count * 4 + 2] = l;\n newValues[count * 4 + 3] = a;\n count++;\n }\n };\n\n publicAPI.luminanceAlphaToRGBA = function (newColors, colors, alpha, convtFun) {\n var values = colors.getData();\n var newValues = newColors.getData();\n var size = values.length;\n var component = 0;\n var tuple = 2;\n var count = 0;\n\n for (var i = component; i < size; i += tuple) {\n var l = convtFun(values[i]);\n newValues[count] = l;\n newValues[count + 1] = l;\n newValues[count + 2] = l;\n newValues[count + 3] = convtFun(values[i + 1]) * alpha;\n count += 4;\n }\n };\n\n publicAPI.rGBToRGBA = function (newColors, colors, alpha, convtFun) {\n var a = floatColorToUChar(alpha);\n var values = colors.getData();\n var newValues = newColors.getData();\n var size = values.length;\n var component = 0;\n var tuple = 3;\n var count = 0;\n\n for (var i = component; i < size; i += tuple) {\n newValues[count * 4] = convtFun(values[i]);\n newValues[count * 4 + 1] = convtFun(values[i + 1]);\n newValues[count * 4 + 2] = convtFun(values[i + 2]);\n newValues[count * 4 + 3] = a;\n count++;\n }\n };\n\n publicAPI.rGBAToRGBA = function (newColors, colors, alpha, convtFun) {\n var values = colors.getData();\n var newValues = newColors.getData();\n var size = values.length;\n var component = 0;\n var tuple = 4;\n var count = 0;\n\n for (var i = component; i < size; i += tuple) {\n newValues[count * 4] = convtFun(values[i]);\n newValues[count * 4 + 1] = convtFun(values[i + 1]);\n newValues[count * 4 + 2] = convtFun(values[i + 2]);\n newValues[count * 4 + 3] = convtFun(values[i + 3]) * alpha;\n count++;\n }\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.convertToRGBA = function (colors, numComp, numTuples) {\n var alpha = model.alpha;\n\n if (numComp === 4 && alpha >= 1.0 && colors.getDataType() === VtkDataTypes.UNSIGNED_CHAR) {\n return colors;\n }\n\n var newColors = vtkDataArray.newInstance({\n numberOfComponents: 4,\n empty: true,\n size: 4 * numTuples,\n dataType: VtkDataTypes.UNSIGNED_CHAR\n });\n\n if (numTuples <= 0) {\n return newColors;\n }\n\n alpha = alpha > 0 ? alpha : 0;\n alpha = alpha < 1 ? alpha : 1;\n var convtFun = intColorToUChar;\n\n if (colors.getDataType() === VtkDataTypes.FLOAT || colors.getDataType() === VtkDataTypes.DOUBLE) {\n convtFun = floatColorToUChar;\n }\n\n switch (numComp) {\n case 1:\n publicAPI.luminanceToRGBA(newColors, colors, alpha, convtFun);\n break;\n\n case 2:\n publicAPI.luminanceAlphaToRGBA(newColors, colors, convtFun);\n break;\n\n case 3:\n publicAPI.rGBToRGBA(newColors, colors, alpha, convtFun);\n break;\n\n case 4:\n publicAPI.rGBAToRGBA(newColors, colors, alpha, convtFun);\n break;\n\n default:\n vtkErrorMacro('Cannot convert colors');\n return null;\n }\n\n return newColors;\n };\n\n publicAPI.usingLogScale = function () {\n return false;\n };\n\n publicAPI.getNumberOfAvailableColors = function () {\n return 256 * 256 * 256;\n };\n\n publicAPI.setRange = function (min, max) {\n return publicAPI.setMappingRange(min, max);\n };\n\n publicAPI.getRange = function () {\n return publicAPI.getMappingRange();\n };\n\n publicAPI.areScalarsOpaque = function (scalars, colorMode, componentIn) {\n if (!scalars) {\n return publicAPI.isOpaque();\n }\n\n var numberOfComponents = scalars.getNumberOfComponents(); // map scalars through lookup table only if needed\n\n if (colorMode === ColorMode.DEFAULT && scalars.getDataType() === VtkDataTypes.UNSIGNED_CHAR || colorMode === ColorMode.DIRECT_SCALARS) {\n // we will be using the scalars directly, so look at the number of\n // components and the range\n if (numberOfComponents === 3 || numberOfComponents === 1) {\n return model.alpha >= 1.0;\n } // otherwise look at the range of the alpha channel\n\n\n var range = scalars.getRange(numberOfComponents - 1);\n return range[0] === 255;\n }\n\n return true;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n alpha: 1.0,\n vectorComponent: 0,\n vectorSize: -1,\n vectorMode: VectorMode.COMPONENT,\n mappingRange: null,\n annotationArray: null,\n annotatedValueMap: null,\n indexedLookup: false\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Object methods\n\n macro.obj(publicAPI, model);\n model.mappingRange = [0, 255];\n model.annotationArray = [];\n model.annotatedValueMap = []; // Create get-set macros\n\n macro.setGet(publicAPI, model, ['vectorSize', 'vectorComponent', 'vectorMode', 'alpha', 'indexedLookup']); // Create set macros for array (needs to know size)\n\n macro.setArray(publicAPI, model, ['mappingRange'], 2); // Create get macros for array\n\n macro.getArray(publicAPI, model, ['mappingRange']); // For more macro methods, see \"Sources/macros.js\"\n // Object specific methods\n\n vtkScalarsToColors(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkScalarsToColors'); // ----------------------------------------------------------------------------\n\nvar vtkScalarsToColors$1 = _objectSpread({\n newInstance: newInstance,\n extend: extend\n}, vtkScalarsToColors$2);\n\nexport { vtkScalarsToColors$1 as default, extend, newInstance };\n","var VectorMode = {\n MAGNITUDE: 0,\n COMPONENT: 1,\n RGBCOLORS: 2\n};\nvar ScalarMappingTarget = {\n LUMINANCE: 1,\n LUMINANCE_ALPHA: 2,\n RGB: 3,\n RGBA: 4\n};\nvar vtkScalarsToColors = {\n VectorMode: VectorMode,\n ScalarMappingTarget: ScalarMappingTarget\n};\n\nexport { ScalarMappingTarget, VectorMode, vtkScalarsToColors as default };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport _classCallCheck from '@babel/runtime/helpers/classCallCheck';\nimport _createClass from '@babel/runtime/helpers/createClass';\nimport _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';\nimport _slicedToArray from '@babel/runtime/helpers/slicedToArray';\nimport { d as dot } from '../Core/Math/index.js';\nimport { vec3 } from 'gl-matrix';\nimport vtkPlane from './Plane.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nvar INIT_BOUNDS = [Number.MAX_VALUE, -Number.MAX_VALUE, // X\nNumber.MAX_VALUE, -Number.MAX_VALUE, // Y\nNumber.MAX_VALUE, -Number.MAX_VALUE // Z\n]; // ----------------------------------------------------------------------------\n// Global methods\n// ----------------------------------------------------------------------------\n\nfunction _equals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5];\n}\n\nfunction _isValid(bounds) {\n return bounds[0] <= bounds[1] && bounds[2] <= bounds[3] && bounds[4] <= bounds[5];\n}\n\nfunction _setBounds(bounds, otherBounds) {\n bounds[0] = otherBounds[0];\n bounds[1] = otherBounds[1];\n bounds[2] = otherBounds[2];\n bounds[3] = otherBounds[3];\n bounds[4] = otherBounds[4];\n bounds[5] = otherBounds[5];\n return bounds;\n}\n\nfunction _reset(bounds) {\n return _setBounds(bounds, INIT_BOUNDS);\n}\n\nfunction _addPoint(bounds, x, y, z) {\n var _bounds = _slicedToArray(bounds, 6),\n xMin = _bounds[0],\n xMax = _bounds[1],\n yMin = _bounds[2],\n yMax = _bounds[3],\n zMin = _bounds[4],\n zMax = _bounds[5];\n\n bounds[0] = xMin < x ? xMin : x;\n bounds[1] = xMax > x ? xMax : x;\n bounds[2] = yMin < y ? yMin : y;\n bounds[3] = yMax > y ? yMax : y;\n bounds[4] = zMin < z ? zMin : z;\n bounds[5] = zMax > z ? zMax : z;\n return bounds;\n}\n\nfunction _addPoints(bounds, points) {\n if (points.length === 0) {\n return bounds;\n }\n\n if (Array.isArray(points[0])) {\n for (var i = 0; i < points.length; ++i) {\n _addPoint.apply(void 0, [bounds].concat(_toConsumableArray(points[i])));\n }\n } else {\n for (var _i = 0; _i < points.length; _i += 3) {\n _addPoint.apply(void 0, [bounds].concat(_toConsumableArray(points.slice(_i, _i + 3))));\n }\n }\n\n return bounds;\n}\n\nfunction _addBounds(bounds, xMin, xMax, yMin, yMax, zMin, zMax) {\n var _bounds2 = _slicedToArray(bounds, 6),\n _xMin = _bounds2[0],\n _xMax = _bounds2[1],\n _yMin = _bounds2[2],\n _yMax = _bounds2[3],\n _zMin = _bounds2[4],\n _zMax = _bounds2[5];\n\n if (zMax === undefined) {\n bounds[0] = Math.min(xMin[0], _xMin);\n bounds[1] = Math.max(xMin[1], _xMax);\n bounds[2] = Math.min(xMin[2], _yMin);\n bounds[3] = Math.max(xMin[3], _yMax);\n bounds[4] = Math.min(xMin[4], _zMin);\n bounds[5] = Math.max(xMin[5], _zMax);\n } else {\n bounds[0] = Math.min(xMin, _xMin);\n bounds[1] = Math.max(xMax, _xMax);\n bounds[2] = Math.min(yMin, _yMin);\n bounds[3] = Math.max(yMax, _yMax);\n bounds[4] = Math.min(zMin, _zMin);\n bounds[5] = Math.max(zMax, _zMax);\n }\n\n return bounds;\n}\n\nfunction _setMinPoint(bounds, x, y, z) {\n var _bounds3 = _slicedToArray(bounds, 6),\n xMin = _bounds3[0],\n xMax = _bounds3[1],\n yMin = _bounds3[2],\n yMax = _bounds3[3],\n zMin = _bounds3[4],\n zMax = _bounds3[5];\n\n bounds[0] = x;\n bounds[1] = x > xMax ? x : xMax;\n bounds[2] = y;\n bounds[3] = y > yMax ? y : yMax;\n bounds[4] = z;\n bounds[5] = z > zMax ? z : zMax;\n return xMin !== x || yMin !== y || zMin !== z;\n}\n\nfunction _setMaxPoint(bounds, x, y, z) {\n var _bounds4 = _slicedToArray(bounds, 6),\n xMin = _bounds4[0],\n xMax = _bounds4[1],\n yMin = _bounds4[2],\n yMax = _bounds4[3],\n zMin = _bounds4[4],\n zMax = _bounds4[5];\n\n bounds[0] = x < xMin ? x : xMin;\n bounds[1] = x;\n bounds[2] = y < yMin ? y : yMin;\n bounds[3] = y;\n bounds[4] = z < zMin ? z : zMin;\n bounds[5] = z;\n return xMax !== x || yMax !== y || zMax !== z;\n}\n\nfunction _inflate(bounds, delta) {\n bounds[0] -= delta;\n bounds[1] += delta;\n bounds[2] -= delta;\n bounds[3] += delta;\n bounds[4] -= delta;\n bounds[5] += delta;\n return bounds;\n}\n\nfunction _scale(bounds, sx, sy, sz) {\n if (!_isValid(bounds)) {\n return false;\n }\n\n if (sx >= 0.0) {\n bounds[0] *= sx;\n bounds[1] *= sx;\n } else {\n bounds[0] = sx * bounds[1];\n bounds[1] = sx * bounds[0];\n }\n\n if (sy >= 0.0) {\n bounds[2] *= sy;\n bounds[3] *= sy;\n } else {\n bounds[2] = sy * bounds[3];\n bounds[3] = sy * bounds[2];\n }\n\n if (sz >= 0.0) {\n bounds[4] *= sz;\n bounds[5] *= sz;\n } else {\n bounds[4] = sz * bounds[5];\n bounds[5] = sz * bounds[4];\n }\n\n return true;\n}\n\nfunction _getCenter(bounds) {\n return [0.5 * (bounds[0] + bounds[1]), 0.5 * (bounds[2] + bounds[3]), 0.5 * (bounds[4] + bounds[5])];\n}\nfunction scaleAboutCenter(bounds, sx, sy, sz) {\n if (!_isValid(bounds)) {\n return false;\n }\n\n var center = _getCenter(bounds);\n\n bounds[0] -= center[0];\n bounds[1] -= center[0];\n bounds[2] -= center[1];\n bounds[3] -= center[1];\n bounds[4] -= center[2];\n bounds[5] -= center[2];\n\n _scale(bounds, sx, sy, sz);\n\n bounds[0] += center[0];\n bounds[1] += center[0];\n bounds[2] += center[1];\n bounds[3] += center[1];\n bounds[4] += center[2];\n bounds[5] += center[2];\n return true;\n}\n\nfunction _getLength(bounds, index) {\n return bounds[index * 2 + 1] - bounds[index * 2];\n}\n\nfunction _getLengths(bounds) {\n return [_getLength(bounds, 0), _getLength(bounds, 1), _getLength(bounds, 2)];\n}\n\nfunction _getXRange(bounds) {\n return bounds.slice(0, 2);\n}\n\nfunction _getYRange(bounds) {\n return bounds.slice(2, 4);\n}\n\nfunction _getZRange(bounds) {\n return bounds.slice(4, 6);\n}\n\nfunction _getMaxLength(bounds) {\n var l = _getLengths(bounds);\n\n if (l[0] > l[1]) {\n if (l[0] > l[2]) {\n return l[0];\n }\n\n return l[2];\n }\n\n if (l[1] > l[2]) {\n return l[1];\n }\n\n return l[2];\n}\n\nfunction _getDiagonalLength(bounds) {\n if (_isValid(bounds)) {\n var l = _getLengths(bounds);\n\n return Math.sqrt(l[0] * l[0] + l[1] * l[1] + l[2] * l[2]);\n }\n\n return null;\n}\n\nfunction _getMinPoint(bounds) {\n return [bounds[0], bounds[2], bounds[4]];\n}\n\nfunction _getMaxPoint(bounds) {\n return [bounds[1], bounds[3], bounds[5]];\n}\n\nfunction oppositeSign(a, b) {\n return a <= 0 && b >= 0 || a >= 0 && b <= 0;\n}\n\nfunction _getCorners(bounds, corners) {\n var count = 0;\n\n for (var ix = 0; ix < 2; ix++) {\n for (var iy = 2; iy < 4; iy++) {\n for (var iz = 4; iz < 6; iz++) {\n corners[count] = [bounds[ix], bounds[iy], bounds[iz]];\n count++;\n }\n }\n }\n\n return corners;\n} // Computes the two corners with minimal and miximal coordinates\n\nfunction _computeCornerPoints(bounds, point1, point2) {\n point1[0] = bounds[0];\n point1[1] = bounds[2];\n point1[2] = bounds[4];\n point2[0] = bounds[1];\n point2[1] = bounds[3];\n point2[2] = bounds[5];\n return point1;\n}\n\nfunction _transformBounds(bounds, transform) {\n var out = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];\n\n if (out.length < 6) {\n _reset(out);\n }\n\n var corners = _getCorners(bounds, []);\n\n for (var i = 0; i < corners.length; ++i) {\n vec3.transformMat4(corners[i], corners[i], transform);\n }\n\n return _addPoints(out, corners);\n}\n\nfunction _computeScale(bounds) {\n var scale3 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n scale3[0] = 0.5 * (bounds[1] - bounds[0]);\n scale3[1] = 0.5 * (bounds[3] - bounds[2]);\n scale3[2] = 0.5 * (bounds[5] - bounds[4]);\n return scale3;\n}\n\nfunction _computeLocalBounds(points, u, v, w) {\n var bounds = [].concat(INIT_BOUNDS);\n var pointsData = points.getData();\n\n for (var i = 0; i < pointsData.length; i += 3) {\n var point = [pointsData[i], pointsData[i + 1], pointsData[i + 2]];\n var du = dot(point, u);\n bounds[0] = Math.min(du, bounds[0]);\n bounds[1] = Math.max(du, bounds[1]);\n var dv = dot(point, v);\n bounds[2] = Math.min(dv, bounds[2]);\n bounds[3] = Math.max(dv, bounds[3]);\n var dw = dot(point, w);\n bounds[4] = Math.min(dw, bounds[4]);\n bounds[5] = Math.max(dw, bounds[5]);\n }\n\n return bounds;\n} // The method returns a non-zero value if the bounding box is hit.\n\nfunction _intersectBox(bounds, origin, dir, coord, tolerance) {\n var inside = true;\n var quadrant = [];\n var whichPlane = 0;\n var maxT = [];\n var candidatePlane = [0.0, 0.0, 0.0];\n var RIGHT = 0;\n var LEFT = 1;\n var MIDDLE = 2; // First find closest planes\n\n for (var i = 0; i < 3; i++) {\n if (origin[i] < bounds[2 * i]) {\n quadrant[i] = LEFT;\n candidatePlane[i] = bounds[2 * i];\n inside = false;\n } else if (origin[i] > bounds[2 * i + 1]) {\n quadrant[i] = RIGHT;\n candidatePlane[i] = bounds[2 * i + 1];\n inside = false;\n } else {\n quadrant[i] = MIDDLE;\n }\n } // Check whether origin of ray is inside bbox\n\n\n if (inside) {\n coord[0] = origin[0];\n coord[1] = origin[1];\n coord[2] = origin[2];\n tolerance[0] = 0;\n return 1;\n } // Calculate parametric distance to plane\n\n\n for (var _i2 = 0; _i2 < 3; _i2++) {\n if (quadrant[_i2] !== MIDDLE && dir[_i2] !== 0.0) {\n maxT[_i2] = (candidatePlane[_i2] - origin[_i2]) / dir[_i2];\n } else {\n maxT[_i2] = -1.0;\n }\n } // Find the largest parametric value of intersection\n\n\n for (var _i3 = 0; _i3 < 3; _i3++) {\n if (maxT[whichPlane] < maxT[_i3]) {\n whichPlane = _i3;\n }\n } // Check for valie intersection along line\n\n\n if (maxT[whichPlane] > 1.0 || maxT[whichPlane] < 0.0) {\n return 0;\n }\n\n tolerance[0] = maxT[whichPlane]; // Intersection point along line is okay. Check bbox.\n\n for (var _i4 = 0; _i4 < 3; _i4++) {\n if (whichPlane !== _i4) {\n coord[_i4] = origin[_i4] + maxT[whichPlane] * dir[_i4];\n\n if (coord[_i4] < bounds[2 * _i4] || coord[_i4] > bounds[2 * _i4 + 1]) {\n return 0;\n }\n } else {\n coord[_i4] = candidatePlane[_i4];\n }\n }\n\n return 1;\n} // Plane intersection with box\n\nfunction _intersectPlane(bounds, origin, normal) {\n var p = [];\n var d = 0;\n var sign = 1;\n var firstOne = 1; // Evaluate the eight points. If there is a sign change, there is an intersection\n\n for (var z = 4; z <= 5; ++z) {\n p[2] = bounds[z];\n\n for (var y = 2; y <= 3; ++y) {\n p[1] = bounds[y];\n\n for (var x = 0; x <= 1; ++x) {\n p[0] = bounds[x];\n d = vtkPlane.evaluate(normal, origin, p);\n\n if (firstOne) {\n sign = d >= 0 ? 1 : -1;\n firstOne = 0;\n }\n\n if (d === 0.0 || sign > 0 && d < 0.0 || sign < 0 && d > 0.0) {\n return 1;\n }\n }\n }\n }\n\n return 0; // no intersection\n}\n\nfunction _intersect(bounds, bBounds) {\n if (!(_isValid(bounds) && _isValid(bBounds))) {\n return false;\n }\n\n var newBounds = [0, 0, 0, 0, 0, 0];\n var intersection;\n\n for (var i = 0; i < 3; i++) {\n intersection = false;\n\n if (bBounds[i * 2] >= bounds[i * 2] && bBounds[i * 2] <= bounds[i * 2 + 1]) {\n intersection = true;\n newBounds[i * 2] = bBounds[i * 2];\n } else if (bounds[i * 2] >= bBounds[i * 2] && bounds[i * 2] <= bBounds[i * 2 + 1]) {\n intersection = true;\n newBounds[i * 2] = bounds[i * 2];\n }\n\n if (bBounds[i * 2 + 1] >= bounds[i * 2] && bBounds[i * 2 + 1] <= bounds[i * 2 + 1]) {\n intersection = true;\n newBounds[i * 2 + 1] = bBounds[2 * i + 1];\n } else if (bounds[i * 2 + 1] >= bBounds[i * 2] && bounds[i * 2 + 1] <= bBounds[i * 2 + 1]) {\n intersection = true;\n newBounds[i * 2 + 1] = bounds[i * 2 + 1];\n }\n\n if (!intersection) {\n return false;\n }\n } // OK they did intersect - set the box to be the result\n\n\n bounds[0] = newBounds[0];\n bounds[1] = newBounds[1];\n bounds[2] = newBounds[2];\n bounds[3] = newBounds[3];\n bounds[4] = newBounds[4];\n bounds[5] = newBounds[5];\n return true;\n}\n\nfunction _intersects(bounds, bBounds) {\n if (!(_isValid(bounds) && _isValid(bBounds))) {\n return false;\n }\n /* eslint-disable no-continue */\n\n\n for (var i = 0; i < 3; i++) {\n if (bBounds[i * 2] >= bounds[i * 2] && bBounds[i * 2] <= bounds[i * 2 + 1]) {\n continue;\n } else if (bounds[i * 2] >= bBounds[i * 2] && bounds[i * 2] <= bBounds[i * 2 + 1]) {\n continue;\n }\n\n if (bBounds[i * 2 + 1] >= bounds[i * 2] && bBounds[i * 2 + 1] <= bounds[i * 2 + 1]) {\n continue;\n } else if (bounds[i * 2 + 1] >= bBounds[i * 2] && bounds[i * 2 + 1] <= bBounds[i * 2 + 1]) {\n continue;\n }\n\n return false;\n }\n /* eslint-enable no-continue */\n\n\n return true;\n}\n\nfunction _containsPoint(bounds, x, y, z) {\n if (x < bounds[0] || x > bounds[1]) {\n return false;\n }\n\n if (y < bounds[2] || y > bounds[3]) {\n return false;\n }\n\n if (z < bounds[4] || z > bounds[5]) {\n return false;\n }\n\n return true;\n}\nfunction contains(bounds, otherBounds) {\n // if either box is not valid or they don't intersect\n if (!_intersects(bounds, otherBounds)) {\n return false;\n }\n\n if (!_containsPoint.apply(void 0, [bounds].concat(_toConsumableArray(_getMinPoint(otherBounds))))) {\n return false;\n }\n\n if (!_containsPoint.apply(void 0, [bounds].concat(_toConsumableArray(_getMaxPoint(otherBounds))))) {\n return false;\n }\n\n return true;\n}\n/**\n * Returns true if plane intersects bounding box.\n * If so, the box is cut by the plane\n * @param {array} origin\n * @param {array} normal\n */\n\nfunction _cutWithPlane(bounds, origin, normal) {\n // Index[0..2] represents the order of traversing the corners of a cube\n // in (x,y,z), (y,x,z) and (z,x,y) ordering, respectively\n var index = [[0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 4, 5, 2, 3, 6, 7], [0, 2, 4, 6, 1, 3, 5, 7]]; // stores the signed distance to a plane\n\n var d = [0, 0, 0, 0, 0, 0, 0, 0];\n var idx = 0;\n\n for (var ix = 0; ix < 2; ix++) {\n for (var iy = 2; iy < 4; iy++) {\n for (var iz = 4; iz < 6; iz++) {\n var x = [bounds[ix], bounds[iy], bounds[iz]];\n d[idx++] = vtkPlane.evaluate(normal, origin, x);\n }\n }\n }\n\n var dir = 2;\n\n while (dir--) {\n // in each direction, we test if the vertices of two orthogonal faces\n // are on either side of the plane\n if (oppositeSign(d[index[dir][0]], d[index[dir][4]]) && oppositeSign(d[index[dir][1]], d[index[dir][5]]) && oppositeSign(d[index[dir][2]], d[index[dir][6]]) && oppositeSign(d[index[dir][3]], d[index[dir][7]])) {\n break;\n }\n }\n\n if (dir < 0) {\n return false;\n }\n\n var sign = Math.sign(normal[dir]);\n var size = Math.abs((bounds[dir * 2 + 1] - bounds[dir * 2]) * normal[dir]);\n var t = sign > 0 ? 1 : 0;\n /* eslint-disable no-continue */\n\n for (var i = 0; i < 4; i++) {\n if (size === 0) {\n continue; // shouldn't happen\n }\n\n var ti = Math.abs(d[index[dir][i]]) / size;\n\n if (sign > 0 && ti < t) {\n t = ti;\n }\n\n if (sign < 0 && ti > t) {\n t = ti;\n }\n }\n /* eslint-enable no-continue */\n\n\n var bound = (1.0 - t) * bounds[dir * 2] + t * bounds[dir * 2 + 1];\n\n if (sign > 0) {\n bounds[dir * 2] = bound;\n } else {\n bounds[dir * 2 + 1] = bound;\n }\n\n return true;\n} // ----------------------------------------------------------------------------\n\nvar BoundingBox = /*#__PURE__*/function () {\n function BoundingBox(refBounds) {\n _classCallCheck(this, BoundingBox);\n\n this.bounds = refBounds;\n\n if (!this.bounds) {\n this.bounds = new Float64Array(INIT_BOUNDS);\n }\n }\n\n _createClass(BoundingBox, [{\n key: \"getBounds\",\n value: function getBounds() {\n return this.bounds;\n }\n }, {\n key: \"equals\",\n value: function equals(otherBounds) {\n return _equals(this.bounds, otherBounds);\n }\n }, {\n key: \"isValid\",\n value: function isValid() {\n return _isValid(this.bounds);\n }\n }, {\n key: \"setBounds\",\n value: function setBounds(otherBounds) {\n return _setBounds(this.bounds, otherBounds);\n }\n }, {\n key: \"reset\",\n value: function reset() {\n return _reset(this.bounds);\n }\n }, {\n key: \"addPoint\",\n value: function addPoint() {\n for (var _len = arguments.length, xyz = new Array(_len), _key = 0; _key < _len; _key++) {\n xyz[_key] = arguments[_key];\n }\n\n return _addPoint.apply(void 0, [this.bounds].concat(xyz));\n }\n }, {\n key: \"addPoints\",\n value: function addPoints(points) {\n return _addPoints(this.bounds, points);\n }\n }, {\n key: \"addBounds\",\n value: function addBounds(xMin, xMax, yMin, yMax, zMin, zMax) {\n return _addBounds(this.bounds, xMin, xMax, yMin, yMax, zMin, zMax);\n }\n }, {\n key: \"setMinPoint\",\n value: function setMinPoint(x, y, z) {\n return _setMinPoint(this.bounds, x, y, z);\n }\n }, {\n key: \"setMaxPoint\",\n value: function setMaxPoint(x, y, z) {\n return _setMaxPoint(this.bounds, x, y, z);\n }\n }, {\n key: \"inflate\",\n value: function inflate(delta) {\n return _inflate(this.bounds, delta);\n }\n }, {\n key: \"scale\",\n value: function scale(sx, sy, sz) {\n return _scale(this.bounds, sx, sy, sz);\n }\n }, {\n key: \"getCenter\",\n value: function getCenter() {\n return _getCenter(this.bounds);\n }\n }, {\n key: \"getLength\",\n value: function getLength(index) {\n return _getLength(this.bounds, index);\n }\n }, {\n key: \"getLengths\",\n value: function getLengths() {\n return _getLengths(this.bounds);\n }\n }, {\n key: \"getMaxLength\",\n value: function getMaxLength() {\n return _getMaxLength(this.bounds);\n }\n }, {\n key: \"getDiagonalLength\",\n value: function getDiagonalLength() {\n return _getDiagonalLength(this.bounds);\n }\n }, {\n key: \"getMinPoint\",\n value: function getMinPoint() {\n return _getMinPoint(this.bounds);\n }\n }, {\n key: \"getMaxPoint\",\n value: function getMaxPoint() {\n return _getMaxPoint(this.bounds);\n }\n }, {\n key: \"getXRange\",\n value: function getXRange() {\n return _getXRange(this.bounds);\n }\n }, {\n key: \"getYRange\",\n value: function getYRange() {\n return _getYRange(this.bounds);\n }\n }, {\n key: \"getZRange\",\n value: function getZRange() {\n return _getZRange(this.bounds);\n }\n }, {\n key: \"getCorners\",\n value: function getCorners(corners) {\n return _getCorners(this.bounds, corners);\n }\n }, {\n key: \"computeCornerPoints\",\n value: function computeCornerPoints(point1, point2) {\n return _computeCornerPoints(this.bounds, point1, point2);\n }\n }, {\n key: \"computeLocalBounds\",\n value: function computeLocalBounds(u, v, w) {\n return _computeLocalBounds(this.bounds, u, v, w);\n }\n }, {\n key: \"transformBounds\",\n value: function transformBounds(transform) {\n var out = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n return _transformBounds(this.bounds, transform, out);\n }\n }, {\n key: \"computeScale3\",\n value: function computeScale3(scale3) {\n return _computeScale(this.bounds, scale3);\n }\n }, {\n key: \"cutWithPlane\",\n value: function cutWithPlane(origin, normal) {\n return _cutWithPlane(this.bounds, origin, normal);\n }\n }, {\n key: \"intersectBox\",\n value: function intersectBox(origin, dir, coord, tolerance) {\n return _intersectBox(this.bounds, origin, dir, coord, tolerance);\n }\n }, {\n key: \"intersectPlane\",\n value: function intersectPlane(origin, normal) {\n return _intersectPlane(this.bounds, origin, normal);\n }\n }, {\n key: \"intersect\",\n value: function intersect(otherBounds) {\n return _intersect(this.bounds, otherBounds);\n }\n }, {\n key: \"intersects\",\n value: function intersects(otherBounds) {\n return _intersects(this.bounds, otherBounds);\n }\n }, {\n key: \"containsPoint\",\n value: function containsPoint(x, y, z) {\n return _containsPoint(this.bounds, x, y, z);\n }\n }, {\n key: \"contains\",\n value: function contains(otherBounds) {\n return _intersects(this.bounds, otherBounds);\n }\n }]);\n\n return BoundingBox;\n}();\n\nfunction newInstance(initialValues) {\n var bounds = initialValues && initialValues.bounds;\n return new BoundingBox(bounds);\n} // ----------------------------------------------------------------------------\n// Static API\n// ----------------------------------------------------------------------------\n\n\nvar STATIC = {\n equals: _equals,\n isValid: _isValid,\n setBounds: _setBounds,\n reset: _reset,\n addPoint: _addPoint,\n addPoints: _addPoints,\n addBounds: _addBounds,\n setMinPoint: _setMinPoint,\n setMaxPoint: _setMaxPoint,\n inflate: _inflate,\n scale: _scale,\n scaleAboutCenter: scaleAboutCenter,\n getCenter: _getCenter,\n getLength: _getLength,\n getLengths: _getLengths,\n getMaxLength: _getMaxLength,\n getDiagonalLength: _getDiagonalLength,\n getMinPoint: _getMinPoint,\n getMaxPoint: _getMaxPoint,\n getXRange: _getXRange,\n getYRange: _getYRange,\n getZRange: _getZRange,\n getCorners: _getCorners,\n computeCornerPoints: _computeCornerPoints,\n computeLocalBounds: _computeLocalBounds,\n transformBounds: _transformBounds,\n computeScale3: _computeScale,\n cutWithPlane: _cutWithPlane,\n intersectBox: _intersectBox,\n intersectPlane: _intersectPlane,\n intersect: _intersect,\n intersects: _intersects,\n containsPoint: _containsPoint,\n contains: contains,\n INIT_BOUNDS: INIT_BOUNDS\n};\nvar vtkBoundingBox = _objectSpread({\n newInstance: newInstance\n}, STATIC);\n\nexport { STATIC, _addBounds as addBounds, _addPoint as addPoint, _addPoints as addPoints, _computeCornerPoints as computeCornerPoints, _computeLocalBounds as computeLocalBounds, _computeScale as computeScale3, contains, _containsPoint as containsPoint, _cutWithPlane as cutWithPlane, vtkBoundingBox as default, _equals as equals, _getCenter as getCenter, _getCorners as getCorners, _getDiagonalLength as getDiagonalLength, _getLength as getLength, _getLengths as getLengths, _getMaxLength as getMaxLength, _getMaxPoint as getMaxPoint, _getMinPoint as getMinPoint, _getXRange as getXRange, _getYRange as getYRange, _getZRange as getZRange, _inflate as inflate, _intersect as intersect, _intersectBox as intersectBox, _intersectPlane as intersectPlane, _intersects as intersects, _isValid as isValid, _reset as reset, _scale as scale, scaleAboutCenter, _setBounds as setBounds, _setMaxPoint as setMaxPoint, _setMinPoint as setMinPoint, _transformBounds as transformBounds };\n","import vtk from '../../../vtk.js';\nimport macro from '../../../macros.js';\nimport vtkDataArray from '../../Core/DataArray.js';\n\nvar vtkErrorMacro = macro.vtkErrorMacro,\n vtkWarningMacro = macro.vtkWarningMacro; // ----------------------------------------------------------------------------\n// vtkFieldData methods\n// ----------------------------------------------------------------------------\n\nfunction vtkFieldData(publicAPI, model) {\n model.classHierarchy.push('vtkFieldData');\n var superGetState = publicAPI.getState; // Decode serialized data if any\n\n if (model.arrays) {\n model.arrays = model.arrays.map(function (item) {\n return {\n data: vtk(item.data)\n };\n });\n }\n\n publicAPI.initialize = function () {\n publicAPI.initializeFields();\n publicAPI.copyAllOn();\n publicAPI.clearFieldFlags();\n };\n\n publicAPI.initializeFields = function () {\n model.arrays = [];\n model.copyFieldFlags = {};\n publicAPI.modified();\n };\n\n publicAPI.copyStructure = function (other) {\n publicAPI.initializeFields();\n model.copyFieldFlags = other.getCopyFieldFlags().map(function (x) {\n return x;\n }); // Deep-copy\n\n model.arrays = other.arrays().map(function (x) {\n return {\n array: x\n };\n }); // Deep-copy\n // TODO: Copy array information objects (once we support information objects)\n };\n\n publicAPI.getNumberOfArrays = function () {\n return model.arrays.length;\n };\n\n publicAPI.getNumberOfActiveArrays = function () {\n return model.arrays.length;\n };\n\n publicAPI.addArray = function (arr) {\n var name = arr.getName();\n\n var _publicAPI$getArrayWi = publicAPI.getArrayWithIndex(name),\n array = _publicAPI$getArrayWi.array,\n index = _publicAPI$getArrayWi.index;\n\n if (array != null) {\n model.arrays[index] = {\n data: arr\n };\n return index;\n }\n\n model.arrays = [].concat(model.arrays, {\n data: arr\n });\n return model.arrays.length - 1;\n };\n\n publicAPI.removeAllArrays = function () {\n model.arrays = [];\n };\n\n publicAPI.removeArray = function (arrayName) {\n var index = model.arrays.findIndex(function (array) {\n return array.getName() === arrayName;\n });\n return publicAPI.removeArrayByIndex(index);\n };\n\n publicAPI.removeArrayByIndex = function (arrayIdx) {\n if (arrayIdx !== -1 && arrayIdx < model.arrays.length) {\n model.arrays.splice(arrayIdx, 1); // TBD modified() ?\n\n return true;\n }\n\n return false;\n };\n\n publicAPI.getArrays = function () {\n return model.arrays.map(function (entry) {\n return entry.data;\n });\n };\n\n publicAPI.getArray = function (arraySpec) {\n return typeof arraySpec === 'number' ? publicAPI.getArrayByIndex(arraySpec) : publicAPI.getArrayByName(arraySpec);\n };\n\n publicAPI.getArrayByName = function (arrayName) {\n return model.arrays.reduce(function (a, b, i) {\n return b.data.getName() === arrayName ? b.data : a;\n }, null);\n };\n\n publicAPI.getArrayWithIndex = function (arrayName) {\n var index = model.arrays.findIndex(function (array) {\n return array.data.getName() === arrayName;\n });\n return {\n array: index !== -1 ? model.arrays[index].data : null,\n index: index\n };\n };\n\n publicAPI.getArrayByIndex = function (idx) {\n return idx >= 0 && idx < model.arrays.length ? model.arrays[idx].data : null;\n };\n\n publicAPI.hasArray = function (arrayName) {\n return publicAPI.getArrayWithIndex(arrayName).index >= 0;\n };\n\n publicAPI.getArrayName = function (idx) {\n var arr = model.arrays[idx];\n return arr ? arr.data.getName() : '';\n };\n\n publicAPI.getCopyFieldFlags = function () {\n return model.copyFieldFlags;\n };\n\n publicAPI.getFlag = function (arrayName) {\n return model.copyFieldFlags[arrayName];\n };\n\n publicAPI.passData = function (other) {\n var fromId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : -1;\n var toId = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : -1;\n other.getArrays().forEach(function (arr) {\n var copyFlag = publicAPI.getFlag(arr.getName());\n\n if (copyFlag !== false && !(model.doCopyAllOff && copyFlag !== true) && arr) {\n var destArr = publicAPI.getArrayByName(arr.getName());\n\n if (!destArr) {\n if (fromId < 0 || fromId > arr.getNumberOfTuples()) {\n // TBD: should this be a deep or a shallow copy?\n publicAPI.addArray(arr);\n other.getAttributes(arr).forEach(function (attrType) {\n publicAPI.setAttribute(arr, attrType);\n });\n } else {\n var ncomps = arr.getNumberOfComponents();\n var newSize = arr.getNumberOfValues();\n var tId = toId > -1 ? toId : fromId;\n\n if (newSize <= tId * ncomps) {\n newSize = (tId + 1) * ncomps;\n }\n\n destArr = vtkDataArray.newInstance({\n name: arr.getName(),\n dataType: arr.getDataType(),\n numberOfComponents: ncomps,\n values: macro.newTypedArray(arr.getDataType(), newSize),\n size: 0\n });\n destArr.insertTuple(tId, arr.getTuple(fromId));\n publicAPI.addArray(destArr);\n other.getAttributes(arr).forEach(function (attrType) {\n publicAPI.setAttribute(destArr, attrType);\n });\n }\n } else if (arr.getNumberOfComponents() === destArr.getNumberOfComponents()) {\n if (fromId > -1 && fromId < arr.getNumberOfTuples()) {\n var _tId = toId > -1 ? toId : fromId;\n\n destArr.insertTuple(_tId, arr.getTuple(fromId));\n } else {\n // if `fromId` is not provided, just copy all (or as much possible)\n // from `arr` to `destArr`.\n destArr.insertTuples(0, arr.getTuples());\n }\n } else {\n vtkErrorMacro('Unhandled case in passData');\n }\n }\n });\n };\n\n publicAPI.interpolateData = function (other) {\n var fromId1 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : -1;\n var fromId2 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : -1;\n var toId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : -1;\n var t = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0.5;\n other.getArrays().forEach(function (arr) {\n var copyFlag = publicAPI.getFlag(arr.getName());\n\n if (copyFlag !== false && !(model.doCopyAllOff && copyFlag !== true) && arr) {\n var destArr = publicAPI.getArrayByName(arr.getName());\n\n if (!destArr) {\n if (fromId1 < 0 || fromId2 < 0 || fromId1 > arr.getNumberOfTuples()) {\n // TBD: should this be a deep or a shallow copy?\n publicAPI.addArray(arr);\n other.getAttributes(arr).forEach(function (attrType) {\n publicAPI.setAttribute(arr, attrType);\n });\n } else {\n var ncomps = arr.getNumberOfComponents();\n var newSize = arr.getNumberOfValues(); // TODO: Is this supposed to happen?\n\n var tId = toId > -1 ? toId : fromId1;\n\n if (newSize <= tId * ncomps) {\n newSize = (tId + 1) * ncomps;\n }\n\n destArr = vtkDataArray.newInstance({\n name: arr.getName(),\n dataType: arr.getDataType(),\n numberOfComponents: ncomps,\n values: macro.newTypedArray(arr.getDataType(), newSize),\n size: 0\n });\n destArr.interpolateTuple(tId, arr, fromId1, arr, fromId2, t);\n publicAPI.addArray(destArr);\n other.getAttributes(arr).forEach(function (attrType) {\n publicAPI.setAttribute(destArr, attrType);\n });\n }\n } else if (arr.getNumberOfComponents() === destArr.getNumberOfComponents()) {\n if (fromId1 > -1 && fromId1 < arr.getNumberOfTuples()) {\n var _tId2 = toId > -1 ? toId : fromId1;\n\n destArr.interpolateTuple(_tId2, arr, fromId1, arr, fromId2, t);\n vtkWarningMacro('Unexpected case in interpolateData');\n } else {\n // if `fromId` is not provided, just copy all (or as much possible)\n // from `arr` to `destArr`.\n destArr.insertTuples(arr.getTuples());\n }\n } else {\n vtkErrorMacro('Unhandled case in interpolateData');\n }\n }\n });\n };\n\n publicAPI.copyFieldOn = function (arrayName) {\n model.copyFieldFlags[arrayName] = true;\n };\n\n publicAPI.copyFieldOff = function (arrayName) {\n model.copyFieldFlags[arrayName] = false;\n };\n\n publicAPI.copyAllOn = function () {\n if (!model.doCopyAllOn || model.doCopyAllOff) {\n model.doCopyAllOn = true;\n model.doCopyAllOff = false;\n publicAPI.modified();\n }\n };\n\n publicAPI.copyAllOff = function () {\n if (model.doCopyAllOn || !model.doCopyAllOff) {\n model.doCopyAllOn = false;\n model.doCopyAllOff = true;\n publicAPI.modified();\n }\n };\n\n publicAPI.clearFieldFlags = function () {\n model.copyFieldFlags = {};\n };\n\n publicAPI.deepCopy = function (other) {\n model.arrays = other.getArrays().map(function (arr) {\n var arrNew = arr.newClone();\n arrNew.deepCopy(arr);\n return {\n data: arrNew\n };\n });\n };\n\n publicAPI.copyFlags = function (other) {\n return other.getCopyFieldFlags().map(function (x) {\n return x;\n });\n }; // TODO: publicAPI.squeeze = () => model.arrays.forEach(entry => entry.data.squeeze());\n\n\n publicAPI.reset = function () {\n return model.arrays.forEach(function (entry) {\n return entry.data.reset();\n });\n }; // TODO: getActualMemorySize\n\n\n publicAPI.getMTime = function () {\n return model.arrays.reduce(function (a, b) {\n return b.data.getMTime() > a ? b.data.getMTime() : a;\n }, model.mtime);\n }; // TODO: publicAPI.getField = (ids, other) => { copy ids from other into this model's arrays }\n // TODO: publicAPI.getArrayContainingComponent = (component) => ...\n\n\n publicAPI.getNumberOfComponents = function () {\n return model.arrays.reduce(function (a, b) {\n return a + b.data.getNumberOfComponents();\n }, 0);\n };\n\n publicAPI.getNumberOfTuples = function () {\n return model.arrays.length > 0 ? model.arrays[0].getNumberOfTuples() : 0;\n };\n\n publicAPI.getState = function () {\n var result = superGetState();\n\n if (result) {\n result.arrays = model.arrays.map(function (item) {\n return {\n data: item.data.getState()\n };\n });\n }\n\n return result;\n };\n}\n\nvar DEFAULT_VALUES = {\n arrays: [],\n copyFieldFlags: [],\n // fields not to copy\n doCopyAllOn: true,\n doCopyAllOff: false\n};\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues);\n macro.obj(publicAPI, model);\n vtkFieldData(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkFieldData'); // ----------------------------------------------------------------------------\n\nvar vtkFieldData$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkFieldData$1 as default, extend, newInstance };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport macro from '../../macros.js';\nimport vtkFieldData from './DataSetAttributes/FieldData.js';\nimport Constants from './DataSetAttributes/Constants.js';\nimport vtkDataArray from '../Core/DataArray.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nvar AttributeTypes = Constants.AttributeTypes,\n AttributeCopyOperations = Constants.AttributeCopyOperations;\nvar vtkWarningMacro = macro.vtkWarningMacro; // ----------------------------------------------------------------------------\n// vtkDataSetAttributes methods\n// ----------------------------------------------------------------------------\n\nfunction vtkDataSetAttributes(publicAPI, model) {\n var attrTypes = ['Scalars', 'Vectors', 'Normals', 'TCoords', 'Tensors', 'GlobalIds', 'PedigreeIds'];\n\n function cleanAttributeType(attType) {\n // Given an integer or string, convert the result to one of the\n // strings in the \"attrTypes\" array above or null (if\n // no match is found)\n var cleanAttType = attrTypes.find(function (ee) {\n return AttributeTypes[ee.toUpperCase()] === attType || typeof attType !== 'number' && ee.toLowerCase() === attType.toLowerCase();\n });\n\n if (typeof cleanAttType === 'undefined') {\n cleanAttType = null;\n }\n\n return cleanAttType;\n } // Set our className\n\n\n model.classHierarchy.push('vtkDataSetAttributes');\n\n var superClass = _objectSpread({}, publicAPI);\n\n publicAPI.checkNumberOfComponents = function (x) {\n return true;\n }; // TODO\n\n\n publicAPI.setAttribute = function (arr, uncleanAttType) {\n var attType = cleanAttributeType(uncleanAttType);\n\n if (arr && attType.toUpperCase() === 'PEDIGREEIDS' && !arr.isA('vtkDataArray')) {\n vtkWarningMacro(\"Cannot set attribute \".concat(attType, \". The attribute must be a vtkDataArray.\"));\n return -1;\n }\n\n if (arr && !publicAPI.checkNumberOfComponents(arr, attType)) {\n vtkWarningMacro(\"Cannot set attribute \".concat(attType, \". Incorrect number of components.\"));\n return -1;\n }\n\n var currentAttribute = model[\"active\".concat(attType)];\n\n if (currentAttribute >= 0 && currentAttribute < model.arrays.length) {\n if (model.arrays[currentAttribute] === arr) {\n return currentAttribute;\n } // FIXME setting an array actually changes its index\n\n\n publicAPI.removeArrayByIndex(currentAttribute);\n }\n\n if (arr) {\n currentAttribute = publicAPI.addArray(arr);\n model[\"active\".concat(attType)] = currentAttribute;\n } else {\n model[\"active\".concat(attType)] = -1;\n }\n\n publicAPI.modified();\n return model[\"active\".concat(attType)];\n };\n\n publicAPI.getAttributes = function (arr) {\n return attrTypes.filter(function (attrType) {\n return publicAPI[\"get\".concat(attrType)]() === arr;\n });\n };\n\n publicAPI.setActiveAttributeByName = function (arrayName, attType) {\n return publicAPI.setActiveAttributeByIndex(publicAPI.getArrayWithIndex(arrayName).index, attType);\n };\n\n publicAPI.setActiveAttributeByIndex = function (arrayIdx, uncleanAttType) {\n var attType = cleanAttributeType(uncleanAttType);\n\n if (arrayIdx >= 0 && arrayIdx < model.arrays.length) {\n if (attType.toUpperCase() !== 'PEDIGREEIDS') {\n var arr = publicAPI.getArrayByIndex(arrayIdx);\n\n if (!arr.isA('vtkDataArray')) {\n vtkWarningMacro(\"Cannot set attribute \".concat(attType, \". Only vtkDataArray subclasses can be set as active attributes.\"));\n return -1;\n }\n\n if (!publicAPI.checkNumberOfComponents(arr, attType)) {\n vtkWarningMacro(\"Cannot set attribute \".concat(attType, \". Incorrect number of components.\"));\n return -1;\n }\n }\n\n model[\"active\".concat(attType)] = arrayIdx;\n publicAPI.modified();\n return arrayIdx;\n }\n\n if (arrayIdx === -1) {\n model[\"active\".concat(attType)] = arrayIdx;\n publicAPI.modified();\n }\n\n return -1;\n };\n\n publicAPI.getActiveAttribute = function (attType) {\n // Given an integer enum value or a string (with random capitalization),\n // find the matching string in attrTypes.\n var cleanAttType = cleanAttributeType(attType);\n return publicAPI[\"get\".concat(cleanAttType)]();\n }; // Override to allow proper handling of active attributes\n\n\n publicAPI.removeAllArrays = function () {\n attrTypes.forEach(function (attType) {\n model[\"active\".concat(attType)] = -1;\n });\n superClass.removeAllArrays();\n }; // Override to allow proper handling of active attributes\n\n\n publicAPI.removeArrayByIndex = function (arrayIdx) {\n if (arrayIdx !== -1) {\n attrTypes.forEach(function (attType) {\n if (arrayIdx === model[\"active\".concat(attType)]) {\n model[\"active\".concat(attType)] = -1;\n } else if (arrayIdx < model[\"active\".concat(attType)]) {\n model[\"active\".concat(attType)] -= 1;\n }\n });\n }\n\n return superClass.removeArrayByIndex(arrayIdx);\n };\n\n attrTypes.forEach(function (value) {\n var activeVal = \"active\".concat(value);\n\n publicAPI[\"get\".concat(value)] = function () {\n return publicAPI.getArrayByIndex(model[activeVal]);\n };\n\n publicAPI[\"set\".concat(value)] = function (da) {\n return publicAPI.setAttribute(da, value);\n };\n\n publicAPI[\"setActive\".concat(value)] = function (arrayName) {\n return publicAPI.setActiveAttributeByIndex(publicAPI.getArrayWithIndex(arrayName).index, value);\n };\n\n publicAPI[\"copy\".concat(value, \"Off\")] = function () {\n var attType = value.toUpperCase();\n model.copyAttributeFlags[AttributeCopyOperations.PASSDATA][AttributeTypes[attType]] = false;\n };\n\n publicAPI[\"copy\".concat(value, \"On\")] = function () {\n var attType = value.toUpperCase();\n model.copyAttributeFlags[AttributeCopyOperations.PASSDATA][AttributeTypes[attType]] = true;\n };\n });\n\n publicAPI.initializeAttributeCopyFlags = function () {\n // Default to copying all attributes in every circumstance:\n model.copyAttributeFlags = [];\n Object.keys(AttributeCopyOperations).filter(function (op) {\n return op !== 'ALLCOPY';\n }).forEach(function (attCopyOp) {\n model.copyAttributeFlags[AttributeCopyOperations[attCopyOp]] = Object.keys(AttributeTypes).filter(function (ty) {\n return ty !== 'NUM_ATTRIBUTES';\n }).reduce(function (a, b) {\n a[AttributeTypes[b]] = true;\n return a;\n }, []);\n }); // Override some operations where we don't want to copy:\n\n model.copyAttributeFlags[AttributeCopyOperations.COPYTUPLE][AttributeTypes.GLOBALIDS] = false;\n model.copyAttributeFlags[AttributeCopyOperations.INTERPOLATE][AttributeTypes.GLOBALIDS] = false;\n model.copyAttributeFlags[AttributeCopyOperations.COPYTUPLE][AttributeTypes.PEDIGREEIDS] = false;\n };\n\n publicAPI.initialize = macro.chain(publicAPI.initialize, publicAPI.initializeAttributeCopyFlags); // Process dataArrays if any\n\n if (model.dataArrays && Object.keys(model.dataArrays).length) {\n Object.keys(model.dataArrays).forEach(function (name) {\n if (!model.dataArrays[name].ref && model.dataArrays[name].type === 'vtkDataArray') {\n publicAPI.addArray(vtkDataArray.newInstance(model.dataArrays[name]));\n }\n });\n }\n\n var superShallowCopy = publicAPI.shallowCopy;\n\n publicAPI.shallowCopy = function (other, debug) {\n superShallowCopy(other, debug);\n model.arrays = other.getArrays().map(function (arr) {\n var arrNew = arr.newClone();\n arrNew.shallowCopy(arr, debug);\n return {\n data: arrNew\n };\n });\n };\n\n publicAPI.initializeAttributeCopyFlags();\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n activeScalars: -1,\n activeVectors: -1,\n activeTensors: -1,\n activeNormals: -1,\n activeTCoords: -1,\n activeGlobalIds: -1,\n activePedigreeIds: -1\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Object methods\n\n vtkFieldData.extend(publicAPI, model, initialValues);\n macro.setGet(publicAPI, model, ['activeScalars', 'activeNormals', 'activeTCoords', 'activeVectors', 'activeTensors', 'activeGlobalIds', 'activePedigreeIds']);\n\n if (!model.arrays) {\n model.arrays = {};\n } // Object specific methods\n\n\n vtkDataSetAttributes(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkDataSetAttributes'); // ----------------------------------------------------------------------------\n\nvar vtkDataSetAttributes$1 = _objectSpread({\n newInstance: newInstance,\n extend: extend\n}, Constants);\n\nexport { vtkDataSetAttributes$1 as default, extend, newInstance };\n","// Specify how data arrays can be used by data objects\nvar FieldDataTypes = {\n UNIFORM: 0,\n // data that does not vary over points/cells/etc.\n DATA_OBJECT_FIELD: 0,\n // to match VTK\n COORDINATE: 1,\n // data that specifies the location of each point\n POINT_DATA: 1,\n // to match VTK\n POINT: 2,\n // data defined at each point, but that does not specify the point location\n POINT_FIELD_DATA: 2,\n // to match VTK\n CELL: 3,\n // data defined at each cell, but that does not specify the cell\n CELL_FIELD_DATA: 3,\n // to match VTK\n VERTEX: 4,\n // data defined at each graph vertex, but that does not specify the graph vertex\n VERTEX_FIELD_DATA: 4,\n // to match VTK\n EDGE: 5,\n // data defined at each graph edge, but that does not specify the graph edge\n EDGE_FIELD_DATA: 5,\n // to match VTK\n ROW: 6,\n // data specifying a table row\n ROW_DATA: 6 // to match VTK\n\n};\nvar FieldAssociations = {\n FIELD_ASSOCIATION_POINTS: 0,\n FIELD_ASSOCIATION_CELLS: 1,\n FIELD_ASSOCIATION_NONE: 2,\n FIELD_ASSOCIATION_POINTS_THEN_CELLS: 3,\n FIELD_ASSOCIATION_VERTICES: 4,\n FIELD_ASSOCIATION_EDGES: 5,\n FIELD_ASSOCIATION_ROWS: 6,\n NUMBER_OF_ASSOCIATIONS: 7\n};\nvar Constants = {\n FieldDataTypes: FieldDataTypes,\n FieldAssociations: FieldAssociations\n};\n\nexport { FieldAssociations, FieldDataTypes, Constants as default };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport macro from '../../macros.js';\nimport vtk from '../../vtk.js';\nimport vtkDataSetAttributes from './DataSetAttributes.js';\nimport Constants from './DataSet/Constants.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n// import * as vtkMath from '../../Core/Math';\n//\n// function getBounds(dataset) {\n// if (dataset.bounds) {\n// return dataset.bounds;\n// }\n// if (dataset.type && dataset[dataset.type]) {\n// const ds = dataset[dataset.type];\n// if (ds.bounds) {\n// return ds.bounds;\n// }\n// if (ds.Points && ds.Points.bounds) {\n// return ds.Points.bounds;\n// }\n// if (ds.Points && ds.Points.values) {\n// const array = ds.Points.values;\n// const bbox = [...vtkBoundingBox.INIT_BOUNDS];\n// const size = array.length;\n// const delta = ds.Points.numberOfComponents ? ds.Points.numberOfComponents : 3;\n// for (let idx = 0; idx < size; idx += delta) {\n// vtkBoundingBox.addPoint(bbox, array[idx * delta], array[(idx * delta) + 1], array[(idx * delta) + 2]);\n// }\n// ds.Points.bounds = bbox;\n// return ds.Points.bounds;\n// }\n// }\n// return vtkMath.createUninitializedBounds();\n// }\n// ----------------------------------------------------------------------------\n// Global methods\n// ----------------------------------------------------------------------------\n\nvar DATASET_FIELDS = ['pointData', 'cellData', 'fieldData']; // ----------------------------------------------------------------------------\n// vtkDataSet methods\n// ----------------------------------------------------------------------------\n\nfunction vtkDataSet(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkDataSet'); // Add dataset attributes\n\n DATASET_FIELDS.forEach(function (fieldName) {\n if (!model[fieldName]) {\n model[fieldName] = vtkDataSetAttributes.newInstance();\n } else {\n model[fieldName] = vtk(model[fieldName]);\n }\n });\n var superShallowCopy = publicAPI.shallowCopy;\n\n publicAPI.shallowCopy = function (other) {\n var debug = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n superShallowCopy(other, debug);\n DATASET_FIELDS.forEach(function (fieldName) {\n model[fieldName] = vtkDataSetAttributes.newInstance();\n model[fieldName].shallowCopy(other.getReferenceByName(fieldName));\n });\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {// pointData: null,\n // cellData: null,\n // fieldData: null,\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Object methods\n\n macro.obj(publicAPI, model);\n macro.setGet(publicAPI, model, DATASET_FIELDS); // Object specific methods\n\n vtkDataSet(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkDataSet'); // ----------------------------------------------------------------------------\n\nvar vtkDataSet$1 = _objectSpread({\n newInstance: newInstance,\n extend: extend\n}, Constants);\n\nexport { vtkDataSet$1 as default, extend, newInstance };\n","var AttributeTypes = {\n SCALARS: 0,\n VECTORS: 1,\n NORMALS: 2,\n TCOORDS: 3,\n TENSORS: 4,\n GLOBALIDS: 5,\n PEDIGREEIDS: 6,\n EDGEFLAG: 7,\n NUM_ATTRIBUTES: 8\n};\nvar AttributeLimitTypes = {\n MAX: 0,\n EXACT: 1,\n NOLIMIT: 2\n};\nvar CellGhostTypes = {\n DUPLICATECELL: 1,\n // the cell is present on multiple processors\n HIGHCONNECTIVITYCELL: 2,\n // the cell has more neighbors than in a regular mesh\n LOWCONNECTIVITYCELL: 4,\n // the cell has less neighbors than in a regular mesh\n REFINEDCELL: 8,\n // other cells are present that refines it.\n EXTERIORCELL: 16,\n // the cell is on the exterior of the data set\n HIDDENCELL: 32 // the cell is needed to maintain connectivity, but the data values should be ignored.\n\n};\nvar PointGhostTypes = {\n DUPLICATEPOINT: 1,\n // the cell is present on multiple processors\n HIDDENPOINT: 2 // the point is needed to maintain connectivity, but the data values should be ignored.\n\n};\nvar AttributeCopyOperations = {\n COPYTUPLE: 0,\n INTERPOLATE: 1,\n PASSDATA: 2,\n ALLCOPY: 3 // all of the above\n\n};\nvar ghostArrayName = 'vtkGhostType';\nvar DesiredOutputPrecision = {\n DEFAULT: 0,\n // use the point type that does not truncate any data\n SINGLE: 1,\n // use Float32Array\n DOUBLE: 2 // use Float64Array\n\n};\nvar Constants = {\n AttributeCopyOperations: AttributeCopyOperations,\n AttributeLimitTypes: AttributeLimitTypes,\n AttributeTypes: AttributeTypes,\n CellGhostTypes: CellGhostTypes,\n DesiredOutputPrecision: DesiredOutputPrecision,\n PointGhostTypes: PointGhostTypes,\n ghostArrayName: ghostArrayName\n};\n\nexport { AttributeCopyOperations, AttributeLimitTypes, AttributeTypes, CellGhostTypes, DesiredOutputPrecision, PointGhostTypes, Constants as default, ghostArrayName };\n","var StructuredType = {\n UNCHANGED: 0,\n SINGLE_POINT: 1,\n X_LINE: 2,\n Y_LINE: 3,\n Z_LINE: 4,\n XY_PLANE: 5,\n YZ_PLANE: 6,\n XZ_PLANE: 7,\n XYZ_GRID: 8,\n EMPTY: 9\n};\nvar Constants = {\n StructuredType: StructuredType\n};\n\nexport { StructuredType, Constants as default };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport Constants from './StructuredData/Constants.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nvar StructuredType = Constants.StructuredType;\nfunction getDataDescriptionFromExtent(inExt) {\n var dataDim = 0;\n\n for (var i = 0; i < 3; ++i) {\n if (inExt[i * 2] < inExt[i * 2 + 1]) {\n dataDim++;\n }\n }\n\n if (inExt[0] > inExt[1] || inExt[2] > inExt[3] || inExt[4] > inExt[5]) {\n return StructuredType.EMPTY;\n }\n\n if (dataDim === 3) {\n return StructuredType.XYZ_GRID;\n }\n\n if (dataDim === 2) {\n if (inExt[0] === inExt[1]) {\n return StructuredType.YZ_PLANE;\n }\n\n if (inExt[2] === inExt[3]) {\n return StructuredType.XZ_PLANE;\n }\n\n return StructuredType.XY_PLANE;\n }\n\n if (dataDim === 1) {\n if (inExt[0] < inExt[1]) {\n return StructuredType.X_LINE;\n }\n\n if (inExt[2] < inExt[3]) {\n return StructuredType.Y_LINE;\n }\n\n return StructuredType.Z_LINE;\n }\n\n return StructuredType.SINGLE_POINT;\n}\nvar vtkStructuredData = _objectSpread({\n getDataDescriptionFromExtent: getDataDescriptionFromExtent\n}, Constants);\n\nexport { vtkStructuredData as default, getDataDescriptionFromExtent };\n","import _slicedToArray from '@babel/runtime/helpers/slicedToArray';\nimport _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';\nimport macro from '../../macros.js';\nimport { b as roundVector, c as clampVector } from '../Core/Math/index.js';\nimport vtkBoundingBox from './BoundingBox.js';\nimport vtkDataSet from './DataSet.js';\nimport vtkStructuredData from './StructuredData.js';\nimport { StructuredType } from './StructuredData/Constants.js';\nimport { mat3, mat4, vec3 } from 'gl-matrix';\n\nvar vtkErrorMacro = macro.vtkErrorMacro; // ----------------------------------------------------------------------------\n// vtkImageData methods\n// ----------------------------------------------------------------------------\n\nfunction vtkImageData(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkImageData');\n\n publicAPI.setExtent = function () {\n if (model.deleted) {\n vtkErrorMacro('instance deleted - cannot call any method');\n return false;\n }\n\n for (var _len = arguments.length, inExtent = new Array(_len), _key = 0; _key < _len; _key++) {\n inExtent[_key] = arguments[_key];\n }\n\n var extentArray = inExtent.length === 1 ? inExtent[0] : inExtent;\n\n if (extentArray.length !== 6) {\n return false;\n }\n\n var changeDetected = model.extent.some(function (item, index) {\n return item !== extentArray[index];\n });\n\n if (changeDetected) {\n model.extent = extentArray.slice();\n model.dataDescription = vtkStructuredData.getDataDescriptionFromExtent(model.extent);\n publicAPI.modified();\n }\n\n return changeDetected;\n };\n\n publicAPI.setDimensions = function () {\n var i;\n var j;\n var k;\n\n if (model.deleted) {\n vtkErrorMacro('instance deleted - cannot call any method');\n return;\n }\n\n if (arguments.length === 1) {\n var array = arguments.length <= 0 ? undefined : arguments[0];\n i = array[0];\n j = array[1];\n k = array[2];\n } else if (arguments.length === 3) {\n i = arguments.length <= 0 ? undefined : arguments[0];\n j = arguments.length <= 1 ? undefined : arguments[1];\n k = arguments.length <= 2 ? undefined : arguments[2];\n } else {\n vtkErrorMacro('Bad dimension specification');\n return;\n }\n\n publicAPI.setExtent(0, i - 1, 0, j - 1, 0, k - 1);\n };\n\n publicAPI.getDimensions = function () {\n return [model.extent[1] - model.extent[0] + 1, model.extent[3] - model.extent[2] + 1, model.extent[5] - model.extent[4] + 1];\n };\n\n publicAPI.getNumberOfCells = function () {\n var dims = publicAPI.getDimensions();\n var nCells = 1;\n\n for (var i = 0; i < 3; i++) {\n if (dims[i] === 0) {\n return 0;\n }\n\n if (dims[i] > 1) {\n nCells *= dims[i] - 1;\n }\n }\n\n return nCells;\n };\n\n publicAPI.getNumberOfPoints = function () {\n var dims = publicAPI.getDimensions();\n return dims[0] * dims[1] * dims[2];\n };\n\n publicAPI.getPoint = function (index) {\n var dims = publicAPI.getDimensions();\n\n if (dims[0] === 0 || dims[1] === 0 || dims[2] === 0) {\n vtkErrorMacro('Requesting a point from an empty image.');\n return null;\n }\n\n var ijk = new Float64Array(3);\n\n switch (model.dataDescription) {\n case StructuredType.EMPTY:\n return null;\n\n case StructuredType.SINGLE_POINT:\n break;\n\n case StructuredType.X_LINE:\n ijk[0] = index;\n break;\n\n case StructuredType.Y_LINE:\n ijk[1] = index;\n break;\n\n case StructuredType.Z_LINE:\n ijk[2] = index;\n break;\n\n case StructuredType.XY_PLANE:\n ijk[0] = index % dims[0];\n ijk[1] = index / dims[0];\n break;\n\n case StructuredType.YZ_PLANE:\n ijk[1] = index % dims[1];\n ijk[2] = index / dims[1];\n break;\n\n case StructuredType.XZ_PLANE:\n ijk[0] = index % dims[0];\n ijk[2] = index / dims[0];\n break;\n\n case StructuredType.XYZ_GRID:\n ijk[0] = index % dims[0];\n ijk[1] = index / dims[0] % dims[1];\n ijk[2] = index / (dims[0] * dims[1]);\n break;\n\n default:\n vtkErrorMacro('Invalid dataDescription');\n break;\n }\n\n var coords = [0, 0, 0];\n publicAPI.indexToWorld(ijk, coords);\n return coords;\n }; // vtkCell *GetCell(vtkIdType cellId) VTK_OVERRIDE;\n // void GetCell(vtkIdType cellId, vtkGenericCell *cell) VTK_OVERRIDE;\n // void GetCellBounds(vtkIdType cellId, double bounds[6]) VTK_OVERRIDE;\n // virtual vtkIdType FindPoint(double x, double y, double z)\n // {\n // return this->vtkDataSet::FindPoint(x, y, z);\n // }\n // vtkIdType FindPoint(double x[3]) VTK_OVERRIDE;\n // vtkIdType FindCell(\n // double x[3], vtkCell *cell, vtkIdType cellId, double tol2,\n // int& subId, double pcoords[3], double *weights) VTK_OVERRIDE;\n // vtkIdType FindCell(\n // double x[3], vtkCell *cell, vtkGenericCell *gencell,\n // vtkIdType cellId, double tol2, int& subId,\n // double pcoords[3], double *weights) VTK_OVERRIDE;\n // vtkCell *FindAndGetCell(double x[3], vtkCell *cell, vtkIdType cellId,\n // double tol2, int& subId, double pcoords[3],\n // double *weights) VTK_OVERRIDE;\n // int GetCellType(vtkIdType cellId) VTK_OVERRIDE;\n // void GetCellPoints(vtkIdType cellId, vtkIdList *ptIds) VTK_OVERRIDE\n // {vtkStructuredData::GetCellPoints(cellId,ptIds,this->DataDescription,\n // this->GetDimensions());}\n // void GetPointCells(vtkIdType ptId, vtkIdList *cellIds) VTK_OVERRIDE\n // {vtkStructuredData::GetPointCells(ptId,cellIds,this->GetDimensions());}\n // void ComputeBounds() VTK_OVERRIDE;\n // int GetMaxCellSize() VTK_OVERRIDE {return 8;}; //voxel is the largest\n\n\n publicAPI.getBounds = function () {\n return publicAPI.extentToBounds(publicAPI.getSpatialExtent());\n };\n\n publicAPI.extentToBounds = function (ex) {\n return vtkBoundingBox.transformBounds(ex, model.indexToWorld);\n };\n\n publicAPI.getSpatialExtent = function () {\n return vtkBoundingBox.inflate(_toConsumableArray(model.extent), 0.5);\n }; // Internal, shouldn't need to call this manually.\n\n\n publicAPI.computeTransforms = function () {\n mat4.fromTranslation(model.indexToWorld, model.origin);\n model.indexToWorld[0] = model.direction[0];\n model.indexToWorld[1] = model.direction[1];\n model.indexToWorld[2] = model.direction[2];\n model.indexToWorld[4] = model.direction[3];\n model.indexToWorld[5] = model.direction[4];\n model.indexToWorld[6] = model.direction[5];\n model.indexToWorld[8] = model.direction[6];\n model.indexToWorld[9] = model.direction[7];\n model.indexToWorld[10] = model.direction[8];\n mat4.scale(model.indexToWorld, model.indexToWorld, model.spacing);\n mat4.invert(model.worldToIndex, model.indexToWorld);\n };\n\n publicAPI.indexToWorld = function (ain) {\n var aout = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n vec3.transformMat4(aout, ain, model.indexToWorld);\n return aout;\n };\n\n publicAPI.indexToWorldVec3 = publicAPI.indexToWorld;\n\n publicAPI.worldToIndex = function (ain) {\n var aout = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n vec3.transformMat4(aout, ain, model.worldToIndex);\n return aout;\n };\n\n publicAPI.worldToIndexVec3 = publicAPI.worldToIndex;\n\n publicAPI.indexToWorldBounds = function (bin) {\n var bout = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n return vtkBoundingBox.transformBounds(bin, model.indexToWorld, bout);\n };\n\n publicAPI.worldToIndexBounds = function (bin) {\n var bout = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n return vtkBoundingBox.transformBounds(bin, model.worldToIndex, bout);\n }; // Make sure the transform is correct\n\n\n publicAPI.onModified(publicAPI.computeTransforms);\n publicAPI.computeTransforms();\n\n publicAPI.getCenter = function () {\n return vtkBoundingBox.getCenter(publicAPI.getBounds());\n };\n\n publicAPI.computeHistogram = function (worldBounds) {\n var voxelFunc = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n var bounds = [0, 0, 0, 0, 0, 0];\n publicAPI.worldToIndexBounds(worldBounds, bounds);\n var point1 = [0, 0, 0];\n var point2 = [0, 0, 0];\n vtkBoundingBox.computeCornerPoints(bounds, point1, point2);\n roundVector(point1, point1);\n roundVector(point2, point2);\n var dimensions = publicAPI.getDimensions();\n clampVector(point1, [0, 0, 0], [dimensions[0] - 1, dimensions[1] - 1, dimensions[2] - 1], point1);\n clampVector(point2, [0, 0, 0], [dimensions[0] - 1, dimensions[1] - 1, dimensions[2] - 1], point2);\n var yStride = dimensions[0];\n var zStride = dimensions[0] * dimensions[1];\n var pixels = publicAPI.getPointData().getScalars().getData();\n var maximum = -Infinity;\n var minimum = Infinity;\n var sumOfSquares = 0;\n var isum = 0;\n var inum = 0;\n\n for (var z = point1[2]; z <= point2[2]; z++) {\n for (var y = point1[1]; y <= point2[1]; y++) {\n var index = point1[0] + y * yStride + z * zStride;\n\n for (var x = point1[0]; x <= point2[0]; x++) {\n if (!voxelFunc || voxelFunc([x, y, z], bounds)) {\n var pixel = pixels[index];\n if (pixel > maximum) maximum = pixel;\n if (pixel < minimum) minimum = pixel;\n sumOfSquares += pixel * pixel;\n isum += pixel;\n inum += 1;\n }\n\n ++index;\n }\n }\n }\n\n var average = inum > 0 ? isum / inum : 0;\n var variance = inum ? Math.abs(sumOfSquares / inum - average * average) : 0;\n var sigma = Math.sqrt(variance);\n return {\n minimum: minimum,\n maximum: maximum,\n average: average,\n variance: variance,\n sigma: sigma,\n count: inum\n };\n }; // TODO: use the unimplemented `vtkDataSetAttributes` for scalar length, that is currently also a TODO (GetNumberOfComponents).\n // Scalar data could be tuples for color information?\n\n\n publicAPI.computeIncrements = function (extent) {\n var numberOfComponents = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n var increments = [];\n var incr = numberOfComponents; // Calculate array increment offsets\n // similar to c++ vtkImageData::ComputeIncrements\n\n for (var idx = 0; idx < 3; ++idx) {\n increments[idx] = incr;\n incr *= extent[idx * 2 + 1] - extent[idx * 2] + 1;\n }\n\n return increments;\n };\n /**\n * @param {Number[]} index the localized `[i,j,k]` pixel array position. Float values will be rounded.\n * @return {Number} the corresponding flattened index in the scalar array\n */\n\n\n publicAPI.computeOffsetIndex = function (_ref) {\n var _ref2 = _slicedToArray(_ref, 3),\n i = _ref2[0],\n j = _ref2[1],\n k = _ref2[2];\n\n var extent = publicAPI.getExtent();\n var numberOfComponents = publicAPI.getPointData().getScalars().getNumberOfComponents();\n var increments = publicAPI.computeIncrements(extent, numberOfComponents); // Use the array increments to find the pixel index\n // similar to c++ vtkImageData::GetArrayPointer\n // Math.floor to catch \"practically 0\" e^-15 scenarios.\n\n return Math.floor((Math.round(i) - extent[0]) * increments[0] + (Math.round(j) - extent[2]) * increments[1] + (Math.round(k) - extent[4]) * increments[2]);\n };\n /**\n * @param {Number[]} xyz the [x,y,z] Array in world coordinates\n * @return {Number|NaN} the corresponding pixel's index in the scalar array\n */\n\n\n publicAPI.getOffsetIndexFromWorld = function (xyz) {\n var extent = publicAPI.getExtent();\n var index = publicAPI.worldToIndex(xyz); // Confirm indexed i,j,k coords are within the bounds of the volume\n\n for (var idx = 0; idx < 3; ++idx) {\n if (index[idx] < extent[idx * 2] || index[idx] > extent[idx * 2 + 1]) {\n vtkErrorMacro(\"GetScalarPointer: Pixel \".concat(index, \" is not in memory. Current extent = \").concat(extent));\n return NaN;\n }\n } // Assumed the index here is within 0 <-> scalarData.length, but doesn't hurt to check upstream\n\n\n return publicAPI.computeOffsetIndex(index);\n };\n /**\n * @param {Number[]} xyz the [x,y,z] Array in world coordinates\n * @param {Number?} comp the scalar component index for multi-component scalars\n * @return {Number|NaN} the corresponding pixel's scalar value\n */\n\n\n publicAPI.getScalarValueFromWorld = function (xyz) {\n var comp = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var numberOfComponents = publicAPI.getPointData().getScalars().getNumberOfComponents();\n\n if (comp < 0 || comp >= numberOfComponents) {\n vtkErrorMacro(\"GetScalarPointer: Scalar Component \".concat(comp, \" is not within bounds. Current Scalar numberOfComponents: \").concat(numberOfComponents));\n return NaN;\n }\n\n var offsetIndex = publicAPI.getOffsetIndexFromWorld(xyz);\n\n if (Number.isNaN(offsetIndex)) {\n // VTK Error Macro will have been tripped already, no need to do it again,\n return offsetIndex;\n }\n\n return publicAPI.getPointData().getScalars().getComponent(offsetIndex, comp);\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n direction: null,\n // a mat3\n indexToWorld: null,\n // a mat4\n worldToIndex: null,\n // a mat4\n spacing: [1.0, 1.0, 1.0],\n origin: [0.0, 0.0, 0.0],\n extent: [0, -1, 0, -1, 0, -1],\n dataDescription: StructuredType.EMPTY\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkDataSet.extend(publicAPI, model, initialValues);\n\n if (!model.direction) {\n model.direction = mat3.identity(new Float64Array(9));\n } else if (Array.isArray(model.direction)) {\n model.direction = new Float64Array(model.direction.slice(0, 9));\n }\n\n model.indexToWorld = new Float64Array(16);\n model.worldToIndex = new Float64Array(16); // Set/Get methods\n\n macro.get(publicAPI, model, ['indexToWorld', 'worldToIndex']);\n macro.setGetArray(publicAPI, model, ['origin', 'spacing'], 3);\n macro.setGetArray(publicAPI, model, ['direction'], 9);\n macro.getArray(publicAPI, model, ['extent'], 6); // Object specific methods\n\n vtkImageData(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkImageData'); // ----------------------------------------------------------------------------\n\nvar vtkImageData$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkImageData$1 as default, extend, newInstance };\n","import macro from '../../macros.js';\n\nvar vtkErrorMacro = macro.vtkErrorMacro; // ----------------------------------------------------------------------------\n// vtkPiecewiseFunction methods\n// ----------------------------------------------------------------------------\n\nfunction vtkPiecewiseFunction(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkPiecewiseFunction'); // Return the number of points which specify this function\n\n publicAPI.getSize = function () {\n return model.nodes.length;\n }; // Return the type of function stored in object:\n // Function Types:\n // 0 : Constant (No change in slope between end points)\n // 1 : NonDecreasing (Always increasing or zero slope)\n // 2 : NonIncreasing (Always decreasing or zero slope)\n // 3 : Varied (Contains both decreasing and increasing slopes)\n // 4 : Unknown (Error condition)\n //\n\n\n publicAPI.getType = function () {\n var value;\n var prevValue = 0.0;\n var functionType = 0;\n\n if (model.nodes.length > 0) {\n prevValue = model.nodes[0].y;\n }\n\n for (var i = 1; i < model.nodes.length; i++) {\n value = model.nodes[i].y; // Do not change the function type if equal\n\n if (value !== prevValue) {\n if (value > prevValue) {\n switch (functionType) {\n case 0:\n case 1:\n // NonDecreasing\n functionType = 1;\n break;\n\n case 2:\n default:\n // Varied\n functionType = 3;\n break;\n }\n } else {\n // value < prev_value\n switch (functionType) {\n case 0:\n case 2:\n // NonIncreasing\n functionType = 2;\n break;\n\n case 1:\n default:\n // Varied\n functionType = 3;\n break;\n }\n }\n }\n\n prevValue = value; // Exit loop if we find a Varied function\n\n if (functionType === 3) {\n break;\n }\n }\n\n switch (functionType) {\n case 0:\n return 'Constant';\n\n case 1:\n return 'NonDecreasing';\n\n case 2:\n return 'NonIncreasing';\n\n case 3:\n default:\n return 'Varied';\n }\n }; // Since we no longer store the data in an array, we must\n // copy out of the vector into an array. No modified check -\n // could be added if performance is a problem\n\n\n publicAPI.getDataPointer = function () {\n var size = model.nodes.length;\n model.function = null;\n\n if (size > 0) {\n model.function = [];\n\n for (var i = 0; i < size; i++) {\n model.function[2 * i] = model.nodes[i].x;\n model.function[2 * i + 1] = model.nodes[i].y;\n }\n }\n\n return model.function;\n }; // Returns the first point location which starts a non-zero segment of the\n // function. Note that the value at this point may be zero.\n\n\n publicAPI.getFirstNonZeroValue = function () {\n // Check if no points specified\n if (model.nodes.length === 0) {\n return 0;\n }\n\n var allZero = 1;\n var x = 0.0;\n var i = 0;\n\n for (; i < model.nodes.length; i++) {\n if (model.nodes[i].y !== 0.0) {\n allZero = 0;\n break;\n }\n } // If every specified point has a zero value then return\n // a large value\n\n\n if (allZero) {\n x = Number.MAX_VALUE;\n } else if (i > 0) {\n // A point was found with a non-zero value\n // Return the value of the point that precedes this one\n x = model.nodes[i - 1].x;\n } else if (model.clamping) {\n // If this is the first point in the function, return its\n // value is clamping is off, otherwise VTK_DOUBLE_MIN if\n // clamping is on.\n x = -Number.MAX_VALUE;\n } else {\n x = model.nodes[0].x;\n }\n\n return x;\n }; // For a specified index value, get the node parameters\n\n\n publicAPI.getNodeValue = function (index, val) {\n var size = model.nodes.length;\n\n if (index < 0 || index >= size) {\n vtkErrorMacro('Index out of range!');\n return -1;\n }\n\n val[0] = model.nodes[index].x;\n val[1] = model.nodes[index].y;\n val[2] = model.nodes[index].midpoint;\n val[3] = model.nodes[index].sharpness;\n return 1;\n }; // For a specified index value, get the node parameters\n\n\n publicAPI.setNodeValue = function (index, val) {\n var size = model.nodes.length;\n\n if (index < 0 || index >= size) {\n vtkErrorMacro('Index out of range!');\n return -1;\n }\n\n var oldX = model.nodes[index].x;\n model.nodes[index].x = val[0];\n model.nodes[index].y = val[1];\n model.nodes[index].midpoint = val[2];\n model.nodes[index].sharpness = val[3];\n\n if (oldX !== val[0]) {\n // The point has been moved, the order of points or the range might have\n // been modified.\n publicAPI.sortAndUpdateRange(); // No need to call Modified() here because SortAndUpdateRange() has done it\n // already.\n } else {\n publicAPI.modified();\n }\n\n return 1;\n }; // Adds a point to the function. If a duplicate point is inserted\n // then the function value at that location is set to the new value.\n // This is the legacy version that assumes midpoint = 0.5 and\n // sharpness = 0.0\n\n\n publicAPI.addPoint = function (x, y) {\n return publicAPI.addPointLong(x, y, 0.5, 0.0);\n }; // Adds a point to the function and returns the array index of the point.\n\n\n publicAPI.addPointLong = function (x, y, midpoint, sharpness) {\n // Error check\n if (midpoint < 0.0 || midpoint > 1.0) {\n vtkErrorMacro('Midpoint outside range [0.0, 1.0]');\n return -1;\n }\n\n if (sharpness < 0.0 || sharpness > 1.0) {\n vtkErrorMacro('Sharpness outside range [0.0, 1.0]');\n return -1;\n } // remove any node already at this X location\n\n\n if (!model.allowDuplicateScalars) {\n publicAPI.removePoint(x);\n } // Create the new node\n\n\n var node = {\n x: x,\n y: y,\n midpoint: midpoint,\n sharpness: sharpness\n }; // Add it, then sort to get everything in order\n\n model.nodes.push(node);\n publicAPI.sortAndUpdateRange(); // Now find this node so we can return the index\n\n var i;\n\n for (i = 0; i < model.nodes.length; i++) {\n if (model.nodes[i].x === x) {\n break;\n }\n } // If we didn't find it, something went horribly wrong so\n // return -1\n\n\n if (i < model.nodes.length) {\n return i;\n }\n\n return -1;\n };\n\n publicAPI.setNodes = function (nodes) {\n if (model.nodes !== nodes) {\n model.nodes = nodes;\n publicAPI.sortAndUpdateRange();\n }\n }; // Sort the vector in increasing order, then fill in\n // the Range\n\n\n publicAPI.sortAndUpdateRange = function () {\n model.nodes.sort(function (a, b) {\n return a.x - b.x;\n });\n var modifiedInvoked = publicAPI.updateRange(); // If range is updated, Modified() has been called, don't call it again.\n\n if (!modifiedInvoked) {\n publicAPI.modified();\n }\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.updateRange = function () {\n var oldRange = model.range.slice();\n var size = model.nodes.length;\n\n if (size) {\n model.range[0] = model.nodes[0].x;\n model.range[1] = model.nodes[size - 1].x;\n } else {\n model.range[0] = 0;\n model.range[1] = 0;\n } // If the rage is the same, then no need to call Modified()\n\n\n if (oldRange[0] === model.range[0] && oldRange[1] === model.range[1]) {\n return false;\n }\n\n publicAPI.modified();\n return true;\n }; // Removes a point from the function. If no point is found then function\n // remains the same.\n\n\n publicAPI.removePoint = function (x) {\n // First find the node since we need to know its\n // index as our return value\n var i;\n\n for (i = 0; i < model.nodes.length; i++) {\n if (model.nodes[i].x === x) {\n break;\n }\n } // If the node doesn't exist, we return -1\n\n\n if (i >= model.nodes.length) {\n return -1;\n }\n\n var retVal = i; // If the first or last point has been removed, then we update the range\n // No need to sort here as the order of points hasn't changed.\n\n var modifiedInvoked = false;\n model.nodes.splice(i, 1);\n\n if (i === 0 || i === model.nodes.length) {\n modifiedInvoked = publicAPI.updateRange();\n }\n\n if (!modifiedInvoked) {\n publicAPI.modified();\n }\n\n return retVal;\n }; // Removes all points from the function.\n\n\n publicAPI.removeAllPoints = function () {\n model.nodes = [];\n publicAPI.sortAndUpdateRange();\n }; // Add in end points of line and remove any points between them\n // Legacy method with no way to specify midpoint and sharpness\n\n\n publicAPI.addSegment = function (x1, y1, x2, y2) {\n // First, find all points in this range and remove them\n publicAPI.sortAndUpdateRange();\n\n for (var i = 0; i < model.nodes.length;) {\n if (model.nodes[i].x >= x1 && model.nodes[i].x <= x2) {\n model.nodes.splice(i, 1);\n } else {\n i++;\n }\n } // Now add the points\n\n\n publicAPI.addPoint(x1, y1, 0.5, 0.0);\n publicAPI.addPoint(x2, y2, 0.5, 0.0);\n }; // Return the value of the function at a position\n\n\n publicAPI.getValue = function (x) {\n var table = [];\n publicAPI.getTable(x, x, 1, table);\n return table[0];\n }; // Remove all points outside the range, and make sure a point\n // exists at each end of the range. Used as a convenience method\n // for transfer function editors\n\n\n publicAPI.adjustRange = function (range) {\n if (range.length < 2) {\n return 0;\n }\n\n var functionRange = publicAPI.getRange(); // Make sure we have points at each end of the range\n\n if (functionRange[0] < range[0]) {\n publicAPI.addPoint(range[0], publicAPI.getValue(range[0]));\n } else {\n publicAPI.addPoint(range[0], publicAPI.getValue(functionRange[0]));\n }\n\n if (functionRange[1] > range[1]) {\n publicAPI.addPoint(range[1], publicAPI.getValue(range[1]));\n } else {\n publicAPI.addPoint(range[1], publicAPI.getValue(functionRange[1]));\n } // Remove all points out-of-range\n\n\n publicAPI.sortAndUpdateRange();\n\n for (var i = 0; i < model.nodes.length;) {\n if (model.nodes[i].x >= range[0] && model.nodes[i].x <= range[1]) {\n model.nodes.splice(i, 1);\n } else {\n ++i;\n }\n }\n\n publicAPI.sortAndUpdateRange();\n return 1;\n }; //--------------------------------------------------------------------------\n\n\n publicAPI.estimateMinNumberOfSamples = function (x1, x2) {\n var d = publicAPI.findMinimumXDistance();\n return Math.ceil((x2 - x1) / d);\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.findMinimumXDistance = function () {\n var size = model.nodes.length;\n\n if (size < 2) {\n return -1.0;\n }\n\n var distance = model.nodes[1].x - model.nodes[0].x;\n\n for (var i = 0; i < size - 1; i++) {\n var currentDist = model.nodes[i + 1].x - model.nodes[i].x;\n\n if (currentDist < distance) {\n distance = currentDist;\n }\n }\n\n return distance;\n }; // Returns a table of function values evaluated at regular intervals\n\n /* eslint-disable prefer-destructuring */\n\n /* eslint-disable no-continue */\n\n\n publicAPI.getTable = function (xStart, xEnd, size, table) {\n var stride = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1;\n var i;\n var idx = 0;\n var numNodes = model.nodes.length; // Need to keep track of the last value so that\n // we can fill in table locations past this with\n // this value if Clamping is On.\n\n var lastValue = 0.0;\n\n if (numNodes !== 0) {\n lastValue = model.nodes[numNodes - 1].y;\n }\n\n var x = 0.0;\n var x1 = 0.0;\n var x2 = 0.0;\n var y1 = 0.0;\n var y2 = 0.0;\n var midpoint = 0.0;\n var sharpness = 0.0; // For each table entry\n\n for (i = 0; i < size; i++) {\n // Find our location in the table\n var tidx = stride * i; // Find our X location. If we are taking only 1 sample, make\n // it halfway between start and end (usually start and end will\n // be the same in this case)\n\n if (size > 1) {\n x = xStart + i / (size - 1.0) * (xEnd - xStart);\n } else {\n x = 0.5 * (xStart + xEnd);\n } // Do we need to move to the next node?\n\n\n while (idx < numNodes && x > model.nodes[idx].x) {\n idx++; // If we are at a valid point index, fill in\n // the value at this node, and the one before (the\n // two that surround our current sample location)\n // idx cannot be 0 since we just incremented it.\n\n if (idx < numNodes) {\n x1 = model.nodes[idx - 1].x;\n x2 = model.nodes[idx].x;\n y1 = model.nodes[idx - 1].y;\n y2 = model.nodes[idx].y; // We only need the previous midpoint and sharpness\n // since these control this region\n\n midpoint = model.nodes[idx - 1].midpoint;\n sharpness = model.nodes[idx - 1].sharpness; // Move midpoint away from extreme ends of range to avoid\n // degenerate math\n\n if (midpoint < 0.00001) {\n midpoint = 0.00001;\n }\n\n if (midpoint > 0.99999) {\n midpoint = 0.99999;\n }\n }\n } // Are we at the end? If so, just use the last value\n\n\n if (idx >= numNodes) {\n table[tidx] = model.clamping ? lastValue : 0.0;\n } else if (idx === 0) {\n // Are we before the first node? If so, duplicate this nodes values\n table[tidx] = model.clamping ? model.nodes[0].y : 0.0;\n } else {\n // Otherwise, we are between two nodes - interpolate\n // Our first attempt at a normalized location [0,1] -\n // we will be modifying this based on midpoint and\n // sharpness to get the curve shape we want and to have\n // it pass through (y1+y2)/2 at the midpoint.\n var s = (x - x1) / (x2 - x1); // Readjust based on the midpoint - linear adjustment\n\n if (s < midpoint) {\n s = 0.5 * s / midpoint;\n } else {\n s = 0.5 + 0.5 * (s - midpoint) / (1.0 - midpoint);\n } // override for sharpness > 0.99\n // In this case we just want piecewise constant\n\n\n if (sharpness > 0.99) {\n // Use the first value since we are below the midpoint\n if (s < 0.5) {\n table[tidx] = y1;\n continue;\n } else {\n // Use the second value at or above the midpoint\n table[tidx] = y2;\n continue;\n }\n } // Override for sharpness < 0.01\n // In this case we want piecewise linear\n\n\n if (sharpness < 0.01) {\n // Simple linear interpolation\n table[tidx] = (1 - s) * y1 + s * y2;\n continue;\n } // We have a sharpness between [0.01, 0.99] - we will\n // used a modified hermite curve interpolation where we\n // derive the slope based on the sharpness, and we compress\n // the curve non-linearly based on the sharpness\n // First, we will adjust our position based on sharpness in\n // order to make the curve sharper (closer to piecewise constant)\n\n\n if (s < 0.5) {\n s = 0.5 * Math.pow(s * 2, 1.0 + 10 * sharpness);\n } else if (s > 0.5) {\n s = 1.0 - 0.5 * Math.pow((1.0 - s) * 2, 1 + 10 * sharpness);\n } // Compute some coefficients we will need for the hermite curve\n\n\n var ss = s * s;\n var sss = ss * s;\n var h1 = 2 * sss - 3 * ss + 1;\n var h2 = -2 * sss + 3 * ss;\n var h3 = sss - 2 * ss + s;\n var h4 = sss - ss; // Use one slope for both end points\n\n var slope = y2 - y1;\n var t = (1.0 - sharpness) * slope; // Compute the value\n\n table[tidx] = h1 * y1 + h2 * y2 + h3 * t + h4 * t; // Final error check to make sure we don't go outside\n // the Y range\n\n var min = y1 < y2 ? y1 : y2;\n var max = y1 > y2 ? y1 : y2;\n table[tidx] = table[tidx] < min ? min : table[tidx];\n table[tidx] = table[tidx] > max ? max : table[tidx];\n }\n }\n };\n}\n/* eslint-enable prefer-destructuring */\n\n/* eslint-enable no-continue */\n// ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n // model.function = NULL;\n range: [0, 0],\n clamping: true,\n allowDuplicateScalars: false\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n macro.obj(publicAPI, model); // Internal objects initialization\n\n model.nodes = []; // Create get-set macros\n\n macro.setGet(publicAPI, model, ['allowDuplicateScalars', 'clamping']);\n macro.setArray(publicAPI, model, ['range'], 2); // Create get macros for array\n\n macro.getArray(publicAPI, model, ['range']); // For more macro methods, see \"Sources/macros.js\"\n // Object specific methods\n\n vtkPiecewiseFunction(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkPiecewiseFunction'); // ----------------------------------------------------------------------------\n\nvar vtkPiecewiseFunction$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkPiecewiseFunction$1 as default, extend, newInstance };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport { s as subtract, d as dot, j as cross, k as add } from '../Core/Math/index.js';\nimport macro from '../../macros.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nvar PLANE_TOLERANCE = 1.0e-6;\nvar COINCIDE = 'coincide';\nvar DISJOINT = 'disjoint'; // ----------------------------------------------------------------------------\n// Global methods\n// ----------------------------------------------------------------------------\n\nfunction evaluate(normal, origin, x) {\n return normal[0] * (x[0] - origin[0]) + normal[1] * (x[1] - origin[1]) + normal[2] * (x[2] - origin[2]);\n}\n\nfunction distanceToPlane(x, origin, normal) {\n var distance = normal[0] * (x[0] - origin[0]) + normal[1] * (x[1] - origin[1]) + normal[2] * (x[2] - origin[2]);\n return Math.abs(distance);\n}\n\nfunction projectPoint(x, origin, normal, xproj) {\n var xo = [];\n subtract(x, origin, xo);\n var t = dot(normal, xo);\n xproj[0] = x[0] - t * normal[0];\n xproj[1] = x[1] - t * normal[1];\n xproj[2] = x[2] - t * normal[2];\n}\n\nfunction projectVector(v, normal, vproj) {\n var t = dot(v, normal);\n var n2 = dot(normal, normal);\n\n if (n2 === 0) {\n n2 = 1.0;\n }\n\n vproj[0] = v[0] - t * normal[0] / n2;\n vproj[1] = v[1] - t * normal[1] / n2;\n vproj[2] = v[2] - t * normal[2] / n2;\n return vproj;\n}\n\nfunction generalizedProjectPoint(x, origin, normal, xproj) {\n var xo = [];\n subtract(x, origin, xo);\n var t = dot(normal, xo);\n var n2 = dot(normal, normal);\n\n if (n2 !== 0) {\n xproj[0] = x[0] - t * normal[0] / n2;\n xproj[1] = x[1] - t * normal[1] / n2;\n xproj[2] = x[2] - t * normal[2] / n2;\n } else {\n xproj[0] = x[0];\n xproj[1] = x[1];\n xproj[2] = x[2];\n }\n}\n\nfunction intersectWithLine(p1, p2, origin, normal) {\n var outObj = {\n intersection: false,\n betweenPoints: false,\n t: Number.MAX_VALUE,\n x: []\n };\n var p21 = [];\n var p1Origin = []; // Compute line vector\n\n subtract(p2, p1, p21);\n subtract(origin, p1, p1Origin); // Compute denominator. If ~0, line and plane are parallel.\n // const num = vtkMath.dot(normal, origin) - vtkMath.dot(normal, p1);\n\n var num = dot(normal, p1Origin);\n var den = dot(normal, p21); // If denominator with respect to numerator is \"zero\", then the line and\n // plane are considered parallel.\n\n var fabsden;\n var fabstolerance; // Trying to avoid an expensive call to fabs()\n\n if (den < 0.0) {\n fabsden = -den;\n } else {\n fabsden = den;\n }\n\n if (num < 0.0) {\n fabstolerance = -num * PLANE_TOLERANCE;\n } else {\n fabstolerance = num * PLANE_TOLERANCE;\n }\n\n if (fabsden <= fabstolerance) {\n return outObj;\n } // Where on the line between p1 and p2 is the intersection\n // If between 0 and 1, it is between the two points. If < 0 it's before p1, if > 1 it's after p2\n\n\n outObj.t = num / den;\n outObj.x[0] = p1[0] + outObj.t * p21[0];\n outObj.x[1] = p1[1] + outObj.t * p21[1];\n outObj.x[2] = p1[2] + outObj.t * p21[2];\n outObj.intersection = true;\n outObj.betweenPoints = outObj.t >= 0.0 && outObj.t <= 1.0;\n return outObj;\n}\n\nfunction intersectWithPlane(plane1Origin, plane1Normal, plane2Origin, plane2Normal) {\n var outObj = {\n intersection: false,\n l0: [],\n l1: [],\n error: null\n };\n var cross$1 = [];\n cross(plane1Normal, plane2Normal, cross$1);\n var absCross = cross$1.map(function (n) {\n return Math.abs(n);\n }); // test if the two planes are parallel\n\n if (absCross[0] + absCross[1] + absCross[2] < PLANE_TOLERANCE) {\n // test if disjoint or coincide\n var v = [];\n subtract(plane1Origin, plane2Origin, v);\n\n if (dot(plane1Normal, v) === 0) {\n outObj.error = COINCIDE;\n } else {\n outObj.error = DISJOINT;\n }\n\n return outObj;\n } // Plane1 and Plane2 intersect in a line\n // first determine max abs coordinate of the cross product\n\n\n var maxc;\n\n if (absCross[0] > absCross[1] && absCross[0] > absCross[2]) {\n maxc = 'x';\n } else if (absCross[1] > absCross[2]) {\n maxc = 'y';\n } else {\n maxc = 'z';\n } // To get a point on the intersect line, zero the max coord, and solve for the other two\n\n\n var iP = []; // intersectionPoint\n // the constants in the 2 plane equations\n\n var d1 = -dot(plane1Normal, plane1Origin);\n var d2 = -dot(plane2Normal, plane2Origin); // eslint-disable-next-line default-case\n\n switch (maxc) {\n case 'x':\n // intersect with x=0\n iP[0] = 0;\n iP[1] = (d2 * plane1Normal[2] - d1 * plane2Normal[2]) / cross$1[0];\n iP[2] = (d1 * plane2Normal[1] - d2 * plane1Normal[1]) / cross$1[0];\n break;\n\n case 'y':\n // intersect with y=0\n iP[0] = (d1 * plane2Normal[2] - d2 * plane1Normal[2]) / cross$1[1];\n iP[1] = 0;\n iP[2] = (d2 * plane1Normal[0] - d1 * plane2Normal[0]) / cross$1[1];\n break;\n\n case 'z':\n // intersect with z=0\n iP[0] = (d2 * plane1Normal[1] - d1 * plane2Normal[1]) / cross$1[2];\n iP[1] = (d1 * plane2Normal[0] - d2 * plane1Normal[0]) / cross$1[2];\n iP[2] = 0;\n break;\n }\n\n outObj.l0 = iP;\n add(iP, cross$1, outObj.l1);\n outObj.intersection = true;\n return outObj;\n} // ----------------------------------------------------------------------------\n// Static API\n// ----------------------------------------------------------------------------\n\n\nvar STATIC = {\n evaluate: evaluate,\n distanceToPlane: distanceToPlane,\n projectPoint: projectPoint,\n projectVector: projectVector,\n generalizedProjectPoint: generalizedProjectPoint,\n intersectWithLine: intersectWithLine,\n intersectWithPlane: intersectWithPlane,\n DISJOINT: DISJOINT,\n COINCIDE: COINCIDE\n}; // ----------------------------------------------------------------------------\n// vtkPlane methods\n// ----------------------------------------------------------------------------\n\nfunction vtkPlane(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkPlane');\n\n publicAPI.distanceToPlane = function (x) {\n return distanceToPlane(x, model.origin, model.normal);\n };\n\n publicAPI.projectPoint = function (x, xproj) {\n projectPoint(x, model.origin, model.normal, xproj);\n };\n\n publicAPI.projectVector = function (v, vproj) {\n return projectVector(v, model.normal, vproj);\n };\n\n publicAPI.push = function (distance) {\n if (distance === 0.0) {\n return;\n }\n\n for (var i = 0; i < 3; i++) {\n model.origin[i] += distance * model.normal[i];\n }\n };\n\n publicAPI.generalizedProjectPoint = function (x, xproj) {\n generalizedProjectPoint(x, model.origin, model.normal, xproj);\n };\n\n publicAPI.evaluateFunction = function (x, y, z) {\n if (!Array.isArray(x)) {\n return model.normal[0] * (x - model.origin[0]) + model.normal[1] * (y - model.origin[1]) + model.normal[2] * (z - model.origin[2]);\n }\n\n return model.normal[0] * (x[0] - model.origin[0]) + model.normal[1] * (x[1] - model.origin[1]) + model.normal[2] * (x[2] - model.origin[2]);\n };\n\n publicAPI.evaluateGradient = function (xyz) {\n var retVal = [model.normal[0], model.normal[1], model.normal[2]];\n return retVal;\n };\n\n publicAPI.intersectWithLine = function (p1, p2) {\n return intersectWithLine(p1, p2, model.origin, model.normal);\n };\n\n publicAPI.intersectWithPlane = function (planeOrigin, planeNormal) {\n return intersectWithPlane(planeOrigin, planeNormal, model.origin, model.normal);\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\nvar DEFAULT_VALUES = {\n normal: [0.0, 0.0, 1.0],\n origin: [0.0, 0.0, 0.0]\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Object methods\n\n macro.obj(publicAPI, model);\n macro.setGetArray(publicAPI, model, ['normal', 'origin'], 3);\n vtkPlane(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkPlane'); // ----------------------------------------------------------------------------\n\nvar vtkPlane$1 = _objectSpread({\n newInstance: newInstance,\n extend: extend\n}, STATIC);\n\nexport { STATIC, vtkPlane$1 as default, extend, newInstance, vtkPlane };\n","import macro from '../../macros.js';\nimport { u as uninitializeBounds } from '../Core/Math/index.js';\nimport vtkPoints from '../Core/Points.js';\n\n// vtkCell methods\n// ----------------------------------------------------------------------------\n\nfunction vtkCell(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkCell');\n\n publicAPI.initialize = function (points) {\n var pointIdsList = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n\n if (!pointIdsList) {\n model.points = points;\n model.pointsIds = new Array(points.getNumberOfPoints());\n\n for (var i = points.getNumberOfPoints() - 1; i >= 0; --i) {\n model.pointsIds[i] = i;\n }\n } else {\n model.pointsIds = pointIdsList;\n var triangleData = model.points.getData();\n\n if (triangleData.length !== 3 * model.pointsIds.length) {\n triangleData = macro.newTypedArray(points.getDataType(), 3 * model.pointsIds.length);\n }\n\n var pointsData = points.getData();\n model.pointsIds.forEach(function (pointId, index) {\n // const start = 3 * pointId;\n // pointsData.set(p.subarray(start, start + 3), 3 * index);\n var pointOffset = 3 * pointId;\n var trianglePointOffset = 3 * index;\n triangleData[trianglePointOffset] = pointsData[pointOffset];\n triangleData[++trianglePointOffset] = pointsData[++pointOffset];\n triangleData[++trianglePointOffset] = pointsData[++pointOffset];\n });\n model.points.setData(triangleData);\n }\n };\n\n publicAPI.getBounds = function () {\n var nbPoints = model.points.getNumberOfPoints();\n var x = [];\n\n if (nbPoints) {\n model.points.getPoint(0, x);\n model.bounds[0] = x[0];\n model.bounds[1] = x[0];\n model.bounds[2] = x[1];\n model.bounds[3] = x[1];\n model.bounds[4] = x[2];\n model.bounds[5] = x[2];\n\n for (var i = 1; i < nbPoints; i++) {\n model.points.getPoint(i, x);\n model.bounds[0] = x[0] < model.bounds[0] ? x[0] : model.bounds[0];\n model.bounds[1] = x[0] > model.bounds[1] ? x[0] : model.bounds[1];\n model.bounds[2] = x[1] < model.bounds[2] ? x[1] : model.bounds[2];\n model.bounds[3] = x[1] > model.bounds[3] ? x[1] : model.bounds[3];\n model.bounds[4] = x[2] < model.bounds[4] ? x[2] : model.bounds[4];\n model.bounds[5] = x[2] > model.bounds[5] ? x[2] : model.bounds[5];\n }\n } else {\n uninitializeBounds(model.bounds);\n }\n\n return model.bounds;\n };\n\n publicAPI.getLength2 = function () {\n publicAPI.getBounds();\n var length = 0.0;\n var diff = 0;\n\n for (var i = 0; i < 3; i++) {\n diff = model.bounds[2 * i + 1] - model.bounds[2 * i];\n length += diff * diff;\n }\n\n return length;\n };\n\n publicAPI.getParametricDistance = function (pcoords) {\n var pDist;\n var pDistMax = 0.0;\n\n for (var i = 0; i < 3; i++) {\n if (pcoords[i] < 0.0) {\n pDist = -pcoords[i];\n } else if (pcoords[i] > 1.0) {\n pDist = pcoords[i] - 1.0;\n } else {\n // inside the cell in the parametric direction\n pDist = 0.0;\n }\n\n if (pDist > pDistMax) {\n pDistMax = pDist;\n }\n }\n\n return pDistMax;\n };\n\n publicAPI.getNumberOfPoints = function () {\n return model.points.getNumberOfPoints();\n };\n\n publicAPI.deepCopy = function (cell) {\n cell.initialize(model.points, model.pointsIds);\n };\n\n publicAPI.getCellDimension = function () {}; // virtual\n\n\n publicAPI.intersectWithLine = function (p1, p2, tol, t, x, pcoords, subId) {}; // virtual\n\n\n publicAPI.evaluatePosition = function (x, closestPoint, subId, pcoords, dist2, weights) {\n macro.vtkErrorMacro('vtkCell.evaluatePosition is not implemented.');\n }; // virtual\n\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n bounds: [-1, -1, -1, -1, -1, -1],\n pointsIds: []\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues);\n macro.obj(publicAPI, model);\n\n if (!model.points) {\n model.points = vtkPoints.newInstance();\n }\n\n macro.get(publicAPI, model, ['points', 'pointsIds']);\n vtkCell(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkCell'); // ----------------------------------------------------------------------------\n\nvar vtkCell$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkCell$1 as default, extend, newInstance };\n","import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';\nimport macro from '../../macros.js';\nimport vtkCell from './Cell.js';\n\n// Global methods\n// ----------------------------------------------------------------------------\n\nvar InitLink = {\n ncells: 0,\n cells: null\n};\n\nfunction resize(model, sz) {\n var newSize = sz;\n\n if (sz >= model.array.length) {\n newSize += model.array.length;\n }\n\n while (newSize > model.array.length) {\n model.array.push({\n ncells: 0,\n cells: null\n });\n }\n\n model.array.length = newSize;\n} // ----------------------------------------------------------------------------\n// vtkCellLinks methods\n// ----------------------------------------------------------------------------\n\n\nfunction vtkCellLinks(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkCellLinks');\n /**\n * Build the link list array. All subclasses of vtkAbstractCellLinks\n * must support this method.\n */\n\n publicAPI.buildLinks = function (data) {\n var numPts = data.getPoints().getNumberOfPoints();\n var numCells = data.getNumberOfCells(); // fill out lists with number of references to cells\n\n var linkLoc = new Uint32Array(numPts); // Use fast path if polydata\n\n if (data.isA('vtkPolyData')) {\n // traverse data to determine number of uses of each point\n for (var cellId = 0; cellId < numCells; ++cellId) {\n var _data$getCellPoints = data.getCellPoints(cellId),\n cellPointIds = _data$getCellPoints.cellPointIds;\n\n cellPointIds.forEach(function (cellPointId) {\n publicAPI.incrementLinkCount(cellPointId);\n });\n } // now allocate storage for the links\n\n\n publicAPI.allocateLinks(numPts);\n model.maxId = numPts - 1;\n\n var _loop = function _loop(_cellId) {\n var _data$getCellPoints2 = data.getCellPoints(_cellId),\n cellPointIds = _data$getCellPoints2.cellPointIds;\n\n cellPointIds.forEach(function (cellPointId) {\n publicAPI.insertCellReference(cellPointId, linkLoc[cellPointId]++, _cellId);\n });\n };\n\n for (var _cellId = 0; _cellId < numCells; ++_cellId) {\n _loop(_cellId);\n }\n } // any other type of dataset\n else {\n // traverse data to determine number of uses of each point\n for (var _cellId2 = 0; _cellId2 < numCells; _cellId2++) {\n // TODO: Currently not supported: const cell = data.getCell(cellId);\n var cell = vtkCell.newInstance();\n cell.getPointsIds().forEach(function (cellPointId) {\n publicAPI.incrementLinkCount(cellPointId);\n });\n } // now allocate storage for the links\n\n\n publicAPI.allocateLinks(numPts);\n model.maxId = numPts - 1;\n\n var _loop2 = function _loop2(_cellId3) {\n // TODO: Currently not supported: const cell = data.getCell(cellId);\n var cell = vtkCell.newInstance();\n cell.getPointsIds().forEach(function (cellPointId) {\n publicAPI.insertCellReference(cellPointId, linkLoc[cellPointId]++, _cellId3);\n });\n };\n\n for (var _cellId3 = 0; _cellId3 < numCells; ++_cellId3) {\n _loop2(_cellId3);\n }\n } // end else\n\n };\n /**\n * Build the link list array with a provided connectivity array.\n */\n // publicAPI.buildLinks = (data, connectivity) => {};\n\n /**\n * Allocate the specified number of links (i.e., number of points) that\n * will be built.\n */\n\n\n publicAPI.allocate = function (numLinks) {\n var ext = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1000;\n model.array = Array(numLinks).fill().map(function () {\n return {\n ncells: 0,\n cells: null\n };\n });\n model.extend = ext;\n model.maxId = -1;\n };\n\n publicAPI.initialize = function () {\n model.array = null;\n };\n /**\n * Get a link structure given a point id.\n */\n\n\n publicAPI.getLink = function (ptId) {\n return model.array[ptId];\n };\n /**\n * Get the number of cells using the point specified by ptId.\n */\n\n\n publicAPI.getNcells = function (ptId) {\n return model.array[ptId].ncells;\n };\n /**\n * Return a list of cell ids using the point.\n */\n\n\n publicAPI.getCells = function (ptId) {\n return model.array[ptId].cells;\n };\n /**\n * Insert a new point into the cell-links data structure. The size parameter\n * is the initial size of the list.\n */\n\n\n publicAPI.insertNextPoint = function (numLinks) {\n model.array.push({\n ncells: numLinks,\n cells: Array(numLinks)\n });\n ++model.maxId;\n };\n /**\n * Insert a cell id into the list of cells (at the end) using the cell id\n * provided. (Make sure to extend the link list (if necessary) using the\n * method resizeCellList().)\n */\n\n\n publicAPI.insertNextCellReference = function (ptId, cellId) {\n model.array[ptId].cells[model.array[ptId].ncells++] = cellId;\n };\n /**\n * Delete point (and storage) by destroying links to using cells.\n */\n\n\n publicAPI.deletePoint = function (ptId) {\n model.array[ptId].ncells = 0;\n model.array[ptId].cells = null;\n };\n /**\n * Delete the reference to the cell (cellId) from the point (ptId). This\n * removes the reference to the cellId from the cell list, but does not\n * resize the list (recover memory with resizeCellList(), if necessary).\n */\n\n\n publicAPI.removeCellReference = function (cellId, ptId) {\n model.array[ptId].cells = model.array[ptId].cells.filter(function (cell) {\n return cell !== cellId;\n });\n model.array[ptId].ncells = model.array[ptId].cells.length;\n };\n /**\n * Add the reference to the cell (cellId) from the point (ptId). This\n * adds a reference to the cellId from the cell list, but does not resize\n * the list (extend memory with resizeCellList(), if necessary).\n */\n\n\n publicAPI.addCellReference = function (cellId, ptId) {\n model.array[ptId].cells[model.array[ptId].ncells++] = cellId;\n };\n /**\n * Change the length of a point's link list (i.e., list of cells using a\n * point) by the size specified.\n */\n\n\n publicAPI.resizeCellList = function (ptId, size) {\n model.array[ptId].cells.length = size;\n };\n /**\n * Reclaim any unused memory.\n */\n\n\n publicAPI.squeeze = function () {\n resize(model, model.maxId + 1);\n };\n /**\n * Reset to a state of no entries without freeing the memory.\n */\n\n\n publicAPI.reset = function () {\n model.maxId = -1;\n };\n /**\n * Standard DeepCopy method. Since this object contains no reference\n * to other objects, there is no ShallowCopy.\n */\n\n\n publicAPI.deepCopy = function (src) {\n model.array = _toConsumableArray(src.array);\n model.extend = src.extend;\n model.maxId = src.maxId;\n };\n /**\n * Increment the count of the number of cells using the point.\n */\n\n\n publicAPI.incrementLinkCount = function (ptId) {\n ++model.array[ptId].ncells;\n };\n\n publicAPI.allocateLinks = function (n) {\n for (var i = 0; i < n; ++i) {\n model.array[i].cells = new Array(model.array[i].ncells);\n }\n };\n /**\n * Insert a cell id into the list of cells using the point.\n */\n\n\n publicAPI.insertCellReference = function (ptId, pos, cellId) {\n model.array[ptId].cells[pos] = cellId;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n array: null,\n // pointer to data\n maxId: 0,\n // maximum index inserted thus far\n extend: 0 // grow array by this point\n\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues);\n macro.obj(publicAPI, model);\n vtkCellLinks(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkCellLinks'); // ----------------------------------------------------------------------------\n\nvar vtkCellLinks$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { InitLink, vtkCellLinks$1 as default, extend, newInstance };\n","var CellType = {\n // Linear cells\n VTK_EMPTY_CELL: 0,\n VTK_VERTEX: 1,\n VTK_POLY_VERTEX: 2,\n VTK_LINE: 3,\n VTK_POLY_LINE: 4,\n VTK_TRIANGLE: 5,\n VTK_TRIANGLE_STRIP: 6,\n VTK_POLYGON: 7,\n VTK_PIXEL: 8,\n VTK_QUAD: 9,\n VTK_TETRA: 10,\n VTK_VOXEL: 11,\n VTK_HEXAHEDRON: 12,\n VTK_WEDGE: 13,\n VTK_PYRAMID: 14,\n VTK_PENTAGONAL_PRISM: 15,\n VTK_HEXAGONAL_PRISM: 16,\n // Quadratic, isoparametric cells\n VTK_QUADRATIC_EDGE: 21,\n VTK_QUADRATIC_TRIANGLE: 22,\n VTK_QUADRATIC_QUAD: 23,\n VTK_QUADRATIC_POLYGON: 36,\n VTK_QUADRATIC_TETRA: 24,\n VTK_QUADRATIC_HEXAHEDRON: 25,\n VTK_QUADRATIC_WEDGE: 26,\n VTK_QUADRATIC_PYRAMID: 27,\n VTK_BIQUADRATIC_QUAD: 28,\n VTK_TRIQUADRATIC_HEXAHEDRON: 29,\n VTK_QUADRATIC_LINEAR_QUAD: 30,\n VTK_QUADRATIC_LINEAR_WEDGE: 31,\n VTK_BIQUADRATIC_QUADRATIC_WEDGE: 32,\n VTK_BIQUADRATIC_QUADRATIC_HEXAHEDRON: 33,\n VTK_BIQUADRATIC_TRIANGLE: 34,\n // Cubic, isoparametric cell\n VTK_CUBIC_LINE: 35,\n // Special class of cells formed by convex group of points\n VTK_CONVEX_POINT_SET: 41,\n // Polyhedron cell (consisting of polygonal faces)\n VTK_POLYHEDRON: 42,\n // Higher order cells in parametric form\n VTK_PARAMETRIC_CURVE: 51,\n VTK_PARAMETRIC_SURFACE: 52,\n VTK_PARAMETRIC_TRI_SURFACE: 53,\n VTK_PARAMETRIC_QUAD_SURFACE: 54,\n VTK_PARAMETRIC_TETRA_REGION: 55,\n VTK_PARAMETRIC_HEX_REGION: 56,\n // Higher order cells\n VTK_HIGHER_ORDER_EDGE: 60,\n VTK_HIGHER_ORDER_TRIANGLE: 61,\n VTK_HIGHER_ORDER_QUAD: 62,\n VTK_HIGHER_ORDER_POLYGON: 63,\n VTK_HIGHER_ORDER_TETRAHEDRON: 64,\n VTK_HIGHER_ORDER_WEDGE: 65,\n VTK_HIGHER_ORDER_PYRAMID: 66,\n VTK_HIGHER_ORDER_HEXAHEDRON: 67,\n // Arbitrary order Lagrange elements (formulated separated from generic higher order cells)\n VTK_LAGRANGE_CURVE: 68,\n VTK_LAGRANGE_TRIANGLE: 69,\n VTK_LAGRANGE_QUADRILATERAL: 70,\n VTK_LAGRANGE_TETRAHEDRON: 71,\n VTK_LAGRANGE_HEXAHEDRON: 72,\n VTK_LAGRANGE_WEDGE: 73,\n VTK_LAGRANGE_PYRAMID: 74,\n VTK_NUMBER_OF_CELL_TYPES: 75\n}; // This list should contain the cell class names in\n// the same order as in CellType.\n\nvar CellTypesStrings = ['vtkEmptyCell', 'vtkVertex', 'vtkPolyVertex', 'vtkLine', 'vtkPolyLine', 'vtkTriangle', 'vtkTriangleStrip', 'vtkPolygon', 'vtkPixel', 'vtkQuad', 'vtkTetra', 'vtkVoxel', 'vtkHexahedron', 'vtkWedge', 'vtkPyramid', 'vtkPentagonalPrism', 'vtkHexagonalPrism', 'UnknownClass', 'UnknownClass', 'UnknownClass', 'UnknownClass', 'vtkQuadraticEdge', 'vtkQuadraticTriangle', 'vtkQuadraticQuad', 'vtkQuadraticTetra', 'vtkQuadraticHexahedron', 'vtkQuadraticWedge', 'vtkQuadraticPyramid', 'vtkBiQuadraticQuad', 'vtkTriQuadraticHexahedron', 'vtkQuadraticLinearQuad', 'vtkQuadraticLinearWedge', 'vtkBiQuadraticQuadraticWedge', 'vtkBiQuadraticQuadraticHexahedron', 'vtkBiQuadraticTriangle', 'vtkCubicLine', 'vtkQuadraticPolygon', 'UnknownClass', 'UnknownClass', 'UnknownClass', 'UnknownClass', 'vtkConvexPointSet', 'UnknownClass', 'UnknownClass', 'UnknownClass', 'UnknownClass', 'UnknownClass', 'UnknownClass', 'UnknownClass', 'UnknownClass', 'UnknownClass', 'vtkParametricCurve', 'vtkParametricSurface', 'vtkParametricTriSurface', 'vtkParametricQuadSurface', 'vtkParametricTetraRegion', 'vtkParametricHexRegion', 'UnknownClass', 'UnknownClass', 'UnknownClass', 'vtkHigherOrderEdge', 'vtkHigherOrderTriangle', 'vtkHigherOrderQuad', 'vtkHigherOrderPolygon', 'vtkHigherOrderTetrahedron', 'vtkHigherOrderWedge', 'vtkHigherOrderPyramid', 'vtkHigherOrderHexahedron'];\nvar Constants = {\n CellType: CellType,\n CellTypesStrings: CellTypesStrings\n};\n\nexport { CellType, CellTypesStrings, Constants as default };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport macro from '../../macros.js';\nimport { CellTypesStrings, CellType } from './CellTypes/Constants.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n// Global methods\n// ----------------------------------------------------------------------------\n\n/**\n * Given an int (as defined in vtkCellType.h) identifier for a class\n * return it's classname.\n */\n\nfunction getClassNameFromTypeId(typeId) {\n return typeId < CellTypesStrings.length ? CellTypesStrings[typeId] : 'UnknownClass';\n}\n/**\n * Given a data object classname, return it's int identified (as\n * defined in vtkCellType.h)\n */\n\n\nfunction getTypeIdFromClassName(cellTypeString) {\n return CellTypesStrings.findIndex(cellTypeString);\n}\n/**\n * This convenience method is a fast check to determine if a cell type\n * represents a linear or nonlinear cell. This is generally much more\n * efficient than getting the appropriate vtkCell and checking its IsLinear\n * method.\n */\n\n\nfunction isLinear(type) {\n return type < CellType.VTK_QUADRATIC_EDGE || type === CellType.VTK_CONVEX_POINT_SET || type === CellType.VTK_POLYHEDRON;\n}\n\nfunction hasSubCells(cellType) {\n return cellType === CellType.VTK_TRIANGLE_STRIP || cellType === CellType.VTK_POLY_LINE || cellType === CellType.VTK_POLY_VERTEX;\n} // ----------------------------------------------------------------------------\n// Static API\n// ----------------------------------------------------------------------------\n\n\nvar STATIC = {\n getClassNameFromTypeId: getClassNameFromTypeId,\n getTypeIdFromClassName: getTypeIdFromClassName,\n isLinear: isLinear,\n hasSubCells: hasSubCells\n}; // ----------------------------------------------------------------------------\n// vtkCellTypes methods\n// ----------------------------------------------------------------------------\n\nfunction vtkCellTypes(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkCellTypes');\n /**\n * Allocate memory for this array. Delete old storage only if necessary.\n */\n\n publicAPI.allocate = function () {\n var sz = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 512;\n var ext = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1000;\n model.size = sz > 0 ? sz : 1;\n model.extend = ext > 0 ? ext : 1;\n model.maxId = -1;\n model.typeArray = new Uint8Array(sz);\n model.locationArray = new Uint32Array(sz);\n };\n /**\n * Add a cell at specified id.\n */\n\n\n publicAPI.insertCell = function (cellId, type, loc) {\n model.typeArray[cellId] = type;\n model.locationArray[cellId] = loc;\n\n if (cellId > model.maxId) {\n model.maxId = cellId;\n }\n };\n /**\n * Add a cell to the object in the next available slot.\n */\n\n\n publicAPI.insertNextCell = function (type, loc) {\n publicAPI.insertCell(++model.maxId, type, loc);\n return model.maxId;\n };\n /**\n * Specify a group of cell types. This version is provided to maintain\n * backwards compatibility and does a copy of the cellLocations\n */\n\n\n publicAPI.setCellTypes = function (ncells, cellTypes, cellLocations) {\n model.size = ncells;\n model.typeArray = cellTypes;\n model.locationArray = cellLocations;\n model.maxId = ncells - 1;\n };\n /**\n * Return the location of the cell in the associated vtkCellArray.\n */\n\n\n publicAPI.getCellLocation = function (cellId) {\n return model.locationArray[cellId];\n };\n /**\n * Delete cell by setting to nullptr cell type.\n */\n\n\n publicAPI.deleteCell = function (cellId) {\n model.typeArray[cellId] = CellType.VTK_EMPTY_CELL;\n };\n /**\n * Return the number of types in the list.\n */\n\n\n publicAPI.getNumberOfTypes = function () {\n return model.maxId + 1;\n };\n /**\n * Return true if type specified is contained in list; false otherwise.\n */\n\n\n publicAPI.isType = function (type) {\n var numTypes = publicAPI.getNumberOfTypes();\n\n for (var i = 0; i < numTypes; ++i) {\n if (type === publicAPI.getCellType(i)) {\n return true;\n }\n }\n\n return false;\n };\n /**\n * Add the type specified to the end of the list. Range checking is performed.\n */\n\n\n publicAPI.insertNextType = function (type) {\n return publicAPI.insertNextCell(type, -1);\n };\n /**\n * Return the type of cell.\n */\n\n\n publicAPI.getCellType = function (cellId) {\n return model.typeArray[cellId];\n };\n /**\n * Reclaim any extra memory.\n */\n // TODO: publicAPI.squeeze = () => {};\n\n /**\n * Initialize object without releasing memory.\n */\n\n\n publicAPI.reset = function () {\n model.maxId = -1;\n };\n /**\n * Standard DeepCopy method. Since this object contains no reference\n * to other objects, there is no ShallowCopy.\n */\n\n\n publicAPI.deepCopy = function (src) {\n publicAPI.allocate(src.getSize(), src.getExtend());\n model.typeArray.set(src.getTypeArray());\n model.locationArray.set(src.getLocationArray());\n model.maxId = src.getMaxId();\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n // typeArray: null, // pointer to types array\n // locationArray: null; // pointer to array of offsets\n size: 0,\n // allocated size of data\n maxId: -1,\n // maximum index inserted thus far\n extend: 1000 // grow array by this point\n\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues);\n macro.obj(publicAPI, model);\n macro.get(publicAPI, model, ['size', 'maxId', 'extend']);\n macro.getArray(publicAPI, model, ['typeArray', 'locationArray']);\n vtkCellTypes(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkCellTypes'); // ----------------------------------------------------------------------------\n\nvar vtkCellTypes$1 = _objectSpread({\n newInstance: newInstance,\n extend: extend\n}, STATIC);\n\nexport { STATIC, vtkCellTypes$1 as default, extend, newInstance };\n","var IntersectionState = {\n NO_INTERSECTION: 0,\n YES_INTERSECTION: 1,\n ON_LINE: 2\n};\nvar Constants = {\n IntersectionState: IntersectionState\n};\n\nexport { IntersectionState, Constants as default };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport macro from '../../macros.js';\nimport Constants from './Line/Constants.js';\nimport vtkCell from './Cell.js';\nimport { d as dot, e as distance2BetweenPoints, s as subtract, g as solveLinearSystem } from '../Core/Math/index.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nvar IntersectionState = Constants.IntersectionState; // ----------------------------------------------------------------------------\n// Global methods\n// ----------------------------------------------------------------------------\n\nfunction distanceToLine(x, p1, p2) {\n var closestPoint = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\n var outObj = {\n t: Number.MIN_VALUE,\n distance: 0\n };\n var p21 = [];\n var closest; // Determine appropriate vector\n\n p21[0] = p2[0] - p1[0];\n p21[1] = p2[1] - p1[1];\n p21[2] = p2[2] - p1[2]; // Get parametric location\n\n var num = p21[0] * (x[0] - p1[0]) + p21[1] * (x[1] - p1[1]) + p21[2] * (x[2] - p1[2]);\n var denom = dot(p21, p21); // trying to avoid an expensive fabs\n\n var tolerance = 1e-5 * num;\n\n if (denom !== 0.0) {\n outObj.t = num / denom;\n }\n\n if (tolerance < 0.0) {\n tolerance = -tolerance;\n }\n\n if (-tolerance < denom && denom < tolerance) {\n closest = p1;\n } else if (denom <= 0.0 || outObj.t < 0.0) {\n // If parametric coordinate is within 0<=p<=1, then the point is closest to\n // the line. Otherwise, it's closest to a point at the end of the line.\n closest = p1;\n } else if (outObj.t > 1.0) {\n closest = p2;\n } else {\n closest = p21;\n p21[0] = p1[0] + outObj.t * p21[0];\n p21[1] = p1[1] + outObj.t * p21[1];\n p21[2] = p1[2] + outObj.t * p21[2];\n }\n\n if (closestPoint) {\n closestPoint[0] = closest[0];\n closestPoint[1] = closest[1];\n closestPoint[2] = closest[2];\n }\n\n outObj.distance = distance2BetweenPoints(closest, x);\n return outObj;\n}\n\nfunction intersection(a1, a2, b1, b2, u, v) {\n var a21 = [];\n var b21 = [];\n var b1a1 = [];\n u[0] = 0.0;\n v[0] = 0.0; // Determine line vectors.\n\n subtract(a2, a1, a21);\n subtract(b2, b1, b21);\n subtract(b1, a1, b1a1); // Compute the system (least squares) matrix.\n\n var A = [dot(a21, a21), -dot(a21, b21), -dot(a21, b21), dot(b21, b21)]; // Compute the least squares system constant term.\n\n var c = [];\n c[0] = dot(a21, b1a1);\n c[1] = -dot(b21, b1a1); // Solve the system of equations\n\n if (solveLinearSystem(A, c, 2) === 0) {\n // The lines are colinear. Therefore, one of the four endpoints is the\n // point of closest approach\n var minDist = Number.MAX_VALUE;\n var p = [a1, a2, b1, b2];\n var l1 = [b1, b1, a1, a1];\n var l2 = [b2, b2, a2, a2];\n var uv1 = [v[0], v[0], u[0], u[0]];\n var uv2 = [u[0], u[0], v[0], v[0]];\n var obj;\n\n for (var i = 0; i < 4; i++) {\n obj = distanceToLine(p[i], l1[i], l2[i]);\n\n if (obj.distance < minDist) {\n minDist = obj.distance;\n uv1[i] = obj.t;\n uv2[i] = i % 2;\n }\n }\n\n return IntersectionState.ON_LINE;\n }\n\n u[0] = c[0];\n v[0] = c[1]; // Check parametric coordinates for intersection.\n\n if (u[0] >= 0.0 && u[0] <= 1.0 && v[0] >= 0.0 && v[0] <= 1.0) {\n return IntersectionState.YES_INTERSECTION;\n }\n\n return IntersectionState.NO_INTERSECTION;\n} // ----------------------------------------------------------------------------\n// Static API\n// ----------------------------------------------------------------------------\n\n\nvar STATIC = {\n distanceToLine: distanceToLine,\n intersection: intersection\n}; // ----------------------------------------------------------------------------\n// vtkLine methods\n// ----------------------------------------------------------------------------\n\nfunction vtkLine(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkLine');\n\n function isBetweenPoints(t) {\n return t >= 0.0 && t <= 1.0;\n }\n\n publicAPI.getCellDimension = function () {\n return 1;\n };\n\n publicAPI.intersectWithLine = function (p1, p2, tol, x, pcoords) {\n var outObj = {\n intersect: 0,\n t: Number.MAX_VALUE,\n subId: 0,\n betweenPoints: null\n };\n pcoords[1] = 0.0;\n pcoords[2] = 0.0;\n var projXYZ = [];\n var a1 = [];\n var a2 = [];\n model.points.getPoint(0, a1);\n model.points.getPoint(1, a2);\n var u = [];\n var v = [];\n var intersect = intersection(p1, p2, a1, a2, u, v);\n outObj.t = u[0];\n outObj.betweenPoints = isBetweenPoints(outObj.t);\n pcoords[0] = v[0];\n\n if (intersect === IntersectionState.YES_INTERSECTION) {\n // make sure we are within tolerance\n for (var i = 0; i < 3; i++) {\n x[i] = a1[i] + pcoords[0] * (a2[i] - a1[i]);\n projXYZ[i] = p1[i] + outObj.t * (p2[i] - p1[i]);\n }\n\n if (distance2BetweenPoints(x, projXYZ) <= tol * tol) {\n outObj.intersect = 1;\n return outObj;\n }\n } else {\n var outDistance; // check to see if it lies within tolerance\n // one of the parametric coords must be outside 0-1\n\n if (outObj.t < 0.0) {\n outDistance = distanceToLine(p1, a1, a2, x);\n\n if (outDistance.distance <= tol * tol) {\n outObj.t = 0.0;\n outObj.intersect = 1;\n outObj.betweenPoints = true; // Intersection is near p1\n\n return outObj;\n }\n\n return outObj;\n }\n\n if (outObj.t > 1.0) {\n outDistance = distanceToLine(p2, a1, a2, x);\n\n if (outDistance.distance <= tol * tol) {\n outObj.t = 1.0;\n outObj.intersect = 1;\n outObj.betweenPoints = true; // Intersection is near p2\n\n return outObj;\n }\n\n return outObj;\n }\n\n if (pcoords[0] < 0.0) {\n pcoords[0] = 0.0;\n outDistance = distanceToLine(a1, p1, p2, x);\n outObj.t = outDistance.t;\n\n if (outDistance.distance <= tol * tol) {\n outObj.intersect = 1;\n return outObj;\n }\n\n return outObj;\n }\n\n if (pcoords[0] > 1.0) {\n pcoords[0] = 1.0;\n outDistance = distanceToLine(a2, p1, p2, x);\n outObj.t = outDistance.t;\n\n if (outDistance.distance <= tol * tol) {\n outObj.intersect = 1;\n return outObj;\n }\n\n return outObj;\n }\n }\n\n return outObj;\n };\n\n publicAPI.evaluateLocation = function (pcoords, x, weights) {\n var a1 = [];\n var a2 = [];\n model.points.getPoint(0, a1);\n model.points.getPoint(1, a2);\n\n for (var i = 0; i < 3; i++) {\n x[i] = a1[i] + pcoords[0] * (a2[i] - a1[i]);\n }\n\n weights[0] = 1.0 - pcoords[0];\n weights[1] = pcoords[0];\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues);\n vtkCell.extend(publicAPI, model, initialValues);\n vtkLine(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkLine'); // ----------------------------------------------------------------------------\n\nvar vtkLine$1 = _objectSpread(_objectSpread({\n newInstance: newInstance,\n extend: extend\n}, STATIC), Constants);\n\nexport { STATIC, vtkLine$1 as default, extend, newInstance };\n","import vtk from '../../vtk.js';\nimport macro from '../../macros.js';\nimport vtkDataSet from './DataSet.js';\nimport vtkPoints from '../Core/Points.js';\n\n// Global methods\n// ----------------------------------------------------------------------------\n// ----------------------------------------------------------------------------\n// vtkPointSet methods\n// ----------------------------------------------------------------------------\n\nfunction vtkPointSet(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkPointSet'); // Create empty points\n\n if (!model.points) {\n model.points = vtkPoints.newInstance();\n } else {\n model.points = vtk(model.points);\n }\n\n publicAPI.getNumberOfPoints = function () {\n return model.points.getNumberOfPoints();\n };\n\n publicAPI.getBounds = function () {\n return model.points.getBounds();\n };\n\n publicAPI.computeBounds = function () {\n publicAPI.getBounds();\n };\n\n var superShallowCopy = publicAPI.shallowCopy;\n\n publicAPI.shallowCopy = function (other) {\n var debug = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n superShallowCopy(other, debug);\n model.points = vtkPoints.newInstance();\n model.points.shallowCopy(other.getPoints());\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {// points: null,\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkDataSet.extend(publicAPI, model, initialValues);\n macro.setGet(publicAPI, model, ['points']); // Object specific methods\n\n vtkPointSet(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkPointSet'); // ----------------------------------------------------------------------------\n\nvar vtkPointSet$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkPointSet$1 as default, extend, newInstance };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport macro from '../../macros.js';\nimport vtkCell from './Cell.js';\nimport { d as dot, j as cross, l as normalize, m as multiplyAccumulate, e as distance2BetweenPoints, o as determinant2x2 } from '../Core/Math/index.js';\nimport vtkLine from './Line.js';\nimport vtkPlane from './Plane.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n// Global methods\n// ----------------------------------------------------------------------------\n\nfunction computeNormalDirection(v1, v2, v3, n) {\n // order is important!!! maintain consistency with triangle vertex order\n var ax = v3[0] - v2[0];\n var ay = v3[1] - v2[1];\n var az = v3[2] - v2[2];\n var bx = v1[0] - v2[0];\n var by = v1[1] - v2[1];\n var bz = v1[2] - v2[2];\n n[0] = ay * bz - az * by;\n n[1] = az * bx - ax * bz;\n n[2] = ax * by - ay * bx;\n}\n\nfunction computeNormal(v1, v2, v3, n) {\n computeNormalDirection(v1, v2, v3, n);\n var length = Math.sqrt(n[0] * n[0] + n[1] * n[1] + n[2] * n[2]);\n\n if (length !== 0.0) {\n n[0] /= length;\n n[1] /= length;\n n[2] /= length;\n }\n}\n\nfunction intersectWithTriangle(p1, q1, r1, p2, q2, r2) {\n var tolerance = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : 1e-6;\n var coplanar = false;\n var pt1 = [];\n var pt2 = [];\n var surfaceId = [];\n var n1 = [];\n var n2 = []; // Compute supporting plane normals.\n\n computeNormal(p1, q1, r1, n1);\n computeNormal(p2, q2, r2, n2);\n var s1 = -dot(n1, p1);\n var s2 = -dot(n2, p2); // Compute signed distances of points p1, q1, r1 from supporting\n // plane of second triangle.\n\n var dist1 = [dot(n2, p1) + s2, dot(n2, q1) + s2, dot(n2, r1) + s2]; // If signs of all points are the same, all the points lie on the\n // same side of the supporting plane, and we can exit early.\n\n if (dist1[0] * dist1[1] > tolerance && dist1[0] * dist1[2] > tolerance) {\n // vtkDebugMacro(<<\"Same side supporting plane 1!\");\n return {\n intersect: false,\n coplanar: coplanar,\n pt1: pt1,\n pt2: pt2,\n surfaceId: surfaceId\n };\n } // Do the same for p2, q2, r2 and supporting plane of first\n // triangle.\n\n\n var dist2 = [dot(n1, p2) + s1, dot(n1, q2) + s1, dot(n1, r2) + s1]; // If signs of all points are the same, all the points lie on the\n // same side of the supporting plane, and we can exit early.\n\n if (dist2[0] * dist2[1] > tolerance && dist2[0] * dist2[2] > tolerance) {\n // vtkDebugMacro(<<\"Same side supporting plane 2!\");\n return {\n intersect: false,\n coplanar: coplanar,\n pt1: pt1,\n pt2: pt2,\n surfaceId: surfaceId\n };\n } // Check for coplanarity of the supporting planes.\n\n\n if (Math.abs(n1[0] - n2[0]) < 1e-9 && Math.abs(n1[1] - n2[1]) < 1e-9 && Math.abs(n1[2] - n2[2]) < 1e-9 && Math.abs(s1 - s2) < 1e-9) {\n coplanar = true; // vtkDebugMacro(<<\"Coplanar!\");\n\n return {\n intersect: false,\n coplanar: coplanar,\n pt1: pt1,\n pt2: pt2,\n surfaceId: surfaceId\n };\n } // There are more efficient ways to find the intersection line (if\n // it exists), but this is clear enough.\n\n\n var pts1 = [p1, q1, r1];\n var pts2 = [p2, q2, r2]; // Find line of intersection (L = p + t*v) between two planes.\n\n var n1n2 = dot(n1, n2);\n var a = (s1 - s2 * n1n2) / (n1n2 * n1n2 - 1.0);\n var b = (s2 - s1 * n1n2) / (n1n2 * n1n2 - 1.0);\n var p = [a * n1[0] + b * n2[0], a * n1[1] + b * n2[1], a * n1[2] + b * n2[2]];\n var v = cross(n1, n2, []);\n normalize(v);\n var index1 = 0;\n var index2 = 0;\n var t1 = [];\n var t2 = [];\n var ts1 = 50;\n var ts2 = 50;\n\n for (var i = 0; i < 3; i++) {\n var id1 = i;\n var id2 = (i + 1) % 3; // Find t coordinate on line of intersection between two planes.\n\n var val1 = vtkPlane.intersectWithLine(pts1[id1], pts1[id2], p2, n2);\n\n if (val1.intersection && val1.t > 0 - tolerance && val1.t < 1 + tolerance) {\n if (val1.t < 1 + tolerance && val1.t > 1 - tolerance) {\n ts1 = index1;\n }\n\n t1[index1++] = dot(val1.x, v) - dot(p, v);\n }\n\n var val2 = vtkPlane.intersectWithLine(pts2[id1], pts2[id2], p1, n1);\n\n if (val2.intersection && val2.t > 0 - tolerance && val2.t < 1 + tolerance) {\n if (val2.t < 1 + tolerance && val2.t > 1 - tolerance) {\n ts2 = index2;\n }\n\n t2[index2++] = dot(val2.x, v) - dot(p, v);\n }\n } // If the value of the index is greater than 2, the intersecting point\n // actually is intersected by all three edges. In this case, set the two\n // edges to the two edges where the intersecting point is not the end point\n\n\n if (index1 > 2) {\n index1--; // swap\n\n var t12 = t1[2];\n t1[2] = t1[ts1];\n t1[ts1] = t12;\n }\n\n if (index2 > 2) {\n index2--;\n var t22 = t2[2];\n t2[2] = t2[ts2];\n t2[ts2] = t22;\n } // Check if only one edge or all edges intersect the supporting\n // planes intersection.\n\n\n if (index1 !== 2 || index2 !== 2) {\n // vtkDebugMacro(<<\"Only one edge intersecting!\");\n return {\n intersect: false,\n coplanar: coplanar,\n pt1: pt1,\n pt2: pt2,\n surfaceId: surfaceId\n };\n } // Check for NaNs\n\n\n if (Number.isNaN(t1[0]) || Number.isNaN(t1[1]) || Number.isNaN(t2[0]) || Number.isNaN(t2[1])) {\n // vtkWarningMacro(<<\"NaNs!\");\n return {\n intersect: false,\n coplanar: coplanar,\n pt1: pt1,\n pt2: pt2,\n surfaceId: surfaceId\n };\n }\n\n if (t1[0] > t1[1]) {\n // swap\n var t11 = t1[1];\n t1[1] = t1[0];\n t1[0] = t11;\n }\n\n if (t2[0] > t2[1]) {\n // swap\n var t21 = t2[1];\n t2[1] = t2[0];\n t2[0] = t21;\n } // Handle the different interval configuration cases.\n\n\n var tt1;\n var tt2;\n\n if (t1[1] < t2[0] || t2[1] < t1[0]) {\n // vtkDebugMacro(<<\"No Overlap!\");\n return {\n intersect: false,\n coplanar: coplanar,\n pt1: pt1,\n pt2: pt2,\n surfaceId: surfaceId\n }; // No overlap\n }\n\n if (t1[0] < t2[0]) {\n if (t1[1] < t2[1]) {\n // First point on surface 2, second point on surface 1\n surfaceId[0] = 2;\n surfaceId[1] = 1;\n tt1 = t2[0];\n tt2 = t1[1];\n } else {\n // Both points belong to lines on surface 2\n surfaceId[0] = 2;\n surfaceId[1] = 2;\n tt1 = t2[0];\n tt2 = t2[1];\n }\n } // t1[0] >= t2[0]\n else if (t1[1] < t2[1]) {\n // Both points belong to lines on surface 1\n surfaceId[0] = 1;\n surfaceId[1] = 1;\n tt1 = t1[0];\n tt2 = t1[1];\n } else {\n // First point on surface 1, second point on surface 2\n surfaceId[0] = 1;\n surfaceId[1] = 2;\n tt1 = t1[0];\n tt2 = t2[1];\n } // Create actual intersection points.\n\n\n multiplyAccumulate(p, v, tt1, pt1);\n multiplyAccumulate(p, v, tt2, pt2);\n return {\n intersect: true,\n coplanar: coplanar,\n pt1: pt1,\n pt2: pt2,\n surfaceId: surfaceId\n };\n} // ----------------------------------------------------------------------------\n// Static API\n// ----------------------------------------------------------------------------\n\n\nvar STATIC = {\n computeNormalDirection: computeNormalDirection,\n computeNormal: computeNormal,\n intersectWithTriangle: intersectWithTriangle\n}; // ----------------------------------------------------------------------------\n// vtkTriangle methods\n// ----------------------------------------------------------------------------\n\nfunction vtkTriangle(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkTriangle');\n\n publicAPI.getCellDimension = function () {\n return 2;\n };\n\n publicAPI.intersectWithLine = function (p1, p2, tol, x, pcoords) {\n var outObj = {\n subId: 0,\n t: Number.MAX_VALUE,\n intersect: 0,\n betweenPoints: false\n };\n pcoords[2] = 0.0;\n var closestPoint = [];\n var tol2 = tol * tol; // Get normal for triangle\n\n var pt1 = [];\n var pt2 = [];\n var pt3 = [];\n model.points.getPoint(0, pt1);\n model.points.getPoint(1, pt2);\n model.points.getPoint(2, pt3);\n var n = [];\n var weights = [];\n computeNormal(pt1, pt2, pt3, n);\n\n if (n[0] !== 0 || n[1] !== 0 || n[2] !== 0) {\n // Intersect plane of triangle with line\n var plane = vtkPlane.intersectWithLine(p1, p2, pt1, n);\n outObj.betweenPoints = plane.betweenPoints;\n outObj.t = plane.t;\n x[0] = plane.x[0];\n x[1] = plane.x[1];\n x[2] = plane.x[2];\n\n if (!plane.intersection) {\n pcoords[0] = 0.0;\n pcoords[1] = 0.0;\n outObj.intersect = 0;\n return outObj;\n } // Evaluate position\n\n\n var inside = publicAPI.evaluatePosition(x, closestPoint, pcoords, weights);\n\n if (inside.evaluation >= 0) {\n if (inside.dist2 <= tol2) {\n outObj.intersect = 1;\n return outObj;\n }\n\n outObj.intersect = inside.evaluation;\n return outObj;\n }\n } // Normals are null, so the triangle is degenerated and\n // we still need to check intersection between line and\n // the longest edge.\n\n\n var dist2Pt1Pt2 = distance2BetweenPoints(pt1, pt2);\n var dist2Pt2Pt3 = distance2BetweenPoints(pt2, pt3);\n var dist2Pt3Pt1 = distance2BetweenPoints(pt3, pt1);\n\n if (!model.line) {\n model.line = vtkLine.newInstance();\n }\n\n if (dist2Pt1Pt2 > dist2Pt2Pt3 && dist2Pt1Pt2 > dist2Pt3Pt1) {\n model.line.getPoints().setPoint(0, pt1);\n model.line.getPoints().setPoint(1, pt2);\n } else if (dist2Pt2Pt3 > dist2Pt3Pt1 && dist2Pt2Pt3 > dist2Pt1Pt2) {\n model.line.getPoints().setPoint(0, pt2);\n model.line.getPoints().setPoint(1, pt3);\n } else {\n model.line.getPoints().setPoint(0, pt3);\n model.line.getPoints().setPoint(1, pt1);\n }\n\n var intersectLine = model.line.intersectWithLine(p1, p2, tol, x, pcoords);\n outObj.betweenPoints = intersectLine.betweenPoints;\n outObj.t = intersectLine.t;\n\n if (intersectLine.intersect) {\n var pt3Pt1 = [];\n var pt3Pt2 = [];\n var pt3X = []; // Compute r and s manually, using dot and norm.\n\n for (var i = 0; i < 3; i++) {\n pt3Pt1[i] = pt1[i] - pt3[i];\n pt3Pt2[i] = pt2[i] - pt3[i];\n pt3X[i] = x[i] - pt3[i];\n }\n\n pcoords[0] = dot(pt3X, pt3Pt1) / dist2Pt3Pt1;\n pcoords[1] = dot(pt3X, pt3Pt2) / dist2Pt2Pt3;\n outObj.intersect = 1;\n return outObj;\n }\n\n pcoords[0] = 0.0;\n pcoords[1] = 0.0;\n outObj.intersect = 0;\n return outObj;\n };\n\n publicAPI.evaluatePosition = function (x, closestPoint, pcoords, weights) {\n // will return obj\n var outObj = {\n subId: 0,\n dist2: 0,\n evaluation: -1\n };\n var i;\n var j;\n var pt1 = [];\n var pt2 = [];\n var pt3 = [];\n var n = [];\n var fabsn;\n var rhs = [];\n var c1 = [];\n var c2 = [];\n var det = 0;\n var idx = 0;\n var indices = [];\n var dist2Point;\n var dist2Line1;\n var dist2Line2;\n var closest = [];\n var closestPoint1 = [];\n var closestPoint2 = [];\n var cp = [];\n outObj.subId = 0;\n pcoords[2] = 0.0; // Get normal for triangle, only the normal direction is needed, i.e. the\n // normal need not be normalized (unit length)\n //\n\n model.points.getPoint(1, pt1);\n model.points.getPoint(2, pt2);\n model.points.getPoint(0, pt3);\n computeNormalDirection(pt1, pt2, pt3, n); // Project point to plane\n\n vtkPlane.generalizedProjectPoint(x, pt1, n, cp); // Construct matrices. Since we have over determined system, need to find\n // which 2 out of 3 equations to use to develop equations. (Any 2 should\n // work since we've projected point to plane.)\n\n var maxComponent = 0.0;\n\n for (i = 0; i < 3; i++) {\n // trying to avoid an expensive call to fabs()\n if (n[i] < 0) {\n fabsn = -n[i];\n } else {\n fabsn = n[i];\n }\n\n if (fabsn > maxComponent) {\n maxComponent = fabsn;\n idx = i;\n }\n }\n\n for (j = 0, i = 0; i < 3; i++) {\n if (i !== idx) {\n indices[j++] = i;\n }\n }\n\n for (i = 0; i < 2; i++) {\n rhs[i] = cp[indices[i]] - pt3[indices[i]];\n c1[i] = pt1[indices[i]] - pt3[indices[i]];\n c2[i] = pt2[indices[i]] - pt3[indices[i]];\n }\n\n det = determinant2x2(c1, c2);\n\n if (det === 0.0) {\n pcoords[0] = 0.0;\n pcoords[1] = 0.0;\n outObj.evaluation = -1;\n return outObj;\n }\n\n pcoords[0] = determinant2x2(rhs, c2) / det;\n pcoords[1] = determinant2x2(c1, rhs) / det; // Okay, now find closest point to element\n\n weights[0] = 1 - (pcoords[0] + pcoords[1]);\n weights[1] = pcoords[0];\n weights[2] = pcoords[1];\n\n if (weights[0] >= 0.0 && weights[0] <= 1.0 && weights[1] >= 0.0 && weights[1] <= 1.0 && weights[2] >= 0.0 && weights[2] <= 1.0) {\n // projection distance\n if (closestPoint) {\n outObj.dist2 = distance2BetweenPoints(cp, x);\n closestPoint[0] = cp[0];\n closestPoint[1] = cp[1];\n closestPoint[2] = cp[2];\n }\n\n outObj.evaluation = 1;\n } else {\n var t;\n\n if (closestPoint) {\n if (weights[1] < 0.0 && weights[2] < 0.0) {\n dist2Point = distance2BetweenPoints(x, pt3);\n dist2Line1 = vtkLine.distanceToLine(x, pt1, pt3, t, closestPoint1);\n dist2Line2 = vtkLine.distanceToLine(x, pt3, pt2, t, closestPoint2);\n\n if (dist2Point < dist2Line1) {\n outObj.dist2 = dist2Point;\n closest = pt3;\n } else {\n outObj.dist2 = dist2Line1;\n closest = closestPoint1;\n }\n\n if (dist2Line2 < outObj.dist2) {\n outObj.dist2 = dist2Line2;\n closest = closestPoint2;\n }\n\n for (i = 0; i < 3; i++) {\n closestPoint[i] = closest[i];\n }\n } else if (weights[2] < 0.0 && weights[0] < 0.0) {\n dist2Point = distance2BetweenPoints(x, pt1);\n dist2Line1 = vtkLine.distanceToLine(x, pt1, pt3, t, closestPoint1);\n dist2Line2 = vtkLine.distanceToLine(x, pt1, pt2, t, closestPoint2);\n\n if (dist2Point < dist2Line1) {\n outObj.dist2 = dist2Point;\n closest = pt1;\n } else {\n outObj.dist2 = dist2Line1;\n closest = closestPoint1;\n }\n\n if (dist2Line2 < outObj.dist2) {\n outObj.dist2 = dist2Line2;\n closest = closestPoint2;\n }\n\n for (i = 0; i < 3; i++) {\n closestPoint[i] = closest[i];\n }\n } else if (weights[1] < 0.0 && weights[0] < 0.0) {\n dist2Point = distance2BetweenPoints(x, pt2);\n dist2Line1 = vtkLine.distanceToLine(x, pt2, pt3, t, closestPoint1);\n dist2Line2 = vtkLine.distanceToLine(x, pt1, pt2, t, closestPoint2);\n\n if (dist2Point < dist2Line1) {\n outObj.dist2 = dist2Point;\n closest = pt2;\n } else {\n outObj.dist2 = dist2Line1;\n closest = closestPoint1;\n }\n\n if (dist2Line2 < outObj.dist2) {\n outObj.dist2 = dist2Line2;\n closest = closestPoint2;\n }\n\n for (i = 0; i < 3; i++) {\n closestPoint[i] = closest[i];\n }\n } else if (weights[0] < 0.0) {\n var lineDistance = vtkLine.distanceToLine(x, pt1, pt2, closestPoint);\n outObj.dist2 = lineDistance.distance;\n } else if (weights[1] < 0.0) {\n var _lineDistance = vtkLine.distanceToLine(x, pt2, pt3, closestPoint);\n\n outObj.dist2 = _lineDistance.distance;\n } else if (weights[2] < 0.0) {\n var _lineDistance2 = vtkLine.distanceToLine(x, pt1, pt3, closestPoint);\n\n outObj.dist2 = _lineDistance2.distance;\n }\n }\n\n outObj.evaluation = 0;\n }\n\n return outObj;\n };\n\n publicAPI.evaluateLocation = function (pcoords, x, weights) {\n var p0 = [];\n var p1 = [];\n var p2 = [];\n model.points.getPoint(0, p0);\n model.points.getPoint(1, p1);\n model.points.getPoint(2, p2);\n var u3 = 1.0 - pcoords[0] - pcoords[1];\n\n for (var i = 0; i < 3; i++) {\n x[i] = p0[i] * u3 + p1[i] * pcoords[0] + p2[i] * pcoords[1];\n }\n\n weights[0] = u3;\n weights[1] = pcoords[0];\n weights[2] = pcoords[1];\n };\n\n publicAPI.getParametricDistance = function (pcoords) {\n var pDist;\n var pDistMax = 0.0;\n var pc = [];\n pc[0] = pcoords[0];\n pc[1] = pcoords[1];\n pc[2] = 1.0 - pcoords[0] - pcoords[1];\n\n for (var i = 0; i < 3; i++) {\n if (pc[i] < 0.0) {\n pDist = -pc[i];\n } else if (pc[i] > 1.0) {\n pDist = pc[i] - 1.0;\n } else {\n // inside the cell in the parametric direction\n pDist = 0.0;\n }\n\n if (pDist > pDistMax) {\n pDistMax = pDist;\n }\n }\n\n return pDistMax;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues);\n vtkCell.extend(publicAPI, model, initialValues);\n vtkTriangle(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkTriangle'); // ----------------------------------------------------------------------------\n\nvar vtkTriangle$1 = _objectSpread({\n newInstance: newInstance,\n extend: extend\n}, STATIC);\n\nexport { STATIC, vtkTriangle$1 as default, extend, newInstance };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport macro from '../../macros.js';\nimport vtk from '../../vtk.js';\nimport vtkCellArray from '../Core/CellArray.js';\nimport vtkCellLinks from './CellLinks.js';\nimport vtkCellTypes from './CellTypes.js';\nimport vtkLine from './Line.js';\nimport vtkPointSet from './PointSet.js';\nimport vtkTriangle from './Triangle.js';\nimport { CellType } from './CellTypes/Constants.js';\nimport { POLYDATA_FIELDS } from './PolyData/Constants.js';\n\nvar _CELL_FACTORY;\nvar vtkWarningMacro = macro.vtkWarningMacro;\nvar CELL_FACTORY = (_CELL_FACTORY = {}, _defineProperty(_CELL_FACTORY, CellType.VTK_LINE, vtkLine), _defineProperty(_CELL_FACTORY, CellType.VTK_POLY_LINE, vtkLine), _defineProperty(_CELL_FACTORY, CellType.VTK_TRIANGLE, vtkTriangle), _CELL_FACTORY); // ----------------------------------------------------------------------------\n// vtkPolyData methods\n// ----------------------------------------------------------------------------\n\nfunction vtkPolyData(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkPolyData');\n\n function camelize(str) {\n return str.replace(/(?:^\\w|[A-Z]|\\b\\w)/g, function (letter) {\n return letter.toUpperCase();\n }).replace(/\\s+/g, '');\n } // build empty cell arrays and set methods\n\n\n POLYDATA_FIELDS.forEach(function (type) {\n publicAPI[\"getNumberOf\".concat(camelize(type))] = function () {\n return model[type].getNumberOfCells();\n };\n\n if (!model[type]) {\n model[type] = vtkCellArray.newInstance();\n } else {\n model[type] = vtk(model[type]);\n }\n });\n\n publicAPI.getNumberOfCells = function () {\n return POLYDATA_FIELDS.reduce(function (num, cellType) {\n return num + model[cellType].getNumberOfCells();\n }, 0);\n };\n\n var superShallowCopy = publicAPI.shallowCopy;\n\n publicAPI.shallowCopy = function (other) {\n var debug = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n superShallowCopy(other, debug);\n POLYDATA_FIELDS.forEach(function (type) {\n model[type] = vtkCellArray.newInstance();\n model[type].shallowCopy(other.getReferenceByName(type));\n });\n };\n\n publicAPI.buildCells = function () {\n // here are the number of cells we have\n var nVerts = publicAPI.getNumberOfVerts();\n var nLines = publicAPI.getNumberOfLines();\n var nPolys = publicAPI.getNumberOfPolys();\n var nStrips = publicAPI.getNumberOfStrips(); // pre-allocate the space we need\n\n var nCells = nVerts + nLines + nPolys + nStrips;\n var types = new Uint8Array(nCells);\n var pTypes = types;\n var locs = new Uint32Array(nCells);\n var pLocs = locs; // record locations and type of each cell.\n // verts\n\n if (nVerts) {\n var nextCellPts = 0;\n model.verts.getCellSizes().forEach(function (numCellPts, index) {\n pLocs[index] = nextCellPts;\n pTypes[index] = numCellPts > 1 ? CellType.VTK_POLY_VERTEX : CellType.VTK_VERTEX;\n nextCellPts += numCellPts + 1;\n });\n pLocs = pLocs.subarray(nVerts);\n pTypes = pTypes.subarray(nVerts);\n } // lines\n\n\n if (nLines) {\n var _nextCellPts = 0;\n model.lines.getCellSizes().forEach(function (numCellPts, index) {\n pLocs[index] = _nextCellPts;\n pTypes[index] = numCellPts > 2 ? CellType.VTK_POLY_LINE : CellType.VTK_LINE;\n\n if (numCellPts === 1) {\n vtkWarningMacro('Building VTK_LINE ', index, ' with only one point, but VTK_LINE needs at least two points. Check the input.');\n }\n\n _nextCellPts += numCellPts + 1;\n });\n pLocs = pLocs.subarray(nLines);\n pTypes = pTypes.subarray(nLines);\n } // polys\n\n\n if (nPolys) {\n var _nextCellPts2 = 0;\n model.polys.getCellSizes().forEach(function (numCellPts, index) {\n pLocs[index] = _nextCellPts2;\n\n switch (numCellPts) {\n case 3:\n pTypes[index] = CellType.VTK_TRIANGLE;\n break;\n\n case 4:\n pTypes[index] = CellType.VTK_QUAD;\n break;\n\n default:\n pTypes[index] = CellType.VTK_POLYGON;\n break;\n }\n\n if (numCellPts < 3) {\n vtkWarningMacro('Building VTK_TRIANGLE ', index, ' with less than three points, but VTK_TRIANGLE needs at least three points. Check the input.');\n }\n\n _nextCellPts2 += numCellPts + 1;\n });\n pLocs += pLocs.subarray(nPolys);\n pTypes += pTypes.subarray(nPolys);\n } // strips\n\n\n if (nStrips) {\n var _nextCellPts3 = 0;\n pTypes.fill(CellType.VTK_TRIANGLE_STRIP, 0, nStrips);\n model.strips.getCellSizes().forEach(function (numCellPts, index) {\n pLocs[index] = _nextCellPts3;\n _nextCellPts3 += numCellPts + 1;\n });\n } // set up the cell types data structure\n\n\n model.cells = vtkCellTypes.newInstance();\n model.cells.setCellTypes(nCells, types, locs);\n };\n /**\n * Create upward links from points to cells that use each point. Enables\n * topologically complex queries.\n */\n\n\n publicAPI.buildLinks = function () {\n var initialSize = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n\n if (model.cells === undefined) {\n publicAPI.buildCells();\n }\n\n model.links = vtkCellLinks.newInstance();\n\n if (initialSize > 0) {\n model.links.allocate(initialSize);\n } else {\n model.links.allocate(publicAPI.getPoints().getNumberOfPoints());\n }\n\n model.links.buildLinks(publicAPI);\n };\n\n publicAPI.getCellType = function (cellId) {\n return model.cells.getCellType(cellId);\n };\n\n publicAPI.getCellPoints = function (cellId) {\n var cellType = publicAPI.getCellType(cellId);\n var cells = null;\n\n switch (cellType) {\n case CellType.VTK_VERTEX:\n case CellType.VTK_POLY_VERTEX:\n cells = model.verts;\n break;\n\n case CellType.VTK_LINE:\n case CellType.VTK_POLY_LINE:\n cells = model.lines;\n break;\n\n case CellType.VTK_TRIANGLE:\n case CellType.VTK_QUAD:\n case CellType.VTK_POLYGON:\n cells = model.polys;\n break;\n\n case CellType.VTK_TRIANGLE_STRIP:\n cells = model.strips;\n break;\n\n default:\n cells = null;\n return {\n type: 0,\n cellPointIds: null\n };\n }\n\n var loc = model.cells.getCellLocation(cellId);\n var cellPointIds = cells.getCell(loc);\n return {\n cellType: cellType,\n cellPointIds: cellPointIds\n };\n };\n\n publicAPI.getPointCells = function (ptId) {\n return model.links.getCells(ptId);\n };\n\n publicAPI.getCellEdgeNeighbors = function (cellId, point1, point2) {\n var link1 = model.links.getLink(point1);\n var link2 = model.links.getLink(point2);\n return link1.cells.filter(function (cell) {\n return cell !== cellId && link2.cells.indexOf(cell) !== -1;\n });\n };\n /**\n * If you know the type of cell, you may provide it to improve performances.\n */\n\n\n publicAPI.getCell = function (cellId) {\n var cellHint = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n var cellInfo = publicAPI.getCellPoints(cellId);\n var cell = cellHint || CELL_FACTORY[cellInfo.cellType].newInstance();\n cell.initialize(publicAPI.getPoints(), cellInfo.cellPointIds);\n return cell;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {// verts: null,\n // lines: null,\n // polys: null,\n // strips: null,\n // cells: null,\n // links: null,\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkPointSet.extend(publicAPI, model, initialValues);\n macro.get(publicAPI, model, ['cells', 'links']);\n macro.setGet(publicAPI, model, ['verts', 'lines', 'polys', 'strips']); // Object specific methods\n\n vtkPolyData(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkPolyData'); // ----------------------------------------------------------------------------\n\nvar vtkPolyData$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { CELL_FACTORY, vtkPolyData$1 as default, extend, newInstance };\n","var POLYDATA_FIELDS = ['verts', 'lines', 'polys', 'strips'];\nvar Constants = {\n POLYDATA_FIELDS: POLYDATA_FIELDS\n};\n\nexport { POLYDATA_FIELDS, Constants as default };\n","import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';\nimport macro from '../../macros.js';\nimport vtkDataArray from '../../Common/Core/DataArray.js';\nimport vtkPolyData from '../../Common/DataModel/PolyData.js';\nimport vtkMatrixBuilder from '../../Common/Core/MatrixBuilder.js';\n\n// vtkCubeSource methods\n// ----------------------------------------------------------------------------\n\nfunction vtkCubeSource(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkCubeSource');\n\n function requestData(inData, outData) {\n var _vtkMatrixBuilder$bui;\n\n if (model.deleted) {\n return;\n }\n\n var polyData = vtkPolyData.newInstance();\n outData[0] = polyData;\n var numberOfPolys = 6;\n var numberOfPoints = 24; // Define points\n\n var points = macro.newTypedArray(model.pointType, numberOfPoints * 3);\n polyData.getPoints().setData(points, 3);\n var normals = macro.newTypedArray(model.pointType, numberOfPoints * 3);\n var normalArray = vtkDataArray.newInstance({\n name: 'Normals',\n values: normals,\n numberOfComponents: 3\n });\n polyData.getPointData().setNormals(normalArray);\n var tcdim = 2;\n\n if (model.generate3DTextureCoordinates === true) {\n tcdim = 3;\n }\n\n var textureCoords = macro.newTypedArray(model.pointType, numberOfPoints * tcdim);\n var tcoords = vtkDataArray.newInstance({\n name: 'TextureCoordinates',\n values: textureCoords,\n numberOfComponents: tcdim\n });\n polyData.getPointData().setTCoords(tcoords);\n var x = [0.0, 0.0, 0.0];\n var n = [0.0, 0.0, 0.0];\n var tc = [0.0, 0.0];\n var pointIndex = 0;\n x[0] = -model.xLength / 2.0;\n n[0] = -1.0;\n n[1] = 0.0;\n n[2] = 0.0;\n\n for (var i = 0; i < 2; i++) {\n x[1] = -model.yLength / 2.0;\n\n for (var j = 0; j < 2; j++) {\n tc[1] = x[1] + 0.5;\n x[2] = -model.zLength / 2.0;\n\n for (var k = 0; k < 2; k++) {\n tc[0] = (x[2] + 0.5) * (1 - 2 * i);\n points[pointIndex * 3] = x[0];\n points[pointIndex * 3 + 1] = x[1];\n points[pointIndex * 3 + 2] = x[2];\n normals[pointIndex * 3] = n[0];\n normals[pointIndex * 3 + 1] = n[1];\n normals[pointIndex * 3 + 2] = n[2];\n\n if (tcdim === 2) {\n textureCoords[pointIndex * tcdim] = tc[0];\n textureCoords[pointIndex * tcdim + 1] = tc[1];\n } else {\n textureCoords[pointIndex * tcdim] = 2 * i - 1;\n textureCoords[pointIndex * tcdim + 1] = 2 * j - 1;\n textureCoords[pointIndex * tcdim + 2] = 2 * k - 1;\n }\n\n pointIndex++;\n x[2] += model.zLength;\n }\n\n x[1] += model.yLength;\n }\n\n x[0] += model.xLength;\n n[0] += 2.0;\n }\n\n x[1] = -model.yLength / 2.0;\n n[1] = -1.0;\n n[0] = 0.0;\n n[2] = 0.0;\n\n for (var _i = 0; _i < 2; _i++) {\n x[0] = -model.xLength / 2.0;\n\n for (var _j = 0; _j < 2; _j++) {\n tc[0] = (x[0] + 0.5) * (2 * _i - 1);\n x[2] = -model.zLength / 2.0;\n\n for (var _k = 0; _k < 2; _k++) {\n tc[1] = (x[2] + 0.5) * -1;\n points[pointIndex * 3] = x[0];\n points[pointIndex * 3 + 1] = x[1];\n points[pointIndex * 3 + 2] = x[2];\n normals[pointIndex * 3] = n[0];\n normals[pointIndex * 3 + 1] = n[1];\n normals[pointIndex * 3 + 2] = n[2];\n\n if (tcdim === 2) {\n textureCoords[pointIndex * tcdim] = tc[0];\n textureCoords[pointIndex * tcdim + 1] = tc[1];\n } else {\n textureCoords[pointIndex * tcdim] = 2 * _j - 1;\n textureCoords[pointIndex * tcdim + 1] = 2 * _i - 1;\n textureCoords[pointIndex * tcdim + 2] = 2 * _k - 1;\n }\n\n pointIndex++;\n x[2] += model.zLength;\n }\n\n x[0] += model.xLength;\n }\n\n x[1] += model.yLength;\n n[1] += 2.0;\n }\n\n x[2] = -model.zLength / 2.0;\n n[2] = -1.0;\n n[0] = 0.0;\n n[1] = 0.0;\n\n for (var _i2 = 0; _i2 < 2; _i2++) {\n x[1] = -model.yLength / 2.0;\n\n for (var _j2 = 0; _j2 < 2; _j2++) {\n tc[1] = x[1] + 0.5;\n x[0] = -model.xLength / 2.0;\n\n for (var _k2 = 0; _k2 < 2; _k2++) {\n tc[0] = (x[0] + 0.5) * (2 * _i2 - 1);\n points[pointIndex * 3] = x[0];\n points[pointIndex * 3 + 1] = x[1];\n points[pointIndex * 3 + 2] = x[2];\n normals[pointIndex * 3] = n[0];\n normals[pointIndex * 3 + 1] = n[1];\n normals[pointIndex * 3 + 2] = n[2];\n\n if (tcdim === 2) {\n textureCoords[pointIndex * tcdim] = tc[0];\n textureCoords[pointIndex * tcdim + 1] = tc[1];\n } else {\n textureCoords[pointIndex * tcdim] = 2 * _k2 - 1;\n textureCoords[pointIndex * tcdim + 1] = 2 * _j2 - 1;\n textureCoords[pointIndex * tcdim + 2] = 2 * _i2 - 1;\n }\n\n pointIndex++;\n x[0] += model.xLength;\n }\n\n x[1] += model.yLength;\n }\n\n x[2] += model.zLength;\n n[2] += 2.0;\n } // Apply rotation to the points coordinates and normals\n\n\n vtkMatrixBuilder.buildFromDegree().rotateX(model.rotations[0]).rotateY(model.rotations[1]).rotateZ(model.rotations[2]).apply(points).apply(normals); // Apply transformation to the points coordinates\n\n (_vtkMatrixBuilder$bui = vtkMatrixBuilder.buildFromRadian()).translate.apply(_vtkMatrixBuilder$bui, _toConsumableArray(model.center)).apply(points); // Define quads\n\n\n var polys = new Uint16Array(numberOfPolys * 5);\n polyData.getPolys().setData(polys, 1);\n var polyIndex = 0;\n polys[polyIndex++] = 4;\n polys[polyIndex++] = 0;\n polys[polyIndex++] = 1;\n polys[polyIndex++] = 3;\n polys[polyIndex++] = 2;\n polys[polyIndex++] = 4;\n polys[polyIndex++] = 4;\n polys[polyIndex++] = 6;\n polys[polyIndex++] = 7;\n polys[polyIndex++] = 5;\n polys[polyIndex++] = 4;\n polys[polyIndex++] = 8;\n polys[polyIndex++] = 10;\n polys[polyIndex++] = 11;\n polys[polyIndex++] = 9;\n polys[polyIndex++] = 4;\n polys[polyIndex++] = 12;\n polys[polyIndex++] = 13;\n polys[polyIndex++] = 15;\n polys[polyIndex++] = 14;\n polys[polyIndex++] = 4;\n polys[polyIndex++] = 16;\n polys[polyIndex++] = 18;\n polys[polyIndex++] = 19;\n polys[polyIndex++] = 17;\n polys[polyIndex++] = 4;\n polys[polyIndex++] = 20;\n polys[polyIndex++] = 21;\n polys[polyIndex++] = 23;\n polys[polyIndex] = 22;\n }\n\n publicAPI.setBounds = function () {\n var boundsArray = [];\n\n if (Array.isArray(arguments.length <= 0 ? undefined : arguments[0])) {\n boundsArray = arguments.length <= 0 ? undefined : arguments[0];\n } else {\n for (var i = 0; i < arguments.length; i++) {\n boundsArray.push(i < 0 || arguments.length <= i ? undefined : arguments[i]);\n }\n }\n\n if (boundsArray.length !== 6) {\n return;\n }\n\n model.xLength = boundsArray[1] - boundsArray[0];\n model.yLength = boundsArray[3] - boundsArray[2];\n model.zLength = boundsArray[5] - boundsArray[4];\n model.center = [(boundsArray[0] + boundsArray[1]) / 2.0, (boundsArray[2] + boundsArray[3]) / 2.0, (boundsArray[4] + boundsArray[5]) / 2.0];\n }; // Expose methods\n\n\n publicAPI.requestData = requestData;\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n xLength: 1.0,\n yLength: 1.0,\n zLength: 1.0,\n center: [0.0, 0.0, 0.0],\n rotations: [0.0, 0.0, 0.0],\n pointType: 'Float64Array',\n generate3DTextureCoordinates: false\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Build VTK API\n\n macro.obj(publicAPI, model);\n macro.setGet(publicAPI, model, ['xLength', 'yLength', 'zLength', 'generate3DTextureCoordinates']);\n macro.setGetArray(publicAPI, model, ['center', 'rotations'], 3);\n macro.algo(publicAPI, model, 0, 1);\n vtkCubeSource(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkCubeSource'); // ----------------------------------------------------------------------------\n\nvar vtkCubeSource$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkCubeSource$1 as default, extend, newInstance };\n","import macro from '../../macros.js';\n\n// vtkAbstractMapper methods\n// ----------------------------------------------------------------------------\n\nfunction vtkAbstractMapper(publicAPI, model) {\n model.classHierarchy.push('vtkAbstractMapper');\n\n publicAPI.update = function () {\n publicAPI.getInputData();\n };\n\n publicAPI.addClippingPlane = function (plane) {\n if (!plane.isA('vtkPlane')) {\n return false;\n }\n\n if (!model.clippingPlanes.includes(plane)) {\n model.clippingPlanes.push(plane);\n publicAPI.modified();\n return true;\n }\n\n return false;\n };\n\n publicAPI.getNumberOfClippingPlanes = function () {\n return model.clippingPlanes.length;\n };\n\n publicAPI.removeAllClippingPlanes = function () {\n if (model.clippingPlanes.length === 0) {\n return false;\n }\n\n model.clippingPlanes.length = 0;\n publicAPI.modified();\n return true;\n };\n\n publicAPI.removeClippingPlane = function (clippingPlane) {\n var i = model.clippingPlanes.indexOf(clippingPlane);\n\n if (i === -1) {\n return false;\n }\n\n model.clippingPlanes.splice(i, 1);\n publicAPI.modified();\n return true;\n };\n\n publicAPI.getClippingPlanes = function () {\n return model.clippingPlanes;\n };\n\n publicAPI.setClippingPlanes = function (planes) {\n if (!planes) {\n return;\n }\n\n if (!Array.isArray(planes)) {\n publicAPI.addClippingPlane(planes);\n } else {\n var nbPlanes = planes.length;\n\n for (var i = 0; i < nbPlanes && i < 6; i++) {\n publicAPI.addClippingPlane(planes[i]);\n }\n }\n };\n\n publicAPI.getClippingPlaneInDataCoords = function (propMatrix, i, hnormal) {\n var clipPlanes = model.clippingPlanes;\n var mat = propMatrix;\n\n if (clipPlanes) {\n var n = clipPlanes.length;\n\n if (i >= 0 && i < n) {\n // Get the plane\n var plane = clipPlanes[i];\n var normal = plane.getNormal();\n var origin = plane.getOrigin(); // Compute the plane equation\n\n var v1 = normal[0];\n var v2 = normal[1];\n var v3 = normal[2];\n var v4 = -(v1 * origin[0] + v2 * origin[1] + v3 * origin[2]); // Transform normal from world to data coords\n\n hnormal[0] = v1 * mat[0] + v2 * mat[4] + v3 * mat[8] + v4 * mat[12];\n hnormal[1] = v1 * mat[1] + v2 * mat[5] + v3 * mat[9] + v4 * mat[13];\n hnormal[2] = v1 * mat[2] + v2 * mat[6] + v3 * mat[10] + v4 * mat[14];\n hnormal[3] = v1 * mat[3] + v2 * mat[7] + v3 * mat[11] + v4 * mat[15];\n return;\n }\n }\n\n macro.vtkErrorMacro(\"Clipping plane index \".concat(i, \" is out of range.\"));\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n clippingPlanes: []\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Object methods\n\n macro.obj(publicAPI, model);\n macro.algo(publicAPI, model, 1, 0);\n\n if (!model.clippingPlanes) {\n model.clippingPlanes = [];\n }\n\n vtkAbstractMapper(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar vtkAbstractMapper$1 = {\n extend: extend\n};\n\nexport { vtkAbstractMapper$1 as default, extend };\n","import macro from '../../macros.js';\nimport vtkAbstractMapper from './AbstractMapper.js';\nimport { u as uninitializeBounds } from '../../Common/Core/Math/index.js';\n\n// vtkAbstractMapper methods\n// ----------------------------------------------------------------------------\n\nfunction vtkAbstractMapper3D(publicAPI, model) {\n publicAPI.getBounds = function () {\n return 0;\n };\n\n publicAPI.getBounds = function (bounds) {\n publicAPI.getBounds();\n\n for (var i = 0; i < 6; i++) {\n bounds[i] = model.bounds[i];\n }\n };\n\n publicAPI.getCenter = function () {\n publicAPI.getBounds();\n\n for (var i = 0; i < 3; i++) {\n model.center[i] = (model.bounds[2 * i + 1] + model.bounds[2 * i]) / 2.0;\n }\n\n return model.center.slice();\n };\n\n publicAPI.getLength = function () {\n var diff = 0.0;\n var l = 0.0;\n publicAPI.getBounds();\n\n for (var i = 0; i < 3; i++) {\n diff = model.bounds[2 * i + 1] - model.bounds[2 * i];\n l += diff * diff;\n }\n\n return Math.sqrt(l);\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n bounds: [1, -1, 1, -1, 1, -1],\n center: [0, 0, 0],\n viewSpecificProperties: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkAbstractMapper.extend(publicAPI, model, initialValues);\n\n if (!model.bounds) {\n uninitializeBounds(model.bounds);\n }\n\n if (!model.center) {\n model.center = [0.0, 0.0, 0.0];\n }\n\n macro.setGet(publicAPI, model, ['viewSpecificProperties']);\n\n if (!model.viewSpecificProperties) {\n model.viewSpecificProperties = {};\n }\n\n vtkAbstractMapper3D(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar vtkAbstractMapper3D$1 = {\n extend: extend\n};\n\nexport { vtkAbstractMapper3D$1 as default, extend };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport { mat4, vec3 } from 'gl-matrix';\nimport macro from '../../macros.js';\nimport vtkBoundingBox from '../../Common/DataModel/BoundingBox.js';\nimport vtkProp3D from './Prop3D.js';\nimport vtkProperty from './Property.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nvar vtkDebugMacro = macro.vtkDebugMacro; // ----------------------------------------------------------------------------\n// vtkActor methods\n// ----------------------------------------------------------------------------\n\nfunction vtkActor(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkActor'); // Capture 'parentClass' api for internal use\n\n var superClass = _objectSpread({}, publicAPI);\n\n publicAPI.getActors = function () {\n return [publicAPI];\n };\n\n publicAPI.getIsOpaque = function () {\n if (model.forceOpaque) {\n return true;\n }\n\n if (model.forceTranslucent) {\n return false;\n } // make sure we have a property\n\n\n if (!model.property) {\n // force creation of a property\n publicAPI.getProperty();\n }\n\n var isOpaque = model.property.getOpacity() >= 1.0; // are we using an opaque texture, if any?\n\n isOpaque = isOpaque && (!model.texture || !model.texture.isTranslucent()); // are we using an opaque scalar array, if any?\n\n isOpaque = isOpaque && (!model.mapper || model.mapper.getIsOpaque());\n return isOpaque;\n };\n\n publicAPI.hasTranslucentPolygonalGeometry = function () {\n if (model.mapper === null) {\n return false;\n } // make sure we have a property\n\n\n if (model.property === null) {\n // force creation of a property\n publicAPI.setProperty(publicAPI.makeProperty());\n } // is this actor opaque ?\n\n\n return !publicAPI.getIsOpaque();\n };\n\n publicAPI.makeProperty = vtkProperty.newInstance;\n\n publicAPI.getProperty = function () {\n if (model.property === null) {\n model.property = publicAPI.makeProperty();\n }\n\n return model.property;\n };\n\n publicAPI.getBounds = function () {\n if (model.mapper === null) {\n return model.bounds;\n } // Check for the special case when the mapper's bounds are unknown\n\n\n var bds = model.mapper.getBounds();\n\n if (!bds || bds.length !== 6) {\n return bds;\n } // Check for the special case when the actor is empty.\n\n\n if (bds[0] > bds[1]) {\n model.mapperBounds = bds.concat(); // copy the mapper's bounds\n\n model.bounds = [1, -1, 1, -1, 1, -1];\n model.boundsMTime.modified();\n return bds;\n } // Check if we have cached values for these bounds - we cache the\n // values returned by model.mapper.getBounds() and we store the time\n // of caching. If the values returned this time are different, or\n // the modified time of this class is newer than the cached time,\n // then we need to rebuild.\n\n\n if (!model.mapperBounds || bds[0] !== model.mapperBounds[0] || bds[1] !== model.mapperBounds[1] || bds[2] !== model.mapperBounds[2] || bds[3] !== model.mapperBounds[3] || bds[4] !== model.mapperBounds[4] || bds[5] !== model.mapperBounds[5] || publicAPI.getMTime() > model.boundsMTime.getMTime()) {\n vtkDebugMacro('Recomputing bounds...');\n model.mapperBounds = bds.concat(); // copy the mapper's bounds\n\n var bbox = [];\n vtkBoundingBox.getCorners(bds, bbox);\n publicAPI.computeMatrix();\n var tmp4 = new Float64Array(16);\n mat4.transpose(tmp4, model.matrix);\n bbox.forEach(function (pt) {\n return vec3.transformMat4(pt, pt, tmp4);\n });\n /* eslint-disable no-multi-assign */\n\n model.bounds[0] = model.bounds[2] = model.bounds[4] = Number.MAX_VALUE;\n model.bounds[1] = model.bounds[3] = model.bounds[5] = -Number.MAX_VALUE;\n /* eslint-enable no-multi-assign */\n\n model.bounds = model.bounds.map(function (d, i) {\n return i % 2 === 0 ? bbox.reduce(function (a, b) {\n return a > b[i / 2] ? b[i / 2] : a;\n }, d) : bbox.reduce(function (a, b) {\n return a < b[(i - 1) / 2] ? b[(i - 1) / 2] : a;\n }, d);\n });\n model.boundsMTime.modified();\n }\n\n return model.bounds;\n };\n\n publicAPI.getMTime = function () {\n var mt = superClass.getMTime();\n\n if (model.property !== null) {\n var time = model.property.getMTime();\n mt = time > mt ? time : mt;\n }\n\n if (model.backfaceProperty !== null) {\n var _time = model.backfaceProperty.getMTime();\n\n mt = _time > mt ? _time : mt;\n }\n\n return mt;\n };\n\n publicAPI.getRedrawMTime = function () {\n var mt = model.mtime;\n\n if (model.mapper !== null) {\n var time = model.mapper.getMTime();\n mt = time > mt ? time : mt;\n\n if (model.mapper.getInput() !== null) {\n // FIXME !!! getInputAlgorithm / getInput\n model.mapper.getInputAlgorithm().update();\n time = model.mapper.getInput().getMTime();\n mt = time > mt ? time : mt;\n }\n }\n\n return mt;\n };\n\n publicAPI.getSupportsSelection = function () {\n return model.mapper ? model.mapper.getSupportsSelection() : false;\n };\n\n publicAPI.processSelectorPixelBuffers = function (selector, pixelOffsets) {\n if (model.mapper && model.mapper.processSelectorPixelBuffers) {\n model.mapper.processSelectorPixelBuffers(selector, pixelOffsets);\n }\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n mapper: null,\n property: null,\n backfaceProperty: null,\n forceOpaque: false,\n forceTranslucent: false,\n bounds: [1, -1, 1, -1, 1, -1]\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkProp3D.extend(publicAPI, model, initialValues); // vtkTimeStamp\n\n model.boundsMTime = {};\n macro.obj(model.boundsMTime); // Build VTK API\n\n macro.set(publicAPI, model, ['property']);\n macro.setGet(publicAPI, model, ['backfaceProperty', 'forceOpaque', 'forceTranslucent', 'mapper']); // Object methods\n\n vtkActor(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkActor'); // ----------------------------------------------------------------------------\n\nvar vtkActor$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkActor$1 as default, extend, newInstance };\n","import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';\nimport { mat4, vec4, vec3, quat } from 'gl-matrix';\nimport macro from '../../macros.js';\nimport { r as radiansFromDegrees, k as add, j as cross } from '../../Common/Core/Math/index.js';\n\nvar vtkDebugMacro = macro.vtkDebugMacro;\n/* eslint-disable new-cap */\n\n/*\n * Convenience function to access elements of a gl-matrix. If it turns\n * out I have rows and columns swapped everywhere, then I'll just change\n * the order of 'row' and 'col' parameters in this function\n */\n// function getMatrixElement(matrix, row, col) {\n// const idx = (row * 4) + col;\n// return matrix[idx];\n// }\n// ----------------------------------------------------------------------------\n// vtkCamera methods\n// ----------------------------------------------------------------------------\n\nfunction vtkCamera(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkCamera'); // Set up private variables and methods\n\n var origin = new Float64Array(3);\n var dopbasis = new Float64Array([0.0, 0.0, -1.0]);\n var upbasis = new Float64Array([0.0, 1.0, 0.0]);\n var tmpMatrix = mat4.identity(new Float64Array(16));\n var tmpMatrix2 = mat4.identity(new Float64Array(16));\n var tmpvec1 = new Float64Array(3);\n var tmpvec2 = new Float64Array(3);\n var tmpvec3 = new Float64Array(3);\n var rotateMatrix = mat4.identity(new Float64Array(16));\n var trans = mat4.identity(new Float64Array(16));\n var newPosition = new Float64Array(3);\n var newFocalPoint = new Float64Array(3); // Internal Functions that don't need to be public\n\n function computeViewPlaneNormal() {\n // VPN is -DOP\n model.viewPlaneNormal[0] = -model.directionOfProjection[0];\n model.viewPlaneNormal[1] = -model.directionOfProjection[1];\n model.viewPlaneNormal[2] = -model.directionOfProjection[2];\n }\n\n publicAPI.orthogonalizeViewUp = function () {\n var vt = publicAPI.getViewMatrix();\n model.viewUp[0] = vt[4];\n model.viewUp[1] = vt[5];\n model.viewUp[2] = vt[6];\n publicAPI.modified();\n };\n\n publicAPI.setPosition = function (x, y, z) {\n if (x === model.position[0] && y === model.position[1] && z === model.position[2]) {\n return;\n }\n\n model.position[0] = x;\n model.position[1] = y;\n model.position[2] = z; // recompute the focal distance\n\n publicAPI.computeDistance();\n publicAPI.modified();\n };\n\n publicAPI.setFocalPoint = function (x, y, z) {\n if (x === model.focalPoint[0] && y === model.focalPoint[1] && z === model.focalPoint[2]) {\n return;\n }\n\n model.focalPoint[0] = x;\n model.focalPoint[1] = y;\n model.focalPoint[2] = z; // recompute the focal distance\n\n publicAPI.computeDistance();\n publicAPI.modified();\n };\n\n publicAPI.setDistance = function (d) {\n if (model.distance === d) {\n return;\n }\n\n model.distance = d;\n\n if (model.distance < 1e-20) {\n model.distance = 1e-20;\n vtkDebugMacro('Distance is set to minimum.');\n } // we want to keep the camera pointing in the same direction\n\n\n var vec = model.directionOfProjection; // recalculate FocalPoint\n\n model.focalPoint[0] = model.position[0] + vec[0] * model.distance;\n model.focalPoint[1] = model.position[1] + vec[1] * model.distance;\n model.focalPoint[2] = model.position[2] + vec[2] * model.distance;\n publicAPI.modified();\n }; //----------------------------------------------------------------------------\n // This method must be called when the focal point or camera position changes\n\n\n publicAPI.computeDistance = function () {\n var dx = model.focalPoint[0] - model.position[0];\n var dy = model.focalPoint[1] - model.position[1];\n var dz = model.focalPoint[2] - model.position[2];\n model.distance = Math.sqrt(dx * dx + dy * dy + dz * dz);\n\n if (model.distance < 1e-20) {\n model.distance = 1e-20;\n vtkDebugMacro('Distance is set to minimum.');\n var vec = model.directionOfProjection; // recalculate FocalPoint\n\n model.focalPoint[0] = model.position[0] + vec[0] * model.distance;\n model.focalPoint[1] = model.position[1] + vec[1] * model.distance;\n model.focalPoint[2] = model.position[2] + vec[2] * model.distance;\n }\n\n model.directionOfProjection[0] = dx / model.distance;\n model.directionOfProjection[1] = dy / model.distance;\n model.directionOfProjection[2] = dz / model.distance;\n computeViewPlaneNormal();\n }; //----------------------------------------------------------------------------\n // Move the position of the camera along the view plane normal. Moving\n // towards the focal point (e.g., > 1) is a dolly-in, moving away\n // from the focal point (e.g., < 1) is a dolly-out.\n\n\n publicAPI.dolly = function (amount) {\n if (amount <= 0.0) {\n return;\n } // dolly moves the camera towards the focus\n\n\n var d = model.distance / amount;\n publicAPI.setPosition(model.focalPoint[0] - d * model.directionOfProjection[0], model.focalPoint[1] - d * model.directionOfProjection[1], model.focalPoint[2] - d * model.directionOfProjection[2]);\n };\n\n publicAPI.roll = function (angle) {\n var eye = model.position;\n var at = model.focalPoint;\n var up = model.viewUp;\n var viewUpVec4 = new Float64Array([up[0], up[1], up[2], 0.0]);\n mat4.identity(rotateMatrix);\n var viewDir = new Float64Array([at[0] - eye[0], at[1] - eye[1], at[2] - eye[2]]);\n mat4.rotate(rotateMatrix, rotateMatrix, radiansFromDegrees(angle), viewDir);\n vec4.transformMat4(viewUpVec4, viewUpVec4, rotateMatrix);\n model.viewUp[0] = viewUpVec4[0];\n model.viewUp[1] = viewUpVec4[1];\n model.viewUp[2] = viewUpVec4[2];\n publicAPI.modified();\n };\n\n publicAPI.azimuth = function (angle) {\n var fp = model.focalPoint;\n mat4.identity(trans); // translate the focal point to the origin,\n // rotate about view up,\n // translate back again\n\n mat4.translate(trans, trans, fp);\n mat4.rotate(trans, trans, radiansFromDegrees(angle), model.viewUp);\n mat4.translate(trans, trans, [-fp[0], -fp[1], -fp[2]]); // apply the transform to the position\n\n vec3.transformMat4(newPosition, model.position, trans);\n publicAPI.setPosition(newPosition[0], newPosition[1], newPosition[2]);\n };\n\n publicAPI.yaw = function (angle) {\n var position = model.position;\n mat4.identity(trans); // translate the camera to the origin,\n // rotate about axis,\n // translate back again\n\n mat4.translate(trans, trans, position);\n mat4.rotate(trans, trans, radiansFromDegrees(angle), model.viewUp);\n mat4.translate(trans, trans, [-position[0], -position[1], -position[2]]); // apply the transform to the position\n\n vec3.transformMat4(newFocalPoint, model.focalPoint, trans);\n publicAPI.setFocalPoint(newFocalPoint[0], newFocalPoint[1], newFocalPoint[2]);\n };\n\n publicAPI.elevation = function (angle) {\n var fp = model.focalPoint; // get the eye / camera position from the viewMatrix\n\n var vt = publicAPI.getViewMatrix();\n var axis = [-vt[0], -vt[1], -vt[2]];\n mat4.identity(trans); // translate the focal point to the origin,\n // rotate about view up,\n // translate back again\n\n mat4.translate(trans, trans, fp);\n mat4.rotate(trans, trans, radiansFromDegrees(angle), axis);\n mat4.translate(trans, trans, [-fp[0], -fp[1], -fp[2]]); // apply the transform to the position\n\n vec3.transformMat4(newPosition, model.position, trans);\n publicAPI.setPosition(newPosition[0], newPosition[1], newPosition[2]);\n };\n\n publicAPI.pitch = function (angle) {\n var position = model.position;\n var vt = publicAPI.getViewMatrix();\n var axis = [vt[0], vt[1], vt[2]];\n mat4.identity(trans); // translate the camera to the origin,\n // rotate about axis,\n // translate back again\n\n mat4.translate(trans, trans, position);\n mat4.rotate(trans, trans, radiansFromDegrees(angle), axis);\n mat4.translate(trans, trans, [-position[0], -position[1], -position[2]]); // apply the transform to the focal point\n\n vec3.transformMat4(newFocalPoint, model.focalPoint, trans);\n publicAPI.setFocalPoint.apply(publicAPI, _toConsumableArray(newFocalPoint));\n };\n\n publicAPI.zoom = function (factor) {\n if (factor <= 0) {\n return;\n }\n\n if (model.parallelProjection) {\n model.parallelScale /= factor;\n } else {\n model.viewAngle /= factor;\n }\n\n publicAPI.modified();\n };\n\n publicAPI.translate = function (x, y, z) {\n var offset = [x, y, z];\n add(model.position, offset, model.position);\n add(model.focalPoint, offset, model.focalPoint);\n publicAPI.computeDistance();\n publicAPI.modified();\n };\n\n publicAPI.applyTransform = function (transformMat4) {\n var vuOld = [].concat(_toConsumableArray(model.viewUp), [1.0]);\n var posNew = [];\n var fpNew = [];\n var vuNew = [];\n vuOld[0] += model.position[0];\n vuOld[1] += model.position[1];\n vuOld[2] += model.position[2];\n vec4.transformMat4(posNew, [].concat(_toConsumableArray(model.position), [1.0]), transformMat4);\n vec4.transformMat4(fpNew, [].concat(_toConsumableArray(model.focalPoint), [1.0]), transformMat4);\n vec4.transformMat4(vuNew, vuOld, transformMat4);\n vuNew[0] -= posNew[0];\n vuNew[1] -= posNew[1];\n vuNew[2] -= posNew[2];\n publicAPI.setPosition.apply(publicAPI, _toConsumableArray(posNew.slice(0, 3)));\n publicAPI.setFocalPoint.apply(publicAPI, _toConsumableArray(fpNew.slice(0, 3)));\n publicAPI.setViewUp.apply(publicAPI, _toConsumableArray(vuNew.slice(0, 3)));\n };\n\n publicAPI.getThickness = function () {\n return model.clippingRange[1] - model.clippingRange[0];\n };\n\n publicAPI.setThickness = function (thickness) {\n var t = thickness;\n\n if (t < 1e-20) {\n t = 1e-20;\n vtkDebugMacro('Thickness is set to minimum.');\n }\n\n publicAPI.setClippingRange(model.clippingRange[0], model.clippingRange[0] + t);\n };\n\n publicAPI.setThicknessFromFocalPoint = function (thickness) {\n var t = thickness;\n\n if (t < 1e-20) {\n t = 1e-20;\n vtkDebugMacro('Thickness is set to minimum.');\n }\n\n publicAPI.setClippingRange(model.distance - t / 2, model.distance + t / 2);\n }; // Unimplemented functions\n\n\n publicAPI.setRoll = function (angle) {}; // dependency on GetOrientation() and a model.ViewTransform object, see https://github.com/Kitware/VTK/blob/master/Common/Transforms/vtkTransform.cxx and https://vtk.org/doc/nightly/html/classvtkTransform.html\n\n\n publicAPI.getRoll = function () {};\n\n publicAPI.setObliqueAngles = function (alpha, beta) {};\n\n publicAPI.getOrientation = function () {};\n\n publicAPI.getOrientationWXYZ = function () {};\n\n publicAPI.getFrustumPlanes = function (aspect) {// Return array of 24 params (4 params for each of 6 plane equations)\n };\n\n publicAPI.getCameraLightTransformMatrix = function (matrix) {\n mat4.copy(matrix, model.cameraLightTransform);\n return matrix;\n };\n\n publicAPI.computeCameraLightTransform = function () {\n // not sure if this is the correct transformation, based on the same funciton in VTK\n mat4.copy(tmpMatrix, publicAPI.getViewMatrix());\n mat4.invert(tmpMatrix, tmpMatrix);\n mat4.fromScaling(tmpMatrix2, [model.distance, model.distance, model.distance]);\n mat4.multiply(tmpMatrix, tmpMatrix, tmpMatrix2);\n mat4.identity(model.cameraLightTransform);\n mat4.translate(model.cameraLightTransform, tmpMatrix, [0.0, 0.0, -1.0]);\n };\n\n publicAPI.deepCopy = function (sourceCamera) {};\n\n publicAPI.physicalOrientationToWorldDirection = function (ori) {\n // push the x axis through the orientation quat\n var oriq = quat.fromValues(ori[0], ori[1], ori[2], ori[3]);\n var coriq = quat.create();\n var qdir = quat.fromValues(0.0, 0.0, 1.0, 0.0);\n quat.conjugate(coriq, oriq); // rotate the z axis by the quat\n\n quat.multiply(qdir, oriq, qdir);\n quat.multiply(qdir, qdir, coriq); // return the z axis in world coords\n\n return [qdir[0], qdir[1], qdir[2]];\n };\n\n publicAPI.getPhysicalToWorldMatrix = function (result) {\n publicAPI.getWorldToPhysicalMatrix(result);\n mat4.invert(result, result);\n };\n\n publicAPI.getWorldToPhysicalMatrix = function (result) {\n mat4.identity(result); // now the physical to vtk world rotation tform\n\n var physVRight = [3];\n cross(model.physicalViewNorth, model.physicalViewUp, physVRight);\n result[0] = physVRight[0];\n result[1] = physVRight[1];\n result[2] = physVRight[2];\n result[4] = model.physicalViewUp[0];\n result[5] = model.physicalViewUp[1];\n result[6] = model.physicalViewUp[2];\n result[8] = -model.physicalViewNorth[0];\n result[9] = -model.physicalViewNorth[1];\n result[10] = -model.physicalViewNorth[2];\n mat4.transpose(result, result);\n vec3.set(tmpvec1, 1 / model.physicalScale, 1 / model.physicalScale, 1 / model.physicalScale);\n mat4.scale(result, result, tmpvec1);\n mat4.translate(result, result, model.physicalTranslation);\n };\n\n publicAPI.computeViewParametersFromViewMatrix = function (vmat) {\n // invert to get view to world\n mat4.invert(tmpMatrix, vmat); // note with glmatrix operations happen in\n // the reverse order\n // mat.scale\n // mat.translate\n // will result in the translation then the scale\n // mat.mult(a,b)\n // results in perform the B transformation then A\n // then extract the params position, orientation\n // push 0,0,0 through to get a translation\n\n vec3.transformMat4(tmpvec1, origin, tmpMatrix);\n publicAPI.computeDistance();\n var oldDist = model.distance;\n publicAPI.setPosition(tmpvec1[0], tmpvec1[1], tmpvec1[2]); // push basis vectors to get orientation\n\n vec3.transformMat4(tmpvec2, dopbasis, tmpMatrix);\n vec3.subtract(tmpvec2, tmpvec2, tmpvec1);\n vec3.normalize(tmpvec2, tmpvec2);\n publicAPI.setDirectionOfProjection(tmpvec2[0], tmpvec2[1], tmpvec2[2]);\n vec3.transformMat4(tmpvec3, upbasis, tmpMatrix);\n vec3.subtract(tmpvec3, tmpvec3, tmpvec1);\n vec3.normalize(tmpvec3, tmpvec3);\n publicAPI.setViewUp(tmpvec3[0], tmpvec3[1], tmpvec3[2]);\n publicAPI.setDistance(oldDist);\n }; // the provided matrix should include\n // translation and orientation only\n // mat is physical to view\n\n\n publicAPI.computeViewParametersFromPhysicalMatrix = function (mat) {\n // get the WorldToPhysicalMatrix\n publicAPI.getWorldToPhysicalMatrix(tmpMatrix); // first convert the physical -> view matrix to be\n // world -> view\n\n mat4.multiply(tmpMatrix, mat, tmpMatrix);\n publicAPI.computeViewParametersFromViewMatrix(tmpMatrix);\n };\n\n publicAPI.setViewMatrix = function (mat) {\n model.viewMatrix = mat;\n\n if (model.viewMatrix) {\n mat4.copy(tmpMatrix, model.viewMatrix);\n publicAPI.computeViewParametersFromViewMatrix(tmpMatrix);\n mat4.transpose(model.viewMatrix, model.viewMatrix);\n }\n };\n\n publicAPI.getViewMatrix = function () {\n if (model.viewMatrix) {\n return model.viewMatrix;\n }\n\n mat4.lookAt(tmpMatrix, model.position, // eye\n model.focalPoint, // at\n model.viewUp // up\n );\n mat4.transpose(tmpMatrix, tmpMatrix);\n var result = new Float64Array(16);\n mat4.copy(result, tmpMatrix);\n return result;\n };\n\n publicAPI.setProjectionMatrix = function (mat) {\n model.projectionMatrix = mat;\n };\n\n publicAPI.getProjectionMatrix = function (aspect, nearz, farz) {\n var result = new Float64Array(16);\n mat4.identity(result);\n\n if (model.projectionMatrix) {\n var scale = 1 / model.physicalScale;\n vec3.set(tmpvec1, scale, scale, scale);\n mat4.copy(result, model.projectionMatrix);\n mat4.scale(result, result, tmpvec1);\n mat4.transpose(result, result);\n return result;\n }\n\n mat4.identity(tmpMatrix); // FIXME: Not sure what to do about adjust z buffer here\n // adjust Z-buffer range\n // this->ProjectionTransform->AdjustZBuffer( -1, +1, nearz, farz );\n\n var cWidth = model.clippingRange[1] - model.clippingRange[0];\n var cRange = [model.clippingRange[0] + (nearz + 1) * cWidth / 2.0, model.clippingRange[0] + (farz + 1) * cWidth / 2.0];\n\n if (model.parallelProjection) {\n // set up a rectangular parallelipiped\n var width = model.parallelScale * aspect;\n var height = model.parallelScale;\n var xmin = (model.windowCenter[0] - 1.0) * width;\n var xmax = (model.windowCenter[0] + 1.0) * width;\n var ymin = (model.windowCenter[1] - 1.0) * height;\n var ymax = (model.windowCenter[1] + 1.0) * height;\n mat4.ortho(tmpMatrix, xmin, xmax, ymin, ymax, cRange[0], cRange[1]);\n mat4.transpose(tmpMatrix, tmpMatrix);\n } else if (model.useOffAxisProjection) {\n throw new Error('Off-Axis projection is not supported at this time');\n } else {\n var tmp = Math.tan(radiansFromDegrees(model.viewAngle) / 2.0);\n\n var _width;\n\n var _height;\n\n if (model.useHorizontalViewAngle === true) {\n _width = model.clippingRange[0] * tmp;\n _height = model.clippingRange[0] * tmp / aspect;\n } else {\n _width = model.clippingRange[0] * tmp * aspect;\n _height = model.clippingRange[0] * tmp;\n }\n\n var _xmin = (model.windowCenter[0] - 1.0) * _width;\n\n var _xmax = (model.windowCenter[0] + 1.0) * _width;\n\n var _ymin = (model.windowCenter[1] - 1.0) * _height;\n\n var _ymax = (model.windowCenter[1] + 1.0) * _height;\n\n var znear = cRange[0];\n var zfar = cRange[1];\n tmpMatrix[0] = 2.0 * znear / (_xmax - _xmin);\n tmpMatrix[5] = 2.0 * znear / (_ymax - _ymin);\n tmpMatrix[2] = (_xmin + _xmax) / (_xmax - _xmin);\n tmpMatrix[6] = (_ymin + _ymax) / (_ymax - _ymin);\n tmpMatrix[10] = -(znear + zfar) / (zfar - znear);\n tmpMatrix[14] = -1.0;\n tmpMatrix[11] = -2.0 * znear * zfar / (zfar - znear);\n tmpMatrix[15] = 0.0;\n }\n\n mat4.copy(result, tmpMatrix);\n return result;\n };\n\n publicAPI.getCompositeProjectionMatrix = function (aspect, nearz, farz) {\n var vMat = publicAPI.getViewMatrix();\n var pMat = publicAPI.getProjectionMatrix(aspect, nearz, farz); // mats are transposed so the order is A then B\n // we reuse pMat as it is a copy so we can do what we want with it\n\n mat4.multiply(pMat, vMat, pMat);\n return pMat;\n };\n\n publicAPI.setDirectionOfProjection = function (x, y, z) {\n if (model.directionOfProjection[0] === x && model.directionOfProjection[1] === y && model.directionOfProjection[2] === z) {\n return;\n }\n\n model.directionOfProjection[0] = x;\n model.directionOfProjection[1] = y;\n model.directionOfProjection[2] = z;\n var vec = model.directionOfProjection; // recalculate FocalPoint\n\n model.focalPoint[0] = model.position[0] + vec[0] * model.distance;\n model.focalPoint[1] = model.position[1] + vec[1] * model.distance;\n model.focalPoint[2] = model.position[2] + vec[2] * model.distance;\n computeViewPlaneNormal();\n }; // used to handle convert js device orientation angles\n // when you use this method the camera will adjust to the\n // device orientation such that the physicalViewUp you set\n // in world coordinates looks up, and the physicalViewNorth\n // you set in world coorindates will (maybe) point north\n //\n // NOTE WARNING - much of the documentation out there on how\n // orientation works is seriously wrong. Even worse the Chrome\n // device orientation simulator is completely wrong and should\n // never be used. OMG it is so messed up.\n //\n // how it seems to work on iOS is that the device orientation\n // is specified in extrinsic angles with a alpha, beta, gamma\n // convention with axes of Z, X, Y (the code below substitutes\n // the physical coordinate system for these axes to get the right\n // modified coordinate system.\n\n\n publicAPI.setDeviceAngles = function (alpha, beta, gamma, screen) {\n var physVRight = [3];\n cross(model.physicalViewNorth, model.physicalViewUp, physVRight); // phone to physical coordinates\n\n var rotmat = mat4.identity(new Float64Array(16));\n mat4.rotate(rotmat, rotmat, radiansFromDegrees(alpha), model.physicalViewUp);\n mat4.rotate(rotmat, rotmat, radiansFromDegrees(beta), physVRight);\n mat4.rotate(rotmat, rotmat, radiansFromDegrees(gamma), model.physicalViewNorth);\n mat4.rotate(rotmat, rotmat, radiansFromDegrees(-screen), model.physicalViewUp);\n var dop = new Float64Array([-model.physicalViewUp[0], -model.physicalViewUp[1], -model.physicalViewUp[2]]);\n var vup = new Float64Array(model.physicalViewNorth);\n vec3.transformMat4(dop, dop, rotmat);\n vec3.transformMat4(vup, vup, rotmat);\n publicAPI.setDirectionOfProjection(dop[0], dop[1], dop[2]);\n publicAPI.setViewUp(vup[0], vup[1], vup[2]);\n publicAPI.modified();\n };\n\n publicAPI.setOrientationWXYZ = function (degrees, x, y, z) {\n var quatMat = mat4.identity(new Float64Array(16));\n\n if (degrees !== 0.0 && (x !== 0.0 || y !== 0.0 || z !== 0.0)) {\n // convert to radians\n var angle = radiansFromDegrees(degrees);\n var q = quat.create();\n quat.setAxisAngle(q, [x, y, z], angle);\n mat4.fromQuat(quatMat, q);\n }\n\n var newdop = new Float64Array(3);\n vec3.transformMat4(newdop, [0.0, 0.0, -1.0], quatMat);\n var newvup = new Float64Array(3);\n vec3.transformMat4(newvup, [0.0, 1.0, 0.0], quatMat);\n publicAPI.setDirectionOfProjection.apply(publicAPI, _toConsumableArray(newdop));\n publicAPI.setViewUp.apply(publicAPI, _toConsumableArray(newvup));\n publicAPI.modified();\n };\n\n publicAPI.computeClippingRange = function (bounds) {\n var vn = null;\n var position = null;\n vn = model.viewPlaneNormal;\n position = model.position;\n var a = -vn[0];\n var b = -vn[1];\n var c = -vn[2];\n var d = -(a * position[0] + b * position[1] + c * position[2]); // Set the max near clipping plane and the min far clipping plane\n\n var range = [a * bounds[0] + b * bounds[2] + c * bounds[4] + d, 1e-18]; // Find the closest / farthest bounding box vertex\n\n for (var k = 0; k < 2; k++) {\n for (var j = 0; j < 2; j++) {\n for (var i = 0; i < 2; i++) {\n var dist = a * bounds[i] + b * bounds[2 + j] + c * bounds[4 + k] + d;\n range[0] = dist < range[0] ? dist : range[0];\n range[1] = dist > range[1] ? dist : range[1];\n }\n }\n }\n\n return range;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n position: [0, 0, 1],\n focalPoint: [0, 0, 0],\n viewUp: [0, 1, 0],\n directionOfProjection: [0, 0, -1],\n parallelProjection: false,\n useHorizontalViewAngle: false,\n viewAngle: 30,\n parallelScale: 1,\n clippingRange: [0.01, 1000.01],\n windowCenter: [0, 0],\n viewPlaneNormal: [0, 0, 1],\n useOffAxisProjection: false,\n screenBottomLeft: [-0.5, -0.5, -0.5],\n screenBottomRight: [0.5, -0.5, -0.5],\n screenTopRight: [0.5, 0.5, -0.5],\n freezeFocalPoint: false,\n projectionMatrix: null,\n viewMatrix: null,\n cameraLightTransform: mat4.create(),\n // used for world to physical transformations\n physicalTranslation: [0, 0, 0],\n physicalScale: 1.0,\n physicalViewUp: [0, 1, 0],\n physicalViewNorth: [0, 0, -1]\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Build VTK API\n\n macro.obj(publicAPI, model);\n macro.get(publicAPI, model, ['distance']);\n macro.setGet(publicAPI, model, ['parallelProjection', 'useHorizontalViewAngle', 'viewAngle', 'parallelScale', 'useOffAxisProjection', 'freezeFocalPoint', 'physicalScale']);\n macro.getArray(publicAPI, model, ['directionOfProjection', 'viewPlaneNormal', 'position', 'focalPoint']);\n macro.setGetArray(publicAPI, model, ['clippingRange', 'windowCenter'], 2);\n macro.setGetArray(publicAPI, model, ['viewUp', 'screenBottomLeft', 'screenBottomRight', 'screenTopRight', 'physicalTranslation', 'physicalViewUp', 'physicalViewNorth'], 3); // Object methods\n\n vtkCamera(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkCamera'); // ----------------------------------------------------------------------------\n\nvar vtkCamera$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { DEFAULT_VALUES, vtkCamera$1 as default, extend, newInstance };\n","var ColorSpace = {\n RGB: 0,\n HSV: 1,\n LAB: 2,\n DIVERGING: 3\n};\nvar Scale = {\n LINEAR: 0,\n LOG10: 1\n};\nvar Constants = {\n ColorSpace: ColorSpace,\n Scale: Scale\n};\n\nexport { ColorSpace, Scale, Constants as default };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport macro from '../../macros.js';\nimport { h as hsv2rgb, i as isNan, F as isInf, G as rgb2hsv, H as rgb2lab, I as lab2rgb, J as floor } from '../../Common/Core/Math/index.js';\nimport vtkScalarsToColors from '../../Common/Core/ScalarsToColors.js';\nimport Constants from './ColorTransferFunction/Constants.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nvar ColorSpace = Constants.ColorSpace,\n Scale = Constants.Scale;\nvar ScalarMappingTarget = vtkScalarsToColors.ScalarMappingTarget;\nvar vtkDebugMacro = macro.vtkDebugMacro,\n vtkErrorMacro = macro.vtkErrorMacro,\n vtkWarningMacro = macro.vtkWarningMacro; // ----------------------------------------------------------------------------\n// Global methods\n// ----------------------------------------------------------------------------\n\n/* eslint-disable no-continue */\n// Convert to and from a special polar version of CIELAB (useful for creating\n// continuous diverging color maps).\n\nfunction vtkColorTransferFunctionLabToMsh(lab, msh) {\n var L = lab[0];\n var a = lab[1];\n var b = lab[2];\n var M = Math.sqrt(L * L + a * a + b * b);\n var s = M > 0.001 ? Math.acos(L / M) : 0.0;\n var h = s > 0.001 ? Math.atan2(b, a) : 0.0;\n msh[0] = M;\n msh[1] = s;\n msh[2] = h;\n}\n\nfunction vtkColorTransferFunctionMshToLab(msh, lab) {\n var M = msh[0];\n var s = msh[1];\n var h = msh[2];\n lab[0] = M * Math.cos(s);\n lab[1] = M * Math.sin(s) * Math.cos(h);\n lab[2] = M * Math.sin(s) * Math.sin(h);\n} // For the case when interpolating from a saturated color to an unsaturated\n// color, find a hue for the unsaturated color that makes sense.\n\n\nfunction vtkColorTransferFunctionAdjustHue(msh, unsatM) {\n if (msh[0] >= unsatM - 0.1) {\n // The best we can do is hold hue constant.\n return msh[2];\n } // This equation is designed to make the perceptual change of the\n // interpolation to be close to constant.\n\n\n var hueSpin = msh[1] * Math.sqrt(unsatM * unsatM - msh[0] * msh[0]) / (msh[0] * Math.sin(msh[1])); // Spin hue away from 0 except in purple hues.\n\n if (msh[2] > -0.3 * Math.PI) {\n return msh[2] + hueSpin;\n }\n\n return msh[2] - hueSpin;\n}\n\nfunction vtkColorTransferFunctionAngleDiff(a1, a2) {\n var adiff = a1 - a2;\n\n if (adiff < 0.0) {\n adiff = -adiff;\n }\n\n while (adiff >= 2.0 * Math.PI) {\n adiff -= 2.0 * Math.PI;\n }\n\n if (adiff > Math.PI) {\n adiff = 2.0 * Math.PI - adiff;\n }\n\n return adiff;\n} // Interpolate a diverging color map.\n\n\nfunction vtkColorTransferFunctionInterpolateDiverging(s, rgb1, rgb2, result) {\n var lab1 = [];\n var lab2 = [];\n rgb2lab(rgb1, lab1);\n rgb2lab(rgb2, lab2);\n var msh1 = [];\n var msh2 = [];\n vtkColorTransferFunctionLabToMsh(lab1, msh1);\n vtkColorTransferFunctionLabToMsh(lab2, msh2); // If the endpoints are distinct saturated colors, then place white in between\n // them.\n\n var localS = s;\n\n if (msh1[1] > 0.05 && msh2[1] > 0.05 && vtkColorTransferFunctionAngleDiff(msh1[2], msh2[2]) > 0.33 * Math.PI) {\n // Insert the white midpoint by setting one end to white and adjusting the\n // scalar value.\n var Mmid = Math.max(msh1[0], msh2[0]);\n Mmid = Math.max(88.0, Mmid);\n\n if (s < 0.5) {\n msh2[0] = Mmid;\n msh2[1] = 0.0;\n msh2[2] = 0.0;\n localS *= 2.0;\n } else {\n msh1[0] = Mmid;\n msh1[1] = 0.0;\n msh1[2] = 0.0;\n localS = 2.0 * localS - 1.0;\n }\n } // If one color has no saturation, then its hue value is invalid. In this\n // case, we want to set it to something logical so that the interpolation of\n // hue makes sense.\n\n\n if (msh1[1] < 0.05 && msh2[1] > 0.05) {\n msh1[2] = vtkColorTransferFunctionAdjustHue(msh2, msh1[0]);\n } else if (msh2[1] < 0.05 && msh1[1] > 0.05) {\n msh2[2] = vtkColorTransferFunctionAdjustHue(msh1, msh2[0]);\n }\n\n var mshTmp = [];\n mshTmp[0] = (1 - localS) * msh1[0] + localS * msh2[0];\n mshTmp[1] = (1 - localS) * msh1[1] + localS * msh2[1];\n mshTmp[2] = (1 - localS) * msh1[2] + localS * msh2[2]; // Now convert back to RGB\n\n var labTmp = [];\n vtkColorTransferFunctionMshToLab(mshTmp, labTmp);\n lab2rgb(labTmp, result);\n} // ----------------------------------------------------------------------------\n// vtkColorTransferFunction methods\n// ----------------------------------------------------------------------------\n\n\nfunction vtkColorTransferFunction(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkColorTransferFunction'); // Return the number of points which specify this function\n\n publicAPI.getSize = function () {\n return model.nodes.length;\n }; //----------------------------------------------------------------------------\n // Add a point defined in RGB\n\n\n publicAPI.addRGBPoint = function (x, r, g, b) {\n return publicAPI.addRGBPointLong(x, r, g, b, 0.5, 0.0);\n }; //----------------------------------------------------------------------------\n // Add a point defined in RGB\n\n\n publicAPI.addRGBPointLong = function (x, r, g, b) {\n var midpoint = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0.5;\n var sharpness = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0.0;\n\n // Error check\n if (midpoint < 0.0 || midpoint > 1.0) {\n vtkErrorMacro('Midpoint outside range [0.0, 1.0]');\n return -1;\n }\n\n if (sharpness < 0.0 || sharpness > 1.0) {\n vtkErrorMacro('Sharpness outside range [0.0, 1.0]');\n return -1;\n } // remove any node already at this X location\n\n\n if (!model.allowDuplicateScalars) {\n publicAPI.removePoint(x);\n } // Create the new node\n\n\n var node = {\n x: x,\n r: r,\n g: g,\n b: b,\n midpoint: midpoint,\n sharpness: sharpness\n }; // Add it, then sort to get everything in order\n\n model.nodes.push(node);\n publicAPI.sortAndUpdateRange(); // We need to find the index of the node we just added in order\n // to return this value\n\n var i = 0;\n\n for (; i < model.nodes.length; i++) {\n if (model.nodes[i].x === x) {\n break;\n }\n } // If we didn't find it, something went horribly wrong so\n // return -1\n\n\n if (i < model.nodes.length) {\n return i;\n }\n\n return -1;\n }; //----------------------------------------------------------------------------\n // Add a point defined in HSV\n\n\n publicAPI.addHSVPoint = function (x, h, s, v) {\n return publicAPI.addHSVPointLong(x, h, s, v, 0.5, 0.0);\n }; //----------------------------------------------------------------------------\n // Add a point defined in HSV\n\n\n publicAPI.addHSVPointLong = function (x, h, s, v) {\n var midpoint = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0.5;\n var sharpness = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0.0;\n var rgb = [];\n var hsv = [h, s, v];\n hsv2rgb(hsv, rgb);\n return publicAPI.addRGBPoint(x, rgb[0], rgb[1], rgb[2], midpoint, sharpness);\n }; //----------------------------------------------------------------------------\n // Set nodes directly\n\n\n publicAPI.setNodes = function (nodes) {\n if (model.nodes !== nodes) {\n var before = JSON.stringify(model.nodes);\n model.nodes = nodes;\n var after = JSON.stringify(model.nodes);\n\n if (publicAPI.sortAndUpdateRange() || before !== after) {\n publicAPI.modified();\n return true;\n }\n }\n\n return false;\n }; //----------------------------------------------------------------------------\n // Sort the vector in increasing order, then fill in\n // the Range\n\n\n publicAPI.sortAndUpdateRange = function () {\n var before = JSON.stringify(model.nodes);\n model.nodes.sort(function (a, b) {\n return a.x - b.x;\n });\n var after = JSON.stringify(model.nodes);\n var modifiedInvoked = publicAPI.updateRange(); // If range is updated, Modified() has been called, don't call it again.\n\n if (!modifiedInvoked && before !== after) {\n publicAPI.modified();\n return true;\n }\n\n return modifiedInvoked;\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.updateRange = function () {\n var oldRange = [2];\n oldRange[0] = model.mappingRange[0];\n oldRange[1] = model.mappingRange[1];\n var size = model.nodes.length;\n\n if (size) {\n model.mappingRange[0] = model.nodes[0].x;\n model.mappingRange[1] = model.nodes[size - 1].x;\n } else {\n model.mappingRange[0] = 0;\n model.mappingRange[1] = 0;\n } // If the range is the same, then no need to call Modified()\n\n\n if (oldRange[0] === model.mappingRange[0] && oldRange[1] === model.mappingRange[1]) {\n return false;\n }\n\n publicAPI.modified();\n return true;\n }; //----------------------------------------------------------------------------\n // Remove a point\n\n\n publicAPI.removePoint = function (x) {\n // First find the node since we need to know its\n // index as our return value\n var i = 0;\n\n for (; i < model.nodes.length; i++) {\n if (model.nodes[i].x === x) {\n break;\n }\n }\n\n var retVal = i; // If the node doesn't exist, we return -1\n\n if (i >= model.nodes.length) {\n return -1;\n } // If the first or last point has been removed, then we update the range\n // No need to sort here as the order of points hasn't changed.\n\n\n var modifiedInvoked = false;\n model.nodes.splice(i, 1);\n\n if (i === 0 || i === model.nodes.length) {\n modifiedInvoked = publicAPI.updateRange();\n }\n\n if (!modifiedInvoked) {\n publicAPI.modified();\n }\n\n return retVal;\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.movePoint = function (oldX, newX) {\n if (oldX === newX) {\n // Nothing to do.\n return;\n }\n\n publicAPI.removePoint(newX);\n\n for (var i = 0; i < model.nodes.length; i++) {\n if (model.nodes[i].x === oldX) {\n model.nodes[i].x = newX;\n publicAPI.sortAndUpdateRange();\n break;\n }\n }\n }; //----------------------------------------------------------------------------\n // Remove all points\n\n\n publicAPI.removeAllPoints = function () {\n model.nodes = [];\n publicAPI.sortAndUpdateRange();\n }; //----------------------------------------------------------------------------\n // Add a line defined in RGB\n\n\n publicAPI.addRGBSegment = function (x1, r1, g1, b1, x2, r2, g2, b2) {\n // First, find all points in this range and remove them\n publicAPI.sortAndUpdateRange();\n\n for (var i = 0; i < model.nodes.length;) {\n if (model.nodes[i].x >= x1 && model.nodes[i].x <= x2) {\n model.nodes.splice(i, 1);\n } else {\n i++;\n }\n } // Now add the points\n\n\n publicAPI.addRGBPointLong(x1, r1, g1, b1, 0.5, 0.0);\n publicAPI.addRGBPointLong(x2, r2, g2, b2, 0.5, 0.0);\n publicAPI.modified();\n }; //----------------------------------------------------------------------------\n // Add a line defined in HSV\n\n\n publicAPI.addHSVSegment = function (x1, h1, s1, v1, x2, h2, s2, v2) {\n var hsv1 = [h1, s1, v1];\n var hsv2 = [h2, s2, v2];\n var rgb1 = [];\n var rgb2 = [];\n hsv2rgb(hsv1, rgb1);\n hsv2rgb(hsv2, rgb2);\n publicAPI.addRGBSegment(x1, rgb1[0], rgb1[1], rgb1[2], x2, rgb2[0], rgb2[1], rgb2[2]);\n }; //----------------------------------------------------------------------------\n // Returns the RGBA color evaluated at the specified location\n\n\n publicAPI.mapValue = function (x) {\n var rgb = [];\n publicAPI.getColor(x, rgb);\n return [Math.floor(255.0 * rgb[0] + 0.5), Math.floor(255.0 * rgb[1] + 0.5), Math.floor(255.0 * rgb[2] + 0.5), 255];\n }; //----------------------------------------------------------------------------\n // Returns the RGB color evaluated at the specified location\n\n\n publicAPI.getColor = function (x, rgb) {\n if (model.indexedLookup) {\n var numNodes = publicAPI.getSize(); // todo\n\n var idx = publicAPI.getAnnotatedValueIndexInternal(x);\n\n if (idx < 0 || numNodes === 0) {\n publicAPI.getNanColor(rgb);\n } else {\n var nodeVal = [];\n publicAPI.getNodeValue(idx % numNodes, nodeVal);\n rgb[0] = nodeVal.r;\n rgb[1] = nodeVal.g;\n rgb[2] = nodeVal.b;\n }\n\n return;\n }\n\n publicAPI.getTable(x, x, 1, rgb);\n }; //----------------------------------------------------------------------------\n // Returns the red color evaluated at the specified location\n\n\n publicAPI.getRedValue = function (x) {\n var rgb = [];\n publicAPI.getColor(x, rgb);\n return rgb[0];\n }; //----------------------------------------------------------------------------\n // Returns the green color evaluated at the specified location\n\n\n publicAPI.getGreenValue = function (x) {\n var rgb = [];\n publicAPI.getColor(x, rgb);\n return rgb[1];\n }; //----------------------------------------------------------------------------\n // Returns the blue color evaluated at the specified location\n\n\n publicAPI.getBlueValue = function (x) {\n var rgb = [];\n publicAPI.getColor(x, rgb);\n return rgb[2];\n }; //----------------------------------------------------------------------------\n // Returns a table of RGB colors at regular intervals along the function\n\n\n publicAPI.getTable = function (xStart_, xEnd_, size, table) {\n // To handle BigInt limitation\n var xStart = Number(xStart_);\n var xEnd = Number(xEnd_); // Special case: If either the start or end is a NaN, then all any\n // interpolation done on them is also a NaN. Therefore, fill the table with\n // the NaN color.\n\n if (isNan(xStart) || isNan(xEnd)) {\n for (var i = 0; i < size; i++) {\n table[i * 3 + 0] = model.nanColor[0];\n table[i * 3 + 1] = model.nanColor[1];\n table[i * 3 + 2] = model.nanColor[2];\n }\n\n return;\n }\n\n var idx = 0;\n var numNodes = model.nodes.length; // Need to keep track of the last value so that\n // we can fill in table locations past this with\n // this value if Clamping is On.\n\n var lastR = 0.0;\n var lastG = 0.0;\n var lastB = 0.0;\n\n if (numNodes !== 0) {\n lastR = model.nodes[numNodes - 1].r;\n lastG = model.nodes[numNodes - 1].g;\n lastB = model.nodes[numNodes - 1].b;\n }\n\n var x = 0.0;\n var x1 = 0.0;\n var x2 = 0.0;\n var rgb1 = [0.0, 0.0, 0.0];\n var rgb2 = [0.0, 0.0, 0.0];\n var midpoint = 0.0;\n var sharpness = 0.0;\n var tmpVec = []; // If the scale is logarithmic, make sure the range is valid.\n\n var usingLogScale = model.scale === Scale.LOG10;\n\n if (usingLogScale) {\n // Note: This requires range[0] <= range[1].\n usingLogScale = model.mappingRange[0] > 0.0;\n }\n\n var logStart = 0.0;\n var logEnd = 0.0;\n var logX = 0.0;\n\n if (usingLogScale) {\n logStart = Math.log10(xStart);\n logEnd = Math.log10(xEnd);\n } // For each table entry\n\n\n for (var _i = 0; _i < size; _i++) {\n // Find our location in the table\n var tidx = 3 * _i; // Find our X location. If we are taking only 1 sample, make\n // it halfway between start and end (usually start and end will\n // be the same in this case)\n\n if (size > 1) {\n if (usingLogScale) {\n logX = logStart + _i / (size - 1.0) * (logEnd - logStart);\n x = Math.pow(10.0, logX);\n } else {\n x = xStart + _i / (size - 1.0) * (xEnd - xStart);\n }\n } else if (usingLogScale) {\n logX = 0.5 * (logStart + logEnd);\n x = Math.pow(10.0, logX);\n } else {\n x = 0.5 * (xStart + xEnd);\n } // Linearly map x from mappingRange to [0, numberOfValues-1],\n // discretize (round down to the closest integer),\n // then map back to mappingRange\n\n\n if (model.discretize) {\n var range = model.mappingRange;\n\n if (x >= range[0] && x <= range[1]) {\n var numberOfValues = model.numberOfValues;\n var deltaRange = range[1] - range[0];\n\n if (numberOfValues <= 1) {\n x = range[0] + deltaRange / 2.0;\n } else {\n // normalize x\n var xn = (x - range[0]) / deltaRange; // discretize\n\n var discretizeIndex = floor(numberOfValues * xn); // get discretized x\n\n x = range[0] + discretizeIndex / (numberOfValues - 1) * deltaRange;\n }\n }\n } // Do we need to move to the next node?\n\n\n while (idx < numNodes && x > model.nodes[idx].x) {\n idx++; // If we are at a valid point index, fill in\n // the value at this node, and the one before (the\n // two that surround our current sample location)\n // idx cannot be 0 since we just incremented it.\n\n if (idx < numNodes) {\n x1 = model.nodes[idx - 1].x;\n x2 = model.nodes[idx].x;\n\n if (usingLogScale) {\n x1 = Math.log10(x1);\n x2 = Math.log10(x2);\n }\n\n rgb1[0] = model.nodes[idx - 1].r;\n rgb2[0] = model.nodes[idx].r;\n rgb1[1] = model.nodes[idx - 1].g;\n rgb2[1] = model.nodes[idx].g;\n rgb1[2] = model.nodes[idx - 1].b;\n rgb2[2] = model.nodes[idx].b; // We only need the previous midpoint and sharpness\n // since these control this region\n\n midpoint = model.nodes[idx - 1].midpoint;\n sharpness = model.nodes[idx - 1].sharpness; // Move midpoint away from extreme ends of range to avoid\n // degenerate math\n\n if (midpoint < 0.00001) {\n midpoint = 0.00001;\n }\n\n if (midpoint > 0.99999) {\n midpoint = 0.99999;\n }\n }\n } // Are we at or past the end? If so, just use the last value\n\n\n if (x > model.mappingRange[1]) {\n table[tidx] = 0.0;\n table[tidx + 1] = 0.0;\n table[tidx + 2] = 0.0;\n\n if (model.clamping) {\n if (publicAPI.getUseAboveRangeColor()) {\n table[tidx] = model.aboveRangeColor[0];\n table[tidx + 1] = model.aboveRangeColor[1];\n table[tidx + 2] = model.aboveRangeColor[2];\n } else {\n table[tidx] = lastR;\n table[tidx + 1] = lastG;\n table[tidx + 2] = lastB;\n }\n }\n } else if (x < model.mappingRange[0] || isInf(x) && x < 0) {\n // we are before the first node? If so, duplicate this node's values.\n // We have to deal with -inf here\n table[tidx] = 0.0;\n table[tidx + 1] = 0.0;\n table[tidx + 2] = 0.0;\n\n if (model.clamping) {\n if (publicAPI.getUseBelowRangeColor()) {\n table[tidx] = model.belowRangeColor[0];\n table[tidx + 1] = model.belowRangeColor[1];\n table[tidx + 2] = model.belowRangeColor[2];\n } else if (numNodes > 0) {\n table[tidx] = model.nodes[0].r;\n table[tidx + 1] = model.nodes[0].g;\n table[tidx + 2] = model.nodes[0].b;\n }\n }\n } else if (idx === 0 && (Math.abs(x - xStart) < 1e-6 || model.discretize)) {\n if (numNodes > 0) {\n table[tidx] = model.nodes[0].r;\n table[tidx + 1] = model.nodes[0].g;\n table[tidx + 2] = model.nodes[0].b;\n } else {\n table[tidx] = 0.0;\n table[tidx + 1] = 0.0;\n table[tidx + 2] = 0.0;\n }\n } else {\n // OK, we are between two nodes - interpolate\n // Our first attempt at a normalized location [0,1] -\n // we will be modifying this based on midpoint and\n // sharpness to get the curve shape we want and to have\n // it pass through (y1+y2)/2 at the midpoint.\n var s = 0.0;\n\n if (usingLogScale) {\n s = (logX - x1) / (x2 - x1);\n } else {\n s = (x - x1) / (x2 - x1);\n } // Readjust based on the midpoint - linear adjustment\n\n\n if (s < midpoint) {\n s = 0.5 * s / midpoint;\n } else {\n s = 0.5 + 0.5 * (s - midpoint) / (1.0 - midpoint);\n } // override for sharpness > 0.99\n // In this case we just want piecewise constant\n\n\n if (sharpness > 0.99) {\n // Use the first value since we are below the midpoint\n if (s < 0.5) {\n table[tidx] = rgb1[0];\n table[tidx + 1] = rgb1[1];\n table[tidx + 2] = rgb1[2];\n continue;\n } else {\n // Use the second value at or above the midpoint\n table[tidx] = rgb2[0];\n table[tidx + 1] = rgb2[1];\n table[tidx + 2] = rgb2[2];\n continue;\n }\n } // Override for sharpness < 0.01\n // In this case we want piecewise linear\n\n\n if (sharpness < 0.01) {\n // Simple linear interpolation\n if (model.colorSpace === ColorSpace.RGB) {\n table[tidx] = (1 - s) * rgb1[0] + s * rgb2[0];\n table[tidx + 1] = (1 - s) * rgb1[1] + s * rgb2[1];\n table[tidx + 2] = (1 - s) * rgb1[2] + s * rgb2[2];\n } else if (model.colorSpace === ColorSpace.HSV) {\n var hsv1 = [];\n var hsv2 = [];\n rgb2hsv(rgb1, hsv1);\n rgb2hsv(rgb2, hsv2);\n\n if (model.hSVWrap && (hsv1[0] - hsv2[0] > 0.5 || hsv2[0] - hsv1[0] > 0.5)) {\n if (hsv1[0] > hsv2[0]) {\n hsv1[0] -= 1.0;\n } else {\n hsv2[0] -= 1.0;\n }\n }\n\n var hsvTmp = [];\n hsvTmp[0] = (1.0 - s) * hsv1[0] + s * hsv2[0];\n\n if (hsvTmp[0] < 0.0) {\n hsvTmp[0] += 1.0;\n }\n\n hsvTmp[1] = (1.0 - s) * hsv1[1] + s * hsv2[1];\n hsvTmp[2] = (1.0 - s) * hsv1[2] + s * hsv2[2]; // Now convert this back to RGB\n\n hsv2rgb(hsvTmp, tmpVec);\n table[tidx] = tmpVec[0];\n table[tidx + 1] = tmpVec[1];\n table[tidx + 2] = tmpVec[2];\n } else if (model.colorSpace === ColorSpace.LAB) {\n var lab1 = [];\n var lab2 = [];\n rgb2lab(rgb1, lab1);\n rgb2lab(rgb2, lab2);\n var labTmp = [];\n labTmp[0] = (1 - s) * lab1[0] + s * lab2[0];\n labTmp[1] = (1 - s) * lab1[1] + s * lab2[1];\n labTmp[2] = (1 - s) * lab1[2] + s * lab2[2]; // Now convert back to RGB\n\n lab2rgb(labTmp, tmpVec);\n table[tidx] = tmpVec[0];\n table[tidx + 1] = tmpVec[1];\n table[tidx + 2] = tmpVec[2];\n } else if (model.colorSpace === ColorSpace.DIVERGING) {\n vtkColorTransferFunctionInterpolateDiverging(s, rgb1, rgb2, tmpVec);\n table[tidx] = tmpVec[0];\n table[tidx + 1] = tmpVec[1];\n table[tidx + 2] = tmpVec[2];\n } else {\n vtkErrorMacro('ColorSpace set to invalid value.', model.colorSpace);\n }\n\n continue;\n } // We have a sharpness between [0.01, 0.99] - we will\n // used a modified hermite curve interpolation where we\n // derive the slope based on the sharpness, and we compress\n // the curve non-linearly based on the sharpness\n // First, we will adjust our position based on sharpness in\n // order to make the curve sharper (closer to piecewise constant)\n\n\n if (s < 0.5) {\n s = 0.5 * Math.pow(s * 2.0, 1.0 + 10.0 * sharpness);\n } else if (s > 0.5) {\n s = 1.0 - 0.5 * Math.pow((1.0 - s) * 2, 1 + 10.0 * sharpness);\n } // Compute some coefficients we will need for the hermite curve\n\n\n var ss = s * s;\n var sss = ss * s;\n var h1 = 2.0 * sss - 3 * ss + 1;\n var h2 = -2 * sss + 3 * ss;\n var h3 = sss - 2 * ss + s;\n var h4 = sss - ss;\n var slope = void 0;\n var t = void 0;\n\n if (model.colorSpace === ColorSpace.RGB) {\n for (var j = 0; j < 3; j++) {\n // Use one slope for both end points\n slope = rgb2[j] - rgb1[j];\n t = (1.0 - sharpness) * slope; // Compute the value\n\n table[tidx + j] = h1 * rgb1[j] + h2 * rgb2[j] + h3 * t + h4 * t;\n }\n } else if (model.colorSpace === ColorSpace.HSV) {\n var _hsv = [];\n var _hsv2 = [];\n rgb2hsv(rgb1, _hsv);\n rgb2hsv(rgb2, _hsv2);\n\n if (model.hSVWrap && (_hsv[0] - _hsv2[0] > 0.5 || _hsv2[0] - _hsv[0] > 0.5)) {\n if (_hsv[0] > _hsv2[0]) {\n _hsv[0] -= 1.0;\n } else {\n _hsv2[0] -= 1.0;\n }\n }\n\n var _hsvTmp = [];\n\n for (var _j = 0; _j < 3; _j++) {\n // Use one slope for both end points\n slope = _hsv2[_j] - _hsv[_j];\n t = (1.0 - sharpness) * slope; // Compute the value\n\n _hsvTmp[_j] = h1 * _hsv[_j] + h2 * _hsv2[_j] + h3 * t + h4 * t;\n\n if (_j === 0 && _hsvTmp[_j] < 0.0) {\n _hsvTmp[_j] += 1.0;\n }\n } // Now convert this back to RGB\n\n\n hsv2rgb(_hsvTmp, tmpVec);\n table[tidx] = tmpVec[0];\n table[tidx + 1] = tmpVec[1];\n table[tidx + 2] = tmpVec[2];\n } else if (model.colorSpace === ColorSpace.LAB) {\n var _lab = [];\n var _lab2 = [];\n rgb2lab(rgb1, _lab);\n rgb2lab(rgb2, _lab2);\n var _labTmp = [];\n\n for (var _j2 = 0; _j2 < 3; _j2++) {\n // Use one slope for both end points\n slope = _lab2[_j2] - _lab[_j2];\n t = (1.0 - sharpness) * slope; // Compute the value\n\n _labTmp[_j2] = h1 * _lab[_j2] + h2 * _lab2[_j2] + h3 * t + h4 * t;\n } // Now convert this back to RGB\n\n\n lab2rgb(_labTmp, tmpVec);\n table[tidx] = tmpVec[0];\n table[tidx + 1] = tmpVec[1];\n table[tidx + 2] = tmpVec[2];\n } else if (model.colorSpace === ColorSpace.DIVERGING) {\n // I have not implemented proper interpolation by a hermite curve for\n // the diverging color map, but I cannot think of a good use case for\n // that anyway.\n vtkColorTransferFunctionInterpolateDiverging(s, rgb1, rgb2, tmpVec);\n table[tidx] = tmpVec[0];\n table[tidx + 1] = tmpVec[1];\n table[tidx + 2] = tmpVec[2];\n } else {\n vtkErrorMacro('ColorSpace set to invalid value.');\n } // Final error check to make sure we don't go outside [0,1]\n\n\n for (var _j3 = 0; _j3 < 3; _j3++) {\n table[tidx + _j3] = table[tidx + _j3] < 0.0 ? 0.0 : table[tidx + _j3];\n table[tidx + _j3] = table[tidx + _j3] > 1.0 ? 1.0 : table[tidx + _j3];\n }\n }\n }\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.getUint8Table = function (xStart, xEnd, size) {\n var withAlpha = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n\n if (publicAPI.getMTime() <= model.buildTime && model.tableSize === size && model.tableWithAlpha !== withAlpha) {\n return model.table;\n }\n\n if (model.nodes.length === 0) {\n vtkErrorMacro('Attempting to lookup a value with no points in the function');\n return model.table;\n }\n\n var nbChannels = withAlpha ? 4 : 3;\n\n if (model.tableSize !== size || model.tableWithAlpha !== withAlpha) {\n model.table = new Uint8Array(size * nbChannels);\n model.tableSize = size;\n model.tableWithAlpha = withAlpha;\n }\n\n var tmpTable = [];\n publicAPI.getTable(xStart, xEnd, size, tmpTable);\n\n for (var i = 0; i < size; i++) {\n model.table[i * nbChannels + 0] = Math.floor(tmpTable[i * 3 + 0] * 255.0 + 0.5);\n model.table[i * nbChannels + 1] = Math.floor(tmpTable[i * 3 + 1] * 255.0 + 0.5);\n model.table[i * nbChannels + 2] = Math.floor(tmpTable[i * 3 + 2] * 255.0 + 0.5);\n\n if (withAlpha) {\n model.table[i * nbChannels + 3] = 255;\n }\n }\n\n model.buildTime.modified();\n return model.table;\n };\n\n publicAPI.buildFunctionFromArray = function (array) {\n publicAPI.removeAllPoints();\n var numComponents = array.getNumberOfComponents();\n\n for (var i = 0; i < array.getNumberOfTuples(); i++) {\n switch (numComponents) {\n case 3:\n {\n model.nodes.push({\n x: i,\n r: array.getComponent(i, 0),\n g: array.getComponent(i, 1),\n b: array.getComponent(i, 2),\n midpoint: 0.5,\n sharpness: 0.0\n });\n break;\n }\n\n case 4:\n {\n model.nodes.push({\n x: array.getComponent(i, 0),\n r: array.getComponent(i, 1),\n g: array.getComponent(i, 2),\n b: array.getComponent(i, 3),\n midpoint: 0.5,\n sharpness: 0.0\n });\n break;\n }\n\n case 5:\n {\n model.nodes.push({\n x: i,\n r: array.getComponent(i, 0),\n g: array.getComponent(i, 1),\n b: array.getComponent(i, 2),\n midpoint: array.getComponent(i, 4),\n sharpness: array.getComponent(i, 5)\n });\n break;\n }\n\n case 6:\n {\n model.nodes.push({\n x: array.getComponent(i, 0),\n r: array.getComponent(i, 1),\n g: array.getComponent(i, 2),\n b: array.getComponent(i, 3),\n midpoint: array.getComponent(i, 4),\n sharpness: array.getComponent(i, 5)\n });\n break;\n }\n }\n }\n\n publicAPI.sortAndUpdateRange();\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.buildFunctionFromTable = function (xStart, xEnd, size, table) {\n var inc = 0.0;\n publicAPI.removeAllPoints();\n\n if (size > 1) {\n inc = (xEnd - xStart) / (size - 1.0);\n }\n\n for (var i = 0; i < size; i++) {\n var node = {\n x: xStart + inc * i,\n r: table[i * 3],\n g: table[i * 3 + 1],\n b: table[i * 3 + 2],\n sharpness: 0.0,\n midpoint: 0.5\n };\n model.nodes.push(node);\n }\n\n publicAPI.sortAndUpdateRange();\n }; //----------------------------------------------------------------------------\n // For a specified index value, get the node parameters\n\n\n publicAPI.getNodeValue = function (index, val) {\n if (index < 0 || index >= model.nodes.length) {\n vtkErrorMacro('Index out of range!');\n return -1;\n }\n\n val[0] = model.nodes[index].x;\n val[1] = model.nodes[index].r;\n val[2] = model.nodes[index].g;\n val[3] = model.nodes[index].b;\n val[4] = model.nodes[index].midpoint;\n val[5] = model.nodes[index].sharpness;\n return 1;\n }; //----------------------------------------------------------------------------\n // For a specified index value, get the node parameters\n\n\n publicAPI.setNodeValue = function (index, val) {\n if (index < 0 || index >= model.nodes.length) {\n vtkErrorMacro('Index out of range!');\n return -1;\n }\n\n var oldX = model.nodes[index].x;\n model.nodes[index].x = val[0];\n model.nodes[index].r = val[1];\n model.nodes[index].g = val[2];\n model.nodes[index].b = val[3];\n model.nodes[index].midpoint = val[4];\n model.nodes[index].sharpness = val[5];\n\n if (oldX !== val[0]) {\n // The point has been moved, the order of points or the range might have\n // been modified.\n publicAPI.sortAndUpdateRange(); // No need to call Modified() here because SortAndUpdateRange() has done it\n // already.\n } else {\n publicAPI.modified();\n }\n\n return 1;\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.getNumberOfAvailableColors = function () {\n if (model.indexedLookup && publicAPI.getSize()) {\n return publicAPI.getSize();\n }\n\n if (model.tableSize) {\n // Not sure if this is correct since it is only set if\n // \"const unsigned char *::GetTable(double xStart, double xEnd,int size)\"\n // has been called.\n return model.tableSize;\n }\n\n return 16777216; // 2^24\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.getIndexedColor = function (idx, rgba) {\n var n = publicAPI.getSize();\n\n if (n > 0 && idx >= 0) {\n var nodeValue = [];\n publicAPI.getNodeValue(idx % n, nodeValue);\n\n for (var j = 0; j < 3; ++j) {\n rgba[j] = nodeValue[j + 1];\n }\n\n rgba[3] = 1.0; // NodeColor is RGB-only.\n\n return;\n }\n\n publicAPI.getNanColor(rgba);\n rgba[3] = 1.0; // NanColor is RGB-only.\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.fillFromDataPointer = function (nb, ptr) {\n if (nb <= 0 || !ptr) {\n return;\n }\n\n publicAPI.removeAllPoints();\n\n for (var i = 0; i < nb; i++) {\n publicAPI.addRGBPoint(ptr[i * 4], ptr[i * 4 + 1], ptr[i * 4 + 2], ptr[i * 4 + 3]);\n }\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.setMappingRange = function (min, max) {\n var range = [min, max];\n var originalRange = publicAPI.getRange();\n\n if (originalRange[1] === range[1] && originalRange[0] === range[0]) {\n return;\n }\n\n if (range[1] === range[0]) {\n vtkErrorMacro('attempt to set zero width color range');\n return;\n }\n\n var scale = (range[1] - range[0]) / (originalRange[1] - originalRange[0]);\n var shift = range[0] - originalRange[0] * scale;\n\n for (var i = 0; i < model.nodes.length; ++i) {\n model.nodes[i].x = model.nodes[i].x * scale + shift;\n }\n\n model.mappingRange[0] = range[0];\n model.mappingRange[1] = range[1];\n publicAPI.modified();\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.adjustRange = function (range) {\n var functionRange = publicAPI.getRange(); // Make sure we have points at each end of the range\n\n var rgb = [];\n\n if (functionRange[0] < range[0]) {\n publicAPI.getColor(range[0], rgb);\n publicAPI.addRGBPoint(range[0], rgb[0], rgb[1], rgb[2]);\n } else {\n publicAPI.getColor(functionRange[0], rgb);\n publicAPI.addRGBPoint(range[0], rgb[0], rgb[1], rgb[2]);\n }\n\n if (functionRange[1] > range[1]) {\n publicAPI.getColor(range[1], rgb);\n publicAPI.addRGBPoint(range[1], rgb[0], rgb[1], rgb[2]);\n } else {\n publicAPI.getColor(functionRange[1], rgb);\n publicAPI.addRGBPoint(range[1], rgb[0], rgb[1], rgb[2]);\n } // Remove all points out-of-range\n\n\n publicAPI.sortAndUpdateRange();\n\n for (var i = 0; i < model.nodes.length;) {\n if (model.nodes[i].x >= range[0] && model.nodes[i].x <= range[1]) {\n model.nodes.splice(i, 1);\n } else {\n ++i;\n }\n }\n\n return 1;\n }; //--------------------------------------------------------------------------\n\n\n publicAPI.estimateMinNumberOfSamples = function (x1, x2) {\n var d = publicAPI.findMinimumXDistance();\n return Math.ceil((x2 - x1) / d);\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.findMinimumXDistance = function () {\n if (model.nodes.length < 2) {\n return -1.0;\n }\n\n var distance = Number.MAX_VALUE;\n\n for (var i = 0; i < model.nodes.length - 1; i++) {\n var currentDist = model.nodes[i + 1].x - model.nodes[i].x;\n\n if (currentDist < distance) {\n distance = currentDist;\n }\n }\n\n return distance;\n };\n\n publicAPI.mapScalarsThroughTable = function (input, output, outFormat, inputOffset) {\n if (publicAPI.getSize() === 0) {\n vtkDebugMacro('Transfer Function Has No Points!');\n return;\n }\n\n if (model.indexedLookup) {\n publicAPI.mapDataIndexed(input, output, outFormat, inputOffset);\n } else {\n publicAPI.mapData(input, output, outFormat, inputOffset);\n }\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.mapData = function (input, output, outFormat, inputOffset) {\n if (publicAPI.getSize() === 0) {\n vtkWarningMacro('Transfer Function Has No Points!');\n return;\n }\n\n var alpha = Math.floor(publicAPI.getAlpha() * 255.0 + 0.5);\n var length = input.getNumberOfTuples();\n var inIncr = input.getNumberOfComponents();\n var outputV = output.getData();\n var inputV = input.getData();\n var rgb = [];\n\n if (outFormat === ScalarMappingTarget.RGBA) {\n for (var i = 0; i < length; i++) {\n var x = inputV[i * inIncr + inputOffset];\n publicAPI.getColor(x, rgb);\n outputV[i * 4] = Math.floor(rgb[0] * 255.0 + 0.5);\n outputV[i * 4 + 1] = Math.floor(rgb[1] * 255.0 + 0.5);\n outputV[i * 4 + 2] = Math.floor(rgb[2] * 255.0 + 0.5);\n outputV[i * 4 + 3] = alpha;\n }\n }\n\n if (outFormat === ScalarMappingTarget.RGB) {\n for (var _i2 = 0; _i2 < length; _i2++) {\n var _x = inputV[_i2 * inIncr + inputOffset];\n publicAPI.getColor(_x, rgb);\n outputV[_i2 * 3] = Math.floor(rgb[0] * 255.0 + 0.5);\n outputV[_i2 * 3 + 1] = Math.floor(rgb[1] * 255.0 + 0.5);\n outputV[_i2 * 3 + 2] = Math.floor(rgb[2] * 255.0 + 0.5);\n }\n }\n\n if (outFormat === ScalarMappingTarget.LUMINANCE) {\n for (var _i3 = 0; _i3 < length; _i3++) {\n var _x2 = inputV[_i3 * inIncr + inputOffset];\n publicAPI.getColor(_x2, rgb);\n outputV[_i3] = Math.floor(rgb[0] * 76.5 + rgb[1] * 150.45 + rgb[2] * 28.05 + 0.5);\n }\n }\n\n if (outFormat === ScalarMappingTarget.LUMINANCE_ALPHA) {\n for (var _i4 = 0; _i4 < length; _i4++) {\n var _x3 = inputV[_i4 * inIncr + inputOffset];\n publicAPI.getColor(_x3, rgb);\n outputV[_i4 * 2] = Math.floor(rgb[0] * 76.5 + rgb[1] * 150.45 + rgb[2] * 28.05 + 0.5);\n outputV[_i4 * 2 + 1] = alpha;\n }\n }\n }; //----------------------------------------------------------------------------\n\n\n publicAPI.applyColorMap = function (colorMap) {\n var oldColorSpace = JSON.stringify(model.colorSpace);\n\n if (colorMap.ColorSpace) {\n model.colorSpace = ColorSpace[colorMap.ColorSpace.toUpperCase()];\n\n if (model.colorSpace === undefined) {\n vtkErrorMacro(\"ColorSpace \".concat(colorMap.ColorSpace, \" not supported, using RGB instead\"));\n model.colorSpace = ColorSpace.RGB;\n }\n }\n\n var isModified = oldColorSpace !== JSON.stringify(model.colorSpace);\n var oldNanColor = isModified || JSON.stringify(model.nanColor);\n\n if (colorMap.NanColor) {\n model.nanColor = [].concat(colorMap.NanColor);\n\n while (model.nanColor.length < 4) {\n model.nanColor.push(1.0);\n }\n }\n\n isModified = isModified || oldNanColor !== JSON.stringify(model.nanColor);\n var oldNodes = isModified || JSON.stringify(model.nodes);\n\n if (colorMap.RGBPoints) {\n var size = colorMap.RGBPoints.length;\n model.nodes = [];\n var midpoint = 0.5;\n var sharpness = 0.0;\n\n for (var i = 0; i < size; i += 4) {\n model.nodes.push({\n x: colorMap.RGBPoints[i],\n r: colorMap.RGBPoints[i + 1],\n g: colorMap.RGBPoints[i + 2],\n b: colorMap.RGBPoints[i + 3],\n midpoint: midpoint,\n sharpness: sharpness\n });\n }\n }\n\n var modifiedInvoked = publicAPI.sortAndUpdateRange();\n var callModified = !modifiedInvoked && (isModified || oldNodes !== JSON.stringify(model.nodes));\n if (callModified) publicAPI.modified();\n return modifiedInvoked || callModified;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n clamping: true,\n colorSpace: ColorSpace.RGB,\n hSVWrap: true,\n scale: Scale.LINEAR,\n nanColor: null,\n belowRangeColor: null,\n aboveRangeColor: null,\n useAboveRangeColor: false,\n useBelowRangeColor: false,\n allowDuplicateScalars: false,\n table: null,\n tableSize: 0,\n buildTime: null,\n nodes: null,\n discretize: false,\n numberOfValues: 256\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkScalarsToColors.extend(publicAPI, model, initialValues); // Internal objects initialization\n\n model.table = [];\n model.nodes = [];\n model.nanColor = [0.5, 0.0, 0.0, 1.0];\n model.belowRangeColor = [0.0, 0.0, 0.0, 1.0];\n model.aboveRangeColor = [1.0, 1.0, 1.0, 1.0];\n model.buildTime = {};\n macro.obj(model.buildTime); // Create get-only macros\n\n macro.get(publicAPI, model, ['buildTime', 'mappingRange']); // Create get-set macros\n\n macro.setGet(publicAPI, model, ['useAboveRangeColor', 'useBelowRangeColor', 'colorSpace', 'discretize', 'numberOfValues']);\n macro.setArray(publicAPI, model, ['nanColor', 'belowRangeColor', 'aboveRangeColor'], 4); // Create get macros for array\n\n macro.getArray(publicAPI, model, ['nanColor', 'belowRangeColor', 'aboveRangeColor']); // For more macro methods, see \"Sources/macros.js\"\n // Object specific methods\n\n vtkColorTransferFunction(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkColorTransferFunction'); // ----------------------------------------------------------------------------\n\nvar vtkColorTransferFunction$1 = _objectSpread({\n newInstance: newInstance,\n extend: extend\n}, Constants);\n\nexport { vtkColorTransferFunction$1 as default, extend, newInstance };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport macro from '../../macros.js';\nimport vtkAbstractMapper3D from './AbstractMapper3D.js';\nimport vtkDataArray from '../../Common/Core/DataArray.js';\nimport vtkImageData from '../../Common/DataModel/ImageData.js';\nimport vtkLookupTable from '../../Common/Core/LookupTable.js';\nimport { N as createUninitializedBounds, i as isNan } from '../../Common/Core/Math/index.js';\nimport vtkScalarsToColors from '../../Common/Core/ScalarsToColors/Constants.js';\nimport CoincidentTopologyHelper from './Mapper/CoincidentTopologyHelper.js';\nimport Constants from './Mapper/Constants.js';\nimport vtkDataSet from '../../Common/DataModel/DataSet.js';\nimport { PassTypes } from '../OpenGL/HardwareSelector/Constants.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nvar FieldAssociations = vtkDataSet.FieldAssociations;\nvar staticOffsetAPI = CoincidentTopologyHelper.staticOffsetAPI,\n otherStaticMethods = CoincidentTopologyHelper.otherStaticMethods;\nvar ColorMode = Constants.ColorMode,\n ScalarMode = Constants.ScalarMode,\n GetArray = Constants.GetArray;\nvar VectorMode = vtkScalarsToColors.VectorMode;\nvar VtkDataTypes = vtkDataArray.VtkDataTypes; // ----------------------------------------------------------------------------\n\nfunction notImplemented(method) {\n return function () {\n return macro.vtkErrorMacro(\"vtkMapper::\".concat(method, \" - NOT IMPLEMENTED\"));\n };\n} // ----------------------------------------------------------------------------\n// vtkMapper methods\n// ----------------------------------------------------------------------------\n\n\nfunction vtkMapper(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkMapper');\n\n publicAPI.getBounds = function () {\n var input = publicAPI.getInputData();\n\n if (!input) {\n model.bounds = createUninitializedBounds();\n } else {\n if (!model.static) {\n publicAPI.update();\n }\n\n model.bounds = input.getBounds();\n }\n\n return model.bounds;\n };\n\n publicAPI.setForceCompileOnly = function (v) {\n model.forceCompileOnly = v; // make sure we do NOT call modified()\n };\n\n publicAPI.createDefaultLookupTable = function () {\n model.lookupTable = vtkLookupTable.newInstance();\n };\n\n publicAPI.getColorModeAsString = function () {\n return macro.enumToString(ColorMode, model.colorMode);\n };\n\n publicAPI.setColorModeToDefault = function () {\n return publicAPI.setColorMode(0);\n };\n\n publicAPI.setColorModeToMapScalars = function () {\n return publicAPI.setColorMode(1);\n };\n\n publicAPI.setColorModeToDirectScalars = function () {\n return publicAPI.setColorMode(2);\n };\n\n publicAPI.getScalarModeAsString = function () {\n return macro.enumToString(ScalarMode, model.scalarMode);\n };\n\n publicAPI.setScalarModeToDefault = function () {\n return publicAPI.setScalarMode(0);\n };\n\n publicAPI.setScalarModeToUsePointData = function () {\n return publicAPI.setScalarMode(1);\n };\n\n publicAPI.setScalarModeToUseCellData = function () {\n return publicAPI.setScalarMode(2);\n };\n\n publicAPI.setScalarModeToUsePointFieldData = function () {\n return publicAPI.setScalarMode(3);\n };\n\n publicAPI.setScalarModeToUseCellFieldData = function () {\n return publicAPI.setScalarMode(4);\n };\n\n publicAPI.setScalarModeToUseFieldData = function () {\n return publicAPI.setScalarMode(5);\n };\n\n publicAPI.getAbstractScalars = function (input, scalarMode, arrayAccessMode, arrayId, arrayName) {\n // make sure we have an input\n if (!input || !model.scalarVisibility) {\n return {\n scalars: null,\n cellFLag: false\n };\n }\n\n var scalars = null;\n var cellFlag = false; // get and scalar data according to scalar mode\n\n if (scalarMode === ScalarMode.DEFAULT) {\n scalars = input.getPointData().getScalars();\n\n if (!scalars) {\n scalars = input.getCellData().getScalars();\n cellFlag = true;\n }\n } else if (scalarMode === ScalarMode.USE_POINT_DATA) {\n scalars = input.getPointData().getScalars();\n } else if (scalarMode === ScalarMode.USE_CELL_DATA) {\n scalars = input.getCellData().getScalars();\n cellFlag = true;\n } else if (scalarMode === ScalarMode.USE_POINT_FIELD_DATA) {\n var pd = input.getPointData();\n\n if (arrayAccessMode === GetArray.BY_ID) {\n scalars = pd.getArrayByIndex(arrayId);\n } else {\n scalars = pd.getArrayByName(arrayName);\n }\n } else if (scalarMode === ScalarMode.USE_CELL_FIELD_DATA) {\n var cd = input.getCellData();\n cellFlag = true;\n\n if (arrayAccessMode === GetArray.BY_ID) {\n scalars = cd.getArrayByIndex(arrayId);\n } else {\n scalars = cd.getArrayByName(arrayName);\n }\n } else if (scalarMode === ScalarMode.USE_FIELD_DATA) {\n var fd = input.getFieldData();\n\n if (arrayAccessMode === GetArray.BY_ID) {\n scalars = fd.getArrayByIndex(arrayId);\n } else {\n scalars = fd.getArrayByName(arrayName);\n }\n }\n\n return {\n scalars: scalars,\n cellFlag: cellFlag\n };\n };\n\n publicAPI.mapScalars = function (input, alpha) {\n var scalars = publicAPI.getAbstractScalars(input, model.scalarMode, model.arrayAccessMode, model.arrayId, model.colorByArrayName).scalars;\n\n if (!scalars) {\n model.colorCoordinates = null;\n model.colorTextureMap = null;\n model.colorMapColors = null;\n return;\n } // we want to only recompute when something has changed\n\n\n var toString = \"\".concat(publicAPI.getMTime()).concat(scalars.getMTime()).concat(alpha);\n if (model.colorBuildString === toString) return;\n\n if (!model.useLookupTableScalarRange) {\n publicAPI.getLookupTable().setRange(model.scalarRange[0], model.scalarRange[1]);\n } // Decide between texture color or vertex color.\n // Cell data always uses vertex color.\n // Only point data can use both texture and vertex coloring.\n\n\n if (publicAPI.canUseTextureMapForColoring(input)) {\n publicAPI.mapScalarsToTexture(scalars, alpha);\n } else {\n model.colorCoordinates = null;\n model.colorTextureMap = null;\n var lut = publicAPI.getLookupTable();\n\n if (lut) {\n // Ensure that the lookup table is built\n lut.build();\n model.colorMapColors = lut.mapScalars(scalars, model.colorMode, model.fieldDataTupleId);\n }\n }\n\n model.colorBuildString = \"\".concat(publicAPI.getMTime()).concat(scalars.getMTime()).concat(alpha);\n }; //-----------------------------------------------------------------------------\n\n\n publicAPI.scalarToTextureCoordinate = function (scalarValue, // Input scalar\n rangeMin, // range[0]\n invRangeWidth) {\n // 1/(range[1]-range[0])\n var texCoordS = 0.5; // Scalar value is arbitrary when NaN\n\n var texCoordT = 1.0; // 1.0 in t coordinate means NaN\n\n if (!isNan(scalarValue)) {\n // 0.0 in t coordinate means not NaN. So why am I setting it to 0.49?\n // Because when you are mapping scalars and you have a NaN adjacent to\n // anything else, the interpolation everywhere should be NaN. Thus, I\n // want the NaN color everywhere except right on the non-NaN neighbors.\n // To simulate this, I set the t coord for the real numbers close to\n // the threshold so that the interpolation almost immediately looks up\n // the NaN value.\n texCoordT = 0.49;\n texCoordS = (scalarValue - rangeMin) * invRangeWidth; // Some implementations apparently don't handle relatively large\n // numbers (compared to the range [0.0, 1.0]) very well. In fact,\n // values above 1122.0f appear to cause texture wrap-around on\n // some systems even when edge clamping is enabled. Why 1122.0f? I\n // don't know. For safety, we'll clamp at +/- 1000. This will\n // result in incorrect images when the texture value should be\n // above or below 1000, but I don't have a better solution.\n\n if (texCoordS > 1000.0) {\n texCoordS = 1000.0;\n } else if (texCoordS < -1000.0) {\n texCoordS = -1000.0;\n }\n }\n\n return {\n texCoordS: texCoordS,\n texCoordT: texCoordT\n };\n }; //-----------------------------------------------------------------------------\n\n\n publicAPI.createColorTextureCoordinates = function (input, output, numScalars, numComps, component, range, tableRange, tableNumberOfColors, useLogScale) {\n // We have to change the range used for computing texture\n // coordinates slightly to accommodate the special above- and\n // below-range colors that are the first and last texels,\n // respectively.\n var scalarTexelWidth = (range[1] - range[0]) / tableNumberOfColors;\n var paddedRange = [];\n paddedRange[0] = range[0] - scalarTexelWidth;\n paddedRange[1] = range[1] + scalarTexelWidth;\n var invRangeWidth = 1.0 / (paddedRange[1] - paddedRange[0]);\n var outputV = output.getData();\n var inputV = input.getData();\n var count = 0;\n var outputCount = 0;\n\n if (component < 0 || component >= numComps) {\n for (var scalarIdx = 0; scalarIdx < numScalars; ++scalarIdx) {\n var sum = 0;\n\n for (var compIdx = 0; compIdx < numComps; ++compIdx) {\n sum += inputV[count] * inputV[count];\n count++;\n }\n\n var magnitude = Math.sqrt(sum);\n\n if (useLogScale) {\n magnitude = vtkLookupTable.applyLogScale(magnitude, tableRange, range);\n }\n\n var outputs = publicAPI.scalarToTextureCoordinate(magnitude, paddedRange[0], invRangeWidth);\n outputV[outputCount] = outputs.texCoordS;\n outputV[outputCount + 1] = outputs.texCoordT;\n outputCount += 2;\n }\n } else {\n count += component;\n\n for (var _scalarIdx = 0; _scalarIdx < numScalars; ++_scalarIdx) {\n var inputValue = inputV[count];\n\n if (useLogScale) {\n inputValue = vtkLookupTable.applyLogScale(inputValue, tableRange, range);\n }\n\n var _outputs = publicAPI.scalarToTextureCoordinate(inputValue, paddedRange[0], invRangeWidth);\n\n outputV[outputCount] = _outputs.texCoordS;\n outputV[outputCount + 1] = _outputs.texCoordT;\n outputCount += 2;\n count += numComps;\n }\n }\n };\n\n publicAPI.mapScalarsToTexture = function (scalars, alpha) {\n var range = model.lookupTable.getRange();\n var useLogScale = model.lookupTable.usingLogScale();\n\n if (useLogScale) {\n // convert range to log.\n vtkLookupTable.getLogRange(range, range);\n }\n\n var origAlpha = model.lookupTable.getAlpha(); // Get rid of vertex color array. Only texture or vertex coloring\n // can be active at one time. The existence of the array is the\n // signal to use that technique.\n\n model.colorMapColors = null; // If the lookup table has changed, then recreate the color texture map.\n // Set a new lookup table changes this->MTime.\n\n if (model.colorTextureMap == null || publicAPI.getMTime() > model.colorTextureMap.getMTime() || model.lookupTable.getMTime() > model.colorTextureMap.getMTime() || model.lookupTable.getAlpha() !== alpha) {\n model.lookupTable.setAlpha(alpha);\n model.colorTextureMap = null; // Get the texture map from the lookup table.\n // Create a dummy ramp of scalars.\n // In the future, we could extend vtkScalarsToColors.\n\n model.lookupTable.build();\n var numberOfColors = model.lookupTable.getNumberOfAvailableColors();\n\n if (numberOfColors > 4094) {\n numberOfColors = 4094;\n }\n\n numberOfColors += 2;\n var k = (range[1] - range[0]) / (numberOfColors - 1 - 2);\n var newArray = new Float64Array(numberOfColors * 2);\n\n for (var i = 0; i < numberOfColors; ++i) {\n newArray[i] = range[0] + i * k - k; // minus k to start at below range color\n\n if (useLogScale) {\n newArray[i] = Math.pow(10.0, newArray[i]);\n }\n } // Dimension on NaN.\n\n\n for (var _i = 0; _i < numberOfColors; ++_i) {\n newArray[_i + numberOfColors] = NaN;\n }\n\n model.colorTextureMap = vtkImageData.newInstance();\n model.colorTextureMap.setExtent(0, numberOfColors - 1, 0, 1, 0, 0);\n var tmp = vtkDataArray.newInstance({\n numberOfComponents: 1,\n values: newArray\n });\n model.colorTextureMap.getPointData().setScalars(model.lookupTable.mapScalars(tmp, model.colorMode, 0));\n model.lookupTable.setAlpha(origAlpha);\n } // Create new coordinates if necessary.\n // Need to compare lookup table in case the range has changed.\n\n\n if (!model.colorCoordinates || publicAPI.getMTime() > model.colorCoordinates.getMTime() || publicAPI.getInputData(0).getMTime() > model.colorCoordinates.getMTime() || model.lookupTable.getMTime() > model.colorCoordinates.getMTime()) {\n // Get rid of old colors\n model.colorCoordinates = null; // Now create the color texture coordinates.\n\n var numComps = scalars.getNumberOfComponents();\n var num = scalars.getNumberOfTuples(); // const fArray = new FloatArray(num * 2);\n\n model.colorCoordinates = vtkDataArray.newInstance({\n numberOfComponents: 2,\n values: new Float32Array(num * 2)\n });\n var scalarComponent = model.lookupTable.getVectorComponent(); // Although I like the feature of applying magnitude to single component\n // scalars, it is not how the old MapScalars for vertex coloring works.\n\n if (model.lookupTable.getVectorMode() === VectorMode.MAGNITUDE && scalars.getNumberOfComponents() > 1) {\n scalarComponent = -1;\n }\n\n publicAPI.createColorTextureCoordinates(scalars, model.colorCoordinates, num, numComps, scalarComponent, range, model.lookupTable.getRange(), model.colorTextureMap.getPointData().getScalars().getNumberOfTuples() / 2 - 2, useLogScale);\n }\n };\n\n publicAPI.getIsOpaque = function () {\n var input = publicAPI.getInputData();\n var gasResult = publicAPI.getAbstractScalars(input, model.scalarMode, model.arrayAccessMode, model.arrayId, model.colorByArrayName);\n var scalars = gasResult.scalars;\n\n if (!model.scalarVisibility || scalars == null) {\n // No scalar colors.\n return true;\n }\n\n var lut = publicAPI.getLookupTable();\n\n if (lut) {\n // Ensure that the lookup table is built\n lut.build();\n return lut.areScalarsOpaque(scalars, model.colorMode, -1);\n }\n\n return true;\n };\n\n publicAPI.canUseTextureMapForColoring = function (input) {\n if (!model.interpolateScalarsBeforeMapping) {\n return false; // user doesn't want us to use texture maps at all.\n } // index color does not use textures\n\n\n if (model.lookupTable && model.lookupTable.getIndexedLookup()) {\n return false;\n }\n\n var gasResult = publicAPI.getAbstractScalars(input, model.scalarMode, model.arrayAccessMode, model.arrayId, model.colorByArrayName);\n var scalars = gasResult.scalars;\n\n if (!scalars) {\n // no scalars on this dataset, we don't care if texture is used at all.\n return false;\n }\n\n if (gasResult.cellFlag) {\n return false; // cell data colors, don't use textures.\n }\n\n if (model.colorMode === ColorMode.DEFAULT && scalars.getDataType() === VtkDataTypes.UNSIGNED_CHAR || model.colorMode === ColorMode.DIRECT_SCALARS) {\n // Don't use texture is direct coloring using RGB unsigned chars is\n // requested.\n return false;\n }\n\n return true;\n };\n\n publicAPI.clearColorArrays = function () {\n model.colorMapColors = null;\n model.colorCoordinates = null;\n model.colorTextureMap = null;\n };\n\n publicAPI.getLookupTable = function () {\n if (!model.lookupTable) {\n publicAPI.createDefaultLookupTable();\n }\n\n return model.lookupTable;\n };\n\n publicAPI.getMTime = function () {\n var mt = model.mtime;\n\n if (model.lookupTable !== null) {\n var time = model.lookupTable.getMTime();\n mt = time > mt ? time : mt;\n }\n\n return mt;\n };\n\n publicAPI.getPrimitiveCount = function () {\n var input = publicAPI.getInputData();\n var pcount = {\n points: input.getPoints().getNumberOfValues() / 3,\n verts: input.getVerts().getNumberOfValues() - input.getVerts().getNumberOfCells(),\n lines: input.getLines().getNumberOfValues() - 2 * input.getLines().getNumberOfCells(),\n triangles: input.getPolys().getNumberOfValues() - 3 * input.getPolys().getNumberOfCells()\n };\n return pcount;\n };\n\n publicAPI.acquireInvertibleLookupTable = notImplemented('AcquireInvertibleLookupTable');\n publicAPI.valueToColor = notImplemented('ValueToColor');\n publicAPI.colorToValue = notImplemented('ColorToValue');\n publicAPI.useInvertibleColorFor = notImplemented('UseInvertibleColorFor');\n publicAPI.clearInvertibleColor = notImplemented('ClearInvertibleColor');\n\n publicAPI.processSelectorPixelBuffers = function (selector, pixelOffsets) {\n /* eslint-disable no-bitwise */\n if (!selector || !model.selectionWebGLIdsToVTKIds || !model.populateSelectionSettings) {\n return;\n }\n\n var rawLowData = selector.getRawPixelBuffer(PassTypes.ID_LOW24);\n var rawHighData = selector.getRawPixelBuffer(PassTypes.ID_HIGH24);\n var currentPass = selector.getCurrentPass();\n var fieldAssociation = selector.getFieldAssociation();\n var idMap = null;\n\n if (fieldAssociation === FieldAssociations.FIELD_ASSOCIATION_POINTS) {\n idMap = model.selectionWebGLIdsToVTKIds.points;\n } else if (fieldAssociation === FieldAssociations.FIELD_ASSOCIATION_CELLS) {\n idMap = model.selectionWebGLIdsToVTKIds.cells;\n }\n\n if (!idMap) {\n return;\n }\n\n pixelOffsets.forEach(function (pos) {\n if (currentPass === PassTypes.ID_LOW24) {\n var inValue = 0;\n\n if (rawHighData) {\n inValue += rawHighData[pos];\n inValue *= 256;\n }\n\n inValue += rawLowData[pos + 2];\n inValue *= 256;\n inValue += rawLowData[pos + 1];\n inValue *= 256;\n inValue += rawLowData[pos];\n var outValue = idMap[inValue];\n var lowData = selector.getPixelBuffer(PassTypes.ID_LOW24);\n lowData[pos] = outValue & 0xff;\n lowData[pos + 1] = (outValue & 0xff00) >> 8;\n lowData[pos + 2] = (outValue & 0xff0000) >> 16;\n } else if (currentPass === PassTypes.ID_HIGH24 && rawHighData) {\n var _inValue = 0;\n _inValue += rawHighData[pos];\n _inValue *= 256;\n _inValue += rawLowData[pos];\n _inValue *= 256;\n _inValue += rawLowData[pos + 1];\n _inValue *= 256;\n _inValue += rawLowData[pos + 2];\n var _outValue = idMap[_inValue];\n var highData = selector.getPixelBuffer(PassTypes.ID_HIGH24);\n highData[pos] = (_outValue & 0xff000000) >> 24;\n }\n });\n /* eslint-enable no-bitwise */\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n colorMapColors: null,\n // Same as this->Colors\n static: false,\n lookupTable: null,\n scalarVisibility: true,\n scalarRange: [0, 1],\n useLookupTableScalarRange: false,\n colorMode: 0,\n scalarMode: 0,\n arrayAccessMode: 1,\n // By_NAME\n renderTime: 0,\n colorByArrayName: null,\n fieldDataTupleId: -1,\n populateSelectionSettings: true,\n selectionWebGLIdsToVTKIds: null,\n interpolateScalarsBeforeMapping: false,\n colorCoordinates: null,\n colorTextureMap: null,\n forceCompileOnly: 0,\n useInvertibleColors: false,\n invertibleScalars: null,\n customShaderAttributes: []\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkAbstractMapper3D.extend(publicAPI, model, initialValues);\n macro.get(publicAPI, model, ['colorCoordinates', 'colorMapColors', 'colorTextureMap']);\n macro.setGet(publicAPI, model, ['colorByArrayName', 'arrayAccessMode', 'colorMode', 'fieldDataTupleId', 'interpolateScalarsBeforeMapping', 'lookupTable', 'populateSelectionSettings', 'renderTime', 'scalarMode', 'scalarVisibility', 'selectionWebGLIdsToVTKIds', 'static', 'useLookupTableScalarRange', 'customShaderAttributes' // point data array names that will be transferred to the VBO\n ]);\n macro.setGetArray(publicAPI, model, ['scalarRange'], 2);\n CoincidentTopologyHelper.implementCoincidentTopologyMethods(publicAPI, model); // Object methods\n\n vtkMapper(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkMapper'); // ----------------------------------------------------------------------------\n\nvar vtkMapper$1 = _objectSpread(_objectSpread(_objectSpread({\n newInstance: newInstance,\n extend: extend\n}, staticOffsetAPI), otherStaticMethods), Constants);\n\nexport { vtkMapper$1 as default, extend, newInstance };\n","var resolveCoincidentTopologyPolygonOffsetFaces = 1;\nvar resolveCoincidentTopology = 0;\nvar RESOLVE_COINCIDENT_TOPOLOGY_MODE = ['VTK_RESOLVE_OFF', 'VTK_RESOLVE_POLYGON_OFFSET'];\nfunction getResolveCoincidentTopologyPolygonOffsetFaces() {\n return resolveCoincidentTopologyPolygonOffsetFaces;\n}\nfunction setResolveCoincidentTopologyPolygonOffsetFaces(value) {\n resolveCoincidentTopologyPolygonOffsetFaces = value;\n}\nfunction getResolveCoincidentTopology() {\n return resolveCoincidentTopology;\n}\nfunction setResolveCoincidentTopology() {\n var mode = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n resolveCoincidentTopology = mode;\n}\nfunction setResolveCoincidentTopologyToDefault() {\n setResolveCoincidentTopology(0); // VTK_RESOLVE_OFF\n}\nfunction setResolveCoincidentTopologyToOff() {\n setResolveCoincidentTopology(0); // VTK_RESOLVE_OFF\n}\nfunction setResolveCoincidentTopologyToPolygonOffset() {\n setResolveCoincidentTopology(1); // VTK_RESOLVE_POLYGON_OFFSET\n}\nfunction getResolveCoincidentTopologyAsString() {\n return RESOLVE_COINCIDENT_TOPOLOGY_MODE[resolveCoincidentTopology];\n}\nvar otherStaticMethods = {\n getResolveCoincidentTopologyAsString: getResolveCoincidentTopologyAsString,\n getResolveCoincidentTopologyPolygonOffsetFaces: getResolveCoincidentTopologyPolygonOffsetFaces,\n getResolveCoincidentTopology: getResolveCoincidentTopology,\n setResolveCoincidentTopology: setResolveCoincidentTopology,\n setResolveCoincidentTopologyPolygonOffsetFaces: setResolveCoincidentTopologyPolygonOffsetFaces,\n setResolveCoincidentTopologyToDefault: setResolveCoincidentTopologyToDefault,\n setResolveCoincidentTopologyToOff: setResolveCoincidentTopologyToOff,\n setResolveCoincidentTopologyToPolygonOffset: setResolveCoincidentTopologyToPolygonOffset\n};\n\nexport { RESOLVE_COINCIDENT_TOPOLOGY_MODE, otherStaticMethods as default, getResolveCoincidentTopology, getResolveCoincidentTopologyAsString, getResolveCoincidentTopologyPolygonOffsetFaces, setResolveCoincidentTopology, setResolveCoincidentTopologyPolygonOffsetFaces, setResolveCoincidentTopologyToDefault, setResolveCoincidentTopologyToOff, setResolveCoincidentTopologyToPolygonOffset };\n","import otherStaticMethods from './Static.js';\nimport macro from '../../../macros.js';\n\n/* eslint-disable arrow-body-style */\n\nfunction addCoincidentTopologyMethods(publicAPI, model, nameList) {\n nameList.forEach(function (item) {\n publicAPI[\"get\".concat(item.method)] = function () {\n return model[item.key];\n };\n\n publicAPI[\"set\".concat(item.method)] = function (factor, offset) {\n model[item.key] = {\n factor: factor,\n offset: offset\n };\n };\n });\n}\n\nvar CATEGORIES = ['Polygon', 'Line', 'Point']; // CoincidentTopology static methods ------------------------------------------\n\nvar staticOffsetModel = {\n Polygon: {\n factor: 2,\n offset: 0\n },\n Line: {\n factor: 1,\n offset: -1\n },\n Point: {\n factor: 0,\n offset: -2\n }\n};\nvar staticOffsetAPI = {};\naddCoincidentTopologyMethods(staticOffsetAPI, staticOffsetModel, CATEGORIES.map(function (key) {\n return {\n key: key,\n method: \"ResolveCoincidentTopology\".concat(key, \"OffsetParameters\")\n };\n}));\n\nfunction implementCoincidentTopologyMethods(publicAPI, model) {\n if (model.resolveCoincidentTopology === undefined) {\n model.resolveCoincidentTopology = false;\n }\n\n macro.setGet(publicAPI, model, ['resolveCoincidentTopology']); // Relative methods\n\n model.topologyOffset = {\n Polygon: {\n factor: 0,\n offset: 0\n },\n Line: {\n factor: 0,\n offset: 0\n },\n Point: {\n factor: 0,\n offset: 0\n }\n }; // Add Static methods to our instance\n\n Object.keys(otherStaticMethods).forEach(function (methodName) {\n publicAPI[methodName] = otherStaticMethods[methodName];\n });\n Object.keys(staticOffsetAPI).forEach(function (methodName) {\n publicAPI[methodName] = staticOffsetAPI[methodName];\n });\n addCoincidentTopologyMethods(publicAPI, model.topologyOffset, CATEGORIES.map(function (key) {\n return {\n key: key,\n method: \"RelativeCoincidentTopology\".concat(key, \"OffsetParameters\")\n };\n }));\n\n publicAPI.getCoincidentTopologyPolygonOffsetParameters = function () {\n var globalValue = staticOffsetAPI.getResolveCoincidentTopologyPolygonOffsetParameters();\n var localValue = publicAPI.getRelativeCoincidentTopologyPolygonOffsetParameters();\n return {\n factor: globalValue.factor + localValue.factor,\n offset: globalValue.offset + localValue.offset\n };\n };\n\n publicAPI.getCoincidentTopologyLineOffsetParameters = function () {\n var globalValue = staticOffsetAPI.getResolveCoincidentTopologyLineOffsetParameters();\n var localValue = publicAPI.getRelativeCoincidentTopologyLineOffsetParameters();\n return {\n factor: globalValue.factor + localValue.factor,\n offset: globalValue.offset + localValue.offset\n };\n };\n\n publicAPI.getCoincidentTopologyPointOffsetParameter = function () {\n var globalValue = staticOffsetAPI.getResolveCoincidentTopologyPointOffsetParameters();\n var localValue = publicAPI.getRelativeCoincidentTopologyPointOffsetParameters();\n return {\n factor: globalValue.factor + localValue.factor,\n offset: globalValue.offset + localValue.offset\n };\n };\n}\n\nvar CoincidentTopologyHelper = {\n implementCoincidentTopologyMethods: implementCoincidentTopologyMethods,\n staticOffsetAPI: staticOffsetAPI,\n otherStaticMethods: otherStaticMethods,\n CATEGORIES: CATEGORIES\n};\n\nexport { CATEGORIES, CoincidentTopologyHelper as default };\n","var ColorMode = {\n DEFAULT: 0,\n MAP_SCALARS: 1,\n DIRECT_SCALARS: 2\n};\nvar ScalarMode = {\n DEFAULT: 0,\n USE_POINT_DATA: 1,\n USE_CELL_DATA: 2,\n USE_POINT_FIELD_DATA: 3,\n USE_CELL_FIELD_DATA: 4,\n USE_FIELD_DATA: 5\n};\nvar GetArray = {\n BY_ID: 0,\n BY_NAME: 1\n};\nvar Constants = {\n ColorMode: ColorMode,\n GetArray: GetArray,\n ScalarMode: ScalarMode\n};\n\nexport { ColorMode, GetArray, ScalarMode, Constants as default };\n","var CoordinateSystem = {\n DISPLAY: 0,\n WORLD: 1\n};\nvar Constants = {\n CoordinateSystem: CoordinateSystem\n};\n\nexport { CoordinateSystem, Constants as default };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport macro from '../../macros.js';\nimport Constants from './Prop/Constants.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nvar CoordinateSystem = Constants.CoordinateSystem;\n\nfunction notImplemented(method) {\n return function () {\n return macro.vtkErrorMacro(\"vtkProp::\".concat(method, \" - NOT IMPLEMENTED\"));\n };\n} // ----------------------------------------------------------------------------\n// vtkProp methods\n// ----------------------------------------------------------------------------\n\n\nfunction vtkProp(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkProp');\n\n publicAPI.getMTime = function () {\n var m1 = model.mtime;\n\n for (var index = 0; index < model.textures.length; ++index) {\n var m2 = model.textures[index].getMTime();\n\n if (m2 > m1) {\n m1 = m2;\n }\n }\n\n return m1;\n };\n\n publicAPI.processSelectorPixelBuffers = function (selector, pixeloffsets) {};\n\n publicAPI.getNestedProps = function () {\n return null;\n };\n\n publicAPI.getActors = function () {\n return [];\n };\n\n publicAPI.getActors2D = function () {\n return [];\n };\n\n publicAPI.getVolumes = function () {\n return [];\n };\n\n publicAPI.pick = notImplemented('pick');\n publicAPI.hasKey = notImplemented('hasKey');\n\n publicAPI.getNestedVisibility = function () {\n return model.visibility && (!model._parentProp || model._parentProp.getNestedVisibility());\n };\n\n publicAPI.getNestedPickable = function () {\n return model.pickable && (!model._parentProp || model._parentProp.getNestedPickable());\n };\n\n publicAPI.getNestedDragable = function () {\n return model.dragable && (!model._parentProp || model._parentProp.getNestedDragable());\n };\n\n publicAPI.getRedrawMTime = function () {\n return model.mtime;\n };\n\n publicAPI.setEstimatedRenderTime = function (t) {\n model.estimatedRenderTime = t;\n model.savedEstimatedRenderTime = t;\n };\n\n publicAPI.restoreEstimatedRenderTime = function () {\n model.estimatedRenderTime = model.savedEstimatedRenderTime;\n };\n\n publicAPI.addEstimatedRenderTime = function (t) {\n model.estimatedRenderTime += t;\n };\n\n publicAPI.setAllocatedRenderTime = function (t) {\n model.allocatedRenderTime = t;\n model.savedEstimatedRenderTime = model.estimatedRenderTime;\n model.estimatedRenderTime = 0;\n };\n\n publicAPI.getSupportsSelection = function () {\n return false;\n };\n\n publicAPI.getTextures = function () {\n return model.textures;\n };\n\n publicAPI.hasTexture = function (texture) {\n return model.textures.indexOf(texture) !== -1;\n };\n\n publicAPI.addTexture = function (texture) {\n if (texture && !publicAPI.hasTexture(texture)) {\n model.textures = model.textures.concat(texture);\n publicAPI.modified();\n }\n };\n\n publicAPI.removeTexture = function (texture) {\n var newTextureList = model.textures.filter(function (item) {\n return item !== texture;\n });\n\n if (model.textures.length !== newTextureList.length) {\n model.textures = newTextureList;\n publicAPI.modified();\n }\n };\n\n publicAPI.removeAllTextures = function () {\n model.textures = [];\n publicAPI.modified();\n }; // not all mappers support all coordinate systems\n\n\n publicAPI.setCoordinateSystemToWorld = function () {\n return publicAPI.setCoordinateSystem(CoordinateSystem.WORLD);\n };\n\n publicAPI.setCoordinateSystemToDisplay = function () {\n return publicAPI.setCoordinateSystem(CoordinateSystem.DISPLAY);\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n // _parentProp: null,\n allocatedRenderTime: 10,\n coordinateSystem: CoordinateSystem.WORLD,\n dragable: true,\n estimatedRenderTime: 0,\n paths: null,\n pickable: true,\n renderTimeMultiplier: 1,\n savedEstimatedRenderTime: 0,\n textures: [],\n useBounds: true,\n visibility: true\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Build VTK API\n\n macro.obj(publicAPI, model);\n macro.get(publicAPI, model, ['estimatedRenderTime', 'allocatedRenderTime']);\n macro.setGet(publicAPI, model, ['_parentProp', 'coordinateSystem', 'dragable', 'pickable', 'renderTimeMultiplier', 'useBounds', 'visibility']);\n macro.moveToProtected(publicAPI, model, ['parentProp']); // Object methods\n\n vtkProp(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkProp'); // ----------------------------------------------------------------------------\n\nvar vtkProp$1 = _objectSpread({\n newInstance: newInstance,\n extend: extend\n}, Constants);\n\nexport { vtkProp$1 as default, extend, newInstance };\n","import { mat4, quat } from 'gl-matrix';\nimport macro from '../../macros.js';\nimport vtkBoundingBox from '../../Common/DataModel/BoundingBox.js';\nimport { A as degreesFromRadians, r as radiansFromDegrees, a as areMatricesEqual } from '../../Common/Core/Math/index.js';\nimport vtkProp from './Prop.js';\n\n// vtkProp3D methods\n// ----------------------------------------------------------------------------\n\nfunction vtkProp3D(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkProp3D');\n\n publicAPI.addPosition = function (deltaXYZ) {\n model.position = model.position.map(function (value, index) {\n return value + deltaXYZ[index];\n });\n publicAPI.modified();\n };\n\n publicAPI.getOrientationWXYZ = function () {\n var q = quat.create();\n mat4.getRotation(q, model.rotation);\n var oaxis = new Float64Array(3);\n var w = quat.getAxisAngle(oaxis, q);\n return [degreesFromRadians(w), oaxis[0], oaxis[1], oaxis[2]];\n };\n\n publicAPI.rotateX = function (val) {\n if (val === 0.0) {\n return;\n }\n\n mat4.rotateX(model.rotation, model.rotation, radiansFromDegrees(val));\n publicAPI.modified();\n };\n\n publicAPI.rotateY = function (val) {\n if (val === 0.0) {\n return;\n }\n\n mat4.rotateY(model.rotation, model.rotation, radiansFromDegrees(val));\n publicAPI.modified();\n };\n\n publicAPI.rotateZ = function (val) {\n if (val === 0.0) {\n return;\n }\n\n mat4.rotateZ(model.rotation, model.rotation, radiansFromDegrees(val));\n publicAPI.modified();\n };\n\n publicAPI.rotateWXYZ = function (degrees, x, y, z) {\n if (degrees === 0.0 || x === 0.0 && y === 0.0 && z === 0.0) {\n return;\n } // convert to radians\n\n\n var angle = radiansFromDegrees(degrees);\n var q = quat.create();\n quat.setAxisAngle(q, [x, y, z], angle);\n var quatMat = new Float64Array(16);\n mat4.fromQuat(quatMat, q);\n mat4.multiply(model.rotation, model.rotation, quatMat);\n publicAPI.modified();\n };\n\n publicAPI.setOrientation = function (x, y, z) {\n if (x === model.orientation[0] && y === model.orientation[1] && z === model.orientation[2]) {\n return false;\n }\n\n model.orientation = [x, y, z];\n mat4.identity(model.rotation);\n publicAPI.rotateZ(z);\n publicAPI.rotateX(x);\n publicAPI.rotateY(y);\n publicAPI.modified();\n return true;\n };\n\n publicAPI.setUserMatrix = function (matrix) {\n if (areMatricesEqual(model.userMatrix, matrix)) {\n return false;\n }\n\n mat4.copy(model.userMatrix, matrix);\n publicAPI.modified();\n return true;\n };\n\n publicAPI.getMatrix = function () {\n publicAPI.computeMatrix();\n return model.matrix;\n };\n\n publicAPI.computeMatrix = function () {\n // check whether or not need to rebuild the matrix\n if (publicAPI.getMTime() > model.matrixMTime.getMTime()) {\n mat4.identity(model.matrix);\n\n if (model.userMatrix) {\n mat4.multiply(model.matrix, model.matrix, model.userMatrix);\n }\n\n mat4.translate(model.matrix, model.matrix, model.origin);\n mat4.translate(model.matrix, model.matrix, model.position);\n mat4.multiply(model.matrix, model.matrix, model.rotation);\n mat4.scale(model.matrix, model.matrix, model.scale);\n mat4.translate(model.matrix, model.matrix, [-model.origin[0], -model.origin[1], -model.origin[2]]);\n mat4.transpose(model.matrix, model.matrix); // check for identity\n\n model.isIdentity = true;\n\n for (var i = 0; i < 4; ++i) {\n for (var j = 0; j < 4; ++j) {\n if ((i === j ? 1.0 : 0.0) !== model.matrix[i + j * 4]) {\n model.isIdentity = false;\n }\n }\n }\n\n model.matrixMTime.modified();\n }\n };\n\n publicAPI.getCenter = function () {\n return vtkBoundingBox.getCenter(model.bounds);\n };\n\n publicAPI.getLength = function () {\n return vtkBoundingBox.getLength(model.bounds);\n };\n\n publicAPI.getXRange = function () {\n return vtkBoundingBox.getXRange(model.bounds);\n };\n\n publicAPI.getYRange = function () {\n return vtkBoundingBox.getYRange(model.bounds);\n };\n\n publicAPI.getZRange = function () {\n return vtkBoundingBox.getZRange(model.bounds);\n };\n\n publicAPI.getUserMatrix = function () {\n return model.userMatrix;\n };\n\n function updateIdentityFlag() {\n publicAPI.computeMatrix();\n }\n\n publicAPI.onModified(updateIdentityFlag);\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n origin: [0, 0, 0],\n position: [0, 0, 0],\n orientation: [0, 0, 0],\n rotation: null,\n scale: [1, 1, 1],\n bounds: [1, -1, 1, -1, 1, -1],\n userMatrix: null,\n userMatrixMTime: null,\n cachedProp3D: null,\n isIdentity: true,\n matrixMTime: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkProp.extend(publicAPI, model, initialValues);\n model.matrixMTime = {};\n macro.obj(model.matrixMTime); // Build VTK API\n\n macro.get(publicAPI, model, ['bounds', 'isIdentity']);\n macro.getArray(publicAPI, model, ['orientation']);\n macro.setGetArray(publicAPI, model, ['origin', 'position', 'scale'], 3); // Object internal instance\n\n model.matrix = mat4.identity(new Float64Array(16));\n model.rotation = mat4.identity(new Float64Array(16));\n model.userMatrix = mat4.identity(new Float64Array(16));\n model.transform = null; // FIXME\n // Object methods\n\n vtkProp3D(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkProp3D'); // ----------------------------------------------------------------------------\n\nvar vtkProp3D$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkProp3D$1 as default, extend, newInstance };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport macro from '../../macros.js';\nimport PropertyConst from './Property/Constants.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nvar Representation = PropertyConst.Representation,\n Interpolation = PropertyConst.Interpolation;\n\nfunction notImplemented(method) {\n return function () {\n return macro.vtkErrorMacro(\"vtkProperty::\".concat(method, \" - NOT IMPLEMENTED\"));\n };\n} // ----------------------------------------------------------------------------\n// vtkProperty methods\n// ----------------------------------------------------------------------------\n\n\nfunction vtkProperty(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkProperty');\n\n publicAPI.setColor = function (r, g, b) {\n if (Array.isArray(r)) {\n if (model.color[0] !== r[0] || model.color[1] !== r[1] || model.color[2] !== r[2]) {\n model.color[0] = r[0];\n model.color[1] = r[1];\n model.color[2] = r[2];\n publicAPI.modified();\n }\n } else if (model.color[0] !== r || model.color[1] !== g || model.color[2] !== b) {\n model.color[0] = r;\n model.color[1] = g;\n model.color[2] = b;\n publicAPI.modified();\n }\n\n publicAPI.setDiffuseColor(model.color);\n publicAPI.setAmbientColor(model.color);\n publicAPI.setSpecularColor(model.color);\n };\n\n publicAPI.computeCompositeColor = notImplemented('ComputeCompositeColor');\n\n publicAPI.getColor = function () {\n // Inline computeCompositeColor\n var norm = 0.0;\n\n if (model.ambient + model.diffuse + model.specular > 0) {\n norm = 1.0 / (model.ambient + model.diffuse + model.specular);\n }\n\n for (var i = 0; i < 3; i++) {\n model.color[i] = norm * (model.ambient * model.ambientColor[i] + model.diffuse * model.diffuseColor[i] + model.specular * model.specularColor[i]);\n }\n\n return [].concat(model.color);\n };\n\n publicAPI.setSpecularPower = function (specularPower) {\n var roughness = 1 / Math.max(1.0, specularPower);\n\n if (model.roughness !== roughness || model.specularPower !== specularPower) {\n model.specularPower = specularPower; // Specular power still needs to be set as long as webgl is using it (otherwise testShaderReplacementsClear fails)\n\n model.roughness = roughness;\n publicAPI.modified();\n }\n };\n\n publicAPI.addShaderVariable = notImplemented('AddShaderVariable');\n\n publicAPI.setInterpolationToFlat = function () {\n return publicAPI.setInterpolation(Interpolation.FLAT);\n };\n\n publicAPI.setInterpolationToGouraud = function () {\n return publicAPI.setInterpolation(Interpolation.GOURAUD);\n };\n\n publicAPI.setInterpolationToPhong = function () {\n return publicAPI.setInterpolation(Interpolation.PHONG);\n };\n\n publicAPI.getInterpolationAsString = function () {\n return macro.enumToString(Interpolation, model.interpolation);\n };\n\n publicAPI.setRepresentationToWireframe = function () {\n return publicAPI.setRepresentation(Representation.WIREFRAME);\n };\n\n publicAPI.setRepresentationToSurface = function () {\n return publicAPI.setRepresentation(Representation.SURFACE);\n };\n\n publicAPI.setRepresentationToPoints = function () {\n return publicAPI.setRepresentation(Representation.POINTS);\n };\n\n publicAPI.getRepresentationAsString = function () {\n return macro.enumToString(Representation, model.representation);\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n color: [1, 1, 1],\n ambientColor: [1, 1, 1],\n diffuseColor: [1, 1, 1],\n specularColor: [1, 1, 1],\n edgeColor: [0, 0, 0],\n ambient: 0,\n diffuse: 1,\n metallic: 0,\n roughness: 0.6,\n normalStrength: 1,\n emission: 1,\n baseIOR: 1.45,\n specular: 0,\n specularPower: 1,\n opacity: 1,\n interpolation: Interpolation.GOURAUD,\n representation: Representation.SURFACE,\n edgeVisibility: false,\n backfaceCulling: false,\n frontfaceCulling: false,\n pointSize: 1,\n lineWidth: 1,\n lighting: true,\n shading: false,\n materialName: null\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Build VTK API\n\n macro.obj(publicAPI, model);\n macro.setGet(publicAPI, model, ['lighting', 'interpolation', 'ambient', 'diffuse', 'metallic', 'roughness', 'normalStrength', 'emission', 'baseIOR', 'specular', 'specularPower', 'opacity', 'edgeVisibility', 'lineWidth', 'pointSize', 'backfaceCulling', 'frontfaceCulling', 'representation', 'diffuseTexture', 'metallicTexture', 'roughnessTexture', 'normalTexture', 'ambientOcclusionTexture', 'emissionTexture']);\n macro.setGetArray(publicAPI, model, ['ambientColor', 'specularColor', 'diffuseColor', 'edgeColor'], 3); // Object methods\n\n vtkProperty(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkProperty'); // ----------------------------------------------------------------------------\n\nvar vtkProperty$1 = _objectSpread({\n newInstance: newInstance,\n extend: extend\n}, PropertyConst);\n\nexport { vtkProperty$1 as default, extend, newInstance };\n","var Shading = {\n FLAT: 0,\n GOURAUD: 1,\n PHONG: 2\n};\nvar Representation = {\n POINTS: 0,\n WIREFRAME: 1,\n SURFACE: 2\n};\nvar Interpolation = Shading;\nvar PropertyConst = {\n Shading: Shading,\n Representation: Representation,\n Interpolation: Interpolation\n};\n\nexport { Interpolation, Representation, Shading, PropertyConst as default };\n","import macro from '../../macros.js';\nimport { l as normalize, r as radiansFromDegrees } from '../../Common/Core/Math/index.js';\nimport { vec3 } from 'gl-matrix';\n\nvar LIGHT_TYPES = ['HeadLight', 'CameraLight', 'SceneLight']; // ----------------------------------------------------------------------------\n// vtkLight methods\n// ----------------------------------------------------------------------------\n\nfunction vtkLight(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkLight');\n var tmpVec = new Float64Array(3);\n\n publicAPI.getTransformedPosition = function () {\n if (model.transformMatrix) {\n vec3.transformMat4(tmpVec, model.position, model.transformMatrix);\n } else {\n vec3.set(tmpVec, model.position[0], model.position[1], model.position[2]);\n }\n\n return tmpVec;\n };\n\n publicAPI.getTransformedFocalPoint = function () {\n if (model.transformMatrix) {\n vec3.transformMat4(tmpVec, model.focalPoint, model.transformMatrix);\n } else {\n vec3.set(tmpVec, model.focalPoint[0], model.focalPoint[1], model.focalPoint[2]);\n }\n\n return tmpVec;\n };\n\n publicAPI.getDirection = function () {\n if (model.directionMTime < model.mtime) {\n vec3.sub(model.direction, model.focalPoint, model.position);\n normalize(model.direction);\n model.directionMTime = model.mtime;\n }\n\n return model.direction;\n }; // Sets the direction from a vec3 instead of a focal point\n\n\n publicAPI.setDirection = function (directionVector) {\n var newFocalPoint = new Float64Array(3);\n vec3.sub(newFocalPoint, model.position, directionVector);\n model.focalPoint = newFocalPoint;\n };\n\n publicAPI.setDirectionAngle = function (elevation, azimuth) {\n var elevationRadians = radiansFromDegrees(elevation);\n var azimuthRadians = radiansFromDegrees(azimuth);\n publicAPI.setPosition(Math.cos(elevationRadians) * Math.sin(azimuthRadians), Math.sin(elevationRadians), Math.cos(elevationRadians) * Math.cos(azimuthRadians));\n publicAPI.setFocalPoint(0, 0, 0);\n publicAPI.setPositional(0);\n };\n\n publicAPI.setLightTypeToHeadLight = function () {\n publicAPI.setLightType('HeadLight');\n };\n\n publicAPI.setLightTypeToCameraLight = function () {\n publicAPI.setLightType('CameraLight');\n };\n\n publicAPI.setLightTypeToSceneLight = function () {\n publicAPI.setTransformMatrix(null);\n publicAPI.setLightType('SceneLight');\n };\n\n publicAPI.lightTypeIsHeadLight = function () {\n return model.lightType === 'HeadLight';\n };\n\n publicAPI.lightTypeIsSceneLight = function () {\n return model.lightType === 'SceneLight';\n };\n\n publicAPI.lightTypeIsCameraLight = function () {\n return model.lightType === 'CameraLight';\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n switch: true,\n intensity: 1,\n color: [1, 1, 1],\n position: [0, 0, 1],\n focalPoint: [0, 0, 0],\n positional: false,\n exponent: 1,\n coneAngle: 30,\n coneFalloff: 5,\n attenuationValues: [1, 0, 0],\n transformMatrix: null,\n lightType: 'SceneLight',\n shadowAttenuation: 1,\n direction: [0, 0, 0],\n directionMTime: 0\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Build VTK API\n\n macro.obj(publicAPI, model);\n macro.setGet(publicAPI, model, ['intensity', 'switch', 'positional', 'exponent', 'coneAngle', 'coneFalloff', 'transformMatrix', 'lightType', 'shadowAttenuation', 'attenuationValues']);\n macro.setGetArray(publicAPI, model, ['color', 'position', 'focalPoint', 'attenuationValues'], 3); // Object methods\n\n vtkLight(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkLight'); // ----------------------------------------------------------------------------\n\nvar vtkLight$1 = {\n newInstance: newInstance,\n extend: extend,\n LIGHT_TYPES: LIGHT_TYPES\n};\n\nexport { LIGHT_TYPES, vtkLight$1 as default, extend, newInstance };\n","import macro from '../../macros.js';\n\nvar vtkErrorMacro = macro.vtkErrorMacro;\n\nfunction notImplemented(method) {\n return function () {\n return vtkErrorMacro(\"vtkViewport::\".concat(method, \" - NOT IMPLEMENTED\"));\n };\n} // ----------------------------------------------------------------------------\n// vtkViewport methods\n// ----------------------------------------------------------------------------\n\n\nfunction vtkViewport(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkViewport'); // Public API methods\n\n publicAPI.getViewProps = function () {\n return model.props;\n };\n\n publicAPI.hasViewProp = function (prop) {\n return model.props.includes(prop);\n };\n\n publicAPI.addViewProp = function (prop) {\n if (prop && !publicAPI.hasViewProp(prop)) {\n model.props.push(prop);\n }\n };\n\n publicAPI.removeViewProp = function (prop) {\n var newPropList = model.props.filter(function (item) {\n return item !== prop;\n });\n\n if (model.props.length !== newPropList.length) {\n model.props = newPropList;\n }\n };\n\n publicAPI.removeAllViewProps = function () {\n model.props = [];\n }; // this method get all the props including any nested props\n\n\n function gatherProps(prop) {\n var allProps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n allProps.push(prop);\n var children = prop.getNestedProps();\n\n if (children && children.length) {\n for (var i = 0; i < children.length; i++) {\n gatherProps(children[i], allProps);\n }\n }\n\n return allProps;\n }\n\n publicAPI.getViewPropsWithNestedProps = function () {\n var allPropsArray = [];\n\n for (var i = 0; i < model.props.length; i++) {\n gatherProps(model.props[i], allPropsArray);\n }\n\n return allPropsArray;\n };\n\n publicAPI.addActor2D = publicAPI.addViewProp;\n\n publicAPI.removeActor2D = function (prop) {\n // VTK way: model.actors2D.RemoveItem(prop);\n publicAPI.removeViewProp(prop);\n };\n\n publicAPI.getActors2D = function () {\n model.actors2D = [];\n model.props.forEach(function (prop) {\n model.actors2D = model.actors2D.concat(prop.getActors2D());\n });\n return model.actors2D;\n };\n\n publicAPI.displayToView = function () {\n return vtkErrorMacro('call displayToView on your view instead');\n };\n\n publicAPI.viewToDisplay = function () {\n return vtkErrorMacro('callviewtodisplay on your view instead');\n };\n\n publicAPI.getSize = function () {\n return vtkErrorMacro('call getSize on your View instead');\n };\n\n publicAPI.normalizedDisplayToProjection = function (x, y, z) {\n // first to normalized viewport\n var nvp = publicAPI.normalizedDisplayToNormalizedViewport(x, y, z); // then to view\n\n return publicAPI.normalizedViewportToProjection(nvp[0], nvp[1], nvp[2]);\n };\n\n publicAPI.normalizedDisplayToNormalizedViewport = function (x, y, z) {\n var scale = [model.viewport[2] - model.viewport[0], model.viewport[3] - model.viewport[1]];\n return [(x - model.viewport[0]) / scale[0], (y - model.viewport[1]) / scale[1], z];\n };\n\n publicAPI.normalizedViewportToProjection = function (x, y, z) {\n return [x * 2.0 - 1.0, y * 2.0 - 1.0, z * 2.0 - 1.0];\n };\n\n publicAPI.projectionToNormalizedDisplay = function (x, y, z) {\n // first to nvp\n var nvp = publicAPI.projectionToNormalizedViewport(x, y, z); // then to ndp\n\n return publicAPI.normalizedViewportToNormalizedDisplay(nvp[0], nvp[1], nvp[2]);\n };\n\n publicAPI.normalizedViewportToNormalizedDisplay = function (x, y, z) {\n var scale = [model.viewport[2] - model.viewport[0], model.viewport[3] - model.viewport[1]];\n return [x * scale[0] + model.viewport[0], y * scale[1] + model.viewport[1], z];\n };\n\n publicAPI.projectionToNormalizedViewport = function (x, y, z) {\n return [(x + 1.0) * 0.5, (y + 1.0) * 0.5, (z + 1.0) * 0.5];\n };\n\n publicAPI.PickPropFrom = notImplemented('PickPropFrom');\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n // _vtkWindow: null,\n background: [0, 0, 0],\n background2: [0.2, 0.2, 0.2],\n gradientBackground: false,\n viewport: [0, 0, 1, 1],\n aspect: [1, 1],\n pixelAspect: [1, 1],\n props: [],\n actors2D: []\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Build VTK API\n\n macro.obj(publicAPI, model);\n macro.event(publicAPI, model, 'event');\n macro.setGetArray(publicAPI, model, ['viewport'], 4);\n macro.setGetArray(publicAPI, model, ['background', 'background2'], 3);\n vtkViewport(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkViewport'); // ----------------------------------------------------------------------------\n\nvar vtkViewport$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkViewport$1 as default, extend, newInstance };\n","import { mat4, vec3 } from 'gl-matrix';\nimport { newInstance as newInstance$1, get, setGet, getArray, setGetArray, moveToProtected, vtkDebugMacro as vtkDebugMacro$1, vtkErrorMacro as vtkErrorMacro$1, vtkWarningMacro as vtkWarningMacro$1 } from '../../macros.js';\nimport vtkCamera from './Camera.js';\nimport vtkLight from './Light.js';\nimport { P as areBoundsInitialized, u as uninitializeBounds, r as radiansFromDegrees, d as dot, N as createUninitializedBounds } from '../../Common/Core/Math/index.js';\nimport vtkViewport from './Viewport.js';\nimport vtkBoundingBox from '../../Common/DataModel/BoundingBox.js';\n\nvar vtkDebugMacro = vtkDebugMacro$1,\n vtkErrorMacro = vtkErrorMacro$1,\n vtkWarningMacro = vtkWarningMacro$1;\n\nfunction notImplemented(method) {\n return function () {\n return vtkErrorMacro(\"vtkRenderer::\".concat(method, \" - NOT IMPLEMENTED\"));\n };\n} // ----------------------------------------------------------------------------\n// vtkRenderer methods\n// ----------------------------------------------------------------------------\n\n\nfunction vtkRenderer(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkRenderer'); // Events\n\n var COMPUTE_VISIBLE_PROP_BOUNDS_EVENT = {\n type: 'ComputeVisiblePropBoundsEvent',\n renderer: publicAPI\n };\n var RESET_CAMERA_CLIPPING_RANGE_EVENT = {\n type: 'ResetCameraClippingRangeEvent',\n renderer: publicAPI\n };\n var RESET_CAMERA_EVENT = {\n type: 'ResetCameraEvent',\n renderer: publicAPI\n };\n\n publicAPI.updateCamera = function () {\n if (!model.activeCamera) {\n vtkDebugMacro('No cameras are on, creating one.'); // the get method will automagically create a camera\n // and reset it since one hasn't been specified yet.\n\n publicAPI.getActiveCameraAndResetIfCreated();\n } // update the viewing transformation\n\n\n model.activeCamera.render(publicAPI);\n return true;\n };\n\n publicAPI.updateLightsGeometryToFollowCamera = function () {\n // only update the light's geometry if this Renderer is tracking\n // this lights. That allows one renderer to view the lights that\n // another renderer is setting up.\n var camera = publicAPI.getActiveCameraAndResetIfCreated();\n model.lights.forEach(function (light) {\n if (light.lightTypeIsSceneLight()) ; else if (light.lightTypeIsHeadLight()) {\n // update position and orientation of light to match camera.\n light.setPositionFrom(camera.getPositionByReference());\n light.setFocalPointFrom(camera.getFocalPointByReference());\n light.modified(camera.getMTime());\n } else if (light.lightTypeIsCameraLight()) {\n light.setTransformMatrix(camera.getCameraLightTransformMatrix(mat4.create()));\n } else {\n vtkErrorMacro('light has unknown light type', light.get());\n }\n });\n };\n\n publicAPI.updateLightGeometry = function () {\n if (model.lightFollowCamera) {\n // only update the light's geometry if this Renderer is tracking\n // this lights. That allows one renderer to view the lights that\n // another renderer is setting up.\n return publicAPI.updateLightsGeometryToFollowCamera();\n }\n\n return true;\n };\n\n publicAPI.allocateTime = notImplemented('allocateTime');\n publicAPI.updateGeometry = notImplemented('updateGeometry');\n\n publicAPI.getVTKWindow = function () {\n return model._renderWindow;\n };\n\n publicAPI.setLayer = function (layer) {\n vtkDebugMacro(publicAPI.getClassName(), publicAPI, 'setting Layer to ', layer);\n\n if (model.layer !== layer) {\n model.layer = layer;\n publicAPI.modified();\n }\n\n publicAPI.setPreserveColorBuffer(!!layer);\n };\n\n publicAPI.setActiveCamera = function (camera) {\n if (model.activeCamera === camera) {\n return false;\n }\n\n model.activeCamera = camera;\n publicAPI.modified();\n publicAPI.invokeEvent({\n type: 'ActiveCameraEvent',\n camera: camera\n });\n return true;\n };\n\n publicAPI.makeCamera = function () {\n var camera = vtkCamera.newInstance();\n publicAPI.invokeEvent({\n type: 'CreateCameraEvent',\n camera: camera\n });\n return camera;\n }; // Replace the set/get macro method\n\n\n publicAPI.getActiveCamera = function () {\n if (!model.activeCamera) {\n model.activeCamera = publicAPI.makeCamera();\n }\n\n return model.activeCamera;\n };\n\n publicAPI.getActiveCameraAndResetIfCreated = function () {\n if (!model.activeCamera) {\n publicAPI.getActiveCamera();\n publicAPI.resetCamera();\n }\n\n return model.activeCamera;\n };\n\n publicAPI.getActors = function () {\n model.actors = [];\n model.props.forEach(function (prop) {\n model.actors = model.actors.concat(prop.getActors());\n });\n return model.actors;\n };\n\n publicAPI.addActor = publicAPI.addViewProp;\n\n publicAPI.removeActor = function (actor) {\n model.actors = model.actors.filter(function (a) {\n return a !== actor;\n });\n publicAPI.removeViewProp(actor);\n publicAPI.modified();\n };\n\n publicAPI.removeAllActors = function () {\n var actors = publicAPI.getActors();\n actors.forEach(function (actor) {\n publicAPI.removeViewProp(actor);\n });\n model.actors = [];\n publicAPI.modified();\n };\n\n publicAPI.getVolumes = function () {\n model.volumes = [];\n model.props.forEach(function (prop) {\n model.volumes = model.volumes.concat(prop.getVolumes());\n });\n return model.volumes;\n };\n\n publicAPI.addVolume = publicAPI.addViewProp;\n\n publicAPI.removeVolume = function (volume) {\n model.volumes = model.volumes.filter(function (v) {\n return v !== volume;\n });\n publicAPI.removeViewProp(volume);\n publicAPI.modified();\n };\n\n publicAPI.removeAllVolumes = function () {\n var volumes = publicAPI.getVolumes();\n volumes.forEach(function (volume) {\n publicAPI.removeViewProp(volume);\n });\n model.volumes = [];\n publicAPI.modified();\n };\n\n publicAPI.hasLight = function (light) {\n return model.lights.includes(light);\n };\n\n publicAPI.addLight = function (light) {\n if (light && !publicAPI.hasLight(light)) {\n model.lights.push(light);\n publicAPI.modified();\n }\n };\n\n publicAPI.removeLight = function (light) {\n model.lights = model.lights.filter(function (l) {\n return l !== light;\n });\n publicAPI.modified();\n };\n\n publicAPI.removeAllLights = function () {\n model.lights = [];\n publicAPI.modified();\n };\n\n publicAPI.setLightCollection = function (lights) {\n model.lights = lights;\n publicAPI.modified();\n };\n\n publicAPI.makeLight = vtkLight.newInstance;\n\n publicAPI.createLight = function () {\n if (!model.automaticLightCreation) {\n return;\n }\n\n if (model._createdLight) {\n publicAPI.removeLight(model._createdLight);\n\n model._createdLight.delete();\n\n model._createdLight = null;\n }\n\n model._createdLight = publicAPI.makeLight();\n publicAPI.addLight(model._createdLight);\n\n model._createdLight.setLightTypeToHeadLight(); // set these values just to have a good default should LightFollowCamera\n // be turned off.\n\n\n model._createdLight.setPosition(publicAPI.getActiveCamera().getPosition());\n\n model._createdLight.setFocalPoint(publicAPI.getActiveCamera().getFocalPoint());\n }; // requires the aspect ratio of the viewport as X/Y\n\n\n publicAPI.normalizedDisplayToWorld = function (x, y, z, aspect) {\n var vpd = publicAPI.normalizedDisplayToProjection(x, y, z);\n vpd = publicAPI.projectionToView(vpd[0], vpd[1], vpd[2], aspect);\n return publicAPI.viewToWorld(vpd[0], vpd[1], vpd[2]);\n }; // requires the aspect ratio of the viewport as X/Y\n\n\n publicAPI.worldToNormalizedDisplay = function (x, y, z, aspect) {\n var vpd = publicAPI.worldToView(x, y, z);\n vpd = publicAPI.viewToProjection(vpd[0], vpd[1], vpd[2], aspect);\n return publicAPI.projectionToNormalizedDisplay(vpd[0], vpd[1], vpd[2]);\n }; // requires the aspect ratio of the viewport as X/Y\n\n\n publicAPI.viewToWorld = function (x, y, z) {\n if (model.activeCamera === null) {\n vtkErrorMacro('ViewToWorld: no active camera, cannot compute view to world, returning 0,0,0');\n return [0, 0, 0];\n } // get the view matrix from the active camera\n\n\n var matrix = model.activeCamera.getViewMatrix();\n mat4.invert(matrix, matrix);\n mat4.transpose(matrix, matrix); // Transform point to world coordinates\n\n var result = new Float64Array([x, y, z]);\n vec3.transformMat4(result, result, matrix);\n return result;\n };\n\n publicAPI.projectionToView = function (x, y, z, aspect) {\n if (model.activeCamera === null) {\n vtkErrorMacro('ProjectionToView: no active camera, cannot compute projection to view, returning 0,0,0');\n return [0, 0, 0];\n } // get the projection transformation from the active camera\n\n\n var matrix = model.activeCamera.getProjectionMatrix(aspect, -1.0, 1.0);\n mat4.invert(matrix, matrix);\n mat4.transpose(matrix, matrix); // Transform point to world coordinates\n\n var result = new Float64Array([x, y, z]);\n vec3.transformMat4(result, result, matrix);\n return result;\n }; // Convert world point coordinates to view coordinates.\n\n\n publicAPI.worldToView = function (x, y, z) {\n if (model.activeCamera === null) {\n vtkErrorMacro('WorldToView: no active camera, cannot compute view to world, returning 0,0,0');\n return [0, 0, 0];\n } // get the view transformation from the active camera\n\n\n var matrix = model.activeCamera.getViewMatrix();\n mat4.transpose(matrix, matrix);\n var result = new Float64Array([x, y, z]);\n vec3.transformMat4(result, result, matrix);\n return result;\n }; // Convert world point coordinates to view coordinates.\n // requires the aspect ratio of the viewport as X/Y\n\n\n publicAPI.viewToProjection = function (x, y, z, aspect) {\n if (model.activeCamera === null) {\n vtkErrorMacro('ViewToProjection: no active camera, cannot compute view to projection, returning 0,0,0');\n return [0, 0, 0];\n } // get the projeciton transformation from the active camera\n\n\n var matrix = model.activeCamera.getProjectionMatrix(aspect, -1.0, 1.0);\n mat4.transpose(matrix, matrix);\n var result = new Float64Array([x, y, z]);\n vec3.transformMat4(result, result, matrix);\n return result;\n };\n\n publicAPI.computeVisiblePropBounds = function () {\n model.allBounds[0] = vtkBoundingBox.INIT_BOUNDS[0];\n model.allBounds[1] = vtkBoundingBox.INIT_BOUNDS[1];\n model.allBounds[2] = vtkBoundingBox.INIT_BOUNDS[2];\n model.allBounds[3] = vtkBoundingBox.INIT_BOUNDS[3];\n model.allBounds[4] = vtkBoundingBox.INIT_BOUNDS[4];\n model.allBounds[5] = vtkBoundingBox.INIT_BOUNDS[5];\n var nothingVisible = true;\n publicAPI.invokeEvent(COMPUTE_VISIBLE_PROP_BOUNDS_EVENT); // loop through all props\n\n for (var index = 0; index < model.props.length; ++index) {\n var prop = model.props[index];\n\n if (prop.getVisibility() && prop.getUseBounds()) {\n var bounds = prop.getBounds();\n\n if (bounds && areBoundsInitialized(bounds)) {\n nothingVisible = false;\n\n if (bounds[0] < model.allBounds[0]) {\n model.allBounds[0] = bounds[0];\n }\n\n if (bounds[1] > model.allBounds[1]) {\n model.allBounds[1] = bounds[1];\n }\n\n if (bounds[2] < model.allBounds[2]) {\n model.allBounds[2] = bounds[2];\n }\n\n if (bounds[3] > model.allBounds[3]) {\n model.allBounds[3] = bounds[3];\n }\n\n if (bounds[4] < model.allBounds[4]) {\n model.allBounds[4] = bounds[4];\n }\n\n if (bounds[5] > model.allBounds[5]) {\n model.allBounds[5] = bounds[5];\n }\n }\n }\n }\n\n if (nothingVisible) {\n uninitializeBounds(model.allBounds);\n vtkDebugMacro(\"Can't compute bounds, no 3D props are visible\");\n }\n\n return model.allBounds;\n };\n\n publicAPI.resetCamera = function () {\n var bounds = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n var boundsToUse = bounds || publicAPI.computeVisiblePropBounds();\n var center = [0, 0, 0];\n\n if (!areBoundsInitialized(boundsToUse)) {\n vtkDebugMacro('Cannot reset camera!');\n return false;\n }\n\n var vn = null;\n\n if (publicAPI.getActiveCamera()) {\n vn = model.activeCamera.getViewPlaneNormal();\n } else {\n vtkErrorMacro('Trying to reset non-existent camera');\n return false;\n } // Reset the perspective zoom factors, otherwise subsequent zooms will cause\n // the view angle to become very small and cause bad depth sorting.\n\n\n model.activeCamera.setViewAngle(30.0);\n center[0] = (boundsToUse[0] + boundsToUse[1]) / 2.0;\n center[1] = (boundsToUse[2] + boundsToUse[3]) / 2.0;\n center[2] = (boundsToUse[4] + boundsToUse[5]) / 2.0;\n var w1 = boundsToUse[1] - boundsToUse[0];\n var w2 = boundsToUse[3] - boundsToUse[2];\n var w3 = boundsToUse[5] - boundsToUse[4];\n w1 *= w1;\n w2 *= w2;\n w3 *= w3;\n var radius = w1 + w2 + w3; // If we have just a single point, pick a radius of 1.0\n\n radius = radius === 0 ? 1.0 : radius; // compute the radius of the enclosing sphere\n\n radius = Math.sqrt(radius) * 0.5; // default so that the bounding sphere fits within the view fustrum\n // compute the distance from the intersection of the view frustum with the\n // bounding sphere. Basically in 2D draw a circle representing the bounding\n // sphere in 2D then draw a horizontal line going out from the center of\n // the circle. That is the camera view. Then draw a line from the camera\n // position to the point where it intersects the circle. (it will be tangent\n // to the circle at this point, this is important, only go to the tangent\n // point, do not draw all the way to the view plane). Then draw the radius\n // from the tangent point to the center of the circle. You will note that\n // this forms a right triangle with one side being the radius, another being\n // the target distance for the camera, then just find the target dist using\n // a sin.\n\n var angle = radiansFromDegrees(model.activeCamera.getViewAngle());\n var parallelScale = radius;\n var distance = radius / Math.sin(angle * 0.5); // check view-up vector against view plane normal\n\n var vup = model.activeCamera.getViewUp();\n\n if (Math.abs(dot(vup, vn)) > 0.999) {\n vtkWarningMacro('Resetting view-up since view plane normal is parallel');\n model.activeCamera.setViewUp(-vup[2], vup[0], vup[1]);\n } // update the camera\n\n\n model.activeCamera.setFocalPoint(center[0], center[1], center[2]);\n model.activeCamera.setPosition(center[0] + distance * vn[0], center[1] + distance * vn[1], center[2] + distance * vn[2]);\n publicAPI.resetCameraClippingRange(boundsToUse); // setup default parallel scale\n\n model.activeCamera.setParallelScale(parallelScale); // update reasonable world to physical values\n\n model.activeCamera.setPhysicalScale(radius);\n model.activeCamera.setPhysicalTranslation(-center[0], -center[1], -center[2]); // Here to let parallel/distributed compositing intercept\n // and do the right thing.\n\n publicAPI.invokeEvent(RESET_CAMERA_EVENT);\n return true;\n };\n\n publicAPI.resetCameraClippingRange = function () {\n var bounds = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n var boundsToUse = bounds || publicAPI.computeVisiblePropBounds();\n\n if (!areBoundsInitialized(boundsToUse)) {\n vtkDebugMacro('Cannot reset camera clipping range!');\n return false;\n } // Make sure we have an active camera\n\n\n publicAPI.getActiveCameraAndResetIfCreated();\n\n if (!model.activeCamera) {\n vtkErrorMacro('Trying to reset clipping range of non-existent camera');\n return false;\n } // Get the exact range for the bounds\n\n\n var range = model.activeCamera.computeClippingRange(boundsToUse); // do not let far - near be less than 0.1 of the window height\n // this is for cases such as 2D images which may have zero range\n\n var minGap = 0.0;\n\n if (model.activeCamera.getParallelProjection()) {\n minGap = 0.2 * model.activeCamera.getParallelScale();\n } else {\n var angle = radiansFromDegrees(model.activeCamera.getViewAngle());\n minGap = 0.2 * Math.tan(angle / 2.0) * range[1];\n }\n\n if (range[1] - range[0] < minGap) {\n minGap = minGap - range[1] + range[0];\n range[1] += minGap / 2.0;\n range[0] -= minGap / 2.0;\n } // Do not let the range behind the camera throw off the calculation.\n\n\n if (range[0] < 0.0) {\n range[0] = 0.0;\n } // Give ourselves a little breathing room\n\n\n range[0] = 0.99 * range[0] - (range[1] - range[0]) * model.clippingRangeExpansion;\n range[1] = 1.01 * range[1] + (range[1] - range[0]) * model.clippingRangeExpansion; // Make sure near is not bigger than far\n\n range[0] = range[0] >= range[1] ? 0.01 * range[1] : range[0]; // Make sure near is at least some fraction of far - this prevents near\n // from being behind the camera or too close in front. How close is too\n // close depends on the resolution of the depth buffer\n\n if (!model.nearClippingPlaneTolerance) {\n model.nearClippingPlaneTolerance = 0.01;\n } // make sure the front clipping range is not too far from the far clippnig\n // range, this is to make sure that the zbuffer resolution is effectively\n // used\n\n\n if (range[0] < model.nearClippingPlaneTolerance * range[1]) {\n range[0] = model.nearClippingPlaneTolerance * range[1];\n }\n\n model.activeCamera.setClippingRange(range[0], range[1]); // Here to let parallel/distributed compositing intercept\n // and do the right thing.\n\n publicAPI.invokeEvent(RESET_CAMERA_CLIPPING_RANGE_EVENT);\n return false;\n };\n\n publicAPI.setRenderWindow = function (renderWindow) {\n if (renderWindow !== model._renderWindow) {\n model._vtkWindow = renderWindow;\n model._renderWindow = renderWindow;\n }\n };\n\n publicAPI.visibleActorCount = function () {\n return model.props.filter(function (prop) {\n return prop.getVisibility();\n }).length;\n };\n\n publicAPI.visibleVolumeCount = publicAPI.visibleActorCount;\n\n publicAPI.getMTime = function () {\n var m1 = model.mtime;\n var m2 = model.activeCamera ? model.activeCamera.getMTime() : 0;\n\n if (m2 > m1) {\n m1 = m2;\n }\n\n var m3 = model._createdLight ? model._createdLight.getMTime() : 0;\n\n if (m3 > m1) {\n m1 = m3;\n }\n\n return m1;\n };\n\n publicAPI.getTransparent = function () {\n return !!model.preserveColorBuffer;\n };\n\n publicAPI.isActiveCameraCreated = function () {\n return !!model.activeCamera;\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n pickedProp: null,\n activeCamera: null,\n allBounds: [],\n ambient: [1, 1, 1],\n allocatedRenderTime: 100,\n timeFactor: 1,\n automaticLightCreation: true,\n twoSidedLighting: true,\n lastRenderTimeInSeconds: -1,\n renderWindow: null,\n lights: [],\n actors: [],\n volumes: [],\n lightFollowCamera: true,\n numberOfPropsRendered: 0,\n propArray: null,\n pathArray: null,\n layer: 0,\n preserveColorBuffer: false,\n preserveDepthBuffer: false,\n computeVisiblePropBounds: createUninitializedBounds(),\n interactive: true,\n nearClippingPlaneTolerance: 0,\n clippingRangeExpansion: 0.05,\n erase: true,\n draw: true,\n useShadows: false,\n useDepthPeeling: false,\n occlusionRatio: 0,\n maximumNumberOfPeels: 4,\n selector: null,\n delegate: null,\n texturedBackground: false,\n backgroundTexture: null,\n environmentTexture: null,\n environmentTextureDiffuseStrength: 1,\n environmentTextureSpecularStrength: 1,\n useEnvironmentTextureAsBackground: false,\n pass: 0\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Inheritance\n\n vtkViewport.extend(publicAPI, model, initialValues); // make sure background has 4 entries. Default to opaque black\n\n if (!model.background) model.background = [0, 0, 0, 1];\n\n while (model.background.length < 3) {\n model.background.push(0);\n }\n\n if (model.background.length === 3) model.background.push(1); // Build VTK API\n\n get(publicAPI, model, ['_renderWindow', 'allocatedRenderTime', 'timeFactor', 'lastRenderTimeInSeconds', 'numberOfPropsRendered', 'lastRenderingUsedDepthPeeling', 'selector']);\n setGet(publicAPI, model, ['twoSidedLighting', 'lightFollowCamera', 'automaticLightCreation', 'erase', 'draw', 'nearClippingPlaneTolerance', 'clippingRangeExpansion', 'backingStore', 'interactive', 'layer', 'preserveColorBuffer', 'preserveDepthBuffer', 'useDepthPeeling', 'occlusionRatio', 'maximumNumberOfPeels', 'delegate', 'backgroundTexture', 'texturedBackground', 'environmentTexture', 'environmentTextureDiffuseStrength', 'environmentTextureSpecularStrength', 'useEnvironmentTextureAsBackground', 'useShadows', 'pass']);\n getArray(publicAPI, model, ['actors', 'volumes', 'lights']);\n setGetArray(publicAPI, model, ['background'], 4, 1.0);\n moveToProtected(publicAPI, model, ['renderWindow']); // Object methods\n\n vtkRenderer(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = newInstance$1(extend, 'vtkRenderer'); // ----------------------------------------------------------------------------\n\nvar vtkRenderer$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkRenderer$1 as default, extend, newInstance };\n","import _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';\nimport macro from '../../macros.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n// vtkTexture methods\n// ----------------------------------------------------------------------------\n\nfunction vtkTexture(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkTexture');\n\n publicAPI.imageLoaded = function () {\n model.image.removeEventListener('load', publicAPI.imageLoaded);\n model.imageLoaded = true;\n publicAPI.modified();\n };\n\n publicAPI.setJsImageData = function (imageData) {\n if (model.jsImageData === imageData) {\n return;\n } // clear other entries\n\n\n if (imageData !== null) {\n publicAPI.setInputData(null);\n publicAPI.setInputConnection(null);\n model.image = null;\n model.canvas = null;\n }\n\n model.jsImageData = imageData;\n model.imageLoaded = true;\n publicAPI.modified();\n };\n\n publicAPI.setCanvas = function (canvas) {\n if (model.canvas === canvas) {\n return;\n } // clear other entries\n\n\n if (canvas !== null) {\n publicAPI.setInputData(null);\n publicAPI.setInputConnection(null);\n model.image = null;\n model.jsImageData = null;\n }\n\n model.canvas = canvas;\n publicAPI.modified();\n };\n\n publicAPI.setImage = function (image) {\n if (model.image === image) {\n return;\n } // clear other entries\n\n\n if (image !== null) {\n publicAPI.setInputData(null);\n publicAPI.setInputConnection(null);\n model.canvas = null;\n model.jsImageData = null;\n }\n\n model.image = image;\n model.imageLoaded = false;\n\n if (image.complete) {\n publicAPI.imageLoaded();\n } else {\n image.addEventListener('load', publicAPI.imageLoaded);\n }\n\n publicAPI.modified();\n };\n\n publicAPI.getDimensionality = function () {\n var width = 0;\n var height = 0;\n var depth = 1;\n\n if (publicAPI.getInputData()) {\n var data = publicAPI.getInputData();\n width = data.getDimensions()[0];\n height = data.getDimensions()[1];\n depth = data.getDimensions()[2];\n }\n\n if (model.jsImageData) {\n width = model.jsImageData.width;\n height = model.jsImageData.height;\n }\n\n if (model.canvas) {\n width = model.canvas.width;\n height = model.canvas.height;\n }\n\n if (model.image) {\n width = model.image.width;\n height = model.image.height;\n }\n\n var dimensionality = (width > 1) + (height > 1) + (depth > 1);\n return dimensionality;\n };\n\n publicAPI.getInputAsJsImageData = function () {\n if (!model.imageLoaded || publicAPI.getInputData()) return null;\n\n if (model.jsImageData) {\n return model.jsImageData();\n }\n\n if (model.canvas) {\n var context = model.canvas.getContext('2d');\n var imageData = context.getImageData(0, 0, model.canvas.width, model.canvas.height);\n return imageData;\n }\n\n if (model.image) {\n var canvas = document.createElement('canvas');\n canvas.width = model.image.width;\n canvas.height = model.image.height;\n\n var _context = canvas.getContext('2d');\n\n _context.translate(0, canvas.height);\n\n _context.scale(1, -1);\n\n _context.drawImage(model.image, 0, 0, model.image.width, model.image.height);\n\n var _imageData = _context.getImageData(0, 0, canvas.width, canvas.height);\n\n return _imageData;\n }\n\n return null;\n };\n} // Use nativeArray instead of self\n\n\nvar generateMipmaps = function generateMipmaps(nativeArray, width, height, level) {\n // TODO: FIX UNEVEN TEXTURE MIP GENERATION:\n // When textures don't have standard ratios, higher mip levels\n // result in their color chanels getting messed up and shifting\n // 3x3 gaussian kernel\n var g3m = [1, 2, 1]; // eslint-disable-line\n\n var g3w = 4; // eslint-disable-line\n\n var kernel = g3m;\n var kernelWeight = g3w;\n var hs = nativeArray.length / (width * height); // TODO: support for textures with depth more than 1\n\n var currentWidth = width;\n var currentHeight = height;\n var imageData = nativeArray;\n var maps = [imageData];\n\n for (var i = 0; i < level; i++) {\n var oldData = _toConsumableArray(imageData);\n\n currentWidth /= 2;\n currentHeight /= 2;\n imageData = new Uint8ClampedArray(currentWidth * currentHeight * hs);\n var vs = hs * currentWidth; // Scale down\n\n var shift = 0;\n\n for (var p = 0; p < imageData.length; p += hs) {\n if (p % vs === 0) {\n shift += 2 * hs * currentWidth;\n }\n\n for (var c = 0; c < hs; c++) {\n var sample = oldData[shift + c];\n sample += oldData[shift + hs + c];\n sample += oldData[shift - 2 * vs + c];\n sample += oldData[shift - 2 * vs + hs + c];\n sample /= 4;\n imageData[p + c] = sample;\n }\n\n shift += 2 * hs;\n } // Horizontal Pass\n\n\n var dataCopy = _toConsumableArray(imageData);\n\n for (var _p = 0; _p < imageData.length; _p += hs) {\n for (var _c = 0; _c < hs; _c++) {\n var x = -(kernel.length - 1) / 2;\n var kw = kernelWeight;\n var value = 0.0;\n\n for (var k = 0; k < kernel.length; k++) {\n var index = _p + _c + x * hs;\n var lineShift = index % vs - (_p + _c) % vs;\n if (lineShift > hs) index += vs;\n if (lineShift < -hs) index -= vs;\n\n if (dataCopy[index]) {\n value += dataCopy[index] * kernel[k];\n } else {\n kw -= kernel[k];\n }\n\n x += 1;\n }\n\n imageData[_p + _c] = value / kw;\n }\n } // Vertical Pass\n\n\n dataCopy = _toConsumableArray(imageData);\n\n for (var _p2 = 0; _p2 < imageData.length; _p2 += hs) {\n for (var _c2 = 0; _c2 < hs; _c2++) {\n var _x = -(kernel.length - 1) / 2;\n\n var _kw = kernelWeight;\n var _value = 0.0;\n\n for (var _k = 0; _k < kernel.length; _k++) {\n var _index = _p2 + _c2 + _x * vs;\n\n if (dataCopy[_index]) {\n _value += dataCopy[_index] * kernel[_k];\n } else {\n _kw -= kernel[_k];\n }\n\n _x += 1;\n }\n\n imageData[_p2 + _c2] = _value / _kw;\n }\n }\n\n maps.push(imageData);\n }\n\n return maps;\n}; // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n image: null,\n canvas: null,\n jsImageData: null,\n imageLoaded: false,\n repeat: false,\n interpolate: false,\n edgeClamp: false,\n mipLevel: 0,\n resizable: false // must be set at construction time if the texture can be resizable\n\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Build VTK API\n\n macro.obj(publicAPI, model);\n macro.algo(publicAPI, model, 6, 0);\n macro.get(publicAPI, model, ['canvas', 'image', 'jsImageData', 'imageLoaded', 'resizable']);\n macro.setGet(publicAPI, model, ['repeat', 'edgeClamp', 'interpolate', 'mipLevel']);\n vtkTexture(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkTexture');\nvar STATIC = {\n generateMipmaps: generateMipmaps\n}; // ----------------------------------------------------------------------------\n\nvar vtkTexture$1 = _objectSpread({\n newInstance: newInstance,\n extend: extend\n}, STATIC);\n\nexport { STATIC, vtkTexture$1 as default, extend, newInstance };\n","var PassTypes = {\n MIN_KNOWN_PASS: 0,\n ACTOR_PASS: 0,\n COMPOSITE_INDEX_PASS: 1,\n ID_LOW24: 2,\n ID_HIGH24: 3,\n MAX_KNOWN_PASS: 3\n};\nvar Constants = {\n PassTypes: PassTypes\n};\n\nexport { PassTypes, Constants as default };\n","import setPrototypeOf from \"./setPrototypeOf.js\";\nimport isNativeReflectConstruct from \"./isNativeReflectConstruct.js\";\nexport default function _construct(Parent, args, Class) {\n if (isNativeReflectConstruct()) {\n _construct = Reflect.construct.bind();\n } else {\n _construct = function _construct(Parent, args, Class) {\n var a = [null];\n a.push.apply(a, args);\n var Constructor = Function.bind.apply(Parent, a);\n var instance = new Constructor();\n if (Class) setPrototypeOf(instance, Class.prototype);\n return instance;\n };\n }\n return _construct.apply(null, arguments);\n}","import superPropBase from \"./superPropBase.js\";\nexport default function _get() {\n if (typeof Reflect !== \"undefined\" && Reflect.get) {\n _get = Reflect.get.bind();\n } else {\n _get = function _get(target, property, receiver) {\n var base = superPropBase(target, property);\n if (!base) return;\n var desc = Object.getOwnPropertyDescriptor(base, property);\n if (desc.get) {\n return desc.get.call(arguments.length < 3 ? target : receiver);\n }\n return desc.value;\n };\n }\n return _get.apply(this, arguments);\n}","import getPrototypeOf from \"./getPrototypeOf.js\";\nexport default function _superPropBase(object, property) {\n while (!Object.prototype.hasOwnProperty.call(object, property)) {\n object = getPrototypeOf(object);\n if (object === null) break;\n }\n return object;\n}","import getPrototypeOf from \"./getPrototypeOf.js\";\nimport setPrototypeOf from \"./setPrototypeOf.js\";\nimport isNativeFunction from \"./isNativeFunction.js\";\nimport construct from \"./construct.js\";\nexport default function _wrapNativeSuper(Class) {\n var _cache = typeof Map === \"function\" ? new Map() : undefined;\n _wrapNativeSuper = function _wrapNativeSuper(Class) {\n if (Class === null || !isNativeFunction(Class)) return Class;\n if (typeof Class !== \"function\") {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n if (typeof _cache !== \"undefined\") {\n if (_cache.has(Class)) return _cache.get(Class);\n _cache.set(Class, Wrapper);\n }\n function Wrapper() {\n return construct(Class, arguments, getPrototypeOf(this).constructor);\n }\n Wrapper.prototype = Object.create(Class.prototype, {\n constructor: {\n value: Wrapper,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n return setPrototypeOf(Wrapper, Class);\n };\n return _wrapNativeSuper(Class);\n}","export default function _isNativeFunction(fn) {\n return Function.toString.call(fn).indexOf(\"[native code]\") !== -1;\n}","import _classCallCheck from '@babel/runtime/helpers/classCallCheck';\nimport _createClass from '@babel/runtime/helpers/createClass';\nimport _get from '@babel/runtime/helpers/get';\nimport _inherits from '@babel/runtime/helpers/inherits';\nimport _possibleConstructorReturn from '@babel/runtime/helpers/possibleConstructorReturn';\nimport _getPrototypeOf from '@babel/runtime/helpers/getPrototypeOf';\nimport _wrapNativeSuper from '@babel/runtime/helpers/wrapNativeSuper';\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\n\n/* eslint-disable prefer-rest-params */\nvar ClassHierarchy = /*#__PURE__*/function (_Array) {\n _inherits(ClassHierarchy, _Array);\n\n var _super = _createSuper(ClassHierarchy);\n\n function ClassHierarchy() {\n _classCallCheck(this, ClassHierarchy);\n\n return _super.apply(this, arguments);\n }\n\n _createClass(ClassHierarchy, [{\n key: \"push\",\n value: function push() {\n for (var i = 0; i < arguments.length; i++) {\n if (!this.includes(arguments[i])) {\n _get(_getPrototypeOf(ClassHierarchy.prototype), \"push\", this).call(this, arguments[i]);\n }\n }\n\n return this.length;\n }\n }]);\n\n return ClassHierarchy;\n}( /*#__PURE__*/_wrapNativeSuper(Array));\n\nexport { ClassHierarchy as default };\n","import _slicedToArray from '@babel/runtime/helpers/slicedToArray';\nimport _typeof from '@babel/runtime/helpers/typeof';\nimport _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';\nimport _construct from '@babel/runtime/helpers/construct';\nimport DeepEqual from 'fast-deep-equal';\nimport vtk, { vtkGlobal } from './vtk.js';\nimport ClassHierarchy from './Common/Core/ClassHierarchy.js';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nvar globalMTime = 0;\nvar VOID = Symbol('void');\n\nfunction getCurrentGlobalMTime() {\n return globalMTime;\n} // ----------------------------------------------------------------------------\n// Logging function calls\n// ----------------------------------------------------------------------------\n\n/* eslint-disable no-prototype-builtins */\n\n\nvar fakeConsole = {};\n\nfunction noOp() {}\n\nvar consoleMethods = ['log', 'debug', 'info', 'warn', 'error', 'time', 'timeEnd', 'group', 'groupEnd'];\nconsoleMethods.forEach(function (methodName) {\n fakeConsole[methodName] = noOp;\n});\nvtkGlobal.console = console.hasOwnProperty('log') ? console : fakeConsole;\nvar loggerFunctions = {\n debug: noOp,\n // Don't print debug by default\n error: vtkGlobal.console.error || noOp,\n info: vtkGlobal.console.info || noOp,\n log: vtkGlobal.console.log || noOp,\n warn: vtkGlobal.console.warn || noOp\n};\nfunction setLoggerFunction(name, fn) {\n if (loggerFunctions[name]) {\n loggerFunctions[name] = fn || noOp;\n }\n}\nfunction vtkLogMacro() {\n loggerFunctions.log.apply(loggerFunctions, arguments);\n}\nfunction vtkInfoMacro() {\n loggerFunctions.info.apply(loggerFunctions, arguments);\n}\nfunction vtkDebugMacro() {\n loggerFunctions.debug.apply(loggerFunctions, arguments);\n}\nfunction vtkErrorMacro() {\n loggerFunctions.error.apply(loggerFunctions, arguments);\n}\nfunction vtkWarningMacro() {\n loggerFunctions.warn.apply(loggerFunctions, arguments);\n}\nvar ERROR_ONCE_MAP = {};\nfunction vtkOnceErrorMacro(str) {\n if (!ERROR_ONCE_MAP[str]) {\n loggerFunctions.error(str);\n ERROR_ONCE_MAP[str] = true;\n }\n} // ----------------------------------------------------------------------------\n// TypedArray\n// ----------------------------------------------------------------------------\n\nvar TYPED_ARRAYS = Object.create(null);\nTYPED_ARRAYS.Float32Array = Float32Array;\nTYPED_ARRAYS.Float64Array = Float64Array;\nTYPED_ARRAYS.Uint8Array = Uint8Array;\nTYPED_ARRAYS.Int8Array = Int8Array;\nTYPED_ARRAYS.Uint16Array = Uint16Array;\nTYPED_ARRAYS.Int16Array = Int16Array;\nTYPED_ARRAYS.Uint32Array = Uint32Array;\nTYPED_ARRAYS.Int32Array = Int32Array;\nTYPED_ARRAYS.Uint8ClampedArray = Uint8ClampedArray;\n\ntry {\n TYPED_ARRAYS.BigInt64Array = BigInt64Array;\n TYPED_ARRAYS.BigUint64Array = BigUint64Array;\n} catch (_unused) {// ignore\n}\n\nfunction newTypedArray(type) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n return _construct(TYPED_ARRAYS[type] || Float64Array, args);\n}\nfunction newTypedArrayFrom(type) {\n var _ref;\n\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n\n return (_ref = TYPED_ARRAYS[type] || Float64Array).from.apply(_ref, args);\n} // ----------------------------------------------------------------------------\n// capitilize provided string\n// ----------------------------------------------------------------------------\n\nfunction capitalize(str) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\nfunction _capitalize(str) {\n return capitalize(str[0] === '_' ? str.slice(1) : str);\n}\nfunction uncapitalize(str) {\n return str.charAt(0).toLowerCase() + str.slice(1);\n} // ----------------------------------------------------------------------------\n// Convert byte size into a well formatted string\n// ----------------------------------------------------------------------------\n\nfunction formatBytesToProperUnit(size) {\n var precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 2;\n var chunkSize = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1000;\n var units = ['TB', 'GB', 'MB', 'KB'];\n var value = Number(size);\n var currentUnit = 'B';\n\n while (value > chunkSize) {\n value /= chunkSize;\n currentUnit = units.pop();\n }\n\n return \"\".concat(value.toFixed(precision), \" \").concat(currentUnit);\n} // ----------------------------------------------------------------------------\n// Convert thousand number with proper separator\n// ----------------------------------------------------------------------------\n\nfunction formatNumbersWithThousandSeparator(n) {\n var separator = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ' ';\n var sections = [];\n var size = n;\n\n while (size > 1000) {\n sections.push(\"000\".concat(size % 1000).slice(-3));\n size = Math.floor(size / 1000);\n }\n\n if (size > 0) {\n sections.push(size);\n }\n\n sections.reverse();\n return sections.join(separator);\n} // ----------------------------------------------------------------------------\n// Array helper\n// ----------------------------------------------------------------------------\n\nfunction safeArrays(model) {\n Object.keys(model).forEach(function (key) {\n if (Array.isArray(model[key])) {\n model[key] = [].concat(model[key]);\n }\n });\n} // ----------------------------------------------------------------------------\n// shallow equals\n// ----------------------------------------------------------------------------\n\n\nfunction shallowEquals(a, b) {\n if (a === b) {\n return true;\n }\n\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) {\n return false;\n }\n\n for (var i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n\n return true;\n }\n\n return false;\n} // ----------------------------------------------------------------------------\n\n\nfunction enumToString(e, value) {\n return Object.keys(e).find(function (key) {\n return e[key] === value;\n });\n}\n\nfunction getStateArrayMapFunc(item) {\n if (item && item.isA) {\n return item.getState();\n }\n\n return item;\n} // ----------------------------------------------------------------------------\n// setImmediate\n// ----------------------------------------------------------------------------\n\n\nfunction setImmediateVTK(fn) {\n setTimeout(fn, 0);\n} // ----------------------------------------------------------------------------\n// measurePromiseExecution\n//\n// Measures the time it takes for a promise to finish from\n// the time this function is invoked.\n// The callback receives the time it took for the promise to resolve or reject.\n// ----------------------------------------------------------------------------\n\nfunction measurePromiseExecution(promise, callback) {\n var start = performance.now();\n promise.finally(function () {\n var delta = performance.now() - start;\n callback(delta);\n });\n} // ----------------------------------------------------------------------------\n// vtkObject: modified(), onModified(callback), delete()\n// ----------------------------------------------------------------------------\n\nfunction obj() {\n var publicAPI = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var model = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n // Ensure each instance as a unique ref of array\n safeArrays(model);\n var callbacks = [];\n\n if (!Number.isInteger(model.mtime)) {\n model.mtime = ++globalMTime;\n }\n\n if (!('classHierarchy' in model)) {\n model.classHierarchy = new ClassHierarchy('vtkObject');\n } else if (!(model.classHierarchy instanceof ClassHierarchy)) {\n var hierarchy = new ClassHierarchy();\n\n for (var i = 0; i < model.classHierarchy.length; i++) {\n hierarchy.push(model.classHierarchy[i]);\n }\n\n model.classHierarchy = hierarchy;\n }\n\n function off(index) {\n callbacks[index] = null;\n }\n\n function on(index) {\n function unsubscribe() {\n off(index);\n }\n\n return Object.freeze({\n unsubscribe: unsubscribe\n });\n }\n\n publicAPI.isDeleted = function () {\n return !!model.deleted;\n };\n\n publicAPI.modified = function (otherMTime) {\n if (model.deleted) {\n vtkErrorMacro('instance deleted - cannot call any method');\n return;\n }\n\n if (otherMTime && otherMTime < publicAPI.getMTime()) {\n return;\n }\n\n model.mtime = ++globalMTime;\n callbacks.forEach(function (callback) {\n return callback && callback(publicAPI);\n });\n };\n\n publicAPI.onModified = function (callback) {\n if (model.deleted) {\n vtkErrorMacro('instance deleted - cannot call any method');\n return null;\n }\n\n var index = callbacks.length;\n callbacks.push(callback);\n return on(index);\n };\n\n publicAPI.getMTime = function () {\n return model.mtime;\n };\n\n publicAPI.isA = function (className) {\n var count = model.classHierarchy.length; // we go backwards as that is more likely for\n // early termination\n\n while (count--) {\n if (model.classHierarchy[count] === className) {\n return true;\n }\n }\n\n return false;\n };\n\n publicAPI.getClassName = function () {\n var depth = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n return model.classHierarchy[model.classHierarchy.length - 1 - depth];\n };\n\n publicAPI.set = function () {\n var map = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var noWarning = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var noFunction = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var ret = false;\n Object.keys(map).forEach(function (name) {\n var fn = noFunction ? null : publicAPI[\"set\".concat(capitalize(name))];\n\n if (fn && Array.isArray(map[name]) && fn.length > 1) {\n ret = fn.apply(void 0, _toConsumableArray(map[name])) || ret;\n } else if (fn) {\n ret = fn(map[name]) || ret;\n } else {\n // Set data on model directly\n if (['mtime'].indexOf(name) === -1 && !noWarning) {\n vtkWarningMacro(\"Warning: Set value to model directly \".concat(name, \", \").concat(map[name]));\n }\n\n ret = model[name] !== map[name] || ret;\n model[name] = map[name];\n }\n });\n return ret;\n };\n\n publicAPI.get = function () {\n for (var _len3 = arguments.length, list = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n list[_key3] = arguments[_key3];\n }\n\n if (!list.length) {\n return model;\n }\n\n var subset = {};\n list.forEach(function (name) {\n subset[name] = model[name];\n });\n return subset;\n };\n\n publicAPI.getReferenceByName = function (val) {\n return model[val];\n };\n\n publicAPI.delete = function () {\n Object.keys(model).forEach(function (field) {\n return delete model[field];\n });\n callbacks.forEach(function (el, index) {\n return off(index);\n }); // Flag the instance being deleted\n\n model.deleted = true;\n }; // Add serialization support\n\n\n publicAPI.getState = function () {\n if (model.deleted) {\n return null;\n }\n\n var jsonArchive = _objectSpread(_objectSpread({}, model), {}, {\n vtkClass: publicAPI.getClassName()\n }); // Convert every vtkObject to its serializable form\n\n\n Object.keys(jsonArchive).forEach(function (keyName) {\n if (jsonArchive[keyName] === null || jsonArchive[keyName] === undefined || keyName[0] === '_' // protected members start with _\n ) {\n delete jsonArchive[keyName];\n } else if (jsonArchive[keyName].isA) {\n jsonArchive[keyName] = jsonArchive[keyName].getState();\n } else if (Array.isArray(jsonArchive[keyName])) {\n jsonArchive[keyName] = jsonArchive[keyName].map(getStateArrayMapFunc);\n }\n }); // Sort resulting object by key name\n\n var sortedObj = {};\n Object.keys(jsonArchive).sort().forEach(function (name) {\n sortedObj[name] = jsonArchive[name];\n }); // Remove mtime\n\n if (sortedObj.mtime) {\n delete sortedObj.mtime;\n }\n\n return sortedObj;\n }; // Add shallowCopy(otherInstance) support\n\n\n publicAPI.shallowCopy = function (other) {\n var debug = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (other.getClassName() !== publicAPI.getClassName()) {\n throw new Error(\"Cannot ShallowCopy \".concat(other.getClassName(), \" into \").concat(publicAPI.getClassName()));\n }\n\n var otherModel = other.get();\n var keyList = Object.keys(model).sort();\n var otherKeyList = Object.keys(otherModel).sort();\n otherKeyList.forEach(function (key) {\n var keyIdx = keyList.indexOf(key);\n\n if (keyIdx === -1) {\n if (debug) {\n vtkDebugMacro(\"add \".concat(key, \" in shallowCopy\"));\n }\n } else {\n keyList.splice(keyIdx, 1);\n }\n\n model[key] = otherModel[key];\n });\n\n if (keyList.length && debug) {\n vtkDebugMacro(\"Untouched keys: \".concat(keyList.join(', ')));\n }\n\n publicAPI.modified();\n }; // This function will get called when one invoke JSON.stringify(vtkObject)\n // JSON.stringify will only stringify the return value of this function\n\n\n publicAPI.toJSON = function vtkObjToJSON() {\n return publicAPI.getState();\n }; // Allow usage as decorator\n\n\n return publicAPI;\n} // ----------------------------------------------------------------------------\n// getXXX: add getters\n// ----------------------------------------------------------------------------\n\nvar objectGetterMap = {\n object: function object(publicAPI, model, field) {\n return function getter() {\n return _objectSpread({}, model[field.name]);\n };\n }\n};\nfunction get(publicAPI, model, fieldNames) {\n fieldNames.forEach(function (field) {\n if (_typeof(field) === 'object') {\n var getter = objectGetterMap[field.type];\n\n if (getter) {\n publicAPI[\"get\".concat(_capitalize(field.name))] = getter(publicAPI, model, field);\n } else {\n publicAPI[\"get\".concat(_capitalize(field.name))] = function () {\n return model[field.name];\n };\n }\n } else {\n publicAPI[\"get\".concat(_capitalize(field))] = function () {\n return model[field];\n };\n }\n });\n} // ----------------------------------------------------------------------------\n// setXXX: add setters\n// ----------------------------------------------------------------------------\n\nvar objectSetterMap = {\n enum: function _enum(publicAPI, model, field) {\n var onChanged = \"_on\".concat(_capitalize(field.name), \"Changed\");\n return function (value) {\n if (typeof value === 'string') {\n if (field.enum[value] !== undefined) {\n if (model[field.name] !== field.enum[value]) {\n model[field.name] = field.enum[value];\n publicAPI.modified();\n return true;\n }\n\n return false;\n }\n\n vtkErrorMacro(\"Set Enum with invalid argument \".concat(field, \", \").concat(value));\n throw new RangeError('Set Enum with invalid string argument');\n }\n\n if (typeof value === 'number') {\n if (model[field.name] !== value) {\n if (Object.keys(field.enum).map(function (key) {\n return field.enum[key];\n }).indexOf(value) !== -1) {\n var _model$onChanged;\n\n var previousValue = model[field.name];\n model[field.name] = value;\n (_model$onChanged = model[onChanged]) === null || _model$onChanged === void 0 ? void 0 : _model$onChanged.call(model, publicAPI, model, value, previousValue);\n publicAPI.modified();\n return true;\n }\n\n vtkErrorMacro(\"Set Enum outside numeric range \".concat(field, \", \").concat(value));\n throw new RangeError('Set Enum outside numeric range');\n }\n\n return false;\n }\n\n vtkErrorMacro(\"Set Enum with invalid argument (String/Number) \".concat(field, \", \").concat(value));\n throw new TypeError('Set Enum with invalid argument (String/Number)');\n };\n },\n object: function object(publicAPI, model, field) {\n var onChanged = \"_on\".concat(_capitalize(field.name), \"Changed\");\n return function (value) {\n if (!DeepEqual(model[field.name], value)) {\n var _model$onChanged2;\n\n var previousValue = model[field.name];\n model[field.name] = value;\n (_model$onChanged2 = model[onChanged]) === null || _model$onChanged2 === void 0 ? void 0 : _model$onChanged2.call(model, publicAPI, model, value, previousValue);\n publicAPI.modified();\n return true;\n }\n\n return false;\n };\n }\n};\n\nfunction findSetter(field) {\n if (_typeof(field) === 'object') {\n var fn = objectSetterMap[field.type];\n\n if (fn) {\n return function (publicAPI, model) {\n return fn(publicAPI, model, field);\n };\n }\n\n vtkErrorMacro(\"No setter for field \".concat(field));\n throw new TypeError('No setter for field');\n }\n\n return function getSetter(publicAPI, model) {\n var onChanged = \"_on\".concat(_capitalize(field), \"Changed\");\n return function setter(value) {\n if (model.deleted) {\n vtkErrorMacro('instance deleted - cannot call any method');\n return false;\n }\n\n if (model[field] !== value) {\n var _model$onChanged3;\n\n var previousValue = model[field.name];\n model[field] = value;\n (_model$onChanged3 = model[onChanged]) === null || _model$onChanged3 === void 0 ? void 0 : _model$onChanged3.call(model, publicAPI, model, value, previousValue);\n publicAPI.modified();\n return true;\n }\n\n return false;\n };\n };\n}\n\nfunction set(publicAPI, model, fields) {\n fields.forEach(function (field) {\n if (_typeof(field) === 'object') {\n publicAPI[\"set\".concat(_capitalize(field.name))] = findSetter(field)(publicAPI, model);\n } else {\n publicAPI[\"set\".concat(_capitalize(field))] = findSetter(field)(publicAPI, model);\n }\n });\n} // ----------------------------------------------------------------------------\n// set/get XXX: add both setters and getters\n// ----------------------------------------------------------------------------\n\nfunction setGet(publicAPI, model, fieldNames) {\n get(publicAPI, model, fieldNames);\n set(publicAPI, model, fieldNames);\n} // ----------------------------------------------------------------------------\n// getXXX: add getters for object of type array with copy to be safe\n// getXXXByReference: add getters for object of type array without copy\n// ----------------------------------------------------------------------------\n\nfunction getArray(publicAPI, model, fieldNames) {\n fieldNames.forEach(function (field) {\n publicAPI[\"get\".concat(_capitalize(field))] = function () {\n return model[field] ? Array.from(model[field]) : model[field];\n };\n\n publicAPI[\"get\".concat(_capitalize(field), \"ByReference\")] = function () {\n return model[field];\n };\n });\n} // ----------------------------------------------------------------------------\n// setXXX: add setter for object of type array\n// if 'defaultVal' is supplied, shorter arrays will be padded to 'size' with 'defaultVal'\n// set...From: fast path to copy the content of an array to the current one without call to modified.\n// ----------------------------------------------------------------------------\n\nfunction setArray(publicAPI, model, fieldNames, size) {\n var defaultVal = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : undefined;\n fieldNames.forEach(function (field) {\n if (model[field] && size && model[field].length !== size) {\n throw new RangeError(\"Invalid initial number of values for array (\".concat(field, \")\"));\n }\n\n var onChanged = \"_on\".concat(_capitalize(field), \"Changed\");\n\n publicAPI[\"set\".concat(_capitalize(field))] = function () {\n if (model.deleted) {\n vtkErrorMacro('instance deleted - cannot call any method');\n return false;\n }\n\n for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n args[_key4] = arguments[_key4];\n }\n\n var array = args;\n var changeDetected;\n var needCopy = false; // allow null or an array to be passed as a single arg.\n\n if (array.length === 1 && (array[0] == null || array[0].length >= 0)) {\n /* eslint-disable prefer-destructuring */\n array = array[0];\n /* eslint-enable prefer-destructuring */\n\n needCopy = true;\n }\n\n if (array == null) {\n changeDetected = model[field] !== array;\n } else {\n if (size && array.length !== size) {\n if (array.length < size && defaultVal !== undefined) {\n array = Array.from(array);\n needCopy = false;\n\n while (array.length < size) {\n array.push(defaultVal);\n }\n } else {\n throw new RangeError(\"Invalid number of values for array setter (\".concat(field, \")\"));\n }\n }\n\n changeDetected = model[field] == null || model[field].length !== array.length;\n\n for (var i = 0; !changeDetected && i < array.length; ++i) {\n changeDetected = model[field][i] !== array[i];\n }\n\n if (changeDetected && needCopy) {\n array = Array.from(array);\n }\n }\n\n if (changeDetected) {\n var _model$onChanged4;\n\n var previousValue = model[field.name];\n model[field] = array;\n (_model$onChanged4 = model[onChanged]) === null || _model$onChanged4 === void 0 ? void 0 : _model$onChanged4.call(model, publicAPI, model, array, previousValue);\n publicAPI.modified();\n }\n\n return changeDetected;\n };\n\n publicAPI[\"set\".concat(_capitalize(field), \"From\")] = function (otherArray) {\n var target = model[field];\n otherArray.forEach(function (v, i) {\n target[i] = v;\n });\n };\n });\n} // ----------------------------------------------------------------------------\n// set/get XXX: add setter and getter for object of type array\n// ----------------------------------------------------------------------------\n\nfunction setGetArray(publicAPI, model, fieldNames, size) {\n var defaultVal = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : undefined;\n getArray(publicAPI, model, fieldNames);\n setArray(publicAPI, model, fieldNames, size, defaultVal);\n}\nfunction moveToProtected(publicAPI, model, fieldNames) {\n for (var i = 0; i < fieldNames.length; i++) {\n var fieldName = fieldNames[i];\n\n if (model[fieldName] !== undefined) {\n model[\"_\".concat(fieldName)] = model[fieldName];\n delete model[fieldName];\n }\n }\n} // ----------------------------------------------------------------------------\n// vtkAlgorithm: setInputData(), setInputConnection(), getOutputData(), getOutputPort()\n// ----------------------------------------------------------------------------\n\nfunction algo(publicAPI, model, numberOfInputs, numberOfOutputs) {\n if (model.inputData) {\n model.inputData = model.inputData.map(vtk);\n } else {\n model.inputData = [];\n }\n\n if (model.inputConnection) {\n model.inputConnection = model.inputConnection.map(vtk);\n } else {\n model.inputConnection = [];\n }\n\n if (model.output) {\n model.output = model.output.map(vtk);\n } else {\n model.output = [];\n }\n\n if (model.inputArrayToProcess) {\n model.inputArrayToProcess = model.inputArrayToProcess.map(vtk);\n } else {\n model.inputArrayToProcess = [];\n } // Cache the argument for later manipulation\n\n\n model.numberOfInputs = numberOfInputs; // Methods\n\n function setInputData(dataset) {\n var port = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\n if (model.deleted) {\n vtkErrorMacro('instance deleted - cannot call any method');\n return;\n }\n\n if (port >= model.numberOfInputs) {\n vtkErrorMacro(\"algorithm \".concat(publicAPI.getClassName(), \" only has \").concat(model.numberOfInputs, \" input ports. To add more input ports, use addInputData()\"));\n return;\n }\n\n if (model.inputData[port] !== dataset || model.inputConnection[port]) {\n model.inputData[port] = dataset;\n model.inputConnection[port] = null;\n\n if (publicAPI.modified) {\n publicAPI.modified();\n }\n }\n }\n\n function getInputData() {\n var port = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n\n if (model.inputConnection[port]) {\n model.inputData[port] = model.inputConnection[port]();\n }\n\n return model.inputData[port];\n }\n\n function setInputConnection(outputPort) {\n var port = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\n if (model.deleted) {\n vtkErrorMacro('instance deleted - cannot call any method');\n return;\n }\n\n if (port >= model.numberOfInputs) {\n var msg = \"algorithm \".concat(publicAPI.getClassName(), \" only has \");\n msg += \"\".concat(model.numberOfInputs);\n msg += ' input ports. To add more input ports, use addInputConnection()';\n vtkErrorMacro(msg);\n return;\n }\n\n model.inputData[port] = null;\n model.inputConnection[port] = outputPort;\n }\n\n function getInputConnection() {\n var port = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n return model.inputConnection[port];\n }\n\n function getPortToFill() {\n var portToFill = model.numberOfInputs;\n\n while (portToFill && !model.inputData[portToFill - 1] && !model.inputConnection[portToFill - 1]) {\n portToFill--;\n }\n\n if (portToFill === model.numberOfInputs) {\n model.numberOfInputs++;\n }\n\n return portToFill;\n }\n\n function addInputConnection(outputPort) {\n if (model.deleted) {\n vtkErrorMacro('instance deleted - cannot call any method');\n return;\n }\n\n setInputConnection(outputPort, getPortToFill());\n }\n\n function addInputData(dataset) {\n if (model.deleted) {\n vtkErrorMacro('instance deleted - cannot call any method');\n return;\n }\n\n setInputData(dataset, getPortToFill());\n }\n\n function getOutputData() {\n var port = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n\n if (model.deleted) {\n vtkErrorMacro('instance deleted - cannot call any method');\n return null;\n }\n\n if (publicAPI.shouldUpdate()) {\n publicAPI.update();\n }\n\n return model.output[port];\n }\n\n publicAPI.shouldUpdate = function () {\n var localMTime = publicAPI.getMTime();\n var minOutputMTime = Infinity;\n var count = numberOfOutputs;\n\n while (count--) {\n if (!model.output[count] || model.output[count].isDeleted()) {\n return true;\n }\n\n var mt = model.output[count].getMTime();\n\n if (mt < localMTime) {\n return true;\n }\n\n if (mt < minOutputMTime) {\n minOutputMTime = mt;\n }\n }\n\n count = model.numberOfInputs;\n\n while (count--) {\n var _model$inputConnectio, _publicAPI$getInputDa;\n\n if ((_model$inputConnectio = model.inputConnection[count]) !== null && _model$inputConnectio !== void 0 && _model$inputConnectio.filter.shouldUpdate() || ((_publicAPI$getInputDa = publicAPI.getInputData(count)) === null || _publicAPI$getInputDa === void 0 ? void 0 : _publicAPI$getInputDa.getMTime()) > minOutputMTime) {\n return true;\n }\n }\n\n return false;\n };\n\n function getOutputPort() {\n var port = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n\n var outputPortAccess = function outputPortAccess() {\n return getOutputData(port);\n }; // Add reference to filter\n\n\n outputPortAccess.filter = publicAPI;\n return outputPortAccess;\n } // Handle input if needed\n\n\n if (model.numberOfInputs) {\n // Reserve inputs\n var count = model.numberOfInputs;\n\n while (count--) {\n model.inputData.push(null);\n model.inputConnection.push(null);\n } // Expose public methods\n\n\n publicAPI.setInputData = setInputData;\n publicAPI.setInputConnection = setInputConnection;\n publicAPI.addInputData = addInputData;\n publicAPI.addInputConnection = addInputConnection;\n publicAPI.getInputData = getInputData;\n publicAPI.getInputConnection = getInputConnection;\n }\n\n if (numberOfOutputs) {\n publicAPI.getOutputData = getOutputData;\n publicAPI.getOutputPort = getOutputPort;\n }\n\n publicAPI.update = function () {\n var ins = [];\n\n if (model.numberOfInputs) {\n var _count = 0;\n\n while (_count < model.numberOfInputs) {\n ins[_count] = publicAPI.getInputData(_count);\n _count++;\n }\n }\n\n if (publicAPI.shouldUpdate() && publicAPI.requestData) {\n publicAPI.requestData(ins, model.output);\n }\n };\n\n publicAPI.getNumberOfInputPorts = function () {\n return model.numberOfInputs;\n };\n\n publicAPI.getNumberOfOutputPorts = function () {\n return numberOfOutputs || model.output.length;\n };\n\n publicAPI.getInputArrayToProcess = function (inputPort) {\n var arrayDesc = model.inputArrayToProcess[inputPort];\n var ds = model.inputData[inputPort];\n\n if (arrayDesc && ds) {\n return ds[\"get\".concat(arrayDesc.fieldAssociation)]().getArray(arrayDesc.arrayName);\n }\n\n return null;\n };\n\n publicAPI.setInputArrayToProcess = function (inputPort, arrayName, fieldAssociation) {\n var attributeType = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'Scalars';\n\n while (model.inputArrayToProcess.length < inputPort) {\n model.inputArrayToProcess.push(null);\n }\n\n model.inputArrayToProcess[inputPort] = {\n arrayName: arrayName,\n fieldAssociation: fieldAssociation,\n attributeType: attributeType\n };\n };\n} // ----------------------------------------------------------------------------\n// Event handling: onXXX(callback), invokeXXX(args...)\n// ----------------------------------------------------------------------------\n\nvar EVENT_ABORT = Symbol('Event abort');\nfunction event(publicAPI, model, eventName) {\n var callbacks = [];\n var previousDelete = publicAPI.delete;\n var curCallbackID = 1;\n\n function off(callbackID) {\n for (var i = 0; i < callbacks.length; ++i) {\n var _callbacks$i = _slicedToArray(callbacks[i], 1),\n cbID = _callbacks$i[0];\n\n if (cbID === callbackID) {\n callbacks.splice(i, 1);\n return;\n }\n }\n }\n\n function on(callbackID) {\n function unsubscribe() {\n off(callbackID);\n }\n\n return Object.freeze({\n unsubscribe: unsubscribe\n });\n }\n\n function invoke() {\n var _arguments = arguments;\n\n if (model.deleted) {\n vtkErrorMacro('instance deleted - cannot call any method');\n return;\n }\n /* eslint-disable prefer-rest-params */\n // Go through a copy of the callbacks array in case new callbacks\n // get prepended within previous callbacks\n\n\n var currentCallbacks = callbacks.slice();\n\n var _loop = function _loop(index) {\n var _currentCallbacks$ind = _slicedToArray(currentCallbacks[index], 3),\n cb = _currentCallbacks$ind[1],\n priority = _currentCallbacks$ind[2];\n\n if (!cb) {\n return \"continue\"; // eslint-disable-line\n }\n\n if (priority < 0) {\n setTimeout(function () {\n return cb.apply(publicAPI, _arguments);\n }, 1 - priority);\n } else {\n // Abort only if the callback explicitly returns false\n var continueNext = cb.apply(publicAPI, _arguments);\n\n if (continueNext === EVENT_ABORT) {\n return \"break\";\n }\n }\n };\n\n for (var index = 0; index < currentCallbacks.length; ++index) {\n var _ret = _loop(index);\n\n if (_ret === \"continue\") continue;\n if (_ret === \"break\") break;\n }\n /* eslint-enable prefer-rest-params */\n\n }\n\n publicAPI[\"invoke\".concat(_capitalize(eventName))] = invoke;\n\n publicAPI[\"on\".concat(_capitalize(eventName))] = function (callback) {\n var priority = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0.0;\n\n if (!callback.apply) {\n console.error(\"Invalid callback for event \".concat(eventName));\n return null;\n }\n\n if (model.deleted) {\n vtkErrorMacro('instance deleted - cannot call any method');\n return null;\n }\n\n var callbackID = curCallbackID++;\n callbacks.push([callbackID, callback, priority]);\n callbacks.sort(function (cb1, cb2) {\n return cb2[2] - cb1[2];\n });\n return on(callbackID);\n };\n\n publicAPI.delete = function () {\n previousDelete();\n callbacks.forEach(function (_ref2) {\n var _ref3 = _slicedToArray(_ref2, 1),\n cbID = _ref3[0];\n\n return off(cbID);\n });\n };\n} // ----------------------------------------------------------------------------\n// newInstance\n// ----------------------------------------------------------------------------\n\nfunction newInstance(extend, className) {\n var constructor = function constructor() {\n var initialValues = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var model = {};\n var publicAPI = {};\n extend(publicAPI, model, initialValues);\n return Object.freeze(publicAPI);\n }; // Register constructor to factory\n\n\n if (className) {\n vtk.register(className, constructor);\n }\n\n return constructor;\n} // ----------------------------------------------------------------------------\n// Chain function calls\n// ----------------------------------------------------------------------------\n\nfunction chain() {\n for (var _len5 = arguments.length, fn = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {\n fn[_key5] = arguments[_key5];\n }\n\n return function () {\n for (var _len6 = arguments.length, args = new Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {\n args[_key6] = arguments[_key6];\n }\n\n return fn.filter(function (i) {\n return !!i;\n }).map(function (i) {\n return i.apply(void 0, args);\n });\n };\n} // ----------------------------------------------------------------------------\n// Some utility methods for vtk objects\n// ----------------------------------------------------------------------------\n\nfunction isVtkObject(instance) {\n return instance && instance.isA && instance.isA('vtkObject');\n}\nfunction traverseInstanceTree(instance, extractFunction) {\n var accumulator = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];\n var visitedInstances = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];\n\n if (isVtkObject(instance)) {\n if (visitedInstances.indexOf(instance) >= 0) {\n // avoid cycles\n return accumulator;\n }\n\n visitedInstances.push(instance);\n var result = extractFunction(instance);\n\n if (result !== undefined) {\n accumulator.push(result);\n } // Now go through this instance's model\n\n\n var model = instance.get();\n Object.keys(model).forEach(function (key) {\n var modelObj = model[key];\n\n if (Array.isArray(modelObj)) {\n modelObj.forEach(function (subObj) {\n traverseInstanceTree(subObj, extractFunction, accumulator, visitedInstances);\n });\n } else {\n traverseInstanceTree(modelObj, extractFunction, accumulator, visitedInstances);\n }\n });\n }\n\n return accumulator;\n} // ----------------------------------------------------------------------------\n// Returns a function, that, as long as it continues to be invoked, will not\n// be triggered. The function will be called after it stops being called for\n// N milliseconds. If `immediate` is passed, trigger the function on the\n// leading edge, instead of the trailing.\n\nfunction debounce(func, wait, immediate) {\n var _this = this;\n\n var timeout;\n\n var debounced = function debounced() {\n for (var _len7 = arguments.length, args = new Array(_len7), _key7 = 0; _key7 < _len7; _key7++) {\n args[_key7] = arguments[_key7];\n }\n\n var context = _this;\n\n var later = function later() {\n timeout = null;\n\n if (!immediate) {\n func.apply(context, args);\n }\n };\n\n var callNow = immediate && !timeout;\n clearTimeout(timeout);\n timeout = setTimeout(later, wait);\n\n if (callNow) {\n func.apply(context, args);\n }\n };\n\n debounced.cancel = function () {\n return clearTimeout(timeout);\n };\n\n return debounced;\n} // ----------------------------------------------------------------------------\n// Creates a throttled function that only invokes `func` at most once per\n// every `wait` milliseconds.\n\nfunction throttle(callback, delay) {\n var isThrottled = false;\n var argsToUse = null;\n\n function next() {\n isThrottled = false;\n\n if (argsToUse !== null) {\n wrapper.apply(void 0, _toConsumableArray(argsToUse)); // eslint-disable-line\n\n argsToUse = null;\n }\n }\n\n function wrapper() {\n for (var _len8 = arguments.length, args = new Array(_len8), _key8 = 0; _key8 < _len8; _key8++) {\n args[_key8] = arguments[_key8];\n }\n\n if (isThrottled) {\n argsToUse = args;\n return;\n }\n\n isThrottled = true;\n callback.apply(void 0, args);\n setTimeout(next, delay);\n }\n\n return wrapper;\n} // ----------------------------------------------------------------------------\n// keystore(publicAPI, model, initialKeystore)\n//\n// - initialKeystore: Initial keystore. This can be either a Map or an\n// object.\n//\n// Generated API\n// setKey(key, value) : mixed (returns value)\n// getKey(key) : mixed\n// getAllKeys() : [mixed]\n// deleteKey(key) : Boolean\n// ----------------------------------------------------------------------------\n\nfunction keystore(publicAPI, model) {\n var initialKeystore = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n model.keystore = Object.assign(model.keystore || {}, initialKeystore);\n\n publicAPI.setKey = function (key, value) {\n model.keystore[key] = value;\n };\n\n publicAPI.getKey = function (key) {\n return model.keystore[key];\n };\n\n publicAPI.getAllKeys = function () {\n return Object.keys(model.keystore);\n };\n\n publicAPI.deleteKey = function (key) {\n return delete model.keystore[key];\n };\n\n publicAPI.clearKeystore = function () {\n return publicAPI.getAllKeys().forEach(function (key) {\n return delete model.keystore[key];\n });\n };\n} // ----------------------------------------------------------------------------\n// proxy(publicAPI, model, sectionName, propertyUI)\n//\n// - sectionName: Name of the section for UI\n// - propertyUI: List of props with their UI description\n//\n// Generated API\n// getProxyId() : String\n// listProxyProperties() : [string]\n// updateProxyProperty(name, prop)\n// getProxySection() => List of properties for UI generation\n// ----------------------------------------------------------------------------\n\nvar nextProxyId = 1;\nvar ROOT_GROUP_NAME = '__root__';\nfunction proxy(publicAPI, model) {\n // Proxies are keystores\n keystore(publicAPI, model);\n var parentDelete = publicAPI.delete; // getProxyId\n\n model.proxyId = \"\".concat(nextProxyId++); // ui handling\n\n model.ui = JSON.parse(JSON.stringify(model.ui || [])); // deep copy\n\n get(publicAPI, model, ['proxyId', 'proxyGroup', 'proxyName']);\n setGet(publicAPI, model, ['proxyManager']); // group properties\n\n var propertyMap = {};\n var groupChildrenNames = {};\n\n function registerProperties(descriptionList, currentGroupName) {\n if (!groupChildrenNames[currentGroupName]) {\n groupChildrenNames[currentGroupName] = [];\n }\n\n var childrenNames = groupChildrenNames[currentGroupName];\n\n for (var i = 0; i < descriptionList.length; i++) {\n childrenNames.push(descriptionList[i].name);\n propertyMap[descriptionList[i].name] = descriptionList[i];\n\n if (descriptionList[i].children && descriptionList[i].children.length) {\n registerProperties(descriptionList[i].children, descriptionList[i].name);\n }\n }\n }\n\n registerProperties(model.ui, ROOT_GROUP_NAME);\n\n publicAPI.updateUI = function (ui) {\n model.ui = JSON.parse(JSON.stringify(ui || [])); // deep copy\n\n Object.keys(propertyMap).forEach(function (k) {\n return delete propertyMap[k];\n });\n Object.keys(groupChildrenNames).forEach(function (k) {\n return delete groupChildrenNames[k];\n });\n registerProperties(model.ui, ROOT_GROUP_NAME);\n publicAPI.modified();\n };\n\n function listProxyProperties() {\n var gName = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ROOT_GROUP_NAME;\n return groupChildrenNames[gName];\n }\n\n publicAPI.updateProxyProperty = function (propertyName, propUI) {\n var prop = propertyMap[propertyName];\n\n if (prop) {\n Object.assign(prop, propUI);\n } else {\n propertyMap[propertyName] = _objectSpread({}, propUI);\n }\n };\n\n publicAPI.activate = function () {\n if (model.proxyManager) {\n var setActiveMethod = \"setActive\".concat(_capitalize(publicAPI.getProxyGroup().slice(0, -1)));\n\n if (model.proxyManager[setActiveMethod]) {\n model.proxyManager[setActiveMethod](publicAPI);\n }\n }\n }; // property link\n\n\n model.propertyLinkSubscribers = {};\n\n publicAPI.registerPropertyLinkForGC = function (otherLink, type) {\n if (!(type in model.propertyLinkSubscribers)) {\n model.propertyLinkSubscribers[type] = [];\n }\n\n model.propertyLinkSubscribers[type].push(otherLink);\n };\n\n publicAPI.gcPropertyLinks = function (type) {\n var subscribers = model.propertyLinkSubscribers[type] || [];\n\n while (subscribers.length) {\n subscribers.pop().unbind(publicAPI);\n }\n };\n\n model.propertyLinkMap = {};\n\n publicAPI.getPropertyLink = function (id) {\n var persistent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (model.propertyLinkMap[id]) {\n return model.propertyLinkMap[id];\n }\n\n var value = null;\n var links = [];\n var count = 0;\n var updateInProgress = false;\n\n function update(source) {\n var force = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (updateInProgress) {\n return null;\n }\n\n var needUpdate = [];\n var sourceLink = null;\n count = links.length;\n\n while (count--) {\n var link = links[count];\n\n if (link.instance === source) {\n sourceLink = link;\n } else {\n needUpdate.push(link);\n }\n }\n\n if (!sourceLink) {\n return null;\n }\n\n var newValue = sourceLink.instance[\"get\".concat(_capitalize(sourceLink.propertyName))]();\n\n if (!shallowEquals(newValue, value) || force) {\n value = newValue;\n updateInProgress = true;\n\n while (needUpdate.length) {\n var linkToUpdate = needUpdate.pop();\n linkToUpdate.instance.set(_defineProperty({}, linkToUpdate.propertyName, value));\n }\n\n updateInProgress = false;\n }\n\n if (model.propertyLinkMap[id].persistent) {\n model.propertyLinkMap[id].value = newValue;\n }\n\n return newValue;\n }\n\n function unbind(instance, propertyName) {\n var indexToDelete = [];\n count = links.length;\n\n while (count--) {\n var link = links[count];\n\n if (link.instance === instance && (link.propertyName === propertyName || propertyName === undefined)) {\n link.subscription.unsubscribe();\n indexToDelete.push(count);\n }\n }\n\n while (indexToDelete.length) {\n links.splice(indexToDelete.pop(), 1);\n }\n }\n\n function bind(instance, propertyName) {\n var updateMe = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var subscription = instance.onModified(update);\n var other = links[0];\n links.push({\n instance: instance,\n propertyName: propertyName,\n subscription: subscription\n });\n\n if (updateMe) {\n if (model.propertyLinkMap[id].persistent && model.propertyLinkMap[id].value !== undefined) {\n instance.set(_defineProperty({}, propertyName, model.propertyLinkMap[id].value));\n } else if (other) {\n update(other.instance, true);\n }\n }\n\n return {\n unsubscribe: function unsubscribe() {\n return unbind(instance, propertyName);\n }\n };\n }\n\n function unsubscribe() {\n while (links.length) {\n links.pop().subscription.unsubscribe();\n }\n }\n\n var linkHandler = {\n bind: bind,\n unbind: unbind,\n unsubscribe: unsubscribe,\n persistent: persistent\n };\n model.propertyLinkMap[id] = linkHandler;\n return linkHandler;\n }; // extract values\n\n\n function getProperties() {\n var groupName = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ROOT_GROUP_NAME;\n var values = [];\n var id = model.proxyId;\n var propertyNames = listProxyProperties(groupName) || [];\n\n for (var i = 0; i < propertyNames.length; i++) {\n var name = propertyNames[i];\n var method = publicAPI[\"get\".concat(_capitalize(name))];\n var value = method ? method() : undefined;\n var prop = {\n id: id,\n name: name,\n value: value\n };\n var children = getProperties(name);\n\n if (children.length) {\n prop.children = children;\n }\n\n values.push(prop);\n }\n\n return values;\n }\n\n publicAPI.listPropertyNames = function () {\n return getProperties().map(function (p) {\n return p.name;\n });\n };\n\n publicAPI.getPropertyByName = function (name) {\n return getProperties().find(function (p) {\n return p.name === name;\n });\n };\n\n publicAPI.getPropertyDomainByName = function (name) {\n return (propertyMap[name] || {}).domain;\n }; // ui section\n\n\n publicAPI.getProxySection = function () {\n return {\n id: model.proxyId,\n name: model.proxyGroup,\n ui: model.ui,\n properties: getProperties()\n };\n }; // free resources\n\n\n publicAPI.delete = function () {\n var list = Object.keys(model.propertyLinkMap);\n var count = list.length;\n\n while (count--) {\n model.propertyLinkMap[list[count]].unsubscribe();\n }\n\n Object.keys(model.propertyLinkSubscribers).forEach(publicAPI.gcPropertyLinks);\n parentDelete();\n }; // @todo fix infinite recursion due to active source\n\n\n publicAPI.getState = function () {\n return null;\n };\n\n function registerLinks() {\n // Allow dynamic registration of links at the application level\n if (model.links) {\n for (var i = 0; i < model.links.length; i++) {\n var _model$links$i = model.links[i],\n link = _model$links$i.link,\n property = _model$links$i.property,\n persistent = _model$links$i.persistent,\n updateOnBind = _model$links$i.updateOnBind,\n type = _model$links$i.type;\n\n if (type === 'application') {\n var sLink = model.proxyManager.getPropertyLink(link, persistent);\n publicAPI.registerPropertyLinkForGC(sLink, 'application');\n sLink.bind(publicAPI, property, updateOnBind);\n }\n }\n }\n }\n\n setImmediateVTK(registerLinks);\n} // ----------------------------------------------------------------------------\n// proxyPropertyMapping(publicAPI, model, map)\n//\n// map = {\n// opacity: { modelKey: 'property', property: 'opacity' },\n// }\n//\n// Generated API:\n// Elevate set/get methods from internal object stored in the model to current one\n// ----------------------------------------------------------------------------\n\nfunction proxyPropertyMapping(publicAPI, model, map) {\n var parentDelete = publicAPI.delete;\n var subscriptions = [];\n var propertyNames = Object.keys(map);\n var count = propertyNames.length;\n\n while (count--) {\n var propertyName = propertyNames[count];\n var _map$propertyName = map[propertyName],\n modelKey = _map$propertyName.modelKey,\n property = _map$propertyName.property,\n _map$propertyName$mod = _map$propertyName.modified,\n modified = _map$propertyName$mod === void 0 ? true : _map$propertyName$mod;\n\n var methodSrc = _capitalize(property);\n\n var methodDst = _capitalize(propertyName);\n\n publicAPI[\"get\".concat(methodDst)] = model[modelKey][\"get\".concat(methodSrc)];\n publicAPI[\"set\".concat(methodDst)] = model[modelKey][\"set\".concat(methodSrc)];\n\n if (modified) {\n subscriptions.push(model[modelKey].onModified(publicAPI.modified));\n }\n }\n\n publicAPI.delete = function () {\n while (subscriptions.length) {\n subscriptions.pop().unsubscribe();\n }\n\n parentDelete();\n };\n} // ----------------------------------------------------------------------------\n// proxyPropertyState(publicAPI, model, state, defaults)\n//\n// state = {\n// representation: {\n// 'Surface with edges': { property: { edgeVisibility: true, representation: 2 } },\n// Surface: { property: { edgeVisibility: false, representation: 2 } },\n// Wireframe: { property: { edgeVisibility: false, representation: 1 } },\n// Points: { property: { edgeVisibility: false, representation: 0 } },\n// },\n// }\n//\n// defaults = {\n// representation: 'Surface',\n// }\n//\n// Generated API\n// get / set Representation ( string ) => push state to various internal objects\n// ----------------------------------------------------------------------------\n\nfunction proxyPropertyState(publicAPI, model) {\n var state = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n var defaults = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n model.this = publicAPI;\n\n function applyState(map) {\n var modelKeys = Object.keys(map);\n var count = modelKeys.length;\n\n while (count--) {\n var modelKey = modelKeys[count];\n model[modelKey].set(map[modelKey]);\n }\n }\n\n var modelKeys = Object.keys(defaults);\n var count = modelKeys.length;\n\n var _loop2 = function _loop2() {\n // Add default\n var key = modelKeys[count];\n model[key] = defaults[key]; // Add set method\n\n var mapping = state[key];\n\n publicAPI[\"set\".concat(_capitalize(key))] = function (value) {\n if (value !== model[key]) {\n model[key] = value;\n var propValues = mapping[value];\n applyState(propValues);\n publicAPI.modified();\n }\n };\n };\n\n while (count--) {\n _loop2();\n } // Add getter\n\n\n if (modelKeys.length) {\n get(publicAPI, model, modelKeys);\n }\n} // ----------------------------------------------------------------------------\n// From : https://github.com/facebookarchive/fixed-data-table/blob/master/src/vendor_upstream/dom/normalizeWheel.js\n//\n//\n// Copyright (c) 2015, Facebook, Inc.\n// All rights reserved.\n//\n// This source code is licensed under the BSD-style license found in the\n// LICENSE file in the root directory of this source tree. An additional grant\n// of patent rights can be found in the PATENTS file in the same directory.\n//\n//\n// Mouse wheel (and 2-finger trackpad) support on the web sucks. It is\n// complicated, thus this doc is long and (hopefully) detailed enough to answer\n// your questions.\n//\n// If you need to react to the mouse wheel in a predictable way, this code is\n// like your bestest friend.// hugs//\n//\n// As of today, there are 4 DOM event types you can listen to:\n//\n// 'wheel' -- Chrome(31+), FF(17+), IE(9+)\n// 'mousewheel' -- Chrome, IE(6+), Opera, Safari\n// 'MozMousePixelScroll' -- FF(3.5 only!) (2010-2013) -- don't bother!\n// 'DOMMouseScroll' -- FF(0.9.7+) since 2003\n//\n// So what to do? The is the best:\n//\n// normalizeWheel.getEventType();\n//\n// In your event callback, use this code to get sane interpretation of the\n// deltas. This code will return an object with properties:\n//\n// spinX -- normalized spin speed (use for zoom) - x plane\n// spinY -- \" - y plane\n// pixelX -- normalized distance (to pixels) - x plane\n// pixelY -- \" - y plane\n//\n// Wheel values are provided by the browser assuming you are using the wheel to\n// scroll a web page by a number of lines or pixels (or pages). Values can vary\n// significantly on different platforms and browsers, forgetting that you can\n// scroll at different speeds. Some devices (like trackpads) emit more events\n// at smaller increments with fine granularity, and some emit massive jumps with\n// linear speed or acceleration.\n//\n// This code does its best to normalize the deltas for you:\n//\n// - spin is trying to normalize how far the wheel was spun (or trackpad\n// dragged). This is super useful for zoom support where you want to\n// throw away the chunky scroll steps on the PC and make those equal to\n// the slow and smooth tiny steps on the Mac. Key data: This code tries to\n// resolve a single slow step on a wheel to 1.\n//\n// - pixel is normalizing the desired scroll delta in pixel units. You'll\n// get the crazy differences between browsers, but at least it'll be in\n// pixels!\n//\n// - positive value indicates scrolling DOWN/RIGHT, negative UP/LEFT. This\n// should translate to positive value zooming IN, negative zooming OUT.\n// This matches the newer 'wheel' event.\n//\n// Why are there spinX, spinY (or pixels)?\n//\n// - spinX is a 2-finger side drag on the trackpad, and a shift + wheel turn\n// with a mouse. It results in side-scrolling in the browser by default.\n//\n// - spinY is what you expect -- it's the classic axis of a mouse wheel.\n//\n// - I dropped spinZ/pixelZ. It is supported by the DOM 3 'wheel' event and\n// probably is by browsers in conjunction with fancy 3D controllers .. but\n// you know.\n//\n// Implementation info:\n//\n// Examples of 'wheel' event if you scroll slowly (down) by one step with an\n// average mouse:\n//\n// OS X + Chrome (mouse) - 4 pixel delta (wheelDelta -120)\n// OS X + Safari (mouse) - N/A pixel delta (wheelDelta -12)\n// OS X + Firefox (mouse) - 0.1 line delta (wheelDelta N/A)\n// Win8 + Chrome (mouse) - 100 pixel delta (wheelDelta -120)\n// Win8 + Firefox (mouse) - 3 line delta (wheelDelta -120)\n//\n// On the trackpad:\n//\n// OS X + Chrome (trackpad) - 2 pixel delta (wheelDelta -6)\n// OS X + Firefox (trackpad) - 1 pixel delta (wheelDelta N/A)\n//\n// On other/older browsers.. it's more complicated as there can be multiple and\n// also missing delta values.\n//\n// The 'wheel' event is more standard:\n//\n// http://www.w3.org/TR/DOM-Level-3-Events/#events-wheelevents\n//\n// The basics is that it includes a unit, deltaMode (pixels, lines, pages), and\n// deltaX, deltaY and deltaZ. Some browsers provide other values to maintain\n// backward compatibility with older events. Those other values help us\n// better normalize spin speed. Example of what the browsers provide:\n//\n// | event.wheelDelta | event.detail\n// ------------------+------------------+--------------\n// Safari v5/OS X | -120 | 0\n// Safari v5/Win7 | -120 | 0\n// Chrome v17/OS X | -120 | 0\n// Chrome v17/Win7 | -120 | 0\n// IE9/Win7 | -120 | undefined\n// Firefox v4/OS X | undefined | 1\n// Firefox v4/Win7 | undefined | 3\n//\n// ----------------------------------------------------------------------------\n// Reasonable defaults\n\nvar PIXEL_STEP = 10;\nvar LINE_HEIGHT = 40;\nvar PAGE_HEIGHT = 800;\nfunction normalizeWheel(wheelEvent) {\n var sX = 0; // spinX\n\n var sY = 0; // spinY\n\n var pX = 0; // pixelX\n\n var pY = 0; // pixelY\n // Legacy\n\n if ('detail' in wheelEvent) {\n sY = wheelEvent.detail;\n }\n\n if ('wheelDelta' in wheelEvent) {\n sY = -wheelEvent.wheelDelta / 120;\n }\n\n if ('wheelDeltaY' in wheelEvent) {\n sY = -wheelEvent.wheelDeltaY / 120;\n }\n\n if ('wheelDeltaX' in wheelEvent) {\n sX = -wheelEvent.wheelDeltaX / 120;\n } // side scrolling on FF with DOMMouseScroll\n\n\n if ('axis' in wheelEvent && wheelEvent.axis === wheelEvent.HORIZONTAL_AXIS) {\n sX = sY;\n sY = 0;\n }\n\n pX = sX * PIXEL_STEP;\n pY = sY * PIXEL_STEP;\n\n if ('deltaY' in wheelEvent) {\n pY = wheelEvent.deltaY;\n }\n\n if ('deltaX' in wheelEvent) {\n pX = wheelEvent.deltaX;\n }\n\n if ((pX || pY) && wheelEvent.deltaMode) {\n if (wheelEvent.deltaMode === 1) {\n // delta in LINE units\n pX *= LINE_HEIGHT;\n pY *= LINE_HEIGHT;\n } else {\n // delta in PAGE units\n pX *= PAGE_HEIGHT;\n pY *= PAGE_HEIGHT;\n }\n } // Fall-back if spin cannot be determined\n\n\n if (pX && !sX) {\n sX = pX < 1 ? -1 : 1;\n }\n\n if (pY && !sY) {\n sY = pY < 1 ? -1 : 1;\n }\n\n return {\n spinX: sX,\n spinY: sY,\n pixelX: pX,\n pixelY: pY\n };\n} // ----------------------------------------------------------------------------\n// Default export\n// ----------------------------------------------------------------------------\n\nvar macro = {\n algo: algo,\n capitalize: capitalize,\n chain: chain,\n debounce: debounce,\n enumToString: enumToString,\n event: event,\n EVENT_ABORT: EVENT_ABORT,\n formatBytesToProperUnit: formatBytesToProperUnit,\n formatNumbersWithThousandSeparator: formatNumbersWithThousandSeparator,\n get: get,\n getArray: getArray,\n getCurrentGlobalMTime: getCurrentGlobalMTime,\n getStateArrayMapFunc: getStateArrayMapFunc,\n isVtkObject: isVtkObject,\n keystore: keystore,\n measurePromiseExecution: measurePromiseExecution,\n moveToProtected: moveToProtected,\n newInstance: newInstance,\n newTypedArray: newTypedArray,\n newTypedArrayFrom: newTypedArrayFrom,\n normalizeWheel: normalizeWheel,\n obj: obj,\n proxy: proxy,\n proxyPropertyMapping: proxyPropertyMapping,\n proxyPropertyState: proxyPropertyState,\n safeArrays: safeArrays,\n set: set,\n setArray: setArray,\n setGet: setGet,\n setGetArray: setGetArray,\n setImmediate: setImmediateVTK,\n setLoggerFunction: setLoggerFunction,\n throttle: throttle,\n traverseInstanceTree: traverseInstanceTree,\n TYPED_ARRAYS: TYPED_ARRAYS,\n // deprecated todo remove on breaking API revision\n uncapitalize: uncapitalize,\n VOID: VOID,\n vtkDebugMacro: vtkDebugMacro,\n vtkErrorMacro: vtkErrorMacro,\n vtkInfoMacro: vtkInfoMacro,\n vtkLogMacro: vtkLogMacro,\n vtkOnceErrorMacro: vtkOnceErrorMacro,\n vtkWarningMacro: vtkWarningMacro\n};\n\nexport { EVENT_ABORT, TYPED_ARRAYS, VOID, _capitalize, algo, capitalize, chain, debounce, macro as default, event, formatBytesToProperUnit, formatNumbersWithThousandSeparator, get, getArray, isVtkObject, keystore, measurePromiseExecution, moveToProtected, newInstance, newTypedArray, newTypedArrayFrom, normalizeWheel, obj, proxy, proxyPropertyMapping, proxyPropertyState, set, setArray, setGet, setGetArray, setImmediateVTK, setLoggerFunction, throttle, traverseInstanceTree, uncapitalize, vtkDebugMacro, vtkErrorMacro, vtkInfoMacro, vtkLogMacro, vtkOnceErrorMacro, vtkWarningMacro };\n","import _typeof from '@babel/runtime/helpers/typeof';\nimport _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport globalThisShim from 'globalthis';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nvar vtkGlobal = globalThisShim(); // returns native globalThis if compliant\n\nvar factoryMapping = {\n vtkObject: function vtkObject() {\n return null;\n }\n};\nfunction vtk(obj) {\n if (obj === null || obj === undefined) {\n return obj;\n }\n\n if (obj.isA) {\n return obj;\n }\n\n if (!obj.vtkClass) {\n if (vtkGlobal.console && vtkGlobal.console.error) {\n vtkGlobal.console.error('Invalid VTK object');\n }\n\n return null;\n }\n\n var constructor = factoryMapping[obj.vtkClass];\n\n if (!constructor) {\n if (vtkGlobal.console && vtkGlobal.console.error) {\n vtkGlobal.console.error(\"No vtk class found for Object of type \".concat(obj.vtkClass));\n }\n\n return null;\n } // Shallow copy object\n\n\n var model = _objectSpread({}, obj); // Convert into vtkObject any nested key\n\n\n Object.keys(model).forEach(function (keyName) {\n if (model[keyName] && _typeof(model[keyName]) === 'object' && model[keyName].vtkClass) {\n model[keyName] = vtk(model[keyName]);\n }\n }); // Return the root\n\n var newInst = constructor(model);\n\n if (newInst && newInst.modified) {\n newInst.modified();\n }\n\n return newInst;\n}\n\nfunction register(vtkClassName, constructor) {\n factoryMapping[vtkClassName] = constructor;\n} // Nest register method under the vtk function\n\n\nvtk.register = register;\n\nexport { vtk as default, vtkGlobal };\n","/* eslint no-negated-condition: 0, no-new-func: 0 */\n\n'use strict';\n\nif (typeof self !== 'undefined') {\n\tmodule.exports = self;\n} else if (typeof window !== 'undefined') {\n\tmodule.exports = window;\n} else {\n\tmodule.exports = Function('return this')();\n}\n","'use strict';\n\nvar defineProperties = require('define-properties');\n\nvar implementation = require('./implementation');\nvar getPolyfill = require('./polyfill');\nvar shim = require('./shim');\n\nvar polyfill = getPolyfill();\n\nvar getGlobal = function () { return polyfill; };\n\ndefineProperties(getGlobal, {\n\tgetPolyfill: getPolyfill,\n\timplementation: implementation,\n\tshim: shim\n});\n\nmodule.exports = getGlobal;\n","'use strict';\n\nvar implementation = require('./implementation');\n\nmodule.exports = function getPolyfill() {\n\tif (typeof global !== 'object' || !global || global.Math !== Math || global.Array !== Array) {\n\t\treturn implementation;\n\t}\n\treturn global;\n};\n","'use strict';\n\nvar define = require('define-properties');\nvar getPolyfill = require('./polyfill');\n\nmodule.exports = function shimGlobal() {\n\tvar polyfill = getPolyfill();\n\tif (define.supportsDescriptors) {\n\t\tvar descriptor = Object.getOwnPropertyDescriptor(polyfill, 'globalThis');\n\t\tif (!descriptor || (descriptor.configurable && (descriptor.enumerable || !descriptor.writable || globalThis !== polyfill))) { // eslint-disable-line max-len\n\t\t\tObject.defineProperty(polyfill, 'globalThis', {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: false,\n\t\t\t\tvalue: polyfill,\n\t\t\t\twritable: true\n\t\t\t});\n\t\t}\n\t} else if (typeof globalThis !== 'object' || globalThis !== polyfill) {\n\t\tpolyfill.globalThis = polyfill;\n\t}\n\treturn polyfill;\n};\n","(function (factory) {\n if (typeof exports === 'object') {\n // Node/CommonJS\n module.exports = factory();\n } else if (typeof define === 'function' && define.amd) {\n // AMD\n define(factory);\n } else {\n // Browser globals (with support for web workers)\n var glob;\n\n try {\n glob = window;\n } catch (e) {\n glob = self;\n }\n\n glob.SparkMD5 = factory();\n }\n}(function (undefined) {\n\n 'use strict';\n\n /*\n * Fastest md5 implementation around (JKM md5).\n * Credits: Joseph Myers\n *\n * @see http://www.myersdaily.org/joseph/javascript/md5-text.html\n * @see http://jsperf.com/md5-shootout/7\n */\n\n /* this function is much faster,\n so if possible we use it. Some IEs\n are the only ones I know of that\n need the idiotic second function,\n generated by an if clause. */\n var add32 = function (a, b) {\n return (a + b) & 0xFFFFFFFF;\n },\n hex_chr = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'];\n\n\n function cmn(q, a, b, x, s, t) {\n a = add32(add32(a, q), add32(x, t));\n return add32((a << s) | (a >>> (32 - s)), b);\n }\n\n function md5cycle(x, k) {\n var a = x[0],\n b = x[1],\n c = x[2],\n d = x[3];\n\n a += (b & c | ~b & d) + k[0] - 680876936 | 0;\n a = (a << 7 | a >>> 25) + b | 0;\n d += (a & b | ~a & c) + k[1] - 389564586 | 0;\n d = (d << 12 | d >>> 20) + a | 0;\n c += (d & a | ~d & b) + k[2] + 606105819 | 0;\n c = (c << 17 | c >>> 15) + d | 0;\n b += (c & d | ~c & a) + k[3] - 1044525330 | 0;\n b = (b << 22 | b >>> 10) + c | 0;\n a += (b & c | ~b & d) + k[4] - 176418897 | 0;\n a = (a << 7 | a >>> 25) + b | 0;\n d += (a & b | ~a & c) + k[5] + 1200080426 | 0;\n d = (d << 12 | d >>> 20) + a | 0;\n c += (d & a | ~d & b) + k[6] - 1473231341 | 0;\n c = (c << 17 | c >>> 15) + d | 0;\n b += (c & d | ~c & a) + k[7] - 45705983 | 0;\n b = (b << 22 | b >>> 10) + c | 0;\n a += (b & c | ~b & d) + k[8] + 1770035416 | 0;\n a = (a << 7 | a >>> 25) + b | 0;\n d += (a & b | ~a & c) + k[9] - 1958414417 | 0;\n d = (d << 12 | d >>> 20) + a | 0;\n c += (d & a | ~d & b) + k[10] - 42063 | 0;\n c = (c << 17 | c >>> 15) + d | 0;\n b += (c & d | ~c & a) + k[11] - 1990404162 | 0;\n b = (b << 22 | b >>> 10) + c | 0;\n a += (b & c | ~b & d) + k[12] + 1804603682 | 0;\n a = (a << 7 | a >>> 25) + b | 0;\n d += (a & b | ~a & c) + k[13] - 40341101 | 0;\n d = (d << 12 | d >>> 20) + a | 0;\n c += (d & a | ~d & b) + k[14] - 1502002290 | 0;\n c = (c << 17 | c >>> 15) + d | 0;\n b += (c & d | ~c & a) + k[15] + 1236535329 | 0;\n b = (b << 22 | b >>> 10) + c | 0;\n\n a += (b & d | c & ~d) + k[1] - 165796510 | 0;\n a = (a << 5 | a >>> 27) + b | 0;\n d += (a & c | b & ~c) + k[6] - 1069501632 | 0;\n d = (d << 9 | d >>> 23) + a | 0;\n c += (d & b | a & ~b) + k[11] + 643717713 | 0;\n c = (c << 14 | c >>> 18) + d | 0;\n b += (c & a | d & ~a) + k[0] - 373897302 | 0;\n b = (b << 20 | b >>> 12) + c | 0;\n a += (b & d | c & ~d) + k[5] - 701558691 | 0;\n a = (a << 5 | a >>> 27) + b | 0;\n d += (a & c | b & ~c) + k[10] + 38016083 | 0;\n d = (d << 9 | d >>> 23) + a | 0;\n c += (d & b | a & ~b) + k[15] - 660478335 | 0;\n c = (c << 14 | c >>> 18) + d | 0;\n b += (c & a | d & ~a) + k[4] - 405537848 | 0;\n b = (b << 20 | b >>> 12) + c | 0;\n a += (b & d | c & ~d) + k[9] + 568446438 | 0;\n a = (a << 5 | a >>> 27) + b | 0;\n d += (a & c | b & ~c) + k[14] - 1019803690 | 0;\n d = (d << 9 | d >>> 23) + a | 0;\n c += (d & b | a & ~b) + k[3] - 187363961 | 0;\n c = (c << 14 | c >>> 18) + d | 0;\n b += (c & a | d & ~a) + k[8] + 1163531501 | 0;\n b = (b << 20 | b >>> 12) + c | 0;\n a += (b & d | c & ~d) + k[13] - 1444681467 | 0;\n a = (a << 5 | a >>> 27) + b | 0;\n d += (a & c | b & ~c) + k[2] - 51403784 | 0;\n d = (d << 9 | d >>> 23) + a | 0;\n c += (d & b | a & ~b) + k[7] + 1735328473 | 0;\n c = (c << 14 | c >>> 18) + d | 0;\n b += (c & a | d & ~a) + k[12] - 1926607734 | 0;\n b = (b << 20 | b >>> 12) + c | 0;\n\n a += (b ^ c ^ d) + k[5] - 378558 | 0;\n a = (a << 4 | a >>> 28) + b | 0;\n d += (a ^ b ^ c) + k[8] - 2022574463 | 0;\n d = (d << 11 | d >>> 21) + a | 0;\n c += (d ^ a ^ b) + k[11] + 1839030562 | 0;\n c = (c << 16 | c >>> 16) + d | 0;\n b += (c ^ d ^ a) + k[14] - 35309556 | 0;\n b = (b << 23 | b >>> 9) + c | 0;\n a += (b ^ c ^ d) + k[1] - 1530992060 | 0;\n a = (a << 4 | a >>> 28) + b | 0;\n d += (a ^ b ^ c) + k[4] + 1272893353 | 0;\n d = (d << 11 | d >>> 21) + a | 0;\n c += (d ^ a ^ b) + k[7] - 155497632 | 0;\n c = (c << 16 | c >>> 16) + d | 0;\n b += (c ^ d ^ a) + k[10] - 1094730640 | 0;\n b = (b << 23 | b >>> 9) + c | 0;\n a += (b ^ c ^ d) + k[13] + 681279174 | 0;\n a = (a << 4 | a >>> 28) + b | 0;\n d += (a ^ b ^ c) + k[0] - 358537222 | 0;\n d = (d << 11 | d >>> 21) + a | 0;\n c += (d ^ a ^ b) + k[3] - 722521979 | 0;\n c = (c << 16 | c >>> 16) + d | 0;\n b += (c ^ d ^ a) + k[6] + 76029189 | 0;\n b = (b << 23 | b >>> 9) + c | 0;\n a += (b ^ c ^ d) + k[9] - 640364487 | 0;\n a = (a << 4 | a >>> 28) + b | 0;\n d += (a ^ b ^ c) + k[12] - 421815835 | 0;\n d = (d << 11 | d >>> 21) + a | 0;\n c += (d ^ a ^ b) + k[15] + 530742520 | 0;\n c = (c << 16 | c >>> 16) + d | 0;\n b += (c ^ d ^ a) + k[2] - 995338651 | 0;\n b = (b << 23 | b >>> 9) + c | 0;\n\n a += (c ^ (b | ~d)) + k[0] - 198630844 | 0;\n a = (a << 6 | a >>> 26) + b | 0;\n d += (b ^ (a | ~c)) + k[7] + 1126891415 | 0;\n d = (d << 10 | d >>> 22) + a | 0;\n c += (a ^ (d | ~b)) + k[14] - 1416354905 | 0;\n c = (c << 15 | c >>> 17) + d | 0;\n b += (d ^ (c | ~a)) + k[5] - 57434055 | 0;\n b = (b << 21 |b >>> 11) + c | 0;\n a += (c ^ (b | ~d)) + k[12] + 1700485571 | 0;\n a = (a << 6 | a >>> 26) + b | 0;\n d += (b ^ (a | ~c)) + k[3] - 1894986606 | 0;\n d = (d << 10 | d >>> 22) + a | 0;\n c += (a ^ (d | ~b)) + k[10] - 1051523 | 0;\n c = (c << 15 | c >>> 17) + d | 0;\n b += (d ^ (c | ~a)) + k[1] - 2054922799 | 0;\n b = (b << 21 |b >>> 11) + c | 0;\n a += (c ^ (b | ~d)) + k[8] + 1873313359 | 0;\n a = (a << 6 | a >>> 26) + b | 0;\n d += (b ^ (a | ~c)) + k[15] - 30611744 | 0;\n d = (d << 10 | d >>> 22) + a | 0;\n c += (a ^ (d | ~b)) + k[6] - 1560198380 | 0;\n c = (c << 15 | c >>> 17) + d | 0;\n b += (d ^ (c | ~a)) + k[13] + 1309151649 | 0;\n b = (b << 21 |b >>> 11) + c | 0;\n a += (c ^ (b | ~d)) + k[4] - 145523070 | 0;\n a = (a << 6 | a >>> 26) + b | 0;\n d += (b ^ (a | ~c)) + k[11] - 1120210379 | 0;\n d = (d << 10 | d >>> 22) + a | 0;\n c += (a ^ (d | ~b)) + k[2] + 718787259 | 0;\n c = (c << 15 | c >>> 17) + d | 0;\n b += (d ^ (c | ~a)) + k[9] - 343485551 | 0;\n b = (b << 21 | b >>> 11) + c | 0;\n\n x[0] = a + x[0] | 0;\n x[1] = b + x[1] | 0;\n x[2] = c + x[2] | 0;\n x[3] = d + x[3] | 0;\n }\n\n function md5blk(s) {\n var md5blks = [],\n i; /* Andy King said do it this way. */\n\n for (i = 0; i < 64; i += 4) {\n md5blks[i >> 2] = s.charCodeAt(i) + (s.charCodeAt(i + 1) << 8) + (s.charCodeAt(i + 2) << 16) + (s.charCodeAt(i + 3) << 24);\n }\n return md5blks;\n }\n\n function md5blk_array(a) {\n var md5blks = [],\n i; /* Andy King said do it this way. */\n\n for (i = 0; i < 64; i += 4) {\n md5blks[i >> 2] = a[i] + (a[i + 1] << 8) + (a[i + 2] << 16) + (a[i + 3] << 24);\n }\n return md5blks;\n }\n\n function md51(s) {\n var n = s.length,\n state = [1732584193, -271733879, -1732584194, 271733878],\n i,\n length,\n tail,\n tmp,\n lo,\n hi;\n\n for (i = 64; i <= n; i += 64) {\n md5cycle(state, md5blk(s.substring(i - 64, i)));\n }\n s = s.substring(i - 64);\n length = s.length;\n tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];\n for (i = 0; i < length; i += 1) {\n tail[i >> 2] |= s.charCodeAt(i) << ((i % 4) << 3);\n }\n tail[i >> 2] |= 0x80 << ((i % 4) << 3);\n if (i > 55) {\n md5cycle(state, tail);\n for (i = 0; i < 16; i += 1) {\n tail[i] = 0;\n }\n }\n\n // Beware that the final length might not fit in 32 bits so we take care of that\n tmp = n * 8;\n tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);\n lo = parseInt(tmp[2], 16);\n hi = parseInt(tmp[1], 16) || 0;\n\n tail[14] = lo;\n tail[15] = hi;\n\n md5cycle(state, tail);\n return state;\n }\n\n function md51_array(a) {\n var n = a.length,\n state = [1732584193, -271733879, -1732584194, 271733878],\n i,\n length,\n tail,\n tmp,\n lo,\n hi;\n\n for (i = 64; i <= n; i += 64) {\n md5cycle(state, md5blk_array(a.subarray(i - 64, i)));\n }\n\n // Not sure if it is a bug, however IE10 will always produce a sub array of length 1\n // containing the last element of the parent array if the sub array specified starts\n // beyond the length of the parent array - weird.\n // https://connect.microsoft.com/IE/feedback/details/771452/typed-array-subarray-issue\n a = (i - 64) < n ? a.subarray(i - 64) : new Uint8Array(0);\n\n length = a.length;\n tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];\n for (i = 0; i < length; i += 1) {\n tail[i >> 2] |= a[i] << ((i % 4) << 3);\n }\n\n tail[i >> 2] |= 0x80 << ((i % 4) << 3);\n if (i > 55) {\n md5cycle(state, tail);\n for (i = 0; i < 16; i += 1) {\n tail[i] = 0;\n }\n }\n\n // Beware that the final length might not fit in 32 bits so we take care of that\n tmp = n * 8;\n tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);\n lo = parseInt(tmp[2], 16);\n hi = parseInt(tmp[1], 16) || 0;\n\n tail[14] = lo;\n tail[15] = hi;\n\n md5cycle(state, tail);\n\n return state;\n }\n\n function rhex(n) {\n var s = '',\n j;\n for (j = 0; j < 4; j += 1) {\n s += hex_chr[(n >> (j * 8 + 4)) & 0x0F] + hex_chr[(n >> (j * 8)) & 0x0F];\n }\n return s;\n }\n\n function hex(x) {\n var i;\n for (i = 0; i < x.length; i += 1) {\n x[i] = rhex(x[i]);\n }\n return x.join('');\n }\n\n // In some cases the fast add32 function cannot be used..\n if (hex(md51('hello')) !== '5d41402abc4b2a76b9719d911017c592') {\n add32 = function (x, y) {\n var lsw = (x & 0xFFFF) + (y & 0xFFFF),\n msw = (x >> 16) + (y >> 16) + (lsw >> 16);\n return (msw << 16) | (lsw & 0xFFFF);\n };\n }\n\n // ---------------------------------------------------\n\n /**\n * ArrayBuffer slice polyfill.\n *\n * @see https://github.com/ttaubert/node-arraybuffer-slice\n */\n\n if (typeof ArrayBuffer !== 'undefined' && !ArrayBuffer.prototype.slice) {\n (function () {\n function clamp(val, length) {\n val = (val | 0) || 0;\n\n if (val < 0) {\n return Math.max(val + length, 0);\n }\n\n return Math.min(val, length);\n }\n\n ArrayBuffer.prototype.slice = function (from, to) {\n var length = this.byteLength,\n begin = clamp(from, length),\n end = length,\n num,\n target,\n targetArray,\n sourceArray;\n\n if (to !== undefined) {\n end = clamp(to, length);\n }\n\n if (begin > end) {\n return new ArrayBuffer(0);\n }\n\n num = end - begin;\n target = new ArrayBuffer(num);\n targetArray = new Uint8Array(target);\n\n sourceArray = new Uint8Array(this, begin, num);\n targetArray.set(sourceArray);\n\n return target;\n };\n })();\n }\n\n // ---------------------------------------------------\n\n /**\n * Helpers.\n */\n\n function toUtf8(str) {\n if (/[\\u0080-\\uFFFF]/.test(str)) {\n str = unescape(encodeURIComponent(str));\n }\n\n return str;\n }\n\n function utf8Str2ArrayBuffer(str, returnUInt8Array) {\n var length = str.length,\n buff = new ArrayBuffer(length),\n arr = new Uint8Array(buff),\n i;\n\n for (i = 0; i < length; i += 1) {\n arr[i] = str.charCodeAt(i);\n }\n\n return returnUInt8Array ? arr : buff;\n }\n\n function arrayBuffer2Utf8Str(buff) {\n return String.fromCharCode.apply(null, new Uint8Array(buff));\n }\n\n function concatenateArrayBuffers(first, second, returnUInt8Array) {\n var result = new Uint8Array(first.byteLength + second.byteLength);\n\n result.set(new Uint8Array(first));\n result.set(new Uint8Array(second), first.byteLength);\n\n return returnUInt8Array ? result : result.buffer;\n }\n\n function hexToBinaryString(hex) {\n var bytes = [],\n length = hex.length,\n x;\n\n for (x = 0; x < length - 1; x += 2) {\n bytes.push(parseInt(hex.substr(x, 2), 16));\n }\n\n return String.fromCharCode.apply(String, bytes);\n }\n\n // ---------------------------------------------------\n\n /**\n * SparkMD5 OOP implementation.\n *\n * Use this class to perform an incremental md5, otherwise use the\n * static methods instead.\n */\n\n function SparkMD5() {\n // call reset to init the instance\n this.reset();\n }\n\n /**\n * Appends a string.\n * A conversion will be applied if an utf8 string is detected.\n *\n * @param {String} str The string to be appended\n *\n * @return {SparkMD5} The instance itself\n */\n SparkMD5.prototype.append = function (str) {\n // Converts the string to utf8 bytes if necessary\n // Then append as binary\n this.appendBinary(toUtf8(str));\n\n return this;\n };\n\n /**\n * Appends a binary string.\n *\n * @param {String} contents The binary string to be appended\n *\n * @return {SparkMD5} The instance itself\n */\n SparkMD5.prototype.appendBinary = function (contents) {\n this._buff += contents;\n this._length += contents.length;\n\n var length = this._buff.length,\n i;\n\n for (i = 64; i <= length; i += 64) {\n md5cycle(this._hash, md5blk(this._buff.substring(i - 64, i)));\n }\n\n this._buff = this._buff.substring(i - 64);\n\n return this;\n };\n\n /**\n * Finishes the incremental computation, reseting the internal state and\n * returning the result.\n *\n * @param {Boolean} raw True to get the raw string, false to get the hex string\n *\n * @return {String} The result\n */\n SparkMD5.prototype.end = function (raw) {\n var buff = this._buff,\n length = buff.length,\n i,\n tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n ret;\n\n for (i = 0; i < length; i += 1) {\n tail[i >> 2] |= buff.charCodeAt(i) << ((i % 4) << 3);\n }\n\n this._finish(tail, length);\n ret = hex(this._hash);\n\n if (raw) {\n ret = hexToBinaryString(ret);\n }\n\n this.reset();\n\n return ret;\n };\n\n /**\n * Resets the internal state of the computation.\n *\n * @return {SparkMD5} The instance itself\n */\n SparkMD5.prototype.reset = function () {\n this._buff = '';\n this._length = 0;\n this._hash = [1732584193, -271733879, -1732584194, 271733878];\n\n return this;\n };\n\n /**\n * Gets the internal state of the computation.\n *\n * @return {Object} The state\n */\n SparkMD5.prototype.getState = function () {\n return {\n buff: this._buff,\n length: this._length,\n hash: this._hash.slice()\n };\n };\n\n /**\n * Gets the internal state of the computation.\n *\n * @param {Object} state The state\n *\n * @return {SparkMD5} The instance itself\n */\n SparkMD5.prototype.setState = function (state) {\n this._buff = state.buff;\n this._length = state.length;\n this._hash = state.hash;\n\n return this;\n };\n\n /**\n * Releases memory used by the incremental buffer and other additional\n * resources. If you plan to use the instance again, use reset instead.\n */\n SparkMD5.prototype.destroy = function () {\n delete this._hash;\n delete this._buff;\n delete this._length;\n };\n\n /**\n * Finish the final calculation based on the tail.\n *\n * @param {Array} tail The tail (will be modified)\n * @param {Number} length The length of the remaining buffer\n */\n SparkMD5.prototype._finish = function (tail, length) {\n var i = length,\n tmp,\n lo,\n hi;\n\n tail[i >> 2] |= 0x80 << ((i % 4) << 3);\n if (i > 55) {\n md5cycle(this._hash, tail);\n for (i = 0; i < 16; i += 1) {\n tail[i] = 0;\n }\n }\n\n // Do the final computation based on the tail and length\n // Beware that the final length may not fit in 32 bits so we take care of that\n tmp = this._length * 8;\n tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);\n lo = parseInt(tmp[2], 16);\n hi = parseInt(tmp[1], 16) || 0;\n\n tail[14] = lo;\n tail[15] = hi;\n md5cycle(this._hash, tail);\n };\n\n /**\n * Performs the md5 hash on a string.\n * A conversion will be applied if utf8 string is detected.\n *\n * @param {String} str The string\n * @param {Boolean} [raw] True to get the raw string, false to get the hex string\n *\n * @return {String} The result\n */\n SparkMD5.hash = function (str, raw) {\n // Converts the string to utf8 bytes if necessary\n // Then compute it using the binary function\n return SparkMD5.hashBinary(toUtf8(str), raw);\n };\n\n /**\n * Performs the md5 hash on a binary string.\n *\n * @param {String} content The binary string\n * @param {Boolean} [raw] True to get the raw string, false to get the hex string\n *\n * @return {String} The result\n */\n SparkMD5.hashBinary = function (content, raw) {\n var hash = md51(content),\n ret = hex(hash);\n\n return raw ? hexToBinaryString(ret) : ret;\n };\n\n // ---------------------------------------------------\n\n /**\n * SparkMD5 OOP implementation for array buffers.\n *\n * Use this class to perform an incremental md5 ONLY for array buffers.\n */\n SparkMD5.ArrayBuffer = function () {\n // call reset to init the instance\n this.reset();\n };\n\n /**\n * Appends an array buffer.\n *\n * @param {ArrayBuffer} arr The array to be appended\n *\n * @return {SparkMD5.ArrayBuffer} The instance itself\n */\n SparkMD5.ArrayBuffer.prototype.append = function (arr) {\n var buff = concatenateArrayBuffers(this._buff.buffer, arr, true),\n length = buff.length,\n i;\n\n this._length += arr.byteLength;\n\n for (i = 64; i <= length; i += 64) {\n md5cycle(this._hash, md5blk_array(buff.subarray(i - 64, i)));\n }\n\n this._buff = (i - 64) < length ? new Uint8Array(buff.buffer.slice(i - 64)) : new Uint8Array(0);\n\n return this;\n };\n\n /**\n * Finishes the incremental computation, reseting the internal state and\n * returning the result.\n *\n * @param {Boolean} raw True to get the raw string, false to get the hex string\n *\n * @return {String} The result\n */\n SparkMD5.ArrayBuffer.prototype.end = function (raw) {\n var buff = this._buff,\n length = buff.length,\n tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n i,\n ret;\n\n for (i = 0; i < length; i += 1) {\n tail[i >> 2] |= buff[i] << ((i % 4) << 3);\n }\n\n this._finish(tail, length);\n ret = hex(this._hash);\n\n if (raw) {\n ret = hexToBinaryString(ret);\n }\n\n this.reset();\n\n return ret;\n };\n\n /**\n * Resets the internal state of the computation.\n *\n * @return {SparkMD5.ArrayBuffer} The instance itself\n */\n SparkMD5.ArrayBuffer.prototype.reset = function () {\n this._buff = new Uint8Array(0);\n this._length = 0;\n this._hash = [1732584193, -271733879, -1732584194, 271733878];\n\n return this;\n };\n\n /**\n * Gets the internal state of the computation.\n *\n * @return {Object} The state\n */\n SparkMD5.ArrayBuffer.prototype.getState = function () {\n var state = SparkMD5.prototype.getState.call(this);\n\n // Convert buffer to a string\n state.buff = arrayBuffer2Utf8Str(state.buff);\n\n return state;\n };\n\n /**\n * Gets the internal state of the computation.\n *\n * @param {Object} state The state\n *\n * @return {SparkMD5.ArrayBuffer} The instance itself\n */\n SparkMD5.ArrayBuffer.prototype.setState = function (state) {\n // Convert string to buffer\n state.buff = utf8Str2ArrayBuffer(state.buff, true);\n\n return SparkMD5.prototype.setState.call(this, state);\n };\n\n SparkMD5.ArrayBuffer.prototype.destroy = SparkMD5.prototype.destroy;\n\n SparkMD5.ArrayBuffer.prototype._finish = SparkMD5.prototype._finish;\n\n /**\n * Performs the md5 hash on an array buffer.\n *\n * @param {ArrayBuffer} arr The array buffer\n * @param {Boolean} [raw] True to get the raw string, false to get the hex one\n *\n * @return {String} The result\n */\n SparkMD5.ArrayBuffer.hash = function (arr, raw) {\n var hash = md51_array(new Uint8Array(arr)),\n ret = hex(hash);\n\n return raw ? hexToBinaryString(ret) : ret;\n };\n\n return SparkMD5;\n}));\n","var _typeof = require(\"./typeof.js\")[\"default\"];\nfunction _regeneratorRuntime() {\n \"use strict\"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */\n module.exports = _regeneratorRuntime = function _regeneratorRuntime() {\n return exports;\n }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;\n var exports = {},\n Op = Object.prototype,\n hasOwn = Op.hasOwnProperty,\n defineProperty = Object.defineProperty || function (obj, key, desc) {\n obj[key] = desc.value;\n },\n $Symbol = \"function\" == typeof Symbol ? Symbol : {},\n iteratorSymbol = $Symbol.iterator || \"@@iterator\",\n asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\",\n toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n function define(obj, key, value) {\n return Object.defineProperty(obj, key, {\n value: value,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }), obj[key];\n }\n try {\n define({}, \"\");\n } catch (err) {\n define = function define(obj, key, value) {\n return obj[key] = value;\n };\n }\n function wrap(innerFn, outerFn, self, tryLocsList) {\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator,\n generator = Object.create(protoGenerator.prototype),\n context = new Context(tryLocsList || []);\n return defineProperty(generator, \"_invoke\", {\n value: makeInvokeMethod(innerFn, self, context)\n }), generator;\n }\n function tryCatch(fn, obj, arg) {\n try {\n return {\n type: \"normal\",\n arg: fn.call(obj, arg)\n };\n } catch (err) {\n return {\n type: \"throw\",\n arg: err\n };\n }\n }\n exports.wrap = wrap;\n var ContinueSentinel = {};\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n var IteratorPrototype = {};\n define(IteratorPrototype, iteratorSymbol, function () {\n return this;\n });\n var getProto = Object.getPrototypeOf,\n NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype);\n var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype);\n function defineIteratorMethods(prototype) {\n [\"next\", \"throw\", \"return\"].forEach(function (method) {\n define(prototype, method, function (arg) {\n return this._invoke(method, arg);\n });\n });\n }\n function AsyncIterator(generator, PromiseImpl) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n if (\"throw\" !== record.type) {\n var result = record.arg,\n value = result.value;\n return value && \"object\" == _typeof(value) && hasOwn.call(value, \"__await\") ? PromiseImpl.resolve(value.__await).then(function (value) {\n invoke(\"next\", value, resolve, reject);\n }, function (err) {\n invoke(\"throw\", err, resolve, reject);\n }) : PromiseImpl.resolve(value).then(function (unwrapped) {\n result.value = unwrapped, resolve(result);\n }, function (error) {\n return invoke(\"throw\", error, resolve, reject);\n });\n }\n reject(record.arg);\n }\n var previousPromise;\n defineProperty(this, \"_invoke\", {\n value: function value(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new PromiseImpl(function (resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();\n }\n });\n }\n function makeInvokeMethod(innerFn, self, context) {\n var state = \"suspendedStart\";\n return function (method, arg) {\n if (\"executing\" === state) throw new Error(\"Generator is already running\");\n if (\"completed\" === state) {\n if (\"throw\" === method) throw arg;\n return doneResult();\n }\n for (context.method = method, context.arg = arg;;) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n if (\"next\" === context.method) context.sent = context._sent = context.arg;else if (\"throw\" === context.method) {\n if (\"suspendedStart\" === state) throw state = \"completed\", context.arg;\n context.dispatchException(context.arg);\n } else \"return\" === context.method && context.abrupt(\"return\", context.arg);\n state = \"executing\";\n var record = tryCatch(innerFn, self, context);\n if (\"normal\" === record.type) {\n if (state = context.done ? \"completed\" : \"suspendedYield\", record.arg === ContinueSentinel) continue;\n return {\n value: record.arg,\n done: context.done\n };\n }\n \"throw\" === record.type && (state = \"completed\", context.method = \"throw\", context.arg = record.arg);\n }\n };\n }\n function maybeInvokeDelegate(delegate, context) {\n var methodName = context.method,\n method = delegate.iterator[methodName];\n if (undefined === method) return context.delegate = null, \"throw\" === methodName && delegate.iterator[\"return\"] && (context.method = \"return\", context.arg = undefined, maybeInvokeDelegate(delegate, context), \"throw\" === context.method) || \"return\" !== methodName && (context.method = \"throw\", context.arg = new TypeError(\"The iterator does not provide a '\" + methodName + \"' method\")), ContinueSentinel;\n var record = tryCatch(method, delegate.iterator, context.arg);\n if (\"throw\" === record.type) return context.method = \"throw\", context.arg = record.arg, context.delegate = null, ContinueSentinel;\n var info = record.arg;\n return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, \"return\" !== context.method && (context.method = \"next\", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = \"throw\", context.arg = new TypeError(\"iterator result is not an object\"), context.delegate = null, ContinueSentinel);\n }\n function pushTryEntry(locs) {\n var entry = {\n tryLoc: locs[0]\n };\n 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry);\n }\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\", delete record.arg, entry.completion = record;\n }\n function Context(tryLocsList) {\n this.tryEntries = [{\n tryLoc: \"root\"\n }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0);\n }\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) return iteratorMethod.call(iterable);\n if (\"function\" == typeof iterable.next) return iterable;\n if (!isNaN(iterable.length)) {\n var i = -1,\n next = function next() {\n for (; ++i < iterable.length;) if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next;\n return next.value = undefined, next.done = !0, next;\n };\n return next.next = next;\n }\n }\n return {\n next: doneResult\n };\n }\n function doneResult() {\n return {\n value: undefined,\n done: !0\n };\n }\n return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, \"constructor\", {\n value: GeneratorFunctionPrototype,\n configurable: !0\n }), defineProperty(GeneratorFunctionPrototype, \"constructor\", {\n value: GeneratorFunction,\n configurable: !0\n }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, \"GeneratorFunction\"), exports.isGeneratorFunction = function (genFun) {\n var ctor = \"function\" == typeof genFun && genFun.constructor;\n return !!ctor && (ctor === GeneratorFunction || \"GeneratorFunction\" === (ctor.displayName || ctor.name));\n }, exports.mark = function (genFun) {\n return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, \"GeneratorFunction\")), genFun.prototype = Object.create(Gp), genFun;\n }, exports.awrap = function (arg) {\n return {\n __await: arg\n };\n }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () {\n return this;\n }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) {\n void 0 === PromiseImpl && (PromiseImpl = Promise);\n var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl);\n return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) {\n return result.done ? result.value : iter.next();\n });\n }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, \"Generator\"), define(Gp, iteratorSymbol, function () {\n return this;\n }), define(Gp, \"toString\", function () {\n return \"[object Generator]\";\n }), exports.keys = function (val) {\n var object = Object(val),\n keys = [];\n for (var key in object) keys.push(key);\n return keys.reverse(), function next() {\n for (; keys.length;) {\n var key = keys.pop();\n if (key in object) return next.value = key, next.done = !1, next;\n }\n return next.done = !0, next;\n };\n }, exports.values = values, Context.prototype = {\n constructor: Context,\n reset: function reset(skipTempReset) {\n if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = \"next\", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) \"t\" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined);\n },\n stop: function stop() {\n this.done = !0;\n var rootRecord = this.tryEntries[0].completion;\n if (\"throw\" === rootRecord.type) throw rootRecord.arg;\n return this.rval;\n },\n dispatchException: function dispatchException(exception) {\n if (this.done) throw exception;\n var context = this;\n function handle(loc, caught) {\n return record.type = \"throw\", record.arg = exception, context.next = loc, caught && (context.method = \"next\", context.arg = undefined), !!caught;\n }\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i],\n record = entry.completion;\n if (\"root\" === entry.tryLoc) return handle(\"end\");\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\"),\n hasFinally = hasOwn.call(entry, \"finallyLoc\");\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0);\n if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc);\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0);\n } else {\n if (!hasFinally) throw new Error(\"try statement without catch or finally\");\n if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc);\n }\n }\n }\n },\n abrupt: function abrupt(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev && hasOwn.call(entry, \"finallyLoc\") && this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n finallyEntry && (\"break\" === type || \"continue\" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null);\n var record = finallyEntry ? finallyEntry.completion : {};\n return record.type = type, record.arg = arg, finallyEntry ? (this.method = \"next\", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record);\n },\n complete: function complete(record, afterLoc) {\n if (\"throw\" === record.type) throw record.arg;\n return \"break\" === record.type || \"continue\" === record.type ? this.next = record.arg : \"return\" === record.type ? (this.rval = this.arg = record.arg, this.method = \"return\", this.next = \"end\") : \"normal\" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel;\n },\n finish: function finish(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel;\n }\n },\n \"catch\": function _catch(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (\"throw\" === record.type) {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n throw new Error(\"illegal catch attempt\");\n },\n delegateYield: function delegateYield(iterable, resultName, nextLoc) {\n return this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n }, \"next\" === this.method && (this.arg = undefined), ContinueSentinel;\n }\n }, exports;\n}\nmodule.exports = _regeneratorRuntime, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","// TODO(Babel 8): Remove this file.\n\nvar runtime = require(\"../helpers/regeneratorRuntime\")();\nmodule.exports = runtime;\n\n// Copied from https://github.com/facebook/regenerator/blob/main/packages/runtime/runtime.js#L736=\ntry {\n regeneratorRuntime = runtime;\n} catch (accidentalStrictMode) {\n if (typeof globalThis === \"object\") {\n globalThis.regeneratorRuntime = runtime;\n } else {\n Function(\"r\", \"regeneratorRuntime = r\")(runtime);\n }\n}\n","export default function ascending(a, b) {\n return a == null || b == null ? NaN : a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\n","export default function descending(a, b) {\n return a == null || b == null ? NaN\n : b < a ? -1\n : b > a ? 1\n : b >= a ? 0\n : NaN;\n}\n","import ascending from \"./ascending.js\";\nimport descending from \"./descending.js\";\n\nexport default function bisector(f) {\n let compare1, compare2, delta;\n\n // If an accessor is specified, promote it to a comparator. In this case we\n // can test whether the search value is (self-) comparable. We can’t do this\n // for a comparator (except for specific, known comparators) because we can’t\n // tell if the comparator is symmetric, and an asymmetric comparator can’t be\n // used to test whether a single value is comparable.\n if (f.length !== 2) {\n compare1 = ascending;\n compare2 = (d, x) => ascending(f(d), x);\n delta = (d, x) => f(d) - x;\n } else {\n compare1 = f === ascending || f === descending ? f : zero;\n compare2 = f;\n delta = f;\n }\n\n function left(a, x, lo = 0, hi = a.length) {\n if (lo < hi) {\n if (compare1(x, x) !== 0) return hi;\n do {\n const mid = (lo + hi) >>> 1;\n if (compare2(a[mid], x) < 0) lo = mid + 1;\n else hi = mid;\n } while (lo < hi);\n }\n return lo;\n }\n\n function right(a, x, lo = 0, hi = a.length) {\n if (lo < hi) {\n if (compare1(x, x) !== 0) return hi;\n do {\n const mid = (lo + hi) >>> 1;\n if (compare2(a[mid], x) <= 0) lo = mid + 1;\n else hi = mid;\n } while (lo < hi);\n }\n return lo;\n }\n\n function center(a, x, lo = 0, hi = a.length) {\n const i = left(a, x, lo, hi - 1);\n return i > lo && delta(a[i - 1], x) > -delta(a[i], x) ? i - 1 : i;\n }\n\n return {left, center, right};\n}\n\nfunction zero() {\n return 0;\n}\n","import ascending from \"./ascending.js\";\nimport bisector from \"./bisector.js\";\nimport number from \"./number.js\";\n\nconst ascendingBisect = bisector(ascending);\nexport const bisectRight = ascendingBisect.right;\nexport const bisectLeft = ascendingBisect.left;\nexport const bisectCenter = bisector(number).center;\nexport default bisectRight;\n","export default function number(x) {\n return x === null ? NaN : +x;\n}\n\nexport function* numbers(values, valueof) {\n if (valueof === undefined) {\n for (let value of values) {\n if (value != null && (value = +value) >= value) {\n yield value;\n }\n }\n } else {\n let index = -1;\n for (let value of values) {\n if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) {\n yield value;\n }\n }\n }\n}\n","export function blur(values, r) {\n if (!((r = +r) >= 0)) throw new RangeError(\"invalid r\");\n let length = values.length;\n if (!((length = Math.floor(length)) >= 0)) throw new RangeError(\"invalid length\");\n if (!length || !r) return values;\n const blur = blurf(r);\n const temp = values.slice();\n blur(values, temp, 0, length, 1);\n blur(temp, values, 0, length, 1);\n blur(values, temp, 0, length, 1);\n return values;\n}\n\nexport const blur2 = Blur2(blurf);\n\nexport const blurImage = Blur2(blurfImage);\n\nfunction Blur2(blur) {\n return function(data, rx, ry = rx) {\n if (!((rx = +rx) >= 0)) throw new RangeError(\"invalid rx\");\n if (!((ry = +ry) >= 0)) throw new RangeError(\"invalid ry\");\n let {data: values, width, height} = data;\n if (!((width = Math.floor(width)) >= 0)) throw new RangeError(\"invalid width\");\n if (!((height = Math.floor(height !== undefined ? height : values.length / width)) >= 0)) throw new RangeError(\"invalid height\");\n if (!width || !height || (!rx && !ry)) return data;\n const blurx = rx && blur(rx);\n const blury = ry && blur(ry);\n const temp = values.slice();\n if (blurx && blury) {\n blurh(blurx, temp, values, width, height);\n blurh(blurx, values, temp, width, height);\n blurh(blurx, temp, values, width, height);\n blurv(blury, values, temp, width, height);\n blurv(blury, temp, values, width, height);\n blurv(blury, values, temp, width, height);\n } else if (blurx) {\n blurh(blurx, values, temp, width, height);\n blurh(blurx, temp, values, width, height);\n blurh(blurx, values, temp, width, height);\n } else if (blury) {\n blurv(blury, values, temp, width, height);\n blurv(blury, temp, values, width, height);\n blurv(blury, values, temp, width, height);\n }\n return data;\n };\n}\n\nfunction blurh(blur, T, S, w, h) {\n for (let y = 0, n = w * h; y < n;) {\n blur(T, S, y, y += w, 1);\n }\n}\n\nfunction blurv(blur, T, S, w, h) {\n for (let x = 0, n = w * h; x < w; ++x) {\n blur(T, S, x, x + n, w);\n }\n}\n\nfunction blurfImage(radius) {\n const blur = blurf(radius);\n return (T, S, start, stop, step) => {\n start <<= 2, stop <<= 2, step <<= 2;\n blur(T, S, start + 0, stop + 0, step);\n blur(T, S, start + 1, stop + 1, step);\n blur(T, S, start + 2, stop + 2, step);\n blur(T, S, start + 3, stop + 3, step);\n };\n}\n\n// Given a target array T, a source array S, sets each value T[i] to the average\n// of {S[i - r], …, S[i], …, S[i + r]}, where r = ⌊radius⌋, start <= i < stop,\n// for each i, i + step, i + 2 * step, etc., and where S[j] is clamped between\n// S[start] (inclusive) and S[stop] (exclusive). If the given radius is not an\n// integer, S[i - r - 1] and S[i + r + 1] are added to the sum, each weighted\n// according to r - ⌊radius⌋.\nfunction blurf(radius) {\n const radius0 = Math.floor(radius);\n if (radius0 === radius) return bluri(radius);\n const t = radius - radius0;\n const w = 2 * radius + 1;\n return (T, S, start, stop, step) => { // stop must be aligned!\n if (!((stop -= step) >= start)) return; // inclusive stop\n let sum = radius0 * S[start];\n const s0 = step * radius0;\n const s1 = s0 + step;\n for (let i = start, j = start + s0; i < j; i += step) {\n sum += S[Math.min(stop, i)];\n }\n for (let i = start, j = stop; i <= j; i += step) {\n sum += S[Math.min(stop, i + s0)];\n T[i] = (sum + t * (S[Math.max(start, i - s1)] + S[Math.min(stop, i + s1)])) / w;\n sum -= S[Math.max(start, i - s0)];\n }\n };\n}\n\n// Like blurf, but optimized for integer radius.\nfunction bluri(radius) {\n const w = 2 * radius + 1;\n return (T, S, start, stop, step) => { // stop must be aligned!\n if (!((stop -= step) >= start)) return; // inclusive stop\n let sum = radius * S[start];\n const s = step * radius;\n for (let i = start, j = start + s; i < j; i += step) {\n sum += S[Math.min(stop, i)];\n }\n for (let i = start, j = stop; i <= j; i += step) {\n sum += S[Math.min(stop, i + s)];\n T[i] = sum / w;\n sum -= S[Math.max(start, i - s)];\n }\n };\n}\n","var array = Array.prototype;\n\nexport var slice = array.slice;\nexport var map = array.map;\n","const e10 = Math.sqrt(50),\n e5 = Math.sqrt(10),\n e2 = Math.sqrt(2);\n\nfunction tickSpec(start, stop, count) {\n const step = (stop - start) / Math.max(0, count),\n power = Math.floor(Math.log10(step)),\n error = step / Math.pow(10, power),\n factor = error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1;\n let i1, i2, inc;\n if (power < 0) {\n inc = Math.pow(10, -power) / factor;\n i1 = Math.round(start * inc);\n i2 = Math.round(stop * inc);\n if (i1 / inc < start) ++i1;\n if (i2 / inc > stop) --i2;\n inc = -inc;\n } else {\n inc = Math.pow(10, power) * factor;\n i1 = Math.round(start / inc);\n i2 = Math.round(stop / inc);\n if (i1 * inc < start) ++i1;\n if (i2 * inc > stop) --i2;\n }\n if (i2 < i1 && 0.5 <= count && count < 2) return tickSpec(start, stop, count * 2);\n return [i1, i2, inc];\n}\n\nexport default function ticks(start, stop, count) {\n stop = +stop, start = +start, count = +count;\n if (!(count > 0)) return [];\n if (start === stop) return [start];\n const reverse = stop < start, [i1, i2, inc] = reverse ? tickSpec(stop, start, count) : tickSpec(start, stop, count);\n if (!(i2 >= i1)) return [];\n const n = i2 - i1 + 1, ticks = new Array(n);\n if (reverse) {\n if (inc < 0) for (let i = 0; i < n; ++i) ticks[i] = (i2 - i) / -inc;\n else for (let i = 0; i < n; ++i) ticks[i] = (i2 - i) * inc;\n } else {\n if (inc < 0) for (let i = 0; i < n; ++i) ticks[i] = (i1 + i) / -inc;\n else for (let i = 0; i < n; ++i) ticks[i] = (i1 + i) * inc;\n }\n return ticks;\n}\n\nexport function tickIncrement(start, stop, count) {\n stop = +stop, start = +start, count = +count;\n return tickSpec(start, stop, count)[2];\n}\n\nexport function tickStep(start, stop, count) {\n stop = +stop, start = +start, count = +count;\n const reverse = stop < start, inc = reverse ? tickIncrement(stop, start, count) : tickIncrement(start, stop, count);\n return (reverse ? -1 : 1) * (inc < 0 ? 1 / -inc : inc);\n}\n","export default shuffler(Math.random);\n\nexport function shuffler(random) {\n return function shuffle(array, i0 = 0, i1 = array.length) {\n let m = i1 - (i0 = +i0);\n while (m) {\n const i = random() * m-- | 0, t = array[m + i0];\n array[m + i0] = array[i + i0];\n array[i + i0] = t;\n }\n return array;\n };\n}\n","import min from \"./min.js\";\n\nexport default function transpose(matrix) {\n if (!(n = matrix.length)) return [];\n for (var i = -1, m = min(matrix, length), transpose = new Array(m); ++i < m;) {\n for (var j = -1, n, row = transpose[i] = new Array(n); ++j < n;) {\n row[j] = matrix[j][i];\n }\n }\n return transpose;\n}\n\nfunction length(d) {\n return d.length;\n}\n","import transpose from \"./transpose.js\";\n\nexport default function zip() {\n return transpose(arguments);\n}\n","export default function min(values, valueof) {\n let min;\n if (valueof === undefined) {\n for (const value of values) {\n if (value != null\n && (min > value || (min === undefined && value >= value))) {\n min = value;\n }\n }\n } else {\n let index = -1;\n for (let value of values) {\n if ((value = valueof(value, ++index, values)) != null\n && (min > value || (min === undefined && value >= value))) {\n min = value;\n }\n }\n }\n return min;\n}\n","export default function(constructor, factory, prototype) {\n constructor.prototype = factory.prototype = prototype;\n prototype.constructor = constructor;\n}\n\nexport function extend(parent, definition) {\n var prototype = Object.create(parent.prototype);\n for (var key in definition) prototype[key] = definition[key];\n return prototype;\n}\n","import define, {extend} from \"./define.js\";\n\nexport function Color() {}\n\nexport var darker = 0.7;\nexport var brighter = 1 / darker;\n\nvar reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\",\n reN = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\",\n reP = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\",\n reHex = /^#([0-9a-f]{3,8})$/,\n reRgbInteger = new RegExp(`^rgb\\\\(${reI},${reI},${reI}\\\\)$`),\n reRgbPercent = new RegExp(`^rgb\\\\(${reP},${reP},${reP}\\\\)$`),\n reRgbaInteger = new RegExp(`^rgba\\\\(${reI},${reI},${reI},${reN}\\\\)$`),\n reRgbaPercent = new RegExp(`^rgba\\\\(${reP},${reP},${reP},${reN}\\\\)$`),\n reHslPercent = new RegExp(`^hsl\\\\(${reN},${reP},${reP}\\\\)$`),\n reHslaPercent = new RegExp(`^hsla\\\\(${reN},${reP},${reP},${reN}\\\\)$`);\n\nvar named = {\n aliceblue: 0xf0f8ff,\n antiquewhite: 0xfaebd7,\n aqua: 0x00ffff,\n aquamarine: 0x7fffd4,\n azure: 0xf0ffff,\n beige: 0xf5f5dc,\n bisque: 0xffe4c4,\n black: 0x000000,\n blanchedalmond: 0xffebcd,\n blue: 0x0000ff,\n blueviolet: 0x8a2be2,\n brown: 0xa52a2a,\n burlywood: 0xdeb887,\n cadetblue: 0x5f9ea0,\n chartreuse: 0x7fff00,\n chocolate: 0xd2691e,\n coral: 0xff7f50,\n cornflowerblue: 0x6495ed,\n cornsilk: 0xfff8dc,\n crimson: 0xdc143c,\n cyan: 0x00ffff,\n darkblue: 0x00008b,\n darkcyan: 0x008b8b,\n darkgoldenrod: 0xb8860b,\n darkgray: 0xa9a9a9,\n darkgreen: 0x006400,\n darkgrey: 0xa9a9a9,\n darkkhaki: 0xbdb76b,\n darkmagenta: 0x8b008b,\n darkolivegreen: 0x556b2f,\n darkorange: 0xff8c00,\n darkorchid: 0x9932cc,\n darkred: 0x8b0000,\n darksalmon: 0xe9967a,\n darkseagreen: 0x8fbc8f,\n darkslateblue: 0x483d8b,\n darkslategray: 0x2f4f4f,\n darkslategrey: 0x2f4f4f,\n darkturquoise: 0x00ced1,\n darkviolet: 0x9400d3,\n deeppink: 0xff1493,\n deepskyblue: 0x00bfff,\n dimgray: 0x696969,\n dimgrey: 0x696969,\n dodgerblue: 0x1e90ff,\n firebrick: 0xb22222,\n floralwhite: 0xfffaf0,\n forestgreen: 0x228b22,\n fuchsia: 0xff00ff,\n gainsboro: 0xdcdcdc,\n ghostwhite: 0xf8f8ff,\n gold: 0xffd700,\n goldenrod: 0xdaa520,\n gray: 0x808080,\n green: 0x008000,\n greenyellow: 0xadff2f,\n grey: 0x808080,\n honeydew: 0xf0fff0,\n hotpink: 0xff69b4,\n indianred: 0xcd5c5c,\n indigo: 0x4b0082,\n ivory: 0xfffff0,\n khaki: 0xf0e68c,\n lavender: 0xe6e6fa,\n lavenderblush: 0xfff0f5,\n lawngreen: 0x7cfc00,\n lemonchiffon: 0xfffacd,\n lightblue: 0xadd8e6,\n lightcoral: 0xf08080,\n lightcyan: 0xe0ffff,\n lightgoldenrodyellow: 0xfafad2,\n lightgray: 0xd3d3d3,\n lightgreen: 0x90ee90,\n lightgrey: 0xd3d3d3,\n lightpink: 0xffb6c1,\n lightsalmon: 0xffa07a,\n lightseagreen: 0x20b2aa,\n lightskyblue: 0x87cefa,\n lightslategray: 0x778899,\n lightslategrey: 0x778899,\n lightsteelblue: 0xb0c4de,\n lightyellow: 0xffffe0,\n lime: 0x00ff00,\n limegreen: 0x32cd32,\n linen: 0xfaf0e6,\n magenta: 0xff00ff,\n maroon: 0x800000,\n mediumaquamarine: 0x66cdaa,\n mediumblue: 0x0000cd,\n mediumorchid: 0xba55d3,\n mediumpurple: 0x9370db,\n mediumseagreen: 0x3cb371,\n mediumslateblue: 0x7b68ee,\n mediumspringgreen: 0x00fa9a,\n mediumturquoise: 0x48d1cc,\n mediumvioletred: 0xc71585,\n midnightblue: 0x191970,\n mintcream: 0xf5fffa,\n mistyrose: 0xffe4e1,\n moccasin: 0xffe4b5,\n navajowhite: 0xffdead,\n navy: 0x000080,\n oldlace: 0xfdf5e6,\n olive: 0x808000,\n olivedrab: 0x6b8e23,\n orange: 0xffa500,\n orangered: 0xff4500,\n orchid: 0xda70d6,\n palegoldenrod: 0xeee8aa,\n palegreen: 0x98fb98,\n paleturquoise: 0xafeeee,\n palevioletred: 0xdb7093,\n papayawhip: 0xffefd5,\n peachpuff: 0xffdab9,\n peru: 0xcd853f,\n pink: 0xffc0cb,\n plum: 0xdda0dd,\n powderblue: 0xb0e0e6,\n purple: 0x800080,\n rebeccapurple: 0x663399,\n red: 0xff0000,\n rosybrown: 0xbc8f8f,\n royalblue: 0x4169e1,\n saddlebrown: 0x8b4513,\n salmon: 0xfa8072,\n sandybrown: 0xf4a460,\n seagreen: 0x2e8b57,\n seashell: 0xfff5ee,\n sienna: 0xa0522d,\n silver: 0xc0c0c0,\n skyblue: 0x87ceeb,\n slateblue: 0x6a5acd,\n slategray: 0x708090,\n slategrey: 0x708090,\n snow: 0xfffafa,\n springgreen: 0x00ff7f,\n steelblue: 0x4682b4,\n tan: 0xd2b48c,\n teal: 0x008080,\n thistle: 0xd8bfd8,\n tomato: 0xff6347,\n turquoise: 0x40e0d0,\n violet: 0xee82ee,\n wheat: 0xf5deb3,\n white: 0xffffff,\n whitesmoke: 0xf5f5f5,\n yellow: 0xffff00,\n yellowgreen: 0x9acd32\n};\n\ndefine(Color, color, {\n copy(channels) {\n return Object.assign(new this.constructor, this, channels);\n },\n displayable() {\n return this.rgb().displayable();\n },\n hex: color_formatHex, // Deprecated! Use color.formatHex.\n formatHex: color_formatHex,\n formatHex8: color_formatHex8,\n formatHsl: color_formatHsl,\n formatRgb: color_formatRgb,\n toString: color_formatRgb\n});\n\nfunction color_formatHex() {\n return this.rgb().formatHex();\n}\n\nfunction color_formatHex8() {\n return this.rgb().formatHex8();\n}\n\nfunction color_formatHsl() {\n return hslConvert(this).formatHsl();\n}\n\nfunction color_formatRgb() {\n return this.rgb().formatRgb();\n}\n\nexport default function color(format) {\n var m, l;\n format = (format + \"\").trim().toLowerCase();\n return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000\n : l === 3 ? new Rgb((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1) // #f00\n : l === 8 ? rgba(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000\n : l === 4 ? rgba((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000\n : null) // invalid hex\n : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins\n : format === \"transparent\" ? new Rgb(NaN, NaN, NaN, 0)\n : null;\n}\n\nfunction rgbn(n) {\n return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n}\n\nfunction rgba(r, g, b, a) {\n if (a <= 0) r = g = b = NaN;\n return new Rgb(r, g, b, a);\n}\n\nexport function rgbConvert(o) {\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Rgb;\n o = o.rgb();\n return new Rgb(o.r, o.g, o.b, o.opacity);\n}\n\nexport function rgb(r, g, b, opacity) {\n return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);\n}\n\nexport function Rgb(r, g, b, opacity) {\n this.r = +r;\n this.g = +g;\n this.b = +b;\n this.opacity = +opacity;\n}\n\ndefine(Rgb, rgb, extend(Color, {\n brighter(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n darker(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n rgb() {\n return this;\n },\n clamp() {\n return new Rgb(clampi(this.r), clampi(this.g), clampi(this.b), clampa(this.opacity));\n },\n displayable() {\n return (-0.5 <= this.r && this.r < 255.5)\n && (-0.5 <= this.g && this.g < 255.5)\n && (-0.5 <= this.b && this.b < 255.5)\n && (0 <= this.opacity && this.opacity <= 1);\n },\n hex: rgb_formatHex, // Deprecated! Use color.formatHex.\n formatHex: rgb_formatHex,\n formatHex8: rgb_formatHex8,\n formatRgb: rgb_formatRgb,\n toString: rgb_formatRgb\n}));\n\nfunction rgb_formatHex() {\n return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}`;\n}\n\nfunction rgb_formatHex8() {\n return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}${hex((isNaN(this.opacity) ? 1 : this.opacity) * 255)}`;\n}\n\nfunction rgb_formatRgb() {\n const a = clampa(this.opacity);\n return `${a === 1 ? \"rgb(\" : \"rgba(\"}${clampi(this.r)}, ${clampi(this.g)}, ${clampi(this.b)}${a === 1 ? \")\" : `, ${a})`}`;\n}\n\nfunction clampa(opacity) {\n return isNaN(opacity) ? 1 : Math.max(0, Math.min(1, opacity));\n}\n\nfunction clampi(value) {\n return Math.max(0, Math.min(255, Math.round(value) || 0));\n}\n\nfunction hex(value) {\n value = clampi(value);\n return (value < 16 ? \"0\" : \"\") + value.toString(16);\n}\n\nfunction hsla(h, s, l, a) {\n if (a <= 0) h = s = l = NaN;\n else if (l <= 0 || l >= 1) h = s = NaN;\n else if (s <= 0) h = NaN;\n return new Hsl(h, s, l, a);\n}\n\nexport function hslConvert(o) {\n if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Hsl;\n if (o instanceof Hsl) return o;\n o = o.rgb();\n var r = o.r / 255,\n g = o.g / 255,\n b = o.b / 255,\n min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n h = NaN,\n s = max - min,\n l = (max + min) / 2;\n if (s) {\n if (r === max) h = (g - b) / s + (g < b) * 6;\n else if (g === max) h = (b - r) / s + 2;\n else h = (r - g) / s + 4;\n s /= l < 0.5 ? max + min : 2 - max - min;\n h *= 60;\n } else {\n s = l > 0 && l < 1 ? 0 : h;\n }\n return new Hsl(h, s, l, o.opacity);\n}\n\nexport function hsl(h, s, l, opacity) {\n return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);\n}\n\nfunction Hsl(h, s, l, opacity) {\n this.h = +h;\n this.s = +s;\n this.l = +l;\n this.opacity = +opacity;\n}\n\ndefine(Hsl, hsl, extend(Color, {\n brighter(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n darker(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n rgb() {\n var h = this.h % 360 + (this.h < 0) * 360,\n s = isNaN(h) || isNaN(this.s) ? 0 : this.s,\n l = this.l,\n m2 = l + (l < 0.5 ? l : 1 - l) * s,\n m1 = 2 * l - m2;\n return new Rgb(\n hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),\n hsl2rgb(h, m1, m2),\n hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),\n this.opacity\n );\n },\n clamp() {\n return new Hsl(clamph(this.h), clampt(this.s), clampt(this.l), clampa(this.opacity));\n },\n displayable() {\n return (0 <= this.s && this.s <= 1 || isNaN(this.s))\n && (0 <= this.l && this.l <= 1)\n && (0 <= this.opacity && this.opacity <= 1);\n },\n formatHsl() {\n const a = clampa(this.opacity);\n return `${a === 1 ? \"hsl(\" : \"hsla(\"}${clamph(this.h)}, ${clampt(this.s) * 100}%, ${clampt(this.l) * 100}%${a === 1 ? \")\" : `, ${a})`}`;\n }\n}));\n\nfunction clamph(value) {\n value = (value || 0) % 360;\n return value < 0 ? value + 360 : value;\n}\n\nfunction clampt(value) {\n return Math.max(0, Math.min(1, value || 0));\n}\n\n/* From FvD 13.37, CSS Color Module Level 3 */\nfunction hsl2rgb(h, m1, m2) {\n return (h < 60 ? m1 + (m2 - m1) * h / 60\n : h < 180 ? m2\n : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60\n : m1) * 255;\n}\n","export const radians = Math.PI / 180;\nexport const degrees = 180 / Math.PI;\n","import define, {extend} from \"./define.js\";\nimport {Color, rgbConvert, Rgb} from \"./color.js\";\nimport {degrees, radians} from \"./math.js\";\n\n// https://observablehq.com/@mbostock/lab-and-rgb\nconst K = 18,\n Xn = 0.96422,\n Yn = 1,\n Zn = 0.82521,\n t0 = 4 / 29,\n t1 = 6 / 29,\n t2 = 3 * t1 * t1,\n t3 = t1 * t1 * t1;\n\nfunction labConvert(o) {\n if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity);\n if (o instanceof Hcl) return hcl2lab(o);\n if (!(o instanceof Rgb)) o = rgbConvert(o);\n var r = rgb2lrgb(o.r),\n g = rgb2lrgb(o.g),\n b = rgb2lrgb(o.b),\n y = xyz2lab((0.2225045 * r + 0.7168786 * g + 0.0606169 * b) / Yn), x, z;\n if (r === g && g === b) x = z = y; else {\n x = xyz2lab((0.4360747 * r + 0.3850649 * g + 0.1430804 * b) / Xn);\n z = xyz2lab((0.0139322 * r + 0.0971045 * g + 0.7141733 * b) / Zn);\n }\n return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity);\n}\n\nexport function gray(l, opacity) {\n return new Lab(l, 0, 0, opacity == null ? 1 : opacity);\n}\n\nexport default function lab(l, a, b, opacity) {\n return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity);\n}\n\nexport function Lab(l, a, b, opacity) {\n this.l = +l;\n this.a = +a;\n this.b = +b;\n this.opacity = +opacity;\n}\n\ndefine(Lab, lab, extend(Color, {\n brighter(k) {\n return new Lab(this.l + K * (k == null ? 1 : k), this.a, this.b, this.opacity);\n },\n darker(k) {\n return new Lab(this.l - K * (k == null ? 1 : k), this.a, this.b, this.opacity);\n },\n rgb() {\n var y = (this.l + 16) / 116,\n x = isNaN(this.a) ? y : y + this.a / 500,\n z = isNaN(this.b) ? y : y - this.b / 200;\n x = Xn * lab2xyz(x);\n y = Yn * lab2xyz(y);\n z = Zn * lab2xyz(z);\n return new Rgb(\n lrgb2rgb( 3.1338561 * x - 1.6168667 * y - 0.4906146 * z),\n lrgb2rgb(-0.9787684 * x + 1.9161415 * y + 0.0334540 * z),\n lrgb2rgb( 0.0719453 * x - 0.2289914 * y + 1.4052427 * z),\n this.opacity\n );\n }\n}));\n\nfunction xyz2lab(t) {\n return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0;\n}\n\nfunction lab2xyz(t) {\n return t > t1 ? t * t * t : t2 * (t - t0);\n}\n\nfunction lrgb2rgb(x) {\n return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055);\n}\n\nfunction rgb2lrgb(x) {\n return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);\n}\n\nfunction hclConvert(o) {\n if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity);\n if (!(o instanceof Lab)) o = labConvert(o);\n if (o.a === 0 && o.b === 0) return new Hcl(NaN, 0 < o.l && o.l < 100 ? 0 : NaN, o.l, o.opacity);\n var h = Math.atan2(o.b, o.a) * degrees;\n return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity);\n}\n\nexport function lch(l, c, h, opacity) {\n return arguments.length === 1 ? hclConvert(l) : new Hcl(h, c, l, opacity == null ? 1 : opacity);\n}\n\nexport function hcl(h, c, l, opacity) {\n return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity);\n}\n\nexport function Hcl(h, c, l, opacity) {\n this.h = +h;\n this.c = +c;\n this.l = +l;\n this.opacity = +opacity;\n}\n\nfunction hcl2lab(o) {\n if (isNaN(o.h)) return new Lab(o.l, 0, 0, o.opacity);\n var h = o.h * radians;\n return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity);\n}\n\ndefine(Hcl, hcl, extend(Color, {\n brighter(k) {\n return new Hcl(this.h, this.c, this.l + K * (k == null ? 1 : k), this.opacity);\n },\n darker(k) {\n return new Hcl(this.h, this.c, this.l - K * (k == null ? 1 : k), this.opacity);\n },\n rgb() {\n return hcl2lab(this).rgb();\n }\n}));\n","import define, {extend} from \"./define.js\";\nimport {Color, rgbConvert, Rgb, darker, brighter} from \"./color.js\";\nimport {degrees, radians} from \"./math.js\";\n\nvar A = -0.14861,\n B = +1.78277,\n C = -0.29227,\n D = -0.90649,\n E = +1.97294,\n ED = E * D,\n EB = E * B,\n BC_DA = B * C - D * A;\n\nfunction cubehelixConvert(o) {\n if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity);\n if (!(o instanceof Rgb)) o = rgbConvert(o);\n var r = o.r / 255,\n g = o.g / 255,\n b = o.b / 255,\n l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB),\n bl = b - l,\n k = (E * (g - l) - C * bl) / D,\n s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), // NaN if l=0 or l=1\n h = s ? Math.atan2(k, bl) * degrees - 120 : NaN;\n return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity);\n}\n\nexport default function cubehelix(h, s, l, opacity) {\n return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity);\n}\n\nexport function Cubehelix(h, s, l, opacity) {\n this.h = +h;\n this.s = +s;\n this.l = +l;\n this.opacity = +opacity;\n}\n\ndefine(Cubehelix, cubehelix, extend(Color, {\n brighter(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Cubehelix(this.h, this.s, this.l * k, this.opacity);\n },\n darker(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Cubehelix(this.h, this.s, this.l * k, this.opacity);\n },\n rgb() {\n var h = isNaN(this.h) ? 0 : (this.h + 120) * radians,\n l = +this.l,\n a = isNaN(this.s) ? 0 : this.s * l * (1 - l),\n cosh = Math.cos(h),\n sinh = Math.sin(h);\n return new Rgb(\n 255 * (l + a * (A * cosh + B * sinh)),\n 255 * (l + a * (C * cosh + D * sinh)),\n 255 * (l + a * (E * cosh)),\n this.opacity\n );\n }\n}));\n","export function basis(t1, v0, v1, v2, v3) {\n var t2 = t1 * t1, t3 = t2 * t1;\n return ((1 - 3 * t1 + 3 * t2 - t3) * v0\n + (4 - 6 * t2 + 3 * t3) * v1\n + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2\n + t3 * v3) / 6;\n}\n\nexport default function(values) {\n var n = values.length - 1;\n return function(t) {\n var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n),\n v1 = values[i],\n v2 = values[i + 1],\n v0 = i > 0 ? values[i - 1] : 2 * v1 - v2,\n v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1;\n return basis((t - i / n) * n, v0, v1, v2, v3);\n };\n}\n","export default x => () => x;\n","import constant from \"./constant.js\";\n\nfunction linear(a, d) {\n return function(t) {\n return a + t * d;\n };\n}\n\nfunction exponential(a, b, y) {\n return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {\n return Math.pow(a + t * b, y);\n };\n}\n\nexport function hue(a, b) {\n var d = b - a;\n return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant(isNaN(a) ? b : a);\n}\n\nexport function gamma(y) {\n return (y = +y) === 1 ? nogamma : function(a, b) {\n return b - a ? exponential(a, b, y) : constant(isNaN(a) ? b : a);\n };\n}\n\nexport default function nogamma(a, b) {\n var d = b - a;\n return d ? linear(a, d) : constant(isNaN(a) ? b : a);\n}\n","import {rgb as colorRgb} from \"d3-color\";\nimport basis from \"./basis.js\";\nimport basisClosed from \"./basisClosed.js\";\nimport nogamma, {gamma} from \"./color.js\";\n\nexport default (function rgbGamma(y) {\n var color = gamma(y);\n\n function rgb(start, end) {\n var r = color((start = colorRgb(start)).r, (end = colorRgb(end)).r),\n g = color(start.g, end.g),\n b = color(start.b, end.b),\n opacity = nogamma(start.opacity, end.opacity);\n return function(t) {\n start.r = r(t);\n start.g = g(t);\n start.b = b(t);\n start.opacity = opacity(t);\n return start + \"\";\n };\n }\n\n rgb.gamma = rgbGamma;\n\n return rgb;\n})(1);\n\nfunction rgbSpline(spline) {\n return function(colors) {\n var n = colors.length,\n r = new Array(n),\n g = new Array(n),\n b = new Array(n),\n i, color;\n for (i = 0; i < n; ++i) {\n color = colorRgb(colors[i]);\n r[i] = color.r || 0;\n g[i] = color.g || 0;\n b[i] = color.b || 0;\n }\n r = spline(r);\n g = spline(g);\n b = spline(b);\n color.opacity = 1;\n return function(t) {\n color.r = r(t);\n color.g = g(t);\n color.b = b(t);\n return color + \"\";\n };\n };\n}\n\nexport var rgbBasis = rgbSpline(basis);\nexport var rgbBasisClosed = rgbSpline(basisClosed);\n","import {basis} from \"./basis.js\";\n\nexport default function(values) {\n var n = values.length;\n return function(t) {\n var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n),\n v0 = values[(i + n - 1) % n],\n v1 = values[i % n],\n v2 = values[(i + 1) % n],\n v3 = values[(i + 2) % n];\n return basis((t - i / n) * n, v0, v1, v2, v3);\n };\n}\n","export default function(a, b) {\n if (!b) b = [];\n var n = a ? Math.min(b.length, a.length) : 0,\n c = b.slice(),\n i;\n return function(t) {\n for (i = 0; i < n; ++i) c[i] = a[i] * (1 - t) + b[i] * t;\n return c;\n };\n}\n\nexport function isNumberArray(x) {\n return ArrayBuffer.isView(x) && !(x instanceof DataView);\n}\n","import value from \"./value.js\";\nimport numberArray, {isNumberArray} from \"./numberArray.js\";\n\nexport default function(a, b) {\n return (isNumberArray(b) ? numberArray : genericArray)(a, b);\n}\n\nexport function genericArray(a, b) {\n var nb = b ? b.length : 0,\n na = a ? Math.min(nb, a.length) : 0,\n x = new Array(na),\n c = new Array(nb),\n i;\n\n for (i = 0; i < na; ++i) x[i] = value(a[i], b[i]);\n for (; i < nb; ++i) c[i] = b[i];\n\n return function(t) {\n for (i = 0; i < na; ++i) c[i] = x[i](t);\n return c;\n };\n}\n","export default function(a, b) {\n var d = new Date;\n return a = +a, b = +b, function(t) {\n return d.setTime(a * (1 - t) + b * t), d;\n };\n}\n","export default function(a, b) {\n return a = +a, b = +b, function(t) {\n return a * (1 - t) + b * t;\n };\n}\n","import value from \"./value.js\";\n\nexport default function(a, b) {\n var i = {},\n c = {},\n k;\n\n if (a === null || typeof a !== \"object\") a = {};\n if (b === null || typeof b !== \"object\") b = {};\n\n for (k in b) {\n if (k in a) {\n i[k] = value(a[k], b[k]);\n } else {\n c[k] = b[k];\n }\n }\n\n return function(t) {\n for (k in i) c[k] = i[k](t);\n return c;\n };\n}\n","import number from \"./number.js\";\n\nvar reA = /[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g,\n reB = new RegExp(reA.source, \"g\");\n\nfunction zero(b) {\n return function() {\n return b;\n };\n}\n\nfunction one(b) {\n return function(t) {\n return b(t) + \"\";\n };\n}\n\nexport default function(a, b) {\n var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b\n am, // current match in a\n bm, // current match in b\n bs, // string preceding current number in b, if any\n i = -1, // index in s\n s = [], // string constants and placeholders\n q = []; // number interpolators\n\n // Coerce inputs to strings.\n a = a + \"\", b = b + \"\";\n\n // Interpolate pairs of numbers in a & b.\n while ((am = reA.exec(a))\n && (bm = reB.exec(b))) {\n if ((bs = bm.index) > bi) { // a string precedes the next number in b\n bs = b.slice(bi, bs);\n if (s[i]) s[i] += bs; // coalesce with previous string\n else s[++i] = bs;\n }\n if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match\n if (s[i]) s[i] += bm; // coalesce with previous string\n else s[++i] = bm;\n } else { // interpolate non-matching numbers\n s[++i] = null;\n q.push({i: i, x: number(am, bm)});\n }\n bi = reB.lastIndex;\n }\n\n // Add remains of b.\n if (bi < b.length) {\n bs = b.slice(bi);\n if (s[i]) s[i] += bs; // coalesce with previous string\n else s[++i] = bs;\n }\n\n // Special optimization for only a single match.\n // Otherwise, interpolate each of the numbers and rejoin the string.\n return s.length < 2 ? (q[0]\n ? one(q[0].x)\n : zero(b))\n : (b = q.length, function(t) {\n for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);\n return s.join(\"\");\n });\n}\n","import {color} from \"d3-color\";\nimport rgb from \"./rgb.js\";\nimport {genericArray} from \"./array.js\";\nimport date from \"./date.js\";\nimport number from \"./number.js\";\nimport object from \"./object.js\";\nimport string from \"./string.js\";\nimport constant from \"./constant.js\";\nimport numberArray, {isNumberArray} from \"./numberArray.js\";\n\nexport default function(a, b) {\n var t = typeof b, c;\n return b == null || t === \"boolean\" ? constant(b)\n : (t === \"number\" ? number\n : t === \"string\" ? ((c = color(b)) ? (b = c, rgb) : string)\n : b instanceof color ? rgb\n : b instanceof Date ? date\n : isNumberArray(b) ? numberArray\n : Array.isArray(b) ? genericArray\n : typeof b.valueOf !== \"function\" && typeof b.toString !== \"function\" || isNaN(b) ? object\n : number)(a, b);\n}\n","export default function(a, b) {\n return a = +a, b = +b, function(t) {\n return Math.round(a * (1 - t) + b * t);\n };\n}\n","var degrees = 180 / Math.PI;\n\nexport var identity = {\n translateX: 0,\n translateY: 0,\n rotate: 0,\n skewX: 0,\n scaleX: 1,\n scaleY: 1\n};\n\nexport default function(a, b, c, d, e, f) {\n var scaleX, scaleY, skewX;\n if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX;\n if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX;\n if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY;\n if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX;\n return {\n translateX: e,\n translateY: f,\n rotate: Math.atan2(b, a) * degrees,\n skewX: Math.atan(skewX) * degrees,\n scaleX: scaleX,\n scaleY: scaleY\n };\n}\n","import decompose, {identity} from \"./decompose.js\";\n\nvar svgNode;\n\n/* eslint-disable no-undef */\nexport function parseCss(value) {\n const m = new (typeof DOMMatrix === \"function\" ? DOMMatrix : WebKitCSSMatrix)(value + \"\");\n return m.isIdentity ? identity : decompose(m.a, m.b, m.c, m.d, m.e, m.f);\n}\n\nexport function parseSvg(value) {\n if (value == null) return identity;\n if (!svgNode) svgNode = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n svgNode.setAttribute(\"transform\", value);\n if (!(value = svgNode.transform.baseVal.consolidate())) return identity;\n value = value.matrix;\n return decompose(value.a, value.b, value.c, value.d, value.e, value.f);\n}\n","import number from \"../number.js\";\nimport {parseCss, parseSvg} from \"./parse.js\";\n\nfunction interpolateTransform(parse, pxComma, pxParen, degParen) {\n\n function pop(s) {\n return s.length ? s.pop() + \" \" : \"\";\n }\n\n function translate(xa, ya, xb, yb, s, q) {\n if (xa !== xb || ya !== yb) {\n var i = s.push(\"translate(\", null, pxComma, null, pxParen);\n q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)});\n } else if (xb || yb) {\n s.push(\"translate(\" + xb + pxComma + yb + pxParen);\n }\n }\n\n function rotate(a, b, s, q) {\n if (a !== b) {\n if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path\n q.push({i: s.push(pop(s) + \"rotate(\", null, degParen) - 2, x: number(a, b)});\n } else if (b) {\n s.push(pop(s) + \"rotate(\" + b + degParen);\n }\n }\n\n function skewX(a, b, s, q) {\n if (a !== b) {\n q.push({i: s.push(pop(s) + \"skewX(\", null, degParen) - 2, x: number(a, b)});\n } else if (b) {\n s.push(pop(s) + \"skewX(\" + b + degParen);\n }\n }\n\n function scale(xa, ya, xb, yb, s, q) {\n if (xa !== xb || ya !== yb) {\n var i = s.push(pop(s) + \"scale(\", null, \",\", null, \")\");\n q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)});\n } else if (xb !== 1 || yb !== 1) {\n s.push(pop(s) + \"scale(\" + xb + \",\" + yb + \")\");\n }\n }\n\n return function(a, b) {\n var s = [], // string constants and placeholders\n q = []; // number interpolators\n a = parse(a), b = parse(b);\n translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q);\n rotate(a.rotate, b.rotate, s, q);\n skewX(a.skewX, b.skewX, s, q);\n scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q);\n a = b = null; // gc\n return function(t) {\n var i = -1, n = q.length, o;\n while (++i < n) s[(o = q[i]).i] = o.x(t);\n return s.join(\"\");\n };\n };\n}\n\nexport var interpolateTransformCss = interpolateTransform(parseCss, \"px, \", \"px)\", \"deg)\");\nexport var interpolateTransformSvg = interpolateTransform(parseSvg, \", \", \")\", \")\");\n","var epsilon2 = 1e-12;\n\nfunction cosh(x) {\n return ((x = Math.exp(x)) + 1 / x) / 2;\n}\n\nfunction sinh(x) {\n return ((x = Math.exp(x)) - 1 / x) / 2;\n}\n\nfunction tanh(x) {\n return ((x = Math.exp(2 * x)) - 1) / (x + 1);\n}\n\nexport default (function zoomRho(rho, rho2, rho4) {\n\n // p0 = [ux0, uy0, w0]\n // p1 = [ux1, uy1, w1]\n function zoom(p0, p1) {\n var ux0 = p0[0], uy0 = p0[1], w0 = p0[2],\n ux1 = p1[0], uy1 = p1[1], w1 = p1[2],\n dx = ux1 - ux0,\n dy = uy1 - uy0,\n d2 = dx * dx + dy * dy,\n i,\n S;\n\n // Special case for u0 ≅ u1.\n if (d2 < epsilon2) {\n S = Math.log(w1 / w0) / rho;\n i = function(t) {\n return [\n ux0 + t * dx,\n uy0 + t * dy,\n w0 * Math.exp(rho * t * S)\n ];\n }\n }\n\n // General case.\n else {\n var d1 = Math.sqrt(d2),\n b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1),\n b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1),\n r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0),\n r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);\n S = (r1 - r0) / rho;\n i = function(t) {\n var s = t * S,\n coshr0 = cosh(r0),\n u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0));\n return [\n ux0 + u * dx,\n uy0 + u * dy,\n w0 * coshr0 / cosh(rho * s + r0)\n ];\n }\n }\n\n i.duration = S * 1000 * rho / Math.SQRT2;\n\n return i;\n }\n\n zoom.rho = function(_) {\n var _1 = Math.max(1e-3, +_), _2 = _1 * _1, _4 = _2 * _2;\n return zoomRho(_1, _2, _4);\n };\n\n return zoom;\n})(Math.SQRT2, 2, 4);\n","import {hsl as colorHsl} from \"d3-color\";\nimport color, {hue} from \"./color.js\";\n\nfunction hsl(hue) {\n return function(start, end) {\n var h = hue((start = colorHsl(start)).h, (end = colorHsl(end)).h),\n s = color(start.s, end.s),\n l = color(start.l, end.l),\n opacity = color(start.opacity, end.opacity);\n return function(t) {\n start.h = h(t);\n start.s = s(t);\n start.l = l(t);\n start.opacity = opacity(t);\n return start + \"\";\n };\n }\n}\n\nexport default hsl(hue);\nexport var hslLong = hsl(color);\n","import {hcl as colorHcl} from \"d3-color\";\nimport color, {hue} from \"./color.js\";\n\nfunction hcl(hue) {\n return function(start, end) {\n var h = hue((start = colorHcl(start)).h, (end = colorHcl(end)).h),\n c = color(start.c, end.c),\n l = color(start.l, end.l),\n opacity = color(start.opacity, end.opacity);\n return function(t) {\n start.h = h(t);\n start.c = c(t);\n start.l = l(t);\n start.opacity = opacity(t);\n return start + \"\";\n };\n }\n}\n\nexport default hcl(hue);\nexport var hclLong = hcl(color);\n","import {cubehelix as colorCubehelix} from \"d3-color\";\nimport color, {hue} from \"./color.js\";\n\nfunction cubehelix(hue) {\n return (function cubehelixGamma(y) {\n y = +y;\n\n function cubehelix(start, end) {\n var h = hue((start = colorCubehelix(start)).h, (end = colorCubehelix(end)).h),\n s = color(start.s, end.s),\n l = color(start.l, end.l),\n opacity = color(start.opacity, end.opacity);\n return function(t) {\n start.h = h(t);\n start.s = s(t);\n start.l = l(Math.pow(t, y));\n start.opacity = opacity(t);\n return start + \"\";\n };\n }\n\n cubehelix.gamma = cubehelixGamma;\n\n return cubehelix;\n })(1);\n}\n\nexport default cubehelix(hue);\nexport var cubehelixLong = cubehelix(color);\n","export default function(interpolator, n) {\n var samples = new Array(n);\n for (var i = 0; i < n; ++i) samples[i] = interpolator(i / (n - 1));\n return samples;\n}\n"],"names":["Events","RequestType","ViewportType","InterpolationType","BlendMode","COMPOSITE_BLEND","MAXIMUM_INTENSITY_BLEND","MINIMUM_INTENSITY_BLEND","AVERAGE_INTENSITY_BLEND","ADDITIVE_INTENSITY_BLEND","RADON_TRANSFORM_BLEND","Constants","FilterMode","OFF","NORMALIZED","RAW","BlendModes","OrientationAxis","SharedArrayBufferModes","GeometryType","ContourType","VOILUTFunctionType","DynamicOperatorType","CalibrationTypes","ViewportStatus","hotIron","name","numOfColors","colors","pet","numColors","hotMetalBlue","pet20Step","gray","gamma","segmentedData","red","green","blue","jet","hsv","hot","cool","spring","summer","autumn","winter","bone","copper","spectral","coolwarm","blues","RENDERING_DEFAULTS","MINIMUM_SLAB_THICKNESS","MAXIMUM_RAY_DISTANCE","Object","freeze","deepFreeze","object","propNames","getOwnPropertyNames","value","axial","viewPlaneNormal","viewUp","sagittal","coronal","gradientOpacity","specularPower","scalarOpacity","specular","shade","ambient","colorTransfer","diffuse","interpolation","cache","renderingEngineCache","get","id","set","re","renderingEngineId","delete","getAll","renderingEngines","keys","map","sort","a","b","eventTarget","constructor","this","listeners","reset","addEventListener","type","callback","indexOf","push","removeEventListener","stack","stackLength","length","i","splice","dispatchEvent","event","slice","call","defaultPrevented","invertRgbTransferFunction","rgbTransferFunction","size","getSize","index","nodeValue1","getNodeValue","setNodeValue","createSigmoidRGBTransferFunction","voiRange","approximationNodes","windowWidth","windowCenter","lower","upper","table","Array","v","reduce","res","y","x","wc","ww","Math","log","logit","concat","cfun","buildFunctionFromArray","values","numberOfComponents","getVoiFromSigmoidRGBTransferFunction","cfunRange","getRange","getTable","filter","k","cfunDomain","y1","logy1","x1","y2","logy2","x2","round","createLinearRGBTransferFunction","undefined","addRGBPoint","scaleRGBTransferFunction","scalingFactor","triggerEvent","el","detail","Error","CustomEvent","cancelable","uuidv4","replace","c","crypto","getRandomValues","Uint8Array","toString","getMinMax","storedPixelData","storedPixel","min","max","numPixels","LAST_RUNTIME_ID","Symbol","GLOBAL_CONTEXT","DEFAULT_MAX","DEFAULT_SEPARATOR","getRuntimeId","context","separator","symbol","idComponents","defineProperty","carry","n","getNextRuntimeId","join","imageIdToURI","imageId","colonIndex","substring","state","add","payload","imageURI","areNumbersEqualWithTolerance","num1","num2","tolerance","abs","isNumberType","isNumberArrayLike","isEqual","v1","v2","arr1","arr2","areArraysEqual","isOpposite","BLOCKLISTED_GPUS","cleanRenderer","renderer","toLowerCase","isSSR","window","deviceInfo","userAgent","platform","maxTouchPoints","navigator","isIOS","test","isIpad","MSStream","isMobile","isSafari12","array","charCodeCache","getLevenshteinDistance","left","right","swap","leftLength","rightLength","charCodeAt","bCharCode","start","temp","temp2","result","j","isDefined","val","OutdatedBenchmarksError","[object Object]","message","super","setPrototypeOf","prototype","getGPUTier","mobileTiers","desktopTiers","override","glContext","failIfMajorPerformanceCaveat","benchmarksURL","queryCache","tier","screenSize","screen","loadBenchmarks","file","data","fetch","then","response","json","parseInt","shift","split","toResult","gpu","fps","device","renderers","rawRenderer","gl","attributes","alpha","antialias","depth","powerPreference","stencil","canvas","document","createElement","getContext","debugRendererInfo","getExtension","getParameter","UNMASKED_RENDERER_WEBGL","isMobileTier","pixelId","vertexShader","createShader","fragmentShader","program","createProgram","shaderSource","compileShader","attachShader","linkProgram","detachShader","deleteShader","useProgram","vertexArray","createBuffer","bindBuffer","bufferData","Float32Array","aPosition","getAttribLocation","vertexAttribPointer","enableVertexAttribArray","clearColor","clear","viewport","drawArrays","pixels","readPixels","deleteProgram","deleteBuffer","codeA","codeB","codeC","possibleChipsets","chipsets","iosVersion","deobfuscateAppleGPU","results","Promise","all","types","includes","benchmarkFile","benchmark","benchmarks","error","version","model","matches","match","matched","modelVersion","matchCount","closest","fpsesByPixelCount","minDistance","Number","MAX_VALUE","devicePixelRatio","pixelCount","width","height","entryPixelCount","distance","aDis","aFps","bDis","bFps","blocklistedModel","find","tiers","getRenderingEngine","getRenderingEngines","csRenderInitialized","useSharedArrayBuffer","sharedArrayBufferMode","TRUE","defaultConfig","gpuTier","detectGPUConfig","rendering","useCPURendering","preferSizeOverAccuracy","useNorm16Texture","strictZSpacingForVolumeViewport","config","_hasActiveWebGLContext","_getGLContext","WebGLRenderingContext","WebGL2RenderingContext","async","init","configuration","console","setUseSharedArrayBuffer","setUseCPURendering","status","_updateRenderingPipelinesForAllViewports","setPreferSizeOverAccuracy","resetUseCPURendering","getShouldUseCPURendering","mode","AUTO","FALSE","SharedArrayBuffer","hasSharedArrayBuffer","warn","resetUseSharedArrayBuffer","getShouldUseSharedArrayBuffer","isCornerstoneInitialized","getConfiguration","setConfiguration","forEach","engine","getViewports","updateRenderingPipeline","sharedArrayBuffer","crossOriginIsolated","Uint16Array","Int16Array","providers","addProvider","provider","priority","removeProvider","removeAllProviders","pop","getMetaData","query","getSpacingInNormalDirection","imageVolume","direction","spacing","iVector","jVector","kVector","dotProducts","projectedSpacing","getClosestImageId","worldPos","imageIds","halfSpacingInNormalDirection","imageIdForTool","imagePositionPatient","dir","dot","ONE_GB","_imageCache","Map","_volumeCache","_imageCacheSize","_volumeCacheSize","_maxCacheSize","_maxInstanceSize","setMaxCacheSize","newMaxCacheSize","errorMessage","isCacheable","byteLength","getBytesAvailable","getMaxCacheSize","getMaxInstanceSize","getCacheSize","_decacheImage","imageLoadObject","cancelFn","decache","_decacheVolume","volumeId","cachedVolume","volumeLoadObject","volume","cancelLoading","imageData","purgeCache","imageIterator","done","next","removeImageLoadObject","IMAGE_CACHE_IMAGE_REMOVED","purgeVolumeCache","volumeIterator","removeVolumeLoadObject","VOLUME_CACHE_VOLUME_REMOVED","getVolumeLoadObject","timeStamp","Date","now","getGeometry","geometryId","cachedGeometry","_geometryCache","geometry","getVolume","cachedImage","_incrementImageCacheSize","sizeInBytes","eventDetails","_incrementVolumeCacheSize","putGeometryLoadObject","geometryLoadObject","has","loaded","promise","isNaN","GEOMETRY_CACHE_GEOMETRY_ADDED","catch","increment","decacheIfNecessaryUntilBytesAvailable","numBytes","volumeImageIds","bytesAvailable","cachedImages","from","cachedImageIds","im","imageIdsToPurge","putImageLoadObject","sharedCacheKey","image","toFixed","CACHE_SIZE_EXCEEDED","IMAGE_CACHE_IMAGE_ADDED","getImageLoadObject","isLoaded","getVolumeContainingImageId","volumeIds","imageIdToUse","imageIdIndex","getImageURIIndex","getCachedImageBasedOnImageURI","imageURIToUse","foundImageId","putVolumeLoadObject","VOLUME_CACHE_VOLUME_ADDED","vtkErrorMacro","DEFAULT_VALUES","renderable","myFactory","children","visited","extend","publicAPI","initialValues","arguments","assign","_renderableChildMap","classHierarchy","build","prepass","render","traverse","renderPass","passTraversal","getTraverseOperation","fn","apply","customRenderPass","getOperation","getViewNodeFor","dataObject","vn","getFirstAncestorOfType","_parent","isA","addMissingNode","dobj","setVisited","newNode","createViewNode","setParent","addMissingNodes","dataObjs","addMissingChildren","child","prepareNodes","removeUnusedNodes","deleted","getVisited","getRenderable","dataObj","ret","createNode","setRenderable","parentDelete","vtkViewNode","vtkViewNode$1","newInstance","PASS_TYPES","overrides","isDeleted","cpt","className","getClassName","isObject","setMyFactory","registerOverride","func","vtkViewNodeFactory","vtkViewNodeFactory$1","CLASS_MAPPING","create","vtkOpenGLViewNodeFactory","lastRenderer","keyMatrixTime","keyMatrices","normalMatrix","Float64Array","vcpc","wcvc","wcpc","buildPass","_openGLRenderer","_openGLRenderWindow","getParent","opaquePass","tsize","getTiledSizeAndOrigin","lowerLeftU","lowerLeftV","usize","vsize","scissor","translucentPass","zBufferPass","opaqueZBufferPass","volumePass","getKeyMatrices","ren","getMTime","getViewMatrix","aspectRatio","getAspectRatio","getProjectionMatrix","modified","vtkOpenGLCamera","vtkCamera","vtkDebugMacro","selector","updateLights","getActiveCamera","getViewPropsWithNestedProps","count","lights","getLightsByReference","getSwitch","createLight","clearMask","getTransparent","COLOR_BUFFER_BIT","getPreserveDepthBuffer","clearDepth","DEPTH_BUFFER_BIT","depthMask","ts","enable","SCISSOR_TEST","colorMask","DEPTH_TEST","cameraPass","getSizeByReference","getViewportByReference","vport","tileViewPort","vpu","vpv","ndvp","normalizedDisplayToDisplay","vpu2","vpv2","ndvp2","background","getBackgroundByReference","releaseGraphicsResources","setOpenGLRenderWindow","rw","vtkOpenGLRenderer","vtkRenderer","SegmentAgregator","segmentMapping","segments","faces","key","segment","first","last","mappingFirst","mappingLast","idx","seg","_i","unshift","idxHead","idxTail","segHead","segTail","addSegment","_seg","_i2","_seg2","_i3","_seg3","_i4","_seg4","_i5","requestData","inData","outData","input","output","shallowCopy","agregator","lines","getLines","getData","offset","lineSize","lineSegment","cellArraySize","_i6","cellArray","_i7","face","setPolys","vtkClosedPolyLineToSurfaceFilter","vtkClosedPolyLineToSurfaceFilter$1","ownKeys","enumerableOnly","getOwnPropertySymbols","symbols","sym","getOwnPropertyDescriptor","enumerable","vtkCutter","superClass","target","source","getOwnPropertyDescriptors","defineProperties","_objectSpread","dataSetCutter","points","getPoints","pointsData","numPts","getNumberOfPoints","newPointsData","newLinesData","newPolysData","cutScalars","inOffset","outOffset","cutFunction","evaluateFunction","crossedEdges","it","pd","polys","getPolys","strips","getStrips","polyIdx","stripIdx","remainingStripLength","cellSize","end","subarray","_start","_end","initPolyIterator","cell","cellPointsScalars","pointIndex","sideFirstPoint","allPointsSameSide","intersectedEdgesList","idNext","signPoint0","e1","e2","deltaScalar","t","cutValue","pointID1","pointID2","computedIntersectedPoint","pointEdge1","pointEdge2","intersectedPoint","newPointID","intersectedEdge","alreadyAdded","crossedEdge","sameEdge","samePoint","edge","setData","getDataType","mTime","vtkCutter$1","ObjectType","ARRAY_BUFFER","ELEMENT_ARRAY_BUFFER","TEXTURE_BUFFER","objectType","convertType","internalType","internalHandle","dirty","getType","setType","getHandle","isReady","generateBuffer","objectTypeGL","upload","STATIC_DRAW","bind","release","getError","vtkOpenGLBufferObject","vtkBufferObject","vtkOpenGLCellArrayBufferObject","createVBO","inRep","outRep","options","selectionMaps","elementCount","blockSize","vertexOffset","normalOffset","tCoordOffset","tCoordComponents","colorComponents","colorOffset","customData","pointData","normalData","tcoordData","colorData","getNumberOfComponents","textureComponents","tcoords","normals","customAttributes","components","getName","colorBO","stride","addAPoint","pointIdx","normalIdx","tcoordIdx","colorIdx","custIdx","cellCount","cellBuilders","anythingToPoints","numPoints","cellPts","linesToWireframe","polysToWireframe","stripsToWireframe","polysToSurface","npts","stripsToSurface","cellCounters","countFunc","POINTS","WIREFRAME","caboCount","packedUCVBO","packedVBO","vboidx","ucidx","diagSq","distSq","range","delta","distShift","log10","coordShift","coordScale","_range","_delta","setCoordShiftAndScale","coordShiftAndScaleEnabled","cells","newPoints","Int32Array","newCells","pointCount","cellOffset","haveCellNormals","attr","haveCellScalars","_index","colorBOStride","shouldApplyCoordShiftAndScale","inverseShiftAndScaleMatrix","inverseScale","matrix","computeInverseShiftAndScaleMatrix","tcoordBO","vtkCellArrayBufferObject","shaderType","handle","compile","stype","VERTEX_SHADER","FRAGMENT_SHADER","getShaderParameter","COMPILE_STATUS","lastError","getShaderInfoLog","cleanup","vtkShader","vtkShader$1","vertexShaderHandle","fragmentShaderHandle","geometryShaderHandle","geometryShader","linked","bound","compiled","numberOfOutputs","attributesLocs","uniformLocs","md5Hash","lastCameraMTime","setShaderType","link","setCompiled","getSource","line","setBound","isBound","setContext","ctx","getProgramParameter","LINK_STATUS","getProgramInfoLog","setLinked","attributeLocs","setUniformMatrix","location","findUniform","f32","uniformMatrix4fv","setUniformMatrix3x3","uniformMatrix3fv","setUniformf","uniform1f","setUniformfv","uniform1fv","setUniformi","uniform1i","setUniformiv","uniform1iv","setUniform2f","RangeError","uniform2f","setUniform2fv","uniform2fv","setUniform2i","uniform2i","setUniform2iv","uniform2iv","setUniform3f","a1","a2","a3","uniform3f","setUniform3fArray","isArray","setUniform3fv","uniform3fv","setUniform3i","_len","args","_key","uniform3i","setUniform3iv","uniform3iv","setUniform4f","_len2","_key2","uniform4f","setUniform4fv","uniform4fv","setUniform4i","_len3","_key3","uniform4i","setUniform4iv","uniform4iv","loc","getUniformLocation","isUniformUsed","isAttributeUsed","shader","getShaderType","thandle","comntext","setLastCameraMTime","mtime","vtkShaderProgram","vtkShaderProgram$1","substitute","search","replaceStr","replaceSearch","RegExp","resultstr","forceEmulation","handleVAO","handleProgram","supported","buffers","exposedMethod","initialize","instancingExtension","getWebgl2","extension","createVertexArray","createVertexArrayOES","bindVertexArrayOES","bindVertexArray","ibuff","buff","buffer","iatt","attrIt","matrixCount","isMatrix","normalize","divisor","vertexAttribDivisorANGLE","vertexAttribDivisor","disableVertexAttribArray","shaderProgramChanged","deleteVertexArrayOES","deleteVertexArray","addAttributeArray","elementType","elementTupleSize","addAttributeArrayWithDivisor","attribs","Index","buffFound","found","addAttributeMatrixWithDivisor","removeAttributeArray","vtkOpenGLVertexArrayObject","vtkVertexArrayObject","primTypes","Start","Points","Lines","Tris","TriStrips","TrisEdges","TriStripsEdges","End","shaderSourceTime","VAO","attributeUpdateTime","CABO","primitiveType","pointPicking","win","oglwin","setElementCount","actor","rep","oglMapper","getElementCount","getOpenGLMode","wideLines","haveWideLines","DEPTH_WRITEMASK","LINES","updateShaders","drawArraysInstanced","ceil","getProperty","getLineWidth","lineWidth","TRIANGLES","getOpenGLRenderWindow","getHardwareMaximumLineWidth","getNeedToRebuildShaders","getProgram","getShaderSourceTime","shaders","Vertex","Fragment","Geometry","buildShaders","newShader","getShaderCache","readyShaderProgramArray","setProgram","getVAO","readyShaderProgram","setMapperShaderParameters","setPropertyShaderParameters","setCameraShaderParameters","setLightingShaderParameters","invokeShaderCallbacks","parseFloat","halfLineWidth","getRepresentation","getPointSize","getPointPickingPrimitiveSize","replaceShaderPositionVC","VSSource","vtkOpenGLHelper","vtkHelper","Wrap","CLAMP_TO_EDGE","REPEAT","MIRRORED_REPEAT","Filter","NEAREST","LINEAR","NEAREST_MIPMAP_NEAREST","NEAREST_MIPMAP_LINEAR","LINEAR_MIPMAP_NEAREST","LINEAR_MIPMAP_LINEAR","floatView","int32View","HalfFloat","fromHalf","h","s","e","f","pow","NaN","Infinity","toHalf","bits","m","VtkDataTypes","vtkWarningMacro","vtkOpenGLTexture","updateArrayDataType","dataType","pixData","pixCount","FLOAT","openGLDataType","dataArrayToCopy","UNSIGNED_CHAR","UNSIGNED_BYTE","_idx","_dataArrayToCopy","halfFloat","HALF_FLOAT","halfFloatExt","HALF_FLOAT_OES","_idx2","newArray","src","scaleTextureToHighestPowerOfTwo","numComps","newWidth","newHeight","jFactor","iFactor","usingHalf","joff","jidx","jlow","floor","jhi","jmix","jmix1","ioff","iidx","ilow","ihi","imix","useTexStorage","_model$renderable","resizable","getResizable","getGLInformations","RENDERER","oglNorm16Ext","UNSIGNED_SHORT","SHORT","processDataArray","dataArray","minArray","maxArray","_dataArray$getRange","_dataArray$getRange2","scaleOffsets","scale","computeScaleOffsets","getOpenGLDataType","useHalfFloat","isHalfFloat","hasExactHalfFloat","setUseHalfFloat","renWin","getInterpolate","generateMipmap","setMinificationFilter","setMagnificationFilter","getRepeat","setWrapR","setWrapS","setWrapT","getInputData","setImage","textureBuildTime","getImage","getImageLoaded","create2DFromImage","activate","sendParameters","getCanvas","create2DFromRaw","getJsImageData","jsid","getPointData","getScalars","ext","getExtent","inScalars","getNumberOfInputPorts","indata","scalars","createCubeFromRaw","destroyTexture","deactivate","deleteTexture","numberOfDimensions","resetFormatAndType","createTexture","bindTexture","texParameteri","TEXTURE_MIN_FILTER","getOpenGLFilterMode","minificationFilter","TEXTURE_MAG_FILTER","magnificationFilter","TEXTURE_WRAP_S","getOpenGLWrapMode","wrapS","TEXTURE_WRAP_T","wrapT","TEXTURE_WRAP_R","wrapR","getTextureUnit","getTextureUnitForTexture","activateTexture","deactivateTexture","rwin","internalFormat","format","shaderProgram","autoParameters","sendParametersTime","TEXTURE_2D","TEXTURE_BINDING_2D","getIntegerv","TEXTURE_BASE_LEVEL","baseLevel","TEXTURE_MAX_LEVEL","maxLevel","getInternalFormat","vtktype","_forceInternalFormat","getDefaultInternalFormat","getDefaultTextureInternalFormat","setInternalFormat","iFormat","getFormat","getDefaultFormat","RED","RG","RGB","RGBA","LUMINANCE","LUMINANCE_ALPHA","getDefaultDataType","vtkScalarType","VOID","forceUpdate","getShiftAndScale","BYTE","INT","UNSIGNED_INT","emode","flip","scaledData","pixelStorei","UNPACK_FLIP_Y_WEBGL","UNPACK_ALIGNMENT","texStorage2D","texSubImage2D","texImage2D","TEXTURE_CUBE_MAP","invertedData","widthLevel","heightLevel","row1","row2","w","tempData","TEXTURE_CUBE_MAP_POSITIVE_X","createDepthFromRaw","DEPTH_COMPONENT","DEPTH_COMPONENT32F","DEPTH_COMPONENT16","needNearestPowerOfTwo","translate","drawImage","safeImage","create2DFilterableFromRaw","create2DFilterableFromDataArray","_processDataArray","create3DFromRaw","TEXTURE_3D","texStorage3D","texSubImage3D","texImage3D","create3DFilterableFromRaw","create3DFilterableFromDataArray","_processDataArray2","numPixelsIn","volumeInfo","dataComputedScale","dataComputedOffset","scaleOffsetsCopy","structuredClone","_c","_c2","_c3","_newArray","scaleInverse","nc","volCopyData","outArray","outIdx","inValue","smin","smax","dataTypeToUse","_c4","soffset","sscale","maxTexDim","MAX_TEXTURE_SIZE","xstride","ystride","sqrt","targetWidth","xreps","yreps","targetHeight","tileWidth","tileHeight","yRep","xrepsThisRow","outXContIncr","tileY","xRep","tileX","_nc","getMaximumTextureSize","isCurrent","minLOD","maxLOD","vtkOpenGLTexture$1","vtkReplacementShaderMapper","implementReplaceShaderCoincidentOffset","replaceShaderCoincidentOffset","cp","getCoincidentParameters","factor","FSSource","implementBuildShadersWithReplacements","applyShaderReplacements","viewSpec","pre","shaderReplacements","ShaderReplacements","currReplacement","replaceFirst","ssrc","substituteRes","originalValue","replacementValue","replaceAll","getReplacedShaderTemplate","lastRenderPassShaderReplacement","currentRenderPass","getShaderReplacement","openGLSpec","getViewSpecificProperties","OpenGL","replaceShaderValues","openGLSpecProp","getShaderTemplate","vertexShaderCode","vertexSpecProp","VertexShaderCode","fragmentShaderCode","fragmentSpecProp","FragmentShaderCode","geometryShaderCode","geometrySpecProp","GeometryShaderCode","vtkImageResliceMapperVS","vtkImageResliceMapperFS","InterpolationType$1","computeFnToString","property","iComps","getIndependentComponents","safeMatrixMultiply","matrixArray","matrixType","tmpMat","identity","copy","multiply","vtkOpenGLImageResliceMapper","_openGLImageSlice","_openGLCamera","tris","openGLTexture","colorTexture","pwfTexture","haveSeenDepthRequest","renderDepth","getResolveCoincidentTopology","getCoincidentTopologyPolygonOffsetParameters","renderPiece","invokeEvent","update","currentInput","updateResliceGeometry","renderPieceStart","renderPieceDraw","renderPieceFinish","updateBufferObjects","getInterpolationType","lastBoundBO","getCABO","getNeedToRebuildBufferObjects","buildBufferObjects","VBOBuildTime","resliceGeom","_image$getPointData","numComp","_externalOpenGLTexture","_toString","openGLTextureString","dims","getDimensions","getOglNorm16Ext","ppty","numIComps","textureHeight","cfunToString","getRGBTransferFunction","colorTextureString","cWidth","cTable","tmpTable","cRange","pwfunToString","getPiecewiseFunction","pwfTextureString","pwfWidth","pwfSize","pwfTable","pwfun","pwfFloatTable","_tmpTable","fill","pwfRange","vboString","getSlabThickness","VBOBuildString","setName","getNormals","SURFACE","cellBO","getAttributeUpdateTime","getVertexOffset","getStride","getNormalOffset","getSpacing","getSlabType","getSlabTrapezoidIntegration","inverseShiftScaleMatrix","getCoordShiftAndScaleEnabled","getInverseShiftAndScaleMatrix","tmpMat4","bounds","getBounds","sc","o","keyMats","actMats","mcwc","opacity","getOpacity","getComponents","getComponentWeight","volInfo","getVolumeInfo","cw","getColorWindow","cl","getColorLevel","getUseLookupTableScalarRange","texColorUnit","pwfScale","pwfShift","_target","mid","texOpacityUnit","getBackgroundColor","tNumComp","iComp","slabTh","slabType","slabTrap","needRebuild","lastHaveSeenDepthRequest","lastTextureComponents","lastIndependentComponents","lastSlabThickness","lastSlabType","lastSlabTrapezoidIntegration","replaceShaderTCoord","GSSource","slabThickness","tcoordFSDec","comp","tcoordFSImpl","rgba","_comp","posVCVSDec","resliceGeomUpdateString","posVCVSImpl","posVCFSDec","resGeomString","imageBounds","orthoSlicing","orthoAxis","getSlicePolyData","getSlicePlane","_isVectorAxisAligned","tmpN","dotP","isVectorAxisAligned","getNormal","_isVectorAxisAligned2","_model$renderable$get","plane","setNormal","bds","setOrigin","setSlicePlane","ptsArray","getOrigin","otherAxes","ptIdx","_n","_normalsData","_i8","_normals","setNormals","cube","setCenter","setXLength","setYLength","setZLength","cutter","setInputConnection","getOutputPort","setCutFunction","pds","getOutputData","normalsData","setOpenGLTexture","oglTex","SlicingMode","NONE","I","J","K","X","Y","Z","vtkPolyDataVS","vtkPolyDataFS","imagemat","imagematinv","openGLImageSlice","openGLCamera","getSliceAtFocalPoint","setSliceFromCamera","tcoordDec","tcoordImpl","replaceShaderClip","getNumberOfClippingPlanes","numClipPlanes","getTCoordOffset","getTCoordComponents","texUnit","oglShiftScale","mat","getMatrix","getIndexToWorld","planeEquations","planeEquation","getClippingPlaneInDataCoords","i2wmat4","inverseShiftScaleMat","getCurrentImage","computeBounds","getInput","u","imgScalars","actorProperty","iType","ijkMode","getClosestIJKAxis","getSlice","getSlicingMode","getSliceAtPosition","sliceOffset","nSlice","getSubSlice","_model$renderable$get2","Set","setGenerateMipmap","sliceSize","tcoordArray","sliceDepth","spatialExt","getSpatialExtent","basicScalars","bsIdx","_id","_k","_i9","_bsIdx","getPreferSizeOverAccuracy","vtkOpenGLImageMapper","vtkImageMapper","getVisibility","getMapper","traverseZBufferPass","getNestedVisibility","getSelector","getNestedPickable","traverseOpaqueZBufferPass","traverseOpaquePass","getIsOpaque","traverseTranslucentPass","queryPass","incrementOpaqueActorCount","incrementTranslucentActorCount","vtkOpenGLImageSlice","vtkImageSlice","MCWCMatrix","incrementVolumeCount","traverseVolumePass","computeMatrix","getIsIdentity","vtkOpenGLVolume","vtkVolume","glFramebuffer","colorBuffers","depthTexture","previousDrawBinding","previousReadBinding","previousDrawBuffer","previousReadBuffer","previousActiveFramebuffer","getBothMode","FRAMEBUFFER","saveCurrentBindingsAndBuffers","modeIn","saveCurrentBindings","saveCurrentBuffers","FRAMEBUFFER_BINDING","getActiveFramebuffer","restorePreviousBindingsAndBuffers","restorePreviousBindings","restorePreviousBuffers","bindFramebuffer","setActiveFramebuffer","createFramebuffer","setColorBuffer","texture","attachment","glAttachment","COLOR_ATTACHMENT0","framebufferTexture2D","removeColorBuffer","setDepthBuffer","DEPTH_ATTACHMENT","removeDepthBuffer","getGLFramebuffer","deleteFramebuffer","populateFramebuffer","createRenderbuffer","bindRenderbuffer","RENDERBUFFER","renderbufferStorage","framebufferRenderbuffer","getColorTexture","vtkFramebuffer","vtkOpenGLFramebuffer","FAST_LINEAR","OpacityMode","FRACTIONAL","PROPORTIONAL","vtkVolumeVS","vtkVolumeFS","vtkOpenGLVolumeMapper","zBufferTexture","zbt","getZBufferTexture","jitterTexture","framebuffer","scalarTexture","opacityTexture","openGLVolume","getUseLabelOutline","proportionalComponents","getOpacityMode","spc","maxSamples","getSampleDistance","lastLightComplexity","getVolumetricScatteringBlending","getLocalAmbientOcclusion","getAmbient","gopacity","getUseGradientOpacity","getComputeNormalFromOpacity","getBlendMode","replaceShaderLight","replaceShaderClippingPlane","lightNum","getLights","light","getLAOKernelRadius","getClippingPlanes","clipPlaneSize","lightComplexity","getShade","numberOfLights","getIntensity","lightTypeIsHeadLight","getPositional","usesProportionalComponents","interpolationType","useLabelOutline","useGradientOpacity","blendMode","previousState","arrayEquals","lastZBufferTexture","getClippingPlaneShaderParameters","ipScalarRange","getIpScalarRange","minVals","maxVals","_useSmallViewport","_smallViewportWidth","_smallViewportHeight","getFramebufferSize","modelToView","cam","crange","getClippingRange","pos","dcxmin","dcxmax","dcymin","dcymax","getParallelProjection","indexToWorldVec3","idxToView","idxNormalMatrix","getDirectionByReference","getMaximumSamplesPerRay","vctoijk","getWidth","getHeight","normal","pos2","dist","worldToIndex","getWorldToIndex","camera","_camera$getClippingRa","_camera$getClippingRa2","cRange0","cRange1","getDistance","setClippingRange","labelOutlineKeyMats","projectionToWorld","getRenderTargetSize","getRenderTargetOffset","projectionToView","lightColor","lightDir","halfAngle","dColor","getColor","intensity","ldir","getDirection","getTwoSidedLighting","lightPositionVC","lightAttenuation","lightConeAngle","lightExponent","lightPositional","attenuation","getAttenuationValues","getExponent","getConeAngle","lp","getTransformedPosition","getGlobalIlluminationReach","getVolumeShadowSamplingDistFactor","getAnisotropy","ks","getLAOKernelSize","kernelSample","random","vprop","oRange","getScalarOpacity","oscale","oshift","cshift","cScale","_sscale","gomin","getGradientOpacityMinimumOpacity","gomax","getGradientOpacityMaximumOpacity","goRange","getGradientOpacityMinimumValue","getGradientOpacityMaximumValue","_sscale2","_gomin","_gomax","_goRange","labelOutlineThickness","getLabelOutlineThickness","labelOutlineOpacity","getLabelOutlineOpacity","getDiffuse","getSpecular","getSpecularPower","clipPlaneNormals","clipPlaneDistances","clipPlanes","clipPlaneNormal","clipPlanePos","clipPlaneDist","_animationRateSubscription","unsubscribe","_model$_openGLRendere","_model$_openGLRendere2","rwi","getVTKWindow","getInteractor","isAnimating","_lastScale","onAnimationFrameRateUpdate","getAutoAdjustSampleDistances","frate","getRecentAnimationFrameRate","adjustment","getDesiredUpdateRate","getImageSampleDistance","fbSize","fvp","disable","copyShader","copyVAO","tex","blendFuncSeparate","ONE","ONE_MINUS_SRC_ALPHA","SRC_ALPHA","Bounds","oTable","opacityTextureString","oWidth","oSize","ofTable","ofun","opacityFactor","getScalarOpacityUnitDistance","_oTable","scalarTextureString","setOglNorm16Ext","lastXYF","targetXYF","fullViewportTime","avgWindowArea","avgFrameTime","vtkVolumeMapper","texels","getUseZValues","fb","getFramebuffer","checkFramebufferStatus","FRAMEBUFFER_COMPLETE","invokeCallback","requestDepth","vtkOpenGLPixelSpaceCallbackMapper","vtkPixelSpaceCallbackMapper","vtkWebGPUViewNodeFactory","pcsc","scpc","scvc","outMat","aspect","parallelScale","getParallelScale","xmin","xmax","ymin","ymax","xr","yr","_width","_height","tmp","tan","PI","getViewAngle","getUseHorizontalViewAngle","_xmin","_xmax","_ymin","_ymax","convertToOpenGLDepth","getClippingRangeByReference","zval","webGPURenderer","webGPURenderWindow","getStabilizedTime","center","getStabilizedCenterByReference","getWindowCenterByReference","vtkWebGPUCamera","label","bindables","bindGroupTime","setBindables","allMatch","getBindGroupLayout","entries","entry","getBindGroupLayoutEntry","binding","getBindGroup","tm","getBindGroupTime","bindGroup","getBindGroupEntry","createBindGroup","layout","getShaderCode","pipeline","bgroup","getBindGroupLayoutCount","vtkWebGPUBindGroup","vtkWebGPUBindGroup$1","shaderDesc","createShaderModule","code","getCode","vtkWebGPUShaderModule","vtkWebGPUShaderModule$1","shaderModules","_shaderModules","getShaderModule","sType","sHash","getHash","sm","vtkWebGPUShaderCache","vtkWebGPUShaderCache$1","replaced","gflag","regex","layouts","renderEncoder","shaderDescriptions","vertexState","topology","pipelineDescription","getShaderDescriptions","hash","getPipelineSettings","primitive","vertex","bindGroupLayouts","pipelineLayout","createPipelineLayout","sd","module","entryPoint","fragment","createRenderPipeline","getShaderDescription","addBindGroupLayout","getLabel","llabel","bindVertexInput","vInput","bindBuffers","vtkWebGPUPipeline","vtkWebGPUPipeline$1","outputNames","outputTypes","outputInterpolations","builtinOutputNames","builtinOutputTypes","builtinInputNames","builtinInputTypes","hasOutput","addOutput","addBuiltinOutput","addBuiltinInput","replaceShaderCode","priorStage","vertexInput","inputImpl","iodec","inputStruct","inputNames","getOutputNamesByReference","inputTypes","getOutputTypesByReference","inputInterpolations","getOutputInterpolationsByReference","outputStruct","vtkWebGPUShaderDescription","vtkWebGPUShaderDescription$1","textureDetails","r8unorm","numComponents","nativeType","elementSize","sampleType","r8snorm","Int8Array","r8uint","r8sint","r16uint","r16sint","r16float","rg8unorm","rg8snorm","rg8uint","rg8sint","r32uint","Uint32Array","r32sint","r32float","rg16uint","rg16sint","rg16float","rgba8unorm","rgba8snorm","rgba8uint","rgba8sint","bgra8unorm","rgb9e5ufloat","rgb10a2unorm","rg11b10ufloat","rg32uint","rg32sint","rg32float","rgba16uint","rgba16sint","rgba16float","rgba32uint","rgba32sint","rgba32float","stencil8","depth16unorm","depth24plus","depth32float","vtkWebGPUTypes","getDetailsFromTextureFormat","getByteStrideFromBufferFormat","sizeStart","num","getNumberOfComponentsFromBufferFormat","getNativeTypeFromBufferFormat","base","getShaderTypeFromBufferFormat","getByteStrideFromShaderFormat","getNativeTypeFromShaderFormat","arraysEqual","inputs","bindingDescriptions","attributeDescriptions","indexBuffer","addBuffer","inames","stepMode","names","removeBufferIfPresent","getBuffer","hasAttribute","getAttributeTime","getSourceTime","nameCount","nm","arrayInfo","getArrayInformation","getVertexInputInformation","info","vertexBuffers","buf","arrayStride","getStrideInBytes","shaderLocation","setVertexBuffer","setIndexBuffer","getReady","created","vtkWebGPUVertexInput","vtkWebGPUVertexInput$1","additionalBindables","fragmentShaderTemplate","numberOfInstances","numberOfVertices","pipelineHash","SSBO","textureViews","UBO","vertexShaderTemplate","WebGPURenderer","generateShaderDescriptions","vDesc","fDesc","sdrs","scode","unique","fnames","fname","replaceShaderIOStructs","replaceShaderRenderEncoder","replaceShaderRenderer","ubocode","setCode","replaceShaderMapper","replaceShaderPosition","addTextureView","view","prepareToDraw","updateInput","updateBuffers","updateBindings","updatePipeline","getBindables","computePipelineHash","registerDrawCallback","encoder","draw","prepareAndDraw","setPipeline","getBoundPipeline","activateBindGroup","bindUBO","getIndexBuffer","drawIndexed","getIndexCount","samp","getSampler","getPipeline","setDevice","setTopology","setRenderEncoder","setVertexState","createPipeline","vtkWebGPUSimpleMapper","vtkWebGPUSimpleMapper$1","getBufferManager","getFullScreenQuadBuffer","vtkWebGPUFullScreenQuad","vtkWebGPUFullScreenQuad$1","BufferUsage","Verts","Triangles","Strips","LinesFromStrips","LinesFromTriangles","UniformArray","PointArray","NormalsFromPoints","Texture","RawVertex","Storage","PrimitiveTypes","TriangleStrips","TriangleEdges","TriangleStripEdges","forwarded","vtkWebGPUBuffer","usage","write","destBuffer","destOffset","srcArrayBuffer","byteCount","srcBuffer","GPUBufferUsage","COPY_SRC","mappedAtCreation","arrayBuffer","getMappedRange","unmap","createCommandEncoder","copyBufferToBuffer","commandBuffer","finish","queue","submit","destroy","bufferSubData","createAndWrite","_loop","_model$handle","strideInBytes","arrayInformation","sourceTime","vtkWebGPUBuffer$1","processCell","Representation","_LimitedMap","_getOrAddFlatId","ptId","cellId","flatId","pointIdToFlatId","flatIdToPointId","flatIdToCellId","fillCell","ptIds","numPtIds","_ptId","cellProvokedMap","ibo","iboId","ptIdx2","_flatId","_ptIdx","_ptId2","provokedPointIds","_flatId2","_ptIdx2","_ptIdx3","countCell","iboSize","_ptIdx4","_ptId3","extraPoints","_single","_double","_triple","_indexCellBuilders","vtkWebGPUIndexBuffer","buildIndexBuffer","req","representation","inRepName","primType","getPrimitiveName","numberOfPoints","cellArrayIndex","_cellArrayIndex","nativeArray","flatSize","indexCount","vtkWebGPUIndexBuffer$1","packArray","inArrayData","outputType","getFlatSize","packExtra","hasOwnProperty","flatIdMap","getFlatIdToPointId","cellData","getFlatIdToCellId","i0","i1","i2","vtkWebGPUBufferManager","_createBuffer","gpuUsage","INDEX","COPY_DST","setArrayInformation","UNIFORM","STORAGE","VERTEX","arrayType","setStrideInBytes","_arrayType","pointArray","cellArrayData","getNumberOfCells","generateNormals","_result","setSourceTime","time","hasBuffer","hasCachedObject","getCachedObject","getBufferForPointArray","DOUBLE","_getFormatForDataArray","buffRequest","fullScreenQuadBuffer","vtkWebGPUBufferManager$1","bufferEntries","bufferEntryNames","_bufferEntryNames","_sendTime","bindGroupLayoutEntry","addEntry","send","_buffer","writeBuffer","createView","ArrayBuffer","setValue","instance","BYTES_PER_ELEMENT","setArray","arr","ioffset","setAllInstancesFromArray","inst","setAllInstancesFromArrayColorToFloat","setAllInstancesFromArray3x3To4x4","getSendTime","group","resource","clearData","vtkWebGPUStorageBuffer","vtkWebGPUStorageBuffer$1","bindGroupEntry","sendTime","sendDirty","sortDirty","packed","sortBufferEntries","currOffset","newEntries","maxAlignment","_entry","_entry2","entry2","_entry3","_entry4","_entry5","_entry6","i3","entry3","_entry7","_entry8","sendIfNeeded","lastValue","changed","vtkWebGPUUniformBuffer","vtkWebGPUUniformBuffer$1","clearFragColorTemplate","clearFragTextureTemplate","_fsqClearMat4","_tNormalMat4","recenterThreshold","suppressClear","stabilizedCenter","lightTimeString","stabilizedTime","webgpuCamera","updateStabilizedMatrix","clipRange","getPositionByReference","dop","getDirectionOfProjectionByReference","updateUBO","utime","getEnvironmentTexture","getMipLevel","getEnvironmentTextureDiffuseStrength","getEnvironmentTextureSpecularStrength","getYInvertedTiledSizeAndOrigin","getDevice","updateSSBO","lightPosArray","lightDirArray","lightColorArray","lightTypeArray","viewCoordinatePosition","getPosition","cos","r","getConeFalloff","setNumberOfInstances","scissorAndViewport","setViewport","setScissorRect","begin","getCommandEncoder","_model$backgroundTex","clearFSQ","setPipelineHash","setFragmentShaderTemplate","ubo","setUBO","backgroundTex","getPipelineHash","getUseEnvironmentTextureAsBackground","_ubo","environmentTextureHash","getTextureManager","getTextureForVTKTexture","tview","setTextureViews","backgroundTexLoaded","interpolate","addSampler","addressModeU","addressModeV","addressModeW","minFilter","magFilter","mipmapFilter","_ubo2","getUBO","volumeDepthRangePass","getPropFromID","getPropID","vtkWebGPURenderer","visibility","GPUShaderStage","FRAGMENT","sampler","createSampler","vtkWebGPUSampler","vtkWebGPUSampler$1","tmp2Mat4","tmp3Mat4","ptsArray1","ptsArray2","rowLength","lutBuildTime","WebGPUImageSlice","WebGPURenderWindow","getRenderEncoder","dimensions","volMapr","mcwcmat","modelToIndex","axis0","axis1","axis2","cShift","tView","tScale","getTexture","getScale","updateLUTImage","getTextureViews","numRows","colorArray","_j","grey","_j2","treq","superClassUpdateBuffers","newTex","getTextureForImageData","tViews","clampSampler","getOptions","sr","getShaderReplacements","replaceShaderImage","vtkWebGPUImageMapper","bufferShift","propID","keyMatricesTime","bcwc","bcsc","getUniquePropID","getBufferShift","wgpuRen","vtkWebGPUImageSlice","addVolume","vout","getBoundingCubePoints","extent","iz","iy","ix","indexToWorld","poffset","vtkWebGPUVolume","vtkWebGPUPixelSpaceCallbackMapper","asyncGeneratorStep","gen","resolve","reject","_next","_throw","arg","_asyncToGenerator","self","err","DEFAULT_VIEW_API","VIEW_CONSTRUCTORS","registerViewConstructor","newAPISpecificView","defaultViewAPI","views","interactor","neverRendered","numberOfLayers","addRenderer","hasRenderer","setRenderWindow","removeRenderer","addView","hasView","_views","removeView","preRender","isActiveCameraCreated","resetCamera","traverseAllPasses","getStatistics","propCount","invisiblePropCount","getViewProps","prop","mpr","getPrimitiveCount","pcount","keyName","str","captureImages","opts","setImmediate","captureNextImage","vtkRenderWindow","vtkRenderWindow$1","listViewAPIs","delegates","currentOperation","preDelegateOperations","postDelegateOperations","currentParent","setCurrentOperation","currentTraverseOperation","viewNode","parent","_currentParent","vtkRenderPass","vtkRenderPass$1","translucentShaderReplacement","oitpFragTemplate","createVertexBuffer","_model$framebuffer","translucentRGBATexture","RGBA16F","setFormat","setOpenGLDataType","translucentRTexture","R16F","translucentZTexture","createCopyShader","renNode","forwardPass","_supported","drawBuffers","clearBufferfv","COLOR","DEPTH","getOpaqueActorCount","COLOR_ATTACHMENT1","BLEND","ZERO","depthFunc","ALWAYS","LEQUAL","vtkOpenGLOrderIndependentTranslucentPass","vtkOpenGLOrderIndependentTranslucentPass$1","opaqueActorCount","translucentActorCount","volumeCount","overlayActorCount","depthRequested","numlayers","getNumberOfLayers","getChildren","getRenderers","getDraw","getLayer","incrementOverlayActorCount","vtkForwardPass","vtkForwardPass$1","fieldAssociation","FieldAssociations","FIELD_ASSOCIATION_CELLS","captureZValues","getSourceDataAsync","_ref","_callee","fx1","fy1","fx2","fy2","_context","prev","stop","_x","_x2","_x3","_x4","_x5","selectAsync","_ref2","_callee2","srcData","_context2","sent","abrupt","generateSelection","_x6","_x7","_x8","_x9","_x10","vtkHardwareSelector","vtkHardwareSelector$1","SelectionContent","GLOBALIDS","PEDIGREEIDS","VALUES","INDICES","FRUSTUM","LOCATIONS","THRESHOLDS","BLOCKS","QUERY","SelectionField","CELL","POINT","FIELD","EDGE","ROW","contentType","fieldType","properties","selectionList","vtkSelectionNode","vtkSelectionNode$1","PassTypes","idOffset","getInfoHash","compositeID","getAlpha","xx","yy","pb","area","convert","g","getID","low24","high8","getPixelInformationWithData","buffdata","inDisplayPosition","maxDistance","outSelectedPosition","maxDist","displayPosition","actorid","pixBuffer","ACTOR_PASS","props","_info","COMPOSITE_INDEX_PASS","zValue","zBuffer","ID_LOW24","high24","ID_HIGH24","attributeID","dispPos","curPos","valid","convertSelection","fieldassociation","dataMap","openGLRenderWindow","sel","setContentType","setFieldType","FIELD_ASSOCIATION_POINTS","getProperties","worldPosition","displayToWorld","setSelectionList","attributeIDs","generateSelectionWithData","dmv","currentPass","propColorValue","maximumPointId","maximumCellId","releasePixBuffers","rawPixBuffer","beginSelection","_renderer","maxAttributeId","setSelector","hitProps","propPixels","originalBlending","isEnabled","endSelection","preCapturePass","postCapturePass","select","captureBuffers","setArea","originalBackground","setBackground","rpasses","getRenderPasses","MIN_KNOWN_PASS","MAX_KNOWN_PASS","passRequired","savePixelBuffer","processPixelBuffers","isPropHit","processSelectorPixelBuffers","pass","passNo","getPixelData","buildPropHitList","pixelbuffer","renderProp","setPropColorValueFromInt","renderCompositeIndex","renderAttributeId","attribid","passTypeToString","enumToString","Boolean","getPixelInformation","_info2","getRawPixelBuffer","getPixelBuffer","attach","superSetArea","vtkOpenGLHardwareSelector","SET_GET_FIELDS","lastShaderBound","shaderPrograms","nFSSource","gl2","fragDepthString","nVSSource","shaderOutputs","outputCount","vertexCode","fragmentCode","geometryCode","getShaderProgram","getCompiled","bindShader","hashInput","sps","getVertexShader","setSource","getFragmentShader","getGeometryShader","setMd5Hash","releaseCurrentShader","sp","astShaderBound","vtkShaderCache","vtkShaderCache$1","numberOfTextureUnits","textureUnits","deleteTable","MAX_TEXTURE_IMAGE_UNITS","allocate","isAllocated","allocateUnit","unit","textureUnitId","free","vtkOpenGLTextureUnitManager","vtkTextureUnitManager","getViewNodeFactory","getAspectRatioForRenderer","isInViewport","vCoords","getViewportSize","getViewportCenter","displayToNormalizedDisplay","z","worldToView","viewToWorld","worldToDisplay","val2","viewToProjection","val3","projectionToNormalizedDisplay","normalizedDisplayToProjection","normalizedDisplayToViewport","coords","viewportToNormalizedViewport","normalizedViewportToViewport","displayToLocalDisplay","viewportToNormalizedDisplay","getComputedDevicePixelRatio","getContainerSize","createSelector","vtkRenderWindowViewNode","vtkRenderWindowViewNode$1","HmdVR","MobileAR","LookingGlassVR","GET_UNDERLYING_CONTEXT","createContextProxyHandler","getParameterHandler","propHandlers","receiver","propValue","Proxy","Reflect","Function","propHandler","SCREENSHOT_PLACEHOLDER","position","top","DEFAULT_RESET_FACTORS","vr","rescaleFactor","translateZ","ar","checkRenderTargetSupport","GL_CONTEXT_COUNT","GL_CONTEXT_LISTENERS","deleteGLContext","cb","_preventDefault","preventDefault","vtkOpenGLRenderWindow","cachingContextHandler","restoreContext","hardwareMaximumLineWidth","isImmersiveVrSupported","isSessionSupported","previousSize","onModified","setAttribute","viewStream","setSize","style","display","useOffScreen","cursor","cursorVisibility","containerSize","getRenderersByReference","initialized","get3DContext","textureUnitManager","shaderCache","makeCurrent","setContainer","parentNode","removeChild","contains","bgImage","appendChild","useBackgroundImage","getContainer","_model$el$getBounding","getBoundingClientRect","activeFramebuffer","preserveDrawingBuffer","invokeHaveVRDisplay","webgl2Supported","webgl2","defaultToWebgl2","startXR","xrSessionType","isAR","sessionType","xrSession","requestSession","enterXR","glLayer","oldCanvasSize","makeXRCompatible","XRWebGLLayer","framebufferWidth","framebufferHeight","updateRenderState","baseLayer","requestReferenceSpace","refSpace","xrReferenceSpace","resetXRScene","switchToXRAnimation","xrSceneFrame","requestAnimationFrame","xrRender","isXrSessionAR","physicalScale","getPhysicalScale","physicalTranslation","getPhysicalTranslation","setPhysicalScale","setPhysicalTranslation","stopXR","cancelAnimationFrame","returnFromXRAnimation","DOMException","setProjectionMatrix","_ref3","_callee3","frame","xrPose","_context3","session","updateXRGamepads","getViewerPose","renderState","getViewport","eye","startX","startY","endX","endY","computeViewParametersFromPhysicalMatrix","transform","inverse","projectionMatrix","rp","_textureResourceIds","activeUnit","getTextureUnitManager","activeTexture","TEXTURE0","R8","RG8","RGB8","RGBA8","R16_EXT","RG16_EXT","RGB16_EXT","RGBA16_EXT","R16_SNORM_EXT","RG16_SNORM_EXT","RGB16_SNORM_EXT","RGBA16_SNORM_EXT","RG16F","RGB16F","setBackgroundImage","img","setUseBackgroundImage","_ref4","_ref4$resetCamera","_ref4$size","_ref4$scale","imageFormat","previous","notifyStartCaptureImage","_screenshot","subscription","onImageReady","imageURL","placeHolder","originalSize","cameras","_ref5","restoreParamsFn","remove","tmpImg","isUserResetCamera","params","resetCameraArgs","resetCameraFn","JSON","parse","stringify","_ref6","lineWidthRange","ALIASED_LINE_WIDTH_RANGE","glTextureFloat","glTextureHalfFloat","glDebugRendererInfo","glDrawBuffers","glAnisotropic","MAX_VERTEX_ATTRIBS","MAX_VARYING_VECTORS","MAX_VERTEX_UNIFORM_VECTORS","MAX_FRAGMENT_UNIFORM_VECTORS","MAX_VERTEX_TEXTURE_IMAGE_UNITS","MAX_COMBINED_TEXTURE_IMAGE_UNITS","MAX_CUBE_MAP_TEXTURE_SIZE","MAX_TEXTURE_MAX_ANISOTROPY_EXT","ALIASED_POINT_SIZE_RANGE","MAX_VIEWPORT_DIMS","MAX_RENDERBUFFER_SIZE","RED_BITS","GREEN_BITS","BLUE_BITS","ALPHA_BITS","DEPTH_BITS","STENCIL_BITS","SUBPIXEL_BITS","SAMPLES","SAMPLE_BUFFERS","ALPHA","MAX_DRAW_BUFFERS_WEBGL","getShaderPrecisionFormat","HIGH_FLOAT","precision","rangeMin","rangeMax","MEDIUM_FLOAT","LOW_FLOAT","HIGH_INT","MEDIUM_INT","LOW_INT","getSupportedExtensions","VENDOR","VERSION","SHADING_LANGUAGE_VERSION","UNMASKED_VENDOR_WEBGL","_params$pop","_params$pop2","renderPasses","temporaryCanvas","temporaryContext","mainBoundingClientRect","viewProp","canvasList","getElementsByTagName","currentCanvas","boundingClientRect","newXPosition","newYPosition","screenshot","toDataURL","invokeImageReady","getCanvasDataURL","disableCullFace","cullFaceEnabled","CULL_FACE","enableCullFace","setViewStream","stream","invalidateCache","newActiveFramebuffer","superSetSize","invokeWindowResizeEvent","textureResourceIds","xrSupported","Image","zIndex","pushMonitorGLContextCount","popMonitorGLContextCount","activeTextures","getTextures","ogltextures","oglmapper","activateTextures","vtkOpenGLActor","vtkActor","traverseOverlayPass","overlayPass","vtkOpenGLActor2D","vtkActor2D","Shading","ScalarMode","StartEvent","EndEvent","CoordinateSystem","vtkOpenGLPolyDataMapper","openGLActor","primitives","replaceShaderColor","getReferenceByName","colorDec","colorImpl","getColorComponents","drawingEdges","getInterpolateScalarsBeforeMapping","getColorCoordinates","getBackfaceProperty","lastLightCount","sstring","lc","_lc","_lc2","_lc3","replaceShaderNormal","tus","getActiveTextures","tcdim","getTarget","getColorTextureMap","getEdgeVisibility","getPrimitiveType","getCoincidentTopologyPointOffsetParameter","getCoincidentTopologyLineOffsetParameters","getFieldAssociation","replaceShaderPicking","lastSelectionState","poly","needLighting","pointNormals","cellNormals","getCellData","flat","getInterpolation","FLAT","getLighting","selectionStateChanged","listCallbacks","ShadersCallbacks","userData","primitiveIDOffset","vertexIDOffset","getCustomShaderAttributes","attrName","getCustomData","getColorBO","getColorOffset","getColorBOStride","internalColorTexture","tname","getPropColorValue","getCurrentPass","getColorByReference","ld","newLightDirection","lightTypeIsSceneLight","lightDirection","lightHalfAngle","viewTF","_light","np","getAttenuationValuesByReference","camm","getKeyMatrixTime","progm","getLastCameraMTime","actorIsIdentity","getCoordinateSystem","DISPLAY","tmpMat3","aColor","getEdgeColorByReference","getAmbientColorByReference","getDiffuseColorByReference","aIntensity","dIntensity","sIntensity","sColor","getSpecularColorByReference","getAmbientColor","getDiffuseColor","getSpecularColor","updateMaximumPointCellIds","_model$selectionWebGL","_model$selectionWebGL2","_model$selectionWebGL3","_model$selectionWebGL4","selectionWebGLIdsToVTKIds","setMaximumPointId","_length","setMaximumCellId","picking","drawSurfaceWithEdges","setPointPicking","LastBoundBO","getStatic","getNumberOfValues","backfaceCulling","getBackfaceCulling","frontfaceCulling","getFrontfaceCulling","cullFace","FRONT","BACK","vmtime","mapScalars","getColorMapColors","scalarMode","getScalarMode","getScalarVisibility","USE_CELL_DATA","USE_CELL_FIELD_DATA","USE_FIELD_DATA","USE_POINT_FIELD_DATA","getTCoords","arrayName","getArrayByName","getPopulateSelectionSettings","getVerts","setSelectionWebGLIdsToVTKIds","shaderRebuildString","ambientColor","diffuseColor","specularColor","setPrimitiveType","lastSelectionPass","vtkOpenGLPolyDataMapper$1","vtkOpenGLGlyph3DMapper","hardwareSupport","multiply4x4WithOffset","out","off","a00","a01","a02","a03","a10","a11","a12","a13","a20","a21","a22","a23","a30","a31","a32","a33","b0","b1","b2","b3","getColorArray","updateGlyphShaderParameters","normalMatrixUsed","mcvcMatrixUsed","carray","garray","narray","p","ofs","b00","b01","b02","b10","b11","b12","b20","b21","b22","mcpcMatrix","mcvcMatrix","cdata","tmpColor","getMatrixArray","getNormalArray","compositePass","cabo","drawArraysInstancedANGLE","glyphBOBuildTime","matrixBuffer","normalBuffer","colorBuffer","pickBuffer","buildArrays","getBuildTime","parray","mcwcMatrix","vtkGlyph3DMapper","imat","lastFormat","camPos","tmaps","vtkOpenGLSkybox","vtkSkybox","vtkSphereMapperVS","vtkOpenGLSphereMapper","fragString","invert","getScaleArray","hasArray","getScaleFactor","tmp4","vbo","scales","getArray","setColorOffset","setColorBOStride","setColorBO","setColorComponents","setStride","pointSize","cos30","vboIdx","ucIdx","radius","getRadius","vtkSphereMapper","vtkStickMapperVS","vtkOpenGLStickMapper","anorms","orientationArray","getOrientationArray","verticesArray","getLength","vtkStickMapper","previousTextureParameters","getTextureParameters","shouldReset","previousTextureSize","update3DFromRaw","vtkStreamingOpenGLVolumeMapper","getModelInitialValues","getScalarTexture","vtkStreamingOpenGLViewNodeFactory","vtkStreamingOpenGLRenderWindow","Device","Unknown","LeftController","RightController","Input","Trigger","TrackPad","Grip","Thumbstick","A","B","ApplicationMenu","Axis","TouchpadX","TouchpadY","ThumbstickX","ThumbstickY","normalizeWheel","vtkOnceErrorMacro","EMPTY_MOUSE_EVENT","MouseEvent","deviceInputMap","handledEvents","pointerCacheToPositions","positions","pointerId","renderWindow","interactorStyle","picker","pickingManager","enabled","enableRender","currentRenderer","lightFollowCamera","desiredUpdateRate","stillUpdateRate","container","recognizeGestures","currentGesture","animationRequest","lastFrameTime","recentAnimationFrameRate","wheelTimeoutID","moveTimeoutID","lastGamepadValues","preventDefaultOnPointerDown","preventDefaultOnPointerUp","mouseScrollDebounceByPass","_animationExtendedEnd","eventName","animationRequesters","pointerCache","wheelCoefficient","updateCurrentRenderer","_forcedRenderer","findPokedRenderer","getScreenEventPositionFor","_view","scaleX","scaleY","clientX","clientY","getModifierKeysFor","controlKey","ctrlKey","altKey","shiftKey","getKeysFor","modifierKeys","keyCode","charCode","getDeviceTypeFor","pointerType","forceRender","inRender","invokeRenderEvent","startEventLoop","aren","setInteractorStyle","setInteractor","setEnabled","getCurrentRenderer","bindEvents","handleWheel","handlePointerEnter","handlePointerLeave","handlePointerMove","passive","handlePointerDown","handlePointerUp","handlePointerCancel","handleKeyPress","handleKeyDown","handleKeyUp","handlePointerLockChange","touchAction","userSelect","webkitTapHighlightColor","unbindEvents","keyPressEvent","keyDownEvent","keyUpEvent","callData","deviceType","pointerEnterEvent","mouseEnterEvent","pointerLeaveEvent","mouseLeaveEvent","button","isPointerLocked","hasPointerCapture","releasePointerCapture","setPointerCapture","handleTouchStart","handleMouseDown","handleTouchEnd","handleMouseUp","handleTouchMove","handleMouseMove","leftButtonPressEvent","middleButtonPressEvent","rightButtonPressEvent","requestPointerLock","exitPointerLock","pointerLockElement","startPointerLockEvent","endPointerLockEvent","requestAnimation","requestor","xrAnimation","_animationStartTime","_animationFrameCount","handleAnimation","startAnimationEvent","extendAnimation","duration","newEnd","cancelAnimation","skipWarning","endAnimationEvent","requestStr","xrFrame","xrRefSpace","inputSources","inputSource","gripPose","gripSpace","getPose","gp","gamepad","hand","handedness","buttons","none","pressed","button3DEvent","orientation","mapping","move3DEvent","startMouseMoveEvent","mouseMoveEvent","clearTimeout","setTimeout","endMouseMoveEvent","currTime","animationFrameRateUpdateEvent","animationEvent","spinY","startMouseWheelEvent","mouseWheelEvent","endMouseWheelEvent","leftButtonReleaseEvent","middleButtonReleaseEvent","rightButtonReleaseEvent","pointers","recognizeGesture","_callData","_callData2","_positions","_callData3","setView","getFirstRenderer","_model$_view","_model$_view$getRende","_model$_view$getRende2","_model$_view2","_model$_view2$getRend","rc","interactiveren","viewportren","getInteractive","lowerFirst","charAt","pokedRenderer","firstRenderer","startingEventPositions","endPinchEvent","endRotateEvent","endPanEvent","posVals","startVals","originalDistance","newDistance","originalAngle","atan2","newAngle","angleDeviation","trans","thresh","clientWidth","clientHeight","pinchDistance","rotateDistance","panDistance","touches","startPinchEvent","_callData4","rotation","startRotateEvent","_callData5","translation","startPanEvent","_callData6","rotateEvent","_callData7","pinchEvent","_callData8","panEvent","handleVisibilityChange","setCurrentRenderer","superDelete","hidden","vtkRenderWindowInteractor","vtkRenderWindowInteractor$1","invokeResize","rendererMap","getRenderer","resize","vtkOffscreenMultiRenderWindow","createRadonTransferFunction","firstAbsorbentMaterialHounsfieldValue","firstAbsorbentMaterialAbsorption","maxAbsorbentMaterialHounsfieldValue","maxAbsorbentMaterialAbsorption","outputTransferFunction","removeAllPoints","addPointLong","addPoint","sampleDistance","imageSampleDistance","maximumSamplesPerRay","autoAdjustSampleDistances","filterMode","computeNormalFromOpacity","volumetricScatteringBlending","globalIlluminationReach","volumeShadowSamplingDistFactor","anisotropy","localAmbientOcclusion","LAOKernelSize","LAOKernelRadius","static","setBlendModeToComposite","setBlendMode","setBlendModeToMaximumIntensity","setBlendModeToMinimumIntensity","setBlendModeToAverageIntensity","setBlendModeToAdditiveIntensity","setBlendModeToRadonTransform","getBlendModeAsString","setAverageIPScalarRange","setIpScalarRange","getFilterModeAsString","setFilterModeToOff","setFilterMode","setFilterModeToNormalized","setFilterModeToRaw","setGlobalIlluminationReach","setVolumetricScatteringBlending","vsb","setVolumeShadowSamplingDistFactor","vsdf","setAnisotropy","at","setLAOKernelSize","setLAOKernelRadius","kr","vtkVolumeMapper$1","vtkSharedVolumeMapper","updatedFrames","superCreate3DFilterableFromRaw","inputDataType","inputNumComps","bytesPerVoxel","TypedArrayConstructor","fillSubImage3D","frameIndex","zOffset","blockHeight","multiRowBlockLength","multiRowBlockLengthInBytes","normalBlocks","lastBlockHeight","multiRowLastBlockLength","block","yOffset","dataView","setUpdatedFrame","vtkStreamingOpenGLTexture","isPerformingCoordinateTransformation","tmpMatrix","tmpvec1","nearz","farz","clippingRange","parallelProjection","useOffAxisProjection","viewAngle","useHorizontalViewAngle","znear","zfar","vtkSlabCamera","ImageVolume","_imageIdsIndexMap","_imageURIsIndexMap","isPreScaled","metadata","origin","scalarData","numVoxels","scaling","referencedVolumeId","_imageIds","newImageIds","_reprocessImageIds","isDynamicVolume","getScalarData","obj","Uint8ClampedArray","getImageIdIndex","createInternalVTKRepresentation","PhotometricInterpretation","dataArrayAttrs","setDimensions","setSpacing","setDirection","scalarDataArrays","vtkScalarArray","addArray","setActiveScalars","addScalarDataArraysToImageData","getScalarDataArrays","scalarArray","setScalars","addScalarDataToImageData","volumeLoaders","unknownVolumeLoader","loadVolumeFromVolumeLoader","scheme","loader","VOLUME_LOADED","errorObject","VOLUME_LOADED_FAILED","loadVolume","createAndCacheVolume","createAndCacheDerivedVolume","referencedVolume","targetBuffer","scalarLength","TypedArray","volumeScalarData","derivedImageData","derivedVolume","createLocalVolume","preventCache","registerVolumeLoader","volumeLoader","getVolumeLoaderSchemes","registerUnknownVolumeLoader","oldVolumeLoader","EPSILON_PART","isPrimaryVolume","startsWith","starts","getTargetVolumeAndSpacingInNormalDir","targetVolumeId","volumeActors","getActors","spacingInNormalDirection","actorUID","imageVolumes","va","referenceId","uid","iv","imageVolumeIndex","findIndex","smallest","hasPrimaryVolume","getVolumeActorCorners","volumeActor","extentToBounds","indexWithinDimensions","targetViewport","sameVolumesViewports","renderingEngine","targetActors","viewports","getVolumeViewports","vp","vpActors","every","vpActor","targetViewports","filteredViewports","hasVolumeId","transformWorldToIndex","RequestPoolManager","numRequests","interaction","thumbnail","prefetch","requestPool","grabDelay","awake","maxNumRequests","setMaxSimultaneousRequests","getMaxSimultaneousRequests","timeoutHandle","addRequest","requestFn","additionalDetails","requestDetails","Interaction","startGrabbing","filterRequests","filterFunction","requestType","clearRequestStack","sendRequests","requestsToSend","getNextRequest","finally","startAgain","interactionPriorities","getSortedPriorityGroups","hasRemainingInteractionRequests","hasRemainingThumbnailRequests","Thumbnail","hasRemainingPrefetchRequests","Prefetch","priorities","getRequestPool","imageLoadPoolManager","imageLoaders","unknownImageLoader","loadImageFromCacheOrVolume","cachedVolumeInfo","loadStatus","convertToCornerstoneImage","IMAGE_LOADED","IMAGE_LOAD_FAILED","loadImageFromImageLoader","loadImage","loadAndCacheImage","loadAndCacheImages","cancelLoadImage","cancelLoadImages","cancelLoadAll","requests","loadObject","cancel","registerImageLoader","imageLoader","registerUnknownImageLoader","oldImageLoader","unregisterAllImageLoaders","VIEWPORT_ELEMENT","CANVAS_CSS_CLASS","getOrCreateCanvas","element","canvasSelector","viewportElement","internalDiv","querySelector","div","classList","createViewportElement","createCanvas","preScale","scaled","scalingParameters","suvbw","renderToCanvasGPU","modality","HTMLCanvasElement","viewportId","originalWidth","originalHeight","body","uniqueId","stackViewportInput","STACK","defaultOptions","suppressEvents","enableElement","elementRendered","onImageRendered","eventDetail","IMAGE_RENDERED","disableElement","querySelectorAll","renderImageObject","setProperties","minPixelValue","maxPixelValue","validateParameterUndefinedOrNull","checkParam","errorMsg","isRotated","imageSize","getImageSize","rowPixelSpacing","columnPixelSpacing","verticalRatio","horizontalRatio","verticalScale","horizontalScale","scaleFactor","colormap","initialDefaultViewport","voi","pixelReplication","hflip","vflip","modalityLUT","voiLUT","labelmap","displayedArea","tlhc","brhc","presentationSizeMode","createViewport","getImageFitScale","columns","rows","Transform","clone","m11","m12","m21","m22","dx","dy","d","m0","m1","m2","m3","m4","m5","rotate","rad","sin","sx","sy","transformPoint","point","enabledElement","angle","widthScale","heightScale","performance","lut","minValue","maxValue","maxValueMapped","firstValueMapped","modalityLutValue","generateNonLinearVOILUT","generateLinearVOILUT","calculateTransform","setTransform","doesImageNeedToBeRendered","lastRenderedImageId","renderingTools","lastRenderedViewport","renderCanvas","canvasContext","fillStyle","fillRect","renderCanvasData","getImageData","renderCanvasContext","isColor","color","lastRenderedIsColor","getLut","cachedLut","lutArray","vlutfn","storedValue","generateColorLUT","getRenderCanvas","invalidated","canvasWasColor","initializeRenderCanvas","colorLUT","stats","lastLutGenerateTime","canvasImageDataData","pixelData","lastGetPixelDataTime","canvasImageDataIndex","storedPixelDataIndex","lastStoredPixelDataToCanvasImageDataTime","storedRGBAPixelDataToCanvasImageData","storedColorPixelDataToCanvasImageData","putImageData","lastPutImageDataTime","renderColorImage","imageSmoothingEnabled","setToPixelCoordinateSystem","saveLastRendered","computeAutoVoi","hasLut","hasVoi","maxVoi","slope","intercept","minVoi","lutMatches","mlutfn","storedPixelValue","generateNonLinearModalityLUT","generateLinearModalityLUT","getModalityLut","generateLut","useAlphaChannel","minimum","collectedMultiplierTerms","petVOILutFunction","lutFunction","storedPixelDataToCanvasImageDataPET","storedPixelDataToCanvasImageData","pixelValue","storedPixelDataToCanvasImageDataRGBA","renderGrayscaleImage","HSVToRGB","hue","sat","rgb","hueCase","frac","lx","ly","lz","NumberOfColors","Ramp","TableRange","HueRange","SaturationRange","ValueRange","AlphaRange","NaNColor","BelowRangeColor","UseBelowRangeColor","AboveRangeColor","UseAboveRangeColor","InputRange","Table","setNumberOfTableValues","number","setRamp","ramp","setTableRange","setHueRange","setSaturationRange","setValueRange","setRange","setAlphaRange","scalar","mapValue","force","maxIndex","hinc","sinc","vinc","ainc","c_rgba","buildSpecialColors","numberOfColors","belowRangeColorIndex","aboveRangeColorIndex","nanColorIndex","getIndex","Range","MaxIndex","Shift","Scale","dIndex","linearIndexLookupMain","setTableValue","COLOR_TRANSPARENT","getRank","elem","midElem","makeMappingArray","N","y0","xLinSpace","vector","linspace","xLinSpaceIndexes","inputArray","indexes","len","searchSorted","colorPercent","colorDelta","getColormap","colormapData","redLut","greenLut","blueLut","createLinearSegmentedColormap","cpuFallbackColormap","getId","getColorSchemeName","setColorSchemeName","getNumberOfColors","setNumberOfColors","isValidIndex","getColorRepeating","setColor","addColor","insertColor","removeColor","clearColors","buildLookupTable","createLookupTable","grayscaleLut","grayscale","clut","clamp","renderPseudoColorImage","colormapId","lastRenderTime","renderTimeInMs","invalid","needsRedraw","renderToCanvasCPU","getDefaultViewport","drawImageSync","loadImageToCanvas","renderFn","successCallback","errorCallback","useRGBA","worldCoords","imagePlaneModule","columnCosines","rowCosines","newOrigin","sub","imageToWorldCoords","imageCoords","imageCoordsInWorld","SMALL_EPSILON","isOne","isUnit","isOrthonormal","getSliceRange","focalPoint","corners","dz","buildFromDegree","rotateFromDirections","pt","transformedFocalPoint","currentSlice","minX","maxX","current","getCamera","actorEntry","getActor","sliceRange","numScrollSteps","floatingStepNumber","currentStepIndex","sliceRangeInfo","snapFocalPointToSlice","deltaFrames","posDiffFromFocalPoint","steps","newFocalPoint","newSlicePosFromMin","newPosition","numberOfSlices","imageIndex","isImageActor","actorIsA","actorType","getViewportsWithImageURI","filteredStackViewports","getStackViewports","hasImageURI","filteredVolumeViewports","getClosestStackImageIndexForPoint","minimalDistance","getImageIds","currentImageIdIndex","getCurrentImageIdIndex","planeMetadata","targetImagePlane","rowVec","colVec","planeNormal","getPlaneMetadata","closestStack","higherImageIds","lowerImageIds","calculateMinimalDistanceForStackViewport","spatialRegistrationMetadataProvider","viewportId1","viewportId2","entryId","entryIdReverse","viewport1","viewport2","imageId1","getCurrentImageId","imageId2","imagePlaneModule1","imagePlaneModule2","imageOrientationPatient","iop2","isSameImagePlane","imagePositionPatient1","imagePositionPatient2","getViewportImageCornersInWorld","topRightCanvas","bottomRightCanvas","bottomLeftCanvas","topLeftWorld","canvasToWorld","topRightWorld","bottomRightWorld","bottomLeftWorld","topLeftImage","topRightImage","bottomRightImage","bottomLeftImage","topLeftImageWorld","_isInBounds","topRightImageWorld","bottomRightImageWorld","bottomLeftImageWorld","_getStackViewportImageCorners","imageCoord","hasNaNValues","some","applyPreset","preset","colorTransferArray","shiftRange","getShiftRange","normColorTransferValuePoints","rescaled","applyPointsToRGBFunction","setRGBTransferFunction","scalarOpacityArray","normPoints","pwf","applyPointsToPiecewiseFunction","setScalarOpacity","gradientMinValue","gradientMinOpacity","gradientMaxValue","gradientMaxOpacity","setUseGradientOpacity","setGradientOpacityMinimumValue","setGradientOpacityMinimumOpacity","setGradientOpacityMaximumValue","setGradientOpacityMaximumOpacity","setInterpolationTypeToFastLinear","setAmbient","setDiffuse","setSpecular","setSpecularPower","isMergeableObject","cloneIfNecessary","optionsArgument","deepMerge","defaultArrayMerge","destination","arrayMerge","mergeObject","getScalingParameters","modalityLutModule","generalSeriesModule","rescaleSlope","rescaleIntercept","suvFactor","suvbsa","suvlbm","getScalarDataType","getEnabledElement","viewportUid","renderingEngineUid","dataset","getEnabledElementByIds","hasBeenDestroyed","FrameOfReferenceUID","getFrameOfReferenceUID","getEnabledElements","enabledElements","getCornerstoneImage","linePlaneIntersection","p0","p1","x0","z0","z1","C","D","threePlaneIntersection","firstPlane","secondPlane","thirdPlane","A1","B1","C1","D1","A2","B2","C2","D2","A3","B3","C3","D3","planeDistanceToPoint","signed","numerator","sign","toWindowLevel","low","high","toLowHighRange","_colormaps","registerColormap","Name","getColormapNames","presetMap","IndexedColors","Annotations","ColorSpace","NanColor","RGBPoints","Creator","Source","License","ShowIndexedColorActiveValues","rgbPresetNames","addPreset","removePresetByName","getPresetByName","VTK_MAX_VRCOMP","independentComponents","componentData","colorChannels","grayTransferFunction","rGBTransferFunction","scalarOpacityUnitDistance","opacityMode","gradientOpacityMinimumValue","gradientOpacityMinimumOpacity","gradientOpacityMaximumValue","gradientOpacityMaximumOpacity","componentWeight","disableGradientOpacity","getColorChannels","setGrayTransferFunction","getGrayTransferFunction","setComponentWeight","setInterpolationTypeToNearest","setInterpolationType","setInterpolationTypeToLinear","getInterpolationTypeAsString","cap","vtkVolumeProperty","vtkVolumeProperty$1","mapper","boundsMTime","getVolumes","makeProperty","mapperBounds","_","row","bbox","mt","getRedrawMTime","getInputAlgorithm","vtkVolume$1","createVolumeMapper","volumeMapper","setInputData","setMaximumSamplesPerRay","setSampleDistance","setScalarTexture","PRIORITY","REQUEST_TYPE","use16BitTexture","voiLutModule","getVOIFromMetadata","numImages","bytesPerImage","voxelsPerImage","bytePerPixel","scalingParametersToUse","byteOffset","imageScalarData","volumeBuffer","volumeBufferView","_getImageScalarDataFromImageVolume","getVOIFromMinMax","PT","_isCurrentImagePTPrescaled","handlePreScaledVolume","setMappingRange","setMapper","setIndependentComponents","voiModifiedEventDetail","VOI_MODIFIED","triggerVOIModified","volumeInputs","viewportIds","immediateRender","setVolumePromises","setVolumes","addVolumePromises","addVolumes","cameraEvent","sliceData","VOLUME_NEW_IMAGE","flipHorizontal","flipVertical","viewportStatus","NO_DATA","_suppressCameraModifiedEvents","hasPixelSpacing","sWidth","sHeight","_actors","isDisabled","useCustomRenderingPipeline","setRendered","LOADING","RENDERED","offscreenMultiRenderWindow","renderViewport","setOptions","immediate","displayArea","setDisplayArea","getDefaultImageData","viewRight","viewUpToSet","viewPlaneNormalToSet","middleIJK","centeredFocalPoint","resetFocalPoint","_getFocalPointForResetCamera","resetPan","resetToCenter","panDir","panValue","getPanDir","mirrorVec","panDirMirror","setCamera","getDefaultActor","getActorUIDByIndex","getActorByIndex","setActors","actors","removeAllActors","addActors","_removeActor","removeViewProp","removeActors","actorUIDs","resetCameraPanAndZoom","addActor","removeAllViewProps","resetCameraNoEvent","setCameraNoEvent","_getViewImageDataIntersections","edges","_getEdges","intersections","intersectionPoint","storeAsInitialCamera","fitToCanvasCamera","imageArea","imageCanvasPoint","areaX","areaY","zoom","getZoom","setZoom","imagePoint","canvasPoint","canvasX","canvasY","canvasPanX","canvasPanY","canvasZero","worldToCanvas","canvasEdge","canvasImage","imgWidth","imgHeight","imageX","imageY","deltaPoint2","setPan","DISPLAY_AREA_MODIFIED","getDisplayArea","resetZoom","previousCamera","computeVisiblePropBounds","activeCamera","getVtkActiveCamera","getViewPlaneNormal","getViewUp","widthWorld","heightWorld","_getWorldDistanceViewUpAndViewRight","canvasSize","boundsAspectRatio","canvasAspectRatio","w1","w2","w3","focalPointToSet","positionToSet","resetCameraClippingRange","clippingRangeToUse","modifiedCamera","setFitToCanvasCamera","setInitialCamera","RESET_CAMERA_EVENT","triggerCameraModifiedEventIfNecessary","initialCamera","getPan","getFocalPoint","zero3","initialCanvasFocal","currentCanvasFocal","pan","delta2","newFocal","initialParallelScale","_getFocalPointForViewPlaneReset","point_x","point_y","point_z","cameraInterface","updatedCamera","flipH","flipV","setViewUp","setDirectionOfProjection","setPosition","setFocalPoint","setParallelScale","setViewAngle","updateClippingPlanesForActors","getRotation","CAMERA_MODIFIED","vtkPlanes","setOrientationOfClippingPlanes","scaledDistance","newOrigin1","newOrigin2","viewUpCorners","_getCorners","viewRightCorners","minY","maxY","_shouldUseNativeDataType","oldCamera","oldFocalPoint","oldViewPlaneNormal","vectorFromOldFocalPointToCenteredFocalPoint","distanceFromOldFocalPointToCenteredFocalPoint","xMin","xMax","yMin","yMax","zMin","zMax","p2","p3","p4","p5","p6","p7","p8","inverted","voiRanges","VOILUTFunction","_FrameOfReferenceUID","canvasPos","setIsPerformingCoordinateTransformation","canvasPosWithDPR","displayCoord","worldCoord","canvasCoord","canvasCoordWithDPR","applicableVolumeActorInfo","_getApplicableVolumeActor","volumeIdToUse","setActiveCamera","ORTHOGRAPHIC","VOLUME_3D","setParallelProjection","PERSPECTIVE","initializeVolumeNewImageEventDispatcher","applyViewOrientation","_getOrientationVectors","setViewUpFrom","volumeNewImageHandlerBound","volumeNewImageCleanUpBound","evt","ELEMENT_DISABLED","resetVolumeNewImageState","resetVolumeViewportClippingRange","setVOILUTFunction","voiLUTFunction","setVOI","setColormap","colormapObj","applyColorMap","setOpacity","setInvert","_getOrCreateColorTransferFunction","invertStateChanged","newRGBTransferFunction","voiRangeToUse","SAMPLED_SIGMOID","setPreset","presetName","volumeInputArray","firstImageVolume","_isValidVolumeInputArray","_setVolumeActors","PRE_RENDER","VOLUME_VIEWPORT_NEW_VOLUME","setVisibility","removeVolumeActors","setOrientation","actorEntries","numVolumes","volumeInput","flipDirection","defaultActor","defaultActorUID","vtkImageData","Modality","volumeActorEntries","getIntensityFromWorld","voxelIndex","_useAcquisitionPlaneForViewPlane","spacingInNormal","ACQUISITION","_setViewPlaneToAcquisitionPlane","_getAcquisitionPlaneOrientation","filterActorUIDs","clipPlane1","clipPlane2","newVtkPlanes","addClippingPlane","setSlabThickness","currentCamera","resetProperties","_resetProperties","getMappingRange","customDisplayExtent","useCustomExtents","backgroundColor","vtkAbstractImageMapper$1","vtkAbstractImageMapper","doPicking","ijk","worldOrigin","worldNormal","intersect","intersectWithLine","intersection","absoluteIJK","staticOffsetAPI","CoincidentTopologyHelper","otherStaticMethods","computeClosestIJKAxis","inVec3","slicingMode","closestIJKAxis","maxAbs","axis","absValue","xyzLabel","ijkLabel","pos3","isFinite","ex","fp","setSlice","setXSlice","setSlicingMode","setYSlice","setZSlice","setISlice","setJSlice","setKSlice","getSlicingModeNormal","mat3","getBoundsForSlice","halfThickness","intersectWithLineForPointPicking","pickingData","intersectWithLineForCellPicking","absIJK","pCoords","renderToRectangle","sliceAtFocalPoint","implementCoincidentTopologyMethods","vtkImageMapper$1","colorWindow","colorLevel","useLookupTableScalarRange","piecewiseFunction","transferFunc","isInteger","setPiecewiseFunction","vtkImageProperty","vtkImageProperty$1","getImages","forceOpaque","forceTranslucent","isOpaque","hasTranslucentPolygonalGeometry","thickness","newBounds","getMinXBound","getMaxXBound","getMinYBound","getMaxYBound","getMinZBound","getMaxZBound","_time","getSupportsSelection","vtkImageSlice$1","getTransform","forceFitToWindow","oldCanvasWidth","oldCanvasHeight","setCanvasSize","imageWidth","imageHeight","wasFitToWindow","fitToWindow","relWidthChange","relHeightChange","relChange","relativeRescale","voiUpdatedWithSetProperties","initialInvert","stackInvalidated","_publishCalibratedEvent","useNativeDataType","_configureRenderingPipeline","_resizeCPU","_cpuFallbackEnabledElement","frameOfReferenceUID","csImage","createActorMapper","isComputedVOI","getRotationCPU","getRotationGPU","currentViewUp","initialViewUp","initialToCurrentViewUpAngle","initialToCurrentViewUpCross","_setCSImage","_updateToDisplayImageCPU","_updateActorToDisplayImageId","canvasToWorldCPU","px","py","canvasToPixel","worldToCanvasCPU","diff","worldPoint","pixelToCanvas","canvasToWorldGPU","worldToCanvasGPU","getTargetImageIdIndex","targetImageIdIndex","hasImageId","customRenderViewportToCanvas","cpuRenderingInvalidated","fillWithBackgroundColor","renderingPipelineFunctions","cpu","getImageDataCPU","getImageDataGPU","setColormapCPU","setColormapGPU","getCameraCPU","setCameraCPU","setVOICPU","setVOIGPU","setInterpolationTypeCPU","setInterpolationTypeGPU","setInvertColor","setInvertColorCPU","setInvertColorGPU","resetCameraCPU","resetCameraGPU","getCPUFallbackError","unsetColormap","unsetColormapCPU","unsetColormapGPU","_resetCPUFallbackElement","_resetGPUViewport","cameraFocalPointOnRender","initializeElementDisabledHandler","funcName","functions","setThicknessFromFocalPoint","setFreezeFocalPoint","elementDisabledHandler","debouncedTimeout","calibration","cpuImagePixelData","pixelCoord","buildMetadata","pixelRepresentation","bitsAllocated","bitsStored","highBit","photometricInterpretation","samplesPerPixel","imageIdScalingFactor","_addScalingToViewport","voiLUTFunctionEnum","_getValidVOILUTFunction","_getImagePlaneModule","calibrateIfNecessary","imagePixelModule","isUpdated","_calibrationEvent","setRotation","_getDefaultPTPrescaledVOIRange","_getVOIRangeForCurrentImage","_setPropertiesFromCache","rotationMatrix","canvasCenter","canvasCenterWorld","focalPointCanvas","focalPointPixel","prevFocalPointCanvas","prevFocalPointPixel","deltaPixel","viewportOrientation","cosA","sinA","newX","newY","correctShift","setFlipCPU","setRotationCPU","setRotationGPU","newVOILUTFunction","forceRecreateLUTFunction","roll","tfunc","wwToUse","wcToUse","imageActor","setUseLookupTableScalarRange","transferFunction","isSigmoidTFun","ptScaling","suvbwToSuvlbm","suvbwToSuvbsa","_getNumCompsFromPhotometricInterpretation","_getImageDataMetadata","rowCosineVec","colCosineVec","scanAxisNormal","xSpacing","ySpacing","xVoxels","yVoxels","_getCameraOrientation","imageDataDirection","_createVTKImageData","pixelArray","_imageData","setStack","_throwIfDestroyed","_setImageIdIndex","STACK_VIEWPORT_NEW_STACK","_checkVTKImageDataMatchesCornerstoneImage","isSameXSpacing","isSameYSpacing","_updateVTKImageDataFromCornerstoneImage","_updatePixelData","newPixelData","_loadAndDisplayImage","_loadAndDisplayImageCPU","_loadAndDisplayImageGPU","scalingParams","floatMinMax","intPixelData","rescaledPixel","STACK_NEW_IMAGE","IMAGE_LOAD_ERROR","PRE_STACK_NEW_IMAGE","csImgFrame","imageFrame","imgFrame","viewportSettingToUse","sameImageData","previousCameraProps","cameraProps","panCache","_restoreCameraProps","triggerCameraEvent","monochrome1","_getInitialVOIRange","triggerCalibrationEvent","_getVOIRangeFromWindowLevel","_getPTPreScaledRange","centerWorld","scroll","debounce","loop","currentTargetImageIdIndex","numberOfFrames","newTargetImageIdIndex","targetImageId","setImageIdIndex","eventData","newImageIdIndex","STACK_VIEWPORT_SCROLL","calibrateSpacing","prevScale","IMAGE_SPACING_CALIBRATED","method","fillCanvasWithBackgroundColor","actorProp","newImagePlaneModule","viewportTypeUsesCustomRenderingPipeline","viewportType","_needsRender","_animationFrameSet","_animationFrameHandle","renderFrameOfReference","viewportIdsWithSameFrameOfReferenceUID","_getViewportsAsArray","renderViewports","_renderFlaggedViewports","performVtkDrawCall","eventDetailArray","renderViewportUsingCustomOrVtkPipeline","offScreenCanvasContainer","_viewports","viewportInputEntry","viewportInput","_normalizeViewportInputEntry","viewportUsesCustomRenderingPipeline","addCustomViewport","enableVTKjsDrivenViewport","_resetViewport","_removeViewport","_clearAnimationFrame","setViewports","publicViewportInputEntries","viewportInputEntries","_normalizeViewportInputEntries","_reset","vtkDrivenViewportInputEntries","customRenderingViewportInputEntries","vpie","setVtkjsDrivenViewports","setCustomViewports","keepCamera","vtkDrivenViewports","customRenderingViewports","_resizeVTKViewports","_resizeUsingCustomResizeHandler","_setViewportsToBeRenderedNextFrame","AXIAL","normalizedViewportInputs","prevCamera","canvasesDrivenByVtkJs","offScreenCanvasWidth","offScreenCanvasHeight","_resizeOffScreenCanvas","_resize","rect","viewportsDrivenByVtkJs","xOffset","internalViewportEntry","addVtkjsDrivenViewport","offscreenCanvasProperties","tabIndex","sxStartDisplayCoords","syStartDisplayCoords","sxEndDisplayCoords","syEndDisplayCoords","_getViewportCoordsOnOffScreenCanvas","ELEMENT_ENABLED","vtkDrivenCanvases","vtkDrivenViewportInputEntry","_xOffset","_render","getRenderWindow","setDraw","offScreenCanvas","_renderViewportFromVtkCanvasToOnscreenCanvas","dWidth","dHeight","removeAttribute","clearRect","_downloadOffScreenCanvas","uri","download","href","click","_TEMPDownloadURI","_debugRender","dataURL","imageRetrievalPoolManager","DEFAULT_SETTINGS","RUNTIME_SETTINGS","OBJECT_SETTINGS_MAP","DICTIONARY","Settings","dictionary","seal","unset","endsWith","deleteCount","namespace","deleteAll","iterate","import","root","isPlainObject","dump","deepSet","assert","subject","getRuntimeSettings","getDefaultSettings","subfield","defaultSettings","settingObj","setting","runtimeSettings","getObjectSettings","settings","objectSettingsMap","WeakMap","extendRuntimeSettings","references","isValidKey","prefix","record","failCount","field","setAll","WeakSet","getPrototypeOf","subKey","subContext","subContextValue","domain","bimap","d0","d1","r0","r1","polymap","reverse","untransform","unknown","piecewise","rescale","clamper","rangeRound","formatDecimalParts","toExponential","coefficient","prefixExponent","specifier","exec","FormatSpecifier","align","zero","comma","trim","exponent","toLocaleString","toPrecision","formatRounded","toUpperCase","formatPrefix","prefixes","locale","grouping","thousands","currencyPrefix","currency","currencySuffix","decimal","numerals","formatNumerals","String","percent","minus","nan","newFormat","formatTypes","suffix","formatType","maybeSuffix","valuePrefix","valueSuffix","valueNegative","formatTrim","padding","tickFormat","step","precisionPrefix","precisionRound","precisionFixed","linear","ticks","nice","prestep","maxIter","t0","t1","timeInterval","floori","offseti","interval","date","setTime","millisecond","durationSecond","durationMinute","durationHour","durationDay","durationWeek","durationMonth","durationYear","second","getMilliseconds","getUTCSeconds","getSeconds","getMinutes","setUTCSeconds","getUTCMinutes","getHours","setUTCMinutes","getUTCHours","setHours","setDate","getDate","getTimezoneOffset","setUTCHours","setUTCDate","getUTCDate","unixDay","timeWeekday","getDay","timeSunday","timeMonday","timeTuesday","timeWednesday","timeThursday","timeFriday","timeSaturday","utcWeekday","getUTCDay","utcSunday","utcMonday","utcTuesday","utcWednesday","utcThursday","utcFriday","utcSaturday","setMonth","getMonth","getFullYear","setUTCMonth","getUTCMonth","getUTCFullYear","setFullYear","setUTCFullYear","ticker","year","month","week","day","hour","minute","tickIntervals","tickInterval","localDate","H","M","S","L","utcDate","UTC","newDate","utcParse","pads","numberRe","percentRe","requoteRe","pad","string","requote","formatRe","formatLookup","parseWeekdayNumberSunday","parseWeekdayNumberMonday","parseWeekNumberSunday","U","parseWeekNumberISO","V","parseWeekNumberMonday","W","parseFullYear","parseYear","parseZone","parseQuarter","q","parseMonthNumber","parseDayOfMonth","parseDayOfYear","parseHour24","parseMinutes","parseSeconds","parseMilliseconds","parseMicroseconds","parseLiteralPercent","parseUnixTimestamp","Q","parseUnixTimestampSeconds","formatDayOfMonth","formatHour24","formatHour12","formatDayOfYear","formatMilliseconds","formatMicroseconds","formatMonthNumber","formatMinutes","formatSeconds","formatWeekdayNumberMonday","formatWeekNumberSunday","dISO","formatWeekNumberISO","formatWeekdayNumberSunday","formatWeekNumberMonday","formatYear","formatYearISO","formatFullYear","formatFullYearISO","formatZone","formatUTCDayOfMonth","formatUTCHour24","formatUTCHour12","formatUTCDayOfYear","formatUTCMilliseconds","getUTCMilliseconds","formatUTCMicroseconds","formatUTCMonthNumber","formatUTCMinutes","formatUTCSeconds","formatUTCWeekdayNumberMonday","dow","formatUTCWeekNumberSunday","UTCdISO","formatUTCWeekNumberISO","formatUTCWeekdayNumberSunday","formatUTCWeekNumberMonday","formatUTCYear","formatUTCYearISO","formatUTCFullYear","formatUTCFullYearISO","formatUTCZone","formatLiteralPercent","formatUnixTimestamp","formatUnixTimestampSeconds","definition","locale_dateTime","dateTime","locale_date","locale_time","locale_periods","periods","locale_weekdays","days","locale_shortWeekdays","shortDays","locale_months","months","locale_shortMonths","shortMonths","periodRe","periodLookup","weekdayRe","weekdayLookup","shortWeekdayRe","shortWeekdayLookup","monthRe","monthLookup","shortMonthRe","shortMonthLookup","formats","utcFormats","parses","parseSpecifier","newParse","utcFormat","formatLocale","isoSpecifier","toISOString","faceNormals","faceEdges","edgePoints","edgeAxes","faceAxes","ptv3","pt2v3","tmpv3","tmp2v3","xDir","yDir","invmat","applyTextStyle","strokeStyle","strokeColor","strokeSize","fontColor","font","fontStyle","fontSize","fontFamily","newCubeAxesActorHelper","tmPolyData","tmMapper","tmActor","parentProp","lastRedrawTime","lastRebuildTime","lastSize","lastTickBounds","addTexture","getTmTexture","setProperty","setParentProp","createPolyDataForOneLabel","text","cmat","get_tmAtlas","getTextPolyData","cellIdx","updateTexturePolyData","getCompositeProjectionMatrix","lastAspectRatio","numLabels","getTextValues","numTris","textIdx","axisIdx","textValues","getAxisTitlePixelOffset","getTickCounts","getTickLabelPixelOffset","tcoordDA","setTCoords","updateAPISpecificData","vtkCubeAxesActorHelper","boundsScaleFactor","dataBounds","INIT_BOUNDS","faceVisibilityAngle","gridLines","axisLabels","axisTitlePixelOffset","axisTextStyle","tickLabelPixelOffset","tickTextStyle","defaultValues","lastFacesToDraw","tickCounts","tmCanvas","tmContext","_tmAtlas","tmTexture","setInterpolate","gridMapper","polyData","gridActor","textPolyData","cameraModifiedSub","computeFacesToDraw","faceDot","drawit","faceAxis","otherAxis1","otherAxis2","updatePolyData","facesToDraw","edgesToDraw","numLines","numEdgesToDraw","lineIdx","_e","_f","faceIdx","aticks","_t","updateTextData","tickStrings","textPointCount","textPoints","axisCount","_e2","edgeIdx","edgeAxis","ptIdx1","atickStrings","facesChanged","boundsChanged","updateTextureAtlas","textBaseline","textAlign","maxWidth","totalHeight","metrics","measureText","actualBoundingBoxAscent","startingHeight","textStyle","_metrics","fillText","setCanvas","setTickTextStyle","tickStyle","setAxisTextStyle","axisStyle","_setProp","vtkCubeAxesActor","vtkCubeAxesActor$1","CubeAxesActorHelper","getTmActor","getGridActor","vtkOpenGLCubeAxesActor","ColorMode","GetArray","lookupTable","scalarVisibility","scalarRange","colorMode","arrayAccessMode","renderTime","colorByArrayName","transformCoordinate","viewSpecificProperties","customShaderAttributes","createDefaultLookupTable","getColorModeAsString","setColorModeToDefault","setColorMode","setColorModeToMapScalars","setColorModeToDirectScalars","getScalarModeAsString","setScalarModeToDefault","setScalarMode","setScalarModeToUsePointData","setScalarModeToUseCellData","setScalarModeToUsePointFieldData","setScalarModeToUseCellFieldData","setScalarModeToUseFieldData","getAbstractScalars","arrayId","cellFLag","cellFlag","DEFAULT","USE_POINT_DATA","BY_ID","getArrayByIndex","cd","fd","getFieldData","getLookupTable","colorBuildString","colorMapColors","fieldDataTupleId","vtkMapper2D","vtkMapper2D$1","vtkPolyData2DFS","vtkPolyData2DVS","DisplayLocation","BACKGROUND","FOREGROUND","openGLActor2D","getTransformCoordinate","getViews","setNumberOfPoints","getPoint","getComputedDoubleViewportValue","setPoint","haveCellSCalars","actorPos","getActualPositionCoordinate","tileViewport","visVP","winSize","xoff","yoff","bottom","getDisplayLocation","vtkOpenGLPolyDataMapper2D","VectorMode","defaultAutoLayout","helper","getLastSize","xAxisAdjust","yAxisAdjust","minAdjust","getAxisTextStyle","getTickTextStyle","getLastAspectRatio","textSizes","setTopTitle","boxSize","getBoxSizeByReference","setTickLabelPixelOffset","titleWidth","tickWidth","setAxisTitlePixelOffset","setBoxPosition","titleHeight","getTicks","recomputeBarSegments","defaultGenerateTicks","publicApi","getLastTickBounds","setTicks","setTickStrings","newScalarBarActorHelper","barMapper","setInterpolateScalarsBeforeMapping","barActor","barPosition","barSize","boxPosition","setCoordinateSystemToDisplay","generateTicks","scalarsToColors","getScalarsToColors","setLookupTable","getGenerateTicks","getAutomated","getAutoLayout","getBarPosition","getBarSize","getBoxPosition","getBoxSize","updatePolyDataForLabels","updatePolyDataForBarSegments","newTmAtlas","getAxisLabel","tickHeight","strings","getTickStrings","computeBarSize","vertical","segSize","topTitle","_tickWidth","_titleHeight","_model$renderable$get3","_model$renderable$get4","barSegments","startPos","barAxis","segSpace","pushSeg","title","getDrawNanAnnotation","getNanColor","getDrawBelowRangeSwatch","getUseBelowRangeColor","haveAbove","getUseAboveRangeColor","oldSegSize","getDrawAboveRangeSwatch","alignment","textSize","textAxes","offsetAxis","spacedAxis","tickOffsets","tickSeg","tickSegmentStart","tickSegmentSize","tickPos","_scalarsToColors$getU","_scalarsToColors$getU2","numberOfExtraColors","numQuads","getVectorMode","COMPONENT","getVectorComponent","scalarsDA","vtkScalarBarActorHelper","automated","autoLayout","axisLabel","scalarToColors","drawNanAnnotation","drawBelowRangeSwatch","drawAboveRangeSwatch","resetAutoLayoutToDefault","setAutoLayout","resetGenerateTicksToDefault","setGenerateTicks","vtkScalarBarActor","vtkScalarBarActor$1","scalarBarActorHelper","getBarActor","vtkOpenGLScalarBarActor","WORLD","vtkWebGPUActor","vtkWebGPUActor2D","vtkWebGPUCubeAxesActor","displayLocation","setDisplayLocationToBackground","setDisplayLocation","setDisplayLocationToForeground","setRepresentationToWireframe","setRepresentation","setRepresentationToSurface","setRepresentationToPoints","getRepresentationAsString","vtkProperty2D","vtkProperty2D$1","isEdges","is2D","textures","initiaLalues","_tmpMat3","_tmpMat4","WebGPUActor","forceZValue","coordinateSystem","useRendererMatrix","_ppty$getEdgeColorByR","_aColor","_aColor2","getRoughness","getBaseIOR","getMetallic","getNormalStrength","getEmission","getNormalTexture","_renderer$getEnvironm","lightingCode","_fDesc","_code","_actor$getProperty$ge","_actor$getProperty","_actor$getProperty$ge2","_actor$getProperty$ge4","_actor$getProperty3","_actor$getProperty$ge5","_actor$getProperty$ge6","_actor$getProperty4","_actor$getProperty$ge7","_actor$getProperty$ge8","_actor$getProperty5","_actor$getProperty$ge9","_actor$getProperty$ge10","_actor$getProperty6","_actor$getProperty$ge11","_actor$getProperty$ge12","_actor$getProperty7","_actor$getProperty$ge13","_actor$getProperty$ge3","_actor$getProperty2","checkDims","getDimensionality","usedTextures","getDiffuseTexture","getRoughnessTexture","getMetallicTexture","getAmbientOcclusionTexture","getEmissionTexture","replaceShaderSelect","getUsage","getHashFromUsage","getTopologyFromUsage","buildVertexInput","_buffRequest","_usesCellNormals","_buffRequest2","_buff","_buff2","haveColors","_buffRequest3","_buff3","_buff4","updateTextures","_model$renderable2","_actor$getProperty$ge14","_actor$getProperty8","_actor$getProperty$ge15","_actor$getProperty9","_actor$getProperty$ge16","_actor$getProperty10","_actor$getProperty$ge17","_actor$getProperty11","_actor$getProperty$ge18","_actor$getProperty12","_actor$getProperty$ge19","_actor$getProperty13","_renderer$getEnvironm2","newTextures","idata","pair","_pair","_pair2","_pair3","_pair4","_pair5","_pair6","_pair7","_pair8","srcTexture","textureName","addressMode","getEdgeClamp","setNumberOfVertices","getSizeInBytes","vtkWebGPUCellArrayMapper","vtkWebGPUCellArrayMapper$1","createCellArrayMapper","updateCellArrayMappers","prims","cellMappers","cellMapper","setCellArray","setCurrentInput","setCellOffset","_cellMapper","getCellOffset","vtkWebGPUPolyDataMapper","setIs2D","vtkWebGPUPolyDataMapper2D","vtkWebGPUScalarBarActor","viewDimension","dimension","textureHandle","tDetails","createFromTextureHandle","ttype","newSamp","setSampler","vtkWebGPUTextureView","vtkWebGPUTextureView$1","ready","mipLevel","GPUTextureUsage","TEXTURE_BINDING","mipLevelCount","assignFromHandle","writeImageData","copyExternalImageToTexture","flipY","premultipliedAlpha","jsImageData","bufferBytesPerRow","fixAll","inWidthInBytes","inArray","inWidth","outBytesPerElement","outWidthInBytes","outWidth","cmdEnc","mips","generateMipmaps","currentWidth","currentHeight","fix","copyBufferToTexture","bytesPerRow","rowsPerImage","submitCommandEncoder","_fix","resizeToMatch","getDepth","vtkWebGPUTexture","segmentIndex","_getSizeInBytes","getFlatPointsArray","ContourSet","contours","_createEachContour","contourDataArray","contourData","contour","_updateContourSetCentroid","getTotalNumberOfPoints","flatPointsArray","sumOfPoints","acc","centroid","closestPoint","_getDistance","getCentroid","getSegmentIndex","getContours","getNumberOfContours","getNumberOfPointsArray","getNumberOfPointsInAContour","getPointsInContour","contourIndex","pointA","pointB","createAndCacheGeometry","CONTOUR","contourSetData","contourSet","_createContourSet","geometryData","extractCellSizes","currentIdx","STATIC","empty","recompute","numberOfCells","cellSizes","getCellSizes","requestedNumTuples","oldNumTuples","getNumberOfTuples","newNumTuples","typedArray","getCell","cellLoc","insertNextCell","cellPointIds","insertNextTuples","vtkCellArray","vtkCellArray$1","fastComputeRange","computeRange","component","numberOfValues","nextJ","ensureRangeSize","rangeArray","ranges","createRangeHelper","sum","mean","getMaxNorm","normArray","maxNorm","tuple","getTuple","norm$1","rangeTuple","_model$size","TypeError","curNumTuples","oldValues","dataChange","newSize","getElementComponentSize","getComponent","tupleIdx","compIdx","setComponent","getValue","valueIdx","componentIndex","rangeIdx","rangeValue","setTuple","setTuples","tuples","insertTuple","insertTuples","insertNextTuple","tupleToFill","getTuples","fromId","toId","to","getTupleLocation","newClone","getState","jsonArchive","vtkClass","sortedObj","deepCopy","other","interpolateTuple","source1","source1Idx","source2","source2Idx","tuple1","tuple2","vtkDataArray","vtkDataArray$1","DataTypeByteSize","CHAR","SIGNED_CHAR","DefaultDataType","BELOW_RANGE_COLOR_INDEX","ABOVE_RANGE_COLOR_INDEX","NAN_COLOR_INDEX","hueRange","saturationRange","valueRange","alphaRange","nanColor","belowRangeColor","aboveRangeColor","useAboveRangeColor","useBelowRangeColor","buildTime","opaqueFlagBuildTime","insertTime","opaque","opaqueFlag","usingLogScale","getNumberOfAvailableColors","linearIndexLookup","linearLookup","indexedLookupFunction","getAnnotatedValueIndexInternal","lookupShiftAndScale","mapScalarsThroughTable","outFormat","inputOffset","lookupFunc","indexedLookup","trange","inIncr","outputV","inputV","cptr","_cptr","forceBuild","setTable","tptr","vtkLookupTable","vtkLookupTable$1","IDENTITY","IDENTITY_3X3","EPSILON","VTK_SMALL_NUMBER","randomSeedValue","VTK_MAX_ROTATIONS","notImplemented","swapRowsMatrix_nxn","swapColumnsMatrix_nxn","column1","column2","createArray","Pi","radiansFromDegrees","deg","degreesFromRadians","arrayMin","arrayMax","arrayRange","ceilLog2","factorial","nearestPowerOfTwo","xi","isPowerOfTwo","binomial","beginCombination","nextCombination","randomSeed","seed","global","getSeed","gaussian","subtract","multiplyScalar","vec","multiplyScalar2D","multiplyAccumulate","multiplyAccumulate2D","outer","out_3x3","cross","Zx","Zy","Zz","norm","den","perpendiculars","theta","z2","sintheta","costheta","projectVector","projection","bSquared","dot2D","projectVector2D","distance2BetweenPoints","angleBetweenVectors","crossVect","gaussianAmplitude","variance","distanceFromMean","exp","gaussianWeight","outer2D","out_2x2","norm2D","x2D","normalize2D","determinant2x2","LUFactor3x3","mat_3x3","index_3","maxI","largest","LUSolve3x3","x_3","linearSolve3x3","y_3","c1","c2","c3","d2","d3","e3","f1","f2","f3","det","v3","multiply3x3_vect3","in_3","out_3","multiply3x3_mat3","a_3x3","b_3x3","copyA","copyB","multiplyMatrix","rowA","colA","rowB","colB","out_rowXcol","transpose3x3","in_3x3","outT_3x3","invert3x3","outI_3x3","determinant3x3","areEquals","eps","areMatricesEqual","identity3x3","isIdentity","isIdentity3x3","quaternionToMatrix3x3","quat_4","wx","wy","wz","zz","xy","xz","yz","rr","roundNumber","digits","sig","roundVector","jacobiN","iq","ip","numPos","tresh","tau","vtkROTATE","aa","ii","jj","ceil_half_n","matrix3x3ToQuaternion","eigenvectors","multiplyQuaternion","quat_1","quat_2","quat_out","xw","yw","yx","zw","zx","zy","orthogonalize3x3","x3","y3","quat","diagonalize3x3","w_3","v_3x3","maxVal","vectTmp1","vectTmp2","eigenValTmp","_eigenValTmp","singularValueDecomposition3x3","u_3x3","vT_3x3","luFactorLinearSystem","temp1","luSolveLinearSystem","solveLinearSystem","invertMatrix","AI","column","tmp1Size","tmp2Size","estimateMatrixCondition","jacobi","solveHomogeneousLeastSquares","numberOfSamples","xt","xOrder","XXt","eigenvals","eigenvecs","solveLeastSquares","yt","yOrder","checkHomogeneous","hmt","homogenFlags","allHomogeneous","homogRC","someHomogeneous","XXtI","XYt","successFlag","hex2float","hexStr","outFloatArray","substr","rgb2hsv","_rgb","onesixth","cmax","cmin","hsv2rgb","_hsv","onethird","twothird","fivesixth","lab2xyz","lab","xyz","_lab","var_Y","var_X","var_Z","xyz2lab","_xyz","xyz2rgb","_xyz2","rgb2xyz","_rgb2","rgb2lab","lab2rgb","uninitializeBounds","areBoundsInitialized","computeBoundsFromPoints","point1","point2","clampValue","clampVector","minVector","maxVector","clampAndNormalizeValue","getScalarTypeFittingRange","getAdjustedScalarRange","extentIsWithinOtherExtent","extent1","extent2","boundsIsWithinOtherBounds","bounds1_6","bounds2_6","delta_3","pointIsWithinBounds","point_3","bounds_6","solve3PointCircle","v21","v32","v13","v12","v23","v31","norm12","norm23","norm13","crossv21v32","normCross","normCross22","beta","inf","negInf","isInf","isNan","createUninitializedBounds","getMajorAxisIndex","axisIndex","floatToHex2","integer","floatRGB2HexCode","rgbArray","floatToChar","float2CssRGBA","vtkMath","NoOp","useDegree","angleConv","originDirection","targetDirection","dst","transf","cosAlpha","acos","sz","mat4x4","mat3x3","nbIterations","vtkMatrixBuilder","buildFromRadian","INVALID_BOUNDS","nbPoints","setNumberOfComponents","insertNextPoint","_xRange","_yRange","zRange","xRange","yRange","vtkPoints","vtkPoints$1","ScalarMappingTarget","intColorToUChar","floatColorToUChar","vectorComponent","vectorSize","vectorMode","mappingRange","annotationArray","annotatedValueMap","setVectorModeToMagnitude","setVectorMode","MAGNITUDE","setVectorModeToComponent","setVectorModeToRGBColors","RGBCOLORS","setAnnotations","annotations","annotation","updateAnnotatedValueMap","setAnnotation","checkForAnnotatedValue","getNumberOfAnnotatedValues","getAnnotatedValue","getAnnotation","getAnnotatedValueIndex","removeAnnotation","needToRemove","resetAnnotations","getAnnotationColor","getIndexedColor","na","componentIn","newColors","DIRECT_SCALARS","convertToRGBA","newscalars","mapVectorsThroughTable","mapVectorsToMagnitude","compsToUse","outputFormat","vectorComponentIn","vectorSizeIn","inComponents","getVectorSize","magValues","luminanceToRGBA","convtFun","newValues","l","luminanceAlphaToRGBA","rGBToRGBA","rGBAToRGBA","numTuples","areScalarsOpaque","vtkScalarsToColors","vtkScalarsToColors$1","_equals","_isValid","_setBounds","otherBounds","_addPoint","_bounds","_addPoints","_addBounds","_bounds2","_xMin","_xMax","_yMin","_yMax","_zMin","_zMax","_setMinPoint","_bounds3","_setMaxPoint","_bounds4","_inflate","_scale","_getCenter","_getLength","_getLengths","_getXRange","_getYRange","_getZRange","_getMaxLength","_getDiagonalLength","_getMinPoint","_getMaxPoint","oppositeSign","_computeCornerPoints","_transformBounds","_computeScale","scale3","_computeLocalBounds","du","dv","dw","_intersectBox","coord","inside","quadrant","whichPlane","maxT","candidatePlane","_intersectPlane","firstOne","evaluate","_intersect","bBounds","_intersects","_containsPoint","_cutWithPlane","ti","BoundingBox","refBounds","vtkBoundingBox","equals","isValid","setBounds","addPoints","addBounds","setMinPoint","setMaxPoint","inflate","scaleAboutCenter","getCenter","getLengths","getMaxLength","getDiagonalLength","getMinPoint","getMaxPoint","getXRange","getYRange","getZRange","getCorners","computeCornerPoints","computeLocalBounds","transformBounds","computeScale3","cutWithPlane","intersectBox","intersectPlane","intersects","containsPoint","arrays","copyFieldFlags","doCopyAllOn","doCopyAllOff","superGetState","item","vtk","initializeFields","copyAllOn","clearFieldFlags","copyStructure","getCopyFieldFlags","getNumberOfArrays","getNumberOfActiveArrays","_publicAPI$getArrayWi","getArrayWithIndex","removeAllArrays","removeArray","removeArrayByIndex","arrayIdx","getArrays","arraySpec","getArrayName","getFlag","passData","copyFlag","destArr","_tId","getAttributes","attrType","ncomps","tId","interpolateData","fromId1","fromId2","_tId2","copyFieldOn","copyFieldOff","copyAllOff","arrNew","copyFlags","vtkFieldData","vtkFieldData$1","AttributeTypes","AttributeCopyOperations","activeScalars","activeVectors","activeTensors","activeNormals","activeTCoords","activeGlobalIds","activePedigreeIds","attrTypes","cleanAttributeType","attType","cleanAttType","ee","checkNumberOfComponents","uncleanAttType","currentAttribute","setActiveAttributeByName","setActiveAttributeByIndex","getActiveAttribute","activeVal","da","copyAttributeFlags","PASSDATA","initializeAttributeCopyFlags","op","attCopyOp","ty","COPYTUPLE","INTERPOLATE","dataArrays","ref","superShallowCopy","debug","vtkDataSetAttributes","vtkDataSetAttributes$1","FieldDataTypes","DATA_OBJECT_FIELD","COORDINATE","POINT_DATA","POINT_FIELD_DATA","CELL_FIELD_DATA","VERTEX_FIELD_DATA","EDGE_FIELD_DATA","ROW_DATA","FIELD_ASSOCIATION_NONE","FIELD_ASSOCIATION_POINTS_THEN_CELLS","FIELD_ASSOCIATION_VERTICES","FIELD_ASSOCIATION_EDGES","FIELD_ASSOCIATION_ROWS","NUMBER_OF_ASSOCIATIONS","DATASET_FIELDS","fieldName","vtkDataSet","vtkDataSet$1","DesiredOutputPrecision","SINGLE","ALLCOPY","AttributeLimitTypes","MAX","EXACT","NOLIMIT","SCALARS","VECTORS","NORMALS","TCOORDS","TENSORS","EDGEFLAG","NUM_ATTRIBUTES","CellGhostTypes","DUPLICATECELL","HIGHCONNECTIVITYCELL","LOWCONNECTIVITYCELL","REFINEDCELL","EXTERIORCELL","HIDDENCELL","PointGhostTypes","DUPLICATEPOINT","HIDDENPOINT","ghostArrayName","StructuredType","UNCHANGED","SINGLE_POINT","X_LINE","Y_LINE","Z_LINE","XY_PLANE","YZ_PLANE","XZ_PLANE","XYZ_GRID","EMPTY","vtkStructuredData","getDataDescriptionFromExtent","inExt","dataDim","dataDescription","setExtent","inExtent","extentArray","changeDetected","nCells","computeTransforms","ain","aout","worldToIndexVec3","indexToWorldBounds","bin","bout","worldToIndexBounds","computeHistogram","worldBounds","voxelFunc","yStride","zStride","maximum","sumOfSquares","isum","inum","pixel","average","sigma","computeIncrements","increments","incr","computeOffsetIndex","getOffsetIndexFromWorld","getScalarValueFromWorld","offsetIndex","vtkImageData$1","clamping","allowDuplicateScalars","nodes","prevValue","functionType","getDataPointer","function","getFirstNonZeroValue","allZero","midpoint","sharpness","oldX","sortAndUpdateRange","removePoint","node","setNodes","updateRange","oldRange","retVal","modifiedInvoked","adjustRange","functionRange","estimateMinNumberOfSamples","findMinimumXDistance","currentDist","xStart","xEnd","numNodes","tidx","ss","sss","h1","h2","h3","h4","vtkPiecewiseFunction","vtkPiecewiseFunction$1","PLANE_TOLERANCE","COINCIDE","DISJOINT","distanceToPlane","projectPoint","xproj","xo","vproj","n2","generalizedProjectPoint","outObj","betweenPoints","p21","p1Origin","intersectWithPlane","plane1Origin","plane1Normal","plane2Origin","plane2Normal","l0","l1","cross$1","maxc","absCross","iP","evaluateGradient","planeOrigin","vtkPlane","vtkPlane$1","pointsIds","pointIdsList","triangleData","pointId","pointOffset","trianglePointOffset","getLength2","getParametricDistance","pcoords","pDist","pDistMax","getCellDimension","tol","subId","evaluatePosition","dist2","weights","vtkCell","vtkCell$1","maxId","buildLinks","numCells","linkLoc","getCellPoints","cellPointId","incrementLinkCount","allocateLinks","_cellId","insertCellReference","_cellId2","getPointsIds","_loop2","_cellId3","numLinks","ncells","getLink","getNcells","getCells","insertNextCellReference","deletePoint","removeCellReference","addCellReference","resizeCellList","squeeze","vtkCellLinks","vtkCellLinks$1","CellType","VTK_EMPTY_CELL","VTK_VERTEX","VTK_POLY_VERTEX","VTK_LINE","VTK_POLY_LINE","VTK_TRIANGLE","VTK_TRIANGLE_STRIP","VTK_POLYGON","VTK_PIXEL","VTK_QUAD","VTK_TETRA","VTK_VOXEL","VTK_HEXAHEDRON","VTK_WEDGE","VTK_PYRAMID","VTK_PENTAGONAL_PRISM","VTK_HEXAGONAL_PRISM","VTK_QUADRATIC_EDGE","VTK_QUADRATIC_TRIANGLE","VTK_QUADRATIC_QUAD","VTK_QUADRATIC_POLYGON","VTK_QUADRATIC_TETRA","VTK_QUADRATIC_HEXAHEDRON","VTK_QUADRATIC_WEDGE","VTK_QUADRATIC_PYRAMID","VTK_BIQUADRATIC_QUAD","VTK_TRIQUADRATIC_HEXAHEDRON","VTK_QUADRATIC_LINEAR_QUAD","VTK_QUADRATIC_LINEAR_WEDGE","VTK_BIQUADRATIC_QUADRATIC_WEDGE","VTK_BIQUADRATIC_QUADRATIC_HEXAHEDRON","VTK_BIQUADRATIC_TRIANGLE","VTK_CUBIC_LINE","VTK_CONVEX_POINT_SET","VTK_POLYHEDRON","VTK_PARAMETRIC_CURVE","VTK_PARAMETRIC_SURFACE","VTK_PARAMETRIC_TRI_SURFACE","VTK_PARAMETRIC_QUAD_SURFACE","VTK_PARAMETRIC_TETRA_REGION","VTK_PARAMETRIC_HEX_REGION","VTK_HIGHER_ORDER_EDGE","VTK_HIGHER_ORDER_TRIANGLE","VTK_HIGHER_ORDER_QUAD","VTK_HIGHER_ORDER_POLYGON","VTK_HIGHER_ORDER_TETRAHEDRON","VTK_HIGHER_ORDER_WEDGE","VTK_HIGHER_ORDER_PYRAMID","VTK_HIGHER_ORDER_HEXAHEDRON","VTK_LAGRANGE_CURVE","VTK_LAGRANGE_TRIANGLE","VTK_LAGRANGE_QUADRILATERAL","VTK_LAGRANGE_TETRAHEDRON","VTK_LAGRANGE_HEXAHEDRON","VTK_LAGRANGE_WEDGE","VTK_LAGRANGE_PYRAMID","VTK_NUMBER_OF_CELL_TYPES","CellTypesStrings","getClassNameFromTypeId","typeId","getTypeIdFromClassName","cellTypeString","isLinear","hasSubCells","cellType","typeArray","locationArray","insertCell","setCellTypes","cellTypes","cellLocations","getCellLocation","deleteCell","getNumberOfTypes","isType","numTypes","getCellType","insertNextType","getExtend","getTypeArray","getLocationArray","getMaxId","vtkCellTypes","vtkCellTypes$1","IntersectionState","NO_INTERSECTION","YES_INTERSECTION","ON_LINE","distanceToLine","MIN_VALUE","denom","b1a1","minDist","l2","uv1","uv2","projXYZ","outDistance","evaluateLocation","vtkLine","vtkLine$1","vtkPointSet","vtkPointSet$1","computeNormalDirection","ax","ay","az","bx","by","bz","computeNormal","intersectWithTriangle","q1","q2","r2","coplanar","pt1","pt2","surfaceId","n1","s1","s2","dist1","pts1","pts2","n1n2","tt1","tt2","index1","index2","t2","ts1","ts2","id1","id2","val1","t12","t22","t11","t21","tol2","pt3","evaluation","dist2Pt1Pt2","dist2Pt2Pt3","dist2Pt3Pt1","intersectLine","pt3Pt1","pt3Pt2","pt3X","fabsn","dist2Point","dist2Line1","dist2Line2","rhs","indices","closestPoint1","closestPoint2","maxComponent","lineDistance","_lineDistance","_lineDistance2","u3","pc","vtkTriangle","_CELL_FACTORY","vtkTriangle$1","POLYDATA_FIELDS","CELL_FACTORY","letter","buildCells","nVerts","getNumberOfVerts","nLines","getNumberOfLines","nPolys","getNumberOfPolys","nStrips","getNumberOfStrips","pTypes","locs","pLocs","nextCellPts","verts","numCellPts","_nextCellPts","_nextCellPts2","_nextCellPts3","initialSize","links","getPointCells","getCellEdgeNeighbors","link1","link2","cellHint","cellInfo","vtkPolyData","vtkPolyData$1","xLength","yLength","zLength","rotations","pointType","generate3DTextureCoordinates","boundsArray","_vtkMatrixBuilder$bui","normalArray","textureCoords","tc","_k2","rotateX","rotateY","rotateZ","numberOfPolys","polyIndex","vtkCubeSource","vtkCubeSource$1","clippingPlanes","vtkAbstractMapper$1","removeAllClippingPlanes","removeClippingPlane","clippingPlane","setClippingPlanes","planes","nbPlanes","propMatrix","hnormal","v4","vtkAbstractMapper","vtkAbstractMapper3D$1","vtkAbstractMapper3D","isTranslucent","backfaceProperty","pixelOffsets","vtkActor$1","directionOfProjection","screenBottomLeft","screenBottomRight","screenTopRight","freezeFocalPoint","viewMatrix","cameraLightTransform","physicalViewUp","physicalViewNorth","dopbasis","upbasis","tmpMatrix2","tmpvec2","tmpvec3","rotateMatrix","computeViewPlaneNormal","orthogonalizeViewUp","vt","computeDistance","setDistance","dolly","amount","up","viewUpVec4","viewDir","azimuth","yaw","elevation","pitch","applyTransform","transformMat4","vuOld","posNew","fpNew","vuNew","getThickness","setThickness","setRoll","getRoll","setObliqueAngles","getOrientation","getOrientationWXYZ","getFrustumPlanes","getCameraLightTransformMatrix","computeCameraLightTransform","sourceCamera","physicalOrientationToWorldDirection","ori","oriq","coriq","qdir","getPhysicalToWorldMatrix","getWorldToPhysicalMatrix","physVRight","computeViewParametersFromViewMatrix","vmat","oldDist","setViewMatrix","vMat","pMat","setDeviceAngles","rotmat","vup","setOrientationWXYZ","degrees","quatMat","newdop","newvup","computeClippingRange","vtkCamera$1","HSV","LAB","DIVERGING","LOG10","vtkColorTransferFunctionLabToMsh","msh","vtkColorTransferFunctionAdjustHue","unsatM","hueSpin","vtkColorTransferFunctionInterpolateDiverging","rgb1","rgb2","lab1","lab2","msh1","msh2","localS","adiff","vtkColorTransferFunctionAngleDiff","Mmid","mshTmp","labTmp","vtkColorTransferFunctionMshToLab","colorSpace","hSVWrap","tableSize","discretize","addRGBPointLong","addHSVPoint","addHSVPointLong","before","after","movePoint","addRGBSegment","g1","g2","addHSVSegment","hsv1","hsv2","nodeVal","getRedValue","getGreenValue","getBlueValue","xStart_","xEnd_","lastR","lastG","lastB","tmpVec","logStart","logEnd","logX","deltaRange","xn","discretizeIndex","hsvTmp","_hsv2","_hsvTmp","_lab2","_labTmp","_j3","getUint8Table","withAlpha","tableWithAlpha","nbChannels","buildFunctionFromTable","inc","nodeValue","fillFromDataPointer","nb","ptr","originalRange","mapDataIndexed","mapData","colorMap","oldColorSpace","isModified","oldNanColor","oldNodes","callModified","vtkColorTransferFunction","vtkColorTransferFunction$1","populateSelectionSettings","interpolateScalarsBeforeMapping","colorCoordinates","colorTextureMap","forceCompileOnly","useInvertibleColors","invertibleScalars","setForceCompileOnly","canUseTextureMapForColoring","mapScalarsToTexture","scalarToTextureCoordinate","scalarValue","invRangeWidth","texCoordS","texCoordT","createColorTextureCoordinates","numScalars","tableRange","tableNumberOfColors","useLogScale","scalarTexelWidth","paddedRange","scalarIdx","magnitude","applyLogScale","outputs","_scalarIdx","inputValue","_outputs","getLogRange","origAlpha","setAlpha","scalarComponent","getIndexedLookup","gasResult","clearColorArrays","triangles","acquireInvertibleLookupTable","valueToColor","colorToValue","useInvertibleColorFor","clearInvertibleColor","rawLowData","rawHighData","idMap","outValue","lowData","_inValue","_outValue","vtkMapper","vtkMapper$1","resolveCoincidentTopologyPolygonOffsetFaces","resolveCoincidentTopology","RESOLVE_COINCIDENT_TOPOLOGY_MODE","setResolveCoincidentTopology","getResolveCoincidentTopologyAsString","getResolveCoincidentTopologyPolygonOffsetFaces","setResolveCoincidentTopologyPolygonOffsetFaces","setResolveCoincidentTopologyToDefault","setResolveCoincidentTopologyToOff","setResolveCoincidentTopologyToPolygonOffset","addCoincidentTopologyMethods","nameList","CATEGORIES","Polygon","Line","Point","topologyOffset","methodName","globalValue","getResolveCoincidentTopologyPolygonOffsetParameters","localValue","getRelativeCoincidentTopologyPolygonOffsetParameters","getResolveCoincidentTopologyLineOffsetParameters","getRelativeCoincidentTopologyLineOffsetParameters","getResolveCoincidentTopologyPointOffsetParameters","getRelativeCoincidentTopologyPointOffsetParameters","MAP_SCALARS","BY_NAME","allocatedRenderTime","dragable","estimatedRenderTime","paths","pickable","renderTimeMultiplier","savedEstimatedRenderTime","useBounds","pixeloffsets","getNestedProps","getActors2D","pick","hasKey","_parentProp","getNestedDragable","setEstimatedRenderTime","restoreEstimatedRenderTime","addEstimatedRenderTime","setAllocatedRenderTime","hasTexture","removeTexture","newTextureList","removeAllTextures","setCoordinateSystemToWorld","setCoordinateSystem","vtkProp","vtkProp$1","userMatrix","userMatrixMTime","cachedProp3D","matrixMTime","addPosition","deltaXYZ","oaxis","rotateWXYZ","setUserMatrix","getUserMatrix","vtkProp3D","vtkProp3D$1","Interpolation","edgeColor","metallic","roughness","normalStrength","emission","baseIOR","GOURAUD","edgeVisibility","lighting","shading","materialName","setDiffuseColor","setAmbientColor","setSpecularColor","computeCompositeColor","addShaderVariable","setInterpolationToFlat","setInterpolation","setInterpolationToGouraud","setInterpolationToPhong","PHONG","getInterpolationAsString","vtkProperty","vtkProperty$1","PropertyConst","switch","positional","coneAngle","coneFalloff","attenuationValues","transformMatrix","lightType","shadowAttenuation","directionMTime","getTransformedFocalPoint","directionVector","setDirectionAngle","elevationRadians","azimuthRadians","setPositional","setLightTypeToHeadLight","setLightType","setLightTypeToCameraLight","setLightTypeToSceneLight","setTransformMatrix","lightTypeIsCameraLight","vtkLight","vtkLight$1","LIGHT_TYPES","vtkViewport","gatherProps","allProps","hasViewProp","addViewProp","newPropList","allPropsArray","addActor2D","removeActor2D","actors2D","displayToView","viewToDisplay","nvp","normalizedDisplayToNormalizedViewport","normalizedViewportToProjection","projectionToNormalizedViewport","normalizedViewportToNormalizedDisplay","PickPropFrom","background2","gradientBackground","pixelAspect","vtkViewport$1","pickedProp","allBounds","timeFactor","automaticLightCreation","twoSidedLighting","lastRenderTimeInSeconds","volumes","numberOfPropsRendered","propArray","pathArray","layer","preserveColorBuffer","preserveDepthBuffer","interactive","nearClippingPlaneTolerance","clippingRangeExpansion","erase","useShadows","useDepthPeeling","occlusionRatio","maximumNumberOfPeels","delegate","texturedBackground","backgroundTexture","environmentTexture","environmentTextureDiffuseStrength","environmentTextureSpecularStrength","useEnvironmentTextureAsBackground","COMPUTE_VISIBLE_PROP_BOUNDS_EVENT","RESET_CAMERA_CLIPPING_RANGE_EVENT","updateCamera","getActiveCameraAndResetIfCreated","updateLightsGeometryToFollowCamera","setPositionFrom","setFocalPointFrom","getFocalPointByReference","updateLightGeometry","allocateTime","updateGeometry","_renderWindow","setLayer","setPreserveColorBuffer","makeCamera","removeActor","removeVolume","removeAllVolumes","hasLight","addLight","removeLight","removeAllLights","setLightCollection","makeLight","_createdLight","normalizedDisplayToWorld","vpd","worldToNormalizedDisplay","nothingVisible","getUseBounds","boundsToUse","minGap","_vtkWindow","visibleActorCount","visibleVolumeCount","vtkRenderer$1","imageLoaded","repeat","edgeClamp","setJsImageData","complete","getInputAsJsImageData","vtkTexture","vtkTexture$1","level","kernel","hs","maps","oldData","vs","sample","dataCopy","_p","kw","lineShift","_p2","_kw","_value","_construct","Parent","Class","isNativeReflectConstruct","construct","_get","desc","_wrapNativeSuper","_cache","Wrapper","writable","configurable","_createSuper","Derived","hasNativeReflectConstruct","sham","valueOf","_isNativeReflectConstruct","Super","NewTarget","ClassHierarchy","_Array","_super","globalMTime","fakeConsole","noOp","loggerFunctions","ERROR_ONCE_MAP","TYPED_ARRAYS","BigInt64Array","BigUint64Array","_unused","newTypedArray","newTypedArrayFrom","capitalize","_capitalize","safeArrays","getStateArrayMapFunc","setImmediateVTK","callbacks","hierarchy","otherMTime","on","noWarning","noFunction","list","subset","otherModel","keyList","keyIdx","toJSON","objectGetterMap","fieldNames","getter","objectSetterMap","enum","onChanged","_model$onChanged","previousValue","_model$onChanged2","findSetter","_model$onChanged3","fields","setGet","defaultVal","_len4","_key4","needCopy","_model$onChanged4","otherArray","setGetArray","moveToProtected","algo","numberOfInputs","port","inputData","inputConnection","outputPort","msg","getPortToFill","portToFill","shouldUpdate","inputArrayToProcess","localMTime","minOutputMTime","_model$inputConnectio","_publicAPI$getInputDa","addInputData","addInputConnection","getInputConnection","outputPortAccess","ins","_count","getNumberOfOutputPorts","getInputArrayToProcess","inputPort","arrayDesc","ds","setInputArrayToProcess","attributeType","EVENT_ABORT","register","chain","_len5","_key5","_len6","_key6","isVtkObject","keystore","initialKeystore","setKey","getKey","getAllKeys","deleteKey","clearKeystore","nextProxyId","ROOT_GROUP_NAME","macro","wait","timeout","_this","debounced","_len7","_key7","callNow","previousDelete","curCallbackID","callbackID","_arguments","currentCallbacks","_currentCallbacks$ind","_ret","cb1","cb2","formatBytesToProperUnit","chunkSize","units","currentUnit","formatNumbersWithThousandSeparator","sections","getCurrentGlobalMTime","measurePromiseExecution","wheelEvent","sX","sY","pX","pY","wheelDelta","wheelDeltaY","wheelDeltaX","HORIZONTAL_AXIS","deltaY","deltaX","deltaMode","spinX","pixelX","pixelY","proxy","proxyId","ui","propertyMap","groupChildrenNames","registerProperties","descriptionList","currentGroupName","childrenNames","groupName","propertyNames","listProxyProperties","updateUI","updateProxyProperty","propertyName","propUI","proxyManager","setActiveMethod","getProxyGroup","propertyLinkSubscribers","registerPropertyLinkForGC","otherLink","gcPropertyLinks","subscribers","unbind","propertyLinkMap","getPropertyLink","persistent","updateInProgress","needUpdate","sourceLink","newValue","shallowEquals","linkToUpdate","indexToDelete","linkHandler","updateMe","listPropertyNames","getPropertyByName","getPropertyDomainByName","getProxySection","proxyGroup","_model$links$i","updateOnBind","sLink","proxyPropertyMapping","subscriptions","_map$propertyName","modelKey","_map$propertyName$mod","methodSrc","methodDst","proxyPropertyState","defaults","modelKeys","applyState","setLoggerFunction","throttle","delay","isThrottled","argsToUse","wrapper","_len8","_key8","traverseInstanceTree","extractFunction","accumulator","visitedInstances","modelObj","subObj","uncapitalize","vtkInfoMacro","vtkLogMacro","vtkGlobal","factoryMapping","vtkObject","newInst","vtkClassName","exports","implementation","getPolyfill","shim","polyfill","getGlobal","define","supportsDescriptors","descriptor","globalThis","hex_chr","md5cycle","md5blk","md5blks","md5blk_array","md51","tail","lo","hi","md51_array","rhex","hex","toUtf8","unescape","encodeURIComponent","utf8Str2ArrayBuffer","returnUInt8Array","arrayBuffer2Utf8Str","fromCharCode","concatenateArrayBuffers","hexToBinaryString","bytes","SparkMD5","targetArray","sourceArray","append","appendBinary","contents","_hash","raw","_finish","setState","hashBinary","content","factory","_typeof","_regeneratorRuntime","__esModule","Op","hasOwn","$Symbol","iteratorSymbol","iterator","asyncIteratorSymbol","asyncIterator","toStringTagSymbol","toStringTag","wrap","innerFn","outerFn","tryLocsList","protoGenerator","Generator","generator","Context","makeInvokeMethod","tryCatch","ContinueSentinel","GeneratorFunction","GeneratorFunctionPrototype","IteratorPrototype","getProto","NativeIteratorPrototype","Gp","defineIteratorMethods","_invoke","AsyncIterator","PromiseImpl","invoke","__await","unwrapped","previousPromise","callInvokeWithMethodAndArg","doneResult","delegateResult","maybeInvokeDelegate","_sent","dispatchException","resultName","nextLoc","pushTryEntry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","resetTryEntry","completion","iterable","iteratorMethod","displayName","isGeneratorFunction","genFun","ctor","mark","__proto__","awrap","iter","skipTempReset","rootRecord","rval","exception","caught","hasCatch","hasFinally","finallyEntry","thrown","delegateYield","runtime","regeneratorRuntime","accidentalStrictMode","descending","bisector","compare1","compare2","ascendingBisect","bisectRight","Blur2","blurf","blur","T","rx","ry","blurx","blury","blurh","blurv","radius0","bluri","s0","e10","e5","tickSpec","power","tickStep","zip","valueof","transpose","Color","darker","brighter","reI","reN","reP","reHex","reRgbInteger","reRgbPercent","reRgbaInteger","reRgbaPercent","reHslPercent","reHslaPercent","named","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","color_formatHex","formatHex","color_formatRgb","formatRgb","rgbn","Rgb","hsla","rgbConvert","rgb_formatHex","rgb_formatRgb","clampa","clampi","Hsl","hslConvert","hsl","clamph","clampt","hsl2rgb","channels","displayable","formatHex8","formatHsl","radians","Xn","Yn","Zn","t3","labConvert","Lab","Hcl","hcl2lab","rgb2lrgb","lrgb2rgb","hclConvert","hcl","E","ED","EB","BC_DA","Cubehelix","bl","cubehelixConvert","basis","v0","cosh","sinh","constant","nogamma","exponential","rgbGamma","rgbSpline","spline","genericArray","reA","reB","am","bm","bs","bi","lastIndex","one","isView","DataView","svgNode","translateX","translateY","skewX","atan","interpolateTransform","pxComma","pxParen","degParen","xa","ya","xb","yb","DOMMatrix","WebKitCSSMatrix","decompose","createElementNS","baseVal","consolidate","zoomRho","rho","rho2","rho4","ux0","uy0","w0","ux1","uy1","coshr0","SQRT2","_1","_2","cubehelix","cubehelixGamma","interpolator","samples"],"sourceRoot":""} \ No newline at end of file diff --git a/resources/757.bundle.26ceda521b4376726a11.js b/resources/757.bundle.26ceda521b4376726a11.js new file mode 100644 index 0000000..de07aa9 --- /dev/null +++ b/resources/757.bundle.26ceda521b4376726a11.js @@ -0,0 +1,2 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[757],{82803:(e,t,r)=>{"use strict";var n,o=Object.assign||function(e){for(var t=1;t=0||Object.prototype.hasOwnProperty.call(e,n)&&(r[n]=e[n]);return r}(e,["fill","width","height","style"]);return i.default.createElement("svg",o({viewBox:"0 0 24 24",style:o({fill:r,width:a,height:l},u)},p),i.default.createElement("path",{d:"M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"}))}},64329:(e,t,r)=>{"use strict";var n,o=Object.assign||function(e){for(var t=1;t=0||Object.prototype.hasOwnProperty.call(e,n)&&(r[n]=e[n]);return r}(e,["fill","width","height","style"]);return i.default.createElement("svg",o({viewBox:"0 0 24 24",style:o({fill:r,width:a,height:l},u)},p),i.default.createElement("path",{d:"M12,18.17L8.83,15L7.42,16.41L12,21L16.59,16.41L15.17,15M12,5.83L15.17,9L16.58,7.59L12,3L7.41,7.59L8.83,9L12,5.83Z"}))}},49399:(e,t,r)=>{"use strict";r.d(t,{ZP:()=>v});var n=r(41168),o=r(1299),a=r(72688),i=r(75755),s=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];(0,a.Z)(this,e),this.oriented=t,this.edgeMap=new Map}return(0,i.Z)(e,[{key:"initialize",value:function(){this.edgeMap.clear()}},{key:"computeEdgeKey",value:function(e,t){return this.oriented||e0&&void 0!==arguments[0]?arguments[0]:{}).oriented)}},c=[[-1,-1,-1,-1,-1],[0,3,-1,-1,-1],[1,0,-1,-1,-1],[1,3,-1,-1,-1],[2,1,-1,-1,-1],[0,3,2,1,-1],[2,0,-1,-1,-1],[2,3,-1,-1,-1],[3,2,-1,-1,-1],[0,2,-1,-1,-1],[1,0,3,2,-1],[1,2,-1,-1,-1],[3,1,-1,-1,-1],[0,1,-1,-1,-1],[3,0,-1,-1,-1],[-1,-1,-1,-1,-1]],u=[[0,1],[1,3],[2,3],[0,2]];var p={getCase:function(e){return c[e]},getEdge:function(e){return u[e]}},f=n.default.vtkErrorMacro,h=n.default.vtkDebugMacro;var d={contourValues:[],slice:0,mergePoints:!1};function b(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.assign(t,d,r),n.default.obj(e,t),n.default.algo(e,t,1,1),n.default.setGet(e,t,["slice","mergePoints"]),n.default.algo(e,t,1,1),function(e,t){t.classHierarchy.push("vtkImageMarchingSquares"),e.getContourValues=function(){return t.contourValues},e.setContourValues=function(r){t.contourValues=r,e.modified()};var r=[],n=[],a=[],i=l.newInstance();e.getPixelScalars=function(e,t,o,a,i,s,l,c){r[0]=o*a+t*i[0]+e,r[1]=r[0]+1,r[2]=r[0]+i[0],r[3]=r[2]+1;for(var u=0;u<4;++u)n[u]=c[r[u]]},e.getPixelPoints=function(e,t,r,n,o,i){a[0]=o[0]+e*i[0],a[1]=o[1]+t*i[1],a[2]=a[0]+i[0],a[3]=a[1],a[4]=a[0],a[5]=a[1]+i[1],a[6]=a[2],a[7]=a[5]},e.produceLines=function(o,s,l,c,u,f,h,d,b,v,g){var x,y=[1,2,8,4],m=[];e.getPixelScalars(s,l,c,u,f,h,d,b);for(var w=0,_=0;_<4;_++)n[_]>=o&&(w|=y[_]);var E=p.getCase(w);if(!(E[0]<0)){e.getPixelPoints(s,l,c,f,h,d);for(var j=h[2]+c*d[2],O=0;E[O]>=0;O+=3){g.push(2);for(var C=0;C<2;C++){var S,k=p.getEdge(E[O+C]);if(x=void 0,t.mergePoints&&(x=null===(S=i.isInsertedEdge(r[k[0]],r[k[1]]))||void 0===S?void 0:S.value),void 0===x){var A=(o-n[k[0]])/(n[k[1]]-n[k[0]]),M=a.slice(2*k[0],2*(k[0]+1)),P=a.slice(2*k[1],2*(k[1]+1));m[0]=M[0]+A*(P[0]-M[0]),m[1]=M[1]+A*(P[1]-M[1]),x=v.length/3,v.push(m[0],m[1],j),t.mergePoints&&i.insertEdge(r[k[0]],r[k[1]],x)}g.push(x)}}}},e.requestData=function(r,n){var a=r[0];if(a){console.time("msquares");var s=a.getOrigin(),l=a.getSpacing(),c=a.getDimensions(),u=a.getPointData().getScalars().getData(),p=[],d=[],b=c[0]*c[1],v=Math.round(t.slice);v>=c[2]&&(v=0);for(var g=0;g{var n=r(16396)(r(53115),"DataView");e.exports=n},55877:(e,t,r)=>{var n=r(94931),o=r(50951),a=r(64381),i=r(76005),s=r(5243);function l(e){var t=-1,r=null==e?0:e.length;for(this.clear();++t{var n=r(66333),o=r(93768),a=r(97380),i=r(13372),s=r(40140);function l(e){var t=-1,r=null==e?0:e.length;for(this.clear();++t{var n=r(16396)(r(53115),"Map");e.exports=n},97955:(e,t,r)=>{var n=r(80623),o=r(75551),a=r(3213),i=r(21586),s=r(86730);function l(e){var t=-1,r=null==e?0:e.length;for(this.clear();++t{var n=r(16396)(r(53115),"Promise");e.exports=n},95449:(e,t,r)=>{var n=r(16396)(r(53115),"Set");e.exports=n},27005:(e,t,r)=>{var n=r(97955),o=r(26458),a=r(19461);function i(e){var t=-1,r=null==e?0:e.length;for(this.__data__=new n;++t{var n=r(90563),o=r(42852),a=r(13954),i=r(97986),s=r(5400),l=r(72174);function c(e){var t=this.__data__=new n(e);this.size=t.size}c.prototype.clear=o,c.prototype.delete=a,c.prototype.get=i,c.prototype.has=s,c.prototype.set=l,e.exports=c},70590:(e,t,r)=>{var n=r(53115).Uint8Array;e.exports=n},10811:(e,t,r)=>{var n=r(16396)(r(53115),"WeakMap");e.exports=n},31290:e=>{e.exports=function(e,t){for(var r=-1,n=null==e?0:e.length;++r{e.exports=function(e,t){for(var r=-1,n=null==e?0:e.length,o=0,a=[];++r{var n=r(72897),o=r(40468),a=r(29497),i=r(74039),s=r(76296),l=r(10584),c=Object.prototype.hasOwnProperty;e.exports=function(e,t){var r=a(e),u=!r&&o(e),p=!r&&!u&&i(e),f=!r&&!u&&!p&&l(e),h=r||u||p||f,d=h?n(e.length,String):[],b=d.length;for(var v in e)!t&&!c.call(e,v)||h&&("length"==v||p&&("offset"==v||"parent"==v)||f&&("buffer"==v||"byteLength"==v||"byteOffset"==v)||s(v,b))||d.push(v);return d}},59966:e=>{e.exports=function(e,t){for(var r=-1,n=null==e?0:e.length,o=Array(n);++r{e.exports=function(e,t){for(var r=-1,n=t.length,o=e.length;++r{e.exports=function(e,t){for(var r=-1,n=null==e?0:e.length;++r{var n=r(85763),o=r(72882),a=Object.prototype.hasOwnProperty;e.exports=function(e,t,r){var i=e[t];a.call(e,t)&&o(i,r)&&(void 0!==r||t in e)||n(e,t,r)}},50770:(e,t,r)=>{var n=r(72882);e.exports=function(e,t){for(var r=e.length;r--;)if(n(e[r][0],t))return r;return-1}},12536:(e,t,r)=>{var n=r(98984),o=r(5072);e.exports=function(e,t){return e&&n(t,o(t),e)}},97168:(e,t,r)=>{var n=r(98984),o=r(94234);e.exports=function(e,t){return e&&n(t,o(t),e)}},85763:(e,t,r)=>{var n=r(17010);e.exports=function(e,t,r){"__proto__"==t&&n?n(e,t,{configurable:!0,enumerable:!0,value:r,writable:!0}):e[t]=r}},74575:(e,t,r)=>{var n=r(53423),o=r(31290),a=r(84501),i=r(12536),s=r(97168),l=r(64886),c=r(71082),u=r(55084),p=r(29402),f=r(40351),h=r(63647),d=r(90125),b=r(88026),v=r(17209),g=r(99147),x=r(29497),y=r(74039),m=r(59766),w=r(28197),_=r(55795),E=r(5072),j=r(94234),O="[object Arguments]",C="[object Function]",S="[object Object]",k={};k[O]=k["[object Array]"]=k["[object ArrayBuffer]"]=k["[object DataView]"]=k["[object Boolean]"]=k["[object Date]"]=k["[object Float32Array]"]=k["[object Float64Array]"]=k["[object Int8Array]"]=k["[object Int16Array]"]=k["[object Int32Array]"]=k["[object Map]"]=k["[object Number]"]=k[S]=k["[object RegExp]"]=k["[object Set]"]=k["[object String]"]=k["[object Symbol]"]=k["[object Uint8Array]"]=k["[object Uint8ClampedArray]"]=k["[object Uint16Array]"]=k["[object Uint32Array]"]=!0,k["[object Error]"]=k[C]=k["[object WeakMap]"]=!1,e.exports=function e(t,r,A,M,P,R){var F,B=1&r,z=2&r,T=4&r;if(A&&(F=P?A(t,M,P,R):A(t)),void 0!==F)return F;if(!w(t))return t;var H=x(t);if(H){if(F=b(t),!B)return c(t,F)}else{var D=d(t),L=D==C||"[object GeneratorFunction]"==D;if(y(t))return l(t,B);if(D==S||D==O||L&&!P){if(F=z||L?{}:g(t),!B)return z?p(t,s(F,t)):u(t,i(F,t))}else{if(!k[D])return P?t:{};F=v(t,D,B)}}R||(R=new n);var N=R.get(t);if(N)return N;R.set(t,F),_(t)?t.forEach((function(n){F.add(e(n,r,A,n,t,R))})):m(t)&&t.forEach((function(n,o){F.set(o,e(n,r,A,o,t,R))}));var I=H?void 0:(T?z?h:f:z?j:E)(t);return o(I||t,(function(n,o){I&&(n=t[o=n]),a(F,o,e(n,r,A,o,t,R))})),F}},8482:(e,t,r)=>{var n=r(28197),o=Object.create,a=function(){function e(){}return function(t){if(!n(t))return{};if(o)return o(t);e.prototype=t;var r=new e;return e.prototype=void 0,r}}();e.exports=a},30354:(e,t,r)=>{var n=r(96010),o=r(49292)(n);e.exports=o},15878:(e,t,r)=>{var n=r(72622)();e.exports=n},96010:(e,t,r)=>{var n=r(15878),o=r(5072);e.exports=function(e,t){return e&&n(e,t,o)}},25048:(e,t,r)=>{var n=r(58614),o=r(50388);e.exports=function(e,t){for(var r=0,a=(t=n(t,e)).length;null!=e&&r{var n=r(33136),o=r(29497);e.exports=function(e,t,r){var a=t(e);return o(e)?a:n(a,r(e))}},69626:e=>{e.exports=function(e,t){return null!=e&&t in Object(e)}},99609:(e,t,r)=>{var n=r(24504),o=r(9749);e.exports=function(e){return o(e)&&"[object Arguments]"==n(e)}},63767:(e,t,r)=>{var n=r(29978),o=r(9749);e.exports=function e(t,r,a,i,s){return t===r||(null==t||null==r||!o(t)&&!o(r)?t!=t&&r!=r:n(t,r,a,i,e,s))}},29978:(e,t,r)=>{var n=r(53423),o=r(24961),a=r(44181),i=r(84188),s=r(90125),l=r(29497),c=r(74039),u=r(10584),p="[object Arguments]",f="[object Array]",h="[object Object]",d=Object.prototype.hasOwnProperty;e.exports=function(e,t,r,b,v,g){var x=l(e),y=l(t),m=x?f:s(e),w=y?f:s(t),_=(m=m==p?h:m)==h,E=(w=w==p?h:w)==h,j=m==w;if(j&&c(e)){if(!c(t))return!1;x=!0,_=!1}if(j&&!_)return g||(g=new n),x||u(e)?o(e,t,r,b,v,g):a(e,t,m,r,b,v,g);if(!(1&r)){var O=_&&d.call(e,"__wrapped__"),C=E&&d.call(t,"__wrapped__");if(O||C){var S=O?e.value():e,k=C?t.value():t;return g||(g=new n),v(S,k,r,b,g)}}return!!j&&(g||(g=new n),i(e,t,r,b,v,g))}},72049:(e,t,r)=>{var n=r(90125),o=r(9749);e.exports=function(e){return o(e)&&"[object Map]"==n(e)}},91694:(e,t,r)=>{var n=r(53423),o=r(63767);e.exports=function(e,t,r,a){var i=r.length,s=i,l=!a;if(null==e)return!s;for(e=Object(e);i--;){var c=r[i];if(l&&c[2]?c[1]!==e[c[0]]:!(c[0]in e))return!1}for(;++i{var n=r(81001),o=r(99779),a=r(28197),i=r(50011),s=/^\[object .+?Constructor\]$/,l=Function.prototype,c=Object.prototype,u=l.toString,p=c.hasOwnProperty,f=RegExp("^"+u.call(p).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");e.exports=function(e){return!(!a(e)||o(e))&&(n(e)?f:s).test(i(e))}},90467:(e,t,r)=>{var n=r(90125),o=r(9749);e.exports=function(e){return o(e)&&"[object Set]"==n(e)}},60922:(e,t,r)=>{var n=r(24504),o=r(99312),a=r(9749),i={};i["[object Float32Array]"]=i["[object Float64Array]"]=i["[object Int8Array]"]=i["[object Int16Array]"]=i["[object Int32Array]"]=i["[object Uint8Array]"]=i["[object Uint8ClampedArray]"]=i["[object Uint16Array]"]=i["[object Uint32Array]"]=!0,i["[object Arguments]"]=i["[object Array]"]=i["[object ArrayBuffer]"]=i["[object Boolean]"]=i["[object DataView]"]=i["[object Date]"]=i["[object Error]"]=i["[object Function]"]=i["[object Map]"]=i["[object Number]"]=i["[object Object]"]=i["[object RegExp]"]=i["[object Set]"]=i["[object String]"]=i["[object WeakMap]"]=!1,e.exports=function(e){return a(e)&&o(e.length)&&!!i[n(e)]}},65325:(e,t,r)=>{var n=r(14560),o=r(50769),a=r(37484),i=r(29497),s=r(99996);e.exports=function(e){return"function"==typeof e?e:null==e?a:"object"==typeof e?i(e)?o(e[0],e[1]):n(e):s(e)}},12645:(e,t,r)=>{var n=r(71031),o=r(2750),a=Object.prototype.hasOwnProperty;e.exports=function(e){if(!n(e))return o(e);var t=[];for(var r in Object(e))a.call(e,r)&&"constructor"!=r&&t.push(r);return t}},89166:(e,t,r)=>{var n=r(28197),o=r(71031),a=r(27080),i=Object.prototype.hasOwnProperty;e.exports=function(e){if(!n(e))return a(e);var t=o(e),r=[];for(var s in e)("constructor"!=s||!t&&i.call(e,s))&&r.push(s);return r}},41730:(e,t,r)=>{var n=r(30354),o=r(63386);e.exports=function(e,t){var r=-1,a=o(e)?Array(e.length):[];return n(e,(function(e,n,o){a[++r]=t(e,n,o)})),a}},14560:(e,t,r)=>{var n=r(91694),o=r(53047),a=r(72909);e.exports=function(e){var t=o(e);return 1==t.length&&t[0][2]?a(t[0][0],t[0][1]):function(r){return r===e||n(r,e,t)}}},50769:(e,t,r)=>{var n=r(63767),o=r(86664),a=r(33361),i=r(24379),s=r(10740),l=r(72909),c=r(50388);e.exports=function(e,t){return i(e)&&s(t)?l(c(e),t):function(r){var i=o(r,e);return void 0===i&&i===t?a(r,e):n(t,i,3)}}},97774:e=>{e.exports=function(e){return function(t){return null==t?void 0:t[e]}}},9128:(e,t,r)=>{var n=r(25048);e.exports=function(e){return function(t){return n(t,e)}}},72897:e=>{e.exports=function(e,t){for(var r=-1,n=Array(e);++r{var n=r(30024),o=r(59966),a=r(29497),i=r(18650),s=n?n.prototype:void 0,l=s?s.toString:void 0;e.exports=function e(t){if("string"==typeof t)return t;if(a(t))return o(t,e)+"";if(i(t))return l?l.call(t):"";var r=t+"";return"0"==r&&1/t==-Infinity?"-0":r}},61559:e=>{e.exports=function(e){return function(t){return e(t)}}},84851:e=>{e.exports=function(e,t){return e.has(t)}},16050:(e,t,r)=>{var n=r(37484);e.exports=function(e){return"function"==typeof e?e:n}},58614:(e,t,r)=>{var n=r(29497),o=r(24379),a=r(43663),i=r(57264);e.exports=function(e,t){return n(e)?e:o(e,t)?[e]:a(i(e))}},85847:(e,t,r)=>{var n=r(70590);e.exports=function(e){var t=new e.constructor(e.byteLength);return new n(t).set(new n(e)),t}},64886:(e,t,r)=>{e=r.nmd(e);var n=r(53115),o=t&&!t.nodeType&&t,a=o&&e&&!e.nodeType&&e,i=a&&a.exports===o?n.Buffer:void 0,s=i?i.allocUnsafe:void 0;e.exports=function(e,t){if(t)return e.slice();var r=e.length,n=s?s(r):new e.constructor(r);return e.copy(n),n}},41343:(e,t,r)=>{var n=r(85847);e.exports=function(e,t){var r=t?n(e.buffer):e.buffer;return new e.constructor(r,e.byteOffset,e.byteLength)}},41464:e=>{var t=/\w*$/;e.exports=function(e){var r=new e.constructor(e.source,t.exec(e));return r.lastIndex=e.lastIndex,r}},16580:(e,t,r)=>{var n=r(30024),o=n?n.prototype:void 0,a=o?o.valueOf:void 0;e.exports=function(e){return a?Object(a.call(e)):{}}},4118:(e,t,r)=>{var n=r(85847);e.exports=function(e,t){var r=t?n(e.buffer):e.buffer;return new e.constructor(r,e.byteOffset,e.length)}},71082:e=>{e.exports=function(e,t){var r=-1,n=e.length;for(t||(t=Array(n));++r{var n=r(84501),o=r(85763);e.exports=function(e,t,r,a){var i=!r;r||(r={});for(var s=-1,l=t.length;++s{var n=r(98984),o=r(94222);e.exports=function(e,t){return n(e,o(e),t)}},29402:(e,t,r)=>{var n=r(98984),o=r(65807);e.exports=function(e,t){return n(e,o(e),t)}},54913:(e,t,r)=>{var n=r(53115)["__core-js_shared__"];e.exports=n},49292:(e,t,r)=>{var n=r(63386);e.exports=function(e,t){return function(r,o){if(null==r)return r;if(!n(r))return e(r,o);for(var a=r.length,i=t?a:-1,s=Object(r);(t?i--:++i{e.exports=function(e){return function(t,r,n){for(var o=-1,a=Object(t),i=n(t),s=i.length;s--;){var l=i[e?s:++o];if(!1===r(a[l],l,a))break}return t}}},17010:(e,t,r)=>{var n=r(16396),o=function(){try{var e=n(Object,"defineProperty");return e({},"",{}),e}catch(e){}}();e.exports=o},24961:(e,t,r)=>{var n=r(27005),o=r(27812),a=r(84851);e.exports=function(e,t,r,i,s,l){var c=1&r,u=e.length,p=t.length;if(u!=p&&!(c&&p>u))return!1;var f=l.get(e),h=l.get(t);if(f&&h)return f==t&&h==e;var d=-1,b=!0,v=2&r?new n:void 0;for(l.set(e,t),l.set(t,e);++d{var n=r(30024),o=r(70590),a=r(72882),i=r(24961),s=r(12207),l=r(75562),c=n?n.prototype:void 0,u=c?c.valueOf:void 0;e.exports=function(e,t,r,n,c,p,f){switch(r){case"[object DataView]":if(e.byteLength!=t.byteLength||e.byteOffset!=t.byteOffset)return!1;e=e.buffer,t=t.buffer;case"[object ArrayBuffer]":return!(e.byteLength!=t.byteLength||!p(new o(e),new o(t)));case"[object Boolean]":case"[object Date]":case"[object Number]":return a(+e,+t);case"[object Error]":return e.name==t.name&&e.message==t.message;case"[object RegExp]":case"[object String]":return e==t+"";case"[object Map]":var h=s;case"[object Set]":var d=1&n;if(h||(h=l),e.size!=t.size&&!d)return!1;var b=f.get(e);if(b)return b==t;n|=2,f.set(e,t);var v=i(h(e),h(t),n,c,p,f);return f.delete(e),v;case"[object Symbol]":if(u)return u.call(e)==u.call(t)}return!1}},84188:(e,t,r)=>{var n=r(40351),o=Object.prototype.hasOwnProperty;e.exports=function(e,t,r,a,i,s){var l=1&r,c=n(e),u=c.length;if(u!=n(t).length&&!l)return!1;for(var p=u;p--;){var f=c[p];if(!(l?f in t:o.call(t,f)))return!1}var h=s.get(e),d=s.get(t);if(h&&d)return h==t&&d==e;var b=!0;s.set(e,t),s.set(t,e);for(var v=l;++p{var n=r(83297),o=r(94222),a=r(5072);e.exports=function(e){return n(e,a,o)}},63647:(e,t,r)=>{var n=r(83297),o=r(65807),a=r(94234);e.exports=function(e){return n(e,a,o)}},11591:(e,t,r)=>{var n=r(44190);e.exports=function(e,t){var r=e.__data__;return n(t)?r["string"==typeof t?"string":"hash"]:r.map}},53047:(e,t,r)=>{var n=r(10740),o=r(5072);e.exports=function(e){for(var t=o(e),r=t.length;r--;){var a=t[r],i=e[a];t[r]=[a,i,n(i)]}return t}},16396:(e,t,r)=>{var n=r(90140),o=r(72355);e.exports=function(e,t){var r=o(e,t);return n(r)?r:void 0}},91922:(e,t,r)=>{var n=r(16916)(Object.getPrototypeOf,Object);e.exports=n},94222:(e,t,r)=>{var n=r(5692),o=r(39443),a=Object.prototype.propertyIsEnumerable,i=Object.getOwnPropertySymbols,s=i?function(e){return null==e?[]:(e=Object(e),n(i(e),(function(t){return a.call(e,t)})))}:o;e.exports=s},65807:(e,t,r)=>{var n=r(33136),o=r(91922),a=r(94222),i=r(39443),s=Object.getOwnPropertySymbols?function(e){for(var t=[];e;)n(t,a(e)),e=o(e);return t}:i;e.exports=s},90125:(e,t,r)=>{var n=r(55187),o=r(34775),a=r(21523),i=r(95449),s=r(10811),l=r(24504),c=r(50011),u="[object Map]",p="[object Promise]",f="[object Set]",h="[object WeakMap]",d="[object DataView]",b=c(n),v=c(o),g=c(a),x=c(i),y=c(s),m=l;(n&&m(new n(new ArrayBuffer(1)))!=d||o&&m(new o)!=u||a&&m(a.resolve())!=p||i&&m(new i)!=f||s&&m(new s)!=h)&&(m=function(e){var t=l(e),r="[object Object]"==t?e.constructor:void 0,n=r?c(r):"";if(n)switch(n){case b:return d;case v:return u;case g:return p;case x:return f;case y:return h}return t}),e.exports=m},72355:e=>{e.exports=function(e,t){return null==e?void 0:e[t]}},31859:(e,t,r)=>{var n=r(58614),o=r(40468),a=r(29497),i=r(76296),s=r(99312),l=r(50388);e.exports=function(e,t,r){for(var c=-1,u=(t=n(t,e)).length,p=!1;++c{var n=r(3494);e.exports=function(){this.__data__=n?n(null):{},this.size=0}},50951:e=>{e.exports=function(e){var t=this.has(e)&&delete this.__data__[e];return this.size-=t?1:0,t}},64381:(e,t,r)=>{var n=r(3494),o=Object.prototype.hasOwnProperty;e.exports=function(e){var t=this.__data__;if(n){var r=t[e];return"__lodash_hash_undefined__"===r?void 0:r}return o.call(t,e)?t[e]:void 0}},76005:(e,t,r)=>{var n=r(3494),o=Object.prototype.hasOwnProperty;e.exports=function(e){var t=this.__data__;return n?void 0!==t[e]:o.call(t,e)}},5243:(e,t,r)=>{var n=r(3494);e.exports=function(e,t){var r=this.__data__;return this.size+=this.has(e)?0:1,r[e]=n&&void 0===t?"__lodash_hash_undefined__":t,this}},88026:e=>{var t=Object.prototype.hasOwnProperty;e.exports=function(e){var r=e.length,n=new e.constructor(r);return r&&"string"==typeof e[0]&&t.call(e,"index")&&(n.index=e.index,n.input=e.input),n}},17209:(e,t,r)=>{var n=r(85847),o=r(41343),a=r(41464),i=r(16580),s=r(4118);e.exports=function(e,t,r){var l=e.constructor;switch(t){case"[object ArrayBuffer]":return n(e);case"[object Boolean]":case"[object Date]":return new l(+e);case"[object DataView]":return o(e,r);case"[object Float32Array]":case"[object Float64Array]":case"[object Int8Array]":case"[object Int16Array]":case"[object Int32Array]":case"[object Uint8Array]":case"[object Uint8ClampedArray]":case"[object Uint16Array]":case"[object Uint32Array]":return s(e,r);case"[object Map]":case"[object Set]":return new l;case"[object Number]":case"[object String]":return new l(e);case"[object RegExp]":return a(e);case"[object Symbol]":return i(e)}}},99147:(e,t,r)=>{var n=r(8482),o=r(91922),a=r(71031);e.exports=function(e){return"function"!=typeof e.constructor||a(e)?{}:n(o(e))}},76296:e=>{var t=/^(?:0|[1-9]\d*)$/;e.exports=function(e,r){var n=typeof e;return!!(r=null==r?9007199254740991:r)&&("number"==n||"symbol"!=n&&t.test(e))&&e>-1&&e%1==0&&e{var n=r(29497),o=r(18650),a=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,i=/^\w*$/;e.exports=function(e,t){if(n(e))return!1;var r=typeof e;return!("number"!=r&&"symbol"!=r&&"boolean"!=r&&null!=e&&!o(e))||(i.test(e)||!a.test(e)||null!=t&&e in Object(t))}},44190:e=>{e.exports=function(e){var t=typeof e;return"string"==t||"number"==t||"symbol"==t||"boolean"==t?"__proto__"!==e:null===e}},99779:(e,t,r)=>{var n,o=r(54913),a=(n=/[^.]+$/.exec(o&&o.keys&&o.keys.IE_PROTO||""))?"Symbol(src)_1."+n:"";e.exports=function(e){return!!a&&a in e}},71031:e=>{var t=Object.prototype;e.exports=function(e){var r=e&&e.constructor;return e===("function"==typeof r&&r.prototype||t)}},10740:(e,t,r)=>{var n=r(28197);e.exports=function(e){return e==e&&!n(e)}},66333:e=>{e.exports=function(){this.__data__=[],this.size=0}},93768:(e,t,r)=>{var n=r(50770),o=Array.prototype.splice;e.exports=function(e){var t=this.__data__,r=n(t,e);return!(r<0)&&(r==t.length-1?t.pop():o.call(t,r,1),--this.size,!0)}},97380:(e,t,r)=>{var n=r(50770);e.exports=function(e){var t=this.__data__,r=n(t,e);return r<0?void 0:t[r][1]}},13372:(e,t,r)=>{var n=r(50770);e.exports=function(e){return n(this.__data__,e)>-1}},40140:(e,t,r)=>{var n=r(50770);e.exports=function(e,t){var r=this.__data__,o=n(r,e);return o<0?(++this.size,r.push([e,t])):r[o][1]=t,this}},80623:(e,t,r)=>{var n=r(55877),o=r(90563),a=r(34775);e.exports=function(){this.size=0,this.__data__={hash:new n,map:new(a||o),string:new n}}},75551:(e,t,r)=>{var n=r(11591);e.exports=function(e){var t=n(this,e).delete(e);return this.size-=t?1:0,t}},3213:(e,t,r)=>{var n=r(11591);e.exports=function(e){return n(this,e).get(e)}},21586:(e,t,r)=>{var n=r(11591);e.exports=function(e){return n(this,e).has(e)}},86730:(e,t,r)=>{var n=r(11591);e.exports=function(e,t){var r=n(this,e),o=r.size;return r.set(e,t),this.size+=r.size==o?0:1,this}},12207:e=>{e.exports=function(e){var t=-1,r=Array(e.size);return e.forEach((function(e,n){r[++t]=[n,e]})),r}},72909:e=>{e.exports=function(e,t){return function(r){return null!=r&&(r[e]===t&&(void 0!==t||e in Object(r)))}}},33270:(e,t,r)=>{var n=r(18923);e.exports=function(e){var t=n(e,(function(e){return 500===r.size&&r.clear(),e})),r=t.cache;return t}},3494:(e,t,r)=>{var n=r(16396)(Object,"create");e.exports=n},2750:(e,t,r)=>{var n=r(16916)(Object.keys,Object);e.exports=n},27080:e=>{e.exports=function(e){var t=[];if(null!=e)for(var r in Object(e))t.push(r);return t}},87862:(e,t,r)=>{e=r.nmd(e);var n=r(82850),o=t&&!t.nodeType&&t,a=o&&e&&!e.nodeType&&e,i=a&&a.exports===o&&n.process,s=function(){try{var e=a&&a.require&&a.require("util").types;return e||i&&i.binding&&i.binding("util")}catch(e){}}();e.exports=s},16916:e=>{e.exports=function(e,t){return function(r){return e(t(r))}}},26458:e=>{e.exports=function(e){return this.__data__.set(e,"__lodash_hash_undefined__"),this}},19461:e=>{e.exports=function(e){return this.__data__.has(e)}},75562:e=>{e.exports=function(e){var t=-1,r=Array(e.size);return e.forEach((function(e){r[++t]=e})),r}},42852:(e,t,r)=>{var n=r(90563);e.exports=function(){this.__data__=new n,this.size=0}},13954:e=>{e.exports=function(e){var t=this.__data__,r=t.delete(e);return this.size=t.size,r}},97986:e=>{e.exports=function(e){return this.__data__.get(e)}},5400:e=>{e.exports=function(e){return this.__data__.has(e)}},72174:(e,t,r)=>{var n=r(90563),o=r(34775),a=r(97955);e.exports=function(e,t){var r=this.__data__;if(r instanceof n){var i=r.__data__;if(!o||i.length<199)return i.push([e,t]),this.size=++r.size,this;r=this.__data__=new a(i)}return r.set(e,t),this.size=r.size,this}},43663:(e,t,r)=>{var n=r(33270),o=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,a=/\\(\\)?/g,i=n((function(e){var t=[];return 46===e.charCodeAt(0)&&t.push(""),e.replace(o,(function(e,r,n,o){t.push(n?o.replace(a,"$1"):r||e)})),t}));e.exports=i},50388:(e,t,r)=>{var n=r(18650);e.exports=function(e){if("string"==typeof e||n(e))return e;var t=e+"";return"0"==t&&1/e==-Infinity?"-0":t}},50011:e=>{var t=Function.prototype.toString;e.exports=function(e){if(null!=e){try{return t.call(e)}catch(e){}try{return e+""}catch(e){}}return""}},28869:(e,t,r)=>{var n=r(74575);e.exports=function(e){return n(e,5)}},72882:e=>{e.exports=function(e,t){return e===t||e!=e&&t!=t}},11597:(e,t,r)=>{var n=r(96010),o=r(16050);e.exports=function(e,t){return e&&n(e,o(t))}},86664:(e,t,r)=>{var n=r(25048);e.exports=function(e,t,r){var o=null==e?void 0:n(e,t);return void 0===o?r:o}},33361:(e,t,r)=>{var n=r(69626),o=r(31859);e.exports=function(e,t){return null!=e&&o(e,t,n)}},37484:e=>{e.exports=function(e){return e}},40468:(e,t,r)=>{var n=r(99609),o=r(9749),a=Object.prototype,i=a.hasOwnProperty,s=a.propertyIsEnumerable,l=n(function(){return arguments}())?n:function(e){return o(e)&&i.call(e,"callee")&&!s.call(e,"callee")};e.exports=l},29497:e=>{var t=Array.isArray;e.exports=t},63386:(e,t,r)=>{var n=r(81001),o=r(99312);e.exports=function(e){return null!=e&&o(e.length)&&!n(e)}},74039:(e,t,r)=>{e=r.nmd(e);var n=r(53115),o=r(26708),a=t&&!t.nodeType&&t,i=a&&e&&!e.nodeType&&e,s=i&&i.exports===a?n.Buffer:void 0,l=(s?s.isBuffer:void 0)||o;e.exports=l},81001:(e,t,r)=>{var n=r(24504),o=r(28197);e.exports=function(e){if(!o(e))return!1;var t=n(e);return"[object Function]"==t||"[object GeneratorFunction]"==t||"[object AsyncFunction]"==t||"[object Proxy]"==t}},99312:e=>{e.exports=function(e){return"number"==typeof e&&e>-1&&e%1==0&&e<=9007199254740991}},59766:(e,t,r)=>{var n=r(72049),o=r(61559),a=r(87862),i=a&&a.isMap,s=i?o(i):n;e.exports=s},60627:(e,t,r)=>{var n=r(24504),o=r(91922),a=r(9749),i=Function.prototype,s=Object.prototype,l=i.toString,c=s.hasOwnProperty,u=l.call(Object);e.exports=function(e){if(!a(e)||"[object Object]"!=n(e))return!1;var t=o(e);if(null===t)return!0;var r=c.call(t,"constructor")&&t.constructor;return"function"==typeof r&&r instanceof r&&l.call(r)==u}},55795:(e,t,r)=>{var n=r(90467),o=r(61559),a=r(87862),i=a&&a.isSet,s=i?o(i):n;e.exports=s},589:(e,t,r)=>{var n=r(24504),o=r(29497),a=r(9749);e.exports=function(e){return"string"==typeof e||!o(e)&&a(e)&&"[object String]"==n(e)}},10584:(e,t,r)=>{var n=r(60922),o=r(61559),a=r(87862),i=a&&a.isTypedArray,s=i?o(i):n;e.exports=s},5072:(e,t,r)=>{var n=r(22836),o=r(12645),a=r(63386);e.exports=function(e){return a(e)?n(e):o(e)}},94234:(e,t,r)=>{var n=r(22836),o=r(89166),a=r(63386);e.exports=function(e){return a(e)?n(e,!0):o(e)}},22299:(e,t,r)=>{var n=r(59966),o=r(65325),a=r(41730),i=r(29497);e.exports=function(e,t){return(i(e)?n:a)(e,o(t,3))}},18923:(e,t,r)=>{var n=r(97955);function o(e,t){if("function"!=typeof e||null!=t&&"function"!=typeof t)throw new TypeError("Expected a function");var r=function(){var n=arguments,o=t?t.apply(this,n):n[0],a=r.cache;if(a.has(o))return a.get(o);var i=e.apply(this,n);return r.cache=a.set(o,i)||a,i};return r.cache=new(o.Cache||n),r}o.Cache=n,e.exports=o},99996:(e,t,r)=>{var n=r(97774),o=r(9128),a=r(24379),i=r(50388);e.exports=function(e){return a(e)?n(i(e)):o(e)}},39443:e=>{e.exports=function(){return[]}},26708:e=>{e.exports=function(){return!1}},57264:(e,t,r)=>{var n=r(31702);e.exports=function(e){return null==e?"":n(e)}},22831:(e,t,r)=>{"use strict";r.d(t,{AI:()=>Pa});var n=r(43001),o=r(72665),a={},i=function(e,t,r,n){var o=e+"-"+t+"-"+r+(n?"-server":"");if(a[o])return a[o];var i=function(e,t,r,n){if("undefined"==typeof document&&!n)return null;var o=n?new n:document.createElement("canvas");o.width=2*r,o.height=2*r;var a=o.getContext("2d");return a?(a.fillStyle=e,a.fillRect(0,0,o.width,o.height),a.fillStyle=t,a.fillRect(0,0,r,r),a.translate(r,r),a.fillRect(0,0,r,r),o.toDataURL()):null}(e,t,r,n);return a[o]=i,i},s=Object.assign||function(e){for(var t=1;ti?1:Math.round(100*u/i)/100,t.a!==p)return{h:t.h,s:t.s,l:t.l,a:p,source:"rgb"}}else{var f=void 0;if(n!==(f=c<0?0:c>a?1:Math.round(100*c/a)/100))return{h:t.h,s:t.s,l:t.l,a:f,source:"rgb"}}return null}(e,n.props.hsl,n.props.direction,n.props.a,n.container);t&&"function"==typeof n.props.onChange&&n.props.onChange(t,e)},n.handleMouseDown=function(e){n.handleChange(e),window.addEventListener("mousemove",n.handleChange),window.addEventListener("mouseup",n.handleMouseUp)},n.handleMouseUp=function(){n.unbindEventListeners()},n.unbindEventListeners=function(){window.removeEventListener("mousemove",n.handleChange),window.removeEventListener("mouseup",n.handleMouseUp)},f(n,r)}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,e),p(t,[{key:"componentWillUnmount",value:function(){this.unbindEventListeners()}},{key:"render",value:function(){var e=this,t=this.props.rgb,r=(0,o.ZP)({default:{alpha:{absolute:"0px 0px 0px 0px",borderRadius:this.props.radius},checkboard:{absolute:"0px 0px 0px 0px",overflow:"hidden",borderRadius:this.props.radius},gradient:{absolute:"0px 0px 0px 0px",background:"linear-gradient(to right, rgba("+t.r+","+t.g+","+t.b+", 0) 0%,\n rgba("+t.r+","+t.g+","+t.b+", 1) 100%)",boxShadow:this.props.shadow,borderRadius:this.props.radius},container:{position:"relative",height:"100%",margin:"0 3px"},pointer:{position:"absolute",left:100*t.a+"%"},slider:{width:"4px",borderRadius:"1px",height:"8px",boxShadow:"0 0 2px rgba(0, 0, 0, .6)",background:"#fff",marginTop:"1px",transform:"translateX(-2px)"}},vertical:{gradient:{background:"linear-gradient(to bottom, rgba("+t.r+","+t.g+","+t.b+", 0) 0%,\n rgba("+t.r+","+t.g+","+t.b+", 1) 100%)"},pointer:{left:0,top:100*t.a+"%"}},overwrite:u({},this.props.style)},{vertical:"vertical"===this.props.direction,overwrite:!0});return n.createElement("div",{style:r.alpha},n.createElement("div",{style:r.checkboard},n.createElement(c,{renderers:this.props.renderers})),n.createElement("div",{style:r.gradient}),n.createElement("div",{style:r.container,ref:function(t){return e.container=t},onMouseDown:this.handleMouseDown,onTouchMove:this.handleChange,onTouchStart:this.handleChange},n.createElement("div",{style:r.pointer},this.props.pointer?n.createElement(this.props.pointer,this.props):n.createElement("div",{style:r.slider}))))}}]),t}(n.PureComponent||n.Component);var d=function(){function e(e,t){for(var r=0;r-1)){var o=r.getArrowOffset(),a=38===e.keyCode?n+o:n-o;r.setUpdatedValue(a,e)}},r.handleDrag=function(e){if(r.props.dragLabel){var t=Math.round(r.props.value+e.movementX);t>=0&&t<=r.props.dragMax&&r.props.onChange&&r.props.onChange(r.getValueObjectWithLabel(t),e)}},r.handleMouseDown=function(e){r.props.dragLabel&&(e.preventDefault(),r.handleDrag(e),window.addEventListener("mousemove",r.handleDrag),window.addEventListener("mouseup",r.handleMouseUp))},r.handleMouseUp=function(){r.unbindEventListeners()},r.unbindEventListeners=function(){window.removeEventListener("mousemove",r.handleDrag),window.removeEventListener("mouseup",r.handleMouseUp)},r.state={value:String(e.value).toUpperCase(),blurValue:String(e.value).toUpperCase()},r.inputId="rc-editable-input-"+v++,r}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,e),d(t,[{key:"componentDidUpdate",value:function(e,t){this.props.value===this.state.value||e.value===this.props.value&&t.value===this.state.value||(this.input===document.activeElement?this.setState({blurValue:String(this.props.value).toUpperCase()}):this.setState({value:String(this.props.value).toUpperCase(),blurValue:!this.state.blurValue&&String(this.props.value).toUpperCase()}))}},{key:"componentWillUnmount",value:function(){this.unbindEventListeners()}},{key:"getValueObjectWithLabel",value:function(e){return function(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}({},this.props.label,e)}},{key:"getArrowOffset",value:function(){return this.props.arrowOffset||1}},{key:"setUpdatedValue",value:function(e,t){var r=this.props.label?this.getValueObjectWithLabel(e):e;this.props.onChange&&this.props.onChange(r,t),this.setState({value:e})}},{key:"render",value:function(){var e=this,t=(0,o.ZP)({default:{wrap:{position:"relative"}},"user-override":{wrap:this.props.style&&this.props.style.wrap?this.props.style.wrap:{},input:this.props.style&&this.props.style.input?this.props.style.input:{},label:this.props.style&&this.props.style.label?this.props.style.label:{}},"dragLabel-true":{label:{cursor:"ew-resize"}}},{"user-override":!0},this.props);return n.createElement("div",{style:t.wrap},n.createElement("input",{id:this.inputId,style:t.input,ref:function(t){return e.input=t},value:this.state.value,onKeyDown:this.handleKeyDown,onChange:this.handleChange,onBlur:this.handleBlur,placeholder:this.props.placeholder,spellCheck:"false"}),this.props.label&&!this.props.hideLabel?n.createElement("label",{htmlFor:this.inputId,style:t.label,onMouseDown:this.handleMouseDown},this.props.label):null)}}]),t}(n.PureComponent||n.Component);var x=function(){function e(e,t){for(var r=0;ra?0:360*(-100*c/a+100)/100,r.h!==u)return{h:u,s:r.s,l:r.l,a:r.a,source:"hsl"}}else{var p=void 0;if(p=l<0?0:l>o?359:100*l/o*360/100,r.h!==p)return{h:p,s:r.s,l:r.l,a:r.a,source:"hsl"}}return null}(e,n.props.direction,n.props.hsl,n.container);t&&"function"==typeof n.props.onChange&&n.props.onChange(t,e)},n.handleMouseDown=function(e){n.handleChange(e),window.addEventListener("mousemove",n.handleChange),window.addEventListener("mouseup",n.handleMouseUp)},n.handleMouseUp=function(){n.unbindEventListeners()},y(n,r)}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,e),x(t,[{key:"componentWillUnmount",value:function(){this.unbindEventListeners()}},{key:"unbindEventListeners",value:function(){window.removeEventListener("mousemove",this.handleChange),window.removeEventListener("mouseup",this.handleMouseUp)}},{key:"render",value:function(){var e=this,t=this.props.direction,r=void 0===t?"horizontal":t,a=(0,o.ZP)({default:{hue:{absolute:"0px 0px 0px 0px",borderRadius:this.props.radius,boxShadow:this.props.shadow},container:{padding:"0 2px",position:"relative",height:"100%",borderRadius:this.props.radius},pointer:{position:"absolute",left:100*this.props.hsl.h/360+"%"},slider:{marginTop:"1px",width:"4px",borderRadius:"1px",height:"8px",boxShadow:"0 0 2px rgba(0, 0, 0, .6)",background:"#fff",transform:"translateX(-2px)"}},vertical:{pointer:{left:"0px",top:-100*this.props.hsl.h/360+100+"%"}}},{vertical:"vertical"===r});return n.createElement("div",{style:a.hue},n.createElement("div",{className:"hue-"+r,style:a.container,ref:function(t){return e.container=t},onMouseDown:this.handleMouseDown,onTouchMove:this.handleChange,onTouchStart:this.handleChange},n.createElement("style",null,"\n .hue-horizontal {\n background: linear-gradient(to right, #f00 0%, #ff0 17%, #0f0\n 33%, #0ff 50%, #00f 67%, #f0f 83%, #f00 100%);\n background: -webkit-linear-gradient(to right, #f00 0%, #ff0\n 17%, #0f0 33%, #0ff 50%, #00f 67%, #f0f 83%, #f00 100%);\n }\n\n .hue-vertical {\n background: linear-gradient(to top, #f00 0%, #ff0 17%, #0f0 33%,\n #0ff 50%, #00f 67%, #f0f 83%, #f00 100%);\n background: -webkit-linear-gradient(to top, #f00 0%, #ff0 17%,\n #0f0 33%, #0ff 50%, #00f 67%, #f0f 83%, #f00 100%);\n }\n "),n.createElement("div",{style:a.pointer},this.props.pointer?n.createElement(this.props.pointer,this.props):n.createElement("div",{style:a.slider}))))}}]),t}(n.PureComponent||n.Component);var w=r(3827),_=r.n(w);const E=function(){this.__data__=[],this.size=0};const j=function(e,t){return e===t||e!=e&&t!=t};const O=function(e,t){for(var r=e.length;r--;)if(j(e[r][0],t))return r;return-1};var C=Array.prototype.splice;const S=function(e){var t=this.__data__,r=O(t,e);return!(r<0)&&(r==t.length-1?t.pop():C.call(t,r,1),--this.size,!0)};const k=function(e){var t=this.__data__,r=O(t,e);return r<0?void 0:t[r][1]};const A=function(e){return O(this.__data__,e)>-1};const M=function(e,t){var r=this.__data__,n=O(r,e);return n<0?(++this.size,r.push([e,t])):r[n][1]=t,this};function P(e){var t=-1,r=null==e?0:e.length;for(this.clear();++t-1&&e%1==0&&e<=9007199254740991};const ut=function(e){return null!=e&&ct(e.length)&&!K(e)};const pt=function(e){return rt(e)&&ut(e)};const ft=function(){return!1};var ht="object"==typeof exports&&exports&&!exports.nodeType&&exports,dt=ht&&"object"==typeof module&&module&&!module.nodeType&&module,bt=dt&&dt.exports===ht?L.Buffer:void 0;const vt=(bt?bt.isBuffer:void 0)||ft;var gt=Function.prototype,xt=Object.prototype,yt=gt.toString,mt=xt.hasOwnProperty,wt=yt.call(Object);const _t=function(e){if(!rt(e)||"[object Object]"!=q(e))return!1;var t=Je(e);if(null===t)return!0;var r=mt.call(t,"constructor")&&t.constructor;return"function"==typeof r&&r instanceof r&&yt.call(r)==wt};var Et={};Et["[object Float32Array]"]=Et["[object Float64Array]"]=Et["[object Int8Array]"]=Et["[object Int16Array]"]=Et["[object Int32Array]"]=Et["[object Uint8Array]"]=Et["[object Uint8ClampedArray]"]=Et["[object Uint16Array]"]=Et["[object Uint32Array]"]=!0,Et["[object Arguments]"]=Et["[object Array]"]=Et["[object ArrayBuffer]"]=Et["[object Boolean]"]=Et["[object DataView]"]=Et["[object Date]"]=Et["[object Error]"]=Et["[object Function]"]=Et["[object Map]"]=Et["[object Number]"]=Et["[object Object]"]=Et["[object RegExp]"]=Et["[object Set]"]=Et["[object String]"]=Et["[object WeakMap]"]=!1;const jt=function(e){return rt(e)&&ct(e.length)&&!!Et[q(e)]};const Ot=function(e){return function(t){return e(t)}};var Ct="object"==typeof exports&&exports&&!exports.nodeType&&exports,St=Ct&&"object"==typeof module&&module&&!module.nodeType&&module,kt=St&&St.exports===Ct&&H.process,At=function(){try{var e=St&&St.require&&St.require("util").types;return e||kt&&kt.binding&&kt.binding("util")}catch(e){}}();var Mt=At&&At.isTypedArray;const Pt=Mt?Ot(Mt):jt;const Rt=function(e,t){if(("constructor"!==t||"function"!=typeof e[t])&&"__proto__"!=t)return e[t]};var Ft=Object.prototype.hasOwnProperty;const Bt=function(e,t,r){var n=e[t];Ft.call(e,t)&&j(n,r)&&(void 0!==r||t in e)||He(e,t,r)};const zt=function(e,t,r,n){var o=!r;r||(r={});for(var a=-1,i=t.length;++a-1&&e%1==0&&e0){if(++t>=800)return arguments[0]}else t=0;return e.apply(void 0,arguments)}}(Qt);const rr=function(e,t){return tr(Kt(e,t,$t),e+"")};const nr=function(e,t,r){if(!Y(r))return!1;var n=typeof t;return!!("number"==n?ut(r)&&Dt(t,r.length):"string"==n&&t in r)&&j(r[t],e)};const or=function(e){return rr((function(t,r){var n=-1,o=r.length,a=o>1?r[o-1]:void 0,i=o>2?r[2]:void 0;for(a=e.length>3&&"function"==typeof a?(o--,a):void 0,i&&nr(r[0],r[1],i)&&(a=o<3?void 0:a,o=1),t=Object(t);++n=t||r<0||p&&e-c>=a}function b(){var e=sr();if(d(e))return v(e);s=setTimeout(b,function(e){var r=t-(e-l);return p?yr(r,a-(e-c)):r}(e))}function v(e){return s=void 0,f&&n?h(e):(n=o=void 0,i)}function g(){var e=sr(),r=d(e);if(n=arguments,o=this,l=e,r){if(void 0===s)return function(e){return c=e,s=setTimeout(b,t),u?h(e):i}(l);if(p)return clearTimeout(s),s=setTimeout(b,t),h(l)}return void 0===s&&(s=setTimeout(b,t)),i}return t=gr(t)||0,Y(r)&&(u=!!r.leading,a=(p="maxWait"in r)?xr(gr(r.maxWait)||0,t):a,f="trailing"in r?!!r.trailing:f),g.cancel=function(){void 0!==s&&clearTimeout(s),c=0,n=l=o=s=void 0},g.flush=function(){return void 0===s?i:v(sr())},g};const wr=function(e,t,r){var n=!0,o=!0;if("function"!=typeof e)throw new TypeError("Expected a function");return Y(r)&&(n="leading"in r?!!r.leading:n,o="trailing"in r?!!r.trailing:o),mr(e,t,{leading:n,maxWait:t,trailing:o})};var _r=function(){function e(e,t){for(var r=0;ro&&(l=o),c<0?c=0:c>a&&(c=a);var u=l/o,p=1-c/a;return{h:t.h,s:u,v:p,a:t.a,source:"hsv"}}(e,r.props.hsl,r.container),e)},r.handleMouseDown=function(e){r.handleChange(e);var t=r.getContainerRenderWindow();t.addEventListener("mousemove",r.handleChange),t.addEventListener("mouseup",r.handleMouseUp)},r.handleMouseUp=function(){r.unbindEventListeners()},r.throttle=wr((function(e,t,r){e(t,r)}),50),r}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,e),_r(t,[{key:"componentWillUnmount",value:function(){this.throttle.cancel(),this.unbindEventListeners()}},{key:"getContainerRenderWindow",value:function(){for(var e=this.container,t=window;!t.document.contains(e)&&t.parent!==t;)t=t.parent;return t}},{key:"unbindEventListeners",value:function(){var e=this.getContainerRenderWindow();e.removeEventListener("mousemove",this.handleChange),e.removeEventListener("mouseup",this.handleMouseUp)}},{key:"render",value:function(){var e=this,t=this.props.style||{},r=t.color,a=t.white,i=t.black,s=t.pointer,l=t.circle,c=(0,o.ZP)({default:{color:{absolute:"0px 0px 0px 0px",background:"hsl("+this.props.hsl.h+",100%, 50%)",borderRadius:this.props.radius},white:{absolute:"0px 0px 0px 0px",borderRadius:this.props.radius},black:{absolute:"0px 0px 0px 0px",boxShadow:this.props.shadow,borderRadius:this.props.radius},pointer:{position:"absolute",top:-100*this.props.hsv.v+100+"%",left:100*this.props.hsv.s+"%",cursor:"default"},circle:{width:"4px",height:"4px",boxShadow:"0 0 0 1.5px #fff, inset 0 0 1px 1px rgba(0,0,0,.3),\n 0 0 1px 2px rgba(0,0,0,.4)",borderRadius:"50%",cursor:"hand",transform:"translate(-2px, -2px)"}},custom:{color:r,white:a,black:i,pointer:s,circle:l}},{custom:!!this.props.style});return n.createElement("div",{style:c.color,ref:function(t){return e.container=t},onMouseDown:this.handleMouseDown,onTouchMove:this.handleChange,onTouchStart:this.handleChange},n.createElement("style",null,"\n .saturation-white {\n background: -webkit-linear-gradient(to right, #fff, rgba(255,255,255,0));\n background: linear-gradient(to right, #fff, rgba(255,255,255,0));\n }\n .saturation-black {\n background: -webkit-linear-gradient(to top, #000, rgba(0,0,0,0));\n background: linear-gradient(to top, #000, rgba(0,0,0,0));\n }\n "),n.createElement("div",{style:c.white,className:"saturation-white"},n.createElement("div",{style:c.black,className:"saturation-black"}),n.createElement("div",{style:c.pointer},this.props.pointer?n.createElement(this.props.pointer,this.props):n.createElement("div",{style:c.circle}))))}}]),t}(n.PureComponent||n.Component);const jr=Er;const Or=function(e,t){for(var r=-1,n=null==e?0:e.length;++r1&&(r-=1),r<1/6?e+6*(t-e)*r:r<.5?t:r<2/3?e+(t-e)*(2/3-r)*6:e}if(e=rn(e,360),t=rn(t,100),r=rn(r,100),0===t)n=o=a=r;else{var s=r<.5?r*(1+t):r+t-r*t,l=2*r-s;n=i(l,s,e+1/3),o=i(l,s,e),a=i(l,s,e-1/3)}return{r:255*n,g:255*o,b:255*a}}(e.h,n,a),i=!0,s="hsl"),e.hasOwnProperty("a")&&(r=e.a));var l,c,u;return r=tn(r),{ok:i,format:e.format||s,r:Math.min(255,Math.max(t.r,0)),g:Math.min(255,Math.max(t.g,0)),b:Math.min(255,Math.max(t.b,0)),a:r}}(e);this._originalInput=e,this._r=r.r,this._g=r.g,this._b=r.b,this._a=r.a,this._roundA=Math.round(100*this._a)/100,this._format=t.format||r.format,this._gradientType=t.gradientType,this._r<1&&(this._r=Math.round(this._r)),this._g<1&&(this._g=Math.round(this._g)),this._b<1&&(this._b=Math.round(this._b)),this._ok=r.ok}function Hr(e,t,r){e=rn(e,255),t=rn(t,255),r=rn(r,255);var n,o,a=Math.max(e,t,r),i=Math.min(e,t,r),s=(a+i)/2;if(a==i)n=o=0;else{var l=a-i;switch(o=s>.5?l/(2-a-i):l/(a+i),a){case e:n=(t-r)/l+(t>1)+720)%360;--t;)n.h=(n.h+o)%360,a.push(Tr(n));return a}function Jr(e,t){t=t||6;for(var r=Tr(e).toHsv(),n=r.h,o=r.s,a=r.v,i=[],s=1/t;t--;)i.push(Tr({h:n,s:o,v:a})),a=(a+s)%1;return i}Tr.prototype={isDark:function(){return this.getBrightness()<128},isLight:function(){return!this.isDark()},isValid:function(){return this._ok},getOriginalInput:function(){return this._originalInput},getFormat:function(){return this._format},getAlpha:function(){return this._a},getBrightness:function(){var e=this.toRgb();return(299*e.r+587*e.g+114*e.b)/1e3},getLuminance:function(){var e,t,r,n=this.toRgb();return e=n.r/255,t=n.g/255,r=n.b/255,.2126*(e<=.03928?e/12.92:Math.pow((e+.055)/1.055,2.4))+.7152*(t<=.03928?t/12.92:Math.pow((t+.055)/1.055,2.4))+.0722*(r<=.03928?r/12.92:Math.pow((r+.055)/1.055,2.4))},setAlpha:function(e){return this._a=tn(e),this._roundA=Math.round(100*this._a)/100,this},toHsv:function(){var e=Dr(this._r,this._g,this._b);return{h:360*e.h,s:e.s,v:e.v,a:this._a}},toHsvString:function(){var e=Dr(this._r,this._g,this._b),t=Math.round(360*e.h),r=Math.round(100*e.s),n=Math.round(100*e.v);return 1==this._a?"hsv("+t+", "+r+"%, "+n+"%)":"hsva("+t+", "+r+"%, "+n+"%, "+this._roundA+")"},toHsl:function(){var e=Hr(this._r,this._g,this._b);return{h:360*e.h,s:e.s,l:e.l,a:this._a}},toHslString:function(){var e=Hr(this._r,this._g,this._b),t=Math.round(360*e.h),r=Math.round(100*e.s),n=Math.round(100*e.l);return 1==this._a?"hsl("+t+", "+r+"%, "+n+"%)":"hsla("+t+", "+r+"%, "+n+"%, "+this._roundA+")"},toHex:function(e){return Lr(this._r,this._g,this._b,e)},toHexString:function(e){return"#"+this.toHex(e)},toHex8:function(e){return function(e,t,r,n,o){var a=[an(Math.round(e).toString(16)),an(Math.round(t).toString(16)),an(Math.round(r).toString(16)),an(ln(n))];if(o&&a[0].charAt(0)==a[0].charAt(1)&&a[1].charAt(0)==a[1].charAt(1)&&a[2].charAt(0)==a[2].charAt(1)&&a[3].charAt(0)==a[3].charAt(1))return a[0].charAt(0)+a[1].charAt(0)+a[2].charAt(0)+a[3].charAt(0);return a.join("")}(this._r,this._g,this._b,this._a,e)},toHex8String:function(e){return"#"+this.toHex8(e)},toRgb:function(){return{r:Math.round(this._r),g:Math.round(this._g),b:Math.round(this._b),a:this._a}},toRgbString:function(){return 1==this._a?"rgb("+Math.round(this._r)+", "+Math.round(this._g)+", "+Math.round(this._b)+")":"rgba("+Math.round(this._r)+", "+Math.round(this._g)+", "+Math.round(this._b)+", "+this._roundA+")"},toPercentageRgb:function(){return{r:Math.round(100*rn(this._r,255))+"%",g:Math.round(100*rn(this._g,255))+"%",b:Math.round(100*rn(this._b,255))+"%",a:this._a}},toPercentageRgbString:function(){return 1==this._a?"rgb("+Math.round(100*rn(this._r,255))+"%, "+Math.round(100*rn(this._g,255))+"%, "+Math.round(100*rn(this._b,255))+"%)":"rgba("+Math.round(100*rn(this._r,255))+"%, "+Math.round(100*rn(this._g,255))+"%, "+Math.round(100*rn(this._b,255))+"%, "+this._roundA+")"},toName:function(){return 0===this._a?"transparent":!(this._a<1)&&(en[Lr(this._r,this._g,this._b,!0)]||!1)},toFilter:function(e){var t="#"+Nr(this._r,this._g,this._b,this._a),r=t,n=this._gradientType?"GradientType = 1, ":"";if(e){var o=Tr(e);r="#"+Nr(o._r,o._g,o._b,o._a)}return"progid:DXImageTransform.Microsoft.gradient("+n+"startColorstr="+t+",endColorstr="+r+")"},toString:function(e){var t=!!e;e=e||this._format;var r=!1,n=this._a<1&&this._a>=0;return t||!n||"hex"!==e&&"hex6"!==e&&"hex3"!==e&&"hex4"!==e&&"hex8"!==e&&"name"!==e?("rgb"===e&&(r=this.toRgbString()),"prgb"===e&&(r=this.toPercentageRgbString()),"hex"!==e&&"hex6"!==e||(r=this.toHexString()),"hex3"===e&&(r=this.toHexString(!0)),"hex4"===e&&(r=this.toHex8String(!0)),"hex8"===e&&(r=this.toHex8String()),"name"===e&&(r=this.toName()),"hsl"===e&&(r=this.toHslString()),"hsv"===e&&(r=this.toHsvString()),r||this.toHexString()):"name"===e&&0===this._a?this.toName():this.toRgbString()},clone:function(){return Tr(this.toString())},_applyModification:function(e,t){var r=e.apply(null,[this].concat([].slice.call(t)));return this._r=r._r,this._g=r._g,this._b=r._b,this.setAlpha(r._a),this},lighten:function(){return this._applyModification(Gr,arguments)},brighten:function(){return this._applyModification(Wr,arguments)},darken:function(){return this._applyModification(Vr,arguments)},desaturate:function(){return this._applyModification(Ir,arguments)},saturate:function(){return this._applyModification(Ur,arguments)},greyscale:function(){return this._applyModification(Zr,arguments)},spin:function(){return this._applyModification(Xr,arguments)},_applyCombination:function(e,t){return e.apply(null,[this].concat([].slice.call(t)))},analogous:function(){return this._applyCombination(Kr,arguments)},complement:function(){return this._applyCombination($r,arguments)},monochromatic:function(){return this._applyCombination(Jr,arguments)},splitcomplement:function(){return this._applyCombination(Yr,arguments)},triad:function(){return this._applyCombination(qr,[3])},tetrad:function(){return this._applyCombination(qr,[4])}},Tr.fromRatio=function(e,t){if("object"==Fr(e)){var r={};for(var n in e)e.hasOwnProperty(n)&&(r[n]="a"===n?e[n]:sn(e[n]));e=r}return Tr(e,t)},Tr.equals=function(e,t){return!(!e||!t)&&Tr(e).toRgbString()==Tr(t).toRgbString()},Tr.random=function(){return Tr.fromRatio({r:Math.random(),g:Math.random(),b:Math.random()})},Tr.mix=function(e,t,r){r=0===r?0:r||50;var n=Tr(e).toRgb(),o=Tr(t).toRgb(),a=r/100;return Tr({r:(o.r-n.r)*a+n.r,g:(o.g-n.g)*a+n.g,b:(o.b-n.b)*a+n.b,a:(o.a-n.a)*a+n.a})},Tr.readability=function(e,t){var r=Tr(e),n=Tr(t);return(Math.max(r.getLuminance(),n.getLuminance())+.05)/(Math.min(r.getLuminance(),n.getLuminance())+.05)},Tr.isReadable=function(e,t,r){var n,o,a=Tr.readability(e,t);switch(o=!1,(n=function(e){var t,r;t=((e=e||{level:"AA",size:"small"}).level||"AA").toUpperCase(),r=(e.size||"small").toLowerCase(),"AA"!==t&&"AAA"!==t&&(t="AA");"small"!==r&&"large"!==r&&(r="small");return{level:t,size:r}}(r)).level+n.size){case"AAsmall":case"AAAlarge":o=a>=4.5;break;case"AAlarge":o=a>=3;break;case"AAAsmall":o=a>=7}return o},Tr.mostReadable=function(e,t,r){var n,o,a,i,s=null,l=0;o=(r=r||{}).includeFallbackColors,a=r.level,i=r.size;for(var c=0;cl&&(l=n,s=Tr(t[c]));return Tr.isReadable(e,s,{level:a,size:i})||!o?s:(r.includeFallbackColors=!1,Tr.mostReadable(e,["#fff","#000"],r))};var Qr=Tr.names={aliceblue:"f0f8ff",antiquewhite:"faebd7",aqua:"0ff",aquamarine:"7fffd4",azure:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"000",blanchedalmond:"ffebcd",blue:"00f",blueviolet:"8a2be2",brown:"a52a2a",burlywood:"deb887",burntsienna:"ea7e5d",cadetblue:"5f9ea0",chartreuse:"7fff00",chocolate:"d2691e",coral:"ff7f50",cornflowerblue:"6495ed",cornsilk:"fff8dc",crimson:"dc143c",cyan:"0ff",darkblue:"00008b",darkcyan:"008b8b",darkgoldenrod:"b8860b",darkgray:"a9a9a9",darkgreen:"006400",darkgrey:"a9a9a9",darkkhaki:"bdb76b",darkmagenta:"8b008b",darkolivegreen:"556b2f",darkorange:"ff8c00",darkorchid:"9932cc",darkred:"8b0000",darksalmon:"e9967a",darkseagreen:"8fbc8f",darkslateblue:"483d8b",darkslategray:"2f4f4f",darkslategrey:"2f4f4f",darkturquoise:"00ced1",darkviolet:"9400d3",deeppink:"ff1493",deepskyblue:"00bfff",dimgray:"696969",dimgrey:"696969",dodgerblue:"1e90ff",firebrick:"b22222",floralwhite:"fffaf0",forestgreen:"228b22",fuchsia:"f0f",gainsboro:"dcdcdc",ghostwhite:"f8f8ff",gold:"ffd700",goldenrod:"daa520",gray:"808080",green:"008000",greenyellow:"adff2f",grey:"808080",honeydew:"f0fff0",hotpink:"ff69b4",indianred:"cd5c5c",indigo:"4b0082",ivory:"fffff0",khaki:"f0e68c",lavender:"e6e6fa",lavenderblush:"fff0f5",lawngreen:"7cfc00",lemonchiffon:"fffacd",lightblue:"add8e6",lightcoral:"f08080",lightcyan:"e0ffff",lightgoldenrodyellow:"fafad2",lightgray:"d3d3d3",lightgreen:"90ee90",lightgrey:"d3d3d3",lightpink:"ffb6c1",lightsalmon:"ffa07a",lightseagreen:"20b2aa",lightskyblue:"87cefa",lightslategray:"789",lightslategrey:"789",lightsteelblue:"b0c4de",lightyellow:"ffffe0",lime:"0f0",limegreen:"32cd32",linen:"faf0e6",magenta:"f0f",maroon:"800000",mediumaquamarine:"66cdaa",mediumblue:"0000cd",mediumorchid:"ba55d3",mediumpurple:"9370db",mediumseagreen:"3cb371",mediumslateblue:"7b68ee",mediumspringgreen:"00fa9a",mediumturquoise:"48d1cc",mediumvioletred:"c71585",midnightblue:"191970",mintcream:"f5fffa",mistyrose:"ffe4e1",moccasin:"ffe4b5",navajowhite:"ffdead",navy:"000080",oldlace:"fdf5e6",olive:"808000",olivedrab:"6b8e23",orange:"ffa500",orangered:"ff4500",orchid:"da70d6",palegoldenrod:"eee8aa",palegreen:"98fb98",paleturquoise:"afeeee",palevioletred:"db7093",papayawhip:"ffefd5",peachpuff:"ffdab9",peru:"cd853f",pink:"ffc0cb",plum:"dda0dd",powderblue:"b0e0e6",purple:"800080",rebeccapurple:"663399",red:"f00",rosybrown:"bc8f8f",royalblue:"4169e1",saddlebrown:"8b4513",salmon:"fa8072",sandybrown:"f4a460",seagreen:"2e8b57",seashell:"fff5ee",sienna:"a0522d",silver:"c0c0c0",skyblue:"87ceeb",slateblue:"6a5acd",slategray:"708090",slategrey:"708090",snow:"fffafa",springgreen:"00ff7f",steelblue:"4682b4",tan:"d2b48c",teal:"008080",thistle:"d8bfd8",tomato:"ff6347",turquoise:"40e0d0",violet:"ee82ee",wheat:"f5deb3",white:"fff",whitesmoke:"f5f5f5",yellow:"ff0",yellowgreen:"9acd32"},en=Tr.hexNames=function(e){var t={};for(var r in e)e.hasOwnProperty(r)&&(t[e[r]]=r);return t}(Qr);function tn(e){return e=parseFloat(e),(isNaN(e)||e<0||e>1)&&(e=1),e}function rn(e,t){(function(e){return"string"==typeof e&&-1!=e.indexOf(".")&&1===parseFloat(e)})(e)&&(e="100%");var r=function(e){return"string"==typeof e&&-1!=e.indexOf("%")}(e);return e=Math.min(t,Math.max(0,parseFloat(e))),r&&(e=parseInt(e*t,10)/100),Math.abs(e-t)<1e-6?1:e%t/parseFloat(t)}function nn(e){return Math.min(1,Math.max(0,e))}function on(e){return parseInt(e,16)}function an(e){return 1==e.length?"0"+e:""+e}function sn(e){return e<=1&&(e=100*e+"%"),e}function ln(e){return Math.round(255*parseFloat(e)).toString(16)}function cn(e){return on(e)/255}var un,pn,fn,hn=(pn="[\\s|\\(]+("+(un="(?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?)")+")[,|\\s]+("+un+")[,|\\s]+("+un+")\\s*\\)?",fn="[\\s|\\(]+("+un+")[,|\\s]+("+un+")[,|\\s]+("+un+")[,|\\s]+("+un+")\\s*\\)?",{CSS_UNIT:new RegExp(un),rgb:new RegExp("rgb"+pn),rgba:new RegExp("rgba"+fn),hsl:new RegExp("hsl"+pn),hsla:new RegExp("hsla"+fn),hsv:new RegExp("hsv"+pn),hsva:new RegExp("hsva"+fn),hex3:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex6:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,hex4:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex8:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/});function dn(e){return!!hn.CSS_UNIT.exec(e)}var bn=function(e){var t=0,r=0;return Rr(["r","g","b","a","h","s","l","v"],(function(n){if(e[n]&&(t+=1,isNaN(e[n])||(r+=1),"s"===n||"l"===n)){/^\d+%$/.test(e[n])&&(r+=1)}})),t===r&&e},vn=function(e,t){var r=e.hex?Tr(e.hex):Tr(e),n=r.toHsl(),o=r.toHsv(),a=r.toRgb(),i=r.toHex();return 0===n.s&&(n.h=t||0,o.h=t||0),{hsl:n,hex:"000000"===i&&0===a.a?"transparent":"#"+i,rgb:a,hsv:o,oldHue:e.h||t||n.h,source:e.source}},gn=function(e){if("transparent"===e)return!0;var t="#"===String(e).charAt(0)?1:0;return e.length!==4+t&&e.length<7+t&&Tr(e).isValid()},xn=function(e){if(!e)return"#fff";var t=vn(e);return"transparent"===t.hex?"rgba(0,0,0,0.4)":(299*t.rgb.r+587*t.rgb.g+114*t.rgb.b)/1e3>=128?"#000":"#fff"},yn=function(e,t){return Tr(t+" ("+e.replace("°","")+")")._ok},mn=Object.assign||function(e){for(var t=1;t1&&void 0!==arguments[1]?arguments[1]:"span";return function(r){function o(){var e,t,r;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,o);for(var n=arguments.length,a=Array(n),i=0;is))return!1;var c=a.get(e),u=a.get(t);if(c&&u)return c==t&&u==e;var p=-1,f=!0,h=2&r?new zn:void 0;for(a.set(e,t),a.set(t,e);++p1&&(e.a=1),r.props.onChange({h:r.props.hsl.h,s:r.props.hsl.s,l:r.props.hsl.l,a:Math.round(100*e.a)/100,source:"rgb"},t)):(e.h||e.s||e.l)&&("string"==typeof e.s&&e.s.includes("%")&&(e.s=e.s.replace("%","")),"string"==typeof e.l&&e.l.includes("%")&&(e.l=e.l.replace("%","")),1==e.s?e.s=.01:1==e.l&&(e.l=.01),r.props.onChange({h:e.h||r.props.hsl.h,s:Number(Ea(e.s)?r.props.hsl.s:e.s),l:Number(Ea(e.l)?r.props.hsl.l:e.l),source:"hsl"},t))},r.showHighlight=function(e){e.currentTarget.style.background="#eee"},r.hideHighlight=function(e){e.currentTarget.style.background="transparent"},1!==e.hsl.a&&"hex"===e.view?r.state={view:"rgb"}:r.state={view:e.view},r}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,e),Oa(t,[{key:"render",value:function(){var e=this,t=(0,o.ZP)({default:{wrap:{paddingTop:"16px",display:"flex"},fields:{flex:"1",display:"flex",marginLeft:"-6px"},field:{paddingLeft:"6px",width:"100%"},alpha:{paddingLeft:"6px",width:"100%"},toggle:{width:"32px",textAlign:"right",position:"relative"},icon:{marginRight:"-4px",marginTop:"12px",cursor:"pointer",position:"relative"},iconHighlight:{position:"absolute",width:"24px",height:"28px",background:"#eee",borderRadius:"4px",top:"10px",left:"12px",display:"none"},input:{fontSize:"11px",color:"#333",width:"100%",borderRadius:"2px",border:"none",boxShadow:"inset 0 0 0 1px #dadada",height:"21px",textAlign:"center"},label:{textTransform:"uppercase",fontSize:"11px",lineHeight:"11px",color:"#969696",textAlign:"center",display:"block",marginTop:"12px"},svg:{fill:"#333",width:"24px",height:"24px",border:"1px transparent solid",borderRadius:"5px"}},disableAlpha:{alpha:{display:"none"}}},this.props,this.state),r=void 0;return"hex"===this.state.view?r=n.createElement("div",{style:t.fields,className:"flexbox-fix"},n.createElement("div",{style:t.field},n.createElement(g,{style:{input:t.input,label:t.label},label:"hex",value:this.props.hex,onChange:this.handleChange}))):"rgb"===this.state.view?r=n.createElement("div",{style:t.fields,className:"flexbox-fix"},n.createElement("div",{style:t.field},n.createElement(g,{style:{input:t.input,label:t.label},label:"r",value:this.props.rgb.r,onChange:this.handleChange})),n.createElement("div",{style:t.field},n.createElement(g,{style:{input:t.input,label:t.label},label:"g",value:this.props.rgb.g,onChange:this.handleChange})),n.createElement("div",{style:t.field},n.createElement(g,{style:{input:t.input,label:t.label},label:"b",value:this.props.rgb.b,onChange:this.handleChange})),n.createElement("div",{style:t.alpha},n.createElement(g,{style:{input:t.input,label:t.label},label:"a",value:this.props.rgb.a,arrowOffset:.01,onChange:this.handleChange}))):"hsl"===this.state.view&&(r=n.createElement("div",{style:t.fields,className:"flexbox-fix"},n.createElement("div",{style:t.field},n.createElement(g,{style:{input:t.input,label:t.label},label:"h",value:Math.round(this.props.hsl.h),onChange:this.handleChange})),n.createElement("div",{style:t.field},n.createElement(g,{style:{input:t.input,label:t.label},label:"s",value:Math.round(100*this.props.hsl.s)+"%",onChange:this.handleChange})),n.createElement("div",{style:t.field},n.createElement(g,{style:{input:t.input,label:t.label},label:"l",value:Math.round(100*this.props.hsl.l)+"%",onChange:this.handleChange})),n.createElement("div",{style:t.alpha},n.createElement(g,{style:{input:t.input,label:t.label},label:"a",value:this.props.hsl.a,arrowOffset:.01,onChange:this.handleChange})))),n.createElement("div",{style:t.wrap,className:"flexbox-fix"},r,n.createElement("div",{style:t.toggle},n.createElement("div",{style:t.icon,onClick:this.toggleViews,ref:function(t){return e.icon=t}},n.createElement(ja.Z,{style:t.svg,onMouseOver:this.showHighlight,onMouseEnter:this.showHighlight,onMouseOut:this.hideHighlight}))))}}],[{key:"getDerivedStateFromProps",value:function(e,t){return 1!==e.hsl.a&&"hex"===t.view?{view:"rgb"}:null}}]),t}(n.Component);Ca.defaultProps={view:"hex"};const Sa=Ca;const ka=function(){var e=(0,o.ZP)({default:{picker:{width:"12px",height:"12px",borderRadius:"6px",transform:"translate(-6px, -1px)",backgroundColor:"rgb(248, 248, 248)",boxShadow:"0 1px 4px 0 rgba(0, 0, 0, 0.37)"}}});return n.createElement("div",{style:e.picker})};const Aa=function(){var e=(0,o.ZP)({default:{picker:{width:"12px",height:"12px",borderRadius:"6px",boxShadow:"inset 0 0 0 1px #fff",transform:"translate(-6px, -6px)"}}});return n.createElement("div",{style:e.picker})};var Ma=function(e){var t=e.width,r=e.onChange,a=e.disableAlpha,i=e.rgb,s=e.hsl,l=e.hsv,u=e.hex,p=e.renderers,f=e.styles,d=void 0===f?{}:f,b=e.className,v=void 0===b?"":b,g=e.defaultView,x=(0,o.ZP)(or({default:{picker:{width:t,background:"#fff",borderRadius:"2px",boxShadow:"0 0 2px rgba(0,0,0,.3), 0 4px 8px rgba(0,0,0,.3)",boxSizing:"initial",fontFamily:"Menlo"},saturation:{width:"100%",paddingBottom:"55%",position:"relative",borderRadius:"2px 2px 0 0",overflow:"hidden"},Saturation:{radius:"2px 2px 0 0"},body:{padding:"16px 16px 12px"},controls:{display:"flex"},color:{width:"32px"},swatch:{marginTop:"6px",width:"16px",height:"16px",borderRadius:"8px",position:"relative",overflow:"hidden"},active:{absolute:"0px 0px 0px 0px",borderRadius:"8px",boxShadow:"inset 0 0 0 1px rgba(0,0,0,.1)",background:"rgba("+i.r+", "+i.g+", "+i.b+", "+i.a+")",zIndex:"2"},toggles:{flex:"1"},hue:{height:"10px",position:"relative",marginBottom:"8px"},Hue:{radius:"2px"},alpha:{height:"10px",position:"relative"},Alpha:{radius:"2px"}},disableAlpha:{color:{width:"22px"},alpha:{display:"none"},hue:{marginBottom:"0px"},swatch:{width:"10px",height:"10px",marginTop:"0px"}}},d),{disableAlpha:a});return n.createElement("div",{style:x.picker,className:"chrome-picker "+v},n.createElement("div",{style:x.saturation},n.createElement(jr,{style:x.Saturation,hsl:s,hsv:l,pointer:Aa,onChange:r})),n.createElement("div",{style:x.body},n.createElement("div",{style:x.controls,className:"flexbox-fix"},n.createElement("div",{style:x.color},n.createElement("div",{style:x.swatch},n.createElement("div",{style:x.active}),n.createElement(c,{renderers:p}))),n.createElement("div",{style:x.toggles},n.createElement("div",{style:x.hue},n.createElement(m,{style:x.Hue,hsl:s,pointer:ka,onChange:r})),n.createElement("div",{style:x.alpha},n.createElement(h,{style:x.Alpha,rgb:i,hsl:s,pointer:ka,renderers:p,onChange:r})))),n.createElement(Sa,{rgb:i,hsl:s,hex:u,view:g,onChange:r,disableAlpha:a})))};Ma.propTypes={width:_().oneOfType([_().string,_().number]),disableAlpha:_().bool,styles:_().object,defaultView:_().oneOf(["hex","rgb","hsl"])},Ma.defaultProps={width:225,disableAlpha:!1,styles:{}};const Pa=_n(Ma);const Ra=function(e){var t=e.color,r=e.onClick,a=void 0===r?function(){}:r,i=e.onSwatchHover,s=e.active,l=(0,o.ZP)({default:{color:{background:t,width:"15px",height:"15px",float:"left",marginRight:"5px",marginBottom:"5px",position:"relative",cursor:"pointer"},dot:{absolute:"5px 5px 5px 5px",background:xn(t),borderRadius:"50%",opacity:"0"}},active:{dot:{opacity:"1"}},"color-#FFFFFF":{color:{boxShadow:"inset 0 0 0 1px #ddd"},dot:{background:"#000"}},transparent:{dot:{background:"#000"}}},{active:s,"color-#FFFFFF":"#FFFFFF"===t,transparent:"transparent"===t});return n.createElement(Sn,{style:l.color,color:t,onClick:a,onHover:i,focusStyle:{boxShadow:"0 0 4px "+t}},n.createElement("div",{style:l.dot}))};const Fa=function(e){var t=e.hex,r=e.rgb,a=e.onChange,i=(0,o.ZP)({default:{fields:{display:"flex",paddingBottom:"6px",paddingRight:"5px",position:"relative"},active:{position:"absolute",top:"6px",left:"5px",height:"9px",width:"9px",background:t},HEXwrap:{flex:"6",position:"relative"},HEXinput:{width:"80%",padding:"0px",paddingLeft:"20%",border:"none",outline:"none",background:"none",fontSize:"12px",color:"#333",height:"16px"},HEXlabel:{display:"none"},RGBwrap:{flex:"3",position:"relative"},RGBinput:{width:"70%",padding:"0px",paddingLeft:"30%",border:"none",outline:"none",background:"none",fontSize:"12px",color:"#333",height:"16px"},RGBlabel:{position:"absolute",top:"3px",left:"0px",lineHeight:"16px",textTransform:"uppercase",fontSize:"12px",color:"#999"}}}),s=function(e,t){e.r||e.g||e.b?a({r:e.r||r.r,g:e.g||r.g,b:e.b||r.b,source:"rgb"},t):a({hex:e.hex,source:"hex"},t)};return n.createElement("div",{style:i.fields,className:"flexbox-fix"},n.createElement("div",{style:i.active}),n.createElement(g,{style:{wrap:i.HEXwrap,input:i.HEXinput,label:i.HEXlabel},label:"hex",value:t,onChange:s}),n.createElement(g,{style:{wrap:i.RGBwrap,input:i.RGBinput,label:i.RGBlabel},label:"r",value:r.r,onChange:s}),n.createElement(g,{style:{wrap:i.RGBwrap,input:i.RGBinput,label:i.RGBlabel},label:"g",value:r.g,onChange:s}),n.createElement(g,{style:{wrap:i.RGBwrap,input:i.RGBinput,label:i.RGBlabel},label:"b",value:r.b,onChange:s}))};var Ba=function(e){var t=e.onChange,r=e.onSwatchHover,a=e.colors,i=e.hex,s=e.rgb,l=e.styles,c=void 0===l?{}:l,u=e.className,p=void 0===u?"":u,f=(0,o.ZP)(or({default:{Compact:{background:"#f6f6f6",radius:"4px"},compact:{paddingTop:"5px",paddingLeft:"5px",boxSizing:"initial",width:"240px"},clear:{clear:"both"}}},c)),h=function(e,r){e.hex?gn(e.hex)&&t({hex:e.hex,source:"hex"},r):t(e,r)};return n.createElement(ir,{style:f.Compact,styles:c},n.createElement("div",{style:f.compact,className:"compact-picker "+p},n.createElement("div",null,Qo(a,(function(e){return n.createElement(Ra,{key:e,color:e,active:e.toLowerCase()===i,onClick:h,onSwatchHover:r})})),n.createElement("div",{style:f.clear})),n.createElement(Fa,{hex:i,rgb:s,onChange:h})))};Ba.propTypes={colors:_().arrayOf(_().string),styles:_().object},Ba.defaultProps={colors:["#4D4D4D","#999999","#FFFFFF","#F44E3B","#FE9200","#FCDC00","#DBDF00","#A4DD00","#68CCCA","#73D8FF","#AEA1FF","#FDA1FF","#333333","#808080","#cccccc","#D33115","#E27300","#FCC400","#B0BC00","#68BC00","#16A5A5","#009CE0","#7B64FF","#FA28FF","#000000","#666666","#B3B3B3","#9F0500","#C45100","#FB9E00","#808900","#194D33","#0C797D","#0062B1","#653294","#AB149E"],styles:{}};_n(Ba);const za=(0,o.tz)((function(e){var t=e.hover,r=e.color,a=e.onClick,i=e.onSwatchHover,s={position:"relative",zIndex:"2",outline:"2px solid #fff",boxShadow:"0 0 5px 2px rgba(0,0,0,0.25)"},l=(0,o.ZP)({default:{swatch:{width:"25px",height:"25px",fontSize:"0"}},hover:{swatch:s}},{hover:t});return n.createElement("div",{style:l.swatch},n.createElement(Sn,{color:r,onClick:a,onHover:i,focusStyle:s}))}));var Ta=function(e){var t=e.width,r=e.colors,a=e.onChange,i=e.onSwatchHover,s=e.triangle,l=e.styles,c=void 0===l?{}:l,u=e.className,p=void 0===u?"":u,f=(0,o.ZP)(or({default:{card:{width:t,background:"#fff",border:"1px solid rgba(0,0,0,0.2)",boxShadow:"0 3px 12px rgba(0,0,0,0.15)",borderRadius:"4px",position:"relative",padding:"5px",display:"flex",flexWrap:"wrap"},triangle:{position:"absolute",border:"7px solid transparent",borderBottomColor:"#fff"},triangleShadow:{position:"absolute",border:"8px solid transparent",borderBottomColor:"rgba(0,0,0,0.15)"}},"hide-triangle":{triangle:{display:"none"},triangleShadow:{display:"none"}},"top-left-triangle":{triangle:{top:"-14px",left:"10px"},triangleShadow:{top:"-16px",left:"9px"}},"top-right-triangle":{triangle:{top:"-14px",right:"10px"},triangleShadow:{top:"-16px",right:"9px"}},"bottom-left-triangle":{triangle:{top:"35px",left:"10px",transform:"rotate(180deg)"},triangleShadow:{top:"37px",left:"9px",transform:"rotate(180deg)"}},"bottom-right-triangle":{triangle:{top:"35px",right:"10px",transform:"rotate(180deg)"},triangleShadow:{top:"37px",right:"9px",transform:"rotate(180deg)"}}},c),{"hide-triangle":"hide"===s,"top-left-triangle":"top-left"===s,"top-right-triangle":"top-right"===s,"bottom-left-triangle":"bottom-left"===s,"bottom-right-triangle":"bottom-right"===s}),h=function(e,t){return a({hex:e,source:"hex"},t)};return n.createElement("div",{style:f.card,className:"github-picker "+p},n.createElement("div",{style:f.triangleShadow}),n.createElement("div",{style:f.triangle}),Qo(r,(function(e){return n.createElement(za,{color:e,key:e,onClick:h,onSwatchHover:i})})))};Ta.propTypes={width:_().oneOfType([_().string,_().number]),colors:_().arrayOf(_().string),triangle:_().oneOf(["hide","top-left","top-right","bottom-left","bottom-right"]),styles:_().object},Ta.defaultProps={width:200,colors:["#B80000","#DB3E00","#FCCB00","#008B02","#006B76","#1273DE","#004DCF","#5300EB","#EB9694","#FAD0C3","#FEF3BD","#C1E1C5","#BEDADC","#C4DEF6","#BED3F3","#D4C4FB"],triangle:"top-left",styles:{}};_n(Ta);const Ha=function(e){var t=e.direction,r=(0,o.ZP)({default:{picker:{width:"18px",height:"18px",borderRadius:"50%",transform:"translate(-9px, -1px)",backgroundColor:"rgb(248, 248, 248)",boxShadow:"0 1px 4px 0 rgba(0, 0, 0, 0.37)"}},vertical:{picker:{transform:"translate(-3px, -9px)"}}},{vertical:"vertical"===t});return n.createElement("div",{style:r.picker})};var Da=Object.assign||function(e){for(var t=1;t.5});return n.createElement("div",{style:r.picker})};const Ua=function(){var e=(0,o.ZP)({default:{triangle:{width:0,height:0,borderStyle:"solid",borderWidth:"4px 0 4px 6px",borderColor:"transparent transparent transparent #fff",position:"absolute",top:"1px",left:"1px"},triangleBorder:{width:0,height:0,borderStyle:"solid",borderWidth:"5px 0 5px 8px",borderColor:"transparent transparent transparent #555"},left:{Extend:"triangleBorder",transform:"translate(-13px, -4px)"},leftInside:{Extend:"triangle",transform:"translate(-8px, -5px)"},right:{Extend:"triangleBorder",transform:"translate(20px, -14px) rotate(180deg)"},rightInside:{Extend:"triangle",transform:"translate(-8px, -5px)"}}});return n.createElement("div",{style:e.pointer},n.createElement("div",{style:e.left},n.createElement("div",{style:e.leftInside})),n.createElement("div",{style:e.right},n.createElement("div",{style:e.rightInside})))};const Za=function(e){var t=e.onClick,r=e.label,a=e.children,i=e.active,s=(0,o.ZP)({default:{button:{backgroundImage:"linear-gradient(-180deg, #FFFFFF 0%, #E6E6E6 100%)",border:"1px solid #878787",borderRadius:"2px",height:"20px",boxShadow:"0 1px 0 0 #EAEAEA",fontSize:"14px",color:"#000",lineHeight:"20px",textAlign:"center",marginBottom:"10px",cursor:"pointer"}},active:{button:{boxShadow:"0 0 0 1px #878787"}}},{active:i});return n.createElement("div",{style:s.button,onClick:t},r||a)};const Ga=function(e){var t=e.rgb,r=e.currentColor,a=(0,o.ZP)({default:{swatches:{border:"1px solid #B3B3B3",borderBottom:"1px solid #F0F0F0",marginBottom:"2px",marginTop:"1px"},new:{height:"34px",background:"rgb("+t.r+","+t.g+", "+t.b+")",boxShadow:"inset 1px 0 0 #000, inset -1px 0 0 #000, inset 0 1px 0 #000"},current:{height:"34px",background:r,boxShadow:"inset 1px 0 0 #000, inset -1px 0 0 #000, inset 0 -1px 0 #000"},label:{fontSize:"14px",color:"#000",textAlign:"center"}}});return n.createElement("div",null,n.createElement("div",{style:a.label},"new"),n.createElement("div",{style:a.swatches},n.createElement("div",{style:a.new}),n.createElement("div",{style:a.current})),n.createElement("div",{style:a.label},"current"))};var Wa=function(){function e(e,t){for(var r=0;r100&&(e.a=100),e.a/=100,t({h:a.h,s:a.s,l:a.l,a:e.a,source:"rgb"},n))};return n.createElement("div",{style:l.fields,className:"flexbox-fix"},n.createElement("div",{style:l.double},n.createElement(g,{style:{input:l.input,label:l.label},label:"hex",value:i.replace("#",""),onChange:c})),n.createElement("div",{style:l.single},n.createElement(g,{style:{input:l.input,label:l.label},label:"r",value:r.r,onChange:c,dragLabel:"true",dragMax:"255"})),n.createElement("div",{style:l.single},n.createElement(g,{style:{input:l.input,label:l.label},label:"g",value:r.g,onChange:c,dragLabel:"true",dragMax:"255"})),n.createElement("div",{style:l.single},n.createElement(g,{style:{input:l.input,label:l.label},label:"b",value:r.b,onChange:c,dragLabel:"true",dragMax:"255"})),n.createElement("div",{style:l.alpha},n.createElement(g,{style:{input:l.input,label:l.label},label:"a",value:Math.round(100*r.a),onChange:c,dragLabel:"true",dragMax:"100"})))};var $a=Object.assign||function(e){for(var t=1;t{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.autoprefix=void 0;var n,o=r(11597),a=(n=o)&&n.__esModule?n:{default:n},i=Object.assign||function(e){for(var t=1;t{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.active=void 0;var n,o=Object.assign||function(e){for(var t=1;t1&&void 0!==arguments[1]?arguments[1]:"span";return function(r){function n(){var r,a,l;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,n);for(var c=arguments.length,u=Array(c),p=0;p{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.hover=void 0;var n,o=Object.assign||function(e){for(var t=1;t1&&void 0!==arguments[1]?arguments[1]:"span";return function(r){function n(){var r,a,l;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,n);for(var c=arguments.length,u=Array(c),p=0;p{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.flattenNames=void 0;var n=s(r(589)),o=s(r(11597)),a=s(r(60627)),i=s(r(22299));function s(e){return e&&e.__esModule?e:{default:e}}var l=t.flattenNames=function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],r=[];return(0,i.default)(t,(function(t){Array.isArray(t)?e(t).map((function(e){return r.push(e)})):(0,a.default)(t)?(0,o.default)(t,(function(e,t){!0===e&&r.push(t),r.push(t+"-"+e)})):(0,n.default)(t)&&r.push(t)})),r};t.default=l},72665:(e,t,r)=>{"use strict";t.tz=void 0;var n=c(r(61310)),o=c(r(7796)),a=c(r(73195)),i=c(r(42756)),s=c(r(13386)),l=c(r(91906));function c(e){return e&&e.__esModule?e:{default:e}}i.default,t.tz=i.default,s.default,l.default;var u=function(e){for(var t=arguments.length,r=Array(t>1?t-1:0),i=1;i{"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.default=function(e,t){var r={},n=function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];r[e]=t};return 0===e&&n("first-child"),e===t-1&&n("last-child"),(0===e||e%2==0)&&n("even"),1===Math.abs(e%2)&&n("odd"),n("nth-child",e),r}},7796:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.mergeClasses=void 0;var n=i(r(11597)),o=i(r(28869)),a=Object.assign||function(e){for(var t=1;t1&&void 0!==arguments[1]?arguments[1]:[],r=e.default&&(0,o.default)(e.default)||{};return t.map((function(t){var o=e[t];return o&&(0,n.default)(o,(function(e,t){r[t]||(r[t]={}),r[t]=a({},r[t],o[t])})),t})),r};t.default=s}}]); +//# sourceMappingURL=757.bundle.26ceda521b4376726a11.js.map \ No newline at end of file diff --git a/resources/757.bundle.26ceda521b4376726a11.js.map b/resources/757.bundle.26ceda521b4376726a11.js.map new file mode 100644 index 0000000..49f34f5 --- /dev/null +++ b/resources/757.bundle.26ceda521b4376726a11.js.map @@ -0,0 +1 @@ +{"version":3,"file":"757.bundle.26ceda521b4376726a11.js","mappings":"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","sources":["webpack:///../../../node_modules/@icons/material/CheckIcon.js","webpack:///../../../node_modules/@icons/material/UnfoldMoreHorizontalIcon.js","webpack:///../../../node_modules/@kitware/vtk.js/Common/DataModel/EdgeLocator.js","webpack:///../../../node_modules/@kitware/vtk.js/Filters/General/ImageMarchingSquares/caseTable.js","webpack:///../../../node_modules/@kitware/vtk.js/Filters/General/ImageMarchingSquares.js","webpack:///../../../node_modules/lodash/_DataView.js","webpack:///../../../node_modules/lodash/_Hash.js","webpack:///../../../node_modules/lodash/_ListCache.js","webpack:///../../../node_modules/lodash/_Map.js","webpack:///../../../node_modules/lodash/_MapCache.js","webpack:///../../../node_modules/lodash/_Promise.js","webpack:///../../../node_modules/lodash/_Set.js","webpack:///../../../node_modules/lodash/_SetCache.js","webpack:///../../../node_modules/lodash/_Stack.js","webpack:///../../../node_modules/lodash/_Uint8Array.js","webpack:///../../../node_modules/lodash/_WeakMap.js","webpack:///../../../node_modules/lodash/_arrayEach.js","webpack:///../../../node_modules/lodash/_arrayFilter.js","webpack:///../../../node_modules/lodash/_arrayLikeKeys.js","webpack:///../../../node_modules/lodash/_arrayMap.js","webpack:///../../../node_modules/lodash/_arrayPush.js","webpack:///../../../node_modules/lodash/_arraySome.js","webpack:///../../../node_modules/lodash/_assignValue.js","webpack:///../../../node_modules/lodash/_assocIndexOf.js","webpack:///../../../node_modules/lodash/_baseAssign.js","webpack:///../../../node_modules/lodash/_baseAssignIn.js","webpack:///../../../node_modules/lodash/_baseAssignValue.js","webpack:///../../../node_modules/lodash/_baseClone.js","webpack:///../../../node_modules/lodash/_baseCreate.js","webpack:///../../../node_modules/lodash/_baseEach.js","webpack:///../../../node_modules/lodash/_baseFor.js","webpack:///../../../node_modules/lodash/_baseForOwn.js","webpack:///../../../node_modules/lodash/_baseGet.js","webpack:///../../../node_modules/lodash/_baseGetAllKeys.js","webpack:///../../../node_modules/lodash/_baseHasIn.js","webpack:///../../../node_modules/lodash/_baseIsArguments.js","webpack:///../../../node_modules/lodash/_baseIsEqual.js","webpack:///../../../node_modules/lodash/_baseIsEqualDeep.js","webpack:///../../../node_modules/lodash/_baseIsMap.js","webpack:///../../../node_modules/lodash/_baseIsMatch.js","webpack:///../../../node_modules/lodash/_baseIsNative.js","webpack:///../../../node_modules/lodash/_baseIsSet.js","webpack:///../../../node_modules/lodash/_baseIsTypedArray.js","webpack:///../../../node_modules/lodash/_baseIteratee.js","webpack:///../../../node_modules/lodash/_baseKeys.js","webpack:///../../../node_modules/lodash/_baseKeysIn.js","webpack:///../../../node_modules/lodash/_baseMap.js","webpack:///../../../node_modules/lodash/_baseMatches.js","webpack:///../../../node_modules/lodash/_baseMatchesProperty.js","webpack:///../../../node_modules/lodash/_baseProperty.js","webpack:///../../../node_modules/lodash/_basePropertyDeep.js","webpack:///../../../node_modules/lodash/_baseTimes.js","webpack:///../../../node_modules/lodash/_baseToString.js","webpack:///../../../node_modules/lodash/_baseUnary.js","webpack:///../../../node_modules/lodash/_cacheHas.js","webpack:///../../../node_modules/lodash/_castFunction.js","webpack:///../../../node_modules/lodash/_castPath.js","webpack:///../../../node_modules/lodash/_cloneArrayBuffer.js","webpack:///../../../node_modules/lodash/_cloneBuffer.js","webpack:///../../../node_modules/lodash/_cloneDataView.js","webpack:///../../../node_modules/lodash/_cloneRegExp.js","webpack:///../../../node_modules/lodash/_cloneSymbol.js","webpack:///../../../node_modules/lodash/_cloneTypedArray.js","webpack:///../../../node_modules/lodash/_copyArray.js","webpack:///../../../node_modules/lodash/_copyObject.js","webpack:///../../../node_modules/lodash/_copySymbols.js","webpack:///../../../node_modules/lodash/_copySymbolsIn.js","webpack:///../../../node_modules/lodash/_coreJsData.js","webpack:///../../../node_modules/lodash/_createBaseEach.js","webpack:///../../../node_modules/lodash/_createBaseFor.js","webpack:///../../../node_modules/lodash/_defineProperty.js","webpack:///../../../node_modules/lodash/_equalArrays.js","webpack:///../../../node_modules/lodash/_equalByTag.js","webpack:///../../../node_modules/lodash/_equalObjects.js","webpack:///../../../node_modules/lodash/_getAllKeys.js","webpack:///../../../node_modules/lodash/_getAllKeysIn.js","webpack:///../../../node_modules/lodash/_getMapData.js","webpack:///../../../node_modules/lodash/_getMatchData.js","webpack:///../../../node_modules/lodash/_getNative.js","webpack:///../../../node_modules/lodash/_getPrototype.js","webpack:///../../../node_modules/lodash/_getSymbols.js","webpack:///../../../node_modules/lodash/_getSymbolsIn.js","webpack:///../../../node_modules/lodash/_getTag.js","webpack:///../../../node_modules/lodash/_getValue.js","webpack:///../../../node_modules/lodash/_hasPath.js","webpack:///../../../node_modules/lodash/_hashClear.js","webpack:///../../../node_modules/lodash/_hashDelete.js","webpack:///../../../node_modules/lodash/_hashGet.js","webpack:///../../../node_modules/lodash/_hashHas.js","webpack:///../../../node_modules/lodash/_hashSet.js","webpack:///../../../node_modules/lodash/_initCloneArray.js","webpack:///../../../node_modules/lodash/_initCloneByTag.js","webpack:///../../../node_modules/lodash/_initCloneObject.js","webpack:///../../../node_modules/lodash/_isIndex.js","webpack:///../../../node_modules/lodash/_isKey.js","webpack:///../../../node_modules/lodash/_isKeyable.js","webpack:///../../../node_modules/lodash/_isMasked.js","webpack:///../../../node_modules/lodash/_isPrototype.js","webpack:///../../../node_modules/lodash/_isStrictComparable.js","webpack:///../../../node_modules/lodash/_listCacheClear.js","webpack:///../../../node_modules/lodash/_listCacheDelete.js","webpack:///../../../node_modules/lodash/_listCacheGet.js","webpack:///../../../node_modules/lodash/_listCacheHas.js","webpack:///../../../node_modules/lodash/_listCacheSet.js","webpack:///../../../node_modules/lodash/_mapCacheClear.js","webpack:///../../../node_modules/lodash/_mapCacheDelete.js","webpack:///../../../node_modules/lodash/_mapCacheGet.js","webpack:///../../../node_modules/lodash/_mapCacheHas.js","webpack:///../../../node_modules/lodash/_mapCacheSet.js","webpack:///../../../node_modules/lodash/_mapToArray.js","webpack:///../../../node_modules/lodash/_matchesStrictComparable.js","webpack:///../../../node_modules/lodash/_memoizeCapped.js","webpack:///../../../node_modules/lodash/_nativeCreate.js","webpack:///../../../node_modules/lodash/_nativeKeys.js","webpack:///../../../node_modules/lodash/_nativeKeysIn.js","webpack:///../../../node_modules/lodash/_nodeUtil.js","webpack:///../../../node_modules/lodash/_overArg.js","webpack:///../../../node_modules/lodash/_setCacheAdd.js","webpack:///../../../node_modules/lodash/_setCacheHas.js","webpack:///../../../node_modules/lodash/_setToArray.js","webpack:///../../../node_modules/lodash/_stackClear.js","webpack:///../../../node_modules/lodash/_stackDelete.js","webpack:///../../../node_modules/lodash/_stackGet.js","webpack:///../../../node_modules/lodash/_stackHas.js","webpack:///../../../node_modules/lodash/_stackSet.js","webpack:///../../../node_modules/lodash/_stringToPath.js","webpack:///../../../node_modules/lodash/_toKey.js","webpack:///../../../node_modules/lodash/_toSource.js","webpack:///../../../node_modules/lodash/cloneDeep.js","webpack:///../../../node_modules/lodash/eq.js","webpack:///../../../node_modules/lodash/forOwn.js","webpack:///../../../node_modules/lodash/get.js","webpack:///../../../node_modules/lodash/hasIn.js","webpack:///../../../node_modules/lodash/identity.js","webpack:///../../../node_modules/lodash/isArguments.js","webpack:///../../../node_modules/lodash/isArray.js","webpack:///../../../node_modules/lodash/isArrayLike.js","webpack:///../../../node_modules/lodash/isBuffer.js","webpack:///../../../node_modules/lodash/isFunction.js","webpack:///../../../node_modules/lodash/isLength.js","webpack:///../../../node_modules/lodash/isMap.js","webpack:///../../../node_modules/lodash/isPlainObject.js","webpack:///../../../node_modules/lodash/isSet.js","webpack:///../../../node_modules/lodash/isString.js","webpack:///../../../node_modules/lodash/isTypedArray.js","webpack:///../../../node_modules/lodash/keys.js","webpack:///../../../node_modules/lodash/keysIn.js","webpack:///../../../node_modules/lodash/map.js","webpack:///../../../node_modules/lodash/memoize.js","webpack:///../../../node_modules/lodash/property.js","webpack:///../../../node_modules/lodash/stubArray.js","webpack:///../../../node_modules/lodash/stubFalse.js","webpack:///../../../node_modules/lodash/toString.js","webpack:///../../../node_modules/react-color/es/helpers/checkboard.js","webpack:///../../../node_modules/react-color/es/components/common/Checkboard.js","webpack:///../../../node_modules/react-color/es/components/common/Alpha.js","webpack:///../../../node_modules/react-color/es/helpers/alpha.js","webpack:///../../../node_modules/react-color/es/components/common/EditableInput.js","webpack:///../../../node_modules/react-color/es/helpers/hue.js","webpack:///../../../node_modules/react-color/es/components/common/Hue.js","webpack:///../../../node_modules/lodash-es/_listCacheClear.js","webpack:///../../../node_modules/lodash-es/eq.js","webpack:///../../../node_modules/lodash-es/_assocIndexOf.js","webpack:///../../../node_modules/lodash-es/_listCacheDelete.js","webpack:///../../../node_modules/lodash-es/_listCacheGet.js","webpack:///../../../node_modules/lodash-es/_listCacheHas.js","webpack:///../../../node_modules/lodash-es/_listCacheSet.js","webpack:///../../../node_modules/lodash-es/_ListCache.js","webpack:///../../../node_modules/lodash-es/_stackClear.js","webpack:///../../../node_modules/lodash-es/_stackDelete.js","webpack:///../../../node_modules/lodash-es/_stackGet.js","webpack:///../../../node_modules/lodash-es/_stackHas.js","webpack:///../../../node_modules/lodash-es/_freeGlobal.js","webpack:///../../../node_modules/lodash-es/_root.js","webpack:///../../../node_modules/lodash-es/_Symbol.js","webpack:///../../../node_modules/lodash-es/_getRawTag.js","webpack:///../../../node_modules/lodash-es/_objectToString.js","webpack:///../../../node_modules/lodash-es/_baseGetTag.js","webpack:///../../../node_modules/lodash-es/isObject.js","webpack:///../../../node_modules/lodash-es/isFunction.js","webpack:///../../../node_modules/lodash-es/_coreJsData.js","webpack:///../../../node_modules/lodash-es/_isMasked.js","webpack:///../../../node_modules/lodash-es/_toSource.js","webpack:///../../../node_modules/lodash-es/_baseIsNative.js","webpack:///../../../node_modules/lodash-es/_getValue.js","webpack:///../../../node_modules/lodash-es/_getNative.js","webpack:///../../../node_modules/lodash-es/_Map.js","webpack:///../../../node_modules/lodash-es/_nativeCreate.js","webpack:///../../../node_modules/lodash-es/_hashClear.js","webpack:///../../../node_modules/lodash-es/_hashDelete.js","webpack:///../../../node_modules/lodash-es/_hashGet.js","webpack:///../../../node_modules/lodash-es/_hashHas.js","webpack:///../../../node_modules/lodash-es/_hashSet.js","webpack:///../../../node_modules/lodash-es/_Hash.js","webpack:///../../../node_modules/lodash-es/_mapCacheClear.js","webpack:///../../../node_modules/lodash-es/_isKeyable.js","webpack:///../../../node_modules/lodash-es/_getMapData.js","webpack:///../../../node_modules/lodash-es/_mapCacheDelete.js","webpack:///../../../node_modules/lodash-es/_mapCacheGet.js","webpack:///../../../node_modules/lodash-es/_mapCacheHas.js","webpack:///../../../node_modules/lodash-es/_mapCacheSet.js","webpack:///../../../node_modules/lodash-es/_MapCache.js","webpack:///../../../node_modules/lodash-es/_stackSet.js","webpack:///../../../node_modules/lodash-es/_Stack.js","webpack:///../../../node_modules/lodash-es/_defineProperty.js","webpack:///../../../node_modules/lodash-es/_baseAssignValue.js","webpack:///../../../node_modules/lodash-es/_assignMergeValue.js","webpack:///../../../node_modules/lodash-es/_baseFor.js","webpack:///../../../node_modules/lodash-es/_createBaseFor.js","webpack:///../../../node_modules/lodash-es/_cloneBuffer.js","webpack:///../../../node_modules/lodash-es/_Uint8Array.js","webpack:///../../../node_modules/lodash-es/_cloneArrayBuffer.js","webpack:///../../../node_modules/lodash-es/_cloneTypedArray.js","webpack:///../../../node_modules/lodash-es/_copyArray.js","webpack:///../../../node_modules/lodash-es/_baseCreate.js","webpack:///../../../node_modules/lodash-es/_overArg.js","webpack:///../../../node_modules/lodash-es/_getPrototype.js","webpack:///../../../node_modules/lodash-es/_isPrototype.js","webpack:///../../../node_modules/lodash-es/_initCloneObject.js","webpack:///../../../node_modules/lodash-es/isObjectLike.js","webpack:///../../../node_modules/lodash-es/_baseIsArguments.js","webpack:///../../../node_modules/lodash-es/isArguments.js","webpack:///../../../node_modules/lodash-es/isArray.js","webpack:///../../../node_modules/lodash-es/isLength.js","webpack:///../../../node_modules/lodash-es/isArrayLike.js","webpack:///../../../node_modules/lodash-es/isArrayLikeObject.js","webpack:///../../../node_modules/lodash-es/stubFalse.js","webpack:///../../../node_modules/lodash-es/isBuffer.js","webpack:///../../../node_modules/lodash-es/isPlainObject.js","webpack:///../../../node_modules/lodash-es/_baseIsTypedArray.js","webpack:///../../../node_modules/lodash-es/_baseUnary.js","webpack:///../../../node_modules/lodash-es/_nodeUtil.js","webpack:///../../../node_modules/lodash-es/isTypedArray.js","webpack:///../../../node_modules/lodash-es/_safeGet.js","webpack:///../../../node_modules/lodash-es/_assignValue.js","webpack:///../../../node_modules/lodash-es/_copyObject.js","webpack:///../../../node_modules/lodash-es/_baseTimes.js","webpack:///../../../node_modules/lodash-es/_isIndex.js","webpack:///../../../node_modules/lodash-es/_arrayLikeKeys.js","webpack:///../../../node_modules/lodash-es/_nativeKeysIn.js","webpack:///../../../node_modules/lodash-es/_baseKeysIn.js","webpack:///../../../node_modules/lodash-es/keysIn.js","webpack:///../../../node_modules/lodash-es/toPlainObject.js","webpack:///../../../node_modules/lodash-es/_baseMergeDeep.js","webpack:///../../../node_modules/lodash-es/_baseMerge.js","webpack:///../../../node_modules/lodash-es/identity.js","webpack:///../../../node_modules/lodash-es/_apply.js","webpack:///../../../node_modules/lodash-es/_overRest.js","webpack:///../../../node_modules/lodash-es/constant.js","webpack:///../../../node_modules/lodash-es/_baseSetToString.js","webpack:///../../../node_modules/lodash-es/_shortOut.js","webpack:///../../../node_modules/lodash-es/_setToString.js","webpack:///../../../node_modules/lodash-es/_baseRest.js","webpack:///../../../node_modules/lodash-es/_isIterateeCall.js","webpack:///../../../node_modules/lodash-es/merge.js","webpack:///../../../node_modules/lodash-es/_createAssigner.js","webpack:///../../../node_modules/react-color/es/components/common/Raised.js","webpack:///../../../node_modules/lodash-es/now.js","webpack:///../../../node_modules/lodash-es/_trimmedEndIndex.js","webpack:///../../../node_modules/lodash-es/_baseTrim.js","webpack:///../../../node_modules/lodash-es/isSymbol.js","webpack:///../../../node_modules/lodash-es/toNumber.js","webpack:///../../../node_modules/lodash-es/debounce.js","webpack:///../../../node_modules/lodash-es/throttle.js","webpack:///../../../node_modules/react-color/es/helpers/saturation.js","webpack:///../../../node_modules/react-color/es/components/common/Saturation.js","webpack:///../../../node_modules/lodash-es/_arrayEach.js","webpack:///../../../node_modules/lodash-es/_nativeKeys.js","webpack:///../../../node_modules/lodash-es/_baseKeys.js","webpack:///../../../node_modules/lodash-es/keys.js","webpack:///../../../node_modules/lodash-es/_baseEach.js","webpack:///../../../node_modules/lodash-es/_createBaseEach.js","webpack:///../../../node_modules/lodash-es/_baseForOwn.js","webpack:///../../../node_modules/lodash-es/_castFunction.js","webpack:///../../../node_modules/lodash-es/forEach.js","webpack:///../../../node_modules/tinycolor2/esm/tinycolor.js","webpack:///../../../node_modules/react-color/es/helpers/color.js","webpack:///../../../node_modules/react-color/es/components/common/ColorWrap.js","webpack:///../../../node_modules/react-color/es/helpers/interaction.js","webpack:///../../../node_modules/react-color/es/components/common/Swatch.js","webpack:///../../../node_modules/react-color/es/components/alpha/AlphaPointer.js","webpack:///../../../node_modules/react-color/es/components/alpha/Alpha.js","webpack:///../../../node_modules/lodash-es/_arrayMap.js","webpack:///../../../node_modules/lodash-es/_setCacheAdd.js","webpack:///../../../node_modules/lodash-es/_setCacheHas.js","webpack:///../../../node_modules/lodash-es/_SetCache.js","webpack:///../../../node_modules/lodash-es/_arraySome.js","webpack:///../../../node_modules/lodash-es/_cacheHas.js","webpack:///../../../node_modules/lodash-es/_equalArrays.js","webpack:///../../../node_modules/lodash-es/_mapToArray.js","webpack:///../../../node_modules/lodash-es/_setToArray.js","webpack:///../../../node_modules/lodash-es/_equalByTag.js","webpack:///../../../node_modules/lodash-es/_arrayPush.js","webpack:///../../../node_modules/lodash-es/_baseGetAllKeys.js","webpack:///../../../node_modules/lodash-es/_arrayFilter.js","webpack:///../../../node_modules/lodash-es/stubArray.js","webpack:///../../../node_modules/lodash-es/_getSymbols.js","webpack:///../../../node_modules/lodash-es/_getAllKeys.js","webpack:///../../../node_modules/lodash-es/_equalObjects.js","webpack:///../../../node_modules/lodash-es/_DataView.js","webpack:///../../../node_modules/lodash-es/_Promise.js","webpack:///../../../node_modules/lodash-es/_Set.js","webpack:///../../../node_modules/lodash-es/_WeakMap.js","webpack:///../../../node_modules/lodash-es/_getTag.js","webpack:///../../../node_modules/lodash-es/_baseIsEqualDeep.js","webpack:///../../../node_modules/lodash-es/_baseIsEqual.js","webpack:///../../../node_modules/lodash-es/_baseIsMatch.js","webpack:///../../../node_modules/lodash-es/_isStrictComparable.js","webpack:///../../../node_modules/lodash-es/_getMatchData.js","webpack:///../../../node_modules/lodash-es/_matchesStrictComparable.js","webpack:///../../../node_modules/lodash-es/_baseMatches.js","webpack:///../../../node_modules/lodash-es/_isKey.js","webpack:///../../../node_modules/lodash-es/memoize.js","webpack:///../../../node_modules/lodash-es/_stringToPath.js","webpack:///../../../node_modules/lodash-es/_memoizeCapped.js","webpack:///../../../node_modules/lodash-es/_baseToString.js","webpack:///../../../node_modules/lodash-es/toString.js","webpack:///../../../node_modules/lodash-es/_castPath.js","webpack:///../../../node_modules/lodash-es/_toKey.js","webpack:///../../../node_modules/lodash-es/_baseGet.js","webpack:///../../../node_modules/lodash-es/get.js","webpack:///../../../node_modules/lodash-es/_baseHasIn.js","webpack:///../../../node_modules/lodash-es/_hasPath.js","webpack:///../../../node_modules/lodash-es/hasIn.js","webpack:///../../../node_modules/lodash-es/_baseMatchesProperty.js","webpack:///../../../node_modules/lodash-es/_baseProperty.js","webpack:///../../../node_modules/lodash-es/_basePropertyDeep.js","webpack:///../../../node_modules/lodash-es/property.js","webpack:///../../../node_modules/lodash-es/_baseIteratee.js","webpack:///../../../node_modules/lodash-es/_baseMap.js","webpack:///../../../node_modules/lodash-es/map.js","webpack:///../../../node_modules/react-color/es/components/block/BlockSwatches.js","webpack:///../../../node_modules/react-color/es/components/block/Block.js","webpack:///../../../node_modules/material-colors/dist/colors.es2015.js","webpack:///../../../node_modules/react-color/es/components/circle/CircleSwatch.js","webpack:///../../../node_modules/react-color/es/components/circle/Circle.js","webpack:///../../../node_modules/lodash-es/isUndefined.js","webpack:///../../../node_modules/react-color/es/components/chrome/ChromeFields.js","webpack:///../../../node_modules/react-color/es/components/chrome/ChromePointer.js","webpack:///../../../node_modules/react-color/es/components/chrome/ChromePointerCircle.js","webpack:///../../../node_modules/react-color/es/components/chrome/Chrome.js","webpack:///../../../node_modules/react-color/es/components/compact/CompactColor.js","webpack:///../../../node_modules/react-color/es/components/compact/CompactFields.js","webpack:///../../../node_modules/react-color/es/components/compact/Compact.js","webpack:///../../../node_modules/react-color/es/components/github/GithubSwatch.js","webpack:///../../../node_modules/react-color/es/components/github/Github.js","webpack:///../../../node_modules/react-color/es/components/hue/HuePointer.js","webpack:///../../../node_modules/react-color/es/components/hue/Hue.js","webpack:///../../../node_modules/react-color/es/components/material/Material.js","webpack:///../../../node_modules/react-color/es/components/photoshop/PhotoshopFields.js","webpack:///../../../node_modules/react-color/es/components/photoshop/PhotoshopPointerCircle.js","webpack:///../../../node_modules/react-color/es/components/photoshop/PhotoshopPointer.js","webpack:///../../../node_modules/react-color/es/components/photoshop/PhotoshopButton.js","webpack:///../../../node_modules/react-color/es/components/photoshop/PhotoshopPreviews.js","webpack:///../../../node_modules/react-color/es/components/photoshop/Photoshop.js","webpack:///../../../node_modules/react-color/es/components/sketch/SketchFields.js","webpack:///../../../node_modules/react-color/es/components/sketch/SketchPresetColors.js","webpack:///../../../node_modules/react-color/es/components/sketch/Sketch.js","webpack:///../../../node_modules/react-color/es/components/slider/SliderSwatch.js","webpack:///../../../node_modules/react-color/es/components/slider/SliderSwatches.js","webpack:///../../../node_modules/react-color/es/components/slider/SliderPointer.js","webpack:///../../../node_modules/react-color/es/components/slider/Slider.js","webpack:///../../../node_modules/react-color/es/components/swatches/SwatchesColor.js","webpack:///../../../node_modules/react-color/es/components/swatches/SwatchesGroup.js","webpack:///../../../node_modules/react-color/es/components/swatches/Swatches.js","webpack:///../../../node_modules/react-color/es/components/twitter/Twitter.js","webpack:///../../../node_modules/react-color/es/components/google/GooglePointerCircle.js","webpack:///../../../node_modules/react-color/es/components/google/GooglePointer.js","webpack:///../../../node_modules/react-color/es/components/google/GoogleFields.js","webpack:///../../../node_modules/react-color/es/components/google/Google.js","webpack:///../../../node_modules/reactcss/lib/autoprefix.js","webpack:///../../../node_modules/reactcss/lib/components/active.js","webpack:///../../../node_modules/reactcss/lib/components/hover.js","webpack:///../../../node_modules/reactcss/lib/flattenNames.js","webpack:///../../../node_modules/reactcss/lib/index.js","webpack:///../../../node_modules/reactcss/lib/loop.js","webpack:///../../../node_modules/reactcss/lib/mergeClasses.js"],"sourcesContent":["'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }\n\nvar DEFAULT_SIZE = 24;\n\nexports.default = function (_ref) {\n var _ref$fill = _ref.fill,\n fill = _ref$fill === undefined ? 'currentColor' : _ref$fill,\n _ref$width = _ref.width,\n width = _ref$width === undefined ? DEFAULT_SIZE : _ref$width,\n _ref$height = _ref.height,\n height = _ref$height === undefined ? DEFAULT_SIZE : _ref$height,\n _ref$style = _ref.style,\n style = _ref$style === undefined ? {} : _ref$style,\n props = _objectWithoutProperties(_ref, ['fill', 'width', 'height', 'style']);\n\n return _react2.default.createElement(\n 'svg',\n _extends({\n viewBox: '0 0 ' + DEFAULT_SIZE + ' ' + DEFAULT_SIZE,\n style: _extends({ fill: fill, width: width, height: height }, style)\n }, props),\n _react2.default.createElement('path', { d: 'M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z' })\n );\n};","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }\n\nvar DEFAULT_SIZE = 24;\n\nexports.default = function (_ref) {\n var _ref$fill = _ref.fill,\n fill = _ref$fill === undefined ? 'currentColor' : _ref$fill,\n _ref$width = _ref.width,\n width = _ref$width === undefined ? DEFAULT_SIZE : _ref$width,\n _ref$height = _ref.height,\n height = _ref$height === undefined ? DEFAULT_SIZE : _ref$height,\n _ref$style = _ref.style,\n style = _ref$style === undefined ? {} : _ref$style,\n props = _objectWithoutProperties(_ref, ['fill', 'width', 'height', 'style']);\n\n return _react2.default.createElement(\n 'svg',\n _extends({\n viewBox: '0 0 ' + DEFAULT_SIZE + ' ' + DEFAULT_SIZE,\n style: _extends({ fill: fill, width: width, height: height }, style)\n }, props),\n _react2.default.createElement('path', { d: 'M12,18.17L8.83,15L7.42,16.41L12,21L16.59,16.41L15.17,15M12,5.83L15.17,9L16.58,7.59L12,3L7.41,7.59L8.83,9L12,5.83Z' })\n );\n};","import _classCallCheck from '@babel/runtime/helpers/classCallCheck';\nimport _createClass from '@babel/runtime/helpers/createClass';\n\nvar EdgeLocator = /*#__PURE__*/function () {\n function EdgeLocator() {\n var oriented = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n _classCallCheck(this, EdgeLocator);\n\n this.oriented = oriented;\n this.edgeMap = new Map();\n }\n\n _createClass(EdgeLocator, [{\n key: \"initialize\",\n value: function initialize() {\n this.edgeMap.clear();\n }\n }, {\n key: \"computeEdgeKey\",\n value: function computeEdgeKey(pointId0, pointId1) {\n return this.oriented || pointId0 < pointId1 ? // Cantor pairing function:\n 0.5 * (pointId0 * pointId1) * (pointId0 * pointId1 + 1) + pointId1 : 0.5 * (pointId1 * pointId0) * (pointId1 * pointId0 + 1) + pointId0;\n }\n }, {\n key: \"insertUniqueEdge\",\n value: function insertUniqueEdge(pointId0, pointId1, newEdgeValue) {\n // Generate a unique key\n var key = this.computeEdgeKey(pointId0, pointId1);\n var node = this.edgeMap.get(key);\n\n if (!node) {\n // Didn't find key, so add a new edge entry\n node = {\n key: key,\n edgeId: this.edgeMap.size,\n value: newEdgeValue\n };\n this.edgeMap.set(key, node);\n }\n\n return node;\n }\n }, {\n key: \"insertEdge\",\n value: function insertEdge(pointId0, pointId1, newEdgeValue) {\n // Generate a unique key\n var key = this.computeEdgeKey(pointId0, pointId1);\n var node = {\n key: key,\n edgeId: this.edgeMap.size,\n value: newEdgeValue\n };\n this.edgeMap.set(key, node);\n return node;\n }\n }, {\n key: \"isInsertedEdge\",\n value: function isInsertedEdge(pointId0, pointId1) {\n var key = this.computeEdgeKey(pointId0, pointId1);\n return this.edgeMap.get(key);\n }\n }], [{\n key: \"getEdgePointIds\",\n value: function getEdgePointIds(node) {\n var n = 0.5 * (-1 + Math.sqrt(8 * node.key + 1));\n var pointId0 = node.key - 0.5 * (n + 1) * n;\n var pointId1 = n - pointId0;\n return [pointId0, pointId1];\n }\n }]);\n\n return EdgeLocator;\n}();\n\nfunction newInstance() {\n var initialValues = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n return new EdgeLocator(initialValues.oriented);\n}\n\nvar vtkEdgeLocator = {\n newInstance: newInstance\n};\n\nexport { vtkEdgeLocator as default };\n","// ----------------------------------------------------------------------------\n// Marching squares case functions (using lines to generate the 2D tessellation).\n// For each case, a list of edge ids that form the triangles. A -1 marks the\n// end of the list of edges. Edges are taken three at a time to generate\n// triangle points.\n// ----------------------------------------------------------------------------\nvar MARCHING_SQUARES_CASES = [[-1, -1, -1, -1, -1]\n/* 0 */\n, [0, 3, -1, -1, -1]\n/* 1 */\n, [1, 0, -1, -1, -1]\n/* 2 */\n, [1, 3, -1, -1, -1]\n/* 3 */\n, [2, 1, -1, -1, -1]\n/* 4 */\n, [0, 3, 2, 1, -1]\n/* 5 */\n, [2, 0, -1, -1, -1]\n/* 6 */\n, [2, 3, -1, -1, -1]\n/* 7 */\n, [3, 2, -1, -1, -1]\n/* 8 */\n, [0, 2, -1, -1, -1]\n/* 9 */\n, [1, 0, 3, 2, -1]\n/* 10 */\n, [1, 2, -1, -1, -1]\n/* 11 */\n, [3, 1, -1, -1, -1]\n/* 12 */\n, [0, 1, -1, -1, -1]\n/* 13 */\n, [3, 0, -1, -1, -1]\n/* 14 */\n, [-1, -1, -1, -1, -1]\n/* 15 */\n];\nvar EDGES = [[0, 1], [1, 3], [2, 3], [0, 2]];\n\nfunction getCase(index) {\n return MARCHING_SQUARES_CASES[index];\n} // Define the four edges of the pixel by the following pairs of vertices\n\n\nfunction getEdge(eid) {\n return EDGES[eid];\n} // ----------------------------------------------------------------------------\n// Static API\n// ----------------------------------------------------------------------------\n\n\nvar vtkCaseTable = {\n getCase: getCase,\n getEdge: getEdge\n};\n\nexport { vtkCaseTable as default };\n","import macro from '../../macros.js';\nimport vtkPolyData from '../../Common/DataModel/PolyData.js';\nimport vtkEdgeLocator from '../../Common/DataModel/EdgeLocator.js';\nimport vtkCaseTable from './ImageMarchingSquares/caseTable.js';\n\nvar vtkErrorMacro = macro.vtkErrorMacro,\n vtkDebugMacro = macro.vtkDebugMacro; // ----------------------------------------------------------------------------\n// vtkImageMarchingSquares methods\n// ----------------------------------------------------------------------------\n\nfunction vtkImageMarchingSquares(publicAPI, model) {\n // Set our className\n model.classHierarchy.push('vtkImageMarchingSquares');\n\n publicAPI.getContourValues = function () {\n return model.contourValues;\n };\n\n publicAPI.setContourValues = function (cValues) {\n model.contourValues = cValues;\n publicAPI.modified();\n };\n\n var ids = [];\n var pixelScalars = [];\n var pixelPts = [];\n var edgeLocator = vtkEdgeLocator.newInstance(); // Retrieve scalars and pixel coordinates. i-j-k is origin of pixel.\n\n publicAPI.getPixelScalars = function (i, j, k, slice, dims, origin, spacing, s) {\n // First get the indices for the pixel\n ids[0] = k * slice + j * dims[0] + i; // i, j, k\n\n ids[1] = ids[0] + 1; // i+1, j, k\n\n ids[2] = ids[0] + dims[0]; // i, j+1, k\n\n ids[3] = ids[2] + 1; // i+1, j+1, k\n // Now retrieve the scalars\n\n for (var ii = 0; ii < 4; ++ii) {\n pixelScalars[ii] = s[ids[ii]];\n }\n }; // Retrieve pixel coordinates. i-j-k is origin of pixel.\n\n\n publicAPI.getPixelPoints = function (i, j, k, dims, origin, spacing) {\n // (i,i+1),(j,j+1),(k,k+1) - i varies fastest; then j; then k\n pixelPts[0] = origin[0] + i * spacing[0]; // 0\n\n pixelPts[1] = origin[1] + j * spacing[1];\n pixelPts[2] = pixelPts[0] + spacing[0]; // 1\n\n pixelPts[3] = pixelPts[1];\n pixelPts[4] = pixelPts[0]; // 2\n\n pixelPts[5] = pixelPts[1] + spacing[1];\n pixelPts[6] = pixelPts[2]; // 3\n\n pixelPts[7] = pixelPts[5];\n };\n\n publicAPI.produceLines = function (cVal, i, j, k, slice, dims, origin, spacing, scalars, points, lines) {\n var CASE_MASK = [1, 2, 8, 4]; // case table is actually for quad\n\n var xyz = [];\n var pId;\n publicAPI.getPixelScalars(i, j, k, slice, dims, origin, spacing, scalars);\n var index = 0;\n\n for (var idx = 0; idx < 4; idx++) {\n if (pixelScalars[idx] >= cVal) {\n index |= CASE_MASK[idx]; // eslint-disable-line no-bitwise\n }\n }\n\n var pixelLines = vtkCaseTable.getCase(index);\n\n if (pixelLines[0] < 0) {\n return; // don't get the pixel coordinates, nothing to do\n }\n\n publicAPI.getPixelPoints(i, j, k, dims, origin, spacing);\n var z = origin[2] + k * spacing[2];\n\n for (var _idx = 0; pixelLines[_idx] >= 0; _idx += 3) {\n lines.push(2);\n\n for (var eid = 0; eid < 2; eid++) {\n var edgeVerts = vtkCaseTable.getEdge(pixelLines[_idx + eid]);\n pId = undefined;\n\n if (model.mergePoints) {\n var _edgeLocator$isInsert;\n\n pId = (_edgeLocator$isInsert = edgeLocator.isInsertedEdge(ids[edgeVerts[0]], ids[edgeVerts[1]])) === null || _edgeLocator$isInsert === void 0 ? void 0 : _edgeLocator$isInsert.value;\n }\n\n if (pId === undefined) {\n var t = (cVal - pixelScalars[edgeVerts[0]]) / (pixelScalars[edgeVerts[1]] - pixelScalars[edgeVerts[0]]);\n var x0 = pixelPts.slice(edgeVerts[0] * 2, (edgeVerts[0] + 1) * 2);\n var x1 = pixelPts.slice(edgeVerts[1] * 2, (edgeVerts[1] + 1) * 2);\n xyz[0] = x0[0] + t * (x1[0] - x0[0]);\n xyz[1] = x0[1] + t * (x1[1] - x0[1]);\n pId = points.length / 3;\n points.push(xyz[0], xyz[1], z);\n\n if (model.mergePoints) {\n edgeLocator.insertEdge(ids[edgeVerts[0]], ids[edgeVerts[1]], pId);\n }\n }\n\n lines.push(pId);\n }\n }\n };\n\n publicAPI.requestData = function (inData, outData) {\n // implement requestData\n var input = inData[0];\n\n if (!input) {\n vtkErrorMacro('Invalid or missing input');\n return;\n }\n\n console.time('msquares'); // Retrieve output and volume data\n\n var origin = input.getOrigin();\n var spacing = input.getSpacing();\n var dims = input.getDimensions();\n var s = input.getPointData().getScalars().getData(); // Points - dynamic array\n\n var pBuffer = []; // Cells - dynamic array\n\n var lBuffer = []; // Ensure slice is valid\n\n var slice = dims[0] * dims[1];\n var k = Math.round(model.slice);\n\n if (k >= dims[2]) {\n k = 0;\n } // Loop over all contour values, and then pixels, determine case and process\n\n\n for (var cv = 0; cv < model.contourValues.length; ++cv) {\n for (var j = 0; j < dims[1] - 1; ++j) {\n for (var i = 0; i < dims[0] - 1; ++i) {\n publicAPI.produceLines(model.contourValues[cv], i, j, k, slice, dims, origin, spacing, s, pBuffer, lBuffer);\n }\n }\n\n edgeLocator.initialize();\n } // Update output\n\n\n var polydata = vtkPolyData.newInstance();\n polydata.getPoints().setData(new Float32Array(pBuffer), 3);\n polydata.getLines().setData(new Uint32Array(lBuffer));\n outData[0] = polydata;\n vtkDebugMacro('Produced output');\n console.timeEnd('msquares');\n };\n} // ----------------------------------------------------------------------------\n// Object factory\n// ----------------------------------------------------------------------------\n\n\nvar DEFAULT_VALUES = {\n contourValues: [],\n slice: 0,\n mergePoints: false\n}; // ----------------------------------------------------------------------------\n\nfunction extend(publicAPI, model) {\n var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n Object.assign(model, DEFAULT_VALUES, initialValues); // Make this a VTK object\n\n macro.obj(publicAPI, model); // Also make it an algorithm with one input and one output\n\n macro.algo(publicAPI, model, 1, 1);\n macro.setGet(publicAPI, model, ['slice', 'mergePoints']); // Object specific methods\n\n macro.algo(publicAPI, model, 1, 1);\n vtkImageMarchingSquares(publicAPI, model);\n} // ----------------------------------------------------------------------------\n\nvar newInstance = macro.newInstance(extend, 'vtkImageMarchingSquares'); // ----------------------------------------------------------------------------\n\nvar vtkImageMarchingSquares$1 = {\n newInstance: newInstance,\n extend: extend\n};\n\nexport { vtkImageMarchingSquares$1 as default, extend, newInstance };\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView');\n\nmodule.exports = DataView;\n","var hashClear = require('./_hashClear'),\n hashDelete = require('./_hashDelete'),\n hashGet = require('./_hashGet'),\n hashHas = require('./_hashHas'),\n hashSet = require('./_hashSet');\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nmodule.exports = Hash;\n","var listCacheClear = require('./_listCacheClear'),\n listCacheDelete = require('./_listCacheDelete'),\n listCacheGet = require('./_listCacheGet'),\n listCacheHas = require('./_listCacheHas'),\n listCacheSet = require('./_listCacheSet');\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nmodule.exports = ListCache;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nmodule.exports = Map;\n","var mapCacheClear = require('./_mapCacheClear'),\n mapCacheDelete = require('./_mapCacheDelete'),\n mapCacheGet = require('./_mapCacheGet'),\n mapCacheHas = require('./_mapCacheHas'),\n mapCacheSet = require('./_mapCacheSet');\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nmodule.exports = MapCache;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Promise = getNative(root, 'Promise');\n\nmodule.exports = Promise;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Set = getNative(root, 'Set');\n\nmodule.exports = Set;\n","var MapCache = require('./_MapCache'),\n setCacheAdd = require('./_setCacheAdd'),\n setCacheHas = require('./_setCacheHas');\n\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\nfunction SetCache(values) {\n var index = -1,\n length = values == null ? 0 : values.length;\n\n this.__data__ = new MapCache;\n while (++index < length) {\n this.add(values[index]);\n }\n}\n\n// Add methods to `SetCache`.\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\n\nmodule.exports = SetCache;\n","var ListCache = require('./_ListCache'),\n stackClear = require('./_stackClear'),\n stackDelete = require('./_stackDelete'),\n stackGet = require('./_stackGet'),\n stackHas = require('./_stackHas'),\n stackSet = require('./_stackSet');\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n var data = this.__data__ = new ListCache(entries);\n this.size = data.size;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\nmodule.exports = Stack;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Uint8Array = root.Uint8Array;\n\nmodule.exports = Uint8Array;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar WeakMap = getNative(root, 'WeakMap');\n\nmodule.exports = WeakMap;\n","/**\n * A specialized version of `_.forEach` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\nfunction arrayEach(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (iteratee(array[index], index, array) === false) {\n break;\n }\n }\n return array;\n}\n\nmodule.exports = arrayEach;\n","/**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result[resIndex++] = value;\n }\n }\n return result;\n}\n\nmodule.exports = arrayFilter;\n","var baseTimes = require('./_baseTimes'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray'),\n isBuffer = require('./isBuffer'),\n isIndex = require('./_isIndex'),\n isTypedArray = require('./isTypedArray');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n var isArr = isArray(value),\n isArg = !isArr && isArguments(value),\n isBuff = !isArr && !isArg && isBuffer(value),\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n skipIndexes = isArr || isArg || isBuff || isType,\n result = skipIndexes ? baseTimes(value.length, String) : [],\n length = result.length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (\n // Safari 9 has enumerable `arguments.length` in strict mode.\n key == 'length' ||\n // Node.js 0.10 has enumerable non-index properties on buffers.\n (isBuff && (key == 'offset' || key == 'parent')) ||\n // PhantomJS 2 has enumerable non-index properties on typed arrays.\n (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n // Skip index properties.\n isIndex(key, length)\n ))) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = arrayLikeKeys;\n","/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n}\n\nmodule.exports = arrayMap;\n","/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n var index = -1,\n length = values.length,\n offset = array.length;\n\n while (++index < length) {\n array[offset + index] = values[index];\n }\n return array;\n}\n\nmodule.exports = arrayPush;\n","/**\n * A specialized version of `_.some` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */\nfunction arraySome(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (predicate(array[index], index, array)) {\n return true;\n }\n }\n return false;\n}\n\nmodule.exports = arraySome;\n","var baseAssignValue = require('./_baseAssignValue'),\n eq = require('./eq');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n var objValue = object[key];\n if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n}\n\nmodule.exports = assignValue;\n","var eq = require('./eq');\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\nmodule.exports = assocIndexOf;\n","var copyObject = require('./_copyObject'),\n keys = require('./keys');\n\n/**\n * The base implementation of `_.assign` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\nfunction baseAssign(object, source) {\n return object && copyObject(source, keys(source), object);\n}\n\nmodule.exports = baseAssign;\n","var copyObject = require('./_copyObject'),\n keysIn = require('./keysIn');\n\n/**\n * The base implementation of `_.assignIn` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\nfunction baseAssignIn(object, source) {\n return object && copyObject(source, keysIn(source), object);\n}\n\nmodule.exports = baseAssignIn;\n","var defineProperty = require('./_defineProperty');\n\n/**\n * The base implementation of `assignValue` and `assignMergeValue` without\n * value checks.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction baseAssignValue(object, key, value) {\n if (key == '__proto__' && defineProperty) {\n defineProperty(object, key, {\n 'configurable': true,\n 'enumerable': true,\n 'value': value,\n 'writable': true\n });\n } else {\n object[key] = value;\n }\n}\n\nmodule.exports = baseAssignValue;\n","var Stack = require('./_Stack'),\n arrayEach = require('./_arrayEach'),\n assignValue = require('./_assignValue'),\n baseAssign = require('./_baseAssign'),\n baseAssignIn = require('./_baseAssignIn'),\n cloneBuffer = require('./_cloneBuffer'),\n copyArray = require('./_copyArray'),\n copySymbols = require('./_copySymbols'),\n copySymbolsIn = require('./_copySymbolsIn'),\n getAllKeys = require('./_getAllKeys'),\n getAllKeysIn = require('./_getAllKeysIn'),\n getTag = require('./_getTag'),\n initCloneArray = require('./_initCloneArray'),\n initCloneByTag = require('./_initCloneByTag'),\n initCloneObject = require('./_initCloneObject'),\n isArray = require('./isArray'),\n isBuffer = require('./isBuffer'),\n isMap = require('./isMap'),\n isObject = require('./isObject'),\n isSet = require('./isSet'),\n keys = require('./keys'),\n keysIn = require('./keysIn');\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1,\n CLONE_FLAT_FLAG = 2,\n CLONE_SYMBOLS_FLAG = 4;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values supported by `_.clone`. */\nvar cloneableTags = {};\ncloneableTags[argsTag] = cloneableTags[arrayTag] =\ncloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\ncloneableTags[boolTag] = cloneableTags[dateTag] =\ncloneableTags[float32Tag] = cloneableTags[float64Tag] =\ncloneableTags[int8Tag] = cloneableTags[int16Tag] =\ncloneableTags[int32Tag] = cloneableTags[mapTag] =\ncloneableTags[numberTag] = cloneableTags[objectTag] =\ncloneableTags[regexpTag] = cloneableTags[setTag] =\ncloneableTags[stringTag] = cloneableTags[symbolTag] =\ncloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\ncloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\ncloneableTags[errorTag] = cloneableTags[funcTag] =\ncloneableTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n * traversed objects.\n *\n * @private\n * @param {*} value The value to clone.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Deep clone\n * 2 - Flatten inherited properties\n * 4 - Clone symbols\n * @param {Function} [customizer] The function to customize cloning.\n * @param {string} [key] The key of `value`.\n * @param {Object} [object] The parent object of `value`.\n * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n * @returns {*} Returns the cloned value.\n */\nfunction baseClone(value, bitmask, customizer, key, object, stack) {\n var result,\n isDeep = bitmask & CLONE_DEEP_FLAG,\n isFlat = bitmask & CLONE_FLAT_FLAG,\n isFull = bitmask & CLONE_SYMBOLS_FLAG;\n\n if (customizer) {\n result = object ? customizer(value, key, object, stack) : customizer(value);\n }\n if (result !== undefined) {\n return result;\n }\n if (!isObject(value)) {\n return value;\n }\n var isArr = isArray(value);\n if (isArr) {\n result = initCloneArray(value);\n if (!isDeep) {\n return copyArray(value, result);\n }\n } else {\n var tag = getTag(value),\n isFunc = tag == funcTag || tag == genTag;\n\n if (isBuffer(value)) {\n return cloneBuffer(value, isDeep);\n }\n if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n result = (isFlat || isFunc) ? {} : initCloneObject(value);\n if (!isDeep) {\n return isFlat\n ? copySymbolsIn(value, baseAssignIn(result, value))\n : copySymbols(value, baseAssign(result, value));\n }\n } else {\n if (!cloneableTags[tag]) {\n return object ? value : {};\n }\n result = initCloneByTag(value, tag, isDeep);\n }\n }\n // Check for circular references and return its corresponding clone.\n stack || (stack = new Stack);\n var stacked = stack.get(value);\n if (stacked) {\n return stacked;\n }\n stack.set(value, result);\n\n if (isSet(value)) {\n value.forEach(function(subValue) {\n result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));\n });\n } else if (isMap(value)) {\n value.forEach(function(subValue, key) {\n result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));\n });\n }\n\n var keysFunc = isFull\n ? (isFlat ? getAllKeysIn : getAllKeys)\n : (isFlat ? keysIn : keys);\n\n var props = isArr ? undefined : keysFunc(value);\n arrayEach(props || value, function(subValue, key) {\n if (props) {\n key = subValue;\n subValue = value[key];\n }\n // Recursively populate clone (susceptible to call stack limits).\n assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\n });\n return result;\n}\n\nmodule.exports = baseClone;\n","var isObject = require('./isObject');\n\n/** Built-in value references. */\nvar objectCreate = Object.create;\n\n/**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} proto The object to inherit from.\n * @returns {Object} Returns the new object.\n */\nvar baseCreate = (function() {\n function object() {}\n return function(proto) {\n if (!isObject(proto)) {\n return {};\n }\n if (objectCreate) {\n return objectCreate(proto);\n }\n object.prototype = proto;\n var result = new object;\n object.prototype = undefined;\n return result;\n };\n}());\n\nmodule.exports = baseCreate;\n","var baseForOwn = require('./_baseForOwn'),\n createBaseEach = require('./_createBaseEach');\n\n/**\n * The base implementation of `_.forEach` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n */\nvar baseEach = createBaseEach(baseForOwn);\n\nmodule.exports = baseEach;\n","var createBaseFor = require('./_createBaseFor');\n\n/**\n * The base implementation of `baseForOwn` which iterates over `object`\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\nvar baseFor = createBaseFor();\n\nmodule.exports = baseFor;\n","var baseFor = require('./_baseFor'),\n keys = require('./keys');\n\n/**\n * The base implementation of `_.forOwn` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\nfunction baseForOwn(object, iteratee) {\n return object && baseFor(object, iteratee, keys);\n}\n\nmodule.exports = baseForOwn;\n","var castPath = require('./_castPath'),\n toKey = require('./_toKey');\n\n/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n path = castPath(path, object);\n\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n return (index && index == length) ? object : undefined;\n}\n\nmodule.exports = baseGet;\n","var arrayPush = require('./_arrayPush'),\n isArray = require('./isArray');\n\n/**\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction baseGetAllKeys(object, keysFunc, symbolsFunc) {\n var result = keysFunc(object);\n return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n}\n\nmodule.exports = baseGetAllKeys;\n","/**\n * The base implementation of `_.hasIn` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHasIn(object, key) {\n return object != null && key in Object(object);\n}\n\nmodule.exports = baseHasIn;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nmodule.exports = baseIsArguments;\n","var baseIsEqualDeep = require('./_baseIsEqualDeep'),\n isObjectLike = require('./isObjectLike');\n\n/**\n * The base implementation of `_.isEqual` which supports partial comparisons\n * and tracks traversed objects.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Unordered comparison\n * 2 - Partial comparison\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\nfunction baseIsEqual(value, other, bitmask, customizer, stack) {\n if (value === other) {\n return true;\n }\n if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n return value !== value && other !== other;\n }\n return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n}\n\nmodule.exports = baseIsEqual;\n","var Stack = require('./_Stack'),\n equalArrays = require('./_equalArrays'),\n equalByTag = require('./_equalByTag'),\n equalObjects = require('./_equalObjects'),\n getTag = require('./_getTag'),\n isArray = require('./isArray'),\n isBuffer = require('./isBuffer'),\n isTypedArray = require('./isTypedArray');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n var objIsArr = isArray(object),\n othIsArr = isArray(other),\n objTag = objIsArr ? arrayTag : getTag(object),\n othTag = othIsArr ? arrayTag : getTag(other);\n\n objTag = objTag == argsTag ? objectTag : objTag;\n othTag = othTag == argsTag ? objectTag : othTag;\n\n var objIsObj = objTag == objectTag,\n othIsObj = othTag == objectTag,\n isSameTag = objTag == othTag;\n\n if (isSameTag && isBuffer(object)) {\n if (!isBuffer(other)) {\n return false;\n }\n objIsArr = true;\n objIsObj = false;\n }\n if (isSameTag && !objIsObj) {\n stack || (stack = new Stack);\n return (objIsArr || isTypedArray(object))\n ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n }\n if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n if (objIsWrapped || othIsWrapped) {\n var objUnwrapped = objIsWrapped ? object.value() : object,\n othUnwrapped = othIsWrapped ? other.value() : other;\n\n stack || (stack = new Stack);\n return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n }\n }\n if (!isSameTag) {\n return false;\n }\n stack || (stack = new Stack);\n return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n}\n\nmodule.exports = baseIsEqualDeep;\n","var getTag = require('./_getTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]';\n\n/**\n * The base implementation of `_.isMap` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n */\nfunction baseIsMap(value) {\n return isObjectLike(value) && getTag(value) == mapTag;\n}\n\nmodule.exports = baseIsMap;\n","var Stack = require('./_Stack'),\n baseIsEqual = require('./_baseIsEqual');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of `_.isMatch` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @param {Array} matchData The property names, values, and compare flags to match.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n */\nfunction baseIsMatch(object, source, matchData, customizer) {\n var index = matchData.length,\n length = index,\n noCustomizer = !customizer;\n\n if (object == null) {\n return !length;\n }\n object = Object(object);\n while (index--) {\n var data = matchData[index];\n if ((noCustomizer && data[2])\n ? data[1] !== object[data[0]]\n : !(data[0] in object)\n ) {\n return false;\n }\n }\n while (++index < length) {\n data = matchData[index];\n var key = data[0],\n objValue = object[key],\n srcValue = data[1];\n\n if (noCustomizer && data[2]) {\n if (objValue === undefined && !(key in object)) {\n return false;\n }\n } else {\n var stack = new Stack;\n if (customizer) {\n var result = customizer(objValue, srcValue, key, object, source, stack);\n }\n if (!(result === undefined\n ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)\n : result\n )) {\n return false;\n }\n }\n }\n return true;\n}\n\nmodule.exports = baseIsMatch;\n","var isFunction = require('./isFunction'),\n isMasked = require('./_isMasked'),\n isObject = require('./isObject'),\n toSource = require('./_toSource');\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\nmodule.exports = baseIsNative;\n","var getTag = require('./_getTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar setTag = '[object Set]';\n\n/**\n * The base implementation of `_.isSet` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n */\nfunction baseIsSet(value) {\n return isObjectLike(value) && getTag(value) == setTag;\n}\n\nmodule.exports = baseIsSet;\n","var baseGetTag = require('./_baseGetTag'),\n isLength = require('./isLength'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n return isObjectLike(value) &&\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\nmodule.exports = baseIsTypedArray;\n","var baseMatches = require('./_baseMatches'),\n baseMatchesProperty = require('./_baseMatchesProperty'),\n identity = require('./identity'),\n isArray = require('./isArray'),\n property = require('./property');\n\n/**\n * The base implementation of `_.iteratee`.\n *\n * @private\n * @param {*} [value=_.identity] The value to convert to an iteratee.\n * @returns {Function} Returns the iteratee.\n */\nfunction baseIteratee(value) {\n // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n if (typeof value == 'function') {\n return value;\n }\n if (value == null) {\n return identity;\n }\n if (typeof value == 'object') {\n return isArray(value)\n ? baseMatchesProperty(value[0], value[1])\n : baseMatches(value);\n }\n return property(value);\n}\n\nmodule.exports = baseIteratee;\n","var isPrototype = require('./_isPrototype'),\n nativeKeys = require('./_nativeKeys');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n if (!isPrototype(object)) {\n return nativeKeys(object);\n }\n var result = [];\n for (var key in Object(object)) {\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = baseKeys;\n","var isObject = require('./isObject'),\n isPrototype = require('./_isPrototype'),\n nativeKeysIn = require('./_nativeKeysIn');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeysIn(object) {\n if (!isObject(object)) {\n return nativeKeysIn(object);\n }\n var isProto = isPrototype(object),\n result = [];\n\n for (var key in object) {\n if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = baseKeysIn;\n","var baseEach = require('./_baseEach'),\n isArrayLike = require('./isArrayLike');\n\n/**\n * The base implementation of `_.map` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction baseMap(collection, iteratee) {\n var index = -1,\n result = isArrayLike(collection) ? Array(collection.length) : [];\n\n baseEach(collection, function(value, key, collection) {\n result[++index] = iteratee(value, key, collection);\n });\n return result;\n}\n\nmodule.exports = baseMap;\n","var baseIsMatch = require('./_baseIsMatch'),\n getMatchData = require('./_getMatchData'),\n matchesStrictComparable = require('./_matchesStrictComparable');\n\n/**\n * The base implementation of `_.matches` which doesn't clone `source`.\n *\n * @private\n * @param {Object} source The object of property values to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatches(source) {\n var matchData = getMatchData(source);\n if (matchData.length == 1 && matchData[0][2]) {\n return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n }\n return function(object) {\n return object === source || baseIsMatch(object, source, matchData);\n };\n}\n\nmodule.exports = baseMatches;\n","var baseIsEqual = require('./_baseIsEqual'),\n get = require('./get'),\n hasIn = require('./hasIn'),\n isKey = require('./_isKey'),\n isStrictComparable = require('./_isStrictComparable'),\n matchesStrictComparable = require('./_matchesStrictComparable'),\n toKey = require('./_toKey');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n *\n * @private\n * @param {string} path The path of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatchesProperty(path, srcValue) {\n if (isKey(path) && isStrictComparable(srcValue)) {\n return matchesStrictComparable(toKey(path), srcValue);\n }\n return function(object) {\n var objValue = get(object, path);\n return (objValue === undefined && objValue === srcValue)\n ? hasIn(object, path)\n : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\n };\n}\n\nmodule.exports = baseMatchesProperty;\n","/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n}\n\nmodule.exports = baseProperty;\n","var baseGet = require('./_baseGet');\n\n/**\n * A specialized version of `baseProperty` which supports deep paths.\n *\n * @private\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction basePropertyDeep(path) {\n return function(object) {\n return baseGet(object, path);\n };\n}\n\nmodule.exports = basePropertyDeep;\n","/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\nmodule.exports = baseTimes;\n","var Symbol = require('./_Symbol'),\n arrayMap = require('./_arrayMap'),\n isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isArray(value)) {\n // Recursively convert values (susceptible to call stack limits).\n return arrayMap(value, baseToString) + '';\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = baseToString;\n","/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function(value) {\n return func(value);\n };\n}\n\nmodule.exports = baseUnary;\n","/**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction cacheHas(cache, key) {\n return cache.has(key);\n}\n\nmodule.exports = cacheHas;\n","var identity = require('./identity');\n\n/**\n * Casts `value` to `identity` if it's not a function.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {Function} Returns cast function.\n */\nfunction castFunction(value) {\n return typeof value == 'function' ? value : identity;\n}\n\nmodule.exports = castFunction;\n","var isArray = require('./isArray'),\n isKey = require('./_isKey'),\n stringToPath = require('./_stringToPath'),\n toString = require('./toString');\n\n/**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {Object} [object] The object to query keys on.\n * @returns {Array} Returns the cast property path array.\n */\nfunction castPath(value, object) {\n if (isArray(value)) {\n return value;\n }\n return isKey(value, object) ? [value] : stringToPath(toString(value));\n}\n\nmodule.exports = castPath;\n","var Uint8Array = require('./_Uint8Array');\n\n/**\n * Creates a clone of `arrayBuffer`.\n *\n * @private\n * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n * @returns {ArrayBuffer} Returns the cloned array buffer.\n */\nfunction cloneArrayBuffer(arrayBuffer) {\n var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n return result;\n}\n\nmodule.exports = cloneArrayBuffer;\n","var root = require('./_root');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined,\n allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined;\n\n/**\n * Creates a clone of `buffer`.\n *\n * @private\n * @param {Buffer} buffer The buffer to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Buffer} Returns the cloned buffer.\n */\nfunction cloneBuffer(buffer, isDeep) {\n if (isDeep) {\n return buffer.slice();\n }\n var length = buffer.length,\n result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n\n buffer.copy(result);\n return result;\n}\n\nmodule.exports = cloneBuffer;\n","var cloneArrayBuffer = require('./_cloneArrayBuffer');\n\n/**\n * Creates a clone of `dataView`.\n *\n * @private\n * @param {Object} dataView The data view to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned data view.\n */\nfunction cloneDataView(dataView, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n}\n\nmodule.exports = cloneDataView;\n","/** Used to match `RegExp` flags from their coerced string values. */\nvar reFlags = /\\w*$/;\n\n/**\n * Creates a clone of `regexp`.\n *\n * @private\n * @param {Object} regexp The regexp to clone.\n * @returns {Object} Returns the cloned regexp.\n */\nfunction cloneRegExp(regexp) {\n var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\n result.lastIndex = regexp.lastIndex;\n return result;\n}\n\nmodule.exports = cloneRegExp;\n","var Symbol = require('./_Symbol');\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * Creates a clone of the `symbol` object.\n *\n * @private\n * @param {Object} symbol The symbol object to clone.\n * @returns {Object} Returns the cloned symbol object.\n */\nfunction cloneSymbol(symbol) {\n return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\n}\n\nmodule.exports = cloneSymbol;\n","var cloneArrayBuffer = require('./_cloneArrayBuffer');\n\n/**\n * Creates a clone of `typedArray`.\n *\n * @private\n * @param {Object} typedArray The typed array to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned typed array.\n */\nfunction cloneTypedArray(typedArray, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n}\n\nmodule.exports = cloneTypedArray;\n","/**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */\nfunction copyArray(source, array) {\n var index = -1,\n length = source.length;\n\n array || (array = Array(length));\n while (++index < length) {\n array[index] = source[index];\n }\n return array;\n}\n\nmodule.exports = copyArray;\n","var assignValue = require('./_assignValue'),\n baseAssignValue = require('./_baseAssignValue');\n\n/**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property identifiers to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @param {Function} [customizer] The function to customize copied values.\n * @returns {Object} Returns `object`.\n */\nfunction copyObject(source, props, object, customizer) {\n var isNew = !object;\n object || (object = {});\n\n var index = -1,\n length = props.length;\n\n while (++index < length) {\n var key = props[index];\n\n var newValue = customizer\n ? customizer(object[key], source[key], key, object, source)\n : undefined;\n\n if (newValue === undefined) {\n newValue = source[key];\n }\n if (isNew) {\n baseAssignValue(object, key, newValue);\n } else {\n assignValue(object, key, newValue);\n }\n }\n return object;\n}\n\nmodule.exports = copyObject;\n","var copyObject = require('./_copyObject'),\n getSymbols = require('./_getSymbols');\n\n/**\n * Copies own symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\nfunction copySymbols(source, object) {\n return copyObject(source, getSymbols(source), object);\n}\n\nmodule.exports = copySymbols;\n","var copyObject = require('./_copyObject'),\n getSymbolsIn = require('./_getSymbolsIn');\n\n/**\n * Copies own and inherited symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\nfunction copySymbolsIn(source, object) {\n return copyObject(source, getSymbolsIn(source), object);\n}\n\nmodule.exports = copySymbolsIn;\n","var root = require('./_root');\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nmodule.exports = coreJsData;\n","var isArrayLike = require('./isArrayLike');\n\n/**\n * Creates a `baseEach` or `baseEachRight` function.\n *\n * @private\n * @param {Function} eachFunc The function to iterate over a collection.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseEach(eachFunc, fromRight) {\n return function(collection, iteratee) {\n if (collection == null) {\n return collection;\n }\n if (!isArrayLike(collection)) {\n return eachFunc(collection, iteratee);\n }\n var length = collection.length,\n index = fromRight ? length : -1,\n iterable = Object(collection);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (iteratee(iterable[index], index, iterable) === false) {\n break;\n }\n }\n return collection;\n };\n}\n\nmodule.exports = createBaseEach;\n","/**\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseFor(fromRight) {\n return function(object, iteratee, keysFunc) {\n var index = -1,\n iterable = Object(object),\n props = keysFunc(object),\n length = props.length;\n\n while (length--) {\n var key = props[fromRight ? length : ++index];\n if (iteratee(iterable[key], key, iterable) === false) {\n break;\n }\n }\n return object;\n };\n}\n\nmodule.exports = createBaseFor;\n","var getNative = require('./_getNative');\n\nvar defineProperty = (function() {\n try {\n var func = getNative(Object, 'defineProperty');\n func({}, '', {});\n return func;\n } catch (e) {}\n}());\n\nmodule.exports = defineProperty;\n","var SetCache = require('./_SetCache'),\n arraySome = require('./_arraySome'),\n cacheHas = require('./_cacheHas');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `array` and `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\nfunction equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n arrLength = array.length,\n othLength = other.length;\n\n if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n return false;\n }\n // Check that cyclic values are equal.\n var arrStacked = stack.get(array);\n var othStacked = stack.get(other);\n if (arrStacked && othStacked) {\n return arrStacked == other && othStacked == array;\n }\n var index = -1,\n result = true,\n seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n stack.set(array, other);\n stack.set(other, array);\n\n // Ignore non-index properties.\n while (++index < arrLength) {\n var arrValue = array[index],\n othValue = other[index];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, arrValue, index, other, array, stack)\n : customizer(arrValue, othValue, index, array, other, stack);\n }\n if (compared !== undefined) {\n if (compared) {\n continue;\n }\n result = false;\n break;\n }\n // Recursively compare arrays (susceptible to call stack limits).\n if (seen) {\n if (!arraySome(other, function(othValue, othIndex) {\n if (!cacheHas(seen, othIndex) &&\n (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n return seen.push(othIndex);\n }\n })) {\n result = false;\n break;\n }\n } else if (!(\n arrValue === othValue ||\n equalFunc(arrValue, othValue, bitmask, customizer, stack)\n )) {\n result = false;\n break;\n }\n }\n stack['delete'](array);\n stack['delete'](other);\n return result;\n}\n\nmodule.exports = equalArrays;\n","var Symbol = require('./_Symbol'),\n Uint8Array = require('./_Uint8Array'),\n eq = require('./eq'),\n equalArrays = require('./_equalArrays'),\n mapToArray = require('./_mapToArray'),\n setToArray = require('./_setToArray');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]';\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n switch (tag) {\n case dataViewTag:\n if ((object.byteLength != other.byteLength) ||\n (object.byteOffset != other.byteOffset)) {\n return false;\n }\n object = object.buffer;\n other = other.buffer;\n\n case arrayBufferTag:\n if ((object.byteLength != other.byteLength) ||\n !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n return false;\n }\n return true;\n\n case boolTag:\n case dateTag:\n case numberTag:\n // Coerce booleans to `1` or `0` and dates to milliseconds.\n // Invalid dates are coerced to `NaN`.\n return eq(+object, +other);\n\n case errorTag:\n return object.name == other.name && object.message == other.message;\n\n case regexpTag:\n case stringTag:\n // Coerce regexes to strings and treat strings, primitives and objects,\n // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n // for more details.\n return object == (other + '');\n\n case mapTag:\n var convert = mapToArray;\n\n case setTag:\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n convert || (convert = setToArray);\n\n if (object.size != other.size && !isPartial) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked) {\n return stacked == other;\n }\n bitmask |= COMPARE_UNORDERED_FLAG;\n\n // Recursively compare objects (susceptible to call stack limits).\n stack.set(object, other);\n var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n stack['delete'](object);\n return result;\n\n case symbolTag:\n if (symbolValueOf) {\n return symbolValueOf.call(object) == symbolValueOf.call(other);\n }\n }\n return false;\n}\n\nmodule.exports = equalByTag;\n","var getAllKeys = require('./_getAllKeys');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n objProps = getAllKeys(object),\n objLength = objProps.length,\n othProps = getAllKeys(other),\n othLength = othProps.length;\n\n if (objLength != othLength && !isPartial) {\n return false;\n }\n var index = objLength;\n while (index--) {\n var key = objProps[index];\n if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n return false;\n }\n }\n // Check that cyclic values are equal.\n var objStacked = stack.get(object);\n var othStacked = stack.get(other);\n if (objStacked && othStacked) {\n return objStacked == other && othStacked == object;\n }\n var result = true;\n stack.set(object, other);\n stack.set(other, object);\n\n var skipCtor = isPartial;\n while (++index < objLength) {\n key = objProps[index];\n var objValue = object[key],\n othValue = other[key];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, objValue, key, other, object, stack)\n : customizer(objValue, othValue, key, object, other, stack);\n }\n // Recursively compare objects (susceptible to call stack limits).\n if (!(compared === undefined\n ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n : compared\n )) {\n result = false;\n break;\n }\n skipCtor || (skipCtor = key == 'constructor');\n }\n if (result && !skipCtor) {\n var objCtor = object.constructor,\n othCtor = other.constructor;\n\n // Non `Object` object instances with different constructors are not equal.\n if (objCtor != othCtor &&\n ('constructor' in object && 'constructor' in other) &&\n !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n result = false;\n }\n }\n stack['delete'](object);\n stack['delete'](other);\n return result;\n}\n\nmodule.exports = equalObjects;\n","var baseGetAllKeys = require('./_baseGetAllKeys'),\n getSymbols = require('./_getSymbols'),\n keys = require('./keys');\n\n/**\n * Creates an array of own enumerable property names and symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeys(object) {\n return baseGetAllKeys(object, keys, getSymbols);\n}\n\nmodule.exports = getAllKeys;\n","var baseGetAllKeys = require('./_baseGetAllKeys'),\n getSymbolsIn = require('./_getSymbolsIn'),\n keysIn = require('./keysIn');\n\n/**\n * Creates an array of own and inherited enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeysIn(object) {\n return baseGetAllKeys(object, keysIn, getSymbolsIn);\n}\n\nmodule.exports = getAllKeysIn;\n","var isKeyable = require('./_isKeyable');\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\nmodule.exports = getMapData;\n","var isStrictComparable = require('./_isStrictComparable'),\n keys = require('./keys');\n\n/**\n * Gets the property names, values, and compare flags of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the match data of `object`.\n */\nfunction getMatchData(object) {\n var result = keys(object),\n length = result.length;\n\n while (length--) {\n var key = result[length],\n value = object[key];\n\n result[length] = [key, value, isStrictComparable(value)];\n }\n return result;\n}\n\nmodule.exports = getMatchData;\n","var baseIsNative = require('./_baseIsNative'),\n getValue = require('./_getValue');\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\nmodule.exports = getNative;\n","var overArg = require('./_overArg');\n\n/** Built-in value references. */\nvar getPrototype = overArg(Object.getPrototypeOf, Object);\n\nmodule.exports = getPrototype;\n","var arrayFilter = require('./_arrayFilter'),\n stubArray = require('./stubArray');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n if (object == null) {\n return [];\n }\n object = Object(object);\n return arrayFilter(nativeGetSymbols(object), function(symbol) {\n return propertyIsEnumerable.call(object, symbol);\n });\n};\n\nmodule.exports = getSymbols;\n","var arrayPush = require('./_arrayPush'),\n getPrototype = require('./_getPrototype'),\n getSymbols = require('./_getSymbols'),\n stubArray = require('./stubArray');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own and inherited enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {\n var result = [];\n while (object) {\n arrayPush(result, getSymbols(object));\n object = getPrototype(object);\n }\n return result;\n};\n\nmodule.exports = getSymbolsIn;\n","var DataView = require('./_DataView'),\n Map = require('./_Map'),\n Promise = require('./_Promise'),\n Set = require('./_Set'),\n WeakMap = require('./_WeakMap'),\n baseGetTag = require('./_baseGetTag'),\n toSource = require('./_toSource');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n objectTag = '[object Object]',\n promiseTag = '[object Promise]',\n setTag = '[object Set]',\n weakMapTag = '[object WeakMap]';\n\nvar dataViewTag = '[object DataView]';\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n mapCtorString = toSource(Map),\n promiseCtorString = toSource(Promise),\n setCtorString = toSource(Set),\n weakMapCtorString = toSource(WeakMap);\n\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n (Map && getTag(new Map) != mapTag) ||\n (Promise && getTag(Promise.resolve()) != promiseTag) ||\n (Set && getTag(new Set) != setTag) ||\n (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n getTag = function(value) {\n var result = baseGetTag(value),\n Ctor = result == objectTag ? value.constructor : undefined,\n ctorString = Ctor ? toSource(Ctor) : '';\n\n if (ctorString) {\n switch (ctorString) {\n case dataViewCtorString: return dataViewTag;\n case mapCtorString: return mapTag;\n case promiseCtorString: return promiseTag;\n case setCtorString: return setTag;\n case weakMapCtorString: return weakMapTag;\n }\n }\n return result;\n };\n}\n\nmodule.exports = getTag;\n","/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\nmodule.exports = getValue;\n","var castPath = require('./_castPath'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray'),\n isIndex = require('./_isIndex'),\n isLength = require('./isLength'),\n toKey = require('./_toKey');\n\n/**\n * Checks if `path` exists on `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @param {Function} hasFunc The function to check properties.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n */\nfunction hasPath(object, path, hasFunc) {\n path = castPath(path, object);\n\n var index = -1,\n length = path.length,\n result = false;\n\n while (++index < length) {\n var key = toKey(path[index]);\n if (!(result = object != null && hasFunc(object, key))) {\n break;\n }\n object = object[key];\n }\n if (result || ++index != length) {\n return result;\n }\n length = object == null ? 0 : object.length;\n return !!length && isLength(length) && isIndex(key, length) &&\n (isArray(object) || isArguments(object));\n}\n\nmodule.exports = hasPath;\n","var nativeCreate = require('./_nativeCreate');\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n}\n\nmodule.exports = hashClear;\n","/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = hashDelete;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nmodule.exports = hashGet;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\nmodule.exports = hashHas;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\nmodule.exports = hashSet;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Initializes an array clone.\n *\n * @private\n * @param {Array} array The array to clone.\n * @returns {Array} Returns the initialized clone.\n */\nfunction initCloneArray(array) {\n var length = array.length,\n result = new array.constructor(length);\n\n // Add properties assigned by `RegExp#exec`.\n if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n result.index = array.index;\n result.input = array.input;\n }\n return result;\n}\n\nmodule.exports = initCloneArray;\n","var cloneArrayBuffer = require('./_cloneArrayBuffer'),\n cloneDataView = require('./_cloneDataView'),\n cloneRegExp = require('./_cloneRegExp'),\n cloneSymbol = require('./_cloneSymbol'),\n cloneTypedArray = require('./_cloneTypedArray');\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/**\n * Initializes an object clone based on its `toStringTag`.\n *\n * **Note:** This function only supports cloning values with tags of\n * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.\n *\n * @private\n * @param {Object} object The object to clone.\n * @param {string} tag The `toStringTag` of the object to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneByTag(object, tag, isDeep) {\n var Ctor = object.constructor;\n switch (tag) {\n case arrayBufferTag:\n return cloneArrayBuffer(object);\n\n case boolTag:\n case dateTag:\n return new Ctor(+object);\n\n case dataViewTag:\n return cloneDataView(object, isDeep);\n\n case float32Tag: case float64Tag:\n case int8Tag: case int16Tag: case int32Tag:\n case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n return cloneTypedArray(object, isDeep);\n\n case mapTag:\n return new Ctor;\n\n case numberTag:\n case stringTag:\n return new Ctor(object);\n\n case regexpTag:\n return cloneRegExp(object);\n\n case setTag:\n return new Ctor;\n\n case symbolTag:\n return cloneSymbol(object);\n }\n}\n\nmodule.exports = initCloneByTag;\n","var baseCreate = require('./_baseCreate'),\n getPrototype = require('./_getPrototype'),\n isPrototype = require('./_isPrototype');\n\n/**\n * Initializes an object clone.\n *\n * @private\n * @param {Object} object The object to clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneObject(object) {\n return (typeof object.constructor == 'function' && !isPrototype(object))\n ? baseCreate(getPrototype(object))\n : {};\n}\n\nmodule.exports = initCloneObject;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n var type = typeof value;\n length = length == null ? MAX_SAFE_INTEGER : length;\n\n return !!length &&\n (type == 'number' ||\n (type != 'symbol' && reIsUint.test(value))) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\nmodule.exports = isIndex;\n","var isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/;\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n if (isArray(value)) {\n return false;\n }\n var type = typeof value;\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n value == null || isSymbol(value)) {\n return true;\n }\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n (object != null && value in Object(object));\n}\n\nmodule.exports = isKey;\n","/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\nmodule.exports = isKeyable;\n","var coreJsData = require('./_coreJsData');\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\nmodule.exports = isMasked;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\nmodule.exports = isPrototype;\n","var isObject = require('./isObject');\n\n/**\n * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` if suitable for strict\n * equality comparisons, else `false`.\n */\nfunction isStrictComparable(value) {\n return value === value && !isObject(value);\n}\n\nmodule.exports = isStrictComparable;\n","/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n}\n\nmodule.exports = listCacheClear;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n}\n\nmodule.exports = listCacheDelete;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\nmodule.exports = listCacheGet;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\nmodule.exports = listCacheHas;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\nmodule.exports = listCacheSet;\n","var Hash = require('./_Hash'),\n ListCache = require('./_ListCache'),\n Map = require('./_Map');\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\nmodule.exports = mapCacheClear;\n","var getMapData = require('./_getMapData');\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = mapCacheDelete;\n","var getMapData = require('./_getMapData');\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\nmodule.exports = mapCacheGet;\n","var getMapData = require('./_getMapData');\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\nmodule.exports = mapCacheHas;\n","var getMapData = require('./_getMapData');\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n}\n\nmodule.exports = mapCacheSet;\n","/**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\nfunction mapToArray(map) {\n var index = -1,\n result = Array(map.size);\n\n map.forEach(function(value, key) {\n result[++index] = [key, value];\n });\n return result;\n}\n\nmodule.exports = mapToArray;\n","/**\n * A specialized version of `matchesProperty` for source values suitable\n * for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction matchesStrictComparable(key, srcValue) {\n return function(object) {\n if (object == null) {\n return false;\n }\n return object[key] === srcValue &&\n (srcValue !== undefined || (key in Object(object)));\n };\n}\n\nmodule.exports = matchesStrictComparable;\n","var memoize = require('./memoize');\n\n/** Used as the maximum memoize cache size. */\nvar MAX_MEMOIZE_SIZE = 500;\n\n/**\n * A specialized version of `_.memoize` which clears the memoized function's\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n *\n * @private\n * @param {Function} func The function to have its output memoized.\n * @returns {Function} Returns the new memoized function.\n */\nfunction memoizeCapped(func) {\n var result = memoize(func, function(key) {\n if (cache.size === MAX_MEMOIZE_SIZE) {\n cache.clear();\n }\n return key;\n });\n\n var cache = result.cache;\n return result;\n}\n\nmodule.exports = memoizeCapped;\n","var getNative = require('./_getNative');\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\nmodule.exports = nativeCreate;\n","var overArg = require('./_overArg');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = overArg(Object.keys, Object);\n\nmodule.exports = nativeKeys;\n","/**\n * This function is like\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * except that it includes inherited enumerable properties.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction nativeKeysIn(object) {\n var result = [];\n if (object != null) {\n for (var key in Object(object)) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = nativeKeysIn;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n try {\n // Use `util.types` for Node.js 10+.\n var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n if (types) {\n return types;\n }\n\n // Legacy `process.binding('util')` for Node.js < 10.\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n}());\n\nmodule.exports = nodeUtil;\n","/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n}\n\nmodule.exports = overArg;\n","/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\nfunction setCacheAdd(value) {\n this.__data__.set(value, HASH_UNDEFINED);\n return this;\n}\n\nmodule.exports = setCacheAdd;\n","/**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\nfunction setCacheHas(value) {\n return this.__data__.has(value);\n}\n\nmodule.exports = setCacheHas;\n","/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n var index = -1,\n result = Array(set.size);\n\n set.forEach(function(value) {\n result[++index] = value;\n });\n return result;\n}\n\nmodule.exports = setToArray;\n","var ListCache = require('./_ListCache');\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n this.__data__ = new ListCache;\n this.size = 0;\n}\n\nmodule.exports = stackClear;\n","/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n var data = this.__data__,\n result = data['delete'](key);\n\n this.size = data.size;\n return result;\n}\n\nmodule.exports = stackDelete;\n","/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n return this.__data__.get(key);\n}\n\nmodule.exports = stackGet;\n","/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n return this.__data__.has(key);\n}\n\nmodule.exports = stackHas;\n","var ListCache = require('./_ListCache'),\n Map = require('./_Map'),\n MapCache = require('./_MapCache');\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n var data = this.__data__;\n if (data instanceof ListCache) {\n var pairs = data.__data__;\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n pairs.push([key, value]);\n this.size = ++data.size;\n return this;\n }\n data = this.__data__ = new MapCache(pairs);\n }\n data.set(key, value);\n this.size = data.size;\n return this;\n}\n\nmodule.exports = stackSet;\n","var memoizeCapped = require('./_memoizeCapped');\n\n/** Used to match property names within property paths. */\nvar rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\nvar stringToPath = memoizeCapped(function(string) {\n var result = [];\n if (string.charCodeAt(0) === 46 /* . */) {\n result.push('');\n }\n string.replace(rePropName, function(match, number, quote, subString) {\n result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n });\n return result;\n});\n\nmodule.exports = stringToPath;\n","var isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n if (typeof value == 'string' || isSymbol(value)) {\n return value;\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = toKey;\n","/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\nmodule.exports = toSource;\n","var baseClone = require('./_baseClone');\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1,\n CLONE_SYMBOLS_FLAG = 4;\n\n/**\n * This method is like `_.clone` except that it recursively clones `value`.\n *\n * @static\n * @memberOf _\n * @since 1.0.0\n * @category Lang\n * @param {*} value The value to recursively clone.\n * @returns {*} Returns the deep cloned value.\n * @see _.clone\n * @example\n *\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\n *\n * var deep = _.cloneDeep(objects);\n * console.log(deep[0] === objects[0]);\n * // => false\n */\nfunction cloneDeep(value) {\n return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);\n}\n\nmodule.exports = cloneDeep;\n","/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\nmodule.exports = eq;\n","var baseForOwn = require('./_baseForOwn'),\n castFunction = require('./_castFunction');\n\n/**\n * Iterates over own enumerable string keyed properties of an object and\n * invokes `iteratee` for each property. The iteratee is invoked with three\n * arguments: (value, key, object). Iteratee functions may exit iteration\n * early by explicitly returning `false`.\n *\n * @static\n * @memberOf _\n * @since 0.3.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns `object`.\n * @see _.forOwnRight\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forOwn(new Foo, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n */\nfunction forOwn(object, iteratee) {\n return object && baseForOwn(object, castFunction(iteratee));\n}\n\nmodule.exports = forOwn;\n","var baseGet = require('./_baseGet');\n\n/**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\nfunction get(object, path, defaultValue) {\n var result = object == null ? undefined : baseGet(object, path);\n return result === undefined ? defaultValue : result;\n}\n\nmodule.exports = get;\n","var baseHasIn = require('./_baseHasIn'),\n hasPath = require('./_hasPath');\n\n/**\n * Checks if `path` is a direct or inherited property of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.hasIn(object, 'a');\n * // => true\n *\n * _.hasIn(object, 'a.b');\n * // => true\n *\n * _.hasIn(object, ['a', 'b']);\n * // => true\n *\n * _.hasIn(object, 'b');\n * // => false\n */\nfunction hasIn(object, path) {\n return object != null && hasPath(object, path, baseHasIn);\n}\n\nmodule.exports = hasIn;\n","/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n return value;\n}\n\nmodule.exports = identity;\n","var baseIsArguments = require('./_baseIsArguments'),\n isObjectLike = require('./isObjectLike');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n !propertyIsEnumerable.call(value, 'callee');\n};\n\nmodule.exports = isArguments;\n","/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nmodule.exports = isArray;\n","var isFunction = require('./isFunction'),\n isLength = require('./isLength');\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\nmodule.exports = isArrayLike;\n","var root = require('./_root'),\n stubFalse = require('./stubFalse');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\nmodule.exports = isBuffer;\n","var baseGetTag = require('./_baseGetTag'),\n isObject = require('./isObject');\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nmodule.exports = isFunction;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nmodule.exports = isLength;\n","var baseIsMap = require('./_baseIsMap'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsMap = nodeUtil && nodeUtil.isMap;\n\n/**\n * Checks if `value` is classified as a `Map` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n * @example\n *\n * _.isMap(new Map);\n * // => true\n *\n * _.isMap(new WeakMap);\n * // => false\n */\nvar isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\n\nmodule.exports = isMap;\n","var baseGetTag = require('./_baseGetTag'),\n getPrototype = require('./_getPrototype'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to infer the `Object` constructor. */\nvar objectCtorString = funcToString.call(Object);\n\n/**\n * Checks if `value` is a plain object, that is, an object created by the\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\n *\n * @static\n * @memberOf _\n * @since 0.8.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\nfunction isPlainObject(value) {\n if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n return false;\n }\n var proto = getPrototype(value);\n if (proto === null) {\n return true;\n }\n var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n funcToString.call(Ctor) == objectCtorString;\n}\n\nmodule.exports = isPlainObject;\n","var baseIsSet = require('./_baseIsSet'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsSet = nodeUtil && nodeUtil.isSet;\n\n/**\n * Checks if `value` is classified as a `Set` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n * @example\n *\n * _.isSet(new Set);\n * // => true\n *\n * _.isSet(new WeakSet);\n * // => false\n */\nvar isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\n\nmodule.exports = isSet;\n","var baseGetTag = require('./_baseGetTag'),\n isArray = require('./isArray'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar stringTag = '[object String]';\n\n/**\n * Checks if `value` is classified as a `String` primitive or object.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a string, else `false`.\n * @example\n *\n * _.isString('abc');\n * // => true\n *\n * _.isString(1);\n * // => false\n */\nfunction isString(value) {\n return typeof value == 'string' ||\n (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);\n}\n\nmodule.exports = isString;\n","var baseIsTypedArray = require('./_baseIsTypedArray'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\nmodule.exports = isTypedArray;\n","var arrayLikeKeys = require('./_arrayLikeKeys'),\n baseKeys = require('./_baseKeys'),\n isArrayLike = require('./isArrayLike');\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\nmodule.exports = keys;\n","var arrayLikeKeys = require('./_arrayLikeKeys'),\n baseKeysIn = require('./_baseKeysIn'),\n isArrayLike = require('./isArrayLike');\n\n/**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\nfunction keysIn(object) {\n return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n}\n\nmodule.exports = keysIn;\n","var arrayMap = require('./_arrayMap'),\n baseIteratee = require('./_baseIteratee'),\n baseMap = require('./_baseMap'),\n isArray = require('./isArray');\n\n/**\n * Creates an array of values by running each element in `collection` thru\n * `iteratee`. The iteratee is invoked with three arguments:\n * (value, index|key, collection).\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.\n *\n * The guarded methods are:\n * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,\n * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,\n * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,\n * `template`, `trim`, `trimEnd`, `trimStart`, and `words`\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * _.map([4, 8], square);\n * // => [16, 64]\n *\n * _.map({ 'a': 4, 'b': 8 }, square);\n * // => [16, 64] (iteration order is not guaranteed)\n *\n * var users = [\n * { 'user': 'barney' },\n * { 'user': 'fred' }\n * ];\n *\n * // The `_.property` iteratee shorthand.\n * _.map(users, 'user');\n * // => ['barney', 'fred']\n */\nfunction map(collection, iteratee) {\n var func = isArray(collection) ? arrayMap : baseMap;\n return func(collection, baseIteratee(iteratee, 3));\n}\n\nmodule.exports = map;\n","var MapCache = require('./_MapCache');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var memoized = function() {\n var args = arguments,\n key = resolver ? resolver.apply(this, args) : args[0],\n cache = memoized.cache;\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result) || cache;\n return result;\n };\n memoized.cache = new (memoize.Cache || MapCache);\n return memoized;\n}\n\n// Expose `MapCache`.\nmemoize.Cache = MapCache;\n\nmodule.exports = memoize;\n","var baseProperty = require('./_baseProperty'),\n basePropertyDeep = require('./_basePropertyDeep'),\n isKey = require('./_isKey'),\n toKey = require('./_toKey');\n\n/**\n * Creates a function that returns the value at `path` of a given object.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n * @example\n *\n * var objects = [\n * { 'a': { 'b': 2 } },\n * { 'a': { 'b': 1 } }\n * ];\n *\n * _.map(objects, _.property('a.b'));\n * // => [2, 1]\n *\n * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');\n * // => [1, 2]\n */\nfunction property(path) {\n return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n}\n\nmodule.exports = property;\n","/**\n * This method returns a new empty array.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Array} Returns the new empty array.\n * @example\n *\n * var arrays = _.times(2, _.stubArray);\n *\n * console.log(arrays);\n * // => [[], []]\n *\n * console.log(arrays[0] === arrays[1]);\n * // => false\n */\nfunction stubArray() {\n return [];\n}\n\nmodule.exports = stubArray;\n","/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nmodule.exports = stubFalse;\n","var baseToString = require('./_baseToString');\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\nmodule.exports = toString;\n","var checkboardCache = {};\n\nexport var render = function render(c1, c2, size, serverCanvas) {\n if (typeof document === 'undefined' && !serverCanvas) {\n return null;\n }\n var canvas = serverCanvas ? new serverCanvas() : document.createElement('canvas');\n canvas.width = size * 2;\n canvas.height = size * 2;\n var ctx = canvas.getContext('2d');\n if (!ctx) {\n return null;\n } // If no context can be found, return early.\n ctx.fillStyle = c1;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n ctx.fillStyle = c2;\n ctx.fillRect(0, 0, size, size);\n ctx.translate(size, size);\n ctx.fillRect(0, 0, size, size);\n return canvas.toDataURL();\n};\n\nexport var get = function get(c1, c2, size, serverCanvas) {\n var key = c1 + '-' + c2 + '-' + size + (serverCanvas ? '-server' : '');\n\n if (checkboardCache[key]) {\n return checkboardCache[key];\n }\n\n var checkboard = render(c1, c2, size, serverCanvas);\n checkboardCache[key] = checkboard;\n return checkboard;\n};","var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nimport React, { isValidElement } from 'react';\nimport reactCSS from 'reactcss';\nimport * as checkboard from '../../helpers/checkboard';\n\nexport var Checkboard = function Checkboard(_ref) {\n var white = _ref.white,\n grey = _ref.grey,\n size = _ref.size,\n renderers = _ref.renderers,\n borderRadius = _ref.borderRadius,\n boxShadow = _ref.boxShadow,\n children = _ref.children;\n\n var styles = reactCSS({\n 'default': {\n grid: {\n borderRadius: borderRadius,\n boxShadow: boxShadow,\n absolute: '0px 0px 0px 0px',\n background: 'url(' + checkboard.get(white, grey, size, renderers.canvas) + ') center left'\n }\n }\n });\n return isValidElement(children) ? React.cloneElement(children, _extends({}, children.props, { style: _extends({}, children.props.style, styles.grid) })) : React.createElement('div', { style: styles.grid });\n};\n\nCheckboard.defaultProps = {\n size: 8,\n white: 'transparent',\n grey: 'rgba(0,0,0,.08)',\n renderers: {}\n};\n\nexport default Checkboard;","var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nimport React, { Component, PureComponent } from 'react';\nimport reactCSS from 'reactcss';\nimport * as alpha from '../../helpers/alpha';\n\nimport Checkboard from './Checkboard';\n\nexport var Alpha = function (_ref) {\n _inherits(Alpha, _ref);\n\n function Alpha() {\n var _ref2;\n\n var _temp, _this, _ret;\n\n _classCallCheck(this, Alpha);\n\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref2 = Alpha.__proto__ || Object.getPrototypeOf(Alpha)).call.apply(_ref2, [this].concat(args))), _this), _this.handleChange = function (e) {\n var change = alpha.calculateChange(e, _this.props.hsl, _this.props.direction, _this.props.a, _this.container);\n change && typeof _this.props.onChange === 'function' && _this.props.onChange(change, e);\n }, _this.handleMouseDown = function (e) {\n _this.handleChange(e);\n window.addEventListener('mousemove', _this.handleChange);\n window.addEventListener('mouseup', _this.handleMouseUp);\n }, _this.handleMouseUp = function () {\n _this.unbindEventListeners();\n }, _this.unbindEventListeners = function () {\n window.removeEventListener('mousemove', _this.handleChange);\n window.removeEventListener('mouseup', _this.handleMouseUp);\n }, _temp), _possibleConstructorReturn(_this, _ret);\n }\n\n _createClass(Alpha, [{\n key: 'componentWillUnmount',\n value: function componentWillUnmount() {\n this.unbindEventListeners();\n }\n }, {\n key: 'render',\n value: function render() {\n var _this2 = this;\n\n var rgb = this.props.rgb;\n var styles = reactCSS({\n 'default': {\n alpha: {\n absolute: '0px 0px 0px 0px',\n borderRadius: this.props.radius\n },\n checkboard: {\n absolute: '0px 0px 0px 0px',\n overflow: 'hidden',\n borderRadius: this.props.radius\n },\n gradient: {\n absolute: '0px 0px 0px 0px',\n background: 'linear-gradient(to right, rgba(' + rgb.r + ',' + rgb.g + ',' + rgb.b + ', 0) 0%,\\n rgba(' + rgb.r + ',' + rgb.g + ',' + rgb.b + ', 1) 100%)',\n boxShadow: this.props.shadow,\n borderRadius: this.props.radius\n },\n container: {\n position: 'relative',\n height: '100%',\n margin: '0 3px'\n },\n pointer: {\n position: 'absolute',\n left: rgb.a * 100 + '%'\n },\n slider: {\n width: '4px',\n borderRadius: '1px',\n height: '8px',\n boxShadow: '0 0 2px rgba(0, 0, 0, .6)',\n background: '#fff',\n marginTop: '1px',\n transform: 'translateX(-2px)'\n }\n },\n 'vertical': {\n gradient: {\n background: 'linear-gradient(to bottom, rgba(' + rgb.r + ',' + rgb.g + ',' + rgb.b + ', 0) 0%,\\n rgba(' + rgb.r + ',' + rgb.g + ',' + rgb.b + ', 1) 100%)'\n },\n pointer: {\n left: 0,\n top: rgb.a * 100 + '%'\n }\n },\n 'overwrite': _extends({}, this.props.style)\n }, {\n vertical: this.props.direction === 'vertical',\n overwrite: true\n });\n\n return React.createElement(\n 'div',\n { style: styles.alpha },\n React.createElement(\n 'div',\n { style: styles.checkboard },\n React.createElement(Checkboard, { renderers: this.props.renderers })\n ),\n React.createElement('div', { style: styles.gradient }),\n React.createElement(\n 'div',\n {\n style: styles.container,\n ref: function ref(container) {\n return _this2.container = container;\n },\n onMouseDown: this.handleMouseDown,\n onTouchMove: this.handleChange,\n onTouchStart: this.handleChange\n },\n React.createElement(\n 'div',\n { style: styles.pointer },\n this.props.pointer ? React.createElement(this.props.pointer, this.props) : React.createElement('div', { style: styles.slider })\n )\n )\n );\n }\n }]);\n\n return Alpha;\n}(PureComponent || Component);\n\nexport default Alpha;","export var calculateChange = function calculateChange(e, hsl, direction, initialA, container) {\n var containerWidth = container.clientWidth;\n var containerHeight = container.clientHeight;\n var x = typeof e.pageX === 'number' ? e.pageX : e.touches[0].pageX;\n var y = typeof e.pageY === 'number' ? e.pageY : e.touches[0].pageY;\n var left = x - (container.getBoundingClientRect().left + window.pageXOffset);\n var top = y - (container.getBoundingClientRect().top + window.pageYOffset);\n\n if (direction === 'vertical') {\n var a = void 0;\n if (top < 0) {\n a = 0;\n } else if (top > containerHeight) {\n a = 1;\n } else {\n a = Math.round(top * 100 / containerHeight) / 100;\n }\n\n if (hsl.a !== a) {\n return {\n h: hsl.h,\n s: hsl.s,\n l: hsl.l,\n a: a,\n source: 'rgb'\n };\n }\n } else {\n var _a = void 0;\n if (left < 0) {\n _a = 0;\n } else if (left > containerWidth) {\n _a = 1;\n } else {\n _a = Math.round(left * 100 / containerWidth) / 100;\n }\n\n if (initialA !== _a) {\n return {\n h: hsl.h,\n s: hsl.s,\n l: hsl.l,\n a: _a,\n source: 'rgb'\n };\n }\n }\n return null;\n};","var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nimport React, { Component, PureComponent } from 'react';\nimport reactCSS from 'reactcss';\n\nvar DEFAULT_ARROW_OFFSET = 1;\n\nvar UP_KEY_CODE = 38;\nvar DOWN_KEY_CODE = 40;\nvar VALID_KEY_CODES = [UP_KEY_CODE, DOWN_KEY_CODE];\nvar isValidKeyCode = function isValidKeyCode(keyCode) {\n return VALID_KEY_CODES.indexOf(keyCode) > -1;\n};\nvar getNumberValue = function getNumberValue(value) {\n return Number(String(value).replace(/%/g, ''));\n};\n\nvar idCounter = 1;\n\nexport var EditableInput = function (_ref) {\n _inherits(EditableInput, _ref);\n\n function EditableInput(props) {\n _classCallCheck(this, EditableInput);\n\n var _this = _possibleConstructorReturn(this, (EditableInput.__proto__ || Object.getPrototypeOf(EditableInput)).call(this));\n\n _this.handleBlur = function () {\n if (_this.state.blurValue) {\n _this.setState({ value: _this.state.blurValue, blurValue: null });\n }\n };\n\n _this.handleChange = function (e) {\n _this.setUpdatedValue(e.target.value, e);\n };\n\n _this.handleKeyDown = function (e) {\n // In case `e.target.value` is a percentage remove the `%` character\n // and update accordingly with a percentage\n // https://github.com/casesandberg/react-color/issues/383\n var value = getNumberValue(e.target.value);\n if (!isNaN(value) && isValidKeyCode(e.keyCode)) {\n var offset = _this.getArrowOffset();\n var updatedValue = e.keyCode === UP_KEY_CODE ? value + offset : value - offset;\n\n _this.setUpdatedValue(updatedValue, e);\n }\n };\n\n _this.handleDrag = function (e) {\n if (_this.props.dragLabel) {\n var newValue = Math.round(_this.props.value + e.movementX);\n if (newValue >= 0 && newValue <= _this.props.dragMax) {\n _this.props.onChange && _this.props.onChange(_this.getValueObjectWithLabel(newValue), e);\n }\n }\n };\n\n _this.handleMouseDown = function (e) {\n if (_this.props.dragLabel) {\n e.preventDefault();\n _this.handleDrag(e);\n window.addEventListener('mousemove', _this.handleDrag);\n window.addEventListener('mouseup', _this.handleMouseUp);\n }\n };\n\n _this.handleMouseUp = function () {\n _this.unbindEventListeners();\n };\n\n _this.unbindEventListeners = function () {\n window.removeEventListener('mousemove', _this.handleDrag);\n window.removeEventListener('mouseup', _this.handleMouseUp);\n };\n\n _this.state = {\n value: String(props.value).toUpperCase(),\n blurValue: String(props.value).toUpperCase()\n };\n\n _this.inputId = 'rc-editable-input-' + idCounter++;\n return _this;\n }\n\n _createClass(EditableInput, [{\n key: 'componentDidUpdate',\n value: function componentDidUpdate(prevProps, prevState) {\n if (this.props.value !== this.state.value && (prevProps.value !== this.props.value || prevState.value !== this.state.value)) {\n if (this.input === document.activeElement) {\n this.setState({ blurValue: String(this.props.value).toUpperCase() });\n } else {\n this.setState({ value: String(this.props.value).toUpperCase(), blurValue: !this.state.blurValue && String(this.props.value).toUpperCase() });\n }\n }\n }\n }, {\n key: 'componentWillUnmount',\n value: function componentWillUnmount() {\n this.unbindEventListeners();\n }\n }, {\n key: 'getValueObjectWithLabel',\n value: function getValueObjectWithLabel(value) {\n return _defineProperty({}, this.props.label, value);\n }\n }, {\n key: 'getArrowOffset',\n value: function getArrowOffset() {\n return this.props.arrowOffset || DEFAULT_ARROW_OFFSET;\n }\n }, {\n key: 'setUpdatedValue',\n value: function setUpdatedValue(value, e) {\n var onChangeValue = this.props.label ? this.getValueObjectWithLabel(value) : value;\n this.props.onChange && this.props.onChange(onChangeValue, e);\n\n this.setState({ value: value });\n }\n }, {\n key: 'render',\n value: function render() {\n var _this2 = this;\n\n var styles = reactCSS({\n 'default': {\n wrap: {\n position: 'relative'\n }\n },\n 'user-override': {\n wrap: this.props.style && this.props.style.wrap ? this.props.style.wrap : {},\n input: this.props.style && this.props.style.input ? this.props.style.input : {},\n label: this.props.style && this.props.style.label ? this.props.style.label : {}\n },\n 'dragLabel-true': {\n label: {\n cursor: 'ew-resize'\n }\n }\n }, {\n 'user-override': true\n }, this.props);\n\n return React.createElement(\n 'div',\n { style: styles.wrap },\n React.createElement('input', {\n id: this.inputId,\n style: styles.input,\n ref: function ref(input) {\n return _this2.input = input;\n },\n value: this.state.value,\n onKeyDown: this.handleKeyDown,\n onChange: this.handleChange,\n onBlur: this.handleBlur,\n placeholder: this.props.placeholder,\n spellCheck: 'false'\n }),\n this.props.label && !this.props.hideLabel ? React.createElement(\n 'label',\n {\n htmlFor: this.inputId,\n style: styles.label,\n onMouseDown: this.handleMouseDown\n },\n this.props.label\n ) : null\n );\n }\n }]);\n\n return EditableInput;\n}(PureComponent || Component);\n\nexport default EditableInput;","export var calculateChange = function calculateChange(e, direction, hsl, container) {\n var containerWidth = container.clientWidth;\n var containerHeight = container.clientHeight;\n var x = typeof e.pageX === 'number' ? e.pageX : e.touches[0].pageX;\n var y = typeof e.pageY === 'number' ? e.pageY : e.touches[0].pageY;\n var left = x - (container.getBoundingClientRect().left + window.pageXOffset);\n var top = y - (container.getBoundingClientRect().top + window.pageYOffset);\n\n if (direction === 'vertical') {\n var h = void 0;\n if (top < 0) {\n h = 359;\n } else if (top > containerHeight) {\n h = 0;\n } else {\n var percent = -(top * 100 / containerHeight) + 100;\n h = 360 * percent / 100;\n }\n\n if (hsl.h !== h) {\n return {\n h: h,\n s: hsl.s,\n l: hsl.l,\n a: hsl.a,\n source: 'hsl'\n };\n }\n } else {\n var _h = void 0;\n if (left < 0) {\n _h = 0;\n } else if (left > containerWidth) {\n _h = 359;\n } else {\n var _percent = left * 100 / containerWidth;\n _h = 360 * _percent / 100;\n }\n\n if (hsl.h !== _h) {\n return {\n h: _h,\n s: hsl.s,\n l: hsl.l,\n a: hsl.a,\n source: 'hsl'\n };\n }\n }\n return null;\n};","var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nimport React, { Component, PureComponent } from 'react';\nimport reactCSS from 'reactcss';\nimport * as hue from '../../helpers/hue';\n\nexport var Hue = function (_ref) {\n _inherits(Hue, _ref);\n\n function Hue() {\n var _ref2;\n\n var _temp, _this, _ret;\n\n _classCallCheck(this, Hue);\n\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref2 = Hue.__proto__ || Object.getPrototypeOf(Hue)).call.apply(_ref2, [this].concat(args))), _this), _this.handleChange = function (e) {\n var change = hue.calculateChange(e, _this.props.direction, _this.props.hsl, _this.container);\n change && typeof _this.props.onChange === 'function' && _this.props.onChange(change, e);\n }, _this.handleMouseDown = function (e) {\n _this.handleChange(e);\n window.addEventListener('mousemove', _this.handleChange);\n window.addEventListener('mouseup', _this.handleMouseUp);\n }, _this.handleMouseUp = function () {\n _this.unbindEventListeners();\n }, _temp), _possibleConstructorReturn(_this, _ret);\n }\n\n _createClass(Hue, [{\n key: 'componentWillUnmount',\n value: function componentWillUnmount() {\n this.unbindEventListeners();\n }\n }, {\n key: 'unbindEventListeners',\n value: function unbindEventListeners() {\n window.removeEventListener('mousemove', this.handleChange);\n window.removeEventListener('mouseup', this.handleMouseUp);\n }\n }, {\n key: 'render',\n value: function render() {\n var _this2 = this;\n\n var _props$direction = this.props.direction,\n direction = _props$direction === undefined ? 'horizontal' : _props$direction;\n\n\n var styles = reactCSS({\n 'default': {\n hue: {\n absolute: '0px 0px 0px 0px',\n borderRadius: this.props.radius,\n boxShadow: this.props.shadow\n },\n container: {\n padding: '0 2px',\n position: 'relative',\n height: '100%',\n borderRadius: this.props.radius\n },\n pointer: {\n position: 'absolute',\n left: this.props.hsl.h * 100 / 360 + '%'\n },\n slider: {\n marginTop: '1px',\n width: '4px',\n borderRadius: '1px',\n height: '8px',\n boxShadow: '0 0 2px rgba(0, 0, 0, .6)',\n background: '#fff',\n transform: 'translateX(-2px)'\n }\n },\n 'vertical': {\n pointer: {\n left: '0px',\n top: -(this.props.hsl.h * 100 / 360) + 100 + '%'\n }\n }\n }, { vertical: direction === 'vertical' });\n\n return React.createElement(\n 'div',\n { style: styles.hue },\n React.createElement(\n 'div',\n {\n className: 'hue-' + direction,\n style: styles.container,\n ref: function ref(container) {\n return _this2.container = container;\n },\n onMouseDown: this.handleMouseDown,\n onTouchMove: this.handleChange,\n onTouchStart: this.handleChange\n },\n React.createElement(\n 'style',\n null,\n '\\n .hue-horizontal {\\n background: linear-gradient(to right, #f00 0%, #ff0 17%, #0f0\\n 33%, #0ff 50%, #00f 67%, #f0f 83%, #f00 100%);\\n background: -webkit-linear-gradient(to right, #f00 0%, #ff0\\n 17%, #0f0 33%, #0ff 50%, #00f 67%, #f0f 83%, #f00 100%);\\n }\\n\\n .hue-vertical {\\n background: linear-gradient(to top, #f00 0%, #ff0 17%, #0f0 33%,\\n #0ff 50%, #00f 67%, #f0f 83%, #f00 100%);\\n background: -webkit-linear-gradient(to top, #f00 0%, #ff0 17%,\\n #0f0 33%, #0ff 50%, #00f 67%, #f0f 83%, #f00 100%);\\n }\\n '\n ),\n React.createElement(\n 'div',\n { style: styles.pointer },\n this.props.pointer ? React.createElement(this.props.pointer, this.props) : React.createElement('div', { style: styles.slider })\n )\n )\n );\n }\n }]);\n\n return Hue;\n}(PureComponent || Component);\n\nexport default Hue;","/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n}\n\nexport default listCacheClear;\n","/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\nexport default eq;\n","import eq from './eq.js';\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\nexport default assocIndexOf;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n}\n\nexport default listCacheDelete;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\nexport default listCacheGet;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\nexport default listCacheHas;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\nexport default listCacheSet;\n","import listCacheClear from './_listCacheClear.js';\nimport listCacheDelete from './_listCacheDelete.js';\nimport listCacheGet from './_listCacheGet.js';\nimport listCacheHas from './_listCacheHas.js';\nimport listCacheSet from './_listCacheSet.js';\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nexport default ListCache;\n","import ListCache from './_ListCache.js';\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n this.__data__ = new ListCache;\n this.size = 0;\n}\n\nexport default stackClear;\n","/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n var data = this.__data__,\n result = data['delete'](key);\n\n this.size = data.size;\n return result;\n}\n\nexport default stackDelete;\n","/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n return this.__data__.get(key);\n}\n\nexport default stackGet;\n","/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n return this.__data__.has(key);\n}\n\nexport default stackHas;\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nexport default freeGlobal;\n","import freeGlobal from './_freeGlobal.js';\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nexport default root;\n","import root from './_root.js';\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nexport default Symbol;\n","import Symbol from './_Symbol.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nexport default getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nexport default objectToString;\n","import Symbol from './_Symbol.js';\nimport getRawTag from './_getRawTag.js';\nimport objectToString from './_objectToString.js';\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nexport default baseGetTag;\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nexport default isObject;\n","import baseGetTag from './_baseGetTag.js';\nimport isObject from './isObject.js';\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nexport default isFunction;\n","import root from './_root.js';\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nexport default coreJsData;\n","import coreJsData from './_coreJsData.js';\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\nexport default isMasked;\n","/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\nexport default toSource;\n","import isFunction from './isFunction.js';\nimport isMasked from './_isMasked.js';\nimport isObject from './isObject.js';\nimport toSource from './_toSource.js';\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\nexport default baseIsNative;\n","/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\nexport default getValue;\n","import baseIsNative from './_baseIsNative.js';\nimport getValue from './_getValue.js';\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\nexport default getNative;\n","import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nexport default Map;\n","import getNative from './_getNative.js';\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\nexport default nativeCreate;\n","import nativeCreate from './_nativeCreate.js';\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n}\n\nexport default hashClear;\n","/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n}\n\nexport default hashDelete;\n","import nativeCreate from './_nativeCreate.js';\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nexport default hashGet;\n","import nativeCreate from './_nativeCreate.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\nexport default hashHas;\n","import nativeCreate from './_nativeCreate.js';\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\nexport default hashSet;\n","import hashClear from './_hashClear.js';\nimport hashDelete from './_hashDelete.js';\nimport hashGet from './_hashGet.js';\nimport hashHas from './_hashHas.js';\nimport hashSet from './_hashSet.js';\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nexport default Hash;\n","import Hash from './_Hash.js';\nimport ListCache from './_ListCache.js';\nimport Map from './_Map.js';\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\nexport default mapCacheClear;\n","/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\nexport default isKeyable;\n","import isKeyable from './_isKeyable.js';\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\nexport default getMapData;\n","import getMapData from './_getMapData.js';\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n}\n\nexport default mapCacheDelete;\n","import getMapData from './_getMapData.js';\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\nexport default mapCacheGet;\n","import getMapData from './_getMapData.js';\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\nexport default mapCacheHas;\n","import getMapData from './_getMapData.js';\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n}\n\nexport default mapCacheSet;\n","import mapCacheClear from './_mapCacheClear.js';\nimport mapCacheDelete from './_mapCacheDelete.js';\nimport mapCacheGet from './_mapCacheGet.js';\nimport mapCacheHas from './_mapCacheHas.js';\nimport mapCacheSet from './_mapCacheSet.js';\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nexport default MapCache;\n","import ListCache from './_ListCache.js';\nimport Map from './_Map.js';\nimport MapCache from './_MapCache.js';\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n var data = this.__data__;\n if (data instanceof ListCache) {\n var pairs = data.__data__;\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n pairs.push([key, value]);\n this.size = ++data.size;\n return this;\n }\n data = this.__data__ = new MapCache(pairs);\n }\n data.set(key, value);\n this.size = data.size;\n return this;\n}\n\nexport default stackSet;\n","import ListCache from './_ListCache.js';\nimport stackClear from './_stackClear.js';\nimport stackDelete from './_stackDelete.js';\nimport stackGet from './_stackGet.js';\nimport stackHas from './_stackHas.js';\nimport stackSet from './_stackSet.js';\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n var data = this.__data__ = new ListCache(entries);\n this.size = data.size;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\nexport default Stack;\n","import getNative from './_getNative.js';\n\nvar defineProperty = (function() {\n try {\n var func = getNative(Object, 'defineProperty');\n func({}, '', {});\n return func;\n } catch (e) {}\n}());\n\nexport default defineProperty;\n","import defineProperty from './_defineProperty.js';\n\n/**\n * The base implementation of `assignValue` and `assignMergeValue` without\n * value checks.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction baseAssignValue(object, key, value) {\n if (key == '__proto__' && defineProperty) {\n defineProperty(object, key, {\n 'configurable': true,\n 'enumerable': true,\n 'value': value,\n 'writable': true\n });\n } else {\n object[key] = value;\n }\n}\n\nexport default baseAssignValue;\n","import baseAssignValue from './_baseAssignValue.js';\nimport eq from './eq.js';\n\n/**\n * This function is like `assignValue` except that it doesn't assign\n * `undefined` values.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignMergeValue(object, key, value) {\n if ((value !== undefined && !eq(object[key], value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n}\n\nexport default assignMergeValue;\n","import createBaseFor from './_createBaseFor.js';\n\n/**\n * The base implementation of `baseForOwn` which iterates over `object`\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\nvar baseFor = createBaseFor();\n\nexport default baseFor;\n","/**\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseFor(fromRight) {\n return function(object, iteratee, keysFunc) {\n var index = -1,\n iterable = Object(object),\n props = keysFunc(object),\n length = props.length;\n\n while (length--) {\n var key = props[fromRight ? length : ++index];\n if (iteratee(iterable[key], key, iterable) === false) {\n break;\n }\n }\n return object;\n };\n}\n\nexport default createBaseFor;\n","import root from './_root.js';\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined,\n allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined;\n\n/**\n * Creates a clone of `buffer`.\n *\n * @private\n * @param {Buffer} buffer The buffer to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Buffer} Returns the cloned buffer.\n */\nfunction cloneBuffer(buffer, isDeep) {\n if (isDeep) {\n return buffer.slice();\n }\n var length = buffer.length,\n result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n\n buffer.copy(result);\n return result;\n}\n\nexport default cloneBuffer;\n","import root from './_root.js';\n\n/** Built-in value references. */\nvar Uint8Array = root.Uint8Array;\n\nexport default Uint8Array;\n","import Uint8Array from './_Uint8Array.js';\n\n/**\n * Creates a clone of `arrayBuffer`.\n *\n * @private\n * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n * @returns {ArrayBuffer} Returns the cloned array buffer.\n */\nfunction cloneArrayBuffer(arrayBuffer) {\n var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n return result;\n}\n\nexport default cloneArrayBuffer;\n","import cloneArrayBuffer from './_cloneArrayBuffer.js';\n\n/**\n * Creates a clone of `typedArray`.\n *\n * @private\n * @param {Object} typedArray The typed array to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned typed array.\n */\nfunction cloneTypedArray(typedArray, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n}\n\nexport default cloneTypedArray;\n","/**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */\nfunction copyArray(source, array) {\n var index = -1,\n length = source.length;\n\n array || (array = Array(length));\n while (++index < length) {\n array[index] = source[index];\n }\n return array;\n}\n\nexport default copyArray;\n","import isObject from './isObject.js';\n\n/** Built-in value references. */\nvar objectCreate = Object.create;\n\n/**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} proto The object to inherit from.\n * @returns {Object} Returns the new object.\n */\nvar baseCreate = (function() {\n function object() {}\n return function(proto) {\n if (!isObject(proto)) {\n return {};\n }\n if (objectCreate) {\n return objectCreate(proto);\n }\n object.prototype = proto;\n var result = new object;\n object.prototype = undefined;\n return result;\n };\n}());\n\nexport default baseCreate;\n","/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n}\n\nexport default overArg;\n","import overArg from './_overArg.js';\n\n/** Built-in value references. */\nvar getPrototype = overArg(Object.getPrototypeOf, Object);\n\nexport default getPrototype;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\nexport default isPrototype;\n","import baseCreate from './_baseCreate.js';\nimport getPrototype from './_getPrototype.js';\nimport isPrototype from './_isPrototype.js';\n\n/**\n * Initializes an object clone.\n *\n * @private\n * @param {Object} object The object to clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneObject(object) {\n return (typeof object.constructor == 'function' && !isPrototype(object))\n ? baseCreate(getPrototype(object))\n : {};\n}\n\nexport default initCloneObject;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nexport default isObjectLike;\n","import baseGetTag from './_baseGetTag.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nexport default baseIsArguments;\n","import baseIsArguments from './_baseIsArguments.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n !propertyIsEnumerable.call(value, 'callee');\n};\n\nexport default isArguments;\n","/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nexport default isArray;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nexport default isLength;\n","import isFunction from './isFunction.js';\nimport isLength from './isLength.js';\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\nexport default isArrayLike;\n","import isArrayLike from './isArrayLike.js';\nimport isObjectLike from './isObjectLike.js';\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n * else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n}\n\nexport default isArrayLikeObject;\n","/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nexport default stubFalse;\n","import root from './_root.js';\nimport stubFalse from './stubFalse.js';\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\nexport default isBuffer;\n","import baseGetTag from './_baseGetTag.js';\nimport getPrototype from './_getPrototype.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to infer the `Object` constructor. */\nvar objectCtorString = funcToString.call(Object);\n\n/**\n * Checks if `value` is a plain object, that is, an object created by the\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\n *\n * @static\n * @memberOf _\n * @since 0.8.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\nfunction isPlainObject(value) {\n if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n return false;\n }\n var proto = getPrototype(value);\n if (proto === null) {\n return true;\n }\n var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n funcToString.call(Ctor) == objectCtorString;\n}\n\nexport default isPlainObject;\n","import baseGetTag from './_baseGetTag.js';\nimport isLength from './isLength.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n return isObjectLike(value) &&\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\nexport default baseIsTypedArray;\n","/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function(value) {\n return func(value);\n };\n}\n\nexport default baseUnary;\n","import freeGlobal from './_freeGlobal.js';\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n try {\n // Use `util.types` for Node.js 10+.\n var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n if (types) {\n return types;\n }\n\n // Legacy `process.binding('util')` for Node.js < 10.\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n}());\n\nexport default nodeUtil;\n","import baseIsTypedArray from './_baseIsTypedArray.js';\nimport baseUnary from './_baseUnary.js';\nimport nodeUtil from './_nodeUtil.js';\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\nexport default isTypedArray;\n","/**\n * Gets the value at `key`, unless `key` is \"__proto__\" or \"constructor\".\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction safeGet(object, key) {\n if (key === 'constructor' && typeof object[key] === 'function') {\n return;\n }\n\n if (key == '__proto__') {\n return;\n }\n\n return object[key];\n}\n\nexport default safeGet;\n","import baseAssignValue from './_baseAssignValue.js';\nimport eq from './eq.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n var objValue = object[key];\n if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n}\n\nexport default assignValue;\n","import assignValue from './_assignValue.js';\nimport baseAssignValue from './_baseAssignValue.js';\n\n/**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property identifiers to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @param {Function} [customizer] The function to customize copied values.\n * @returns {Object} Returns `object`.\n */\nfunction copyObject(source, props, object, customizer) {\n var isNew = !object;\n object || (object = {});\n\n var index = -1,\n length = props.length;\n\n while (++index < length) {\n var key = props[index];\n\n var newValue = customizer\n ? customizer(object[key], source[key], key, object, source)\n : undefined;\n\n if (newValue === undefined) {\n newValue = source[key];\n }\n if (isNew) {\n baseAssignValue(object, key, newValue);\n } else {\n assignValue(object, key, newValue);\n }\n }\n return object;\n}\n\nexport default copyObject;\n","/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\nexport default baseTimes;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n var type = typeof value;\n length = length == null ? MAX_SAFE_INTEGER : length;\n\n return !!length &&\n (type == 'number' ||\n (type != 'symbol' && reIsUint.test(value))) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\nexport default isIndex;\n","import baseTimes from './_baseTimes.js';\nimport isArguments from './isArguments.js';\nimport isArray from './isArray.js';\nimport isBuffer from './isBuffer.js';\nimport isIndex from './_isIndex.js';\nimport isTypedArray from './isTypedArray.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n var isArr = isArray(value),\n isArg = !isArr && isArguments(value),\n isBuff = !isArr && !isArg && isBuffer(value),\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n skipIndexes = isArr || isArg || isBuff || isType,\n result = skipIndexes ? baseTimes(value.length, String) : [],\n length = result.length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (\n // Safari 9 has enumerable `arguments.length` in strict mode.\n key == 'length' ||\n // Node.js 0.10 has enumerable non-index properties on buffers.\n (isBuff && (key == 'offset' || key == 'parent')) ||\n // PhantomJS 2 has enumerable non-index properties on typed arrays.\n (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n // Skip index properties.\n isIndex(key, length)\n ))) {\n result.push(key);\n }\n }\n return result;\n}\n\nexport default arrayLikeKeys;\n","/**\n * This function is like\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * except that it includes inherited enumerable properties.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction nativeKeysIn(object) {\n var result = [];\n if (object != null) {\n for (var key in Object(object)) {\n result.push(key);\n }\n }\n return result;\n}\n\nexport default nativeKeysIn;\n","import isObject from './isObject.js';\nimport isPrototype from './_isPrototype.js';\nimport nativeKeysIn from './_nativeKeysIn.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeysIn(object) {\n if (!isObject(object)) {\n return nativeKeysIn(object);\n }\n var isProto = isPrototype(object),\n result = [];\n\n for (var key in object) {\n if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n result.push(key);\n }\n }\n return result;\n}\n\nexport default baseKeysIn;\n","import arrayLikeKeys from './_arrayLikeKeys.js';\nimport baseKeysIn from './_baseKeysIn.js';\nimport isArrayLike from './isArrayLike.js';\n\n/**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\nfunction keysIn(object) {\n return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n}\n\nexport default keysIn;\n","import copyObject from './_copyObject.js';\nimport keysIn from './keysIn.js';\n\n/**\n * Converts `value` to a plain object flattening inherited enumerable string\n * keyed properties of `value` to own properties of the plain object.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {Object} Returns the converted plain object.\n * @example\n *\n * function Foo() {\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.assign({ 'a': 1 }, new Foo);\n * // => { 'a': 1, 'b': 2 }\n *\n * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\n * // => { 'a': 1, 'b': 2, 'c': 3 }\n */\nfunction toPlainObject(value) {\n return copyObject(value, keysIn(value));\n}\n\nexport default toPlainObject;\n","import assignMergeValue from './_assignMergeValue.js';\nimport cloneBuffer from './_cloneBuffer.js';\nimport cloneTypedArray from './_cloneTypedArray.js';\nimport copyArray from './_copyArray.js';\nimport initCloneObject from './_initCloneObject.js';\nimport isArguments from './isArguments.js';\nimport isArray from './isArray.js';\nimport isArrayLikeObject from './isArrayLikeObject.js';\nimport isBuffer from './isBuffer.js';\nimport isFunction from './isFunction.js';\nimport isObject from './isObject.js';\nimport isPlainObject from './isPlainObject.js';\nimport isTypedArray from './isTypedArray.js';\nimport safeGet from './_safeGet.js';\nimport toPlainObject from './toPlainObject.js';\n\n/**\n * A specialized version of `baseMerge` for arrays and objects which performs\n * deep merges and tracks traversed objects enabling objects with circular\n * references to be merged.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {string} key The key of the value to merge.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} mergeFunc The function to merge values.\n * @param {Function} [customizer] The function to customize assigned values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n */\nfunction baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {\n var objValue = safeGet(object, key),\n srcValue = safeGet(source, key),\n stacked = stack.get(srcValue);\n\n if (stacked) {\n assignMergeValue(object, key, stacked);\n return;\n }\n var newValue = customizer\n ? customizer(objValue, srcValue, (key + ''), object, source, stack)\n : undefined;\n\n var isCommon = newValue === undefined;\n\n if (isCommon) {\n var isArr = isArray(srcValue),\n isBuff = !isArr && isBuffer(srcValue),\n isTyped = !isArr && !isBuff && isTypedArray(srcValue);\n\n newValue = srcValue;\n if (isArr || isBuff || isTyped) {\n if (isArray(objValue)) {\n newValue = objValue;\n }\n else if (isArrayLikeObject(objValue)) {\n newValue = copyArray(objValue);\n }\n else if (isBuff) {\n isCommon = false;\n newValue = cloneBuffer(srcValue, true);\n }\n else if (isTyped) {\n isCommon = false;\n newValue = cloneTypedArray(srcValue, true);\n }\n else {\n newValue = [];\n }\n }\n else if (isPlainObject(srcValue) || isArguments(srcValue)) {\n newValue = objValue;\n if (isArguments(objValue)) {\n newValue = toPlainObject(objValue);\n }\n else if (!isObject(objValue) || isFunction(objValue)) {\n newValue = initCloneObject(srcValue);\n }\n }\n else {\n isCommon = false;\n }\n }\n if (isCommon) {\n // Recursively merge objects and arrays (susceptible to call stack limits).\n stack.set(srcValue, newValue);\n mergeFunc(newValue, srcValue, srcIndex, customizer, stack);\n stack['delete'](srcValue);\n }\n assignMergeValue(object, key, newValue);\n}\n\nexport default baseMergeDeep;\n","import Stack from './_Stack.js';\nimport assignMergeValue from './_assignMergeValue.js';\nimport baseFor from './_baseFor.js';\nimport baseMergeDeep from './_baseMergeDeep.js';\nimport isObject from './isObject.js';\nimport keysIn from './keysIn.js';\nimport safeGet from './_safeGet.js';\n\n/**\n * The base implementation of `_.merge` without support for multiple sources.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} [customizer] The function to customize merged values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n */\nfunction baseMerge(object, source, srcIndex, customizer, stack) {\n if (object === source) {\n return;\n }\n baseFor(source, function(srcValue, key) {\n stack || (stack = new Stack);\n if (isObject(srcValue)) {\n baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);\n }\n else {\n var newValue = customizer\n ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack)\n : undefined;\n\n if (newValue === undefined) {\n newValue = srcValue;\n }\n assignMergeValue(object, key, newValue);\n }\n }, keysIn);\n}\n\nexport default baseMerge;\n","/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n return value;\n}\n\nexport default identity;\n","/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n switch (args.length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n}\n\nexport default apply;\n","import apply from './_apply.js';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * A specialized version of `baseRest` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */\nfunction overRest(func, start, transform) {\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n index = -1;\n var otherArgs = Array(start + 1);\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = transform(array);\n return apply(func, this, otherArgs);\n };\n}\n\nexport default overRest;\n","/**\n * Creates a function that returns `value`.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new constant function.\n * @example\n *\n * var objects = _.times(2, _.constant({ 'a': 1 }));\n *\n * console.log(objects);\n * // => [{ 'a': 1 }, { 'a': 1 }]\n *\n * console.log(objects[0] === objects[1]);\n * // => true\n */\nfunction constant(value) {\n return function() {\n return value;\n };\n}\n\nexport default constant;\n","import constant from './constant.js';\nimport defineProperty from './_defineProperty.js';\nimport identity from './identity.js';\n\n/**\n * The base implementation of `setToString` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar baseSetToString = !defineProperty ? identity : function(func, string) {\n return defineProperty(func, 'toString', {\n 'configurable': true,\n 'enumerable': false,\n 'value': constant(string),\n 'writable': true\n });\n};\n\nexport default baseSetToString;\n","/** Used to detect hot functions by number of calls within a span of milliseconds. */\nvar HOT_COUNT = 800,\n HOT_SPAN = 16;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeNow = Date.now;\n\n/**\n * Creates a function that'll short out and invoke `identity` instead\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n * milliseconds.\n *\n * @private\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new shortable function.\n */\nfunction shortOut(func) {\n var count = 0,\n lastCalled = 0;\n\n return function() {\n var stamp = nativeNow(),\n remaining = HOT_SPAN - (stamp - lastCalled);\n\n lastCalled = stamp;\n if (remaining > 0) {\n if (++count >= HOT_COUNT) {\n return arguments[0];\n }\n } else {\n count = 0;\n }\n return func.apply(undefined, arguments);\n };\n}\n\nexport default shortOut;\n","import baseSetToString from './_baseSetToString.js';\nimport shortOut from './_shortOut.js';\n\n/**\n * Sets the `toString` method of `func` to return `string`.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar setToString = shortOut(baseSetToString);\n\nexport default setToString;\n","import identity from './identity.js';\nimport overRest from './_overRest.js';\nimport setToString from './_setToString.js';\n\n/**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\nfunction baseRest(func, start) {\n return setToString(overRest(func, start, identity), func + '');\n}\n\nexport default baseRest;\n","import eq from './eq.js';\nimport isArrayLike from './isArrayLike.js';\nimport isIndex from './_isIndex.js';\nimport isObject from './isObject.js';\n\n/**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n * else `false`.\n */\nfunction isIterateeCall(value, index, object) {\n if (!isObject(object)) {\n return false;\n }\n var type = typeof index;\n if (type == 'number'\n ? (isArrayLike(object) && isIndex(index, object.length))\n : (type == 'string' && index in object)\n ) {\n return eq(object[index], value);\n }\n return false;\n}\n\nexport default isIterateeCall;\n","import baseMerge from './_baseMerge.js';\nimport createAssigner from './_createAssigner.js';\n\n/**\n * This method is like `_.assign` except that it recursively merges own and\n * inherited enumerable string keyed properties of source objects into the\n * destination object. Source properties that resolve to `undefined` are\n * skipped if a destination value exists. Array and plain object properties\n * are merged recursively. Other objects and value types are overridden by\n * assignment. Source objects are applied from left to right. Subsequent\n * sources overwrite property assignments of previous sources.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 0.5.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = {\n * 'a': [{ 'b': 2 }, { 'd': 4 }]\n * };\n *\n * var other = {\n * 'a': [{ 'c': 3 }, { 'e': 5 }]\n * };\n *\n * _.merge(object, other);\n * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }\n */\nvar merge = createAssigner(function(object, source, srcIndex) {\n baseMerge(object, source, srcIndex);\n});\n\nexport default merge;\n","import baseRest from './_baseRest.js';\nimport isIterateeCall from './_isIterateeCall.js';\n\n/**\n * Creates a function like `_.assign`.\n *\n * @private\n * @param {Function} assigner The function to assign values.\n * @returns {Function} Returns the new assigner function.\n */\nfunction createAssigner(assigner) {\n return baseRest(function(object, sources) {\n var index = -1,\n length = sources.length,\n customizer = length > 1 ? sources[length - 1] : undefined,\n guard = length > 2 ? sources[2] : undefined;\n\n customizer = (assigner.length > 3 && typeof customizer == 'function')\n ? (length--, customizer)\n : undefined;\n\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n customizer = length < 3 ? undefined : customizer;\n length = 1;\n }\n object = Object(object);\n while (++index < length) {\n var source = sources[index];\n if (source) {\n assigner(object, source, index, customizer);\n }\n }\n return object;\n });\n}\n\nexport default createAssigner;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport reactCSS from 'reactcss';\nimport merge from 'lodash-es/merge';\n\nexport var Raised = function Raised(_ref) {\n var zDepth = _ref.zDepth,\n radius = _ref.radius,\n background = _ref.background,\n children = _ref.children,\n _ref$styles = _ref.styles,\n passedStyles = _ref$styles === undefined ? {} : _ref$styles;\n\n var styles = reactCSS(merge({\n 'default': {\n wrap: {\n position: 'relative',\n display: 'inline-block'\n },\n content: {\n position: 'relative'\n },\n bg: {\n absolute: '0px 0px 0px 0px',\n boxShadow: '0 ' + zDepth + 'px ' + zDepth * 4 + 'px rgba(0,0,0,.24)',\n borderRadius: radius,\n background: background\n }\n },\n 'zDepth-0': {\n bg: {\n boxShadow: 'none'\n }\n },\n\n 'zDepth-1': {\n bg: {\n boxShadow: '0 2px 10px rgba(0,0,0,.12), 0 2px 5px rgba(0,0,0,.16)'\n }\n },\n 'zDepth-2': {\n bg: {\n boxShadow: '0 6px 20px rgba(0,0,0,.19), 0 8px 17px rgba(0,0,0,.2)'\n }\n },\n 'zDepth-3': {\n bg: {\n boxShadow: '0 17px 50px rgba(0,0,0,.19), 0 12px 15px rgba(0,0,0,.24)'\n }\n },\n 'zDepth-4': {\n bg: {\n boxShadow: '0 25px 55px rgba(0,0,0,.21), 0 16px 28px rgba(0,0,0,.22)'\n }\n },\n 'zDepth-5': {\n bg: {\n boxShadow: '0 40px 77px rgba(0,0,0,.22), 0 27px 24px rgba(0,0,0,.2)'\n }\n },\n 'square': {\n bg: {\n borderRadius: '0'\n }\n },\n 'circle': {\n bg: {\n borderRadius: '50%'\n }\n }\n }, passedStyles), { 'zDepth-1': zDepth === 1 });\n\n return React.createElement(\n 'div',\n { style: styles.wrap },\n React.createElement('div', { style: styles.bg }),\n React.createElement(\n 'div',\n { style: styles.content },\n children\n )\n );\n};\n\nRaised.propTypes = {\n background: PropTypes.string,\n zDepth: PropTypes.oneOf([0, 1, 2, 3, 4, 5]),\n radius: PropTypes.number,\n styles: PropTypes.object\n};\n\nRaised.defaultProps = {\n background: '#fff',\n zDepth: 1,\n radius: 2,\n styles: {}\n};\n\nexport default Raised;","import root from './_root.js';\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\nexport default now;\n","/** Used to match a single whitespace character. */\nvar reWhitespace = /\\s/;\n\n/**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n * character of `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the index of the last non-whitespace character.\n */\nfunction trimmedEndIndex(string) {\n var index = string.length;\n\n while (index-- && reWhitespace.test(string.charAt(index))) {}\n return index;\n}\n\nexport default trimmedEndIndex;\n","import trimmedEndIndex from './_trimmedEndIndex.js';\n\n/** Used to match leading whitespace. */\nvar reTrimStart = /^\\s+/;\n\n/**\n * The base implementation of `_.trim`.\n *\n * @private\n * @param {string} string The string to trim.\n * @returns {string} Returns the trimmed string.\n */\nfunction baseTrim(string) {\n return string\n ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n : string;\n}\n\nexport default baseTrim;\n","import baseGetTag from './_baseGetTag.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nexport default isSymbol;\n","import baseTrim from './_baseTrim.js';\nimport isObject from './isObject.js';\nimport isSymbol from './isSymbol.js';\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = baseTrim(value);\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nexport default toNumber;\n","import isObject from './isObject.js';\nimport now from './now.js';\nimport toNumber from './toNumber.js';\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n timeWaiting = wait - timeSinceLastCall;\n\n return maxing\n ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n : timeWaiting;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n clearTimeout(timerId);\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\nexport default debounce;\n","import debounce from './debounce.js';\nimport isObject from './isObject.js';\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a throttled function that only invokes `func` at most once per\n * every `wait` milliseconds. The throttled function comes with a `cancel`\n * method to cancel delayed `func` invocations and a `flush` method to\n * immediately invoke them. Provide `options` to indicate whether `func`\n * should be invoked on the leading and/or trailing edge of the `wait`\n * timeout. The `func` is invoked with the last arguments provided to the\n * throttled function. Subsequent calls to the throttled function return the\n * result of the last `func` invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the throttled function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.throttle` and `_.debounce`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to throttle.\n * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=true]\n * Specify invoking on the leading edge of the timeout.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new throttled function.\n * @example\n *\n * // Avoid excessively updating the position while scrolling.\n * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n *\n * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\n * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n * jQuery(element).on('click', throttled);\n *\n * // Cancel the trailing throttled invocation.\n * jQuery(window).on('popstate', throttled.cancel);\n */\nfunction throttle(func, wait, options) {\n var leading = true,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n if (isObject(options)) {\n leading = 'leading' in options ? !!options.leading : leading;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n return debounce(func, wait, {\n 'leading': leading,\n 'maxWait': wait,\n 'trailing': trailing\n });\n}\n\nexport default throttle;\n","export var calculateChange = function calculateChange(e, hsl, container) {\n var _container$getBoundin = container.getBoundingClientRect(),\n containerWidth = _container$getBoundin.width,\n containerHeight = _container$getBoundin.height;\n\n var x = typeof e.pageX === 'number' ? e.pageX : e.touches[0].pageX;\n var y = typeof e.pageY === 'number' ? e.pageY : e.touches[0].pageY;\n var left = x - (container.getBoundingClientRect().left + window.pageXOffset);\n var top = y - (container.getBoundingClientRect().top + window.pageYOffset);\n\n if (left < 0) {\n left = 0;\n } else if (left > containerWidth) {\n left = containerWidth;\n }\n\n if (top < 0) {\n top = 0;\n } else if (top > containerHeight) {\n top = containerHeight;\n }\n\n var saturation = left / containerWidth;\n var bright = 1 - top / containerHeight;\n\n return {\n h: hsl.h,\n s: saturation,\n v: bright,\n a: hsl.a,\n source: 'hsv'\n };\n};","var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nimport React, { Component, PureComponent } from 'react';\nimport reactCSS from 'reactcss';\nimport throttle from 'lodash-es/throttle';\nimport * as saturation from '../../helpers/saturation';\n\nexport var Saturation = function (_ref) {\n _inherits(Saturation, _ref);\n\n function Saturation(props) {\n _classCallCheck(this, Saturation);\n\n var _this = _possibleConstructorReturn(this, (Saturation.__proto__ || Object.getPrototypeOf(Saturation)).call(this, props));\n\n _this.handleChange = function (e) {\n typeof _this.props.onChange === 'function' && _this.throttle(_this.props.onChange, saturation.calculateChange(e, _this.props.hsl, _this.container), e);\n };\n\n _this.handleMouseDown = function (e) {\n _this.handleChange(e);\n var renderWindow = _this.getContainerRenderWindow();\n renderWindow.addEventListener('mousemove', _this.handleChange);\n renderWindow.addEventListener('mouseup', _this.handleMouseUp);\n };\n\n _this.handleMouseUp = function () {\n _this.unbindEventListeners();\n };\n\n _this.throttle = throttle(function (fn, data, e) {\n fn(data, e);\n }, 50);\n return _this;\n }\n\n _createClass(Saturation, [{\n key: 'componentWillUnmount',\n value: function componentWillUnmount() {\n this.throttle.cancel();\n this.unbindEventListeners();\n }\n }, {\n key: 'getContainerRenderWindow',\n value: function getContainerRenderWindow() {\n var container = this.container;\n\n var renderWindow = window;\n while (!renderWindow.document.contains(container) && renderWindow.parent !== renderWindow) {\n renderWindow = renderWindow.parent;\n }\n return renderWindow;\n }\n }, {\n key: 'unbindEventListeners',\n value: function unbindEventListeners() {\n var renderWindow = this.getContainerRenderWindow();\n renderWindow.removeEventListener('mousemove', this.handleChange);\n renderWindow.removeEventListener('mouseup', this.handleMouseUp);\n }\n }, {\n key: 'render',\n value: function render() {\n var _this2 = this;\n\n var _ref2 = this.props.style || {},\n color = _ref2.color,\n white = _ref2.white,\n black = _ref2.black,\n pointer = _ref2.pointer,\n circle = _ref2.circle;\n\n var styles = reactCSS({\n 'default': {\n color: {\n absolute: '0px 0px 0px 0px',\n background: 'hsl(' + this.props.hsl.h + ',100%, 50%)',\n borderRadius: this.props.radius\n },\n white: {\n absolute: '0px 0px 0px 0px',\n borderRadius: this.props.radius\n },\n black: {\n absolute: '0px 0px 0px 0px',\n boxShadow: this.props.shadow,\n borderRadius: this.props.radius\n },\n pointer: {\n position: 'absolute',\n top: -(this.props.hsv.v * 100) + 100 + '%',\n left: this.props.hsv.s * 100 + '%',\n cursor: 'default'\n },\n circle: {\n width: '4px',\n height: '4px',\n boxShadow: '0 0 0 1.5px #fff, inset 0 0 1px 1px rgba(0,0,0,.3),\\n 0 0 1px 2px rgba(0,0,0,.4)',\n borderRadius: '50%',\n cursor: 'hand',\n transform: 'translate(-2px, -2px)'\n }\n },\n 'custom': {\n color: color,\n white: white,\n black: black,\n pointer: pointer,\n circle: circle\n }\n }, { 'custom': !!this.props.style });\n\n return React.createElement(\n 'div',\n {\n style: styles.color,\n ref: function ref(container) {\n return _this2.container = container;\n },\n onMouseDown: this.handleMouseDown,\n onTouchMove: this.handleChange,\n onTouchStart: this.handleChange\n },\n React.createElement(\n 'style',\n null,\n '\\n .saturation-white {\\n background: -webkit-linear-gradient(to right, #fff, rgba(255,255,255,0));\\n background: linear-gradient(to right, #fff, rgba(255,255,255,0));\\n }\\n .saturation-black {\\n background: -webkit-linear-gradient(to top, #000, rgba(0,0,0,0));\\n background: linear-gradient(to top, #000, rgba(0,0,0,0));\\n }\\n '\n ),\n React.createElement(\n 'div',\n { style: styles.white, className: 'saturation-white' },\n React.createElement('div', { style: styles.black, className: 'saturation-black' }),\n React.createElement(\n 'div',\n { style: styles.pointer },\n this.props.pointer ? React.createElement(this.props.pointer, this.props) : React.createElement('div', { style: styles.circle })\n )\n )\n );\n }\n }]);\n\n return Saturation;\n}(PureComponent || Component);\n\nexport default Saturation;","/**\n * A specialized version of `_.forEach` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\nfunction arrayEach(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (iteratee(array[index], index, array) === false) {\n break;\n }\n }\n return array;\n}\n\nexport default arrayEach;\n","import overArg from './_overArg.js';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = overArg(Object.keys, Object);\n\nexport default nativeKeys;\n","import isPrototype from './_isPrototype.js';\nimport nativeKeys from './_nativeKeys.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n if (!isPrototype(object)) {\n return nativeKeys(object);\n }\n var result = [];\n for (var key in Object(object)) {\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\n result.push(key);\n }\n }\n return result;\n}\n\nexport default baseKeys;\n","import arrayLikeKeys from './_arrayLikeKeys.js';\nimport baseKeys from './_baseKeys.js';\nimport isArrayLike from './isArrayLike.js';\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\nexport default keys;\n","import baseForOwn from './_baseForOwn.js';\nimport createBaseEach from './_createBaseEach.js';\n\n/**\n * The base implementation of `_.forEach` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n */\nvar baseEach = createBaseEach(baseForOwn);\n\nexport default baseEach;\n","import isArrayLike from './isArrayLike.js';\n\n/**\n * Creates a `baseEach` or `baseEachRight` function.\n *\n * @private\n * @param {Function} eachFunc The function to iterate over a collection.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseEach(eachFunc, fromRight) {\n return function(collection, iteratee) {\n if (collection == null) {\n return collection;\n }\n if (!isArrayLike(collection)) {\n return eachFunc(collection, iteratee);\n }\n var length = collection.length,\n index = fromRight ? length : -1,\n iterable = Object(collection);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (iteratee(iterable[index], index, iterable) === false) {\n break;\n }\n }\n return collection;\n };\n}\n\nexport default createBaseEach;\n","import baseFor from './_baseFor.js';\nimport keys from './keys.js';\n\n/**\n * The base implementation of `_.forOwn` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\nfunction baseForOwn(object, iteratee) {\n return object && baseFor(object, iteratee, keys);\n}\n\nexport default baseForOwn;\n","import identity from './identity.js';\n\n/**\n * Casts `value` to `identity` if it's not a function.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {Function} Returns cast function.\n */\nfunction castFunction(value) {\n return typeof value == 'function' ? value : identity;\n}\n\nexport default castFunction;\n","import arrayEach from './_arrayEach.js';\nimport baseEach from './_baseEach.js';\nimport castFunction from './_castFunction.js';\nimport isArray from './isArray.js';\n\n/**\n * Iterates over elements of `collection` and invokes `iteratee` for each element.\n * The iteratee is invoked with three arguments: (value, index|key, collection).\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * **Note:** As with other \"Collections\" methods, objects with a \"length\"\n * property are iterated like arrays. To avoid this behavior use `_.forIn`\n * or `_.forOwn` for object iteration.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @alias each\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n * @see _.forEachRight\n * @example\n *\n * _.forEach([1, 2], function(value) {\n * console.log(value);\n * });\n * // => Logs `1` then `2`.\n *\n * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n */\nfunction forEach(collection, iteratee) {\n var func = isArray(collection) ? arrayEach : baseEach;\n return func(collection, castFunction(iteratee));\n}\n\nexport default forEach;\n","// This file is autogenerated. It's used to publish ESM to npm.\nfunction _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) {\n return typeof obj;\n } : function (obj) {\n return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n }, _typeof(obj);\n}\n\n// https://github.com/bgrins/TinyColor\n// Brian Grinstead, MIT License\n\nvar trimLeft = /^\\s+/;\nvar trimRight = /\\s+$/;\nfunction tinycolor(color, opts) {\n color = color ? color : \"\";\n opts = opts || {};\n\n // If input is already a tinycolor, return itself\n if (color instanceof tinycolor) {\n return color;\n }\n // If we are called as a function, call using new instead\n if (!(this instanceof tinycolor)) {\n return new tinycolor(color, opts);\n }\n var rgb = inputToRGB(color);\n this._originalInput = color, this._r = rgb.r, this._g = rgb.g, this._b = rgb.b, this._a = rgb.a, this._roundA = Math.round(100 * this._a) / 100, this._format = opts.format || rgb.format;\n this._gradientType = opts.gradientType;\n\n // Don't let the range of [0,255] come back in [0,1].\n // Potentially lose a little bit of precision here, but will fix issues where\n // .5 gets interpreted as half of the total, instead of half of 1\n // If it was supposed to be 128, this was already taken care of by `inputToRgb`\n if (this._r < 1) this._r = Math.round(this._r);\n if (this._g < 1) this._g = Math.round(this._g);\n if (this._b < 1) this._b = Math.round(this._b);\n this._ok = rgb.ok;\n}\ntinycolor.prototype = {\n isDark: function isDark() {\n return this.getBrightness() < 128;\n },\n isLight: function isLight() {\n return !this.isDark();\n },\n isValid: function isValid() {\n return this._ok;\n },\n getOriginalInput: function getOriginalInput() {\n return this._originalInput;\n },\n getFormat: function getFormat() {\n return this._format;\n },\n getAlpha: function getAlpha() {\n return this._a;\n },\n getBrightness: function getBrightness() {\n //http://www.w3.org/TR/AERT#color-contrast\n var rgb = this.toRgb();\n return (rgb.r * 299 + rgb.g * 587 + rgb.b * 114) / 1000;\n },\n getLuminance: function getLuminance() {\n //http://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef\n var rgb = this.toRgb();\n var RsRGB, GsRGB, BsRGB, R, G, B;\n RsRGB = rgb.r / 255;\n GsRGB = rgb.g / 255;\n BsRGB = rgb.b / 255;\n if (RsRGB <= 0.03928) R = RsRGB / 12.92;else R = Math.pow((RsRGB + 0.055) / 1.055, 2.4);\n if (GsRGB <= 0.03928) G = GsRGB / 12.92;else G = Math.pow((GsRGB + 0.055) / 1.055, 2.4);\n if (BsRGB <= 0.03928) B = BsRGB / 12.92;else B = Math.pow((BsRGB + 0.055) / 1.055, 2.4);\n return 0.2126 * R + 0.7152 * G + 0.0722 * B;\n },\n setAlpha: function setAlpha(value) {\n this._a = boundAlpha(value);\n this._roundA = Math.round(100 * this._a) / 100;\n return this;\n },\n toHsv: function toHsv() {\n var hsv = rgbToHsv(this._r, this._g, this._b);\n return {\n h: hsv.h * 360,\n s: hsv.s,\n v: hsv.v,\n a: this._a\n };\n },\n toHsvString: function toHsvString() {\n var hsv = rgbToHsv(this._r, this._g, this._b);\n var h = Math.round(hsv.h * 360),\n s = Math.round(hsv.s * 100),\n v = Math.round(hsv.v * 100);\n return this._a == 1 ? \"hsv(\" + h + \", \" + s + \"%, \" + v + \"%)\" : \"hsva(\" + h + \", \" + s + \"%, \" + v + \"%, \" + this._roundA + \")\";\n },\n toHsl: function toHsl() {\n var hsl = rgbToHsl(this._r, this._g, this._b);\n return {\n h: hsl.h * 360,\n s: hsl.s,\n l: hsl.l,\n a: this._a\n };\n },\n toHslString: function toHslString() {\n var hsl = rgbToHsl(this._r, this._g, this._b);\n var h = Math.round(hsl.h * 360),\n s = Math.round(hsl.s * 100),\n l = Math.round(hsl.l * 100);\n return this._a == 1 ? \"hsl(\" + h + \", \" + s + \"%, \" + l + \"%)\" : \"hsla(\" + h + \", \" + s + \"%, \" + l + \"%, \" + this._roundA + \")\";\n },\n toHex: function toHex(allow3Char) {\n return rgbToHex(this._r, this._g, this._b, allow3Char);\n },\n toHexString: function toHexString(allow3Char) {\n return \"#\" + this.toHex(allow3Char);\n },\n toHex8: function toHex8(allow4Char) {\n return rgbaToHex(this._r, this._g, this._b, this._a, allow4Char);\n },\n toHex8String: function toHex8String(allow4Char) {\n return \"#\" + this.toHex8(allow4Char);\n },\n toRgb: function toRgb() {\n return {\n r: Math.round(this._r),\n g: Math.round(this._g),\n b: Math.round(this._b),\n a: this._a\n };\n },\n toRgbString: function toRgbString() {\n return this._a == 1 ? \"rgb(\" + Math.round(this._r) + \", \" + Math.round(this._g) + \", \" + Math.round(this._b) + \")\" : \"rgba(\" + Math.round(this._r) + \", \" + Math.round(this._g) + \", \" + Math.round(this._b) + \", \" + this._roundA + \")\";\n },\n toPercentageRgb: function toPercentageRgb() {\n return {\n r: Math.round(bound01(this._r, 255) * 100) + \"%\",\n g: Math.round(bound01(this._g, 255) * 100) + \"%\",\n b: Math.round(bound01(this._b, 255) * 100) + \"%\",\n a: this._a\n };\n },\n toPercentageRgbString: function toPercentageRgbString() {\n return this._a == 1 ? \"rgb(\" + Math.round(bound01(this._r, 255) * 100) + \"%, \" + Math.round(bound01(this._g, 255) * 100) + \"%, \" + Math.round(bound01(this._b, 255) * 100) + \"%)\" : \"rgba(\" + Math.round(bound01(this._r, 255) * 100) + \"%, \" + Math.round(bound01(this._g, 255) * 100) + \"%, \" + Math.round(bound01(this._b, 255) * 100) + \"%, \" + this._roundA + \")\";\n },\n toName: function toName() {\n if (this._a === 0) {\n return \"transparent\";\n }\n if (this._a < 1) {\n return false;\n }\n return hexNames[rgbToHex(this._r, this._g, this._b, true)] || false;\n },\n toFilter: function toFilter(secondColor) {\n var hex8String = \"#\" + rgbaToArgbHex(this._r, this._g, this._b, this._a);\n var secondHex8String = hex8String;\n var gradientType = this._gradientType ? \"GradientType = 1, \" : \"\";\n if (secondColor) {\n var s = tinycolor(secondColor);\n secondHex8String = \"#\" + rgbaToArgbHex(s._r, s._g, s._b, s._a);\n }\n return \"progid:DXImageTransform.Microsoft.gradient(\" + gradientType + \"startColorstr=\" + hex8String + \",endColorstr=\" + secondHex8String + \")\";\n },\n toString: function toString(format) {\n var formatSet = !!format;\n format = format || this._format;\n var formattedString = false;\n var hasAlpha = this._a < 1 && this._a >= 0;\n var needsAlphaFormat = !formatSet && hasAlpha && (format === \"hex\" || format === \"hex6\" || format === \"hex3\" || format === \"hex4\" || format === \"hex8\" || format === \"name\");\n if (needsAlphaFormat) {\n // Special case for \"transparent\", all other non-alpha formats\n // will return rgba when there is transparency.\n if (format === \"name\" && this._a === 0) {\n return this.toName();\n }\n return this.toRgbString();\n }\n if (format === \"rgb\") {\n formattedString = this.toRgbString();\n }\n if (format === \"prgb\") {\n formattedString = this.toPercentageRgbString();\n }\n if (format === \"hex\" || format === \"hex6\") {\n formattedString = this.toHexString();\n }\n if (format === \"hex3\") {\n formattedString = this.toHexString(true);\n }\n if (format === \"hex4\") {\n formattedString = this.toHex8String(true);\n }\n if (format === \"hex8\") {\n formattedString = this.toHex8String();\n }\n if (format === \"name\") {\n formattedString = this.toName();\n }\n if (format === \"hsl\") {\n formattedString = this.toHslString();\n }\n if (format === \"hsv\") {\n formattedString = this.toHsvString();\n }\n return formattedString || this.toHexString();\n },\n clone: function clone() {\n return tinycolor(this.toString());\n },\n _applyModification: function _applyModification(fn, args) {\n var color = fn.apply(null, [this].concat([].slice.call(args)));\n this._r = color._r;\n this._g = color._g;\n this._b = color._b;\n this.setAlpha(color._a);\n return this;\n },\n lighten: function lighten() {\n return this._applyModification(_lighten, arguments);\n },\n brighten: function brighten() {\n return this._applyModification(_brighten, arguments);\n },\n darken: function darken() {\n return this._applyModification(_darken, arguments);\n },\n desaturate: function desaturate() {\n return this._applyModification(_desaturate, arguments);\n },\n saturate: function saturate() {\n return this._applyModification(_saturate, arguments);\n },\n greyscale: function greyscale() {\n return this._applyModification(_greyscale, arguments);\n },\n spin: function spin() {\n return this._applyModification(_spin, arguments);\n },\n _applyCombination: function _applyCombination(fn, args) {\n return fn.apply(null, [this].concat([].slice.call(args)));\n },\n analogous: function analogous() {\n return this._applyCombination(_analogous, arguments);\n },\n complement: function complement() {\n return this._applyCombination(_complement, arguments);\n },\n monochromatic: function monochromatic() {\n return this._applyCombination(_monochromatic, arguments);\n },\n splitcomplement: function splitcomplement() {\n return this._applyCombination(_splitcomplement, arguments);\n },\n // Disabled until https://github.com/bgrins/TinyColor/issues/254\n // polyad: function (number) {\n // return this._applyCombination(polyad, [number]);\n // },\n triad: function triad() {\n return this._applyCombination(polyad, [3]);\n },\n tetrad: function tetrad() {\n return this._applyCombination(polyad, [4]);\n }\n};\n\n// If input is an object, force 1 into \"1.0\" to handle ratios properly\n// String input requires \"1.0\" as input, so 1 will be treated as 1\ntinycolor.fromRatio = function (color, opts) {\n if (_typeof(color) == \"object\") {\n var newColor = {};\n for (var i in color) {\n if (color.hasOwnProperty(i)) {\n if (i === \"a\") {\n newColor[i] = color[i];\n } else {\n newColor[i] = convertToPercentage(color[i]);\n }\n }\n }\n color = newColor;\n }\n return tinycolor(color, opts);\n};\n\n// Given a string or object, convert that input to RGB\n// Possible string inputs:\n//\n// \"red\"\n// \"#f00\" or \"f00\"\n// \"#ff0000\" or \"ff0000\"\n// \"#ff000000\" or \"ff000000\"\n// \"rgb 255 0 0\" or \"rgb (255, 0, 0)\"\n// \"rgb 1.0 0 0\" or \"rgb (1, 0, 0)\"\n// \"rgba (255, 0, 0, 1)\" or \"rgba 255, 0, 0, 1\"\n// \"rgba (1.0, 0, 0, 1)\" or \"rgba 1.0, 0, 0, 1\"\n// \"hsl(0, 100%, 50%)\" or \"hsl 0 100% 50%\"\n// \"hsla(0, 100%, 50%, 1)\" or \"hsla 0 100% 50%, 1\"\n// \"hsv(0, 100%, 100%)\" or \"hsv 0 100% 100%\"\n//\nfunction inputToRGB(color) {\n var rgb = {\n r: 0,\n g: 0,\n b: 0\n };\n var a = 1;\n var s = null;\n var v = null;\n var l = null;\n var ok = false;\n var format = false;\n if (typeof color == \"string\") {\n color = stringInputToObject(color);\n }\n if (_typeof(color) == \"object\") {\n if (isValidCSSUnit(color.r) && isValidCSSUnit(color.g) && isValidCSSUnit(color.b)) {\n rgb = rgbToRgb(color.r, color.g, color.b);\n ok = true;\n format = String(color.r).substr(-1) === \"%\" ? \"prgb\" : \"rgb\";\n } else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.v)) {\n s = convertToPercentage(color.s);\n v = convertToPercentage(color.v);\n rgb = hsvToRgb(color.h, s, v);\n ok = true;\n format = \"hsv\";\n } else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.l)) {\n s = convertToPercentage(color.s);\n l = convertToPercentage(color.l);\n rgb = hslToRgb(color.h, s, l);\n ok = true;\n format = \"hsl\";\n }\n if (color.hasOwnProperty(\"a\")) {\n a = color.a;\n }\n }\n a = boundAlpha(a);\n return {\n ok: ok,\n format: color.format || format,\n r: Math.min(255, Math.max(rgb.r, 0)),\n g: Math.min(255, Math.max(rgb.g, 0)),\n b: Math.min(255, Math.max(rgb.b, 0)),\n a: a\n };\n}\n\n// Conversion Functions\n// --------------------\n\n// `rgbToHsl`, `rgbToHsv`, `hslToRgb`, `hsvToRgb` modified from:\n// \n\n// `rgbToRgb`\n// Handle bounds / percentage checking to conform to CSS color spec\n// \n// *Assumes:* r, g, b in [0, 255] or [0, 1]\n// *Returns:* { r, g, b } in [0, 255]\nfunction rgbToRgb(r, g, b) {\n return {\n r: bound01(r, 255) * 255,\n g: bound01(g, 255) * 255,\n b: bound01(b, 255) * 255\n };\n}\n\n// `rgbToHsl`\n// Converts an RGB color value to HSL.\n// *Assumes:* r, g, and b are contained in [0, 255] or [0, 1]\n// *Returns:* { h, s, l } in [0,1]\nfunction rgbToHsl(r, g, b) {\n r = bound01(r, 255);\n g = bound01(g, 255);\n b = bound01(b, 255);\n var max = Math.max(r, g, b),\n min = Math.min(r, g, b);\n var h,\n s,\n l = (max + min) / 2;\n if (max == min) {\n h = s = 0; // achromatic\n } else {\n var d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n }\n h /= 6;\n }\n return {\n h: h,\n s: s,\n l: l\n };\n}\n\n// `hslToRgb`\n// Converts an HSL color value to RGB.\n// *Assumes:* h is contained in [0, 1] or [0, 360] and s and l are contained [0, 1] or [0, 100]\n// *Returns:* { r, g, b } in the set [0, 255]\nfunction hslToRgb(h, s, l) {\n var r, g, b;\n h = bound01(h, 360);\n s = bound01(s, 100);\n l = bound01(l, 100);\n function hue2rgb(p, q, t) {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n }\n if (s === 0) {\n r = g = b = l; // achromatic\n } else {\n var q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n var p = 2 * l - q;\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n return {\n r: r * 255,\n g: g * 255,\n b: b * 255\n };\n}\n\n// `rgbToHsv`\n// Converts an RGB color value to HSV\n// *Assumes:* r, g, and b are contained in the set [0, 255] or [0, 1]\n// *Returns:* { h, s, v } in [0,1]\nfunction rgbToHsv(r, g, b) {\n r = bound01(r, 255);\n g = bound01(g, 255);\n b = bound01(b, 255);\n var max = Math.max(r, g, b),\n min = Math.min(r, g, b);\n var h,\n s,\n v = max;\n var d = max - min;\n s = max === 0 ? 0 : d / max;\n if (max == min) {\n h = 0; // achromatic\n } else {\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n }\n h /= 6;\n }\n return {\n h: h,\n s: s,\n v: v\n };\n}\n\n// `hsvToRgb`\n// Converts an HSV color value to RGB.\n// *Assumes:* h is contained in [0, 1] or [0, 360] and s and v are contained in [0, 1] or [0, 100]\n// *Returns:* { r, g, b } in the set [0, 255]\nfunction hsvToRgb(h, s, v) {\n h = bound01(h, 360) * 6;\n s = bound01(s, 100);\n v = bound01(v, 100);\n var i = Math.floor(h),\n f = h - i,\n p = v * (1 - s),\n q = v * (1 - f * s),\n t = v * (1 - (1 - f) * s),\n mod = i % 6,\n r = [v, q, p, p, t, v][mod],\n g = [t, v, v, q, p, p][mod],\n b = [p, p, t, v, v, q][mod];\n return {\n r: r * 255,\n g: g * 255,\n b: b * 255\n };\n}\n\n// `rgbToHex`\n// Converts an RGB color to hex\n// Assumes r, g, and b are contained in the set [0, 255]\n// Returns a 3 or 6 character hex\nfunction rgbToHex(r, g, b, allow3Char) {\n var hex = [pad2(Math.round(r).toString(16)), pad2(Math.round(g).toString(16)), pad2(Math.round(b).toString(16))];\n\n // Return a 3 character hex if possible\n if (allow3Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1)) {\n return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0);\n }\n return hex.join(\"\");\n}\n\n// `rgbaToHex`\n// Converts an RGBA color plus alpha transparency to hex\n// Assumes r, g, b are contained in the set [0, 255] and\n// a in [0, 1]. Returns a 4 or 8 character rgba hex\nfunction rgbaToHex(r, g, b, a, allow4Char) {\n var hex = [pad2(Math.round(r).toString(16)), pad2(Math.round(g).toString(16)), pad2(Math.round(b).toString(16)), pad2(convertDecimalToHex(a))];\n\n // Return a 4 character hex if possible\n if (allow4Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1) && hex[3].charAt(0) == hex[3].charAt(1)) {\n return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0) + hex[3].charAt(0);\n }\n return hex.join(\"\");\n}\n\n// `rgbaToArgbHex`\n// Converts an RGBA color to an ARGB Hex8 string\n// Rarely used, but required for \"toFilter()\"\nfunction rgbaToArgbHex(r, g, b, a) {\n var hex = [pad2(convertDecimalToHex(a)), pad2(Math.round(r).toString(16)), pad2(Math.round(g).toString(16)), pad2(Math.round(b).toString(16))];\n return hex.join(\"\");\n}\n\n// `equals`\n// Can be called with any tinycolor input\ntinycolor.equals = function (color1, color2) {\n if (!color1 || !color2) return false;\n return tinycolor(color1).toRgbString() == tinycolor(color2).toRgbString();\n};\ntinycolor.random = function () {\n return tinycolor.fromRatio({\n r: Math.random(),\n g: Math.random(),\n b: Math.random()\n });\n};\n\n// Modification Functions\n// ----------------------\n// Thanks to less.js for some of the basics here\n// \n\nfunction _desaturate(color, amount) {\n amount = amount === 0 ? 0 : amount || 10;\n var hsl = tinycolor(color).toHsl();\n hsl.s -= amount / 100;\n hsl.s = clamp01(hsl.s);\n return tinycolor(hsl);\n}\nfunction _saturate(color, amount) {\n amount = amount === 0 ? 0 : amount || 10;\n var hsl = tinycolor(color).toHsl();\n hsl.s += amount / 100;\n hsl.s = clamp01(hsl.s);\n return tinycolor(hsl);\n}\nfunction _greyscale(color) {\n return tinycolor(color).desaturate(100);\n}\nfunction _lighten(color, amount) {\n amount = amount === 0 ? 0 : amount || 10;\n var hsl = tinycolor(color).toHsl();\n hsl.l += amount / 100;\n hsl.l = clamp01(hsl.l);\n return tinycolor(hsl);\n}\nfunction _brighten(color, amount) {\n amount = amount === 0 ? 0 : amount || 10;\n var rgb = tinycolor(color).toRgb();\n rgb.r = Math.max(0, Math.min(255, rgb.r - Math.round(255 * -(amount / 100))));\n rgb.g = Math.max(0, Math.min(255, rgb.g - Math.round(255 * -(amount / 100))));\n rgb.b = Math.max(0, Math.min(255, rgb.b - Math.round(255 * -(amount / 100))));\n return tinycolor(rgb);\n}\nfunction _darken(color, amount) {\n amount = amount === 0 ? 0 : amount || 10;\n var hsl = tinycolor(color).toHsl();\n hsl.l -= amount / 100;\n hsl.l = clamp01(hsl.l);\n return tinycolor(hsl);\n}\n\n// Spin takes a positive or negative amount within [-360, 360] indicating the change of hue.\n// Values outside of this range will be wrapped into this range.\nfunction _spin(color, amount) {\n var hsl = tinycolor(color).toHsl();\n var hue = (hsl.h + amount) % 360;\n hsl.h = hue < 0 ? 360 + hue : hue;\n return tinycolor(hsl);\n}\n\n// Combination Functions\n// ---------------------\n// Thanks to jQuery xColor for some of the ideas behind these\n// \n\nfunction _complement(color) {\n var hsl = tinycolor(color).toHsl();\n hsl.h = (hsl.h + 180) % 360;\n return tinycolor(hsl);\n}\nfunction polyad(color, number) {\n if (isNaN(number) || number <= 0) {\n throw new Error(\"Argument to polyad must be a positive number\");\n }\n var hsl = tinycolor(color).toHsl();\n var result = [tinycolor(color)];\n var step = 360 / number;\n for (var i = 1; i < number; i++) {\n result.push(tinycolor({\n h: (hsl.h + i * step) % 360,\n s: hsl.s,\n l: hsl.l\n }));\n }\n return result;\n}\nfunction _splitcomplement(color) {\n var hsl = tinycolor(color).toHsl();\n var h = hsl.h;\n return [tinycolor(color), tinycolor({\n h: (h + 72) % 360,\n s: hsl.s,\n l: hsl.l\n }), tinycolor({\n h: (h + 216) % 360,\n s: hsl.s,\n l: hsl.l\n })];\n}\nfunction _analogous(color, results, slices) {\n results = results || 6;\n slices = slices || 30;\n var hsl = tinycolor(color).toHsl();\n var part = 360 / slices;\n var ret = [tinycolor(color)];\n for (hsl.h = (hsl.h - (part * results >> 1) + 720) % 360; --results;) {\n hsl.h = (hsl.h + part) % 360;\n ret.push(tinycolor(hsl));\n }\n return ret;\n}\nfunction _monochromatic(color, results) {\n results = results || 6;\n var hsv = tinycolor(color).toHsv();\n var h = hsv.h,\n s = hsv.s,\n v = hsv.v;\n var ret = [];\n var modification = 1 / results;\n while (results--) {\n ret.push(tinycolor({\n h: h,\n s: s,\n v: v\n }));\n v = (v + modification) % 1;\n }\n return ret;\n}\n\n// Utility Functions\n// ---------------------\n\ntinycolor.mix = function (color1, color2, amount) {\n amount = amount === 0 ? 0 : amount || 50;\n var rgb1 = tinycolor(color1).toRgb();\n var rgb2 = tinycolor(color2).toRgb();\n var p = amount / 100;\n var rgba = {\n r: (rgb2.r - rgb1.r) * p + rgb1.r,\n g: (rgb2.g - rgb1.g) * p + rgb1.g,\n b: (rgb2.b - rgb1.b) * p + rgb1.b,\n a: (rgb2.a - rgb1.a) * p + rgb1.a\n };\n return tinycolor(rgba);\n};\n\n// Readability Functions\n// ---------------------\n// false\n// tinycolor.isReadable(\"#000\", \"#111\",{level:\"AA\",size:\"large\"}) => false\ntinycolor.isReadable = function (color1, color2, wcag2) {\n var readability = tinycolor.readability(color1, color2);\n var wcag2Parms, out;\n out = false;\n wcag2Parms = validateWCAG2Parms(wcag2);\n switch (wcag2Parms.level + wcag2Parms.size) {\n case \"AAsmall\":\n case \"AAAlarge\":\n out = readability >= 4.5;\n break;\n case \"AAlarge\":\n out = readability >= 3;\n break;\n case \"AAAsmall\":\n out = readability >= 7;\n break;\n }\n return out;\n};\n\n// `mostReadable`\n// Given a base color and a list of possible foreground or background\n// colors for that base, returns the most readable color.\n// Optionally returns Black or White if the most readable color is unreadable.\n// *Example*\n// tinycolor.mostReadable(tinycolor.mostReadable(\"#123\", [\"#124\", \"#125\"],{includeFallbackColors:false}).toHexString(); // \"#112255\"\n// tinycolor.mostReadable(tinycolor.mostReadable(\"#123\", [\"#124\", \"#125\"],{includeFallbackColors:true}).toHexString(); // \"#ffffff\"\n// tinycolor.mostReadable(\"#a8015a\", [\"#faf3f3\"],{includeFallbackColors:true,level:\"AAA\",size:\"large\"}).toHexString(); // \"#faf3f3\"\n// tinycolor.mostReadable(\"#a8015a\", [\"#faf3f3\"],{includeFallbackColors:true,level:\"AAA\",size:\"small\"}).toHexString(); // \"#ffffff\"\ntinycolor.mostReadable = function (baseColor, colorList, args) {\n var bestColor = null;\n var bestScore = 0;\n var readability;\n var includeFallbackColors, level, size;\n args = args || {};\n includeFallbackColors = args.includeFallbackColors;\n level = args.level;\n size = args.size;\n for (var i = 0; i < colorList.length; i++) {\n readability = tinycolor.readability(baseColor, colorList[i]);\n if (readability > bestScore) {\n bestScore = readability;\n bestColor = tinycolor(colorList[i]);\n }\n }\n if (tinycolor.isReadable(baseColor, bestColor, {\n level: level,\n size: size\n }) || !includeFallbackColors) {\n return bestColor;\n } else {\n args.includeFallbackColors = false;\n return tinycolor.mostReadable(baseColor, [\"#fff\", \"#000\"], args);\n }\n};\n\n// Big List of Colors\n// ------------------\n// \nvar names = tinycolor.names = {\n aliceblue: \"f0f8ff\",\n antiquewhite: \"faebd7\",\n aqua: \"0ff\",\n aquamarine: \"7fffd4\",\n azure: \"f0ffff\",\n beige: \"f5f5dc\",\n bisque: \"ffe4c4\",\n black: \"000\",\n blanchedalmond: \"ffebcd\",\n blue: \"00f\",\n blueviolet: \"8a2be2\",\n brown: \"a52a2a\",\n burlywood: \"deb887\",\n burntsienna: \"ea7e5d\",\n cadetblue: \"5f9ea0\",\n chartreuse: \"7fff00\",\n chocolate: \"d2691e\",\n coral: \"ff7f50\",\n cornflowerblue: \"6495ed\",\n cornsilk: \"fff8dc\",\n crimson: \"dc143c\",\n cyan: \"0ff\",\n darkblue: \"00008b\",\n darkcyan: \"008b8b\",\n darkgoldenrod: \"b8860b\",\n darkgray: \"a9a9a9\",\n darkgreen: \"006400\",\n darkgrey: \"a9a9a9\",\n darkkhaki: \"bdb76b\",\n darkmagenta: \"8b008b\",\n darkolivegreen: \"556b2f\",\n darkorange: \"ff8c00\",\n darkorchid: \"9932cc\",\n darkred: \"8b0000\",\n darksalmon: \"e9967a\",\n darkseagreen: \"8fbc8f\",\n darkslateblue: \"483d8b\",\n darkslategray: \"2f4f4f\",\n darkslategrey: \"2f4f4f\",\n darkturquoise: \"00ced1\",\n darkviolet: \"9400d3\",\n deeppink: \"ff1493\",\n deepskyblue: \"00bfff\",\n dimgray: \"696969\",\n dimgrey: \"696969\",\n dodgerblue: \"1e90ff\",\n firebrick: \"b22222\",\n floralwhite: \"fffaf0\",\n forestgreen: \"228b22\",\n fuchsia: \"f0f\",\n gainsboro: \"dcdcdc\",\n ghostwhite: \"f8f8ff\",\n gold: \"ffd700\",\n goldenrod: \"daa520\",\n gray: \"808080\",\n green: \"008000\",\n greenyellow: \"adff2f\",\n grey: \"808080\",\n honeydew: \"f0fff0\",\n hotpink: \"ff69b4\",\n indianred: \"cd5c5c\",\n indigo: \"4b0082\",\n ivory: \"fffff0\",\n khaki: \"f0e68c\",\n lavender: \"e6e6fa\",\n lavenderblush: \"fff0f5\",\n lawngreen: \"7cfc00\",\n lemonchiffon: \"fffacd\",\n lightblue: \"add8e6\",\n lightcoral: \"f08080\",\n lightcyan: \"e0ffff\",\n lightgoldenrodyellow: \"fafad2\",\n lightgray: \"d3d3d3\",\n lightgreen: \"90ee90\",\n lightgrey: \"d3d3d3\",\n lightpink: \"ffb6c1\",\n lightsalmon: \"ffa07a\",\n lightseagreen: \"20b2aa\",\n lightskyblue: \"87cefa\",\n lightslategray: \"789\",\n lightslategrey: \"789\",\n lightsteelblue: \"b0c4de\",\n lightyellow: \"ffffe0\",\n lime: \"0f0\",\n limegreen: \"32cd32\",\n linen: \"faf0e6\",\n magenta: \"f0f\",\n maroon: \"800000\",\n mediumaquamarine: \"66cdaa\",\n mediumblue: \"0000cd\",\n mediumorchid: \"ba55d3\",\n mediumpurple: \"9370db\",\n mediumseagreen: \"3cb371\",\n mediumslateblue: \"7b68ee\",\n mediumspringgreen: \"00fa9a\",\n mediumturquoise: \"48d1cc\",\n mediumvioletred: \"c71585\",\n midnightblue: \"191970\",\n mintcream: \"f5fffa\",\n mistyrose: \"ffe4e1\",\n moccasin: \"ffe4b5\",\n navajowhite: \"ffdead\",\n navy: \"000080\",\n oldlace: \"fdf5e6\",\n olive: \"808000\",\n olivedrab: \"6b8e23\",\n orange: \"ffa500\",\n orangered: \"ff4500\",\n orchid: \"da70d6\",\n palegoldenrod: \"eee8aa\",\n palegreen: \"98fb98\",\n paleturquoise: \"afeeee\",\n palevioletred: \"db7093\",\n papayawhip: \"ffefd5\",\n peachpuff: \"ffdab9\",\n peru: \"cd853f\",\n pink: \"ffc0cb\",\n plum: \"dda0dd\",\n powderblue: \"b0e0e6\",\n purple: \"800080\",\n rebeccapurple: \"663399\",\n red: \"f00\",\n rosybrown: \"bc8f8f\",\n royalblue: \"4169e1\",\n saddlebrown: \"8b4513\",\n salmon: \"fa8072\",\n sandybrown: \"f4a460\",\n seagreen: \"2e8b57\",\n seashell: \"fff5ee\",\n sienna: \"a0522d\",\n silver: \"c0c0c0\",\n skyblue: \"87ceeb\",\n slateblue: \"6a5acd\",\n slategray: \"708090\",\n slategrey: \"708090\",\n snow: \"fffafa\",\n springgreen: \"00ff7f\",\n steelblue: \"4682b4\",\n tan: \"d2b48c\",\n teal: \"008080\",\n thistle: \"d8bfd8\",\n tomato: \"ff6347\",\n turquoise: \"40e0d0\",\n violet: \"ee82ee\",\n wheat: \"f5deb3\",\n white: \"fff\",\n whitesmoke: \"f5f5f5\",\n yellow: \"ff0\",\n yellowgreen: \"9acd32\"\n};\n\n// Make it easy to access colors via `hexNames[hex]`\nvar hexNames = tinycolor.hexNames = flip(names);\n\n// Utilities\n// ---------\n\n// `{ 'name1': 'val1' }` becomes `{ 'val1': 'name1' }`\nfunction flip(o) {\n var flipped = {};\n for (var i in o) {\n if (o.hasOwnProperty(i)) {\n flipped[o[i]] = i;\n }\n }\n return flipped;\n}\n\n// Return a valid alpha value [0,1] with all invalid values being set to 1\nfunction boundAlpha(a) {\n a = parseFloat(a);\n if (isNaN(a) || a < 0 || a > 1) {\n a = 1;\n }\n return a;\n}\n\n// Take input from [0, n] and return it as [0, 1]\nfunction bound01(n, max) {\n if (isOnePointZero(n)) n = \"100%\";\n var processPercent = isPercentage(n);\n n = Math.min(max, Math.max(0, parseFloat(n)));\n\n // Automatically convert percentage into number\n if (processPercent) {\n n = parseInt(n * max, 10) / 100;\n }\n\n // Handle floating point rounding errors\n if (Math.abs(n - max) < 0.000001) {\n return 1;\n }\n\n // Convert into [0, 1] range if it isn't already\n return n % max / parseFloat(max);\n}\n\n// Force a number between 0 and 1\nfunction clamp01(val) {\n return Math.min(1, Math.max(0, val));\n}\n\n// Parse a base-16 hex value into a base-10 integer\nfunction parseIntFromHex(val) {\n return parseInt(val, 16);\n}\n\n// Need to handle 1.0 as 100%, since once it is a number, there is no difference between it and 1\n// \nfunction isOnePointZero(n) {\n return typeof n == \"string\" && n.indexOf(\".\") != -1 && parseFloat(n) === 1;\n}\n\n// Check to see if string passed in is a percentage\nfunction isPercentage(n) {\n return typeof n === \"string\" && n.indexOf(\"%\") != -1;\n}\n\n// Force a hex value to have 2 characters\nfunction pad2(c) {\n return c.length == 1 ? \"0\" + c : \"\" + c;\n}\n\n// Replace a decimal with it's percentage value\nfunction convertToPercentage(n) {\n if (n <= 1) {\n n = n * 100 + \"%\";\n }\n return n;\n}\n\n// Converts a decimal to a hex value\nfunction convertDecimalToHex(d) {\n return Math.round(parseFloat(d) * 255).toString(16);\n}\n// Converts a hex value to a decimal\nfunction convertHexToDecimal(h) {\n return parseIntFromHex(h) / 255;\n}\nvar matchers = function () {\n // \n var CSS_INTEGER = \"[-\\\\+]?\\\\d+%?\";\n\n // \n var CSS_NUMBER = \"[-\\\\+]?\\\\d*\\\\.\\\\d+%?\";\n\n // Allow positive/negative integer/number. Don't capture the either/or, just the entire outcome.\n var CSS_UNIT = \"(?:\" + CSS_NUMBER + \")|(?:\" + CSS_INTEGER + \")\";\n\n // Actual matching.\n // Parentheses and commas are optional, but not required.\n // Whitespace can take the place of commas or opening paren\n var PERMISSIVE_MATCH3 = \"[\\\\s|\\\\(]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")\\\\s*\\\\)?\";\n var PERMISSIVE_MATCH4 = \"[\\\\s|\\\\(]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")[,|\\\\s]+(\" + CSS_UNIT + \")\\\\s*\\\\)?\";\n return {\n CSS_UNIT: new RegExp(CSS_UNIT),\n rgb: new RegExp(\"rgb\" + PERMISSIVE_MATCH3),\n rgba: new RegExp(\"rgba\" + PERMISSIVE_MATCH4),\n hsl: new RegExp(\"hsl\" + PERMISSIVE_MATCH3),\n hsla: new RegExp(\"hsla\" + PERMISSIVE_MATCH4),\n hsv: new RegExp(\"hsv\" + PERMISSIVE_MATCH3),\n hsva: new RegExp(\"hsva\" + PERMISSIVE_MATCH4),\n hex3: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,\n hex6: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,\n hex4: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,\n hex8: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/\n };\n}();\n\n// `isValidCSSUnit`\n// Take in a single string / number and check to see if it looks like a CSS unit\n// (see `matchers` above for definition).\nfunction isValidCSSUnit(color) {\n return !!matchers.CSS_UNIT.exec(color);\n}\n\n// `stringInputToObject`\n// Permissive string parsing. Take in a number of formats, and output an object\n// based on detected format. Returns `{ r, g, b }` or `{ h, s, l }` or `{ h, s, v}`\nfunction stringInputToObject(color) {\n color = color.replace(trimLeft, \"\").replace(trimRight, \"\").toLowerCase();\n var named = false;\n if (names[color]) {\n color = names[color];\n named = true;\n } else if (color == \"transparent\") {\n return {\n r: 0,\n g: 0,\n b: 0,\n a: 0,\n format: \"name\"\n };\n }\n\n // Try to match string input using regular expressions.\n // Keep most of the number bounding out of this function - don't worry about [0,1] or [0,100] or [0,360]\n // Just return an object and let the conversion functions handle that.\n // This way the result will be the same whether the tinycolor is initialized with string or object.\n var match;\n if (match = matchers.rgb.exec(color)) {\n return {\n r: match[1],\n g: match[2],\n b: match[3]\n };\n }\n if (match = matchers.rgba.exec(color)) {\n return {\n r: match[1],\n g: match[2],\n b: match[3],\n a: match[4]\n };\n }\n if (match = matchers.hsl.exec(color)) {\n return {\n h: match[1],\n s: match[2],\n l: match[3]\n };\n }\n if (match = matchers.hsla.exec(color)) {\n return {\n h: match[1],\n s: match[2],\n l: match[3],\n a: match[4]\n };\n }\n if (match = matchers.hsv.exec(color)) {\n return {\n h: match[1],\n s: match[2],\n v: match[3]\n };\n }\n if (match = matchers.hsva.exec(color)) {\n return {\n h: match[1],\n s: match[2],\n v: match[3],\n a: match[4]\n };\n }\n if (match = matchers.hex8.exec(color)) {\n return {\n r: parseIntFromHex(match[1]),\n g: parseIntFromHex(match[2]),\n b: parseIntFromHex(match[3]),\n a: convertHexToDecimal(match[4]),\n format: named ? \"name\" : \"hex8\"\n };\n }\n if (match = matchers.hex6.exec(color)) {\n return {\n r: parseIntFromHex(match[1]),\n g: parseIntFromHex(match[2]),\n b: parseIntFromHex(match[3]),\n format: named ? \"name\" : \"hex\"\n };\n }\n if (match = matchers.hex4.exec(color)) {\n return {\n r: parseIntFromHex(match[1] + \"\" + match[1]),\n g: parseIntFromHex(match[2] + \"\" + match[2]),\n b: parseIntFromHex(match[3] + \"\" + match[3]),\n a: convertHexToDecimal(match[4] + \"\" + match[4]),\n format: named ? \"name\" : \"hex8\"\n };\n }\n if (match = matchers.hex3.exec(color)) {\n return {\n r: parseIntFromHex(match[1] + \"\" + match[1]),\n g: parseIntFromHex(match[2] + \"\" + match[2]),\n b: parseIntFromHex(match[3] + \"\" + match[3]),\n format: named ? \"name\" : \"hex\"\n };\n }\n return false;\n}\nfunction validateWCAG2Parms(parms) {\n // return valid WCAG2 parms for isReadable.\n // If input parms are invalid, return {\"level\":\"AA\", \"size\":\"small\"}\n var level, size;\n parms = parms || {\n level: \"AA\",\n size: \"small\"\n };\n level = (parms.level || \"AA\").toUpperCase();\n size = (parms.size || \"small\").toLowerCase();\n if (level !== \"AA\" && level !== \"AAA\") {\n level = \"AA\";\n }\n if (size !== \"small\" && size !== \"large\") {\n size = \"small\";\n }\n return {\n level: level,\n size: size\n };\n}\n\nexport { tinycolor as default };\n","import each from 'lodash-es/each';\nimport tinycolor from 'tinycolor2';\n\nexport var simpleCheckForValidColor = function simpleCheckForValidColor(data) {\n var keysToCheck = ['r', 'g', 'b', 'a', 'h', 's', 'l', 'v'];\n var checked = 0;\n var passed = 0;\n each(keysToCheck, function (letter) {\n if (data[letter]) {\n checked += 1;\n if (!isNaN(data[letter])) {\n passed += 1;\n }\n if (letter === 's' || letter === 'l') {\n var percentPatt = /^\\d+%$/;\n if (percentPatt.test(data[letter])) {\n passed += 1;\n }\n }\n }\n });\n return checked === passed ? data : false;\n};\n\nexport var toState = function toState(data, oldHue) {\n var color = data.hex ? tinycolor(data.hex) : tinycolor(data);\n var hsl = color.toHsl();\n var hsv = color.toHsv();\n var rgb = color.toRgb();\n var hex = color.toHex();\n if (hsl.s === 0) {\n hsl.h = oldHue || 0;\n hsv.h = oldHue || 0;\n }\n var transparent = hex === '000000' && rgb.a === 0;\n\n return {\n hsl: hsl,\n hex: transparent ? 'transparent' : '#' + hex,\n rgb: rgb,\n hsv: hsv,\n oldHue: data.h || oldHue || hsl.h,\n source: data.source\n };\n};\n\nexport var isValidHex = function isValidHex(hex) {\n if (hex === 'transparent') {\n return true;\n }\n // disable hex4 and hex8\n var lh = String(hex).charAt(0) === '#' ? 1 : 0;\n return hex.length !== 4 + lh && hex.length < 7 + lh && tinycolor(hex).isValid();\n};\n\nexport var getContrastingColor = function getContrastingColor(data) {\n if (!data) {\n return '#fff';\n }\n var col = toState(data);\n if (col.hex === 'transparent') {\n return 'rgba(0,0,0,0.4)';\n }\n var yiq = (col.rgb.r * 299 + col.rgb.g * 587 + col.rgb.b * 114) / 1000;\n return yiq >= 128 ? '#000' : '#fff';\n};\n\nexport var red = {\n hsl: { a: 1, h: 0, l: 0.5, s: 1 },\n hex: '#ff0000',\n rgb: { r: 255, g: 0, b: 0, a: 1 },\n hsv: { h: 0, s: 1, v: 1, a: 1 }\n};\n\nexport var isvalidColorString = function isvalidColorString(string, type) {\n var stringWithoutDegree = string.replace('°', '');\n return tinycolor(type + ' (' + stringWithoutDegree + ')')._ok;\n};","var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nimport React, { Component, PureComponent } from 'react';\nimport debounce from 'lodash-es/debounce';\nimport * as color from '../../helpers/color';\n\nexport var ColorWrap = function ColorWrap(Picker) {\n var ColorPicker = function (_ref) {\n _inherits(ColorPicker, _ref);\n\n function ColorPicker(props) {\n _classCallCheck(this, ColorPicker);\n\n var _this = _possibleConstructorReturn(this, (ColorPicker.__proto__ || Object.getPrototypeOf(ColorPicker)).call(this));\n\n _this.handleChange = function (data, event) {\n var isValidColor = color.simpleCheckForValidColor(data);\n if (isValidColor) {\n var colors = color.toState(data, data.h || _this.state.oldHue);\n _this.setState(colors);\n _this.props.onChangeComplete && _this.debounce(_this.props.onChangeComplete, colors, event);\n _this.props.onChange && _this.props.onChange(colors, event);\n }\n };\n\n _this.handleSwatchHover = function (data, event) {\n var isValidColor = color.simpleCheckForValidColor(data);\n if (isValidColor) {\n var colors = color.toState(data, data.h || _this.state.oldHue);\n _this.props.onSwatchHover && _this.props.onSwatchHover(colors, event);\n }\n };\n\n _this.state = _extends({}, color.toState(props.color, 0));\n\n _this.debounce = debounce(function (fn, data, event) {\n fn(data, event);\n }, 100);\n return _this;\n }\n\n _createClass(ColorPicker, [{\n key: 'render',\n value: function render() {\n var optionalEvents = {};\n if (this.props.onSwatchHover) {\n optionalEvents.onSwatchHover = this.handleSwatchHover;\n }\n\n return React.createElement(Picker, _extends({}, this.props, this.state, {\n onChange: this.handleChange\n }, optionalEvents));\n }\n }], [{\n key: 'getDerivedStateFromProps',\n value: function getDerivedStateFromProps(nextProps, state) {\n return _extends({}, color.toState(nextProps.color, state.oldHue));\n }\n }]);\n\n return ColorPicker;\n }(PureComponent || Component);\n\n ColorPicker.propTypes = _extends({}, Picker.propTypes);\n\n ColorPicker.defaultProps = _extends({}, Picker.defaultProps, {\n color: {\n h: 250,\n s: 0.50,\n l: 0.20,\n a: 1\n }\n });\n\n return ColorPicker;\n};\n\nexport default ColorWrap;","var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/* eslint-disable no-invalid-this */\nimport React from 'react';\n\nexport var handleFocus = function handleFocus(Component) {\n var Span = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'span';\n return function (_React$Component) {\n _inherits(Focus, _React$Component);\n\n function Focus() {\n var _ref;\n\n var _temp, _this, _ret;\n\n _classCallCheck(this, Focus);\n\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = Focus.__proto__ || Object.getPrototypeOf(Focus)).call.apply(_ref, [this].concat(args))), _this), _this.state = { focus: false }, _this.handleFocus = function () {\n return _this.setState({ focus: true });\n }, _this.handleBlur = function () {\n return _this.setState({ focus: false });\n }, _temp), _possibleConstructorReturn(_this, _ret);\n }\n\n _createClass(Focus, [{\n key: 'render',\n value: function render() {\n return React.createElement(\n Span,\n { onFocus: this.handleFocus, onBlur: this.handleBlur },\n React.createElement(Component, _extends({}, this.props, this.state))\n );\n }\n }]);\n\n return Focus;\n }(React.Component);\n};","var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nimport React from 'react';\nimport reactCSS from 'reactcss';\nimport { handleFocus } from '../../helpers/interaction';\n\nimport Checkboard from './Checkboard';\n\nvar ENTER = 13;\n\nexport var Swatch = function Swatch(_ref) {\n var color = _ref.color,\n style = _ref.style,\n _ref$onClick = _ref.onClick,\n onClick = _ref$onClick === undefined ? function () {} : _ref$onClick,\n onHover = _ref.onHover,\n _ref$title = _ref.title,\n title = _ref$title === undefined ? color : _ref$title,\n children = _ref.children,\n focus = _ref.focus,\n _ref$focusStyle = _ref.focusStyle,\n focusStyle = _ref$focusStyle === undefined ? {} : _ref$focusStyle;\n\n var transparent = color === 'transparent';\n var styles = reactCSS({\n default: {\n swatch: _extends({\n background: color,\n height: '100%',\n width: '100%',\n cursor: 'pointer',\n position: 'relative',\n outline: 'none'\n }, style, focus ? focusStyle : {})\n }\n });\n\n var handleClick = function handleClick(e) {\n return onClick(color, e);\n };\n var handleKeyDown = function handleKeyDown(e) {\n return e.keyCode === ENTER && onClick(color, e);\n };\n var handleHover = function handleHover(e) {\n return onHover(color, e);\n };\n\n var optionalEvents = {};\n if (onHover) {\n optionalEvents.onMouseOver = handleHover;\n }\n\n return React.createElement(\n 'div',\n _extends({\n style: styles.swatch,\n onClick: handleClick,\n title: title,\n tabIndex: 0,\n onKeyDown: handleKeyDown\n }, optionalEvents),\n children,\n transparent && React.createElement(Checkboard, {\n borderRadius: styles.swatch.borderRadius,\n boxShadow: 'inset 0 0 0 1px rgba(0,0,0,0.1)'\n })\n );\n};\n\nexport default handleFocus(Swatch);","import React from 'react';\nimport reactCSS from 'reactcss';\n\nexport var AlphaPointer = function AlphaPointer(_ref) {\n var direction = _ref.direction;\n\n var styles = reactCSS({\n 'default': {\n picker: {\n width: '18px',\n height: '18px',\n borderRadius: '50%',\n transform: 'translate(-9px, -1px)',\n backgroundColor: 'rgb(248, 248, 248)',\n boxShadow: '0 1px 4px 0 rgba(0, 0, 0, 0.37)'\n }\n },\n 'vertical': {\n picker: {\n transform: 'translate(-3px, -9px)'\n }\n }\n }, { vertical: direction === 'vertical' });\n\n return React.createElement('div', { style: styles.picker });\n};\n\nexport default AlphaPointer;","var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nimport React from 'react';\nimport reactCSS from 'reactcss';\n\nimport { ColorWrap, Alpha } from '../common';\nimport AlphaPointer from './AlphaPointer';\n\nexport var AlphaPicker = function AlphaPicker(_ref) {\n var rgb = _ref.rgb,\n hsl = _ref.hsl,\n width = _ref.width,\n height = _ref.height,\n onChange = _ref.onChange,\n direction = _ref.direction,\n style = _ref.style,\n renderers = _ref.renderers,\n pointer = _ref.pointer,\n _ref$className = _ref.className,\n className = _ref$className === undefined ? '' : _ref$className;\n\n var styles = reactCSS({\n 'default': {\n picker: {\n position: 'relative',\n width: width,\n height: height\n },\n alpha: {\n radius: '2px',\n style: style\n }\n }\n });\n\n return React.createElement(\n 'div',\n { style: styles.picker, className: 'alpha-picker ' + className },\n React.createElement(Alpha, _extends({}, styles.alpha, {\n rgb: rgb,\n hsl: hsl,\n pointer: pointer,\n renderers: renderers,\n onChange: onChange,\n direction: direction\n }))\n );\n};\n\nAlphaPicker.defaultProps = {\n width: '316px',\n height: '16px',\n direction: 'horizontal',\n pointer: AlphaPointer\n};\n\nexport default ColorWrap(AlphaPicker);","/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n}\n\nexport default arrayMap;\n","/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\nfunction setCacheAdd(value) {\n this.__data__.set(value, HASH_UNDEFINED);\n return this;\n}\n\nexport default setCacheAdd;\n","/**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\nfunction setCacheHas(value) {\n return this.__data__.has(value);\n}\n\nexport default setCacheHas;\n","import MapCache from './_MapCache.js';\nimport setCacheAdd from './_setCacheAdd.js';\nimport setCacheHas from './_setCacheHas.js';\n\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\nfunction SetCache(values) {\n var index = -1,\n length = values == null ? 0 : values.length;\n\n this.__data__ = new MapCache;\n while (++index < length) {\n this.add(values[index]);\n }\n}\n\n// Add methods to `SetCache`.\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\n\nexport default SetCache;\n","/**\n * A specialized version of `_.some` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */\nfunction arraySome(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (predicate(array[index], index, array)) {\n return true;\n }\n }\n return false;\n}\n\nexport default arraySome;\n","/**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction cacheHas(cache, key) {\n return cache.has(key);\n}\n\nexport default cacheHas;\n","import SetCache from './_SetCache.js';\nimport arraySome from './_arraySome.js';\nimport cacheHas from './_cacheHas.js';\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `array` and `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\nfunction equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n arrLength = array.length,\n othLength = other.length;\n\n if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n return false;\n }\n // Check that cyclic values are equal.\n var arrStacked = stack.get(array);\n var othStacked = stack.get(other);\n if (arrStacked && othStacked) {\n return arrStacked == other && othStacked == array;\n }\n var index = -1,\n result = true,\n seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n stack.set(array, other);\n stack.set(other, array);\n\n // Ignore non-index properties.\n while (++index < arrLength) {\n var arrValue = array[index],\n othValue = other[index];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, arrValue, index, other, array, stack)\n : customizer(arrValue, othValue, index, array, other, stack);\n }\n if (compared !== undefined) {\n if (compared) {\n continue;\n }\n result = false;\n break;\n }\n // Recursively compare arrays (susceptible to call stack limits).\n if (seen) {\n if (!arraySome(other, function(othValue, othIndex) {\n if (!cacheHas(seen, othIndex) &&\n (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n return seen.push(othIndex);\n }\n })) {\n result = false;\n break;\n }\n } else if (!(\n arrValue === othValue ||\n equalFunc(arrValue, othValue, bitmask, customizer, stack)\n )) {\n result = false;\n break;\n }\n }\n stack['delete'](array);\n stack['delete'](other);\n return result;\n}\n\nexport default equalArrays;\n","/**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\nfunction mapToArray(map) {\n var index = -1,\n result = Array(map.size);\n\n map.forEach(function(value, key) {\n result[++index] = [key, value];\n });\n return result;\n}\n\nexport default mapToArray;\n","/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n var index = -1,\n result = Array(set.size);\n\n set.forEach(function(value) {\n result[++index] = value;\n });\n return result;\n}\n\nexport default setToArray;\n","import Symbol from './_Symbol.js';\nimport Uint8Array from './_Uint8Array.js';\nimport eq from './eq.js';\nimport equalArrays from './_equalArrays.js';\nimport mapToArray from './_mapToArray.js';\nimport setToArray from './_setToArray.js';\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]';\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n switch (tag) {\n case dataViewTag:\n if ((object.byteLength != other.byteLength) ||\n (object.byteOffset != other.byteOffset)) {\n return false;\n }\n object = object.buffer;\n other = other.buffer;\n\n case arrayBufferTag:\n if ((object.byteLength != other.byteLength) ||\n !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n return false;\n }\n return true;\n\n case boolTag:\n case dateTag:\n case numberTag:\n // Coerce booleans to `1` or `0` and dates to milliseconds.\n // Invalid dates are coerced to `NaN`.\n return eq(+object, +other);\n\n case errorTag:\n return object.name == other.name && object.message == other.message;\n\n case regexpTag:\n case stringTag:\n // Coerce regexes to strings and treat strings, primitives and objects,\n // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n // for more details.\n return object == (other + '');\n\n case mapTag:\n var convert = mapToArray;\n\n case setTag:\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n convert || (convert = setToArray);\n\n if (object.size != other.size && !isPartial) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked) {\n return stacked == other;\n }\n bitmask |= COMPARE_UNORDERED_FLAG;\n\n // Recursively compare objects (susceptible to call stack limits).\n stack.set(object, other);\n var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n stack['delete'](object);\n return result;\n\n case symbolTag:\n if (symbolValueOf) {\n return symbolValueOf.call(object) == symbolValueOf.call(other);\n }\n }\n return false;\n}\n\nexport default equalByTag;\n","/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n var index = -1,\n length = values.length,\n offset = array.length;\n\n while (++index < length) {\n array[offset + index] = values[index];\n }\n return array;\n}\n\nexport default arrayPush;\n","import arrayPush from './_arrayPush.js';\nimport isArray from './isArray.js';\n\n/**\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction baseGetAllKeys(object, keysFunc, symbolsFunc) {\n var result = keysFunc(object);\n return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n}\n\nexport default baseGetAllKeys;\n","/**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result[resIndex++] = value;\n }\n }\n return result;\n}\n\nexport default arrayFilter;\n","/**\n * This method returns a new empty array.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Array} Returns the new empty array.\n * @example\n *\n * var arrays = _.times(2, _.stubArray);\n *\n * console.log(arrays);\n * // => [[], []]\n *\n * console.log(arrays[0] === arrays[1]);\n * // => false\n */\nfunction stubArray() {\n return [];\n}\n\nexport default stubArray;\n","import arrayFilter from './_arrayFilter.js';\nimport stubArray from './stubArray.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n if (object == null) {\n return [];\n }\n object = Object(object);\n return arrayFilter(nativeGetSymbols(object), function(symbol) {\n return propertyIsEnumerable.call(object, symbol);\n });\n};\n\nexport default getSymbols;\n","import baseGetAllKeys from './_baseGetAllKeys.js';\nimport getSymbols from './_getSymbols.js';\nimport keys from './keys.js';\n\n/**\n * Creates an array of own enumerable property names and symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeys(object) {\n return baseGetAllKeys(object, keys, getSymbols);\n}\n\nexport default getAllKeys;\n","import getAllKeys from './_getAllKeys.js';\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n objProps = getAllKeys(object),\n objLength = objProps.length,\n othProps = getAllKeys(other),\n othLength = othProps.length;\n\n if (objLength != othLength && !isPartial) {\n return false;\n }\n var index = objLength;\n while (index--) {\n var key = objProps[index];\n if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n return false;\n }\n }\n // Check that cyclic values are equal.\n var objStacked = stack.get(object);\n var othStacked = stack.get(other);\n if (objStacked && othStacked) {\n return objStacked == other && othStacked == object;\n }\n var result = true;\n stack.set(object, other);\n stack.set(other, object);\n\n var skipCtor = isPartial;\n while (++index < objLength) {\n key = objProps[index];\n var objValue = object[key],\n othValue = other[key];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, objValue, key, other, object, stack)\n : customizer(objValue, othValue, key, object, other, stack);\n }\n // Recursively compare objects (susceptible to call stack limits).\n if (!(compared === undefined\n ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n : compared\n )) {\n result = false;\n break;\n }\n skipCtor || (skipCtor = key == 'constructor');\n }\n if (result && !skipCtor) {\n var objCtor = object.constructor,\n othCtor = other.constructor;\n\n // Non `Object` object instances with different constructors are not equal.\n if (objCtor != othCtor &&\n ('constructor' in object && 'constructor' in other) &&\n !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n result = false;\n }\n }\n stack['delete'](object);\n stack['delete'](other);\n return result;\n}\n\nexport default equalObjects;\n","import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView');\n\nexport default DataView;\n","import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar Promise = getNative(root, 'Promise');\n\nexport default Promise;\n","import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar Set = getNative(root, 'Set');\n\nexport default Set;\n","import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar WeakMap = getNative(root, 'WeakMap');\n\nexport default WeakMap;\n","import DataView from './_DataView.js';\nimport Map from './_Map.js';\nimport Promise from './_Promise.js';\nimport Set from './_Set.js';\nimport WeakMap from './_WeakMap.js';\nimport baseGetTag from './_baseGetTag.js';\nimport toSource from './_toSource.js';\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n objectTag = '[object Object]',\n promiseTag = '[object Promise]',\n setTag = '[object Set]',\n weakMapTag = '[object WeakMap]';\n\nvar dataViewTag = '[object DataView]';\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n mapCtorString = toSource(Map),\n promiseCtorString = toSource(Promise),\n setCtorString = toSource(Set),\n weakMapCtorString = toSource(WeakMap);\n\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n (Map && getTag(new Map) != mapTag) ||\n (Promise && getTag(Promise.resolve()) != promiseTag) ||\n (Set && getTag(new Set) != setTag) ||\n (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n getTag = function(value) {\n var result = baseGetTag(value),\n Ctor = result == objectTag ? value.constructor : undefined,\n ctorString = Ctor ? toSource(Ctor) : '';\n\n if (ctorString) {\n switch (ctorString) {\n case dataViewCtorString: return dataViewTag;\n case mapCtorString: return mapTag;\n case promiseCtorString: return promiseTag;\n case setCtorString: return setTag;\n case weakMapCtorString: return weakMapTag;\n }\n }\n return result;\n };\n}\n\nexport default getTag;\n","import Stack from './_Stack.js';\nimport equalArrays from './_equalArrays.js';\nimport equalByTag from './_equalByTag.js';\nimport equalObjects from './_equalObjects.js';\nimport getTag from './_getTag.js';\nimport isArray from './isArray.js';\nimport isBuffer from './isBuffer.js';\nimport isTypedArray from './isTypedArray.js';\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n var objIsArr = isArray(object),\n othIsArr = isArray(other),\n objTag = objIsArr ? arrayTag : getTag(object),\n othTag = othIsArr ? arrayTag : getTag(other);\n\n objTag = objTag == argsTag ? objectTag : objTag;\n othTag = othTag == argsTag ? objectTag : othTag;\n\n var objIsObj = objTag == objectTag,\n othIsObj = othTag == objectTag,\n isSameTag = objTag == othTag;\n\n if (isSameTag && isBuffer(object)) {\n if (!isBuffer(other)) {\n return false;\n }\n objIsArr = true;\n objIsObj = false;\n }\n if (isSameTag && !objIsObj) {\n stack || (stack = new Stack);\n return (objIsArr || isTypedArray(object))\n ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n }\n if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n if (objIsWrapped || othIsWrapped) {\n var objUnwrapped = objIsWrapped ? object.value() : object,\n othUnwrapped = othIsWrapped ? other.value() : other;\n\n stack || (stack = new Stack);\n return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n }\n }\n if (!isSameTag) {\n return false;\n }\n stack || (stack = new Stack);\n return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n}\n\nexport default baseIsEqualDeep;\n","import baseIsEqualDeep from './_baseIsEqualDeep.js';\nimport isObjectLike from './isObjectLike.js';\n\n/**\n * The base implementation of `_.isEqual` which supports partial comparisons\n * and tracks traversed objects.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Unordered comparison\n * 2 - Partial comparison\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\nfunction baseIsEqual(value, other, bitmask, customizer, stack) {\n if (value === other) {\n return true;\n }\n if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n return value !== value && other !== other;\n }\n return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n}\n\nexport default baseIsEqual;\n","import Stack from './_Stack.js';\nimport baseIsEqual from './_baseIsEqual.js';\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of `_.isMatch` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @param {Array} matchData The property names, values, and compare flags to match.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n */\nfunction baseIsMatch(object, source, matchData, customizer) {\n var index = matchData.length,\n length = index,\n noCustomizer = !customizer;\n\n if (object == null) {\n return !length;\n }\n object = Object(object);\n while (index--) {\n var data = matchData[index];\n if ((noCustomizer && data[2])\n ? data[1] !== object[data[0]]\n : !(data[0] in object)\n ) {\n return false;\n }\n }\n while (++index < length) {\n data = matchData[index];\n var key = data[0],\n objValue = object[key],\n srcValue = data[1];\n\n if (noCustomizer && data[2]) {\n if (objValue === undefined && !(key in object)) {\n return false;\n }\n } else {\n var stack = new Stack;\n if (customizer) {\n var result = customizer(objValue, srcValue, key, object, source, stack);\n }\n if (!(result === undefined\n ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)\n : result\n )) {\n return false;\n }\n }\n }\n return true;\n}\n\nexport default baseIsMatch;\n","import isObject from './isObject.js';\n\n/**\n * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` if suitable for strict\n * equality comparisons, else `false`.\n */\nfunction isStrictComparable(value) {\n return value === value && !isObject(value);\n}\n\nexport default isStrictComparable;\n","import isStrictComparable from './_isStrictComparable.js';\nimport keys from './keys.js';\n\n/**\n * Gets the property names, values, and compare flags of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the match data of `object`.\n */\nfunction getMatchData(object) {\n var result = keys(object),\n length = result.length;\n\n while (length--) {\n var key = result[length],\n value = object[key];\n\n result[length] = [key, value, isStrictComparable(value)];\n }\n return result;\n}\n\nexport default getMatchData;\n","/**\n * A specialized version of `matchesProperty` for source values suitable\n * for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction matchesStrictComparable(key, srcValue) {\n return function(object) {\n if (object == null) {\n return false;\n }\n return object[key] === srcValue &&\n (srcValue !== undefined || (key in Object(object)));\n };\n}\n\nexport default matchesStrictComparable;\n","import baseIsMatch from './_baseIsMatch.js';\nimport getMatchData from './_getMatchData.js';\nimport matchesStrictComparable from './_matchesStrictComparable.js';\n\n/**\n * The base implementation of `_.matches` which doesn't clone `source`.\n *\n * @private\n * @param {Object} source The object of property values to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatches(source) {\n var matchData = getMatchData(source);\n if (matchData.length == 1 && matchData[0][2]) {\n return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n }\n return function(object) {\n return object === source || baseIsMatch(object, source, matchData);\n };\n}\n\nexport default baseMatches;\n","import isArray from './isArray.js';\nimport isSymbol from './isSymbol.js';\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/;\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n if (isArray(value)) {\n return false;\n }\n var type = typeof value;\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n value == null || isSymbol(value)) {\n return true;\n }\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n (object != null && value in Object(object));\n}\n\nexport default isKey;\n","import MapCache from './_MapCache.js';\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var memoized = function() {\n var args = arguments,\n key = resolver ? resolver.apply(this, args) : args[0],\n cache = memoized.cache;\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result) || cache;\n return result;\n };\n memoized.cache = new (memoize.Cache || MapCache);\n return memoized;\n}\n\n// Expose `MapCache`.\nmemoize.Cache = MapCache;\n\nexport default memoize;\n","import memoizeCapped from './_memoizeCapped.js';\n\n/** Used to match property names within property paths. */\nvar rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\nvar stringToPath = memoizeCapped(function(string) {\n var result = [];\n if (string.charCodeAt(0) === 46 /* . */) {\n result.push('');\n }\n string.replace(rePropName, function(match, number, quote, subString) {\n result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n });\n return result;\n});\n\nexport default stringToPath;\n","import memoize from './memoize.js';\n\n/** Used as the maximum memoize cache size. */\nvar MAX_MEMOIZE_SIZE = 500;\n\n/**\n * A specialized version of `_.memoize` which clears the memoized function's\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n *\n * @private\n * @param {Function} func The function to have its output memoized.\n * @returns {Function} Returns the new memoized function.\n */\nfunction memoizeCapped(func) {\n var result = memoize(func, function(key) {\n if (cache.size === MAX_MEMOIZE_SIZE) {\n cache.clear();\n }\n return key;\n });\n\n var cache = result.cache;\n return result;\n}\n\nexport default memoizeCapped;\n","import Symbol from './_Symbol.js';\nimport arrayMap from './_arrayMap.js';\nimport isArray from './isArray.js';\nimport isSymbol from './isSymbol.js';\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isArray(value)) {\n // Recursively convert values (susceptible to call stack limits).\n return arrayMap(value, baseToString) + '';\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nexport default baseToString;\n","import baseToString from './_baseToString.js';\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\nexport default toString;\n","import isArray from './isArray.js';\nimport isKey from './_isKey.js';\nimport stringToPath from './_stringToPath.js';\nimport toString from './toString.js';\n\n/**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {Object} [object] The object to query keys on.\n * @returns {Array} Returns the cast property path array.\n */\nfunction castPath(value, object) {\n if (isArray(value)) {\n return value;\n }\n return isKey(value, object) ? [value] : stringToPath(toString(value));\n}\n\nexport default castPath;\n","import isSymbol from './isSymbol.js';\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n if (typeof value == 'string' || isSymbol(value)) {\n return value;\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nexport default toKey;\n","import castPath from './_castPath.js';\nimport toKey from './_toKey.js';\n\n/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n path = castPath(path, object);\n\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n return (index && index == length) ? object : undefined;\n}\n\nexport default baseGet;\n","import baseGet from './_baseGet.js';\n\n/**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\nfunction get(object, path, defaultValue) {\n var result = object == null ? undefined : baseGet(object, path);\n return result === undefined ? defaultValue : result;\n}\n\nexport default get;\n","/**\n * The base implementation of `_.hasIn` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHasIn(object, key) {\n return object != null && key in Object(object);\n}\n\nexport default baseHasIn;\n","import castPath from './_castPath.js';\nimport isArguments from './isArguments.js';\nimport isArray from './isArray.js';\nimport isIndex from './_isIndex.js';\nimport isLength from './isLength.js';\nimport toKey from './_toKey.js';\n\n/**\n * Checks if `path` exists on `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @param {Function} hasFunc The function to check properties.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n */\nfunction hasPath(object, path, hasFunc) {\n path = castPath(path, object);\n\n var index = -1,\n length = path.length,\n result = false;\n\n while (++index < length) {\n var key = toKey(path[index]);\n if (!(result = object != null && hasFunc(object, key))) {\n break;\n }\n object = object[key];\n }\n if (result || ++index != length) {\n return result;\n }\n length = object == null ? 0 : object.length;\n return !!length && isLength(length) && isIndex(key, length) &&\n (isArray(object) || isArguments(object));\n}\n\nexport default hasPath;\n","import baseHasIn from './_baseHasIn.js';\nimport hasPath from './_hasPath.js';\n\n/**\n * Checks if `path` is a direct or inherited property of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.hasIn(object, 'a');\n * // => true\n *\n * _.hasIn(object, 'a.b');\n * // => true\n *\n * _.hasIn(object, ['a', 'b']);\n * // => true\n *\n * _.hasIn(object, 'b');\n * // => false\n */\nfunction hasIn(object, path) {\n return object != null && hasPath(object, path, baseHasIn);\n}\n\nexport default hasIn;\n","import baseIsEqual from './_baseIsEqual.js';\nimport get from './get.js';\nimport hasIn from './hasIn.js';\nimport isKey from './_isKey.js';\nimport isStrictComparable from './_isStrictComparable.js';\nimport matchesStrictComparable from './_matchesStrictComparable.js';\nimport toKey from './_toKey.js';\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n *\n * @private\n * @param {string} path The path of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatchesProperty(path, srcValue) {\n if (isKey(path) && isStrictComparable(srcValue)) {\n return matchesStrictComparable(toKey(path), srcValue);\n }\n return function(object) {\n var objValue = get(object, path);\n return (objValue === undefined && objValue === srcValue)\n ? hasIn(object, path)\n : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\n };\n}\n\nexport default baseMatchesProperty;\n","/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n}\n\nexport default baseProperty;\n","import baseGet from './_baseGet.js';\n\n/**\n * A specialized version of `baseProperty` which supports deep paths.\n *\n * @private\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction basePropertyDeep(path) {\n return function(object) {\n return baseGet(object, path);\n };\n}\n\nexport default basePropertyDeep;\n","import baseProperty from './_baseProperty.js';\nimport basePropertyDeep from './_basePropertyDeep.js';\nimport isKey from './_isKey.js';\nimport toKey from './_toKey.js';\n\n/**\n * Creates a function that returns the value at `path` of a given object.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n * @example\n *\n * var objects = [\n * { 'a': { 'b': 2 } },\n * { 'a': { 'b': 1 } }\n * ];\n *\n * _.map(objects, _.property('a.b'));\n * // => [2, 1]\n *\n * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');\n * // => [1, 2]\n */\nfunction property(path) {\n return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n}\n\nexport default property;\n","import baseMatches from './_baseMatches.js';\nimport baseMatchesProperty from './_baseMatchesProperty.js';\nimport identity from './identity.js';\nimport isArray from './isArray.js';\nimport property from './property.js';\n\n/**\n * The base implementation of `_.iteratee`.\n *\n * @private\n * @param {*} [value=_.identity] The value to convert to an iteratee.\n * @returns {Function} Returns the iteratee.\n */\nfunction baseIteratee(value) {\n // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n if (typeof value == 'function') {\n return value;\n }\n if (value == null) {\n return identity;\n }\n if (typeof value == 'object') {\n return isArray(value)\n ? baseMatchesProperty(value[0], value[1])\n : baseMatches(value);\n }\n return property(value);\n}\n\nexport default baseIteratee;\n","import baseEach from './_baseEach.js';\nimport isArrayLike from './isArrayLike.js';\n\n/**\n * The base implementation of `_.map` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction baseMap(collection, iteratee) {\n var index = -1,\n result = isArrayLike(collection) ? Array(collection.length) : [];\n\n baseEach(collection, function(value, key, collection) {\n result[++index] = iteratee(value, key, collection);\n });\n return result;\n}\n\nexport default baseMap;\n","import arrayMap from './_arrayMap.js';\nimport baseIteratee from './_baseIteratee.js';\nimport baseMap from './_baseMap.js';\nimport isArray from './isArray.js';\n\n/**\n * Creates an array of values by running each element in `collection` thru\n * `iteratee`. The iteratee is invoked with three arguments:\n * (value, index|key, collection).\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.\n *\n * The guarded methods are:\n * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,\n * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,\n * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,\n * `template`, `trim`, `trimEnd`, `trimStart`, and `words`\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * _.map([4, 8], square);\n * // => [16, 64]\n *\n * _.map({ 'a': 4, 'b': 8 }, square);\n * // => [16, 64] (iteration order is not guaranteed)\n *\n * var users = [\n * { 'user': 'barney' },\n * { 'user': 'fred' }\n * ];\n *\n * // The `_.property` iteratee shorthand.\n * _.map(users, 'user');\n * // => ['barney', 'fred']\n */\nfunction map(collection, iteratee) {\n var func = isArray(collection) ? arrayMap : baseMap;\n return func(collection, baseIteratee(iteratee, 3));\n}\n\nexport default map;\n","import React from 'react';\nimport reactCSS from 'reactcss';\nimport map from 'lodash-es/map';\n\nimport { Swatch } from '../common';\n\nexport var BlockSwatches = function BlockSwatches(_ref) {\n var colors = _ref.colors,\n onClick = _ref.onClick,\n onSwatchHover = _ref.onSwatchHover;\n\n var styles = reactCSS({\n 'default': {\n swatches: {\n marginRight: '-10px'\n },\n swatch: {\n width: '22px',\n height: '22px',\n float: 'left',\n marginRight: '10px',\n marginBottom: '10px',\n borderRadius: '4px'\n },\n clear: {\n clear: 'both'\n }\n }\n });\n\n return React.createElement(\n 'div',\n { style: styles.swatches },\n map(colors, function (c) {\n return React.createElement(Swatch, {\n key: c,\n color: c,\n style: styles.swatch,\n onClick: onClick,\n onHover: onSwatchHover,\n focusStyle: {\n boxShadow: '0 0 4px ' + c\n }\n });\n }),\n React.createElement('div', { style: styles.clear })\n );\n};\n\nexport default BlockSwatches;","import React from 'react';\nimport PropTypes from 'prop-types';\nimport reactCSS from 'reactcss';\nimport merge from 'lodash-es/merge';\nimport * as color from '../../helpers/color';\n\nimport { ColorWrap, EditableInput, Checkboard } from '../common';\nimport BlockSwatches from './BlockSwatches';\n\nexport var Block = function Block(_ref) {\n var onChange = _ref.onChange,\n onSwatchHover = _ref.onSwatchHover,\n hex = _ref.hex,\n colors = _ref.colors,\n width = _ref.width,\n triangle = _ref.triangle,\n _ref$styles = _ref.styles,\n passedStyles = _ref$styles === undefined ? {} : _ref$styles,\n _ref$className = _ref.className,\n className = _ref$className === undefined ? '' : _ref$className;\n\n var transparent = hex === 'transparent';\n var handleChange = function handleChange(hexCode, e) {\n color.isValidHex(hexCode) && onChange({\n hex: hexCode,\n source: 'hex'\n }, e);\n };\n\n var styles = reactCSS(merge({\n 'default': {\n card: {\n width: width,\n background: '#fff',\n boxShadow: '0 1px rgba(0,0,0,.1)',\n borderRadius: '6px',\n position: 'relative'\n },\n head: {\n height: '110px',\n background: hex,\n borderRadius: '6px 6px 0 0',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n position: 'relative'\n },\n body: {\n padding: '10px'\n },\n label: {\n fontSize: '18px',\n color: color.getContrastingColor(hex),\n position: 'relative'\n },\n triangle: {\n width: '0px',\n height: '0px',\n borderStyle: 'solid',\n borderWidth: '0 10px 10px 10px',\n borderColor: 'transparent transparent ' + hex + ' transparent',\n position: 'absolute',\n top: '-10px',\n left: '50%',\n marginLeft: '-10px'\n },\n input: {\n width: '100%',\n fontSize: '12px',\n color: '#666',\n border: '0px',\n outline: 'none',\n height: '22px',\n boxShadow: 'inset 0 0 0 1px #ddd',\n borderRadius: '4px',\n padding: '0 7px',\n boxSizing: 'border-box'\n }\n },\n 'hide-triangle': {\n triangle: {\n display: 'none'\n }\n }\n }, passedStyles), { 'hide-triangle': triangle === 'hide' });\n\n return React.createElement(\n 'div',\n { style: styles.card, className: 'block-picker ' + className },\n React.createElement('div', { style: styles.triangle }),\n React.createElement(\n 'div',\n { style: styles.head },\n transparent && React.createElement(Checkboard, { borderRadius: '6px 6px 0 0' }),\n React.createElement(\n 'div',\n { style: styles.label },\n hex\n )\n ),\n React.createElement(\n 'div',\n { style: styles.body },\n React.createElement(BlockSwatches, { colors: colors, onClick: handleChange, onSwatchHover: onSwatchHover }),\n React.createElement(EditableInput, {\n style: { input: styles.input },\n value: hex,\n onChange: handleChange\n })\n )\n );\n};\n\nBlock.propTypes = {\n width: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n colors: PropTypes.arrayOf(PropTypes.string),\n triangle: PropTypes.oneOf(['top', 'hide']),\n styles: PropTypes.object\n};\n\nBlock.defaultProps = {\n width: 170,\n colors: ['#D9E3F0', '#F47373', '#697689', '#37D67A', '#2CCCE4', '#555555', '#dce775', '#ff8a65', '#ba68c8'],\n triangle: 'top',\n styles: {}\n};\n\nexport default ColorWrap(Block);","export var red = {\"50\":\"#ffebee\",\"100\":\"#ffcdd2\",\"200\":\"#ef9a9a\",\"300\":\"#e57373\",\"400\":\"#ef5350\",\"500\":\"#f44336\",\"600\":\"#e53935\",\"700\":\"#d32f2f\",\"800\":\"#c62828\",\"900\":\"#b71c1c\",\"a100\":\"#ff8a80\",\"a200\":\"#ff5252\",\"a400\":\"#ff1744\",\"a700\":\"#d50000\"};\nexport var pink = {\"50\":\"#fce4ec\",\"100\":\"#f8bbd0\",\"200\":\"#f48fb1\",\"300\":\"#f06292\",\"400\":\"#ec407a\",\"500\":\"#e91e63\",\"600\":\"#d81b60\",\"700\":\"#c2185b\",\"800\":\"#ad1457\",\"900\":\"#880e4f\",\"a100\":\"#ff80ab\",\"a200\":\"#ff4081\",\"a400\":\"#f50057\",\"a700\":\"#c51162\"};\nexport var purple = {\"50\":\"#f3e5f5\",\"100\":\"#e1bee7\",\"200\":\"#ce93d8\",\"300\":\"#ba68c8\",\"400\":\"#ab47bc\",\"500\":\"#9c27b0\",\"600\":\"#8e24aa\",\"700\":\"#7b1fa2\",\"800\":\"#6a1b9a\",\"900\":\"#4a148c\",\"a100\":\"#ea80fc\",\"a200\":\"#e040fb\",\"a400\":\"#d500f9\",\"a700\":\"#aa00ff\"};\nexport var deepPurple = {\"50\":\"#ede7f6\",\"100\":\"#d1c4e9\",\"200\":\"#b39ddb\",\"300\":\"#9575cd\",\"400\":\"#7e57c2\",\"500\":\"#673ab7\",\"600\":\"#5e35b1\",\"700\":\"#512da8\",\"800\":\"#4527a0\",\"900\":\"#311b92\",\"a100\":\"#b388ff\",\"a200\":\"#7c4dff\",\"a400\":\"#651fff\",\"a700\":\"#6200ea\"};\nexport var indigo = {\"50\":\"#e8eaf6\",\"100\":\"#c5cae9\",\"200\":\"#9fa8da\",\"300\":\"#7986cb\",\"400\":\"#5c6bc0\",\"500\":\"#3f51b5\",\"600\":\"#3949ab\",\"700\":\"#303f9f\",\"800\":\"#283593\",\"900\":\"#1a237e\",\"a100\":\"#8c9eff\",\"a200\":\"#536dfe\",\"a400\":\"#3d5afe\",\"a700\":\"#304ffe\"};\nexport var blue = {\"50\":\"#e3f2fd\",\"100\":\"#bbdefb\",\"200\":\"#90caf9\",\"300\":\"#64b5f6\",\"400\":\"#42a5f5\",\"500\":\"#2196f3\",\"600\":\"#1e88e5\",\"700\":\"#1976d2\",\"800\":\"#1565c0\",\"900\":\"#0d47a1\",\"a100\":\"#82b1ff\",\"a200\":\"#448aff\",\"a400\":\"#2979ff\",\"a700\":\"#2962ff\"};\nexport var lightBlue = {\"50\":\"#e1f5fe\",\"100\":\"#b3e5fc\",\"200\":\"#81d4fa\",\"300\":\"#4fc3f7\",\"400\":\"#29b6f6\",\"500\":\"#03a9f4\",\"600\":\"#039be5\",\"700\":\"#0288d1\",\"800\":\"#0277bd\",\"900\":\"#01579b\",\"a100\":\"#80d8ff\",\"a200\":\"#40c4ff\",\"a400\":\"#00b0ff\",\"a700\":\"#0091ea\"};\nexport var cyan = {\"50\":\"#e0f7fa\",\"100\":\"#b2ebf2\",\"200\":\"#80deea\",\"300\":\"#4dd0e1\",\"400\":\"#26c6da\",\"500\":\"#00bcd4\",\"600\":\"#00acc1\",\"700\":\"#0097a7\",\"800\":\"#00838f\",\"900\":\"#006064\",\"a100\":\"#84ffff\",\"a200\":\"#18ffff\",\"a400\":\"#00e5ff\",\"a700\":\"#00b8d4\"};\nexport var teal = {\"50\":\"#e0f2f1\",\"100\":\"#b2dfdb\",\"200\":\"#80cbc4\",\"300\":\"#4db6ac\",\"400\":\"#26a69a\",\"500\":\"#009688\",\"600\":\"#00897b\",\"700\":\"#00796b\",\"800\":\"#00695c\",\"900\":\"#004d40\",\"a100\":\"#a7ffeb\",\"a200\":\"#64ffda\",\"a400\":\"#1de9b6\",\"a700\":\"#00bfa5\"};\nexport var green = {\"50\":\"#e8f5e9\",\"100\":\"#c8e6c9\",\"200\":\"#a5d6a7\",\"300\":\"#81c784\",\"400\":\"#66bb6a\",\"500\":\"#4caf50\",\"600\":\"#43a047\",\"700\":\"#388e3c\",\"800\":\"#2e7d32\",\"900\":\"#1b5e20\",\"a100\":\"#b9f6ca\",\"a200\":\"#69f0ae\",\"a400\":\"#00e676\",\"a700\":\"#00c853\"};\nexport var lightGreen = {\"50\":\"#f1f8e9\",\"100\":\"#dcedc8\",\"200\":\"#c5e1a5\",\"300\":\"#aed581\",\"400\":\"#9ccc65\",\"500\":\"#8bc34a\",\"600\":\"#7cb342\",\"700\":\"#689f38\",\"800\":\"#558b2f\",\"900\":\"#33691e\",\"a100\":\"#ccff90\",\"a200\":\"#b2ff59\",\"a400\":\"#76ff03\",\"a700\":\"#64dd17\"};\nexport var lime = {\"50\":\"#f9fbe7\",\"100\":\"#f0f4c3\",\"200\":\"#e6ee9c\",\"300\":\"#dce775\",\"400\":\"#d4e157\",\"500\":\"#cddc39\",\"600\":\"#c0ca33\",\"700\":\"#afb42b\",\"800\":\"#9e9d24\",\"900\":\"#827717\",\"a100\":\"#f4ff81\",\"a200\":\"#eeff41\",\"a400\":\"#c6ff00\",\"a700\":\"#aeea00\"};\nexport var yellow = {\"50\":\"#fffde7\",\"100\":\"#fff9c4\",\"200\":\"#fff59d\",\"300\":\"#fff176\",\"400\":\"#ffee58\",\"500\":\"#ffeb3b\",\"600\":\"#fdd835\",\"700\":\"#fbc02d\",\"800\":\"#f9a825\",\"900\":\"#f57f17\",\"a100\":\"#ffff8d\",\"a200\":\"#ffff00\",\"a400\":\"#ffea00\",\"a700\":\"#ffd600\"};\nexport var amber = {\"50\":\"#fff8e1\",\"100\":\"#ffecb3\",\"200\":\"#ffe082\",\"300\":\"#ffd54f\",\"400\":\"#ffca28\",\"500\":\"#ffc107\",\"600\":\"#ffb300\",\"700\":\"#ffa000\",\"800\":\"#ff8f00\",\"900\":\"#ff6f00\",\"a100\":\"#ffe57f\",\"a200\":\"#ffd740\",\"a400\":\"#ffc400\",\"a700\":\"#ffab00\"};\nexport var orange = {\"50\":\"#fff3e0\",\"100\":\"#ffe0b2\",\"200\":\"#ffcc80\",\"300\":\"#ffb74d\",\"400\":\"#ffa726\",\"500\":\"#ff9800\",\"600\":\"#fb8c00\",\"700\":\"#f57c00\",\"800\":\"#ef6c00\",\"900\":\"#e65100\",\"a100\":\"#ffd180\",\"a200\":\"#ffab40\",\"a400\":\"#ff9100\",\"a700\":\"#ff6d00\"};\nexport var deepOrange = {\"50\":\"#fbe9e7\",\"100\":\"#ffccbc\",\"200\":\"#ffab91\",\"300\":\"#ff8a65\",\"400\":\"#ff7043\",\"500\":\"#ff5722\",\"600\":\"#f4511e\",\"700\":\"#e64a19\",\"800\":\"#d84315\",\"900\":\"#bf360c\",\"a100\":\"#ff9e80\",\"a200\":\"#ff6e40\",\"a400\":\"#ff3d00\",\"a700\":\"#dd2c00\"};\nexport var brown = {\"50\":\"#efebe9\",\"100\":\"#d7ccc8\",\"200\":\"#bcaaa4\",\"300\":\"#a1887f\",\"400\":\"#8d6e63\",\"500\":\"#795548\",\"600\":\"#6d4c41\",\"700\":\"#5d4037\",\"800\":\"#4e342e\",\"900\":\"#3e2723\"};\nexport var grey = {\"50\":\"#fafafa\",\"100\":\"#f5f5f5\",\"200\":\"#eeeeee\",\"300\":\"#e0e0e0\",\"400\":\"#bdbdbd\",\"500\":\"#9e9e9e\",\"600\":\"#757575\",\"700\":\"#616161\",\"800\":\"#424242\",\"900\":\"#212121\"};\nexport var blueGrey = {\"50\":\"#eceff1\",\"100\":\"#cfd8dc\",\"200\":\"#b0bec5\",\"300\":\"#90a4ae\",\"400\":\"#78909c\",\"500\":\"#607d8b\",\"600\":\"#546e7a\",\"700\":\"#455a64\",\"800\":\"#37474f\",\"900\":\"#263238\"};\nexport var darkText = {\"primary\":\"rgba(0, 0, 0, 0.87)\",\"secondary\":\"rgba(0, 0, 0, 0.54)\",\"disabled\":\"rgba(0, 0, 0, 0.38)\",\"dividers\":\"rgba(0, 0, 0, 0.12)\"};\nexport var lightText = {\"primary\":\"rgba(255, 255, 255, 1)\",\"secondary\":\"rgba(255, 255, 255, 0.7)\",\"disabled\":\"rgba(255, 255, 255, 0.5)\",\"dividers\":\"rgba(255, 255, 255, 0.12)\"};\nexport var darkIcons = {\"active\":\"rgba(0, 0, 0, 0.54)\",\"inactive\":\"rgba(0, 0, 0, 0.38)\"};\nexport var lightIcons = {\"active\":\"rgba(255, 255, 255, 1)\",\"inactive\":\"rgba(255, 255, 255, 0.5)\"};\nexport var white = \"#ffffff\";\nexport var black = \"#000000\";\n\nexport default {\n red: red,\n pink: pink,\n purple: purple,\n deepPurple: deepPurple,\n indigo: indigo,\n blue: blue,\n lightBlue: lightBlue,\n cyan: cyan,\n teal: teal,\n green: green,\n lightGreen: lightGreen,\n lime: lime,\n yellow: yellow,\n amber: amber,\n orange: orange,\n deepOrange: deepOrange,\n brown: brown,\n grey: grey,\n blueGrey: blueGrey,\n darkText: darkText,\n lightText: lightText,\n darkIcons: darkIcons,\n lightIcons: lightIcons,\n white: white,\n black: black\n};\n","import React from 'react';\nimport reactCSS, { handleHover } from 'reactcss';\n\nimport { Swatch } from '../common';\n\nexport var CircleSwatch = function CircleSwatch(_ref) {\n var color = _ref.color,\n onClick = _ref.onClick,\n onSwatchHover = _ref.onSwatchHover,\n hover = _ref.hover,\n active = _ref.active,\n circleSize = _ref.circleSize,\n circleSpacing = _ref.circleSpacing;\n\n var styles = reactCSS({\n 'default': {\n swatch: {\n width: circleSize,\n height: circleSize,\n marginRight: circleSpacing,\n marginBottom: circleSpacing,\n transform: 'scale(1)',\n transition: '100ms transform ease'\n },\n Swatch: {\n borderRadius: '50%',\n background: 'transparent',\n boxShadow: 'inset 0 0 0 ' + (circleSize / 2 + 1) + 'px ' + color,\n transition: '100ms box-shadow ease'\n }\n },\n 'hover': {\n swatch: {\n transform: 'scale(1.2)'\n }\n },\n 'active': {\n Swatch: {\n boxShadow: 'inset 0 0 0 3px ' + color\n }\n }\n }, { hover: hover, active: active });\n\n return React.createElement(\n 'div',\n { style: styles.swatch },\n React.createElement(Swatch, {\n style: styles.Swatch,\n color: color,\n onClick: onClick,\n onHover: onSwatchHover,\n focusStyle: { boxShadow: styles.Swatch.boxShadow + ', 0 0 5px ' + color }\n })\n );\n};\n\nCircleSwatch.defaultProps = {\n circleSize: 28,\n circleSpacing: 14\n};\n\nexport default handleHover(CircleSwatch);","import React from 'react';\nimport PropTypes from 'prop-types';\nimport reactCSS from 'reactcss';\nimport map from 'lodash-es/map';\nimport merge from 'lodash-es/merge';\nimport * as material from 'material-colors';\n\nimport { ColorWrap } from '../common';\nimport CircleSwatch from './CircleSwatch';\n\nexport var Circle = function Circle(_ref) {\n var width = _ref.width,\n onChange = _ref.onChange,\n onSwatchHover = _ref.onSwatchHover,\n colors = _ref.colors,\n hex = _ref.hex,\n circleSize = _ref.circleSize,\n _ref$styles = _ref.styles,\n passedStyles = _ref$styles === undefined ? {} : _ref$styles,\n circleSpacing = _ref.circleSpacing,\n _ref$className = _ref.className,\n className = _ref$className === undefined ? '' : _ref$className;\n\n var styles = reactCSS(merge({\n 'default': {\n card: {\n width: width,\n display: 'flex',\n flexWrap: 'wrap',\n marginRight: -circleSpacing,\n marginBottom: -circleSpacing\n }\n }\n }, passedStyles));\n\n var handleChange = function handleChange(hexCode, e) {\n return onChange({ hex: hexCode, source: 'hex' }, e);\n };\n\n return React.createElement(\n 'div',\n { style: styles.card, className: 'circle-picker ' + className },\n map(colors, function (c) {\n return React.createElement(CircleSwatch, {\n key: c,\n color: c,\n onClick: handleChange,\n onSwatchHover: onSwatchHover,\n active: hex === c.toLowerCase(),\n circleSize: circleSize,\n circleSpacing: circleSpacing\n });\n })\n );\n};\n\nCircle.propTypes = {\n width: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n circleSize: PropTypes.number,\n circleSpacing: PropTypes.number,\n styles: PropTypes.object\n};\n\nCircle.defaultProps = {\n width: 252,\n circleSize: 28,\n circleSpacing: 14,\n colors: [material.red['500'], material.pink['500'], material.purple['500'], material.deepPurple['500'], material.indigo['500'], material.blue['500'], material.lightBlue['500'], material.cyan['500'], material.teal['500'], material.green['500'], material.lightGreen['500'], material.lime['500'], material.yellow['500'], material.amber['500'], material.orange['500'], material.deepOrange['500'], material.brown['500'], material.blueGrey['500']],\n styles: {}\n};\n\nexport default ColorWrap(Circle);","/**\n * Checks if `value` is `undefined`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.\n * @example\n *\n * _.isUndefined(void 0);\n * // => true\n *\n * _.isUndefined(null);\n * // => false\n */\nfunction isUndefined(value) {\n return value === undefined;\n}\n\nexport default isUndefined;\n","var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/* eslint-disable react/no-did-mount-set-state, no-param-reassign */\n\nimport React from 'react';\nimport reactCSS from 'reactcss';\nimport * as color from '../../helpers/color';\nimport isUndefined from 'lodash-es/isUndefined';\n\nimport { EditableInput } from '../common';\nimport UnfoldMoreHorizontalIcon from '@icons/material/UnfoldMoreHorizontalIcon';\n\nexport var ChromeFields = function (_React$Component) {\n _inherits(ChromeFields, _React$Component);\n\n function ChromeFields(props) {\n _classCallCheck(this, ChromeFields);\n\n var _this = _possibleConstructorReturn(this, (ChromeFields.__proto__ || Object.getPrototypeOf(ChromeFields)).call(this));\n\n _this.toggleViews = function () {\n if (_this.state.view === 'hex') {\n _this.setState({ view: 'rgb' });\n } else if (_this.state.view === 'rgb') {\n _this.setState({ view: 'hsl' });\n } else if (_this.state.view === 'hsl') {\n if (_this.props.hsl.a === 1) {\n _this.setState({ view: 'hex' });\n } else {\n _this.setState({ view: 'rgb' });\n }\n }\n };\n\n _this.handleChange = function (data, e) {\n if (data.hex) {\n color.isValidHex(data.hex) && _this.props.onChange({\n hex: data.hex,\n source: 'hex'\n }, e);\n } else if (data.r || data.g || data.b) {\n _this.props.onChange({\n r: data.r || _this.props.rgb.r,\n g: data.g || _this.props.rgb.g,\n b: data.b || _this.props.rgb.b,\n source: 'rgb'\n }, e);\n } else if (data.a) {\n if (data.a < 0) {\n data.a = 0;\n } else if (data.a > 1) {\n data.a = 1;\n }\n\n _this.props.onChange({\n h: _this.props.hsl.h,\n s: _this.props.hsl.s,\n l: _this.props.hsl.l,\n a: Math.round(data.a * 100) / 100,\n source: 'rgb'\n }, e);\n } else if (data.h || data.s || data.l) {\n // Remove any occurances of '%'.\n if (typeof data.s === 'string' && data.s.includes('%')) {\n data.s = data.s.replace('%', '');\n }\n if (typeof data.l === 'string' && data.l.includes('%')) {\n data.l = data.l.replace('%', '');\n }\n\n // We store HSL as a unit interval so we need to override the 1 input to 0.01\n if (data.s == 1) {\n data.s = 0.01;\n } else if (data.l == 1) {\n data.l = 0.01;\n }\n\n _this.props.onChange({\n h: data.h || _this.props.hsl.h,\n s: Number(!isUndefined(data.s) ? data.s : _this.props.hsl.s),\n l: Number(!isUndefined(data.l) ? data.l : _this.props.hsl.l),\n source: 'hsl'\n }, e);\n }\n };\n\n _this.showHighlight = function (e) {\n e.currentTarget.style.background = '#eee';\n };\n\n _this.hideHighlight = function (e) {\n e.currentTarget.style.background = 'transparent';\n };\n\n if (props.hsl.a !== 1 && props.view === \"hex\") {\n _this.state = {\n view: \"rgb\"\n };\n } else {\n _this.state = {\n view: props.view\n };\n }\n return _this;\n }\n\n _createClass(ChromeFields, [{\n key: 'render',\n value: function render() {\n var _this2 = this;\n\n var styles = reactCSS({\n 'default': {\n wrap: {\n paddingTop: '16px',\n display: 'flex'\n },\n fields: {\n flex: '1',\n display: 'flex',\n marginLeft: '-6px'\n },\n field: {\n paddingLeft: '6px',\n width: '100%'\n },\n alpha: {\n paddingLeft: '6px',\n width: '100%'\n },\n toggle: {\n width: '32px',\n textAlign: 'right',\n position: 'relative'\n },\n icon: {\n marginRight: '-4px',\n marginTop: '12px',\n cursor: 'pointer',\n position: 'relative'\n },\n iconHighlight: {\n position: 'absolute',\n width: '24px',\n height: '28px',\n background: '#eee',\n borderRadius: '4px',\n top: '10px',\n left: '12px',\n display: 'none'\n },\n input: {\n fontSize: '11px',\n color: '#333',\n width: '100%',\n borderRadius: '2px',\n border: 'none',\n boxShadow: 'inset 0 0 0 1px #dadada',\n height: '21px',\n textAlign: 'center'\n },\n label: {\n textTransform: 'uppercase',\n fontSize: '11px',\n lineHeight: '11px',\n color: '#969696',\n textAlign: 'center',\n display: 'block',\n marginTop: '12px'\n },\n svg: {\n fill: '#333',\n width: '24px',\n height: '24px',\n border: '1px transparent solid',\n borderRadius: '5px'\n }\n },\n 'disableAlpha': {\n alpha: {\n display: 'none'\n }\n }\n }, this.props, this.state);\n\n var fields = void 0;\n if (this.state.view === 'hex') {\n fields = React.createElement(\n 'div',\n { style: styles.fields, className: 'flexbox-fix' },\n React.createElement(\n 'div',\n { style: styles.field },\n React.createElement(EditableInput, {\n style: { input: styles.input, label: styles.label },\n label: 'hex', value: this.props.hex,\n onChange: this.handleChange\n })\n )\n );\n } else if (this.state.view === 'rgb') {\n fields = React.createElement(\n 'div',\n { style: styles.fields, className: 'flexbox-fix' },\n React.createElement(\n 'div',\n { style: styles.field },\n React.createElement(EditableInput, {\n style: { input: styles.input, label: styles.label },\n label: 'r',\n value: this.props.rgb.r,\n onChange: this.handleChange\n })\n ),\n React.createElement(\n 'div',\n { style: styles.field },\n React.createElement(EditableInput, {\n style: { input: styles.input, label: styles.label },\n label: 'g',\n value: this.props.rgb.g,\n onChange: this.handleChange\n })\n ),\n React.createElement(\n 'div',\n { style: styles.field },\n React.createElement(EditableInput, {\n style: { input: styles.input, label: styles.label },\n label: 'b',\n value: this.props.rgb.b,\n onChange: this.handleChange\n })\n ),\n React.createElement(\n 'div',\n { style: styles.alpha },\n React.createElement(EditableInput, {\n style: { input: styles.input, label: styles.label },\n label: 'a',\n value: this.props.rgb.a,\n arrowOffset: 0.01,\n onChange: this.handleChange\n })\n )\n );\n } else if (this.state.view === 'hsl') {\n fields = React.createElement(\n 'div',\n { style: styles.fields, className: 'flexbox-fix' },\n React.createElement(\n 'div',\n { style: styles.field },\n React.createElement(EditableInput, {\n style: { input: styles.input, label: styles.label },\n label: 'h',\n value: Math.round(this.props.hsl.h),\n onChange: this.handleChange\n })\n ),\n React.createElement(\n 'div',\n { style: styles.field },\n React.createElement(EditableInput, {\n style: { input: styles.input, label: styles.label },\n label: 's',\n value: Math.round(this.props.hsl.s * 100) + '%',\n onChange: this.handleChange\n })\n ),\n React.createElement(\n 'div',\n { style: styles.field },\n React.createElement(EditableInput, {\n style: { input: styles.input, label: styles.label },\n label: 'l',\n value: Math.round(this.props.hsl.l * 100) + '%',\n onChange: this.handleChange\n })\n ),\n React.createElement(\n 'div',\n { style: styles.alpha },\n React.createElement(EditableInput, {\n style: { input: styles.input, label: styles.label },\n label: 'a',\n value: this.props.hsl.a,\n arrowOffset: 0.01,\n onChange: this.handleChange\n })\n )\n );\n }\n\n return React.createElement(\n 'div',\n { style: styles.wrap, className: 'flexbox-fix' },\n fields,\n React.createElement(\n 'div',\n { style: styles.toggle },\n React.createElement(\n 'div',\n { style: styles.icon, onClick: this.toggleViews, ref: function ref(icon) {\n return _this2.icon = icon;\n } },\n React.createElement(UnfoldMoreHorizontalIcon, {\n style: styles.svg,\n onMouseOver: this.showHighlight,\n onMouseEnter: this.showHighlight,\n onMouseOut: this.hideHighlight\n })\n )\n )\n );\n }\n }], [{\n key: 'getDerivedStateFromProps',\n value: function getDerivedStateFromProps(nextProps, state) {\n if (nextProps.hsl.a !== 1 && state.view === 'hex') {\n return { view: 'rgb' };\n }\n return null;\n }\n }]);\n\n return ChromeFields;\n}(React.Component);\n\nChromeFields.defaultProps = {\n view: \"hex\"\n};\n\nexport default ChromeFields;","import React from 'react';\nimport reactCSS from 'reactcss';\n\nexport var ChromePointer = function ChromePointer() {\n var styles = reactCSS({\n 'default': {\n picker: {\n width: '12px',\n height: '12px',\n borderRadius: '6px',\n transform: 'translate(-6px, -1px)',\n backgroundColor: 'rgb(248, 248, 248)',\n boxShadow: '0 1px 4px 0 rgba(0, 0, 0, 0.37)'\n }\n }\n });\n\n return React.createElement('div', { style: styles.picker });\n};\n\nexport default ChromePointer;","import React from 'react';\nimport reactCSS from 'reactcss';\n\nexport var ChromePointerCircle = function ChromePointerCircle() {\n var styles = reactCSS({\n 'default': {\n picker: {\n width: '12px',\n height: '12px',\n borderRadius: '6px',\n boxShadow: 'inset 0 0 0 1px #fff',\n transform: 'translate(-6px, -6px)'\n }\n }\n });\n\n return React.createElement('div', { style: styles.picker });\n};\n\nexport default ChromePointerCircle;","import React from 'react';\nimport PropTypes from 'prop-types';\nimport reactCSS from 'reactcss';\nimport merge from 'lodash-es/merge';\n\nimport { ColorWrap, Saturation, Hue, Alpha, Checkboard } from '../common';\nimport ChromeFields from './ChromeFields';\nimport ChromePointer from './ChromePointer';\nimport ChromePointerCircle from './ChromePointerCircle';\n\nexport var Chrome = function Chrome(_ref) {\n var width = _ref.width,\n onChange = _ref.onChange,\n disableAlpha = _ref.disableAlpha,\n rgb = _ref.rgb,\n hsl = _ref.hsl,\n hsv = _ref.hsv,\n hex = _ref.hex,\n renderers = _ref.renderers,\n _ref$styles = _ref.styles,\n passedStyles = _ref$styles === undefined ? {} : _ref$styles,\n _ref$className = _ref.className,\n className = _ref$className === undefined ? '' : _ref$className,\n defaultView = _ref.defaultView;\n\n var styles = reactCSS(merge({\n 'default': {\n picker: {\n width: width,\n background: '#fff',\n borderRadius: '2px',\n boxShadow: '0 0 2px rgba(0,0,0,.3), 0 4px 8px rgba(0,0,0,.3)',\n boxSizing: 'initial',\n fontFamily: 'Menlo'\n },\n saturation: {\n width: '100%',\n paddingBottom: '55%',\n position: 'relative',\n borderRadius: '2px 2px 0 0',\n overflow: 'hidden'\n },\n Saturation: {\n radius: '2px 2px 0 0'\n },\n body: {\n padding: '16px 16px 12px'\n },\n controls: {\n display: 'flex'\n },\n color: {\n width: '32px'\n },\n swatch: {\n marginTop: '6px',\n width: '16px',\n height: '16px',\n borderRadius: '8px',\n position: 'relative',\n overflow: 'hidden'\n },\n active: {\n absolute: '0px 0px 0px 0px',\n borderRadius: '8px',\n boxShadow: 'inset 0 0 0 1px rgba(0,0,0,.1)',\n background: 'rgba(' + rgb.r + ', ' + rgb.g + ', ' + rgb.b + ', ' + rgb.a + ')',\n zIndex: '2'\n },\n toggles: {\n flex: '1'\n },\n hue: {\n height: '10px',\n position: 'relative',\n marginBottom: '8px'\n },\n Hue: {\n radius: '2px'\n },\n alpha: {\n height: '10px',\n position: 'relative'\n },\n Alpha: {\n radius: '2px'\n }\n },\n 'disableAlpha': {\n color: {\n width: '22px'\n },\n alpha: {\n display: 'none'\n },\n hue: {\n marginBottom: '0px'\n },\n swatch: {\n width: '10px',\n height: '10px',\n marginTop: '0px'\n }\n }\n }, passedStyles), { disableAlpha: disableAlpha });\n\n return React.createElement(\n 'div',\n { style: styles.picker, className: 'chrome-picker ' + className },\n React.createElement(\n 'div',\n { style: styles.saturation },\n React.createElement(Saturation, {\n style: styles.Saturation,\n hsl: hsl,\n hsv: hsv,\n pointer: ChromePointerCircle,\n onChange: onChange\n })\n ),\n React.createElement(\n 'div',\n { style: styles.body },\n React.createElement(\n 'div',\n { style: styles.controls, className: 'flexbox-fix' },\n React.createElement(\n 'div',\n { style: styles.color },\n React.createElement(\n 'div',\n { style: styles.swatch },\n React.createElement('div', { style: styles.active }),\n React.createElement(Checkboard, { renderers: renderers })\n )\n ),\n React.createElement(\n 'div',\n { style: styles.toggles },\n React.createElement(\n 'div',\n { style: styles.hue },\n React.createElement(Hue, {\n style: styles.Hue,\n hsl: hsl,\n pointer: ChromePointer,\n onChange: onChange\n })\n ),\n React.createElement(\n 'div',\n { style: styles.alpha },\n React.createElement(Alpha, {\n style: styles.Alpha,\n rgb: rgb,\n hsl: hsl,\n pointer: ChromePointer,\n renderers: renderers,\n onChange: onChange\n })\n )\n )\n ),\n React.createElement(ChromeFields, {\n rgb: rgb,\n hsl: hsl,\n hex: hex,\n view: defaultView,\n onChange: onChange,\n disableAlpha: disableAlpha\n })\n )\n );\n};\n\nChrome.propTypes = {\n width: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n disableAlpha: PropTypes.bool,\n styles: PropTypes.object,\n defaultView: PropTypes.oneOf([\"hex\", \"rgb\", \"hsl\"])\n};\n\nChrome.defaultProps = {\n width: 225,\n disableAlpha: false,\n styles: {}\n};\n\nexport default ColorWrap(Chrome);","import React from 'react';\nimport reactCSS from 'reactcss';\nimport * as colorUtils from '../../helpers/color';\n\nimport { Swatch } from '../common';\n\nexport var CompactColor = function CompactColor(_ref) {\n var color = _ref.color,\n _ref$onClick = _ref.onClick,\n onClick = _ref$onClick === undefined ? function () {} : _ref$onClick,\n onSwatchHover = _ref.onSwatchHover,\n active = _ref.active;\n\n var styles = reactCSS({\n 'default': {\n color: {\n background: color,\n width: '15px',\n height: '15px',\n float: 'left',\n marginRight: '5px',\n marginBottom: '5px',\n position: 'relative',\n cursor: 'pointer'\n },\n dot: {\n absolute: '5px 5px 5px 5px',\n background: colorUtils.getContrastingColor(color),\n borderRadius: '50%',\n opacity: '0'\n }\n },\n 'active': {\n dot: {\n opacity: '1'\n }\n },\n 'color-#FFFFFF': {\n color: {\n boxShadow: 'inset 0 0 0 1px #ddd'\n },\n dot: {\n background: '#000'\n }\n },\n 'transparent': {\n dot: {\n background: '#000'\n }\n }\n }, { active: active, 'color-#FFFFFF': color === '#FFFFFF', 'transparent': color === 'transparent' });\n\n return React.createElement(\n Swatch,\n {\n style: styles.color,\n color: color,\n onClick: onClick,\n onHover: onSwatchHover,\n focusStyle: { boxShadow: '0 0 4px ' + color }\n },\n React.createElement('div', { style: styles.dot })\n );\n};\n\nexport default CompactColor;","import React from 'react';\nimport reactCSS from 'reactcss';\n\nimport { EditableInput } from '../common';\n\nexport var CompactFields = function CompactFields(_ref) {\n var hex = _ref.hex,\n rgb = _ref.rgb,\n onChange = _ref.onChange;\n\n var styles = reactCSS({\n 'default': {\n fields: {\n display: 'flex',\n paddingBottom: '6px',\n paddingRight: '5px',\n position: 'relative'\n },\n active: {\n position: 'absolute',\n top: '6px',\n left: '5px',\n height: '9px',\n width: '9px',\n background: hex\n },\n HEXwrap: {\n flex: '6',\n position: 'relative'\n },\n HEXinput: {\n width: '80%',\n padding: '0px',\n paddingLeft: '20%',\n border: 'none',\n outline: 'none',\n background: 'none',\n fontSize: '12px',\n color: '#333',\n height: '16px'\n },\n HEXlabel: {\n display: 'none'\n },\n RGBwrap: {\n flex: '3',\n position: 'relative'\n },\n RGBinput: {\n width: '70%',\n padding: '0px',\n paddingLeft: '30%',\n border: 'none',\n outline: 'none',\n background: 'none',\n fontSize: '12px',\n color: '#333',\n height: '16px'\n },\n RGBlabel: {\n position: 'absolute',\n top: '3px',\n left: '0px',\n lineHeight: '16px',\n textTransform: 'uppercase',\n fontSize: '12px',\n color: '#999'\n }\n }\n });\n\n var handleChange = function handleChange(data, e) {\n if (data.r || data.g || data.b) {\n onChange({\n r: data.r || rgb.r,\n g: data.g || rgb.g,\n b: data.b || rgb.b,\n source: 'rgb'\n }, e);\n } else {\n onChange({\n hex: data.hex,\n source: 'hex'\n }, e);\n }\n };\n\n return React.createElement(\n 'div',\n { style: styles.fields, className: 'flexbox-fix' },\n React.createElement('div', { style: styles.active }),\n React.createElement(EditableInput, {\n style: { wrap: styles.HEXwrap, input: styles.HEXinput, label: styles.HEXlabel },\n label: 'hex',\n value: hex,\n onChange: handleChange\n }),\n React.createElement(EditableInput, {\n style: { wrap: styles.RGBwrap, input: styles.RGBinput, label: styles.RGBlabel },\n label: 'r',\n value: rgb.r,\n onChange: handleChange\n }),\n React.createElement(EditableInput, {\n style: { wrap: styles.RGBwrap, input: styles.RGBinput, label: styles.RGBlabel },\n label: 'g',\n value: rgb.g,\n onChange: handleChange\n }),\n React.createElement(EditableInput, {\n style: { wrap: styles.RGBwrap, input: styles.RGBinput, label: styles.RGBlabel },\n label: 'b',\n value: rgb.b,\n onChange: handleChange\n })\n );\n};\n\nexport default CompactFields;","import React from 'react';\nimport PropTypes from 'prop-types';\nimport reactCSS from 'reactcss';\nimport map from 'lodash-es/map';\nimport merge from 'lodash-es/merge';\nimport * as color from '../../helpers/color';\n\nimport { ColorWrap, Raised } from '../common';\nimport CompactColor from './CompactColor';\nimport CompactFields from './CompactFields';\n\nexport var Compact = function Compact(_ref) {\n var onChange = _ref.onChange,\n onSwatchHover = _ref.onSwatchHover,\n colors = _ref.colors,\n hex = _ref.hex,\n rgb = _ref.rgb,\n _ref$styles = _ref.styles,\n passedStyles = _ref$styles === undefined ? {} : _ref$styles,\n _ref$className = _ref.className,\n className = _ref$className === undefined ? '' : _ref$className;\n\n var styles = reactCSS(merge({\n 'default': {\n Compact: {\n background: '#f6f6f6',\n radius: '4px'\n },\n compact: {\n paddingTop: '5px',\n paddingLeft: '5px',\n boxSizing: 'initial',\n width: '240px'\n },\n clear: {\n clear: 'both'\n }\n }\n }, passedStyles));\n\n var handleChange = function handleChange(data, e) {\n if (data.hex) {\n color.isValidHex(data.hex) && onChange({\n hex: data.hex,\n source: 'hex'\n }, e);\n } else {\n onChange(data, e);\n }\n };\n\n return React.createElement(\n Raised,\n { style: styles.Compact, styles: passedStyles },\n React.createElement(\n 'div',\n { style: styles.compact, className: 'compact-picker ' + className },\n React.createElement(\n 'div',\n null,\n map(colors, function (c) {\n return React.createElement(CompactColor, {\n key: c,\n color: c,\n active: c.toLowerCase() === hex,\n onClick: handleChange,\n onSwatchHover: onSwatchHover\n });\n }),\n React.createElement('div', { style: styles.clear })\n ),\n React.createElement(CompactFields, { hex: hex, rgb: rgb, onChange: handleChange })\n )\n );\n};\n\nCompact.propTypes = {\n colors: PropTypes.arrayOf(PropTypes.string),\n styles: PropTypes.object\n};\n\nCompact.defaultProps = {\n colors: ['#4D4D4D', '#999999', '#FFFFFF', '#F44E3B', '#FE9200', '#FCDC00', '#DBDF00', '#A4DD00', '#68CCCA', '#73D8FF', '#AEA1FF', '#FDA1FF', '#333333', '#808080', '#cccccc', '#D33115', '#E27300', '#FCC400', '#B0BC00', '#68BC00', '#16A5A5', '#009CE0', '#7B64FF', '#FA28FF', '#000000', '#666666', '#B3B3B3', '#9F0500', '#C45100', '#FB9E00', '#808900', '#194D33', '#0C797D', '#0062B1', '#653294', '#AB149E'],\n styles: {}\n};\n\nexport default ColorWrap(Compact);","import React from 'react';\nimport reactCSS, { handleHover } from 'reactcss';\n\nimport { Swatch } from '../common';\n\nexport var GithubSwatch = function GithubSwatch(_ref) {\n var hover = _ref.hover,\n color = _ref.color,\n onClick = _ref.onClick,\n onSwatchHover = _ref.onSwatchHover;\n\n var hoverSwatch = {\n position: 'relative',\n zIndex: '2',\n outline: '2px solid #fff',\n boxShadow: '0 0 5px 2px rgba(0,0,0,0.25)'\n };\n\n var styles = reactCSS({\n 'default': {\n swatch: {\n width: '25px',\n height: '25px',\n fontSize: '0'\n }\n },\n 'hover': {\n swatch: hoverSwatch\n }\n }, { hover: hover });\n\n return React.createElement(\n 'div',\n { style: styles.swatch },\n React.createElement(Swatch, {\n color: color,\n onClick: onClick,\n onHover: onSwatchHover,\n focusStyle: hoverSwatch\n })\n );\n};\n\nexport default handleHover(GithubSwatch);","import React from 'react';\nimport PropTypes from 'prop-types';\nimport reactCSS from 'reactcss';\nimport map from 'lodash-es/map';\nimport merge from 'lodash-es/merge';\n\nimport { ColorWrap } from '../common';\nimport GithubSwatch from './GithubSwatch';\n\nexport var Github = function Github(_ref) {\n var width = _ref.width,\n colors = _ref.colors,\n onChange = _ref.onChange,\n onSwatchHover = _ref.onSwatchHover,\n triangle = _ref.triangle,\n _ref$styles = _ref.styles,\n passedStyles = _ref$styles === undefined ? {} : _ref$styles,\n _ref$className = _ref.className,\n className = _ref$className === undefined ? '' : _ref$className;\n\n var styles = reactCSS(merge({\n 'default': {\n card: {\n width: width,\n background: '#fff',\n border: '1px solid rgba(0,0,0,0.2)',\n boxShadow: '0 3px 12px rgba(0,0,0,0.15)',\n borderRadius: '4px',\n position: 'relative',\n padding: '5px',\n display: 'flex',\n flexWrap: 'wrap'\n },\n triangle: {\n position: 'absolute',\n border: '7px solid transparent',\n borderBottomColor: '#fff'\n },\n triangleShadow: {\n position: 'absolute',\n border: '8px solid transparent',\n borderBottomColor: 'rgba(0,0,0,0.15)'\n }\n },\n 'hide-triangle': {\n triangle: {\n display: 'none'\n },\n triangleShadow: {\n display: 'none'\n }\n },\n 'top-left-triangle': {\n triangle: {\n top: '-14px',\n left: '10px'\n },\n triangleShadow: {\n top: '-16px',\n left: '9px'\n }\n },\n 'top-right-triangle': {\n triangle: {\n top: '-14px',\n right: '10px'\n },\n triangleShadow: {\n top: '-16px',\n right: '9px'\n }\n },\n 'bottom-left-triangle': {\n triangle: {\n top: '35px',\n left: '10px',\n transform: 'rotate(180deg)'\n },\n triangleShadow: {\n top: '37px',\n left: '9px',\n transform: 'rotate(180deg)'\n }\n },\n 'bottom-right-triangle': {\n triangle: {\n top: '35px',\n right: '10px',\n transform: 'rotate(180deg)'\n },\n triangleShadow: {\n top: '37px',\n right: '9px',\n transform: 'rotate(180deg)'\n }\n }\n }, passedStyles), {\n 'hide-triangle': triangle === 'hide',\n 'top-left-triangle': triangle === 'top-left',\n 'top-right-triangle': triangle === 'top-right',\n 'bottom-left-triangle': triangle === 'bottom-left',\n 'bottom-right-triangle': triangle === 'bottom-right'\n });\n\n var handleChange = function handleChange(hex, e) {\n return onChange({ hex: hex, source: 'hex' }, e);\n };\n\n return React.createElement(\n 'div',\n { style: styles.card, className: 'github-picker ' + className },\n React.createElement('div', { style: styles.triangleShadow }),\n React.createElement('div', { style: styles.triangle }),\n map(colors, function (c) {\n return React.createElement(GithubSwatch, {\n color: c,\n key: c,\n onClick: handleChange,\n onSwatchHover: onSwatchHover\n });\n })\n );\n};\n\nGithub.propTypes = {\n width: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n colors: PropTypes.arrayOf(PropTypes.string),\n triangle: PropTypes.oneOf(['hide', 'top-left', 'top-right', 'bottom-left', 'bottom-right']),\n styles: PropTypes.object\n};\n\nGithub.defaultProps = {\n width: 200,\n colors: ['#B80000', '#DB3E00', '#FCCB00', '#008B02', '#006B76', '#1273DE', '#004DCF', '#5300EB', '#EB9694', '#FAD0C3', '#FEF3BD', '#C1E1C5', '#BEDADC', '#C4DEF6', '#BED3F3', '#D4C4FB'],\n triangle: 'top-left',\n styles: {}\n};\n\nexport default ColorWrap(Github);","import React from 'react';\nimport reactCSS from 'reactcss';\n\nexport var SliderPointer = function SliderPointer(_ref) {\n var direction = _ref.direction;\n\n var styles = reactCSS({\n 'default': {\n picker: {\n width: '18px',\n height: '18px',\n borderRadius: '50%',\n transform: 'translate(-9px, -1px)',\n backgroundColor: 'rgb(248, 248, 248)',\n boxShadow: '0 1px 4px 0 rgba(0, 0, 0, 0.37)'\n }\n },\n 'vertical': {\n picker: {\n transform: 'translate(-3px, -9px)'\n }\n }\n }, { vertical: direction === 'vertical' });\n\n return React.createElement('div', { style: styles.picker });\n};\n\nexport default SliderPointer;","var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport reactCSS from 'reactcss';\nimport merge from 'lodash-es/merge';\n\nimport { ColorWrap, Hue } from '../common';\nimport HuePointer from './HuePointer';\n\nexport var HuePicker = function HuePicker(_ref) {\n var width = _ref.width,\n height = _ref.height,\n onChange = _ref.onChange,\n hsl = _ref.hsl,\n direction = _ref.direction,\n pointer = _ref.pointer,\n _ref$styles = _ref.styles,\n passedStyles = _ref$styles === undefined ? {} : _ref$styles,\n _ref$className = _ref.className,\n className = _ref$className === undefined ? '' : _ref$className;\n\n var styles = reactCSS(merge({\n 'default': {\n picker: {\n position: 'relative',\n width: width,\n height: height\n },\n hue: {\n radius: '2px'\n }\n }\n }, passedStyles));\n\n // Overwrite to provide pure hue color\n var handleChange = function handleChange(data) {\n return onChange({ a: 1, h: data.h, l: 0.5, s: 1 });\n };\n\n return React.createElement(\n 'div',\n { style: styles.picker, className: 'hue-picker ' + className },\n React.createElement(Hue, _extends({}, styles.hue, {\n hsl: hsl,\n pointer: pointer,\n onChange: handleChange,\n direction: direction\n }))\n );\n};\n\nHuePicker.propTypes = {\n styles: PropTypes.object\n};\nHuePicker.defaultProps = {\n width: '316px',\n height: '16px',\n direction: 'horizontal',\n pointer: HuePointer,\n styles: {}\n};\n\nexport default ColorWrap(HuePicker);","import React from 'react';\nimport reactCSS from 'reactcss';\nimport merge from 'lodash-es/merge';\nimport * as color from '../../helpers/color';\n\nimport { ColorWrap, EditableInput, Raised } from '../common';\n\nexport var Material = function Material(_ref) {\n var onChange = _ref.onChange,\n hex = _ref.hex,\n rgb = _ref.rgb,\n _ref$styles = _ref.styles,\n passedStyles = _ref$styles === undefined ? {} : _ref$styles,\n _ref$className = _ref.className,\n className = _ref$className === undefined ? '' : _ref$className;\n\n var styles = reactCSS(merge({\n 'default': {\n material: {\n width: '98px',\n height: '98px',\n padding: '16px',\n fontFamily: 'Roboto'\n },\n HEXwrap: {\n position: 'relative'\n },\n HEXinput: {\n width: '100%',\n marginTop: '12px',\n fontSize: '15px',\n color: '#333',\n padding: '0px',\n border: '0px',\n borderBottom: '2px solid ' + hex,\n outline: 'none',\n height: '30px'\n },\n HEXlabel: {\n position: 'absolute',\n top: '0px',\n left: '0px',\n fontSize: '11px',\n color: '#999999',\n textTransform: 'capitalize'\n },\n Hex: {\n style: {}\n },\n RGBwrap: {\n position: 'relative'\n },\n RGBinput: {\n width: '100%',\n marginTop: '12px',\n fontSize: '15px',\n color: '#333',\n padding: '0px',\n border: '0px',\n borderBottom: '1px solid #eee',\n outline: 'none',\n height: '30px'\n },\n RGBlabel: {\n position: 'absolute',\n top: '0px',\n left: '0px',\n fontSize: '11px',\n color: '#999999',\n textTransform: 'capitalize'\n },\n split: {\n display: 'flex',\n marginRight: '-10px',\n paddingTop: '11px'\n },\n third: {\n flex: '1',\n paddingRight: '10px'\n }\n }\n }, passedStyles));\n\n var handleChange = function handleChange(data, e) {\n if (data.hex) {\n color.isValidHex(data.hex) && onChange({\n hex: data.hex,\n source: 'hex'\n }, e);\n } else if (data.r || data.g || data.b) {\n onChange({\n r: data.r || rgb.r,\n g: data.g || rgb.g,\n b: data.b || rgb.b,\n source: 'rgb'\n }, e);\n }\n };\n\n return React.createElement(\n Raised,\n { styles: passedStyles },\n React.createElement(\n 'div',\n { style: styles.material, className: 'material-picker ' + className },\n React.createElement(EditableInput, {\n style: { wrap: styles.HEXwrap, input: styles.HEXinput, label: styles.HEXlabel },\n label: 'hex',\n value: hex,\n onChange: handleChange\n }),\n React.createElement(\n 'div',\n { style: styles.split, className: 'flexbox-fix' },\n React.createElement(\n 'div',\n { style: styles.third },\n React.createElement(EditableInput, {\n style: { wrap: styles.RGBwrap, input: styles.RGBinput, label: styles.RGBlabel },\n label: 'r', value: rgb.r,\n onChange: handleChange\n })\n ),\n React.createElement(\n 'div',\n { style: styles.third },\n React.createElement(EditableInput, {\n style: { wrap: styles.RGBwrap, input: styles.RGBinput, label: styles.RGBlabel },\n label: 'g',\n value: rgb.g,\n onChange: handleChange\n })\n ),\n React.createElement(\n 'div',\n { style: styles.third },\n React.createElement(EditableInput, {\n style: { wrap: styles.RGBwrap, input: styles.RGBinput, label: styles.RGBlabel },\n label: 'b',\n value: rgb.b,\n onChange: handleChange\n })\n )\n )\n )\n );\n};\n\nexport default ColorWrap(Material);","import React from 'react';\nimport reactCSS from 'reactcss';\nimport * as color from '../../helpers/color';\n\nimport { EditableInput } from '../common';\n\nexport var PhotoshopPicker = function PhotoshopPicker(_ref) {\n var onChange = _ref.onChange,\n rgb = _ref.rgb,\n hsv = _ref.hsv,\n hex = _ref.hex;\n\n var styles = reactCSS({\n 'default': {\n fields: {\n paddingTop: '5px',\n paddingBottom: '9px',\n width: '80px',\n position: 'relative'\n },\n divider: {\n height: '5px'\n },\n RGBwrap: {\n position: 'relative'\n },\n RGBinput: {\n marginLeft: '40%',\n width: '40%',\n height: '18px',\n border: '1px solid #888888',\n boxShadow: 'inset 0 1px 1px rgba(0,0,0,.1), 0 1px 0 0 #ECECEC',\n marginBottom: '5px',\n fontSize: '13px',\n paddingLeft: '3px',\n marginRight: '10px'\n },\n RGBlabel: {\n left: '0px',\n top: '0px',\n width: '34px',\n textTransform: 'uppercase',\n fontSize: '13px',\n height: '18px',\n lineHeight: '22px',\n position: 'absolute'\n },\n HEXwrap: {\n position: 'relative'\n },\n HEXinput: {\n marginLeft: '20%',\n width: '80%',\n height: '18px',\n border: '1px solid #888888',\n boxShadow: 'inset 0 1px 1px rgba(0,0,0,.1), 0 1px 0 0 #ECECEC',\n marginBottom: '6px',\n fontSize: '13px',\n paddingLeft: '3px'\n },\n HEXlabel: {\n position: 'absolute',\n top: '0px',\n left: '0px',\n width: '14px',\n textTransform: 'uppercase',\n fontSize: '13px',\n height: '18px',\n lineHeight: '22px'\n },\n fieldSymbols: {\n position: 'absolute',\n top: '5px',\n right: '-7px',\n fontSize: '13px'\n },\n symbol: {\n height: '20px',\n lineHeight: '22px',\n paddingBottom: '7px'\n }\n }\n });\n\n var handleChange = function handleChange(data, e) {\n if (data['#']) {\n color.isValidHex(data['#']) && onChange({\n hex: data['#'],\n source: 'hex'\n }, e);\n } else if (data.r || data.g || data.b) {\n onChange({\n r: data.r || rgb.r,\n g: data.g || rgb.g,\n b: data.b || rgb.b,\n source: 'rgb'\n }, e);\n } else if (data.h || data.s || data.v) {\n onChange({\n h: data.h || hsv.h,\n s: data.s || hsv.s,\n v: data.v || hsv.v,\n source: 'hsv'\n }, e);\n }\n };\n\n return React.createElement(\n 'div',\n { style: styles.fields },\n React.createElement(EditableInput, {\n style: { wrap: styles.RGBwrap, input: styles.RGBinput, label: styles.RGBlabel },\n label: 'h',\n value: Math.round(hsv.h),\n onChange: handleChange\n }),\n React.createElement(EditableInput, {\n style: { wrap: styles.RGBwrap, input: styles.RGBinput, label: styles.RGBlabel },\n label: 's',\n value: Math.round(hsv.s * 100),\n onChange: handleChange\n }),\n React.createElement(EditableInput, {\n style: { wrap: styles.RGBwrap, input: styles.RGBinput, label: styles.RGBlabel },\n label: 'v',\n value: Math.round(hsv.v * 100),\n onChange: handleChange\n }),\n React.createElement('div', { style: styles.divider }),\n React.createElement(EditableInput, {\n style: { wrap: styles.RGBwrap, input: styles.RGBinput, label: styles.RGBlabel },\n label: 'r',\n value: rgb.r,\n onChange: handleChange\n }),\n React.createElement(EditableInput, {\n style: { wrap: styles.RGBwrap, input: styles.RGBinput, label: styles.RGBlabel },\n label: 'g',\n value: rgb.g,\n onChange: handleChange\n }),\n React.createElement(EditableInput, {\n style: { wrap: styles.RGBwrap, input: styles.RGBinput, label: styles.RGBlabel },\n label: 'b',\n value: rgb.b,\n onChange: handleChange\n }),\n React.createElement('div', { style: styles.divider }),\n React.createElement(EditableInput, {\n style: { wrap: styles.HEXwrap, input: styles.HEXinput, label: styles.HEXlabel },\n label: '#',\n value: hex.replace('#', ''),\n onChange: handleChange\n }),\n React.createElement(\n 'div',\n { style: styles.fieldSymbols },\n React.createElement(\n 'div',\n { style: styles.symbol },\n '\\xB0'\n ),\n React.createElement(\n 'div',\n { style: styles.symbol },\n '%'\n ),\n React.createElement(\n 'div',\n { style: styles.symbol },\n '%'\n )\n )\n );\n};\n\nexport default PhotoshopPicker;","import React from 'react';\nimport reactCSS from 'reactcss';\n\nexport var PhotoshopPointerCircle = function PhotoshopPointerCircle(_ref) {\n var hsl = _ref.hsl;\n\n var styles = reactCSS({\n 'default': {\n picker: {\n width: '12px',\n height: '12px',\n borderRadius: '6px',\n boxShadow: 'inset 0 0 0 1px #fff',\n transform: 'translate(-6px, -6px)'\n }\n },\n 'black-outline': {\n picker: {\n boxShadow: 'inset 0 0 0 1px #000'\n }\n }\n }, { 'black-outline': hsl.l > 0.5 });\n\n return React.createElement('div', { style: styles.picker });\n};\n\nexport default PhotoshopPointerCircle;","import React from 'react';\nimport reactCSS from 'reactcss';\n\nexport var PhotoshopPointerCircle = function PhotoshopPointerCircle() {\n var styles = reactCSS({\n 'default': {\n triangle: {\n width: 0,\n height: 0,\n borderStyle: 'solid',\n borderWidth: '4px 0 4px 6px',\n borderColor: 'transparent transparent transparent #fff',\n position: 'absolute',\n top: '1px',\n left: '1px'\n },\n triangleBorder: {\n width: 0,\n height: 0,\n borderStyle: 'solid',\n borderWidth: '5px 0 5px 8px',\n borderColor: 'transparent transparent transparent #555'\n },\n\n left: {\n Extend: 'triangleBorder',\n transform: 'translate(-13px, -4px)'\n },\n leftInside: {\n Extend: 'triangle',\n transform: 'translate(-8px, -5px)'\n },\n\n right: {\n Extend: 'triangleBorder',\n transform: 'translate(20px, -14px) rotate(180deg)'\n },\n rightInside: {\n Extend: 'triangle',\n transform: 'translate(-8px, -5px)'\n }\n }\n });\n\n return React.createElement(\n 'div',\n { style: styles.pointer },\n React.createElement(\n 'div',\n { style: styles.left },\n React.createElement('div', { style: styles.leftInside })\n ),\n React.createElement(\n 'div',\n { style: styles.right },\n React.createElement('div', { style: styles.rightInside })\n )\n );\n};\n\nexport default PhotoshopPointerCircle;","import React from 'react';\nimport reactCSS from 'reactcss';\n\nexport var PhotoshopButton = function PhotoshopButton(_ref) {\n var onClick = _ref.onClick,\n label = _ref.label,\n children = _ref.children,\n active = _ref.active;\n\n var styles = reactCSS({\n 'default': {\n button: {\n backgroundImage: 'linear-gradient(-180deg, #FFFFFF 0%, #E6E6E6 100%)',\n border: '1px solid #878787',\n borderRadius: '2px',\n height: '20px',\n boxShadow: '0 1px 0 0 #EAEAEA',\n fontSize: '14px',\n color: '#000',\n lineHeight: '20px',\n textAlign: 'center',\n marginBottom: '10px',\n cursor: 'pointer'\n }\n },\n 'active': {\n button: {\n boxShadow: '0 0 0 1px #878787'\n }\n }\n }, { active: active });\n\n return React.createElement(\n 'div',\n { style: styles.button, onClick: onClick },\n label || children\n );\n};\n\nexport default PhotoshopButton;","import React from 'react';\nimport reactCSS from 'reactcss';\n\nexport var PhotoshopPreviews = function PhotoshopPreviews(_ref) {\n var rgb = _ref.rgb,\n currentColor = _ref.currentColor;\n\n var styles = reactCSS({\n 'default': {\n swatches: {\n border: '1px solid #B3B3B3',\n borderBottom: '1px solid #F0F0F0',\n marginBottom: '2px',\n marginTop: '1px'\n },\n new: {\n height: '34px',\n background: 'rgb(' + rgb.r + ',' + rgb.g + ', ' + rgb.b + ')',\n boxShadow: 'inset 1px 0 0 #000, inset -1px 0 0 #000, inset 0 1px 0 #000'\n },\n current: {\n height: '34px',\n background: currentColor,\n boxShadow: 'inset 1px 0 0 #000, inset -1px 0 0 #000, inset 0 -1px 0 #000'\n },\n label: {\n fontSize: '14px',\n color: '#000',\n textAlign: 'center'\n }\n }\n });\n\n return React.createElement(\n 'div',\n null,\n React.createElement(\n 'div',\n { style: styles.label },\n 'new'\n ),\n React.createElement(\n 'div',\n { style: styles.swatches },\n React.createElement('div', { style: styles.new }),\n React.createElement('div', { style: styles.current })\n ),\n React.createElement(\n 'div',\n { style: styles.label },\n 'current'\n )\n );\n};\n\nexport default PhotoshopPreviews;","var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport reactCSS from 'reactcss';\nimport merge from 'lodash-es/merge';\n\nimport { ColorWrap, Saturation, Hue } from '../common';\nimport PhotoshopFields from './PhotoshopFields';\nimport PhotoshopPointerCircle from './PhotoshopPointerCircle';\nimport PhotoshopPointer from './PhotoshopPointer';\nimport PhotoshopButton from './PhotoshopButton';\nimport PhotoshopPreviews from './PhotoshopPreviews';\n\nexport var Photoshop = function (_React$Component) {\n _inherits(Photoshop, _React$Component);\n\n function Photoshop(props) {\n _classCallCheck(this, Photoshop);\n\n var _this = _possibleConstructorReturn(this, (Photoshop.__proto__ || Object.getPrototypeOf(Photoshop)).call(this));\n\n _this.state = {\n currentColor: props.hex\n };\n return _this;\n }\n\n _createClass(Photoshop, [{\n key: 'render',\n value: function render() {\n var _props = this.props,\n _props$styles = _props.styles,\n passedStyles = _props$styles === undefined ? {} : _props$styles,\n _props$className = _props.className,\n className = _props$className === undefined ? '' : _props$className;\n\n var styles = reactCSS(merge({\n 'default': {\n picker: {\n background: '#DCDCDC',\n borderRadius: '4px',\n boxShadow: '0 0 0 1px rgba(0,0,0,.25), 0 8px 16px rgba(0,0,0,.15)',\n boxSizing: 'initial',\n width: '513px'\n },\n head: {\n backgroundImage: 'linear-gradient(-180deg, #F0F0F0 0%, #D4D4D4 100%)',\n borderBottom: '1px solid #B1B1B1',\n boxShadow: 'inset 0 1px 0 0 rgba(255,255,255,.2), inset 0 -1px 0 0 rgba(0,0,0,.02)',\n height: '23px',\n lineHeight: '24px',\n borderRadius: '4px 4px 0 0',\n fontSize: '13px',\n color: '#4D4D4D',\n textAlign: 'center'\n },\n body: {\n padding: '15px 15px 0',\n display: 'flex'\n },\n saturation: {\n width: '256px',\n height: '256px',\n position: 'relative',\n border: '2px solid #B3B3B3',\n borderBottom: '2px solid #F0F0F0',\n overflow: 'hidden'\n },\n hue: {\n position: 'relative',\n height: '256px',\n width: '19px',\n marginLeft: '10px',\n border: '2px solid #B3B3B3',\n borderBottom: '2px solid #F0F0F0'\n },\n controls: {\n width: '180px',\n marginLeft: '10px'\n },\n top: {\n display: 'flex'\n },\n previews: {\n width: '60px'\n },\n actions: {\n flex: '1',\n marginLeft: '20px'\n }\n }\n }, passedStyles));\n\n return React.createElement(\n 'div',\n { style: styles.picker, className: 'photoshop-picker ' + className },\n React.createElement(\n 'div',\n { style: styles.head },\n this.props.header\n ),\n React.createElement(\n 'div',\n { style: styles.body, className: 'flexbox-fix' },\n React.createElement(\n 'div',\n { style: styles.saturation },\n React.createElement(Saturation, {\n hsl: this.props.hsl,\n hsv: this.props.hsv,\n pointer: PhotoshopPointerCircle,\n onChange: this.props.onChange\n })\n ),\n React.createElement(\n 'div',\n { style: styles.hue },\n React.createElement(Hue, {\n direction: 'vertical',\n hsl: this.props.hsl,\n pointer: PhotoshopPointer,\n onChange: this.props.onChange\n })\n ),\n React.createElement(\n 'div',\n { style: styles.controls },\n React.createElement(\n 'div',\n { style: styles.top, className: 'flexbox-fix' },\n React.createElement(\n 'div',\n { style: styles.previews },\n React.createElement(PhotoshopPreviews, {\n rgb: this.props.rgb,\n currentColor: this.state.currentColor\n })\n ),\n React.createElement(\n 'div',\n { style: styles.actions },\n React.createElement(PhotoshopButton, { label: 'OK', onClick: this.props.onAccept, active: true }),\n React.createElement(PhotoshopButton, { label: 'Cancel', onClick: this.props.onCancel }),\n React.createElement(PhotoshopFields, {\n onChange: this.props.onChange,\n rgb: this.props.rgb,\n hsv: this.props.hsv,\n hex: this.props.hex\n })\n )\n )\n )\n )\n );\n }\n }]);\n\n return Photoshop;\n}(React.Component);\n\nPhotoshop.propTypes = {\n header: PropTypes.string,\n styles: PropTypes.object\n};\n\nPhotoshop.defaultProps = {\n header: 'Color Picker',\n styles: {}\n};\n\nexport default ColorWrap(Photoshop);","/* eslint-disable no-param-reassign */\n\nimport React from 'react';\nimport reactCSS from 'reactcss';\nimport * as color from '../../helpers/color';\n\nimport { EditableInput } from '../common';\n\nexport var SketchFields = function SketchFields(_ref) {\n var onChange = _ref.onChange,\n rgb = _ref.rgb,\n hsl = _ref.hsl,\n hex = _ref.hex,\n disableAlpha = _ref.disableAlpha;\n\n var styles = reactCSS({\n 'default': {\n fields: {\n display: 'flex',\n paddingTop: '4px'\n },\n single: {\n flex: '1',\n paddingLeft: '6px'\n },\n alpha: {\n flex: '1',\n paddingLeft: '6px'\n },\n double: {\n flex: '2'\n },\n input: {\n width: '80%',\n padding: '4px 10% 3px',\n border: 'none',\n boxShadow: 'inset 0 0 0 1px #ccc',\n fontSize: '11px'\n },\n label: {\n display: 'block',\n textAlign: 'center',\n fontSize: '11px',\n color: '#222',\n paddingTop: '3px',\n paddingBottom: '4px',\n textTransform: 'capitalize'\n }\n },\n 'disableAlpha': {\n alpha: {\n display: 'none'\n }\n }\n }, { disableAlpha: disableAlpha });\n\n var handleChange = function handleChange(data, e) {\n if (data.hex) {\n color.isValidHex(data.hex) && onChange({\n hex: data.hex,\n source: 'hex'\n }, e);\n } else if (data.r || data.g || data.b) {\n onChange({\n r: data.r || rgb.r,\n g: data.g || rgb.g,\n b: data.b || rgb.b,\n a: rgb.a,\n source: 'rgb'\n }, e);\n } else if (data.a) {\n if (data.a < 0) {\n data.a = 0;\n } else if (data.a > 100) {\n data.a = 100;\n }\n\n data.a /= 100;\n onChange({\n h: hsl.h,\n s: hsl.s,\n l: hsl.l,\n a: data.a,\n source: 'rgb'\n }, e);\n }\n };\n\n return React.createElement(\n 'div',\n { style: styles.fields, className: 'flexbox-fix' },\n React.createElement(\n 'div',\n { style: styles.double },\n React.createElement(EditableInput, {\n style: { input: styles.input, label: styles.label },\n label: 'hex',\n value: hex.replace('#', ''),\n onChange: handleChange\n })\n ),\n React.createElement(\n 'div',\n { style: styles.single },\n React.createElement(EditableInput, {\n style: { input: styles.input, label: styles.label },\n label: 'r',\n value: rgb.r,\n onChange: handleChange,\n dragLabel: 'true',\n dragMax: '255'\n })\n ),\n React.createElement(\n 'div',\n { style: styles.single },\n React.createElement(EditableInput, {\n style: { input: styles.input, label: styles.label },\n label: 'g',\n value: rgb.g,\n onChange: handleChange,\n dragLabel: 'true',\n dragMax: '255'\n })\n ),\n React.createElement(\n 'div',\n { style: styles.single },\n React.createElement(EditableInput, {\n style: { input: styles.input, label: styles.label },\n label: 'b',\n value: rgb.b,\n onChange: handleChange,\n dragLabel: 'true',\n dragMax: '255'\n })\n ),\n React.createElement(\n 'div',\n { style: styles.alpha },\n React.createElement(EditableInput, {\n style: { input: styles.input, label: styles.label },\n label: 'a',\n value: Math.round(rgb.a * 100),\n onChange: handleChange,\n dragLabel: 'true',\n dragMax: '100'\n })\n )\n );\n};\n\nexport default SketchFields;","var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport reactCSS from 'reactcss';\n\nimport { Swatch } from '../common';\n\nexport var SketchPresetColors = function SketchPresetColors(_ref) {\n var colors = _ref.colors,\n _ref$onClick = _ref.onClick,\n onClick = _ref$onClick === undefined ? function () {} : _ref$onClick,\n onSwatchHover = _ref.onSwatchHover;\n\n var styles = reactCSS({\n 'default': {\n colors: {\n margin: '0 -10px',\n padding: '10px 0 0 10px',\n borderTop: '1px solid #eee',\n display: 'flex',\n flexWrap: 'wrap',\n position: 'relative'\n },\n swatchWrap: {\n width: '16px',\n height: '16px',\n margin: '0 10px 10px 0'\n },\n swatch: {\n borderRadius: '3px',\n boxShadow: 'inset 0 0 0 1px rgba(0,0,0,.15)'\n }\n },\n 'no-presets': {\n colors: {\n display: 'none'\n }\n }\n }, {\n 'no-presets': !colors || !colors.length\n });\n\n var handleClick = function handleClick(hex, e) {\n onClick({\n hex: hex,\n source: 'hex'\n }, e);\n };\n\n return React.createElement(\n 'div',\n { style: styles.colors, className: 'flexbox-fix' },\n colors.map(function (colorObjOrString) {\n var c = typeof colorObjOrString === 'string' ? { color: colorObjOrString } : colorObjOrString;\n var key = '' + c.color + (c.title || '');\n return React.createElement(\n 'div',\n { key: key, style: styles.swatchWrap },\n React.createElement(Swatch, _extends({}, c, {\n style: styles.swatch,\n onClick: handleClick,\n onHover: onSwatchHover,\n focusStyle: {\n boxShadow: 'inset 0 0 0 1px rgba(0,0,0,.15), 0 0 4px ' + c.color\n }\n }))\n );\n })\n );\n};\n\nSketchPresetColors.propTypes = {\n colors: PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.string, PropTypes.shape({\n color: PropTypes.string,\n title: PropTypes.string\n })])).isRequired\n};\n\nexport default SketchPresetColors;","var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport reactCSS from 'reactcss';\nimport merge from 'lodash-es/merge';\n\nimport { ColorWrap, Saturation, Hue, Alpha, Checkboard } from '../common';\nimport SketchFields from './SketchFields';\nimport SketchPresetColors from './SketchPresetColors';\n\nexport var Sketch = function Sketch(_ref) {\n var width = _ref.width,\n rgb = _ref.rgb,\n hex = _ref.hex,\n hsv = _ref.hsv,\n hsl = _ref.hsl,\n onChange = _ref.onChange,\n onSwatchHover = _ref.onSwatchHover,\n disableAlpha = _ref.disableAlpha,\n presetColors = _ref.presetColors,\n renderers = _ref.renderers,\n _ref$styles = _ref.styles,\n passedStyles = _ref$styles === undefined ? {} : _ref$styles,\n _ref$className = _ref.className,\n className = _ref$className === undefined ? '' : _ref$className;\n\n var styles = reactCSS(merge({\n 'default': _extends({\n picker: {\n width: width,\n padding: '10px 10px 0',\n boxSizing: 'initial',\n background: '#fff',\n borderRadius: '4px',\n boxShadow: '0 0 0 1px rgba(0,0,0,.15), 0 8px 16px rgba(0,0,0,.15)'\n },\n saturation: {\n width: '100%',\n paddingBottom: '75%',\n position: 'relative',\n overflow: 'hidden'\n },\n Saturation: {\n radius: '3px',\n shadow: 'inset 0 0 0 1px rgba(0,0,0,.15), inset 0 0 4px rgba(0,0,0,.25)'\n },\n controls: {\n display: 'flex'\n },\n sliders: {\n padding: '4px 0',\n flex: '1'\n },\n color: {\n width: '24px',\n height: '24px',\n position: 'relative',\n marginTop: '4px',\n marginLeft: '4px',\n borderRadius: '3px'\n },\n activeColor: {\n absolute: '0px 0px 0px 0px',\n borderRadius: '2px',\n background: 'rgba(' + rgb.r + ',' + rgb.g + ',' + rgb.b + ',' + rgb.a + ')',\n boxShadow: 'inset 0 0 0 1px rgba(0,0,0,.15), inset 0 0 4px rgba(0,0,0,.25)'\n },\n hue: {\n position: 'relative',\n height: '10px',\n overflow: 'hidden'\n },\n Hue: {\n radius: '2px',\n shadow: 'inset 0 0 0 1px rgba(0,0,0,.15), inset 0 0 4px rgba(0,0,0,.25)'\n },\n\n alpha: {\n position: 'relative',\n height: '10px',\n marginTop: '4px',\n overflow: 'hidden'\n },\n Alpha: {\n radius: '2px',\n shadow: 'inset 0 0 0 1px rgba(0,0,0,.15), inset 0 0 4px rgba(0,0,0,.25)'\n }\n }, passedStyles),\n 'disableAlpha': {\n color: {\n height: '10px'\n },\n hue: {\n height: '10px'\n },\n alpha: {\n display: 'none'\n }\n }\n }, passedStyles), { disableAlpha: disableAlpha });\n\n return React.createElement(\n 'div',\n { style: styles.picker, className: 'sketch-picker ' + className },\n React.createElement(\n 'div',\n { style: styles.saturation },\n React.createElement(Saturation, {\n style: styles.Saturation,\n hsl: hsl,\n hsv: hsv,\n onChange: onChange\n })\n ),\n React.createElement(\n 'div',\n { style: styles.controls, className: 'flexbox-fix' },\n React.createElement(\n 'div',\n { style: styles.sliders },\n React.createElement(\n 'div',\n { style: styles.hue },\n React.createElement(Hue, {\n style: styles.Hue,\n hsl: hsl,\n onChange: onChange\n })\n ),\n React.createElement(\n 'div',\n { style: styles.alpha },\n React.createElement(Alpha, {\n style: styles.Alpha,\n rgb: rgb,\n hsl: hsl,\n renderers: renderers,\n onChange: onChange\n })\n )\n ),\n React.createElement(\n 'div',\n { style: styles.color },\n React.createElement(Checkboard, null),\n React.createElement('div', { style: styles.activeColor })\n )\n ),\n React.createElement(SketchFields, {\n rgb: rgb,\n hsl: hsl,\n hex: hex,\n onChange: onChange,\n disableAlpha: disableAlpha\n }),\n React.createElement(SketchPresetColors, {\n colors: presetColors,\n onClick: onChange,\n onSwatchHover: onSwatchHover\n })\n );\n};\n\nSketch.propTypes = {\n disableAlpha: PropTypes.bool,\n width: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n styles: PropTypes.object\n};\n\nSketch.defaultProps = {\n disableAlpha: false,\n width: 200,\n styles: {},\n presetColors: ['#D0021B', '#F5A623', '#F8E71C', '#8B572A', '#7ED321', '#417505', '#BD10E0', '#9013FE', '#4A90E2', '#50E3C2', '#B8E986', '#000000', '#4A4A4A', '#9B9B9B', '#FFFFFF']\n};\n\nexport default ColorWrap(Sketch);","import React from 'react';\nimport reactCSS from 'reactcss';\n\nexport var SliderSwatch = function SliderSwatch(_ref) {\n var hsl = _ref.hsl,\n offset = _ref.offset,\n _ref$onClick = _ref.onClick,\n onClick = _ref$onClick === undefined ? function () {} : _ref$onClick,\n active = _ref.active,\n first = _ref.first,\n last = _ref.last;\n\n var styles = reactCSS({\n 'default': {\n swatch: {\n height: '12px',\n background: 'hsl(' + hsl.h + ', 50%, ' + offset * 100 + '%)',\n cursor: 'pointer'\n }\n },\n 'first': {\n swatch: {\n borderRadius: '2px 0 0 2px'\n }\n },\n 'last': {\n swatch: {\n borderRadius: '0 2px 2px 0'\n }\n },\n 'active': {\n swatch: {\n transform: 'scaleY(1.8)',\n borderRadius: '3.6px/2px'\n }\n }\n }, { active: active, first: first, last: last });\n\n var handleClick = function handleClick(e) {\n return onClick({\n h: hsl.h,\n s: 0.5,\n l: offset,\n source: 'hsl'\n }, e);\n };\n\n return React.createElement('div', { style: styles.swatch, onClick: handleClick });\n};\n\nexport default SliderSwatch;","import React from 'react';\nimport reactCSS from 'reactcss';\n\nimport SliderSwatch from './SliderSwatch';\n\nexport var SliderSwatches = function SliderSwatches(_ref) {\n var onClick = _ref.onClick,\n hsl = _ref.hsl;\n\n var styles = reactCSS({\n 'default': {\n swatches: {\n marginTop: '20px'\n },\n swatch: {\n boxSizing: 'border-box',\n width: '20%',\n paddingRight: '1px',\n float: 'left'\n },\n clear: {\n clear: 'both'\n }\n }\n });\n\n // Acceptible difference in floating point equality\n var epsilon = 0.1;\n\n return React.createElement(\n 'div',\n { style: styles.swatches },\n React.createElement(\n 'div',\n { style: styles.swatch },\n React.createElement(SliderSwatch, {\n hsl: hsl,\n offset: '.80',\n active: Math.abs(hsl.l - 0.80) < epsilon && Math.abs(hsl.s - 0.50) < epsilon,\n onClick: onClick,\n first: true\n })\n ),\n React.createElement(\n 'div',\n { style: styles.swatch },\n React.createElement(SliderSwatch, {\n hsl: hsl,\n offset: '.65',\n active: Math.abs(hsl.l - 0.65) < epsilon && Math.abs(hsl.s - 0.50) < epsilon,\n onClick: onClick\n })\n ),\n React.createElement(\n 'div',\n { style: styles.swatch },\n React.createElement(SliderSwatch, {\n hsl: hsl,\n offset: '.50',\n active: Math.abs(hsl.l - 0.50) < epsilon && Math.abs(hsl.s - 0.50) < epsilon,\n onClick: onClick\n })\n ),\n React.createElement(\n 'div',\n { style: styles.swatch },\n React.createElement(SliderSwatch, {\n hsl: hsl,\n offset: '.35',\n active: Math.abs(hsl.l - 0.35) < epsilon && Math.abs(hsl.s - 0.50) < epsilon,\n onClick: onClick\n })\n ),\n React.createElement(\n 'div',\n { style: styles.swatch },\n React.createElement(SliderSwatch, {\n hsl: hsl,\n offset: '.20',\n active: Math.abs(hsl.l - 0.20) < epsilon && Math.abs(hsl.s - 0.50) < epsilon,\n onClick: onClick,\n last: true\n })\n ),\n React.createElement('div', { style: styles.clear })\n );\n};\n\nexport default SliderSwatches;","import React from 'react';\nimport reactCSS from 'reactcss';\n\nexport var SliderPointer = function SliderPointer() {\n var styles = reactCSS({\n 'default': {\n picker: {\n width: '14px',\n height: '14px',\n borderRadius: '6px',\n transform: 'translate(-7px, -1px)',\n backgroundColor: 'rgb(248, 248, 248)',\n boxShadow: '0 1px 4px 0 rgba(0, 0, 0, 0.37)'\n }\n }\n });\n\n return React.createElement('div', { style: styles.picker });\n};\n\nexport default SliderPointer;","import React from 'react';\nimport PropTypes from 'prop-types';\nimport reactCSS from 'reactcss';\nimport merge from 'lodash-es/merge';\n\nimport { ColorWrap, Hue } from '../common';\nimport SliderSwatches from './SliderSwatches';\nimport SliderPointer from './SliderPointer';\n\nexport var Slider = function Slider(_ref) {\n var hsl = _ref.hsl,\n onChange = _ref.onChange,\n pointer = _ref.pointer,\n _ref$styles = _ref.styles,\n passedStyles = _ref$styles === undefined ? {} : _ref$styles,\n _ref$className = _ref.className,\n className = _ref$className === undefined ? '' : _ref$className;\n\n var styles = reactCSS(merge({\n 'default': {\n hue: {\n height: '12px',\n position: 'relative'\n },\n Hue: {\n radius: '2px'\n }\n }\n }, passedStyles));\n\n return React.createElement(\n 'div',\n { style: styles.wrap || {}, className: 'slider-picker ' + className },\n React.createElement(\n 'div',\n { style: styles.hue },\n React.createElement(Hue, {\n style: styles.Hue,\n hsl: hsl,\n pointer: pointer,\n onChange: onChange\n })\n ),\n React.createElement(\n 'div',\n { style: styles.swatches },\n React.createElement(SliderSwatches, { hsl: hsl, onClick: onChange })\n )\n );\n};\n\nSlider.propTypes = {\n styles: PropTypes.object\n};\nSlider.defaultProps = {\n pointer: SliderPointer,\n styles: {}\n};\n\nexport default ColorWrap(Slider);","import React from 'react';\nimport reactCSS from 'reactcss';\nimport * as colorUtils from '../../helpers/color';\n\nimport { Swatch } from '../common';\nimport CheckIcon from '@icons/material/CheckIcon';\n\nexport var SwatchesColor = function SwatchesColor(_ref) {\n var color = _ref.color,\n _ref$onClick = _ref.onClick,\n onClick = _ref$onClick === undefined ? function () {} : _ref$onClick,\n onSwatchHover = _ref.onSwatchHover,\n first = _ref.first,\n last = _ref.last,\n active = _ref.active;\n\n var styles = reactCSS({\n 'default': {\n color: {\n width: '40px',\n height: '24px',\n cursor: 'pointer',\n background: color,\n marginBottom: '1px'\n },\n check: {\n color: colorUtils.getContrastingColor(color),\n marginLeft: '8px',\n display: 'none'\n }\n },\n 'first': {\n color: {\n overflow: 'hidden',\n borderRadius: '2px 2px 0 0'\n }\n },\n 'last': {\n color: {\n overflow: 'hidden',\n borderRadius: '0 0 2px 2px'\n }\n },\n 'active': {\n check: {\n display: 'block'\n }\n },\n 'color-#FFFFFF': {\n color: {\n boxShadow: 'inset 0 0 0 1px #ddd'\n },\n check: {\n color: '#333'\n }\n },\n 'transparent': {\n check: {\n color: '#333'\n }\n }\n }, {\n first: first,\n last: last,\n active: active,\n 'color-#FFFFFF': color === '#FFFFFF',\n 'transparent': color === 'transparent'\n });\n\n return React.createElement(\n Swatch,\n {\n color: color,\n style: styles.color,\n onClick: onClick,\n onHover: onSwatchHover,\n focusStyle: { boxShadow: '0 0 4px ' + color }\n },\n React.createElement(\n 'div',\n { style: styles.check },\n React.createElement(CheckIcon, null)\n )\n );\n};\n\nexport default SwatchesColor;","import React from 'react';\nimport reactCSS from 'reactcss';\nimport map from 'lodash-es/map';\n\nimport SwatchesColor from './SwatchesColor';\n\nexport var SwatchesGroup = function SwatchesGroup(_ref) {\n var onClick = _ref.onClick,\n onSwatchHover = _ref.onSwatchHover,\n group = _ref.group,\n active = _ref.active;\n\n var styles = reactCSS({\n 'default': {\n group: {\n paddingBottom: '10px',\n width: '40px',\n float: 'left',\n marginRight: '10px'\n }\n }\n });\n\n return React.createElement(\n 'div',\n { style: styles.group },\n map(group, function (color, i) {\n return React.createElement(SwatchesColor, {\n key: color,\n color: color,\n active: color.toLowerCase() === active,\n first: i === 0,\n last: i === group.length - 1,\n onClick: onClick,\n onSwatchHover: onSwatchHover\n });\n })\n );\n};\n\nexport default SwatchesGroup;","import React from 'react';\nimport PropTypes from 'prop-types';\nimport reactCSS from 'reactcss';\nimport map from 'lodash-es/map';\nimport merge from 'lodash-es/merge';\nimport * as material from 'material-colors';\n\nimport { ColorWrap, Raised } from '../common';\nimport SwatchesGroup from './SwatchesGroup';\n\nexport var Swatches = function Swatches(_ref) {\n var width = _ref.width,\n height = _ref.height,\n onChange = _ref.onChange,\n onSwatchHover = _ref.onSwatchHover,\n colors = _ref.colors,\n hex = _ref.hex,\n _ref$styles = _ref.styles,\n passedStyles = _ref$styles === undefined ? {} : _ref$styles,\n _ref$className = _ref.className,\n className = _ref$className === undefined ? '' : _ref$className;\n\n var styles = reactCSS(merge({\n 'default': {\n picker: {\n width: width,\n height: height\n },\n overflow: {\n height: height,\n overflowY: 'scroll'\n },\n body: {\n padding: '16px 0 6px 16px'\n },\n clear: {\n clear: 'both'\n }\n }\n }, passedStyles));\n\n var handleChange = function handleChange(data, e) {\n return onChange({ hex: data, source: 'hex' }, e);\n };\n\n return React.createElement(\n 'div',\n { style: styles.picker, className: 'swatches-picker ' + className },\n React.createElement(\n Raised,\n null,\n React.createElement(\n 'div',\n { style: styles.overflow },\n React.createElement(\n 'div',\n { style: styles.body },\n map(colors, function (group) {\n return React.createElement(SwatchesGroup, {\n key: group.toString(),\n group: group,\n active: hex,\n onClick: handleChange,\n onSwatchHover: onSwatchHover\n });\n }),\n React.createElement('div', { style: styles.clear })\n )\n )\n )\n );\n};\n\nSwatches.propTypes = {\n width: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n height: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n colors: PropTypes.arrayOf(PropTypes.arrayOf(PropTypes.string)),\n styles: PropTypes.object\n\n /* eslint-disable max-len */\n};Swatches.defaultProps = {\n width: 320,\n height: 240,\n colors: [[material.red['900'], material.red['700'], material.red['500'], material.red['300'], material.red['100']], [material.pink['900'], material.pink['700'], material.pink['500'], material.pink['300'], material.pink['100']], [material.purple['900'], material.purple['700'], material.purple['500'], material.purple['300'], material.purple['100']], [material.deepPurple['900'], material.deepPurple['700'], material.deepPurple['500'], material.deepPurple['300'], material.deepPurple['100']], [material.indigo['900'], material.indigo['700'], material.indigo['500'], material.indigo['300'], material.indigo['100']], [material.blue['900'], material.blue['700'], material.blue['500'], material.blue['300'], material.blue['100']], [material.lightBlue['900'], material.lightBlue['700'], material.lightBlue['500'], material.lightBlue['300'], material.lightBlue['100']], [material.cyan['900'], material.cyan['700'], material.cyan['500'], material.cyan['300'], material.cyan['100']], [material.teal['900'], material.teal['700'], material.teal['500'], material.teal['300'], material.teal['100']], ['#194D33', material.green['700'], material.green['500'], material.green['300'], material.green['100']], [material.lightGreen['900'], material.lightGreen['700'], material.lightGreen['500'], material.lightGreen['300'], material.lightGreen['100']], [material.lime['900'], material.lime['700'], material.lime['500'], material.lime['300'], material.lime['100']], [material.yellow['900'], material.yellow['700'], material.yellow['500'], material.yellow['300'], material.yellow['100']], [material.amber['900'], material.amber['700'], material.amber['500'], material.amber['300'], material.amber['100']], [material.orange['900'], material.orange['700'], material.orange['500'], material.orange['300'], material.orange['100']], [material.deepOrange['900'], material.deepOrange['700'], material.deepOrange['500'], material.deepOrange['300'], material.deepOrange['100']], [material.brown['900'], material.brown['700'], material.brown['500'], material.brown['300'], material.brown['100']], [material.blueGrey['900'], material.blueGrey['700'], material.blueGrey['500'], material.blueGrey['300'], material.blueGrey['100']], ['#000000', '#525252', '#969696', '#D9D9D9', '#FFFFFF']],\n styles: {}\n};\n\nexport default ColorWrap(Swatches);","import React from 'react';\nimport PropTypes from 'prop-types';\nimport reactCSS from 'reactcss';\nimport map from 'lodash-es/map';\nimport merge from 'lodash-es/merge';\nimport * as color from '../../helpers/color';\n\nimport { ColorWrap, EditableInput, Swatch } from '../common';\n\nexport var Twitter = function Twitter(_ref) {\n var onChange = _ref.onChange,\n onSwatchHover = _ref.onSwatchHover,\n hex = _ref.hex,\n colors = _ref.colors,\n width = _ref.width,\n triangle = _ref.triangle,\n _ref$styles = _ref.styles,\n passedStyles = _ref$styles === undefined ? {} : _ref$styles,\n _ref$className = _ref.className,\n className = _ref$className === undefined ? '' : _ref$className;\n\n var styles = reactCSS(merge({\n 'default': {\n card: {\n width: width,\n background: '#fff',\n border: '0 solid rgba(0,0,0,0.25)',\n boxShadow: '0 1px 4px rgba(0,0,0,0.25)',\n borderRadius: '4px',\n position: 'relative'\n },\n body: {\n padding: '15px 9px 9px 15px'\n },\n label: {\n fontSize: '18px',\n color: '#fff'\n },\n triangle: {\n width: '0px',\n height: '0px',\n borderStyle: 'solid',\n borderWidth: '0 9px 10px 9px',\n borderColor: 'transparent transparent #fff transparent',\n position: 'absolute'\n },\n triangleShadow: {\n width: '0px',\n height: '0px',\n borderStyle: 'solid',\n borderWidth: '0 9px 10px 9px',\n borderColor: 'transparent transparent rgba(0,0,0,.1) transparent',\n position: 'absolute'\n },\n hash: {\n background: '#F0F0F0',\n height: '30px',\n width: '30px',\n borderRadius: '4px 0 0 4px',\n float: 'left',\n color: '#98A1A4',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center'\n },\n input: {\n width: '100px',\n fontSize: '14px',\n color: '#666',\n border: '0px',\n outline: 'none',\n height: '28px',\n boxShadow: 'inset 0 0 0 1px #F0F0F0',\n boxSizing: 'content-box',\n borderRadius: '0 4px 4px 0',\n float: 'left',\n paddingLeft: '8px'\n },\n swatch: {\n width: '30px',\n height: '30px',\n float: 'left',\n borderRadius: '4px',\n margin: '0 6px 6px 0'\n },\n clear: {\n clear: 'both'\n }\n },\n 'hide-triangle': {\n triangle: {\n display: 'none'\n },\n triangleShadow: {\n display: 'none'\n }\n },\n 'top-left-triangle': {\n triangle: {\n top: '-10px',\n left: '12px'\n },\n triangleShadow: {\n top: '-11px',\n left: '12px'\n }\n },\n 'top-right-triangle': {\n triangle: {\n top: '-10px',\n right: '12px'\n },\n triangleShadow: {\n top: '-11px',\n right: '12px'\n }\n }\n }, passedStyles), {\n 'hide-triangle': triangle === 'hide',\n 'top-left-triangle': triangle === 'top-left',\n 'top-right-triangle': triangle === 'top-right'\n });\n\n var handleChange = function handleChange(hexcode, e) {\n color.isValidHex(hexcode) && onChange({\n hex: hexcode,\n source: 'hex'\n }, e);\n };\n\n return React.createElement(\n 'div',\n { style: styles.card, className: 'twitter-picker ' + className },\n React.createElement('div', { style: styles.triangleShadow }),\n React.createElement('div', { style: styles.triangle }),\n React.createElement(\n 'div',\n { style: styles.body },\n map(colors, function (c, i) {\n return React.createElement(Swatch, {\n key: i,\n color: c,\n hex: c,\n style: styles.swatch,\n onClick: handleChange,\n onHover: onSwatchHover,\n focusStyle: {\n boxShadow: '0 0 4px ' + c\n }\n });\n }),\n React.createElement(\n 'div',\n { style: styles.hash },\n '#'\n ),\n React.createElement(EditableInput, {\n label: null,\n style: { input: styles.input },\n value: hex.replace('#', ''),\n onChange: handleChange\n }),\n React.createElement('div', { style: styles.clear })\n )\n );\n};\n\nTwitter.propTypes = {\n width: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n triangle: PropTypes.oneOf(['hide', 'top-left', 'top-right']),\n colors: PropTypes.arrayOf(PropTypes.string),\n styles: PropTypes.object\n};\n\nTwitter.defaultProps = {\n width: 276,\n colors: ['#FF6900', '#FCB900', '#7BDCB5', '#00D084', '#8ED1FC', '#0693E3', '#ABB8C3', '#EB144C', '#F78DA7', '#9900EF'],\n triangle: 'top-left',\n styles: {}\n};\n\nexport default ColorWrap(Twitter);","import React from 'react';\nimport reactCSS from 'reactcss';\nimport PropTypes from 'prop-types';\n\nexport var GooglePointerCircle = function GooglePointerCircle(props) {\n var styles = reactCSS({\n 'default': {\n picker: {\n width: '20px',\n height: '20px',\n borderRadius: '22px',\n border: '2px #fff solid',\n transform: 'translate(-12px, -13px)',\n background: 'hsl(' + Math.round(props.hsl.h) + ', ' + Math.round(props.hsl.s * 100) + '%, ' + Math.round(props.hsl.l * 100) + '%)'\n }\n }\n });\n\n return React.createElement('div', { style: styles.picker });\n};\n\nGooglePointerCircle.propTypes = {\n hsl: PropTypes.shape({\n h: PropTypes.number,\n s: PropTypes.number,\n l: PropTypes.number,\n a: PropTypes.number\n })\n};\n\nGooglePointerCircle.defaultProps = {\n hsl: { a: 1, h: 249.94, l: 0.2, s: 0.50 }\n};\n\nexport default GooglePointerCircle;","import React from 'react';\nimport reactCSS from 'reactcss';\nimport PropTypes from 'prop-types';\n\nexport var GooglePointer = function GooglePointer(props) {\n var styles = reactCSS({\n 'default': {\n picker: {\n width: '20px',\n height: '20px',\n borderRadius: '22px',\n transform: 'translate(-10px, -7px)',\n background: 'hsl(' + Math.round(props.hsl.h) + ', 100%, 50%)',\n border: '2px white solid'\n }\n }\n });\n\n return React.createElement('div', { style: styles.picker });\n};\n\nGooglePointer.propTypes = {\n hsl: PropTypes.shape({\n h: PropTypes.number,\n s: PropTypes.number,\n l: PropTypes.number,\n a: PropTypes.number\n })\n};\n\nGooglePointer.defaultProps = {\n hsl: { a: 1, h: 249.94, l: 0.2, s: 0.50 }\n};\n\nexport default GooglePointer;","import React from 'react';\nimport reactCSS from 'reactcss';\nimport * as color from '../../helpers/color';\nimport { EditableInput } from '../common';\n\nexport var GoogleFields = function GoogleFields(_ref) {\n var onChange = _ref.onChange,\n rgb = _ref.rgb,\n hsl = _ref.hsl,\n hex = _ref.hex,\n hsv = _ref.hsv;\n\n\n var handleChange = function handleChange(data, e) {\n if (data.hex) {\n color.isValidHex(data.hex) && onChange({\n hex: data.hex,\n source: 'hex'\n }, e);\n } else if (data.rgb) {\n var values = data.rgb.split(',');\n color.isvalidColorString(data.rgb, 'rgb') && onChange({\n r: values[0],\n g: values[1],\n b: values[2],\n a: 1,\n source: 'rgb'\n }, e);\n } else if (data.hsv) {\n var _values = data.hsv.split(',');\n if (color.isvalidColorString(data.hsv, 'hsv')) {\n _values[2] = _values[2].replace('%', '');\n _values[1] = _values[1].replace('%', '');\n _values[0] = _values[0].replace('°', '');\n if (_values[1] == 1) {\n _values[1] = 0.01;\n } else if (_values[2] == 1) {\n _values[2] = 0.01;\n }\n onChange({\n h: Number(_values[0]),\n s: Number(_values[1]),\n v: Number(_values[2]),\n source: 'hsv'\n }, e);\n }\n } else if (data.hsl) {\n var _values2 = data.hsl.split(',');\n if (color.isvalidColorString(data.hsl, 'hsl')) {\n _values2[2] = _values2[2].replace('%', '');\n _values2[1] = _values2[1].replace('%', '');\n _values2[0] = _values2[0].replace('°', '');\n if (hsvValue[1] == 1) {\n hsvValue[1] = 0.01;\n } else if (hsvValue[2] == 1) {\n hsvValue[2] = 0.01;\n }\n onChange({\n h: Number(_values2[0]),\n s: Number(_values2[1]),\n v: Number(_values2[2]),\n source: 'hsl'\n }, e);\n }\n }\n };\n\n var styles = reactCSS({\n 'default': {\n wrap: {\n display: 'flex',\n height: '100px',\n marginTop: '4px'\n },\n fields: {\n width: '100%'\n },\n column: {\n paddingTop: '10px',\n display: 'flex',\n justifyContent: 'space-between'\n },\n double: {\n padding: '0px 4.4px',\n boxSizing: 'border-box'\n },\n input: {\n width: '100%',\n height: '38px',\n boxSizing: 'border-box',\n padding: '4px 10% 3px',\n textAlign: 'center',\n border: '1px solid #dadce0',\n fontSize: '11px',\n textTransform: 'lowercase',\n borderRadius: '5px',\n outline: 'none',\n fontFamily: 'Roboto,Arial,sans-serif'\n },\n input2: {\n height: '38px',\n width: '100%',\n border: '1px solid #dadce0',\n boxSizing: 'border-box',\n fontSize: '11px',\n textTransform: 'lowercase',\n borderRadius: '5px',\n outline: 'none',\n paddingLeft: '10px',\n fontFamily: 'Roboto,Arial,sans-serif'\n },\n label: {\n textAlign: 'center',\n fontSize: '12px',\n background: '#fff',\n position: 'absolute',\n textTransform: 'uppercase',\n color: '#3c4043',\n width: '35px',\n top: '-6px',\n left: '0',\n right: '0',\n marginLeft: 'auto',\n marginRight: 'auto',\n fontFamily: 'Roboto,Arial,sans-serif'\n },\n label2: {\n left: '10px',\n textAlign: 'center',\n fontSize: '12px',\n background: '#fff',\n position: 'absolute',\n textTransform: 'uppercase',\n color: '#3c4043',\n width: '32px',\n top: '-6px',\n fontFamily: 'Roboto,Arial,sans-serif'\n },\n single: {\n flexGrow: '1',\n margin: '0px 4.4px'\n }\n }\n });\n\n var rgbValue = rgb.r + ', ' + rgb.g + ', ' + rgb.b;\n var hslValue = Math.round(hsl.h) + '\\xB0, ' + Math.round(hsl.s * 100) + '%, ' + Math.round(hsl.l * 100) + '%';\n var hsvValue = Math.round(hsv.h) + '\\xB0, ' + Math.round(hsv.s * 100) + '%, ' + Math.round(hsv.v * 100) + '%';\n\n return React.createElement(\n 'div',\n { style: styles.wrap, className: 'flexbox-fix' },\n React.createElement(\n 'div',\n { style: styles.fields },\n React.createElement(\n 'div',\n { style: styles.double },\n React.createElement(EditableInput, {\n style: { input: styles.input, label: styles.label },\n label: 'hex',\n value: hex,\n onChange: handleChange\n })\n ),\n React.createElement(\n 'div',\n { style: styles.column },\n React.createElement(\n 'div',\n { style: styles.single },\n React.createElement(EditableInput, {\n style: { input: styles.input2, label: styles.label2 },\n label: 'rgb',\n value: rgbValue,\n onChange: handleChange\n })\n ),\n React.createElement(\n 'div',\n { style: styles.single },\n React.createElement(EditableInput, {\n style: { input: styles.input2, label: styles.label2 },\n label: 'hsv',\n value: hsvValue,\n onChange: handleChange\n })\n ),\n React.createElement(\n 'div',\n { style: styles.single },\n React.createElement(EditableInput, {\n style: { input: styles.input2, label: styles.label2 },\n label: 'hsl',\n value: hslValue,\n onChange: handleChange\n })\n )\n )\n )\n );\n};\n\nexport default GoogleFields;","import React from 'react';\nimport PropTypes from 'prop-types';\nimport reactCSS from 'reactcss';\nimport merge from 'lodash-es/merge';\n\nimport { ColorWrap, Saturation, Hue } from '../common';\nimport GooglePointerCircle from './GooglePointerCircle';\nimport GooglePointer from './GooglePointer';\nimport GoogleFields from './GoogleFields';\n\nexport var Google = function Google(_ref) {\n var width = _ref.width,\n onChange = _ref.onChange,\n rgb = _ref.rgb,\n hsl = _ref.hsl,\n hsv = _ref.hsv,\n hex = _ref.hex,\n header = _ref.header,\n _ref$styles = _ref.styles,\n passedStyles = _ref$styles === undefined ? {} : _ref$styles,\n _ref$className = _ref.className,\n className = _ref$className === undefined ? '' : _ref$className;\n\n var styles = reactCSS(merge({\n 'default': {\n picker: {\n width: width,\n background: '#fff',\n border: '1px solid #dfe1e5',\n boxSizing: 'initial',\n display: 'flex',\n flexWrap: 'wrap',\n borderRadius: '8px 8px 0px 0px'\n },\n head: {\n height: '57px',\n width: '100%',\n paddingTop: '16px',\n paddingBottom: '16px',\n paddingLeft: '16px',\n fontSize: '20px',\n boxSizing: 'border-box',\n fontFamily: 'Roboto-Regular,HelveticaNeue,Arial,sans-serif'\n },\n saturation: {\n width: '70%',\n padding: '0px',\n position: 'relative',\n overflow: 'hidden'\n },\n swatch: {\n width: '30%',\n height: '228px',\n padding: '0px',\n background: 'rgba(' + rgb.r + ', ' + rgb.g + ', ' + rgb.b + ', 1)',\n position: 'relative',\n overflow: 'hidden'\n },\n body: {\n margin: 'auto',\n width: '95%'\n },\n controls: {\n display: 'flex',\n boxSizing: 'border-box',\n height: '52px',\n paddingTop: '22px'\n },\n color: {\n width: '32px'\n },\n hue: {\n height: '8px',\n position: 'relative',\n margin: '0px 16px 0px 16px',\n width: '100%'\n },\n Hue: {\n radius: '2px'\n }\n }\n }, passedStyles));\n return React.createElement(\n 'div',\n { style: styles.picker, className: 'google-picker ' + className },\n React.createElement(\n 'div',\n { style: styles.head },\n header\n ),\n React.createElement('div', { style: styles.swatch }),\n React.createElement(\n 'div',\n { style: styles.saturation },\n React.createElement(Saturation, {\n hsl: hsl,\n hsv: hsv,\n pointer: GooglePointerCircle,\n onChange: onChange\n })\n ),\n React.createElement(\n 'div',\n { style: styles.body },\n React.createElement(\n 'div',\n { style: styles.controls, className: 'flexbox-fix' },\n React.createElement(\n 'div',\n { style: styles.hue },\n React.createElement(Hue, {\n style: styles.Hue,\n hsl: hsl,\n radius: '4px',\n pointer: GooglePointer,\n onChange: onChange\n })\n )\n ),\n React.createElement(GoogleFields, {\n rgb: rgb,\n hsl: hsl,\n hex: hex,\n hsv: hsv,\n onChange: onChange\n })\n )\n );\n};\n\nGoogle.propTypes = {\n width: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n styles: PropTypes.object,\n header: PropTypes.string\n\n};\n\nGoogle.defaultProps = {\n width: 652,\n styles: {},\n header: 'Color picker'\n};\n\nexport default ColorWrap(Google);","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.autoprefix = undefined;\n\nvar _forOwn2 = require('lodash/forOwn');\n\nvar _forOwn3 = _interopRequireDefault(_forOwn2);\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar transforms = {\n borderRadius: function borderRadius(value) {\n return {\n msBorderRadius: value,\n MozBorderRadius: value,\n OBorderRadius: value,\n WebkitBorderRadius: value,\n borderRadius: value\n };\n },\n boxShadow: function boxShadow(value) {\n return {\n msBoxShadow: value,\n MozBoxShadow: value,\n OBoxShadow: value,\n WebkitBoxShadow: value,\n boxShadow: value\n };\n },\n userSelect: function userSelect(value) {\n return {\n WebkitTouchCallout: value,\n KhtmlUserSelect: value,\n MozUserSelect: value,\n msUserSelect: value,\n WebkitUserSelect: value,\n userSelect: value\n };\n },\n\n flex: function flex(value) {\n return {\n WebkitBoxFlex: value,\n MozBoxFlex: value,\n WebkitFlex: value,\n msFlex: value,\n flex: value\n };\n },\n flexBasis: function flexBasis(value) {\n return {\n WebkitFlexBasis: value,\n flexBasis: value\n };\n },\n justifyContent: function justifyContent(value) {\n return {\n WebkitJustifyContent: value,\n justifyContent: value\n };\n },\n\n transition: function transition(value) {\n return {\n msTransition: value,\n MozTransition: value,\n OTransition: value,\n WebkitTransition: value,\n transition: value\n };\n },\n\n transform: function transform(value) {\n return {\n msTransform: value,\n MozTransform: value,\n OTransform: value,\n WebkitTransform: value,\n transform: value\n };\n },\n absolute: function absolute(value) {\n var direction = value && value.split(' ');\n return {\n position: 'absolute',\n top: direction && direction[0],\n right: direction && direction[1],\n bottom: direction && direction[2],\n left: direction && direction[3]\n };\n },\n extend: function extend(name, otherElementStyles) {\n var otherStyle = otherElementStyles[name];\n if (otherStyle) {\n return otherStyle;\n }\n return {\n 'extend': name\n };\n }\n};\n\nvar autoprefix = exports.autoprefix = function autoprefix(elements) {\n var prefixed = {};\n (0, _forOwn3.default)(elements, function (styles, element) {\n var expanded = {};\n (0, _forOwn3.default)(styles, function (value, key) {\n var transform = transforms[key];\n if (transform) {\n expanded = _extends({}, expanded, transform(value));\n } else {\n expanded[key] = value;\n }\n });\n prefixed[element] = expanded;\n });\n return prefixed;\n};\n\nexports.default = autoprefix;","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.active = undefined;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar active = exports.active = function active(Component) {\n var Span = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'span';\n\n return function (_React$Component) {\n _inherits(Active, _React$Component);\n\n function Active() {\n var _ref;\n\n var _temp, _this, _ret;\n\n _classCallCheck(this, Active);\n\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = Active.__proto__ || Object.getPrototypeOf(Active)).call.apply(_ref, [this].concat(args))), _this), _this.state = { active: false }, _this.handleMouseDown = function () {\n return _this.setState({ active: true });\n }, _this.handleMouseUp = function () {\n return _this.setState({ active: false });\n }, _this.render = function () {\n return _react2.default.createElement(\n Span,\n { onMouseDown: _this.handleMouseDown, onMouseUp: _this.handleMouseUp },\n _react2.default.createElement(Component, _extends({}, _this.props, _this.state))\n );\n }, _temp), _possibleConstructorReturn(_this, _ret);\n }\n\n return Active;\n }(_react2.default.Component);\n};\n\nexports.default = active;","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.hover = undefined;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar hover = exports.hover = function hover(Component) {\n var Span = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'span';\n\n return function (_React$Component) {\n _inherits(Hover, _React$Component);\n\n function Hover() {\n var _ref;\n\n var _temp, _this, _ret;\n\n _classCallCheck(this, Hover);\n\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = Hover.__proto__ || Object.getPrototypeOf(Hover)).call.apply(_ref, [this].concat(args))), _this), _this.state = { hover: false }, _this.handleMouseOver = function () {\n return _this.setState({ hover: true });\n }, _this.handleMouseOut = function () {\n return _this.setState({ hover: false });\n }, _this.render = function () {\n return _react2.default.createElement(\n Span,\n { onMouseOver: _this.handleMouseOver, onMouseOut: _this.handleMouseOut },\n _react2.default.createElement(Component, _extends({}, _this.props, _this.state))\n );\n }, _temp), _possibleConstructorReturn(_this, _ret);\n }\n\n return Hover;\n }(_react2.default.Component);\n};\n\nexports.default = hover;","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.flattenNames = undefined;\n\nvar _isString2 = require('lodash/isString');\n\nvar _isString3 = _interopRequireDefault(_isString2);\n\nvar _forOwn2 = require('lodash/forOwn');\n\nvar _forOwn3 = _interopRequireDefault(_forOwn2);\n\nvar _isPlainObject2 = require('lodash/isPlainObject');\n\nvar _isPlainObject3 = _interopRequireDefault(_isPlainObject2);\n\nvar _map2 = require('lodash/map');\n\nvar _map3 = _interopRequireDefault(_map2);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar flattenNames = exports.flattenNames = function flattenNames() {\n var things = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n\n var names = [];\n\n (0, _map3.default)(things, function (thing) {\n if (Array.isArray(thing)) {\n flattenNames(thing).map(function (name) {\n return names.push(name);\n });\n } else if ((0, _isPlainObject3.default)(thing)) {\n (0, _forOwn3.default)(thing, function (value, key) {\n value === true && names.push(key);\n names.push(key + '-' + value);\n });\n } else if ((0, _isString3.default)(thing)) {\n names.push(thing);\n }\n });\n\n return names;\n};\n\nexports.default = flattenNames;","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.ReactCSS = exports.loop = exports.handleActive = exports.handleHover = exports.hover = undefined;\n\nvar _flattenNames = require('./flattenNames');\n\nvar _flattenNames2 = _interopRequireDefault(_flattenNames);\n\nvar _mergeClasses = require('./mergeClasses');\n\nvar _mergeClasses2 = _interopRequireDefault(_mergeClasses);\n\nvar _autoprefix = require('./autoprefix');\n\nvar _autoprefix2 = _interopRequireDefault(_autoprefix);\n\nvar _hover2 = require('./components/hover');\n\nvar _hover3 = _interopRequireDefault(_hover2);\n\nvar _active = require('./components/active');\n\nvar _active2 = _interopRequireDefault(_active);\n\nvar _loop2 = require('./loop');\n\nvar _loop3 = _interopRequireDefault(_loop2);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.hover = _hover3.default;\nexports.handleHover = _hover3.default;\nexports.handleActive = _active2.default;\nexports.loop = _loop3.default;\nvar ReactCSS = exports.ReactCSS = function ReactCSS(classes) {\n for (var _len = arguments.length, activations = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n activations[_key - 1] = arguments[_key];\n }\n\n var activeNames = (0, _flattenNames2.default)(activations);\n var merged = (0, _mergeClasses2.default)(classes, activeNames);\n return (0, _autoprefix2.default)(merged);\n};\n\nexports.default = ReactCSS;","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar loopable = function loopable(i, length) {\n var props = {};\n var setProp = function setProp(name) {\n var value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n props[name] = value;\n };\n\n i === 0 && setProp('first-child');\n i === length - 1 && setProp('last-child');\n (i === 0 || i % 2 === 0) && setProp('even');\n Math.abs(i % 2) === 1 && setProp('odd');\n setProp('nth-child', i);\n\n return props;\n};\n\nexports.default = loopable;","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.mergeClasses = undefined;\n\nvar _forOwn2 = require('lodash/forOwn');\n\nvar _forOwn3 = _interopRequireDefault(_forOwn2);\n\nvar _cloneDeep2 = require('lodash/cloneDeep');\n\nvar _cloneDeep3 = _interopRequireDefault(_cloneDeep2);\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mergeClasses = exports.mergeClasses = function mergeClasses(classes) {\n var activeNames = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n\n var styles = classes.default && (0, _cloneDeep3.default)(classes.default) || {};\n activeNames.map(function (name) {\n var toMerge = classes[name];\n if (toMerge) {\n (0, _forOwn3.default)(toMerge, function (value, key) {\n if (!styles[key]) {\n styles[key] = {};\n }\n\n styles[key] = _extends({}, styles[key], toMerge[key]);\n });\n }\n\n return name;\n });\n return styles;\n};\n\nexports.default = mergeClasses;"],"names":["obj","_extends","Object","assign","target","i","arguments","length","source","key","prototype","hasOwnProperty","call","_react","_react2","__esModule","default","exports","_ref","_ref$fill","fill","undefined","_ref$width","width","_ref$height","height","_ref$style","style","props","keys","indexOf","_objectWithoutProperties","createElement","viewBox","d","EdgeLocator","oriented","this","edgeMap","Map","value","clear","pointId0","pointId1","newEdgeValue","computeEdgeKey","node","get","edgeId","size","set","n","Math","sqrt","vtkEdgeLocator","newInstance","MARCHING_SQUARES_CASES","EDGES","vtkCaseTable","getCase","index","getEdge","eid","vtkErrorMacro","vtkDebugMacro","DEFAULT_VALUES","contourValues","slice","mergePoints","extend","publicAPI","model","initialValues","classHierarchy","push","getContourValues","setContourValues","cValues","modified","ids","pixelScalars","pixelPts","edgeLocator","getPixelScalars","j","k","dims","origin","spacing","s","ii","getPixelPoints","produceLines","cVal","scalars","points","lines","pId","CASE_MASK","xyz","idx","pixelLines","z","_idx","_edgeLocator$isInsert","edgeVerts","isInsertedEdge","t","x0","x1","insertEdge","requestData","inData","outData","input","console","time","getOrigin","getSpacing","getDimensions","getPointData","getScalars","getData","pBuffer","lBuffer","round","cv","initialize","polydata","getPoints","setData","Float32Array","getLines","Uint32Array","timeEnd","vtkImageMarchingSquares","vtkImageMarchingSquares$1","DataView","getNative","module","hashClear","hashDelete","hashGet","hashHas","hashSet","Hash","entries","entry","has","listCacheClear","listCacheDelete","listCacheGet","listCacheHas","listCacheSet","ListCache","mapCacheClear","mapCacheDelete","mapCacheGet","mapCacheHas","mapCacheSet","MapCache","Promise","Set","setCacheAdd","setCacheHas","SetCache","values","__data__","add","stackClear","stackDelete","stackGet","stackHas","stackSet","Stack","data","Uint8Array","WeakMap","array","iteratee","predicate","resIndex","result","baseTimes","isArguments","isArray","isBuffer","isIndex","isTypedArray","inherited","isArr","isArg","isBuff","isType","skipIndexes","String","Array","offset","baseAssignValue","eq","object","objValue","copyObject","keysIn","defineProperty","arrayEach","assignValue","baseAssign","baseAssignIn","cloneBuffer","copyArray","copySymbols","copySymbolsIn","getAllKeys","getAllKeysIn","getTag","initCloneArray","initCloneByTag","initCloneObject","isMap","isObject","isSet","argsTag","funcTag","objectTag","cloneableTags","baseClone","bitmask","customizer","stack","isDeep","isFlat","isFull","tag","isFunc","stacked","forEach","subValue","objectCreate","create","baseCreate","proto","baseForOwn","baseEach","createBaseEach","baseFor","createBaseFor","castPath","toKey","path","arrayPush","keysFunc","symbolsFunc","baseGetTag","isObjectLike","baseIsEqualDeep","baseIsEqual","other","equalArrays","equalByTag","equalObjects","arrayTag","equalFunc","objIsArr","othIsArr","objTag","othTag","objIsObj","othIsObj","isSameTag","objIsWrapped","othIsWrapped","objUnwrapped","othUnwrapped","matchData","noCustomizer","srcValue","COMPARE_PARTIAL_FLAG","isFunction","isMasked","toSource","reIsHostCtor","funcProto","Function","objectProto","funcToString","toString","reIsNative","RegExp","replace","test","isLength","typedArrayTags","baseMatches","baseMatchesProperty","identity","property","isPrototype","nativeKeys","nativeKeysIn","isProto","isArrayLike","collection","baseIsMatch","getMatchData","matchesStrictComparable","hasIn","isKey","isStrictComparable","baseGet","Symbol","arrayMap","isSymbol","symbolProto","symbolToString","baseToString","func","cache","stringToPath","arrayBuffer","constructor","byteLength","root","freeExports","nodeType","freeModule","Buffer","allocUnsafe","buffer","copy","cloneArrayBuffer","dataView","byteOffset","reFlags","regexp","exec","lastIndex","symbolValueOf","valueOf","symbol","typedArray","isNew","newValue","getSymbols","getSymbolsIn","coreJsData","eachFunc","fromRight","iterable","e","arraySome","cacheHas","isPartial","arrLength","othLength","arrStacked","othStacked","seen","arrValue","othValue","compared","othIndex","mapToArray","setToArray","name","message","convert","objProps","objLength","objStacked","skipCtor","objCtor","othCtor","baseGetAllKeys","isKeyable","map","baseIsNative","getValue","getPrototype","overArg","getPrototypeOf","arrayFilter","stubArray","propertyIsEnumerable","nativeGetSymbols","getOwnPropertySymbols","mapTag","promiseTag","setTag","weakMapTag","dataViewTag","dataViewCtorString","mapCtorString","promiseCtorString","setCtorString","weakMapCtorString","ArrayBuffer","resolve","Ctor","ctorString","hasFunc","nativeCreate","cloneDataView","cloneRegExp","cloneSymbol","cloneTypedArray","reIsUint","type","reIsDeepProp","reIsPlainProp","uid","maskSrcKey","IE_PROTO","assocIndexOf","splice","pop","getMapData","memoize","freeGlobal","freeProcess","process","nodeUtil","types","require","binding","transform","arg","pairs","LARGE_ARRAY_SIZE","memoizeCapped","rePropName","reEscapeChar","string","charCodeAt","match","number","quote","subString","CLONE_DEEP_FLAG","castFunction","defaultValue","baseHasIn","hasPath","baseIsArguments","stubFalse","baseIsMap","baseUnary","nodeIsMap","objectCtorString","baseIsSet","nodeIsSet","baseIsTypedArray","nodeIsTypedArray","arrayLikeKeys","baseKeys","baseKeysIn","baseIteratee","baseMap","resolver","TypeError","memoized","args","apply","Cache","baseProperty","basePropertyDeep","checkboardCache","c1","c2","serverCanvas","checkboard","document","canvas","ctx","getContext","fillStyle","fillRect","translate","toDataURL","render","Checkboard","white","grey","renderers","borderRadius","boxShadow","children","styles","grid","absolute","background","isValidElement","defaultProps","_createClass","defineProperties","descriptor","enumerable","configurable","writable","Constructor","protoProps","staticProps","_possibleConstructorReturn","self","ReferenceError","Alpha","_ref2","_temp","_this","instance","_classCallCheck","_len","_key","__proto__","concat","handleChange","change","hsl","direction","initialA","container","containerWidth","clientWidth","containerHeight","clientHeight","x","pageX","touches","y","pageY","left","getBoundingClientRect","window","pageXOffset","top","pageYOffset","a","h","l","_a","onChange","handleMouseDown","addEventListener","handleMouseUp","unbindEventListeners","removeEventListener","subClass","superClass","setPrototypeOf","_inherits","_this2","rgb","alpha","radius","overflow","gradient","r","g","b","shadow","position","margin","pointer","slider","marginTop","vertical","overwrite","ref","onMouseDown","onTouchMove","onTouchStart","PureComponent","Component","VALID_KEY_CODES","idCounter","EditableInput","handleBlur","state","blurValue","setState","setUpdatedValue","handleKeyDown","keyCode","Number","getNumberValue","isNaN","getArrowOffset","updatedValue","handleDrag","dragLabel","movementX","dragMax","getValueObjectWithLabel","preventDefault","toUpperCase","inputId","prevProps","prevState","activeElement","_defineProperty","label","arrowOffset","onChangeValue","wrap","cursor","id","onKeyDown","onBlur","placeholder","spellCheck","hideLabel","htmlFor","Hue","_h","_props$direction","hue","padding","className","global","freeSelf","nativeObjectToString","symToStringTag","toStringTag","isOwn","unmasked","srcIndex","mergeFunc","isCommon","isTyped","baseMerge","thisArg","nativeMax","max","start","otherArgs","nativeNow","Date","now","count","lastCalled","stamp","remaining","assigner","sources","guard","Raised","zDepth","_ref$styles","passedStyles","display","content","bg","propTypes","reWhitespace","charAt","reTrimStart","reIsBadHex","reIsBinary","reIsOctal","freeParseInt","parseInt","isBinary","nativeMin","min","wait","options","lastArgs","lastThis","maxWait","timerId","lastCallTime","lastInvokeTime","leading","maxing","trailing","invokeFunc","shouldInvoke","timeSinceLastCall","timerExpired","trailingEdge","setTimeout","timeWaiting","remainingWait","debounced","isInvoking","leadingEdge","clearTimeout","cancel","flush","Saturation","throttle","_container$getBoundin","saturation","bright","v","renderWindow","getContainerRenderWindow","fn","contains","parent","color","black","circle","hsv","_typeof","iterator","trimLeft","trimRight","tinycolor","opts","ok","format","toLowerCase","named","names","matchers","rgba","hsla","hsva","hex8","parseIntFromHex","convertHexToDecimal","hex6","hex4","hex3","stringInputToObject","isValidCSSUnit","bound01","substr","convertToPercentage","floor","f","p","q","mod","hsvToRgb","hue2rgb","hslToRgb","boundAlpha","inputToRGB","_originalInput","_r","_g","_b","_roundA","_format","_gradientType","gradientType","_ok","rgbToHsl","rgbToHsv","rgbToHex","allow3Char","hex","pad2","join","rgbaToArgbHex","convertDecimalToHex","_desaturate","amount","toHsl","clamp01","_saturate","_greyscale","desaturate","_lighten","_brighten","toRgb","_darken","_spin","_complement","polyad","Error","step","_splitcomplement","_analogous","results","slices","part","ret","_monochromatic","toHsv","modification","isDark","getBrightness","isLight","isValid","getOriginalInput","getFormat","getAlpha","getLuminance","RsRGB","GsRGB","BsRGB","pow","setAlpha","toHsvString","toHslString","toHex","toHexString","toHex8","allow4Char","rgbaToHex","toHex8String","toRgbString","toPercentageRgb","toPercentageRgbString","toName","hexNames","toFilter","secondColor","hex8String","secondHex8String","formatSet","formattedString","hasAlpha","clone","_applyModification","lighten","brighten","darken","saturate","greyscale","spin","_applyCombination","analogous","complement","monochromatic","splitcomplement","triad","tetrad","fromRatio","newColor","equals","color1","color2","random","mix","rgb1","rgb2","readability","isReadable","wcag2","wcag2Parms","out","parms","level","validateWCAG2Parms","mostReadable","baseColor","colorList","includeFallbackColors","bestColor","bestScore","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","blanchedalmond","blue","blueviolet","brown","burlywood","burntsienna","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","whitesmoke","yellow","yellowgreen","o","flipped","flip","parseFloat","isOnePointZero","processPercent","isPercentage","abs","val","c","CSS_UNIT","PERMISSIVE_MATCH3","PERMISSIVE_MATCH4","simpleCheckForValidColor","checked","passed","letter","toState","oldHue","isValidHex","lh","getContrastingColor","col","isvalidColorString","Picker","ColorPicker","event","colors","onChangeComplete","debounce","handleSwatchHover","onSwatchHover","optionalEvents","nextProps","Span","_React$Component","Focus","focus","handleFocus","onFocus","_ref$onClick","onClick","onHover","_ref$title","title","_ref$focusStyle","focusStyle","transparent","swatch","outline","onMouseOver","tabIndex","picker","backgroundColor","AlphaPicker","_ref$className","swatches","marginRight","float","marginBottom","Block","triangle","hexCode","card","head","alignItems","justifyContent","body","fontSize","borderStyle","borderWidth","borderColor","marginLeft","border","boxSizing","deepPurple","lightBlue","lightGreen","amber","deepOrange","blueGrey","CircleSwatch","hover","active","circleSize","circleSpacing","transition","Swatch","Circle","flexWrap","ChromeFields","toggleViews","view","includes","showHighlight","currentTarget","hideHighlight","paddingTop","fields","flex","field","paddingLeft","toggle","textAlign","icon","iconHighlight","textTransform","lineHeight","svg","UnfoldMoreHorizontalIcon","onMouseEnter","onMouseOut","Chrome","disableAlpha","defaultView","fontFamily","paddingBottom","controls","zIndex","toggles","dot","opacity","paddingRight","HEXwrap","HEXinput","HEXlabel","RGBwrap","RGBinput","RGBlabel","Compact","compact","hoverSwatch","Github","borderBottomColor","triangleShadow","right","HuePicker","HuePointer","material","borderBottom","Hex","split","third","divider","fieldSymbols","triangleBorder","Extend","leftInside","rightInside","button","backgroundImage","currentColor","new","current","Photoshop","_props","_props$styles","_props$className","previews","actions","header","PhotoshopPointer","onAccept","onCancel","PhotoshopFields","single","double","SketchPresetColors","borderTop","swatchWrap","handleClick","colorObjOrString","isRequired","Sketch","presetColors","sliders","activeColor","first","last","epsilon","Slider","check","CheckIcon","group","Swatches","overflowY","Twitter","hash","hexcode","GooglePointerCircle","GooglePointer","_values","_values2","hsvValue","column","input2","label2","flexGrow","rgbValue","hslValue","Google","autoprefix","_forOwn2","_forOwn3","transforms","msBorderRadius","MozBorderRadius","OBorderRadius","WebkitBorderRadius","msBoxShadow","MozBoxShadow","OBoxShadow","WebkitBoxShadow","userSelect","WebkitTouchCallout","KhtmlUserSelect","MozUserSelect","msUserSelect","WebkitUserSelect","WebkitBoxFlex","MozBoxFlex","WebkitFlex","msFlex","flexBasis","WebkitFlexBasis","WebkitJustifyContent","msTransition","MozTransition","OTransition","WebkitTransition","msTransform","MozTransform","OTransform","WebkitTransform","bottom","otherElementStyles","otherStyle","elements","prefixed","element","expanded","Active","onMouseUp","Hover","handleMouseOver","handleMouseOut","flattenNames","_isString3","_interopRequireDefault","_isPlainObject3","_map3","things","thing","_flattenNames2","_mergeClasses2","_autoprefix2","_hover3","_active2","_loop3","ReactCSS","classes","activations","activeNames","merged","setProp","mergeClasses","_cloneDeep3","toMerge"],"sourceRoot":""} \ No newline at end of file diff --git a/resources/75788f12450d4c5ed494.wasm b/resources/75788f12450d4c5ed494.wasm new file mode 100644 index 0000000..827651b Binary files /dev/null and b/resources/75788f12450d4c5ed494.wasm differ diff --git a/resources/75a0c2dfe07b824c7d21.wasm b/resources/75a0c2dfe07b824c7d21.wasm new file mode 100644 index 0000000..f8b19d1 Binary files /dev/null and b/resources/75a0c2dfe07b824c7d21.wasm differ diff --git a/resources/774.bundle.0171646462dc3c8311f6.js b/resources/774.bundle.0171646462dc3c8311f6.js new file mode 100644 index 0000000..a7deba3 --- /dev/null +++ b/resources/774.bundle.0171646462dc3c8311f6.js @@ -0,0 +1,3 @@ +/*! For license information please see 774.bundle.0171646462dc3c8311f6.js.LICENSE.txt */ +(self.webpackChunk=self.webpackChunk||[]).push([[774],{7087:(A,e,t)=>{"use strict";t.d(e,{IU:()=>C});var r=t(3743),n=t(45451);function o(A,e){const{imagePositionPatient:t}=r.metaData.get("imagePlaneModule",A[0]),o=n.R3.create(),i="wadouri"===A[0].split(":")[0];let s,B;function a(A){const{imagePositionPatient:o}=r.metaData.get("imagePlaneModule",A),i=n.R3.create();return n.R3.sub(i,t,o),n.R3.dot(i,e)}if(n.R3.set(o,t[0],t[1],t[2]),i){const o=[A[0],A[Math.floor(A.length/2)]];s=A;a(o[0])-a(o[1])<0&&s.reverse();const i=r.metaData.get("imagePlaneModule",o[1]);if(!i)throw new Error("Incomplete metadata required for volume construction.");const c=n.R3.create();n.R3.sub(c,t,i.imagePositionPatient);const u=n.R3.dot(c,e);B=Math.abs(u)/Math.floor(A.length/2)}else{const e=A.map((A=>({distance:a(A),imageId:A})));e.sort(((A,e)=>e.distance-A.distance)),s=e.map((A=>A.imageId));const t=e.length;B=Math.abs(e[t-1].distance-e[0].distance)/(t-1)}const{imagePositionPatient:c,sliceThickness:u}=r.metaData.get("imagePlaneModule",s[0]),{strictZSpacingForVolumeViewport:l}=(0,r.getConfiguration)().rendering;0!==B||l||(u?(console.log("Could not calculate zSpacing. Using sliceThickness"),B=u):(console.log("Could not calculate zSpacing. The VolumeViewport visualization is compromised. Setting zSpacing to 1 to render"),B=1));return{zSpacing:B,origin:c,sortedImageIds:s}}const{createUint8SharedArray:i,createFloat32SharedArray:s}=r.utilities;const B=A=>{const e=function(A){const e=(0,r.getRenderingEngines)(),t=[];for(let n=0;nA.id))})}return t}(A);e&&e.length&&e.forEach((({renderingEngine:A,viewportIds:e})=>{A.hasBeenDestroyed||A.renderViewports(e)}))};function a(A,e){const t=A.length,{rescaleSlope:r,rescaleIntercept:n,suvbw:o}=e;if("PT"===e.modality&&"number"==typeof o)for(let e=0;e{const{loadStatus:A}=this;if(!A||!A.loading)return;A.loading=!1,A.cancelled=!0,this.clearLoadCallbacks();r.imageLoadPoolManager.filterRequests((({additionalDetails:A})=>A.volumeId!==this.volumeId))},this.load=(A,e=5)=>{const{imageIds:t,loadStatus:r,numFrames:n}=this;if(!0===r.loading)return void console.log(`loadVolume: Loading is already in progress for ${this.volumeId}`);const{loaded:o}=this.loadStatus,i=t.length;o?A&&A({success:!0,framesLoaded:i,framesProcessed:i,numFrames:n,totalNumFrames:i}):(A&&this.loadStatus.callbacks.push(A),this._prefetchImageIds(e))},this.getImageIdsRequests=(A,e,t)=>{const{loadStatus:n}=this,{cachedFrames:o}=n,{vtkOpenGLTexture:i,imageData:s,metadata:a,volumeId:u}=this,{FrameOfReferenceUID:l}=a,g=e.buffer,w=A.length,Q=e.length/w,f=g.byteLength/w;let h;if(e instanceof Uint8Array)h="Uint8Array";else if(e instanceof Float32Array)h="Float32Array";else if(e instanceof Uint16Array)h="Uint16Array";else{if(!(e instanceof Int16Array))throw new Error("Unsupported array type");h="Int16Array"}const C=this.imageIds.length,U=!0;let F,d;function p(A){if(U&&(A.framesProcessed>d||A.framesProcessed===A.totalNumFrames)&&(d+=F,B(u)),A.framesProcessed===A.totalNumFrames){n.callbacks.forEach((e=>e(A)));const e={FrameOfReferenceUID:l,volumeId:u};(0,r.triggerEvent)(r.eventTarget,r.Enums.Events.IMAGE_VOLUME_LOADING_COMPLETED,e)}}U&&(F=.02*C,d=F);const H=(A,e,t)=>{const B=this._imageIdIndexToFrameIndex(e);o[e]=!0,this.framesLoaded++,this.framesProcessed++,i.setUpdatedFrame(B),s.modified();const a={FrameOfReferenceUID:l,imageVolume:A};(0,r.triggerEvent)(r.eventTarget,r.Enums.Events.IMAGE_VOLUME_MODIFIED,a),this.framesProcessed===C?(n.loaded=!0,n.loading=!1,p({success:!0,imageIdIndex:e,imageId:t,framesLoaded:this.framesLoaded,framesProcessed:this.framesProcessed,numFrames:w,totalNumFrames:C}),n.callbacks=[]):p({success:!0,imageIdIndex:e,imageId:t,framesLoaded:this.framesLoaded,framesProcessed:this.framesProcessed,numFrames:w,totalNumFrames:C})},y=(A,t,o)=>{const i=this._imageIdIndexToFrameIndex(A),s=r.cache.getCachedImageBasedOnImageURI(t),B=r.cache.getVolumeContainingImageId(t);if(n.cancelled)return void console.warn("volume load cancelled, returning for imageIdIndex: ",A);if(!(s?.image||B&&B.volume!==this))return H(this,A,t);const a=!!s,c=s||B.volume;this.handleImageComingFromCache(c,a,o,e,i,g,H,A,t,I)};function I(A,e,t){this.framesProcessed++,this.framesProcessed===C?(n.loaded=!0,n.loading=!1,p({success:!1,imageId:t,imageIdIndex:e,error:A,framesLoaded:this.framesLoaded,framesProcessed:this.framesProcessed,numFrames:w,totalNumFrames:C}),n.callbacks=[]):p({success:!1,imageId:t,imageIdIndex:e,error:A,framesLoaded:this.framesLoaded,framesProcessed:this.framesProcessed,numFrames:w,totalNumFrames:C});const o={error:A,imageIdIndex:e,imageId:t};(0,r.triggerEvent)(r.eventTarget,r.Enums.Events.IMAGE_LOAD_ERROR,o)}const E=A.map(((A,n)=>{const i=this.getImageIdIndex(A);if(o[i])return this.framesLoaded++,void this.framesProcessed++;const s=r.metaData.get("modalityLutModule",A)||{},B=r.metaData.get("generalSeriesModule",A)||{},a={rescaleSlope:s.rescaleSlope,rescaleIntercept:s.rescaleIntercept,modality:B.modality};if("PT"===a.modality){const e=r.metaData.get("scalingModule",A);e&&(this._addScalingToVolume(e),a.suvbw=e.suvbw)}const u="number"==typeof a.rescaleSlope&&"number"==typeof a.rescaleIntercept;this.isPreScaled=u;return{callLoadImage:(A,t,n)=>r.imageLoader.loadImage(A,n).then((r=>{!function(A,e,t){if(!(A.buffer instanceof ArrayBuffer))return;const r=t.targetBuffer.offset,n=t.targetBuffer.length,o=e.pixelData?e.pixelData:e.getPixelData();try{if(A instanceof Float32Array){const e=4,t=new Float32Array(o);if(t.length!==n)throw"Error pixelData length does not match frame length";A.set(t,r/e)}if(A instanceof Int16Array){const e=2,t=new Int16Array(o);if(t.length!==n)throw"Error pixelData length does not match frame length";A.set(t,r/e)}if(A instanceof Uint16Array){const e=2,t=new Uint16Array(o);if(t.length!==n)throw"Error pixelData length does not match frame length";A.set(t,r/e)}if(A instanceof Uint8Array){const e=1,t=new Uint8Array(o);if(t.length!==n)throw"Error pixelData length does not match frame length";A.set(t,r/e)}}catch(A){console.error(A)}}(e,r,n),y(t,A,a)}),(e=>{I.call(this,e,t,A)})),imageId:A,imageIdIndex:i,options:{targetBuffer:{arrayBuffer:g instanceof ArrayBuffer?void 0:g,offset:n*f,length:Q,type:h},skipCreateImage:!0,preScale:{enabled:!0,scalingParameters:a}},priority:t,requestType:c,additionalDetails:{volumeId:this.volumeId}}}));return E},this.imageIds=e.imageIds,this.loadStatus=e.loadStatus,this.numFrames=this._getNumFrames(),this._createCornerstoneImageMetaData()}_getNumFrames(){const{imageIds:A,scalarData:e}=this,t=this.isDynamicVolume()?e.length:1;return A.length/t}_getScalarDataLength(){const{scalarData:A}=this;return this.isDynamicVolume()?A[0].length:A.length}_createCornerstoneImageMetaData(){const{numFrames:A}=this;if(0===A)return;const e=this.sizeInBytes/A,t=this._getScalarDataLength()/this.numVoxels,r=this.dimensions[0]*this.dimensions[1]*t,{PhotometricInterpretation:n,voiLut:o,VOILUTFunction:i}=this.metadata;let s=[],B=[];o&&o.length&&(s=o.map((A=>A.windowCenter)),B=o.map((A=>A.windowWidth)));const a=t>1;this.cornerstoneImageMetaData={bytesPerImage:e,numComponents:t,pixelsPerImage:r,windowCenter:s,windowWidth:B,color:a,rgba:!1,spacing:this.spacing,dimensions:this.dimensions,photometricInterpretation:n,voiLUTFunction:i,invert:"MONOCHROME1"===n}}_imageIdIndexToFrameIndex(A){return A%this.numFrames}getScalarDataArrays(){return this.isDynamicVolume()?this.scalarData:[this.scalarData]}_getScalarDataByImageIdIndex(A){if(A<0||A>=this.imageIds.length)throw new Error("imageIdIndex out of range");return this.getScalarDataArrays()[Math.floor(A/this.numFrames)]}invalidateVolume(A){const{imageData:e,vtkOpenGLTexture:t}=this,{numFrames:r}=this;for(let A=0;A{const e=this._scaleIfNecessary(A,t),{pixelsPerImage:a,bytesPerImage:c}=this.cornerstoneImageMetaData,u=r.constructor;let l=c*n;const g=c/a;r.BYTES_PER_ELEMENT!==g&&(l*=r.BYTES_PER_ELEMENT/g);new u(o,l,a).set(e),i(this,s,B)})).catch((A=>{a.call(this,A,s,B)}))}getImageLoadRequests(A){throw new Error("Abstract method")}_prefetchImageIds(A){this.loadStatus.loading=!0;this.getImageLoadRequests(A).reverse().forEach((A=>{if(!A)return;const{callLoadImage:e,imageId:t,imageIdIndex:n,options:o,priority:i,requestType:s,additionalDetails:B}=A;r.imageLoadPoolManager.addRequest(e.bind(this,t,n,o),s,B,i)}))}_scaleIfNecessary(A,e){const t=A.preScale?.scaled,r=!e||!e.rescaleIntercept||!e.rescaleSlope;if(!t&&r)return A.getPixelData().slice(0);if(!t&&e&&void 0!==e.rescaleIntercept&&void 0!==e.rescaleSlope){return a(A.getPixelData().slice(0),e)}const{rescaleSlope:n,rescaleIntercept:o,suvbw:i}=e,{rescaleSlope:s,rescaleIntercept:B,suvbw:c}=A.preScale.scalingParameters;if(n===s&&o===B&&i===c)return A.getPixelData();const u=i/c,l=n/s,g=o-B*l;return a(A.getPixelData().slice(0),{...e,rescaleSlope:l,rescaleIntercept:g,suvbw:u})}_addScalingToVolume(A){if(this.scaling)return;const{suvbw:e,suvlbm:t,suvbsa:r}=A,n={};t&&(n.suvbwToSuvlbm=t/e),r&&(n.suvbwToSuvbsa=r/e),e&&(n.suvbw=e),this.scaling={PT:n}}_removeFromCache(){r.cache.removeVolumeLoadObject(this.volumeId)}getCornerstoneImage(A,e){const{imageIds:t}=this,n=this._imageIdIndexToFrameIndex(e),{bytesPerImage:o,pixelsPerImage:i,windowCenter:s,windowWidth:B,numComponents:a,color:c,dimensions:l,spacing:g,invert:w,voiLUTFunction:Q,photometricInterpretation:f}=this.cornerstoneImageMetaData,h=this._getScalarDataByImageIdIndex(e),C=h.buffer,U=h.constructor,F=o/i;let d=o*n;h.BYTES_PER_ELEMENT!==F&&(d*=h.BYTES_PER_ELEMENT/F);const p=new U(i),H=new U(C,d,i);p.set(H);const y=t[e],I=r.metaData.get("modalityLutModule",y)||{},E=u(p);return{imageId:A,intercept:I.rescaleIntercept?I.rescaleIntercept:0,windowCenter:s,windowWidth:B,voiLUTFunction:Q,color:c,rgba:!1,numComps:a,rows:l[1],columns:l[0],sizeInBytes:p.byteLength,getPixelData:()=>p,minPixelValue:E.min,maxPixelValue:E.max,slope:I.rescaleSlope?I.rescaleSlope:1,getCanvas:void 0,height:l[0],width:l[1],columnPixelSpacing:g[0],rowPixelSpacing:g[1],invert:w,photometricInterpretation:f}}convertToCornerstoneImage(A,e){return this.getCornerstoneImageLoadObject(A,e)}getCornerstoneImageLoadObject(A,e){const t=this.getCornerstoneImage(A,e);return{promise:Promise.resolve(t)}}getCornerstoneImages(){const{imageIds:A}=this;return A.map(((A,e)=>this.getCornerstoneImage(A,e)))}_convertToImages(){const A=this.sizeInBytes,e=this.imageIds.length,{bytesPerImage:t}=this.cornerstoneImageMetaData;let n=r.cache.decacheIfNecessaryUntilBytesAvailable(A,this.imageIds);for(let A=0;A{console.error(A)})),n<=t)break}this._removeFromCache()}decache(A=!1){A?this._removeFromCache():this._convertToImages()}}class g extends l{constructor(A,e){super(A,e),this.getImageLoadRequests=A=>{const{imageIds:e}=this,t=this.scalarData;return this.getImageIdsRequests(e,t,A)}}getScalarData(){return this.scalarData}}const{createUint8SharedArray:w,createFloat32SharedArray:Q,createUint16SharedArray:f,createInt16SharedArray:h}=r.utilities;const C=function(A,e){if(!e||!e.imageIds||!e.imageIds.length)throw new Error("ImageIds must be provided to create a streaming image volume");const{useNorm16Texture:t,preferSizeOverAccuracy:i}=(0,r.getConfiguration)().rendering,s=t||i,B=async function(){if("wadouri"===e.imageIds[0].split(":")[0]){const[t,n]=[Math.floor(e.imageIds.length/2),e.imageIds.length-1],o=[0,t,n];await Promise.all(o.map((t=>new Promise(((n,o)=>{const i=e.imageIds[t];r.imageLoadPoolManager.addRequest((async()=>{r.imageLoader.loadImage(i).then((()=>{console.log(`Prefetched imageId: ${i}`),n(!0)})).catch((A=>{o(A)}))}),r.Enums.RequestType.Prefetch,{volumeId:A},1)}))))).catch(console.error)}const{imageIds:t}=e,i=function(A){const e=A[0],{pixelRepresentation:t,bitsAllocated:n,bitsStored:o,highBit:i,photometricInterpretation:s,samplesPerPixel:B}=r.metaData.get("imagePixelModule",e),a=[],c=r.metaData.get("voiLutModule",e);let u;if(c){const{windowWidth:A,windowCenter:e}=c;if(u=c?.voiLUTFunction,Array.isArray(A))for(let t=0;t{if(!r.cache.isCacheable(A))throw new Error(r.Enums.Events.CACHE_SIZE_EXCEEDED);r.cache.decacheIfNecessaryUntilBytesAvailable(A)};let G,V;switch(l){case 8:if(S)throw new Error("8 Bit signed images are not yet supported by this plugin.");V=T*_,O(V),G=M?w(T*_):new Uint8Array(T*_);break;case 16:if(!s||u){V=4*T,G=M?Q(T):new Float32Array(T);break}if(V=2*T,S||c){O(V),G=M?h(T):new Int16Array(T);break}if(!S&&!c){O(V),G=M?f(T):new Uint16Array(T);break}V=4*T,O(V),G=M?Q(T):new Float32Array(T);break;case 24:V=T*_,O(V),G=M?w(T*_):new Uint8Array(T*_)}return new g({volumeId:A,metadata:i,dimensions:D,spacing:L,origin:v,direction:x,scalarData:G,sizeInBytes:V},{imageIds:K,loadStatus:{loaded:!1,loading:!1,cancelled:!1,cachedFrames:[],callbacks:[]}})}();return{promise:B,decache:()=>{B.then((A=>{A.destroy(),A=null}))},cancel:()=>{B.then((A=>{A.cancelLoading()}))}}}},76010:(A,e,t)=>{"use strict";t.d(e,{Z:()=>mi});var r=function(A,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(A,e){A.__proto__=e}||function(A,e){for(var t in e)Object.prototype.hasOwnProperty.call(e,t)&&(A[t]=e[t])},r(A,e)};function n(A,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function t(){this.constructor=A}r(A,e),A.prototype=null===e?Object.create(e):(t.prototype=e.prototype,new t)}var o=function(){return o=Object.assign||function(A){for(var e,t=1,r=arguments.length;t0&&n[n.length-1])||6!==o[0]&&2!==o[0])){i=0;continue}if(3===o[0]&&(!n||o[1]>n[0]&&o[1]=55296&&n<=56319&&t>10),i%1024+56320)),(n+1===t||r.length>16384)&&(o+=String.fromCharCode.apply(String,r),r.length=0)}return o},g="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",w="undefined"==typeof Uint8Array?[]:new Uint8Array(256),Q=0;Q<64;Q++)w[g.charCodeAt(Q)]=Q;for(var f="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",h="undefined"==typeof Uint8Array?[]:new Uint8Array(256),C=0;C<64;C++)h[f.charCodeAt(C)]=C;for(var U=function(A,e,t){return A.slice?A.slice(e,t):new Uint16Array(Array.prototype.slice.call(A,e,t))},F=function(){function A(A,e,t,r,n,o){this.initialValue=A,this.errorValue=e,this.highStart=t,this.highValueIndex=r,this.index=n,this.data=o}return A.prototype.get=function(A){var e;if(A>=0){if(A<55296||A>56319&&A<=65535)return e=((e=this.index[A>>5])<<2)+(31&A),this.data[e];if(A<=65535)return e=((e=this.index[2048+(A-55296>>5)])<<2)+(31&A),this.data[e];if(A>11),e=this.index[e],e+=A>>5&63,e=((e=this.index[e])<<2)+(31&A),this.data[e];if(A<=1114111)return this.data[this.highValueIndex]}return this.errorValue},A}(),d="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",p="undefined"==typeof Uint8Array?[]:new Uint8Array(256),H=0;H<64;H++)p[d.charCodeAt(H)]=H;var y=10,I=13,E=15,m=17,v=18,K=19,b=20,L=21,D=22,x=24,S=25,_=26,M=27,T=28,O=30,G=32,V=33,R=34,k=35,P=37,N=38,X=39,J=40,W=42,Y=[9001,65288],Z="×",j="÷",z=function(A,e){var t,r,n,o=function(A){var e,t,r,n,o,i=.75*A.length,s=A.length,B=0;"="===A[A.length-1]&&(i--,"="===A[A.length-2]&&i--);var a="undefined"!=typeof ArrayBuffer&&"undefined"!=typeof Uint8Array&&void 0!==Uint8Array.prototype.slice?new ArrayBuffer(i):new Array(i),c=Array.isArray(a)?a:new Uint8Array(a);for(e=0;e>4,c[B++]=(15&r)<<4|n>>2,c[B++]=(3&n)<<6|63&o;return a}(A),i=Array.isArray(o)?function(A){for(var e=A.length,t=[],r=0;r0;){var i=r[--o];if(Array.isArray(A)?-1!==A.indexOf(i):A===i)for(var s=t;s<=r.length;){var B;if((B=r[++s])===e)return!0;if(B!==y)break}if(i!==y)break}return!1},iA=function(A,e){for(var t=A;t>=0;){var r=e[t];if(r!==y)return r;t--}return 0},sA=function(A,e,t,r,n){if(0===t[r])return Z;var o=r-1;if(Array.isArray(n)&&!0===n[o])return Z;var i=o-1,s=o+1,B=e[o],a=i>=0?e[i]:0,c=e[s];if(2===B&&3===c)return Z;if(-1!==$.indexOf(B))return"!";if(-1!==$.indexOf(c))return Z;if(-1!==AA.indexOf(c))return Z;if(8===iA(o,e))return j;if(11===z.get(A[o]))return Z;if((B===G||B===V)&&11===z.get(A[s]))return Z;if(7===B||7===c)return Z;if(9===B)return Z;if(-1===[y,I,E].indexOf(B)&&9===c)return Z;if(-1!==[m,v,K,x,T].indexOf(c))return Z;if(iA(o,e)===D)return Z;if(oA(23,D,o,e))return Z;if(oA([m,v],L,o,e))return Z;if(oA(12,12,o,e))return Z;if(B===y)return j;if(23===B||23===c)return Z;if(16===c||16===B)return j;if(-1!==[I,E,L].indexOf(c)||14===B)return Z;if(36===a&&-1!==nA.indexOf(B))return Z;if(B===T&&36===c)return Z;if(c===b)return Z;if(-1!==q.indexOf(c)&&B===S||-1!==q.indexOf(B)&&c===S)return Z;if(B===M&&-1!==[P,G,V].indexOf(c)||-1!==[P,G,V].indexOf(B)&&c===_)return Z;if(-1!==q.indexOf(B)&&-1!==eA.indexOf(c)||-1!==eA.indexOf(B)&&-1!==q.indexOf(c))return Z;if(-1!==[M,_].indexOf(B)&&(c===S||-1!==[D,E].indexOf(c)&&e[s+1]===S)||-1!==[D,E].indexOf(B)&&c===S||B===S&&-1!==[S,T,x].indexOf(c))return Z;if(-1!==[S,T,x,m,v].indexOf(c))for(var u=o;u>=0;){if((l=e[u])===S)return Z;if(-1===[T,x].indexOf(l))break;u--}if(-1!==[M,_].indexOf(c))for(u=-1!==[m,v].indexOf(B)?i:o;u>=0;){var l;if((l=e[u])===S)return Z;if(-1===[T,x].indexOf(l))break;u--}if(N===B&&-1!==[N,X,R,k].indexOf(c)||-1!==[X,R].indexOf(B)&&-1!==[X,J].indexOf(c)||-1!==[J,k].indexOf(B)&&c===J)return Z;if(-1!==rA.indexOf(B)&&-1!==[b,_].indexOf(c)||-1!==rA.indexOf(c)&&B===M)return Z;if(-1!==q.indexOf(B)&&-1!==q.indexOf(c))return Z;if(B===x&&-1!==q.indexOf(c))return Z;if(-1!==q.concat(S).indexOf(B)&&c===D&&-1===Y.indexOf(A[s])||-1!==q.concat(S).indexOf(c)&&B===v)return Z;if(41===B&&41===c){for(var g=t[o],w=1;g>0&&41===e[--g];)w++;if(w%2!=0)return Z}return B===G&&c===V?Z:j},BA=function(A,e){e||(e={lineBreak:"normal",wordBreak:"normal"});var t=function(A,e){void 0===e&&(e="strict");var t=[],r=[],n=[];return A.forEach((function(A,o){var i=z.get(A);if(i>50?(n.push(!0),i-=50):n.push(!1),-1!==["normal","auto","loose"].indexOf(e)&&-1!==[8208,8211,12316,12448].indexOf(A))return r.push(o),t.push(16);if(4===i||11===i){if(0===o)return r.push(o),t.push(O);var s=t[o-1];return-1===tA.indexOf(s)?(r.push(r[o-1]),t.push(s)):(r.push(o),t.push(O))}return r.push(o),31===i?t.push("strict"===e?L:P):i===W||29===i?t.push(O):43===i?A>=131072&&A<=196605||A>=196608&&A<=262141?t.push(P):t.push(O):void t.push(i)})),[r,t,n]}(A,e.lineBreak),r=t[0],n=t[1],o=t[2];"break-all"!==e.wordBreak&&"break-word"!==e.wordBreak||(n=n.map((function(A){return-1!==[S,O,W].indexOf(A)?P:A})));var i="keep-all"===e.wordBreak?o.map((function(e,t){return e&&A[t]>=19968&&A[t]<=40959})):void 0;return[r,n,i]},aA=function(){function A(A,e,t,r){this.codePoints=A,this.required="!"===e,this.start=t,this.end=r}return A.prototype.slice=function(){return l.apply(void 0,this.codePoints.slice(this.start,this.end))},A}(),cA=45,uA=43,lA=-1,gA=function(A){return A>=48&&A<=57},wA=function(A){return gA(A)||A>=65&&A<=70||A>=97&&A<=102},QA=function(A){return 10===A||9===A||32===A},fA=function(A){return function(A){return function(A){return A>=97&&A<=122}(A)||function(A){return A>=65&&A<=90}(A)}(A)||function(A){return A>=128}(A)||95===A},hA=function(A){return fA(A)||gA(A)||A===cA},CA=function(A){return A>=0&&A<=8||11===A||A>=14&&A<=31||127===A},UA=function(A,e){return 92===A&&10!==e},FA=function(A,e,t){return A===cA?fA(e)||UA(e,t):!!fA(A)||!(92!==A||!UA(A,e))},dA=function(A,e,t){return A===uA||A===cA?!!gA(e)||46===e&&gA(t):gA(46===A?e:A)},pA=function(A){var e=0,t=1;A[e]!==uA&&A[e]!==cA||(A[e]===cA&&(t=-1),e++);for(var r=[];gA(A[e]);)r.push(A[e++]);var n=r.length?parseInt(l.apply(void 0,r),10):0;46===A[e]&&e++;for(var o=[];gA(A[e]);)o.push(A[e++]);var i=o.length,s=i?parseInt(l.apply(void 0,o),10):0;69!==A[e]&&101!==A[e]||e++;var B=1;A[e]!==uA&&A[e]!==cA||(A[e]===cA&&(B=-1),e++);for(var a=[];gA(A[e]);)a.push(A[e++]);var c=a.length?parseInt(l.apply(void 0,a),10):0;return t*(n+s*Math.pow(10,-i))*Math.pow(10,B*c)},HA={type:2},yA={type:3},IA={type:4},EA={type:13},mA={type:8},vA={type:21},KA={type:9},bA={type:10},LA={type:11},DA={type:12},xA={type:14},SA={type:23},_A={type:1},MA={type:25},TA={type:24},OA={type:26},GA={type:27},VA={type:28},RA={type:29},kA={type:31},PA={type:32},NA=function(){function A(){this._value=[]}return A.prototype.write=function(A){this._value=this._value.concat(u(A))},A.prototype.read=function(){for(var A=[],e=this.consumeToken();e!==PA;)A.push(e),e=this.consumeToken();return A},A.prototype.consumeToken=function(){var A=this.consumeCodePoint();switch(A){case 34:return this.consumeStringToken(34);case 35:var e=this.peekCodePoint(0),t=this.peekCodePoint(1),r=this.peekCodePoint(2);if(hA(e)||UA(t,r)){var n=FA(e,t,r)?2:1;return{type:5,value:this.consumeName(),flags:n}}break;case 36:if(61===this.peekCodePoint(0))return this.consumeCodePoint(),EA;break;case 39:return this.consumeStringToken(39);case 40:return HA;case 41:return yA;case 42:if(61===this.peekCodePoint(0))return this.consumeCodePoint(),xA;break;case uA:if(dA(A,this.peekCodePoint(0),this.peekCodePoint(1)))return this.reconsumeCodePoint(A),this.consumeNumericToken();break;case 44:return IA;case cA:var o=A,i=this.peekCodePoint(0),s=this.peekCodePoint(1);if(dA(o,i,s))return this.reconsumeCodePoint(A),this.consumeNumericToken();if(FA(o,i,s))return this.reconsumeCodePoint(A),this.consumeIdentLikeToken();if(i===cA&&62===s)return this.consumeCodePoint(),this.consumeCodePoint(),TA;break;case 46:if(dA(A,this.peekCodePoint(0),this.peekCodePoint(1)))return this.reconsumeCodePoint(A),this.consumeNumericToken();break;case 47:if(42===this.peekCodePoint(0))for(this.consumeCodePoint();;){var B=this.consumeCodePoint();if(42===B&&47===(B=this.consumeCodePoint()))return this.consumeToken();if(B===lA)return this.consumeToken()}break;case 58:return OA;case 59:return GA;case 60:if(33===this.peekCodePoint(0)&&this.peekCodePoint(1)===cA&&this.peekCodePoint(2)===cA)return this.consumeCodePoint(),this.consumeCodePoint(),MA;break;case 64:var a=this.peekCodePoint(0),c=this.peekCodePoint(1),u=this.peekCodePoint(2);if(FA(a,c,u))return{type:7,value:this.consumeName()};break;case 91:return VA;case 92:if(UA(A,this.peekCodePoint(0)))return this.reconsumeCodePoint(A),this.consumeIdentLikeToken();break;case 93:return RA;case 61:if(61===this.peekCodePoint(0))return this.consumeCodePoint(),mA;break;case 123:return LA;case 125:return DA;case 117:case 85:var g=this.peekCodePoint(0),w=this.peekCodePoint(1);return g!==uA||!wA(w)&&63!==w||(this.consumeCodePoint(),this.consumeUnicodeRangeToken()),this.reconsumeCodePoint(A),this.consumeIdentLikeToken();case 124:if(61===this.peekCodePoint(0))return this.consumeCodePoint(),KA;if(124===this.peekCodePoint(0))return this.consumeCodePoint(),vA;break;case 126:if(61===this.peekCodePoint(0))return this.consumeCodePoint(),bA;break;case lA:return PA}return QA(A)?(this.consumeWhiteSpace(),kA):gA(A)?(this.reconsumeCodePoint(A),this.consumeNumericToken()):fA(A)?(this.reconsumeCodePoint(A),this.consumeIdentLikeToken()):{type:6,value:l(A)}},A.prototype.consumeCodePoint=function(){var A=this._value.shift();return void 0===A?-1:A},A.prototype.reconsumeCodePoint=function(A){this._value.unshift(A)},A.prototype.peekCodePoint=function(A){return A>=this._value.length?-1:this._value[A]},A.prototype.consumeUnicodeRangeToken=function(){for(var A=[],e=this.consumeCodePoint();wA(e)&&A.length<6;)A.push(e),e=this.consumeCodePoint();for(var t=!1;63===e&&A.length<6;)A.push(e),e=this.consumeCodePoint(),t=!0;if(t)return{type:30,start:parseInt(l.apply(void 0,A.map((function(A){return 63===A?48:A}))),16),end:parseInt(l.apply(void 0,A.map((function(A){return 63===A?70:A}))),16)};var r=parseInt(l.apply(void 0,A),16);if(this.peekCodePoint(0)===cA&&wA(this.peekCodePoint(1))){this.consumeCodePoint(),e=this.consumeCodePoint();for(var n=[];wA(e)&&n.length<6;)n.push(e),e=this.consumeCodePoint();return{type:30,start:r,end:parseInt(l.apply(void 0,n),16)}}return{type:30,start:r,end:r}},A.prototype.consumeIdentLikeToken=function(){var A=this.consumeName();return"url"===A.toLowerCase()&&40===this.peekCodePoint(0)?(this.consumeCodePoint(),this.consumeUrlToken()):40===this.peekCodePoint(0)?(this.consumeCodePoint(),{type:19,value:A}):{type:20,value:A}},A.prototype.consumeUrlToken=function(){var A=[];if(this.consumeWhiteSpace(),this.peekCodePoint(0)===lA)return{type:22,value:""};var e=this.peekCodePoint(0);if(39===e||34===e){var t=this.consumeStringToken(this.consumeCodePoint());return 0===t.type&&(this.consumeWhiteSpace(),this.peekCodePoint(0)===lA||41===this.peekCodePoint(0))?(this.consumeCodePoint(),{type:22,value:t.value}):(this.consumeBadUrlRemnants(),SA)}for(;;){var r=this.consumeCodePoint();if(r===lA||41===r)return{type:22,value:l.apply(void 0,A)};if(QA(r))return this.consumeWhiteSpace(),this.peekCodePoint(0)===lA||41===this.peekCodePoint(0)?(this.consumeCodePoint(),{type:22,value:l.apply(void 0,A)}):(this.consumeBadUrlRemnants(),SA);if(34===r||39===r||40===r||CA(r))return this.consumeBadUrlRemnants(),SA;if(92===r){if(!UA(r,this.peekCodePoint(0)))return this.consumeBadUrlRemnants(),SA;A.push(this.consumeEscapedCodePoint())}else A.push(r)}},A.prototype.consumeWhiteSpace=function(){for(;QA(this.peekCodePoint(0));)this.consumeCodePoint()},A.prototype.consumeBadUrlRemnants=function(){for(;;){var A=this.consumeCodePoint();if(41===A||A===lA)return;UA(A,this.peekCodePoint(0))&&this.consumeEscapedCodePoint()}},A.prototype.consumeStringSlice=function(A){for(var e="";A>0;){var t=Math.min(5e4,A);e+=l.apply(void 0,this._value.splice(0,t)),A-=t}return this._value.shift(),e},A.prototype.consumeStringToken=function(A){for(var e="",t=0;;){var r=this._value[t];if(r===lA||void 0===r||r===A)return{type:0,value:e+=this.consumeStringSlice(t)};if(10===r)return this._value.splice(0,t),_A;if(92===r){var n=this._value[t+1];n!==lA&&void 0!==n&&(10===n?(e+=this.consumeStringSlice(t),t=-1,this._value.shift()):UA(r,n)&&(e+=this.consumeStringSlice(t),e+=l(this.consumeEscapedCodePoint()),t=-1))}t++}},A.prototype.consumeNumber=function(){var A=[],e=4,t=this.peekCodePoint(0);for(t!==uA&&t!==cA||A.push(this.consumeCodePoint());gA(this.peekCodePoint(0));)A.push(this.consumeCodePoint());t=this.peekCodePoint(0);var r=this.peekCodePoint(1);if(46===t&&gA(r))for(A.push(this.consumeCodePoint(),this.consumeCodePoint()),e=8;gA(this.peekCodePoint(0));)A.push(this.consumeCodePoint());t=this.peekCodePoint(0),r=this.peekCodePoint(1);var n=this.peekCodePoint(2);if((69===t||101===t)&&((r===uA||r===cA)&&gA(n)||gA(r)))for(A.push(this.consumeCodePoint(),this.consumeCodePoint()),e=8;gA(this.peekCodePoint(0));)A.push(this.consumeCodePoint());return[pA(A),e]},A.prototype.consumeNumericToken=function(){var A=this.consumeNumber(),e=A[0],t=A[1],r=this.peekCodePoint(0),n=this.peekCodePoint(1),o=this.peekCodePoint(2);return FA(r,n,o)?{type:15,number:e,flags:t,unit:this.consumeName()}:37===r?(this.consumeCodePoint(),{type:16,number:e,flags:t}):{type:17,number:e,flags:t}},A.prototype.consumeEscapedCodePoint=function(){var A=this.consumeCodePoint();if(wA(A)){for(var e=l(A);wA(this.peekCodePoint(0))&&e.length<6;)e+=l(this.consumeCodePoint());QA(this.peekCodePoint(0))&&this.consumeCodePoint();var t=parseInt(e,16);return 0===t||function(A){return A>=55296&&A<=57343}(t)||t>1114111?65533:t}return A===lA?65533:A},A.prototype.consumeName=function(){for(var A="";;){var e=this.consumeCodePoint();if(hA(e))A+=l(e);else{if(!UA(e,this.peekCodePoint(0)))return this.reconsumeCodePoint(e),A;A+=l(this.consumeEscapedCodePoint())}}},A}(),XA=function(){function A(A){this._tokens=A}return A.create=function(e){var t=new NA;return t.write(e),new A(t.read())},A.parseValue=function(e){return A.create(e).parseComponentValue()},A.parseValues=function(e){return A.create(e).parseComponentValues()},A.prototype.parseComponentValue=function(){for(var A=this.consumeToken();31===A.type;)A=this.consumeToken();if(32===A.type)throw new SyntaxError("Error parsing CSS component value, unexpected EOF");this.reconsumeToken(A);var e=this.consumeComponentValue();do{A=this.consumeToken()}while(31===A.type);if(32===A.type)return e;throw new SyntaxError("Error parsing CSS component value, multiple values found when expecting only one")},A.prototype.parseComponentValues=function(){for(var A=[];;){var e=this.consumeComponentValue();if(32===e.type)return A;A.push(e),A.push()}},A.prototype.consumeComponentValue=function(){var A=this.consumeToken();switch(A.type){case 11:case 28:case 2:return this.consumeSimpleBlock(A.type);case 19:return this.consumeFunction(A)}return A},A.prototype.consumeSimpleBlock=function(A){for(var e={type:A,values:[]},t=this.consumeToken();;){if(32===t.type||Ae(t,A))return e;this.reconsumeToken(t),e.values.push(this.consumeComponentValue()),t=this.consumeToken()}},A.prototype.consumeFunction=function(A){for(var e={name:A.value,values:[],type:18};;){var t=this.consumeToken();if(32===t.type||3===t.type)return e;this.reconsumeToken(t),e.values.push(this.consumeComponentValue())}},A.prototype.consumeToken=function(){var A=this._tokens.shift();return void 0===A?PA:A},A.prototype.reconsumeToken=function(A){this._tokens.unshift(A)},A}(),JA=function(A){return 15===A.type},WA=function(A){return 17===A.type},YA=function(A){return 20===A.type},ZA=function(A){return 0===A.type},jA=function(A,e){return YA(A)&&A.value===e},zA=function(A){return 31!==A.type},qA=function(A){return 31!==A.type&&4!==A.type},$A=function(A){var e=[],t=[];return A.forEach((function(A){if(4===A.type){if(0===t.length)throw new Error("Error parsing function args, zero tokens for arg");return e.push(t),void(t=[])}31!==A.type&&t.push(A)})),t.length&&e.push(t),e},Ae=function(A,e){return 11===e&&12===A.type||(28===e&&29===A.type||2===e&&3===A.type)},ee=function(A){return 17===A.type||15===A.type},te=function(A){return 16===A.type||ee(A)},re=function(A){return A.length>1?[A[0],A[1]]:[A[0]]},ne={type:17,number:0,flags:4},oe={type:16,number:50,flags:4},ie={type:16,number:100,flags:4},se=function(A,e,t){var r=A[0],n=A[1];return[Be(r,e),Be(void 0!==n?n:r,t)]},Be=function(A,e){if(16===A.type)return A.number/100*e;if(JA(A))switch(A.unit){case"rem":case"em":return 16*A.number;default:return A.number}return A.number},ae="grad",ce="turn",ue=function(A,e){if(15===e.type)switch(e.unit){case"deg":return Math.PI*e.number/180;case ae:return Math.PI/200*e.number;case"rad":return e.number;case ce:return 2*Math.PI*e.number}throw new Error("Unsupported angle type")},le=function(A){return 15===A.type&&("deg"===A.unit||A.unit===ae||"rad"===A.unit||A.unit===ce)},ge=function(A){switch(A.filter(YA).map((function(A){return A.value})).join(" ")){case"to bottom right":case"to right bottom":case"left top":case"top left":return[ne,ne];case"to top":case"bottom":return we(0);case"to bottom left":case"to left bottom":case"right top":case"top right":return[ne,ie];case"to right":case"left":return we(90);case"to top left":case"to left top":case"right bottom":case"bottom right":return[ie,ie];case"to bottom":case"top":return we(180);case"to top right":case"to right top":case"left bottom":case"bottom left":return[ie,ne];case"to left":case"right":return we(270)}return 0},we=function(A){return Math.PI*A/180},Qe=function(A,e){if(18===e.type){var t=He[e.name];if(void 0===t)throw new Error('Attempting to parse an unsupported color function "'+e.name+'"');return t(A,e.values)}if(5===e.type){if(3===e.value.length){var r=e.value.substring(0,1),n=e.value.substring(1,2),o=e.value.substring(2,3);return Ce(parseInt(r+r,16),parseInt(n+n,16),parseInt(o+o,16),1)}if(4===e.value.length){r=e.value.substring(0,1),n=e.value.substring(1,2),o=e.value.substring(2,3);var i=e.value.substring(3,4);return Ce(parseInt(r+r,16),parseInt(n+n,16),parseInt(o+o,16),parseInt(i+i,16)/255)}if(6===e.value.length){r=e.value.substring(0,2),n=e.value.substring(2,4),o=e.value.substring(4,6);return Ce(parseInt(r,16),parseInt(n,16),parseInt(o,16),1)}if(8===e.value.length){r=e.value.substring(0,2),n=e.value.substring(2,4),o=e.value.substring(4,6),i=e.value.substring(6,8);return Ce(parseInt(r,16),parseInt(n,16),parseInt(o,16),parseInt(i,16)/255)}}if(20===e.type){var s=Ie[e.value.toUpperCase()];if(void 0!==s)return s}return Ie.TRANSPARENT},fe=function(A){return 0==(255&A)},he=function(A){var e=255&A,t=255&A>>8,r=255&A>>16,n=255&A>>24;return e<255?"rgba("+n+","+r+","+t+","+e/255+")":"rgb("+n+","+r+","+t+")"},Ce=function(A,e,t,r){return(A<<24|e<<16|t<<8|Math.round(255*r)<<0)>>>0},Ue=function(A,e){if(17===A.type)return A.number;if(16===A.type){var t=3===e?1:255;return 3===e?A.number/100*t:Math.round(A.number/100*t)}return 0},Fe=function(A,e){var t=e.filter(qA);if(3===t.length){var r=t.map(Ue),n=r[0],o=r[1],i=r[2];return Ce(n,o,i,1)}if(4===t.length){var s=t.map(Ue),B=(n=s[0],o=s[1],i=s[2],s[3]);return Ce(n,o,i,B)}return 0};function de(A,e,t){return t<0&&(t+=1),t>=1&&(t-=1),t<1/6?(e-A)*t*6+A:t<.5?e:t<2/3?6*(e-A)*(2/3-t)+A:A}var pe=function(A,e){var t=e.filter(qA),r=t[0],n=t[1],o=t[2],i=t[3],s=(17===r.type?we(r.number):ue(A,r))/(2*Math.PI),B=te(n)?n.number/100:0,a=te(o)?o.number/100:0,c=void 0!==i&&te(i)?Be(i,1):1;if(0===B)return Ce(255*a,255*a,255*a,1);var u=a<=.5?a*(B+1):a+B-a*B,l=2*a-u,g=de(l,u,s+1/3),w=de(l,u,s),Q=de(l,u,s-1/3);return Ce(255*g,255*w,255*Q,c)},He={hsl:pe,hsla:pe,rgb:Fe,rgba:Fe},ye=function(A,e){return Qe(A,XA.create(e).parseComponentValue())},Ie={ALICEBLUE:4042850303,ANTIQUEWHITE:4209760255,AQUA:16777215,AQUAMARINE:2147472639,AZURE:4043309055,BEIGE:4126530815,BISQUE:4293182719,BLACK:255,BLANCHEDALMOND:4293643775,BLUE:65535,BLUEVIOLET:2318131967,BROWN:2771004159,BURLYWOOD:3736635391,CADETBLUE:1604231423,CHARTREUSE:2147418367,CHOCOLATE:3530104575,CORAL:4286533887,CORNFLOWERBLUE:1687547391,CORNSILK:4294499583,CRIMSON:3692313855,CYAN:16777215,DARKBLUE:35839,DARKCYAN:9145343,DARKGOLDENROD:3095837695,DARKGRAY:2846468607,DARKGREEN:6553855,DARKGREY:2846468607,DARKKHAKI:3182914559,DARKMAGENTA:2332068863,DARKOLIVEGREEN:1433087999,DARKORANGE:4287365375,DARKORCHID:2570243327,DARKRED:2332033279,DARKSALMON:3918953215,DARKSEAGREEN:2411499519,DARKSLATEBLUE:1211993087,DARKSLATEGRAY:793726975,DARKSLATEGREY:793726975,DARKTURQUOISE:13554175,DARKVIOLET:2483082239,DEEPPINK:4279538687,DEEPSKYBLUE:12582911,DIMGRAY:1768516095,DIMGREY:1768516095,DODGERBLUE:512819199,FIREBRICK:2988581631,FLORALWHITE:4294635775,FORESTGREEN:579543807,FUCHSIA:4278255615,GAINSBORO:3705462015,GHOSTWHITE:4177068031,GOLD:4292280575,GOLDENROD:3668254975,GRAY:2155905279,GREEN:8388863,GREENYELLOW:2919182335,GREY:2155905279,HONEYDEW:4043305215,HOTPINK:4285117695,INDIANRED:3445382399,INDIGO:1258324735,IVORY:4294963455,KHAKI:4041641215,LAVENDER:3873897215,LAVENDERBLUSH:4293981695,LAWNGREEN:2096890111,LEMONCHIFFON:4294626815,LIGHTBLUE:2916673279,LIGHTCORAL:4034953471,LIGHTCYAN:3774873599,LIGHTGOLDENRODYELLOW:4210742015,LIGHTGRAY:3553874943,LIGHTGREEN:2431553791,LIGHTGREY:3553874943,LIGHTPINK:4290167295,LIGHTSALMON:4288707327,LIGHTSEAGREEN:548580095,LIGHTSKYBLUE:2278488831,LIGHTSLATEGRAY:2005441023,LIGHTSLATEGREY:2005441023,LIGHTSTEELBLUE:2965692159,LIGHTYELLOW:4294959359,LIME:16711935,LIMEGREEN:852308735,LINEN:4210091775,MAGENTA:4278255615,MAROON:2147483903,MEDIUMAQUAMARINE:1724754687,MEDIUMBLUE:52735,MEDIUMORCHID:3126187007,MEDIUMPURPLE:2473647103,MEDIUMSEAGREEN:1018393087,MEDIUMSLATEBLUE:2070474495,MEDIUMSPRINGGREEN:16423679,MEDIUMTURQUOISE:1221709055,MEDIUMVIOLETRED:3340076543,MIDNIGHTBLUE:421097727,MINTCREAM:4127193855,MISTYROSE:4293190143,MOCCASIN:4293178879,NAVAJOWHITE:4292783615,NAVY:33023,OLDLACE:4260751103,OLIVE:2155872511,OLIVEDRAB:1804477439,ORANGE:4289003775,ORANGERED:4282712319,ORCHID:3664828159,PALEGOLDENROD:4008225535,PALEGREEN:2566625535,PALETURQUOISE:2951671551,PALEVIOLETRED:3681588223,PAPAYAWHIP:4293907967,PEACHPUFF:4292524543,PERU:3448061951,PINK:4290825215,PLUM:3718307327,POWDERBLUE:2967529215,PURPLE:2147516671,REBECCAPURPLE:1714657791,RED:4278190335,ROSYBROWN:3163525119,ROYALBLUE:1097458175,SADDLEBROWN:2336560127,SALMON:4202722047,SANDYBROWN:4104413439,SEAGREEN:780883967,SEASHELL:4294307583,SIENNA:2689740287,SILVER:3233857791,SKYBLUE:2278484991,SLATEBLUE:1784335871,SLATEGRAY:1887473919,SLATEGREY:1887473919,SNOW:4294638335,SPRINGGREEN:16744447,STEELBLUE:1182971135,TAN:3535047935,TEAL:8421631,THISTLE:3636451583,TOMATO:4284696575,TRANSPARENT:0,TURQUOISE:1088475391,VIOLET:4001558271,WHEAT:4125012991,WHITE:4294967295,WHITESMOKE:4126537215,YELLOW:4294902015,YELLOWGREEN:2597139199},Ee={name:"background-clip",initialValue:"border-box",prefix:!1,type:1,parse:function(A,e){return e.map((function(A){if(YA(A))switch(A.value){case"padding-box":return 1;case"content-box":return 2}return 0}))}},me={name:"background-color",initialValue:"transparent",prefix:!1,type:3,format:"color"},ve=function(A,e){var t=Qe(A,e[0]),r=e[1];return r&&te(r)?{color:t,stop:r}:{color:t,stop:null}},Ke=function(A,e){var t=A[0],r=A[A.length-1];null===t.stop&&(t.stop=ne),null===r.stop&&(r.stop=ie);for(var n=[],o=0,i=0;io?n.push(B):n.push(o),o=B}else n.push(null)}var a=null;for(i=0;iA.optimumDistance)?{optimumCorner:e,optimumDistance:s}:A}),{optimumDistance:n?1/0:-1/0,optimumCorner:null}).optimumCorner},xe=function(A,e){var t=we(180),r=[];return $A(e).forEach((function(e,n){if(0===n){var o=e[0];if(20===o.type&&-1!==["top","left","right","bottom"].indexOf(o.value))return void(t=ge(e));if(le(o))return void(t=(ue(A,o)+we(270))%we(360))}var i=ve(A,e);r.push(i)})),{angle:t,stops:r,type:1}},Se="closest-side",_e="farthest-side",Me="closest-corner",Te="farthest-corner",Oe="circle",Ge="ellipse",Ve="cover",Re="contain",ke=function(A,e){var t=0,r=3,n=[],o=[];return $A(e).forEach((function(e,i){var s=!0;if(0===i?s=e.reduce((function(A,e){if(YA(e))switch(e.value){case"center":return o.push(oe),!1;case"top":case"left":return o.push(ne),!1;case"right":case"bottom":return o.push(ie),!1}else if(te(e)||ee(e))return o.push(e),!1;return A}),s):1===i&&(s=e.reduce((function(A,e){if(YA(e))switch(e.value){case Oe:return t=0,!1;case Ge:return t=1,!1;case Re:case Se:return r=0,!1;case _e:return r=1,!1;case Me:return r=2,!1;case Ve:case Te:return r=3,!1}else if(ee(e)||te(e))return Array.isArray(r)||(r=[]),r.push(e),!1;return A}),s)),s){var B=ve(A,e);n.push(B)}})),{size:r,shape:t,stops:n,position:o,type:2}},Pe=function(A,e){if(22===e.type){var t={url:e.value,type:0};return A.cache.addImage(e.value),t}if(18===e.type){var r=Xe[e.name];if(void 0===r)throw new Error('Attempting to parse an unsupported image function "'+e.name+'"');return r(A,e.values)}throw new Error("Unsupported image type "+e.type)};var Ne,Xe={"linear-gradient":function(A,e){var t=we(180),r=[];return $A(e).forEach((function(e,n){if(0===n){var o=e[0];if(20===o.type&&"to"===o.value)return void(t=ge(e));if(le(o))return void(t=ue(A,o))}var i=ve(A,e);r.push(i)})),{angle:t,stops:r,type:1}},"-moz-linear-gradient":xe,"-ms-linear-gradient":xe,"-o-linear-gradient":xe,"-webkit-linear-gradient":xe,"radial-gradient":function(A,e){var t=0,r=3,n=[],o=[];return $A(e).forEach((function(e,i){var s=!0;if(0===i){var B=!1;s=e.reduce((function(A,e){if(B)if(YA(e))switch(e.value){case"center":return o.push(oe),A;case"top":case"left":return o.push(ne),A;case"right":case"bottom":return o.push(ie),A}else(te(e)||ee(e))&&o.push(e);else if(YA(e))switch(e.value){case Oe:return t=0,!1;case Ge:return t=1,!1;case"at":return B=!0,!1;case Se:return r=0,!1;case Ve:case _e:return r=1,!1;case Re:case Me:return r=2,!1;case Te:return r=3,!1}else if(ee(e)||te(e))return Array.isArray(r)||(r=[]),r.push(e),!1;return A}),s)}if(s){var a=ve(A,e);n.push(a)}})),{size:r,shape:t,stops:n,position:o,type:2}},"-moz-radial-gradient":ke,"-ms-radial-gradient":ke,"-o-radial-gradient":ke,"-webkit-radial-gradient":ke,"-webkit-gradient":function(A,e){var t=we(180),r=[],n=1;return $A(e).forEach((function(e,t){var o=e[0];if(0===t){if(YA(o)&&"linear"===o.value)return void(n=1);if(YA(o)&&"radial"===o.value)return void(n=2)}if(18===o.type)if("from"===o.name){var i=Qe(A,o.values[0]);r.push({stop:ne,color:i})}else if("to"===o.name){i=Qe(A,o.values[0]);r.push({stop:ie,color:i})}else if("color-stop"===o.name){var s=o.values.filter(qA);if(2===s.length){i=Qe(A,s[1]);var B=s[0];WA(B)&&r.push({stop:{type:16,number:100*B.number,flags:B.flags},color:i})}}})),1===n?{angle:(t+we(180))%we(360),stops:r,type:n}:{size:3,shape:0,stops:r,position:[],type:n}}},Je={name:"background-image",initialValue:"none",type:1,prefix:!1,parse:function(A,e){if(0===e.length)return[];var t=e[0];return 20===t.type&&"none"===t.value?[]:e.filter((function(A){return qA(A)&&function(A){return!(20===A.type&&"none"===A.value||18===A.type&&!Xe[A.name])}(A)})).map((function(e){return Pe(A,e)}))}},We={name:"background-origin",initialValue:"border-box",prefix:!1,type:1,parse:function(A,e){return e.map((function(A){if(YA(A))switch(A.value){case"padding-box":return 1;case"content-box":return 2}return 0}))}},Ye={name:"background-position",initialValue:"0% 0%",type:1,prefix:!1,parse:function(A,e){return $A(e).map((function(A){return A.filter(te)})).map(re)}},Ze={name:"background-repeat",initialValue:"repeat",prefix:!1,type:1,parse:function(A,e){return $A(e).map((function(A){return A.filter(YA).map((function(A){return A.value})).join(" ")})).map(je)}},je=function(A){switch(A){case"no-repeat":return 1;case"repeat-x":case"repeat no-repeat":return 2;case"repeat-y":case"no-repeat repeat":return 3;default:return 0}};!function(A){A.AUTO="auto",A.CONTAIN="contain",A.COVER="cover"}(Ne||(Ne={}));var ze,qe={name:"background-size",initialValue:"0",prefix:!1,type:1,parse:function(A,e){return $A(e).map((function(A){return A.filter($e)}))}},$e=function(A){return YA(A)||te(A)},At=function(A){return{name:"border-"+A+"-color",initialValue:"transparent",prefix:!1,type:3,format:"color"}},et=At("top"),tt=At("right"),rt=At("bottom"),nt=At("left"),ot=function(A){return{name:"border-radius-"+A,initialValue:"0 0",prefix:!1,type:1,parse:function(A,e){return re(e.filter(te))}}},it=ot("top-left"),st=ot("top-right"),Bt=ot("bottom-right"),at=ot("bottom-left"),ct=function(A){return{name:"border-"+A+"-style",initialValue:"solid",prefix:!1,type:2,parse:function(A,e){switch(e){case"none":return 0;case"dashed":return 2;case"dotted":return 3;case"double":return 4}return 1}}},ut=ct("top"),lt=ct("right"),gt=ct("bottom"),wt=ct("left"),Qt=function(A){return{name:"border-"+A+"-width",initialValue:"0",type:0,prefix:!1,parse:function(A,e){return JA(e)?e.number:0}}},ft=Qt("top"),ht=Qt("right"),Ct=Qt("bottom"),Ut=Qt("left"),Ft={name:"color",initialValue:"transparent",prefix:!1,type:3,format:"color"},dt={name:"direction",initialValue:"ltr",prefix:!1,type:2,parse:function(A,e){return"rtl"===e?1:0}},pt={name:"display",initialValue:"inline-block",prefix:!1,type:1,parse:function(A,e){return e.filter(YA).reduce((function(A,e){return A|Ht(e.value)}),0)}},Ht=function(A){switch(A){case"block":case"-webkit-box":return 2;case"inline":return 4;case"run-in":return 8;case"flow":return 16;case"flow-root":return 32;case"table":return 64;case"flex":case"-webkit-flex":return 128;case"grid":case"-ms-grid":return 256;case"ruby":return 512;case"subgrid":return 1024;case"list-item":return 2048;case"table-row-group":return 4096;case"table-header-group":return 8192;case"table-footer-group":return 16384;case"table-row":return 32768;case"table-cell":return 65536;case"table-column-group":return 131072;case"table-column":return 262144;case"table-caption":return 524288;case"ruby-base":return 1048576;case"ruby-text":return 2097152;case"ruby-base-container":return 4194304;case"ruby-text-container":return 8388608;case"contents":return 16777216;case"inline-block":return 33554432;case"inline-list-item":return 67108864;case"inline-table":return 134217728;case"inline-flex":return 268435456;case"inline-grid":return 536870912}return 0},yt={name:"float",initialValue:"none",prefix:!1,type:2,parse:function(A,e){switch(e){case"left":return 1;case"right":return 2;case"inline-start":return 3;case"inline-end":return 4}return 0}},It={name:"letter-spacing",initialValue:"0",prefix:!1,type:0,parse:function(A,e){return 20===e.type&&"normal"===e.value?0:17===e.type||15===e.type?e.number:0}};!function(A){A.NORMAL="normal",A.STRICT="strict"}(ze||(ze={}));var Et,mt={name:"line-break",initialValue:"normal",prefix:!1,type:2,parse:function(A,e){return"strict"===e?ze.STRICT:ze.NORMAL}},vt={name:"line-height",initialValue:"normal",prefix:!1,type:4},Kt=function(A,e){return YA(A)&&"normal"===A.value?1.2*e:17===A.type?e*A.number:te(A)?Be(A,e):e},bt={name:"list-style-image",initialValue:"none",type:0,prefix:!1,parse:function(A,e){return 20===e.type&&"none"===e.value?null:Pe(A,e)}},Lt={name:"list-style-position",initialValue:"outside",prefix:!1,type:2,parse:function(A,e){return"inside"===e?0:1}},Dt={name:"list-style-type",initialValue:"none",prefix:!1,type:2,parse:function(A,e){switch(e){case"disc":return 0;case"circle":return 1;case"square":return 2;case"decimal":return 3;case"cjk-decimal":return 4;case"decimal-leading-zero":return 5;case"lower-roman":return 6;case"upper-roman":return 7;case"lower-greek":return 8;case"lower-alpha":return 9;case"upper-alpha":return 10;case"arabic-indic":return 11;case"armenian":return 12;case"bengali":return 13;case"cambodian":return 14;case"cjk-earthly-branch":return 15;case"cjk-heavenly-stem":return 16;case"cjk-ideographic":return 17;case"devanagari":return 18;case"ethiopic-numeric":return 19;case"georgian":return 20;case"gujarati":return 21;case"gurmukhi":case"hebrew":return 22;case"hiragana":return 23;case"hiragana-iroha":return 24;case"japanese-formal":return 25;case"japanese-informal":return 26;case"kannada":return 27;case"katakana":return 28;case"katakana-iroha":return 29;case"khmer":return 30;case"korean-hangul-formal":return 31;case"korean-hanja-formal":return 32;case"korean-hanja-informal":return 33;case"lao":return 34;case"lower-armenian":return 35;case"malayalam":return 36;case"mongolian":return 37;case"myanmar":return 38;case"oriya":return 39;case"persian":return 40;case"simp-chinese-formal":return 41;case"simp-chinese-informal":return 42;case"tamil":return 43;case"telugu":return 44;case"thai":return 45;case"tibetan":return 46;case"trad-chinese-formal":return 47;case"trad-chinese-informal":return 48;case"upper-armenian":return 49;case"disclosure-open":return 50;case"disclosure-closed":return 51;default:return-1}}},xt=function(A){return{name:"margin-"+A,initialValue:"0",prefix:!1,type:4}},St=xt("top"),_t=xt("right"),Mt=xt("bottom"),Tt=xt("left"),Ot={name:"overflow",initialValue:"visible",prefix:!1,type:1,parse:function(A,e){return e.filter(YA).map((function(A){switch(A.value){case"hidden":return 1;case"scroll":return 2;case"clip":return 3;case"auto":return 4;default:return 0}}))}},Gt={name:"overflow-wrap",initialValue:"normal",prefix:!1,type:2,parse:function(A,e){return"break-word"===e?"break-word":"normal"}},Vt=function(A){return{name:"padding-"+A,initialValue:"0",prefix:!1,type:3,format:"length-percentage"}},Rt=Vt("top"),kt=Vt("right"),Pt=Vt("bottom"),Nt=Vt("left"),Xt={name:"text-align",initialValue:"left",prefix:!1,type:2,parse:function(A,e){switch(e){case"right":return 2;case"center":case"justify":return 1;default:return 0}}},Jt={name:"position",initialValue:"static",prefix:!1,type:2,parse:function(A,e){switch(e){case"relative":return 1;case"absolute":return 2;case"fixed":return 3;case"sticky":return 4}return 0}},Wt={name:"text-shadow",initialValue:"none",type:1,prefix:!1,parse:function(A,e){return 1===e.length&&jA(e[0],"none")?[]:$A(e).map((function(e){for(var t={color:Ie.TRANSPARENT,offsetX:ne,offsetY:ne,blur:ne},r=0,n=0;n1?1:0],this.overflowWrap=Er(A,Gt,e.overflowWrap),this.paddingTop=Er(A,Rt,e.paddingTop),this.paddingRight=Er(A,kt,e.paddingRight),this.paddingBottom=Er(A,Pt,e.paddingBottom),this.paddingLeft=Er(A,Nt,e.paddingLeft),this.paintOrder=Er(A,Fr,e.paintOrder),this.position=Er(A,Jt,e.position),this.textAlign=Er(A,Xt,e.textAlign),this.textDecorationColor=Er(A,or,null!==(t=e.textDecorationColor)&&void 0!==t?t:e.color),this.textDecorationLine=Er(A,ir,null!==(r=e.textDecorationLine)&&void 0!==r?r:e.textDecoration),this.textShadow=Er(A,Wt,e.textShadow),this.textTransform=Er(A,Yt,e.textTransform),this.transform=Er(A,Zt,e.transform),this.transformOrigin=Er(A,$t,e.transformOrigin),this.visibility=Er(A,Ar,e.visibility),this.webkitTextStrokeColor=Er(A,dr,e.webkitTextStrokeColor),this.webkitTextStrokeWidth=Er(A,pr,e.webkitTextStrokeWidth),this.wordBreak=Er(A,er,e.wordBreak),this.zIndex=Er(A,tr,e.zIndex)}return A.prototype.isVisible=function(){return this.display>0&&this.opacity>0&&0===this.visibility},A.prototype.isTransparent=function(){return fe(this.backgroundColor)},A.prototype.isTransformed=function(){return null!==this.transform},A.prototype.isPositioned=function(){return 0!==this.position},A.prototype.isPositionedWithZIndex=function(){return this.isPositioned()&&!this.zIndex.auto},A.prototype.isFloating=function(){return 0!==this.float},A.prototype.isInlineLevel=function(){return lr(this.display,4)||lr(this.display,33554432)||lr(this.display,268435456)||lr(this.display,536870912)||lr(this.display,67108864)||lr(this.display,134217728)},A}(),yr=function(A,e){this.content=Er(A,gr,e.content),this.quotes=Er(A,hr,e.quotes)},Ir=function(A,e){this.counterIncrement=Er(A,wr,e.counterIncrement),this.counterReset=Er(A,Qr,e.counterReset)},Er=function(A,e,t){var r=new NA,n=null!=t?t.toString():e.initialValue;r.write(n);var o=new XA(r.read());switch(e.type){case 2:var i=o.parseComponentValue();return e.parse(A,YA(i)?i.value:e.initialValue);case 0:return e.parse(A,o.parseComponentValue());case 1:return e.parse(A,o.parseComponentValues());case 4:return o.parseComponentValue();case 3:switch(e.format){case"angle":return ue(A,o.parseComponentValue());case"color":return Qe(A,o.parseComponentValue());case"image":return Pe(A,o.parseComponentValue());case"length":var s=o.parseComponentValue();return ee(s)?s:ne;case"length-percentage":var B=o.parseComponentValue();return te(B)?B:ne;case"time":return rr(A,o.parseComponentValue())}}},mr=function(A,e){var t=function(A){switch(A.getAttribute("data-html2canvas-debug")){case"all":return 1;case"clone":return 2;case"parse":return 3;case"render":return 4;default:return 0}}(A);return 1===t||e===t},vr=function(A,e){this.context=A,this.textNodes=[],this.elements=[],this.flags=0,mr(e,3),this.styles=new Hr(A,window.getComputedStyle(e,null)),xn(e)&&(this.styles.animationDuration.some((function(A){return A>0}))&&(e.style.animationDuration="0s"),null!==this.styles.transform&&(e.style.transform="none")),this.bounds=c(this.context,e),mr(e,4)&&(this.flags|=16)},Kr="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",br="undefined"==typeof Uint8Array?[]:new Uint8Array(256),Lr=0;Lr<64;Lr++)br[Kr.charCodeAt(Lr)]=Lr;for(var Dr=function(A,e,t){return A.slice?A.slice(e,t):new Uint16Array(Array.prototype.slice.call(A,e,t))},xr=function(){function A(A,e,t,r,n,o){this.initialValue=A,this.errorValue=e,this.highStart=t,this.highValueIndex=r,this.index=n,this.data=o}return A.prototype.get=function(A){var e;if(A>=0){if(A<55296||A>56319&&A<=65535)return e=((e=this.index[A>>5])<<2)+(31&A),this.data[e];if(A<=65535)return e=((e=this.index[2048+(A-55296>>5)])<<2)+(31&A),this.data[e];if(A>11),e=this.index[e],e+=A>>5&63,e=((e=this.index[e])<<2)+(31&A),this.data[e];if(A<=1114111)return this.data[this.highValueIndex]}return this.errorValue},A}(),Sr="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",_r="undefined"==typeof Uint8Array?[]:new Uint8Array(256),Mr=0;Mr<64;Mr++)_r[Sr.charCodeAt(Mr)]=Mr;var Tr,Or=8,Gr=9,Vr=11,Rr=12,kr=function(){for(var A=[],e=0;e>10),i%1024+56320)),(n+1===t||r.length>16384)&&(o+=String.fromCharCode.apply(String,r),r.length=0)}return o},Pr=function(A,e){var t,r,n,o=function(A){var e,t,r,n,o,i=.75*A.length,s=A.length,B=0;"="===A[A.length-1]&&(i--,"="===A[A.length-2]&&i--);var a="undefined"!=typeof ArrayBuffer&&"undefined"!=typeof Uint8Array&&void 0!==Uint8Array.prototype.slice?new ArrayBuffer(i):new Array(i),c=Array.isArray(a)?a:new Uint8Array(a);for(e=0;e>4,c[B++]=(15&r)<<4|n>>2,c[B++]=(3&n)<<6|63&o;return a}(A),i=Array.isArray(o)?function(A){for(var e=A.length,t=[],r=0;r=55296&&n<=56319&&t=t)return{done:!0,value:null};for(var A=Nr;ri.x||n.y>i.y;return i=n,0===e||s}));return A.body.removeChild(e),s}(document);return Object.defineProperty(zr,"SUPPORT_WORD_BREAKING",{value:A}),A},get SUPPORT_SVG_DRAWING(){var A=function(A){var e=new Image,t=A.createElement("canvas"),r=t.getContext("2d");if(!r)return!1;e.src="data:image/svg+xml,";try{r.drawImage(e,0,0),t.toDataURL()}catch(A){return!1}return!0}(document);return Object.defineProperty(zr,"SUPPORT_SVG_DRAWING",{value:A}),A},get SUPPORT_FOREIGNOBJECT_DRAWING(){var A="function"==typeof Array.from&&"function"==typeof window.fetch?function(A){var e=A.createElement("canvas"),t=100;e.width=t,e.height=t;var r=e.getContext("2d");if(!r)return Promise.reject(!1);r.fillStyle="rgb(0, 255, 0)",r.fillRect(0,0,t,t);var n=new Image,o=e.toDataURL();n.src=o;var i=Zr(t,t,0,0,n);return r.fillStyle="red",r.fillRect(0,0,t,t),jr(i).then((function(e){r.drawImage(e,0,0);var n=r.getImageData(0,0,t,t).data;r.fillStyle="red",r.fillRect(0,0,t,t);var i=A.createElement("div");return i.style.backgroundImage="url("+o+")",i.style.height=t+"px",Yr(n)?jr(Zr(t,t,0,0,i)):Promise.reject(!1)})).then((function(A){return r.drawImage(A,0,0),Yr(r.getImageData(0,0,t,t).data)})).catch((function(){return!1}))}(document):Promise.resolve(!1);return Object.defineProperty(zr,"SUPPORT_FOREIGNOBJECT_DRAWING",{value:A}),A},get SUPPORT_CORS_IMAGES(){var A=void 0!==(new Image).crossOrigin;return Object.defineProperty(zr,"SUPPORT_CORS_IMAGES",{value:A}),A},get SUPPORT_RESPONSE_TYPE(){var A="string"==typeof(new XMLHttpRequest).responseType;return Object.defineProperty(zr,"SUPPORT_RESPONSE_TYPE",{value:A}),A},get SUPPORT_CORS_XHR(){var A="withCredentials"in new XMLHttpRequest;return Object.defineProperty(zr,"SUPPORT_CORS_XHR",{value:A}),A},get SUPPORT_NATIVE_TEXT_SEGMENTATION(){var A=!("undefined"==typeof Intl||!Intl.Segmenter);return Object.defineProperty(zr,"SUPPORT_NATIVE_TEXT_SEGMENTATION",{value:A}),A}},qr=function(A,e){this.text=A,this.bounds=e},$r=function(A,e){var t=e.ownerDocument;if(t){var r=t.createElement("html2canvaswrapper");r.appendChild(e.cloneNode(!0));var n=e.parentNode;if(n){n.replaceChild(r,e);var o=c(A,r);return r.firstChild&&n.replaceChild(r.firstChild,r),o}}return a.EMPTY},An=function(A,e,t){var r=A.ownerDocument;if(!r)throw new Error("Node has no owner document");var n=r.createRange();return n.setStart(A,e),n.setEnd(A,e+t),n},en=function(A){if(zr.SUPPORT_NATIVE_TEXT_SEGMENTATION){var e=new Intl.Segmenter(void 0,{granularity:"grapheme"});return Array.from(e.segment(A)).map((function(A){return A.segment}))}return function(A){for(var e,t=Wr(A),r=[];!(e=t.next()).done;)e.value&&r.push(e.value.slice());return r}(A)},tn=function(A,e){return 0!==e.letterSpacing?en(A):function(A,e){if(zr.SUPPORT_NATIVE_TEXT_SEGMENTATION){var t=new Intl.Segmenter(void 0,{granularity:"word"});return Array.from(t.segment(A)).map((function(A){return A.segment}))}return nn(A,e)}(A,e)},rn=[32,160,4961,65792,65793,4153,4241],nn=function(A,e){for(var t,r=function(A,e){var t=u(A),r=BA(t,e),n=r[0],o=r[1],i=r[2],s=t.length,B=0,a=0;return{next:function(){if(a>=s)return{done:!0,value:null};for(var A=Z;a0)if(zr.SUPPORT_RANGE_BOUNDS){var n=An(r,i,e.length).getClientRects();if(n.length>1){var s=en(e),B=0;s.forEach((function(e){o.push(new qr(e,a.fromDOMRectList(A,An(r,B+i,e.length).getClientRects()))),B+=e.length}))}else o.push(new qr(e,a.fromDOMRectList(A,n)))}else{var c=r.splitText(e.length);o.push(new qr(e,$r(A,r))),r=c}else zr.SUPPORT_RANGE_BOUNDS||(r=r.splitText(e.length));i+=e.length})),o}(A,this.text,t,e)},sn=function(A,e){switch(e){case 1:return A.toLowerCase();case 3:return A.replace(Bn,an);case 2:return A.toUpperCase();default:return A}},Bn=/(^|\s|:|-|\(|\))([a-z])/g,an=function(A,e,t){return A.length>0?e+t.toUpperCase():A},cn=function(A){function e(e,t){var r=A.call(this,e,t)||this;return r.src=t.currentSrc||t.src,r.intrinsicWidth=t.naturalWidth,r.intrinsicHeight=t.naturalHeight,r.context.cache.addImage(r.src),r}return n(e,A),e}(vr),un=function(A){function e(e,t){var r=A.call(this,e,t)||this;return r.canvas=t,r.intrinsicWidth=t.width,r.intrinsicHeight=t.height,r}return n(e,A),e}(vr),ln=function(A){function e(e,t){var r=A.call(this,e,t)||this,n=new XMLSerializer,o=c(e,t);return t.setAttribute("width",o.width+"px"),t.setAttribute("height",o.height+"px"),r.svg="data:image/svg+xml,"+encodeURIComponent(n.serializeToString(t)),r.intrinsicWidth=t.width.baseVal.value,r.intrinsicHeight=t.height.baseVal.value,r.context.cache.addImage(r.svg),r}return n(e,A),e}(vr),gn=function(A){function e(e,t){var r=A.call(this,e,t)||this;return r.value=t.value,r}return n(e,A),e}(vr),wn=function(A){function e(e,t){var r=A.call(this,e,t)||this;return r.start=t.start,r.reversed="boolean"==typeof t.reversed&&!0===t.reversed,r}return n(e,A),e}(vr),Qn=[{type:15,flags:0,unit:"px",number:3}],fn=[{type:16,flags:0,number:50}],hn="checkbox",Cn="radio",Un="password",Fn=707406591,dn=function(A){function e(e,t){var r,n,o,i=A.call(this,e,t)||this;switch(i.type=t.type.toLowerCase(),i.checked=t.checked,i.value=0===(n=(r=t).type===Un?new Array(r.value.length+1).join("•"):r.value).length?r.placeholder||"":n,i.type!==hn&&i.type!==Cn||(i.styles.backgroundColor=3739148031,i.styles.borderTopColor=i.styles.borderRightColor=i.styles.borderBottomColor=i.styles.borderLeftColor=2779096575,i.styles.borderTopWidth=i.styles.borderRightWidth=i.styles.borderBottomWidth=i.styles.borderLeftWidth=1,i.styles.borderTopStyle=i.styles.borderRightStyle=i.styles.borderBottomStyle=i.styles.borderLeftStyle=1,i.styles.backgroundClip=[0],i.styles.backgroundOrigin=[0],i.bounds=(o=i.bounds).width>o.height?new a(o.left+(o.width-o.height)/2,o.top,o.height,o.height):o.width0)t.textNodes.push(new on(A,n,t.styles));else if(Dn(n))if(Wn(n)&&n.assignedNodes)n.assignedNodes().forEach((function(e){return En(A,e,t,r)}));else{var i=mn(A,n);i.styles.isVisible()&&(Kn(n,i,r)?i.flags|=4:bn(i.styles)&&(i.flags|=2),-1!==In.indexOf(n.tagName)&&(i.flags|=8),t.elements.push(i),n.slot,n.shadowRoot?En(A,n.shadowRoot,i,r):Xn(n)||On(n)||Jn(n)||En(A,n,i,r))}},mn=function(A,e){return kn(e)?new cn(A,e):Vn(e)?new un(A,e):On(e)?new ln(A,e):_n(e)?new gn(A,e):Mn(e)?new wn(A,e):Tn(e)?new dn(A,e):Jn(e)?new pn(A,e):Xn(e)?new Hn(A,e):Pn(e)?new yn(A,e):new vr(A,e)},vn=function(A,e){var t=mn(A,e);return t.flags|=4,En(A,e,t,t),t},Kn=function(A,e,t){return e.styles.isPositionedWithZIndex()||e.styles.opacity<1||e.styles.isTransformed()||Gn(A)&&t.styles.isTransparent()},bn=function(A){return A.isPositioned()||A.isFloating()},Ln=function(A){return A.nodeType===Node.TEXT_NODE},Dn=function(A){return A.nodeType===Node.ELEMENT_NODE},xn=function(A){return Dn(A)&&void 0!==A.style&&!Sn(A)},Sn=function(A){return"object"==typeof A.className},_n=function(A){return"LI"===A.tagName},Mn=function(A){return"OL"===A.tagName},Tn=function(A){return"INPUT"===A.tagName},On=function(A){return"svg"===A.tagName},Gn=function(A){return"BODY"===A.tagName},Vn=function(A){return"CANVAS"===A.tagName},Rn=function(A){return"VIDEO"===A.tagName},kn=function(A){return"IMG"===A.tagName},Pn=function(A){return"IFRAME"===A.tagName},Nn=function(A){return"STYLE"===A.tagName},Xn=function(A){return"TEXTAREA"===A.tagName},Jn=function(A){return"SELECT"===A.tagName},Wn=function(A){return"SLOT"===A.tagName},Yn=function(A){return A.tagName.indexOf("-")>0},Zn=function(){function A(){this.counters={}}return A.prototype.getCounterValue=function(A){var e=this.counters[A];return e&&e.length?e[e.length-1]:1},A.prototype.getCounterValues=function(A){var e=this.counters[A];return e||[]},A.prototype.pop=function(A){var e=this;A.forEach((function(A){return e.counters[A].pop()}))},A.prototype.parse=function(A){var e=this,t=A.counterIncrement,r=A.counterReset,n=!0;null!==t&&t.forEach((function(A){var t=e.counters[A.counter];t&&0!==A.increment&&(n=!1,t.length||t.push(1),t[Math.max(0,t.length-1)]+=A.increment)}));var o=[];return n&&r.forEach((function(A){var t=e.counters[A.counter];o.push(A.counter),t||(t=e.counters[A.counter]=[]),t.push(A.reset)})),o},A}(),jn={integers:[1e3,900,500,400,100,90,50,40,10,9,5,4,1],values:["M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"]},zn={integers:[9e3,8e3,7e3,6e3,5e3,4e3,3e3,2e3,1e3,900,800,700,600,500,400,300,200,100,90,80,70,60,50,40,30,20,10,9,8,7,6,5,4,3,2,1],values:["Ք","Փ","Ւ","Ց","Ր","Տ","Վ","Ս","Ռ","Ջ","Պ","Չ","Ո","Շ","Ն","Յ","Մ","Ճ","Ղ","Ձ","Հ","Կ","Ծ","Խ","Լ","Ի","Ժ","Թ","Ը","Է","Զ","Ե","Դ","Գ","Բ","Ա"]},qn={integers:[1e4,9e3,8e3,7e3,6e3,5e3,4e3,3e3,2e3,1e3,400,300,200,100,90,80,70,60,50,40,30,20,19,18,17,16,15,10,9,8,7,6,5,4,3,2,1],values:["י׳","ט׳","ח׳","ז׳","ו׳","ה׳","ד׳","ג׳","ב׳","א׳","ת","ש","ר","ק","צ","פ","ע","ס","נ","מ","ל","כ","יט","יח","יז","טז","טו","י","ט","ח","ז","ו","ה","ד","ג","ב","א"]},$n={integers:[1e4,9e3,8e3,7e3,6e3,5e3,4e3,3e3,2e3,1e3,900,800,700,600,500,400,300,200,100,90,80,70,60,50,40,30,20,10,9,8,7,6,5,4,3,2,1],values:["ჵ","ჰ","ჯ","ჴ","ხ","ჭ","წ","ძ","ც","ჩ","შ","ყ","ღ","ქ","ფ","ჳ","ტ","ს","რ","ჟ","პ","ო","ჲ","ნ","მ","ლ","კ","ი","თ","ჱ","ზ","ვ","ე","დ","გ","ბ","ა"]},Ao=function(A,e,t,r,n,o){return At?ao(A,n,o.length>0):r.integers.reduce((function(e,t,n){for(;A>=t;)A-=t,e+=r.values[n];return e}),"")+o},eo=function(A,e,t,r){var n="";do{t||A--,n=r(A)+n,A/=e}while(A*e>=e);return n},to=function(A,e,t,r,n){var o=t-e+1;return(A<0?"-":"")+(eo(Math.abs(A),o,r,(function(A){return l(Math.floor(A%o)+e)}))+n)},ro=function(A,e,t){void 0===t&&(t=". ");var r=e.length;return eo(Math.abs(A),r,!1,(function(A){return e[Math.floor(A%r)]}))+t},no=function(A,e,t,r,n,o){if(A<-9999||A>9999)return ao(A,4,n.length>0);var i=Math.abs(A),s=n;if(0===i)return e[0]+s;for(var B=0;i>0&&B<=4;B++){var a=i%10;0===a&&lr(o,1)&&""!==s?s=e[a]+s:a>1||1===a&&0===B||1===a&&1===B&&lr(o,2)||1===a&&1===B&&lr(o,4)&&A>100||1===a&&B>1&&lr(o,8)?s=e[a]+(B>0?t[B-1]:"")+s:1===a&&B>0&&(s=t[B-1]+s),i=Math.floor(i/10)}return(A<0?r:"")+s},oo="十百千萬",io="拾佰仟萬",so="マイナス",Bo="마이너스",ao=function(A,e,t){var r=t?". ":"",n=t?"、":"",o=t?", ":"",i=t?" ":"";switch(e){case 0:return"•"+i;case 1:return"◦"+i;case 2:return"◾"+i;case 5:var s=to(A,48,57,!0,r);return s.length<4?"0"+s:s;case 4:return ro(A,"〇一二三四五六七八九",n);case 6:return Ao(A,1,3999,jn,3,r).toLowerCase();case 7:return Ao(A,1,3999,jn,3,r);case 8:return to(A,945,969,!1,r);case 9:return to(A,97,122,!1,r);case 10:return to(A,65,90,!1,r);case 11:return to(A,1632,1641,!0,r);case 12:case 49:return Ao(A,1,9999,zn,3,r);case 35:return Ao(A,1,9999,zn,3,r).toLowerCase();case 13:return to(A,2534,2543,!0,r);case 14:case 30:return to(A,6112,6121,!0,r);case 15:return ro(A,"子丑寅卯辰巳午未申酉戌亥",n);case 16:return ro(A,"甲乙丙丁戊己庚辛壬癸",n);case 17:case 48:return no(A,"零一二三四五六七八九",oo,"負",n,14);case 47:return no(A,"零壹貳參肆伍陸柒捌玖",io,"負",n,15);case 42:return no(A,"零一二三四五六七八九",oo,"负",n,14);case 41:return no(A,"零壹贰叁肆伍陆柒捌玖",io,"负",n,15);case 26:return no(A,"〇一二三四五六七八九","十百千万",so,n,0);case 25:return no(A,"零壱弐参四伍六七八九","拾百千万",so,n,7);case 31:return no(A,"영일이삼사오육칠팔구","십백천만",Bo,o,7);case 33:return no(A,"零一二三四五六七八九","十百千萬",Bo,o,0);case 32:return no(A,"零壹貳參四五六七八九","拾百千",Bo,o,7);case 18:return to(A,2406,2415,!0,r);case 20:return Ao(A,1,19999,$n,3,r);case 21:return to(A,2790,2799,!0,r);case 22:return to(A,2662,2671,!0,r);case 22:return Ao(A,1,10999,qn,3,r);case 23:return ro(A,"あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわゐゑをん");case 24:return ro(A,"いろはにほへとちりぬるをわかよたれそつねならむうゐのおくやまけふこえてあさきゆめみしゑひもせす");case 27:return to(A,3302,3311,!0,r);case 28:return ro(A,"アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヰヱヲン",n);case 29:return ro(A,"イロハニホヘトチリヌルヲワカヨタレソツネナラムウヰノオクヤマケフコエテアサキユメミシヱヒモセス",n);case 34:return to(A,3792,3801,!0,r);case 37:return to(A,6160,6169,!0,r);case 38:return to(A,4160,4169,!0,r);case 39:return to(A,2918,2927,!0,r);case 40:return to(A,1776,1785,!0,r);case 43:return to(A,3046,3055,!0,r);case 44:return to(A,3174,3183,!0,r);case 45:return to(A,3664,3673,!0,r);case 46:return to(A,3872,3881,!0,r);default:return to(A,48,57,!0,r)}},co="data-html2canvas-ignore",uo=function(){function A(A,e,t){if(this.context=A,this.options=t,this.scrolledElements=[],this.referenceElement=e,this.counters=new Zn,this.quoteDepth=0,!e.ownerDocument)throw new Error("Cloned element does not have an owner document");this.documentElement=this.cloneNode(e.ownerDocument.documentElement,!1)}return A.prototype.toIFrame=function(A,e){var t=this,r=go(A,e);if(!r.contentWindow)return Promise.reject("Unable to find iframe window");var n=A.defaultView.pageXOffset,o=A.defaultView.pageYOffset,B=r.contentWindow,a=B.document,c=fo(r).then((function(){return i(t,void 0,void 0,(function(){var A,t;return s(this,(function(n){switch(n.label){case 0:return this.scrolledElements.forEach(po),B&&(B.scrollTo(e.left,e.top),!/(iPad|iPhone|iPod)/g.test(navigator.userAgent)||B.scrollY===e.top&&B.scrollX===e.left||(this.context.logger.warn("Unable to restore scroll position for cloned document"),this.context.windowBounds=this.context.windowBounds.add(B.scrollX-e.left,B.scrollY-e.top,0,0))),A=this.options.onclone,void 0===(t=this.clonedReferenceElement)?[2,Promise.reject("Error finding the "+this.referenceElement.nodeName+" in the cloned document")]:a.fonts&&a.fonts.ready?[4,a.fonts.ready]:[3,2];case 1:n.sent(),n.label=2;case 2:return/(AppleWebKit)/g.test(navigator.userAgent)?[4,Qo(a)]:[3,4];case 3:n.sent(),n.label=4;case 4:return"function"==typeof A?[2,Promise.resolve().then((function(){return A(a,t)})).then((function(){return r}))]:[2,r]}}))}))}));return a.open(),a.write(Uo(document.doctype)+""),Fo(this.referenceElement.ownerDocument,n,o),a.replaceChild(a.adoptNode(this.documentElement),a.documentElement),a.close(),c},A.prototype.createElementClone=function(A){if(mr(A,2),Vn(A))return this.createCanvasClone(A);if(Rn(A))return this.createVideoClone(A);if(Nn(A))return this.createStyleClone(A);var e=A.cloneNode(!1);return kn(e)&&(kn(A)&&A.currentSrc&&A.currentSrc!==A.src&&(e.src=A.currentSrc,e.srcset=""),"lazy"===e.loading&&(e.loading="eager")),Yn(e)?this.createCustomElementClone(e):e},A.prototype.createCustomElementClone=function(A){var e=document.createElement("html2canvascustomelement");return Co(A.style,e),e},A.prototype.createStyleClone=function(A){try{var e=A.sheet;if(e&&e.cssRules){var t=[].slice.call(e.cssRules,0).reduce((function(A,e){return e&&"string"==typeof e.cssText?A+e.cssText:A}),""),r=A.cloneNode(!1);return r.textContent=t,r}}catch(A){if(this.context.logger.error("Unable to access cssRules property",A),"SecurityError"!==A.name)throw A}return A.cloneNode(!1)},A.prototype.createCanvasClone=function(A){var e;if(this.options.inlineImages&&A.ownerDocument){var t=A.ownerDocument.createElement("img");try{return t.src=A.toDataURL(),t}catch(e){this.context.logger.info("Unable to inline canvas contents, canvas is tainted",A)}}var r=A.cloneNode(!1);try{r.width=A.width,r.height=A.height;var n=A.getContext("2d"),o=r.getContext("2d");if(o)if(!this.options.allowTaint&&n)o.putImageData(n.getImageData(0,0,A.width,A.height),0,0);else{var i=null!==(e=A.getContext("webgl2"))&&void 0!==e?e:A.getContext("webgl");if(i){var s=i.getContextAttributes();!1===(null==s?void 0:s.preserveDrawingBuffer)&&this.context.logger.warn("Unable to clone WebGL context as it has preserveDrawingBuffer=false",A)}o.drawImage(A,0,0)}return r}catch(e){this.context.logger.info("Unable to clone canvas as it is tainted",A)}return r},A.prototype.createVideoClone=function(A){var e=A.ownerDocument.createElement("canvas");e.width=A.offsetWidth,e.height=A.offsetHeight;var t=e.getContext("2d");try{return t&&(t.drawImage(A,0,0,e.width,e.height),this.options.allowTaint||t.getImageData(0,0,e.width,e.height)),e}catch(e){this.context.logger.info("Unable to clone video as it is tainted",A)}var r=A.ownerDocument.createElement("canvas");return r.width=A.offsetWidth,r.height=A.offsetHeight,r},A.prototype.appendChildNode=function(A,e,t){Dn(e)&&("SCRIPT"===e.tagName||e.hasAttribute(co)||"function"==typeof this.options.ignoreElements&&this.options.ignoreElements(e))||this.options.copyStyles&&Dn(e)&&Nn(e)||A.appendChild(this.cloneNode(e,t))},A.prototype.cloneChildNodes=function(A,e,t){for(var r=this,n=A.shadowRoot?A.shadowRoot.firstChild:A.firstChild;n;n=n.nextSibling)if(Dn(n)&&Wn(n)&&"function"==typeof n.assignedNodes){var o=n.assignedNodes();o.length&&o.forEach((function(A){return r.appendChildNode(e,A,t)}))}else this.appendChildNode(e,n,t)},A.prototype.cloneNode=function(A,e){if(Ln(A))return document.createTextNode(A.data);if(!A.ownerDocument)return A.cloneNode(!1);var t=A.ownerDocument.defaultView;if(t&&Dn(A)&&(xn(A)||Sn(A))){var r=this.createElementClone(A);r.style.transitionProperty="none";var n=t.getComputedStyle(A),o=t.getComputedStyle(A,":before"),i=t.getComputedStyle(A,":after");this.referenceElement===A&&xn(r)&&(this.clonedReferenceElement=r),Gn(r)&&Eo(r);var s=this.counters.parse(new Ir(this.context,n)),B=this.resolvePseudoContent(A,r,o,Tr.BEFORE);Yn(A)&&(e=!0),Rn(A)||this.cloneChildNodes(A,r,e),B&&r.insertBefore(B,r.firstChild);var a=this.resolvePseudoContent(A,r,i,Tr.AFTER);return a&&r.appendChild(a),this.counters.pop(s),(n&&(this.options.copyStyles||Sn(A))&&!Pn(A)||e)&&Co(n,r),0===A.scrollTop&&0===A.scrollLeft||this.scrolledElements.push([r,A.scrollLeft,A.scrollTop]),(Xn(A)||Jn(A))&&(Xn(r)||Jn(r))&&(r.value=A.value),r}return A.cloneNode(!1)},A.prototype.resolvePseudoContent=function(A,e,t,r){var n=this;if(t){var o=t.content,i=e.ownerDocument;if(i&&o&&"none"!==o&&"-moz-alt-content"!==o&&"none"!==t.display){this.counters.parse(new Ir(this.context,t));var s=new yr(this.context,t),B=i.createElement("html2canvaspseudoelement");Co(t,B),s.content.forEach((function(e){if(0===e.type)B.appendChild(i.createTextNode(e.value));else if(22===e.type){var t=i.createElement("img");t.src=e.value,t.style.opacity="1",B.appendChild(t)}else if(18===e.type){if("attr"===e.name){var r=e.values.filter(YA);r.length&&B.appendChild(i.createTextNode(A.getAttribute(r[0].value)||""))}else if("counter"===e.name){var o=e.values.filter(qA),a=o[0],c=o[1];if(a&&YA(a)){var u=n.counters.getCounterValue(a.value),l=c&&YA(c)?Dt.parse(n.context,c.value):3;B.appendChild(i.createTextNode(ao(u,l,!1)))}}else if("counters"===e.name){var g=e.values.filter(qA),w=(a=g[0],g[1]);c=g[2];if(a&&YA(a)){var Q=n.counters.getCounterValues(a.value),f=c&&YA(c)?Dt.parse(n.context,c.value):3,h=w&&0===w.type?w.value:"",C=Q.map((function(A){return ao(A,f,!1)})).join(h);B.appendChild(i.createTextNode(C))}}}else if(20===e.type)switch(e.value){case"open-quote":B.appendChild(i.createTextNode(Cr(s.quotes,n.quoteDepth++,!0)));break;case"close-quote":B.appendChild(i.createTextNode(Cr(s.quotes,--n.quoteDepth,!1)));break;default:B.appendChild(i.createTextNode(e.value))}})),B.className=Ho+" "+yo;var a=r===Tr.BEFORE?" "+Ho:" "+yo;return Sn(e)?e.className.baseValue+=a:e.className+=a,B}}},A.destroy=function(A){return!!A.parentNode&&(A.parentNode.removeChild(A),!0)},A}();!function(A){A[A.BEFORE=0]="BEFORE",A[A.AFTER=1]="AFTER"}(Tr||(Tr={}));var lo,go=function(A,e){var t=A.createElement("iframe");return t.className="html2canvas-container",t.style.visibility="hidden",t.style.position="fixed",t.style.left="-10000px",t.style.top="0px",t.style.border="0",t.width=e.width.toString(),t.height=e.height.toString(),t.scrolling="no",t.setAttribute(co,"true"),A.body.appendChild(t),t},wo=function(A){return new Promise((function(e){A.complete?e():A.src?(A.onload=e,A.onerror=e):e()}))},Qo=function(A){return Promise.all([].slice.call(A.images,0).map(wo))},fo=function(A){return new Promise((function(e,t){var r=A.contentWindow;if(!r)return t("No window assigned for iframe");var n=r.document;r.onload=A.onload=function(){r.onload=A.onload=null;var t=setInterval((function(){n.body.childNodes.length>0&&"complete"===n.readyState&&(clearInterval(t),e(A))}),50)}}))},ho=["all","d","content"],Co=function(A,e){for(var t=A.length-1;t>=0;t--){var r=A.item(t);-1===ho.indexOf(r)&&e.style.setProperty(r,A.getPropertyValue(r))}return e},Uo=function(A){var e="";return A&&(e+=""),e},Fo=function(A,e,t){A&&A.defaultView&&(e!==A.defaultView.pageXOffset||t!==A.defaultView.pageYOffset)&&A.defaultView.scrollTo(e,t)},po=function(A){var e=A[0],t=A[1],r=A[2];e.scrollLeft=t,e.scrollTop=r},Ho="___html2canvas___pseudoelement_before",yo="___html2canvas___pseudoelement_after",Io='{\n content: "" !important;\n display: none !important;\n}',Eo=function(A){mo(A,"."+Ho+":before"+Io+"\n ."+yo+":after"+Io)},mo=function(A,e){var t=A.ownerDocument;if(t){var r=t.createElement("style");r.textContent=e,A.appendChild(r)}},vo=function(){function A(){}return A.getOrigin=function(e){var t=A._link;return t?(t.href=e,t.href=t.href,t.protocol+t.hostname+t.port):"about:blank"},A.isSameOrigin=function(e){return A.getOrigin(e)===A._origin},A.setContext=function(e){A._link=e.document.createElement("a"),A._origin=A.getOrigin(e.location.href)},A._origin="about:blank",A}(),Ko=function(){function A(A,e){this.context=A,this._options=e,this._cache={}}return A.prototype.addImage=function(A){var e=Promise.resolve();return this.has(A)?e:Mo(A)||xo(A)?((this._cache[A]=this.loadImage(A)).catch((function(){})),e):e},A.prototype.match=function(A){return this._cache[A]},A.prototype.loadImage=function(A){return i(this,void 0,void 0,(function(){var e,t,r,n,o=this;return s(this,(function(i){switch(i.label){case 0:return e=vo.isSameOrigin(A),t=!So(A)&&!0===this._options.useCORS&&zr.SUPPORT_CORS_IMAGES&&!e,r=!So(A)&&!e&&!Mo(A)&&"string"==typeof this._options.proxy&&zr.SUPPORT_CORS_XHR&&!t,e||!1!==this._options.allowTaint||So(A)||Mo(A)||r||t?(n=A,r?[4,this.proxy(n)]:[3,2]):[2];case 1:n=i.sent(),i.label=2;case 2:return this.context.logger.debug("Added image "+A.substring(0,256)),[4,new Promise((function(A,e){var r=new Image;r.onload=function(){return A(r)},r.onerror=e,(_o(n)||t)&&(r.crossOrigin="anonymous"),r.src=n,!0===r.complete&&setTimeout((function(){return A(r)}),500),o._options.imageTimeout>0&&setTimeout((function(){return e("Timed out ("+o._options.imageTimeout+"ms) loading image")}),o._options.imageTimeout)}))];case 3:return[2,i.sent()]}}))}))},A.prototype.has=function(A){return void 0!==this._cache[A]},A.prototype.keys=function(){return Promise.resolve(Object.keys(this._cache))},A.prototype.proxy=function(A){var e=this,t=this._options.proxy;if(!t)throw new Error("No proxy defined");var r=A.substring(0,256);return new Promise((function(n,o){var i=zr.SUPPORT_RESPONSE_TYPE?"blob":"text",s=new XMLHttpRequest;s.onload=function(){if(200===s.status)if("text"===i)n(s.response);else{var A=new FileReader;A.addEventListener("load",(function(){return n(A.result)}),!1),A.addEventListener("error",(function(A){return o(A)}),!1),A.readAsDataURL(s.response)}else o("Failed to proxy resource "+r+" with status code "+s.status)},s.onerror=o;var B=t.indexOf("?")>-1?"&":"?";if(s.open("GET",""+t+B+"url="+encodeURIComponent(A)+"&responseType="+i),"text"!==i&&s instanceof XMLHttpRequest&&(s.responseType=i),e._options.imageTimeout){var a=e._options.imageTimeout;s.timeout=a,s.ontimeout=function(){return o("Timed out ("+a+"ms) proxying "+r)}}s.send()}))},A}(),bo=/^data:image\/svg\+xml/i,Lo=/^data:image\/.*;base64,/i,Do=/^data:image\/.*/i,xo=function(A){return zr.SUPPORT_SVG_DRAWING||!To(A)},So=function(A){return Do.test(A)},_o=function(A){return Lo.test(A)},Mo=function(A){return"blob"===A.substr(0,4)},To=function(A){return"svg"===A.substr(-3).toLowerCase()||bo.test(A)},Oo=function(){function A(A,e){this.type=0,this.x=A,this.y=e}return A.prototype.add=function(e,t){return new A(this.x+e,this.y+t)},A}(),Go=function(A,e,t){return new Oo(A.x+(e.x-A.x)*t,A.y+(e.y-A.y)*t)},Vo=function(){function A(A,e,t,r){this.type=1,this.start=A,this.startControl=e,this.endControl=t,this.end=r}return A.prototype.subdivide=function(e,t){var r=Go(this.start,this.startControl,e),n=Go(this.startControl,this.endControl,e),o=Go(this.endControl,this.end,e),i=Go(r,n,e),s=Go(n,o,e),B=Go(i,s,e);return t?new A(this.start,r,i,B):new A(B,s,o,this.end)},A.prototype.add=function(e,t){return new A(this.start.add(e,t),this.startControl.add(e,t),this.endControl.add(e,t),this.end.add(e,t))},A.prototype.reverse=function(){return new A(this.end,this.endControl,this.startControl,this.start)},A}(),Ro=function(A){return 1===A.type},ko=function(A){var e=A.styles,t=A.bounds,r=se(e.borderTopLeftRadius,t.width,t.height),n=r[0],o=r[1],i=se(e.borderTopRightRadius,t.width,t.height),s=i[0],B=i[1],a=se(e.borderBottomRightRadius,t.width,t.height),c=a[0],u=a[1],l=se(e.borderBottomLeftRadius,t.width,t.height),g=l[0],w=l[1],Q=[];Q.push((n+s)/t.width),Q.push((g+c)/t.width),Q.push((o+w)/t.height),Q.push((B+u)/t.height);var f=Math.max.apply(Math,Q);f>1&&(n/=f,o/=f,s/=f,B/=f,c/=f,u/=f,g/=f,w/=f);var h=t.width-s,C=t.height-u,U=t.width-c,F=t.height-w,d=e.borderTopWidth,p=e.borderRightWidth,H=e.borderBottomWidth,y=e.borderLeftWidth,I=Be(e.paddingTop,A.bounds.width),E=Be(e.paddingRight,A.bounds.width),m=Be(e.paddingBottom,A.bounds.width),v=Be(e.paddingLeft,A.bounds.width);this.topLeftBorderDoubleOuterBox=n>0||o>0?Po(t.left+y/3,t.top+d/3,n-y/3,o-d/3,lo.TOP_LEFT):new Oo(t.left+y/3,t.top+d/3),this.topRightBorderDoubleOuterBox=n>0||o>0?Po(t.left+h,t.top+d/3,s-p/3,B-d/3,lo.TOP_RIGHT):new Oo(t.left+t.width-p/3,t.top+d/3),this.bottomRightBorderDoubleOuterBox=c>0||u>0?Po(t.left+U,t.top+C,c-p/3,u-H/3,lo.BOTTOM_RIGHT):new Oo(t.left+t.width-p/3,t.top+t.height-H/3),this.bottomLeftBorderDoubleOuterBox=g>0||w>0?Po(t.left+y/3,t.top+F,g-y/3,w-H/3,lo.BOTTOM_LEFT):new Oo(t.left+y/3,t.top+t.height-H/3),this.topLeftBorderDoubleInnerBox=n>0||o>0?Po(t.left+2*y/3,t.top+2*d/3,n-2*y/3,o-2*d/3,lo.TOP_LEFT):new Oo(t.left+2*y/3,t.top+2*d/3),this.topRightBorderDoubleInnerBox=n>0||o>0?Po(t.left+h,t.top+2*d/3,s-2*p/3,B-2*d/3,lo.TOP_RIGHT):new Oo(t.left+t.width-2*p/3,t.top+2*d/3),this.bottomRightBorderDoubleInnerBox=c>0||u>0?Po(t.left+U,t.top+C,c-2*p/3,u-2*H/3,lo.BOTTOM_RIGHT):new Oo(t.left+t.width-2*p/3,t.top+t.height-2*H/3),this.bottomLeftBorderDoubleInnerBox=g>0||w>0?Po(t.left+2*y/3,t.top+F,g-2*y/3,w-2*H/3,lo.BOTTOM_LEFT):new Oo(t.left+2*y/3,t.top+t.height-2*H/3),this.topLeftBorderStroke=n>0||o>0?Po(t.left+y/2,t.top+d/2,n-y/2,o-d/2,lo.TOP_LEFT):new Oo(t.left+y/2,t.top+d/2),this.topRightBorderStroke=n>0||o>0?Po(t.left+h,t.top+d/2,s-p/2,B-d/2,lo.TOP_RIGHT):new Oo(t.left+t.width-p/2,t.top+d/2),this.bottomRightBorderStroke=c>0||u>0?Po(t.left+U,t.top+C,c-p/2,u-H/2,lo.BOTTOM_RIGHT):new Oo(t.left+t.width-p/2,t.top+t.height-H/2),this.bottomLeftBorderStroke=g>0||w>0?Po(t.left+y/2,t.top+F,g-y/2,w-H/2,lo.BOTTOM_LEFT):new Oo(t.left+y/2,t.top+t.height-H/2),this.topLeftBorderBox=n>0||o>0?Po(t.left,t.top,n,o,lo.TOP_LEFT):new Oo(t.left,t.top),this.topRightBorderBox=s>0||B>0?Po(t.left+h,t.top,s,B,lo.TOP_RIGHT):new Oo(t.left+t.width,t.top),this.bottomRightBorderBox=c>0||u>0?Po(t.left+U,t.top+C,c,u,lo.BOTTOM_RIGHT):new Oo(t.left+t.width,t.top+t.height),this.bottomLeftBorderBox=g>0||w>0?Po(t.left,t.top+F,g,w,lo.BOTTOM_LEFT):new Oo(t.left,t.top+t.height),this.topLeftPaddingBox=n>0||o>0?Po(t.left+y,t.top+d,Math.max(0,n-y),Math.max(0,o-d),lo.TOP_LEFT):new Oo(t.left+y,t.top+d),this.topRightPaddingBox=s>0||B>0?Po(t.left+Math.min(h,t.width-p),t.top+d,h>t.width+p?0:Math.max(0,s-p),Math.max(0,B-d),lo.TOP_RIGHT):new Oo(t.left+t.width-p,t.top+d),this.bottomRightPaddingBox=c>0||u>0?Po(t.left+Math.min(U,t.width-y),t.top+Math.min(C,t.height-H),Math.max(0,c-p),Math.max(0,u-H),lo.BOTTOM_RIGHT):new Oo(t.left+t.width-p,t.top+t.height-H),this.bottomLeftPaddingBox=g>0||w>0?Po(t.left+y,t.top+Math.min(F,t.height-H),Math.max(0,g-y),Math.max(0,w-H),lo.BOTTOM_LEFT):new Oo(t.left+y,t.top+t.height-H),this.topLeftContentBox=n>0||o>0?Po(t.left+y+v,t.top+d+I,Math.max(0,n-(y+v)),Math.max(0,o-(d+I)),lo.TOP_LEFT):new Oo(t.left+y+v,t.top+d+I),this.topRightContentBox=s>0||B>0?Po(t.left+Math.min(h,t.width+y+v),t.top+d+I,h>t.width+y+v?0:s-y+v,B-(d+I),lo.TOP_RIGHT):new Oo(t.left+t.width-(p+E),t.top+d+I),this.bottomRightContentBox=c>0||u>0?Po(t.left+Math.min(U,t.width-(y+v)),t.top+Math.min(C,t.height+d+I),Math.max(0,c-(p+E)),u-(H+m),lo.BOTTOM_RIGHT):new Oo(t.left+t.width-(p+E),t.top+t.height-(H+m)),this.bottomLeftContentBox=g>0||w>0?Po(t.left+y+v,t.top+F,Math.max(0,g-(y+v)),w-(H+m),lo.BOTTOM_LEFT):new Oo(t.left+y+v,t.top+t.height-(H+m))};!function(A){A[A.TOP_LEFT=0]="TOP_LEFT",A[A.TOP_RIGHT=1]="TOP_RIGHT",A[A.BOTTOM_RIGHT=2]="BOTTOM_RIGHT",A[A.BOTTOM_LEFT=3]="BOTTOM_LEFT"}(lo||(lo={}));var Po=function(A,e,t,r,n){var o=(Math.sqrt(2)-1)/3*4,i=t*o,s=r*o,B=A+t,a=e+r;switch(n){case lo.TOP_LEFT:return new Vo(new Oo(A,a),new Oo(A,a-s),new Oo(B-i,e),new Oo(B,e));case lo.TOP_RIGHT:return new Vo(new Oo(A,e),new Oo(A+i,e),new Oo(B,a-s),new Oo(B,a));case lo.BOTTOM_RIGHT:return new Vo(new Oo(B,e),new Oo(B,e+s),new Oo(A+i,a),new Oo(A,a));case lo.BOTTOM_LEFT:default:return new Vo(new Oo(B,a),new Oo(B-i,a),new Oo(A,e+s),new Oo(A,e))}},No=function(A){return[A.topLeftBorderBox,A.topRightBorderBox,A.bottomRightBorderBox,A.bottomLeftBorderBox]},Xo=function(A){return[A.topLeftPaddingBox,A.topRightPaddingBox,A.bottomRightPaddingBox,A.bottomLeftPaddingBox]},Jo=function(A,e,t){this.offsetX=A,this.offsetY=e,this.matrix=t,this.type=0,this.target=6},Wo=function(A,e){this.path=A,this.target=e,this.type=1},Yo=function(A){this.opacity=A,this.type=2,this.target=6},Zo=function(A){return 1===A.type},jo=function(A,e){return A.length===e.length&&A.some((function(A,t){return A===e[t]}))},zo=function(A){this.element=A,this.inlineLevel=[],this.nonInlineLevel=[],this.negativeZIndex=[],this.zeroOrAutoZIndexOrTransformedOrOpacity=[],this.positiveZIndex=[],this.nonPositionedFloats=[],this.nonPositionedInlineLevel=[]},qo=function(){function A(A,e){if(this.container=A,this.parent=e,this.effects=[],this.curves=new ko(this.container),this.container.styles.opacity<1&&this.effects.push(new Yo(this.container.styles.opacity)),null!==this.container.styles.transform){var t=this.container.bounds.left+this.container.styles.transformOrigin[0].number,r=this.container.bounds.top+this.container.styles.transformOrigin[1].number,n=this.container.styles.transform;this.effects.push(new Jo(t,r,n))}if(0!==this.container.styles.overflowX){var o=No(this.curves),i=Xo(this.curves);jo(o,i)?this.effects.push(new Wo(o,6)):(this.effects.push(new Wo(o,2)),this.effects.push(new Wo(i,4)))}}return A.prototype.getEffects=function(A){for(var e=-1===[2,3].indexOf(this.container.styles.position),t=this.parent,r=this.effects.slice(0);t;){var n=t.effects.filter((function(A){return!Zo(A)}));if(e||0!==t.container.styles.position||!t.parent){if(r.unshift.apply(r,n),e=-1===[2,3].indexOf(t.container.styles.position),0!==t.container.styles.overflowX){var o=No(t.curves),i=Xo(t.curves);jo(o,i)||r.unshift(new Wo(i,6))}}else r.unshift.apply(r,n);t=t.parent}return r.filter((function(e){return lr(e.target,A)}))},A}(),$o=function(A,e,t,r){A.container.elements.forEach((function(n){var o=lr(n.flags,4),i=lr(n.flags,2),s=new qo(n,A);lr(n.styles.display,2048)&&r.push(s);var B=lr(n.flags,8)?[]:r;if(o||i){var a=o||n.styles.isPositioned()?t:e,c=new zo(s);if(n.styles.isPositioned()||n.styles.opacity<1||n.styles.isTransformed()){var u=n.styles.zIndex.order;if(u<0){var l=0;a.negativeZIndex.some((function(A,e){return u>A.element.container.styles.zIndex.order?(l=e,!1):l>0})),a.negativeZIndex.splice(l,0,c)}else if(u>0){var g=0;a.positiveZIndex.some((function(A,e){return u>=A.element.container.styles.zIndex.order?(g=e+1,!1):g>0})),a.positiveZIndex.splice(g,0,c)}else a.zeroOrAutoZIndexOrTransformedOrOpacity.push(c)}else n.styles.isFloating()?a.nonPositionedFloats.push(c):a.nonPositionedInlineLevel.push(c);$o(s,c,o?c:t,B)}else n.styles.isInlineLevel()?e.inlineLevel.push(s):e.nonInlineLevel.push(s),$o(s,e,t,B);lr(n.flags,8)&&Ai(n,B)}))},Ai=function(A,e){for(var t=A instanceof wn?A.start:1,r=A instanceof wn&&A.reversed,n=0;n0&&A.intrinsicHeight>0){var r=oi(A),n=Xo(e);this.path(n),this.ctx.save(),this.ctx.clip(),this.ctx.drawImage(t,0,0,A.intrinsicWidth,A.intrinsicHeight,r.left,r.top,r.width,r.height),this.ctx.restore()}},e.prototype.renderNodeContent=function(A){return i(this,void 0,void 0,(function(){var t,r,n,o,i,B,c,u,l,g,w,Q,f,h,C,U,F,d;return s(this,(function(s){switch(s.label){case 0:this.applyEffects(A.getEffects(4)),t=A.container,r=A.curves,n=t.styles,o=0,i=t.textNodes,s.label=1;case 1:return o0&&y>0&&(C=r.ctx.createPattern(Q,"repeat"),r.renderRepeat(F,C,E,m))):function(A){return 2===A.type}(t)&&(U=ii(A,e,[null,null,null]),F=U[0],d=U[1],p=U[2],H=U[3],y=U[4],I=0===t.position.length?[oe]:t.position,E=Be(I[0],H),m=Be(I[I.length-1],y),v=function(A,e,t,r,n){var o=0,i=0;switch(A.size){case 0:0===A.shape?o=i=Math.min(Math.abs(e),Math.abs(e-r),Math.abs(t),Math.abs(t-n)):1===A.shape&&(o=Math.min(Math.abs(e),Math.abs(e-r)),i=Math.min(Math.abs(t),Math.abs(t-n)));break;case 2:if(0===A.shape)o=i=Math.min(Le(e,t),Le(e,t-n),Le(e-r,t),Le(e-r,t-n));else if(1===A.shape){var s=Math.min(Math.abs(t),Math.abs(t-n))/Math.min(Math.abs(e),Math.abs(e-r)),B=De(r,n,e,t,!0),a=B[0],c=B[1];i=s*(o=Le(a-e,(c-t)/s))}break;case 1:0===A.shape?o=i=Math.max(Math.abs(e),Math.abs(e-r),Math.abs(t),Math.abs(t-n)):1===A.shape&&(o=Math.max(Math.abs(e),Math.abs(e-r)),i=Math.max(Math.abs(t),Math.abs(t-n)));break;case 3:if(0===A.shape)o=i=Math.max(Le(e,t),Le(e,t-n),Le(e-r,t),Le(e-r,t-n));else if(1===A.shape){s=Math.max(Math.abs(t),Math.abs(t-n))/Math.max(Math.abs(e),Math.abs(e-r));var u=De(r,n,e,t,!1);a=u[0],c=u[1],i=s*(o=Le(a-e,(c-t)/s))}}return Array.isArray(A.size)&&(o=Be(A.size[0],r),i=2===A.size.length?Be(A.size[1],n):o),[o,i]}(t,E,m,H,y),K=v[0],b=v[1],K>0&&b>0&&(L=r.ctx.createRadialGradient(d+E,p+m,0,d+E,p+m,K),Ke(t.stops,2*K).forEach((function(A){return L.addColorStop(A.stop,he(A.color))})),r.path(F),r.ctx.fillStyle=L,K!==b?(D=A.bounds.left+.5*A.bounds.width,x=A.bounds.top+.5*A.bounds.height,_=1/(S=b/K),r.ctx.save(),r.ctx.translate(D,x),r.ctx.transform(1,0,0,S,0,0),r.ctx.translate(-D,-x),r.ctx.fillRect(d,_*(p-x)+x,H,y*_),r.ctx.restore()):r.ctx.fill())),s.label=6;case 6:return e--,[2]}}))},r=this,n=0,o=A.styles.backgroundImage.slice(0).reverse(),B.label=1;case 1:return n0?2!==a.style?[3,5]:[4,this.renderDashedDottedBorder(a.color,a.width,o,A.curves,2)]:[3,11]:[3,13];case 4:return s.sent(),[3,11];case 5:return 3!==a.style?[3,7]:[4,this.renderDashedDottedBorder(a.color,a.width,o,A.curves,3)];case 6:return s.sent(),[3,11];case 7:return 4!==a.style?[3,9]:[4,this.renderDoubleBorder(a.color,a.width,o,A.curves)];case 8:return s.sent(),[3,11];case 9:return[4,this.renderSolidBorder(a.color,o,A.curves)];case 10:s.sent(),s.label=11;case 11:o++,s.label=12;case 12:return i++,[3,3];case 13:return[2]}}))}))},e.prototype.renderDashedDottedBorder=function(A,e,t,r,n){return i(this,void 0,void 0,(function(){var o,i,B,a,c,u,l,g,w,Q,f,h,C,U,F,d;return s(this,(function(s){return this.ctx.save(),o=function(A,e){switch(e){case 0:return ti(A.topLeftBorderStroke,A.topRightBorderStroke);case 1:return ti(A.topRightBorderStroke,A.bottomRightBorderStroke);case 2:return ti(A.bottomRightBorderStroke,A.bottomLeftBorderStroke);default:return ti(A.bottomLeftBorderStroke,A.topLeftBorderStroke)}}(r,t),i=ei(r,t),2===n&&(this.path(i),this.ctx.clip()),Ro(i[0])?(B=i[0].start.x,a=i[0].start.y):(B=i[0].x,a=i[0].y),Ro(i[1])?(c=i[1].end.x,u=i[1].end.y):(c=i[1].x,u=i[1].y),l=0===t||2===t?Math.abs(B-c):Math.abs(a-u),this.ctx.beginPath(),3===n?this.formatPath(o):this.formatPath(i.slice(0,2)),g=e<3?3*e:2*e,w=e<3?2*e:e,3===n&&(g=e,w=e),Q=!0,l<=2*g?Q=!1:l<=2*g+w?(g*=f=l/(2*g+w),w*=f):(h=Math.floor((l+w)/(g+w)),C=(l-h*g)/(h-1),w=(U=(l-(h+1)*g)/h)<=0||Math.abs(w-C)"']/g,j=RegExp(Y.source),z=RegExp(Z.source),q=/<%-([\s\S]+?)%>/g,$=/<%([\s\S]+?)%>/g,AA=/<%=([\s\S]+?)%>/g,eA=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,tA=/^\w*$/,rA=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,nA=/[\\^$.*+?()[\]{}|]/g,oA=RegExp(nA.source),iA=/^\s+/,sA=/\s/,BA=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,aA=/\{\n\/\* \[wrapped with (.+)\] \*/,cA=/,? & /,uA=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,lA=/[()=,{}\[\]\/\s]/,gA=/\\(\\)?/g,wA=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,QA=/\w*$/,fA=/^[-+]0x[0-9a-f]+$/i,hA=/^0b[01]+$/i,CA=/^\[object .+?Constructor\]$/,UA=/^0o[0-7]+$/i,FA=/^(?:0|[1-9]\d*)$/,dA=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,pA=/($^)/,HA=/['\n\r\u2028\u2029\\]/g,yA="\\ud800-\\udfff",IA="\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff",EA="\\u2700-\\u27bf",mA="a-z\\xdf-\\xf6\\xf8-\\xff",vA="A-Z\\xc0-\\xd6\\xd8-\\xde",KA="\\ufe0e\\ufe0f",bA="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",LA="['’]",DA="["+yA+"]",xA="["+bA+"]",SA="["+IA+"]",_A="\\d+",MA="["+EA+"]",TA="["+mA+"]",OA="[^"+yA+bA+_A+EA+mA+vA+"]",GA="\\ud83c[\\udffb-\\udfff]",VA="[^"+yA+"]",RA="(?:\\ud83c[\\udde6-\\uddff]){2}",kA="[\\ud800-\\udbff][\\udc00-\\udfff]",PA="["+vA+"]",NA="\\u200d",XA="(?:"+TA+"|"+OA+")",JA="(?:"+PA+"|"+OA+")",WA="(?:['’](?:d|ll|m|re|s|t|ve))?",YA="(?:['’](?:D|LL|M|RE|S|T|VE))?",ZA="(?:"+SA+"|"+GA+")"+"?",jA="["+KA+"]?",zA=jA+ZA+("(?:"+NA+"(?:"+[VA,RA,kA].join("|")+")"+jA+ZA+")*"),qA="(?:"+[MA,RA,kA].join("|")+")"+zA,$A="(?:"+[VA+SA+"?",SA,RA,kA,DA].join("|")+")",Ae=RegExp(LA,"g"),ee=RegExp(SA,"g"),te=RegExp(GA+"(?="+GA+")|"+$A+zA,"g"),re=RegExp([PA+"?"+TA+"+"+WA+"(?="+[xA,PA,"$"].join("|")+")",JA+"+"+YA+"(?="+[xA,PA+XA,"$"].join("|")+")",PA+"?"+XA+"+"+WA,PA+"+"+YA,"\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",_A,qA].join("|"),"g"),ne=RegExp("["+NA+yA+IA+KA+"]"),oe=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,ie=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],se=-1,Be={};Be[M]=Be[T]=Be[O]=Be[G]=Be[V]=Be[R]=Be[k]=Be[P]=Be[N]=!0,Be[C]=Be[U]=Be[S]=Be[F]=Be[_]=Be[d]=Be[p]=Be[H]=Be[I]=Be[E]=Be[m]=Be[K]=Be[b]=Be[L]=Be[x]=!1;var ae={};ae[C]=ae[U]=ae[S]=ae[_]=ae[F]=ae[d]=ae[M]=ae[T]=ae[O]=ae[G]=ae[V]=ae[I]=ae[E]=ae[m]=ae[K]=ae[b]=ae[L]=ae[D]=ae[R]=ae[k]=ae[P]=ae[N]=!0,ae[p]=ae[H]=ae[x]=!1;var ce={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},ue=parseFloat,le=parseInt,ge="object"==typeof t.g&&t.g&&t.g.Object===Object&&t.g,we="object"==typeof self&&self&&self.Object===Object&&self,Qe=ge||we||Function("return this")(),fe=e&&!e.nodeType&&e,he=fe&&A&&!A.nodeType&&A,Ce=he&&he.exports===fe,Ue=Ce&&ge.process,Fe=function(){try{var A=he&&he.require&&he.require("util").types;return A||Ue&&Ue.binding&&Ue.binding("util")}catch(A){}}(),de=Fe&&Fe.isArrayBuffer,pe=Fe&&Fe.isDate,He=Fe&&Fe.isMap,ye=Fe&&Fe.isRegExp,Ie=Fe&&Fe.isSet,Ee=Fe&&Fe.isTypedArray;function me(A,e,t){switch(t.length){case 0:return A.call(e);case 1:return A.call(e,t[0]);case 2:return A.call(e,t[0],t[1]);case 3:return A.call(e,t[0],t[1],t[2])}return A.apply(e,t)}function ve(A,e,t,r){for(var n=-1,o=null==A?0:A.length;++n-1}function Se(A,e,t){for(var r=-1,n=null==A?0:A.length;++r-1;);return t}function rt(A,e){for(var t=A.length;t--&&Pe(e,A[t],0)>-1;);return t}var nt=Ye({À:"A",Á:"A",Â:"A",Ã:"A",Ä:"A",Å:"A",à:"a",á:"a",â:"a",ã:"a",ä:"a",å:"a",Ç:"C",ç:"c",Ð:"D",ð:"d",È:"E",É:"E",Ê:"E",Ë:"E",è:"e",é:"e",ê:"e",ë:"e",Ì:"I",Í:"I",Î:"I",Ï:"I",ì:"i",í:"i",î:"i",ï:"i",Ñ:"N",ñ:"n",Ò:"O",Ó:"O",Ô:"O",Õ:"O",Ö:"O",Ø:"O",ò:"o",ó:"o",ô:"o",õ:"o",ö:"o",ø:"o",Ù:"U",Ú:"U",Û:"U",Ü:"U",ù:"u",ú:"u",û:"u",ü:"u",Ý:"Y",ý:"y",ÿ:"y",Æ:"Ae",æ:"ae",Þ:"Th",þ:"th",ß:"ss",Ā:"A",Ă:"A",Ą:"A",ā:"a",ă:"a",ą:"a",Ć:"C",Ĉ:"C",Ċ:"C",Č:"C",ć:"c",ĉ:"c",ċ:"c",č:"c",Ď:"D",Đ:"D",ď:"d",đ:"d",Ē:"E",Ĕ:"E",Ė:"E",Ę:"E",Ě:"E",ē:"e",ĕ:"e",ė:"e",ę:"e",ě:"e",Ĝ:"G",Ğ:"G",Ġ:"G",Ģ:"G",ĝ:"g",ğ:"g",ġ:"g",ģ:"g",Ĥ:"H",Ħ:"H",ĥ:"h",ħ:"h",Ĩ:"I",Ī:"I",Ĭ:"I",Į:"I",İ:"I",ĩ:"i",ī:"i",ĭ:"i",į:"i",ı:"i",Ĵ:"J",ĵ:"j",Ķ:"K",ķ:"k",ĸ:"k",Ĺ:"L",Ļ:"L",Ľ:"L",Ŀ:"L",Ł:"L",ĺ:"l",ļ:"l",ľ:"l",ŀ:"l",ł:"l",Ń:"N",Ņ:"N",Ň:"N",Ŋ:"N",ń:"n",ņ:"n",ň:"n",ŋ:"n",Ō:"O",Ŏ:"O",Ő:"O",ō:"o",ŏ:"o",ő:"o",Ŕ:"R",Ŗ:"R",Ř:"R",ŕ:"r",ŗ:"r",ř:"r",Ś:"S",Ŝ:"S",Ş:"S",Š:"S",ś:"s",ŝ:"s",ş:"s",š:"s",Ţ:"T",Ť:"T",Ŧ:"T",ţ:"t",ť:"t",ŧ:"t",Ũ:"U",Ū:"U",Ŭ:"U",Ů:"U",Ű:"U",Ų:"U",ũ:"u",ū:"u",ŭ:"u",ů:"u",ű:"u",ų:"u",Ŵ:"W",ŵ:"w",Ŷ:"Y",ŷ:"y",Ÿ:"Y",Ź:"Z",Ż:"Z",Ž:"Z",ź:"z",ż:"z",ž:"z",IJ:"IJ",ij:"ij",Œ:"Oe",œ:"oe",ʼn:"'n",ſ:"s"}),ot=Ye({"&":"&","<":"<",">":">",'"':""","'":"'"});function it(A){return"\\"+ce[A]}function st(A){return ne.test(A)}function Bt(A){var e=-1,t=Array(A.size);return A.forEach((function(A,r){t[++e]=[r,A]})),t}function at(A,e){return function(t){return A(e(t))}}function ct(A,e){for(var t=-1,r=A.length,n=0,o=[];++t",""":'"',"'":"'"});var ht=function A(e){var t,r=(e=null==e?Qe:ht.defaults(Qe.Object(),e,ht.pick(Qe,ie))).Array,sA=e.Date,yA=e.Error,IA=e.Function,EA=e.Math,mA=e.Object,vA=e.RegExp,KA=e.String,bA=e.TypeError,LA=r.prototype,DA=IA.prototype,xA=mA.prototype,SA=e["__core-js_shared__"],_A=DA.toString,MA=xA.hasOwnProperty,TA=0,OA=(t=/[^.]+$/.exec(SA&&SA.keys&&SA.keys.IE_PROTO||""))?"Symbol(src)_1."+t:"",GA=xA.toString,VA=_A.call(mA),RA=Qe._,kA=vA("^"+_A.call(MA).replace(nA,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),PA=Ce?e.Buffer:n,NA=e.Symbol,XA=e.Uint8Array,JA=PA?PA.allocUnsafe:n,WA=at(mA.getPrototypeOf,mA),YA=mA.create,ZA=xA.propertyIsEnumerable,jA=LA.splice,zA=NA?NA.isConcatSpreadable:n,qA=NA?NA.iterator:n,$A=NA?NA.toStringTag:n,te=function(){try{var A=lo(mA,"defineProperty");return A({},"",{}),A}catch(A){}}(),ne=e.clearTimeout!==Qe.clearTimeout&&e.clearTimeout,ce=sA&&sA.now!==Qe.Date.now&&sA.now,ge=e.setTimeout!==Qe.setTimeout&&e.setTimeout,we=EA.ceil,fe=EA.floor,he=mA.getOwnPropertySymbols,Ue=PA?PA.isBuffer:n,Fe=e.isFinite,Ve=LA.join,Ye=at(mA.keys,mA),Ct=EA.max,Ut=EA.min,Ft=sA.now,dt=e.parseInt,pt=EA.random,Ht=LA.reverse,yt=lo(e,"DataView"),It=lo(e,"Map"),Et=lo(e,"Promise"),mt=lo(e,"Set"),vt=lo(e,"WeakMap"),Kt=lo(mA,"create"),bt=vt&&new vt,Lt={},Dt=Go(yt),xt=Go(It),St=Go(Et),_t=Go(mt),Mt=Go(vt),Tt=NA?NA.prototype:n,Ot=Tt?Tt.valueOf:n,Gt=Tt?Tt.toString:n;function Vt(A){if(ts(A)&&!Xi(A)&&!(A instanceof Nt)){if(A instanceof Pt)return A;if(MA.call(A,"__wrapped__"))return Vo(A)}return new Pt(A)}var Rt=function(){function A(){}return function(e){if(!es(e))return{};if(YA)return YA(e);A.prototype=e;var t=new A;return A.prototype=n,t}}();function kt(){}function Pt(A,e){this.__wrapped__=A,this.__actions__=[],this.__chain__=!!e,this.__index__=0,this.__values__=n}function Nt(A){this.__wrapped__=A,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=f,this.__views__=[]}function Xt(A){var e=-1,t=null==A?0:A.length;for(this.clear();++e=e?A:e)),A}function Br(A,e,t,r,o,i){var s,B=1&e,a=2&e,c=4&e;if(t&&(s=o?t(A,r,o,i):t(A)),s!==n)return s;if(!es(A))return A;var u=Xi(A);if(u){if(s=function(A){var e=A.length,t=new A.constructor(e);e&&"string"==typeof A[0]&&MA.call(A,"index")&&(t.index=A.index,t.input=A.input);return t}(A),!B)return bn(A,s)}else{var l=Qo(A),g=l==H||l==y;if(Zi(A))return yn(A,B);if(l==m||l==C||g&&!o){if(s=a||g?{}:ho(A),!B)return a?function(A,e){return Ln(A,wo(A),e)}(A,function(A,e){return A&&Ln(e,xs(e),A)}(s,A)):function(A,e){return Ln(A,go(A),e)}(A,nr(s,A))}else{if(!ae[l])return o?A:{};s=function(A,e,t){var r=A.constructor;switch(e){case S:return In(A);case F:case d:return new r(+A);case _:return function(A,e){var t=e?In(A.buffer):A.buffer;return new A.constructor(t,A.byteOffset,A.byteLength)}(A,t);case M:case T:case O:case G:case V:case R:case k:case P:case N:return En(A,t);case I:return new r;case E:case L:return new r(A);case K:return function(A){var e=new A.constructor(A.source,QA.exec(A));return e.lastIndex=A.lastIndex,e}(A);case b:return new r;case D:return n=A,Ot?mA(Ot.call(n)):{}}var n}(A,l,B)}}i||(i=new Zt);var w=i.get(A);if(w)return w;i.set(A,s),ss(A)?A.forEach((function(r){s.add(Br(r,e,t,r,A,i))})):rs(A)&&A.forEach((function(r,n){s.set(n,Br(r,e,t,n,A,i))}));var Q=u?n:(c?a?oo:no:a?xs:Ds)(A);return Ke(Q||A,(function(r,n){Q&&(r=A[n=r]),er(s,n,Br(r,e,t,n,A,i))})),s}function ar(A,e,t){var r=t.length;if(null==A)return!r;for(A=mA(A);r--;){var o=t[r],i=e[o],s=A[o];if(s===n&&!(o in A)||!i(s))return!1}return!0}function cr(A,e,t){if("function"!=typeof A)throw new bA(o);return Do((function(){A.apply(n,t)}),e)}function ur(A,e,t,r){var n=-1,o=xe,i=!0,s=A.length,B=[],a=e.length;if(!s)return B;t&&(e=_e(e,$e(t))),r?(o=Se,i=!1):e.length>=200&&(o=et,i=!1,e=new Yt(e));A:for(;++n-1},Jt.prototype.set=function(A,e){var t=this.__data__,r=tr(t,A);return r<0?(++this.size,t.push([A,e])):t[r][1]=e,this},Wt.prototype.clear=function(){this.size=0,this.__data__={hash:new Xt,map:new(It||Jt),string:new Xt}},Wt.prototype.delete=function(A){var e=co(this,A).delete(A);return this.size-=e?1:0,e},Wt.prototype.get=function(A){return co(this,A).get(A)},Wt.prototype.has=function(A){return co(this,A).has(A)},Wt.prototype.set=function(A,e){var t=co(this,A),r=t.size;return t.set(A,e),this.size+=t.size==r?0:1,this},Yt.prototype.add=Yt.prototype.push=function(A){return this.__data__.set(A,i),this},Yt.prototype.has=function(A){return this.__data__.has(A)},Zt.prototype.clear=function(){this.__data__=new Jt,this.size=0},Zt.prototype.delete=function(A){var e=this.__data__,t=e.delete(A);return this.size=e.size,t},Zt.prototype.get=function(A){return this.__data__.get(A)},Zt.prototype.has=function(A){return this.__data__.has(A)},Zt.prototype.set=function(A,e){var t=this.__data__;if(t instanceof Jt){var r=t.__data__;if(!It||r.length<199)return r.push([A,e]),this.size=++t.size,this;t=this.__data__=new Wt(r)}return t.set(A,e),this.size=t.size,this};var lr=Sn(Fr),gr=Sn(dr,!0);function wr(A,e){var t=!0;return lr(A,(function(A,r,n){return t=!!e(A,r,n)})),t}function Qr(A,e,t){for(var r=-1,o=A.length;++r0&&t(s)?e>1?hr(s,e-1,t,r,n):Me(n,s):r||(n[n.length]=s)}return n}var Cr=_n(),Ur=_n(!0);function Fr(A,e){return A&&Cr(A,e,Ds)}function dr(A,e){return A&&Ur(A,e,Ds)}function pr(A,e){return De(e,(function(e){return qi(A[e])}))}function Hr(A,e){for(var t=0,r=(e=Fn(e,A)).length;null!=A&&te}function mr(A,e){return null!=A&&MA.call(A,e)}function vr(A,e){return null!=A&&e in mA(A)}function Kr(A,e,t){for(var o=t?Se:xe,i=A[0].length,s=A.length,B=s,a=r(s),c=1/0,u=[];B--;){var l=A[B];B&&e&&(l=_e(l,$e(e))),c=Ut(l.length,c),a[B]=!t&&(e||i>=120&&l.length>=120)?new Yt(B&&l):n}l=A[0];var g=-1,w=a[0];A:for(;++g=s?B:B*("desc"==t[r]?-1:1)}return A.index-e.index}(A,e,t)}))}function Xr(A,e,t){for(var r=-1,n=e.length,o={};++r-1;)s!==A&&jA.call(s,B,1),jA.call(A,B,1);return A}function Wr(A,e){for(var t=A?e.length:0,r=t-1;t--;){var n=e[t];if(t==r||n!==o){var o=n;Uo(n)?jA.call(A,n,1):ln(A,n)}}return A}function Yr(A,e){return A+fe(pt()*(e-A+1))}function Zr(A,e){var t="";if(!A||e<1||e>w)return t;do{e%2&&(t+=A),(e=fe(e/2))&&(A+=A)}while(e);return t}function jr(A,e){return xo(vo(A,e,nB),A+"")}function zr(A){return zt(Rs(A))}function qr(A,e){var t=Rs(A);return Mo(t,sr(e,0,t.length))}function $r(A,e,t,r){if(!es(A))return A;for(var o=-1,i=(e=Fn(e,A)).length,s=i-1,B=A;null!=B&&++oo?0:o+e),(t=t>o?o:t)<0&&(t+=o),o=e>t?0:t-e>>>0,e>>>=0;for(var i=r(o);++n>>1,i=A[o];null!==i&&!as(i)&&(t?i<=e:i=200){var a=e?null:jn(A);if(a)return ut(a);i=!1,n=et,B=new Yt}else B=e?[]:s;A:for(;++r=r?A:rn(A,e,t)}var Hn=ne||function(A){return Qe.clearTimeout(A)};function yn(A,e){if(e)return A.slice();var t=A.length,r=JA?JA(t):new A.constructor(t);return A.copy(r),r}function In(A){var e=new A.constructor(A.byteLength);return new XA(e).set(new XA(A)),e}function En(A,e){var t=e?In(A.buffer):A.buffer;return new A.constructor(t,A.byteOffset,A.length)}function mn(A,e){if(A!==e){var t=A!==n,r=null===A,o=A==A,i=as(A),s=e!==n,B=null===e,a=e==e,c=as(e);if(!B&&!c&&!i&&A>e||i&&s&&a&&!B&&!c||r&&s&&a||!t&&a||!o)return 1;if(!r&&!i&&!c&&A1?t[o-1]:n,s=o>2?t[2]:n;for(i=A.length>3&&"function"==typeof i?(o--,i):n,s&&Fo(t[0],t[1],s)&&(i=o<3?n:i,o=1),e=mA(e);++r-1?o[i?e[s]:s]:n}}function Vn(A){return ro((function(e){var t=e.length,r=t,i=Pt.prototype.thru;for(A&&e.reverse();r--;){var s=e[r];if("function"!=typeof s)throw new bA(o);if(i&&!B&&"wrapper"==so(s))var B=new Pt([],!0)}for(r=B?r:t;++r1&&F.reverse(),g&&cB))return!1;var c=i.get(A),u=i.get(e);if(c&&u)return c==e&&u==A;var l=-1,g=!0,w=2&t?new Yt:n;for(i.set(A,e),i.set(e,A);++l-1&&A%1==0&&A1?"& ":"")+e[r],e=e.join(t>2?", ":" "),A.replace(BA,"{\n/* [wrapped with "+e+"] */\n")}(r,function(A,e){return Ke(h,(function(t){var r="_."+t[0];e&t[1]&&!xe(A,r)&&A.push(r)})),A.sort()}(function(A){var e=A.match(aA);return e?e[1].split(cA):[]}(r),t)))}function _o(A){var e=0,t=0;return function(){var r=Ft(),o=16-(r-t);if(t=r,o>0){if(++e>=800)return arguments[0]}else e=0;return A.apply(n,arguments)}}function Mo(A,e){var t=-1,r=A.length,o=r-1;for(e=e===n?r:e;++t1?A[e-1]:n;return t="function"==typeof t?(A.pop(),t):n,ii(A,t)}));function gi(A){var e=Vt(A);return e.__chain__=!0,e}function wi(A,e){return e(A)}var Qi=ro((function(A){var e=A.length,t=e?A[0]:0,r=this.__wrapped__,o=function(e){return ir(e,A)};return!(e>1||this.__actions__.length)&&r instanceof Nt&&Uo(t)?((r=r.slice(t,+t+(e?1:0))).__actions__.push({func:wi,args:[o],thisArg:n}),new Pt(r,this.__chain__).thru((function(A){return e&&!A.length&&A.push(n),A}))):this.thru(o)}));var fi=Dn((function(A,e,t){MA.call(A,t)?++A[t]:or(A,t,1)}));var hi=Gn(No),Ci=Gn(Xo);function Ui(A,e){return(Xi(A)?Ke:lr)(A,ao(e,3))}function Fi(A,e){return(Xi(A)?be:gr)(A,ao(e,3))}var di=Dn((function(A,e,t){MA.call(A,t)?A[t].push(e):or(A,t,[e])}));var pi=jr((function(A,e,t){var n=-1,o="function"==typeof e,i=Wi(A)?r(A.length):[];return lr(A,(function(A){i[++n]=o?me(e,A,t):br(A,e,t)})),i})),Hi=Dn((function(A,e,t){or(A,t,e)}));function yi(A,e){return(Xi(A)?_e:Gr)(A,ao(e,3))}var Ii=Dn((function(A,e,t){A[t?0:1].push(e)}),(function(){return[[],[]]}));var Ei=jr((function(A,e){if(null==A)return[];var t=e.length;return t>1&&Fo(A,e[0],e[1])?e=[]:t>2&&Fo(e[0],e[1],e[2])&&(e=[e[0]]),Nr(A,hr(e,1),[])})),mi=ce||function(){return Qe.Date.now()};function vi(A,e,t){return e=t?n:e,e=A&&null==e?A.length:e,qn(A,u,n,n,n,n,e)}function Ki(A,e){var t;if("function"!=typeof e)throw new bA(o);return A=Qs(A),function(){return--A>0&&(t=e.apply(this,arguments)),A<=1&&(e=n),t}}var bi=jr((function(A,e,t){var r=1;if(t.length){var n=ct(t,Bo(bi));r|=a}return qn(A,r,e,t,n)})),Li=jr((function(A,e,t){var r=3;if(t.length){var n=ct(t,Bo(Li));r|=a}return qn(e,r,A,t,n)}));function Di(A,e,t){var r,i,s,B,a,c,u=0,l=!1,g=!1,w=!0;if("function"!=typeof A)throw new bA(o);function Q(e){var t=r,o=i;return r=i=n,u=e,B=A.apply(o,t)}function f(A){var t=A-c;return c===n||t>=e||t<0||g&&A-u>=s}function h(){var A=mi();if(f(A))return C(A);a=Do(h,function(A){var t=e-(A-c);return g?Ut(t,s-(A-u)):t}(A))}function C(A){return a=n,w&&r?Q(A):(r=i=n,B)}function U(){var A=mi(),t=f(A);if(r=arguments,i=this,c=A,t){if(a===n)return function(A){return u=A,a=Do(h,e),l?Q(A):B}(c);if(g)return Hn(a),a=Do(h,e),Q(c)}return a===n&&(a=Do(h,e)),B}return e=hs(e)||0,es(t)&&(l=!!t.leading,s=(g="maxWait"in t)?Ct(hs(t.maxWait)||0,e):s,w="trailing"in t?!!t.trailing:w),U.cancel=function(){a!==n&&Hn(a),u=0,r=c=i=a=n},U.flush=function(){return a===n?B:C(mi())},U}var xi=jr((function(A,e){return cr(A,1,e)})),Si=jr((function(A,e,t){return cr(A,hs(e)||0,t)}));function _i(A,e){if("function"!=typeof A||null!=e&&"function"!=typeof e)throw new bA(o);var t=function(){var r=arguments,n=e?e.apply(this,r):r[0],o=t.cache;if(o.has(n))return o.get(n);var i=A.apply(this,r);return t.cache=o.set(n,i)||o,i};return t.cache=new(_i.Cache||Wt),t}function Mi(A){if("function"!=typeof A)throw new bA(o);return function(){var e=arguments;switch(e.length){case 0:return!A.call(this);case 1:return!A.call(this,e[0]);case 2:return!A.call(this,e[0],e[1]);case 3:return!A.call(this,e[0],e[1],e[2])}return!A.apply(this,e)}}_i.Cache=Wt;var Ti=dn((function(A,e){var t=(e=1==e.length&&Xi(e[0])?_e(e[0],$e(ao())):_e(hr(e,1),$e(ao()))).length;return jr((function(r){for(var n=-1,o=Ut(r.length,t);++n=e})),Ni=Lr(function(){return arguments}())?Lr:function(A){return ts(A)&&MA.call(A,"callee")&&!ZA.call(A,"callee")},Xi=r.isArray,Ji=de?$e(de):function(A){return ts(A)&&Ir(A)==S};function Wi(A){return null!=A&&As(A.length)&&!qi(A)}function Yi(A){return ts(A)&&Wi(A)}var Zi=Ue||hB,ji=pe?$e(pe):function(A){return ts(A)&&Ir(A)==d};function zi(A){if(!ts(A))return!1;var e=Ir(A);return e==p||"[object DOMException]"==e||"string"==typeof A.message&&"string"==typeof A.name&&!os(A)}function qi(A){if(!es(A))return!1;var e=Ir(A);return e==H||e==y||"[object AsyncFunction]"==e||"[object Proxy]"==e}function $i(A){return"number"==typeof A&&A==Qs(A)}function As(A){return"number"==typeof A&&A>-1&&A%1==0&&A<=w}function es(A){var e=typeof A;return null!=A&&("object"==e||"function"==e)}function ts(A){return null!=A&&"object"==typeof A}var rs=He?$e(He):function(A){return ts(A)&&Qo(A)==I};function ns(A){return"number"==typeof A||ts(A)&&Ir(A)==E}function os(A){if(!ts(A)||Ir(A)!=m)return!1;var e=WA(A);if(null===e)return!0;var t=MA.call(e,"constructor")&&e.constructor;return"function"==typeof t&&t instanceof t&&_A.call(t)==VA}var is=ye?$e(ye):function(A){return ts(A)&&Ir(A)==K};var ss=Ie?$e(Ie):function(A){return ts(A)&&Qo(A)==b};function Bs(A){return"string"==typeof A||!Xi(A)&&ts(A)&&Ir(A)==L}function as(A){return"symbol"==typeof A||ts(A)&&Ir(A)==D}var cs=Ee?$e(Ee):function(A){return ts(A)&&As(A.length)&&!!Be[Ir(A)]};var us=Wn(Or),ls=Wn((function(A,e){return A<=e}));function gs(A){if(!A)return[];if(Wi(A))return Bs(A)?wt(A):bn(A);if(qA&&A[qA])return function(A){for(var e,t=[];!(e=A.next()).done;)t.push(e.value);return t}(A[qA]());var e=Qo(A);return(e==I?Bt:e==b?ut:Rs)(A)}function ws(A){return A?(A=hs(A))===g||A===-1/0?17976931348623157e292*(A<0?-1:1):A==A?A:0:0===A?A:0}function Qs(A){var e=ws(A),t=e%1;return e==e?t?e-t:e:0}function fs(A){return A?sr(Qs(A),0,f):0}function hs(A){if("number"==typeof A)return A;if(as(A))return Q;if(es(A)){var e="function"==typeof A.valueOf?A.valueOf():A;A=es(e)?e+"":e}if("string"!=typeof A)return 0===A?A:+A;A=qe(A);var t=hA.test(A);return t||UA.test(A)?le(A.slice(2),t?2:8):fA.test(A)?Q:+A}function Cs(A){return Ln(A,xs(A))}function Us(A){return null==A?"":cn(A)}var Fs=xn((function(A,e){if(Io(e)||Wi(e))Ln(e,Ds(e),A);else for(var t in e)MA.call(e,t)&&er(A,t,e[t])})),ds=xn((function(A,e){Ln(e,xs(e),A)})),ps=xn((function(A,e,t,r){Ln(e,xs(e),A,r)})),Hs=xn((function(A,e,t,r){Ln(e,Ds(e),A,r)})),ys=ro(ir);var Is=jr((function(A,e){A=mA(A);var t=-1,r=e.length,o=r>2?e[2]:n;for(o&&Fo(e[0],e[1],o)&&(r=1);++t1),e})),Ln(A,oo(A),t),r&&(t=Br(t,7,eo));for(var n=e.length;n--;)ln(t,e[n]);return t}));var Ts=ro((function(A,e){return null==A?{}:function(A,e){return Xr(A,e,(function(e,t){return vs(A,t)}))}(A,e)}));function Os(A,e){if(null==A)return{};var t=_e(oo(A),(function(A){return[A]}));return e=ao(e),Xr(A,t,(function(A,t){return e(A,t[0])}))}var Gs=zn(Ds),Vs=zn(xs);function Rs(A){return null==A?[]:At(A,Ds(A))}var ks=Tn((function(A,e,t){return e=e.toLowerCase(),A+(t?Ps(e):e)}));function Ps(A){return zs(Us(A).toLowerCase())}function Ns(A){return(A=Us(A))&&A.replace(dA,nt).replace(ee,"")}var Xs=Tn((function(A,e,t){return A+(t?"-":"")+e.toLowerCase()})),Js=Tn((function(A,e,t){return A+(t?" ":"")+e.toLowerCase()})),Ws=Mn("toLowerCase");var Ys=Tn((function(A,e,t){return A+(t?"_":"")+e.toLowerCase()}));var Zs=Tn((function(A,e,t){return A+(t?" ":"")+zs(e)}));var js=Tn((function(A,e,t){return A+(t?" ":"")+e.toUpperCase()})),zs=Mn("toUpperCase");function qs(A,e,t){return A=Us(A),(e=t?n:e)===n?function(A){return oe.test(A)}(A)?function(A){return A.match(re)||[]}(A):function(A){return A.match(uA)||[]}(A):A.match(e)||[]}var $s=jr((function(A,e){try{return me(A,n,e)}catch(A){return zi(A)?A:new yA(A)}})),AB=ro((function(A,e){return Ke(e,(function(e){e=Oo(e),or(A,e,bi(A[e],A))})),A}));function eB(A){return function(){return A}}var tB=Vn(),rB=Vn(!0);function nB(A){return A}function oB(A){return _r("function"==typeof A?A:Br(A,1))}var iB=jr((function(A,e){return function(t){return br(t,A,e)}})),sB=jr((function(A,e){return function(t){return br(A,t,e)}}));function BB(A,e,t){var r=Ds(e),n=pr(e,r);null!=t||es(e)&&(n.length||!r.length)||(t=e,e=A,A=this,n=pr(e,Ds(e)));var o=!(es(t)&&"chain"in t&&!t.chain),i=qi(A);return Ke(n,(function(t){var r=e[t];A[t]=r,i&&(A.prototype[t]=function(){var e=this.__chain__;if(o||e){var t=A(this.__wrapped__);return(t.__actions__=bn(this.__actions__)).push({func:r,args:arguments,thisArg:A}),t.__chain__=e,t}return r.apply(A,Me([this.value()],arguments))})})),A}function aB(){}var cB=Nn(_e),uB=Nn(Le),lB=Nn(Ge);function gB(A){return po(A)?We(Oo(A)):function(A){return function(e){return Hr(e,A)}}(A)}var wB=Jn(),QB=Jn(!0);function fB(){return[]}function hB(){return!1}var CB=Pn((function(A,e){return A+e}),0),UB=Zn("ceil"),FB=Pn((function(A,e){return A/e}),1),dB=Zn("floor");var pB,HB=Pn((function(A,e){return A*e}),1),yB=Zn("round"),IB=Pn((function(A,e){return A-e}),0);return Vt.after=function(A,e){if("function"!=typeof e)throw new bA(o);return A=Qs(A),function(){if(--A<1)return e.apply(this,arguments)}},Vt.ary=vi,Vt.assign=Fs,Vt.assignIn=ds,Vt.assignInWith=ps,Vt.assignWith=Hs,Vt.at=ys,Vt.before=Ki,Vt.bind=bi,Vt.bindAll=AB,Vt.bindKey=Li,Vt.castArray=function(){if(!arguments.length)return[];var A=arguments[0];return Xi(A)?A:[A]},Vt.chain=gi,Vt.chunk=function(A,e,t){e=(t?Fo(A,e,t):e===n)?1:Ct(Qs(e),0);var o=null==A?0:A.length;if(!o||e<1)return[];for(var i=0,s=0,B=r(we(o/e));io?0:o+t),(r=r===n||r>o?o:Qs(r))<0&&(r+=o),r=t>r?0:fs(r);t>>0)?(A=Us(A))&&("string"==typeof e||null!=e&&!is(e))&&!(e=cn(e))&&st(A)?pn(wt(A),0,t):A.split(e,t):[]},Vt.spread=function(A,e){if("function"!=typeof A)throw new bA(o);return e=null==e?0:Ct(Qs(e),0),jr((function(t){var r=t[e],n=pn(t,0,e);return r&&Me(n,r),me(A,this,n)}))},Vt.tail=function(A){var e=null==A?0:A.length;return e?rn(A,1,e):[]},Vt.take=function(A,e,t){return A&&A.length?rn(A,0,(e=t||e===n?1:Qs(e))<0?0:e):[]},Vt.takeRight=function(A,e,t){var r=null==A?0:A.length;return r?rn(A,(e=r-(e=t||e===n?1:Qs(e)))<0?0:e,r):[]},Vt.takeRightWhile=function(A,e){return A&&A.length?wn(A,ao(e,3),!1,!0):[]},Vt.takeWhile=function(A,e){return A&&A.length?wn(A,ao(e,3)):[]},Vt.tap=function(A,e){return e(A),A},Vt.throttle=function(A,e,t){var r=!0,n=!0;if("function"!=typeof A)throw new bA(o);return es(t)&&(r="leading"in t?!!t.leading:r,n="trailing"in t?!!t.trailing:n),Di(A,e,{leading:r,maxWait:e,trailing:n})},Vt.thru=wi,Vt.toArray=gs,Vt.toPairs=Gs,Vt.toPairsIn=Vs,Vt.toPath=function(A){return Xi(A)?_e(A,Oo):as(A)?[A]:bn(To(Us(A)))},Vt.toPlainObject=Cs,Vt.transform=function(A,e,t){var r=Xi(A),n=r||Zi(A)||cs(A);if(e=ao(e,4),null==t){var o=A&&A.constructor;t=n?r?new o:[]:es(A)&&qi(o)?Rt(WA(A)):{}}return(n?Ke:Fr)(A,(function(A,r,n){return e(t,A,r,n)})),t},Vt.unary=function(A){return vi(A,1)},Vt.union=ti,Vt.unionBy=ri,Vt.unionWith=ni,Vt.uniq=function(A){return A&&A.length?un(A):[]},Vt.uniqBy=function(A,e){return A&&A.length?un(A,ao(e,2)):[]},Vt.uniqWith=function(A,e){return e="function"==typeof e?e:n,A&&A.length?un(A,n,e):[]},Vt.unset=function(A,e){return null==A||ln(A,e)},Vt.unzip=oi,Vt.unzipWith=ii,Vt.update=function(A,e,t){return null==A?A:gn(A,e,Un(t))},Vt.updateWith=function(A,e,t,r){return r="function"==typeof r?r:n,null==A?A:gn(A,e,Un(t),r)},Vt.values=Rs,Vt.valuesIn=function(A){return null==A?[]:At(A,xs(A))},Vt.without=si,Vt.words=qs,Vt.wrap=function(A,e){return Oi(Un(e),A)},Vt.xor=Bi,Vt.xorBy=ai,Vt.xorWith=ci,Vt.zip=ui,Vt.zipObject=function(A,e){return hn(A||[],e||[],er)},Vt.zipObjectDeep=function(A,e){return hn(A||[],e||[],$r)},Vt.zipWith=li,Vt.entries=Gs,Vt.entriesIn=Vs,Vt.extend=ds,Vt.extendWith=ps,BB(Vt,Vt),Vt.add=CB,Vt.attempt=$s,Vt.camelCase=ks,Vt.capitalize=Ps,Vt.ceil=UB,Vt.clamp=function(A,e,t){return t===n&&(t=e,e=n),t!==n&&(t=(t=hs(t))==t?t:0),e!==n&&(e=(e=hs(e))==e?e:0),sr(hs(A),e,t)},Vt.clone=function(A){return Br(A,4)},Vt.cloneDeep=function(A){return Br(A,5)},Vt.cloneDeepWith=function(A,e){return Br(A,5,e="function"==typeof e?e:n)},Vt.cloneWith=function(A,e){return Br(A,4,e="function"==typeof e?e:n)},Vt.conformsTo=function(A,e){return null==e||ar(A,e,Ds(e))},Vt.deburr=Ns,Vt.defaultTo=function(A,e){return null==A||A!=A?e:A},Vt.divide=FB,Vt.endsWith=function(A,e,t){A=Us(A),e=cn(e);var r=A.length,o=t=t===n?r:sr(Qs(t),0,r);return(t-=e.length)>=0&&A.slice(t,o)==e},Vt.eq=Ri,Vt.escape=function(A){return(A=Us(A))&&z.test(A)?A.replace(Z,ot):A},Vt.escapeRegExp=function(A){return(A=Us(A))&&oA.test(A)?A.replace(nA,"\\$&"):A},Vt.every=function(A,e,t){var r=Xi(A)?Le:wr;return t&&Fo(A,e,t)&&(e=n),r(A,ao(e,3))},Vt.find=hi,Vt.findIndex=No,Vt.findKey=function(A,e){return Re(A,ao(e,3),Fr)},Vt.findLast=Ci,Vt.findLastIndex=Xo,Vt.findLastKey=function(A,e){return Re(A,ao(e,3),dr)},Vt.floor=dB,Vt.forEach=Ui,Vt.forEachRight=Fi,Vt.forIn=function(A,e){return null==A?A:Cr(A,ao(e,3),xs)},Vt.forInRight=function(A,e){return null==A?A:Ur(A,ao(e,3),xs)},Vt.forOwn=function(A,e){return A&&Fr(A,ao(e,3))},Vt.forOwnRight=function(A,e){return A&&dr(A,ao(e,3))},Vt.get=ms,Vt.gt=ki,Vt.gte=Pi,Vt.has=function(A,e){return null!=A&&fo(A,e,mr)},Vt.hasIn=vs,Vt.head=Wo,Vt.identity=nB,Vt.includes=function(A,e,t,r){A=Wi(A)?A:Rs(A),t=t&&!r?Qs(t):0;var n=A.length;return t<0&&(t=Ct(n+t,0)),Bs(A)?t<=n&&A.indexOf(e,t)>-1:!!n&&Pe(A,e,t)>-1},Vt.indexOf=function(A,e,t){var r=null==A?0:A.length;if(!r)return-1;var n=null==t?0:Qs(t);return n<0&&(n=Ct(r+n,0)),Pe(A,e,n)},Vt.inRange=function(A,e,t){return e=ws(e),t===n?(t=e,e=0):t=ws(t),function(A,e,t){return A>=Ut(e,t)&&A=-9007199254740991&&A<=w},Vt.isSet=ss,Vt.isString=Bs,Vt.isSymbol=as,Vt.isTypedArray=cs,Vt.isUndefined=function(A){return A===n},Vt.isWeakMap=function(A){return ts(A)&&Qo(A)==x},Vt.isWeakSet=function(A){return ts(A)&&"[object WeakSet]"==Ir(A)},Vt.join=function(A,e){return null==A?"":Ve.call(A,e)},Vt.kebabCase=Xs,Vt.last=zo,Vt.lastIndexOf=function(A,e,t){var r=null==A?0:A.length;if(!r)return-1;var o=r;return t!==n&&(o=(o=Qs(t))<0?Ct(r+o,0):Ut(o,r-1)),e==e?function(A,e,t){for(var r=t+1;r--;)if(A[r]===e)return r;return r}(A,e,o):ke(A,Xe,o,!0)},Vt.lowerCase=Js,Vt.lowerFirst=Ws,Vt.lt=us,Vt.lte=ls,Vt.max=function(A){return A&&A.length?Qr(A,nB,Er):n},Vt.maxBy=function(A,e){return A&&A.length?Qr(A,ao(e,2),Er):n},Vt.mean=function(A){return Je(A,nB)},Vt.meanBy=function(A,e){return Je(A,ao(e,2))},Vt.min=function(A){return A&&A.length?Qr(A,nB,Or):n},Vt.minBy=function(A,e){return A&&A.length?Qr(A,ao(e,2),Or):n},Vt.stubArray=fB,Vt.stubFalse=hB,Vt.stubObject=function(){return{}},Vt.stubString=function(){return""},Vt.stubTrue=function(){return!0},Vt.multiply=HB,Vt.nth=function(A,e){return A&&A.length?Pr(A,Qs(e)):n},Vt.noConflict=function(){return Qe._===this&&(Qe._=RA),this},Vt.noop=aB,Vt.now=mi,Vt.pad=function(A,e,t){A=Us(A);var r=(e=Qs(e))?gt(A):0;if(!e||r>=e)return A;var n=(e-r)/2;return Xn(fe(n),t)+A+Xn(we(n),t)},Vt.padEnd=function(A,e,t){A=Us(A);var r=(e=Qs(e))?gt(A):0;return e&&re){var r=A;A=e,e=r}if(t||A%1||e%1){var o=pt();return Ut(A+o*(e-A+ue("1e-"+((o+"").length-1))),e)}return Yr(A,e)},Vt.reduce=function(A,e,t){var r=Xi(A)?Te:Ze,n=arguments.length<3;return r(A,ao(e,4),t,n,lr)},Vt.reduceRight=function(A,e,t){var r=Xi(A)?Oe:Ze,n=arguments.length<3;return r(A,ao(e,4),t,n,gr)},Vt.repeat=function(A,e,t){return e=(t?Fo(A,e,t):e===n)?1:Qs(e),Zr(Us(A),e)},Vt.replace=function(){var A=arguments,e=Us(A[0]);return A.length<3?e:e.replace(A[1],A[2])},Vt.result=function(A,e,t){var r=-1,o=(e=Fn(e,A)).length;for(o||(o=1,A=n);++rw)return[];var t=f,r=Ut(A,f);e=ao(e),A-=f;for(var n=ze(r,e);++t=i)return A;var B=t-gt(r);if(B<1)return r;var a=s?pn(s,0,B).join(""):A.slice(0,B);if(o===n)return a+r;if(s&&(B+=a.length-B),is(o)){if(A.slice(B).search(o)){var c,u=a;for(o.global||(o=vA(o.source,Us(QA.exec(o))+"g")),o.lastIndex=0;c=o.exec(u);)var l=c.index;a=a.slice(0,l===n?B:l)}}else if(A.indexOf(cn(o),B)!=B){var g=a.lastIndexOf(o);g>-1&&(a=a.slice(0,g))}return a+r},Vt.unescape=function(A){return(A=Us(A))&&j.test(A)?A.replace(Y,ft):A},Vt.uniqueId=function(A){var e=++TA;return Us(A)+e},Vt.upperCase=js,Vt.upperFirst=zs,Vt.each=Ui,Vt.eachRight=Fi,Vt.first=Wo,BB(Vt,(pB={},Fr(Vt,(function(A,e){MA.call(Vt.prototype,e)||(pB[e]=A)})),pB),{chain:!1}),Vt.VERSION="4.17.21",Ke(["bind","bindKey","curry","curryRight","partial","partialRight"],(function(A){Vt[A].placeholder=Vt})),Ke(["drop","take"],(function(A,e){Nt.prototype[A]=function(t){t=t===n?1:Ct(Qs(t),0);var r=this.__filtered__&&!e?new Nt(this):this.clone();return r.__filtered__?r.__takeCount__=Ut(t,r.__takeCount__):r.__views__.push({size:Ut(t,f),type:A+(r.__dir__<0?"Right":"")}),r},Nt.prototype[A+"Right"]=function(e){return this.reverse()[A](e).reverse()}})),Ke(["filter","map","takeWhile"],(function(A,e){var t=e+1,r=1==t||3==t;Nt.prototype[A]=function(A){var e=this.clone();return e.__iteratees__.push({iteratee:ao(A,3),type:t}),e.__filtered__=e.__filtered__||r,e}})),Ke(["head","last"],(function(A,e){var t="take"+(e?"Right":"");Nt.prototype[A]=function(){return this[t](1).value()[0]}})),Ke(["initial","tail"],(function(A,e){var t="drop"+(e?"":"Right");Nt.prototype[A]=function(){return this.__filtered__?new Nt(this):this[t](1)}})),Nt.prototype.compact=function(){return this.filter(nB)},Nt.prototype.find=function(A){return this.filter(A).head()},Nt.prototype.findLast=function(A){return this.reverse().find(A)},Nt.prototype.invokeMap=jr((function(A,e){return"function"==typeof A?new Nt(this):this.map((function(t){return br(t,A,e)}))})),Nt.prototype.reject=function(A){return this.filter(Mi(ao(A)))},Nt.prototype.slice=function(A,e){A=Qs(A);var t=this;return t.__filtered__&&(A>0||e<0)?new Nt(t):(A<0?t=t.takeRight(-A):A&&(t=t.drop(A)),e!==n&&(t=(e=Qs(e))<0?t.dropRight(-e):t.take(e-A)),t)},Nt.prototype.takeRightWhile=function(A){return this.reverse().takeWhile(A).reverse()},Nt.prototype.toArray=function(){return this.take(f)},Fr(Nt.prototype,(function(A,e){var t=/^(?:filter|find|map|reject)|While$/.test(e),r=/^(?:head|last)$/.test(e),o=Vt[r?"take"+("last"==e?"Right":""):e],i=r||/^find/.test(e);o&&(Vt.prototype[e]=function(){var e=this.__wrapped__,s=r?[1]:arguments,B=e instanceof Nt,a=s[0],c=B||Xi(e),u=function(A){var e=o.apply(Vt,Me([A],s));return r&&l?e[0]:e};c&&t&&"function"==typeof a&&1!=a.length&&(B=c=!1);var l=this.__chain__,g=!!this.__actions__.length,w=i&&!l,Q=B&&!g;if(!i&&c){e=Q?e:new Nt(this);var f=A.apply(e,s);return f.__actions__.push({func:wi,args:[u],thisArg:n}),new Pt(f,l)}return w&&Q?A.apply(this,s):(f=this.thru(u),w?r?f.value()[0]:f.value():f)})})),Ke(["pop","push","shift","sort","splice","unshift"],(function(A){var e=LA[A],t=/^(?:push|sort|unshift)$/.test(A)?"tap":"thru",r=/^(?:pop|shift)$/.test(A);Vt.prototype[A]=function(){var A=arguments;if(r&&!this.__chain__){var n=this.value();return e.apply(Xi(n)?n:[],A)}return this[t]((function(t){return e.apply(Xi(t)?t:[],A)}))}})),Fr(Nt.prototype,(function(A,e){var t=Vt[e];if(t){var r=t.name+"";MA.call(Lt,r)||(Lt[r]=[]),Lt[r].push({name:e,func:t})}})),Lt[Rn(n,2).name]=[{name:"wrapper",func:n}],Nt.prototype.clone=function(){var A=new Nt(this.__wrapped__);return A.__actions__=bn(this.__actions__),A.__dir__=this.__dir__,A.__filtered__=this.__filtered__,A.__iteratees__=bn(this.__iteratees__),A.__takeCount__=this.__takeCount__,A.__views__=bn(this.__views__),A},Nt.prototype.reverse=function(){if(this.__filtered__){var A=new Nt(this);A.__dir__=-1,A.__filtered__=!0}else(A=this.clone()).__dir__*=-1;return A},Nt.prototype.value=function(){var A=this.__wrapped__.value(),e=this.__dir__,t=Xi(A),r=e<0,n=t?A.length:0,o=function(A,e,t){var r=-1,n=t.length;for(;++r=this.__values__.length;return{done:A,value:A?n:this.__values__[this.__index__++]}},Vt.prototype.plant=function(A){for(var e,t=this;t instanceof kt;){var r=Vo(t);r.__index__=0,r.__values__=n,e?o.__wrapped__=r:e=r;var o=r;t=t.__wrapped__}return o.__wrapped__=A,e},Vt.prototype.reverse=function(){var A=this.__wrapped__;if(A instanceof Nt){var e=A;return this.__actions__.length&&(e=new Nt(this)),(e=e.reverse()).__actions__.push({func:wi,args:[ei],thisArg:n}),new Pt(e,this.__chain__)}return this.thru(ei)},Vt.prototype.toJSON=Vt.prototype.valueOf=Vt.prototype.value=function(){return Qn(this.__wrapped__,this.__actions__)},Vt.prototype.first=Vt.prototype.head,qA&&(Vt.prototype[qA]=function(){return this}),Vt}();Qe._=ht,(r=function(){return ht}.call(e,t,e,A))===n||(A.exports=r)}.call(this)}}]); +//# sourceMappingURL=774.bundle.0171646462dc3c8311f6.js.map \ No newline at end of file diff --git a/resources/774.bundle.0171646462dc3c8311f6.js.LICENSE.txt b/resources/774.bundle.0171646462dc3c8311f6.js.LICENSE.txt new file mode 100644 index 0000000..2f1c950 --- /dev/null +++ b/resources/774.bundle.0171646462dc3c8311f6.js.LICENSE.txt @@ -0,0 +1,29 @@ +/*! + * html2canvas 1.4.1 + * Copyright (c) 2022 Niklas von Hertzen + * Released under MIT License + */ + +/*! ***************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */ + +/** + * @license + * Lodash + * Copyright OpenJS Foundation and other contributors + * Released under MIT license + * Based on Underscore.js 1.8.3 + * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + */ diff --git a/resources/774.bundle.0171646462dc3c8311f6.js.map b/resources/774.bundle.0171646462dc3c8311f6.js.map new file mode 100644 index 0000000..c84b8a5 --- /dev/null +++ b/resources/774.bundle.0171646462dc3c8311f6.js.map @@ -0,0 +1 @@ +{"version":3,"file":"774.bundle.0171646462dc3c8311f6.js","mappings":"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","sources":["webpack:///../../../node_modules/@cornerstonejs/streaming-image-volume-loader/src/helpers/sortImageIdsAndGetSpacing.ts","webpack:///../../../node_modules/@cornerstonejs/streaming-image-volume-loader/src/helpers/getVolumeInfo.ts","webpack:///../../../node_modules/@cornerstonejs/streaming-image-volume-loader/src/helpers/autoLoad.ts","webpack:///../../../node_modules/@cornerstonejs/streaming-image-volume-loader/src/helpers/scaleArray.ts","webpack:///../../../node_modules/@cornerstonejs/streaming-image-volume-loader/src/BaseStreamingImageVolume.ts","webpack:///../../../node_modules/@cornerstonejs/streaming-image-volume-loader/src/StreamingImageVolume.ts","webpack:///../../../node_modules/@cornerstonejs/streaming-image-volume-loader/src/cornerstoneStreamingImageVolumeLoader.ts","webpack:///../../../node_modules/@cornerstonejs/streaming-image-volume-loader/src/helpers/makeVolumeMetadata.ts","webpack:///../../../node_modules/html2canvas/node_modules/tslib/tslib.es6.js","webpack:///../../../node_modules/html2canvas/node_modules/src/Util.ts","webpack:///../../../node_modules/src/css/layout/bounds.ts","webpack:///../../../node_modules/html2canvas/node_modules/css-line-break/node_modules/src/Util.ts","webpack:///../../../node_modules/html2canvas/node_modules/css-line-break/node_modules/utrie/node_modules/src/index.ts","webpack:///../../../node_modules/html2canvas/node_modules/css-line-break/node_modules/src/Trie.ts","webpack:///../../../node_modules/html2canvas/node_modules/src/linebreak-trie.ts","webpack:///../../../node_modules/html2canvas/node_modules/src/LineBreak.ts","webpack:///../../../node_modules/src/css/syntax/tokenizer.ts","webpack:///../../../node_modules/src/css/syntax/parser.ts","webpack:///../../../node_modules/src/css/types/length.ts","webpack:///../../../node_modules/src/css/types/length-percentage.ts","webpack:///../../../node_modules/src/css/types/angle.ts","webpack:///../../../node_modules/src/css/types/color.ts","webpack:///../../../node_modules/src/css/property-descriptors/background-clip.ts","webpack:///../../../node_modules/src/css/property-descriptors/background-color.ts","webpack:///../../../node_modules/src/css/types/functions/gradient.ts","webpack:///../../../node_modules/src/css/types/functions/-prefix-linear-gradient.ts","webpack:///../../../node_modules/src/css/types/functions/radial-gradient.ts","webpack:///../../../node_modules/src/css/types/functions/-prefix-radial-gradient.ts","webpack:///../../../node_modules/src/css/types/image.ts","webpack:///../../../node_modules/src/css/property-descriptors/background-size.ts","webpack:///../../../node_modules/src/css/types/functions/linear-gradient.ts","webpack:///../../../node_modules/src/css/types/functions/-webkit-gradient.ts","webpack:///../../../node_modules/src/css/property-descriptors/background-image.ts","webpack:///../../../node_modules/src/css/property-descriptors/background-origin.ts","webpack:///../../../node_modules/src/css/property-descriptors/background-position.ts","webpack:///../../../node_modules/src/css/property-descriptors/background-repeat.ts","webpack:///../../../node_modules/src/css/property-descriptors/line-break.ts","webpack:///../../../node_modules/src/css/property-descriptors/border-color.ts","webpack:///../../../node_modules/src/css/property-descriptors/border-radius.ts","webpack:///../../../node_modules/src/css/property-descriptors/border-style.ts","webpack:///../../../node_modules/src/css/property-descriptors/border-width.ts","webpack:///../../../node_modules/src/css/property-descriptors/color.ts","webpack:///../../../node_modules/src/css/property-descriptors/direction.ts","webpack:///../../../node_modules/src/css/property-descriptors/display.ts","webpack:///../../../node_modules/src/css/property-descriptors/float.ts","webpack:///../../../node_modules/src/css/property-descriptors/letter-spacing.ts","webpack:///../../../node_modules/src/css/property-descriptors/word-break.ts","webpack:///../../../node_modules/src/css/property-descriptors/line-height.ts","webpack:///../../../node_modules/src/css/property-descriptors/list-style-image.ts","webpack:///../../../node_modules/src/css/property-descriptors/list-style-position.ts","webpack:///../../../node_modules/src/css/property-descriptors/list-style-type.ts","webpack:///../../../node_modules/src/css/property-descriptors/margin.ts","webpack:///../../../node_modules/src/css/property-descriptors/overflow.ts","webpack:///../../../node_modules/src/css/property-descriptors/overflow-wrap.ts","webpack:///../../../node_modules/src/css/property-descriptors/padding.ts","webpack:///../../../node_modules/src/css/property-descriptors/text-align.ts","webpack:///../../../node_modules/src/css/property-descriptors/position.ts","webpack:///../../../node_modules/src/css/property-descriptors/text-shadow.ts","webpack:///../../../node_modules/src/css/property-descriptors/text-transform.ts","webpack:///../../../node_modules/src/css/property-descriptors/transform.ts","webpack:///../../../node_modules/src/css/property-descriptors/transform-origin.ts","webpack:///../../../node_modules/src/css/property-descriptors/visibility.ts","webpack:///../../../node_modules/html2canvas/node_modules/text-segmentation/node_modules/src/Util.ts","webpack:///../../../node_modules/src/css/property-descriptors/z-index.ts","webpack:///../../../node_modules/src/css/types/time.ts","webpack:///../../../node_modules/src/css/property-descriptors/opacity.ts","webpack:///../../../node_modules/src/css/property-descriptors/text-decoration-color.ts","webpack:///../../../node_modules/src/css/property-descriptors/text-decoration-line.ts","webpack:///../../../node_modules/src/css/property-descriptors/font-family.ts","webpack:///../../../node_modules/src/css/property-descriptors/font-size.ts","webpack:///../../../node_modules/src/css/property-descriptors/font-weight.ts","webpack:///../../../node_modules/src/css/property-descriptors/font-variant.ts","webpack:///../../../node_modules/src/css/property-descriptors/font-style.ts","webpack:///../../../node_modules/src/core/bitwise.ts","webpack:///../../../node_modules/src/css/property-descriptors/content.ts","webpack:///../../../node_modules/src/css/property-descriptors/counter-increment.ts","webpack:///../../../node_modules/src/css/property-descriptors/counter-reset.ts","webpack:///../../../node_modules/src/css/property-descriptors/duration.ts","webpack:///../../../node_modules/src/css/property-descriptors/quotes.ts","webpack:///../../../node_modules/src/css/property-descriptors/box-shadow.ts","webpack:///../../../node_modules/src/css/property-descriptors/paint-order.ts","webpack:///../../../node_modules/src/css/property-descriptors/webkit-text-stroke-color.ts","webpack:///../../../node_modules/src/css/property-descriptors/webkit-text-stroke-width.ts","webpack:///../../../node_modules/src/css/index.ts","webpack:///../../../node_modules/src/core/debugger.ts","webpack:///../../../node_modules/src/dom/element-container.ts","webpack:///../../../node_modules/html2canvas/node_modules/text-segmentation/node_modules/utrie/node_modules/src/index.ts","webpack:///../../../node_modules/html2canvas/node_modules/text-segmentation/node_modules/src/Trie.ts","webpack:///../../../node_modules/html2canvas/node_modules/src/GraphemeBreak.ts","webpack:///../../../node_modules/src/dom/document-cloner.ts","webpack:///../../../node_modules/html2canvas/node_modules/src/grapheme-break-trie.ts","webpack:///../../../node_modules/src/core/features.ts","webpack:///../../../node_modules/src/css/layout/text.ts","webpack:///../../../node_modules/src/dom/text-container.ts","webpack:///../../../node_modules/src/dom/replaced-elements/image-element-container.ts","webpack:///../../../node_modules/src/dom/replaced-elements/canvas-element-container.ts","webpack:///../../../node_modules/src/dom/replaced-elements/svg-element-container.ts","webpack:///../../../node_modules/src/dom/elements/li-element-container.ts","webpack:///../../../node_modules/src/dom/elements/ol-element-container.ts","webpack:///../../../node_modules/src/dom/replaced-elements/input-element-container.ts","webpack:///../../../node_modules/src/dom/elements/select-element-container.ts","webpack:///../../../node_modules/src/dom/elements/textarea-element-container.ts","webpack:///../../../node_modules/src/dom/replaced-elements/iframe-element-container.ts","webpack:///../../../node_modules/src/dom/node-parser.ts","webpack:///../../../node_modules/src/css/types/functions/counter.ts","webpack:///../../../node_modules/src/render/bound-curves.ts","webpack:///../../../node_modules/src/core/cache-storage.ts","webpack:///../../../node_modules/src/render/vector.ts","webpack:///../../../node_modules/src/render/bezier-curve.ts","webpack:///../../../node_modules/src/render/effects.ts","webpack:///../../../node_modules/src/render/path.ts","webpack:///../../../node_modules/src/render/stacking-context.ts","webpack:///../../../node_modules/src/render/border.ts","webpack:///../../../node_modules/src/render/box-sizing.ts","webpack:///../../../node_modules/src/render/background.ts","webpack:///../../../node_modules/src/render/font-metrics.ts","webpack:///../../../node_modules/src/core/util.ts","webpack:///../../../node_modules/src/render/renderer.ts","webpack:///../../../node_modules/src/render/canvas/canvas-renderer.ts","webpack:///../../../node_modules/src/render/canvas/foreignobject-renderer.ts","webpack:///../../../node_modules/src/core/logger.ts","webpack:///../../../node_modules/src/core/context.ts","webpack:///../../../node_modules/src/index.ts","webpack:///../../../node_modules/lodash/lodash.js"],"sourcesContent":["import { vec3 } from 'gl-matrix';\nimport { metaData, getConfiguration } from '@cornerstonejs/core';\nimport type { Types } from '@cornerstonejs/core';\n\ntype SortedImageIdsItem = {\n zSpacing: number;\n origin: Types.Point3;\n sortedImageIds: Array;\n};\n/**\n * Given an array of imageIds, sort them based on their imagePositionPatient, and\n * also returns the spacing between images and the origin of the reference image\n *\n * @param imageIds - array of imageIds\n * @param scanAxisNormal - [x, y, z] array or gl-matrix vec3\n *\n * @returns The sortedImageIds, zSpacing, and origin of the first image in the series.\n */\nexport default function sortImageIdsAndGetSpacing(\n imageIds: Array,\n scanAxisNormal: vec3 // Get gl matrix types?\n): SortedImageIdsItem {\n const { imagePositionPatient: referenceImagePositionPatient } = metaData.get(\n 'imagePlaneModule',\n imageIds[0]\n );\n\n const refIppVec = vec3.create();\n\n // Check if we are using wadouri scheme\n const usingWadoUri = imageIds[0].split(':')[0] === 'wadouri';\n\n vec3.set(\n refIppVec,\n referenceImagePositionPatient[0],\n referenceImagePositionPatient[1],\n referenceImagePositionPatient[2]\n );\n\n let sortedImageIds: string[];\n let zSpacing: number;\n\n function getDistance(imageId: string) {\n const { imagePositionPatient } = metaData.get('imagePlaneModule', imageId);\n\n const positionVector = vec3.create();\n\n vec3.sub(\n positionVector,\n referenceImagePositionPatient,\n imagePositionPatient\n );\n\n return vec3.dot(positionVector, scanAxisNormal);\n }\n\n /**\n * If we are using wadors and so have all image metadata cached ahead of time,\n * then sort by image position in 3D space, and calculate average slice\n * spacing from the entire volume. If not, then use the sampled images (1st\n * and middle) to calculate slice spacing, and use the provided imageId order.\n * Correct sorting must be done ahead of time.\n */\n if (!usingWadoUri) {\n const distanceImagePairs = imageIds.map((imageId) => {\n const distance = getDistance(imageId);\n\n return {\n distance,\n imageId,\n };\n });\n\n distanceImagePairs.sort((a, b) => b.distance - a.distance);\n\n sortedImageIds = distanceImagePairs.map((a) => a.imageId);\n const numImages = distanceImagePairs.length;\n\n // Calculated average spacing.\n // We would need to resample if these are not similar.\n // It should be up to the host app to do this if it needed to.\n zSpacing =\n Math.abs(\n distanceImagePairs[numImages - 1].distance -\n distanceImagePairs[0].distance\n ) /\n (numImages - 1);\n } else {\n // Using wadouri, so we have only prefetched the first, middle, and last\n // images for metadata. Assume initial imageId array order is pre-sorted,\n // but check orientation.\n const prefetchedImageIds = [\n imageIds[0],\n imageIds[Math.floor(imageIds.length / 2)],\n ];\n sortedImageIds = imageIds;\n const firstImageDistance = getDistance(prefetchedImageIds[0]);\n const middleImageDistance = getDistance(prefetchedImageIds[1]);\n if (firstImageDistance - middleImageDistance < 0) {\n sortedImageIds.reverse();\n }\n\n // Calculate average spacing between the first and middle prefetched images,\n // otherwise fall back to DICOM `spacingBetweenSlices`\n const metadataForMiddleImage = metaData.get(\n 'imagePlaneModule',\n prefetchedImageIds[1]\n );\n if (!metadataForMiddleImage) {\n throw new Error('Incomplete metadata required for volume construction.');\n }\n\n const positionVector = vec3.create();\n\n vec3.sub(\n positionVector,\n referenceImagePositionPatient,\n metadataForMiddleImage.imagePositionPatient\n );\n const distanceBetweenFirstAndMiddleImages = vec3.dot(\n positionVector,\n scanAxisNormal\n );\n zSpacing =\n Math.abs(distanceBetweenFirstAndMiddleImages) /\n Math.floor(imageIds.length / 2);\n }\n\n const { imagePositionPatient: origin, sliceThickness } = metaData.get(\n 'imagePlaneModule',\n sortedImageIds[0]\n );\n\n const { strictZSpacingForVolumeViewport } = getConfiguration().rendering;\n\n // We implemented these lines for multiframe dicom files that does not have\n // position for each frame, leading to incorrect calculation of zSpacing = 0\n // If possible, we use the sliceThickness, but we warn about this dicom file\n // weirdness. If sliceThickness is not available, we set to 1 just to render\n if (zSpacing === 0 && !strictZSpacingForVolumeViewport) {\n if (sliceThickness) {\n console.log('Could not calculate zSpacing. Using sliceThickness');\n zSpacing = sliceThickness;\n } else {\n console.log(\n 'Could not calculate zSpacing. The VolumeViewport visualization is compromised. Setting zSpacing to 1 to render'\n );\n zSpacing = 1;\n }\n }\n const result: SortedImageIdsItem = {\n zSpacing,\n origin,\n sortedImageIds,\n };\n\n return result;\n}\n","import { cache, utilities, Enums } from '@cornerstonejs/core';\nimport type { Types } from '@cornerstonejs/core';\nimport { vec3 } from 'gl-matrix';\nimport makeVolumeMetadata from './makeVolumeMetadata';\nimport sortImageIdsAndGetSpacing from './sortImageIdsAndGetSpacing';\n\nconst { createUint8SharedArray, createFloat32SharedArray } = utilities;\n\nfunction getVolumeInfo(imageIds: string[]) {\n const volumeMetadata = makeVolumeMetadata(imageIds);\n\n const {\n BitsAllocated,\n PixelRepresentation,\n PhotometricInterpretation,\n ImageOrientationPatient,\n PixelSpacing,\n Columns,\n Rows,\n } = volumeMetadata;\n\n const rowCosineVec = vec3.fromValues(\n ImageOrientationPatient[0],\n ImageOrientationPatient[1],\n ImageOrientationPatient[2]\n );\n\n const colCosineVec = vec3.fromValues(\n ImageOrientationPatient[3],\n ImageOrientationPatient[4],\n ImageOrientationPatient[5]\n );\n\n const scanAxisNormal = vec3.create();\n\n vec3.cross(scanAxisNormal, rowCosineVec, colCosineVec);\n\n const { zSpacing, origin, sortedImageIds } = sortImageIdsAndGetSpacing(\n imageIds,\n scanAxisNormal\n );\n\n const numFrames = imageIds.length;\n\n // Spacing goes [1] then [0], as [1] is column spacing (x) and [0] is row spacing (y)\n const spacing = [PixelSpacing[1], PixelSpacing[0], zSpacing];\n const dimensions = [Columns, Rows, numFrames];\n const direction = [\n ...rowCosineVec,\n ...colCosineVec,\n ...scanAxisNormal,\n ] as Types.Mat3;\n const signed = PixelRepresentation === 1;\n\n // Check if it fits in the cache before we allocate data\n // TODO Improve this when we have support for more types\n // NOTE: We use 4 bytes per voxel as we are using Float32.\n const bytesPerVoxel = BitsAllocated === 16 ? 4 : 1;\n const sizeInBytesPerComponent =\n bytesPerVoxel * dimensions[0] * dimensions[1] * dimensions[2];\n\n let numComponents = 1;\n if (PhotometricInterpretation === 'RGB') {\n numComponents = 3;\n }\n\n const sizeInBytes = sizeInBytesPerComponent * numComponents;\n\n // check if there is enough space in unallocated + image Cache\n const isCacheable = cache.isCacheable(sizeInBytes);\n if (!isCacheable) {\n throw new Error(Enums.Events.CACHE_SIZE_EXCEEDED);\n }\n\n cache.decacheIfNecessaryUntilBytesAvailable(sizeInBytes);\n\n let scalarData;\n\n switch (BitsAllocated) {\n case 8:\n if (signed) {\n throw new Error(\n '8 Bit signed images are not yet supported by this plugin.'\n );\n } else {\n scalarData = createUint8SharedArray(\n dimensions[0] * dimensions[1] * dimensions[2]\n );\n }\n\n break;\n\n case 16:\n scalarData = createFloat32SharedArray(\n dimensions[0] * dimensions[1] * dimensions[2]\n );\n\n break;\n\n case 24:\n // hacky because we don't support alpha channel in dicom\n scalarData = createUint8SharedArray(\n dimensions[0] * dimensions[1] * dimensions[2] * numComponents\n );\n\n break;\n }\n\n return {\n metadata: volumeMetadata,\n sortedImageIds,\n dimensions,\n spacing,\n origin,\n direction,\n scalarData,\n sizeInBytes,\n };\n}\n\nexport { getVolumeInfo, getVolumeInfo as default };\n","import { getRenderingEngines, utilities } from '@cornerstonejs/core';\nimport type { Types } from '@cornerstonejs/core';\n\n//import type { Types } from '@cornerstonejs/core'\n\ntype RenderingEngineAndViewportIds = {\n renderingEngine: Types.IRenderingEngine | undefined; //Types.IRenderingEngine | undefined\n viewportIds: Array;\n};\n\n/**\n * Given a volumeId, it finds the viewports and renderingEngines that\n * include that volume, and triggers a render if renderingEngine is available.\n *\n * @param volumeId - The Id of the volume\n */\nconst autoLoad = (volumeId: string): void => {\n const renderingEngineAndViewportIds =\n getRenderingEngineAndViewportsContainingVolume(volumeId);\n\n if (!renderingEngineAndViewportIds || !renderingEngineAndViewportIds.length) {\n return;\n }\n\n renderingEngineAndViewportIds.forEach(({ renderingEngine, viewportIds }) => {\n if (!renderingEngine.hasBeenDestroyed) {\n renderingEngine.renderViewports(viewportIds);\n }\n });\n};\n\nfunction getRenderingEngineAndViewportsContainingVolume(\n volumeId: string\n): Array {\n const renderingEnginesArray = getRenderingEngines();\n\n const renderingEngineAndViewportIds = [];\n\n for (let i = 0; i < renderingEnginesArray.length; i++) {\n const renderingEngine = renderingEnginesArray[i];\n const viewports = utilities.getViewportsWithVolumeId(\n volumeId,\n renderingEngine.id\n );\n\n if (viewports.length) {\n renderingEngineAndViewportIds.push({\n renderingEngine,\n viewportIds: viewports.map((viewport) => viewport.id),\n });\n }\n }\n\n return renderingEngineAndViewportIds;\n}\n\nexport default autoLoad;\n","import type { Types } from '@cornerstonejs/core';\n\n/**\n * Given a pixel array, rescale the pixel values using the rescale slope and\n * intercept and if modality is PT it uses the suv values to scale the array\n * @param array - The array to be scaled.\n * @param scalingParameters - The scaling parameters\n * @returns The array is being scaled\n */\nexport default function scaleArray(\n array: Float32Array | Uint8Array | Uint16Array | Int16Array,\n scalingParameters: Types.ScalingParameters\n): Float32Array | Uint8Array | Uint16Array | Int16Array {\n const arrayLength = array.length;\n const { rescaleSlope, rescaleIntercept, suvbw } = scalingParameters;\n\n if (scalingParameters.modality === 'PT' && typeof suvbw === 'number') {\n for (let i = 0; i < arrayLength; i++) {\n array[i] = suvbw * (array[i] * rescaleSlope + rescaleIntercept);\n }\n } else {\n for (let i = 0; i < arrayLength; i++) {\n array[i] = array[i] * rescaleSlope + rescaleIntercept;\n }\n }\n\n return array;\n}\n","import {\n Enums,\n eventTarget,\n metaData,\n imageLoadPoolManager,\n triggerEvent,\n ImageVolume,\n cache,\n imageLoader,\n utilities as csUtils,\n} from '@cornerstonejs/core';\n\nimport type { Types } from '@cornerstonejs/core';\nimport { scaleArray, autoLoad } from './helpers';\n\nconst requestType = Enums.RequestType.Prefetch;\nconst { getMinMax } = csUtils;\n\n/**\n * Streaming Image Volume Class that extends ImageVolume base class.\n * It implements load method to load the imageIds and insert them into the volume.\n *\n */\nexport default class BaseStreamingImageVolume extends ImageVolume {\n private framesLoaded = 0;\n private framesProcessed = 0;\n protected numFrames: number;\n protected cornerstoneImageMetaData = null;\n\n loadStatus: {\n loaded: boolean;\n loading: boolean;\n cancelled: boolean;\n cachedFrames: Array;\n callbacks: Array<(...args: unknown[]) => void>;\n };\n\n constructor(\n imageVolumeProperties: Types.IVolume,\n streamingProperties: Types.IStreamingVolumeProperties\n ) {\n super(imageVolumeProperties);\n this.imageIds = streamingProperties.imageIds;\n this.loadStatus = streamingProperties.loadStatus;\n this.numFrames = this._getNumFrames();\n\n this._createCornerstoneImageMetaData();\n }\n\n /**\n * Returns the number of frames stored in a scalarData object. The number of\n * frames is equal to the number of images for 3D volumes or the number of\n * frames per time poins for 4D volumes.\n * @returns number of frames per volume\n */\n private _getNumFrames(): number {\n const { imageIds, scalarData } = this;\n const scalarDataCount = this.isDynamicVolume() ? scalarData.length : 1;\n\n return imageIds.length / scalarDataCount;\n }\n\n private _getScalarDataLength(): number {\n const { scalarData } = this;\n return this.isDynamicVolume()\n ? (scalarData)[0].length\n : (scalarData).length;\n }\n\n /**\n * Creates the metadata required for converting the volume to an cornerstoneImage\n */\n private _createCornerstoneImageMetaData() {\n const { numFrames } = this;\n\n if (numFrames === 0) {\n return;\n }\n\n const bytesPerImage = this.sizeInBytes / numFrames;\n const scalarDataLength = this._getScalarDataLength();\n const numComponents = scalarDataLength / this.numVoxels;\n const pixelsPerImage =\n this.dimensions[0] * this.dimensions[1] * numComponents;\n\n const { PhotometricInterpretation, voiLut, VOILUTFunction } = this.metadata;\n\n let windowCenter = [];\n let windowWidth = [];\n\n if (voiLut && voiLut.length) {\n windowCenter = voiLut.map((voi) => {\n return voi.windowCenter;\n });\n\n windowWidth = voiLut.map((voi) => {\n return voi.windowWidth;\n });\n }\n\n const color = numComponents > 1 ? true : false; //todo: fix this\n\n this.cornerstoneImageMetaData = {\n bytesPerImage,\n numComponents,\n pixelsPerImage,\n windowCenter,\n windowWidth,\n color,\n // we use rgb (3 components) for the color volumes (and not rgba), and not rgba (which is used\n // in some parts of the lib for stack viewing in CPU)\n rgba: false,\n spacing: this.spacing,\n dimensions: this.dimensions,\n photometricInterpretation: PhotometricInterpretation,\n voiLUTFunction: VOILUTFunction,\n invert: PhotometricInterpretation === 'MONOCHROME1',\n };\n }\n\n /**\n * Converts imageIdIndex into frameIndex which will be the same\n * for 3D volumes but different for 4D volumes\n */\n private _imageIdIndexToFrameIndex(imageIdIndex: number): number {\n return imageIdIndex % this.numFrames;\n }\n\n /**\n * Return all scalar data objects (buffers) which will be only one for\n * 3D volumes and one per time point for 4D volumes\n * images of each 3D volume is stored\n * @returns scalar data array\n */\n public getScalarDataArrays(): Types.VolumeScalarData[] {\n return this.isDynamicVolume()\n ? this.scalarData\n : [this.scalarData];\n }\n\n private _getScalarDataByImageIdIndex(\n imageIdIndex: number\n ): Types.VolumeScalarData {\n if (imageIdIndex < 0 || imageIdIndex >= this.imageIds.length) {\n throw new Error('imageIdIndex out of range');\n }\n\n const scalarDataArrays = this.getScalarDataArrays();\n const scalarDataIndex = Math.floor(imageIdIndex / this.numFrames);\n\n return scalarDataArrays[scalarDataIndex];\n }\n\n protected invalidateVolume(immediate: boolean): void {\n const { imageData, vtkOpenGLTexture } = this;\n const { numFrames } = this;\n\n for (let i = 0; i < numFrames; i++) {\n vtkOpenGLTexture.setUpdatedFrame(i);\n }\n\n imageData.modified();\n\n if (immediate) {\n autoLoad(this.volumeId);\n }\n }\n\n /**\n * It cancels loading the images of the volume. It sets the loading status to false\n * and filters any imageLoad request in the requestPoolManager that has the same\n * volumeId\n */\n public cancelLoading = (): void => {\n const { loadStatus } = this;\n\n if (!loadStatus || !loadStatus.loading) {\n return;\n }\n\n // Set to not loading.\n loadStatus.loading = false;\n loadStatus.cancelled = true;\n\n // Remove all the callback listeners\n this.clearLoadCallbacks();\n\n // Create a filter function which only keeps requests\n // which do not match this volume's Id\n const filterFunction = ({ additionalDetails }) => {\n return additionalDetails.volumeId !== this.volumeId;\n };\n\n // Instruct the request pool manager to filter queued\n // requests to ensure requests we no longer need are\n // no longer sent.\n imageLoadPoolManager.filterRequests(filterFunction);\n };\n\n /**\n * Clear the load callbacks\n */\n public clearLoadCallbacks(): void {\n this.loadStatus.callbacks = [];\n }\n\n /**\n * It triggers a prefetch for images in the volume.\n * @param callback - A callback function to be called when the volume is fully loaded\n * @param priority - The priority for loading the volume images, lower number is higher priority\n * @returns\n */\n public load = (\n callback: (...args: unknown[]) => void,\n priority = 5\n ): void => {\n const { imageIds, loadStatus, numFrames } = this;\n\n if (loadStatus.loading === true) {\n console.log(\n `loadVolume: Loading is already in progress for ${this.volumeId}`\n );\n return; // Already loading, will get callbacks from main load.\n }\n\n const { loaded } = this.loadStatus;\n const totalNumFrames = imageIds.length;\n\n if (loaded) {\n if (callback) {\n callback({\n success: true,\n framesLoaded: totalNumFrames,\n framesProcessed: totalNumFrames,\n numFrames,\n totalNumFrames,\n });\n }\n return;\n }\n\n if (callback) {\n this.loadStatus.callbacks.push(callback);\n }\n\n this._prefetchImageIds(priority);\n };\n\n protected getImageIdsRequests = (\n imageIds: string[],\n scalarData: Types.VolumeScalarData,\n priority: number\n ) => {\n const { loadStatus } = this;\n const { cachedFrames } = loadStatus;\n\n const { vtkOpenGLTexture, imageData, metadata, volumeId } = this;\n const { FrameOfReferenceUID } = metadata;\n\n // SharedArrayBuffer\n const arrayBuffer = scalarData.buffer;\n const numFrames = imageIds.length;\n\n // Length of one frame in voxels\n const length = scalarData.length / numFrames;\n // Length of one frame in bytes\n const lengthInBytes = arrayBuffer.byteLength / numFrames;\n\n let type;\n\n if (scalarData instanceof Uint8Array) {\n type = 'Uint8Array';\n } else if (scalarData instanceof Float32Array) {\n type = 'Float32Array';\n } else if (scalarData instanceof Uint16Array) {\n type = 'Uint16Array';\n } else if (scalarData instanceof Int16Array) {\n type = 'Int16Array';\n } else {\n throw new Error('Unsupported array type');\n }\n\n const totalNumFrames = this.imageIds.length;\n const autoRenderOnLoad = true;\n const autoRenderPercentage = 2;\n\n let reRenderFraction;\n let reRenderTarget;\n\n if (autoRenderOnLoad) {\n reRenderFraction = totalNumFrames * (autoRenderPercentage / 100);\n reRenderTarget = reRenderFraction;\n }\n\n function callLoadStatusCallback(evt) {\n // TODO: probably don't want this here\n\n if (autoRenderOnLoad) {\n if (\n evt.framesProcessed > reRenderTarget ||\n evt.framesProcessed === evt.totalNumFrames\n ) {\n reRenderTarget += reRenderFraction;\n autoLoad(volumeId);\n }\n }\n\n if (evt.framesProcessed === evt.totalNumFrames) {\n loadStatus.callbacks.forEach((callback) => callback(evt));\n\n const eventDetail = {\n FrameOfReferenceUID,\n volumeId: volumeId,\n };\n\n triggerEvent(\n eventTarget,\n Enums.Events.IMAGE_VOLUME_LOADING_COMPLETED,\n eventDetail\n );\n }\n }\n\n const updateTextureAndTriggerEvents = (\n volume: BaseStreamingImageVolume,\n imageIdIndex,\n imageId\n ) => {\n const frameIndex = this._imageIdIndexToFrameIndex(imageIdIndex);\n\n cachedFrames[imageIdIndex] = true;\n this.framesLoaded++;\n this.framesProcessed++;\n\n vtkOpenGLTexture.setUpdatedFrame(frameIndex);\n imageData.modified();\n\n const eventDetail: Types.EventTypes.ImageVolumeModifiedEventDetail = {\n FrameOfReferenceUID,\n imageVolume: volume,\n };\n\n triggerEvent(\n eventTarget,\n Enums.Events.IMAGE_VOLUME_MODIFIED,\n eventDetail\n );\n\n if (this.framesProcessed === totalNumFrames) {\n loadStatus.loaded = true;\n loadStatus.loading = false;\n\n // TODO: Should we remove the callbacks in favour of just using events?\n callLoadStatusCallback({\n success: true,\n imageIdIndex,\n imageId,\n framesLoaded: this.framesLoaded,\n framesProcessed: this.framesProcessed,\n numFrames,\n totalNumFrames,\n });\n loadStatus.callbacks = [];\n } else {\n callLoadStatusCallback({\n success: true,\n imageIdIndex,\n imageId,\n framesLoaded: this.framesLoaded,\n framesProcessed: this.framesProcessed,\n numFrames,\n totalNumFrames,\n });\n }\n };\n\n const successCallback = (\n imageIdIndex: number,\n imageId: string,\n scalingParameters\n ) => {\n const frameIndex = this._imageIdIndexToFrameIndex(imageIdIndex);\n\n // Check if there is a cached image for the same imageURI (different\n // data loader scheme)\n const cachedImage = cache.getCachedImageBasedOnImageURI(imageId);\n\n // Check if the image was already loaded by another volume and we are here\n // since we got the imageLoadObject from the cache from the other already loaded\n // volume\n const cachedVolume = cache.getVolumeContainingImageId(imageId);\n\n // check if the load was cancelled while we were waiting for the image\n // if so we don't want to do anything\n if (loadStatus.cancelled) {\n console.warn(\n 'volume load cancelled, returning for imageIdIndex: ',\n imageIdIndex\n );\n return;\n }\n\n // if it is not a cached image or volume\n if (\n !cachedImage?.image &&\n !(cachedVolume && cachedVolume.volume !== this)\n ) {\n return updateTextureAndTriggerEvents(this, imageIdIndex, imageId);\n }\n\n // it is either cachedImage or cachedVolume\n const isFromImageCache = !!cachedImage;\n\n const cachedImageOrVolume = cachedImage || cachedVolume.volume;\n\n this.handleImageComingFromCache(\n cachedImageOrVolume,\n isFromImageCache,\n scalingParameters,\n scalarData,\n frameIndex,\n arrayBuffer,\n updateTextureAndTriggerEvents,\n imageIdIndex,\n imageId,\n errorCallback\n );\n };\n\n function errorCallback(error, imageIdIndex, imageId) {\n this.framesProcessed++;\n\n if (this.framesProcessed === totalNumFrames) {\n loadStatus.loaded = true;\n loadStatus.loading = false;\n\n callLoadStatusCallback({\n success: false,\n imageId,\n imageIdIndex,\n error,\n framesLoaded: this.framesLoaded,\n framesProcessed: this.framesProcessed,\n numFrames,\n totalNumFrames,\n });\n\n loadStatus.callbacks = [];\n } else {\n callLoadStatusCallback({\n success: false,\n imageId,\n imageIdIndex,\n error,\n framesLoaded: this.framesLoaded,\n framesProcessed: this.framesProcessed,\n numFrames,\n totalNumFrames,\n });\n }\n\n const eventDetail = {\n error,\n imageIdIndex,\n imageId,\n };\n\n triggerEvent(eventTarget, Enums.Events.IMAGE_LOAD_ERROR, eventDetail);\n }\n\n function handleArrayBufferLoad(scalarData, image, options) {\n if (!(scalarData.buffer instanceof ArrayBuffer)) {\n return;\n }\n\n const offset = options.targetBuffer.offset; // in bytes\n const length = options.targetBuffer.length; // in frames\n const pixelData = image.pixelData\n ? image.pixelData\n : image.getPixelData();\n\n try {\n if (scalarData instanceof Float32Array) {\n const bytesInFloat = 4;\n const floatView = new Float32Array(pixelData);\n if (floatView.length !== length) {\n throw 'Error pixelData length does not match frame length';\n }\n // since set is based on the underlying type,\n // we need to divide the offset bytes by the byte type\n scalarData.set(floatView, offset / bytesInFloat);\n }\n if (scalarData instanceof Int16Array) {\n const bytesInInt16 = 2;\n const intView = new Int16Array(pixelData);\n if (intView.length !== length) {\n throw 'Error pixelData length does not match frame length';\n }\n scalarData.set(intView, offset / bytesInInt16);\n }\n if (scalarData instanceof Uint16Array) {\n const bytesInUint16 = 2;\n const intView = new Uint16Array(pixelData);\n if (intView.length !== length) {\n throw 'Error pixelData length does not match frame length';\n }\n scalarData.set(intView, offset / bytesInUint16);\n }\n if (scalarData instanceof Uint8Array) {\n const bytesInUint8 = 1;\n const intView = new Uint8Array(pixelData);\n if (intView.length !== length) {\n throw 'Error pixelData length does not match frame length';\n }\n scalarData.set(intView, offset / bytesInUint8);\n }\n } catch (e) {\n console.error(e);\n }\n }\n\n // 4D datasets load one time point at a time and the frameIndex is\n // the position of the imageId in the current time point while the\n // imageIdIndex is its absolute position in the array that contains\n // all other imageIds. In a 4D dataset the frameIndex can also be\n // calculated as `imageIdIndex % numFrames` where numFrames is the\n // number of frames per time point. The frameIndex and imageIdIndex\n // will be the same when working with 3D datasets.\n const requests = imageIds.map((imageId, frameIndex) => {\n const imageIdIndex = this.getImageIdIndex(imageId);\n\n if (cachedFrames[imageIdIndex]) {\n this.framesLoaded++;\n this.framesProcessed++;\n return;\n }\n\n const modalityLutModule =\n metaData.get('modalityLutModule', imageId) || {};\n\n const generalSeriesModule =\n metaData.get('generalSeriesModule', imageId) || {};\n\n const scalingParameters: Types.ScalingParameters = {\n rescaleSlope: modalityLutModule.rescaleSlope,\n rescaleIntercept: modalityLutModule.rescaleIntercept,\n modality: generalSeriesModule.modality,\n };\n\n if (scalingParameters.modality === 'PT') {\n const suvFactor = metaData.get('scalingModule', imageId);\n\n if (suvFactor) {\n this._addScalingToVolume(suvFactor);\n scalingParameters.suvbw = suvFactor.suvbw;\n }\n }\n\n const isSlopeAndInterceptNumbers =\n typeof scalingParameters.rescaleSlope === 'number' &&\n typeof scalingParameters.rescaleIntercept === 'number';\n\n /**\n * So this is has limitation right now, but we need to somehow indicate\n * whether the volume has been scaled with the scaling parameters or not.\n * However, each slice can have different scaling parameters but it is rare\n * that rescale slope and intercept be unknown for one slice and known for\n * another. So we can just check the first slice and assume that the rest\n * of the slices have the same scaling parameters. Basically it is important\n * that these two are numbers and that means the volume has been scaled (\n * we do that automatically in the loader). For the suvbw, we need to\n * somehow indicate whether the PT image has been corrected with suvbw or\n * not, which we store it in the this.scaling.PT.suvbw.\n */\n this.isPreScaled = isSlopeAndInterceptNumbers;\n\n const options = {\n // WADO Image Loader\n targetBuffer: {\n // keeping this in the options means a large empty volume array buffer\n // will be transferred to the worker. This is undesirable for streaming\n // volume without shared array buffer because the target is now an empty\n // 300-500MB volume array buffer. Instead the volume should be progressively\n // set in the main thread.\n arrayBuffer:\n arrayBuffer instanceof ArrayBuffer ? undefined : arrayBuffer,\n offset: frameIndex * lengthInBytes,\n length,\n type,\n },\n skipCreateImage: true,\n preScale: {\n enabled: true,\n // we need to pass in the scalingParameters here, since the streaming\n // volume loader doesn't go through the createImage phase in the loader,\n // and therefore doesn't have the scalingParameters\n scalingParameters,\n },\n };\n\n // Use loadImage because we are skipping the Cornerstone Image cache\n // when we load directly into the Volume cache\n const callLoadImage = (imageId, imageIdIndex, options) => {\n return imageLoader.loadImage(imageId, options).then(\n (image) => {\n // scalarData is the volume container we are progressively loading into\n // image is the pixelData decoded from workers in cornerstoneDICOMImageLoader\n handleArrayBufferLoad(scalarData, image, options);\n successCallback(imageIdIndex, imageId, scalingParameters);\n },\n (error) => {\n errorCallback.call(this, error, imageIdIndex, imageId);\n }\n );\n };\n\n return {\n callLoadImage,\n imageId,\n imageIdIndex,\n options,\n priority,\n requestType,\n additionalDetails: {\n volumeId: this.volumeId,\n },\n };\n });\n\n return requests;\n };\n\n private handleImageComingFromCache(\n cachedImageOrVolume,\n isFromImageCache: boolean,\n scalingParameters: any,\n scalarData: Types.VolumeScalarData,\n frameIndex: number,\n arrayBuffer: ArrayBufferLike,\n updateTextureAndTriggerEvents: (\n volume: BaseStreamingImageVolume,\n imageIdIndex: any,\n imageId: any\n ) => void,\n imageIdIndex: number,\n imageId: string,\n errorCallback: (error: any, imageIdIndex: any, imageId: any) => void\n ) {\n const imageLoadObject = isFromImageCache\n ? cachedImageOrVolume.imageLoadObject\n : cachedImageOrVolume.convertToCornerstoneImage(imageId, imageIdIndex);\n\n imageLoadObject.promise\n .then((cachedImage) => {\n const imageScalarData = this._scaleIfNecessary(\n cachedImage,\n scalingParameters\n );\n // todo add scaling and slope\n const { pixelsPerImage, bytesPerImage } = this.cornerstoneImageMetaData;\n const TypedArray = scalarData.constructor;\n let byteOffset = bytesPerImage * frameIndex;\n\n // create a view on the volume arraybuffer\n const bytePerPixel = bytesPerImage / pixelsPerImage;\n\n if (scalarData.BYTES_PER_ELEMENT !== bytePerPixel) {\n byteOffset *= scalarData.BYTES_PER_ELEMENT / bytePerPixel;\n }\n\n // @ts-ignore\n const volumeBufferView = new TypedArray(\n arrayBuffer,\n byteOffset,\n pixelsPerImage\n );\n volumeBufferView.set(imageScalarData);\n updateTextureAndTriggerEvents(this, imageIdIndex, imageId);\n })\n .catch((err) => {\n errorCallback.call(this, err, imageIdIndex, imageId);\n });\n }\n\n /**\n * It returns the imageLoad requests for the streaming image volume instance.\n * It involves getting all the imageIds of the volume and creating a success callback\n * which would update the texture (when the image has loaded) and the failure callback.\n * Note that this method does not executes the requests but only returns the requests.\n * It can be used for sorting requests outside of the volume loader itself\n * e.g. loading a single slice of CT, followed by a single slice of PET (interleaved), before\n * moving to the next slice.\n *\n * @returns Array of requests including imageId of the request, its imageIdIndex,\n * options (targetBuffer and scaling parameters), and additionalDetails (volumeId)\n */\n public getImageLoadRequests(_priority: number): any[] {\n throw new Error('Abstract method');\n }\n\n private _prefetchImageIds(priority: number): void {\n // Note: here is the correct location to set the loading flag\n // since getImageIdsRequest is just grabbing and building requests\n // and not actually executing them\n this.loadStatus.loading = true;\n\n const requests = this.getImageLoadRequests(priority);\n\n requests.reverse().forEach((request) => {\n if (!request) {\n // there is a cached image for the imageId and no requests will fire\n return;\n }\n\n const {\n callLoadImage,\n imageId,\n imageIdIndex,\n options,\n priority,\n requestType,\n additionalDetails,\n } = request;\n\n imageLoadPoolManager.addRequest(\n callLoadImage.bind(this, imageId, imageIdIndex, options),\n requestType,\n additionalDetails,\n priority\n );\n });\n }\n\n /**\n * This function decides whether or not to scale the image based on the\n * scalingParameters. If the image is already scaled, we should take that\n * into account when scaling the image again, so if the rescaleSlope and/or\n * rescaleIntercept are different from the ones that were used to scale the\n * image, we should scale the image again according to the new parameters.\n */\n private _scaleIfNecessary(\n image,\n scalingParametersToUse: Types.ScalingParameters\n ) {\n const imageIsAlreadyScaled = image.preScale?.scaled;\n const noScalingParametersToUse =\n !scalingParametersToUse ||\n !scalingParametersToUse.rescaleIntercept ||\n !scalingParametersToUse.rescaleSlope;\n\n if (!imageIsAlreadyScaled && noScalingParametersToUse) {\n // no need to scale the image\n return image.getPixelData().slice(0);\n }\n\n if (\n !imageIsAlreadyScaled &&\n scalingParametersToUse &&\n scalingParametersToUse.rescaleIntercept !== undefined &&\n scalingParametersToUse.rescaleSlope !== undefined\n ) {\n // if not already scaled, just scale the image.\n // copy so that it doesn't get modified\n const pixelDataCopy = image.getPixelData().slice(0);\n const scaledArray = scaleArray(pixelDataCopy, scalingParametersToUse);\n return scaledArray;\n }\n\n // if the image is already scaled,\n const {\n rescaleSlope: rescaleSlopeToUse,\n rescaleIntercept: rescaleInterceptToUse,\n suvbw: suvbwToUse,\n } = scalingParametersToUse;\n\n const {\n rescaleSlope: rescaleSlopeUsed,\n rescaleIntercept: rescaleInterceptUsed,\n suvbw: suvbwUsed,\n } = image.preScale.scalingParameters;\n\n const rescaleSlopeIsSame = rescaleSlopeToUse === rescaleSlopeUsed;\n const rescaleInterceptIsSame =\n rescaleInterceptToUse === rescaleInterceptUsed;\n const suvbwIsSame = suvbwToUse === suvbwUsed;\n\n if (rescaleSlopeIsSame && rescaleInterceptIsSame && suvbwIsSame) {\n // if the scaling parameters are the same, we don't need to scale the image again\n return image.getPixelData();\n }\n\n const pixelDataCopy = image.getPixelData().slice(0);\n // the general formula for scaling is scaledPixelValue = suvbw * (pixelValue * rescaleSlope) + rescaleIntercept\n const newSuvbw = suvbwToUse / suvbwUsed;\n const newRescaleSlope = rescaleSlopeToUse / rescaleSlopeUsed;\n const newRescaleIntercept =\n rescaleInterceptToUse - rescaleInterceptUsed * newRescaleSlope;\n\n const newScalingParameters = {\n ...scalingParametersToUse,\n rescaleSlope: newRescaleSlope,\n rescaleIntercept: newRescaleIntercept,\n suvbw: newSuvbw,\n };\n\n const scaledArray = scaleArray(pixelDataCopy, newScalingParameters);\n return scaledArray;\n }\n\n private _addScalingToVolume(suvFactor) {\n // Todo: handle case where suvFactors are not the same for all frames\n if (this.scaling) {\n return;\n }\n\n const { suvbw, suvlbm, suvbsa } = suvFactor;\n\n const petScaling = {};\n\n if (suvlbm) {\n petScaling.suvbwToSuvlbm = suvlbm / suvbw;\n }\n\n if (suvbsa) {\n petScaling.suvbwToSuvbsa = suvbsa / suvbw;\n }\n\n if (suvbw) {\n petScaling.suvbw = suvbw;\n }\n\n this.scaling = { PT: petScaling };\n }\n\n private _removeFromCache() {\n // TODO: not 100% sure this is the same Id as the volume loader's volumeId?\n // so I have no idea if this will work\n cache.removeVolumeLoadObject(this.volumeId);\n }\n\n /**\n * Converts the requested imageId inside the volume to a cornerstoneImage\n * object. It uses the typedArray set method to copy the pixelData from the\n * correct offset in the scalarData to a new array for the image\n *\n * @param imageId - the imageId of the image to be converted\n * @param imageIdIndex - the index of the imageId in the imageIds array\n * @returns image object containing the pixel data, metadata, and other information\n */\n public getCornerstoneImage(\n imageId: string,\n imageIdIndex: number\n ): Types.IImage {\n const { imageIds } = this;\n const frameIndex = this._imageIdIndexToFrameIndex(imageIdIndex);\n\n const {\n bytesPerImage,\n pixelsPerImage,\n windowCenter,\n windowWidth,\n numComponents,\n color,\n dimensions,\n spacing,\n invert,\n voiLUTFunction,\n photometricInterpretation,\n } = this.cornerstoneImageMetaData;\n\n // 1. Grab the buffer and it's type\n const scalarData = this._getScalarDataByImageIdIndex(imageIdIndex);\n const volumeBuffer = scalarData.buffer;\n // (not sure if this actually works, TypeScript keeps complaining)\n const TypedArray = scalarData.constructor;\n\n // 2. Given the index of the image and frame length in bytes,\n // create a view on the volume arraybuffer\n const bytePerPixel = bytesPerImage / pixelsPerImage;\n\n let byteOffset = bytesPerImage * frameIndex;\n\n // If there is a discrepancy between the volume typed array\n // and the bitsAllocated for the image. The reason is that VTK uses Float32\n // on the GPU and if the type is not Float32, it will convert it. So for not\n // having a performance issue, we convert all types initially to Float32 even\n // if they are not Float32.\n if (scalarData.BYTES_PER_ELEMENT !== bytePerPixel) {\n byteOffset *= scalarData.BYTES_PER_ELEMENT / bytePerPixel;\n }\n\n // 3. Create a new TypedArray of the same type for the new\n // Image that will be created\n // @ts-ignore\n const imageScalarData = new TypedArray(pixelsPerImage);\n // @ts-ignore\n const volumeBufferView = new TypedArray(\n volumeBuffer,\n byteOffset,\n pixelsPerImage\n );\n\n // 4. Use e.g. TypedArray.set() to copy the data from the larger\n // buffer's view into the smaller one\n imageScalarData.set(volumeBufferView);\n\n // 5. Create an Image Object from imageScalarData and put it into the Image cache\n const volumeImageId = imageIds[imageIdIndex];\n const modalityLutModule =\n metaData.get('modalityLutModule', volumeImageId) || {};\n const minMax = getMinMax(imageScalarData);\n const intercept = modalityLutModule.rescaleIntercept\n ? modalityLutModule.rescaleIntercept\n : 0;\n\n return {\n imageId,\n intercept,\n windowCenter,\n windowWidth,\n voiLUTFunction,\n color,\n rgba: false,\n numComps: numComponents,\n // Note the dimensions were defined as [Columns, Rows, Frames]\n rows: dimensions[1],\n columns: dimensions[0],\n sizeInBytes: imageScalarData.byteLength,\n getPixelData: () => imageScalarData,\n minPixelValue: minMax.min,\n maxPixelValue: minMax.max,\n slope: modalityLutModule.rescaleSlope\n ? modalityLutModule.rescaleSlope\n : 1,\n getCanvas: undefined, // todo: which canvas?\n height: dimensions[0],\n width: dimensions[1],\n columnPixelSpacing: spacing[0],\n rowPixelSpacing: spacing[1],\n invert,\n photometricInterpretation,\n };\n }\n\n /**\n * Converts the requested imageId inside the volume to a cornerstoneImage\n * object. It uses the typedArray set method to copy the pixelData from the\n * correct offset in the scalarData to a new array for the image\n * Duplicate of getCornerstoneImageLoadObject for legacy reasons\n *\n * @param imageId - the imageId of the image to be converted\n * @param imageIdIndex - the index of the imageId in the imageIds array\n * @returns imageLoadObject containing the promise that resolves\n * to the cornerstone image\n */\n public convertToCornerstoneImage(\n imageId: string,\n imageIdIndex: number\n ): Types.IImageLoadObject {\n return this.getCornerstoneImageLoadObject(imageId, imageIdIndex);\n }\n\n /**\n * Converts the requested imageId inside the volume to a cornerstoneImage\n * object. It uses the typedArray set method to copy the pixelData from the\n * correct offset in the scalarData to a new array for the image\n *\n * @param imageId - the imageId of the image to be converted\n * @param imageIdIndex - the index of the imageId in the imageIds array\n * @returns imageLoadObject containing the promise that resolves\n * to the cornerstone image\n */\n public getCornerstoneImageLoadObject(\n imageId: string,\n imageIdIndex: number\n ): Types.IImageLoadObject {\n const image = this.getCornerstoneImage(imageId, imageIdIndex);\n\n const imageLoadObject = {\n promise: Promise.resolve(image),\n };\n\n return imageLoadObject;\n }\n\n /**\n * Returns an array of all the volume's images as Cornerstone images.\n * It iterates over all the imageIds and converts them to Cornerstone images.\n *\n * @returns An array of Cornerstone images.\n */\n public getCornerstoneImages(): Types.IImage[] {\n const { imageIds } = this;\n\n return imageIds.map((imageId, imageIdIndex) => {\n return this.getCornerstoneImage(imageId, imageIdIndex);\n });\n }\n\n /**\n * Converts all the volume images (imageIds) to cornerstoneImages and caches them.\n * It iterates over all the imageIds and convert them until there is no\n * enough space left inside the imageCache. Finally it will decache the Volume.\n *\n */\n private _convertToImages() {\n // 1. Try to decache images in the volatile Image Cache to provide\n // enough space to store another entire copy of the volume (as Images).\n // If we do not have enough, we will store as many images in the cache\n // as possible, and the rest of the volume will be decached.\n const byteLength = this.sizeInBytes;\n const numImages = this.imageIds.length;\n const { bytesPerImage } = this.cornerstoneImageMetaData;\n\n let bytesRemaining = cache.decacheIfNecessaryUntilBytesAvailable(\n byteLength,\n this.imageIds\n );\n\n for (let imageIdIndex = 0; imageIdIndex < numImages; imageIdIndex++) {\n const imageId = this.imageIds[imageIdIndex];\n\n bytesRemaining = bytesRemaining - bytesPerImage;\n\n // 2. Convert each imageId to a cornerstone Image object which is\n // resolved inside the promise of imageLoadObject\n const imageLoadObject = this.convertToCornerstoneImage(\n imageId,\n imageIdIndex\n );\n\n // 3. Caching the image\n if (!cache.getImageLoadObject(imageId)) {\n cache.putImageLoadObject(imageId, imageLoadObject).catch((err) => {\n console.error(err);\n });\n }\n\n // 4. If we know we won't be able to add another Image to the cache\n // without breaching the limit, stop here.\n if (bytesRemaining <= bytesPerImage) {\n break;\n }\n }\n // 5. When as much of the Volume is processed into Images as possible\n // without breaching the cache limit, remove the Volume\n this._removeFromCache();\n }\n\n /**\n * If completelyRemove is true, remove the volume completely from the cache. Otherwise,\n * convert the volume to cornerstone images (stack images) and store it in the cache\n * @param completelyRemove - If true, the image will be removed from the\n * cache completely.\n */\n public decache(completelyRemove = false): void {\n if (completelyRemove) {\n this._removeFromCache();\n } else {\n this._convertToImages();\n }\n }\n}\n","import { Types } from '@cornerstonejs/core';\nimport BaseStreamingImageVolume from './BaseStreamingImageVolume';\n\n/**\n * Streaming Image Volume Class that extends ImageVolume base class.\n * It implements load method to load the imageIds and insert them into the volume.\n */\nexport default class StreamingImageVolume extends BaseStreamingImageVolume {\n constructor(\n imageVolumeProperties: Types.IVolume,\n streamingProperties: Types.IStreamingVolumeProperties\n ) {\n super(imageVolumeProperties, streamingProperties);\n }\n\n /**\n * Return the scalar data (buffer)\n * @returns volume scalar data\n */\n public getScalarData(): Types.VolumeScalarData {\n return this.scalarData;\n }\n\n /**\n * It returns the imageLoad requests for the streaming image volume instance.\n * It involves getting all the imageIds of the volume and creating a success callback\n * which would update the texture (when the image has loaded) and the failure callback.\n * Note that this method does not executes the requests but only returns the requests.\n * It can be used for sorting requests outside of the volume loader itself\n * e.g. loading a single slice of CT, followed by a single slice of PET (interleaved), before\n * moving to the next slice.\n *\n * @returns Array of requests including imageId of the request, its imageIdIndex,\n * options (targetBuffer and scaling parameters), and additionalDetails (volumeId)\n */\n public getImageLoadRequests = (priority: number) => {\n const { imageIds } = this;\n const scalarData = this.scalarData;\n\n return this.getImageIdsRequests(imageIds, scalarData, priority);\n };\n}\n","import {\n cache,\n utilities,\n Enums,\n imageLoader,\n imageLoadPoolManager,\n getShouldUseSharedArrayBuffer,\n getConfiguration,\n utilities as csUtils,\n} from '@cornerstonejs/core';\nimport type { Types } from '@cornerstonejs/core';\nimport { vec3 } from 'gl-matrix';\nimport { makeVolumeMetadata, sortImageIdsAndGetSpacing } from './helpers';\nimport StreamingImageVolume from './StreamingImageVolume';\n\nconst {\n createUint8SharedArray,\n createFloat32SharedArray,\n createUint16SharedArray,\n createInt16SharedArray,\n} = utilities;\n\ninterface IVolumeLoader {\n promise: Promise;\n cancel: () => void;\n decache: () => void;\n}\n\n/**\n * It handles loading of a image by streaming in its imageIds. It will be the\n * volume loader if the schema for the volumeID is `cornerstoneStreamingImageVolume`.\n * This function returns a promise that resolves to the StreamingImageVolume instance.\n *\n * In order to use the cornerstoneStreamingImageVolumeLoader you should use\n * createAndCacheVolume helper from the cornerstone-core volumeLoader module.\n *\n * @param volumeId - The ID of the volume\n * @param options - options for loading, imageIds\n * @returns a promise that resolves to a StreamingImageVolume\n */\nfunction cornerstoneStreamingImageVolumeLoader(\n volumeId: string,\n options: {\n imageIds: string[];\n }\n): IVolumeLoader {\n if (!options || !options.imageIds || !options.imageIds.length) {\n throw new Error(\n 'ImageIds must be provided to create a streaming image volume'\n );\n }\n\n const { useNorm16Texture, preferSizeOverAccuracy } =\n getConfiguration().rendering;\n const use16BitDataType = useNorm16Texture || preferSizeOverAccuracy;\n\n async function getStreamingImageVolume() {\n /**\n * Check if we are using the `wadouri:` scheme, and if so, preload first,\n * middle, and last image metadata as these are the images the current\n * streaming image loader may explicitly request metadata from. The last image\n * metadata would only be specifically requested if the imageId array order is\n * reversed in the `sortImageIdsAndGetSpacing.ts` file.\n */\n if (options.imageIds[0].split(':')[0] === 'wadouri') {\n const [middleImageIndex, lastImageIndex] = [\n Math.floor(options.imageIds.length / 2),\n options.imageIds.length - 1,\n ];\n const indexesToPrefetch = [0, middleImageIndex, lastImageIndex];\n await Promise.all(\n indexesToPrefetch.map((index) => {\n return new Promise((resolve, reject) => {\n const imageId = options.imageIds[index];\n imageLoadPoolManager.addRequest(\n async () => {\n imageLoader\n .loadImage(imageId)\n .then(() => {\n console.log(`Prefetched imageId: ${imageId}`);\n resolve(true);\n })\n .catch((err) => {\n reject(err);\n });\n },\n Enums.RequestType.Prefetch,\n { volumeId },\n 1 // priority\n );\n });\n })\n ).catch(console.error);\n }\n\n const { imageIds } = options;\n\n const volumeMetadata = makeVolumeMetadata(imageIds);\n\n // For a streaming volume, the data type cannot rely on cswil to load\n // the proper array buffer type. This is because the target buffer container\n // must be decided ahead of time.\n // TODO: move this logic into CSWIL to avoid logic duplication.\n // We check if scaling parameters are negative we choose Int16 instead of\n // Uint16 for cases where BitsAllocated is 16.\n const imageIdIndex = Math.floor(imageIds.length / 2);\n const imageId = imageIds[imageIdIndex];\n const scalingParameters = csUtils.getScalingParameters(imageId);\n const hasNegativeRescale =\n scalingParameters.rescaleIntercept < 0 ||\n scalingParameters.rescaleSlope < 0;\n\n // The prescale is ALWAYS used with modality LUT, so we can assume that\n // if the rescale slope is not an integer, we need to use Float32\n const hasFloatRescale =\n scalingParameters.rescaleIntercept % 1 !== 0 ||\n scalingParameters.rescaleSlope % 1 !== 0;\n\n const {\n BitsAllocated,\n PixelRepresentation,\n PhotometricInterpretation,\n ImageOrientationPatient,\n PixelSpacing,\n Columns,\n Rows,\n } = volumeMetadata;\n\n const rowCosineVec = vec3.fromValues(\n ImageOrientationPatient[0],\n ImageOrientationPatient[1],\n ImageOrientationPatient[2]\n );\n const colCosineVec = vec3.fromValues(\n ImageOrientationPatient[3],\n ImageOrientationPatient[4],\n ImageOrientationPatient[5]\n );\n\n const scanAxisNormal = vec3.create();\n\n vec3.cross(scanAxisNormal, rowCosineVec, colCosineVec);\n\n const { zSpacing, origin, sortedImageIds } = sortImageIdsAndGetSpacing(\n imageIds,\n scanAxisNormal\n );\n\n const numFrames = imageIds.length;\n\n // Spacing goes [1] then [0], as [1] is column spacing (x) and [0] is row spacing (y)\n const spacing = [PixelSpacing[1], PixelSpacing[0], zSpacing];\n const dimensions = [Columns, Rows, numFrames];\n const direction = [\n ...rowCosineVec,\n ...colCosineVec,\n ...scanAxisNormal,\n ] as Types.Mat3;\n const signed = PixelRepresentation === 1;\n const numComponents = PhotometricInterpretation === 'RGB' ? 3 : 1;\n const useSharedArrayBuffer = getShouldUseSharedArrayBuffer();\n const length = dimensions[0] * dimensions[1] * dimensions[2];\n const handleCache = (sizeInBytes) => {\n if (!cache.isCacheable(sizeInBytes)) {\n throw new Error(Enums.Events.CACHE_SIZE_EXCEEDED);\n }\n cache.decacheIfNecessaryUntilBytesAvailable(sizeInBytes);\n };\n\n let scalarData, sizeInBytes;\n switch (BitsAllocated) {\n case 8:\n if (signed) {\n throw new Error(\n '8 Bit signed images are not yet supported by this plugin.'\n );\n }\n sizeInBytes = length * numComponents;\n handleCache(sizeInBytes);\n scalarData = useSharedArrayBuffer\n ? createUint8SharedArray(length * numComponents)\n : new Uint8Array(length * numComponents);\n break;\n\n case 16:\n // Temporary fix for 16 bit images to use Float32\n // until the new dicom image loader handler the conversion\n // correctly\n if (!use16BitDataType || hasFloatRescale) {\n sizeInBytes = length * 4;\n scalarData = useSharedArrayBuffer\n ? createFloat32SharedArray(length)\n : new Float32Array(length);\n\n break;\n }\n\n sizeInBytes = length * 2;\n if (signed || hasNegativeRescale) {\n handleCache(sizeInBytes);\n scalarData = useSharedArrayBuffer\n ? createInt16SharedArray(length)\n : new Int16Array(length);\n break;\n }\n\n if (!signed && !hasNegativeRescale) {\n handleCache(sizeInBytes);\n scalarData = useSharedArrayBuffer\n ? createUint16SharedArray(length)\n : new Uint16Array(length);\n break;\n }\n\n // Default to Float32 again\n sizeInBytes = length * 4;\n handleCache(sizeInBytes);\n scalarData = useSharedArrayBuffer\n ? createFloat32SharedArray(length)\n : new Float32Array(length);\n break;\n\n case 24:\n sizeInBytes = length * numComponents;\n handleCache(sizeInBytes);\n\n // hacky because we don't support alpha channel in dicom\n scalarData = useSharedArrayBuffer\n ? createUint8SharedArray(length * numComponents)\n : new Uint8Array(length * numComponents);\n break;\n }\n\n const streamingImageVolume = new StreamingImageVolume(\n // ImageVolume properties\n {\n volumeId,\n metadata: volumeMetadata,\n dimensions,\n spacing,\n origin,\n direction,\n scalarData,\n sizeInBytes,\n },\n // Streaming properties\n {\n imageIds: sortedImageIds,\n loadStatus: {\n // todo: loading and loaded should be on ImageVolume\n loaded: false,\n loading: false,\n cancelled: false,\n cachedFrames: [],\n callbacks: [],\n },\n }\n );\n\n return streamingImageVolume;\n }\n\n const streamingImageVolumePromise = getStreamingImageVolume();\n\n return {\n promise: streamingImageVolumePromise,\n decache: () => {\n streamingImageVolumePromise.then((streamingImageVolume) => {\n streamingImageVolume.destroy();\n streamingImageVolume = null;\n });\n },\n cancel: () => {\n streamingImageVolumePromise.then((streamingImageVolume) => {\n streamingImageVolume.cancelLoading();\n });\n },\n };\n}\n\nexport default cornerstoneStreamingImageVolumeLoader;\n","import { metaData } from '@cornerstonejs/core';\nimport type { Types } from '@cornerstonejs/core';\n\n/**\n * It creates a metadata object for a volume given the imageIds that compose it.\n * It uses the first imageId to get the metadata.\n *\n * @param imageIds - array of imageIds\n * @returns The volume metadata\n */\nexport default function makeVolumeMetadata(\n imageIds: Array\n): Types.Metadata {\n const imageId0 = imageIds[0];\n\n const {\n pixelRepresentation,\n bitsAllocated,\n bitsStored,\n highBit,\n photometricInterpretation,\n samplesPerPixel,\n } = metaData.get('imagePixelModule', imageId0);\n\n // Add list of VOIs stored on the DICOM.\n const voiLut = [];\n\n const voiLutModule = metaData.get('voiLutModule', imageId0);\n\n // voiLutModule is not always present\n let voiLUTFunction;\n if (voiLutModule) {\n const { windowWidth, windowCenter } = voiLutModule;\n voiLUTFunction = voiLutModule?.voiLUTFunction;\n\n if (Array.isArray(windowWidth)) {\n for (let i = 0; i < windowWidth.length; i++) {\n voiLut.push({\n windowWidth: windowWidth[i],\n windowCenter: windowCenter[i],\n });\n }\n } else {\n voiLut.push({\n windowWidth: windowWidth,\n windowCenter: windowCenter,\n });\n }\n } else {\n voiLut.push({\n windowWidth: undefined,\n windowCenter: undefined,\n });\n }\n\n const { modality, seriesInstanceUID } = metaData.get(\n 'generalSeriesModule',\n imageId0\n );\n\n const {\n imageOrientationPatient,\n pixelSpacing,\n frameOfReferenceUID,\n columns,\n rows,\n } = metaData.get('imagePlaneModule', imageId0);\n\n // Map to dcmjs-style keywords. This is becoming the standard and makes it\n // Easier to swap out cornerstoneDICOMImageLoader at a later date.\n return {\n BitsAllocated: bitsAllocated,\n BitsStored: bitsStored,\n SamplesPerPixel: samplesPerPixel,\n HighBit: highBit,\n PhotometricInterpretation: photometricInterpretation,\n PixelRepresentation: pixelRepresentation,\n Modality: modality,\n ImageOrientationPatient: imageOrientationPatient,\n PixelSpacing: pixelSpacing,\n FrameOfReferenceUID: frameOfReferenceUID,\n Columns: columns,\n Rows: rows,\n // This is a reshaped object and not a dicom tag:\n voiLut,\n VOILUTFunction: voiLUTFunction,\n SeriesInstanceUID: seriesInstanceUID,\n };\n}\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || from);\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n","export const toCodePoints = (str: string): number[] => {\n const codePoints = [];\n let i = 0;\n const length = str.length;\n while (i < length) {\n const value = str.charCodeAt(i++);\n if (value >= 0xd800 && value <= 0xdbff && i < length) {\n const extra = str.charCodeAt(i++);\n if ((extra & 0xfc00) === 0xdc00) {\n codePoints.push(((value & 0x3ff) << 10) + (extra & 0x3ff) + 0x10000);\n } else {\n codePoints.push(value);\n i--;\n }\n } else {\n codePoints.push(value);\n }\n }\n return codePoints;\n};\n\nexport const fromCodePoint = (...codePoints: number[]): string => {\n if (String.fromCodePoint) {\n return String.fromCodePoint(...codePoints);\n }\n\n const length = codePoints.length;\n if (!length) {\n return '';\n }\n\n const codeUnits = [];\n\n let index = -1;\n let result = '';\n while (++index < length) {\n let codePoint = codePoints[index];\n if (codePoint <= 0xffff) {\n codeUnits.push(codePoint);\n } else {\n codePoint -= 0x10000;\n codeUnits.push((codePoint >> 10) + 0xd800, (codePoint % 0x400) + 0xdc00);\n }\n if (index + 1 === length || codeUnits.length > 0x4000) {\n result += String.fromCharCode(...codeUnits);\n codeUnits.length = 0;\n }\n }\n return result;\n};\n\nconst chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n\n// Use a lookup table to find the index.\nconst lookup = typeof Uint8Array === 'undefined' ? [] : new Uint8Array(256);\nfor (let i = 0; i < chars.length; i++) {\n lookup[chars.charCodeAt(i)] = i;\n}\n\nexport const decode = (base64: string): ArrayBuffer | number[] => {\n let bufferLength = base64.length * 0.75,\n len = base64.length,\n i,\n p = 0,\n encoded1,\n encoded2,\n encoded3,\n encoded4;\n\n if (base64[base64.length - 1] === '=') {\n bufferLength--;\n if (base64[base64.length - 2] === '=') {\n bufferLength--;\n }\n }\n\n const buffer =\n typeof ArrayBuffer !== 'undefined' &&\n typeof Uint8Array !== 'undefined' &&\n typeof Uint8Array.prototype.slice !== 'undefined'\n ? new ArrayBuffer(bufferLength)\n : new Array(bufferLength);\n const bytes = Array.isArray(buffer) ? buffer : new Uint8Array(buffer);\n\n for (i = 0; i < len; i += 4) {\n encoded1 = lookup[base64.charCodeAt(i)];\n encoded2 = lookup[base64.charCodeAt(i + 1)];\n encoded3 = lookup[base64.charCodeAt(i + 2)];\n encoded4 = lookup[base64.charCodeAt(i + 3)];\n\n bytes[p++] = (encoded1 << 2) | (encoded2 >> 4);\n bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2);\n bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63);\n }\n\n return buffer;\n};\n\nexport const polyUint16Array = (buffer: number[]): number[] => {\n const length = buffer.length;\n const bytes = [];\n for (let i = 0; i < length; i += 2) {\n bytes.push((buffer[i + 1] << 8) | buffer[i]);\n }\n return bytes;\n};\n\nexport const polyUint32Array = (buffer: number[]): number[] => {\n const length = buffer.length;\n const bytes = [];\n for (let i = 0; i < length; i += 4) {\n bytes.push((buffer[i + 3] << 24) | (buffer[i + 2] << 16) | (buffer[i + 1] << 8) | buffer[i]);\n }\n return bytes;\n};\n","import {Context} from '../../core/context';\n\nexport class Bounds {\n constructor(readonly left: number, readonly top: number, readonly width: number, readonly height: number) {}\n\n add(x: number, y: number, w: number, h: number): Bounds {\n return new Bounds(this.left + x, this.top + y, this.width + w, this.height + h);\n }\n\n static fromClientRect(context: Context, clientRect: ClientRect): Bounds {\n return new Bounds(\n clientRect.left + context.windowBounds.left,\n clientRect.top + context.windowBounds.top,\n clientRect.width,\n clientRect.height\n );\n }\n\n static fromDOMRectList(context: Context, domRectList: DOMRectList): Bounds {\n const domRect = Array.from(domRectList).find((rect) => rect.width !== 0);\n return domRect\n ? new Bounds(\n domRect.left + context.windowBounds.left,\n domRect.top + context.windowBounds.top,\n domRect.width,\n domRect.height\n )\n : Bounds.EMPTY;\n }\n\n static EMPTY = new Bounds(0, 0, 0, 0);\n}\n\nexport const parseBounds = (context: Context, node: Element): Bounds => {\n return Bounds.fromClientRect(context, node.getBoundingClientRect());\n};\n\nexport const parseDocumentSize = (document: Document): Bounds => {\n const body = document.body;\n const documentElement = document.documentElement;\n\n if (!body || !documentElement) {\n throw new Error(`Unable to get document size`);\n }\n const width = Math.max(\n Math.max(body.scrollWidth, documentElement.scrollWidth),\n Math.max(body.offsetWidth, documentElement.offsetWidth),\n Math.max(body.clientWidth, documentElement.clientWidth)\n );\n\n const height = Math.max(\n Math.max(body.scrollHeight, documentElement.scrollHeight),\n Math.max(body.offsetHeight, documentElement.offsetHeight),\n Math.max(body.clientHeight, documentElement.clientHeight)\n );\n\n return new Bounds(0, 0, width, height);\n};\n","const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n\n// Use a lookup table to find the index.\nconst lookup = typeof Uint8Array === 'undefined' ? [] : new Uint8Array(256);\nfor (let i = 0; i < chars.length; i++) {\n lookup[chars.charCodeAt(i)] = i;\n}\n\nexport const decode = (base64: string): ArrayBuffer | number[] => {\n let bufferLength = base64.length * 0.75,\n len = base64.length,\n i,\n p = 0,\n encoded1,\n encoded2,\n encoded3,\n encoded4;\n\n if (base64[base64.length - 1] === '=') {\n bufferLength--;\n if (base64[base64.length - 2] === '=') {\n bufferLength--;\n }\n }\n\n const buffer =\n typeof ArrayBuffer !== 'undefined' &&\n typeof Uint8Array !== 'undefined' &&\n typeof Uint8Array.prototype.slice !== 'undefined'\n ? new ArrayBuffer(bufferLength)\n : new Array(bufferLength);\n const bytes = Array.isArray(buffer) ? buffer : new Uint8Array(buffer);\n\n for (i = 0; i < len; i += 4) {\n encoded1 = lookup[base64.charCodeAt(i)];\n encoded2 = lookup[base64.charCodeAt(i + 1)];\n encoded3 = lookup[base64.charCodeAt(i + 2)];\n encoded4 = lookup[base64.charCodeAt(i + 3)];\n\n bytes[p++] = (encoded1 << 2) | (encoded2 >> 4);\n bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2);\n bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63);\n }\n\n return buffer;\n};\n\nexport const polyUint16Array = (buffer: number[]): number[] => {\n const length = buffer.length;\n const bytes = [];\n for (let i = 0; i < length; i += 2) {\n bytes.push((buffer[i + 1] << 8) | buffer[i]);\n }\n return bytes;\n};\n\nexport const polyUint32Array = (buffer: number[]): number[] => {\n const length = buffer.length;\n const bytes = [];\n for (let i = 0; i < length; i += 4) {\n bytes.push((buffer[i + 3] << 24) | (buffer[i + 2] << 16) | (buffer[i + 1] << 8) | buffer[i]);\n }\n return bytes;\n};\n","const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n\n// Use a lookup table to find the index.\nconst lookup = typeof Uint8Array === 'undefined' ? [] : new Uint8Array(256);\nfor (let i = 0; i < chars.length; i++) {\n lookup[chars.charCodeAt(i)] = i;\n}\n\nexport const encode = (arraybuffer: ArrayBuffer): string => {\n let bytes = new Uint8Array(arraybuffer),\n i,\n len = bytes.length,\n base64 = '';\n\n for (i = 0; i < len; i += 3) {\n base64 += chars[bytes[i] >> 2];\n base64 += chars[((bytes[i] & 3) << 4) | (bytes[i + 1] >> 4)];\n base64 += chars[((bytes[i + 1] & 15) << 2) | (bytes[i + 2] >> 6)];\n base64 += chars[bytes[i + 2] & 63];\n }\n\n if (len % 3 === 2) {\n base64 = base64.substring(0, base64.length - 1) + '=';\n } else if (len % 3 === 1) {\n base64 = base64.substring(0, base64.length - 2) + '==';\n }\n\n return base64;\n};\n\nexport const decode = (base64: string): ArrayBuffer => {\n let bufferLength = base64.length * 0.75,\n len = base64.length,\n i,\n p = 0,\n encoded1,\n encoded2,\n encoded3,\n encoded4;\n\n if (base64[base64.length - 1] === '=') {\n bufferLength--;\n if (base64[base64.length - 2] === '=') {\n bufferLength--;\n }\n }\n\n const arraybuffer = new ArrayBuffer(bufferLength),\n bytes = new Uint8Array(arraybuffer);\n\n for (i = 0; i < len; i += 4) {\n encoded1 = lookup[base64.charCodeAt(i)];\n encoded2 = lookup[base64.charCodeAt(i + 1)];\n encoded3 = lookup[base64.charCodeAt(i + 2)];\n encoded4 = lookup[base64.charCodeAt(i + 3)];\n\n bytes[p++] = (encoded1 << 2) | (encoded2 >> 4);\n bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2);\n bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63);\n }\n\n return arraybuffer;\n};\n","import {decode, polyUint16Array, polyUint32Array} from './Util';\n\nexport type int = number;\n\n/** Shift size for getting the index-2 table offset. */\nexport const UTRIE2_SHIFT_2 = 5;\n\n/** Shift size for getting the index-1 table offset. */\nexport const UTRIE2_SHIFT_1 = 6 + 5;\n\n/**\n * Shift size for shifting left the index array values.\n * Increases possible data size with 16-bit index values at the cost\n * of compactability.\n * This requires data blocks to be aligned by UTRIE2_DATA_GRANULARITY.\n */\nexport const UTRIE2_INDEX_SHIFT = 2;\n\n/**\n * Difference between the two shift sizes,\n * for getting an index-1 offset from an index-2 offset. 6=11-5\n */\nexport const UTRIE2_SHIFT_1_2 = UTRIE2_SHIFT_1 - UTRIE2_SHIFT_2;\n\n/**\n * The part of the index-2 table for U+D800..U+DBFF stores values for\n * lead surrogate code _units_ not code _points_.\n * Values for lead surrogate code _points_ are indexed with this portion of the table.\n * Length=32=0x20=0x400>>UTRIE2_SHIFT_2. (There are 1024=0x400 lead surrogates.)\n */\nexport const UTRIE2_LSCP_INDEX_2_OFFSET = 0x10000 >> UTRIE2_SHIFT_2;\n\n/** Number of entries in a data block. 32=0x20 */\nexport const UTRIE2_DATA_BLOCK_LENGTH = 1 << UTRIE2_SHIFT_2;\n/** Mask for getting the lower bits for the in-data-block offset. */\nexport const UTRIE2_DATA_MASK = UTRIE2_DATA_BLOCK_LENGTH - 1;\n\nexport const UTRIE2_LSCP_INDEX_2_LENGTH = 0x400 >> UTRIE2_SHIFT_2;\n/** Count the lengths of both BMP pieces. 2080=0x820 */\nexport const UTRIE2_INDEX_2_BMP_LENGTH = UTRIE2_LSCP_INDEX_2_OFFSET + UTRIE2_LSCP_INDEX_2_LENGTH;\n/**\n * The 2-byte UTF-8 version of the index-2 table follows at offset 2080=0x820.\n * Length 32=0x20 for lead bytes C0..DF, regardless of UTRIE2_SHIFT_2.\n */\nexport const UTRIE2_UTF8_2B_INDEX_2_OFFSET = UTRIE2_INDEX_2_BMP_LENGTH;\nexport const UTRIE2_UTF8_2B_INDEX_2_LENGTH = 0x800 >> 6; /* U+0800 is the first code point after 2-byte UTF-8 */\n/**\n * The index-1 table, only used for supplementary code points, at offset 2112=0x840.\n * Variable length, for code points up to highStart, where the last single-value range starts.\n * Maximum length 512=0x200=0x100000>>UTRIE2_SHIFT_1.\n * (For 0x100000 supplementary code points U+10000..U+10ffff.)\n *\n * The part of the index-2 table for supplementary code points starts\n * after this index-1 table.\n *\n * Both the index-1 table and the following part of the index-2 table\n * are omitted completely if there is only BMP data.\n */\nexport const UTRIE2_INDEX_1_OFFSET = UTRIE2_UTF8_2B_INDEX_2_OFFSET + UTRIE2_UTF8_2B_INDEX_2_LENGTH;\n\n/**\n * Number of index-1 entries for the BMP. 32=0x20\n * This part of the index-1 table is omitted from the serialized form.\n */\nexport const UTRIE2_OMITTED_BMP_INDEX_1_LENGTH = 0x10000 >> UTRIE2_SHIFT_1;\n\n/** Number of entries in an index-2 block. 64=0x40 */\nexport const UTRIE2_INDEX_2_BLOCK_LENGTH = 1 << UTRIE2_SHIFT_1_2;\n/** Mask for getting the lower bits for the in-index-2-block offset. */\nexport const UTRIE2_INDEX_2_MASK = UTRIE2_INDEX_2_BLOCK_LENGTH - 1;\n\nconst slice16 = (view: number[] | Uint16Array, start: number, end?: number) => {\n if (view.slice) {\n return view.slice(start, end);\n }\n\n return new Uint16Array(Array.prototype.slice.call(view, start, end));\n};\n\nconst slice32 = (view: number[] | Uint32Array, start: number, end?: number) => {\n if (view.slice) {\n return view.slice(start, end);\n }\n\n return new Uint32Array(Array.prototype.slice.call(view, start, end));\n};\n\nexport const createTrieFromBase64 = (base64: string, _byteLength: number): Trie => {\n const buffer = decode(base64);\n const view32 = Array.isArray(buffer) ? polyUint32Array(buffer) : new Uint32Array(buffer);\n const view16 = Array.isArray(buffer) ? polyUint16Array(buffer) : new Uint16Array(buffer);\n const headerLength = 24;\n\n const index = slice16(view16, headerLength / 2, view32[4] / 2);\n const data =\n view32[5] === 2\n ? slice16(view16, (headerLength + view32[4]) / 2)\n : slice32(view32, Math.ceil((headerLength + view32[4]) / 4));\n\n return new Trie(view32[0], view32[1], view32[2], view32[3], index, data);\n};\n\nexport class Trie {\n initialValue: int;\n errorValue: int;\n highStart: int;\n highValueIndex: int;\n index: Uint16Array | number[];\n data: Uint32Array | Uint16Array | number[];\n\n constructor(\n initialValue: int,\n errorValue: int,\n highStart: int,\n highValueIndex: int,\n index: Uint16Array | number[],\n data: Uint32Array | Uint16Array | number[]\n ) {\n this.initialValue = initialValue;\n this.errorValue = errorValue;\n this.highStart = highStart;\n this.highValueIndex = highValueIndex;\n this.index = index;\n this.data = data;\n }\n\n /**\n * Get the value for a code point as stored in the Trie.\n *\n * @param codePoint the code point\n * @return the value\n */\n get(codePoint: number): number {\n let ix;\n if (codePoint >= 0) {\n if (codePoint < 0x0d800 || (codePoint > 0x0dbff && codePoint <= 0x0ffff)) {\n // Ordinary BMP code point, excluding leading surrogates.\n // BMP uses a single level lookup. BMP index starts at offset 0 in the Trie2 index.\n // 16 bit data is stored in the index array itself.\n ix = this.index[codePoint >> UTRIE2_SHIFT_2];\n ix = (ix << UTRIE2_INDEX_SHIFT) + (codePoint & UTRIE2_DATA_MASK);\n return this.data[ix];\n }\n\n if (codePoint <= 0xffff) {\n // Lead Surrogate Code Point. A Separate index section is stored for\n // lead surrogate code units and code points.\n // The main index has the code unit data.\n // For this function, we need the code point data.\n // Note: this expression could be refactored for slightly improved efficiency, but\n // surrogate code points will be so rare in practice that it's not worth it.\n ix = this.index[UTRIE2_LSCP_INDEX_2_OFFSET + ((codePoint - 0xd800) >> UTRIE2_SHIFT_2)];\n ix = (ix << UTRIE2_INDEX_SHIFT) + (codePoint & UTRIE2_DATA_MASK);\n return this.data[ix];\n }\n\n if (codePoint < this.highStart) {\n // Supplemental code point, use two-level lookup.\n ix = UTRIE2_INDEX_1_OFFSET - UTRIE2_OMITTED_BMP_INDEX_1_LENGTH + (codePoint >> UTRIE2_SHIFT_1);\n ix = this.index[ix];\n ix += (codePoint >> UTRIE2_SHIFT_2) & UTRIE2_INDEX_2_MASK;\n ix = this.index[ix];\n ix = (ix << UTRIE2_INDEX_SHIFT) + (codePoint & UTRIE2_DATA_MASK);\n return this.data[ix];\n }\n if (codePoint <= 0x10ffff) {\n return this.data[this.highValueIndex];\n }\n }\n\n // Fall through. The code point is outside of the legal range of 0..0x10ffff.\n return this.errorValue;\n }\n}\n","export const base64 =\n 'KwAAAAAAAAAACA4AUD0AADAgAAACAAAAAAAIABAAGABAAEgAUABYAGAAaABgAGgAYgBqAF8AZwBgAGgAcQB5AHUAfQCFAI0AlQCdAKIAqgCyALoAYABoAGAAaABgAGgAwgDKAGAAaADGAM4A0wDbAOEA6QDxAPkAAQEJAQ8BFwF1AH0AHAEkASwBNAE6AUIBQQFJAVEBWQFhAWgBcAF4ATAAgAGGAY4BlQGXAZ8BpwGvAbUBvQHFAc0B0wHbAeMB6wHxAfkBAQIJAvEBEQIZAiECKQIxAjgCQAJGAk4CVgJeAmQCbAJ0AnwCgQKJApECmQKgAqgCsAK4ArwCxAIwAMwC0wLbAjAA4wLrAvMC+AIAAwcDDwMwABcDHQMlAy0DNQN1AD0DQQNJA0kDSQNRA1EDVwNZA1kDdQB1AGEDdQBpA20DdQN1AHsDdQCBA4kDkQN1AHUAmQOhA3UAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AKYDrgN1AHUAtgO+A8YDzgPWAxcD3gPjA+sD8wN1AHUA+wMDBAkEdQANBBUEHQQlBCoEFwMyBDgEYABABBcDSARQBFgEYARoBDAAcAQzAXgEgASIBJAEdQCXBHUAnwSnBK4EtgS6BMIEyAR1AHUAdQB1AHUAdQCVANAEYABgAGAAYABgAGAAYABgANgEYADcBOQEYADsBPQE/AQEBQwFFAUcBSQFLAU0BWQEPAVEBUsFUwVbBWAAYgVgAGoFcgV6BYIFigWRBWAAmQWfBaYFYABgAGAAYABgAKoFYACxBbAFuQW6BcEFwQXHBcEFwQXPBdMF2wXjBeoF8gX6BQIGCgYSBhoGIgYqBjIGOgZgAD4GRgZMBmAAUwZaBmAAYABgAGAAYABgAGAAYABgAGAAYABgAGIGYABpBnAGYABgAGAAYABgAGAAYABgAGAAYAB4Bn8GhQZgAGAAYAB1AHcDFQSLBmAAYABgAJMGdQA9A3UAmwajBqsGqwaVALMGuwbDBjAAywbSBtIG1QbSBtIG0gbSBtIG0gbdBuMG6wbzBvsGAwcLBxMHAwcbByMHJwcsBywHMQcsB9IGOAdAB0gHTgfSBkgHVgfSBtIG0gbSBtIG0gbSBtIG0gbSBiwHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAdgAGAALAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAdbB2MHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsB2kH0gZwB64EdQB1AHUAdQB1AHUAdQB1AHUHfQdgAIUHjQd1AHUAlQedB2AAYAClB6sHYACzB7YHvgfGB3UAzgfWBzMB3gfmB1EB7gf1B/0HlQENAQUIDQh1ABUIHQglCBcDLQg1CD0IRQhNCEEDUwh1AHUAdQBbCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIcAh3CHoIMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIgggwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAALAcsBywHLAcsBywHLAcsBywHLAcsB4oILAcsB44I0gaWCJ4Ipgh1AHUAqgiyCHUAdQB1AHUAdQB1AHUAdQB1AHUAtwh8AXUAvwh1AMUIyQjRCNkI4AjoCHUAdQB1AO4I9gj+CAYJDgkTCS0HGwkjCYIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiAAIAAAAFAAYABgAGIAXwBgAHEAdQBFAJUAogCyAKAAYABgAEIA4ABGANMA4QDxAMEBDwE1AFwBLAE6AQEBUQF4QkhCmEKoQrhCgAHIQsAB0MLAAcABwAHAAeDC6ABoAHDCwMMAAcABwAHAAdDDGMMAAcAB6MM4wwjDWMNow3jDaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAEjDqABWw6bDqABpg6gAaABoAHcDvwOPA+gAaABfA/8DvwO/A78DvwO/A78DvwO/A78DvwO/A78DvwO/A78DvwO/A78DvwO/A78DvwO/A78DvwO/A78DpcPAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcAB9cPKwkyCToJMAB1AHUAdQBCCUoJTQl1AFUJXAljCWcJawkwADAAMAAwAHMJdQB2CX4JdQCECYoJjgmWCXUAngkwAGAAYABxAHUApgn3A64JtAl1ALkJdQDACTAAMAAwADAAdQB1AHUAdQB1AHUAdQB1AHUAowYNBMUIMAAwADAAMADICcsJ0wnZCRUE4QkwAOkJ8An4CTAAMAB1AAAKvwh1AAgKDwoXCh8KdQAwACcKLgp1ADYKqAmICT4KRgowADAAdQB1AE4KMAB1AFYKdQBeCnUAZQowADAAMAAwADAAMAAwADAAMAAVBHUAbQowADAAdQC5CXUKMAAwAHwBxAijBogEMgF9CoQKiASMCpQKmgqIBKIKqgquCogEDQG2Cr4KxgrLCjAAMADTCtsKCgHjCusK8Qr5CgELMAAwADAAMAB1AIsECQsRC3UANAEZCzAAMAAwADAAMAB1ACELKQswAHUANAExCzkLdQBBC0kLMABRC1kLMAAwADAAMAAwADAAdQBhCzAAMAAwAGAAYABpC3ELdwt/CzAAMACHC4sLkwubC58Lpwt1AK4Ltgt1APsDMAAwADAAMAAwADAAMAAwAL4LwwvLC9IL1wvdCzAAMADlC+kL8Qv5C/8LSQswADAAMAAwADAAMAAwADAAMAAHDDAAMAAwADAAMAAODBYMHgx1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1ACYMMAAwADAAdQB1AHUALgx1AHUAdQB1AHUAdQA2DDAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AD4MdQBGDHUAdQB1AHUAdQB1AEkMdQB1AHUAdQB1AFAMMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQBYDHUAdQB1AF8MMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUA+wMVBGcMMAAwAHwBbwx1AHcMfwyHDI8MMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAYABgAJcMMAAwADAAdQB1AJ8MlQClDDAAMACtDCwHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsB7UMLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AA0EMAC9DDAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAsBywHLAcsBywHLAcsBywHLQcwAMEMyAwsBywHLAcsBywHLAcsBywHLAcsBywHzAwwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAHUAdQB1ANQM2QzhDDAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMABgAGAAYABgAGAAYABgAOkMYADxDGAA+AwADQYNYABhCWAAYAAODTAAMAAwADAAFg1gAGAAHg37AzAAMAAwADAAYABgACYNYAAsDTQNPA1gAEMNPg1LDWAAYABgAGAAYABgAGAAYABgAGAAUg1aDYsGVglhDV0NcQBnDW0NdQ15DWAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAlQCBDZUAiA2PDZcNMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAnw2nDTAAMAAwADAAMAAwAHUArw23DTAAMAAwADAAMAAwADAAMAAwADAAMAB1AL8NMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAB1AHUAdQB1AHUAdQDHDTAAYABgAM8NMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA1w11ANwNMAAwAD0B5A0wADAAMAAwADAAMADsDfQN/A0EDgwOFA4wABsOMAAwADAAMAAwADAAMAAwANIG0gbSBtIG0gbSBtIG0gYjDigOwQUuDsEFMw7SBjoO0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIGQg5KDlIOVg7SBtIGXg5lDm0OdQ7SBtIGfQ6EDooOjQ6UDtIGmg6hDtIG0gaoDqwO0ga0DrwO0gZgAGAAYADEDmAAYAAkBtIGzA5gANIOYADaDokO0gbSBt8O5w7SBu8O0gb1DvwO0gZgAGAAxA7SBtIG0gbSBtIGYABgAGAAYAAED2AAsAUMD9IG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIGFA8sBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAccD9IGLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHJA8sBywHLAcsBywHLAccDywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywPLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAc0D9IG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIGLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAccD9IG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIGFA8sBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHPA/SBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gYUD0QPlQCVAJUAMAAwADAAMACVAJUAlQCVAJUAlQCVAEwPMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA//8EAAQABAAEAAQABAAEAAQABAANAAMAAQABAAIABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQACgATABcAHgAbABoAHgAXABYAEgAeABsAGAAPABgAHABLAEsASwBLAEsASwBLAEsASwBLABgAGAAeAB4AHgATAB4AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQABYAGwASAB4AHgAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAWAA0AEQAeAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAAQABAAEAAQABAAFAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAJABYAGgAbABsAGwAeAB0AHQAeAE8AFwAeAA0AHgAeABoAGwBPAE8ADgBQAB0AHQAdAE8ATwAXAE8ATwBPABYAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAFAAUABQAFAAUABQAFAAUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAB4AHgAeAFAATwBAAE8ATwBPAEAATwBQAFAATwBQAB4AHgAeAB4AHgAeAB0AHQAdAB0AHgAdAB4ADgBQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgBQAB4AUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAJAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAkACQAJAAkACQAJAAkABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAeAB4AHgAeAFAAHgAeAB4AKwArAFAAUABQAFAAGABQACsAKwArACsAHgAeAFAAHgBQAFAAUAArAFAAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAEAAQABAAEAAQABAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAUAAeAB4AHgAeAB4AHgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAYAA0AKwArAB4AHgAbACsABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQADQAEAB4ABAAEAB4ABAAEABMABAArACsAKwArACsAKwArACsAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAKwArACsAKwBWAFYAVgBWAB4AHgArACsAKwArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AGgAaABoAGAAYAB4AHgAEAAQABAAEAAQABAAEAAQABAAEAAQAEwAEACsAEwATAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABLAEsASwBLAEsASwBLAEsASwBLABoAGQAZAB4AUABQAAQAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQABMAUAAEAAQABAAEAAQABAAEAB4AHgAEAAQABAAEAAQABABQAFAABAAEAB4ABAAEAAQABABQAFAASwBLAEsASwBLAEsASwBLAEsASwBQAFAAUAAeAB4AUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwAeAFAABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQAUABQAB4AHgAYABMAUAArACsABAAbABsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAFAABAAEAAQABAAEAFAABAAEAAQAUAAEAAQABAAEAAQAKwArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAArACsAHgArAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAB4ABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAUAAEAAQABAAEAAQABAAEAFAAUABQAFAAUABQAFAAUABQAFAABAAEAA0ADQBLAEsASwBLAEsASwBLAEsASwBLAB4AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAArAFAAUABQAFAAUABQAFAAUAArACsAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAUAArACsAKwBQAFAAUABQACsAKwAEAFAABAAEAAQABAAEAAQABAArACsABAAEACsAKwAEAAQABABQACsAKwArACsAKwArACsAKwAEACsAKwArACsAUABQACsAUABQAFAABAAEACsAKwBLAEsASwBLAEsASwBLAEsASwBLAFAAUAAaABoAUABQAFAAUABQAEwAHgAbAFAAHgAEACsAKwAEAAQABAArAFAAUABQAFAAUABQACsAKwArACsAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAUABQACsAUABQACsAUABQACsAKwAEACsABAAEAAQABAAEACsAKwArACsABAAEACsAKwAEAAQABAArACsAKwAEACsAKwArACsAKwArACsAUABQAFAAUAArAFAAKwArACsAKwArACsAKwBLAEsASwBLAEsASwBLAEsASwBLAAQABABQAFAAUAAEAB4AKwArACsAKwArACsAKwArACsAKwAEAAQABAArAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAUABQACsAUABQAFAAUABQACsAKwAEAFAABAAEAAQABAAEAAQABAAEACsABAAEAAQAKwAEAAQABAArACsAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAABAAEACsAKwBLAEsASwBLAEsASwBLAEsASwBLAB4AGwArACsAKwArACsAKwArAFAABAAEAAQABAAEAAQAKwAEAAQABAArAFAAUABQAFAAUABQAFAAUAArACsAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAArACsABAAEACsAKwAEAAQABAArACsAKwArACsAKwArAAQABAAEACsAKwArACsAUABQACsAUABQAFAABAAEACsAKwBLAEsASwBLAEsASwBLAEsASwBLAB4AUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArAAQAUAArAFAAUABQAFAAUABQACsAKwArAFAAUABQACsAUABQAFAAUAArACsAKwBQAFAAKwBQACsAUABQACsAKwArAFAAUAArACsAKwBQAFAAUAArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArAAQABAAEAAQABAArACsAKwAEAAQABAArAAQABAAEAAQAKwArAFAAKwArACsAKwArACsABAArACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAUABQAFAAHgAeAB4AHgAeAB4AGwAeACsAKwArACsAKwAEAAQABAAEAAQAUABQAFAAUABQAFAAUABQACsAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAUAAEAAQABAAEAAQABAAEACsABAAEAAQAKwAEAAQABAAEACsAKwArACsAKwArACsABAAEACsAUABQAFAAKwArACsAKwArAFAAUAAEAAQAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAKwAOAFAAUABQAFAAUABQAFAAHgBQAAQABAAEAA4AUABQAFAAUABQAFAAUABQACsAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAKwArAAQAUAAEAAQABAAEAAQABAAEACsABAAEAAQAKwAEAAQABAAEACsAKwArACsAKwArACsABAAEACsAKwArACsAKwArACsAUAArAFAAUAAEAAQAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwBQAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwAEAAQABAAEAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAFAABAAEAAQABAAEAAQABAArAAQABAAEACsABAAEAAQABABQAB4AKwArACsAKwBQAFAAUAAEAFAAUABQAFAAUABQAFAAUABQAFAABAAEACsAKwBLAEsASwBLAEsASwBLAEsASwBLAFAAUABQAFAAUABQAFAAUABQABoAUABQAFAAUABQAFAAKwAEAAQABAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQACsAUAArACsAUABQAFAAUABQAFAAUAArACsAKwAEACsAKwArACsABAAEAAQABAAEAAQAKwAEACsABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArAAQABAAeACsAKwArACsAKwArACsAKwArACsAKwArAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAAqAFwAXAAqACoAKgAqACoAKgAqACsAKwArACsAGwBcAFwAXABcAFwAXABcACoAKgAqACoAKgAqACoAKgAeAEsASwBLAEsASwBLAEsASwBLAEsADQANACsAKwArACsAKwBcAFwAKwBcACsAXABcAFwAXABcACsAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcACsAXAArAFwAXABcAFwAXABcAFwAXABcAFwAKgBcAFwAKgAqACoAKgAqACoAKgAqACoAXAArACsAXABcAFwAXABcACsAXAArACoAKgAqACoAKgAqACsAKwBLAEsASwBLAEsASwBLAEsASwBLACsAKwBcAFwAXABcAFAADgAOAA4ADgAeAA4ADgAJAA4ADgANAAkAEwATABMAEwATAAkAHgATAB4AHgAeAAQABAAeAB4AHgAeAB4AHgBLAEsASwBLAEsASwBLAEsASwBLAFAAUABQAFAAUABQAFAAUABQAFAADQAEAB4ABAAeAAQAFgARABYAEQAEAAQAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQADQAEAAQABAAEAAQADQAEAAQAUABQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABAArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArAA0ADQAeAB4AHgAeAB4AHgAEAB4AHgAeAB4AHgAeACsAHgAeAA4ADgANAA4AHgAeAB4AHgAeAAkACQArACsAKwArACsAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgBcAEsASwBLAEsASwBLAEsASwBLAEsADQANAB4AHgAeAB4AXABcAFwAXABcAFwAKgAqACoAKgBcAFwAXABcACoAKgAqAFwAKgAqACoAXABcACoAKgAqACoAKgAqACoAXABcAFwAKgAqACoAKgBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcACoAKgAqACoAKgAqACoAKgAqACoAKgAqAFwAKgBLAEsASwBLAEsASwBLAEsASwBLACoAKgAqACoAKgAqAFAAUABQAFAAUABQACsAUAArACsAKwArACsAUAArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgBQAFAAUABQAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUAArACsAUABQAFAAUABQAFAAUAArAFAAKwBQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAKwBQACsAUABQAFAAUAArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsABAAEAAQAHgANAB4AHgAeAB4AHgAeAB4AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwBQAFAAUABQAFAAUAArACsADQBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAANAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAWABEAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAA0ADQANAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAAQABAAEACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAANAA0AKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUAArAAQABAArACsAKwArACsAKwArACsAKwArACsAKwBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqAA0ADQAVAFwADQAeAA0AGwBcACoAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwAeAB4AEwATAA0ADQAOAB4AEwATAB4ABAAEAAQACQArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArAFAAUABQAFAAUAAEAAQAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQAUAArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAArACsAKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsAHgArACsAKwATABMASwBLAEsASwBLAEsASwBLAEsASwBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAArACsAXABcAFwAXABcACsAKwArACsAKwArACsAKwArACsAKwBcAFwAXABcAFwAXABcAFwAXABcAFwAXAArACsAKwArAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAXAArACsAKwAqACoAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAArACsAHgAeAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcACoAKgAqACoAKgAqACoAKgAqACoAKwAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKwArAAQASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArACsAKwBLAEsASwBLAEsASwBLAEsASwBLACsAKwArACsAKwArACoAKgAqACoAKgAqACoAXAAqACoAKgAqACoAKgArACsABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsABAAEAAQABAAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABABQAFAAUABQAFAAUABQACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwANAA0AHgANAA0ADQANAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAEAAQABAAEAAQABAAEAAQAHgAeAB4AHgAeAB4AHgAeAB4AKwArACsABAAEAAQAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABQAFAASwBLAEsASwBLAEsASwBLAEsASwBQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwAeAB4AHgAeAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArAA0ADQANAA0ADQBLAEsASwBLAEsASwBLAEsASwBLACsAKwArAFAAUABQAEsASwBLAEsASwBLAEsASwBLAEsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAA0ADQBQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwBQAFAAUAAeAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArAAQABAAEAB4ABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABQAFAAUABQAAQAUABQAFAAUABQAFAABABQAFAABAAEAAQAUAArACsAKwArACsABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsABAAEAAQABAAEAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArAFAAUABQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAKwBQACsAUAArAFAAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACsAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArAB4AHgAeAB4AHgAeAB4AHgBQAB4AHgAeAFAAUABQACsAHgAeAB4AHgAeAB4AHgAeAB4AHgBQAFAAUABQACsAKwAeAB4AHgAeAB4AHgArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArAFAAUABQACsAHgAeAB4AHgAeAB4AHgAOAB4AKwANAA0ADQANAA0ADQANAAkADQANAA0ACAAEAAsABAAEAA0ACQANAA0ADAAdAB0AHgAXABcAFgAXABcAFwAWABcAHQAdAB4AHgAUABQAFAANAAEAAQAEAAQABAAEAAQACQAaABoAGgAaABoAGgAaABoAHgAXABcAHQAVABUAHgAeAB4AHgAeAB4AGAAWABEAFQAVABUAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ADQAeAA0ADQANAA0AHgANAA0ADQAHAB4AHgAeAB4AKwAEAAQABAAEAAQABAAEAAQABAAEAFAAUAArACsATwBQAFAAUABQAFAAHgAeAB4AFgARAE8AUABPAE8ATwBPAFAAUABQAFAAUAAeAB4AHgAWABEAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArABsAGwAbABsAGwAbABsAGgAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGgAbABsAGwAbABoAGwAbABoAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAHgAeAFAAGgAeAB0AHgBQAB4AGgAeAB4AHgAeAB4AHgAeAB4AHgBPAB4AUAAbAB4AHgBQAFAAUABQAFAAHgAeAB4AHQAdAB4AUAAeAFAAHgBQAB4AUABPAFAAUAAeAB4AHgAeAB4AHgAeAFAAUABQAFAAUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAFAAHgBQAFAAUABQAE8ATwBQAFAAUABQAFAATwBQAFAATwBQAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAFAAUABQAFAATwBPAE8ATwBPAE8ATwBPAE8ATwBQAFAAUABQAFAAUABQAFAAUAAeAB4AUABQAFAAUABPAB4AHgArACsAKwArAB0AHQAdAB0AHQAdAB0AHQAdAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHgAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB4AHQAdAB4AHgAeAB0AHQAeAB4AHQAeAB4AHgAdAB4AHQAbABsAHgAdAB4AHgAeAB4AHQAeAB4AHQAdAB0AHQAeAB4AHQAeAB0AHgAdAB0AHQAdAB0AHQAeAB0AHgAeAB4AHgAeAB0AHQAdAB0AHgAeAB4AHgAdAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB4AHgAeAB0AHgAeAB4AHgAeAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB0AHgAeAB0AHQAdAB0AHgAeAB0AHQAeAB4AHQAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHQAeAB4AHQAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHQAeAB4AHgAdAB4AHgAeAB4AHgAeAB4AHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AFAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeABYAEQAWABEAHgAeAB4AHgAeAB4AHQAeAB4AHgAeAB4AHgAeACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAWABEAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAFAAHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHgAeAB4AHgAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAeAB4AHQAdAB0AHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHQAeAB0AHQAdAB0AHQAdAB0AHgAeAB4AHgAeAB4AHgAeAB0AHQAeAB4AHQAdAB4AHgAeAB4AHQAdAB4AHgAeAB4AHQAdAB0AHgAeAB0AHgAeAB0AHQAdAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB0AHQAdAB4AHgAeAB4AHgAeAB4AHgAeAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAlACUAJQAlAB4AHQAdAB4AHgAdAB4AHgAeAB4AHQAdAB4AHgAeAB4AJQAlAB0AHQAlAB4AJQAlACUAIAAlACUAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAlACUAJQAeAB4AHgAeAB0AHgAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB0AHgAdAB0AHQAeAB0AJQAdAB0AHgAdAB0AHgAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACUAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHQAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAlACUAJQAlACUAJQAlACUAJQAlACUAJQAdAB0AHQAdACUAHgAlACUAJQAdACUAJQAdAB0AHQAlACUAHQAdACUAHQAdACUAJQAlAB4AHQAeAB4AHgAeAB0AHQAlAB0AHQAdAB0AHQAdACUAJQAlACUAJQAdACUAJQAgACUAHQAdACUAJQAlACUAJQAlACUAJQAeAB4AHgAlACUAIAAgACAAIAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHgAeAB4AFwAXABcAFwAXABcAHgATABMAJQAeAB4AHgAWABEAFgARABYAEQAWABEAFgARABYAEQAWABEATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeABYAEQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAWABEAFgARABYAEQAWABEAFgARAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AFgARABYAEQAWABEAFgARABYAEQAWABEAFgARABYAEQAWABEAFgARABYAEQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAWABEAFgARAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AFgARAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB0AHQAdAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AUABQAFAAUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAEAAQABAAeAB4AKwArACsAKwArABMADQANAA0AUAATAA0AUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAUAANACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAA0ADQANAA0ADQANAA0ADQAeAA0AFgANAB4AHgAXABcAHgAeABcAFwAWABEAFgARABYAEQAWABEADQANAA0ADQATAFAADQANAB4ADQANAB4AHgAeAB4AHgAMAAwADQANAA0AHgANAA0AFgANAA0ADQANAA0ADQANAA0AHgANAB4ADQANAB4AHgAeACsAKwArACsAKwArACsAKwArACsAKwArACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAKwArACsAKwArACsAKwArACsAKwArACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAlACUAJQAlACUAJQAlACUAJQAlACUAJQArACsAKwArAA0AEQARACUAJQBHAFcAVwAWABEAFgARABYAEQAWABEAFgARACUAJQAWABEAFgARABYAEQAWABEAFQAWABEAEQAlAFcAVwBXAFcAVwBXAFcAVwBXAAQABAAEAAQABAAEACUAVwBXAFcAVwA2ACUAJQBXAFcAVwBHAEcAJQAlACUAKwBRAFcAUQBXAFEAVwBRAFcAUQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFEAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBRAFcAUQBXAFEAVwBXAFcAVwBXAFcAUQBXAFcAVwBXAFcAVwBRAFEAKwArAAQABAAVABUARwBHAFcAFQBRAFcAUQBXAFEAVwBRAFcAUQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFEAVwBRAFcAUQBXAFcAVwBXAFcAVwBRAFcAVwBXAFcAVwBXAFEAUQBXAFcAVwBXABUAUQBHAEcAVwArACsAKwArACsAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAKwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAKwAlACUAVwBXAFcAVwAlACUAJQAlACUAJQAlACUAJQAlACsAKwArACsAKwArACsAKwArACsAKwArAFEAUQBRAFEAUQBRAFEAUQBRAFEAUQBRAFEAUQBRAFEAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQArAFcAVwBXAFcAVwBXAFcAVwBXAFcAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQBPAE8ATwBPAE8ATwBPAE8AJQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACUAJQAlAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAEcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAKwArACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAADQATAA0AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABLAEsASwBLAEsASwBLAEsASwBLAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAFAABAAEAAQABAAeAAQABAAEAAQABAAEAAQABAAEAAQAHgBQAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AUABQAAQABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAeAA0ADQANAA0ADQArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAFAAUABQAFAAUABQAFAAUABQAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAB4AHgAeAB4AHgAeAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAHgAeAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAeAB4AUABQAFAAUABQAFAAUABQAFAAUABQAAQAUABQAFAABABQAFAAUABQAAQAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAeAB4AHgAeAAQAKwArACsAUABQAFAAUABQAFAAHgAeABoAHgArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAADgAOABMAEwArACsAKwArACsAKwArACsABAAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwANAA0ASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArACsAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABQAFAAUABQAFAAUAAeAB4AHgBQAA4AUABQAAQAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAA0ADQBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwArACsAKwArACsAKwArACsAKwArAB4AWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYACsAKwArAAQAHgAeAB4AHgAeAB4ADQANAA0AHgAeAB4AHgArAFAASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArAB4AHgBcAFwAXABcAFwAKgBcAFwAXABcAFwAXABcAFwAXABcAEsASwBLAEsASwBLAEsASwBLAEsAXABcAFwAXABcACsAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwArAFAAUABQAAQAUABQAFAAUABQAFAAUABQAAQABAArACsASwBLAEsASwBLAEsASwBLAEsASwArACsAHgANAA0ADQBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAKgAqACoAXAAqACoAKgBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAAqAFwAKgAqACoAXABcACoAKgBcAFwAXABcAFwAKgAqAFwAKgBcACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFwAXABcACoAKgBQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAA0ADQBQAFAAUAAEAAQAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUAArACsAUABQAFAAUABQAFAAKwArAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgAeACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQADQAEAAQAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAVABVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBUAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVACsAKwArACsAKwArACsAKwArACsAKwArAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAKwArACsAKwBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAKwArACsAKwAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACUAJQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAJQAlACUAJQAlACUAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAKwArACsAKwArAFYABABWAFYAVgBWAFYAVgBWAFYAVgBWAB4AVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgArAFYAVgBWAFYAVgArAFYAKwBWAFYAKwBWAFYAKwBWAFYAVgBWAFYAVgBWAFYAVgBWAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAEQAWAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUAAaAB4AKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAGAARABEAGAAYABMAEwAWABEAFAArACsAKwArACsAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACUAJQAlACUAJQAWABEAFgARABYAEQAWABEAFgARABYAEQAlACUAFgARACUAJQAlACUAJQAlACUAEQAlABEAKwAVABUAEwATACUAFgARABYAEQAWABEAJQAlACUAJQAlACUAJQAlACsAJQAbABoAJQArACsAKwArAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAAcAKwATACUAJQAbABoAJQAlABYAEQAlACUAEQAlABEAJQBXAFcAVwBXAFcAVwBXAFcAVwBXABUAFQAlACUAJQATACUAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXABYAJQARACUAJQAlAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwAWACUAEQAlABYAEQARABYAEQARABUAVwBRAFEAUQBRAFEAUQBRAFEAUQBRAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAEcARwArACsAVwBXAFcAVwBXAFcAKwArAFcAVwBXAFcAVwBXACsAKwBXAFcAVwBXAFcAVwArACsAVwBXAFcAKwArACsAGgAbACUAJQAlABsAGwArAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwAEAAQABAAQAB0AKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsADQANAA0AKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArAB4AHgAeAB4AHgAeAB4AHgAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAFAAHgAeAB4AKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAAQAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAA0AUABQAFAAUAArACsAKwArAFAAUABQAFAAUABQAFAAUAANAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwAeACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAKwArAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUAArACsAKwBQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwANAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAB4AUABQAFAAUABQAFAAUAArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUAArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArAA0AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAUABQAFAAUABQAAQABAAEACsABAAEACsAKwArACsAKwAEAAQABAAEAFAAUABQAFAAKwBQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAAQABAAEACsAKwArACsABABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArAA0ADQANAA0ADQANAA0ADQAeACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAFAAUABQAFAAUABQAFAAUAAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAArACsAKwArAFAAUABQAFAAUAANAA0ADQANAA0ADQAUACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsADQANAA0ADQANAA0ADQBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArAFAAUABQAFAAUABQAAQABAAEAAQAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUAArAAQABAANACsAKwBQAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABABQAFAAUABQAB4AHgAeAB4AHgArACsAKwArACsAKwAEAAQABAAEAAQABAAEAA0ADQAeAB4AHgAeAB4AKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABAAeAB4AHgANAA0ADQANACsAKwArACsAKwArACsAKwArACsAKwAeACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwBLAEsASwBLAEsASwBLAEsASwBLACsAKwArACsAKwArAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsASwBLAEsASwBLAEsASwBLAEsASwANAA0ADQANAFAABAAEAFAAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAeAA4AUAArACsAKwArACsAKwArACsAKwAEAFAAUABQAFAADQANAB4ADQAEAAQABAAEAB4ABAAEAEsASwBLAEsASwBLAEsASwBLAEsAUAAOAFAADQANAA0AKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAANAA0AHgANAA0AHgAEACsAUABQAFAAUABQAFAAUAArAFAAKwBQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAA0AKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsABAAEAAQABAArAFAAUABQAFAAUABQAFAAUAArACsAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAUABQACsAUABQAFAAUABQACsABAAEAFAABAAEAAQABAAEAAQABAArACsABAAEACsAKwAEAAQABAArACsAUAArACsAKwArACsAKwAEACsAKwArACsAKwBQAFAAUABQAFAABAAEACsAKwAEAAQABAAEAAQABAAEACsAKwArAAQABAAEAAQABAArACsAKwArACsAKwArACsAKwArACsABAAEAAQABAAEAAQABABQAFAAUABQAA0ADQANAA0AHgBLAEsASwBLAEsASwBLAEsASwBLAA0ADQArAB4ABABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAEAAQABAAEAFAAUAAeAFAAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAArACsABAAEAAQABAAEAAQABAAEAAQADgANAA0AEwATAB4AHgAeAA0ADQANAA0ADQANAA0ADQANAA0ADQANAA0ADQANAFAAUABQAFAABAAEACsAKwAEAA0ADQAeAFAAKwArACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAFAAKwArACsAKwArACsAKwBLAEsASwBLAEsASwBLAEsASwBLACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAKwArACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwBcAFwADQANAA0AKgBQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAeACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwBQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAKwArAFAAKwArAFAAUABQAFAAUABQAFAAUAArAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQAKwAEAAQAKwArAAQABAAEAAQAUAAEAFAABAAEAA0ADQANACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAArACsABAAEAAQABAAEAAQABABQAA4AUAAEACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAABAAEAAQABAAEAAQABAAEAAQABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAFAABAAEAAQABAAOAB4ADQANAA0ADQAOAB4ABAArACsAKwArACsAKwArACsAUAAEAAQABAAEAAQABAAEAAQABAAEAAQAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAA0ADQANAFAADgAOAA4ADQANACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEACsABAAEAAQABAAEAAQABAAEAFAADQANAA0ADQANACsAKwArACsAKwArACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwAOABMAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQACsAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAArACsAKwAEACsABAAEACsABAAEAAQABAAEAAQABABQAAQAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAUABQAFAAUABQAFAAKwBQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQAKwAEAAQAKwAEAAQABAAEAAQAUAArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAB4AHgAeAB4AHgAeAB4AHgAaABoAGgAaAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwArACsAKwArACsAKwArAA0AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsADQANAA0ADQANACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAASABIAEgAQwBDAEMAUABQAFAAUABDAFAAUABQAEgAQwBIAEMAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAASABDAEMAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwAJAAkACQAJAAkACQAJABYAEQArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABIAEMAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwANAA0AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAAQABAAEAAQABAANACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAA0ADQANAB4AHgAeAB4AHgAeAFAAUABQAFAADQAeACsAKwArACsAKwArACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwArAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAANAA0AHgAeACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwAEAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwArACsAKwArACsAKwAEAAQABAAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAARwBHABUARwAJACsAKwArACsAKwArACsAKwArACsAKwAEAAQAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACsAKwArACsAKwArACsAKwBXAFcAVwBXAFcAVwBXAFcAVwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUQBRAFEAKwArACsAKwArACsAKwArACsAKwArACsAKwBRAFEAUQBRACsAKwArACsAKwArACsAKwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUAArACsAHgAEAAQADQAEAAQABAAEACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwArACsAKwArAB4AHgAeAB4AHgAeAB4AKwArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAAQABAAEAAQABAAeAB4AHgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAB4AHgAEAAQABAAEAAQABAAEAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAEAAQABAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAEAAQAHgArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwArACsAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwBQAFAAKwArAFAAKwArAFAAUAArACsAUABQAFAAUAArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACsAUAArAFAAUABQAFAAUABQAFAAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwBQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAHgAeAFAAUABQAFAAUAArAFAAKwArACsAUABQAFAAUABQAFAAUAArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAFAAUABQAFAAUABQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAB4AHgAeAB4AHgAeAB4AHgAeACsAKwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAeAB4AHgAeAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAeAB4AHgAeAB4AHgAeAB4ABAAeAB4AHgAeAB4AHgAeAB4AHgAeAAQAHgAeAA0ADQANAA0AHgArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAEAAQABAAEAAQAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAAQABAAEAAQABAAEAAQAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwArAAQABAAEAAQABAAEAAQAKwAEAAQAKwAEAAQABAAEAAQAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwAEAAQABAAEAAQABAAEAFAAUABQAFAAUABQAFAAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwBQAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArABsAUABQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwArAB4AHgAeAB4ABAAEAAQABAAEAAQABABQACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArABYAFgArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAGgBQAFAAUAAaAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwBQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAKwBQACsAKwBQACsAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAKwBQACsAUAArACsAKwArACsAKwBQACsAKwArACsAUAArAFAAKwBQACsAUABQAFAAKwBQAFAAKwBQACsAKwBQACsAUAArAFAAKwBQACsAUAArAFAAUAArAFAAKwArAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAUABQAFAAUAArAFAAUABQAFAAKwBQACsAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAUABQAFAAKwBQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8AJQAlACUAHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHgAeAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB4AHgAeACUAJQAlAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAJQAlACUAJQAlACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAeAB4AJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlAB4AHgAlACUAJQAlACUAHgAlACUAJQAlACUAIAAgACAAJQAlACAAJQAlACAAIAAgACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACEAIQAhACEAIQAlACUAIAAgACUAJQAgACAAIAAgACAAIAAgACAAIAAgACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAJQAlACUAIAAlACUAJQAlACAAIAAgACUAIAAgACAAJQAlACUAJQAlACUAJQAgACUAIAAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAHgAlAB4AJQAeACUAJQAlACUAJQAgACUAJQAlACUAHgAlAB4AHgAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAeACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACAAIAAlACUAJQAlACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACAAJQAlACUAJQAgACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAHgAeAB4AHgAeAB4AHgAeACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAeAB4AHgAeAB4AHgAlACUAJQAlACUAJQAlACAAIAAgACUAJQAlACAAIAAgACAAIAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeABcAFwAXABUAFQAVAB4AHgAeAB4AJQAlACUAIAAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACAAIAAgACUAJQAlACUAJQAlACUAJQAlACAAJQAlACUAJQAlACUAJQAlACUAJQAlACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAlACUAJQAlACUAJQAlACUAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACUAJQAlACUAJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAeACUAJQAlACUAJQAlAB4AHgAeAB4AHgAeAB4AHgAlACUAJQAlACUAJQAlACUAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAgACUAJQAgACUAJQAlACUAJQAlACUAJQAgACAAIAAgACAAIAAgACAAJQAlACUAJQAlACUAIAAlACUAJQAlACUAJQAlACUAJQAgACAAIAAgACAAIAAgACAAIAAgACUAJQAgACAAIAAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAgACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACAAIAAlACAAIAAlACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAgACAAIAAlACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAJQAlAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAKwArAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACUAJQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwAlACUAJQAlACUAJQAlACUAJQAlACUAVwBXACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAKwAEACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAA==';\nexport const byteLength = 39664;\n","'use strict';\n\nimport {createTrieFromBase64} from 'utrie';\nimport {base64, byteLength} from './linebreak-trie';\nimport {fromCodePoint, toCodePoints} from './Util';\n\nexport const LETTER_NUMBER_MODIFIER = 50;\n\n// Non-tailorable Line Breaking Classes\nconst BK = 1; // Cause a line break (after)\nconst CR = 2; // Cause a line break (after), except between CR and LF\nconst LF = 3; // Cause a line break (after)\nconst CM = 4; // Prohibit a line break between the character and the preceding character\nconst NL = 5; // Cause a line break (after)\nconst SG = 6; // Do not occur in well-formed text\nconst WJ = 7; // Prohibit line breaks before and after\nconst ZW = 8; // Provide a break opportunity\nconst GL = 9; // Prohibit line breaks before and after\nconst SP = 10; // Enable indirect line breaks\nconst ZWJ = 11; // Prohibit line breaks within joiner sequences\n// Break Opportunities\nconst B2 = 12; // Provide a line break opportunity before and after the character\nconst BA = 13; // Generally provide a line break opportunity after the character\nconst BB = 14; // Generally provide a line break opportunity before the character\nconst HY = 15; // Provide a line break opportunity after the character, except in numeric context\nconst CB = 16; // Provide a line break opportunity contingent on additional information\n// Characters Prohibiting Certain Breaks\nconst CL = 17; // Prohibit line breaks before\nconst CP = 18; // Prohibit line breaks before\nconst EX = 19; // Prohibit line breaks before\nconst IN = 20; // Allow only indirect line breaks between pairs\nconst NS = 21; // Allow only indirect line breaks before\nconst OP = 22; // Prohibit line breaks after\nconst QU = 23; // Act like they are both opening and closing\n// Numeric Context\nconst IS = 24; // Prevent breaks after any and before numeric\nconst NU = 25; // Form numeric expressions for line breaking purposes\nconst PO = 26; // Do not break following a numeric expression\nconst PR = 27; // Do not break in front of a numeric expression\nconst SY = 28; // Prevent a break before; and allow a break after\n// Other Characters\nconst AI = 29; // Act like AL when the resolvedEAW is N; otherwise; act as ID\nconst AL = 30; // Are alphabetic characters or symbols that are used with alphabetic characters\nconst CJ = 31; // Treat as NS or ID for strict or normal breaking.\nconst EB = 32; // Do not break from following Emoji Modifier\nconst EM = 33; // Do not break from preceding Emoji Base\nconst H2 = 34; // Form Korean syllable blocks\nconst H3 = 35; // Form Korean syllable blocks\nconst HL = 36; // Do not break around a following hyphen; otherwise act as Alphabetic\nconst ID = 37; // Break before or after; except in some numeric context\nconst JL = 38; // Form Korean syllable blocks\nconst JV = 39; // Form Korean syllable blocks\nconst JT = 40; // Form Korean syllable blocks\nconst RI = 41; // Keep pairs together. For pairs; break before and after other classes\nconst SA = 42; // Provide a line break opportunity contingent on additional, language-specific context analysis\nconst XX = 43; // Have as yet unknown line breaking behavior or unassigned code positions\n\nconst ea_OP = [0x2329, 0xff08];\n\nexport const classes: {[key: string]: number} = {\n BK,\n CR,\n LF,\n CM,\n NL,\n SG,\n WJ,\n ZW,\n GL,\n SP,\n ZWJ,\n B2,\n BA,\n BB,\n HY,\n CB,\n CL,\n CP,\n EX,\n IN,\n NS,\n OP,\n QU,\n IS,\n NU,\n PO,\n PR,\n SY,\n AI,\n AL,\n CJ,\n EB,\n EM,\n H2,\n H3,\n HL,\n ID,\n JL,\n JV,\n JT,\n RI,\n SA,\n XX,\n};\n\nexport const BREAK_MANDATORY = '!';\nexport const BREAK_NOT_ALLOWED = '×';\nexport const BREAK_ALLOWED = '÷';\nexport const UnicodeTrie = createTrieFromBase64(base64, byteLength);\n\nconst ALPHABETICS = [AL, HL];\nconst HARD_LINE_BREAKS = [BK, CR, LF, NL];\nconst SPACE = [SP, ZW];\nconst PREFIX_POSTFIX = [PR, PO];\nconst LINE_BREAKS = HARD_LINE_BREAKS.concat(SPACE);\nconst KOREAN_SYLLABLE_BLOCK = [JL, JV, JT, H2, H3];\nconst HYPHEN = [HY, BA];\n\nexport const codePointsToCharacterClasses = (\n codePoints: number[],\n lineBreak: string = 'strict'\n): [number[], number[], boolean[]] => {\n const types: number[] = [];\n const indices: number[] = [];\n const categories: boolean[] = [];\n codePoints.forEach((codePoint, index) => {\n let classType = UnicodeTrie.get(codePoint);\n if (classType > LETTER_NUMBER_MODIFIER) {\n categories.push(true);\n classType -= LETTER_NUMBER_MODIFIER;\n } else {\n categories.push(false);\n }\n\n if (['normal', 'auto', 'loose'].indexOf(lineBreak) !== -1) {\n // U+2010, – U+2013, 〜 U+301C, ゠ U+30A0\n if ([0x2010, 0x2013, 0x301c, 0x30a0].indexOf(codePoint) !== -1) {\n indices.push(index);\n return types.push(CB);\n }\n }\n\n if (classType === CM || classType === ZWJ) {\n // LB10 Treat any remaining combining mark or ZWJ as AL.\n if (index === 0) {\n indices.push(index);\n return types.push(AL);\n }\n\n // LB9 Do not break a combining character sequence; treat it as if it has the line breaking class of\n // the base character in all of the following rules. Treat ZWJ as if it were CM.\n const prev = types[index - 1];\n if (LINE_BREAKS.indexOf(prev) === -1) {\n indices.push(indices[index - 1]);\n return types.push(prev);\n }\n indices.push(index);\n return types.push(AL);\n }\n\n indices.push(index);\n\n if (classType === CJ) {\n return types.push(lineBreak === 'strict' ? NS : ID);\n }\n\n if (classType === SA) {\n return types.push(AL);\n }\n\n if (classType === AI) {\n return types.push(AL);\n }\n\n // For supplementary characters, a useful default is to treat characters in the range 10000..1FFFD as AL\n // and characters in the ranges 20000..2FFFD and 30000..3FFFD as ID, until the implementation can be revised\n // to take into account the actual line breaking properties for these characters.\n if (classType === XX) {\n if ((codePoint >= 0x20000 && codePoint <= 0x2fffd) || (codePoint >= 0x30000 && codePoint <= 0x3fffd)) {\n return types.push(ID);\n } else {\n return types.push(AL);\n }\n }\n\n types.push(classType);\n });\n\n return [indices, types, categories];\n};\n\nconst isAdjacentWithSpaceIgnored = (\n a: number[] | number,\n b: number,\n currentIndex: number,\n classTypes: number[]\n): boolean => {\n const current = classTypes[currentIndex];\n if (Array.isArray(a) ? a.indexOf(current) !== -1 : a === current) {\n let i = currentIndex;\n while (i <= classTypes.length) {\n i++;\n let next = classTypes[i];\n\n if (next === b) {\n return true;\n }\n\n if (next !== SP) {\n break;\n }\n }\n }\n\n if (current === SP) {\n let i = currentIndex;\n\n while (i > 0) {\n i--;\n const prev = classTypes[i];\n\n if (Array.isArray(a) ? a.indexOf(prev) !== -1 : a === prev) {\n let n = currentIndex;\n while (n <= classTypes.length) {\n n++;\n let next = classTypes[n];\n\n if (next === b) {\n return true;\n }\n\n if (next !== SP) {\n break;\n }\n }\n }\n\n if (prev !== SP) {\n break;\n }\n }\n }\n return false;\n};\n\nconst previousNonSpaceClassType = (currentIndex: number, classTypes: number[]): number => {\n let i = currentIndex;\n while (i >= 0) {\n let type = classTypes[i];\n if (type === SP) {\n i--;\n } else {\n return type;\n }\n }\n return 0;\n};\n\nexport type BREAK_OPPORTUNITIES = typeof BREAK_NOT_ALLOWED | typeof BREAK_ALLOWED | typeof BREAK_MANDATORY;\n\nconst _lineBreakAtIndex = (\n codePoints: number[],\n classTypes: number[],\n indicies: number[],\n index: number,\n forbiddenBreaks?: boolean[]\n): BREAK_OPPORTUNITIES => {\n if (indicies[index] === 0) {\n return BREAK_NOT_ALLOWED;\n }\n\n let currentIndex = index - 1;\n if (Array.isArray(forbiddenBreaks) && forbiddenBreaks[currentIndex] === true) {\n return BREAK_NOT_ALLOWED;\n }\n\n let beforeIndex = currentIndex - 1;\n let afterIndex = currentIndex + 1;\n let current = classTypes[currentIndex];\n\n // LB4 Always break after hard line breaks.\n // LB5 Treat CR followed by LF, as well as CR, LF, and NL as hard line breaks.\n let before = beforeIndex >= 0 ? classTypes[beforeIndex] : 0;\n let next = classTypes[afterIndex];\n\n if (current === CR && next === LF) {\n return BREAK_NOT_ALLOWED;\n }\n\n if (HARD_LINE_BREAKS.indexOf(current) !== -1) {\n return BREAK_MANDATORY;\n }\n\n // LB6 Do not break before hard line breaks.\n if (HARD_LINE_BREAKS.indexOf(next) !== -1) {\n return BREAK_NOT_ALLOWED;\n }\n\n // LB7 Do not break before spaces or zero width space.\n if (SPACE.indexOf(next) !== -1) {\n return BREAK_NOT_ALLOWED;\n }\n\n // LB8 Break before any character following a zero-width space, even if one or more spaces intervene.\n if (previousNonSpaceClassType(currentIndex, classTypes) === ZW) {\n return BREAK_ALLOWED;\n }\n\n // LB8a Do not break after a zero width joiner.\n if (UnicodeTrie.get(codePoints[currentIndex]) === ZWJ) {\n return BREAK_NOT_ALLOWED;\n }\n\n // zwj emojis\n if ((current === EB || current === EM) && UnicodeTrie.get(codePoints[afterIndex]) === ZWJ) {\n return BREAK_NOT_ALLOWED;\n }\n\n // LB11 Do not break before or after Word joiner and related characters.\n if (current === WJ || next === WJ) {\n return BREAK_NOT_ALLOWED;\n }\n\n // LB12 Do not break after NBSP and related characters.\n if (current === GL) {\n return BREAK_NOT_ALLOWED;\n }\n\n // LB12a Do not break before NBSP and related characters, except after spaces and hyphens.\n if ([SP, BA, HY].indexOf(current) === -1 && next === GL) {\n return BREAK_NOT_ALLOWED;\n }\n\n // LB13 Do not break before ‘]’ or ‘!’ or ‘;’ or ‘/’, even after spaces.\n if ([CL, CP, EX, IS, SY].indexOf(next) !== -1) {\n return BREAK_NOT_ALLOWED;\n }\n\n // LB14 Do not break after ‘[’, even after spaces.\n if (previousNonSpaceClassType(currentIndex, classTypes) === OP) {\n return BREAK_NOT_ALLOWED;\n }\n\n // LB15 Do not break within ‘”[’, even with intervening spaces.\n if (isAdjacentWithSpaceIgnored(QU, OP, currentIndex, classTypes)) {\n return BREAK_NOT_ALLOWED;\n }\n\n // LB16 Do not break between closing punctuation and a nonstarter (lb=NS), even with intervening spaces.\n if (isAdjacentWithSpaceIgnored([CL, CP], NS, currentIndex, classTypes)) {\n return BREAK_NOT_ALLOWED;\n }\n\n // LB17 Do not break within ‘——’, even with intervening spaces.\n if (isAdjacentWithSpaceIgnored(B2, B2, currentIndex, classTypes)) {\n return BREAK_NOT_ALLOWED;\n }\n\n // LB18 Break after spaces.\n if (current === SP) {\n return BREAK_ALLOWED;\n }\n\n // LB19 Do not break before or after quotation marks, such as ‘ ” ’.\n if (current === QU || next === QU) {\n return BREAK_NOT_ALLOWED;\n }\n\n // LB20 Break before and after unresolved CB.\n if (next === CB || current === CB) {\n return BREAK_ALLOWED;\n }\n\n // LB21 Do not break before hyphen-minus, other hyphens, fixed-width spaces, small kana, and other non-starters, or after acute accents.\n if ([BA, HY, NS].indexOf(next) !== -1 || current === BB) {\n return BREAK_NOT_ALLOWED;\n }\n\n // LB21a Don't break after Hebrew + Hyphen.\n if (before === HL && HYPHEN.indexOf(current) !== -1) {\n return BREAK_NOT_ALLOWED;\n }\n\n // LB21b Don’t break between Solidus and Hebrew letters.\n if (current === SY && next === HL) {\n return BREAK_NOT_ALLOWED;\n }\n\n // LB22 Do not break before ellipsis.\n if (next === IN) {\n return BREAK_NOT_ALLOWED;\n }\n\n // LB23 Do not break between digits and letters.\n if ((ALPHABETICS.indexOf(next) !== -1 && current === NU) || (ALPHABETICS.indexOf(current) !== -1 && next === NU)) {\n return BREAK_NOT_ALLOWED;\n }\n\n // LB23a Do not break between numeric prefixes and ideographs, or between ideographs and numeric postfixes.\n if (\n (current === PR && [ID, EB, EM].indexOf(next) !== -1) ||\n ([ID, EB, EM].indexOf(current) !== -1 && next === PO)\n ) {\n return BREAK_NOT_ALLOWED;\n }\n\n // LB24 Do not break between numeric prefix/postfix and letters, or between letters and prefix/postfix.\n if (\n (ALPHABETICS.indexOf(current) !== -1 && PREFIX_POSTFIX.indexOf(next) !== -1) ||\n (PREFIX_POSTFIX.indexOf(current) !== -1 && ALPHABETICS.indexOf(next) !== -1)\n ) {\n return BREAK_NOT_ALLOWED;\n }\n\n // LB25 Do not break between the following pairs of classes relevant to numbers:\n if (\n // (PR | PO) × ( OP | HY )? NU\n ([PR, PO].indexOf(current) !== -1 &&\n (next === NU || ([OP, HY].indexOf(next) !== -1 && classTypes[afterIndex + 1] === NU))) ||\n // ( OP | HY ) × NU\n ([OP, HY].indexOf(current) !== -1 && next === NU) ||\n // NU ×\t(NU | SY | IS)\n (current === NU && [NU, SY, IS].indexOf(next) !== -1)\n ) {\n return BREAK_NOT_ALLOWED;\n }\n\n // NU (NU | SY | IS)* × (NU | SY | IS | CL | CP)\n if ([NU, SY, IS, CL, CP].indexOf(next) !== -1) {\n let prevIndex = currentIndex;\n while (prevIndex >= 0) {\n let type = classTypes[prevIndex];\n if (type === NU) {\n return BREAK_NOT_ALLOWED;\n } else if ([SY, IS].indexOf(type) !== -1) {\n prevIndex--;\n } else {\n break;\n }\n }\n }\n\n // NU (NU | SY | IS)* (CL | CP)? × (PO | PR))\n if ([PR, PO].indexOf(next) !== -1) {\n let prevIndex = [CL, CP].indexOf(current) !== -1 ? beforeIndex : currentIndex;\n while (prevIndex >= 0) {\n let type = classTypes[prevIndex];\n if (type === NU) {\n return BREAK_NOT_ALLOWED;\n } else if ([SY, IS].indexOf(type) !== -1) {\n prevIndex--;\n } else {\n break;\n }\n }\n }\n\n // LB26 Do not break a Korean syllable.\n if (\n (JL === current && [JL, JV, H2, H3].indexOf(next) !== -1) ||\n ([JV, H2].indexOf(current) !== -1 && [JV, JT].indexOf(next) !== -1) ||\n ([JT, H3].indexOf(current) !== -1 && next === JT)\n ) {\n return BREAK_NOT_ALLOWED;\n }\n\n // LB27 Treat a Korean Syllable Block the same as ID.\n if (\n (KOREAN_SYLLABLE_BLOCK.indexOf(current) !== -1 && [IN, PO].indexOf(next) !== -1) ||\n (KOREAN_SYLLABLE_BLOCK.indexOf(next) !== -1 && current === PR)\n ) {\n return BREAK_NOT_ALLOWED;\n }\n\n // LB28 Do not break between alphabetics (“at”).\n if (ALPHABETICS.indexOf(current) !== -1 && ALPHABETICS.indexOf(next) !== -1) {\n return BREAK_NOT_ALLOWED;\n }\n\n // LB29 Do not break between numeric punctuation and alphabetics (“e.g.”).\n if (current === IS && ALPHABETICS.indexOf(next) !== -1) {\n return BREAK_NOT_ALLOWED;\n }\n\n // LB30 Do not break between letters, numbers, or ordinary symbols and opening or closing parentheses.\n if (\n (ALPHABETICS.concat(NU).indexOf(current) !== -1 &&\n next === OP &&\n ea_OP.indexOf(codePoints[afterIndex]) === -1) ||\n (ALPHABETICS.concat(NU).indexOf(next) !== -1 && current === CP)\n ) {\n return BREAK_NOT_ALLOWED;\n }\n\n // LB30a Break between two regional indicator symbols if and only if there are an even number of regional\n // indicators preceding the position of the break.\n if (current === RI && next === RI) {\n let i = indicies[currentIndex];\n let count = 1;\n while (i > 0) {\n i--;\n if (classTypes[i] === RI) {\n count++;\n } else {\n break;\n }\n }\n if (count % 2 !== 0) {\n return BREAK_NOT_ALLOWED;\n }\n }\n\n // LB30b Do not break between an emoji base and an emoji modifier.\n if (current === EB && next === EM) {\n return BREAK_NOT_ALLOWED;\n }\n\n return BREAK_ALLOWED;\n};\n\nexport const lineBreakAtIndex = (codePoints: number[], index: number): BREAK_OPPORTUNITIES => {\n // LB2 Never break at the start of text.\n if (index === 0) {\n return BREAK_NOT_ALLOWED;\n }\n\n // LB3 Always break at the end of text.\n if (index >= codePoints.length) {\n return BREAK_MANDATORY;\n }\n\n const [indices, classTypes] = codePointsToCharacterClasses(codePoints);\n\n return _lineBreakAtIndex(codePoints, classTypes, indices, index);\n};\n\nexport type LINE_BREAK = 'auto' | 'normal' | 'strict';\nexport type WORD_BREAK = 'normal' | 'break-all' | 'break-word' | 'keep-all';\n\ninterface IOptions {\n lineBreak?: LINE_BREAK;\n wordBreak?: WORD_BREAK;\n}\n\nconst cssFormattedClasses = (codePoints: number[], options?: IOptions): [number[], number[], boolean[] | undefined] => {\n if (!options) {\n options = {lineBreak: 'normal', wordBreak: 'normal'};\n }\n let [indicies, classTypes, isLetterNumber] = codePointsToCharacterClasses(codePoints, options.lineBreak);\n\n if (options.wordBreak === 'break-all' || options.wordBreak === 'break-word') {\n classTypes = classTypes.map((type) => ([NU, AL, SA].indexOf(type) !== -1 ? ID : type));\n }\n\n const forbiddenBreakpoints =\n options.wordBreak === 'keep-all'\n ? isLetterNumber.map((letterNumber, i) => {\n return letterNumber && codePoints[i] >= 0x4e00 && codePoints[i] <= 0x9fff;\n })\n : undefined;\n\n return [indicies, classTypes, forbiddenBreakpoints];\n};\n\nexport const inlineBreakOpportunities = (str: string, options?: IOptions): string => {\n const codePoints = toCodePoints(str);\n let output = BREAK_NOT_ALLOWED;\n const [indicies, classTypes, forbiddenBreakpoints] = cssFormattedClasses(codePoints, options);\n\n codePoints.forEach((codePoint, i) => {\n output +=\n fromCodePoint(codePoint) +\n (i >= codePoints.length - 1\n ? BREAK_MANDATORY\n : _lineBreakAtIndex(codePoints, classTypes, indicies, i + 1, forbiddenBreakpoints));\n });\n\n return output;\n};\n\nclass Break {\n private readonly codePoints: number[];\n readonly required: boolean;\n readonly start: number;\n readonly end: number;\n\n constructor(codePoints: number[], lineBreak: string, start: number, end: number) {\n this.codePoints = codePoints;\n this.required = lineBreak === BREAK_MANDATORY;\n this.start = start;\n this.end = end;\n }\n\n slice(): string {\n return fromCodePoint(...this.codePoints.slice(this.start, this.end));\n }\n}\n\nexport type LineBreak =\n | {\n done: true;\n value: null;\n }\n | {\n done: false;\n value: Break;\n };\n\ninterface ILineBreakIterator {\n next: () => LineBreak;\n}\n\nexport const LineBreaker = (str: string, options?: IOptions): ILineBreakIterator => {\n const codePoints = toCodePoints(str);\n const [indicies, classTypes, forbiddenBreakpoints] = cssFormattedClasses(codePoints, options);\n const length = codePoints.length;\n let lastEnd = 0;\n let nextIndex = 0;\n\n return {\n next: () => {\n if (nextIndex >= length) {\n return {done: true, value: null};\n }\n let lineBreak = BREAK_NOT_ALLOWED;\n while (\n nextIndex < length &&\n (lineBreak = _lineBreakAtIndex(codePoints, classTypes, indicies, ++nextIndex, forbiddenBreakpoints)) ===\n BREAK_NOT_ALLOWED\n ) {}\n\n if (lineBreak !== BREAK_NOT_ALLOWED || nextIndex === length) {\n const value = new Break(codePoints, lineBreak, lastEnd, nextIndex);\n lastEnd = nextIndex;\n return {value, done: false};\n }\n\n return {done: true, value: null};\n },\n };\n};\n","// https://www.w3.org/TR/css-syntax-3\n\nimport {fromCodePoint, toCodePoints} from 'css-line-break';\n\nexport const enum TokenType {\n STRING_TOKEN,\n BAD_STRING_TOKEN,\n LEFT_PARENTHESIS_TOKEN,\n RIGHT_PARENTHESIS_TOKEN,\n COMMA_TOKEN,\n HASH_TOKEN,\n DELIM_TOKEN,\n AT_KEYWORD_TOKEN,\n PREFIX_MATCH_TOKEN,\n DASH_MATCH_TOKEN,\n INCLUDE_MATCH_TOKEN,\n LEFT_CURLY_BRACKET_TOKEN,\n RIGHT_CURLY_BRACKET_TOKEN,\n SUFFIX_MATCH_TOKEN,\n SUBSTRING_MATCH_TOKEN,\n DIMENSION_TOKEN,\n PERCENTAGE_TOKEN,\n NUMBER_TOKEN,\n FUNCTION,\n FUNCTION_TOKEN,\n IDENT_TOKEN,\n COLUMN_TOKEN,\n URL_TOKEN,\n BAD_URL_TOKEN,\n CDC_TOKEN,\n CDO_TOKEN,\n COLON_TOKEN,\n SEMICOLON_TOKEN,\n LEFT_SQUARE_BRACKET_TOKEN,\n RIGHT_SQUARE_BRACKET_TOKEN,\n UNICODE_RANGE_TOKEN,\n WHITESPACE_TOKEN,\n EOF_TOKEN\n}\n\ninterface IToken {\n type: TokenType;\n}\n\nexport interface Token extends IToken {\n type:\n | TokenType.BAD_URL_TOKEN\n | TokenType.BAD_STRING_TOKEN\n | TokenType.LEFT_PARENTHESIS_TOKEN\n | TokenType.RIGHT_PARENTHESIS_TOKEN\n | TokenType.COMMA_TOKEN\n | TokenType.SUBSTRING_MATCH_TOKEN\n | TokenType.PREFIX_MATCH_TOKEN\n | TokenType.SUFFIX_MATCH_TOKEN\n | TokenType.COLON_TOKEN\n | TokenType.SEMICOLON_TOKEN\n | TokenType.LEFT_SQUARE_BRACKET_TOKEN\n | TokenType.RIGHT_SQUARE_BRACKET_TOKEN\n | TokenType.LEFT_CURLY_BRACKET_TOKEN\n | TokenType.RIGHT_CURLY_BRACKET_TOKEN\n | TokenType.DASH_MATCH_TOKEN\n | TokenType.INCLUDE_MATCH_TOKEN\n | TokenType.COLUMN_TOKEN\n | TokenType.WHITESPACE_TOKEN\n | TokenType.CDC_TOKEN\n | TokenType.CDO_TOKEN\n | TokenType.EOF_TOKEN;\n}\n\nexport interface StringValueToken extends IToken {\n type:\n | TokenType.STRING_TOKEN\n | TokenType.DELIM_TOKEN\n | TokenType.FUNCTION_TOKEN\n | TokenType.IDENT_TOKEN\n | TokenType.URL_TOKEN\n | TokenType.AT_KEYWORD_TOKEN;\n value: string;\n}\n\nexport interface HashToken extends IToken {\n type: TokenType.HASH_TOKEN;\n flags: number;\n value: string;\n}\n\nexport interface NumberValueToken extends IToken {\n type: TokenType.PERCENTAGE_TOKEN | TokenType.NUMBER_TOKEN;\n flags: number;\n number: number;\n}\n\nexport interface DimensionToken extends IToken {\n type: TokenType.DIMENSION_TOKEN;\n flags: number;\n unit: string;\n number: number;\n}\n\nexport interface UnicodeRangeToken extends IToken {\n type: TokenType.UNICODE_RANGE_TOKEN;\n start: number;\n end: number;\n}\n\nexport type CSSToken = Token | StringValueToken | NumberValueToken | DimensionToken | UnicodeRangeToken | HashToken;\n\nexport const FLAG_UNRESTRICTED = 1 << 0;\nexport const FLAG_ID = 1 << 1;\nexport const FLAG_INTEGER = 1 << 2;\nexport const FLAG_NUMBER = 1 << 3;\n\nconst LINE_FEED = 0x000a;\nconst SOLIDUS = 0x002f;\nconst REVERSE_SOLIDUS = 0x005c;\nconst CHARACTER_TABULATION = 0x0009;\nconst SPACE = 0x0020;\nconst QUOTATION_MARK = 0x0022;\nconst EQUALS_SIGN = 0x003d;\nconst NUMBER_SIGN = 0x0023;\nconst DOLLAR_SIGN = 0x0024;\nconst PERCENTAGE_SIGN = 0x0025;\nconst APOSTROPHE = 0x0027;\nconst LEFT_PARENTHESIS = 0x0028;\nconst RIGHT_PARENTHESIS = 0x0029;\nconst LOW_LINE = 0x005f;\nconst HYPHEN_MINUS = 0x002d;\nconst EXCLAMATION_MARK = 0x0021;\nconst LESS_THAN_SIGN = 0x003c;\nconst GREATER_THAN_SIGN = 0x003e;\nconst COMMERCIAL_AT = 0x0040;\nconst LEFT_SQUARE_BRACKET = 0x005b;\nconst RIGHT_SQUARE_BRACKET = 0x005d;\nconst CIRCUMFLEX_ACCENT = 0x003d;\nconst LEFT_CURLY_BRACKET = 0x007b;\nconst QUESTION_MARK = 0x003f;\nconst RIGHT_CURLY_BRACKET = 0x007d;\nconst VERTICAL_LINE = 0x007c;\nconst TILDE = 0x007e;\nconst CONTROL = 0x0080;\nconst REPLACEMENT_CHARACTER = 0xfffd;\nconst ASTERISK = 0x002a;\nconst PLUS_SIGN = 0x002b;\nconst COMMA = 0x002c;\nconst COLON = 0x003a;\nconst SEMICOLON = 0x003b;\nconst FULL_STOP = 0x002e;\nconst NULL = 0x0000;\nconst BACKSPACE = 0x0008;\nconst LINE_TABULATION = 0x000b;\nconst SHIFT_OUT = 0x000e;\nconst INFORMATION_SEPARATOR_ONE = 0x001f;\nconst DELETE = 0x007f;\nconst EOF = -1;\nconst ZERO = 0x0030;\nconst a = 0x0061;\nconst e = 0x0065;\nconst f = 0x0066;\nconst u = 0x0075;\nconst z = 0x007a;\nconst A = 0x0041;\nconst E = 0x0045;\nconst F = 0x0046;\nconst U = 0x0055;\nconst Z = 0x005a;\n\nconst isDigit = (codePoint: number) => codePoint >= ZERO && codePoint <= 0x0039;\nconst isSurrogateCodePoint = (codePoint: number) => codePoint >= 0xd800 && codePoint <= 0xdfff;\nconst isHex = (codePoint: number) =>\n isDigit(codePoint) || (codePoint >= A && codePoint <= F) || (codePoint >= a && codePoint <= f);\nconst isLowerCaseLetter = (codePoint: number) => codePoint >= a && codePoint <= z;\nconst isUpperCaseLetter = (codePoint: number) => codePoint >= A && codePoint <= Z;\nconst isLetter = (codePoint: number) => isLowerCaseLetter(codePoint) || isUpperCaseLetter(codePoint);\nconst isNonASCIICodePoint = (codePoint: number) => codePoint >= CONTROL;\nconst isWhiteSpace = (codePoint: number): boolean =>\n codePoint === LINE_FEED || codePoint === CHARACTER_TABULATION || codePoint === SPACE;\nconst isNameStartCodePoint = (codePoint: number): boolean =>\n isLetter(codePoint) || isNonASCIICodePoint(codePoint) || codePoint === LOW_LINE;\nconst isNameCodePoint = (codePoint: number): boolean =>\n isNameStartCodePoint(codePoint) || isDigit(codePoint) || codePoint === HYPHEN_MINUS;\nconst isNonPrintableCodePoint = (codePoint: number): boolean => {\n return (\n (codePoint >= NULL && codePoint <= BACKSPACE) ||\n codePoint === LINE_TABULATION ||\n (codePoint >= SHIFT_OUT && codePoint <= INFORMATION_SEPARATOR_ONE) ||\n codePoint === DELETE\n );\n};\nconst isValidEscape = (c1: number, c2: number): boolean => {\n if (c1 !== REVERSE_SOLIDUS) {\n return false;\n }\n\n return c2 !== LINE_FEED;\n};\nconst isIdentifierStart = (c1: number, c2: number, c3: number): boolean => {\n if (c1 === HYPHEN_MINUS) {\n return isNameStartCodePoint(c2) || isValidEscape(c2, c3);\n } else if (isNameStartCodePoint(c1)) {\n return true;\n } else if (c1 === REVERSE_SOLIDUS && isValidEscape(c1, c2)) {\n return true;\n }\n return false;\n};\n\nconst isNumberStart = (c1: number, c2: number, c3: number): boolean => {\n if (c1 === PLUS_SIGN || c1 === HYPHEN_MINUS) {\n if (isDigit(c2)) {\n return true;\n }\n\n return c2 === FULL_STOP && isDigit(c3);\n }\n\n if (c1 === FULL_STOP) {\n return isDigit(c2);\n }\n\n return isDigit(c1);\n};\n\nconst stringToNumber = (codePoints: number[]): number => {\n let c = 0;\n let sign = 1;\n if (codePoints[c] === PLUS_SIGN || codePoints[c] === HYPHEN_MINUS) {\n if (codePoints[c] === HYPHEN_MINUS) {\n sign = -1;\n }\n c++;\n }\n\n const integers = [];\n\n while (isDigit(codePoints[c])) {\n integers.push(codePoints[c++]);\n }\n\n const int = integers.length ? parseInt(fromCodePoint(...integers), 10) : 0;\n\n if (codePoints[c] === FULL_STOP) {\n c++;\n }\n\n const fraction = [];\n while (isDigit(codePoints[c])) {\n fraction.push(codePoints[c++]);\n }\n\n const fracd = fraction.length;\n const frac = fracd ? parseInt(fromCodePoint(...fraction), 10) : 0;\n\n if (codePoints[c] === E || codePoints[c] === e) {\n c++;\n }\n\n let expsign = 1;\n\n if (codePoints[c] === PLUS_SIGN || codePoints[c] === HYPHEN_MINUS) {\n if (codePoints[c] === HYPHEN_MINUS) {\n expsign = -1;\n }\n c++;\n }\n\n const exponent = [];\n\n while (isDigit(codePoints[c])) {\n exponent.push(codePoints[c++]);\n }\n\n const exp = exponent.length ? parseInt(fromCodePoint(...exponent), 10) : 0;\n\n return sign * (int + frac * Math.pow(10, -fracd)) * Math.pow(10, expsign * exp);\n};\n\nconst LEFT_PARENTHESIS_TOKEN: Token = {\n type: TokenType.LEFT_PARENTHESIS_TOKEN\n};\nconst RIGHT_PARENTHESIS_TOKEN: Token = {\n type: TokenType.RIGHT_PARENTHESIS_TOKEN\n};\nconst COMMA_TOKEN: Token = {type: TokenType.COMMA_TOKEN};\nconst SUFFIX_MATCH_TOKEN: Token = {type: TokenType.SUFFIX_MATCH_TOKEN};\nconst PREFIX_MATCH_TOKEN: Token = {type: TokenType.PREFIX_MATCH_TOKEN};\nconst COLUMN_TOKEN: Token = {type: TokenType.COLUMN_TOKEN};\nconst DASH_MATCH_TOKEN: Token = {type: TokenType.DASH_MATCH_TOKEN};\nconst INCLUDE_MATCH_TOKEN: Token = {type: TokenType.INCLUDE_MATCH_TOKEN};\nconst LEFT_CURLY_BRACKET_TOKEN: Token = {\n type: TokenType.LEFT_CURLY_BRACKET_TOKEN\n};\nconst RIGHT_CURLY_BRACKET_TOKEN: Token = {\n type: TokenType.RIGHT_CURLY_BRACKET_TOKEN\n};\nconst SUBSTRING_MATCH_TOKEN: Token = {type: TokenType.SUBSTRING_MATCH_TOKEN};\nconst BAD_URL_TOKEN: Token = {type: TokenType.BAD_URL_TOKEN};\nconst BAD_STRING_TOKEN: Token = {type: TokenType.BAD_STRING_TOKEN};\nconst CDO_TOKEN: Token = {type: TokenType.CDO_TOKEN};\nconst CDC_TOKEN: Token = {type: TokenType.CDC_TOKEN};\nconst COLON_TOKEN: Token = {type: TokenType.COLON_TOKEN};\nconst SEMICOLON_TOKEN: Token = {type: TokenType.SEMICOLON_TOKEN};\nconst LEFT_SQUARE_BRACKET_TOKEN: Token = {\n type: TokenType.LEFT_SQUARE_BRACKET_TOKEN\n};\nconst RIGHT_SQUARE_BRACKET_TOKEN: Token = {\n type: TokenType.RIGHT_SQUARE_BRACKET_TOKEN\n};\nconst WHITESPACE_TOKEN: Token = {type: TokenType.WHITESPACE_TOKEN};\nexport const EOF_TOKEN: Token = {type: TokenType.EOF_TOKEN};\n\nexport class Tokenizer {\n private _value: number[];\n\n constructor() {\n this._value = [];\n }\n\n write(chunk: string): void {\n this._value = this._value.concat(toCodePoints(chunk));\n }\n\n read(): CSSToken[] {\n const tokens = [];\n let token = this.consumeToken();\n while (token !== EOF_TOKEN) {\n tokens.push(token);\n token = this.consumeToken();\n }\n return tokens;\n }\n\n private consumeToken(): CSSToken {\n const codePoint = this.consumeCodePoint();\n\n switch (codePoint) {\n case QUOTATION_MARK:\n return this.consumeStringToken(QUOTATION_MARK);\n case NUMBER_SIGN:\n const c1 = this.peekCodePoint(0);\n const c2 = this.peekCodePoint(1);\n const c3 = this.peekCodePoint(2);\n if (isNameCodePoint(c1) || isValidEscape(c2, c3)) {\n const flags = isIdentifierStart(c1, c2, c3) ? FLAG_ID : FLAG_UNRESTRICTED;\n const value = this.consumeName();\n\n return {type: TokenType.HASH_TOKEN, value, flags};\n }\n break;\n case DOLLAR_SIGN:\n if (this.peekCodePoint(0) === EQUALS_SIGN) {\n this.consumeCodePoint();\n return SUFFIX_MATCH_TOKEN;\n }\n break;\n case APOSTROPHE:\n return this.consumeStringToken(APOSTROPHE);\n case LEFT_PARENTHESIS:\n return LEFT_PARENTHESIS_TOKEN;\n case RIGHT_PARENTHESIS:\n return RIGHT_PARENTHESIS_TOKEN;\n case ASTERISK:\n if (this.peekCodePoint(0) === EQUALS_SIGN) {\n this.consumeCodePoint();\n return SUBSTRING_MATCH_TOKEN;\n }\n break;\n case PLUS_SIGN:\n if (isNumberStart(codePoint, this.peekCodePoint(0), this.peekCodePoint(1))) {\n this.reconsumeCodePoint(codePoint);\n return this.consumeNumericToken();\n }\n break;\n case COMMA:\n return COMMA_TOKEN;\n case HYPHEN_MINUS:\n const e1 = codePoint;\n const e2 = this.peekCodePoint(0);\n const e3 = this.peekCodePoint(1);\n\n if (isNumberStart(e1, e2, e3)) {\n this.reconsumeCodePoint(codePoint);\n return this.consumeNumericToken();\n }\n\n if (isIdentifierStart(e1, e2, e3)) {\n this.reconsumeCodePoint(codePoint);\n return this.consumeIdentLikeToken();\n }\n\n if (e2 === HYPHEN_MINUS && e3 === GREATER_THAN_SIGN) {\n this.consumeCodePoint();\n this.consumeCodePoint();\n return CDC_TOKEN;\n }\n break;\n\n case FULL_STOP:\n if (isNumberStart(codePoint, this.peekCodePoint(0), this.peekCodePoint(1))) {\n this.reconsumeCodePoint(codePoint);\n return this.consumeNumericToken();\n }\n break;\n case SOLIDUS:\n if (this.peekCodePoint(0) === ASTERISK) {\n this.consumeCodePoint();\n while (true) {\n let c = this.consumeCodePoint();\n if (c === ASTERISK) {\n c = this.consumeCodePoint();\n if (c === SOLIDUS) {\n return this.consumeToken();\n }\n }\n if (c === EOF) {\n return this.consumeToken();\n }\n }\n }\n break;\n case COLON:\n return COLON_TOKEN;\n case SEMICOLON:\n return SEMICOLON_TOKEN;\n case LESS_THAN_SIGN:\n if (\n this.peekCodePoint(0) === EXCLAMATION_MARK &&\n this.peekCodePoint(1) === HYPHEN_MINUS &&\n this.peekCodePoint(2) === HYPHEN_MINUS\n ) {\n this.consumeCodePoint();\n this.consumeCodePoint();\n return CDO_TOKEN;\n }\n break;\n case COMMERCIAL_AT:\n const a1 = this.peekCodePoint(0);\n const a2 = this.peekCodePoint(1);\n const a3 = this.peekCodePoint(2);\n if (isIdentifierStart(a1, a2, a3)) {\n const value = this.consumeName();\n return {type: TokenType.AT_KEYWORD_TOKEN, value};\n }\n break;\n case LEFT_SQUARE_BRACKET:\n return LEFT_SQUARE_BRACKET_TOKEN;\n case REVERSE_SOLIDUS:\n if (isValidEscape(codePoint, this.peekCodePoint(0))) {\n this.reconsumeCodePoint(codePoint);\n return this.consumeIdentLikeToken();\n }\n break;\n case RIGHT_SQUARE_BRACKET:\n return RIGHT_SQUARE_BRACKET_TOKEN;\n case CIRCUMFLEX_ACCENT:\n if (this.peekCodePoint(0) === EQUALS_SIGN) {\n this.consumeCodePoint();\n return PREFIX_MATCH_TOKEN;\n }\n break;\n case LEFT_CURLY_BRACKET:\n return LEFT_CURLY_BRACKET_TOKEN;\n case RIGHT_CURLY_BRACKET:\n return RIGHT_CURLY_BRACKET_TOKEN;\n case u:\n case U:\n const u1 = this.peekCodePoint(0);\n const u2 = this.peekCodePoint(1);\n if (u1 === PLUS_SIGN && (isHex(u2) || u2 === QUESTION_MARK)) {\n this.consumeCodePoint();\n this.consumeUnicodeRangeToken();\n }\n this.reconsumeCodePoint(codePoint);\n return this.consumeIdentLikeToken();\n case VERTICAL_LINE:\n if (this.peekCodePoint(0) === EQUALS_SIGN) {\n this.consumeCodePoint();\n return DASH_MATCH_TOKEN;\n }\n if (this.peekCodePoint(0) === VERTICAL_LINE) {\n this.consumeCodePoint();\n return COLUMN_TOKEN;\n }\n break;\n case TILDE:\n if (this.peekCodePoint(0) === EQUALS_SIGN) {\n this.consumeCodePoint();\n return INCLUDE_MATCH_TOKEN;\n }\n break;\n case EOF:\n return EOF_TOKEN;\n }\n\n if (isWhiteSpace(codePoint)) {\n this.consumeWhiteSpace();\n return WHITESPACE_TOKEN;\n }\n\n if (isDigit(codePoint)) {\n this.reconsumeCodePoint(codePoint);\n return this.consumeNumericToken();\n }\n\n if (isNameStartCodePoint(codePoint)) {\n this.reconsumeCodePoint(codePoint);\n return this.consumeIdentLikeToken();\n }\n\n return {type: TokenType.DELIM_TOKEN, value: fromCodePoint(codePoint)};\n }\n\n private consumeCodePoint(): number {\n const value = this._value.shift();\n\n return typeof value === 'undefined' ? -1 : value;\n }\n\n private reconsumeCodePoint(codePoint: number) {\n this._value.unshift(codePoint);\n }\n\n private peekCodePoint(delta: number): number {\n if (delta >= this._value.length) {\n return -1;\n }\n\n return this._value[delta];\n }\n\n private consumeUnicodeRangeToken(): UnicodeRangeToken {\n const digits = [];\n let codePoint = this.consumeCodePoint();\n while (isHex(codePoint) && digits.length < 6) {\n digits.push(codePoint);\n codePoint = this.consumeCodePoint();\n }\n let questionMarks = false;\n while (codePoint === QUESTION_MARK && digits.length < 6) {\n digits.push(codePoint);\n codePoint = this.consumeCodePoint();\n questionMarks = true;\n }\n\n if (questionMarks) {\n const start = parseInt(\n fromCodePoint(...digits.map((digit) => (digit === QUESTION_MARK ? ZERO : digit))),\n 16\n );\n const end = parseInt(fromCodePoint(...digits.map((digit) => (digit === QUESTION_MARK ? F : digit))), 16);\n return {type: TokenType.UNICODE_RANGE_TOKEN, start, end};\n }\n\n const start = parseInt(fromCodePoint(...digits), 16);\n if (this.peekCodePoint(0) === HYPHEN_MINUS && isHex(this.peekCodePoint(1))) {\n this.consumeCodePoint();\n codePoint = this.consumeCodePoint();\n const endDigits = [];\n while (isHex(codePoint) && endDigits.length < 6) {\n endDigits.push(codePoint);\n codePoint = this.consumeCodePoint();\n }\n const end = parseInt(fromCodePoint(...endDigits), 16);\n\n return {type: TokenType.UNICODE_RANGE_TOKEN, start, end};\n } else {\n return {type: TokenType.UNICODE_RANGE_TOKEN, start, end: start};\n }\n }\n\n private consumeIdentLikeToken(): StringValueToken | Token {\n const value = this.consumeName();\n if (value.toLowerCase() === 'url' && this.peekCodePoint(0) === LEFT_PARENTHESIS) {\n this.consumeCodePoint();\n return this.consumeUrlToken();\n } else if (this.peekCodePoint(0) === LEFT_PARENTHESIS) {\n this.consumeCodePoint();\n return {type: TokenType.FUNCTION_TOKEN, value};\n }\n\n return {type: TokenType.IDENT_TOKEN, value};\n }\n\n private consumeUrlToken(): StringValueToken | Token {\n const value = [];\n this.consumeWhiteSpace();\n\n if (this.peekCodePoint(0) === EOF) {\n return {type: TokenType.URL_TOKEN, value: ''};\n }\n\n const next = this.peekCodePoint(0);\n if (next === APOSTROPHE || next === QUOTATION_MARK) {\n const stringToken = this.consumeStringToken(this.consumeCodePoint());\n if (stringToken.type === TokenType.STRING_TOKEN) {\n this.consumeWhiteSpace();\n\n if (this.peekCodePoint(0) === EOF || this.peekCodePoint(0) === RIGHT_PARENTHESIS) {\n this.consumeCodePoint();\n return {type: TokenType.URL_TOKEN, value: stringToken.value};\n }\n }\n\n this.consumeBadUrlRemnants();\n return BAD_URL_TOKEN;\n }\n\n while (true) {\n const codePoint = this.consumeCodePoint();\n if (codePoint === EOF || codePoint === RIGHT_PARENTHESIS) {\n return {type: TokenType.URL_TOKEN, value: fromCodePoint(...value)};\n } else if (isWhiteSpace(codePoint)) {\n this.consumeWhiteSpace();\n if (this.peekCodePoint(0) === EOF || this.peekCodePoint(0) === RIGHT_PARENTHESIS) {\n this.consumeCodePoint();\n return {type: TokenType.URL_TOKEN, value: fromCodePoint(...value)};\n }\n this.consumeBadUrlRemnants();\n return BAD_URL_TOKEN;\n } else if (\n codePoint === QUOTATION_MARK ||\n codePoint === APOSTROPHE ||\n codePoint === LEFT_PARENTHESIS ||\n isNonPrintableCodePoint(codePoint)\n ) {\n this.consumeBadUrlRemnants();\n return BAD_URL_TOKEN;\n } else if (codePoint === REVERSE_SOLIDUS) {\n if (isValidEscape(codePoint, this.peekCodePoint(0))) {\n value.push(this.consumeEscapedCodePoint());\n } else {\n this.consumeBadUrlRemnants();\n return BAD_URL_TOKEN;\n }\n } else {\n value.push(codePoint);\n }\n }\n }\n\n private consumeWhiteSpace(): void {\n while (isWhiteSpace(this.peekCodePoint(0))) {\n this.consumeCodePoint();\n }\n }\n\n private consumeBadUrlRemnants(): void {\n while (true) {\n const codePoint = this.consumeCodePoint();\n if (codePoint === RIGHT_PARENTHESIS || codePoint === EOF) {\n return;\n }\n\n if (isValidEscape(codePoint, this.peekCodePoint(0))) {\n this.consumeEscapedCodePoint();\n }\n }\n }\n\n private consumeStringSlice(count: number): string {\n const SLICE_STACK_SIZE = 50000;\n let value = '';\n while (count > 0) {\n const amount = Math.min(SLICE_STACK_SIZE, count);\n value += fromCodePoint(...this._value.splice(0, amount));\n count -= amount;\n }\n this._value.shift();\n\n return value;\n }\n\n private consumeStringToken(endingCodePoint: number): StringValueToken | Token {\n let value = '';\n let i = 0;\n\n do {\n const codePoint = this._value[i];\n if (codePoint === EOF || codePoint === undefined || codePoint === endingCodePoint) {\n value += this.consumeStringSlice(i);\n return {type: TokenType.STRING_TOKEN, value};\n }\n\n if (codePoint === LINE_FEED) {\n this._value.splice(0, i);\n return BAD_STRING_TOKEN;\n }\n\n if (codePoint === REVERSE_SOLIDUS) {\n const next = this._value[i + 1];\n if (next !== EOF && next !== undefined) {\n if (next === LINE_FEED) {\n value += this.consumeStringSlice(i);\n i = -1;\n this._value.shift();\n } else if (isValidEscape(codePoint, next)) {\n value += this.consumeStringSlice(i);\n value += fromCodePoint(this.consumeEscapedCodePoint());\n i = -1;\n }\n }\n }\n\n i++;\n } while (true);\n }\n\n private consumeNumber() {\n const repr = [];\n let type = FLAG_INTEGER;\n let c1 = this.peekCodePoint(0);\n if (c1 === PLUS_SIGN || c1 === HYPHEN_MINUS) {\n repr.push(this.consumeCodePoint());\n }\n\n while (isDigit(this.peekCodePoint(0))) {\n repr.push(this.consumeCodePoint());\n }\n c1 = this.peekCodePoint(0);\n let c2 = this.peekCodePoint(1);\n if (c1 === FULL_STOP && isDigit(c2)) {\n repr.push(this.consumeCodePoint(), this.consumeCodePoint());\n type = FLAG_NUMBER;\n while (isDigit(this.peekCodePoint(0))) {\n repr.push(this.consumeCodePoint());\n }\n }\n\n c1 = this.peekCodePoint(0);\n c2 = this.peekCodePoint(1);\n const c3 = this.peekCodePoint(2);\n if ((c1 === E || c1 === e) && (((c2 === PLUS_SIGN || c2 === HYPHEN_MINUS) && isDigit(c3)) || isDigit(c2))) {\n repr.push(this.consumeCodePoint(), this.consumeCodePoint());\n type = FLAG_NUMBER;\n while (isDigit(this.peekCodePoint(0))) {\n repr.push(this.consumeCodePoint());\n }\n }\n\n return [stringToNumber(repr), type];\n }\n\n private consumeNumericToken(): NumberValueToken | DimensionToken {\n const [number, flags] = this.consumeNumber();\n const c1 = this.peekCodePoint(0);\n const c2 = this.peekCodePoint(1);\n const c3 = this.peekCodePoint(2);\n\n if (isIdentifierStart(c1, c2, c3)) {\n const unit = this.consumeName();\n return {type: TokenType.DIMENSION_TOKEN, number, flags, unit};\n }\n\n if (c1 === PERCENTAGE_SIGN) {\n this.consumeCodePoint();\n return {type: TokenType.PERCENTAGE_TOKEN, number, flags};\n }\n\n return {type: TokenType.NUMBER_TOKEN, number, flags};\n }\n\n private consumeEscapedCodePoint(): number {\n const codePoint = this.consumeCodePoint();\n\n if (isHex(codePoint)) {\n let hex = fromCodePoint(codePoint);\n while (isHex(this.peekCodePoint(0)) && hex.length < 6) {\n hex += fromCodePoint(this.consumeCodePoint());\n }\n\n if (isWhiteSpace(this.peekCodePoint(0))) {\n this.consumeCodePoint();\n }\n\n const hexCodePoint = parseInt(hex, 16);\n\n if (hexCodePoint === 0 || isSurrogateCodePoint(hexCodePoint) || hexCodePoint > 0x10ffff) {\n return REPLACEMENT_CHARACTER;\n }\n\n return hexCodePoint;\n }\n\n if (codePoint === EOF) {\n return REPLACEMENT_CHARACTER;\n }\n\n return codePoint;\n }\n\n private consumeName(): string {\n let result = '';\n while (true) {\n const codePoint = this.consumeCodePoint();\n if (isNameCodePoint(codePoint)) {\n result += fromCodePoint(codePoint);\n } else if (isValidEscape(codePoint, this.peekCodePoint(0))) {\n result += fromCodePoint(this.consumeEscapedCodePoint());\n } else {\n this.reconsumeCodePoint(codePoint);\n return result;\n }\n }\n }\n}\n","import {\n CSSToken,\n DimensionToken,\n EOF_TOKEN,\n NumberValueToken,\n StringValueToken,\n Tokenizer,\n TokenType\n} from './tokenizer';\n\nexport type CSSBlockType =\n | TokenType.LEFT_PARENTHESIS_TOKEN\n | TokenType.LEFT_SQUARE_BRACKET_TOKEN\n | TokenType.LEFT_CURLY_BRACKET_TOKEN;\n\nexport interface CSSBlock {\n type: CSSBlockType;\n values: CSSValue[];\n}\n\nexport interface CSSFunction {\n type: TokenType.FUNCTION;\n name: string;\n values: CSSValue[];\n}\n\nexport type CSSValue = CSSFunction | CSSToken | CSSBlock;\n\nexport class Parser {\n private _tokens: CSSToken[];\n\n constructor(tokens: CSSToken[]) {\n this._tokens = tokens;\n }\n\n static create(value: string): Parser {\n const tokenizer = new Tokenizer();\n tokenizer.write(value);\n return new Parser(tokenizer.read());\n }\n\n static parseValue(value: string): CSSValue {\n return Parser.create(value).parseComponentValue();\n }\n\n static parseValues(value: string): CSSValue[] {\n return Parser.create(value).parseComponentValues();\n }\n\n parseComponentValue(): CSSValue {\n let token = this.consumeToken();\n while (token.type === TokenType.WHITESPACE_TOKEN) {\n token = this.consumeToken();\n }\n\n if (token.type === TokenType.EOF_TOKEN) {\n throw new SyntaxError(`Error parsing CSS component value, unexpected EOF`);\n }\n\n this.reconsumeToken(token);\n const value = this.consumeComponentValue();\n\n do {\n token = this.consumeToken();\n } while (token.type === TokenType.WHITESPACE_TOKEN);\n\n if (token.type === TokenType.EOF_TOKEN) {\n return value;\n }\n\n throw new SyntaxError(`Error parsing CSS component value, multiple values found when expecting only one`);\n }\n\n parseComponentValues(): CSSValue[] {\n const values = [];\n while (true) {\n const value = this.consumeComponentValue();\n if (value.type === TokenType.EOF_TOKEN) {\n return values;\n }\n values.push(value);\n values.push();\n }\n }\n\n private consumeComponentValue(): CSSValue {\n const token = this.consumeToken();\n\n switch (token.type) {\n case TokenType.LEFT_CURLY_BRACKET_TOKEN:\n case TokenType.LEFT_SQUARE_BRACKET_TOKEN:\n case TokenType.LEFT_PARENTHESIS_TOKEN:\n return this.consumeSimpleBlock(token.type);\n case TokenType.FUNCTION_TOKEN:\n return this.consumeFunction(token);\n }\n\n return token;\n }\n\n private consumeSimpleBlock(type: CSSBlockType): CSSBlock {\n const block: CSSBlock = {type, values: []};\n\n let token = this.consumeToken();\n while (true) {\n if (token.type === TokenType.EOF_TOKEN || isEndingTokenFor(token, type)) {\n return block;\n }\n\n this.reconsumeToken(token);\n block.values.push(this.consumeComponentValue());\n token = this.consumeToken();\n }\n }\n\n private consumeFunction(functionToken: StringValueToken): CSSFunction {\n const cssFunction: CSSFunction = {\n name: functionToken.value,\n values: [],\n type: TokenType.FUNCTION\n };\n\n while (true) {\n const token = this.consumeToken();\n if (token.type === TokenType.EOF_TOKEN || token.type === TokenType.RIGHT_PARENTHESIS_TOKEN) {\n return cssFunction;\n }\n\n this.reconsumeToken(token);\n cssFunction.values.push(this.consumeComponentValue());\n }\n }\n\n private consumeToken(): CSSToken {\n const token = this._tokens.shift();\n return typeof token === 'undefined' ? EOF_TOKEN : token;\n }\n\n private reconsumeToken(token: CSSToken): void {\n this._tokens.unshift(token);\n }\n}\n\nexport const isDimensionToken = (token: CSSValue): token is DimensionToken => token.type === TokenType.DIMENSION_TOKEN;\nexport const isNumberToken = (token: CSSValue): token is NumberValueToken => token.type === TokenType.NUMBER_TOKEN;\nexport const isIdentToken = (token: CSSValue): token is StringValueToken => token.type === TokenType.IDENT_TOKEN;\nexport const isStringToken = (token: CSSValue): token is StringValueToken => token.type === TokenType.STRING_TOKEN;\nexport const isIdentWithValue = (token: CSSValue, value: string): boolean =>\n isIdentToken(token) && token.value === value;\n\nexport const nonWhiteSpace = (token: CSSValue): boolean => token.type !== TokenType.WHITESPACE_TOKEN;\nexport const nonFunctionArgSeparator = (token: CSSValue): boolean =>\n token.type !== TokenType.WHITESPACE_TOKEN && token.type !== TokenType.COMMA_TOKEN;\n\nexport const parseFunctionArgs = (tokens: CSSValue[]): CSSValue[][] => {\n const args: CSSValue[][] = [];\n let arg: CSSValue[] = [];\n tokens.forEach((token) => {\n if (token.type === TokenType.COMMA_TOKEN) {\n if (arg.length === 0) {\n throw new Error(`Error parsing function args, zero tokens for arg`);\n }\n args.push(arg);\n arg = [];\n return;\n }\n\n if (token.type !== TokenType.WHITESPACE_TOKEN) {\n arg.push(token);\n }\n });\n if (arg.length) {\n args.push(arg);\n }\n\n return args;\n};\n\nconst isEndingTokenFor = (token: CSSToken, type: CSSBlockType): boolean => {\n if (type === TokenType.LEFT_CURLY_BRACKET_TOKEN && token.type === TokenType.RIGHT_CURLY_BRACKET_TOKEN) {\n return true;\n }\n if (type === TokenType.LEFT_SQUARE_BRACKET_TOKEN && token.type === TokenType.RIGHT_SQUARE_BRACKET_TOKEN) {\n return true;\n }\n\n return type === TokenType.LEFT_PARENTHESIS_TOKEN && token.type === TokenType.RIGHT_PARENTHESIS_TOKEN;\n};\n","import {CSSValue} from '../syntax/parser';\nimport {DimensionToken, NumberValueToken, TokenType} from '../syntax/tokenizer';\n\nexport type Length = DimensionToken | NumberValueToken;\n\nexport const isLength = (token: CSSValue): token is Length =>\n token.type === TokenType.NUMBER_TOKEN || token.type === TokenType.DIMENSION_TOKEN;\n","import {DimensionToken, FLAG_INTEGER, NumberValueToken, TokenType} from '../syntax/tokenizer';\nimport {CSSValue, isDimensionToken} from '../syntax/parser';\nimport {isLength} from './length';\nexport type LengthPercentage = DimensionToken | NumberValueToken;\nexport type LengthPercentageTuple = [LengthPercentage] | [LengthPercentage, LengthPercentage];\n\nexport const isLengthPercentage = (token: CSSValue): token is LengthPercentage =>\n token.type === TokenType.PERCENTAGE_TOKEN || isLength(token);\nexport const parseLengthPercentageTuple = (tokens: LengthPercentage[]): LengthPercentageTuple =>\n tokens.length > 1 ? [tokens[0], tokens[1]] : [tokens[0]];\nexport const ZERO_LENGTH: NumberValueToken = {\n type: TokenType.NUMBER_TOKEN,\n number: 0,\n flags: FLAG_INTEGER\n};\n\nexport const FIFTY_PERCENT: NumberValueToken = {\n type: TokenType.PERCENTAGE_TOKEN,\n number: 50,\n flags: FLAG_INTEGER\n};\n\nexport const HUNDRED_PERCENT: NumberValueToken = {\n type: TokenType.PERCENTAGE_TOKEN,\n number: 100,\n flags: FLAG_INTEGER\n};\n\nexport const getAbsoluteValueForTuple = (\n tuple: LengthPercentageTuple,\n width: number,\n height: number\n): [number, number] => {\n const [x, y] = tuple;\n return [getAbsoluteValue(x, width), getAbsoluteValue(typeof y !== 'undefined' ? y : x, height)];\n};\nexport const getAbsoluteValue = (token: LengthPercentage, parent: number): number => {\n if (token.type === TokenType.PERCENTAGE_TOKEN) {\n return (token.number / 100) * parent;\n }\n\n if (isDimensionToken(token)) {\n switch (token.unit) {\n case 'rem':\n case 'em':\n return 16 * token.number; // TODO use correct font-size\n case 'px':\n default:\n return token.number;\n }\n }\n\n return token.number;\n};\n","import {CSSValue, isIdentToken} from '../syntax/parser';\nimport {TokenType} from '../syntax/tokenizer';\nimport {ITypeDescriptor} from '../ITypeDescriptor';\nimport {HUNDRED_PERCENT, ZERO_LENGTH} from './length-percentage';\nimport {GradientCorner} from './image';\nimport {Context} from '../../core/context';\n\nconst DEG = 'deg';\nconst GRAD = 'grad';\nconst RAD = 'rad';\nconst TURN = 'turn';\n\nexport const angle: ITypeDescriptor = {\n name: 'angle',\n parse: (_context: Context, value: CSSValue): number => {\n if (value.type === TokenType.DIMENSION_TOKEN) {\n switch (value.unit) {\n case DEG:\n return (Math.PI * value.number) / 180;\n case GRAD:\n return (Math.PI / 200) * value.number;\n case RAD:\n return value.number;\n case TURN:\n return Math.PI * 2 * value.number;\n }\n }\n\n throw new Error(`Unsupported angle type`);\n }\n};\n\nexport const isAngle = (value: CSSValue): boolean => {\n if (value.type === TokenType.DIMENSION_TOKEN) {\n if (value.unit === DEG || value.unit === GRAD || value.unit === RAD || value.unit === TURN) {\n return true;\n }\n }\n return false;\n};\n\nexport const parseNamedSide = (tokens: CSSValue[]): number | GradientCorner => {\n const sideOrCorner = tokens\n .filter(isIdentToken)\n .map((ident) => ident.value)\n .join(' ');\n\n switch (sideOrCorner) {\n case 'to bottom right':\n case 'to right bottom':\n case 'left top':\n case 'top left':\n return [ZERO_LENGTH, ZERO_LENGTH];\n case 'to top':\n case 'bottom':\n return deg(0);\n case 'to bottom left':\n case 'to left bottom':\n case 'right top':\n case 'top right':\n return [ZERO_LENGTH, HUNDRED_PERCENT];\n case 'to right':\n case 'left':\n return deg(90);\n case 'to top left':\n case 'to left top':\n case 'right bottom':\n case 'bottom right':\n return [HUNDRED_PERCENT, HUNDRED_PERCENT];\n case 'to bottom':\n case 'top':\n return deg(180);\n case 'to top right':\n case 'to right top':\n case 'left bottom':\n case 'bottom left':\n return [HUNDRED_PERCENT, ZERO_LENGTH];\n case 'to left':\n case 'right':\n return deg(270);\n }\n\n return 0;\n};\n\nexport const deg = (deg: number): number => (Math.PI * deg) / 180;\n","import {CSSValue, nonFunctionArgSeparator, Parser} from '../syntax/parser';\nimport {TokenType} from '../syntax/tokenizer';\nimport {ITypeDescriptor} from '../ITypeDescriptor';\nimport {angle, deg} from './angle';\nimport {getAbsoluteValue, isLengthPercentage} from './length-percentage';\nimport {Context} from '../../core/context';\nexport type Color = number;\n\nexport const color: ITypeDescriptor = {\n name: 'color',\n parse: (context: Context, value: CSSValue): Color => {\n if (value.type === TokenType.FUNCTION) {\n const colorFunction = SUPPORTED_COLOR_FUNCTIONS[value.name];\n if (typeof colorFunction === 'undefined') {\n throw new Error(`Attempting to parse an unsupported color function \"${value.name}\"`);\n }\n return colorFunction(context, value.values);\n }\n\n if (value.type === TokenType.HASH_TOKEN) {\n if (value.value.length === 3) {\n const r = value.value.substring(0, 1);\n const g = value.value.substring(1, 2);\n const b = value.value.substring(2, 3);\n return pack(parseInt(r + r, 16), parseInt(g + g, 16), parseInt(b + b, 16), 1);\n }\n\n if (value.value.length === 4) {\n const r = value.value.substring(0, 1);\n const g = value.value.substring(1, 2);\n const b = value.value.substring(2, 3);\n const a = value.value.substring(3, 4);\n return pack(parseInt(r + r, 16), parseInt(g + g, 16), parseInt(b + b, 16), parseInt(a + a, 16) / 255);\n }\n\n if (value.value.length === 6) {\n const r = value.value.substring(0, 2);\n const g = value.value.substring(2, 4);\n const b = value.value.substring(4, 6);\n return pack(parseInt(r, 16), parseInt(g, 16), parseInt(b, 16), 1);\n }\n\n if (value.value.length === 8) {\n const r = value.value.substring(0, 2);\n const g = value.value.substring(2, 4);\n const b = value.value.substring(4, 6);\n const a = value.value.substring(6, 8);\n return pack(parseInt(r, 16), parseInt(g, 16), parseInt(b, 16), parseInt(a, 16) / 255);\n }\n }\n\n if (value.type === TokenType.IDENT_TOKEN) {\n const namedColor = COLORS[value.value.toUpperCase()];\n if (typeof namedColor !== 'undefined') {\n return namedColor;\n }\n }\n\n return COLORS.TRANSPARENT;\n }\n};\n\nexport const isTransparent = (color: Color): boolean => (0xff & color) === 0;\n\nexport const asString = (color: Color): string => {\n const alpha = 0xff & color;\n const blue = 0xff & (color >> 8);\n const green = 0xff & (color >> 16);\n const red = 0xff & (color >> 24);\n return alpha < 255 ? `rgba(${red},${green},${blue},${alpha / 255})` : `rgb(${red},${green},${blue})`;\n};\n\nexport const pack = (r: number, g: number, b: number, a: number): Color =>\n ((r << 24) | (g << 16) | (b << 8) | (Math.round(a * 255) << 0)) >>> 0;\n\nconst getTokenColorValue = (token: CSSValue, i: number): number => {\n if (token.type === TokenType.NUMBER_TOKEN) {\n return token.number;\n }\n\n if (token.type === TokenType.PERCENTAGE_TOKEN) {\n const max = i === 3 ? 1 : 255;\n return i === 3 ? (token.number / 100) * max : Math.round((token.number / 100) * max);\n }\n\n return 0;\n};\n\nconst rgb = (_context: Context, args: CSSValue[]): number => {\n const tokens = args.filter(nonFunctionArgSeparator);\n\n if (tokens.length === 3) {\n const [r, g, b] = tokens.map(getTokenColorValue);\n return pack(r, g, b, 1);\n }\n\n if (tokens.length === 4) {\n const [r, g, b, a] = tokens.map(getTokenColorValue);\n return pack(r, g, b, a);\n }\n\n return 0;\n};\n\nfunction hue2rgb(t1: number, t2: number, hue: number): number {\n if (hue < 0) {\n hue += 1;\n }\n if (hue >= 1) {\n hue -= 1;\n }\n\n if (hue < 1 / 6) {\n return (t2 - t1) * hue * 6 + t1;\n } else if (hue < 1 / 2) {\n return t2;\n } else if (hue < 2 / 3) {\n return (t2 - t1) * 6 * (2 / 3 - hue) + t1;\n } else {\n return t1;\n }\n}\n\nconst hsl = (context: Context, args: CSSValue[]): number => {\n const tokens = args.filter(nonFunctionArgSeparator);\n const [hue, saturation, lightness, alpha] = tokens;\n\n const h = (hue.type === TokenType.NUMBER_TOKEN ? deg(hue.number) : angle.parse(context, hue)) / (Math.PI * 2);\n const s = isLengthPercentage(saturation) ? saturation.number / 100 : 0;\n const l = isLengthPercentage(lightness) ? lightness.number / 100 : 0;\n const a = typeof alpha !== 'undefined' && isLengthPercentage(alpha) ? getAbsoluteValue(alpha, 1) : 1;\n\n if (s === 0) {\n return pack(l * 255, l * 255, l * 255, 1);\n }\n\n const t2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;\n\n const t1 = l * 2 - t2;\n const r = hue2rgb(t1, t2, h + 1 / 3);\n const g = hue2rgb(t1, t2, h);\n const b = hue2rgb(t1, t2, h - 1 / 3);\n return pack(r * 255, g * 255, b * 255, a);\n};\n\nconst SUPPORTED_COLOR_FUNCTIONS: {\n [key: string]: (context: Context, args: CSSValue[]) => number;\n} = {\n hsl: hsl,\n hsla: hsl,\n rgb: rgb,\n rgba: rgb\n};\n\nexport const parseColor = (context: Context, value: string): Color =>\n color.parse(context, Parser.create(value).parseComponentValue());\n\nexport const COLORS: {[key: string]: Color} = {\n ALICEBLUE: 0xf0f8ffff,\n ANTIQUEWHITE: 0xfaebd7ff,\n AQUA: 0x00ffffff,\n AQUAMARINE: 0x7fffd4ff,\n AZURE: 0xf0ffffff,\n BEIGE: 0xf5f5dcff,\n BISQUE: 0xffe4c4ff,\n BLACK: 0x000000ff,\n BLANCHEDALMOND: 0xffebcdff,\n BLUE: 0x0000ffff,\n BLUEVIOLET: 0x8a2be2ff,\n BROWN: 0xa52a2aff,\n BURLYWOOD: 0xdeb887ff,\n CADETBLUE: 0x5f9ea0ff,\n CHARTREUSE: 0x7fff00ff,\n CHOCOLATE: 0xd2691eff,\n CORAL: 0xff7f50ff,\n CORNFLOWERBLUE: 0x6495edff,\n CORNSILK: 0xfff8dcff,\n CRIMSON: 0xdc143cff,\n CYAN: 0x00ffffff,\n DARKBLUE: 0x00008bff,\n DARKCYAN: 0x008b8bff,\n DARKGOLDENROD: 0xb886bbff,\n DARKGRAY: 0xa9a9a9ff,\n DARKGREEN: 0x006400ff,\n DARKGREY: 0xa9a9a9ff,\n DARKKHAKI: 0xbdb76bff,\n DARKMAGENTA: 0x8b008bff,\n DARKOLIVEGREEN: 0x556b2fff,\n DARKORANGE: 0xff8c00ff,\n DARKORCHID: 0x9932ccff,\n DARKRED: 0x8b0000ff,\n DARKSALMON: 0xe9967aff,\n DARKSEAGREEN: 0x8fbc8fff,\n DARKSLATEBLUE: 0x483d8bff,\n DARKSLATEGRAY: 0x2f4f4fff,\n DARKSLATEGREY: 0x2f4f4fff,\n DARKTURQUOISE: 0x00ced1ff,\n DARKVIOLET: 0x9400d3ff,\n DEEPPINK: 0xff1493ff,\n DEEPSKYBLUE: 0x00bfffff,\n DIMGRAY: 0x696969ff,\n DIMGREY: 0x696969ff,\n DODGERBLUE: 0x1e90ffff,\n FIREBRICK: 0xb22222ff,\n FLORALWHITE: 0xfffaf0ff,\n FORESTGREEN: 0x228b22ff,\n FUCHSIA: 0xff00ffff,\n GAINSBORO: 0xdcdcdcff,\n GHOSTWHITE: 0xf8f8ffff,\n GOLD: 0xffd700ff,\n GOLDENROD: 0xdaa520ff,\n GRAY: 0x808080ff,\n GREEN: 0x008000ff,\n GREENYELLOW: 0xadff2fff,\n GREY: 0x808080ff,\n HONEYDEW: 0xf0fff0ff,\n HOTPINK: 0xff69b4ff,\n INDIANRED: 0xcd5c5cff,\n INDIGO: 0x4b0082ff,\n IVORY: 0xfffff0ff,\n KHAKI: 0xf0e68cff,\n LAVENDER: 0xe6e6faff,\n LAVENDERBLUSH: 0xfff0f5ff,\n LAWNGREEN: 0x7cfc00ff,\n LEMONCHIFFON: 0xfffacdff,\n LIGHTBLUE: 0xadd8e6ff,\n LIGHTCORAL: 0xf08080ff,\n LIGHTCYAN: 0xe0ffffff,\n LIGHTGOLDENRODYELLOW: 0xfafad2ff,\n LIGHTGRAY: 0xd3d3d3ff,\n LIGHTGREEN: 0x90ee90ff,\n LIGHTGREY: 0xd3d3d3ff,\n LIGHTPINK: 0xffb6c1ff,\n LIGHTSALMON: 0xffa07aff,\n LIGHTSEAGREEN: 0x20b2aaff,\n LIGHTSKYBLUE: 0x87cefaff,\n LIGHTSLATEGRAY: 0x778899ff,\n LIGHTSLATEGREY: 0x778899ff,\n LIGHTSTEELBLUE: 0xb0c4deff,\n LIGHTYELLOW: 0xffffe0ff,\n LIME: 0x00ff00ff,\n LIMEGREEN: 0x32cd32ff,\n LINEN: 0xfaf0e6ff,\n MAGENTA: 0xff00ffff,\n MAROON: 0x800000ff,\n MEDIUMAQUAMARINE: 0x66cdaaff,\n MEDIUMBLUE: 0x0000cdff,\n MEDIUMORCHID: 0xba55d3ff,\n MEDIUMPURPLE: 0x9370dbff,\n MEDIUMSEAGREEN: 0x3cb371ff,\n MEDIUMSLATEBLUE: 0x7b68eeff,\n MEDIUMSPRINGGREEN: 0x00fa9aff,\n MEDIUMTURQUOISE: 0x48d1ccff,\n MEDIUMVIOLETRED: 0xc71585ff,\n MIDNIGHTBLUE: 0x191970ff,\n MINTCREAM: 0xf5fffaff,\n MISTYROSE: 0xffe4e1ff,\n MOCCASIN: 0xffe4b5ff,\n NAVAJOWHITE: 0xffdeadff,\n NAVY: 0x000080ff,\n OLDLACE: 0xfdf5e6ff,\n OLIVE: 0x808000ff,\n OLIVEDRAB: 0x6b8e23ff,\n ORANGE: 0xffa500ff,\n ORANGERED: 0xff4500ff,\n ORCHID: 0xda70d6ff,\n PALEGOLDENROD: 0xeee8aaff,\n PALEGREEN: 0x98fb98ff,\n PALETURQUOISE: 0xafeeeeff,\n PALEVIOLETRED: 0xdb7093ff,\n PAPAYAWHIP: 0xffefd5ff,\n PEACHPUFF: 0xffdab9ff,\n PERU: 0xcd853fff,\n PINK: 0xffc0cbff,\n PLUM: 0xdda0ddff,\n POWDERBLUE: 0xb0e0e6ff,\n PURPLE: 0x800080ff,\n REBECCAPURPLE: 0x663399ff,\n RED: 0xff0000ff,\n ROSYBROWN: 0xbc8f8fff,\n ROYALBLUE: 0x4169e1ff,\n SADDLEBROWN: 0x8b4513ff,\n SALMON: 0xfa8072ff,\n SANDYBROWN: 0xf4a460ff,\n SEAGREEN: 0x2e8b57ff,\n SEASHELL: 0xfff5eeff,\n SIENNA: 0xa0522dff,\n SILVER: 0xc0c0c0ff,\n SKYBLUE: 0x87ceebff,\n SLATEBLUE: 0x6a5acdff,\n SLATEGRAY: 0x708090ff,\n SLATEGREY: 0x708090ff,\n SNOW: 0xfffafaff,\n SPRINGGREEN: 0x00ff7fff,\n STEELBLUE: 0x4682b4ff,\n TAN: 0xd2b48cff,\n TEAL: 0x008080ff,\n THISTLE: 0xd8bfd8ff,\n TOMATO: 0xff6347ff,\n TRANSPARENT: 0x00000000,\n TURQUOISE: 0x40e0d0ff,\n VIOLET: 0xee82eeff,\n WHEAT: 0xf5deb3ff,\n WHITE: 0xffffffff,\n WHITESMOKE: 0xf5f5f5ff,\n YELLOW: 0xffff00ff,\n YELLOWGREEN: 0x9acd32ff\n};\n","import {IPropertyListDescriptor, PropertyDescriptorParsingType} from '../IPropertyDescriptor';\nimport {CSSValue, isIdentToken} from '../syntax/parser';\nimport {Context} from '../../core/context';\nexport const enum BACKGROUND_CLIP {\n BORDER_BOX = 0,\n PADDING_BOX = 1,\n CONTENT_BOX = 2\n}\n\nexport type BackgroundClip = BACKGROUND_CLIP[];\n\nexport const backgroundClip: IPropertyListDescriptor = {\n name: 'background-clip',\n initialValue: 'border-box',\n prefix: false,\n type: PropertyDescriptorParsingType.LIST,\n parse: (_context: Context, tokens: CSSValue[]): BackgroundClip => {\n return tokens.map((token) => {\n if (isIdentToken(token)) {\n switch (token.value) {\n case 'padding-box':\n return BACKGROUND_CLIP.PADDING_BOX;\n case 'content-box':\n return BACKGROUND_CLIP.CONTENT_BOX;\n }\n }\n return BACKGROUND_CLIP.BORDER_BOX;\n });\n }\n};\n","import {IPropertyTypeValueDescriptor, PropertyDescriptorParsingType} from '../IPropertyDescriptor';\n\nexport const backgroundColor: IPropertyTypeValueDescriptor = {\n name: `background-color`,\n initialValue: 'transparent',\n prefix: false,\n type: PropertyDescriptorParsingType.TYPE_VALUE,\n format: 'color'\n};\n","import {CSSValue} from '../../syntax/parser';\nimport {\n CSSRadialExtent,\n CSSRadialGradientImage,\n CSSRadialShape,\n GradientColorStop,\n GradientCorner,\n UnprocessedGradientColorStop\n} from '../image';\nimport {color as colorType} from '../color';\nimport {getAbsoluteValue, HUNDRED_PERCENT, isLengthPercentage, ZERO_LENGTH} from '../length-percentage';\nimport {Context} from '../../../core/context';\n\nexport const parseColorStop = (context: Context, args: CSSValue[]): UnprocessedGradientColorStop => {\n const color = colorType.parse(context, args[0]);\n const stop = args[1];\n return stop && isLengthPercentage(stop) ? {color, stop} : {color, stop: null};\n};\n\nexport const processColorStops = (stops: UnprocessedGradientColorStop[], lineLength: number): GradientColorStop[] => {\n const first = stops[0];\n const last = stops[stops.length - 1];\n if (first.stop === null) {\n first.stop = ZERO_LENGTH;\n }\n\n if (last.stop === null) {\n last.stop = HUNDRED_PERCENT;\n }\n\n const processStops: (number | null)[] = [];\n let previous = 0;\n for (let i = 0; i < stops.length; i++) {\n const stop = stops[i].stop;\n if (stop !== null) {\n const absoluteValue = getAbsoluteValue(stop, lineLength);\n if (absoluteValue > previous) {\n processStops.push(absoluteValue);\n } else {\n processStops.push(previous);\n }\n previous = absoluteValue;\n } else {\n processStops.push(null);\n }\n }\n\n let gapBegin = null;\n for (let i = 0; i < processStops.length; i++) {\n const stop = processStops[i];\n if (stop === null) {\n if (gapBegin === null) {\n gapBegin = i;\n }\n } else if (gapBegin !== null) {\n const gapLength = i - gapBegin;\n const beforeGap = processStops[gapBegin - 1] as number;\n const gapValue = (stop - beforeGap) / (gapLength + 1);\n for (let g = 1; g <= gapLength; g++) {\n processStops[gapBegin + g - 1] = gapValue * g;\n }\n gapBegin = null;\n }\n }\n\n return stops.map(({color}, i) => {\n return {color, stop: Math.max(Math.min(1, (processStops[i] as number) / lineLength), 0)};\n });\n};\n\nconst getAngleFromCorner = (corner: GradientCorner, width: number, height: number): number => {\n const centerX = width / 2;\n const centerY = height / 2;\n const x = getAbsoluteValue(corner[0], width) - centerX;\n const y = centerY - getAbsoluteValue(corner[1], height);\n\n return (Math.atan2(y, x) + Math.PI * 2) % (Math.PI * 2);\n};\n\nexport const calculateGradientDirection = (\n angle: number | GradientCorner,\n width: number,\n height: number\n): [number, number, number, number, number] => {\n const radian = typeof angle === 'number' ? angle : getAngleFromCorner(angle, width, height);\n\n const lineLength = Math.abs(width * Math.sin(radian)) + Math.abs(height * Math.cos(radian));\n\n const halfWidth = width / 2;\n const halfHeight = height / 2;\n const halfLineLength = lineLength / 2;\n\n const yDiff = Math.sin(radian - Math.PI / 2) * halfLineLength;\n const xDiff = Math.cos(radian - Math.PI / 2) * halfLineLength;\n\n return [lineLength, halfWidth - xDiff, halfWidth + xDiff, halfHeight - yDiff, halfHeight + yDiff];\n};\n\nconst distance = (a: number, b: number): number => Math.sqrt(a * a + b * b);\n\nconst findCorner = (width: number, height: number, x: number, y: number, closest: boolean): [number, number] => {\n const corners = [\n [0, 0],\n [0, height],\n [width, 0],\n [width, height]\n ];\n\n return corners.reduce(\n (stat, corner) => {\n const [cx, cy] = corner;\n const d = distance(x - cx, y - cy);\n if (closest ? d < stat.optimumDistance : d > stat.optimumDistance) {\n return {\n optimumCorner: corner,\n optimumDistance: d\n };\n }\n\n return stat;\n },\n {\n optimumDistance: closest ? Infinity : -Infinity,\n optimumCorner: null\n }\n ).optimumCorner as [number, number];\n};\n\nexport const calculateRadius = (\n gradient: CSSRadialGradientImage,\n x: number,\n y: number,\n width: number,\n height: number\n): [number, number] => {\n let rx = 0;\n let ry = 0;\n\n switch (gradient.size) {\n case CSSRadialExtent.CLOSEST_SIDE:\n // The ending shape is sized so that that it exactly meets the side of the gradient box closest to the gradient’s center.\n // If the shape is an ellipse, it exactly meets the closest side in each dimension.\n if (gradient.shape === CSSRadialShape.CIRCLE) {\n rx = ry = Math.min(Math.abs(x), Math.abs(x - width), Math.abs(y), Math.abs(y - height));\n } else if (gradient.shape === CSSRadialShape.ELLIPSE) {\n rx = Math.min(Math.abs(x), Math.abs(x - width));\n ry = Math.min(Math.abs(y), Math.abs(y - height));\n }\n break;\n\n case CSSRadialExtent.CLOSEST_CORNER:\n // The ending shape is sized so that that it passes through the corner of the gradient box closest to the gradient’s center.\n // If the shape is an ellipse, the ending shape is given the same aspect-ratio it would have if closest-side were specified.\n if (gradient.shape === CSSRadialShape.CIRCLE) {\n rx = ry = Math.min(\n distance(x, y),\n distance(x, y - height),\n distance(x - width, y),\n distance(x - width, y - height)\n );\n } else if (gradient.shape === CSSRadialShape.ELLIPSE) {\n // Compute the ratio ry/rx (which is to be the same as for \"closest-side\")\n const c = Math.min(Math.abs(y), Math.abs(y - height)) / Math.min(Math.abs(x), Math.abs(x - width));\n const [cx, cy] = findCorner(width, height, x, y, true);\n rx = distance(cx - x, (cy - y) / c);\n ry = c * rx;\n }\n break;\n\n case CSSRadialExtent.FARTHEST_SIDE:\n // Same as closest-side, except the ending shape is sized based on the farthest side(s)\n if (gradient.shape === CSSRadialShape.CIRCLE) {\n rx = ry = Math.max(Math.abs(x), Math.abs(x - width), Math.abs(y), Math.abs(y - height));\n } else if (gradient.shape === CSSRadialShape.ELLIPSE) {\n rx = Math.max(Math.abs(x), Math.abs(x - width));\n ry = Math.max(Math.abs(y), Math.abs(y - height));\n }\n break;\n\n case CSSRadialExtent.FARTHEST_CORNER:\n // Same as closest-corner, except the ending shape is sized based on the farthest corner.\n // If the shape is an ellipse, the ending shape is given the same aspect ratio it would have if farthest-side were specified.\n if (gradient.shape === CSSRadialShape.CIRCLE) {\n rx = ry = Math.max(\n distance(x, y),\n distance(x, y - height),\n distance(x - width, y),\n distance(x - width, y - height)\n );\n } else if (gradient.shape === CSSRadialShape.ELLIPSE) {\n // Compute the ratio ry/rx (which is to be the same as for \"farthest-side\")\n const c = Math.max(Math.abs(y), Math.abs(y - height)) / Math.max(Math.abs(x), Math.abs(x - width));\n const [cx, cy] = findCorner(width, height, x, y, false);\n rx = distance(cx - x, (cy - y) / c);\n ry = c * rx;\n }\n break;\n }\n\n if (Array.isArray(gradient.size)) {\n rx = getAbsoluteValue(gradient.size[0], width);\n ry = gradient.size.length === 2 ? getAbsoluteValue(gradient.size[1], height) : rx;\n }\n\n return [rx, ry];\n};\n","import {CSSValue, parseFunctionArgs} from '../../syntax/parser';\nimport {CSSImageType, CSSLinearGradientImage, GradientCorner, UnprocessedGradientColorStop} from '../image';\nimport {TokenType} from '../../syntax/tokenizer';\nimport {isAngle, angle as angleType, parseNamedSide, deg} from '../angle';\nimport {parseColorStop} from './gradient';\nimport {Context} from '../../../core/context';\n\nexport const prefixLinearGradient = (context: Context, tokens: CSSValue[]): CSSLinearGradientImage => {\n let angle: number | GradientCorner = deg(180);\n const stops: UnprocessedGradientColorStop[] = [];\n\n parseFunctionArgs(tokens).forEach((arg, i) => {\n if (i === 0) {\n const firstToken = arg[0];\n if (\n firstToken.type === TokenType.IDENT_TOKEN &&\n ['top', 'left', 'right', 'bottom'].indexOf(firstToken.value) !== -1\n ) {\n angle = parseNamedSide(arg);\n return;\n } else if (isAngle(firstToken)) {\n angle = (angleType.parse(context, firstToken) + deg(270)) % deg(360);\n return;\n }\n }\n const colorStop = parseColorStop(context, arg);\n stops.push(colorStop);\n });\n\n return {\n angle,\n stops,\n type: CSSImageType.LINEAR_GRADIENT\n };\n};\n","import {CSSValue, isIdentToken, parseFunctionArgs} from '../../syntax/parser';\nimport {\n CSSImageType,\n CSSRadialExtent,\n CSSRadialGradientImage,\n CSSRadialShape,\n CSSRadialSize,\n UnprocessedGradientColorStop\n} from '../image';\nimport {parseColorStop} from './gradient';\nimport {FIFTY_PERCENT, HUNDRED_PERCENT, isLengthPercentage, LengthPercentage, ZERO_LENGTH} from '../length-percentage';\nimport {isLength} from '../length';\nimport {Context} from '../../../core/context';\nexport const CLOSEST_SIDE = 'closest-side';\nexport const FARTHEST_SIDE = 'farthest-side';\nexport const CLOSEST_CORNER = 'closest-corner';\nexport const FARTHEST_CORNER = 'farthest-corner';\nexport const CIRCLE = 'circle';\nexport const ELLIPSE = 'ellipse';\nexport const COVER = 'cover';\nexport const CONTAIN = 'contain';\n\nexport const radialGradient = (context: Context, tokens: CSSValue[]): CSSRadialGradientImage => {\n let shape: CSSRadialShape = CSSRadialShape.CIRCLE;\n let size: CSSRadialSize = CSSRadialExtent.FARTHEST_CORNER;\n const stops: UnprocessedGradientColorStop[] = [];\n const position: LengthPercentage[] = [];\n parseFunctionArgs(tokens).forEach((arg, i) => {\n let isColorStop = true;\n if (i === 0) {\n let isAtPosition = false;\n isColorStop = arg.reduce((acc, token) => {\n if (isAtPosition) {\n if (isIdentToken(token)) {\n switch (token.value) {\n case 'center':\n position.push(FIFTY_PERCENT);\n return acc;\n case 'top':\n case 'left':\n position.push(ZERO_LENGTH);\n return acc;\n case 'right':\n case 'bottom':\n position.push(HUNDRED_PERCENT);\n return acc;\n }\n } else if (isLengthPercentage(token) || isLength(token)) {\n position.push(token);\n }\n } else if (isIdentToken(token)) {\n switch (token.value) {\n case CIRCLE:\n shape = CSSRadialShape.CIRCLE;\n return false;\n case ELLIPSE:\n shape = CSSRadialShape.ELLIPSE;\n return false;\n case 'at':\n isAtPosition = true;\n return false;\n case CLOSEST_SIDE:\n size = CSSRadialExtent.CLOSEST_SIDE;\n return false;\n case COVER:\n case FARTHEST_SIDE:\n size = CSSRadialExtent.FARTHEST_SIDE;\n return false;\n case CONTAIN:\n case CLOSEST_CORNER:\n size = CSSRadialExtent.CLOSEST_CORNER;\n return false;\n case FARTHEST_CORNER:\n size = CSSRadialExtent.FARTHEST_CORNER;\n return false;\n }\n } else if (isLength(token) || isLengthPercentage(token)) {\n if (!Array.isArray(size)) {\n size = [];\n }\n size.push(token);\n return false;\n }\n return acc;\n }, isColorStop);\n }\n\n if (isColorStop) {\n const colorStop = parseColorStop(context, arg);\n stops.push(colorStop);\n }\n });\n\n return {size, shape, stops, position, type: CSSImageType.RADIAL_GRADIENT};\n};\n","import {CSSValue, isIdentToken, parseFunctionArgs} from '../../syntax/parser';\nimport {\n CSSImageType,\n CSSRadialExtent,\n CSSRadialGradientImage,\n CSSRadialShape,\n CSSRadialSize,\n UnprocessedGradientColorStop\n} from '../image';\nimport {parseColorStop} from './gradient';\nimport {FIFTY_PERCENT, HUNDRED_PERCENT, isLengthPercentage, LengthPercentage, ZERO_LENGTH} from '../length-percentage';\nimport {isLength} from '../length';\nimport {\n CIRCLE,\n CLOSEST_CORNER,\n CLOSEST_SIDE,\n CONTAIN,\n COVER,\n ELLIPSE,\n FARTHEST_CORNER,\n FARTHEST_SIDE\n} from './radial-gradient';\nimport {Context} from '../../../core/context';\n\nexport const prefixRadialGradient = (context: Context, tokens: CSSValue[]): CSSRadialGradientImage => {\n let shape: CSSRadialShape = CSSRadialShape.CIRCLE;\n let size: CSSRadialSize = CSSRadialExtent.FARTHEST_CORNER;\n const stops: UnprocessedGradientColorStop[] = [];\n const position: LengthPercentage[] = [];\n\n parseFunctionArgs(tokens).forEach((arg, i) => {\n let isColorStop = true;\n if (i === 0) {\n isColorStop = arg.reduce((acc, token) => {\n if (isIdentToken(token)) {\n switch (token.value) {\n case 'center':\n position.push(FIFTY_PERCENT);\n return false;\n case 'top':\n case 'left':\n position.push(ZERO_LENGTH);\n return false;\n case 'right':\n case 'bottom':\n position.push(HUNDRED_PERCENT);\n return false;\n }\n } else if (isLengthPercentage(token) || isLength(token)) {\n position.push(token);\n return false;\n }\n\n return acc;\n }, isColorStop);\n } else if (i === 1) {\n isColorStop = arg.reduce((acc, token) => {\n if (isIdentToken(token)) {\n switch (token.value) {\n case CIRCLE:\n shape = CSSRadialShape.CIRCLE;\n return false;\n case ELLIPSE:\n shape = CSSRadialShape.ELLIPSE;\n return false;\n case CONTAIN:\n case CLOSEST_SIDE:\n size = CSSRadialExtent.CLOSEST_SIDE;\n return false;\n case FARTHEST_SIDE:\n size = CSSRadialExtent.FARTHEST_SIDE;\n return false;\n case CLOSEST_CORNER:\n size = CSSRadialExtent.CLOSEST_CORNER;\n return false;\n case COVER:\n case FARTHEST_CORNER:\n size = CSSRadialExtent.FARTHEST_CORNER;\n return false;\n }\n } else if (isLength(token) || isLengthPercentage(token)) {\n if (!Array.isArray(size)) {\n size = [];\n }\n size.push(token);\n return false;\n }\n\n return acc;\n }, isColorStop);\n }\n\n if (isColorStop) {\n const colorStop = parseColorStop(context, arg);\n stops.push(colorStop);\n }\n });\n\n return {size, shape, stops, position, type: CSSImageType.RADIAL_GRADIENT};\n};\n","import {CSSValue} from '../syntax/parser';\nimport {TokenType} from '../syntax/tokenizer';\nimport {Color} from './color';\nimport {linearGradient} from './functions/linear-gradient';\nimport {prefixLinearGradient} from './functions/-prefix-linear-gradient';\nimport {ITypeDescriptor} from '../ITypeDescriptor';\nimport {LengthPercentage} from './length-percentage';\nimport {webkitGradient} from './functions/-webkit-gradient';\nimport {radialGradient} from './functions/radial-gradient';\nimport {prefixRadialGradient} from './functions/-prefix-radial-gradient';\nimport {Context} from '../../core/context';\n\nexport const enum CSSImageType {\n URL,\n LINEAR_GRADIENT,\n RADIAL_GRADIENT\n}\n\nexport const isLinearGradient = (background: ICSSImage): background is CSSLinearGradientImage => {\n return background.type === CSSImageType.LINEAR_GRADIENT;\n};\n\nexport const isRadialGradient = (background: ICSSImage): background is CSSRadialGradientImage => {\n return background.type === CSSImageType.RADIAL_GRADIENT;\n};\n\nexport interface UnprocessedGradientColorStop {\n color: Color;\n stop: LengthPercentage | null;\n}\n\nexport interface GradientColorStop {\n color: Color;\n stop: number;\n}\n\nexport interface ICSSImage {\n type: CSSImageType;\n}\n\nexport interface CSSURLImage extends ICSSImage {\n url: string;\n type: CSSImageType.URL;\n}\n\n// interface ICSSGeneratedImage extends ICSSImage {}\n\nexport type GradientCorner = [LengthPercentage, LengthPercentage];\n\ninterface ICSSGradientImage extends ICSSImage {\n stops: UnprocessedGradientColorStop[];\n}\n\nexport interface CSSLinearGradientImage extends ICSSGradientImage {\n angle: number | GradientCorner;\n type: CSSImageType.LINEAR_GRADIENT;\n}\n\nexport const enum CSSRadialShape {\n CIRCLE,\n ELLIPSE\n}\n\nexport const enum CSSRadialExtent {\n CLOSEST_SIDE,\n FARTHEST_SIDE,\n CLOSEST_CORNER,\n FARTHEST_CORNER\n}\n\nexport type CSSRadialSize = CSSRadialExtent | LengthPercentage[];\n\nexport interface CSSRadialGradientImage extends ICSSGradientImage {\n type: CSSImageType.RADIAL_GRADIENT;\n shape: CSSRadialShape;\n size: CSSRadialSize;\n position: LengthPercentage[];\n}\n\nexport const image: ITypeDescriptor = {\n name: 'image',\n parse: (context: Context, value: CSSValue): ICSSImage => {\n if (value.type === TokenType.URL_TOKEN) {\n const image: CSSURLImage = {url: value.value, type: CSSImageType.URL};\n context.cache.addImage(value.value);\n return image;\n }\n\n if (value.type === TokenType.FUNCTION) {\n const imageFunction = SUPPORTED_IMAGE_FUNCTIONS[value.name];\n if (typeof imageFunction === 'undefined') {\n throw new Error(`Attempting to parse an unsupported image function \"${value.name}\"`);\n }\n return imageFunction(context, value.values);\n }\n\n throw new Error(`Unsupported image type ${value.type}`);\n }\n};\n\nexport function isSupportedImage(value: CSSValue): boolean {\n return (\n !(value.type === TokenType.IDENT_TOKEN && value.value === 'none') &&\n (value.type !== TokenType.FUNCTION || !!SUPPORTED_IMAGE_FUNCTIONS[value.name])\n );\n}\n\nconst SUPPORTED_IMAGE_FUNCTIONS: Record ICSSImage> = {\n 'linear-gradient': linearGradient,\n '-moz-linear-gradient': prefixLinearGradient,\n '-ms-linear-gradient': prefixLinearGradient,\n '-o-linear-gradient': prefixLinearGradient,\n '-webkit-linear-gradient': prefixLinearGradient,\n 'radial-gradient': radialGradient,\n '-moz-radial-gradient': prefixRadialGradient,\n '-ms-radial-gradient': prefixRadialGradient,\n '-o-radial-gradient': prefixRadialGradient,\n '-webkit-radial-gradient': prefixRadialGradient,\n '-webkit-gradient': webkitGradient\n};\n","import {IPropertyListDescriptor, PropertyDescriptorParsingType} from '../IPropertyDescriptor';\nimport {CSSValue, isIdentToken, parseFunctionArgs} from '../syntax/parser';\nimport {isLengthPercentage, LengthPercentage} from '../types/length-percentage';\nimport {StringValueToken} from '../syntax/tokenizer';\nimport {Context} from '../../core/context';\n\nexport enum BACKGROUND_SIZE {\n AUTO = 'auto',\n CONTAIN = 'contain',\n COVER = 'cover'\n}\n\nexport type BackgroundSizeInfo = LengthPercentage | StringValueToken;\nexport type BackgroundSize = BackgroundSizeInfo[][];\n\nexport const backgroundSize: IPropertyListDescriptor = {\n name: 'background-size',\n initialValue: '0',\n prefix: false,\n type: PropertyDescriptorParsingType.LIST,\n parse: (_context: Context, tokens: CSSValue[]): BackgroundSize => {\n return parseFunctionArgs(tokens).map((values) => values.filter(isBackgroundSizeInfoToken));\n }\n};\n\nconst isBackgroundSizeInfoToken = (value: CSSValue): value is BackgroundSizeInfo =>\n isIdentToken(value) || isLengthPercentage(value);\n","import {CSSValue, parseFunctionArgs} from '../../syntax/parser';\nimport {TokenType} from '../../syntax/tokenizer';\nimport {isAngle, angle as angleType, parseNamedSide, deg} from '../angle';\nimport {CSSImageType, CSSLinearGradientImage, GradientCorner, UnprocessedGradientColorStop} from '../image';\nimport {parseColorStop} from './gradient';\nimport {Context} from '../../../core/context';\n\nexport const linearGradient = (context: Context, tokens: CSSValue[]): CSSLinearGradientImage => {\n let angle: number | GradientCorner = deg(180);\n const stops: UnprocessedGradientColorStop[] = [];\n\n parseFunctionArgs(tokens).forEach((arg, i) => {\n if (i === 0) {\n const firstToken = arg[0];\n if (firstToken.type === TokenType.IDENT_TOKEN && firstToken.value === 'to') {\n angle = parseNamedSide(arg);\n return;\n } else if (isAngle(firstToken)) {\n angle = angleType.parse(context, firstToken);\n return;\n }\n }\n const colorStop = parseColorStop(context, arg);\n stops.push(colorStop);\n });\n\n return {angle, stops, type: CSSImageType.LINEAR_GRADIENT};\n};\n","import {CSSValue, isIdentToken, isNumberToken, nonFunctionArgSeparator, parseFunctionArgs} from '../../syntax/parser';\nimport {\n CSSImageType,\n CSSLinearGradientImage,\n CSSRadialExtent,\n CSSRadialGradientImage,\n CSSRadialShape,\n CSSRadialSize,\n UnprocessedGradientColorStop\n} from '../image';\nimport {deg} from '../angle';\nimport {TokenType} from '../../syntax/tokenizer';\nimport {color as colorType} from '../color';\nimport {HUNDRED_PERCENT, LengthPercentage, ZERO_LENGTH} from '../length-percentage';\nimport {Context} from '../../../core/context';\n\nexport const webkitGradient = (\n context: Context,\n tokens: CSSValue[]\n): CSSLinearGradientImage | CSSRadialGradientImage => {\n const angle = deg(180);\n const stops: UnprocessedGradientColorStop[] = [];\n let type = CSSImageType.LINEAR_GRADIENT;\n const shape: CSSRadialShape = CSSRadialShape.CIRCLE;\n const size: CSSRadialSize = CSSRadialExtent.FARTHEST_CORNER;\n const position: LengthPercentage[] = [];\n parseFunctionArgs(tokens).forEach((arg, i) => {\n const firstToken = arg[0];\n if (i === 0) {\n if (isIdentToken(firstToken) && firstToken.value === 'linear') {\n type = CSSImageType.LINEAR_GRADIENT;\n return;\n } else if (isIdentToken(firstToken) && firstToken.value === 'radial') {\n type = CSSImageType.RADIAL_GRADIENT;\n return;\n }\n }\n\n if (firstToken.type === TokenType.FUNCTION) {\n if (firstToken.name === 'from') {\n const color = colorType.parse(context, firstToken.values[0]);\n stops.push({stop: ZERO_LENGTH, color});\n } else if (firstToken.name === 'to') {\n const color = colorType.parse(context, firstToken.values[0]);\n stops.push({stop: HUNDRED_PERCENT, color});\n } else if (firstToken.name === 'color-stop') {\n const values = firstToken.values.filter(nonFunctionArgSeparator);\n if (values.length === 2) {\n const color = colorType.parse(context, values[1]);\n const stop = values[0];\n if (isNumberToken(stop)) {\n stops.push({\n stop: {type: TokenType.PERCENTAGE_TOKEN, number: stop.number * 100, flags: stop.flags},\n color\n });\n }\n }\n }\n }\n });\n\n return type === CSSImageType.LINEAR_GRADIENT\n ? {\n angle: (angle + deg(180)) % deg(360),\n stops,\n type\n }\n : {size, shape, stops, position, type};\n};\n","import {TokenType} from '../syntax/tokenizer';\nimport {ICSSImage, image, isSupportedImage} from '../types/image';\nimport {IPropertyListDescriptor, PropertyDescriptorParsingType} from '../IPropertyDescriptor';\nimport {CSSValue, nonFunctionArgSeparator} from '../syntax/parser';\nimport {Context} from '../../core/context';\n\nexport const backgroundImage: IPropertyListDescriptor = {\n name: 'background-image',\n initialValue: 'none',\n type: PropertyDescriptorParsingType.LIST,\n prefix: false,\n parse: (context: Context, tokens: CSSValue[]) => {\n if (tokens.length === 0) {\n return [];\n }\n\n const first = tokens[0];\n\n if (first.type === TokenType.IDENT_TOKEN && first.value === 'none') {\n return [];\n }\n\n return tokens\n .filter((value) => nonFunctionArgSeparator(value) && isSupportedImage(value))\n .map((value) => image.parse(context, value));\n }\n};\n","import {IPropertyListDescriptor, PropertyDescriptorParsingType} from '../IPropertyDescriptor';\nimport {CSSValue, isIdentToken} from '../syntax/parser';\nimport {Context} from '../../core/context';\n\nexport const enum BACKGROUND_ORIGIN {\n BORDER_BOX = 0,\n PADDING_BOX = 1,\n CONTENT_BOX = 2\n}\n\nexport type BackgroundOrigin = BACKGROUND_ORIGIN[];\n\nexport const backgroundOrigin: IPropertyListDescriptor = {\n name: 'background-origin',\n initialValue: 'border-box',\n prefix: false,\n type: PropertyDescriptorParsingType.LIST,\n parse: (_context: Context, tokens: CSSValue[]): BackgroundOrigin => {\n return tokens.map((token) => {\n if (isIdentToken(token)) {\n switch (token.value) {\n case 'padding-box':\n return BACKGROUND_ORIGIN.PADDING_BOX;\n case 'content-box':\n return BACKGROUND_ORIGIN.CONTENT_BOX;\n }\n }\n return BACKGROUND_ORIGIN.BORDER_BOX;\n });\n }\n};\n","import {PropertyDescriptorParsingType, IPropertyListDescriptor} from '../IPropertyDescriptor';\nimport {CSSValue, parseFunctionArgs} from '../syntax/parser';\nimport {isLengthPercentage, LengthPercentageTuple, parseLengthPercentageTuple} from '../types/length-percentage';\nimport {Context} from '../../core/context';\nexport type BackgroundPosition = BackgroundImagePosition[];\n\nexport type BackgroundImagePosition = LengthPercentageTuple;\n\nexport const backgroundPosition: IPropertyListDescriptor = {\n name: 'background-position',\n initialValue: '0% 0%',\n type: PropertyDescriptorParsingType.LIST,\n prefix: false,\n parse: (_context: Context, tokens: CSSValue[]): BackgroundPosition => {\n return parseFunctionArgs(tokens)\n .map((values: CSSValue[]) => values.filter(isLengthPercentage))\n .map(parseLengthPercentageTuple);\n }\n};\n","import {IPropertyListDescriptor, PropertyDescriptorParsingType} from '../IPropertyDescriptor';\nimport {CSSValue, isIdentToken, parseFunctionArgs} from '../syntax/parser';\nimport {Context} from '../../core/context';\nexport type BackgroundRepeat = BACKGROUND_REPEAT[];\n\nexport const enum BACKGROUND_REPEAT {\n REPEAT = 0,\n NO_REPEAT = 1,\n REPEAT_X = 2,\n REPEAT_Y = 3\n}\n\nexport const backgroundRepeat: IPropertyListDescriptor = {\n name: 'background-repeat',\n initialValue: 'repeat',\n prefix: false,\n type: PropertyDescriptorParsingType.LIST,\n parse: (_context: Context, tokens: CSSValue[]): BackgroundRepeat => {\n return parseFunctionArgs(tokens)\n .map((values) =>\n values\n .filter(isIdentToken)\n .map((token) => token.value)\n .join(' ')\n )\n .map(parseBackgroundRepeat);\n }\n};\n\nconst parseBackgroundRepeat = (value: string): BACKGROUND_REPEAT => {\n switch (value) {\n case 'no-repeat':\n return BACKGROUND_REPEAT.NO_REPEAT;\n case 'repeat-x':\n case 'repeat no-repeat':\n return BACKGROUND_REPEAT.REPEAT_X;\n case 'repeat-y':\n case 'no-repeat repeat':\n return BACKGROUND_REPEAT.REPEAT_Y;\n case 'repeat':\n default:\n return BACKGROUND_REPEAT.REPEAT;\n }\n};\n","import {IPropertyIdentValueDescriptor, PropertyDescriptorParsingType} from '../IPropertyDescriptor';\nimport {Context} from '../../core/context';\nexport enum LINE_BREAK {\n NORMAL = 'normal',\n STRICT = 'strict'\n}\n\nexport const lineBreak: IPropertyIdentValueDescriptor = {\n name: 'line-break',\n initialValue: 'normal',\n prefix: false,\n type: PropertyDescriptorParsingType.IDENT_VALUE,\n parse: (_context: Context, lineBreak: string): LINE_BREAK => {\n switch (lineBreak) {\n case 'strict':\n return LINE_BREAK.STRICT;\n case 'normal':\n default:\n return LINE_BREAK.NORMAL;\n }\n }\n};\n","import {IPropertyTypeValueDescriptor, PropertyDescriptorParsingType} from '../IPropertyDescriptor';\nconst borderColorForSide = (side: string): IPropertyTypeValueDescriptor => ({\n name: `border-${side}-color`,\n initialValue: 'transparent',\n prefix: false,\n type: PropertyDescriptorParsingType.TYPE_VALUE,\n format: 'color'\n});\n\nexport const borderTopColor: IPropertyTypeValueDescriptor = borderColorForSide('top');\nexport const borderRightColor: IPropertyTypeValueDescriptor = borderColorForSide('right');\nexport const borderBottomColor: IPropertyTypeValueDescriptor = borderColorForSide('bottom');\nexport const borderLeftColor: IPropertyTypeValueDescriptor = borderColorForSide('left');\n","import {IPropertyListDescriptor, PropertyDescriptorParsingType} from '../IPropertyDescriptor';\nimport {CSSValue} from '../syntax/parser';\nimport {isLengthPercentage, LengthPercentageTuple, parseLengthPercentageTuple} from '../types/length-percentage';\nimport {Context} from '../../core/context';\nexport type BorderRadius = LengthPercentageTuple;\n\nconst borderRadiusForSide = (side: string): IPropertyListDescriptor => ({\n name: `border-radius-${side}`,\n initialValue: '0 0',\n prefix: false,\n type: PropertyDescriptorParsingType.LIST,\n parse: (_context: Context, tokens: CSSValue[]): BorderRadius =>\n parseLengthPercentageTuple(tokens.filter(isLengthPercentage))\n});\n\nexport const borderTopLeftRadius: IPropertyListDescriptor = borderRadiusForSide('top-left');\nexport const borderTopRightRadius: IPropertyListDescriptor = borderRadiusForSide('top-right');\nexport const borderBottomRightRadius: IPropertyListDescriptor = borderRadiusForSide('bottom-right');\nexport const borderBottomLeftRadius: IPropertyListDescriptor = borderRadiusForSide('bottom-left');\n","import {IPropertyIdentValueDescriptor, PropertyDescriptorParsingType} from '../IPropertyDescriptor';\nimport {Context} from '../../core/context';\nexport const enum BORDER_STYLE {\n NONE = 0,\n SOLID = 1,\n DASHED = 2,\n DOTTED = 3,\n DOUBLE = 4\n}\n\nconst borderStyleForSide = (side: string): IPropertyIdentValueDescriptor => ({\n name: `border-${side}-style`,\n initialValue: 'solid',\n prefix: false,\n type: PropertyDescriptorParsingType.IDENT_VALUE,\n parse: (_context: Context, style: string): BORDER_STYLE => {\n switch (style) {\n case 'none':\n return BORDER_STYLE.NONE;\n case 'dashed':\n return BORDER_STYLE.DASHED;\n case 'dotted':\n return BORDER_STYLE.DOTTED;\n case 'double':\n return BORDER_STYLE.DOUBLE;\n }\n return BORDER_STYLE.SOLID;\n }\n});\n\nexport const borderTopStyle: IPropertyIdentValueDescriptor = borderStyleForSide('top');\nexport const borderRightStyle: IPropertyIdentValueDescriptor = borderStyleForSide('right');\nexport const borderBottomStyle: IPropertyIdentValueDescriptor = borderStyleForSide('bottom');\nexport const borderLeftStyle: IPropertyIdentValueDescriptor = borderStyleForSide('left');\n","import {IPropertyValueDescriptor, PropertyDescriptorParsingType} from '../IPropertyDescriptor';\nimport {CSSValue, isDimensionToken} from '../syntax/parser';\nimport {Context} from '../../core/context';\nconst borderWidthForSide = (side: string): IPropertyValueDescriptor => ({\n name: `border-${side}-width`,\n initialValue: '0',\n type: PropertyDescriptorParsingType.VALUE,\n prefix: false,\n parse: (_context: Context, token: CSSValue): number => {\n if (isDimensionToken(token)) {\n return token.number;\n }\n return 0;\n }\n});\n\nexport const borderTopWidth: IPropertyValueDescriptor = borderWidthForSide('top');\nexport const borderRightWidth: IPropertyValueDescriptor = borderWidthForSide('right');\nexport const borderBottomWidth: IPropertyValueDescriptor = borderWidthForSide('bottom');\nexport const borderLeftWidth: IPropertyValueDescriptor = borderWidthForSide('left');\n","import {IPropertyTypeValueDescriptor, PropertyDescriptorParsingType} from '../IPropertyDescriptor';\n\nexport const color: IPropertyTypeValueDescriptor = {\n name: `color`,\n initialValue: 'transparent',\n prefix: false,\n type: PropertyDescriptorParsingType.TYPE_VALUE,\n format: 'color'\n};\n","import {IPropertyIdentValueDescriptor, PropertyDescriptorParsingType} from '../IPropertyDescriptor';\nimport {Context} from '../../core/context';\n\nexport const enum DIRECTION {\n LTR = 0,\n RTL = 1\n}\n\nexport const direction: IPropertyIdentValueDescriptor = {\n name: 'direction',\n initialValue: 'ltr',\n prefix: false,\n type: PropertyDescriptorParsingType.IDENT_VALUE,\n parse: (_context: Context, direction: string) => {\n switch (direction) {\n case 'rtl':\n return DIRECTION.RTL;\n case 'ltr':\n default:\n return DIRECTION.LTR;\n }\n }\n};\n","import {IPropertyListDescriptor, PropertyDescriptorParsingType} from '../IPropertyDescriptor';\nimport {CSSValue, isIdentToken} from '../syntax/parser';\nimport {Context} from '../../core/context';\nexport const enum DISPLAY {\n NONE = 0,\n BLOCK = 1 << 1,\n INLINE = 1 << 2,\n RUN_IN = 1 << 3,\n FLOW = 1 << 4,\n FLOW_ROOT = 1 << 5,\n TABLE = 1 << 6,\n FLEX = 1 << 7,\n GRID = 1 << 8,\n RUBY = 1 << 9,\n SUBGRID = 1 << 10,\n LIST_ITEM = 1 << 11,\n TABLE_ROW_GROUP = 1 << 12,\n TABLE_HEADER_GROUP = 1 << 13,\n TABLE_FOOTER_GROUP = 1 << 14,\n TABLE_ROW = 1 << 15,\n TABLE_CELL = 1 << 16,\n TABLE_COLUMN_GROUP = 1 << 17,\n TABLE_COLUMN = 1 << 18,\n TABLE_CAPTION = 1 << 19,\n RUBY_BASE = 1 << 20,\n RUBY_TEXT = 1 << 21,\n RUBY_BASE_CONTAINER = 1 << 22,\n RUBY_TEXT_CONTAINER = 1 << 23,\n CONTENTS = 1 << 24,\n INLINE_BLOCK = 1 << 25,\n INLINE_LIST_ITEM = 1 << 26,\n INLINE_TABLE = 1 << 27,\n INLINE_FLEX = 1 << 28,\n INLINE_GRID = 1 << 29\n}\n\nexport type Display = number;\n\nexport const display: IPropertyListDescriptor = {\n name: 'display',\n initialValue: 'inline-block',\n prefix: false,\n type: PropertyDescriptorParsingType.LIST,\n parse: (_context: Context, tokens: CSSValue[]): Display => {\n return tokens.filter(isIdentToken).reduce((bit, token) => {\n return bit | parseDisplayValue(token.value);\n }, DISPLAY.NONE);\n }\n};\n\nconst parseDisplayValue = (display: string): Display => {\n switch (display) {\n case 'block':\n case '-webkit-box':\n return DISPLAY.BLOCK;\n case 'inline':\n return DISPLAY.INLINE;\n case 'run-in':\n return DISPLAY.RUN_IN;\n case 'flow':\n return DISPLAY.FLOW;\n case 'flow-root':\n return DISPLAY.FLOW_ROOT;\n case 'table':\n return DISPLAY.TABLE;\n case 'flex':\n case '-webkit-flex':\n return DISPLAY.FLEX;\n case 'grid':\n case '-ms-grid':\n return DISPLAY.GRID;\n case 'ruby':\n return DISPLAY.RUBY;\n case 'subgrid':\n return DISPLAY.SUBGRID;\n case 'list-item':\n return DISPLAY.LIST_ITEM;\n case 'table-row-group':\n return DISPLAY.TABLE_ROW_GROUP;\n case 'table-header-group':\n return DISPLAY.TABLE_HEADER_GROUP;\n case 'table-footer-group':\n return DISPLAY.TABLE_FOOTER_GROUP;\n case 'table-row':\n return DISPLAY.TABLE_ROW;\n case 'table-cell':\n return DISPLAY.TABLE_CELL;\n case 'table-column-group':\n return DISPLAY.TABLE_COLUMN_GROUP;\n case 'table-column':\n return DISPLAY.TABLE_COLUMN;\n case 'table-caption':\n return DISPLAY.TABLE_CAPTION;\n case 'ruby-base':\n return DISPLAY.RUBY_BASE;\n case 'ruby-text':\n return DISPLAY.RUBY_TEXT;\n case 'ruby-base-container':\n return DISPLAY.RUBY_BASE_CONTAINER;\n case 'ruby-text-container':\n return DISPLAY.RUBY_TEXT_CONTAINER;\n case 'contents':\n return DISPLAY.CONTENTS;\n case 'inline-block':\n return DISPLAY.INLINE_BLOCK;\n case 'inline-list-item':\n return DISPLAY.INLINE_LIST_ITEM;\n case 'inline-table':\n return DISPLAY.INLINE_TABLE;\n case 'inline-flex':\n return DISPLAY.INLINE_FLEX;\n case 'inline-grid':\n return DISPLAY.INLINE_GRID;\n }\n\n return DISPLAY.NONE;\n};\n","import {IPropertyIdentValueDescriptor, PropertyDescriptorParsingType} from '../IPropertyDescriptor';\nimport {Context} from '../../core/context';\nexport const enum FLOAT {\n NONE = 0,\n LEFT = 1,\n RIGHT = 2,\n INLINE_START = 3,\n INLINE_END = 4\n}\n\nexport const float: IPropertyIdentValueDescriptor = {\n name: 'float',\n initialValue: 'none',\n prefix: false,\n type: PropertyDescriptorParsingType.IDENT_VALUE,\n parse: (_context: Context, float: string) => {\n switch (float) {\n case 'left':\n return FLOAT.LEFT;\n case 'right':\n return FLOAT.RIGHT;\n case 'inline-start':\n return FLOAT.INLINE_START;\n case 'inline-end':\n return FLOAT.INLINE_END;\n }\n return FLOAT.NONE;\n }\n};\n","import {IPropertyValueDescriptor, PropertyDescriptorParsingType} from '../IPropertyDescriptor';\nimport {CSSValue} from '../syntax/parser';\nimport {TokenType} from '../syntax/tokenizer';\nimport {Context} from '../../core/context';\nexport const letterSpacing: IPropertyValueDescriptor = {\n name: 'letter-spacing',\n initialValue: '0',\n prefix: false,\n type: PropertyDescriptorParsingType.VALUE,\n parse: (_context: Context, token: CSSValue) => {\n if (token.type === TokenType.IDENT_TOKEN && token.value === 'normal') {\n return 0;\n }\n\n if (token.type === TokenType.NUMBER_TOKEN) {\n return token.number;\n }\n\n if (token.type === TokenType.DIMENSION_TOKEN) {\n return token.number;\n }\n\n return 0;\n }\n};\n","import {IPropertyIdentValueDescriptor, PropertyDescriptorParsingType} from '../IPropertyDescriptor';\nimport {Context} from '../../core/context';\nexport enum WORD_BREAK {\n NORMAL = 'normal',\n BREAK_ALL = 'break-all',\n KEEP_ALL = 'keep-all'\n}\n\nexport const wordBreak: IPropertyIdentValueDescriptor = {\n name: 'word-break',\n initialValue: 'normal',\n prefix: false,\n type: PropertyDescriptorParsingType.IDENT_VALUE,\n parse: (_context: Context, wordBreak: string): WORD_BREAK => {\n switch (wordBreak) {\n case 'break-all':\n return WORD_BREAK.BREAK_ALL;\n case 'keep-all':\n return WORD_BREAK.KEEP_ALL;\n case 'normal':\n default:\n return WORD_BREAK.NORMAL;\n }\n }\n};\n","import {IPropertyTokenValueDescriptor, PropertyDescriptorParsingType} from '../IPropertyDescriptor';\nimport {CSSValue, isIdentToken} from '../syntax/parser';\nimport {TokenType} from '../syntax/tokenizer';\nimport {getAbsoluteValue, isLengthPercentage} from '../types/length-percentage';\nexport const lineHeight: IPropertyTokenValueDescriptor = {\n name: 'line-height',\n initialValue: 'normal',\n prefix: false,\n type: PropertyDescriptorParsingType.TOKEN_VALUE\n};\n\nexport const computeLineHeight = (token: CSSValue, fontSize: number): number => {\n if (isIdentToken(token) && token.value === 'normal') {\n return 1.2 * fontSize;\n } else if (token.type === TokenType.NUMBER_TOKEN) {\n return fontSize * token.number;\n } else if (isLengthPercentage(token)) {\n return getAbsoluteValue(token, fontSize);\n }\n\n return fontSize;\n};\n","import {TokenType} from '../syntax/tokenizer';\nimport {ICSSImage, image} from '../types/image';\nimport {IPropertyValueDescriptor, PropertyDescriptorParsingType} from '../IPropertyDescriptor';\nimport {CSSValue} from '../syntax/parser';\nimport {Context} from '../../core/context';\n\nexport const listStyleImage: IPropertyValueDescriptor = {\n name: 'list-style-image',\n initialValue: 'none',\n type: PropertyDescriptorParsingType.VALUE,\n prefix: false,\n parse: (context: Context, token: CSSValue) => {\n if (token.type === TokenType.IDENT_TOKEN && token.value === 'none') {\n return null;\n }\n\n return image.parse(context, token);\n }\n};\n","import {IPropertyIdentValueDescriptor, PropertyDescriptorParsingType} from '../IPropertyDescriptor';\nimport {Context} from '../../core/context';\nexport const enum LIST_STYLE_POSITION {\n INSIDE = 0,\n OUTSIDE = 1\n}\n\nexport const listStylePosition: IPropertyIdentValueDescriptor = {\n name: 'list-style-position',\n initialValue: 'outside',\n prefix: false,\n type: PropertyDescriptorParsingType.IDENT_VALUE,\n parse: (_context: Context, position: string) => {\n switch (position) {\n case 'inside':\n return LIST_STYLE_POSITION.INSIDE;\n case 'outside':\n default:\n return LIST_STYLE_POSITION.OUTSIDE;\n }\n }\n};\n","import {IPropertyIdentValueDescriptor, PropertyDescriptorParsingType} from '../IPropertyDescriptor';\nimport {Context} from '../../core/context';\nexport const enum LIST_STYLE_TYPE {\n NONE = -1,\n DISC = 0,\n CIRCLE = 1,\n SQUARE = 2,\n DECIMAL = 3,\n CJK_DECIMAL = 4,\n DECIMAL_LEADING_ZERO = 5,\n LOWER_ROMAN = 6,\n UPPER_ROMAN = 7,\n LOWER_GREEK = 8,\n LOWER_ALPHA = 9,\n UPPER_ALPHA = 10,\n ARABIC_INDIC = 11,\n ARMENIAN = 12,\n BENGALI = 13,\n CAMBODIAN = 14,\n CJK_EARTHLY_BRANCH = 15,\n CJK_HEAVENLY_STEM = 16,\n CJK_IDEOGRAPHIC = 17,\n DEVANAGARI = 18,\n ETHIOPIC_NUMERIC = 19,\n GEORGIAN = 20,\n GUJARATI = 21,\n GURMUKHI = 22,\n HEBREW = 22,\n HIRAGANA = 23,\n HIRAGANA_IROHA = 24,\n JAPANESE_FORMAL = 25,\n JAPANESE_INFORMAL = 26,\n KANNADA = 27,\n KATAKANA = 28,\n KATAKANA_IROHA = 29,\n KHMER = 30,\n KOREAN_HANGUL_FORMAL = 31,\n KOREAN_HANJA_FORMAL = 32,\n KOREAN_HANJA_INFORMAL = 33,\n LAO = 34,\n LOWER_ARMENIAN = 35,\n MALAYALAM = 36,\n MONGOLIAN = 37,\n MYANMAR = 38,\n ORIYA = 39,\n PERSIAN = 40,\n SIMP_CHINESE_FORMAL = 41,\n SIMP_CHINESE_INFORMAL = 42,\n TAMIL = 43,\n TELUGU = 44,\n THAI = 45,\n TIBETAN = 46,\n TRAD_CHINESE_FORMAL = 47,\n TRAD_CHINESE_INFORMAL = 48,\n UPPER_ARMENIAN = 49,\n DISCLOSURE_OPEN = 50,\n DISCLOSURE_CLOSED = 51\n}\n\nexport const listStyleType: IPropertyIdentValueDescriptor = {\n name: 'list-style-type',\n initialValue: 'none',\n prefix: false,\n type: PropertyDescriptorParsingType.IDENT_VALUE,\n parse: (_context: Context, type: string) => {\n switch (type) {\n case 'disc':\n return LIST_STYLE_TYPE.DISC;\n case 'circle':\n return LIST_STYLE_TYPE.CIRCLE;\n case 'square':\n return LIST_STYLE_TYPE.SQUARE;\n case 'decimal':\n return LIST_STYLE_TYPE.DECIMAL;\n case 'cjk-decimal':\n return LIST_STYLE_TYPE.CJK_DECIMAL;\n case 'decimal-leading-zero':\n return LIST_STYLE_TYPE.DECIMAL_LEADING_ZERO;\n case 'lower-roman':\n return LIST_STYLE_TYPE.LOWER_ROMAN;\n case 'upper-roman':\n return LIST_STYLE_TYPE.UPPER_ROMAN;\n case 'lower-greek':\n return LIST_STYLE_TYPE.LOWER_GREEK;\n case 'lower-alpha':\n return LIST_STYLE_TYPE.LOWER_ALPHA;\n case 'upper-alpha':\n return LIST_STYLE_TYPE.UPPER_ALPHA;\n case 'arabic-indic':\n return LIST_STYLE_TYPE.ARABIC_INDIC;\n case 'armenian':\n return LIST_STYLE_TYPE.ARMENIAN;\n case 'bengali':\n return LIST_STYLE_TYPE.BENGALI;\n case 'cambodian':\n return LIST_STYLE_TYPE.CAMBODIAN;\n case 'cjk-earthly-branch':\n return LIST_STYLE_TYPE.CJK_EARTHLY_BRANCH;\n case 'cjk-heavenly-stem':\n return LIST_STYLE_TYPE.CJK_HEAVENLY_STEM;\n case 'cjk-ideographic':\n return LIST_STYLE_TYPE.CJK_IDEOGRAPHIC;\n case 'devanagari':\n return LIST_STYLE_TYPE.DEVANAGARI;\n case 'ethiopic-numeric':\n return LIST_STYLE_TYPE.ETHIOPIC_NUMERIC;\n case 'georgian':\n return LIST_STYLE_TYPE.GEORGIAN;\n case 'gujarati':\n return LIST_STYLE_TYPE.GUJARATI;\n case 'gurmukhi':\n return LIST_STYLE_TYPE.GURMUKHI;\n case 'hebrew':\n return LIST_STYLE_TYPE.HEBREW;\n case 'hiragana':\n return LIST_STYLE_TYPE.HIRAGANA;\n case 'hiragana-iroha':\n return LIST_STYLE_TYPE.HIRAGANA_IROHA;\n case 'japanese-formal':\n return LIST_STYLE_TYPE.JAPANESE_FORMAL;\n case 'japanese-informal':\n return LIST_STYLE_TYPE.JAPANESE_INFORMAL;\n case 'kannada':\n return LIST_STYLE_TYPE.KANNADA;\n case 'katakana':\n return LIST_STYLE_TYPE.KATAKANA;\n case 'katakana-iroha':\n return LIST_STYLE_TYPE.KATAKANA_IROHA;\n case 'khmer':\n return LIST_STYLE_TYPE.KHMER;\n case 'korean-hangul-formal':\n return LIST_STYLE_TYPE.KOREAN_HANGUL_FORMAL;\n case 'korean-hanja-formal':\n return LIST_STYLE_TYPE.KOREAN_HANJA_FORMAL;\n case 'korean-hanja-informal':\n return LIST_STYLE_TYPE.KOREAN_HANJA_INFORMAL;\n case 'lao':\n return LIST_STYLE_TYPE.LAO;\n case 'lower-armenian':\n return LIST_STYLE_TYPE.LOWER_ARMENIAN;\n case 'malayalam':\n return LIST_STYLE_TYPE.MALAYALAM;\n case 'mongolian':\n return LIST_STYLE_TYPE.MONGOLIAN;\n case 'myanmar':\n return LIST_STYLE_TYPE.MYANMAR;\n case 'oriya':\n return LIST_STYLE_TYPE.ORIYA;\n case 'persian':\n return LIST_STYLE_TYPE.PERSIAN;\n case 'simp-chinese-formal':\n return LIST_STYLE_TYPE.SIMP_CHINESE_FORMAL;\n case 'simp-chinese-informal':\n return LIST_STYLE_TYPE.SIMP_CHINESE_INFORMAL;\n case 'tamil':\n return LIST_STYLE_TYPE.TAMIL;\n case 'telugu':\n return LIST_STYLE_TYPE.TELUGU;\n case 'thai':\n return LIST_STYLE_TYPE.THAI;\n case 'tibetan':\n return LIST_STYLE_TYPE.TIBETAN;\n case 'trad-chinese-formal':\n return LIST_STYLE_TYPE.TRAD_CHINESE_FORMAL;\n case 'trad-chinese-informal':\n return LIST_STYLE_TYPE.TRAD_CHINESE_INFORMAL;\n case 'upper-armenian':\n return LIST_STYLE_TYPE.UPPER_ARMENIAN;\n case 'disclosure-open':\n return LIST_STYLE_TYPE.DISCLOSURE_OPEN;\n case 'disclosure-closed':\n return LIST_STYLE_TYPE.DISCLOSURE_CLOSED;\n case 'none':\n default:\n return LIST_STYLE_TYPE.NONE;\n }\n }\n};\n","import {IPropertyTokenValueDescriptor, PropertyDescriptorParsingType} from '../IPropertyDescriptor';\n\nconst marginForSide = (side: string): IPropertyTokenValueDescriptor => ({\n name: `margin-${side}`,\n initialValue: '0',\n prefix: false,\n type: PropertyDescriptorParsingType.TOKEN_VALUE\n});\n\nexport const marginTop: IPropertyTokenValueDescriptor = marginForSide('top');\nexport const marginRight: IPropertyTokenValueDescriptor = marginForSide('right');\nexport const marginBottom: IPropertyTokenValueDescriptor = marginForSide('bottom');\nexport const marginLeft: IPropertyTokenValueDescriptor = marginForSide('left');\n","import {IPropertyListDescriptor, PropertyDescriptorParsingType} from '../IPropertyDescriptor';\nimport {CSSValue, isIdentToken} from '../syntax/parser';\nimport {Context} from '../../core/context';\nexport const enum OVERFLOW {\n VISIBLE = 0,\n HIDDEN = 1,\n SCROLL = 2,\n CLIP = 3,\n AUTO = 4\n}\n\nexport const overflow: IPropertyListDescriptor = {\n name: 'overflow',\n initialValue: 'visible',\n prefix: false,\n type: PropertyDescriptorParsingType.LIST,\n parse: (_context: Context, tokens: CSSValue[]): OVERFLOW[] => {\n return tokens.filter(isIdentToken).map((overflow) => {\n switch (overflow.value) {\n case 'hidden':\n return OVERFLOW.HIDDEN;\n case 'scroll':\n return OVERFLOW.SCROLL;\n case 'clip':\n return OVERFLOW.CLIP;\n case 'auto':\n return OVERFLOW.AUTO;\n case 'visible':\n default:\n return OVERFLOW.VISIBLE;\n }\n });\n }\n};\n","import {IPropertyIdentValueDescriptor, PropertyDescriptorParsingType} from '../IPropertyDescriptor';\nimport {Context} from '../../core/context';\nexport const enum OVERFLOW_WRAP {\n NORMAL = 'normal',\n BREAK_WORD = 'break-word'\n}\n\nexport const overflowWrap: IPropertyIdentValueDescriptor = {\n name: 'overflow-wrap',\n initialValue: 'normal',\n prefix: false,\n type: PropertyDescriptorParsingType.IDENT_VALUE,\n parse: (_context: Context, overflow: string) => {\n switch (overflow) {\n case 'break-word':\n return OVERFLOW_WRAP.BREAK_WORD;\n case 'normal':\n default:\n return OVERFLOW_WRAP.NORMAL;\n }\n }\n};\n","import {IPropertyTypeValueDescriptor, PropertyDescriptorParsingType} from '../IPropertyDescriptor';\n\nconst paddingForSide = (side: string): IPropertyTypeValueDescriptor => ({\n name: `padding-${side}`,\n initialValue: '0',\n prefix: false,\n type: PropertyDescriptorParsingType.TYPE_VALUE,\n format: 'length-percentage'\n});\n\nexport const paddingTop: IPropertyTypeValueDescriptor = paddingForSide('top');\nexport const paddingRight: IPropertyTypeValueDescriptor = paddingForSide('right');\nexport const paddingBottom: IPropertyTypeValueDescriptor = paddingForSide('bottom');\nexport const paddingLeft: IPropertyTypeValueDescriptor = paddingForSide('left');\n","import {IPropertyIdentValueDescriptor, PropertyDescriptorParsingType} from '../IPropertyDescriptor';\nimport {Context} from '../../core/context';\nexport const enum TEXT_ALIGN {\n LEFT = 0,\n CENTER = 1,\n RIGHT = 2\n}\n\nexport const textAlign: IPropertyIdentValueDescriptor = {\n name: 'text-align',\n initialValue: 'left',\n prefix: false,\n type: PropertyDescriptorParsingType.IDENT_VALUE,\n parse: (_context: Context, textAlign: string) => {\n switch (textAlign) {\n case 'right':\n return TEXT_ALIGN.RIGHT;\n case 'center':\n case 'justify':\n return TEXT_ALIGN.CENTER;\n case 'left':\n default:\n return TEXT_ALIGN.LEFT;\n }\n }\n};\n","import {IPropertyIdentValueDescriptor, PropertyDescriptorParsingType} from '../IPropertyDescriptor';\nimport {Context} from '../../core/context';\nexport const enum POSITION {\n STATIC = 0,\n RELATIVE = 1,\n ABSOLUTE = 2,\n FIXED = 3,\n STICKY = 4\n}\n\nexport const position: IPropertyIdentValueDescriptor = {\n name: 'position',\n initialValue: 'static',\n prefix: false,\n type: PropertyDescriptorParsingType.IDENT_VALUE,\n parse: (_context: Context, position: string) => {\n switch (position) {\n case 'relative':\n return POSITION.RELATIVE;\n case 'absolute':\n return POSITION.ABSOLUTE;\n case 'fixed':\n return POSITION.FIXED;\n case 'sticky':\n return POSITION.STICKY;\n }\n\n return POSITION.STATIC;\n }\n};\n","import {PropertyDescriptorParsingType, IPropertyListDescriptor} from '../IPropertyDescriptor';\nimport {CSSValue, isIdentWithValue, parseFunctionArgs} from '../syntax/parser';\nimport {ZERO_LENGTH} from '../types/length-percentage';\nimport {color, Color, COLORS} from '../types/color';\nimport {isLength, Length} from '../types/length';\nimport {Context} from '../../core/context';\n\nexport type TextShadow = TextShadowItem[];\ninterface TextShadowItem {\n color: Color;\n offsetX: Length;\n offsetY: Length;\n blur: Length;\n}\n\nexport const textShadow: IPropertyListDescriptor = {\n name: 'text-shadow',\n initialValue: 'none',\n type: PropertyDescriptorParsingType.LIST,\n prefix: false,\n parse: (context: Context, tokens: CSSValue[]): TextShadow => {\n if (tokens.length === 1 && isIdentWithValue(tokens[0], 'none')) {\n return [];\n }\n\n return parseFunctionArgs(tokens).map((values: CSSValue[]) => {\n const shadow: TextShadowItem = {\n color: COLORS.TRANSPARENT,\n offsetX: ZERO_LENGTH,\n offsetY: ZERO_LENGTH,\n blur: ZERO_LENGTH\n };\n let c = 0;\n for (let i = 0; i < values.length; i++) {\n const token = values[i];\n if (isLength(token)) {\n if (c === 0) {\n shadow.offsetX = token;\n } else if (c === 1) {\n shadow.offsetY = token;\n } else {\n shadow.blur = token;\n }\n c++;\n } else {\n shadow.color = color.parse(context, token);\n }\n }\n return shadow;\n });\n }\n};\n","import {IPropertyIdentValueDescriptor, PropertyDescriptorParsingType} from '../IPropertyDescriptor';\nimport {Context} from '../../core/context';\nexport const enum TEXT_TRANSFORM {\n NONE = 0,\n LOWERCASE = 1,\n UPPERCASE = 2,\n CAPITALIZE = 3\n}\n\nexport const textTransform: IPropertyIdentValueDescriptor = {\n name: 'text-transform',\n initialValue: 'none',\n prefix: false,\n type: PropertyDescriptorParsingType.IDENT_VALUE,\n parse: (_context: Context, textTransform: string) => {\n switch (textTransform) {\n case 'uppercase':\n return TEXT_TRANSFORM.UPPERCASE;\n case 'lowercase':\n return TEXT_TRANSFORM.LOWERCASE;\n case 'capitalize':\n return TEXT_TRANSFORM.CAPITALIZE;\n }\n\n return TEXT_TRANSFORM.NONE;\n }\n};\n","import {IPropertyValueDescriptor, PropertyDescriptorParsingType} from '../IPropertyDescriptor';\nimport {CSSValue} from '../syntax/parser';\nimport {NumberValueToken, TokenType} from '../syntax/tokenizer';\nimport {Context} from '../../core/context';\nexport type Matrix = [number, number, number, number, number, number];\nexport type Transform = Matrix | null;\n\nexport const transform: IPropertyValueDescriptor = {\n name: 'transform',\n initialValue: 'none',\n prefix: true,\n type: PropertyDescriptorParsingType.VALUE,\n parse: (_context: Context, token: CSSValue) => {\n if (token.type === TokenType.IDENT_TOKEN && token.value === 'none') {\n return null;\n }\n\n if (token.type === TokenType.FUNCTION) {\n const transformFunction = SUPPORTED_TRANSFORM_FUNCTIONS[token.name];\n if (typeof transformFunction === 'undefined') {\n throw new Error(`Attempting to parse an unsupported transform function \"${token.name}\"`);\n }\n return transformFunction(token.values);\n }\n\n return null;\n }\n};\n\nconst matrix = (args: CSSValue[]): Transform => {\n const values = args.filter((arg) => arg.type === TokenType.NUMBER_TOKEN).map((arg: NumberValueToken) => arg.number);\n\n return values.length === 6 ? (values as Matrix) : null;\n};\n\n// doesn't support 3D transforms at the moment\nconst matrix3d = (args: CSSValue[]): Transform => {\n const values = args.filter((arg) => arg.type === TokenType.NUMBER_TOKEN).map((arg: NumberValueToken) => arg.number);\n\n const [a1, b1, {}, {}, a2, b2, {}, {}, {}, {}, {}, {}, a4, b4, {}, {}] = values;\n\n return values.length === 16 ? [a1, b1, a2, b2, a4, b4] : null;\n};\n\nconst SUPPORTED_TRANSFORM_FUNCTIONS: {\n [key: string]: (args: CSSValue[]) => Transform;\n} = {\n matrix: matrix,\n matrix3d: matrix3d\n};\n","import {IPropertyListDescriptor, PropertyDescriptorParsingType} from '../IPropertyDescriptor';\nimport {CSSValue} from '../syntax/parser';\nimport {isLengthPercentage, LengthPercentage} from '../types/length-percentage';\nimport {FLAG_INTEGER, TokenType} from '../syntax/tokenizer';\nimport {Context} from '../../core/context';\nexport type TransformOrigin = [LengthPercentage, LengthPercentage];\n\nconst DEFAULT_VALUE: LengthPercentage = {\n type: TokenType.PERCENTAGE_TOKEN,\n number: 50,\n flags: FLAG_INTEGER\n};\nconst DEFAULT: TransformOrigin = [DEFAULT_VALUE, DEFAULT_VALUE];\n\nexport const transformOrigin: IPropertyListDescriptor = {\n name: 'transform-origin',\n initialValue: '50% 50%',\n prefix: true,\n type: PropertyDescriptorParsingType.LIST,\n parse: (_context: Context, tokens: CSSValue[]) => {\n const origins: LengthPercentage[] = tokens.filter(isLengthPercentage);\n\n if (origins.length !== 2) {\n return DEFAULT;\n }\n\n return [origins[0], origins[1]];\n }\n};\n","import {IPropertyIdentValueDescriptor, PropertyDescriptorParsingType} from '../IPropertyDescriptor';\nimport {Context} from '../../core/context';\nexport const enum VISIBILITY {\n VISIBLE = 0,\n HIDDEN = 1,\n COLLAPSE = 2\n}\n\nexport const visibility: IPropertyIdentValueDescriptor = {\n name: 'visible',\n initialValue: 'none',\n prefix: false,\n type: PropertyDescriptorParsingType.IDENT_VALUE,\n parse: (_context: Context, visibility: string) => {\n switch (visibility) {\n case 'hidden':\n return VISIBILITY.HIDDEN;\n case 'collapse':\n return VISIBILITY.COLLAPSE;\n case 'visible':\n default:\n return VISIBILITY.VISIBLE;\n }\n }\n};\n","const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n\n// Use a lookup table to find the index.\nconst lookup = typeof Uint8Array === 'undefined' ? [] : new Uint8Array(256);\nfor (let i = 0; i < chars.length; i++) {\n lookup[chars.charCodeAt(i)] = i;\n}\n\nexport const decode = (base64: string): ArrayBuffer | number[] => {\n let bufferLength = base64.length * 0.75,\n len = base64.length,\n i,\n p = 0,\n encoded1,\n encoded2,\n encoded3,\n encoded4;\n\n if (base64[base64.length - 1] === '=') {\n bufferLength--;\n if (base64[base64.length - 2] === '=') {\n bufferLength--;\n }\n }\n\n const buffer =\n typeof ArrayBuffer !== 'undefined' &&\n typeof Uint8Array !== 'undefined' &&\n typeof Uint8Array.prototype.slice !== 'undefined'\n ? new ArrayBuffer(bufferLength)\n : new Array(bufferLength);\n const bytes = Array.isArray(buffer) ? buffer : new Uint8Array(buffer);\n\n for (i = 0; i < len; i += 4) {\n encoded1 = lookup[base64.charCodeAt(i)];\n encoded2 = lookup[base64.charCodeAt(i + 1)];\n encoded3 = lookup[base64.charCodeAt(i + 2)];\n encoded4 = lookup[base64.charCodeAt(i + 3)];\n\n bytes[p++] = (encoded1 << 2) | (encoded2 >> 4);\n bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2);\n bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63);\n }\n\n return buffer;\n};\n\nexport const polyUint16Array = (buffer: number[]): number[] => {\n const length = buffer.length;\n const bytes = [];\n for (let i = 0; i < length; i += 2) {\n bytes.push((buffer[i + 1] << 8) | buffer[i]);\n }\n return bytes;\n};\n\nexport const polyUint32Array = (buffer: number[]): number[] => {\n const length = buffer.length;\n const bytes = [];\n for (let i = 0; i < length; i += 4) {\n bytes.push((buffer[i + 3] << 24) | (buffer[i + 2] << 16) | (buffer[i + 1] << 8) | buffer[i]);\n }\n return bytes;\n};\n","import {IPropertyValueDescriptor, PropertyDescriptorParsingType} from '../IPropertyDescriptor';\nimport {CSSValue, isNumberToken} from '../syntax/parser';\nimport {TokenType} from '../syntax/tokenizer';\nimport {Context} from '../../core/context';\n\ninterface zIndex {\n order: number;\n auto: boolean;\n}\n\nexport const zIndex: IPropertyValueDescriptor = {\n name: 'z-index',\n initialValue: 'auto',\n prefix: false,\n type: PropertyDescriptorParsingType.VALUE,\n parse: (_context: Context, token: CSSValue): zIndex => {\n if (token.type === TokenType.IDENT_TOKEN) {\n return {auto: true, order: 0};\n }\n\n if (isNumberToken(token)) {\n return {auto: false, order: token.number};\n }\n\n throw new Error(`Invalid z-index number parsed`);\n }\n};\n","import {CSSValue} from '../syntax/parser';\nimport {TokenType} from '../syntax/tokenizer';\nimport {ITypeDescriptor} from '../ITypeDescriptor';\nimport {Context} from '../../core/context';\n\nexport const time: ITypeDescriptor = {\n name: 'time',\n parse: (_context: Context, value: CSSValue): number => {\n if (value.type === TokenType.DIMENSION_TOKEN) {\n switch (value.unit.toLowerCase()) {\n case 's':\n return 1000 * value.number;\n case 'ms':\n return value.number;\n }\n }\n\n throw new Error(`Unsupported time type`);\n }\n};\n","import {IPropertyValueDescriptor, PropertyDescriptorParsingType} from '../IPropertyDescriptor';\nimport {CSSValue, isNumberToken} from '../syntax/parser';\nimport {Context} from '../../core/context';\nexport const opacity: IPropertyValueDescriptor = {\n name: 'opacity',\n initialValue: '1',\n type: PropertyDescriptorParsingType.VALUE,\n prefix: false,\n parse: (_context: Context, token: CSSValue): number => {\n if (isNumberToken(token)) {\n return token.number;\n }\n return 1;\n }\n};\n","import {IPropertyTypeValueDescriptor, PropertyDescriptorParsingType} from '../IPropertyDescriptor';\n\nexport const textDecorationColor: IPropertyTypeValueDescriptor = {\n name: `text-decoration-color`,\n initialValue: 'transparent',\n prefix: false,\n type: PropertyDescriptorParsingType.TYPE_VALUE,\n format: 'color'\n};\n","import {IPropertyListDescriptor, PropertyDescriptorParsingType} from '../IPropertyDescriptor';\nimport {CSSValue, isIdentToken} from '../syntax/parser';\nimport {Context} from '../../core/context';\n\nexport const enum TEXT_DECORATION_LINE {\n NONE = 0,\n UNDERLINE = 1,\n OVERLINE = 2,\n LINE_THROUGH = 3,\n BLINK = 4\n}\n\nexport type TextDecorationLine = TEXT_DECORATION_LINE[];\n\nexport const textDecorationLine: IPropertyListDescriptor = {\n name: 'text-decoration-line',\n initialValue: 'none',\n prefix: false,\n type: PropertyDescriptorParsingType.LIST,\n parse: (_context: Context, tokens: CSSValue[]): TextDecorationLine => {\n return tokens\n .filter(isIdentToken)\n .map((token) => {\n switch (token.value) {\n case 'underline':\n return TEXT_DECORATION_LINE.UNDERLINE;\n case 'overline':\n return TEXT_DECORATION_LINE.OVERLINE;\n case 'line-through':\n return TEXT_DECORATION_LINE.LINE_THROUGH;\n case 'none':\n return TEXT_DECORATION_LINE.BLINK;\n }\n return TEXT_DECORATION_LINE.NONE;\n })\n .filter((line) => line !== TEXT_DECORATION_LINE.NONE);\n }\n};\n","import {IPropertyListDescriptor, PropertyDescriptorParsingType} from '../IPropertyDescriptor';\nimport {CSSValue} from '../syntax/parser';\nimport {TokenType} from '../syntax/tokenizer';\nimport {Context} from '../../core/context';\n\nexport type FONT_FAMILY = string;\n\nexport type FontFamily = FONT_FAMILY[];\n\nexport const fontFamily: IPropertyListDescriptor = {\n name: `font-family`,\n initialValue: '',\n prefix: false,\n type: PropertyDescriptorParsingType.LIST,\n parse: (_context: Context, tokens: CSSValue[]) => {\n const accumulator: string[] = [];\n const results: string[] = [];\n tokens.forEach((token) => {\n switch (token.type) {\n case TokenType.IDENT_TOKEN:\n case TokenType.STRING_TOKEN:\n accumulator.push(token.value);\n break;\n case TokenType.NUMBER_TOKEN:\n accumulator.push(token.number.toString());\n break;\n case TokenType.COMMA_TOKEN:\n results.push(accumulator.join(' '));\n accumulator.length = 0;\n break;\n }\n });\n if (accumulator.length) {\n results.push(accumulator.join(' '));\n }\n return results.map((result) => (result.indexOf(' ') === -1 ? result : `'${result}'`));\n }\n};\n","import {IPropertyTypeValueDescriptor, PropertyDescriptorParsingType} from '../IPropertyDescriptor';\n\nexport const fontSize: IPropertyTypeValueDescriptor = {\n name: `font-size`,\n initialValue: '0',\n prefix: false,\n type: PropertyDescriptorParsingType.TYPE_VALUE,\n format: 'length'\n};\n","import {IPropertyValueDescriptor, PropertyDescriptorParsingType} from '../IPropertyDescriptor';\nimport {CSSValue, isIdentToken, isNumberToken} from '../syntax/parser';\nimport {Context} from '../../core/context';\nexport const fontWeight: IPropertyValueDescriptor = {\n name: 'font-weight',\n initialValue: 'normal',\n type: PropertyDescriptorParsingType.VALUE,\n prefix: false,\n parse: (_context: Context, token: CSSValue): number => {\n if (isNumberToken(token)) {\n return token.number;\n }\n\n if (isIdentToken(token)) {\n switch (token.value) {\n case 'bold':\n return 700;\n case 'normal':\n default:\n return 400;\n }\n }\n\n return 400;\n }\n};\n","import {IPropertyListDescriptor, PropertyDescriptorParsingType} from '../IPropertyDescriptor';\nimport {CSSValue, isIdentToken} from '../syntax/parser';\nimport {Context} from '../../core/context';\nexport const fontVariant: IPropertyListDescriptor = {\n name: 'font-variant',\n initialValue: 'none',\n type: PropertyDescriptorParsingType.LIST,\n prefix: false,\n parse: (_context: Context, tokens: CSSValue[]): string[] => {\n return tokens.filter(isIdentToken).map((token) => token.value);\n }\n};\n","import {IPropertyIdentValueDescriptor, PropertyDescriptorParsingType} from '../IPropertyDescriptor';\nimport {Context} from '../../core/context';\nexport const enum FONT_STYLE {\n NORMAL = 'normal',\n ITALIC = 'italic',\n OBLIQUE = 'oblique'\n}\n\nexport const fontStyle: IPropertyIdentValueDescriptor = {\n name: 'font-style',\n initialValue: 'normal',\n prefix: false,\n type: PropertyDescriptorParsingType.IDENT_VALUE,\n parse: (_context: Context, overflow: string) => {\n switch (overflow) {\n case 'oblique':\n return FONT_STYLE.OBLIQUE;\n case 'italic':\n return FONT_STYLE.ITALIC;\n case 'normal':\n default:\n return FONT_STYLE.NORMAL;\n }\n }\n};\n","export const contains = (bit: number, value: number): boolean => (bit & value) !== 0;\n","import {TokenType} from '../syntax/tokenizer';\nimport {IPropertyListDescriptor, PropertyDescriptorParsingType} from '../IPropertyDescriptor';\nimport {CSSValue} from '../syntax/parser';\nimport {Context} from '../../core/context';\n\nexport type Content = CSSValue[];\n\nexport const content: IPropertyListDescriptor = {\n name: 'content',\n initialValue: 'none',\n type: PropertyDescriptorParsingType.LIST,\n prefix: false,\n parse: (_context: Context, tokens: CSSValue[]) => {\n if (tokens.length === 0) {\n return [];\n }\n\n const first = tokens[0];\n\n if (first.type === TokenType.IDENT_TOKEN && first.value === 'none') {\n return [];\n }\n\n return tokens;\n }\n};\n","import {IPropertyListDescriptor, PropertyDescriptorParsingType} from '../IPropertyDescriptor';\nimport {CSSValue, isNumberToken, nonWhiteSpace} from '../syntax/parser';\nimport {TokenType} from '../syntax/tokenizer';\nimport {Context} from '../../core/context';\n\nexport interface COUNTER_INCREMENT {\n counter: string;\n increment: number;\n}\n\nexport type CounterIncrement = COUNTER_INCREMENT[] | null;\n\nexport const counterIncrement: IPropertyListDescriptor = {\n name: 'counter-increment',\n initialValue: 'none',\n prefix: true,\n type: PropertyDescriptorParsingType.LIST,\n parse: (_context: Context, tokens: CSSValue[]) => {\n if (tokens.length === 0) {\n return null;\n }\n\n const first = tokens[0];\n\n if (first.type === TokenType.IDENT_TOKEN && first.value === 'none') {\n return null;\n }\n\n const increments = [];\n const filtered = tokens.filter(nonWhiteSpace);\n\n for (let i = 0; i < filtered.length; i++) {\n const counter = filtered[i];\n const next = filtered[i + 1];\n if (counter.type === TokenType.IDENT_TOKEN) {\n const increment = next && isNumberToken(next) ? next.number : 1;\n increments.push({counter: counter.value, increment});\n }\n }\n\n return increments;\n }\n};\n","import {IPropertyListDescriptor, PropertyDescriptorParsingType} from '../IPropertyDescriptor';\nimport {CSSValue, isIdentToken, isNumberToken, nonWhiteSpace} from '../syntax/parser';\nimport {Context} from '../../core/context';\n\nexport interface COUNTER_RESET {\n counter: string;\n reset: number;\n}\n\nexport type CounterReset = COUNTER_RESET[];\n\nexport const counterReset: IPropertyListDescriptor = {\n name: 'counter-reset',\n initialValue: 'none',\n prefix: true,\n type: PropertyDescriptorParsingType.LIST,\n parse: (_context: Context, tokens: CSSValue[]) => {\n if (tokens.length === 0) {\n return [];\n }\n\n const resets = [];\n const filtered = tokens.filter(nonWhiteSpace);\n\n for (let i = 0; i < filtered.length; i++) {\n const counter = filtered[i];\n const next = filtered[i + 1];\n if (isIdentToken(counter) && counter.value !== 'none') {\n const reset = next && isNumberToken(next) ? next.number : 0;\n resets.push({counter: counter.value, reset});\n }\n }\n\n return resets;\n }\n};\n","import {IPropertyListDescriptor, PropertyDescriptorParsingType} from '../IPropertyDescriptor';\nimport {Context} from '../../core/context';\nimport {CSSValue, isDimensionToken} from '../syntax/parser';\nimport {time} from '../types/time';\n\nexport const duration: IPropertyListDescriptor = {\n name: 'duration',\n initialValue: '0s',\n prefix: false,\n type: PropertyDescriptorParsingType.LIST,\n parse: (context: Context, tokens: CSSValue[]) => {\n return tokens.filter(isDimensionToken).map((token) => time.parse(context, token));\n }\n};\n","import {IPropertyListDescriptor, PropertyDescriptorParsingType} from '../IPropertyDescriptor';\nimport {CSSValue, isStringToken} from '../syntax/parser';\nimport {TokenType} from '../syntax/tokenizer';\nimport {Context} from '../../core/context';\n\nexport interface QUOTE {\n open: string;\n close: string;\n}\n\nexport type Quotes = QUOTE[] | null;\n\nexport const quotes: IPropertyListDescriptor = {\n name: 'quotes',\n initialValue: 'none',\n prefix: true,\n type: PropertyDescriptorParsingType.LIST,\n parse: (_context: Context, tokens: CSSValue[]) => {\n if (tokens.length === 0) {\n return null;\n }\n\n const first = tokens[0];\n\n if (first.type === TokenType.IDENT_TOKEN && first.value === 'none') {\n return null;\n }\n\n const quotes = [];\n const filtered = tokens.filter(isStringToken);\n\n if (filtered.length % 2 !== 0) {\n return null;\n }\n\n for (let i = 0; i < filtered.length; i += 2) {\n const open = filtered[i].value;\n const close = filtered[i + 1].value;\n quotes.push({open, close});\n }\n\n return quotes;\n }\n};\n\nexport const getQuote = (quotes: Quotes, depth: number, open: boolean): string => {\n if (!quotes) {\n return '';\n }\n\n const quote = quotes[Math.min(depth, quotes.length - 1)];\n if (!quote) {\n return '';\n }\n\n return open ? quote.open : quote.close;\n};\n","import {PropertyDescriptorParsingType, IPropertyListDescriptor} from '../IPropertyDescriptor';\nimport {CSSValue, isIdentWithValue, parseFunctionArgs} from '../syntax/parser';\nimport {ZERO_LENGTH} from '../types/length-percentage';\nimport {color, Color} from '../types/color';\nimport {isLength, Length} from '../types/length';\nimport {Context} from '../../core/context';\n\nexport type BoxShadow = BoxShadowItem[];\ninterface BoxShadowItem {\n inset: boolean;\n color: Color;\n offsetX: Length;\n offsetY: Length;\n blur: Length;\n spread: Length;\n}\n\nexport const boxShadow: IPropertyListDescriptor = {\n name: 'box-shadow',\n initialValue: 'none',\n type: PropertyDescriptorParsingType.LIST,\n prefix: false,\n parse: (context: Context, tokens: CSSValue[]): BoxShadow => {\n if (tokens.length === 1 && isIdentWithValue(tokens[0], 'none')) {\n return [];\n }\n\n return parseFunctionArgs(tokens).map((values: CSSValue[]) => {\n const shadow: BoxShadowItem = {\n color: 0x000000ff,\n offsetX: ZERO_LENGTH,\n offsetY: ZERO_LENGTH,\n blur: ZERO_LENGTH,\n spread: ZERO_LENGTH,\n inset: false\n };\n let c = 0;\n for (let i = 0; i < values.length; i++) {\n const token = values[i];\n if (isIdentWithValue(token, 'inset')) {\n shadow.inset = true;\n } else if (isLength(token)) {\n if (c === 0) {\n shadow.offsetX = token;\n } else if (c === 1) {\n shadow.offsetY = token;\n } else if (c === 2) {\n shadow.blur = token;\n } else {\n shadow.spread = token;\n }\n c++;\n } else {\n shadow.color = color.parse(context, token);\n }\n }\n return shadow;\n });\n }\n};\n","import {IPropertyListDescriptor, PropertyDescriptorParsingType} from '../IPropertyDescriptor';\nimport {CSSValue, isIdentToken} from '../syntax/parser';\nimport {Context} from '../../core/context';\nexport const enum PAINT_ORDER_LAYER {\n FILL,\n STROKE,\n MARKERS\n}\n\nexport type PaintOrder = PAINT_ORDER_LAYER[];\n\nexport const paintOrder: IPropertyListDescriptor = {\n name: 'paint-order',\n initialValue: 'normal',\n prefix: false,\n type: PropertyDescriptorParsingType.LIST,\n parse: (_context: Context, tokens: CSSValue[]): PaintOrder => {\n const DEFAULT_VALUE = [PAINT_ORDER_LAYER.FILL, PAINT_ORDER_LAYER.STROKE, PAINT_ORDER_LAYER.MARKERS];\n const layers: PaintOrder = [];\n\n tokens.filter(isIdentToken).forEach((token) => {\n switch (token.value) {\n case 'stroke':\n layers.push(PAINT_ORDER_LAYER.STROKE);\n break;\n case 'fill':\n layers.push(PAINT_ORDER_LAYER.FILL);\n break;\n case 'markers':\n layers.push(PAINT_ORDER_LAYER.MARKERS);\n break;\n }\n });\n DEFAULT_VALUE.forEach((value) => {\n if (layers.indexOf(value) === -1) {\n layers.push(value);\n }\n });\n\n return layers;\n }\n};\n","import {IPropertyTypeValueDescriptor, PropertyDescriptorParsingType} from '../IPropertyDescriptor';\nexport const webkitTextStrokeColor: IPropertyTypeValueDescriptor = {\n name: `-webkit-text-stroke-color`,\n initialValue: 'currentcolor',\n prefix: false,\n type: PropertyDescriptorParsingType.TYPE_VALUE,\n format: 'color'\n};\n","import {CSSValue, isDimensionToken} from '../syntax/parser';\nimport {IPropertyValueDescriptor, PropertyDescriptorParsingType} from '../IPropertyDescriptor';\nimport {Context} from '../../core/context';\nexport const webkitTextStrokeWidth: IPropertyValueDescriptor = {\n name: `-webkit-text-stroke-width`,\n initialValue: '0',\n type: PropertyDescriptorParsingType.VALUE,\n prefix: false,\n parse: (_context: Context, token: CSSValue): number => {\n if (isDimensionToken(token)) {\n return token.number;\n }\n return 0;\n }\n};\n","import {CSSPropertyDescriptor, PropertyDescriptorParsingType} from './IPropertyDescriptor';\nimport {backgroundClip} from './property-descriptors/background-clip';\nimport {backgroundColor} from './property-descriptors/background-color';\nimport {backgroundImage} from './property-descriptors/background-image';\nimport {backgroundOrigin} from './property-descriptors/background-origin';\nimport {backgroundPosition} from './property-descriptors/background-position';\nimport {backgroundRepeat} from './property-descriptors/background-repeat';\nimport {backgroundSize} from './property-descriptors/background-size';\nimport {\n borderBottomColor,\n borderLeftColor,\n borderRightColor,\n borderTopColor\n} from './property-descriptors/border-color';\nimport {\n borderBottomLeftRadius,\n borderBottomRightRadius,\n borderTopLeftRadius,\n borderTopRightRadius\n} from './property-descriptors/border-radius';\nimport {\n borderBottomStyle,\n borderLeftStyle,\n borderRightStyle,\n borderTopStyle\n} from './property-descriptors/border-style';\nimport {\n borderBottomWidth,\n borderLeftWidth,\n borderRightWidth,\n borderTopWidth\n} from './property-descriptors/border-width';\nimport {color} from './property-descriptors/color';\nimport {direction} from './property-descriptors/direction';\nimport {display, DISPLAY} from './property-descriptors/display';\nimport {float, FLOAT} from './property-descriptors/float';\nimport {letterSpacing} from './property-descriptors/letter-spacing';\nimport {lineBreak} from './property-descriptors/line-break';\nimport {lineHeight} from './property-descriptors/line-height';\nimport {listStyleImage} from './property-descriptors/list-style-image';\nimport {listStylePosition} from './property-descriptors/list-style-position';\nimport {listStyleType} from './property-descriptors/list-style-type';\nimport {marginBottom, marginLeft, marginRight, marginTop} from './property-descriptors/margin';\nimport {overflow, OVERFLOW} from './property-descriptors/overflow';\nimport {overflowWrap} from './property-descriptors/overflow-wrap';\nimport {paddingBottom, paddingLeft, paddingRight, paddingTop} from './property-descriptors/padding';\nimport {textAlign} from './property-descriptors/text-align';\nimport {position, POSITION} from './property-descriptors/position';\nimport {textShadow} from './property-descriptors/text-shadow';\nimport {textTransform} from './property-descriptors/text-transform';\nimport {transform} from './property-descriptors/transform';\nimport {transformOrigin} from './property-descriptors/transform-origin';\nimport {visibility, VISIBILITY} from './property-descriptors/visibility';\nimport {wordBreak} from './property-descriptors/word-break';\nimport {zIndex} from './property-descriptors/z-index';\nimport {CSSValue, isIdentToken, Parser} from './syntax/parser';\nimport {Tokenizer} from './syntax/tokenizer';\nimport {Color, color as colorType, isTransparent} from './types/color';\nimport {angle} from './types/angle';\nimport {image} from './types/image';\nimport {time} from './types/time';\nimport {opacity} from './property-descriptors/opacity';\nimport {textDecorationColor} from './property-descriptors/text-decoration-color';\nimport {textDecorationLine} from './property-descriptors/text-decoration-line';\nimport {isLengthPercentage, LengthPercentage, ZERO_LENGTH} from './types/length-percentage';\nimport {fontFamily} from './property-descriptors/font-family';\nimport {fontSize} from './property-descriptors/font-size';\nimport {isLength} from './types/length';\nimport {fontWeight} from './property-descriptors/font-weight';\nimport {fontVariant} from './property-descriptors/font-variant';\nimport {fontStyle} from './property-descriptors/font-style';\nimport {contains} from '../core/bitwise';\nimport {content} from './property-descriptors/content';\nimport {counterIncrement} from './property-descriptors/counter-increment';\nimport {counterReset} from './property-descriptors/counter-reset';\nimport {duration} from './property-descriptors/duration';\nimport {quotes} from './property-descriptors/quotes';\nimport {boxShadow} from './property-descriptors/box-shadow';\nimport {paintOrder} from './property-descriptors/paint-order';\nimport {webkitTextStrokeColor} from './property-descriptors/webkit-text-stroke-color';\nimport {webkitTextStrokeWidth} from './property-descriptors/webkit-text-stroke-width';\nimport {Context} from '../core/context';\n\nexport class CSSParsedDeclaration {\n animationDuration: ReturnType;\n backgroundClip: ReturnType;\n backgroundColor: Color;\n backgroundImage: ReturnType;\n backgroundOrigin: ReturnType;\n backgroundPosition: ReturnType;\n backgroundRepeat: ReturnType;\n backgroundSize: ReturnType;\n borderTopColor: Color;\n borderRightColor: Color;\n borderBottomColor: Color;\n borderLeftColor: Color;\n borderTopLeftRadius: ReturnType;\n borderTopRightRadius: ReturnType;\n borderBottomRightRadius: ReturnType;\n borderBottomLeftRadius: ReturnType;\n borderTopStyle: ReturnType;\n borderRightStyle: ReturnType;\n borderBottomStyle: ReturnType;\n borderLeftStyle: ReturnType;\n borderTopWidth: ReturnType;\n borderRightWidth: ReturnType;\n borderBottomWidth: ReturnType;\n borderLeftWidth: ReturnType;\n boxShadow: ReturnType;\n color: Color;\n direction: ReturnType;\n display: ReturnType;\n float: ReturnType;\n fontFamily: ReturnType;\n fontSize: LengthPercentage;\n fontStyle: ReturnType;\n fontVariant: ReturnType;\n fontWeight: ReturnType;\n letterSpacing: ReturnType;\n lineBreak: ReturnType;\n lineHeight: CSSValue;\n listStyleImage: ReturnType;\n listStylePosition: ReturnType;\n listStyleType: ReturnType;\n marginTop: CSSValue;\n marginRight: CSSValue;\n marginBottom: CSSValue;\n marginLeft: CSSValue;\n opacity: ReturnType;\n overflowX: OVERFLOW;\n overflowY: OVERFLOW;\n overflowWrap: ReturnType;\n paddingTop: LengthPercentage;\n paddingRight: LengthPercentage;\n paddingBottom: LengthPercentage;\n paddingLeft: LengthPercentage;\n paintOrder: ReturnType;\n position: ReturnType;\n textAlign: ReturnType;\n textDecorationColor: Color;\n textDecorationLine: ReturnType;\n textShadow: ReturnType;\n textTransform: ReturnType;\n transform: ReturnType;\n transformOrigin: ReturnType;\n visibility: ReturnType;\n webkitTextStrokeColor: Color;\n webkitTextStrokeWidth: ReturnType;\n wordBreak: ReturnType;\n zIndex: ReturnType;\n\n constructor(context: Context, declaration: CSSStyleDeclaration) {\n this.animationDuration = parse(context, duration, declaration.animationDuration);\n this.backgroundClip = parse(context, backgroundClip, declaration.backgroundClip);\n this.backgroundColor = parse(context, backgroundColor, declaration.backgroundColor);\n this.backgroundImage = parse(context, backgroundImage, declaration.backgroundImage);\n this.backgroundOrigin = parse(context, backgroundOrigin, declaration.backgroundOrigin);\n this.backgroundPosition = parse(context, backgroundPosition, declaration.backgroundPosition);\n this.backgroundRepeat = parse(context, backgroundRepeat, declaration.backgroundRepeat);\n this.backgroundSize = parse(context, backgroundSize, declaration.backgroundSize);\n this.borderTopColor = parse(context, borderTopColor, declaration.borderTopColor);\n this.borderRightColor = parse(context, borderRightColor, declaration.borderRightColor);\n this.borderBottomColor = parse(context, borderBottomColor, declaration.borderBottomColor);\n this.borderLeftColor = parse(context, borderLeftColor, declaration.borderLeftColor);\n this.borderTopLeftRadius = parse(context, borderTopLeftRadius, declaration.borderTopLeftRadius);\n this.borderTopRightRadius = parse(context, borderTopRightRadius, declaration.borderTopRightRadius);\n this.borderBottomRightRadius = parse(context, borderBottomRightRadius, declaration.borderBottomRightRadius);\n this.borderBottomLeftRadius = parse(context, borderBottomLeftRadius, declaration.borderBottomLeftRadius);\n this.borderTopStyle = parse(context, borderTopStyle, declaration.borderTopStyle);\n this.borderRightStyle = parse(context, borderRightStyle, declaration.borderRightStyle);\n this.borderBottomStyle = parse(context, borderBottomStyle, declaration.borderBottomStyle);\n this.borderLeftStyle = parse(context, borderLeftStyle, declaration.borderLeftStyle);\n this.borderTopWidth = parse(context, borderTopWidth, declaration.borderTopWidth);\n this.borderRightWidth = parse(context, borderRightWidth, declaration.borderRightWidth);\n this.borderBottomWidth = parse(context, borderBottomWidth, declaration.borderBottomWidth);\n this.borderLeftWidth = parse(context, borderLeftWidth, declaration.borderLeftWidth);\n this.boxShadow = parse(context, boxShadow, declaration.boxShadow);\n this.color = parse(context, color, declaration.color);\n this.direction = parse(context, direction, declaration.direction);\n this.display = parse(context, display, declaration.display);\n this.float = parse(context, float, declaration.cssFloat);\n this.fontFamily = parse(context, fontFamily, declaration.fontFamily);\n this.fontSize = parse(context, fontSize, declaration.fontSize);\n this.fontStyle = parse(context, fontStyle, declaration.fontStyle);\n this.fontVariant = parse(context, fontVariant, declaration.fontVariant);\n this.fontWeight = parse(context, fontWeight, declaration.fontWeight);\n this.letterSpacing = parse(context, letterSpacing, declaration.letterSpacing);\n this.lineBreak = parse(context, lineBreak, declaration.lineBreak);\n this.lineHeight = parse(context, lineHeight, declaration.lineHeight);\n this.listStyleImage = parse(context, listStyleImage, declaration.listStyleImage);\n this.listStylePosition = parse(context, listStylePosition, declaration.listStylePosition);\n this.listStyleType = parse(context, listStyleType, declaration.listStyleType);\n this.marginTop = parse(context, marginTop, declaration.marginTop);\n this.marginRight = parse(context, marginRight, declaration.marginRight);\n this.marginBottom = parse(context, marginBottom, declaration.marginBottom);\n this.marginLeft = parse(context, marginLeft, declaration.marginLeft);\n this.opacity = parse(context, opacity, declaration.opacity);\n const overflowTuple = parse(context, overflow, declaration.overflow);\n this.overflowX = overflowTuple[0];\n this.overflowY = overflowTuple[overflowTuple.length > 1 ? 1 : 0];\n this.overflowWrap = parse(context, overflowWrap, declaration.overflowWrap);\n this.paddingTop = parse(context, paddingTop, declaration.paddingTop);\n this.paddingRight = parse(context, paddingRight, declaration.paddingRight);\n this.paddingBottom = parse(context, paddingBottom, declaration.paddingBottom);\n this.paddingLeft = parse(context, paddingLeft, declaration.paddingLeft);\n this.paintOrder = parse(context, paintOrder, declaration.paintOrder);\n this.position = parse(context, position, declaration.position);\n this.textAlign = parse(context, textAlign, declaration.textAlign);\n this.textDecorationColor = parse(\n context,\n textDecorationColor,\n declaration.textDecorationColor ?? declaration.color\n );\n this.textDecorationLine = parse(\n context,\n textDecorationLine,\n declaration.textDecorationLine ?? declaration.textDecoration\n );\n this.textShadow = parse(context, textShadow, declaration.textShadow);\n this.textTransform = parse(context, textTransform, declaration.textTransform);\n this.transform = parse(context, transform, declaration.transform);\n this.transformOrigin = parse(context, transformOrigin, declaration.transformOrigin);\n this.visibility = parse(context, visibility, declaration.visibility);\n this.webkitTextStrokeColor = parse(context, webkitTextStrokeColor, declaration.webkitTextStrokeColor);\n this.webkitTextStrokeWidth = parse(context, webkitTextStrokeWidth, declaration.webkitTextStrokeWidth);\n this.wordBreak = parse(context, wordBreak, declaration.wordBreak);\n this.zIndex = parse(context, zIndex, declaration.zIndex);\n }\n\n isVisible(): boolean {\n return this.display > 0 && this.opacity > 0 && this.visibility === VISIBILITY.VISIBLE;\n }\n\n isTransparent(): boolean {\n return isTransparent(this.backgroundColor);\n }\n\n isTransformed(): boolean {\n return this.transform !== null;\n }\n\n isPositioned(): boolean {\n return this.position !== POSITION.STATIC;\n }\n\n isPositionedWithZIndex(): boolean {\n return this.isPositioned() && !this.zIndex.auto;\n }\n\n isFloating(): boolean {\n return this.float !== FLOAT.NONE;\n }\n\n isInlineLevel(): boolean {\n return (\n contains(this.display, DISPLAY.INLINE) ||\n contains(this.display, DISPLAY.INLINE_BLOCK) ||\n contains(this.display, DISPLAY.INLINE_FLEX) ||\n contains(this.display, DISPLAY.INLINE_GRID) ||\n contains(this.display, DISPLAY.INLINE_LIST_ITEM) ||\n contains(this.display, DISPLAY.INLINE_TABLE)\n );\n }\n}\n\nexport class CSSParsedPseudoDeclaration {\n content: ReturnType;\n quotes: ReturnType;\n\n constructor(context: Context, declaration: CSSStyleDeclaration) {\n this.content = parse(context, content, declaration.content);\n this.quotes = parse(context, quotes, declaration.quotes);\n }\n}\n\nexport class CSSParsedCounterDeclaration {\n counterIncrement: ReturnType;\n counterReset: ReturnType;\n\n constructor(context: Context, declaration: CSSStyleDeclaration) {\n this.counterIncrement = parse(context, counterIncrement, declaration.counterIncrement);\n this.counterReset = parse(context, counterReset, declaration.counterReset);\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst parse = (context: Context, descriptor: CSSPropertyDescriptor, style?: string | null) => {\n const tokenizer = new Tokenizer();\n const value = style !== null && typeof style !== 'undefined' ? style.toString() : descriptor.initialValue;\n tokenizer.write(value);\n const parser = new Parser(tokenizer.read());\n switch (descriptor.type) {\n case PropertyDescriptorParsingType.IDENT_VALUE:\n const token = parser.parseComponentValue();\n return descriptor.parse(context, isIdentToken(token) ? token.value : descriptor.initialValue);\n case PropertyDescriptorParsingType.VALUE:\n return descriptor.parse(context, parser.parseComponentValue());\n case PropertyDescriptorParsingType.LIST:\n return descriptor.parse(context, parser.parseComponentValues());\n case PropertyDescriptorParsingType.TOKEN_VALUE:\n return parser.parseComponentValue();\n case PropertyDescriptorParsingType.TYPE_VALUE:\n switch (descriptor.format) {\n case 'angle':\n return angle.parse(context, parser.parseComponentValue());\n case 'color':\n return colorType.parse(context, parser.parseComponentValue());\n case 'image':\n return image.parse(context, parser.parseComponentValue());\n case 'length':\n const length = parser.parseComponentValue();\n return isLength(length) ? length : ZERO_LENGTH;\n case 'length-percentage':\n const value = parser.parseComponentValue();\n return isLengthPercentage(value) ? value : ZERO_LENGTH;\n case 'time':\n return time.parse(context, parser.parseComponentValue());\n }\n break;\n }\n};\n","const elementDebuggerAttribute = 'data-html2canvas-debug';\nexport const enum DebuggerType {\n NONE,\n ALL,\n CLONE,\n PARSE,\n RENDER\n}\n\nconst getElementDebugType = (element: Element): DebuggerType => {\n const attribute = element.getAttribute(elementDebuggerAttribute);\n switch (attribute) {\n case 'all':\n return DebuggerType.ALL;\n case 'clone':\n return DebuggerType.CLONE;\n case 'parse':\n return DebuggerType.PARSE;\n case 'render':\n return DebuggerType.RENDER;\n default:\n return DebuggerType.NONE;\n }\n};\n\nexport const isDebugging = (element: Element, type: Omit): boolean => {\n const elementType = getElementDebugType(element);\n return elementType === DebuggerType.ALL || type === elementType;\n};\n","import {CSSParsedDeclaration} from '../css/index';\nimport {TextContainer} from './text-container';\nimport {Bounds, parseBounds} from '../css/layout/bounds';\nimport {isHTMLElementNode} from './node-parser';\nimport {Context} from '../core/context';\nimport {DebuggerType, isDebugging} from '../core/debugger';\n\nexport const enum FLAGS {\n CREATES_STACKING_CONTEXT = 1 << 1,\n CREATES_REAL_STACKING_CONTEXT = 1 << 2,\n IS_LIST_OWNER = 1 << 3,\n DEBUG_RENDER = 1 << 4\n}\n\nexport class ElementContainer {\n readonly styles: CSSParsedDeclaration;\n readonly textNodes: TextContainer[] = [];\n readonly elements: ElementContainer[] = [];\n bounds: Bounds;\n flags = 0;\n\n constructor(protected readonly context: Context, element: Element) {\n if (isDebugging(element, DebuggerType.PARSE)) {\n debugger;\n }\n\n this.styles = new CSSParsedDeclaration(context, window.getComputedStyle(element, null));\n\n if (isHTMLElementNode(element)) {\n if (this.styles.animationDuration.some((duration) => duration > 0)) {\n element.style.animationDuration = '0s';\n }\n\n if (this.styles.transform !== null) {\n // getBoundingClientRect takes transforms into account\n element.style.transform = 'none';\n }\n }\n\n this.bounds = parseBounds(this.context, element);\n\n if (isDebugging(element, DebuggerType.RENDER)) {\n this.flags |= FLAGS.DEBUG_RENDER;\n }\n }\n}\n","const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n\n// Use a lookup table to find the index.\nconst lookup = typeof Uint8Array === 'undefined' ? [] : new Uint8Array(256);\nfor (let i = 0; i < chars.length; i++) {\n lookup[chars.charCodeAt(i)] = i;\n}\n\nexport const encode = (arraybuffer: ArrayBuffer): string => {\n let bytes = new Uint8Array(arraybuffer),\n i,\n len = bytes.length,\n base64 = '';\n\n for (i = 0; i < len; i += 3) {\n base64 += chars[bytes[i] >> 2];\n base64 += chars[((bytes[i] & 3) << 4) | (bytes[i + 1] >> 4)];\n base64 += chars[((bytes[i + 1] & 15) << 2) | (bytes[i + 2] >> 6)];\n base64 += chars[bytes[i + 2] & 63];\n }\n\n if (len % 3 === 2) {\n base64 = base64.substring(0, base64.length - 1) + '=';\n } else if (len % 3 === 1) {\n base64 = base64.substring(0, base64.length - 2) + '==';\n }\n\n return base64;\n};\n\nexport const decode = (base64: string): ArrayBuffer => {\n let bufferLength = base64.length * 0.75,\n len = base64.length,\n i,\n p = 0,\n encoded1,\n encoded2,\n encoded3,\n encoded4;\n\n if (base64[base64.length - 1] === '=') {\n bufferLength--;\n if (base64[base64.length - 2] === '=') {\n bufferLength--;\n }\n }\n\n const arraybuffer = new ArrayBuffer(bufferLength),\n bytes = new Uint8Array(arraybuffer);\n\n for (i = 0; i < len; i += 4) {\n encoded1 = lookup[base64.charCodeAt(i)];\n encoded2 = lookup[base64.charCodeAt(i + 1)];\n encoded3 = lookup[base64.charCodeAt(i + 2)];\n encoded4 = lookup[base64.charCodeAt(i + 3)];\n\n bytes[p++] = (encoded1 << 2) | (encoded2 >> 4);\n bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2);\n bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63);\n }\n\n return arraybuffer;\n};\n","import {decode, polyUint16Array, polyUint32Array} from './Util';\n\nexport type int = number;\n\n/** Shift size for getting the index-2 table offset. */\nexport const UTRIE2_SHIFT_2 = 5;\n\n/** Shift size for getting the index-1 table offset. */\nexport const UTRIE2_SHIFT_1 = 6 + 5;\n\n/**\n * Shift size for shifting left the index array values.\n * Increases possible data size with 16-bit index values at the cost\n * of compactability.\n * This requires data blocks to be aligned by UTRIE2_DATA_GRANULARITY.\n */\nexport const UTRIE2_INDEX_SHIFT = 2;\n\n/**\n * Difference between the two shift sizes,\n * for getting an index-1 offset from an index-2 offset. 6=11-5\n */\nexport const UTRIE2_SHIFT_1_2 = UTRIE2_SHIFT_1 - UTRIE2_SHIFT_2;\n\n/**\n * The part of the index-2 table for U+D800..U+DBFF stores values for\n * lead surrogate code _units_ not code _points_.\n * Values for lead surrogate code _points_ are indexed with this portion of the table.\n * Length=32=0x20=0x400>>UTRIE2_SHIFT_2. (There are 1024=0x400 lead surrogates.)\n */\nexport const UTRIE2_LSCP_INDEX_2_OFFSET = 0x10000 >> UTRIE2_SHIFT_2;\n\n/** Number of entries in a data block. 32=0x20 */\nexport const UTRIE2_DATA_BLOCK_LENGTH = 1 << UTRIE2_SHIFT_2;\n/** Mask for getting the lower bits for the in-data-block offset. */\nexport const UTRIE2_DATA_MASK = UTRIE2_DATA_BLOCK_LENGTH - 1;\n\nexport const UTRIE2_LSCP_INDEX_2_LENGTH = 0x400 >> UTRIE2_SHIFT_2;\n/** Count the lengths of both BMP pieces. 2080=0x820 */\nexport const UTRIE2_INDEX_2_BMP_LENGTH = UTRIE2_LSCP_INDEX_2_OFFSET + UTRIE2_LSCP_INDEX_2_LENGTH;\n/**\n * The 2-byte UTF-8 version of the index-2 table follows at offset 2080=0x820.\n * Length 32=0x20 for lead bytes C0..DF, regardless of UTRIE2_SHIFT_2.\n */\nexport const UTRIE2_UTF8_2B_INDEX_2_OFFSET = UTRIE2_INDEX_2_BMP_LENGTH;\nexport const UTRIE2_UTF8_2B_INDEX_2_LENGTH = 0x800 >> 6; /* U+0800 is the first code point after 2-byte UTF-8 */\n/**\n * The index-1 table, only used for supplementary code points, at offset 2112=0x840.\n * Variable length, for code points up to highStart, where the last single-value range starts.\n * Maximum length 512=0x200=0x100000>>UTRIE2_SHIFT_1.\n * (For 0x100000 supplementary code points U+10000..U+10ffff.)\n *\n * The part of the index-2 table for supplementary code points starts\n * after this index-1 table.\n *\n * Both the index-1 table and the following part of the index-2 table\n * are omitted completely if there is only BMP data.\n */\nexport const UTRIE2_INDEX_1_OFFSET = UTRIE2_UTF8_2B_INDEX_2_OFFSET + UTRIE2_UTF8_2B_INDEX_2_LENGTH;\n\n/**\n * Number of index-1 entries for the BMP. 32=0x20\n * This part of the index-1 table is omitted from the serialized form.\n */\nexport const UTRIE2_OMITTED_BMP_INDEX_1_LENGTH = 0x10000 >> UTRIE2_SHIFT_1;\n\n/** Number of entries in an index-2 block. 64=0x40 */\nexport const UTRIE2_INDEX_2_BLOCK_LENGTH = 1 << UTRIE2_SHIFT_1_2;\n/** Mask for getting the lower bits for the in-index-2-block offset. */\nexport const UTRIE2_INDEX_2_MASK = UTRIE2_INDEX_2_BLOCK_LENGTH - 1;\n\nconst slice16 = (view: number[] | Uint16Array, start: number, end?: number) => {\n if (view.slice) {\n return view.slice(start, end);\n }\n\n return new Uint16Array(Array.prototype.slice.call(view, start, end));\n};\n\nconst slice32 = (view: number[] | Uint32Array, start: number, end?: number) => {\n if (view.slice) {\n return view.slice(start, end);\n }\n\n return new Uint32Array(Array.prototype.slice.call(view, start, end));\n};\n\nexport const createTrieFromBase64 = (base64: string, _byteLength: number): Trie => {\n const buffer = decode(base64);\n const view32 = Array.isArray(buffer) ? polyUint32Array(buffer) : new Uint32Array(buffer);\n const view16 = Array.isArray(buffer) ? polyUint16Array(buffer) : new Uint16Array(buffer);\n const headerLength = 24;\n\n const index = slice16(view16, headerLength / 2, view32[4] / 2);\n const data =\n view32[5] === 2\n ? slice16(view16, (headerLength + view32[4]) / 2)\n : slice32(view32, Math.ceil((headerLength + view32[4]) / 4));\n\n return new Trie(view32[0], view32[1], view32[2], view32[3], index, data);\n};\n\nexport class Trie {\n initialValue: int;\n errorValue: int;\n highStart: int;\n highValueIndex: int;\n index: Uint16Array | number[];\n data: Uint32Array | Uint16Array | number[];\n\n constructor(\n initialValue: int,\n errorValue: int,\n highStart: int,\n highValueIndex: int,\n index: Uint16Array | number[],\n data: Uint32Array | Uint16Array | number[]\n ) {\n this.initialValue = initialValue;\n this.errorValue = errorValue;\n this.highStart = highStart;\n this.highValueIndex = highValueIndex;\n this.index = index;\n this.data = data;\n }\n\n /**\n * Get the value for a code point as stored in the Trie.\n *\n * @param codePoint the code point\n * @return the value\n */\n get(codePoint: number): number {\n let ix;\n if (codePoint >= 0) {\n if (codePoint < 0x0d800 || (codePoint > 0x0dbff && codePoint <= 0x0ffff)) {\n // Ordinary BMP code point, excluding leading surrogates.\n // BMP uses a single level lookup. BMP index starts at offset 0 in the Trie2 index.\n // 16 bit data is stored in the index array itself.\n ix = this.index[codePoint >> UTRIE2_SHIFT_2];\n ix = (ix << UTRIE2_INDEX_SHIFT) + (codePoint & UTRIE2_DATA_MASK);\n return this.data[ix];\n }\n\n if (codePoint <= 0xffff) {\n // Lead Surrogate Code Point. A Separate index section is stored for\n // lead surrogate code units and code points.\n // The main index has the code unit data.\n // For this function, we need the code point data.\n // Note: this expression could be refactored for slightly improved efficiency, but\n // surrogate code points will be so rare in practice that it's not worth it.\n ix = this.index[UTRIE2_LSCP_INDEX_2_OFFSET + ((codePoint - 0xd800) >> UTRIE2_SHIFT_2)];\n ix = (ix << UTRIE2_INDEX_SHIFT) + (codePoint & UTRIE2_DATA_MASK);\n return this.data[ix];\n }\n\n if (codePoint < this.highStart) {\n // Supplemental code point, use two-level lookup.\n ix = UTRIE2_INDEX_1_OFFSET - UTRIE2_OMITTED_BMP_INDEX_1_LENGTH + (codePoint >> UTRIE2_SHIFT_1);\n ix = this.index[ix];\n ix += (codePoint >> UTRIE2_SHIFT_2) & UTRIE2_INDEX_2_MASK;\n ix = this.index[ix];\n ix = (ix << UTRIE2_INDEX_SHIFT) + (codePoint & UTRIE2_DATA_MASK);\n return this.data[ix];\n }\n if (codePoint <= 0x10ffff) {\n return this.data[this.highValueIndex];\n }\n }\n\n // Fall through. The code point is outside of the legal range of 0..0x10ffff.\n return this.errorValue;\n }\n}\n","import {base64, byteLength} from './grapheme-break-trie';\nimport {createTrieFromBase64} from 'utrie';\n\nconst Other = 0;\nconst Prepend = 1;\nconst CR = 2;\nconst LF = 3;\nconst Control = 4;\nconst Extend = 5;\nconst Regional_Indicator = 6;\nconst SpacingMark = 7;\nconst L = 8;\nconst V = 9;\nconst T = 10;\nconst LV = 11;\nconst LVT = 12;\nconst ZWJ = 13;\nconst Extended_Pictographic = 14;\nconst RI = 15;\n\nexport const classes: {[key: string]: number} = {\n Other,\n Prepend,\n CR,\n LF,\n Control,\n Extend,\n Regional_Indicator,\n SpacingMark,\n L,\n V,\n T,\n LV,\n LVT,\n ZWJ,\n Extended_Pictographic,\n RI,\n};\n\nexport const toCodePoints = (str: string): number[] => {\n const codePoints = [];\n let i = 0;\n const length = str.length;\n while (i < length) {\n const value = str.charCodeAt(i++);\n if (value >= 0xd800 && value <= 0xdbff && i < length) {\n const extra = str.charCodeAt(i++);\n if ((extra & 0xfc00) === 0xdc00) {\n codePoints.push(((value & 0x3ff) << 10) + (extra & 0x3ff) + 0x10000);\n } else {\n codePoints.push(value);\n i--;\n }\n } else {\n codePoints.push(value);\n }\n }\n return codePoints;\n};\n\nexport const fromCodePoint = (...codePoints: number[]): string => {\n if (String.fromCodePoint) {\n return String.fromCodePoint(...codePoints);\n }\n\n const length = codePoints.length;\n if (!length) {\n return '';\n }\n\n const codeUnits = [];\n\n let index = -1;\n let result = '';\n while (++index < length) {\n let codePoint = codePoints[index];\n if (codePoint <= 0xffff) {\n codeUnits.push(codePoint);\n } else {\n codePoint -= 0x10000;\n codeUnits.push((codePoint >> 10) + 0xd800, (codePoint % 0x400) + 0xdc00);\n }\n if (index + 1 === length || codeUnits.length > 0x4000) {\n result += String.fromCharCode(...codeUnits);\n codeUnits.length = 0;\n }\n }\n return result;\n};\n\nexport const UnicodeTrie = createTrieFromBase64(base64, byteLength);\n\nexport const BREAK_NOT_ALLOWED = '×';\nexport const BREAK_ALLOWED = '÷';\n\nexport type BREAK_OPPORTUNITIES = typeof BREAK_NOT_ALLOWED | typeof BREAK_ALLOWED;\n\nexport const codePointToClass = (codePoint: number): number => UnicodeTrie.get(codePoint);\n\nconst _graphemeBreakAtIndex = (_codePoints: number[], classTypes: number[], index: number): BREAK_OPPORTUNITIES => {\n let prevIndex = index - 2;\n let prev = classTypes[prevIndex];\n const current = classTypes[index - 1];\n const next = classTypes[index];\n // GB3 Do not break between a CR and LF\n if (current === CR && next === LF) {\n return BREAK_NOT_ALLOWED;\n }\n\n // GB4 Otherwise, break before and after controls.\n if (current === CR || current === LF || current === Control) {\n return BREAK_ALLOWED;\n }\n\n // GB5\n if (next === CR || next === LF || next === Control) {\n return BREAK_ALLOWED;\n }\n\n // Do not break Hangul syllable sequences.\n // GB6\n if (current === L && [L, V, LV, LVT].indexOf(next) !== -1) {\n return BREAK_NOT_ALLOWED;\n }\n\n // GB7\n if ((current === LV || current === V) && (next === V || next === T)) {\n return BREAK_NOT_ALLOWED;\n }\n\n // GB8\n if ((current === LVT || current === T) && next === T) {\n return BREAK_NOT_ALLOWED;\n }\n\n // GB9 Do not break before extending characters or ZWJ.\n if (next === ZWJ || next === Extend) {\n return BREAK_NOT_ALLOWED;\n }\n // Do not break before SpacingMarks, or after Prepend characters.\n // GB9a\n if (next === SpacingMark) {\n return BREAK_NOT_ALLOWED;\n }\n\n // GB9a\n if (current === Prepend) {\n return BREAK_NOT_ALLOWED;\n }\n\n // GB11 Do not break within emoji modifier sequences or emoji zwj sequences.\n if (current === ZWJ && next === Extended_Pictographic) {\n while (prev === Extend) {\n prev = classTypes[--prevIndex];\n }\n if (prev === Extended_Pictographic) {\n return BREAK_NOT_ALLOWED;\n }\n }\n\n // GB12 Do not break within emoji flag sequences.\n // That is, do not break between regional indicator (RI) symbols\n // if there is an odd number of RI characters before the break point.\n if (current === RI && next === RI) {\n let countRI = 0;\n while (prev === RI) {\n countRI++;\n prev = classTypes[--prevIndex];\n }\n if (countRI % 2 === 0) {\n return BREAK_NOT_ALLOWED;\n }\n }\n\n return BREAK_ALLOWED;\n};\n\nexport const graphemeBreakAtIndex = (codePoints: number[], index: number): BREAK_OPPORTUNITIES => {\n // GB1 Break at the start and end of text, unless the text is empty.\n if (index === 0) {\n return BREAK_ALLOWED;\n }\n\n // GB2\n if (index >= codePoints.length) {\n return BREAK_ALLOWED;\n }\n\n const classTypes = codePoints.map(codePointToClass);\n return _graphemeBreakAtIndex(codePoints, classTypes, index);\n};\n\nexport const GraphemeBreaker = (str: string) => {\n const codePoints = toCodePoints(str);\n const length = codePoints.length;\n let index = 0;\n let lastEnd = 0;\n const classTypes = codePoints.map(codePointToClass);\n\n return {\n next: () => {\n if (index >= length) {\n return {done: true, value: null};\n }\n\n let graphemeBreak = BREAK_NOT_ALLOWED;\n while (\n index < length &&\n (graphemeBreak = _graphemeBreakAtIndex(codePoints, classTypes, ++index)) === BREAK_NOT_ALLOWED\n ) {}\n\n if (graphemeBreak !== BREAK_NOT_ALLOWED || index === length) {\n const value = fromCodePoint.apply(null, codePoints.slice(lastEnd, index));\n lastEnd = index;\n return {value, done: false};\n }\n\n return {done: true, value: null};\n while (index < length) {}\n\n return {done: true, value: null};\n },\n };\n};\n\nexport const splitGraphemes = (str: string): string[] => {\n const breaker = GraphemeBreaker(str);\n\n const graphemes = [];\n let bk;\n\n while (!(bk = breaker.next()).done) {\n if (bk.value) {\n graphemes.push(bk.value.slice());\n }\n }\n\n return graphemes;\n};\n","import {Bounds} from '../css/layout/bounds';\nimport {\n isBodyElement,\n isCanvasElement,\n isCustomElement,\n isElementNode,\n isHTMLElementNode,\n isIFrameElement,\n isImageElement,\n isScriptElement,\n isSelectElement,\n isSlotElement,\n isStyleElement,\n isSVGElementNode,\n isTextareaElement,\n isTextNode,\n isVideoElement\n} from './node-parser';\nimport {isIdentToken, nonFunctionArgSeparator} from '../css/syntax/parser';\nimport {TokenType} from '../css/syntax/tokenizer';\nimport {CounterState, createCounterText} from '../css/types/functions/counter';\nimport {LIST_STYLE_TYPE, listStyleType} from '../css/property-descriptors/list-style-type';\nimport {CSSParsedCounterDeclaration, CSSParsedPseudoDeclaration} from '../css/index';\nimport {getQuote} from '../css/property-descriptors/quotes';\nimport {Context} from '../core/context';\nimport {DebuggerType, isDebugging} from '../core/debugger';\n\nexport interface CloneOptions {\n ignoreElements?: (element: Element) => boolean;\n onclone?: (document: Document, element: HTMLElement) => void;\n allowTaint?: boolean;\n}\n\nexport interface WindowOptions {\n scrollX: number;\n scrollY: number;\n windowWidth: number;\n windowHeight: number;\n}\n\nexport type CloneConfigurations = CloneOptions & {\n inlineImages: boolean;\n copyStyles: boolean;\n};\n\nconst IGNORE_ATTRIBUTE = 'data-html2canvas-ignore';\n\nexport class DocumentCloner {\n private readonly scrolledElements: [Element, number, number][];\n private readonly referenceElement: HTMLElement;\n clonedReferenceElement?: HTMLElement;\n private readonly documentElement: HTMLElement;\n private readonly counters: CounterState;\n private quoteDepth: number;\n\n constructor(\n private readonly context: Context,\n element: HTMLElement,\n private readonly options: CloneConfigurations\n ) {\n this.scrolledElements = [];\n this.referenceElement = element;\n this.counters = new CounterState();\n this.quoteDepth = 0;\n if (!element.ownerDocument) {\n throw new Error('Cloned element does not have an owner document');\n }\n\n this.documentElement = this.cloneNode(element.ownerDocument.documentElement, false) as HTMLElement;\n }\n\n toIFrame(ownerDocument: Document, windowSize: Bounds): Promise {\n const iframe: HTMLIFrameElement = createIFrameContainer(ownerDocument, windowSize);\n\n if (!iframe.contentWindow) {\n return Promise.reject(`Unable to find iframe window`);\n }\n\n const scrollX = (ownerDocument.defaultView as Window).pageXOffset;\n const scrollY = (ownerDocument.defaultView as Window).pageYOffset;\n\n const cloneWindow = iframe.contentWindow;\n const documentClone: Document = cloneWindow.document;\n\n /* Chrome doesn't detect relative background-images assigned in inline